ブラニフLOVE!- オサレな1965年からのブラニフ航空

ふと1965年からのブラニフ航空を紹介してみます。


http://ja.wikipedia.org/wiki/ブラニフ航空 より

1965年には…(略)…エミリオ・プッチと…(略)…ともに
「退屈な飛行機の終焉」キャンペーンを企画する。

※恣意的な省略でもあるので、正しくはWikipedia 本文をご覧下さい!

このキャンペーンが実に素敵でした。
スッチーさんが"エア・ストリップ" と称してフライト中に制服チェンジなんてのもありました。発想がかわいらしい!

その写真付きまとめページ
http://www.braniffpages.com/1965/1965.html
http://www.braniffpages.com/1965/pic2.html
http://www.braniffpages.com/1965/pic3.html
http://www.braniffpages.com/1965/pic26.html

宇宙チックなプッチデザインがなんともオサレ。
私はこれでプッチ好きになりました。
お勧め情報でしたー。

バナナ食べ過ぎるとアレルギー?バナナの危険性

バナナ売り場に群がる女性の皆様へ

そりゃ朝にバナナだけ食べりゃ痩せるよ。というか脂肪の付かない食べ物だけならなんでも痩せるだろうが!
あれだけ失敗してまだ気付かないのか?!きゅうりでも齧ってろハゲ!

笑わせていただきました。


さて、バナナで思い出すのがアレルギー。
私はつい昨年、果物の中で最も好きだった梨の、あの梨の、アレルギーになってしまいました!
なんか食べたら口の周りがはげしくかゆい。
かゆいなーと思ったらぷくーと膨れました。
劇ショック。


で、果物アレルギーというのがあるというのを知った次第。


バナナアレルギーの症状と果物の種類

年齢を重ねるつれ発症する確率が高くなるアレルギーです。

口腔アレルギー症候群

バナナは洗わなくてもきれいな感じがするし、皮をむくのにナイフはいらないし、安くておいしくて、なんて食べやすい果物なのでしょう!でも、農薬漬けの果物です。アトピー性皮膚炎で来院した子供たちでバナナを毎日のように食べている子の多くが、血液検査ではすでにアレルギーを起こしています。

本当に農薬漬けなのか、農薬漬けでないのならば大丈夫なのか、細かなことは分かりません。
が、私の経験から、果物にもアレルギーがあるということを知っていただくことは必要だと思いました。


ご自愛くださいまし。

amb評価器の動かし方(DrScheme v4.1対応版)

先日より素人くさいSICP 読書会(http://www.csus4.net/hiki/SICPReading/)におじゃまさせていただいています。
加わったのがだいぶ途中の段階からだったため(問題4.36から)、先ずは話についていくためにきちんとamb 評価器が実行できる環境を手に入れたいと思っていました。
当たり前ですが、動かせる環境が手元にあると理解度がぜんぜん違うんですよね。
今日までに何度か試していたのですが、一見動いているようでいざ演習問題をやろうとするとエラーになったり、訳のわからないハマりどころがあり、役に立っていませんでした。


今日は時間を取っていろいろ試行錯誤し、動かせるところまでで来たので報告してみます。

先ず、amb 評価器のソースを入手し、DrScheme 用に加工

http://mitpress.mit.edu/sicp/code/index.html
から、

  • ch4-ambeval.scm
  • ch4-mceval.scm

を。また、SICPに掲載されているコード断片の詰まった

  • ch4.scm

をダウンロードしてください。

次にch4-ambeval.scm のファイルの先頭に以下を追加して下さい。(入れる場所は適当でいいです)

(define (error message) message)
(define true #t)
(define false #f)

またR5RSでは、eval とapply の定義を上書きできないようになっているようなので(エラーになる)、これらの関数を他の名前に置き換える必要があります。
よってch4-mceval.scm 内のeval とapply をそれぞれmyeval, myapply 等と置換して下さい。
※"eval-何とか" や、"apply-何とか" があるので、盲目的に全部置換しちゃいけません!大丈夫、そんなに数はないから。

ここ、ちょっと面倒ですよね〜。

DrScheme をインストールして起動

起動したら、用意していたch4-ambeval.scm を読み込んでおいて下さい。

言語はR5RS を選択

DrScheme は、ひとつのScheme 実装でなく、いくつかの言語を選択できるようになっています。

以前は"Essentials of Programming Languages(2nd ed.)" を選べば動いたように思いますが、
Version 4.1では"Essentials of Programming Languages(3nd ed.)" になっており、
これでは動かないので別の言語を選択する必要がありました。


ただ、その他の言語をいろいろ試してみたのですが「set-car! が無い」等と怒られてしまいます。
DrScheme の[ヘルプ]-[ヘルプデスク]から、set-car! で検索して確かめると、R5RS に存在していることがわかりました。
よって、R5RSしかないのだと思います。R5RS を選んでください。


(R5RSでもうまく動かなかった部分は泥臭く調整しましたが、それが上に述べたファイルの改変の内容でした。)

DrScheme の実行ボタンを押す

ようこそ DrScheme, バージョン 4.1 [3m].
言語: R5RS; memory limit: 128 megabytes.
metacircular-evaluator-loaded
amb-evaluator-loaded

のように表示されればOK.

そして以下を打ち込んで実行し、手動でamb 評価器を起動します。

;; この2ステップでamb 評価器が起動
(define the-global-environment (setup-environment))
(driver-loop)

この段階でamb 評価器が起動しています。
続いて以下のコードを試してみてください。

;; amb 評価器内で実行
(define (require p) (if (not p) (amb)))
(define (an-element-of items) (require (not (null? items))) (amb (car items) (an-element-of (cdr items))))
(an-element-of '(1 2 3))

結果として1が表示されれば動いています。

更なる動作確認のため、SECTION 4.3.2 -- Logic Puzzles も動かしてみましょう。

ch4.scm から関数require、distinct? およびmultiple-dwelling をamb 評価機内にコピペして、
その上で(multiple-dwelling) とすると実行が確認できます。

具体的には以下のようなコマンド行になるでしょう。

;;; Amb-Eval input:
(define (require p)
  (if (not p) (amb)))

(define (distinct? items)
  (cond ((null? items) true)
        ((null? (cdr items)) true)
        ((member (car items) (cdr items)) false)
        (else (distinct? (cdr items)))))

(define (multiple-dwelling)
  (let ((baker (amb 1 2 3 4 5))
        (cooper (amb 1 2 3 4 5))
        (fletcher (amb 1 2 3 4 5))
        (miller (amb 1 2 3 4 5))
        (smith (amb 1 2 3 4 5)))
    (require
     (distinct? (list baker cooper fletcher miller smith)))
    (require (not (= baker 5)))
    (require (not (= cooper 1)))
    (require (not (= fletcher 5)))
    (require (not (= fletcher 1)))
    (require (> miller cooper))
    (require (not (= (abs (- smith fletcher)) 1)))
    (require (not (= (abs (- fletcher cooper)) 1)))
    (list (list 'baker baker)
          (list 'cooper cooper)
          (list 'fletcher fletcher)
          (list 'miller miller)
          (list 'smith smith))))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(multiple-dwelling)		;; ここで実行

;;; Starting a new problem
;;; Amb-Eval value:
((baker 3) (cooper 2) (fletcher 4) (miller 5) (smith 1))

SICPにある通りの答えが出ていますので、きちんと動いていますね。

amb評価器を止める

amb評価器はScheme のアプリケーションにすぎないので、右上の[停止◎] を押せばいいです。


こんな感じで動かせるようになります。
あ〜しんどかった。

ハッシュの複数の要素を配列で取得したいとき

これは知らなかったな〜(と、これは、無邪気に喜んでいたら恐ろしい事実が発覚したキロクです。

my $rh_data = {'a'=>1,'b'=>2,'c'=>3};
printf("%d,%d,%d\n",@{$rh_data}{qw(a b c)});

結果:
 1,2,3

Perl Hacks P.145 のコードを眺めていて気付きました。

Perl Hacks ―プロが教えるテクニック & ツール101選

Perl Hacks ―プロが教えるテクニック & ツール101選


ちょっと思いもよらないコードなので、なぜこのようなアクセスが出来るかについて、次のように考えてみました。

@{$rh_data} をすることによって、配列('a',1,'b',2,'c',3) になり、
('a',1,'b',2,'c',3)に{} をつけて参照することによって、結局ハッシュとして
評価されているのかな?

↓

んじゃ、配列に{} をつけてテストしてみよう
my @d = qw(a 1 b 2 c 3);
printf("%d,%d,%d\n",@d{qw(a b c)});

結果:
 0,0,0

…ダメじゃん orz

ん?もしや…

$hash{field}
は、ハッシュの1要素を返すが、
@hash{qw/fields/}
は、ハッシュの複数の要素を配列として返す機能がもともとあるのでは!?

perlsh で実験。

main[1]$ @d = qw/1 2 3 4 5 6/;   # 準備その1
1
2
3
4
5
6
main[2]$ %d = qw/a b c d e f/;   # 準備その2
a
b
c
d
e
f
main[3]$ @d{a,c,e};  # いざ実験
b
d
f

あーほんとだ!w
@d{} で書いた場合は、@d (準備その1)はそもそも無視で、%d (準備その2)で定義した中の要素にアクセスできているな。
やべっ

技だと思ったのですが、そもそも技でも何でも無かったかも…。
これは恥ずかしい(><)

perldoc をless で表示させる方法

perldoc コマンドでドキュメントを参照するとき、標準ではページャーがmore に指定されており、何かと不便を感じる。

例)
perldoc -m Plagger

less にしたい!

こういうときは、環境変数PERLDOC_PAGER を指定してあげればいいようです。

例)sh,bash,zsh の場合
export PERLDOC_PAGER=less

また、perldoc perldoc で"便利(useful)"と紹介されている次の設定もいいと思います。

export PERLDOC_PAGER='less -+C -E'

less のオプションの意味は次の通り。

オプション 効果
-+C 表示する前に画面の表示をクリアーする
-E 表示がファイル末尾に到達したとき、自動的にページャーを終了する

※-C ではなく、-+C と書いてあることについてその意味がよく分かっていない…


以上、こんな感じでいけます。

+{ って何だろう?

Plaggerソースコードで気になる記述が。

/usr/lib/perl5/site_perl/5.8.8/Plagger% ack '\+{'
Plugin/Publish/CHTML.pm
82:    $self->add(+{

Plugin/CustomFeed/Frepa/RecentComment.pm
33:        push(@msgs, +{

Plugin/CustomFeed/Frepa/FriendDiary.pm
25:        push(@msgs, +{
46:        $item = +{ subject => $6, description => $7};

Plugin/CustomFeed/Frepa/FriendStatus.pm
25:        push(@msgs, +{

この、+{ って何だろう??

  1. についてリファレンス(O'REILLY プログラミングPerl)を調べてみましたが、この説明はないようでした!

-d_ ってなあに?

Plaggerソースコードの中に、私の知らない表現があったので興味を惹きました。

% ack "\-d_"
Plagger/Cache.pm
11:    mkdir $conf->{base}, 0700 unless -e $conf->{base} && -d_;

おお!?"-d_"のアンダーバーの部分って何!?

Perl のリファレンスで探したところ、これは特殊ファイルハンドルとのこと。

_ (下線)
  最後に成功したstat, lstat, またはファイルテスト演算子(-w $fileや-d
  $fileなど)の情報をキャッシュするのに用いられる特殊ファイルハンドルである。

プログラミングPerl VOLUME2 P.778より

プログラミングPerl〈VOLUME2〉

プログラミングPerl〈VOLUME2〉


なるほど。では、次のテストコードで確かめてみよう。

% cat test.pl
open FH,"dummy.txt" or die $!;

print "come1\n" if(-f FH);
print "come2\n" if(-d _);
print "come3\n" if(-f _);
print "come4\n" if(-d_);        # oops!
print "come5\n" if(-f_);

% touch dummy.txt
% perl test.pl
come1
come3
come4				# oops!
come5


あれ? ディレクトリでないはずのFH がディレクトリとして判定(# oops!、の部分)されている。これはなぜだろう!?