SQLの窓

2018年10月14日


Ruby(mechanize) で Seesaa のエクスポート



さくらインターネットに mechanize をインストールしても、https が動かないので Windows10 で mechanize をインストールして実行しています。

Windows10 に mechanize のインストールも、C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/net-http-persistent-3.0.0/lib/net/http/persistent.rb を以下のリンク先のように変更する必要があります。

Sets a default pool size for Windows as Process::RLIMIT_NOFILE is not supported
# ▼ エラー
DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4

# ▼ 変更
if Gem.win_platform? then 
  DEFAULT_POOL_SIZE = 256
else
  DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
end

引数は、cgi に引き渡される(cgi['no'])ので、#{cgi['no']} で文字列内に埋め込んで展開させます。

seesaa_backup.rb

Windows では、STDOUT が crlf で出力される為、Seesaa からの出力と同じにする為に、冒頭で STDOUT.binmode を実行しています。
# Seesaa エクスポート

STDOUT.binmode

# CGI 用
require "cgi"
cgi = CGI.new

# ヘッダを出力( ダウンロード用に application/octet-stream と ファイル名 )
puts "Content-Type: application/octet-stream; charset=utf-8"
puts "Content-Disposition: attachment; filename=export.log"
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

# Mechanize 用
require 'mechanize'
agent = Mechanize.new

agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
agent.follow_meta_refresh = true
agent.user_agent = 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'

# ログインページ
page = agent.get("https://ssl.seesaa.jp/pages/welcome/login/input")
# FORM 要素の name 属性で参照
form = page.form_with(:name => 'authpost')

# FORM 要素内の入力
form["member__email"] = "メールアドレス"
form["password"] = "パスワード"

# FORM 要素を使用して送信
page = form.submit

# ここでログインが完了するので、目的のページへ移動する

# 対象ブログのページ( デフォルトで新規投稿へ移動 )
page = agent.get("http://blog.seesaa.jp/cms/home/switch?blog_id=#{cgi['no']}")

# エクスポートページへ移動
page = agent.get('http://blog.seesaa.jp/cms/tools/mt/export/input')

# このページの1番目の FORM
form = page.forms[0]

# この FORM で送信
page = form.submit

# 結果をブラウザに出力
print page.body


関連する記事


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

2018年10月07日


さくらインターネットに Ruby をインストールして mechanize ( 先に nokogiri のインストールが必要でした )

現時点でインストールできた最も新しいバージョンは、2.4.4 でした
 
  2.3.0
  2.3.1
  2.3.2
  2.3.3
  2.3.4
  2.3.5
  2.3.6
  2.3.7
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.5.0-dev
  2.5.0-preview1
  2.5.0-rc1
  2.5.0
  2.5.1
  2.6.0-dev
  2.6.0-preview1
  2.6.0-preview2
2.5.0 と 2.5.1 は、BUILD FAILED となります インストール方法の参考は、『さくらレンタルサーバーにRubyをインストールする(2015-10-24)』 です。 ▼ .bashrc( 結局、local/bin と local/src は空です )
export RBENV_ROOT=$HOME/local/rbenv
export PATH=$RBENV_ROOT/bin:$HOME/local/bin:$PATH
eval "$(rbenv init -)"

export TMPDIR=$HOME/tmp

alias dir='ls -l'
参考通りに rbenv global 2.4.4 実行後、bundlerをインストールします。 bundler インストール時に『WARNING: Unable to pull data from 'https://rubygems.org/': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: tlsv1 alert protocol version (https://api.rubygems.org/specs.4.8.gz)』と出ますが、インストールは完了します。 エラーが出る場合
gem install bundler --source http://rubygems.org と実行してみて下さい。

以降で install エラーが出る場合は、

gem sources --remove https://rubygems.org/ を実行してから 
gem sources --add http://rubygems.org で http を登録します

確認は gem sources
gem install mechanize インストールは失敗しますが、表示中に『gem install pkg-config -v "~> 1.1"』とあるので実行してインストールします。その後、 gem install nokogiri -- --use-system-libraries を実行します。 『参考 : Installing Nokogiri』 最後に、『gem install mechanize』を実行して完了です。 テスト結果 Wndows10 上の Ruby + mechanize では、C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/net-http-persistent-3.0.0/lib/net/http/persistent.rb を以下のリンク先のように変更する必要がありました。 Sets a default pool size for Windows as Process::RLIMIT_NOFILE is not supported さくらインターネット上の mechanize では、どうも思ったような結果が得られないので、インストールができても使えるとは限りません。( どうも SSL のワーニングが関係しているかもしれません。http でアクセスできる場所が動作しますが、https では動作しません )
posted by lightbox at 2018-10-07 00:00 | Ruby 2018 | このブログの読者になる | 更新情報をチェックする

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

2018年05月16日


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

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

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 00:00 | 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 ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり