SQLの窓

2018年04月30日


Python ドキュメントに沿った、テキストファイル読み込みの理解

ソースコードの文字コード

このサンプルでは、ソースコードは SHIFT_JIS を使用しています。( デフォルトでは、Python のソースコードは UTF-8 でエンコードされているものとして扱われます )

※ Python 内で使用される エンコーディングのリスト

# -*- coding: cp932 -*-

try:
	handle = open(r"C:\Users\sworc\Downloads\社員マスタ.csv", "r", encoding="cp932")
except Exception as err:
	print(err)
	quit()

for method in dir(handle):
	if method == "__iter__":
		print(str(type(handle)) + " は for で使える")
		break
else:
	print(str(type(handle)) + " は for で使えない")

for line in handle:
	print(line,end="")


handle.close()

リテラル

ファイルのパスとして使用しているリテラルに、文字 'r' または 'R' をプレフィックスに持つことができます。そのような文字列は raw strings と呼ばれ、バックスラッシュをリテラル文字として扱いますfor 文

for 文は、反復可能なオブジェクト (iterable object) 内の要素に使用できます。

ここでは、組み込み関数の open 関数で取得した ファイルオブジェクト に対して for を実行します。その前に dir 関数 で取得したメソッド一覧の中に __iter__ がある事を確認しています。オブジェクトの中に __iter__ があれば、反復可能な処理が実装されています。

※ break 文が実行されると、 else 節の処理を実行することなくループを終了します

open で取得された ファイルオブジェクト

open() 関数が返す file object の型はモードに依存します。 open() をファイルをテキストモード ('w', 'r', 'wt', 'rt', など) で開くのに使ったときは io.TextIOBase (特に io.TextIOWrapper) のサブクラスを返します。

io.TextIOWrapper > io.TextIOBase > io.IOBase

※ close メソッドは io.IOBase にあります。

その他

str 関数は、オブジェクトを文字列として返します




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

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月22日


Python3 でメール送信 ( さくらインターネット )

さくらインターネットのユーザ文字列が埋め込みサンプルとして適しているので使用しました。

デフォルトでは、utf-8 で Subject がエンコードされるので email.charset.Charset クラスのメソッドで iso-2022-jp に変換しています。
Subject: =?utf-8?b?UHl0aG9uIOOBi+OCiSBVVEYtOCDjga7mloflrZfliJc=?=
文字列の埋め込みは f-string です。
# *************************
# 型と内容の確認
# *************************
def typrint(obj):
	print(type(obj))
	print(obj)
	print("")

# *************************
# ライブラリ
# *************************
import smtplib
from email.mime.text import MIMEText
import datetime
from  email.charset import Charset

# *************************
# 日付のテスト
# *************************
# 日付だけ欲しい場合はこちら
today = datetime.date.today()
typrint(today)

# datetime オブジェクトは date オブジェクトおよび time オブジェクトの全ての情報が入っている単一のオブジェクトです。
today = datetime.datetime.today()
typrint(today)

# 書式 : https://docs.python.jp/3/library/datetime.html#strftime-strptime-behavior
strdate = today.strftime("%Y-%m-%d %H:%M:%S")
typrint(strdate)

# *************************
# メール用キャラクタセット
# *************************
jis='iso-2022-jp'

# *************************
# 本文
# *************************
text = "Python\n日本語\nUTF-8\n"
text += "Python文字列操作マスター\nhttps://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887"
text += "https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887"
text = text.encode(jis)		# iso-2022-jp でテキスト全体をエンコード
typrint(text)
msg = MIMEText(text, 'plain', jis)		# メール送信用データのベースを作成

# *************************
# 送信用情報
# *************************
user = "ユーザ"		# さくらインターネットのユーザ
password = "パスワード"
port = 587
to = "宛先メールアドレス"

# *************************
# メールヘッダ
# *************************
charset = Charset(jis)		# Subject 用エンコードに使用( これをしないと utf-8 が使用される )
msg["Subject"] = charset.header_encode("Python から UTF-8 の文字列 : " + strdate )
msg["From"] = f"{user}@{user}.sakura.ne.jp"
msg["To"] = to

# *************************
# 確認用出力
# *************************
print(msg)

# *************************
# メール送信
# *************************
try:

	smtp_server = smtplib.SMTP(f"{user}.sakura.ne.jp",port)
	smtp_server.starttls()
	smtp_server.login(f"{user}@{user}.sakura.ne.jp", password)
	smtp_server.send_message( msg )
	smtp_server.quit()

	print("メールを送信しました")

except Exception as err:

	print(err)
	print("メール送信に失敗しました" )




▼ 出力結果
<class 'datetime.date'>
2018-04-22

<class 'datetime.datetime'>
2018-04-22 20:30:27.176934

<class 'str'>
2018-04-22 20:30:27

<class 'bytes'>
b'Python\n\x1b$BF|K\\8l\x1b(B\nUTF-8\nPython\x1b$BJ8;zNsA`:n%^%9%?!<\x1b(B\nhttps://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887'

Content-Type: text/plain; charset="iso-2022-jp"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: =?iso-2022-jp?b?UHl0aG9uIBskQiQrJGkbKEIgVVRGLTggGyRCJE5KODt6TnMbKEIgOiAyMDE4LTA0LTIyIDIwOjMwOjI3?=
From: ユーザ@ユーザ.sakura.ne.jp
To: 宛先メールアドレス

Python
$BF|K\8l(B
UTF-8
Python$BJ8;zNsA`:n%^%9%?!<(B
https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887
メールを送信しました



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

2018年04月21日


Basp21 を使ったメール送信でバッチ処理用スクリプト比較 : PowerShell / VBScript / PHP

それぞれ特徴がありますが、PHP と VBScript は COM しか扱えませんが、PowerShell は、Framework ベースなので、ついでに COM を扱えるという立場です。テストする意味はあまり無いと思いますが、Basp21 の DLL を直接呼び出して実行も可能でしょうし、VB や C# のコードを書いてそちら側で実行させる事もできますし、さらにその場合は exe 形式にしてしまえるので今までのスクリプトとは少し意味が違ってきています。

関連する記事

PowerShell2.0 : VB.net と C# のコードをビルドして exe を作成する

SMTP サーバーは、さくらインターネットを使用しています

【さくらのメールボックス】基本仕様

PowerShell + Basp21 メール送信

▼ 32 ビットの PowerShell を実行する為、バッチファイルに以下のように記述します
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell -NoProfile -ExecutionPolicy Unrestricted "./basp_mail.ps1"
basp_mail.ps1
<#
	オブジェクト作成
#>
$Basp21 = New-Object -ComObject "Basp21"

$user = "ユーザー"
$to = "宛先"
$pass = "パスワード"

$SMTPServer = "$user.sakura.ne.jp:587"
$MailTo = "あなた <$to>"
$MailFrom = "わたし <$user@$user.sakura.ne.jp>"
$MailFrom += "`t$user@$user.sakura.ne.jp:$pass"

$ErrMessage = $Basp21.SendMail(
	$SMTPServer,
	$MailTo,
	$MailFrom,
	"こんにちは",
	"日本語表示`n日本語表示",
	""
)

if ( $ErrMessage -ne "" ) {
	$ErrMessage
}
else {
	"メール送信が終了しました。"
}


VBScript + Basp21 メール送信

▼ mail.bat( 64ビット PC からの実行 )
%systemroot%\syswow64\cscript.exe basp_mail.vbs
basp_mail.vbs
v_user = "ユーザー"
v_to = "宛先"
v_pass = "パスワード"

Set Basp21 = CreateObject( "Basp21" )

SMTPServer = v_user & ".sakura.ne.jp:587"
MailTo = "あなた <" & v_to & ">"
MailFrom = "わたし <" & v_user & "@" & v_user & ".sakura.ne.jp>"
MailFrom = MailFrom & vbTab & v_user & "@" & v_user & ".sakura.ne.jp:" & v_pass

ErrMessage = Basp21.SendMail( _
	SMTPServer, _
	MailTo, _
	MailFrom, _
	"こんにちは", _
	"日本語表示\n日本語表示", _
	"" _
)

if ErrMessage <> "" then
	Wscript.Echo ErrMessage
else
	Wscript.Echo "メール送信が終了しました。"
end if

PHP + Basp21 メール送信

▼ BASP21 に渡すテキストは SHIFT_JIS で、32ビットの PHP で実行します。
<?php
$user = "ユーザー";
$to = "宛先";
$pass = "パスワード";

$Basp21 = new COM( "Basp21" );

$SMTPServer = "$user.sakura.ne.jp:587";
$MailTo = "あなた <$to>";
$MailFrom = "わたし <$user@$user.sakura.ne.jp>";
$MailFrom .= "\t$user@$user.sakura.ne.jp:$pass";

$ErrMessage = $Basp21->SendMail(
	$SMTPServer,
	$MailTo,
	$MailFrom,
	"こんにちは",
	"日本語表示\n日本語表示",
	""
);

if ( $ErrMessage != "" ) {
	print $ErrMessage;
}
else {
	print "メール送信が終了しました。";
}

?>




posted by lightbox at 2018-04-21 21:42 | プログラミング・仕様等 | このブログの読者になる | 更新情報をチェックする

あらためて、XAMPP に入ってる sendmail.exe をバッチファイルから動かして日本語のメールを送信する

XAMPP とは言っても、Pleiades Eclipse 4.7 に同梱されているものを使用しています。

▼ sendmail.exe は、fake sendmail for windows と呼ばれるアプリケーションの事です。
fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信 : Gmail なので ssl(465)

上のリンク先では、作者さんの単純なバッチファイルを実行していましたが、もうちょっときちんと日本語を送れるようにしようと思って整理してみました。

使用する SMTPサーバー

まずは、テストとして Gmail を使用します。sendmail.exe と同じフォルダに sendmail.ini があるので必要な情報を書き込みます。
smtp_server=smtp.gmail.com
smtp_port=465
auth_username=ユーザ@gmail.com
auth_password=パスワード
そして、安全性の低いアプリの許可を『有効』にします Gmail を使用する場合は、この設定を ON にしておく必要があります。とりあえず動作したら、他のメールサーバで再度テストして必要ならばその環境で運用を行います。 fake_sendmail.bat
@ECHO OFF

ECHO From: ユーザ@gmail.com > %TEMP%\temp.mail
ECHO To: 送り先メールアドレス >> %TEMP%\temp.mail
ECHO Subject: =?ISO-2022-JP?B?GyRCJWEhPCVrJE43b0w+JHJGfEtcOGwkR0F3JGwkayRoJCYkS0pRNDkkNyReJDkbKEI=?= >> %TEMP%\temp.mail

REM 以下は改行
ECHO.>> %TEMP%\temp.mail

REM JIS のテキストを追加コピー
COPY %TEMP%\temp.mail /B + jis.txt /B %TEMP%\temp.mail /B > nul

sendmail -t < %TEMP%\temp.mail

REM DEL %TEMP%\temp.mail


※ From: は無くても Gmail を使用しておれば、自動的に補完されるようです。
※ エクスプローラのアドレスバーで %TEMP% と入力すれば出力ファイルを参照できます。
※ Subject の内容は、『テキスト変換サービス』の『メール用』で変換したものです。
※ ECHO. は、コマンドプロンプトでの改行になります。
※ > nul でコピーコマンドのメッセージを抑制しています。
※ copy で追加している jis.txt は、Terapad を使用して JIS で保存したテキストです。


運用で使うのであれば

なんらかの方法で、jis.txt を変更して定期でメールを送る事が可能です。ただし、PC は常に電源が入っていて、タスクスケジューラにこのバッチファイルが登録されている必要があります。

その場合、タスクスケジューラの開始オプションで作業フォルダを指定するか jis.txt をフルパスで指定するかどちらかを選択する必要があります。




posted by lightbox at 2018-04-21 18:49 | Pleiades | このブログの読者になる | 更新情報をチェックする

職場で Windows10 を運用を始めるにあたって、いろいろ最近必要だった事のまとめ

URI スキーム

ファイル名を指定して実行から Windows10 特有の設定画面への移動方法ですが、Windows10 のアップデートに伴ってバージョンを確認する為に必要でした。とにかく、どこかの画面に移動するのに時間がかかるので。
▼ バージョン
ms-settings:about

▼ Windows Update
ms-settings:windowsupdate
URI スキーム一覧( Windows 設定アプリの起動 ) ファイル名を指定して実行 一般的には .exe の実行ですが、shell コマンドというようなものもあります。
▼ スタートアップフォルダを開く
shell:startup

▼ コントロールパネル
control

▼ コマンドプロンプト、メモ帳、ペイント、電卓
cmd
notepad
mspaint
calc
エクスプローラのアドレスバー sendto で、送るフォルダを開く( ここにエディタのショートカットを置く ) %TEMP% でテンポラリフォルダを開く コントロールバネル デスクトップのアイコンで、コントロールパネル用のアイコンを表示するようにしておく。 コントロールパネルの右上の『検索』で、『グループ』と入力すると『グループポリシーエディタのリンクが現れるショートカットキー エクスプロラーやサービス一覧等で、CTRL 押しながら + キーで、内容でぴったり列の幅が整列される ( ※リスト形式の各所で有効 ) Windowsキー + E でエクスプローラ Windowsキー + R でファイル名を指定して実行 エクスプローラの基本設定 毎回最初にする内容です。設定画面は、表示タブのツールバーの右端から スタートメニュー(右クリック) PowerShell をコマンドプロンプトに変更。どうせ、エクスプローラから SHIFTキー押しながらフォルダを右クリックすると PowerShell がそこで実行されるので、これはコマンドプロンプトでいいと思います。 管理者権限で実行 既に実行しているアプリがタスクバーで表示されている状態で、CTRL+SHIFT を押しながらタスクバーのアプリをクリックします( これが一番簡単 ) ※SHIFT キーのみだと、同じアプリが起動 コマンドプロンプト(純正) Windows のコマンドプロンプトから普通に実行できるコマンドです。
▼ 他の PC の共用の確認
net view \\PC名

※ 一般的には、コントロールパネルの『資格情報マネージャー』と併用します

▼ 80番ポートを使用しているアプリケーションの確認
netstat -nao | findstr :80

※ 一番最後に PID があるので、それでタスクマネージャの『詳細タブ』から確認
※ PID のタイトルをクリックしてソートします
コマンドプロンプト(アプリ依存) なんらかのソフトウェアがインストールされているという前提の処理です。
▼ Visual Studio のコマンドプロンプトから exe 等の 32ビットか 64ビットかの判断
dumpbin /HEADERS "ファイルのフルパス" | findstr machine

※ ファイルのフルパスは、SHIFT キーを押しながらファイルを右クリックして『パスのコピー』

▼ 自分の PC の SQLExpress の sa のパスワードを空にする
sqlcmd -E -S .\SQLEXPRESS
で、接続してから以下を入力( GO で実行 )して、終わったら quit で終了
ALTER LOGIN sa WITH PASSWORD = ''
GO

※ 昔はそもそも空だったんですよ(そのままシステムが続いている)

▼ Oracle11g の Scott を使用可能にします
alter user scott account unlock; 
alter user scott identified by "tiger";

※ 二つ目は、期限切れの対応です。
関連する記事 Oracle 11g 学習環境の作成 : SQLPlus の環境作成 Google Chrome 今時は、シークレットモードにしないと終了時に Google からログアウトされないので、引数使って最初からシークレットモードで。普通のは、『新しいウインドウ』で開いたらいいです。(CTRL + N)
C:\...\chrome.exe --incognito
トラブル MySQLの ODBCが インストールできない 対応 : VC++ 2013のランタイムをダウンロードしてインストール キーボードに触るとWindows10 が起動する。シャットダウンしたのに勝手に電源が入った上に立ち上がらない。 その他 デスクトップのコンピュータアイコンにメニューを追加する テストにはまだまだ使える(重宝する) AN HTTP Server の正しい使用方法 SQLExpress の接続設定のヒント
posted by lightbox at 2018-04-21 11:29 | 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 ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり