OmniAICreator/Qiita-1.07M huggingface dataset:
【Javascript】filterメソッド 条件に一致した要素を取り出す

Javascriptについてプラグラミングん勉強を始めた初めの頃に勉強をしたが、全くと言っていいほどなにも覚えていないため復習のためにQiitaにまとめ振り返っていこうと思う。

## filterメソッド
filterメソッドとは```記述した条件に一致した要素のみ抽出してあらたな配列を作成する```メソッド。

```javascript
// charactersという配列をつくる。
const characters = [
  {id: 1, name:"田中太郎", age: 56},
  {id: 2, name:"小林ゴリラ", age: 1},
  {id: 3, name:"森本ジョンソン", age: 31}
];

// charactersから30歳未満のキャラクターを取り出し、定数underThirtyに代入してください
const underThirty =  characters.filter((character) => {
  return character.age < 30;
});

// underThirtyを出力する。
console.log(underThirty);
```

### 出力結果
```
[ 
  {id: 2, name:"小林ゴリラ", age: 1}
]
```
npm ws のクライアントインスタンス生成，接続時イベントの登録，接続手続きの順番

`node.js`で簡単にwebsocketの機能をつかえるようになるライブラリ`ws`を
つかっていて，サーバーの方はまあわかるとして，クライアント`Class: Websocket`の挙動がというか，設計がわかりにくかったので実験したらふぇぇって感じだった．
（とはいえまあサーバーの方で大量に管理するクライアントの記述を思うとこれでちょうどいいのかもしれない．）

#気になった点
クライアントクラスの実行例として以下のようなモノがGitにある

```js:client
const WebSocket = require('ws');

const ws = new WebSocket('ws://www.host.com/path');

ws.on('open', function open() {
  const array = new Float32Array(5);

  for (var i = 0; i < array.length; ++i) {
    array[i] = i / 2;
  }

  ws.send(array);
});
```

これだけである．簡単！と思えればいいのだけど，
素朴に考えると，接続完了時に発行される`'open'`に対するEventを登録（`ws.on()`）してから接続を開始する気がする．

しかしながらこの例には続きがなく，これで完結しており，実際別プロセスで`ws.Server`のサンプルプログラムを動かしてからこれを実行すると，ちゃんと動く．

`.on()`は継承（？）しているEventなんとかクラスのものであって，`Websocket`クラス固有のものではない．
したがって接続を開始するとしたらコンストラクタでしかありえない．
実際ソースを見てみると，そんな感じだった．

詳しくは見ておらず，間違っている可能性も大いにあるが，流れとしては

- クライアント: コンストラクタでいろいろ調整
- クライアント: おそらくhttpで`upgrade`が承認されたとき用のイベントを登録
- クライアント: httpでupgradeをhttpサーバーに要請
- ここでコンストラクタの処理が終わる．
- そしてhttpサーバーがwssocketサーバーにアップグレードした旨が伝わり次第，クライアントに`open`イベントが発行される．

という感じであった．
すなわち，`ws.on()`はコンストラクタの処理が終わって，サーバーから`upgrade`が通知されるまでの間に行われないと，`'open'`イベントをキャッチできない．

# 実験

実際以下のようなプログラムで比較するとわかる．ちなみにサーバー側では`send(data)`で送った内容（`data`）がそっくりそのまま返ってくる．

```js
const websocket = require("ws");
const sock = new websocket("ws://127.0.0.1:5001", {
    perMessageDeflate: false
});

const openev = () => {
    sock.on("open", () => {
        console.log("event as connected ");
    });
}
sock.on("message", data => {
    console.log("event as getting message from the server");
    console.log("echo: " + data);
});
sock.on("close", () => {
    console.log("event as closed");
});

```
↑ここまで共有

Case 1:

```js
console.log("ws state:" + sock.readyState);
openev(); //<-コンストラクタが終わってすぐくらいにopen event時のコールバック設定
//1s後にデータを送ってから接続を終える．
setTimeout(() => {
    console.log("ws state:" + sock.readyState);
    sock.send('a');
    sock.close();
}, 1000);
```

結果：

```
ws state:0
event as connected 
ws state:1
event as getting message from the server
echo: a
event as closed
```

case 2:

```js
console.log("ws state:" + sock.readyState);
//openev(); 
//1s後にデータを送ってから接続を終える．
setTimeout(() => {
    console.log("ws state:" + sock.readyState);
    openev(); //<-1s後にopen event時のコールバック設定
    sock.send('a');
    sock.close();
}, 1000);
```

結果：

```
ws state:0
ws state:1
event as getting message from the server
echo: echo back: a
event as closed
```

case 1とcase 2を比較すると`ws state:0`と`ws state:1`との間にあった`event as connected`が表示されなくなっている．

といわけで，なんだか意図しないデータの取りこぼしとか起こりそうだなと思ってなんか気もち悪い気がしたというわけでした．

ちなみに，コンストラクタで接続を開始せずに，あとから接続を開始できる関数がないか探しましたが見当たりませんでした．というか検索していると再接続もできないので，別のを作ったり使ってる人が見受けられました．もし接続用の関数があれば再接続もできるはずなので，やはりないのでしょう．

ここまで書いて誰かすでにQiitaで記事書いてそう．だけどいい練習になったのでよし．
SPSS Modelerで入出力のファイルパスをstrファイルと同じフォルダに一括変更する

SPSS Modelerで他の人からもらったストリームを実行するときにファイルパスが違って実行ができないことがあると思います。このファイルパスを一括変換するスクリプトを以前作りました。

https://qiita.com/kawada2017/items/5db798b8becbf3e75f2b%E3%80%80

ただ、毎回パスを指定するのが面倒なので、strファイルが保存されているフォルダと同じパスに一括変換するバージョンを作りました。

作ったpythonスクリプトは以下に置きました。

https://github.com/hkwd/spssmodelerscript/tree/master/210430changeDirectoryWithStrFile


■テストした環境
Modeler 18.2.2
Windows 10


```python:changesavedpath.py
import modeler.api
import os

for stream in modeler.script.streams():
    print("stream:"+stream.getName().encode('utf-8'))
    streamfilenpath=stream.getLastSavedAs()
    newpath=os.path.dirname(streamfilenpath)

    #session=modeler.script.session()
    #newpath=session.getDefaultDataDirectory()
    print("newpath:"+newpath.encode('utf-8'))

    for node in stream.iterator():
        if (node.getTypeName() == "variablefile"
            or node.getTypeName() == "excelimport"
            or node.getTypeName() == "statisticsimport"
            or node.getTypeName() == "outputfile"
            or node.getTypeName() == "excelexport"
            or node.getTypeName() == "statisticsexport"):
            full_filename=node.getPropertyValue("full_filename")
            print("old:"+full_filename.encode('utf-8'))
            full_filename=newpath+"\\"+os.path.basename(full_filename)
            #full_filename=os.path.basename(full_filename)
            print("new:"+full_filename.encode('utf-8'))
            node.setPropertyValue("full_filename",full_filename)
```
stream.getLastSavedAs()で、最後にstrファイルを保存したpathを取得して、そのパスをデータファイルのパスとして一括変換しています。

テスト実行してみます。

C:\Users\dsuser01\Documents\テストというフォルダにtest.strと入力データのiris.csvがあります。
可変長入力ノードでC:\Users\dsuser01\Documents\テスト\iris.csvは絶対パスで指定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f71e8ada-6f0a-225e-c4df-b0be8dc2817d.png)


strファイルとデータの入っているフォルダの名前を変えてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f420b90f-bbf7-0e65-6f35-1c6806347d83.png)

これでtest.strを開いて実行するとC:\Users\dsuser01\Documents\テスト\iris.csvが見つからないためエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e32ab852-80e8-9a7f-eca2-ad0b154c1917.png)

まず一回上書き保存します。これでstream.getLastSavedAs()が書き換えられました。上書き保存をしないとC:\Users\dsuser01\Documents\テスト\test.strという古いパスのままになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a3ae8735-d3ec-4b40-6801-c33a01d9bdfd.png)

ツールメニューのスタンドアロンスクリプトを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3f06c6bb-8e71-f4a2-abe0-d272cfb4ca69.png)

スクリプト欄にchangesavedpath.pyの中身を貼付け実行します。
デバッグのタブをみるとC:\Users\dsuser01\Documents\テスト\iris.csvがC:\Users\dsuser01\Documents\テスト_変更\iris.csvに書き換わったことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1cf254a6-53c4-95f8-106f-b1068f81aec1.png)

確かに入力のノードのパスがstrファイルのフォルダと同じなっていて、実行ができるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4ade04f6-0676-705d-2f5f-52cf09acb2cd.png)
Premiere Proでマウスホイールでタイムラインを平行スクロールする方法

ブログで解説記事などを書いています⬇️

https://www.chickensblog.com/

<h1>Prでマウスホイールでタイムラインを平行スクロールする方法
<h2>方法
<p>環境設定→一般からタイムラインを選択
![スクリーンショット 2021-04-30 18.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964269/036d8db8-ea39-7508-5979-d3934312dbd9.png)


<p>タイムラインのマウススクロールを水平方向にする
<p>OKを押して保存
Photoshop カラーピッカーがおかしい

カラーピッカーを選択すると「クレヨン」みたいな表示のほうしか出ない…？
おかしいというか、設定が違ったみたいです。

▼
環境設定＞一般＞カラーピッカー＞「Apple」

「Apple」 🍎 を「Adobe」 🌈 になおしましょう。

![ 2021-04-30 18.29.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/f4482887-14d7-7922-c5f9-30a5e356bb6b.jpeg)
A server is already running. エラーの解決策

```rb:terminal
A server is already running. Check /Users/maedatakuo/projects/furima-32844/tmp/pids/server.pid.
```

>参考:ぷりくろ.com
>https://purikuro.com/2020/08/13/programing_error/

解決策1 サーバーの切り忘れ
-

開いてるターミナルを全部終了して、rails sでサーバー起動をする.
そう言った場合は１つずつ「コントロール+C」を押して、サーバー停止させるか、ターミナルを消してしまいましょう。

解決策2　lsof -wni tcp:3000と　kill
-

```rb:terminal
maedatakuo@maedatakudainoMacBook-Air furima-32844 % lsof -wni tcp:3000
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    56002 maedatakuo   12u  IPv4 0x5a5a3176181f2d33      0t0  TCP 127.0.0.1:hbci (LISTEN)
ruby    56002 maedatakuo   14u  IPv6 0x5a5a3176211a8c53      0t0  TCP [::1]:hbci (LISTEN)
ruby    56002 maedatakuo   26u  IPv6 0x5a5a3176211a85f3      0t0  TCP [::1]:hbci->[::1]:65376 (CLOSE_WAIT)
ruby    56002 maedatakuo   27u  IPv6 0x5a5a317625f7ef93      0t0  TCP [::1]:hbci->[::1]:65368 (CLOSE_WAIT)
ruby    56002 maedatakuo   30u  IPv6 0x5a5a3176243d65f3      0t0  TCP [::1]:hbci->[::1]:65372 (CLOSE_WAIT)
ruby    56002 maedatakuo   33u  IPv6 0x5a5a317625f7e933      0t0  TCP [::1]:hbci->[::1]:65379 (CLOSE_WAIT)
```

```rb:terminal
maedatakuo@maedatakudainoMacBook-Air furima-32844 % kill -9 56002
```

pitというのが裏で動いているサーバー番号になります。これをkillします。
私はこれでなおりました。


解決策3 ps aux | grep rails でプロセス削除
-

```rb:terminal
$ rails s
=> Booting Puma
=> Rails 5.0.7.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
A server is already running. Check プロジェクト名/tmp/pids/server.pid.
Exiting

$ ps aux | grep rails
user   28321 s001  S+     0:00.00 grep rails

$ kill -9 28321

$ rails s
→ 解決
```

rails サーバーのプロセスを終了させる方法です。
実は、僕はこの方法で解決できたことがありません。
もしこの方法で直せた方や、原因が分かる方がいらっしゃればご教授願いますっ

解決策4　rm /tmp/pids/server.pid でパスを指定して削除
-

```rb:terminal
$ rm /tmp/pids/server.pid

$ rails s
→ 解決
```

このファイルの場所は[アプリ名]/tmp/pids/server.pidに入っているので、パスを指定して削除します。
本来、サーバーを終了するとこのファイルは削除されますが、残ったままでエラーになっている可能性があるみたい。
Rubocop のエラー解決法。Style/RedundantFetchBlock: in 'config/puma.rb' について

そもそも、<b>Redundant</b>FetchBlock とは？

# Redundant の語源

Re / d / und / ant

Re (繰り返し) + und（波）+ ant (名詞化させる接尾辞)

つまり「波が繰り返していること」

要するに「あふれていること」

もっとコンパクトに言うと「氾濫」

だから、RedundantFetchBlock とは、FetchBlock が「氾濫」していることを指している。

※ d は発音をスムーズに繋げるためのもので、ここでは無視。



#エラー内容
```
$ rubocop --auto-gen-config
```
このコマンドを打つと、.rubocop_todo.yml に直すべき課題が与えられる。

```.rubocop_todo.yml
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: SafeForConstants.
Style/RedundantFetchBlock:
  Exclude:
    - 'config/puma.rb'
```
今回は、Style/RedundantFetchBlock: という課題が与えられた。

Exclude: で示されている 'config/puma.rb' を見に行こう。
   


```config/puma.rb
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
pidfile ENV.fetch('PIDFILE') { 'tmp/pids/server.pid' }
plugin :tmp_restart
```

今回、「氾濫」しているというのは、2つ。

1行目

```
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
```

4行目

```
port        ENV.fetch("PORT") { 3000 }
```


これらを以下のように書き換える。

1行目（変更後）

```
max_threads_count = ENV.fetch('RAILS_MAX_THREADS', 5)
```

4行目（変更後）

```
port        ENV.fetch('PORT', 3000)
```

##修正したコード全文
```config/puma.rb
max_threads_count = ENV.fetch('RAILS_MAX_THREADS', 5)
min_threads_count = ENV.fetch('RAILS_MIN_THREADS') { max_threads_count }
threads min_threads_count, max_threads_count
port        ENV.fetch('PORT', 3000)
environment ENV.fetch('RAILS_ENV') { 'development' }
pidfile ENV.fetch('PIDFILE') { 'tmp/pids/server.pid' }
```

これで氾濫は治まった。
Colab Proが日本に上陸したので使ってみたお話

# 内容
Google ColabolatoryのPro版は今まではアメリカとカナダでしか使えませんでしたが、2021年3月26日にブラジル、フランス、ドイツ、インド、日本、タイ、イギリスで正式サービス開始しました！
さらに！いつの間にかterminalが使えるように！！
今回はとりあえず使ってみた感想と現状でのセットアップを紹介していきます〜。

# 感想
- 良いところ
    - terminalが使える
    - vimもzshもtmuxも普通に使える
    - スペックの高いGPUが優先的に割り当てられる
    - ハイメモリVMが使える
-  残念なところ
    - 操作にタイムラグが生じる
    - 毎度環境構築するのが面倒
    - ~~何故かスレッド並列化できない（自分にミスがあるのかも）~~ ハイメモリVMでなければできました！

# 登録
登録はめっちゃ簡単！使いたいgoogleアカウントでログインしてから[Colab Pro - Google Colab](https://colab.research.google.com/signup)にアクセスして情報を入れるだけ！
![スクリーンショット 2021-04-30 17.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324488/229024af-e755-31e6-75e4-fad7543e68fc.png)

# Terminalの雰囲気
なんとterminalが使えるという話でした。今までも`!`や`%%bash`で出来てはいたものの、なんか面倒だし`.py`動かすのも面倒だしvimは使えないし。それがかなり解決されました。
zshも`apt`でinstallできましたし、`.zshrc`をいじることで下記のようにカスタマイズもできましたよ！！（感激）
![スクリーンショット 2021-04-30 17.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324488/4d14d92f-d363-1d22-e452-42435619458f.png)

もちろんvimも`.vimrc`でカスタマイズできました〜！
![スクリーンショット 2021-04-30 17.21.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324488/bbeee1cc-648b-8433-f1e7-d548cc361397.png)

さらにvimのパッケージも使えました。vim使いとしては願ったりかなったり...。
![スクリーンショット 2021-04-30 17.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324488/9b738473-103a-97b4-db47-efd4f0ca5e46.png)

tmuxも普通に使えました！
![スクリーンショット 2021-04-30 17.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324488/10451967-677e-5caa-99af-097ef9dbe9e9.png)


# 今後の環境構築の見通し
とは言え、毎度カスタマイズしたりinstallしたりするのは面倒なもの。ということで、最善策ではないでしょうが、google driveに`setup.sh`なるshell scriptを作成し、毎度やる作業（install関係であれば`apt install xx`やファイル作成であれば`cat <<EOF > xx.ext`）を全て書き込んで、使う時にgoogle driveをマウントして`sh setup.sh`で環境構築することにしました。現状それで上手く行っています！

[追加]
現在はdotfilesというrepoでgit管理する体制に移行したので、colabでもgit cloneしてsymbolを張った方が良いですね。そちらも別記事にて追々書いていきたいと思います。

# スペック
$N = 1$ですが。

- 通常のCPU
    - memory: 13.7 GB
    - Core数: 4
- ハイメモリVM
    - memory: 27.4 GB
- GPU
    - 種類: Tesla P100-PCIE
    - memory: 16 GB

通常盤Colabでは同じタイプで複数セッションができなかったと思いますが、Colab Proではできました。[Colab Proを２ヶ月ほど使ってのメモ（良い点 / イマイチな点）](https://qiita.com/kurilab/items/c58226bcb6150d50b618)によれば、Colab ProでもGPUを使いすぎると制限かかるみたいなので、あまりにも並列して使おうとしては失敗しそうですね。とはいえ、研究ならば仮実験として、個人であれば簡単な実験やお遊びとしてはかなり使えると思います。

tmuxが使えたのは驚きでした。ですが、**1つのセッションでtmuxを使い2つのプログラム回すと、コア数が少なくメモリを食い合うためか1つだけプログラムを回した時より倍近くかかりました**。並列させるなら複数セッションで回すべきかもしれません（その場合は速度は落ちませんでした）。コア数がもっと多かったら並列して動かせて嬉しいんだけどなぁ...（欲張るな笑）。
ちなみに、CPUでは5つ、GPUでは3つのセッションを立ち上げることができました。それ以上では、アクティブなセッションが多すぎますと怒られてしまいました、、、

# 謎
- マルチスレッドが落ちる
    - ローカルPCでは複数スレッドで動いていたシミュレーションが、Colab Proでは動きませんでした。Errorは出ず、途中から反応がない感じです。スレッドを1つにすると正常に動くので、スレッドの並列化あたりは何かトラップがありそうです。解決方法ご存知の方はご教授頂けますと幸いです。
    - [2021/05/01 追記]
複数スレッドできました。どうやら、ハイメモリに設定すると理由はよく分かりませんが失敗するようです。あれこれ調べてみると、`multiprocessing.queue()`の`get()`で失敗していました。それ以上のことはよく分かりかねますが。スレッド並列化する場合で特にメモリに困っていない場合は、ハイメモリVMは使わない方が吉かもしれません。
アソシエーション

# アソシエーション
アソシエーションとはモデルを利用したテーブル同士の関連付けのことです。
アソシエーションをモデルに定義することで、そのモデルに紐づく別のモデルの情報へアクセスできるようになります。

# has_manyメソッド
投稿機能機能があるものを実装する際に、Userモデルの視点で考えると、あるユーザーの作成した投稿は複数個ある状態です。

つまり、1人のユーザーは複数の投稿を所有しています。

この状態のことを、has_manyの関係と言います。

この関連付けをするため、userと他のモデルとの間に「1対多」の繋がりを示すものが、has_manyメソッドと言います。

# belongs_toメソッド
1つの投稿は、1人のユーザーが投稿したものです。

つまり、1つの投稿を複数人が投稿できないため、投稿は必ず1人のユーザーに所属します。

この状態のことをbelongs toの関係と言います。

「1対1」の具体資を似のが所属します。

# has_oneメソッド
テーブルのつながりが、1対1の関係の時に使用するメソッドです。

# 中間テーブル
その名の通り2つのテーブルの中間にあるテーブルのことです。

中間テーブルは、多対多の関係にある2つのテーブルの間に挟まって、2つの組み合わせパターンだけをレコードとして保存します。

# throughオプション
has_manyメソッドのthroughオプションは、モデルに多対多の関連を定義するときに利用します。throughという名前のとおり、「〜を経由する」という意味です。

多対多の関係にある2つのテーブルのモデルでは、has_manyメソッドによる1対多のアソシエーションを互いに定義するのと合わせて、throughオプションによって経由する中間テーブルを指定します。
PLUMED入門 その４ MOLINFOショートカットを使ってCVの指定を楽にする

#はじめに
本シリーズは下記チュートリアルを実施したメモです。

https://www.plumed.org/doc-v2.6/user-doc/html/master-_i_s_d_d-1.html

本記事はPLUMED入門の第４回です

過去回はこちら↓

https://qiita.com/tacoma/items/8b445de0a716477843f8

https://qiita.com/tacoma/items/839b007cfb5b137094d1

https://qiita.com/tacoma/items/839b007cfb5b137094d1

# Exercise 2 : MOLINFOショートカット

PLUMEDには特定の特徴をもった原子を選択するショートカットがある。MOLINFOショートカットである。

この機能を使って、GB1のresidue2のbackboneの二面角phiを計算しよう。
このCVはTORSIONアクションと4原子の組で定義される。
残基iに対して二面角phiはC(i-1),N(i),CA(i),C(i)で定義される

マニュアルを参照し、かつGB1_native.pdbをよく見たら、残基2の二面角phiを2通りの方法で定義しよう

* 4つの原子のあらわなリストを指定する(t1)
* MOLINFOショートカットを使う(t2)

```python
# Activate MOLINFO functionalities
MOLINFO STRUCTURE=__FILL__

# Define the dihedral phi of residue 2 as an explicit list of 4 atoms
t1: TORSION ATOMS=__FILL__
# Define the same dihedral using MOLINFO shortcuts
t2: TORSION ATOMS=__FILL__

# Print the two collective variables on COLVAR file every 10 steps
PRINT ARG=__FILL__ FILE=COLVAR STRIDE=__FILL__
```
私が書いたインプットがこちらです。

```python
# Activate MOLINFO functionalities
MOLINFO STRUCTURE=GB1_native.pdb

# Define the dihedral phi of residue 2 as an explicit list of 4 atoms
t1: TORSION ATOMS=3,9,10,11
# Define the same dihedral using MOLINFO shortcuts
t2: TORSION ATOMS=@phi-2

# Print the two collective variables on COLVAR file every 10 steps
PRINT ARG=t1,t2 FILE=COLVAR STRIDE=10
```

https://www.plumed.org/doc-v2.6/user-doc/html/_m_o_l_i_n_f_o.html


```
PLUMED: Action MOLINFO
PLUMED:   with label @0
PLUMED:   pdb file named GB1_native.pdb contains 1 chains 
PLUMED:   chain named   contains residues 1 to 56 and atoms 1 to 436 
```

```
PLUMED: Action TORSION
PLUMED:   with label t1
PLUMED:   between atoms 3 9 10 11
PLUMED:   using periodic boundary conditions
PLUMED: Action TORSION
PLUMED:   with label t2
PLUMED:   between atoms 3 9 10 11
PLUMED:   using periodic boundary conditions
```


```
 0.000000 2.411617 2.411617
 10.000000 -1.610900 -1.610900
 20.000000 -2.506654 -2.506654
 30.000000 -2.379442 -2.379442
 40.000000 -1.337018 -1.337018
 50.000000 -1.804764 -1.804764
```

radianで出力されているようである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788299/e45e4c93-ebf7-8a9d-545f-3008fa752236.png)
【AWSで始める異常検知】Part1. 異常検知の始め方

#異常検知とは何か
他の大多数のデータとは振る舞いが異なるデータを検出する技術で、
クレジットカードの不正使用検知や機械故障の検知等の分野で用いられています。

#異常検知の代表的な手法

以下のような手法がよく用いられています。

- ホテリング理論
- k近傍法
- 局所外れ値因子法（LOF法）

#異常検知の活用事例

__製品の品質チェック__
画像認識の技術を用いて、今まで目視で完成品をチェックしていたものを自動化します。

__設備や機器に対する異常検知__
センサーから取得したデータを用いて、異常データを検出するようにモデルを構築し、トラブルを早期に発見します。

__クレジットカードの不正使用検知__
不正利用のパターンをデータ化し、24時間365日カード利用を監視します。
不正利用の事例と類似した場合は、カード利用を停止したり カード名義人へ連絡が入ったりなどの対応が行われます。

#異常検知にAIを活用するメリット

- 人の目や長年の経験がないと分からなかった故障などの判断をAIに置き換えることができる
- 人間では感じられない違いを画像やデータによって補完することが可能
- トライ＆エラーの繰り返しで検知精度を向上

#まとめ
本記事では、異常検知とは何で、どんな分野で使われているのかについて紹介しました。
異常検知の技術を用いた業務の自動化は、人員の削減や生産性の向上にもつながるため様々な分野で取り入れられています。
次回は実際にAWSのサービスを使って、簡単に異常検知を試してみます。

次の記事：[【AWSで始める異常検知】Part2. SageMakerで設備故障の検知](https://qiita.com/omiyu/private/25e52c3396014d0b70f4)
【Java】Iteratorはどういう時に使う必要があるのか

## 3通りの方法で同じ処理を確認
配列内の値をぐるぐる確認して一致するものがあったら、、、というパターン。
例として適当に以下のサンプルコードを用意した。今回はData型の配列のidが一致した要素の時はフラグを立てるというもの。比較するときに取り上げるのは「中略」以降の内容のみ。

### ①普通のfor文を扱った場合

```
public class Data {
    public int id = 1000;
    public int date = 20210430;
    public String name = "name";
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    //他、dateとnameも同様の処理があり、setメソッドはどこかで使われているとする
}

public class Main {
    private static final int DEFAULT_ID = 1000;
    private boolean isDefault = false;
    private List<Data> dataList = new List<>();

    //~中略~

    for (int i = 0; i < dataList.size(); i++) {
        Data data = dataList.get(i);

        if (data.getId == DEFAULT_ID) {
            isDefault = true;
        }
    }
}
```

これが最も初歩的に学ぶfor文の扱い方かと思われる。

### ②拡張for文を扱った場合

```
for (Data data : dataList) {
    if (data.getId == DEFAULT_ID) {
        isDefault = true;
    }
}
```

dataList配列にあるData型の要素を順に１つずつ取り出してループする方法である。そして次がfor文を使わずにやる方法。


### ③iteratorを扱った場合

```
Iterator<Data> ite = dataList.iterator();
while (ite.hasNext()) {
    Data data = it.next();

    if (data.getId == DEFAULT_ID) {
        isDefault = true;
    }
}
```

iteratorを扱ってもできるが、ソースを比べても明らかに②拡張for文が一番シンプルでいい気がする。では③のiteratorを使わないといけない場面はどういう時なのだろうか気になった。
関わっていた案件で、iteratorが使われていて「拡張for文でもよくない？」と思ってローカルで修正してみたところ、`ConcurrentModificationException`の例外が発生してしまった。[調べてみると](https://docs.oracle.com/javase/jp/7/api/java/util/ConcurrentModificationException.html)
> この例外は、オブジェクトの並行変更を検出したメソッドによって、そのような変更が許可されていない場合にスローされます。

とあるがよくわからなく、iteratorについて手元にあった参考書を読んでみると、
> たとえばループをしながら、要素を削除するには、イテレーターを利用します。

例外が発生したケースでは、上で挙げたサンプルとは違って一致した時はその要素を配列から削除する実装だった。まさにこれに該当することがわかった。

## Iteratorを利用しなければならないケース
### 1. ループの中で要素を削除する

以下の実装だとNG

```
for (Data data : dataList) {
    if (data.getId == DEFAULT_ID) {
        dataList.remove(data);  //ConcurrentModificationException発生
    }
}
```
<br>
これをIteratorを扱って書き直すと例外が発生しない。

```
Iterator<Data> ite = dataList.iterator();
while (ite.hasNext()) {
    Data data = it.next();

    if (data.getId == DEFAULT_ID) {
        ite.remove();
    }
}
```

ちなみに拡張for文はNGだったが、①の普通のfor文なら試した限りだと例外が発生しなかったのでループ中に要素を削除したいなら普通のfor文は使える様子。
<br>

### 2. 配列を逆順に読み込む

```
ListIterator<Data> ite = dataList.listIterator(data.size());
while (ite.hasPrevious()) {
    if (data.getId == DEFAULT_ID) {
        ite.remove();
    }
}
```
for文でやる時は要素番号を工夫すればいけるだろうが、こっちの方が正確かつ簡単なのでこういうケースはIteratorを使っていくのが良い。




## 参考文献
https://techacademy.jp/magazine/18615

https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92Java-%E6%96%B0%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B-ebook/dp/B07PY43SL2/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2JTT95RDJQBU2&dchild=1&keywords=%E7%8B%AC%E7%BF%92java&qid=1619769149&sprefix=%E7%8B%AC%E7%BF%92%2Caps%2C260&sr=8-1
[Go]なぜsliceの空チェックで「nil」ではなく「長さ」でチェックするのか

# 1. はじめに
[Uber Go Style Guide: nil-is-a-valid-slice](https://github.com/uber-go/guide/blob/master/style.md#nil-is-a-valid-slice)
Uberのスタイルガイドにある通り、sliceの空チェックは**長さ**でチェックしなくてはいけません。

```
To check if a slice is empty, always use len(s) == 0. Do not check for nil.

Bad	
func isEmpty(s []string) bool {
  return s == nil
}

Good
func isEmpty(s []string) bool {
  return len(s) == 0
}
```

さて、なぜsliceの空チェックで「nil」ではなく「長さ」でチェックするのか、体で覚えているだけできちんと理解していなかったので、まとめてみます。

#  2. sliceを「長さ」でチェックする理由
理由は、**sliceが空になり、nilにならない**場合が発生する可能性があるため、「長さ」でチェックしないと漏れが発生するためです。

ポイントは、
・sliceを空で宣言しても宣言の仕方によってnil sliceかempty sliceになる
・nil sliceとempty sliceともにlenとcapが0
ということです

## 2-1. 空で宣言しても宣言の仕方によってnil sliceかempty sliceになる

空で宣言しても、宣言の仕方によってはnil sliceかempty sliceと違いが出てきてしまい、nilチェックでは以下のパターンでチェックが漏れてしまいます。

```
func main() {
	// nil slice
	// こう定義するとnilになる
	var nilSlice []int
	fmt.Println(nilSlice, len(nilSlice), cap(nilSlice))
	fmt.Printf("nilSlice: %s\n\n", isEmptyByNil(nilSlice))

	// empty slice
	// こう定義するとnilにはならず、lenとcapが0となる
	emptySlice := []int{}
	fmt.Println(emptySlice, len(emptySlice), cap(emptySlice))
	fmt.Printf("emptySlice: %s\n\n", isEmptyByNil(emptySlice))
}

func isEmptyByNil(intSlice []int) string {
	if intSlice == nil {
		return "nil!"
	} else {
		return "not nil!"
	}
}

// 実行結果
[] 0 0
nilSlice: nil!

[] 0 0
emptySlice: not nil!
```

[Go Playgroud](https://play.golang.org/p/DbayEIZI79Z "Go Playgroud")

## 2-2. nil sliceとempty sliceともにlenとcapが0
nil sliceとempty sliceともにlenとcapが0という性質を利用して、長さでチェックをすれば漏れが発生することはありません。

```
func main() {
	// こう定義するとnilになる
	var nilSlice []int
	fmt.Println(nilSlice, len(nilSlice), cap(nilSlice))
	fmt.Printf("nilSlice: %s\n\n", isEmptyByLen(nilSlice))

	// こう定義するとnilにはならず、lenとcapが0のスライスとなる
	emptySlice := []int{}
	fmt.Println(emptySlice, len(emptySlice), cap(emptySlice))
	fmt.Printf("emptySlice: %s\n\n", isEmptyByLen(emptySlice))
}

func isEmptyByLen(intSlice []int) string {
	if len(intSlice) == 0 {
		return "len is zero!"
	} else {
		return "len is not zero!"
	}
}

// 実行結果
[] 0 0
nilSlice: len is zero!

[] 0 0
emptySlice: len is zero!

```
[Go Playgroud](https://play.golang.org/p/HvnKeMlXG1k "Go Playgroud")

# 参考
[Uber Go Style Guide: nil-is-a-valid-slice](https://github.com/uber-go/guide/blob/master/style.md#nil-is-a-valid-slice)
[技術メモ: Golangのnil sliceとnil map](https://tutuz-tech.hatenablog.com/entry/2019/10/20/145302)
【salesforce】「常にレイアウトに表示」となっている標準項目を非表示にしたいとき


この記事では、Salesforceで環境をカスタマイズする際に役立った小ネタをご紹介したいと思います。


#ページレイアウトで「常にレイアウトに表示」となっている標準項目

salesforceにはオブジェクトごとに、必ず表示される標準項目があります。

※以下リンク参照
[オブジェクトによって [常にレイアウトに表示] と指定されている標準項目](https://help.salesforce.com/articleView?id=000334683&type=1&mode=1)

例えば、
取引先であれば、「取引先名」「親取引先」が、
リードであれば「名前」「メール」「リード状況」「会社」が、
ページレイアウトからは削除することができない項目です。

![常にレイアウトに表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/38b0a223-07f2-e543-d8cf-01880d661137.png)
リードのページレイアウトを見てみましょう。
ページレイアウトで青丸が付いているものが「常にレイアウトに表示」の項目ということですね。

ちなみにその横に付いている赤星は「入力必須の項目」という意味です。

#「常にレイアウトに表示」項目はページレイアウトから削除できない

しかし、ここで困ったことが起きます。

そうです。
**「常にレイアウトに表示」項目をページレイアウトから削除したいとき、
このままでは削除できない**ということです。

先のリードを例にとって考えてみましょう。

「名前」や「会社名」といった項目は入力必須のため、データとして使う必然性があり、
レイアウトから削除できなくてもいいでしょう。

一方、入力必須でない「メール」項目は、そもそも使わない場合があるかもしれません。
そうなればレイアウトから削除したいはずです。

しかし、前述のとおり
「メール」項目はリードにおいて「常にレイアウトに表示」と決められているため
ページレイアウトから削除することはできません。

困りました...

#削除ではなく非表示に

さて、salesforceがページレイアウトから削除できないと決めている以上、
削除は諦めるしかありません。

そこで、発想を変えてレコードページの画面上**「見えなく」**してみましょう。

つまり、
「メール」項目のページレイアウト上からの削除はせず、
**見る人がレコードページから見れないようにする**ということです。


まずは、変更前の画面を確認しておきましょう。
![変更前リード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/6a273736-28e3-171e-e2e8-a4669718d30e.png)

![変更前ページレイアウト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/eccb9d55-026e-c5e3-6513-e95f2c2efb3c.png)
プレイグラウンドで作成したばかりなので、
レコードページ上もページレイアウト上にも表示されていますね。


では、ここからレコードページの画面で「メール」項目を非表示にしていきます。

①「設定」からいずれかの「プロファイル」を開きます。（ここではシステム管理者でやってみます）
![①プロファイル開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/6174c2c8-c35e-0b98-dc87-dfa93acf028b.png)

②項目レベルセキュリティの「リード[参照]」をクリックします。
![②項目レベルセキュリティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/6fad6dcf-4415-f1a7-9365-764f5fcb375c.png)

③「メール」の参照アクセス権を外す
（参照アクセス権を外すと編集アクセス権も自動的に外れます）
![③参照アクセス権外す.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/9205a951-6f6f-4c09-b194-aa16c91d2205.png)


手順はこれで完了です。
では、変更後の画面を見てみましょう。
![変更後リード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/377bc582-cdde-ed2b-8354-cdd8c15a2613.png)

![変更後ページレイアウト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/5448e4ad-9fdd-b58b-0038-24018fa55b69.png)
ページレイアウト上には依然「メール」項目がありますが、
レコードページ上では見事「メール」項目が消え（見えなくなり）ました！

同じ手順を各プロファイルで行えば、「メール」項目を非表示にできます。
（全プロファイルは大変なので、使用する予定のあるプロファイルだけでいいと思います）

以上です。
私と同じく、「常にレイアウトに表示」項目の非表示に苦心された方の
一助になればうれしいです。
Java11でJavaFXを動かす

JavaFXで簡単なアプリケーションを作ろうとした際に
Java11ではモジュールに追加する必要があり、その方法を見つけるのに苦労したので設定方法を簡単に記載します。

#開発環境
Java11を使用。
IDEはIntelliJを使用しました。

##JavaFXをインストールする
以下のサイトからJavaFXをインストールします。
https://gluonhq.com/products/javafx/

##IntellJで新しいJavaFXプロジェクトを作成する
IntellJの File→New→Project を選択する。
![スクリーンショット 2021-04-30 16.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604689/a5d15cde-176c-759c-5065-1a16ac12b5b1.png)
JavaFXを選択し、Next
![スクリーンショット 2021-04-30 16.38.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604689/93d9f2b6-f473-53fe-db37-b9cbe9ab1300.png)
適当なプロジェクト名を入力して完了。

## 初期状態でプロジェクトをrunするとエラーになります
IntellJがサンプルコードを書いた状態でプロジェクトを作成してくれるのですが、
（コンパイルエラーはないものの）このままプロジェクトをRunすると
JavaFXランタイム・コンポーネントが不足しており、このアプリケーションの実行に必要です
というエラーになります。
![スクリーンショット 2021-04-30 16.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604689/129d2c0e-5ff4-5487-3437-78b4b3cf08a5.png)


Java11（Java9以降）ではJavaFXはモジュール化されているため、その設定を行わないと正しく動作しないためです。

## module-infoを作成、モジュールの情報を追記する
srcの中のパッケージを　右クリック→New→module-info.java　で
module-info.javaを作成します。
![スクリーンショット 2021-04-30 16.45.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604689/bfe53eca-5397-c4cf-8d19-94d88136de35.png)

作成したmodule-info.javaの中に以下のように記述します。
　※transitive は書かなくてもこの時点では動作します。

```java:module-info.java
requires transitive javafx.graphics;
requires transitive javafx.controls;
requires transitive javafx.fxml;

opens sample;
exports sample;
```

## アプリケーションを起動できました
module-info.javaを記述して再度Runすると以下のようなアプリケーションウィンドウが開きます。
![スクリーンショット 2021-04-30 17.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604689/0f229eb1-01da-abf0-374c-de67dfbe2db5.png)

以上でJava11でJavaFXのアプリケーションが起動できました。

##参考にした記事
https://seraphy.hatenablog.com/entry/2018/07/27/175105
[React Native]幅によって画像の高さを動的に変更する方法

# はじめに
React Nativeでブログやコラムなどを実装する場合、実装の段階でどの高さの画像が表示されるかがわからないことがあります。そのような時に、画像によってstyleの`height`プロパティを動的に変更する方法をご紹介します。

# バージョン

```json
"dependencies": {
  "react-native": "0.63.4",
}
```

# 実装内容

```ts
import React, { useEffect, useState } from 'react'
import { Image, View, Dimensions, StyleSheet } from 'react-native'

interface Props {
  url: string
}

export const CoverImage = ({ url }: Props) => {
  const [imageWidth, setImageWidth] = useState(Dimensions.get('window').width)
  const [imageHeight, setImageHeight] = useState(200)
  useEffect(() => {
    Image.getSize(url, (width, height) => {
      if (width && height) {
        setImageHeight((height * imageWidth) / width)
      }
    })
  }, [])
  return (
    <Image
      source={{ url: url }}
      resizeMode="cover"
      style={{width: imageWidth, height: imageHeight}}></Image>
  )
}
```

実装の通り、画像の幅、高さをstateによって管理するため、画像の数が不定の場合はコンポーネントにする必要があります。表示する画像数が決まっていて、コンポーネントを再利用する必要のない場合は、コンポーネントにしなくても問題ないかと思います。
[ECCUBE4]ログフォーマットの変更（monolog,formatter）

## 環境

| 項目 | 値 |
|:-:|:-:|
| ECCUBEバージョン  | 4.0.5  |

## 結論

`<ECCUBEルート>/app/config/eccube/services.yaml`内の定義`eccube.log.formatter.line`の`arguments`の値を変更します。

```yaml:app/config/eccube/services.yaml
    eccube.log.formatter.line:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "[%%datetime%%] %%channel%%.%%level_name%% [%%extra.session_id%%] [%%extra.uid%%] [%%extra.user_id%%] [%%extra.class%%:%%extra.function%%:%%extra.line%%] - %%message%% %%context%% [%%extra.http_method%%, %%extra.url%%, %%extra.ip%%, %%extra.referrer%%, %%extra.user_agent%%]\n"
```

## 備考

ログの設定(出力先、ファイル名、フォーマット、ローテーション定義等）は、実行モード（開発or本番）ごとに用意されていて、この中の`formatter`で上記の定義が指定されています。

```bash
<ECCUBEルート>/app/config/eccube/packages/dev/monolog.yml
<ECCUBEルート>/app/config/eccube/packages/prod/monolog.yml
```
useStateの値が更新されず詰まった話

先日、useStateを使ってとあるstateを更新しようとしたところ、全く意図した挙動にならなかった。
最初はuseStateが原因ではなく他のコードが悪さをしていると思い、書いたコードを片っ端から確認したが結局原因分からず。
ふと、useStateが原因ではないかと思い至って、いじったところ見事エラーが解消しました。

今後同じようなエラーでハマりたくないので、今回は戒めてとして記事を書こうと思います。
※因みに実際に発生したエラーのコードは複雑になっているので、別例を使って今回のエラーを振り返りたいと思います。


#どのようなエラーでハマったのか
まずはハマったエラーを簡素的に表そうと思ったのですが、難しかったので一般的に陥りそうな例をあげてみます。

```ts
const [currentNum, setCurrentNum] = useState(0)

const onHandleClick = () => {
  setCurrentNum(currentNum + 1);
  setCurrentNum(currentNum + 1);
}
```

イマージ的には上記のような処理をしようとしていたと思ってください。
この時に私の中ではonHandleClickを呼び出したらcurrentNumが２づつ増えていくものだと思っていました。
しかし実際にはonHandleClickを呼び出しても＋１にしかなりません。

これはなぜなのか？

#一連の処理の流れ

上記で挙げたコードではどうしてcurrentNumが＋２にならずに、＋１なのか。
それは、この時のcurrentNumには初期値の０が入ってしまっているからです。

具体的にコードで表すと以下のようになっています。

```

const [currentNum, setCurrentNum] = useState(0)

const onHandleClick = () => {

setCurrentNum(0+ 1)
setCurrentNum(0+ 1)
//両方の更新関数には初期値の０が入ってしまっているので、
//このonHandleClick関数内でいくら更新関数を継ぎ足しても1にしかならない

//因みにcurrentNumに１が入っていれば２にしかなりません。０というのはあくまでも一例です。

}
```
ではどのようにすれば意図したように＋２にづつ増やす事ができるのか？

#解決方法

答えは更新関数で値が更新されるのは関数が呼び出された後なので、
更新関数を実行する際に前回の値を渡してあげることです。

こちらも具体的にコードで表すと以下になります。

```

const [currentNum, setCurrentNum] = useState(0)

const onHandleClick = () => {

setCurrentNum((currentNum) => currentNum + 1)
setCurrentNum((currentNum) => currentNum + 1)
//関数で表すことで,コンポーネントのレンダリング走らなくとも引数に前の状態が入って、そこに＋１を行っている形になります。
//なので最初の更新関数の引数には初期値の０が入っている状態ですが、
//2回目の更新関数の引数には最初の更新関数で更新された１が入っています。

```

#最後に
ふとした瞬間にまた忘れて同じ過ちを繰りかえさないようしにしていきたいものです。
Windows10にEclipseをインストールする手順

# やりたいこと
 * Windows10にEclipseをインストールする。

# インストーラ入手

https://www.eclipse.org/downloads/

`Download x86_64`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/e0ba275d-023c-4692-ff11-93b22c777739.png)

`Download`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/02d03b6c-0f96-6721-fe45-44584a0e82e0.png)


ダウンロードで下記exeファイルを入手。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/6a3289a4-188c-dbf7-4f30-8e42768fc33f.png)

ダブルクリックでインストーラを起動する。
ウィザードが表示されるので`Eclipse IDE for Enterprise Java and Web Develop`を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/dfc94233-a95d-8f56-4f33-ce7bc5053ec4.png)

`INSTALL`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/4031a840-60f8-d744-2e5b-bee3ffdbc649.png)

`Accept Now`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/4a9ca13b-4f12-e0c9-3cd2-e21172028d7e.png)



`INSTALLING`プログレスが走るので数分待つ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/59ce874f-aedd-965b-d805-d31dcb6f7ffb.png)

インストールが完了したら下記画面が表示されるので`LAUNCH`で起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/e864cdc2-1b54-65a1-2f7d-c1e7adf7e654.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/131200d9-8b2f-db1c-d09f-00f1c37f9971.png)

`Launch`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/57baa885-ceb8-05c6-3cfd-c20e8770e90d.png)

下記画面が表示されたら成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/ac8a9fe4-e88c-4705-0255-a04366272fb3.png)
Aura コントローラで明日、明後日を計算する

#明日、明後日を計算する

```
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(new Date().getDate()+1);
        
var aftertomorrowdate = new Date();
aftertomorrowdate.setDate(new Date().getDate()+2);
```

#出力形式を整える

```
let options = {"month":"2-digit", "day":"2-digit", "year":"numeric"};
component.set('v.currentDate', today.toLocaleDateString("de-DE", options));
component.set('v.TomorrowDate', tomorrow.toLocaleDateString("de-DE", options));
component.set('v.AfterTomorrowDate', aftertomorrowdate.toLocaleDateString("de-DE", options));
```
1500円ZYNQ基板で自作ブートイメージをLAN転送してNANDに書き込み

#はじめに
1500円 ZYNQ 基板( EBAZ4205 )で、自作 PetaLinux ブートイメージを LAN で転送して、NAND フラッシュに書き込む方法を解説します。

はんだ付けを、できるだけしないで済む方法で実現します。
(残念ながら、ゼロにはできない)

#内容説明
EBAZ4205 には、マイニング装置の PetaLinux ブートイメージが書き込まれています。
俺専用に構築した自作 PetaLinux で起動させるには、下記２つのどちらかの方法があります。

・microSD ソケットを実装して、microSD からブートする
・NAND フラッシュに新ブートイメージを上書きしてブートする

microSD を使う場合、ソケットを実装しないといけません。
表面実装のはんだ付けが得意でない人には、敷居が高いです。

ハードウェアが本業でない方でも使えるよう、NAND に直接ブートイメージを書き込む方法をまとめました。

とはいえ、コンソール接続用のシリアルポートは必要です。
ヘッダピンのはんだ付け作業がありますが、スルーホールなので比較的簡単です。

書き込むブートイメージは、前回の記事 [1500円ZYNQ基板でNANDブートの実現](https://qiita.com/kan573/items/bc3234e4ee2b559cb3cf) で作成しました。

下記に置いてあります。
https://drive.google.com/file/d/1_OYSLhidtBTWX3jeCpH2vODiX1Rf0r_9/view?usp=sharing


#使用環境

1. Windows10 Pro (20H2)
2. tftpd64.exe (4.62)
3. EBAZ4205


#作業の流れ
1. tftp サーバー (tftpd64) をインストールします。
2. tftp 提供フォルダにブートイメージ BOOT_NAND.bin を用意します。
3. EBAZ4205 の u-boot で、tftp を使って BOOT_NAND.bin を DDR に読み込みます。
4. NAND をフラッシュ(初期化)して、DDR に読んでおいた BOOT_NAND.bin を書き込みます。
5. 再起動すると、書き込んだブートイメージで起動します。


# 実際の作業

##1. tftpd64 のインストール
https://tftpd64.software.informer.com/
から、ダウンロードします。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0b927858-00f3-ed21-5354-9ba417524f75.png)


適当な場所にインストールしたら起動して、提供するフォルダと、IP アドレスを選択します。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/44efbf4e-8fc3-275e-df9e-b7152a0999e3.png)

##2. ブートイメージの用意
設定した tftp 提供フォルダに、ブートイメージ BOOT_NAND.bin をコピーしておきます。

Show Dir ボタンを押すと、提供中のフォルダにあるファイルが確認できます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a7aa1907-fb03-10a0-28aa-b716c8761a61.png)


##3. u-boot でブートイメージを転送
EBAZ4205 を起動したら、3秒以内に "d" キーを押して、u-boot で止めます。

u-boot のプロンプトになりますので、下記で IP アドレスを設定します。
IP アドレスはご使用の環境に合わせて、変更してください。

>env delete ipaddr
>env set ipaddr 192.168.1.25
>env delete serverip
>env set serverip 192.168.1.4
>env delete gatewayip
>env set gatewayip 192.168.1.1

次に、tftpboot コマンドでブートイメージを取ってきます。
DDR の 0x100_0000 から 70MB ほどを使用します。
(前の方で u-boot が動いているので、後ろの空き領域を使う)

>tftpboot 0x1000000 BOOT_NAND.bin

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/82954461-ac97-ab1e-e522-24e617a42e30.png)

##4. NAND の初期化と書き込み

転送が終わったら、NAND フラッシュを消去します。

>nand erase.chip

次に、DDR から NAND へ書き込みを行います。

>nand write 0x1000000 0x0 0x46a0000

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/e572905a-cf08-4bfc-7161-8eec795682ad.png)


##5. 起動テスト

u-boot で reset コマンドを打って再起動します。
(または、電源の再投入)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/40f9c6c2-2ff8-d66c-35cd-270b497cab83.png)


うまく NAND から起動できたら、完成です。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a20b62bb-d550-a4b4-c984-9369f1d3cc14.png)


NAND 書込みに失敗して、u-boot すら起動できなくなってしまった場合、下記どちらかで NAND に書き込んで復活してください。

・microSD で起動する
・ダウンロードケーブルを使って u-boot を書き込む


#まとめ
EBAZ4205 で、LAN から新ファームウェアを書き込みすることができました。
AliViewをUbuntuでコンパイルする時のエラーメッセージを回避する

AliViewという名前のfasta等の配列を閲覧できる素敵なソフトウェアがあります。

https://github.com/AliView/AliView

https://ormbunkar.se/aliview/

このソフトウェアをソースコードからコンパイルしようとすると、以下のメッセージが出ることがあります。

```
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project AliView: Compilation failure
[ERROR] Failure executing javac, but could not parse the error:
[ERROR] エラー: ソース・オプション5は現在サポートされていません。6以降を使用してください。
[ERROR] エラー: ターゲット・オプション1.5は現在サポートされていません。1.6以降を使用してください。
```

このメッセージは、`pom.xml` の設定で、OpenJDKのバージョンを変更することで回避することができます。
具体的には、下記のように `<source>` と `<target>` を 1.6 以降に変更します。

```diff
--- a/pom.xml
+++ b/pom.xml
@@ -58,8 +58,8 @@
         <artifactId>maven-compiler-plugin</artifactId>
         <version>2.0.2</version>
         <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
+          <source>1.6</source>
+          <target>1.6</target>
        </configuration>
      </plugin>
      <plugin>
```

これにより、無事に最後までコンパイルが成功します。

jdkのバージョンを1.6にする[プルリクエスト](https://github.com/AliView/AliView/pull/101)を出してみました。もしもそのプルリクエストがマージされたら、このページのtipsは要らなくなるかも知れません。

この記事は以上です。
【Flutter】画像にリップルエフェクトをつける

画像をクリックしたときにリップルエフェクトを表示します。
イメージファイルは適当なものをセットしてください。

```dart
Stack(
  children: <Widget>[
    Image.file( ... ),
    Positioned.fill(
      child: Material(
        color: Colors.transparent,
        child: InkWell(
          onTap: () { ... },
        ),
      ),
    ),
  ],
);
```
条件分岐

# if
条件式ifの記述は

```js:
if(条件式){
  処理
}   //「;」は不要
```
上記のように記述することで、条件式が`True`の時に処理が実行されます。if文の末尾には「;(セミコロン)」は不要です。
また、上記で条件式が`False`の時は処理は実行されません。

```js:例
const num = 10;
if (num > 5){
  console.log('5より大きいです');
}
```
```text:出力結果
5より大きいです
```
### else/else if
`else`はif文と合わせることで「もし〇〇ならば□□を行う、そうでなければ△△を行う」という処理を行うことができます。

```js:例
const num = 10;
if (num >= 15);
  console.log('15以上です');   //条件式がTrueの時、実行される処理
} else {
  console.log('15より小さいです');   //条件式がFalseの時、実行される処理
}
```
```text:出力結果
15より小さいです
```
上記のように、条件式が`False`なので、はじめの処理は実行されずに、`else`後に記述された処理が実行されました。
さらに条件分岐を追加するためには「`else if`」を用います。

```js:例
const num = 10;
if (num > 10){
  console.log('10より大きいです');
} else if (num == 10){
  console.log('10です');
} else {
  console.log('10より小さいです');
}
```
```text:出力結果
10です
```
上記のように`else if`の条件式で`True`と判断されたので、elseifの処理が実行されました。
TypeScript 演算子の優先順位（メモ）

|優先順位|演算子|
|:--|:--|
|高|配列 ([])、かっこ (()) |
||インクリメント (++)、デクリメント (--)単項マイナス(-)、反転(~)、否定(!)
||乗算(*)、除算(/)、剰余(%) |
||加算(+)、減算(-)、文字列連結 (+) |
||シフト (<<、>>、<<<) |
||比較(<、<=、>、>) 
||等価(==)、不等価 (!=)、同値(===)、非同値(!==) |
||AND (&) |
||XOR (^) |
||OR (|) |
||論理積(&&) |
||論理和(||) |
||条件(?:) |
||代入(-)、複合代入(+=、-=など) |
|低|カンマ(,) |
Ubuntu 20.04 で OpenVPN client を systemd で自動起動するメモ


https://qiita.com/crowz/items/94494cec4944a2f83661

ありがとうございます. こちらに従えばだいたいいけます.

クライアントノードの .ovpn ファイルを .conf にリネームして, 以下に配置
 
`/etc/openvpn/client/<NODENAME>.conf`
(`/etc/openvpn` 直下におくのは deprecated)

```
$ systemctl start openvpn-client@<NODENAME
```

で, `/etc/openvpn/client` にある <NODENAME>.conf を読む.

server の場合も同等(`/etc/openvpn/server/<SERVER>.conf` に置いて, `openvpn-server@<SERVER>`)

詳細は

https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-ubuntu-20-04-ja

を参照ください.

## Ubuntu 20.04 の変更点

systemd 関連のファイルが

`/usr/lib/systemd` から `/lib/systemd` になっています!



## ネットワークが切れる場合

eth のコネクションが一時的に切れたり(dmesg に eth link down, link up のログが出る), ルータを再起動したりなどすると, resolve.conf の問題なのかルーティング情報のキャッシュの問題なのか, VPN 含む IP につながらなくなります.

openvpn client を再起動すれば治ります.

https://stackoverflow.com/questions/42795092/cron-job-to-restart-network-only-if-its-down

を参考にして, cron で ネットの接続を確認して, つながらなかったら openvpn-client 再起動, とするスクリプトを作るとよいでしょう.
React TrackedはContextだけじゃなくてReduxやZustandでも使えるんです

以前[react-trackedの紹介](https://qiita.com/daishi/items/72e5ef3a46c83897af06)と言う記事を書きましたが、その後少しバージョンアップしています。

v1.6.0からは、`createTrackedSelector`と言うAPIが追加されReduxなどでも使えるようになりました。そもそもreact-trackedの前身はreactive-react-reduxと言うredux向けのライブラリなので技術的な目新しさはないのですが、react-trackedの位置付けとしてreact contextのためだけのライブラリではないと言うのは実は大きな変化です。

Zustandでも使えますが使い方は同じなのでReduxで説明します。ドキュメントサイトはこちら :point_right: https://react-tracked.js.org/docs/tutorial-redux-01

使い方は簡単で、まずreact-reduxのuseSelectorをインポートします。

```js
import { useSelector } from 'react-redux';
```

次に、react-trackedから`createTrackedSelector`をインポートします。

```js
import { createTrackedSelector } from 'react-tracked';
```

最後に、`useTrackedSelector`を作ります。

```js
const useTrackedSelector = createTrackedSelector(useSelector);
```

これにより、

```js
const foo = useSelector(state => state.foo);
```

と書いていたところが、

```js
const { foo } = useTrackedSelector();
```

と書けるようになります。ただ、これだとあまり嬉しさがわかりませんね。本領発揮するのは、reselectやequalityFnが必要になるケースです。

```js
const selector = state => [state.foo, state.bar];
const [foo, bar] = useSelector(selector);
```

このように書くことはお勧めされていないというか、常にrenderされてしまいます。

```js
const selector = state => [state.foo, state.bar];
const [foo, bar] = selector(useTrackedSelector());
```

でも、これは大丈夫です。React Trackedのstate usage trackingによって、使われたプロパティが変更された場合だけrenderするためです。

興味がありましたら、GitHubリポジトリやドキュメントサイトを覗いてみてください。

https://github.com/dai-shi/react-tracked


「React Fan」というコミュニティを立ち上げていて、そのSlackでもreact-trackedに関する議論や質問ができますので、よろしければご参加ください。

詳しくは、下記のページをご参照ください。

[React開発者向けオンラインサロン「React Fan」の入り口ページ](https://react-fan.axlight.com/)

Slackへの招待リンクも上記ページにあります。
時間経過につれて文字がかっこよく遷移するUIを作った件


# 時間経過につれて文字がかっこよく遷移するUIを作った件

フリーランスでWeb開発を行なっているozoraです。
時間経過につれて文字が遷移していくUIを公開しました。

[自分のポートフォリオサイト](https://ozora-ogino.com)のトップページでサンプルを公開しています。
自分のサイトでは"Hello there!" -> "こんにちは" -> ...　と世界の国の挨拶を順に表示していくように設定しています。
Reactコンポーネントとして実装しているのでReactプロジェクトならどんなサイトでも利用できます。

```git clone https://github.com/ozora-ogino/react-text-morpher```で簡単に利用できます。

以下で公開していますのでよければ使ってみてください。
(GithubにStarもらえるとozoraは喜びます。)

https://github.com/ozora-ogino/react-text-morpher/
主な関数型インターフェースとラムダ式での記述方法について

# 主な関数型インターフェースとラムダ式での記述方法について

ラムダ式と関数型インターフェースについて学んだので記事にしてみようと思います。  
  
ラムダ式を利用する理由として、関数型インターフェースを簡潔に利用できるというメリットが大きいので、まずは主な関数型インターフェイスを紹介しておきます。  
  
| インターフェイス名 | 抽象メソッド名 | 処理 |  
| ---- | :----: | ---- |
| Function< T , U > | R apply(T t) | 実装するメソッドは引数としてTを受け取り、Uを返す|  
| Consumer< T > | void accept(T t) | 実装するメソッドは引数としてTを受け取り、何も返さない |  
| Predicate< T > | boolean test(T t)| 実装するメソッドは引数としてTを受け取り、boolean値を返す |  
| Supplier< T > | T get()| 実装するメソッドは引数を受け取らず、Tを返す |  

  
ラムダ式の使い方はこちらになります。  
```( 実装するメソッドの引数 ) -> { 処理 }
```
左辺にはメソッドの引数を記述し、"->"を記載したあとにメソッドの処理内容を記述します。

まずはラムダ式を利用せずに関数型インターフェースを利用したコードを書いてみます。  

``` JAVA
public class Main{
	public static void main (String[] args){
		int u = new Function<Integer,Integer>(){
			public Integer apply(Integer i) {
				return i + 10 ;
			}
		}.apply(5);
	}
}
```
上記のコードをラムダ式を利用して、コードを記載してみます  

``` JAVA
public class Main{
	public static void main (String[] args){
		Function<Integer,Integer> foo = (Integer i) -> {
			return i + 10 ;
		};
		Integer u = foo.apply(5);
}
```
3行目でFunction<Integer,Integer>インターフェイスの実装クラスfooを宣言し、抽象メソッドapplyの処理を定義しています。  
一つ目のコードと比べてコードが簡潔になっていますが、ラムダ式では更に記述を省略できます。

``` JAVA
(Integer i)
```

引数が一つの場合は()が省略でき、引数の型はインターフェースクラスの宣言時に決定しているため、データ型の宣言も省略できます。

``` JAVA
{
	return i + 10 ;
}
```
処理が一行の場合は、{}が省略でき、{}が省略されている場合はreturnも省略できます。  
  
これらの省略を行ったコードがこちらになります。

``` JAVA
public class Main{
	public static void main (String[] args){
		Function<Integer,Integer> foo = i -> i + 10 ;
		Integer u = foo.apply(5);
	}
}
```

## まとめ
- 関数型インターフェースをラムダ式で実装する事でコードを簡潔に記述できる。
- `( 実装するメソッドの引数 ) -> { 処理 }`でラムダ式を記述できる
【Flutter/Dart】The Flutter Daemon has terminated のエラーに遭遇した際の対処法

Flutterでアプリを開発中に下記のエラーがでて、エミュレータ(ios/Andoroidどちらも)が全く立ち上がらなくなるという事象に遭遇しました....
(IDEはVisual Studio Codeです)


###開発環境

```Flutter
❯ flutter --version
Flutter 1.22.6 • channel unknown • unknown source
Framework • revision 9b2d32b605 (8 weeks ago) • 2021-01-22 14:36:39 -0800
Engine • revision 2f0af37152
Tools • Dart 2.10.5
```

###とりあえず```flutter doctor -v ```してみる

```
flutter doctor -v      
[✓] Flutter (Channel master, 1.26.0-13.0.pre.44, on macOS 11.1 20C69 darwin-x64, locale ja-JP)
    • Flutter version 1.26.0-13.0.pre.44 at /Users/hogehoge/develop/flutter
    • Framework revision 319d3a511c (9 weeks ago), 2021-01-16 01:14:04 -0500
    • Engine revision a243f4df07
    • Dart version 2.12.0 (build 2.12.0-229.0.dev)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at /Users/hogehogeLibrary/Android/sdk
    • Platform android-30, build-tools 30.0.3
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
    • All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.4, Build version 12D4e
    • CocoaPods version 1.10.1
[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[✓] Android Studio (version 4.1)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
[✓] VS Code (version 1.54.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.20.0
[✓] Connected device (2 available)
    • sdk gphone x86 (mobile) • emulator-5554 • android-x86    • Android 11 (API 30) (emulator)
    • Chrome (web)            • chrome        • web-javascript • Google Chrome 89.0.4389.90
    ! Error: iPhone is not connected. Xcode will continue when iPhone is connected. (code -13)
• No issues found!
```

異常はなさそう....

その後、```flutter downgrade```、 ```flutter daemon -v```、```flutter upgrade ```、
stableチャネルから変更してみる、など試みるも解消しませんでした....

###結論
使用しているVisual Studio Codeをアンインストールすることで、エミュレータを立ち上げることができました！
通常のアンインストールではダメで、拡張機能などの設定も消去するように完全にアンインストールしないと変わりませんでした！

###参考
githubのissueは同じ問題に遭遇しているユーザーがいたりするので、便利ですね!

https://github.com/Dart-Code/Dart-Code/issues/2901

https://github.com/flutter/flutter/issues/20326

https://jimkang.medium.com/complete-uninstall-remove-vscode-mac-5e48bef3bdec
capistrano-db-tasksのdb:pullでpg_dump「サーババージョンの不整合のため処理を中断しています」を解決

### この記事の意図
WebサーバーとDBサーバーが別の環境で `capistrano-db-tasks` の `pg:pull` を実行したときに `pg_dump` の バージョンがそれぞれ違うということでエラーになり、解決したので共有します。

### 環境
EC2（amazon linux）からRDS（PostgreSQL）接続のRailsアプリケーションです。
サーババージョン（RDS）: 12.5、pg_dump バージョン（EC2）: 9.2.24

### 解決方法
EC2のpg_dumpのバージョンを12にすればOKなはずです。

amazon linuxにはこの時点でpostgresqlの12は用意されていないようなので下記を参考に12をインストールしました。
今回pg_dumpさえ動けばいいのでサーバーは立てる必要はないと思います。

https://techviewleo.com/install-postgresql-12-on-amazon-linux/

このままですとpg_dumpがバージョン9を見てしまうのでcapistranoでログインしているユーザーの.bashrcにパスを追加します。

```
export PATH=/usr/pgsql-12/bin/:$PATH 
```
.bashrcを読み直します。

```
$ source .bashrc
```
これでローカルからpg:pullを実行して動きました。

### 注意
.bash_profileでは動きませんでした。理由は.bashrcがSHELL_VARIABLE、.bash_profileはENVIRONMENT_VARIABLE、という違いがあるからのようです。capistranoでアクセスする時はsshなのでSHELL_VARIABLEしか見てくれないという理解をしています。
[Swift]継承が必要な処理ごとにextensionでコードを分ける

####extensionで拡張する
一つのclassでいくつも継承すると、コードを読む時にどこで拡張機能を使用しているのか分かりにくい。
そこで、継承が必要な処理ごとにextensionでclassを拡張し、処理を分けることで
どの処理が準拠しているのかを分かりやすくする:point_up:


```.swift
class HogeViewController: UIViewController {
    ~~~
}

extension HogeViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}
```

`textFieldShouldReturn`はUITextFieldDelegateを継承しないと使えないので
今回はextensionでHogeViewControllerを拡張し、そこで継承が必要な処理をまとめている:hugging::sparkles:

もちろん、class宣言時にまとめて

```.swift
class HogeViewController: UIViewController, UITextFieldDelegate {
    ~~~~~
}
```
って書いても問題はない:ok_woman:

でも、継承するもので処理を分けた方がコードを読む時に分かりやすいのでextensionで拡張する方がいい。
（例の状態だとピンとこないかもしれないが、継承先が３個以上とかになった場合に、どの処理で何から継承したメソッドを使っているのかが分かりづらくなる。）


### 注意点
拡張したHogeViewControllerの方でUITextFieldDelegateを継承していれば、
元のclassの方のHogeViewControllerでもUITextFieldDelegateに準拠したメソッドを使うことができる。

```.swift
class HogeViewController: UIViewController {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

extension HogeViewController: UITextFieldDelegate {
}
```
その為、本来継承が必要な処理をextensionではなく元のclassの方で使用していても、問題なく動作してしまう。そうすると逆に可読性が下がるかもしれないので注意が必要:thinking: