ブログエディタBlogo

Blogoというブログエディタがあります。

以前試用した時には日本語入力で問題があったのでバグレポートを出したら、ベータテスターに誘われました。それでこの記事はバグ修正ベータ版で書いてます。

日本語入力のバグは修正されたようです。これで実用できそうです。

Raspberry Pi 2で外付けHDDを利用する

Raspberry Pi 2で外付けHDDを利用する。

パーティションの作成

USBポートにHDDを接続する。

pi@raspberry ~ $ sudo fdisk -l

を実行すると接続したHDDは/dev/sdaだと確認できたが、WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.という警告が表示されたのでgdiskをインストールして初期化する。


pi@raspberry ~ $ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.5

Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: present

Found valid MBR and GPT. Which do you want to use?
1 - MBR
2 - GPT
3 - Create blank GPT

Your answer: 2
Using GPT and creating fresh protective MBR.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-976773134, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-976773134, default = 976773134) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sda: 976773168 sectors, 465.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D595477B-ABF6-4B84-BF36-2BD97357CE4D
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 976773134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number Start (sector) End (sector) Size Code Name
1 2048 976773134 465.8 GiB 8300 Linux filesystem

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.

パーティションのフォーマット

パーティションをext4でフォーマットする。

pi@raspberry ~ $ sudo mkfs.ext4 /dev/sda1

マウント

マウントする。

pi@raspberry ~ $ sudo mkdir /workspace
pi@raspberry ~ $ sudo mount /dev/sda1 /workspace

自動でマウントするように設定する。/etc/fstabに以下を追記する。
/dev/sda1 /workspace ext4 defaults 0 0

Raspberry Pi 2のセットアップ

iOSアプリ開発時にWebサーバのテスト用サーバをRaspberry Pi 2で動作させるためにRaspberry Pi 2をセットアップする。

Raspberry Pi 2のセットアップ

OSのインストール

インストールの作業はMacで行った。

OSはRaspbianを利用する。RaspbianのイメージファイルのダウンロードはRaspbian公式サイトからでは遅いので、北陸先端科学技術大学院大学のミラーサイトからダウンロードする。ミラーサイトのraspbian-[日付]フォルダの最新のフォルダを選択して[日付]-raspbian-wheezy.zipをダウンロードする。

SDカードにダウンロードしたイメージを書き込むには、まずSDカードをMacに接続して、ディスクユーティリティでそれをFAT32(ディスクユーティリティではMS-DOS(FAT)と表示される)でフォーマットする。

メニューバーのAppleメニューから「この Mac について」を選択する。さらに「システムレポート…」を選択し、システムレポートが表示されたら「カードリーダー」を選択する。先ほど初期化したSDカードの「BSD 名」を調べる。disk[数字]の様なである。スクリーンショットではdisk4である。
Voila Capture 2015 08 16 08 16 30 午前

ディスクユーティリティでSDカードのパーティションをアンマウントする。SDカードはアンマウントしない。

ターミナルを開く。ダウンロードしたイメージのフォルダに移動して以下のコマンドを実行して、イメージをSDカードに書き込む。

sudo dd bs=1m if=2015-05-05-raspbian-wheezy.img of=/dev/rdisk4
ifにはダウンロードしたファイル名を指定し、ofのrdisk4は先ほど調べたdisk4の先頭にrをつけた名前にする。実行するとMac OS Xの管理者のパスワードの入力を求められるので入力する。しばらくすると書き込みが終わる。

ディスクユーティリティでSDカードをアンマウントしカードをMacから取り出す。

OSの初期設定

Raspberry Pi 2にSDカードを挿入して、キーボードとディスプレイを接続し、USBケーブルで電源に接続すると起動する。初回の起動ではRaspberry Pi Software Configuration Toolが表示される。

パーティションの拡張

初期設定ではSDカードのすべての領域を利用するようになっていないのでExpand Filesystemを選択してSDカードの全領域を認識するように設定する。

パスワードの変更

Change User Passwordでパスワードを変更しておく。

X Window Systemの起動

サーバ用途なのでX Window Systemを手動起動に変更するためにEnable Boot to Desktop/Scratchを選択して、Console Text console, requiring loginを選択する。(デフォルトでは選択してあった)

ロケール等の設定

Internationalisation Optionsを選択してChange TimezoneでAsia->Tokyoを選択する。日本語フォントがインストールされていないのでLocaleは変更しない。Keyboard Layoutは必要であれば変更する。

その他設定

Advanced Optionsを選択する。

  • Hostnameを選択してホスト名を入力する。初期設定はraspberrypiになっている。
  • SSHを選択してEnableにする。

これでConfiguration Toolでの設定は完了なのでFinishを選択する。

無線LAN子機の設定

BUFFALOのWLI-UC-GNMを利用してWiFiに接続する。

WLI-UC-GNMをRaspberry Pi 2のUSBポートに刺す。

/etc/wpa_supplicant/wpa_supplicant.confを編集して
network={
ssid="機器のSSID値"
psk="SSIDに対応する暗号化キー値"
}

を追記する。
sudo ifdown wlan0を実行して子機を停止させ、sudo ifup wlan0で再度起動する。

ifconfig wlan0でIPアドレスを確認する。

AtomでRustのAuto Completion

RustのAuto completionをAtomで行うにはracerを利用する。

racerをcloneして

cd racer; cargo build --release
cp target/release/racer /usr/local/bin/racer

を実行する。

Rust公式サイトからRustのソースコードをダウンロードして/usr/local/src/rust/srcに置く。そのパスをRUST_SRC_PATH環境変数に設定する。

Atomでlanguage-rustパッケージとracerパッケージを検索してインストールする。

RustをMacにインストールしてHello World

今話題の言語RustをMacにインストールしてみる。

インストール方法のページによるとpkgのインストーラかシェルでコマンドを打ってインストールする方法があるらしい。

その他Homebrewでもインストールできるようなので、Homebrewでインストールしてみる。

$ brew install rust

以下のコードをhello.rsファイルで作成する。

fn main() {
println!("Hello World!");
}

このファイルを以下のコマンドでコンパイルして実行する。

$ rustc hello.rs
$ ./hello
Hello World!

Mac版SkypeでCommand+Returnで投稿する

Mac版SkypeのチャットではReturnキーで投稿するようになってます。これが私には非常に不評でして、何度も間違えて投稿してしまっていました。

どうにかならないものかと思っていたのですが、ハッと気がつきました。我らがKarabiner(元KeyRemap4MacBook)を使えばいいということに。

早速private.xmlに記述。

<appdef>
  <appname>Skype</appname>
  <equal>com.skype.skype</equal>
</appdef>        
<item>
  <name>Command+Return to Return in Skype</name>
  <identifier>private.skype</identifier>
  <only>Skype</only>
  <autogen>__KeyToKey__ KeyCode::RETURN, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND | ModifierFlag::NONE, KeyCode::RETURN,
  </autogen>
  <autogen>
    __KeyToKey__ KeyCode::RETURN, KeyCode::RETURN, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION
  </autogen>
</item>

これの設定をOnにするとSkypeの時にだけReturnキーで改行、Command+Returnキーで投稿できるようになります。

しかしこのままではIMEでもCommand+Returnでしか変換の確定できなくなります。これはIMEの設定でOption+Returnでも確定できるように設定することで回避できます。

iOS Fluentd Loggerライブラリを公開しました

iOS用Fluentd Loggerライブラリを公開しました。

rizumita/CTFluentLogger

まだアルファ段階なので、開発時のみご利用ください。

Fluentd+elasticsearch+Kibana3が動作するVagrant+Chefも入っているので、簡単に使い始められるようになっています。

詳しい使い方はiOSアプリからFluentdにログを送る (Vagrantで簡単にサーバを利用可能) | CAPH TECH : iOSを御覧ください。

VagrantにChefでFluentd+elasticsearch+Kibana3をデプロイ

VagrantにChefでFluentdとelasticsearchとKibana3をインストールして動かしてみます。

ChefとBerkshelfのインストール

まずこのプロジェクトのファイルを置くディレクトリを作成します。

$ mkdir sandbox
$ cd sandbox

以下の内容でGemfileを作成します。

source "https://rubygems.org"
 
gem "knife-solo"
gem "berkshelf"

インストールします。

$ bundle install --path vendor/bundle

Chefリポジトリの作成

Chefのリポジトリを作成します。

$ bundle exec knife solo init chef-sandbox
$ cd chef-sandbox

Berkshelfで必要なcookbookをインストール

以下の内容でBerksfileを作成します。

source "http://api.berkshelf.com"
 
cookbook 'td-agent', :git => 'https://github.com/treasure-data/chef-td-agent.git'
cookbook 'elasticsearch', :git => 'https://github.com/elasticsearch/cookbook-elasticsearch.git'
cookbook 'kibana', :git => 'https://github.com/realityforge/chef-kibana.git'
cookbook 'timezone-ii', :git => 'https://github.com/L2G/timezone-ii.git'

cookbookを取得します。

$ bundle exec berks vendor

独自のCookbookの作成

独自のCookbookを作成します。

$ bundle exec knife cookbook create base

インストール時にlibcurl-devが必要になるのとFluentdの設定ファイルを独自のものに変更する為に、cookbooks/base/recipes/default.rbを以下の内容に変更します。

package "libcurl4-openssl-dev" do
  action :install
end
 
include_recipe "td-agent::default"
 
begin
  t = resources("template[/etc/td-agent/td-agent.conf]")
  t.source "td-agent.conf.erb"
  t.cookbook "base"
rescue Chef::Exception::ResourceNotFound
  Chef::Log.warn "could not find template /ect/td-agent/td-agent.conf"
end

独自のFluentdの設定ファイのテンプレートを作成します。cookbooks/base/templates/default/td-agent.conf.erbを以下の内容(必要に応じて変更)で作成します。

<% if node['td_agent']['includes'] %>
include conf.d/*.conf 
<% end %>
<% if node['td_agent']['default_config'] %>
####
## Output descriptions:
##
 
# Treasure Data (http://www.treasure-data.com/) provides cloud based data
# analytics platform, which easily stores and processes data from td-agent.
# FREE plan is also provided.
# @see http://docs.fluentd.org/articles/http-to-td
#
# This section matches events whose tag is td.DATABASE.TABLE
<match td.*.*>
  type tdlog
  apikey <%= node['td_agent']['api_key'] %>
 
  auto_create_table
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
</match>
 
## match tag=debug.** and dump to console
<match debug.**>
  type stdout
</match>
 
####
## Source descriptions:
##
 
## built-in TCP input
## @see http://docs.fluentd.org/articles/in_forward
<source>
  type forward
  port 24224
</source>
 
## built-in UNIX socket input
#<source>
#  type unix
#</source>
 
# HTTP input
# POST http://localhost:8888/<tag>?json=<json>
# POST http://localhost:8888/td.myapp.login?json={"user"%3A"me"}
# @see http://docs.fluentd.org/articles/in_http
<source>
  type http
  port 8888
</source>
 
## live debugging agent
<source>
  type debug_agent
  bind 127.0.0.1
  port 24230
</source>
<% end %>
 
<match myapp.**>
  index_name adminpack
  type_name http
  type elasticsearch
  include_tag_key true
  tag_key @log_name
  host localhost
  port 9200
  logstash_format true
  flush_interval 5s
</match>

ロールの作成

Chefのロールを作成します。

roles/td-agent.rbを以下の内容で作成します。

name "td-agent"
description "Base role applied to td-agent nodes."
run_list(
  "recipe[apt]",
  "recipe[base::default]",
  "recipe[td-agent]"
)
override_attributes "td_agent" => {
                      "plugins" => [ "elasticsearch" ],
                      "platform" => "ubuntu"
                    }

roles/elasticsearch.rbを以下の内容で作成します。

name "elasticsearch"
description "Base role applied to elasticsearch nodes."
run_list(
  "recipe[java]",
  "recipe[elasticsearch]"
)
override_attributes "java" => {
                        "install_flavor" => "openjdk",
                        "jdk_version" => "7" }

roles/kibana.rbを以下の内容で作成します。

name "kibana"
description "Base role applied to kibana nodes."
run_list(
  "recipe[kibana::default]",
  "recipe[kibana::apache]",
)
default_attributes "kibana" => {
                      "version" => "3",
                    }

VagrantとVirtualBoxをインストール

Oracle VM VirtualBox – Downloads | Oracle Technology Network | OracleからVirtualBoxをダウンロードしてインストールします。

Download Vagrant – VagrantからVagrantをダウンロードしてインストールします。

Vagrant Boxの作成

Vagrant Boxを作成します。代わりにあとでVagrantfileで指定してもいいです。

$ vagrant box add opscode-ubuntu-12.04 https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box

vagrant-omnibusプラグインのインストール

Vagrantに自動的にChefをインストールするためのプラグインvagrant-omnibusをインストールします。

$ vagrant plugin install vagrant-omnibus

Vagrantfileの作成

Vagrantfileのひな形を作成します。

$ vagrant init opscode-ubuntu-12.04

Vagrantfileの

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

という行のあとに

  config.omnibus.chef_version = :latest
 
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["./cookbooks", "./berks-cookbooks"]
    chef.roles_path = ["./roles"]
    chef.add_role("td-agent")
    chef.add_role("elasticsearch")
    chef.add_role("kibana")
 
    chef.run_list = [
      "role[td-agent]",
      "role[elasticsearch]",
      "role[kibana]",
      "recipe[timezone-ii]",
    ]
 
    chef.json = {
      :tz => "Asia/Tokyo",
    }
  end
 
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "forwarded_port", guest: 9200, host: 9200
  config.vm.network "forwarded_port", guest: 8888, host: 8888

を挿入します。

Vagrantを実行

$ vagrant up

でvagrantを実行します。

動作確認

http://localhost:8080/index.html#/dashboard/file/logstash.json
にアクセスします。以下の様なKibanaの画面が表示されるはずです。

Voila Capture 2014 04 25 05 50 34 午後

次に
http://localhost:8888/myapp.test?json={%22event%22:%22access%22}
にアクセスします。これは、Fluentdにhttpでログを作成しているので、表示は何も行われません。

再び
http://localhost:8080/index.html#/dashboard/file/logstash.json
にアクセスします。すると、以下の様に一つログが表示されているのが確認できるはずです。ログの反映はタイムラグがあるので、表示されていない場合は数秒置いてリロードしてみてください。
Voila Capture 2014 04 25 05 54 26 午後

以上で動作確認までできました。