レンタルサーバー引っ越し

このサイトの運営にあたって、レンタルサーバーを今まではfc2のライトプランを使ってやっていたわけだが、今回いろいろな理由でさくらレンタルサーバーに引っ越すことにしました。
最大の理由としては、fc2のライトプランだとphpのバージョンの関係で自分が普段使っているフレームワークであるLaravelが使えないということで、比較的新しいバージョンのphpが使えるレンタルサーバーを調べたところ、さくらが無難かなということで決めました。
他にも、sshでログイン出来ることとかも大きかったです。これによってちょっとしたこと(いらないファイルの削除とか)が出来るようになって、いろいろ便利だと実感しています。
とはいえ、フォルダのリンク先の設定とか結構ややこしかったこともあったりします(この辺を参照)。でも今回の作業で多少はサーバーとかDNSとかインフラ関係の勉強になったし、まあよかったのかなと。
Laravelで作ったブログはこちらで、プログラミングとか技術的なことについては今後は主にそっちに書くと思います。というか会社の関係で、月1回は技術的な内容のブログを書いていて、それにその自作ブログを使うという意味合いもあります。
後はせっかく引っ越したことだし、もっと全体的にコンテンツの充実も図っていこうかと。

何はともあれ、今まで4年7か月ほど、fc2レンタルサーバーにはお世話になりました!さくらレンタルサーバー、これからよろしくお願いします!

JavaScriptのオブジェクト指向 その1

ここのところいろいろバタバタしたり体調崩したりで久々の更新になってしまった(>_<)

前回こちらでPHPのオブジェクト指向について取り扱ったので、今回はJavaScriptのオブジェクト指向について簡単に説明してみます。
JavaScriptのオブジェクト指向で、最も特徴的なのはプロトタイプベースということでしょう。C++やJava、PHPやRubyなどのほとんどのオブジェクト指向言語はクラスベースなので、その辺の違いに戸惑う人は結構多いと思います(僕もそうでした)。
クラスベースのオブジェクト指向言語では最初にクラスを定義して、その中にプロパティやメソッドを定義していくのですが、JavaScriptではオブジェクトはプロパティと値の組み合わせで表現されます。値には数値(Number)、文字列(String)、論理値(Boolean)といった基本型(プリミティブ型ともいう)もしくは別のオブジェクトが入ることになります。
例えば、こんな感じです。

var person = {
    name :  'Yusuke',
    age    :  37,
    home : 'Tokyo'
}

プロトタイプベースと聞くと「何だそりゃ?」と思うかもしれないですが、基本的にはハッシュテーブルみたいなものと考えておけばそんなに間違いはないかなと思います。
プロパティの値を確認したいときは、

console.log(person.name);    // Yusukeと帰ってくる

とすればいいことになります。
これを見ると気がつくかもしれませんが、JavaScriptの標準で用意されているconsoleも実はオブジェクトです。これ以外にも、よく見るdocumentとかwindowなんかもオブジェクトです。なので、JavaScriptでは基本的にほとんどのものはオブジェクトとして扱うことができるのです。
オブジェクトの中身は簡単に書き換えることができます。例えば、

person.age = 25;

とすればpersonオブジェクトのageプロパティの値が37から25に変更されます。
また、新しいプロパティを追加することも同様にすぐできます。

person.occupation = 'programmer';

とすれば、personオブジェクトに新たにoccupationというプロパティが定義されます。
オブジェクトのプロパティを削除するときは、deleteを使います。

delete person.home;

とすると、homeプロパティが削除されます。削除した後にアクセスしようとすると、undefinedになります。

後、一つ重要なのは「JavaScriptでは関数もオブジェクト」ということです。
例えば、toDouble(n)という2倍の値を返す関数があったとします。
普通はこう書きます。

function toDouble(n) {
    return 2 * n;
}

console.log(toDouble(4)); //8

しかし、これをオブジェクトのように書くと、こうなります。

var toDouble = function(n) {
    return n * 2;
}

console.log(toDouble(4)); //8

まだまだ説明が不十分だったり書き足りなかったりするところも多々あるけど、基本的にブログ更新はあまり時間をかけすぎないようにしているので、どこかでJavaScriptのオブジェクト指向 その2をやろうと思います。

PHPのオブジェクト指向

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

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

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

 
class Customer
{
    private $age;
    private $purchase:
    public function __construct() {
        $this->purchase = 0;
    }
    public function setAge($age) {
        $this->age = $age;
    }
}

$customer = new Customer();
$customer->setAge(25);

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

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

public static function outputAge() {
    echo $this->age;
}

Customer::outputAge();

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

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

class ForeignCustomer extends Customer {
    private $country;
    public function setCountry($country) {
        $this->country = $country;
    }
}

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

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

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

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

PHPの文字列関数

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

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

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

<?php echo(strlen('hello')); ?>

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

<?php echo(strlen('おはよう')); ?>

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

<?php echo(mb_strlen('おはよう')) ?>

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

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

<?php echo(substr('good morning', 5, 4)); ?>

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

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

<?php echo(strpos('everyday', 'day')) ?>

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

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

<?php echo(str_replace('morning', 'afternoon', 'good morning')); ?>

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

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

<?php
 $data = explode('.', '192.168.255.254');
 ?>

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

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

<?php
    $str = '  I am Japanese.  ';
    echo(trim($str));
?>

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

<?php
    $str = ' ...I am Japanese.  ';
    echo(trim($str, " ."));
?>

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

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

リーダブルコード

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

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

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

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

// $priceを引数として、引数に1.08倍した値を返す
function get_price($price) {
    $price = $price * 1.08;
    return $price;
}

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

// 消費税込み価格計算用関数
function get_price($price) {
    $price = $price * 1.08;
    return $price;
}

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

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

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

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

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

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

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

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

<?php
    var_dump($_GET['cat']);
?>

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

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

<form action="post.php" method="post">
    <input type="text" name="comment">
    <input type="submit" value="送信">
</form>

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

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

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

setcookie('id', $id, time() + 60 * 60 * 24 * 7);

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

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

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

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

JavaScriptによるDOM操作の基本

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

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

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

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

<div id="hello">
・・・・・・
</div>

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

<script>
    var hello = document.getElementById("hello");
</script>

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

<script>
    document.getElementById("hello").textContent = "こんにちは";
</script>

他にも、

<script>
    document.getElementById("hello").style.color = "#0000ff";    //#0000ffは青を表す
</script>

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

<script>
    var label = document.createElement("label");
    label.textContent = "おはよう";
    document.getElementById("hello").appendChild(label);
</script>

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

<script>
    var dogs = document.getElementsByClassName("dog");
</script>

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

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

PHPの配列

ブログの更新頻度が低いままなのもアレなんで、今日からなるべく毎日少しでもブログに何か書いてみることにする。
旅行とか、特にネタがないときはぱっと思いついた技術ネタを少しづつ。更新にかける時間は1日15分くらいを目安に無理のない範囲で。

目指せ、毎日更新シリーズ第1弾は、PHPの配列について。

PHPは初めて教わったのが去年のセブ島なのは今までにも書いたとおりだけど、配列とかの扱いがC言語とかに比べてすっごい便利だと感じた(もちろんC言語にはC言語の良さがあるんだけど)。
まず、C言語だと最初に

int data[10];

みたいに領域を確保するか、あるいは領域を固定させたくない場合は

int* data;

のようにポインタを使うしかなかった。
それが、PHPでは

data = [1, 3, 5];

と初期化された状態から

data[3] = 10;

と領域を確保しなくても配列に値を追加できるし、もっと簡単に

data[] = 10;

とかすることもできる。
C++だとVectorをつかって

vector<int> data;
data.push(10);

とかもできるけど(Vectorも初めて使ったときはすごい便利だと思ったものだ)、PHPの簡素さには及ばないか。

他にも、

data["Tokyo"] = "Japan";
data["Vientiane"] = "Laos";
data["Manila"] = "Philippines";

とか特に宣言しなくても要素に整数以外の値を入れて連想配列みたいに使うことができるっていうか、普通の配列と連想配列の区別がない。
いわば、C++のVectorとmapのいいとこ取りという感じか。C++だったら演算子定義とかもできるからそれを使えば自分で似たようなものを作ろうと思えば作れるんだろうけど(そもそもPHP自体Cで書かれてるからそうやって作ったんだと思うけど)。

他にも、便利な関数もたくさんあって、とにかくいろんなことが簡単にできるというのが新鮮だった。
とはいえ、便利で自由な分自分が今何をやっているかを常に気を付けておく必要があるのだが。

PHPの配列は結構奥が深かったりするので、また時間があるときにもっと掘り下げてみようかな。

2017年に向けて

新年あけましておめでとうございます。
昨年2016年は、3か月間のセブ島でのプログラミング留学でそれまで未知の分野だったWebプログラミングの技術を身に着け、そっからラオスを訪問したりして英気を養って、日本に帰国。
そこから転職活動で、なかなか思うように決まらず焦る時期もあったものの、何とか内定を勝ち取り、6月末から本格的なWebエンジニアとしてのキャリアをスタートすることに。
そこから先は半年間あっという間に過ぎ去ったような気もしないでもなく、もっといろいろ勉強したいこともあったものの、仕事を通して確かに徐々に実力がついていく充実感もまた実感はしている。

とはいえ、一流のプログラマーといえるようになるにはまだまだ学ばなくてはいけないことは山ほどあるわけで。
仕事以外の個人学習で勉強しようと考えていることは、ざっとこんな感じか。
・PHP
まずは今の仕事で用いているフレームワーク「Laravel」をさらに使いこなせるようにすることか。5.3で実装されたLaravel Passportとかあまり使ったことのない機能も使えるようにしておかないと。
それ以外だとライブラリとかAPIももっと色々使えるようになりたい。特に興味があるのは、FacebookやTwitterのAPIを使ってプログラムから投稿できるようにしてみるのも面白いかも。
余裕があれば、Laravel以外のフレームワークを触ってみたい気もするけど、まずはLaravelを極めることか。とはいえ、他のフレームワークを知ることでLaravelの強みや弱みもよりわかってくるんだろうという気もするけど。
・JavaScript
こちらの方は、自分自身もっと勉強しなくてはと感じている技術なので、まずは練習あるのみか。
その中でも、仕事で使うVue.jsは特に強化しておきたいところ。
後はサーバーサイドJavaScriptのNode.jsも面白そう。
・データベース
こちらもまずはMySQL全般だけど、それ以外ではNoSQLについてもある程度は勉強しておきたいところ。
ドットインストールでNode.jsとMongoDBをやってみて、Node.jsは何となく感覚つかめてきたけど、MongoDBの設定で行き詰った(><)
後は2年連続午後2で落ちているデータベーススペシャリストに今年こそは受かりたいな。
・インフラ関連
サーバー構築、ネットワークなどもエンジニアとしてはしっかりとやっておかなくてはならないところ。AWSとかも機会があれば習得しておきたい。
・その他
PHPとJavaScript以外の言語(やったことあるのだとC++, Java, Python, 未経験のだとRuby, Goあたり)も勉強しておきたいけど、まずはPHPとJavaScriptをしっかりとだな。ただ、スマホアプリは何か1つは作ってみたいな。
後、機械学習とかアルゴリズム関連も本当に余裕のある時に。

こうして見ると、やりたいことが本当に山ほどあるけど(まあこの分野は次から次に覚えなきゃいけないことが増えていくから仕方ないのだが)、まずは目の前にあることをしっかりと、だな。

プログラミングの勉強以外では、ジム通いは定期的に続けていきたい。ハーフマラソンも1度は出て、前回より速く走りたい。フルはちょっと厳しそうだけど。
旅行は行きたい場所としては伊勢神宮、北海道、九州あたりか。北海道と九州は恐らく野球かサッカーと絡めるんだろうけど。今年は海外は難しいかな?
それ以外は、ここの所技術書と旅行ガイド以外の本をあまり読んでない気がするので、読書も少しはしようかな。
後は、結婚相手探しか。こればかりは相手があってのことなので、何とも言えないけど(苦笑)

とまあ欲張ればきりがないけど、ついに幕を開けた2017年、精一杯楽しんでいい年にするぞ!

サイトのセキュリティ強化

ここのところあまりサイトの更新ができていなかったけど、一部コンテンツのセキュリティを強化しようと考えている。
きっかけとしては、掲示板にスパムコメントがしばしば投稿されること。もともとセブに留学しているときのプログラミングの授業で作ったやつで、XSS対策とSQLインジェクション対策は入れてたけど、CSRF対策は入れてなかったなと思って、ドットインストールの簡易掲示板の内容を参考にCSRF対策を入れてみた。
これで多少は強化されただろうけど、勉強もかねてCAPTCHA(画像認証)も入れてみようかなと思う。
ちなみに掲示板についてですが、スパムは別として自分以外の投稿がなくて少し寂しいので(苦笑)、荒らしとスパム以外のコメントは大歓迎なので、ぜひ書き込んでもらえると幸いです。

他はこのブログも強化しておこうと思う。やり方としてはこの辺が参考になるかなと。
早速、wp-config.phpをアクセス不可にするというのをやってみた。他のも、時間があるときにやっておこう。

ちなみに仕事ではLaravelというフレームワークを使っていて、通常使われるフレームワークはセキュリティ対策は当たり前になっているのであまり意識することはないかもしれないけど、どういうことをやっているかは頭の片隅に置いておくべきなんだろうなーと思う。

セキュリティ強化のついでに、コンテンツももうちょっと充実させたいなと思う。一つ考えているのはアンケートコーナーなんか作ってみようかなと。やはりドットインストールのレッスンを参考にして作る予定。
このサイトは基本はプログラミングとラオスの2つが中心なので、それに沿って色々と作っていきたい。