スタッフブログ
なおとです。
古い話になるのですが、今年の4月にあった第32回PHP勉強会で知ったことを、最近になって活用しました。ためになったのでそれを紹介したいと思います。 ベイエリア情報局「ライブラリが直接実行された場合はプログラムとして実行する」(btoさん)です。
前回私が書いたブログ記事の続きでもあるのですが、作りたい機能がXOOPSの中での処理だけでなく、CRON経由でCLI(コマンドラインインターフェイス)のphpを併用することがあります。
例えばなにかメールを送る機能があったとして、その場で送るのと、あとから非同期に(CRONから叩いて)送る場合と、2パターンがあるとします。 具体的な処理としては「送るメールの文面をつくる」「メールを送る」など、共通しています。XOOPSではPHPMailerというライブラリを使って送信する機能が盛り込まれているので、できるだけそれを使います。 ただし直接利用するだけでなく、ビジネスロジック側にすり寄せた、使いやすいようなインターフェイス(独自のクラス)を通して使ったりします。 これには、送信の記録を含むアプリケーション・ログを記録する部分を実装したります。
ここからはやり方次第なのですが、クラスを書いた部分以外に、同じファイルを読み込んで処理するような作りになる場合もあります。 例を具体的に挙げると、あるモジュールのアクションとして使われているスクリプトを、CLIからも呼び出すようなやり方です。
その中身は例えばなのですが、簡略化するとだいたいこんな感じになります。<?php global $xoopsOption, $xoopsConfig, $xoopsDB, $xoopsUser, $xoopsModule; if (check_exec($argv)) { $xoopsOption['nocommon'] = 1; require_once dirname(dirname(__FILE__)) . '/public_html/mainfile.php'; $mydirname = basename(dirname(dirname(__FILE__))); $mydirpath = XOOPS_ROOT_PATH . '/modules/' . $mydirname; $mydirurl = XOOPS_URL . '/modules/' . $mydirname; require_once $mydirpath . '/mytrustdirname.php'; // set $mytrustdirname $mytrustdirpath = XOOPS_TRUST_PATH . '/modules/' . $mytrustdirname; $root =& XCube_Root::getSingleton(); $root->mController->executeCommonSubset(); } if (!defined('XOOPS_TRUST_PATH')) die('set XOOPS_TRUST_PATH in mainfile.php'); // mail送信など実際の処理(省略) $mail = new MyMail($mydirname); (snip) function check_exec($argv) { // コマンドラインか判別する // HTTPD経由だと$argvは未定義 if (isset($argv[0]) and (__FILE__ === realpath($argv[0]))) { return TRUE; } return FALSE; } ?>
私の中ではこの辺の「これ」というノウハウはまだ持てていなくて、試行錯誤をしながら(つまったりして)開発しています。 面白味がある部分です。
ちょっとしたことなのですが、さっと検索してパッと見つかって、それが使えると分かればどんどん使うのが、できるエンジニアだと思います。
まとまりのない感じですが、そんなことがありました。
こんばんわ。なおとです。
つい最近の仕事のことですが、CRONを使った自動実行について手間取ってしまったので、復習をしておきます。 以下はあくまで一例で、OSの違いなどでバリエーションがありえます。
CRONTAB
- ユーザ毎のCRONTAB
- /var/spool/cron/∗ など
- システムのCRONTAB
- /etc/crontab [600 or 644] root
- /etc/cron.d/∗ [600 or 644] root
あるCRONのジョブを実行するタイミングと、その内容を登録するところです。/etc/crontabはできるだけ編集しないのが作法です。
典型的なタイミング(毎日深夜、など)で実行する処理は、ここで登録しなくても用意されているディレクトリにスクリプトを置いておけば、実行されます。
システムのCRON用スクリプト
実際にはCRONTABの中では複雑なことは書きづらいので、シェルスクリプトなどを登録しておきます。目的の処理をする実体は、そのスクリプトの中に記述します。
- /etc/cron.daily/∗ [755] root
- /etc/cron.hourly/∗ [755] root
- /etc/cron.monthly/∗ [755] root
- /etc/cron.weekly/∗ [755] root
- ほか [755] ∗ など
CRONTABをユーザーに持たせるとどこにいったのか分かりにくくなることがあるので、できれば避けます。今回もその辺を整理してすっきりしました。
CRONとapacheで共通の処理対象があるとき
CRONのジョブからなにかファイルを生成するとき、apache httpdからも同じディレクトリ/ファイルを操作することがある場合には、ファイルやディレクトリの所有者、実行権限に気をつけます。具体的には次のような仕込みをします。
共用するユーザは、ある共通のグループ(たとえば、apacheグループ)に参加させておきます。 生成されるファイルを置くディレクトリには、セットグループIDをつけておきます。
CRONのジョブは、rootではなくapacheユーザで実行します。 システムのCRONTABでは、実行時のユーザを指定するようになっているので、/etc/cron.d/を使います。
そこに登録しておいたスクリプトの実行時ユーザはapacheになり、生成されるファイルの所有者とグループもapacheになります。 以上です。
ここにFTPやファイル共有なども絡むともう少し考えることが多くなるかもしれませんが、だいたいこれでOKです。 こういうことは忘れやすいので、ときどきは実際に手を動かしておかないと身につかないものですね。
なおとです。今回は業務とも技術とも絡まない話題をします。
ご存知の通り、Web業界のエンジニアというのはデスクワーク中心、しかも手先だけでなく、いかに頭を使うかが問われる仕事です。そんなに毎日を送っていると、運動不足、ストレスがたまった状態に陥りがちです。最早よくある話です。そこで私が実践している、日頃の運動について語ってみたいと思います。
朝はどうにも忙しいのですが、弊社は帰りが比較的早くて、そうでなくても帰り道でもなければ運動をする機会ってなかなかないものです。 私は会社帰りに、神田淡路町から茗荷谷までを歩きます。道のりはだいたい丸ノ内線に沿って、調子に合わせて途中で電車に乗ったり、そのまま池袋まで行くこともあります。
弊社への道順の番外編をどうぞ。
こんにちわ。なおとです。
今日はいつもよりも開発よりの話題をしたいと思います。 それは、Subversionからチェックアウトしたディレクトリ以下から、.svnディレクトリを削除する方法です。
.svnディレクトリには、バージョン管理のためのメタデータが格納されていて、プログラムそのものの動作には影響しないものです。 これを綺麗に消してしまう方法を検索してみると、LinuxなどのUNIX系の環境では、シェルからワンライナー1発で解決する方法が見つかります。
それでまたくOKなのですが、Windowsユーザーでも使えるようなPerlスクリプトを書いてみました。 きっと誰が書いても同じようなことになると思います。
こういった短いスクリプトを「書き捨て」にできるのが、できるエンジニアと言われる条件のひとつのようです。 しかし私は書き捨てにせず、こうしてブログのネタに再利用しています^^;;。
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use File::Path;
# rmtree .svn dirs
# 検査したいディレクトリの親のpath
use constant BASE_DIR => '/var/www/';
# 検査したいディレクトリ名のリスト
use constant TARGET_DIRS => ('html', 'xoops_trust_path');
for my $dir (TARGET_DIRS) {
find(\&del_svn, BASE_DIR . $dir);
}
sub del_svn {
rmtree($_, 1, 1) if (-d $_ and $_ eq '.svn');
}
RYUSのなおとです。先週末はLL Futureに第35回PHP勉強会と、盛りだくさんでした。でも両方とも遅刻してしまいました・・・。
さて今回話題にするのは、NONEモジュールです。これはほぼなにもしない、いわば骨組みだけのモジュールです。2003年頃にXOOPS2向けに公開されたようです。
モジュールについて勉強する過程で、これを知りました。しかし残念なことにEUC-JP固定で作られているようでした。
私は普段、最新のXOOPS Cube Legacy、例えばホダ塾ディストリのバージョン1.0.2を使うことが多く、サイトをUTF-8で構成したりします。そこで今回、NONEに言語ファイル対応部分だけ付け加え、japanese, english, ja_utf8の言語ファイルを用意しました。
D3対応のnone
実は後で気付いたのですが、d3noneというモジュールが既に存在するようです。もちろん言語ファイル対応で、モジュールを簡単に複製可能な仕様の、いわゆるD3対応です。これをみると、自作モジュールをどうしたらD3対応にできるかの、理解の参考になります。
d3noneをみて悔しかったので、ちょっと違う方向性でまとめてみました。
もともとのNONEは、モジュールの作り方を知るための教育的な位置づけも意図されていたと思います。原点に回帰して、xoops_trust_pathやaltsysなどのD3対応をしない、言語ファイル対応だけに集中してみました。
しかしこの半端さ、これにどういった意味があるのか分かりませんが、こっそり公開してみます。
この業界には同名(naoto)の先達が結構いて、何と名乗っていいいか考えてしまう、なおとです。
以前にも少し触れましたが、この春からEmacsに復帰しました。 特に最近、集中して開発できるよう訓練しつつ、便利機能の習得に勤しんでいます。 だんだんと、手が動くようになってきました。 それでもまだ、2ストロークがすんなり出てくるところまでは行けていないです。
使っているのは、VMware上のUbuntu8.04でEmacs22 GTKなのですが、カーソル移動に一部マウスも使います。 しかしスクロールマウスを有効にしていても、実際にはキーアサインが外れていて、機能しない状態でした。 それでも普段はC-v,M-vとか使うので問題はあまりないのですが、作業中の姿勢を少し変えたいときとか、ふとマウスで動かしたくなることがあります。 あとはブラウザと往復しながらコピペする時とか。
そこでちょっと暇を見つけて調べてみたら、簡単に見つかりました。
;; wheel mouse
(mouse-wheel-mode)
(global-set-key [mouse-4] 'previous-line)
(global-set-key [mouse-5] 'next-line)
(global-set-key [C-mouse-4] 'scroll-down)
(global-set-key [C-mouse-5] 'scroll-up)
これで快適です。CTRL押しながらだと速く移動します。
あとは、漢字変換はなかなか慣れないです。 いままでWindowsのIMEでは、モードの切り替え(変換)にFキーを使っていて、デスクトップの他のアプリはほぼ同じ操作感なのですが、Emacsの中だとAnthy.elで、それが違ってしまうのがしっくり来ません。
逆にEmacsでは様々なキーを使うので、そこでSCIMが有効になっているとぶつかることも多いので、起動時のオプションで
env XMODIFIERS=@im=none /usr/bin/emacs22-gtk
としてSCIMが反応しないようにしました。それで、英数字を書きたいときに同じ操作でできず、諦めて英数字を抜かして文章を書いて、あとで英数字を書き足すなどということをしたり……。
それも先ほど調べました。うーん、キーバインドは変えすぎても他でツブシが効かない体になっても困るし。これを覚える方がいいのかも。
- l :: 英数字モードに切り替える
- C-j :: かな漢字モードに切り替える
- q :: カタカナモードに切り替える
こんにちわ2回目のなおとです。
今日はRYUSの伝統?に倣って、XOOPS Hackネタをご披露します。
とはいえ私も若輩の身、お手軽なHTMLテクニックで行きたいと思います。
題のとおりなのですが、google-code-prettifyを使った、プログラム・コードのシンタックス・ハイライトつまり色分けをします。
google-code-prettifyについては1年以上前のマイコミジャーナルの記事、「ハイライトもGoogle流 - "google-code-prettify"でソースコードに色付けを」が参考になります。
Javascriptでいろいろうまい具合にやってくれて、大変お手軽です。
これを組み込むと、フォーラムやブログで書いた、 some codes
それでは今回の肝になる部分ですが、以下のJavascript等の固まりを、HTMLの「できるだけ後のほう」に組み込めばミッション・クリアです。
その前に、外部jsと外部cssファイルは上記リンク先から入手して、サーバにアップロードしておいてくださいね。
<script src="/themes/prettify.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="/themes/prettify.css" />
<script type="text/javascript">
// fetch a list of nodes to rewrite
var preXCodeSegments = document.getElementsByTagName('pre');
for (var i = 0; i < preXCodeSegments.length; ++i) {
preXCodeSegments[i].className = 'prettyprint';
}
prettyPrint();
</script>
方法その1 テーマで
XOOPS_ROOT_PATH/themes/[mytheme]/theme.html
を書き換えます。詳細の説明は省きます。当サイトではこの手法でやっています。
方法その2 カスタム・ブロックで
管理メニューに入って、「互換モジュール >> ブロックの管理」画面の、「カスタムブロック追加」ボタンからはじめます。もちろんaltsysを使ってもかまいません。
で、上のカコミの中身をHTML(無変換)でコンテンツエリアに書きます。
タイトルは好きにしてかまいません。ただ、表示サイドは必ず「サイドブロック 右」で、並び順も99といったように、できるだけ後のほうになるように指定してください。この方法だと、ブロックのタイトルがどうしても表示されてしまうのが欠点です。。。
表示先のモジュールは「すべてのモジュール」、アクセス権はサイト管理者と登録ユーザとゲスト、つまり全部許可でいいと思います。このあたりは適宜調整してください。
ほかにも、フッターエリアを使う方法も考えられます。ただ、テーマによってはうまくいかないかも知れません。
さて。
ここでたとえば、上記のカスタマイズを一撃でクリアしてくれるようなモジュールを用意しました〜、と言えれば最高だったのですが、そこはそれ。今後の宿題ということで、皆さんもチャレンジしてはいかが?ということでお茶を濁らさせていただきます。
しまらない感じでしたが、じっさい、当ブログのように、頻繁にプログラムを書く人には効果は絶大ですよ。
先週の木曜日より株式会社RYUSでお仕事させていただくことになりました。
今回初めてブログの執筆を任されて、少々緊張と戸惑いを覚えて居マス。
新しい職場と業務になれるまで、まだもう少し時間がかかりそうです。
今日は、新しい環境にあわせてどんな開発環境を揃えたかということについて、書いてみたいと思います。
支給されたPCはワイド液晶の小さめのノートで、それとこちらもワイド液晶のいわゆるデュアルディスプレイです。OSなしモデルだったのですが、バンドルされていたWindows XPをインストールしました。
そしてこれもバンドルのMS Office 2007と、ダウンロードしたPower Point Viewer 2007もインストール。そのあとも自動更新の適用などいろいろあったのですが、ここでは割愛します。
次にブラウザにFirefox3、そしてメーラーはThunderbiredを選びました。
何のことはなく、いつも使っているものをチョイスしただけです。
ほかには、
- TortoiseSVN
- Poderosa
- WinSCP
- WinCVSごった煮版
ここからはさらに趣味が出てくるかもしれませんが、
- LHAユーティリティ32
- マルチフォーマット画像ビューアGV
- 窓の手2004
- LimeChat2
- OpenOffice.org 2.4
以外にたくさん入ります。でも肝心の開発言語の環境はまだです。
じつは開発にはUbuntu Linuxを使いたかったので、VMware Playerで動かすことにしました。
8.04LTS 日本語ローカライズドdesktopのVMwareイメージを使いました。
というわけで、Ubuntuの中でもまたインストール、インストールです。
それでも、はじめから比較的そろているのと、パッケージマネージャのSynapticで選ぶだけなので手間はそれほどでもありませんでした。
このあと、ローカルで動かすApacheを整えたり、社内で使うWebアプリなんやらのアカウントを設定したりでまだまだ落ち着かないような状況です。
さて、もっとも肝心かなめ、エディターは、、、
社内ではVIMを使う流れのようなものがあるような気がしますが、あっさりとGNU Emacs 22 GTKを使っています。先月あたりから、8年ぶりにEmacsに帰ってきました。
すっかりキーバンドも忘れていますが、ぼちぼちなれていきたいと思っています。