PHPデータベース入門に入る。……とその前にPuTTYの替わりにRLoginでVagrantに簡単接続。

CakePHP入門に備え、一日一日ステップアップをしております。今日はPHPデータベース入門を学んでいく。


http://dotinstall.com/lessons/basic_php_db/


第一回の講義では、ターミナルに複数のタブを立ち上げ片方でMySQLをもう一方でPHPビルトインWebサーバーをモニタしていく、とのこと。なんとMacには、タブのついたsshターミナルがある。すごい。PuTTYで複数ウインドウを立ち上げるのも考えたができたら一つの画面に抑えたい。そういうツールはもちろんWindowsにもある。Poderosaとか、RLoginとか。海外製のもあるけど、日本語に対応してなかったりする。Poderosaはいいんだけど、最近活気づいているRLoginも使ってみよう。


難しいのはsshでつなぐ設定。慣れれば簡単だが、なれるまでは一苦労だと思う。

  1. vagrant ssh-configでIdentify Keyの場所をコピーしておく
  2. RLoginの新規サーバー接続設定では、プロトコルssh、サーバーアドレスは127.0.0.1、ポートは2222、SSH Identify KeyにうえでコピーしたIdentify Keyを選択。
  3. 保存して接続。認証キーをキャッシュするので"y"を選んで保存する。すると起動できる。

Poderosaでも同じ。プロトコル、アドレス、ポート、SSH Identify Keyを入れれば接続できるようになります。PoderosaとRLoginの違いはなんだろう、好み……かな?


置いといて、PHPDB入門の続き、2回めから。

  1. 講義用のDB、テーブル、ユーザーを作成。
  2. PDOで接続。new PDO(DSN, USENAME, PASSWORD)でPDOオブジェクトが作られる。setAttributeでExceptionを出すように設定する。
  3. exec()、接続を切る方法。exec()にSQL文を渡す。接続をきるには、PDOオブジェクトをnullとするだけ。例えば $db=null;
  4. prepare():exec→結果を返さない・安全、query→結果を返す・安全・一回のみ実行、prepare→結果を返す・安全対策必要・複数回実行する。prepareでは渡される値は「?」とする。実行するとステートメントが帰ってくる。ステートメントのメソッドexecuteに配列の形で値を渡す。PDOオブジェクトのメソッド、lastInsertIdを使うと最後に挿入されたID値を取り出せる。
  5. prepare()による名前付きパラメータ:?の替わりに「:name」のようにコロンを付けてexecute時に値を渡せる。渡すパラメータが多いときに便利。
  6. bindValue():prepareの引数に値を結びつける。その後引数無しでexecuteを実行すると、結び付けられた値を与えてSQLを実行する。似たようなデータを複数つくるのに便利。for、foreachなどと相性が良い。
  7. bindParam():bindValueと似ているが、prepareの引数と変数とを結びつける。bindValueでは異なる値を与える度にbindVlaue次いでexecuteを呼び出す必要があるが、bindParamでは変数の値を変えて、executeするだけで良い。便利。
  8. query()で全件抽出:fetchAll(PDO::FETCH_ASSOC)で全レコードをKey-Valueペアの配列で返すので、foreachなどで処理する。rowCountで件数を取得できる。
  9. 条件付き抽出:prepareをつかってwhere句のパラメータに渡すやりかた。limitなどに渡す場合は数値で渡す必要があるので、bindValueを使う。
  10. FETCH_CLASS:DBからデータを取得する時に定義済みのクラスオブジェクトとして取得する。なお、カラムはすべてpublicで同じ名前のフィールドとして解釈されるので、class定義で同名のpublicプロパティの定義は不要。privateにしたいときなどには定義する必要がある。
  11. レコード更新、削除:prepareを使って"update users set ..."で更新、"delete from users where..."で削除。
  12. トランザクション:beginTransaction, commit, rollback(これは例外処理で使う)

13/13完了

覚えておくべきは、PDOでの接続の定型文。

define('DB_DATABASE', 'DBの名前');
define('DB_USERNAME', 'DBアクセスユーザー名');
define('DB_PASSWORD', 'パスワード');
define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE);

try {
  $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
  $db->setAttribute(PDO_ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // ここから下にやりたいことを書く。

 $db = null;
} catch (PDOException $e) {

  echo $e->getMessage();
  exit;
}

MySQL基礎の5回目以降

http://dotinstall.com/lessons/basic_mysql_v2/ の五回目から

  1. テーブル作成、データ型:int、double、varchar、date、datetime、enumなど。公式レファレンス
  2. フィールドの高度な設定:not null, default, auto_increment, index系(primary key, key, unique) indexは検索が早くなるが、挿入・更新で遅くなる。
  3. データの挿入。抽出。Where句を使った条件付き抽出。order by句による並び替え。limitによる件数制限。
  4. 集計:count, distinct, max, avg, sum, sum + group by, rand(), order by rand()
  5. 文字列、日付関数:length, concat, substring, now, month, datediff
  6. データ更新、削除。
  7. alter tableによるテーブル構造の変更:add、change、drop、add index、drop index、rename
  8. 複数テーブルの結合
  9. ダンプの取り方、復元:mysqldumpでsqlの形でダンプがとられる。sqlなので、mysqlコマンドの入力リダイレクトに指定することでデータベースを復元することができる。


19/19完了。

MySQL基礎。およびHeidiSQLからVagrant上のMySQLに接続するのに少し苦労した。

今日からMySQL基礎を勉強開始。MySQLは仕事でつかっているので、ざっと流す感じで行おう。


http://dotinstall.com/lessons/basic_mysql_v2/

  1. create database blog_app; --> データベースを作る
  2. set password for root@localhost=password("abcdef"); --> root@localhostにパスワードを設定。password("")とすると、パスワード削除
  3. grant all on blog_app.* to dbuser@localhost identified by 'パスワード'; とするとblog_appにアクセスできるdbuserを作成できる。identified以降を省略するとパスワード無し。


と、ここまでで、CUIでやるのが面倒になってきた。HeidiSQLでつなごう。こちらのサイトのとおりにやるとOKです。


http://www.lancork.net/2013/09/vagrant-connect-mysql-with-heidisql/


ポイントは、認証キーの情報をキャッシュすることらしい。なお、HeidiSQLの9.3を使うと、接続時にキー情報のキャッシュも同時にやってくれるので、コマンドからplinkを起動しなくても良くなります。地味に便利。

PHPの初歩、22回〜、なかなかWebアプリっぽいところを学びはじめました。

昨日に引き続き、ドットインストールにてPHPの初歩を勉強。

http://dotinstall.com/lessons/basic_php_v2/

  1. staticキーワードで定義。インスタンスではなく、クラスに属するプロパティ、メソッドの前につける。「クラス名::」につづけてメソッド、プロパティ($付き)で呼び出す。クラス内部で呼び出すときには「self::」を使う。
  2. 抽象クラス。abstract class で定義。abstractキーワードを使い、メソッドを子クラスで実装することを強制できる。
  3. インターフェース。interfaceで定義。クラスで実装すべきパブリックメソッドをまとめて定義。implementsキーワードに続けて複数のインターフェースをクラスで実装できる。抽象クラスとの違い。抽象クラス…プロパティ、メソッドの実装ができる。一つのクラスで一つしか継承できない。インターフェース…メソッドの定義のみで実装はできない。複数のインターフェースを実装できる。
  4. 外部ファイルの読込。phpファイルが大きくなり、分割した場合には、「require」「include」「autoload」でファイルを読みこむ。requireではファイル読み込みに失敗するとFatalErrorで処理が止まり、includeでは同様の場合Warningで処理を続行、autoloadは未定義のクラスが出てきた時に初めてファイル読み込みを行なう仕組み。
  5. 名前空間。namespaceキーワードを使い、ファイルの先頭で定義。クラスなどを使う時にnamespaceを付けて使う。もしくは、useキーワードでnamespaceに別名をつけて使う。
  6. 例外処理。try...catch節を使う。今回はdiv/0!に対して、throw new Exception("hogehoge")とするコードを書いた。
  7. フォームからのデータ処理。actionが指定されていない場合は、ページに埋め込まれたPHPが呼ばれる。$_SERVER['REQUEST_METHOD'] === 'POST'などでPOST/SET/GETリクエストに依るものか判別。$_POST['変数名']でPOSTで渡された変数を取得できる。input type=textの値はPOSTされると消えてしまうので、value=""などとして事前に渡された値が入るようにすると丁寧。
  8. Cookieの使い方。Cookieはブラウザにデータを保存する仕組み。setcookie(名前、値、有効期限)とする。有効期限が指定されていない場合はブラウザを閉じるまで。有効期限が今より前の時間だとクッキー削除。クッキーを取得するのは$_COOKIE['名前']とする。
  9. Sessionの使い方。Sessionはサーバーにデータを保存する仕組み。session_startとしてから、$_SESSION['名前']="〜〜〜"としてセットする。unser($_SESSION['名前'])で削除。セッションを取得するには$_SESSION['名前']とする。
  10. クッキーとセッションの違い。クッキーは気軽に使えるが、サイズが小さく、ユーザー側でデータを見たり、データ改ざんのおそれがある。セッションは大きなデータも可能で、データを見られたり改ざんの恐れがない。

30/30完了。次はMySQLの講座をさっと眺めて、必要なところだけやろう。

PHPの初歩

昨日作ったローカル開発環境を用いて、PHPのレッスンを始めている。


http://dotinstall.com/lessons/basic_php_v2/

  1. フォルダを作って、そこに直接index.phpというファイルを置いて編集するというやりかた。ゲストOSのフォルダアクセスにはWinSCPを使う。
  2. index.phpを読みこむためには、ビルトインWebサーバーを使う。「ip a」でIPを調べ「php -S 192.168.33.10:8000」で起動。あとはホストOSのブラウザからアクセス可能。
  3. 変数の頭には"$"をつける。定数の定義にはdefine("XXXX","何かの値")とする。XXXXは慣習的に大文字にする。
  4. __LINE__、__FILE__、__DIR__という組み込みの定数がある
  5. 四則演算(+,-,*,/,%,**)、単項演算子、代入を伴う演算(+=など)
  6. 文字列について。ダブルクォート、シングルクォートの違い、結合など
  7. if文を使った比較。比較演算子の==、===の違いは、==は値のみ比べる、===は値と型を比べる
  8. 真偽値:以下の場合はfalseになる。文字列:空、"0"、数値:0、0.0、論理値:false、配列:要素の数がゼロ、null。および三項演算子
  9. switch文
  10. while/do...while, for文
  11. 配列。連想配列と普通の配列が同じ。普通の配列は連想配列のkeyが省略されたもの。$colors=["red","blue","green",]; という感じ。
  12. foreachの使い方。「:〜endforeach;」という描き方もある。このコロン記法はHTMLに埋め込んで書く時に波括弧より対応がわかりやすく便利。
  13. 関数。functionで定義。引数、デフォルト値、戻り値はreturnで返す。ローカル変数への注意。
  14. 組み込み関数。ceil,floor,round,rand。strlen,mb_strlen、printf。配列のcount、implode(連結)
  15. クラスとインスタンス。classで定義していく。extendsで継承する。finalキーワードでプロパティ、メソッドをoverrideできないようにする。
  16. public、private、protected


21/30終えたところ。


全部C++で学んだことの応用なので楽。

ローカル開発環境の構築[Windows編]を始める

CakePHPを学ばないと、とコースを始めるが、そのためにはPHPMySQLを学ばないとならない。そこでは、ローカル開発環境が構築されていることが前提となっている。


できれば仮想環境を入れたくなかったが背に腹は変えられない、VirtualBoxVagrantを入れる講座をとってみた。


http://dotinstall.com/lessons/basic_localdev_win

  1. VirtualBoxを入れる
  2. Vagarntを入れる。起動。
  3. Puttyを入れる
  4. vagrantにgitをいれる。ドットインストールの講座リソースをgitでコピー。centos65のフォルダに入り、./run.shを走らせる→PythonPHPrubyMySQLApacheがインストールされる。これに兎に角時間がかかる。インストールされた環境のバージョン確認。Apacheが入っているかは「sudo service httpd status」で調べる
  5. suspendによるvagrantの停止
  6. WinSCPをいれてつなぐ。インストール時PuTTyのショートカットはインポートしない。サイト登録時にはSFTPを使い、パスワードは保存しない設定。
  7. /var/www/htmlにphpファイルを作成。ホストOSのブラウザから見てみる
  8. hostsファイルをいじって、ゲストOSのIPをdev.dotinstall.comとする。

全十回の講座でした。

アウトラインプロセッサを試している

良さそう
OlivineEditor:今のところ一番良さそう。階層付き
Nami2000:軽い。表題非表示でテキストにできる。
Kie:Kieと似てる。
構造化エディターMDI/SDI:


もう一歩
NanaTerry:パネルがたくさんあって何をすれば良いのかわからない。初期状態でノード作成のショートカットがない。


今ひとつ
Sol:http://homepage1.nifty.com/knowledge-osmo/
  表題と本文をわけられない
AUTLA:色がどぎつく、ごちゃごちゃした印象。
BIETEL:起動が遅い。フォントの色が茶色であまり印象がよくない。親ノードを複数作れない。Enterで兄弟を作り、Tab/Shift-Tabでノード深さ変更。


対象外
irohaNote:オフラインで動作する軽量Evernoteという感じ。印刷もテキスト出力もないので対象外
OmniOutlinerMac
FrievieEditor:アイデアツリー


まだ触ってない
ESDB
iEdit
VerticalEditor


なかなか良いのが見つからない。結局付箋紙に鉛筆で書いたものを台紙に貼り付けて、写真撮ってEvernoteに入れている現状。