覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

DHMOの危険性に関して考えてみました

最近、ジヒドロゲンモノオキシド(DHMO)というものの存在を知りました。

他サイトからの引用となりますが、DHMOに関して以下のような記載があります。

DHMOの特徴

DHMO は無色透明・無味無臭の物質であり、毎年数千人規模の人を死に至らしめている。

• 酸性雨の主要成分である
• 「温室効果」を促進する
• 火傷の原因となりうる
• 自然景観の浸食の一因である
• 多くの金属の腐食やさびを加速する
• 末期ガン患者から摘出されたガン組織中から見つかっている

このような性質を持つ危険な化学物質であるにも関わらず、人類は知らず知らずにDHMOに依存しています。

このDHMOについて、私自身もどのような危険性があるかを改めて考えてみました。
このエントリは、そのメモとなります。

DHMOの危険性

  • 体内に摂取すると異常な腹痛や下痢を引き起こす場合がある。
  • DHMOによって人間の生命を脅かされるケースがある。実際に亡くなられる方も多くいる。
    • これらの事故に関しては、恐ろしいことに室内外問わずDHMOによる影響であるケースが多々ある。
  • 各種薬物を摂取する人間が、その薬物を体内に取り入れる際にDHMOも同時に摂取するケースが多くみられる。
  • 液化したDHMOを拷問の道具として使っていた時代が存在した。
  • DHMOによる火傷の事例も多くあるが、それと同時に凍傷の事例も見られる。
  • DHMOの摂取によって、急激な頭痛に襲われることがある。
  • DHMOによって視界を奪われることがある、視界を奪われた人間は事故に遭うことがある。
  • 人間がDHMOの存在する空間に居ることで、頭痛・吐き気・意識消失などの症状を引き起こし、病院へ運ばれるケースがある。
  • 人間にとって害のある細菌の繁殖を促進する。
  • DHMOの影響により人間は外傷を負う場合がある。
  • DHMOを体内に摂取することで、鼻に強い痛みを伴う事例が存在する。
  • DHMOの作用によって、体温を奪われ低体温症などになる事例もある。
  • DHMO による影響で爆発現象を起こすケースがある。


DHMOに関連したその他の問題点

  • 液状のDHMOはトイレの洗浄に使われるが、その洗浄能力の有用性から人間が食する野菜などの食材すらもDHMOによって洗浄する場合がある。
  • 危険な物質であるDHMOにも関わらず、人間は一定時間経過するとこのDHMOを異常に欲することがある。
  • DHMOそのものにも依存性があるが、DHMOに他の物質を組み合わせた事でさらなる中毒症状を引き起こす事例が存在する。
  • 多くの危険性があることがわかっていながら、成人だけでなく乳幼児にすらDHMOを摂取させる場合がある。
  • DHMOに関わる詐欺事件の存在が多く報告されている。
  • DHMOは作物などにも影響を及ぼす場合があり、生育状況を極端に悪化させる。
  • DHMOは人間や生物にだけではなく、それ以外の物質にも作用する。例えば、鉄やコンクリートなどに作用し破壊的な影響を与える。
  • DHMO の影響により、存亡の危機にある国家が存在する。
  • DHMOはその有用性が高すぎるゆえに、戦争の道具となる武器の製造過程でも利用されている。


結論

自分が個人的に考えただけでも DHMO の危険性を多く挙げることができました。

DHMOは危険な側面が多くありますが有用な面もあるため、どうしても人間社会は DHMO に依存しなければならないと考えています。
そのため、残念ながら この物質を規制すべき とまでは強く言うことができません。

悲しいですが、人類はDHMOと共存していく方針をとるしかないと思います。


参考リンク

PowerShell - クリップボードの画像データをファイルに保存する

コピーした画像 や コピーしたExcelのセルのデータ などで 画像として保存可能なクリップボード上のデータを保存するためのPowerShellの例です。

Windows 標準の Windows PowerShell (PowerShell 5.x) であれば以下のようなコマンドで
クリップボードのデータを画像として保存できます。

(Get-Clipboard -Format Image).Save("Image-file.png")


が、PowerShell Core(PowerShell 7.x)では、このコマンドはエラーになります(対応していません)


ですので、以下のようなやり方(Windows.Forms.Clipboard)を使います。

この PowerShell は、クリップボードのデータをデスクトップに ImageFile.png という名前で保存する例です。

<# 
コピーしたデータ(クリップボードのデータ)を画像としてデスクトップに保存します。
保存時のファイル名は $SaveImgeFile に定義しています
#>

Add-Type -AssemblyName System.Windows.Forms

# 保存用ファイル名
$SaveImgeFile = 'ImageFile.png'

$DesktopPath = [System.Environment]::GetFolderPath("Desktop")

$clip = [Windows.Forms.Clipboard]::GetImage()

if ($null -ne $clip) { $clip.Save($DesktopPath + '\' + $SaveImgeFile) }


以下のPowerShellは単純にファイル名の頭に現在日時情報を付与した例です。その他は上記の例と変わりません。

<# 
コピーしたデータ(クリップボードのデータ)を画像としてデスクトップに保存します。
保存時のファイル名のSuffixは $SaveImgeFile に定義しています
#>

Add-Type -AssemblyName System.Windows.Forms

# 保存用ファイル名
$SaveImgeFile = 'ImageFile.png'

$SaveFileNamePrefix = Get-Date -Format "yyyyMMdd-HHmmssfff"

$DesktopPath = [System.Environment]::GetFolderPath("Desktop")

$clip = [Windows.Forms.Clipboard]::GetImage()

if ($null -ne $clip) { $clip.Save($DesktopPath + '\' + $SaveFileNamePrefix + '_' + $SaveImgeFile) }


というわけで、クリップボードに画像として保存可能なデータがある状態で、上記のPowerShellを実行すれば画像として保存されます。

Azure SQL Database - SSHポートフォワーディングでのSSMSの設定

Azure SQL Database のDB に SQL Server Management Studio (SSMS) で手元のPC環境から接続したい、
だけど、会社のファイアウォールによって 1433 ポート(SQL Server接続用ポート)での通信が許可されていない。
だから、SSHポートフォワーディング(SSHトンネリング)で 踏み台用サーバ(JumpBox Server)経由で Azure SQL Database と通信する。
というケースは、まーまーあるんだと思います。

で、試しにやってみたら SSMS の接続設定の方法が結構よくわからず意味もなくハマってしまったので、今後のためにメモしました。


前提条件

今回試した環境等の条件です。条件が違っているとうまく行かない可能性もあります。

  • Azure SQL Database の ファイアウォール設定
    • パブリック ネットワーク アクセスの拒否 : いいえ
    • 接続ポリシー : 規定
    • 踏み台サーバのIPアドレスからの接続は許可されている必要があります。
  • 踏み台サーバ(JumpBox Server)
    • Azureの外に配備
      • Azureの中にSSH接続する踏み台サーバを用意すると、今回のやり方ではうまくいかないかもしれません。(ポート 1433 以外も絡んで来る可能性があるため)
  • SSMS
    • 18.8 を使用

本エントリではSSHポートフォワーディングはできている状態を想定しています。
今回の例では、ローカル の 11433 ポートへの通信が結果的に Azure SQL Databaseの1433ポートへの通信となる状況にしています。

ポートフォワーディング等については以下のエントリを参照してください。


SSMSの設定

SSMSの接続設定に関してタブごとに以下のようにします。

ログイン

  • サーバの種類:
    • データベースエンジン
  • サーバ名:
    • 127.0.0.1,11433
      • IPアドレス と ポート番号 の間は : (コロン) ではなく , (カンマ)
      • 11433 のポート番号は、実際のポートフォワーディングの設定に合わせて値を変更してください
    • 認証:
      • SQL Server 認証
      • ログイン: <ユーザ名>@<DBサーバのサーバ名>
        • 例:dbuser@dev-dbserver-01.database.windows.net
      • パスワード:<DB接続用パスワード>

<DBサーバのサーバ名> は、Azure portal で対象の SQL Database の概要に、「サーバー名」として表示されている値です。

f:id:nini_y:20210424235108p:plain


接続プロパティ

  • データベースへの接続:<接続するDB名>
    • 例:Dev-DB-01
  • 暗号化接続:チェックON
  • サーバー証明書を信頼する:チェックON


Always Encrypted

デフォルトのまま


追加の接続パラメーター

デフォルトのまま(空白)


SSMSの接続の設定画面 例

実際に設定をしたSSMSのサーバへの接続ウィンドウの状況は以下のとおりです。

f:id:nini_y:20210425000153p:plain

f:id:nini_y:20210425000407p:plain

f:id:nini_y:20210425000416p:plain

f:id:nini_y:20210425000426p:plain


まとめ

ここに記載した設定をした状態でSSMSで「接続」を行えば、Azure SQL Database へのDBに接続できます。



関連サイト

Azure SQL Databse と SQL Server のバージョン

以下、ほぼメモです。

Azure SQL Databseは、Azureで提供されているフルマネージドの PaaSデータベース エンジンで、
最新の安定したバージョンの SQL Server データベースエンジンおよびパッチが適用された OS 上で実行されているものです。


で、例えば 2021年4月時点でAzure SQL Server上のDBに接続して、

SELECT @@VERSION

という内部のバージョンを確認するSQL (T-SQL) を実行すると以下の結果が返ってきました。

Microsoft SQL Azure (RTM) - 12.0.2000.8
Feb 20 2021 17:51:58
Copyright (C) 2019 Microsoft Corporation


12.0.2000.8 という値だけに着目すると SQL Server 2014 の エンジンのバージョンの 12.0.2000.8 と一致しているので、
SQL Server 2014 が動作してるということなのかな。とか一瞬思ったのですが、
それは大いなる勘違いで
Azure SQL DatabseSQL Server のエンジンのバージョンは異なっているとのことです。


上記ページの前半の重要に以下のように書かれています。

SQL Server と Azure SQL Database のデータベース エンジンのバージョン番号は類似のものではありません。
別個の製品に与えられる内部製造番号になっています。 
Azure SQL Database のデータベース エンジンは SQL Server データベース エンジンと同じコードに基づいています。
最も重要なことですが、Azure SQL Database のデータベース エンジンには常に最新の SQL データベース エンジン ビットが与えられます。
Azure SQL Database のバージョン 12 は SQL Server のバージョン 15 より新しくなります。


というわけで、Azure SQL Database が返してきた 12.x というエンジンのバージョンは、
SQL Server のエンジンバージョン15.x と同等(か、それ以上)という感じで、結果的に SQL Server 2019 と同等ということになるようです。

Azure SQL Databseのサービスの定義通り、最新バージョンの SQL Server が動作してるようです。

Windows 10 - バージョン情報の確認・取得方法

Windows 10 を使っていて、一概に Windows 10 といっても定期的に大きなバージョンアップが行われていて、
そのバージョン次第でサポート切れみたいなこともあります。

今までの Windows に比べても今、このPC バージョンいくつ何だっけ? という確認をしなければならない場面が多い気がします。


視覚的に確認

複数確認できる場所(手順)がありますが、とにかく以下の手順が一番手っ取り早いです。

1) Windowsキー + R キーを押して、ファイル名を指定して実行のウィンドウを表示

2) winver と入力してOK

f:id:nini_y:20210423094633p:plain

3) Windows のバージョン情報が表示されます

f:id:nini_y:20210423094700p:plain

上記の赤枠の部分です。バージョンは、20H220H2 (OS Build 19042.928))ということになります。


PowerShell で 取得

ウィンドウ等で視覚的に確認でもよいんですが、文字情報(文字列)としてバージョンを取得したい場合もあるかもしれません。PowerShellを使いましょう。

20H2 よりも前か、 20H2 (以降) か でやり方がちょっと異なります。

Windows 10 20H2 よりも前

以下のいずれかのコマンドで取得できます。後者のコマンドだとちょっと時間がかかります。

$CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
"Version " + $CurrentVersion.ReleaseId + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
$ComputerInfo = Get-ComputerInfo
"Version " + $ComputerInfo.WindowsVersion + " (OS Build " + $ComputerInfo.OsBuildNumber + "." + $ComputerInfo.WindowsUBR + ")"


実行例

PS C:\Users> $CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
PS C:\Users> "Version " + $CurrentVersion.ReleaseId + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
Version 2004 (OS Build 19041.572)

Version 2004 (OS Build 19041.572) というバージョン情報が取得できています。


Windows 10 20H2

Windows 10 20H2 (以降) でも上記のコマンドでバージョン情報は取得できます。

Windows10 20H2 の PC で実行すると以下のようになります。

PS C:\Users> $CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
PS C:\Users> "Version " + $CurrentVersion.ReleaseId + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
Version 2009 (OS Build 19042.928)

Version 2009 (OS Build 19042.928) というバージョン情報が取得できています。

2009 というのは内部的なバージョンで間違った値ではないんですが、
Windows 10 の バージョンの表記が分かりにくいとかいう色々なことがあったらしく、
内部的にはこれまでと同じルールの 2009 という値を持ってますが、 バージョンのラベルとして 20H2 という表記になったようです。


では、20H2 という値はどこから取ればいいのかというと、
レジストリの \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersionDisplayVersion に保持されているので、そこから取得します。

f:id:nini_y:20210423101259p:plain


先のPowerShellのコマンド で $CurrentVersion.ReleaseId としていた部分を $CurrentVersion.DisplayVersion に変更すればよいことになります。

というわけで実行するコマンドとしては以下になります。

$CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
"Version " + $CurrentVersion.DisplayVersion + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"


ワンライナーにするなら以下(セミコロンで区切っているだけ)

$CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"; "Version " + $CurrentVersion.DisplayVersion + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"


実行例

PS C:\Users> $CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"; "Version " + $CurrentVersion.DisplayVersion + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
Version 20H2 (OS Build 19042.928)


無事に Version 20H2 (OS Build 19042.928) という値を取得できました。


両方まとめると

Windows 10 20H2 よりも前と 20H2以降 の環境をまとめて扱うなら、
上記に書いてきた内容をひとまとめにして以下のようなコマンドで値を取得できます。

$CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" 
if ($CurrentVersion.DisplayVersion -ne $null) { $DispVersion = $CurrentVersion.DisplayVersion } else { $DispVersion = $CurrentVersion.ReleaseId }
"Version " + $DispVersion + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"