SQLの窓

2018年04月24日


Windows10 : Ruby で日本語メール送信

Ruby で正しい情報を収集するのは、他の言語に比べて骨が折れるようです。

今回かなり ISO-2022-JP の MIME 文字列で困りました。まず、NKF.nkf("-WjM", subject) で欲しい文字列は手に入るのですが、渡して実行すると UTF-8 に変換されていました。

また、本文の JIS 作成が良く解らずに調べている途中で、mail-iso-2022-jp の存在を知って余計な時間を使う事をなんとか逃れました。

ソース最後のコメントは、mail ライブラリの smtp.rb の中にあったものですが、シンボルと文字列の違いが最初解らずに納得が行かない時間がちょっとありました。

gem で mail ライブラリ をインストール


ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]

C:\Users\sworc>gem install mail
Fetching: mini_mime-1.0.0.gem (100%)
Successfully installed mini_mime-1.0.0
Fetching: mail-2.7.0.gem (100%)
Successfully installed mail-2.7.0
Parsing documentation for mini_mime-1.0.0
Installing ri documentation for mini_mime-1.0.0
Parsing documentation for mail-2.7.0
Installing ri documentation for mail-2.7.0
Done installing documentation for mini_mime, mail after 28 seconds
2 gems installed

C:\Users\sworc>gem install mail-iso-2022-jp
Successfully installed mail-iso-2022-jp-2.0.8
Parsing documentation for mail-iso-2022-jp-2.0.8
Done installing documentation for mail-iso-2022-jp after 0 seconds
1 gem installed
require 'nkf'
require 'pp'
require 'mail'
require 'mail-iso-2022-jp'

# ******************
# メール用変数
# ******************
user = "ユーザ名"
pass = "パスワード"
to = "宛先メールアドレス"

# ******************
# メール内容
# ******************
subject = "日本語の件名"
body = "日本語の\n本文\nです"

mail = Mail.new(charset: "ISO-2022-JP")
mail["from"]  = "わたし <#{user}@#{user}.sakura.ne.jp>"
mail["to"] = "あなた <#{to}>"
mail["subject"] = subject
mail["body"] = body

smtp_server = {
	:address => "#{user}.sakura.ne.jp",
	:port  => 587,
	:domain  => "sakura.ne.jp",
	:user_name => "#{user}@#{user}.sakura.ne.jp" ,
	:password  => pass,
	:authentication  => "plain",
	:enable_starttls_auto  => true
}

# ******************
#Pretty Print
# ******************
pp smtp_server

# ******************
# 個別
# ******************
p smtp_server[:address]
p smtp_server[:port]
p smtp_server[:domain]
p smtp_server[:user_name]
p smtp_server[:password]
p smtp_server[:authentication]
p smtp_server[:enable_starttls_auto]

mail.delivery_method(:smtp, smtp_server )

# ******************
#メール送信
# ******************
begin
	mail.deliver
rescue => e
	p e.message
end


# ******************
# Subject の文字列変換のテスト
# ******************
p NKF.nkf("-WjM", subject)

# ******************
#シンボルと文字列の比較
# ******************
if :login.to_s == "login" then
	p "一致"
end
if "login".to_sym == :login then
	p "一致"
end


# === Sending via GMail
#
#	Mail.defaults do
#	 delivery_method :smtp, { :address			  => "smtp.gmail.com",
#							  :port				 => 587,
#							  :domain				=> 'your.host.name',
#							  :user_name			=> '<username>',
#							  :password			 => '<password>',
#							  :authentication		=> 'plain',
#							  :enable_starttls_auto => true  }
#	end

#DEFAULTS = {
#  :address			  => 'localhost',
#  :port				 => 25,
#  :domain				=> 'localhost.localdomain',
#  :user_name			=> nil,
#  :password			 => nil,
#  :authentication		=> nil,
#  :enable_starttls	  => nil,
#  :enable_starttls_auto => true,
#  :openssl_verify_mode  => nil,
#  :ssl				  => nil,
#  :tls				  => nil,
#  :open_timeout		 => nil,
#  :read_timeout		 => nil
#}


関連する記事

Pleiades Eclipse 4.7 Oxygen で Ruby を使って MySQL にアクセスする

エディタのタブの設定









posted by lightbox at 2018-04-24 20:33 | Ruby 2018 | このブログの読者になる | 更新情報をチェックする

2018年04月10日


Eclipse + Ruby : win32ole(COM使用の為) + MySQL Connector/ODBC でループ処理をしながら更新

前提条件

Eclipse は Pleiades Eclipse 4.7 Oxygen です。前提となる環境は以下を参照して下さい。

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備
Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する

▼ プロジェクトの作成方法はこちらを参照して下さい
Pleiades Eclipse 4.7 Oxygen で Ruby を使って MySQL にアクセスする

Connector/ODBC 5.3.10

ADO から接続する場合、純粋に Windows からのアクセスになるので ODBC ドライバが必要になります。Ruby が 64ビットならば、ODBC ドライバも 64ビット用が必要になります。

ダウンロードページ

com_ado_mysql

以下は、ADO + COM で行われる標準的なレコードセットの読み込みと同時更新の処理です。
特徴的なのは、レコードセットの Fields コレクション( Field オブジェクト )を使用して値を直接セットして一行づつレコードを更新するところです。
require 'win32ole'

adOpenDynamic = 2
adLockOptimistic = 3

cn = WIN32OLE.new('ADODB.Connection')
rs = WIN32OLE.new('ADODB.Recordset')

driver = "{MySQL ODBC 5.3 Unicode Driver}"
server = "localhost"
db = "lightbox"
user = "root"
pass = ""

connectionString = "Provider=MSDASQL;Driver=%s;Server=%s;DATABASE=%s;UID=%s;PWD=%s;"
connectionString = format(connectionString, driver,server,db,user,pass)
puts connectionString

# **************************
# 接続
# **************************
begin
	cn.Open( connectionString )
rescue => ex
	print format("%d エラーが発生しました\n%s",ex.errno,ex.error)
	# 接続エラーの場合は終了
	exit!
end

rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic
rs.Open( "select * from 社員マスタ where 社員コード <= '0004' ", cn )

while !rs.EOF do

	line = ""
	rs.Fields.each do |field|
		line << format(" %s |",field.Type)
	end
	line.chop!
	puts line

	line = ""
	rs.Fields.each do |field|
		if field.Type == 202 then
			line << format(" %s |",field.Value)
		end
		if field.Type == 3 then
			# nil 値あり
			line << format(" %s |",field.Value.to_s)
		end
		if field.Type == 135 then
			line << field.Value.strftime(" %Y/%m/%d |")
		end
	end
	line.chop!
	puts line

	print format("%s,",rs.Fields("社員コード").Value)
	print format("%s,",rs.Fields("氏名").Value)
	print format("%s,",rs.Fields("フリガナ").Value)
	print format("%s,",rs.Fields("所属").Value)
	print format("%d,",rs.Fields("性別").Value)
	print format("%d,",rs.Fields("給与").Value)
	if !rs.Fields("手当").Value.nil? then
		print format("%d,",rs.Fields("手当").Value)
	else
		print ","
	end
	print format("%s,",rs.Fields("管理者").Value)
	print rs.Fields("作成日").Value.strftime("%Y/%m/%d,")
	print rs.Fields("更新日").Value.strftime("%Y/%m/%d,")
	print rs.Fields("生年月日").Value.strftime("%Y/%m/%d\n")

	rs.Fields("管理者").Value = "0001"
	rs.Update()

	rs.MoveNext()

end

# **************************
# 接続解除
# **************************
if cn.State >= 1 then
	cn.Close()
end

print("終了しました\n")


CursorTypes, LockTypes, and CursorLocations

※ MySQL は 以下の三つの組み合わせのみ動作
adUseClient/adOpenStatic
adUseServer/adOpenForwardOnly
adUseServer/adOpenDynamic

※ ADO でデフォルトは adUseServer

エディタのタブの設定








タグ:ruby MySQL ODBC
posted by lightbox at 2018-04-10 19:46 | Ruby 2018 | このブログの読者になる | 更新情報をチェックする

2018年04月05日


Pleiades Eclipse 4.7 Oxygen で Ruby を使って MySQL にアクセスする

1) 前提条件

以下のリンク先で、Pleiades Eclipse 4.7 Oxygen の導入について解説しています。

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備

以下のリンク先で、Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition 内の MySQL のセットアップについて解説しています。

Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する

2) Ruby+Devkit 2.4.4-1 (x64) をインストール

rubyinstaller.org よりダウンロードします

日々変わっているようですが、現時点でのバージョンは上記の通りで MSYS2 は外から見えないようにインストールされます(Ruby のインストールの最後にチェックを外して MSYS2 をインストールしなくてもかまいません)









▼ 以下は MSYS2 のインストールです。1、2、3 と順に入力して実行します。


▼ メニューに登録された、Ruby 用のコマンドプロンプトを開きます


▼ gem install ruby-mysql で、mysql 用のライブラリをインストール


このライブラリは Ruby だけで書かれていて、インストールが簡単です。他のライブラリは Windows で動作させるにはいろいろ面倒なので、特別な理由が無い場合はこれを選びます。(サンプルコードを後述します)
GitHubruby-mysql/test/test_mysql.rb で勉強もできます。

3) Eclipse の Ruby パースペクティブで MySQL に接続して実行

Eclipse 用の Ruby で使用するワークスペース用フォルダを作成しておいて選択します。



Ruby パースペクティブを選択します。



手順1) 注意事項

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition でワークスペースを最初に開くと、『システム PYTHONPATH の変更が検出されました』と出るので、とにかくこれは避けれなかったので適用します。



また、Python と Ruby では、RemoteSystemsTempFiles が作成されてしまいます。あっても問題無いですが、削除したい場合は『Pleiades Oxygen : Python と Ruby のパースペクティブでワークスペースを開いて最初に現れる『RemoteSystemsTempFiles』を削除する』を参照して下さい。

手順2) プロジェクト作成

▼ 最初に ウインドウ => 設定 より Ruby のインタープリタ(ruby.exe) を選択しておきます


▼ Ruby プロジェクトを選択します


▼ プロジェクト名を入力して完了します


▼ 空の Ruby スクリプトを二つ作成します

1) my_func.rb
2) MySQL_01.rb

my_func.rb に MySQL のアクセスのメイン部分を関数で作成して、MySQL_01.rb でこのソースを require して使用します。

▼ 実行の構成


Ruby スクリプトをダブルクリックして、プロジェクトと起動スクリプトを選んで実行です。

手順3) ソースコード
▼ my_func.rb
=begin
	※ 前方参照の関数を require

	select の結果を CSV 形式の文字列で取得する
=end
def get_csv(connection,sql)

	# $ は グローバルスコープの変数
	$error_flg = 0
	$error_msg = ""

	str_row = ""
	begin
		result = connection.query(sql)
		result.each do |fld|
			len = fld.length
			for data in fld do
				# 文字列追加
				str_row << "#{data},"
			end
			# 最後のカンマを取り除く
			str_row.chop!()
			# 次の行の為改行( 文字列追加 )
			str_row << "\n"
		end
	# エラー処理
	rescue => ex
		$error_msg = ex.error + "\n"
		$error_flg = ex.errno
	end

	return str_row

end

▼ MySQL_01.rb
# https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql.rb
# http://www.tmtm.org/ruby/mysql/

require 'mysql'

# カレントのファイルを関数定義として読み込み
require './my_func'

# 接続
begin
	connection = Mysql.connect("127.0.0.1", "root", "", "lightbox")
rescue => ex
	print format("%d エラーが発生しました\n%s",ex.errno,ex.error);
	# 接続エラーの場合は終了
	exit!
end

# select の結果を CSV 形式の文字列で取得する
print get_csv(connection,"select * from 社員マスタ")

# 接続解除
connection.close

if $error_flg != 0 then
	print format("%d エラーが発生しました\n%s",$error_flg,$error_msg);
end


エディタのタブの設定






関連する記事

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備


Pleiades Oxygen 2 の XAMPP 内の FileZilla Server をインストールして使用する


Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する


Pleiades Oxygen 2 の XAMPP 内の MercuryMail をインストールして使用する





posted by lightbox at 2018-04-05 15:39 | Ruby 2018 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり