人生の恥は書き捨て

プログラムとかいろいろ

chef solo(knife solo)でさくらのvpsに鍵認証ログインする

最近chefにちょっと触れたので、chefでのvpsのログインを書きました。

chefって何?とかインストールなどは↓が詳しいですね。
http://ch.nicovideo.jp/dwango-engineer/blomaga/ar311555

手順

・ユーザーの作成
・公開鍵をアップロードして鍵認証可能に
・ユーザーをwheelグループに追加
・sudoersを書き換えて、ユーザーに管理者権限を付与
sshd_configを書き替えて、rootログインを不可、パスワードログインを不可に

レシピ


user_name = "{ユーザー名}"
ssh_key = "{公開鍵(ssh-rsaほにゃらら)}"
home = "/home/#{user_name}"

#ユーザーの作成
user user_name do
	home home
	password "{opensslで作成したpassword}"
	action :create
end	

#公開鍵をアップロードして鍵認証可能に
directory "#{home}/.ssh" do
	owner user_name
	group user_name
end

authorized_keys_file = "#{home}/.ssh/authorized_keys"
file authorized_keys_file do
	owner user_name
	mode 0600
	content ssh_key
end

#ユーザーをwheelグループに追加
group "wheel" do
	action :modify
	members user_name
	append true
end

#ユーザーにroot権限を与える
template "sudoers" do
	path "/etc/sudoers"
	source "sudoers.erb"
	mode 0440
end

#rootログインを無効。パスワードでのログインを無効。
template "sshd_config" do
	path "/etc/ssh/sshd_config"
	source "sshd_config.erb"
	mode 0600
end

service "sshd" do
	action :restart
end

解説

ユーザーの作成

パスワードは

openssl passwd -1 "指定したいパスワード"

で作成したものを入力します。

公開鍵をアップロードして鍵認証可能に

.ssh/authorized_keysファイルを作って、中に公開鍵を書きます。

ユーザーにroot権限を与える、rootログインを無効。パスワードでのログインを無効。

これらの設定ファイルを書き換えるのには、chefのtemplateというresourceを使います。
templateでは
{chefのリポジトリ}/site-cookbooks/{cookbooks名}/templates/default
以下にファイルのテンプレートを置き、
これをサーバにアップロードします。
このとき、拡張子は.erbにします。

scpコマンドなどでサーバから、
設定ファイル(今回はsudoers、sshd_config)をローカルに持ってきて、
自分の思うように編集してください。

今回は
sudoers

# %wheel	ALL=(ALL)	ALL

%wheel	ALL=(ALL)	ALL


httpd_conf

#PermitRootLogin yes
PasswordAuthentication yes

PermitRootLogin no
PasswordAuthentication no

にそれぞれ書き換えました。

これで、chef一発で鍵認証できるようになりました。

knife solo cook root@IPアドレス

何度も(10回くらい)パスワード聞かれるのでめげずに入力してください。

おまけ

サーバ設定がうまくいかなかったり、やり直したかったりしたときに、
すぐサーバにOSを再インストールできるのがVPSの良い所ですが、
再インストール後、インストール前の状態のchefでサーバにknife solo prepareすると

ERROR: Net::SSH::HostKeyMismatch:

と出てしまうので、やり直すときは自分のパソコンの

~/.ssh/known_hosts

にあるsshの前の設定を消すのと

nodes/{ホスト名}.json

のファイルの削除をしてください。

入社の時に偉い人たちに言われた話

晴れて4月1日に新入社員になりました。

何年か後に入社当時を思い出せるように書き留めておく。

主なことは
・無駄な努力をしろ。
・自分の売り上げる1万円をただの一万円だと思うな。
・時々大きな視点でものを考えろ。
・肩こりは敵だ!気を付けろ。
・社会人生活を充実させたければ、自分で社畜の道を選べ!
・これからは会社の名前を背負う。あなたのブログもツイッター
・本をたくさん読め。一冊からワンフレーズ心に残る文章が見つけられれば、その本は読んだ価値がある。

以下、説明。

・無駄な努力をしろ。

努力を無駄かどうか判断するな。
その努力が無駄かどうかはその時点では誰にもわからない。
努力が無駄になることもある。
だが、会社を大きく動かすような仕事というのは、
能力が高い人間ではなく、とにかく努力する人間が成し遂げてきた。

・自分の売り上げる1万円をただの一万円だと思うな。

自分の努力で売上が1万増えたとする。
その1万は会社の売上を1万増やし、業界の規模を1万増やし、日本のGDPを1万増やす。
仕事をするということは、目の前の人を喜ばせることは当然だが、
自分の身の回りだけでなく、日本全体に元気を与えるようなすごいことである。

・時々大きな視点でものを考えろ。

一生懸命働いていると、不意に自分が何のためにそれをやっているのかわからなくなる時がある。
そういうときは、経済情勢、政治から人類の歴史といったようなずっと大きな枠組みで考える。

・肩こりは敵だ!気を付けろ。

体調が悪くなると気持ちも暗くなる。注意しろ。

・社会人生活を充実させたければ、自分で社畜の道を選べ!

社会人になった以上、生活の少なくとも半分、多ければ2/3ほどを仕事をして過ごすごとになる。
だから、社会人になった以上仕事を楽しまないと、生活を充実させることは難しい。
仕事を楽しむには、徹底的に頑張って取り組むこと。社畜を選べ!

・これからは会社の名前を背負う。あなたのブログもツイッター

炎上!ダメゼッタイ!

・本をたくさん読め。一冊からワンフレーズ心に残る文章が見つけられれば、その本は読んだ価値がある。

本を読め

array_intersectに配列突っ込んでるのにArray to string conversionって出る

PHPの関数の話です。

配列を比較して共通している要素だけ出力してくれるarray_intersectって関数があるんですが、

使って見たら、「Array to string conversion」ってエラーが出ました。

いやいや、ちゃんと配列入れてるしふざけんなよ。って思いました。

で、調べてみたんですが、この関数はネストしている配列には使えないようです。

多重構造の配列だとエラー吐くみたいですね、

FireBirdにCakePHPを入れたらWarning: SplFileInfo::openFileと出た

FireBird(http://www.firebird.jp/)というサーバーが、
独自SSL導入するのに安いってことで使ってみました。

独自ドメインを登録して、そのドメイン用のFTPアカウントが取得できたので、
そこにCakePHPをアップロードしたんですが、結果はエラー三昧^^;

具体的には、

Warning: SplFileInfo::openFile(/www/app/tmp/cache/persistent/cake_core_cake_console_)

とか

Warning: _cake_core_ cache was unable to write 'cake_dev_' to File cache in ~~~~~

みたいなやつがたくさん出てきました。

調べてみると
cache関連の書き込み権限が無いよということのようです。
なのでフォルダのパーミッションを変える必要がありました。

app > tmp
lib > Cake > Cache

辺りのパーミッションを変更したら何とかなりました。

ここら辺に関連する記事があります。

http://www.iwaking.com/20121210/740/
http://qiita.com/native/items/de42392d4449144c34ea

bakeするときなどにも書き込み権限が無いとエラーが出るようですね。


今日もまたどこの誰ともわからぬ方のブログに助けられました。

アイディアの新規性

やっべー!俺すげえこと思いついちゃったよー。

これは誰も気づいていない。新発見だー!!

そう思うことはよくあります。

卒論のテーマを考えている大学生とか、

新規事業のビジネスモデルを考えている起業家とか。

しかし、ごく少数の天才を除いては、その考えはまず間違いで、
実際は以下のどれかのパターンに当てはまるはずです。


本当はすでにある

「無いと思っていたものが本当はすでにあった」なんてのはよくある話です。

それが(物でも事でも)無いと証明するのは極めて難しい。

例えば宇宙人はいるか?と聞かれていないと断言するのはまあ無理でしょう。

自分が知らない→無い

ということにはなりません。



理由があって無い

理由があって無い場合、その理由は以下の二つです。

①必要ない、価値が無い
②必要がある、価値がある、しかしなんらかの理由により実現できていない

①の場合はしょうがありません。すっぱり忘れましょう。
②の場合は実現できていない理由を徹底的に解明しましょう。



ではどうすればいいのか?

上のことから、結局アイディアの新規性を主張する意味のある場面というのは、
何らかの理由があってアイディアが実現できていない時に、
そのアイディアが実現することを主張することとほぼ同義です。

つまりアイディアの新規性を主張するということは、

・以前まではそのアイディアにどんな困難があったのか
・それをどうやって解決したのか

の二つを主張するということです。


自分はごく少数の天才には入らない一般人なので、
このことをいつも忘れないようにしようと思います。

PHPでPaypalのExpress Checkout をやってみた

PHPPaypalのExpressCheckout(エクスプレスチェックアウト)をやってみました。


Paypalの決済機能は
・ウェブペイメント
・エクスプレスチェックアウト
の二つがある(他にもあるのかな?)ようですが、


ウェブペイメントは生成されたコードを貼るだけ!楽ちん!
エクスプレスチェックアウトはプログラムと連携して何でもできちゃう!
カートもできちゃう!さすが!!ってイメージです。


今回はテストアカウントを使って、ExpressCheckoutを試してみます。
本番環境では試してないので、これでオッケーなのかは知りません。

以下のサイトを参考にさせていただきました。

http://d.hatena.ne.jp/hrendoh/20110516/1305548398
http://blogs.yahoo.co.jp/echotechsoft/525533.html

手順

Paypalでアカウントを作る ←今回ははしょります
Paypal SandBox( https://developer.paypal.com/ ) でテストアカウントを作る
Paypal Integration Wizardに沿ってテストコードを作る
・ちょこちょこっと手直し


さっそくやっていきましょう。


Paypal SandBox でテストアカウントを作る

PaypalにはSandBoxというテスト環境があり、その中で、売り手のアカウント、
買い手のアカウントをそれぞれ作ることができます。

またアカウントそれぞれにカードの種類など細かく設定することも可能なようです。


まあ何はともあれアカウント作ればよろし

https://developer.paypal.com/ にアクセスして右上のSign Upからアカウントを作ります。

②Application > Sandbox accounts > Create Accountでアカウント作成

これでテストアカウントを作ることができます。


Paypal Integration Wizardに沿ってテストコードを作る

Paypal Integration Wizard ( https://devtools-paypal.com/integrationwizard/ )を使うと、
簡単にExpress Checkoutを使うためのコードができます。
というかコード作ってくれます。

Integration Wizardに沿って作っていくと以下の5つのファイルができます。

index.php
paypalfunctions.php
expresscheckout.php
review.php
order_confirm.php

決済の流れとしては

index.php
↓(post)
expresscheckout.php

paypal

review.php
↓(post)
paypal

order_confirm.php

という感じでpaypalのページに料金を送ったり、
paypalのページからその人のアドレスとか住所とかが返ってきたりします。
paypalfunctions.phpには関数が入ってます。

ということで作りましょう。

①Express Checkout PayPalを選択してGet Started

②イントロダクションがあるので興味がある人は見てください。(英語だけどね)

③Start Wizard!

④【1:code】

Shopping Cart Programming Language: PHP
Return URL : index.php
Cancel URL : review.php

あとはテキトーに

⑤【2:cart】
2aのところのコードをコピペしてindex.phpを作ります

expresscheckout.php
paypalfunctions.php
を保存します。あら便利。

paypalfunctions.php内の

$API_UserName="";
$API_Password="";
$API_Signature="";

をテストアカウントのものに書き換えましょう。
売り手のテストアカウントのProfile > API Credential のところを見ればよいです。

⑥【3:billing】
オプションです。
お客さんがpaypalについてあまり知らない人たちだと想定されるときは、
Paypal!って感じのページよりも、カード決済!って感じのページの方がいいですよね。
そういう時はここでページの表示の仕方をカスタマイズできます。
詳しいことは下のサイトに書いてあります。参考に
http://cmonos.jp/blog/2010011600/1.shtml

④【4:review】
4aのところのコードをコピペしてreview.phpを作ります

⑤【5:confirm】
5aのところのコードをコピペしてorder_confirm.phpを作ります

これでコードは一通り作ることができました。

ちょこちょこっと手直しして完成

ほとんど完成したのですが、そのままだとエラーが出るのでそこだけ直していきます。

①expresscheckout.phpのPayment_Amount

コードには

$paymentAmount = $_SESSION["Payment_Amount"];

と書いてあるんですが、そもそもセッションに入れてないので

$_SESSION["Payment_Amount"] = $_POST["Payment_Amount"];
$paymentAmount = $_SESSION["Payment_Amount"];

と書き換えるとよいですね

②review.phpで少し、order_confirm.phpでたくさんエラーが出る

$resArrayの配列の中のキーが変わっているみたいです。
面倒ですが、var_dump($resArray)して直してください。

まとめ

ここにこれらのコードをほぼ丸ごと乗っけてくれているゴッドがいるので貼っておきます。
https://github.com/hrendoh/PayPal-Express-Checkout-example
ちょっと古いですが、大体あってます。

paypal便利ですね~。

データベースシャーディング メモ

いつもどういう意味だったかな?って思うんだけどすぐ忘れるので。

http://d.hatena.ne.jp/abcb2/20111010/1318224266

日本語に訳すと(ガラスや貝殻の) 「破片」といったような意味
データベースをshardに分解して複数のサーバに分散して運用するのがDB sharding
データベースパーティショニングとも言えるのかしら?
単一のサーバのDBテーブルを複数のファイルに分割するのをパーティショニングとも呼ぶが、「パーティショニング」という言葉を使ってDB shardingのことを言っているブログ等もちらほら見かけます。
より突っ込んでみたい人は「shared nothing」でぐぐってネ。