amari3のはてなダイアリー このページをアンテナに追加 RSSフィード Twitter

2014-08-31

[][]YAPC::Asia Tokyo 2014に行ってきた

慶応義塾大学日吉キャンパスで開催されたYAPC::Asia Tokyo 2014に参加してきたので、自分なりの感想を書こうと思う。昨年は諸事情で参加できなかったんで2年ぶりの参加となる。通算では6回目の参加。

各セッションの内容は、公開されているスライドを見ていただく方がいいと思うので、自分が感じた事を手短に書いていこうかと。

続きを読む

2014-03-29

[]PHPマイクロフレームワークSlimを使ってTinyURLを作ってみた

Slim は RubySinatra の様なマイクロフレームワークで、PHP で簡単な Webアプリを書くにはちょうどいいと思う。今回はその Slim を使って、短縮 URL(bitly みたいなやつ)を作ってみた。なお、tokuhirom さんの Amon2 のサンプルからアイデアを拝借しています。

環境

Mac OS X 10.9.2

PHP 5.4.26

See also

Slim Framework Documentation

インストール

Slim のインストールは Composer で行う。Ruby の Bundler や Perl の Carton の様なライブラリ管理ツールである。

% cd /path/to/project
% curl -s https://getcomposer.org/installer | php

composer.json に以下を記述する。

{
    "require": {
        "slim/slim": "2.*"
    }
}

以下のコマンドでインストールする。vendor ディレクトリに slim が格納される。

% php composer.phar install

ディレクトリレイアウト

ベターなディレクトリレイアウトがあるかもしれないけど、手探り状態で作ったので、良いディレクトリレイアウトがあったら教えて下さい!

project/
    composer.json
    composer.lock
    composer.phar
    root/  # ドキュメントルート
        .htaccess  # PHP ビルトインサーバを使用したので今回は必要なし
        index.php
    tmpl/  # テンプレート
        index.php
        result.php
    vendor/
        slim/slim/   # Slimライブラリ
    sql/
        sqlite3.sql
    development.db

TinyURL を作る

まずは DB のテーブルを作成する。以下のスキーマを作成して、sql/sqlite3.sql で保存する。

sql/sqlite3.sql

create table tinyurl (
    key varchar(20) primary key,
    url text
);

以下のコマンドを実行して、DB のテーブルを作成する。

% sqlite3 development.db < sql/sqlite3.sql

これで DB の準備は完了。

今回はあくまで動くものを作ることが目的なので、エラーチェックやバリデーション等は甘いです。

root/index.php

<?php
require '../vendor/autoload.php';

$app = new \Slim\Slim(array(
    "debug" => true,
    "templates.path" => "../tmpl"
));
$db = new PDO('sqlite:../development.db');

// 引数で指定した長さのランダムな文字列を生成
function stringRandom($len = 5) {
    if (!is_numeric($len) || $len <= 0) {
        die("positive interger is required.");
    }

    $str = '';
    for ($i = 0; $i < $len; ) {
        $num = mt_rand(0x30, 0x7A);
        if ((0x30 <= $num && $num <= 0x39) || (0x41 <= $num && $num <= 0x5A) ||
(0x61 <= $num && $num <= 0x7A)) {
            $str .= chr($num);
            $i++;
        }
    }
    return $str;
}

$app->get('/', function () use ($app) {
    $app->render("index.php");
});

$app->post('/create/', function () use ($app, $db) {
    $req = $app->request();
    $url = $req->post("url");
    if (!$url) {
        $app->redirect('/');
        return;
    }

    // dup check
    $sth = $db->prepare('SELECT key FROM tinyurl WHERE url = ? LIMIT 1;');
    $sth->execute(array($url));
    $result = $sth->fetch(PDO::FETCH_ASSOC);
    $key = $result['key'];
    if (!$key) {
        // create new one
        $key = stringRandom(6);
        $sth = $db->prepare('INSERT INTO tinyurl (key, url) VALUES (?, ?);');
        $sth->execute(array($key, $url));
    }
    $app->render('result.php', array("tinyurl" => $req->getUrl() . '/g/' . $key));
});

$app->get('/g/:key', function ($key) use ($app, $db) {
    if (!$key) {
        $app->redirect('/');
        return;
    }

    $sth = $db->prepare('SELECT url FROM tinyurl WHERE key = ? LIMIT 1;');
    $sth->execute(array($key));
    $result = $sth->fetch(PDO::FETCH_ASSOC);
    $url = $result['url'];
    $app->redirect(($url) ? $url : '/');
});

$app->run();
?>

tmpl/index.php

<!DOCTYPE html>
<html>
  <head>
    <title>TinyURL</title>
    <meta charset="UTF-8">
  </head>
  <body>
    <h1>tinyurl</h1>
    <form action="/create/" method="POST">
      <input type="text" name="url" value="">
      <input type="submit" name="submit" value="tiny!">
    </form>
  </body>
</html>

tmpl/result.php

<!DOCTYPE html>
<html>
  <head>
    <title>TinyURL</title>
    <meta charset="UTF-8">
  </head>
  <body>
    <h1>tinyurl</h1>
    <div><?php echo htmlspecialchars($tinyurl, ENT_QUOTES, "UTF-8"); ?></div>
    <a href="/">return to top</a>
  </body>
</html>

実際に作ってみた感想

小さな Webアプリを早く作るには非常に使いやすいと感じた。フルスクラッチで書くと煩雑になりがちな、ルーティングを気にしないでいいのが個人的には大きいかな。PHP で簡単な Webアプリを書く時にはぜひ使っていこうと思う。

2014-03-27

[]PHP Built-in server の使い方メモ

PHP 5.4 から Built-in server が追加されてて、手軽にWebアプリの動作確認が出来る事を今更知ったので、忘れないうちにメモしておく。

以下の様な感じで実行する。

% php -S localhost:8080 -c /path/to/php.ini -t /path/to/htdocs

これで、PHP における Webアプリの開発がものすごくやりやすくなった気がする。

2014-02-20

[][]Developers Summit 2014 に参加してきた

ちょうど一週間前に参加したのだけど、ブログ書いてなかったので書く。

Developers Summit 2014:開発者のためのITカンファレンス

場所は毎年恒例の目黒雅叙園。目黒駅からのあの急坂はなかなかきついですね。デブサミに参加するのは実は久しぶりでちょっとドキドキワクワクしてた気がする。

セッション

  • サーバプロビジョニングのこれまでとこれから
  • グリーにおけるChef導入事例 〜既存の資産を活かし新しい技術を導入する〜
  • クラウド時代の環境構築・デプロイ自動化戦略
  • 新卒エンジニア研修ですべきことできること
  • [U30] フロントエンド開発者になるための切掛と行動/酒巻 瑞穂、ソフトウェア開発を勉強し始めて3年間でやったこと〜After〜/きょん
  • Mobageを支えるテストエンジニアリング
  • デブサミ2014 コミュニティLT - Story
  • Webの現在過去未来
  • アプリケーションエンジニアのためのクラウドインフラ再入門
  • Amebaで取り組んでいるネイティブ開発事例
  • エンジニアだからできる
自由な生き方
  • なぜ、がんばってPaaSを提供するのか? 〜今後のPaaSの活用について〜
  • クラウド時代の情シスのあり方(仮)

メモも取らずに聞き入っていたのだが、僕の中で印象に残ったことと特に実践していきたいことは、デプロイに関することとテストに関することですね。CIツールの勉強をして実戦投入出来るようにならないとなぁ。


今回はブースの人とも出来るかぎり話してみた。コミュニケーションはあまり得意な方ではないけど、今更ながらに一歩踏み出せた気がする。IBMのIaaSとPaaSはちょっと興味をもったし、時間を見つけて触ってみないとな。

CodeIQのブースではアイドルの様な格好をした人から(CROSS2014の巫女さんかな?)、バレンタインチョコもゲットしたし!すごく楽しめましたね。CodeIQはこれをきっかけに腕試しとか暇つぶしに利用するようになったしね。


僕の中で技術イベントは参加することにも当然意義があるけど、参加したあとにそれを実践したり、考えたりすることがとても大事だと感じる。

近いうちに、また技術イベントに参加しようと思っている。

2014-01-31

[]特定のディレクトリの特定のオーナーの時にだけ chown する時のメモ

特定のディレクトリの中に複数のオーナーのディレクトリやファイルがあって、特定のオーナーだけ変更したい時がたまにある。find コマンドを使ってうまくできるのでメモとして残しておく

# find /path/to/dir -user old_owner -exec chown new_owner {} \;

これからは、こういった小さなことでもブログに書きとめることにしよう。