TDD Boot Camp Tokyo 2013-03 に参加しました。

TDD Boot Camp Tokyo 2013-03に参加しました。
やっと、ブログを書いています….

すでに参加レポートのまとめができていました。
http://matome.naver.jp/odai/2136365798061279801

当日の詳細は、
@PoohSunnyさんの書かれたレポートがとても詳しく、当日の雰囲気がわかるものになっています。
http://poohsunny.hatenablog.com/entry/2013/03/19/001920

1.@t_wadaさんの基調講演
2.ペアプロのデモ
3.実際にペアプロしてみるTIME
4.各言語のコードレビュー
5.クロージング
6.懇親会での野良LT大会

今回すごくありがたかったのは、ペアプロのデモがあったこと。
TDDBCへの参加は今回が3回目だったわけですが、
どんなふうに話し合って、何を決めて、どう進めて行くところを見て、やり方を共有した後でのペアプロ実践だったので、かなり気持ちが楽でした。(一応経験者ですが….ペアプロはTDDBCでしかしたことがありません)

Tさんとペアとなり、
課題についてペアプロをさせていただきました。
コードレビューさせていただいたPHPのコードとはコードの風景がかなり違っていて、
また実装をすすめるときに判断したことの差は聞いててとても参考になり、
またすごく刺激を受けました。

少しずつ少しずつですが、
復習しつつ昇華して身につけて行きたいと思います。

BEAR.Sunday meet up #1に参加しました

BEAR.Sunday meet up #1に参加しました
twitterでのつぶやきはtogetterでまとめました

会場は、#0に引き続き、VOYAGE GROUP さんの会場をお借りしての開催でした。

☆@mackstarさんのセッションは、あとで何度も聞き直したいと思うすばらしいセッションでした。
録音しておけば良かった….(涙)

“ソフトを書いている人はみんなAPIのデザイナーです”から始まった、”Clean API”のお話。
classの中のメソッドを、上から下から何度も見ないと見つからないメソッドで大丈夫か?という問題提起
美しさを求めることは大事な事。
12以上は多すぎるということ。
書いてないとわからない。 試さないとわからないのは BAD Design。
大事な4つのC:
Commonality
Clarity
Consistency
Contextual

“ソフトを書いている人はみんなAPIのデザイナーです”という言葉は、
コードを書いている人は、全員が設計をしているということというTDDでの言葉を思い出しました。
「設計をしている」よりもさらに踏み込んだ感じがします。

資料は後日に公開されるそうです。
期待待ちしてます。

☆@koriym さんのセッション

依存関係逆転の法則
生成使用分離の法則
デメテルの法則
Tell, Don’t ask.

Api Driven Developmentな考え方
長期運用に耐えられる考え方で作られていて、BEARのリソースを他のフレームワークでも利用できるという部分はすごく良いなと感じました。
徐々にBEARで実装をして、既存のプログラムでそれを利用することができるということは、少しずつ機能を作りながら差し替えていき、最終的にはBEARに乗り換える計画が立てられるという事。
少しずつ、少しずつ、small stepを実現できちゃう。
スライドの24ページ目あたりに、リソースを取り込むコードがあります。

資料の22ページめのオブジェクトグラフの絵図は
print_oで、BEARでなくとも表示する事が可能だとのこと。

https://github.com/koriym/print_o

phpメンターズでも過去取り上げられていました。
http://phpmentors.jp/post/29106341823/print-o

BEARが夢見る未来のBEARの話。

1日に3セッションという怒濤のプログラムでした。
また、自習時間に参加した皆でインストールをしたりしつつ、そこで感じた事の質問から、「なぜそうなっているのか?」や実際のコードをプロジェクタで見るなど、小人数だからこその、距離の近い時間を体験しました。

☆BEAR.Sundayを試したあとは…..
bugはissueで http://goo.gl/oZRdn
質問意見感想など新規トピックで http://goo.gl/ZUdt1

BEARが覗いている世界はおもしろい、BEARを通して覗く世界もおもしろい #BEARSunday

“BEARが覗いている世界はおもしろい、BEARを通して覗く世界もおもしろい”
@tdakakさんがつぶやいていたこの言葉が、一番BEAR.Sundayを表している言葉だと感じます。
間違いなく私のPHPの世界観を変えたフレームワークです。
meet upに参加できて本当に良かった!
もっと面白さを感じられる様勉強をしたいと思います。

参考URL
http://d.hatena.ne.jp/kumamidori/20130220/p1

FuelPHPドキュメント翻訳へのお誘い

ありがたい事に、今年もFuelPHP Advent Calendar 2012に参加です。
@uemeraさんの記事「就職活動サイトの構築にFuelPHPを使ったので事例紹介」に続いての記事になります。

FuelPHPのドキュメントを、ドキュメントはやはり日本語で読みたいよねということで翻訳を始めました。
githubのgitレポジトリを利用し、
翻訳をすすめています。今日時点で、165人の方にforkされ、翻訳が進められています。

翻訳をしていて良かったと思う事

FuelPHPに対してではなく、技術そのものに対しての理解が深まっているように感じています。
1文書を翻訳するのにかかる時間は、翻訳を始めた頃よりも、今の方が長い時間を必要としています。
単語の意味がわからず、単語の意味をしらべるのですが、それでも意味がわからず、
その単語が使われている英文を探し、その英文に書かれている事で関連ありそうな日本語で検索してみたり、本体のコードを読み返してみたりしています。
ただ読むだけだった時とは違い、さらりと流し読んでいた部分の理解が深くなっていることを体感しています。基礎として知っておくべき事と思われる事への理解が深まる機会を得て、ここ数年不安だったもやもやしていたことへの解決は、本当にありがたいです。

翻訳への参加方法

(1)GitHubにアカウントを作成してください。
FuelPHP Documentの日本語翻訳はgithubを利用しています。
そのため、githubアカウントが必要です。

(2)githubの日本語ドキュメントをforkしてください。



gitを使う場合

forkをした後については、東京での FuelPHP 勉強会の sho さんの発表資料が参考になります。
(22ページ目あたりからが方法についての解説です)
http://www.slideshare.net/akagisho/lets-translate-fuelphp-docs

githubの機能を使って、ブラウザで翻訳作業をする場合
MIZUNOさんのgithub でドキュメント日本語化がとてもわかりやすく解説くださっています。

(3)README.md を読み、翻訳をはじめましょう

翻訳についての注意点、お約束が書かれています。
翻訳を始める前に一読をお願いします。
翻訳に煮詰まったら…..
翻訳をしていると、単語の意味はわかっても訳せないものがでてきたりと躓く場面があります。
そんなときは、google groupにfuelphp.jpのMLがあります。
気軽に相談をしてみてくださいね。

(4)翻訳ができたら、pull request をお願いします。

翻訳ができたら、pull requestをお願いします。
mergeされると、ここにその履歴が表示されます。
1.3の翻訳の履歴
1.4の翻訳の履歴
1.5の翻訳の履歴

まだまだ翻訳が追いついていません。
1.4 , 1.5はまだ翻訳はあまり進んでいないため、翻訳し放題です(^-^)

日本語翻訳されたドキュメントについて

githubからダウンロードしてローカルで見るのも良いですが、その手間を省くためにweb上に翻訳されたレポジトリを展開しています。
fuelphp.jpというサイトで公開しています。
(近日中に1.5へのリンクも追加する予定です。)
http://fuelphp.jp/

最後に

翻訳への参加は、フレームワークが利用している技術についての理解も深まります。
ついでに英語力を鍛える機会となります。
私にとってはその2つの存在がとても大きく、毎日少しずつですが翻訳を続けています。

FuelPHPのドキュメント翻訳に興味を持たれましたら、ぜひ参加をお願いします。
質問等、微力ですができるかぎり応えたいと思います(^-^)/

明日は@mayama4uさんの「FuelPHPで作るFacebook診断アプリ」です。
お楽しみに!

PHPMATSURI2012に参加しました。

phpmatsuri 2012

東京、大阪に続いて、福岡で開催された、phpmasturi2012に参加しました。
毎年思う事ですが、凄まじい2日間でした。
スタッフの皆様、そして参加をされた皆様、本当に本当にありがとうございました!
そしておつかれさまでした!!!!!

今年のphpmatsuriへの参加で事前に決めていた事。
(1) ちゃんと寝る(体調管理大事)
(2) BEAR.Sundayのワークショップがんばる
(3) FuelPHPドキュメント翻訳をすすめる。

今年は発表もしなかったし、大きな成果は無いのだけれども、
たくさんの刺激をいっぱい受けて、楽しい2日間となりました。

BEAR.Sundayのワークショップ後ホテルへ移動(25:00ぐらい?)朝までしっかり休めました。会場すぐ近くのホテルにして良かったです。
年々衰えている体力故、まわりに迷惑かけたらやだなーと思ってたので…。

BEAR.Sundayのワークショップはワークショップが始まるまでの時間でインストール等の準備をしました。参加前日までにやっとくべきでした。時間が本当にもったいなかった(>< ) 猛反省です。 そして結局ワークショップで使うbranchを間違えてるとか、本当に私ひどい….. すぐに動かす事ができなかった機能について、ブラウザ越しに触れる環境を使わせていただきました。日々の勉強の足りてなさと、自分自身の理解力の低さに凹みましたが、なんとかついていくことができました。このまま、また勉強しないままに時間だけがすぎて行く事が無いように、少しずつ少しずつ勉強をすすめていきたいと思います。 まずは、BEAR.Sundayのワークショップでの内容について、復習してブログにまとめます! FuelPHPのドキュメント翻訳については、2ページほど翻訳をすすめることができました。 1.3の翻訳状況について、ファイル一覧を $ find . | grep html で作成し、エクセルでまとめました。まとめた結果をhtmlにし、公開するところまでできました。 http://fuelphp.jp/1.3.html
fuelphp.jpのサイト自体もgithub管理にして、masterにコミットしたものを自動的に更新できるようにしました。

PHPMATSURI2012を終えてのMY課題
(1)BEAR.Sundayのワークショップでの内容について、復習してブログにまとめる
(2)BEAR.Sundayでのはじめてシリーズをコンプリートする
(3)FuelPHP翻訳がんばる(1.3翻訳してる訳ですが1.4がリリースされブランチ最新は1.5…地道にやっていきます….)

ここ1年自習をする時間がなかなかとれなくて、四苦八苦してます。
でも、やらないままだとダメだと思うし、なによりも楽しくない。
自分なりのペースでがんばっていこうと思います。

pneskin2.nekoget.comの移転作業をしています。

pneskin2.nekoget.comの移転作業をしています。
ずっと自宅サーバで運用してきたpneskin2.nekoget.comですが、
現在vpsサーバへの移行作業をしています。
私のわがままから、ゆっくりとしたペースで移行しているため、
使えなくなったまま数日が経過しているサービスもあります。
もうこのまま復旧させないものも出てくるかと思います。
ゆっくりとお待ちいただけると幸いです。

BEAR.Sunday meetup #0を開催しました。


http://www.zusaar.com/event/331061
BEAR.Sunday meetup #0を開催しました。
今回も会場はFuelPHP勉強会でもお世話になりました、
VOYAGE GROUP さんの会場です。

まとめ
http://togetter.com/li/341768

伝説とまで言われた、Symfony勉強会 #6での@korym 師匠の懇親会セッションから、
LTでの勉強会開催の依頼。
そしてRESPEKTでの秘密会議を経て、
昨日とうとう開催となりました!
予想通り、熱く濃い内容となりました!

★アンケートの結果を公開★
参加者性別
男性 : 86.7%
女性 : 13.3%

参加者年齢分布
(1) 10代 :  0%
(2) 20代 : 33.3%
(3) 30代 : 46.7%
(4) 40代 : 20.0%
(5) 50代 :  0%
(6) その他 : 0%

PHP歴
(1) 1年未満 : 0%
(2) 1年〜2年 : 0%
(3)2年〜3年 : 0%
(4)3年〜5年 : 30.8%
(5) 5年以上 : 69.2%

Q3. BEAR.Sunday meet up#0はいかがでしたか?
(1) 良い :92.3%
(2) まぁまぁ: 0%
(3) ふつう : 0%
(4) やや悪い : 0%
(5) 悪い : 0%
(6)濃い(設問にはありませんでしたが増えてました):6.7%

Q4.印象に残ったセッションは?(複数回答)
(1). Ray.Di / Ray.Aop ことはじめ :25.9%
(2) Welcome to BEAR.Sunday 45 min:48.1%
(3) LT:僕と熊と3年間 :14.8%
(4)リソース指向データ転送プロトコル :11.1%

Q5.次回聞いてみたい話、テーマはありますか?
・@koriymさんのオンステージを!
・復習してみます。勉強不足ですみません。
・Ray.DiとAura.Diの思想の違い
・アラン・ケイ
・リソース指向について詳しく。
・知りたかった思想についてよく理解できました。次回は実装のところを学びたいです。
・実践的なアプリケーション制作について
・アーティテクチャと実装で困っことの深堀り

Q6.次回開催希望時期は?
(1)平日夜 :35.7%
(2)金曜夜 :21.4%
(3)土曜午後:28.6%
(4)日曜午後:7.1%
(5)その他 :7.1%

Q7.その他ご意見ご要望
・なかなか設計思想を聞く機会がないので、すごくおもしろかったです。 忘れないうちに実装がどうなっているのか、どうやって使うのか確認したいと思います!
・ぜひmeet up #01を!
・今度は勉強してから参加したいです。聞くだけではもったいないですね。
・これからが楽しみです。
・次回があれば参加します。
・楽しかったです。
・ありがとうございました!

LTで、勉強会開催希望を
吐露するところからスタートしたmeetupでした。
自分で考えていたよりもずっと良い集まりになったのではないかと思います。
また、私自身に足りなかった知識や意識を知る事ができた貴重な体験でもありました。

ただ、書いていただけではなくて、
フレームワークを使っていた、使えていただけではなくて、もう一歩前に進めるような気がしています。

少しずつ積み重ねられるように、
次回meetupも企画しようと思います!

BEAR.Sundayインストール!

先日開催された、Symfony勉強会#6の熱い熱い懇親会セッション。
BEAR.Sundayをこれは絶対絶対触らねば!!!ということでインストールです!

http://code.google.com/p/bearsunday/wiki/Install
を参考にインストールしてみました。

インストール直後の画面。
php5.4のビルドインサーバで表示をしています。
使える事は知ってたけども、起動してみたのは初めて♥

では、ここからNEKOGETがインストールをした環境でのインストールの詳細です。
インストールした環境 / OSX VMWare Fusion
Fedora17
PHP 5.4.3
mysql 5.5.24
php-pecl-apc-3.1.10-2.fc17.x86_64

別段特別な環境を作った訳でもなく、
Fedora17環境でyumを利用して
簡単に環境を作成し、挑戦してみました。

ハジメテは、基本に忠実にということで、公式のインストールのページを参考にインストールをします。
http://code.google.com/p/bearsunday/wiki/Install

githubからデータを取得

git clone git://github.com/koriym/BEAR.Sunday.git

githubは本当に便利。らくちん。

$ cd BEAR.Sunday/
$ curl -s http://getcomposer.org/installer | php
$ php composer.phar install

テスト環境と書かれた項目はPHPUnitのインストールのようです。すでにインストール済みだったので、スキップしました。

ビルドインサーバの起動

$ cd apps/sandbox/htdocs/
$ php -S localhost:8088 web.php

参考にしたサイトと違うのはphpのパスぐらいです。

テスト用のDBの準備
rootにパスワードを設定していたので、最後に-pをつけてます。
実行すると、パスワードを聞かれるので入力。

$ mysql -e "CREATE DATABASE IF NOT EXISTS blogbeartest;USE blogbeartest;CREATE TABLE IF NOT EXISTS posts (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,title VARCHAR(50),body TEXT,created DATETIME DEFAULT NULL,modified DATETIME DEFAULT NULL);" -u root -p

テストの実行
まずはテストを実行するというのが、
インストールの手順にあるのが素敵です。

[neko@localhost BEAR.Sunday]$ phpunit
PHP Warning:  require(PHPUnit/Extensions/Database/TestCase.php): failed to open stream: No such file or directory in /var/www/html/bear/BEAR.Sunday/tests/bootstrap.php on line 4
PHP Fatal error:  require(): Failed opening required 'PHPUnit/Extensions/Database/TestCase.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/html/bear/BEAR.Sunday/tests/bootstrap.php on line 4

失敗……
あ!!!….DB!!! (>_< ) ってことでphpunit追加です。 rootになって、pear installします。 ちゃんとドキュメントには書いてありました。自分で勝手に入れてたはずと勘違い...(> _ < ) 油断大敵です。

[neko@localhost BEAR.Sunday]$ su
[root@localhost BEAR.Sunday]# pear install phpunit/DbUnit
Adownloading DbUnit-1.1.2.tgz …
Starting to download DbUnit-1.1.2.tgz (41,895 bytes)
…………done: 41,895 bytes
install ok: channel://pear.phpunit.de/DbUnit-1.1.2

phpunit/DbUnitインストール完了!

医療情報事務所 一貫堂Blog で、インストールとunit testにまつわる諸々の情報がUPされています。かなり詳細に書かれています。参考にどうぞ♪
http://ikkandou.blogspot.jp/2012/07/bearsunday1.html
http://ikkandou.blogspot.jp/2012/07/bearsundayphpunit.html

ということで続きです。

phpunitを実行してみます。

rootのパスワードが設定されていると、エラーが出るという内容のエラーがたくさんでていたので、とりあえずrootパスワードを解除してテストを実行しました。

build/coverage/の中に、code coverage のレポートができていました。

インストールのドキュメントの中に、phpunitを実行しろっていうフローが入ってるphpフレームワークって初めてのような気がします。

すべてgreenな事が確認できたので、
やっぱりmysqlにパスワードの設定をします。

rootにパスワード設定がないとunit testうまくいかないんだよねって話をぽろっとしていたら、一貫堂のいのうえさんが調べてくれました。感謝感謝!
http://ikkandou.blogspot.jp/2012/07/bearsundayphpunit.html

rootにパスワードを設置します。

[neko@localhost BEAR.Sunday]$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 94
Server version: 5.5.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET PASSWORD FOR root@localhost=PASSWORD('root');
Query OK, 0 rows affected (0.03 sec)

phpunitの結果は最初実行した通りエラーが出ました。

パスワードの設定をします。
tests/PagingQueryTest.php
21行目
$this->pdo = new \PDO(“mysql:host=localhost; dbname=blogbeartest”, “root”, “root“);

tests/PagerTest.php
24行目
$this->pdo = new \PDO(“mysql:host=localhost; dbname=blogbeartest”, “root”, “root“);

tests/DoctrineDbalAdapterTest.php
21行目
$this->pdo = new \PDO(“mysql:host=localhost; dbname=blogbeartest”, “root”, “root”);

apps/sandbox/tests/PageBlogPostsTest.php
11行目
$pdo = new \PDO(“mysql:host=localhost; dbname=blogbeartest”, “root”, “root”);

apps/sandbox/tests/AppPostsTest.php
13行目
$pdo = new \PDO(“mysql:host=localhost; dbname=blogbeartest”, “root”, “root”);

sandbox/scripts/test.config.php
2箇所
return [
‘master_db’ => [
‘driver’ => ‘pdo_mysql’,
‘host’ => ‘localhost’,
‘dbname’ => ‘blogbeartest’,
‘user’ => ‘root’,
‘password’ => “root”,
‘charset’ => ‘UTF8’
],
‘slave_db’ => [
‘driver’ => ‘pdo_mysql’,
‘host’ => ‘localhost’,
‘dbname’ => ‘blogbeartest’,
‘user’ => ‘root’,
‘password’ =>“root”,
‘charset’ => ‘UTF8’
]
];

phpunitを実行
rootのパスワード無しと同様に、all greenになりました☆

ビルドインサーバを起動し、BEAR.Sundayが動く事を確認しました。

次は、チュートリアルに挑戦の予定です!
http://code.google.com/p/bearsunday/wiki/HelloWorld
http://code.google.com/p/bearsunday/wiki/blog

FuelPHPのOrm

FuelPHPのOrmの使い方がよくわからないというtweetを見かけたので、テストコードの一部をさらします。

DBの設定はこんな感じ

CREATE TABLE IF NOT EXISTS <code>news</code> (
  <code>news_id</code> int(11) NOT NULL AUTO_INCREMENT,
  <code>news_title</code> varchar(255) NOT NULL,
  <code>news_text</code> text NOT NULL,
  <code>news_created_at</code> datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  <code>news_updated_at</code> datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (<code>news_id</code>)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


INSERT into news 
values(NULL ,"タイトル" , "本文" , "2012-07-07 00:10:00 11:11:11", "2012-07-07 00:10:00 11:11:11");

テストコード。

function setUp()で行っているのは、
DBのリストア処理です。
Model_Newsをテストしているコードになります。

<?php

/**
 * @group App
 */
class Test_Model_News extends TestCase
{
		function setUp()
		{
			$com = "mysql -uroot -pパスワード news_test  <"
				.dirname(__FILE__)
				."/sql/reset.sql";
			system($com);
		}
		/*
		 * 1レコードインサートする
		 */
		public function test_insert()
		{
			$news = Model_News::forge();
			$news->set("news_title" , "タイトル2");
			$news->set("news_text" ,  "本文2");
			$news->set("news_created_at" , date("Y-m-d H:i:s"));
			$news->set("news_updated_at" , date("Y-m-d H:i:s"));
			$insert     = $news->save();
			$insertdata = $news->to_array();
			$this->assertEquals($insertdata["news_id"], 2);
			
		}
		
		/*
		 * update
		 */
		public function test_update()
		{
			$news_1 = Model_News::forge();
			$news = $news_1->find(1);
			$news->news_title      = "タイトル更新";
			$news->news_text       = "更新本文";
			$news->news_updated_at = date("Y-m-d H:i:s");
			$ck = $news->save();
			$this->assertTrue($ck);
			$news_2 = $news->to_array();
			$this->assertEquals($news_2["news_title"] , "タイトル更新");
		}
		
		/*
		 * delete
		 */
		public function test_delete()
		{
			//news_idが1のレコードを削除します。
			//成功するとtrueが戻ります。
			$news_1 = Model_News::forge();
			$news = $news_1->find(1);
			if($news)
			{
				$ck = $news->delete();
			}
			$flg = null;
			if($ck)
			{
				$flg = true;
			}
			$this->assertTrue($flg);
			// news_idが1を検索して、NULLが帰ってくる事を確認。
			$news_2 = Model_News::forge();
			$news   = $news_1->find(1);
			$this->assertNull($news);
		}
}

FuelPHP東京勉強会に参加しました&プレゼント発表☆

FuelPHP東京勉強会に参加しました。
今回はFuelPHPでのunit testについて発表もさせていただきました。

FuelPHP東京勉強会まとめ
http://togetter.com/li/334655?utm_source=dlvr.it&utm_medium=twitter

☆発表資料

実際にコードを見ていただきながらの発表は、思いのほか難しく…. もうすこし詳細の情報をブログにまとめたいと思います。

CodeIgniterで作った同じ仕様のコードのmodelのテストと、FuelPHPのmodel(ORM使用)のものがあるので、それも含めて、まとめたいと思います。

☆3冊プレゼント企画!
FuelPHP東京勉強会開催を記念して、@kenji_sさんより3冊献本をいただきました。
「はじめてのフレームワークとしてのFuelPHP」
( 勉強会に参加された、たくさんの方がすでに購入済みでした☆ )

☆ジャンケンを勝ち抜きました1名様
@supika77 さん

☆@NEKOGETへ、Mentions送信で応募いただいた方の中から抽選 2名様

[neko@localhost ~]$ php fuel_book.php
@natsu_nanana さん
@bash0C7 さん

おめでとうございますー!
@NEKOGETからDMでご連絡させていただきます!!!

抽選コードと参加いただいた皆様。

<?php
//敬称略。
$hon = array(
	1=>"@bash0C7",
	2=>"@fagai",
	3=>"@natsu_nanana",
	4=>"@brtriver",
	5=>"@lily_evo",
	6=>"@_takeshi"
);
$k = "123456";
$n = str_split(substr(str_shuffle($k),0, 2));
echo $hon[$n[0]]." さん\n".$hon[$n[1]]." さん\n";
?>