SQLの窓

2014年10月09日


PowerShell で PNG 画像にフォントを指定してテキストを書き込む

処理前



処理後



メソッドに引数を渡す場合、いったん変数に値をセットするとデータ型が確定するようで、オーバーロードのあいまいさが回避されました。
Add-Type -AssemblyName System.Drawing

# 読込み
$bmp = New-Object System.Drawing.Bitmap -ArgumentList "C:\user\lightbox\vs\button.png"
$gra = [System.Drawing.Graphics]::FromImage($bmp)

# フォント作成
$ff = New-Object System.Drawing.FontFamily -ArgumentList "メイリオ"
$type = [System.Drawing.FontStyle]::Regular
$myFont = New-Object System.Drawing.Font -ArgumentList $ff,32,$type

# ブラシ作成
$col = [System.Drawing.Color]::FromArgb(255,255,255)
$myBrush = New-Object System.Drawing.SolidBrush -ArgumentList $col

# アンチエイリアス設定
$gra.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::AntiAliasGridFit

# 書き込み
$gra.DrawString( "送信ボタン", $myFont, $myBrush, 70, 20 )

# 保存
$bmp.Save("C:\user\lightbox\vs\button_edit1.png", [System.Drawing.Imaging.ImageFormat]::Png)

$bmp.Dispose()


▼ C# でのコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Text;

namespace bitmap_test {
	class Program {
		static void Main(string[] args) {

			Bitmap bmp = new Bitmap(@"C:\user\lightbox\vs\button.png");

			Graphics gra = Graphics.FromImage(bmp);

			Font myFont = new Font(
				new FontFamily("メイリオ"),
				32,
				FontStyle.Regular);

			SolidBrush myBrush = new SolidBrush(Color.FromArgb(255,255,255));

			gra.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

			gra.DrawString( "送信ボタン", myFont, myBrush, 70, 20 );

			bmp.Save(@"C:\user\lightbox\vs\button_edit1.png", System.Drawing.Imaging.ImageFormat.Png);

			bmp.Dispose();

		}
	}
}



タグ:PowerShell
posted by lightbox at 2014-10-09 01:22 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年10月08日


JavaScript の String と Date オブシェクトに、9999/99/99 書式の文字列日付を取り出すメソッドを追加する

月と日が一桁の場合、前に "0" を付加する為に、String.prototype.right がある事が前提です。 

文字列からのアプローチは、年・月・日の区切り文字に対して sdate を実行します(引数に Date オブジェクト)。
Date オブジェクトからのアプローチは、日付オブジェクトに対して、sdate を実行して、引数には区切り文字を指定します 
<script type="text/javascript">
String.prototype.right = function(n){
	var str = this.valueOf();
	str = str.substr(str.length-n,n);
	return str;
}
String.prototype.sdate = function(dt){
	var str = this.valueOf();
	var today = dt.getFullYear() + str + ("0"+(dt.getMonth()+1)).right(2) + str + ("0"+dt.getDate()).right(2);
	return today;
}
Date.prototype.sdate = function(str){
	var today = this.getFullYear() + str + ("0"+(this.getMonth()+1)).right(2) + str + ("0"+this.getDate()).right(2);
	return today;
}

console.log( "-".sdate(new Date()) )
console.log( (new Date()).sdate("-") )
</script>



タグ:javascript
posted by lightbox at 2014-10-08 11:16 | JavaScript オブジェクト | このブログの読者になる | 更新情報をチェックする

2014年10月07日


PowerShell で、SQLServer2012 の SMO を使用してテーブルの create 用のスクリプトを出力する

思い立ってから、完成するまでに1日かかりました。すこしづづ情報を集めてやっとという感じです。最初に C# で動作確認し、その後 PowerShell に移植しました。

びっくりしたのは、サーバーにパスワード等で接続しなくても、ローカルの SQLExpress を参照可能だったというところです。

Add-Type の参照部分では、SQLServer のバージョンによってファイルが変わる可能性があり、それに関するトラブルを多く見かけました。最初、単純に Table オブジェクトからスクリプトを作成しようとしたのですが、どうしてもうまく行かず、Scripter を使うコードにぶちあたって、いとも簡単に出力できました。

ただ、その際に Framework のオブジェクトの配列が必要だったので、そこでも少し調査に時間がかかりました。

で、結局出力されたのは以下のような UTF-8N のテキストファイルです。
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[社員マスタ](
	[社員コード] [varchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[氏名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[フリガナ] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[所属] [varchar](4) COLLATE Japanese_CI_AS NULL,
	[性別] [int] NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[給与] [int] NULL,
	[手当] [int] NULL,
	[管理者] [varchar](4) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY]

▼ PowerShell のコード
Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll"
Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Management.Sdk.Sfc.dll"
$srv = New-Object Microsoft.SqlServer.Management.Smo.Server

$db = $srv.Databases["lightbox"]
$scrp = New-Object Microsoft.SqlServer.Management.Smo.Scripter($srv)
$scrp.Options.ScriptDrops = $false
$scrp.Options.WithDependencies = $true
$smoObjects = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] -ArgumentList 1
$smoObjects[0] = $db.Tables["社員マスタ"].Urn
$sc = $scrp.Script($smoObjects)

$srv.ConnectionContext.Disconnect()

$ftext = New-Object System.IO.StreamWriter -ArgumentList "C:\user\script.txt"

foreach($text in $sc){
  $ftext.WriteLine( $text )
}

$ftext.Close()


C# で同等の処理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.Collections.Specialized;
using Microsoft.SqlServer.Management.Sdk.Sfc;

namespace smo_table_script
{
	class Program
	{
		static void Main(string[] args)
		{
			Server srv = new Server();

			Database db = srv.Databases["lightbox"];
			Scripter scrp = new Scripter(srv);
			scrp.Options.ScriptDrops = false;
			scrp.Options.WithDependencies = true;

			Urn[] smoObjects = new Urn[1];
			smoObjects[0] = db.Tables["社員マスタ"].Urn;

			StringCollection sc = scrp.Script(smoObjects);
			foreach (string st in sc)
			{
				Console.WriteLine(st);
			}

			Console.ReadLine();
		}
	}
}




posted by lightbox at 2014-10-07 22:00 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年10月06日


コマンドプロンプトの簡易編集モードのデフォルトを on にする

▼ 最初からこの状態にします


簡易編集モードを on にすると、マウスだけで簡単にクリップボードの操作が行えるようになります。
1) ドラッグで選択
2) 右クリックでコピー
3) 入力待ちで右クリックで貼り付け

HKEY_CURRENT_USER\Console には、いろいろなコマンドプロンプトの初期設定がなされています。UI の設定ダイアログから変更した値は、コマンドプロンプトのタイトル毎にデータが別に保存されるので、このような重要な設定はあらかじめ設定しておくと良いと思います
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"QuickEdit"=dword:00000001

※ エディタで最初から作成する場合は、Unicode で保存します



ダウンロードされるファイルは、.reg ファイルなので、ブラウザがいろいろ警告を出すと思います。気になるのであれば、regedit で直接変更すると良いと思います。


posted by lightbox at 2014-10-06 21:08 | Windows | このブログの読者になる | 更新情報をチェックする

2014年10月05日


PHP : 連想配列を「オブジェクト」に変換(キャスト)するとうまく動きますが、通常配列では参照できないようです

これは、連想配列云々では無く、プロパティ名が数字だと参照できないようです。( 0、a、2 という連想配列でテストしました )

PHP では、特別な文字列のプロパティ参照として、以下のような記述が可能です。
$z1->{'2011/07/08'}
$z1->{'日本語表示'}

※ ついでなので、可変変数でオブジェクトのプロパティを参照してみました
$v = '日本語表示';
print $z1->$v;
<?
header( "Content-Type: text/plain; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// ***********************************************
// 連想配列のテスト
// ***********************************************
$x['2011/07/08'] = 2;
$x['next'] = '2011/07/15';
$x['日本語表示'] = 'ここは SHIFT_JIS です';

$z1 = (object)$x;

print "\n";
print $z1->{'2011/07/08'} . "\n";
print "{$z1->next}\n";
print "{$z1->{'日本語表示'}}\n";

// 可変変数でオブジェクトのプロパティ
$v = '日本語表示';
print $z1->$v  ."\n";

print "\n";

var_dump($z1);

// ***********************************************
// 通常配列のテスト
// ***********************************************
$y[] = 2;
$y[] = '2011/07/15';
$y[] = 'ここは SHIFT_JIS です';

$z2 = (object)$y;

// 単独では表示されません??
print "\n";
print $z2->{0} . "\n";
print $z2->{'0'} . "\n";
print $z2->{"0"} . "\n";
$v = 0;
print $z2->$v . "\n";
$v = "0";
print $z2->$v . "\n";
print "\n";


// 中には入っているようですが・・・
var_dump($z2);


// ***********************************************
// その他の変換( マニュアル通りです )
// ***********************************************
$z3 = (object)'日本語表示';

print "\n";
print $z3->scalar . "\n";
print "\n";

var_dump($z3);

?>


2
2011/07/15
ここは SHIFT_JIS です
ここは SHIFT_JIS です

object(stdClass)#1 (3) {
  ["2011/07/08"]=>
  int(2)
  ["next"]=>
  string(10) "2011/07/15"
  ["日本語表示"]=>
  string(21) "ここは SHIFT_JIS です"
}







object(stdClass)#2 (3) {
  [0]=>
  int(2)
  [1]=>
  string(10) "2011/07/15"
  [2]=>
  string(21) "ここは SHIFT_JIS です"
}

日本語表示

object(stdClass)#3 (1) {
  ["scalar"]=>
  string(10) "日本語表示"
}
全く表示されません
最後に文字列を OBJECT に変換していますが、scalar と言うプロパティが作成されています。 ちなみに、説明の吹き出しは画像ですが、中の文字は普通の文字列で、PRE の枠の position を relative にして以下のようにして表示しています。
<img src="http://winofsql.jp/image/fd02.png" style='border:solid 0 #000;width:300px;position:absolute;left:220px;top:80px;box-shadow:none' /><div style='position:absolute;left:280px;top:160px;width:200px;font-size:20px;font-weight:bold'>全く表示されません</div>



posted by lightbox at 2014-10-05 11:44 | PHP + 特記事項 | このブログの読者になる | 更新情報をチェックする

2014年10月03日


jQuery のオブジェクト参照と属性参照と DOM としての参照

jQuery で属性参照するのであれば、prop が望ましいです。そして、jQuery から DOM 参照したほうが簡単な場合もあります。

ソースコード実行する場合は、開発者ツールを開いて実行します。(IEは IE9以降 でないと、console.dir() は動作しません)

jQuery のオブジェクトと通常のオブジェクトを意図的に使い分けています。
▼ jQuery
jQuery では、$("セレクタ") から jQuery のメソッドを使う

▼ DOM を使いたい場合
$("セレクタ")[n] から、DOM のメソッドやプロパティを使用します
( $("セレクタ").get(n) でも同等 )
属性を設定・取得するメソッドとしては、.attr() と .prop() の二通りありますが、結果としての大きな違いはサンプルコードのような状態の違いを検査する時の表現になります。しかし、厳密な違いは結構大きいので、UI でのコントロールでは prop を使う事を強く推奨します。 ※ attr に関しては、バージョンの 1.6 を境に微妙に動作が違う
elem.checked true (Boolean) が設定されていても、チェックを外せば false となる
$(elem).prop("checked") true (Boolean) が設定されていても、チェックを外せば false となる
elem.getAttribute("checked") checked="checked" と指定した場合、Firefox では getAttribute で
変化は評価できませんでした。IE は常に true か false が返される
ようです。
$(elem).attr("checked")
(1.6)
getAttribute の仕様と同じ状態
( チェックを外しても初期状態のまま )
$(elem).attr("checked")
(1.6.1以降)
"checked" (String) と、undefined で切り替わる
( 最新仕様 )
$(elem).attr("checked")
(1.6より前)
elem.checked と同じ動作

▼ デベロッパーツールのコンソールを開いて右のボタンをクリックしてソースコードの結果を表示できます


▼ このコードをソースコードから実行してみる
<input id="bt1" type="button" value="実行" disabled />
<input id="bt2" type="button" value="実行" />
<script type="text/javascript" src="jquery-1.6.2.min.js"></script> 
<script type="text/javascript">

$("#bt2").click( function() {

	// 既存のプロパティの参照
	var x = $(navigator).attr('userAgent');
	console.log(x);
	x = $(navigator).prop('userAgent');
	console.log(x);

	// グローバルスコープにユーザプロパティ(変数)を作成
	window["lightbox"] = { "version": 1.01, "type": "user" };

	// jQueryでセット
	$(window).attr("lightbox1", {} );
	$(lightbox1).attr("version", 1.01).attr( "type", "user" );
	$(window).prop("lightbox2", {} );
	$(lightbox2).prop("version", 1.01).prop( "type", "user" );

	// 内容の表示
	try {
		console.dir(lightbox);
		console.dir(lightbox1);
		console.dir(lightbox2);
	} catch(e){};

	// bt1 と bt2 の disabled 属性の見え方の違い
	// this は、bt2 のイベント内なので、bt2 のオブジェクト
	// attr では、prop の true/false に対して、"disabled"/undefined
	console.log( "左ボタン(attr):" + $("#bt1").attr("disabled") );
	console.log( "左ボタン(prop):" + $("#bt1").prop("disabled") );
	console.log( "右ボタン(attr):" + $(this).attr("disabled") );
	console.log( "右ボタン(prop):" + $(this).prop("disabled") );

	// タイトル属性の追加( 実行後、
	$("#bt1").attr("title", "OK");
	$("#bt2").prop("title", "NO");

	// 配列で直接オブジェクトを参照
	console.log( "左ボタン([n] DOM):" + $("#bt1")[0].disabled );
	console.log( "右ボタン([n] DOM):" + $("#bt2")[0].disabled );

	// 上と同じものをメソッドで
	console.log( "左ボタン(get(n) DOM):" + $("#bt1").get(0).disabled );
	console.log( "右ボタン(get(n) DOM):" + $("#bt2").get(0).disabled );

	// jQuery の each で参照( ひとつしか無いという前提 )
	$("#bt1").each( function(){ console.log("左ボタン(DOM):" + this.disabled); } )
	$("#bt2").each( function(){ console.log("右ボタン(DOM):" + this.disabled); } )
	$("#bt1").each( function(){ console.log("左ボタン(jQuery):" + $(this).prop("disabled")); } )
	$("#bt2").each( function(){ console.log("右ボタン(jQuery):" + $(this).prop("disabled")); } )

	// 通常(DOM)の参照
	console.log( document.getElementById("bt1").disabled );
	console.log( document.getElementById("bt2").disabled );

});

</script>
グローバルオブジェクトの作成

window["lightbox"] = { "version": 1.01, "type": "user" }; は、window.lightbox を作成(オブジェクトです)し、version と type プロパティをセットしています。

これと同等の処理を jQuery でも実行しています。

attr と prop での参照

左のボタンは、HTML として disabled が存在し、右のボタンには定義そのものがありません。ですから、attr で参照すると、右のボタンは undefined になります。

attr と prop は、画面の操作による変化がなければ、どちらを使っても意味としては同じ結果になります。(返される値は違います)

DOM として参照

jQuery の セレクタで選択したオブジェクトは、配列参照する事で DOM として使用できます。(正式なメソッドは get です)
※ 但し、get を使うと -1 という負の数を使って、一覧の最後のオブジェクトを参照可能です

また、each では コールバックを必要としており、その関数には DOM が渡されています。あらためて jQuery を使用する場合は、$(this) とします。



タグ:jquery
posted by lightbox at 2014-10-03 13:31 | jQuery | このブログの読者になる | 更新情報をチェックする
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 終わり