OmniAICreator/Qiita-1.07M huggingface dataset:
Nginxコンテナのバックグラウンドとフォアグラウンドの切り替え

#環境

- MBP
- Catalina
- Docker for Mac

#Nginxコンテナの起動

-dit とすることで最初はバックグラウンドで起動。

- -d detachの意。はバックグラウンドで起動するオプション
- -i Interactiveの意。標準入出力と標準エラー出力をコンテナにつなぐ
- -t 恐らくttyの意。擬似端末を割り当てる、キーボードとモニターを接続する為のオプションと思うと良い。

```
% docker run -dit -p 8000:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
6f28985ad184: Pull complete 
29f7ebf60efd: Pull complete 
879a7c160ac6: Pull complete 
de58cd48a671: Pull complete 
be704f37b5f4: Pull complete 
158aac73782c: Pull complete 
Digest: sha256:d2925188effb4ddca9f14f162d6fba9b5fab232028aa07ae5c1dab764dca8f9f
Status: Downloaded newer image for nginx:latest
293061505e4dd0c96897c80cdef2231bb76db50c21b516ae8f326592cdd0d1bb
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391107/8a4513a1-ed13-75e2-3c1d-2dba349ae20b.png)

#フォアグラウンドへの切り替え

docker attach で切り替えが可能である。
コマンド実行後にブラウザ側のページをリロードしてログが出力されること（フォアグラウンド）で動いていることを確認。

```
% docker attach 293061505e4d
172.17.0.1 - - [12/Mar/2021:15:08:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
172.17.0.1 - - [12/Mar/2021:15:08:13 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
```
#バックグラウンドへの切り替え

Ctrl + p Ctrl +q を順番に押下する。
尚、この操作は -i -t のオプションがないと受け付けられない。
これは -i -t のオプションがないとCtrlキーの操作が受け付けられない為である。

```
docker attach 293061505e4d
172.17.0.1 - - [12/Mar/2021:15:08:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
172.17.0.1 - - [12/Mar/2021:15:08:13 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
read escape sequence
%
```
「read escape sequence」と表示されてプロンプトが返ってきた。
docker psを見てみるとSTATUSが「UP」となっており、ブラウザをリロードしてもNginxの初期ページが表示される事が確認できる。

```
% docker ps -a              
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
293061505e4d   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   0.0.0.0:8000->80/tcp   modest_diffie
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391107/58bf6f70-0654-89f4-653e-09691269d638.png)

#「 -i -t 」オプションについて

## -i オプションを指定しない場合
標準入出力と標準エラー出力をコンテナをつなぐオプションである。
ファイルからの入力をコンテナで実行されるコマンドに渡したいときなどに必要になる
また、こちらのオプションがないとNginxのログも出力されないし、ホストからのキー入力をしても効きません。
...って本には書いてたけど、検証したらふつうにログ出力されました。
そういう設定になっているのかしら？謎です。

ホスト側でプロセスを終了（Ctrl + c）することは可能です。

## -t オプションについて
擬似端末を割り当てる、キーボードとモニターを接続する為のオプションと思うと良い。
CtrlやESCなどをカーソルなどの操作を受け付けないそうです。
Ctrlを使えないため、attachからdetachに切り替えることが出来ません。

#TIPS

apache（httpd）の場合は再アタッチ出来ない仕様らしい。
断熱容器内の透熱壁の等温移動によるエントロピーの変化

#はじめに

「[可動断熱壁は力に押されて動くのではない。エントロピー増大則で動く。](https://qiita.com/Yh_Taguchi/items/50b4cf964d285ef73ee0)」という記事の流れで以下の様な場合を考えました

#問題設定

「**熱を通す膜でできた大きさの異なる$N$個の風船が断熱容器内に隙間なく閉じ込められている。風船の中には温度$T$の理想気体が入っており、$i$番目の風船の体積、圧力は$V_i,P_i$であるとする。十分時間が経ち、風船の圧力が全て$P$になった時のエントロピーの変化を求めよ**」

#解答
$i$番目の風船に入っている理想気体が$n_i$モルであるとすると、全体が等圧になった時、全ての風船は等温等圧になりますから、$i$番目の風船の体積$V_i'$は、$n_i$に比例するので
$$
V_i' = \frac{n_i\sum_{i'=1}^N V_{i'}
}{\sum_{i'=1}^N n_{i'}} $$ 
になります。理想気体のエントロピーは
$$
S = n R \log \frac{V}{n} +  nC_V \log T
$$
ですが温度は変化しないので$V$依存性だけ考えればよく、エントロピーの変化$\Delta S$は
$$
\Delta S = \sum_i n_i R \log \frac{V_i'}{n_i} - \sum_i n_i \log  \frac{V_i}{n_i} =\left(\sum_{i'} n_{i'}\right)\cdot \log \frac{\sum_{i'=1}^N V_{i'}}{\sum_{i'=1}^N n_{i'}} - \sum_i n_i \log  \frac{V_i}{n_i}
$$
と書けます。ここで
$$
\frac{\Delta S}{\left(\sum_{i'} n_{i'}\right)}=  \log \frac{\sum_{i'=1}^N n_{i'} \left(\frac{V_{i'}}{n_{i'}}\right)}{\sum_{i'=1}^N n_{i'}} - \log \left [ \prod_{i'=1}^N \left( \frac{V_{i'}}{n_{i'}}\right)^{n_{i'}} \right]^\frac{1}{\sum_{i'} n_{i'}}
$$
と書けることから相加相乗平均の式
$$
\frac{\sum_i n_ix_i}{\sum_i n_i} \geq\left (\prod_i x_i^{n_i} \right)^{\frac{1}{\sum_i n_i}}
$$
より$\Delta S\geq0$であることが分かります。容器全体としては準静的ではない断熱変化ですから当然の結果です。


#断熱容器内の透熱壁を介した熱移動は準静的でいいのに、透熱壁の等温移動はなぜ準静的ではいけないのか？

しかし、これを固定透熱壁を介した熱移動によるエントロピーの変化の問題と比べると妙なことが分かります。

**固定透熱壁で仕切られた断熱容器の２つの区画に入っている理想気体の温度が異なるとき、熱の移動は十分ゆっくりであり、それぞれの区画内では熱平衡が成り立っているとして$ΔS = Q/T$と仮定すると、熱は高温から低温に流れることを使って容器全体のエントロピー変化は$Q/T_{低温} -Q /T_{高温}>0$より正であることが分かる**

などと教科書にはよく書いてあります。ですが、「透熱壁を接して圧力が異なった理想気体が接しているが、全体は等温でかつ断熱容器に入っている場合」に同じこと（透熱壁の移動は、個々の区画が熱平衡を維持できるほどゆっくり動く）を仮定すると準静的な過程ではないのにエントロピーが増えないことになってしまいます。

なぜなら

**$i$番目の風船が得た熱を$Q_i$とする。等温過程なので$dS_i=Q_i/T$。だから総エントロピー変化は$\sum_{i=1}^N Q_i/T$。しかし、断熱容器なので外部との熱のやり取りは無く、$\sum_i Q_i=0$。したがってエントロピー変化もゼロ**

となってしまうからです。なにがいけないのでしょう？ゆっくり熱を伝える壁が許されるなら、ゆっくり動く壁もよさそうなものです。

この２つの違いは仕事の有無です。ゆっくりと熱を通す壁を想定することは問題ないですが、ゆっくり変形する壁を想定するには外から力を加えて壁の動きを止めなくてはなりません。仮に「堅い壁」を使ってゆっくり変形することを実現したとしても壁の変形にエネルギーが必要になってしまうので、やっぱり仕事が発生してしまいます。仕事が発生すれば、断熱容器で外との熱のやりとりがない以上、熱力学の第一法則（エネルギー保存則）から断熱容器内の理想気体の内部エネルギーが増減しなくてはなりません。理想気体の内部エネルギーは温度に比例していますから、温度が変化してしまいます。結局、可動透熱壁を等温で準静的にゆっくり動かすことはできないので、エントロピーが変化しない、ということはできません。
「for in」はデバッグ用！？Safariで「for in」の処理が終わらずに３日間費やした話

皆さんこんにちは！

まず、以下のコードを見て下さい。

```index.js
const buttons = document.querySelectorAll('button')
for(let i in buttons) {
  buttons[i].classList.add('is-loading')
}
this.$axios('http://～').then()
```

ある関数を実行したときに全てのボタンにローディングを付けるという動作をするプログラムです。

開発環境であるChromeでは何事もなく動作したのですが、Safariだとなぜか動かなかったんですよね。。。

最初は``for in``が原因だなんて思いもしなかったので、``axios``のSafari環境のエラーだと勘違いしてしまいまいした。

そこで、AWSのCloudWatchのログを見ているとエラーの内容すら表示されない。

どうもおかしい。。。

``axios``のエラーならCloudWatch、ブラウザの開発者ツールにエラーが出るはず！

なんも出ないということは、エラーの発生は``axios``ではなくこの``for in``なのか！？

やり方を変えてfor文にしてみる

```index.js
      const buttons = document.querySelectorAll('.button')
      const length = Object.keys(buttons).length

      for (let i = 0; i < length; i++) {
        buttons[i].classList.add('is-loading')
      }
```

上手く動作したみたいだ。

なぜSafariでは``for in``の処理が終わらなかったのか。

ためしに``return``や``break``を行ってもだめだった。

我らが**Mozilla先生**で調べてみると、``for in``の使用用途は以下のように書いてあった。

>最も具体的な使い方はデバッグ目的であるかもしれません。これは、オブジェクトのプロパティを (コンソールに出力するなどして) 簡単にチェックする方法になります。データを格納するには配列の方が実用的な場合が多いですが、データを扱うにはキーと値のペアが好まれる状況では (プロパティが "キー" として機能します)、それらのキーが特定の値を保持しているかどうかをチェックしたい場合があるかもしれません。

要するに、デバッグ用ということなんでしょうか？

まぁ、確かに思い返してみれば、``entries``とか訳の分からないプロパティが出てきたような。。。

``for in``楽で好きだったのですが、やっぱり`for``が一番コード的にも分かりやすくエラーが起きないんだなと思いました。

楽はするな！！！と怒られた感じがします。

急がば回ります。。。
PowerAutomateで文字列が数値か判定する

##前提として
Power Automateで文字列を数値に変換するには
int関数を使います。

```
int(文字列)
```

##今回の問題は
『文字列は数値かもしれないし、数値じゃないかもしれない場合
エラーにならないようにするにはどうすればいいか』です。

ちなみに……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/7a762022-7267-9c82-fa61-9a3fd0e41b8c.png)

このフローではstrImputに「abc」という文字列を入れて
int関数でstrImputを数値に変換しています。
実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/bb2b21f6-333e-3f97-da56-4dfc55827ed9.png)
もちろんstrImputの中身は「abc」なので
int関数で数値に変換できずにエラーとなってしまいます。

PowerAutomateにはExcelでいうISNUMBER関数のような数値かどうかをチェックする関数はありません。困りました。(2021年3月時点)

##解決方法
int関数でエラーが出ることは諦めて、エラーの時にだけ進むフローを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/667bb408-ea6c-455d-e589-47a6e6f6acb5.png)


##手順
1.int関数を使用したすぐ下に「並列分岐の追加」で処理を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/6a3098ba-fd16-86a7-441d-49e8f0161829.png)
今回はサンプルの為、処理は作成せずに空のスコープのみを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/88b6c4c6-6e6f-7a92-66f6-81c3370924ef.png)


2.アクション右の「…」から「実行条件の構成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/95297df1-23b5-b751-9398-6d7c3c631fb5.png)

3.「に成功しました」のチェックを外し「に失敗しました」にチェックを付け
完了を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/f291f212-08d6-8c01-40eb-cdfaae071d2f.png)


##実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/5a97cfdd-2f2e-c3be-82b4-b5a1f60244a4.png)

完成したフローを実行してみます。
strImputは最初と同じ「abc」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/6c29165e-1b16-3229-0621-6098c1080833.png)

エラーとなっていますが、右のスコープの処理は実行されています。


##最後に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/cbb6e399-1a4b-0243-d3f7-dd7be24d278c.png)
右のスコープの中に「終了」というアクションを入力し
状態を「成功」にしておけば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636203/28718912-68ae-0828-0eff-c29a8543ebd4.png)
フローを正常終了させることができます。


おわり
＠mixin


##＠animation
＠mixin　sassの機能、cssでは使えません。
関数を定義します。

```
＠mixin ”キーワード”() {
}

↓

＠mixin animation(
  $name,
) {
  animation-name: $name;
}
```

##＠include
＠mixinを呼び出すには＠includeを使います。

```
＠include animation(
  $name: sk-bouncedelay
); 
```
AWSについての振り返り

最近、お世話になったAWSについて振り返った事や思ったことを適当に書いていきたいと思います。


#AWSとは
`Amazon Web Services`の略でAmazonが提供するクラウド型のWebサービスの総称。

自分は今回、**EC2**と言うのを初めて使用しました。
内容はローカル環境から本番環境で使えるようにする為、クラウド上のサーバーを利用しなければならないからです。
デプロイするなら**heroku**でもいいみたいですが、今は**AWS**を使っている人が多いので自分も見よう見真似でやって見ましたが、素人なのでとてつもなく難しく、エラー内容もログを何回も見直してやっとの思いで、手動デプロイまでできました。
やる気があれば、自動のデプロイまで辿り着きたいものです。


##EC2
Webエンジニアが利用する代表的なもの。![スクリーンショット 2021-03-13 0.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1078698/665cdc12-e11d-500e-9d3d-c70d2dca5835.png)

　　
**EC2を使って思ったこと**
インスタンスを作り、mariaDBやら、Nginxやらunicornやらpublicキーやら、やる工程がとても多く本当に挫けそうでした。
ローカル環境と本番環境ではアセットコンパイルされることも学び、gemも本番用で取り直し、JavaScriptも調子を崩す始末。
次回もし、本番環境で使う事があれば、再度復習して挑みたい。
時間は大量に取られたがとてもいい経験にはなった。
エラーメッセージの日本語化

初めての投稿になります。
プログラミングの初心者(勉強中です)のため、記述のミスや説明不足などがあるかもしれません。
参考にする際はご注意ください。

エラーメッセージの日本語化についてまとめます。
今回、内容としては複雑なものではありませんが今後も何度も記述する内容であり、一つのアプリにつき一度の作業となるため内容が中々身につかないのではないかと思い、備忘録のために投稿いたします。
なお、
①モデルないへのバリエーションは記述済み
②ビューファイルへエラー文を表示させることについては記述済み

以上が条件となり、あくまで
「すでに表示されているエラー文を日本語表示にして使いやすくする。」
という目的の実装です。

# 手順1
### 設定

```ruby:config/application.rb
#中略
module #アプリケーション名
 class Application < Rails::Application
   # Initialize configuration defaults for originally generated Rails version.
   config.load_defaults 6.0

   # 日本語の言語設定
   config.i18n.default_locale = :ja
　　# 省略
 end
end
```

上記のように
`config.i18n.default_locale = :ja`
と記述します。
こちらは、言語設定を「日本語設定にする」という意図です。

# 手順2
### Gemの導入
```ruby:gemfile
gem 'rails-i18n'
```
このgemには特定の言葉を日本語に翻訳するものです。
詳しくは下記URL（GitHub）にどの日本語が利用できるか記載されています。
[rails-i18nに登録されている日本語](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)

### Gemのインストール
ターミナルで`bund leinstall`を実行

# 手順3
### ymlの実装
`config/locales/devise.ja.yml`ファイルを作成し、下記URL（GitHub）のコードをコピペ
[devise.ja.yml](https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml)

# 手順4
### 不足分の追加
手順3まででは特定の言葉のみ翻訳され一部の言葉は英語のまま表示されてしまいます。
下記の例では'nickname''text''image'が該当します。

```yml:config/locales/ja.yml
ja:
 activerecord:
   attributes:
     user:
       nickname: ニックネーム
     tweet:
       text: テキスト
       image: 画像
```

以上で実装は完了です。

# おまけ
### モデルのテストコード　注意！！

この実装ではエラー文を日本語に変更しているため
テストコードの記述も注意何必要です。

```ruby
     it 'nicknameが空だと登録できない' do
       @user.nickname = ''
       @user.valid?
       expect(@user.errors.full_messages).to include("Nickname can't be blank")
     end
```

`expect(@user...)...`の記述内に`include("Nickname can't be blank")`との記述が有りますが、この記述は日本語導入する際には変更する必要があります。

```ruby
     it 'nicknameが空だと登録できない' do
       @user.nickname = ''
       @user.valid?
       expect(@user.errors.full_messages).to include('ニックネームを入力してください')
     end
```

エラー文が日本語だと一目瞭然で利用者が使いやすいですね。
`Nickname can't be blank`
`ニックネームを入力してください`


以上でエラー文の日本語化の実装は完了となります。
ご覧いただきありがとうございました。
[Rails] created_at、updated_atを日本時間に変更する方法

`2021-02-25 21:11:05 +0900` のような表示になっているのを、 `0000年00月00日 00時` のように日本時間の表示に変更する方法です。

#タイムゾーンの設定をする
`application.rb` に以下を追記します。

```:config/application.rb
config.time_zone = 'Asia/Tokyo'
```

#time_formats.rbを作成する
`config/initializers` に `time_formats.rb` を作成します。
`config/initializers/` 以下にあるファイルはRailsを起動した時に自動的に読み込まれるファイルです。

```:config/initializers/time_formats.rb
Time::DATE_FORMATS[:datetime_jp] = '%Y年 %m月 %d日 %H時 %M分'
```

#サーバーを再起動する
`rails s` でサーバーを再起動します。


#viewファイルに設定したフォーマットを適用する
`<%= xxx.created_at.to_s(:datetime_jp) %>`
`<%= xxx.updated_at.to_s(:datetime_jp) %>`
これを使って、時間を表示させるviewファイルを書き換えます。

```:viewファイル例
<%= @post.created_at.to_s(:datetime_jp) %>
<%= @post.updated_at.to_s(:datetime_jp) %>
```


[参考にしたサイト](https://qiita.com/tomo_k09/items/e4f19947d35890500492)
git commitと分かち合いたい

何故人はgit commitするのか　
その謎を探るべく私はアマゾンへ向かった







# 自己紹介のような何か

未経験でwebエンジニアに入社し、3か月ほどになりました。commitする理由が分かったので、やらかしを反省としてメモします。




# ある日



私「わあい、プロジェクトにアサインされた👼」（うきうきとりん）

「新しくブランチを作って、developブランチをpullしてね」

私「はい。」

私「わあ、pullしたら、私のローカルがコンフリクトした。」

私「これはdevelopブランチに
pushしたくないファイルだから、
破棄しよう。」

ぽい！








↓








# そしてまた違う日



私「よーし、作業が出来るぞ。」

ぽちぽち








↓





# そしてまたある日

私「またpullしたら、コンフリクトして邪魔だから破棄しよ。」

私「わあ」

私「間違えて、今書いてるファイルを破棄しちゃった👼」




![1132AE13-DABA-4C73-9128-05BFC4ED9902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/afd5f660-7893-7aaa-dc72-e3ca84b887d5.png)




# 結論
もし、あの時… commitしていれば…

君（作業していたファイル）は消えなかったのに……！

commit　を　忘れない！


完
HaskellでFizz Buzz

すごいH本を読んでいて、初心者ながらまず書きたかったFizz Buzz書いてみたけど、本当にこれでいいのかモヤモヤしていたところ、親切なコメントをいただきました (ありがとうございます！)。

```haskell
fizzbuzz :: [Int] -> [[Char]]
fizzbuzz [] = []
fizzbuzz (x:xs) |mod x 15 == 0 = "FizzBuzz" : fizzbuzz xs
                |mod x 5 == 0 = "Buzz" : fizzbuzz xs
                |mod x 3 == 0 = "Fizz" : fizzbuzz xs
                |otherwise = show x : fizzbuzz xs
```

頂いたコメントを受け:
1. 1行目は`fizzbuzz :: [Int] -> [String]` が適切 (何か変な気がしていました)
2. 3~6行目の冗長な感じも、頂いたコメントで解消しそうです (...勉強中)

※この場でこんな初心者が投稿していいかはわかりませんが、
　まぁ無意味でもないと思われますので晒しておきます。
Eclipse+HANA toolsで、ABAP Platform 1909, Developer EditionのHANA MDCのHDBに接続する設定

# Eclipse+HANA toolsで、ABAP Platform 1909, Developer EditionのHANA MDCのHDBに接続する設定

### 詰まったところ

HANA Toolsの設定をして、AWSで作成したABAP Platform 1909, Developer Editionに同梱されているHANA DBにアクセスしようとしました。HANA DBはマルチテナントデータベースコンテナ(MDC)であり、複数のテナントを持ち、SYSTEMDBとHDBがあります。SYSTEMDBにはアクセスできたのですが、もう一つのHDBにはアクセスできませんでした。DockerのReadmeには、少し記載に不足があったようです。

### 解消方法概要

1. Docker runのオプションでポート30215についてもアクセスできるように設定を変更しました。
2. EclipseのHostnameの設定箇所で、ポート番号も指定しました。
3. AWSのセキュリティグループの設定も変更しました。

これで、接続することができました。

## 1. docker runの設定変更

runコマンドを以下のようにポートの追加をしました。30215を追加です。READMEには、30213しか記載がありませんでしたが、30215も必要だったということになります。

```
:~> docker run -v A4H.txt:/opt/sap/ASABAP_license -v HDB.txt:/opt/sap/HDB_license --stop-timeout 3600 -i --name a4h -h vhcala4hci -p 3200:3200 -p 3300:3300 -p 8443:8443 -p 30213:30213 -p 30215:30215 -p 50000:50000 -p 50001:50001 --sysctl kernel.shmmax=21474836480 --sysctl kernel.shmmni=32768 --sysctl kernel.shmall=5242880 --sysctl kernel.msgmni=1024 --sysctl kernel.sem="1250 256000 100 8192" --ulimit nofile=1048576:1048576 abapplatform:1909 -agree-to-sap-license
```


## 2．Eclipse + HANA Tools 設定内容
### Add System
Add sytem から、接続設定をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198295/215fbdf6-d304-a4c6-aa66-e90729c33d0e.png)

### Specify System

Host Nameの箇所には、ホスト名だけではなく、ポート番号指定も追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198295/2a563793-dcf1-6cf0-988c-d80a277da85d.png)

SYSTEMDBの場合には、ホスト名だけでよかったのですが、HDBの場合にはポート番号も同時に指定しないと、うまくいかないようです。

## 参考

SNOTE 2551889
【M5stickC】2000円で普段使いできる格安スマートウォッチを作る


昨年12月、私はスマートウォッチを自作しようと考え、いろいろ見ていたところ、M5stackを見つけた。
これでスマートウォッチを作れるのではないかと思ったが、画面がでかすぎる。
あきらめるしかないと思っていた時、兄弟版であるM5stickCを見つけた。
手に入れた当初はM5stickCを使って何を作ろうかと思い悩んでいたが、M5stickCで時計付きのLINE Notify発信機を作ろうと決意した。以下やったことを記す。

#1.用意するもの
1.M5stickC
千石電商様より購入。バンドつきで2000円行かなかった。安い。

https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5G6U

2.Arduino IDE

3.TypeCのケーブル
M5stickCを充電するときに使う。データ書き込みのケーブルでは、たまに充電されないときがあった。

4.LINE Notifyのトークン

#2.完成するまでに実施したこと
今回のコードは著作権上の都合で記載できないため、限りなく近いことが再現できるように、以下に参考にさせていただいたサイトを記す。

1.M5stickCとArduino IDEとの接続方法
itiB_S144様の記事を参考にさせていただきました。

https://qiita.com/itiB_S144/items/7a232c1a31151fcb5e5b

2.「Hello World」の表示
itiB_S144様の記事を参考にさせていただきました。

https://qiita.com/itiB_S144/items/7a232c1a31151fcb5e5b

3.Wi-Fiとの接続
以下サイトを参考にさせていただきました。

http://program-memo.com/archives/685

※M5stickCの仕様?でステルスWi-Fiとの接続はできないようです。

4.Wi-Fiに接続し、ntpサーバから時刻を取得、それをM5stickCに表示する
さとやまノート様のサイトを参考にさせていただきました。

https://sample.msr-r.net/m5stickc-ntp/

5.オフラインで時計を表示する
いさな工房様のサイトを参考にさせていただきました。

http://jo3emc.c.ooco.jp/RD/20191122000000/INDEX.HTM

6.バッテリー残量を可視化する
こちらのサイトを参考にさせていただきました。

https://make-muda.net/2019/09/6946/

7.LINE NotifyでLINEに通知する
こちらのサイトを参考にさせていただきました。

https://2kuru.com/m5stack_linenotify/


#3.完成
![S__9879580.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702737/94d92aaa-eabf-2bb3-efe4-4e5e55b9b4bd.jpeg)
検証を重ねた結果、上の画像のような時計となった。
また、Bボタンを押すとLINE notify経由で指定されたLINEグループに通知が送られる設定にした。



#4.検証
タイトルにある通り、普段使いができないと困るので、検証を行った。
1.初期条件
初期条件では、ディスプレイの明るさを最大値(12)で設定をして検証した。
充電は30分も持たなかった。記録を取り忘れたので後日再検証をする。

2.次に、ボタンが押されていないときはディスプレイの明るさを最小値?(1)に設定し、ディスプレイを切る設定で検証を行った。
これで1時間持つか持たないかの瀬戸際にまで成長した。前述のとおり記録を取り忘れたので後日再検証をする。

3.次に、ボタンが押されたときのディスプレイの明るさを10に下げた。
これで1時間半持つようになったが、まだ実用化には程遠い。

4.次に、CPU周波数を動作が干渉しない程度に下げた
Wi-Fiを使わないときのCPU周波数を40MHz、Wi-Fiを使うときだけ80MHzに設定した。
これを行ったところ、バッテリーは4時間以上持った。

電池を長持ちさせるために、以下のサイトを参考に検証を進めた。

https://lang-ship.com/blog/work/m5stickc-power-saving/#:~:text=M5StickC%E3%81%AF80mhA%E3%81%AE%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC,%E3%81%93%E3%81%A8%E3%82%92%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

#5.これから実装したいこと
実現したい機能を2点挙げる。
1.BlueToothを用い、外出先でスマートフォンと連携し、スマートフォンにM5stickCからの通知が届くようにする
2.BlueToothを用い、いちいちWi-Fiにつながなくても、スマートフォンのRTCと時刻同期を行い、外出先でも時刻を合わせられるようにする。
使ってる？Notionのリマインダー機能！

#はじめに
以前からリマインダー機能の存在を知ってはいましたが、使ったことがなかった機能の一つです。（今も上手く活用はできていない）ただ、知っておくと使う機会があると思うので紹介します。

##リマインダー機能

設定の方法は簡単で、ブロック内で、
`@remind` と打ち込み、半角スペースを空けて、
`日付 時間`
を入力するだけです。

未来のリマインダーは青色に、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/d6335e99-c189-5424-e150-b865b4460e80.png)

過去のリマインダーは赤色になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/4531eb29-b883-efac-68e7-f059035661ed.png)


##通知
私はMacを使っていますが、
時間になると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/b741cc06-87fc-b772-ad1c-a343d7c91847.png)
こんな感じで通知が飛んできます。

##最後に
`@`の使い方にはまだまだ可能性を感じます。
【初心者でもわかる】CSSで虹を書こう！CSSでの虹の書き方

# どうも7noteです。CSSで虹をつくろう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/a22d0314-be58-89ee-4a4f-26ff347296c7.png)

先生「今日はCSSで虹を作ります♪用意するものはクレヨンではなくエディタを用意します。」

園児「はーい！」

園児「（机からPCをとりだす園児たち）」

・
・
・

こんな未来がこないことを祈ります。

## ソース

```index.html
<div class="rainbow"></div>
```

```style.css
.rainbow {
  width: 200px;  /* 幅を200pxに指定 */
  height: 100px; /* 高さを100pxに指定 */
  overflow: hidden;   /* はみ出た部分を非表示 */
  position: relative; /* 基準位置とする */
}

.rainbow::after {
  content: '';        /* 疑似要素に必須の指定 */
  width: 100%;        /* 幅いっぱいに指定 */
  height: 200%;       /* 高さいっぱいの二倍（正方形になるよう）に指定 */
  border-radius: 50%; /* 角丸で正円にする */
  position: absolute; /* 相対位置とする */
  top: 0;             /* 上から0pxの位置に指定 */
  left: 0;            /* 左から0pxの位置に指定 */
  background: radial-gradient(transparent 30px, #CD35F0 30px,#CD35F0 40px, #5B96E2 40px,#5B96E2 50px, #66D1F0 50px,#66D1F0 60px, #9FF54D 60px,#9FF54D 70px, #FBFF52 70px,#FBFF52 80px, #F8A952 80px,#F8A952 90px, #E7474D 90px); /* 虹になるよう内側の色から指定 */
  background-size: 100% 100%; /* 背景のサイズを100%に指定 */
}
```

## 解説

作成するイメージとしては、**円形グラデーションを疑似要素で作成しておき、半分だけ親要素からはみ出しておきます。はみ出た分を非表示にして完成**。

円形のグラデーションを作成するには`radial-gradient()`を使います。内側から順番に色を書いていくのですが、円の中心部分は透明になるのでtransparentを指定します。その後順番に10pxずつ色を指定します。
円形なので、10pxずつ指定しても疑似要素の幅は20pxずつ増えていくのでサイズを指定する際は注意してください。

## まとめ

園児くらいの子でもわかるように説明するのってとても難しい。
説明上手な人はキレイなプログラムが書けそう。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】HTML・CSSのちょいテク詰め合わせ](https://qiita.com/7note)
【TypeScript】Utility TypesのRecordを理解する

# この記事は何？
この記事は、Utility Typesの一つである**Record**について理解する記事です。
Utility Typesってそもそも何？という型（方）は以下の記事を御覧ください🙇🏻
👉 [TypeScriptのUtility Typesを理解して活用する](https://qiita.com/NOMURA_keibyou38/items/84caee0657f57650577d)

そもそも、TypeScriptって何？って型は以下を御覧ください
👉 [JavaScriptを知っている方がTypeScriptをなんとなく理解するための記事① ~はじめに~](https://qiita.com/NOMURA_keibyou38/items/06a3218de3ff480ce9de)

# Record＜Keys,Type＞とは
TypeScript公式には以下のように書かれています。
> Constructs an object type whose property keys are Keys and whose property values are Type. This utility can be used to map the properties of a type to another type.
> プロパティキーがKeysで、プロパティ値がTypeであるオブジェクトタイプを構築します。 このユーティリティを使用して、あるタイプのプロパティを別のタイプにマップできます。
> https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeystype

イマイチわかりずらいですね🤔

要約すると、Recordは2つの型（Keys, Type）を利用して、新たなオブジェクトを作成します。
KeysにはオブジェクトのKeyとなる型を、TypeにはKeyに対するプロパティとなるような型を設定します。

実際にコードの場合、以下のように表すことが出来ます。

```typescript
type hogehoge = Record<Keyとなる型, プロパティのなる型>
```

```typescript
// MyFriends型を定義。この型がキーとなる
type MyFriendName = "TOM" | "EMMA" | "KEN";

// ふつーにHuman型を定義。この型がプロパティとなる。
interface Human {
  sex: "woman" | "man";
  old: number;
  height: number;
}

// 上の方を組み合わせる！
type MyFriends = Record<MyFriendName, Human>;

// MyFriendNameがキーに、Humanがプロパティとなる
const facebookList: MyFriends = {
  TOM: {sex: "man", old: 14, height: 150},
  EMMA: {sex: "woman", old: 13, height: 149},
  KEN: {sex: "man", old: 12, height: 148},
}
```

このように、既存の型を組合わせてオブジェクトの型を作成することが出来ます。
Recordを使えば、様々なオブジェクトの型を簡単に作成できそうです。

Reactで使う際は以下のように利用できそうです。

```jsx:hogehoge.tsx

import { Fuga } './fugafuga.ts'
import { Gahu } './gahugahu.ts'

type Props = Record<Fuga, Fahu>;

const hogehogeComponent: React.FC<Props> = props => {
 ...
}
```

以上になります。

# おわりに
今回は、Utility TypesのRecordについて紹介しました。
是非、ご活用ください！

# 参考
- https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeystype
Java学習　基礎編　~繰り返し処理 while文 ~

Java学習の備忘録になります。
内容は初心者なので基礎的な部分となります。
Javaに興味がある方やJava学習初心者の参考になれば幸いです。

* * *
### 繰り返し処理
簡単にいうと、
『**一定の処理を自動で繰り返し行う処理**』
のことを繰り返し処理と言う。

#### while文

繰り返し処理の代表的なもの。
記述方法は下記になり、**条件がtrueの間、{}内の処理を繰り返す**ことができる。


```Main.java
while (条件) {
  繰り返す処理;
}
```

###### 繰り返す処理の流れ
①変数の初期化 (while文を繰り返すかどうか判断するために用いる)
※変数の初期化とは、変数定義と同時に値を代入すること。
↓
②条件
↓
③繰り返す処理
↓
④変数の更新
↓
②に戻り、条件がtureであれば繰り返す。
**条件がfalseになれば繰り返し処理が終了する。**

```Main.java

int i = 1; // 変数iを定義

while (i <= 5) {
  System.out.println(i);
  i++; 
// iに1を追加していく。
//1を足し忘れると変数iは1のままになり、
//永遠に条件がtrueとなり、無限に処理が続くので注意。
//これを無限ループと呼ぶ。
}


```


* * *
#### おわりに
繰り返し処理については、次回for文もやりたいと思います。
ご指摘などございましたら、よろしくお願いいたします！！
AWS Cloud9でRails ServerでBlocked Hostと表示された場合の対処

AWS Cloud9でRails Serverを実行してブラウザを起動した時に「Blocked Host」と表示された時の対処方法です。

Railsチュートリアルの流れに沿って進めていましたが、上記症状にハマりました。

色々調査し、BundleをUpdateする記事を目にしたため、実行しましたが症状は変わらず。

最終的にチュートリアルの中であった、Gemfileとdevelopment.rbを変更したタイミングで上書き保存していないことが原因であることが判明しました。

上書き保存した後、再度Rails Serverを実行しブラウザを起動した結果、無事解決しました。
【覚書】ツクールMZ で RangeError: Range consisting of offset and length are out of bounds が出たので対処した

## 発生状況

**iOS 14.4** のブラウザ（Safari, Chrome で確認）で、
サンプルレート **8000Hz 以上 22050Hz 未満の音声素材を再生**しようとすると、
`vorbisdecoder.js` が
`RangeError: Range consisting of offset and length are out of bounds`
を吐いて死ぬ。

## 原因考察

算出された総サンプル数以上の音声データをバッファに入れようとして死んでる？

```js
    concatenate() {
      for (let i = 0; i < this.channels; i++) {
        this.data = new Float32Array(this.totalSamples);
        let offset = 0;
        for (const array of this.arrays) {
          this.data.set(array, offset); // <- ここでエラる
          offset += array.length;
        }
      }
    }
```

どうもこの if 文によって、8000 ～ 22049Hz のサンプルレートが指定されたら、
sampleScale を変更するようになってるっぽい。

```js
      this.sampleRate = Module.getValue(this.v + 0, "i32");
      this.sampleScale = 1;
      if (this.sampleRate >= 8e3 && this.sampleRate < 22050) { // <-
        this.sampleScale = Math.ceil(22050 / this.sampleRate); // <- なにこれ
      }                                                        // <-
      this.totalSamples = 0;
```

この計算式が、なんかおかしいのかも。

## 応急処置

こうしたら一応出なくなった。

```diff
      this.sampleRate = Module.getValue(this.v + 0, "i32");
      this.sampleScale = 1;
      if (this.sampleRate >= 8e3 && this.sampleRate < 22050) {
-       this.sampleScale = Math.ceil(22050 / this.sampleRate);
+       this.sampleScale = Math.floor(22050 / this.sampleRate);
      }
      this.totalSamples = 0;
```

これでも一応動いた。

```diff
      this.sampleRate = Module.getValue(this.v + 0, "i32");
      this.sampleScale = 1;
-     if (this.sampleRate >= 8e3 && this.sampleRate < 22050) {
-       this.sampleScale = Math.ceil(22050 / this.sampleRate);
-     }
      this.totalSamples = 0;
```

ただ、この対処法では何か問題があるかもしれないので、様子見したい。

## 追伸

公式に報告した

https://forum.tkool.jp/index.php?threads/4863/#post-28663

あと、このデバッグにあたり Windows 上で iPhone デバッグをしたので、そのやり方も記事にした。

https://qiita.com/katai5plate/items/cf4ec16b9d58e07e4ecd
色が付いた丸いViewを作成する

テーマカラーの変更画面でよく見かける「**色が付いた丸いView**」の作り方です。

※レイアウトイメージ（テキストと区切り線はおまけです）
![Screenshot_1615552027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/e0bec739-ec13-1805-1fda-026ff4be82cd.png)


# レイアウト（xml）
```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <View
        android:id="@+id/color_icon"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/color_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:text="レッド"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="@+id/color_icon"
        app:layout_constraintStart_toEndOf="@+id/color_icon"
        app:layout_constraintTop_toTopOf="@+id/color_icon"
        tools:text="レッド" />

    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:background="#cfd8dc"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="@+id/color_name" />

</androidx.constraintlayout.widget.ConstraintLayout>
```

# シェイプドローワブルを作成する

**シェイプドローワブル（色やグラデーションなどを含む図形を定義するXMLファイル）** を、`res/drawable`ディレクトリに作成します。

ファイル名は`shape_red_icon.xml`とします。

```res/drawable/shape_red_icon.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="15dp" />
    <solid android:color="#f44336" />
</shape>
```
## `<shape>`タグ
`<shape>`タグは、ルート要素でなければいけません。
	
## `<corners>`タグ
図形の角を丸くします。

`<corners>`タグは四角形にだけ使えますが、上記の実装では図形を指定していません。

なぜなら、`<shape>`タグで図形を指定しないときは、デフォルトで四角形の`android:shape="rectangle"`が適用されるからです。

### `android:radius`
全ての角の半径を指定します。

個別に半径を指定したいときは、`android:topLeftRadius`、`android:topRightRadius`、`android:bottomLeftRadius`、`android:bottomRightRadius`を使用します。

## `<solid>`タグ
図形に使用する単色を指定します。

上記の実装では、`android:color="#f44336"`で赤色を設定しています。

## まとめ
これで色が付いた丸いViewを作ることが出来ると思います。

次回は、今回の実装を含めて「テーマカラーを変更するアプリ」を作ってみたいと思います。
djUnit pluginに新しいASMを適用した話

> (2021/04/03) djUnit plugin version 0.9.1を追加しました。

# いまさらで恐縮です
いまさらEclipse、しかもdjUnitの話もどうなのかと思いますが、新規開発はないとしても、djUnitで単体テストされているシステムをメンテナンスする場合とか、それを新しいjavaに移行させる場合とか、そういった用途では、今でもdjUnitが必要となる場面があるのかもしれないと思い、新しいEclipseで、新しいjavaでdjUnitが動くよう修正しました。
以前から、ちょいちょい作業していたのですが、やっと公開できるレベルになったので公開します。

# 機能追加は特になし

これと言った機能追加はしていませんが、まずは新しいEclipseでも動作するようにしたversion0.8.6と、バイトコード処理ライブラリのASMを新しいものに入れ替えたversion0.9.0を公開します。
また、Eclipse 3.7(Indigo) - 4.6(Neon)で動作するものと、4.7(Oxygen)以降で動作するものは、分けて公開しています。

[djUnit plugin for Eclipse version 3.7 - 4.6](https://piecemeal-technology-inc.github.io/djunit_plugin_for_eclipse_3.7-4.6/)
[djUnit plugin for Eclipse version 4.7 - 4.18(2020-12)](https://piecemeal-technology-inc.github.io/djunit_plugin_for_eclipse_4.7-4.18/)

# djUnit plugin version 0.8.6
このバージョン(0.8.6)は、新しいEclipse(3.7 - 4.18)での動作を可能にしただけのものです。
ASMの入れ替えも行っておりません。

djUnitの設定で、ASM version1.5.3, 2.2.1 または3.1を選択できます。
ASMのjava7対応は4.0 RC1からなので、このバージョンはjava6までは動作し、java7以降の環境ではテストが動作しないことがあります。


# djUnit plugin version 0.9.0
このバージョン(0.9.0)は、新しいEclipse(3.7 - 4.18)で動作を可能にしつつ、古いASMを排除し、新しいASMを適用したものです。

djUnitの設定で、ASM version5.2または9.1を選択できます。

|ASMバージョン|ASMがサポートするjava|動作するJREのバージョン|
|---|---|---|
|5.2|java8まで|1.5以上|
|9.1|java17まで|7以上|

以上のように、ASMが新しいjavaをサポートしているので、java8やjava11でのdjUnitテストが実行可能です。

Eclipse4.7からEclEmmaが同梱され「Coverage as」で、EclEmmaでのカバレッジ計測が可能になってますが、「Coverage as」でdjUnitテストの実行はできません。

# djUnit plugin version 0.9.1
Java9以降は、AppClassLoaderが、URLClassLoaderを継承しなくなったため、バージョン0.9.0でも、Java9以降のテストが実行できませんでした。
このバージョン(0.9.1)は、AppClassLoaderの問題を解消し、Java9以降でも動作することを確認しました。

また、VsCodeのJava Test RunnerやMavenからも実行できるよう、調整しています。
詳しくは、以下サイトのTipsをご覧ください。
[djUnit plugin for Eclipse version 3.7 - 4.6](https://piecemeal-technology-inc.github.io/djunit_plugin_for_eclipse_3.7-4.6/)
[djUnit plugin for Eclipse version 4.7 - 4.18(2020-12)](https://piecemeal-technology-inc.github.io/djunit_plugin_for_eclipse_4.7-4.18/)

# 最後に
いまは良いMockライブラリがたくさんありますので、これから開発するなら、それらを使うことになると思いますので、あくまでもメンテナンスなどで必要になったら使っていただければと。

最近は、VSCodeのような素晴らしいエディタがあるので、Eclipseの利用は減っていると思います。
ただ当時は、無償のJavaIDEとえばEclipseでした。
私自身もVSCodeを使うようになりましたし、これからはVSCodeで開発しますが、こんな完成度の高いIDEを無償で提供してくれたことには感謝しかありません。
【TypeScript】Utility TypesのReadonlyを理解する

# この記事は何？
この記事は、Utility Typesの一つである**Readonly**について理解する記事です。
Utility Typesってそもそも何？という型（方）は以下の記事を御覧ください🙇🏻
👉 [TypeScriptのUtility Typesを理解して活用する](https://qiita.com/NOMURA_keibyou38/items/84caee0657f57650577d)

そもそも、TypeScriptって何？って型は以下を御覧ください
👉 [JavaScriptを知っている方がTypeScriptをなんとなく理解するための記事① ~はじめに~](https://qiita.com/NOMURA_keibyou38/items/06a3218de3ff480ce9de)

# Readonly＜Type＞とは
TypeScript公式には以下のように書かれています。
> Constructs a type with all properties of Type set to readonly, meaning the properties of the constructed type cannot be reassigned.
> すべてのプロパティを読み取り専用に設定されたタイプを構築します。タイプのプロパティを再割り当てすることはできません。
> https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype

つまり、ある型を**ReadOnly（書き換え不可）にする型**になります。

実際にコードの場合、以下のように表すことが出来ます。

```typescript
type hogehoge = ReadOnly<型>
```

```typescript
// ふつーにHuman型を定義
interface Human {
    sex: 'woman' | 'man';
    old: number;
    height: number;
}

// tomオブジェクトを作成
const tom: Human = {
    sex: 'man',
    old: 14,
    height: 150
}

// tomの年齢は書き換え可能
tom.old = 15;

// Human型をReadOnlyにする
type StrictHuman = Readonly<Human>;

// トムの厳格な父のオブジェクトを作成
const tomStrictFather: StrictHuman = {
    sex: 'man',
    old: 34,
    height: 200
}

// ReadOnlyなので、書き換え不可
tomStrictFather.old = 35; // Cannot assign to 'old' because it is a read-only property.
```

このように、内容を変更したくないオブジェクトがある場合は、ReadOnly型を使うことで書き換え不可にすることができます。
値の変更により思わぬバグが起きる可能性もあるので、あらかじめReadOnlyで書き換え禁止にすることで、障害を防げるかもしれません！

# おわりに
今回は、Utility TypesのReadonlyについて紹介しました。
是非、ご活用ください！

# 参考
- https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype
Windows 10 で iOS Safari をデバッグする覚書

ｎ番煎じです。

## 準備

必要なもの

- Git
- Node.js
- Google Chrome
- Scoop

まだ Scoop Extras を入れてないなら、入れる

```
scoop bucket add extras
```

iOS WebKit Debug Proxy を入れる

```
scoop install ios-webkit-debug-proxy
```

RemoteDebug iOS WebKit Adapter を入れる

```
npm install remotedebug-ios-webkit-adapter -g
```

## iOS 側の設定

1. `設定` を開く
2. `Safari` を押す
3. `詳細` を押す
4. `Webインスペクタ` を ON にする
5. Safari でデバッグしたいページを開く

## Windows 側の設定

1. PC と iPhone を USB 接続する。
2. iPhone に PC を信頼させる。

次は RemoteDebug iOS WebKit Adapter を起動する

```
remotedebug_ios_webkit_adapter --port=好きなポート
```

1. chrome://inspect/ に行き、
2. `Discover network targets` を ON にする
3. その横の `Configure...` を押す
4. リストに `localhost:さっき設定したポート` を追加する
5. `Done` を押す
6. しばらく待ってると Remote Target が出現するので、デバッグしたいページの `inspect` をクリック
7. Safari と同期した DevTools が開く

しばらく待っても出ないときは、Safari 側をリロードしたりしてみる。

## VSCode + LiveServer で iPhone デバッグする小技

1. VSCode + LiveServer を起動し、使っているポートをメモる。
2. ipconfig で `192.168.XXX.XXX` で始まる、使っている PC の IP アドレスをメモる
3. iPhone のブラウザ側で `2.` で得た IP アドレスの `1.` で得たポートにアクセスする `192.168.XXX.XXX:PPPP`
【初心者】Swift UIを勉強する その⑤ ーーーToolbarとファイル管理

# はじめに

Toolbarは2020年リリースした新しい機能です。今日からこれを勉強していきます。
また、ファイル数がだんだん増えてきたため、どういうふうに管理すれば良いのかも見ていきましょう。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Toolbar in iOS](#Toolbar in iOS)
2. [Toolbar in macOS](#Toolbar in macOS)
3. [ファイル管理](#ファイル管理)
4. [まとめ](#まとめ)
5. [参考文献](#reference)


<!-- 各チャプター -->
<a id="#Toolbar in iOS"></a>
# Toolbar in iOS
・Toolbar画面の一番上と下の部分、safeAreaとnavigationBarと若干似ていますけれども、クロスプラットフォームできるのが魅力的です。

```swift:Sildebar.swift
#if os(iOS)
content
    .navigationTitle("Learn")
    .toolbar {
       ToolbarItem {
           Image(systemName: "person.crop.circle")
       }
     }
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/d37feed5-4b49-2344-ed75-6986db350d11.png" width=20%>　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/f2063082-b991-abcf-cfb0-4413b3d6fd76.gif" width=22%>

・`toolbar(placement: )`で場所は自由に変更することもできます。`bottomBar`にしたら画面の一番下に持っていきます。

```swift:Sildebar.swift
#if os(iOS)
content
    .navigationTitle("Learn")
    .toolbar(placement: .bottomBar) {
       ToolbarItem {
           Image(systemName: "person.crop.circle")
       }
     }
```



<a id="#Toolbar in macOS"></a>
# Toolbar in macOS
・macの場合はiOSの`toolbar(placement: )`をそのまま使えません。
・前回の記事のように、iOSとmacOSとそれぞれの処理を行います。また、`placement:`もmacが使えるアイテムに変更します。

```swift:Sildebar.swift
#else
content
    .navigationTitle("Learn")
    .toolbar(placement: .automatic) {
       ToolbarItem {
           Image(systemName: "person.crop.circle")
       }
     }
#endif
```
・`image`だけじゃなく、`Button`にするのもできます。

```swift:Sildebar.swift
#else
content
    .navigationTitle("Learn")
    .toolbar(placement: .automatic) {
       ToolbarItem {
          Button(action: {}) {
              Image(systemName: "person.crop.circle")
          } 
       }
     }
#endif
```

・`ContentView.swift`に1回目の記事で書いたカードのコードをそこに置かないべきです。
　bodyの中身を全部新しいファイル`CourseItem.swift`に移します。
・`ContentView.swift`には`Sidebar()`を呼び出して、os別の処理を追加します。

```swift:ContentView.swift
struct ContentView: View {
    @ViewBuilder
    var body: some View {
        #if os(iOS)
        Sidebar()
        #else
        Sidebar()
            .frame(minWidth: 1000, minHeight: 600)
        #endif
    }
}
```


<a id="#ファイル管理"></a>
# ファイル管理
・綺麗なコードを書くための教材は無論Appleの[オフィシャルドキュメント](https://developer.apple.com/documentation/swiftui/fruta_building_a_feature-rich_app_with_swiftui)です。
・Appleの[オフィシャルドキュメント](https://developer.apple.com/documentation/swiftui/fruta_building_a_feature-rich_app_with_swiftui)を参考に分類しましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/e83fd9dc-ca49-881d-8019-75c2988988f5.png" width=22%>





<a id="#まとめ"></a>
# まとめ
・今回までは特に難しい内容がなかったと思います。次回も頑張っていきましょう。

**ソースコード[Github](https://github.com/wsimple1028/swiftUI_ios14)**

<a id="#reference"></a>
# 参考文献
- [Design Code --- SwiftUI for iOS 14](https://designcode.io/swiftui-ios14)
プログラミングスクールでcloud9開く毎度の初期手順【超初心者】

##Cloud9の設定
Project Settings
・Soft Tabs: 4 → 2 （タブサイズを2に変更）
・On Save, Strip Whitespace: チェックを入れる （余計なスペースの自動削除）
Experimental
・Auto-Save Files: Off → After Delay (ファイルの自動保存)
フォルダの歯車アイコン
・Show Hidden Firesにチェックを入れる

##GitHubとの連携

```console:ターミナル
 $ ssh-keygen
```
エンターを繰り返す

```console:ターミナル
$ cat ~/.ssh/id_rsa.pub
```
ssh鍵をコピー、GitHubで登録

```console:ターミナル
$ ssh git@github.com
```
Hi!GitHubのユーザ名！が出れば成功

```console:ターミナル
$　git config --global user.name "GitHubのユーザ名"
$　git config --global user.email "GitHubに登録したメールアドレス"
```
これもやっておいてGitHubの連携完了。

↑これ何も考えずにやっていたけど、GitHubに公開鍵を渡しておくことで、sshでpushとかpull出来るよってことなんやな？多分

##Railsのバージョンアップ

```rb
:ターミナル
$ gem install rails -v 〇.〇.〇
$ rails -v
```

##ImageMagickのインストール

不具合があってから手順が少し変更になっていました。

```rb:console
$ sudo yum -y install libpng-devel libjpeg-devel libtiff-devel gcc
$ cd #必ず~$まで戻る！！
$ git clone https://github.com/ImageMagick/ImageMagick.git ImageMagick-7.0.11
$ cd ImageMagick-7.0.11
name:~/ImageMagick-7.0.11 $ ./configure
name:~/ImageMagick-7.0.11 $ make
name:~/ImageMagick-7.0.11 $ sudo make install

```

```rb:以前のやり方
$ sudo yum -y install libpng-devel libjpeg-devel libtiff-devel gcc
$ cd　#必ず~$まで戻る！！
$ wget http://www.imagemagick.org/download/ImageMagick.tar.gz
$ tar -vxf ImageMagick.tar.gz
$ ls　#出てきたImageMagickのバージョンをコピペ
$ cd ImageMagick-x.x.x-xx
$ ./configure
$ make
$ sudo make install
$ convert -version
```
$ convert -versionでバージョン名が確認できればOK
SQLの基本構文その1

個人的にSQLの操作にもなれたいと思い、まずはSQLの基本的な操作についてまとめた。

仮に以下のテーブルがあったとし、
![スクリーンショット 2021-03-12 20.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1182751/cd55623b-1a97-3bec-0d8e-a8934a4f0769.png)

テーブル名はjojoとする。


<h2>全テーブルを取得する</h2>

```
SELECT (カラム名) FROM (テーブル名);
```

<h3>例</h3>
nameカラムを取り出したいときは、

```
SELECT name FROM jojo;
```
nameカラムとpartカラムを取り出したいときは、

```
SELECT name, part FROM jojo;
```
全カラムを取り出したいときは、

```
SELECT * FROM jojo;
```

<h2>テーブルから特定のデータを取り出したいとき</h2>

```
SELECT (カラム名) FROM (テーブル名) WHERE (条件);
```
<h3>例</h3>
partが3のものだけ取り出したいとき

```
SELECT * FROM jojo WHERE part = 1;
```
(注意)jsなどの比較演算子のように「===」とは書かない。

part_nameがファントム・ブラッドのものだけ取り出したいとき

```
SELECT * FROM jojo WHERE part_name = 'ファントム・ブラッド';
```

<h3>ワイルドカード</h3>
テキストデータの特定のカラムを取得したい場合に、文言中に特定の文言があったときとかに

```
'%(指定したい文字)%'
```
のように%で指定したい文字をを挟む。
この%は前後どちらかに着けることも可能。


```
'アイス%'→「アイス」で始まる文言のカラムデータ
'%アイス'→「アイス」で終わる文言のカラムデータ
```

<h3>例</h3>
ageが20未満で、nameに「空条」とつくものだけ取り出したいとき

```
SELECT * FROM jojo WHERE age < 20 LIKE '%空条%';
```

ageが20未満で、nameが「空条」から始まるものだけ取り出したいとき

```
SELECT * FROM jojo WHERE age < 20 LIKE '空条%';
```

partが7以下で、nameが「ジョースター」で終わるものだけ取り出したいとき

```
SELECT * FROM jojo WHERE part <= 7 LIKE '%ジョースター';
```

<h3>条件を複数つけたいとき</h3>
・nameが「ジョースター」で終わる
・ageが20未満
これら2つの条件を満たすカラムを取り出したいとき

```
SELECT * FROM jojo WHERE LIKE '%ジョースター' AND age < 20;
```

どちらかでいい場合は、

```
SELECT * FROM jojo WHERE LIKE '%ジョースター' OR age < 20;
```


<h3>何も入っていない値を取得したいとき</h3>
今回はageに何も入っていないカラムがあるので、これを取得したいとき、

```
SELECT * FROM jojo WHERE age IS NULL;
```

逆に、ageがNULLじゃないカラムを取り出したいとき、

```
SELECT * FROM jojo WHERE age IS NOT NULL;
```

<h2>取り出したデータを並べ替えたい場合</h2>
<h3>例</h3>
ageが大きい順に並べたいとき、

```
SELECT * FROM jojo ORDER BY age ASC;
```

ageが小さい順に並べたいとき、

```
SELECT * FROM jojo ORDER BY age DESC;
```

ちなみに

```
ASC→ASCEND(上昇する、昇る)
DESC→DESCEND(加工する、下る)
```
という英単語の頭文字。

<h2>取得するデータの上限を設けたいとき</h2>
<h3>例</h3>
ageが20未満で、5こだけデータを取り出したいとき、

```
SELECT * FROM jojo WHERE age < 20 LIMIT 5;
```
クラウドサービスを知る

よく「未経験エンジニア志望の人は、ポートフォリオをHerokuかAWSへ！」という声を耳にします。これらのサービスを理解する上で、まずはクラウドサービスの主な3つ分類、IaaS、PaaS、SaaSというものを理解する必要があります。

##クラウドサービスとは
クラウドサービスとは、従来は利用者が個別のパソコンで利用していたデータやソフトウェアをネットワーク上でサービスとして提供することです。利用者は最低限の環境でサービスを利用することができます。
クラウドサービスは、主に以下の3つに分類されています。

###IaaS(Infrastructure as a Service)
サーバやストレージ、ネットワークといったインフラを提供するサービスです。HaaS（Hardware as a Service）と呼ばれることもあります。サーバーのスペックやOS等を選択することができ、自由度は高いです。AWS(Amazon Web Services)や、さくらインターネットのクラウドがこれにあたります。

###PaaS(Platform as a Service)
OSやミドルウェア(Webサーバ、アプリケーションサーバ、データベース管理サーバなど)を含めたプラットフォームを提供するサービスです。インフラ管理の煩わしさが解消できるメリットがあります。Microsoft Azure、Google Cloud PlatformやHerokuがこれにあたります。

###SaaS(Software as a Service)
アプリケーションまで含めたソフトウェア全体を提供するサービスです。インターネットに接続するだけで使えるので、普段目にするのはこのサービスでしょう。GmailやOffice365などがこれにあたります。

これらのサービスの特徴を表にすると以下のようになります。

|                  | IaaS  | PaaS | SaaS |
| :--------------- | :---: | :---: | :---: |
| アプリケーション |       |      | ○    |
| ミドルウェア     |       |    ○ | ○    |
| OS               |   ○   |  ○ | ○    |
| ハードウェア     |   ○   |    ○ | ○    |
| ネットワーク     |   ○   |    ○ | ○    |

クラウドサービスの大まかな種類について学ぶことができました。ポートフォリオを上げる際の具体的な手順といった実務的なことではありませんが、知識として覚えておきましょう！

#参考
[クラウドの3大カテゴリ！IaaS、PaaS、SaaSの違いについてわかりやすく解説！ | 知っておきたいIT用語シリーズ](https://www.youtube.com/watch?v=84vAVa5DGF4)
[AWSのPaaS, SaaSを利用して開発を効率化する](https://qiita.com/siro33950/items/f693d8acf9116c0f1319)
[クラウドサービスとは？](https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/service/13.html)
[自分メモ]Vue.jsのtransitionで要素をフワッと浮かび上がらせる

#概要
モーダル画面をフワッと出したいと思ったのでtransitionを使って実装したので自分用にメモします。

#実装
```.vue
<template>
    <transition name="component-balloon">
      <div
        v-show="balloonFlug"
        class="overlay"
        @click="leaveBalloon">
        //省略
      </div>
    </transition>
</template>
<style scoped>
  .component-balloon-enter-active,
  .component-balloon-leave-active {
    transition: opacity .2s ease;
  }
  .component-balloon-enter,
  .component-balloon-leave-to {
    opacity: 0;
  }
</style>
```

##メモ
transitionをを反映させたい要素を transitionタグで囲います。

nameには任意の名前をつけます。

name-enter-active: 要素が挿入される前に適用されアニメーションが終わると削除
name-leave-active: 要素が消える直前に適用されアニメーションが終わると削除
name-enter: 要素が挿入される前に適用され、挿入された１フレーム後に削除
name-leave-to: 要素が消える１フレーム後に追加され、アニメーションが終わると削除
Laravelのdd()みたいな関数をJavaScriptで1行で作る

普段、LaravelとNode.jsで開発することが多いのですが、Laravelでdd()を使いまくっていたらJSのほうでもdd()を使いたくなったので、1行でdd関数を定義してみました。

## Node.js用

```js
const dd = (...args) => { console.log(...args); process.exit() }
```

`console.log`だと3階層以上の入れ子になっているオブジェクトは中身が見れず`[Object]`としか出力されないので、ネストが深いオブジェクトの中身を見たい場合は下記コードのほうが良いです。

##### ネストが深いオブジェクトの出力用
```js
const dd = (...args) => { console.dir({ ...args }, { depth: null }); process.exit() }
```
`console.dir`を使ってオプションに `{ depth: null }`を渡すと、ネストしたオブジェクトの中身を全部見れるようになります。


## フロントエンド用

```js
const dd = (...args) => { console.log(...args); throw new Error() }
```
フロントエンドだと process.exit() が無いので throw で例外発生させて処理を止めてます。
【Laravel】コントローラ（やincludesなど）からビューの中のscriptタグに変数を渡す方法

Laravelのブレードの中の`<script type="application/ld+json">`タグ内のオブジェクトの中で変数を使う方法について。



##結論
`{{$変数名}}`。HTMLタグの中で使うのと同じ。


```json:
<script type="application/ld+json">
[
    {
        "@type": "BreadcrumbList",
        "@context": "https://schema.org",
        "itemListElement": [
            {
                "@type": "ListItem",
                "position": 1,
                "title": "{{$title}}",
                "item": "{{$url}}"
            }
        ]
    }
]
</script>
```

`{{$title}}`や`{{$url}}`に受け取ったデータが渡される。




<br>
##実例：コントローラからデータを渡す
データを変数として渡すのは、基本的にコントローラ（またはincludes）などを使う。


###ルーティング

```php:web.php
Route::get('/article-{articleId}/', [ArticleController::class, 'show'])
        ->name('article.show');
```

URLで`{ }`を使うと、入力された文字列がカッコ内の変数名で渡される。（パラメータ）

`https://example.com/article-12`であれば、Articleコントローラのshowアクションに`$articleId`で12が渡れる。



<br>
###コントローラ
コントローラでビューに渡す変数を用意する。

▼例：入力されたURLから受け取ったデータと、モデル（DB）から引き出したデータを渡す。

```php:コントローラの例
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;

#Articleモデルの読み込み
use App\Models\Article;


class ArticleController extends Controller
{
    #コンストラクタの定義（インジェクションでArticleモデルのインスタンスを$articleに格納）
    public function __construct(Article $article)
    {
        $this->Article = $article;
    }

    #ルーティングからのパラメータを引数で渡す
    public function show (string $articleId)
    {
        $articleId = $articleId
        
        #Articleモデルから対象の記事データインスタンスを作成
        $article = Article::article($articleId)
        $title = $article["title"]

        #viewの指定と渡すデータを指定
        return view('pages.articles.show', compact(
            'articleId',
            'title'
        ));
    }
```

views > pages > articles > show.blade.phpファイルにcompactでデータを渡している。

```php:compact
compact('articleId', 'title')

↓ 同じ

array( 'articleId' => $articleId, 'title' => $title )

```

`'A' => $B`は、コントローラ内の`A`という変数のデータをビューに変数名`$B`で渡すことを意味している。


###ビュー
コントローラから渡されたデータを表示する。

```php:show.blade.ph
<h1>{{$title}}</h1>

<script type="application/ld+json">
[
    {
        "@type": "BreadcrumbList",
        "@context": "https://schema.org",
        "itemListElement": [
            {
                "@type": "ListItem",
                "position": 1,
                "title": "{{$title}}",
                "item": "{{$url}}"
            }
        ]
    }
]
</script>
```


<br>
以上。
JavaScriptでCanvasを利用して画面を描く方法

Javascriptで画面を作るに当たって、canvasという物をを使用して作ることができます。

##Canvasって何？

[https://developer.mozilla.org/ja/docs/Web/API/Canvas_API](https://developer.mozilla.org/ja/docs/Web/API/Canvas_API)

> Canvas API は JavaScript と HTML の <canvas> 要素によってグラフィックを描く方法を提供します。他にも、アニメーション、ゲームのグラフィック、データの可視化、写真加工、リアルタイム動画処理などに使用することができます。
Canvas API は全体的に 2D グラフィックを対象としています。 WebGL API は、こちらも <canvas> 要素を使用して、ハードウェアで高速化された 2D および 3D グラフィックを描きます。

# HTML

- id属性をつける、値は任意で

```html
<canvas id="canvas"></canvas>
```

# JavaScript

- id属性の値を指定して、canvas要素を取得
- getContextというメソッドを使って、CanvasRenderingContext2Dというオブジェクトを取得する

```jsx
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
```
こんな感じでコードを書く


## CanvasRenderingContext2Dとは？

[CanvasRenderingContext2D](https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D)

レンダリングコンテキストは何か？これは「Canvas要素に対して文字や図形を描画するための機能」。
図形・文字・写真・その他の全ての**二次元空間で表現できる「絵」**は色のついた「点」の集合。

線も、円も「点(ピクセル)」の集合。

なので、**CanvasRenderingContext2D**はその点(ピクセル)をCanvas上の自由な場所に描くことができる機能を提供してくれるということ。

## 自由な場所に点を打てるということは

どんな絵でもCanvas上に表現できるということです！

- 塗りつぶす `fillRect`
- 円を描く `arc`
- パス(経路)を指定して線を引く `stroke`

などの便利なメソッドが豊富にあり、それらのメソッドを呼び出すことで複雑な図形を描画することが可能。

これらを利用し、htmlデータで画面を作成する為に、このようにコードを書き始めます。

```html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <canvas
      id="canvas"
      style="background-color: aqua"
      width="500"
      height="500"
    ></canvas>

```
すると、
[![Image from Gyazo](https://i.gyazo.com/982e5ff808df99ddc0a0bbd6504d0446.png)](https://gyazo.com/982e5ff808df99ddc0a0bbd6504d0446)

このように表示されます。

#まとめ
このようにcanvasを使うことで画面を描くことができます。
今迄の学習内容3

次に、「今迄の学習内容2」で述べたLinuxやネットワークの知識を使ってのサーバ構築（DNS・FTP・ファイル共有・Web・メール）、マークアップ言語はHTML・CSS、プログラミング言語はJavaScriptを先ず学びました。
Progateは無料分しかやってません。
一般書籍は少し覗いた位で、未読です。
Rubyによるバブルソートアルゴリズム

学習機会があったので、Rubyのソートアルゴリズムについて記事に書いておこうと思います！

## ソートアルゴリズムとは
アルゴリズムの中で最も基本的なものが「ソート（整理、並べ替え）」です。
データベースをはじめ、大量のデータを扱う機会は少なくありません。その際に、データを昇順、降順など、一定の規則に従って整列させる必要があります。そのための技術がソートアルゴリズムです。

代表的なソートアルゴリズムとして知られるひとつ「バブルソート」を書き残しておきます。
<br>
<br>
全体コードから見て行きましょう

```
def bubble_sort(nums)
  # 要素数10件
  len_nums = nums.size
  # limitが左にずれていく繰り返し処理
  for i in 0..(len_nums - 1)
    # limitに辿り着くまで隣同士の数値の比較を行う
    for j in 0..(len_nums - 2 - i)
      # 左の数値が大きかったら
      if nums[j] > nums[j + 1]
        # 左の数値を右に、右の数値を左に入れ替える
        nums[j], nums[j + 1] = nums[j + 1], nums[j]
      end
      # endなので次の隣通しの比較を行う
    end
    # endなのでlimitが左にずれる
  end
  return nums
end

# main
nums = [10, 8, 3, 5, 2, 4, 11, 18, 20, 33]
puts bubble_sort(nums)
```



要は`[10, 8, 3, 5, 2, 4, 11, 18, 20, 33]`の配列昇順にならびかえています。

Rubyには```sort```という便利なめそっどがあるので、
```nums.sort```ってやっちゃえば一発でできちゃうのですが。
どうゆう処理されてんねんてのが上のコードになります！！

<br>
自分用メモなので短くてすみません！！
それでは！
VRと視力の関係

今回はVRと視力の話です。:eyes:

VR使った時、ヘッドのディスプレイに通じて、画面を見えるようになっています。
目の前に広い空間が存在するように感じますが、
実際、結構近い距離でディスプレイを見ています。

そこで、
こんな近い距離でディスプレイを見るには、「視力に影響しますか？」の話です。
# VRは視力に影響しますか
皆さんは「テレビを近くで見ると目が悪くなる」という認識が持っていると思います。
テレビも、VRもディスプレイだから、「目には影響ある」と思ってもおかしくないです。

私もそう思い、気になって調べましたが、
「VRを5ヶ月毎日続けて視力が回復」という記事が見ました！
# 「ＶＲで視力が回復する」という噂は本当か
私は、連続で毎日VR使っていませんので、参考になれないですが、
色々調べましたので、調べた記事まとめました。

正直、自分は目や視力に関する知識は全くありません、記事見ても真偽の判断は出来ません。
ただ、記事をまとめて、皆さんに参考出来ればと思います。
![vr_oggle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/6e17efe2-423b-db59-0faa-c74c560fcb51.png)
## 「VRを5ヶ月毎日続けて視力が回復」
まずは「VRを5ヶ月毎日続けて視力が回復」この記事です。

2018年8月3日、Twitterで「VRゴーグルを毎日のようにつけていたら視力が0.3から1.0に回復した」という投稿がありました。
[「VRゴーグルを毎日のようにつけていたら視力が0.3から1.0に回復した」][] Twitterリンクです。
[「VRゴーグルを毎日のようにつけていたら視力が0.3から1.0に回復した」]:https://twitter.com/0yasum13/status/1025156821403627520?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1025156821403627520%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.moguravr.com%2Fvr-eyesight%2F

## 実験により視力向上が明らかに！
この記事によると「中国・北京の研究機関アドバンスド・イノベーションセンター」中国在住の9～12歳の子ども計50人を対象に、VRが視力にどのように影響するのかを検証する実験をしました。
結論は、視力が向上したという結果が得られたのです。

多分翻訳の問題だと思いますが、「アドバンスド・イノベーションセンター」みつかりませんでしたが、
[実験レポート][]　が見つかりました。
[実験レポート]:http://n3.sinaimg.cn/sina_vr/647a35e2/20170612/YingWenBaoGao.pdf
参考になれると思います。

## 眼科医が考えるＶＲのポイント
この記事では、
――ほかにＶＲで視力回復した理由として考えられることはありますか。
「もうひとつは、ＶＲで脳の処理能力が上がったために、視力が回復したかもしれないということが考えられます」
「物を見るという行為は、眼球でとらえた情報を目で処理するのではなく、最終的には脳で処理することで見えたものを認識しています。その脳の処理能力が上がると、視力が上がるというのは学術的にも証明されているんですね」
を記載されています。

結論は、「視力が回復したでは無く、脳の処理がアップしたから」になります。

# 結論
VR、視力を検索すると、（日本の記事では）ほぼ90%の比率で、目には良いという結論でしたが、
上記の中国の実験を探す時、他の関連記事もみました。
「目には悪い影響があり」の記事が圧倒的に多かったです。
論点色々ありますが、一番分かりやすいのは、「画面に近いから」と「ディスプレイの質は低いから」です。これらも結構一理あると思います。

なので、絶対100%正解の結論を出すのが難しいと思います。
皆さんの判断にまがせます。
では。
Ubuntuでsudoのパスワード入力の際にIMを変更する

コマンド履歴からsudo付きのコマンドを呼び出した際、パスワード入力の際に`ぱっｓ`みたいに日本語が出てきてがっくりしてしまったので（passの日本語打ち）

```bash:~/bash_aliases
# use alias sudo
function im_check () {
  if [ $(ibus engine) = "mozc-jp" ]; then
    ibus engine xkb:us::eng
  fi
}
alias sudo='im_check; sudo '
```