はじめに

普通に考えると、DB をバックアップ・レストアすれば OK に思えますが、
SQL Server のバックアップは、データファイルの場所を含めて復元しようと
してしまう為、この用途では都合がよくありません。

普通に考えると

エクスポートすれば出来そうですが、テキストファイルにエクスポートする際は
1 テーブルずつしかデータを出力できません。これは面倒です

ご注意

この方法はデータが大量の場合、適さない可能性が高いです。
#割と遅い、重い処理に思えます

手順

SQL Server Management Studio から、データベースを右クリックして

スクリプトの生成を選択します。

対象を聞かれるので、「特定のデータベース オブジェクトの選択」を選んで

必要なテーブルだけチェックを入れて、「次へ」

ここが重要です

  • ファイルに保存 の右に、詳細設定ボタンがあります。

これを押すと、色々と項目がでてくるのですが、その中に、

「スクリプトを作成するデータの種類」という項目があり、初期値はスキーマのみ

となっています。これを、「スキーマとデータ」に変更します。

あとは、次へを押してスクリプトを出力させれば OK です。

CREATE TABLE 文と、INSERT 文がずらずらと SQL ファイルに書かれます。

これを、取り込みたい DB 上で実行すれば OK です。

SQL ファイルはタダのテキストなので、要らない部分は消してしまえば良いし、

その他いろいろと取り扱いが楽なのでオススメです。

環境など

SQL Server 2012 Express localdb

SQL Server Management Studio 2012

環境

Windows Server 2012 R2

何をしたかったか

subversion でチェックアウトしてきたディレクトリをデプロイ用ディレクトリにコピーしたかった。

コマンドライン

1
robocopy c:from c:to /MIR /XX /NP /NDL /NFL /nc /ns
1
robocopy c:from c:to /MIR /NP /NDL /NFL /nc /ns

/XX を指定すると何が起きるか

宛先フォルダにしかないファイルが無視されるため、 /MIR を指定すると暗黙で指定される /PURGE が機能しなくなる。

きっかけ

  • 最近、外が騒がしいので片耳だけイヤホンをしていた
  • だがしかし、ケーブルが邪魔でつらい
  • AirPods 的なやつを使えば便利なんじゃないか

tl;dr;

細かい話

  • Bluetooth 4.0 くらいのアダプタを USB に接続する
  • あとは普通にペアリングするだけ。
  • 当初、Bluetooth 2.x くらいの古いアダプタを使ったらペアリングできなかった。
  • 正直、Linux 上でまともに動くと思ってなかったので予想外。よかった。
  • キーボードの設定から、音量 UP/DOWN にショートカットキーを振るといい。
  • うちでは、 Super + F11 でダウン Super+F12 でアップを設定した。

はじめに

Mastodon からストリームで取得する際の API に関するメモ。

基本形

1
wss://example.com/api/v1/streaming?access_token=xxxxxxxx?stream=TYPE

access_token は事前に取得する必要がある。

TYPE 一覧

なぜかドキュメントに載っていないものがあるが、以下の通り。

| TYPE | 内容 |
| public | 連合タイムライン |
| public:local | ローカルタイムライン |
| user | ホーム |
| hashtag | ハッシュタグ(連合)? |
| hashtag:local | ハッシュタグ(ローカル)? |

ソース

https://github.com/tootsuite/mastodon/blob/master/streaming/index.js#L376

はじめに

Spring-Data MongoDB を使っていてハマったことをメモしていく。

ハマるたびに随時更新する。

addOperator 使おうとしたら手前に Where がないと書けない?

andOperator は、SQL で言う所の And で複数条件の And を取る。

1
2
3
4
5
6
7
8
Query q = new Query();
q.addCriteria(Criteria.where("column1").is("abc")
.andOperator(Criteria.where("column2").ne("abc")
, Criteria.where("column2").ne("xyz")));

// 手前にwhereがあれば普通に書けるが、q.addCriteria(andOperator())とは書けない
// その場合は、以下のように書く。
q.addCriteria(new Criteria().andOperator(略));

前提

zabbix に数値型のデータを投入したとき、 1000 を超えると、1K と表示されるようになる。(M G も同様)

大抵の場合、これはわかりやすいという意味で良い処理だと思う。

しかし、気圧データを投入した際に、 1021 hPa が 1.02KhPa と表示されてしまうのは違和感がある。

なおしかた (Zabbix 4.0 以降)

公式ドキュメントの(下記 URL)の末尾に書かれている通りですが、

https://www.zabbix.com/documentation/current/manual/config/items/item

ホスト → アイテムの設定内の単位を設定する部分で、単位の先頭に ! をつけるだけです。

例えば、単位を !hPa と指定すると、乗数の処理を行わなくなります。(もちろん、先頭の ! が表示されることはありません)

なおしかた (Zabbix 4.0 以前)

ソースコードを書き換えるしかありません。具体的には、以下の行です。

https://github.com/zabbix/zabbix/blob/3.2.4/frontends/php/include/func.inc.php#L618

include/func.inc.php

$blackList = ['%', 'ms', 'rpm', 'RPM']; に除外したい単位を追加します。

例えば $blackList = ['%', 'ms', 'rpm', 'RPM', 'hPa']; のように追加します。

蛇足

なお、単位に ! を付けると丸められないのはダッシュボード内のグラフにも有効です。

蛇足 2

4.0 未満ではソースコード中に、丸めない単位がハードコートされているのでそこを直すしかないようです。

環境

Visual Studio 2015 (VB)

EntityFramework 6.1.2

SQL Server 2012 Express LocalDB

はじめに

Entity Framework を使ったモデルファーストの開発をすると、

ER 図を書くだけで

  • 自動的にエンティティクラスを定義してくれる
  • 自動的にテーブル生成 SQL 文を作ってくれる

など、便利です。

しかし、日付型に関しては罠があります。

エンティティクラスでは、日付型の列は DateTime 型 にマップされます。(コード上は Date 型ですが、Date 型 = DateTime 型 です)

SQL Server のテーブルでは、日付型の列は datetime 型 として生成されます。

一見、何の問題もなさそうです。型の名前も同じだし。

ここに罠があります。

.Net の DateTime 型と同等以上の精度を持つ SQL Server の型は datetime2 なのです。

DateTime 型の精度 2016/03/24 12:34:56.1234567

datetime 型の精度 2016/03/24 12:34:56.123

なので、DB に値を保存するとき、後ろの 4567 は丸められてしまいます。

何が問題?

EntityFramework を使って、日付型のデータを入れて、その値で検索をかけると

ヒットしません。擬似コードで示すと以下のようなかんじです。

1
2
3
4
5
6
7
8
9
dim dt = Now
dim entity = DbContext.TestTable.create()
entity.dateTimeColumn = dt
DbContext.save() ' これでINSERT文が発行されるが、日付は丸められる

dim entity2 = (From e In DbContext.TestTable
Where e.dateTimeColumn = dt).SingleOrDefault

' entity2は取得できていない

entity2 を取得する為の LINQ to SQL が Where 句 のパラメタを設定するとき、

datetime2 でパラメタをセットするので、値が異なるとしてヒットしません。

対策

秒以下を 0 にしてしまえば、問題無く処理されます。

1
2
3
4
Dim dtStr = Now.ToString("yyyy/MM/dd HH:mm:ss")
dim dt = Date.Parse(dt)

' dt.Milliseconds = 0 とはできない。残念ながらReadOnly

所感

思ったのは、Visual Studio のモデルデザイナ側で datetime2 型でテーブルを

生成する SQL を出力できれば良いのですが、モデルデザイナ上で選べる型は datetime

しか存在しません。

LINQ to SQL(の SQL Server 向け実装)は DateTime 型を datetime2 として扱うので、

ちょっとミスマッチが起きてしまっています。今回は SQL Server の話なのですが、

Oracle 等でも同様の罠が発生する可能性がありますのでご注意を。という話でした。

この記事、多分内容が古いと思います。

はじめて使ったのでやった設定をメモする

無料枠があったので、使ってみることにした。

とりあえず起動したのは、階層:Standard の A1 インスタンス(8000/月)

リモートデスクトップ接続まで

とりあえず、Virtual Machine を作成して起動させる。

起動後に Web の管理画面に表示されている IP アドレスにリモートデスクトップ接続する。

リモートデスクトップ接続はインターネット側から見ると NAT されているため、ポート番号を Web の管理画面のエンドポイント欄から確認する必要がある。

リモートデスクトップ接続したが英語表示なので日本語にする

コントロールパネル →Languages→Add で日本語を追加。

追加された「日本語」の右側にある Options を押して、Windows Display Language の下の “Checking…” が “Download and Install language pack” に変わるまで待つ。

変わったら、それをクリックすると自動的にランゲージパックをダウンロード&インストールしてくれるので、じっくりと待つ。(結構長いどころかかなり長い)

完了後、先ほど Download and Install.. となっていたところが、Make primary language  的な

表示に変わっているので、それをクリックして、サインアウト(するか聞かれる)すると次から日本語 UI になる。

その他

・C:ドライブと D:ドライブがあるが、D:ドライブのルートにある README の通り、D ドライブの内容は保持されない。(普通に再起動であれば保持されていたけれども)

・A1 インスタンス等だとディスク IO がだいぶ制限されているのでセットアップに割と時間がかかる。

前提

  • Linux Mint 20
  • UEFI ブート
  • 変更前ルートファイルシステムは xfs、変更後は ext4
  • /dev/sda1 = EFI システムパーティション /dev/sda2 = swap /dev/sda3 = “/“ /dev/sda4 = new “/home”

why?

  • “/“ と “/home” のパーティションを分けたかった
  • 単純に gparted でリサイズしようとしたら、xfs はリサイズ非対応だった

手順

boot

  • gparted live iso を USB メモリに書き込んでそこからブートした。
  • gparted live iso は、Legacy ブート(BIOS ブート)でしか起動できないので注意(UEFI ブート Only に設定してると起動できない)

ファイル退避

/dev/sdb1 をバックアップ先として使う。せっかく gparted で起動しているので、GUI から ext4 でフォーマットしておく。

1
2
3
4
5
6
$ sudo su -
# mkdir /mnt/ssd1
# mkdir /mnt/ssd2
# mount /dev/sda3 /mnt/ssd1 元のシステムのSSD
# mount /dev/sdb1 /mnt/ssd2 一時退避先のSSD(ext4でフォーマット済み)
# rsync -aAXv --numeric-ids /mnt/ssd1/ /mnt/ssd2/ ディレクトリ名は末尾 / まで入れるのが重要

パーティション作り直し

パーティションを作り直す前に umount /mnt/ssd1 でアンマウントしておく。

パーティション操作自体は、gparted の GUI があるので省略。

/dev/sda3 (xfs) を削除して、 /dev/sda3 (ext4, LABEL=root) /dev/sda4 (ext4, LABEL=home) を作成した。

ここで LABEL を指定しているのは、後々 fstab の修正で楽をするため

ファイル書き戻し

1
2
3
4
5
6
7
8
$ sudo su -
# mkdir /mnt/root
# mkdir /mnt/home
# mount /dev/sda3 /mnt/root "/" にするパーティション
# mount /dev/sda4 /mnt/home "/home"にするパーティション
# rsync -aAXv --numeric-ids --exclude=home/ --exclude=opt/vmpool /mnt/ssd2/ /mnt/root/ ※1
# rsync -aAXv --numeric-ids /mnt/ssd2/home/ /mnt/home/
# rsync -aAXv --numeric-ids /mnt/ssd2/opt/vmpool/ /mnt/home/vmpool ※2

※1 home は別のパーティションにコピーするので exclude 指定している。 exclude は相対パスで指定しないと効かない。 -v が指定されているので、進捗表示をみて、そこに表示されているパスで指定すれば OK。ここでも FROM と TO のパスは末尾 “/“まで指定するのが重要

※2 KVM のディスクイメージが入っている。容量が大きいので/home 側に移動

/etc/fstab 修正

root ファイルシステムの UUID が変わってしまうのと、/home を分割したので、起動する SSD の/etc/fstab を修正する。

vim /mnt/root/etc/fstab

1
2
LABEL=root      /               ext4    defaults        0       0
LABEL=home /home ext4 defaults 0 0

再起動

ここで、バックアップ用 SSD を外して再起動する。

grub

“/“のディスクの UUID が変わっているため、初回は grub のプロンプトに入ってしまう。

ここで以下のように入力

1
2
3
4
5
6
7
grub> ls
(hd0) (hd0,gpt4) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1)

grub> set root=(hd0,gpt3) "/"にマウントするファイルシステム
grub> linuxefi /boot/vmlinuz-5.8.10-xanmod-1 root=LABEL=root rescue ※3
grub> initrdefi /boot/initrd.img-5.8.10-xanmod1 ※4
grub> boot

※3 rescue をつけてレスキューモードにしておかないと、GUI が立ち上がったりすると面倒なので。

※4 カーネルのバージョンと同じものがついている initrd を選択する。違っていると起動に失敗する。

rescue モードでの起動

これで、rescue モードで起動できる。何も入力しなくても root のプロンプトが表示されるので、以下のように操作する。

1
2
3
4
5
6
7
# fstabが正しいかチェック

# ls /
# ls /home

それぞれ、予定したディレクトリが表示されればOK。ダメならなにかおかしい。
ここまで来ていれば、 `vi /etc/fstab` できるので修正すれば良い。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# mount /dev/sda1 /mnt     EFIシステムパーティションをマウントする。
# blkid
/dev/sda1: UUID="D668-7F30" TYPE="vfat" PARTUUID="6d2e1e9f-5e30-41b6-a02d-617a11cd1689"
/dev/sda2: UUID="a168f2e5-f9eb-4612-a209-2f205e17f4b9" TYPE="swap" PARTUUID="623ac68c-f536-4fee-bdfd-fe8883bf4dcf"
/dev/sda3: LABEL="root" UUID="8ba8067b-38c5-416c-9144-fe5687c364f6" TYPE="ext4" PARTUUID="0457990b-2395-45ea-8928-0df5d571e06b"
/dev/sda4: LABEL="home" UUID="1a70c7ef-8120-44a4-a3f3-b16b2c226791" TYPE="ext4" PARTUUID="b9557977-5584-48e8-b1fb-0c7c0d02e0ff"
※ このUUIDはシステムによって異なる。 root にするパーティションのUUIDをメモる(次で使う)

# vi /mnt/EFI/ubuntu/grub.cfg

当方の環境の場合なので、8ba8〜の部分は、上記 `blkid` の出力結果から抜き出す必要がある
```conf:grub.cfg
search.fs_uuid 8ba8067b-38c5-416c-9144-fe5687c364f6 root hd0,gpt3
以下は触らない
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
````

作業が完了したら再起動する。

reboot


### 通常起動

何もせずに普通に起動してくれば OK。おつかれさまでした。

## 蛇足

### 念の為の追記。

- 実際に作業をしたときは、`rescueモードでの起動` の時に、`update-initramfs` `update-grab` を実行しているが、意味がないはず。

### 起動の動作

UEFI -> /dev/sda1/EFI/bootx64.efi (GRUB) -> Linux カーネル -> systemd

"/"パーティションの UUID が変わってしまうと、GRUB が "/" を見つけられなくなる(/boot/EFI/ubuntu/grub.cfg に書いてある UUID が変わるから)ので GRUB で停止していると思われる。

なので、手動で grub にルートファイルシステムを指定し、カーネルと initramfs を読み込ませれば起動できるようになる。ということだと思う。

環境

  • Ubuntu 18.04
  • Postgres 10.5
  • zabbix 3.4

選択肢

pg_monzII

http://pg-monz.github.io/pg_monz/

国産。多機能っぽいけどその分つらい。Active Check 使うからテストできない。

グラフが死ぬほどある。 複数台の構成でも監視可能ぽい。

PostgreSQL Monitoring for Zabbix

https://share.zabbix.com/databases/db_postgresql/postgresql-monitoring-for-zabbix

libzbxpq なるモジュールを入れるのが面倒そうだった。Ubuntu Trusty くらいまでしかバイナリがない。早そうだけどちょっと… ソースからコンパイルもできるようだけれどもコンパイルに zabbix のソースがいるとかいろいろとあって断念。

mamonsu

https://github.com/postgrespro/mamonsu

別のエージェントを実行。取説が割と親切でそのとおりに進めばなんとかなる。別のエージェントが起動してしまうのはいかがなものかと思わなくもないけれども、逆に zabbix-agent とは別のエージェントが起動するので干渉しないとも言える…

私はこれを採用しました。

蛇足

Twitter に書こうと思ったら文字数足りませんでした。