2013年12月31日火曜日

今年最もアクセスの多かった記事は「CentOS 6.4をネットワークインストール」

今年最もアクセスの多かった記事は「CentOS 6.4をネットワークインストール」でした。技術系のネタでアクセスが稼げるようになってきたということは、このブログも、ちょっとは技術系ブログと名乗れるようになったということかもしれません(笑)。

中身の薄い記事が大半を占めますが、引き続き、コツコツ進められたらと思います。ちょっとでも時間を割いて、目を通していただけた方、本当に有難うございます。

良いお年を!



2013年12月30日月曜日

PHPフレームワークのPhalconで、404エラーの表示

PHPフレームワークのPhalcon(1.2.4)で、404エラーの表示です。ディスパッチャーの前に、設定を書き込んでおくと、例外処理をしてくれるようになる模様。エラーが発生すると、404の画面になってしまうので、開発時は外しておいた方がいいかもしれません。

/public/index.php
use Phalcon\Dispatcher,
    Phalcon\Mvc\Dispatcher as MvcDispatcher,
    Phalcon\Events\Manager as EventsManager,
    Phalcon\Mvc\Dispatcher\Exception as DispatchException;

$di->set('dispatcher', function() {

  //Create an EventsManager
  $eventsManager = new EventsManager();

  //Attach a listener
  $eventsManager->attach("dispatch:beforeException", function($event, $dispatcher, $exception) {

    //Handle 404 exceptions
    if ($exception instanceof DispatchException) {
      $dispatcher->forward(array(
        'controller' => 'index',
        'action' => 'show404'
      ));
      return false;
    }

    //Handle other exceptions
    $dispatcher->forward(array(
      'controller' => 'index',
      'action' => 'show503'
    ));

    return false;
  });

  $dispatcher = new MvcDispatcher();

  //Bind the EventsManager to the dispatcher
  $dispatcher->setEventsManager($eventsManager);

  return $dispatcher;

}, true);
実際に設定してみたサイトがこちら

2013年12月29日日曜日

ネットに繋がらない状態でもGmailが読める「オフラインGmail」

ネットに繋がらない状態でもGmailが読める「オフラインGmail」を試してみました。Chromeブラウザの拡張機能として提供されていて、インターネットに接続していなくても、メールにアクセスできます。もちろん、新着メールは確認できませんが、ネットにつながった際に同期してくれるとのこと。ネットに繋がらない状態でもメールの内容を確認したい場合など、便利に利用できると思います。災害時などにも、威力を発揮してくれるでしょう。

2013年12月28日土曜日

PHPフレームワークのPhalconで、Voltテンプレート内でのURL生成

PHPフレームワークのPhalcon(1.2.4)で、Voltテンプレート内でのURL生成です。しばらく、右往左往してしまいましたが、わかれば、なんてことはありません。

<a href="{{ url("") }}">ホーム</a>
<img src="{{ url("pic/image.jpg") }}" />
実際に設定してみたサイトがこちら

2013年12月27日金曜日

PHPフレームワークのPhalconで、SQL文のプロファイリング

PHPフレームワークのPhalcon(1.2.4)で、SQL文のプロファイリングです。利用してみると、実際にどのようなSQL文が利用されているのか把握できます。

手順は2段階。

1, Profilerを読み込む。
2, コントローラーで利用できるようになる。

/public/index.php
$di->set('profiler', function(){
  return new \Phalcon\Db\Profiler();
}, true);

$di->set('db', function() use ($config, $di) {

  $eventsManager = new \Phalcon\Events\Manager();

  $profiler = $di->getProfiler();

  $eventsManager->attach('db', function($event, $connection) use ($profiler) {
    if ($event->getType() == 'beforeQuery') {
      $profiler->startProfile($connection->getSQLStatement());
    }
    if ($event->getType() == 'afterQuery') {
      $profiler->stopProfile();
    }
  });

  $connection = new \Phalcon\Db\Adapter\Pdo\Mysql(array(
    'host' => 'sample_host',
    'username' => 'sample_username',
    'password' => 'sample_password',
    'dbname' => 'sample_dbname',
    'options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
      )
  ));

  $connection->setEventsManager($eventsManager);

  return $connection;
});
/app/controllers/NewsController.php
$profiles = $this->di->get('profiler')->getProfiles();

foreach ($profiles as $profile) {
  print "<pre>" ;
  print_r($profile->getSQLStatement())  ;
  print "\n" ;
  print_r($profile->getInitialTime()) ;
  print "\n" ;
  print_r($profile->getFinalTime()) ;
  print "\n" ;
  print_r($profile->getTotalElapsedSeconds()) ;
  print "</pre>" ;
}
実際に設定してみたサイトがこちら



参考サイト
PhalconのSQLログをファイルに出力する(Signal Elevenさん)

2013年12月26日木曜日

PHPフレームワークのPhalconで、モデルを利用したデータの検索

PHPフレームワークのPhalcon(1.2.4)で、モデルを利用したデータの検索です。conditions に検索条件を設定して、bind で、実際のデータを当てはめればOKのようです。慣れは必要でしょうが、コツを掴めば、やっていけそうな気がします。

/app/controllers/NewsController.php
$parameters = array(
  "order" => "created_at DESC",
  "conditions" => " title LIKE ?1 OR detail LIKE ?1 "
  "bind" => array(1 => "%キーワード%")
) ;
$news = News::find($parameters);
実際に設定してみたサイトがこちら

2013年12月25日水曜日

PHPフレームワークのPhalconで、カスタムヘルパーの作成

PHPフレームワークのPhalcon(1.2.4)で、カスタムヘルパーの作成です。おおまかに下記の3ステップ。いろいろ便利に利用できそうです。

1, 適当に、\Phalcon\Tagクラスを継承してMyTagsクラスを作成する。
2, Loaderに「library」フォルダを登録し、サービス(Dependency Injection)として読み込む。
3, Voltテンプレートエンジンで利用できるようになる。

/app/library/MyTags.php (文字列を短縮するtruncateを作成)
class MyTags extends \Phalcon\Tag
{
  static public function truncate($input, $length)
  {
    $ret = trim($input) ;
    if ( mb_strlen($ret) >= $length ) {
      $ret = mb_substr($ret, 0, $length) . "...";
    }
    return $ret ;
  }
}
/public/index.php
$loader->registerDirs(
  array(
  ...
  ...
    __DIR__ . '/../../app/library/',
  )
)->register();

$di->set('mytags', function(){
  return new MyTags();
});
/app/views/index/index.volt
{{ mytags.truncate(news.detail, 20)|e }}
実際に設定してみたサイトがこちら



参考サイト
Volt custom filters - evaluate variables(Discussion Phalcon Framework)

2013年12月24日火曜日

PHPフレームワークのPhalconで、写真ストレージクラウドのCloudinaryと連携

PHPフレームワークのPhalcon(1.2.4)で、写真ストレージクラウドのCloudinaryと連携です。Cloudinaryは、お気に入りのクラウド画像編集&ストレージサービスで、過去にも、Django、Ruby on Railsと試してきました。今回は、Phalconでの試み。Phalcon限定と言うよりは、PHP全般で利用できると思います。

こちらから、ダウンロードして解凍してできた、srcフォルダ内の3つのファイル(Cloudinary.phpUploader.phpApi.php)をインクルードして利用すればOKです。Swift Mailerの時と同様、/vendor/cloudinary/ に配置しました。

画像の登録
require_once('../vendor/cloudinary/src/Cloudinary.php'); 
require_once('../vendor/cloudinary/src/Uploader.php'); 
require_once('../vendor/cloudinary/src/Api.php'); 
\Cloudinary::config(array(
 "cloud_name" => "sample_cloud_name",
 "api_key" => "sample_api_key",
 "api_secret" => "sample_api_secret"
));
$ret = \Cloudinary\Uploader::upload($file->getTempName());
アップロードに成功すると、$ret には、以下のような配列データが返ってきます。とりあえず、public_id だけ、データベースに保持しておけば、画像を呼び出せます。
Array
(
  [public_id] => sample
  [version] => 1312461204
  [width] => 864
  [height] => 576
  [format] => jpg
  [bytes] => 120253
  [url] => http://res.cloudinary.com/demo/image/upload/v1371281596/sample.jpg
  [secure_url] => https://res.cloudinary.com/demo/image/upload/v1371281596/sample.jpg
)
画像の編集・表示
require_once('../vendor/cloudinary/src/Cloudinary.php'); 
require_once('../vendor/cloudinary/src/Uploader.php'); 
require_once('../vendor/cloudinary/src/Api.php'); 
\Cloudinary::config(array(
 "cloud_name" => "sample_cloud_name",
 "api_key" => "sample_api_key",
 "api_secret" => "sample_api_secret"
));
$img = cl_image_tag($public_id, array( "width" => 100, "height" => 100, "crop" => "fill" )); 
画像の削除
require_once('../vendor/cloudinary/src/Cloudinary.php'); 
require_once('../vendor/cloudinary/src/Uploader.php'); 
require_once('../vendor/cloudinary/src/Api.php'); 
\Cloudinary::config(array(
 "cloud_name" => "sample_cloud_name",
 "api_key" => "sample_api_key",
 "api_secret" => "sample_api_secret"
));
$api = new \Cloudinary\Api();
$api->delete_resources(array($public_id));
わかりやすくするため、インクルード部分を重複して書いていますが、実際に利用する場合は、コンポーネントとしてまとめた方が良いと思います。

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



参考サイト
PHP integration(Cloudinary Documentation)
Django、Ruby on RailsでのCloudinary連携

2013年12月23日月曜日

PHPフレームワークのPhalconで、ファイルのアップロード

PHPフレームワークのPhalcon(1.2.4)で、ファイルのアップロードです。配列で受け取るようになっているので、複数ファイルのアップロードにも対応しています。ただ、アップロード自体は非常に簡単に実現できるのですが、ファイルタイプやサイズのチェックなどは用意されていないようなので、finfo などを利用して、自分でチェックしないといけないようです。

public function uploadAction()
{
  if ($this->request->hasFiles() == true) {
    foreach ($this->request->getUploadedFiles() as $file) {
      $file->moveTo('public/pics/' . $file->getName());
    }
  }
}
実際に設定してみたサイトがこちら


参考サイト
uploading files(Discussion Phalcon Framework)

2013年12月22日日曜日

自分のアカウントが、ハッカーのデータ侵害にさらされたどうかをチェックしてくれる「Have I been pwned?」

自分のアカウントが、ハッカーのデータ侵害にさらされたどうかをチェックしてくれる「Have I been pwned?」 メールアドレスを入力して、「pwned?」のボタンをクリックすると調べてくれます。AdobeYahoo!SonyVodafoneなどの海外サイトを利用したことがある方が対象です。もし、不幸にもヒットしてしまった場合は、すぐにパスワードを変更された方がいいでしょう。

2013年12月21日土曜日

PHPフレームワークのPhalconで、モデルの belongsTo と hasMany

PHPフレームワークのPhalcon(1.2.4)で、モデルの belongsTohasMany です。よく見かける設定方法だと思いますので、ドキュメントの例に従って設定すれば、うまくいくと思います。躓くかと思いましたが、意外とすんなり動きました。ありがたい限りです。

/app/models/News.php
class News extends Phalcon\Mvc\Model
{
  public $id;

  public $user_id;

  public $title;

  public function initialize()
  {
    $this->belongsTo('user_id', 'Users', 'id', array(
    'reusable' => true
  ));
  }
}
/app/models/Users.php
class Users extends Phalcon\Mvc\Model
{
  public $id;
  
  public $name;

  public function initialize()
  {
    $this->hasMany('id', 'News', 'user_id');
  }
}
/app/views/news/show.volt
{{ news.title }}
{{ link_to('members/show/' ~ news.user_id, news.users.name) }}
実際に設定してみたサイトがこちら

2013年12月20日金曜日

PHPフレームワークのPhalconで、RedirectとForwardの違い

PHPフレームワークのPhalcon(1.2.4)で、RedirectForwardの違いです。同じものかと思って利用していたら、全くの別物でした。どうも動きがおかしいなと感じていて、調べてみて原因がわかったのでメモです。早い段階で気づいて良かったです。

// 内部的な処理で、コントローラーだけがフォワードされる。URLは変わらない。
$this->dispatcher->forward(array('controller' => 'news', 'action' => 'index'));

// HTTPリダイレクトが行われて、URLも変わる
$this->response->redirect("news/index");
実際に設定してみたサイトがこちら



参考サイト
Redirect / Forward(Discussion Phalcon Framework)

2013年12月19日木曜日

PHPフレームワークのPhalconで、ページネーション(ページ送り)

PHPフレームワークのPhalcon(1.2.4)で、ページネーション(ページ送り)です。コントローラー側は、簡潔でわかりやすいです。テンプレートのVoltは、文字列の連結が「~(チルダ)」です。これにハマりました。慣れが必要です。

/app/controllers/NewsController.php
$news = News::find();
$paginator = new Phalcon\Paginator\Adapter\Model(array(
  "data" => $news,
  "limit" => 10,
  "page" => $currentPage
));
$page = $paginator->getPaginate();
$this->view->setVar("page", $page);
/app/views/news/index.volt
{{ link_to('news/index', '最初') }}
{{ link_to('news/index?page=' ~ page.before, '前へ') }}
{{ link_to('#', page.current ~ '/' ~ page.total_pages) }}
{{ link_to('news/index?page=' ~ page.next, '次へ') }}
{{ link_to('news/index?page=' ~ page.last, '最後') }}
実際に設定してみたサイトがこちら

2013年12月18日水曜日

PHPフレームワークのPhalconで、セッションデータの取扱い

PHPフレームワークのPhalcon(1.2.4)で、セッションデータの取扱いです。session->setで設定、session->hasで存在確認、session->removeで破棄という具合なので、これは、わかりやすいです。

// セッションデータの設定
$this->session->set('auth', array(
  'id' => $user->id,
  'name' => $user->name
));

// セッションデータの呼び出し
if ($this->session->has("auth")) {
  $auth = $this->session->get("auth");
}

// セッションデータの破棄
$this->session->remove('auth');
実際に設定してみたサイトがこちら

2013年12月17日火曜日

PHPフレームワークのPhalconで、ルーティング

PHPフレームワークのPhalcon(1.2.4)で、ルーティングです。特定のURLにアクセスされた際に、指定のコントローラーとアクションを呼び出すことができます。

下の例で言うと、
/login にアクセスされた場合、sessionコントローラーのindexアクションを
/logout にアクセスされた場合、sessionコントローラーのendアクションを
呼び出しています

$di->set('router', function(){

  $router = new Phalcon\Mvc\Router();

  // root
  $router->add("/", array(
    'controller' => 'index',
    'action' => 'index'
  ));

  // login
  $router->add('/login', array(
    'controller' => 'session',
    'action' => 'index',
  ));

  // logout
  $router->add('/logout', array(
    'controller' => 'session',
    'action' => 'end',
  ));

  return $router;
});
実際に設定してみたサイトがこちら

2013年12月16日月曜日

PHPフレームワークのPhalconで、データのサニタイジング

PHPフレームワークのPhalcon(1.2.4)で、データのサニタイジングです。配列で複数のフィルターを設定することで、希望のフォーマットにデータを整形してくれます。わかりやすいし、便利に利用できます。

/app/controllers/〇〇Controller.php
public function saveAction()
{
  $name = $this->request->getPost('name', array('striptags', 'string'));
  $username = $this->request->getPost('username', 'alphanum');
  $email = $this->request->getPost('email', 'email');
}

public function showAction($id)
{
  $id = $this->filter->sanitize($id, array('int'));
}
用意されているフィルター一覧
// 文字列
string

// メールアドレス
email

// 整数
int

// 浮動小数点
float

// 半角英数
alphanum

// タグの除去
striptags

// 前後の空白の除去
trim

// 小文字
lower

// 大文字
upper
実際に設定してみたサイトがこちら

2013年12月15日日曜日

ファイルを暗号化してくれる「File Lock」

ファイルを暗号化してくれる「File Lock」 ユニークな点は、暗号化がローカルのブラウザ内で実行されている点です。ファイルをサーバー側に送って暗号化してもらうという仕組みではないので、セキュリティーは強固。このアイディアは本当にすばらしいと思います。

使い方は簡単。ファイルを選択し、パスワードを入力すると、「ファイル名.enc」として暗号化ファイルが生成されます。復号化するには、同じように、出来上がったファイルを選択し、パスワードを入力すれば、OK。

2013年12月14日土曜日

PHPフレームワークのPhalconで、GmailをSMTPサーバーとしてメール送信

PHPフレームワークのPhalcon(1.2.4)で、GmailをSMTPサーバーとしてメール送信です。Swift Mailerを利用すると、良い感じで送信できました。Laravelでの設定を思い出します。今回利用したバージョンは、Swift-5.0.3。ダウンロードしたSwift Mailerを、/vendor/Swift-5.0.3/ に配置しました。実際に利用する場合は、もうちょっと体裁を整えた方が良いと思いますが、とりあえず。

/app/controllers/ContactController.php
// メール送信
require_once('../vendor/Swift-5.0.3/lib/swift_init.php'); 
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', '465', 'ssl')
  ->setUsername('gmailid')
  ->setPassword('gmailpassword');
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('マイクのテスト中')
  ->setFrom(array('samplesender@gmail.com' => '送信者'))
  ->setTo(array('samplereceiver@gmail.com' => '受信者'))
  ->setBody('只今、マイクのテスト中です。', 'text/html');
$mailer->send($message);
実際に設定してみたサイトがこちら

参考サイト
Проблема с View(Discussion Phalcon Framework)
ありがたい情報ですが、何語かわかりません(笑)。

2013年12月13日金曜日

PHPフレームワークのPhalconで、DBの文字化け対応

PHPフレームワークのPhalcon(1.2.4)で、DBの文字化け対応です。レンタルサーバーなどで、文字コードの設定を変更できないような場合は有効だと思います。接続 options に「PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'」を加えると良いようです。

$di->set('db', function() use ($config) {
  return new DbAdapter(array(
    'host' => $config->database->host,
    'username' => $config->database->username,
    'password' => $config->database->password,
    'dbname' => $config->database->dbname,
    'options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    )
  ));
});
実際に設定してみたサイトがこちら

参考サイト
PDO + MySQL の SET NAMESはこれで OK?(メモとかさん)
mysql utf8 encoding(Discussion Phalcon Framework)

2013年12月12日木曜日

PHPフレームワークのPhalconで、入力データのチェック(Validation)

PHPフレームワークのPhalcon(1.2.4)で、入力データのチェック(Validation)です。もっと他にうまい方法があると思いますが、とりあえず、エラーメッセージを日本語化できました。さしあたり、力技で対処することにします(笑)。

/app/controllers/ContactController.php
use Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\Email;

$validation = new Phalcon\Validation();

$validation->add('name', new PresenceOf(array(
    'message' => 'お名前を入力して下さい。',
)));
$validation->add('email', new PresenceOf(array(
    'message' => 'メールアドレスを入力して下さい。',
)));
$validation->add('email', new Email(array(
    'message' => '正しいメールアドレスを入力して下さい。',
)));

$validation->setFilters('name', 'trim');
$validation->setFilters('email', 'trim');

$messages = $validation->validate($_POST);

if (count($messages)) {
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

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


2013年12月11日水曜日

PHPフレームワークPhalconのチュートリアル「INVO」

PHPフレームワークPhalcon(1.2.4)のチュートリアル「INVO」を設定してみました。Phalconがアプリケーションサンプルとして用意してくれているもので、会員登録、ログイン、お問い合わせフォーム、商品の登録、変更、削除といった機能を試すことができます。あまり詳しく見ていないのですが、これを手本に、また少しずつ進められたらと。

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



参考サイト
Tutorial 2: Explaining INVO(Phalcon documentation)

2013年12月10日火曜日

PHPフレームワークのPhalconで、Scaffold

PHPフレームワークのPhalcon(1.2.4)で、Scaffoldです。DBの設定をしておくと、コントローラー、モデル、ビューと、全てデータベースのスキーマ通りに生成してくれます。感動です。テンプレートは英語で生成されてしまいますが、管理画面などでしたら、これでも十分でしょう。

1, プロジェクト作成(phalcon create-project ○○)
2, /app/config/config.phpを編集して、DBの設定を行う
3, Scaffold(phalcon scaffold --table-name ○○)

プロジェクトを作成。
$ phalcon create-project --help

Phalcon DevTools (1.2.4)

Help:
  Creates a project

Usage:
  project [name] [type] [directory] [enable-webtools]

Arguments:
  help  Shows this help text

Example
  phalcon project store simple

Options:
 --name               Name of the new project
 --enable-webtools    Determines if webtools should be enabled [optional]
 --directory=s        Base path on which project will be created [optional]
 --type=s             Type of the application to be generated (micro, simple, modules)
 --template-path      Specify a template path [optional]
 --use-config-ini     Use a ini file as configuration file [optional]
 --trace              Shows the trace of the framework in case of exception. [optional]
 --help               Shows this help

# プロジェクト「myapp」を作成。
$ phalcon create-project myapp
/app/config/config.phpを編集し、DBの接続設定。
return new \Phalcon\Config(array(
  'database' => array(
    'adapter'     => 'Mysql',
    'host'        => 'localhost',
    'username'    => 'username',
    'password'    => 'password',
    'dbname'      => 'databasename',
  ),
));
Scaffold、例として「products」を作成。DBにはあらかじめ、productsテーブルが存在しています。
# scaffoldで「products」を作成
$ phalcon scaffold --table-name products

参考サイト
Phalcon Developer Tools(Phalcon documentation)

2013年12月9日月曜日

Phalcon Developer Toolsをインストール

Phalcon Developer Tools(1.2.4)をインストールしてみました。詳しい手順はこちら。ビデオを見る限り、これでScaffoldを利用した開発ができるようになる模様。

$ git clone git://github.com/phalcon/phalcon-devtools.git
$ cd phalcon-devtools/
# . ./phalcon.sh
$ phalcon commands

Phalcon DevTools (1.2.4)

Available commands:
  commands (alias of: list, enumerate)
  controller (alias of: create-controller)
  model (alias of: create-model)
  all-models (alias of: create-all-models)
  project (alias of: create-project)
  scaffold
  migration
  webtools






参考サイト
Phalcon PHP DevToolsを使おう(新人Webエンジニアの記録。さん)

2013年12月8日日曜日

Linux Mint 16をインストール

Linux Mint 16をインストールしてみました。今回、インストールしたのは、GNOME 3派のCinnamonです。インストールイメージは、linuxmint-16-cinnamon-dvd-64bit.iso。日本語を選択してインストールすると、ログイン後に、当たり前のように整った日本語画面が表示されます。感動です。ただ、どこが変わったのかよくわかりません(笑)。ログイン画面が派手になったことぐらいでしょうか。洗練されていて、結構、好きです。ドライバーの問題が何度か警告されましたので、無難に利用したいという方は、GNOME 2派のMATEを選択された方が良いかもしれません。

2013年12月7日土曜日

CentOS 6.5をネットワークインストール

CentOS 6.5をネットワークインストールしてみました。今回利用したisoファイルは、CentOS-6.5-x86_64-netinstall.iso。指定した接続先サーバーは、以下の通り。

ftp://ftp.riken.jp/Linux/centos/6.5/os/x86_64/


特に、CentOS 6.4と変わった部分はないように思います。