2013/03/12


超絶意訳
What is cpanfile and why do I want to use it - Tatsuhiko Miyagawa's blog

What is cpanfile and why do I want to use it So there seems to be a couple of blog posts and even co...

http://weblog.bulknews.net/post/44963580392/what-is-cpanfile-and-why-do-i-want-to-use-it

cpanfile について幾つかブログ記事やカンファレンスがある様です。素晴らしい事です。ですがそれは単に、それが何であるか、またそれらがなぜ必要なのか(もしくは必要じゃないのか)を、筆者の説明と共に書かれているだけなのです。

tl;dr 日本の方へ - この Hokkaido.pm でのスライドの冒頭にある「cpanfile とは何か」は素晴らしい。

cpanfile は以下の2つのユースケースを明確に分ける目的で作られました。二つ目については偶発的ですが。

1)「アプリケーション(ウェブアプリでコマンドライン・スクリプト)があり、そのCPANモジュール依存性をなんとかして管理したい。 CPANにリリースする予定はないが、その依存性等を記述する偽に Makefile.PL を書いた。」

2)「git リポジトリ上に perl モジュールがあり、またコントリビュータがリポジトリからインストール出来る様にしたい。でも inc/Moudle/Install.pm がロード出来ないって言ってるし、リポジトリに inc を含めたり META.yml の衝突は望ましくない。」

cpanfile は CPANモジュールの依存を記述する Module::Install のようなDSLです。そのファイルを解析するためのモジュールを付属してるけど、あらゆる特定のビルダーやインストーラにも結び付けられていない。

CPAN の依存について記述したい Perl アプリケーション開発者に有用で、carton install もしくは cpanm --installdeps . で簡単にインストール出来る。

CPAN module author へ。git リポジトリから簡単に(すぐさま)インストール出来るって恩恵が得られるんだけど、cpanfile は絶対に移行すべき物って訳じゃないよ。(すぐさま)と書いたのには理由があって、cpanm 1.6 の時点では、git リポジトリから提供される M::I ブートストラップ相当の機能はない。これは既知の問題なんだけど cpanm 1.7 の前あたりから取り組んでる。 (configure_requiresの中で Module::Install を指定するって代替手段はある。でも、CPANに送っても全く必要ないしそれって間違ってるよね。)

標準CPANインストーラー(CPAN.pm、CPANPLUS、cpanm)は依存性を検知するのに META ファイル(もしくはその後のMYMETA)で動作してる。

これが標準だし cpanfile はこれらの全部を置き換えるつもりは全く無い。

でももし CPANモジュールの依存物を記述するために cpanfile を使うと決めたなら、MYMETA プロトコルで透過的になる様に Module::Install::CPANfile もしくは Module::Build::Pluggable::CPANfile を使うべきだよ。

FAQ


僕は CPAN Author で、META.yml をリポジトリに含んでる。cpanfile にスィッチした方がいい?

君の設定が静的で、リポジトリにある META.yml の衝突を覚えているなら問題ないし、それって凄い事だよね。でも configure_requires に「Module::Install」(例えばだけど)を入れてても一旦CPANに送らたらもう必要ないよね。inc 以下をコミットするのは作者の好き勝手だけど、僕には必要無い様に思える。

ウェブアプリをクラウドにデプロイしたいんだけど、どのプロバイダが cpanfile をサポートしてるの?

ほとんどのPaaSプロバイダ(dotcloud、buildpackなどによるherokuとか)は依存物のインストールに cpanm -- installdeps を使ってる。 cpanm を 1.6 もしくはそれ以上のバージョンににアップグレードすれば、自動的にcpanfileから依存性を解決するよ。まだ 1.6 じゃないとしたら、なんでアップグレードを望まないの?

CPANモジュールに dzil を使ってるし、何言ってるか分かんない。

すばらしい。じゃあ、この記事については忘れて。

しかしながらモジュールへの寄与者は、dzil を最初にインストールして、他の CPAN モジュールの風習の異なるテストやインストールをする為にコマンドを覚えておく必要がある。cpanfile はその助けになるかもしれない。でも僕はまだ見出せてないけどね。

cpanfile の中に Module::Install を書くべきか?

それって殆どの場合 develop のはずだし、cpanm は開発環境を検知する。たとえば CPAN tarball よりもっとスムーズに。

Posted at by



2013/03/11


clever-f というプラグインをちょっと使ってみた。
clever-f.vimでf連打が便利すぎる件 | tekkoc'blog
http://tekkoc.tumblr.com/post/39831021177/clever-f-vim-f
clever-f.vim を魔改造した話 - 永遠に未完成
http://d.hatena.ne.jp/thinca/20130227/1361891993
rhysd/clever-f.vim - GitHub
https://github.com/rhysd/clever-f.vim
こういった用途が有用となるのは、殆どの場合誤操作や目的位置を判定する難しさのはず。
  • あの辺まで c したい。おっと足らなかった。
  • あそこの、一個手前まで c したい。
  • 目的位置まで何個 x があるか分からないよ。。。
こういケースに clever-f が役立つのかと思った。clever-f は vim らしさを保つ為に cfffff というキーを使うけど、もう少しユーザフレンドリな物はどうかと思って別アプローチな物を作ってみた。
mattn/wiseman-f-vim - GitHub
https://github.com/mattn/wiseman-f-vim
clever-f は fFtT を全てフックするけど、こちらのは omap だけ。なので使う場合は cf の代替くらいだと思う。ちょっと癖があって cf を上書きするのは困るだとうから、現状は ! に omap しています。なので cf の代替としては c! をタイプします。
wiseman-f
c! までタイプすると、wiseman モードに入ります。タイプしていく毎に前方検索します。/ も検索出来ます。$ や 0、^ は vim らしく動きます。<c-b> や <c-f>、カーソルキーでターゲットを動かせます。<c-g> で元の位置に戻せます。<c-c> や <esc> でモードをキャンセル出来ます。最後にエンターキーを押すと確定です。
cf だけでなく omap 出来る物であれば使えるはずです。
どんな風に動くかは、以下のスクリーンキャストをご覧下さい。
赤いマーカーがターゲットです。もちろん、! でなく f にマップする事も出来ます。
Posted at by



2013/02/26


AppFog というサービスを使えば色んなアプリケーションをクラウド上で動かせるので勉強に持ってこいですね。
AppFog: PaaS for Public and Private Clouds
AppFog

Fast and Easy Select name, size and stack, then launch. Make your apps even more powerful with popul...


https://www.appfog.com/
使える言語も結構多くて
appfog1
いろいろ使えるし、デプロイ先も選べる。AWS とか無料で使わせて貰えてチョーすげー。
appfog1
Java は Jetty じゃなく Tomcat で動いてるらしかったので、clojure 使ってみようと試してみた。
$ lein new hello で新しいプロジェクト作って Tomcat 向けに WEB-INF を作る。 |   project.clj
|   
+--- src
|   |   
|   `--- hello
|           core.clj
|           
`--- WEB-INF
            web.xml
project.clj を以下の様に弄る。 (defproject hello "1.0.0-SNAPSHOT"
  :description "FIXME: write"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [compojure "0.6.5"]
                 [ring/ring-jetty-adapter "0.3.11"]]
  :compile-path "WEB-INF/classes"  
  :library-path "WEB-INF/lib"
  :namespaces [hello.core])
lein deps した際にに WEB-INF/lib に jar を、クラスファイルを WEB-INF/classes に放り込んで欲しいので compile-path と library-path を変える。
Tomcat なので web.xml を用意する。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="hello"
    version="2.5">
  <display-name>hello servlet</display-name>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>hello.core</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
ここまで出来たらもコードを書く。例えば src/hello/core.clj を以下の様に書く。
(ns hello.core
  (:import (java.util Date))
  (:gen-class :extends javax.servlet.http.HttpServlet)
  (:use compojure.core
        ring.util.servlet)
  (:require [compojure.route :as route]))

(defroutes hello
  (GET "/" [] (str "
<!DOCTYPE html>
<html lang=\"ja\">
<head>
    <meta charset=\"UTF-8\">
    <title></title>
</head>
<body>
こんにちわ 世界 " (Date.) "
</body>
</html>"))
  (route/not-found "DanKogai not found"))

(defservice hello)
サーブレットを継承して compojure でルーティングする簡単なやつ。この状態まで来たら動かす準備に入る。AppFog 用のツールを入れる。
$ gem install af 最近、クラウド操作で ruby 使ってる物、かなり多いですね。
入れたら AppFog でアカウントを作って、Java を選び、デプロイ先を選ぶ。無料なので遠慮せずに好きな所に入れればいいです。ドメイン名が気に入らない人は変更出来るので好きなようにどうぞ。最後にプロジェクトのルートで
$ af update myapp (myapp は AppFog で登録したアプリケーション名)
とやればアップロードされ、アプリケーションが起動します。
Posted at by