月別アーカイブ: 2014年6月

mysqldumpでAUTO_INCREMENTの初期値をはずしたい

何もオプションを付けずにmysqldumpすると

となります。AUTO_INCREMENTの初期値が引き継がれてしまっていて邪魔ですね。

とすればすっきりしたdumpが吐出されます。

でもDBエンジンとか文字エンコーディングとかが抜けてると、使い物にならないですね。そこでこうするらしいです。

sedで文字列変換なんて、なかなかの力技!

参考

stackoverflow – mysqldump – Export structure only without autoincrement

MySQL Documentation 7.11. mysqldump — データベースバックアッププログラム

クローリングで使うXPathのサンプル

XPathというのはXPathを扱うための言語構文です。SQLや正規表現のように、PHPをはじめ多くの言語で使うことができる、すばらしく便利な言語です。これを使えば、単にHTML内の特定の文字列を取り出すだけでなく、文字列関数を使った加工まで出来てしまいます。

クローリングするのにわりと使うであろうXPathをいくつか書いてみます。

PHPでXPathを扱うにはPHPコアに含まれるDOMXPathクラスを使う方法、SimpleXMLを使う方法があります。PHPのXPathは1.0の対応です。2.0にはまだ対応していないようです。

HTMLをXMLとして読み込んで使うやり方

いろいろ試してみて、安定した方法が分かってきました。最近はDOMXPathをよく使っています。文字化け対策でutf8のHTMLをHTML-ENTITIESにすると良いようです。

「次へ」もしくは「Next」と書かれたリンクのURLを取得する

 2番目以降のliを取り出す

 取り出した値を好きなPHPの関数で処理する

最初に名前空間に登録して使います。

クラスを使う場合は、staticで静的関数にしないと使えません。

のように使えます。

テーブルの行の中でTHヘッダをみて好きな行のTDを取得する

リンクURLの中に「*- 」が含まれていた場合は後半のみ取得、含まれていない場合はそのまま取得する

他のサンプル

AutoPagerize WikiのXPath Cookbook

MicrosoftDeveloperNetwork XPathの例

wikipediaのXPathのページ(サンプルではないけど分かりやすいので最初に読むといい)

 

【cakePHP】繰り返しrequestActionを呼び出すのをApp::usesにしたらメモリ使用量が抑えられた

cakePHPのシェルコマンドモードから繰り返しrequestActionを呼び出すコードを実行すると、2000回くらい繰り返したところでメモリオーバーで停止していたのを解決しました。

PHPバージョンが5.2なもので、バージョンアップすればガーベッジコレクションが効いてなんとかなるかも(PHP マニュアル >機能 >ガベージコレクション)、とも思ったのですが、お客様のサーバーだし、そもそもメモリーを使い続けるのがおかしいのでなんとかしてみます。

まず、メモリ使用量の計測

結果:

どんどんメモリ使ってますね。requestActionがかなりメモリを消費する関数だって事は分かっているので、ここをもう少し低レベルなものに置き換えます。単純にControllerクラスを呼び出すのがいいでしょうが、cakePHPにはApp::usesを使った便利な呼び出しがあります。

改善された!ちょっとづつ増えていますが、16Mくらいで安定して、増え続けるという事はありませんでした。

最初にApp::uses(“ItemsController”, “Controller”);で使用する事を宣言しておきます。App::importでもいいのですが、cakePHP2ではusesの方が使用する時だけ呼び出すのでいいっぽいです。

使用する時は$ItemsController = new ItemsController;で宣言して、いつも通り$ItemsController->action()でいいのですが、これだとbeforeFilterが実行されません。
$ItemsController->constructClasses();
$ItemsController->startupProcess();
をクラスの宣言直後に行う事で、初期化されるようになりました。

コントローラーの変数は直接操作できるので、$ItemsController->request->params[‘requested’] = 1のようにリクエスト変数をいじってrequest_actionと同じパラメータにすることもできます。

昔の落書き絵、今はこんなに描けないので保存してみる

 

古いノートを整理していて、余白のところに落書きがしてあったりするんで、よく絵を描いてたなぁ、デザイナーやってたこともあったなぁと思い出したりしました。


高校三年生の時に授業中に描いてた落書き。志賀直哉の「赤西蠣太」と川端康成の「伊豆の踊り子」。


二十歳の時の落書き。この時はゲーム会社でCGデザイナーしてました。
決して上手ではありませんが、1枚目と違って訓練を積んだプロのスケッチと言えるのではないでしょうか(言わせて…)。

捨てるに忍びないので、スキャンしました。で、1枚に並べるときに使ったのが「FireAlpaca」というお絵描きソフト。無料だし、使いやすくていいですね!Windowsだと昔買ったPhotoShopやFireWorksがあるんですが、古くてOS Xでは使えず。Windowsで使っていたPaint.NETのような無料のものを探したのですが、Macだとなかなかないのが意外でした。

こうしてみてみると、描いている時に楽しかったな、という事や、上達していくプロセス、すべてプログラムと一緒だな、と感じます。

 

今、ほとんど絵を描かないのですがこの時より下手なはずです。もし今描くなら、紙に鉛筆で描く、ということに慣れる必要があります。
線や直線、フリーハンドを10分ほど練習して、それからとにかく描きまくる、ということを毎日行う。
鉛筆ならさすがによく使うものだから2週間くらいで絵描きの入り口に立てるかも。でも絵筆とか、CGソフトで仕上げるとなると、入り口に立つまでに3ヶ月ほど。

絵描きが水彩画から油彩画に転向するように、プログラマは新しいエディタや言語を習得するとき、どんなプログラマでもいったん下手になります。そこから慣れていき、思い通りに出来るようになるまでが、多くの人が挫折するくらい大変で、だけど楽しい時期です。

【PHPStorm】FTPアップロードでタイムスタンプが更新できないエラー

PHPStormのFTPアップロードで

Failed to change timestamp of the file ‘xxxxxxx’

というエラーが表示されることがありました。

詳細なログをみてみると

org.apache.commons.vfs2.FileSystemException: Could not set the last modified timestamp of “sftp://xxxxxxxxxxxxxxxxxxxxx”.

ちなみに詳細なログをとるには、Help>Configure Debug Log Settingsのリストにcom.jetbrains.plugins.webDeploymentを加えると、Help>Show Log in FinderでDeproymentに関するログが見ることが出来るようになります。

ログみてもよくわからなかったのですが、どうもMDTMコマンドにサーバーが対応していないとか、そんな問題らしいです。深くは調べてないです。

エラーをなくすには、Tools>Deproyment>OptionsPreserve files timestampsのチェックを外すといいです。

参考:FTP: support UTIME commands to change files timestamps (MFMT or MDTM currently used)