布団が俺を呼んでいる

丘山大一のぶろぐ

SQL Server sp_MSforeachdb を使う

こんなんあったんですね。便利。

用例

CREATE TABLE #RESULT_TABLE
(
DBNAME nvarchar(30)
)
EXEC sys.sp_MSforeachdb 'USE ?;INSERT INTO #RESULT_TABLE SELECT DB_NAME() '
SELECT * FROM #RESULT_TABLE;
DROP TABLE #RESULT_TABLE

インスタンス内のテーブル一覧が単一のデータセットで拾えるぜひゃっほい。

こんなやり方してました

まあこれはこれで利用できることあるんですが。


SQL Server 2016の教科書 開発編

新品価格
¥3,888から
(2016/9/26 21:15時点)

SQL Server の 容量を取得する

SQL Server の容量・サイズとは何を指すのか。
よくわからない。
よって、ここに書いてあることもわりと適当。
大体あっているといいなあ。

GUI で見るとき

Management Studio で データベース上で右クリック、
コンテキストメニュー「プロパティ」-「全般」から見るとき。
・サイズ: MDF + LDF ファイルの大きさ。
・使用可能領域:サイズ - (MDF ファイル内で既に使用されている領域 + LDF ファイル内で既に使用されている領域)

コンテキストメニュー「プロパティ」-「ファイル」から見るとき。
・初期サイズ(MB):現在のファイルの大きさ。ファイル単位。上記のサイズ = 初期サイズ(MB)の合計

SQLで確認するとき

SELECT file_id, name, type_desc, physical_name, size FROM sys.database_files ;  
・コンテキストメニュー「プロパティ」-「ファイル」から見るとき。 に相当。

SELECT sum(size) from dbo.sysfiles
もしくは
SELECT CONVERT(numeric(18,2), sum(size)*8192/1048576) from dbo.sysfiles
・コンテキストメニュー「プロパティ」-「全般」から見るとき。 サイズ。 に相当。
・このクエリの「size」 は8KBページ単位なので、おおざっぱに計算してやった方が見やすい。

select CONVERT(numeric(18,2),FILEPROPERTY(file_name(fileid),'SpaceUsed')*8192.0/power(1024.0,2)) from dbo.sysfiles where fileid = 1
・データベースのMDF のうち、使用済の領域。
・除算かませているので若干結果が怪しくなる。

EXEC sp_spaceused
・これまで上記で書いてきた情報をまとめてとれる感じ。(ファイルごとのサイズはとれないけど……)
・使用済の領域についてはコッチの方が正確な気がする。(根拠なし)
・結果セットができるストアド ということもあり、軽く見る分には便利だが他の処理には組み込みにくい。


ところで

「SQL」という単語と「クエリ」という単語がごっちゃになっています。
ゴフ(吐血
分かっているけど使い分けられない。




SQL Server 2016の教科書 開発編

新品価格
¥3,888から
(2016/9/26 21:15時点)

NuAns NEO Anniversary Update配信

あれ? 終わってる……

バージョン
本日時点の各バージョンは、
  • バージョン:1607
  • OSビルド:10.0.14393.189
  • ファームウェアリビジョン番号:1028.020.001.92
  • ハードウェアリビジョン番号:1.0
  • 無線ハードウェアバージョン:1.0
  • チップSOCバージョン:8952

なんか更新されてるし

こっちを見るべきか。


なんか
ストアが若干変わったなー とか
カメラってこんな機能あったんだー知らなかったなー とか
岳南鉄道に乗っている時に思いましたが、事実変わっていたなんて……

岳南鉄道 に 乗った

工場夜景で有名(らしい)岳南鉄道にのってきました。
通称「岳ちゃん」

夜景の見方

鉄道夜景電車が月に1回程度運行されています。2両編成。
1両目は通常通りですが、2両目は電気を非常灯にし、暗い車内から夜景を見られます。
ちなみに、解説のガイドつきでした。(専門の方がいらっしゃるようで)
運賃は一日フリー券を700円で購入。昔懐かしい硬い紙キップで、富士山の写真入り。

写真は撮るには撮ったのですが、走行中はフラッシュが使えないためピンぼけしまくりでした。
ので、どんなところ?
という方は、
「岳南鉄道 夜景」
あたりで検索してください。画像検索すると結構キレイな写真が拝めます。

なお、始発駅である岳南鉄道「吉原駅」はJRの駅のさらに奥にあり、ぶっちゃけ見つけづらいですw
もし行く人はちょっと余裕をもって行くことをお勧めします。

昔は

工場夜景のよさなんて全然理解されませんでしたが、いい時代になったもんだ……。


鉄道コレクション 岳南電車ED40形(ED402)

新品価格
¥1,700から
(2016/9/25 20:38時点)

Delphi プロジェクトファイルのコードの中で無名メソッドを使うとメモリリークが発生する

なんか Delphi 話多いなー。
無名メソッド、anonymous methods とか言われるヤツです。
正直、可読性が落ちると思っているのですが、サクッと書くときに便利なのでちょいちょい使います。

現象

下記のようなコードを書くと、メモリリークが発生します。
program Project1;
uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
  b :Boolean;
begin
  ReportMemoryLeaksOnShutdown := True; // メモリリークを検出
  b :=
    (function : Boolean
    begin
      Result := True;
    end
  )();
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

対応

無名メソッドを使わないようにするしか思いつきませんでした……
program Project1;
uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function hoge : Boolean;
begin
  Result := True;
end;
var
  b :Boolean;
begin
  ReportMemoryLeaksOnShutdown := True; //メモリリークを検出
  b := hoge;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

原因予想

全然分かりません。
・Delphiの無名メソッドはインターフェースでどうたかこうだか、
・インターフェースは参照カウントがどうたかこうだか、
・でもってインターフェースの破棄のタイミングはEnd 節の実行時でどうたかこうだか、
・でもプロジェクトファイルにあるのは「end.」(ピリオド)であって「end;」(セミコロン)じゃないなー
とか妄想してみた。

似たような事例はStackoverflow で見かけるので、きちんと探せば原因が分かると思うのですが。
探すのめんどい(ぇ)

若干ですが仕様という名のバグじゃないか疑惑もあったりなかったり。

え、無名メソッドを使うなって?

だって楽なんだもん。
特にメソッド名を考えなくて済むあたりが楽。
……命名苦手なんよ……


blogengine net で Runtime Error

かなり焦った。

経緯

拡張機能入れたらエラー。
その後、アクセスしたらRuntime Error が表示されるように。

対応

Azure ポータルサイト上での修正方法がぱっと思いつかなかったので、Web Matrix をインストール。
サイトをDLして、Extensions フォルダに入っている「拡張機能.cs」を削除。
サイトを発行。
これで直った。

正しい対応

拡張機能を入れる前に、バックアップをとりましょう。
サボったからいけなかったのです、(ノД`)・゜・。
blogengine net の勉強をさぼっていたので、他にどのようなファイルに影響があったのか、またこれが正しい対応だったのか不明。




BUFFALO USB3.0 外付けハードディスク PC/家電対応 2TB HD-LC2.0U3/N [フラストレーションフリーパッケージ(FFP)]

新品価格
¥8,480から
(2016/9/19 23:03時点)

RadStudio では、generics<generics> ができない?

このごろDelphi と Firebird の記事ばかりなような。
で、今回は Delphi というか Rad Studio というかのお話。

Generics の中に Generics はダメ?

なんか変だな、とは思っていたんですがようやく原因が分かりました。
こんな感じのfunctionを宣言をすると、「Ctrl + Shift+ C」でエラーが出て、スケルトン生成できなくなります。
function hoge : TList<TList<string>>;
スケルトン生成できないだけで、手でゴリゴリ書けばちゃんとコンパイルは通ります。

もちろんというかなんというか、下記はOK.
function hoge : TList<TStringList>;

まあ、 TList<string> だったら TStringList で置き換えちゃえば大体いけるのでいいですけど、他の場合はどうすれば……。
IDE側のバグだとしか思えないんですが……
検証しているXE5がダメなだけで、新しいヤツだと直ってるのかな?

結論

VS + C# を使えば全部解決。





OBJECT PASCAL HANDBOOK―マルチデバイス開発ツールDelphiのためのプログラミング言語完全ガイド

新品価格
¥6,480から
(2016/9/6 08:13時点)

Windows Phone (Windows Mobile) デバイス'USB Composite Device'を停止できません。 への対応

USB接続しているものを外す際、ハードウェアを安全に抜こうとするとこのワーニングが出ることがあります。

対応

タスクマネージャーか何かで、動作中のサービス一覧を表示し、「IpOverUsbSvc」を停止させれば突破できることがあります。
たしかこのサービスはUSB実機デバッグで必要になるサービスだったと記憶しているので、必要ならもう一度起動させましょう。


リッツ・カールトンが大切にする サービスを超える瞬間

新品価格
¥1,620から
(2016/9/3 16:06時点)

Delphi BOM無しでテキスト保存

ISQL.exe に食わせるスクリプトを、なぜかDelphi経由で吐き出す必要が出てきました。
で、そのためにはBOMを外してテキスト保存する必要がありました。

やり方はこんな感じ

  sl := TStringList.Create;
~sl に文字列を突っ込む
  sl.WriteBOM := False;
  sl.SaveToFile(ファイル保存先, TEncoding.UTF8);

要はsl.WriteBOM := False; が必要、ということですね。

……このやり方を全然知らなかったんで、バイト操作の方法を調べようとしていたのは内緒です……


OBJECT PASCAL HANDBOOK―マルチデバイス開発ツールDelphiのためのプログラミング言語完全ガイド

新品価格
¥6,480から
(2016/9/6 08:13時点)

Firebird Embededのお勉強 ISQLの使い方 スクリプトファイルのSQLを実行できない

解決? まで3時間ほどかかりました。

結論!

ISQL.exe で「-i」オプションをつけて読み込ませるファイルには、BOM (Byte Order Mark) をつけてはいけないらしい。

細かい話

isql.exe - i hogehogeScript.fmq -user SYSDBA -password masterkey -charset UNICODE_FSS 'HOGE.FTB';
とやったら、何回やっても最初のクエリの実行で失敗する。
接続する文字セットを変えたらうまくいくかな? と思いましたが、それでも失敗。
「最初だけ失敗する……?」
「最初にだけあるもの/ないもの ってなんだ……?」
「BOMだ!」
「とりあえずBOM外せ!」
「なんか知らんが動いたぞちくしょー」

根拠

やってみてダメだった、BOM外したらうまくいった……というだけです。
根拠となるドキュメントを発見できていません。

・私の検索能力が低い説。
・そもそもISQL の使い方間違ってんだよ説。
・BOM がダメなんて常識だろ説。
・Windows でスクリプト系ファイルを書く情弱なんて、我々Firebird 業界にはいらんのだよ説。
・はぁ? 何言ってんの? お前の環境おかしいよ説
etc. 

諸説ありますが、とりあえず誰か正解を教えてください。

思うに

BOMがダメだとしたら、MS信者、WIndows 万歳な人間には辛い仕様だぜよ。


Firebird 徹底入門

新品価格
¥4,104から
(2016/8/31 20:45時点)