SQLの窓

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 | Pleiades | このブログの読者になる | 更新情報をチェックする

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

目的は、Pleiades(Eclipse 4.7 Oxygen 2) Ultimate Full Edition でインストール済、または準備されているソフトウェアをインストールして利用可能にする事です。

大きなソフトウェアでは、以下のようになります

1) Java ( Eclipse 内で JDK 6,7,8,9 が使用可能です / インストールされています )
2) Tomcat ( Tomcat は 6,7,8,9 が同梱されて選択して使用可能です / xampp にも Tomcat7 が入っています )
3) php ( php(x86) は xampp に入っていますが、既存のものを使用できます )
4) Ruby (Ruby そのものはインストールが必要です)Ruby 2.4 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみましたRuby 2.4 で GET/POST メソッドを想定した CGI 用のテンプレート改良版( FORM で MySQL 参照と更新 )
5) Python (Python の 2(x64) と 3(x64) が同梱されて実行可能)
    MySQL の接続を行う場合は、Windows インストーラで Python をあらためてインストールが必要です
6) Perl ( perl(x86) は xampp に入っています )
7) C++/C ( MinGW GCC が入っていてビルドできます )

これらの開発環境は、Eclipse の UI よりプロジェクトを作成してプログラムを作成する事ができます。

8) xampp

これは開発する為のサーバー環境で、インストール済のものとインストールが必要なものがあります。

インストール済のサーバー用ソフトウェア

a) Apache  ( xampp から起動してすぐ使えます )
    ※既にインストール済の www サーバーや スクリプトベースの簡易サーバーも使えます
b) MySQL ( xampp から起動してすぐ使えます )
c) perl ( インストール済です )
d) php ( PHP 5.6.32 がインストール済です )
e) phpMyAdmin ( Apache に定義済の URL で使用できます )
f) sendmail ( fake sendmail という Windows 用の sendmail が入っています )
g) Tomcat ( xampp 環境で Eclipse とは別にインストールされています )

インストールが必要なサーバー用ソフトウェア

a) FileZillaFTP ( インストールする必要があります )
b) MercuryMail ( インストールする必要があります )

Pleiades のダウンロード

MergeDoc Project より Eclipse 4.7 Oxygen に入り、Windows 64bit Ultimate Full Edition をクリックしてダウンロードします。

http://ftp.jaist.ac.jp/pub/mergedoc/pleiades/4.7/pleiades-4.7.2-ultimate-win-64bit-jre_20171225.zip と表示が出てダウンロードされます。 



ここから、お約束の注意事項

Pleiades の中に入っている環境を問題無く使用する為には、二つのルールが昔からあります。

1) zip 書庫の名前を短くして( ここでは pleiades.zip )、c:\pleiades.zip とする。
2) 解凍ソフトとして 安全なのは Windows エクスプローラー
   7-ZipWinRAR で高速解凍 (パスの長さ制限を超えても正常に解凍できるため注意が必要)

ここでは、7-zip を( 昔から ) 使用しています。

最初の実行は、eclipse.exe -clean.cmd

これもお約束で、追加でソフトウェアをインストールしたり、環境が変化した場合に実行するようにしています。



最初のこの "c:\pleiades\eclipse\eclipse.exe -clean.cmd" の実行で、xampp の初期設定がされるようです。



ワークスペースを準備する

いろいろな言語や環境が利用可能なので、環境別のフォルダを用意してまず Java の Hello World を行います。



▼ コンソール Java 用のワークスペースを作成します



ワークスペースを作る毎に何故か 『システム PYTHONPATH の変更が検出されました』と出るので、良く解らないので気持ち悪いですが適用します。( いろいろ調べたんですが謎 )



言語毎に パースペクティブが用意されています。



Java のプロジェクトを作成します



プロジェクト名を入力して完了します( 他はデフォルトです )



パースペクティブは、JavaEE がシンプルなので変更して、開始コードを追加します。

▼ パースペクティブ変更


▼ 開始コードを追加




フォントを好みに変更します。



編集ボタンをクリックしてフォントを選択します。



Meiryo UI は、上へスクロール2回



実行の構成を作成します( 他の言語の事もあるのでこれに慣れたほうがいいです )
( ツールバーの実行ボタンの右の ▼ をクリックしてメニューを表示 )



Java アプリケーションをダブルクリックすると新しい構成が追加されるのでそのまま実行します。



ソースはこんな感じで行いました。以降の実行はツールバーからクリックして実行されます。




関連する記事Pleiades Oxygen 2 の XAMPP 内の FileZilla Server をインストールして使用するPleiades Oxygen 2 の XAMPP 内の MercuryMail をインストールして使用するPleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録するPleiades Eclipse 4.7 Oxygen で Python を使って MySQL にアクセスする


fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信 : Gmail なので ssl(465)

Pleiades Oxygen : Python と Ruby のパースペクティブでワークスペースを開いて最初に現れる『RemoteSystemsTempFiles』を削除する

Pleiades All in One(NEON) で、サーブレットとJSP を作成する手順

Eclipse に Window Builder をインストールして Swing アプリケーションを作成する(1)

Java 8 で、sun.jdbc.odbc.JdbcOdbcDriver を使う手順



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

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 | Pleiades | このブログの読者になる | 更新情報をチェックする
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 終わり