PDOでMySQLに接続するとエラー発生
事象
コード
事象を再現させるための実験コード。
といっても、普通にPDO接続するだけ。
<?php define('DSN','mysql:host=localhost;dbname=hoge'); define('DB_USER','hoge'); define('DB_PASSWORD','hoge'); try { $dbh = new PDO(DSN, DB_USER, DB_PASSWORD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); } catch (PDOException $e) { echo $e->getMessage(); exit; }
結果
SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file
原因
PHP5.3からの下位互換のない変更点に該当しているため。
新しい mysqlnd ライブラリは、MySQL 4.1 用の41バイトの新しいパスワードフォーマットを使用します。 古い16バイトのパスワードを使うと、mysql_connect() 系の関数は次のようなエラーメッセージを生成します。"mysqlnd cannot connect to MySQL 4.1+ using old authentication"
http://php.net/manual/ja/migration53.incompatible.php
要するにMySQLのパスワード設定が古いからのようだ。
対応
管理者ユーザでパスワードを再設定してやればOK。
SET SESSION old_passwords=0; SELECT * FROM user WHERE user = 'hoge'; UPDATE user SET password = password('XXXXXXXXXXXX') WHERE user = 'hoge';
FuelPHPのUploadクラスを使用するときに注意すること
FuelPHPでファイルアップローダーを作ってた時にちょっとはまったこと。
バージョン
FuelPHP 1.7.2
現象
`upload_max_filesize`、`post_max_size`などを、1GBの設定にしても、400MBのファイルでエラーになる。
原因
FuelPHPのUploadクラスには個別の設定があり、そっちがデフォルトの300MBのままだった。
公式サイトのエラーの説明読んでてたらそれっぽいこと書いてあった。
UPLOAD_ERR_MAX_SIZE The file uploaded exceeds the maximum file size defined in the configuration.
http://fuelphp.jp/docs/1.7/classes/upload/usage.html#/error_constants
2014年振り返り
あっという間に終わった感があるけど、2014年の振り返りを。
今年はほとんどブログ書かなかったなー。
お仕事
1月から新しい職場で働き始めて、Webプログラマ見習いとしてPHP、JavaScriptでお仕事してました。
コード書く仕事は半分くらいで、残りはプロジェクトの交通整理的な役割が多かったです。
それほど大きな会社ではないので、割と色々なことをやらせてもらえました。
プロジェクトを進める上では意外と今までの知識や経験が活かせることが多かった気がします。
前職と違った仕事のやり方として、Slackやチャットワークを日常的に使ってますがとてもいい感じです。
ちょうど1年経ちましたが、全体としてはそこそこ楽しく仕事できてます。
プライベート
子どもが1歳5ヶ月になり、どんどん動き回るようになって目がはなせません。
日々子どもが成長するのを見てるのが楽しいです。
子育てのためだけではないですが、勉強会にほとんど参加しませんでした。
自宅ではまとまった時間が取りにくいので、1時間早めに出社して本読んだり写経したりしてます。
おかげで、月1冊ちょっとは読めたみたいです。
慣れてきたのか、子育て手伝いながらの時間の使い方は去年よりは上手くなってるかも。
反省
新しい環境で仕事を始めたこともあって、インプットはそこそこ多くできた気がしますが、アウトプットは少なめでした。
職場と自宅という2つの環境に閉じてしまった感があるので、もう少し別の界隈の人たちとの交流ができたらよかったかな。
特定のファイルがないディレクトリを抽出する
仕事でサーバ設定いじってて、ちょっと悩んだのでメモっておく。
とりあえず目的は達したけど、もっと簡単にできる方法があれば、ぜひ教えてください。
やりたいこと
同じ構成のディレクトリ群の中から、置き忘れる、消されるなどして必要なファイルが存在しないディレクトリを抽出したい。
やったこと
対象ファイルについて存在チェックすれば良いと考えたので、下記のようにディレクトリのリストに対象のファイル名を連結して test コマンドに渡すようにした。
ここでは、hoge/piyo.txt が必要なファイル。
ディレクトリの構成によっては、find に maxdepth オプションも指定した方がいいはず。
[~/tmp/test] $ find . . ./dir1 ./dir1/fuga ./dir1/hoge ./dir1/hoge/piyo.txt ./dir2 ./dir2/fuga ./dir2/hoge ./dir3 ./dir3/fuga ./dir3/hoge [~/tmp/test] $ find . -type d -mindepth 2|grep '/hoge$'|awk '{cmd = sprintf("test -e %s/piyo.txt", $0);r = system(cmd);if(r == 1) print $0}' ./dir2/hoge ./dir3/hoge [~/tmp/test] $
JavaScript と CSS の minify
久々G*関連ネタ。
tree-tips: Gradleでjavascriptをminifyする! | Gradle
tree-tips: Gradleでcssをminifyする! | Gradle
上記サイトのビルドスクリプトを参考に、カレントディレクトリ以下の JavaScript と CSS を再帰的に minify するようにした。
ただ、使っているプラグインが新しめの gradle に対応してないっぽくて、ちょっとはまった。
結局 1.7 です。
wrapper 作ったので、ついでにチームの人に紹介しておいた。
defaultTasks 'allMinifyCss', 'allMinifyJs' apply plugin: 'js' apply plugin: 'css' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.eriwen:gradle-js-plugin:1.5.0' classpath 'com.eriwen:gradle-css-plugin:1.2.1' } } css.source { dev { css { srcDir "./" include "**/*.css" exclude "**/*.min.*" } } } css.source.dev.css.files.eachWithIndex { cssFile, i -> tasks.create(name: "minifyCss${i}", type: com.eriwen.gradle.css.tasks.MinifyCssTask) { source = cssFile dest = cssFile.getAbsolutePath().replace('.css','.min.css').replace('.js', '.min.js') yuicompressor { lineBreakPos = -1 } } } task allMinifyCss(dependsOn: tasks.matching { Task task -> task.name.startsWith("minifyCss") } ) javascript.source { dev { js { srcDir "./" include "**/*.js" exclude "**/*.min.js" } } } javascript.source.dev.js.files.eachWithIndex { jsFile, i -> tasks.create(name: "minifyJs${i}", type: com.eriwen.gradle.js.tasks.MinifyJsTask) { source = jsFile dest = jsFile.getAbsolutePath().replace('.js', '.min.js') } } task allMinifyJs(dependsOn: tasks.matching { Task task -> task.name.startsWith("minifyJs") } ) task wrapper(type: Wrapper) { gradleVersion = 1.7 }
XMLHttpRequest でのリダイレクト処理
XMLHttpRequest でリダイレクトがうまく処理できなくて困ったので調べてみた。
結論
サーバのレスポンスがリダイレクト (30X) の場合、XMLHttpRequest が勝手にリダイレクトしてくれてリダイレクト先のレスポンスが返ってくる。
つまり、転送先が正しければ 200 が返ってくるし、存在しなければ 404 が返ってくるということ。
responseText の中身も転送先の内容になる。
ググってみたけど、探し方が悪いのかちょっと古めの記事しか見つからなかった。
XMLHttpRequestオブジェクトでRedirectをハンドリングするには?(リダイレクトを拾う方法) - on the center line.
ku
結局、上と同じようにレスポンスの内容によって転送と判断して window.location を書き換えて対応した。
XMLHttpRequest では、基本的に同一ドメインアクセスで転送先は分かるはずなのでこれでいいのかなあ。
試したこと
下記のファイルを使って確認してみた。
一応、同期/非同期通信のそれぞれの方式をChrome、Safari、Firefox 試したけど結果は全て同じ。
使ったファイルと処理の流れ
1. hoge.html から fuga.php へ GET リクエスト。
2. fuga.php が piyo.html へ転送
3. hoge.html のコンソールログに piyo.html のレスポンス表示
hoge.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>test</title> <script> function sync() { var xhr = new XMLHttpRequest(); xhr.open('GET', './fuga.php'); xhr.send(null); console.log(xhr.status); console.log(xhr.getAllResponseHeaders()); console.log(xhr.responseText); } function async() { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState==4){ console.log(xhr.status); console.log(xhr.getAllResponseHeaders()); console.log(xhr.responseText); } } xhr.open('GET', './fuga.php'); xhr.send(null); } </script> </head> <body> <input type="button" value="sync" onClick="sync()"> <input type="button" value="async" onClick="async()"> </body> </html>
fuga.php
<?php header("Location: ./piyo.html");
piyo.html
piyo.html
レスポンスヘッダ
Accept-Ranges bytes
Connection Keep-Alive
Content-Length 10
Content-Type text/html
Date Sat, 01 Mar 2014 14:03:43 GMT
Etag "5f49f6-a-4f38bc8295bc0"
Keep-Alive timeout=15, max=98
Last-Modified Sat, 01 Mar 2014 13:46:31 GMT
Server Apache/2.2.24 (Unix) DAV/2 PHP/5.5.8
レスポンスボディ
piyo.html
64bit 版 KaoriyaVim で突然の死
あるあるかもしれないけど、64bit 版 KaoriyaVim では、python の dll がロードできないと突然死にます。*1
なお、32bit 版だとエラーメッセージは出るけど落ちません。
ということで、64bit 版の python をインストールしましょう。
環境
Windows8.1
64bit 版 KaoriyaVim 7.4.161
経緯
64bit版KaoriyaVimでルートディレクトリに移動するとVimが落ちる · Issue #160 · Shougo/vimfiler.vim · GitHub
暗黒美夢王ことShougo さん、ありがとうございました。
*1:ほんの一瞬 "ImportError: No module named site" と表示されるけど