WEBサーバーとDBサーバーは分けるべきか
http://anond.hatelabo.jp/20130922195049
読んだ。
こうやって自分でサービスを作って運用している人の軌跡を見るのが大好きです。
ノウハウを吸収できるのはもちらん、僕自身のやる気アップにもなるし。
で、
あと現在WEBサーバーとDBサーバーを分けていますがサーバー関係に詳しい知人に分ける必要はないと言われました。
むしろわけない方がいいと。
詳しい方いらっしゃいましたら教えて頂けたら有難いです
について、これは本当と言えば本当ですが状況によっては嘘になるかと。
ある程度の規模(=WEB鯖一台で対応できるレベル)まではオールインワンなサーバーのほうがいいです。
WEBサーバーとDBサーバーが物理的に離れているとその間の通信に時間がかかるためです。
しかしその『ある程度の規模』を超えてくるとスケールしなくちゃならないので、そうなるとWEBサーバーとDBサーバーを分ける必要があります。
つまり
- ある程度の規模まで・・・オールインワンサーバー
- それ以上の規模 ・・・分ける必要あり
です。
この元増田のサイトはこれからもどんどんアクセス上がっていきそうなので、今後WEBサーバーを増やしていくことを見据えて現状のWEBサーバーとDBサーバーを分けた構成のままでいいんじゃないかなと思います。
転出届を郵送でやった
先日以前住んでいた川崎の部屋の更新があったのでそのタイミングで実家のある新潟へ引っ越してきたのですが、転出届の手続きをしてくるのを忘れてしまいました・・・。
転出届を知らない人のために説明すると、引越しで住所を変更するためには
- 引越す前の管轄の区(市)役所から転出証明書をもらう。
- 引越し後の管轄の区(市)役所へ転入の手続きをする。
という段階が必要で、これの転出の手続きを忘れてきたのでした。
引越し後だけでいいじゃん!役所間で連携とっていい感じにやっておいてよ!と思うのですがどうしても必要らしいです。
また新幹線代1万円払って川崎まで行くのはだるいなーと思ってたらこれ郵送でできるらしいのでやってみました。
・転出届(市外へ転出する場合の届出)を郵便・信書便で行う場合の方法について知りたい。
↑に貼ったリンクは川崎市のものですが、『転出届 郵送 [市町村名]』とかで検索すればきっと出てくると思います。
必要なもの
- 転出証明書の申請書
- 本人確認書類
- 返信用封筒
大まかに上記のモノが必要です。
申請書はレポート用紙のようなものでOKだったり、本人確認書類は写真付きのものがない場合2種類必要だったりしますが細かい説明は省きます。
それぞれの市町村のホームページを見てください。
WordPressからはてなブログに移行した
どうもnickです。
元々はてなブログを使ってたんですが、今年の4月頃にWordpress使いたいと思ってしばらくWordpressに浮気してました。
が!Wordpress使うのが面倒ではてなブログに帰ってきました。
「オリジナルデザインのブログにしたい」とか「オリジナルの機能を入れたい」なんて志があるなら自由度の高いWordpressはいいんですが、そんなものは無くただ備忘録に使ったり思ったこと書きなぐれればOKな場合はWordpressの自由度は必要ありませんでした。
あとサーバーも自分のVPS鯖を使ってるので負荷とかも気にしてしまうし(これはwordpress.comとか使えば考え無くて済むとは思うけど)
とにかく何でもできてしまう分、書くことに集中できないなーという印象でした。
インポート・エクスポート手順
一応記事を移行した時の手順も残しておきます。
- Wordpress管理画面の『エキスポート』からxml形式のファイルをダウンロード。
- ダウンロードしたファイルをこのサービスでMT形式に変換。
- はてなブログ管理画面の『インポート』の『Movable Type形式』タブから先程のファイルを指定してアップロード。
- 文字コードの指定をすればインポート完了です。
ポイントはwordpress形式のファイルだとそのままインポートできないのでMT形式にする必要があるってくらいです。
あと記事をインポートしたら今まではてなブログで書いてた記事が消えちゃったりしないかなと不安になりましたが大丈夫でした。
それとインポート後にインポートを取り消す機能もあるので間違って変な物をインポートしてしまっても気軽に戻せそうでした。
ワードプレス側からいい感じにリダイレクトとかできたらいいなーとも思ったけどそれはめんどそうだったので諦めた。
そんな感じです。
macにRuby2.0を入れる
Ruby2.0を入れたのでその工程をメモっておきます。
ちなみにbrewを使うので入ってない人は事前にインストールする必要があります。
rbenv, ruby-buildのインストール
$ brew install rbenv
$ brew install ruby-build
環境変数の設定
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
Ruby2.0.0のインストール
$ rbenv install 2.0.0-p0
Downloading ruby-2.0.0-p0.tar.gz...
Installing ruby-2.0.0-p0...
BUILD FAILED
Inspect or clean up the working tree at /var/folders/mk/5hg0wh3d0sx_2nyl84wm7dq80000gn/T/ruby-build.20130612213723.41748
Results logged to /var/folders/mk/5hg0wh3d0sx_2nyl84wm7dq80000gn/T/ruby-build.20130612213723.41748.log
Last 10 log lines:
installing default gems: /Users/nick/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
bigdecimal 1.2.0
io-console 0.4.2
json 1.7.7
minitest 4.3.2
psych 2.0.0
rake 0.9.6
rdoc 4.0.0
test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?
エラーでる。
ググってみたら依存ライブラリを指定してインストールする必要があるらしい。
依存ライブラリのインストール
ということでインストール
$ brew install readline
$ brew install openssl
依存ライブラリを指定してRuby2.0.0のインストール
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p0
今度はうまくいった。
一応入ってるか確認.
$ rbenv versions
* system (set by /Users/username/.rbenv/version)
2.0.0-p0
入ってるみたい。
インストール後の反映
$ rbenv rehash
通常使うRubyを変更
$ rbenv global 2.0.0-p0
バージョン変わってるか確認
$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin11.4.2]
大丈夫そう。
apacheでメモリリークしないようにするチューニング
今日のことなんですが、運用しているWebサービスに集中したアクセスがあって繋がりづらい自体に陥ってしまいました(SSHすらも) psコマンドで確認したところhttpdプロセスがメモリをもりもり使っててメモリリーク(メモリリークとは違うけど、まあ今回はそう呼ぶ)していたようで、これはよくないとApacheのチューニングを行ったのでその内容を記事にしておきます。
なにをしたか
httpdプロセスが立ち上がりすぎてメモリが溢れないよう、立ち上がるプロセス量を調整しました。
↓この記事を参考にチューニングしました。
Apacheに割り当て可能なメモリ量を調べる
参考記事では「OS起動直後にfreeコマンドを打てばわかるよ」というような事を言っていましたが、現在サービス運用中で再起動はしたくないので以下の方法で割り当て量を出しました。
a,VPSに積まれたメモリは2GB
b,システムが現在使っているメモリ量は約1.5GB。(freeコマンドのusedの値)
c,現在Apacheが使用しているメモリ総量は約1GB。
※Apacheが使用しているメモリ総量はこれ↓で計算。
# ps aux | grep [h]ttpd | grep [a]pache | awk 'BEGIN{x=0}{x+=$6}END{ print x }' 1026700
つまり Apache以外が使っているメモリは 1.5GB(b)-1GB(c)=0.5GB なので 使えるメモリ量は 2GB(a)-0.5GB=1.5GB=1536MB としました。
Apacheの最大子プロセス数を調べる
まずはApacheの子プロセスあたりの平均メモリ使用量を計算。
# ps aux | grep [h]ttpd | grep [a]pache | awk 'BEGIN{x=0}{x+=$6}END{ print x/NR }' 51255
子プロセス一つあたり51255(約52MB)使っているみたい。 なので、Apacheの最大子プロセス数は
Apacheの最大子プロセス数 : P = 1536MB(Apacheに割り当て可能なメモリ量) / 52MB(Apacheの子プロセスあたりの平均メモリ使用量)
で P = 29.538461・・・・ となります。
Apacheの設定変更
ここまでで調べた値を元にhttpd.confを編集します。 参考記事では下記の内容で設定するのをオススメしていましたが
<IfModule prefork.c> StartServers P×5/256 MinSpareServers P×5/256 MaxSpareServers P×10/256 ServerLimit P MaxClients P MaxRequestsPerChild 1000 </IfModule>
それで計算するとこうなります。
<IfModule prefork.c> StartServers 1 MinSpareServers 1 MaxSpareServers 2 ServerLimit 30 MaxClients 30 MaxRequestsPerChild 1000 </IfModule>
うーん、なんか少なすぎるような。。 適当にもう少し増やしてみます。
<IfModule prefork.c> StartServers 3 MinSpareServers 3 MaxSpareServers 7 ServerLimit 30 MaxClients 30 MaxRequestsPerChild 1000 </IfModule>
ほんと適当です。根拠無いです。
おそらく ServerLimit と MaxClients さえ変えなければそこまでひどい事にはならないと思うので。
と、今回はこんな感じで設定してみました。これでメモリリーク起きなくなるはず。
jetpackのパブリサイズ共有で、メッセージにプレフィックスを付ける方法
jetpackのパブリサイズ共有を使って記事の更新をTwitterやFacebookに共有してるのですが、デフォルトの文言がタイトルとURLだけで分かりづらいので先頭に【ブログ更新】みたいなプレフィックスつけたいなーと思って対応したのでメモ。
デフォルトの文言を変更したくてjetpackプラグインの中身を漁ってたら『jetpack/modules/publicize/publicize.php』の33行目付近に
var $default_prefix = ''; var $default_message = '%title%'; var $default_suffix = ' %url%';
という記述があり、この値を使っているようでした。
ここを変えれば変わるのですが、直接プラグインをいじるのはいけてないので何かないかなーともう少し読み進めたら『wpas_default_prefix』という名前でapply_filtersしてました。
なので function.php に add_filter を定義して値を上書きした・・・けど何故か呼ばれなかった。
色々試してみたけど、どうも function.php に書いた add_filter が定義される前に publicize.php の apply_filters 部分が呼ばれているようだった。
仕方がないのでプラグインを直接いじって対応することにした。
修正後がこれ↓
var $default_prefix = '【ブログ更新】';
var $default_message = '%title%';
var $default_suffix = ' %url%';
プラグインはいじりたくなかったけど仕方ない...
WordPressにTwitter Cardsを設定してみた。
公式のTwitterクライアントなんかでURLが含まれたツイートをクリックした時に概要がシュッと出るあれ、自分のブログでも出たらかっこいいなーと思って設定してみました(このブログでは無いですが)
作業としては『ブログ側の対応』『Twitterへ申請』の2つがあるのでそれぞれ説明します。
ブログ側の対応
htmlのhead部分にコードを挿入するのですが、テーマを直接いじるのも嫌だったので『Twitter Cards』というプラグインを使いました。
プラグインー>新規追加 から『Twitter Cards』で検索すれば見つかるのでインストールします。
インストールしたプラグインを有効化したらこれだけでもうブログ側の対応は終わりです。
Twitterへ申請
Card Validator | Twitter Developers https://dev.twitter.com/docs/cards/validation/validator
↑のリンクから表示の確認をした後に申請をします。
Validate & Apply タブにあるテキストフィールドに自分のブログ記事のURLを入れてEnter押すと表示を確認できます。 ここで何もエラーが出なければそのまま『Request Approval』ボタンから申請画面へと進みます。(自分の場合はここで『invalid card type』というエラーが出て、色々試しても解決できずに一晩寝てまた試したらなぜか通りました。Twitterのバグ?)
で、申請画面にある項目(Webサイトの簡単な説明文など入れる必要あります)を適当に埋めて『Register Domain』ボタンを押せば申請完了です。
あとはTwitterから対応完了の連絡が来るのを待つだけ。
ちなみにこの連絡は数週間かかるらしいです。
ニコ動のURLからブログ記事のアイキャッチを自動的に作成する方法
wordpressで、youtubeやニコニコ動画からアイキャッチを自動生成する方法を探してたら↓の記事を見つけた。
YouTubeの動画からブログ記事のアイキャッチ画像を自動的に作成する方法
この記事を参考に『auto-post-thumbnail.php』の
// Get all images from post's body
preg_match_all('/<\s*img [^\>]*src\s*=\s*[\""\']?([^\""\'>]*)/i', $post[0]->post_content, $matches);
の下に
if (empty($matches[0])) {
preg_match('%(?:youtube\.com/(?:user/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $post[0]->post_content, $match);
if (!empty($match[1])) {
$matches=array(); $matches[0]=$matches[1]=array('http://i3.ytimg.com/vi/'.$match[1].'/hqdefault.jpg');
}
}
を追記する事でYouTubeの動画が貼られた記事で自動でアイキャッチを作成することができた。
その勢いで正規表現部分とサムネ画像URL部分をいじればニコ動にも対応できるかなーと思い、
if (empty($matches[0])) { preg_match('/http:\/\/(?:www\.nicovideo\.jp\/watch|nico\.ms)\/[a-z][a-z](\d+)/', $post[0]->post_content, $match); if (!empty($match[1])) { $matches=array(); $matches[0]=$matches[1]=array('http://tn-skr.smilevideo.jp/smile?i='.$match[1]); } }
といったコードを先程のYouTubeのコードの下に追記したが、うまく行かなかった。
色々とデバッグした結果、どうやら『function apt_generate_post_thumb』内でmimeタイプのチェックをしているが、これがファイルの拡張子でチェックしているため拡張子が偽装されているものについてはここで弾かれているようだった(ニコ動のサムネはファイル名に拡張子が無い)
ということで、ファイルデータから直接mimeタイプを取れるよう修正した(プラグインを直接編集するのは気が引けるが...)
編集内容は
// No file type! No point to proceed further if ( ( !$type || !$ext ) && !current_user_can( 'unfiltered_upload' ) ) { return null; }
という記述の前に
if (!$type || !$ext) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $type = finfo_buffer($finfo, $file_data); $ext = "aaa";//なんでもいいから値入れる. finfo_close($finfo); }
を書く。
これでニコ動のアイキャッチ生成にも対応できた。
LESSのbox-shadow、transitionなどで複数パラメータを使用する
すいませんすいません。最近アプリ開発をサボってちょっとしたWebサイト作ってます・・・。
で、久しぶりにcssいじってたらLESSなんて便利なものがあったので使ってたのですが、『box-shadow』や『transition』で複数の値をカンマ区切りでいい感じに指定する方法が見つからなくて悩んだので解決策をメモっておきます。
解決までの経緯を書くのが面倒なので、最終的なコードを晒すと
/* box-shadow. */ .box-shadow(...) { @props: ~`"@{arguments}".replace(/[\[\]]/g, '')`; -webkit-box-shadow: @props; -moz-box-shadow: @props; -ms-box-shadow: @props; -o-box-shadow: @props; box-shadow: @props; } .box-shadow(@style) { -webkit-box-shadow: @style; -moz-box-shadow: @style; -ms-box-shadow: @style; -o-box-shadow: @style; box-shadow: @style; }
こんな感じでmixin定義。で、
.box-shadow(0 0 10px 0 rgba(0,0,0,0.2), inset 0 0 10px 0 rgba(255,0,0,0.2);
こんな感じで呼び出す。 複数指定しない場合は
.box-shadow(0 0 10px 0 rgba(0,0,0,0.2);
こんな感じ。
で、「RGBAの値を入力するのが面倒だ!16進数指定したい!hex!」って場合は
.box-shadow(0 0 10px 0 fade(#000, 20%);
という書き方もできる。
このmixinについてざっくり説明すると、引数が複数の場合は上の .box-shadow を呼んで、引数が一つの場合は下の .box-shadow を呼ぶようになっている。
また、『transition』でも同じように
/* transition. */ .transition(...) { @props: ~`"@{arguments}".replace(/[\[\]]/g, '')`; -webkit-transition: @props; -moz-transition: @props; -ms-transition: @props; -o-transition: @props; transition: @props; } .transition(@style) { -webkit-transition: @style; -moz-transition: @style; -ms-transition: @style; -o-transition: @style; transition: @style; }
と定義しておけば複数パラメータに対応できる。