SQLの窓

2018年07月16日


Ruby + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート





JavaScript は jQuery を使用します。

テンプレート構造

IFRAME 内の処理( req フォルダ内 )が実際の問い合わせ処理になります。メインページの下部に CSS の calc 関数を使用してフィットさせています。



メインの control.rb( エントリポイント )

更新等を行う場合は、ここに入力値のコントロールが入ります。ここでは画面を表示するだけなので、Ruby を実行する為の基本的な設定と、画面の読み込みを行っています。
Encoding.default_internal='utf-8'
# カレントフォルダを require 参照パスに追加
$:.unshift File.dirname(__FILE__)
require 'cgi'
require 'mysql'
require 'pp'
require 'json'
require 'settings'
require 'model'

txlog( "Script Encoding : " << __ENCODING__.to_s )
txlog( "Default external Encoding : " << Encoding.default_external.to_s )
txlog( "Default internal Encoding : " << Encoding.default_internal.to_s )

# **************************************
# グローバル変数
# **************************************
$error_flg = 0
$error_msg = ""
$base_path = __FILE__

# **************************************
# フィールド参照の定義
# **************************************
$fld_names = {
	"条件" => "nm",
	"送信" => "send"
}

require 'view'

冒頭の Encoding.default_internal='utf-8' は、Ruby にかかわるエンコーディングを utf-8 に揃える為に行っています。( Encoding.default_external はインストール時に設定しています )



▼ デバッグログ
開始
Script Encoding : UTF-8
Default external Encoding : UTF-8
Default internal Encoding : UTF-8
# **************************************
# フィールド参照の定義
# **************************************
$fld_names = {
	"条件" => "nm",
	"送信" => "send"
}
$fld_names は、settings.rb で定義されている forms メソッドと fields メソッドで使用する為のハッシュです。

ソースコード上の呼び名を日本語で定義して、画面(ヒアドキュメント)の INPUT 要素に埋め込んだり、値を参照する為に用意しています。
<input
	data-pass="2i"
	type="text"
	name="#{fields("氏名")}" 
	value="#{forms("氏名")}">
settings.rb ( 共通処理 ) Ruby の cgi としての設定( メソッド定義を含む )と、アプリとしての初期設定と、デバッグ用のログ関数の定義を行っています。この処理は、問い合わせ処理側( req フォルダ内 )からも読み込まれて使用されます。
# ***************************
# 共通処理
# ***************************
$cgi = CGI.new
 
puts "Content-Type: text/html; charset=utf-8"
puts  "Expires: Thu, 19 Nov 1981 08:52:00 GMT"
puts "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
puts "Pragma: no-cache"
puts
 
$params = $cgi.params


# ここで $params 内の文字列のセキュリティ上の処理


# デバッグログの初期化
File.open("debug.log", "w"){ |f| f.puts "開始" }

# デバッグ用メッセージ
$check_message = "";

# クライアントコントロール
$pass = "1";


# **************************************
# FORM 用変数の参照と設定
# **************************************
def forms( target, setter=nil )

	result = ""

	key = $fld_names[target]

	if not setter.nil? then
		$params[key][0] = setter
		return
	end

	if not $params[key].empty? then
		result = $params[key][0]
	end

	return result

end

# **************************************
# フィールド用文字列の参照
# **************************************
def fields( target )

	return $fld_names[target]

end

# ***************************
# デバッグログ関数(テキスト)
# ***************************
def txlog(message)

	File.open("debug.log", "a"){ |f| f.puts message + "\n" }

end

# ***************************
# デバッグログ関数
# (オブジェクト等)
# ***************************
def pplog(data)

	File.open("debug.log", "a"){ |f| f.puts data.pretty_inspect }

end



以下は、pplog の pretty_inspect で、$cgi.params の結果を表示したものです。
{"nm"=>["川"], "send"=>["問合せ"]}
view.rb ( メイン画面定義 ) 画面定義はヒアドキュメントで行っています。変数のパースは #{メソッドまたは変数} です。 JavaScript の外部ファイルの読み込み時のキャッシュ制御を行う為、ページが表示された時間を URL に付加しています。
# **************************************
# js 選択
# **************************************
$js = "entry.js";
#$js = "entry-json.js";

# **************************************
# js キャッシュ用
# **************************************
$tm = Time.now.to_f.to_s.gsub(/[.]/,"")

# **************************************
# 画面定義
# **************************************
$out_client = <<HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />

<script src="#{$js}?#{$tm}"></script>

<style>
/* ブロックを左右に表示  */
.ttl {
	display: inline-block;
	width: 150px;
}
.entry {
	display: inline-block;
}
.line {
	margin-bottom: 0;
}

/* IFRAMEコントロール用  */
html,body {
	height: 100%;
}

body {
	margin: 0;
}

/* IFRAMEコントロール用  */
#head {
	padding: 16px;
	width: 100%;
	height: 100px;
	background-color: #e0e0e0;
}
#extend {
	display: block;
	margin-left: auto;
	margin-right: auto;
	width: calc( 100% - 3px );
	height: calc( 100% - 100px - 2px );
	border: solid 2px #c0c0c0;
}
</style>
</head>
<body>

<div id="head">
	<input type="hidden" value="#{$pass}" id="pass">

	<form method="post" action="req/control.rb" target="extend">
		<p class="ttl">
			氏名検索
		</p>
		<p class="entry">

			<input
				class="ml-4"
				name="#{fields("条件")}"
				id="cond"
				type="text">
			<input
				class="ml-4 iframe-option btn btn-success"
				id="btn"
				name="#{fields("送信")}"
				type="submit"
				value="問合せ">

			<a
				class="ml-4 btn btn-info btn-sm"
				href="#{File.basename($base_path)}"
				title="1:#{ENV["SCRIPT_NAME"]}, 2:#{$cgi.script_name}">GET 再読み込み</a>


		</p>
		<p class="line"></p>

	</form>

	<h4 class="text-danger">#{$check_message}</h4>

</div>

<iframe id="extend" name="extend" src="req/control.rb"></iframe>

</body>
</html>
HTML

print $out_client


※ 画面上のスペーシングに Bootsrtap のクラスである ml-4( margin-left: 1.5rem !important; ) を使用しています。
※ btn btn-success、btn btn-info btn-sm は、ボタン用の Bootsrtap のクラス

entry.js

Bootstrap のボタンの表示位置の調整を行っています。
$(function(){

	// ***************************
	// ボタン表示位置微調整
	// ***************************
	$( ".btn" ).css({
		"margin-top": "-4px"
	});

});


control.rb ( 問い合わせのエントリポイント )

単独で動作する問い合わせアプリケーションです。GET メソッドで QueryString を受け取って内部の SQL 処理に引き渡します。セキュリティ上の文字列の処理は省略しています。

MySQL の処理を行う為に最も容易な Ruby/MySQL を使用しています。


Encoding.default_internal='utf-8'
# カレントフォルダを require 参照パスに追加
$:.unshift File.dirname(__FILE__)
require 'cgi'
require 'mysql'
require 'pp'
require 'json'
require '../settings'
require '../model'

txlog( "Script Encoding : " << __ENCODING__.to_s )
txlog( "Default external Encoding : " << Encoding.default_external.to_s )
txlog( "Default internal Encoding : " << Encoding.default_internal.to_s )

# **************************************
# グローバル変数
# **************************************
$error_flg = 0
$error_msg = ""
$base_path = __FILE__

# **************************************
# フィールド参照の定義
# **************************************
$fld_names = {
	"条件" => "nm"
}

# ***************************
# MySQL 接続
# http://www.tmtm.org/ruby/mysql/
# ***************************
begin
	$con = Mysql.connect("127.0.0.1", "root", "", "lightbox")
rescue => ex
	print "<pre>"
	print format("%d エラーが発生しました\n%s\n",ex.errno,ex.error)
	# 接続エラーの場合は終了
	exit
end

build_table()

# **************************************
# 接続解除
# **************************************
$con.close

require 'view'

view.rb ( 問い合わせ用画面 )

テーブル表示時のカーソルを常にデフォルトに固定して、テーブルのデータが折り返さないように以下の CSS が追加定義されています

table 部分の行データの埋め込み部分に tbody を明示しているのは、行を jQuery で動的に作成した時に tbody が無いと Bootstrap の css が動作しないからです( 他のテンプレートと差異を少なくする為 )。
# **************************************
# js 選択
# **************************************
$js = "entry.js";
#$js = "entry-json.js";

# **************************************
# js キャッシュ用
# **************************************
$tm = Time.now.to_f.to_s.gsub(/[.]/,"")

# **************************************
# 画面定義
# **************************************
$out_client = <<HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />

<script src="#{$js}?#{$tm}"></script>

<style>
td {
	cursor: default!important;
	white-space: pre;
}

body {
	margin: 0;
	padding: 16px;
}
</style>
</head>
<body>

	<table class="table table-hover">
		<tbody id="tbl">
			#{$lines}
		</tbody>
	</table>

</body>
</html>
HTML

print $out_client

print pplog( $params )


model.rb ( テーブル作成部分 )

1) 列データの文字列をまずループで作成しています( SQLを変更するだけで違った問い合わせを表現できます )
2) 列データが完成する毎に、行データを作成して全体の文字列に追加していきます。

※ Ruby/MySQL ではデータを取得時に日本語の列名を扱えなかったので、SQL で別名として英字を使用しています
# ***************************
# テーブル表示
# ***************************
def build_table()

	$lines = "";

	sql = <<-SQL
		select
			社員コード as scode,
			氏名 as shimei,
			フリガナ as furi,
			所属 as syozoku,
			性別 as seibetu,
			作成日 as create_date,
			更新日 as update_date,
			給与 as kyuyo,
			手当 as teate,
			管理者 as kanri,
			DATE_FORMAT(生年月日,'%Y/%m/%d') as birthday
		from 社員マスタ
		where 
			氏名 like '%#{forms("条件")}%'
	SQL

	txlog( sql )

	begin
		result = $con.query(sql)

		# 列の名前でタイトル作成
		fields = result.fetch_fields()
		fields.each do |field|
			$lines << "<th>#{field.name}</th>\n"
		end

		result.each do |fld|
			len = fld.length
			cells  = ""
			for data in fld do
				# 文字列追加
				cells << "<td>#{data}</td>"
			end
			# 次の行の為改行( 文字列追加 )
			$lines << "<tr>#{cells}</tr>\n"
		end
	# エラー処理
	rescue => ex
		pplog( ex )
		$check_message = "SQL に問題があります"
	end

end


関連する記事

PHP + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート

Python + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート

CSS の calc 関数を使って、IFRAME を画面下半分にフィットさせる




posted by lightbox at 2018-07-16 13:09 | Ruby | このブログの読者になる | 更新情報をチェックする

2018年05月15日


Ruby のエンコーディング( スクリプト・デフォルト・STDIN・STDOUT )



Ruby には重要なエンコーディング設定として以下の3つが存在します

1) スクリプトエンコーディング
2) デフォルト外部エンコーディング
3) デフォルト内部エンコーディング

但し内部エンコーディングに関しては、デフォルトは nil であって、意味は『何もしない』という考え方が一番問題無く理解できると思います。

しかし、Ruby の デフォルト外部エンコーディングは、実際の外部記憶装置にあるデータのエンコーディングとして扱われるので、指定する事によって日本語文字列の問題を解決できます。( インストール時に外部エンコーディングを UTF-8 に設定してテストしています )



そして、通常はソースコードも UTF-8 で書かれると思いますが、マジックコメントによって他のエンコーディングでの記述が可能です。

WEB アプリ用テストコード
# -*- coding: utf-8 -*-

puts "Content-Type: text/plain; charset=utf-8"
puts  "Expires: Thu, 19 Nov 1981 08:52:00 GMT"
puts "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
puts "Pragma: no-cache"
puts

# *********************
# エンコーディング の設定
# *********************
#Encoding.default_external='utf-8'
#Encoding.default_external='cp932'
#Encoding.default_internal='utf-8'
# *********************
# 外部,内部
# *********************
#STDIN.set_encoding('cp932', 'utf-8')
#STDOUT.set_encoding('cp932', 'utf-8')

# *********************
# 出力の整理
# *********************
def sep
	puts
	puts "---------------------"
end

# *********************
# ソースエンコーディング
# *********************
puts "Script Encoding"
p __ENCODING__ # スクリプトエンコーディング(1行目/マジックコメントで決定)
sep

# *********************
# エンコーディング
# *********************
puts "Default Encoding"
print "external : "
p Encoding.default_external
print "internal : "
p Encoding.default_internal
sep

# *********************
# STDIN エンコーディング
# *********************
puts "STDIN Encoding"
print "external : "
p STDIN.external_encoding
print "internal : "
p STDIN.internal_encoding
sep

# *********************
# STDOUT エンコーディング
# *********************
puts "STDOUT Encoding"
print "external : "
p STDOUT.external_encoding
print "internal : "
p STDOUT.internal_encoding
sep

# *********************
# 実際のエンコーディング
# enc => Encoding
# *********************
Encoding.list.each do |enc|
	print enc, ','
end
puts
sep

# *********************
# 別名を含む
# enc => String
# *********************
Encoding.name_list.each do |enc|
	print enc, ','
end
puts
sep

# *********************
# テキスト入力
# *********************
file = File.open('日本語.txt').each_line do |line|
	print line
end
file.close
sep





コマンドプロンプト用テストコード



この文字化けは、標準入力の文字列が SHIFT_JIS  であるのに対して、UTF-8 が設定されているので化けています。以下の設定を追加すると正しく表示されます。
STDIN.set_encoding('cp932', 'utf-8')
ただ、テキストファイル内の文字列は、WEB アプリのテストコードでは明らかに UTF-8 にもかかわらず、標準出力には正しく表示されています。これは、Windows の ロケール等で判断されて自分的に変換されていると推測します( わりと良くある事なので )。
# -*- coding: utf-8 -*-

# *********************
# エンコーディング の設定
# *********************
#Encoding.default_external='utf-8'
#Encoding.default_external='cp932'
#Encoding.default_internal='utf-8'
# *********************
# 外部,内部
# *********************
#STDIN.set_encoding('cp932', 'utf-8')
#STDOUT.set_encoding('cp932', 'utf-8')

# *********************
# 出力の整理
# *********************
def sep
	puts
	puts "---------------------"
end

# *********************
# ソースエンコーディング
# *********************
puts "Script Encoding"
p __ENCODING__ # スクリプトエンコーディング(1行目/マジックコメントで決定)
sep

# *********************
# エンコーディング
# *********************
puts "Default Encoding"
print "external : "
p Encoding.default_external
print "internal : "
p Encoding.default_internal
sep

# *********************
# STDIN エンコーディング
# *********************
puts "STDIN Encoding"
print "external : "
p STDIN.external_encoding
print "internal : "
p STDIN.internal_encoding
sep

# *********************
# STDOUT エンコーディング
# *********************
puts "STDOUT Encoding"
print "external : "
p STDOUT.external_encoding
print "internal : "
p STDOUT.internal_encoding
sep

# *********************
# テキスト入力
# *********************
file = File.open('日本語.txt').each_line do |line|
	print line
end
file.close
sep

# *********************
# 標準入出力
# *********************
while line = STDIN.gets
	line = line.chomp!
	puts "【#{line}】"
end
sep




▼ コマンドプロンプト用バッチファイル
setlocal

@path=%path%;C:\Ruby24-x64\bin

dir | ruby.exe std.rb

pause

endlocal
posted by lightbox at 2018-05-15 19:23 | Ruby | このブログの読者になる | 更新情報をチェックする

Ruby 2.4 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました

Ruby 2.4.0 リファレンスマニュアル

Python 3.6 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました と同様です。HTML 部分はヒアドキュメント作成し、GET でも POST でも動作します。

require "cgi"
cgi = CGI.new

puts "Content-Type: text/html; charset=utf-8"
puts  "Expires: Thu, 19 Nov 1981 08:52:00 GMT"
puts "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
puts "Pragma: no-cache"
puts

params = cgi.params

fld_names = {"氏名" => "field1", "フリガナ" => "field2"}
fld_names.each { |key, value|
	if params[value].empty? then
		params[value] = ""
	end
}

out_client = <<HTML
<html>
<head>
</head>
<body>
	<form>
		<p>氏名 : <input type="text" name="#{fld_names["氏名"]}" value="#{params[fld_names["氏名"]][0]}"></p>
		<p>フリガナ : <input type="text" name="#{fld_names["フリガナ"]}" value="#{params[fld_names["フリガナ"]][0]}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>
HTML

print out_client

Hash#each

※ ドキュメントの参照
fld_names = {"氏名" => "field1", "フリガナ" => "field2"}
fld_names.each { |key, value|
	処理
}
ハッシュのキーと値を引数としてブロックを評価します。 Array#empty? ※ ドキュメントの参照
require "cgi"
cgi = CGI.new
params = cgi.params
if params[value].empty? then
	params[value] = ""
end
同名の値がブラウザより送られて来る事を想定して、params[value] は配列になります。なので、普段は先頭の params[value][0] を使用する事になります。ですから本来ならば、params[value] = [""] ですが、後続の処理的にも結果的にも同じなので、単純に "" をセットしています 式展開 ※ ドキュメントの参照
<input type="text" name="#{fld_names["氏名"]}" value="#{params[fld_names["氏名"]][0]}">
"(ダブルクォート) で作成されたリテラルの中に #{} の形式で変数や文字列を返すメソッドを埋め込むんで、内容に置き換える事ができます。 AN HTTP Server の設定 テストにはまだまだ使える(重宝する) AN HTTP Server の正しい使用方法
posted by lightbox at 2018-05-15 14:49 | Ruby | このブログの読者になる | 更新情報をチェックする

2018年05月13日


Ruby 2.4 で GET/POST メソッドを想定した CGI 用のテンプレート改良版( FORM で MySQL 参照と更新 )

Ruby 2.4.0 リファレンスマニュアル



以前の単純な表示するだけのテンプレートは『Ruby 2.4 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました』です


テンプレートの要点

1) メイン / 共有メソッド / 画面 のソース分割

Ruby は単純にグローバル変数が各ソースで共有できたので、それらでコントロールしています。

2) fields() と forms() の画面埋め込み

上記2メソッドで FORM 内の入力値のコントロールをしています

※ $fld_names を定義し、日本語でフィールドを参照するようにしてソースを読みやすくしています。

メイン
# **************************************
# https://docs.ruby-lang.org/ja/latest/method/Array/i/unshift.html
# ライブラリ参照にカレントを追加
# **************************************
$:.unshift File.dirname(__FILE__)

# **************************************
# http://www.tmtm.org/ruby/mysql/
# gem install ruby-mysql
# **************************************
require 'mysql'

# **************************************
# カレントのファイルを読み込み
# **************************************
require 'my_func'

# **************************************
# 使用するライブラリ
# **************************************
require 'cgi'
require 'pp'

# **************************************
# グローバル変数
# **************************************
$error_flg = 0
$error_msg = ""
$check_message = ""
$fld_names = {}
$base_path = __FILE__

cgi_init

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

# **************************************
# フィールド参照の定義
# **************************************
$fld_names = {
	"確認" => "send1",
	"送信" => "send2",
	"社員コード" => "key",
	"氏名" => "field1",
	"フリガナ" => "field2"
}

# **************************************
# 第一パス( MySQL 参照 )
# **************************************
if forms("確認") == "確認" then

	$check_message << "確認が押された"

	sql = <<-SQL
	select * from 社員マスタ
		where 社員コード = '#{forms("社員コード")}'
	SQL

	$check_message << " : " << sql

	begin
		result = connection.query(sql)
		row = result.fetch_row()

		forms("氏名", row[1])
		forms("フリガナ", row[2])

			# エラー処理
	rescue => ex
	end

end

# **************************************
# 第ニパス( MySQL 更新 )
# **************************************
if forms("送信") == "送信" then

	$check_message << "送信が押された"
	sql = "update 社員マスタ set 氏名 = '#{forms("氏名")}', フリガナ = '#{forms("フリガナ")}' where 社員コード = '#{forms("社員コード")}'  "

	$check_message << " : " << sql

	begin
		result = connection.query(sql)

		# エラー処理
	rescue => ex
	end

end


# **************************************
# 画面定義
# **************************************
require 'my_view'


# **************************************
# cgi データの確認
# **************************************
print "<div style='margin-top:30px;'>-------------------------------------</div>"
pp $params

# **************************************
# select の結果を CSV 形式の文字列で取得する
# **************************************
print "<pre>"
print "<div style='margin-top:30px;'>-------------------------------------</div>"
print get_csv(connection,"select * from 社員マスタ")
print "</pre>"

# **************************************
# 接続解除
# **************************************
connection.close

# **************************************
# get_csv のエラー
# **************************************
if $error_flg != 0 then
	print "<div style='margin-top:30px;'>-------------------------------------</div>"
	print format("%d エラーが発生しました\n%s",$error_flg,$error_msg);
end


インデント ヒアドキュメント( <<-識別子 )

※ ドキュメントの参照
if forms("確認") == "確認" then
	$check_message << "確認が押された"
	sql = <<-SQL
	select * from 社員マスタ
		where 社員コード = '#{forms("社員コード")}'
	SQL
end
開始ラベルを <<-識別子 のように - を付けて書くことで終端行をインデントすることができます。さらに、<<~識別子 を使用すると、最も小さなインデントに合わせて行頭のスペースを削除します。 共有メソッド( my_func.rb )
=begin
	※ 前方参照の関数を require

	select の結果を CSV 形式の文字列で取得する
=end
# **************************************
# select データの確認
# **************************************
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

# **************************************
# CGI 処理
# **************************************
def cgi_init

	$cgi = CGI.new
	
	puts "Content-Type: text/html; charset=utf-8"
	puts  "Expires: Thu, 19 Nov 1981 08:52:00 GMT"
	puts "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
	puts "Pragma: no-cache"
	puts
	
	#pp $:
	
	$params = $cgi.params

end

# **************************************
# FORM 用変数の参照と設定
# **************************************
def forms( target, setter=nil )

	result = ""

	key = $fld_names[target]

	if not setter.nil? then
		$params[key][0] = setter
		return
	end

	if not $params[key].empty? then
		result = $params[key][0]
	end

	return result

end

# **************************************
# フィールド用文字列の参照
# **************************************
def fields( target )

	return $fld_names[target]

end



画面( my_view.rb )
# **************************************
# 画面定義
# **************************************
out_client = <<HTML
<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<h4>#{$check_message}</h4>
	<a href="#{File.basename($base_path)}">GET 再読み込み</a>
	<form method="post">
		<p>
			社員コード : <input type="text" name="#{fields("社員コード")}" value="#{forms("社員コード")}">
			<input type="submit" name="#{fields("確認")}" value="確認">
		</p>
		<p>
			氏名 : <input type="text" name="#{fields("氏名")}" value="#{forms("氏名")}">
		</p>
		<p>
			フリガナ : <input type="text" name="#{fields("フリガナ")}" value="#{forms("フリガナ")}">
		</p>
		<p>
			送信 : <input type="submit" name="#{fields("送信")}" value="送信">
		</p>
	</form>
</body>
</html>
HTML

print out_client


AN HTTP Server の設定




テストにはまだまだ使える(重宝する) AN HTTP Server の正しい使用方法




posted by lightbox at 2018-05-13 23:53 | Ruby | このブログの読者になる | 更新情報をチェックする

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年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

エディタのタブの設定








タグ:ODBC MySQL ruby
posted by lightbox at 2018-04-10 19:46 | Ruby | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり