2012/10/31


サブドメインに任意の文字列が入るウェブアプリのローカル開発 - 冬通りに消え行く制服ガールは?夢物語にリアルを求めない。 - subtech

サブドメインに任意の文字列が入るようなサービスをローカルで開発しようとすると、いろんなホストを /etc/hosts に書かないといけなくてすごく不便なので、なんとかしようと思っていたところ、id:hakobe932 先生に「それアレでできますよ」との御言葉を頂き、簡単なスクリプトを書きました。

http://subtech.g.hatena.ne.jp/cho45/20110804/1312389877
僕ならこうやるかも

libcho45.c
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>

static const char* host_mask;
static struct hostent *(*__gethostbyname)
    (const char*);
static int (*__gethostbyname_r)
    (const char*, struct hostent*, char*, size_tstruct hostent**, int *);
static int (*__getaddrinfo)
    (const char*, const char*, const struct addrinfo*, struct addrinfo**);

__attribute__((constructor))
void
wrap_gethostbyname() {
  __gethostbyname = dlsym(RTLD_NEXT, "gethostbyname");
  __gethostbyname_r = dlsym(RTLD_NEXT, "gethostbyname_r");
  __getaddrinfo = dlsym(RTLD_NEXT, "getaddrinfo");
  host_mask = getenv("HOST_MASK");
  if (!host_mask) host_mask = "";
}

struct hostent*
gethostbyname(const char* name) {
  if(strstr(name, host_mask)){
    return (*__gethostbyname)("localhost");
  }
  return (*__gethostbyname)(name);
}

int
gethostbyname_r(const char* name, struct hostent* result, char* buffer, size_t buflen, struct hostent** presult, int* h_errnop) {
  if(strstr(name, host_mask)){
    return (*__gethostbyname_r)("localhost", result, buffer, buflen, presult, h_errnop);
  }
  return (*__gethostbyname_r)(name, result, buffer, buflen, presult, h_errnop);
}

int
getaddrinfo(const char* name, const char* service, const struct addrinfo* hints, struct addrinfo** res) {
  if(strstr(name, host_mask)){
    return (*__getaddrinfo)("localhost", service, hints, res);
  }
  return (*__getaddrinfo)(name, service, hints, res);
}
このソースを # gcc -o libcho45.so -fPIC -shared libcho45.c -ldl -lnsl
でビルドして、例えばこんなperlスクリプトであれば

cho45.pl
use strict;
use warnings;

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://cho45.local.example.com/");
warn $res->decoded_content;
以下の様に起動する
# HOST_MASK=.local.example.com LD_PRELOAD=./libcho45.so perl cho45.pl
まぁ、やってる事は単純ですね!もちろんちゃんとした後方一致にするべきですが、まぁいいですよね。
昔のオジサン達はこんな事やってました。

この辺り、オジサンじゃないけどkazuhoさん辺りが詳しそう。
Posted at by



2012/10/30


plack を使ってて「サーバのサブフォルダを間借りして動かしたい」って事がたまにあるんだけど、そんな場合 nginx の設定でリバースプロキシに渡すって事をやります。 location /foo {
    try_files $uri $uri.html $uri/index.html @proxy-foo;
}

location @proxy-foo {
    proxy_pass http://localhost:5000;
    proxy_set_header Host $http_host;
}
この場合、通常の Plack アプリケーションだと / がアプリケーションルートになっているので404になってしまう。よって app.psgi とは別に !perl

use strict;
use warnings;
use Plack::Builder;
use Plack::Util;

builder {
    mount '/foo/' => Plack::Util::load_psgi('app.psgi');
}
の様な wrapper スクリプトを書く必要がありました。
しかし先日、plackup に --path 引数が追加され $ plackup --path /foo と書くことで、自動的にマウントしてくれる機能が付きました。
これでいちいち wrapper スクリプトを書かずに済むようになりました。

僕的に便利
Posted at by




最近 yuroyoro さんが作った git issue が便利でたまらない。コンソールから redmine や github の issue が操作できるし、全て CUI で完結出来る。
しかしながら、どうしても「Vim で、しかも REST 的に redmine を扱いたい!」という欲望がおさえられず、作ってしまった。
mattn/vim-metarw-redmine - GitHub
https://github.com/mattn/vim-metarw-redmine/
kana さんの vim-metarw 経由で redmine を読み書きできます。動作には vim-metarw が必要です。
kana/vim-metarw - GitHub
https://github.com/kana/vim-metarw
let g:metarw_redmine_server = 'https://your-redmine.example.com'
let g:metarw_redmine_apikey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
vimrc 等にこの様に設定しておけば使えます。
redmine 側は「管理」→「設定」→「認証」→「RESTによるWebサービスを有効にする」をチェックし、「個人設定」からAPIキーを表示すれば見れます。

:e redmine: とするとプロジェクト一覧
project list
プロジェクト一覧でエンターすると、チケットの一覧
issue list
さらにエンターすると
issue edit
チケットが直接編集出来ます。status を閉じたりする場合、Close に相当する status の ID を覚えておく必要がありますが、「管理」→「チケットのステータス」から ID が分かるのでそこから知って下さい。
こんなの喜ぶのは僕しかいないかも知れませんが、奇特な人へ。

どうしてもこれを Windows から使いたいという、さらに奇特な人は vim-metarw を Windows でも動作する様にした私の fork をお使い下さい。
mattn/vim-metarw - GitHub
https://github.com/mattn/vim-metarw

追記
投稿の方法を書くのを忘れてました。

タイトル1行、本文数行を書いて :w redmine:/[プロジェクトID] に書き込んで下さい。

Posted at by