2012年3月10日土曜日

modalウィンドウ使用時におけるjavascriptの注意点

モーダルウィンドウ(リンクなどをクリックしたら立ち上がるボックス?)でhtmlあるいはphpファイルを呼び出すようなサイトを構築していたときにハマったのでメモ。

index.phpからモーダルウィンドウに表示するファイルとしてmodal.phpを呼び出すとする。index.phpではindex.js,modal.phpではmodal.jsを外部呼び出している。

【ハマった状況】
index.php内で操作する状況ではindex.js内の関数は正常に動作する。しかし、一度モーダルウィンドウを立ち上げ、それを消した後index.php内でindex.jsの関数を呼び出しても途中で止まる。

【原因】
index.jsとmodal.jsで同じ関数名を使用していたため、モーダルウィンドウを表示した際に関数名の衝突が起こり、エラーが生じたものと思われる。

【解決方法】
関数名を別のものにする。

モーダルウィンドウで呼び出しているファイルは、index.phpとは関係なくそこで完結するものだと思い込んでいたのが原因。モーダルウィンドウでファイルを呼び出す場合、index.php内にmodal.phpが組み込まれると考えたほうがいいみたい。

2012年3月3日土曜日

【php】同じクラス内の異なる関数を呼び出す

class A{

  function a1(){
     echo 'this is a1';
  }
 
  function a2(){
     echo a1();
     echo 'this is a2'
  }
}

こんな感じで書くとa1()が定義されていませんとエラーがでる。これを回避するためには次のように修正すればいいみたい。


class A{

  function a1(){
     echo 'this is a1';
  }
  
  function a2(){
     echo A::a1();
     echo 'this is a2'
  }
}

文字コードの設定をeclipseのプロジェクトごとに行う

【1】Project->Propertiesで設定を開く。
【2】Resource(デフォルトで選択されている)のTextEncodingを変更する。

2012年3月2日金曜日

amazon apiで獲得したデータをmysqlに保存する

XAMPPをインストールしたときにmysqlもインストールされているため、インストール方法については割愛。初期設定やmysqlの使い方は下記サイトを参考にした。
参考:MySQL初心者入門講座

Amazonからデータを取得する際に、既に保持しているデータとそうでないものを区別し、まだ持っていないデータのみを格納するようにしたいので、プライマリーキーをオートインクリメントさせる。
参考:dbonline - AUTO_INCREMENTの設定

とりあえず、こんな感じのテーブルを作ってみた。

create table book(
  pref_cd int(6) auto_increment,
  title varchar(50),
  author varchar(50),
  isbn varchar(20),
  imgurl_medium varchar(100),
  imgurl_large varchar(100),
  primary key(pref_cd)
);

mysqlの管理はphpmyadminでもできるようなので、以下のサイトを参考に新規ユーザの作成や権限の委譲を行った。
参考:adminweb - MySQLの設定と利用

phpからmysqlに接続するためにPDOを使用した。PDOはphpからmysqlへの接続を簡単にしてくれるAPIのような感じだと思われる。一応、コードをのせておく。

----------------------------------------------------------

// setting mysql parameter
$dsn = 'mysql:dbname=DBNAME;host=localhost;charset=utf8';
$user = 'USER';
$password = 'PASSWORD';

try{
$dbh = new PDO($dsn, $user, $password);
        $sql = "insert into book ('title','author',...) values ('?','?',...)";
$stmt = $dbh->query($sql);


        if (!$stmt) {
      die('INSERT query missed'.mysql_error());
}
if ($dbh == null){
      print('miss connection<br>');
}else{
      print('success connection<br>');
}

}catch (PDOException $e){
print('Error:'.$e->getMessage());
die();
}

-----------------------------------------------------------------

参考:phpbook - PDOの利用
書籍情報の獲得は過去エントリを参考にして行った。


このコードを使うことで、phpとmysqlの接続はできたが、titleとauthorに日本語を格納する際に文字化けが生じてしまった。様々なサイトを参考に色々いじった結果、なんとか日本語で保存できるようになった。正直、どれが効いたのかわからないので、一応修正した箇所を記録しておく。


【my.conf】
[client]

default-character-set = utf8



[mysqld]

character_set_server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
default-character-set = utf8
skip-character-set-client-handshake



[mysqldump]

default-character-set=utf8



[mysql]

default-character-set=utf8



【php.ini】

default_charset= "utf-8";



最終的に、mysqldにskip-character-set-client-handshakeを追加することで日本語保存が可能になった。なお、phpファイルの記述形式もutf-8である。

2012年3月1日木曜日

mysqlのパスワードを再設定する for Mac

このサイトを参考にmysqlを設定していこうとしたら、エラーが出たのでその解決方法をメモ。


$ /Applications/xampp/xamppfiles/bin/mysqladmin -u root -p password ‘wwxxyyzz’ ([Enter])
Enter password: ([Enter])



と入力すると


connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)'

とエラーが出る。調べてみると、パスワードをすでに設定しているのに何も入力していないから怒られているみたい。一度もパスワードを設定した記憶はないのに。。。

どうしようもないみたいなので、パスワードを再設定することにした。
手順は公式ページの一番下の方法を参考にしました。

【公式ページの引用】



  • Stop mysqld and restart it with the --skip-grant-tables --user=root options (Windows users omit the --user=root portion).
  • Connect to the mysqld server with this command:
    shell> mysql -u root
    
  • Issue the following statements in the mysql client:
    mysql> UPDATE mysql.user SET Password=PASSWORD('newpwd')
        ->                   WHERE User='root';
    mysql> FLUSH PRIVILEGES;
    
    Replace 「newpwd」 with the actual root password that you want to use.
  • You should be able to connect using the new password.

  • 【手順の説明】
    1. まず、mysqldを停止する。停止方法は過去エントリを参照。次に、ターミナルから、mysqldをオプションつきで再起動する。($ /Applications/XAMPP/xamppfiles/sbin/mysqld --skip-grant-tables --user=root)すると、[warning]とか色々出てきてターミナルが止まる(というか、コマンド入力しても反応しなくなる)。
    2. 新しいターミナルを起動し、コマンドラインからmysqlに接続する。($ /Applications/XAMPP/xamppfiles/bin/mysql -u root)
    3. 公式ページのコマンドをそのまま入力し実行する。
    これで、新しいパスワードを使えばmysqlにログインすることができるようになる。






    xamppのmysqlがコントロールパネルから起動できなくなるエラー

    xamppでインストールしたmysqlを再起動しようとした際に表示されたエラーの解決方法。

    【エラー】
    Another mysql server is already running!
    XAMPP's MySQL can not start while another mysql
    server is running. Please turn it off and try again.



    ほかのmysqlが動いてるから終了させてからにしろ、と怒られているが、ほかのmysqlに心当たりがない。どうやら、一度起動したときにmysqlのデーモンも起動してたけれど、XAMPPのコントロールパネルじゃそれを終了させることができなかったみたい。


    【解決方法】
    (1)アプリケーション -> ユーティリティ -> アクティビティモニタを起動
    (2)上部にあるプルダウンメニューから「すべてのプロセス」を選択
    (3)mysqldを選択し、「プロセスを終了」ボタンをクリック


    参考:getStatisfaction

    いまさらXAMPPの開発環境を整える

    下記サイトを参考に設定ファイルを色々書き換えた。
    参考:TECH-GYM - XAMPP for Mac OS Xを使って開発環境を構築する

    【追記】
    外部からアクセスできないようにhttpd.confを修正した結果、ローカルホストにアクセスできなくなった。

    【追記2】
    さらにこのサイトを参考にmy.cnfに変更を加えた

    twitter apiを使ってtweetを検索する

    twitterの公式がジェットに頼らず、特定のキーワードに一致するtweetを表示するものを作る。twitter @anywhereと異なり、twitterのapiは登録する必要がない。


    http://search.twitter.com/search.atom?q=<query>


    このようなアドレスを使ってリクエストを送ると、指定した形式(atom or json)でレスポンスが帰ってくる。search.以下がレスポンスの形式、<query>部分に検索クエリである。
    参考:超自己満足プログラミング - Twitter 検索API メモ
    参考:Sometime PHP - [Twitter] 検索系APIの使い方


    AND検索、時間指定など様々なオプションがある。日本語検索する場合には、UTF-8形式に変換する必要がある。データの取り出し方は以下のサイトを参考にした。
    参考:synapse28.com - phpでTwitter APIの検索結果を取得する練習

    twitter @anywhereを使ってtweerboxを設置する

     twitter @anywhereはJavascriptのAPIだと思う。
    @anywhereを使えば、つぶやき投稿画面やtwitterへのサインインなどの機能を”数行のコードで”自分のブログやホームページに設置することができる。
    twitter @anywhereへの登録や各機能を設置するためのコードはとても簡単である。
    参考:Rewish - Twitterの機能をJSで簡単に導入できる「@Anywhere」の使い方メモ

    しかし、ローカル環境(XAMPPなど)で@anywhereを動かすためには色々面倒な設定をする必要がある。

    @anywhereを使うためには、それを使うアプリケーション名、その説明、アプリケーションのURLなどを登録し、Consumer keyを獲得する必要がある。(おそらく)このConsumer keyを使ってJSファイルを呼び出し、@anywhereのJSコードを各自のブログやサイトで動作させているようである。

    ローカル環境からこのConsumer keyを使ってリクエストを要求していても、しばらくは動作するがすぐに動かなくなる。これは、リクエストを要求しているアドレスとConsumer keyに対応するアドレスが一致しない場合、その要求をシャットダウンする仕様にでもなっているからだと思われる(たぶん)。

    ローカル環境でも継続的に@anywhereを動作させるためには、Virtual hostを構築し、そのアドレスを登録時のアプリケーションURLに設定すればいいらしい。
    参考:jTweetsAnywhere - @Anywhere Registration Details

    このサイトを参考にいくつかの設定ファイルを変更しても、@anywhereは動作しない。足りない部分が2つある。
    (1)XAMPPの設定ファイルにはVirtual hostを有効にするか否かを設定する部分があるため、ここを修正する必要がある。
    (2)Virtual hostが外部からでもアクセスできるようにアクセス権を変更する必要がある。

    参考:きんくまデザイン - [Apache] XAMPP for Macでバーチャルホストを設定する
    参考:TOKYO O LIFE - ずばぴたテクニック - MacでWeb開発-(6) XAMPP for MacでWebサイトを運営(Virtual host)
    参考:nakachi.me - XAMPP for Mac OS Xでローカル環境構築 〜バーチャルホスト設定〜

    これらのサイトを参考に(1)(2)を修正すれば、ローカル環境からでも@anywhereが動作するようになるはず。