「時間分けマスターになる為に」の編集履歴(バックアップ)一覧に戻る

時間分けマスターになる為に - (2011/11/10 (木) 15:52:12) のソース

&color(#ff0000){このページへ誘導されてきた方へ}
----
このページに「&color(#ff0000){&bold(){回答}}」はありません、脱初心者を目指す意欲的な方のお勉強の取っ掛かりをサポートするページです。

このページを読解していただくことでbot.php編集における基本・応用がこなせるようになります。
ソースのコピペは思わぬ誤作動の元となりやすく、またコピペで済ませることで誤作動の原因に気付きにくくなる欠点があります。
bot.phpを構成しているPHPのパーツを理解することで、bot.phpの全体を正しく把握し制御できるようになります。

ここでは「プログラミングができなくても~」というEasyBotterの基本にもとづき、あえてプログラミングの説明らしからぬ方法で説明している部分もあります。
プログラミング初心者にプログラミングの基礎を学んでもらうモノなので、プログラミング慣れした方には違和感あるかと思いますがご容赦ください。

またEasyBotterに関連するものに特化して説明していますので、PHP自体に興味をもたれた方は本家のマニュアルなどを参照されると良いでしょう。
EasyBotterは基本性能が備わっているので、基礎を勉強することで比較的容易に改造に着手することができます。
botをの機能を発展させたいと思う方は是非、基礎を勉強してみてください。

----

#contents
*時間分けとは?
botの動作を複雑化させる為に必要な時間分けですが、何から調べればよいのかわからない、という方も多いのではないでしょうか。
ここでは時間分けで使う内容を分解しそれぞれを理解することで、時間分けをマスターします。

[[時間分け]]を理解している方は以下の内容を正しく理解できるでしょう。
 if(date("G") == 7 && date("i") == 30){
 	$response = $eb->postRandom("0730.txt");
 }
正解は「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」です。
簡単に書けば「7時30分に0730.txtからランダムポスト」で済みますが、上記のように書いたのには理由があります。

bot.phpにおいては、関数や演算子などを条件文に入れ込むことで構成されていきます。
「関数」「演算子」「条件文」というと難しいイメージを持つかもしれませんが、パターンは多くありません。
まずは時間分けの基本形を知ることで、複雑な動作を分解してみましょう。

*制御構造「if」
ここではifを使った条件分岐を説明しますが、初めに&bold(){「プログラムは書かれた順に実行される」}ということを覚えていてください。
これはこの項目に限らず全てのプログラムに通じるものです。
つまり条件をいくつも提示した場合、&bold(){先に書かれた条件が優先される}のです。
**ifの基本形
まずはif文の基本形を見てみましょう。
 if(条件){処理;}
たったこれだけです。
&bold(){if文は英語の「もし~ならば」という意味と同じ}で、この場合は「もし条件に当てはまるなら処理をする」というものです。

 if(条件1){処理1;}
 if(条件2){処理2;}
 if(条件3){処理3;}
このように何行も並列していけばこの基本形だけで時間分けは可能ですが、スマートな書き方とは言い難いものです。
**ifの拡張機能
それではif文の拡張機能「else if」「else」を使ってみましょう。
 if(条件1){
 	処理1;
 }
 else if(条件2){
 	処理2;
 }
 else{
 	処理3;
 }
&bold(){elseは英語の「その他」}という意味と同じとなります。
&bold(){else ifは「他にもし~ならば」}、&bold(){elseは「その他の場合は」}、となります。

ここで問題です、【条件1】にも【条件2】にも当てはまる場合、処理はどのようになるのでしょうか?
ここで&bold(){「プログラムは書かれた順に実行される」}を思い出しましょう。
書かれた順、つまり最初の【条件1】に対応する【処理1】が行われることはわかりますね?
では【条件2】にも当てはまっているので【処理2】も行われるのでしょうか……答えはNO。
「else」という英単語には「その他」という意味があることは先に説明しましたが、これには&bold(){「既にあるものは除いて」という意味}が含まれています。
つまり、【条件1】に当てはまるものは【処理1】が終わった時点で終了、【条件1】に当てはまらなかったものだけが【条件2】の判定へ進むことができるのです。
また【条件1】にも【条件2】にも当てはまらない、つまり「その他の場合」は【処理3】が実行されます。
**if文の複雑化
if文は一つの条件で二つ以上の処理をすることもできます。
 if(条件1){
 	処理1a;
 	処理1b;
 }
 else if(条件2){
 	処理2a;
 	処理2b;
 }
 else{
 	処理a;
 	処理b;
 }

また、「if」「else if」「else」の処理にさらなるif文を入れ込むこともできます。
 if(条件1){
 	if(条件a){
 		処理1a;
 	}
 	else if(条件b){
 		処理1b;
 	}
 	else{
 		処理1;
 	}
 }
 else if(条件2){
 	if(条件a){
 		処理2a;
 	}
 	else{
 		処理2;
 	}
 }
 else{
 	if(条件a){
 		処理a-1;
 		処理a-2;
 		処理a-3;
 	}
 }
if文は上記のような2段階に限らず、3段階4段階と増やすことができます。
**if文の要素一覧
|if|もし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない|条件分岐させる場合、必ず最初に書くもの。&br()(ただし並列して実行する条件分岐は別)|
|else if|他にもし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない|「if」または「else if」の後につけることができる。&br()なくても良い。|
|else|その他の場合は【処理】を実行、「}」で同列冒頭にあるif文を終了する|「if」「else if」の条件のどれにも当てはまらない場合の処理。&br()なくても良い。|
|()|【条件】内容を丸括弧で囲む|「if」「else if」で使えるが、「else」では使えない。&br()条件は演算子を使うことで複雑化・詳細化できる。|
|{}|【処理】内容を波括弧で囲む|「if」「else if」「else」のいずれでも必要。&br()複数行可、複数の処理を書いても良い。|
|;|【処理】内容の最後に必要なセミコロン|これを忘れるとエラーになる、消し過ぎに注意。|


*関数とは?
「関数」とは一定の処理を行いその結果や値を反映させるものです。
EasyBotterでは特にbot.phpで時間わけをする時に使う「date関数」がなじみ深く、また重要な関数となります。
ここではEasyBotterで使うdate関数について説明します。
**date関数
bot.phpでの使用頻度が高い物、bot.phpの動作が工夫できるものを紹介しています。
詳細は[[PHPマニュアル>http://php.net/manual/ja/function.date.php]]をご覧ください。
|単位|date("?")|値|特徴|利用法|
|年|Y|2011など|4桁の西暦||
|~|y|11など|下2桁の西暦||
|~|L|0~1|0=平年、1=うるう年|2月やdate("z")を使う時に有用|
|月|n|1~12|1桁の月には0をつけない|bot.phpで使う機会が多い、覚えてしまおう|
|~|m|01~12|1桁の月に0をつける||
|~|t|28~31|その月が何日まであるか|date("t")とdate("j")の値が同じ時は月末日、など|
|日|j|1~31|1桁の日には0をつけない|bot.phpで使う機会が多い、覚えてしまおう|
|~|d|01~31|1桁の日に0をつける||
|~|z|0~365|その年の何日目か(1月1日が0)|34(立春)以降は春、124/125(5月5日/立夏)以降は夏~など工夫できる|
|時|G|0~23|24時制、1桁には0をつけない|bot.phpで頻出、覚えてしまおう|
|~|H|00~24|24時制、1桁に0をつける||
|~|g|0~12|12時制、1桁には0をつけない||
|~|h|00~12|12時制、1桁に0をつける||
|~|A|AM、PM|午前午後、大文字|12時制の時に有用|
|~|a|am、pm|午前午後、小文字|~|
|分|i|00~59|1桁には0をつける|bot.phpで頻出、覚えてしまおう|
|秒|s|00~59|1桁には0をつける|CRONとの誤差が生じやすい為あまり使う事は無い|
|曜日|w|0~6|0=日曜、1=月曜…6=土曜|数値なので1~5は平日、その他は週末、という分け方も|
|~|D|Mon~Sun|英語の略表記|"w"の意味がわからない方に…スペルミスに注意|


*演算子とは?

**代数演算子とは?
加減乗除など、主に数値の計算をするものです。(文字列などによる例外もあります)
bot.phpでは「%」を使う機会が多いのですが、その意味を間違えている方も少なくありません。
いずれも小学校で習う算数レベルなので、意味を理解すれば難しいものではありません。
***代数演算子
bot.phpでの使用頻度が高い物を紹介しています。
詳細は[[PHPマニュアル>http://www.php.net/manual/ja/language.operators.arithmetic.php]]をご覧ください。
|+|A + B|加算|AにBを足した値|「3 + 7」の値は「10」|
|-|A - B|減算|AからBを引いた値|「19 - 9」の値は「10」|
|*|A * B|乗算|AにBを掛けた値|「2 * 5」の値は「10」|
|/|A / B|除算|AをBで割った値|「10 / 4」の値は「2.5」|
|%|A % B|剰余|AをBで割った時の余り|「10 % 7」の値は「3」|

**比較演算子とは?
名前の通り、演算子の左右にあるものを比較します。
bot.phpの編集において欠かせないものですので、是非覚えましょう。
また、使い方次第で複雑な設定をすることができます。
***比較演算子
bot.phpでの使用頻度が高い物を紹介しています。
詳細は[[PHPマニュアル>http://www.php.net/manual/ja/language.operators.comparison.php]]をご覧ください。
|A == B|AとBが等しい|
|A === B|AとBが同型かつ等しい|
|A != B|AとBが等しくない|
|A <> B|~|
|A !== B|AとBが同型でないか等しくない|
|A < B|AがBより少ない|
|A > B|AがBより多い|
|A <= B|AがB以下|
|A >= B|AがB以上|
これも小学生で習うことですが、「より少ない」「より多い」はその数値を含まない、「以下」「以上」はその数値を含む、という算数の基本を間違えないよう注意。

**論理演算子とは?
論理演算をおこなう為の演算子です……「論理演算」と聞くと耳慣れませんが、「ベン図」と聞くとピンと来る方もいるかと思います。
(ベン図についてはWikipediaの[[論理演算とペン図>http://ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E5%9B%B3#.E8.AB.96.E7.90.86.E6.BC.94.E7.AE.97.E3.81.A8.E3.83.99.E3.83.B3.E5.9B.B3]]に詳しいのでこの場では説明を省略します。)
条件の組み合わせを一つの式の中に収める為に使われるもので、AND・OR・NOTという基本で成り立ちます。
***論理演算子
bot.phpでの使用頻度が高い物を紹介しています。
詳細は[[PHPマニュアル>http://www.php.net/manual/ja/language.operators.comparison.php]]をご覧ください。
|A && B|AかつBの場合【優先度:高】|
|A || B|AまたはBの場合【優先度:高】&br()「||」はwiki仕様の都合上全角になっています、半角に直して下さい|
|A and B|AかつBの場合【優先度:低】|
|A or B|AまたはBの場合【優先度:低】|
|A xor B|AとBのうちどちらかにだけ当てはまる場合|
|!A|Aに当てはまらない場合|
「A && B && C」「A || B || C」「A && B or C && D」のように、複数の論理演算子を使うこともできます。
ちなみに「A && B or C && D」は優先順位の関係で「AかつB、または、CかつDの場合」となります。

**代入演算子とは?
文字通り「代入」する為の演算子で、代入するものは数値に限らず文字列も代入することが可能です。
代入演算子の左辺にくるものは「$a」のような[[変数>http://www26.atwiki.jp/easybotter_wiki/pages/33.html#id_989275b7]]であることが殆どです。

この代入演算子はbot.php編集において必須の要素ではありません、[[脱初心者してから考える事>http://www26.atwiki.jp/easybotter_wiki/pages/25.html#id_b871d05d]]で説明していますが、EasyBotterにおいては&bold(){完全に脱初心者してから}とりかかる分野となります。
***代入演算子
bot.phpでの使用頻度が高い物を紹介しています。
|A = B|AにBを代入する|結果的にA=B|
|A += B|AにBを加算したものを、Aに代入する|結果的にA+B|
|A .= B|AにBを続けて、Aに代入する|結果的にAB|
|A ++|Aに1を加算したものを、Aに代入する|結果的にA+1|
|A --|Aから1減算したものを、Aに代入する|結果的にA-1|

**演算子の優先順位
全ての演算子には優先順位が設定されており、複雑な動作を構築する上で留意しておかなければなりません。
特に論理演算子は当該項目でも説明していますが、動作に大きく影響するものなので優先順位を把握し適切に使用しましょう。
詳細は[[PHPマニュアル>http://www.php.net/manual/ja/language.operators.precedence.php]]をご覧ください。


*変数とは?
変数はプログラムにおける一時的なデータの事で、特定の文字列や数値に名前をつけることができます。
この変数はbot.php編集において必須の要素ではありません、[[脱初心者してから考える事>http://www26.atwiki.jp/easybotter_wiki/pages/25.html#id_b871d05d]]で説明していますが、EasyBotterにおいては&bold(){完全に脱初心者してから}とりかかる分野となります。
**変数の設定
変数名は「半角英数(a~z、A~Z、0~9)」及び「アンダーバー(_)」ならば下記の事項以外で特に制限はありません。
-変数名は必ず「$」から始めなければなりません
-「$」の直後に半角数字を置く事はできません
-「$」の直後は半角アルファベットまたはアンダーバーでなければなりません
-大文字と小文字は別の文字として扱われます

「$12345」という変数名は数字から始まっているのでダメですが、「$abc123」や「$_1234」はOKです。
また「$ABCD」「$Abcd」「$abcd」は大文字・小文字の差異がある為、全て別の変数として扱われます。
基本的に変数名に使用する文字数に制限はありません、「$a」のような1文字でも良いですし「$today_year_month_day_week」のような長いものでも大丈夫です。
自分で命名できるものですから、自分がわかるものならば大丈夫です。
ただし、文字数が多くなり過ぎるとスペルミスも起こりやすくなるので「$today_year_month_day_week」は「$today_YMDW」と短縮するなど、個人で考えて使用してください。


*最後に
ここまで読んでいただければ、このページ冒頭の[[時間分けとは?>http://www26.atwiki.jp/easybotter_wiki/pages/33.html#id_70adc9ad]]で書いた
 if(date("G") == 7 && date("i") == 30){
 	$response = $eb->postRandom("0730.txt");
 }
を「7時30分に0730.txtからランダムポスト」ではなく、「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」が正解である、と説明したことを理解していただけたと思います。


それでは例題です、難しい構造ではないのでわかりますね?
 if(date("G") == 7 && date("i") == 30){
 	$response = $eb->postRandom("0730.txt");    
 }       
 else if(date("G") == 12 && date("i") == 0){
 	if(date("w") == 0 || date("w") == 6){
 		$response = $eb->postRandom("1200_weekend.txt");
 	}      
 	else{ 
 		$response = $eb->postRandom("1200_weekday.txt");
 	}     
 }      
 else if(date("G") == 23 && date("i") == 30){     
 	$response = $eb->postRandom("2330.txt");    
 }   
 else{   
 	$response = $eb->postRandom("sonota.txt");     
 }   
  if(date("n") == 1 && date("j") == 1 && date("G") == 0 && date("i") == 0){   
 	$response = $eb->postRandom("newyear.txt");   
 }   
正解は、「&color(#ffffff){毎日7:30に0730.txtからランダムポスト、土日の12:00に1200_weekend.txtからランダムポスト、月~金曜日の12:00に1200_weekday.txtからランダムポスト、毎日23:30に2330.txtからランダムポスト、それ以外の実行はsonota.txtからランダムポスト。1月1日0時00分にnewyear.txtからランダムポスト。}」です。
日時での条件分岐はつい「月→日→時→分」という順番で条件付けしがちですが、毎日同じ時間に実行するものを日にちや曜日で変えたい場合は、先に時間を指定してから日にちや曜日で分岐させる方がスマートな構造になります。
また、先に「時」「分」のようにちょっとしたズレで数値が変わってしまうものを条件判定することで、[[時間ズレ対策>http://www26.atwiki.jp/easybotter_wiki/pages/25.html#id_ce8e3a32]]にもなります。
是非、工夫を凝らしてあなたなりのbot.phpを書いてみて下さい。


*コメント
- とりあえず一通りの説明を書き終えました、内容の修正等ありましたらご自由にどうぞ。その他何かあればEasyBotterBBS内の非公式wkiスレに書いていただければと思います。  -- あずき  (2011-07-04 00:32:19)
- あずき様、更新お疲れ様でした!  -- 名無しさん  (2011-07-04 23:13:04)
- わかりやすくて目から鱗です 有難うございます  -- aisk  (2011-11-10 15:52:12)
#comment
目安箱バナー