2009年1月アーカイブ
wordpressをさわっています。人気が出るだけのことはあって、APIがしっかりしていますね。
ところで、こういうメニューって、企業サイトでよくあるじゃないですか?(「事業」とかにマウスを載せてみてください)
wordpressのページ機能を使って上のような階層を作ったら、そこからメニュー用のHTMLを生成してくれるプラグインというのを作ってみました。
mogya_menu_plugin-0.1.zipインストール
他のプラグインと同様に、ダウンロードして解凍して、pluginsディレクトリに配置すればOKです。
使い方
テンプレートの中で、
<div class="horizontal_menu">
<?php insert_mogya_navigationMenu(""); ?>
</div>
と書くと、その部分にメニュー用のHTMLが出力されます。style.cssの内容をご自分のテンプレートのstyle.cssに追記してあげると、上であげたようなメニューができあがります。
機能
メニューの並び順については、wordpressでの指定が尊重されます。つまり、wordpressページの編集画面で「属性-順序」の数値を変えることで、自由に並べ替えることが出来ます。
文字列だけでなく、メニューに画像を使うことも可能です。
ページの編集機能で、「navigationMenu_title」というプロパティを作成すると、メニューのタイトル部分に設定されます。たとえば、navigationMenu_titleに
<img src="/images/icon1.gif" alt="ホーム" width="83" height="18" />
と言うように記述すれば、タイトル部分にimgタグが出力されるので、文字列の代わりに画像を使ったメニューを実現できるようになります。
また、リンク先を置き換えることも出来ます。最初のサンプルで、「ホーム」というメニューがありますが、これは、navigationMenu_linkというカスタムフィールドに「/」を設定することで実現できます。もちろん、普通のWEBサイトのURLを記述すれば、そのURLへのリンクになります。
全部のページをメニューに出すのではなくて、特定のページより下だけをメニューにすることも出来ます。たとえば、「menu」というページを作ってそれより下だけ出力したい時は、
<div class="horizontal_menu">
<?php insert_mogya_navigationMenu("menu"); ?>
</div>
というふうにします。
カスタマイズ
出力されるHTMLでは、dropdown,dropdown_parent,dropdown_childというクラスが使われています。それぞれ
- dropdown_parent:親メニュー(上の例で言うなら、「会社概要」の部分)です
- dropdown_child:子メニュー(上の例で言うなら、「アクセス」「ご挨拶」の部分)です
- dropdown:dropdown_parentとdropdown_childを含むひとかたまりです
となっています。style.cssに、メニューを縦に並べる例と横に並べる例を記述してあるので、参考にしてください。
制限
ページ階層は2段階までしか対応していません。これ以上深い階層をサポートしても実用的でないような気がするので、対応する予定もありません。
まとめ
こういうのがなくて固定でHTMLを出力してしまうと、お客さんに納品した後、お客さん自身がメニューを変更できないのでとっても不便なことになります。このプラグインを使うことで、お客さんが自分でページを追加してもメニューに反映されるようになるので、なかなかいけるんじゃ無かろうか、と思うのですけど、いかがでしょう?
wordpressのプラグインは初めてなので、感想を聞かせていただけると嬉しいです。
前回紹介したExpression Web2に、PHPを扱う機能がついているそうなので、これもついでにやってみました。
結論から言うと、ApacheとかIISをインストールすることなしに、Windows上でPHPをデバッグ/実行する環境が作れるので、WindowsでPHP使う人は多少便利かも。
Expression Webのインストール
試用版をインストール。
途中、製品キーを要求されるので、「オンラインで製品キーを入手するにはここをクリックします」をクリックしてWebサイトへ。
メールアドレスも名前も不要で、CAPTCHA文字列だけ入れたら製品キーをもらうことが出来ます。
もらった製品キーを入力してインストールを続行。
バックグラウンドでダウンロードしながらインストールするので、ちょっと時間がかかります。
これでExpressionWebのインストールは完了です。
PHPのインストール
日本PHPユーザー会のサイトからリンクをたどって、Windows版PHPをインストールします。cgiサーバを聞かれた時に、「Other CGI」を選ぶのがいいみたいです。
Expression Webの設定
ここに、php-cgi.exeのパスを入力。普通に入れたら、「C:\Program Files\PHP\php-cgi.exe」になるかと思います。
作成
「新規作成→PHP」でphpファイルを作成します。
開いたファイルはデザインをいじるためのビューになっているので、コードビューに切り替えて、
なんか適当にPHPのコードを入力。ちなみにctrl+spaceでコード補完が利きます。
入力できたら、おもむろにF12をポチッとなすると...
PHPのコードが実行されて表示されます。
前回書いたとおり、IE以外のブラウザも起動することが可能です。
「Microsoft Expression 開発サーバー」という独自WEBサーバを持っているらしくて、これがphp-cgi.exeを呼び出して実行結果をブラウザに引き渡しているみたい。
この方式だと、ポート番号が毎回異なるので、このままインターネットに公開することは困難ですが、その代わり、外部から攻撃することも難しいので、VertrigoServとか、XAMPPより安全ですね。
そのほかやってみて思ったこと
[Think IT] 第2回:Expression Studioは開発に使えるのか? (3/3)
をみると、文字コードShift-JISで保存してしまうので使い物にならない、といわれていますが、ExpressionWeb2では、utf-8で保存してくれるし、変更も可能です。たぶんこれ、ExpressionWeb1の情報ですね。
ブレークポイントを貼ったり、変数ウォッチしたり出来るわけじゃないので、VisualStudioみたいな環境を期待していると物足りないかもしれません。どっちかというと、デザイナさんがちょっとページに埋め込んだPHPをデバッグしたり、HTML部分との調和を確認するための機能なのかもしれませんね。
注:Expression といっても、エクスプレッションエンジンとは全然関係のない、マイクロソフトさんのツールの話です。
Webteko第四回で、wanichanという方と名刺交換させていただきました。マイクロソフト製品にめちゃめちゃ詳しい人に与えられるMVPの持ち主です。
で、そのwanichanさんから、マイクロソフト製のWEBページ製作ツール「Expression Web」というのを紹介していただきました。
わかりやすくいうと、ワードみたいな操作でちゃんとした(W3C規格に準拠した)HTMLとCSSを出力してくれるソフトウェアです。
マイクロソフトさんのHTMLというと、エクセルが出力するとんでもないHTMLが有名ですが、ExpressionWeb2は、もっと普通のHTMLとCSSを出力してくれます。
styleタグは使っていますが、思った以上にマトモでしょ?もちろんstyleタグの部分はあとでスタイルシートに直すことが可能です。
プレゼンとソースを公開します。
ソース:sendmail.lzh
あと、メールアドレスのミスを指摘してくれる入力フォームもよかったらご覧くださいませ。
2009-01-19 10:03:23
ソースがダウンロードできなかったので、圧縮した物を上げ直しました。lzhで圧縮してあるので、解凍してご覧くださいませ。
2009-01-19 19:51:28
Tempa Playground - ウェブテコ第4回終了が公開されていますね。すでに記事あげた方は、トラックバックするといいんじゃないかと思います。
linuxにはcronという、決まった時間になったら○○をしてね、と登録できるシステムがあって。crontab -e と入力すると、編集画面が起動するようになっています。
あるタスクを追加しようとして、
$ crontab -r
あ、間違えた。
$ crontab -e
no crontab for daisuke - using an empty one
・・・・using an empty one?空っぽのファイルをつかいます???
あーっ!
crontab -eと一文字違いのcrontab -rは、crontabの設定ファイルを消去するコマンドです。
となりのキーにそんな危険なコマンド当てるなよ....確認もなしにファイルを消すなよ...
こういう時のために作業ログが取られているので、そこから古いファイルの内容を拾ってきて復元できたわけですが。
これは心臓に悪いなぁ。
たいていこういうサービスは、メールを受け取ったら、中身がなんであろうと気にせずに決まった内容を返信するように作られていて。だから、「~(メールアドレス)まで空メールを送ってね!」というメールアドレスに「俺は返信してほしくないぜ!」という内容のメールを送っても、たぶん自動的に返信が帰ってきます。
そうじゃなくて、メールの本文を見て、内容が空だった時だけ特別な処理をしようとすると、これは意外と難しいです。
なぜかというと、ユーザーさんに「空メールを送ってね!」といっても、ユーザーさんが空メールを送ってくるとは限らなくて。
ありがちな例
・「入会希望」
・「資料送って」
・「よろしくお願いします」
・ -----
KEIKO ゜★・。・。☆・゜・。 ...
最後のは、携帯電話の設定で自動的にフッタがつくようになっていて、そのままメールを送ってしまったパターン。
こういうのを空メールじゃないといってしまうと、初心者の方に優しくないサービスになってしまうので、どうにかして救済しようと思うと、けっきょく、届いたメールの中身がなんであろうと空メール扱いするしか無くて。
何が言いたいかというと、メールアプリケーションで、空メールの時だけ○○、それ以外の時は○○、という処理の分け方は難しいので、そんな仕様は作らない方がいいです、という話です。
レッツノート・クリニック | マイレッツ倶楽部 - パナソニック モバイルパソコン レッツノート直販サイト | My MALL | CLUB Panasonic
1/4の朝、日通の人が取りに来て、今朝1/7に戻ってきました。
PCカードスロット蓋の修理
発送した翌日、携帯電話に電話がかかってきて、「PCカードスロットの蓋がないけど、お気づきでしたか?」との事。気づいていなかったのですが、実際無かったそうなので、修理していただくことに。保険適応ということで、ユーザー負担なしで修理していただけました。
トラックパッドのボタンの交換
こんな感じで痛んでいたのですが。交換していただいたみたいです。
細かい傷とか、どこまで直してくれるのかなぁ、と思っていたのですが、大体これくらいみたい。
キーボードのはげてきたのとか、小さな傷はそのままになっていました。

#言ったら直してくれたのかもしれない。
そのほか、内部のホコリの掃除とか、ウイルスチェックとか、バッテリの容量チェックとか、そんなことをしていただきました。
中二日で帰ってきたということは、たぶん専任の人が待っていて、受け取ったら即メンテナンス、できあがったら出荷、みたいな体制になっているのでしょう。予約制だったし。
本人も気づいていなかったPCカードスロットの件で電話してくれたり、たいへん丁寧なサービスだと思います。
相応のコストは本体価格に含まれているわけで、えらい贅沢だなぁ、という気もするのですけどね^^;
あとこれ、一台につき一回しか受けられないサービスだったらしい。しまった。それなら二年目にやってもらうべきだったな。
年末年始に外出すると混むんだもん。
で、メイドめーるでデフォルト以外のGoogleカレンダーの情報がとれない件。
なんでかというと、Googleカレンダーにアクセスするのに使っているgcalapiで、カレンダーリストを取得するAPIがみつからなかったからです。
正確に言うと、ユーザー名とパスワードを使ったらとれるのですけど、なぜかAuthSub認証の場合だけ実装されていないのです。
Googleのドキュメントを見たら、取得する方法があるみたいなので、コードを追加してみました。
module GoogleCalendar
class ServiceAuthSub
CALENDAR_LIST_PATH = "http://www.google.com/calendar/feeds/default/allcalendars/full"
# get the list of user's calendars and returns http response object
def calendar_list
logger.info("-- get_calendar_list_responce st --") if logger
auth unless @auth
uri = URI.parse(CALENDAR_LIST_PATH)
res = do_get(uri, {})
logger.info("-- get_calendar_list_responce en(#{res.message}) --") if logger
res
end
alias :calendars :calendar_list
end
end
これだけ実装してあげれば、あとは通常認証と同じコードが働くので、こんなふうにして複数のカレンダーを取ってくることが出来ます。require 'gcalapi' require 'googlecalendar/service_auth_sub' require 'googlecalendar/calendar' srv1 = GoogleCalendar::ServiceAuthSub.new(user.calendarToken) cal_list1 = GoogleCalendar::Calendar.calendars(srv1)
出来ればこのコード、本家に取り込んでいただけるとみんな幸せになるように思うのですけど。連絡つくかな?