blog2017年11月1日水曜日L2接続とL3接続の違いCiscoのページがとても分かりやすかった。違いを表にまとめておく。trackerを作る(3)backend(リクエストを受けてpub/subに流すコンポーネント)がほぼ出来上がった。engineのクラスタを立てたdeploymentとserviceの定義を書いたREADMEを書いたalpineで動かすとgcpのライブラリのロードでこけることがわかったのでfixした動作確認データを投げる。xxx.xxx.xxx.xxx/pvアプリケーションのログを確認する。{"userid":"610KZ4G0CBTI419Y","timestamp":1509290846000,"pageid":"test-page-001","browser":"chrome","country":"japan"}pub/subにデータが流れたことを確認する。libraryは基本非同期処理で書くようになっているが、callbackを省略するとpromiseオブジェクトを返してくれる。promiseオブジェクトをチェーンで繋げて書くとうまく書けそうだが、繋げたいメソッドの入出力がうまくハマらなかったり、細かい例外処理をしたかったりすると、自分でpromiseオブジェクトを作成した方が書きやすい感じがした。自分のnode.js力が低いだけで、慣れてきたらもっとうまく書けそう。gcpのcredentials/projectidは環境変数に入れるとすっきりする。jsonをバリデーションしたい場合は、jsonschemaというライブラリを使うといいらしい。expressにはエラーハンドラを登録することができる。404のハンドラの定義はファイルの一番下部でやらないといけない。trackerを作る(1)最近GCPを使ったインフラ構築と、javascriptへの興味が高まっているので、勉強がてら何か作ってみることにした。作りたいやつの機能サーバサイドはnode.jsで書く。APIでページビュー情報をPOSTしたり、ページビュー情報をGETしたりできる。POSTされた情報はGCPのpub/subにpublishされる。GETするときはpub/subからsubscribeする。engineで動作する。クライアントサイドはReact.jsで書く。グラフライブラリを使ってかっこいいグラフを表示する。Websocketを使ってリアルタイムにグラフが更新されるようにする。今日の進捗node.jsでサーバを書いて、Dockerで動くようにした。https://github.com/Kenji-H/access_tracker/tree/v0.9.0ローカルでの動作確認方法は以下のとおり。testクライアントからリクエスト送信。localhost:8080/pvdockerにログが出ていることを確認。Handlerを書いて遊んでみた。3で動作確認してます。遊び方まず上記のPythonプログラムを起動します。sample.pyプログラムを起動したら以下の表を参考にシグナルを送ってみてください。プロセス番号プログラムを停止したい場合は、SIGKILLを送ってください。プログラムのプロセス番号は以下のコマンドで調べることができます。Python単一障害点とはまえがきシステム全体のアーキテクチャを考えるときに、「単一障害点」という概念が大事らしい。意味は一目瞭然だけど、大切な概念っぽいので調べてみることにした。語句の意味その単一箇所が働かないと、システム全体が障害となるような箇所のこと。Failure(SPOF)というらしい。アプリケーションサーバが一つしかないと、クリティカルなエラーが発生したときにユーザがシステムを利用できなくなってしまう。よってサーバをレプリケーションしておくことでSPOFにならないようにする必要がある。ディスクストレージが故障するとデータの読み書きができなくなり、システム全体が利用不可になってしまう可能性がある。よってRAIDなどの冗長構成を取る必要がある。ネットワークスイッチが故障と、ネットワーク内のサーバ間の疎通ができなくなってしまう。よって冗長なスイッチとネットワーク構成によって、SPOFを解決する必要がある。トレードオフSPOFを解決するためには、レプリケーションや冗長構成などが必要となるので、コストがかかる。どこまでSPOFの排除に取り組むかはコストとのトレードオフも考えて決定しなければならない。インフラ2017年10月1日日曜日Perplexityとは自然言語処理で良く使われるメトリクスのひとつであるperplexityについて説明します。分布pに従って生成されるデータxがある。xの分布をqでモデリングする。このとき確率モデルqのperplexityは、と表される。xiはpから生成したデータで、Nはxiの個数である。指数部はクロスエントロピーになっているモデルにデータを見せたときに、どれくらい"驚く"かを表すいいモデルほどperplexityは小さいサンプルサイコロの目の分布をモデリングしてみて、そのモデルのperplexityを計算してみます。サイコロを用意します。サイコロは六面で各面が出る確率は一様とします。真の分布はわからないので、30回サイコロを振ってみて観測化された結果から分布を推定してみます。このモデルのperplexityをテストデータ1,000個を使って計算してみると、6.358となります。exponent)次に訓練データを増やしてモデリングしてみます。サイコロを1,000回振ってみます(上記のコードのMを1000に変更してプログラムを実行)。perplexityは5.998となり、モデルの良さが改善されたことがわかります。機械学習2017年9月17日日曜日ElastiCacheを使ってみたRedisのマネージドサービスを試しに使ってみた。AWSではElastiCacheというサービス名で提供されている(ElastiCacheでは、Redisの他にMemcachedも使うことができる)。99%範囲外のデータは例外とみなして除去)も書いてみた。Schoolを読んでいて、以下のような表現に遭遇した。statements.日本語ではexpressionは「式」、statementは「文」と訳される。両者の違いプログラムの例を見ると言わんとすることは分かるけど、両者の定義が明確に分からなかったので調べてみた。式は”それは何か”を表しており、文は"何をするか"を表している関数型言語は式を、命令型言語は文を使うことが多い気がするPythonでの例if/else以下のようにif/elseはstatementっぽくも書けるし、expressionっぽくも書ける。2までは文だったが、Python3から式になった。2では文なので値は返されない。3では式なので値が返される。Scala2017年9月16日土曜日IAMユーザにIPアドレス制限をかけるAWSのIAMユーザにIPアドレスをかける手順&確認。IAMユーザの作成AWSコンソールからIAMユーザを作成する。今回の例では、AmazonS3ReadOnlyAccessポリシーをアタッチしておく。test-userS3にアクセスしてみる。yyyyyyyyyyyyyIPアドレス制限をかけるAmazonS3ReadOnlyAccessをコピーして以下のようなポリシーを作る。]}AmazonS3ReadOnlyAccessをデタッチして、上記で作成したポリシーを代わりにアタッチする。指定したアドレスから接続確認S3にアクセスできることを確認。yyyyyyyyyyyyy指定したアドレス以外から接続S3にアクセスできないことを確認。relationshipの集合から構成される世界を記述するモデルのこと。Modelというモデルではオントロジーを以下の4つのコンポーネントで記述する。entity同士の関連。relationにおける役割。entity/relationに紐づく属性。例:名前、日付タクソノミー(Taxonomy)とはentityを親子関係を使って階層的に並べて表現するモデル。両者の違いOntologyの方がTaxonomyより複雑な表現をすることができる。Taxonomyは木構造、Ontologyはグラフ構造になっているとイメージしておくとよさそう。Taxonomyはentityの分類や類似度を測るときに使われるのに対して、Ontologyは知識表現に使われる。Ontologyを使って知識を表現しておくと、マシンを使って新しい知識を推論することができる。Service)を使ってみた。KMSを使うと以下のようなことができて嬉しい。キーユーザー4.の操作はec2ロールにアタッチしたポリシーに応じて必要だったり、不要だったりする。ec2にPowerUserAccessポリシーをつけていれば、3.の操作は不要。AWSKeyManagementServicePowerUserポリシーしかつけてない場合は、3.の操作が必要。注意事項キーを作成したリージョンとキーを利用するリージョンが異なると以下のようなエラーがでるので注意。書くときに使うとかっこ良さそうな英語表現をまとめたページ。LinkedInSREの採用プロセスに関する話。SREに限らずエンジニアの採用プロセスについてのいい話が書いてある。Gatewayが意外と高かった最近AWSでネットワークの勉強をしているのだけど、請求書を見てみたら予想外にコストがかかっていた。Gatewayだった。1時間あたりのコストがt2.microインスタンスの4倍近くかかるらしい。VPC自体は無料で作れるので、NATも無料だろうと思って油断していた。(追記)マネージドなNATがなかった頃は、EC2インスタンスを立ててNAT用のマシンにしていたらしい。networkのマシンからインターネットが見れなくなるので冗長化したり、パフォーマンスを考えてそこそこいいEC2を使ったりしないといけなかったらしく、それを考えると妥当な値段だということが分かった。個人で学習用に使う場合はやはり高いので、動作確認ができたらさっさと削除しましょう。並行と並列の違い並行(concurrent)処理とは、複数のタスクを非同期で同時に実行すること。並列(parallel)処理とは、複数のCPUを使って複数のタスクを同時に実行すること。並行の方が広い概念で、並列処理は並行処理の一種。並行処理にはいくつかの実現方法が考えられるが、複数のCPUを使って物理的に同時に複数の命令を走らせているものを並列処理と呼ぶ。いうことで、場面によって使い分けた方がいいかもしれない。複数のサーバを立てて並列処理をするマルチコアCPUで並列処理をするシングルコアマシン上でマルチスレッドを使って並行処理をするコルーチンで並行処理をする並行の方が広い概念なので、並行処理と言っておけば間違いは少なそうだが、物理的に同時に実行するということを強調したい場合は並列と言った方がいいかもしれない。startedエンジニアリングの世界に終わりはない、常に新しいチャレンジが待っているという内容のブログ。MinutesConfluentのブログを読んだ。最近KafkaまわりのOSSにプルリク送ってみたりして、Confluent熱が個人的に高まっている。Minutes以下、感想・考えてみたことなど。Kafkaってなんなのか一言で説明するのは難しいが、このブログにあるように「分散ストリーミング基盤」というのが良さそう。ETLという概念がやばい。ETLでやっているような集計処理をバックグラウンドでリアルタイムに実行できるやつ。ブログの下の方で引用されているが、簡単なサンプルアプリがあるので見てみるとイメージがわく「複数のアプリが同じデータソースを参照していると密結合になる」みたいな話を聞いたことがあったが、その感覚が分かった。..からテーブルAを直接参照すると以下のような問題が起こる。データ基盤2017年6月24日土曜日VagrantのゲストOS間でホスト名参照Vagrantfileでホスト名を指定してるのに何故か参照できなかった。ip6-allroutersvagrant-hostsというプラグインを入れてみると解決した。vagrant-hosts以下のようにserver.vm.provisionの行を追加すると、ホスト名が設定され、さらにゲストOSの/etc/hostsに仮想マシンのホスト名情報が追記される。名でゲストOS間の通信ができることが分かる。keyを使うVagrantで複数の仮想マシンを立ち上げて、仮想マシン間でsshの秘密鍵を共有したい場合がある。1.8でのデフォルトの設定ではマシンごとに異なる秘密鍵が生成される。endend秘密鍵情報を確認。仮想マシンごとに別の秘密鍵が生成されていることが分かる。FATALしかし、デプロイ自動化を行う場合など、共通の秘密鍵を使えると便利なことが多い。falseという設定を追加すればよい。endend秘密鍵情報を確認してみると、共通の秘密鍵を利用できることが分かる。インフラ2017年6月11日日曜日VagrantとAnsibleでKafka環境をつくる(8)Vagrant、Ansibleで作ったKafka環境で動作確認をしてみる。以下の操作はすべてプロジェクトのrootディレクトリから実行するものとします。vagrantで仮想マシンを起動する。up続いてansibleでplaybookを適用する。proxyと疎通確認を行う。proxy経由でKafkaにデータを送ってみる。"192.168.33.11:8082/topics/jsontest"{"offsets":[{"partition":0,"offset":0,"error_code":null,"error":null}],"key_schema_id":null,"value_schema_id":null}consumerを作成し、先ほど作成したjsontestトピックをサブスクライブする。\http://192.168.33.11:8082/consumers/my_json_consumer/instances/my_consumer_instance/subscriptionもう1つメッセージを送ってみる。"192.168.33.11:8082/topics/jsontest"{"offsets":[{"partition":0,"offset":1,"error_code":null,"error":null}],"key_schema_id":null,"value_schema_id":null}メッセージをコンシュームする。[{"key":null,"value":{"name":"testUser"},"partition":0,"offset":0,"topic":"jsontest"},{"key":null,"value":{"name":"testUserXXX"},"partition":0,"offset":1,"topic":"jsontest"}]データの送受信を確認できたので、テスト用のコンシューマーを削除する。データ基盤VagrantとAnsibleでKafka環境をつくる(7)前回マニュアルで試したsystemdからconfluentコンポーネントを起動するための設定をansible化した(成果物)。利用するコンポーネントは以下の4つなので、それぞれのコンポーネント別にroleを作った。serviceの設定スクリプトは、Jinja2を使ってtemplatesディレクトリ配下に置いている。taskではtemplatesに置かれたテンプレートを/etc/systemd/system/配下に格納する。設定が変更されると、handlerで指定したようにserviceが起動される。roleの場合のサンプルを載せておく。インフラ2017年6月5日月曜日VagrantとAnsibleでKafka環境をつくる(6)zookeeperをサービス登録して、systemdから起動させるようにしてみた。Ansible化はまだ出来ていないが、とりあえず手動で設定&起動できた。以下のようなファイルを作っておく。/etc/kafka/zookeeper.propertiesExecStop=/usr/bin/zookeeper-server-stop[Install]WantedBy=multi-user.targetAfter=network.targetとすることで、ネットワーク起動後にサービスを開始させるという意味になる。WantedByのところには、ランレベルを設定する。multi-user.targetとするとマルチユーザモードで使用されるサービスとなる。ちなみに、targetの一覧は以下のようにして参照できる。Timersサービスとして認識しているか確認。disabledサービス有効化。/etc/systemd/system/zookeeper.service.サービス起動&確認。agoデフォルトポートでlistenしているか念のため確認。インフラVagrantとAnsibleでKafka環境をつくる(5)前回Javaが入ったので、Kafka環境を入れてみた(成果物)。Platformを使う。手動でインストールすると以下のようになる。confluent-platform-2.11上のインストール作業を行うplaybookは以下のようになる。}}のところは変数になっている。変数の値は以下のようにvarsディレクトリ内のファイルで定義できる。Java1.8を入れるplaybookを書いた(成果物)。practiceらしい。rest-proxyというroleをつくろうと思う。roleにtaskを書いた。作成したplaybookのsyntaxチェック。roles/common/tasks/main.ymlplaybookを実行する。1.8がインストールされたことを確認。インフラ2017年6月4日日曜日VagrantとAnsibleでKafka環境をつくる(3)Ansibleのplaybookを書こうとしたが、まずはマニュアルで環境を作ってみてうまくいったらplaybookを書きたいマニュアルでいろいろ試行錯誤して環境汚してしまうのは避けたいということで何か便利なツールがないか探していたところ、saharaというvagrantのプラグインを見つけた。saharaを使うと、仮想マシンの環境をサンドボック状態にしてコミット/ロールバックを行うことができる。プラグインをインストール。statussandboxモードを有効にする。onsandboxモードの状態で仮想マシンに何かインストールしてみる。1.9ロールバックする。rollback上記のインストールはロールバックされる。インフラVagrantとAnsibleでKafka環境をつくる(2)Vagrantで作った仮想マシンにAnsibleから接続できるようになった(成果物)。仮想マシンにsshするときの秘密鍵の場所を調べておく。FATALユーザと秘密鍵の場所をオプション指定するとansibleで仮想マシンに接続できる。毎回オプション書くのは面倒なのでconfigファイルを書くといいらしい。以下のようなファイルをカレントディレクトリに作っておく。/Users/kenjih/work/vagrant_ansible_kafka/vagrant/.vagrant/machines/default/virtualbox/private_keyすると、オプションなしで接続できる。"pong"}接続できたので、ansibleから任意のコマンドを実行してみる。あるiを使ってGetValue(i)を呼ぶとシステムが死んでしまう(他のノードに対しては影響はない)。以下ではこのiをi_qodと呼ぶ。NまでのGetValue(i)の和を求めよ。100解法semiexp.さんの解法が綺麗。ノードをmasterとslaveに分ける。masterは計算する範囲をslaveに渡す。slaveは与えられた部分問題をといてmasterに返却する。1回目のbatchで1つのslaveが死ぬが、i_qodを含む範囲が1/99に絞られる。続いて2回目のbatchでも1つのslaveが死ぬが、i_qodを含む範囲がさらに1/98に絞られる...というふうに分割統治的に解ける。見ればわかるけど、自分じゃ思いつかない。JamVagrantとAnsibleでKafka環境をつくる(1)まずはVagrantで仮想マシンの作成、起動、停止をするところから。インフラ2017年5月23日火曜日Pythonのデフォルト値の罠Pythonのデフォルト値ではまったところがあったのでメモ。以下のプログラムを例に考える。(z)これを実行すると以下のような結果が出力される。'bar'}1行目と2行目の結果は予想どおりだが、3行目の結果はPythonに詳しくない人には意外かもしれない。実はPythonのデフォルト値はdefステートメントが実行されるときだけ評価される。デフォルト値がmutableな値の場合、関数内で実行した変更は副作用をもたらすことになる。'bar'}に更新される。デフォルト値にmutableな値を指定すると予想しない挙動になることがあるため、以下のようにimmutableな値を使用するとよい。(z)上のコードの実行結果は以下のとおり。Python2017年5月7日日曜日Kさんの教え半年間一緒に働いたエンジニアのKさんの教え。おれたちはソフトウェアを作っているハードウェアを作る場合は、綿密な計画、設計無しにものづくりを始めてはいけない。作り直しのコストが非常に大きいからね。おれたちはソフトウェアを作っている。綿密な計画、設計をしているうちに作っちゃった方が早いよね。必要以上に複雑にするなソフトウェアは使ってもらいながら進化していくものなので、最初から複雑にしすぎてはいけない。絶対必要なものに集中してとにかくシンプルなものからスタートせよ。変更は小さく頻繁にソフトウェアの変更は細かく、高頻度に行うべき。一度に多くのものを変えようとするのはよくない。簡単な機能なのにすぐに変更、リリースができないなんて論外。学びこそ至福の喜び常に学び続けろ。新しいことを学ぶのがエンジニアの大きな喜びの一つだ。学ぶことをやめてしまったエンジニアに価値はない。おまえはどうしたいのかあの人がこう言った、あのチームの人たちはこう言っている、じゃない。お前はどうしたいんだ?それが一番大事なことだ。一心不乱に夢中になること何かに夢中になっているヤツのまわりにいると、こっちもなんだか楽しい気分になってくるぜ。おれの会社の創業者もそうさせてくれるやつだった。セキュリティと生産性のトレードオフセキュリティを厳しくしすぎると生産性が著しく低下する。両者はトレードオフの関係にあるけど、日本では生産性の問題が軽視される傾向にあるみたいだ。(番外編)マラソンマラソンはいろんなことを教えてくれる。精神状態をいかにコントロールするか、ペース配分をどうするかなど。(番外編)やばたんYABATAN知らないのか?日本語だぜ。knowledge論文を読んでいるとよく出てくる表現。「我々が知るかぎり〜だ」と言うときに使える。....我々が知るかぎり、....したのはこれが初めてだ。methods.我々が知るかぎり、我々の手法は過去に発表された他の手法より優れている。k最近傍法(kNN法)平井有三先生の「はじめてのパターン認識」第5章を読んだ。kNN自体はもちろん知っていたが、理論的な考察についてはほとんど知らなかったので勉強になった。理解度チェックリスト最近傍法とは?k最近傍法とは?ボロノイ図とは?kNNを使うときに問題となる次元の呪いについて説明せよ。予測データと学習データの距離はどうなる?kNNの計算量は?kNNの計算量を減らすための工夫をいくつか説明せよ。to「あとで〜するね」というときに使える便利なフレーズ。ミーティングなどで「あとで確認して連絡します。単位超球から一様サンプリング誰もが一度はモンテカルロ法を使って円周率を計算してみたことがあると思います。二次元の場合は、点が円の中に入ったり、入らなかったりするのですが、次元が大きくなると円の中に入る頻度が極端に少なくなります。高次元の単位超球内に一様分布する点をサンプリングしたくなったらどうすればよいでしょうか?以下自分がやってみたこと。期待値の二乗という式を使って分散を計算すると、右辺の2つの項の値が非常に近い場合、桁落ちが発生する。以下のようなデータを考える。4この場合、二乗平均も期待値の二乗も1020程度である。有効桁数は15桁程度なので、この差の情報は失われてしまう。分散は平行移動しても変わらないので、平均が0になるように中心化を行う。2すると、二乗平均は2、期待値の二乗は0となり、差の情報は失われない。以下のプログラムを実行してみると、桁落ちの様子を確認できる。AverageVarianceSubtree問題ノードに重みがつけられた木が与えられる。木のすべての部分木について重みの分散を計算し、この分散の平均値を求めよ。解法DFSしてノード上でDPする頻出テクニックを使う問題だが、分散を計算するために一工夫必要。部分木のサイズ)ごとに"重みの二乗和"と"重みの和の二乗"を保持すればよい。d)からなる木をマージする作業を考えてみる。d)の二乗和がわかっていたとすると、マージした木の二乗和はそのままこの二つを足せばいいだけなので簡単。d^2となるので、単純に足すわけにはいかない。異なる項の積和となっているので、異なる項の積和をうまく部分問題から計算できればよいことが分かる。d)となるので、部分問題の異なる項の積和と部分問題の和を使えば計算できることが分かる。ノードvを根とするサイズiの木の重みの異なる項の積和を葉から根方向にDPさせればよい。木をマージするときは、マージする相手方のサイズの分だけ自身が繰り返し現れるので、その分を掛けるのを忘れないようにする。あとこの問題は数値計算の精度が厳しいらしく、計算誤差を小さくするため以下の工夫が必要。重みを中心化しておく。Postsmemset()とmemcpy()恥ずかしながら、Cのmemset()とmemcpy()を今まで使ったことがなかった。みたいな話を聞いたことがあったので、「あーじゃ要らない機能なんだー。editorialに投稿された解答がmems...便利なPythonライブラリ(5)retryデコレータつけるだけで、リトライしてくれるという便利ライブラリ。失敗するかもしれない不安定な関数に@retryをつけると成功するまで実行してくれる。ret...S3のファイルを一般公開するAWSのS3のファイルを一般公開する方法について説明します。2つの場合に分けて説明します。本番中ゴリ押し解を思いつくには思いついたのだが、C++でマルチスレッドの処理を書いたことが無くて、ごにょごにょやってるうちにタイムアップとなってしまった。C++...C#入門(9)Action、Func、Predicateの違いAction、Func、Predicateについて簡単に整理しておく。メソッドへのDelegate。メソッドへのDelegate。スライド区間に対するクエリ処理の種類とそれに対するアルゴリズムをいくつか紹介します。「スライド区間」の定義ですが、窓関数のようなものを想像してください。まではコンピュータの力を使って正多面体をt色以下で塗るパターン数を数えていました。今回は手計算で計算してみようと思います。そのためにはまず回転を表す対称群をうまく列挙するために回転軸について考える必要があります。見聞きする木の用語を整理しておく。節点vから最も離れた節点をwとする。w)の長さをvの離心数と呼ぶ。記号で表すときは、ε(v)と書く。使って遊んでみました。いった便利な機能を提供してくれるテストフレームワークです。repor...キャッシュヒット率の測定perfというツールを使ってキャッシュヒット率を測定してみた。キャッシュの影響なんてたかが知れていると甘くみていたら、痛い目るので要注意。知らない用語がちらほらあったので、簡単にまとめておく。