読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【雑記】Haskell(で|と)数学を割と真面目に勉強しようと思います

雑記 Haskell

Python3の型注釈が目指す世界をきちんと理解したいと思い、 2年越しくらいですごいHaskellたのしく学ぼう!をようやく読み終わりました。

型クラスの話あたりから、動的型言語(まともに書ける言語がPython, Ruby, R)にとっては感覚をつかみにくかったのですが、 「型クラスは型がもつ共通の性質をモデリングするためのもの(そしてそれは代数学の概念が元になっているらしい)」という感覚をつかむとと受け入れられました。

Elixirの本に「(関数型)プログラミングはデータの変換をするものだ」という、 関数型プログラミングの特徴を分かりやすく説明した記述があります。 Haskellはそこから一歩進んで、「関数の引数や戻り値がどんな性質を持っているか、つまりどんな型や型クラスなのかを意識しろ」と言っているようです。

話はやや逸れるのですが、数理最適化が好きな同僚(なんかもう後輩って呼べないですw)が「問題を関係者にヒアリングして、プログラミング可能な状態に定式化する」という羨ましい能力を持っているのですが、Haskellを学んでいるうちに、それが数学の鍛錬(もっと具体的には論理と集合で問題を表現すること)によって得られたものなんじゃないかと感じ始めました。

www.orecoli.com

数学にもともと興味があって数学科に進学した学生でも、大学以降で学ぶ数学についていけなくて挫折してしまう人は多いようです。

(中略)

具体的には以下の能力、

  • 証明するべきことを正しく論理式として表現する能力
  • 許された演繹規則のみを用いて、正しい証明を構成する能力

の二つが身についていないと、今からあげる書籍を100回読んでも理解できるようにはならないと思います。

というわけで今は「論理と集合」を学ぶために、本屋で見かけて良さそうだったこの本を読んでいます。 写像の記述方法がHaskellの関数と型注釈そのものでビックリだし、Haskellを学んだ後だと数式がプログラミング言語にも見えます。

論理と集合から始める数学の基礎

論理と集合から始める数学の基礎

また、Haskellで実用的なプログラムも書いてみたいです。この記事とか参考になりそうですが、過去の資産もあるので今はPythonで書いてしまっています。

syocy.hatenablog.com

純粋関数型データ構造

純粋関数型データ構造

「何の役に立つのか」という応用先を考えずに勉強しちゃってますが、仕事で必要な勉強とは別に身につけようと思います。 少なくとも、汎用的に役に立つ分野ではあるはずなので。

とりあえず、『達人プログラマー』的には2017年は数学の基礎とHaskellを学ぶ年にします。

【R】Yコンビネータ(不動点コンビネータ)をRで写経する

R

最近関数型言語(主にHaskell)で遊んでいます。

その中「ラムダ式の中で再帰を行うことができる」Yコンビネータという概念が出てきたのですが、ちょっと理解できなかったので、Rで実装してみたという記事です。

Pythonによる実装は以下の記事に詳しく解説されているので、これを基に「Rを使ったYコンビネータによる階乗の実装」をRで再実装(写経)してみました。

時間城年代記:PythonによるYコンビネータの仕組みの(多分)わかりやすい説明

解説もしようと思ったのですが、思ったよりエグいのと、元記事が素晴らしいのでそれで済ませます…。

yconv <- function(f) {
  (function(x) {
    function(m) {
      f(x(x))(m)
    }
  })(
    function(x) {
      function(m) {
        f(x(x))(m)
      }
    }
  )
}

func <- function(f) {
  function(n) {
    if(n < 2) {
      n
    } else {
      f(n - 1) * n
    }
  }
}

yconv(func)(5)
# => 120

ところで、Rでは当然関数での再帰は使えますし、再帰専用のRecallという関数も用意されているので、Yコンビネータを使う必要はありません。

Wikipediaの不動点コンビネータの記事にも、

不動点コンビネータにより、第一級関数をサポートしているプログラミング言語において、明示的に再帰を書かずに再帰を実現する為に用いる事ができる。なお、一般にそういった言語では普通に再帰が使えるので、プログラミングにおいてはパズル的なテクニック以上の意味は無い。

とあります。ラムダ計算の理論では重要らしいですが。

【雑記】データエンジニア・サバイバルガイド

この間、久しぶりにある優秀な先輩に会い、いろいろと話をする機会がありました。

以前短い期間でしたが一緒に仕事をする機会があり、その際に基本的な統計プログラミングや仕事で気をつけるべき点(闇)についていろいろ教えていただいた方です。「お前はもう少しいろいろできるはずだから気張れ」とケツを叩かれつつ、今の仕事について考えていることを共有していただけました。

(そのとき食べていたのがおいしい中華料理で、妙に辛い肉と紹興酒のせいで次の日お腹を壊してしまいました。)

特にデータ分析者やエンジニアに限らない話も多いですが、そこで話した内容を自分の解釈でまとめておきます。

自分のアウトプットに責任を持たない人を信用するな

企業で働くエンジニアは「どれだけビジネスの役に立ったか」で価値が決まります。

インフラエンジニアなら「可能な限りサービスを止めないこと」、アプリケーションエンジニアなら「新しいサービスを使ってもらうこと」が価値であるのと同じように、データに関わるエンジニアなら「データを正しく活用してビジネスを加速させること」が価値であって、「データ集計・分析を行うこと」で終わりはありません。

先輩は「コンサルティング会社に依頼した日次の売上予測のコードが、(精度はそれなりに良いけど)実行に数時間かかって運用できないから結局自分で全部作り直したよHAHAHA」って言ってました。

(逆に言うと、ある人が信頼できるかどうかを判断するには、エンジニア以外でも、「その人のコード(成果)がちゃんと運用されて役に立っているか」を見ればいい気がしています。また、他人からそれを見られていることも逆に意識しないといけないでしょう。)

自分の成果に責任を持たない人(例えばコードを渡してハイ終わりという立場の人)は、そのコードが今後も運用され続けることを考えないため、とりあえず動かすために平気で例外処理を握りつぶしたり、プログラムの可読性や汎用性を考えません。

コードを自分で書け

自分のアウトプットに責任を持つようにすると、BIツールより、汎用的なプログラミング言語やシステムも使いたくなります。

例えば、もっと多くのデータに適用したり、バッチ処理として自動化したくなると、あらかじめパッケージングされているものより、自分で作って応用先を変えられるもののほうが、結果的には細かいニーズに応えられるでしょう。

ただし、それを行うには、重回帰分析を行う際に多重共線性に気をつけつつ、データ抽出のために負荷の小さいSQLを書くよう気を遣いながら、微妙なR言語のプログラムをメモリを食いつぶさないようにリファクタリングしているうちに、なぜかデータ分析用のサーバー運用まで任されるようになってしまうため、より多くの分野を学び続ける必要があります。

そのため、「評価する(上司や会社)側の立場が、エンジニアのスキルの有無や成果を正しく評価するのは難しいだろうな」と思っています。

会社の外と繋がりを持て

それは、この分野のほとんどのエンジニアや分析者にとって今のところ「ロールモデルとなる人がいない」からです(少なくとも日本では)。

ある優秀な同僚は「論文や最新の記事を読めば必要な情報が集まるから外の繋がりはいいや」と言っていましたが、自分が力を入れるべき分野や、自分自身のキャリアを考えるとき、自分に近い分野の人の考え方を知っておく必要があると思います。

また、会社によって前提になっている技術や文化が違う場合も多いです。 (少し)私の今の仕事では、ほとんどの箇所をRubyで書いている(汎用的な一つの言語で統一しようという思想)ので、場所によっては静的型の言語で厳密に書きたいなあと思うこともあります。

ただ、同じような仕事でも、「得意なものを得意な言語に任せる」という思想もありえます(例えば基本的にはJavaで、分析的なコードだけPythonで書くなど)。そういう話を会社の外の人とすると、気付かされることも多いです。

縄張り意識に気をつけろ

「もうちょっとこういうデータの分析や活用ができるんじゃないか」と思うと、どうしても組織の壁や、既にその仕事をやっている人がいるがイケてないもの(例えば自動化できる仕事を自動化できていない、など)にぶつかります。

まずは、ワインバーグの『スーパーエンジニアへの道』に書いてある「問題ない症候群 (No Problem Syndorome)」に陥らないようにしましょう。 これは「対応する問題を深く理解することなく、××という技術さえ導入すれば問題ない」と主張してしまうことです。多かれ少なかれ(自分でも他人でも)身に覚えがあると思います。

要するに、関係部署にヒアリングや、データの調査(例えばログデータが数日間途切れていたのに、誰も気づいていないということも多々あります)の手間を惜しんではいけません。

スーパーエンジニアへの道―技術リーダーシップの人間学

スーパーエンジニアへの道―技術リーダーシップの人間学

たぶん、ほとんどの人は「自分は無能だ/悪人だ」と認識するのを嫌がります。私も嫌で「自分は有能で、他人の役に立っている」と思いたいです。

そのため「××さえ導入すればものすごく楽になるのに、なんでやらないの?バカじゃね?」という態度でいるのはやめましょう。 大抵はどこか間違ってますし、万が一その通りだとしても相手は反発し、自分の仕事の成果が出なくなるでしょう。

組織構造も重要である

基本的に、データ分析を行う人は「ある程度規模が大きくデータが揃っている組織」に必要とされているのに「複数のスキルや複数の部署の仕事に跨った仕事をするベンチャー精神(?)」が必要であるため、ある程度大変なことはすぐにわかると思います。

そのため、組織構造も(おそらく)重要なはずなのですが、「どういうふうにデータ分析チームをマネジメントすればいいか」というノウハウも、ここ1~2年でようやく少しずつ見かけるようになった程度です。(例えば@tokorotenさんの以下の資料などです)

また、その先輩は「いろいろな会社を見たが、データ分析者の立場や仕事のやり方は、最初に分析の基盤やノウハウを作った人の思想を受け継いでいる」と言っていました。

www.slideshare.net

これからの世代は自分より優秀だ

実は、日本の大学に「統計学」専門の学部がなく、データサイエンス(と呼べそうな)分野を専門的に学んだ人はそう多くはありません。 しかし、日本国内でもそういう機関を充実させる動きはあり、例えば滋賀大学が2017年4月から「データサイエンス学部」が産まれます。

(私自身は、コンピュータサイエンスやデータサイエンス(と呼べる分野)を専門的に学んだことがありません。私のように、WEB企業で働いていて、近い仕事をしている人の中にも、今はそういう人が多い気がします。)

diamond.jp

統計学といえば日本では長らく、経済学部や工学部の一部(学科ですらない!)という位置づけにありました。しかし遂に日本で初めて、独立した“統計学部”が登場します。その名も「データサイエンス学部」。

ということを私から見ると一枚も二枚も上手な先輩でも話していました。「海外のエンジニアと比べると、モデル自体の精度みたいなところで勝負するのは難しいから、他の強みを持っておいたほうがいい」とも。

5年後や10年後の未来には、おそらく自分より遥かに優秀な後輩と仕事をすることになるでしょう。そのときにどこで勝負すべきか考えておく必要がありそうです。

【雑記】なぜ「人工知能」という言葉が使われてしまうのか

というバズりそうなタイトルですが、「人工知能」とか「機械学習」のことはあまり書きません。 私も詳しくないので。

そういうのを期待している人は、こっちを読みましょう。

bohemia.hatenablog.com

ある会のとき、上司が同僚2人の成果について「人工知能」という言葉が使われて説明していました。本当は、数学好きな方が使っているものは「数理最適化」で、分析が得意で業界ニュースをひたすら追っている方が使っているものは「統計学」の「重回帰」で、「知能」と呼べる(ぶべき)ものでは無いよなと私は思っていました。

(ただし、その上司も「本人が人工知能だと思っているかは別だけど」という注釈を付けて、よく聞かれる言葉で説明するために、敢えて「人工知能」という言葉を使っているようでした。)

同じようなことが何度かあり、そこでいろいろモヤモヤしていたのですが、根本的に、ビジネス側の人にとっては「(実装者にとって重要な)何を使って/どうやって解決するか」は重要ではなく、「何を解決するか」のほうを重視しているだからだろうと思うようになりました。

フェルディナン・ド・ソシュール - Wikipedia

一方、音韻だけではなく、概念も言語によって区切られている。たとえば、「イヌ」という言葉の概念は、「イヌ」以外のすべての概念(ネコ、ネズミ、太陽、工場、川、地球……)との差異で存立している。このように、人間は、「シーニュ」という「概念の単位」によって、現実世界を切り分けているのである。そして、その切り分け方は、普遍的ではない。たとえば、日本語では虹の色を「七色」に切り分けているが、それを「三色」に切り分ける言語もある。

かっこつけてソシュールを出しときましたが、実装者でなければ、裏で動いている仕組みが重回帰でもディープラーニングでも変わらないわけです。しかし、私も会計と財務と経理の違いが分かっておらず、それらは抽象化して他の部署に任せているので同じようなものです。

要するに、「数値計算を使った難しい技術が発達しているらしい」ということは分かっていて、「それらを包括して任せられる人が欲しい」と考えているようです。ただし、「人工知能」という言葉は「何を解決するか」という部分も曖昧なので、そっちの視点でも充分な言葉じゃないなと思ってしまいますが…。

また、最近飲み会で他部署の後輩と「インフラ苦手なんでどう勉強したらいいのか分からないんですよ」という話を少ししていたのですが、 よくよく聞くと「データベースやログ収集・解析の仕組み」のことを「インフラ」と言っていたので、ちょっとビックリしてしまいました。

私はデータ収集のプログラムを作っていて、私はそういう部分までアプリケーション側の(DevOpsの考え方が普及してきた今、アプリケーション/インフラの対比も既に古臭いかもしれませんが)責務だと考えていたのですが、 彼の触っている会社のメイン事業のコードベースが巨大すぎるので、必要以上に難しくブラックボックスに見えてしまっているのかもしれません。

最近ローレンス・レッシグの本を読んでいて、「アーキテクチャによる規制(要するに、ユーザーに行動を取りやすい/取りづらい仕組みを作ってふるまいを制御すること)」という考え方が書かれていたのですが、同じような現象が古いコードや巨大なシステムのせいで意図せず起こっているのかもしれません。

CODE VERSION2.0

CODE VERSION2.0

結局よくわからない記事になってしまいましたが、

  • 相手の使っている言葉が、何を差しているのか(どの範囲を差しているのか)
  • それは多分、立場とか経歴とか、触れてきたアーキテクチャ(?)によって変わるから、それを確認してちゃんと考えたほうがいい

ってことを考えています。

【R/Python】rChatworkとpychatworkをチャットワークAPIのバージョンアップに対応させました

R Python

RとPythonのチャットワーク用ライブラリを、APIのバージョンアップに早めに対応しました。 ライブラリの実装練習に作った割に、なんだかんだ自分でいろいろと利用しているのでビックリです。

help.chatwork.com

v1からv2への移行期間として、下記の停止日まではv1を引き続きご利用いただけます。
停止日:2017年5月上旬予定 ※具体的な停止日は2017年3月下旬頃にご案内予定です。

上記の停止日以降は、v1でのアクセスはできなくなりますので、 チャットワークAPIをご利用中のお客様は、お早めにv2へ移行いただきますよう、お願いいたします。

といっても、個人的に利用している「メッセージの投稿」と「メッセージの取得」しか実装していないので、エンドポイントのURLを変更しただけなんですけどね。

github.com

github.com

【雑記】『フリーカルチャーをつくるためのガイドブック』で色々勉強になったけど結論はない

先日、市役所に書類を取りに行くついでに寄ったブックオフで、気になるタイトルの本を買いました。

それが『フリーカルチャーをつくるためのガイドブック』です。

フリーカルチャーをつくるためのガイドブック  クリエイティブ・コモンズによる創造の循環

フリーカルチャーをつくるためのガイドブック クリエイティブ・コモンズによる創造の循環

filmart.co.jp

本書は、「あらゆる創造的活動は、先行して存在する文化物を継承しながら行なわれる」というフリーカルチャーの本質に迫り、「継承」と「リスペクト」が生み出す「創造の共有地」という未来を描き出します。「わたしたち個々人が、これからの文化の形成にどのように参加していけるのか?」という道筋を明らかにして、未来の創造と表現、ビジネスと社会活動のためのヒントとなる1冊です。

クリエイティブ・コモンズをデザインしたローレンス・レッシグのことは(友だちが話していて)一応知ってはいて、 「国家は法律や慣習で構成されたOSのようなものだ」みたいなことを言っていることは知っていました。 (又聞きなので、正確な表現ではないです)

クリエイティブ・コモンズが国家間の法律の差異を吸収するために、複数の層からなる構造をしているそうです。

「リーガルコード (Legal Code)」の層は、法の専門家(弁護士や裁判官など)が法的に解釈することのできる法律用語で記述された文書になっています。 「一般人 (Human Readable)」は、法の専門用語に慣れていない一般人が読めるように、可能な限りライセンス内容を伝える文章である「コモンズ証 (Commons Deed)」を指しています。

なんとなく、VM(バーチャルマシン)でOS間の差異を吸収し、その上で動くプログラミング言語で記述しているような感覚を受けます。 こんな発想というか問題の解き方してる人いるんですね。知ってる人からすると「今更かよ」っていわれそうですが。

いい加減、彼の著作を読んでみなきゃなと思っています。

719夜『コモンズ』ローレンス・レッシグ|松岡正剛の千夜千冊

具体的なサービスの話も結構充実していて、 例えば、「自分の履歴書をGithubで公開したよ」というエントリーがうちの会社のエンジニアの中でちょっと話題になっていましたが、

okoysm.hatenablog.jp

これと似たような発想で、イラストレーターやグラフィックデザイナーが自分のポートフォリオを公開する「ロフトワーク」というWebサービスがあるそうです。いわれてみれば、アート関連の「作品を見れば分かる」ものはこういうサービスと相性が良さそうだし、類似のサービスもいくつかあるっぽいです。

www.loftwork.com

もう一つ印象に残った記述は、あとがきにある次の文章です。

他方で、フリーカルチャーがもたらすべき(まだもたらしていない)重要な変革だと個人的に考えていることがあります。 それは、私たちの文化の中で巨大な重力を持つ既得権益とは関係のないところで、新たな創作物の秩序が持続可能な形で立ち上がることです。

ちょっと関係のない話になりますが、音楽やっている人もやっぱり「技術との付き合い方」で悩んでいるらしい、というのは感じています。

この間知り合いのインディーズバンドマン(活動が長く、そこのコミュニティを支えている立場の人)と、「自分たちの世代からすると、ライブに来てほしいし、そっちのほうがリアルだと感じる」「今の時代はファンの定義があいまいで、CDを買っていればファンなのか、ライブに来ればファンなのか」みたいな話や、「バンドのWebでの告知をどうすればいいのか」というようなとりとめのない話をしました。

技術が発展するに従って、その分野やジャンルに合った、コミュニティや技術のデザインを考える必要があるのかもしれません。めっちゃふわっとした感じにして、特に結論もないまま終わります。

【Python】Web集客や、データ処理の最新ニュースを自動投稿するブログを作りました

Python Twitter

実際には、ここ1年くらいSlackに通知していたものを、「ログ残んないしざっと見るとき不便だな」と思ってたので、はてなブログに自動投稿するように作りました。

TumblrBloggerとか、JekillとかPelicanとかでS3に静的ページを作ることも考えたのですが、既にはてなブログに自動投稿するスクリプトは書いていて、いろいろやるのが面倒だったのではてなProに登録しました(はてなProではブログが10個まで持てます)。私はサラリーマンなので時間を金で買います。

正直、はてなブログの投稿部分をライブラリ化してないし、それぞれ同じテンプレートで投げているだけだし、そもそも元々小規模なコードをサーバーで動かしてたやつをアレしててリポジトリ管理もしてなくてヤバイのですが、いずれ手を加えざるをえないと思っています。

だいたい、以下のリポジトリのコードを使っています。

github.com

以下の3つのブログです。

webacqs.hatenablog.com

7news.hatenablog.com

fudosaninfo.hatenablog.com

集客系のニュースに関しては、@rechiba3さんの記事の「SEOマーケティング」を参考にし、その項目にあるアカウントからURLを取得していい感じに重み付け&ソートしています。

(他の項目も参考になると思います)

www.rechiba3.net

私も社会人になってからはTwitterをニュースフィードとしています。ディスプレイ大きい環境で仕事していたときには、常に表示していたほど。各APIの更新情報とかいち早く知れるのでまぢ便利。

私は学生のときにTwitterばかり見ていたのですが、生活がついていけなくなったので、プログラムで効率化しました。