多趣味まるの日常

跡取り息子を辞めたスーパー多趣味人間の日常や便利アイテムの紹介

【自己紹介】スーパー多趣味の遊び人 まる

はじめましてこんにちは。スーパー多趣味の「まる」と申します。

 

どういう経緯でこのブログを見ていただいているかはわかりませんが、

 

訪問くださってありがとうございます。

 

このブログでは多趣味な私が趣味や仕事や便利な道具、おいしい食事処などその時興味があることを紹介するブログです。

 

まずそんな多趣味な私がどういった人間かを紹介したいと思います。



私は子供の頃から様々なことに興味を示すタイプでした。

 

 

自己紹介がてらいくつかやってきたこと列挙しますと、

 

ミニ四駆

・ドッヂボール

・野球

・卓球

・ビリヤード

囲碁

・3DCAD

・燻製

・釣り(ワカサギ、ブラックバス、海)

・包丁砥ぎ

車中泊

・キャンプ

DIY     等々

 

まだまだたくさんあるのですが、ぱっと思いつくだけでもこれだけあります。

 

これだけ色々やっていると非常に飽きっぽいんだろうと思われるかもしれません。

 

その通りです!めっちゃ飽きっぽい性格です。

 

ただし!それなりに人並み以上に遊んでいると自負していますし、実績もあります。

 

実績の方もいくつか載せておきますと、

 

ミニ四駆   某フラット全国大会1○位(100人以上参加)

・卓球     某県高校総体 6位

・ビリヤード  ハウストーナメントBC級優勝2回 ABC級8ボール優勝1回     

        (入賞は多数)

囲碁     アマチュア5段格

・ワカサギ釣り 500匹オーバー/1日

・一級窓用フィルム施工技師

・ダイノック(化粧シート)施工

・カーフィルム施工           等

 

いかがでしょうか。それなりに色々やっている事が分かってもらえたでしょうか。

 

このブログではそんな多趣味な私の日常や、便利だった商品の紹介等を写真や動画付きで紹介していこうと思っています。

 

多趣味であるがゆえに多々買って失敗したものもありますので、そういったものも紹介していこうと思います。

 

それではよろしくお願いいたします。

【Minecraft】データ消えたからバックアップを簡単に取れるアプリ作った【C#】

こんにちは。まるです。

 

 

先日MicrosoftWindowsアップデートでSSDが消えるバグが報告されましたが。

私の方もSSDのデータが飛びました。

 

 

大体のデータは外付けのSSDに入れていたので被害は最小限でしたが、ゲーム実行するために必要なセーブデータの移行が難しかったマイクラのデータが全て消えました。

 

 

幸い外付けのSSDにたまたまバックアップしてあった少し前のデータが残っていたので事なきを得ましたが、最後に遊んでいたワールドは消えてしまいました。

 

 

そこで定期的にマイクラのデータを簡単にバックアップできるアプリを作りました。

 

 

初回起動時保存先を聞かれるので入力します。

以後入力不要になります。

変更したい場合は次の起動時事に変更するか聞かれるのでそこで可能です。

 

 

進捗が表示されます。(セーブデータが重たいと時間がかかります)

 

 

完了しました。

 

 

 

データが存在する場合は上書きするか、別名で作成するかキャンセルするかを選べます

※別名の場合は処理日時がファイル名に入ります

 

 

 

これでもし今後データが飛んでも大丈夫なように準備ができます。

 

 

 

需要があればブラッシュアップして公開しようかな?

 

 

 

以上です。それではまた。

【エクセル】結合されてるセルが混在する列に連番を振る【マクロ】

こんにちは。まるです。

 

 

今日も備忘録です。

 

 

エクセルで結合されているセルとそうでないセルが混在している列に対して

連番を振りたいという場面が結構多くて、

 

 

毎回手動だとめんどくさいですし関数だとうまくいかなかったのでマクロ組みました

 

以下コードです。

Sub 選択範囲に結合セルと非結合セル混在で連番を振る()
    Dim selRange As Range
    Dim c As Range
    Dim idx As Long
    Dim skipRows As Long
    
    Set selRange = Application.Selection
    idx = 1
    
    Dim i As Long
    i = 1
    Do While i <= selRange.Rows.Count
        Set c = selRange.Rows(i).Cells(1)
        If c.MergeCells Then
            ' 結合セルの左上セルに連番
            c.MergeArea.Cells(1, 1).Value = idx
            skipRows = c.MergeArea.Rows.Count
            idx = idx + 1
            i = i + skipRows
        Else
            ' 非結合セルに連番
            c.Value = idx
            idx = idx + 1
            i = i + 1
        End If
    Loop
End Sub

 

 

VBA使い方
1:ExcelでAlt + F11を押してVBAエディタを開く

2:メニュー「挿入」→「標準モジュール」で新規モジュールを挿入

3:上記コードをコピーして貼り付ける

4:Excelに戻り、連番を振りたい結合セル混在の列のセルを範囲選択

5:Alt + F8を押してマクロの一覧を表示し「結合セルに連番を入力」を選択して実行

 

 

これで結合されているセルも含めて上から順に連番が付けられます。

 

 

現場変わっても使うこと多そうなので記録しておきます。

 

 

以上です。それではまた

VisualStudio2017 Community を今更インストールする方法

こんにちは、まるです。

 

 

 

今回も備忘録です。

 

 

 

現場でアプリをビルドするのに2017のCommunity版が必要だったのですが、
MicrosoftのHPに行くとサブスクしないとダウンロードさせない、

みたいになったので無理やりインストールする方法を探しました。

 

 

以下に手順を記録しておきます。

 

 

1: https://aka.ms/vs/15/release/vs_Community.exe
  から「vs_Community.exe」をダウンロード

 

2: ダウンロードしたフォルダのパス部分(フォルダエクスプローラーの上の方にあるテキストボックス)に「cmd」と入力しエンター

 

3: コマンドプロンプトが起動したら以下を入力し実行

.\vs_Community.exe --channelUri https://aka.ms/vs/15/release/channel --productId Microsoft.VisualStudio.Product.Community

 

 

2025/08/06時点でvs_Community.exeはダウンロードできますが、
そのうちできなくなるかもしれません。


できなくなったらコメントでできませんでした と教えてくれるとありがたいです。

 

 

以上です。それではまた。

【SQL】DELETE文で複数行削除する方法【IN句】

こんばんは。まるです。

 

 

 

今回は表題の件で少し頭にきたので書くことにしました。

 

 

 

まず私が頭にきたことというのはみなさんにとって何ら関係ないので、

 

 

 

表題の件答えだけ先に書いて後で頭にきたことは日記的に書きます。

 

 

 

今回SQLで複数行DELETEする方法は「IN」を用いた一番オーソドックスなものです。

 

 

 

「IN」(大文字小文字はどちらでも可)

【構文】

 DELETE FROM YOUR_TABLE WHERE ◯◯ IN ('条件1','条件2','条件3')

※条件はカンマ区切りで追加することができます。


【解説】

初めてDELETE文書きます、という人にもなるべくわかるように書きます。

ある程度分かる人は下のINの項目まで飛ばしてください。

 

削除なのでDELETEから始めます。

DELETEは「削除します」という意味です。

FROM YOUR_TABLE

で 「このテーブルから」となります。

今回は例でYOUR_TABLEとしましたが、実際は皆さんのテーブル名を書いてください。

 

WHERE

は削除する条件を指定するための句です。

WHERE ◯◯ = △△ のような形で◯◯が△△だったら、それに合致するレコードを削除する となります。

◯◯には通常そのテーブルのカラム名どれかが来ます。

△△は値が来ることが多いです。

 例:... WHERE USER_ID = '1'

ここでは値が入ると思っていただいて大丈夫です。

 

IN

今回のメインテーマであるIN句です。

◯◯ IN('条件となる値1','条件となる値2')

のように記載することで、◯◯が 条件となる値1 のものと、 条件となる値2

にそれぞれ合致するものはすべて削除されます。

例えばYOUR_TABLEというものが実際にあったとして、IDカラムがあったとします。

IDカラムの値が1,2,3,4のものが存在していたとき
 

 DELETE FROM YOUR_TABLE WHERE ID IN('1','2','3');

と書けば、IDが1、2,3のデータはすべて削除されます。

 

 

以上です。

 

 

ここからは私が頭にきたことになるのでこれで解決したよという方は興味なければ離れていただければと思います。

 

 

 

何に頭にきたかというと、

 

 

もし初学者がSQLでDELETE文を勉強中に、複数行削除したいんだよなーと思ったら、

通常真っ先にノーマルのIN句を教えませんか?

 

 

 

今日たまたまうちの会社の学習中エンジニアにDELETE文で複数行削除する方法をレクチャーしようと思って、複数行削除する方法を調べてみてねと伝えたところ、

どこのサイトもこのIN句をクリティカルに教えているサイトがまーない!!

 

 

 

やれサブクエリだのJOINだの挙句の果てにはトランザクションを張ってーとか。

 

 

 

全然欲しい回答じゃないでしょそれというものばかりを先に掲載しているサイトばかりでびっくりしました。

 

 

 

じゃあなにかい?SQLバリバリかける皆さんは、さっきの例のように削除したいとき、
 

 DELETE FROM YOUR_TABLE

 WHERE ID IN (SELECT ID FROM (VALUES ('1'), ('2')) AS T(ID));

とでも書くというのかい と。(SQLServer

 

 

なんか今回についてはかっこつけてるのかなと思わざるを得ず、初学者になにかわかりやすく学んでもらおうという気概を一つも感じなかったので頭にきたということです。

 

 

 

他にも例えばC#でListから要素数を取り出したい という単純なことを調べると、

 

 using System.Collections.Generic;

 

なんていう余計なものを書いているところとかあったりしますが、

 

 

初学者にとってこんなもんクリティカルな回答じゃないので、

 

 

List.Count

 

 

だけ書いたらいいじゃない と。

 

 

その後で注釈入れて、Listを使うためには

 using System.Collections.Generic;

というのを記載しないと動きません

 

って書けばいいじゃないですか。

 

 

一回変数に入れてその変数を使って出力してみたり、いらんねんそんなの。

 

 

って思いました。

 

 

でもそれくらいはまだわかるんです。

 

 

できる人が見たときに、using書いとかないとだめでしょーみたいなコメントが来るからだと思うんですよね。

 

 

 

そういう文化辞めたらいいのになとつくづく思った今日このごろでした。

 

 

 

以上です。

どうでもいい話なのでこれくらいにします。

 

 

 

それではまた。

今年の目標

あまりにつらい出来事があってから1日ちょっと経過しました。

 

 

 

覚悟をある程度していたつもりでしたが耐えられそうにありません。

 

 

 

どこを探してもおもちがいないんです。

 

 

 

私の大好きな息子がもうどこにもいないんです。

 

 

 

愚かな私はそんな穴の開いた心をどうにか埋めることを考えています。

 

 

 

本当に愚かです。

 

 

 

1年、または2年後までに新しい子を迎えたいと考え始めました。

 

 

 

でも当然今のままで迎えたところで不幸な子をまた産んでしまうことになります。

 

 

 

なので家にあるうさぎの生態書の内容をすべて頭に叩き込みます。

 

 

 

また獣医師向けの医学書も買いました。

これもすべて頭に叩き込みます。

 

 

 

これが自信をもってすべて頭に叩き込めた時、そこで初めて新しい子を迎えるかを判断したいと思います。

 

 

 

また当然この本をすべて頭に叩き込んだからと言って、すべてのうさぎがすべてこの本のケースにおさまるとは思っていないです。

 

 

 

なのでこの本以外にもいろいろ取り寄せて読もうと思ってます。

 

 

 

うさぎの医療履歴のようなものも見れるのならそのあたりもすべて見ようと思います。

 

 

 

とにかく今の状態だと私正常に生きていける気がしないのです、、、

 

 

 

なにか、なにか生きる目的がないと、今にも精神が崩壊してしまいそうで、、、

 

 

 

だから頑張ります。

 

 

 

なにか皆さんのうさぎに関するおすすめがあれば教えてください。

死神のままごと

2018年の2月だったと思うが、埼玉に家を買った。

 

 

 

家を買った当時私はまだ親の会社で跡取り息子として働いていた。

 

 

 

どのころだったかは定かでないが、動物を飼うという話が夫婦であった。

 

 

 

初めはハムスターやカピバラ、犬、猫、カワウソなどが候補に挙がったが、

様々な理由でアルビノミニウサギのおもちを迎えることにした。

 

 

 

私は過去に実家と祖父母の家で犬を飼った経験があった。

 

 

 

と言っても主に世話をしたのは親や祖父母。やったことといえばたまに散歩に連れていく程度。

 

 

 

この二匹が亡くなった当時、今の私の絶望程の悲しみを抱かなった。

 

 

 

気持ちをパラメーターのように数値で表すことはできないが、1/10程度しか悲しまなかったのではないだろうか。

 

 

 

それほどまでに私はペットを飼うということに不適合な人間だったのだ。

 

 

 

不幸にも私はこのことを当時からよくわかっていたし、今後私はペットを飼うことはないだろう、いや飼ってはいけないのだ と自戒していた。

 

 

 

そんな私が家におもちを向かい入れたことはやはりそもそも誤りだった。

 

 

 

強くそう気がついた。

 

 

 

おもちを向かい入れるにあたっては、私がそのような人間であることを自身で理解していたため、かなり徹底的にうさぎの生態について調べた「つもり」だった。

 

 

 

うさぎの生態に関することを事前に調べに調べ、どういった病気になりやすいとか、

どういったサインがあるのかなど、まるで大学の専門教授であるかの如く調べた。

つもりだった。

 

 

 

 

実際におもちを向かい入れたのは2019年の5月。

 

 

 

おもちは生後2か月だった。

 

 

 

ほんとのこと言うと私はおもちではないグレーのネザーランドドワーフを向かい入れるつもりだった。

 

 

 

しかし運命はおもちと私たちを紐づけた。

 

 

 

特にペットショップで妻がおもちを気に入り、最終的におもちを選び、その日のうちに家に迎えた。

 

 

 

おもちは生後2か月にもかかわらず、ほかのうさぎと比べてかなり小さいうさぎだった。

 

 

 

そしてとても臆病だった。

 

 

 

生まれは確か岡山とか広島とかそちらの方で、あんなに小さいうさぎを埼玉まで長時間かけて運んできたことを考えると、当時のおもちはおそらくとても怖い長旅を生後早々に経験したんだろう。

 

 

 

うさぎは基本的に抱っこを嫌う生き物のようであるが、例にもれずおもちもそうだった。

 

 

 

幼かったとはいえ、生後2か月ともなると、もうしつけの類は結構難しくなっている頃合いで、とはいえ幼少期のトラウマというものはずっと残ることを私は知っていた。

 

 

 

その為私はあまりおもちに嫌われるようなことをするまいと、ひどく我々夫婦を怖がるおもちになるべくちかよらないよう心掛けていた。

 

 

 

当時はコミュニケーションは餌をあげるタイミングで、手から餌をあげてみたり、いろいろ好かれるように愚かな試みを考えていたものである。

 

 

 

そんな甲斐があってか?おもちは次第に私たちに心を開いてくれるようになったと思っている。

 

 

 

おもちを向かい入れてすぐ、私は親の会社を辞めた。

 

 

 

無職になり私の方がおもちと長時間一緒に過ごしたこともあり、妻より私によくなついていたように思う。

 

 

 

妻はそんな私とおもちをみて、私は嫌われているんじゃないかと気にしていたのをよく覚えている。

 

 

 

向かい入れてから一か月か二か月ほどは、おもちを夜ケージに入れ、別々に就寝していた。

 

 

 

すべての動物が基本そうであるように、おもちもケージに入れられることを嫌っていたようだった。

 

 

 

2階で就寝していたのだが、夜ケージをかじる音が毎日聞こえてきた。

 

 

 

かわいそうに思った私は、ケージに入れることをやめることを決意した。

 

 

 

おもちは不正咬合という前の上下の歯がきれいに揃わない生え方をしてくる病気?を持っていた。

 

 

もしかするとケージを連日齧ってしまっていたことも影響しているかもしれない。

 

 

 

そういったこともあってケージで飼うことをやめ、バリケードで囲った1畳ほどのスペースをおもちのスペースとしてレイアウトした。

 

 

 

ほどなくして一回目の「事件」が起こる。

 

 

 

朝私が寝ていると妻が血相を変えて私のもとに来た

 

 

 

「おもちがテレビ台の下でうずくまっていて動かない!」

 

 

 

そんなはずはないのだ。何故ならバリケードで囲っている範囲にはテレビなどと言うものはもちろんないのだから。

 

 

 

慌てて降りると確かにそこにはおもちが見たことない不安そうな顔をして丸くなっていた。

 

 

 

実際に見たわけではないので憶測にはなるが、バリケードを飛び越えてしまったんだと思う。

 

 

 

あれだけ調べていたにもかかわらず私はうさぎのジャンプ力を侮っていたのだ。

 

 

 

というより失念していた。という方が正しいのかもしれない。

 

 

 

ましてやバリケードは格子状になったもので、少し考えれば飛び越えようとした場合足を引っかけてしまうことなど容易に想像がつくはずだ。

 

 

 

埼玉で有名なうさぎの名医にかかっていたおもちを急いで連れていく。

 

 

 

診察はおそらく飛び越えた際にねんざしたんだろうということだった。

 

 

 

その日を境におもちの生涯は狂ってしまったのだ。

 

 

 

何故この時私は疑問に思わなかったのか今振り返っても謎であるが、そういう状況であったにもかかわらず、その病院ではおもちの足のレントゲンを撮られなかったのだ。

 

 

 

その半年後か更に後かは忘れてしまったが、不正咬合で定期通院していた際、その医者からこのうさぎは過去に足を折ったことはあるか?と聞かれたのである。

 

 

 

寝耳に水だった。というより寝耳に水と思いたかったんだろうと思う。

 

 

 

その時ようやくあの時おもちは足が折れてしまっていたのだと気が付いたのだ。

 

 

 

気づいたときには後の祭りもいいところ、おもちの足は曲がってしまったのだ。

 

 

 

それまでへやを散歩させる際、テンションが上がって飛び跳ねるようにはしゃいでいたおもちが、見る影もなくなってしまったのだ。

 

 

 

足を折ったと思われるあの日以来、おもちはみるみる痩せていった。

 

 

 

このまま死んでしまうのではないかと偽善者は毎日おもちに謝り泣いたものである。

 

 

 

 

私はこの時事業主として生きて行くために毎日辛い思いをしている時だった。

 

 

 

 

そんな私に毎日生きる力を、怪我しながら与えてくれたのはおもちだった。

 

 

 

 

私はおもちをバリケードで囲った範囲で生活させることも事後すぐやめた。

 

 

 

足を引っかけるバリケードが無くなったことに加え、若かったこともあってかおもちの足は歩けるまでに回復し、当時ほどではないもののぴょこぴょこと動き回れるまでになった。

 

 

 

心底安堵した。

安堵している場合ではなかったのに。

 

 

 

おもちが3歳になったころ、かかとあたりにソアホックというイボができた。

 

 

 

というよりもう少し前からあったのだが、毛に隠れず見えるようになったのがそのころだった。

 

 

 

ソアホックというものはうさぎにはよく見られるもので、当然調査済みであった。

 

 

 

4歳になるまでの間、そのソアホックはあまり大きくなることもなく、

また医者からも触れるものを柔らかいものにしなさいと指示を受けた。

 

 

 

おもちはあの「事件」の後からそれ以前のように走り回るということが無くなっていた。

 

 

 

そしてそんなおもちが普段いるところは主に2か所に限られていた。

 

 

 

それらの場所に柔らかいカーペットを引いた。

 

 

 

この辺りでも気が付くべきだった――

 

 

 

5歳になった去年の春ごろ、おもちに異変が出始めたことに気が付いた。

 

 

 

ソアホックのサイズがかなりでかくなってしまったのである。

 

 

 

それまで大きくなっていなかったわけではないが、2ミリ程度のソアホックが4ミリあるかないかほどで止まっており、完全に油断していた。

 

 

 

異変を感じ始めてからはあれよあれよとおもちのソアホックが悪化した。

 

 

 

ソアホックはうさぎにはよくできるもの。そしてやわらかくして薬を塗っておけばいずれは治るもの。

 

 

 

非常に軽率だった。

 

 

 

ソアホックを改めて調べると、悪化すると関節に炎症が発生し、最悪あるけなくなるということもあるということを発見した。

 

 

 

あまりにお粗末すぎる。

 

 

 

気が付いたのもつかの間、おもちのうしろあし二本はかなり悪化し、恐れていた炎症が発生してしまっていたのだ。

 

 

 

このソアホックを治すためには、というよりこれが悪化した主な原因は、

足が折れたことによりかかとをかなり使って歩くようになっていたことに加え、

排泄がうまくできなくなってきたことによる足の汚れによるものだった。

 

 

 

おもちは先述した通り抱っこが嫌いで、片手だけ出したときは撫でてもらえるのがわかっており近づいてくるのだが、私が両手を前に出すと血相を変えて逃げてしまうほどだった。

 

 

 

これは私にだけ見せる反応で、妻が同じことをした場合は逃げなかった。

 

 

 

私はおもちのことが好きで好きでたまらない。いまでももちろんそうだ。

 

 

 

私はおもちに嫌われたくない。そう本能レベルで思うほどに。

 

 

 

それを言い訳にしておもちの身体を真剣に思って行動しなかったのだ。

 

 

 

炎症がひどくなってからはおもちは歩行が困難になった。

 

 

 

全く歩けないということはないが、じっとしていることが多くなった。

 

 

 

このころからおもちを毎晩お風呂で足湯させることにした。

 

 

 

功を奏したのかおもちのうしろあしにあったソアホックは完全になくなった。

 

 

 

ただ引き換えにおもちのかかとの毛はなくなってしまった。

 

 

 

おもちのなくなった毛の代わりに綿と包帯をするようになった。

 

 

 

以前も靴下をはかせたことがあったが、翌日には靴下を脱いでしまっていたこともあり、ソアホック対策で靴下をはかせることを断念していたが、

幸か不幸かおもちはこの包帯を取ることがなかった。

 

 

 

というよりとることができなかったのだ。

 

 

 

 

それから少しした、今からちょうど2か月くらい前程からか、おもちの左前脚の関節に大きな腫れがあることに気が付いた。

 

 

 

骨が折れてしまったのではないかと焦った我々はいつものかかりつけ医に診てもらったが、後ろ足と同じような炎症が前足でも起きてしまっているんだろうということだった。

 

 

 

なにはともあれ食べてもらわないと。

 

 

 

そういわれ、レントゲンを今回も撮ることはなかった。

 

 

 

さすがの私もこれは疑うべきだと思い、家の近所でうさぎを見ることができる病院をすぐ探し、連れて行った。

 

 

 

レントゲンを撮ってもらったところ、結論骨が折れた ということはなかったのだが、

かかりつけ医のいうように炎症が骨に出てしまっているということだった。

 

 

 

この腫れはほんとに数日の間に突然できたものだと認識しており、なぜかというと毎日お風呂にいれるようになってからは包帯を巻くためにおもちのおなか回りをよく見ていたからだ。

 

 

 

新たに連れて行った医者の診察で、この腫瘍が悪性でないかを調べることにした。

 

 

 

そして親身に対応してくれるこの医者に私たちは心酔した。

いまでも後悔はしていない。

 

 

 

何度かこの病院につれていくようになり、都度アブセスと呼ばれるこの脂肪のような腫瘍を取り除いてもらうことにした。

 

 

 

今週の火曜日、おもちはとても元気になった。

 

 

 

それまで食欲が少し落ちてしまっており、1.1キロあった体重は850グラムほどまで落ちてしまっていたが、火曜日はすごくよく食べてとても嬉しかった。

 

 

 

そう思っていたのもつかの間、翌日水曜日の夜、またおもちの容態が悪くなった。

 

 

 

木曜日、おもちはまったく水も食事もとらなくなってしまった。

 

 

 

昨日金曜日、私は急遽午前休を取り、心酔していた医者に慌てて連れて行った。

 

 

 

実は先週の日曜日、定期的に歯が伸びてしまうおもちを病院に連れて行くのが毎月のタスクであり、その日もかつて行きつけだった医者に連れいてった。

 

 

 

歯だけは麻酔なくカットしてもらえることもありそこに通い続けていたが、その日はなんと臨時休業で空振りだったのだ。

 

 

 

 

昨日の病院ではそんなことがあったことも伝え、食欲がなくなってしまったのは一旦歯が原因が原因かもしれないので明日連れていくなどと話をし、

そのためいつも通り腫瘍を取り除く処置が行われた。

 

 

 

ここで我々は処置中初めて聞くおもちの断末魔を聞いた。

 

 

 

 

私は安堵した。

 

 

 

何故なら今まで感情を出すことなかったおもちが嫌であるということを明確に出したからである。

 

 

 

我々が行っていたことは間違ってなかったんだ。

 

 

 

普段声を出すということをしないうさぎではあるが、痛いときは痛いというんだと。

 

 

 

その誤りに気が付くのに時間はいらなかった。

 

 

 

家に帰ってきたおもちは前日にもまして食事をとることができないどころか、全く動けなくなってしまった。

 

 

 

血の気が引いた。

 

 

 

足が悪くなってあまり歩けなくなった半年ほど前からうすうすもしかしたら長くはないのかもしれないと保険をかけ覚悟してしていたつもりではあったが、おもちが死んでしまうかもしれないと恐怖した。

 

 

 

そして今朝になってもおもちはぐったりしてしまっていて、その恐怖は加速した。

 

 

 

 

急いでかつてのかかりつけ医に歯を切ってもらうのに加え、容態が芳しくないことを伝えた。

 

 

 

とりあえず食べてもらわないと。

 

 

 

また同じ回答だった。

 

 

 

食べることができないので強制給餌を行ってもらい、帰宅した。

 

 

 

給餌のコツを聞いたところ、一日10回とかとにかく回数をかけて給餌すること。

ということだった。

 

 

 

家に帰ってもぐったりしていたおもちは口を見ると給餌してもらった餌がまだ少し口の中に残っているようだった。

 

 

 

とにかく食べてもらわないとまずい。

そう思った私は病院からうちまで1時間ほど経過していたこともあり、給餌を行った。

 

 

 

おもちはあまりこの給餌で餌を飲み込めていないようだった。

 

 

 

私は仕事のため不安でたまらなかったが2階の仕事場で仕事を行っていた。

 

 

 

1時間ほどして一区切りついたところでゆっくりしていると、妻が駆け上がってきた。

 

 

「おもちが具合悪そう!」

 

 

 

慌てて降りた。

 

 

 

おもちはほとんど息をしていなかった。

最後私が声をかけると一瞬びくっと動き、その後動くことはなくなった。

 

 

 

受け入れられなかった。

 

 

 

最愛の息子が突然亡くなってしまったのだ。

 

 

 

火曜日はあんなに元気になりそうだったのにだ。

 

 

 

 

 

それから今に至るまで泣きに泣いた。

 

 

 

そしていままでのことをいろいろ考えた。

 

 

 

そして私は気が付いた。

 

 

 

私は死神だったんだと。

 

 

 

ペットを飼うことに不適合であるということ。

 

 

 

自覚していたのに調査が甘かったこと。

 

 

 

格子のあるバリケードでおもちのスペースをつくったこと。

 

 

 

飛び越えて足が折れてしまっていたこと。

 

 

 

嫌われたくないからとソアホックを軽視したこと。

 

 

 

そもそもソアホックをよく調べてなかったこと。

 

 

 

かかりつけ医に食べてもらわないとと言われていたのに強制給餌しなかったこと。

 

 

 

お風呂に入れて後ろ足が治ったことに安堵したこと。

 

 

 

柵を飛び越えた当時、それを「事件」だと思ったこと。

 

 

 

今日家に帰ってきてから強制給餌したこと。

 

 

 

すべてが間違っていたのに。

 

 

 

 

足を怪我したのは事件ではなく過失。人的要因。

足のソアホックもそれによる人的要因。

ソアホックができた後の処置を軽んじたことも人的要因。

元気なうちに給餌しなかったことによる体重の減少も人的要因。

そして今日の今日、家に帰ってきた際に強制給餌したのがとどめ。

 

 

 

多分おもちは最後窒息死したんだと思います。

 

 

 

私が殺してしまったんです。「最愛」の息子を。

 

 

 

足が折れてしまったあの時、毎日毎日おもちに謝ったことも、さっきおもちにごめんなにもしてやれなかったと言いながら謝ったことも、すべては偽善。

 

 

 

おもちはうちに来なかったらこんな不幸なことにはならなかったかもしれない。

 

 

 

おそらくその可能性が高いだろう。

 

 

 

おもちは死神のままごとに6年弱付き合わされ、そして亡くなったのだ。

 

 

 

明日おもちを火葬する。

 

 

 

後悔などと言う生ぬるい戯言などおもちの命を取り返す力など当然ない。

 

 

 

悔いても悔いてもおもちは返ってこない。

 

 

 

むしろ私は進んで送り出してしまったんだ。

 

 

 

 

これを書こうと思ったのは、明日火葬する際に棺にいままでの思い出などを書いて一緒に燃やそうと思ったからだが、頭の中でどんな文章をおもちと一緒に送ったらいいのかを考える過程で、今更私が死神であることを強く自覚した。

 

 

 

そしておもちに贈る言葉ではなく、自分を戒めることに変わった。

 

 

 

こんなことを書いてもおもちは喜ばないのに。

 

 

 

全部全部全部全部全部全部全部全部!!!!!!!

私の落ち度だというのに!!!!!!

 

 

この馬鹿は今激しく後悔しているふりをして大泣きしながらこれを書いているが、

なんと愚かなことか!!!!

 

 

 

どこかで自戒と言いながら誰かに慰めてほしいんじゃないかお前は。

 

 

 

行き場のない悲しみ「風」をつらつら意味もなく書き溜めているのではないか?!

 

 

 

お前は一生この文章を書いたことを記憶としても記録としても刻んで生きていくことになるんだ。

 

 

 

 

 

「その日を境におもちの生涯は狂ってしまったのだ。」だ???

 

 

 

 

一生おもちにしたひどい仕打ちを一生忘れることなく死んでいけ!!!!!

 

 

 

お前は命を預かる資格がなかったのだ。

 

 

 

死神なんだから。

 

 

 

大馬鹿がよ!!!!!!!!!!!

 

 

 

 

おもち。

 

 

 

ありがとうございました。

こんなダメな人間にぴょこぴょこ無邪気に寄ってきてくれて。

もちを撫でられて幸せでした。

我々だけしあわせな時間を沢山もらってしまってごめんなさい。

もっと絶対生きられたのに私のせいでこんなことになってしまって。

泣いても泣いても後悔してもおもちは帰ってこないし、だからこそもっともっと知識と行動が必要だったのに。

一生反省して生きていきます。

せめて今は足の痛みもなくなって向こうで走り回っていてくれたらと。

 

 

本当に自分の都合のいいことばかり考えごめんなさい。

愛が足りてませんでした。

 

次会う時におもちに許してもらえるように一生反省して生きていきます。

 

でも許してくれなくて大丈夫です。

 

許されないことは自覚しています。

 

でも最後に我儘を言わせてください。

 

我々が死ぬ時は一目だけでいいので会いにきてくれませんか。

 

その2回だけで良いのでどうかまたその可愛い顔を見せてください。

 

本当にありがとう。そして本当に、本当にすみませんでした。

【C#】Form.Show()するとフリーズする問題の解決【スレッド問題】

こんばんは。まるです。

 

 

今回も私の備忘録兼アウトプットのために記載しますので、

文章内容についてはまとまりのないものになるかもしれませんがご了承ください。

 

 

 

今回のタイトルの件ですが、現在現場で開発しているとあるフォームアプリで、

バックグラウンドスレッド(と思われる)からフォームを開こうとした際に、

フォームっぽいものは一応表示されるものの、そこに配置しているコントロールに関するデータが表示されないという事象が発生しました。

 

 

 

このアプリがどういうフローであったかというと、

 

 

1:アプリを起動する

2:フォーム表示するデータがローカルに存在していた場合、そのデータを用いてフォームを描画する(←これはメインスレッド?からだったので問題なく描画できている)

3:1分毎のポーリング処理をTimer_Tickを使って行い、サーバーに表示対象のデータが作成されていた場合、このポーリング処理でサーバーからデータをローカルに取ってくる

4:フォームを再描画する

5:またこのポーリング処理で、フォルダ監視処理(FileSystemWatcher)を開始し、

特定のフォルダに画像データがおかれた場合に、これをサーバーに逆に送信する。

6:フォルダ監視処理でデータの送信後、ローカルにもデータを保持させ、フォームを再描画する(ここでエラー)

 

 

 

この6の処理で、フォームを新規に描画しようとした際、処理しているのかマウスカーソルが処理中のマーク(ぐるぐる)になり、しばらくすると表示したいフォームが落ちました。

 

 

 

色々調べたのですが、どうやらUIスレッドというスレッドでShowメソッドを実行しないと落ちるんだそうです。

 

 

 

なので描画したいバックグラウンドスレッドなどからInvokeやBeginInvokeなどを使って、

 

 「UIスレッドではないのなら、Invoke(またはBeginInvoke)を使って表示する」

 

という書き方をしてみたのですがうまくいきませんでした。

 

 

まずこの時点でうまくいかなかった理由としては、

 

 「ウィンドウハンドルがない」

 

というのが原因だったようです。

 

 

ウィンドウハンドルがないというのはどういうことかというと、フォームに関するインスタンスの初期化が出来ていないということのようでした。

(=フォームやコントロールが表示されてない=.Showされていない)

 

 

 

ここでふと思ったんです。フォームに関するインスタンスの初期化をUIスレッド以外から行おうと思っても、Invokeしたところでフォームがまだ表示されていない状態だった場合。UIスレッドかどうかを判定するInvokeRequiredメソッドはfalseを返すんですね。

 

 

 

そうするとどうなるか。矛盾が生じます。

 

 

フォームを表示するためにはUIスレッドで行わなければいけない

しかしフォームがメインスレッドでも表示されてないという状態だったらInvokeRequiredがfalseを返す

falseなので通常の.Showで表示しようと試みる

フォームが正しく描画されずフリーズする(UIスレッド外からの実行であるため)

 

 

このループにはまってしまったのです。



InvokeRequiredがfalseであろうが何だろうがInvokeしたらいいじゃん
とも思ったのですがうまくいかないのです。

 

 

 

ウィンドウハンドルを作る方法として、

 

 Form.CreateControl()

 

というものがあるらしく、これを使って強制的にウィンドウハンドルを作ろうとしましたがうまくいくわけもなく、、、

 

 

どないしたらええねん!と思いまして、次に考えたのは、

 

 「じゃあフォルダ監視処理でサーバーにデータ送ったりした後、そのイベントが終わったことをメインスレッドで検知して、メインスレッドから処理させたらいいんじゃね?」

 

ということでした。

 

 

フォルダ監視処理にイベントを作りまして、

このイベントを諸々処理の後に発火→メインスレッドから検知して処理

 

 

とやってみたのですがこの方法ではうまくいきませんでした。

 

 

 

困りに困ったのですが、この再描画処理を代わりに正しくUIスレッドで行ってくれるものを見つけました。

 

 

 

それはSynchronizationContextというもので、これをを使った以下のフローで解決することができました。

 

 

 

1:メインスレッドからTask.Runされた後で

 SynchronizationContext.Current をStaticな自動実装プロパティ(変数でも可)にでも入れておく(SynchronizationContext:スレッド間での操作を調整する仕組みだそうです。)

2:フォームをバックグラウンドスレッド等から更新したいタイミングで、このコンテキストにフォームの描画を「依頼」する

 

 

これでうまくいきました。

 

 

ざっくりどんなコードを書いたかというと

 

 

// 以下のような感じのクラスを用意してコンテキストを保持するためのプロパティを定義しておく(以下はサンプルなので命名が変とか無視してくださいね)

public static Class SyncContextHolder

{

    public static SyncContext { get; set;}
}


次にprogram.csなどで

Task.Runされた後(例えばフォームが描画されるのであればそのフォームのコンストラクタ等)で

 

SyncContextHolder.SyncCotext = SynchronizationContext.Current;

 

を実行してコンテキストを保持する

※コンストラクタのそもそも初期化子という役割から考えるとそのフォームに関係ない

SynchronizationContextの値を更新するのが適切なのかというのは諸説ありそうですが、、、


フォームを開きたい別のスレッドで以下を実行する

※非同期実行しないのであればawaitは除外してください

await Task.Run(() =>
                            {
                                SyncContextHolder.SyncContext.Post(_ =>
                                {
                                     MyForm myForm = new MyForm();
                                     myForm.Show();
                                }, null);
                            });

 

これでUIスレッドにフォームの作成を依頼できるようです。

 

 

Postメソッドを使ってラムダ式で実行したい動作を引数として渡すことで、それをUIスレッドで実行してもらうことができるみたいで、この方法でやっと再描画することができるようになりました。

 

 

 

私もそんなにこういったシステム周りのこととかあんまり詳しくないので

変な説明になってしまって申し訳ないのですが、雰囲気だけわかっていただければ、、、、

 

 

(詳しい人教えてください、、、)

 

 

調べてもなかなかこれだ!という答えにたどり着けなかったのでもしかしたら需要あるかもと思って記録しておきます。

 

 

 

それではまた。