拡張子を指定してgit grep

そのままgrepかけるとログファイルとか引っかかることがあったので、このような感じで拡張子指定できるようです。否定はないのかな。

git grep foobar -- "*.php"

Ubuntu12.04 LTSをインストールしたLenovo G500を再起動するたびに画面が真っ暗になる件

以前Linux専用機として運用するためにLenovo G500を購入して、Ubuntu 12.04 LTSを入れたのですが、再起動するたびに画面が真っ暗になって、その度バックライトの輝度を最大まで上げていたのですが、いい加減窓からマシンをかなぐり捨てたいぐらいにいやになってきたところです。

Ubuntuがいけないのかと思って、その他のディストリビューションを検討したのですが、ラップトップマシンに最適なディストリを考えたときCentOSDebianSlackwareFedoraもSLもどうにも、、、なんかなぁという感じでした。だいぶUbuntuも設定してしまったのでまた他の入れなおすのは気が重いです。

なのでUbuntuでどうにかならないか検索してみました。
調べてみると

# echo xxx > /sys/class/backlight/acpi_video0/brightness

で輝度を調整できるみたいです。で、G500の輝度のMAX値を調べると

# cat /sys/class/backlight/acpi_video0/brightness
100

なので

# echo 100 > /sys/class/backlight/acpi_video0/brightness

として最大の明るさに設定しました。即座に反映されます。でもこのままでは再起動したらきれいさっぱりリセットされてしまうので /etc/rc.local に記述します。実行権限がついていることを確認して

echo 100 > /sys/class/backlight/acpi_video0/brightness
exit 0

とします。exit 0 の前に入れるのがポイントです。

そして再起動。一回目はなぜか真っ暗になってしまったので、なんだよーと思いながら sleep 5 とか入れたらディスプレイマネージャが立ち上がらなくなってしまいました。なので sleep 5 を削除して、改めて再起動したら今度は反映されました。なんだったんだろう。。。

それにしてもこのマシン、テンキー邪魔だな・・・。エンターキー小さいし・・・。

参考文献

AWS SDK for PHP 2を使ってEC2のインスタンスを起動してみる

Amazon Web Services ガイドブックのEC2セットアップスクリプトの内容をAWS SDK for PHP 2用に書きなおしてみました。

動くようになるまで結構大変でした。。。
ただ、APIから仮想サーバー立ち上げられるってすごいなあと改めて実感。
S3のときなどと違ってEC2は高価だから心臓に悪いですね。
こういうのいじるときはこまめにアカウントアクティビティチェックして、開放漏れのIPや無駄にインスタンス、スペックの高いインスタンスを知らずに立ち上げてしまっていないか注意しないといけないですね。

細かいセットアップについては

にゆずります。

では以下がスクリプトとなります。

<?php
error_reporting(E_ALL);
// Composer
require_once('vendor/autoload.php');
use Aws\Ec2\Ec2Client;
// AWSアクセストークン
$config = array(
'key'    => 'AKIAIOSFODNN7EXAMPLE',
'secret' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
// 東京リージョン指定
'region' => \Aws\Common\Enum\Region::AP_NORTHEAST_1,
);
$ec2 = Ec2Client::factory($config);
try {
$options = array(
// Amazon LinuxのAMIを使う
'ImageId' => 'ami-b1fe9bb0',
// インスタンス1個
'MinCount' => 1,
'MaxCount' => 1,
// キーを指定
'KeyName' => 'securekey',
// セキュリティグループを指定
'SecurityGroups' => array(
'webserver' // sg-134678
),
// インスタンスタイプはマイクロインスタンスを立ち上げる
'InstanceType' => 't1.micro',
);
$result = $ec2->RunInstances($options);
} catch (Exception $ex) {
exit("Instance Launch failed.: " . $ex->getMessage() . "\n");
}
// インスタンス情報を取得
$instance = $result['Instances'][0];
$instanceId = $instance['InstanceId'];
$availabilityZone = $instance['Placement']['AvailabilityZone'];
echo "Instance ID: $instanceId\n";
echo "Availability Zone: $availabilityZone\n";
// EC2インスタンスの準備ができるのを待つ
do {
$result = $ec2->describeInstances(array(
'InstanceIds' => array(
$instanceId
)
));
$status = $result['Reservations'][0]['Instances'][0]['State']['Name'];
$runnning = ($status == 'running');
if (!$runnning) {
echo "instance is currently in $status, waiting 10 seconds.\n";
sleep(10);
}
} while(!$runnning);
try {
// ElasticIPを割り当て
$result = $ec2->allocateAddress();
$publicIp = $result['PublicIp'];
echo "allocate IP Address: $publicIp\n";
} catch (Exception $ex) {
exit("Allocate IP Address failed. " . $ex->getMessage() . "\n");
}
try {
// ElasticIPをインスタンスにアタッチ
$ec2->associateAddress(array(
'InstanceId' => $instanceId,
'PublicIp' => $publicIp,
));
echo "Associated IP address : ${publicIp} to ${instanceId}\n";
} catch (Exception $ex) {
exit("IP Address Association failed. " . $ex->getMessage() . "\n");
}
try {
// 先ほど得られたアベイラビリティゾーンに1GiBのボリュームを2つ作成
$res1 = $ec2->createVolume(array(
'Size' => 1,
'AvailabilityZone' => $availabilityZone,
));
$res2 = $ec2->createVolume(array(
'Size' => 1,
'AvailabilityZone' => $availabilityZone,
));
$volumeId1 = $res1['VolumeId'];
$volumeId2 = $res2['VolumeId'];
echo "EBS Volume: $volumeId1, $volumeId2 created.\n";
} catch (Exception $ex) {
exit("EBS Volume create failed. " . $ex->getMessage() . "\n");
}
// ボリュームが使えるようになるまで待つ
do {
$result = $ec2->describeVolumes(array(
'VolumeIds' => array(
$volumeId1, $volumeId2
)
));
$status1 = $result['Volumes'][0]['State'];
$status2 = $result['Volumes'][1]['State'];
$volumeReady = ($status1 == 'available' && $status2 == 'available');
if (!$volumeReady) {
echo "volumes are currently in ($status1, $status2), waiting 10 seconds.\n";
sleep(10);
}
} while(!$volumeReady);
try {
// ボリュームをインスタンスにアタッチ
$res1 = $ec2->attachVolume(array(
'VolumeId' => $volumeId1,
'InstanceId' => $instanceId,
'Device' => '/dev/sdf',
));
$res2 = $ec2->attachVolume(array(
'VolumeId' => $volumeId2,
'InstanceId' => $instanceId,
'Device' => '/dev/sdg',
));
echo "Volume $volumeId1, $volumeId2 has been attached successfully.\n";
} catch (Exception $ex) {
exit("EBS Attache failed. " . $ex->getMessage() . "\n");
}
echo "Finished!!\n";

で、出力は以下のようになります。

$ php ec2_setup.php
Instance ID: i-11223344
Availability Zone: ap-northeast-1c
instance is currently in pending, waiting 10 seconds.
instance is currently in pending, waiting 10 seconds.
allocate IP Address: 54.111.95.222
Associated IP address : 54.111.95.222 to i-11223344
EBS Volume: vol-12345ba, vol-653ac created.
volumes are currently in (creating, creating), waiting 10 seconds.
Volume vol-12345ba, vol-653ac has been attached successfully.
Finished!!

AWS Management Consoleで確認したらちゃんとインスタンスが立ち上がってElasticIPがアタッチ、ボリュームもきちんとアタッチされていました。いいこいいこ。

参考文献

Amazon Route53の設定管理ツールのRoadworkerを使ってみた

Amazon Route53をRuby DSL設定ファイルで管理するRuby製のツール。
もちろんDSLで記述されているのでバージョン管理システムとの相性も抜群です。

環境

インストール

Gemfile

僕はGemfileを用意します。

source "https://rubygems.org"
gem 'roadworker'

そして

$ bundle install --path ~/vendor/bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Using json (1.8.1)
Using mini_portile (0.5.2)
Using nokogiri (1.6.0)
Using uuidtools (2.1.4)
Installing aws-sdk (1.29.1)
Using systemu (2.5.2)
Installing macaddr (1.6.1)
Installing net-dns (0.8.0)
Installing tins (0.13.1)
Installing term-ansicolor (1.2.2)
Installing uuid (2.3.7)
Installing roadworker (0.3.10)
Using bundler (1.3.5)
Your bundle is complete!
It was installed into /Users/noguchiwataru/vendor/bundle

特にhomebrewでインストールするパッケージが必要なわけでもなくインストールできました。

$ bundle exec roadwork --version
roadwork 0.3.10

使う

当然ですが、AWS APIアクセスのためのアクセスキーに関する環境変数が事前にセットアップされている必要があります。

export AWS_ACCESS_KEY_ID='...'
export AWS_SECRET_ACCESS_KEY='...'

初期設定

Routefileに現在管理されている Hosted Zone の設定を出力する。

$ bundle exec roadwork -e -o Routefile
Export Route53 to `Routefile

中身はどうなっているか

RubyのDSLになっています。

hosted_zone "example.com." do
rrset "example.com.", "A" do
ttl 300
resource_records(
"11.33.99.91"
)
end
rrset "*.example.com.", "A" do
ttl 300
resource_records(
"11.33.99.91"
)
end
rrset "yunocchi.example.com.", "CNAME" do
ttl 300
resource_records(
"hatenablog.com"
)
end
rrset "miyako.example.com.", "A" do
ttl 300
resource_records(
"111.222.333.444"
)
end
rrset "nori.example.com.", "CNAME" do
ttl 300
resource_records(
"domains.tumblr.com"
)
end
end

適用してみる

まずは --dry-run してみる。

$ bundle exec roadwork --dry-run -a -f Routefile
Apply `Routefile` to Route53 (dry-run)
Update ResourceRecordSet: example.com. A (dry-run)
set resource_records=[{:value=>"11.33.99.91"}] (dry-run)
Update ResourceRecordSet: *.example.com. A (dry-run)
set resource_records=[{:value=>"11.33.99.91"}] (dry-run)
No change

問題なければ適用。
2回目の実行ではちゃんと変更なしとなっている。
冪等性ばんざい。

$ bundle exec roadwork -a -f Routefile
Apply `Routefile` to Route53
Update ResourceRecordSet: pg1x.com. A
set resource_records=[{:value=>"11.33.99.91"}]
Update ResourceRecordSet: *.pg1x.com. A
set resource_records=[{:value=>"11.33.99.91"}]
$ bundle exec roadwork -a -f Routefile
Apply `Routefile` to Route53
No change

AWS Management Console上で見てみるとちゃんと適用できている。
すばらしい。

いじわるしてみる

AWS Management Console上でレコードを1行追加してみました。
本来ならRoutefile上で管理するつもりなので、あってはならないことです。
まあ、コンテキストによってはAWS Management Console上で変更したやつはRoutefileにも反映してほしい気もしますが、
そんな虫のいい話はないですね。
なので、ここではRoutefileにないレコードは消えてくれることを期待します。

$ bundle exec roadwork --dry-run -a -f Routefile
Apply `Routefile` to Route53 (dry-run)
Delete ResourceRecordSet: localns.pg1x.com. A (dry-run)
No change

余計な行が増えているよと教えてくれました。
--dry-run を消して適用すればOKです。
AWS Management Console上からはきれいさっぱり消えています。

参考サイト

クラスメソッドさんの説明がとても参考になりました。

Gemfile初期化

いつも Gemfile のテンプレ手作業でコピーしてた。
コマンド一発で生成できるのしらなかった。。。

$ bundle init
Writing new Gemfile to /Users/noguchiwataru/Documents/repositories/bitbucket/roadworker-wnoguchi/Gemfile

で、出力内容は以下のようになる。

$ cat Gemfile
# A sample Gemfile
source "https://rubygems.org"
# gem "rails"

GitHubを2段階認証にしたときのSourceTreeの対応方法

当然ですが、GitHubに2段階認証を設定したらSourceTreeのGitHub連携機能が使えなくなりました。
その対応方法。

  1. 設定画面に行きます。
  2. サイドメニューの Applications をクリックします。
  3. Personal Access Tokens の Create new token で好きなアプリ名を入れて、トークンを生成します。
  4. あとは SourceTree のGitHubアカウント欄のパスワードにそのトークンを設定すればOK。

参考サイト

A conflicting conditional operation is currently in progress against this resource.

以前間違ってオレゴン州に作成してしまったバケットを削除して、AWS API経由で同じ名前で東京リージョンに新たにバケットを作成しようとしたらエラーになって怒られました。

PHP Fatal error:  Uncaught Aws\S3\Exception\OperationAbortedException: AWS Error Code: OperationAborted, Status Code: 409, AWS Request ID: XXXXXXXXXXXXXXXX, AWS Error Type: client, AWS Error Message: A conflicting conditional operation is currently in progress against this resource. Please try again., User-Agent: aws-sdk-php2/2.4.11 Guzzle/3.7.4 curl/7.19.7 PHP/5.3.3
thrown in /vagrant/src/s3/vendor/aws/aws-sdk-php/src/Aws/Common/Exception/Name

イマイチよくわからなくていろいろ調べたところ

というエントリがひっかかりました。
どうもすぐにバケットを作りなおそうとしたのが原因ぽいです。
削除のオペレーションをやってもすぐにはバックエンドのトランザクションは完了されないみたいで、数時間置いてからもう一回やり直してくれとのことでした。

なのでその日は寝て、次の日にやったらうまくできました。

Composerを使ってみた

PHP版のBundlerみたいなもの。
最近この類の異常に目にするようになりました。
AWSの入門記事でも書きましたが、Composerに関する部分だけ抜粋してまとめます。
なので重複する文面が多いです。

Composerのインストール

curl -sS http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...
Composer successfully installed to: /var/www/aws/s3/composer.phar
Use it: php composer.phar

ここで composer.phar がカレントに作成されます。

composer.json の作成

jsonファイルを作成します。Gemfileみたいなものです。

{
"require": {
"aws/aws-sdk-php": "*"
}
}

Composerで依存パッケージのインストール

ここで composer.json に記述された依存パッケージがインストールされる。
カレントディレクトリの vendor ディレクトリにインストールされます。 .gitignorecomposer.phar とか vendor/ は外したほうがいいかもしれませんね。

$ php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.4.0)
Loading from cache
- Installing guzzle/guzzle (v3.7.4)
Loading from cache
- Installing aws/aws-sdk-php (2.4.11)
Loading from cache
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

不足しているシステムパッケージがあったらyumとapt-getを使ってインストールします。

さらにパッケージ追加

今度はlog4phpを使いたくなったとしましょう。
composer.json は以下のようになります。

{
"require": {
"aws/aws-sdk-php": "*",
"apache/log4php": "2.3.0"
}
}

bundle installみたいな感覚でやってみましたが

$ php composer.phar install
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files

lockファイルと一致しないと怒られてしまいました。
こういうときはupdateしないといけないみたいです。
ただ、

php composer.phar update

とするとバージョンがロックされたものについてまでアップデートがかかってしまうので、今回はlog4phpに関係するものだけインストールしてほしいので以下の様な感じにします。

php composer.phar update apache/log4php
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing apache/log4php (2.3.0)
Cloning 8c6df2481cd68d0d211d38f700406c5f0a9de0c2
Writing lock file
Generating autoload files

実際にアプリで使ってみる

ここでは追加でインストールしたlog4phpを使っています。
AWS SDKは使っていません。ゴメンなさい。
カレントディレクトリに vendor ディレクトリがあることを確認してください。

<?php
// composer.json に記述されたパッケージがインストールされた
// Vendorディレクトリの中身をロードするおまじない
require 'vendor/autoload.php';
$log = Logger::getLogger("hogehoge");
$log->info("Hello, World!");

実行してみます。
今回はコマンドラインです。

$ php hello_composer.php
INFO - Hello, World!

参考サイト

  1. gist:7838085
  2. Composer: how can I install another dependency without updating old ones? – Stack Overflow
  3. PHP – composer の「Warning: The lock file is not up to date ~」 – Qiita [キータ]
  4. Composer

AWS SDK for PHP 2 入門(Composer編)

今年の春頃に無料枠で契約してそのままになってたAWSをもう少し本格的に習得してみようと最近しこしこと本やらネットやらで勉強していました。
バックアップとかスケールアウト、障害対応であまり頭を悩ませなくて良さそうなので最近とても魅力的に見える。
インフラまわりの管理は意外と大変なんですよね・・・。

とりあえずAWS Management ConsoleからEC2のインスタンスを立ち上げたり、S3にファイルをアップロードしたり、Route53でDNSゾーンを管理したりしてみてそれっぽく使うことはできるようになったけど、どうも何かが違う気がする。
機能が多すぎて使いどころや、定石みたいなのがわからないので体系的な知識を得るために本を購入してみました。
こういうのから基本的な考え方を吸収していけるのはいいね。

やっぱりAWSの着目すべき点はインフラに統合されたAPIが提供されているところにあるんですかね。
実際にS3のAPI叩いてみたけど、少しずつ面白さがわかってきた。少しだけね。

躓いたところ

さて、一番最初のサンプルを作成しようと思って、一番最初に躓いたのですが、本書ではAWS SDK for PHPをインストールするように言われているのですが、どこからダウンロードしたらいいのかよくわかりませんでした。

ここで aws.phar というファイルがダウンロードできるのですが、これをどうしたらいいのかわからない・・・。

こちらも aws.phar。pharという拡張子はPHP Archiveの略のようなのですが、どうもこのファイルをインクルードして使うようです。

いろいろ試行錯誤してやっとネットに掲載されていた簡単なサンプルが動くようになったのですが、どうも本のサンプルと書き方がぜんぜん違うように思えて、よくよく調べてみたら本に載っているのはバージョン1のもののようです。

バージョン1で合わせてサンプルをやっていってもいいのですが、どうせ今後は2系にシフトしていくので、2系のイディオムに読み替えながら進むようにしました。

上のようにpharをインクルードしてもいいのですが、AWS SDK for PHP 2開発ではComposerを併用して開発するのが推奨されているようなので、それに従います。

それでは始まり始まり。

環境

VagrantとChef Soloあたりでちゃちゃっと作れちゃうと思います。
それか普通にEC2のインスタンスや他の既成の仮想マシンにインストールすればいいと思います。

  • CentOS6.4 x64 または Ubuntu 12.04 LTS
  • Apache2
  • PHP5.3.3

Composerのインストール

ComposerはRailsのBundlerみたいなもんですね。

curl -s http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...
Composer successfully installed to: /var/www/aws/s3/composer.phar
Use it: php composer.phar

ここで composer.phar がカレントに作成されます。

composer.json の作成

jsonファイルを作成します。Gemfileみたいなものです。

{
"require": {
"aws/aws-sdk-php": "*"
}
}

Composerで依存パッケージのインストール

ここで composer.json に記述された依存パッケージがインストールされる。
カレントディレクトリの vendor ディレクトリにインストールされます。 .gitignorecomposer.phar とか vendor/ は外したほうがいいかもしれませんね。

$ php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.3.7)
Downloading: 100%
- Installing guzzle/guzzle (v3.7.4)
Downloading: 100%
- Installing aws/aws-sdk-php (2.4.11)
Downloading: 100%
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

不足しているシステムパッケージがあったらyumとapt-getを使ってインストールします。
たぶんUbuntuの場合そのままだとエラーになると思います。詳しくは下のトラブルシューティングへ。

最初のAWS SDK for PHP 2プログラミング

ここではバケットの一覧表示をするプログラムを書いてみたいと思います。
プログラムは以下のサンプルを参考にさせていただきました。

include/awssecure.inc.php

AWSのアクセスキーを設定します。これは漏れたらやばいので別ファイルとして管理するといいです。
最初アクセストークンはどこで取得すればいいんだろう?って思っていたのですが、以下で取得するようです。

ただ、警告にもあるとおり、ここで発行されるアクセストークンはAWSアカウントに直接紐づく rootユーザーみたいなとんでもない特権レベル を持っているので、あんまりおすすめされません。

なので、IAM(Identity and Access Management)でユーザーとグループを作成してそこでクレデンシャルを発行するのがスマートなようです。

ちなみに、1ユーザーあたり2つのクレデンシャルしか発行できないみたいです。

<?php
// AWSアクセストークン
$config = array(
'key'    => 'AKIAIOSFODNN7EXAMPLE',
'secret' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
);

gitで管理するときはこのファイルのトラッキングを外しましょう。
ただ、テンプレート的なファイルだけは残っていてほしいのでインデックスから無視するだけにします。

git update-index --skip-worktree include/awssecure.inc.php

list_buckets.php

以下が本命のプログラムとなります。

<?php
error_reporting(E_ALL);
// Load Composer Vendor Modules
require_once('vendor/autoload.php');
// AWS Credential
require_once('include/awssecure.inc.php');
use Aws\S3\S3Client;
$s3 = S3Client::factory($config);
$blist = $s3->listBuckets();
foreach ($blist['Buckets'] as $b)
{
echo "${b['Name']}: created at ${b['CreationDate']}\n";
}

実行してみる

コマンドラインからでも、ブラウザ経由でもどっちでも大丈夫だと思います。

$ php list_buckets.php
hogehogehoge: created at 2013-11-22T10:50:47.000Z
sitepoint-aws-cloud-book-wnoguchi: created at 2013-12-04T23:06:19.000Z
blhablahblah: created at 2013-12-02T03:48:40.000Z
foobarbar: created at 2013-11-09T12:13:07.000Z

これでOKです。

とりあえずAWS SDKを使ったプログラミングを始めようと思って躓いたところをまとめてみました。

トラブルシューティング

CentOSのエラー

以下は実際にXMLがからむAWS SDKを呼び出している時に発生していた気がします。

php create_bucket.php ppp
PHP Fatal error:  Class 'XMLWriter' not found in /vagrant/src/s3/vendor/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php on line 201

以下のようにして対応

yum -y install php-xml

Ubuntuのエラー

Composerの依存パッケージをインストールしようとしたらエラーになりました。

php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- aws/aws-sdk-php 2.4.0 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.1 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.10 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.11 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.2 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.3 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.4 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.5 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.6 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.7 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.8 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.9 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.3.4 requires guzzle/guzzle ~3.6.0 -> satisfiable by guzzle/guzzle[v3.6.0].
- aws/aws-sdk-php 2.3.1 requires guzzle/guzzle ~3.4.3 -> satisfiable by guzzle/guzzle[v3.4.3].
- aws/aws-sdk-php 2.3.2 requires guzzle/guzzle >=3.4.3,<4 -> satisfiable by guzzle/guzzle[v3.4.3, v3.5.0, v3.6.0, v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.3.3 requires guzzle/guzzle >=3.4.3,<4 -> satisfiable by guzzle/guzzle[v3.4.3, v3.5.0, v3.6.0, v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.3.0 requires guzzle/guzzle ~3.4.1 -> satisfiable by guzzle/guzzle[v3.4.1, v3.4.2, v3.4.3].
- aws/aws-sdk-php 2.2.0 requires guzzle/guzzle ~3.3.0 -> satisfiable by guzzle/guzzle[v3.3.0, v3.3.1].
- aws/aws-sdk-php 2.2.1 requires guzzle/guzzle ~3.3.0 -> satisfiable by guzzle/guzzle[v3.3.0, v3.3.1].
- aws/aws-sdk-php 2.1.1 requires guzzle/guzzle ~3.2.0 -> satisfiable by guzzle/guzzle[v3.2.0].
- aws/aws-sdk-php 2.1.2 requires guzzle/guzzle ~3.2.0 -> satisfiable by guzzle/guzzle[v3.2.0].
- aws/aws-sdk-php 2.1.0 requires guzzle/guzzle ~3.1.2 -> satisfiable by guzzle/guzzle[v3.1.2].
- aws/aws-sdk-php 2.0.0 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- aws/aws-sdk-php 2.0.1 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- aws/aws-sdk-php 2.0.2 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- aws/aws-sdk-php 2.0.3 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- guzzle/guzzle v3.7.4 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.6.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.5.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.4.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.4.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.4.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.3.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.3.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.2.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.1.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.7 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.6 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.5 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.4 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- Installation request for aws/aws-sdk-php * -> satisfiable by aws/aws-sdk-php[2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.1.0, 2.1.1, 2.1.2, 2.2.0, 2.2.1, 2.3.0, 2.3.1, 2.3.2, 2.3.3, 2.3.4, 2.4.0, 2.4.1, 2.4.10, 2.4.11, 2.4.2, 2.4.3, 2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8, 2.4.9].

PHPcurl拡張がないって言ってる気がします。

sudo apt-get -y install php5-curl

もういっかい。

php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.3.7)
Downloading: 100%
- Installing guzzle/guzzle (v3.7.4)
Downloading: 100%
- Installing aws/aws-sdk-php (2.4.11)
Downloading: 100%
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

うまくいきました。

参考サイト

S3開発に関しては以下のドキュメントが良さそう。

その他。

参考文献

msysGitのマルチバイトファイルパス

つかれた。
msysGitであげた不具合のお返事がなくなって、正直みんなこのあたりで困ってないんだろうなー、パッチ送ってもOS依存の PATH_MAX まわりがからんでるから容易には取り込まれないだろうし、3流プログラマのぼくには修正は難しくて、とりあえず最適化無効にしてビルドすれば動くからそれで諦めてたんだけど、最近だれかがまたパッチ投げてくれたっぽい。末尾をゼロ埋めする strlcpy を使うようにしてるみたい。ものすごい長い英文で議論が始まってついていけないので、遠くから見る。Reported-byがついてたから微妙に嬉しい。
うむ、つかれた。