Mavericks(Mac OS X 10.9)にRuby1.8.7をインストールする方法
今さら最新のMac OS に Ruby 1.8.7 をインストールする人は少ないかもしれませんが、もろもろの理由でRuby 1.8.7が必要なのでインストールしてみました。
特に新しい情報はありませんが、brew, rbenv を使ってインストールしました。
% brew install apple-gcc42 % CC=/usr/local/bin/gcc-4.2 RUBY_CONFIGURE_OPTS="--without-tcl --without-tk" rbenv install 1.8.7-p374 % rbenv shell 1.8.7-p374
RubyWorld Conference 2013 に参加しました
RubyWorld Conference 2013に参加し、教育関連の発表してきました。発表の方は 会社Blog を見て下さい。
初めて RubyWorld Conference に参加した感想を書いてみます。
Matzは松江生まれでないという衝撃の事実を知る!
Rubyの作者、まつもとゆきひろさん は島根県・松江市に生まれ育ち、そしてUターンし松江市に住んでいるんだと勝手に思っていました。だからこそ松江市、島根県が Ruby に 大幅にコミットしているのだと。
初めて行った松江市の風景、宍道湖へと流れる穏やかな川が流れや広々とした風景が Ruby言語に与えた影響があるのかなぁ〜 と思いながら控え室で まつもとさんに 聞いたところ、母方の家系は島根の人だけど、まつもとさん自身はNaCl(株式会社ネットワーク応用通信研究所)にジョインするまでは、まったく松江と関係が無かったそうです!
ちなみに、その時ちかくにいた方も私同様に衝撃を受けていました :-)
市長、県知事、国のお役人が参加するカンファレンス
オープニングセレモニーは
前日のウェルカムパティーも由緒ありそうな料亭・・・ 1日目レセプションには大きなお魚の活き作り・・・ まつもとさんの偉さを実感しました。
S3へのアップロード速度を上げる方法
以前、S3への転送が遅い件について に書いたように、自宅 Mac mini からS3へのバックアップファイル転送ですが、単純に aws-sdk(Ruby版)を使うより2倍程度になったので書いておきます。
aws-sdk でのアップロードプログラム
次のようなコードで、ローカルにある PATH_TO_FILE ファイルを S3 の BUCKET_NAME にコピー出来ます(もちろん、access_key_idやsecret_access_keyにはあなたのキーを設定して下さい)。
#!/usr/bin/env ruby require 'rubygems' require 'aws-sdk' AWS.config( :access_key_id => 'XXXXXXXXXXXXXXX', :secret_access_key => 'YYYYYYYYYYYYYYY', :s3_endpoint => 's3.amazonaws.com' ) s3 = AWS::S3.new bucket = s3.buckets['BUCKET_NAME'] path = 'PATH_TO_FILE' obj = bucket.objects[File.basename(path)] obj.write(:file => path)
writeメソッドのオプションを指定しよう
AWS::S3::S3Objectのwriteメソッドのドキュメントを見ると、いくつかオプションがあります。ここで転送速度と関係しそうなものには
- : single_request 転送を一回で行うか、分割して行うか。デフォルトは分割(false)
- :multipart_threshold 小さいファイルの場合は分割しない、しきい値。デフォルト 16Mbye
- : multipart_min_part_size 分割する際の大きさ。デフォルト 5Mbye
今回はバックアップなので転送するファイルは 数100Mbye〜数Gbyte です。 デフォルトだと5Mbyeのファイルに分割して送っています。試しに multipart_min_part_size を大きくしたところ、転送時間が多少改善しました。
:single_request => true にして試したところ、デフォルトの半分程度の転送時間になりました!
single_requestで送るとということは一旦ファイルをメモリーに全部取り込んでからS3へ転送されます、したがってメモリーを大量に消費します。バックアップを行っている時に Mac mini は他には何も行っていないので今回は問題ないですが、使用環境によっては multipart_min_part_size を調整する方が良い場合もあると思います。
「はじめてのiPhone/iPadアプリ開発」の iOS7/Xcode5対応サンプルコードとサポートページを公開しました
今年3月に出版されたiPhone/iPadアプリ開発の書籍 はじめてのiPhone/iPadアプリ開発―iOS6/Xcode4対応版 (TECHNICAL MASTER) のiOS7/Xcode5に対応したサンプルコード と サポートページ を公開しました!
はじめてのiPhone/iPadアプリ開発―iOS6/Xcode4対応版 (TECHNICAL MASTER)
- 作者: 吉田裕美
- 出版社/メーカー: 秀和システム
- 発売日: 2013/03
- メディア: 単行本
- 購入: 3人 クリック: 141回
- この商品を含むブログ (2件) を見る
サンプルコード
「はじめてのiPhone/iPadアプリ開発」で取り上げているサンプルコードは大部分はそのままでも iOS7/Xcode5 で動作しますが、
を修正しました。秀和システムのサポートページ からダウンロードできます。
サポートページ
サポートページ では iOS7/Xcode5 で本書内容と関連する、
- iOS7のフラットデザインとコンテンツ中心の考え方で表示の一部が欠る件の対応方法
- Xcode5で変わった Constraint(AutoLayout)の配置方法の簡単な解説
を書きましたので、参考にして頂けると良いかと思います。
ssh ログインで ~/.ssh/id_ras が優先されるのを防ぐには
GitLab を開発用サーバーに入れて運用し始めたのですが ~/.ssh/config に接続用の秘密キーを指定しても ~/.ssh/id_ras を使って接続しょうとしエラーになり困っていました。
GitHub風システム、GitLab は ssh 接続のgitコマンドからのアクセス時には、sshのキーを使いユーザーを管理しています。
もし1人のUnix(Mac)アカウントがGitLabに複数のユーザーを登録していて、ユーザーAの公開キーが ~/.ssh/id_ras に対応するもので、ユーザーBの 公開キーが ~/.ssh/id_ras_git の場合を考えてみましょう(各ユーザーのリポジトリーはユーザーだけがアクセス出来ます)。ユーザーBに対応するリポジトリーをアクセスする際に ~/.ssh/config に
Host user-b-repo Hostname gitlab.xxxx.com User git IdentityFile ~/.ssh/id_ras_git
と書き git clone git@user-b-repo:user-b/zzzz.git の様にアクセスすると認証エラーになってしまいます。
ssh に -v オプションを付けて user-b-repo をアクセスしてみると
% ssh -v user-b-repo OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013 debug1: Reading configuration data /Users/aaaaaa/.ssh/config debug1: Reading configuration data /etc/ssh_config .... debug1: Connection established. debug1: identity file /Users/aaaaaa/.ssh/id_ras_git type 1 ← ~/.ssh/id_ras_git が使われています ... debug1: Authentications that can continue: publickey,password debug1: Next authentication method: publickey debug1: Offering RSA public key: /Users/aaaaaa/.ssh/id_rsa ← ここに注目 ...
なぜか ~/.ssh/id_ras を使って接続しています。この際に GitLab は ユーザーA がアクセスしてきたと解釈し、ユーザーBのリポジトリーにはアクセス権がないのでエラーを返します。
ここ数日悩んでいたのですが、今日判りました。 ~/.ssh/config に IdentitiesOnly yesを追加すれば、指定した秘密キーのみが使われるのでした!
ということで ~/.ssh/config は以下の様に書きましょう
Host user-b-repo Hostname gitlab.xxxx.com User git IdentityFile ~/.ssh/id_ras_git IdentitiesOnly yes
Chef を学んで使ってみた
空前の DevOps ブームに乗り遅れてはいけないとChefを学び、お客様の次期サーバーやRuby on Rails教育で使うサーバーを構築してみました。
感想
今回、お客様の次期サーバーを作るにあたりChefを使ってみたたところ、一度recipesを作ってしまえば サーバー環境が 10 〜30分くらいで自動的に出来てしまうのは画期的だと感じました!
私は教育・開発者なので、新しいサーバーの構築は年に数回、管理しているサーバーは数台程度です。従来はサーバーの構築・管理は手動で行い、作業内容をメモファイルに残していました。また、再度使う可能性があるサーバー環境はEC2のイメージとして保存して来たりしました。
しかし、作業のメモは必ずしも完璧ではないですし、メモを見落としてインストールに失敗する事もままありました。また保存してあるイメージですが、RubyやRailsがバージョンアップし教育では使えなくなってしまう事もあります。
手動でサーバー環境を構築しようとすると半日仕事になってしまいますが、Chefがあれば 10 〜30分くらい。しかも勝手にやってくれます。今までは、環境構築がおっくうで一つのサーバーに色々なアプリをrbenvとかを駆使して動かしていましたが、コスト面で問題がなければクラウドやVPSでサーバーを立ち上げ、すぐに環境が作れてしまいます。
また、recipe はコードなので少し考えて作っておけば再利用が可能で、新たな環境用に Chef も比較的短時間で作れます。
私のように、頻繁にサーバーを構築する事のない開発者も学んだ方が良い技術だと思います。
学び方
入門
入門は、やはり naoyaさんの 入門Chef Solo を読みましょう。原理的な事から実践的な事までがコンパクトにまとっまている良い書籍だと思います。私は kindle版が出た時に買ってしまったのでMacの横にiPadを置きKindleアプリで見ながら作業をしましたが、今なら 達人出版会からPDF(EPUB)版を買えば PC, Mac で見ながら作業出来るので、こちらがお勧めです。
実際に作ってみる
実際にrecipe作る際には、
- リファレンス: http://docs.opscode.com/chef/resources.html Resources, Recipe DSL は(長いですが)一回眺めておくと良いと思います。
- 参考になる公開されたcookbook: http://community.opscode.com/cookbooks
- Stack Overflow: 何か困ったら chef XXXX で検索し Stack Overflow を眺めると、とても参考になります
Recipe作りの基本
Resources
詳細は、入門書やリファレンスを読むとして、実際に Ruby on Railsアプリを動かすサーバーを構築するにはよく使う 以下のResources (Ruby DSL) を recipe に並べるだけです。
- package: OSのパッケージ(apt, yum) 等のインストール
- gem_package: RubyGemsのインストール
- cookbook_file: 設定ファイル等の作成、用意した設定ファイルのコピー+α
- template: 設定ファイル等の作成、設定ファイルをテンプレート化(Ruby のERB)出来るの汎用性がある
- remote_file: ネット上からファイルをダウンロードする
- file, directory: ファイル、ディレクトリーの作成
- user, group: Unixのユーザー、グループの作成
- service: デーモン(サーバープロセス)の起動、停止・・・
- execute: OSコマンドを実行することで上記の Resources では出来ないような操作を行う
べき等性 (冪等性, idempotence)
Chefのrecipeでは既にrecipeと同じ状態になっている場合は、何も行わないという べき等性を保つようにrecipeを作る必要性がります。
これは、Chef がインストールツールではなく、サーバー等の環境の変更を管理する為のツールだからです。packageをはじめ殆どのResourceは、既にインストールされている場合は何もおきません。
ただし、execute などは自分でべき等になるように作る必要があります、その為の仕組みが幾つかあります。
- creates属性: executeを実行した場合に出来るファイルを書いておくと、そのファイルがある場合は execute が実行されません
- only_if, not_if属性: 書かれたRubyの式、またはshellコマンドの文字列を実行した結果で実行する・しないを制御出来ます
Notifies
設定ファイルが作成・変更された時だけサーバーをリスタートする事が良くあります、このような場合は以下のサンプルのように設定ファイルを作るresource内に notifies を書くことで、設定ファイルが作成・変更された時にサーバーのリスタートを実行できます。
ちなみに、service "mysql" do 〜 のactionがnothingになっているので、最初に service "mysql" do 〜 が実行される際には何も起きません。
service "mysql" do supports :status => true, :restart => true, :reload => true action :nothing end cookbook_file "/etc/mysql/conf.d/character_set_utf8.cnf" do source "character_set_utf8.cnf" owner 'root' group 'root' mode 0644 notifies :restart, 'service[mysql]', :immediately end
Ruby
recipe は Rubyのコードなので、当然 Rubyの式、変数、メソッド(関数)が使えます、何度も出てくるパス名や処理は変数やメソッドを使うとメンテナンス性の高い recipe になります。 ただし、resource内で呼び出すメソッドは libraries ディレクトリーに置きます。
repository > cookbook > recipe
複数のrecipe が集まり cookbook になり、複数の cookbook が集まりrepository になります。 したがって、一つ recipe ファイルはある程度の粒度(作業単位)で書き、cookbook, chef を分ける事が再利用性の高い recipe 作りに役立つと思います。
Chef Cookbooks
http://community.opscode.com に既に作られたrecipe (Cookbooks) がたくさんあります。naoyaさんの本にもChef初心者はCookbooks を使わずに自分で recipe を作った方が良いと書かれていますが、私もその通りだと思います。
一般的にCookbooksにあるものは汎用的で高機能ですが、自分専用の環境を作ったりする際には resouces や LWRP を使い recipe を作った方が勉強になるだけでなく、後々のバージョンアップ等でトラブルが起きにくいと思います。
私の勉強のために iptablesの設定に simple_iptables を使ってみましたが、自分でシンプルなrecipeを書いた場合に比べ良いのかは疑問です ;-)
ちなみに、Cookbooksは http://community.opscode.com/cookbooks ここで検索すると、評価(rating)やダウンロード数が判るので、どれを使うかの参考になると思います。
Postfix 2.10 から中継制限の設定が変わった (smtpd_recipient_restrictions はダメ)!
Ubuntu 13.04 を使ってRailsを動かす環境を作っていたのですが、ひさびさにはまり何時間もロスしてしまったので書いておきます。
Postfixで SMTPで認証を行い任意のIPアドレスからメール中継を可能にする設定は、2.09までは main.cf に
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
と指定します。検索すると、どこにもこの記述ができてきます。しかし Postfix 2.10 では 554 Relay access denied エラーになってしまいます・・・・
以前に設定した Ubuntu 12.04 (Postfix 2.09)の環境では上手く動作します。うぅぅぅ・・
いろいろと検索し、やっと http://www.postfix.org/SMTPD_ACCESS_README.html に答えが書いてありました
NOTE: Postfix versions before 2.10 did not have smtpd_relay_restrictions. They combined the mail relay and spam blocking policies, under smtpd_recipient_restrictions. ....
ということで、 smtpd_relay_restrictions を設定しましょう!
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination