OmniAICreator/Qiita-1.07M huggingface dataset:
「ピントの合う」立体映像について調べてみた

# what's this
この記事は個人的に気になるニュースについて調べてその内容をまとめてみようと思います．公開記事にした理由としては，自身のまとめた内容についてさらなる情報や情報の訂正などをいただけるチャンスを増やすためです．最終的に自身が扱っているmagicleapというデバイスに還元できないかなと考えています．

随時更新してきますので温かい目で見ていただけると幸いです．

# 気になった記事とは
https://www.moguravr.com/creal/

これです．リンク切れになったときのために自分が気になった部分をピックアップしてみます．

>ライトフィールドディスプレイ技術では、VR内の対象との距離に合わせて焦点を変更可能

「ピントの合う」感覚ってつまりは焦点に合わせてぼかしエフェクトをかけるということだと思うのですが，これが難しいんです.  私の知識では，

1. 映像を認識する
1. ぼかし処理をかける（平滑フィルタ，ガウシアンフィルタ等？）
1. 処理をした画像を表示する

という工程が必要になると考えています．したがって視界全体に映像を表示するVRでは実現できるかもしれませんが，現実空間の一部に映像を表示するARでは実現が難しいのではないかと考えています．この技術がmagicleapでも実現することができればとても楽しいことになる予感がするので詳しいことを調べていきたいと考えています．

# 「ピントの合う」＝ライトフィールド技術
今回の目玉となっている「ピントの合う」技術はライトフィールド技術という名前のようです．具体的にはどのような技術でしょうか．

### ピントの合う=輻輳+調節
実際の人間の目がピントを合わせるときは2つの動作が起きています．1つ目は「輻輳」，これは2つの目の向きを調節してピントを合わせます．対象が近いほど寄り目に，遠いほど離れ目になります．
<img src="https://www.moguravr.com/wp-content/uploads/2017/05/image5-2.png" width="40%"><img src="https://www.moguravr.com/wp-content/uploads/2017/05/image4-2.png"width="40%">
調整とは眼球の水晶体の厚みを変化させる動作です．「視力が低下する」のはこの機能がうまくできていないことが原因でしょうか（根拠は調べていません）．
### ライトフィールド技術とは
ライトフィールド技術はどのような動作をしているのでしょうか．[この記事](https://www.moguravr.com/transray-light-field/)では次のように書いています．
> ライトフィールド：3次元空間における視覚情報を、空間中を伝わる光線の情報として再現したもの。光線空間とも呼ばれる。

わかりそうでわからない表現．もっと噛み砕いて書いてみましょう．この技術の理解のポイントは何を再現するかということにあります．一般的なVRと比較して考えてみましょう．

#### 一般的なVRディスプレイ
VRディスプレイは視点を再現する技術です．左右2つの視点から見える画像を用意して人間の脳内で立体的に認識させる技術です．
<img src="https://cdn.tsukumo.co.jp/static/img/virtualreality/virtualreality-01.png"width="40%">

#### ライトフィールドディスプレイ
ライトフィールドディスプレイは物体から反射した光を再現する技術です．実際の風景を観測者が見るとき、位置が変わると観測者の目に入る光も変わります．物体から反射した光を再現することでこの現象を再現する事ができ，裸眼でも自由な距離から立体映像を実現することができます．

### 「ピントの合う」技術をどうやって実現しているのか

# 参考にしたもの

1. [VR・ARデバイス向け新技術 「ピントの合う」さらにリアルな体験へ](https://www.moguravr.com/creal/)
1. [ライトフィールドディスプレイのCREAL、ピントの合うVR/ARデバイスのプロトタイプ発表](https://www.moguravr.com/creal-headset-prototype/)
1. [未来のAR/VRヘッドセットは視点に追従して焦点を合わせるライトフィールド技術が本命か](https://jp.techcrunch.com/2020/03/25/2020-03-24-swiss-startup-creal-is-building-display-tech-for-the-next-generation-of-ar-vr-headsets/)
1. [輻輳と調節](https://www.moguravr.com/terms/index-h/congestion-and-adjustment/)
1. [凸版印刷、ライトフィールド技術活用のVRHMD開発](https://www.moguravr.com/transray-light-field/)
1. [VRとは？
仕組みや体験方法を具体的に解説します](https://shop.tsukumo.co.jp/features/virtualreality/#:~:text=VR%E3%81%A8%E3%81%AF%E3%80%81%E8%87%AA%E5%88%86%E3%81%AE,%E6%84%9F%E3%81%98%E3%82%89%E3%82%8C%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82&text=%E3%81%9D%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E8%87%AA%E5%88%86%E8%87%AA%E8%BA%AB%E3%81%8C%E3%81%82%E3%81%9F%E3%81%8B%E3%82%82,%E3%81%9F%E3%82%8A%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
1. [最新技術キーワード解説　知っておきたい最新の動き【ライトフィールドディスプレイ】](http://tm-lab.a.la9.jp/useful/ekeyword_20-01.pdf)
LeetCode日本語修行1日目- [208- トライ木の実現]

早速、今日の日課を確認しましょう

## 208:トライ木の実現
参考:https://leetcode-cn.com/problems/implement-trie-prefix-tree
###### トライ木について
トライ木（英: trie）やプレフィックス木（英: prefix tree）とは、順序付き木の一種。あるノードの配下の全ノードは、自身に対応する文字列に共通するプレフィックス（接頭部）があり、ルート（根）には空の文字列が対応している。値は一般に全ノードに対応して存在するわけではなく、末端ノードや一部の中間ノードだけがキーに対応した値を格納している。2分探索木と異なり、各ノードに個々のキーが格納されるのではなく、木構造上のノードの位置とキーが対応している。
参考:https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%82%A4_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)

#### 問題の内容
以下のメソッドを実装
ー　Trie()　トライ木を初期化します。
ー　void insert(String word) トライ木に文字列を挿入する word 。
ー　boolean search(String word) 文字列wordがトライ木にある場合、trueに戻ります。す検索前に既に挿入されました。そうでなければfalseに戻ります。
ー　boolean startsWith(String prefix) 前に挿入した文字列ワードのプレフィックスの一つがprefixである場合、trueに戻ります。そうでなければfalseに戻ります。

######例:

入力
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
出力
[null, null, true, false, true, null, true]

######説明
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True

######ヒント:

1<=word.lengthを選択します。prefix.length<=2000

ワードとprefixは小文字だけで構成されています。

insert、search、starts Withの呼び出し回数は合計3*104回を超えません。

---
さて、実装を始めましょう。
実際内容から見ると、文字列が含まれているかどうかを判断することですね。
ですが、普通に　string.contains()を実現すると、本題から逸れる。
順序付き木を使って実装します

```Kotlin
class Trie() {

    class TrieNode{
        var children = arrayOfNulls<TrieNode>(26)
        var isEnd = false

        fun containsKey(ch: Char): Boolean{
            return children[ch - 'a'] != null
        }

        fun get(ch: Char): TrieNode? {
            return children[ch - 'a']
        }

        fun put(ch: Char,node: TrieNode?){
            children[ch - 'a'] = node
        }
    }
    
    /** Initialize your data structure here. */
   private var root: TrieNode = TrieNode()

    /** Inserts a word into the trie. */
   fun insert(word: String) {
        var node: TrieNode? = root
        for(c in word){
            if(!node!!.containsKey(c)){
                node.put(c,TrieNode())
            }
            node = node.get(c)
        }
        node!!.isEnd = true
    }

    private fun searchPrefix(word: String): TrieNode? {
       var node: TrieNode? = root
        for(c in word){
            if(node!!.containsKey(c)){
                node = node.get(c)
            }else{
                return null
            }
        }
        return node
    }

    /** Returns if the word is in the trie. */
    fun search(word: String): Boolean {
        val node = searchPrefix(word)
        return node != null && node.isEnd
    }

    /** Returns if there is any word in the trie that starts with the given prefix. */
    fun startsWith(prefix: String): Boolean {
        val node = searchPrefix(prefix)
        return node != null
    }

}

/**
 * Your Trie object will be instantiated and called as such:
 * var obj = Trie()
 * obj.insert(word)
 * var param_2 = obj.search(word)
 * var param_3 = obj.startsWith(prefix)
 */
```
【swagger】openAPIを導入したのでサンプル作成とそのまとめ

## 概要

openAPIを使ってAPIドキュメントを作成したのでやったことを軽くまとめた。
`Swagger Editor`を使って1つのファイルにまとめて書いてもよかったが、エンドポイント2つの時点で100行超えるのでファイル分は必須だと感じた。

## docker-compose.ymlについて

`/models`に書かれた内容を`swagger.yml`にまとめて`swagger-ui`に表示するようにした。

```
version: "3.3"
services:
  # swagger.yml更新
  swagger-merger:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./models:/models
      - ./open_api.yml:/open_api.yml
      - './swagger.yml:/swagger.yml'
    command:
      # open_api.ymlの`$ref`を全てマージしたものを`swagger.yml`にコピーする
      swagger-merger -i open_api.yml

  # swagger表示
  swagger-ui:
    image: swaggerapi/swagger-ui
    volumes:
      - './swagger.yml:/usr/share/nginx/html/swagger.yml'
    environment:
      API_URL: swagger.yml
    ports:
      - '8080:8080'
    # swagger-mergerでswagger.ymlを更新してから立ち上げる
    depends_on:
      - "swagger-merger"
# コンテナ間でswagger.ymlを共有
volumes:
  swagger.yml:
    driver: local
```

## 詰まったところ

### `swagger-merger`のコマンドを勘違いしていた

`swagger-merger`のコマンドのオプションで`-i`と`-o`がある。
`-i`に`$ref`で省略した元のファイルを書いて、`-o`に`$ref`の中身を書くのかと勘違いしており結構時間がかかってしまった。

`-i`の方に書かれた`$ref`は勝手に展開してくれた。

### dockerのコンテナ間でのファイル共有

シンプルにdockerの経験不足。
今回`depends_on`で他のコンテナの起動を待つことと直下の`volumes`でファイル共有できることを知った。
あまりdockerfileをいじる機会がなかったのでいい勉強になった。

## 追記(2021/04/19)

モックサーバーを立ち上げる記事を書きました。
この記事の続きになってますので宜しければ一読いただけると嬉しいです。

https://qiita.com/d-yamagishi522/items/ba4c62f9a2a0a39ebd5d


## github

https://github.com/d-yamagishi522/sample-openapi
GitHubでPRのDCOチェックがいつまでも通らなかった時の対応ログ

# はじめに

Github上でこれまでちゃんとしたPR(Pull Request)したことなかったので、DCO(Developer Certificate of Origin)チェックで**全てのログにSigned-off-byが必要**という点を理解していなくて、困った時のログです。

# --amend --signoff すればいいんだと思ったものの

プロジェクトのコミッターから、「レビューする前にSigned-off-byを加えて欲しいな。まぁsquashしてもいいかも。」というメッセージが届いたので、PR画面を開いたところ、DCOチェックに失敗していて、その詳細説明には次の手順が書かれていました。

```bash:
## 最初に読めとあったリンク先に、gh prしなさいとあったのでこれを実行
$ gh pr checkout 2084

## DCOのエラー画面には次のコマンドが表示されていた
$ git commit --amend --no-edit --signoff
$ git push --force-with-lease origin 20210413_anonymous_bind

## 20210413_anonymous_bind は自分で作成したbranchの名前
```

直前の変更を取り消してSigned-off-byを加えるのかぁ、と思ってそのまま実行したものの、これを実行してもうまくいかず、気がつけばこんな感じのコミットログになっていました。

```text:PRしたブランチのログ
commit 703c1556176fdf89bf819dd6a0118aabe291caad (HEAD -> 20210413_anonymous_bind, origin/20210413_anonymous_bind)
Merge: 66779fff b79308e9
Author: Yasuhiro ABE <yasu-abe@u-aizu.ac.jp>
Date:   Wed Apr 14 00:15:06 2021 +0900

    Merge branch '20210413_anonymous_bind' of github.com:YasuhiroABE/dex into 20210413_anonymous_bind
    
    Signed-off-by: Yasuhiro ABE <yasu-abe@u-aizu.ac.jp>

commit 66779fffcab1f3663fa57e3bab9d23e01c1f1c30
Author: Yasuhiro ABE <yasu-abe@u-aizu.ac.jp>
Date:   Wed Apr 14 00:02:27 2021 +0900

    add the anonymousBind configuration parameter and to use the UnauthenticatedBind function.
    
    Signed-off-by: Yasuhiro ABE <yasu-abe@u-aizu.ac.jp>

commit b79308e9feda775f8b5e3469894e03a9d2ca704e
Author: Yasuhiro ABE <yasu-abe@u-aizu.ac.jp>
Date:   Wed Apr 14 00:02:27 2021 +0900

    add the anonymousBind configuration parameter and to use the UnauthenticatedBind function.

commit b79d9a84bc0c35e13a9d5141e95b641af0f81c8f (origin/master, origin/HEAD, master)
Merge: c7549cce 03db3093
Author: Márk Sági-Kazár <sagikazarmark@users.noreply.github.com>
Date:   Thu Apr 8 17:50:52 2021 +0200
```

いろいろドキュメントを調べて、この時点で全てのログにsigned-off-byがないといけないのだと知りました。
確かに最初のコミットログ SHA1:b79308e9 にはsigned-off-byがありません。

調べてみると、いくらか不要なコミットを取り消しつつ、signoffするにはいくつか方法があるものの、今回はrebaseがシンプルに思えたので、次の方法を採用しました。

```bash:
$ mkdir dex.signoff
$ rsync -av dex dex.signoff/
$ cd dex.signoff/dex
$ git rebase --signoff HEAD^^
```

実際にはrsyncで作業用ディレクトリ全体のコピーを作成して、問題ないことを確認してからpushしています。

これで SHA1:b79308e9 自体がなくなって、ハッシュ値は新しくなっていますが、冗長なログは消えて、最初のメッセージにSigned-off-byが付いたログになりました。

```text:rebase実行後のログ
commit 6e845f2c90c0b1d200e1e016014970e9cf037c15 (HEAD -> 20210413_anonymous_bind, origin/20210413_anonymous_bind)
Author: Yasuhiro ABE <yasu-abe@u-aizu.ac.jp>
Date:   Wed Apr 14 00:02:27 2021 +0900

    add the anonymousBind configuration parameter and to use the UnauthenticatedBind function.
    
    Signed-off-by: Yasuhiro ABE <yasu-abe@u-aizu.ac.jp>

commit b79d9a84bc0c35e13a9d5141e95b641af0f81c8f (origin/master, origin/HEAD, master)
Merge: c7549cce 03db3093
Author: Márk Sági-Kazár <sagikazarmark@users.noreply.github.com>
Date:   Thu Apr 8 17:50:52 2021 +0200

    Merge pull request #2072 from dexidp/dependency-updates
```

ここから ```$ git push --force-with-lease ...``` を実行して無事にDCOのエラーはなくなりました。

以上
M1 Mac で docker mysql を使う


```shell
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
See 'docker run --help'.
```

- 普通に docker run しようとすると、no matching manifest が発生してしまうので、その時は --platform linux/x86_64 を指定する。

```shell
docker run -d --platform linux/x86_64 --name mysql -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 mysql
```

- この記事によると、別のCPUアーキテクチャのエミュレーションをしているので動いているらしい。

https://www.publickey1.jp/blog/20/apple_m1docker_desktopcpux86docker.html
Rails herokuのエラー：Failed to install gems via Bundler.　の対応

ポートフォリオ作成の際に、詰まったのでメモ
bundle installしても解決しない場合です。

#環境
ruby 2.6.6
Rails 6.0.3

#経緯

```
$ heroku create
```
後に

```
$ git push heroku main
```
そこでエラー発生

```
.
.
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote:
remote:  !     Push failed
.
.
```

#解決方法
エラー文を読むと、bundlerに問題あるとのこと
heroku公式サイトからbundlerの記事を検索してみる。
>Applications specifying Bundler 2.x in their 
>Gemfile.lock will receive bundler: 2.2.15
>Applications specifying Bundler 1.x in their 
>Gemfile.lock will receive bundler: 1.17.3
>Applications with no BUNDLED WITH in their
 >Gemfile.lock will default to bundler: 1.17.3

https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
2021年　４月現在

今のbundlerのversionはいくつかな？

```
$ bundler -v
Bundler version 2.x.xx
```
ふむ、この場合
>Applications specifying Bundler 2.x in their 
>Gemfile.lock will receive bundler: 2.2.15

とあるので、2.2.15にしないといけないらしい。

#bundlerのversionを設定し直す

まずアンインストール

```
$ gem uninstall bundler
```
version指定して再インストール

```
$ gem install bundler --version '2.2.15'
```

gemfile.lockを消去
（あとでbundle installして最新のものを作成）

```
$ rm gemfile.lock
```

version 2.2.15で、bundle install

```
$ bundle _2.2.15_ install
```

git add, commit して再デプロイ

```
$ git push heroku
```

通りました。

これでも、解消しない場合、エラー文をよく読むと

```
.
.
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
.
.
```
とあり、

```
$ bundle lock　--add-platform x86_64-linux
```
で解決することもあるそうです。

#ついで

```
$ heroku create NAME
```
NAME　部分に好き文字を付けることができますが、付けない場合はランダムになります。
もし後からつけたい場合、

```
$ heroku app:rename NAME
```
で簡単に書き換えられます。
Eclipseで作成した既存のSpringBootプロジェクトをVSCodeで実行

###単にフォルダの読み込みだけではだめだったので書き留めます
###環境
Eclipse 2020-12
Spring Boot 2.4.0
java 8
バージョン管理 Git

###やったこと
VSCodeでEclipseで開発したSpringBootのWorkSpace（作業フォルダ）を読み込んだ。
んでRun → Start Debugging

読み込んだときに自動的にWorkSpaceに.vscodeのフォルダが作成され、その中にlaunch.jsonが作成されます。

どうやらそれがVSCodeの実行に必要みたい。

```:lauch.json（初期状態）

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "pwa-chrome", // ここを変えないといけない
            "request": "launch",
            "name": "Launch Chrome against localhost",
            "url": "http://localhost:8080", \\ ここは変えてあるかもしれません
            "webRoot": "${workspaceFolder}"
        }
    ]
}


```
####とりあえず入れたExtensionsたち
なんかjavaとかSpringで検索して出てきたPackになっているやつでいれました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/8de79f13-0f09-7c0c-89b1-716659f24b04.png)



###結果
Chromeが立ち上がるけどだめ

###launch.jsonを修正

```:launch.json（修正版）
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    // java.homeも設定するような記事があったので、インストールしていたものを読み込むようにしました
    "java.home": "C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.9.101-hotspot",
    "configurations": [
        {
            "type": "java", // 結局ここを"java"にすれば良いだけ
            "request": "launch",
            "name": "Launch Chrome against localhost",
            // 他にもかいてあったけど、消しても動きました
        }
    ]
}


```

###他にやったことは？
configをいじった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/bf834d69-4d5d-7f6a-1f24-20a8a441714b.png)

![Settings - MOSRepository - Visual Studio Code 2021-04-14 22.13.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/34ae59d3-85e8-2d1f-6396-8f825e767a22.png)

```:settings.json
{
    "files.exclude": {
        "**/.classpath": true,
        "**/.project": true,
        "**/.settings": true,
        "**/.factorypath": true
    },
    "java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m -javaagent:\"c:\\Users\\yumasky\\.vscode\\extensions\\gabrielbb.vscode-lombok-1.0.1\\server\\lombok.jar\"",
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "spring-boot.ls.java.home": "", // ここにもJDKのパスを入力してたけど、消しても動いた！
    "cloudfoundry-manifest.ls.java.home": ""
}
```


###まだちゃんとわかっているわけではないです。。。

とりあえず調べてた記事の中では基本的にVSCodeで新しくSpringBootのプロジェクトを作成の流れが多く、**最初はEclipseで、途中からVSCodeで**みたいな乗り換えの方法はなかなか見つかりませんでした。

そういう方の参考になればと思います。

また、補足説明できる方、ぜひコメントでよろしくお願いいたしますm(__)m
Galleryのんびり見よう005(Broken Barh) (matplotlib)

#概要
matplotlibのGalleryをのんびり見よう。
私個人に分かりやすいようにまとめたりしながら。

[元ページ](https://matplotlib.org/stable/gallery/index.html#examples-index)
[まとめページ](https://qiita.com/yo314159265/items/e259ff253dbf03d0566d)

#環境
Python 3.7
matplotlib 3.4.1

#内容
##準備
```Python
import matplotlib.pyplot as plt
```

##plot
```Python
fig, ax = plt.subplots()
ax.broken_barh([(110, 30), (150, 10)], (10, 9), facecolors='tab:blue')
ax.broken_barh([(10, 50), (100, 20), (130, 10)], (20, 9),
               facecolors=('tab:orange', 'tab:green', 'tab:red'))
ax.set_ylim(5, 35)
ax.set_xlim(0, 200)
ax.set_xlabel('seconds since start')
ax.set_yticks([15, 25])
ax.set_yticklabels(['Bill', 'Jim'])
ax.grid(True)
ax.annotate('race interrupted', (61, 25),
            xytext=(0.8, 0.9), textcoords='axes fraction',
            arrowprops=dict(facecolor='black', shrink=0.05),
            fontsize=16,
            horizontalalignment='right', verticalalignment='top')

fig.show()
```
- `ax.broken_barh()`については下記蛇足参照。
- `ax.annotate()`についても下記蛇足参照。
- `'tab:blue'`はTableau Colorsのこと。([参考](https://matplotlib.org/stable/tutorials/colors/colors.html))

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/8f637a07-b88d-e677-95cc-ac69cafb6f93.png)

##蛇足
###`ax.broken_barh(xranges, yrange, *, data=None, **kwargs)`
- `xranges`: (xmin, xwidth)`のtuple.
- `yrange`: (ymin, yheight).

###`ax.annotate(text, xy, *args, **kwargs)`
Annotate the point *xy* with *text*.

- `text`: str テキスト
- `xy`: (float, float) アノテートする場所の(x, y)
- `xytext`: (float, float) テキストをおく場所の(x, y)

以下略.

#参考にさせていただいた頁
- https://matplotlib.org/stable/gallery/lines_bars_and_markers/broken_barh.html#sphx-glr-gallery-lines-bars-and-markers-broken-barh-py

#感想
使うと良さそう。

#今後
活用していきたい。
Javascript 備忘録6<反復処理>

■イテレータ
→コードが長くなってしまうので、ジェネレーターを理解するために、このコードも理解しておくこと

```js
function genIterator(max){
    // valueとなる値を初期化しておく
    let i = 0;
    return {
        // next関数を初期化する
        next: function(){
            return {
                // done をfalseにしておく
                // もしも回数を宣言したい場合はifとdone: trueを組み合わせること
                done: false,
                // 呼び出されるたびにインクリメントしていく
                value: i++
            }
        }
    }
}
```

■ジェネレーター
→イテレータを生成する特別な関数

```js
// functionの後ろに「*」を書くことによりジェネレーターとする
function* gen(){
    // 値を生成していく
    yield 1;
    yield 2;
    // returnが最後の値となる
    return 3;
}

const it = gen();
console.log(it.next())
console.log(it.next())
// ここまでは値があるので、nextが使える
console.log(it.next())
// 4以上は宣言されていないので、valueがundefinedとなり、doneがtrueとなる
console.log(it.next())
```

■スプレッド演算子
→反復、列挙が可能なオブジェクトを展開するもの

```js
const arry1 = [1,2,3,4,5];
// スプレッド演算子でarry1と同じarry2を宣言する
// 可変長の物の時に使用する
const arry2 = [...arry1];

// 中身は同じだが別のメモリを参照しているので、結果はfalseとなる
console.log(arry1 === arry2)
```
【Androidを使い熟す！】LinearLayoutについて

#####※Android技術者認定にも役に立ちます！
#LinearLayout
Layout内にViewを【縦】また【横】に並べて配置が可能なLayout。
#LinearLayout重要属性
◉ android:orientation
レイアウトの方向を指定できる属性。※Defaultは<strong>【horizontal】</strong>
&nbsp;&nbsp;○ horizontal
&nbsp;&nbsp;&nbsp;&nbsp;→配置の方向を<strong>【横】</strong>基準にしてViewを配置できる。※左→右
&nbsp;&nbsp;&nbsp;&nbsp;↓Sampleコード

```ruby:layout.xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
</LinearLayout>
```
&nbsp;&nbsp;○ vertical
&nbsp;&nbsp;&nbsp;&nbsp;→配置の方向を<strong>【横】</strong>基準にしてViewを配置できる。※上→下
&nbsp;&nbsp;&nbsp;&nbsp;↓Sampleコード

```ruby:layout.xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
</LinearLayout>
```

◉ android:weightSum
画面を設定値した数分、分割りできる属性
&nbsp;&nbsp;&nbsp;&nbsp;↓Sampleコード

```ruby:layout.xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="4">
</LinearLayout>
```
◉ android:layout_weight
画面の設定値分、自分の範囲を親Layoutの余白（スペース）に拡大する。（埋めるイメージ）
&nbsp;&nbsp;&nbsp;&nbsp;↓Sampleコード

```ruby:layout.xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1">
</LinearLayout>
※1は100%を示す。（設定範囲は0.1~1まで）
```
#属性を組み合わせて使ってみよう！
◉横を基準にした場合。
&nbsp;&nbsp;&nbsp;&nbsp;↓Sampleコード

```ruby:layout.xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="4"
    android:orientation="horizontal"
    >
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
</LinearLayout>
```
◉縦を基準にした場合。
&nbsp;&nbsp;&nbsp;&nbsp;↓Sampleコード

```ruby:layout.xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="4"
    android:orientation="vertical"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
</LinearLayout>
```
#✳︎追加説明。
◉ match_parentとは
親に合わせるとの指示。
◉ wrap_contentとは
自分の子ビューに合わせるか、部品に合わせる。
TwitterのRTを一気に取り消したスクリプト

# Twitterのつぶやきなんて、9割以上が残しておく必要がない。
SNSじゃないですしね。


# 概要
Twitterにはツイートのメンテナンス系の機能が無い (クソ雑魚弱い)。

なので頑張って、デジタル タトゥーにならない様古いつぶやきやらtwitpic、togetter垢などを消してたら。RT群が割と残ったので、javascriptを使って一気に取り消した。

そんな備忘録。

# 実行環境
* Google Chrome

# 手順
## Step① 「RT取り消し用ボタン」を生成する関数の作成
なんてことはなく、「RTボタンを押下」「確認ダイアログをOK」の2ステップを1ボタンにまとめて、一応1clickで出来る様にしただけ。

```javascript:unretweet&#x20;button
let createRtButton = function() {
    document.querySelectorAll('div[data-testid=unretweet]:not([unrtable])').forEach(function(unrtBtn) {
        let div = document.createElement('div');
        let span = document.createElement('span');
        div.addEventListener('click', function() {
            unrtBtn.click();
            setTimeout(function() {
                document.querySelectorAll('div[data-testid=unretweetConfirm]').forEach(function(cnftmBtn) {
                    cnftmBtn.click();
                });
            }, 10);
        });
        span.innerText = '[unrt]'
        span.setAttribute('style', 'color: #000000;');
        div.classList.add('unrt');
        div.setAttribute('style', 'background-color: #FFFFFF;');
        div.setAttribute('role', 'button');
        div.setAttribute('data-focusable', 'true');
        div.appendChild(span);
        unrtBtn.parentElement.parentElement.appendChild(div);
        unrtBtn.setAttribute('unrtable', 'true');
    });
};
```
元々は総ツイート数MAX100件に抑えるために、定期メンテ用に選択的に取り消しやすい様に作ったボタン作成スクリプト。bookmerkletにして定期的に使ってた。関数を実行すると、クソダサな ``[unrt]`` がRTに現れる。

ちなみにループ起点となっているタグには識別子を付け、queryでは識別子無しを取る様にすることで、多重処理を回避しているのもミソ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/4d8d25f3-4074-f79d-6953-3080743878fe.png)


## Step② 「RT取り消し用ボタンを生成」と「[unrt]を押下」を1秒おきに実行
```javascript:
setInterval(function() {
    createRtButton();
    document.querySelectorAll('div.unrt').forEach(function(e) {
        e.click()
    });
}, 1000);
```
気分爽快

## Step⑨ 結果
![2021-04-13 23-20-04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/c32ad48f-4287-f401-d1c8-96607287ec38.gif)

RTが一層されてスッキリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/49530f27-c643-9338-d801-704c0fea527d.png)

# 備考
Q. アカウント消しぁ良いんじゃないの？

A. お前これまで登録してきたOpenIDのこと覚えてるの？ 私は出来る限り使わない様にはしてきていたけど、でも **覚えてない** 。

Q. ツイート数1万件て書いてない？

A. なんか変わらないなぞ。

Q. RTってつぶやきなの？

A.一応つぶやきに勘定されてる様で。検索とかでも自身のツイートとRTって振り分けられないんだよね。。。

Q. アロー関数なんで使わないの？

A. ラムダ式は二十歳になってから。

Q. 忘れられる権利？

A. バカッターにそんな権利はない。自衛するしか無い。
【At Corder】【初心者】ABC087B - Coins をRuby で解いてみた




#はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ - Qiita](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日１問を目標としてコツコツやってきます:thinking:

わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください:baby:


https://atcoder.jp/home

#問題 ABC087B - Coins
500円玉をA枚、100円玉をB枚、50円玉をC枚ある。これらの中から何枚か選び、合計金額をちょうどX円にする方法は何通りあるか？

同じ種類の硬貨同士は区別できない。2通りの硬貨の選び方は、ある種類の硬貨についてその効果を選ぶ枚数が異なるときに区別される。

#制約
- 0≤A,B,C≤50
- A+B+C≥1A+B+C≥1
- 50≤X≤20,000
- A,B,C は整数である
- Xは50の倍数である

#入力　出力

###入力

```ruby
A
B
C
X
```

###出力
硬貨を選ぶ方法の個数を出力せよ

###入力例

```ruby
2
2
2
100
```

###出力例

```ruby
2
```

- 500 円玉を 0 枚、 100 円玉を 1 枚、 50 円玉を 0 枚選ぶ。
- 500 円玉を 0 枚、 100 円玉を 0 枚、 50 円玉を 2 枚選ぶ。

#回答

```rb
a = gets.to_i
b = gets.to_i
c = gets.to_i
x = gets.to_i
count = 0
#入力

for i in 0..a #500円玉の枚数
  x_1 = x - 500*i
  break if x_1 < 0 #マイナスだとループを抜ける

  for j in 0..b #100円玉の枚数
    x_2 = x_1 - 100*j
    break if x_2 < 0 

    for k in 0..c #50円玉の枚数
      x_3 = x_2 - 50*k
      count += 1 if x_3 == 0
      break if x_3 <= 0 
    end

  end

end

puts count

```

#解説
500円玉から評価するようにしました。そうすることで、マイナスになる処理の回数を減らせるかと思いました。
変数が多くなってしまった気がするのですが、配列を使うなどして変数を減らしたほうが__良いコード__でしょうか？(良いコードという表現があっているのか謎ですが、、:thinking:)


#感想
今回はメソッドの仕様以外はなにも参照せずにコードを書くことが出来ました。
目的は達成できましたが、まだまだブサイクな所が多いように感じます。笑
もっとコード数を減らせる方法がないか模索していきたいですね。。:raised_hands:
javascriptで簡単な電卓を作ってみた（２）

# 前書き
前回は電卓のフロントエンド的な部分を作成したので、
今回は実際に処理をする部分をJavascriptで書いていきます。
といっても、今回で全部作るわけではなく（まだコードを途中までしか考えてない）
数字ボタンだけです。
なるべく早く他の機能も実装できるように、授業中に頑張って考えてきますｗ

# コード書く
今回実装するのは数字入力だけなのでめちゃくちゃ簡単です。

```javascript
var dispnum
function num(x) {
    dispNum=document.getElementById("disp").value;
    dispNum=dispNum*10+x;
    document.getElementById("disp").value=dispNum;
}
```

htmlにも変更を加えます

```html
<input type="text" id="disp">
```

テキストボックスにdispというidを追加します。

# 説明
語彙力ない俺に説明できるかわかりませんが動作を解説します。

最初の行の
dispNum=document.getElementById("disp").value;
でjavascriptのdispNum変数をテキストボックスにある数値と同じにします。

次に
dispNum=dispNum*10+x;
でもとから入力されていた数値を十倍（繰り上がり）してから、
引数として渡された数値を加算する処理をしています。

最後に
document.getElementById("disp").value=dispNum;
でテキストボックスに表示されている内容を更新します。

# 次回に続きます。
まだ数字を入力できるようにしかなっていないので、
次回、計算処理をする部分のスクリプトを書きます。
明後日（金曜日）くらいには書けるかと思います。

今回のコードをcodepenというサイトに書いておいたので、
良かったら見てってください。
https://codepen.io/xtzi9859/pen/PoWROQv
Livebookを動かす (Elixir)

# はじめに
- [Elixir](https://elixir-lang.org/) 楽しんでいますか :bangbang::bangbang::bangbang:
- [Livebook](https://github.com/elixir-nx/livebook)というものがでてきたので動かしてみます
- 詳しい解説は、[Announcing Livebook](https://dashbit.co/blog/announcing-livebook)
- 恥ずかしながら、最初にみたのが4/1の[ツイート](https://twitter.com/josevalim/status/1377354990969233411)だったので、エイプリルフールのジョークだとおもいこんでしまっていました
    - 本当に実在しました！
- [English edition](https://dev.to/torifukukaiou/i-run-livebook-elixir-20cb)

# デモ
- https://livebook.torifuku-kaiou.tokyo/?token=pn6rnkqs44livrm2jgad5dkjof4wlgqe
    - 1ヶ月はそのまま動かしておくのでご自由に遊んでください
    - [Time4VPS](https://www.time4vps.com/)というVirtual Private Serverでイゴかしています
    - このためだけに専用に作ったものなのでナニされてもかまわないです
    - 裸形をさらしておきます
    - クーポンをつかって1ヶ月270円
    - RAM 2GB, Storage 20GB
- イゴかしているリビジョン
    - https://github.com/elixir-nx/livebook/commit/539cb8e2b188ab2d2ab3022b9b41c0d28a5a6a51
        - この記事を書いたあとにもコミットが増えていて、絶賛開発中:rocket::rocket::rocket:の模様

# 必要なもの
- Elixir 1.11

# イゴかし方
- [README](https://github.com/elixir-nx/livebook/blob/539cb8e2b188ab2d2ab3022b9b41c0d28a5a6a51/README.md)に書いてあるとおり

```
$ git clone https://github.com/elixir-nx/livebook.git
$ cd livebook
$ mix deps.get --only prod
$ MIX_ENV=prod mix phx.server
```

```
http://localhost:8080/?token=pn6rnkqs44livrm2jgad5dkjof4wlgqe
```
- 的なものが表示されるのでアクセスしてみる


# 試してみたこと
- Notebookなるものを作って
- Sectionつくって
- Markdown or Elixirを選んで
- 適当に書いてみる
- https://livebook.torifuku-kaiou.tokyo/?token=pn6rnkqs44livrm2jgad5dkjof4wlgqe
- :point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5: Would you please play livebook? 
- Elixirは実行できます
- Elixir 1.12を使うと、スクリプトにHexのインストールを含めることができるそうです
    - :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5: 上記サーバは1.11.2のためこの機能は使えません 
    - [Scripting improvements: Mix.install/2 and System.trap_signal/3](https://github.com/elixir-lang/elixir/releases/tag/v1.12.0-rc.0)

![スクリーンショット 2021-04-14 21.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/214cbdef-405b-755c-828e-2b4085e5a75a.png)

# Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm:
- Enjoy [Elixir](https://elixir-lang.org/) :bangbang::bangbang::bangbang:
- とにかくなんだかすごいものがでてきたようにおもいます
- これからも機能追加されるそうですし、なんだかすんごいものの予感がします！
Xcode の archive  が "Unable to authenticate" で失敗した場合の対処法

## 問題内容
Xcode において **Archive** の実行に失敗した。 "Unable to authenticate with App Store Connect" というエラーメッセージが表示された。

## 対処法

**Xcode を再起動**し、再度 Archive を実行すると成功した。

使用した Xcode のバージョン: `12.4`

## 参考文献
https://developer.apple.com/forums/thread/133759
Galleryのんびり見よう004(Horizontal bar) (matplotlib)

#概要
matplotlibのGalleryをのんびり見よう。
私個人に分かりやすいようにまとめたりしながら。

[元ページ](https://matplotlib.org/stable/gallery/index.html#examples-index)
[まとめページ](https://qiita.com/yo314159265/items/e259ff253dbf03d0566d)

#環境
Python 3.7
matplotlib 3.4.1

#内容
##準備
```Python
import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)

# Example data
people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')
y_pos = np.arange(len(people))
performance = 3 + 10 * np.random.rand(len(people))
error = np.random.rand(len(people))
```

##plot
```Python
fig, ax = plt.subplots()

ax.barh(y_pos, performance, xerr=error, align='center')
ax.set_yticks(y_pos)
ax.set_yticklabels(people)
ax.invert_yaxis()  # labels read top-to-bottom
ax.set_xlabel('Performance')
ax.set_title('How fast do you want to go today?')

fig.show()
```
- `ax.barh()`で、horizontal barを描画できる。
- `ax.invert_yaxis()`で、y軸を逆転(上下を入れ換えて)いる。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/b7a65fc7-99ba-5354-8fb8-9842f3744752.png)


#参考にさせていただいた頁
- https://matplotlib.org/stable/gallery/lines_bars_and_markers/barh.html#sphx-glr-gallery-lines-bars-and-markers-barh-py

#感想
`ax.invert_yaxis()`は使ったことがなかった。

#今後
活用していきたい。
プログラミング用語 漢字化計画

![title pic](https://cdn.pixabay.com/photo/2017/03/28/12/06/chairs-2181919_1280.jpg)

自己紹介
===========

みなさんこんにちは，青木橙花と申します。大学でJavaを学びます。中一から日本語を学んでいる(自分で。日本語の文章を読むことができるですが，会話はちょっと苦手です)。日本語好き。特に"漢字とひらがなの併用は読みやすさを向上することができること"に興味深い。

この計画は何のために存在する
===========

### 1. 日本語の"天然的文字分割"を活用したい。

例文を見せてください:

English version:
The programming language Java supports variable which have underscores.
英語はもちろん，全ての文字は英字です。大文字と小文字で文字列を分割する。

Chinese version:
编程语言Java支持包含下划线的变量名。
中国語は漢字いっぱい! 専用語はほとんと音訳しない。例えば，underscoreは 下划线 です。英字と併用すれば，文字列を分割することができる。

Japanese version:
プログラミング言語Javaは、アンダースコアのある変数をサポートしています。(Google翻訳)
漢字とひらがながある。書く形式による(漢字 ひらがな カタカナ)分割すれば

|節|成分|
|-|-|
|プログラミング|名詞(単語の一部)|
|言語|名詞(単語の一部)|
|Java|名詞|
|は|助詞|
|アンダースコア|名詞|
|のある|形容詞|
|変数|名詞|
|を|助詞|
|サポート|動詞|
|しています|助詞|

書く形式の転換による文字列を分割，ほとんとほかの言語はこの<u>機能</u>を持っていないと思います。

|節|成分|
|-|-|
|程式言語|名詞|
|Java|名詞|
|は|助詞|
|下線|名詞|
|のある|形容詞|
|変数|名詞|
|に|助詞|
|対応|動詞|
|しています|助詞|

例文の訳文を漢字化してみると
程式言語Javaは，下線のある変数に対応しています。

単語はそれぞれ書く形式の転換による分割されました (プログラミング言語 -> 程式言語)。そして，長い単語は短縮して，意味を付けました (アンダースコア -> 下線)。

### 2. 漢字は，カタカナ語より多くの情報(平均値)を持っています

例えば，アンダースコアの漢字は**下線**です。単語**下線**は，**下**(位置表現)と**線**(修飾された名詞)の組み合わせです。カタカナ自体は意味を持っていない。

### 3. 英語や一部のカタカナ語の多重意味が持つ単語を区別できるように

例えば，**code**という英語は，少なくとも以下の意味を持っている:

* 程式を書くために存在する文字 (The text to write a program)
* 文字列 (like "activate code") (A sequence of chars)

**文字コード**は，二つの意味を持っている

* 文字（キャラクタ）を利用する目的で各文字に割り当てられるバイト表現 (Wikipedia)
* 電算の中の0と1を人が読める文字に変換する方式

もし，"コード"をそれぞれ"代文"、"記号"などと翻訳すれば，技術文書はもっと読み易いになるかもしれません。

漢字化と専用語
===========

漢字化済み (Completed)
------------

漢字化成功した(だと思う)例です。

|English|Japanese|New word|Reason for translation|
|-|-|-|-|
|Program|プログラム|程式 (ていしき)|中国語から。一定の仕事をやる方式|
|Code|コード|代文 (だいぶん)|程式を**代**表する**文章**|
|Keyword|キーワード|要字 (ようじ)|**要**になる**文字**|
|Escape Sequence|エスケープ シーケンス|代 (かわ)り字 (じ) / 代字 (だいじ)|本来の**文字**を**代替**する|
|Overload|オーバーロード|複用 (ふくよう)|ものが**複数**の機能を持つ，場合によって**用法**が違う|
|Override|オーバーライド|覆写 (ふくしゃ)|新しい内容で古いものを**覆う**|
|Algorithm|アルゴリズム|算法 (さんぽう)|dataを**計算**する**方法**|
|Destructor|デストラクタ|解体関数 (かいたいかんすう)|対象を**解体**する**関数**|

ここまで読んでくれありがとうございます。感想があれば(漢字化したい単語や意見など)，お気軽にコメントしてください。

漢字化検討中
------------

|English|Japanese|New word|Reason for translation|Reason for considering|
|-|-|-|-|-|
|Method|メソッド|方法|中国語訳から|もっと適切な単語はあるか?|
|List (データ構造)|リスト|導列|データ構造より|上と同じ|
|Property|プロパティ|属性|既に存在します|ほかの"プ"で始まるの単語と区別できるにする|
|Handle (System)|ハンドル|句柄 (くがら)|中国語訳から|"ハンドル"の意味が多すぎ|

漢字化したい (Todo)
------------

|English|Japanese|Reason for needing translation|
|-|-|-|
|System|システム|もっと適当な(意味ある漢字)単語を作りたい|
|Data|データ|上と同じ|
|Thread|スレッド|上と同じ|
|user|ユーザー|上と同じ|
|placeholder|プレースホルダ|上と同じ|

Source

https://zenn.dev/ozelotvanilla/articles/1727865d9c48fd

ここまで読んでくれありがとうございます。感想があれば，お気軽にコメントください。
Intellj / eclipse がうまく動作しないときに試すこと

intellij, eclipse でbuild.gradle の修正や、別プロジェクトの環境構築などをするとき、
一筋縄ではいかない場面に多く遭遇する。
そんなときのためのメモ

#### Intelij
1, 問題: @Accessors(fluent = true), @Getterを使用しているオブジェクト近辺で、エラー発生しているとき。
解決策: Enable annotation processing をon にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/e775ceb6-58d3-efa4-3abd-5328e3fa3127.png)


2, 問題: 新しいbuild.gradle を再コンパイルしても、新しいクラスが認識されないとき
解決策1: gradleのキャッシュファイルを削除 (ex: rm ~/.gradle/caches/*)
解決策2: project 配下の.idea ファイルをdelete し、プロジェクト再読み込み（index の再構築に時間がかかるので注意。）


3, 問題: Lombok のアノテーションが認識されない
error: cannot find symbol  @Accessors(fluent = true)
error: cannot find symbol  @getter 

解決法: 
- Lombok のアノテーションを先に持ってくる。
- 以下のように設定にOptimize imports on the flyを追加する。

```
import lombok.experimental.Accessors;
import static ... 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/d33f0f2c-8c99-0a89-d960-bb075be20eac.png)


#### eclipse 
1, 問題: build.gradle の設定修正が反映されない。

解決策1: 各プロジェクト上で右クリック > gradle > Refresh Gradle Project
解決策2: build clean する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/1dfab737-5d35-5d7f-b643-74b4ebdc933b.png)


2, 問題: Package Explorer の赤いビックリマークが消えない。
解決策:コマンドライン上で、そのプロジェクトのパスで、
$ ./gradlew eclipse
その後、eclipse 上で、プロジェクト右クリック > Refresh gradle project を実行.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/1bb7f43f-ee26-729c-fcf8-3999013ea491.png)

$ ./gradlew eclipse
ExcelのVBAの計算結果をセルに表示する便利な方法

# 例題
1から10までの数字をセル範囲のA1:A10までに表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/827a1ff4-b0d6-3ed8-eaaf-3c86c7b4230d.png)

## 通常の方法

```vb
Public Sub ShowNumber()
    Dim i As Long
    For i = 1 To 10
        Cells(i, "A").Value = i
    Next
End Sub
```

## 今回紹介する方法

以下の記事で使用した方法を使用します。
[ブラックジャックの親のバーストの確率を乱数を使用せず、確率計算のみでプログラムで計算する](https://qiita.com/takahasinaoki/items/f92b4cc3d41ac22a7ae3#%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%83%84%E3%83%BC%E3%83%AB%E9%83%A8%E5%88%86)

Variant型を返す関数を作成し、配列を結果に設定する

```vb
Public Function ShowNumber() As Variant
    Dim Result(1 To 10) As Long
    Dim i As Long
    For i = 1 To 10
        Result(i) = i
    Next
    
    '列方向に配列の結果を表示したい時
    ShowNumber = WorksheetFunction.Transpose(Result)
    
    '行方向に配列の結果を表示したい時
    'ShowNumber = Result
End Function
```

A1セルにセル関数 `=ShowNumber()` を入力します。
その時、配列数式となるように、セル範囲を選択(例では、A1:A10)し、Ctrl+Shift+Enter を押下します。

また、コメントにあるように、行方向に結果を表示したい時は、
``` ShowNumber = WorksheetFunction.Transpose(Result) ``` を
``` ShowNumber = Result ``` に変更し、
A1:J1のセル範囲を選択して、Ctrl+Shift+Enter を押下します。

※当方には環境がないため不確かですが、office365ではスピルが使えるので、配列数式にしなくても左上のセルにセル関数を入力するだけで、配列が展開されると思います。
ぜひ、スピルの環境を使える方は実行して結果をコメントにお願いします。


### 利点
・[先の記事](https://qiita.com/takahasinaoki/items/f92b4cc3d41ac22a7ae3#%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%83%84%E3%83%BC%E3%83%AB%E9%83%A8%E5%88%86)で紹介したケースのように、引数にバリエーションを持たしたい時にセルの参照が使える。
・上記に関連するが、引数に渡したセルの値を変更すると即座に結果に反映される。
・コードをわざわざ実行させる必要がなく、セル関数を入力するだけ。
・結果を表示させるセルの範囲をコードに埋め込むことなく自由に選択させることが出来る。
Windows10でNode.jsをインストールする

# インストーラの取得
まずはNode.jsの公式サイトにアクセス

https://nodejs.org/ja/

「XX.XX.X LTS 推奨版」というボタンをクリック
（2021/04/14現在では「14.16.1 LTS 推奨版」）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/36718026-0838-7616-0b68-245132f8aaa4.png)

# インストーラの実行
msiファイルがダウンロードされるので、実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/4d4a4685-63be-8f61-48a4-292e986ad9f4.png)

Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/149b39c6-8af0-7ed1-e2fa-45207c11fbd9.png)

「I accept the terms in the License Agreement」にチェックをいれてNextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/b1f2bbfc-e12a-901e-6d22-f69c749e2d16.png)

Nextをクリック
（フォルダを変えたい場合は変える）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/541a3456-311b-db8b-1eae-8bf35c3e32ba.png)

希望がなければそのままNextをクリック
（カスタマイズしたければ変える）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/0532cf13-4bdf-33b1-0aef-52d314649d3b.png)

「Automatically install the necessary tools. ~~~」にチェックを入れてNextをクリック
チェックを入れるとChocolateyというパッケージマネージャがインストールされるよう。

https://chocolatey.org/

（不要ならばチェックなしでNextをクリック）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/e0b3e53a-5316-c912-c1e3-8cfe029661ab.png)

Installをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/1088cf2b-45ad-7b9c-f2d8-bddb1bb68f94.png)

Finishをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/89439f0f-b4f8-b74a-27ed-823ebb2c9e69.png)

「Automatically install the necessary tools. ~~~」にチェックを入れた場合、以下のような画面が表示される
指示に従って適当なキーを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322645/25536ffb-1bfe-e0ca-2f98-34ee4498a4db.png)

もう一度同じようなウィンドウが出力されるため、指示に従って適当なキーを押下
その後、PowerShellが動き出すので実行が終わるまで待つ

待つ。。。

待つ。。。

PowerShellで以下の表示がでたまま止まってしまった。
（スクショ忘れた。。。）
「created a unelevatedinstallertelemetrydecorator」

いくら待っても動きださないのでCtrl+cで終了！
とりあえず再起動

# インストールされたことの確認
コマンドプロンプトを開いて以下のコマンドを実行

```console
node --version
```
最初にダウンロードしたインストーラのバージョンと出力が一致していれば成功！
Galleryのんびり見よう003(Bar Label) (matplotlib)

#概要
matplotlibのGalleryをのんびり見よう。
私個人に分かりやすいようにまとめたりしながら。

[元ページ](https://matplotlib.org/stable/gallery/index.html#examples-index)
[まとめページ](https://qiita.com/yo314159265/items/e259ff253dbf03d0566d)

#環境
Python 3.7
matplotlib 3.4.1

#内容
##準備
```Python
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

N = 5
menMeans = (20, 35, 30, 35, -27)
womenMeans = (25, 32, 34, 20, -25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence
```

##plot
```Python
fig, ax = plt.subplots()

p1 = ax.bar(ind, menMeans, width, yerr=menStd, label='Men')
p2 = ax.bar(ind, womenMeans, width,
            bottom=menMeans, yerr=womenStd, label='Women')

ax.axhline(0, color='grey', linewidth=0.8)
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind)
ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))
ax.legend()

# Label with label_type 'center' instead of the default 'edge'
ax.bar_label(p1, label_type='center')
ax.bar_label(p2, label_type='center')
ax.bar_label(p2)

fig.show()
```
- `bar_label`でラベルを表示。`label_type='center'`で棒グラフの真ん中に表示。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/8917da74-69bb-b407-d29a-3467a1210723.png)


#参考にさせていただいた頁
- https://matplotlib.org/stable/gallery/lines_bars_and_markers/bar_label_demo.html#sphx-glr-gallery-lines-bars-and-markers-bar-label-demo-py

#感想
`ax.bar_label(p2, label_type='center')`と
`ax.bar_label(p2)`とで表示されるラベルも変わっているのはすごいなあと思った。

#今後
活用していきたい。
Galleryのんびり見よう002(Grouped bar) (matplotlib)

#概要
matplotlibのGalleryをのんびり見よう。
私個人に分かりやすいようにまとめたりしながら。

[元ページ](https://matplotlib.org/stable/gallery/index.html#examples-index)
[まとめページ](https://qiita.com/yo314159265/items/e259ff253dbf03d0566d)

#環境
Python 3.7
matplotlib 3.4.1

#内容
##準備
```Python
import matplotlib
import matplotlib.pyplot as plt
import numpy as np


labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 34, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars
```

##plot
```Python
fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, men_means, width, label='Men')
rects2 = ax.bar(x + width/2, women_means, width, label='Women')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()

ax.bar_label(rects1, padding=3)
ax.bar_label(rects2, padding=3)

fig.tight_layout()

fig.show()
```
- `ax.bar(x - width/2,`および`ax.bar(x + width/2,`で並べて表示できる
- `rects1 = ax.bar(`のように、`ax.bar()`は`BarContainer`を返す。
- `ax.bar_label(rects1, padding=3)`でラベルを表示させられる。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/995b94bc-efc5-a11e-ab57-bbc969834c81.png)

#参考にさせていただいた頁
- https://matplotlib.org/stable/gallery/lines_bars_and_markers/bar_stacked.html#sphx-glr-gallery-lines-bars-and-markers-bar-stacked-py

#感想
グラフを並べるのに悩んでいたので、助かる。
グラフの上方にラベルを置く際の使い方がわかったので、よかった。

#今後
活用していきたい。
Galleryのんびり見よう index (matplotlib)

#概要
matplotlibに関して、まとめたものを整列させておく。

#内容
##Galleryのんびり見よう
- [Galleryのんびり見よう001(Stacked bar) (matplotlib)](https://qiita.com/yo314159265/items/8eb2cc6d9810f435689e)
- [Galleryのんびり見よう002(Grouped bar) (matplotlib)](https://qiita.com/yo314159265/items/8a877799f6c2a732332e)
- [Galleryのんびり見よう003(Bar Label) (matplotlib)](https://qiita.com/yo314159265/items/2dbdad17c106dbc3dd7a)
- [Galleryのんびり見よう004(Horizontal bar) (matplotlib)](https://qiita.com/yo314159265/items/9c9b112ee7af6f96d3e4)
- [Galleryのんびり見よう005(Broken Barh) (matplotlib)](https://qiita.com/yo314159265/items/ab65a6b28c4fc8db5fba)
プログラムでComposerをインストールする

## 対象
dockerイメージへのcomposerのインストールなど、
プログラムでComposerをインストールしたい人

## はじめに
composerの公式サイトって見づらくないですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103853/316c1946-71e9-7d5e-03f4-33188f9fedc8.png)


この中で、プログラム（スクリプト）でComposerをインストールする方法が書いてあることに今日気づいたのですが、
あまり認識されていない気がしたのでここに書き記しておきます。

## 探し方
通常、インストール方法の探し方は以下です。
`Home > Getting Started > Installation - Linux / Unix / macOS`
ここは手動でダウンロードする方法になっているので、文章の中の`the Download page`からダウンロードページを見に行きます。
`Home > Download`と同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103853/c1f51356-9955-898e-595d-714edc757cd6.png)

ここのコードをそのままスクリプトで実行すれば、自動でダウンロードする仕組みはできるのですが、
ハッシュがベタ書きなので、composerのインストーラーがアップデートすると使えなくなります。
`the guide on installing Composer programmatically.`のリンクの先に答えがありました。

## スクリプト

https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md

こちらのページにはシェルスクリプトが記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103853/9afaaebd-9f04-1cde-95f1-525efbb79816.png)


上記のスクリプトはなんかシンプルに見えなくなっちゃってるけど、
Downloadページの内容を少し変えるだけで良いのでは🤔

```bash
EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
php -r "if ('$EXPECTED_CHECKSUM' === '$ACTUAL_CHECKSUM') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```
MacユーザーのためのGitの環境構築メモ

## 背景
結構な頻度でGitの環境構築するので備忘録として...

## 本題
### Git,GitHub
・下記をメインに参考に進める
[新しいMacでGitHubのSSH接続をするまでの環境構築手順 - Qiita](https://qiita.com/unsoluble_sugar/items/14bea376d8e6fce82eb3)

・SSHに関しては下記の記事がお気に入りです
[お前らのSSH Keysの作り方は間違っている - Qiita](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)

### Sourcetree
下記を参考に進める
[MacでのSourcetreeセットアップとGitHub連携とプルリクエスト作成までの手順 - Qiita](https://qiita.com/suzutatsu/items/817f58cfb6e69f56d134)

### .gitignore
下記で言語・FWごとにgitignoreを生成可能
[gitignore.io](https://www.toptal.com/developers/gitignore)

以上となります！記事を書いてくださった皆さんありがとうございました！
Galleryのんびり見よう001(Stacked bar) (matplotlib)

#概要
matplotlibのGalleryをのんびり見よう。
私個人に分かりやすいようにまとめたりしながら。

[元ページ](https://matplotlib.org/stable/gallery/index.html#examples-index)
[まとめページ](https://qiita.com/yo314159265/items/e259ff253dbf03d0566d)

#環境
Python 3.7
matplotlib 3.2.1

#内容
##準備
```Python
import matplotlib.pyplot as plt


labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 35, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]
men_std = [2, 3, 4, 1, 2]
women_std = [3, 5, 2, 3, 3]
width = 0.35       # the width of the bars: can also be len(x) sequence
```

##plot
```Python
fig, ax = plt.subplots()

ax.bar(labels, men_means, width, yerr=men_std, label='Men')
ax.bar(labels, women_means, width, yerr=women_std, bottom=men_means,
       label='Women')

ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.legend()

fig.show()
```
- `bottom=`を指定することで、stacked bar chartができる
- `yerr=`を指定することで、error barがつけられる

![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/4e0db049-ca82-94ef-1433-a3917e5bdbb7.png)


#参考にさせていただいた頁
- https://matplotlib.org/stable/gallery/lines_bars_and_markers/bar_stacked.html#sphx-glr-gallery-lines-bars-and-markers-bar-stacked-py

#感想
グラフを積み重ねるときに使える。

#今後
活用していきたい。
Mac OS X 10.15 (Catalina) + gdb で《コード署名をしたのに》コード署名を確認しろと怒られる

**エラー内容**
    please check gdb is codesigned - see taskgated(8)

**解決手順**
コード署名をしたのち、`sudo` をつけて gdb を実行する。

**（参考）コード署名をする方法**
[Mac OS X 10.12 (Sierra) + gdb でコード署名を確認しろと怒られる](https://qiita.com/cuminseed/items/9e3eb83efe25f3ef6f77)
上記を実施した場合でも Catalina では `sudo` が必要のようです。

**環境**
- OS X Catalina 10.15.7
- gdb 9.2
TerraformでSSHキーがインポートできなかった

しょーもないことなのですが、若干時間かかったので。

# やろうとしたこと

TerraformでEC2インスタンスを作成する際にSSHキーをインポートしたかった。

# 出たエラー

planが通ったのでapplyすると...

```
$ terraform apply -var-file=vars.tfvars
```

こういう感じで怒られました。

```
Error: Error import KeyPair: InvalidKey.Format: Key is not in valid OpenSSH public key format
        status code: 400, request id: 28fb3e7c-653f-41c2-a2ec-212d69b8a5e9
```

# 該当箇所のコード

```tf:main.tf
#略

# SSH key for EC2
resource "aws_key_pair" "ec2-key-pair" {
  key_name   = var.ssh_key_name
  public_key = var.ssh_key_path
}

#略

```

変数ファイルと値は以下のような感じです

```tf:variables.tf
# AWS credential
variable "access_key" {}
variable "secret_key" {}


# EC2 SSH key
variable "ssh_key_name" {}
variable "ssh_key_path" {}

# AMI id
variable "ami_id" {}

```

```tf:vars.tfvars
access_key   = "XXXXXXXXXXXXXXXXXXXX"
secret_key   = "XXXXXXXXXXXXXXXXXXXX"
ssh_key_name = "terraform_test_rsa"
ssh_key_path = "~/.ssh/terraform_test_rsa.pub"
ami_id       = "ami-00000000000000"
```

# とりあえず公式を確認してみる

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/key_pair

![スクリーンショット 2021-04-14 20.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329016/e53d9ff5-770b-05eb-8f49-965f0e5b07f5.png)

鍵ファイルの中身自体をpublic_keyの値に持たせるのが正解らしいです。全然読んでませんでした。
で、さらに確認するとこういう関数があるみたいでして...

https://www.terraform.io/docs/language/functions/file.html

ということで修正します。

# 修正

```tf:main.tf
# SSH key for EC2
resource "aws_key_pair" "ec2-key-pair" {
  key_name   = var.ssh_key_name
  public_key = file(var.ssh_key_path)
}

```

これで再度applyするとうまく実行されました。
NodistでNode.jsのバージョン管理をする【Windows版のNode.jsバージョン管理ツール】

#はじめに
Node.jsのバージョン管理ツールNodistの実装までの流れをまとめています。
すごくシンプルな内容ですが、初心者の私は悩んだのでここに残します。

#Nodistとは
Node.jsのバージョン管理ツールになります。
他にもnvm, nvmw, nodebrewなどがありますが、主にMac用だったりするのでWindowsの方はNodistをインストールしてください。

#Nodistのインストール方法
#####1. 下記サイトより、赤囲い部分をクリックし、インストーラーをダウンロードする。
※貼付ではv0.9.1となっていますが、その時の最新のモノで問題ないです。
[ダウンロード](https://github.com/marcelklehr/nodist/releases)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1321818/d0ef5cb5-bbab-237e-46b0-3ee604260001.png)

#####2. インストーラーを実行すると、セットアップ画面が開くので、Nextから進める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1321818/a8f260c2-3344-ba41-517b-558e9f07e643.png)

#####3. インストール先はデフォルトから変更しなくてよい
恐らく```C:\Program Files\Nodist```とかになってると思います。

#####4. インストールが終わったら一度PCを再起動
何かをインストールしたら一度PCを再起動しましょう。
有効になっていないことがしばしばあります。

#####5. Nodistのバージョンを確認
```:コマンドプロンプト
C:\Users\ユーザー名> $ nodist -v
0.9.1
```

インストールしたバージョンが出てくれば成功です！

#Node.jsのバージョンを変えてみる
#####1. 現状のNode.jsのバージョンを確認する

```:コマンドプロンプト
C:\Users\ユーザー名>$ nodist ls
(x64)
11.13.0 (global: 11.13.0)
```
※これが現在の自分が持っているNode.jsのバージョンです。


#####2. インストール可能なバージョンを表示

```:コマンドプロンプト
C:\Users\ユーザー名>$ nodist dist```
バージョンがズラーと並ぶ⇓
```
#####3. 必要なバージョンをインストールする

```:コマンドプロンプト
C:\Users\ユーザー名>nodist + v15.14.0
 15.14.0 [===============] 56981/56981 KiB 100% 0.0s
15.14.0
```
※```nodist + バージョン```を実行しています
※この時点ではインストールしているだけなのでバージョンは変わりません

#####4. バージョンを切り替える
```:コマンドプロンプト
C:\Users\ユーザー名>nodist v15.14.0
v15.14.0
v15.14.0 (global)
```
※```nodist バージョン名```で切り替えます

#####5. 切り替わったか確認する
```:コマンドプロンプト
C:\Users\ユーザー名>node -v
14.15.4
```
・・・あれ！？
変なバージョンになっている！？

#####6. 原因
私が今行っているプロジェクトで使用しているバージョンでした・・・
恐らくnpm(パッケージ管理ツール)なども関係しているようなので調べて追記したいと思います。。。
※初めてNode.jsを入れた人はこれでいけるハズです！

#おわりに
ご覧いただきあり難うございました。
初心者の方のお力になれれば幸いです。
私自身が初心者ですのでこれからもより初心者に近い目線から記事を書いていきたいと思います！！！！！