第一回 納涼もんご祭りに参加しました

参加したセッション

  • 大手SIerが語る!MongoDBの位置づけとユースケース
  • 実演!MongoDB障害運用
  • 丸の内MongoDB勉強会 in 納涼もんご祭り

話を聞いた・パンフ貰ったブース

  • 「さくらのクラウド」デモ
  • ソーラーパネル、どこへ置く?
  • もんごの薄い本
  • CodeIQ
  • co-meetingのご紹介

MongoDBについての感想

  1. アプリケーションを作るのに便利な機能が備わっている
    • 特に、地理空間インデックスはハマれば強そう
  2. レプリケーション・シャーディングが簡単そう
  3. スキーマレス
    • migrationが不要なのはいいけど、管理が難しそう
  4. SQLライクな動的クエリが便利そう
    • ただし、性能はどのぐらい?オンラインの取得に使えるレベル?
  5. トランザクションが無いので、割り切りが必要
    • ミッションクリティカルな分野では使えない
  6. 書き込み性能より読み込み性能を重視している
  7. 普通に運用しようと思ったら、3台必要なのかな。。。
    • WEBサーバにセカンダリ・プライマリサーバ・hiddenなセカンダリサーバ ってのが事実上の最小構成?


あれ、そういえば、参加受付ってどこにあったの・・・?

ふつうのエンジニアの情報収集法

会社の後輩に、どーやってそういう(エンジニア的な)情報を集めてるのか聞かれたので、
自分の中での整理のためにも書いてみる。

下準備

Twitterで、それ系の発言をしている人をフォローする。

  • twitter内を知りたい単語で検索してみる(ex. java, ruby, vagrant …)

 →そこで発言している人たちをフォローしていく

 http://tagamidaiki.com/tech-twitter10/ とか出てくるので、気になったらフォロー。

  • twitterがおすすめユーザを表示してくれる

 https://twitter.com/who_to_follow/suggestions


後述するサービスでリンクを集めてくれるため、URLを含んでつぶやいている人多めの方がよいと思います。
数百人レベルでフォローしちゃえばいいと思います。
ただ、タイムラインは読めたものではなくなる(流速的に)と思います。

はてなブックマーク - マイホットエントリー

http://b.hatena.ne.jp/
http://bookmark.hatenastaff.com/entry/2013/05/08/131308
はてなのIDと、TwitterFacebookを連携させる。
朝9時(通勤時間前)にメールを送信するようにする。
→電車の中とか、会社着いてから読む
→一通り読んだらメールを削除(未読・既読管理)
→あとで利用できそうな内容だったら、はてブでブックマークしておく(Twitter連携もしておくと、それ系のフォロワーが増えるかも)


物足りなかったら、「テクノロジー」タブを眺める。

Gunosy

http://gunosy.com/
FacebookTwitter・はてなのアカウントと連携させる。
「日々のまとめメールを配信する」にはチェックを入れておく。
→一通り読んだらメールを削除(未読・既読管理)
リンクを踏んだものを学習してくれるようなので、気になったものだけリンクを踏む。
昼休みに読む。

Pocket

http://getpocket.com/
はてな・Gunosyで気になったけど、そのとき時間がなくて読めないものを突っ込んでおく。
Read It Nowhttps://play.google.com/store/apps/details?id=hm.orz.chaos114.android.readitnow&hl=ja)にて、
state = unread
sort = oldest
ウィジェットを作って、読み終わったら delete or archive しておく。
ウィジェットに表示される数字を0に保つ気概で)

RSS

上記で様々なサイトを見ていく中で、自分の興味ある分野の記事を多数書いている人がいれば、RSSを配信していないか調べる。
配信している場合、RSSリーダーに突っ込み、新着を読む。
自分の場合は、RocketSShttp://rsspocket.appspot.com/ )にRSSのURLを突っ込んで、自動的にPocketに保存されるようにしている。

その他(暇な時)

電子書籍

一つの言語・フレームワークなどの一通りの情報を抑えたかったら、本を読むのは手っ取り早いと思う。
電子書籍なら、タブレット(AQUOS PAD)一台で、何冊でも持ち歩けるので便利。

(Advent Calendar以外にめぼしいものは無いかも。。。)


※実話ですが、ステマでもありますw

rbenvをインストール

環境:Mac OS X 10.8.4

rvmの削除

まず、rvmが入っていたので、それを削除した。

rvm seppuku

.bashrc、.bash_profileにrvmの設定が入っていたので、削除。

rbenvのインストール

基本、下記の通り。
https://github.com/sstephenson/rbenv

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

その後、書いてある通り、ruby-buildを入れる。
https://github.com/sstephenson/ruby-build
ちなみに、入ってないと、rbenv installってやっても

rbenv: no such command `install'

てエラーが出る。

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

これで、下記のコマンドが実行できる

rbenv install -l

2.0.0-p247 ってのがあったので、それをインストールする。

rbenv install 2.0.0-p247
rbenv rehash
rbenv global 2.0.0-p247


下記も参考にしました。
http://rochefort.hatenablog.com/entry/20121015/p1
http://qiita.com/sifue/items/b7d252b18ebbae636fa9

RocketSSにサービス名を変更しました

昨日、一応のリリースをした「Rss to Pocket」ですが、さっそくサービス名を変更しました。
新しくは「RocketSS」になります。
(ドメインは面倒なので変更しません。。。)
http://rsspocket.appspot.com/


会社で話してたら、そのまま過ぎるというdisりと、RSS+Pocketでろけっとでいいんじゃない?という話が出たので、ほぼ採用。
Rocketだと検索に引っかかりづらそうだったので、余った"SS"を後ろに付けてみて、RocketSSに落ち着きました。
サービス名は、さすがにもう変えないと思います。多分。


使い方について、Facebookで聞かれたので、
http://rsspocket.appspot.com/home
に手順を書いてみました。
時間があったら、スクリーンショットとか追加しようと思います。

で、すっかり忘れていた、Read It Nowへのリンクもついでに追加しました。
これでダウンロード数が伸びるといいなー。。。

Rss to PocketというWEBサービスを公開しました

Rss to Pocket
http://rsspocket.appspot.com/

出来ること

  1. RSSを登録しておくと、Pocketに自動的に記事が追加されます
  2. RSS毎に「タグ」を付けられるので、Pocket内で整理しやすい
  3. Google Readerからエクスポートしたファイルを読み込める

チュートリアル

  1. Googleのアカウントでログインします
  2. Pocketの認証を行います
  3. RSSを登録します
  4. あとは勝手にPocketに追加されていきます

雑記

本当は、Google Readerが停止する前に公開したかったんですが、気力が足りずに遅れてしまいました。
現状はタグの編集など、必須と言っていいぐらい機能すら実装出来てないので、随時更新していきます。

NeoBundleを有効にすると、シンタックスハイライトが無効になる

環境
Mac OS X 10.8.4
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Jun 20 2012 13:16:02)


最初は、下記のように書いていた。

syntax on

set nocompatible
if has('vim_starting')
   set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#rc(expand('~/.vim/bundle/'))


で、最終行をコメントアウトすると、シンタックスハイライトが有効になるのに、
最終行を有効にすると、色がつかない。


結論:syntax on を最後に持ってくる
下記のように変更したら、色がついた。

set nocompatible
if has('vim_starting')
   set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#rc(expand('~/.vim/bundle/'))

syntax on

Pocket APIのにて、タグのAND検索

AND検索はできる模様。


・やり方
tagパラメータを複数つける
https://getpocket.com/v3/get?consumer_key=XXXX&access_token=YYYY&tag=hoge&tag=fuga


上記により、"hoge"タグと、"fuga"タグの両方が設定された記事だけ取得できる。


OR検索のやり方は不明。

主キーを任意のカラムに変更する

slim3のデータクラスは、Keyクラスでなければならないようです。
https://sites.google.com/site/slim3documentja/documents/slim3-datastore/defining-data-classes

でも、ユーザの情報を格納するデータクラスはemailアドレスにしたいですし、emailアドレスで検索したいです。
いろいろやり方はあるようです。
http://d.hatena.ne.jp/higayasuo/20091111/1257905482
http://www.tdtsh.com/blog/archives/759
が、今回はユーザに紐づく情報(同一タイミングで別の更新が入ることを考慮しない)こともあり、てきとーに組んでみました。

package hm.orz.chaos114.gae.rsspocket.dao;

import hm.orz.chaos114.gae.rsspocket.model.UserInfo;

import java.util.List;
import java.util.concurrent.Future;

import org.slim3.datastore.DaoBase;
import org.slim3.datastore.Datastore;
import org.slim3.datastore.EntityNotFoundRuntimeException;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.users.User;

public class UserInfoDao extends DaoBase<UserInfo>{

    @Override
    public Key put(final UserInfo model) {
        setKeyIfNull(model);
        return super.put(model);
    }

    @Override
    public List<Key> put(final List<UserInfo> models) {
        // 利用しないため未実装
        throw new UnsupportedOperationException("未実装");
    }

    @Override
    public Future<Key> putAsync(final UserInfo model) {
        setKeyIfNull(model);
        return super.putAsync(model);
    }

    @Override
    public Future<List<Key>> putAsync(final List<UserInfo> models) {
        // 利用しないため未実装
        throw new UnsupportedOperationException("未実装");
    }

    /**
     * Userが一致するUserInfoオブジェクトを取得する。
     * 
     * @param user ユーザ情報
     * @return UserInfoオブジェクト
     */
    public UserInfo getByUser(final User user) {
        final Key key = createKey(user);
        try {
            return get(key);
        } catch (final EntityNotFoundRuntimeException e) {
            return null;
        }
    }

    /**
     * Keyが設定されていない場合は、設定されているUserからKeyを生成し、設定する。
     * 
     * @param userInfo ユーザ情報モデル
     */
    private void setKeyIfNull(final UserInfo userInfo) {
        if (userInfo.getKey() == null) {
            userInfo.setKey(createKey(userInfo.getUser()));
        }
    }

    private Key createKey(final User user) {
        return Datastore.createKey(UserInfo.class, user.getEmail());
    }
}

put系のメソッドをオーバーライドし、Userのemailより作成したKeyを設定しています。
また、getByUserにて、指定されたUserオブジェクトのemailよりKeyを作成し、取得しています。
(put系のListを引数にとるメソッドを利用する予定が無かったので、実行時に例外となるようにしてあります。使うことがあれば、実装する予定です。)


現在開発中のものより抜粋(https://github.com/noboru-i/rsspocket

Virtual BoxでJenkinsを動かす

前提:
Vagrant: 1.1.2 (公式サイトからダウンロード)
Chef: 11.4.0 (rubygemでインストール)
knife-solo: 0.3.0 (githubからcloneしてインストール)
Opscode Communityに登録済み・鍵を設定済み


※コンソールの出力結果を見ながら、思い出しながら書いているので、抜けがある可能性あり


※大問題:下記を実行後に、"vagrant halt"→"vagrant up"しても、Jenkinsにアクセス出来ない。
chefで実行されたが、起動時に実行していないことがある?


適当なフォルダでVagrant公式にあるスクリプトを実行

mkdir vm
cd vm
vagrant box add base http://files.vagrantup.com/lucid32.box
vagrant init


Vagrantファイルを少し修正し下記のようにする。(コメントアウト以外の箇所を抜粋)

Vagrant.configure("2") do |config|
  config.vm.box = "base"
  config.vm.network :private_network, ip: "192.168.50.11"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
end

やっていることは、
・先ほどダウンロードしたubuntu(baseとラベリング)を利用する
・固定IPを設定
・メモリ使用量を1024MByteに設定


VMを起動する。また、sshで入れるようにしておく(ここでは"vm"という名前を設定)

vagrant up
vagrant ssh-config --host vm >> ~/.ssh/config


Chefリポジトリを作成する。

knife solo init chef-repo
cd chef-repo
git init
git add .
git commit


vm上にchefを準備する。

knife solo prepare vm

nodes/vm.json が作成されるので、gitにcommitしておく。


jenkinsのcookbookを追加して、"run_list"に"jenkins"を追加し、実行する。(途中gitのcommitが複数回走るが、とりあえず全部":wq"でそのまま続行)

knife cookbook site vendor jenkins
vim nodes/vm.json
knife solo cook vm

エラーになる。

Cookbook apt not found. If you're loading apt from another cookbook, make sure you configure the dependency in your metadata

include_recipe "apt" ってところでエラーになってるっぽいので、"apt"を落としてくる。

knife cookbook site vendor apt

そのままやると、vm.jsonを変更しているので

You have uncommitted changes to your cookbook repo

といわれる。一旦変更を破棄して、再度実行する。(commit or stashしてもよい)

knife cookbook site vendor apt


無事、"apt"が取り込めたので、再度cook。

knife solo cook vm

再度エラー。

Cannot find a resource for apt_repository on ubuntu version 10.04

今度は、"apt_repository"というResourceが見つからないと言っている。
とりあえず、エラーメッセージでググり、 https://github.com/mdxp/nodejs-cookbook/issues/16 を見つける。
コミットログを見ると、"metadata.rb"に「depends "apt"」と追記しているみたい。やってみる。

cookbooks/jenkins/metadata.rb に1行追加

--- a/cookbooks/jenkins/metadata.rb
+++ b/cookbooks/jenkins/metadata.rb
@@ -5,5 +5,7 @@ description      "Installs and configures Jenkins CI server & slaves"
 long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
 version          "0.6.3"
 
+depends "apt"
+
 %w(runit java).each { |cb| depends cb }
 %w(iptables yum apt).each { |cb| recommends cb }


再度実行。

knife solo cook vm

やっと成功。
最初に決めたIPで8080ポートにアクセス。
http://192.168.50.11:8080/
Jenkinsおじさんが見えれば完了。


Vagrant, chef solo, knife soloなどを利用して、Jenkinsサーバが作れました。
普通に構築したことが無いので、比較は出来ないのですが、思ったより簡単に出来ました。(罠はありましたが)
dependsを記述する場所が間違っている気がしますが、ホントはどこに書くものなんでしょう。。。
あと、最初に書いた大問題(再起動後に見えない)はどうしたらいいやら。。。

gruntを"-g"でインストールしたのに"command not found"

ブログ記事などを参考に、npmよりgruntをインストールしようとしました。
gruntコマンドを使いたかったので、"-g"を付け、下記のように実行しました。

npm install -g grunt

で、"grunt"と実行しても、"-bash: grunt: command not found"と表示されてしまう。
sudoでやっても結果は同じ。


結論:公式ページを見ましょう。
http://gruntjs.com/getting-started を見ると、パッケージ名が変更されていたようです。
なので、一旦アンインストールし(sudoでやっちゃってたので、sudoで)、"grunt-cli"をインストール。

sudo npm uninstall -g grunt
npm install -g grunt-cli


gruntをインストールするように書かれているブログ記事も多いので、覚え書き。