OpenXML SDK

https://www.atmarkit.co.jp/ait/articles/1810/17/news022.html
Microsoft純正の Open XML フォーマットのファイルを操作するためのライブラリ。
OpenXMLは、拡張子が.docx/.xlsx/.pptxなどのOffice2007以降で利用されているOfficeファイルである。
ExcelのCOMコンポーネントが存在しない環境でExcelファイルを生成したい場合に使える。
ただしコードの書き方は煩雑とのこと。

主キーが存在しないテーブルに、DataAdapterでデータを更新する方法

https://docs.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqldataadapter.insertcommand?redirectedfrom=MSDN&view=dotnet-plat-ext-3.1#System_Data_SqlClient_SqlDataAdapter_InsertCommand
CommandBuilderは、主キーが存在しないテーブルのupdateコマンドを生成できないため、主キーが存在しないテーブルをDataAdapter+CommandBuilderで更新しようとすると「InvalidOperationException: DataAdapterのUpdateで UpdateCommand の動的 SQL 生成は、キーである列情報を返さないSelectCommand に対してサポートされていません。」
というシステムエラーが発生する。
対策は自前で生成したCommandオブジェクトをdataAdapter.UpdateCommandにセットすること。
……見つけられていないが、なんか一意の列を指定するだけでupdateコマンドを生成できるようなもっと上手い方法がありそうな気がする。
ちなみにInsert文は主キーが存在しないテーブルでも生成できるようだ。
あと、そもそも主キーが無いテーブルを作るなという話ではある。

' objAdpt のデータアダプタでno_key_tableテーブルの内容を、objTblにデータをFillした状態。

Dim objCmdBld As New NpgsqlCommandBuilder(objAdpt)
objAdpt.InsertCommand = objCmdBld.GetInsertCommand()
objAdpt.UpdateCommand = Me.CreateUpdateCommand(objAdpt.InsertCommand.Connection)

Call objAdpt.Update(objTbl)

Private Function CreateUpdateCommand(objConnection As NpgsqlConnection) As NpgsqlCommand
    Dim strSql = ""
    strSql &= "UPDATE no_key_table"
    strSql &= "   SET col1 = :paraCol1"
    strSql &= "     , col2 = :paraCol2"
    strSql &= " WHERE key1 = :paraKey1" ' 主キーとしては設定されていないが、key1,key2で一意になる想定
    strSql &= "   AND key2 = :paraKey2"

    Dim objCmd = New NpgsqlCommand(strSql, objConnection)

    objCmd.Parameters.Add(New NpgsqlParameter() With {.ParameterName = "paraCol1", .SourceColumn = "col1"})
    objCmd.Parameters.Add(New NpgsqlParameter() With {.ParameterName = "paraCol2", .SourceColumn = "col2"})
    objCmd.Parameters.Add(New NpgsqlParameter() With {.ParameterName = "paraKey1", .SourceColumn = "key1"})
    objCmd.Parameters.Add(New NpgsqlParameter() With {.ParameterName = "paraKey2", .SourceColumn = "key2"})

    Return objCmd

End Function

Web SQL Database

http://www.tohoho-web.com/html5/web_sql_db.html
かつて存在したブラウザのローカルにデータを保持するための仕組み。
ざっくり言ってjavascriptからSQLiteのコマンドが叩けるようなものだったようだが、特定のソフトウェア(SQLite)の実装に基づくのは中立性に欠けるということで、2010年廃止仕様にされた。
2020年現在は Indexed Database がその役割を継いでいる。

HTMLのINPUTタグで、明示的にスマホのカメラを起動させる方法

http://www.asahi-net.or.jp/~ax2s-kmtn/internet/media/REC-html-media-capture-20180201.html#the-capture-attribute
accept属性とcapture属性を利用する。

ユーザ向きカメラを用いて、写真を撮影する場合 周囲向きビデオカメラを用いて、動画を撮影する場合 マイクを用いて、音声を録音する場合

ダークソウル3

クリア。
基本的にモンスターハンターに似ているゲーム性でアクションゲームに見えるターンバトルだが、敵の行動パターンに殺意が溢れている。君がッ!死ぬまでッ!殴り続けるッ!!みたいな行動パターンをしてくるやつらが多い。
しかし雑魚敵やボスが高難易度でボスに何十回も挑むことも珍しくないというのはゲーム的な特徴として成立しており、それが面白さにつながっているのがこの作品。
油断すると雑魚にも殺されうる緊張感に溢れた探索、最初はとても勝てそうに見えないが何度も挑むことで勝ちへの道が見えてくるボス、装備やステータスの選択で多彩な戦い方が可能なシステム、様々な面で高難易度にふさわしい達成感を得られる作品になっている。ダークな雰囲気に統一しながらも様々なエリア特色を出したグラフィック面も水準以上だ。
だが高難易度ではなく理不尽難易度になってしまっている点も多々ある。
ボスを倒したら行き止まりで、これまで通ってきたエリアのどこかに別のエリアへの分かれ道があるパターンは、地図が無いのにエリア構成が立体的で手書きマッピング困難ということもあってプレイヤーに無茶振りをしすぎている気がする。
(地図がない事自体はプレイヤー自身がエリアを把握していくという体験をもたらすのでありだと思うが、それにより発生する問題を回避しきれていない)
また説明が無いのに突如「溜め攻撃」という概念が必要なボス(巨人ヨーム)が出てくるところとか、エストのかけらや不死の遺灰を使って回復を強化できることは超重要なのに説明がない点など、「効率良い戦い方」のようなプレイヤーが自身で発見すべき要素だとは思えない部分の説明が不足している。
またボスの高難易度自体は問題ないと思うが、リトライ後にボスのもとまで何十秒かかけて走っていく必要があるのは無駄なストレスになっている。ボスの一歩前の地点からリトライ出来ていいと思うのだが、どういう思想のもとで敗北後に毎回数十秒の「罰」をプレイヤーに与えようとしているのか分からない。
確かに「ソウルライク」という高難易度ゲームジャンルを切り開いた元祖シリーズだけあって素晴らしい作品だが、それにあぐらをかいて高難易度である事とは関係ない困難をプレイヤーに課してしまっている問題点もある作品だと思った。



順番が逆だが、2Dダークソウルこと「Salt and Sanctuary」がどれだけダークソウルに似ていたのか分かった。
あとこれはゲーム性と関係ないが最初の方は、どうしてもモンハンのクセが抜けずに「ボタンを押し間違えて死ぬ」という事故が起きてしまっていた。次にモンハンやるときはLボタンでガードしようとしてしまう事故が起きる気がする……。

バッチファイルの遅延環境変数

https://qiita.com/plcherrim/items/c7c477cacf8c97792e17
バッチファイルで、環境変数で置き換えた内容をコードとして実行する方法。
javascriptのeval()のようなイメージ。
PHPで言う可変変数 $$hoge のような、変数名で指定した変数を参照することができたりする。
「setlocal enabledelayedexpansion」の指定が必要。

@echo off
@setlocal enabledelayedexpansion

SET str1=文字列1
SET str2=文字列2
SET str3=文字列3
SET str4=文字列4

for /l %%a in (1, 1, 4) do (
    echo !str%%a!
)
pause

PostGISでクリックした座標の近くのアイテムを取得する方法

クリックした座標を中心に円ポリゴンを作成し、その円と交差している座標のアイテムを取得すればよい。

'クリックした座標を中心とした円
Dim strClickRectPolygon As String = String.Format("ST_SetSrid(Geometry(ST_Buffer(Geography(ST_MakePoint({0}, {1})), {2})), 4326)",
                                            decLon, decLat, decRange)
'クリックした座標
Dim strClickPoint As String = String.Format("ST_GeomFromText('POINT({0} {1})', 4326)",
                                            decLon, decLat)

Dim objSql As New StringBuilder()
objSql.Append("SELECT point_table.item_info")
objSql.Append("  FROM point_table")
objSql.Append(" WHERE ST_Intersects(point_table.geom, " & strClickRectPolygon & ")")      'クリックした座標を中心とした円と交差する線を抽出
objSql.Append(" ORDER BY ST_Distance(point_table.geom, " & strClickPoint & ", false)")    'クリックした座標に近い順に取得

クリックした座標を中心に円ポリゴンを作成する方法は以下を参考にした。

メートル指定の半径で円を作る方法
http://tnaka78.blogspot.com/2014/03/postgis.html
(例)北緯40度、東経140度から半径100kmの円を作る
select st_setsrid(geometry(st_buffer(geography(st_makepoint(140, 40)), 100000)), 4326)