SQLの窓

2017年12月25日


VBScript : 既存の Excel を PDF に変換する ( Excel 2007以降 )


2017/12/25 更新
Excel.Application を取得しているので、GetOpenFilename でファイルを選択できるようにしました。細かい詳細はソースコードにコメントに書き込んでいます

※ PDF は、Excel と同じ名前で拡張子を .pdf にしてスクリプトと同じフォルダに保存されます。
Excel 2007以降の Excelで名前を付けて保存で PDF に保存できますが、これはスクリプトで行うコードです。Excel 2007 を調べているとメソッド紹介されていたので、引数見た限り、 VBScriptでも動くだろうと試してみました。 ( プリンタが使える状態でないと動作しません ) ExportAsFixedFormat メソッド XlFixedFormatType 最近は、VBScript の単純コードである .vbs は Google Chrome での扱いが悪いので、.wsf で作成しています。もともと、.wsf のほうが簡単に外部ライブラリを参照したり、オブジェクトを最初から定義できるのでコードが簡潔になります。ここでは、Excel.Application 内で定義されている定数も参照して使えるようにしています。 Excel 側では、印刷設定により一行目のタイトルを常に表示するようにしたり、A4 横にして縮小したりしています。シートは二つありますが、PDF に変換すると全て出力されます。
<JOB>
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />
<OBJECT id="ExcelApp" progid="Excel.Application" />
<REFERENCE guid="00020813-0000-0000-C000-000000000046" />
<SCRIPT language="VBScript">
' Wscript.Echo xlTypePDF,xlTypeXPS

' **************************************
' スクリプトのあるディレクトリの取得
' **************************************
strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

' 途中で異常終了すると、Excel がプロセスに残ってしまうので表示させています。
' マウス等で Excel 本体を操作しないで下さい。
' Excel を表示させたくない場合は、以下を削除または行頭に ' でコメントにして下さい
ExcelApp.Visible = True

Dim MyBook
Dim FilePath

' ここで Excel を参照するダイアログが開きます
FilePath = ExcelApp.GetOpenFilename("Excel ファイル (*.xlsx;*.xls), *.xlsx;*.xls", 1, "Excel ファイルの選択") 
if FilePath = "False" Then 
	MsgBox "Excel ファイルの選択がキャンセルされました"
	' スクリプト終了
	Wscript.Quit()
End If

' ここで Excel に読み込んでいます
on error resume next
' Workbook を取得( スクリプトと同じディレクトリ )
Set MyBook = ExcelApp.Workbooks.Open( FilePath )
if Err.Number <> 0 then
	' 終了( 開放 )
	ExcelApp.Quit()
	Wscript.Echo Err.Description & vbCrLf & FilePath
	' スクリプト終了
	Wscript.Quit()
end if
on error goto 0

Dim aPath
Dim strFileName
Dim aExt

' Excel の名前部分を取り出して、pdf の名前部分にします
aPath = Split(FilePath, "\")
strFileName = aPath(Ubound(aPath))
aExt = Split(strFileName,".")
strFileName = aExt(0)

' スクリプトと同じフォルダに保存されます
Call MyBook.ExportAsFixedFormat( xlTypePDF, strCurPath & "\" & strFileName & ".pdf" )

' 終了( 開放 )
ExcelApp.Quit()

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

</SCRIPT>
</JOB>


Microsoft の記事

Application.GetOpenFilename メソッド

Microsoft の英文の記事

Saving Workbooks to PDF and XPS Formats in Excel 2007




タグ:VBScript EXCEL PDF
posted by lightbox at 2017-12-25 17:27 | VBS + オブジェクト | このブログの読者になる | 更新情報をチェックする

2017年12月20日


いまさらですが、『クリーンアップ』を管理者権限で起動して、Windows Update 関連やシステム関連の比較的大きなファイルを削除する

▼ 通常起動からも実行できますが、管理者権限で再起動するので二度手間です


通常起動では、Windows Update のクリーンアップは対象になりません。Windows の設定にもよるかもしれませんが、普通はそうです。そして、場合によったらギガ台に乗ってる巨大なファイルが必要も無いのにディスクに居座ってしまいます。しょっちゅうする必要も無い事ですが、実は管理者権限で実行するのは Windows7 と Windows 10 では違うようなので一応心に留めておく必要があると思います。

さらに、管理者権限の場合は『詳細オプション』というタブがあり、必要無いと思われる復元ポイント以前のリソースも削除できます(但し、トラブル時には復元ポイントが重要になるのでむやみに削除は禁物です )




Windows7 の場合



スタートメニューがあるので比較的簡単。メニューから『プログラムとファイルの検索』から『クリーン』と入力すればクリーンアップアプリが表示されて、CTRL+SHIFT+Enter で起動すると管理者権限による起動です。

地道にメニューから探すのであれば、アクセサリ > システムツール で『ディスク クリーンアップ』を右クリックしてポップアップメニューから『管理者として実行』すればいいです。近いうちにもう一回する予定があれば、そのまま右ドラッグしてショートカットをデスクトップに作成して、プロパティの詳細設定で『管理者として実行』にチェックしておけばいいです。

Windows10 の場合

Windows10 は、Creators Update がかかっていると、『コマンドプロンプト(管理者)』がメニューから消えています(設定で戻せます)。



かわりに Power Shell(管理者)があるので、その中で cmd と入力した後 cleanmgr と入力しましょう



あるいは、以下のように入力して、CTRL+SHIFT+Enter で管理者権限で実行できます


(clean だけでもいいですね)


で、いずれ(Windows 一般)にしても通常コマンドラインから実行したい場合(バッチファイルにしておけば簡単)は以下のようになります。
cmd "/c echo set o=CreateObject("Shell.Application"):o.ShellExecute "cleanmgr","","","runas",1 > %TEMP%\_.vbs & wscript.exe %TEMP%\_.vbs"




posted by lightbox at 2017-12-20 13:29 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする

XCOPYで新しいファイルのみバックアップする為のスクリプトを作成するスクリプト



ディレクトリ選択でバックアップするディレクトリを決定し、カレントディレクトリにバックアップする為のスクリプトを作成します。

▼ 実行時に表示されるディレクトリ選択


そのスクリプトを実行すると、スクリプトがあるカレントのディレクトリに目的のディレクトリをバックアップとしてコピーします。
XCOPY なので、2回目以降は新しいファイルのみコピーします

▼ 使用するオプション
/D : コピー元の日付がコピー先の日付より新しいファイルだけをコピーします
/E : ディレクトリまたはサブディレクトリが空であってもコピーします
/C : エラーが発生してもコピーを続けます
/S : 空の場合を除いて、ディレクトリとサブディレクトリをコピーします
/Y : 既存のファイルを上書きする前に確認のメッセージを表示しません

一番重要なのは、/D です。/S /E で、存在するディリクトリはすべてコピーされます。/E /Y によって、最後まで停止する事なく実行されます。

追加で使う事が想定されるオプション

コピーしたくないディレクトリやファイルがある場合、以下のように指定します。

/EXCLUDE:ファイルのパス

ファイルのパスが示すテキストファイル内に、除外するディレクトリやファイルにある文字列の一部を1 行に 1 つずつ記述します。

その文字列が、コピー対象ファイルの絶対パスの一部と一致した場合、そのファイルはコピーから除外されます。たとえば、"\obj\" という文字列を指定するとディレクトリ obj の下の全ファイルが除外 されます。".obj" という文字列を指定すると .obj という拡張子のファイルがすべて除外されます

ソースコード
' ***********************************************************
' 処理開始
' ***********************************************************
Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )
Set Shell = Wscript.CreateObject( "Shell.Application" )

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

' ***********************************************************
' バックアップ対象ディレクトリの取得
' ***********************************************************
' マイ コンピュータを基準にディレクトリ選択
Set objFolder = Shell.BrowseForFolder( 0, "バックアップするフォルダを選択してください", &H4B, _
	"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" )
if objFolder is nothing then
	WScript.Quit
end if
if not objFolder.Self.IsFileSystem then
	WScript.Echo "ファイルシステムではありません"
	WScript.Quit
end if

strTargetFolder = objFolder.Self.Path
strName = Replace( strTargetFolder, ":", "" )
strName = Replace( strName, "\", "_" )
strName = Replace( strName, " ", "" )
strName = "BK_" & strName

' ***********************************************************
' スクリプト作成
' ***********************************************************
Set OutFile = Fso.OpenTextFile( strBackupFolder & "\" & strName & ".vbs", 2, True )

OutFile.WriteLine "strName = Replace( UCase(WScript.ScriptName), "".VBS"", """" )"
OutFile.WriteLine "strTarget = """ & strTargetFolder & """"
OutFile.Write "if MsgBox( strTarget & vbCrLf & ""のバックアップを開始します。"
OutFile.WriteLine "よろしいですか?"", 1 ) = 2 then"
OutFile.WriteLine "	Wscript.Quit"
OutFile.WriteLine "end if"

OutFile.WriteLine "Set WshShell = Wscript.CreateObject( ""WScript.Shell"" )"
OutFile.Write "ExecCommand = ""cmd.exe /C """"xcopy.exe """""
OutFile.Write strTargetFolder & """"" """""
OutFile.Write strBackupFolder & "\"" & strName & ""\"""""
OutFile.WriteLine " /D /E /C /S /Y & PAUSE"""""""
OutFile.WriteLine "Call WshShell.Run( ExecCommand )"

OutFile.Close

WScript.Echo "バックアップスクリプト : " &  strName & ".vbs" & " を作成しました"

更新履歴
2009-06-28 : 記事作成
2013-04-02 : ダウンロード追加
2015-08-07 : ダウンロードを zip 化( Google Chrome 対応 )



posted by lightbox at 2017-12-20 11:33 | VBScript | このブログの読者になる | 更新情報をチェックする

2017年12月19日


Seesaa ブログの通常エディタで記事の先頭に Twitter カード用の meta 要素を挿入するブックマークレット

▼ ブックマークレットのリンク(ブックマークバーにドロップしてください)
Twitterカード用画像 : meta 要素挿入

Twitter カード用画像のリンクを propmpt で表示したダイアログに入力して実行します。キャンセルするとなにも実行されません。

リンクのコード
<a href="javascript:var%20a=prompt('画像URL','');if(a!=null){$('#article__body').val('&lt;meta name=&#34;twitter:image&#34; content=&#34;'+a+'&#34;&gt;'+&#34;\n&#34;+$('#article__body').val());}void(0);" onclick=" 
		alert('ブックマークバーにドロップしてください'); 
		if (window.navigator.appName.toLowerCase().indexOf('microsoft') > -1) { 
			event.returnValue = false; 
		} 
		event.preventDefault(); 
		event.stopPropagation();
	">Twitterカード用画像 : meta 要素挿入</a>

Seesaa 以外のブログシステムでも、jQuery が使用されておれば、$('#article__body') の部分を変更してどこでも使えると思います。

▼ Twitter の Card validator へのリンク





タグ:twitter
posted by lightbox at 2017-12-19 20:02 | Comment(0) | ブックマークレット | このブログの読者になる | 更新情報をチェックする

C# : Excel を データベースとして DataGridView に読み込む

※ Microsoft Office の Excel がインストールされている必要はありません

Microsoft.ACE.OLEDB.12.0 を使用して、OleDbConnection と OleDbCommand でデータベースとして処理します。テーブル名としては、シート名が使われますが、範囲指定して名前を定義しない限りは [シート名$] をテーブル
として使用します。( カギかっこは、Oracle で言うところのダブルクォートです )

Microsoft.ACE.OLEDB.12.0 がインストールされていない場合

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードしてインストールします。


( 32ビット版と64ビット版があるので選択してダウンロードします / ※ システム要件に 『32 ビット版の Access データベース エンジンは、Windows XP Service Pack 3 でしか使用できません』とあります。Windows7 では既にインストールされていると思われます )

▼ ダウンロードページの『インストール方法』より抜粋
OLEDB を使用するアプリケーション開発者: ConnectionString プロパティのプロバイダー引数を "Microsoft.ACE.OLEDB.12.0" に設定します。 

Microsoft Office Excel データに接続する場合は、Excel ファイル形式に基づいて OLEDB 接続文字列の適切な拡張プロパティを追加します 

ファイル形式 (拡張子)                                             拡張プロパティ
---------------------------------------------------------------------------------------------
Excel 97-2003 ブック (.xls)                                  "Excel 8.0"
Excel 2007-2010 ブック (.xlsx)                             "Excel 12.0 Xml"
Excel 2007-2010 マクロ有効ブック (.xlsm)      "Excel 12.0 Macro"
Excel 2007-2010 XML 以外のバイナリ ブック (.xlsb)      "Excel 12.0"
処理コード
	public partial class FormExcelGridView : Form {

		private string path = null;

		public FormExcelGridView() {
			InitializeComponent();
		}

		private void buttonExcel_Click(object sender, EventArgs e) {

			path = Helper.OpenFileDialog();
			if (path == null) {
				return;
			}

			LoadExcel();

		}

		// *********************
		// Excel の読み込み
		// *********************
		private void LoadExcel() {

			using (OleDbConnection myCon = new OleDbConnection())
			using (OleDbCommand myCommand = new OleDbCommand()) {

				// SQL文字列格納用
				string myQuery = "select * from [sheet1$]";

				// 接続文字列の作成
				myCon.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"", path);
				Debug.WriteLine(myCon.ConnectionString);

				// *********************
				// 接続
				// *********************
				try {
					// 接続文字列を使用して接続
					myCon.Open();
					// コマンドオブジェクトに接続をセット
					myCommand.Connection = myCon;
					// コマンドを通常 SQL用に変更
					myCommand.CommandType = System.Data.CommandType.Text;
				}
				catch (Exception ex) {
					MessageBox.Show(this, ex.Message);
					return;
				}

				// *********************
				// 実行 SQL
				// *********************
				myCommand.CommandText = myQuery;

				// *********************
				// レコードセット取得
				// *********************
				try {
					using (OleDbDataReader myReader = myCommand.ExecuteReader()) {

						DataTable dataTable = new DataTable();
						dataTable.Load(myReader);
						dataGridView.DataSource = dataTable;

						// リーダを使い終わったので閉じる
						myReader.Close();
					}
				}
				catch (Exception ex) {
					myCon.Close();
					MessageBox.Show(this, ex.Message);
					return;
				}

				// 接続解除
				myCon.Close();

			}	// 最外の using の終わり

			// カラム幅の自動調整
			dataGridView.AutoResizeColumns();

		}
	}



Helpre クラス
	class Helper {

		// https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel
		public const int xlMaximized = -4137;
		public const int xlMinimized = -4140;
		public const int xlNormal = -4143;

		public static string OpenFileDialog() {

			OpenFileDialog ofd = new OpenFileDialog();

			ofd.Filter = "Excel(*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|すべてのファイル(*.*)|*.*";
			ofd.FilterIndex = 1;
			ofd.Title = "Excel ブックを選択してください";
			ofd.RestoreDirectory = true;

			if (ofd.ShowDialog() != DialogResult.OK) {
				return null;
			}

			return ofd.FileName;
		}
	}


関連する記事

C# : dynamic 型 による Excel へのアクセス



posted by lightbox at 2017-12-19 00:12 | Comment(0) | VS(C#) | このブログの読者になる | 更新情報をチェックする

2017年12月17日


C# : dynamic 型 による Excel へのアクセス

dynamic 型のオブジェクトは静的な型チェックをバイパスします。 なので、そのオブジェクトに対して熟練している必要がありますが、COM を使用する事を想定している場合、プログラマはそのメソッドに対して良く経験しているはすです。

▼ テンプレートのダウンロード


Excel の初期化部分と終了部分
		// *********************
		// 初期処理
		// *********************
		private void Form1_Load(object sender, EventArgs e) {

			excelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
			excelApp.Visible = true;

		}

		// *********************
		// 終了処理
		// *********************
		private void Form1_FormClosed(object sender, FormClosedEventArgs e) {

			if (excelApp != null) {
				if (workBook != null) {
					// 保存した事にする
					workBook.Saved = true;
				}
				excelApp.Quit();
			}
			System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

		}
Excel.Application は、VBScript では CreateObject で使用する ID です。excelApp は、dynamic 型で定義されており、excelApp.Visible = true; は、Excel が表示される事を意味します。



本来は、非表示でなければなりませんが(ユーザが直接操作するとエラーが発生します)、アプリケーション側(C#)が完成せずにテスト段階でエラーを起こしてしまうと、Excel が終了せずにメモリに残ってしまうので(その場合はタスクマネージャより終了させる)、このようにしています。

実装している機能

Excel には気の遠くなるほど、機能がたくさんあります。その中でも基本となる部分を実装しました。
1) セルへの書き込み。

2) Book を開いて、シート名の一覧をコンボボックスに表示

3) 各 シートをアクティブにする

4) Book を閉じる

5) Book を保存して閉じる

6) 最大化・最小化・標準表示
ソースコード
	public partial class Form1 : Form {

		private dynamic excelApp = null;
		private dynamic workBook = null;
		private string path = null;

		public Form1() {
			InitializeComponent();
		}

		// *********************
		// 書き込みテスト
		// *********************
		private void buttonTest_Click(object sender, EventArgs e) {

			if (workBook == null) {
				return;
			}

			// セル用変数
			dynamic cell;
			// 行と列より、セルオブジェクト(アクティブシート)
			cell = workBook.ActiveSheet.Cells(numericRow.Value, numericColumn.Value);
			// セルに値をセット
			cell.Value = textString.Text;

		}

		// *********************
		// アクティブにする
		// *********************
		private void buttonActive_Click(object sender, EventArgs e) {

			if (workBook == null) {
				return;
			}

			string sheetName = listBoxSheet.Text;
			workBook.Sheets(sheetName).Activate();

		}

		// *********************
		// 初期処理
		// *********************
		private void Form1_Load(object sender, EventArgs e) {

			excelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
			excelApp.Visible = true;

		}

		// *********************
		// 終了処理
		// *********************
		private void Form1_FormClosed(object sender, FormClosedEventArgs e) {

			if (excelApp != null) {
				if (workBook != null) {
					// 保存した事にする
					workBook.Saved = true;
				}
				excelApp.Quit();
			}
			System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

		}

		// *********************
		// ブックを開く
		// *********************
		private void 開く_Click(object sender, EventArgs e) {

			if (workBook != null) {
				MessageBox.Show(this, "ブックは一つしか開く事ができません");
				return;
			}

			path = Helper.OpenFileDialog();
			if (path != null) {
				workBook = excelApp.Workbooks.Open(path);
				listBoxSheet.Items.Clear();
				// シートの数によりループ
				for (int i = 1; i <= workBook.Sheets.Count; i++) {
					// シート名をコンボボックスにセット
					listBoxSheet.Items.Add(workBook.Sheets(i).Name);
				}
				// コンボボックスを使用可能にして
				listBoxSheet.Enabled = true;
				// 先頭を選択する
				listBoxSheet.SelectedIndex = 0;
			}

		}

		// *********************
		// 閉じる
		// *********************
		private void 閉じる_Click(object sender, EventArgs e) {

			if (workBook != null) {
				// 保存した事にする
				workBook.Saved = true;
			}
			workBook.Close();
			workBook = null;

			// クリア
			listBoxSheet.Items.Clear();
			// リストボックスを使用不可にして
			listBoxSheet.Enabled = false;
			// 選択しない
			listBoxSheet.SelectedIndex = -1;

		}

		// *********************
		// 保存して閉じる
		// *********************
		private void 保存して閉じる_Click(object sender, EventArgs e) {

			if (workBook != null) {
				workBook.Save();
			}
			workBook.Close();
			workBook = null;

			// クリア
			listBoxSheet.Items.Clear();
			// リストボックスを使用不可にして
			listBoxSheet.Enabled = false;
			// 選択しない
			listBoxSheet.SelectedIndex = -1;

		}

		// *********************
		// 最大化
		// *********************
		private void 最大化_Click(object sender, EventArgs e) {

			excelApp.WindowState = Helper.xlMaximized;

		}

		// *********************
		// 最小化
		// *********************
		private void 最小化_Click(object sender, EventArgs e) {

			excelApp.WindowState = Helper.xlMinimized;

		}

		// *********************
		// 標準
		// *********************
		private void 標準_Click(object sender, EventArgs e) {

			excelApp.WindowState = Helper.xlNormal;

		}


	}



Helpre クラス
	class Helper {

		// https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel
		public const int xlMaximized = -4137;
		public const int xlMinimized = -4140;
		public const int xlNormal = -4143;

		public static string OpenFileDialog() {

			OpenFileDialog ofd = new OpenFileDialog();

			ofd.Filter = "Excel(*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|すべてのファイル(*.*)|*.*";
			ofd.FilterIndex = 1;
			ofd.Title = "Excel ブックを選択してください";
			ofd.RestoreDirectory = true;

			if (ofd.ShowDialog() != DialogResult.OK) {
				return null;
			}

			return ofd.FileName;
		}
	}


関連する記事

C# : Excel を データベースとして DataGridView に読み込む



タグ:C# EXCEL
posted by lightbox at 2017-12-17 20:29 | Comment(0) | VS(C#) | このブログの読者になる | 更新情報をチェックする

2017年12月12日


Windows7(32ビット) が急にフリーズして、メモリ診断して OK だったけれど、結局メモリの障害だった経緯で行った事

デュアルブートの PC で、両方に Windows7(32ビット)をインストールしています。ある日その片側でフリーズしたのが始まりでしたが、とりあえずメモリ診断やったんですが、その時は異常ありませんでした。



その後、もう一方の Windows7 を立ち上げて Google Chrome の操作をしていると画面が乱れて固まりました。当然『電源長押し』で対処するしか無く、しかし BIOS の画面が表示されてエラー云々。標準の設定で保存して再起動しました。

同一 PC で二つの OS で同様のトラブルなので、共通するのはハード(特にメモリ)なんですが、一応『トレンドマイクロ オンラインスキャン』でウイルスチェックをしてみました。放置してしばらくして PC の前にやってくると PC は死んでました。

なんとかいろいろあって、再度立ち上げて再び『メモリ診断』すると、01% から動かず、放置して帰ってくるとまた死んでました。

もう、メモリが原因なのはほぼ決定と言う事でメモリ抜いてもう一度指しなおして再起動。しかし、反応せず(ディスプレイに信号が来ない)。そこで、たださし直すのでは無くかなり力を入れてグィっと差し込んで再起動してみました(一応表面のほこりと、マザーボード側のほこりはみみかきの綿部分で排除)。

すると正常に立ち上がり、すぐメモリ診断しましたが異常なし。でも、最初のメモリ診断でも問題なかったので、以下の処理を行いました。
1) 管理者権限のコマンドプロンプトで chkdsk /F
2) 管理者権限のコマンドプロンプトで SFC /SCANNOW
3) トレンドマイクロ オンラインスキャン
特に問題なく全て終了したので、裏側の Windows7 でも 1) と 2) を行いましたが、異常ありません。 この作業は二日にまたいでまして、その間あった事 一度、ブルースクリーンになったので、BlueScreenView というフリーソフトがある事を知りました。いつか使えるかもしれません。 気になって Windows Update 調べたら、たまたま Windows Update も死んでて、その対応にも追われました。 (Windows7 で Microsoft(Windows) Update ができなくなる状態の解消方法) Google Chrome も死亡してしまって、User Data を移動して再インストールしました。User Data の中のブックマークだけ戻して再運用してます
1) C:\Users\ユーザ\AppData\Local\Google\Chrome\User Data を適当な場所へ移動
2) Chroem アンインストール
3) Chroem インストール
4) 移動 User Data の中の Default\Bookmarks を新しい 場所へコピー
Google Chrome は以前からメモリを使いすぎると思ってたので、設定変更しました。 この PC は、以前も一度メモリがぶっ壊れて買い換えてます。その時は新品のぶっ壊れたメモリと同じものもらいましたが、怖いので違うものが今刺さってます。なので、こんどなんかあったら買い替えなれければと思っています。 しかし、メモリの抜き差しの2回目で改善するって、運がいいのか悪いのか...
タグ:トラブル
posted by lightbox at 2017-12-12 18:02 | Comment(0) | Windows7 | このブログの読者になる | 更新情報をチェックする

2017年12月11日


Windows7 で Microsoft(Windows) Update ができなくなる状態の解消方法

wuauclt /ShowWU で表示される画面で以下のようになり、なにもできない状態です
( 2017 年 12 月 4 日 (月曜日) より発生との事 ) 

▼ Windows7 32ビット


▼ Windows7 64ビット


▼ Microsoft の対応解説ページ
Windows 7 / Windows Server 2008 R2 以前の環境において、Microsoft Update 実行時に 0x80248015 エラーが発生する

以下のバッチファイルを管理者として実行します
net stop wuauserv
net stop bits

ren %systemroot%\SoftwareDistribution SoftwareDistribution.old

del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr0.dat"
del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr1.dat"

net start bits
net start wuauserv

wuauclt /detectnow

BITS は、Background Intelligent Transfer Service で、wuauserv は Windows Update です


実行後、wuauclt /ShowWU 等で Windows Update の UI を表示させると、表示のおかしかった下部に正しい表示がされて、更新可能になります。






posted by lightbox at 2017-12-11 12:04 | Comment(0) | Windows7 | このブログの読者になる | 更新情報をチェックする

2017年12月05日


jQuery Columns を使って、Picasa API より アルバム一覧を表示する

Google+ のユーザID は、ログインした状態で、ブラウザに https://get.google.com/albumarchive を入力して Enter すれば URL の最後に付加されます。Picasa 時代に作成されたアルバムは、以下のリンクから表示してサイズを自由に指定できる画像 URL を手に入れる事ができます。

リンク先でユーザID を入力して一覧表示します


▼ アルバムリンクからギャラリー(画像をクリックすると拡大表示)


▼ リンクをクリックすると、HTML 取得画面



▼ PHP


▼ Shadowbox



▼ 以下、ブログ内でアルバムIDの一覧の表示
columns プラグインの環境の都合で、右下矢印画像が出ていませんが、動作に支障はありません

以下のフィールドにユーザID を入力して読み込みボタンを押すだけですが、ユーザID には数字以外の人も居るようでしたが、それでもちゃんと取得できました。

呼び出した JSON を読むには、整形が必要なので JSONLint を使用しました


<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>

<script src="http://winofsql.jp/if_skeleton/basic_06_columns/columns/js/jquery.columns.min.js"></script>
<link rel="stylesheet" href="http://winofsql.jp/if_skeleton/basic_06_columns/columns/css/classic.css">

<input type="text" id="target_user" value="101280392108947207617">
<input type="button" value="読み込み" onclick="get_album()">
<div id="columns"></div>

<script>

var example = null;
function get_album() {

	var user_id = $("#target_user").val();
	if ( example != null ) {
		example.destroy();
	}

	$.ajax({
		url:'https://picasaweb.google.com/data/feed/api/user/' + user_id + '?alt=json',
		dataType: 'json', 
		success: function(json) { 

			var target = [];
			for( i = 0; i < json.feed.entry.length; i++ ) {
				if ( !json.feed.entry[i].gphoto$albumType ) {
					target.push( 
						{
							 'title' : json.feed.entry[i].title.$t,
							'numphotos':  json.feed.entry[i].gphoto$numphotos.$t,
							'albumid' : json.feed.entry[i].gphoto$id.$t
						}
					);
				}
			} 

			example = $('#columns').columns({
				data:target, 
				schema: [
					{"header":"タイトル", "key":"title", "template":"{{title}}"},
					{"header":"画像数", "key":"numphotos" },
					{"header":"アルバムID", "key":"albumid" }

				],
				size: 100,showRows: [50,100,200]

			}); 
		}
	}); 

}
</script>

関連する記事

Picasa が終了するので、Google フォトで登録した画像の URL を Picasa の API で取得する手順

jQuery プラグイン : Columns と PHP の連携と、ドキュメントには書かれていないカスタマイズ方法




posted by lightbox at 2017-12-05 20:30 | Comment(0) | プラグイン:jQuery | このブログの読者になる | 更新情報をチェックする

jQuery プラグイン : Columns と PHP の連携と、ドキュメントには書かれていないカスタマイズ方法

デモページ


jQuery プラグインの Columns は、JSON データを読み込むだけで上のような至れり尽くせりのテーブル要素による一覧表示を可能にします。

問合せテーブルの特徴

1) ページ処理( ページとページ )
2) ページ毎の行数変更
3) テーブル上のデータのリアルタイム検索
4) 列のタイトルをクリックしてソート

※ 特別なオプションを設定しなければ、3) と 4) は全ての列が対象となります

とても簡単な PHP との連携

PHP 側では、JSON で行の配列を返せば良いので、データベースの読み込み処理は、一括で簡単です。列名やデータの表示方法は、JSON のデータで決定されるので、SQL を変更する事によって自由自在に表示を変更できます。
<?php
header( "Content-Type: application/json; Charset=utf-8" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

require_once("dbsetting.php");

$query = <<<QUERY
-- ***********************************************
-- SQL 開始
-- ***********************************************
select 

SYAIN.社員コード,
SYAIN.氏名,
SYAIN.フリガナ,
SYAIN.所属,
A.名称 as 所属名,
-- SYAIN.性別,
B.名称 as 性別,
SYAIN.給与,
ifnull(SYAIN.手当,'') as 手当,
ifnull(SYAIN.管理者,'') as 管理者,
ifnull(SYAIN2.氏名,'') as 管理者名,
ifnull(DATE_FORMAT(SYAIN.生年月日,'%Y/%m/%d'),'') as 生年月日

from 

社員マスタ SYAIN
left outer join コード名称マスタ A
on SYAIN.所属 = A.コード

left outer join 社員マスタ SYAIN2
on SYAIN.管理者 = SYAIN2.社員コード

left outer join コード名称マスタ B
on SYAIN.性別 = B.コード

where A.区分 = 2 and B.区分 = 1	and SYAIN.削除区分 is NULL
and SYAIN.氏名 like '%{$_GET['cond']}%'

order by SYAIN.社員コード

-- ***********************************************
-- SQL 終了
-- ***********************************************
QUERY;

$result = $connect->query($query); 
$row = $result->fetch_all(MYSQLI_ASSOC);

print json_encode($row);

?>

mysqli_result::fetch_all

ドキュメントにはっきり書かれていないカスタマイズ

ソースコードを読まないと解りませんが、『問合せテーブルの特徴』での4つの処理毎にイベントが用意されています。これらのイベントが発生すると、テーブルの表示が書き換わるのですが、HTML そのものを再構築するので外部からカスタマイズするには無理があります。そこで、以下の4つの定義済みイベントが必要になります。
1) pageHandler
2) sizeHandler
3) searchHandler
4) sortHandler
これらのイベントは、他のオプションプロパティと同じ部分で定義されているので、設定時のプロパティとして無名関数を定義する事によって、外部から処理する事が可能になります。 しかし、この中に書く処理には、デフォルトの処理があるので、外部で定義する場合もその処理は記述しなければなりのません。そして、そのデフォルトの処理は、ソースコードを読まないと具体的に知る事ができません。 ▼ 以下がその処理を含めた、デモ用の初期設定です。
$(function() {

	$.get("syain.php?cond=" , function(data){

		$('#columns').columns({
			data: data, 
			templateFile: 'columns/templates/custom.mst',
			showRows: [10, 20, 50],
			size: 10,
			sortableFields: ['社員コード','氏名'],
			searchableFields: ['所属'],
			pageHandler: function(){
				this.create();
				customTable();
			},
			sortHandler: function() {
				this.page = 1;
				this.create();
				customTable();
			},
			searchHandler: function(event) { 
				if(this.liveSearch) {
					this.create();
				} else {
					if(event.keyCode == '13') {
						this.create();
					}
				}
				customTable();
			},
			sizeHandler: function() {
				this.create();
				customTable();
			}
		
		});

		// プラグイン実装後の1回きりの処理
		customTable();

	});



});


this.create() がテーブルの再構築処理です。ですから、カスタマイズするのは、this.create() の後ろに自分の処理を行う必要があります。( this.create() の前に行う処理の場合は、オプションや内部データを直接変更する処理になると思います )

ここで行った『あとから CSS で右よせにしてカンマ編集』

テーブルなので、jQuery の find を使う事によって結構単純に目的の列の情報を変更する事ができます。以下の customTable 関数では、TH 部分と TD 部分を個別に設定しています
function customTable() {

		// 給与と手当
		$("table").find("th").eq(6).css("text-align", "right");
		$("table").find("th").eq(7).css("text-align", "right");

		$("table").find("tr").each( function(){
			// 給与と手当
			$(this).find("td").eq(6).css("text-align", "right");
			$(this).find("td").eq(7).css("text-align", "right");

			var kyuyo = $(this).find("td").eq(6).text();
			kyuyo = parseInt(kyuyo,10);
			// カンマ編集
			kyuyo = kyuyo.toLocaleString();
			$(this).find("td").eq(6).text(kyuyo);

			var teate = $(this).find("td").eq(7).text();
			if ( teate != "" ) {
				teate = parseInt(teate,10);
				// カンマ編集
				teate = teate.toLocaleString();
			}
			$(this).find("td").eq(7).text(teate);

		} );
}



説明不十分なテンプレート使用方法

デフォルトのテンプレートは、ソースコードに埋め込まれてしまっています。ですから、テンプレートをカスタマイズするには、templateFile プロパティを使用する必要があります。外部ファイルに用意されたテンプレートファイルは、以下の二つです。

custom.mst
default.mst

ソースに埋め込まれているものが、default.mst のようなので、custom.mst を使ってみると、どうやらバグのようで、カスタマイズされたフィールド( ページジャンプ ) が、Plugin オプションを使わないと動作しないようですが、用意されている gotopage.js を使ってもちょっと動かないようです。

そもそも、Plugin に関する説明が全くありませんが、使うとすると内部から呼び出されるイベントとして動作します。但し、テーブル再構築後にしか呼ばれないようなので、利用範囲が限定されます。

Plugin 内のイベントは二つしか無く、init と create で、init は最初に一度だけ処理されます。create を使って、狙った要素にイベントを作成する事ができると思いますが、通常のイベントオプションを使ったほうが汎用性があるように思います。

ただ、サンプルとして付加されている、ajaxpaging.js は、プラグイン内で イベントオプション を使用しており、『必要な時に必要だけデータを取得して表示』するという処理を実現しているように見えます。

テンプレートと画像の扱い

ページ処理用の画像が、テンプレートに直接パスが埋め込まれているので、実行中のページの中に images フォルダが必要である事になっています。images の場所が違う場合は、テンプレート内を直接変更する必要があります。

サーチ用の画像は CSS 内で使用されているので、CSS があるフォルダからの相対パスが正しければ表示されます

ドキュメント内の誤記

size のデフォルトが 10 と書かれていますが、実際は 5 です

oddRowClass のデフォルトが 'ui-table-rows-even' となっていますが、完全な誤りです。実際は(あたりまえですが)、ui-table-rows-odd になります。

even と odd は、偶数・奇数です。行の背景色を交互に変える為に一般的に使用される手法です

デモで使用しているテーブルの仕様

▼ 社員マスタ
列名 型名 最大桁 NULL 主キー
1 社員コード varchar 4 N 1
2 氏名 varchar 50    
3 フリガナ varchar 50    
4 所属 varchar 4    
5 性別 int      
6 作成日 datetime      
7 更新日 datetime      
8 給与 int      
9 手当 int      
10 管理者 varchar 4    
11 生年月日 date      
12 削除区分 varchar 1    

▼ コード名称マスタ
列名 型名 最大桁 NULL 主キー
1 区分 int   N 1
2 コード varchar 10 N 2
3 名称 varchar 50    
4 数値1 int      
5 数値2 int      
6 作成日 datetime      
7 更新日 datetime      

関連する記事

イラストAC 用 : 前日ダウンロード数を一覧表示する為のブックマークレット : jQuery プラグイン使用

イラストACの管理画面に、イラスト毎の前日ダウンロード項目が追加されたので、前日にダウンロードされたイラストのみをテーブルで表示するブックマークレットを作成しました。

jQuery Columns を使って、Picasa API より アルバム一覧を表示する




posted by lightbox at 2017-12-05 20:24 | Comment(0) | IFRAME パッケージ | このブログの読者になる | 更新情報をチェックする
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 終わり