Strings of Life

PHP/Phalcon/MySQL/JavaScript/RegExp/Ruby/Perl/ActionScript

2014年02月

<meta  name="viewport" content="width=device-width">
↑がHTMLの<head>内に書いてあるかチェック。 これが入っていないと、iPhone等では解像度(960 x 640等)に従って描画されるので、「Bootstrap入れたのに表示がPCのままだ!」となる。 viewport設定を入れてやると、横幅320pxで描画される。

グロブ

通常、シェルは、コマンドラインに指定されたすべてのファイル名パターンを、それにマッチするファイル名に展開する。これをグロブ(globbing)と言う。

例: ~/*.txt → ホームディレクトリにある全ての.txtファイル

Perlプログラムの中で、*.txtのようなパターンを展開するには、glob関数を使う。

my @all_files = glob '*';
my @txt_files = glob '*.txt';

Unixファイルシステムの基本(iノードとリンク)

  • 各ファイルは、番号が振られたiノード(inode)に格納される(ディスクを土地だと考えると、iノードは、その特定の1区画に相当)。
  • 各iノードはリンク数(link count)という数を持っている。iノードがどのディレクトリにも入っていなければ、リンク数は必ず0になる。iノードがディレクトリに追加されると、リンク数が1つ増やされる。
  • ls -lコマンドの出力で、パーミッションフラグ(-rw-r--r--等)の右隣りに表示されるのはリンク数。ほとんどのファイルは1、ディレクトリは最低でも2。
  • リンク(ハードリンク)を作成できるのは、ファイルのみ。ディレクトリは不可。
  • ボリュームをまたいでリンクを作成することはできない。

シンボリックリンク

シンボリックリンク(symbolic link)は、ディレクトリ内の特別なエントリで、システムに対して別の場所を見に行くように指示する。シンボリックリンクには、以下のような特徴がある。

  • シンボリックリンクでは、リンク数は増えない。
  • ディレクトリに別名をつけることができる。
  • ボリュームをまたいでシンボリックリンクを作成することができる。

パーフェクトPHP (PERFECT SERIES 3)
小川 雄大
技術評論社
2010-11-12

p.127で、「定数に用いることができるのはスカラーの値のみです。式を用いたり、配列やリソースなどを定数に用いることはできません」と記載されているが、PHP5.6では定数定義に式を用いることができるようになっている(constant scalar expressions)。ここに限らず、古く感じられる説明が出てきている。そろそろ改訂版が欲しいところ。

標準クラスからオブジェクトを生成する

<?php
$obj = new stdClass(); // 空のオブジェクトを生成
$obj->member = 'hoge'; // PHPでは未定義メンバに値を入れてもエラーにはならない
$obj->method = function(){echo $this->member;}; // 未定義メソッドの定義はエラーが出ないが…
$obj->method(); // 実際に呼び出すとエラーが出る

遅延静的束縛(staticキーワードによる呼び出し)

<?php

class Foo
{
  public function getClassNameGateway()
  {
    echo self::getClassName(); // 必ず Foo::getClassName() が呼ばれる
    echo static::getClassName(); // 呼び出されたコンテキストに応じて解決される(Fooが呼べばFoo::getClassName()、Barが呼べばBar::getClassName()が呼ばれる)
    echo PHP_EOL;
  }

  public static function getClassName()
  {
    return 'Foo';
  }
}

class Bar extends Foo
{
  public static function getClassName()
  {
    return 'Bar';
  }
}

$foo = new Foo();
$foo->getClassNameGateway(); // FooFoo

$bar = new Bar();
$bar->getClassNameGateway(); // FooBar

オートローダの仕組み(__autoload()を使う場合)

<?php
$obj = new Foo(); // 未定義クラスを呼び出すと、__autoload()が自動的に呼び出される

function __autoload($name) {
  echo $name, PHP_EOL; // ここで $name を元にPHPファイルを読みこめば、オートローダになる
}

ただし、__autoload()にはオートロード処理を1種類しか登録できないため、実際のオートローダはほとんどspl_autoload_register()で実装されている。

名前空間

<?php
namespace Acme; // 名前空間の宣言の前には、PHPタグとコメント以外の出力や文が存在してはいけない

class stdClass {}; // \Acme\stdClass
function file_get_contents(){}; // \Acme\file_get_contents()
const E_ALL = 0x01; // \Acme\E_ALL
$var = 0x01; // 変数に名前空間は適用されない


Java開発環境構築メモ(Mac OS X 10.9の場合)

  • JDKをダウンロードしてインストール(以前インストールしたと思うけど、してないかも)
  • IntelliJ IDEA 13 Community Editionをインストール(PhpStormでIntelliJ系のUIに慣れてるので…)
  • ターミナルで「java」と「javac」コマンドを打ってインストール完了したか確認
  • 「javac」で文字化けしたので、文字化けを解消する

つまづいたポイント

コマンドラインでjavaコマンドでバイトコードを実行する時、「.class」を末尾に付けると「java.lang.NoClassDefFoundError」というのに遭遇する。「.class」無しで実行すればOK。

例:

MyFirstApp.javaを作成
→ 「javac MyFirstApp.java」
→ MyFirstApp.class というファイルができる
→ 「java MyApp」(.classは付けない)

注意点?

条件判定に使えるのはBoolean型のみ。他の言語では、0や空文字列がfalseと評価されることを利用して、「0か否かで分岐」「空文字列か否かで分岐」といった処理を書くことがたまにあるが、Javaではできない。

Javaのコンパイルと実行を1行で行うシェルスクリプト

# Javaを1行でコンパイル && 実行
function runj {
    javac $1 && java `echo $1 | sed 's/\.java//'`
}

javacでコンパイル後のファイル名を指定する方法が分からなかったので、「hoge.java → hoge.class」というコンパイルが行われることを前提とした感じに。

# ぶっちゃけ、IDEAで「Run」した方が早いけど…

Hello World

public class HelloWorld {
    public static void main(String[] args) {
        System.out.print("Hello, world!");
    }
}






山田祥寛氏の本はいつもそうなのだけど、「初級者と中級者の橋渡し」という意味では非常に良く出来ている一方、若干粗がある。本書もその例に漏れない。

本書の良いところは、JavaScriptのコアの部分について、丁寧に解説しているところ。特にChapter4とChapter5に載っている、関数定義とJavaScriptのオブジェクト指向構文については、丁寧でわかりやすい。

また、実務上はChapter6、7のブラウザオブジェクト及びDOMも重要。jQueryを紹介している点もポイントが高い。

一方、本書の瑕疵では無いものの、2010年の本なので若干情報が古い。本書で紹介しているテスティングフレームワークのJsUnitは、既に開発終了している(後継プロジェクトにJasmineがある。また、jQueryで使用されているQUnitが、導入が簡単で個人的にはおすすめ)。また、YahooのAPIも現在では利用できない。

また、コード例に、JavaScriptのベストプラクティスから若干外れているものが散見されるのもマイナスポイント。
例:
// 悪い例
var flag = (1 == 1);
if (flag) document.writeln("hoeg");

// マシな例
var flag = (1 === 1); // 比較は===を使うべき
if (flag) { // if文の中括弧({})は省略すべきではない
    document.writeln("hoge");
    // Chapter5までのサンプルは console.log() でも実行できる
}
コーディングスタイルに関しては、別途、JavaScriptパターン等の書籍を参照したほうがいい。

レベル感としては、「jQueryは一応使えるけど…」とか、「JavaScriptの入門書は1冊読んだけど、クロージャとかプロトタイプとかはよくわからん」とかいった人であればジャストフィット。

現在、JavaScriptの書籍は数多く出てるけど、「初心者向けに簡単な事だけを説明した本」や「中上級者向けに高度なトピックを説明した本」が主で、初級者から中級者への橋渡しを上手にやってくれる本はそう多くない。その点、本書は2014年現在でも希少な存在。

このページのトップヘ