私の情報収集術
諸事情により長い夏休みだったので、情報収集のやり方をちょびっと洗練してみた。
目的
普段TwitterのTLを追ってるだけでも、Web業界/データ分析業界の動向はだいたい掴める。
それとはてブのトップ見てればだいたいの情報は入ってくるんだけど、いずれにせよ読みっぱなしだと「あれ、どっかで読んだ気がするけど思い出せない…」になりそうなので、役に立つ/面白いと思った情報はストックしておきたい。
プラスして、仕事に関係あること以外でも、政治経済社会スポーツエンタメその他広くアンテナ張っときたいよね。新聞とか取ってないし。
最後におまけで、読んだページをTwitterに流しておけばひょっとすると人の役に立つかも知れない。
情報収集源
情報の集約
PressoとRSSリーダ(feedly使ってる)個別で読んでると情報が分散されてしまう。やはり情報は一元管理したいよね。
ってことでPocketを使うことに。
Pressoの記事リスト画面にはワンタップで「あとで読む」タグをつけてブクマできる機能がるので、iftttを使ってこれをPocketに流すように設定。
feedlyのiPhoneアプリには直接Pocketに送る機能があるので、これを使う。
こうすることで、電車の中とかでPressoとfeedlyのアプリを開いて、興味ある記事をぽちぽちっとするとPocketに保存できるように。
読む
Pocketで読む。ただひたすら読む。
出先でスマホで読んでもいいし、家でPCやタブレットでじっくり読んでもいい。クラウド万歳。
シェア()する
読んでこれ面白いなーと思ったら、Pocket上でスターを付ける。ここでまたiftttを使って、スターをつけた記事をTwitterに流すようにしておく。
読んだ: 都市か地方か データで探る日本の潜在力 2015.8.16公開 http://t.co/p1WKclnZ9v (via @pocket)
— 冬見 (@who_you_me) 2015, 8月 16
これで人力キュレーションメディアの出来上がり。
まとめると冒頭の画像になる。
問題点
いろいろある
- 「あとで読む」でブクマした記事がPocketに反映されるのに時間がかかる
- 「あとで読む」だけのブクマが大量発生する。コメント付きのブクマがしづらい
- Twitterに流れるのはタイトルとリンクだけで、自分のコメントとかはつけられない
問題はあるが、現状それなりに機能してるのでしばらくはこのままでいこうと思う。
Neo4jをはじめよう - (2) データを投入する
Neo4jをはじめよう - (1) インストール - ふゆみけ〜おかわり〜
の続き
前回の最後で「Twitterのデータを投入!」とか息巻いてましたが、API制限キツくて色々めんどくさいのでここはSNA(社会ネットワーク分析)用のサンプルデータを使うことにします。
「SNAって何やねん」って人はこのエントリでも見ればいいんじゃないでしょうか。
使用するデータ
SNABook/chapter3 at master · maksim2042/SNABook · GitHub
上述した勉強会で使った『オープンソースで学ぶ社会ネットワーク分析』という本の3章のデータを使います。
LiveJournal.comとかいうSNS(?)*1から、とあるユーザーの友人、友人の友人、友人の友人の友人……を深さ3で取得したデータ。
node数は87,250、edge数は143,120と、遊び用のデータとしてはなかなかいい感じな規模感。
サンプルデータをNeo4に投入
csvに変換
では、このデータセットをneo4jに投入してみましょう。サンプルデータはPajekというネットワーク分析ツールで使うデータ形式で保存されており、このままではロードできません。
neo4jで外部ソースからインポートするにはcsvファイルを使います。
12.8. Importing CSV files with Cypher - - The Neo4j Manual v2.2.1
そこで、今回はnetworkxというPythonのネットワーク分析用ライブラリを使って、Pajekのデータ形式をneo4jが読み込めるcsv形式に変換してやります。
nodeとedgeで別ファイルで、結果はこんな感じに。
nodes.csv
id,name 17872,zhuravl 19609,kir_a_m 51320,vizu_buduwee 21481,na_stasja 66039,aernmru ...
edges.csv
start,end,weight zhuravl,milavalyacat,1.0 zhuravl,a_u,1.0 kir_a_m,cheger,1.0 vizu_buduwee,johnjthunderer,1.0 ...
cypherで読み込み
あとはこいつをcypherを使って読み込みます。
前回のエントリ通りvagrantで仮想マシンを立ち上げていれば、Vagrantfileと同じディレクトリにこのcsvファイルを設置すれば仮想マシン上からも/vagrant
でアクセス可能ですね。
ブラウザ経由でアクセスして次のコマンドを叩いてやりましょう。
LOAD CSV WITH HEADERS FROM "file:///vagrant/nodes.csv" AS csvLine CREATE (n:Person {id: toInt(csvLine.id), name: csvLine.name})
LOAD CSV WITH HEADERS FROM "file:///vagrant/edges.csv" AS csvLine MATCH (m:Person), (n:Person) WHERE m.name = csvLine.start AND n.name = csvLine.end CREATE (m)-[r:FRIEND {weight: toFloat(csvLine.weight)}]->(n)
データのインポートには結構メモリを食うようで、vagrantのデフォルトで割り当てられているメモリ(300Mぐらいだったか?)だと「ヒープが溢れたよ」ってエラーになって成功しません。カッとなってVagrantfileを書き換えて2G割り当てたら成功しました。
正常に読み込めたか確認する
MATCH (n) RETURN COUNT(n)
MATCH ()-[r]->() RETURN COUNT(r)
せっかくだから次数中心性を出してみる
MATCH (node)-[r:FRIEND]-() RETURN node, count(r) AS degree ORDER BY degree DESC LIMIT 100
次回
次数中心性だけじゃなくて近接中心性や媒介中心性も出してみる
Neo4jをはじめよう - (1) インストール
最近グラフDBが流行の気配を見せているような気がします。ということでNeo4jで遊んでみようと思いますが、まずは環境構築からですね。
今どき遊び用とは言えローカルマシンに素でDB入れるのは抵抗があるので、VagrantでUbuntu14の仮想マシンを作ってそこに入れます。
仮想マシンの構築
Vagrant自体のセットアップは省略します。Vagrantfileは最低限の設定のみで、こんな感じ。
# -*- mode: ruby -*- # vi: set ft=ruby : VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/trusty64" config.vm.network :private_network, ip:"192.168.33.11" end
ネットワーク経由でNeo4jにアクセスするので、private_network
を設定する必要があります。アドレスは適当に。
Vagrantfileが書けたらうpしましょう。
$ vagrant up
Neo4jのインストール
まずはVMに入る。
$ vagrant ssh
ここから先はVM内で叩くコマンド。
# レポジトリを追加 $ wget -O - http://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add - $ sudo sh -c "echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list" # パッケージリストを更新してインストール $ sudo apt-get update $ sudo apt-get install neo4j
ホストOSからもアクセスできるように設定変更
これでNeo4jはインストールできましたが、デフォルトではlocalhostからのアクセスしか受け付けません。
VMではなくホストOSからブラウザや各言語のクライアントライブラリからアクセスするにはリモートからの接続を許可する必要があります。
当たり前ですが本番で何も考えずにリモートアクセスを許可すると大変なことになります。あくまでVMに入れて遊ぶ用の設定ということで。
$ sudo vim /etc/neo4j/neo4j-server.properties # 下記の行をコメントアウト org.neo4j.server.webserver.address=0.0.0.0 $ sudo service neo4j-service restart
アクセスできるか確認する
これで、VMに入らずとも手許のブラウザから接続できるようになりました。
お使いのブラウザを開いて http://192.168.33.11:7474/
と叩いてみましょう。
こんな画面が出れば成功です。
次回
2015年も1/6が過ぎた
年の初めに目標みたいなのを決めた気がする
2014年のふりかえり&2015年にやること - ふゆみけ〜おかわり〜
いちいち達成できてるかチェックするような意識の高いことはしないが、放置しておくのも気持ち悪い。 基本的な方向性は変わってないが、最近やりたいことが多すぎて発散してきたのでまとめる
- 統計/機械学習
- プログラミング
- データベース
- ↑と同じ理由でちゃんと設計できるようになりたい
- ちょうどいい本が出たので、読む
- これとは関係ないが、Neo4jがそろそろブームになりそうな気配
- 勉強し直すか
- 記事10本ぐらい上げたい
- 関連して、グラフ理論やSNAにも手を広げたい
こんなところでいかがでしょうか
3/1追記
プログラミングの基礎をざっと見たところ、以前読んだプログラミングHaskellとかぶってる内容が多そうだった。 だからもうSICP読み始めちゃってよさそう
『Java言語で学ぶデザインパターン入門』を読んだ&Pythonで書いてみた
リアクティブプログラミングが流行ってるみたいだからちょっとやってみるか、と調べてみたら、Observerパターンとかいうのが出てきた。でもデザインパターンとかわからん\(^o^)/
というわけで読んでみた。ただ読むだけだとつまらないので、JavaのサンプルコードをPythonで書いてみた。
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (400件) を見る
PythonのコードはGitHubに上げてあるので、興味のある方はどうぞ。
who-you-me/design_pattern · GitHub
読んでみて、Pythonで書いてみて感じたこと
外から叩けるメソッドはできるだけ少なくして、意図しない操作をされるのを防ぐべきだよ! みたいなことが何度も書かれていたけど、Pythonだとそこを意識することはあまりない。というか、メソッドや変数のアクセス権についてあまり気を配っていない(少なくとも入門書のレベルでは)ように感じる。
そこはまあ、Pythonに限ったことじゃなくて動的言語全般にある程度共通していることで、「大規模でメンバーの技量がバラバラなプロジェクト/プロダクトは静的言語がよい」「少数精鋭でスピードが重要な場合は動的言語がよい」みたいなことが言われる背景でもあるんだろう。
「コードの一部への変更が他の部分に意図しない影響を及ぼす」のに対処する必要があるけど、静的言語の場合は型に守られてるから安全、一方で動的言語の場合はテスト書いてカバーする必要がある、という区別にも繋がってくる。
なんて、いろいろ思うことはあるけど、名著だけあって身になることが多かった。軽く列挙。
- 当たり前だけど、クラスの設計って超大事
- 普段フレークワークを使ってWeb開発してるばかりだと、実はあまり気付かない
- パターンがたくさんあって、複雑なものもあり覚えるのは難しいけど、こんなのがあるって知るだけでも役立ちそう
- 何か設計上の問題にぶち当たったとき「あれ、そういえばこんなデザインパターンがあったような…」と気付いて調べられるかどうかでものすごい違い
- Pythonでちゃんとオブジェクト指向やるためのもろもろがわかった
- これは本のおかげというよりは、自分で書いてみたからだけどw
- Python2.6からabcモジュールが追加されて抽象クラスが作れるようになった
技術的負債が溜まりに溜まったコードとお付き合いすることが多いこともあって、最近は最先端技術を追っかけるよりも、「ちゃんとした設計でものを作る」ことに興味が移りつつある。
特にデータモデリングの重要性なんかは痛感しつつあるので、次はこれとかを読みたい。
理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus)
- 作者: 奥野幹也
- 出版社/メーカー: 技術評論社
- 発売日: 2015/02/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
久し振りにDjangoを触ってみたらやっぱり便利そうだった件
某緑のところの承認欲求ゲームには関わりたくないので、こういう感想めいたものは誰も見てないはてなブログの方に書きます。
一応周りにはPythonの人として認知されてるのに、最近Pythonに関わることを何もしてないことに危機感を抱き、Djangoのチュートリアルを久し振りにやってみました。
https://docs.djangoproject.com/en/1.7/intro/tutorial01/
学生の頃バイトでちょっとしたWebアプリを作った以来で、確か2011年ぐらいのことなので当時はまだバージョン1.2か1.3だったと思います。
それが今では1.7までバージョン進んだということで、いろいろ進化してますね。
相変わらずadminページが素晴らしい
「ユーザーに何も価値を産まない管理ページにコストかけるのもったいないから、フレームワークの機能で用意してるよ」って精神が素晴らしすぎる。
もちろん管理ページから操作できるモデル、フィールドは指定できるし、表示形式なんかもほとんどコードを書かずに変更できるのは、実運用を考えると大きなメリット。
Migrationができた
以前はsyncdbコマンドでモデルとDBを同期してたけど、Rails式のMigrationが1.7からついに導入された模様。
「すべてをコードで管理する」のは今の時代に欠かせないですよね。
チュートリアルにテストの章がある
これ重要。上で挙げたチュートリアルページにわざわざ1章設けてテストの項目がある。
しかも前半がテストの書き方とかじゃなくて「何でテストの項目があるんだよいらねーよとか思ってるだろけど、まともな規模の開発しようと思ってたら必須だろ」みたいな説明が延々となされてる辺りがPythonista的で実にいい。
それどころか「テスト書かれてないアプリに対して徐々にテスト書いてくにはどうすればいいか」とかにまで言及されてて、もはやWebアプリケーションフレームワークのチュートリアルではないw
便利機能が増えてる
チュートリアルで目に付いたのはget_object_or_404
。その名の通り指定した条件のオブジェクトが見つかればそのオブジェクトを返して、見つからなければ404エラーを吐いてくれる。
これって実はtry - exceptをいちいち書かなくていいだけじゃなくて、詳細ページを作るときに「URLからid取ってobjectをgetしてtemplateに渡す」だけでよくなる。
「んなわけないだろ。いろいろデータ操作してからtemplateに渡す必要あるだろ」というのは間違いで、そんなややこしい操作はモデルのメソッドとして実装すべきという規則をある意味強制してくれるのがすごくいい。
最後に
うーん、やっぱりお仕事で使ってるCakeちゃんが相当ダメな子な気がしてきた。
いや別に管理ページないのは普通だしMigrationやテストもある(デフォルトで入ってなくてライブラリ入れる必要あるのはご愛嬌)けど、やっぱりモデルが糞すぎる。モデルでfindするとオブジェクトじゃなくて配列で返ってくるとか、こんなの絶対おかしいよ。
2014年のふりかえり&2015年にやること
大晦日ですが連合赤軍には所属していないので総括とかはしません
— 小4の冬見 (@who_you_me) 2014, 12月 31
見事にスベったのでやっぱりやります。
2014年にやったこと、起こったこと
転職した
1年前は新人ネットワークエンジニアでしたが、あまり向いてなかったようでちょっとアレな感じになっていたので転職しました。
大手ISPのネットワークエンジニアから小規模ベンチャーのWebエンジニア(という名のなんでも屋)へのジョブチェンジです。 こっそり記事になってたりするのは内緒です。
今の会社に入ってからはコードをガリガリ書いたり、スクラムっぽいやり方を導入したりと割と好き放題できてるので、転職してよかったですね。
かいた
Qiitaにいろいろ書いてる http://qiita.com/who_you_me
あと会社の技術ブログも書いてる http://blog.howtelevision.co.jp/
2014年はQiitaに9つ、会社のブログに4つの合計13個上げたらしい。 そのうちQiitaで100ストック超えたのと、ブログで100ブクマ超えたのが1つずつあるので個人的には悪くない感じ。
発表した
一番上のPythonの開発環境のやつは何故かバズって180ブクマぐらいついた。 ハイライトはPHPカンファレンスでしゃべったことかな。懇親会で「あの発表面白かったですね」と話しかけられるのはうれしい。
あとは小規模な読書会で担当したりもしてる。
使えるようになった
- PHP
- CakePHP
- fluentd
- Vagrant
- Chef
- Capistrano
- (Docker)
Docker以外は業務でバリバリ扱ってるので「使えます!」と言っていいレベルにはなってるはず。
Webに必要なDevOps系ツールはだいたい網羅したか。ただAnsibleとかFabricとかのPython系ツールにはほとんど触れてないのが残念なところ。
会社で使ってるCakePHPにはだいぶ詳しくなってきた(てか、ドキュメントが不十分でライブラリのコード直接読んでばっか)けども、あまり嬉しいことではないかなw Djangoに詳しくなりたいです。
あと一応ElasticsearchとかBigQueryとかも導入したけど、全然使いこなせてないのでこれは2015年の課題。
ほか
統計検定の2級に合格した。
2015年にやりたいこと
アウトプット
2014年のペースで問題ないかな。 月一ぐらいでなんか書いて、2〜3ヶ月に一回どっかで話すぐらいのペース。 PyConあたりで話せるといいけど、なんかネタないですかね。
勉強会とかで自分の属してるコミュニティはどこかっていうと、間違いなくデータ分析系なんだけど、2015年はWeb系にも足を伸ばしたいところ。
「お前らDevOpsとかはしゃいでるけど、素晴らしい基盤の上に糞みたいなコード載せたら残念すぎるだろ」ってことで、Effective Java的な重厚長大な本をちゃんと読む会とかやりたい。
技術
Webの最新動向についてくのは必須。 Dockerは今の会社だと直近で使うような感じでもないので、しばらくは様子見とくだけでもいいかな(正直動向が早すぎるから全部ついてくのがキツい)。 Reactiveの時代になるらしいのでとりあえずこれとか触ってみましょうかね。
Web全般の技術を網羅するのは当然だけど、フルスタックという名の器用貧乏になりたくもないので何か専門を持ちたいところ。 グラフDBがついに流行る気配を見せつつある(と勝手に思ってる)ので、Neo4jをもう一回ちゃんとやってみようかな。
あと言語。毎年1言語習得するというのはプログラマ共通の目標だけど、2014年は結果的にPHPだったという何とも残念な結果に。 ゆるふわスクリプト言語しかちゃんと書けないのを脱するためには、やはりScalaですかね。Play Frameworkで何か作ってみましょうか。
ほか
統計検定1級に合格しないとプギャーされるのでがんばる。