OpenPNEを入れると、フッターに

  • OpenPNEとは
というリンクが表示され、OpenPNEの公式サイトへリンクが貼られています。少し調べたところ、2系の始めの頃と3系ならば、このフッターをいじれるようなのですが、2.14では管理画面からこのフッターをいじることができません。

どうなっているんだろう、と色々ファイルを探しまわったところ、以下のSQL文を発見。
$ grep 'http://www.openpne.jp/about/' -r . ./setup/sql/mysql40/install/install-2.14-insert_data.sql:
INSERT INTO `c_siteadmin` VALUES (NULL,'inc_page_footer_before','<a href=\"./?m=pc&amp;a=page_o_sns_kiyaku\" target=\"_blank\">利用規約</a> <a href=\"./?m=pc&amp;a=page_o_sns_privacy\" target=\"_blank\">プライバシーポリシー</a> <a href=\"http://www.openpne.jp/about/\" target=\"_blank\">OpenPNEとは</a>;',NOW());
どうやらセットアップ時にフッターはDBに追加されるようです。ということで、c_siteadminテーブルを少し弄って「OpenPNEとは」のリンクが削除出来ました。
このブログと写真サイト"By-Natures"(最近更新していません...すみません。)は、sakuraのレンタルサーバを借りて運営しているのですが、友人のsakuraの設定をした際にCGIが動かずにハマッてしまったのでメモしておきます。

プラン:さくらのマネージドサーバ
概要:共有サーバでは他ユーザもいるため、サーバのリソースをフルに活用することは出来ないが、1ユーザで占有することでそれが可能になるとのこと。ただし共有サーバと同じく、root権限は奪取出来ない。

ということで、基本的には共有サーバで設置するような間隔でCGIを設置すればいいのですが...どうにも動かない。試したのは次の簡単なPHPスクリプトです。
<?php
echo "Hello world!"
?>
ただのハローワールドですね。このスクリプトの権限は755や705と、sakuraのマニュアルに書いてある通りにしたのですが...Internal Server Error(500)が出て、うまく動いてくれません。

結論から言いますと、公開するファイルはwwwディレクトリ配下に設置しているのですが、このwwwディレクトリも755などに設定し、他人が書き込めないようにする必要がありました。占有サーバということで、sakuraの設定が悪いんじゃないか!?と疑って掛かっていて、さらにエラーログがユーザ権限的に見れないのでなかなか気づかなかったです。

これって共有も占有も、ApacheのsuExecを用いて実装してるんだと思うんですけど、/usr/bin/配下の各コマンドのパーミッションまで丁寧に分類されていましたし、ユーザにうまく住み分けさせるのは凄いなぁと感じました。
S式を変換していて、quoteの扱いにつまずいたので備忘録として...

quoteとは、(quote datum) で、「datumそれ自身を返します。」とR5RSで説明されています。これだけだとよく分かりませんが、シンボルを作りたいときにquoteを用いたり、リストを簡潔に表現したりするのにquoteを用います。(quote datum)の代わりに、'datum としても構いません。
gosh> 'a
a
gosh> (quote a)
a
gosh> (list 'a 'b 5)
(a b 5)
gosh> '(a b 5)
(a b 5)
このquote、シングルクオート「'」を用いると非常に見やすくて便利なのですが、シングルクオートはquoteの略記でしかないため、式を変換したりする場合には注意が必要です。次の簡単な例で、シングルクオートで注意すべき点をご紹介します。

gosh> (define expression '(eqv? 'sym x))
expression
gosh> expression
(eqv? 'sym x)
gosh> (cadr expression)
'sym
この例は(eqv? 'sym x)という式をS式として扱おうとしているものです。expression という変数に、S式(eqv? 'sym x)が束縛されました。これのcadrを取ると、リストとして扱えているため、'symが返ってきています。プログラムを書いているときは、「symはシンボルだ」と思ってプログラムを書いているのですが...
gosh> (symbol? (cadr expression))
#f
'sym がシンボルかどうかを訪ねると、falseが返ってきてしまいました。これは何故かを考える為に、さらに次の問いかけをしてみます。
gosh> (list? (cadr expression))
#t
もうお気づきの方もいるかもしれませんが、先ほどから述べていたように、'datum は(quote datum)の略記であり、(cadr expression)は(quote sym)なんです。これが評価されれば、symというシンボルになるのですが、まだS式を扱っているだけで評価を行っていないため、単なる(quote sym)というリストだと認識されています。

この問題に気づいたときは、リストかどうかで異なる処理をプログラムしていたため、シンボルが来るはずだと思って書いていた部分で思わぬ結果を生じていました。

これで少し時間を取ってしまいましたが、プログラム自体がこのように簡単に扱え、変換できるのはLisp族の大きな魅力だと思います。変数名なんかは変換中は全てシンボルになっていますが、明示的にstringに変換して正規表現を使ってふるい分ける...なんてこともできました。

Lisp族はマクロもとても魅力的ですので(これもやっぱりS式のおかげ!)、時間があるときにゆっくり勉強したいと思います。

勤労感謝の日

| コメント(0) | トラックバック(1)
この間の月曜日は勤労感謝の日でしたね。この日は大学に行ってWhy Programs Failという本を研究のために読んでいたのですが、インターネットを徘徊していてその日が勤労感謝の日(昔の新嘗祭らしい)だと気付きました。

ちなみにこの本は、さまざまなデバッグ手法を、バグの見つけ方・再現方法などから系統的に説明している本です。研究に直接かかわる部分は一部ですが、バグやデバッグの歴史についても書かれているので読んでいて楽しいです。時間があれば、ここにも少し紹介したいと思っています。

さて、勤労感謝の日だと気付いたのはいいのですが、毎年別に何をしてきた訳でもなく...。小さいころに肩たたき券とかあげた気がしないでもないですが、父の日・母の日に比べると少し影が薄い日かもしれません。

でもせっかく勤労感謝の日だって気付いたので、学校帰りに目黒のアトレによって両親にプレゼントを買いました。父親にはビールマグ(ビールを注ぐと、きめ細かい泡のビールが出来る...らしい)、母親にはブランケット(無印の千鳥格子の柄のブランケットで、値段の割には洒落てます)。

そして無印に寄ったついでに、アロマディフューザーを買ってきました。これは完全に自分のためです(笑)。前から欲しかったのですが、ちょっと値が張るので先送り先送りとなっていて...。この日は手持ちが十分にあったので、思い切って買ってみました。

火も使わないし、すぐ匂ってくるし、寝る前に付ければ簡易照明になるし、けっこう良さそうです。部屋が静かだと、水のピチャピチャ言う音が少し気になるかなー。ほとんど気にならないけど。

こんなものばっかり買うから、親に「草食系ね」なんて言われてしまうけれど...好きなんだから仕方ない(笑)

(condの書き換え)

| コメント(0) | トラックバック(0)

最近は大学に行ってSchemeでプログラムを組んでるのですが、Schemeを選んだ理由が

  • 慣れている
  • 字句解析が不要なので、プログラムの変換が容易
というものでした。そんな中で今回、cond式の書き換えを間違って行っていて、数日もやもやした気分でプログラムを進めていたので(笑)備忘録も兼ねてご紹介します。

cond式はC言語やJavaで言えば、if や else if、つまり
if(a==0){
  処理1
} else if(a>0){
  処理2
} else {
  処理3
}
のような感じの式で、次のような形をしています。
(cond ((eq? a 0) 処理1)
      ((> a 0)   処理2)
      (else      処理3))
これを今行っている研究のために、if式へ全て変換します。C言語やJavaでは次のように、if文の入れ子になると思います:
if(a==0){
  処理1
} else {
  if(a>0){
    処理2
  } else {
    処理3
  }
}
Schemeでは次のようになるでしょう:
(if (eq? a 0)
    処理1
    (if (> a 0)
        処理2
        処理3))
Schemeに馴染みのない方は、if式の形が妙に感じられるかもしれませんが、Schemeのif式は帰結部と代替部がelseなどで挟まれない形:
(if (条件式)
    帰結部
    代替部)
を取るので、見づらいですが正しい書式です。

ここで問題となったのは、一見単なるシンタックスシュガーに見えるcond式は、「処理1」「処理2」などとなっている部分が複数の式を許す点でif式と異なることです。if式は帰結部と代替部がカッコで覆われていないため、複数式書いてしまうとどれが帰結部でどれが代替部かわからなくなってしまいます。具体的にはcond式は次の形がとれます。(意味のない例ですみません...)
(cond ((eq? a 0) (display "a は 0 です"))
      ((> a 0)  
(display "a は 0 より大きいです")
                
(set! a (* a a)))
      (else      (display "a は 0 より小さいです")
                 (set! a (- a))))
aが正のときには2乗して、負のときは正になるようにしてみました。その前にそれぞれdisplay を読んで文字列を表示させているので、2つの処理が行われている部分があります。

よって、これを考慮してcond式をif式に直すと次のようになります。
(if (eq? a 0)
    (begin 処理1)
    (if (> a 0)
        (begin 処理2)
        (begin 処理3)))
beginを使って、複数式実行できるようにしました。

少しSchemeを触ったことがある方なら当たり前に思われると思うのですが、変換しているときに複数式の場合までテストしなかったために、プログラム全体が完成した後に気付くことになりました。副作用がないような、ある種きれいなプログラムだとbeginを使わない変換でもうまく実行されてしまうため、プログラムによっては変な挙動を示したりしていました。
後日、cond式を始め、色々な条件式をif式へ変換するためのプログラムをご紹介しようと思います。

これは、if式のthenとelseで、式を一つしか書いてはいけないということです。C言語やJavaに慣れている方は「そんなことありえない!」と思われるかもしれませんが、代入や副作用のないプログラムならば複数式書いても意味がないのです。例えば2つの式を並べて書いたとして、代入や副作用のないプログラムで、1行目の結果が2行目に影響することはありえません。
とは言っても、画面に文字を出力するdisplayなどは副作用があり、関数型言語でも代入を許している言語も多いので、そのような場合にはbeginでくくって複数式実行できるようにします。

About

写真を主に扱うHP " By-Natures " のブログです。日々の日記や、IT技術のコラムなどを書いていけたらと思っています。

最近のコメント

2009年12月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31