gradle.propertiesを開き、#org.gradle.parallel=trueのシャープを消すその後、右上のSyncNowを押すこの設定によってCPUの複数のコアを使ってビルドが行われるコンパイル速度は上がるが、AndroidStudioがよりいっそう重くなる
最初に表示される画面といきなりの罠 実行 ビルドの高速化
実行ボタンを押して、動作を確認するエミュレータで実行確認する場合はそのままOKをおす実機で確認する場合は端末の設定をする必要がある設定方法は「実機の使用」の項目を確認してほしいエミュレータの実行結果
使い方の説明だが、おそらく誰も読まないだろうShow tips startupのチェックを外さないと、毎回挨拶してくるぞチェックを外したらすかさずCloseだ出だし早々にエラーが出ているInstall Build Toolsを押して、必要なものを追加する同意しなければ先には進めないたとえ英語が読めず規約内容がなんだかさっぱりわからなくても、Acceptを選択するしか道は残されていないさあ、またダウンロードだしかし今回はそれほど待たされないはずだビルドツールがインストールされると必要最低限のコンパイルが行われるまた待たされるが、この程度でイライラしていたらAndroidのプログラムを組み終える前に胃潰瘍で入院することになるだろうステータスバーの更新表示が収まるまで待ちだ
int i;int a = 0;for(i=2;i<=4;i=i+1){ a = a+i; a = a+i;}
数が多いので主要なものだけ種類 内容 BYTE 1バイト WORD 2バイト DWORD 4バイト SBYTE 1バイト(符号付き) SWORD 2バイト(符号付き) SDWORD 4バイト(符号付き) 符号付きか否かで、演算命令を実行した後のフラグレジスタの扱いが変わる。フラグレジスタは演算結果がマイナス、プラス、ゼロ、オーバーフローなどを判断し、分岐するのに利用される。基本情報に出てくるCASLだと命令の種類で符号ありなしを切り替えるが、MASMでは.if等の疑似命令使用時に命令を切り替える
RecyclerViewは複数のデータをリスト表示する場合に利用する似たような機能を持ったクラスとしてListViewがあるが、全ての要素に対してレイアウトが生成されるため効率が良くないのだRecyclerViewでは表示するのに必要な最低限のレイアウトが作られ、スクロール時にはすでに表示した例愛とを再利用するListViewでも同様なのだが、アイテムごとのレイアウトを管理するためにAdapterクラスを作らなければならないソースコード 完成図 RecyclerViewの配置 アイテム用レイアウトの作成 Itemデータ用クラスとAdapterの作成 MainActivityでのRecyclerView初期化処理 タップ処理の追加 データの更新と再表示
サーバやプログラミングの技術情報
ボタンを押すとフラグメントが切り替わる戻るキーで一つ前のフラグメントに戻る
初回起動時は以下の画面が表示される新規作成はStart a new Android Studio projectを選ぶApplication Name: アプリケーション名Campany Domain: デフォルトで大丈夫だが、公開されたアプリはこの名前で識別されるProject location: プロジェクトの置き場所特に変更しなくても大丈夫だが、APIレベルを上げれば使える機能が増えるバランス的にはAPI 21(Android 5.0)を選んでおくと無難初回は余計なものが生成されない、EmptyActivityを選ぶこだわりがなければ特に変更の必要はないプロジェクト作成後
MainActivityと同じ場所にFragmentを作成するパッケージ名を右クリックし、以下の通り選択していくフラグメントの名前は必要に応じて修正includeのチェックはそのままだと、絶対に使わないコードが大量に生成されるので必ず外すFragmentをデフォルトの名前で2つ生成した結果レイアウトのファイル名が面倒なことになっているが気にしない
以前のバージョンの設定を読み込むか選択無ければそのままOKを押すそのままNext好きな配色を選ぶ(後で変更可能)エミュレータを使うならVirtualDeviceをオンにする使わないならHAXMもいらないのでチェックを外すSDKの場所はデフォルトで構わないが、複数のユーザで使いまわすなら全員でアクセス可能な場所にするもはや、とにかく待つしかない30分ぐらいは覚悟しよう
AndroidStudioのダウンロード 初回起動
Android開発において、Eclipseのサポートが外されてから久しい 現在ではAndroidStudioを使うことが一般的となっている そのほかの開発ツールもあるにはあるが、情報量を考えるとイバラの道である 公式サイト https://developer.android.com/studio/index.html 目立つところにあるdownloadを選ぶと、インストーラ付きのexeファイルが選択される .zipファイルでダウンロードし、自分で展開したい場合はDOWNLOAD OPTIONSを選ぶ .zipならインストールの必要がないので管理者権限がなくても利用可能だ
Androidのプログラミングは、Googleが過去を振り返らない作り方をしているため、古い情報を参照するとまともに動かないということが多い このサイトの情報もすぐに陳腐化してしまうことだろう Androidに関しては入門書籍としてのお勧めの本は存在しない 気がついたらAndroidStudioの仕様は変更されているからだ Web上で出来る限り最新の情報を探して回るしか無いのだ
とりあえずIE11で確認しておけば、大抵のものには対応できるこういう時にこそ、進化しないブラウザの真価が発揮されるのだ
名前フォーマットPHPの出力JavaScriptの認識ATOMY-m-d\TH:i:sP2018-12-13T07:59:43+00:00Thu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)COOKIEl, d-M-Y H:i:s TThursday, 13-Dec-2018 07:59:43 UTCThu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)ISO8601Y-m-d\TH:i:sO2018-12-13T07:59:43+0000Thu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)RFC822D, d M y H:i:s OThu, 13 Dec 18 07:59:43 +0000Thu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)RFC850l, d-M-y H:i:s TThursday, 13-Dec-18 07:59:43 UTCThu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)RFC2822D, d M Y H:i:s OThu, 13 Dec 2018 07:59:43 +0000Thu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)RFC3339Y-m-d\TH:i:sP2018-12-13T07:59:43+00:00Thu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)RSSD, d M Y H:i:s OThu, 13 Dec 2018 07:59:43 +0000Thu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)W3CY-m-d\TH:i:sP2018-12-13T07:59:43+00:00Thu Dec 13 2018 16:59:43 GMT+0900 (日本標準時)
名前フォーマットPHPの出力JavaScriptの認識ATOMY-m-d\TH:i:sP2018-12-13T08:21:09+00:00Thu Dec 13 2018 17:21:09 GMT+0900 (日本標準時)COOKIEl, d-M-Y H:i:s TThursday, 13-Dec-2018 08:21:09 UTCMon Dec 13 -2018 17:40:08 GMT+0918 (日本標準時)ISO8601Y-m-d\TH:i:sO2018-12-13T08:21:09+0000Thu Dec 13 2018 17:21:09 GMT+0900 (日本標準時)RFC822D, d M y H:i:s OThu, 13 Dec 18 08:21:09 +0000Thu Dec 13 2018 17:21:09 GMT+0900 (日本標準時)RFC850l, d-M-y H:i:s TThursday, 13-Dec-18 08:21:09 UTCInvalid DateRFC2822D, d M Y H:i:s OThu, 13 Dec 2018 08:21:09 +0000Thu Dec 13 2018 17:21:09 GMT+0900 (日本標準時)RFC3339Y-m-d\TH:i:sP2018-12-13T08:21:09+00:00Thu Dec 13 2018 17:21:09 GMT+0900 (日本標準時)RSSD, d M Y H:i:s OThu, 13 Dec 2018 08:21:09 +0000Thu Dec 13 2018 17:21:09 GMT+0900 (日本標準時)W3CY-m-d\TH:i:sP2018-12-13T08:21:09+00:00Thu Dec 13 2018 17:21:09 GMT+0900 (日本標準時)
for(初期化式; 継続条件式; 再初期化式)int i;//iを0に初期設定;i<3を満たしていたら処理を実行;処理終了後、iに1を足すfor(i=0;i<3;i=i+1) System.out.println(i); //iの値を出力し改行
for(初期化式; 継続条件式; 再初期化式)int i;//iを0に初期設定;i<3を満たしていたら処理を実行;処理終了後、iに1を足すfor(i=0;i<3;i=i+1) System.out.println(i); //iの値を出力し改行
IE11 Edge Firefox Chrome
for文の基礎 for文の基礎 for文ブロック
名前フォーマットPHPの出力JavaScriptの認識ATOMY-m-d\TH:i:sP2018-12-13T07:59:57+00:00Thu Dec 13 2018 16:59:57 GMT+0900 (東京 (標準時))COOKIEl, d-M-Y H:i:s TThursday, 13-Dec-2018 07:59:57 UTCInvalid DateISO8601Y-m-d\TH:i:sO2018-12-13T07:59:57+0000Invalid DateRFC822D, d M y H:i:s OThu, 13 Dec 18 07:59:57 +0000Invalid DateRFC850l, d-M-y H:i:s TThursday, 13-Dec-18 07:59:57 UTCInvalid DateRFC2822D, d M Y H:i:s OThu, 13 Dec 2018 07:59:57 +0000Thu Dec 13 2018 16:59:57 GMT+0900 (東京 (標準時))RFC3339Y-m-d\TH:i:sP2018-12-13T07:59:57+00:00Thu Dec 13 2018 16:59:57 GMT+0900 (東京 (標準時))RSSD, d M Y H:i:s OThu, 13 Dec 2018 07:59:57 +0000Thu Dec 13 2018 16:59:57 GMT+0900 (東京 (標準時))W3CY-m-d\TH:i:sP2018-12-13T07:59:57+00:00Thu Dec 13 2018 16:59:57 GMT+0900 (東京 (標準時))
if文に対してelseを記述すると、条件に合わなかった場合の処理を記述することができる。int a = 3;if(a==5) a = a * 2;else a = a * a;
PHPのDateTimeで定義されている定数のうち、フォーマットが重複するものは弾いている<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>日付変換の確認</title> <script type='text/javascript'> addEventListener("DOMContentLoaded",function(){ var body = document.body; var dates = <?php getDateValues()?> //PHPから日付を受け取る var table = document.createElement('table') table.border=1 var r = table.insertRow() r.innerHTML = "<TH>名前</TH><TH>フォーマット</TH><TH>PHPの出力</TH><TH>JavaScriptの認識</TH>" for(var i=0,length=dates.length;i<length;i++){ r = table.insertRow() var d = dates[i] r.insertCell().textContent = d.name r.insertCell().textContent = d.format r.insertCell().textContent = d.value r.insertCell().textContent = new Date(d.value) //JavaScriptで変換を試みる }
PHPは日付を自由に扱うことが出来る。入出力に使う書式はユーザ側が設定できるのだ。だが物臭な人のために、わざわざ定義済みの書式を用意してくれている。ではこれを使って、PHPから吐き出した日時のデータが、JavaScriptできちんと読み込まれるのか検証していこう。
F6を押すごとに命令を一つ実行する
ブレークポイントの設置 デバッグ実行 ステップ実行
プロジェクト名 → デバッグ → Javaアプリケーションパースペクティブの切り替え → はいパースペクティブを元に戻す場合は、ウインドウ右上に「Java」「デバッグ」と並んでいるのでJavaを押す
掲示板はあらゆるWebシステムの基礎だ。 これを自分の力で作れるようになれば、大抵のシステムは実装可能となる。世の中のWebシステムは掲示板の変形に過ぎないからだ掲示板を作る上で必要なこと PDOのDBアクセス 掲示板用のスタイルシート 掲示板(ページ遷移あり) 掲示板(ページ遷移なし) 大抵なんとかなる
ページ遷移しないSPAタイプの掲示板だ。見た目はそっくりだが、メッセージの表示出力は差分で行われる DBとのやりとりはページ遷移するものと一緒だ。違うのはクライアント側とのデータ送受信の方法である。クライアントから送られてきたデータは$_POSTでは受け取らない。file_get_contents('php://input')で生のまま受け取っており、それをJSONに変換している。 また、クライアントへデータを返す処理もJSON形式で行っている。BBSTest02.php<?phprequire "Database.php";//パラメータの取り出し$params = json_decode(file_get_contents('php://input'),true);//DBを開く$pdo = openDB("data/bbs.db");if(!$pdo){ echo "DBのオープンに失敗"; return 0;}//テーブルが存在しなかったら作成execDB($pdo,"create table IF NOT EXISTS bbs(id integer primary key,name text,msg text,bbs_date timestamp)");//パラメータが送られていなければ初期HTMLデータを出力if(!isset($params["functions"])){ outputHTML(); return 0;}//要求された命令を実行$results = [];foreach($params["functions"] as $key => $function){ if(!isset($function["cmd"])) continue; switch($function["cmd"]){ case 'setData': //書き込み処理 $results[$key] = 0; if(isset($function["name"],$function["msg"]) && strlen($function["msg"])){ $count = execDB($pdo,"insert into bbs values(null,?,?,c
PHPTest.cssHTML{ height: 100%;}BODY{ display: flex; flex-direction: column; overflow: hidden; height: 100%;}input{ box-sizing: border-box;}FORM{ text-align: center; margin: 2em;}FORM > div{ border-bottom: solid 1px;}FORM > div > div{ display: inline-block; width: 10em;}FORM > div > input[type=text]{ width: 20em;}FORM > input[type=submit]{ width: 32em;}@keyframes MsgShow { 0% {opacity: 0.1;transform: scaleY(0.0)} 100% {opacity: 1;transform: scaleY(1.0)}}div[data-type=msg]{ flex: 1; overflow: auto;}div[data-type=msg] > div{ display:flex; margin: 0.1em; padding: 0.2em; border-bottom: dashed 1px; animation: MsgShow 0.5s ease 0s 1 normal;}div[data-type=msg] > div > div:nth-child(1){ width: 10em;}div[data-type=msg] > div > div:nth-child(2){ flex: 1;}
SQLiteのDBアクセスを簡単に行うための関数を用意したDatabase.php<?php//データベース接続処理function openDB($path){ $pdo = null; try{ $pdo = new PDO("sqlite:$path"); if($pdo){ $pdo->setAttribute(PDO::ERRMODE_WARNING, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } }catch(Exception $e){} return $pdo;}//データベース操作処理function execDB($pdo,$sql,...$params){ try{ if($pdo === null) return false; if($params !== null && count($params)){ $stmt = $pdo->prepare($sql); foreach($params as $index => $param){ if(gettype($param) == "resource") $stmt->bindValue($index+1,$param,PDO::PARAM_LOB); else $stmt->bindValue($index+1,$param); } $stmt->execute(); return $stmt->rowCount(); } return $pdo->exec($sql); }catch(PDOException $exception){} return null;}//クエリー結果取得処理function queryDB($pdo,$s
単純に掲示板といっても意外に馬鹿にできない。クライアント・サーバ間のデータのやりとりや、DBアクセスを行う必要があるのだ。
Test41.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = 10;$b = &$a;$b = 20;echo $a;?> </BODY></HTML>実行結果20参照渡しは関数以外でも利用できる注意すべき点は参照渡しを設定すると、参照元の変数と同等の状態になると言うことだTest42.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = [10, 20, 30];$b = &$a;$b = [30, 40, 50];print_r($a);?> </BODY></HTML>実行結果Array ( [0] => 30 [1] => 40 [2] => 50 )配列であろうと上書きされるCのポインタのような感覚で使うと痛い目を見るので気をつける必要があるちなみに参照渡しを解除するときは以下のように記述し、いったん変数を削除するunset($b);
実行を中断したい箇所の行番号左側をダブルクリックし、ブレークポイントを設置する
Test36.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = sprintf("%02d+%03d=%04d%s<br>", 1, 2, 1 + 2, "です");echo $a;?> </BODY></HTML>実行結果01+002=0003です文字列を標準出力に出さずに、戻り値として返す文字列の加工を行いたい場合に利用する
PHPの命令は数が多すぎて、一つ一つ解説していったらシャレにならないということでWebアプリを作る上で、最低限知っておくべき命令を解説するecho print printf sprintf
Test37.php<!DOCTYPE html> <HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?phpfunction sum($a=100,$b=200){ return $a + $b;}echo sum(10,20),"<br>\n";echo sum(), "<br>\n";?> </BODY></HTML>実行結果30300関数は引数にデフォルト値を定義できるデフォルト値は与えなくても問題は無いが、呼び出し時に引数が足りていないとエラーになるreturnは値を返す必要が無ければ省略できる
Test34.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php print "あいうえお<br>"; print("あいうえお<br>"); echo("あいうえお");?> </BODY></HTML>実行結果あいうえおあいうえおあいうえお一般的にechoの方が使用頻度が高いが、printも所々で見かけるechoと違い、引数の複数指定は出来ない
関数の作成と利用 可変引数 可変引数の逆 参照渡し 参照渡しに関して
Test33.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php echo "あいうえお",100,"かきくけこ","<br>"; //以下の書き方はエラー //echo("あいうえお",100,"かきくけこ","<br>");?> </BODY></HTML>実行結果あいうえお100かきくけこ引数をドットではなくカンマで区切っているところが注目すべきポイントであるカンマ区切りの場合、複数の引数としてechoに引き渡されるドットの場合は結合された文字列が生成されてからechoに引き渡される処理的には大きく異なるが、実行結果は変わらないので好きな方法を使えば良い
Test32.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a="2";switch($a){ case 1: echo "数値の1<br>\n"; break; case 2: echo "数値の2<br>\n"; break; default: echo "それ以外<br>\n"; break;}?> </BODY></HTML>実行結果数値の2switch文は==と同じようにタイプを厳密に判定しない
Test38.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?phpfunction output(...$a){ foreach ($a as $v) { echo $v, "<br>"; }}output(10, 20, 30, 40);?> </BODY></HTML>実行結果10203040変数が可変の場合は...を使うことによって、配列としてデータを受け取ることが出来る
Test31.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?phpfor($i=0;$i<5;$i++) echo "$i<br>\n";echo "<br>\n";$i=0;while($i<5){ echo "$i<br>\n"; $i++;}echo "<br>\n";$i=10;do{ echo "$i<br>\n"; $i++; }while($i<0)?> </BODY></HTML>出力結果012340123410特にコメントするまでもなくループ構造が作れるcontinueを使えばループの頭に移動、breakを使えばループから抜けるまた、break 値で、抜ける制御構文の数を指定でき、1がデフォルトであるdo~whileは後判定で、必ず一回はブロック内の命令を実行する
// \を2つ書くことによって、プログラム上では\一つとして文字が作成されるpublic class Test { public static void main(String[] args) { System.out.print("こんにちは世界\\n"); System.out.print("こんにちは世界2\\n"); }}
Test30.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = 10;if($a === 10) echo "真<br>\n";else echo "偽<br>\n";$a = 20;if ($a === 10) echo "真<br>\n";else echo "偽<br>\n";$a = 20;if ($a === 10){ echo "真<br>\n";}else{ echo "偽<br>\n";}$a = 20;if ($a === 10) echo "1<br>\n";else if($a === 20) echo "2<br>\n";else echo "3<br>\n";$a = 20;if ($a === 10) echo "1<br>\n";elseif ($a === 20) echo "2<br>\n";else echo "3<br>\n";$a = 20;if ($a === 10): echo "複数"; echo "1<br>\n";elseif ($a === 20): echo "複数"; echo "2<br>\n";else: echo "複数"; echo "3<br>\n";endif;?> </BODY></HTML>実行結果真偽偽22複数2JavaやCの知識がある人間にとってif文は今更と思うかもしれないしかしそこに罠があるPHPにはelseifというキーワードがあり、普通に使えば間にスペースを空けるのと変わりは無いしかし:を付けた瞬間、endifが必要となる文法に変わるあまり使われているところを見たことがないが、一筋縄で
Test39.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?phpfunction output($a,$b,$c){ echo $a, "<br>"; echo $b, "<br>"; echo $c, "<br>";}$out = [10,20,30];output(...$out);?> </BODY></HTML>実行結果102030...を使うことによって配列のデータを複数の引数として渡すことが出来る
and 論理積&& 論理積or 論理和 論理和xor 排他的論理和! 否定
& ビット積 ビット和^ 排他的論理和~ 否定<< 左シフト>> 右シフト
Test29.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = 10 & 3;echo "10 & 3 = $a<br>\n";$a = 10 3;echo "10 3 = $a<br>\n";$a = 10 ^ 3;echo "10 * 3 = $a<br>\n";$a = ~10;echo "~10 = $a<br>\n";$a = 10 << 3;echo "10 << 3 = $a<br>\n";$a = 10 >> 3;echo "10 >> 3 = $a<br>\n";?> </BODY></HTML>実行結果10 & 3 = 210 3 = 1110 * 3 = 9~10 = -1110 << 3 = 8010 >> 3 = 1ビット演算子一覧
=== 厳密な一致== 一致!== 厳密な不一致!= 不一致<> 不一致> 大きい< 小さい>= 以上<= 以下
Test26.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = 10;$b = "10";if($a == $b) echo "一致<br>\n";else echo "不一致<br>\n";if ($a === $b) echo "一致<br>\n";else echo "不一致<br>\n";?> </BODY></HTML>実行結果一致不一致== 型を変換して比較=== 型が違っていた場合は偽を返すJavaScriptにも同様の演算子があるが、これは重要な項目である数値と文字列を厳密に区別したい場合は===を用いる必要がある比較演算子一覧
Test27.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?phpecho "A"."B"."<BR>";echo 1.2."<BR>";echo 1 . 2 ."<BR>";?> </BODY></HTML>出力結果AB1.212PHPは「.」文字列として結合されるんだと軽く考えていると足下をすくわれる数字に「.」を付けると、それは小数なのだ小数という扱いを避けるためにはスペースが必要だそして小数ならそのまま「.」で結合可能だが、整数なら後ろの文字列と一文字空けないとエラーになる
// \nによって改行することもできる public class Test { public static void main(String[] args) { System.out.print("こんにちは世界\n"); System.out.print("こんにちは世界2\n"); }}
Test24.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = array("シュネッケン", "デスソース", "サルミアッキ"); foreach($a as $i => $v){ echo gettype($i)." $i:$v<br>\n";}echo "<br>\n";$a = array("0"=>"シュネッケン", "1" => "デスソース", "2" => "サルミアッキ");foreach ($a as $i => $v) { echo gettype($i) . " $i:$v<br>\n";}echo "<br>\n";$a = array("00" => "シュネッケン", "01" => "デスソース", "02" => "サルミアッキ");foreach ($a as $i => $v) { echo gettype($i) . " $i:$v<br>\n";}echo "<br>\n";?> </BODY></HTML>実行結果integer 0:シュネッケンinteger 1:デスソースinteger 2:サルミアッキ integer 0:シュネッケンinteger 1:デスソースinteger 2:サルミアッキ string 00:シュネッケンstring 01:デスソースstring 02:サルミアッキこれはやっかいな変換規則である過剰装飾されている数字は文字列型添え字となる演算子===系でバグを引き起こす原因となり得るので注意が必要だ
Test23.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a[0] = "あいうえお";$a["0"] = "かきくけこ";echo $a[0]. "<br>\n";echo $a["0"]. "<br>\n";echo "<br>\n";$a[00] = "あいうえお";$a["00"] = "かきくけこ";echo $a[00] . "<br>\n";echo $a["00"] . "<br>\n";echo "<br>\n";?> </BODY></HTML>実行結果かきくけこかきくけこあいうえおかきくけこ添え字において、数値と文字列は同じ扱いを受けるただし無駄な数値表現は丸められるので、そこが文字列を使った場合との相違点だ
PHPで文字列をキーにした配列を連想配列と呼ぶことが多いが、この呼び方は正しくない正確には文字列添え字配列であるもともとPHPの配列は添え字とデータを対応づけるマップの構造であるため、実質的に数値添え字添え字と、内部的な動作は変わりは無い基本的な使い方 配列の初期化 添え字の扱いに関して 添え字の型
Test22.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = array("SCHNECKEN" => "シュネッケン", "DEATH SAUCE" => "デスソース", "SALMIAKKI" => "サルミアッキ");$b = ["SCHNECKEN" => "シュネッケン", "DEATH SAUCE" => "デスソース", "SALMIAKKI" => "サルミアッキ"];//foreachで要素数分だけループ(要素番号を取り出す)foreach ($a as $i => $v) { echo "$i:$v<br>\n";}echo "<br>\n";foreach ($b as $i => $v) { echo "$i:$v<br>\n";}?> </BODY></HTML>実行結果SCHNECKEN:シュネッケンDEATH SAUCE:デスソースSALMIAKKI:サルミアッキ SCHNECKEN:シュネッケンDEATH SAUCE:デスソースSALMIAKKI:サルミアッキ
//MainActivity送信側 Intent intent = new Intent(this,TestService.class); intent.putExtra("MSG","メッセージ送信"); startService(intent);
Test20.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = ["シュネッケン", "デスソース", "サルミアッキ"];$count = count($a); //要素の数を返す//forで要素数分だけループfor ($i = 0; $i < $count; $i++){ echo "$a[$i]<br>\n";}echo "<br>\n";//foreachで要素数分だけループforeach($a as $v){ echo "$v<br>\n";}echo "<br>\n";//foreachで要素数分だけループ(要素番号を取り出す)foreach ($a as $i => $v) { echo "$i:$v<br>\n";}?> </BODY></HTML>出力結果シュネッケンデスソースサルミアッキ シュネッケンデスソースサルミアッキ 0:シュネッケン1:デスソース2:サルミアッキ配列の要素数を取り出す場合はcount()関数を利用するforeachは言語によって方言が多いが、PHPでの文法はサンプルの通りだ
Test19.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a = array("シュネッケン","デスソース","サルミアッキ");$b = ["シュネッケン", "デスソース", "サルミアッキ"];echo "$a[0]<br>\n";echo "$a[1]<br>\n";echo "$a[2]<br>\n";echo "<br>\n";echo "$b[0]<br>\n";echo "$b[1]<br>\n";echo "$b[2]<br>\n";?> </BODY></HTML>出力結果シュネッケンデスソースサルミアッキシュネッケンデスソースサルミアッキ変数の初期化はarrayと[]が使える優劣は特にないので、好きな方を使えば良い
//TestService側 //onStartCommand String msg = intent.getStringExtra("MSG"); if(msg != null){ setMessage(msg); }
setMessage//日付を入れてみる Date date = new Date(); builder.setContentInfo(String.format("%04d/%02d/%02d %02d:%02d.%02d", 1900+date.getYear(),date.getMonth()+1,date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds())); //ステータスバーに通知 builder.setTicker(msg); //ステータスをタップしたときの起動Activityの指定 Intent intent = new Intent(this,MainActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(pi);
サーバやプログラミングの技術情報
//onCreate setMessage("開始"); //onDestory manager.cancel(NOTIFY_ID);
PHPの配列は添え字に数値と配列を混在して利用できる数値のみを扱っている場合も、内部では添え字とデータのマップが作られている基本的な使い方 配列の初期化 配列のループ処理
return null;
Test18.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY><?php$a[0] = "シュネッケン";$a[1] = "デスソース";$a[2] = "サルミアッキ";echo "$a[0]<br>\n";echo "$a[1]<br>\n";echo "$a[2]<br>\n";?> </BODY></HTML>出力結果シュネッケンデスソースサルミアッキPHPの配列は要素数を指定せずにそのまま使用可能だ
void setMessage(String msg){ //通知内容の構築 NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.mipmap.ic_launcher); //アイコンの指定 builder.setContentTitle(getString(R.string.app_name)); //タイトルをアプリ名に設定 builder.setContentText(msg); //通知内容 //通知を登録 NotificationManagerCompat manager = NotificationManagerCompat.from(this); manager.notify(NOTIFY_ID, builder.build()); }
「じゃあ、括弧付きの変数名をそのまま出したいときはどうするの?」という疑問がわくはずだもしそこに思い至らなかった人間はぶっちゃけプログラマに向いていないTest17.php<!DOCTYPE html> <HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <pre><?php$a = "あいうえお";echo "{\$a}という変数\n";?> </pre> </BODY></HTML>出力結果{$a}という変数$の前に\を付けて展開を回避する
Test16.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <pre><?php$a = "あいうえお";echo "${a}という変数\n";echo "{$a}という変数\n";?> </pre> </BODY></HTML>出力結果あいうえおという変数あいうえおという変数文字列中の変数を区別するためには{}を使用する囲む方法は二種類ある
パッケージ名を右クリック -> New -> Service -> TestService
ダブルクオートとシングルクオート 変数の扱い 文字列中の変数での注意点 文字列中の変数名を明確にする 括弧付き変数名を出力
Test14.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <pre><?php$a = "あいうえお";echo "$a\n";echo '$a\n';?> </pre> </BODY></HTML>出力結果あいうえお$a\n 変数もシングルクオートの中では展開されない
//MainActivity側 Intent intent = new Intent(this,TestService.class); stopService(intent); //サービスの停止
Test13.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <pre><?php echo "あいうえお\nかきくけこ\n"; echo 'あいうえお\nかきくけこ\n';?> </pre> </BODY></HTML>出力結果あいうえおかきくけこあいうえお\nかきくけこ\n ダブルクオートでは「\」がエスケープされ、特殊文字として扱われる一方シングルクオートでは「\」がそのまま出力されるダブルクオートで「\」を出力したい場合は「\\」というようい二つ重ねるまた、「\」はフォントにより円マークであったりバックスラッシュであったりするが同一コードである
ServiceプログラムはUIを持たずに、他のアプリケーションの裏で動作することが前提となります。ただしAndroidのバージョンによっては、組み方によって動作中でもあっさりと停止させられてしまう場合があるので注意が必要です。 完全にUIを使わないと動作状態が分からなくなってしまうので、今回は通知領域を使うサービスを作っていきます。サービスの作成 onBindの書き換え 通知出力用メソッドの作成 開始処理 サービスの起動 サービスの停止 メッセージのやり取り(送信) メッセージのやり取り(受信) おまけ New
Test12.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <?php //小数が整数に変換され、少数以下が切り捨て $a = 3.14159; $a = (int)$a; echo $a."<br>"; //小数を文字列に変換しても表示結果は変わらない $a = 3.14159; $a = (string)$a; echo "$a<br>"; ?> </BODY></HTML>型変換にはCやJavaと同じようにキャストが使えるこのキャストのために型の名前は覚えておく必要がある今回、文字列の出力をするときに"(ダブルクオート)の中に変数を書いているPHPでは$で変数を識別することが出来るため、文字列の最中に変数を設定することが出来るこれによる弊害も存在するが、それはまた別項目で解説する
Test11.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <?php //整数と小数を足すと、小数型になる $a = 1; $b = 10.1; $sum = $a + $b; echo $sum . "<BR>"; echo '$a=' . gettype($a) . "<BR>"; echo '$b=' . gettype($b) . "<BR>"; echo '$sum=' . gettype($sum) . "<BR>"; //数値に変換できない文字列は0とみなされる $number = 348596; $string = "三十四万八千五百九十六"; $sum = $number + $string; echo $sum; //先頭に数字がある場合は数値に変換される $number = 348596; $string = "100000を漢字で書くと十万になります"; $sum = $number + $string; echo $sum; ?> </BODY></HTML> まず演算子について先に解説する PHPで文字列を結合させる場合は「.」を用いる 「+」だと数値としての加算になるので気をつけること そしてこのプログラムでは改行のため<BR>タグを結合させている 唐突に出てくるgettypeは、変数の型を返す そして演算できない型の物を計算しようとすると0と見なされる また、数字が途中まで含まれている物は、そこまでが計算の対象となる ただし、警告レベルを上げていると計算はされるが、一緒にエラー表示もおまけされるので気をつけること
最初にも書いたとおり、こういう掲示板のコードを自分の力で書けるようになれれば、大抵のシステムは作成可能となる。ページ遷移しないSPAタイプのシステムも、実は作るのは難しくない 世の中にシステムの作成を簡単にしてくれるフレームワークが溢れているが、そんなものに頼らなくても、いくらでもシステム構築は可能なのである。なぜか世の風潮がフレームワークを使いこなすことに偏ってしまい、自分で当たり前に書けることが書けなくなっているのだ Webシステムを作るというのはただの土方作業だ。大したスキルはいらないのである
定数 変数 変数の型 自動型変換 手動の型変換
PHPのDateの書式に関する部分である実際に使う場合はDateよりもタイムゾーンが個別に設定できるDateTimeの使用を推奨する混沌の書式 PHPの定数として用意されている書式 用意するプログラム 各種ブラウザごとの結果 まとめ
Test10.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <?php $a = isset($_GET['a'])?$_GET['a'] + 1:$a = 0; ?> <form method="GET" action="Test10.php"> <input type="text" name="a" value="<?=$a?>"> <input type="submit" value="入力"> </form> </BODY></HTML>実行内容ボタンを押すごとに1ずつ値を増加させる今回は$aの出力に、変数出力の省略形<?=$a?>を用いている
Test09.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <form method="GET" action="Test09.php"> <input type="text" name="a"> <input type="text" name="b"> <input type="submit" value="入力"> </form> <?php if(isset($_GET['a']) && isset($_GET['b'])) { $a = $_GET['a']; $b = $_GET['b']; echo "$a+$b=",$a+$b; } ?> </BODY></HTML>実行内容
Webアプリでは、テキストボックスやボタンなどによるデータの送信をFormタグを使って行うのが一般的であるちなみに、ここのシステムは一般的ではないのでFormタグは一つも使っていないが、いきなりそういう組み方をするのはお勧めできないボタン入力と表示 POSTメソッド テキストボックスからの入力 足し算させるサンプル 値のインクリメント
Test06.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <form method="GET" action="Test06.php"> <input type="submit" value="入力" name="SET"> </form> <?php echo $_GET['SET']; ?> </BODY></HTML>実行結果1実行結果2入力ボタンを押すと、入力と表示されるボタンを押す前は、$_GET['SET']に値が入っていないのでエラーとなるFormタグを書くときに特に注意するべき点は、actionパラメータに設定する送信先である送信先のアドレスが送信元と同一である場合は、省略してもかまわないパラメータのチェック
Test07.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <form method="POST" action="Test07.php"> <input type="submit" value="入力" name="SET"> </form> <?php if (isset($_POST['SET'])) echo $_POST['SET']; else echo "データ入力なし\n"; ?> </BODY></HTML>FormタグのmethodをPOSTに設定している(省略時はGET)GETとPOSTの違いは、フォーム上で定義したデータがURLに設定されるか、見えない形で送信されるかである検索キーワードのような、他人に渡したり再利用したい物に関してはGETを使う掲示板に書き込むような、フォームのデータを再利用しない物に関してはPOSTを使うまたPOSTを使った場合でも、actionのURLにパラメータを設定すればGETと同じ物を渡すことが出来る先ほどの説明はFormタグでの変化であるその他に挙動の違いがあるとすると、GETはブラウザにキャッシュされる可能性があり、POSTはキャッシュされないことであるそのため、GETで同じパラメータのデータを二回送ると、二回目がサーバに送信されていない場合があるので注意が必要だ
PHPは以下の形で、URLのパラメータ部分からデータを取り出すことが出来る・PHPで受け取る場合の変数の書き方 $_GET['パラメータ名']・ブラウザからパラメータを送る場合の書き方 ファイル名.php?パラメータ名=データ ファイル名.php?パラメータ名1=データ1&パラメータ名2=データ2
Test04.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <?php $a = 0; for ($i = 1; $i <= $_GET['data']; $i++) { $a += $i; echo "$a<BR>\n"; } ?> </BODY></HTML>$_GET['パラメータ名'] によって、URLからパラメータを設定できる確認する場合は、 http://アドレス/Test04.php?data=100というように、ファイル名の後ろに?を書いてパラメータを設定する実行結果13610152128364555667891105………パラメータを指定しなかった場合、警告が有効になっていれば以下のような表示が出力されるパラメータの規則
Test03.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <?php$a = 0;for($i=1;$i<=10;$i++){ $a += $i; echo "$a<BR>\n";} ?> </BODY></HTML> 実行結果136101521283645551~10までの合計を出すプログラムfor文自体は一般的な言語と同様だが、変数名は頭に$をつける点に注意
Test02.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <?php echo 10+20; ?> </BODY></HTML> 実行結果30四則演算は一般的な言語と同様に行える
Test01.php<!DOCTYPE html><HTML lang="ja"> <HEAD> <META charset="UTF-8" /> <TITLE>PHPテストプログラム</TITLE> </HEAD> <BODY> <?php echo "PHPテスト1\n"; ?> </BODY></HTML> 実行結果PHPテスト1PHPを扱う上での前提としてHTMLに関する知識が必要となるなぜならPHPを使うというのは、手動で書いていたHTMLをプログラムで動的に吐き出す仕組みだからだ今回はほとんどの部分が一般的なHTMLで構成されている重要なポイントは<?php ~ ?>上記の範囲内でPHPのプログラムを書くということだ
Linux上でPHPを動作させる場合、WebサーバとPHPのアプリケーションサーバの組み合わせになるApache + php_mod 一昔前の標準 Apacheに内蔵される形になるので設定が簡単 php-fpmとの組み合わせもあるが、おそらくメリットはないNginx + php-fpm 最近の流行 動作させるまでの設定が面倒 メモリー消費が少なく大量にアクセスが来た場合に対処しやすい今からやるならNginxをお勧めする
大抵の場合、OSはWindowsではなくLinuxを使うことになる理由は3つある・OSのコストがタダ(好き好んで有料のディストリビューションを選ばなければ)・サーバのスペックが低くても動く・CUI前提なので、リモート操作がやりやすい
フレームワークというと、必ずと言って良いほどMVCがついて回るModel(モデル) View(ビュー) Controller(コントローラ)
ユーザが視認できる表示要素の最終結果を制御する主な役割はモデルから送られてきたデータを、見せられるデータに加工することである
多くの人がクライアントOS上にPHPを入れることになるだろう一通りの環境をすぐ使えるようにするのならXAMPPを入れると話が早いちなみに私はテスト用のサーバを用意しているクライアントでサービスを起動したりはしない本番環境と同じなので、問題が発生しにくいからだGCEやAWSなどなら、クレジットカードさえあれば一年間は無料で使えるので、そういったVPSの使用をお勧めする
アプリケーション全般のロジックの制御を担当するデータの入出力もコイツ、ビューに表示要求するのもコイツ、コントローラの挙動を確認するのもコイツ
本番環境のOS 本番環境のサービス 開発用テスト環境
「ブログリーダー」を活用して、空雲さんをフォローしませんか?
指定した記事をブログ村の中で非表示にしたり、削除したりできます。非表示の場合は、再度表示に戻せます。
画像が取得されていないときは、ブログ側にOGP(メタタグ)の設置が必要になる場合があります。