月別アーカイブ: 2015年11月

[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へ変更

[raspberry pi]天気予報の取得

weather undergroundのAPIから取得
以下のスクリプトを実行すると本日の東京の曜日と降水確率が出力される。
ポイントはJSON形式の読み取りと抽出。

import urllib2
import json
#f = urllib2.urlopen('http://api.wunderground.com/api/0def10027afaebb7/geolookup/conditions/q/japan/Tokyo.json')
f = urllib2.urlopen('http://api.wunderground.com/api/0def10027afaebb7/geolookup/forecast/q/japan/Tokyo.json')
json_string = f.read()
parsed_json = json.loads(json_string)
title_today = parsed_json['forecast']['txt_forecast']['forecastday'][0]['title']
pop_today = parsed_json['forecast']['txt_forecast']['forecastday'][0]['pop']
print title_today+'\npop:'+pop_today
f.close()

telnet

telnetについて。斜体はエコー内容を現す。max os10.8 ターミナルにて。

<HTTPリクエスト>
telnet IPアドレス 80
Trying xxx.xxx.xxx.xxx…
Connected to xxx.xxx.xxx.xxx.
Escape character is ‘^]’.

GET http://xxx.xxx.xxx.xxx/index.html

プロキシサーバーを経由するときも同様である
telnet プロキシサーバーのIPアドレス ポート番号
Trying xxx.xxx.xxx.xxx…
Connected to xxx.xxx.xxx.xxx.
Escape character is ‘^]’.

GET http://xxx.xxx.xxx.xxx/index.html

正確には
GET /index.html?arg1= HTTP/1.0
Host:xxx.xxx.xxx.xxx

POST /index.html HTTP/1.0
Host:xxx.xxx.xxx.xxx
key1=val2&key2=val2

という風にする

<SMTPサーバーを利用してメール送信>
ユーザー名やパスワードはbase64に変換して入力するのでopensslを用いて用意しておく
echo -n username | openssl enc -e -base64
※echoには-nオプションをつけないと改行も変換されてしまうので注意
echo dXNlcm5hbWUK | openssl enc -d -base64

telnet SMTPサーバーのIP ポート番号
220 ~
HELO SMTPサーバーのIP
250 ~
AUTH LOGIN
334 VXNlcm5hbWU6 <-Username:のこと
base64にエンコードしたusername
334 UGFzc3dvcmQ6 <-Password:のこと
base64にエンコードしたpassword
~ Authentication successful
MAIL FROM:送信元のメールアドレス
~ Ok
RCPT TO:送信先のメールアドレス
~ Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject:test
From:送信元のメールアドレス
To:送信先のメールアドレス
This is a test mail from telnet.
.
~ Ok

[arduino]XBee wifi

XBee wifiはシリアル通信だけでなく、HTTPリクエストのやりとりができる。
これはインターネットを介してサーバーとの連携を容易に実現するだろう。

今回用意したもの
・XBee wifi
・XBee USBアダプタ <-設定用
・arduino UNO
・ワイヤレスシールド <-なくても良かったが、arduinoとXbeeをつなぐのは楽。
・無線LAN環境 <-SSIDや暗号化形式などは調べてまとめておく

1. XBee wifiの設定とテストをX-CTUにより行える
cooltermとか最悪ターミナルからでもできる。その場合ドライバをインストールする必要あり。
無線LANとIPの設定、得に相手先のIP(destination IP)は固定で設定する。
設定が成功すればpingが通る。

2. X-CTUコンソールでHTTPリクエストのテスト。
以下のように予め送信するパケットを編集しておくことができる。
GET /index.html HTTP/1.0
Host:xxx.xxx.xxx.xxx

送信だがサーバー側の改行コードに合わせること。
成功するとレスポンスが帰ってくる

3. arduinoによるサンプル
適当なwebサーバーにURL引数を受け取って表示するようなCGIをPHPなどで作成し、以下のスケッチでテスト。

void setup() {
Serial.begin(9600);
}
void loop() {
Serial.write(“GET /arduino_xbee_test.php?val1=99&val2=88 HTTP/1.0”);
Serial.write(“\r\n”);
Serial.write(“Host:xxx.xxx.xxx.xxx”);
Serial.write(“\r\n\r\n”);
delay(3000);
}

[補足]
・個人的に改行コードではまることが多かった。X-CTUのコンソールは0Dでしか送らないので0Aを追加したりとか。
・プロキシサーバーを通す場合もプロキシのIPを相手先に設定してHTTPリクエストを投げればOK。

・XBeeとのシリアル通信ができていれば、結局のところX-CTUでもcooltermでもarduinoからでも、”+++OK”からATコマンドで設定ができる。設定方法とかは以下のリンクを参照。

http://arduino.sugakoubou.com/xbee_wi-fi#xbee_wi-fi