ラオスの思い出その2 ラオスのクリスマス

ここの所どうしても平日は疲れがたまって、更新が土日のみになってしまうけど、まあ仕方ないか。
というわけで(だから何がというわけでなんだよ)、今回はラオスの思い出シリーズその2、ラオスのクリスマスについてです(何で3月にクリスマスの話題なんだというのはこの際置いておく)。
ラオスはご存知の通り(?)仏教国ですが、仏教以外は受け入れないわけでは決してなく、クリスマスの時期は普通にみんなお祝いしていました。

配属先のラオス国立大工学部IT学科ではプレゼント交換をやって、その後ケーキを食べたりみんなで盛り上がっていた思い出があります。
ラオスには2年間いたからクリスマスのプレゼント交換は2回やっていて、1回目は日本から持ってきていたもの(確か扇子だっけ?)を持って行って、2回目は確かコップを持って言った記憶があります。当たった方は、1回目がUSBで、2回目は写真立てでした。

その他にも、住んでいた場所から自転車で7分くらいのところにあった僕が夕食でたまに行っていたお店でもクリスマスパーティーをやっていました。
その時はお店に行ったらいつもと雰囲気が違うからどうしたのかと思ったら、「今日はクリスマスのパーティーだ、食べていけ」と言われて自分もパーティーに参加させてもらいました。
ブタの丸焼きとかビーフシチューとかワインとか豪華なごちそうを楽しみつつワイワイ盛り上がっていました。
ところでそのお店、普段はカオパット(チャーハン)とかのラオス料理屋でそこそこ美味しくたまに通っていたんですが、ある日潰れちゃったんですよねえ・・・ラオスにいた2年間の間に何度かそういうことはあったんですが、自分がよく行くお店が潰れると何ともやりきれない残念な気持ちになりました。

他にもビエンチャン市内では色々なところでクリスマスの装飾が飾ってあって、ラオスの人たちもクリスマスを楽しんでいるんだなあと思いました。1月下旬くらいまでクリスマスの飾りが残ってあったりして、そこがまたラオスらしいところでもありました。
ブタの丸焼き
クリスマスケーキ
クリスマスツリー

PHPのオブジェクト指向

うわー、2週間も更新が止まってしまったorz
というわけで、久々の更新はPHPのオブジェクト指向について。

PHPはオブジェクト指向のプログラミング言語です・・・って、今時使われる言語でオブジェクト指向じゃない言語って、C(C++じゃないC)の他に思い浮かばなかったり。Cでも構造体とか使ってオブジェクト指向っぽくできないこともないし。

なので、PHPのオブジェクト指向で他の言語と違うところを中心に簡単にまとめてみようかと。
例としてお客さんを表すCustomerというクラスを考えてみることにする。

メンバー変数、メソッドをpublic(どこからでもアクセス可能), protected(そのクラスと子クラスからのみアクセス可能), private(そのクラスからのみアクセス可能)の修飾子を付けて定義するというのは他の言語と変わらないかと。
上の例ではCustomerクラスの変数$customerを最初に宣言して、$customerの年齢ageに25を入れています。
気を付けるのは、コンストラクタを__construct()で定義すること。C++やJavaから来た人だと、慣れないうちはついpublic Customer()と書こうとしちゃうかもしれないですね(自分の事です)。
後はクラス内のメンバーやメソッドを呼び出すときでも$this->を忘れないようにしましょう(結構これでエラーになることは多いです)。

後は、通常のメンバー変数やメソッドの他に静的(static)なプロパティやメソッドというものもあります。

staticなプロパティやメソッドはクラス名::を付けることでオブジェクトを生成しなくても呼び出すことができます。
なお、クラス内でstaticなプロパティやメソッドを呼び出すときはself::を頭につけます。

次は、継承についてです。

見てのとおり、extendsを付けて継承します。Javaもそうでしたね。オーバーライトなんかも他の言語と同様にできます。
ちなみに、PHPでは多重継承は不可です。が、トレイトというものを使うことで多重継承のようなことができるようです。自分は使ったことはないので、こちらあたりを見てみてください。

後はabstractをつけて抽象クラスを定義できたり、interfaceをつけてインタフェースを定義できたりします。

フレームワークなんかはバリバリにオブジェクト指向を使っているので、フレームワークのソースを見てみると、オブジェクト指向の有用性を実感できると思います。

Javascriptのオブジェクト指向は普通のクラスベースではなくプロトタイプベースという独特なものなので、どこかでそれについても紹介しようと思います。

ラオスの思い出その1 メコン川沿いの屋台

昨日予告した通り(?)、今日はラオス隊員時代の思い出話で更新しようと思います。
今日の話は、メコン川沿いにあった僕がよく通っていたラオス料理屋台のお話。

その屋台はメコン川沿いの、ドミトリー(いわゆる隊員連絡所。ラオスに来たばかりの隊員は任地に配属されるまでの最初1か月はそこで生活する。)の近くにあったので、ラオスに来たばかりの頃よく通っていた。
そのお店はラープ(ひき肉と香草のスパイシーサラダ)やタムマークフン(半熟パパイヤの辛いサラダ)といったラオス料理の王道といえるものからカイルーク(ふ化しかけの卵)といった変わったものまで幅広く揃えていて味もなかなかおいしく、それでいて値段もそんなに高くなく、ビエンチャンの中でも手軽にラオス料理を楽しめるお店の1つとして重宝していました。もちろんビアラオもありました。
でも最大のお店はお店の人の人柄でしたね。とにかく陽気なおっちゃんで、僕の顔も覚えてくれて通りがかると「今日はビアラオ飲んでいかないのか?」と声をかけてくれて、僕がラオス生活の序盤においてラオスという国になじむのにここのお店の存在も大きかったと思っています。
そんなこんなでドミトリーを離れて任地(と言ってもドミトリーから自転車で40分くらいだけど)に配属されてからも比較的よく通っていました。

でも何故か、僕が来てから1年半くらいの頃にそこのお店がなくなったと思ったらちょっと奥のほうの場所でラーメン屋に衣替えしてたんだよなあ。ラーメンも悪くなかったけど、やっぱりラオス料理のほうがよかったなあ。

一番左(半分くらいしか映ってないけど)が言わずと知れたビアラオ、真ん中がフー(ベトナムのフォーとほとんど同じです)、一番右がタムマークフン

そんなこんなで2日に1回くらいのペースでラオスの思い出話を紹介していこうと思います。
明日(更新できれば)は技術ネタで。お題はまだ未定。

HTML5になって変わったこと

せっかく1週間続けて更新できたのに、またしても滞ってしまった・・・(´・ω・`)
原因としてはここのところ納期前で忙しくなって帰るのがかなり遅い時間だったということなんだけど、まあこればかりは仕方ないか。基本は余裕があるときには更新するということで。更新がないときは忙しいかどっか出かけてるか飲みに行ってるかと思っていただければと。
後、毎日技術ネタだと飽きてくる可能性もあるので、日替わりで技術ネタとラオスでの思い出話(旧ブログで書きそびれたネタをか)を交互に書いていこうかなと。
今日は技術ネタで、明日はラオスの思い出話(何にするかは未定)でいきます。

今日のテーマはHTML5についてです。HTML5がW3Cより勧告されたのが2014年なので、もうすでに大分普及してはいるけど、Chromeが56が正式版になって、完全にデフォルト化したことだし、この機会に簡単にまとめてみるのもいいかなということで。

とりあえず箇条書きでいくつか。
・HTML構文とXHTML(XML)構文の2通りの文書形式が規定されることになった
HTML構文の方はHTML4までの普通のHTMLで、XHTML構文はXHTMLの文法で記述するもので、その2つのどちらを使うかを選べるようになった。うまく説明できないけど、こちらが詳しいかと。

・コンテンツの埋め込みが簡単になった
動画ならvideoタグで、音声ならaudioタグで、グラフィックならcanvasタグでそれぞれ埋め込むことができるようになった。
canvasタグに表示するグラフィックは実際にはJavaScriptを使って描画することになるけど、WebGLとかもどっかで勉強してみたいな。

・より明確に文書構造を示すことができるようになった
文章のヘッダー部分ならheaderタグを、フッター部分ならfooterタグを入れるなどで、文章のどの部分に当たるかを表すことができるようになった。

・様々なAPIを使えるようになった
例えばドラッグアンドドロップなら

こんな風にdraggable属性を用いてドラッグアンドドロップができるかどうかを指定できるようになった。他にも位置情報の取得なんかもできるようになった。

・いくつかのタグが使えなくなった
例えば古いサイトだと文字サイズを大きくするのに

みたいにやっているものもありましたが、HTML5ではfontタグは使えなくなって、文字サイズはstyleで指定するようになった。
新しく使えるようになったタグと使えなくなったタグの一覧はこちらに出てます。使えなくなっているタグを使っている人は書き換えましょう。

他にもフォームの入力補助やチェック機能が充実したり結構いろいろ変わったことはあるけど、もっと色々勉強して新しいHTMlの書き方をマスターしなくては。

2016年11月になってHTML5.1が勧告されていますが、それについてもどっかでまとめてみようと思います。

PHPの文字列関数

毎日更新シリーズ、どうにか1週間続けることができたぞ!まさに、継続は力なりか。

さて、今日はPHPの文字列処理によく使われる関数をいくつか紹介していこうと思います。結構便利な関数がいろいろあるので、使いこなせるようにしておきたいところです。

strlen, mb_strlen
文字列の長さを取得する関数です。例えば

だと、5が返ってきます。気を付けなければならないのは、

だと、4ではなく8が返ってきてしまいます。日本語はマルチバイト文字なので、このような場合は

とmb_がついた関数を使います。

substr, mb_substr
ある文字列の一部の文字列(例えば、3文字目から4文字文とか)を取り出す関数です。(0から始まるので、3文字目から5文字目だとsubstr(文字列、2、4)になります)
substr(元の文字列、開始位置(、取り出す文字列の長さ))という感じです。3つ目の引数を入れないと、開始位置を起点に最後までの文字列を取り出します。2番目の引数に0を入れると最初から、負の値を入れると最後から何文字目を起点にします。

だと’morn’となります。
mb_がついたやつの説明はさっきと同様です。

strpos, mb_strpos
ある文字列の中に、別の文字列が含まれているかどうかを調べます。

だと、5になります。これも起点は0で、2番目の引数が最初の引数に含まれなければfalseが帰ってきます。
mb_は以下同文

str_replace
ある文字列を別の文字列で置き換えます。str_replace(置き換える前、置き換えた後、文字列全体)です。

だと、’good afternoon’になります。

explode
文字列をある文字列で分解して配列で返します。

とやると、$data[0]=’192′; $data[1]=’168′; $data[2]=’255′; $data[3]=’254′; です。

trim
文字列の先頭と末尾のスペースとか余計なものを取り除きます。

とやると、’I am Japanese.’だけが返ってきます。
2つ目の引数に削除したい文字を指定して入れることができます。

だと、半角スペースと’.’が消えるので、I am Japaneseになります。

他にどんなの関数があるかは公式ページを見てください。

MySQLによるデータ操作の基本

今回のテーマはMySQLによるデータ操作の基本についてです。
RDBMS (関係データベース管理システム) はかなり前にOracleのデータベースを使ったことがあるけど、ここ最近はほとんどMySQLしか使ってないけど、他のRDBMSでも基本的なところはほとんど変わらないはずです。
基本はSELECT、INSERT、UPDATE、DELETEの4つのSQL文です。

SELECT(データ抽出)
SELECT カラム名 FROM テーブル名であるテーブルの選択したカラムを表示する。あるテーブルの全てのカラムを表示したいときはSELECT * で全カラムを表示できます。
テーブル名の後にWHERE 条件で表示するレコードの条件を追加できます。
他にもORDER BY カラム名であるカラムの昇順(DESCで降順)に並び替えて表示することも出来ます。

INSERT(データ追加)
INSERT INTO テーブル名 (カラム1, カラム2, ・・・)VALUES (カラム1の値, カラム2の値, …)であるテーブルに指定の値を持つレコードを追加できます。指定しなかったカラムにはデフォルトの値が入ります。全てのカラムの値を指定する場合のみカラム名の省略が出来ます。
複数のレコードを追加することも出来ます。その場合はVALUESの後を (カラム1の値, カラム2の値, …), (カラム1の値, カラム2の値, …),・・・とします。

UPDATE(データ更新)
UPDATE テーブル名 SET カラム名=値(,カラム名=値,・・・)で指定したカラムの値を指定した値に変更します。こちらもWHERE 条件文で値を変更する条件を設定します。これを入れないと全レコードが同じ値になってしまいます。

DELETE(データ削除)
DELETE FROM テーブル名 WHERE 条件文で、条件文に当てはまるレコードをテーブルから削除します。WHERE以降を入れないと全レコードが削除されるので、気を付けてください!

実際にはJOINを付けて別のテーブルをくっつけたデータを表示したり、サブクエリ(SQLの中に入るSQL)を使って値を集計したりすることもあるけど、基本的にはこの4つが全てです。
もう少し例を使って説明したかったけど、今日はこの辺で。

リーダブルコード

目指せ(略)シリーズ第5弾は、リーダブルコードという本の紹介です。結構有名な本なので、ある程度プログラミングやってる人なら知ってる人も多いと思います。
実際、ウチの会社でもこの本をテーマに勉強会をやったことがありました。ソースコードというものは個人の趣味とかで作るならともかく、仕事とかでは作ったものは長い間使われるのが普通だし、また将来自分以外の人が改修することも考えられるので、それらを踏まえて読みやすくする必要があるわけです。

とりあえず重要なところを15分で抜粋してみます。
2章と3章では主に命名の仕方についてです。
関数や変数の名前は適当につければいいのではなく、ちゃんと意味のある名前を付ける必要があります。
流石にaとかbとか論外な名前を付ける人は今ではそんなにいないとは思いますが、get()とかset()とかでもまだ不十分。例えばgetStringLength()とかsetFilterRules()とか、何をgetするのかとか何をsetするのかがわかりやすくなる名前が望ましいです。
ただ、for文の中のループカウンタとか一時的に使われるものについてはiとかjのような変数名で問題ないです。

4章は改行の位置とかソースの見やすさについてです。
例えば、変な位置に改行が入っていたりいくつもいろんなところでいくつも改行が入っていたりすると違和感を感じる人は多いと思うけど、逆に全く改行がないのも読んでいて疲れます。ちゃんと意味のある区切りで適切に改行を入れるのがいいです。
後はいくつかの変数を並べて書く場合は、ランダムに並べるのでなく重要なものから順番にとかアルファベット順とか意味のある並びにするほうがわかりやすいです。
後、この本では触れられていないけど、インデントも適切に入れるべきです。インデントといえば、あるところでスペース4つなのにあるところでタブだったりすると何かと不便です。どちらかに統一しましょう。最近はスペース4つが主流ですね。

5章、6章はコメントについて。適切なコメントはコードを読むうえで助けになるけど、意味のないコメントやコメントのためのコメントならないほうがいいです。
例えばこんなの。

中身見ればわかるっつーの。

こっちのほうがよっぽどいいです。

7~9章は制御フローとか変数のスコープとかロジック的な話。例えば、if/else文のブロックは肯定的な意味のあるほうを先に処理するとか、式が巨大になったらうまく分割するとか、変数のスコープはなるべく小さくするとか。
ただ、3項演算子は使わないほうがいいとあったけど、うまく使うと便利な場合もあるので、ケースバイケースだと思います。

10~13章は下位問題を抽出して汎用化するとか、1度に1つのことをやるとかコードを小さく保つとか、全体の構成的な話。以前4000行くらいある関数を見たことがあったけど、さすがに読んでいて疲れましたね。

この本に書いてあることはなかなかうなずけるものも多いけど、結局はケースバイケースなところもありますね。一番大事なのは一貫性を持たせることですね。

プロジェクト内でコーディングについての規約があるときはそれは絶対守りましょう。一から作る場合だとどういう風にするか悩むこともあると思いますが、「コーディング規約」でググると結構いろんなものが見つかりますね。

よく使うLinuxコマンド

目指せ(略)シリーズ第4弾、今回はLinuxコマンドの中でも特によく使うやつや便利なものをいくつか簡単に紹介してみます。
・ファイル表示・編集系
・cat
ファイルの内容を表示するコマンドです。オプションとしては”-n”で行番号を付けて表示できます。”-b”だと空行を除いて行番号を表示できます。

みたいに使います。

・vi
コマンドライン版のテキストエディタ。hで左、jで上、kで下、lで右というのが最初慣れなかったけど、最近のは普通に矢印キーでも移動できるようになっています。
iで現在のカーソルから、aで1つ右のカーソルから編集モードになって、ESCでコマンドモードになります。
結構大きなテキストファイルから10000行を削除したいときとか、GUIのテキストエディタ(notepad++, Sublime textとか)だと結構大変だけど、viだと10000ddとやると一瞬で現在の場所から10000行削除してくれたりするので、普段GUIのテキストエディタを使っている人でも使えるようにしておくと何かと便利です。

・head、tail
head Nだとあるファイルの最初からN行を、tail Nだと最後のN行を表示します。
ちなみに、-fオプションでそのファイルを開きっぱなしにできるので、tail -f 10 ***.logとかで実行中のファイルのログを監視したりとかもできます。

・検索系
・grep、egrep
ファイルの中のある文字列を検索するのに使えます。-nで行数表示、-vでその文字列を含まない行を表示します。
また、grep (オプション) (文字列) (ファイル名)の後に|をつけると検索結果の一覧にさらにgrepをかけることができます。
例えば、こんな感じです。

*.txtで終わるファイルのhelloを含む行からeveryoneを含む行を除いたものを行番号付きで表示します。

egrepだと正規表現で検索できます。正規表現については別の機会に。

・find
これは、ある条件に当てはまるファイルを検索するコマンドです。
find [パス] [検索条件]で検索します。

で、dirディレクトリの中にあるaaa.txtという名前のファイルを探します。

・権限系
・chmod
あるファイルおよびフォルダの権限を変更します。
chmod (オプション) 3桁の数字 ファイル名orフォルダ名
です。3桁の数字は左から所有者、グループ、一般ユーザーで、4で読み込み、2で書き込み、1で実行権限で、それぞれの対象について与えたい権限の総和を入れます。
testというフォルダがあったとして、

で、所有者はtest内のすべてのファイルに対して読み書き実行、グループユーザーは読み書き、一般ユーザーは読み込みだけが可能になります。

他にもたくさん紹介したいコマンドはあるんですが、こちらがよくまとまっています。

PHPのスーパーグローバル変数

目指せ毎日更新シリーズ第3弾として、PHPのスーパーグローバル変数について紹介してみる。
スーパーグローバル変数というと、何だかすごくカッコ良さそうな名前だけど、簡単に言うと、Webページ間を行ったり来たりするときに情報のやり取りのために裏で持たせておく情報を保存する場所といったところか。

まずは、$_GETについて。使われる場面としては検索フォームの検索ワードとかブログの何ページ目を見ているかとかの情報で、例えばこのブログの2017年1月のアーカイブのURLに出ている?m=201701がそれにあたる。意味はmというパラメータに201701という値を入れてリクエストを送信したということ(これをGET送信という)。GET送信では複数のパラメータを送ることもできて、2つ目以降だとこんな風に&でつながれる。
デバッグするときは

とやると上のケースでは4が入っていることがわかる。

次は$_POSTについて。これは画像ファイルを送信したり掲示板にコメントを送信したり、URLには入りきらないような大きなデータを入れるのに使う。

このようなフォームのテキストボックスに「こんにちは」と入れて送信すると、post.phpでは$_POST[“comment”]に「こんにちは」が入っていることになる。

それ以外ではクッキーの値が入る$_COOKIEと、セッションの変数を保存する$_SESSIONが比較的よく使われる。

クッキーはWebページのユーザー情報なんかをブラウザに持たせて読み込ませるためのもので、

みたいにsetcookie関数を使ってクッキーをブラウザに保存させることができる。この例だと$_COOKIE[‘id’]に$idの値を1週間保存させるということになる。

セッションはクッキーとは逆にサーバー側に情報を保存させるためのもの。
ユーザーのログイン情報とかを保存するのに使われる。

他にどんなものがあるかなどは公式ページを見てください。

とここまで書いてきて何だが、実は自分は仕事ではこれらはほとんど使っていなかったり。なぜなら、仕事ではフレームワークを使っていて、これらのスーパーグローバル変数はフレームワークの関数でラッピングされているからなわけで。

JavaScriptによるDOM操作の基本

前回がサーバー側言語のPHPだったので、目指せ毎日更新シリーズ第2弾はフロント側言語のJavaScriptで書いてみる。

JavaScriptを使う主な目的はずばり、動的にHTMLを操作することなわけだが、その基本的なやり方を15分で書ける分でまとめてみようと思う。

HTMLをいじるにはDOMというものを扱う必要があるのだが、DOMとは何かの説明自体はこちらを見てもらうとして、では具体的になにをやるのかを簡単に説明してみる。

一番簡単な例として、あるIDを持つタグに対する入出力を考えてみる。

これを取得するには次のようにすればいい。

1つのHTMLファイルに対して同じIDを持つタグは1つしか取れないので、タグの中身がhelloに入ることになる。
このタグの中に、例えば「こんにちは」というテキストを入れたいときは、次のようにする。

他にも、

とやれば文字の色が青くなるという風に、スタイルを変えたりすることもできる。
それ以外にもdocument.getElementById(“hello”).innerHTMLにhtmlタグを入れれば取得したIDの要素の中にHTMLを入れることもできる。
後は下のようにdocument.createElementでタグを生成してそれにテキストを入れて、appencChildで取得した要素の子要素として入れることもできる。

ID以外にも、クラスとかも取得することができる。

とやれば、dogクラスを持つタグを取得できる。クラスはIDと違って複数あるので、document.getElementsByClassNameで取得した返り値は配列になることに注意。
他にも、document.getElementsByTagNameだと同じタグ名の要素を全て取得できる。

本当はjQueryを使ったりするともっと簡単にできるんだけど、それについては別の機会にやろうかと。
JavaScriptだと、DOM操作のほかにもイベント処理とかもどっかの機会に紹介しておきたいなあ。