SSHフォワーディング

特定のIPホストからでしかSSHやsftp,ftpの許可をしていない。
そんな時に活躍するのがSSHフォワーディング。回線もセキュアになります。

$ ssh -L <ローカルポート番号>:<転送先ホスト>:<転送先ポート番号> <ユーザ名>@<リモートホスト>

例えば

$ ssh -L 2222:you_want_to_connect.com:22 yourname@ssh_host.com

としてsshに接続して127.0.0.1(localhost)の2222ポートに対してyou_want_to_connect.com:22に接続するように接続してやります。

はじめは分かりにくいですが分かれば簡単。いつでも一行書けばセキュアな回線で接続が可能になりますね。

symfony1.4からmemcachedを使う方法 - 基本編



symfonymemcachedを利用する方法を簡単にまとめました。
nginx + php5でmemcachedを利用するという方法です。

http://labs.unoh.net/2010/05/symfonydoctrine.html
に詳しくあるのですが更に詳細はこちらを参照ください。

nginx, php-fastcgiでphp5,symfony1.4を動かせていることを前提とします。
http://kmusiclife.hatenablog.com/entry/20111105/1320467309
http://kmusiclife.hatenablog.com/entry/20120509/1336538654
などを参考にしてください。

必要なモジュールなどをインストールします。

# apt-get install memcached
# apt-get install php5-memcache
# apt-get install php5-memcached
# /etc/init.d/php-fastcgi restart
# /etc/init.d/nginx restart


config/ProjectConfiguration.class.php

  public function configureDoctrine(Doctrine_Manager $manager)
  {
	$servers = array(
		array(
		'host' => '127.0.0.1',
		'port' => 11211,
		'persistent' => true),
	);
	$cacheDriver = new Doctrine_Cache_Memcache(array(
		'servers' => $servers,
		'compression' => false)
	);
    $manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver);
    $manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE_LIFESPAN, 60); // 結果キャッシュのデフォルトの存続秒数 sec
    $manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE, $cacheDriver);
    $manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE_LIFESPAN, 60); // クエリーキャッシュのデフォルトの存続秒数 sec

  }

Doctrineからの利用

$this->table_names = Doctrine_Core::getTable('table_name')
    ->createQuery('a')
    ->where('a.id =? ', $id)
    ->useResultCache(true)
    ->execute();

Symfony2 Choice Fieldの使い方

Symfony2を本格的に覚え始めました。フレームワークを覚えるのにまず行うのがフォーム項目それぞれの使い方です。Choice, Multiple Choice, Radiobox, File, text, textarea, date/datetimeなどの基本フォーム項目の表示方法、validationを覚えればフレームワークも3割は使えたも同然です。

今回はchoiceからまとめていきます。

Post Entity:

class Post
{
    /**
    * @var category $category
    * @ORM\Column(name="category", type="string", length="255")
    */
    private $category;
    public static function getCategories()
    {
	    return array('cat1'=>'カテゴリー1', 'cat2'=>'カテゴリー2');
    }
}

PostType:

use Bunble\Name\Entity\Post;
class PostType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('category', 'choice', array(
                    'choices'=>Post::getCategories(),
                    'empty_value' => 'Choose your gender'
                )
            );
    }
}


choicesの項目にPostクラスのgetCategoriesを投げてあげましょう。
empty_valueの設定は色々と問題もあったようで。
https://github.com/symfony/symfony/pull/1336


TemplateではgetCategories()の配列をどう取得するかがポイントになります。
Twigではvar[ ]として配列を取得します。ControllerからPostのクエリを投げています。


Template(Twig):

    {% for entity in entities %}
         {{ entity.getCategories[entity.category] }}
    {% endfor %}


ドキュメントにあるcallbackがなぜかうまく動作しませんでした。
validationでなぜか引っかかります。callbackの投げ方が悪かったのかもしれませんが。
http://symfony.com/doc/current/reference/forms/types/choice.html


Form Type一覧:
http://symfony.com/doc/current/reference/forms/types.html

Choice Field Type
http://symfony.com/doc/current/reference/forms/types/choice.html
Text Field Type
http://symfony.com/doc/current/reference/forms/types/text.html
Textarea Field Type
http://symfony.com/doc/current/reference/forms/types/textarea.html
Email Field Type
http://symfony.com/doc/current/reference/forms/types/email.html
URL Field Type
http://symfony.com/doc/current/reference/forms/types/url.html
Datetime Field Type
http://symfony.com/doc/current/reference/forms/types/datetime.html
Checkbox Field Type
http://symfony.com/doc/current/reference/forms/types/checkbox.html
File Field Type
http://symfony.com/doc/current/reference/forms/types/file.html
Radio Field Type
http://symfony.com/doc/current/reference/forms/types/radio.html
Hidden Field Type
http://symfony.com/doc/current/reference/forms/types/hidden.html

macportでnginx/php5.4/phpmyadminを動かすまでザザーッと

php5.4のインストール

$ sudo port install php54
$ sudo port install php54-cgi
$ sudo port install php54-mbstring
$ sudo port install php54-curl
$ sudo port install php54-mcrypt
$ sudo port install php54-mysql

うちで出たエラーは下記の通り。対処も同時に。

エラー対処:

$ sudo port install php54
Error: Target org.macports.activate returned: Image error: /opt/local/bin/captoinfo is being used by the active ncursesw port.  Please deactivate this port first, or use 'port -f activate ncurses' to force the activation.
$ sudo port -f uninstall ncursesw

エラー対処:

$ sudo port install php54
Log for perl5 is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_perl5/perl5/main.log
$ sudo port installed perl
$ sudo port -f perl5 @5.8.9_0
$ sudo port -f perl5 @5.12.3_1+perl5_12
$ sudo port -f perl5.8 @5.8.9_3
$ sudo port -f perl5.12 @5.12.4_0

spawn-fcgi/nginxのインストール

$ sudo port install nginx
$ sudo port install spawn-fcgi

mysql5のインストール

$ sudo port install mysql5-server
$ sudo /opt/local/bin/mysql_install_db5

普通に起動するとエラーが出るので下記のように設定変更。
_mysqlの権限を与える必要があります。

$ sudo cd /opt/local/var/db/mysql5
$ sudo chown _mysql:_mysql mysql
$ sudo /opt/local/lib/mysql5/bin/mysqld_safe & # mysql5起動

mysql5の起動とパスワードの設定

$ sudo /opt/local/lib/mysql5/bin/mysqld_safe &
$ sudo /opt/local/lib/mysql5/bin/mysqladmin -u root password 'new-password'

spawn-cgiを使ってphp-cgiの待ち構え設定

$ sudo vim /bin/php-fastcgi-start

ファイルphp-fastcgi-startの内容:

#! /bin/bash
/opt/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 3 -f /opt/local/bin/php-cgi54
$ sudo /bin/php-fastcgi-start

php.initの設定

$ sudo cd /opt/local/etc/php54
$ sudo cp php.ini-development php.ini
$ sudo vim /opt/local/etc/php54/php.ini
pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock
date.timezone = Asia/Tokyo


nginxの設定

$ sudo cd /opt/local/etc/nginx
$ sudo mv nginx.conf.example nginx.conf
$ sudo mv fastcgi_params.example fastcgi_params
$ sudo mv scgi_params.example scgi_params
$ sudo mv mime.types.example mime.types
$ sudo mv uwsgi_params.example uwsgi_params
$ sudo vim /opt/local/etc/nginx/nginx.conf

ファイルnginx.confの内容:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}
http {
    include /opt/local/etc/nginx/mime.types;
    sendfile on;
    keepalive_timeout  65;
    #gzip  on;
    include /opt/local/etc/nginx/sites-enabled/*;
}
$ sudo mkdir /opt/local/etc/nginx/sites-enabled
$ sudo vim /opt/local/etc/nginx/sites-enabled/localhost

ファイルlocalhostの内容:

server {

    listen 80;
    server_name localhost;
    access_log /opt/local/var/log/nginx/localhost.log;
    error_log /opt/local/var/log/nginx/localhost.error.log;
    root /opt/local/var/www;
    index index.php;

    location /phpmyadmin {
        alias /opt/local/share/phpmyadmin;
        index index.php;
    }
    location ~ /phpmyadmin/.*\.php$ {
        include /opt/local/etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /opt/local/share/$uri;
    }
    location ~ ^/.+\.php(/.*)?$ {
        set $script $uri;
        set $path_info "";
        if ($uri ~ "^(.+\.php)(/.+)") {
          set $script $1;
          set $path_info $2;
        }
        fastcgi_pass 127.0.0.1:9000;
        include /opt/local/etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME $script;
        fastcgi_param SCRIPT_FILENAME /opt/local/var/www$script;
        fastcgi_param PATH_INFO $path_info;
    }

}

nginx起動

$ sudo /opt/local/sbin/nginx


phpmyadminの準備

visit:
http://www.phpmyadmin.net/home_page/downloads.php

$ sudo cd /opt/local/share
$ sudo wget http://downloadhost/phpMyAdmin-3.5.1-all-languages.tar.gz

$ sudo tar zxvf phpMyAdmin-3.5.1-all-languages.tar.gz
$ sudo mv phpMyAdmin-3.5.1-all-languages phpmyadmin

$ sudo mv config.sample.inc.php config.inc.php
$ sudo vim config.inc.php


メモ:nginxやphp-cgi, mysqlの落とし方など

$ sudo nginx -s reload
$ sudo killall php-cgi54
$ sudo /opt/local/bin/mysqladmin5 -u root shutdown

nginxの各アプリケーション設定(symfony1.4, phpmyadmin)


phpmyadmin:

location /phpmyadmin {
     alias /usr/share/phpmyadmin/;
     index index.php;
 }
 location ~ ^/phpmyadmin/.+\.php$ {
     root /usr/share/phpmyadmin/;
     rewrite /phpmyadmin/(.*\.php?) /$1 break;
     include /etc/nginx/fastcgi_params;
     fastcgi_pass 127.0.0.1:9000;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$fastcgi_script_name;
 }

symfony1.4:

nginx0.9x

location / {
    if (-f $request_filename) {
        expires max;
        break;
    }
    if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
        rewrite ^(.*) /index.php last;
    }
}
location /sf/ {
    root /usr/share/php/data/symfony/web;
}
location ~ \.php($|/) {
    set $script $uri;
    set $path_info "";
    if ($uri ~ "^(.+\.php)(/.+)") {
      set $script $1;
      set $path_info $2;
    }
    fastcgi_pass 127.0.0.1:9000;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  /var/www/symfony1.4/web$script;
    fastcgi_param PATH_INFO $path_info;
    fastcgi_param SCRIPT_NAME $script;
}

nginx1.x

location /sf/ {
    root /usr/share/php/data/symfony/web;
}
location / {
    root   /var/www/symfony1.4/web/;
    index  index.php;
    if (-f $request_filename) {
        expires max;
        break;
    }
    if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
        rewrite ^(.*) /index.php last;
    }
}
location ~ \.php($|/) {
    set  $script     $uri;
    set  $path_info  "";
    if ($uri ~ "^(.+\.php)(/.+)") {
        set  $script     $1;
        set  $path_info  $2;
    }
    fastcgi_pass   127.0.0.1:9000;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_NAME $script;
    fastcgi_param SCRIPT_FILENAME /var/www/symfony1.4/web$script;
    fastcgi_param PATH_INFO $path_info;
}

参考:
http://d.hatena.ne.jp/Kmusiclife/20111105/1320467309

石川県金沢・小松・加賀⇔関西国際空港の移動手段まとめ

http://travel.kmusiclife.com/p/kzw-to-kix/ へ移動しました。


国際線のLCCがどれだけ増えて、価格が下がっても自宅のある石川県からは関西国際空港、または成田への移動がネックになります。小松空港という便利な空港はあるのですが、小松空港を使うのであればLCCを使う意味がありません。また、石川県内から成田を利用すると都内一泊必要になりコストも結局割高に。よって、金沢⇔関西国際空港の移動手段の検討が必要になるわけです。

というわけで調べましたが方法は3つ

1.特急サンダーバード+関空快速・特急はるか (8,690円〜10,550円/人) 所要時間4時間半
2.石川中央交通乗合空港ジャンボ、自宅まで送迎 (9,700円/人)  所要時間5時間半
3.高速バス+空港リムジンバス (5,800円/人) 所要時間約6〜7時間

1.特急サンダーバード関空快速・特急はるか(8,690円〜10,550円/人)


至って普通の関空へのルート。

金沢(サンダーバード)→京都・大阪・新大阪(関空快速)→関西国際空港
金沢(サンダーバード)→京都・大阪・新大阪(はるか)→関西国際空港

金額は8,690円〜10,550円になります。

おでかけネットなどで調べれば出てきます。
http://www.jr-odekake.net/
南海鉄道を使う方法もありますが、必ず一度の乗り換えがあり価格帯はおよそ8000円〜11,000円/人という感じです。

所要時間も短く利用しやすいです。

金沢発の最終:金沢19:43→関空23:36
関空発の最終:関空22:16→金沢02:46 (グリーン・寝台のみのきたぐにを利用)

2.石川中央交通乗合空港ジャンボ、自宅まで送迎 (9,700円/人)


石川中央交通乗合空港ジャンボを使う方法。時間を問わず自宅から自宅までの送迎で一人9700円/片道。
金沢市(一部を除く)、内灘白山市能美市小松市(一部を除く)、加賀市(一部を除く)にお住まいであればご自宅までお迎えに来てくれます。大人数になれば一人あたりの金額も安くなるみたいです。


所要時間は金沢西ICより、関西空港まで5時間半。空港にはフライトの2時間前に空港到着の予定で運行しているということです。
万が一渋滞でも迂回路で時間は厳守してくれるようです。心強いですね。


金沢発、関空発の両方に対応してくれるようです。
大荷物でも問題なく非常にスムーズなサービスのように思います。

石川中央交通乗合空港ジャンボ
TEL: 076-274-3975

http://chuokoutu.com/air.html


3.高速バス+空港リムジンバス (5,800円/人) 所要時間約6〜7時間


一番安くつくが、一番時間がかかりリスクが高いバスの利用。
バスは金沢→大阪(高速バス北陸ドリーム大阪号)、大阪→関空(空港リムジンバス)となり、
必ず1度乗り換えが必要になります。また、逆も同じです。

北陸ドリーム大阪号(4300円/人):
金沢⇔大阪駅JR高速バスターミナル

http://www.kakuyasubus.jp/kansai_hokuriku/hokuriku_dream/index.html

空港リムジンバス(1500円/人):
大阪駅近くハービス大阪⇔関空

http://www.okkbus.co.jp/index3.html

北陸ドリーム大阪号(4300円/人) + 空港リムジンバス(1500円/人) = 5,800円

所要時間は最も長い6〜7時間。乗り継ぎの時間もきわどいので多めに時間を見ておきましょう。

【金沢 → 関空:バス始発 (約6〜7時間)】
金沢 07:00 → 12:35 大阪駅 12:48 → 13:50 関空
金沢 07:00 → 12:35 大阪駅 13:08 → 14:10 関空
金沢 09:00 → 14:35 大阪駅 14:48 → 15:50 関空
金沢 09:00 → 14:35 大阪駅 15:08 → 16:10 関空
金沢 13:40 → 19:15 大阪駅 19:48 → 20:50 関空
【関空→金沢:バス最終 (約6〜7時間)】
関空 20:45 → 21:43 大阪駅 22:20 → 5:54 金沢
関空 21:05 → 22:03 大阪駅 22:20 → 5:54 金沢

ではよい旅を。

linux上でdropboxを利用する方法 クラウドバックアップに活用可能!


サイトのデータやデータベースのバックアップをどのようにとるか困っている方もいるのではないかと(^^) Dropboxを使う方法を紹介します。

1.Dropboxアカウントを取得

http://db.tt/sQqt33i
よりDropboxに登録!(すいません!私の紹介にさしてください!)

2.DropboxクライアントをDownload、Dropboxを実行


https://www.dropbox.com/install?os=lnx

# wget http://www.dropbox.com/download?plat=lnx.x86 -O dropbox.tar.gz
# tar zxvf dropbox.tar.gz
# cd .dropbox-dist
# ./dropboxd start &
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=xxxxxxxxxxxxx&cl=en_US to link this machine.

ここに書かれてるURLをchromefirefoxのブラウザ上で実行します。
1で取得したアカウントでログインします。ログインが成功すると。

Client successfully linked, Welcome Your name!

というメッセージが出るとDropboxが有効になります。

~Dropbox

dropboxのホームとなります。Photos, Public, はじめに.pdf が初期ファイルとして存在していると思います。

3.monitでdropboxを監視

Dropboxが落ちてはバックアップになりませんのでmonitでdropboxが落ちないように監視します。

/etc/monit/monit.d/dropbox.conf

check process dropboxd with pidfile /path/.dropbox/dropbox.pid
start program = "/path/.dropbox-dist/dropboxd start"
stop  program = "/path/.dropbox-dist/dropboxd stop"

monitのインストール設定は
http://d.hatena.ne.jp/Kmusiclife/20111110/1320936054
を参考にどうぞ。

4.cronでバックアップデータを作成

0   5 * * * tar zcvf /path/Dropbox/backup.tar.gz /backup_path/* > /dev/null 2>&1

などとしてバックアップデータをDropboxに保存です。


Dropboxでは以前のバージョンファイルも参照できるのでバックアップには便利かと思います。便利とセキュリティは天秤です。利用には十分注意が必要です。