開発メモ,主に補足by子連れ親父プログラマー

2011-08-02

OSX、terminal で postgres を操作していて、なぜか SELECT * FROM した時だけ文字化けする時の話

そんな馬鹿な、というような話だが。
postgres なので EUC_JP の文字コードのDBがまだ残っていたりする。
ということで今、terminal の環境設定の詳細の文字エンコーディングが
日本語(EUC)
になっていたとする。この状態で、psql に入り、DB操作を開始、「やべえ、このDBは UTF-8 だった」
と気づいて、terminal の環境設定の詳細の文字エンコーディングを
Unicode(UTF-8)
に変更したとする。
そうすると、
SELECT name FROM items;
というようにひとつのカラムをセレクトする場合は文字化けしないが、
SELECT * FROM items;
というように全部をセレクトすると文字化けする。
もちろん、一旦 terminal を終了してちゃんと
Unicode(UTF-8)
になってるのを確認してから psql に入れば文字化けしない。
まったくもって馬鹿馬鹿しい現象だが、やってる本人は一体何故なのかさっぱり分からない。
そして一日を棒にふる訳である。

2011-08-01

JSON形式のつづき。DBからselectしたデータが連想配列になってるのでそのまま処理したい編。

なにはともあれ、DBからselectしたデータがある訳です。
で、selectしたデータのid列の値がキーになっているとなにかと便利な訳ですよ。
後から参照する時にidだけ分かれば一発ですから。
ということでデータが今phpでこんなになってるとします。
Array
(
    [4] => Array
        (
            [id] => 4
            [year] => 2012
            [created] => 2011-07-26 19:37:37.985709
        )

    [7] => Array
        (
            [id] => 7
            [year] => 2011
            [created] => 2011-07-27 16:43:11.697075
        )
)
こいつをJSON形式で出力したいってことです。
最終的にこんな形になればいいので、
{
    "4": {
        "id": "4",
        "year": "2012",
        "created": "2011-07-26 19:37:37.985709"
    },
    "7": {
        "id": "7",
        "year": "2011",
        "created": "2011-07-27 16:43:11.697075"
    }
}
昨日のファンクションを以下のように修正。
$json = "{".toJson($data)."}";

function toJson($data) {   
    $json = array();
    foreach ($data as $string => $value) {
        $key = "\"$string\":";

        if (is_array($value)) {
            $json[] = sprintf("%s {%s}", $key, toJson($value));
        } else {
            $json[] = sprintf("%s \"%s\"", $key, addslashes($value));
        }
    }
    return implode(", ", $json);
}
こうすると、例えば返って来た json を javascript で例えば data とかいうオブジェクトに入れたとしたら、
data[4].year
とかで処理できる訳です。
    var tbl='';
    for (key in data) {
        tbl += '<tr><td>'+data[key].year+'</td></tr>";
    }
みたいにね。

2011-07-29

JSON形式の過去に一体何があったのか?

それにしても分からないのはJSON形式だ。
今phpで配列からJSON形式のデータを作ろうってことになったら、普通にphp5.2以上を使っている人たちは、
普通に json_encode を使うんだろう。悩む必要はない。
それ以外のちょっと前の環境の人だって、 pear が使えればそれでやっちゃってるんだろう。
だから世の中の人達は本当に正しいJSON形式なんてものに興味も関心もないに違いない。
それが自動的に作ってくれるんだから。
で、pearもねぇ、phpはいまだに4.3という、絶望のどん底のような環境にいる私は仕方なく自分でJSON形式を作ろうとすることになるんだが、
一昔前までは、
{ とか [ とか "" とか '' とか結構いい加減でもJSONとして動いていたらしいフシがある。
jQuery のプラグインです、なんつって配布されてるものでも jQuery1.2 くらいの時代のものだと、 key を""で囲っていなかったりして、これを最新の jQuery で動かすとエラーになる。
つまり、その時代に結構いい加減に作られていたJSON形式の一体どこがいけないのか、自分で分かってなきゃ作れないってことなんだ。
ということでJSONとはこれだ! というのがこのページらしいんだが。。。
http://json.org/
さっぱりわからん(笑)。
おそらくしかしこれは、配列は [] で囲め、 [] の中にはなにがしかの要素が入る。
オブジェクトは {} で囲め、その中にはキーと値をコロンでつないだものが入る、複数入れるならカンマで句切れ。
っていうようなことなんだろう。
ということでこちらの
http://d.hatena.ne.jp/kovaio/20060610
2006年の古い記事の関数を書き換えてみました。
$json = "[".toJson($data)."]";

function toJson($data) {   
 $json = array();
 foreach ($data as $string => $value) {
  $key = (is_numeric($string) ? "" : "\"$string\":");

  if (is_array($value)) {
   $json[] = sprintf("%s {%s}", $key, toJson($value));
  } else {
   $json[] = sprintf("%s \"%s\"", $key, addslashes($value));
  }
 }
 return implode(", ", $json);
}
JSON形式に何があったのか知らないが、こんだけ絶望的に変わってるのに、なんで誰も憤慨していないのかが不思議だ。

2011-07-28

OSXにおけるjava、javacの文字化け

もちろん食わず嫌いで、これまで徹底して避けてきた java なんですが、ふと思い立って参考書を買ってきたので勉強中。
OSXにも入ってるかなと見てみれば
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)
ちゃんと入ってるようだ。ということで一発目のサンプルソースをコンパイルしたところでいきなりエラー。
っつーか文字化けしててなにがなんだか分からない。
$ javac Hello.java 
Hello.java:3: ?x??:???̕????́A?G???R?[?f?B???O SJIS ?Ƀ}?b?v?ł??܂???B
  System.out.println("初めてのプログラ??);
                                     ^
なによこれ。
ということで調べたところ、 .profile に
alias javac="javac -J-Dfile.encoding=UTF8"
alias java="java -Dfile.encoding=UTF8" 
といれればよいらしい。
しかし、例えば、 javac Hello. とかって間違えて打ってしまった時のエラー、これ、
$ javac Hello
エラー:クラス名 'Hello' が受け入れられるのは、注釈処理が明示的に要求された場合だけです
エラー 1 個
笑えるくらい意味わからん。

2011-07-21

一日の仕事が終わったらDropboxにシンボリックリンクを貼ってファイルをバックアップしておこう

や、一時は Dropbox フォルダーをドキュメントルートにしたろうかとか思ってやってみたんだが、なんだか OSX の ACL だかなんだかでうまくいかないので、シンボリックリンク方式に変更。

今作業してるフォルダーが
/Users/xxxx/Sites/admin
だとしたら、あらかじめ Dropbox フォルダー内にも Sites を作っておいて、
ln -s /Users/xxxx/Sites/admin /Users/xxxx/Dropbox/Sites
で、OK。
作った途端に、勝手に中のファイルが保存されてくれる。
Finderからファイルの情報を見ると、
種類:エイリアス
と表示されている。
ちなみに作ったシンボリックリンクの一覧が見たければ
find ./Dropbox/Sites/ -type l
とすればいい。消すときは
rm Dropbox/Sites/admin
こりゃーいい。
しかしなあ、常に同期してるってことは、間違って消してしまったら Dropbox からも消えてしまうってことではないか?
つまり、結局は全部消えるんでしょ、と。
思ってやってみたところ、確かに消えますね。Dropbox から削除される。
削除されるけれども、Dropbox は「削除済みファイルの復元」というのができる。
やってみる。
復元すると、シンボリックリンクは消滅し、削除されたファイルが再び現れる。
そしてそれはシンボリックリンクではなく、実体なのである。

2011-07-08

本当に phpunit なんて要るのか? pear なんて大っきらい編

本当に要る。ということなので、インストールを試みる。

PHPUnit Manual
第3章 PHPUnit のインストール
http://www.phpunit.de/manual/3.6/ja/installation.html

とりあえずこちらに書いてある通り
以下の3つをチャンネルに追加。

pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
sudo でないとエラーになったのでこうなった。
$ sudo pear channel-discover pear.phpunit.de
Adding Channel "pear.phpunit.de" succeeded
Discovery of channel "pear.phpunit.de" succeeded

$ sudo pear channel-discover components.ez.no
Adding Channel "components.ez.no" succeeded
Discovery of channel "components.ez.no" succeeded

$ sudo pear channel-discover pear.symfony-project.com
Adding Channel "pear.symfony-project.com" succeeded
Discovery of channel "pear.symfony-project.com" succeeded
自分のチャンネルのリストはこうやってみる。
$ pear list-channels
Registered Channels:
====================
Channel                  Alias   Summary
components.ez.no         ezc     eZ Enterprise components
doc.php.net              phpdocs PHP Documentation Team
pear.php.net             pear    PHP Extension and Application
                                 Repository
pear.phpunit.de          phpunit PHPUnit PEAR Channel
pear.symfony-project.com symfony The symfony project PEAR channel
pecl.php.net             pecl    PHP Extension Community Library
__uri                    __uri   Pseudo-channel for static packages
で、いざ、
$ sudo pear install phpunit/PHPUnit
を実行してみると
Failed to download pear/HTTP_Request2 within preferred state "stable", 
latest release is version 2.0.0RC1, stability "beta", 
use "channel://pear.php.net/HTTP_Request2-2.0.0RC1" to install
というようなエラーが出る。
この use "channel://pear.php.net/HTTP_Request2-2.0.0RC1" to install
という一文が意味がわからなかったのだが、これはつまり、
$ sudo pear install channel://pear.php.net/HTTP_Request2-2.0.0RC1
こうしろってことらしい(笑)。
そうならそう書いてくれよって。

ということで、結局、以下の順に実行して無事終了。
$ sudo pear install channel://pear.php.net/Net_URL2-0.3.1
$ sudo pear install channel://pear.php.net/HTTP_Request2-2.0.0RC1
$ sudo pear install phpunit/PHPUnit
$ phpunit
PHPUnit 3.5.14 by Sebastian Bergmann.

2011-01-25

OSXのMacPortsでphpのバージョンが5.3.5になり、なにもかもおかしくなった件

前の記事を見たら2010/3/18ってなってたからおよそ一年近くほったらかしになっていたことになるが。
1年前に自宅のOSXの環境にMacPortsでphpを入れて、その時は5.3.2だったんだが、
それで昨日そいつを更新しようと思い立ち、
sudo port upgrade installed
とやったが最後、とんでもなく延々と待たされた挙げ句に
 php5 @5.3.2_0+apache2+macosx+mysql5+pear+sockets+sqlite
 php5 @5.3.5_0+apache2 (active)
と2つのphp5が存在している状態になり、もう訳が分からない(涙)。
なんなんすか、これ。
phpのバージョンを5.3.2から5.3.5にするんだったら、
 php5 @5.3.5_0+apache2+macosx+mysql5+pear+sockets+sqlite
こうなるのが普通じゃないか?!
おかしい、これは絶対おかしい。
ということで
sudo port uninstall -f php5 @5.3.5_0+apache2
とやって消してみた。
消してからふと、そういえばmbstringが使えなかったような気がしたナーと思ったので
ついうっかり、
sudo port install php5-mbstring
とやってしまった。すると、
 php5 @5.3.2_0+apache2+macosx+mysql5+pear+sockets+sqlite
 php5 @5.3.5_0+apache2 (active)
げげーっつまたしても5.3.5が復活している!!
さすがにここまでやって気がついた。
恐らくこれは5.3.2と5.3.5とでは、もう、違うってことだ。
これからはもう絶対に
php5 @5.3.5_0+apache2+macosx+mysql5+pear+sockets+sqlite
こういう風にはならないってことだ。
結果、
php5 @5.3.5_0+apache2 (active)
php5-mbstring @5.3.5_0 (active)
php5-mysql @5.3.5_0+mysqlnd (active)
こういう風になる。
ついでに泣けるのがこのmbstring入れる時に出るメッセージ
Your php.ini contains a line that will prevent php5-mbstring
and other PHP extensions from working. To fix this,
edit /opt/local/etc/php5/php.ini and delete this line:

extension_dir = "./"
この行を消せってのは
extension_dir = "./"
のことを指している(笑)。

2011-01-18

MySQLで、ログイン用のメールアドレスなんかはバイナリー属性にしてテーブルを作る

なんかなー、デフォルトで大文字小文字区別しないってことが問題なんじゃないの?
って気はするけどなー。
普通にこういうテーブルを作る。
CREATE TABLE samples (
  id INT,
  email VARCHAR(255)
);

emailは大文字でも小文字でもヒットする。
バイナリー属性を付ける。
CREATE TABLE samples (
  id INT,
  email VARCHAR(255) binary
);
emailは大文字は大文字、小文字は小文字でヒットする。
show で見るとこんなになってる。

CREATE TABLE `samples` (
  `id` int(11) default NULL,
  `email` varchar(255) character set utf8 collate utf8_bin default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8

ううむ。。。

2010-11-12

くるくる回るGIFアニメを用意して、submitボタンをクリックした時にくるくる回したい

はぁ~丸二日くらい悩んだかも。
不毛だな。
ま、とにかく html をこんな感じにしておく。
<input id="next_button" type="submit" value="つぎへ" />
<span id="loading" style="display:none;"><img src="img/loader.gif" /> 処理中</span>

submitボタンの後ろにGIFアニメ画像を置いておいて、隠しておいて、クリックされたら出してやろう、というねらいだ。

で、最初俺はこう書いていた
$('input#next_button').click(function(e) {
  e.preventDefault();
  $('#next_button').hide(); 
  $('#loading').show();
  $('form').submit();
});
クリックで、
サブミットボタンのデフォルトの動作を禁止して、
サブミットボタンを消し、
ローディング画像を出し、
そしてフォームをサブミット!

これはまあ、動くんだが、IEで見ると何故かGIFアニメのアニメーションが動かない。静止してるのだ。
ということで順番を入れ替えてみた。

$('input#next_button').click(function(e) {
  e.preventDefault();
  $('form').submit();
  $('#next_button').hide(); 
  $('#loading').show();
});
先にサブミット。
これだと動く。
謎。
とにかく、submit() が先だ、先!

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー