2014-03-28

lha の RPM を作成

以前は sawaa から LHA のバイナリが配布されていたのだけれど, いつのまにかレポジトリごとなくなっていた. RPMを作成したので, specファイルを以下に書いておく.
Name:  lha
Version: 1.14i
Release: ac20050924p1.1%{?dist}
Summary: LHa for UNIX

Group:  Applications/Archiving
License: Other
URL:  http://lha.sourceforge.jp/
Source0: http://sourceforge.jp/projects/lha/downloads/22231/%{name}-1.14i-ac20050924p1.tar.gz

%description
LHA is an archiving and compression utility for LHarc/lha/lzh format archives.

%prep
%setup -q -n %{name}-1.14i-ac20050924p1

%build
%configure
make %{?_smp_mflags}

%install
make install DESTDIR=%{buildroot}

%files
%doc
%{_bindir}/lha
%{_mandir}/mann/*

%changelog
* Fri Mar 28 2014  <hoge@example.com> - 1.14i-ac20050924p1
- Initial RPM release.
ビルドするときは, 上記ファイルを ~/rpmbuild/SPEC/lha.spec という名前で作成, ソースを ~/rpmbuild/SOURCES に保存し, 以下のコマンドを実行する.
rpmbuild -ba lha.spec

以下のように, LHAの自己解凍形式のexeでもUnix上で展開することができるので, 便利である. わざわざ wine を使わなくても良い.

$ file wzrampg300nh-151.exe
wzrampg300nh-151.exe: PE32 executable (GUI) Intel 80386, for MS Windows, LHa self-extracting archive
$ lha wzrampg300nh-151.exe 
PERMISSION  UID  GID      SIZE  RATIO     STAMP           NAME
---------- ----------- ------- ------ ------------ --------------------
[MS-DOS]                  6855  45.1% Jun  8  2009 wzrampg300nh_151/howto_update_ap.htm
[MS-DOS]                     0 ****** Jun  8  2009 wzrampg300nh_151/images/
[MS-DOS]                 23369  96.9% Jan 25  2008 wzrampg300nh_151/images/wzr_fwup.png
[MS-DOS]                 33772  93.3% Jan 25  2008 wzrampg300nh_151/images/wzr_fwup_success.png
[MS-DOS]                  3416  97.2% Nov 29  2006 wzrampg300nh_151/images/wzr_system.png
[MS-DOS]                 61631  98.8% Jan 25  2008 wzrampg300nh_151/images/wzr_top.png
[MS-DOS]                  1152  38.5% Jun  8  2009 wzrampg300nh_151/Readme.txt
[MS-DOS]               5967972 100.0% May 22  2009 wzrampg300nh_151/wzrampg300nh_151
---------- ----------- ------- ------ ------------ --------------------
 Total         8 files 6098167  99.9% Mar 28 15:32

2014-03-27

dvipdfmx が埋め込む eps のフォント

LaTeX をコンパイルした DVI から PDF へ変換するには, dvipdf, dvipdfm, dvipdfmx など様々なツールがある.
そのひとつである dvipdfmx は, 内部で gs を呼び出して eps を pdf に変換する. eps のフォントを埋め込むなどの設定を変えるためには, dvipdfmx.cfg に変更を加えれば良い.
  1. dvipdfmx.cfg を探す.
    $ kpsewhich --progname=dvipdfmx --format=othertext dvipdfmx.cfg
  2. dvipdfmx.cfg をコピーし, ls-Rをアップデートする. (あるいは, ls-Rを作らない)
    $ cp /usr/local/texlive/2012/texmf/dvipdfmx/dvipdfmx.cfg ~/texmf/dvipdfmx/
    $ mktexlsr ~/texmf
    
  3. D "rungs -q -dNOPAUSE -dBATCH ..." という行に, -dPDFSETTINGS=/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=trueを追加する.

参考までに, 以下に私の dvipdfmx.cfgを示す.

$ grep -v '\(^%\|^$\)' ~/texmf/dvipdfmx/dvipdfmx.cfg
V  5
p  a4
O  0
K  40
P  0x003C
D  "rungs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -sOutputFile='%o' '%i' -c quit"
f  pdftex.map
f kanjix.map
f ckx.map
f ipaex.map

2014-03-26

OpenLPを新改訳聖書に対応させるパッチ

OpenLPは教会向けの聖書・歌詞プロジェクションソフトで, Launchpad 上で開発され, 無償で配布されている. BiblegatewayやCrosswalkなどから聖書本文を取得する機能が実装されており, 英語やフランス語, 中国語訳には対応しているが, 日本語訳にはまだ対応していない. そこで, 日本語の新改訳聖書を富山国際大学の高尾先生の検索エンジンより取得するためのパッチを書いてみた.
=== modified file 'openlp/plugins/bibles/forms/bibleimportform.py'
--- openlp/plugins/bibles/forms/bibleimportform.py
+++ openlp/plugins/bibles/forms/bibleimportform.py
@@ -52,8 +52,9 @@
     Crosswalk = 0
     BibleGateway = 1
     Bibleserver = 2
+    TUINSTakao = 3
 
-    Names = ['Crosswalk', 'BibleGateway', 'Bibleserver']
+    Names = ['Crosswalk', 'BibleGateway', 'Bibleserver', 'TUINSTakao']
 
 
 class BibleImportForm(OpenLPWizard):
@@ -212,7 +213,7 @@
         self.webBibleLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.webSourceLabel)
         self.webSourceComboBox = QtGui.QComboBox(self.webBibleTab)
         self.webSourceComboBox.setObjectName('WebSourceComboBox')
-        self.webSourceComboBox.addItems(['', '', ''])
+        self.webSourceComboBox.addItems(['', '', '', ''])
         self.webBibleLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.webSourceComboBox)
         self.webTranslationLabel = QtGui.QLabel(self.webBibleTab)
         self.webTranslationLabel.setObjectName('webTranslationLabel')
@@ -305,6 +306,8 @@
             translate('BiblesPlugin.ImportWizardForm', 'BibleGateway'))
         self.webSourceComboBox.setItemText(WebDownload.Bibleserver,
             translate('BiblesPlugin.ImportWizardForm', 'Bibleserver'))
+        self.webSourceComboBox.setItemText(WebDownload.TUINSTakao,
+            translate('BiblesPlugin.ImportWizardForm', 'TUINSTakao'))
         self.webTranslationLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible:'))
         self.webTabWidget.setTabText(self.webTabWidget.indexOf(self.webBibleTab),
             translate('BiblesPlugin.ImportWizardForm', 'Download Options'))
@@ -484,7 +487,7 @@
 
     def loadWebBibles(self):
         """
-        Load the lists of Crosswalk, BibleGateway and Bibleserver bibles.
+        Load the lists of Crosswalk, BibleGateway, Bibleserver and TUINSTakao bibles.
         """
         # Load Crosswalk Bibles.
         self.loadBibleResource(WebDownload.Crosswalk)
@@ -492,6 +495,8 @@
         self.loadBibleResource(WebDownload.BibleGateway)
         # Load and Bibleserver Bibles.
         self.loadBibleResource(WebDownload.Bibleserver)
+        # Load and TUINSTakao Bibles.
+        self.loadBibleResource(WebDownload.TUINSTakao)
 
     def loadBibleResource(self, download_type):
         """

=== modified file 'openlp/plugins/bibles/lib/http.py'
--- openlp/plugins/bibles/lib/http.py
+++ openlp/plugins/bibles/lib/http.py
@@ -59,7 +59,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class BGExtract(RegistryProperties):
     """
     Extract verses from BibleGateway
@@ -429,6 +428,153 @@
         return books
 
 
+class TTExtract(RegistryProperties):
+    """
+    Extract verses from Dr. Takao webpage on TUINS
+    """
+    _tt_bw = [
+            (u'創世記', 'Gen'),
+            (u'出エジプト記', 'Exod'),
+            (u'レビ記', 'Lev'),
+            (u'民数記', 'Num'),
+            (u'申命記', 'Deut'),
+            (u'ヨシュア記', 'Josh'),
+            (u'士師記', 'Judg'),
+            (u'ルツ記', 'Ruth'),
+            (u'サムエル記第1', '1Sam'),
+            (u'サムエル記第2', '2Sam'),
+            (u'列王記第1', '1Kgs'),
+            (u'列王記第2', '2Kgs'),
+            (u'歴代誌第1', '1Chron'),
+            (u'歴代誌第2', '2Chron'),
+            (u'エズラ記', 'Ezra'),
+            (u'ネヘミヤ記', 'Neh'),
+            (u'エステル記', 'Esther'),
+            (u'ヨブ記', 'Job'),
+            (u'詩篇', 'Ps'),
+            (u'箴言', 'Prov'),
+            (u'伝道者の書', 'Eccles'),
+            (u'雅歌', 'S_of_S'),
+            (u'イザヤ書', 'Isa'),
+            (u'エレミヤ書', 'Jer'),
+            (u'哀歌', 'Lam'),
+            (u'エゼキエル書', 'Ezek'),
+            (u'ダニエル書', 'Dan'),
+            (u'ホセア書', 'Hos'),
+            (u'ヨエル書', 'Joel'),
+            (u'アモス書', 'Amos'),
+            (u'オバデヤ書', 'Obad'),
+            (u'ヨナ書', 'Jonah'),
+            (u'ミカ書', 'Micah'),
+            (u'ナホム書', 'Nahum'),
+            (u'ハバクク書', 'Hab'),
+            (u'ゼパニヤ書', 'Zeph'),
+            (u'ハガイ書', 'Hag'),
+            (u'ゼカリヤ書', 'Zech'),
+            (u'マラキ書', 'Mal'),
+            #
+            (u'マタイの福音書', 'Matt'),
+            (u'マルコの福音書', 'Mark'),
+            (u'ルカの福音書', 'Luke'),
+            (u'ヨハネの福音書', 'John'),
+            (u'使徒の働き', 'Acts'),
+            (u'ローマ人への手紙', 'Rom'),
+            (u'コリント人への手紙第1', '1Cor'),
+            (u'コリント人への手紙第2', '2Cor'),
+            (u'ガラテヤ人への手紙', 'Gal'),
+            (u'エペソ人への手紙', 'Eph'),
+            (u'ピリピ人への手紙', 'Phil'),
+            (u'コロサイ人への手紙', 'Col'),
+            (u'テサロニケ人への手紙第1', '1Thess'),
+            (u'テサロニケ人への手紙第2', '2Thess'),
+            (u'テモテへの手紙第1', '1Tim'),
+            (u'テモテへの手紙第2', '2Tim'),
+            (u'テトスへの手紙', 'Tit'),
+            (u'ピレモンへの手紙', 'Philem'),
+            (u'ヘブル人への手紙', 'Heb'),
+            (u'ヤコブの手紙', 'Jas'),
+            (u'ペテロの手紙第1', '1Pet'),
+            (u'ペテロの手紙第2', '2Pet'),
+            (u'ヨハネの手紙第1', '1John'),
+            (u'ヨハネの手紙第2', '2John'),
+            (u'ヨハネの手紙第3', '3John'),
+            (u'ユダの手紙', 'Jude'),
+            (u'ヨハネの黙示録', 'Rev'),
+            ]
+    _tt_verse_split = re.compile(r'^([a-z0-9_]*) *([0-9]*):? *([0-9]*)')
+    def __init__(self, proxy_url=None):
+        log.debug('TTExtract.init("%s")', proxy_url)
+        self.proxy_url = proxy_url
+        socket.setdefaulttimeout(30)
+        self._tt_b2w = {}
+        for k,v in self._tt_bw:
+            self._tt_b2w[k] = v
+    def get_bible_chapter(self, version, book_name, chapter):
+        """
+        Access and decode bibles via TUINS search cgi
+
+        :param version: The version of the bible like NIV for New International Version
+        :param book_name: Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung
+        :param chapter: Chapter number
+        """
+        log.debug('TTExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter)
+        verse = 1
+        no_chapter = False
+        verses = {}
+        while True:
+            book_en = self._tt_b2w[book_name].lower()
+            if no_chapter:
+                word = '%s %d-'%(book_en, verse)
+            else:
+                word = '%s %d:%d-'%(book_en, chapter, verse)
+            word = urllib.parse.quote(word.encode("utf-8"))
+            chapter_url = 'http://www.tuins.ac.jp/~takao/cgi-bin/biblesearch.cgi?key=&word=%s'%word
+            header = ('Accept-Language', 'ja')
+            soup = get_soup_for_bible_ref(chapter_url, header)
+            if not soup:
+                return None
+            self.application.process_events()
+            dl = soup.find('dl')
+            count = 0
+            (dt_book_name, dt_chapter_number, dt_verse_number) = (0, 0, 0)
+            for d in dl:
+                log.debug('TTExtract d="%s"', str(d))
+                if d.name=='dt':
+                    vv = re.split(self._tt_verse_split, d.text)
+                    log.debug('TTExtract vv="%s"', str(vv))
+                    if len(vv[3]):
+                        dt_book_name = vv[1]
+                        dt_chapter_number = int(vv[2])
+                        dt_verse_number = int(vv[3])
+                    else:
+                        dt_book_name = vv[1]
+                        dt_chapter_number = 1
+                        dt_verse_number = int(vv[2])
+                        no_chapter = True
+                    log.debug('TTExtract "%s" %d:%d', dt_book_name, dt_chapter_number, dt_verse_number)
+                elif d.name=='dd':
+                    if dt_book_name.lower() == book_en and dt_chapter_number == chapter:
+                        verses[dt_verse_number] = d.text.strip()
+                        count += 1
+            if count<10:
+                break
+            verse += 10
+        if not verses:
+            log.error('No verses found in the TUINS response.')
+            send_error_message('parse')
+            return None
+        return SearchResults(book_name, chapter, verses)
+
+    def get_books_from_http(self, version):
+        """
+        Return a list of all books
+
+        :param version: The version of the Bible like NIV for New International Version
+        """
+        log.debug('TTExtract.get_books_from_http("%s")', version)
+        return [book for book, data in self._tt_bw]
+
+
 class HTTPBible(BibleDB, RegistryProperties):
     log.info('%s HTTPBible loaded', __name__)
 
@@ -481,6 +627,8 @@
             handler = BGExtract(self.proxy_server)
         elif self.download_source.lower() == 'bibleserver':
             handler = BSExtract(self.proxy_server)
+        elif self.download_source.lower() == 'tuinstakao':
+            handler = TTExtract(self.proxy_server)
         books = handler.get_books_from_http(self.download_name)
         if not books:
             log.error('Importing books from %s - download name: "%s" failed' %
@@ -576,6 +724,8 @@
             handler = BGExtract(self.proxy_server)
         elif self.download_source.lower() == 'bibleserver':
             handler = BSExtract(self.proxy_server)
+        elif self.download_source.lower() == 'tuinstakao':
+            handler = TTExtract(self.proxy_server)
         return handler.get_bible_chapter(self.download_name, book, chapter)
 
     def get_books(self):

bibles_resources.sqlite の変更は, 以下のように行った.
$ sqlite3 openlp/plugins/bibles/resources/bibles_resources.sqlite
insert into download_source values (4,'tuinstakao');
insert into webbibles (name, abbreviation, language_id, download_source_id) values ("新改訳聖書", "ja2003", 57, 4);

2014-03-20

Python3 のインストールなど

RHEL6にPython3のインストール, その他のツールキットのインストールを行う手順を説明する.

インストール先は, /usr/local/python3とし, 他のパッケージと干渉しないように配慮する.

  1. python-3.4 をダウンロード, インストール.
    ここから現在最新のPython-3.4.0.tgzをダウンロード.
    $ tar xzf Python-3.4.0.tgz
    $ cd Python-3.4.0
    $ ./configure --prefix=/usr/local/python3
    $ make
    $ sudo make install
    
  2. setuptools のインストール
    $ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
    $ sudo /usr/local/python3/bin/python3 ez_setup.py
  3. SIPをダウンロードし, インストール.
    $ tar xzf sip-4.15.5.tar.gz
    $ cd sip-4.15.5
    $ /usr/local/python3/bin/python3 configure.py
    $ make
    $ sudo make install
    
    $ cd PyQt-x11-gpl-4.10.4 $ /usr/local/python3/bin/python3 configure-ng.py --qmake /usr/bin/qmake-qt4 --consolidate --confirm-license $ make
  4. pipとその他のライブラリ
    $ sudo /usr/local/python3/bin/easy_install pip
    $ sudo /usr/local/python3/bin/pip install lxml
    $ sudo /usr/local/python3/bin/pip install beautifulsoup4
    $ sudo /usr/local/python3/bin/pip install sqlalchemy
    $ sudo /usr/local/python3/bin/pip install alembic
    $ sudo /usr/local/python3/bin/pip install sqlite
    $ sudo /usr/local/python3/bin/pip install chardet
    
    
qt-devel
qtwebkit-develepel
openssl-devel
libxslt-devel
sqlite-devel
libuuid-devel

以下のコードでセグメンテーション違反...

from PyQt4 import QtCore, QtGui
import uuid
print('4 uuid1=%s'%str(uuid.uuid1()))

Linuxの端末でのコントロール操作

Ctrl+CSIGINT割り込み
Ctrl+DEOF
Ctrl+SSIGSTOP一時停止
Ctrl+QSIGCONT再開
Ctrl+\SIGQUIT終了

2014-03-19

SL6 のインストールから samba サーバの構築まで

SL6をインストールし, sambaサーバを構築する方法をメモしようと思ったが, まだ途中.
  1. Scientific Linux 6 のインストール
    1. このページの「Latest Supported Releases」からインストール用メディアをダウンロードし, CDまたはDVDに書き込む. i386かx86_64かの選択は, マシンのCPUによる. 32bit (Jonah以前) ならi386, 64bit (Merom以降) ならx86_64を選ぶ. 初めての場合, *-Install-DVD.iso がおすすめ. *-boot.iso でも良いが, 設定項目が多い.
    2. インストールを行う.
    3. パーティションは, /homeをできるかぎり大きめに, /は4GBから8GB程度で良い.
    4. 構成は, Minimum.
  2. rootでログインし, 管理者用アカウントを追加.
    1. 以下のように表示されたら, ユーザ名「root」とインストール時に設定したパスワードを入力する.
      Scientific Linux release 6.5 (Carbon)
      Kernel 2.6.32-431.el6.i686 on an i686
      Login:
      
    2. ユーザを追加 (ここではtaroとしたが, 何でも良い. 通常は管理者の名前にする.)
      # adduser taro
      # passwd taro
      New password: 
      Retype new password: 
      
      (#以降の部分を入力する)
    3. taro を sudoers に追加する.
      # visudo
      エディタ (vi) が起動するので, 以下の1行を書き加える.
      taro ALL=(ALL) ALL
      viの使い方を簡単に述べる: G (shfitを押しながら) を押して最下行に移動, oを押して入力モードを開始, 上記1行を入力し, ESCを押してコマンドモードに戻る. 「:wq」と入力して保存・終了. コマンドモード中は, jk で上下移動, hlで左右移動である.
    4. 一度ログアウト
      # logout
      (Ctrl+Dを押しても良い)
    5. 追加したユーザでログインし, 以下の作業を行う.
    これ以降の操作は, SSHでログインし, 他のマシンからでも可能. Windows用のSSHクライアントもある.
  3. まずはアップデート
  4. $ sudo yum update
    $ sudo shutdown -r now
    アップデートをすべて反映させるため, 再起動する. (たいていのアップデートには再起動は不要だが, kernel などのアップデートには再起動が必要.)
  5. 必要なパッケージをインストール
  6. $ sudo yum install ntp samba man
  7. NTPの起動
  8. $ sudo chkconfig ntpd on
    $ sudo service ntpd start
    (1行目は, システム起動時にNTPDが起動するように設定. 2行目は, NTPDを (すぐに) 起動.
  9. sambaの起動
  10. $ sudo chkconfig smb on
    $ sudo service smb start
    
  11. sambaでアクセスする際のアカウントを作成 (この例ではkyoto)
  12. $ sudo adduser kyoto
    $ sudo smbpasswd -a kyoto
    
    複数のアカウントを作成する場合, 上記2コマンドを繰り返す.
  13. SElinuxの設定
  14. $ sudo setsebool -P samba_enable_home_dirs 1
  15. ファイアウォールの設定
    $ sudoedit /etc/sysconfig/iptables
    以下の太字の部分を書き足す.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 139,445 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT
    
    $ sudo service iptables reload
  16. IPアドレスの設定など
  17. 固定IPアドレスを設定を /etc/sysconfig/network-scripts/ifcfg-eth0 に記述する. HWADDR などはそのままにする.
    DEVICE="eth0"
    BOOTPROTO="static"
    HWADDR="xx:xx:xx:xx:xx:xx"
    NM_CONTROLLED="no"
    ONBOOT="yes"
    TYPE="Ethernet"
    BROADCAST="192.168.0.255"
    DNS1="192.168.0.1"
    DNS2="8.8.4.4"
    IPADDR="192.168.0.11"
    NETMASK="255.255.255.0"
    
  18. ホスト名とデフォルトゲートウェイを /etc/sysconfig/network に記述する.
    NETWORKING=yes
    HOSTNAME=host1.example.com
    GATEWAY=192.168.0.1
    

2014-03-18

NTT docomoのメールをIMAPで受信

いつのまにか, docomo のメールをIMAPで取得, SMTPで送信できるようになっていた. このサイトに解説がある. この解説はなくなっていた.
報道資料からの引用: 株式会社NTTドコモ(以下、ドコモ)は、spモードメール®をクラウドに対応させた「ドコモメールTM」をパソコン等のWEBブラウザやIMAP4対応のメールソフトからでも同一のメールアドレス(xxxx@docomo.ne.jp)で利用できるように、2013年12月17日(火曜)に機能拡充します...

やってみようと思ったけれど, アプリ「SPモードメール」の設定で「docomo ID利用設定を有効」にする必要があり, SPモードメールをインストールしようとしたけれど「サーバーとの通信にエラー」でインストールに失敗した. 日を改めて, もう一度やってみようと思う.

2014-03-13

IEEE/IEICE/IPSJ論文の個人ウェブサイト掲載

IEEE, IEICE ともに, 個人のウェブサイトに論文のコピーを掲載することを許可している. しかし, 条件などが異なっている.
IEEEIEICE
掲載可能なデータ 投稿論文 (IEEExploreのPDFは不可)
... only the accepted version...
出版社版PDF (著者最終版は不可)
出版社版と著者最終版との違いによる混同を防ぐためらしい

IPSJ は, 掲載媒体に関して特に具体的な条件はなく, 申告不要で「著作者個人の」ウェブサイトに掲載して良い. しかし, 利用上の注意事項を明記する必要がある.

参考

  • Top 10 FAQ on IEEE Publishing Policies and Tools for Authors
  • IEICEの利用申請基準
  • IPSJの著作権規程, FAQ
  • 2014-03-12

    HSPICE: .NODESET で全てのサブサーキットのノード電圧を設定

    HSPICEでディジタル回路の過渡解析を行う時, 初期条件の収束に時間がかかることがある. FFなどに含まれるループでの状態が確定しないことが一因であることがある.

    このような場合, .nodeset を使用して初期電圧を与えると改善するらしい. 以下に例を示す.

    .nodeset V(in)=0.0 subckt=my_dff
    

    2014-03-11

    不審なEメールのReceivedヘッダ

    届いたメールが疑わしい場合 (送信元の偽装などが疑われる場合), ヘッダを確認するべきである. 上の方にある Received をみると, どのホストからメールが届いたのかがわかる.
    Received: from 209.203.76.xx.cybertimebroadband.com (unknown [209.203.76.xx])
            by myhost.example.com (Postfix) with ESMTP id xxxxxxxxxx
            for ; Tue, 11 Mar 2014 08:04:07 +0900 (JST)
    From: hoge@example.net
    
    このfromの括弧内が, メールを送信したホストのIPアドレス. unknown の部分は送信元が自称するホスト名. カッコの左側はIPアドレスの逆引き結果である.

    Received: from... の部分と From: で書かれたメールアドレスのドメイン部分とに関連がない場合, 送信元偽装が考えられる.

    さらに詳しく調べたい場合, From のメールアドレスのドメインの TXT レコードを調べると良い. 上記の例の場合, ドメインは example.net なので,

    dig example.com txt
    
    で TXT レコードを調べる. v=spf で始まるレコードが出てくるので, SPFの文法に従って, 確認すればよい.