SQLの窓

2018年03月28日


Oracle に学習用DB の 販売管理C.mdb をインポートする

かなり昔に作成したものを引っ張り出して来ています。Oracle 環境も 32 ビット環境なので、64ビットマシンで 32 ビット環境を動かす為、ODBC ドライバや cscript.exe も32ビットを使用する必要があります。

1) 32ビット用 ODBC アドミニストレーター : C:\Windows\SysWOW64\odbcad32.exe
2) 32ビット用 ドライバ一覧 : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI
3) 32ビット用 cscript.exe(VBScript用) : C:\Windows\SysWOW64\cscript.exe
(64ビット環境では特に気にせず見えているもので実行できると思います)

これらの環境を使ってインポートするセットが以下からダウンロードできます。


同梱の hanbaic.bat を実行する前にスクリプトの環境部分を書き換えます。

インストール結果



関連する記事

Oracle 11g 学習環境の作成 : SQLPlus の環境作成

Oracle SQLPlus でスキーマの作成


hanbaiC_oracle11g_nvarchar.vbs

1) ODBC ドライバ : Oracle in OraDb11g_home1
    32ビット用 ドライバ一覧より自分の環境に該当するものを使用します。
2) 接続文字列 : lightbox-pc:1521/ORCL 
    PC名:ポート/サービス名 です。PCとポート 
    は、"C:\app\%USERNAME%\product\11.1.0\db_1\NETWORK\ADMIN\listener.ora" を参照します。
    ( Oracle がインストールされているフォルダの product\バージョン\db_n\NETWORK\ADMIN\listener.ora )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = lightbox-PC)(PORT = 1521))
    )
  )

3) strSc = "lightbox" の lightbox は作成済みのスキーマ(ユーザ)名です
' ************************************************
' 管理者権限でコマンドプロンプトで実行を強制して、
' 最後に pause する
' ************************************************
Set Shell = CreateObject("Shell.Application")
Set WshShell = Wscript.CreateObject("WScript.Shell")
if Wscript.Arguments.Count = 0 then
	ScriptFullName = WScript.ScriptFullName
	Shell.ShellExecute "cmd.exe", "/c cscript.exe """ & ScriptFullName & """ dummy_param & pause", "", "runas", 1
	WScript.Quit
end if

' ************************************************
' 基本設定
' Microsoft ODBC for Oracle で実行できます
' DSN を作成して動作確認して指定して下さい
' ( 参考:http://lightbox.matrix.jp/ginpro/patio.cgi?mode=view&no=225&type=ref )
' ************************************************
' このスクリプトが存在するディレクトリを取得
strCurDir = WScript.ScriptFullName
strCurDir = Replace( strCurDir, WScript.ScriptName, "" )
strMdbPath = strCurDir & "販売管理C.mdb"

' Oracle のホスト文字列
' ( ローカル・ネット・サービス名 )
strTarget = "{Oracle in OraDb11g_home1}"	' ODBC ドライバ
strDBQ = "lightbox-pc:1521/ORCL"	' ネット・サービス名として XE のみでも OK
' スキーマ(ユーザ)
strSc = "lightbox"
' パスワード
strPwd = InputBox("パスワードを入力して下さい")

strDummy = "DUMMY" & Replace(Date,"/","") & Replace(Time,":","")

strMessage = "対象 MDB は " & strMdbPath & "です" & vbCrLf & vbCrLf

strMessage = strMessage & "▼ Oracleの環境です" & vbCrLf
strMessage = strMessage & "ODBC ドライバ : " & strTarget & vbCrLf
strMessage = strMessage & "インスタンス : " & strDBQ & vbCrLf
strMessage = strMessage & "USER(スキーマ) : " & strSc & vbCrLf
strMessage = strMessage & "PASS : " & strPwd & vbCrLf & vbCrLf
strMessage = strMessage & "一時テーブル : " & strDummy & vbCrLf & vbCrLf

strMessage = strMessage & "既にテーブルが存在する場合はメッセージが出ません" & vbCrLf
strMessage = strMessage & "それ以外ではエラーメッセージが出ますが、問題ありません"
if vbCancel = MsgBox( strMessage, vbOkCancel ) then
	Wscript.Quit
end if

' ************************************************
' 処理用文字列設定
' ************************************************
' MDB の接続文字列
strConnectMdb = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strMdbPath & ";"

' Microsoft の Oracle 用 ODBC ドライバの接続文字列 (1)
strConnectOracle = _
"[ODBC;Driver=" & strTarget & ";DBQ=" & strDBQ &";UID=" & strSc & ";PWD=" & strPwd & "]"

' Microsoft の Oracle 用 ODBC ドライバの接続文字列 (2)
strConnectOracle2 = _
"Provider=MSDASQL;Driver=" & strTarget & ";DBQ=" & strDBQ &";UID=" & strSc & ";PWD=" & strPwd

' ************************************************
' 初期処理
' ************************************************
Set Cn = CreateObject("ADODB.Connection")
Set Cn2 = CreateObject("ADODB.Connection")
Cn.Open strConnectMdb
Cn2.Open strConnectOracle2

' ************************************************
' コード名称マスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	区分 NUMBER(4,0)" & _
"	,コード NVARCHAR2(10)" & _
"	,名称 NVARCHAR2(50)" & _
"	,数値1 NUMBER(8,0)" & _
"	,数値2 NUMBER" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,primary key(区分,コード)" & _
")"
Call OracleTransfer( "コード名称マスタ", "[コード名称マスタ]", Query )

' ************************************************
' コントロールマスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	キー NVARCHAR2(1)" & _
"	,売上日付 DATE" & _
"	,売上伝票 NUMBER(8,0)" & _
"	,会社名 NVARCHAR2(50)" & _
"	,組織コード NVARCHAR2(4)" & _
"	,起算月 NUMBER(2,0)" & _
"	,primary key(キー)" & _
")"
Call OracleTransfer( "コントロールマスタ","[コントロールマスタ]", Query )

' ************************************************
' メッセージマスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	コード NVARCHAR2(4)" & _
"	,メッセージ NVARCHAR2(100)" & _
"	,primary key(コード)" & _
")"
Call OracleTransfer( "メッセージマスタ","[メッセージマスタ]", Query )

' ************************************************
' 取引データ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	取引区分 NVARCHAR2(2)" & _
"	,伝票番号 NUMBER(8,0)" & _
"	,行 NUMBER(2,0)" & _
"	,取引日付 DATE" & _
"	,取引先コード NVARCHAR2(4)" & _
"	,商品コード NVARCHAR2(4)" & _
"	,数量 NUMBER" & _
"	,単価 NUMBER" & _
"	,金額 NUMBER" & _
"	,更新済 NVARCHAR2(1)" & _
"	,primary key(取引区分,伝票番号,行)" & _
")"
Call OracleTransfer( "取引データ","[取引データ]", Query )

' ************************************************
' 商品マスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	商品コード NVARCHAR2(4)" & _
"	,商品名 NVARCHAR2(50)" & _
"	,在庫評価単価 NUMBER" & _
"	,販売単価 NUMBER" & _
"	,商品分類 NVARCHAR2(3)" & _
"	,商品区分 NVARCHAR2(1)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,備考 NVARCHAR2(2000)" & _
"	,削除フラグ NVARCHAR2(1)" & _
"	,primary key(商品コード)" & _
")"
Call OracleTransfer( "商品マスタ","[商品マスタ]", Query )

' ************************************************
' 商品分類マスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	商品分類 NVARCHAR2(3)" & _
"	,名称 NVARCHAR2(50)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,primary key(商品分類)" & _
")"
Call OracleTransfer( "商品分類マスタ","[商品分類マスタ]", Query )

' ************************************************
' 得意先マスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	得意先コード NVARCHAR2(4)" & _
"	,得意先名 NVARCHAR2(50)" & _
"	,得意先区分 NVARCHAR2(1)" & _
"	,担当者 NVARCHAR2(4)" & _
"	,郵便番号 NVARCHAR2(7)" & _
"	,住所1 NVARCHAR2(100)" & _
"	,住所2 NVARCHAR2(100)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,締日 NUMBER(2,0)" & _
"	,締日区分 NUMBER(1,0)" & _
"	,支払日 NUMBER(2,0)" & _
"	,備考 NVARCHAR2(100)" & _
"	,primary key(得意先コード)" & _
")"
Call OracleTransfer( "得意先マスタ","[得意先マスタ]", Query )

' ************************************************
' 社員マスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	社員コード NVARCHAR2(4)" & _
"	,氏名 NVARCHAR2(50)" & _
"	,フリガナ NVARCHAR2(50)" & _
"	,所属 NVARCHAR2(4)" & _
"	,性別 NUMBER(1,0)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,給与 NUMBER" & _
"	,手当 NUMBER" & _
"	,管理者 NVARCHAR2(4)" & _
"	,生年月日 DATE" & _
"	,primary key(社員コード)" & _
")"
Call OracleTransfer( "社員マスタ","[社員マスタ]", Query )

' ************************************************
' 郵便番号マスタ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	郵便番号 NVARCHAR2(7)" & _
"	,都道府県名カナ NVARCHAR2(255)" & _
"	,市区町村名カナ NVARCHAR2(255)" & _
"	,町域名カナ NVARCHAR2(255)" & _
"	,都道府県名 NVARCHAR2(255)" & _
"	,市区町村名 NVARCHAR2(255)" & _
"	,町域名 NVARCHAR2(255)" & _
")"
Call OracleTransfer( "郵便番号マスタ","[郵便番号マスタ]", Query )

' ************************************************
' 入金予定データ
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	得意先コード NVARCHAR2(4)" & _
"	,支払日 DATE" & _
"	,伝票合計金額 NUMBER(10,0)" & _
"	,伝票番号 NUMBER(10,0)" & _
")"
Call OracleTransfer( "入金予定データ","[入金予定データ]", Query )

' ************************************************
' 商品集計
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	商品コード NVARCHAR2(4)" & _
"	,経過月 NUMBER(2,0)" & _
"	,当月売上数量 NUMBER(10,0)" & _
"	,当月売上金額 NUMBER(10,0)" & _
"	,更新日 DATE" & _
"	,組織コード NVARCHAR2(4)" & _
"	,primary key(商品コード,経過月)" & _
")"
Call OracleTransfer( "商品集計","[商品集計]", Query )

' ************************************************
' 得意先集計
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	請求先 NVARCHAR2(4)" & _
"	,経過月 NUMBER(2,0)" & _
"	,当月売上金額 NUMBER(10,0)" & _
"	,更新日 DATE" & _
"	,組織コード NVARCHAR2(4)" & _
"	,primary key(請求先,経過月)" & _
")"
Call OracleTransfer( "得意先集計","[得意先集計]", Query )

' ************************************************
' 社員変更履歴
' ************************************************
Query = _
"create table " & strDummy & " (" & _
"	社員コード NVARCHAR2(4)" & _
"	,氏名 NVARCHAR2(50)" & _
"	,フリガナ NVARCHAR2(50)" & _
"	,所属 NVARCHAR2(4)" & _
"	,性別 NUMBER(1,0)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,給与 NUMBER" & _
"	,手当 NUMBER" & _
"	,管理者 NVARCHAR2(4)" & _
"	,生年月日 DATE" & _
")"
Call OracleTransfer( "社員変更履歴","[社員変更履歴]", Query )

' ************************************************
' ビュー
' ************************************************
Query = _
"create or replace view V_商品一覧 as" & _
"	SELECT 商品マスタ.商品コード" & _
"	, 商品マスタ.商品名" & _
"	, 商品マスタ.販売単価" & _
"	, 商品分類マスタ.商品分類" & _
"	, 商品分類マスタ.名称 AS 分類名" & _
"	, 商品マスタ.商品区分" & _
"	, コード名称マスタ.名称 AS 区分名" & _
" from" & _
"	(商品マスタ LEFT JOIN 商品分類マスタ" & _
"	ON 商品マスタ.商品分類 = 商品分類マスタ.商品分類" & _
"	) LEFT JOIN コード名称マスタ" & _
"	ON 商品マスタ.商品区分 = コード名称マスタ.コード" & _
" where" & _
"	コード名称マスタ.区分 = 3 and 削除フラグ is NULL"
RunOracle( Query )

Query = _
"create or replace view V_売上日付 as" & _
"	SELECT コントロールマスタ.売上日付" & _
"	FROM コントロールマスタ" & _
"	WHERE コントロールマスタ.キー = '1'"
RunOracle( Query )

Query = _
"create or replace view V_得意先台帳 as" & _
"	SELECT 取引データ.取引先コード" & _
"	, 得意先マスタ.得意先名" & _
"	, 取引データ.取引日付" & _
"	, 取引データ.取引区分" & _
"	, 取引データ.伝票番号" & _
"	, 取引データ.行" & _
"	, 取引データ.商品コード" & _
"	, 商品マスタ.商品名" & _
"	, 取引データ.数量" & _
"	, 取引データ.単価" & _
"	, 取引データ.金額" & _
" from" & _
"	(取引データ INNER JOIN 商品マスタ" & _
"	ON 取引データ.商品コード=商品マスタ.商品コード" & _
"	) INNER JOIN 得意先マスタ" & _
"	ON 取引データ.取引先コード=得意先マスタ.得意先コード" & _
" where" & _
"	取引データ.取引区分 = '10'"
RunOracle( Query )

Query = _
"create or replace view V_社員一覧 as" & _
" select 社員コード" & _
"	,氏名" & _
"	,フリガナ" & _
"	,名称1.名称 as 性別" & _
"	,所属" & _
"	,名称2.名称 as 所属名" & _
" from 社員マスタ" & _
"	,コード名称マスタ 名称1" & _
"	,コード名称マスタ 名称2" & _
" where to_char(性別) = 名称1.コード" & _
"   and 名称1.区分 = 1" & _
"   and 所属 = 名称2.コード" & _
"   and 名称2.区分 = 2"
RunOracle( Query )

Query = _
"create or replace view" & _
"	PROC_ERROR" & _
" as" & _
" select * " & _
" from USER_ERRORS"
RunOracle( Query )

Query = _
"create or replace view" & _
"	PROC_LIST" & _
" as" & _
" select OBJECT_NAME as ""プロシージャ名"" " & _
"	,STATUS as ""状態""  " & _
"	,OBJECT_TYPE  as ""タイプ"" " & _
"	,CREATED  as ""作成日"" " & _
"	,LAST_DDL_TIME  as ""更新日"" " & _
" from USER_OBJECTS " & _
" where OBJECT_TYPE in ('FUNCTION','PROCEDURE') "
RunOracle( Query )

Query = _
"create or replace view" & _
"	PROC_TEXT" & _
" as" & _
" select * from USER_SOURCE"
RunOracle( Query )

' ************************************************
' 終了
' ************************************************

Cn2.Close
Cn.Close

Wscript.Echo "処理が終了しました"

' ************************************************
' Oracle 転送
' ************************************************
function OracleTransfer( strTarget, strTable, QueryCreate )

	Dim Query

	Query = "drop table " & strTarget
	RunOracle( Query )

	RunOracle( QueryCreate )

	Query = "insert into " & strConnectOracle & "." & strDummy & _
	" select * from " & strTable

	RunMdb( Query )

	Query = "alter table " & strDummy & " rename to " & strTarget
	RunOracle( Query )

end function

' ************************************************
' MDB 実行
' ************************************************
function RunMdb( Query )

	on error resume next
	Cn.Execute Query
	if Err.Number <> 0then
		Wscript.Echo Err.Description & vbCrLf & Query
	end if
	on error goto 0

end function

' ************************************************
' Oracle 実行
' ************************************************
function RunOracle( Query )

	on error resume next
	Cn2.Execute Query
	if Err.Number <> 0then
		Wscript.Echo Err.Description & vbCrLf & Query
	end if
	on error goto 0

end function






posted by lightbox at 2018-03-28 15:44 | Oracle : 環境 | このブログの読者になる | 更新情報をチェックする

Oracle SQLPlus でスキーマの作成

Oracle は他の RDBMS と違ってテーブルを作ってアクセスするようにする為にいろいろなものを作成して設定する必要があります。

ここでは、SQLPlus を使用して SQL と コマンドを使用してテーブルを作成する事ができる状態までの環境を作成します。

一応、SQLPlus の環境としては、以下の記事で作成したものを使用しますが、普通に SQLPlus に SYSTEM ユーザでログインすれば可能なはずです( as SYSDBA は使用したほうがいいと思いますが )

Oracle 11g 学習環境の作成 : SQLPlus の環境作成
( この記事内で、データファイルを置くパスを確認しています )

環境作成用の sql を3つ作成する

SQLPlus のワークディレクトリに置きます。専用のフォルダに置いて作業するといいと思います。
create tablespace STUDY
datafile 'C:\APP\LIGHTBOX\ORADATA\ORCL\STUDY.DBF'
	size 5M
	autoextend on
	next 1M
	maxsize unlimited
segment space management AUTO;


create user LIGHTBOX
	identified by study
	default tablespace STUDY
	temporary tablespace TEMP
	quota unlimited on STUDY
	account unlock;

create role STUDY_ROLE;

grant 
	 ALTER PROFILE 
	,ALTER SESSION 
	,ALTER SYSTEM 
	,ALTER TABLESPACE 
	,ALTER USER 
	,CREATE PROCEDURE 
	,CREATE PROFILE 
	,CREATE PUBLIC SYNONYM 
	,CREATE ROLE 
	,CREATE ROLLBACK SEGMENT 
	,CREATE SEQUENCE 
	,CREATE SESSION 
	,CREATE SYNONYM 
	,CREATE TABLE 
	,CREATE TABLESPACE 
	,CREATE TRIGGER 
	,CREATE VIEW 
	,EXECUTE ANY PROCEDURE 
	,SELECT ANY DICTIONARY 
	,SELECT ANY SEQUENCE 
	,SELECT ANY TABLE
to STUDY_ROLE;

grant STUDY_ROLE to LIGHTBOX;

この3つの SQL を順番に実行します。SQLPlus 内では、それぞれ以下のように入力すると実行されます。
@tablespace
@createuser
@createrole
全て実行した後は、ユーザが lightbox パスワードが study でログインできるはずです。 (ユーザパスワードの変更は alter user で実行します) recyclebin を使用しないようにする デフォルトでは使用する事になっているので、テーブル一覧に不明な recyclebin 用のテーブルが表示されたりします。もともと、削除したテーブルの復帰用なので学習には不向きで邪魔なだけなので使用しないようにします。 ▼ SQLPlus で以下を実行してください
alter system set recyclebin = off deferred;
DEFERREDキーワード は次のセッションで有効にするという意味です。SQLPlus ではいったん quit して再度接続すると有効になっていると思います。確認は以下の SQLPlus コマンド を実行して下さい。
show parameter recyclebin
SQL で見る場合は 『select * from V$PARAMETER where name = 'recyclebin';』ですが、SQLPlus では見づらいのでコマンドを使用して下さい。
posted by lightbox at 2018-03-28 14:36 | Oracle : 環境 | このブログの読者になる | 更新情報をチェックする

Oracle 11g 学習環境の作成 : SQLPlus の環境作成

手元の環境は、Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production です。32ビットなので、64ビットのPC では少しいろいろありますが、スキーマ作成に関して基本は SQL を用意してコマンドを入力して実行するという手順になります。

Oracle をインストールしたユーザであれば問題無いはすですが、ユーザが ora_dba グループに入っている事を確認します。



1) sqlplus 用のフォルダを用意して、そこで sqlplus を実行

c:\tools\oracle というフォルダを作成しました。そこに、コマンドプロンプトのショートカットを作成します。
※ Windows システムツールの中にあるので、コピーして使用しますが、無ければ直接 cmd.exe でショートカットを作成します。
※ アイコンを右クリックして『その他』=>『ファイルの場所を開く』でそこからコピーします

2) ショートカットの情報を変更

a) リンク先は、このように入力すると Oracle インストール済みならばフルパスを補完してくれます。
b) 作業フォルダーはクリアすればカレントフォルダで起動します。



c) 詳細設定では念のため管理者権限にチェックしておきます。



タイトルは何でもいいので、全般タブで変更します。



3) sqlplus の初期設定用 login.sql をフォルダに置く
SET VERIFY OFF
SET SERVEROUTPUT ON
SET LINESIZE 200
SET PAGESIZE 1000
--SET AUTOCOMMIT IMM

行頭の -- は行コメントです。
※ SET SERVEROUTPUT ON を指定しないと、DBMS_OUTPUT の結果が表示されません
※ SET AUTOCOMMIT IMM を指定すると、SQL の UPDATE 時に 自動的にコミットされます

4) sqlplus を実行してコマンドウインドウの設定を行う

コマンドウインドウ上でドラッグでコピー、右クリックでペーストできるように簡易編集モードを ON にします。



作業しやすいように好みの幅にコマンドウインドウサイズを変更します。



5) login.sql の内容が反映されているかを確認する

SQL プロンプトで show all と入力して、SERVEROUTPUT が ON である事を確認する





6) Oracle のデータの場所を確認しておく

以下を入力して *.DBF ファイルの場所を確認します。

select * from DBA_DATA_FILES;

スキーマを作成する際に、データファイルと表領域を事前に作成するので確認します。



関連する記事

Oracle SQLPlus でスキーマの作成




posted by lightbox at 2018-03-28 11:39 | Oracle : 環境 | このブログの読者になる | 更新情報をチェックする
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 終わり