Windows で touch(@ITの記事を見て)

@ITWindows OSで長さ0バイトのファイルを作成する(touchコマンドを実現する)
という記事が載っていた

http://www.atmarkit.co.jp/ait/articles/1809/07/news032.html

0バイトのファイルを作成するだけでなく、ファイルロックおよびタイムアウト判定可能な
排他処理をやってみる。

C#/VB.NETで System.IO.FileStream を使用する。(PowerShellでも可)
まずはファイルを作成または開く。
New FileStream("C:\hoge\lockfile", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read)
これで SetLength(0) を呼び出すと、ロックしたままタイムスタンプを更新できる。
処理進行中ですよとアピールできる。

排他制御でプロセスのkillまで考慮するならファイルにプロセスIDでも書き込んでおくと良い。
(※要 Flush)
この状態でロックしたままタイムスタンプを更新するには、SetLength に現在のファイルサイズを
指定する。

OleDb Access mdb/accdb 名前付きパラメータ

いまさら Access mdb/accdb OleDb 接続で名前付きパラメータクエリ

OleDb では名前付きパラメータが使用できない。
SQL文に ? でパラメータを記述して、その順番どおりに
OleDbParameter を追加していく必要がある。

同じパラメータ値を同一SQL内で2回使用する場合でも、
2つ分のパラメータを作成することになる。面倒ぃ・・・ だがしかし

Accessでは、SQL文の前に名前付きパラメータを指定できる。
new OleDbCommand( "Parameters hoge Text, fuga Integer, piyo Date;
Select * from ... where [tbl1].[column1] = hoge ..."
)

new OleDbParameter("hoge", OleDbType.VarWChar, 20)
new OleDbParameter("fuga", OleDbType.Integer)
new OleDbParameter("piyo", OleDbType.Date)

パラメータコレクションから Parameters ~ を自動生成するとよいかも。

@ をパラメータ名の先頭に付けると可読性up(オブジェクト名に使用可能な文字でござる)
Parameters @hoge Text, @fuga Integer, @piyo Date;
select * from ... where [tbl1].[column1] = @hoge ...

new OleDbParameter("@hoge", OleDbType.VarWChar, 20)

なお、長いテキスト(メモ型)は Parameters 型指定 Memo で、OleDbType.BSTR でないと
本当に長いテキスト(256文字超)を正しく処理できない???
LongVarWCharはエラーになる・・・

DataAdapter UpdateCommand/InsertCommand/DeleteCommand でも使用可能 [追記]

個別モーダルダイアログ

.NET Framework Windows Forms (VB/C#)

個別モーダルダイアログ

以下のようなマルチウィンドウな画面構成の Windows Forms Application があるとする。
 MainForm(あるいは ApplicationContext 制御)
 ├─ Form1
 ├─ Form2
 └─ Form3

Form1, 2, 3 は平行操作可能。(同じクラスのインスタンスでも、異なるフォームでも構わない。)

Form1, 2, 3 いずれから標準のメッセージボックスや独自モーダルダイアログを表示すると、
それを閉じるまでアプリケーションモーダルとして全てのウィンドウの操作が抑止される。
平行操作も出来なくなる。

Form1, 2, 3 (インスタンス) ごとにモーダルダイアログを表示する方法がある。

Form4 をモーダルダイアログ用フォームとして作成、
Form1, 2, 3 から ShowDialog( ) ではなく Show(Me) / Show(this) で表示、
呼び出し元フォームの Enabled を False にする。
これで Form4 がモーダルの動作になるが、呼び出し元以外のインスタンスは阻害しない。
なお、MainForm(ApplicationContext)を終了すると、個別モーダル表示中でも閉じられる。

※Show( ) なので呼び出し元のコードはブロックされず続行される。
 ダイアログ側 FormClosed イベントから呼び出し元の後処理に連携するとか。
 呼び出し元 Enabled を戻すのも忘れずに。

この個別モーダル表示では呼び出し元がグレーになってしまうが、
フォーム全面・最前面にピクチャーボックスでグレーアウト前のフォーム画像を張り付ける
手法で対応可能。

Excelとかの曲線

html(SVG)でExcelのオートシェイプ曲線をマネしようとした過去のデータをサルベージしとく

↓クリックで頂点を追加、ダブルクリックで終了。↓


IE, Edge, Chrome, FireFox で動くはず)

この任意の点を通過する曲線は「Catmull-Rom曲線」というもので、調べたところ
ベジエ曲線で変換表現が可能と分かった。つまりhtml(SVG)でドロー出来る。
色々調べて最終的に参考にしたのはこちらです。
defghi1977-onblog.blogspot.com

まぁ他でも同じ変換式なんだけど、1点不満があってそれは
開始点と終了点の制御ベクトル算出式が直感的でない結果となること。

カタカナの「コ」の字をイメージして4点:左上、右上、右下、左下の順で打って見ると、
最初と最後の辺がグネグネするんですよ。
Excelで同じことをやると自然な感じなのです。

過去に作った上記サンプルは、とりあえず頂点 1..N があるとして、
始点の前の仮想頂点(0)を 1..3 の座標から適当に作ってやって始点の制御ベクトル算出に利用。
終点の後に仮想頂点(N+1)を (N-3)..(N-1) (N-2)..N から同様に作って終点の制御ベクトル算出に利用。
これでExcelのやつに近くはなったけど、完全には一致しない。[追記修正]

最近になって改めて Google SpreadSheet や Libre Office のやつも見てみたんですが、
Google SpreadSheet は微妙に違う。
Libre Office はそもそも線の引き方が異なってうまく再現できず。
Excelの始点・終点はどうやってるのかねぇ?

.xlsx (zip) の中身 drawing?.xml も見てみたけど分からんかった・・・


上記のソースは昔ちょーてきとーにつくった汚物をそのままコピペ
ここ数年html/jsやっとらんし最新のjsの書き方見てびっくり

学習メモ:html table セルの結合

tableセルの結合(学習メモ)

IE, Edge, Chrome, FireFox で動確。(スマフォ系は未確認)

A1 B1 C1
A2 B2 C2
A3 B3 C3



html
<table id="table1" border="">
    <tr>
        <td colspan="2">A1</td>
        <td class="dep">B1</td>
        <td            >C1</td>
    </tr>
    <tr>
        <td rowspan="2">A2</td>
        <td            >B2</td>
        <td            >C2</td>
    </tr>
    <tr>
        <td class="dep">A3</td>
        <td            >B3</td>
        <td            >C3</td>
    </tr>
</table>
css
.dep {display: none;}

動的変更も可能。

javascript
function merge() {
    var tbl = document.getElementById("table1");
    tbl.rows[0].cells[2].rowSpan = "2";
    tbl.rows[1].cells[2].className = "dep";
    tbl.rows[2].cells[1].colSpan = "2";
    tbl.rows[2].cells[2].className = "dep";
}
function unmerge() {
    var tbl = document.getElementById("table1");
    tbl.rows[0].cells[2].rowSpan = "1";
    tbl.rows[1].cells[2].className = "";
    tbl.rows[2].cells[1].colSpan = "1";
    tbl.rows[2].cells[2].className = "";
}

行列インデックスが固定で良い。colgroup, col でも問題ない。