2015年9月30日水曜日

Silexでサービスの定義(Service definitions)

Silex(1.3)サービスの定義(Service definitions)です。あまり良くわかっていませんが、独自のサービスを作成して、簡単に組み込めるというものだと思います。

サービスを定義することはパラメーターを定義することとなんら違いはありません。 コンテナーに配列のキーでクロージャーを設定するだけです。 サービスを取得するときに初めてクロージャーは実行されます。 そのため、実際にサービスが必要とされるまでサービスの作成を遅延させることができます。

$app['some_service'] = function () {
  return new Service();
};

$app['some_service'] = function ($app) {
    return new Service($app['some_other_service'], $app['some_service.config']);
};

$service = $app['some_service'];

参考サイト
Services(Silex Documentation)
サービスの定義 (Service definitions)(Silexユーザーガイド)
Pimple 2.0がリリースされたのでPimpleについて復習してみる(iakioの日記さん)

2015年9月29日火曜日

Silexでログ(Monolog)

Silex(1.3)ログ(Monolog)です。MonologServiceProviderを登録すると、使えるようになります。

// MonologServiceProviderの登録
$app->register(new Silex\Provider\MonologServiceProvider(), array(
  'monolog.logfile' => __DIR__.'/log/development.log',
));

// ログ書き込み
$app['monolog']->addDebug('debug log');
$app['monolog']->addInfo('info log');
$app['monolog']->addWarning('warning log');
$app['monolog']->addError('error log');
実際に出力されるログ
[2015-09-29 00:01:01] myapp.INFO: Matched route "home". {"route_parameters":{"_controller":"[object] (Closure: {})","_route":"home"},"request_uri":"http://www.sample.com/"} []
[2015-09-29 00:02:02] myapp.INFO: > GET / [] []
[2015-09-29 00:03:03] myapp.DEBUG: debug log [] []
[2015-09-29 00:04:04] myapp.INFO: < 200 [] []

実際に設定してみたサイトがこちら

参考サイト
Silexを試してみた(5) - Logging(作業ノートさん)
MonologServiceProvider(Silex Documentation)
MonologServiceProvider(Silexユーザーガイド)
SilexとDBALを組み合わせたときに実行SQLをロギングする(Qiita)

2015年9月28日月曜日

Silexでキャッシュ(HttpCache)

Silex(1.3)キャッシュ(HttpCache)です。HttpCacheServiceProviderを登録すると、利用できるようになります。

use Symfony\Component\HttpFoundation\Response;

// キャッシュフォルダを設定
$app->register(new Silex\Provider\HttpCacheServiceProvider(), array(
  'http_cache.cache_dir' => __DIR__.'/cache/',
));

// レスポンスオブジェクトで、キャッシュのヘッダーを返す
$app->get('/', function() use($app) { 
  $body = $app['twig']->render('index.twig');
  return new Response($body, 200, array('Cache-Control' => 's-maxage=3600, public'));
});

実際に設定してみたサイトがこちら

参考サイト
Silex and the HTTP_CACHE(Nerdpress.orgさん)

2015年9月27日日曜日

Microsoftの機械学習を生かしたデータ分析を容易にするクラウドサービス「Azure Machine Learning」

Microsoftの機械学習を生かしたデータ分析を容易にするクラウドサービス「Azure Machine Learning」 データ分析の素人が、クラウド上のビッグデータを活用できるようになるというもの。気分は、アナリスト(笑)?





参考サイト
クラウドで機械学習を手近に、Azure Machine Learningの概要(ITpro)

2015年9月26日土曜日

nginx用スクリプト言語「nginxScript」が登場

nginx用スクリプト言語「nginxScript」が登場しました。JavaScriptのサブセットのような設計および実装になっており、nginxの設定ファイルにJavaScriptのようなコードを記述できるようになるとのこと。可能性を感じますね。



参考サイト
nginx用スクリプト言語「nginxScript」登場(マイナビニュース)

2015年9月25日金曜日

Silexでコントローラーの組織化

Silex(1.3)コントローラーの組織化です。システムが大きくなると、ソースが見難くなるので、グループ化して整理できます。

// blog用のコントローラー
$blog = $app['controllers_factory'];

// 各ルーティングコレクション
$blog->get('/', function () {
  return 'Blog home';
});
$blog->get('/show/{id}', function () {
  return 'Blog detail'.$id;
});
$blog->get('/edit/{id}', function () {
  return 'Blog edit '.$id;
});
$blog->get('/destroy/{id}', function () {
  return 'Blog delete'.$id;
});

// マウント
$app->mount('/blog', $blog);
それぞれ、

/blog/
/blog/show/123
/blog/edit/456
/blog/destroy/789

といった具合にアクセスできるようになります。

実際に設定してみたサイトがこちら

参考サイト
コントローラーの組織化 (Silex ユーザーガイド)
Organizing Controllers(Silex Documentation)

2015年9月24日木曜日

グリッドをセクシーに並べ替えてくれるjQueryプラグイン「Grid—A—Licious」

グリッドをセクシーに並べ替えてくれるjQueryプラグイン「Grid—A—Licious」 あまりの優雅な動きに見過ごすことが出来ませんでした。というわけで、我が実験サイトにも組み込んでしまいました(笑)。レスポンシブデザイン対応です。イメージ重視の写真を並べるようなサイトに良いと思います。



参考サイト
[JS]変更時のアニメーションが気持ちいい、レスポンシブ対応のかっこいいグリッドを生成するスクリプト -Grid—A—Licious(コリスさん)

2015年9月23日水曜日

中国産OS「NeoKylin OS」がWindowsを追撃

中国産OS「NeoKylin OS」がWindowsを追撃とのニュースを目にしました。Dellが中国で出荷するPCの42%には、Windowsではなく「NeoKylin OS」がプリインストールされているとのこと。
NeoKylinは10年に、中国国有のテクノロジー系複合企業、中国電子信息産業集団の子会社、中国標準軟件と、国防科学技術大学の提携によって誕生した。 NeoKylinは現在、政府機関や金融機関などで使用されている。


参考サイト
中国産OSがWindowsを追い落とす? 米メーカーも採用した「NeoKylin」(クラウド Watch)
デル、中国で国産OS搭載パソコンを販売(ウォール・ストリート・ジャーナル)
China’s Challenger to Apple iOS, Microsoft Windows(Wall Street Journal)
Kylin(Wikipedia)

2015年9月22日火曜日

クレジットカード決済を無料で導入できる「PAY.JP」

クレジットカード決済を無料で導入できる「PAY.JP」 初期費用導入費、月額費用、 その他固定費はすべて無料です。登録完了後、すぐにテスト環境を利用できるとのこと。Ruby、Python、PHP、JAVAなどのライブラリが用意されています。



参考サイト
クレカ決済を無料で導入できるPAY.JP 無料EC構築BASEが決済事業に新規参入(ASCII.jp)

2015年9月21日月曜日

マイクロソフトが独自のLinux「Azure Cloud Switch」

マイクロソフトが独自のLinux「Azure Cloud Switch」を開発しているそうです。ネットワーク機能をソフトウェア的に管理するためのもの(Software-Defined Network)ということではありますが、時代の流れでしょうか。



参考サイト
マイクロソフトが独自のLinuxを開発 Azure Cloud Switch(ACS)でSDNへ進出(ビジネス+IT)
Software-Defined Network(SDN)とは何か?(@IT)

2015年9月20日日曜日

QRコードはもう古い? 認識精度50倍の「カラーコード」

QRコードはもう古い? 認識精度50倍の「カラーコード」 QRコードに比べて約50倍の距離から認識が可能だそうです。また、角度が傾いている、ピントが合っていない、カラーコードが動いたままといった状態でも認識が可能です。

iPhoneに入れた専用アプリを起動し、本棚に沿って左右に動かしていくと、本の背表紙に張りつけてあるカラーコードが次々に読み取られていく。ピント合わせも認識待ちもなく、アプリの画面では認識完了を示す緑色の表示が並ぶ。棚一列、数十冊はあろうかという書籍の確認がわずか十数秒で完了した。


参考サイト
ICタグ、QRはもう古い 「カラフルなマス目」が脚光(日本経済新聞)
カラーコードに色めく企業 精度はQRコードの50倍(日本経済新聞)

2015年9月18日金曜日

Silexでベーシック認証とセッション

Silex(1.3)でベーシック認証とセッションです。SessionServiceProviderを登録して、非常に簡単に実現できます。

セッションの設定
$app['session']->set('user', array('username' => $username));

セッション情報の取得
$app['session']->get('user');

サンプルそのままです。
$app->register(new Silex\Provider\SessionServiceProvider());

$app->get('/login', function () use ($app) {
  $username = $app['request']->server->get('PHP_AUTH_USER', false);
  $password = $app['request']->server->get('PHP_AUTH_PW');

  if ($username === 'username' && $password === 'password') {
    // セッション設定
    $app['session']->set('user', array('username' => $username));
    return $app->redirect('/account');
  }

  $response = new Response();
  $response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', 'Enter username and password'));
  $response->setStatusCode(401, 'Please sign in.');
  return $response;
});

$app->get('/account', function () use ($app) {
  // セッション情報取得
  if (null === $user = $app['session']->get('user')) {
    return $app->redirect('/login');
  }

  return "Welcome {$user['username']}!";
});

実際に設定してみたサイトがこちら

参考サイト
SessionServiceProvider(Silex Documentation)

2015年9月17日木曜日

Silexでバリデーションメッセージの日本語化

Silex(1.3)でバリデーションメッセージの日本語化です。TranslationServiceProviderを登録し、beforeフィルターで、翻訳ファイルを指定します。日本語の翻訳ファイル(validators.ja.xlf)は用意されているので、設定を加えるだけでOK。表示するメッセージを変えたい場合は、validators.ja.xlfファイルを編集すれば、良いと思います。

composer.json(symfonyのvalidator、translation、config、yamlが必要)
{
  "require": {
    "silex/silex": "~1.3",
    "twig/twig": "1.*",
    "symfony/twig-bridge": "~2.7",
    "symfony/validator": "~2.7",
    "symfony/translation": "~2.5",
    "symfony/config": "~2.7",
    "symfony/yaml": "~2.7",
    "doctrine/dbal": ">=2.5.0"
  }
}
PHP
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
  'locale' => 'ja',
  'translator.domains' => array(),
));

$app->before(function () use ($app) {
  $app['translator']->addLoader('xlf', new Symfony\Component\Translation\Loader\XliffFileLoader());
  $app['translator']->addResource('xlf', __DIR__.'/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators/validators.ja.xlf', 'ja', 'validators');
});

実際に設定してみたサイトがこちら

参考サイト
Translating Validation Messages(Silex Documentation)

2015年9月16日水曜日

Silexで入力データのバリデーション

Silex(1.3)で入力データのバリデーションです。まず、ValidatorServiceProviderを登録します。そうすると、

$errors = $app['validator']->validateValue(チェックするデータ, チェク規則);

という感じで、使えます。

PHP
$app->register(new Silex\Provider\ValidatorServiceProvider());

use Symfony\Component\Validator\Constraints as Assert;

$app->post('/login', function() use ($app){ 
  // POSTデータ
  $email = $app['request']->get('email');
  $password = $app['request']->get('password');

  // 入力データの配列
  $input = array(
    'email' => $email,
    'password' =>  $password,
  );

  // バリデーション規則の配列
  $constraint = new Assert\Collection(array(
    'email' => new Assert\Email(),
    'password' => new Assert\Length(array('min' => 10)),
  ));

  // エラーの取得
  $errors = $app['validator']->validateValue($input, $constraint);

  if (count($errors) > 0) {
  // バリデーションNG
    return $app['twig']->render('login.twig', array(
      'errors' => $errors,
    ));
  } else {
  // バリデーション成功後の処理
  }
});
Twig
{% for error in errors %}
  {{ error.propertypath }} {{ error.message }}
{% endfor %}
エラーメッセージが英語になりますが、どこかで日本語翻訳の設定ができるでしょう。それは、また後で。

実際に設定してみたサイトがこちら

参考サイト
ValidatorServiceProvider(Silex Documentation)
symfony/Validator(GitHub)

2015年9月15日火曜日

SilexでURLを生成するUrlGeneratorServiceProvider

Silex(1.3)でURLを生成するUrlGeneratorServiceProviderです。Twigを利用する場合は、twig-bridgeもインストールしておくと、更に便利に使えます。

PHP
$app->register(new Silex\Provider\UrlGeneratorServiceProvider());

$app['url_generator']->generate('hello', array('name' => 'Taro'));
Twig(pathとurlは、twig-bridgeをインストールする必要あり)
{{ app.url_generator.generate('hello', {name: 'Taro') }}

{{ path('hello', {name: 'Taro'}) }}
{{ url('hello', {name: 'Jiro'}) }}

実際に設定してみたサイトがこちら

参考サイト
UrlGeneratorServiceProvider(Silex Documentation)
Silexを試してみた(3) - URLを生成する(作業ノートさん)
Silexを試してみた(4) - Twig(作業ノートさん)

2015年9月14日月曜日

Silexで、Doctrine DBALを用いたDB接続

Silex(1.3)で、Doctrine DBALを用いたDB接続です。DBALは、PDOの上の抽象レイヤーで、PDOライクな記述になる模様。Doctrine ORMは、また別の設定に。

MySQLの例
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
  'db.options' => array(
    'driver'   => 'pdo_mysql',
    'host' => 'localhost',
    'dbname' => 'sampledb',
    'user' => 'userid',
    'password' => 'password',
    'charset'   => 'utf8',
  )
));

$app->get('/us-zip-code', function() use ($app){ 
  $sql = " SELECT * FROM zipcodes ";
  $zipcodes = $app['db']->fetchAll($sql);
  return $app['twig']->render('us-zip-code.twig', array(
    'zipcodes' => $zipcodes,
  ));
});

実際に設定してみたサイトがこちら

参考サイト
DoctrineServiceProvider(Silex Documentation)
Silexを試してみた(6) - Doctrine DBAL(作業ノートさん)

2015年9月13日日曜日

PHP 7が、WordPressを用いたベンチマークでHHVMよりも高速を達成(LiteSpeed)

PHP 7が、WordPressを用いたベンチマークでHHVMよりも高速を達成したとのこと(LiteSpeed)(PHP 7 vs HHVM Benchmark Series 3: How fast can WordPress go?)。

  • キャッシュなしではHHVMの方がPHP7よりも7%高速に動作
  • キャッシュあり(WP Super Cacheを使用)ではPHP7がHHVMよりも44%高速に、PHP5.6がHHVMよりも13%高速に動作
  • キャッシュなしではLiteSpeedとApacheがほぼ同じ性能を発揮
  • キャッシュありではLiteSpeedがApacheよりも89%高速に動作、NginxはApacheよりも26%高速に動作
  • キャッシュなしとキャッシュありでは最大で5700%の性能差

PHP5.6でも、キャッシュを利用すれば十分速いということでしょうか?!



参考サイト
PHP 7、WordPressベンチマークでHHVMよりも高速を達成(BIGLOBEニュース)
LiteSpeed Web Server
OpenLiteSpeed
HHVM
WordPress

2015年9月12日土曜日

「Oinker」チャットワークより高機能な知的生産性を向上してくれるウェブサービス

Oinkerチャットワークより高機能な知的生産性を向上してくれるウェブサービスです。友人のスーパープログラマーが制作したものなので、ちょっとお世辞も入っています(笑)。とにかく、非常に高機能で、よく出来ています。



基本的な機能は
  • チャット
  • チャットの発言を材料に情報を組み立てる
の2つ。


ただし、脳内のニューロンネットワークを構築するがごとく、データを系統立て並べ替え、整理できるので、以下の様なことが簡単に実現できます。
  • 個人的なメモを投稿、必要に応じて重要な部分をまとめる
  • 日常的にはチャットとして利用して、重要な情報だけは保存しておく
  • TODO管理(個人からチームまで)
  • ブレインストーミングからアイデアを組み立てる
  • プロジェクト管理

こちらが使い方のサンプルページ
ビジネス利用で鍛えられていますので、完成度が高いです。

チャットを試してみたい方は、私のユーザーIDがtalkativepgですので、遠慮無くどうぞ。デスクトップ通知にも対応しています。

使い方説明の動画


ファイルのアップロード


現在、キャンペーン中だそうで、2015年9月中に登録してくれた方は、ディスク容量1GBが、3GBにアップグレードされるそうです。希望する方は、こちらから、自己申告してください

ビジネス利用を検討してくれる方には、開発者本人が日本全国どこにでも営業、使い方説明に馳せ参じるそうです。

参考サイト
Oinkerブログ

2015年9月11日金曜日

SilexでGET、POSTデータをテンプレートエンジンのTwigで表示

Silex(1.3)でGET、POSTデータをテンプレートエンジンのTwigで表示です。ぷぎがぽぎさんのブログのrequest部分を参考にしました。

PHP(requestというグローバル変数にRequestオブジェクトを設定)
$app['twig'] = $app->share($app->extend('twig', function($twig, $app) {
  $twig->addGlobal('request', $app['request']);
  return $twig;
}));
Twig
<input type="text" name="username" value="{{request.get('username')}}" />
<input type="password" name="password" value="{{request.get('password')}}" />
{{request.getClientIp}}
{{request.getRequestUri}}
{{request.getQueryString}}

実際に設定してみたサイトがこちら

参考サイト
Silexを試してみた(ぷぎがぽぎさん)

2015年9月10日木曜日

SilexでGET、POSTデータの取得

Silex(1.3)GET、POSTデータの取得です。GETも、POSTも、$app['request']->get('パラメーター名');で取得できます。また、SymfonyのRequestオブジェクトからは、様々なデータにアクセスできる模様。

// GET
$id = $app['request']->get('id');

// POST
$username = $app['request']->get('username');
$password = $app['request']->get('password');

// その他のRequestオブジェクト
$ClientIp = $app['request']->getClientIp();
$RequestUri = $app['request']->getRequestUri();
$QueryString = $app['request']->getQueryString();

実際に設定してみたサイトがこちら

参考サイト
Usage(Silex Documentation)

2015年9月9日水曜日

Silexでリダイレクト(redirect)

Silex(1.3)でリダイレクト(redirect)です。

$app->get('/', function () use ($app) {
  return $app->redirect('http://talkativepg.byethost32.com/');
});

$app->get('/hello', function () use ($app) {
  return $app->redirect('/hi');
});

実際に設定してみたサイトがこちら

話は変わりますが、先日設定した「2FreeHosting.com」さんは重くて耐えられなくなったので、サーバーを引越ししました。今回お世話になるのは「byethost.com」さんです。同様に無料で、PHP、MySQLなどが利用できます。



参考サイト
使用方法 (Usage)(Silex ユーザーガイド)
Usage(Silex Documentation)

2015年9月8日火曜日

Silexで開発環境のデバック(debug)表示

Silex(1.3)で開発環境のデバック(debug)表示です。「$app['debug'] = true;」とすると、詳細なエラー情報が表示されます。

$app['debug'] = true;
エラー表示
use Symfony\Component\HttpFoundation\Response;

$app->error(function (\Exception $e, $code) {
  return new Response('<h3>Error '.$code.'<h3><pre>'.$e.'</pre>');
});
Silex ユーザーガイド」は、日本語ドキュメントがしっかり整備されていて、ありがたい限りです。素晴らしいとしか、言いようがありません!!

参考サイト
ブートストラップ (Bootstrap)(Silex ユーザーガイド)
Usage(Silex Documentation)

2015年9月7日月曜日

Silexでルーティング(Routing)

Silex(1.3)でルーティング(Routing)です。assertが、必須項目 (Requirements)bindが、名前付きルーティング (Named routes)となっています。

$app->get('/blog/{id}', function($id) use ($app){ 
  return $app['twig']->render('blog.twig', array(
    'id' => $id,
  ));
})->assert('id', '\d+')->bind('blog');

実際に設定してみたサイトがこちら

参考サイト
使用方法 (Usage) (Silex ユーザーガイド)
Usage(Silex Documentation)

2015年9月5日土曜日

UbuntuがクラウドOSで高いシェア

UbuntuがクラウドOSで高いシェアを維持しているとのこと。ZDNetのニュース記事によると、CentOSとの開きも大きい。これはちょっと意外な感じがしました。「Ubuntuを勉強すべし」、そういうことなのかもしれません。



参考サイト
「Ubuntu Linux」クラウド分野で高いシェアを維持(ZDNet Japan)

2015年9月4日金曜日

SilexのテンプレートエンジンTwigで、グローバル変数の設定

Silex(1.3)のテンプレートエンジンTwigで、グローバル変数の設定です。同じ要領で、フィルターも設定できるらしい。関係ありませんが、PHPにlevenshteinなんていう関数があるんですね。新たな発見でした。

$app['twig'] = $app->share($app->extend('twig', function($twig, $app) {
  // グローバル変数
  $twig->addGlobal('pi', 3.14);
  $twig->addGlobal('sitename', 'サイト名');

  // フィルター
  $twig->addFilter('levenshtein', new \Twig_Filter_Function('levenshtein'));

  return $twig;
}));

実際に設定してみたサイトがこちら

参考サイト
TwigServiceProvider(Silex Documentation)
levenshtein(PHP Manual)

2015年9月3日木曜日

SilexにTwigを組み込む

Silex(1.3)にテンプレートエンジンのTwigを組み込んでみました。作業ノートさんの記事は、Twigに限らず、その他のSilexの設定もまとめられていて、非常にありがたいです。参考にさせてもらいました。

// Twig
$app->register(new Silex\Provider\TwigServiceProvider(), array(
  'twig.path' => __DIR__.'/views',
));

// ルーティング
$app->get('/', function() use($app) { 
  return $app['twig']->render('index.twig');
}); 

実際に設定してみたサイトがこちら

参考サイト
Silexを試してみた(4) Twig(作業ノートさん)
TwigServiceProvider (Silex Documentation)

2015年9月2日水曜日

Silexで「Hello world」

Silex(1.3)で「Hello world」です。まずは、はじめの一歩。

実際に設定してみたサイトがこちら
2FreeHosting.com」という無料ホスティングです。PHP、MySQLなど利用可。
無料で大変ありがたいのですが、ちょっと重いです。

require_once __DIR__.'/vendor/autoload.php'; 

$app = new Silex\Application(); 

$app->get('/', function() use($app) { 
 return 'Hello world. '; 
}); 

$app->run(); 


参考サイト
Silex

2015年9月1日火曜日

PHPのマイクロフレームワークSilexをインストール

PHPのマイクロフレームワークSilexインストールしてみました。今頃どうしたんだという気がしないでもないですが、Symfony2のコンポーネントを使っているというところに惹かれました。インストールしたのは、Silex 1.3です。月が変わったので、また思いつきで始めてみます(笑)。

composer.json
{
  "require": {
    "silex/silex": "~1.3"
  }
}