OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Railsのページの作成

#プログラミングの勉強日記
2020年7月14日　Progate Lv.196
Ruby on RailsⅢ

#find_byメソッド
　find_byメソッドはある条件に合致するデータを取得できる。`モデル名.find_by(カラム名: 値)`とすることで、その値を持ったデータをデータベースから取得できる。今回は特定のidの投稿を取得するために使える。

```terminal:ターミナル
$ rails console
  //idが3の投稿データを取得できる
> post=Post.find_by(id:3)
> post.content
=> "Rails勉強中"
```

#URLにidを含める
　ルーティングのURL部分に`:`を用いて`posts/:id`と指定することで`posts/1`でも`posts/2`でもshowアクションにいくようにできる。

```ruby:routes.rb
get "posts/index" => "posts#index"
get "posts/:id" => "posts#show"
```
　<font color=blue>`posts/:id`のルーティングは`posts/index`よりも下に書く。</font>ルーティングは合致するURLを上から順に探すので、`posts/index`より上に書くと、`localhost:3000/posts/index`というURLが`posts/:id`に合致してしまう。

```ruby:posts_controller.rb
def show
end
```

#変数params
　コントローラのアクション内ではルーティングで設定したURLの`:id`の値を取得できる。その値はparamsという変数にハッシュとして入っている。`params[:id]`とすることでその値を取得できる。

```ruby:posts_controller.rb
def show
  @id=params[:id]
end
```

```erb:posts/show.html.erb
<%=  id %>
```

ブラウザ(`localhost:3000/posts/1`)：1 (と表示される)
ブラウザ(`localhost:3000/posts/2`) ：2 (と表示される)

#リンクの作成
　link_toメソッドを使う。link_toメソッドはRubyのコードで、第一引数に表示する文字を第二引数にURLを書くことでリンクを作成する。

```erb:posts/index.html.erb
<%# 変数展開を用いて投稿のidを指定 %>
<%= link_to(post.content, "/posts/#{post.id}") %>
```

#投稿内容を受け取るアクションの用意
　フォームの投稿ボタンを押すとRails側に投稿データを送信できる。今回はcreateアクションを用意して受け取ったデータをデータベースに保存する。
　ルーティングを書くときにフォームの値を受け取る場合は`post`とする。

```ruby:routes.rb
get "posts/new" => "posts#new"
post "posts/create" => "posts#create"
```

　`form_tag`メソッドを用いるとフォームに入力されたデータを送信することができる。`form_tag`は`form_tag(送信先のURL) do`のように送信先のURLを指定する。これによって、`<input type="submit" ....>`のボタンを押したときに指定されたURLにデータが送信される。

```erb:posts/new.html.erb
<% form_tag("/posts/create") do %>
  <textarea></textarea>
  <input type="submit" value="投稿">
<% end %>
```

#リダイレクト
　他のURLに転送（リダイレクト）するには、`redirect_to`メソッドを用いる。`redirect_to(URL)`でそのページに転送することができる。

```ruby:posts_controller.rb
def create
  redirect_to("/posts/index")
end
```

#投稿内容の保存
　①`<textarea>`タグにname属性を指定すると、入力データを送信することができるようになり、name属性の値をキーとしたハッシュがRails側に送られる。

```erb:posts/new.html.erb
<textareaname="content"></textarea>
```
　②name属性を指定したフォームに入力されたデータはコントローラのアクション内で受け取れる。フォームのデータは変数paramsで受け取る。paramsはname属性に設定した文字列をキーとしたハッシュになっている。

```ruby:controller.rb
def create
  params[:content]
end
```
　③実際にデータベースに投稿を保存する。Postインスタンスを作成するときに、`params[:content]`を用いる。そのPostインスタンスを保存することで投稿機能ができる。

```ruby:posts_controller.rb
def create
  @post=Post.new(content: params[:content])
  @post.save
  redirect_to("/posts/index")
end
```

#投稿の並び替え
　orderメソッドを用いる投稿一覧を並び替えられる。`order(カラム名:並び替えの順序)`のように使う。並び替えの順番は昇順(`:asc`)と降順(`desc`)のどちらかを選択する。

```ruby:contorller.rb
def index
  @post=Post.all.order(created_at: :desc)
end
```
AWSとか知識ゼロのクライアントエンジニアがAWSとかの勉強を始めてみる 1

### きっかけ
今までずっとゲーム案件でUnityのクライアントエンジニアとしてお仕事してきた私。
最近初めて非ゲーム案件に携わることに。

非ゲームだけど、そちらでもUnityを使うアプリなので
自分のポジションとしては今までと同様にクライアントエンジニアなんですが
現場の方々がやたらとAWSとかそちら方面に詳しい...(汗)

EC2、ってなんですか?
ELB...とは?
GCP、Cloud Spanner、k8s...
はあ...なるほどまったく分からんです。

あまりにも知らなすぎることに恥ずかしくなってきた。。
今回の仕事をする上ではポジション的にとくに知らなくても大丈夫だよとは言われているものの、なんだか悔しい。

### なので
仕事では必要ないかもですが、少しでも話についていけるようになりたいので
ちょっとAWSとか(「とか」っていう程、他に何がどう違うのか分からない)のことを
これから勉強してみることにした。

もちろんインプットだけだときっと身につかないし三日坊主になると思うから
手を動かして何かを作ろう。

・・・

。。。

でも、何から手をつけたらいいんだろう...?

本当に、で分からない。。



・・・ので、
とりあえずYoutubeで検索していたら
くろかわこうへいさんのAWS講座の動画に辿り着いたので、
まずは概念まわりの学習から入ってみることに。

クライアントの人でも、かじってる人はかじってるんだよなー。
「自分には関係ない」と思って今までなんとなく避けていた部分があるので、
これは良いきっかけになるのかも。
ちゃんと続けばいいな。
Cognito ID Poolで指定するロールに、そのID Poolの作成時に生成したもの以外を指定する場合にはロールに信頼関係を追加する

### 初めに
Cognitoを用いてWebアプリケーションのログイン機構を作る場合、大体の場合はログインユーザーに対してAWSリソースの実行権限を与えるために、IDプールをセットで利用すると思います。
複数のIDプールを利用する必要があるものの、それぞれのIDプールから払い出す権限は同一でよい場合、紐づける「認証されていないロール」「認証されたロール」に、複数のIDプールで同一のIAMロールを指定することになると思います。
IDプールで使うIAMロールは、IDプール作成時に自動生成したロールをそのまま使い、別のIDプールを追加した時に既存のIDプール生成時に作られたロールを紐づけて使う、というやり方を取ることが考えられますが、この時に気を付けないと引っかかる権限問題がありましたのでご紹介します。

### 前提
- 2つのIDプールを利用するとする
  - testIdPool
  - testIdPool2
- 一方のIDプール作成時に作成したIAMロールを、もう一方のIDプールの「認証されたロール」「認証されていないロール」にそれぞれ設定

### 問題
前提の通りにIDプールとロールを作成/設定します。
`testIdPool`の作成時に新しいIAMロールを作成します。
![IdPool1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/0f0e9ceb-acb2-2333-9444-363085334a21.png)

`testIdPool2`を作成後、「IDプールの編集」から編集画面を開き、`testIdPool`の作成時に作成したIAMロールを設定します。
![IdPool2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/9c9e678c-bfd2-1004-40b6-0d23bf67468e.png)

この状態でIDプールからcredentialsを発行しようとすると、`testIdPool`では問題なく可能ですが、`testIdPool2`では以下のエラーが発生します。

```
InvalidIdentityPoolConfigurationException: Invalid identity pool configuration. Check assigned IAM roles for this pool.
```

### 解決
信頼関係タブを開き、「信頼関係の編集」からJSONの信頼関係ドキュメントを見てみると、以下のようになっていることが分かります。

```JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "ap-northeast-1:1d394b04-1f10-41dc-a277-71b5c953794f"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
```

ここで、Conditionに`ap-northeast-1:1d394b04-1f10-41dc-a277-71b5c953794f`というIDが指定されていることが分かりますが、これはこのロールを生成する元になった、`testIdPool`のIDが設定されています。
該当のIDプールの「ID プールの編集」を開き、「ID プールの ID」を確認してみてください。

つまり、Conditionにこのロールをアタッチした`testIdPool2`のIDが指定されていないために、
`InvalidIdentityPoolConfigurationException: Invalid identity pool configuration. Check assigned IAM roles for this pool.`
が発生しました。

解消には信頼関係ドキュメントのConditionに、紐づけるIDプールのIDを追加してやればいい、ということになります。
配列の形式にして、追加してやります。

```JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": [
            "ap-northeast-1:1d394b04-1f10-41dc-a277-71b5c953794f",
            "ap-northeast-1:8e7a8af9-4a66-4987-b0f0-4be1473895e8"
          ]
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}

```
これで`InvalidIdentityPoolConfigurationException`が発生することはなくなったと思います。

###参考
https://stackoverflow.com/questions/30425942/aws-cognito-invalid-identity-pool-configuration
Unity 学習　4日目

#プログラミングに挑戦1
昨夜、Visual studio が未インストールのため中断したところから再開

    Debug.Log("Hello,World");
Visual Studioにて、上記を打ち込み、コンソールにリターンがあった！成功
ついに私もプログラマー(*´ω｀*)ちょっとうれしい（笑）
　
Ｃ＃言語
｛｝で囲われたブロックで構成
大枠のブロックをクラスという。

1つのスクリプト＝1つのクラス
スクリプト名＝クラスの名前
これがルール

クラスの中に含まれているブロックをメソッドという
レッスン10にてこのメソッドのレクチャーがあるらしい

#プログラミングに挑戦2

Rigidbody:オブジェクトに力を与えるコンポーネント
オブジェクト、コンポーネント、数値を使うときには変数の箱に入れる必要がある

    Rigidbody rb;
これは、宣言：Rigidbody型の変数『rb』を定義しますという意味

     rb = GetComponent<Rigidbody>();
この式の右側は「rigidbodyを取得して戻り値として帰る」という指示で左のrbに変数に値を代入するという命令となる

    void Start()
最初に1回だけという意味

    void Update()
1秒間に数十回のスピードで実行を繰り返すという意味

        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 move = new Vector3(moveH, 0, moveV);
        rb.AddForce(move);
3次元はVector3の言語を使うことで定義できるのねーおもしろいわ
この式でどうやらボールを前後左右に動かせるらしい

できたと思ったらエラー
何が問題かよくわかりません。
次の講座でエラーの原因を教えてくださるそうです。
Rigidbody関係なのかな？？？？うーん。わからん。

#あとがき
プログラミングの鱗片を体験しましたが、第一印象は難しい。
何が難しいって、スペルミスが多く発生して、講座以外のミス連発からのスペルチェック（時間の無駄）
Visual studioに補完機能があるようなのですが、うまく動いていない印象
先人たちの努力に敬意を表します。

今日もありがとうございました。
同期の仕方。LとかRとかその辺

#はじめに
LとかRとかの種類があるSyncに遭遇したので調べる。

#rsync
まずはここから
https://www.atmarkit.co.jp/ait/articles/1702/02/news031.html

> 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、異なるホスト間でもファイルやディレクトリを同期できる「rsync」コマンド

Linuxコマンドの一種であることがわかる。

## rsyncコマンドとは？
> 　「rsync」は、リモート環境とファイルやディレクトリを「同期（sync）する」というコマンドです。ローカル環境のみでも使用できます。「変更があった分だけ更新する」という機能があるので、ディレクトリ単位のバックアップで特に便利に使えます。

## rsyncコマンドの書式

```
rsync [オプション] 同期元 [同期先]
```

##rsyncコマンドの主なオプション

| 短縮系      |      原型 |    効果   |
|:-----------------:|:------------------:|:------------------:|
| -v            |              --verbose |        詳細表示        |
| -q           |            --quiet |       動作中のメッセを非表示       |
| -n            |              --dry-run |       試験モード。実際には動作せず、動作内容だけ表示する（「-v」や「--stats」を一緒に指定する）       |
|               |                --stats |        ファイル数や転送サイズを表示する     |
|             |           --list-only |       コピーする代わりにファイルのリストを作成する   |
|-a         |           --archive |     アーカイブモード（「-rlptgoD -no-H -no-A -no-X」相当）     |
| |--no-オプション| 指定したオプションを無効にする（「-H」を無効にする場合は「--no-H」のように指定する）|
|-i|--ignore-times|サイズとタイムスタンプが同じファイルも処理する |
||--size-only|サイズが同じファイルは処理しない|
|-c|--checksum |更新日とサイズではなく、チェックサムで変更の有無をチェックする|
||--daemon|デーモンとして動作（「--daemon --help」でデーモン時に使用できるオプションが確認できる）|

色々あるねー

# こんなのも
【rsync】差分同期の仕組みとオプション, ログの見方(フォーマット)
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/rsync-algorithm/
【AWS】サーバ間でファイルのリアルタイム同期を行う【rsync + xinetd + lsyncd】
https://techblog.kyamanak.com/entry/2017/09/19/180516
rsyncとlsyncdを使ったディレクトリの双方向同期
https://qiita.com/kaihei777/items/5bb4f381c6b4c31be055#:~:text=lsyncd%E3%81%A8%E3%81%AF%EF%BC%9F,%E8%87%AA%E5%8B%95%E3%81%A7%E8%A1%8C%E3%81%86%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82

#まとめ
Rsyncはコマンドで、同期するサーバにLsyncdとポート監視のxinetdを入れてConfファイルを設定しておくとホスト間でファイル同期ができるって感じ
Pythonのsqlite3で自動で閉じるCursurを使う

## これはなに
Python標準ライブラリのsqlite3でwith構文を使って自動で閉じるCursurオブジェクトを生成する方法です。

普通に使うと、毎回例外処理をしながらcur.close()を書く必要があり大変面倒です。

またこれを使うことで、似たAPI形式を持つ`psycopg2`とのコードの共通化ができます。


## 実装
```python
import sqlite3
class AutoCloseCursur(sqlite3.Cursor):
    def __init__(self, connection):
        super().__init__(connection)

    def __enter__(self):
        return self

    def __exit__(self, *args):
        self.close()

```

## どう変わるのか
このような実装をせずに書くと、以下のようなコードになります

```python
with sqlite3.connect(DATABASE) as conn:
    cur = conn.cursur()
    cur.execute(SQL_QUERY)
    cur.close()
    conn.commit()
```

これには以下の問題点があります
1. 読みづらい
2. curを明示的に閉じる必要がある
3. 2.より、例外が発生したときにファイルを開いたままになってしまう


上で示したような自作クラスを使うことで、この3つ全てを解決することができます。

## 使用例
```python
with sqlite3.connect(DATABASE) as conn:
    with AutoCloseCursur(conn)
        cur.execute(SQL_QUERY)
    conn.commit()
```

上手く組み合わせることで、PostgreSQLとSQLiteのDBを同じコードで扱うことができるようになります
FirefoxでuserAgentを偽装する

# 前書き

[userAgentを使ってアクセス元のOSとブラウザを判定する(JavaScript)](https://qiita.com/ShotaroImai/items/7ea552323a1f89d67907) で実装したuserAgentをつかってOSやブラウザの情報を取得して表示するJavaScriptとHTMLの動作を確認するために、ブラウザのuserAgentを偽装する。
Chromeでもやれそうだったが、Firefoxでやることにした。
[Firefoxのユーザーエージェントを変更(偽装)する - 歌うキツネ (2016年9月末 更新停止)](http://utaukitune.ldblog.jp/archives/65675144.html)をヒントにやってみた。プラグインは使わず、about:configをいじった。

userAgentの一覧は
[List of User Agents - WhatIsMyBrowser Developers](https://developers.whatismybrowser.com/useragents/explore/)
を見てOSやブラウザを変えてuserAgentの文字列をコピペした。

このテクニックを悪用しないように。

# デフォルトの状態を確認
色々やる前に、[userAgentを使ってアクセス元のOSとブラウザを判定する(JavaScript)](https://qiita.com/ShotaroImai/items/7ea552323a1f89d67907)で実装した機能をFirefox 78.0 (Windows 10)で実行するとどうなるかを載せておく。
![2020-07-14 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141504/22cbb9a4-fd74-58f5-a0e2-4f18baca3b08.png)

# about:config

Firefoxを開き、アドレスバーに``about:config``を入力。自己責任だよ、という注意書きがでるので、望むところだ、と回答して編集ページを開く。最近のFirefoxだと設定項目を一覧にするのではなく、検索させるようになっているようで、テキスト欄が出てくるだけ。
![2020-07-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141504/098c40ea-8f83-7139-5c49-239b6d87989a.png)


``general.useragent.override``を入力する。該当する設定項目がない場合は、新規入力モードになるようで、その項目のデータ型を聞いてくる。もちろん文字列を選択し、``+``ボタンをクリック。
![2020-07-14 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141504/8b63c19d-457c-9eb0-77ba-dbff56a6421c.png)

画像は「文字列」を選択する前に撮ったので注意。

で、[List of User Agents - WhatIsMyBrowser Developers](https://developers.whatismybrowser.com/useragents/explore/)から適当なuserAgentの文字列をもってきてコピペし、チェックマークをクリックするとuserAgentにセットされる。
たとえばmacOS 10.15のSafari 13.1をセットした場合はこんな感じ。

コピペしたらチェックマーク
![2020-07-14 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141504/5f24def3-bb08-4353-4fd9-83d6289a00be.png)

セットされる。
![2020-07-14 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141504/bbcf8ada-940d-4cf8-db65-83a4eb92167b.png)

で、htmlファイルを実行(ページをリロード)。
![2020-07-14 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141504/8918d2f6-f542-d106-ce82-13f4decac16c.png)
表示がmacOS 10.15.4とSafari 13.1に変わる。

# 元に戻す

元に戻す場合は、``general.useragent.override``のゴミ箱アイコンをクリックして消す。htmlファイルをリロードすると、デフォルトに戻っていることが確認できる。

# 終わりに
[userAgentを使ってアクセス元のOSとブラウザを判定する(JavaScript)](https://qiita.com/ShotaroImai/items/7ea552323a1f89d67907) でも書いたようにuserAgentは廃止される可能性が高い。少なとくもGoogle Chromeでは廃止されるし、他のブラウザも追従する可能性が高い。
なので、このテクニックも近いうちに使えなくなるかもしれないが、web開発者向けにUser-Agent Client Hintsを一時的に偽装するような方法は生み出されると思う。悪用はしない(再度)。
BMAX B2 Plus の Windows 10 Pro 上に仮想マシンを構築してUbuntu 20.04 LTS を導入し、形態素解析用の環境を構築してみた

###背景
低価格・小型PCを活用して、形態素解析などの自然言語処理環境を構築した際の手順を、備忘録として整理した。

選んだマシンは、最近、何かと話題の[**BMAXシリーズ**](https://win-tab.net/imported/bmax_b_serirs_2002192/)の、**BMAX B2 Plus**である。アマゾンで**2万円台**で購入した。

このマシンのCPUに採用されているのは**Celeron J4115**ではあるが、かなりサクサク、ストレスなく動作しているので、お奨めな機種である。（とにかく、小型・低価格がこだわりポイント）

さらに、このマシンは、何と、Window 10 Pro のOSがインストールされているのも、超ポイントである。なぜなら、**Hyper-V（仮想環境機能）**が使えるからである。これは、[**ハイパーバイザ型**](https://turningp.jp/virtualization/hyper-v/hyper-v-host-os)の仮想環境なので、より負荷を軽減したゲストOSの稼働が期待できる。

###１．Ubuntu 20.04 LTSインストールイメージのダウンロード

まずは、[『Windows 10 Pro Hyper-V にUbuntu 18.04 LTS をインストール』](https://qiita.com/mfunaki/items/9e2901936b04f00f9cd7)
を参考に、Ubuntuの最新バージョンをダウンロード。

以降も、ほぼ、この記事を参考に作業を実施。感謝。（そのため、ポイントのみ挙げることとする）

###2．Hyper-V 仮想マシンの構築
####Hyper-V を有効化する
上記記事内で記載されているリンク先、[『Hyper-Vで仮想マシンをたてるまで』]
(https://qiita.com/Kobecow/items/3e20fd5a195dfff39606)を参考に、Hyper-Vを有効化した。

####仮想マシンの構築
こちらも、上記記事を参考に設定した。以下、ポイントのみ記載。

- 起動メモリは、4GB（ただし、他のブラウザなどをどを起動している環境で、仮想環境を動かすと、メモリ不足で起動しなくなることがあるので、要注意）
- 動的メモリを有効にして、最大RAMを32768MBに指定
- 仮想プロセッサ数は4つ

###3．Ubuntuを仮想マシンにインストール
こちらも、上記記事を参考に導入した。

###4．Ubuntu Desktopは使わずに、Window端末からSSHアクセできるようにする
もともと、やりたいことは、SSHで接続しての自然言語処理だったので、Teratermからアクセスできるようにする。（この方法は、比較的非力なマシンには優しい使い方になるため）

とはいっても、このための作業は、Desktopで実施する必要がある。理由は、SSH接続ができなくなっているからである。

- まず、Desktopを表示（接続）させるには、Hyper-V マネージャーから、構築した仮想マシンのところで右クリックをして、接続を選択する。
- その後、Desktop環境にログインして、端末を起動して、以下を実行して、SSH接続環境を構築する。

```
sudo apt-get install openssh-server
```

- 次に、Desktop環境の右上のネットワークのアイコンから、IPアドレスを確認する。（ipv4アドレス）
- Teratermから、上記で確認したIPアドレスにて、sshで接続する


###5．mecabを導入する

[『ubuntu 18.10 に mecab をインストール』](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)を参考に、mecabを導入した。

以下、pythonコードからmecabへのアクセスの際に、ハマッたところを挙げておく。

```
ソースコード内で、以下の指定をしている場合、
mt = MeCab.Tagger("mecabrc")

次のようなエラーが発生。
Traceback (most recent call last):
  File "mecab_sample.py", line 12, in <module>
    mt = MeCab.Tagger("mecabrc")
  File "/usr/local/lib/python3.8/dist-packages/MeCab/__init__.py", line 105, in __init__
    super(Tagger, self).__init__(args)
RuntimeError
```

- そのため、MeCab.TaggernのTaggerの箇所は、ユーザー辞書のパス、および、 -r /dev/nullの指定をすることで、問題が解消した。

```
import sys
import MeCab
#
#mt = MeCab.Tagger("mecabrc")
mt = MeCab.Tagger("-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd -r /dev/null")

```
この結果、pythonコードから、固有名詞のみを抽出したサンプルコードが正常稼働できた。

```
名詞,固有名詞,一般,*,*,*,はくたか,ハクタカ,ハクタカ
はくたか
名詞,固有名詞,地域,一般,*,*,富山,トヤマ,トヤマ
富山
名詞,固有名詞,地域,一般,*,*,金沢,カナザワ,カナザワ
金沢
名詞,固有名詞,地域,一般,*,*,兼六園,ケンロクエン,ケンロクエン
兼六園
```
<JavaScript>特定の文字列で区切られたファイル名をそのファイル名の一部で一括変換するクイズ

## 背景

- こんな記事を読みました
    - [\<Powershell\>特定の文字列で区切られたファイル名をそのファイル名の一部で一括変換するクイズ](https://qiita.com/aion0721/items/a75c6aed91691b5014c9)
- JavaScriptでやれと言われているような気がしたのでやってみます

## やりたいこと

- フォルダの中に`abc_test_ok_1_this.csv`・・・`abc_test_ok_100_this.csv`のファイルが入っている
- これらを`1.csv`・・・`100.csv`にリネームしたい
- ということだと思う（斜め読みしたから違うかも）
- これらをコマンドラインでワンライナーで実現するというもの

## 環境

```zsh
node -v
# v14.5.0
```

## 事前準備

- 元記事は`abc_test_ok_1_this.csv`・・・`abc_test_ok_100_this.csv`のファイルを用意するところからワンライナーでやってるのでそこから

```zsh
node -e "const fs=require('fs');[...Array(100).keys()].forEach(i=>fs.writeFile('abc_test_ok_'+(i+1)+'_this.csv','',()=>{}));"
```

- nodeコマンドは`node main.js`のようにしてファイルを実行できるが、`node -e "console.log('Hello')"`のように`-e`オプションをつけるとその後をEvalするのでファイルに書かなくても直接実行できる
- ちゃんと改行するとこんな感じ

```js
const fs = require('fs');

[...Array(100).keys()].forEach(i => {
  fs.writeFile(`abc_test_ok_${i + 1}_this.csv`, '', () => {});
});
```

- `[...Array(100).keys()]`で要素数100個の配列を作っています
    - `.kyes()`としてるので配列の各要素には0〜99の値が格納されます
    - `[0, 1, 2, ... 98, 99]`といった具合
- これをforEachしてるので100回ループが回ってます
- ファイルの作成には`fs.writeFile('ファイル名', 'ファイルの内容', callback)`を使っています
    - ファイル名はお題の名前にしてindexを埋め込んでいる
    - ファイルの中身は指定がなかったので空っぽに
    - コールバックはとりあえず今回はいらないので空の関数
- という感じで実行すると`abc_test_ok_1_this.csv`・・・`abc_test_ok_100_this.csv`が作成されました

## ファイルのリネーム

- ここが本題でしょうか
- フォルダの中にある`abc_test_ok_1_this.csv`・・・`abc_test_ok_100_this.csv`のファイルを`1.csv`・・・`100.csv`にリネームします

```zsh
node -e "const fs=require('fs');fs.readdir(__dirname,(error,files)=>{files.forEach(file=>{fs.rename(file,file.match(/abc_test_ok_(.*)_this.csv/)[1]+'.csv',() => {},);});});"
```

- さっきと同じくnodeコマンドの`-e`オプションを使ってワンライナーで実現しています
- 改行するとこんな感じ

```js
const fs = require('fs');

fs.readdir(__dirname, (error, files) => {
  files.forEach(file => {
    fs.rename(file, file.match(/abc_test_ok_(.*)_this.csv/)[1] + '.csv', () => {});
  });
});
```

- `fs.readdir('ディレクトリ', callback)`を使ってディレクトリの中のファイル一覧を取得しています
    - 第1引数はカレントディレクトリでいいので`__dirname`を定義
    - 第2引数はファイル名の一覧を処理する関数を定義
- filesにファイル名の一覧が入っているので`files.forEach(file => { ... }`でループを回しています
- `fs.rename('変更前のファイル名', '変更後のファイル名', callback)`を使ってリネームしています
    - 変更前のファイルはループで回ってくる`file`
    - 変更後のファイル名は正規表現で必要な部分を引き抜いています
    - callbackは今回は不要なので空の関数
- これでフォルダの中にある`abc_test_ok_1_this.csv`・・・`abc_test_ok_100_this.csv`のファイルを`1.csv`・・・`100.csv`にリネームできました
    - 余計なファイルがあったときの処理とかはいったん無視しました

## 終わりに

- ちょっとしたスクリプトを書くのは息抜きの暇つぶしにいいですね。
- Nodeでファイルの読み書きなんてほとんどやったことないのでググりながらやりました。もっとかっこいい書き方あるかも。
- 次は誰かPythonとかRubyとかでお願いします。

## 参考

- [File System | Node.js v14.5.0 Documentation](https://nodejs.org/api/fs.html)
【DDD】わかる！ドメイン駆動設計 ～もちこちゃんの大冒険～【第1章】

新卒の同期間でドメイン駆動設計(DDD)の勉強会を行った際に読んだ

[『わかる！ドメイン駆動設計 ～もちこちゃんの大冒険～』](https://booth.pm/ja/items/392260)

について、ざっくりですが、解説します。
※ かなりざっくりなので、厳密には違うこともあるかもしれないです。

# 第1章 DDDって何？
## 1.1 DDDとは？
**DDD(Domain Driven Design : ドメイン駆動設計)**
    
- ソフトウェアの開発手法
- ソフトウェアをどのように設計していくかの理論。
- DDDは難しい

※ DDDが初心者にとって難しいということについては、[なぜDDD初心者はググり出してすぐに心がくじけてしまうのか](https://qiita.com/little_hand_s/items/c612b061d2b2b1eb8c1a)

## 1.2 DDDでは何をする？
開発者と**ドメインエキスパート**が協力して、**ドメイン**を反映させたモデル（**ドメインモデル**）を作り上げる

- **ドメイン** : ソフトウェアを適用する対象範囲
- **ドメインエキスパート** ドメイン(対象領域の業務知識)について詳しい人(上司やビジネス側の人間)

## 1.3 ドメインを反映したモデル
- **ドメインモデル** : 業務ドメインに特化したソフトウェアのモデル
- ドメインを反映したモデル : ドメインを構成するもの、概念、振る舞い、関連性を表現したもの

**効率的にDDDを行うには？**
1. 開発がイテレーティブ（反復的、PDCAサイクルみたいなもん、参考 : [反復型開発](https://ja.wikipedia.org/wiki/%E5%8F%8D%E5%BE%A9%E5%9E%8B%E9%96%8B%E7%99%BA)）
2. 開発者とドメインエキスパートが密接(~~密です~~)

## 1.4 DDDにすべき理由

- ドメインエキスパートと開発者が同じ土俵に乗ることで、プログラマーの視点だけではなく、**業務側の視点も踏まえたソフトウェアを作れるようになる**
- ソフトウェアに関して理解している人が一部の人（たいていは開発者）たちだけという状況をなくすことができる
- ドメインエキスパートとソフトウェア開発者、そしてソフトウェアそのものとの間で、**一切の通訳が不要となる**
- **設計がコードであり、かつコードが設計である**(名言)

## 1.5 DDDの要素
- **戦略的設計 : 考え方・概念**
    - ユビキタス言語（第２章）
    - 境界づけられたコンテキスト（第４章）
    - コンテキストマップ（第５・６章）
- **戦術的設計 : 技術的手法**
    - エンティティ
    - 値オブジェクト
    - サービス
    - レイヤー化アーキテクチャ
    - etc
    
※戦術的設計については、[ドメイン駆動設計入門は新人時代にDDD挫折した私にも分かりやすかった](https://tana-labo.tokyo/post-35/)が参考になると思います。


# Next
TBD
矢印キーを使わないカーソル移動など（ Control ショートカット ）入門

Mac のキーボードショートカットについては、次のリンクに一覧がありますが、

https://support.apple.com/ja-jp/HT201236

いきなり、全てを完璧に使いこなすのは難しいので、今回は、自分が覚えるためにも「 Control キー ＋ アルファベットキー 1つ 」で利用できるものを、ピックアップして整理してみたいと思います。

というのも、まず、基本的なショートカットキーをマスターしたら、次は、なるべく「 矢印キー 」を使わずに作業できるかどうかが、上級者への道の第一歩だと考えているからで、

ともかく、最低限、次の「 4つ ＋ 2つ 」は、必須と言えるのではないでしょうか？

- control + `F`：右に移動する（ forward の `F` ? ）
- control + `B`：左に移動する（ backward の `B` ? ）
- control + `P`：上に移動する（ previous の `P` ? ）
- control + `N`：下に移動する（ next の `N` ? ）

次のショートカットは、ターミナルで長いコマンドを実行する際、その前後を修正する時などにも使うので、そっちで覚えている人もいるかもしれませんね。

- control + `A`：行の先頭に移動する（ アルファベットの最初の文字だから `A` ? ）
- control + `E`：行の末尾に移動する（ end の `E` ? ）

加えて、キーボードの右上にある「 delete キー 」を使わずに済めば、ほとんど「 ホームポジション 」を崩さずに作業することができるはずです。

- control + `H`：カーソルの左にある文字を削除する（ ASCII コードの backspace に該当するのが ^H だから `H` ? ）
- control + `D`：カーソルの右にある文字を削除する（ delete の `D` ? ）

最後に、もう一つだけ、オススメのショートカットキーを紹介します。

- control + `K`：カーソルから行の末尾までのテキストを削除する（ kill の `K` ? ）

一応「 Shift キー 」も使えば「 shift + control + `E` 」で、いったん範囲選択することによっても同じことはできるのですが、やはり、より簡単にやりたいことを実行できるのが、ショートカットの魅力で、知っている人だけの特権ですよね。

他にも「 Control キー 」を使ったキーボードショートカットは、色々とあるのですが、とりあえず覚えるとしたら、こんなところではないでしょうか。

また、今回は「 Control キー ＋ アルファベットキー 1つ 」で利用できるもの、という括りで紹介してみましたが、ショートカットキーのまとめ記事については、是非、他のテーマでも、備忘録も兼ねて書いていきたいと思います。
Raspberry Piでオシロスコープを操作する

##1. はじめに
Raspberry PiのGPIOにタクタイルスイッチを接続し、スイッチが押されたら[SCPIコマンド](https://www.google.co.jp/search?hl=ja&as_q=SCPIコマンド)の「:RUN」「:STOP」をオシロスコープへ送信します。SCPIコマンドの送信は[pyVISA](https://pypi.org/project/PyVISA/)を使用します。
![scpi commander](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/e87fdcfc-b607-a5db-eb4d-ea37a45e4a14.jpeg)

##2. 結線

|BCM|Physical|I/O|機能
|---+--------+---+----
| 2 |3       |IN |RUNコマンド(:RUN)発行
| 3 |5       |IN |STOPコマンド(:STOP)発行
|17 |11      |OUT|LED点灯

LEDは3kΩの電流制限抵抗を介して接続します。


##3. プログラム
- あらかじめpyUSB、pyVISA、pyVISA-pyをpipコマンドでラズパイにインストールしてください
- VISAアドレスはハードコーディングしています（VISAアドレスの調べ方は付録をご参照ください）
- sudo python scpi-commander.py で実行します（sudo重要！）

```python:scpi-commander.py
import RPi.GPIO as GPIO
import time
import visa


PORT_RUN  =  2
PORT_STOP =  3
PORT_LED  = 17
VISA_ADDR = "USB0::6833::1230::DS1Zxxxxxxxxxx::0::INSTR"


GPIO.setmode(GPIO.BCM)
GPIO.setup(PORT_LED, GPIO.OUT)
GPIO.setup(PORT_RUN, GPIO.IN)
GPIO.setup(PORT_STOP,GPIO.IN)


def open_dso():
    rm = visa.ResourceManager()
    resources = rm.list_resources()
    #print(resources)
    try:
        dso = rm.open_resource(VISA_ADDR)
    except:
        print("Not Found:", resources)
    else:
        pass
        #print("Detected")

    return dso


def main():
    try:
        dso = open_dso()
    except:
        print("DSO Open Failed, exit.")
        exit(1)
    else:
        print("DSO Open Success.")

    try:
        while True:
            port_run  = GPIO.input(PORT_RUN)
            port_stop = GPIO.input(PORT_STOP)

            if port_run == GPIO.LOW:
                GPIO.output(PORT_LED,GPIO.HIGH)
                #print(dso.query("*IDN?"))
                print(":RUN")
                dso.write(":RUN")
                while(GPIO.input(PORT_RUN)==GPIO.LOW):
                    #print("pressing...")
                    time.sleep(0.1)
            
            if port_stop == GPIO.LOW:
                GPIO.output(PORT_LED,GPIO.HIGH)
                print(":STOP")
                dso.write(":STOP")
                while(GPIO.input(PORT_STOP)==GPIO.LOW):
                    #print("pressing...")
                    time.sleep(0.1)

            GPIO.output(PORT_LED,GPIO.LOW)
            time.sleep(0.1)

    except KeyboardInterrupt:
        GPIO.cleanup()


main()
```

##4. おわりに
- フットスイッチを使うと両手がふさがっていても足で操作できそうです。

##5. 参考資料
この記事を作成するにあたって参考にさせていただいた記事です。

- [Raspberry Pi のGPIOをPythonから利用する](https://qiita.com/maoutokagura/items/9aef5e23167ce2bc1d10)

##X. 付録 VISAアドレスの調べ方
あらかじめオシロとラズパイ（またはPC）をUSBで接続します。

```python
> sudo python
>>> import visa
>>> rm = visa.ResourceManager()
>>> print(rm.list_resources())
('USB0::0x1AB1::0x04CE::DS1Zxxxxxxxxxx::0::INSTR')
```
文系卒だけどいきなりRuby on Railsの勉強をはじめてみた #8 基本的なログイン機構

ここ数日は資格試験の勉強に追われており、プログラミング勉強に時間を割けなかった。
資格試験が無事に終了したので、プログラミング勉強を再開しようとするも、久々に見るとなにも思い出せない。
とりあえず、やっていく。

この章ではログイン済みのユーザーのみアクセスできるようにするらしい。

# 8.1 セッション
最初は「ステートレス」やら「プロトコル」やら耳慣れないワードが飛び交う。
HTTPだとログイン情報をすぐに忘れてしまうので、「セッション」というものを使うことでより便利なしくみをつくろうね、ってことらしい。
そして、セッションを実装するには「cookies」を使うらしい。

ところどころ、RESTというワードが出てくるけど、これはなんなのだろう...。
あとは、いまだに`get`と`post`の違いもよくわかっていない。

とりあえず、先に進むことが大切なので先に進める。
が、この章あたりからむずい...。

とにかく、この章ではログインに必要な情報（メアドとパスワード）を収集し、ユーザー情報のデータベースと照合するということをした。
認証情報が誤っていればフラッシュメッセージというエラーを出す。

#8.2 ログイン
この章では、cookiesを使った一次セッションでユーザーをログインできるようにする。

>また、Rubyの慣習に従って、User.find_byの実行結果をインスタンス変数に保存する工夫もしています。こうすることで、１リクエスト内におけるデータベースへの問い合わせは最初の１回だけになり、以後の呼び出しではインスタンス変数の結果を再利用するようになります。地味なようですが、こういった工夫がWebサービスを高速化させる重要なテクニックの1つです

難しいけど、この文章の意味はなんとなく理解した。
繰り返して利用する情報は変数に入れておいたほうが効率的で処理にかかる時間を短縮できるということだろう。

また、ログインしているときとログインしていない場合でヘッダーの表示を変えることができる。
変える際はIF文を利用しており、プログラミング初心者でも理解しやすい。

#8.3 ログアウト
RESTについてちょっと調べてみた。
アプリケーションのリソースがURLで示せるなどの特徴を有しているとのこと。
確かに、そういったサービスはたくさんある。Qiitaもそうなのでは？

それがどう関係しているのかはまだ理解しきれていないが、`destroy`アクションをすることでセッションを破棄できるようだ。
【メモ】react-native にて FontAwesome を急に読み込めなくなった問題

# react-native にて FontAwesome を急に読み込めなくなった問題

業務で `react-native` を扱うことになり、 udemy で講座を購入し、勉強していたのですが急にFontAwesomeが読み込めなくなりました。
とりあえず解決できたので、メモがてら記録に残しておきます。

## 環境
- MacOS: Catalina 10.15.3
- react: 16.9.0
- expo-font: 8.1.1
- expo: 37.0.0

## エラーメッセージ

```
console.error: "fontFamily "FontAwesome" is not a system font and has not been loaded through Font.loadAsync.

- If you intended to use a system font, make sure you typed the name correctly and that it is supported by your device operating system.

- If this is a custom font, be sure to load it with Font.loadAsync."

``` 

カスタムフォントを使うなら、`Font.loadAsync`を用いてそのフォントを読み込んでね！ってことでしょうか。

## ソースコード

```button.js
import React from 'react';
import { StyleSheet, View, TouchableHighlight } from 'react-native';
import * as Font from 'expo-font';
import { createIconSet } from '@expo/vector-icons';
import fontAwsome from '../../assets/fonts/fa-solid-900.ttf';

const CustomIcon = createIconSet({
  pencil: '\uf303',
  plus: '\uf067',
  check: '\uf00c',
}, 'FontAwesome');

class CircleButton extends React.Component {
  state = {
    fontLoaded: false,
  };

  async componentDidMount() {
    await Font.loadAsync({
      FontAwesome: fontAwsome,
    });
    this.setState({ fontLoaded: true });
  }

//以下中略
    );
  }
}

```

こんな感じで読み込んでいたのですが、うまいこと読み込んでくれませんでした。

## 解決

expo をアップデートすることで解決しました。

```
npm i -g expo-cli
expo upgrade
```

## 参考
[forums.expo.io SDK 37: Unrecognized font family](https://forums.expo.io/t/sdk-37-unrecognized-font-family/35201/11?u=notbrent)
最前面のテキストを塗り／線の色で1文字ずつ交互に塗るAppleScript

せっかく塗りや線の設定があるのだからそれを利用できないかと思い書いてみました。  


## 使い方

![スクリーンショット 2020-07-13 23.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7001/015f8633-ff77-285a-7726-cc41ee6b4b6d.png)  あらかじめ塗り分けたい色で**塗り**と**線**を設定します。  

![スクリーンショット 2020-07-13 23.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7001/3cd2baa5-4659-46e2-caff-c12653ae99f6.png)  
このようなテキストがある場合、後から入力したテキストが対象になります。

![スクリーンショット 2020-07-13 23.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7001/8f062685-72b5-4032-70e4-af0bb1fd1183.png)  
スクリプト実行後はこのように塗り分けられます。  

## コード  

```AppleScript
(*
	最前面のテキストに対し、塗り／線の色で1文字ずつ交互に塗るスクリプト
		1文字目から奇数番目を塗りの色
		2文字目から偶数番目を線の色

	2020-07-13
*)



tell application "Adobe Illustrator"
	tell document 1
		
		set fillColor to default fill color
		set strokeColor to default stroke color
		
		set celectText to every page item
		
		tell celectText's item 1
			repeat with i from 1 to count of (contents as string)
				
				tell character i
					if i mod 2 is 1 then
						set fill color to fillColor
					else
						set fill color to strokeColor
					end if
				end tell
				
			end repeat
		end tell
	end tell
end tell


```
【AWS】AWS Storage Gatewayとは？(備忘録)

# はじめに
現在、AWSSAAの勉強をしています。
AWSSAAの学習をする中で**「AWS Storage Gateway」**について間違いやすかったので、知識としてこちらにアウトプットします。
※完全に備忘録(記録)です。

# AWS Storage Gatewayとは？

**オンプレミスからAWSのストレージサービスへのアクセスを可能とする仮想アプライアンス**
(オンプレミスに設置して使用)

# Storage Gatewayのタイプ

Storage Gatewayのサービスを紹介していきます。

## ファイルゲートウェイ

- S3をオンプレミスのNFS共有ファイルシステムのバックエンドストレージとして利用
- EC2イメージを使用して作成することも可能
- クラウドのワークロードのS3への取り込み、バックアップとアーカイブの実行、AWSクラウドへのストレージデータの階層化と移行などのタスクを行うことができる

## テープゲートウェイ

- 物理テープライブラリ装置の代替として利用
- 仮想テープライブラリ対応バックアップソフトウェアを利用
- Storage Gateway軽油でS3を利用

## 保管型ゲートウェイ

- データのプライマリコピーはオンプレミスに存在
- ボリュームストレージをオンプレミスのデータセンターに維持
- オンプレミスのディスクデータをStorage Gateway経由でスナップショットとしてS3に保存
- iSCSIでブロックストレージとしてインターフェースを提供
- EBSディスクへのリストアも可能
- データを非同期にAWSにバックアップ(EBSスナップショットとしてS3に非同期でバックアップ)
- 最大32個のボリュームがサポート(合計ボリュームストレージは最大512TiB)

## キャッシュ型ゲートウェイ

- スナップショットはS3に存在
- データのプライマリコピーはS3に存在
- よく使われるデータのみキャッシュがオンプレミスに存在
- 頻繁にアクセスするデータへの低レイテンシーなアクセスが可能
- 作成できるボリュームの最大サイズは32TiB
- 作成したボリュームをiSCSIデバイスとしてオンプレミスのアプリケーションサーバーにアタッチすることができる


# 特に大事だと思うところ

|  種類  |  プライマリコピー  |  iSCSI  |  備考  |
| ---- | ---- | ---- | ---- |
|  保管型ゲートウェイ  |  **オンプレミス**　  | ブロックストレージとして提供　 | EBSのリストアも可能　 |
|  キャッシュ型ゲートウェイ  | **S3**  | オンプレミスのアプリケーションサーバーへアタッチできる  | よく使われるデータのみキャッシュがオンプレミスに存在  |


# 参考
[AWS Storage Gateway の仕組み (アーキテクチャ)](https://docs.aws.amazon.com/ja_jp/storagegateway/latest/userguide/StorageGatewayConcepts.html)
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集 Kindle版](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
networkxでバージョン問題が出たのでメモ

#networkxでバージョン問題が出たのでメモ
・networkは環境依存しているモジュールがあり、バージョンにより関数が見つからずエラーを吐いてしまうので、解決方法を書いておくことにしました。
#環境
<h4>  
python 3.7.7<br><br>
anaconda 4.8.3<br><br>
os1 windows10 <br><br>
os2 ubuntu 18.04<br><br>
networkx 2.4<br><br>
</h4>
# 問題となった関数
<h3>
nx.connected_component_subgraphs(G)
<br><br>
nx.draw(SG)
</h3>
自分は、今回この二つの関数でエラーが出てしまった。
#解決方法
コマンドプロンプトもしくは、ターミナルから

```
pip install networkx==2.3
```

を実行しバージョンを下げることでエラーを回避することができた。

ubuntuとwindow両方で動作を確認できたため、networkx側の問題だと考えられる。

#考察
networkxのstable版が公開されたのが約半年前のため、大きな問題があればstable版を2.3に戻していると考えられるので、
代替えになる関数が用意されていると考えたが特に見つけることができなかった。
[厳選]開発効率を上げるMacのショートカットまとめ

# 開発効率を上げるMacのショートカット
今年の4月よりWEBエンジニアとして従事していますが、業務の日々にも慣れてきました。
その中で、1日の業務時間の中でコードをかける時間が限られているということを次第に意識するようになりました。
日々、Macを使用していますが便利なショートカットをきちんと調べるということは今までしておりませんでした。
そのため、マウスの使用頻度が高く、毎回マウスに手を伸ばすのが最近無駄に感じるようになりました。
この時間を減らすことで、各動作の時間を短縮することができ開発に当てる時間を増やすことに繋がり、日々の開発効率を上げることができるます。
そこで、今回はMacのショートカットを調べ、見返せるようにまとめてみようと思います。

## ショートカットの種類
Macのショートカットはテキスト入力時やFinder使用時などの場面に合わせて様々な種類があります。
今回はその中から、使用頻度の高いものに厳選してまとめました。

### 切り取り、コピー、貼り付け、その他の一般的なショートカット
|操作                 |ショートカット　 　　　　　　　        |
|:-------------------|:------------------------------|
|全ての項目をドックにしまう |Option + ⌘ + M                 |
|スポットライト検索       |⌘ + スペースバー         　　     |
|フルスクリーン          |Control + ⌘ + F               |
|文字ビューアを表示      |Control + ⌘ + スペースバー       |

### スリープ、ログアウト、システム終了に関するショートカット
|操作　　　　　　　　　      　|ショートカット　　　　　　　　　　　　　        |
|:-------------------------|:-------------------------------------|
|スリープ                    |⌘ + Option+ 電源ボタン            　　　　|
|ディスプレイをスリープ          |Control + Shift  + 電源ボタン           |
|全てのAppを終了し、Macを終了する|Control + ⌘ + Option + 電源ボタン　　　　|

### 書類に関するショートカット
|操作　　　　　　　　　      　                           |ショートカット　          |
|:----------------------------------------------------|:-------------------|
|文字を太字、または解除する                                 |⌘ + B               |
|挿入ポイントの左側にある単語を削除                           |Option  + Delete    |
|挿入ポイントの左側にある文字を削除する                        |Control  + H        |
|挿入ポイントの右側にある文字を削除する                        |Control + D         |
|挿入ポイントから、行または段落の末尾までの範囲にあるテキストを削除する|Control + K         |
|１ページ分上にスクロール                                   |Fn + ↑              |
|1ページ分下にスクロール                                   |Fn + ↓              |
|書類の先頭に移動                                        |Fn + ←              |
|書類の末尾に移動                                        |Fn + →              |
|挿入ポイントを書類の先頭に移動する                           |⌘ + ↑               |
|挿入ポイントを書類の末尾に移動する                           |⌘ + ↓               |
|挿入ポイントを行の先頭に移動                                |⌘ + ←               |
|挿入ポイントを行の末尾に移動                                |⌘ + →               |
|Shiftを追加すると選択も行う                                |Shift + ⌘ + ↑↓←→　  |
|挿入ポイントを前の単語の先頭に移動する                        |Option + ←          |
|挿入ポイントを前の単語の末尾に移動する                        |Option + →          |
|行単位で選択範囲を上下に移動する                            |Option + Shift + ↑↓ |
|選択範囲を単語毎に移動する                                 |Option + Shift + ←→ |
|挿入ポイントに一行追加する                                  |Control + O         |

## 最後に
これからもエンジニアとして頑張ろうと思います。言語の勉強も重要ですがこういったショートカットは一度調べると、ボディブローのように開発効率向上に効いてくるので、結果的に自分の時間を得ることにつながると思います。
獲得した時間を言語の勉強などに当てることもできますし、何よりMac操作がスマートだとかっこいい！
これからも励んでいこうと思います。
Javascript覚え書き

# 日付の取得

今日の日付を取得

```Javascript:
var today = new Date();
```

指定した日付を取得

```Javascript:
var date = new Date( '2019/11/5 20:30' );
```

そこからさらに、すきな要素を取得

```Javascript:
date.getFullYear(); // 日付の「年」を取得する（4桁）

date.getMonth();  // 日付の「月」を取得する（0 - 11）

date.getDate();    // 日付の「日」を取得する（1 - 31）

date.getDay();     // 日付の「曜日」を取得する（0 - 6）

date.getHours();   // 日付の「時」を取得する（0 - 23）

date.getMinutes(); //日付の「分」を取得する（0 - 59）

date.getSeconds(); // 日付の「秒」を取得する（0 - 59）
```
2種類のサーバーの監視

サーバーを運用する上で必ず必要になるのが**サーバーの監視**である。

このサーバーの監視には様々な形態があるが、大きく次の２つに分類される。

- **性能監視**

- **死活監視**


#性能監視とは？

- 性能が不足していないかどうかを監視すること。

- 具体的には、「アクセスが速いか遅いか」、「ディスク容量は足りているか」、「メモリに余裕があるか」など、ユーザーが快適に利用できるかどうかという観点で関するすることである。

- 一般にサーバー監視というと、この性能監視を指すことが多い。

#死活監視とは？

- サーバーが動作しているかどうか(つまりサーバーが生きているか死んでいるか)を監視すること。

- 具体的には、「Webサーバーの場合にHTTP通信ができるか(応答が返ってくるか)」など。

- 目的が単純なので作業しやすく、最低限死活監視だけはやっておこうというケースも少なくない。

#死活監視の基本

- 死活監視の基本となるのは、**pingによる監視**と**プロセス監視**である。

- pingは通信の可否を確認するコマンドで、コマンドプロンプトを起動して「ping IPアドレス」と入力すれば、指定したコンピュータが通信可能な状態であるかどうかを調べることができる。

- プロセスとはコンピュータで起動中の様々なプログラムのことを指す。Windowsであれば「タスクマネージャー」で確認できる。
Kotlin/JSプロジェクトの開発用サーバのポート番号を変更する


サーバのポート番号変えられるなら、そちらを変えた方が簡単。
どうしてもクライアント側のポート番号を変えたいとき用。

## 手順
(1) プロジェクトのルートに、「webpack.config.d」ディレクトリを作成
(2) webpack.config.d配下に、*.jsファイルを作る(たとえばwebpack.config.js)
(3) webpack.config.jsに以下を記述する

```javascript
config.devServer = Object.assign(config.devServer, {
    port: 8081
});
```

Object.assignを利用しているのは、port番号以外はデフォルト値にするため。

(4) ./gradlew runを実行する
ポート番号が8081変わっていることが確認できる。

## 補足
Kotlin/JSではwebpackというJavascriptアプリのビルドツールを使用している。
最終的な、webpackの設定は「build/js/packages/<projectName>/webpack.config.js」に出力される。
このファイルを見ると、Kotlin/JSでのwebpackのデフォルト設定が確認できる。また、「webpack.config.d/*.js」の記述が挿入されていることも確認できる。


## 参考資料

- [Kotlin/JS 公式リファレンス](https://kotlinlang.org/docs/reference/js-project-setup.html#configuring-webpack-bundling)
- [webpackのDevServerの記述ルール](https://kotlinlang.org/docs/reference/js-project-setup.html#configuring-webpack-bundling)
macOSでのスクリーンセーバの作り方

macOSでのスクリーンセーバの作り方を調べた。以下を参考に作ってみた。
https://tolar.town/posts/2020/04/13/screensavers/

# GitHub
まず最初に、GitHub。こちらを使うと、そのままスクリーンセーバが実行できるはず。
https://github.com/eto/DropRain

環境は、以下の通り。
- Xcode 11.6
- Swift 5.2.4

# Xcodeを使っての作り方
- Xcodeを起動→Create a new Xcode Project→macOS→Other→Screen Saverを選択→Next→Product Name:「`DropRain`」→Next→フォルダを指定する→Create
- Cmd-1→「DropRain/DropRain」以下の→「DropRain.h」「DropRain.m」の2つを右クリック→Delete→Move to Trash（**ここ重要。消さないと、こちらが使われてしまう。**）
- Cmd-1→「DropRain/DropRain」を選択→Cmd-N→Swift File→Next→Save As:「`DropRainView.swift`」→Create→Don't Create

```DropRainView.swift
import Foundation
import AppKit
import ScreenSaver
class DropRainScreenSaverView: ScreenSaverView {
    let view = DropRainView()
    override init?(frame: CGRect, isPreview: Bool) {
        super.init(frame: frame, isPreview: isPreview)
        self.animationTimeInterval = 1 / 30.0
        addSubview(view)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func startAnimation() {
        super.startAnimation()
    }
    override func stopAnimation() {
        super.stopAnimation()
    }
    override func draw(_ rect: NSRect) {
        super.draw(rect)
        var squareFrame = NSRect.zero
        squareFrame.size = NSSize(width: 150, height: 150)
        squareFrame.origin.x = (rect.width - squareFrame.width) / 2.0
        squareFrame.origin.y = (rect.height - squareFrame.height) / 2.0
        view.frame = squareFrame
    }
    override func animateOneFrame() {
        view.rotate(byDegrees: 1)
    }
}
class DropRainView: NSView {
    init() {
        super.init(frame: .zero)
        wantsLayer = true
        layer?.backgroundColor = CGColor.init(red:0.9, green:0.9, blue:0.9, alpha: 1.0)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
```

# ビルド
- Cmd-Bでビルド。Cmd-1→「DropRain/Products/DropRain.saver」を右クリック→Show in Finder
- 「DropRain.saver」をダブルクリック→「このユーザ専用にインストールする」のまま「インストール」→「DropRain」を選択。ここで実行できているはず。

# 再インストール
- 修正して再インストールする際には、通常は、Cmd-B→「DropRain.saver」を右クリック→Show in Finder「Day8.saver」をダブルクリック→「置き換え」とする。プレビュー画面内で修正後のプログラムが動いているはず。
- が、キャッシュが効いてしまい、うまく更新されないことが多々あった。その場合は、以下の手順をとる。
- 「システム環境設定」を終了。コマンドラインから以下を実行。（**既存のスクリーンセーバも全部消してしまうので、注意。**）
 rm -rf ~/Library/Developer/Xcode/DerivedData ~/Library/Screen\ Savers/*
- Xcodeに戻り、通常操作を行なう。そうすると、キャッシュが消えて動くはず。

# 他のブログ
日本語で検索すると、以下のエントリーが出てくる。
- 2015.7.20 http://snippets.feb19.jp/?p=1549
- 2015年12月02日 https://qiita.com/kaneshin/items/cab5132517f6902824e3
- 2017/10/17 https://marunouchi-tech.i-studio.co.jp/4669/
が、この通りにやっても動かなかった。おそらく以前のversionだったため。上記の英語のエントリーは、現状で動くため、こちらを推奨する。

# トラブル
- 何度やってもうまく動かないケースがあった。「DropRain.h」「DropRain.m」の消し忘れで、こちらが効いてしまうという理由があった。
- プログラムを改良する場合には、上記ブログにあるように、App形式にして、うまく動いてからスクリーンセーバにすると良い。

# 結論
もうスクリーンセーバは作らなくていいのではないか。
ESP-32がリブートする理由・・・電流は１A以上を推奨

ESP32が起動しないという相談がかなりあります。
そのたびに、電源について確認をしていました。

##ESP-32がリブートする理由
絶対とは全く言えませんが、ファームウェアをしっかり書き込めていた場合において起動しない原因の主要因は電源です。

###・正常な起動画面の例
![Error-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9c9a8bb2-99db-979f-e5e3-30fa2bc37f2e.jpeg)
###・ESP32がリブートしている画面の例
![Error-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b0a7d51a-cf10-414b-2992-240f09e6affb.jpeg)
##電流が足りない
電流が足りないってどういうこと？
ESP32は800mA程度の出力のある電源で無いとしっかり動きません。
ところがファームウェアを書き込むことは可能なのです。
###・ESP32が電流不足でもDownLoadModeに入ることができる
![Error-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d23c0282-c317-d665-7a92-d8e3461b4e57.jpeg)
だから、ESP32にファームウェアを正しく書き込んでいるのに起動しないという人が多いのです。
でも、原因の基本は、電流不足です。

ちなみに、このテストは、通常ならばESP32を普通に使用できるPCにおいて実行しています。
どうやってやったのでしょうか？
USBハブを使っただけでこうなります。
安い質の悪いUSBハブは、抵抗値が大きいのかESP32などを使うには荷が重すぎるのです
オーム電機のUSBハブを使用した際に、STM32ですら使えず、検証を繰り返した結果、質の悪いUSBハブを使うと
確実に使えなくなることを確認しました。
USBハブ使う人はACアダプターが使えるものを使う事をお勧めします。

##設計する人向け
ESP32の基板を作る人は、DC/DCコンバータを選定する際に注意しましょう。
Mic5219は500mAしか生成できない為、ESP32は動きません。
昔、某社で作られていたESP32の基板はMic5219だったので500mA程度しか出力できなず使えない代物でした。
その某社が、出版社の付録で基板を作ったりと・・・
それ以来、某社を信用することはなくなったのも事実です。(私は知らずにこれで大ミスをしています）

では何を使えばいいのでしょうか？
一部ご紹介します。
##DIPタイプ
####・PQ3RD23
2.2A出力
DIPで良い人はPQ3RD23をお勧めします。
##SMD
####・AMS1117
0.8A出力
大きくていい人はAMS1117という3端子レギュレータをお勧めします。

####・EA3036C
2A
小さくしたい人は、M5Stackで使われている
####・SY8089A
2A出力
M5StackのAtomシリーズ等で使われている
####・AP63203WU
2A出力
Diodes社の製品、使い勝手よさそう
[Docker]覚えておきたいオプションまとめ

# はじめに

Dockerのコマンドは普段から動かしているけど、

- コマンドのオプションを丸暗記で打つのではなく、きちんと理解する
- オプションの数が多いので、自分で利用する範囲で覚える

という趣旨で、自分がDockerを使っているうちに必要になったオプションを纏めました。
（※自分用のメモでもあるので、今後内容を増やしていくかもしれません。）

# docker ps 
 オプション | 説明 
 --- | --- 
`-a`, `--all`| このオプションを使うことで、停止しているコンテナも含めて表示することができる。デフォルトでは実行中のコンテナしか表示されないため、「docker psでコンテナ有無確認→無いのでdocker runで以前起動したことのある名前でコンテナを実行→同じ名前のコンテナがあるので落ちる」というのを何回もやってしまった。
`-q`, `--quiet` | DockerコンテナのIDのみを一覧表示する。一括でコンテナを削除したい場合等に使える。参考：[一発ですべてのDockerコンテナを停止・削除、イメージの削除をする](https://qiita.com/shisama/items/48e2eaf1dc356568b0d7)
`-f`, `--filter` | フィルタを入れる。例えば、停止中の一覧を表示させたいのなら `docker ps -f "status=exited"` とする。[公式ドキュメント](https://docs.docker.com/engine/reference/commandline/ps/#filtering)にて、どういうフィルタが利用できるのか確認できる。|

# docker build
 オプション | 説明 
 --- | --- 
`-f`, `--file` | `Dockerfile` のファイルパスを指定する。
`--pull` | 常に最新バージョンのイメージを取得する。
`--rm` | ビルド途中に作成された中間イメージを削除する。
`-t`, `--tag` | イメージの名称。バージョンを入れる場合は `name:version` というフォーマットにする。

# docker run

 オプション | 説明 
 --- | --- 
`-d`, `--detach` | コンテナをバックグラウンドで実行する。
 `-e`, `-env` | 環境変数の設定。
`-i` , `--interactive` | STDIN(標準入力)をオープンにし続ける。コマンドの結果を受け取るために必要。([参考](https://qiita.com/kyosuke_sumitani/items/7fbeccafd0950019c704))
`--name` | 名前。名前をつけない場合、ランダムでコンテナの名前が付けられる。docker psで名前を確認できる。
`--network` | ネットワーク設定。例えば、`--network="host"` とすると、Docker Hostのネットワークが利用できる。ネットワークの設定をしておかないと、docker execでパッケージのアップデート(apt-get)等を行うことすらできない場合があるので、docker runを実行する際に設定しておくと良い。Hostネットワークについては[こちらの記事](https://qiita.com/toshihirock/items/f5b9f7799ec8bf8c328e)が分かりやすい。
`-p`, `--publish` | ポート設定。書き方は、`-p {ホストのポート番号}:{コンテナ内のポート番号}`
`-t` | 公式ドキュメントには "Allocate a pseudo-TTY"(疑似TTYを割り当てる) とある。ttyというのは[標準入出力となっている端末デバイス](https://ja.wikipedia.org/wiki/Tty)のことで、ターミナルでの操作を行う際に違いが出る。ターミナル内で何かオペレーションをする可能性がある場合には付けておくと良いオプション(という理解)。[こちら](https://qiita.com/YumaInaura/items/b8d605f17d98572bb865)にもう少し詳細の挙動の違いが記載されている。`-it`というのが出てきたら、`-i`と `-t`を両方付けたオプションということ。
`-v`, `--volum` | フォルダをマウントする。Dockerコンテナとローカルで双方向に簡単にファイル共有ができる。書き方は、`-v {ローカルのファイルパス}:{コンテナ内のファイルパス}`。絶対パスで指定する必要があることに注意。

# docker rm

 オプション | 説明 
 --- | --- 
`-f` | 実行中のコンテナであっても削除する。デフォルトでは、実行中のコンテナは停止してから削除する必要があり、このオプションでショートカットできる。

# docker exec

- `-i`や `-t` はdocker runと同じ。bashのコネクションを張る時は基本的に `-it` を付けること、と覚えておく。

# 参考

- [Docker— docker run -it の -t を抜くとどうなるか ( tty 指定なしの interactive モード )](https://qiita.com/YumaInaura/items/b8d605f17d98572bb865)
- [docker — 停止したDockerコンテナのみを一覧表示する](https://www.it-swarm.dev/ja/docker/停止したdockerコンテナのみを一覧表示する/1053947803/)
- [【Docker入門】知識0からDockerでフォルダをマウントしてbashを起動するまで](https://qiita.com/karadaharu/items/0fdd9b4b373a8de656ab)
配列の基礎

配列についてまとめます．


#配列の作り方
基本的な文法は，`var 配列名　= []`です
###記述例
~~~js
const array=[1,2,3,4,5,6]

array;
~~~
###表示例

[1,2,3,4,5,6]


#ある要素を表示する方法
配列から，ある要素を表示するためには`配列名[順番]`です．
<font color='red'><注意>順番は０から数えます！</font color>
###記述例
~~~js
const array=[1,2,3,4,5,6]

array[0];
array[1];
array[2];
array[3];
array[4];
array[5];
~~~
###表示例

1
2
3
4
5
6

#配列の要素の更新・追加・削除
####更新
更新するためには，`配列名[順番]=更新させた要素`
####追加
追加するためには，
　①配列の末尾に追加する場合，`配列名.push(追加する要素)`

~~~js
const array=[1,2,3,4,5,6];
array.push(7);
array;
~~~
###表示例
[1,2,3,4,5,6,7]

　②配列の先頭に追加する場合，`配列名.unshift(追加する要素)`

~~~js
const array = [1,2,3,4,5,6];
array.unshift(0);
~~~
###表示例
[0,1,2,3,4,5,6]

　③配列の指定した場所に追加する場合，`配列名.splice(開始位置，削除する要素の開始位置からの個数，追加する要素)`

~~~js
const array=[1,2,3,4,5,6];
array.splice(2,0,2.5);
array;
~~~
###表示例
[1,2,2.5,3,4,5,6]

####削除
削除するためには，
　①配列の末尾の要素を削除する場合，`配列名.pop()`

~~~js
const array = [1,2,3,4,5],6;
array.pop();
array;
~~~
###表示例
[1,2,3,4,5]

　②配列の先頭の要素を削除する場合，`配列名.shift`

~~~js
const array = [1,2,3,4,5,6];
array.shift();
~~~
###表示例
[2,3,4,5,6]

#map
既存の配列を使って新たな配列を形成．
`配列名.map(function(任意の配列要素名){return 処理});`

~~~js
const numbers=[1,2,3,4,5,6];
const doubledNumbers = numbers.map(function(number){
	return number*2
})
doubledNumbers;
~~~
###表示例
[2,4,6,8,10,12]
#filter
配列から任意の条件を満たした要素を抽出して新たな配列を形成
`配列名.filter(function(任意の配列要素名){return 処理});`

~~~js
const numbers=[1,2,3,4,5,6];
const evenNumbers = numbers.filter(function(number){
	return number%2===0;
})
evenNumbers;
~~~
###表示例
[2,4,6]

#find
配列から条件に一致する要素を先頭から１つだけ抽出
`配列名.find(function(要素名){return 処理})`

~~~js
const members=[
  {name:'Takeshi', age:18},
  {name:'Ryo', age:13},
  {name:'Nanami', age:28}
];
const nanami = members.find(function(member){
	return member.age===28;
})
nanami;
~~~

###表示例
{"name":"Nanami","age":28}

#someとevery
配列のすべての要素が条件を満たすかどうか（True/False）を調べたい時はveryで、少なくとも1つが条件を満たすかどうか（True/False）を調べたい時はsomeを使う。

~~~js
const members=[
  {name:'Takeshi', age:18},
  {name:'Ryo', age:13},
  {name:'Nanami', age:28}
];

const everyOver20 = members.every(function(member){
	return member.age>=20;
});
everyOver20;

const someOver20 = members.some(function(member){
	return member.age>=20;
});
someOver20;
~~~
###表示例
False
True

#reduce




#参考
[MDM web docs](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/Arrays)
[Syncer](https://lab.syncer.jp/Web/JavaScript/Snippet/8/)
競技プログラミング練習記 No.62【ABC174参加】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC174](https://atcoder.jp/contests/abc174)に参加しました。
5完です！
C問題が時間内に解けませんでした。
かなり悔しいです。。。

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A | 1min |-| 3ms|
| B | 3min |距離| 49ms|
| C | - |mod| 23ms|
| D | 10min || 6ms|
| E | 22min |二分探索| 86ms|

# まとめ
先にまとめを載せます。これ自体は最後に書いてます。

距離は $\sqrt{x*x + y*y}$ ですが、ルートを外した形でも判定できます。
また、そちらの方が高速です。(累乗根を求める処理は重いです)

`mod k` の値は循環性があって、最大でも`k`通りです。


## A - Air Conditioner
```c++
  int x;
  cin >> x;
  cout << (x >= 30 ? "Yes" : "No");
```
入力値が`30`以上かどうかで答えが変わります。

## B - Distance
``` c++
  ll n, d, x, y;
  cin >> n >> d;
  ll ans = 0;
  for(int i = 0; i < n; ++i)
  {
    cin >> x >> y;
    if (x*x + y*y <= d*d) ans++;
  }
  cout << ans;
```
距離を求める問題ですね。
距離は $\sqrt{x*x + y*y}$ ですが、ルートを外した形でも判定できます。
また、そちらの方が高速です。(累乗根を求める処理は重いです)
`x*x + y*y <= d*d` で判定して答えがわかります。

この問題の制約から、オーバーフローにも注意です。

## C - Repsept

``` c++
  int k;
  cin >> k;

  if (k % 2 == 0)
  {
    cout << -1;
    return;
  }

  ll num = 0;
  for(int i = 1; i <= k; ++i)
  {
    num = num * 10 + 7;
    num %= k;
    if (num == 0)
    {
      cout << i;
      return;
    }
  }  
  cout << -1;
```
`777777...7`を上から1桁ずつ`k`で割るイメージです。
割ったときに`0`になった時点が答えです。

例えば、`123456789123456789123`のような大きい数を割るときは上から1桁ずつ割りますよね。
これと同じです。
ちなみに、上から一桁ずつ割るというのは割り算のひっ算と同じ仕組みです。

この問題では
`num = num * 10 + 7;`
`num %= k;`
でやっています。

`% k` の値は循環性があって、最大でも`k`通りです。
つまり、ループは最大`k`回で大丈夫です。
循環性をうまく使えばもっと速く解くこともできます。

## D - Alter Altar
``` c++
  int n;
  string s;
  cin >> n >> s;

  int r = 0;
  for(int i = 0; i < n; ++i)
  {
    r += s[i] == 'R';
  }

  int ans = 0;
  for(int i = 0; i < r; ++i)
  {
    if (s[i] == 'W') ans++;
  }
  cout << ans;
```
色を変える操作は入れ替える操作で置き換えることができます。
また、赤い石をすべて左に寄せれば求める状態になります。
入れ替える操作だけをすることを考えると、赤い石の数を`r`として、求める状態では最初の`r`個が赤い石になります。

文字列を前から`r`個見て、白い石ならばそれより後ろにある赤い石と入れ替えます。
こうすると最小手数で求める状態になります。

## E - Logs
``` c++
  ll n, k;
  cin >> n >> k;
  vector<ll> a(n);
  for(int i = 0; i < n; ++i)
  {
    cin >> a[i];
  }

  if (k == 0)
  {
    cout << *max_element(a.begin(), a.end());
    return;
  }

  auto f = [&](ll arg)
  {
    ll cnt = 0;
    for(int i = 0; i < n; ++i)
    {
      cnt += a[i] / arg;
      if (a[i] % arg == 0) cnt--;
    }
    return cnt <= k;
  };

  ll le = 0LL, re = 1000000001LL;
  while(re - le > 1)
  {
    ll mid = (le + re) / 2;
    if ( f(mid) ) re = mid;
    else le = mid;
  }
  cout << re;
```
切られた後の丸太の長さで二分探索です。
二分探索を選択した理由は、、、勘です。。。(理由はあるのですが言語化できないです)

$K$ と $A_i$ の制約から計算時間が足りないと分かるので、残る「丸太の長さ」を思いつきました。
丸太を長さ`L`に切れるかどうかの判断は $O(N)$ でできるので計算量的に間に合います。

割り切れるときと割り切れないときで計算結果が意図しないものになります。
`floor`関数や`ceil`関数をうまく使いましょう。
私は `if (a[i] % arg == 0) cnt--;` で調整しました。

以上です。ありがとうございました。
[メモ]Rust/Cargoでよく使いそうなコマンドリスト

コマンドの動作は Windows10 64bit の Windows Terminal + PowerShell 7.0.3 で確認いたしました

# rustup コマンド

## `rustup update`

インストールしているRust環境を最新版に更新します

## `rustup --version`

インストールしている `rustup` のバージョンを表示します

# rustc コマンド

## `rustc [ファイルパス]`

[ファイルパス]をビルドし、実行ファイルを生成します。

## `rustc --version`

インストールしている `rustc` のバージョンを表示します

# cargo コマンド

## `cargo new [プロジェクト名]`

Rustプロジェクトを作成します。
プロジェクト名はそのままディレクトリ名になります

## `cargo check`

実装したコードがビルド可能か確認します。
ビルドは行いません。

## `cargo build`

実装したコードをビルドし、実行ファイルを生成します。
(後述の通り、開発ビルドで行われます)
もちろん、ビルドエラーがあれば生成されません。

## `cargo build --release`

実装したコードをリリースビルドで行います。
ディレクトリは `target/release/`内に生成されます。
省略したときは開発ビルドで行います。
ディレクトリは `target/debug/`内に生成されます。

## `cargo run`

`cargo build` でビルドした実行ファイルを実行します
実行ファイルが生成されていなければまずビルドします

## `cargo run --release`

`cargo build --release` でビルドした実行ファイルを実行します。
実行ファイルが生成されていなければまずビルドします

## `cargo --version`

インストールしている `cargo` のバージョンを表示します
JS 正の整数なら前からN個、負の整数だったら後ろからN個返す

##Lodashのnth関数を作成してみた

###当初はすごく複雑に考えていた
~~~javascript
var array = ["a", "b", "c", "d", "e", "f"]

const nth = (values, selectNum) => {
  if (0 < selectNum) {
    return values[selectNum]
  } else {
    let absolute = Math.abs(selectNum)
    let newArray = []

    for (let i = 0; i < values.length; i++) {
      const array = values.length - (i + 1)
      newArray.push(values[array])
    }

    return newArray[absolute - 1]
  }
}

console.log(nth(array, 3))
// => d

console.log(nth(array, -5))
// => b

~~~


##もっとシンプルに記述できた
~~~javascript
const nth = (values, num) => {
  return 0 < num ? values[num] : values[values.length + num]
}

console.log(nth(array, 3))
// => d

console.log(nth(array, -5))
// => b
~~~
CSSトランジション

CSSトランジションとは、 CSS プロパティが変化する際のアニメーションの速度を操作する手段を提供します。プロパティの変更を直ちに有効にするのではなく、プロパティの変更を一定期間にわたって発生させることを可能にします。例えば、ある要素の前景色を白色から黒色に変更した場合、通常は即座に前景色が替わります。 CSS トランジションを有効にすると、加速カーブに従った時間間隔で変更が行われ、その変化のすべてをカスタマイズすることができます。