月別アーカイブ: 2013年9月

基礎を押さえていないと深みにハマる

先日、クッキークリッカーというゲームをやっていたら、昔やっていたとあるCGIゲームを思い出し、プログラムで自動化できないものかユーザースクリプトを組んでみた。

CookieClicker

一定時間後にフォームに情報を入力してsubmitしていくだけの単純なゲームだが、javascriptを勉強していないので「DOMって何?」状態から手探りで長時間かけて組んだ。

まずハマったのがsetTimeoutの使い方。文法は、setTimeout(関数名,時間)で関数名にはクォーテーションで囲むんだそう。ブラウザのコンソールでプログラムを動かしてみると問題なく動くのだが、ユーザースクリプトを読み込ませて組んでみるとエラーが・・・クォーテーションをつけないで読み込ませてみるとなぜかあっさり動いた。なぜ?いまだにわからない。とりあえず動いたので結果オーライで次に進んだ

そして、次にハマったのが、空欄のテキストボックスに文字を入力して送信する方法。ただvalueに情報を入れればいいのだとgetElementsByTagNameでテキストボックスを取得しvalueに情報を代入した。しかし、valueに情報は入るもテキストボックスに値が表示されていない。とりあえずマウスの動作を真似しようとマウスを動かして考えてみた。気づいたのは、まずテキストボックスを選択しているということ。そこで、selectでテキストボックスを選択状態にしてからvalueに値を代入すると見事に表示された。仕組みはよくわからないが、value値が空欄の時はまず選択してからでないとダメなよう・・・ちなみに、あらかじめvalueに値があれば選択状態にしなくても代入できた。

基礎を抑えていないと簡単なことに何時間もハマってしまうんだなぁと痛感。しかも、ユーザースクリプトについての情報はググっても中々辿りづらい。当然だが、サイト制作者側の観点に立った情報がほとんどだ。だからなおさら基礎を抑えていないとどんどん深みにハマってく。

例えるとRPGで正規ルートから外れて強敵ばっかりいるところに行ってしまった感じ。しかも簡単に戻れない・・・ダークソウルだといきなり巨人墓場に行ってしまった感じ・・・

しかし今回の経験である程度DOMについての概観がわかった。formの操作も若干ではあるができるようになって、「javascript面白い!」と思えるようになった。今はPHPとMySQLの勉強をしているので、一段落ついてからjavascriptを勉強する予定。基礎を抑えないとハマるけど、少し弄ってから基礎を勉強した方が理解も早いかもしれない。

とりあえず今回初めてスクリプトを書いてみたけど、そのきっかけとなったクッキークリッカーに感謝したい。

ありがとうグランドマ!!

PHP内のSQL文で文字列と変数を連結

データーベースに「商品1」から「商品10」までの値を一気に追加したかったので、PHPのfor文を使って操作しようと思ったが、一時間ほどエラーと戦うことになった。 以下が完成したコード
<?php

for($i=1; $i<=10; $i++){
  mysql_query("INSERT INTO my_items SET item_name=CONCAT('商品', $i)");
}

まず、ダブルクォテーションじゃないと変数を展開できないので、mysql_queryの引数はダブルクォテーションで囲まないといけない。 ウチは、ここをシングルクォテーションで囲んでしまったので、「Unknown column ‘$i’ in ‘field list’」というエラーが出た。

次に、「商品」という文字列と変数「$i」を連結しないといけない。 MySQLで文字列を連結させるには、CONCAT関数を使わないといけないらしい。
CONCAT(‘文字列1’, ‘文字列2’)
ウチは、それを知らず、PHPの連結と同じ調子で.(ピリオド)を使ってしまいエラー。 とりあえず解決したものの、一行ずつ挿入した方が早かった。 でも、こういうエラーを解決していくことが上達していくカギなのかなとも思ったり(;´д`)トホホ…

PHPでFizzBuzz問題を解いてみた

「プログラミング できない」などの単語でググっていたらFizzBuzz問題というのを発見した。 内容は,「1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。」というものだ。最初問題を見た時、なんとなくforとifを使うんだろうなと思ったが、書いてみると1発ではうまくいかなかった。 そして、実際に完成したコードはこちら。
<?php
for($i=1; $i<100; $i++){
    if($i%15==0){
        echo "FizzBuzz";
    }else if($i%3==0){
       echo "Fizz";
    }else if($i%5==0){
        echo "Buzz";
    }else{
        echo $i;
    }
}
?>

最初に書いたものはifの出力にechoではなく、ただ単に$i=”FizzBuzz”と代入して最後にechoで一気に出力させるという意味のわからないことをやってしまった。 当然エラー。

次に書きなおしたものも失敗。 「$i % 3==0」を先に書いていたので、15の倍数の時に「Fizz」としか表示されず。 それを修正してやっと完成!

ただ本やコードを読むだけじゃなく、実際にコードを書いてみるといういわゆるアウトプットという作業も大事だなぁと思った。 クオテーションの付け忘れなどの細かいところの間違いも読むだけじゃ中々身につかないので、ある程度プログラムの概要が分かってきたら、コードをどんどん書いていきたい。