コマンドラインから簡単にUDP通信を行うには

Linux/MacなどでコマンドラインからTCP通信を行うには、telnetがよく使われますね。

HTTPアクセスをtelnetで行う例:

telnet example.com 80
GET / HTTP/1.1(改行)
Host: example.com(改行)
Connection: close(改行)
(空行)
HTTP 200 OK
Content-Type: text/html
... 以下略

UDPでTCPと同じようにテキストベースの通信を行うには、netcat(ncコマンド)が便利です。
netcatはtelnetの機能拡張版ともいえるツールで、TCP/UDPプロトコルを扱う上ではぜひ導入しておきたいものです。

nc コマンドが手元にインストールされてない場合、

CentOS系Linuxなら sudo yum install netcat

Debian なら sudo apt-get install netcat

OS X(Homebrew)なら brew install netcat

でインストールできるかと思います。

netcatは基本的にはtelnetと同じ使い方ができます。

使い方:

netcat -u 接続先IPまたはホスト名 ポート

-u はUDP通信を表すオプションで、省略するとデフォルトでTCP通信になります。
telnet同様、パイプなしで実行すると、標準入力待ち状態になり、Ctrl-Cで切断できます。

また、telnetと違い、サーバになることもできます。

netcat -l -u -p port

-l は Listenモード(サーバモード)、
-u はudpプロトコルでの待受を意味します。(省略するとTCPプロトコル)
-p は待ち受けるポート番号です。

簡易通信サーバになって接続をテストすることも可能です。便利ですね。

もちろん、サーバ・クライアント両方ともncでも通信できます。

サーバ側コンソール(ローカル):

$ nc -l -p 55440 # 適当なTCPポート55440で待受(udpでもOK)

クライアント側コンソール(ローカル):

$ nc localhost 55440 # サーバにつなぐ。(TCPならtelnetでもOK)
hogehoge(改行)

こうすると、サーバ側コンソールに hogehoge と表示されます。
逆にサーバ→クライアントにメッセージを送ることも可能です。

また、上記の例では同一ホストで実行していますが、もちろんIPアドレス、ドメイン指定などで別マシンとも通信できます。

ローカルでやると動くのに、別マシンにはつながらない、という場合はファイアウォールを確認するとだいたい解決するかと思います。
終了できない!と焦ったら、Ctrl-Cを推してみましょう。

ぜひご自身で色々試してみて下さい!

[OpenSSL] pem ファイルとは?SSL証明書の中身を確認する方法

iOS開発でのサーバ側 push通知設定や、WebサーバのSSL証明書設定に使われる .pem ファイルの中身を確認する時に便利なコマンドをまとめました。

  1. pem ファイルとは?
  2. openssl コマンドのインストール方法
  3. pem ファイルに含まれる証明書の確認方法
  4. 秘密鍵の内容を表示する
  5. pemファイルの作り方
  6. (おまけ)csrの情報を出力する

続きを読む [OpenSSL] pem ファイルとは?SSL証明書の中身を確認する方法

証明書と秘密鍵からp12ファイルを作る

証明書と鍵ファイルからp12ファイル(pkcs12)を作る手順のメモ。
証明書(cer)をPEMに変換する、鍵(PEM private key)と結合してp12にする、という2段構え。

参考: http://spiratesta.hatenablog.com/entry/20120215/1329280918

1.公開用証明書をPEM証明書形式に変換する

$ openssl x509 -in distribution_identity.cer -inform DER -out distribution_identity.pem -outform PEM

2.PEM証明書形式をP12証明書形式に変換する

$ openssl pkcs12 -export -inkey mykey.key -in distribution_identity.pem -out distribution_identity.p12

パスワードを聞かれるので、適宜入力する(パスワード空欄だとキーチェーン取り込みできない)

3.P12証明書を開いてキーチェーンに取り込む(取り込み時に上記パスワードを入力する)

なぜ必要だったか

MacBook Pro が壊れたので修理して、クリーンインストールし直したんですが、
そのときにとあるプロジェクトのApp Storeのリリース用(Distribution)秘密鍵の移行を忘れて喪失してしまったため、
なんとかサルベージできないか、と試行錯誤するのに使いました。

Circle CIにp12の鍵が上がっていたので、CIを回してSSHで入り、
鍵ファイル(/var/folders/jm/ほげほげ/T/cert.abcdef)をcatして取り出し .key として保存、
Apple Developerサイトの Certificates,IDs & Profiles から証明書ダウンロード、
あとは手順通りの結合で事なきを得ました。バックアップは大事ですね。。

こんな記事もあります

.p12キーストアファイル証明書の中身を確認する

【Linux】topで表示される flush 253:0 の意味

Linux(CentOS)で重い処理の実行中にtopを見ていて、「flush 253:0」というプロセスがあるのが気になって調べてみた。

StackOverflowの「”flush 253:0″ in iotop file on RHEL. 」によると、カーネルがページキャッシュからIO書き込みを行うためのプロセスなのだそう。

ざっくり言うと、ディスク書き込みをする際、ユーザプログラムではページキャッシュに一旦書き込んでいて、
それをLinuxカーネルが処理している時に出てくるプロセス、らしい。

たしかに、ディスク書き込みを行う処理を監視していたのでした。

参考:Cache and TLB Flushing Under Linux

MySQLでmysql.slow_logテーブルをslow queryログファイル形式でダンプする

表題のとおり、スロークエリログをテーブルに書き出しているMySQL DBサーバで
slow queryログファイルの形式でエクスポートしたくなったのでその方法をメモしておきます。

参考:Exporting mysqlslowlog table slow query log format.

# コマンドここから
mysql -u “ユーザ名” -p -h “接続先ホスト” -D mysql -s -r -e “SELECT CONCAT( ‘# Time: ‘, DATE_FORMAT(start_time, ‘%y%m%d %H%i%s’), ‘\n’, ‘# User@Host: ‘, user_host, ‘\n’, ‘# Query_time: ‘, TIME_TO_SEC(query_time), ‘ Lock_time: ‘, TIME_TO_SEC(lock_time), ‘ Rows_sent: ‘, rows_sent, ‘ Rows_examined: ‘, rows_examined, ‘\n’, sql_text, ‘;’ ) FROM mysql.slow_log” > /tmp/mysql.slow_log.log
# コマンドここまで

長くて読みづらいですが、mysqlコマンドで、slow_query_logファイル形式にあわせるようにSELECTを打って整形しています。

普段はSQLで処理できるテーブルのほうが便利ですが、Percona Toolkitpt-query-digestのように、スロークエリログをファイルとして処理するようなツールを使うためにファイルが欲しくなることもあるのですよね。

Percona Toolkitについてはこちらの記事が参考になりました。

[Linux] ping された事を検知する(tcpdump)

ネットワーク到達確認をするときにpingをうちますが、
自分が本当にpingを受け取ったのか確認したい事もたまにあります。

こんな時、pingされたことを検知するには、tcpdumpを使うと便利です。

> sudo tcpdump ‘icmp[0] = 8’

############ 監視サーバ側 ############## 
% sudo tcpdump 'icmp[0] = 8'     
[sudo] password for user: 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
(監視状態に入る)

ここで監視サーバにpingが来ると監視サーバには以下のようにログが流れます。

17:35:23.241574 IP xxx.xxx.xxx.xxx > example.com: ICMP echo request, id 13727, seq 0, length 64
17:35:24.241852 IP xxx.xxx.xxx.xxx > example.com: ICMP echo request, id 13727, seq 1, length 64

xxx.xxx.xxx.xxxは実際にはping元のIPアドレス(またはホスト)、example.comはping先(監視サーバ)のIPアドレス(またはホスト)になります。

終了するときは Ctrl-C で終了します。

画像処理ツール ImageMagick の便利なコマンド逆引きまとめ

ImageMagickでやりたい事からコマンドオプションを調べるための逆引き辞典的なまとめ。
項目は随時追加予定です(2013-11-21更新)。

詳細については ImageMagick公式サイトのUsageOptions を参照すると幸せになれます。

基本

画像形式を相互変換する(GIFからJPEG, JPEGからPNGなど)

convert input.gif output.jpg

convertコマンドは拡張子から画像形式を自動判別して変換することができます。上記の例では GIF から JPEGへ変換しています。
拡張子がないファイル名を扱うときなど、拡張子に依存せずに変換したい場合はプレフィクスをつけることで任意の画像形式として取り扱うことも可能です。

<h1>JPEG 形式の input.dat ファイルを PNG形式のimage0001に変換する。</h1>
convert jpeg:input.dat png:image0001

画像の読み込み、保存に標準入力、標準出力を使う

cat input.jpg | convert - -resize 50x50 - > output.jpg
cat input.jpg | convert jpg:- -resize 50x50 png:- > output.png

標準入力、標準出力を扱いたい場合、ファイルの代わりにハイフンを指定します。
入力値でプレフィクスによる画像形式指定を省略した場合は自動判別されます。
同様に出力値で画像形式指定を省略した場合、入力値と同じ形式で出力されます。

SVGからPNG(JPEG,GIF)へ変換する。

convert input.svg -resize 1600x1600 output.png

SVGはPNGやJPEG,GIFなど他の画像と同様に入力画像として扱えます。
jpegやgifにする場合は、output.pngの拡張子を変えるだけでOKです。

色の変換

カラー写真をグレースケール画像、セピア画像に変換する

グレースケール(モノクロ写真)への変換。

convert input.jpg -type GrayScale output.jpg

セピア調画像への変換。

convert input.jpg -sepia-tone '80%' output.jpg

グレースケールの画像を単色のアルファ画像に変換する。

convert  from.png -background '#99FFFF' -channel A -combine to.png

黒い部分を透明、白部分を不透明として、-backgroundで指定した色(例では#99FFFF)で塗りつぶしたアルファ画像に変換します。

画像の色を反転する。

convert from.png -negate to.png to.png



画像操作

画像の向きを上下反転・左右反転する

<h1>上下反転</h1>
convert input.png -flip output.png
<h1>左右反転</h1>
convert input.png -flop output.png

画像の一部を切り抜く

-crop geometry

使用例:座標(10, 20)から30×40ピクセル切り抜く

convert input.png -crop '30x40+10+20' output.png

サイズ指定必須、座標は省略可能です。

画像をリサイズする

-resize geometry

使用例: アスペクト比を維持しつつ100×100に収まるのサイズにリサイズする。

convert input.png -resize '100x100' output.png

サイズ指定必須。サイズには -resize ‘50%’ のようにパーセント指定が可能です。
デフォルトでアスペクト比を維持したままリサイズしますが、-resize ‘100×100!’のようにサイズ指定にエクスクラメーション記号(‘!’)を指定した場合はアスペクト比を無視したリサイズを行います。

横幅だけに合わせてリサイズ、または縦幅だけに合わせてリサイズを行いたい場合、-resize ’50x’ や -resize ‘x50’のように不要なサイズ指定を省略することで一方だけを基準としたリサイズが実現できます。

画像を回転する

-rotate degree{<}{>}

例: 画像を90度回転する

convert input.png -rotate 90 output.png

回転角を度数で指定します。
90の倍数以外の場合、回転後の画像が収まるサイズにキャンバスが拡張され、余白部分は背景色で塗りつぶされます。
-rotate ’90<‘のように不等号を指定すると、元が縦長(‘<‘)、または横長(‘>’)の時だけ回転処理を行うことが可能です。

画像をトリミングする

-trim +repage

使用例:

convert input.png -trim +repage output.png

画像の上下左右の余白部分をトリミングします。
-trimだけでも画像はトリミングされますが、キャンバスサイズはトリミングされないため、+repageと組み合わせて使いましょう。

トリミングを行う対象は四隅の色と一致する色です。
近似色までトリミングしたい場合は -fuzz distance{%} オプションで近似色の許容範囲を事前に設定して下さい。

convert input.png -fuzz 10 -trim +repage output.png

Vagrantでハマった時の対策

Vagrantの実行で失敗する時は
環境変数 VAGRANT_LOG=info または VAGRANT_LOG=debug をつけて実行するといいみたい。
指定すると実行ログが詳細になりエラー内容が出てくるようになります。

vagrant-awsプラグインを使ったときだけエラーが出ていて、原因がしばらく不明でしたが、これでAWSの認証で失敗しているのが原因だと分かり解決しました。
エラー時はデフォルトで失敗理由を教えてくれたらいいのにな。

$ VAGRANT_LOG=info vagrant up --provider=aws

GoogleAppEngine(Java)でデプロイ時のConflictを解除する

GAE/JでデプロイをキャンセルしてしまってConflictが出た時の対応方法メモ。

pythonクライアント(appcfg.py)を入れてもいいのですが、Java環境だけでもなんとかならないかと思ったところ、EclipseのGoogle App Engine プラグイン内に appcfgコマンドがあり、これを使えばデプロイの衝突を解決できました。

Linux/Mac OS Xの場合:

/Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.7.5/appengine-java-sdk-1.7.5/bin/appcfg.sh rollback war

Windowsの場合

c:¥eclipse¥plugins¥com.google.appengine.eclipse.sdkbundle_1.7.5¥appengine-java-sdk-1.7.5¥bin¥appcfg.cmd rollback war

上記コマンドはコンフリクトしている対象のGAEのプロジェクトディレクトリで実行する場合の引数です。

その他の場所で実行する場合は適宜warのパス指定部分を変更する、アプリ名を明示するなど変更して下さい。

Google App Engine でアプリケーション名を取得するには?

GAEのアプリケーションの名前はJava、Pythonどちらでもプログラム内から参照できるようになっています。 続きを読む Google App Engine でアプリケーション名を取得するには?