カテゴリー別アーカイブ: IT

OSXのターミナルにてメール送信

[環境]
OSX10.8.5
postfix mail_version=2.9.2

1. /etc/postfix/にて sasl_passwordというファイルを作成(名前は何でもいい)
xxx.xxx.xxx.xxx:xxx hostID:password
※SMTPサーバーのアドレス:ポート ホストID:パスワード
2. sudo postmap sasl_password を実行
->sasl_password.dbというファイルが作成される。元のsasl_passwordは削除する。
3. sudo vim main.cfに以下を追加
#基本的にtelnetでSMTPサーバーへ接続してメール送信ができれば、その要求通りに設定する
myhostname = hostname #<-SMTPサーバーがホストを要求している場合
relayhost = xxx.xxx.xxx.xxx:xxx #<-SMTPサーバー名またはIP:ポート

#SASL Authentication
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

#TLS Settings
smtp_use_tls = yes
smtp_tls_security_level = encrypt
tls_random_source = dev:/dev/urandom

4. postfixの起動及び再読み込み
sudo postfix start 及び sudo postfix reload

5. テストメール送信
echo “test” | mail -s “test” xxx@xxx.xxx.xxx.xxx

5′. メール送信が失敗するとローカルに返信があるので、mailで受信内容を確認

6. 日本語のメールはnkfを用いること
echo “日本語” | nkf -j | mail -s “test” xxx@xxx.xxx.xxx.xxx

[sqlite]日付と時間についての関数

sqliteは以下にある5つの日付と時間を扱う関数がある。

date(timestring, modifier, modifier, …)
time(timestring, modifier, modifier, …)
datetime(timestring, modifier, modifier, …)
julianday(timestring, modifier, modifier, …)
strftime(format, timestring, modifier, modifier, …)

これら全てはゼロ及び修飾文字列で構成されるtime string型を引数としている。strftime関数は第一引数としてtime string型を指定している。
日付と時間の関数はISO-8601に準拠している。date()はYYYY-MM-DD、time()はHH:MM:SS、datetimeはYYYY-MM-DD HH:MM:SSを返す。julianday()はユリウス日を返す。strftime()は第一引数で日付や時刻の形式を受け、標準Cライブラリ及び%fと%Iを加えた変換を行う。

%d day of month: 00
%f fractional seconds: SS.SSS
%H hour: 00-24
%j day of year: 001-366
%J Julian day number
%m month: 01-12
%M minute: 00-59
%s seconds since 1970-01-01
%S seconds: 00-59
%w day of week 0-6 with Sunday==0
%W week of year: 00-53
%Y year: 0000-9999
%% %

注釈:全ての日付や時刻の関数はstrftime関数によって表現できる。
Function Equivalent strftime()
date(…) strftime(‘%Y-%m-%d’, …)
time(…) strftime(‘%H:%M:%S’, …)
datetime(…) strftime(‘%Y-%m-%d %H:%M:%S’, …)
julianday(…) strftime(‘%J’, …)

時間文字列は以下のどの形式でもよい。
YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDDDDDDDD
注釈:DDDDDDDDDDはunix時間を表す整数
修飾文字列は以下の種類がある。
NNN days
NNN hours
NNN minutes
NNN.NNNN seconds
NNN months
NNN years
start of month
start of year
start of day
weekday N
unixepoch
localtime
utc

最初6つの修飾文字列は単に時間や日付を進めたりするためにある。
weekday修飾文字列はNで指定した曜日(日曜日は0、月曜日は1、…)
unixepochは1970年からの秒数である。

【例】
現在の日付
SELECT date(‘now’);

現在の月の最初に日
SELECT date(‘now’,’start of month’,’+1 month’,’-1 day’);

unix時間の1092941466をdatetimeに変換する
SELECT datetime(1092941466, ‘unixepoch’);

現在時刻からunix時間を計算
SELECT strftime(‘%s’,’now’);

US独立記念日から現在までの日数を計算
SELECT julianday(‘now’) – julianday(‘1776-07-04’);

2004年のある瞬間から現在までの秒数を計算
SELECT strftime(‘%s’,’now’) – strftime(‘%s’,’2004-01-01 02:34:56′);

今年10月の最初の火曜日の日付を計算
SELECT date(‘now’,’start of year’,’+9 months’,’weekday 2′);

 

[vim]偶数行と奇数行の連結

1
a
2
b
3
c
4
d

となっているテキストファイルを

1,a
2,b
3,c
4,d

と変換したい。もちろん手作業ではとても間に合わない行数である。
awkを使おうかと思ったが、vimのマクロで行った。

1行目の先頭にカーソルがあるとする
qa マクロ記録開始
esc ノーマルモード
$a, 行の最後に移動してカンマを挿入
esc ノーマルモード
J 次の行を連結する
esc ノーマルモード
j     次の行へ移動する
q      マクロ記録終了
5@a これまでの処理を10回繰り返す

[raspberry pi]USB 電源能力

raspberry pi2 model B

USBのwifiドングルを使うと頻繁に機能しなくなる問題は、電源能力が原因らしい。
USB2.0の電源は4つ合計で300mA程度で一つあたりは100mAくらいしかとれない。
無線LANは通常300mAくらいを用いるらしいので、足りなくなる。

raspberry piのdocumentによるとマウスやキーボード以外の消費電力の大きいUSBデバイスは、
USBハブやその他の電源供給を行うようにとのこと。

一応電源供給は
/boot/config.txtにて
max_usb_current=1を追加することで4つ最大1200mAまでとなるらしい。

[vim]正規表現の演習

:set wrapscan 折り返し検索を有効にする
:set ignorecase 大文字と小文字の区別をしない
:set smartcase 検索文字列に1字でも大文字が含まれていたら、大文字と小文字を区別する
(ignorecaseがオンの時)
:set magic 正規表現に使われる記号を有効にする
(:set nomagicだと、「*」は文字“*”にマッチする。「¥*」で繰り返し。)

1.A* 0個以上連続したAに一致 , A, AA, AAA, …

2.A¥+ 1個以上連続したAに一致 A, AA, AAA, …

3.A. Aのに何れかの1文字がある場合に一致,改行文字は除く AB, A1, A.

4.AB¥?C AとCの間にBがないか,Bがある場合に一致 AC, ABC,AEC

5.A¥{3¥} 3個のAに一致 AAA

6.A¥{2,4} 2個以上,4個以内のAに一致 AA, AAA, AAAA

7.[a-z]+ a〜zの何れか,つまりアルファベット小文字を表す value, ascii

8.¥w¥+ 1個以上の英数文字に一致 abc, a001, 001

9.¥d+ 1個以上の数字に一致 1, 12, 123, 001

10.¥| 選択 AA¥|BB¥|CC AAまたはBBまたはCCに一致

11.¥(¥) グループ化 A¥(01¥|02¥|03¥) A01またはA02またはA03に一致

12.^ 行の最初 ^A 行頭のAに一致

13.$ 行の最後 A$ 行末のAに一致

14.[^A] A以外の文字 [^ABC]+ DEFなど1つ以上のABC以外の文字に一致

15.¥s 空白,タブ ¥s+ 1つ以上の空白に一致

16.¥S 空白文字以外 ¥S+ 1つ以上の空白以外の文字に一致

17.¥d 数値文字 ¥d+ 123など1つ以上の数字に一致

18.¥D ¥d以外 ¥D+ ABCなど1つ以上の数字以外の文字に一致

19.¥w 英数文字かアンダーバー ¥w+ ABC123など1つ以上の英数文字かアンダーバーに一致
20.¥W ¥w以外の文字 ¥W+ -+!?など1つ以上の英数文字かアンダーバー以外(記号)に一致

21.¥b 単語の境界(¥wと¥Wの境界) ABC¥bDEF ABCとDEFの間に英数文字かアンダーバー以外の文字がある文字列に一致

22.[CF+LF]の場合:¥r¥n [LF]のみ:¥n
全ての改行を指定:(¥r¥n|¥n¥r|¥n|¥r)

23.空白行
/^$/

[演習用]
1.1個以上のA
A, B, C, AA, AAA, AAAA, EEEE

2.Aの後に1個の文字
AB, ABC, A , BAC

3.AB¥?C AとCの間にBがないか,Bがある場合に一致
AC, ABC,AEC

4.3個のAに一致
AAA,AA,A,AAAA,ABC,AABB, BAAAC

5.2個以上,4個以内のAに一致
AA, AAA, AAAA ,AABBCC,AAAAB, BAAAA, ABABA,AAAAA

7.アルファベット小文字を表す
value, ascii

8.1個以上の英数文字に一致
abc, a001, 001

9.1個以上の数字に一致
1, 12, 123, 001

10.AAまたはBBまたはCCに一致
AA BB CC DD EE AABB CCDD ABBC ABCC

11.A01またはA02またはA03に一致
A01 A02 A03 A04 A05 BCA01AB ZZA02XX

12. 行の最初 ^A 行頭のAに一致
A
A
ABC

13.行の最後 A$ 行末のAに一致
ABC
ABCA
A
ZYZ A
abc A

14. 1つ以上のABC以外の文字に一致
ABC ACB XYZ DEF ACB

15.1つ以上の空白に一致
A A A A A A

16.1つ以上の空白以外の文字に一致
A B C D E F

17.空行を検索する(1行空いている行)
aaaaa

bbbbb

18.日付を検索する
2005/09/30
2005/111/1
(よくある日付の書式)

[python]SMTPによるメール送信のサンプルコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

FROM_ADDR = "xxx@xxx.xxx.xxx.xxx"
TO_ADDR = "xxx@xxx.xxx.xxx.xxx"
ENCODING = "iso-2022-jp"

message = MIMEText(u"1行目\n2行目\n3行目".encode(ENCODING),"plain",ENCODING,)

message["Subject"] = str(Header(u"Subject",ENCODING))
message["From"] = "%s <%s>" %(str(Header(u"Hiroshi",ENCODING)),FROM_ADDR)
message["To"] = "%s <%s>" %(str(Header(u"To",ENCODING)),TO_ADDR)
message["Date"] = formatdate()

s = smtplib.SMTP("xxx.xxx.xxx.xxx", 587)
s.ehlo()
s.starttls()
s.login("h-ito@nb-npi.co.jp", "Hito5857")

s.sendmail(FROM_ADDR,[TO_ADDR],message.as_string(),)

s.close()

print "Success send mail"

[C#]ファイル処理

あるファイルを一行目のみ読み込んで上書きする。つまり2行目以降が消去されたようになる処理。

string Path = @"c:¥...";
StreamReader sr = new StreamReader(Path, Encoding.GetEncoding("SHIFT_JIS"));

String tmpPath = System.IO.Path.GetTempFileName();
System.IO.StreamWriter sw = new System.IO.StreamWriter(tmpPath);

//ReadLineはファイルを一行ずつ読み込む。この場合最初の一行を一時ファイルに書き込んだ
sw.WriteLine(sr.ReadLine());

sr.Close();
sw.Close();

System.IO.File.Copy(tmpPath, Path, true);
System.IO.File.Delete(tmpPath);

[C#]正規表現

//文字列"abc -1,0,1"から数値-1,0,1を配列resに格納
string txt = "abc -1,0,1";
System.Text.RegularExpression.Regex reg = new System.Text.RegularExpression.Regex(@"[,¥+¥-¥d]");
System.Text.RegularExpression.Match m = reg.Match(txt);
string[] res = m.Value.split(',');

//txtに格納された文字列において数値をnに置換する
System.Text.RegularExpressions.Regex.Replace(txt, @"¥d", "n");

正規表現については以下を参照
[vim]正規表現の演習

[C#]オラクルとの接続とSQL実行

using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

using (OracleCommand com = new OracleCommand()){
OracleConnection con = new OracleConnection();
con.ConnectionString = "User id=USERID;Password=PASSWORD;Data Source=DBNAME;";

con.Open();
OracleTransaction tra = con.BeginTransaction(IsolationLevel.ReadCommitted);

try
{
com.CommandText = "insert into TEST values(val1,va2)";
com.Connection = con;
com.Transaction = tra;
com.ExecuteNonQuery();
tra.Commit();
}
catch(System.Exception)
{
tra.Rollback();
throw;
}
finally
{
con.Close();
}
}

[C#]オラクル接続の不一致エラー

visual studioにて

~processorArchitecture=x86″ のプロセッサ アーキテクチャ “x86” の間には不一致がありました。~

ソリューションエクスプローラー
→プロジェクトの右クリック
→ビルド
→プラットフォームのターゲットをANY CPUからx86へ変更