@sasaplus1 さんの神対応によって process-bookがwebで読みやすくなりました

process-book ってなに

この文書はなんですか?

この文書は*nix系のシステムにおけるプロセスやシグナルなどについて説明することを目的に書かれました。「プロセスとかよくわかってないからちゃんと知りたいな」みたいなひとたちが想定読者です。

書いているあいだは gist で管理されていたのですが、ボリュームが大きくなったので github で管理するように変えました。

というやつです。結構頑張って書いたんですけど、その結果結構いろんな人に褒めていただけて、本当にありがたいなという感じです。ありがとうございます、ありがとうございます。

実は大きなトピックとして「環境変数」についてまったく触れられてなくて、そこは「あちゃー」って感じなんですけど、いつか気が向いたら追記するかもしれません。気が向かなかったら追記しないので、気が向くといいなと思っています。

どこで読めるの

process-book

どういう経緯なの

ちょっと前に「gh-pagesに対応したブランチ作ったから見て」って @sasaplus1 さんから言われてて、「おっありがたい、あとでみよーっと」って思ってたらそのまま忘却の彼方にアレしてしまっていたのですが、今回 Github の issue にコメントをいただいたことで思い出して、それをそのまま、ほんとにそのまま取り込ませていただいたという形です。

ありがとうございました & 放置しててすみませんでした。めっちゃ神対応な感じだったんで今度 :beer: おごります……。

swift の protocol の解決が Playground 上でうまくいかないっぽい話

えー。尊敬するiOSアプリケーションプログラマのひとりであるdictavさんがこういうものを上げておりました。

Logger for Swift

これを見て最初に思ったのが、「static var とかセオリーで考えたら「ねーよ」っていう感じだけど、この場合に限ってはうまく作用してておもしろいな」でした。

その次に思ったのが、「あっでも description に関しては var である必要なくない?」でした。というのも、この desciption は固定でいいはずだから。

しかし、この var description は、そもそも Printable プロトコル(ジャバで言う所のinterfaceみたいなもんや)が要求するするものであるので、そもそも「description は let でよくない?」というのは的外れな考えですね。

というわけで、Printable プロトコルについて調べてみましょう。

Printable プロトコルとは

Swift Standard Library Reference: Printable

ここに全部書いてある。要するにそのクラスのインスタンスを文字列化するときにどういう形で文字列化するかっていうのを var description というところに定義しておいてね、っていうプロトコルです。

試してみる

で、これをみて私はまず「enum が Printable プロトコル実装できるのおもしろいな〜」って思って、Xcode の Playground でこういうふうに書いてみたんですね。

http://i.gyazo.com/70dda2bb1299d383cae6dcf8ac961616.png

あっあれーーーーー!?println(Nyan.Nyaa.description)はちゃんと "にゃー" を返すのにprintln(Nyan.Nyaa)が"(Enum Value)"を返す!?!?!?!?!?

というのを見て「なにこれどういうこと」と困惑していたら、Twitterから「これアンドキュメンテドだけど、Xcodeでちゃんとプロジェクト作ってビルドするとprintln(Nyan.Nyaa)も"にゃー"だよ」という情報を得ました。そこで私は「あれっこれ(つまり enum の この挙動)って要するに「未定義」な振る舞いなんじゃないの」って思ってしまったんですね。疑問に思ったら一次情報に当たるのがプログラマのたしなみです。仕様上の定義を探す旅に出ましょう。

まずはレキシカルな仕様を調べる

まずは言語のLexicalな仕様を当たりましょう。これは要するに「そのプログラムを文字列的(形式言語的)に解釈したときにただしいプログラムとして受理できるかどうか」を調べることにあたります。

The Swift Programming Language: Lexical Structure

Lexicalな仕様がきちんと公開されていました。

この中で関係ありそうなのは The Swift Programming Language: Declarationsenum-declaration の部分で、抜粋すると

http://i.gyazo.com/92923d52b9aeaadfe2b0137341031b64.png

とあります。enum-declaration の部分をみると、enumの定義が受理する文字列のルールはふたつあるようです。

今の関心は

enum Nyan : Printable {
    case Nyaa, Mew
    var description: String {
        switch self {
        case .Nyaa: return "にゃー"
        case .Mew: return "みゅー"
        }
    }
}

なので、多分 attributes と access_level-modifier は(optionalだし)関係ないだろうなとあたりをつけ、union-style-enum­ が受理する文字列や ­raw-value-style-enum­ が受理する文字列をさらに見ていきます。swift をちょっと知ってると、上に見た文法はraw-value-styleではないとわかるので、union-value-style-enumにあたりをつけてみていきましょう。   まず、union-value-style-enum は 以下のルールを受理します。

enum(固定文字列) ­enum-name­ generic-parameter-clause(­opt) ­type-inheritance-clause(­opt) ­{ ­union-style-enum-members­(opt)­}

ここから、Nyanの定義のうち "Nyan" が "enum-name" であり ":Printable" が ­type-inheritance-clause であることが推測できます。 深追いはしませんが enum-name は Nyan を受理するし type-inheritance-clause は " : Printable" を受理することが同様に深追いしていくとわかります。

さて、問題は ­union-style-enum-members­(opt)­ です。こいつが

    case Nyaa, Mew
    var description: String {
        switch self {
        case .Nyaa: return "にゃー"
        case .Mew: return "みゅー"
        }
    }

を受理するかどうがが今一番の関心ですが、union-style-enum-membersunion-style-enum-member union-style-enum-members(opt)となっており、union-style-enum-member複数集まったものだと見て取れます。で、union-style-enum-member は declaration | union-style-enum-case-clause­ とあり、今回の例で言えば case Nyaa, Mewunion-style-enum-case-clause­にあたり、var destription 以下がdeclaration­ に当たることが推測できます。で、実際にこいつらをさらに追ってみると、上記のようなNyan enumの定義がレキシカルには受理されるべきものであるということが確認できます(実際に追ってみてください)。

さて、これでこれが「レキシカルには受理されるべきものだ」ということが確認できました。

次は意味を調べる

では、次は enum における computed property (var varname: Type { codeblock } みたいなやつはcomputed property と呼ばれる)が言語仕様上どういう意味を持つのかってことを見ていく段階ですね。探すと、出て来ました。

The Swift Programming Language: Enumerations

Enumerations in Swift are first-class types in their own right. They adopt many features traditionally supported only by classes, such as computed properties to provide additional information about the enumeration’s current value, and instance methods to provide functionality related to the values the enumeration represents.

なるほど、computed property は普通のクラスみたいに使えるよ、と書いてありますね。ということは、この挙動は別に未定義なわけではなくて、Xcodeでプロジェクト作ってビルドしたときの挙動が「swiftの仕様上ただしい挙動である」と言えそうです。

じゃあなんでPlayground上では仕様と異なる動きをするの?

これ、どうやら Playground が依存している LLDB 上の制限っぽいです。たとえば、以下のような(enumと関係ない)例を見てみてください。

http://i.gyazo.com/05d24ffaaeb3428bb37fc25f7961c230.png

普通にPrintableを実装した Nyan クラスのインスタンスが println に対応していません。そして lldb のなんかの値が吐かれています。つまり、多分これって、静的に解決すべき 「Nyan is a Printable」な関係がLLDBの制限によって静的に解決できなくて、そのせいでうまく動いてない、ということなんでしょうね(仮説です)。

この仮説の正否と、なぜ LLDB 上で Printable が解決できないかについてはおそらく dictav さんがブログで解明してくれるでしょう!期待して全裸待機!!!!

Niigata.pm tech talk を開催しました #niigatapm

去る 12/13 、JPAさんの支援により Songmu さんを講師にお迎えして、Niigata.pm tech talk を開催しました。

内容

発表内容は、以下のような感じでした。

hayajoさん 「Dockerを使った Perl アプリケーション開発」

タイトルの通り、Dockerを利用して Perl のアプリケーションを開発するためのノウハウについて発表していただきました。実際にテスト用の環境で業務で Docker を利用されているらしく、さらなる知見を今後も発表していただけそうですね。レンサバを提供するという業務上、FTPの利用をやめることができず、そこがボトルネックとなってDockerをなかなか本番投入できない、という話は「なるほどな〜」という感じでした。資料はこちら Dockerを使ったPerlアプリケーション開発 | ストーリーボード - STORYBOARDS

moznionさん 「空の青とパーザーの気持ち」

最近 Parser ばかり書いているという moznion さん。実際にいくつもパーサを書いたことによって得られた知見を発表してくれました。「みなさんにもいつかパーザ期ってのが来るんですよ」「拳銃は便利、一丁欲しい」「心を強く持て」などの名言がたくさん飛び出す中、机上の空論ではない「自分の体験として得られた知見」をたくさん発表してくれました。資料のアップが待たれる。

neko_gata_s 「ScalaPerl と 関数」

わたしです。Scalaの関数型としての側面を、Perlのコードを用いながら説明するという内容です。解説はほとんど口頭で行ったため、資料にはコードしか書いていないので、資料だけアップしても意味がわからんという感じになっているので、資料をアップする予定はありません。

masaru_b_clさん 「OWINについて」

.NET における PSGI であるところの OWIN についての発表をしていただきました。OWINについての説明の間、twitterのタイムラインが「これPSGIだ」「完全にPSGI」「PSGIじゃん」で埋まったのはおもしろかったです。OWIN によってIISへの依存が断ち切られたことによって、最近なにかと話題の たプラットフォームで .NET のサーバーサイドアプリケーションが実際に動くというのをデモされていて、heroku上で.NETアプリケーションが動いているのはけっこう「おお!」という感じでした。ただ、OWINは .NET5 では消えさり、MSが用意する新しい仕組みに置き換えられるとのこと(しかし概念はまったく変わらない)で、ちょっとした悲しみもありつつ、「はやくこないかな Mac 向け .NET core」という気持ちになる発表でしたね。あと async await めっちゃ便利そうだった。資料はこちらから OWINについて #niigatapm #nds39 で発表してきました #aspnetjp | be free

ritoさん 「JSON Web Tokenについて」

JSON Web Token について。名前は知ってるけど具体的にはよく知らない、くらいの存在であるJSON Web Tokenについて発表してくれました。一言で言うと二者間で署名付きのメッセージをやりとりするための仕様とのことで、シンプルな仕様であるため実装が用意であり、なおかつ構造化されたデータを署名付きで送れるので、悪意あるリクエストと正しいリクエストを比較的前段(アプリケーションサーバーとか)で弾くことができて、バックエンドへの負荷が減らせるという感じでかなり便利に使えるなこれは、という感じでした。eyJ!eyJ! 資料はこちらから About_JWT_at_NDS_39_Niigata_pm // Speaker Deck

itosouplusさん 「Aircrack-ngによるwifiのハッキング手法とwepのアリゴリズムと脆弱性について」

WEPキーの脆弱性についてWEPの暗号化の仕組みから解説してくれる発表でした。実際にWEPキーの解析が一瞬で終わる様もデモしていました。今回が初発表とのことでだいぶ緊張されていたようですが、「WEPはなんかヤバいらしいよ」くらいの理解であるひとが多いなか、弱いIVが発見されたせいでキーの一部が簡単に割れてしまうことが納得できたし、実際にWEPを利用する怖さを実感できるとても良い発表だったように思います。資料はどこかにあるかな(教えてください)

Songmuさん 「私を育ててくれたN個のCPANモジュールたち」

トリを飾るは Songmu さん。現在第一線で Perl ハッカーとして活躍されている Songmu さんが、自分が関わってきた CPAN モジュールとともに自分がどうやってPerlハッカーになっていったのかを振り返る発表でした。静かながらも熱のこもった発表で、聴いているひとたちが「かっこいいな、自分もこうやってコミュニティに自然に貢献できるハッカーになりたいな」と思えるような感じでした。発表資料はこちら 私を育ててくれたN個のCPANモジュール達

その他の話

正直2次会以降あんまり覚えてない!けど翌日新幹線が止まってしまい東京からわざわざ来てくださった方々が帰宅困難に!という1幕があり、「あっなんかっあっスンマセンあっうっ」ってなりました。

その他レポート

わたしが見つけ次第貼っていきます。「書いたんだけど!」みたいなひとは @neko_gata_s までメンションください!ブログを書くまでがNiigata.pmですよ!

OWINについて #niigatapm #nds39 で発表してきました #aspnetjp | be free

Niigata .pm tech talk に参加してきました #niigatapm #nds39 | civic site

ドラ娘の話

なんか盛り上がってるけど、けっこう前からわたしもよくドラ娘という風潮に twitter とかで言及してたのでこのタイミングでブログで一度書いておく。

  • ドラ娘という風潮は個人的には不快であるが、これはどちらかというと私個人の嗜好に基づくものなので、「私は不快である」というのは好悪の問題であり善悪の問題ではないのでそれを理由に「悪いものだ」と言うつもりはない。
  • ポリティカリーコレクトかどうかで言ったら完全にアウトだとは思う
  • ただ、すべてのカンファレンスが政治的な正しさを持つべきだとも思わない。
  • つまり、「うちのカンファレンスはポリティカリーコレクトとかクソくらえなんで」っていうカンファレンスがあってもいいと思うし、それに対しておのおのがおのおのの思うように行動すれば良い。

というのが私の基本的なスタンスです。

追加で言っておきたいことが一点あって、「ドラ娘やってるほうだって楽しんでやってるんだから外野がどうこう言うことじゃねーだろ」みたいな意見は最悪だと思っています。カンファレンスの参加者や発表者から不快感や違和感が表明されているのに対して「外野は黙ってろ」っていうのはどうなんですかね。参加者や発表者がそのカンファレンスのあり方についてする発言を "外野の発言" とするスタンスに対しては「それは違うんじゃねーの」って強く思いますね。「ドラ娘最高!」っていう参加者も「あれはないと思う」っていう参加者もどっちも「外野」ではないよね。

TRADITIONAL MUSIC THEORY FOR CONTEMPORARY MUSICIANS を読んだ

一般に流通してない本なんだけど、下のリンクから買える。

【販売ページ】Traditional Music Theory For Contemporary Musicians | Music Theory Workshop Japan

公開されてる分は全部読んだ。

著者が自分でも言ってるんだけど、「猿でもわかる!!音楽理論」みたいなタイプのやつだと演奏や作曲に活かすことができないくらいレベルが低くて役に立たないし、かといって芸大和声みたいなやつだとそれを役立たせるまでの道のりが遠すぎる & ポピュラーミュージックに応用するまでの道のりが遠すぎるというのがあって、なかなか「演奏や作曲の役に立ちやすい音楽理論の本」ってのは今までなかった印象がある。この本はそのちょうど間を埋めるような立ち位置の本で、バンドマンやDTMerにとってはかなり参考になるのではないかと思った。

ただ、結構ストイックに進んでいくタイプの本だし、たまに「んっこれって説明あったかな」「あーちょっと戻るとたしかに書いてあるね」みたいな感じで、「まだ音楽理論のことをあまり知らない人」にとって、「これ一冊で全部わかる!」となるにはちょっと難易度結構キビシいかもしれないな〜という印象も受けた。

まとめると、もしわたしが「ポピュラーミュージック音楽理論教室」をやるとしたら、教科書にしたいな、という感じの本でした。独学するなら気合いが必要、でもまわりに訊けるひとがいるならめっちゃ良い感じにまとまってるな、というところです。

少なくともわたしのバンドメンバーや音楽仲間にはおすすめできる本なので興味があったら購入すると良いかもしれない。わたしの友人がこれ買って「ここわかんないんだけど」みたいなことがあったらわたしが教えますのでそういうひとはお気軽に相談してください。

あっあと、この本に限らないけど、音楽理論の本やるときはちゃんと音を出しながら耳と頭両方使うのがとても大事だと思う。そうしないと音と理論が結びつかないから。

NDS 38 長岡花火を支える技術 に行ってきた #nds38

新潟県長岡市で定期的に開催されている勉強会「NDS」の38回目に参加してきました。

メインセッションの感想を

長岡花火のインターネット配信がどのように行われているかという話でした。めちゃめちゃ豪華な機材でめちゃめちゃハイクオリティの映像を撮っているにも関わらず、配信の目的が「長岡に人を呼ぶ」である以上インターネットに流す映像の画質はあえて下げている、という話を聞いて、「あーこれが "ミッションステートメント" か」と思いました。プログラマとかって「手段が楽しい」ってなっちゃいがちだから、「せっかくいい画質で撮ったんだからそのまま配信したい!」っていう欲が勝っちゃいがちなんだけど、そこで「何のためにこれをやっているんだ」というところに立ち返ってその欲を捨てられるのはすごいな、と。

めちゃめちゃ手間と暇とお金をかけて配信を行っているのですが、そのすべてがノーギャラという話を聞いたときには、まず素直に長岡花火に対するその情熱と愛情に感動しましたし、その尊さ自体は賞賛されるべきものであると思います。一方で、これだけの負担を、だれかの情熱と愛情に依存したまま続けてもいいのかなぁ、という気持ちも同時に沸き上がりました。地元にとってとても意味のある活動だからこそ、「継続できる仕組み」というのが金銭を含めて構築できたほうがいいよなあというのは感じていて、そのあたりはむしろ市の課題としてあるよなあ、と感じました。

LTもしたよ

「Niigata.pmをやるぞ!!!!」というLTもしてきました。

内容としてはタイトルのまんまです!

上記を見ていただければわかるように、今回の Niigata.pm はメンバーが異常に豪華だぞ!

YAPC::Asia登壇者だらけ!CPAN Author だらけ!!!参加しないと損するぞ!

あなたとNiigata.pm、今すぐダウンロード

ActiveRecord の dup の挙動

ひとことで言うと、 ActiveRecord には dirtry な attribute を追跡するための便利なメソッド群が定義されていますが、dup とともにこれらを扱うときには要注意ですよ、というお話です。

_was とか _changed? は便利

dirty な attribute を追跡するってのはどういうことかっていうと、たとえばこういうことです。

# DBからuserをひとり引いてくる
user = User.first
user.name # => "shinpei"
user.name_was # => "shinpei"
user.name_changed? # => false

# name atribute を書き換える
user.name = "nekogata"
user.name # => "nekogata"
user.name_was # => "shinpei"
user.name_changed? # => true

# DBに保存する
user.save!
user.name # => "nekogata"
user.name_was # => "nekogata"
user.name_changed? # => false

要するに「書き変わってるんだけど、未だにDBに保存されていないattributeはどれですか、書き変わる前の値はなんですか」みたいなことを記録してくれてるんですね。オー、便利。

dup すると面白い挙動する

# DBからuserをひとり引いてくる
user = User.first
duped = user.dup

user.name # => "shinpei"
user.name_was # => "shinpei"
user.name_changed? # => false

duped.name #=>"shinpei"
deped.name_was # => ""
deuped.name_changed? # => true

おおお?という感じの挙動ですね。ちょっとバグっぽい感じもする。しかしこれは意図された挙動です。それは ActiveRecord のテストからも確認できます。

rails/dup_test.rb at master · rails/rails · GitHub

test_dup_not_persistedtest_dup_has_no_id、きわめつけに test_dup_with_changes を見てみましょう。

このあたりを読むと、ActiveRecorddup は以下のような使われた方をすることを想定したメソッドであることが見て取れます。

# DBからユーザーを引く
user = User.first 

# (pk以外は) 同じ値を持ったユーザーをDBに保存
user.dup.save!

なるほど? つまり、ActiveRecorddup は、「オブジェクトのコピー」を作るメソッドではなくて、「レコードのコピー」を作るメソッドとして意図されているわけですね。

オブジェクトのコピーが欲しいなら clone を使おう

よけいなことしないでくれ!俺は単にオブジェクトのコピーが欲しいんや!というときにはどうすればいいかというと、clone メソッドを使ってあげましょう。こうすれば普通の挙動をします。

# DBからuserをひとり引いてくる
user = User.first
cloned = user.clone

user.name # => "shinpei"
user.name_was # => "shinpei"
user.name_changed? # => false

cloned.name #=>"shinpei"
cloned.name_was # => "shinpei"
cloned.name_changed? # => false

API docも読もう

dup (ActiveRecord::Core) - APIdock

clone (ActiveRecord::Core) - APIdock