サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
siguniang.wordpress.com
概要 Matching Algorithm with Recursively Implemented StorAge (MARISA) という Trie に対する高い空間効率とそれなりの時間効率を実現するデータ構造があります。 動的な更新には対応していませんが 辞書引き(Lookup) : 入力文字列が登録されているかどうかを確認 逆引き(Reverse Lookup) : 入力された ID から登録文字列を復元 Common Prefix Search : 入力文字列の前半部分に一致する登録文字列を検索 Predictive Search : 入力文字列で始まる登録文字列を検索 といった操作が可能です。 今回は marisa-trie 0.2.4 をベースに コマンドラインプログラム Python バインディング から MARISA を触ってみます。 Install MARISA 環境は
語が2つ与えられた時に、どのくらい似ているのか計量評価したいといった目的のために類似指数というのが存在します。 今回は、よく知られていて、かつ、実装の簡単な Jaccard 係数 Simpson 係数 Dice 係数 を Python で実装します。 これら3つの係数は、0から1までの値を取り、1に近づくほど類似し、0に近づくほど類似していないことを表します。 Jaccard 係数 Jaccard index, Jaccard similarity coefficient などとも呼ばれます。 次の式で表されます。 |X∩Y| / |X∪Y| xとYが完全一致 の場合に1となります。 def jaccard(x, y): """ Jaccard index Jaccard similarity coefficient https://en.wikipedia.org/wiki/Jaccar
動的リンクされたプログラムでは、同じ関数が複数のライブラリで定義されている場合、最初に見つかった関数が利用される。 環境変数 LD_PRELOAD で指定した共有ライブラリは最優先で読み込まれるため、簡単にプログラムの挙動を変えることができる。 実験用のプログラム まずは乱数を10個表示するだけの簡単なプログラム(random_num.c)を用意。 /* random_num.c */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ srand(time(NULL)); int i = 10; while(i--) printf("%d\n",rand()); return 0; } 実験用プログラムの実行 コンパイルする $ gcc random_num.c -o random_num $ ldd
Apache では静的ファイルの ETAG をどうやって生成しているのか確認してみたくなったので調査。 FileETag Directive は次のように説明されている The FileETag directive allows you to choose which of these — if any — should be used. The recognized keywords are: INode The file's i-node number will be included in the calculation MTime The date and time the file was last modified will be included Size The number of bytes in the file will be included All All ava
tar や zip でアーカイブ化したあと、元ファイルを削除するにはどうすればよいのか? tar version tar の場合は --remove-file オプションを利用する。 –remove-files remove files after adding them to the archive $ touch a1 a2 a3 $ tar -cvzf test.tgz a* --remove-files a1 a2 a3 $ ls -l total 4 -rw-rw-r-- 1 jsmith jsmith 130 Apr 12 22:52 test.tgz $ zcat test.tgz | tar tv # -t,--list : list the contents of an archive -rw-rw-r-- jsmith/jsmith 0 2013-04-12 22:51
パケットが宛先に移動するときに実際に経由するルートを検出するのに使う traceroute(Windows では tracert) というコマンドがある。 traceroute コマンドを使うと、下の出力結果のように、ホストまでのルート(hop)が出力される。 $ traceroute google.com traceroute to google.com (74.125.235.130), 30 hops max, 60 byte packets 1 192.168.11.1 (192.168.11.1) 0.513 ms 0.501 ms 0.490 ms 2 210.151.255.142 (210.151.255.142) 4.952 ms 6.094 ms 6.660 ms 3 202.225.194.107 (202.225.194.107) 4.913 ms 4.903 ms
Tornado で HTTP サーバを用意 HTML ファイルの JS が WebSocket サーバと通信 ブラウザでこの HTML ファイルを表示。 WebSocket クライアントが WebSocket サーバにメッセージを送信すると、HTML が書き換わる というようなシナリオを実現するシンプルなデモを作ってみました。 WebSocket Server サーバには表題の通り Python Tornado を利用します。 パッケージのインストール Tornado のビルドには Python のヘッダーファイルが必要です。 以下は RedHat 系でのインストール例です。 $ sudo yum install -y python27-devel $ sudo pip install tornado コード クラス Tornado.websocket.WebSocketHandler を
あるモデルによって情報を分類した時に、どのくらいうまく分類しているのか評価するためのメトリクスについてメモ。 テーマを単純にするために、文書から関連する文書を探すような情報検索システムを考える。したがって、関連する・関連しないの二値分類。 適合率(precision) 探した文書に含まれる関連文書の割合。 どれだけ正確に関連文書を探せているかを判定。 再現率(recall) 関連文書をどこまで探し出せているか。 網羅性を判定。 F値(F-score, F-measure, F_1 score) 適合率と再現率はトレードオフの関係にあるため、調和平均してバランスを見るのがF値 例 関連するドキュメントは relevant の頭文字をとって R、関連しないドキュメントは nonrelevant の頭文字をとって N で表すことにする。 3個だけ関連文書があるとする。 R R N R N N N
Summary tar ボールを展開した時に tar: foo: Cannot utime: Operation not permitted tar: foo: Cannot change mode to rwxrwxr-x: Operation not permitted というエラーが発生した時の解決方法をメモ 再現条件 オーナーが他ユーザのディレクトリを tar で展開したディレクトリで上書きしようとすると 更新日時の更新 パーミッションの変更 で上記エラーが発生する 再現手順 $ mkdir foo $ chmod a+w foo/ $ sudo chown root:root foo $ ls -l total 4 drwxrwxrwx 2 root root 4096 Jul 13 20:55 foo foo ディレクトリはその他ユーザに "w" のフラグが立っているので、ファ
ネットワークの帯域制御は用途や手段に応じて様々な手段が存在する。 今回は、Linux 環境下で trickle を使ってプログラム単位でアドホックに帯域制御する方法をメモ。 trickle とは ユーザースペースで動作するトラフィックシェイパー ダイナミックローダーのプリローダー(LD_PRELOAD)を利用して socket の送受信に割り込んでトラフィックを制御 プログラム単位で制御 trickle をインストール RedHat Installation epel レポジトリからインストールする # yum info trickle ... Installed Packages Name : trickle Arch : x86_64 Version : 1.07 Release : 19.el6 Size : 89 k Repo : installed From repo : epe
aws が提供するコマンドラインツールの aws cli を使って、S3オブジェクトのContentTypeを設定する方法をメモ。 aws s3 cp の場合 default aws s3 cp コマンドを使うと、デフォルトでは ContentType が guess される。 $ aws s3 cp song.mp3 s3://02a8/song.mp3 upload: ./song.mp3 to s3://02a8/song.mp3 $ aws s3api head-object --bucket 02a8 --key song.mp3 { "LastModified": "Tue, 13 May 2014 15:19:57 GMT", "AcceptRanges": "bytes", "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "C
概要 rsyslog のアウトプットモジュールには omprog というのがあり、好きな言語でsyslog データを標準入力で受け取り、データを処理するプラグイン機構がある。 この機能は rsyslog 4.3.0 と結構昔から存在するにもかかわらず、自分は知らなかったのだけど、rsyslog のブログでこの機能を知ったので、ミニマムで動かすところまでを試してみた。 Writing external output plugins for rsyslog # omprog は v4 のころからあるのに with v8, we officially support external plugins とコメントされているのは突っ込まないでおく。 検証環境 OS : CentOS 6 rsyslogd 8.2.2 rsyslog external plugin 通常のモジュールは、アウトプットを例
2014/10/24 の機能追加により、Redis はマルチAZ構成でノードを配置し、自動フェイルオーバーに対応した。 Multi-AZ Support / Auto Failover for Amazon ElastiCache for Redis http://aws.amazon.com/blogs/aws/elasticache-redis-multi-az/ 自分が知るかぎり、この機能が追加される前は異なる AZ に自前でクラスター配置しないとマルチAZにならなかったけど、機能追加後はマネージメントコンソールからボタンポチでマルチAZできるようになった。 このマネージメントコンソールの機能追加はコマンドライン aws cli (というかAPI)にも反映されているので、高可用性な Redis クラスターをサクッと構築してみる。 自前でゴリゴリやる手順は過去に書いた。 AWS CLI
time(1) コマンドの出力内容 Linux で time(1) コマンドを実行すると、real time/user CPU time/system CPU timeが出力されます。 $ time prog real 0m0.200s user 0m0.098s sys 0m0.004s わかるような、わからないようなこの出力される時間の意味についてメモします。 各フィールドについて Real time について どの処理に時間がかかっているかはさておき、プログラムの開始から終了までを計測した時間 wall clock timeや wall time と呼ばれることもある。 User CPU time について プログラムがユーザースペースで CPU が利用された時間 ライブラリコードの実行などがここに含まれます System CPU timeについて プログラムがカーネススペースで C
ゴール AWS のサービス(特に EC2)を監視するには aws マネージドサービスにデフォルトでついてくる CloudWatch を利用(aws おまかせ) カスタムメトリックスを CloudWatch に送信し、CloudWatch を利用(エージェントだけ自前実装) new relic のような ASP サービスを利用(エージェントだけ自前インストール) Zabbix などの監視システムを構築(サーバ、クライアントの両方を自分で面倒を見る) といった方法がある。 今回は2つ目の方法をメモ。 監視内容 EC2 インスタンス(OS は amazon Linux)からカスタムメトリックスを CloudWatch に送信する。 実験に使いやすいインスタンスに nginx がインストールされていたので nginx のメトリックスを送ることにする。 nginx のメトリックスを取得 ngx_ht
ゴール nfs-server nfs-client というホスト名の Ubuntu 14.04 のサーバを2台用意し、nfs-server サーバに Network File System バージョン 4(以下 NFSv4) を構築、nfs-client サーバからマウントしてみる。 NFSv4 サーバを構築 まずは nfs-server に NFSv4 サーバを構築します。 必要なパッケージのインストール NFS サーバに必要な nfs-kernel-server パッケージをインストールします。 $ sudo apt-get install nfs-kernel-server nfs-kernel-server は NFSv3 にも対応しているようですが、今回は NFSv4 として利用します。 共有ディレクトリを作成 次に共有ディレクトリを作成します。 今回は /tmp/no_root
やりたいこと Redis に TCP でコマンドを投げた時 DNS LookupInitial ConnectionRequest SentWaiting(TTFB)Content Download というような流れで処理される。 この一連の流れでRedis の内部処理にかかった Waiting(TTFB) を除く通信の時間を計測する方法をメモ。 通信のレイテンシ Redis には疎通確認向けのコマンド PING がある。 クライアントがこのコマンドを実行すると、サーバーは PONG を返すだけ。 このコマンドに対してサーバー(Redis)の処理は極めて軽微なため、PING を実行してから PONG がかえってくるまでの時間をレイテンシとみなして計測するのが次のコマンド。 $ redis-cli --latency -h HOST -p PORT # Ctrl-C で計測を止める min:
aws cliには API 呼び出し後、特定のステータスになるまでポーリングする wait コマンドがあります。 例えば ec2 インスタンスを起動する API を呼び出し後、インスタンスの起動が完了するまで待つには $ aws ec2 wait instance-running --instance-ids xxx のようにします。 この wait 機能が実装されるまでは #!/bin/bash instance_id=$(aws ec2 run-instances –image-id ami-12345 \ --query Reservations[].Instances[].InstanceId \ --output text) instance_state=$(aws ec2 describe-instances –instance-ids $instance_id --query
ゴール MySQL ではSHOW CREATE TABLE で DDL を復元できる。 Oracle 10g で同じことをやりたい。 DBMS_METADATA.GET_DDL 関数を使う DBMS_METADATA パッケージの GET_DDL 関数を使うと、 DDL を復元できる。 GET_DDL 関数の定義は以下 DBMS_METADATA.GET_DDL ( object_type IN VARCHAR2, name IN VARCHAR2, schema IN VARCHAR2 DEFAULT NULL, version IN VARCHAR2 DEFAULT 'COMPATIBLE', model IN VARCHAR2 DEFAULT 'ORACLE', transform IN VARCHAR2 DEFAULT 'DDL') RETURN CLOB; マニュアルの GET_
標準出力先としてファイル名を指定するのではなく、ファイルの中身(body)を引数として渡すにはどうすればよいのか? 実験用スクリプト 確認のため、次の簡易的なシェルスクリプトで各コマンドライン引数を表示させる。 #!/bin/bash # test.sh — just dump arguments for i; do echo $i; done 入力ファイルとしては次のように改行やスペースを含んだ JSON ファイルを渡す $ cat test.json { "firstName": "John", "age": 25, "address": { "state": "NY", "postalCode": "10021-3100" } } 実行コマンド 結果論としては、以下のように printf と cat をコンボすればよい $ ./test.sh foo $(printf '%s' $(
モダンな HTTP ベンチマークツール wkr の簡単な使い方についてメモ。 wrk の特徴は以下。 C で書かれている マルチコア CPU を 活かした高負荷をかけられる スレッドと epoll/kqueue のイベントドリブンを活用して負荷をスケールさせる(NOTICE ファイルを読むと Redis Event Library(ae event loop) を拝借しているようです) Lua スクリプトで HTTP クライアントの処理や実行結果のレポートをカスタマイズできる Installing wrk in CentOS 6 まずはビルドに必要なパッケージをインストールします。 $ sudo yum install git $ sudo yum groupinstall 'Development Tools' $ sudo yum install openssl-devel opens
Chrome の場合、 リクエストヘッダーの Accept-encoding は accept-encoding: gzip,deflate,sdch というようになっていて、サーバには圧縮コンテンツを要求している 深淵な理由により、Web サーバにエンコーディングしていないコンテンツを要求したい場合は、 "Accept-Encoding" の値を "identity" にするか、ブランクにすると良い。 RFC 2616 : Hypertext Transfer Protocol — HTTP/1.1 を確認すると 3.5 Content Codings … identity The default (identity) encoding; the use of no transformation whatsoever. This content-coding is used only i
AWS で VPC デフォルトではない DNS サーバをコマンドラインツールの AWS CLI から指定する方法をメモ。 デフォルトの設定を確認 AWS VPC 内に EC2 インスタンスを追加した時には、IPアドレス範囲の+2の IP アドレスで稼働する DNS サーバを参照するようになっている。 たとえば 10.0.0.0/16 の場合は 10.0.0.2 となっている。 VPC CIDR: 10.101.0.0/16 な VPC に EC2 インスタンスを追加し、 /etc/resolv.conf を確認 $ cat /etc/resolv.conf ; generated by /sbin/dhclient-script search ap-northeast-1.compute.internal nameserver 10.101.0.2 VPC 内のインスタンスの Privat
Python でコマンドラインプログラムを書くときのライヴラリに Click というのがある。(キャッチコピーは “Command Line Interface Creation Kit”) “The Hitchhiker’s Guide to Python” の “Command-line Application” でも CLI 用のライブラリとして clint などとともに取り上げられている。 作者の @mitsuhiko が YouTube に “Building Command Line Applications with Click” という20分弱の動画を投稿している。 固定メッセージを返すシンプルなアプリケーションを少しつづ拡張していき、最後には git 風のサブコマンドを実装する。 勉強がてら書き起こしてみる。 動画が公開されたのは Click の初回リリース間もない頃だけ
AWS の REST API のリクエストでは署名(signature)を使って、API のセキュリティチェックを行っている。 サービス開始時に Version 1(いまは使われていない) が公開されたあと、2, 3, 4 という合計4種類が存在する。 この署名の仕様をメモ。 version 1 最も古い Version 1 ?Action=CreateQueue &QueueName=queue2 &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &SignatureVersion=1 &Expires=2007-01-12T12:00:00Z &Version=2006-04-01 というような PARAM=VALUE がずらずらと並んだ GET リクエストを考える。 STEP1 パラメーターを大文字/小文字を無視して辞書順にソート。 ?Action=Creat
データの検証などで利用される Merkle tree/マークル木/hash tree/ハッシュ木についてメモ。 Merkle Tree の概要 wikipedia の概要をそのままコピペ。 暗号理論および計算機科学において、ハッシュ木(Hash tree, ハッシュツリー)またはマークル木(Merkle tree)とは、より大きなデータ(例えばファイル)の要約結果を格納する木構造の一種であり、データの検証を行う際に使用される。このデータ構造はハッシュリストとハッシュチェインの組み合わせでできており、ハッシュ法の延長上にある手法といえる。 Merkle tree の利用例 merkle tree が2つ与えられた時に、ルートノードから子ノードに向かってハッシュ値をたどっていけば、どこが壊れているのか特定が簡単で、壊れている部分木だけを更新すればよい。 Amazon dynamo/cassan
Summary VPC 内にたてた ELB(internet-facing/internal) のプライベート IP アドレスをコマンドラインツールの AWS-CLI から調べる方法をメモ。 tl;dr : EC2 DescribeNetworkInterfaces を使う EC2 サービスには DescribeNetworkInterfaces という NIC 向けの API が存在する。この API を使うと ELB のグローバル/プライベート IP アドレスを確認できる。 NIC 一覧からお目当ての ELB を突き止めるには? ELB インスタンスの NIC の設定は aws が裏でやっているためか、ELB のNIC は Attachment => InstanceOwnerId が “amazon-elb” となっている。 また NIC の Description も aws が勝
CMSなどで同じ記事が何度も更新されたとして、DBにある最終形は別にして、記事が更新された過程を知りたいといことがまれにある。この過程をバイナリーログ(binlog)から復元する方法を RDS MySQL 固有の動きを中心にメモ。 環境は データベースは RDS 版 MySQL(5.6) クライアントは EC2 上の Amazon Linux バイナリーログの用途 バイナリーログはテーブルへの更新を連続的に記録するもので レプリケーション 差分バックアップ/リストア などで利用することが可能。 binlog の中を覗いてみる 次にメインの binlog を覗いてみる。 binlog を確認 MySQL に接続して show binary logs コマンドで確認する。 mysql> show binary logs; +----------------------------+------
次のページ
このページを最初にブックマークしてみませんか?
『Siguniang's Blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く