プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

はてなのイベント #エンジニアブロガー祭り に参加してきた

12/14(土)に品川で開かれた「はてなエンジニアブロガー祭り」というイベントに参加してきました。

どういう内容のイベントだったかというのはもう私が書く必要ないくらい他の方が詳細を書いていらっしゃいますし、他の方のエントリをまとめた記事も出ているので、当日何があってどういう内容だったかというのは触れずに、参加してみた感想でも書いておこうかと思います。

写真で軽く振り返るイベントの様子

Untitled

こんな感じでクラウディアさんが入り口で迎えてくれました。

Untitled

後ろで展示されていたSurfaceです。実際に触って遊ぶことも出来ました。写真はツインビーが動いているSurfaceですね。

Untitled

最初のはてなスタッフの方の発表の時に撮影した(はずの)ものです。id:onishiさんもid:hitode909さんも発表面白くて良かったですね。

私は今はてなブログを使っていますが、今まで知らなかったはてなブログの機能をid:onishiさんの発表で知りましたし、id:hitode909さんの発表は内容だけで無くLT5連発のテンポが良くて笑わせてもらいました。

Untitled

パネルディスカッションが始まる直前に撮影したものです。パネルディスカッションは結構内容が詰まっていたのですが、一番印象に残っていたのは 長永さん(id:a666666 / @kyanny)が元々は非モテブロガーだったというところ ですね。Twitterで初めて知ったので、Twitterのプロフィール写真の爽やかな印象からは想像できない過去の歴史話やはてなダイアリーでどんな記事書いていたかという話しなどは中々趣深くてよかったです。

いや人は見かけによらないものなんですね、なんて思ってしまいました。

Untitled

懇親会が始まってからのLTの時の様子です。こちらはMicrosoftの方がXamarinの発表をしているところです。が、最初の導入が藍澤祈だったので、最近のMicrosoftのフリーダムっぷりを再確認しました。

参加してみてどう思ったか

「あんまり長々と書く意欲もなくなって結局更新しない」というのがいつも陥りがちな私のダメなところなので、サクッと軽く書いて終わりにします。

イベントの最初から最後まで「みんなブログを書こう!」という、良い意味で意識の高まりが感じられるイベントでした。

多少のポジショントークはあったのかもしれませんが、主催のはてなの方だけではなく、登壇者の方の多くから「ブログを書いていて良かった」という趣旨の発言が自然と出ていたことが本イベントの良さを象徴していた気がします。

まとまった技術的な蓄積がないと中々ブログを更新しないという状態が続いていたので、こういうイベントにこのタイミングで参加できて良かったです。来年はもう少しブログの更新頻度を高めてみることを考え始めました。

あ、後これは書いておこうと思いますが、当日の全般にわたり、後ろのスクリーンに映されていたブラウザ画面を操作している方がプログラムの進行状況に即した画面を出していて、かなりいい仕事をしていたと思います。

最後になりましたが、主催のはてなの皆様、会場提供のマイクロソフト様、登壇された皆様、素晴らしいイベントをありがとうございました。

"AnsibleWorks and Typesafe"というwebinarに参加してみたのでメモ残しておきます。

まあタイトルの通りなんですが、AnsibleWorksTypeSafe共同のセミナー(?)みたいなのをwebinar形式でやるってことなので参加してみたってことを適当に書き散らしてみます。

公式アカウントは直前にこんなツイートして宣伝してましたね。

参加しようと思った経緯みたいな話

webinarって何ぞ?と思った人、私も未だに何ぞ?と思っています。

何かリマインダーとして送られてきたメールとか、ググったりして調べてみると、webinarは"web"と"seminar"を合わせて作った造語(なのかな?)らしく、インターネットを使って開催するセミナーのことらしいです。

要するに「オンラインでセミナー出来るよ!」ってことだと理解したのと、時間に融通が利く今の状況だったので何の気なしに参加登録してみました。

で、登録作業しながら思ったんですけど、世の中には時差という物があるんですよねー…

登録作業中に出てきた予定開催時間にはこう記載されてました。

Thu, Sep 26th, 2013 at 10:00 am PDT

これを日本時間に直すと…

2013/09/27 (金) 02:00 ~

うわー、完全に深夜じゃないかー(棒)

時間に融通が利く立場だとこういうのにも参加できていいですね(棒)

実際に参加してみて

で昨日(というか今日の午前2時ですが…)参加してきました。どういった層向けのセミナーだったのか今でも分かりませんでしたが、とりあえず経験として参加してみてよかったかなー、とは思いました。

以下に箇条書き形式で受講当時に書いたメモを整形して載せて今回の記事は終わりにしたいと思います。

  • AnsibleWorksTypeSafe共同のセミナー。
    • AnsibleWorks側からは"Co-Founder and Vice President of Services and Support"のTim Gerla氏*1が参加して、全体の司会とAnsibleの説明(主にAnsibleの特徴とAnsible AWXについての説明)をしてました。
      • こういう記事のリンク先動画でやっているような説明してました。
    • TypeSafe側からはJames Ward氏が参加してました。TypeSafeとかScala界隈には全く詳しくないのですが、Scala界隈での重鎮なんですよね?
      • ScalaとかTypeSafeに全く詳しくないせい(?)か"Reactive"とか"Reactor"とかそういう単語が頻繁に出てきたんですけど、全く理解できませんでした。
      • reactivemanifesto.org というURLを紹介してましたけど、一体何なのかよく分かってません。
  • MeetingBurnerというサービスを使って開催していたみたいです。
  • 英語オンリーでした。当たり前ですが。聞き取りやすい英語だったのですが、リスニング能力の欠如により理解できない部分も多かったですね…orz
  • 開催中かなりトラブルあり
    • 音が聞こえてこないトラブルがかなり多かった。
    • 音が聞こえなくなるとチャットに'No sound'とか書く人がいたので、適当に'Me too'だとか書いてました。
  • Ansible AWXの説明もありました。
    • 画面を映して説明してました。Ansible AWXはまだ使ったことは無いのですが、コマンドラインオプションとか普通の人には分かりづらいところを選択式にしてたりして、面倒臭そうな所を隠蔽して分かりやすくしてそうな印象は受けました。
    • 本題からそれますけど、Tim氏はVMWare Fusion使ってました。
  • Q&Aコーナーもありました。
    • 英語で殆ど理解できませんでした orz
    • 既存のインベントリをAWXにインポートできるの?とか、そういう質問があったような…
  • Ansibleを使ったアプリのデプロイの説明もしていました。
  • セミナーは02:43で終わりました。

こんな感じでした。

まあ、その後中々眠れずに、寝てから起きるの遅くなりましたが、いい経験だったかなと思って自分を正当化しています。

*1:AnsibleWorksの公式サイトのチーム紹介のページに詳しい情報が載っています

PyCon APAC 2013で『入門Ansible』というタイトルの発表をします #pyconjp #pyconapac

この記事でお伝えしたいこと

最初にまとめておくと以下の通りです。

まとめるとこんな感じです。

発表するに至った経緯とか

PyCon APAC 2013のカンファレンス本体の開催まで後4日となりました。チュートリアルも考慮に入れると後3日です。そんな直前の時期になってしまって周知が遅いんですけど、私も15日に『入門Ansible』というタイトルの発表をいたします。

発表する内容はタイトルの通りAnsibleに関する入門的な内容の発表です。

今ほどAnsibleを触る人が少なかった頃にちょうどPyCon APACのCfPの応募があったので「試しに応募してみるか」と調子に乗って応募したら採用されました。

同じくCfPが採用された@さんも自身のブログ

錚々たる面々が「落選した」と言っている中なので、ホントにこれでいいの?なんてガクブルしていますが、折角の機会なので、実のある発表が出来るようにがんばります。

とおっしゃっているのですが、正直私も同じ気持ちです。私の場合、50分の長さの発表は初めてなので不安の部分が大きいのですが、無理せずいきたいと思います。

発表する内容のレベルに関して

CfPに応募した当初と現在の状況のズレ

CfPに応募した頃のAnsibleはまだ日本ではそれほど触っている人がそれほど多くないように思えたので「それだったら私もCfPのネタとして応募してみるかー、まだいじってない人多そうだし、多少緩い内容でも大丈夫だろー」なんて気軽な気持ちで応募したんですけど、CfPに応募した頃と今では少し状況が変わって*1(具体的なデータ示せないですけど)かなりAnsibleを使う人が増えてきたので、「わー、マイナーネタを扱うつもりだったのにどうしよーおぉぉぉ」という気分になっています。

と落ち込んでもしょうがないので、当初の「初心者向け」という区分けを外すことなく発表するつもりです。

が、これだけAnsibleが流行ってきている(?)ので、「私が想定している発表内容のレベル」と「参加者が聞けると思っている発表内容のレベル」にズレがあるとお互い不幸なことになってしまうので、予めどんなレベルの発表をするかということを予め書いておいた方がいいと思ってこの記事書いてます。

このレベルの人が発表を聞きに来ると物足りなく感じると思います

どういうレベルの人が上に挙げた人に該当するかというと

  • もう既にバリバリAnsibleを使って作業をしている人(仕事・趣味に関わらず)
  • Ansibleの公式ドキュメントを隅から隅まで読み込んでいる人

何故かというと、当日発表する内容は「公式ドキュメントの中からポイントを抜粋した所」を中心に解説するからです。

勿論公式ドキュメント以外のものも含めるつもりですし、実際の発表時に例として挙げる内容は公式ドキュメントのものでは無いです。

が、Ansibleの公式ドキュメントがよく出来ていて、量が少ない(15ページ程度)割に多種多様な内容が含まれているため、発表時に公式ドキュメントに書かれていること全てに触れることは不可能だと判断し、発表は以下の点を念頭に置いて行おうと思っています。

  • 「Ansibleのことを初めて知った人が触れてすぐに使える状態になる手助けをする」
  • 「充実したAnsibleのドキュメントを独力でも読み進められるようになるポイントを提供する」

そのため、公式ドキュメントを隅から隅まで読んでいたり、既にAnsibleをヘビーに使っている人には既知の内容が多く含まれると思いますので、その点を予めご了承頂ければと思います。

後、Ansibleをインストールした後、デフォルトかつ単独で使えることに限定して話すため、公式ドキュメントの以下の項目は発表時にはほぼ触れません。

このレベルの人だと得られるものがあると思います

  • サーバー構築をやったことが無い人
  • サーバー構築はやったことがあるが、ChefやPuppet、FabricやCapistranoなどのツールは使ったことが無い人
  • Ansibleのことを初めて聞いた人

復習用の教材(リポジトリ)紹介

書いてたら思いの外時間がかかったので詳細は現時点では書きません*3が、発表後に復習できるようにリポジトリをgithub、bitbucketに予め作ってあります(まだ未完成ですが)。

まだ未完成のため、適当にいじると色々不具合を起こすと思います。そもそもまだ説明を加えていないので。

上記リポジトリ内のplaybookとinventory fileを見て、だいたいどういうことをやっているのか分かる人は私の発表より他の人の発表を優先した方がいいのではないかと思います。

色々後ろ向きっぽいことばっかり書いていますが、まあ当日は出来る限り頑張りますので、よろしくお願いします。

*1:個人的にこの辺りの記事から使い始める人がドバっと増えた印象がありますね。

*2:ベストプラクティスの例として触れる可能性はあります

*3:発表時には詳細を伝える予定です

構成管理ツールAnsibleのv1.2以降に使えるRolesという機能を使って、VirtualBox + Vagrant + Ansibleを連携させて開発環境を構築するサンプルを作りました。

前回書いた『VirtualBox + Vagrant + Ansibleを使って『Pythonプロフェッショナルプログラミング』で使う開発環境(に近いもの)をほぼ自動で構築するPlaybookを作ってみました』という記事の続きです。なので、前回の記事を読んでないと意味不明かもしれません。

がっつり調べたというわけではなく、「色々試してやっと基本的なところが出来ました」というくらいの話しなので、軽めに書きます---と言いたかったのですが、書いてみたらえらく長くなってしまいました。

最初に結論をまとめると

  • 前回の記事で手前味噌ながら紹介した「『Pythonプロフェッショナルプログラミング』で使う開発環境を構築できるお試しセット」を、Ansibleのv1.2以降で使えるようになるRolesという機能を使って書き換えてみました。
  • URLはこちら。role-sampleという名前のブランチでRoles機能を使っています。
  • まだ作業途中なので内容が変わるかもしれませんが、やっていることはmasterブランチの内容と全く同じで、単にRolesという機能を使うように変更しただけです。
  • READMEはまだ書き換えてないので無視して下さい。
  • 現時点ではPyPIに上がっているAnsibleのバージョンは1.1なので、Ansibleをgithubから取ってきてsudo python setup.py installするなりしてAnsibleのバージョンを1.2相当にした後、実行するコマンドを以下のように変更してもらうとsshのパスワードを聞かれた後Ansibleが起動します。Roles機能を使わないときと同じ動作をすると思います。
ansible-playbook main.yml -i hosts/local -k
  • 注意事項など
    • 前回の記事で書いた注意事項は最低限気をつけて下さい。
    • 今回(Ansible1.2)の場合に気をつけるべき事はこの記事内の後のほうに書きます。

そもそもAnsibleのRolesって何よ?という人のための簡単な説明

Ansibleの説明はもう面倒臭い必要ないと思うので省きます。

前回の記事の下の方に参考記事リンクをバリバリ貼っているので、Ansibleが何か知らない人はそこを見たり、為になるこちらの記事を見てください。あと、Ansibleの基本的な使い方は前回記事で紹介したリポジトリのREADMEを読んで実際に手を動かしてみた人という想定でこれから書きます。一つ一つ説明書くといつまで経ってもRolesの説明が出来ないので*2

いまこの記事を書いている現在のAnsibleのバージョン(PyPIに上がっている方)は1.1なのですが、github上にある開発バージョンには1.1に含まれていない機能・モジュールが多数あります。Rolesもその一つです。

Rolesというのは乱暴に言ってしまうと、あらかじめ決められたディレクトリ構成を作って所定の位置にファイルを置けばAnsibleのincludeをより便利且つ楽に使えるようになる仕組みのことです。

includeとは何かというと、あるplaybookから他のplaybookを呼び出す機能*3なのですが、前回の記事で作ったリポジトリを例にした方が分かると思うのでそうします。

まずrolesを使わずincludeだけを使った場合の例を示します。

---
├── editor.yml
├── essential.yml
├── hosts
│   └── local
├── main.yml
└── python.yml

includeだけを使ったplaybookのディレクトリ構成は上のようになっています。ここで実際にAnsibleを使うときに指定するplaybookであるmain.ymlの中身を見てみましょう。

---

# main.yml

- hosts: pypro
  user: vagrant
  sudo: yes

  tasks:
    - include: essential.yml  tags=essential
    - include: editor.yml     tags=editor
    - include: python.yml     tags=python

ここでincludeが使われていますが、includeの後に呼び出したいファイルを指定するとそのファイルが読み込まれて中に書かれている内容を処理します。

ここでは最初にincludeを使って呼び出されているessential.ymlの中を見てみましょう。

---

# essential.yml

- name: Install basic server pkgs
  apt: pkg=$item force=yes update_cache=yes
  with_items:
    - build-essential
    - libsqlite3-dev
    - libreadline6-dev
    - libgdbm-dev
    - zlib1g-dev
    - libbz2-dev
    - sqlite3
    - tk-dev
    - zip
    - python-dev
    - python-pip
    - python-setuptools
    - python3.2
    - subversion
    - openjdk-7-jre-headless
    - nginx

何をやっているかはだいたい見てもらえれば分かると思いますが、Ansibleに標準付属されているaptモジュールを使って開発に必要なパッケージ群をインストールする処理が書かれています。

includeを使わないで同じ処理をしようと思ったときにmain.ymlの中身がどうなるかというと…

---

# main.yml

- hosts: pypro
  user: vagrant
  sudo: yes

  tasks:
  - name: Install basic server pkgs
    apt: pkg=$item force=yes update_cache=yes
    with_items:
      - build-essential
      - libsqlite3-dev
      - libreadline6-dev
      - libgdbm-dev
      - zlib1g-dev
      - libbz2-dev
      - sqlite3
      - tk-dev
      - zip
      - python-dev
      - python-pip
      - python-setuptools
      - python3.2
      - subversion
      - openjdk-7-jre-headless
      - nginx
(以下省略)

このように大変長くなってしまいます。これくらいならまだ一つにまとめてもいいかもしれませんが、もっと処理が多くなると一つにまとめた場合、どこにどんな処理が書いてあるのか把握するのも大変になってきます。

includeを使うと一つのファイルに処理をまとめて書く必要がなくなり、ファイルを分割して記述が出来るようになります。プログラミングで小さなモジュールを組み合わせて使うのと同じように、includeを使えば一つのファイルに必要以上に命令を書き込まず、再利用可能なplaybookを作ることが可能になるんですね。

includeがあれば再利用可能なplaybookを作るのは可能なんですが、ディレクトリ構成をどうするかなどの方針を決めずに使いすぎるとどこに必要な処理を書いたのか後から把握するのが辛くなりますし、そもそも再利用可能なディレクトリ構成を考えつつ再利用可能なplaybookを書くのは結構骨が折れます。

そもそも上で使用したのはtaskだけで、fileとかtemplate、handlerやvarといったtask以外の機能を使用してません。これらの機能も含めてplaybookを分割して分かりやすくディレクトリ構成を決めるのは大変なはずです。

そこでRolesという機能の出番です。

Rolesというのは公式ドキュメントの説明を基に超訳すると

  • 「includeディレクティブを単に自動化したもの」
  • 「参照するファイルのパスを見つける処理を改良しているだけ」

のものです。

日本語で言っているだけだと意味不明だと思うので実例を見てみましょう。

下で紹介する例は上で紹介したincludeの例を単純にrolesで置き換えたものです。

.
├── hosts
│   └── local
├── main.yml
└── roles
    └── common
        ├── tasks
        │   └── main.yml
        └── vars
            └── main.yml

hostsディレクトリとmain.ymlの場所は変わっていません。変わっているのはessential.ymlなどのplaybookが無くなり、代わりにrolesというディレクトリが増えています。

このときのmain.ymlの中身は下のようになっています。

---
# file: main.yml
- hosts: pypro
  user: vagrant
  sudo: True
  roles:
    - common

上のように、rolesというディレクティブを使い、rolesディレクトリの直下にあるディレクトリ(この場合はcommon)を指定すると、roles/tasks/main.ymlとroles/vars/main.ymlが自動的にincludeされます。

それぞれのファイルの中身のうち、essential.ymlの処理に当たる箇所は以下の通りになっています。

---

# file: roles/common/tasks/main.yml

- name: Install basic server pkgs
  apt: pkg={{ item }} force=yes update_cache=yes
  with_items: ${system_packages}
---

# file: roles/common/vars/main.yml

system_packages:
  - build-essential
  - libsqlite3-dev
  - libreadline6-dev
  - libgdbm-dev
  - zlib1g-dev
  - libbz2-dev
  - sqlite3
  - tk-dev
  - zip
  - python-dev
  - python-pip
  - python-setuptools
  - python3.2
  - subversion
  - openjdk-7-jre-headless
  - nginx

一番最初の例で使ってなかった変数の機能(var)を使っているので分かりづらくなっているかもしれませんが、ここで大事なのはplaybook内でroles: xと書けば、わざわざincludeと明示的に指定しなくても以下のファイルを勝手にincludeしてくれるということです。そのため、ansible-playbook main.yml -i hosts/local -k と打って実行すると、includeのみを使用したときと同じように動作します。

  • roles/x/tasks/main.yml
  • roles/x/handlers/main.yml
  • roles/x/vars/main.yml

後他にもroles/x/(files|templates|handlers)ディレクトリに何かファイルがあれば色々やってくれるそうですが、まだ私自身が試してないので気になる方は公式ドキュメントの説明を読んで自分で確認してみてください。

まあ、要するにRolesに関して理解すればいいのは

  • playbook内で role: x と書くと
  • roles/xディレクトリ配下にある特定のファイル(tasks/main.ymlなど)を自動的にincludeしてくれる!

ということです。基本的には。

今回はxディレクトリに当たる部分がcommonしかなかったですが、commonだけでなく、webserversディレクトリとかdbserversディレクトリとか自分の好きなように作れるので、それぞれサーバー毎に必要なplaybookの固まりをそれぞれのディレクトリの所定の場所に突っ込んでおけば、後はansible-playbookコマンドを使うときに指定するplaybook内に role: webserversとかrole: dbserversと書くだけで自動的にincludeされるので、自分でディレクトリ構成を考える必要も無く、記述も楽になるので大変オススメだ、ということです。

…長々と書いたせいか、理解できるように書けていない気がするのですが、もうこれ以上書くのも疲れたし分かりやすく書ける気がしないので、冒頭で紹介したリポジトリをcloneでもして実際に動かしてみるといいと思います(と宣伝)。

Ansibleはこの6/10にv1.2をリリース予定とのことなので、v1.2が来たらわざわざgithubから取ってきてインストールするなどといった面倒臭いことはしなくてすむのでよかったですね!

…よし、これでだいたい言いたいことは終わった−。

注意事項

2013/06/04 13:57現在、github上のAnsibleを使うと以下のような問題がありますので気をつけてください。

Ansible学習の参考になりそうな新たな記事リンク集

以上です。書くの疲れました。

*1:というかブランチ名、roles-sampleにすればよかった…

*2:説明能力が無いという理由も大きいですがね!

*3:こういう説明でいいのか自信ない…

VirtualBox + Vagrant + Ansibleを使って『Pythonプロフェッショナルプログラミング』で使う開発環境(に近いもの)をほぼ自動で構築するPlaybookを作ってみました

最初に結論を書くと…

  • タイトルの通り、VagrantとAnsibleを組み合わせて(ほぼ)自動で『Pythonプロフェッショナルプログラミング』で使う開発環境を構築できるお試しセットを作ってみました。
  • URLはこちら
  • お試しセットなので、VirtualBox, Vagrant, Ansibleさえ入れれば、READMEの指示通りすぐに試すことが出来ます*1
  • AnsibleのPlaybookとか自分で考えなくてもとりあえず動く様子を見られます。
  • Ansibleじゃなくてもいいので、これをきっかけにしてChefとかPuppetとか(或いはレイヤーが違うけど)FabricやCapistrano、Cinnamonとかに興味を持ってもらえると嬉しいですね。
  • もっと増えろ、Ansible関連の記事!!

ということをこれから書いていきます。

前置き

このごろChefやPuppetなどの構成管理ツールやサーバーの状態をテストするserverspecなど、インフラ部分の環境構築・運用に関する熱が高まりつつありますね。

そんなビッグウェーブに乗り遅れまいと個人的に少しずつ勉強してきたのですが、いかんせんVirtualBoxの中にLinuxサーバーを作ったことすらあまり無いというインフラ超初心者の状態だったため、

  1. Vagrantの導入でまず盛大に躓き
  2. Fabricを導入してやっと自動化の便利さが何となく理解できてきて
  3. fabtoolsとcuisineを使うことでFabricをもっと便利に使えるなぁ、いいなぁと思えるようになり
  4. でも冪等性を自分で確保するように気をつけてやるのは大変だ…ということを何度も環境を作っては壊しながら思うようになり、
  5. それならサーバー側に特別なソフトを入れる必要が無いというAnsibleを勉強も兼ねて使ってみるかと思ったら、Vagrantとの連携の仕方がさっぱり分からずに死亡

といういくつも地雷を踏みながら、どうにかVagrantとAnsibleを連携させて動かせるようになりました。

で、こういった経験から

「同じように嵌まっている人、もしかしたら結構いるんじゃないか?」

と思ったので、ちょこちょこ手直しして「VagrantとAnsibleを連携させて開発環境を自動構築できる例」を公開できるように整えました。

で、これはそのリポジトリの紹介記事です。

VagrantとAnsibleを連携させてできる例の紹介

肝心の例ですが、これです。

https://github.com/takuan-osho/ansible-vagrant-pypro-skel

各種注意事項とか作業手順、注意事項はREADMEにある程度書いたので、すぐに試すことが出来ると思います。

Ansibleとかを試してみたい人向けに作ったつもりの割には作りが荒くて問題が起きそうな気もしていますが、"Done is better than perfect"という言葉を思い出したので、とりあえず公開してみることにしました。

今後私のAnsibleの学習が進むにつれてちょこちょこ手直ししていくかもしれません*2

注意事項

上記のリポジトリを試すに当たり、現時点*3でREADMEに書けなかった注意事項として以下の点があるので注意して下さいね。

  • Vagrantのboxに「precise64」という名前のboxが無かったら勝手にVagrantup.comの所からboxのダウンロードを始める、ということ
    • こういうやり方になっている理由はREADMEにも書いたとおり、Ansibleを体験するまでになるべく手間のかからないようにしたからです。
    • なので、ダウンロードを勝手にされるのが困るという方は以下のような感じにVagrantfileの中を変更して下さい。
  config.vm.box = "precise64"

  (中略)

  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

となっているところを

  # PC内にVagrantがUbuntu系のboxをキャッシュしているなら、そのboxの名前を調べてその名前を入れる。
  # boxの名前の調べ方は'vagrant box list'と打てば分かるはずです。
  config.vm.box = "ubuntu-12.04.1-server-amd64" # これは一例

  (中略)

  # config.vm.box_urlの箇所は削除するか、コメントアウトする
  # config.vm.box_url = "http://files.vagrantup.com/precise64.box"

みたいな感じで変更すれば、指定したboxを使うように変更してくれるはずです。

  • (上記の注意事項と関連して)Vagrantがキャッシュしているboxの中に「precise64」という名前でUbuntu以外の別のdistributionのboxが入っていたらおそらく上手く動きません。
  • VirtualBoxインスタンスのメインメモリは1024MBで作られるようになってます。
    • vagrant initで生成されるVagrantfileの中のコメントアウトされた部分をそのまま使っているのでこの数字になってます。
    • それが嫌な人はVagrantfileの中の該当箇所の数字*4をいじって下さい。

Ansibleを使ってみて思ったこと + Ansible関連で非常に参考になった記事の紹介

Ansibleを使ってみた思ったことを列挙すると

  • Chefとかに比べるとAnsible関連の日本語記事が少ない…
  • 日本語記事が少ないから初心者が躓きやすくないか?という印象
  • というわけで、もっと増えろ! Ansibleの日本語記事!!

です。

何で今回ChefとかPuppetではなくAnsibleを使ったかというと

  1. Chefとかを導入するのが難しそうに感じたから*5
  2. ChefとPuppetが盛り上がっているので、対してそれほど盛り上がってないように見えるAnsibleを試してみることで、構成管理ツール群雄割拠の時代とか来たら面白いなー、とか考えたから。

ってな感じです。まあ、判官贔屓みたいな物です、多分。

ChefとかPuppetと比べてどうこうっていうことは言えませんが、今回Ansibleを試してみて思ったのは「個人が軽く使う分には割といい」ということでした。

サーバー側に特別なソフトを入れる必要が無いので、その手間がかからないところもいいですね。

大規模になってくると通用するのかどうかとか、そういったことの調査は他の人に任せます。

最後に、今回Ansibleを無事動かすのに辿り着くまでに非常にお世話になった記事群を紹介して終わりにしたいと思います。

というわけで、誰かもっとAnsibleを使い倒して私に教えてください(他力本願)。

*1:ただ、READMEにも書いたように、検証した環境が限定されているので、例えばWindowsでちゃんと動くかは保証できません。

*2:やる気が持続したら、の話しです。

*3:この記事を最初に書いた2013/05/17 13:35時点

*4:DSLなので何となくそれを指定してるところは分かるはずです

*5:結局Ansibleを使うのにもかなり手間かかってしまいましたが…

reST(reStructuredText)をライブプレビューできるエディタ、ReTextをMacにインストールする方法

初めに断っておきます

完全にプログラマ向けの内容です。

reSTをライブプレビューできるエディタは(Markdownに比べたら)少ないはずなので、本来なら非プログラマにも読めるように書いた方がいいとは思うのですが、この記事を書いている現在、ReTextをMacにインストールして使おうとするとどうしても中のソースコードをいじらないといけないっぽいので、非プログラマ向けに書くのは諦めました。

そういう人はこちらのリンク先を辿ると幸せになれると思います

本題

ネットの海を漂っていたら、こんな記事を見かけたので本エントリを書き始めた。

Marked で reST(reStructuredText) を リアルタイムプレビューする - Study08.net 対シンバシ殲滅用人型機動兵器

私が使っているのもMacなので同じことが出来るのだが、現在のiTunesアカウントの残金が100円を切っているため、Markedを購入できない!!

で、iTunesカードを買いに行くのも面倒でやっていないのだけど、とある理由からreSTをライブプレビューできるエディタが欲しいなあ、なんて思っていたときにこんなものを見つけました。

https://sourceforge.net/p/retext/home/ReText/

リンク先に飛んでもらえれば分かるのですが、「Linux向けのMarkdown & reStructuredTextエディタ」です。Qt製だそうです。で、以下のような特徴があるそうです。

Features

  • Full Markdown and reST support
  • Markdown extensions support
  • Tabs and live preview
  • Files auto-save option
  • HTML, PDF, ODT export; Export Extensions
  • WebPages generator
  • Google Docs uploads
  • CSS styles support
  • Syntax highlighting
  • Tags and symbols boxes for quick insert

で、見てみると"live preview"という文字が!!

というわけで、お金もなく、live previewに釣られたのでMacにインストールを試みることにしました。

インストール方法

こういうのは先人に聞くのが一番です。

MacOSXにReTextをインストールするよ - opamp_sando's blog

で、この通り作業をしていたのですが、途中で詰まったところが何カ所かあるので、それをメモ的に残しておきます。

HomebrewでPyQtを入れたら何故か動かなかった

システム環境を汚したくなかったのでHomebrewでPyQtを入れてインストールしてみようかな、と思ってやっていたら何故かPythonのmarkups(だったかな?)が認識されなくなって何度やってもダメだったので、しょうがないからHomebrewからPyQtをアンインストールして、インストーラーで入れました。そしたら何故か上手くいきました。

原因が分かってませんので、あんまり真似しない方がいいかもしれないです。

PyQtの山を越えても立ちふさがるQStringの壁…

ReTextをインストールする際には先人のリンク先にあるように

git clone git clone http://git.code.sf.net/p/retext/git retext-git
cd retext-git/ReText
python setup.py install

ってな感じのことをやった後、retext.pyと打てばReTextが起動するはず…なんですが、エラーが出るかもしれません。

この状況を再現しようと思ってvirtualenvで仮想環境を用意してエラー画面を出そうと思ったら普通に起動できてしまったので、私のやり方が悪かっただけなのかもしれませんが、以下のようなTypeErrorが発生したときに初めて試せばいいと思います。

Traceback (most recent call last):
  File "/Users/taku/.virtualenvs/retext/bin/retext.py", line 59, in <module>
    main()
  File "/Users/taku/.virtualenvs/retext/bin/retext.py", line 44, in main
    window = ReTextWindow()
  File "/Users/taku/Dropbox/Projects/ProgrammingProjects/PythonProjects/PythonApplications/third-party-apps/retext-git/ReText/window.py", line 163, in __init__
    self.aboutWindowTitle =  self.aboutWindowTitle % app_name
TypeError: unsupported operand type(s) for %: 'QString' and 'str'

結論だけ書くとReTextをアンインストールして

self.aboutWindowTitle =  self.aboutWindowTitle % app_name

となっているところを

self.aboutWindowTitle =  unicode(self.aboutWindowTitle) % app_name

と変更してpython setup.py installし直せば動くはずです。

本当はもっとスマートなやり方があるのかもしれませんが、検討するのが面倒くさかったので止めました。

目的はreSTをライブプレビューできるエディタで文書を書くことだったので、問題特定の沼にはまるわけにはいかないものでして…

まあ、そんなこんなでやっとインストールすることが出来ましたよ、という証を貼っておきます。

screenshot-of-retext

最後に

こんな風にreST押ししていますが、このブログはMarkdownで書いてますよ…はてなブログで書いているので。

…あ、石投げないで!

はてなさん、はてなブログをreSTに対応して!!

reStructuredTextをプレビューできるST2プラグインRstPreviewの紹介と、それにPull Requestした(人生初)という話し

タイトルでだいたい伝えたいことは言ってるんですけど、一応順を追って紹介します。

この記事で伝えたいことの要約

どうせ長くなるので、結論だけ知りたい人は以下の要約読めばあとは読まなくても大丈夫だと思いますよ。

  • みんな大好き(?)Sublime Text 2のプラグインの中に、reStucturedTextをプレビューできるRstPreviewっていうプラグインを見つけた。
  • d0ugal/RstPreview · GitHub <--- これがそのプラグイン
  • でも使ってみたら組み込みのPython(しかも2.6)にdocutilsを入れないと機能しないプラグインだった。
  • 普段使わないPython2.6に余計なモジュールを入れたくなかったので、他のプラグイン(sublime-text-shebangとかSublimeREPL)をパクって参考にして中身を書き換えて、virtualenvなどに入れたdocutilsでも使えるようにしてみた。
  • どうせならPull Requestして取り込んでもらいたいなー、なんて思ったのでPull Requestしたら採用してもらえた(!!)
  • Pull Requestしたのも初ならば採用されたのも初なので嬉しかった*1
  • 使いたい人は以下のように設定ファイルを"RstPreview.sublime-settings"という名前で作り、site_packages_pathの値をdocutilsが入っている場所の"絶対パス"(←ここ重要)にして、設定ファイルが入っているフォルダ*2に入れれば機能するよ。2013年1月14日現在、まだREADMEにこのことが反映されてないので書きました。
{
    // Where to look for python site-packages directory.
    // Use absolute path, not relative path.
    // For example, "/Users/foo/.virtualenvs/env/lib/python2.x/site-packages".
    "site_packages_path": "/Users/taku/.virtualenvs/site-packages"
}

…コレ書いたらもう後書くことなくなってしまった感がある。

人生で初めてPull Requestしてみた後に思ったこと

RstPreviewの使い方をこれから書こうとか思ってたけど、上の要約とRstPreviewのREADMEを読んでもらえれば用が足りてしまうということに気づいてしまったので、適当な人生初Pull Requestの感想でも書くことにします。

長文書けないからごまかしている、というわけではありません、ええ。

もともとのモジュールがある場所がgithubだったわけで、必然的にgitを使うしか無かったわけですが、そこで以下のような問題が発生したわけです。

  • 普段Mercurialを使っているので、Gitの基本的なコマンドすら知らなかった->まずコマンドと概念の違いを押さえるところから躓いていた。
  • そこを何とかクリアしても次に立ちはだかったのは「どうやってPull Requestを送るのか?」というところ。やり方すら知らなかった。
  • しょうがないから以前偶然買った書籍に載っていたGithub特集を読みながら進めた。

WEB+DB PRESS Vol.69

WEB+DB PRESS Vol.69

  • 作者: 大塚弘記,渡辺修司,堤智代,森田創,中島聡,A-Listers,はまちや2,川添貴生,井上誠一郎,近藤宇智朗,ヒノケン,後藤秀宣,佐藤鉄平,mala,奥野幹也,伊藤智章,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2012/06/23
  • メディア: 大型本
  • 購入: 12人 クリック: 131回
  • この商品を含むブログ (17件) を見る

これを買ってなかったら今でもPull Request送らずにいたかもしれません。

とはいえ、GitどころかDVCS自体あまり使いこなしていない影響か、Pull Requestを送るようにするために下準備するところから時間がかかってちょっと面倒だったなあ、という感じです。

でも、実際に自分の書いたコードがほぼ採用されていたのは嬉しかったですね。他のプラグインをパクリ参考にしましたけどね。

次も時間を作ってPull Request送ろうかな、と思うようにはなりました。最初の一歩を踏めるかどうかって大きいですね、本当に。

*1:まあ、書いたのはほんの数行だったわけですが。

*2:Macの場合なら"~/Library/Application Support/Sublime Text 2/Packages/User/"にあるはず。他は知らない。