uniqid という単純な関数で取得できます。 結果例 : 4a60afd294c67 これは、マイクロ秒( 100万分の1秒 ) を元にしているらしいので、十分にユニークです。ほぼこれ以上を気にする必要はありません。 マニュアルには、第一引数の説明として、prefix というものがありますが、これは複数のサーバで同時に実行される場合同じになる可能性が( ほんのほんの少しだけ、殆ど無い ) あるので用意されているだけで、同一サーバの同一処理系で利用しても意味ありません。 また、第二引数としてさらにユニークにするオプションがあります。 実行例 : print uniqid("",true); 結果例 : 4a60b0dd16e413.58317420
2019年08月26日
PHP : ユニークなキーの取得
2019年08月18日
Apache の index 表示でファイル名が長すぎて省略される場合の設定変更
Directory Listing Column Width ( stackoverflow ) IndexOptions に NameWidth=* を追加して再起動します。 ( IE11 はキャッシュを削除したほうがよさそう ) ▼ xampp\apache\conf\extra\httpd-autoindex.conf
<IfModule autoindex_module> <IfModule alias_module> # # Directives controlling the display of server-generated directory listings. # # Required modules: mod_authz_core, mod_authz_host, # mod_autoindex, mod_alias # # To see the listing of a directory, the Options directive for the # directory must include "Indexes", and the directory must not contain # a file matching those listed in the DirectoryIndex directive. # # # IndexOptions: Controls the appearance of server-generated directory # listings. # IndexOptions FancyIndexing HTMLTable VersionSort NameWidth=* # We include the /icons/ alias for FancyIndexed directory listings. If # you do not use FancyIndexing, you may comment this out. # Alias /icons/ "/pleiades/xampp/apache/icons/" <Directory "/pleiades/xampp/apache/icons"> Options Indexes MultiViews AllowOverride None Require all granted </Directory>
2019年08月16日
WSH( JScript ) : MySQL から SQLServer(SQLExpress) へのエクスポート
MySQL のドライバが 32 ビットのみの為、SysWOW64\cscript.exe で実行するようにしています。
<JOB> <SCRIPT language="JScript"> // **************************** // SysWOW64\cscript.exe を使用 // **************************** str = WScript.FullName; if ( str.search(/syswow/i) == -1 ) { shell = new ActiveXObject("Shell.Application"); folder = shell.Namespace( 0x29 ); folderItem = folder.Self; target_path = folderItem.Path; str = WScript.ScriptFullName; WshShell = new ActiveXObject("WScript.Shell"); WshShell.Run( "cmd.exe /c " + target_path + "\\cscript.exe \"" + str + "\" & pause", 3 ); WScript.Quit(); } // **************************** // オブジェクト作成 // **************************** var cn = new ActiveXObject( "ADODB.Connection" ) // **************************** // 接続用の文字列を準備 // **************************** var file_path1_accdb = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.accdb"; var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path1_accdb + ";"; // **************************** // エクスポート用の文字列を準備 // **************************** var import_target = "[ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=]"; var target_name = "社員マスタ"; var file_path_xlsx = "C:\\Users\\sworc\\Documents\\hanbaic-set\\new.xlsx"; var export_target = "[ODBC;Driver={SQL Server};server=localhost;database=lightbox;uid=sa;pwd=password]"; var export_query = "select * into " + export_target + "." + target_name + " from " + import_target + "." + target_name; WScript.Echo( export_query ); // **************************** // エクスポート // **************************** cn.Open( connection_string ); cn.Execute( export_query ); cn.Close(); WScript.Echo( target_name + " の MySQL から SQLServer(SQLExpress) へのエクスポート処理が終了しました" ); </SCRIPT> </JOB>
関連する記事 System.Data.OleDb で select into 構文を使って簡単に Microsoft Access のデータを他の データベースにエクスポートする
WSH( JScript ) : SysWOW64\cscript.exe を使用して実行しなおす処理
処理の内容は、MySQL から Excel へのエクスポートですが、接続には Access を使用します。ただ、環境の問題で MySQL のドライバを 32ビットしかインストールしていなかったのでこのようになっています。 ShellSpecialFolderConstants Enumeration
<JOB> <SCRIPT language="JScript"> // **************************** // SysWOW64\cscript.exe を使用 // **************************** str = WScript.FullName; if ( str.search(/syswow/i) == -1 ) { shell = new ActiveXObject("Shell.Application"); folder = shell.Namespace( 0x29 ); folderItem = folder.Self; target_path = folderItem.Path; str = WScript.ScriptFullName; WshShell = new ActiveXObject("WScript.Shell"); WshShell.Run( "cmd.exe /c " + target_path + "\\cscript.exe \"" + str + "\" & pause", 3 ); WScript.Quit(); } // **************************** // オブジェクト作成 // **************************** var cn = new ActiveXObject( "ADODB.Connection" ) // **************************** // 接続用の文字列を準備 // **************************** var file_path1_accdb = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.accdb"; var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path1_accdb + ";"; // **************************** // エクスポート用の文字列を準備 // **************************** var import_target = "[ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=]"; var target_name = "社員マスタ"; var file_path_xlsx = "C:\\Users\\sworc\\Documents\\hanbaic-set\\new.xlsx"; var export_target = "[Excel 12.0 xml;DATABASE=" + file_path_xlsx +"]"; var export_query = "select * into " + export_target + "." + target_name + " from " + import_target + "." + target_name; WScript.Echo( export_query ); // **************************** // エクスポート // **************************** cn.Open( connection_string ); cn.Execute( export_query ); cn.Close(); WScript.Echo( target_name + " の Excel へのエクスポート処理が終了しました" ); </SCRIPT> </JOB>
2019年08月15日
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) Window の最大化・標準表示ソースコード
using System; using System.Windows.Forms; namespace ExcelBasic { public partial class Form1 : Form { // Excel アプリケーション private dynamic excelApp = null; // Excel ブック private dynamic workBook = null; // Excel のパス 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(); // 先頭へスクロール workBook.Sheets(sheetName).Range("A1").Select(); } // ********************* // 初期処理 // ********************* private void Form1_Load(object sender, EventArgs e) { // COM のロード 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; } // Helper クラスでファイルを開く path = Helper.OpenFileDialog(); if ( path != null ) { // Excel でブックを開く workBook = excelApp.Workbooks.Open(path); // リストボックス初期化 listBoxSheet.Items.Clear(); // シートの数によりループ for( int i = 1; i <= workBook.Sheets.Count; i++ ) { // シート名をリストボックスにセット listBoxSheet.Items.Add(workBook.Sheets(i).Name); // アクティブシートの場合 if (workBook.ActiveSheet.Name == workBook.Sheets(i).Name) { // 選択して listBoxSheet.SelectedIndex = i-1; // 先頭へスクロール workBook.ActiveSheet.Range("A1").Select(); } } // リストボックスを使用可能に listBoxSheet.Enabled = true; } } // ********************* // 閉じる // ********************* private void 閉じる_Click(object sender, EventArgs e) { closeExcel(1); } // ********************* // 保存して閉じる // ********************* private void 保存して閉じる_Click(object sender, EventArgs e) { closeExcel(2); } // ********************* // Excel を閉じる // ********************* private void closeExcel(int type) { if (workBook != null) { if (type == 1) { // 保存した事にする workBook.Saved = true; } if (type == 2) { // 保存 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.xlNormal; } } }
Helpre クラス
using System.Windows.Forms; namespace ExcelBasic { 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 に読み込む
2019年08月12日
C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
Form を非表示にするには、Application.Run() にフォームのインスタンスを渡さずに実行します
using System; using System.Windows.Forms; namespace HideFormApp { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 form = new Form1(); Application.Run(); } } }
終了できるように、アイコンを用意してメニューを登録します
using System; using System.ComponentModel; using System.Drawing; using System.Reflection; using System.Windows.Forms; namespace HideFormApp { public partial class Form1 : Form { private ContextMenu contextMenu; private MenuItem menuItem; private NotifyIcon notifyIcon; public Form1() { InitializeComponent(); initClass(); } private void initClass() { contextMenu = new ContextMenu(); menuItem = new MenuItem(); contextMenu.MenuItems.Add(menuItem); menuItem.Text = "終了"; // 終了処理 menuItem.Click += (Object sender, EventArgs e) => { notifyIcon.Visible = false; notifyIcon.Dispose(); // プログラム終了 Application.Exit(); }; // NotifyIcon : 通知領域にアイコンを作成するコンポーネント notifyIcon = new NotifyIcon(new Container()); notifyIcon.Icon = new Icon(@"Resources\Icon1.ico"); notifyIcon.Text = "lightbox"; notifyIcon.Visible = true; // メニューをセット notifyIcon.ContextMenu = contextMenu; } } }
Resources\Icon1.ico は、実行ファイルのある場所にコピーしたものです
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。 Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。 また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。 ※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです 対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。 ※ エキスパートモードで表示しています アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります<% if:page_name eq 'archive' -%> アーカイブページでのみ表示される内容 <% /if %> <% if:page_name eq 'category' -%> カテゴリページでのみ表示される内容 <% /if %> <% if:page_name eq 'tag' -%> タグページでのみ表示される内容 <% /if %>この記述は、以下の場所で使用します
|