OmniAICreator/Qiita-1.07M huggingface dataset:
Rails5でSprocketsを使いつつ、npmを利用する

## 何をしたか
今までに作ったRailsアプリは

- Sprockets + JSのライブラリはCDNでレイアウトファイルから読み込み
- Webpacker + JSのライブラリはnpmで読み込み

のパターンしか作ったことがなかったのですが、この度、

- Sprockets + JSのライブラリはnpmで読み込み

というアプリを作ることになり、やり方をメモしようと思います。
具体的には`https://swiperjs.com/`というライブラリの導入プロセスを紹介していきます。

## npm + Rails の初め方

npm自体は、`node.js`をダウンロードするとついてきます。Railsの環境構築時にnode.jsはインストールされているはずなので、

```
$ npm -v 
```

でバージョンが表示されたらOKです。

## ライブラリのインストール

インストールしたいライブラリをnpmで導入します。

```
$ npm install swiper
```

npmバージョン４からは`--save`オプションをつけなくても`package.json`を更新してくれます。

## アセットパイプラインにパスを追加

`node_modules`配下のパスを見ながら、アセットパイプラインにパスを追加します。今回の`swiper`の場合、必要なファイル`swiper-bundle.js`は下記の位置にありました。

```
node_modules
└── swiper
    └── swiper-bundle.js
```

なので、`application.js`には、以下の様に記入します。

```JS:assets/javascripts/application.js
//= require rails-ujs
//= require activestorage
//= require swiper/swiper-bundle.js  # 追記
//= require_tree .
```

## 初期化に必要なファイルを追加
初期化に必要なコードがあれば、`assets/javascripts`内に別ファイルを作るか、`application.js`内に、記載します。今回は`application.js`内に記しました。

```JS:assets/javascripts/application.js
$(function() {
  new Swiper('.swiper-container', {
    loop: true,

    // If we need pagination
    pagination: {
      el: '.swiper-pagination',
    },

    // Navigation arrows
    navigation: {
      nextEl: '.swiper-button-next',
      prevEl: '.swiper-button-prev',
    },

  })
})
```

### 完成
これで、無事`swiper`が動作する様になりました＾＾

[![Image from Gyazo](https://i.gyazo.com/dcb629e5c7c50552282a3fc35838b770.gif)](https://gyazo.com/dcb629e5c7c50552282a3fc35838b770)

## 感想・参考記事等

RailsとJSの最近の流れを振り返る形になって楽しかったです＾＾
以下、参考にした記事です。

- [アセットパイプライン - Railsガイド](https://railsguides.jp/asset_pipeline.html)
- [Railsで利用するフロントエンドのライブラリをnpmからインストールする](https://qiita.com/k-motoyan/items/78f1162af52f92b8d9cf)
- [Rails 6: Webpacker+Yarn+Sprocketsを十分理解してJavaScriptを書く: 前編（翻訳）](https://techracho.bpsinc.jp/hachi8833/2020_01_16/85940)
テキスト入力フィールド付きTimePickerで秒を非表示にする

# 概要

Vue.jsにてBootstrapのTimePickerを利用しているときの話です。
サンプルコードはVue.js前提ですが、論じている機能としてはBootstrap自体の話です。

TimePickerで、「秒を非表示にする」方法を説明します。
これ自体は、属性「`show-seconds`」を外すことで実現できます。

ref. https://bootstrap-vue.org/docs/components/form-timepicker#enabling-of-seconds-spinbutton

問題は、TimePickerに「任意の入力フィールド（直接入力したい要求のため）」を設けている場合です。この時、TimePickerが返却する値は「秒を含む」ため、「入力フィールドに秒が表示」されてしまいます。その際の解決方法を述べます。

※なお、UIをブラウザ依存にして構わないのであれば、Input要素のtime型を利用した方が楽です。
　そちらは標準が「秒は非表示（任意で追加）」なので。

ref. https://bootstrap-vue.org/docs/components/form-input
ref. https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/time


# 対処方法

「TimePickerに任意の入力フィールドを設けている」とは、
たとえば、次のように実装している場合です。

```
<div class="div-timepicker">
    <b-input-group class="mb-2">
        <b-form-input
            :id="idOfTimeInput"
            v-model="timeCurrent" 
            v-bind:state="isTimeCurrentValid" 
            type="text" 
        ></b-form-input>
        <b-input-group-append>
            <b-form-timepicker 
                v-model="timeCurrent" 
                button-only 
                right 
                locale="ja"
                :aria-controls="idOfTimeInput"
            ></b-form-timepicker>
        </b-input-group-append>
    </b-input-group>
</div>
```

ref. https://bootstrap-vue.org/docs/components/form-timepicker#button-only-mode

このとき、`b-form-timepicker`の戻り値は「HH:MM:SS」の形式となります。

ref. https://bootstrap-vue.org/docs/components/form-timepicker#v-model-return-value

このため、`b-form-input`の値は「HH:MM:SS」の形式に更新されてしまい、「秒が表示」されてしまいます。

![show-secondsを外してもinput側へretrunされたときに秒が表示される](https://gyazo.com/448dca3ad89bfd7d5135a97ff88a632f.jpeg)

この現象は、次の2つを行うことで回避できます。

* `b-form-input`要素側にbindする変数を別にする
* 別とした変数のgetter/setterタイミングで「秒の削除」と元のpicker側の変数との同期をする

本サンプルでは「`timeCurrent`」に代わって「`timeCurrentInput`」を設け、そのgetter時に`timeCurrent`から取得することで同期し、setter時に`timeCurrent`へも反映することで、同期します。

```
<div class="div-timepicker">
    <b-input-group class="mb-2">
        <b-form-input
            :id="idOfTimeInput"
            v-model="timeCurrentInput" 
            v-bind:state="isTimeCurrentValid" 
            type="text" 
        ></b-form-input>
        <b-input-group-append>
            <b-form-timepicker 
                v-model="timeCurrent" 
                button-only 
                right 
                locale="ja"
                :aria-controls="idOfTimeInput"
            ></b-form-timepicker>
        </b-input-group-append>
    </b-input-group>
</div>
```

```
computed : {
    timeCurrentInput: {
        get: function () {
            return (this.timeCurrent && this.timeCurrent.length > 5) ? this.timeCurrent.substr(0,5) : this.timeCurrent;
        },
        set: function (newTime) {
            this.timeCurrent = (newTime && newTime.length == 5) ? newTime + ":00" : newTime;
        }
    },
}

```

![input要素側の変数を別管理することで秒を削除](https://gyazo.com/04375c971319f2cfd7712cedcaaf8cbf.jpeg)

以上です。

P.S. 本当にこんな解決方法で良いの？もっとスマートな方法（input要素側にオプション付けるだけ、とか）があるのでは？
zsh環境でfzfを使ってディレクトリの移動履歴を簡単に辿れるようにする

## 最初に
ディレクトリの移動履歴をfuzzy finederの[fzf](https://github.com/junegunn/fzf)を使って、簡単に辿れるようにします。
また、起動にはショートカットコマンドの`control + t`を使って、移動履歴の一覧を辿れるようにします。

## 環境
下記の環境で設定しています。
macにデフォルトで入っているzshで動くかはわかりません。古いとは思いますが、別に関係ないかしらん？

* macOS 11.1
    * intelマシンで試しています。
    * m1マシンでは今のところ利用する予定がないので、まだ試していません。
* zshのバージョンはこちら → `zsh 5.8 (x86_64-apple-darwin20.1.0)`
    * brewでinstallしたzsh環境で設定しています。



## fzfのインストール

インストール方法はいくかあるようですが、私はもっぱら`git clone`でインストールしたいタイプです。

```zsh
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
```

いくつかCLI上で聞かれると思いますが、全て`y`で打っています。

### fzf installation(参考ドキュメント)
https://github.com/junegunn/fzf#installation

## fzf側でディレクトリの移動履歴を辿れるようにする
これを実現するために、素晴らしいコードを記載してくれている方がQiitaにいらっしゃいました。
https://qiita.com/arks22/items/8515a7f4eab37cfbfb17#%E3%82%B3%E3%83%BC%E3%83%89

私はこのコードを参考に、中身を少し改造させて利用させていただいています。
具体的には

* 保存するディレクトリ移動履歴の記録容量を増やした。
    * `99`では足りないかもしれないので、必要に応じてもっと増やすかも。
* 引数は利用しないので、引数ありのパターンを削除した。
* 履歴を出力する際に`gtac`ではなく、`tail -r`を使うようにしている。
* `powered_cd` -> `powered_cd_2` に名称変更。これはまあなんとなくです。`powered_cd`を改造する前の状態でも利用できる余地を残しておきたくて、一応名称を変えています。

```zsh
function chpwd() {
  powered_cd_add_log
}

function powered_cd_add_log() {
  local i=0
  cat ~/.powered_cd.log | while read line; do
    (( i++ ))
    if [ $i = 99 ]; then
      sed -i -e "99,99d" ~/.powered_cd.log
    elif [ "$line" = "$PWD" ]; then
      sed -i -e "${i},${i}d" ~/.powered_cd.log
    fi
  done
  echo "$PWD" >> ~/.powered_cd.log
}

function powered_cd_2() {
  if [ $# = 0 ]; then
    cd $(tail -r ~/.powered_cd.log | fzf)
  else
    echo "powered_cd_2: This command does not accept any arguments."
  fi
}

_powered_cd() {
  _files -/
}

compdef _powered_cd powered_cd

[ -e ~/.powered_cd.log ] || touch ~/.powered_cd.log
```

本家のコードは上記URLよりご確認ください。また、上記の記事内で紹介されている `enhancd` も便利そうです。
(私自身はなるべく普段使っている `fzf` で全てまかないたい気分でしたので、このやり方でやっています。)


## ショートカットコマンドで起動できるようにする

`zsh`でショートカットを設定するには関数を作成して設定するのが楽だと思います。
(というか、関数を作成して設定する以外のやり方は調べていません。)

ショートカットキーの設定については、下記の記述がかなりシンプルなものになるかと思うので、**zshでショートカットキーの設定を行う**際には下記の中身を書き換えれば、楽に設定できそうかと思います。


```zsh
# run powered_cd with shortcut ^t
function run_powered_cd_2() {
  echo "run powered_cd_2";
  powered_cd_2;
  zle reset-prompt;
  zle redisplay
}
zle -N run_powered_cd_2
bindkey '^t' run_powered_cd_2
```

内容自体は何となく文言から読み取れるかと思いますが、一応の自分用メモとして一部挙動に関するメモを残しておきます。

* zle reset-promptをつけないと実行後のプロンプトが表示されない
    * 履歴リストからの移動を実行した際に、ちゃんと移動したことがわかるような挙動になります。
    * (これをつけないと、関数実行後のディレクトリがプロンプトに反映されません)
* zle redisplayで実行後の画面リフレッシュを実施
    * 実行したあとにプロンプトの画面リフレッシュを行うためにつけています。


## 最後に
設定はこれで以上となります。
使い始めてまだ1~2日ですが、使用感も良く満足です。
Windows7でsvchostのCPU利用率が高い現象の調査記録 (Windows Updateが原因ではない場合)

Windowsで何もしてないのにCPU利用率が高い。タスクマネージャで見るとsvchostがCPUを食っている。そんなありがちだけど面倒な現象の調査記録です。Windows7なのでもう古い話ですが備忘録として。

## 最初にやったこと

- タスクマネージャでプロセス一覧を見ると、svchostのCPU利用率が50%。4core中2coreが全開で走っている。
- 再起動しても状況変わらず
- ネットで検索するとWindows Updateが原因という声多数。Windows Updateを無効にしてみるが状況変わらず。
- 念のためウィルスチェックのスキャンを行う。
- とりあえずほっておいたが、3日経過しても状況変わらず。

しょうがないので、調査することにしました。

## Process Explorerを使う

参考：https://kijonojiron.com/processexplorer_how_to_use

なお、Process Explorerは管理者権限で起動する必要があります。

### 最初の確認

![proressexp1b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12960/a433ff38-ae38-3bca-1936-af5d8a12f0e7.png)

起動してCPU利用率の高いsvchostのプロセスにマウスカーソルを持っていき、薄い黄色で表示される内容を確認します。具体的には以下の2点。

- ファイル名の確認

svchost.exeのフルパス名が表示されるので確認（上記のスクリーンショットは管理者権限で起動してないためフルパス名で表示されてませんが)
今回は、`svchost.exe -k rpcss`で起動されているプロセスでした。

- 関連サービスの確認

当該svchostに関連するサービスがあればそれが表示されます。Windows Updateが原因の場合、ここでWindows Update Serviceが表示されますが今回は何もなし。

なお、ここで当該svchostを右クリックして、終了を選択してみました。終了するとCPU利用率とメモリ消費(GB単位で消費していました)もいったんおさまりますが、1分もしないうちにsvchostが再起動して元の状態に。

### svchostプロセス詳細を見る

![proressexp2b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12960/350772aa-aef3-4177-a690-ba4d23b8ddc3.png)

当該svchostをダブルクリックすると詳細情報が出ます。2スレッドが全開で動いている状態。

### 怪しいネットワーク接続を確認

![proressexp3b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12960/82ee426b-0d80-2b0b-2615-e0af46f47284.png)


"TCP/IP"タブをみたところ、このsvchostから66.42.101.212.vultr.com というホストにhttps接続が行われています。なにこれ？ 調べてみたところvultr.comは仮想サーバーですね。Vultr自体が怪しいわけじゃなさそうですがなにをやっているのか...

svchostを何度かkillして調べたところ、接続にいくのは以下の2ホストのどちらかでした。ホスト名そのままのIPアドレスです。

- 66.42.101.212.vultr.com
- 45.76.69.121.vultr.com

ためしにブラウザでhttps://66.42.101.212/ にアクセスしたところタイムアウトエラー。なんのサーバーかわかりませんが生きてないようです。ホスト名でネット検索しても何の情報もなし。

### とりあえず接続を遮断して解決？

Windowsのhostsファイルで、上記をlocalhostに向けるように設定しましたが状況変わらず。

最終的に、家のルーターの設定で上記アドレスに対する接続を拒否するルールを登録しました。そしてやっとCPU利用率が低下。やれやれ。それにしても何の通信なのやら。
JavaScript のコードを整形する

以下のサイトを利用した。

Online JavaScript Beautifier (v1.13.0)
https://beautifier.io/

## コードを貼って、 Beautifully Code で整形
![スクリーンショット 2021-01-03 10.46.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27486/ed5ecd0a-7da0-a6ab-4561-ea3c5a275fce.png)


## いろいろできる
### フォーマットが指定できる
![スクリーンショット 2021-01-03 10.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27486/f7d13ee6-2c23-85b4-c41e-6544fbc1c4fd.png)

こうなる。
![スクリーンショット 2021-01-03 10.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27486/29a9bf68-c53c-1964-ff9c-10038b7167bc.png)

### JavaScript, CSS, HTML に対応しているっぽ
![スクリーンショット 2021-01-03 10.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27486/c001adc2-1602-a507-8af8-c3d4743ebae2.png)


以上。
BigQuery に json ファイルを取り込む

## やりたいこと
Macで以下のような複数ディレクトリ配下にあるjson(Slackからエクスポート)ファイルをBigQueryのネストテーブルとしてインポートする。

+hoge
 　-2021-01-01.json
　 -2021-01-02.json
+fuga
 　-2021-01-01.json
 　-2021-01-02.json

## 前準備
Slackのエクスポートファイルが大量にあるため、必要に応じて以下のようにディレクトリごとにjsonファイルをマージしておきます。

```{jsonmerge.sh}
dirs=`find . -mindepth 1 -type d`
for dir in $dirs;
do
    jq -s add $dir/*.json > $dir/merge.json
done
```

次に、マージしたjsonファイルをディレクトリ名（Slackのチャネル名）に変更します。

```
find . -name merge.json -exec rename 's/(.*)\/(.*)\./$1\/$1./' {} \;
```

特にチャネルを識別する必要がない場合は、全てのjsonを以下のようにマージします。

```
find . -name '*.json' -exec jq -s add > output.json \;
```


## BigQuery 用に変換

BigQuery は改行区切りの json 形式にする必要があるので、以下のように jq コマンドで変換する必要があります。

```
jq -c '.[]' fuga.json > hoge.json
```

複数ディレクトリ下のjsonを一括で変換するには以下のように行う方法があります(もっと良い方法をご存知の方ご指摘ください)。

```
find . -type f -exec sh -c "jq -c '.[]' {} > {}.new" \; 
```

-exec の後ろには1つのコマンドしか取れないので、sh -c の中でjqコマンドを実行しています。

もしファイルを上書きする場合は以下のようなシェルスクリプトで一括変換します。


```{jsonconvert.sh}
#!/bin/bash
set -euxo pipefail
for file in **/*.json; do
    jq -c '.[]' $file | sponge $file
done
```

*jq, sponge コマンドは brew install しておいてください。

その後BigQueryコンソールで新規テーブル作成画面を開き、ファイル形式にjsonを選択し、スキーマの自動検出オプションを設定してインポートするとjsonがnested tableとして取り込まれます。

## 参考
[Edit files in place #105](https://github.com/stedolan/jq/issues/105)
cameraX と opencvでのruntimeで　Caused by: java.lang.ClassCastException: Bootstrap method returned null camerax　となるエラー回避備忘録

## 概要

アプリケーションビルド後、
```
Caused by: java.lang.ClassCastException: Bootstrap method returned null camerax
```
となって初期化に失敗する。


## 解決策

この@iwatake2222さんや@kk2170さんの
以下のありがたい記事を参考にし、

https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3
https://qiita.com/kk2170/items/472dddb86b373f52f8e9


`app:build.gradle`

にJava8機能を有効化するような記述を追加する必要があった。

```
    android {
        compileOptions {
            targetCompatibility = "8"
            sourceCompatibility = "8"
        }
    }
```


これを行った時は念のため

`build` から
`clean project ` を実行しておく。
vimeoのチャンネルのRSSフィードの登録方法【Feedly】

## 概要
vimeoのチャンネルを、RSSフィードを取得する方法を紹介します。

Databricks社がvimeoにてワークショップの動画をアップロードしていたため、本手順の実施方法を調査しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7649e2b2-ccae-073a-c7ee-2a6aaf03e5c5.png)


## 手順
### 1. RSSを登録したいチャンネルのページ（例：https://vimeo.com/databricks）に接続。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7d3fe446-f3a0-d41c-6a8e-274c4876c64d.png)

### 2. URLに、"/videos/rss"を追記して（例：https://vimeo.com/databricks/videos/rss）、ページを更新。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/282df3fe-ad32-60b5-906e-8ec47ab5844d.png)

### 3. Feedlyに登録。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/60fbcce4-de1e-b259-6517-8e4018f82450.png)

## 注意事項
### Databricksのチャンネルだとタイトルがつきませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f2a17e31-ea1b-fd1e-41d4-7dda18aba9cf.png)


## 参考リンク
- [How to create an rss feed for a Vimeo channel – rasa.io](https://help.rasa.io/hc/en-us/articles/360045535193-How-to-create-an-rss-feed-for-a-Vimeo-channel)
数字の条件分岐

ターミナルから数字を入力して、数字に応じて処理を変えるプログラムを作成したいと思います。

+ 10以下なら「10以下の数字です」
+ 10より大きい数字なら「10より大きい数字です」 
+ 10以下でかつ0以下なら「0以下の数字です」

このように出力できるプログラムを作成します。

初めに、ターミナルから数字を入力して変数に代入します。

```ruby
input = gets.to_i
```

getsメソッドを使って入力した値は全て文字列になるため、数字を入力してもプログラムで使うときは文字列に変換されてしまいます。そこで、to_iメソッドを使って数値に変換しています。

次にif文を使って条件分岐をしていきます。if文は先に書いた条件から判断をしていくため、その下に書いた条件に当てはまったとしてもスルーされます。

この規則を念頭に順番を考えていきます。

```ruby
input = gets.to_i

if input <= 0
  puts "0以下の数字です"
elsif input <= 10
  puts "10以下の数字です"
else
  puts "10より大きい数字です"
end
```

このような順番で記述をしていくことで0以下の数字が入力されたときでも、10以下の数字ですと出力されることがなくなります。
【AWS S3】「バケットを削除する十分なアクセス許可がありません」のエラーが出た

#エラーが発生
S3のバケットを削除しようとした所「バケットを削除する十分なアクセス許可がありません」のエラーが発生した。
![スクリーンショット 2021-01-03 9.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/b31d30ad-cdac-d286-6c4a-c448448c5f88.png)


#手順
該当バケットのアクセス許可を選択する。
![スクリーンショット 2021-01-03 9.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/cff312d7-aa82-5cf1-b5ae-1009a2ba7647.png)
バケットポリシーの画面に行き、s3:DelteBucketのEffectがDenyになっているか調べる。確認すると削除権限が拒否されていたので、今回削除できなかったようだ。特に必要ないバケットポリシーなので削除した。
![スクリーンショット 2021-01-03 9.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/43d86eba-5a97-cfef-7ce4-7d1c96c82b13.png)
その後バケットを削除に戻り、無事削除できた。
![スクリーンショット 2021-01-03 10.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/21c9c12d-9f63-3a88-a271-58a948f1e146.png)
java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found　エラー回避備忘録

## 概要

```
java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
```

がruntimeのエラーとして吐き出される。


## 回避方法

`app:build.gradle` にて

```cmake

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.example.test10"
        minSdkVersion 27
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
```


のところの

```cmake

            cmake {
                cppFlags ""
            }
```

に追加して、

```cmake

            cmake {
                arguments "-DCMAKE_BUILD_TYPE=Release" ,"-DANDROID_STL=c++_shared", '-DANDROID_TOOLCHAIN=clang'
                cppFlags ""
            }
```

とする。
Dependent features configured but no package ID was set.　エラー回避備忘録

## 概要
Opencv (今回は４系）をandroid app に New Module として追加し、
サンプルを実行しようとすると、

コンパイル時に

```
Dependent features configured but no package ID was set.
```

となった時の回避備忘録


## 方法

追加したモジュール（今回の環境では `Module: java`)
以下のbuild.gradle において、１行目の

```git
- apply plugin: 'com.android.application'
+ apply plugin: 'com.android.library'
```

とした。


また、
同じファイルの、

```
    defaultConfig {
        applicationId "org.opencv"
    }

```

の`applicationId`をコメントアウトした。

```
    defaultConfig {
        //applicationId "org.opencv"
    }

```
メールユーザーの作成方法

ssh でログイン出来ないメールのみのユーザーの作成方法です。
ubuntu 20.10 で確認しました。

ログインできるユーザーを　taro と hanako に限定する

```text:/etc/ssh/sshd_config
（省略)
AllowUsers taro hanako
```

メールユーザーを作成する

```bash
sudo adduser --uid 1511 scott
```

確認

>1) メールを作成したユーザーに送る
scott@example.com

>2) メールの受信を確認する

>3) ssh で　ログインできないことを確認する

>```bash
ssh scott@example.com
```
manimの作法 その4

#概要

manimの作法、調べてみた。
VectorField、使ってみた。

#サンプルコード


```
from manimlib.imports import *

def pendulum_vector_field_func(point, mu = 0.1, g = 9.8, L = 3):
	theta, omega = point[:2]
	return np.array([omega, -np.sqrt(g / L) * np.sin(theta) - mu * omega, 0, ])

class test(Scene):
	def construct(self):
		plane = NumberPlane()
		mu_tracker = ValueTracker(1)
		field = VectorField(lambda p: pendulum_vector_field_func(plane.point_to_coords(p), mu = mu_tracker.get_value()), delta_x = 0.5, delta_y = 0.5, max_magnitude = 6, opacity = 0.5, )
		field.set_opacity(1)
		stream_lines = StreamLines(field.func, delta_x = 0.5, delta_y = 0.5, )
		animated_stream_lines = AnimatedStreamLines(stream_lines, line_anim_class = ShowPassingFlashWithThinningStrokeWidth, )
		self.add(plane, field, animated_stream_lines)
		self.wait(10)





```

#生成した動画

https://www.youtube.com/watch?v=rkXmemK4cuA

以上。
【Vue.js】メニュー機能の実装　実装編 rails6

#はじめに

クリックするとメニューが開いたり閉じたりする機能をVue.jsで実装します。
この記事では、rails6で実装してますので、導入につまずいてる方がいらっしゃったら、下記の「Vue.js導入編」をご参照ください。

【Vue.js】メニュー機能の実装　Vue.js導入編　rails6
https://qiita.com/AKI3/items/e87203c590322c908946




###目次
1.Vue.js
2.html
3.scss



#開発環境
Vue 2.6.12
rails 6.0.0
ruby 2.6.5


#実装
それでは実装していきます〜

#1. Vue.js


```js:app/javascript/packs/menu_vue.js
const app = new Vue({
  el: '#app',
  data: {
    ActiveBtn: false
  },
})
```
Veu.js自体の実装は簡単です。






#2. html


```html:app/views/tops/new.html.erb
<div class="top-editor-wrap">
  <div id="app">
    <!--メニューのボタン-->
    <div class="top-editor_btn" v-on:click='ActiveBtn=!ActiveBtn'> ←ここがveu.js
      <h1>ボタン</h1>
    </div>
    <!--サイドバー-->
    <transition name="editor-side">
      <div class="editor-side" v-show="ActiveBtn"> ←ここがveu.js
        <div class="editor">
          <h3>メニュー</h3>
          <p>項目１</p>
          <p>項目２</p>
          <p>項目３</p>
        </div>
      </div>
    </transition>
  </div>
</div>
```

`v-on:click='ActiveBtn=!ActiveBtn'`が、ボタンがクリックされたらActiveBtnの真偽値を逆にする（反転する）という記述。



#3. scss

```scss:app/assets/stylesheets/editor.scss
.top-editor_btn {
  position: fixed;
  top: 30px;
  left: 40px;
  cursor: pointer;
  z-index: 50;
}

.top-editor_btn img {
  width: 65px;
}

.editor-side {
  position: fixed;
  background-color: hsla(0, 0%, 57%, 0.829);
  z-index: 30;
  width: 325px;
  height: 100vh;
  top: 0;
}
```
以上で完成です！！





#まとめ
この機能では`ActiveBtn`がポイントでした。
もちろんJSだけ同じ機能を作る事は可能ですが、Veu.jsを使用するメリットはコードの量が圧倒的に減る事でした。
まだまだ勉強しはじめたばかりなので、さらに学んで行きたい思ってます〜


####最後に
私はプログラミング初学者ですが、同じ様に悩んでる方々の助けになればと思い、記事を投稿しております。

それでは、また次回お会いしましょう〜



#参考
【公式】
https://jp.vuejs.org/v2/guide/

【Vue.js】メニュー機能の実装　Vue.js導入編
https://qiita.com/AKI3/items/e87203c590322c908946

大変参考にさせていただきました。ありがとうございます。
https://qiita.com/helloworld193/items/9aed3870be1e739c3ad2

ともすたの谷口さん
https://www.youtube.com/playlist?list=PLh6V6_7fbbo-SZYHHBVFstU2tp0dDZMAW
Java + SpringBoot + Gradle + thymeleaf で 簡易DRUDアプリ作成 ( 1 )

## はじめに
エンジニアに転職してから1年半が経とうとしているのでそろそろ、JavaとSpringBootで基本的なアプリ開発ができるようにならないといけないと思い始めました。現在使用している参考書は[Spring Boot 2 プログラミング入門](https://www.amazon.co.jp/Spring-Boot-2-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798053473/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=)です。まだ全て手を動かしながら実践できていませんが簡易的なアプリを作成するまではできたので纏めておきます。ところどころ自分オリジナルのコードも入れながら作成したので良い勉強になりました。何回かに分けて復習がてら書いていきたいと思います。

github: https://github.com/noydmt/myboot


まず使用したツールやFWの説明から。

## Gradle
`Groovy`によるビルドツール。
ビルドの情報や処理は`Groovy`で記述されている。`Groovy`とはプログラミング言語の一種で`Java`を踏襲した文法で書くことができ、アプリも作れる。使用用途としては`Gradle`の記述以外にも本格的なアプリ開発の前のプロトタイプを作るときに用いられることが多い。
`maven`と違い、`pom.xml`は使用せず、プロジェクトの中に`build.gradle`ファイルを置いて環境を管理する。
STSでプロジェクト作成を行うときは予め、gradle専用のプラグインツールをインストールしておく必要があり、STSで始めることが多いと思われるので`ヘルプ`=>`Eclipseマーケットプレイス`=>`「Buildship」で検索`=>`Buildship gradle integration`をインストールすることでgradleプロジェクトを作成可能。

## Thymeleaf
Java用に作られたテンプレートライブラリ。SpringBootにデフォルトで組み込まれている為、特にライブラリ等をインストールする必要はなし。JSPと違ってHTMLに影響を及ぼさない`th`や`${}`などを用いて画面を表示することが可能。正直個人的な感想では今更、テンプレートエンジンを学ぶ旨味もそこまでないような気がする。

## SpringBoot
`Spring`フレームワークを基にさらに拡張されたJavaフレームワーク。railsライクに高速開発できることが強み。
`Spring framework`同様にDIが兼ね備えられており、わざわざ依存クラス内で使いたいクラスのインスタンスを生成する必要がない。`AOP`については調べたけどよくわからない。

続いては実際にアプリ開発で使用した環境を紹介していきます。

## build.gradle


```build.gradle

plugins {
	id 'org.springframework.boot' version '2.3.4.RELEASE'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
}

group = 'com.gradle.springboot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	compile('org.springframework.boot:spring-boot-starter-data-jpa')
	compile('org.springframework.boot:spring-boot-starter-thymeleaf')
	compile('org.hsqldb:hsqldb')
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

```

中身をざっと見てみると`plugins`と`repositories`、`dependencies`がこのファイルの構成要素になっており、`plugins`では`Java`や`springBoot`、`dependency`などの使用言語や使うフレームワーク、管理ツール、バージョンなど管理されている。
バージョンによって使える機能が限られることがあるので注意。
とは言いても個人の開発者がよりいじる可能性があるのは`dependencies`である。
この`dependencies`ではどんなライブラリを使いたいか予め記述するだけでビルド時に勝手にダウンロードをしてくれる。
`build.gradle`を使わないと使いたいライブラリがあった場合、のちに外部からjarファイルをダウンロードしてクラスパスを通さないと使えなかったが`gradle`はそんな手間を掛けずにライブラリを使用することができるのだ。

今回私が使用したライブラリは下記になる。
・SpringBoot
・thymeleaf
・HSQLDB
・JPA

HSQLDBはJavaアプリケーション内部にDBを内蔵することを可能にするもので本来のサーバー上でなくメモリ上にデータベースを保管することができる。開発段階のテスト用データベースとして使用されることが多い。メモリ上に保管する為、揮発性を持ち、一度保管したレコードはアプリケーションを再起動すると消えてしまう。

JPAとはエンティティクラスを利用してRDBのテーブル操作をもっと簡易的に実現できるORマッパー。

次回に続く。。。
初心者向けwindows+vscodeでhaskell環境を使う

初心者向けの記事です。
windowsにhaskellの実行環境のインストールとVSCodeからHaskellコンパイラを使う方法のメモです。

### 前提

- OS : windows10
- vscodeインストール済み

---
### stackのインストール
こちらからstackの最新のインストーラーをダウンロードします。
https://github.com/commercialhaskell/stack/releases
stackはhaskell環境をPCにインストールしてくれるツールです。

2020/01/03時点この記事では2.5.1が最新版なので
stack-2.5.1-windows-x86_64-installer.exe
をダウンロードしました。
インストーラーを実行しstackをインストールします。
この画面で３つのチェックボックスすべてにチェックがされているのを確認します。外れている場合はチェックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/aca18dc3-89b2-4cec-a404-21db8b045928.png)



インストールが完了したらVScodeを起動します


Terminal から New Terminalをクリックすると下のほうにTERMINALウィンドウが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/bbaab688-a690-1a05-a9f1-2d8af83bacd9.png)


ターミナルにstack setupと入力します。ghcというhaskellのコンパイラをインストールしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/191aabd3-31ac-4ca1-e759-ef6615240e6f.png)


### インタープリターを使う
stack ghciと入力するとインタープリターモードが立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/858d8586-d8fe-9d0d-86ba-57e9c6594305.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/3fc927ea-25c5-5b0d-7cf5-56ac76d1cda1.png)
終了する場合は:qと入力します。


### ファイルをコンパイル・実行する

まずはじめにVSCodeのHaskell Syntax HighlighingというEXTENSIONをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/a575a2d6-f915-18fa-0070-156f14aa1ce9.png)

haskellのファイルの拡張子はhsです。
新しいファイルを作って保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/05d4ccc5-407e-0686-e5eb-240f39cc5483.png)

タブを右クリックしてCopy Pathをクリックすることでこのファイルの絶対パスをコピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/e4b793e4-8db7-b708-901a-aac1af74c8d0.png)

ターミナルでstack runghc と入力したあと右クリックするとさきほどコピーしたファイルパスをペーストできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/ce63710a-2d91-176f-7cc9-630fcf46ed45.png)
コンパイル・実行されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/b25663d5-d50b-2369-928f-d611e934e235.png)




# おわりに

WWW入門で有名なとほほさんがhaskell講座をはじめられました。
http://www.tohoho-web.com/ex/haskell.html

普段使いのwindowsでも手軽にhaskellをやってみましょう！
Big Sur環境でのインスタライブ配信方法

Mac OS Big Surの環境で画面共有しつつインスタライブを流したくなった時少々詰まった点があったので紹介しておきます。

## OBSを使う
基本的に、RMTPのストリームキーさえ手に入れれば画面自体はOBSでいじれるので、とりあえずOBSをインストールしましょう。
https://obsproject.com/ja/download

使い方に関しては他の記事もたくさん出ていますのでそちらをご覧ください。

## ストリームキーを手に入れる
OBSから配信を行う場合はRMTPSサーバーのURLとストリームキーが必要になるのですが、インスタグラムから直接これらを取得することはできません。なのでサードパーティーのアプリを利用して取得することになります。

### Yellow Duckは使えない
他の記事を見ると大体ストリームキーを取得するためのサービスとしてYello Duckが挙げられているのですが、Big Sur環境だと起動後最初の画面でエラーが出てそこから先に進めません（起動時の開発者認証云々の話ではなく）。なので回数に制限はありますが[Insta feed](https://instafeed.me/)などのWebサービスで代用することをお勧めします。

## Insta feedでキーを取得
Insta feedにサインインすると
![スクリーンショット 2021-01-03 8.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502570/7bc23ecf-f464-ec3d-c0fa-e76c734c1259.png)
こんな感じの画面になります。"BROADCAST TITLE"に適当な配信タイトルを入れ、CREATE NEW BROADCASTをクリックします。するとSTREAM KEY欄にキーが発行されますので、INSTAGRAM RTMPS SERVERとSTREAM KEYをOBSの設定⇨配信に入力すれば準備は完了。

あとはOBSの画面を操作して配信を続けましょう。
Dockefileの基本書式

Dockerfileで使う基本書式について、簡単にまとめました。
Dockerfileは、`docker build`コマンドで、Dockerイメージをビルドするためのテキストファイルです。

# 基本記述書式

|書式 |説明 |
|:--|:--|
|FROM \<image>   |Docker imageのベースとなるDocker imageを指定。サイズが大きくなりすぎないように、必要最低限のを指定するといい。Linux例：[ubuntu:latest](https://hub.docker.com/_/ubuntu)、[alpine:latest](https://hub.docker.com/_/alpine)   |
|RUN \<command>   |コマンドを実行。よく使うコマンド：apt-get update && apt-get install -y   |
|CMD ["executable", "param1", "param2", ...]   |コンテナを実行したときのデフォルトコマンド   |

# その他書式

|書式 |説明 |
|:--|:--|
|COPY   |ファイルやフォルダをコピーする場合   |
|ADD   |tarの圧縮ファイルをコピーして解凍するする場合   |
|ENTRYPOINT   |CMDと似ている。runで実行するときに、デフォルトコマンドを上書きされたなく場合に使う。   |
|ENV   |環境変数を設定する   |
|WORKDIR   |Dockerfileに記述された内容を実行するディレクトリを変更する。anacondaをインストールする場合にroot直下ではなく、/opt/anaconda3にインストールしたり。   |

# 参考：公式ドキュメント
[Dockerfile リファレンス（日本語）](http://docs.docker.jp/v17.06/engine/reference/builder.html)
[Dockerfile reference（英語）](https://docs.docker.com/engine/reference/builder/)
github-push-action@masterのデフォルトブランチがmainに変更された

## ad-m/github-push-action@masterとは

[ad-m/github-push-action: GitHub actions to push back to repository eg. updated code](https://github.com/ad-m/github-push-action)<br>

- リモートリポジトリに変更点をPushをするGithub Actionsである。
- GitHub Actionsで何かの処理をしたときリポジトリに変更が加わった場合、自動でPushさせることができる。

以前までPushするbranchのデフォルトが**master**だったが、**main**に変更されたのでymlファイルも以下のように変更した。<br>

```yaml:action.yml
on:
  push:
    branches:
      - main # 修正

#snip...

    - name: Push changes
      uses: ad-m/github-push-action@master
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        branch: main # 追記(デフォルトがmasterからmainになった)
```

- デフォルトのbranchは**main**であるが、今後変更される可能性があるので明示的に書いておく
- まだmaster branchを使用している人は`branch: master`と修正すれば良い
名前入力機能をつくる

名前を入力する機能を作っていこうと思います。
ただし、名前以外のピリオドやスペースが入っている場合にはエラーを表示させます。

include?メソッドを使って考えていきたいと思います。
include?メソッドは指定した要素が、配列や文字列内に含まれているかを判定するメソッドです。
参考：
[Ruby 3.0.0 リファレンスマニュアル, include?](https://docs.ruby-lang.org/ja/latest/method/Array/i/include=3f.html)

例)

```ruby
array = ["foo", "bar"]
puts array.include?("bar")
# => true
puts array.include?("hoge")
# => false
```

名前がしっかりと登録できるか調べるメソッドを作りたいので、メソッド名はcheck_nameとします。

出力例は

```bash
名前を入力してください(例)SuzukiIchiro

SuzukiIchiro(入力した名前)
→ 登録が完了しました
Suzuki.Ichiro(入力した名前)
→!エラー!記号は登録できません
Suzuki Ichiro(入力した名前)
→!エラー!スペースは登録できません
```

このように出力されるようにしていきます。

初めに、入力してもらうための案内と文字を入力するためのメソッドを使用します。

```ruby
puts "名前を入力してください(例)SuzukiIchiro"
str = gets
```

getsメソッドを使用して、str = getsとすることでターミナルで入力した名前がstrに代入されます。

次にcheck_nameメソッドを作成して、それを呼び出す記述を行います。

```ruby
def check_name(str)

end
puts "名前を入力してください(例)SuzukiIchiro"
str_1 = gets
check_name(str_1)
```

check_name(str_1)の実引数(str_1)には、getsメソッドで入力された名前がセットされています。
check_nameメソッドを呼び出すと同時実引数にセットされている値が仮引数(str)に受け渡されます。

最後にcheck_nameメソッド内の処理を記述していきます。
条件分岐とinclude?メソッドをを組み合わせて記述をしていきます。

```ruby
def check_name(str)
  if str.include?(".")
    puts "!エラー!記号は登録できません"
  elsif str.include?(" ")
    puts "!エラー!スペースは登録できません"
  else
  puts "登録が完了しました"
  end
end

puts "名前を入力してください(例)SuzukiIchiro"
str_1 = gets
check_name(str_1)
```

if文は条件が当てはまった時点で処理が終了するため、先にピリオドやスペースがあるかという条件式を先に記述をしていきます。

これで条件つきの名前入力機能が作成できました。
githubのコマンド覚書

**リモートレポジトリのブランチの削除**

```
git push -d origin 'ブランチ名'
```

originはリモートレポジトリにつけたショートカット名
デフォルトのブランチは削除できない(例えばmaster)
ローカルのどこのワークツリーにいてもこのコマンドは使用できる
例えばローカルのmasterにいてもリモートのbranchを削除可能

**ローカルレポジトリのブランチの削除**

```
git branch -d 'ブランチ名'
git branch -D 'ブランチ名' //強制削除
```

**ローカルレポジトリに残されたリモートレポジトリのポインタの削除**
あの赤文字のやつでもう使っていないやつ

```
git fetch -p
```

**rebaseについて**
分岐ブランチ側からマスターブランチに対してrebaseする

```
git checkout feature
git rebase master
```
GitHubにプッシュしたコミットをリベースしてはいけない。
リベースとはコミットの順番をきれいにすることをする。順番の整列。
ローカルとリモートのコミットの順番が合わなくなるのでプッシュできなくなる。

**rebaseとmerge**
プッシュした後はmergeする
プッシュしていないならreabaseをする

**pullにもmerge型とrebase型がある**

```
git pull --rebase origin master 　//rebase型でpulldeできる。マージコミットが残らない

#初期設定でrebase型でプルできるようにする
git config --global pull.rebase true
#マスターブランチのみrebase型でプルできるようにする
git config branch.master.rebase true
```
深層学習ライブラリKerasの学習済みモデルVGG16を使ってみた

ディープラーニング（深層学習）の勉強のためモデルを自作してみましたが、残念ながらうまくいきませんでした。学習済みモデルを利用するだけならなんとかできたので、その際知り得た知識をメモとして残します。

#プログラム

今回作成したプログラムを下に記載します。このプログラムは与えた画像が何であるかを1000種類の中から識別するものです。

```python:vgg16.py
import sys
import numpy as np
from keras.preprocessing.image import load_img,img_to_array 
from keras.applications.vgg16 import VGG16,preprocess_input,decode_predictions

image_data = load_img(sys.argv[1],target_size=(224,224))
array_data = img_to_array(image_data)
array_data = np.array([array_data])
array_data = preprocess_input(array_data)
model = VGG16()
results = model.predict(array_data)
print(decode_predictions(results))
```

###プログラムの説明

Kerasには学習済みモデルをダウンロードする機能があるので、今回はそれを使い学習済みモデルVGG16をダウンロードして使用します。

* 画像を読み込む

下の部分で画像を読み込んでいます。VGG16に取り込める画像サイズは224×224のみなので、読み込みの際にリサイズしています。

```python:
image_data = load_img(sys.argv[1],target_size=(224,224))
```

* 画像をRGB形式に変換する

VGG16が対応しているデータ形式はRGBのため、jpeg画像などはそのままでは取り込めません。そのため`img_to_array`を使って画像をRGBの配列(224,224,3)に変換しています。また、Kerasの識別プログラム`predict`は1枚づつ識別するのではなく複数枚をまとめて識別するため入力データの形式は4階層の配列になっています。今回は1枚しか識別しない仕様なので`np.array`を使って4階層に変換しています。

```python:
array_data = img_to_array(image_data)
array_data = np.array([array_data])      #(224,224,3) -> (1,224,224,3)
```

* 画像を識別する

下の部分で画像を識別しています。`preprocess_input`はVGG16に入れるための前処理を行っています。`VGG16()`で学習済みモデルを読み込み、`predict`で識別をしています。

```python:
array_data = preprocess_input(array_data)
model = VGG16()
results = model.predict(array_data)
```

* 識別結果を見やすくする

`predict`で識別した結果はただの数値の羅列であるため、これを見ても何に識別されたのかわかりません。そのため、文字に変換したり確率の高い順番に並べ替えたりしてから画面出力をしています。

```python:
print(decode_predictions(results))
```

#使用方法と実行結果

下のコマンドで実行できます。（学習済みモデルを読み込むのには相当な時間がかかります。）

```console:
$ python3 vgg16.py dog.jpg     #dog.jpgという画像を識別させる
...
...
[[('n02113023', 'Pembroke', 0.41220817), ('n02115641', 'dingo', 0.29989296), ('n02113186', 'Cardigan', 0.06258105), ('n02085620', 'Chihuahua', 0.048699833), ('n02094258', 'Norwich_terrier', 0.03338512)]]
```

結果はリスト形式で出力されます。上の例では41%の確率で`pembroke`と識別されています。確率の高い順で5つまでの候補が出ています。

#さいごに

ラズパイ上でリアルタイムな画像識別をしたかったのですが、ラズパイにKerasのインストールができていないので成功していません。諦めずに頑張ろうと思います。また自分で学習用データを準備したり、モデルを学習させることができるように、今後も勉強を続けます。
【備忘録】ショートサーキット評価【TypeScript】

# ショートサーキット評価

TypeScript,JavaScript 初学者が関数の**ショートサーキット評価**について勉強したのでメモを残す。

## ショートサーキット評価（短絡評価）

- `&&`や`||`、`!`などの論理演算子を利用する

OR 演算子`||`は**左辺が falsy な値の場合、評価は右辺に渡される**

```typescript
const hoge = undefined || null || 0 || NaN || "" || "hoge";
```

- `undefined`と`null`、`0`、`NaN`、`''`はすべで`falsy`なので一番右の`hoge`が左辺に代入される
- **初期化を動的に行う際に便利**

AND 演算子`&&`は**左辺が truthy な値の場合、評価が右辺に渡される**

```typescript
const bar = " " && 100 && [] && {} && "bar";
```

if 文の代わりに使うこともできる

```typescript
false && console.log("Hello"); //  (false)
true && console.log("Hello"); //  Hello
false || console.log("Hello"); //  Hello
```

## Nullish Coalescing（??）と Optional Chaining（?.）

```typescript
const sampleObjects = [
  {
    name: "yasushi",
    age: 27,
  },
  {
    name: "koYasushi,",
  },
  null,
];

for (sample of sampleObjects) {
  const sampleObject = sample ?? { name: "(no name)" };
  const age = sampleObject?.age ?? "( no age )";
  console.log(`${sampleObject.name} is ${age} years old.`);
}
//  yasushi is 27 years old.
//  koYasushi, is ( no age ) years old.
//  (no name) is ( no age ) years old.
```

### Nullish Coalescing（??）

- `??`(nullish coalescing)は**左辺が null または undefined**の時に右辺が評価される
- `||`(OR 演算子)と異なり、**0 や空文字のような falsy な値はそのまま評価される**

### Optional Chaining（?.）

- `?.`演算子を使うと、参照が正しいかどうかを明示的に確認せずアクセスできる
- 今まで`if文`で書いていたエラー処理などが１行で書けるようになる

### ショートサーキット評価のまとめ

- OR 演算子`||`は**左辺が falsy な値の場合、評価は右辺に渡される**
- AND 演算子`&&`は**左辺が truthy な値の場合、評価が右辺に渡される**
- `??`(nullish coalescing)は**左辺が null または undefined の時に右辺が評価される**

# 参考

- [りあクト！ TypeScript で始めるつらくない React 開発 第 3 版【Ⅰ. 言語・環境編】](https://booth.pm/ja/items/2368045)

_何か指摘等ございましたら、コメントでお願いいたします。_
Gemfile　Gemfile.lockについて

<h1>Gemfile</h1>
Gemfile（インストールしたいgemを定義）→ bundle installコマンド実行
→　gem インストール

<h1>Gemfile.lock</h1>
Gemfile（インストールしたいgemを定義）→ bundle installコマンド実行
→　gem インストール→ <font color="Red">インストールしたgemがGemfile.lockに記載される</font>
manimの作法 その3

#概要

manimの作法、調べてみた。
BarChart、使ってみた。

#サンプルコード

```
from manimlib.imports import *

class test(Scene):
	def construct(self):
		values = list([0.1, 0.5, 0.7, 0.3])
		names = list(range(4))
		chart = BarChart(values, bar_names = names)
		self.add(chart)
		self.wait()

```

#結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ab84f96e-e52c-e994-8f01-becaf676c560.png)


以上。
『ROS Noetic』のインストール

# 概要
題名の通り、『ROS Noetic の環境構築』を行います。
KineticやMelodicの環境構築は公式サイトや色んなページで紹介されているのですが、Noeticに関しては『これだ！！』ってなるページが見当たらなかったので記載しておきます。  

基本的には、公式サイトのインストール手順をなぞります。
[公式のNoeticインストール手順サイト](http://wiki.ros.org/noetic/Installation/Ubuntu)
ただし、公式のページに記載されている手順は最後まで書かれていないので、その点を補足して記載します。
(Melodicまではちゃんと最後まで書いているのに、なんで改悪しちゃったんだろう…)

# インストール環境
- Raspberry Pi 4 (4GB)
- Ubuntu server 20.04LTS (64bit)

今回は『RaspberryPi』を使用するが、Intel や AMD のCPUでも問題なくインストールできる(はず)。  

またOSには『Ubuntu server 20.04LTS 64bit』を選択。32bit版 や Ubuntu Desktop でも問題なくインストールできる(はず)。
ご存じの通り、UbuntuのバージョンとROSのバージョンを合わせる必要がある。
『ROS Noetic』をインストールするなら、『Ubunutu 20.04』を選択すること！！

# インストールコマンド
下記のコマンドを順番に実行していけば、最後までインストールできます。

## 1. sources.listを設定
```
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```

## 2. 鍵の設定
```
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
```

## 3. Ubuntu をアップデート
```
sudo apt update
```

## 4. インストール
```
sudo apt install ros-noetic-desktop-full
```

## 5. 環境設定
```
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

## 6. rosinstallの準備
```
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
```

## 7. rosdepの初期化
```
sudo rosdep init
rosdep update
```

## 8. ROSのワークスペースを作成、ビルド
```
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
```

## 9. ワークスペースのオーバーレイ  
```
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

下記コマンドでpathが通っていればOK。  

```
echo $ROS_PACKAGE_PATH
⇒ /home/<username>/catkin_ws/src:/opt/ros/noetic/share
```

## 10. インストールの確認
```
roscore
```

下記のようにエラー無く表示できればOK。

```
<username>@ubuntu:~$ roscore
... logging to /home/<username>/.ros/log/3da110c6-4d4c-11eb-b763-f9ecf65ee99d/roslaunch-ubuntu-20827.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

invalid ROS_IP (must be a valid IPv4 or IPv6 address)
invalid ROS_IP (must be a valid IPv4 or IPv6 address)
invalid ROS_IP (must be a valid IPv4 or IPv6 address)
started roslaunch server http://master:33043/
ros_comm version 1.15.9


SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.15.9

NODES

auto-starting new master
process[master]: started with pid [20835]
invalid ROS_IP (must be a valid IPv4 or IPv6 address)
invalid ROS_IP (must be a valid IPv4 or IPv6 address)
ROS_MASTER_URI=http://master:11311/

setting /run_id to 3da110c6-4d4c-11eb-b763-f9ecf65ee99d
process[rosout-1]: started with pid [20845]
started core service [/rosout]
```

# 参考ページ
http://wiki.ros.org/noetic/Installation/Ubuntu
http://wiki.ros.org/noetic/Installation/Source
https://choreonoid.org/ja/manuals/latest/ros/install-ros.html
https://qiita.com/oguashiii/items/f23f2d25531c9311e614
配列から値を取得して何番目に含まれているかを調べる

配列に、

```ruby
input = [1, 3, 5, 6, 10, 14, 17, 21, 27, 33, 39, 41, 48]
```

が含まれていています。serchメソッドを使用することでその値が何番目に含まれているか結果を返すことができます。
例)

```ruby
search(17, input)
#処理の結果
#=> 6番目にあります

search(1, input)
#処理の結果
#=> その数は含まれていません
```

使用例はこのような感じです。


このsearchメソッドをeach_with_indexメソッドを使って作成してみたいと思います。
each_with_indexメソッドはRubyに標準で組み込まれているメソッドで、要素の繰り返しと同時に、その要素が何番目に処理されたのかも表すことができます。
参考：
[Ruby 3.0.0リファレンスマニュアル, each_with_index](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/each_with_index.html)


例)

```ruby
fruits = ["イチゴ","みかん"."ぶどう"]

fruits.each_with_index do |item, i|
  puts "#{i}番目のフルーツは、#{item}です。"
end

#出力結果

#0番目のフルーツは、メロンです。
#1番目のフルーツは、バナナです。
#2番目のフルーツは、アップルです。
```

このように使うことができます。

それでは、本題に入っていきたいと思います。
まず、searchメソッドを呼び出す方法を考えたいきたいと思います。
配列を定義して、呼び出す時に何か数字を実引数としてセットしてみます。今回は17という値をセットしたいと思います。

```ruby
def search(target_num, input)

end

input = [1, 3, 5, 6, 10, 14, 17, 21, 27, 33, 39, 41, 48]
search(17, input)
```

search(17, input)で呼び出されたsearchメソッドでは、実引数でセットした値を仮引数(target_num, input)で受け取ります。
今回はtarget_numが17を受け取り, inputがinput(中身は配列が代入されています)を受け取っています。

次にsearchメソッド内の処理を考えていきたいと思います。
each_with_indexメソッドを使用して、配列の中身を一つ一つ取り出し、要素ごとに割り当てられている添字を同時に取得します。


```ruby
def search(target_num, input)

  input.each_with_index do|num, index|
  end
end
```

最後に条件分岐処理を利用して配列の中にある値とそうでないときの処理を記述していきます。
合わせると以下のような記述になります。

```ruby
def search(target_num, input)
  input.each_with_index do |num, index|
    if num == target_num
      puts "#{index +1}番目にあります"
      return
    end
  end
  puts "その数は含まれていません" 
end

input = [1, 3, 5, 6, 10, 14, 17, 21, 27, 33, 39, 41, 48]
search(17, input)
```

num と target_numが等しい時にputs "#{index +1}番目にあります"と出力してあげるようにします。なぜindex +1としているかというと、プログラムは0から数えていくためです。

人間のは基本的に1から数えていくため、プログラムの数え方の誤差を埋めるためにindex +1としています。
Dockerfileについて

<h1>Dockerfile</h1>
dockerfileはdockerの新しいイメージを作成する際に使用するもので
この設定ファイルにはrailsアプリケーション実行に必要なファイルやパッケージを
イメージに含めるための定義が書かれている。


```Dockerfile.
1 FROM ruby:2.4.5
2 RUN apt-get update -qq && apt-get install -y build-essential nodejs
3 RUN mkdir /app
4 WORKDIR /app
5 COPY Gemfile /app/Gemfile
6 COPY Gemfile.lock /app/Gemfile.lock
7 RUN bundle install
8 COPY . /app
```
1 :から前の部分をリポジトリとよぶ。:から後の部分をタグという。
　この場合rubyリポジトリの2.4.5タグを示している。

2 ruby 2.4.5のイメージからコンテナを起動してコンテナ内で実行するコマンドを定義している
   ubuntuのパッケージ管理システムであるapt-getでbuild-essential nodejsをインストールしてる
   Railsの動作に必要

3 ルートディレクトリにappディレクトリを作成

4 作業用ディレクトリをappディレクトリに移動

5,6 PC上にあるGemfileとGemfilelockをappディレクトリにコピー

７　gemのインストールコマンドを実行

8 dockerファイルの置いてあるフォルダの内容を全ての内容をappディレクトリにコピー

dockerfile→build→dockerimageが作成される
Ruby on Rails 基礎学習 ①

<h1>まず開発環境について</h1>
**dockerを使うメリット**
実際の現場では,Dockerを仮想環境として使っているのがほとんど。
dockerは起動スピードが早い。
AWSにはコンテナを実行するサービスがあるためサービスの公開が容易。

<h1>dockerを使用した開発環境</h1>
dockerをインストールすると軽量なリナックス（Moby Linux）がインストールされる。
dockerでrubyのコンテナを立ち上げるとMoby Linux上でRubyの実行環境コンテナが立ち上がる。
コンテナの基になるものをimageという。
Nuxt.js+Vuetify で 画像が表示できない時に固定の画像を出す方法

# はじめに

最近Nuxt.js を触り始めて、Typescript までたどり着くことを目標に学習始めました。

# やりたいこと

あるページで、サーバから指定された画像を表示しますが、それが存在しない時はフロントサイドで持っている情報で固定画像を表示したいです。

# 試したやりかた

```javascript:page.vue
<img :src="response.img" @error="errImg">
...
methods:
  errImg(event) {
    event.target.src = 'no_image.jpg' // static/no_image.jpg に正しく表示できる画像ファイルがある
  } 
```

# このやり方だと。。。

404 エラーの時に、error が発火しない。

- `response.img=存在しない画像` の場合、no_mage.jpg　が表示されました
- `http://example.com/test.jpg` の場合には何も表示されませんでした
   - `errImg()` に、`console.log()` を仕込んだけど何も出力されませんでした

参考：https://ja.stackoverflow.com/questions/66720/nuxt-js%E3%81%A7%E7%94%BB%E5%83%8F%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E6%99%82%E3%81%AB404%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E9%9A%9B%E3%81%AB%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AB%E5%B7%AE%E3%81%97%E6%9B%BF%E3%81%88%E3%81%9F%E3%81%84

# 解決策

```javascript:page2.vue
<v-img :src="showImage(response)" @error="errorImage">
...
data() {
  return {
    isImgFailed: false
  }
},
methods:
  showImage(response) {
    return this.isImgFailed ? 'no_image.jpg' : response.img
  },
  onImgError() {
    this.isImgFailed = true
  }
```

参考：https://stackoverflow.com/questions/53215071/how-to-do-a-fallback-img-in-v-img-in-vuetify
manimの作法

#概要

manimの作法、調べてみた。
GraphScene、使ってみた。

#サンプルコード

```
from manimlib.imports import *

class test(GraphScene):
	CONFIG = {
		"x_min": -4,
		"x_max": 4,
		"y_min": -2,
		"y_max": 2,
		"graph_origin": ORIGIN,
		"function_color": WHITE,
		"axes_color": BLUE
	}
	def construct(self):
		self.setup_axes(animate = True)
		func_graph = self.get_graph(lambda x: np.cos(x), color = WHITE)
		graph_title = TextMobject("input")
		graph_title.scale(1.5)
		graph_title.to_corner(UP + LEFT)
		func_graph_2 = self.get_graph(lambda x: np.sin(100 * x), color = GREEN)
		graph_title_2 = TextMobject("carrier")
		graph_title_2.scale(1.5)
		graph_title_2.to_corner(UP + LEFT)
		func_graph_3 = self.get_graph(lambda x: (np.cos(x) + 1.0) / 2 * np.sin(100 * x), color = YELLOW)
		graph_title_3 = TextMobject("output")
		graph_title_3.scale(1.5)
		graph_title_3.to_corner(UP + LEFT)
		self.play(ShowCreation(func_graph))
		self.add(graph_title)
		self.wait(1)
		self.remove(func_graph)
		self.play(FadeOut(graph_title))
		self.play(ShowCreation(func_graph_2))
		self.add(graph_title_2)
		self.wait(1)
		self.remove(func_graph_2)
		self.play(FadeOut(graph_title_2))
		self.play(ShowCreation(func_graph_3))
		self.add(graph_title_3)
		self.wait(1)


```

#生成した動画

https://www.youtube.com/watch?v=rBfhG_S5bp4

以上。
ABC187 C問題 with python

##[ABC187 C問題1-SAT](https://atcoder.jp/contests/abc187/editorial/485)

###正答
```
N = int(input())
S = set(input() for i in range(N))
for s in S:
    if "!" + s in S:
        print(s)
        exit()
print("satisfiable")
```

###ポイント
x in listは計算量オーダーO(N)だが
x in setは計算量オーダーO(1)となることを利用すると簡単に溶ける。
理由はset型のデータは各値をハッシュ関数という関数に入れて出てきた値を結び付けているかららしい。
以下の記事がわかりやすかったのでリンクを貼っておく
####[ハッシュテーブル(Hash Table)を簡単に理解しよう](https://qiita.com/tenten1010/items/da4084f937ad07e70164)
上の記事を参考にしてx in setが内部でどのような動きをしているかわかりやすく例を挙げる。
set={23,7,11,4,10}の要素に9が含まれるかどうか考える。
ここでhash(x)=x%5なるハッシュ関数を考えると
hash(23)=3,hash(7)=2,hash(11)=1,hash(4)=4,hash(10)=0となるので
メモリの0番地に10を,１番地に11を,2番地に7を,3番地に23を,4番地に4を格納する。

ここでhash(9)=4なので4番地のメモリに入ってる数を確かめる。
結果、入っていた数は4であり、9ではないのでsetに9は含まれないことがわかる。

以上の例でリストだと1番地から4番地までの全てで値を確認しなければならなかったのがsetを使うことで4番地だけ確認するだけで済んだことがわかる。

###一言
今回のコンテストでこの問題につまづいて40分程度溶かしてしまった。
こんな問題知識がなければ解けるはずもないのでとっとと切りあげればよかった。
閃き系の問題なら時間かけることで解けるかもしれないが、知識問題だとどうしても無理だ。
かといって今解いてる問題が知識問題なのか閃き問題なのかはわからないので次からは30分悩んでもできなかったら飛ばして次の問題に行くことにしよう。
【Delphi】FireMonkey の TMediaPlayer で低解像度動画をアップスケールする

# はじめに

FireMonkey の TMediaPlayer で低解像度の動画を再生しようとすると、画面の中央に小さく表示されてしまいます。高解像度の動画を再生した時には縮小されますが、拡大はされないようです。

**See also:**

 - [RSP-15297 TMediaPLayer STILL CANNOT RESIZE AFTER 5 YEARS !!!! (Quality Portal)](https://quality.embarcadero.com/browse/RSP-15297)

# 解決方法

Stackoverflow に回避策が提示されています。

 - [TMediaPlayerControl Video Size (Stackoverflow)](https://stackoverflow.com/questions/12738567/tmediaplayercontrol-video-size)

ちょっと解りにくいですが、つまりはこういう事です (Windows の場合):

　1. 自分のプロジェクトに `FMX.Media.Win.pas` をコピーしてくる。
　2. `TWindowsMedia` クラスの `UpdateMediaFromControl` メソッドを書き換える。
　3. プロジェクトを再コンパイル。

**10.4 Sydney** の場合、`UpdateMediaFromControl` メソッドは次のようになるかと思います。

```pascal:FMX.Media.Win.pas
procedure TWindowsMedia.UpdateMediaFromControl;
var
  P: TPointF;
  R: TRect;
  Bounds: TRectF;
  Form: TCommonCustomForm;
  BoundsInt: TRect;

  { ADD begin }
  // this is just an updated version of TRecF.Fit to support scaling up
  function MyRectFit(var R: TRectF; const BoundsRect: TRectF): Single;
  var
    ratio: Single;
  begin
    Result := 1;
    if BoundsRect.Width * BoundsRect.Height = 0 then
      Exit;
    if (R.Width / BoundsRect.Width) > (R.Height / BoundsRect.Height) then
      ratio := R.Width / BoundsRect.Width
    else
      ratio := R.Height / BoundsRect.Height;
    // UPDATED
    R := RectF(0, 0, R.Width / ratio, R.Height / ratio);
    Result := ratio;
    RectCenter(R, BoundsRect);
  end;
  { ADD end }

begin
  if FWnd = 0 then
    Exit;

  if (Control <> nil) and not (csDesigning in Control.ComponentState) and (Control.ParentedVisible) and
     (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then
  begin
    Form := TCommonCustomForm(Control.Root.GetObject);
    P := GetVideoSize;
    Bounds := TRectF.Create(0, 0, P.X, P.Y);
//  Bounds.Fit(TRectF.Create(0, 0, Control.AbsoluteWidth, Control.AbsoluteHeight)); // MOD
    MyRectFit(Bounds, RectF(0, 0, Control.AbsoluteWidth, Control.AbsoluteHeight));  // MOD
    Bounds.Offset(Control.AbsoluteRect.Left, Control.AbsoluteRect.Top);
    SetParent(FWnd, WindowHandleToPlatform(Form.Handle).Wnd);

    BoundsInt := Bounds.Round;
    SetWindowPos(FWnd, 0, BoundsInt.Left, BoundsInt.Top, BoundsInt.Width, BoundsInt.Height, 0);

    R := TRect.Create(0, 0, BoundsInt.Width, BoundsInt.Height);
    if FVMRWindowlessControl9 <> nil then
      FVMRWindowlessControl9.SetVideoPosition(nil, @R);
    if FVMRWindowlessControl7 <> nil then
      FVMRWindowlessControl7.SetVideoPosition(nil, @R);
    ShowWindow(FWnd, SW_SHOW)
  end
  else
  begin
    SetParent(FWnd, ApplicationHWND);
    ShowWindow(FWnd, SW_HIDE)
  end;
end;
```


# おわりに
確かにストレッチのプロパティくらいはあってもよさそうです。
JavaScriptでは配列はオブジェクト

# 配列はオブジェクト

JavaScriptでは、配列はオブジェクトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/88755342-62c1-0a8f-9089-95b40490ccd0.png)

arr[0] とすると 'a' が取り出せますが、これはプロパティ '0' の値が 'a' ということです。
だから arr['0'] でも同じように 'a' が取り出せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/92f2d3dc-d786-419b-9c90-3cd5e7bc026b.png)

こんなこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/3e3fd4e6-873b-7ef1-e22f-2ba47134b54c.png)
`key: "value"`は`arr[3]`ではありません。`arr['key']`です。



# 配列をカンマ区切りの文字列に変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/0c32b547-9619-2e09-bfdf-dc0bec879b0c.png)
まぁjoin()使えばいいんですけどね。


以上です。