SQLの窓

2009年10月31日


【絶滅危惧】WINAPI+C : マウスの移動単位って【ミッキー】というんですね

【xp で動作確認しました(vs2008) つまりデータから勝手に絵を描かせられるのです】


マウスの動作のエミュレーションしようと思って、以前使ったSendInput 関数 の
詳細の裏を取りに行ったら、この処理の詳細はこの前の古い関数のところに
説明があるのです。

mouse_event 関数

で、この関数の座標の説明に「ミッキー」が出現します

ちょっと笑ってしまいましたが、処理するのにミッキーの設定をピクセルにしたいので
調べてみるとありました( 検証はまだです )
SDK32:第 2 モニタでの mouse_event と絶対座標移動

相当古い資料なので本当に今動くのかどうか解りませんが、これからチェックします
int  oldAccel[3], newAccel[3], oldSpeed, newSpeed, x, y;
BOOL bResult;

// 以下の値でマウスの移動量を 1 ミッキー/ピクセルに設定する
newAccel[0] = 0;
newAccel[1] = 0;
newAccel[2] = 0;
newSpeed = 1;

// 現在のマウス加速度定数を保存する
bResult = SystemParametersInfo(SPI_GETMOUSE, 0, oldAccel, 0);
bResult = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &oldSpeed, 0);

// マウス加速度定数(無効)を設定する
bResult = SystemParametersInfo(SPI_SETMOUSE, 0, newAccel,
					 SPIF_SENDCHANGE);
bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, &newSpeed,
					 SPIF_SENDCHANGE);

//任意の x, y 座標を設定する
x = -100;
y = -150;

mouse_event(MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0);

// 標準モニタの左上(原点)にカーソルを移動する
mouse_event(0, x, y, 0, 0);
// カーソルを要求された座標に移動する

// 保存したマウス加速度定数を戻す
bResult = SystemParametersInfo(SPI_SETMOUSE,0, oldAccel,
					 SPIF_SENDCHANGE);
bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, &oldSpeed,
					 SPIF_SENDCHANGE);

当然、mouse_event は、SendInput に変更する必要ありますが、
いかにも絶滅危惧らしい情報のなりたちです
あ、そうそう。構造体を見たい場合も一苦労です。
INPUT Structure ()


posted by lightbox at 2009-10-31 19:05 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅危惧】C言語 : PostMessageのフック

内部では自前のクラスを使っていますが、フックそのものとはあまり関係無いので。

フックするには、登録する必要がありますし、DLL である必要があります
全体のソースコードはこちらになります
SendMessage と PostMessage のフック

実際にログを取るアプリケーションを作ってちゃんと動いてました。
主に、Windowsアプリケーションのメニューに対するメッセージをハックするのに使っていました。
( SQLの窓に同梱しています )
// *********************************************************
// PostMessge のフック処理
// *********************************************************
LRESULT CALLBACK GetMsgProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhkPost, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		MSG *msg;
		char szClass[512];
		char szTitle[512];

		msg = (MSG *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"POST:WM_COMMAND:"
					"%lu:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
		CloseHandle(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}



タグ:C言語 Hook DLL
posted by lightbox at 2009-10-31 15:19 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅コード】インラインアセンブラ : PC98 のグラフ LIO

LIO は絶滅しています。当時、真っ黒な画面にこいつらでカラーのポップアップウインドウを表示したりしてました。ソースコードのタイムスタンプでさえ 1993 年 です。

直線を引く
/***********************************************************/
/***    LIO版 直線、短形の描画                       ***/
/***********************************************************/
/***        項目名                   引き数名            ***/
/***    描画始点の座標               x1,y1               ***/
/***    描画終点の座標               x2,y2               ***/
/***    パレット番号                 paret               ***/
/***    描画コード(B,BF)       byoga               ***/
/***    ラインスタイルスイッチ       lswitch             ***/
/***    ラインスタイルすいっちLo   lstairu             ***/
/***    ラインスタイルすいっちHi   hstairu             ***/
/***********************************************************/
#include <memory.h>

static unsigned char *param;
static unsigned int  paramoff;
static unsigned int  ucwseg;
extern unsigned int  lioucw;

extern
void
gline( int x1, int y1, int x2, int y2, int paret, int byoga, int lswitch, int lstairu, int hstairu)
{

   unsigned long work;
   unsigned char sts;

   ucwseg = lioucw;
   work = (unsigned long)lioucw * 256L * 256L;
   work = work + 5120;
   param = (char *)work;
   
   memcpy( param  , (char *)&x1 , 2 );
   memcpy( param+2, (char *)&y1 , 2 );
   memcpy( param+4, (char *)&x2 , 2 );
   memcpy( param+6, (char *)&y2 , 2 );
   (*(param+8)) = (unsigned char)paret;
   (*(param+9)) = (unsigned char)byoga;
   (*(param+10)) = (unsigned char)lswitch;
   (*(param+11)) = (unsigned char)lstairu;
   (*(param+12)) = (unsigned char)hstairu;

	_asm {
		push	ds
		push	es
		push	ss
		push	bx
		push	cx
		push	dx
		push	bp
		push	sp
		push	si
		push	di

		mov	ax,WORD PTR ucwseg
		mov	ds,ax
		mov	bx,5120
		int	0a7h

		pop	di
		pop	si
		pop	sp
		pop	bp
		pop	dx
		pop	cx
		pop	bx
		pop	ss
		pop	es
		pop	ds
		mov	BYTE PTR sts,ah
	}

}



posted by lightbox at 2009-10-31 15:06 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅コード】インラインアセンブラ : PC98 の int21

殆ど博物館入りというか、C 言語そのものが絶滅危惧種のような気もします。
PC98 そのものは完全に絶滅してしまっていて、役に立ちませんが、
インラインアセンブラは方法論としては十分活躍するフィールドがあると思います。
元々得意でもなんでもなかったので、簡単な命令しか使って無いので誰かの
役に立つかもしれません
locate
static char err[28]="function locate param error";

extern
void
locate( int x, int y )
{
	char wstring[10];
	int i;

	if ( x<1 || x>80 || y<1 || y>25 ) {
		for ( i = 0; i < 27; i++ ) {
			_asm {
		mov	si,i
		mov	ah,06h
		mov	dl,err[si]
		int	21h
			}
		}

		_asm {
		mov	ah,0ch
		mov	al,08h
		int	21h
		mov	ah,0ch
		mov	al,00h
		int	21h
		}
		return;
	}

	wstring[0] = 0x1b;
	wstring[1] = '[';
	wstring[2] = (char)(y/10+'0');
	wstring[3] = (char)(y%10+'0');
	wstring[4] = ';';
	wstring[5] = (char)(x/10+'0');
	wstring[6] = (char)(x%10+'0');
	wstring[7] = 'H';
	wstring[8] = 0x00;

	for ( i = 0; i < 8; i++ ) {
		_asm {
		mov	si,i
		mov	ah,06h
		mov	dl,wstring[si]
		int	21h
		}
	}

}


posted by lightbox at 2009-10-31 14:59 | 記録 | このブログの読者になる | 更新情報をチェックする

2009年10月29日


VB.net : SQLExpress(SQLServer) : SQL-DMO と同等の SMO によるバックアップ

SQL-DMO は、COM なので主に VBScript から使われていましたが、SMO は、SQL-DMO に取って代わる Framework ベースの API です。もともとが巨大なクラスの集合体なので、バックアップにしか通常使う事がありませんが、SQLServer の運用を行うなら知っておく必要はあります

バックアップは SQL からも出来、そちらのほうが簡単です。SQL-DMO や SMO は、テープによるデータのバックアップを想定しており、デバイスを作成しても実体は作成されません。ディスクファイルでも、追加でバックアップされます

VB.net の参照としては以下の3つを追加します
1) Microsoft.SqlServer.ConnectionInfo
2) Microsoft.SqlServer.Smo
3) Microsoft.SqlServer.SqlEnum

( ファイルの場所の例 : C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies )
' サーバー
Dim srv As Server
' インスタンス
srv = New Server()

' サーバーインスタンスの情報
srv.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect
srv.ConnectionContext.LoginSecure = False
srv.ConnectionContext.Login = "sa"
srv.ConnectionContext.Password = "trustno1"
' 接続
srv.ConnectionContext.Connect()

' バージョンの表示
Console.WriteLine(srv.Information.Version)

' デバイスオブジェクト
Dim backup_dev As BackupDevice = New BackupDevice()

' サーバーと関係付ける
backup_dev.Parent = srv
' 論理名を設定
backup_dev.Name = "BACKUP"
' 装置のタイプ
backup_dev.BackupDeviceType = BackupDeviceType.Disk
' 実際の場所( バックアップするまで作成されません )
backup_dev.PhysicalLocation = "c:\tmp\backup.dmp"
Try
	' 既に存在する場合はそのまま使う
	backup_dev.Create()
Catch ex As Exception
End Try


' バックアップオブジェクト
Dim dbBackup As Backup = New Backup()

' デフォルトは Database
dbBackup.Action = BackupActionType.Database
dbBackup.Database = "lightbox"
dbBackup.Devices.AddDevice("BACKUP", DeviceType.LogicalDevice)
dbBackup.BackupSetName = "BACKUP_lightbox"

' バックアップ開始
dbBackup.SqlBackup(srv)

' 接続解除
srv.ConnectionContext.Disconnect()

Console.WriteLine("バックアップが終了しました")

関連する記事

SQLServer : SQLでバックアップ
SQL-DMO による VBScriptによるバックアップ

関連するMicrosoft のリンク

SMO クラス ライブラリ


posted by lightbox at 2009-10-29 15:40 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2009年10月27日


VBS : SQLServerよりExcel へエクスポート(Excel製品は必要ありません)

Microsoft.Jet.OLEDB.4.0の利用
要は Microsoft 中心に考えると、たいていの DB に動的に接続して、テーブルを参照できるという事です。( ODBC ドライバ依存 )

Oracle は、常に、スキーマで修飾が必要ですが、他の DB ならテーブル名のみで参照できると思います。

結合もできるところが凄いというか、Microsoft 中心というか結構使い道が広い方法です。

ADOX は、他にも機能もありますが、ADO でたいてい事足りるので、MDB を作成したい場合にのみ利用します。

ADO は、MDB も Excel も 製品をインストールしていなくても DB として使うのならば何も問題無くアクセス可能です。つまり、Access や Excel をインストールしていなくても、ADO 経由でデータを見る事ができます
Set Cn = CreateObject( "ADODB.Connection" )
Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )

' **************************************
' 実行中ディレクトリの取得
' **************************************
strPath = Wscript.ScriptFullName 
Set objFile = Fso.GetFile( strPath )
strCur = Fso.GetParentFolderName( objFile )

on error resume next
Fso.DeleteFile(strCur&"\DUMMY.mdb")
on error goto 0

Set ac = CreateObject("ADOX.Catalog")

' **************************************
' 接続用 MDB 作成
' **************************************
on error resume next
ac.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source="&strCur&"\DUMMY.mdb"&";"
if Err.Number <> 0 then
	Wscript.echo Err.Description
	Wscript.quit
end if
on error goto 0

' **************************************
' 作成したMDB の開放
' **************************************
on error resume next
Set ac = Nothing
on error goto 0

' **************************************
' 接続文字列( ADOX と同じ )
' **************************************
ConnectionString = _
	"Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source=" & strCur&"\DUMMY.mdb" & ";"

' **************************************
' 接続
' **************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	WScript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **************************************
' エクスポート用 SQL / {SQL Server} は
' {SQL Native Client}に変更可
' **************************************
Query = _
"select * " & _
" into [Excel 8.0;DATABASE="&strCur&"\商品マスタ.xls"&"].[商品マスタ] " & _
" from [ODBC;Driver={SQL Server};" & _
"SERVER=.\SQLEXPRESS;Database=lightbox;UID=sa;PWD=password].[商品マスタ]"

' **************************************
' 実行
' **************************************
Cn.Execute Query

' **************************************
' MDB 開放
' **************************************
Cn.Close
Set Cn = Nothing

' **************************************
' 接続用 MDB 削除
' **************************************
on error resume next
Fso.DeleteFile(strCur&"\DUMMY.mdb")
on error goto 0

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




posted by lightbox at 2009-10-27 16:59 | SQLExpress | このブログの読者になる | 更新情報をチェックする

SQLServer のドキュメント

ドキュメントダウンロード
オンラインでも見れますが Microsoft のサイトはサクサクは無理です。
ローカルの PC にインストールしたほうが良いです。

SQL Server 2005 Books Online


オンライン参照
それでも、自分が使う PC 全てにインストールするわけにもいかない
ので、オンラインで見れるようにする事も重要です。

1) Transact-SQL リファレンス
2) コマンド プロンプト ユーティリティ
3) システム ストアド プロシージャ (Transact-SQL)
  ● sp_helpdb (Transact-SQL)


関連する記事
SQL-DMO CSV入出力
bcp.exe を使用した CSV 入出力
xp_cmdshell でストアードプロシージャを知る
SQLの窓1.5(改)でTransact-SQLを学ぶ







posted by lightbox at 2009-10-27 08:43 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2009年10月26日


Oracle : スキーマ作成前にテーブルスペースの情報を取得する

スキーマを作成するのに、テーブルスペースが必要です。サーバのディスク情報やその他の情報を収集します。
sqlplus.exe SYSTEM/MANAGER@//light/XE @chk_tbl_space > nul
chk_tbl_space.sql
SPOOL result.txt
SET TRIMSPOOL ON 
SET FEEDBACK OFF
SET LINESIZE 32767
SET PAGESIZE 1000
COLUMN テーブルスペース名 FORMAT A20
select 
	TABLESPACE_NAME テーブルスペース名,
	CONTENTS タイプ,
	EXTENT_MANAGEMENT エクステント管理,
	round(FSIZE/1000000) "サイズ(M)",
	(FSIZE-FREESIZE)/1000000 "使用量(M)"
from
	DBA_TABLESPACES,
(
	select 
		V$TABLESPACE.NAME TNAME1,
		sum(BYTES) FSIZE
	from V$TABLESPACE,V$DATAFILE
	where
		V$TABLESPACE.TS# = V$DATAFILE.TS#
	group by V$TABLESPACE.NAME
) TSIZE,
(
	select 
		TABLESPACE_NAME AS TNAME2,
		sum(BYTES) AS FREESIZE 
	from DBA_FREE_SPACE
	group by TABLESPACE_NAME
) TFREE
where
	TABLESPACE_NAME = TNAME1 and
	TABLESPACE_NAME = TNAME2;
COLUMN FILE_NAME FORMAT A40
COLUMN TABLESPACE_NAME FORMAT A20
select FILE_NAME,TABLESPACE_NAME,ONLINE_STATUS
	from DBA_DATA_FILES;
EXIT


テーブルスペース名   タイプ             エクステント管理      サイズ(M)  使用量(M)
-------------------- ------------------ -------------------- ---------- ----------
SYSAUX               PERMANENT          LOCAL                       451 445.054976
SYSTEM               PERMANENT          LOCAL                       357   345.7024
UNDO                 UNDO               LOCAL                        94  87.949312
USERS                PERMANENT          LOCAL                       105   1.703936

FILE_NAME                                TABLESPACE_NAME      ONLINE_STATUS
---------------------------------------- -------------------- --------------
C:\ORACLEXE\ORADATA\XE\USERS.DBF         USERS                ONLINE
C:\ORACLEXE\ORADATA\XE\SYSAUX.DBF        SYSAUX               ONLINE
C:\ORACLEXE\ORADATA\XE\UNDO.DBF          UNDO                 ONLINE
C:\ORACLEXE\ORADATA\XE\SYSTEM.DBF        SYSTEM               SYSTEM
関連する記事

SQL*Plusだけで CSV を作成する


posted by lightbox at 2009-10-26 23:53 | Oracle | このブログの読者になる | 更新情報をチェックする

VBS : SQLExpress(SQLServer) テーブルの正しい CREATE 文を取得する

概要

有償版の SQLServer ならばこんな苦労はしなくてもいいはずですが、SQL-DMO はこれ以外にも有用な処理がたくさんあるので、使えるにこした事はありません。

バックアップやリストアは、SQL から実行したほうが便利なので BCP と共に最も良く使う SQL-DMO の処理だと思います
if exists(select * from sysobjects where name = '商品マスタ' and type = 'U')
	drop table 商品マスタ
;
CREATE TABLE [商品マスタ] (
	[商品コード] [varchar] (4) COLLATE Japanese_CI_AS NOT NULL ,
	[商品名] [nvarchar] (50) COLLATE Japanese_CI_AS NULL ,
	[在庫評価単価] [int] NULL ,
	[販売単価] [int] NULL ,
	[商品分類] [varchar] (3) COLLATE Japanese_CI_AS NULL ,
	[商品区分] [varchar] (1) COLLATE Japanese_CI_AS NULL ,
	[作成日] [datetime] NULL ,
	[更新日] [datetime] NULL ,
	 PRIMARY KEY  CLUSTERED 
	(
		[商品コード]
	)  ON [PRIMARY] 
) ON [PRIMARY]
;


これは、出力した結果ですが if 文と削除のところは自前で作成しています。SQLExpress( SQLServer )のSQL実行は、セミコロンで文を区切って一度に実行できるので、上記 SQL は一回の呼び出しで実行可能です

関連する記事

PHP : SQLExpress(SQLServer) : SQL-DMO(COM) による CSV 出力

Set Fso = CreateObject( "Scripting.FileSystemObject" )
' ****************************************
' 定義テキスト取得
' ****************************************

Server = "NIGHT_TCP"		' 別名
Db = "lightbox"
User = "sa"
Pass = "passwordpassword"

ListTable = "社員マスタ,商品マスタ,得意先マスタ"
List = Split( ListTable, "," )

Dim objServer,objDatabase,objTable

' ****************************************
' オブジェクト作成
' ****************************************
on error resume next
Set objServer = CreateObject("SQLDMO.SQLServer")
if Err.Number <> 0 then
	Wscript.Echo "SQL-DMO はインストールされていません"
	Wscript.Quit
end if
on error goto 0

' ****************************************
' 接続
' ****************************************
on error resume next
Call objServer.Connect( Server, User, Pass )
if Err.Number <> 0 then
	Wscript.Echo "接続に失敗しました [" & Err.Description & "]"
	Wscript.Quit
end if
on error goto 0

' ****************************************
' データーベースオブジェクト取得
' ****************************************
on error resume next
Set objDatabase = objServer.Databases(Db)
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0


' ****************************************
' テキストファイル
' ****************************************
Set OutObj = Fso.OpenTextFile( "create_script.sql", 2, True )


' ****************************************
' テーブルオブジェクト
' ****************************************
on error resume next
For i = 0 to Ubound( List )

	Set objTable = objDatabase.Tables(List(i))
	if Err.Number <> 0 then
		Wscript.Echo Err.Description
		Wscript.Quit
	end if

	strDrop = "if exists(select * from sysobjects where name = '"
	strDrop = strDrop & objTable.Name & "'" & " and type = 'U')" & vbCrLf
	strDrop = strDrop & "	drop table " & objTable.Name & vbCrLf
	strDrop = strDrop & ";" & vbCrLf

	OutObj.Write strDrop 
	OutObj.Write Replace( objTable.Script() & "", "GO", ";" ) & vbCrLf

Next
on error goto 0

OutObj.Close()

' ****************************************
' 切断
' ****************************************
Call objServer.DisConnect()



posted by lightbox at 2009-10-26 00:38 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2009年10月25日


PHP : SQLExpress(SQLserver) : COM による接続処理

概要

要するに ADO です。ADO はかなり信頼性のある安定した Windows におけるDB 処理の為の
選択肢です。PHP における COM は完璧ではありませんが、PHP 側のインターフェイスを使
うより、慣れている者にとっては問題点が容易に予想でき、既存のコードもあるていど
そのまま利用できるという長所があります。

一部日本語列名を使った参照に問題が出るので、連想配列に入れなおす必要がありますが、
この部分で他のキャラクタセットの対応が出来ますし、オリジナルオプションを付加する
チャンスでもあります
posted by lightbox at 2009-10-25 22:33 | SQLExpress | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Windows
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり