PostgreSQLデータベースにアクセスできないときの対処法

第四十五回
FATAL   C28000  MIdent authentication failed for user "rails"   Fauth.c L337   Rauth_failed

というエラーが出て,MigrationやconsoleからのDBアクセスが失敗したのでいろいろ調べてみると,こんな記述を発見しました.

it is due to Rails connecting to PostgreSQL via TCP socket, not UNIX socket, so in the pg_hba.conf you need to setup a “host” line, not a “local” line.

どうやらRailsPostgreSQLにアクセスする際にUNIX socketではなくTCP socketを利用していて,TCPを利用したアクセスではpasswordによるユーザ認証*1PostgreSQLの設定で許可されていないことが原因のようです.
同ページの対処法を試してみたところうまく動くようになったのでメモを残しておきます.

pg_hba.confを修正

データディレクトリにあるpg_hba.confファイルを以下のpg_hba.confの項に示すように修正します.データディレクトリとは,PostgreSQLをインストールした際に作成したdataディレクトリのことであり,私の場合は

/var/lib/pgsql/data

ですが,多くの場合

~postgres/data

というようにPostgreSQLユーザのホームディレクトリになっているようです.

pg_hba.conf
host    all         all         127.0.0.1/32          ident sameuser

となっている行を

host    all         all         127.0.0.1/32          password

のように修正して,PostgreSQLを再起動するとRailsからアクセスすることができるようになりました.

*1:PostgreSQLに対する

Haml を実際に Rails で使うチュートリアル

第四十三回

先日のエントリ「Ruby on Rails の View を気持ちよくシンプルに書ける Haml - のほほん徒然」で紹介したHamlを実際にRailsのアプリケーションで使用してみました.
私が大学院の講義で出されたレポート課題「Web Service*1を利用したWeb Applicationを作成しなさい」の成果物として昨年作った「http://www.unraki.com/imozuru/items」を利用してみます.作成時に書いたViewはrhtmlでしたので,それをHamlで書き直してみるというチュートリアルにします.

Haml Pluginをインストール

すでに,Railsプロジェクトの作成や,データベースとの連携など初期設定は済んでいる前提とします.なお,今回は既に作成済みのrhtmlをHamlで書き直しますが,プロジェクト開始時からViewはHamlで書こう!と決めている場合も作業はほぼ同じです.
まず,#{RAILS_ROOT}へ移動してプラグインをインストールします.

$ cd #{RAILS_ROOT}
$ ruby script/plugin install http://svn.hamptoncatlin.com/haml/trunk
$ mv  vendor/plugin/trunk vendor/plugin/haml-1.4.0

続いて,イキナリですがプラグインの修正をします(笑)この記事を書いている時点で,インストールしたHaml-1.4.0にはTypoが一箇所存在するためです.適当なエディタで以下のファイルを修正します.

#{RAILS_ROOT}/vendor/plugin/haml-1.4.0/lib/haml/helper.rb

l.243 - l.249

module ActionView
  class Base # :nodoc:
    def is_haml?
      false
    end # <- この行の'end'が抜けているので追加する
  end
end

HamlによるViewファイルを作成する

今回のケースでは,アプリケーション全体で利用するViewであるapp/view/layouts/items.rhtmlを書き換えます.

app/view/layouts/items.rhtml
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>Amazon書籍イモヅル検索 <%= "#{@q_words.join(' ')}」検索結果" unless @q_words.blank? %></title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <%= stylesheet_link_tag "scaffold" %>
  <%= stylesheet_link_tag "thickbox" %>
  <%= javascript_include_tag :defaults %>
  <%= javascript_include_tag "jquery" %>
  <%= javascript_include_tag "thickbox" %>
</head>
<body>
<div class="center">
  <div id="header">
    <div id="logo">
      <%= link_to_unless_current image_tag("logo_ImozuruSearch.jpg", :alt=> "One After Another"), :action => "index" %>
    </div>
    <p class="notice"><%= flash[:notice] %></p>
    <%= form_tag({:action => "search"}, :class => "query") %>
      <%= text_field_tag "q", @q_words ? @q_words.join(" ") : "google web", :size => 40 %>
      <%= submit_tag " 検索 " %>
      <%= link_to_function image_tag("question-mark.gif"), "$('#about').toggle()" %>
      <span id="loading_icon" style="display: none;"><%= image_tag "indicator.gif", :alt => "loading.." %></span>
    <%= end_form_tag %>
    <div id="about" style="display: none;">
      <dl>
        <dd>これはなに?</dd>
        <dt>
          <p>検索ボックスに入力された単語に,<%= link_to "Yahoo!JAPAN", "http://www.yahoo.co.jp/", :title => "Yahoo" %>による関連語を付けて,
            <%= link_to "Amazon", "http://www.amazon.co.jp/", :title => "Amazon" %>から関係のありそうな本をイモヅル式にひっぱる検索エンジンです.
          </p>
          <p>気になる本を探しながら,関連するものも一緒に見られます.</p>
        </dt>
        <dd>使い方</dd>
        <dt>
          <p>気になる言葉を検索ボックスに空白で区切って入力してください.</p>
          <p>ダブルクォーテーション(&quot;)で複数の単語を囲めばフレーズ検索もできます.</p>
        </dt>
      </dl>
    </div>
  </div>

  <%= yield %>

  <div id="footer">
    <p>
      Web Services by <%= link_to "Yahoo!JAPAN", "http://developer.yahoo.co.jp/", :title => "Yahoo!デベロッパーネットワーク" %>,
      <%= link_to "Amazon", "http://aws.amazon.com/", :title => "Amazon Web Services" %>
    </p>
  </div>
</div>
  <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
  </script>
  <script type="text/javascript">
    _uacct = "UA-294132-3";
    urchinTracker();
  </script>
</body>

われながらとてつもなく見づらいソースですが,これをHamlで書き直すためにまず名前を変更します.といっても拡張子を変えるだけですが.

$ mv app/view/layouts/items.rhtml app/view/layouts/items.haml

そして,書き直したHamlファイルの内容は以下のようになります.

app/view/layouts/items.haml
!!! XML
!!!
%html
  %head
    %title
      Amazon書籍イモヅル検索
      = "「#{@q_words.join(' ')}」検索結果" unless @q_words.blank?
    %meta{ 'http-equiv' => 'Content-Type', :content => 'text/html; charset=UTF-8'}
    %meta{ 'http-equiv' => 'Content-Script-Type', :content => 'text/javascript'}
    %meta{ 'http-equiv' => 'Content-Style-Type', :content => 'text/css'}
    = stylesheet_link_tag 'scaffold'
    = stylesheet_link_tag 'thickbox'
    = javascript_include_tag :defaults
    = javascript_include_tag 'jquery'
    = javascript_include_tag 'thickbox'
  %body
    .center
      #header
        #logo
          = link_to_unless_current image_tag('logo_ImozuruSearch.jpg', :alt=> 'One After An\
other'), :action => 'index'
        %p.notice
          = flash[:notice]
        %form.query{ 'action' => url_for( :action => 'search' ) }
          = text_field_tag 'q', @q_words ? @q_words.join(' ') : 'google web', :size => 40
          = submit_tag ' 検索 '
          = link_to_function image_tag('question-mark.gif'), "$('#about').toggle()", :title => 'Toggle Help Block'
        #about{ :style => 'display: none;' }
          %dl
            %dd これはなに?
            %dl
              %p
                検索ボックスに入力された単語に,
                = link_to "Yahoo!JAPAN", "http://www.yahoo.co.jp/", :title => "Yahoo"
                による関連語を付けて,
                = link_to "Amazon", "http://www.amazon.co.jp/", :title => "Amazon"
                から関係のありそうな本をイモヅル式にひっぱる検索エンジンです.
              %p 気になる本を探しながら,関連するものも一緒に見られます.
            %dd 使い方
            %dl
              %p 気になる言葉を検索ボックスに空白で区切って入力してください.
              %p ダブルクォーテーション(&quot;)で複数の単語を囲めばフレーズ検索もできます.
      = yield
      #footer
        %p Web Services by
        = link_to "Yahoo!JAPAN", "http://developer.yahoo.co.jp/", :title => "Yahoo!デベロッパーネットワーク"
        ,
        = link_to "Amazon", "http://aws.amazon.com/", :title => "Amazon Web Services"
    %script{ 'type' => 'text/javascript', :src => "http://www.google-analytics.com/urchin.js" }
    %script{ 'type' => 'text/javascript' }
      _uacct = "UA-294132-3";
      urchinTracker();

とこんな感じになります.このとき,同じ名前のrhtmlファイルが存在する場合,Hamlファイルが優先されます*2.この場合だと,items.rhtmlとitems.hamlが両方存在する場合,items.hamlが処理されます.

出力されるHTML

以上のように書き換え,ブラウザで確認すると以下のようなHTMLに変換されます.

<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>
      Amazon書籍イモヅル検索
    </title>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
    <meta content='text/javascript' http-equiv='Content-Script-Type' />
    <meta content='text/css' http-equiv='Content-Style-Type' />
    <link href="./stylesheets/scaffold.css?1172664322" media="screen" rel="Stylesheet" type="text/css" />
    <link href="./stylesheets/thickbox.css?1163099273" media="screen" rel="Stylesheet" type="text/css" />

    <script src="./javascripts/prototype.js?1163084730" type="text/javascript"></script>
    <script src="./javascripts/effects.js?1163084730" type="text/javascript"></script>
    <script src="./javascripts/dragdrop.js?1163084730" type="text/javascript"></script>
    <script src="./javascripts/controls.js?1163084730" type="text/javascript"></script>
    <script src="./javascripts/application.js?1163084730" type="text/javascript"></script>
    <script src="./javascripts/jquery.js?1163066375" type="text/javascript"></script>

    <script src="./javascripts/thickbox.js?1172640307" type="text/javascript"></script>
  </head>
  <body>
    <div class='center'>
      <div id='header'>
        <div id='logo'>
          <img alt="One After Another" src="./images/logo_ImozuruSearch.jpg?1172642737" />
        </div>

        <p class='notice'>
        </p>
        <form action='./items/search' class='query'>
          <input id="q" name="q" size="40" type="text" value="google web" />
          <input name="commit" type="submit" value=" 検索 " />
          <a href="#" onclick="$('#about').toggle(); return false;" title="Toggle Help Block"><img alt="Question-mark" src="./images/question-mark.gif?1127313754" /></a>
        </form>
        <div id='about' style='display: none;'>
          <dl>

            <dd>これはなに?</dd>
            <dl>
              <p>
                検索ボックスに入力された単語に,
                <a href="http://www.yahoo.co.jp/" title="Yahoo">Yahoo!JAPAN</a>
                による関連語を付けて,
                <a href="http://www.amazon.co.jp/" title="Amazon">Amazon</a>
                から関係のありそうな本をイモヅル式にひっぱる検索エンジンです.
              </p>

              <p>
                気になる本を探しながら,関連するものも一緒に見られます.
              </p>
            </dl>
            <dd>使い方</dd>
            <dl>
              <p>
                気になる言葉を検索ボックスに空白で区切って入力してください.
              </p>

              <p>
                ダブルクォーテーション(&quot;)で複数の単語を囲めばフレーズ検索もできます.
              </p>
            </dl>
          </dl>
        </div>
      </div>

      :
      :
   (中略)
      :
      :

      <div id='footer'>
        <p>Web Services by</p>
        <a href="http://developer.yahoo.co.jp/" title="Yahoo!デベロッパーネットワーク">Yahoo!JAPAN</a>
        ,
        <a href="http://aws.amazon.com/" title="Amazon Web Services">Amazon</a>
      </div>
    </div>
    <script src='http://www.google-analytics.com/urchin.js' type='text/javascript'>
    </script>

    <script type='text/javascript'>
      _uacct = "UA-294132-3";
      urchinTracker();
    </script>
  </body>
</html>

と,こんな感じで出力されます.

便利そうだが,あくまでプログラマ視点のような気がする.

実際のWebシステム開発を考えると,デザイナの理解できる(しやすい)ERB等が使われそう.

id:Hexaさんのおっしゃるように,元のrhtmlファイルに比べてHamlで書いたViewは,エンジニアにとってみると短く,シンプルで,見やすいものになっていると思います.しかし,このViewをデザイナさんに渡してデザインしてもらうというのは難しいのかもしれません.なぜなら,色々なところを省略しすぎて書いた本人しか良く分からないから.なにかうまい解決方法はないものでしょうか.

まとめ

今回はHamlRailsで利用する際の具体的なチュートリアルを,http://www.unraki.com/imozuru/itemsを題材に紹介しました.大まかな利用手順をまとめると以下のようになります.

  1. Railsプロジェクト開始
  2. Hamlをインストール(必要に応じてTypo修正)
  3. rhtmlファイルが既にある場合は名前を変える
  4. Hamlで書く
エラーへの対処法

今回,いくつかHamlのパースエラーに遭遇しましたので,対処法を残しておきます.

Application Errorと表示されたら
ログを見ましょう.Hamlのパースエラーはブラウザで確認することができません.そのため,#{RAILS_ROOT}/log/#{RAILS_ENV}.logにエラー内容が残ります.
ログにTemplateErrorと書いてあったら
ほとんどがインデントの深さと,改行に関することが原因です.まずはHTMLになったときのDOM構造をイメージしてインデントの深さを適切に調整してください.また,次のような書き方は私の確認したところでは無理なようです.
  #logo
    = link_to_unless_current image_tag('logo_ImozuruSearch.jpg',
                                        :alt=> 'One After Another'),
                             :action => 'index'

Rubyでは区切りの良いところならば,メソッドへの引数などは複数行にわたって書いても大丈夫なのですが,Hamlの場合これはダメなようです.正しくは以下のように1行で書きます.

  #logo
    = link_to_unless_current image_tag('logo_ImozuruSearch.jpg', :alt=> 'One After Another'), :action => 'index'

*1:広義の

*2:Hamlプラグインをインストールしたためです

Mind Hacks に見るWebインタフェース

第四十二回

オライリー・ジャパンから刊行されている「Mind Hacks ―実験で知る脳と心のシステム」という本を読み終えました.いつから読み始めたのか今では覚えてませんが,移動中や食事後など時間を見つけては少しずつ読み進めていました.
この本は「実験で知る脳と心のシステム」という副題がついているように,身近で簡単な実験や先人の実験を紹介しながら,私たちの視覚や聴覚といった感覚,運動や推論,記憶に人間の脳がどのように関わっているのか,また脳が物事の処理を早くするために,いかに「ごまかし」や「手抜き」を行っているのか,さらに言うと狭義の「ハッキング」を行っているのかについて述べています.
この本には,おもしろいもの,驚かされるものなどたくさんのことが書いてありましたが,普段私たちが何気なく行っている色々なことを脳がどのように知覚し,反応しているのかを知ることができました.そこで,それらをWebのインタフェースに活かすことができるのではないかと考え,いくつか考えたことをここにまとめてみようと思います.
なお,脳のことや認知科学のこと,Webデザインやインタフェースのことなど,どれも私は現在勉強中なので,間違ってることやこんな風にも考えられるんじゃないというご意見は大歓迎です.

Hack #15 - 能動的な視覚

誰かに何かを知覚させたいと思えば,そのものに対してはたらきかけがしやすいように,そしてその物と他の物との関係がわかりやすいようにすべき

私たちは,私たちの目に飛び込んできた映像を受動的に認知しているのではなく,はっきり物を見るという能動的な動作によって認知していると著者は述べています.
さらに目に飛び込んでくる映像のうち,私たちが意識的に認知しているのは視野の中心部分だけなので,ユーザが注目している物から少しでも離れた場所にある物は「見えてはいるが認知していない」物になります.Web広告などは,まさにこれに当たると思います.

Hack #19 - 視点の固定

しばらく何かを見ていると,目は見ていた物に「ロック」されたような状態になり,他の物に視点を移そうとしてもすぐに動こうとはしないのである.しかし,何らかの理由でそれまでに見ていたものが目の前からなくなった場合には,そうでない場合よりも早く目が動く.

すぐに動かないといっても1秒の何十分の一というレベルの話なので,人の行動が妨げられるというほどのことではありません.
しかし,何かから何かに注意を移してもらう必要があるというインタフェース上の場面では,最初に見せていた物を,次に見せる物が表示される直前に,画面から消すということによって,ユーザの目を次に見るべき物に向かってスムーズに移動できる状態にすることができます.

Hack #20 - 平面に奥行きを見る

影を付けたことによって飛び出て見える現象を「ポップアウト」と呼ぶ.ポップアウトによって円が背景から飛び出て見えれば,平面の円よりも認識しやすくなり,注意が向きやすくなる.

これは最近はやりのグラデーションを用いたWebデザインに利用されていますね.グラデーションの方向にも実は意味があって,人間は上から光が当たっていると見なしているため,上側の色を薄く,下に行くほど色を濃くするとその物は飛び出て(浮き上がって)見えます.
Webインタフェースで目立たせたい「見出し」や「ボタン」がグラデーションになっていたり,影がついていることは人間が認知しやすいという意味で良いことなのでしょう.

グラデーションを簡単に作るWebツール

Hack #38 - 後ろは振り返らない

自由意志によって何かに注意を向ける場合でも,「注意を向けにくいもの」が存在する.(...中略...)特に注意を向けにくいのが,「直前まで注意を向けていた物体や場所」である.いったん別の物体や場所に注意が移ると,元にはなかなか戻りにくい.

脳には,直前まで注意を向けていたものに再度注意を向けることを抑制する機能があるため,いったん必要ないと見なされた部分に時間をおいて新しい情報を示しても,ユーザは注意を向けてくれません.
そのため,同じ場所に続けて違う内容を表示するならば,間隔をあけずに表示した方が良いと書かれていました.むしろ,そんなコンテンツは設置しない方がいいのではないかと私は思いましたが.

Hack #50 - 「音」の持つ意味

単語の持つ音(単語を構成する音素)と,その単語が与える印象(多くの人が共通して持つ主観的印象)の間に関係があることから,それが商品や企業のブランドイメージを作るのに利用されることがある.

人は,単語の意味を理解する際に,文字の組合せを逐一考えているのではなく,数多くの手がかりを基に理解しようとしています.例えば,発音の抑揚や,単語の持つ音そのものからも意味を理解しようとしているそうです.
WebサイトやWebサービスなどを新しく作り名前をつけるときに,単語の持つ意味だけではなく,単語の音の持つ意味も考慮すると,サービスに対するイメージをあるていどユーザに与えることができる,ということがいえるのだと思います.
本の中でも,海外の無線メール用端末「BlackBerry」を例にとり,「b」の音は信頼をイメージさせると言っています.他の文字のイメージも知りたいですね.

ようやく半分.次回に続きます

100個あるHacksのうち,ようやく半分です.残り50個の中で気が付いたものは次回にご紹介させていただくことにしましょう.やたらと長くなってしまいましたし.
今回のポイントは,人間は知覚のほとんどを能動的に行っています.意識せずに行っていると思っていても,脳の認知レベルでは情報の取捨選択が行われ,自分に必要なものだけを処理することによって,処理効率を上げています.そのために,曖昧な情報や見えたり聞こえたりしている情報のうちかなりの部分が脳によって適当に補完されていることになります.そのため,このような脳の働きをしっかり把握した上で人とコンピュータとのインタラクションを考えると,直感的で使いやすいものができるのではないでしょうか.
○○Hacksという名前の本としては,かなり異色でページ数も多いですが,読めば日頃の何気ない行動に対する意識が変わるかもしれません.

Mind Hacks ―実験で知る脳と心のシステム

Mind Hacks ―実験で知る脳と心のシステム

Meadow メモ

第四十一回

Windows XPで本格的に使えるEditorを探していましたが,MeadowEmacsに似て使いやすそうなのでインストールして設定してみました.なので,色んなメモをここに残していきます.

環境

インストール

ネットインストールが可能なSetup.exeを利用します.Meadow配布ページから最新版のものをダウンロードして実行します.今回は3.00/setup-ja-3.00.5.exeをダウンロードして実行しました.
実行すると色々聞かれますがほとんどデフォルトのまま,インストールディレクトリなどは上記の通りです.インストールパッケージはあとで追加するのも面倒なので富豪的にすべてをDefaultからInstallに変更して全部インストールしました.

初期設定

ホームディレクトリにある「dot.emacs.ja」というファイルを[.emacs」にリネームして,いくつか設定を書き足しました.下のほうに私の .emacs の中身を全部載せておきます.

ruby-mode

Rubyを快適に読んだり書いたりするための設定をします.

  • ruby-mode.el
  • inf-ruby.el
  • rubydb2x.el
  • rubydb3.el

以上のファイルをダウンロードします.いまいちどこにあるか分からなかったので,Ruby自体のソースを利用することにします.http://aist.ring.gr.jp/archives/lang/ruby/1.8/から最新版のruby-1.8.5-p12.tar.gzをダウンロードして,解凍した中のmicsディレクトリに上記4つのファイルがあります.
それらのelファイルを全てC:\meadow\site-lisp\ruby-modeの中に入れました.なお,ruby-modeディレクトリはなかったので作りました.

.emacs
;;;; -*- mode: emacs-lisp; coding: iso-2022-7bit -*-
;;;;
;;;; Copyright (C) 2001 The Meadow Team

;; Author: Koichiro Ohba <koichiro@meadowy.org>
;;      Kyotaro HORIGUCHI <horiguti@meadowy.org>
;;      Hideyuki SHIRAI <shirai@meadowy.org>
;;      KOSEKI Yoshinori <kose@meadowy.org>
;;      and The Meadow Team.


;; ;;; Mule-UCS の設定
;; ;; ftp://ftp.m17n.org/pub/mule/Mule-UCS/ が オフィシャルサイトですが、
;; ;; http://www.meadowy.org/~shirai/elisp/mule-ucs.tar.gz に既知のパッチ
;; ;; をすべて適用したものがおいてあります。
;; ;; (set-language-environment) の前に設定します
;; (require 'jisx0213)


;;; 日本語環境設定
(set-language-environment "Japanese")

;;; バックアップファイルを作らない
(setq backup-inhibited t)

;;; 終了時にオートセーブファイルを消す
(setq delete-auto-save-files t)

;;; タイトルバーにファイル名を表示する
;(setq frame-title-format (format "emacs@ %%f" (system-name)))
;;; タイトルバーにバッファ名を表示する
(setq frame-title-format "%b")

;;; IMEの設定
(setq default-input-method "MW32-IME")
(setq-default mw32-ime-mode-line-state-indicator "[--]")
(setq mw32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
(add-hook 'mw32-ime-on-hook
	  (function (lambda () (set-cursor-color "SkyBlue"))))
(add-hook 'mw32-ime-off-hook
	  (function (lambda () (set-cursor-color "LemonChiffon"))))
(mw32-ime-initialize)
;(setq default-input-method "MW32-IME")
;(setq-default mw32-ime-mode-line-state-indicator "[--]")
;(setq mw32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
;(add-hook 'mw32-ime-on-hook
;	  (function (lambda () (set-cursor-height 2))))
;(add-hook 'mw32-ime-off-hook
;	  (function (lambda () (set-cursor-height 4))))


;; ;;; カーソルの設定
;; ;; (set-cursor-type 'box)            ; Meadow-1.10互換 (SKK等で色が変る設定)
;; ;; (set-cursor-type 'hairline-caret) ; 縦棒キャレット


;;; マウスカーソルを消す設定
(setq w32-hide-mouse-on-key t)
(setq w32-hide-mouse-timeout 5000)

;;; 起動時の画面を表示しない
(setq inhibit-startup-message t)

;;; font-lockの設定
(global-font-lock-mode t)
(setq font-lock-support-mode 'fast-lock-mode)
(setq font-lock-maximum-decoration t)
(setq fast-lock-cache-directories '("~/.emacs-flc" "."))

;; ;;; TrueType フォント設定
;; (w32-add-font
;;  "private-fontset"
;;  '((spec
;;     ((:char-spec ascii :height 120)
;;      strict
;;      (w32-logfont "Courier New" 0 -13 400 0 nil nil nil 0 1 3 49))
;;     ((:char-spec ascii :height 120 :weight bold)
;;      strict
;;      (w32-logfont "Courier New" 0 -13 700 0 nil nil nil 0 1 3 49))
;;     ((:char-spec ascii :height 120 :slant italic)
;;      strict
;;      (w32-logfont "Courier New" 0 -13 400 0   t nil nil 0 1 3 49))
;;     ((:char-spec ascii :height 120 :weight bold :slant italic)
;;      strict
;;      (w32-logfont "Courier New" 0 -13 700 0   t nil nil 0 1 3 49))
;;     ((:char-spec japanese-jisx0208 :height 120)
;;      strict
;;      (w32-logfont "MS ゴシック" 0 -16 400 0 nil nil nil 128 1 3 49))
;;     ((:char-spec japanese-jisx0208 :height 120 :weight bold)
;;      strict
;;      (w32-logfont "MS ゴシック" 0 -16 700 0 nil nil nil 128 1 3 49)
;;      ((spacing . -1)))
;;     ((:char-spec japanese-jisx0208 :height 120 :slant italic)
;;      strict
;;      (w32-logfont "MS ゴシック" 0 -16 400 0   t nil nil 128 1 3 49))
;;     ((:char-spec japanese-jisx0208 :height 120 :weight bold :slant italic)
;;      strict
;;      (w32-logfont "MS ゴシック" 0 -16 700 0   t nil nil 128 1 3 49)
;;      ((spacing . -1))))))

;; (set-face-attribute 'variable-pitch nil :family "*")


;; ;;; BDF フォント設定
;;
;; ;;; (方法その1) Netinstall パッケージを使う方法
;; ;;; misc と intlfonts パッケージを入れます。
;; ;;; .emacsの設定
;; (setq bdf-use-intlfonts16 t)
;; (setq initial-frame-alist '((font . "intlfonts16")))
;;
;; ;;; (方法その1') 
;; ;;; intlfonts-file-16dot-alist の形式で bdf-fontset-alist を書き、
;; ;;; 次を設定すれば良い。
;; ;;;  (require 'bdf)
;; ;;;  (bdf-configure-fontset "bdf-fontset" bdf-fontset-alist)
;; ;;; 詳細は $MEADOW/pkginfo/auto-autoloads.el と $MEADOW/site-lisp/bdf.el を
;; ;;; 参照のこと。
;;
;; ;;; (方法その2) 
;; ;;; フォントの指定方法は次のサンプルを参考にする。
;; ;;; normal, bold, italic, bold-itaric フォントを指定する必要あり。
;; (setq bdf-font-directory "c:/Meadow/fonts/intlfonts/")
;; (w32-add-font "bdf-fontset"
;; `((spec 
;;    ;; ascii
;;    ((:char-spec ascii :height any :weight normal :slant normal)
;;     strict (bdf-font ,(expand-file-name "lt1-16-etl.bdf" bdf-font-directory)))
;;    ((:char-spec ascii :height any :weight bold :slant normal)
;;     strict (bdf-font ,(expand-file-name "lt1-16b-etl.bdf" bdf-font-directory)))
;;    ((:char-spec ascii :height any :weight normal :slant any)
;;     strict (bdf-font ,(expand-file-name "lt1-16i-etl.bdf" bdf-font-directory)))
;;    ((:char-spec ascii :height any :weight bold :slant any)
;;     strict (bdf-font ,(expand-file-name "lt1-16bi-etl.bdf" bdf-font-directory)))
;;    ;; katakana-jisx0201
;;    ((:char-spec katakana-jisx0201 :height any :weight normal :slant normal)
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory))
;;     ((encoding . 1-byte-set-msb))) 
;;    ((:char-spec katakana-jisx0201 :height any :weight bold :slant normal)
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory))
;;     ((encoding . 1-byte-set-msb))) 
;;    ((:char-spec katakana-jisx0201 :height any :weight normal :slant any)
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory))
;;     ((encoding . 1-byte-set-msb))) 
;;    ((:char-spec katakana-jisx0201 :height any :weight bold :slant any)
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory))
;;     ((encoding . 1-byte-set-msb)))
;;    ;; latin-jisx0201
;;    ((:char-spec latin-jisx0201 :height any :weight normal :slant normal)
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory)))
;;    ((:char-spec latin-jisx0201 :height any :weight bold :slant normal)
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory)))
;;    ((:char-spec latin-jisx0201 :height any :weight normal :slant any) 
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory))) 
;;    ((:char-spec latin-jisx0201 :height any :weight bold :slant any) 
;;     strict (bdf-font ,(expand-file-name "8x16rk.bdf" bdf-font-directory)))
;;    ;; japanese-jisx0208
;;    ((:char-spec japanese-jisx0208 :height any :weight normal :slant normal) 
;;     strict (bdf-font ,(expand-file-name "j90-16.bdf" bdf-font-directory)))
;;    ((:char-spec japanese-jisx0208 :height any :weight bold :slant normal)
;;     strict (bdf-font ,(expand-file-name "j90-16.bdf" bdf-font-directory))) 
;;    ((:char-spec japanese-jisx0208 :height any :weight normal :slant any)
;;     strict (bdf-font ,(expand-file-name "j90-16.bdf" bdf-font-directory)))
;;    ((:char-spec japanese-jisx0208 :height any :weight bold :slant any)
;;     strict (bdf-font ,(expand-file-name "j90-16b.bdf" bdf-font-directory))))))

;; 初期フレームの設定
(setq default-frame-alist
;      (append (list '(foreground-color . "black")
      (append (list '(foreground-color . "grey85")
;		    '(background-color . "LemonChiffon")
		    '(background-color . "black")
		    '(background-color . "gray")
;		    '(border-color . "black")
		    '(border-color . "white")
		    '(mouse-color . "white")
		    '(cursor-color . "black")
;;		    '(ime-font . (w32-logfont "MS ゴシック"
;;					      0 16 400 0 nil nil nil
;;					      128 1 3 49)) ; TrueType のみ
;;		    '(font . "bdf-fontset")    ; BDF
		    '(font . "MS Gothic 12"); TrueType
		    '(width . 100)
		    '(height . 60)
		    '(top . 10)
		    '(left . 10))
	      default-frame-alist))


;; ;;; shell の設定

;; ;;; Cygwin の bash を使う場合
;; (setq explicit-shell-file-name "bash")
;; (setq shell-file-name "sh")
;; (setq shell-command-switch "-c") 

;; ;;; Virtually UN*X!にある tcsh.exe を使う場合
;; (setq explicit-shell-file-name "tcsh.exe") 
;; (setq shell-file-name "tcsh.exe") 
;; (setq shell-command-switch "-c") 

;; ;;; WindowsNT に付属の CMD.EXE を使う場合。
;; (setq explicit-shell-file-name "CMD.EXE") 
;; (setq shell-file-name "CMD.EXE") 
;; (setq shell-command-switch "\\/c") 


;;; argument-editing の設定
(require 'mw32script)
(mw32script-init)


;; ;;; browse-url の設定
;; (global-set-key [S-mouse-2] 'browse-url-at-mouse)


;; ;;; 印刷の設定
;; ;; この設定で M-x print-buffer RET などでの印刷ができるようになります
;; ;;
;; ;;  notepad に与えるパラメータの形式の設定
;; (define-process-argument-editing "notepad"
;;   (lambda (x) (general-process-argument-editing-function x nil t)))
;;
;; (defun w32-print-region (start end
;; 				  &optional lpr-prog delete-text buf display
;; 				  &rest rest)
;;   (interactive)
;;   (let ((tmpfile (convert-standard-filename (buffer-name)))
;; 	   (w32-start-process-show-window t)
;; 	   ;; もし、dos 窓が見えていやな人は上記の `t' を `nil' にします
;; 	   ;; ただし、`nil' にすると Meadow が固まる環境もあるかもしれません
;; 	   (coding-system-for-write w32-system-coding-system))
;;     (while (string-match "[/\\]" tmpfile)
;; 	 (setq tmpfile (replace-match "_" t nil tmpfile)))
;;     (setq tmpfile (expand-file-name (concat "_" tmpfile "_")
;; 				       temporary-file-directory))
;;     (write-region start end tmpfile nil 'nomsg)
;;     (call-process "notepad" nil nil nil "/p" tmpfile)
;;     (and (file-readable-p tmpfile) (file-writable-p tmpfile)
;; 	    (delete-file tmpfile))))
;; 
;; (setq print-region-function 'w32-print-region)

;; ;;; fakecygpty の設定
;; ;; この設定で cygwin の仮想端末を要求するプログラムを Meadow から
;; ;; 扱えるようになります
;; (setq mw32-process-wrapper-alist
;;       '(("/\\(bash\\|tcsh\\|svn\\|ssh\\|gpg[esvk]?\\)\\.exe" .
;; 	  (nil . ("fakecygpty.exe" . set-process-connection-type-pty)))))

;; メニューバーを消す
;;(menu-bar-mode -1)

;; ツールバーを消す
(tool-bar-mode nil)

;;; カーソルの位置が何文字目かを表示する
(column-number-mode t)

;;; 一行が 80 字以上になった時には自動改行する
(setq fill-column 80)
(setq-default auto-fill-mode t)

;;タブ幅を 4 に設定
(setq-default tab-width 4)
;;タブ幅の倍数を設定
(setq tab-stop-list
  '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))
;;;タブではなくスペースを使う
;(setq-default indent-tabs-mode nil)
;(setq indent-line-function 'indent-relative-maybe)

;; ruby-mode
(autoload 'ruby-mode "ruby-mode"
  "Mode for editing ruby source files")
(setq auto-mode-alist
      (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" .ruby-mode))
                                     interpreter-mode-alist))
(autoload 'run-ruby "inf-ruby"
  "Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
  "set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook
          '(lambda ()
			 (inf-ruby-keys)
			 ))

;;;
;;; end of file
;;;

コメント部分が多く,無駄に長くてスイマセン.

Tips

私が覚えておきたいことや,便利っぽいことをメモしていきます.体系的にまとめるつもりはないので気づいた順です.

コマンド関係
コマンド 内容
C-M-\ リージョン指定した範囲を一括インデント
C-w リージョン指定した範囲を切り取り
M-w リージョン指定した範囲をコピー
C-x o (分割された)次のバッファへ移動
C-x C-b バッファ一覧を表示

英語のRSSを日本語に変換してくれる Yahoo! Pipes の Module を作ってみました

第四十回

前々回前回Yahoo! Pipesで遊んでみたわけですが,しつこく今日も遊んでみます.
Yahoo! PipesにはOperators::BabelFish*1という翻訳モジュールがあるのですが,やはり他言語から日本語への翻訳機能はありません.米Yahoo!は日本を重要視していないのでしょうか.それとも,2バイト文字の扱いがめんどくさい?*2
というわけで,「ないのなら つくってしまえ Yahoo! Pipes」(字余り)です.
http://pipes.yahoo.com/pipes/KPBkqwi_2xGXEMMv0kqv4w/

これはなに?

英語のRSSフィードを日本語のRSSへ翻訳して出力するYahoo! Pipes Moduleです.

つかいかた

上記リンクからYahoo! Pipesへ移動し,「Run Pipe」ボタンをクリックしてみてください.デフォルトではCNN.comの最新ニュースRSSを読み込んで,下の画像のようにヘッドラインを日本語へ変換してくれます.

どうやって実現してるの?

大和利之さんの RSS 翻訳サービス FeedTranslatorを利用させていただいています.Pipes Moduleとしての中身は URL Builder で FeedTranslator への URL を作り,入力とあわせて Fetch しているだけのすごく簡単なものです.
なので,初めてYahoo! Pipesに触れるという方でも,中身を見ていただければだいたいなにをしているか分かるようになっています.

応用例

Yahoo! Pipesでは他の人が作った(私の作った)ModuleをCloneとしてコピーして自分のPipesに組み込むことができます.

Operators::BabelFishを利用して多言語翻訳

http://pipes.yahoo.com/pipes/2E8akQO62xGrchCW0kqv4w/というPipes Moduleは,ヨーロッパやその他のNewsを英語に翻訳して出力します.このモジュールに私の翻訳モジュールを文字通り「つなげる」と,2段階翻訳されたたくさんの国のNewsが日本語で読めます.
私は作ってませんが,どなたか作ってみてください.そして,他にもおもしろい応用例があれば教えてください.

注意点

  • 翻訳はコストの高い処理なので,かなりの処理時間を必要とします.
  • 大和利之さんへ利用していいか問い合わせ中ですが,サーバ転送量の問題などもありますので「ダメ」と言われた場合は削除します.
  • Yahoo! Pipesはその名の通り「つなぎあわせて」こそ真価を発揮します.私のModuleやそのほかの人のModule,あなたの作ったModuleを自由に繋ぎ合わせて創造的なPipesを作成してみてください.出来上がった際にはご一報くださると幸いです.

まとめ

今回は英語のRSSフィードを日本語へ翻訳するYahoo! Pipes Moduleを紹介しました.グラフィカルにコードレスにWebサービスが作れてしまうYahoo! Pipesの一面が見えたと思います.米Yahoo!のIDさえあれば簡単にMashupできてしまうので皆さんも楽しんでみてはいかがでしょうか.

*1:しゃれた名前ですね

*2:でも中国語へは翻訳できるもんなー

Yahoo! JAPANから検索できるYahoo! PipesのSources Moduleを作ってみました

第三十九回

前回Yahoo! Pipesを使ってみたのですが,いかんせんアメリカのサービスなので日本の情報を扱いづらいです.例えば,入力として最初から使えるSources Moduleが,

の五つで,日本のサービスは一つもありません.Fetchは任意のURLを読み込むことができますが,結果にRSSを発行するURLしか使えません.
というわけで,Yahoo! Search Moduleがyahoo.comの検索エンジンを利用した結果を返すので,Yahoo! JAPAN検索エンジンの結果を利用できるModuleを作ってみました.
http://pipes.yahoo.com/pipes/8vYTscq92xG94_rL0kqv4w/
しかし,Yahoo! JAPANの検索結果はRSSではないので,たたみラボ-Tatami LabsさんのYahoo!検索結果からRSSを生成するWebサービスを利用しました.
とはいえ,これをただ実行してもあまり意味がないので,CloneやCopyをして独自のPipeに組み込んでみると結果が変わっておもしろいかもしれません.

注意点

デフォルトで使えるYahoo! Search Moduleには,検索対象のサイトを絞り込むためのURLフィールドがあり,フィールドが一つに対して他のModuleから複数のURLを読み込むことできますが,Yahoo! JAPAN Searchでは一つのフィールドに対して一つのURLしか与えることができません.複数のURLで検索対象サイトを絞り込みたい時は,直接中身にフィールドを追加してください.

まとめ

Mash up(混ぜる)」をたくさんすることを表す新しい造語として「Beat up(泡立てる)」を提案します!(イキナリ
知り合いは「Vapor Up(蒸発する)」がいいと言っていましたが.

Yahoo! Pipesを使ってみました

第三十八回

各所で話題になっている米Yahooの新サービスYahoo! Pipesに私も参加してみました.
Yahoo! Pipesは,UNIXpipe(パイプ)のようにWeb上に存在するRSSフィードを複数つなげて,加工・抽出など様々な操作を独自に作り出せるWebサービスです.
RSSとか加工とかなんだか難しそうですが,プログラミングが得意でない人*1でもGUIでパーツ*2を設置したり繋いだり離したり,「レゴ・ブロック」のように簡単にいろんなことができます.

さっそく一つ作ってみました

その名も「Search in HatenaBookmarking Site」
これは,自分がはてなブックマークしたWebサイトからのみキーワード検索*3を行うものです.GoogleとかYahoo!とかで検索するとあんまり必要としてない結果が含まれることがあるのですが,自分が選んでブックマークしたWebサイトから調べるなら,ある程度有用な情報が多いんじゃないか,と考えて作りました.

使い方
  1. your Hatena's Name」のテキストフィールドにあなたの(または誰か他のユーザの)はてなIDを入れます.デフォルトは私のIDになっています.
  2. Narrow the Tag」の部分には,絞り込むためのタグ名を入力します.デフォルトはpipesになっています.
  3. Search Query」には検索キーワードを入力します.

デフォルトのまま実行すると,「id:uchiuchiyama」が「pipes」というタグを付けてはてなブックマークしたWebサイトの中から「plagger」というキーワードで検索を行います.これによって,Yahoo! Pipesについて記述のあるサイトからPlaggerについての記述を探すことができます.
Yahoo! Pipesに興味を持つ人は結構Plaggerについても良く知ってる人だと思いますので,大手検索エンジンで検索するよりも質の高い情報が得られるのではないでしょうか.
他にもおもしろいPipeの例や,ここはこうした方がいいんじゃない?などのご意見があればコメントやトラックバックで教えてください.

*1:私とか

*2:moduleと呼ばれています

*3:Yahoo!検索