SQLの窓

2018年07月11日


MySQL Connector/Python の使用方法概要のまとめ

接続
import mysql.connector

# **************************************
# 接続 / 更新兼用
# **************************************
cnn = mysql.connector.connect(
	host='localhost',
	port=3306,
	db='lightbox',
	user='root',
	passwd='',
	charset="utf8",
	autocommit='True')

# データベース処理

# **************************************
# 接続解除
# **************************************
cnn.close()


MySQLCursor.fetchone() Method
このメソッドはクエリ結果セットの次の行を取得し、単一のシーケンスを返し、使用可能な行がない場合はNoneを返します。 

デフォルトでは返されたタプルはMySQLサーバから返されたデータで構成され、Pythonオブジェクトに変換されます。(カーソルが生のカーソルの場合そのような変換は行われません : 「cursor.MySQLCursorRawクラス」 )

fetchone メソッドは fetchall および fetchmany によって使用されます。 また、カーソルがイテレータとして使用さる場合にも使用されます。

次の例はカーソルをイテレータとして使用し、内部では fetchone  が使用されます。
cursor.execute("SELECT * FROM employees")
for row in cursor:
	print(row)
関数で処理
# ***************************
# 参照
# ***************************
def get_data( cnn ):

	log("get_data")

	cursor = cnn.cursor(dictionary=True)

	sql = f"""select
			社員コード,
			氏名,
			フリガナ,
			所属,
			性別,
			作成日,
			更新日,
			給与,
			手当,
			管理者,
			DATE_FORMAT(生年月日,'%Y/%m/%d') as 生年月日
		from 社員マスタ
		where 社員コード = '{forms("社員コード")}'"""

	log(sql)

	cursor.execute(sql)

	row = cursor.fetchone()

	if row is None:
		set("check_message", "データが存在しません")
		return False

	pplog(row)

	forms("氏名", row["氏名"])
	forms("フリガナ", row["フリガナ"])
	forms("給与", row["給与"])
	forms("生年月日", row["生年月日"])

	cursor.close()

	return True

pplog の結果
{'フリガナ': 'ウラオカ トモヤ',
 '作成日': datetime.datetime(2005, 9, 12, 0, 0),
 '性別': 0,
 '所属': '0003',
 '手当': 9000,
 '更新日': datetime.datetime(2005, 11, 28, 0, 0),
 '氏名': '浦岡 友也',
 '生年月日': '2001/01/10',
 '社員コード': '0001',
 '管理者': None,
 '給与': 80000}
MySQLCursor.execute() Method
このメソッドは指定されたデータベース操作(クエリまたはコマンド)を実行します。

タプルまたはディクショナリ(PHP:連想配列/Ruby:ハッシュ)の値は、SQL文字列内の変数にバインドされます。 

変数を%sまたは%(name)s として埋め込んで使用します。 
▼ 例
select_stmt = "SELECT * FROM employees WHERE emp_no = %(emp_no)s"
cursor.execute(select_stmt, { 'emp_no': 2 })

▼ 非推奨
execute は、multiがTrueの場合はイテレータを返します。
Pythonでは、単一の値を含むタプルにカンマを含める必要があります。
たとえば ('abc') はスカラとして評価され、('abc',)はタプルとして評価されます。
print( type(('abc')) )
print( type(('abc',)) )

▼ 処理結果
<class 'str'>
<class 'tuple'>
関数で処理
# ***************************
# 更新
# ***************************
def update_data( cnn ):
	log("update_data")

	cursor = cnn.cursor()

	# 文字列複数行連結
	sql = f"""update 社員マスタ set 
		氏名 = %s,
		フリガナ=%s,
		給与 = %s,
		生年月日 = %s
	where 社員コード = '{forms("社員コード")}'"""

	log( sql )

	try:
		data = (forms("氏名"), forms("フリガナ"), int(forms("給与")) , forms("生年月日") )
	
		log( data )
	
		cursor.execute(sql, data)
	except:
		error_info = str(sys.exc_info()[1])
		set("check_message", "更新に失敗しました : " + error_info)
		log(str(sys.exc_info()[0]))
		log(error_info)
		return False

	cursor.close()

	return True


sys.exc_info()
現在処理中の例外を示す 3 個のタプルを返します。

例外が発生している場合、(type, value, traceback) を返します。type は処理中の例外のクラス(BaseException のサブクラス)を示します。value は例外インスタンス (例外の型のインスタンス) を返します(エラーメッセージはここに格納されています)
▼ エラーメッセージ例(MySQL)
1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'aaa' at line 1
ログ関数
import pprint

# **************************************
# ログ出力
# **************************************
def log( message ):
	with open('debug.log', 'a') as f:
		print(message,end='\n',file=f)
	
# **************************************
# ログ出力( pprint )
# **************************************
def pplog( obj ):

	with open("debug.log", "a") as f:
		pprint.pprint(obj, stream=f)






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

2018年05月03日


Python3 : 言語的デザインの特徴と要点


グループ化にインデントを使う

参照 Python ドキュメント
ドキュメントでは、多くのコーディングスタイルは begin/end の括弧にそれぞれ一行を使っている事に対して以下のように述べています。

1) 冗長(無駄が多い)になって画面を浪費する。
2) プログラムの見通しが悪くなる。

一つの関数は一画面に収めるのが理想で、20 行の Python は 20 行の C よりもはるかに多くの作業ができると断言しています。
▼ 確かに行数は 4 : 2 です。
if (x <= y)
{
        x++;
}

if x <= y:
        x += 1
実際問題、結局インデントするんだからそれでブロックを決定してしまうのはとても合理的に感じます。問題がある場合は唯一、勉強し始めの初期のプログラマがインデントをうまくできないという事ぐらいでしょう。 式中で代入ができない 参照 Python ドキュメント
要するにプログラマがとても良くやる、条件の中で == と書くところを、= と書いてしまってバグが発生させるのを避けるという趣旨でした。
▼ 今じゃ、こっちのほうが主流になってますが...
while (line = readline(f)) {
	処理
}
自分は昔々 while(1) {} って書いてました。必ず if で脱出条件書くので、後からソースコードが解りやすいです。で、Python ではそれを勧めているようです。
while True:
	line = f.readline()
	if not line:
		break
	処理
さらに、嫌み(あるいはジョーク)たっぷりに以下のようにも言っています。
熟練した Python プログラマは while True イディオムを受け入れていて、式構造中の代入がなくてもそれほど苦労しないようです。Python にそれを強く求めるのは新人だけです。
結局一番良いのは、イテレータを使用して for 文を使えとの事でした。(確かに... イマドキもう for 系で統一すべきだとは前から思ってました)
for line in f:
	処理
switch や case 文がない 参照 Python ドキュメント 正直自分は switch や case 文が嫌いです。自分では無く、自分以外の人がそれでミスして迷惑をこうむるからです。Python 的には、一画面に収めるのが理想 とか言ってるし、無いのは納得できます。 でも、先を見据えて議論はされているようです。 ラムダ式は文を含むことができない 参照 Python ドキュメント おそらく、ブロックをインデントで表現するという記法上、一般的なブロックを引数として渡すのは無理という事だと思います。しかし、Python はこの事についてとても強気に以下のように述べています。
Python のラムダは単なる、関数を定義するのが面倒すぎる場合のための簡略な記法に過ぎないのです。従って、ローカルで定義された関数ではなくラムダを使う利点は、関数の名前を考える必要が無いことだけです
だそうです。 タプルとリストという別のデータ型が用意されている 参照 Python ドキュメント 一般的な解釈では、タプルは変更不可(イミュータブル)で、リストは変更可(ミュータブル)です。ですが、追加の理解として以下のような記述がありました。
タプルは、Pascal のレコードや C の構造体と同様なものと考えられます。
型が異なっても良い関連するデータの小さな集合です。
グループとして演算されます。(一つの型として扱う?)

リストは他の言語の配列に近いものです。
全て同じ型の可変数のオブジェクトを持ちます。
それらが一つ一つ演算される傾向にあります。

イミュータブルな要素だけが辞書のキーとして使えるのでタプルだけがキーとして使えます
list.sort() はソートされたリストを返さない 参照 Python ドキュメント これは一連のデザインの流れにある『合理性』に基づいています。
ソートするためだけにリストのコピーを作るのは無駄が多いそうです。そしてこの仕様上では、うっかり上書きしてしまうようなことがなくなると言っています。

新しいリストを返したいなら、代わりに組み込みの sorted() 関数を使って下さいとの事です。
for key in sorted(mydict):
	mydict[key] で処理
raw 文字列 (r-strings) はバックスラッシュで終わってはいけない 参照 Python ドキュメント 長々と書いてありましたが、要するに最後の \" が一つの文字として認識されるので、文字列が終わって無い事になるそうです。よって、最後にバックスラッシュを追加する為に以下のような事になります。
dir = r"\this\is\my\dos\dir" "\\"
リストやタプルの最後にカンマがあっても良い 参照 Python ドキュメント これ凄いですね。ありがとうと言う他無いですが、これも無駄を回避するデザインであると断言できます。プログラマが皆疑問に思わず受け入れていた『無駄』です。
タグ:Python
posted by lightbox at 2018-05-03 23:35 | Python | このブログの読者になる | 更新情報をチェックする

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


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

Eclipse で実行させるのと、WWWサーバー( ここでは AN HTTP Server )で実行させるのとでは、やはりもっといろいろな切り口の理解が必要になります。

とにかく、CGI としてベタな QUERY_STRING を使用してベタな format で作成後、f-stringヒアドキュメントで HTML 部分を簡潔にして、最後に cgi モジュールで GETとPOST を兼用にしました。(FieldStorage() の戻りの内容が変更できないようなので、単純な dict に入れ替えています。)

▼ GET/POST 共用 : 結局 cgi モジュール で作成 : f-string ヒアドキュメント埋め込み
import cgi
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

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

form = cgi.FieldStorage()

fields = {}
fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if value not in form:
		fields[value] = ""
	else:
		fields[value] = form[value].value

out_client = f"""<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form method="post">
		<p>氏名 : <input type="text" name="{fld_names["氏名"]}" value="{fields[fld_names["氏名"]]}"></p>
		<p>フリガナ : <input type="text" name="{fld_names["フリガナ"]}" value="{fields[fld_names["フリガナ"]]}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

print(out_client)

▼ GET のみ f-string を使った、ヒアドキュメント埋め込み
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

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

try:
	qs = os.environ["QUERY_STRING"]
except KeyError as e:
	qs = ""

get =  urllib.parse.parse_qs(qs)

fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if get.get(value) is None:
		get[value] = [""]

out_client = f"""<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form>
		<p>氏名 : <input type="text" name="{fld_names["氏名"]}" value="{get.get(fld_names["氏名"])[0]}"></p>
		<p>フリガナ : <input type="text" name="{fld_names["フリガナ"]}" value="{get.get(fld_names["フリガナ"])[0]}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

print(out_client)

▼ GET のみ : format を使った、クォートの作成が面倒な埋め込み
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

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

try:
	qs = os.environ["QUERY_STRING"]
except KeyError as e:
	qs = ""

get =  urllib.parse.parse_qs(qs)

fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if get.get(value) is None:
		get[value] = [""]

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

out_client = out_client.format(
	field1=get.get(fld_names["氏名"])[0],
	field2=get.get(fld_names["フリガナ"])[0]
)

print(out_client)

AN HTTP Server の設定



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



タグ:CGI Python
posted by lightbox at 2018-04-14 21:19 | Python | このブログの読者になる | 更新情報をチェックする

2018年04月09日


Eclipse + Python(Pydev) : pywin32(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 で Python を使って MySQL にアクセスする

pywin32 + COM

COM 経由で ADO を使って MySQL にアクセスする為に、pywin32 をインストールします。

インストールは、pip install pywin32 でインストールできます。但し、『Fatal error in launcher: Unable to create process using '"'』というエラーが出た場合は、以下のコマンドを実行してから再度実行して下さい。
python -m pip install -U pip
pywin32 の readme にもありますが、さらに『COMオブジェクトの登録やWindowsサービスの実装などの「システムワイド」機能でpywin32を使用する場合は』管理者権限のコマンドプロンプトから以下を実行します
python Scripts/pywin32_postinstall.py -install
▼ 実行結果
Copied pythoncom36.dll to C:\WINDOWS\system32\pythoncom36.dll
Copied pywintypes36.dll to C:\WINDOWS\system32\pywintypes36.dll
Registered: Python.Interpreter
Registered: Python.Dictionary
Registered: Python
-> Software\Python\PythonCore\3.6\Help[None]=None
-> Software\Python\PythonCore\3.6\Help\Pythonwin Reference[None]='C:\\pleiades\\python\\3\\Lib\\site-packages\\PyWin32.chm'
Pythonwin has been registered in context menu
Creating directory C:\pleiades\python\3\Lib\site-packages\win32com\gen_py
Shortcut for Pythonwin created
Shortcut to documentation created
The pywin32 extensions were successfully installed.
Connector/ODBC 5.3.10 ADO から接続する場合、純粋に Windows からのアクセスになるので ODBC ドライバが必要になります。Python が 64ビットならば、ODBC ドライバも 64ビット用が必要になります。 ダウンロードページ com_ado_mysql 以下は、ADO + COM で行われる標準的なレコードセットの読み込みと同時更新の処理です。 特徴的なのは、レコードセットの Fields コレクション( Field オブジェクト )を使用して値を直接セットして一行づつレコードを更新するところです。
import win32com.client

adOpenDynamic = 2
adLockOptimistic = 3

cn = win32com.client.Dispatch("ADODB.Connection")
rs = win32com.client.Dispatch("ADODB.Recordset")

driver = "{MySQL ODBC 5.3 Unicode Driver}"
server = "localhost"
DB = "lightbox"
User = "root"
Pass = ""

ConnectionString = "Provider=MSDASQL;Driver={0};Server={1};DATABASE={2};UID={3};PWD={4};"
ConnectionString = ConnectionString.format(driver,server,DB,User,Pass)
print(ConnectionString)

"""""""""""""""""""""""""""
接続
"""""""""""""""""""""""""""
try:
	cn.Open( ConnectionString )
except Exception as e:
	print( e )
	exit()

rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic

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

while not rs.EOF:

	print(rs.Fields("社員コード").Value,end=",")
	print(rs.Fields("氏名").Value, end=",")
	print(rs.Fields("フリガナ").Value, end=",")
	print(rs.Fields("所属").Value, end=",")
	print(rs.Fields("性別").Value, end=",")
	print(rs.Fields("給与").Value, end=",")
	print(rs.Fields("手当").Value, end=",")		# NULL の場合は None と出力
	print(rs.Fields("管理者").Value, end=",")
	print("{0:%Y/%m/%d}".format(rs.Fields("作成日").Value), end=",")
	print("{0:%Y/%m/%d}".format(rs.Fields("更新日").Value), end=",")
	print("{0:%Y/%m/%d}".format(rs.Fields("生年月日").Value))

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

	rs.MoveNext()

"""""""""""""""""""""""""""
接続解除
"""""""""""""""""""""""""""
if cn.State >= 1:
	cn.Close()

print("終了しました")

CursorTypes, LockTypes, and CursorLocations

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

※ ADO でデフォルトは adUseServer

エディタのタブ設定



エディタの # コメント色

デフォルトが灰色で見にくいので濃い緑を使用しました





posted by lightbox at 2018-04-09 16:52 | Python | このブログの読者になる | 更新情報をチェックする
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 終わり