子 Makefile をうまく使うメモ

一人アドベントカレンダー 2014 10 日目 by @takkyuuplayer

環境設定をmakeコマンドでやりたいときに アプリ毎に子Makefileを作って、 親Makefileからはそれを呼び出すだけにしたい。

  • current_dir はどうやって取ればいいの?
  • Makefileから親Makefileで定義した変数とか使いたい

っていう周りを解決したのでメモ

Makefile

mkfile_path=$(abspath $(lastword $(MAKEFILE_LIST)))
current_dir=$(notdir $(patsubst %/,%,$(dir $(mkfile_path))))
export SRC_ROOT=${current_dir}/src # accessible from child Makefile
export WEB_ROOT=/web/apps/

all: setup

setup: setup_common
  cd ${SRC_ROOT}/app1 && $(make)
  cd ${SRC_ROOT}/app2 && $(make)
  cd ${SRC_ROOT}/app3 && $(make)

setup_common:
  ...
DOCUMENT_ROOT=${WEB_ROOT}/appX
SRC_DIR=${SRC_ROOT}/appX

all: setup

setup:
    mkdir -p ${DOCUMENT_ROOT}
    ln -s ${DOCUMENT_ROOT}/css ${SRC_DIR}/css
    ln -s ${DOCUMENT_ROOT}/js  ${SRC_DIR}/js

次回予告

明日の担当も @takkyuuplayer です。

perl で foobar.csv.gz を書き出す

一人アドベントカレンダー 2014 8 日目 by @takkyuuplayer

perl で gz 圧縮された csv を出力したいことがある。 今回はその話。

CSVの出力

Text::CSV_XS を使いましょう。

use IO::File;
use Text::CSV_XS;

my $out = IO::File->new("./cache/test.csv", 'w');
my $rows = [
  {
    name => 'col1',
    value => 'val1',
  },
  {
    name => 'col2',
    value => 'val2',
  },
  {
    name => 'col3',
    value => 'val3',
  },
];
my $csv = Text::CSV_XS->new({binary => 1});
for my $row (@$rows) {
  my @columns = map { $row->{$_} } qw(name value);
    ok $csv->combine(@columns);
    $out->print($csv->string() . "\n");
}
$out->close();

gz の出力

IO::Compress::Gzip を使いましょう。

use IO::Compress::Gzip qw(gzip $GzipError);

my $z = new IO::Compress::Gzip("./cache/test.csv.gz")
          or die "gzip failed: $GzipError\n";
$z->print('name, value' . "\n");
$z->close();

合わせ技

use IO::Compress::Gzip qw(gzip $GzipError);
use Text::CSV_XS;

my $rows = [
  {
    name => 'col1',
    value => 'val1',
  },
  {
    name => 'col2',
    value => 'val2',
  },
  {
    name => 'col3',
    value => 'val3',
  },
];
my $csv = Text::CSV_XS->new({binary => 1});
my $z = new IO::Compress::Gzip("./cache/test.csv.gz")
          or die "gzip failed: $GzipError\n";
for my $row (@$rows) {
  my @columns = map { $row->{$_} } qw(name value);
    $csv->combine(@columns);
    $z->print($csv->string() . "\n");
}
$z->close();

次回予告

明日の担当も @takkyuuplayer です。

充分に発達した科学技術は、魔法と見分けが付かない

一人アドベントカレンダー 2014 7 日目 by @takkyuuplayer

タイトルは クラークの三法則 の1つ。 本日 6 年ぶりにディズニーランドへ行き、 そんな風に感じたアトラクションがあったのでその話。

Once Upon a Time

シンデレラ城に プロジェクションマッピング を行い、シンデレラ城そのものを映画館っぽくするアトラクションである。 ただ、映画館よりもすごい。屋外だから花火やらなんやらできるし。

抽選にあたり、正面指定席からの鑑賞。シンデレラ城から目を離すのがもったいなく、写真は最初に撮った1枚だけ。

f:id:takkyuuplayer:20141207183142j:plain

やっぱ、ディズニーすげぇわ。

次回予告

明日の担当も @takkyuuplayer です。

S3上のファイルをMojoliciousでproxyして返す

6 日目 by @takkyuuplayer

S3 上においてあるファイルを、 アプリ側で認証した人にだけアクセス許可したい事がある。 今回はMojolicious で S3 上のファイルを proxy して返した話。

f:id:takkyuuplayer:20141206113923p:plain

早速コード

S3への直接のアクセスは禁止だが、

アプリ経由ならok

use common::sense;
use Carp ();
use FindBin qw($Bin);
use lib $Bin . '/../local-git/lib';
                                   
use Constants qw(AWS_S3);
use Mojolicious::Lite;
use Amazon::S3;

get '/s3' => sub {
    my $self = shift;
                                                                     
    my $s3 = Amazon::S3->new({
        aws_access_key_id => AWS_S3()->{access_key},
        aws_secret_access_key => AWS_S3()->{secret_key},
    });
    my $backet = $s3->bucket('tp-sandbox');
    my $response = $backet->get_key('logo.gif');
    $self->res->headers->content_type($response->{content_type});
    $self->res->headers->content_length($response->{content_length});
    $self->render(data => $response->{value});
};

これで転送できる。

ただ, 転送するだけのために 一度$response変数に格納するのは メモリの無駄遣いなので、直接転送する方法があれば知りたい

次回予告

明日の担当も @takkyuuplayer です。

気になる Advent Calender 10選

3 日目 by @takkyuuplayer

気になる Advent Calender 10選。

Backbone -> Angular に移ってきて、ちょっと Angular流に沿わないこととかやると 途端に複雑になるの、なんとかできないかなと思って。

次回予告

明日の担当も @takkyuuplayer です。

一般ユーザーで lua が有効な vim を インストール

一人アドベントカレンダー 2014 2 日目 by @takkyuuplayer

neocomplcache の進化版として neocomplete というものが出ていた。今回は neocomplete インストールのため Lua が有効な vim を一般ユーザーでインストールした話。

とりあえず環境だけ欲しい人向け

LPM: Local Package Manager を使っているなら

$ git clone https://github.com/takkyuuplayer/lpm.git
$ cd lpm

$ lpm install scripts/lua.lpm
$ lpm install scripts/luajit.lpm
$ lpm install scripts/vim.lpm

で使えるようになる。

環境構築中にはまったところ

  • vim のインストール中に link.sh: Linking failed と言われる。

luajit は lua 5.2 に対応していない。

LuaJIT ought to run all Lua 5.1-compatible source code just fine. It's considered a serious bug if the VM crashes or produces unexpected results — please report this.

Lua は最新の 5.2系 ではなく、5.1系 をインストールすれば良い。

次回予告

明日の担当も @takkyuuplayer です。

一人アドベントカレンダー 2014

ブログ放置しちゃってるし、テコ入れに一人アドベントカレンダーでもやるか。

日付 担当 タイトル
2014/12/01 @takkyuuplayer Gauche(Scheme) のデバッグ環境構築
2014/12/02 @takkyuuplayer 一般ユーザーで lua が有効な vim を インストール
2014/12/03 @takkyuuplayer 気になる Advent Calender 10選
2014/12/04 @takkyuuplayer
2014/12/05 @takkyuuplayer
2014/12/06 @takkyuuplayer S3上のファイルをMojoliciousでproxyして返す
2014/12/07 @takkyuuplayer 充分に発達した科学技術は、魔法と見分けが付かない
2014/12/08 @takkyuuplayer perl で foobar.csv.gz を書き出す
2014/12/09 @takkyuuplayer
2014/12/10 @takkyuuplayer 子 Makefile をうまく使うメモ
2014/12/11 @takkyuuplayer
2014/12/12 @takkyuuplayer
2014/12/13 @takkyuuplayer
2014/12/14 @takkyuuplayer
2014/12/15 @takkyuuplayer
2014/12/16 @takkyuuplayer
2014/12/17 @takkyuuplayer Amway シミュレーター
2014/12/18 @takkyuuplayer
2014/12/19 @takkyuuplayer
2014/12/20 @takkyuuplayer
2014/12/21 @takkyuuplayer
2014/12/22 @takkyuuplayer
2014/12/23 @takkyuuplayer
2014/12/24 @takkyuuplayer