OmniAICreator/Qiita-1.07M huggingface dataset:
【VMware】open-vm-toolsとvm-tools入れ替え

#ANSIBLEのVMテンプレート展開のモジュールでハマった
https://docs.ansible.com/ansible/latest/modules/list_of_cloud_modules.html#vmware

verはESXi6.7,ANSIBLEは2.7
`vmware_guest`モジュールでRHELの展開をしたんですが、定義したはずのホスト名とIPアドレスがつきませんでした。
CPUとかメモリ、ディスクの反映はOKなのに。。

Windowsは問題なかったので調べていると、RHELの<font color="Blue">"open-vm-tools"</font>が原因のようでした。
<br>
ESXiには`”vmware-tools"`というVMware社製のソフトウェアがバンドルされていて、VM環境の利便性やらに効果的なツールですが、似たツールで
`"open-vm-tools"`というLinuxディストリビューション版の”vmware-tools"があり、RHELのインストール時に自動で入ってきます。ややこしことすな。
https://www.climb.co.jp/blog_vmware/vmware-6346
→両者の機能に大きな違いはないのですが、同じツールに見えてかつバージョンが異なって見えるので、気持ち悪いっちゃ気持ち悪い。
↓
RHELのopen-vm-tool
![20191108212847.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/c65f111c-4605-88ab-2037-5a0d6cc6f117.jpeg)

ESXi標準のvmware-tools
![20191108213000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/52c5f5f1-2ef1-bb6f-6e8a-7fec984df460.jpeg)

しかもたまに読み込まれずに、
”VMware Tools 実装環境がゲスト OS 上にインストールされていますが、この実装環境は VMware によって管理されていません。VMware Tools のステータスは不明です。”
と表示されることもあるようで。
<br>
てことで、 open-vm-toolsとvm-tools入れ替え手順です。
※前提としてperlコマンドを使えるようにしておきましょう。

#open-vm-toolsアンインストール
###RHELにログインして、open-vm-toolsがあるか確認。

```
[root@dan_go01 ~]# rpm -qa |grep open-vm
open-vm-tools-10.2.5-3.el7.x86_64
```
ありますねえ！ 

###アンインストール

```
rpm -evh open-vm-tools
```
<br>
#vmware-toolsインストール
###・vCenterで、仮想マシンのサマリ→詳細からisoをドライブにマウントできます。
###・ドライブを使用できるようにします。

```
mount /dev/cdrom /mnt
```
###・マウントポイントへ移動

```
cd /mnt
```
lsで確認すると、
<font color="Blue">VMwareTools-10.3.5-104xxxxx.tar.gz</font>
というファイルがあるので、これを作業ディレクトリにコピー

```
cp -p VMwareTools-10.3.5-10430147.tar.gz /root/VMwareTools/
```
###・作業ディレクトリに移動して解凍
```
cd /root/VMwareTools
tar -zxvf VMwareTools-10.3.5-104xxxxx.tar.gz
```
解凍するとvmware-tools-distribというフォルダができ、中を確認すると、
"FILES" "INSTALL" "bin" "caf" "doc" "etc" "installer" "lib" "vgauth" "vmware-install.pl"
があります。使うのは<font color="Blue">vmware-install.pl</font>です。
###・インストーラ実行

```
./vmware-install.pl
```
インストールパスとかいろいろ聞かれます。基本デフォルトでOK。

 

これで再度Ansible実行すると、IP,ホスト名まで読み込んで展開してくれるようになります。
今回の問題に限らず、

・vCenterを介する
・仮想マシンを使ったタスク
・windowsとRHELどちらかでうまくいかない

ってことがあれば、このVM管理ツールを合わせてみるのがいいかもしれません。
<br>
以上。
PMMPプラグインをPhpStormでパパっと書こう!

https://qiita.com/CostlierRain464/items/0629a7aee0fcb15f41a3

こちらの記事のオマージュ(?)です。
クソお世話になりました。

## PhpStormでPMMPの補間を効かせるために

### 前準備

適当なフォルダにPocketMine-MP.pharを配置。
フォルダのパスをメモ

### プロジェクトで補間を効かす

上の記事のcomposer.jsonを作る直前までをまず済ませます。

次に、Configure -> Settings -> Languages & Frameworks -> PHPを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271071/263b1cc0-5eb5-82a3-33e2-f1b2ef9c94c9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271071/20b46098-e193-8edb-81d3-d192bcc692b6.png)

右下の`+`ボタンでPMMPを配置したフォルダのパスを追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271071/35e7bc5c-ccd1-431d-c3e3-4bb16bc230c1.png)

この状態になれば終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271071/2fc2a707-15cb-0e0e-dd4c-8e16418aaa1e.png)

## デモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271071/d9fb1da2-97e1-87f6-5666-d309b98b5b1d.png)
Compilation of OpenFOAM v1912 with runTimePostProcessing

runTimePostProcessing functionality is not available in precompiled packages of v1912.

I will note how to compile OFv1912 with runTimePostProcessing.

Refs:
- [OpenFOAM® Quick Build Guide v1912](https://develop.openfoam.com/Development/openfoam/blob/maintenance-v1912/doc/Build.md)
- [OpenFOAM® ThirdParty Build](https://develop.openfoam.com/Development/ThirdParty-common/-/blob/v1912/BUILD.md)


```
cd $WM_THIRD_PARTY_DIR
makeParaView
```

check the VTK version with the following command.

```
cat ParaView-v5.6.3/VTK/CMake/vtkVersion.cmake
```

If the version is 8.2.0, create a link with the name of VTK-8.2.0.

```
ln -s ParaView-v5.6.3/VTK/ VTK-8.2.0
```

Now, compile the VTK.

```
makeVTK
```

Then, prepare for the OF compilation.

```
wmRefresh
cd $WM_PROJECT_DIR
export ParaView_DIR=$WM_THIRD_PARTY_DIR/ParaView-v5.6.3
export VTK_DIR=$WM_THIRD_PARTY_DIR/build/linux64Gcc/VTK-8.2.0/
```

Finally, compile OpenFOAM-v1912.

```
foam
./Allwmake -j -s -l
```

You can check the functionality with tutorials/incompressible/simpleFoam/windAroundBuildings.

You can build ParaView 5.6.3, including with the ability to use Python and MPI. Options are same as explained [here at OpenFOAM WiKi](
https://openfoamwiki.net/index.php/Installation/Linux/OpenFOAM-v1806/Ubuntu). 

It may be easy if you use a script like [this example provided in a ThirdParty directory.](https://develop.openfoam.com/Development/ThirdParty-common/-/blob/master/makeParaView.example)
【Rails】本番環境でターミナルでデータベースを確認してみる【デプロイ物語】7/20訂正

#### 本番環境でデータがちゃんと保存されているのかみたいんだけど、Sequel Proとかないじゃん！どうしたらいいの？<br>なときは下記の流れでSequel Proなどと同じようにデータベースが確認できます。

####7/20 訂正：本番環境でもSequel Pro使えるそうです！ご指摘により判明。方法はまた別途お知らせできればと思います。

※Sequel Pro
　Mac用のMySQLのデータを可視化しやすいGUI操作で管理するためのアプリケーション


#### 【バージョンやら環境】
Rails 5.2.4.3
Ruby 2.5.1
macOS Catalina 10.15.4
Capistrano 3.14.1
MySQL　5.6.47 
Unicorn 5.5.3
Nginx 1.16.1


#### 【前提】
Capistranoの自動デプロイに成功している
AWS　EC2インスタンスにてログイン成功済み


#### 【手順】

### まず、本番環境に移動します。
ホームディレクトリから以下のコマンド入力

```
cd .ssh/
```
```
ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
```

[ec2-user| …となればログイン成功。

次に本番環境でアプリディレクトリへ移動。

```
cd  /var/www/アプリディレクトリ/current/
```

※ currentディレクトリを指定している理由
私の場合、本番環境で参照しているのはcurrentディレクトリ(以下に入っているデータ）になるそうなのですが、
「おそらく」下記のようにに記述しているためだとおもわれます。（Unicornを用いた自動デプロイの設定時にcurrentディレクトリの中を参照するように、という記述）

```ruby:config/unicorn.rb
working_directory "#{app_path}/current"
```

<br>

### つぎに、いよいよデータベースをみていきます。

```ruby:currentディレクトリにて
mysql -u root -p   
```

```ruby:データベースは何があるかの一覧
show databases;
```

```ruby:見たいデータベースをXXXXに指定する
use　XXXX;
```

```ruby:テーブルの一覧
show tables;
```

```ruby:テーブルの構造をみる（カラム名とか、データ型とかみれます。）xxxxにテーブル名入力。
describe xxxx;
```

```ruby:指定したテーブルの中身をみる。xxxxにテーブル名入力。
select * from xxxx;
```

コレで見れるはずです！！！



#### 【参考にさせていただいたサイト】
参考にさせていただいたサイトがあったのですが、
控え忘れてしまい探せなくなっていました・・・
見つけ次第掲載したいです。


#### 【あとがき】
SequielProがなくても、ターミナルで見れる。
っていうのは当たり前なんだけどGUIに慣れてしまうとあわあわしちゃいますね・・
現役エンジニアの先輩曰く、現場ではターミナルをガンガン使うらしいです。
いまから慣れておきたいな〜と思います。
情報処理試験のハナシ

投稿の初心者につき書き方が今ひとつかも。。ごめんなさい。

さて、IT業、特にSIer関連の方には、おなじみ、
情報処理技術者試験を攻略したい方向けに少しだけ。
試験の初心者向けの記事です。

投稿者は

- 第二種情報処理技術者(現:基本情報処理技術者)
- ソフトウェア開発技術者(現:応用情報処理技術者)
- 情報セキュリティスペシャリスト(現:情報処理安全確保支援士)

を保有しており、試験にパスする要点を記載したいと思います。


#情報処理試験って？？？
経産省(旧:通産省)が始めた、情報処理に関する知識を問う学力テストのようなアレです。
今となっては、情報処理安全確保支援士のみ、士業扱いになりましたが、学力テストの延長です。

---

##攻略のポイント(〜基本情報)
~~筆者が取った第二種(1999年)の頃から、午前、午後とも、4択マークシートです。~~
(訂正)午前:4択、午後:多肢選択+4択でした。以降の表現も多少ずれるところがありますが言いたいことは、半分ガチで正解すればほぼ受かる、だとご理解ください。

全設問の1/2をガチ正解できれば、あとは鉛筆転がしで受かります。

合格ラインが60%程度に設定されており、
62.5%(ガチ50%+ランダム期待値12.5%)を取れたら受かるんです。

全問のうち、半分だけ正解するなら楽なモンじゃないですか？
試験時間2倍みたいなものですよ。

##攻略のポイント(応用情報)

最近の過去問を見ても、昔とさして変わりませんでした。
午後のプログラミング問題だけは、過去問を復習する。
コードを書いていない人は[Wandbox](https://wandbox.org/)で練習するのが良いでしょう。CoderOnly!

午前は基本情報までと一緒。半分解けるように頑張りましょう。

##攻略のポイント(情報処理安全確保支援士)
情報処理安全確保支援士は、事例解析が多く、国語色がとても強い。
むしろ、IT系より、文系のパイセンの方が楽かもしれません。

だって、出題文の中にヒントがありまくるし、場合によっては答えも。

ITに関する知識がそこそこあり、読解力のある方ならば、
悪くても数回でどうにかなると思います。
(逆に何度も落ちる方はお察しください。。)

午前は応用などを取ってパスするのがおすすめ。

---

最後に、会社によっては報奨金が出たりしますので、
サクっと取って給料を増やすのが良いと思います。
勉強が金になるのは悪くないでしょ？
【Linux】オフラインでパッケージを更新する

オフラインのRHELサーバでのパッケージ全体の更新。

更新したいタイミングで、外部接続できる別のRHELサーバから更新ファイルをダウンロードして転送するしかないようです。
ここでは更新したいサーバが完全にオフラインで独立しており、単発でアップデートしたい場合を想定しています。
バージョンは7.5

前提：
サーバがRHELサブスクライブ登録されており、同じOSバージョンであること。
 
外部接続のできるサーバで、更新ファイルをダウンロードします。

```
mkdir /tmp/rpms
yum update --exclude=kernel* --skip-broken --downloadonly --downloaddir=/tmp/rpms/
```
カーネルアップデートしたくないので`--exclude=kernel*`をいれてます。
エラーが出る場合は`--skip-broken`オプションで依存性問題のパッケージをスキップ。
<br>
※ちなみに、新規パッケージを持ってきたい場合は以下コマンド

```
yum install <Packagename> --exclude=kernel*  --downloadonly --downloaddir=/tmp/rpms/
```
依存パッケージも一緒にダウンロードされます。
<br>
ダウンロードされたパッケージが格納されているrpmsフォルダを、更新したいサーバに転送します。ここでは/tmp/以下に転送したとします。

更新したいサーバで、転送されたファイルからアップデートします。

```
yum localupdate /tmp/rpms/*
```
単発一回であればこれが一番楽な気がします。yumリポジトリ作る必要ないし。
新規パッケージをインストールする場合は`localinstall`コマンドを使います。

両サーバが疎通できるようであれば、ローカルリポジトリを作成する方法もあります。
https://qiita.com/hijiri0404/items/eea563f34d2f73ef04bf

<br>
以上。
[Windows Terminal] WSL端末起動時の初期ディレクトリをホーム(~)にする

## 前提

- Windows 10 バージョン 1903 以降

## 結論

設定(`settings.json`)の対象WSLディストリビューションのプロファイルで、開始ディレクトリ(プロパティ名:`startingDirectory`)にホームパスを指定する。

例えば、"Ubuntu-18.04" のディストリビューションなら次のようになる。

```JSON
{
    "name": "Ubuntu-18.04",
    "commandline" : "wsl -d Ubuntu-18.04",
    "startingDirectory" : "//wsl$/Ubuntu-18.04/home/<Your Ubuntu Username>",
}
```

というか、公式のトラブルシュート資料にそのまんま答え（下記参考）がある。

## 参考

- [[Microsoft] Windows ターミナルでのトラブルシューティング-「起動時にホーム`~`ディレクトリで開始するように WSL ディストリビューションを設定します」](https://docs.microsoft.com/ja-jp/windows/terminal/troubleshooting#set-your-wsl-distribution-to-start-in-the-home--directory-when-launched)
- [[Microsoft] Windows ターミナルでのプロファイル設定](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-settings)
[AWX] AWSアカウント内の特定のEC2をインベントリーに追加する


AWX使用時に、あるAWSアカウント内の特定のEC2をインベントリーに追加するときの手順です。

公式ドキュメントにも解説があります。
[公式ドキュメント](https://docs.ansible.com/ansible-tower/3.7.1/html_ja/userguide/inventories.html#amazon-web-services-ec2)

### 手順


- 「認証情報」から対象のAWSアカウントの認証情報を追加する。（アクセスキー、シークレットキーを入力
）
<img width="808" alt="スクリーンショット 2020-07-17 23.54.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186724/9eb28b95-9be5-2de6-3b41-1853413406d6.png">

- インベントリー設定で「ソース」のフィールドに移動し、下記のように設定。
    - ソース：Amazon EC2
    - 認証情報：作成した認証情報を選択
    - リージョン：リージョンを選択（複数選択可）
    - インスタンスフィルター：フィルター指定する。EC2全台ではなく、指定したフィルターのいずれかに一致するEC2がインポートされる。

下記の例では、東京リージョンにある「AWX」タグの値が「awx」であるEC2インスタンスのみがインベントリーに追加されます。

<img width="800" alt="スクリーンショット 2020-07-18 0.01.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186724/ad18072d-b80d-2683-a540-a26f1fa5e0a4.png">

タグ以外にも、様々なメタデータを使用してフィルターできるようです。(未検証、詳細は下記)
[DescribeInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html)

### 使用例
CloudFormationを使用してEC2を起動時にタグを付与
↓
AWX側で上記タグでフィルター
↓
同じアカウントにある既存のEC2はインポートされず、新たにタグを付与したEC2のみがインベントリーに追加される



### まとめ
使用例のような時に既存のEC2までインポートされる事態を防ぎたく方法を調べました。
便利そうなのでタグ以外にも活用してみたい。
競プロで使うための GO 入門 ～配列～

# Index
- [はじめに](https://qiita.com/CamouflageSix/items/ab004a1078f491bd15ef)
- [Hello World](https://qiita.com/CamouflageSix/items/05e5a0f9616e28d6fca4)
- [標準入出力]
- [変数・定数]
- [制御構文]
- [配列～](https://qiita.com/CamouflageSix/items/41d901b9b170d5565895)
- [ソート]  
- [関数](https://qiita.com/CamouflageSix/items/afb42d399a27f5ca3cf8)

# Arrays（静的配列）の宣言と初期化

- 固定長でありサイズの変更はできない
- 初期値は `0`
- Slice より高速

```Go:
// 宣言
var a [3]int                   // 宣言のみ
var b [3]int = [3]int{4, 5, 6} // 宣言＋初期化
c := [...]int{7, 8, 9}         // 動的型付け

// 代入
a[0] = 1
a[1] = 2
a[2] = 3

// 表示
fmt.Printf("a=%d\n", a) // -> a=[1 2 3]
fmt.Printf("b=%d\n", b) // -> b=[4 5 6]
fmt.Printf("b=%d\n", c) // -> c=[7 8 9]

// 要素のみ表示
fmt.Printf("a[0]=%d\n", a[0]) // -> a[0]=1
```

# Slices（動的配列）の宣言と初期化
- 可変長でありサイズの変更ができる
- 初期値は `Nil`
- Array より低速
- 宣言のみの場合、要素数を設定 `make()`または追加 `append()`する必要がある

```Go:
	// 宣言
	var a []int                  // 宣言のみ
	var b []int = []int{4, 5, 6} // 宣言＋初期化
	c := []int{7, 8, 9}          // 動的型付け

	// 要素数設定
	a = make([]int, 3)

	// 代入
	a[0] = 1
	a[1] = 2
	a[2] = 3

	fmt.Printf("a=%d\n", a) // -> a=[1 2 3]
	fmt.Printf("b=%d\n", b) // -> b=[4 5 6]
	fmt.Printf("b=%d\n", c) // -> c=[7 8 9]
```
Slice は `append()` で要素の追加ができる

```Go:
c = append(c, 10)
fmt.Printf("c=%d\n", c) // -> c=[7 8 9 10]
```

# 長さと容量
Allays, Slice ともに、要素数は` len()` で取得できる

```Go:
c := [...]int{7, 8, 9}
fmt.Println(len(c)) // -> 3
```

# 多次元配列の宣言と初期化

```Go:
N := 2
M := 3
grid := make([][]int, N)
for i := 0; i < N; i++ {
    grid[i] = make([]int, M)
    for j := 0; j < M; j++ {
        grid[i][j] = j
    }
}
fmt.Println(grid) // ->[[0 1 2] [0 1 2]]
```

# 参考
https://golang.org/
【初めての Github 】その２　リポジトリにファイル・フォルダを作成する

#・はじめに#
先日GitHubでソースを公開しようと、人生で初めて GitHub に登録しました。
今後Githubを活用しようと考えている人のために３回に分けて私の体験談（操作手順）を投稿していきます。

本当に超・初心者向けの内容となります。

前回の投稿（その１）では、Githubのアカウント作成とリポジトリの作成について記載しました。
今回は作成したリポジトリの中にフォルダ作成する方法とファイルアップロードする方法についてです。

・その１　**[アカウント作成～リポジトリ作成](https://qiita.com/kura_yu/items/eb45fcd3286cdb2db636)**　**（投稿済）**
・その２　リポジトリにファイル・フォルダを作成する　**（本記事）**
・その３　README.mdファイルの作成方法　**（未投稿）**

#・前提#
各操作はブラウザ版のGithubで行っています。

#・共通処理#
ファイル作成、ファイルアップロード、フォルダ作成の全てにおいて共通の操作です。
**１．Githubのマイページを表示します。**

**２．ファイルを作成するリポジトリを選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/7bd122ac-3d1e-ca89-9702-2fdfce1a2fd9.png)

**３．「Add file」をクリックします。**

**４．ファイルもしくはフォルダをGithub上で作成する場合は「Create new file」をクリックします。**
　　**ファイルをアップロードする場合は「Update files」をクリックします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/8e79505c-3c8a-2c71-214a-42d202897568.png)

##・ファイルを作成する場合 ##
**５．「Name your file...」にファイル名を入力します。**

**６．「Edit new file」の下にファイルの中身を記載します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/9c6b36e6-11cf-be98-7144-0f02af03d730.png)
**７．保存する前に Commit する際のコメントを残すことができます。**
　　下記は全て任意ですので書かなくても保存することはできますが、変更履歴として残せる部分なので書いておいた方が後々良いです。

　　➀コメントのタイトルを記載します。※未入力の場合は「Create ファイル名」と保存されます。
　　➁コメントの詳細を記載します。※未入力の場合は空白で保存されます。
　　➂「Commit directly to the master branch.」を選択します。

**８．「Commit new file」ボタンをクリックしてファイルを Commit（保存） します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/daa339d1-ffce-8552-ea23-8a663492a2c9.png)

##・ファイルをアップロードする場合 ##
**５．ドラッグ＆ドロップでアップロードするファイルを下図赤枠内に移動します。**
　　アップロードしたファイルは下図赤枠の下に表示されていきます。
　　**※フォルダ単位でアップロードすることも可能です。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/62153af2-2d2a-0077-0e5e-b22e4d2d4776.png)

**６．保存する前に Commit する際のコメントを残すことができます。**
　　下記は全て任意ですので書かなくても保存することはできますが、変更履歴として残せる部分なので書いておいた方が後々良いです。

　　➀コメントのタイトルを記載します。※未入力の場合は「Add files via upload」と保存されます。
　　➁コメントの詳細を記載します。※未入力の場合は空白で保存されます。
　　➂「Commit directly to the master branch.」を選択します。

**７．「Commit changes」ボタンをクリックしてファイルを Commit（保存） します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/3f635cc0-7150-5f15-db01-eab45d4bf8e0.png)

##・フォルダを作成する場合 ##
**３．「Add file」をクリックします。**

**４．「Create new file」をクリックします。**

**５．遷移先のページで「Name your file...」にファイル名を入力します。**

**６．ファイル名の最後に **「/ （スラッシュ）」** を入力します。**
「/」を入れるとフォルダであると自動的に判断してくれますが、**フォルダだけをCommitすることはできません。**
フォルダ内に１ファイル以上必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/02c08278-2126-180a-ab1b-e5c121484a6f.png)

**７．作成したフォルダの下で一時的なファイルを用意します。**

**８．「Commit new file」ボタンをクリックしてファイルを Commit（保存） します。**
Commit後、７～８で作成した一時的なファイルは不要であれば削除してください。
（さっさと覚える）LINUXコマンドラインの使い方

# Linuxのコマンドライン?
linuxを使い始めたばかりの人はdeleteと入力くらいしかわからない方がほとんどだと思いますが、まず初めにショートカットなどを覚えておくと超便利なのでここに書いておきます。

# 速攻で必ず覚えたい操作

## emacsの使い方
LINUXのコマンドラインはデフォルトではEMACSなのでそもそもEMACSの使い方になりますが、以下が必ず覚えておきたいショートカット一覧です。
（※最初のうちはコマンドが短くて困らないかもですが、すぐに長いコマンドが必要になって、あー矢印キーでの移動面倒だなぁとなります）

* Ctrl + A カーソルを先頭に移動。
* Ctrl + E カーソルを末尾へ移動。
* Ctrl + K カーソルよりも後ろをすべて削除
* Ctrl + U カーソルよりも前をすべて削除

上のショートカットは必ず覚えてください！！！必須です。
## コマンドの中断
* Ctrl+C：コマンドを中断できます。


## シェルの終了
* exit：exitこまんどで終了できます

## tabによる入力補完
* 一回のタブで自動入力：例えばabc.txtというファイルとacd.txtというファイルがディレクトリに存在する場合、そのディレクトリで「ab」と打って「tab」を打つと、abc.txtと自動で入力してくれます。（これは動画のほうがわかりやすいですね。。）

* 二回のタブで候補表示：「a」で「tab」を打った場合、abc.txtとacd.txtが二つあるのでどちらか判断できません。ただ、「a」で「tab」を二回連続で打った場合、両方のファイルを候補として表示してくれます！便利ですね。

## コマンドの履歴を見る
### 矢印キー
コマンドの履歴は矢印キーの上と下で見ることができます。
上方向キーは古いものへ、下方向キーは新しいものへ移動します。
※テキストで書くのは難しいので、動画を見るか実際に試してみてください。

### historyコマンド
矢印キーでさかのぼることも出来るのですが、hisotoryコマンドを使えば過去の履歴を一気に表示できます。

本当にただ打つだけです。

```bash
history
```

少し発展して、historyの中から探したいものを見つけるには以下コマンドが便利です。

```bash
history | grep 検索したい文字列
```

→この「|」は「パイプ」と読み、コマンドの結果を次のコマンドの入力にすることができます。詳細についてはここでは書きませんが、上の例ではgrepにhistoryの結果を渡してあげると考えてください。grepはその渡されたhistoryコマンドの結果から、検索したい文字列を探し出します。

一つサンプルを上げると、こんな感じ。awsという文字列が入った履歴を抽出してくれます。

```bash
history | grep aws
```

少し多いなと思ったらheadやtailで件数を絞り込む、またはlessに渡してあげてじっくり見るといいでしょう。

```bash
history | grep aws | tail
```

※historyコマンドで出てきたコマンドは「！」と履歴の番号で直接実行することができます。
基礎から学ぶ　人工知能の教科書　第5章　章末問題

# はじめに
機械学習の勉強として、「*[基礎から学ぶ　人工知能の教科書](https://www.ohmsha.co.jp/book/9784274224263/)*」 を読んでいます。

この本の特徴は、章末問題に`Python`の簡単なプログラムが載っていてるところです。

ここでは、それを`Ruby`にて写経しています。
# 第5章　章末問題
```neuralnet.rb
INPUTNO = 2
HIDDENNO = 2

def forward(wh, wo, hi, e)
  HIDDENNO.times do |i|
    u = 0.0
    INPUTNO.times do |j|
      u += e[j] * wh[i][j]
    end
    u -= wh[i][INPUTNO]
    hi[i] = f(u)
  end
  o = 0.0
  HIDDENNO.times do |i|
    o += hi[i] * wo[i]
  end
  o -= wo[HIDDENNO]
  f(o)
end

def f(u)
  return 1.0 if u >= 0
  0.0
end

wh = [[-2, 3, -1], [-2, 1, 0.5]]
wo = [-60, 94, -1]
e = [[0, 0], [0, 1], [1, 0], [1, 1]]
hi = [0] * (HIDDENNO + 1)

e.each do |i|
  puts "#{i}->#{forward(wh, wo, hi, i)}"
end
```
単純な階層型ニューラルネットの計算で学習なしですが、26行目のインデントに誤りがありますのでお気を付けください**（2019年9月25日　第1版第1刷発行）**

```error.py
for i in range(HIDDENNO):     #誤

    for i in range(HIDDENNO): #正
```
ご存知の通り、`Python`でのインデント誤りは致命的と思われますが、幸い、オーム社の書籍ページよりサンプルコードをダウンロードすることができます。
*[基礎から学ぶ　人工知能の教科書](https://www.ohmsha.co.jp/book/9784274224263/)*

```step.rb
def f(u)
  return 1.0 if u >= 0
  0.0
end

 # 出力例
[0, 0]->0.0
[0, 1]->1.0
[1, 0]->1.0
[1, 1]->0.0
```
伝達関数`f`はステップ関数

```Sigmoid.rb
def f(u)
  1 / (1 + Math::E ** -u)
end

 # 出力例
[0, 0]->0.0006265270712940932
[0, 1]->0.6434453861326787
[1, 0]->0.0003334059232134918
[1, 1]->8.512503196901111e-16
```
伝達関数`f`はシグモイド関数

```ramp.rb
def f(u)
  return u if u >= 0
  0.0
end

 # 出力例
[0, 0]->0.0
[0, 1]->1.0
[1, 0]->0.0
[1, 1]->0.0
```
伝達関数`f`はランプ関数
# まとめ
+ 第5章まで読んだ
yukicoder contest 257 参戦記

# yukicoder contest 257 参戦記

## [A 1113 二つの整数 / Two Integers](https://yukicoder.me/problems/no/1113)

公約数の個数が奇数の時は、最大公約数が何らかの数の2乗で表せるときだけ. isqrt は Python 3.8 で新しく実装された関数です.

```python
from math import gcd, isqrt

A, B = map(int, input().split())

X = gcd(A, B)

if isqrt(X) * isqrt(X) == X:
    print('Odd')
else:
    print('Even')
```

なおテストが弱いので、最大公約数が 10<sup>7</sup> 以下の数で割り切れなければ Odd と出力して、そうでなければ普通に最大公約数を素因数分解して約数の個数を求めるでも AC できます. なんで最大公約数が 10<sup>9</sup> 以上の素数の場合とかテストケースにないんですかね? (と解けなくて嘘解法で AC した分際で言う).

```C++
#include <bits/stdc++.h>
#define rep(i, a) for (int i = (int)0; i < (int)a; ++i)
using namespace std;
using ll = long long;

int main() {
    ll A, B;
    cin >> A >> B;

    ll X = gcd(A, B);

    if (X == 1) {
        cout << "Odd" << endl;
        return 0;
    }

    bool flag = false;
    for (ll i = 2; i < 1e7; i++) {
        if (X % i == 0) {
            flag = true;
            break;
        }
    }

    if (!flag) {
        cout << "Odd" << endl;
        return 0;
    }

    ll result = 1;
    ll t = 0;
    while (X % 2 == 0) {
        t++;
        X /= 2;
    }
    result *= t + 1;

    for (ll i = 3; i < (ll)(sqrt(X) + 1); i += 2) {
        if (X % i != 0) continue;

        ll t = 0;
        while (X % i == 0) {
            t++;
            X /= i;
        }
        result *= t + 1;
    }
    if (X != 1) {
        result *= 2;
    }

    if (result % 2 == 0) {
        cout << "Even" << endl;
    } else {
        cout << "Odd" << endl;
    }

    return 0;
}
```

追記: テストが追加されて、C++ 嘘解法版がリジャッジで死んでいたので、通るコードを書いた(笑).

```C++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll isqrt(ll n) {
    ll ok = 0;
    ll ng = 3037000500;
    while (ng - ok > 1) {
        ll m = ok + (ng - ok) / 2;
        if (m * m <= n) {
            ok = m;
        } else {
            ng = m;
        }
    }
    return ok;
}

int main() {
    ll A, B;
    cin >> A >> B;

    ll X = gcd(A, B);

    if (isqrt(X) * isqrt(X) == X) {
        cout << "Odd" << endl;
    } else {
        cout << "Even" << endl;
    }

    return 0;
}
```

## [B 1114 足し算盆に返らず](https://yukicoder.me/problems/no/1114)

奇数の和は偶数なので、奇数だけ出せば勝てます.

```python
N = int(input())

print(*range(1, N + 1, 2))
```

後半だけ出しても勝てます.


```python
N = int(input())

print(*range(N // 2 + 1, N + 1))
```
【ANSIBLE】vSphereモジュールの前提条件

ANSIBLEでvmwareのモジュールを使いたい時のメモ
サーバはCentOS7.5、ANSIBLE2.7

pipコマンドがない場合はインストール

```
yum -y install gcc python-devel
curl -L https://bootstrap.pypa.io/get-pip.py | python
```
<br>
pyvmomiインストール

```
pip install pyvmomi
```

これで操作できます。
ちなみにvmwareモジュールはvCenterに対してコマンド発行するため、vCenterが必須なので注意。
<br>
いじょう
OpenFOAM v1912 with AOCC

### 最初に・・・
今回が初投稿となります。不出来なところもあろうかと思いますが，ご容赦ください。また，本記事も結局のところ，計算の高速化を達成できていません。もし，本件で何かご存知のことがあれば，コメントいただければ幸いです。

# 今回の目的
AMDから提供されているコンパイラAOCCを用いて，OpenFOAM v1912をソースからビルドし，自前のRyzen7 3700での計算を少しで良いので高速化しようというのが目的になります。

# ビルド環境
- Ryzen7 3700
- Memory 32GB (この情報は不要だとは思いますが）
- Ubuntu 20.04 LTS
- AMD Optimizing C/C++ Compiler ver.2.1 (2020.6.10での最新版) (以下，AOCC)
- OpenMPI (ver. 4.0.3) (Ubuntu20.04LTS でデフォルトで入るもの)


# AMD AOCCの準備
何をおいてもAOCCダウンロード，インストールしないことには始まらない。ということで，[ここ](https://developer.amd.com/amd-aocc/)からコンパイラのdebファイルをダウンロード。

```bash:install
sudo apt install aocc-compiler-2.1.0_1_amd64.deb
```

これで，__/opt/AMD/__ 内にコンパイラがインストールされます。同ディレクトリ下にある設定用のシェルを叩いて，clangが見える様にします。

```bash:install
source /opt/AMD/setup.sh
```

```bash:pathcheck
which clang
```

として，パスが通っていればAOCCのインストールは完了です。

# OpenFOAM v1912のソースコンパイル準備
## AOCC版のSource file探訪
人それぞれ趣向が異なりますので，何とも言えませんが，私は``/opt/``ないしは``/pub/``下に様々なパッケージを置くことを好んでいます。今回も``/pub/``下にソースを展開し，コンパイルすることにしました[^1]。
[^1]: ちなみに，デフォルトの使用では ``/home/hoge/OpenFOAM/``下に展開してコンパイルする様なインストラクションが出されていますが，基本，どこで作業しても支障はありません。

OpenFOAM.orgからソースをダウンロードし，

- OpenFOAM-v1912
- ThirdParty-v1912

上記の様に展開，詳細は後述するbashrcの設定を``GCC → Clang``にしてコンパイルをしたのですが・・・，
結論からするとコンパイルできませんでした。コンパイルオプションがAOCCCのclangに合致していないのが原因の様です。

そこで色々と彷徨ったところ，OpenFOAMのgitlabに[issue](https://develop.openfoam.com/Development/openfoam/-/issues/1627)として上がっていました。ここを辿ったところ，DeveloperのMarkさんという方がAOCC修正したソースを上げてくれていることを発見。先にダウンロードしたソースは削除し，[ここ](https://develop.openfoam.com/Development/openfoam/-/tree/b3464d8afc60aab71c9ea166bb34b8f68a3b75ad)のものに入れ替えました。

## 環境変数修正の苦悩
これでAOCC修正ありのソースが手に入りましたので，まずは，OpenFOAMのパスを通します。パスの設定は，``/installDir/to/OpenFOAM-v1912/etc/bashrc``にあります。この中の，``WM=COMPILER``を以下のように修正します。

```
export WM_COMPILER = Amd
```

また、原因はわからずじまいでしたが、ThirdPartyDirが/installDir/to/OpenFOAM-v1912/ThirdPartyのような設定になってしまっていました(ThirdPartyが不要な方はスキップください)。

そのため、/installDir/to/OpenFOAM-v1912/etc/config.sh/setupを以下のように修正しました。

```
WM_THIRD_PARTY_DIR="/installDir/to/ThirdParty-v1912"
```
これで、``source /installDir/to/OpenFOAM-v1912/etc/bash``とすれば環境設定が完了するはずです。

# コンパイル
あとはOpenFOAM-v1912のディレクトリに移動し、``Allwmake -j 4``などのように並列コンパイルしてあげれば作業は完了です。

# で，計算速度は？
OpenCAE学会で利用されている[チャンネル流れチュートリアル](https://www.j-focus.jp/uploads/2017/01/a779d4694fa6553bbf216020be7bf7de.pdf)で，gcc版，aocc版とで比較を行いました。

```
OF v1912 with AOCC(AOCCコンパイル対応のSource(develop.openfoam.com #1627)からビルド)
 AOCC ver.2.1
 OpenMPI 4.0.3
 シングル計算：938sec
 4並列: 475sec
```
```
OF v1912 with GCC (OpenFoam.com Sourceからビルド)
 gcc(Ubuntu 9.3.0-10ubuntu2) 9.3.0
 OpenMPI 4.0.3
 シングル計算：986sec
 4並列:478sec
```

ということで，全く早くなりませんでした。
この結果ですが，[こちら](https://www.hpc.co.jp/tech-blog/2020/01/27/amd-epyc-rome-performance-validation-no2/)でも同様の傾向が出ているようですし，15th OpenFOAM Workshopで投げかけたところ，そんなもんとのコメントでしたので，これ以上の深堀りは辞めました。
【ActiveDirectory】ユーザ構成の設定を無視する

あるドメインユーザにユーザの構成ポリシーの定義をいれたGPOを適用すると、どのコンピュータにログインする場合でもそのユーザである限り設定は共通になるかと思います。

これを、特定のコンピュータにログインする場合のみ適用させたい・適用させたくないって場合の話。
たとえば、

```
OU1
所属：コンピュータ1、ドメインユーザ1
GPO：コンピュータの構成【update有効】、ユーザの構成【IE設定有】
```
```
OU2
所属：コンピュータ2
GPO：コンピュータの構成【update無効】
```

こんな感じだったとすると、ドメインユーザ1はユーザの構成ポリシー【IE設定有】を適用しています。
で、ドメインユーザ1でコンピュータ2にログインしたいけど、IE設定は適用させたくないって時に使えるのが<font color="Red">"ループバック処理"</font>です。

## 【設定方法】
OU2のGPOの編集より、
「コンピュータの構成」－「管理用テンプレート」－「システム」－「グループポリシー」－
「ユーザーグループポリシーループバックの処理モード」＝「有効」にし、［置換］を選択する。
<br>
この「置換」を選択することで、OU1に設定されている"ユーザの構成ポリシー"の設定を無視できます。
ちなみに「統合」も選べますが、それぞれの動きとしては、

```
「置換」、、OU1のユーザ構成ポリシーを適用し、その後OU2のユーザ構成ポリシーに置き換える。
```
```
「統合」、、OU1のユーザ構成ポリシーを適用し、維持したままOU2のユーザ構成ポリシーを適用する。
```

無視というよりかは、OU2にユーザ構成ポリシーの定義がないので、結果的に"何も設定されていないOU2のユーザ構成が置き換えられて適用される"ことになるわけですな。

「統合」は読んで字のごとく2つのOUのユーザ構成定義が共存する形です。今回の例ではIE設定は残ることになりますね。
ちなみに定義が競合した場合はOU2側のユーザ構成ポリシーが優先になるようです。

図でも書けばわかりやすかったんですがめんどくさいのでゆるして。あと解釈間違ってたら教えてください… 

ループバック処理、便利だとは思いますが乱用すると実際に設定される定義がゴチャゴチャになりそうですね…
なるべくADの設計段階できっちり組織・定義を分けておくことをオススメします。
<br>
以上。
HTMLとCSS学習要点(随時更新予定)

- p要素やh2要素で囲んだテキストは改行される。

- HTMLでは、hrefのような属性が数多くあり、開始タグの中に記述する。

- 値を指定する際は、ダブルクォーテーション（"）を忘れないように注意する。

- 要素を要素で囲むことを入れ子と言う。

- 入れ子構造の要素がある場合は、インデント（字下げ）をする。

- インデントは必須ではないが、インデントをすることで、入れ子構造が複雑になっても親子関係がわかりやすくなる。

- font-familyプロパティを用いると、フォントの種類を指定することができる。

- フォント名にスペースがある場合は、ダブルクォーテーションで囲う。
ex)Avenir Next

- 「#dddddd」のように同じ値が続く場合は、「#ddd」と省略できる。

- 文字コードを指定することで、ページの文字化けを防ぐことができる。

- li要素にlist-styleプロパティを用いてnoneを指定すると、リストの先頭のマークを消すことができる。基本的に先頭の黒点は必要ないので、消すようにする。

- header-logo」と「header-list」にそれぞれfloat: left;を指定することで、ロゴとリスト全体を横並びにすることができる。

- 要素にボーダー（枠線）をつけるには、borderプロパティを用いる。枠線の太さ、種類、色を指定して使用する。上下左右すべてに線を付けたい場合はborderとし、特定の場所にのみ付けたい場合は「border-bottom」のように、「border-方向」とする。

- <input>要素は１行のテキスト入力を受け取るための要素である。

- <textarea>要素は複数行のテキスト入力を受け取るための要素である。<input>要素は終了タグが不要な点に注意する。

- 送信ボタンにも、<input>要素を用います。<input>要素にはtype属性を指定することができ、type属性にsubmitを指定すると、入力欄ではなく、送信ボタンになる。ボタンに表示されるテキストは、日本語のブラウザではデフォルトで「送信」になる。
ex)<input type=“submit”>

- ボタンに表示されるテキストを変更することも可能。value属性に任意の値を指定することで、ボタンに表示されるテキストを変更することができる。
ex) <input type=“submit” value=“保存”>

- aタグはインライン要素であり、インライン要素にはwidthやheight、上下のmarginが指定できないなど不便な点がある。

- aタグは初期状態でインライン要素になっているが、displayプロパティを使うと、インラインブロック要素に変更することができる。

- ボタンのように、「共通の部分があるが、それぞれ小さい変化をつけたいとき」にはクラスの名前を複数指定すると便利である。

- containerクラスのように、広い範囲を囲うようなブロック要素の場合はmarginを、テキストやボタンのようなインライン要素・インラインブロック要素の場合はtext-alignを使うようにする。

- アイコンを表示するにはFont Awesomeというものを使うと便利である。

- opacityプロパティは要素全体を透過させますが、rgbaを使うとその色だけを透明にすることができる。

- transitionを使うとアニメーションをつけることができる。「変化の対象」や、「変化にかかる時間」などを指定できます。transitionは多くの場合hoverと組み合わせて使う。

- h1~h6の要素は初期状態でfont-weight: bold;となっているので、font-weight: normal;と指定すれば文字が細くなる。

- 通常、HTMLでは要素同士が重なって表示されることはない。しかし、CSSを用いることで要素同士を重ねることができる。position: absolute;を使うと、要素同士を重ねて表示することができる。サイト全体の左上部分を基準とし、そこからの位置をtopとleftを用いて指定する。また、rightやbottomを併用することも可能。

- position: absolute;の基準位置はサイト全体の左上部分であるが、この基準位置は変更することができる。基準としたい親要素にposition: relative;と指定すると、その要素の左上部分が基準位置となる。

- セレクタにactiveを用いることで、要素がクリックされている間だけCSSを適用することができる。 セレクタ:activeというように指定する。

- z-indexプロパティは、要素の重なりの順序を指定する際に使用する。 z-indexは整数値で指定し、値が大きいほど上に表示される。z-indexプロパティは必ずpositionプロパティと併用する必要があるので、注意する。
【初心者向けじゃない記事】ブロック要素でもインライン要素でもなくセクショニングルート要素

# どうも、7noteです。セクショニングルート要素とは何者か？

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/sectioningroot/
メモ：NSUserDefaults#synchronizeは使うな

[公式ドキュメント](https://developer.apple.com/documentation/foundation/userdefaults/1414005-synchronize)にも記載があるように使用が非推奨となりました。
[iOSプログラミング：NSUserDefaultsのsynchronizeメソッドは気安く使ってはいけない](https://dentakurou.hatenadiary.org/entry/20180105/p1)で経緯?でまとめられています。
再再再再再翻訳を一括でする

#はじめに
　再翻訳なるジャンルをご存知でしょうか。昔話などを日本語→英語→・・・→日本語のように翻訳していくと面白い結果が得られるというあれです。

　某動画投稿サイトでも５ヶ国語で翻訳リレーした歌詞を歌う方が現れるなど、ニッチながらも盛り上がりを見せているように感じます。文章は基本的に翻訳サイトで生成するのですが、翻訳の過程をみると、言語が変わるたびに何度もテキストを切り貼りしています。

　なので、５ヶ国語の再翻訳を一括でできるスクリプトを書いてみました。

#環境
- Google Spreed Sheet
- Google Apps Script

#表示画面
　あまり突っ込まないでください。
![入力前.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/afd6d2a8-f1c7-391c-5cf3-6703247ad2d2.png)

#言語表
![言語表.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/44435418-0e6b-a123-a795-f3cbe9d0852d.png)

　[Googleの言語サポートページ](https://cloud.google.com/translate/docs/languages?hl=ja)から持ってきてます。

#コード
```javascript:translate.gas
function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); //シートを取得
  var sentenceSheet = spreadsheet.getSheets()[0];    //文章のシート
  var langageListSheet = spreadsheet.getSheets()[1]; //言語表のシート

  //言語表を配列に読み込む
  var langageList = langageListSheet.getRange(1, 1, langageListSheet.getLastRow(), 2).getValues();

  //言語を文字コードに変換（例：英語→en）
  const langToCode = (lang) => {
    for(var i = 0; i < langageList.length; i++){
      if(langageList[i][0] === lang){
        return langageList[i][1];
      }
    }
    return 1;
  };

  var text = sentenceSheet.getRange(3, 1).getValues();
  var langages = sentenceSheet.getRange(2, 2, 1, 5).getValues()[0];

  langages.unshift('ja');

  for(var i = 0; i < langages.length; i++){
    var code = langToCode(langages[i]);
    if(code === 1){
      sentenceSheet.getRange(3, i+2).setValue('翻訳できません');
    }else{
      langages[i] = code;
    }
  }

  langages.push('ja');

  //翻訳してシートに書き込む
  for(var i = 0; i < langages.length-1; i++){ 
    text =  LanguageApp.translate(text, langages[i], langages[i+1])
    sentenceSheet.getRange(3, i+2).setValue(text);
  }
}
```

#やってること
　GASのLanguageApp.translateという関数を使って翻訳しています。翻訳したい言語をリストに変換して後はループを回してます。

#結果
　『吾輩は猫である』で試してみました。
![最終結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/b54dc6a8-2352-63a4-bb52-6c811e53da26.png)

原文
「吾輩は猫である。名前はまだない。どこで生れたか頓と見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ち付いて書生の顔を見たのがいわゆる人間というものの見始であろう。この時妙なものだと思った感じが今でも残っている。第一毛を以て装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にも大分逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中が余りに突起している。そうしてその穴の中から時々ぷうぷうと烟を吹く。どうも咽せぽくて実に弱った。これが人間の飲む烟草というものである事は漸くこの頃知った。」

再再再再再翻訳後
「吾輩は猫である。名前なしでそれがどこで生まれたのか私は知りません。暗く湿った場所で泣いたことを覚えています。ここで人に会うのは初めてです。また、後で聞いたところ、人類史上最悪の種族だったそうです。書道の話は時々私たちを捕まえ、沸騰させます。でも、その時は知らなかったので、悪くないと思いました。手のひらの上に置いて持ち上げると、少し流れが感じられます。手のひらで少し落ち着いて生徒の顔を見たとき、それはいわゆる人間性の始まりだったのかもしれません。まだまだ感じていました。顔は、最初に髪で装飾する必要があり、滑りやすく、薬のように見えます。その後、大分県に会いましたが、そのような車輪を見たことはありませんでした。これだけでなく、顔の特徴の助けを借りて、あなたは不思議を行うことができます。繰り返しになりますが、これはこれらのプロセスに費やす必要があることを意味します。今、私は人々が喫煙することが一つあることを知っています。」

#おわりに
　この猫は沸騰させられてから大分県に会ったそうです。

　ご覧いただきありがとうございました。質問・ご指摘等ありましたらよろしくお願いします。

#選ばれた言語について
一応選んだ理由があります。
英語　←　忖度して
中国語　←　話者が多い
エスペラント語　←　希望をこめて
パンジャブ語　←　響きが面白かった
ベトナム語　←　ベトナム行きたい
【Linux】Proxy適用

プライベートなサーバからProxy経由で外に出たい！な場合
確認OSはRHEL9.4
いくつか設定できる箇所がある。

# `/etc/environment`
適用範囲: システム全体
読み込みタイミング: シェルに依存せず主にログイン時に読み込まれる。シェルスクリプトから直接は読み込まれない
特性:
環境変数を設定するためのファイル。システム全体で共通の環境変数を設定するため、各ユーザーに対して一貫している。コンテナからも参照できる

```shell:/etc/environment
HTTP_PROXY="http://proxy.example.com:port"
HTTPS_PROXY="http://proxy.example.com:port"
NO_PROXY=.local,172.10.0.0/24,host01
http_proxy="http://proxy.example.com:port"
https_proxy="http://proxy.example.com:port"
no_proxy=.local,172.10.0.0/24,host01
```
no_proxyはproxy経由させたくない場合に使用。(ローカル通信など)
カンマで区切って複数指定できる

# `/etc/profile`
適用範囲: ログインシェル
読み込みタイミング: ログインシェルが起動される際に読み込まれる
特性:
Bashやその他のシェルの設定を行うためのファイル。ユーザーがログインしたときに実行されるスクリプトで、一般的にユーザーごとに異なる環境設定を行うことができる。
他のスクリプトや設定ファイル（`/etc/profile.d/` 内のファイル）を呼び出すこともできる。
```shell:/etc/profile
export HTTP_PROXY="http://proxy.example.com:port"
export HTTPS_PROXY="http://proxy.example.com:port"
export NO_PROXY=.local,172.10.0.0/24,host01
export http_proxy="http://proxy.example.com:port"
export https_proxy="http://proxy.example.com:port"
export no_proxy=.local,172.10.0.0/24,host01
```

`/etc/profile.d/` 内のファイルも記載内容としては同様

ユーザ毎に設定したい場合は、`bashrc` か `.bash_profile` に
以下がわかりやすいです

https://qiita.com/shyamahira/items/260862743e4c9794b5d2


特定のプログラムやデーモンには個別にプロキシ設定が必要な場合もあるため、その場合は該当アプリケーションの設定ファイルを編集すること。

例）
redhat subscription managerの参照先をプロキシにしたい場合は`/etc/rhsm/rhsm.conf`
dockerでも以下の設定が必要。
```console:
[root@host01 docker.service.d]# pwd
/etc/systemd/system/docker.service.d
[root@host01 docker.service.d]# ls
override.conf
[root@host01 docker.service.d]# cat override.conf
[Service]
Environment = 'http_proxy=http://user:P@ssw0rd@172.21.0.254:8080' 'https_proxy=http://user:P@ssw0rd@172.21.0.254:8080' 'no_proxy=localhost,127.0.0.1'

[root@host01 docker.service.d]# systemctl daemon-reload
[root@host01 docker.service.d]# systemctl restart docker
```


# 適用の順番（上から）
ログインシェル＝ユーザーがログインする際に起動するシェル(SSH/コンソールでのログイン、su - など)
```
/etc/environment (環境変数の設定)
/etc/profile (システム全体のログインシェル用設定)
/etc/profile.d/*.sh (追加の設定スクリプト)
~/.bash_profile (ユーザー個別のログインシェル用設定)
~/.bashrc (ユーザー個別の非ログインシェル用設定、~/.bash_profile 内で呼び出されることが多い)
```

非ログインシェル=既存のシェルから新たに起動されたシェル(端末エミュレータを開いたときやスクリプトから呼び出されたとき)
```
/etc/environment (環境変数の設定)
~/.bashrc (ユーザー個別の非ログインシェル用設定)
```

# 適用・確認
即時反映させるには以下コマンド
```
# source /etc/environment
```

確認
```
# printenv
```
ちなみにproxypac等を利用していた場合、PROXYにpacのパスをそのままいれても効かないので注意です。
【Windows】オフラインでライセンス認証手順

ライセンスコードはあるけどOS自体が外部に出られない場合。
確認バージョンは2016。Win10でも同様手順かと。

評価版の場合はまず製品版へアップグレードします。 
プロンプトを開いて、以下コマンドを実行。

```
DISM /online /Set-Edition:ServerStandard /productkey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula
```
XXXXXはライセンスコードを入れましょう。
`ServerStandard`の箇所は対象のエディションです(ServerDatacenterなど)。
プロダクトキーのインストールが完了すると再起動しろと言われます。
<br>
はじめから製品版の場合は、
コントロールパネルからシステム→プロダクトキーの変更からコードを入れます。
　※ボリュームライセンスの場合、プロダクトキーを発行してもらうために電話する必要があります。

その後、外部接続できれば認証されていますが、されていない場合はマイクロソフトの認証センターへ電話する必要があります。

プロンプトで以下コマンドを実行。

```
slui 4
```
以下のような画面が立ち上がります。
![20190611181713.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/620f7f1e-4148-305d-f010-a26589da791c.jpeg)
地域・国を選択すると電話番号が表示されるので、そこへかけます。
で、上記画面のようにA-Hまで6桁ずつ数字を入力していくと。地味にめんどいです。 

認証できればライセンスが有効になります。
<br>

※slui 4 コマンドを実行すると、「電話で認証できない」旨のエラーが表示されることがあります。その場合の手順は以下。
①コマンドプロンプトで以下コマンドを実行

```
slui 3
```
②プロダクトキーを入れるウィザードが表示されるので、キーを入力

③以下のようなエラー画面(ここでは英語)が出てくる(おそらく外部接続経由でアクティベートしようとした？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/9a394996-e52a-21d8-5a5d-b4bd1a2b898d.png)

④closeし、プロンプトで以下コマンドを実行

```
slui 4
```
⑤地域選択画面が出てくるので、該当の地域を選択して次へ

⑥あとは画面の指示通り、サポートセンターへ電話をかけてID入力

これで認証できます。
<br>
以上。
いまさらだけどSubversionからGitへ移行する（その3-a: .NET AssemblyInfo）

[こちらの](https://qiita.com/hkato/items/4417add7ed415d32df07)つづき

.NET Core + Git の場合のベストプラクティスが知りたいです。教えて下さい。

## SVN のリビジョンの AssemblyInfo への埋め込み

SVN を使った、.NET Framework プロジェクトの場合、`AssemblyInfo.cs` の `AssemblyVersion` の `Revision` 部にはビルドスクリプトなどで [SVN Rev を埋める事例](https://www.google.com/search?q=assembly+version+svn+rev+siite%3Astackoverflow.com)が多く私も行っていました。こちら .NET Core の場合は事情が異なっている模様[^1]。

```cs
// revision = 4567 は
// SVN Rev -> `(git log --online).Length` 等により、とりあえず導出
[assembly: AssemblyVersion("1.2.3.4567")]
```

## Git hash の AssemblyInfo 情報の埋め込み

これを Git の hash に置き換えて、

```cs
[assembly: AssemblyVersion("1.2.3.b34f896")]
```

としても `AssemblyVersion` が数値ではないのでエラーになるはず。

ここで、　`AssemblyInformationalVersion` には任意の文字列を指定できるので、

```cs
[assembly: AssemblyVersion("1.2.3.4567")]
[assembly: AssemblyInformationalVersion("1.2.3.4567-b34f896")]
```

などとすると、 `AssemblyVersion` の要件を満たしつつ、`AssemblyInformationalVersion` に Git の情報も埋め込めるので CI を行うには良さそう。

## 実際の製品では？

MSBuild を実行している時に SHA1 hash らしき情報が見えたなぁ、と思って調べてみると、 MSBuild など Microsoft 製品で Git 管理のものには hash 値を利用している様で [GitHub で公開されているソースコードのタグと hash が一致](https://github.com/microsoft/msbuild/tags)する。

![msbuild-properties.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132537/6d426644-702a-5ee8-b88d-5fa683b9d3f6.png)

しかし、そもそも MSBuild は SVN から移行したものではないし、上記の `16.6.0.22303` の revision 部　`22303` をどうやって導出しているか不明。ソースコードを見ればよいが、ちょっと追いかけられず挫折した（たぶん[ここら辺か？](https://github.com/microsoft/msbuild/tree/master/src/Shared)）。 Git 管理の AssemblyInfo のベストプラクティスがあれば知りたい。[^2]

## 当面の移行

SVN Rev を利用していた部分 `AssemblyVersion` や `AssemblyFileVersion` には `(git log --oneline).Length` 等を利用し、余裕や必要に応じて 
`AssemblyInformationalVersion` には Git の SHA1 hash か short hash などを組み合わせた値を埋め込みたいと思う。**私は。**

[^1]: .NET Core の場合、基本的に `AssemblyInfo.cs` はなくなり、`*.csproj` から[自動生成される](https://docs.microsoft.com/ja-jp/dotnet/core/tools/csproj)ということらしい。私は未だに .NET Core に移行しておらず、公式ドキュメントやネット検索などからの情報だが。

[^2]: 手元で MSBuild v16.6.0.22303 をビルドすると `16.6.0-dev-20367-01+5ff7b0c9e829bb22e21e1738b42c7fcef051dfb2` となった。`-dev` などを含めると良さそう。
多項ロジスティック回帰分析とは？

#多項ロジスティック回帰
- **多クラス分類**を可能にしたロジスティック回帰

- 値域が[0,1],総和が1になるように線形予測子を変形しようとするモデル。

- 大きく**「名義ロジスティック回帰」**と**「順序ロジスティック回帰」**に分かれる

①名義ロジスティック…クラス間に特別な順序がない場合の多クラス分類
**ex)男子=0,女子=1**

②順序ロジスティック…クラス間に特別な順序がある場合の多クラス分類。
**ex)好き=0,それほど好きではない=1,嫌い=2**

#多クラス分類の場合は

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/1508a8d0-4819-67b6-9467-e3511ff0c057.png" class="img" alt="データ"><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/f0662975-a2d6-d768-6551-4e0c231ff183.png" class="img" alt="データ">

#p1=〇の形にすると？

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/93d15be7-c327-c480-cd0e-f03c3ef1d2b0.png" class="img" alt="データ">

#最適化方法とは？
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/b1e0eb99-d126-2b6a-02ae-3b7bcf026cc9.png" class="img" alt="データ"><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/5b84d8eb-0a6c-5f9c-3849-225571b49cfd.png" class="img" alt="データ">


#実験
**今回はsklearnライブラリのデータセットを使って分析をしてみたいと思います。**

```py
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits

digits = load_digits()
X=digits.data
y=digits.target

images_with_labels = list(zip(digits.images,digits.target))

plt.figure(figsize=(15,6))

for idx,(image,label) in enumerate(images_with_labels[:10]):
    plt.subplot(2,5,idx+1)
    plt.imshow(image,cmap=plt.cm.gray_r,interpolation="nearest")
    plt.title("{}".format(label),fontsize=25)
plt.show()
```

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/be6579d2-6a44-4112-143a-a5c5e28e5a21.png" class="img" alt="データ">




```py
from sklearn.metrics import confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

scaler=StandardScaler()
X_scaled=scaler.fit_transform(X)

X_train,X_test,y_train,y_test=train_test_split(X_scaled,y,random_state=0)

print(log_reg.score(X_train,y_train))
print(log_reg.score(X_test,y_test))

prediction=log_reg.predict(X_test)
confusion = confusion_matrix(prediction,y_test) #混合行列生成
print(confusinon)
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/b75393f0-9409-b957-467b-5d1e7f948494.png" class="img" alt="データ">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/e9253dd5-979c-fd79-36a4-bda53634d221.png" class="img" alt="データ">
CallKitを使ったアプリのリジェクト対応

# 経緯
中国を含む世界各国のAppStoreにて配信しているアプリにCallKitを使った機能を実装して申請したところ、リジェクトされました。
調べたところ、どうやら2018年あたりからリジェクトされるようになったみたいです。

[Apple、CallKit使用アプリが中国で取り下げ。背景には政府の存在？](https://www.gizmodo.jp/2018/05/callkit-cancel.html)
[アップルのCallkitが中国大陸地区で使えなくなった！](https://lxr.co.jp/blog/7813/)

# リジェクト対策
[stackoverflow](https://stackoverflow.com/a/51319158)を参考に下記対策を行い、リプライしたところ、無事審査が通りました。

```swift:リジェクト対策
if Locale.current.regionCode != "CN" {
    // CallKitを使った処理
}
```

```md:返信
We do not use CallKit features for users in China. We detect the user's region using Locale.
```
【VMware】Can't have a partition outside the disk!

CiscoのUCSへESXiをインストールしようとして怒られた話。
UCSはC240m5,ESXiは6.5

インストールを実行すると、、
![20190301210623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/4fa0b99c-f434-d222-2356-77dd057ee264.png)
なんだァ？テメェ...

「Can't have a partition outside the disk!」とあるのでパーティションの問題ですね。
画像は見切れていますが、画面下の方に問題のLUNのパスが記載されているのでメモします。

ALT+F1
でプロンプトへ。rootパスワードは空でログインします。

```
cd /dev/disks
```
でLUNのパスディレクトリへ移動

```java:ls-l
eui.00a05046xxxxxxxxx
eui.00a05046xxxxxxxxx:1 
```
末尾に:1と数字がついているものがパーティションです。こいつが原因でした。

このエラーは 、LUN 上にESXiインストールで作成されるパーティションとは別の、既存のパーティションが存在する場合に発生するようです。
UCSで内部にmicroSDを持っている場合ははじめからパーティションが切られているようですね。

てことでパーティションをESXi用のGPTラベルで作成しなおしましょう。

```
partedUtil setptbl /dev/disks/eui.00a05046xxxxxxxxx gpt
```

リブート

```
reboot
```
これでインストールできるはずです。
<br>
以上。
自宅からAWS RDSへ直接接続する

# 概要
開発中アプリの動作確認のためにAWS RDSに作成したデータベースへ直接接続したかった。

自宅 → EC2 → RDS

とEC2を踏み台にする方法はすぐ見つかったが、

**自宅 → RDS**

と直接接続する方法を探すのに少し手こずったので、メモしておく。

※あくまでデバッグ用なので、用が済んだら自宅からのアクセス権は剥奪しておく方がよいかも。

# RDSの設定　（パブリックアクセシビリティ）
もうデータベースは作成済みとして説明する。


まずはデータベースを**パブリックアクセス**できるようにする。
これをしてもすぐに誰でもアクセスできるようになるわけではないから大丈夫。

Amazon RDSの**データベース**を開き、データベース一覧の左のラジオボタンで選択して**変更**ボタンを押す。
設定変更画面が開く。
※停止している場合、変更ボタンが押せないかもしれないので、そういう場合は起動して**利用可能**になるまで待つ。
![eaeeda4a1105e67b2e65761cf5272c39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516267/1a5c8a86-9848-b25d-bb97-d480427d57be.png)


**ネットワーク & セキュリティ**の欄にある**パブリックアクセシビリティ**を**はい**に設定して、変更を適用する。
データベースが落ちたりしても問題なければ、**変更のスケジュール**で**すぐに適用**を選択してしまえば、変更がすぐに適用される。

![3360b7b47766684aab3f79b863dba4c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516267/c6493007-96ba-90b3-8d21-885de5664fa2.png)



# RDSの設定　（セキュリティグループ）

次に**セキュリティグループ**の設定を変更して、**自宅のIPアドレス**からアクセスできるようにする。
ここを適当に設定してしまうと誰でもウェルカムになってしまうから気をつけて。


再びAmazon RDSの**データベース**を開き、データベース一覧のアクセスしたいデータベース名をクリックして、メニューを開く。
**接続とセキュリティ**タブの**セキュリティグループのルール**欄に、現在データベースが所属しているセキュリティグループが表示されている。
今回は既存のセキュリティグループに自宅IPからのアクセス許可を追加してしまおうと思う。
セキュリティグループ名をクリック。
![92f4503f1f6be196fd832ac2acb80250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516267/5536aa33-831c-4ca0-0ebf-21b2cd1e3e3c.png)

続いて開くセキュリティグループ一覧で、先程データベースが所属していたセキュリティグループのどれかにチェックを入れ、インバウンドルールの編集を開く。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516267/09faf76b-3195-da0f-cd47-4d8fdc9dc275.png)

**ルールの追加**を押し、タイプは**MYSQL/Aurora**を選択、ソースに**自宅のIPアドレス/32**を入力してルールの保存をする。
※自宅のIPアドレスは[確認くん](https://www.ugtop.com/spill.shtml)などで調べる。

![f93a4c14bb527893db5b953c8fe19b09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516267/8c8f0032-ba20-2492-c874-ac705ff0eacb.png)


ここまででAWS RDSの設定は完了。自宅から直接アクセスできるようになった。


# アクセス例　（Node.jsを使用）

アクセスしてみる。
ちょうど今勉強中のNode.jsを使ってみる。
確認できれば別になんでもOK

```typescript
import mysql from 'mysql';

const dbConfig = {
    host: process.env.RDS_HOSTNAME!,        // RDSのエンドポイント
    user: process.env.RDS_USERNAME!,        // RDSのユーザ名
    password: process.env.RDS_PASSWORD!,    // RDSのパスワード
    database: process.env.RDS_DATABASE!,    // 接続するデータベース名
    port: 3306,
}

const connection = mysql.createConnection(dbConfig);
connection.connect(err => {
    if (err) {
        console.error('connection failed: ' + err.stack);
        return;
    }
    console.log('connected.');
});
connection.end();
```

```sh
connected.
```

できたみたい。
ディープラーニングG検定を受けてみた感想

## 1.ディープラーニングG検定?

公式によると「ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているかを検定する。」
オンラインで検定を受けられて、制限時間は120分。
合格率は2/3程度の模様。

問題としては、
-機械学習の歴史
-機械学習の手法(ディープラーニング関連が厚め)
-機械学習関連の法規
 
みたいです。

2020年の第2回は受験料が半額なんで、受けてみました。

## 2.どんな人が受ければよいのか?

機械学習を発注する部門の人かなという気がします。
昇格の時に資格がなんか必要とかいうときに、重宝しそうですね。
(周囲に取得した人がいないと、難易度も分からないし、なおさらGood)


## 3.勉強方法について
### 3.1 一般論
　ググると「文系」でも、「ノンプログラマー」でも受かりましたみたいな記事が結構見つかります。
　確かに数学とか、プログラミングとか一切できなくても受かる試験ではあります。
　しかしながら、問われている知識は、具体的な機械学習のテクニックだったりするので、機械学習とかをやったことがない人だと、<strong>ワケ分からんけどとりあえず受かりました</strong>という感じになりそう。
(発注する側も、<b>それぐらい知っておけや</b>というメッセージを感じます)

　G検定の合格一直線からはかなり遠くなってしまうのですが、<strong>Pythonを覚えてMNISTの手書き文字の認識</strong>ぐらいまではできたほうがよいかなあと…。

　なので、G検定の教科書買うよりも先に、書店にあるTensorflowとか書いてる本を1冊買って、勉強するとよいと思います。

### 3.2 自分自身の勉強について

　試験の4,5日前から、kindleで半額で買えた「徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集, 明松真司, インプレス」を解いてみた。最初から9割ぐらい分かったので、間違った部分をちょろちょろとメモしたぐらい。10時間も勉強していない(他の勉強のほうが忙しいし)

普段から、ディープラーニングで遊んでいたら、自然と受かりました。
資格を取るという気持ちではなく、
<b>ディープラーニングで遊ぶ</b>という感覚が重要なんですよ。


## 4.メリット

自身に関係なく、受けた直後に部署内でG検定が広まったので、ちょうどよかった。
これをネタに、イロイロと遊べそう。
elm-uiのmouseOverをつけたり消したりするのはSafariだとできない?

# これなに
* elm-uiで条件によってmouseOverを有効にしたり無効にしたりするコードを書いた。
    * たのしい
* ところが、このコードはブラウザ依存性があるらしいことがわかった。
* ついでに他のElementやElement.Eventsの同様なコードについて調査してみた。

## はじめに
Elmを書くのが楽しいので、一つElm（とelm-ui）だけで何か作りたいなと思い、簡単なゲームを作成していました。この時に、「プレイヤーが操作可能なところだけ、マウスオーバーしたら色変えたりしたいな」と考え色々調べていたところ、elm-uiのElementに[mouseOver](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/Element#mouseOver)があることに気づきました。これを使って「条件ごとにmouseOver要素を入れたり入れなかったりする」コードを書いてみました。

## サンプルコード
書いてみたサンプルコードは[Ellieで記録](https://ellie-app.com/9rvqJxz4ypga1)しています。
ModelとしてはMyself（自分）とOpposite（相手）だけを持っているカスタム型で、自分の手番の時にはMyselfのタイルにmouseOverがつき、相手の手番の時にはOppositeのタイルにつくというイメージです。
Myself <-> Oppositeは、「Change turn」ボタンで変更可能です。
具体的に条件ごとにmouseOverを出し入れしているのは下の部分。

```elm
viewTile : Player -> Model -> Element Msg
viewTile player model =
    let
        desc =
            if player == Myself then
                "Myself"
            else
                "Opposite"
        changeMouseOver =
            if player == model then
                mouseOver [ Bg.color (rgba 1 0.2 0.3 0.5) ]
            else
                mouseOver []
    in
    column [ width (px 100), height (px 100), Border.width 1, changeMouseOver ] [ el [ centerX, centerY] ( text <| desc ) ]
```

変数としてchangeMouseOverを設定して、タイルに設定されているPlayer型と、現在Modelが持っているPlayerが同じであったときだけmouseOverによって背景色が変わります。
こういう感じにすれば、「Change turn」でModelを変更することで、mouseOverできるタイルが切り替わる……のですが、Safari 13.1で実行したときだけ、なんだか挙動がおかしい感じです。
「Change turn」を押して、OppositeにmouseOverを切り替えた時は想定どおり動作するのですが、もう一回切り替えてMyselfのタイルにmouseOverを設定しても、イベントが起こらないのです。
他のブラウザ(Chromium Edge 83, Chrome 84, FireFox 78)では、この切り替えは何度も起こすことができるので、Safari固有の問題だと考えています。でも原因はよくわからなかった（JS初心者マン）。

## 他のElementはどうなのか？
mouseOverの他にこのような挙動のElementがないか調べてみました。（適当）検証コードはEllieのリンクをつけています。

|Element|Microsoft Edge (Chromium) 83|Chrome 84|FireFox 78|Safari 13.1|
|:-----:|:--------------------------:|:-------:|:--------:|:---------:|
|[mouseOver](https://ellie-app.com/9rvqJxz4ypga1)|OK|OK|OK|切替2回で動作しない|
|[mouseDown](https://ellie-app.com/9rWDVjGQz9Wa1)|OK|OK|OK|切替1回で動作しない|
|[Events.onClick](https://ellie-app.com/9rWSQT85JjSa1)|OK|OK|OK|OK|
|[Events.onDoubleClick](https://ellie-app.com/9rWVR4P2dpPa1)|OK|OK|OK|OK|
|[Events.onMouseDown](https://ellie-app.com/9rWXJtBgGGra1)|OK|OK|OK|OK|
|[Events.onMouseUp](https://ellie-app.com/9rWYy8FJxL8a1)|OK|OK|OK|OK|
|[Events.onMouseEnter](https://ellie-app.com/9rWZpjZ27sya1)|OK|OK|OK|OK|
|[Events.onMouseLeave](https://ellie-app.com/9rX234H7fHYa1)|OK|OK|OK|OK|
|[Events.onMouseMove](https://ellie-app.com/9rX2VDtwcRfa1)|OK|OK|OK|OK?|

マウス動作まわりで調べてみたところ、どうやらTemporary stylingに該当するmouseOverやmouseDownで、Safariは中途半端な動作をしているようでした。Events.on-については、調べた全てのブラウザが見た感じ正常に切替動作しているようでした。onMouseMoveだけ、Safariと他のブラウザで比較した時、Safariの動きがもっさりしているのは気になるところですが、これの原因はよくわかりません（他の3ブラウザはタイル内でポインタを動かすと高速でTrue, Falseの表示が切り替わるのに対し、Safariではポインタの動き始め、動き終わりしか動作していないように見える）。

## 結論
正直原因がよくわからないのでモヤモヤした感じですが、Temporary stylingをifやcaseで条件分けして動作させようとすると、Safariではうまく動かないようです。なんか上手い書き方をしたらうまくいくのだろうか…。
【Storage】DISKフォーマットを止める

IBM系のストレージでボリュームを作成する際、nofomatオプションをつけ忘れるとフォーマットがかかりっぱなしになります。
ボリューム作成後のタスクをみてみると、、
![20190328144443.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/f7f07d62-2a4a-543c-1137-f35b7fd01078.jpeg)
二つめの赤い線の部分、50TBのボリュームですが、フォーマット完了まで"7679時間"とあります。
7679時間。日数にして約320日。待てるか！！
ちなみにGUI上でタスクのキャンセルはできません。ボリューム消すしかないです。

コマンドでフォーマットを"止める"ことはできます

```
chvdisk -syncrate 0 "VOLUME名"
```
が、これはフォーマット速度をゼロにしているだけでタスク自体が消えるわけではないです。

なお、ボリュームはGUI上で作成すると必ずフォーマットが自動で行われるのでコマンドで作成しましょう。

```
mkvdisk -mdiskgrp "POOL名" -vtype striped -iogrp "IOグループ名" -size "サイズ" -copies "コピー数" -unit gb -name "VOLUME名" -cache readwrite -node "優先node” -nofmtdisk
```
テラバイトレベルのボリューム切るときは注意です。nofmtdiskオプション忘れずに。
<br>
いじょ