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

*iroi*

mechairoi の Blog

Wikipedia の作り方 / How to make Wikipedia

こんにちは。アプリケーションエンジニアの id:mechairoi です。
この記事は はてなエンジニアアドベントカレンダー2014 の10日目です。
昨日は id:hatz48 さんの Mackerel と fluentd でサービスの状態を可視化する - Hatena Developer Blog でした。


今日は Wikipedia の作り方について紹介します。

完成イメージ

http://en.wikipedia.org/wiki/Logo_of_Wikipedia#mediaviewer/File:Wikipedia-logo-v2.svg

必要なもの

  • プリンタ、 白の塗料、 セロテープ、 やわらかい鉛筆、 はさみ、のり、お休みの日

作り方

なんとたった7ステップで完成です。

1. くっつける

450mmの半球が届くと想像より大きくてテンションがあがってしまいますが落ち着きます。輪っかにしたセロテープで2つの半球を貼りあわせて球にします。あとで剥がすのでさらっと貼るとよいでしょう。

2. 補助線をひく

くっつけた球にやわらかい鉛筆で補助線をひきます。

f:id:mechairoi:20141210014124j:plain

Wikimedia official marks/About the official Marks - Wikimedia Foundation のいろんな方向からみたWikipediaの様子が参考になります。

f:id:mechairoi:20141210114142j:plain

「W」と「И」の間を通っている線(上図の赤線)が赤道だとすると、南極と北極を結ぶ線を等間隔に10本ひいてから、赤道に平行な線を北半球と南半球に3本づつひきましょう。半球のつなぎ目(上図の青線)と赤道を直交させるとよいでしょう。

やわらかいメジャーやIKEAでもらえる紙の定規があると捗ります。

3. 下書き

スチロールカッターで切断する線を下書きします。

f:id:mechairoi:20141210014128j:plain

ステップ2と同じように Wikimedia official marks/About the official Marks - Wikimedia Foundation をみながら手で雑に書いていきます。ついでにピースに対応する文字も書いておきます。リンク先は各方向から見た様子と展開後とで文字の配置が微妙の異なるので嵌らないように気をつけましょう。

もちろんピースが無いところは自由に想像を膨らませて書きます。

4. スチロールカッターで切る

仮止めしたセロテープを剥がし、スチロールカッターで切ります。

f:id:mechairoi:20141210014132j:plain

一定のペースでカッターを動かすとなめらかに仕上がります。下書きから多少ずれても問題ありません。球の中心から出るレーザーで切るようなイメージでカッターを動かすとやりやすいかもしれません。スチロールの厚みでピースの噛み合わせがうまくいかないところもあるので断面の内側を削って調整します。削り過ぎると安定しなくなるのでほどほどに。半球の境界と重なったピースはセロテープでくっつけます。

ここまでくればパズルを組み立てて遊ぶのもよいでしょう。

f:id:mechairoi:20141210014136j:plain

5. 白く塗る

下書きで汚れたピースの表面を塗料で白く塗って綺麗にします。塗る前にピースの裏に対応する文字を書いておくと後で楽です。

f:id:mechairoi:20141210014140j:plain

6. 文字を入れる

Wikimedia official marks/About the official Marks - Wikimedia Foundation にある文字のSVGInkscape とかで適当に並べて印刷します。印刷した文字をはさみで切ってのりで浮かないように貼ります。文字のまわりに白い部分が残ってもほとんど目立たないのでシュッとやるとよいでしょう。

7. 装う

かぶって仮装パーティに向かうもよし、分解してコンパクトなまま持ち込んで現地で組み立てるもよしです。お気に入りのTシャツとコーディネートするのもオススメです。

f:id:mechairoi:20141031105523j:plain

おわりに

はてなでは、パーティを一緒に盛り上げてくれる方やScalaエンジニアも募集しています。

Wikipedia への寄付もお願いします。

Ways to Give - Wikimedia Foundation

明日は id:shimobayashi さんの予定です。よろしくお願いします!

追記

Wikipedia の作り方 - *iroi*

塗装の塗料なにつかったんだろう。ポスカ?

2014/12/10 13:40

最初は

のマット ホワイトつや消しでやってたんですが、量が足りなかったので2年前に使った

の残りを使いました!

emacs から git-browse-remote で GitHub をいい感じにひらく

emacs git

カーソル位置とかリージョンで選んだ範囲をブラウザで開けるやつです。
C-u つけると --rev になるのがおしゃれポイントです。
以上です。

参考


git-browse-remote 0.1.0 を公開しました & Vim からいい感じに GitHub を開く - 詩と創作・思索のひろば (Poetry, Writing and Contemplation)

emacs


GitHubでの仕事を快適にするコマンドを紹介します - $shibayu36->blog;

と同じような機能です。

Scala use cases at Hatena という発表をしました。#ScalaMatsuri

はてなで最近作っているMackerel


Calling for Beta Testers! Mackerel: A Revolutionary New Kind of Application Performance Management

の開発には Scala を使ってます。
発表では Mackerel で使ってるライブラリとか開発フローとかPerlから変わったこととか紹介しました。
Scala 関係ない話でも大丈夫ですので、まだ会場にいる方はぜひ声をかけてください!


Perl に戻れないとか書いてますが 個人の意見ですのでよろしくおねがいします。

ghq get しつつ cd する

zsh

雑な zsh function. .zshrc

function gc () {
    cd $(ghq get $1 | tee -a /dev/stderr | tail -n 1 | awk '{ print $NF }')
}

Slick の lifted embedding で FOR UPDATE する

scala

mechairoi/slick-for-update-sample · GitHub

Slcik の lifted embedding で 無理やり FOR UPDATE できようにするサンプル

slick-for-update-sample/Driver.scala at master · mechairoi/slick-for-update-sample · GitHub

みたいに PostgresDriver を継承した MyPostgresDriver を作って,

  import MyPostgresDriver.simple._

  class CoffeesForUpdate(tag: Tag) extends Coffees(tag) with ForUpdateTable
  val coffeesForUpdate = TableQuery[CoffeesForUpdate]
  val q = for {
   c <- coffeesForUpdate if c.price < 9.0
    s <- suppliers if s.id === c.supID
  } yield (c.name, s.name)
  q.list

のように書くと

 select x2."COF_NAME", x3."SUP_NAME" from "COFFEES" x2, "SUPPLIERS" x3 where (x2."PRICE" < 9.0) and (x3."SUP_ID" = x2."SUP_ID") for update of x2

みたいにちゃんとFOR UPDATE するクエリが吐かれる。
FOR UPDATEDBMS によって文法が結構違うのでリポジトリのは PostgreSQL でしか使えない。

Docker を使って Haskell を Heroku の cedar stack 用にコンパイルする

Heroku で Haskell を動かす方法は http://daimatz.hateblo.jp/entry/2013/02/09/164531 のように buildpack を使うとデプロイ時に Heroku のホストでビルドできて便利です。しかしビルド時間が15分までで Yesod などを使っていると間に合わず、手元で Ubuntu 10.04 向けのバイナリを作って push などする必要があります。Ubuntu 10.04 で開発してる人はもうあまりいないと思いますので、最近流行っている Docker を使って cedar stack 向けにビルドできるようにしてみました。

ビルドに使う Docker image は cedar 用のものに ghc と cabal-install をインストールして作りました。

サンプルプロジェクトは

にあります。デプロイするには READMEに書いてある通り、docker とか heroku コマンドをインストールして、リポジトリをクローンして

git clone https://github.com/mechairoi/docker-heroku-cedar-ghc.git

Heroku の アプリケーションを作って、

heroku create --stack=cedar

ビルドしてpush すれば

make build
git checkout -b deploy
git add -f dist/build/heroku-haskell/heroku-haskell
git commit -m "build"
git push heroku deploy:master

デプロイできると思います。Yesod でも deploy/Procfile に従って package.json などを配置して Makefile を修正すれば動くはずです。

make build の中身は

sudo docker run -v ${PWD}:/workspace -t mechairoi/heroku-cedar-ghc /bin/bash -xc 'cd /workspace/ \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config sandbox --sandbox=/workspace/.heroku-cabal-sandbox init \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config install --dependencies-only \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config configure \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config build --builddir=./dist-heroku \
	  && strip --strip-unneeded ./dist-heroku/build/heroku-haskell/heroku-haskell'

のようになっていて、Docker のホスト側をマウントして cabal sandbox を作ってるので2回目からはパッケージのダウンロードもなくビルドできます。Vagrant と違って起動も早いし Docker 便利ですね。

kyoto.js #5 で Emacs から WebSocket で Google Chrome を操作する拡張について発表しました。 #kyotojs

emacs

先日開催された Kyoto.js #5 で LT をしてきました.

crxel

Emacs から Google Chrome を操作する crxel というライブラリを作っているので発表しました. 今回の発表ではこのライブラリを使ったデモとして

を紹介しました. google-eldoc.el は全く役に立たないのですが, Emacs の操作にフックして Google Chrome を操作できると何か便利なことができそうな気がしています.

Motivation

Emacs には既に swank-js という Emacs から javascript の repl などが使えて javascript を使ったページを便利に開発できるものがあります. これは node.js で立てた WebSocket サーバに, ページ中の javascript から接続しておいて, Emacs から node.js のプロセスに送信した文字列をページ内で eval することで実現しています.

今回作った crxel もほぼ同じ仕組みで, javscript の コードはほとんど swank-js から流用させてもらっています. crxel は Emacs で直接 WebSocket サーバを立てている点と, Emacs から Google Chrome を操作することを目的にしている点が swank-js と異なっています.