Hatena::ブログ(Diary)

外と中を比べてみる このページをアンテナに追加 RSSフィード

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 年 12 月 07 日 (月)

ラノベのデータベースサイト「ラノブラリ」

ラノベのデータベースサイトを作ってみました。随時シリーズを追加、機能も追加していきます。

2009 年 10 月 27 日 (火)

お問い合わせフォームを作る

特徴?

  • 送信内容を保存するのに Session を使ってみた。
  • 本文さえあれば匿名でも送れます。
  • Qdmail を使います。
    /app/controllers/components/qdmail.php に設置してください。
  • jQuery を使います。
    /app/webroot/js/jquery.js に設置してください。

サンプル画面

スタイルシートはついてないですよ。

↓送信フォーム

f:id:freamist:20091027003941p:image

↓確認画面 (送信するとフォームがフェードアウトして消える)

f:id:freamist:20091027004420p:image

↓メール

f:id:freamist:20091027013951p:image

続きを読む

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 テーブル。

フィールド名説明
idintAUTO_INCREMENT PRIMARY KEY
perioddatetime締め切り時刻を Y-m-d H:i:s で保存
completedintDEFAULT '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 フィルタリングになります。ブラックリストには ももーい鯖のブラックリスト を利用します。

続きを読む