あくまで一時的なデスクトップ付箋「TempraryMemoList 1.0」Release

Flash Professional CS6&Flash Builder 4.6入手記念にデスクトップアプリ作ってみました。

特徴

  1. コピペしたい内容や、ちょっとした数値、Todoなど、テキストデータの”ちょい置き”に向いた付箋(メモ)です。
  2. 別途Adobe Airランタイムが必要です。(あるいは下のTVみたいなのから入れていただくと本アプリとランタイムが同時に入る…はず)
  3. 1つ目のメモを書き終わったら、Tabキーを押すと新規入力画面になるので、連続でメモを取ることができます。
  4. 入力欄の下「メモ一覧」がどんどん溜まっていきます。見出しはメモ本文の1行目だから思い出しやすい(はず)
  5. 削除したいものはメモ欄の右端にマウスを持っていくといいです
  6. 一時的って言ってるけどメモの内容はアプリ再起動しても復帰しますよ!
  7. メモ一覧からマウスで外にドラッグするとテキストファイルとして保存することが出来ます。

[applink target=”TempraryMemoList for Air” type=”badge”]
“あくまで一時的なデスクトップ付箋「TempraryMemoList 1.0」Release” の続きを読む

Redmineで特定プロジェクトのフォーラムに投稿ができないとき

まだPostfix設定編を書いてないのに今日ハマったから先にポストする。


ユーザーのメールアドレスが原因のことがあります。
Ruby on Railsでメール配信する仕組みがどうやらdocomoユーザーに多い、一部の記号系メールアドレス(勝手に命名)に弱いもよう。
特に@直前に.があるやつ。

現象

特定のプロジェクトのフォーラム・ニュースなどに投稿ができない。
ユーザーの違うプロジェクトや、新規で作って自分だけ登録したようなプロジェクトは何も問題が無い

こちらの環境

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
Rails 3.2.6
Redmine 2.0.3

状況確認

Redmineログ(/var/lib/redmine/log/production.log)によれば

Started POST "/redmine/boards/1/topics/new" for xxx.xxx.xxx.xxx at 2012-07-06 00:00:00 +0900
Processing by MessagesController#new as HTML
(投稿内容中略)
  Rendered mailer/message_posted.text.erb within layouts/mailer (0.7ms)
Completed 500 Internal Server Error in 172ms

NoMethodError (undefined method `encoding' for #<Array:0x000000067dea00>):
  app/models/mailer.rb:420:in `deliver_mail'
  app/models/message_observer.rb:20:in `after_create'
  app/controllers/messages_controller.rb:59:in `new'

Started POST でフォーラムURLへ投稿している行を見つけて結果を見ると、Completed 500 Internal Server Errorって出てたりする。

app/models/mailer.rbを見に行ったら

self.deliver_mail(mail)

としか書いてない。正直、Ruby on Rails初心者には自前かフレームワークのものなのかわからなかったので、安易に

$ cd /var/lib/redmine
$ find . | xargs grep 'deliver_mail'

すると、log/production.logのエラー行と、さっき見たapp/models/mailer.rbしか出てこない。

この時点で、たぶんRedmine独自関数じゃないだろうからすぐ修正するのは無理そうだなぁ、と思い始めていた。

Railsでドットが連続3つ(トリプルドット)以上あるメールアドレスでもActionMailer::Base.deliverを利用してメールを送信する 

ぐはっ。
この内容見ながらやるにしても、RubyもRailsも初心者にはきつい。
時間があればやってみたかったんだけど…。

というわけで、他の方法を考える。

材料
相手のメールアドレスは解っている。
記号系メールアドレスをちゃんと送信できるメールサーバがある。
ついでにSSHログイン不可のRedmine初期登録に使ったテンポラリなアカウントがいくつか作ってある
(Redmineはユーザーのメールアドレスが重複できないうえに、通知するときに適当なローカルメールアドレスだと配信が止まってしまううえに、相手のアドレスもわからなかった)

結論:ローカルアカウントに送信後、メールを転送する

#tmp_user_nameはテンポラリなアカウントのユーザ名
$sudo vim /home/tmp_user_name/.forward

user@example.com

.forwardには転送先だけ書いて保存。

詳細は「Postfix メール転送」とかでぐぐる

Redmineのユーザー設定でメールアドレスを書き換えて、フォーラム投稿できるか確認して、メールログで転送されてるか確認して、ついでにニュースに「○○さんへ 急いでたから適当に処理したんで他のアドレスに書き換えてね(変えたら転送解除するから返信してね)」って投稿しておわり。

感想

実は昨日、数万件の中から明らかに不正確なメールアドレス抽出→削除っていうのをやってたときに、
判定大雑把なのでいいからネットで探してきた正規表現使ったら、@前に.のあるアドレスが結構引っかかったので、今日の事象も解決が早かったと思われます。
(名誉のために言うと、削除前には目視確認してから捨てるので大雑把で良かった)

明らかな入力ミス以外は全部docomoだったので、この形式は一般的ではないんだなあ、と思って。
→RFC準拠してないんですね。

実運用中のメールアドレスの仕様はかなり奥深いようで、以前どこかのサイトで「たいてい間違ってるから安易に正規表現乗せないでください」って詳しい人が怒っていたのを目撃したことがあったような…。(´・∀・`)

load data infile で Excelで作ったCSVを読み込むとき

散々既出だと思うのだけど、普段コマンドラインからいじることも無いため、データベースのデフォルトとカラムの文字コードが合ってりゃ勝手にやってくれると思っていた…。

ExcelのCSVファイルを読み込むテンプレ

--
-- 文字コードをsjisに
--

set character_set_database='sjis';

--
-- 区切り文字「,」囲み文字「(なし)」
--

LOAD DATA INFILE "CSVファイル名" INTO TABLE テーブル名
 FIELDS TERMINATED BY ',' ENCLOSED BY '';

大量にCSVがあるときなどには、phpMyAdminからやるよりちょっぱやです。

さくらVPSでRedmineを動かすまで

どうしても動かなくて一度初期化したりなんだりしましたが、とりあえず設定完了してきましたメモ。

著者前提スキル:

  • Linuxは10年くらい前にCUIでVineLinux4でゼミのサーバー立てたことがある程度
    その後は設定済みレンタルサーバーをお好みで変更してたくらい。
  • XAMPPが出てからは開発環境もずっとXAMPP-Lite
  • Ruby触ったこと無い
  • Redmine使ったことない

目的:

  1. RedmineをWEBサーバ経由で使う(当然ですが
  2. Redmineからの通知メールを送りたい
  3. しばらくの間ログ見たりするのにSSHが要る(さくらの管理画面からでもターミナル開けるのですが)
  4. テーマをいじると思うのでFTPもあけとこう(使い終わったら閉じる)

取り掛かる前に読んだ所
さくらのVPS を改めて使いはじめる 1 – 使用準備、SSH 公開鍵認証シリーズ
改める前のほうの記事と合わせてとても参考になった。

先にどういうサーバーにするか決めてからとりかかるのが大切だなあと(しみじみ)。

さくらVPSのデフォルトであるCentOS6.4をつかう。
ちょうどRedmine.JP BlogさんのCentOS6向けRedmine2.0インストール記事が2012年5月15日付けで上がっていたので、そちらを参考にする。

Redmine 2.0をCentOS 6にインストールする手順

基本的には上記の通り進めていけば…というか、この通りやってやっと動くようになった感じです。
別手順で慎重にやったときは、最終的にRedmine::l18nで起きるエラーが解決できずに初期化することになりました。
ひとまずは上記の通り設定。

RedmineがURLでアクセスできるようになったらiptablesの設定
~/tools/ipt.shなどの名前で作ってからまとめて実行が良いと思います。

#!/bin/sh

/sbin/iptables -F
/sbin/iptables -X

/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP

/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

/sbin/iptables -A INPUT -s 10.0.0.0/8 -j DROP
/sbin/iptables -A INPUT -s 172.16.0.0/12 -j DROP
/sbin/iptables -A INPUT -s 192.168.0.0/16 -j DROP

/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# INPUT : SSH, HTTP, FTPx2
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 22    -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 80    -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 20    -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 21    -j ACCEPT

# OUTPUT : SSH, HTTP, FTPx2, MAIL
/sbin/iptables -A OUTPUT -p tcp -m state --state NEW --dport 22   -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m state --state NEW --dport 80   -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m state --state NEW --dport 20   -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m state --state NEW --dport 21   -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m state --state NEW --dport 25   -j ACCEPT

/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

/etc/rc.d/init.d/iptables save
/sbin/service iptables restart

#IPv6用ファイアウォールの設定
/sbin/ip6tables -F
/sbin/ip6tables -X

/sbin/ip6tables -P INPUT DROP
/sbin/ip6tables -P OUTPUT DROP
/sbin/ip6tables -P FORWARD DROP

/etc/rc.d/init.d/ip6tables save
/sbin/service ip6tables restart

SSHのポートは22から他のものに変更しています。
さくらのVPS を使いはじめる 2 – sudo と SSH ポート変更

なお、

※2 IPv6アドレスには今後対応予定となっております。

さくらのVPS公式スペック表にこのように書いてあったので、とりあえずDROP!ヽ(゚∀゚)ノ

/var/log/maillogにredmine@example.netがあって気持ち悪いときはこちらを参照。
redmine で 通知メールなどの from を設定する

Redmineの再起動は基本Apacheのservice httpd restartで行うのですが、こんな方法もある様子。
PassengerでApache組み込みしたRedmineをApache再起動せずにRedmineだけ再起動する方法

さて、かなり他力本願でここまできてRedmineをブラウザから動かすことはできたので、次はラスボスであるメール送信についてまとめます…たぶん…