私の情報収集術

諸事情により長い夏休みだったので、情報収集のやり方をちょびっと洗練してみた。

f:id:fuyumi3:20150816224631p:plain

目的

普段TwitterのTLを追ってるだけでも、Web業界/データ分析業界の動向はだいたい掴める。

それとはてブのトップ見てればだいたいの情報は入ってくるんだけど、いずれにせよ読みっぱなしだと「あれ、どっかで読んだ気がするけど思い出せない…」になりそうなので、役に立つ/面白いと思った情報はストックしておきたい。

プラスして、仕事に関係あること以外でも、政治経済社会スポーツエンタメその他広くアンテナ張っときたいよね。新聞とか取ってないし。

最後におまけで、読んだページをTwitterに流しておけばひょっとすると人の役に立つかも知れない。

情報収集源

  1. Presso
    • はてな村民なので、キュレーション系ではPressoが一番しっくりくる。
  2. RSS
    • 固定で追っかけたいブログやサイトはRSS登録

情報の集約

PressoとRSSリーダfeedly使ってる)個別で読んでると情報が分散されてしまう。やはり情報は一元管理したいよね。

ってことでPocketを使うことに。

Pressoの記事リスト画面にはワンタップで「あとで読む」タグをつけてブクマできる機能がるので、iftttを使ってこれをPocketに流すように設定。

feedlyiPhoneアプリには直接Pocketに送る機能があるので、これを使う。

こうすることで、電車の中とかでPressoとfeedlyのアプリを開いて、興味ある記事をぽちぽちっとするとPocketに保存できるように。

読む

Pocketで読む。ただひたすら読む。

出先でスマホで読んでもいいし、家でPCやタブレットでじっくり読んでもいい。クラウド万歳。

シェア()する

読んでこれ面白いなーと思ったら、Pocket上でスターを付ける。ここでまたiftttを使って、スターをつけた記事をTwitterに流すようにしておく。

これで人力キュレーションメディアの出来上がり。

まとめると冒頭の画像になる。

問題点

いろいろある

  • あとで読む」でブクマした記事がPocketに反映されるのに時間がかかる
  • あとで読む」だけのブクマが大量発生する。コメント付きのブクマがしづらい
  • Twitterに流れるのはタイトルとリンクだけで、自分のコメントとかはつけられない

問題はあるが、現状それなりに機能してるのでしばらくはこのままでいこうと思う。

Neo4jをはじめよう - (2) データを投入する

Neo4jをはじめよう - (1) インストール - ふゆみけ〜おかわり〜

の続き

前回の最後で「Twitterのデータを投入!」とか息巻いてましたが、API制限キツくて色々めんどくさいのでここはSNA(社会ネットワーク分析)用のサンプルデータを使うことにします。

「SNAって何やねん」って人はこのエントリでも見ればいいんじゃないでしょうか。

d.hatena.ne.jp

使用するデータ

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形式に変換してやります。

gistcdd6b2ee69af071e76d9

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)

f:id:fuyumi3:20150423175015p:plain

MATCH ()-[r]->() RETURN COUNT(r)

f:id:fuyumi3:20150423175126p:plain

せっかくだから次数中心性を出してみる

MATCH (node)-[r:FRIEND]-() RETURN node, count(r) AS degree ORDER BY degree DESC LIMIT 100

f:id:fuyumi3:20150423175758p:plain

次回

次数中心性だけじゃなくて近接中心性や媒介中心性も出してみる

*1:Wikipediaでは「インターネットユーザーがブログ、記事(ジャーナル)、日記を掲載し保持できる仮想共同体の一種」と説明されており、つまりどういうことだってばよ

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/ と叩いてみましょう。

こんな画面が出れば成功です。

f:id:fuyumi3:20150324004650p:plain

次回

PythonクライアントからNeo4jにアクセスし、Twitterのデータを投入してみます。

2015年も1/6が過ぎた

年の初めに目標みたいなのを決めた気がする

2014年のふりかえり&2015年にやること - ふゆみけ〜おかわり〜

いちいち達成できてるかチェックするような意識の高いことはしないが、放置しておくのも気持ち悪い。 基本的な方向性は変わってないが、最近やりたいことが多すぎて発散してきたのでまとめる

  • 統計/機械学習
    • 統プギャ四天王の一角として、統計検定【準】一級に合格する
    • 一級は無理ゲーの予感がプンプンする
      • (試験形式変わったので、統計基礎合格に)切り替えていく
    • 計算力の低さを感じるので、学部レベルの微積線形代数を解きまくる
  • プログラミング
    • 設計の練られた美しいコードを書きたい熱の高まりを感じる
    • 名著を読みたい
    • SICPしかあるまい
      • 今はPythonで教えられてるらしく、テキストも公開されている(もちろん英語だが)
      • でもPythonでやっても自分にとっては旨味がない
      • なのでLISPでよし
      • 読書会やるか
    • いきなりSICPはキツイので、まずはこれを読むのがいいらしい
  • データベース

こんなところでいかがでしょうか


3/1追記

プログラミングの基礎をざっと見たところ、以前読んだプログラミングHaskellとかぶってる内容が多そうだった。 だからもうSICP読み始めちゃってよさそう

『Java言語で学ぶデザインパターン入門』を読んだ&Pythonで書いてみた

リアクティブプログラミングが流行ってるみたいだからちょっとやってみるか、と調べてみたら、Observerパターンとかいうのが出てきた。でもデザインパターンとかわからん\(^o^)/

というわけで読んでみた。ただ読むだけだとつまらないので、JavaのサンプルコードをPythonで書いてみた。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

PythonのコードはGitHubに上げてあるので、興味のある方はどうぞ。

who-you-me/design_pattern · GitHub

読んでみて、Pythonで書いてみて感じたこと

外から叩けるメソッドはできるだけ少なくして、意図しない操作をされるのを防ぐべきだよ! みたいなことが何度も書かれていたけど、Pythonだとそこを意識することはあまりない。というか、メソッドや変数のアクセス権についてあまり気を配っていない(少なくとも入門書のレベルでは)ように感じる。

そこはまあ、Pythonに限ったことじゃなくて動的言語全般にある程度共通していることで、「大規模でメンバーの技量がバラバラなプロジェクト/プロダクトは静的言語がよい」「少数精鋭でスピードが重要な場合は動的言語がよい」みたいなことが言われる背景でもあるんだろう。

「コードの一部への変更が他の部分に意図しない影響を及ぼす」のに対処する必要があるけど、静的言語の場合は型に守られてるから安全、一方で動的言語の場合はテスト書いてカバーする必要がある、という区別にも繋がってくる。

なんて、いろいろ思うことはあるけど、名著だけあって身になることが多かった。軽く列挙。

  • 当たり前だけど、クラスの設計って超大事
    • 普段フレークワークを使ってWeb開発してるばかりだと、実はあまり気付かない
  • パターンがたくさんあって、複雑なものもあり覚えるのは難しいけど、こんなのがあるって知るだけでも役立ちそう
    • 何か設計上の問題にぶち当たったとき「あれ、そういえばこんなデザインパターンがあったような…」と気付いて調べられるかどうかでものすごい違い
  • Pythonでちゃんとオブジェクト指向やるためのもろもろがわかった
    • これは本のおかげというよりは、自分で書いてみたからだけどw
    • Python2.6からabcモジュールが追加されて抽象クラスが作れるようになった

技術的負債が溜まりに溜まったコードとお付き合いすることが多いこともあって、最近は最先端技術を追っかけるよりも、「ちゃんとした設計でものを作る」ことに興味が移りつつある。

特にデータモデリングの重要性なんかは痛感しつつあるので、次はこれとかを読みたい。

久し振りに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年にやること

見事にスベったのでやっぱりやります。

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カンファレンスでしゃべったことかな。懇親会で「あの発表面白かったですね」と話しかけられるのはうれしい。

あとは小規模な読書会で担当したりもしてる。

使えるようになった

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級に合格しないとプギャーされるのでがんばる。