Latest Publications

tumblrのLoad Moreをjavascriptで動かす

Tumblrで作ったサイトの相談を受けた。

表示記事に対してjavascriptで絞込がされるテーマにおいて
特定のタグに対しては記事が表示されないとのこと。

確認すると、全記事からではなく表示記事中からの絞り込みのようで
「Load More」ボタンを押して
一旦記事を初期表示以上にロードしてからでないと表示されない。

ただ、初期表示の件数に上限があり
それ以上は設定できない。

ということで、
無理やり「Load More」を押したかのような動きを
javascriptでさせることに。

</body>タグの前に

<script type="text/javascript">
$('#more-projects').trigger("click");
</script>

で動いた。

各サーバーのバックアップをAmazon Glacier(S3)に保存する環境を作った

AWSのS3も初使用。

GlacierはS3の約10分の1の価格で使えるデータストレージ。1G・1円/月くらい。
安価な代わりにデータの取り出しには数時間かかる。
バックアップ向け。

AWS コマンドライン インターフェイス

まずはコマンドラインでAWSを操作できるように環境を作る。

AWS コマンドラインインターフェイス | アマゾン ウェブ サービス(AWS 日本語)

Python 2.6.3 or later

python --version

Pythonのパッケージ管理ツール、pipを準備。
まずはダウンロード
get-pip.py

python get-pip.py

pipが使えるようになったらaws cliをインストール

pip install awscli

確認。

aws --version

awsコマンドを試す

まずはAWSの管理画面でS3を使いバケットという大きい単位の入れ物を作る。
また、IDとシークレットキーも取得し、下記コマンドで設定。

aws configure

これでawsコマンドが使えるようになる。

lsやcpやmvなど使い慣れたコマンドが使える。
こんな感じ。

aws ls s3://
aws ls s3://yourbucketname/
aws cp /home/username/test.txt s3://yourbucketname/test.txt
aws mv /home/username/test.txt s3://yourbucketname/test.txt

Glacierの設定

これはAWSの管理画面から。

バケット単位でもフォルダ単位でもできるけど
特定のバケットをGlacier専用に設定。
そのバケットに入ったらすぐにS3からGlacierに移すようにできる。
保存に関してはS3に保存するのと同じ。

cronでの処理

超手間取った。
コマンドで入力したら動くのにcronだとどうしても動かなかった。
原因はconfigファイルが参照できていなかったこと。

シェルスクリプト内に下記を書いたら動いた。
cronの実行ユーザーと合わせる。

export AWS_CONFIG_FILE=/home/username/.aws/config

例えばこんな感じ

export AWS_CONFIG_FILE=/home/username/.aws/config
scp username@servername":~/backup/hoge.gz /home/username/backup/hoge.gz
/usr/local/bin/aws s3 cp /home/username/backup/hoge.gz s3://yourbacketname/hoge.gz

crontabが動かなかった

cronのテストをしていた時に何故か変更したものが反映されない。

タイミングが良くわからなかったので

sudo /etc/init.d/crond restart 

をするようにしたら動いた。

WordPressの新規投稿時のデフォルト設定

管理者権限のユーザーでも新規投稿時にステータスpost_statusをレビュー待ちpendingにしたかったので。

function.phpに追加。

//新規投稿のステータス初期値を「レビュー待ち」にする
function post_function($data){
	//処理
	$data['post_status'] = 'pending';
	return $data;
}
add_filter('wp_insert_post_data', 'post_function');

MacPortsのアップデートでphpエラー

MacPortsのアップデートしたらphpでエラーがでるようになった。

PHP Startup: Unable to load dynamic library '/opt/local/lib/php54/extensions/no-debug-non-zts-20100525/gd.so'

ということで調査開始。

php -ini

でiniファイルを探すと

/opt/local/var/db/php54/gd.ini

ができてた(元から??)ので開いてみると

extension=gd.so

とエラー部分の呼出しがあったので

;extension=gd.so

とコメントしたらエラーが消えた。

ただ、MacPortsが自動で更新するファイルだから
さわっちゃダメよ、と書いてあったファイルなので
また上書きされてしまうんだと思う。

とりあえず、の処置ということで。

iPhoneのSafariでサイト表示が崩れていたのを修正

iPhone5のSafariでサイトの表示確認をしたら
表示がかなり崩れていた。

CSSが適応されていないようだったが
完全にではなく、一部が適応されてにない様子。

MacとつないでWebインスペクタで確認したところ
CSSは読んでいるもののなぜか途中で切れていた。

他のiPhoneやiPadで見るとそんなことはなく
端末の問題として、設定からSafariの
「Cookieとデータを消去」をすると解決。

フレームワークなどでのPHPシステムが重い時の対処

CakePHPで、ローカルではサクサク動くシステムが
サーバーに載せたら対した処理でもない部分で異常に重い。
ページを開くだけで1分以上かかるなど遅すぎ。

原因は単純で、PHPのメモリ設定が小さすぎただけ。
フレームワークはそのページの処理自体は単純でも
共通部分の処理の読み込みなどでそこそこメモリが必要。

ちなみにいつも忘れるのでphp.iniの場所を探すには

php --ini

同じドメインで複数のCakePHP2を動かした時の500エラー

一時的に同じドメインの、メインとサブディレクトリで
別々のCakePHP2を動かす必要が出た。

過去のサーバーでは問題なく動いていたが
同じ構成でも特定のサーバーでだけ500エラーが出る。

それも、どちらか片方だけ。
debugを一度2にすると動くようになるが
そうすると他方がエラーになる。

結局、サブの方のcore.phpに

Configure::write('Cache.disable', true);

を追記して解決。

なぜかキャッシュに同じものを見に行っていたようで
それがエラーの原因だった模様。
片方を、キャッシュそのものをしないようにした。

PHPのバージョンなどが原因かも。

phpのssh2.soのエラー解決

サーバー環境をいろいろといじっていたら、
PHPが下記のようなエラーを出すようになった。
何を変えたことで発生したかは不明。

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/ssh2.so' - /usr/lib64/php/modules/ssh2.so: undefined symbol: php_checkuid in Unknown on line 0

ssh2.soやlibssh2.soを再インストールしても
エラーメッセージが多少変わるものの治らず。

結局、ssh2-0.12をソースからコンパイルする時に下記のオプションを付けて解決。

./configure --with-ssh2 --with-php-config=/path/to/correct/php/bin/php-config

php-configのパスは下記で探した。

sudo find / -name "php-config*"

大変だった。

MacでWindowsのexeに関連付けた特定の拡張子ファイルを開く

Mac(mountain lion)でWindowsのプログラムを使うためのwineというものがある。
exeファイルをwine経由で起動させることにより実行が可能。

ただ、exeファイルだけではなく
特定の拡張子をプログラムに関連付けをし
ファイルをダブルクリックするだけでそのプログラムで開くようにしたい。

今回実施したいのはjwwのファイル。
他でも同じ方法でできるはず。

プログラムファイルであるjw_win.exeをダブルクリックで開くようにはすぐできたが
データファイルのfilename.jwwをダブルクリックすることでjwwと共に開くのに苦労した。

まずはwineのパスを調べる。
インストールした方法によるが、自分はNXWineというアプリで入れたので
/Applications/NXWine.app/Contents/Resources/bin/wine
にあった。
jw_win.exeのパスも調べておく。

MacのAutomaterでApplicationを選び、Run Shell Scriptをダブルクリックして右側にウィンドウを出し
入力を「as arguments」にした上で

/Applications/NXWine.app/Contents/Resources/bin/wine start /unix "/pathToJwwFile/jw_win.exe $1"

とする。

後はこのApplicationに適当な名前を付けてどこかに保存。
これで、このApplication経由でjwwファイルを起動すると
$1の部分にjwwのファイルパスが入り、jw_win.exeがwine経由で起動することになる。

関連付けは、どれか適当なjwwファイルを右クリックしてGet Infoを選び
Open withのところで先ほど作成したApplicationを選択し、
その下のChange Allボタンで他のjwwファイルもすべてこのApplicationで起動するようにする。

(追記)
上記でjw-cadは使用できるようになったものの
なぜか印刷してもできず。(印刷キューに出てこない)

色々と試した結果、macportsよりwine-1.7.2を
インストールすることで解決。

上記のパスは下記に変更。

/opt/local/bin/wine start /unix "/pathToJwwFile/jw_win.exe $1"