2010 年 07 月 23 日 (金)
mailman で anonymous_list を有効にしつつ送信者のメールアドレスを From に表示する方法
要は From の部分を 送信者メールアドレス <メーリングリスト投稿先> にしちゃおう。
$ diff /usr/bin/mailman/Mailman/Handlers/Cleanse.py.orig /usr/bin/mailman/Mailman/Handlers/Cleanse.py
38a39,40
> from email.Utils import parseaddr
> senderfullname = parseaddr(msg.get('From'))[1]
45c47,48
< msg['From'] = formataddr((i18ndesc, mlist.GetListEmail()))
---
> #msg['From'] = formataddr((i18ndesc, mlist.GetListEmail()))
> msg['From'] = formataddr((senderfullname, mlist.GetListEmail())
つまり del msg['from'] の前に
from email.Utils import parseaddr
senderfullname = parseaddr(msg.get('From'))[1]
を追加。From を送信者メールアドレスではなく送信者名にする場合、[1] を [0] に変更。
msg['From'] = formataddr((i18ndesc, mlist.GetListEmail()))
を
msg['From'] = formataddr((senderfullname, mlist.GetListEmail())
に置き換えて下さい。
2010 年 02 月 22 日 (月)
ランダムな ID でデータを取得する
乱数を発生させて、ランダムな ID のデータを取得してみよう。今回は books というテーブルを使います。
以下はコントローラーに記述。
<?php function random() { $id = $this->Book->find('all', array( 'order' => 'Book.id DESC', 'fields' => 'Book.id', 'limit' => 1, )); # ID の最大値を取得 $limit = 20; # 発生させる乱数の数 # 参考: http://okwave.jp/qa/q2878543.html $array = array(); for ($i = 0; $i < $limit; $i++) { $num = mt_rand(1, $id[0]['Book']['id']); # 範囲は 1 から ID の最大値 for ($j = 0; $j < $i; $j++) { // 配列に格納済の乱数と一致するか? if ($num == $array[$j]) { break; } } // 配列に格納済の乱数と一致していれば、再挑戦する if ($j < $i) { $i--; continue; } // 初登場の数値ならば、配列に格納する else { $array[$i] = $num; } } # 検索結果表示 for ($i = 0; $i < $limit; $i++) { $book = $this->Book->find('all', array( 'conditions' => array('Book.id' => $array[$i]), # IDを検索 'fields' => 'Book.id, Book.name', # 取得するカラム )); $books[$i] = $book[0]; # 配列に入れる } $this->set('books', $books); # ビューに渡す } ?>
表示には foreach を使います。実装例は ランダム表紙 - ラノブラリ をご覧ください。
2010 年 01 月 19 日 (火)
MySQL の一般ユーザー作成コマンド
メモメモ。ユーザー名と同じデータベース名のみにデータベース操作の権限を与える場合。
http://linux.kororo.jp/cont/server/mysql_user.php
mysql> GRANT ALL PRIVILEGES ON DB名.* TO 'ユーザー名@許可ホスト' IDENTIFIED BY 'パスワード';
2009 年 10 月 27 日 (火)
お問い合わせフォームを作る
特徴?
- 送信内容を保存するのに Session を使ってみた。
- 本文さえあれば匿名でも送れます。
- Qdmail を使います。
/app/controllers/components/qdmail.php に設置してください。 - jQuery を使います。
/app/webroot/js/jquery.js に設置してください。
サンプル画面
スタイルシートはついてないですよ。
↓送信フォーム
↓確認画面 (送信するとフォームがフェードアウトして消える)
↓メール
2009 年 10 月 23 日 (金)
findAll を使って BETWEEN で検索する
今日から 1 週間後のデータを検索したい。findAll について詳しいことが書いてあった どうにかなるBLOG :: CakePHP のモデル関数 findAll から引用させていただくと
findAll($conditions,$fields,$order,$limit,$page,$recursive)
指定されたフィールドから、 (もし指定されていれば)$conditions にマッチするものを $page (デフォルトは1ページ目) ページから $limit レコードまで返す。
- $conditions: 検索条件の配列。もしくは、SQL文の where 節の文字列
- $fields: 取り出したいフィールドの配列
- $order: 並び順 order by ******* の部分の文字列
- $limit: 一度に読み込む数の上限
- $page: 何ページ目から読み込むか($limitに依存)
- $recursive: モデルのアソシエーションを何階層たぐるか(デフォルトは0)
なるほど。締め切り時刻まで残り 1 週間のタスクを昇順で 10 個取り出してみたい。そんなときに活躍する検索条件が BETWEEN です。操作するのは下のような tasks テーブル。
| フィールド名 | 型 | 説明 |
|---|---|---|
| id | int | AUTO_INCREMENT PRIMARY KEY |
| period | datetime | 締め切り時刻を Y-m-d H:i:s で保存 |
| completed | int | DEFAULT '0' で完了したら 1 にする |
<?php $today = date("Y-m-d H:i:s"); $oneweek = date("Y-m-d H:i:s", mktime(date("H"), date("i"), date("s"), date("m") , date("d")+7, date("Y"))); $this->set('tasks', $this->Task->findAll("Task.period BETWEEN '$today' AND '$oneweek'", null, 'Task.period ASC', 10)); ?>
実際に使うとしたら、こんな感じかな。
<?php # ?mode=week でアクセスしてきたら if(@$_GET["mode"] == "week") { $today = date("Y-m-d H:i:s"); $oneweek = date("Y-m-d H:i:s", mktime(date("H"), date("i"), date("s"), date("m") , date("d")+7, date("Y"))); $this->set('tasks', $this->Task->findAll("Task.period BETWEEN '$today' AND '$oneweek'", null, 'Task.period ASC')); } # ふつーなら else { # 完了していないタスクをすべて検索 $this->set('tasks', $this->Task->findAll("Task.completed = 0", null, 'Task.period ASC')); } ?>
指定された年度に作成されたものを検索してみます。
<?php $fy = @$_POST["fy"]; $fy10 = $fy. "-04-01 00:00:00"; $fy15 = $fy+1; $fy20 = $fy15. "-03-31 23:59:59"; $this->set('ledgers', $this->Ledger->findAll("Ledger.created BETWEEN '$fy10' AND '$fy20'")); ?>
これは便利だ。
2009 年 10 月 04 日 (日)
squidGuard でコンテンツフィルタリング
CentOS 5.3 x86_64 に squidGuard を入れてコンテンツフィルタリングを行います。具体的には squid (プロキシサーバ) に squidGuard を読み込ませる形になります。
コンテンツフィルタリングといってもドメイン・URI フィルタリングになります。ブラックリストには ももーい鯖のブラックリスト を利用します。



