2016年12月19日 OptionParserのソースコードを読む この記事はElixir (その 2)と Phoenix Advent Calendar 2016 の 1 9日目の記事です。 背景 書籍「プログラミング Elixir」の 13 章でお世話になった OptionParser がとても便利そうだったので、中身の理解と Elixir のソースコードに慣れる目的で、ソースコードを読んでみました。 メインである parse/2 を中心に説明します。 下記に記載するソースコードは全て、公式のものを引用しています。 環境 Elixir 1.3.3 ドキュメント ソースコード おおまかな流れ parse/2 (外部に公開するインターフェース) do_parse/6 (実際にパースの再帰処理を行っているところ) next/4 (パース処理) ソースコード parse/2 まずはメインの parse/2 です。 parse/2 @spec parse(argv, options) :: {parsed, argv, errors} def parse(argv, opts \\ []) when is_list(argv) and is_list(opts) do do_parse(argv, compile_config(opts), [], [], [], true) end 引数の opts をcomple_config/1を通して加工してdo_parseに渡しています。 また、do_parse/6の結果をそのまま返しています。 2015年8月12日 Homesteadに複数サイトを追加する二つの方法 2015年7月15日 Homesteadを使ってLaravel5を動かしてみる 2015年2月10日 UDPについてまとめてみた WebRTCにも使われているプロトコルであるUDPについてまとめてみました。 UDPとは UDP(User Datagram Protocol)とは、TCPと同じトランスポート層のプロトコルです。 RFC768によって策定されています。UDPの特徴として以下のようなものがあげられます。 コネクションレスなデータ通信 データの信頼性、順序などを保証しない 高いスループット(伝送速度) マルチキャスト、ブロードキャスト コネクションレスとは、通信相手との接続を確立しないということです。 送信側が送りたいデータを一方的に受信側に送るため、接続を確立せずに通信が行えます。 こういった特徴があるため、データの信頼性、順序性などは保証されませんが、高速な送信を実現できます。 また、TCPは接続を確立するため、ユニキャスト(1対1)しか行えませんが、UDPはコネクションレスのため、マルチキャスト、ブロードキャストに対応可能です。 その他に、TCPでは複雑な制御をするためにTCPヘッダを送りたいデータに付属させる必要があります。TCPヘッダのサイズは通常20 Byteほどです。UDPにもヘッダは必要なのですが8 Byteと少量のため、小規模なデータの送信などはUDPの方が効率よく行えます。 使用されているサービス UDPプロトコルは以下のような技術に使用されています。 DNS DHCP VoIP 動画ストリーミング DNSはIPアドレスとドメインを対応づけるプロトコルです。 DHCPはLAN内のパソコンなどにIPアドレスを動的に割り当てるプロトコルです。 VoIPはIPネットワーク上で音声データを通信する技術です。 ブロードキャストを行う必要があったり、信頼性よりもリアルタイム性が重要視される場面ではUDPが選択されることが多いです。 データグラム TCPではデータの通信の単位をパケットと呼びますがUDPでは「データグラム」といいます。 実際にネットワーク上を流れているデータは以下のようなものとなります。 UDPデータグラム UDPデータグラムの表 上の表の送信元ポート、送信先ポート、データグラム長、チェックサムまでがUDPヘッダとなり、 ペイロードが実際に送信したいデータになります。 0~15bitまでは16bitが送信元のポート番号を表します。 16~31bitまでは16bitが送信先のポート番号を表します。 32~47bitまではデータグラム長を表します。データグラム長は、UDPヘッダとUDPペイロードの合計値です。 48~64bitまではチェックサムを表します。チェックサムは、データ(ペイロード)の整合性の検査用データとなります。 それ以降がペイロードです。 UDPデータグラムのサイズですが、これはIPパケットのサイズに依存します。 IPパケットは65535 Byteの容量となり、IPヘッダが20 Byteのため、UDPデータグラムで使用可能な容量は65535 – 20 = 63315となります。そしてUDPヘッダが8Byteのため、UDPペイロードの容量は最大で65507 Byteということになります。 よってデータグラム長に入る値は8 ~ 65515ということになります。 まとめ UDPはコネクションレスの通信方法 信頼性を犠牲にして高スループットな通信を実現 ヘッダサイズが小さく、オーバーヘッドが少ない(複雑な制御を行わないため) 2015年2月8日 WebRTC Conference Japanに行ってきました(2日目) 2015年2月5日 WebRTC Conferrnce JAPANに行ってきました(1日目) 2015年2月1日 Swift初心者向け勉強会に行ってきました 2015年1月29日 coocs2d-xでの座標系について cocos2d-xの座標系でつまずいたのでメモ。 タッチイベントを取得する際に,getLocationInViewで判定していたらどうも思い通りの挙動にならない現象が起きてた。 具体的にはy座標が反転してしまうようだった。 結論からいうと、getLocationInViewでなく、getLocationを用いれば左下からの座標で取得できた。 調べると、基本的にcocos2d-xで用いられているのは、OpenGL座標系で「左下」が原点らしい。 cocos2d-xのリファレンスをみると、座標系を取得するメソッドとして、TouchクラスのgetLocationとgetLocationInViewがある。 (以下リファレンスから引用) Point getLocation() const returns the current touch location in OpenGL coordinates. Point getLocationInView() const returns the current touch location in screen coordinates. なるほど。座標系の違いでメソッドが分かれているのか。 やっぱりリファレンスちゃんと見なきゃだめだなと思いました。