tweeeetyのぶろぐ的めも

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

ファイルの先頭にハイフン(-)がつくファイルをrmコマンドで削除するには?メモ - オプションと勘違いされて"illegal option"と言われてしまう

はじめに

よく考えたらすごく初歩的なのですが一瞬戸惑ったのでメモ

事象

タイトルのとおりですが、バッチやスクリプトなどでファイル名の作成をミスって
誤って先頭にハイフンがついたファイルを作成してしまうことはあるはあると思います。
そんなときに普通にrmで消そうと思うとこうなります

# 擬似的にハイフン(-)つきファイルができてしまったていを作る
$ echo 'test' > -file

# 確認
# ls -l
-rw-r--r--   1 hoge  hoge        5  1 15 22:45 -file


# 消そうとしてもオプションと感慨されて消せない
$ rm -file
rm: illegal option -- l
usage: rm [-f | -i] [-dPRrvW] file ...
       unlink file

対処法

対処方法は2つあります

  1. ディレクトリまで指定する
  2. 連続ハイフン(--)を使用する
1. ディレクトリまで指定する

こちらは簡単ですね。

$ rm ./-file
2. 連続ハイフン(--)を使用する

メモりたかったのはどちらかというとこの方法について。

下記リンクを参考にさせて頂きましたが、
コマンドの途中に--(2つ連続するハイフンのみ)を指定するとそれ以降の指定はパラメータとして認識されなくなります。
* UNIX Q&A集

これを利用してファイル名の前に--をつけることでそれ以降がパラメータではなくファイル名として扱われます。

$ rm -- -file

まとめ

こんな些細なことでも突然起こるとぱっと出てこないもんですよねーというメモでした!

【git】git checkoutで"fatal: unable to write new index file"というエラーが出るときの対処法メモ

はじめに

タイトルの通りですがgitでcheckoutしようと思ったらこんなエラーが出た

$ git checkout ブランチ名
fatal: unable to write new index file

そんな時の対処法

原因

すごく調べたわけじゃないですが、そのままエラーメッセージでぐぐったら同様の事象が出てきました。
どうやらディスク容量がいっぱいだと出るらしいですがまさかこの前まで空いてたのにねぇ。。。と思いながら見てみる

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1              30G   29G  4.0K 100% /
tmpfs                 1.5G     0  1.5G   0% /dev/shm

いっぱい!いっぱいっていうか100%!
ということでduあたりでどのディレクトリがいっぱいか調べたら少し前に動かしていたスクリプトが永遠とログを吐き続けているためでした...orz

対処法

対処法はもうまんまですがディスク容量を開けることですね。

【perl】DBI::mysqlでmysqlに接続すると`[error] install_driver(mysql) failed: Can't load '/home/hogeperl5/perlbrew/perls/perl-5.18.4/lib/site_perl/5.18.4/x86_64-linux/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.16`と表示されるやーつの対応

はじめに

perlbrew x cpanm x あとはいろいろな構成でアプリを作っていたのですが、 DBD::mysqlperl->mysql接続しようとするとこんなエラーが出ることがあります。

[Mon Oct 12 20:16:59 2015] [error] install_driver(mysql) failed: Can't load '/home/hogeperl5/perlbrew/perls/perl-5.18.4/lib/site_perl/5.18.4/x86_64-linux/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.16: cannot open shared object file: No such file or directory at /home/hogeperl5/perlbrew/perls/perl-5.18.4/lib/5.18.4/x86_64-linux/DynaLoader.pm line 190, line 309. at (eval 96) line 3. Compilation failed in require at (eval 96) line 3. Perhaps a required shared library or dll isn't installed where expected at lib/hogeModule/Information.pm line 26.

そんなときの対処方

対処

対処方法はこちらを参考にさせていたきました。
http://unix.stackexchange.com/questions/82076/error-while-installing-perl-dbd-mysql

どうやらlibmysqlclient.so.16がないっぽかったのですが、locateすると出てきたのでいまいちよくわかっていません。

# locateしてみるとあるっぽい
$ locate libmysqlclient.so.16
/usr/lib64/mysql/libmysqlclient.so.16
/usr/lib64/mysql/libmysqlclient.so.16.0.0

# しかし該当ディレクトリをlsすると見当たらない
$ ls -al /usr/lib64/mysql/
-rw-r--r--   1 root root 17419410 Sep 19 00:22 libmysqlclient.a
lrwxrwxrwx   1 root root       20 Oct 12 20:15 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx   1 root root       24 Oct 12 20:15 libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
-rwxr-xr-x   1 root root  7810465 Sep 19 00:22 libmysqlclient.so.18.0.0
lrwxrwxrwx   1 root root       16 Oct 12 20:15 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx   1 root root       17 Oct 12 20:15 libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx   1 root root       20 Oct 12 20:15 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx   1 root root       24 Oct 12 20:15 libmysqlclient_r.so.18.0.0 -> libmysqlclient.so.18.0.0

# とりあえず対処
$ sudo yum install perl-DBD-MySQL.x86_64

# lsで確認
$ ls -al /usr/lib64/mysql/
-rw-r--r--   1 root root 17419410 Sep 19 00:22 libmysqlclient.a
lrwxrwxrwx   1 root root       20 Oct 12 20:15 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx   1 root root       24 Oct 12 20:30 libmysqlclient.so.16 -> libmysqlclient.so.16.0.0
-rwxr-xr-x   1 root root  2788228 Sep 19 00:23 libmysqlclient.so.16.0.0
lrwxrwxrwx   1 root root       24 Oct 12 20:15 libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
-rwxr-xr-x   1 root root  7810465 Sep 19 00:22 libmysqlclient.so.18.0.0
lrwxrwxrwx   1 root root       16 Oct 12 20:15 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx   1 root root       17 Oct 12 20:15 libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx   1 root root       26 Oct 12 20:30 libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0
-rwxr-xr-x   1 root root  2820538 Sep 19 00:23 libmysqlclient_r.so.16.0.0
lrwxrwxrwx   1 root root       20 Oct 12 20:15 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx   1 root root       24 Oct 12 20:15 libmysqlclient_r.so.18.0.0 -> libmysqlclient.so.18.0.0
-rw-r--r--   1 root root     9904 Sep 19 00:21 libmysqlservices.a

おわり

とりあえず対処できちゃったのであまり調べてませんがメモ(><)

【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を使ってるディレクトリ(ファイル)を調べて消すか容量を増やしましょう。