tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【Mojolicious】Plack::Middleware::LogFilterを使ってplackupの静的ファイルのログを出さなくする

はじめに

mojoliciousアプリをちょこちょこ触っているのですがアプリケーションサーバPSGI/Plackで起動しています。
静的ファイルはpsgiPlack::Middleware::Staticをenableすることでリバプロ的に配信していますが、
開発中はログがががーーーーーーーと出て非常にみずらいです。

その静的ファイルログをなんとかするメモ。

概要

おもいっきり他力ではありますが、すでに他の方がPlack-Middleware-LogFilterという
Plack::Middlewareを作ってくれているのでありがたく使わせていただきます。

参考にさせていただいたのはこちらです。

やりかた

入れる

自分はplenv x cartonな環境なのでこんな感じで入れました。

$ echo "requires 'Plack-Middleware-LogFilter';" >> cpanfile
$ plenv exec carton install
$ plenv rehash
使う
Plack::Middleware::LogFilterを使う前hoge.psgi

psgiで静的ファイルを配信している想定だったとします。

#!/usr/bin/env perl

use strict;
use warnings;
use lib 'lib';

use Mojo::Server::PSGI;
use Plack::Builder;
use Hoge::Web;

my $psgi = Mojo::Server::PSGI->new( app => Hoge::Web->new );
my $app = $psgi->to_psgi_app;

builder {
    # for local
    enable "Plack::Middleware::Static",  path => qr{^.*(\.jpg|\.jpeg|\.png|\.gif)}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.css}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.js}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.woff}, root => 'public';
    $app;
};
Plack::Middleware::LogFilter使ってみるhoge.psgiのbuilder

builder内でPlack::Middleware::Staticにより
静的ファイルを配信する前の段階でログのfilterを行います。

builder {
    # ログをfilter
    enable 'Plack::Middleware::LogFilter', filter => sub {
        my ($env, $output) = @_;

        # ignore static file log
        if ($output =~ /\/(js|css|img|fonts)/) {
            return 0;
        }
        return 1;
    };

    # for local
    enable "Plack::Middleware::Static",  path => qr{^.*(\.jpg|\.jpeg|\.png|\.gif)}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.css}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.js}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.woff}, root => 'public';
    $app;
};
さらに

自分は何も出てほしくなかったのでさらにこんな感じにしました。

    enable 'Plack::Middleware::LogFilter', filter => sub {
        return 0
    };

まとめ

Plack::Middleware::LogFilterの作者さんに感謝!
これですっきり開発できるよになりました!\(^o^)/

【Mojolicious】plackupからのpsgiでmojoliciousアプリの静的ファイルの場所を変更したい - Plack::Middleware::Static

はじめに

mojoliciousアプリをちょこちょこ触っているのですがアプリケーションサーバPSGI/Plackで起動しています。

本番サーバだったらフロントにいるapacheやnginxのwebサーバ側の
設定で静的ファイルを配信してしまえば良いですよね。

macローカルな開発環境のときはnginxなど使ってない場合も多いですが
同様に静的ファイルはリバプロ的にアプリケーションサーバで捌かないようにしたいものです。
そんなときのメモ。

やりかた

やりかたは簡単です。
psgiのbuilderでPlack::Middleware::Staticを使って静的ファイルを制御します。

こんな感じです。

#!/usr/bin/env perl

use strict;
use warnings;
use lib 'lib';

use Mojo::Server::PSGI;
use Plack::Builder;
use Hoge::Web;

my $psgi = Mojo::Server::PSGI->new( app => Hoge::Web->new );
my $app = $psgi->to_psgi_app;

builder {
    # for local
    enable "Plack::Middleware::Static",  path => qr{^.*(\.jpg|\.jpeg|\.png|\.gif)}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.css}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.js}, root => 'public';
    enable "Plack::Middleware::Static",  path => qr{^.*.woff}, root => 'public';
    $app;
};

mojoliciousは

ちなみに

ちなみに root => 'public' としているので
当然mojoliciousアプリhomeのpath_to_app/publicを参照するのですが、
root指定ができるので静的ファイルのrootを他の場所にすることもできます。

例えば、アプリが複数ある環境であれば、
root => '../other-app/public'; として他のアプリと共用するなんてこともできます。

まとめ

PSGI/Plackいまさらながらに便利!

【Mojolicious】Mojoliciousでconfig的なファイルを扱うメモ - Mojolicious::Plugin::Config

はじめに

タイトル通りですがMojoliciousアプリでConfig的なファイルを扱いたいなーと思ったときのメモです。
Mojolicious::Plugin::Configを使って実現します。

アジェンダ

  1. どんなもの?
  2. Mojolicious::Plugin::Configについて
  3. Mojolicious::Plugin::Configを使う
  4. 開発環境や本番でconfigを分ける
  5. Mojolicious::Plugin::Configを使ったMojoliciousアプリサンプル

1. どんなもの?

Mojoliciousアプリ内においた設定ファイル(今回はjson)ファイルを読み込んで
こんな感じに使えるようにします。

  • Index.pm
package Hoge::Web::Controller::Index;
use Mojo::Base 'Mojolicious::Controller';

# This action will render a template
sub index {
  my $self = shift;

  # configを使う
  my $WEB_CONF = $self->app->config->{WEB};
  my $DB_CONF  = $self->app->config->{DB};
}

2. Mojolicious::Plugin::Configについて

Mojolicious::Plugin::Configについてと言いつつもただリンクするだけにしておきます。
Mojolicious::Plugin::Config自体はmojoliciousをインストールした際にデフォルトでインストールされているらしいです。

3. Mojolicious::Plugin::Configを使う

概要

使うのは簡単で、
適当なディレクトリにファイル名.confのような(拡張子も何でもいい)を作成して
アプリの起動時にルートコントローラで読み込むようにします。

設定ファイルの置き場所

置き場所はどこでもいいのですが、
今回はmojoアプリ/etcというディレクトリを作ってそこに置くようにします。

雛形作成コマンド

下記のmojoコマンドでMojolicousアプリの雛形を作成した前提で話を進めます。

$ carton exec mojo generate app ConfigSample::Web
作成後のディレクトリ

そのときのディレクトリ構造はこんな感じ

$ pwd
/path/to/mojoliciousアプリディレクトリ

$ tree
.
├── lib
│   └── ConfigSample
│       ├── Web
│       │   └── Controller
│       │       └── Example.pm
│       └── Web.pm
├── public
│   └── index.html
├── script
│   └── config_sample_web
├── t
│   └── basic.t
└── templates
    ├── example
    │   └── welcome.html.ep
    └── layouts
        └── default.html.ep
config用ディレクトリとファイルを追加

/etcディレクトリと設定ファイルを作成します。
参考サイトにもなぞらえてますが、今回はetc/db.confetc/web.confという設定ファイルを作ってみました。

$ tree
.
├── etc
│   ├── db.conf
│   └── web.conf
├── lib
├── public
├── script
├── t
└── templates
ファイルの中身

ファイルの中身はそれぞれこんな感じ

  • etc/db.conf
{
    # WEBの設定
    WEB => {
        IMG_DIR => '/img',
        CSS_DIR => '/css',
    },
    ERROR => {
        PAGE => '',
        NO_PAGE_TEXT => 'It is under maintenance.',
    },
    
}
  • etc/web.conf
{
  # DBの設定
  DB => {
    DB_NAME => 'db_name',
    DB_USER => 'db_user_name',
    DB_PASS => 'db_password',
    DB_HOST => 'localhost',
    DB_PORT => '3306',
    MYSQL_SOCKET_PATH  => '/tmp/mysql.sock',
  },
}

読み込んでみる

今回の例でいうと、
script/config_sample_webを起動した際に読み込まれるルートコントローラの lib/ConfigSample/Web.pm`で設定ファイルを読み込みます。

  • lib/ConfigSample/Web.pm
package ConfigSample::Web;
use Mojo::Base 'Mojolicious';
use Path::Class;

# This method will run once at server start
sub startup {
  my $self = shift;

  # configを読み込む
  $self->_load_config()

  # Documentation browser under "/perldoc"
  $self->plugin('PODRenderer');

  # Router
  my $r = $self->routes;

  # Normal route to controller
  $r->get('/')->to('example#welcome');
}

# configを読み込むやつ
sub _load_config {
  my $self = shift;

  my $home = new Path::Class::File(__FILE__);
  my $root = $home->dir->resolve->absolute->parent->parent();
  for my $e ( qw/web db/ ) {
    my $f = $root->stringify . '/etc/' . $e . '.conf';

    # Mojolicious::Plugin::Configを使ってconfigを読み込んでいる場所
    $self->plugin( 'Config', { 'file' => $f } );
  }
}

すると各コントローラで$self->appを通してconfigが使えるようになります。

my $WEB_CONF = $self->app->config->{WEB};
my $DB_CONF  = $self->app->config->{DB};

warn $WEB_CONF->{IMG_DIR}; # '/img'

4. 開発環境や本番でconfigを分ける

これは自分がお手軽にやってるだけのあくまでも一例です。

MOJO_MODE

MojoliciousにはMOJO_MODEという環境変数が使えるのでそれを利用します。
アプリケーションの中ではこんな感じで取得します。

$self->app->mode;

環境変数を何も指定してない場合のデフォルトはdevelopmentという文字列が設定されています。

これをmorboなりplackupなりで起動する際に
MOJO_MODEを指定してあげることで開発環境と本番環境を分けてみます。

本番環境ではこんな感じで起動してあげることでMOJO_MODEがproductionになります。

$ MOJO_MODE=production morbo script/myapp

環境ごとに設定ファイルを分けてみる

ってことで、etcディレクトリ以下のファイル名をこんな感じで用意します。

設定ファイル
  • etc/web_dev.conf
  • etc/web_prd.conf
  • etc/db_dev.conf
  • etc/db_prd.conf
読み込み

ルートコントローラでの読み込みをこんな感じに変えます。

~ 省略 ~
# configを読み込むやつ

sub _load_config {
  my $self = shift;
  my $home = new Path::Class::File(__FILE__);
  my $root = $home->dir->resolve->absolute->parent->parent();

  # 環境によってsuffixを分ける
  my $suffix = $self->mode eq 'production' ? '_prd' : '_dev';
  for my $e ( qw/web db/ ) {
    my $f = $root->stringify . '/etc/' . $e . $suffix . '.conf';
    $self->plugin( 'Config', { 'file' => $f } );
  }
}

5. Mojolicious::Plugin::Configを使ったMojoliciousアプリサンプル

今回と同じ構成のMojoliciousアプリのサンプルをgithubにおいてあります。
README.mdに使い方も載せてあるのでよかったらどーぞ。

まとめ

ってことでMojoliciousアプリでのconfigの使い方でした。
Mojoはいろいろ用意ががいいので使い勝手がいいです!

rsyncで`No space left on device`でと表示されるエラーの対処方

はじめに

タイトルのままですがrsyncするとこんなエラーが出ました。

hoge@hoge:~/home/hoge> rsync -az --stats -e ssh /hoge_file fuga:/hoge/fuga/piyo/hoge.csv 2>&1
rsync: write failed on "/hoge/fuga/piyo/hoge.csv": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(253) [receiver=2.6.8]
rsync: connection unexpectedly closed (71 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(463) [generator=2.6.8]
rsync: connection unexpectedly closed (34 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(463) [sender=2.6.8]

そのときの原因と対処法

原因

原因は簡単でdiscがいっぱいのときに起こるようです。
No spaceと書いてありますしね。

対処法

dfやduコマンドなどでdiscを使ってるディレクトリ(ファイル)を調べて消すか容量を増やしましょう。

源ノ角ゴシック(Noto Sans | Source Han Sans)をWebフォントに使ってみるメモ

はじめに

源ノ角ゴシック(Noto SansまたはSource Han Sans)と呼ばれるフォントがあり、これをwebフォントとして使ってみるまでのメモです。

呼び方はいくつかありますが、今回は日本語の源ノ角ゴシックであるNoto Sans CJK JPとしてwebフォントを作成します。  

また文末にも載せましたが、下記ができたwebフォントになります。githubにあげてみました。
https://github.com/tweeeety/font-noto-sans

アジェンダ

  1. 源ノ角ゴシックとは
  2. 源ノ角ゴシックのダウンロード
  3. 源ノ角ゴシックをサブセット化する
  4. 源ノ角ゴシックをWebフォントに変換(woffコンバート)
  5. 源ノ角ゴシックをcssで指定する
  6. 源ノ角ゴシックのサブセット化、webフォント化したものを置いてみる

1. 源ノ角ゴシックとは

参考サイトのまんま引用いただきますが、こんな感じです。

「源ノ角ゴシック(Source Han Sans)」は、AdobeGoogleが共同で開発したするフォントです。オープンソースとして公開され、フリーフォントとして利用できます。Source Han Sansの日本語名が「源ノ角ゴシック」です。

2. 源ノ角ゴシックのダウンロード

参考サイトの通りに下記からダウンロードします。
ダウンロードするファイルはNoto Sans CJK JPというファイル名のものです。 http://www.google.com/get/noto/#/family/noto-sans-jpan

CJKとは

こちらも参考サイトのまんま引用です

日本語・韓国語・中国語をまとめた呼び方。一般的な言語と比べ突出して文字数の多いこれらの3言語は 文化的にも技術的にも取り扱いが難しく、他言語とは一線を画して扱われています。

参考サイト
Noto Sans (源の角ゴシック) をWebフォントで使えるように軽量化する方法

ダウンロードファイルについて

NotoSansCJKjp-hinted.zipというファイル名でダウンロードされました。
解凍すると中身はこんな感じになっています。

$ tree NotoSansCJKjp-hinted
NotoSansCJKjp-hinted
├── LICENSE_OFL.txt
├── NotoSansCJKjp-Black.otf
├── NotoSansCJKjp-Bold.otf
├── NotoSansCJKjp-DemiLight.otf
├── NotoSansCJKjp-Light.otf
├── NotoSansCJKjp-Medium.otf
├── NotoSansCJKjp-Regular.otf
├── NotoSansCJKjp-Thin.otf
├── NotoSansMonoCJKjp-Bold.otf
└── NotoSansMonoCJKjp-Regular.otf

3. 源ノ角ゴシックをサブセット化する

ダウンロード後のファイルサイズはこんな感じでした。

$ du -sh ./*
142M    ./NotoSansCJKjp-hinted
115M    ./NotoSansCJKjp-hinted.zip

Webフォントとして使うにしても、これを読み込むだけでだいぶ時間がかかってしまうので軽量化します。
それをサブセット化というらしいです。
具体的には、よく使用する文字のみを抜き出して新しいフォントファイルとして作成しなおします。

ということで下記を行います

  • サブセットフォントメーカー入れる
  • サブセットフォントメーカーを起動して1ファイルずつサブセット化
サブセットフォントメーカー入れる

自分はmacなので下記リンクからmac用をダウンロードしました。
http://opentype.jp/subsetfontmk.htm

subsetfontmac220.pkgファイルがダウンロードされるのでインストールします。
アプリケーションディレクトリにサブセットフォントメーカー.appという名前でインストールされるので起動します。

サブセットフォントメーカーを起動して1ファイルずつサブセット化

立ち上げるとこんな感じです。
f:id:tweeeety:20151018044008p:plain

①〜③を入力して、④の作成開始で1ファイル完了です。
各項目はこんな感じです。

    • ダウンロードしたディレクトリ内の1ファイルを指定します。たとえばNotoSansCJKjp-Light.otfとか。
    • 作成後のフォントファイル名を入力します。拡張子はあってもなくても.otfになるようです。
    • アスキー文字、非漢字文字、第1水準漢字をコピペします。これは後述します。
アスキー文字、非漢字文字、第1水準漢字

③でアスキー文字、非漢字文字、第1水準漢字とありますが、それぞれ貼っておきます。

  • アスキー文字

    !”#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿

  • 非漢字文字

    、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\〜∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨¬⇒⇔∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ʼn♯♭♪†‡¶◯0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂

  • 第1水準漢字

    亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕

これはこちらを参考にさせていただきました。
Noto Sans CJK JP フォントをダウンロードしてサイトに適用する手順

自分はこの3つをコピペしたのみのCharacter.txtというファイルを作ってサブセットフォントメーカーの③番目で参照しました。

変換後

変換後ファイル用のディレクトリをNotoSansCJKjp-hinted_subsetとかで作りました。   ここに1つ1つファイルを変換していくので多少面倒ですが、サブセット化ごのファイルサイズはこんな感じでした。

$ du -h ./*
 12K    ./Character.txt
142M    ./NotoSansCJKjp-hinted
115M    ./NotoSansCJKjp-hinted.zip
6.1M    ./NotoSansCJKjp-hinted_subset

$ ls -lh NotoSansCJKjp-hinted_subset
total 12520
-rw-r--r--  1 hoge  hoge   701K 10 18 03:09 NotoSansCJKjp-Black.otf
-rw-r--r--  1 hoge  hoge   694K 10 18 03:09 NotoSansCJKjp-Bold.otf
-rw-r--r--  1 hoge  hoge   692K 10 18 03:11 NotoSansCJKjp-DemiLight.otf
-rw-r--r--  1 hoge  hoge   696K 10 18 03:11 NotoSansCJKjp-Light.otf
-rw-r--r--  1 hoge  hoge   688K 10 18 03:12 NotoSansCJKjp-Medium.otf
-rw-r--r--  1 hoge  hoge   691K 10 18 03:14 NotoSansCJKjp-Regular.otf
-rw-r--r--  1 hoge  hoge   700K 10 18 03:14 NotoSansCJKjp-Thin.otf
-rw-r--r--  1 hoge  hoge   694K 10 18 03:15 NotoSansMonoCJKjp-Bold.otf
-rw-r--r--  1 hoge  hoge   690K 10 18 03:15 NotoSansMonoCJKjp-Regular.otf

4. 源ノ角ゴシックをWebフォントに変換(woffコンバート)

次に、ファイル形式がotfままではwebフォントとして使えないので変換します。
変換は下記のように行うらしいです。

  1. .otfを変換
    • .woffと.eotに変換
      • .eot : IE6〜IE8 + IE9互換モード用
      • .woff : .eotと.ttf以外用
  2. .woffを変換
    • .ttfに変換

ってことで、下記の順番で行います。

  • WOFFコンバータ入れる
  • WOFFコンバータを起動して1ファイルずつ変換
WOFFコンバータ入れる

下記リンクからmac用をダウンロードします。
http://opentype.jp/woffconv.htm

woffconvmac220.pkgファイルがダウンロードされるのでインストールします。
アプリケーションディレクトリにWOFFコンバータ.appという名前でインストールされるので起動します。

WOFFコンバータを起動して1ファイルずつ変換

立ち上げるとこんな感じです。
f:id:tweeeety:20151018044024p:plain

①〜③を入力して、④の作成開始で1ファイル完了です。
各項目はこんな感じです。

    • サブセット化した1ファイルを指定します。たとえばNotoSansCJKjp-Light.otfとか。
    • 作成後のフォントファイル名を入力します。otfからwoff、eotに変換するときは拡張子なし、woffからttfのときは拡張子ありでやるとよさそうです。
    • otfからwoff、eotに変換するときのみチェックします
変換後

変換後ファイル用のディレクトリをNotoSansCJKjp-hinted_convertedとかで作りました。   変換後のファイルはこんな感じです

$ tree .
.
├── Character.txt
├── NotoSansCJKjp-hinted
│   ├── LICENSE_OFL.txt
│   ├── NotoSansCJKjp-Black.otf
│   ├── NotoSansCJKjp-Bold.otf
│   ├── NotoSansCJKjp-DemiLight.otf
│   ├── NotoSansCJKjp-Light.otf
│   ├── NotoSansCJKjp-Medium.otf
│   ├── NotoSansCJKjp-Regular.otf
│   ├── NotoSansCJKjp-Thin.otf
│   ├── NotoSansMonoCJKjp-Bold.otf
│   └── NotoSansMonoCJKjp-Regular.otf
├── NotoSansCJKjp-hinted.zip
├── NotoSansCJKjp-hinted_converted
│   ├── NotoSansCJKjp-Black.eot
│   ├── NotoSansCJKjp-Black.ttf
│   ├── NotoSansCJKjp-Black.woff
│   ├── NotoSansCJKjp-Bold.eot
│   ├── NotoSansCJKjp-Bold.ttf
│   ├── NotoSansCJKjp-Bold.woff
│   ├── NotoSansCJKjp-DemiLight.eot
│   ├── NotoSansCJKjp-DemiLight.ttf
│   ├── NotoSansCJKjp-DemiLight.woff
│   ├── NotoSansCJKjp-Light.eot
│   ├── NotoSansCJKjp-Light.ttf
│   ├── NotoSansCJKjp-Light.woff
│   ├── NotoSansCJKjp-Medium.eot
│   ├── NotoSansCJKjp-Medium.ttf
│   ├── NotoSansCJKjp-Medium.woff
│   ├── NotoSansCJKjp-Regular.eot
│   ├── NotoSansCJKjp-Regular.ttf
│   ├── NotoSansCJKjp-Regular.woff
│   ├── NotoSansCJKjp-Thin.eot
│   ├── NotoSansCJKjp-Thin.ttf
│   ├── NotoSansCJKjp-Thin.woff
│   ├── NotoSansMonoCJKjp-Bold.eot
│   ├── NotoSansMonoCJKjp-Bold.ttf
│   ├── NotoSansMonoCJKjp-Bold.woff
│   ├── NotoSansMonoCJKjp-Regular.eot
│   ├── NotoSansMonoCJKjp-Regular.ttf
│   └── NotoSansMonoCJKjp-Regular.woff
└── NotoSansCJKjp-hinted_subset
    ├── NotoSansCJKjp-Black.otf
    ├── NotoSansCJKjp-Bold.otf
    ├── NotoSansCJKjp-DemiLight.otf
    ├── NotoSansCJKjp-Light.otf
    ├── NotoSansCJKjp-Medium.otf
    ├── NotoSansCJKjp-Regular.otf
    ├── NotoSansCJKjp-Thin.otf
    ├── NotoSansMonoCJKjp-Bold.otf
    └── NotoSansMonoCJKjp-Regular.otf

5. 源ノ角ゴシックをcssで指定する

cssで指定する際は@font-faceで指定します。
まんま下記サイトを参考にさせていただきました!thx!

@font-face {
    font-family: 'Noto Sans Japanese';
    font-style: normal;
    font-weight: 100;
    src: url('../font/NotoSansCJKjp-Thin.eot'); /* IE9 Compat Modes */
    src: url('../font/NotoSansCJKjp-Thin.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
    url('../font/NotoSansCJKjp-Thin.woff') format('woff'), /* Modern Browsers */
    url('../font/NotoSansCJKjp-Thin.ttf')  format('truetype'); /* Safari, Android, iOS */
}

@font-face {
    font-family: 'Noto Sans Japanese';
    font-style: normal;
    font-weight: 200;
    src: url('../font/NotoSansCJKjp-Light.eot');
    src: url('../font/NotoSansCJKjp-Light.eot?#iefix') format('embedded-opentype'),
    url('../font/NotoSansCJKjp-Light.woff') format('woff'),
    url('../font/NotoSansCJKjp-Light.ttf')  format('truetype');
}
@font-face {
    font-family: 'Noto Sans Japanese';
    font-style: normal;
    font-weight: 300;
    src: url('../font/NotoSansCJKjp-DemiLight.eot');
    src: url('../font/NotoSansCJKjp-DemiLight.eot?#iefix') format('embedded-opentype'),
    url('../font/NotoSansCJKjp-DemiLight.woff') format('woff'),
    url('../font/NotoSansCJKjp-DemiLight.ttf')  format('truetype');
}
@font-face {
    font-family: 'Noto Sans Japanese';
    font-style: normal;
    font-weight: 400;
    src: url('../font/NotoSansCJKjp-Regular.eot');
    src: url('../font/NotoSansCJKjp-Regular.eot?#iefix') format('embedded-opentype'),
    url('../font/NotoSansCJKjp-Regular.woff') format('woff'),
    url('../font/NotoSansCJKjp-Regular.ttf')  format('truetype');
}
@font-face {
    font-family: 'Noto Sans Japanese';
    font-style: normal;
    font-weight: 500;
    src: url('../font/NotoSansCJKjp-Medium.eot');
    src: url('../font/NotoSansCJKjp-Medium.eot?#iefix') format('embedded-opentype'),
    url('../font/NotoSansCJKjp-Medium.woff') format('woff'),
    url('../font/NotoSansCJKjp-Medium.ttf')  format('truetype');
}
@font-face {
    font-family: 'Noto Sans Japanese';
    font-style: normal;
    font-weight: 700;
    src: url('../font/NotoSansCJKjp-Bold.eot');
    src: url('../font/NotoSansCJKjp-Bold.eot?#iefix') format('embedded-opentype'),
    url('../font/NotoSansCJKjp-Bold.woff') format('woff'),
    url('../font/NotoSansCJKjp-Bold.ttf')  format('truetype');
}
@font-face {
    font-family: 'Noto Sans Japanese';
    font-style: normal;
    font-weight: 900;
    src: url('../font/NotoSansCJKjp-Black.eot');
    src: url('../font/NotoSansCJKjp-Black.eot?#iefix') format('embedded-opentype'),
    url('../font/NotoSansCJKjp-Black.woff') format('woff'),
    url('../font/NotoSansCJKjp-Black.ttf')  format('truetype');
}

6. 源ノ角ゴシックのサブセット化、webフォント化したものを置いてみる

結構手間のかかる作業ですが、これらをgithubにあげました。(あげて問題ない?)
* https://github.com/tweeeety/font-noto-sans

まとめ

結構手間のかかる作業ですがこだわりのフォントを使いたいときはこういう作業も必要ですね!enjoy!

【Mojolicious】Mojoliciousアプリをgenerateして雛形生成するメモ - おまけでplenv x carton x plackup

はじめに

mojoliciousでアプリの雛形を生成するときのメモです。
ゆーすけべーさんのブログをかなり参考にさせていただきました。
PerlのWAFはMojolicious推しな件とそのノウハウAdd

あじぇんだ

  1. mojoliciousいれる
  2. Mojolicious::Liteのアプリの雛形を生成する
  3. Mojoliciousアプリの雛形を生成する
  4. plenv x carton x Mojolicious x plackupでサラっとおさらい

1. mojoliciousいれる

cpanmなんかが入ってれば打つだけですね。

$ cpanm Mojolicious

2. Mojolicious::Liteのアプリの雛形を生成する

Mjolicoius::Liteはお試しで何か作ってみたい場合なんかは重宝しますね。

生成してみる

生成すると1ファイルで完結したアプリが生成されます。

$ cd アプリを置きたいディレクトリ

$ mojo generate lite_app hoge.pl

$ ls -l
-rwxr--r--  1 hoge  1522739515  545  8  9 15:45 hoge.pl
どんなのができるか
#!/usr/bin/env perl
use Mojolicious::Lite;

# Documentation browser under "/perldoc"
plugin 'PODRenderer';

get '/' => sub {
  my $c = shift;
  $c->render(template => 'index');
};

app->start;
__DATA__

@@ index.html.ep
% layout 'default';
% title 'Welcome';
<h1>Welcome to the Mojolicious real-time web framework!</h1>
To learn more, you can browse through the documentation
<%= link_to 'here' => '/perldoc' %>.

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body><%= content %></body>
</html>
起動してみる

生成したままmorboコマンドで起動できるのでお手軽!

$ morbo hoge.pl 
Server available at http://127.0.0.1:3000

3. Mojoliciousアプリの雛形を生成する

ある程度のアプリを作成する予定ならMjolicoiusアプリの方を生成します。

まずは普通に

冒頭に参考としてのせたゆーすけべー先生のアプリ構成で生成するのがオススメですが
まずは普通に生成してみます。

生成してみる
$ cd アプリを置きたいディレクトリ

$ mojo generate app Hoge

$ ls -l
drwxr-xr-x   8 hoge  1522739515   272  8  8 19:14 hoge
どんなのができるか

Mjolicoius::Liteと違い、1ファイルではなくフレームワークっぽい構成で生成してくれます。

$ tree ./hoge
./hoge
├── lib
│   ├── Hoge
│   │   └── Controller
│   │       └── Example.pm
│   └── Hoge.pm
├── log
├── public
│   └── index.html
├── script
│   └── hoge
├── t
│   └── basic.t
└── templates
    ├── example
    │   └── welcome.html.ep
    └── layouts
        └── default.html.ep
起動してみる

こちらもmorboコマンドで起動を確認できます。
一見、何を起動するのかわかりずらいですが、上記の構成でいうと./hoge/script/hogeが起動ファイルになっています。

# hogeの一個上の改装からだと
# Can't find application class "Hoge" in @INC
# とclassへのパスが見えないので注意
$ cd ./hoge

$ morbo script/hoge 
Server available at http://127.0.0.1:3000

ブラウザでアクセスしてこんな感じに表示されると思います。

フォルダ構成を工夫する

こちらがゆーすけべー先生のアプリ構成ですね。
非常にいいです。

生成してみる
$ cd アプリを置きたいディレクトリ

# ::Webをつける
$ mojo generate app Fuga::Web

$ ls -l
drwxr-xr-x   8 hoge  1522739515   272  8  9 16:03 fuga_web
どんなのができるか

上記のふつうに生成した場合と見比べてみるとわかりやすいですが、
アプリ名::Webと指定して生成すると./アプリ名_web/lib/アプリ名/Webな感じにディレクトリを切ってくれます。

こうすることで例えばDB系のモジュールを作成する際は
./アプリ名_web/lib/アプリ名/DBのように後からディレクトリを切りやすくなりますね。

tree ./fuga_web/
./fuga_web/
├── lib
│   └── Fuga
│       ├── Web
│       │   └── Controller
│       │       └── Example.pm
│       └── Web.pm
├── log
├── public
│   └── index.html
├── script
│   └── fuga_web
├── t
│   └── basic.t
└── templates
    ├── example
    │   └── welcome.html.ep
    └── layouts
        └── default.html.ep
起動してみる

plackupでの起動もOKです。

$ plackup -p 3000 ./script/fuga_web
HTTP::Server::PSGI: Accepting connections at http://0:3000/

4. plenv x carton x Mojolicious x plackupでサラっとおさらい

plenvやcartonの詳細は書きませんが
plenvからcpanm、cartonからmojoliciousを使いたいときもあるかと思います。

ここまでの流れをplenvでperl 5.18.4入れるところからサラっと書いておさらいします

# plenvでperl5.18.4をインストール
$ plenv install 5.18.4
$ plenv local 5.18.4

# plenv経由でcpanmインストール
$ plenv install-cpanm

# plenv経由でcartonインストール
$ plenv exec cpanm Module::Install
$ plenv exec cpanm Carton

# cpanfile作る&Plackインストール
$ echo "requires 'Task::Plack';" > cpanfile
$ plenv exec carton install

# 念のためrehash
$ plenv rehash

# plackup立ち上げる(アプリがないので怒られるがplackupが動いてればok)
$ carton exec plackup

# cpanfileに追記してMojoliciousのインストール
$ echo "requires 'Mojolicious';" >> cpanfile
$ plenv exec carton install

# mojoliciousアプリのgenerate
$ carton exec mojo generate app Hoge::Web

# mojoliciousアプリの起動
$ carton exec plackup -p 3000 ./script/hoge_web 

こう見ると結構サラっといけますね。

補足

perlbrew、plenv、cartonあたりを入れてみたい場合は下記も参考にしてみてください。

まとめ

mojoliciousはわかりやすくてサラっと入れられるしいろいろ便利です。
Mjolicoius::Liteを使えばさらにライトなのでmock作成するときなんかもサラっといけますね!

【vsftpd】さくらvpsにftpサーバ(vsftpd)を立ててFileZillから接続してみる

はじめに

AWSやさくらvpsなどのレンタルサーバで自分らのサービスを作りたいとき、
デプロイ or アップロードなどは困るときありますよね。
特に画像なんかはエンジニア以外も上げるときが多いかと思います。

そんなときはいっそのことftpサーバを立てちゃうのはひとつの手です。
ということで今回はvsftpdを使ってftpサーバを立ててfptクライアントのFileZillaから接続してみるまでのメモ。

FileZillamacでもwindowsでも使えるのでいいですね。

アジェンダ

  1. ftpサーバ(vsftpd)入れる
  2. ftpサーバ(vsftpd)の設定する
  3. ftp用ポートを解放する(iptables)
  4. FileZillaftpにつないでみる

1. ftpサーバ(vsftpd)入れる

yumを使ってinstallするだけです。サクっとやっちゃいましょう

# お決まりのupdateをしてから
$ sudo yum update

# vsftpdのインストール
$ sudo yum -y install vsftpd

# もし消すときはremoveで
$ sudo yum -y remove vsftpd

# 念のため起動してみる
$ sudo /etc/rc.d/init.d/vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]

2. ftpサーバ(vsftpd)の設定する

ftpサーバ(vsftpd)の設定をします。

  • vsftpdの自動起動の設定
  • vsftpdの設定ファイルの編集
  • vsftpdの設定ファイルで指定したファイルを作成
  • ftpするユーザごとのログイン時ディレクトリを設定する
  • vsftpdのリスタート(設定の反映)

vsftpdの自動起動の設定

fptに限らずよくやることなのでさらっとやりましょう

# 自動起動設定する前に念のため確認
$ sudo chkconfig --list vsftpd
vsftpd          0:off   1:off   2:off   3:off   4:off   5:off   6:off

# 自動起動設定
$ sudo chkconfig vsftpd on

# 再度確認
$ sudo chkconfig --list vsftpd
vsftpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off

vsftpdの設定ファイルの編集

こちらもそこまで大変ではないので、サクっとやっちゃいましょう。
設定内容はこちらを参考にさせていただきました!thx!

# 念のためデフォルトの設定ファイルをバックアップ
$ sudo cp -ap /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bk.20151011

# 設定ファイル編集
$ sudo vi /etc/vsftpd/vsftpd.conf
---- vi 編集 ----
# 匿名アクセスの禁止
anonymous_enable=YES
↓
anonymous_enable=NO

# グループ書き込み可能になるように002に変更
# つまり、書き込み時のパーミッションを022(=644)から002(664)に変更する
local_umask=022
↓
local_umask=002

# アスキーモードを有効にする
# 改行コードを環境に合わせて変換してくれます
#ascii_upload_enable=YES
#ascii_download_enable=YES
↓
ascii_upload_enable=YES
ascii_download_enable=YES

# コメントアウトされているため接続時にバージョン情報がさらけだされるため隠す
#ftpd_banner=Welcome to blah FTP service.
↓
ftpd_banner=Welcome to blah FTP service.

# ログインディレクトリの外側にアクセスできるユーザを設定
#chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
↓
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

# サブフォルダを含む一括アップロード・ダウンロードを許可
#ls_recurse_enable=YES
↓
ls_recurse_enable=YES

# 
# 以下、ファイル末尾に追加する項目。編集する項目じゃないのでコピペでいいですね
# 

# /etc/vsftpd/user_listのユーザーだけを許可
userlist_deny=NO

# タイムスタンプ時間をローカル時間にする
use_localtime=YES

# PASVのポート範囲を設定
listen_port=50000
pasv_enable=YES
pasv_min_port=50001
pasv_max_port=50020

# ユーザーのログイン時ディレクトリの指定
# local_rootを書かないとホームディレクトリ
# しかし、これはftpするユーザごとの設定ではない。
# ユーザごとに設定したいので、この行は追加せずにやり方は後述します。
# 「ftpするユーザごとのログイン時ディレクトリを設定する」の項目を参照してください
# local_root=/var/www/html

-----------------

補足

補足としてパラメータについて参考サイトのリンクも載せておきます

lcoal_umask

ファイルのパーミッションであるumask(lcoal_umask)についてはこちらを見ると分かりやすいと思います。

ascii_upload_enable/ascii_download_enable

cgiやプログラムをあげる際は、改行コードを変更してくれるアスキーモードで転送したいですよね。
vsftpdはデフォルトではbinaryモードでの転送になっているようです。

ftpd_banner
chroot_local_user/chroot_list_enable/chroot_list_file

これは用途によってなんですが軽く補足。
内容の説明というよりは、用途のパターンとそのときの設定例を書いておきます。

  • fptするユーザがログイン時に見れるディレクトリ以外へのアクセスを制限したいとき
    • chroot_local_user=YES
    • #chroot_list_enable=YES(コメントのまま)
    • #chroot_list_file=/etc/vsftpd/chroot_list(コメントのまま)
  • fptするユーザをいくつか用意してログイン時のディレクトリ以外も見れるようにしたいとき
    • #chroot_local_user=YES(コメントのまま)
    • chroot_list_enable=YES
    • chroot_list_file=/etc/vsftpd/chroot_list(このファイルにユーザを追加する)

こちらが非常に参考になります

userlist_deny

userlist_enable=YESの場合のみ有効な項目。
userlist_deny=NOでユーザーリストファイルに記述したユーザーのみFTPサーバーにログイン可能になる。

use_localtime

デフォルトでGMTなのをlocaltimeを使用する。
chrootされたユーザ(ログインディレクトリから外を見れないユーザ)は/etc/localtimeが見れないためにおかしくなることがあるらしい。

listen_port/pasv_enable/pasv_min_port/pasv_max_port

pasv_enableはデフォルトでYESなので設定しなくても同じですね。
自分は明示的に指定したいので入れてます。
下記が詳しいです

vsftpdの設定ファイルで指定したファイルを作成

ユーザに関しては下記の流れで行います

  • fptするユーザを作成する
  • ftpするユーザを/etc/vsftpd/user_listに追加する
  • /etc/vsftpd/chroot_listを作成してユーザを追加する
  • vsftpdのリスタート(設定の反映)
fptするユーザを作成する
# ユーザの作成
$ sudo adduser --shell /sbin/nologin --home /var/www ftpuser

sudo adduser --shell /sbin/nologin ftpuser

# 作成したユーザのパスワードを設定する
$ sudo passwd ftpuser
ftpするユーザを/etc/vsftpd/user_listに追加する

/etc/vsftpd/user_listというファイルにユーザを追記します。

# ファイルにftpuserを追加
$ sudo vi /etc/vsftpd/user_list
/etc/vsftpd/chroot_listを作成してユーザを追加する

これはファイルのみ作成して中身はカラでも良いです。
追加したユーザはログイン時ディレクトリの外に出れるようになるので、
制限したい場合は追加しないほうが良いです。

# /etc/vsftpd/chroot_listを作成してftpuserを追加
$ sudo vi /etc/vsftpd/chroot_list

ftpするユーザごとのログイン時ディレクトリを設定する

ftpするユーザごとにディレクトリを指定するには、
ユーザごとのlocal_rootを記載した設定ファイルを作成して
その設定ファイルの場所を/etc/vsftpd/vsftpd.confに記載してやります。

# ユーザごとの設定ファイルをおくディレクトリを作成する
$ sudo mkdir /etc/vsftpd/vsftpd_user_conf

# ユーザごとのファイルを作成する
# ファイル名はユーザ名と同じ
# 中身にそのユーザのアクセス可能なパスを書く
$ vi /etc/vsftpd/vsftpd_user_conf/ftpuser
---- vi作成 ----
local_root=/var/www/html/ftpuser/img
----------------

# /etc/vsftpd/vsftpd.confにユーザごとの設定ファイルを読み込む設定を追加
$ sudo vi /etc/vsftpd/vsftpd.conf
---- vi追記 ----
user_config_dir=/etc/vsftpd/vsftpd_user_conf
----------------

vsftpdのリスタート(設定の反映)

# リスタート
$ sudo /etc/rc.d/init.d/vsftpd restart

3. ftp用ポートを解放する(iptables)

/etc/vsftpd/vsftpd.confで設定したポートを解放してあげます。

# iptablesを編集
$ sudo vi /etc/sysconfig/iptables
---- vi追記 ----
# FTP
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50000  -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50001:50020  -j ACCEPT
----------------

# 再起動
$ sudo /etc/init.d/iptables restart
補足

iptablesについてはこちらを参考にしてみてください

4. FileZillaftpにつないでみる

さっそくFileZillaから接続してみます。
まだダウンロードしていない場合は下記リンクからダウンロードしてインストールまで行います。
https://filezilla-project.org/

FileZilla.appを開くとこのような画面が出ます。 f:id:tweeeety:20151011171804p:plain

それぞれ入力してQuickconnectボタンで接続します。

  • Host
  • Username
    • ftpするユーザ名。今回の例ではftpuser
  • Password
    • 作成したユーザのパスワード。今回の例ではsudo passwd ftpuserしたときのパスワード
  • Port
    • 接続するポート。今回の例ではlisten_port=50000で指定した50000

接続されると画面上部に接続したログが、右側に接続先のディレクトリの中身が表示されます。 f:id:tweeeety:20151011171813p:plain

まとめ

サクっと書こうと思ったら予想以上に長い記事になってしまいました^^;
セキュアさは弱いイメージのftpですが、ライトにアップロードしたい場合なんかには役立ちますね!
enjoy!