SQLServer動作確認中の備忘録
とあるアプリケーションの動作確認中に確認したエラーとその対処法の備忘録です。 SQLServerは経験がなかったので勝手がわからずなかなか苦労しました。
その1:SqlDataReaderのClose漏れでInvalidOperationException
以下のようなエラーが発生しているときは、SqlDataReaderをCloseせずにクエリを実行している可能性が高いです。処理を見直してClose漏れが無いか確認すると解決するかもしれません。
'System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.'
自分のケースではSqlCommand.ExecuteReader()とSqlTransaction.Commit()とが競合していました。そのためExecuteReader()を実行した後にSqlDataReader.Close()することによって例外を解消することができました。なおこのケースではExecuteReader()の返り値を受け取っていなかったのですが、こういう場合はExecuteReader()ではなくExecuteNonQuery()を使ったほうが良さそうだ、ということもわかりました。
その2:DataSetのFillでConstraintException
以下のようなエラーが発生しているときは、該当するDataSetクラスにある項目のAllowDBNullプロパティを確認すると解決するかもしれません。
'System.Data.ConstraintException: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.'
自分のケースでは、該当するカラムがNULLになる可能性があるにも関わらずFill()を実行したことによって発生していました。そのため当該項目のAllowDBNullプロパティをtrueに設定することでエラーを解消することができました。
なお原因調査中にStack Overflowで以下のコードを見つけ、アレンジして実行し何が問題なのかを調査しました。Stack Overflow便利ですね。
WindowsにDockerを入れようとして失敗した話
今回は失敗談。
自プロジェクトで使用していたJenkins環境がとある事情でお亡くなりになったため、再構築をしようとしていたときのお話です。どうせならDockerを使おうと、Docker Desktop を Windows に入れようとしました。
以前にMacに入れたことがあったので、軽い気持ちで考えていました。
Docker Desktop for Windows は Hyper-V を有効化する必要がある
以下の記事を参考に、Docker Desktop をインストールすることはスムーズに行えました。
VirtualBoxが起動しない…?
ところがその後開発やテストで使用していたVirtualBoxが急に動作しなくなりました。思えばDockerをインストールした際の再起動時にVirtualBoxがエラーダイアログを出していたため、予兆はあったのですが、てっきりそのせい(シャットダウン時に何かあったんだろう)だと思いこんでしまっていました。
その後VMが起動時にエラーとなり、VMのイメージを削除しても、VirtualBox自体を再インストールしても解決することはなく、完全に詰んだと思いました。
そこから冷静になって考え始めたころ、Docker入れた後にこうなったなと漸く気づき、Hyper-Vを有効化したことが原因だとわかりました。かなりテンパっていたので気づくのがとても遅かったです…。
Hyper-Vを無効化してひとまず解決
その環境でDocker Desktopを使用することは諦めHyper-Vを無効化することでVM環境は復旧できたのですが、数時間はハマっていたのでなかなか手痛い経験でした。以下はそのときに参考になったサイトです。ありがとうございました。
ただ自分はこのやり方でも完全にアンインストールすることができませんでした*1。そのため以下コマンドを実行して無効化しました。
bcdedit /set hypervisorlaunchtype off
VirtualBox他VMと共存させるなら Docker Toolbox
VirtualBoxは6.0以降ならHyper-Vと共存できるようですが、WindowsにDocker DeskTopをインストールするにはWin10Proが必要なので、ひとまずDocker Toolboxを選択しておくのが良さそうです。次回はこちらにチャレンジ してみようと思います。
まとめ
Hyper-Vを有効化する際はVirtualBox他VMとの共存が可能かチェックする
WindowsならDocker ToolBoxを選択しておくのがよい
別の環境で練習してから試す
困ったときほど冷静になって思考を整理する
*1:ネットワークアダプターなども削除したが無効化することができず…。Hyper-Vのコンソールからイメージなども全て消してみたりもしたがダメ。まだ何かゴミが残っていた?
gitで名前に日本語を含むファイルをエクスポートする
業務の都合でgitからファイルをエクスポートする必要があって調べたところ、git archiveを使用すればよいということがわかりましたが、git archive でzipを指定したとき、名前に日本語を含むファイルがあると文字化けすることもわかりました。
少しググると tarで一度出力したあとにzipに圧縮し直すという手順がありましたので、紹介します。
具体的には以下のとおりです。
gitでファイルをエクスポートする手順
日本語を含むファイル名をgit archiveすると文字化けするため、tarでarchiveしてzipに圧縮し直すという手段を取ります。前提としてファイルの圧縮に7-zipを使用します。
なお圧縮ソフトはコマンドライン対応でtarを使えるならなんでもいいと思います*1。
その1:git bush を起動します。
SourceTreeを使っているならTerminalボタンクリックで起動します。
その2:git archive コマンドを使用してエクスポートします。
$ git archive {コミットID} --prefix={出力フォルダ} --output={圧縮ファイル名}.tar
作業しているブランチの先頭ならHEADを指定します。また特定のフォルダのみ出力したい場合は:(コロン)をつけて指定します。 例えば root/srcフォルダのみエクスポートしたい場合は git archive HEAD:src --prefix ~ のようにします。
prefixは特定のフォルダに出力したい場合は指定します。outputは圧縮ファイルを指定します。
その3:tarで圧縮したファイルを解凍します。
$ "C:\Program Files\Git\usr\bin\tar.exe" -xvf {圧縮ファイル名}.tar
圧縮対象のファイルがあるディレクトリで作業すると元のファイルを上書きするので、カレントディレクトリを移動するか解凍先を指定します。解凍先を指定する場合は、-Cオプションを指定します。
例)tar -xvf {圧縮ファイル名}.tar -C {解凍先フォルダ名}/
※最後のスラッシュがないと悲惨なことになります
その4:7-zipを使ってzipに圧縮し直します。
$ "C:\Program Files\7-Zip\7z.exe" a {圧縮ファイル名}.zip ./{解凍先フォルダ}
lhazなど、コマンドラインで実行できる圧縮ソフトならなんでもいいと思います。
バッチファイルでまとめておくと便利
コマンドライン引数を取るバッチファイルなどにしておくと便利です。
git archive %1 --prefix=src/ --output=%2.tar mkdir %2 "C:\Program Files\Git\usr\bin\tar.exe" -xvf %2.tar -C %2/ "C:\Program Files\7-Zip\7z.exe" a %2.zip ./%2 rm %2.tar rmdir /s /q %2
こんな感じ(対象のコミットと圧縮ファイル名を指定)
*1:lhazなど
2021年の目標
年末年始をダラダラと過ごしてしまい、なかなか普段のリズムに戻れなくなっています。一年の計は元旦にありと言いますが、すでに10日以上経っているわけで…。サクッと元日に目標を立てられる人はすごい。何をするにしてもスピード感を持って行動したいですね。
2021年の目標
意義目標
- QoLを高めつつ、継続して成長できるエンジニアになる
※2020年から継続
行動目標
アウトプットの質も重視する
書籍を年間20冊以上読む
対話力を磨く
アウトプットの質も重視する
2020年はとにかくブログを習慣化しようと思って週一ペースで書いてみようとしていました。内容についてもメモ的要素が多く、完全に自分のためのものでした。2021年はそのスタンスを少し変えてみようと思います。また貴重な時間を使って読んでくださった方に少しでもお役に立てられるような情報を共有できればいいなと考えています。
書籍について
2020年は14冊でした。個人的にはもっと読めるかなと思っていましたが、なかなかペースが上がりませんでした。2021年こそ20冊を目標にしたいと思います。数値目標を立てるとそれに縛られてしまうところがある*1ので、あまり意識し過ぎないようにします。
対話力を磨く
今わかっていることとして、このままでいくと2021年は業務の都合で環境が大きく変わりそうです。当然関わる人も変わることになるのでコミュニケーション面での苦労はありそうです。特に自分はなかなかにコミュ障の気があります。ウィークポイントとしても自覚があるため、また(気が早いですが)2022年以降も見据えて克服できるように努めたいです。
息抜きも適度にする
仕事やスキルアップはとても重要ですが、普段の生活を充実させてこそだと考えています。コロナ禍で息抜きも難しい状況ではあるものの、そういった中でもできることを見つけて楽しく過ごせればと思います。
まとめ
量を維持しつつ質も意識する
数値に縛られ過ぎないようにする
対話力を磨く
2020年のふりかえり
*1:2020年は小説を一冊も読めず…。三体II読みたい
2020年ふりかえり
本当に早いもので2020年ももう終わり。最後に一年をふりかえる。
今年の目標
毎回恒例、今年はじめに立てた目標をおさらいしておく。
意義目標
- QoLを高めつつ、継続して成長できるエンジニアになる
行動目標
アウトプットを重視する
書籍を年間20冊以上読む
使える言語を一つ増やす
旅行する
アウトプットを重視する
ブログは一回を除いて、週一のペースを途切れさせることなく続けられた。現在では書かないと気持ち悪い・何か書かねばという風に考えられているので、習慣化には成功していると思う。若干それが変なプレッシャーとなっていることがあって微妙な感じもするが、まあ一応目標を達成したと考える。今年はとりあえずアウトプットすることを念頭に置いていたため、内容や質についてはあまり考えないようにしていた。来年以降はペースを継続しつつ、そのあたりにも気を配っていくようにしたい。元は自分のために続けているものだが、縁があって読んでもらえた人たちへ価値を届けられるようにもしていきたい。それにはもっと時間を作らねば…。今の生活リズムだと平日まったく動けないので、ここに改善の余地がありそうに思う。
書籍について
9〜12月で書籍は4冊。合計すると14冊。目標には届かなかった。ただ数値化できたことはよかったと思う。今まで何も記録していなかったので、読んだか読んでなかったかすら覚えていないものもある。それに比べると大きな進歩である。ポジティブに考えよう。来年以降はこの数字をベースにしてペースを上げていきたい。ただ読んだ書籍の数を目標にすると、小説や趣味系の書籍を全く読まなくなってしまった(買いはする。 積読状態)。このあたりはバランスを取っていきたい。
使える言語を一つ増やす
Pythonを少し齧ったが、現在の業務は使用しないのですぐ忘れそう。目標の目的や理解が曖昧なまま立ててしまったなと少し後悔。新しいことは必要になった際に学べばいいと思うが、かといって種まきをしておかないと自分で切り開くこともなかなか難しい。あまり思い切った行動ができない自分には永遠のテーマだなと思う。
QoLは上がったか
今年はコロナという例年とは異なる特殊な年だったため判定が難しいので来年以降へ持ち越す。とはいえ家族が4人になって初めて旅行ができたし、感染対策をしつつ外へ遊びに行くことも何度かできた。一刻も早くこのような状況が収束すると願いたい。
その他
業務外活動として、組織的な技術力向上を目的とするグループの推進リーダーになり、社内メンバーとコミュニケーションを取りつつワーキンググループの発足や推進を行なった。なかなか伝える・お願いするだけでは思った通りにならないことを思い知らされた。今でもどうやればよいかわからない。また活動を通じて、別プロジェクトのヘルプやサポートに入れたりもできているので、とても良い体験ができた。そういう意味では濃い一年だったと感じる。ただ業務外の時間を使うことが多かったため、トータルの作業時間がかなり増えてしまった。
まとめ
行動の変化
目標を立てていたおかげで、この一年はこれまでに比べてかなり行動が変わったと思う。業務でもそうだが、つくづく目標や計画が大事だと認識した。来年はブログを継続しつつ、その内容や質も上げていきたい。若干インプットが不足気味だったので、インプットする時間を確保できるようにしたい。平日をうまく使うことがポイントであると考えている。また社内での活動が多かったので、社外にも目を向けていきたいと思う。いい歳ではあるものの、向上心はまだまだあるので、もっともっと成長していきたい。
過去のふりかえり
Jenkins環境をdocker上に作る
HDDが吹っ飛んだ
Jenkinsは業務で使用していて、社内のサーバーで動作させていた。
そのサーバーのHDDが先日いきなりお亡くなりになってしまった。
バックアップも特に取っていなかった(あかん)ので、またJenkins環境を構築するためにメモ。
以前はサーバーマシンに直接インストールして使っていたが、今回はdocker上に作ってみようと思う。
事前準備
docker をインストールしておく。docker desktopを選択してダウンロードする。 あとはdocker IDを作るなど。
構築手順
dockerイメージをpullする。なんとなくBlue Oceanを使ってみたかったので jenkinsci/blueocean にしてみた。運用は後から考える。
$ docker pull jenkinsci/blueocean
続いてJenkinsのデータを格納するディレクトリを任意の場所に作る。
$ mkdir $HOME/jenkins_home
docker runする。
docker run --rm -d -p 8080:8080 -v $HOME/jenkins_home:/var/jenkins_home jenkinsci/blueocean
--rm
はコンテナ終了時に自動でコンテナを削除するオプション。-d
はバックグラウンド実行するオプション。つけないとこのターミナルがJenkins動作モードになって、他のコマンドを受け付けなくなる。-p 8080:8080
はホストマシンとコンテナのポートのマッピングを行う。-v
でホストのディレクトリとコンテナのディレクトリをマウントする。$HOME/jenkins_home
にコンテナ上のJenkinsのデータが格納される。
また-v /var/run/docker.sock:/var/run/docker.sock
とすると、コンテナの中から新たにdockerコンテナを起動できるようになるとのこと。
ただホストで動いている他のコンテナが見えたり、ホストマシンのルートが取れたりするらしく注意が必要そう。いったんは使用しないでおく。
これでJenkinsが起動する。
Jenkinsのセットアップ
上のコマンドを実行してしばらくするとJenkinsのセットアップ画面に遷移する。
docker run した際に-vオプションでマウントしたディレクトリにsecrets/initialAdminPasswordがあるので、そのパスワードをコピーして貼り付ける。
次にプラグインのインストールを行う。オススメとカスタマイズがあったが、特にこだわりなかったのでオススメの方を選択。
管理者ユーザーの作成、URLの指定など。
完了。Start using Jenkins をクリックするとJenkinsのホーム画面へ遷移する。
ここまで来るのはとても簡単。
dockerを止めるときはdocker ps
で止めたいコンテナIDを確認した後docker stop <containerID>
でOK。
--rm
オプションをつけるとコンテナイメージが自動で削除されるので、再開するときはまたdocker runする。
Jenkinsのデータは$HOME/jenkins_home
にあるので問題ない。
今回はここまで。
HTML/CSSはじめました
とりあえずやってみよう
前回の話で、今後Web系の業務に携わる可能性があるかも…ということで、何かしら準備しておく必要があるなと思い、本を買って読んでいる。備えあれば憂いなし。まだ半分ほどしか読めていないが、経験がない分野なのでとても楽しく学習できている。
初学者向けの本
本書の構成としては、Webサイト制作の初心者向けに必要なものを順を追って解説するものとなっている。前半部分はWebの仕組みからHTML、CSSの基本を学び、後半はそれらをふまえWebサイトを制作していく。解説が丁寧なので、ほとんど初心者の自分が読んでも理解に苦しむところは今のところない。
サイト制作の流れ
Webサイトの制作は、企画→サイトマップ→ワイヤーフレーム→デザイン→コーディング→公開という流れになっているらしい。こういうのはセンスがモノを言う世界で、いきなりガーッとやると思っていた(汗)ので、結構ちゃんと
ワークフローがあるのだなと思ってしまった。本書の冒頭の方でデザインはセンスではなく知識だと書かれていたが、こういうふうにプロセスに沿って作っていくなら自分でもできるかもしれないと少し感じた。
またワークフローを抽象的に捉えると、要求分析→設計→実装と今の業務にも通じるところがある。
特にUI周りについては学ぶ点が大いにあるように思う。
様々なツール
ワークフローの各フェーズごとに様々なツール(サイトマップ作成ツール、ワイヤーフレーム作成ツール、グラフィックツールなど)があり、それらを駆使してWebサイトを制作していく。VSCodeなどのモダンなエディタにあるプラグインを入れれば、HTMLも楽にコーディングすることができる。とりあえずこのあたりを入れてみた。他にも良さそうなのがあれば試してみようと思う。
楽しく学ぶ
本書ではスマートフォンに対応させるレスポンシブデザインについても解説があるということで、今から楽しみである。ぼちぼち年末年始もやってくるし、本書を読んだあとに何か作ってみたい。