パーソナルツール
現在の場所: ホーム takalog
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
« 2012March »
Su Mo Tu We Th Fr Sa
        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
このBlogについて
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。 zope/plone関係の技術的な内容については http://takanory.net の方にまとめていこうと思います。 コメント・ツッコミはご自由にどうぞ。
twitter facebook linkedin foursquare
カテゴリ
android (16)
av (27)
books (35)
coreblog (49)
ds (22)
emacs (8)
ferret (24)
google (34)
icecream (44)
lego (70)
mac (22)
misc (74)
moblog (277)
movie (33)
pc (44)
plone (338)
puzzle (42)
python (57)
server (67)
snowscoot (9)
software (125)
sports (32)
suidou (30)
winds (47)
 
文書操作

退職しました

作成者 takanori投稿日 2012年03月02日 16時57分 最終変更日時 2012年03月03日 19時07分
PyCon mini JPのJob Board

あんまりこのブログには仕事のこととかは書いていないんですけど、「退職エントリを書くまでが退職です」と言われたので書いとこうかと思います。

2012年2月29日に退職 して、 3月1日から新しい会社で働き 始めました。

で、まぁここでなんで退職してなんでそこに入ったか何をするかとか書いたりするんですけど、それもつまらないので最終日に作成した退職メールを送るまでの道のりについて書きます。

手順としてはこんな感じでする。

  • 送信先メールアドレスの抽出
  • メールアドレスの名寄せ
  • 送受信数によるランク分け、メッセージを追加
  • メールを送信

メールアドレスの抽出

まずはメールアドレスを抽出します。

私は過去メールを Maildir 形式で保存しています。 これらのメールを以下のようなスクリプトで走査して、私と直接メールをやりとりした社内の人のメールアドレスをとりあえず抽出します。

コードを書いた時の個人的なポイントはこんな感じです。

  • mailbox.Maildir で Maildir フォルダから各メールファイルを読み込む。
  • rfc822 を使用してメールアドレスのみを抜き出す。
  • set とか正規表現を使って、自分のメールアドレスが含まれているか、社内のメールアドレスかを調べる。
#!/usr/bin/env python

from __future__ import print_function
import mailbox
import rfc822
import re

# 自分のメールアドレスの一覧
my_address = set(['takanori@kuzo.spam.com',
                  'takanori@kuzo.ham.jp',
                  'takanori@spam-inet.or.jp',
                  'takanori@egg.spam-inet.or.jp'])
# 社内のメールアドレスのドメイン一覧
domains = re.compile('@((egg.)?spam-inet.or.jp|cii.spam.co.jp|spam.com|mk.ham.jp|kuzo.ham.com|kuzo.spam.jp)$')

# 社内のドメインに合致するメールアドレスを書きだす
def find_to_addr(addr_set, str, ffile):
    for addr in addr_set:
        if domains.search(addr) != None:
            print("%s %s" % (addr, str), file=ffile)

# 関連するメールアドレスをファイルに書きだす
def address(fromaddr, tolist, cclist, ffile, tfile):
    toset = set(tolist)
    ccset = set(cclist)
    # From が自分のメールアドレス
    if fromaddr in my_address:
        find_to_addr(toset, "To", ffile)
        find_to_addr(ccset, "Cc", ffile)
    # To、Cc に自分のメールアドレスを含んでいる
    if len(toset & my_address) != 0:
        if domains.search(fromaddr) != None:
            print("%s %s" % (fromaddr, "To"), file=ffile)
    if len(ccset & my_address) != 0:
        if domains.search(fromaddr) != None:
            print("%s %s" % (fromaddr, "Cc"), file=tfile)

if __name__ == '__main__':
    # 結果を保存するファイル
    ffile = open("from-me.txt", "w")
    tfile = open("to-me.txt", "w")
    maildir = mailbox.Maildir("~/Maildir", None, create=False)
    for folder in maildir.list_folders():
        # 条件に合致するフォルダのみを検索する
        if folder.find("ham") != -1:
            folder = maildir.get_folder(folder)
            for key in folder.iterkeys():
                try:
                    message = folder[key]
                    # From, To, Cc のメールアドレスを取得
                    fromaddr = rfc822.parseaddr(message['From'])[1].lower()
                    tolist = [i[1].lower() for i in rfc822.AddressList(message['To'])]
                    cclist = [i[1].lower() for i in rfc822.AddressList(message['Cc'])]
                    address(fromaddr, tolist, cclist, ffile, tfile)
                except:
                    continue

メールアドレスの名寄せ

属するネットワークが変わったり、会社名が変わったりしてメールアドレスが変更しているため、本当は同一なメールアドレスになるように名前を変換します。

ここは単純に sed とかを使用して置換しました。

正規化した後は出現数(何回メールをやりとりしたか)を調べるために sort | uniq -c します。

送受信数によるランク分け、メッセージを追加

次に送受信数でランク分けします。私の場合は from/to のそれぞれのファイルから以下のようなフォーマットの csv ファイルを作成しました。

メールアドレス, 自分From相手To, 自分From相手Cc, 相手From自分To, 相手From自分Cc

こんな感じのコードで上記の csv ファイルを生成しました。 辞書型にデータを入れて最後に出力します。

できあがった CSV ファイルに対して送受信数が多い順にソートしたり、メッセージを追加した CSV ファイルを作成します。私はここの処理は Microsoft Excel を使用しました。

#!/usr/bin/env python

if __name__ == '__main__':
    summary = {}
    # 自分が From で "受信数 受信メールアドレス To/Cc" フォーマットの
    # ファイルを読み込む
    with open("from-me2.txt") as f:
        for line in f:
            (num, addr, tocc) = line.split()
            if not summary.has_key(addr):
                summary[addr] = ["0", "0", "0", "0"]
            if tocc == "To":
                summary[addr][0] = num
            elif tocc == "Cc":
                summary[addr][1] = num
    # 相手が From で "送信数 送信メールアドレス To/Cc" フォーマットの
    # ファイルを読み込む
    with open("to-me2.txt") as f:
        for line in f:
            (num, addr, tocc) = line.split()
            if not summary.has_key(addr):
                summary[addr] = ["0", "0", "0", "0"]
            if tocc == "To":
                summary[addr][2] = num
            elif tocc == "Cc":
                summary[addr][3] = num
    for key in summary.keys():
        num = summary[key]
        print "%s," % key,
        print ",".join(num)

メールを送信

最後に作成したメールアドレスとメッセージのデータを下にメールを送信します。

以下のような csv ファイルを元データとしてメールを送信します。

メールアドレス1,個別メッセージ1
メールアドレス2,
メールアドレス3,個別メッセージ2
メールアドレス4,

上記のデータを入力ファイルとして、退職メールを個別に送信します。 基本的にはテンプレートのメッセージを各メールアドレスに対して送信しますが、 個別メッセージが指定されている場合は個別メッセージを挿入します。

なお、ファイルの文字コードがきちんと合っていないと動作しないので、ご注意ください。 私の場合は全て utf-8 で揃えました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

import smtplib
from email.mime.text import MIMEText
from email.Header import Header

# デフォルトの個別メッセージ
MESSAGE = u"お世話になりました。また会う日までごきげんよう。"
# 送信するメッセージ
TEXT = u"""鈴木たかのりです。

Subject のとおりですが、2012年2月29日で退職します。
(中略)
なにかあればいかに連絡ください
Twitter: http://twitter.com/takanory
Facebook: http://www.facebook.com/takanory.net

%s
"""

if __name__ == '__main__':
    me = "Takanori Suzuki <takanori@kuzo.ham.jp>"
    encoding = 'utf-8'

    with open("address-list.csv") as f:
        for line in f:
            (addr, message) = line.rstrip().split(",")
            # メールの本文を作成
            if len(message) < 2:
                message = MESSAGE
            else:
                message = unicode(message, encoding)
            # 個別メッセージを挿入
            msg = MIMEText(TEXT % message, 'plain', encoding)
            # メールのヘッダを設定
            msg['Subject'] = Header(u'退職のお知らせ', encoding)
            msg['From'] = me
            msg['To'] = addr
            msg['Reply-To'] = "takanori@hogehoge.net"

            # メールを送信する              
            print "To:", addr
            s = smtplib.SMTP()
            s.connect()
            s.sendmail(me, addr, msg.as_string())
            s.close()

こんな感じで無事数百人の人に退職メールを送信することができました。 大量の「すでの存在しないメールアドレスです」というエラーメールが返って来ましたが。

みなさんも退職するときには参考にしてみてください。

カテゴリ
python python
トラックバック用URL:
http://takanory.net/takalog/1284/tbping

Mac + Emacs + Wanlderlust + w3m で HTML メールを表示する

作成者 takanori投稿日 2012年03月06日 13時33分 最終変更日時 2012年03月08日 09時57分
emacs-w3m で HTML メールを表示

Mac の Emacs の Wanderlust でメールを読み書きできるようにする の続きです。前提として上記の手順(Mac に Emacs をインストールしてメールの読み書きができる)が終わっていることとします。

Mac の homebrew で入る w3m はちょっと問題があるらしいので、自分でコンパイルして、最新版の emacs-w3m をインストールします。

Mac に w3m をコンパイルしてインストール

homebrew で入る w3m はちょっとバージョンが古くて落ちたりするので、インストールし直します。

$ brew edit bdw-gc
$ brew install bdw-gc
$ brew edit w3m
$ brew install w3m

edit するところで、 Formura ファイルとやらを修正します。変更点はダウンロードするアーカイブのバージョンを最新にしたり、 w3m にパッチをあてたりしています。

どのように修正するかは、下記の参考リンクを見ていただくほうがよいかと。これで最新版の w3m がインストール出来ました。

$ w3m -version
w3m version w3m/0.5.3, options lang=en,m17n,image,color,ansi-color,mouse,menu,\
cookie,ssl,ssl-verify,external-uri-loader,w3mmailer,nntp,ipv6,alarm,mark

参考: Lion+homebrew で w3m が動かなかったのがなんとかなったヒャッハー: 麦汁三昧

emacs-w3m をインストール

次に Emacs 上で w3m を使えるようにするために、 emacs-w3m をインストールします。

最新版は cvs から落としてくるんですがいくつか足りないファイルがあるので emacs-w3m-1.4.4 からコピーします。

$ cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot co emacs-w3m
$ wget http://emacs-w3m.namazu.org/emacs-w3m-1.4.4.tar.gz
$ tar xfz emacs-w3m-1.4.4.tar.gz
$ cp -pr emacs-w3m/* emacs-w3m-1.4.4
$ cd emacs-w3m-1.4.4
$ ./configure
$ make EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs 
$ make EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs install

設定ファイルに記述を追加

~/.emacs.d/init.el に emacs-w3m をメールの表示時に有効にするための設定を追加します。

(require 'mime-w3m)

これでトップの画像のように HTML メールを表示するときに emacs-w3m を使用してある程度それっぽく表示されるようになりました。

カテゴリ
mac mac
emacs emacs
トラックバック用URL:
http://takanory.net/takalog/1285/tbping

HTML メールをブラウザで開く

作成者 takanori投稿日 2012年03月09日 01時01分 最終変更日時 2012年03月09日 01時02分
emacs-w3m で表示
Firefox で表示

一つ前のエントリで Mac + Emacs + Wanlderlust + w3m で HTML メールを表示する というのを書いたら Twitter / @okuji: @takanory 案外old-typeだったんですね。。 と言われちゃいましたが、気にせず続けます。

HTML メールを emacs-w3m である程度それっぽく見ることはできますが、レイアウトがそんなにきれいに出るわけじゃないしちょっと見にくいです。

そこで「これはブラウザで見たいな」と思った HTML メールをブラウザで見られるようにします。 方法は ~/.mailcap というファイルにどの MIME-Type のときにどのアプリケーションに渡すかという指定を書きます。 text/html 形式の場合に Firefox で開くようにには、以下のように記載します。

text/html; sh -c "open -a /Applications/Firefox.app %s\; sleep 1"

ポイントは以下の2点です

  • Mac OS X の場合 open -a アプリケーション ファイル名 と指定してアプリケーションで開く
  • 対象のファイルはテンポラリファイルのため、開く前に削除されないために sleep を入れる

これで画像のように、購入した楽器の発送を知らせる HTMLメールを Emacs 上で見たり、Firefox で見たりすることができるようになりました。 なお、Firefox で表示したい場合は [2  <text/html (quoted-printable)>] と書いてある行にカーソルを移動して v (Play current entity) を入力します。

これだけではなんなので、メールに添付してある PDF や Microsoft Office 文書も v を入力したら表示されるようにしたいと思います。 Mac OS X Lion では プレビュー というアプリケーションで、たいていのファイルを表示することができます。

そこで、以下のように ~/.mailcap に記述して、各種ファイルを プレビュー で表示するように指定します。

text/html; sh -c "open -a /Applications/Firefox.app %s\; sleep 1"
application/*; sh -c "open -a /Applications/Preview.app %s\; sleep 1"

これで、メールに添付された PDF や Microsoft Office 文書に対して v を実行すると、プレビューで参照できるようになりました。 めでたしめでたし。

参考: 設定の覚え書き: .mailcap で Preview.app を起動

トラックバック用URL:
http://takanory.net/takalog/1286/tbping

セブンイレブンのスター・ウォーズキャンペーンでLEGOがあたった

作成者 takanori投稿日 2012年03月11日 02時16分 最終変更日時 2012年03月12日 17時11分
レゴ スター・ウォーズ
抽選画面
大当たり!!!!

コンビニのセブンイレブンでは、スター・ウォーズの3D公開を記念して STAR WARS エピソード1/ファントム・メナス 3D キャンペーン をやっています。

キャンペーンの内容は以下のとおりです。

  • パンを買ってポイントを貯めて各種プレゼントを抽選でプレゼント
  • カップ麺を2個買うとふたどめフィギュア(2種類)
  • お菓子を2個買うとクリアファイル(5種類)
  • ソフトドリンクを買うとベアプリック(8種類)

このうち、クリアファイルはなかなかできもよく、5種類コンプリートしました。

ここで書くのは、「パンを買ってポイントを貯めて」というものです。これはセブンイレブンの オリジナル焼きたてパン を200円分買うごとに1ポイントが入手でき、そのポイントを貯めてプレゼントに応募するというものです。 パンを買うと200円ごとにレシートの一番下にシリアルナンバーが印刷されるので、この番号をキャンペーンサイトに登録します。 ちなみに600円分買うと、ちゃんとレシートに3ポイント分シリアルナンバーが印刷されます。

一人でパンを食べてもなかなかポイントがたまらないので、会社で「朝パンを食べたい人がいたらパシリます!!」と宣言し、 Google スプレッドシートで「パシらせシート」を用意して買ってきて欲しいパンを買いてもらうようにしました。 そうして メロンパン買い占め たりして、ポイントを貯めて抽選に挑みました。

肝心のプレゼントはポイントごとにいかのようなものがありますが、欲しいものは5ポイントコースの「レゴ スター・ウォーズ(ダース・モール プレミアムミニフィギュア付き)」一択です。

  • 2ポイント スター・ウォーズnanacoカード
  • 3ポイント HOME STAR R2-711(R2-D2 をセブンイレブンカラーにとかねーわー)
  • 5ポイント レゴ
  • 8ポイント ダース・モール&ダース・ベイダーフィギュア

で、2日のパシリの成果で10ポイントたまったので、応募してみました。サイト上でボタンを押すとすぐに当たりか外れがわかります。

結果は...タイトルにも書いているとおり、いきなり当たりました。やったーーーー。 ぶっちゃけ、どっちのモデルも旧モデルだけど持っているので。ミニフィギュアがプレミアムらしかったんで欲しかったんですよねー。 いやーまさかいきなり当たると思わなかったんで、びっくりしました。

パシリを終了させようかと思ったんですが、「もう一個も当てよう」との要望が多かったので、パシリを継続しようと思います。 ちなみに商品のレゴは4月以降に届くそうです。

カテゴリ
lego lego
movie movie
トラックバック用URL:
http://takanory.net/takalog/1287/tbping

Powered by vine linux, python, zope, plone, coreblog