pr のすべての投稿

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)

 

【cakePHP】.htaccessでmod_rewriteを使いつつ特定のURLをBASIC認証なしにする

毎日スパムコメントを捨てています、自宅プログラマです。

さくらのレンタルサーバーってCGI版PHPなんで、CakePHPの認証モジュールを使えないんですよねー。そういうわけで、apacheでBASIC認証かけていました。最初の.htaccessはこうです。

AuthUserFileは自分で作ってくださいね。bakerattaというのはfoobarやhogeと同じようなメタ構文変数ってやつです。

How to make Basic Auth exclude a rewritten URL
をみて

をやるとmedicine以下の時だけ$_SERVER[‘REDIRECT_noauth’]という変数ができてました。$_ENVにも同じものが。なんだ、これ、おもろー。なんでREDIRECT_がつくんだろ。$_SERVER[‘REDIRECT_REDIRECT_noauth’]ってのもできるし。そっか、URLが書き換わるたびにhtaccessを評価するんですね。
って、最初、環境変数がセットされているか確認の仕方が分からず、ここまででかなり苦労しました。呼び出したPHPでphpinfo()を実行すればapacheの一時変数も$_SERVERに入るんで、これで足がかりができました。
phpinfoの結果

んで、それでもうまくいかず、いろいろやっているうちに結局mod_rewriteの環境変数使わなくてもSetEnvIfだけでいけました。

Satisfy にanyを設定することにより、ユーザー認証だけでなくホスト制限もみてくれるようになります。
これで通常はBASIC認証かけつつ、medicineディレクトリ(と、そこから呼び出されているcss/imgディレクトリ)以下がBASIC認証対象外になりました。

ポイントは、Rewrite書き換え前と書き換え後、2つのURL両方を書いておくことです。

SetEnvIfを使ってBASIC認証解除したいURLを加えていけばいいので分かりいいですね。

## 2016/03/16 追記
img/x.gifのようなファイルをリクエストしているにも関わらずファイルがみつからない404の時にもBASIC認証がでていたので
SetEnvIf Request_URI “/webroot/index.php” noauth
を追記しました。
ファイルがない場合、cakePHPはwebroot/index.phpにリダイレクトするのでここも許可対象に入れたということです。一見すべてのアクセスが許可されたように思えますが、URLが書き換えられる前もチェックされるのでこれでいいのだ!
あと、特定のコントローラだけBASIC認証かける時とかはPHPで処理した方が簡単です。
HappyQuality – [CakePHP][PHP]コンポーネントを利用せずにベーシック認証を実装する

【PHP】mb_strimwidthの使い方

最近、蛍が飛んでるようです。以前から家の裏とかもちょこちょこ蛍が飛んでたりしてたんですが、自分が田舎に帰ってきた9年ぐらい前から、近くの川で蛍で本格的に乱舞するようになってます。


さて、PHPって、本当に親切な関数がたくさんあるんですが、mb_strimwidthもこんな親切でいいの!と思う関数のひとつですよね。

記事をリストに並べたりした時に、文字数を短く丸めたいときに好きな文字数で丸める上に「…」とか「(続く)」とか、丸めた時だけお尻に文字をつけられます。この処理が一行で出来るなんて便利!

パラメータは順番に

str 丸めたい文字列。
start 開始位置のオフセット。文字列の始めからの文字数 (最初の文字は 0) です。
width 丸める幅。
trimmarker 丸めた後にその文字列の最後に追加される文字列。
encoding encoding パラメータには文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

となっています。

 

実行結果:

ただ、mb_系のマルチバイト関数全体がそうですがちょっと使いづらいところもあり、自前で処理している人も多いとか。でもせっかくPHPの中にあるんなら、そっち使いたいです、わたしは。

mb_strimwidthのはまりポイントは2つ。

1.第3引数のwidthは文字数でもバイト数でもなく文字幅。

バイト数だったら、UTF-8の全角文字は3バイトになるところですがどの文字エンコードでも全角は2です。ここを間違うと意図したところで切れなくて困ります。

英数、半角カタカナは1と数えます。見た目の大きさを基準にしているということです。ただ、タブ文字とか改行も1と数えるので、単純に見た目とも言えなかったり。この辺は、プログラマなら分かるよね?…という目配せ的なアレですね。

2.第4引数のtrimmarkerの文字幅もwidthに含まれる

と書くと分かりやすいでしょうか、手順から考えると。

3.第5引数のencodingは必ず指定する、絶対。

とうとう、最後の第5引数まできちゃいました。マルチバイト関数の文字エンコーディング指定は分かる人はいちいち指定する必要もないんでしょうが、ね。

encodingは指定しなければ内部文字エンコーディングになるんですが、指定しておけば間違いないです。ここを間違った文字エンコーディングにすると文字化けします。

ちなみにmb_internal_encodingで事前に文字エンコーディングを指定してやるのも有効です。

ここまでやって、まだ不安だったので本当に文字化けしないか調べる時に使ったコード

これをcloud9で文字列とか文字幅とかいろいろ変えてみて、バイナリレベルでみてみたのですが、変な事は起きませんでした。

参考:指定した文字数で文字列をまるめるPHPの関数 mb_strimwidth で、第4引数に「文字列をまるめた後に付加する文字列を指定」する際、色々気を付けないと文字化けるよ、というお話。

 

魔の3歳児とかいうやつに言うことを聞かせる方法

どうも、自宅プログラマです。最近は各方面からお仕事をいただくようになりお断りすることも増えてきました。しかし毎回違った仕事で、初めて学ぶ事が多いのはうれしいのですがさっくり終わらせられないのが悩みの種です。

さてさて、今回は仕事以上に時間をとっているかもしれない、子育てのTIPSです。


子供はなかなか親の言うことを聞かないものです。特に3歳児。ぐずりだすともうだめ。でも本格的にぐずりだす前に、ワンチャンスあるかも。そんな時に、こうしてはどうですか

負けて勝つ作戦

服を着替えようとしないことありますね。無理に脱がせようとすると激しく抵抗、やっと着せてもすぐに脱いでしまう。
こんな時は、「お父ちゃん、あっち向いてるからね、ぜったい、ぜったい見ている間にズボン履かないでね!」と反対の方を向いて「ズボン、はーいーてーなーいーかーなー?」と振り向きます。「よしよし、ズボン履いてないな!」と満足げにうなずいて、また反対を向きます。この繰り返し。振り向いた時に着替えてる途中だったら「わ!どうしよ〜、見てない間にこんなに履いてる、ズボン履いてしまいそうだ〜!ぜったい、見ている間に履いたらだめよ!」と困ったフリ。最後まで履いていたら「わー!ズボン履かれた、悔しい〜!」と負けたフリをします。子供は親の言うことと反対の事をしたという満足感に加えて親に打ち勝ったという勝利感も得られ、もっと、もっと!と服を全部着てしまいます。

交換作戦

手に持ったものを離してくれないとき。無理に引き離すとぎゃん泣き確定。こういう時は、代わりのものをにぎらせてあげましょう。子供って単純ですな。なんでもいいので、その辺にあるもの、例えば洗濯バサミとかを手に取って「ぱっちん、ぱっちん、カニさーん。何でも挟むぞ〜、ん?交換する?」とやるとあっさり手に持ったものを渡してくれます。ポイントは、子供の興味が移るように、何気ないものでも面白いところをみつけてアピールすることです。

数を数える作戦

シャンプーとか、歯を磨くとか、子供が我慢しないといけないものは数を数えるといいです。「10数えるまでがまんしよっかー」とやれば、単に我慢するだけの時間から、目標に向かう時間に変えられ、褒める指標にもなります。もし途中で我慢できなくなっても、「4までいけたよ!すごい、新記録!」とやれば次はもっとできるようになります。

ごっこ遊びにする作戦

体を洗った後も風呂で遊んでいて浴槽に入らない時、そういう時はごっこ遊びにすると言う事をよく聞くようになります。浴槽に入って、「車で遊園地にいくよー、はやく乗って乗って!」とやって浴槽を車に見立てます。エアハンドルを握って、子供を後ろに乗せると肩までお湯につけてくれます。「はい、遊園地ついた!」と風呂からでるとその後もスムーズです。
ごっこ遊びにすると、子供からどんどん提案してくれることがあります。遊園地をコンビニにして欲しいとか、車でなくて船にして欲しいとか、子供からの提案は全面的に取り入れます。子供に遊びの主導権を持たせておくのがポイントです。

競争にする作戦

なかなか寝ないとき、「どっちが長いこと黙って目を閉じてられるか、競争だ!」…これは私の場合はマジで10秒かからず自分が寝てしまうのでめちゃくちゃ怒られます。

トイストーリー作戦

おもちゃがしゃべりだすとか、動いた痕跡があるとか、そういう演出。なかなか保育園に行かないとき、玄関の扉を開けて靴を玄関の先に並べておきます。「大変!お靴が、先に保育園に行ってくるって!」一回くらいは効きます。最初は何が起きたか分からない子供も、事態を飲み込むと「ぼくのお靴、待てー!」と信じてくれるのが楽しいです。
声色を使って「ぼく、リュック!ぼくもつれってって〜!」とバレバレな演出でも子供は付き合ってくれますよ。


以上、実際に使って効果あったものをご紹介しました。応用すればあらゆる状況で使えるんじゃないかと思います。どんなことでも遊びに変えることが出来るんです。

叱ってさせるよりそっちの方がいいかな、と思ってやってます。難点は、時間がかかることと、人がいるところだと親である自分自身がちょっと恥ずかしいということでしょうか。

それでも言う事聞かない、って時は、疲れてるとか、風邪ひいてるとかウンコ漏らしてるとかあるんで、適当に対処しましょう。

【PHP】SimpleXMLで取得したノード以下のテキストを取得

ノード以下のテキストを取得するにはDOMNodeにTextContentという便利なプロパティがありますので、いったんDOMに変換して取得するのがいいように思います。

実行すると
bold text

とタグのないテキストだけの文字列が出力されます。

【Flash】(音量注意)Unity使ってたけど久しぶりにFlashで子供とゲーム作ってみている

部屋の掃除をしていて、古いパソコンを整理したかったので引き取ってくれるところに8台ほどまとめて送り付けました、こんにちわ、ニートに近づきつつあるプログラマです!

キャンペーン中で、箱の隙間にいろいろ入れてよかったので、PCの周りをぬいぐるみで囲ってやりました。
思い出のPCたちと華やかにお別れできたんで、本当によかったです。

子供とゲームでもつくろうっかな

私はFlashは15年ほど前にやってから触っておらず、ここ2年ほどはUnityでゲームを作って遊んでいました。
年末ごろ、子供らが「バイオハザードして!」「青鬼して!」とクリアしたゲームを何度も一緒に遊ぶよう言ってくるので、それなら「作ったら?」と言うとちょっとやる気になっているようでした。

Flashのオーサリングソフトとしての素晴らしさは以前仕事として使っていて知っていましたし、小学1年生の子供には3DモデリングよりFlashのドローイングツールの方が分かりやすいだろうと思い、あえてUnityでなくてFlashで作ることにしました。

この時点でバイオハザードみたいな3Dアクションは諦めて、青鬼のような2Dアドベンチャーにすることが決まりました。ゲームは「鬼ごっこ」+「かくれんぼ」みたいなやつです。細かくは決めていません。

続きを読む 【Flash】(音量注意)Unity使ってたけど久しぶりにFlashで子供とゲーム作ってみている