PHPエンジニアから見た他のプログラミング言語

いろいろなプログラミング言語を少し知っていると専門外のソースコードからでも知識が得られます。また、普段使っているものがどれだけ奇異なものなのかわかったりもするので常識的なプログラミングをする上でも重要な事だと思います。

そこで普段 PHP を中心に使っている自分から見た他の言語の印象と特徴を書いてみます。
偏見だらけで間違った内容も含まれます。あまり真剣に捉えないでくださるとありがたいです。

Python

Python でもウェブプログラミングはできますが、人工知能やディープラーニングなどの機械学習分野での活躍のほうが目立っています。インデントに意味を持たせた書き方は独特で驚きましたが可読性が高く合理的です。学術系のライブラリが充実しているのも特徴で、この分野においては他の言語よりも圧倒的に生産効率が高いです。
Django フレームワークを使ったウェブサイト制作や、3DCGのスクリプトなどいろいろな分野をカバーしています。
個人的には FontForge でウェブフォントを作るのに使ったりします。
国内での情報は Ruby に比べるとやや少ないものの海外ではかなりメジャーな言語です。

Ruby

ウェブに関わる者にとって Ruby の存在感は大きいです。なかでも Ruby on Rails は PHP 製フレームワークに強く影響を与えた存在でもあるので構造には見慣れた感じがあります。ウェブサービスの分野では主要な言語なのでいつかマスターしてみたいと思う気持ちは強いです。
小規模なレンタルサーバーなどでは動作する環境が揃っていない事が多く、AWS などのクラウドサービスや VPS などの自由度の高いサーバーで使う機会がほとんどなので環境構築自体が難しく、気楽に始められるものではない印象です。
ウェブに強い言語ではありますがその他の分野でも利用でき、Vagrant などのソフトウェアの開発言語としても知られています。
いくつかフレームワークはあるものの Ruby on Rails がほぼ一強なので「Ruby ができる = Ruby on Rails ができる」と言えるため、フレームワーク選定に迷わなくて済むのはちょっと羨ましいです。

PHP

HTML内にプログラムを埋め込めるため簡易テンプレートとして使われることが多かった PHP ですが、最近ではクラスの実装や大型フレームワークの登場、PHP 7.0 での高速化によってちゃんとしたウェブプログラミングができるように成長しました。
文字列や配列はメソッドを持たないため、「$foo->count()」のようにする代わりに「count($foo)」とするなど関数が中心となっています。
クラスの作成がサポートされるようになってからも標準関数中心の時代からの影響を引きずっています。
代表的なブログアプリケーションである WordPress は大きなシェアを持っており、使うぶんには優れていますが、古い設計と新しい設計が混在するソース構造はひどい状態で、常用されるグローバル変数とクラスにまとめられていない変数群が多用されており、良いお手本とはいえません。
人気のあるフレームワークの Laravel は PHP の良い面を活かした柔軟なフレームワークで中規模サイトでの活躍も増えてきました。

Perl

一昔前までは CGI といえば Perl で、掲示板やチャットはこれで作るものという状況がありましたが今ではすっかり影が薄くなって元気がない印象です。
この頃は CGI は自分で作るものというよりも大御所の配布サイトから頂いて設置したり、レンタルするものと言う感覚がありました。ある意味では国内でウェブプログラミングが停滞した理由はこのあたりにあるのかもしれません。
いつの間にか Perl で作られたブログは WordPress に取って代わり、個人サイトに掲示板を設置する文化自体なくなってしまいました。

Java

Windows, Mac, Linux など OS を選ばずに動作するのが特徴で、GUI ライブラリも用意されているので見た目や操作感も統一できます。Android プログラミングの主要言語なのでかなりのプログラマーが習得している言語の1つです。
他の言語に与えた影響も大きく、Java を知っておくといろいろな言語のソースコードが何となく読めるようになります。何かのアルゴリズムについて知りたいときはたいてい Java のソースがネット上にあるので PHP に置き換えて使ったりしています。
ちょっとしたデスクトップ GUI ツールが必要で Windows や Mac で使う時に Java で組むことが多いです。以前は GUI の見た目が OS ネイティブからかけ離れた不格好なものだったのであまりおしゃれな印象がなかったのですが最近は随分きれいな見た目になりました。
デメリットとして Java がインストールされていなくては動作せず、Java のバージョンにも大きく左右されるため、ユーザー側にもある程度コンピュータの知識を要求してしまいます。

JavaScript

上述の Java と名前が似ているだけでなんの関係もないというのは有名な話です。
以前はウェブページの文字をちょっと動かしたりマウスカーソルにキラキラするものをつけたりする程度のものでしたがjQuery の登場とブラウザでの実行速度があがってから一気に人気が爆発しました。
ウェブアプリでもほぼ必須の存在で、多くのシングルページアプリケーションが作られています。
Node.js の登場によりサーバーサイドでも動作するようになってから更に人気が加速し、Electron を使ったデスクトップアプリも最近ではよく見かけられるようになりました。OS を選ばずに動作するという意味では Java に近いものがあり、HTML + CSS の知識があれば簡単に見た目が作れるためデスクトップアプリの分野でも急速に利用者が増えています。
ES2015(ES6)で正式なクラス構文やモジュール構文を始めとした重要な機能追加があったのですが互換性確保のため Babel, TypeScript, CoffeeScript などのトランスパイラを利用するのが事実上必須になるなどまだちょっとふわふわと落ち着かない感じがあります。

C#

基本的には Windows での GUI プログラムを作成するための言語ですが最近では他の OS でも使えるように努力が続けられています。
Java と似たところのある書き方で直感的に作れるのが魅力で、アプリケーションの実行には .NET Framework が必要なものの Windows には標準付属のため事実上のネイティブアプリを作ることができます。
優れた IDE である Visual Studio で利用でき、C言語や C++ よりも最初の一歩を踏み出すハードは低いです。
人気のゲームエンジン Unity でも C# が使えることも高い人気の理由です。

Visual Basic

C# が今ほどメジャーになる前は Visual Basic はよく使われていました。学習用言語 BASIC を大幅に拡張したもので、業務用のアプリケーション開発で人気がありました。
C# 同様に Visual Studio で GUI の作成ができ、プログラミング初心者に限らず多くのアプリケーションが作られていました。
Microsoft Excel などで簡易版の VBA が利用できるため、事務書類作成の効率化の分野で重宝されています。

Swift

非常に癖があり難解だった Objective-C に替わるものとして作られた言語で、iOS アプリや Mac 用のデスクトップアプリケーション開発用に使われています。
型や nil の扱いに厳しく、暗黙的な型変換が行われないためいい加減な作り方をすることが許されません。ある意味では安定したソフトウェアを作るよう強制されているともいえます。
現時点では限られた用途にしか使えませんが Swift はオープンソース化されているので将来的には Android や Windows などの OS でも動かせるようになるかもしれません。


以上が主要なプログラミング言語の紹介でした。
言語自体の優劣よりもライブラリの人気が言語の人気に大きく関わっています。
普段使っている言語がこの先も使われ続ける保証はないので特定の言語に依存せず時代の流れについて行けるかが重要になってくると思います。

[PHP]Laravel Valet を使った簡単なローカル環境構築

PHP のローカル環境構築行うには様々な方法がありますが、Laravel Valet を使うと複雑な設定なしに簡単に環境を構築できます。
Laravel が開発しているものですが、Laravel フレームワーク以外にも、CakePHP 3、WordPress、Symfony を始めとするほとんどの主要なフレームワークや静的HTMLファイルがサポートされています。

ここでは Mac に Valet をインストールし、サイトを立ち上げるまでを説明していきます。

PHP のインストール

まず前提として新しい PHP がインストールされている必要があるため、それらをインストールするために Homebrew を使います。
Homebrew がインストールされていない場合は下記のようにしてインストールします。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

次に PHP をインストールします。すでにインストール済みの場合は飛ばして下さい。

brew update
brew install homebrew/php/php71

次に PHP へのパスを通します。「~/.bash_profile」に次の行を追記して下さい。

export PATH="$(brew --prefix homebrew/php/php71)/bin:$PATH"

即時反映させたい場合は「source ~/.bash_profile」で反映されます。

Valet のインストール

Valet のインストールは Composer を使って行います。こちらもインストールされていない場合は次のコマンドでインストールして下さい。

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

先程の ~/.bash_profile ファイルに Composer で使う実行ファイルのためのパスを通します。

export PATH="$PATH:$HOME/.composer/vendor/bin"

保存後、必要に応じて source コマンドで反映させて下さい。次に Valet をインストールします。

composer global require laravel/valet
valet install

Valet のインストールを終えたら、プロジェクトの親フォルダを指定します。1つ1つのプロジェクトのフォルダではなく、それらの複数のプロジェクトが格納されている親のフォルダを指定します。ここでは例として「~/Sites」を指定しします。

cd ~/Sites
valet park

valet park コマンドを実行したときのフォルダが Valet と紐付けられ、「http://フォルダ名.test」でアクセスできるようになります。

例えば hello フォルダを作って index.html ファイルを設置した場合、「http://hello.test」でその HTML ファイルが表示されます。

Laravel フレームワークのように公開フォルダとして public がサブディレクトリとして用意してある場合でも特に問題なく表示できました。独自フレームワークなどで任意の公開フォルダを指定したい場合、link コマンドで割り当てることもできます。

cd ~/Sites/my-project/web
valet link project-name

このように好きな名前(ここではproject-name)を現在のディレクトリに割り当てると「http://project-name.test」で「~/Sites/my-project/web」が表示されるようになります。
もとに戻したい場合は「valet unlink app-name」のようにします。

また、ドメイン名の *.test では不都合がある場合、valet domain コマンドで変更できます。

valet domain app

このようにすると *.app でアクセスできるようになります。

TLS を使って暗号化するには「valet secure」コマンドを使います。これにより指定したプロジェクトが「https://〜」でアクセスできるようになります。解除するには「valet unsecure」でもとに戻せます。

valet secure app-name

その他のコマンド

その他にも基本的なコマンドとして下記のものなどが用意されています。

valet forget park コマンドで登録したパスを解除する。
valet paths park コマンドで登録されているパスの確認。
valet restart Valet デーモンの再起動
valet start Valet デーモンの開始
valet stop Valet デーモンの停止
valet uninstall Valet デーモンのアンインストール

[PHP]数字に序数詞をつけて 1st, 2nd 3rd のように出力する

序数のルールは1の位が 1 であれば 1st、2 であれば 2nd、3 であれば 3rd となり、それ以外は th をつけます。
ただし、10の位が 1 の場合はすべて th がつきます。

特定の桁を取得する場合は剰余(10で割った余り)を利用すると簡単です。

以下のコードは 1〜30 の数字を序数に変換して表示するサンプルです。

<?php
for($i = 1; $i <= 30; $i++){
    echo ordinalNumber($i) . "\n";
}

function ordinalNumber( $num ){
    $n = $num % 10;
    $t = floor($num / 10) % 10;
    
    if($t === 1){
        return $num . "th";
    } else {
        switch($n) {
            case 1:
                return $num . "st";
            case 2:
                return $num . "nd";
            case 3:
                return $num . "rd";
            default:
                return $num . "th";
        }
    }
}