日曜プログラミング

PHP好き集まれ〜!!

Lravelリファレンスのchapter2でエラー

最近PHPのLaravelというフレームワークについて勉強しており、
主にドキュメントを中心に勉強を重ねていたのですが、
本屋でみかけた"Laravel リファレンス[Ver.5.1 LTS 対応] Web職人好みの新世代PHPフレームワーク"という本が、パラパラみて良さげだったので
自己投資だと重い、購入し読み始めました。

一応、一通りドキュメントで勉強したのでわかったつもりで読んでいたのですが
結構知識の整理のために重宝してます。

しかし、エラーを出しながらなんとか
切り抜けたのですが、気になったのでメモしておきたいことがあります。

chapter2では
GitHub - laravel-jp-reference/chapter2: Laravelリファレンス 2章サンプルプロジェクト
のサンプルコードを使って説明していっているのですが、

そこで実際にサンプルコードをダウンロードして、
composer.lockファイルに基づいてcomposer installコマンドでvendorディレクトリにパッケージにインストールしていきます。

その時にエラーの表示が出てきたので、メモしておきます。

すべてのパッケージをインストールするたびに
Failed, trying the next URL
(0: The "http://toran.local/repo/packagist/dists/symfony/http-foundation/2.7.7.0/
e83a3d105ddaf5a113e803c904fdec552d1f1c35.zip" file
could not be downloaded: php_network_getaddresses: getaddrinfo failed:
Name or service not known
failed to open stream: php_network_getaddresses: getaddrinfo failed:
Name or service not known)
Loading from cache

みたいな感じで表示がでます。

ちょっと読んでみますと・・・
次のURLを試してみるも失敗。ダウンロードできず。
・・まあとにかく色々失敗して、結局cacheからロードしてダウンロード。

これでも何とかなりましたので、問題ないですが
何かモヤモヤしますね。
composer.lockの記述が間違っているのかもしれません。

Lisp始めたので自分のためにメモ

まだまだ勉強し始めたばかりですが
Common Lispで勉強したことを適当にメモして書いていこうと思います
基本的にこのブログはメモ代わりですので
LispだけでなくPHPのメモなんかも定期的に追加していく予定です。


CommonLispでは高階関数つまり、関数を引数とする関数を使うときに
#'symbol-nameという表記をよく使う。
これは(function symbol-name)の略で、
functionという関数定義はsymbol-nameに格納されている関数定義を呼び出してくれるらしい。

例:'(1 2 3)の各要素を足して結果を返す

正解からいうと

(apply #'+ '(1 2 3)) ; =>6

この時なんで#'をつける必要があったか考えます
例えば

(apply (+) '(1 2 3))

(+)では関数+が評価され0が返される。
もちろん(+)のところを+と書いてもダメです。
これでは変数+を呼び出してしまいます。もちろん定義されていません。
そこで関数そのものを呼び出すことが必要になるということで#'を使うということですね。
Lispでは関数も文字列や数値と同じように扱えるということでこのような表記があるのかなと思います。
以上。

ArrayObjectとArrayIterator

IteratorAggregateインターフェイスを利用して
外部イテレータを指定する場合に、
ArrayObjectを利用してもArrayIteratorを利用しても同じ結果になることをメモしておきます。

ちなみにArrayObjectとArrayIteratorが何をimplementsしているかというと
ArrayObjectはIteratorAggregate,ArrayAccess,Serializable,Countableです。
ArrayIteratorはSeekableIterator,ArrayAccess,Serializable,Countableです。

またArrayObject::getIterator()の返り値の型はArrayIteratorであります。

試しに以下のコードを書きました。

<?php
//名前と年齢を格納できる人クラス
class Person {
	
	private $name;
	private $age;
	public function __construct($name,$age){
		$this->name = $name;
		$this->age = $age;
	}
	public function getName(){return $this->name;}
	public function getAge(){return $this->age;}
}
/**
  人を追加することができるGroup1クラス
  外部イテレータはArrayObjectを使ってArrayIteratorを指定
 */
class Group1 implements IteratorAggregate {
	
	private $group;
	public function __construct(){
		$this->group = new ArrayObject();
	}
	public function add(Person $person){
		$this->group[] = $person;
	}
	public function getIterator(){
		return $this->group->getIterator();
	}
}
/**
  人を追加することができるGroup2クラス
  外部イテレータはArrayIteratorを指定
 */
class Group2 implements IteratorAggregate {
	
	private $group;
	public function __construct(){
		$this->group = new ArrayIterator();
	}
	public function add(Person $person){
		$this->group[] = $person;
	}
	public function getIterator(){
		return $this->group;
	}
}

$group1 = new Group1();
$group1->add(new Person('Tani', 24));
$group1->add(new Person('Tanaka', 32));
$group1->add(new Person('Yamada', 43));
$iterator1 = $group1->getIterator();
foreach($iterator1 as $object){
	echo "名前は{$object->getName()}です。年齢は{$object->getAge()}です。\n"; 
}
echo "/*---------------*/\n";
$group2 = new Group2();
$group2->add(new Person('Tani', 24));
$group2->add(new Person('Tanaka', 32));
$group2->add(new Person('Yamada', 43));
$iterator2 = $group2->getIterator();
foreach($iterator2 as $object){
	echo "名前は{$object->getName()}です。年齢は{$object->getAge()}です。\n"; 
}
/*出力結果*/
名前はTaniです。年齢は24です。
名前はTanakaです。年齢は32です。
名前はYamadaです。年齢は43です。
/*---------------*/
名前はTaniです。年齢は24です。
名前はTanakaです。年齢は32です。
名前はYamadaです。年齢は43です。

同じ結果が出ました。