きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

Lenovo IdeaPad Duetを買った

主に電子書籍閲覧用タブレットとして購入。

手元の古いiPadも調子悪いしKindle Fire HD8も調子悪くなってたしでいい加減iPad買おうかとか思っていたところ、「ビックカメラでクーポン適用で税込み35,000円切ってる」という@mayuki さん情報と、周囲の人々のIdeaPad Duetの評判が割とよさげなあたりで踏ん切りをつけました。

 

……で、今(2020/11/27)見ると、『税込み39,980円 からクーポン適用で9,900円引き!』とかなってるので税込み30,080円と。もっとお得に買えますね!(ちょっと悔しい*1

https://www.biccamera.com/bc/item/8127449/

 

雑感

『10インチ液晶のタブレットでストレージが128GB、主記憶4GBでカバーになるキーボード付き』で35,000円弱、『10インチ液晶のタブレットでストレージが128GB、主記憶3GB*2でキーボードは無し』の第8世代無印iPadの税込み49,000円と比べると、タブレットとしての総合力(?)はともかく電子書籍閲覧端末としてはコストパフォーマンス十分かなとか言うあたりが落としどころでした。

あとChromeOS/ChromeBookは一台も手元に無かったので興味あったりというのも大きく。

 

過去のAndroidタブレットではPDFがモッサリしてツライとかちょいちょい経験してきてましたが、IdeaPad Duetでは特に感じず快適に読めてます。ので、とりあえず買って良かったな、QoLの向上に寄与してるな、と感じてます。

*1:注文したのがちょうど一週間前で、受け取ったのが日曜日、開封してセットアップしたのは火曜日だった水曜日……みたいな感じでまだ5時間くらいしか使ってないのにもう5,000円近く値下がってるのでそこそこ悔しい!

*2:ただOSやらなんやら違うのでこの主記憶の容量の差が直接なんか影響するかというと多分ほぼ気にしなくていいと思う

6畳和室にデスク置いたり書棚を置いたりするために雑にコンパネを敷き詰めてみた

元々寝室として使われていて今は物置と化してる本畳の6畳和室にデスクやらチェアやら書棚やら置いて入れて書斎として使いたいという事案に対して、いろいろ考えたあげく雑に畳の上にコンパネを敷き詰めてカーペットを引くだけの雑施工で乗り切ることにしました。

フローリング化したい…けど……

正直なところフローリングしてしまいたいのだけど、工務店さんに頼むとそれなりにお金がかかるし(おそらくざっくり20万程度は見ておく必要はあるはず)見積もりからお願いしてスケジュール調整して……となるとそれなりに日数もかかります。

DIYでできないこともないですが、40年前に曳家をして基礎もやり直してるとはいえ元は江戸時代から引っ張りまわしてる(らしい)古い日本家屋。畳の下も座自体は傷んではいないものの、揃いかたも微妙でいい加減に隙間もある板一枚で「断熱?なにそれ?」な状態。 水平出しながら根太並べて断熱材敷き詰めて下張りして……とか考えると素人仕事だと3日はフルにかかりそう。稲刈りやらなんやら控えたこの時期にそれはなかなか厳しく。

かといって畳の上にそのままチェアを置くと多少カーペットを敷いたくらいでは畳がボロボロになって(そのうち捨てるつもりの畳とは言え)色々支障が出ますし、床面も平たんではないので書棚等を置くにしても不安が大きく……。

……ということで、12mm厚程度のコンパネを敷き詰めて雑に固定した上でカーペットを敷いてお茶をすことにしました。

5年以内のは根本解決するつもり&その時畳は廃棄するつもりだからできるのような方法であって、基本的にはまねしないほうがいいと思います。

雑にコンパネを買ってきて敷きつめる

というわけで、材料を買い出しに行きました。 対象の部屋がちょうど本間サイズの6畳間(しかも若干大きめ)なので、サブロク板*1であればだいたい6枚で加工無しで敷けます(むしろ隙間ができるくらい)。

最初は12mmの針葉樹構造用合板にするつもりだったのですが、買い出しに行ったホームセンターにあったのが割と節があってぼこぼこしてるのが多くカーペットを敷いたとしても気になりそうだったので、コンクリート型枠用のパネコート板にしました。価格的にも大して変わらない(+200円程度)上に、表面はすべすべで耐水塗装もしてあるのでいろんな意味でいいかなと。近くのホームセンターで税込み1,300円/枚程度で6枚購入。

これを畳の上に敷き詰めます。畳は均一に水平ではないく凹凸や湾曲もあるのでパネルの端っこは結構浮きます。が、その上にカーペットを敷いたうえにデスクやら置くので気にしないことに。一応、なにかの拍子でずれないようにするために何か所か釘で直接、打ち付けてやりました。

そのあと通販で買った安めのカーペットを敷きました。本間6畳サイズで6千円くらいだった気がします。一応コレもずれないように、途中途中を両面テープでコンパネに張り付けつつ、端っこは畳に上敷鋲を打って固定しました。

畳の上からでもコンパネ同士の合わせあたりはぼこぼこしてるのが分かりますが、まあ気になる用ならさらにこの上から厚めのカーペットとか敷けばいいかなという感じです。

まとめ

畳を板で完全にふさいでしまうのであんまり長くやると湿気が畳にたまってよくない感もありますし決して人に勧めれませんが、とりあえず15,000円くらい+工期1時間くらいで畳和室を雑に板張り書斎に工事してみたメモ……でした。

*1:1820mm*910mmの一般的なサイズの板

Steam版NiGHTSでXBOXジョイパッドを有効にする

だいぶまえにリリースされていたものの、日本からは購入できなかった『NiGHTS into Dreams』が無料配布で入手できるようになったとのことなので、いただきました。

入手方法などはこちら。 www.gamespark.jp

そのまま起動するとジョイパッドが使えない

早速インストールして起動したのですが入力設定でもジョイパッドが有効になっていない模様です。ジョイパッドでもアナログコントローラーでないと操作性が厳しかったこのゲーム、キーボードでやるのはちょっと厳しいです*1

f:id:kiyokura:20201018083631p:plain

Steamアプリのライブラリから起動して「Game Configuration」で設定する

検索するとフォーラムに答えがありました。 インストール時に作成されたショートカットなどから直接起動するのではなく、Steamアプリのライブラリから起動して「Game Configuration」から設定可能でした。

f:id:kiyokura:20201018084447p:plain

Playerタブで選択可能。 f:id:kiyokura:20201018084513p:plain

言語設定で日本語も選択できました。 f:id:kiyokura:20201018084535p:plain

ゲーム内の設定画面もこの通り。 f:id:kiyokura:20201018084812p:plain

実際に優先で接続したXBOX Oneコントローラーで快適にプレイできました。 余談ですがSteamのゲームでゲームパッドを使用したい場合、事実上Steamの標準コントローラー扱いのXBOX 360/XBOX Oneコントローローラを一つ持っておくのがおすすめだと思います。

Xbox One  ワイヤレス コントローラー (ブラック)

Xbox One ワイヤレス コントローラー (ブラック)

  • 発売日: 2016/11/28
  • メディア: Video Game

Game Configurationが選択できない?とき

なお私の場合、最初はSteamのライブラリから起動しても「Game Configuration」が選択できずそのままゲームが起動していたのですが、ライブラリの一覧で右クリックからプロパティダイアログを表示し、Steam入力周りの設定を[強制オン]にしたりするなどそのあたりの設定をいじっていると、いつの間にか起動時にGame Configurationが選択できるダイアログが表示できるようになっていました。

f:id:kiyokura:20201018085334p:plain f:id:kiyokura:20201018085433p:plain

(その後はそのあたりの設定を元に戻してもGame Configurationが出てくるようになったで何が作用したのかなどは特定できていません……)

*1:個人の感想

LGの42.5インチ4Kモニタ 43UN700T-B を買った

Prime Dayの日、セール対象ではなかったっぽいけどなぜか普段より1万円少々安い54,980円とかだったので購入。

ノートPCをHDMIとUSB Type-Cで接続、左右2画面分割(1920*2160を2枚)して都合トリプルディスプレイとして利用しはじめましたがいまのところこれ自体は快適です。

ただ、やはりそれなりの大画面を近い距離で使用するため、(自分の)視野角と距離、目線の高さなどの都合でPCデスクを新調したくなりました。 奥行700~800mm、幅1400~1600㎜、高さ700mmくらいで天板が一枚板*1、耐荷重50kgくらいいけそうなデスクを探す旅が始まりそうです。

*1:無垢一枚板である必要はないけど引き出しや補強版などが無いタイプが欲しい

DacFxで差分更新スクリプトを取得する際に特定のオブジェクトを除外する

更新用T-SQLスクリプト生成時に特定のオブジェクトを除外したい

先日書いたエントリ、 kiyokura.hateblo.jp

……の補足情報です。

特定のオブジェクトを更新スクリプトに含めたくない場合もあるのではないかと思います。私はあります。 DaxFxのSchemaComparisonでこれを実現する方をあれやこれや試行錯誤してみたところ、異なる二つのアプローチにたどり着きました。

SchemaComparisonResult.Exclude で抽出結果から除外してスクリプトを生成するアプローチ

まず一つ目は、SchemaComparison.Compare()で比較結果から除外対象を登録したうえでスクリプトを生成する方法です。

比較結果として返されるSchemaComparisonResultのメンバメソッド、Exclude()を使います。 以下のように、Excludeに除外したいオブジェクトをSchemaDifference側で渡してやればOK。

// パターン1:比較結果から除外するアプローチ
var newverdacpac = @"C:\newver.dacpac";
var oldverdacpac = @"C:\oldver.dacpac";

var newverEndpoint = new SchemaCompareDacpacEndpoint(newverdacpac);
var oldverEndpoint = new SchemaCompareDacpacEndpoint(oldverdacpac);

var comparison = new SchemaComparison(newverEndpoint, oldverEndpoint);
var comparisonResult = comparison.Compare();

// 削除(DROP)になる更新を除外して追加(CREATE)と変更(ALTER)のみのスクリプトを生成する
foreach (var diff in comparisonResult.Differences.Where(x => x.UpdateAction == SchemaUpdateAction.Delete))
{
  comparisonResult.Exclude(diff);
}

// スクリプト生成
var generationResult = comparisonResult.GenerateScript("HogeDb");
var scriptfile = @"C:\update-database-exclude.sql";
using (var sw = new StreamWriter(scriptfile, false, Encoding.UTF8))
{
  sw.Write(generationResult.Script);
  sw.Flush();
}

ポイントはExcludeメソッドを呼ぶたびに比較結果内で依存関係等のチェックが行われる点です。そのためExcludeメソッドの実行にある程度時間がかかることがあります。また依存関係チェックの結果、スクリプト生成時に除外されないケースもあります(除外しようとしたオブジェクトが、更新スクリプトに含まれるオブジェクトから依存されている場合) 端的に言うと、Visual Studio上でSSDTのスキーマ比較ツールを利用して比較結果表からチェックボックスでオブジェクトを選択して除外していくのとまったく同じ操作と結果を得ることがでるようでう。

 

ExcludedSourceObjectsとExcludedTargetObjectsに除外オブジェクトを登録した上で比較を行うアプローチ

もう一点は、SchemaComparison.ExcludedSourceObjectsSchemaComparison.ExcludedTargetObjectsに除外したいオブジェクトを登録した上でCompareメソッドを実行するアプローチです。 ExcludedSourceObjectsとExcludedTargetObjectsに登録されたオブジェクトは比較時に対象から除外されるため、これらに登録されているオブジェクトは(差異があっても)比較結果に差異として抽出されません。

例えば以下のようなコードになります。

// パターン2:除外してから比較するアプローチ
var newverdacpac = @"C:\newver.dacpac";
var oldverdacpac = @"C:\oldver.dacpac";

var newverEndpoint = new SchemaCompareDacpacEndpoint(newverdacpac);
var oldverEndpoint = new SchemaCompareDacpacEndpoint(oldverdacpac);

var comparison = new SchemaComparison(newverEndpoint, oldverEndpoint);
var comparisonResultPre = comparison.Compare();

// 削除(DROP)になる更新を除外して追加(CREATE)と変更(ALTER)のみのスクリプトを生成する
foreach (var diff in comparisonResultPre.Differences.Where(x => x.UpdateAction == SchemaUpdateAction.Delete))
{
  if (diff.SourceObject != null)
    comparison.ExcludedSourceObjects.Add(new SchemaComparisonExcludedObjectId(diff.SourceObject.ObjectType, diff.SourceObject.Name));
  if (diff.TargetObject != null)
    comparison.ExcludedTargetObjects.Add(new SchemaComparisonExcludedObjectId(diff.TargetObject.ObjectType, diff.TargetObject.Name));
}

// 除外オブジェクトを登録した状態で再度比較を実行
var comparisonResult = comparison.Compare();

// スクリプト生成
var generationResult = comparisonResult.GenerateScript("HogeDb");
var scriptfile = @"C:\update-database-add-excludedlist.sql";
using (var sw = new StreamWriter(scriptfile, false, Encoding.UTF8))
{
  sw.Write(generationResult.Script);
  sw.Flush();
}

この方法の場合、ExcludedXxxObjectsに含まれるオブジェクトは依存関係のチェックも行われないようで、更新用T-SQLに含まれるオブジェクトからの依存があっても除外されたままになります。 上記サンプルではExcludedXxxObjectに登録するための情報を得るために一度Compareを行い、リスト登録後に再度Compareを実行するという一見二度手間のような処理をしていますが、依存関係チェックが行われないせいかトータルの処理時間としては短めになりました*1

 

まとめ

具体的な記述のあるドキュメント等が見つからないためあくまでも挙動からの推測にはなりますが、このような形で一応目的を達成することができそうです。

*1:状況によるとは思います