OmniAICreator/Qiita-1.07M huggingface dataset:
Assertionで副作用を起こすな

# TL;DR

`bool`で実行結果がわかるような、副作用を起こすメソッド`methodThatWontFail()`があるとする。
これが失敗して欲しくない時にUnityのAssertionを発生させるという目的で、`Assert.IsTrue(methodThatWontFail());`とやってはいけない。
**ビルドした時に「基本的にAssertは丸ごと取り除かれる」という仕様のおかげでそのメソッドを実行するという事実ごと吹き飛ぶ。**

# Backgrounds

C#の`List<T>()`型には、`bool Remove(T item)`というメソッドがある。その名の通り、`item`に指定したもので一番最初にヒットしたものを削除_しようとする_メソッドである。
この「_しようとする_」という部分が今回重要になってくる。
このメソッドは**実際に`List`の中に`item`で指定したものがなくても例外を吐かない仕様**となっている。その代わり、**`bool`の戻り値が`true`だと削除成功**という扱いになる。

```csharp
var list = new List<int>{10, 42};
list.Remove(42); // true - 中身は [10]
list.Remove(5); // false - 削除失敗, 中身は [10] のまま
```

さて、[Assertion](https://ja.wikipedia.org/wiki/%E8%A1%A8%E6%98%8E)とはプログラマがコード中に「何があっても`true`となってほしい条件」を記述するデバッグの手法の一つであるが、Unityにはこれが`UnityEngine.Assertions.Assert`クラスで提供されている。ちなみにこのクラスでは条件の記述が読みやすくなるようにラッピングされており、例えば

```csharp
using UnityEngine.Assertions

Assert.AreEqual(4, 2 + 2); // (期待値, 実際値)
Assert.AreEqual(3, 1 + 1); // false - AssertionException!
Assert.IsTrue(5 < 3); // false - AssertionException!
```

といった記述ができる。

# バグの概要

先ほどの`List<T>::Remove`のコードにおいて、例えば`42`を取り除こうとする時点で`42`がリストに存在しない状況を絶対に起こしたくない、という要求があった。これをAssertionを利用して検出することを考え:

```csharp
var list = new List<int>{10, 42};
Assert.IsTrue(list.Remove(42)); // 削除失敗するとLogExceptionされる...?
```

とした。

# その結果

**リリースビルド時にこのコードが動かなくなった。**

# WHY?!?!?

Assertionは基本的に「完成品でその条件が`false`になるようなことが起こらないようにデバッグ済みである」という前提となっている。そのため、Unityでは`Release`でビルドすると基本的に

> 「すべてのAssertionに関係するコードがそもそもソースに記述されていなかったことにして」ビルドする[^1]

という挙動をとる。

つまり上記のコードの場合

> `Assert.IsTrue(list.Remove(42));` がなかったことになる

すなわち

> `list.Remove(42);` が実行されない

という事故が起こった。

[^1]: Unityではリリースビルドでも無理やりAssertionを含めるようにすることはできるが、こういう事故が起こった以上、自分はおすすめしない。

# 結論

今回は`List<T>::Remove`だったが、それに限らず[副作用](https://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0))を起こしてその結果を`bool`などで返すようなコードをAssertionでチェックしてはいけない。どうしてもチェックする必要があるなら、副作用を起こさないメソッドで確認するのが良い。

例:

```csharp
var list = new List<int>{10, 42};
Assert.IsTrue(list.Contains(42)); // will fail if 42 is not in list
list.Remove(42); // will ALWAYS return true (otherwise, assertion failure at the line above)
```
Route53で他所で取得したドメインを用いる

# はじめに

もはや何番煎じかわからない内容ですが、今日仕事の関係でRoute53でのレコードとドメイン関係を扱って色々と理解したことがあったのでメモ代わりに書きます。

# 他所のサービスでドメインを取得する

あまりドメイン関係はよくわからないのですが、[スタードメイン](https://secure.netowl.jp/star-domain/)というサービスを使うと33円で`.xyz`の激安ドメインを買えてしまったのでこれをAWSの[Route53](https://aws.amazon.com/jp/route53/)で使えるようにしようと思います。その際に[こちらの記事](https://mel.onl/onamae-domain-aws-route-53/)が参考になりました。

# Route53でホストゾーンを作成する

![ホストゾーンの作成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/cd4776a5-13ec-a2e2-f1e6-491c8bcf41e8.jpeg)

特に何も考えずにRoute53で`ホストゾーンの作成`をクリックします。ここでドメイン名を聞かれるので先程取得したドメイン名を記入します。あとはそのまま`作成`をポチります。

![レコード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/884006a0-aff7-7d70-d7a5-93e5a02e0280.jpeg)

作成したホストゾーンをクリックすると２つのレコードが作成されています。今回重要になるのはこの`NS`と呼ばれているものです。この中の`値`がネームサーバーで、これらをスタードメインのネームサーバーに登録します。スタードメインの場合は、`管理ドメイン一覧(の中の対象のドメイン)`->`ドメイン管理ツール`->`ネームサーバーの確認・変更`の順番で辿っていけば設定画面まで行き着くはずです。

![無題の図形描画 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/c472f938-f8b1-6f43-7264-05beac1f1556.jpeg)

とりあえずネームサーバーを全部書き換えればこれで以後はRoute53で作成したホストゾーンでレコードを編集できます。

# 疎通確認

一応ちゃんとこれで使えるようになっているのかを確認します。テスト用にこんな感じの`TXT`レコードを作成します。値には`test`と書かれたテキストデータが入っています。

![TXTレコード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/3984ead1-8283-9579-641d-5e4e8a4f11ef.jpeg)

あとは[nslookup](https://www.cman.jp/network/support/nslookup.html)で問い合わせてみます。

![nslookup.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/68266efc-f480-a17c-288f-af5870bc6422.jpeg)

これで`nslookup`を実行すると以下の回答が戻ってきました。

```
Non-authoritative answer:
test.XXXXX.xyz text = "test"
```

おそらく`test`が返ってきているので成功ではないでしょうか。

# さいごに

正直まだDNSあたりをちゃんと理解したわけでは無いのですが、この`NSレコード`の使い方がなんとなくわかってきました。外部サービスをうまく使うとかなり安くドメインが買えるので、是非試してみてください！
TechAcademyが無料公開している「HTML・CSS入門講座」を受講する～HTML第2-5回～

# アジェンダ
* HTMLのタグ
    * code
    * pre
* 実践

# HTMLのタグ
## code
文書がコンピュータ用語、ソースコードなどであることを示すタグ。

## pre
HTMLファイルに記述された文書を「そのまま」表示させていることを示すタグ。
「そのまま」というのは、本来タグを使用しなければ変化しない書式などを、記載されているそのままに表示させる、ということである。

# 実践
上記のタグを用いて、以下のindex.htmlを作成した。

```html:index.html
<!DOCTYPE html>

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>Lorem Ipsum</title>
  </head>
  <body>
    <h1>Lorem Ipsum</h1>
    <p>
      <code>Lorem ipsum</code> dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<br>
      Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    </p>
    <pre>
      Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
      Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </pre>
  </body>
</html>
```

これをWebブラウザに表示させるとこんな感じ。
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/9acefaac-d457-86a8-ceb2-036bf37e2965.png)

\<code>を使用した箇所はフォントとサイズが変化している。
\<pre>を使用した箇所は、タグを使用していないが、インデントと改行が反映され、フォントとサイズが変化している。

# おわりに
今回は、文書を見やすく表示させる方法を学んだ。

内容に全く関係ないが、連日似たようなタイトルの記事を連投していたらスパムを疑われたので、投稿頻度を減し一度にまとめる内容を増やそうと思う。

次回 >> [ここ](https://qiita.com/MakoMakoMakotsu/items/157bb0d5c17a8f55ab5e)

## 参考
[2-5 コード、改行、プリフォーマット（HTMLのテキスト）](https://www.youtube.com/watch?v=gAQ3DQRXjhM&list=PLjw-30bsJNVU87F5iCPAW9kB4QDUGQxUG&index=10&t=0s)
【質問】ローカルの変更をリモートリポジトリにアップロード際のエラーの対応

git add　でコミットし、最後にリモートリポジトリへ反映したいのですが、
上手くできません。
最後のエラーの「fatal: no path specified; see 'git help pull' for valid url syntax」
いう表示がでてしまいます。

MacBook-Pro:git-practice papy$ git commit -m "first commit"
[master 2449a26] first commit
 Committer:●●<●●@MacBook-Pro.local>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 1 insertion(+)
MacBook-Pro:git-practice papy$ git push origin master
fatal: no path specified; see 'git help pull' for valid url syntax
MacBook-Pro:git-practice papy$
npm installについての質問です。

###質問内容
npm install puppeteerを入力すると
フォルダごと墓のフォルダに保存されるのを防ぎたい



###状況
puppeteerを使用するため、ターミナルにて下記入力。



    // パッケージをインストールする場合
    $ npm install puppeteer

入力後、他のフォルダに
$ npm install puppeteer
を打ち込んだフォルダごと保存されます。

なぜ、他のフォルダに移動しているのか
原因がわからず困っています。

わかる方いらっしゃいましたら
恐縮では、ございますが
ご協力お願い致します。
【Bug】Catalina での GLUT の表示バグと妥協案

# TL;DR

* GLUTを用いてアプリを作成するとこのような表示バグが起こることがある．

    * 画面の左下にしか表示されない

<img width="624" alt="Screen Shot 2020-06-08 at 20.29.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220684/44adee36-e45b-7c29-16c3-e968ef3b2690.png">

* Mojaveでも同様のバグがおきていたが修正されていた，しかしCatalinaでまた起きてしまった

* Retina Display やHiDPIモニター だけで開発する際は注意

# 背景

## Retina Display

> Retinaディスプレイ（レティナディスプレイ、レティーナディスプレイ、英: Retina Display）は、アップル製品のうち、100〜160ppi程度であった従来のディスプレイ解像度の、およそ倍の解像度、高画素密度のディスプレイを指す名称である。

[Wikipedia](https://ja.wikipedia.org/wiki/Retina%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4#:~:text=Retina%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%EF%BC%88%E3%83%AC%E3%83%86%E3%82%A3%E3%83%8A%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%80%81%E3%83%AC%E3%83%86%E3%82%A3%E3%83%BC%E3%83%8A,%E3%82%92%E6%8C%87%E3%81%99%E5%90%8D%E7%A7%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)

今までのディスプレイは1dotを表現するのに1px使用していたが
Retinaディスプレイは1dotを表現するのに4pxや9px使用する．

[Retinaディスプレイって何？普通のディスプレイとどこが違うの？](https://www.koushinclub.com/blog/2038.html)

# 問題

## OpenGLの表示バグはなぜ起こったか

Retina Display上では600×400の描画をするとき，600×400×4px使用する．
OpenGLでは600×400の描画をするとき，600×400pxしか指定しない．
そのため画面の表示バグが起こる．

### Mojaveでは解決されてたのにというフォーラム

https://www.qb64.org/forum/index.php?topic=1978.0

> That render issue first appeared on macOS Mojave, due to Apple's changes to their version of OpenGL/Freeglut. That got solved with Mojave .3
Then Catalina came along, and I kept on upgrading it with every beta release. All looked good and was working fine for me.
It still is. I'm on the official version now.

# 妥協案

1. パッチを当てる
2. Viewportをいじる

## パッチを当てる

http://iihm.imag.fr/blanch/software/glut-macosx/

```
glutInitDisplayString("rgba stencil double samples=8 hidpi");
```

## Viewportをいじる．

https://qiita.com/emadurandal/items/aaabbcd837bb53a0a77d
AWS 認定ソリューションアーキテクト – アソシエイト (SAA-C02) 実務経験なしで合格しました

簡単ですが合格記を残しました。
# 業務でのAWS経験：ほぼなし
メインサービスの用語や概要は、業務内で担当されてた方のお話とか聞く流れで覚えていましたが、自身で触った経験は皆無でした。ここから検定の学習を開始しました。

# 勉強法
### Udemy
教材は以下の２つです。
・ これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）
https://www.udemy.com/course/aws-associate/
・【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）
https://www.udemy.com/course/aws-knan/

実施した勉強のうち、9割方はこれらの履修です。
個人的には公式のハンズオンより格安で効率よく操作を学習できると思います。
※教材代に加えて、履修の中でAWSのサービス利用料が多少発生します。

業務経歴のない私にとってはハンズオンの教材と言うのがありがたく、内容も未経験者が問題なく取り組める程に丁寧なものでした。
模擬試験は2教材で合わせて9回分ありますが、全問題4周程やって全て最低でも85%以上正答できる状態まで持っていきました。

### 参考書
職場の方からお借りできたので利用。1周読み、模試を2周実施しました。
徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書 徹底攻略シリーズ
https://book.impress.co.jp/books/1118101069

私がテキスト学習が苦手なのもあり、問題数の多いUdemyの方が依存度が高かったです。
ですが、ストレージの種類とかRDBの最大サイズと言ったテキストで網羅的に確認できる内容を覚える際に役立ちました。また1回分であれ、実施できる問題数が増えたことはよかったです。

# 勉強期間
毎日平均2時間程度の勉強を２ヶ月間行いました。それで上記の教材をすべて消化できました。

# 試験当日のこと
試験は自宅(ピアゾンVUE) で受けました。

### 試験前の準備
試験実施PCはMacbook Pro(13インチ/2015 early)でやりました。

まず実施部屋の時計、電子デバイスをすべて片付けました。後は部屋のドアを閉めたりカーテンを閉めたり密閉状態にしました。

試験実施30分前になったらテストサイトにアクセスできるのでアクセス、そこでテスト実施用のアプリのダウンロードを実施して、ダウンロードされたら起動します。

アプリ起動させた後、スマホ連携の操作を行います。
細かくは忘れましたが、画面に表示されたURLとアクセスコードを使って、スマホでWEBページにアクセスする感じだと思います。
スマホで身分証明と部屋の前後左右の写真を撮りました。試験時間も迫ってくるので多少焦りながらやりました。
URLの入力の時とか心臓バグバグでした。

スマホ操作が終わったら試験官からのチャットが来るまで待機。

しばらくすると試験官からチャットでの挨拶がきます。僕の担当はレベッカという方でした。
そのレベッカから、何か指示されたんですけど英語だからちゃんと理解できず、、、ゴメンよ、レベッカ。。。

なんか"hands behind~"みたいなこと書いてたのでMacのカメラで手元移したり、カメラに両手を見せたりしてたらOK貰いました。正解は何だったんでしょうか？

色々焦りましたが、それで無事試験が開始できました。

# テストの内容について気が付いたこと

- テストのバージョン(SAA-C02)が最近変わったとのことですが、最新の仕様に即した回答を求める問題は無かったと思います。たまたまかもしれませんが。
- 日本語で受験しましたが、英文の問題文の確認も可能です。これが多少曲者で、英語が苦手な私でも英訳を確認する必要がでるくらい拙い日本語文だと思いました(shouldのような表現が日本語では記述省略されていて、英文を見て回答がベストプラクティスを選ぶのかと解る感じです)。

# 試験結果
最高点1000、合格ライン720で私の結果は761でした。結構ギリギリでした。

# 回想
私は最初のハンズオン1回やった後、ひたすら試験問題+たまに確認のためにテキスト覗くといった勉強方だったので、「ハンズオン」と「テキスト、ドキュメントの学習」が少ないため曖昧な覚え方になってしまったと思いました。「公式ハンズオンの履修」や「公式ドキュメントの閲覧」などで詰めていけば、より高得点を狙えて合格率も上がり、プロフェッショナルの試験にもつながるように感じました。

# 最後に
個人的にベンダー系資格の受験は久しぶりで、学習効率の悪さを自分でも感じていたので、他のエンジニアの方なら学習期間はもっと短くて済むかもしれません。
今回の学習方法はテキスト学習だとモチベーションを維持しにくい方にはおススメできると思いますので、参考になればと思います。
[光-Hikari-のPython]05章-07 制御構文（内包表記の条件分岐）

#[Python]05章-07 内包表記の条件分岐
まず、以下のプログラムを見てください（プログラムを作成する必要はありません）

```.py
L = []  #空リストLを作成する
print(L)  #Lの要素を出力

for i in range(10):
    if i % 3 == 0:  #3で割った余りが0の場合
         L.append(i)  #appendメソッドで、リストLに要素を追加

print(L)
```
><font color="#090" bgcolor="black">【実行結果】</font>
[]
[0, 3, 6, 9]

簡単に説明すると、空のリスト**L**を作成し、いったん空のリストの要素を**print関数**で出力しています。（もちろん空ですが）
そして、for文内に移動しますが、iが3の倍数（つまり3で割った余りが0）の場合、**appendメソッド**を用いて**L**の要素を1つずつ追加していきます。

最後にprint関数で要素の中身を出力しています。
しかし、このif文も含んだ処理を内包表記で表記することもできます。

##内包表記による条件分岐
では、先ほどの上記のプログラムを内包表記で表現してみます。

```.py
[変数による計算結果 for 変数 in for 繰り返し対象 if 条件]
```

先ほどの上記のプログラムと同じ処理内容を、内包表記で記載してみましょう。今回は**Python Console**から以下のコードを入力してください。

```.py
>>> [i for i in range(10) if i % 3 == 0]
[0, 3, 6, 9]
```
先ほどの05章-06のときの内包表記の後に、if文で条件を書くことで、内包表記の条件分岐となります。**:**（コロン）は必要ありません。

また、「変数による計算結果」の個所も少し改良してみましょう。今度は1以上100**以下**の値の中で10の倍数の値を3倍した値を求めてみましょう。**Python Console**から以下のコードを入力してください。

```.py
>>> [i*3 for i in range(1, 101) if i % 10 == 0]
[30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
```

もう1つ内包表記の条件分岐を見てみましょう。今度は、10以上50**未満**の値の中で、2乗した値が200未満の値を求めてみましょう。**Python Console**から以下のコードを入力してください。

```.py
>>> [i for i in range(10, 50) if i**2 < 200]
[10, 11, 12, 13, 14]
```
確かに上記のリストの要素を2乗してみるとすべて200未満であることがわかります。

そしてもう1つ、先ほどのリストの結果の合計もすることができます。以下のように**sum関数**を使用します。

```.py
>>> sum([i for i in range(10, 50) if i**2 < 200])
60
```


##演習問題
演習問題を用意しました。ぜひ解いてみてください。なお、**Python Console**を利用してください。
<font color="3333ff">
【1】1以上100以下のの整数のうち、奇数のみの合計値を求めるプログラムを**for文**を用いて作成してください。合計は2500となります。

<font color="3333ff">
【2】【1】の問題について、内包表記を用いて答えてください。
</font>

<font color="3333ff">
【3】1以上100以下の数値について、内包表記を用いて5の倍数のリストを作成し、そのリストの要素の平均値を求めてください。（ヒント：len関数を用います）
</font>

##最後に
内包表記では条件分岐も書くことができます。さらに前回触れませんでしたが、内包表記によって結果の合計を求めたり、平均を求めることができるので、簡潔に求める方法を身に着けていきましょう。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)
#SkyCodeリリースまでのお話

Androidアプリ作ってる「めっしー」です。
Twitter：[https://twitter.com/175atsu175](https://twitter.com/175atsu175)
今回「#SkyCode」をリリースするにあたっての経緯とかを軽く書いていこうかと思います。

# はじめに
今回、制作したアプリは　**自分１人で0から制作した訳ではありません。**

自分は趣味で写真を撮ってTwitterに投稿しています。　
[https://twitter.com/messi0601](https://twitter.com/messi0601)

今回のアプリを制作するきっかけになったのが
写真アカウントで出会った「を。」さんと「ツヅキ」さんです。

## を。さんとは
主に創作活動をされている方で自身の写真やフリー素材から様々な幻想的な作品を作成している方です。
[Twitterアカウント]
を。さん：[https://twitter.com/Cokohore11](https://twitter.com/Cokohore11)

## ツヅキさんとは
仕事も趣味もiOSアプリ開発を行っており、有名企業で働いている方です。
[Twitterアカウント]
ツヅキさん：[https://twitter.com/tsuzuki817](https://twitter.com/tsuzuki817)


# 5月12日に
この日に突然このような投稿がされました。
![433898.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188385/6bed165c-94e2-9352-0f04-a65861dd297b.jpeg)

**なんと、を。さんの作品が作れるiOSアプリをツヅキさんが作成したのです。**

### この時、私は思いました。
Androidないんだ。。。
このツイートのリプ欄にも
*「Android版ないんですか泣泣」*
*「iPhone買い換えようかな、、」*
などコメントがあり、

そこで、私は
*「あれ、自分ってAndroidエンジニアだ。作っちゃうか」*

とのことで、開発を始めることにしました。

# 開発についての問題点
今回は技術的な話は省いて書きます。

自分の中で今回の開発を始めるにあたり、気になる点が3つありました。
・ 作れるか
・リリース期間をどれだけ短くできるか
・リリース許可


##作れるか
自分はAndroidのアプリ開発を初めてまだ1年経っていなく、個人アプリとしてのリリース経験もなかったので、そもそも作りきることができるか不安はありました。

## リリース期間を短く
iosアプリがリリースされてその盛り上がりが薄れないうちにAndroidを世に届けたいと自分の中ではあったので、どれだけiosがリリースされた5/12日から近い日にちで開発できるかと言うのはありました。

## 許可
１つ目でも書いた通り、今回自分の中で完成できる保証が全くなかったので、個人て勝手に制作を行い、機能として完成した時点で許可を取りにいこうと考えて動いていました。
（許可おりなかったら、泣いてたｗ）

###  原作者「を。」さんの許可
を。さんとは今回の制作以前から、Twitterで繋がりがあり交流もあったので
喜んでOKをいただけました。

### ios開発者ツヅキさんの許可
ツヅキさんは今回のアプリが完成してから初めてメッセージでやりとりさせてもらいました。
すると、Android版には手が回らなかったので是非リリースしてください！とお言葉をいただきました。


**お二方ともありがとうございました。**


# リリース
6/4日に無事リリースすることが出来ました！！

開発は約2週間で終え、リリースの審査に1週間で合計約3週間でユーザーの元に届けることができました。


#終わりに
今回初めて、個人アプリのリリースをすることができました。
正直短い期間で作ろうと2週間夜中まで作業する日々が続いていました・
ただ、今回優しいお二方に出会えたおかげで、リリースすることが出来たので本当に感謝しています。

Twitterでたまたま出会った人とこのように何かものを作り上げる経験をすることが出来たのは自分にとって貴重な経験なのかなと思いました。

Androidエンジニアとして精進していきます。
ありがとうございました。
Flutterって奴は、便利すぎじゃあねぇか...　〜ネイティブアプリ開発やってみたかったんですpart1〜

# はじめに

これは、Flutterという最新言語を使ってネイティブアプリを開発していく物語
※続くかわかりません

## 記事の目的
<b>①ネイティブアプリへのハードル軽減</b>
PHPやJavaで業務システムやサイト開発ばかりしていると
ネイティブアプリへの開発って難しいと思いません。自分も同じくでした。

<b>②Flutterの知識共有</b>
稚拙な情報共有ですが、一緒に開発スキルをつけたらと思います！

## 筆者の経緯
PHPでBtoC向けサイト開発、業務管理画面開発
↓
転職して新規事業開発してみたいぜ！
ベンチャーに転職
↓
でも、開発経験も未熟だし、まずは基礎固めしたいなー。。。
↓
（転職先）Flutterでネイティブアプリ作るぞ！！！！ 　( ﾟ ▽ ﾟ ;)ｴｯ!!

　　
新規事業開発はしてみたかったのですが、未経験のネイティブアプリの開発までできるなんて
最高な展開ですわ。。。（ちょっと怖い（遠い目））


## Flutterとは

https://flutter.dev/

FlutterはGoogle製のフレームワークです。
クロスプラットフォーム対応はAndroidとiOSに対応しており、今後はWebも対応するとの事


( °o°)ん？どういう事？


正直、未熟な筆者はこんな感じでした。。


どういう事かと言うと、よくネイティブアプリを開発する際にiosはswiftという言語で、
AndroidはKotlinという言語で開発される事が多いです。

そうなのです。ネイティブアプリの開発はiosとAndroidの二つでサービス展開したければ、
二つの言語も必要なんです！！
（なんか当たり前の事言ってるな...）

いや、言語二つって学習コストバリ高やないかい！Σ(゜゜)Σ(゜゜)Σ(゜゜)
そうなんです。カレーライスに牛丼合わせたカレー牛丼並に高いんです。
（筆者はすき家派です。てか、ライスが2倍じゃないからそんなにコスト高くないかもなーこの例え微妙やなー）


二つ言語を覚えるのはしんどい。。。


### そんな時にFlutter!!!

なんとFlutterは、一つの言語でiosとAndroidの二つ制覇できるんです！！
賢すぎるやろ言語開発者！ありがとう！！

さらにWebも作れるらしいので一つの言語でios、Android、Webという一石三鳥！！


## 要するに

ネイティブアプリの開発にビビっていた過去の自分よ。
今なら行けるかもよ。

（中身の薄さすみません。25mプールにほんだし1L入れたくらい薄い）

## 今後

Flutterの実際の開発について書いて行きます。
まだまだな開発者の方、一緒に頑張りましょう。
ベテランの開発者の方、暖かい目で見てください。。。（厳しい指摘はありがたいです）
【Kotlin】クラス/コンストラクタでreifiedを使いたい場合、フェイクコンストラクタを使うと良さげ

# TL;DR
フェイクコンストラクタは実体が関数であるため`reified`修飾子を使うことができ、見た目はコンストラクタのように書けます。

# やりたいこと
以下のような、クラスが有ったとします。

```kotlin
import kotlin.reflect.KClass

class Foo<T : Any>(val clazz: KClass<T>, val lambda: (T) -> Unit)
```

このクラスは以下のように初期化します。

```kotlin
val instance: Foo<Int> = Foo(Int::class) {
    /* 何らかの処理 */
}
```

一方、以下のように書けた方が文字数が少ない分だけスマートに見えます。
しかしながら、素直にやろうとしても型パラメータから`KClass`を取得できないため、このような書き方は実現できません。

```kotlin
// こう書きたいが書けない
val instance: Foo<Int> = Foo {
    /* 何らかの処理 */
}
```

型パラメータから`KClass`を取得する方法として、`Kotlin`では`reified`修飾子が用意されていますが、`class`の型パラメータには付与できず、コンストラクタにはそもそも型パラメータを付与できないため、この状況では使えません。

# 解決方法
フェイクコンストラクタを用いると`reified`修飾子が使えるようになります。

```kotlin
// 名前被り問題があるため、クラスには名前を付けて区別できるようにしておく
import com.wrongwrong.Foo as FooClass

inline fun <reified T : Any> Foo(noinline lambda: (T) -> Unit) : FooClass<T> = FooClass(T::class, lambda)
```

このフェイクコンストラクタを用いることで、以下のように書けるようになります。

```kotlin
// 右辺の呼び出しがフェイクコンストラクタになり、正常に呼び出せる
val instance: Foo<Int> = Foo {
    /* 何らかの処理 */
}
```

## 補足: フェイクコンストラクタとは
フェイクコンストラクタとは、関数名を大文字から始めることでコンストラクタのように見せる書き方です。
公式では`kotlin.collections`に`List`などのフェイクコンストラクタが定義されており、デフォルトで利用できます。

https://kt.academy/article/ek-factory-functions#fake-constructors

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list.html

https://qiita.com/wrongwrong/items/977d8cde46750ec63733
[React] テキストエリアに入力したテキストをダウンロードする

テキストエリアを用意して、そこに入力したテキストを
Downloadリンクからテキストファイルとしてダウンロードできるようにしたサンプルです。

ポイントは ```href``` の参照先 (サンプル中の ```download``` 変数) も ```useState``` で管理し、
リンクの ```onClick``` でデータの作成とセットを行うことです。

```JavaScript
import React, { useState } from 'react'

const TextDownload = () => {
  const [text, setText] = useState("");
  const [download, setDownload] = useState("");

  const handleChangeText = (e) => {
    setText(e.target.value);
  }

  const handleDownload = (e) => {
    setDownload('data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  }

  return (
    <div>
      <textarea style={{resize:"none", width:600, height:200}} value={text} onChange={handleChangeText} />
      <p><a href={download} download="download.txt" onClick={handleDownload}>download</a></p>
    </div>
  );
}

export default TextDownload;
```

# 参考にしたページ

[テキストエリアの内容をダウンロードできるようにする](https://qiita.com/_shimizu/items/0de804dad3002213214f)

[ReactでJSONファイルをブラウザから直接ダウンロードさせる方法](https://www.aruse.net/entry/2019/11/02/095636)
コマンドラインから画面の輝度を変更する - brightnessctl

grubに`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_backlight=vendor"`を記述し`update-grub`をしてもだめだったため以下を使った。

## インストール

```sh
apt install -y brightnessctl
```

## 設定

ユーザーを`input`と`video`グループに追加。

( /usr/share/doc/brightnessctl/README.md に書いてあります。)

## 実行

```sh
# 明るさを50%に設定
brightnessctl s 50

# 明るさを10%に設定
brightnessctl s 10
```
【Ansible】ハイフンの位置による改行の変化～templateモジュール編～

# はじめに
<バージョン>
ansible 2.9.1

templateモジュールでは、jinja2というテンプレートエンジンを用いてファイルを生成出来ます。
しかし、for文等を書く場合、pythonでjinja2を用いた場合と改行のされ方が異なるようです。
jinja2の改行のされ方については、過去の記事を見て下さい。
[【jinja2】ハイフンの位置による改行の変化](https://qiita.com/masa2223/items/5eb9847feef67b08ef3c)

では、templateモジュールでも以下のような結果を得ることが出来るのでしょうか？

```text:出力
start

apple0
orange0

apple1
orange1

end
```

# 参考Playbook
今回は、共通で以下のPlaybookを使用します。

```yml:出力
---
- name: template TEST
  hosts: localhost
  gather_facts: no
  vars:
    ansible_python_interpreter: /usr/bin/python3
  tasks:
    - name: 'template'
      template:
        src: template_sample1.j2  #ファイル名はパターンによって異なります
        dest: result.txt
```

# パターン1：全てにハイフンを入れる
以下のテンプレートが今回の基準になります。
for文の開始位置、終了位置の前後それぞれにハイフンを入れます


```jinja:template_sample1.j2
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
```

#  パターン1：実行結果
appleとorangeの間だけ改行が入ります。
for文の中に書いてある内容は勝手に改行してくれるようです。

```jinja:出力
startapple0
orange0apple1
orange1end
```

# パターン2：for文開始位置の手前のハイフンを消す


```jinja:template_sample2.j2
start
{% for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
```

#  パターン2：実行結果
startとapple0の間が改行されました。
for文開始位置の手前は、for文の開始時に1回だけ改行します。
ここはjinja2と同じ動作をするようです。

```jinja:出力
start
apple0
orange0apple1
orange1end
```

# パターン3：for文開始位置の後ろのハイフンを消す

```jinja:template_sample3.j2
start
{%- for i in range(2) %}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
```

# パターン3：実行結果
全てにハイフンを入れた場合と同じ結果になりました。
for文開始位置の後ろは、入れても入れなくても変化が無いようです。

```jinja:出力
startapple0
orange0apple1
orange1end
```

# パターン4：for文終了位置の手前のハイフンを消す


```jinja:template_sample4.j2
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{% endfor -%}
end
```

# パターン4：実行結果
orange0とorange1の後ろに改行が入るようになりました。
for文終了位置の手前は、for文内の最終行で毎回改行します。
ここはjinja2と同じ動作をするようです。

```jinja:出力
startapple0
orange0
apple1
orange1
end
```
# パターン5：for文終了位置の後ろのハイフンを消す

```jinja:template_sample5.j2
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor %}
end
```

# パターン5：実行結果
全てにハイフンを入れた場合と同じ結果になりました。
for文終了位置の後ろは、入れても入れなくても変化が無いようです。

```jinja:出力
startapple0
orange0apple1
orange1end
```

# まとめ
今までの内容を踏まえると以下のようになります。
jinja2と動作が異なっていることがわかります。

| ハイフンを消す位置 | 改行の仕方 | 
|:-----------|------------:|
| for文開始位置の手前 | for文開始時に1回だけ改行| 
| for文開始位置の後ろ | 変化なし| 
| for文終了位置の手前 | ループの末端で毎回改行| 
| for文終了位置の後ろ | 変化なし| 

つまり、for文開始位置の後ろとfor文終了位置の後ろのハイフンを取り除いても
効果はないので、最初に書いたような出力結果は得られません。（追加で対策が必要）
しかし、全てのハイフンを取り除けば、全ての行で改行することは可能ですので
出力した行同士が繋がってしまうということは起きません。

```jinja:template_sample6.j2
start
{% for i in range(2) %}
apple{{ i }}
orange{{ i }}
{% endfor %}
end
```

```text:出力
start
apple0
orange0
apple1
orange1
end
```

# 関連記事
[【jinja2】ハイフンの位置による改行の変化](https://qiita.com/masa2223/items/5eb9847feef67b08ef3c)
高位合成言語Polyphony (windowsでiverilog その16）

#概要

windowsでiverilogやってみた。
polyphony、やってみた。
全加算器、書いてみた。
moduleからmoduleを呼び出してみた。

#サンプルコード


```
import polyphony
from polyphony import testbench, module, is_worker_running
from polyphony.io import Port
from polyphony.typing import bit
from polyphony.timing import clksleep

@module
class ha:
	def __init__(self):
		self.a = Port(bit, 'in')
		self.b = Port(bit, 'in')
		self.c = Port(bit, 'out')
		self.s = Port(bit, 'out')
		self.append_worker(self.worker)
	def worker(self):
		while is_worker_running():
			a0:bit = self.a.rd()
			b0:bit = self.b.rd()
			c0:bit = a0 & b0
			s0:bit = a0 ^ b0
			self.c(c0)
			self.s(s0)

@module
class fa:
	def __init__(self):
		self.a = Port(bit, 'in', protocol='valid')
		self.b = Port(bit, 'in', protocol='valid')
		self.c = Port(bit, 'in', protocol='valid')
		self.o = Port(bit, 'out', protocol='valid')
		self.s = Port(bit, 'out', protocol='valid')
		self.ha0 = ha()
		self.ha1 = ha()
		self.append_worker(self.worker)
	def worker(self):
		while is_worker_running():
			a0:bit = self.a.rd()
			b0:bit = self.b.rd()
			c0:bit = self.c.rd()
			self.ha0.a.wr(a0)
			self.ha0.b.wr(b0)
			clksleep(10)
			s0:bit = self.ha0.s.rd()
			c1:bit = self.ha0.c.rd()
			self.ha1.a.wr(s0)
			self.ha1.b.wr(c0)
			clksleep(10)
			s1:bit = self.ha1.s.rd()
			c2:bit = self.ha1.c.rd()
			c3:bit = c1 | c2
			self.o(c3)
			self.s(s1)

@testbench
def test(m):
	print("a b c o s")
	for i in range(2):
		for j in range(2):
			for k in range(2):
				m.a.wr(i)
				m.b.wr(j)
				m.c.wr(k)
				o = m.o.rd()
				s = m.s.rd()
				print(i, j, k, o, s)

m = fa()

test(m)




```

#python実行結果


```
a b c o s
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1
```

#iverilog実行結果


```


a b c o s
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1
 3650:finish



```

以上。
IntelliJ IDEA　初心者のための便利機能　（重要度★４）

重要度★５の続きです。
[IntelliJ IDEA　初心者のための便利機能　（重要度★５）](https://qiita.com/bana3194/items/d1696044371e2072b06f)
主に★５で扱った事に関する項目で、より便利になる機能を紹介します。
#更に便利になる設定項目たち
今回はほとんど設定画面での操作になります。設定画面はここから開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/9823ce45-2c06-b775-c6f7-4ae5fb534045.png)

### ・ライブテンプレート設定
この設定を活用するだけで、作業効率は数割増しになります。
設定→エディター→ライブテンプレートと選ぶと、この画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/32da1ca6-ce13-38f9-029a-11ee87dffb10.png)
右上の＋ボタンを押し、『ライブ・テンプレート』をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/7025c294-38c1-3d3c-c380-01acc5803ce0.png)
するとこのような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/4fdaee4f-fefb-f785-7a74-f92d88638ae6.png)
これを色々好きに書き替えてやると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/4500ccfb-b32a-31a6-786d-98653737a0b3.png)
こんな感じになります。下の方にあった「定義」って文字をクリックして、使いたい言語にチェックを入れてあげないと使えないので注意。あと、「完全修飾名を短くする」のチェックがついていると、場合によってはちゃんとライブテンプレートが機能しないので、それも注意を。
右下の「適用」または「OK」を押せば設定完了です。実際に試してみましょう。

`prln`が`System.out.println();`に変換されました。よく使う文章はテンプレートを設定しまくって、ガンガン作業効率を上げていきましょう。~~ただこの機能便利すぎて、使いすぎると本当に自力じゃコード書けなくなっちゃいそう~~

###**・コードテンプレート設定**
例えばJavaで、毎回決まって書くmain関数。それを自動で書いてくれる機能があります。設定画面はここです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/42e20506-65bc-cef5-e1e5-870d500a9da4.png)
Javaで普段書くClassファイルなら、ここを修正すれば反映されます。main関数を記入するとすれば、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/147c40e7-b97a-d5f4-a628-8c343ec70bd0.png)
このように。では、「OK」を押して設定を適用し、新規のClassファイルを作成してみましょう。
![Template_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/deae3cdf-5c97-335e-7fe6-eb670dcdfb9a.gif)
main関数が記述された状態でファイルが作成されました。もちろん、他にも色々記述できます。

###**・使うと便利なショートカット**
★５の記事で書いた`Ctrl+Z`などのショートカットキーですが、他にも色々ショートカットがあります。使うと便利なものを紹介していきます。

**実行**(`Ctrl+Shift+F10`)
表示しているソースコードを実行してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/08ae0e47-7b55-c0ef-5ff8-6b1a76579711.png)
こんな風に、ショートカットがあるアクションの傍にはほとんどそのショートカットが書いてあるので、注意して見てみるといいと思います。

**便利な改行**(`Shift+Enter`)
行の途中からでも改行して次の行に行けます。
![kaigyou.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/b516058a-fce5-68d7-7a2d-4646d7fe9b37.gif)

**コードを自動で整える**(`Ctrl+Alt+L`)
![Format.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/ee9ad98a-f09e-6456-3129-b0813f154f94.gif)
コードを書いていて、見た目がぐちゃぐちゃになってしまってもこれで整えてくれます。

###**・キーマップ設定**
上述したショートカットですが、自分で追加・変更もできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/457d7d26-81cd-dafb-9d00-13511ce352f1.png)
設定画面のここから編集できます。右上の検索ボックスからアクションを検索してショートカットを割り当てることもできますし、その右の虫眼鏡マークをクリックしてショートカットを打ち込むと、そのショートカットがどんなアクションに割り当てられているか検索できます。
上で紹介した「実行」のショートカットなんかは押しづらいので、別のショートカットを割り当てるといいかもしれません。

###・便利なマウスのアクション
単語をダブルクリックするとその単語が選択されます。
そして、選択された部分はドラッグして好きな場所に持っていくことができます。
![Click.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/d13567a5-612a-9737-02d0-f79b5b0e1a1b.gif)


★４は以上です。★３以下に関しては、時間ができ次第執筆します。
GitHubでOrganizationから除外したユーザーが作成したissueを検索する方法

# 除外ユーザーが候補に出ない…

GitHubリポジトリでソースコード管理を行なう場合、退職や契約終了によりプロジェクトから離脱したユーザーは、基本的にOrganizationから削除するような運用が行われているかと思います。

在職中にissueの整理やAssignの引き継ぎがすべて完了していれば問題無いのですが、closeし忘れや優先度の低いタスクがそのまま残されていることもあります。


普通にリポジトリのissuesページからAuthorフィルターを選択しても、Organizationから除外されたユーザーは候補に表示されません。
![2020-06-08_19h07_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/5c304f82-d1f7-130a-4c8e-a4380d25835e.jpeg)


このような場合でも、除外ユーザーのユーザーIDが把握できていれば、フィルターにIDを直接指定することでissueの検索が可能です。

```
is:open is:issue author:{除外ユーザーのID}
```


URLは以下のようになります。

```
https://github.com/{organization}/{repository}/issues/created_by/{user_id}
```

これで該当ユーザーの作成したissueを整理することができます。


やったぜ。
LINEで文字数をカウントしてくれるともだちをつくる

## ともだち召喚の背景

６月になり、各企業さんが夏季インターンの募集を初めています。私も今年からインターンに参加しようと思っていますが、ES作成がとっても不安な私は先輩にESの添削をお願いしました。

LINEで先輩に文章を送って見てもらうのですが、困ったことがありました。ESにはだいたい文字数制限があるのです。（しかもギリギリまで書くのが推奨されているらしい）制限文字数ちょうどで書いた文章を添削してもらうとき、先輩に直された文章が文字数を超過していたらいたたまれない気持ちになります。もうちょっと減らしてもらえますか？なんて言えたもんじゃないです。

また、文字数を数えること自体もそれはそれで面倒です。ESの形式によっては数えてくれるものもありますが、大抵私はWordに貼り付けて文字数を数えていました。面倒です。

そこで、カウント係の友達をもう一人トークに招待し、文章の文字数を数えてもらうことを思いつきました。が、そんな都合のいい友達はいません。よって、LineBOTを召喚します。

## 環境

せっかくなので、研究に必要で勉強している最中のNode.jsを使ってみることにします。Herokuを使えばlineBotを簡単に作れそうです。
- Heroku
- Node.js

## 参考

[LINE BOTをHeroku + Node.jsでやるまで](https://qiita.com/TakuTaku04/items/cb71f10669a9e9cbf71b)
超分かり易かったです。手順に従って簡単にLINEBOTを作成できました。ありがとうございます。

## 実装

上の記事を参考にして、echomanのところをkazoerukunとして実装しました。

### lineBot()

/hook を呼び出すとこの関数を呼ぶようにする。

```javascript
function lineBot(req, res) {
        res.status(200).end();
        const events = req.body.events;
        const promises = [];
        for (let i = 0, l = events.length; i < l; i++) {
            const ev = events[i];
            promises.push(
                kazoerukun(ev)
            )
        }
    }
```

### kazoerukun()
テキストを取得して文字数を返すだけ

```javascript
async function kazoerukun(ev) {
        return client.replyMessage(ev.replyToken, {
            type: 'text',
            text: `${ev.message.text.length}もじ`
        })
    }
```



## オンオフ切り替えられるようにする

ずっとカウントしてくると、いちいち文字数を返してくるかぞえるくんにイライラします。
状態を保存する変数を用意して、切り替えられるようにしました。



### kazoerukun()

publicディレクトリ にisCountOn.txtを用意して、毎回読み込むことにしました。もっといい方法がありそうですが…

```javascript
async function kazoerukun(ev) {
        const isCountOn = fs.readFileSync('public/isCountOn.txt')
        if (ev.message.text == 'かぞえて') {
            switchMode(ev, 'on')
        } else if (ev.message.text == 'やめて') {
            switchMode(ev, 'off')
        } else if (isCountOn == 'true') {
            return client.replyMessage(ev.replyToken, {
                type: 'text',
                text: `${ev.message.text.length}もじ`
            })
        }
    }
```

### switchMode()

切り替えのために、ファイルの書き換えを行っています。

```javascript
function switchMode(ev, mode) {
        if (mode == 'on') {
            fs.writeFileSync('public/isCountOn.txt', 'true')
            return client.replyMessage(ev.replyToken, {
                type: 'text',
                text: `かぞえるよ`
            })
        }else if (mode == 'off') {
            fs.writeFileSync('public/isCountOn.txt', 'false')
            return client.replyMessage(ev.replyToken, {
                type: 'text',
                text: `やめるよ`
            })
        }
    }
```

書いたプログラムはgithubに載せています。

## できたともだち

こんなふうに使えます。
![S__52019555.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429217/72c56344-f03e-c1bf-9312-b6dd01658f12.jpeg)


これを先輩とのトークルームに招待して使っていきます。便利！　　



## 感想

LINEBOTを作ったのは初めてでしたが、先駆者の皆様方のおかげで簡単に作ることができました。他にもいろいろなことができそうなので、何か思いついたら作ってみます。
IntelliJ IDEA　初心者のための便利機能　（重要度★５）

IntelliJというか、エディター初心者のための解説ページです。このページでは、特に重要な機能やショートカットをまとめています。記載してあるショートカットは全てWindowsのものです。
# 絶対覚えてほしい便利機能
###**・元に戻す**
ショートカットキーの王様（と個人的に思っています）。これだけは絶対覚えてほしい。WordやExcelなんかでも使えます。
Undo、アンドゥと呼ばれる機能です。「行った作業を取り消す」という動作をしてくれます。CtrlとZの同時押し（以下、`Ctrl+Z` というように記述します）で動作します。何回も押せば、更にさかのぼって作業を取り消せます。

やべぇ間違えて消しちゃった！でも` Ctrl+Z` を押せば元通り！
![Undo2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/27b60fa5-3cd1-e0a6-3593-40e6be9386c7.gif)
やべぇ間違えてコピペしすぎた！でも`Ctrl+Z` で元通り！
![Undo_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/e096b2d5-4b9e-9825-eadd-bc0f95f16926.gif)
`Ctrl+Z`を押しすぎて巻き戻しすぎた！という時は、`Ctrl+Shift+Z`を押せば「元に戻す」の取り消しができます。

###**・コピー＆ペースト**
俗に言うコピペですね。インターネットユーザーの強い味方。いちいち右クリックを押してメニューから選ばなくても、
　コピー：`Ctrl+C` 
切り取り：`Ctrl+X` 
ペースト：`Ctrl+V` 　で動作してくれます。

範囲を選択して、`Ctrl+C`。貼り付ける場所を選んで`Ctrl+V`。マウスの操作でいいやって人はそれもまた良し。
![C_P.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/a913731e-7b86-8239-4240-564ad15e6706.gif)

###**・コード補完**
IntelliJを使う、最も大きな理由の一つと言っていい機能です。単語を途中まで打つと、その単語の予測補完をしてくれます。

文字を打つと、その文字で始まる単語の一覧が表示されます。上下キーで欲しい単語を選んで、`Enter`キーをポチ！自動でその単語を記述してくれます。使いすぎると自力でコード記述できなくなるので注意。
![Complement.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/8185cbb8-ec4b-4b6e-98dd-8919dbf46c4d.gif)


###**・ライブテンプレート**
コード補完と似た機能ですが、使いこなせばより便利。
![Complement_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/647d434e-1667-d5c9-5af3-037343588bcc.gif)
`sout`と打って`Enter`を押すと、その文字列が`System.out.println();`に変換されました。これ以外にも、あらかじめ決められた文字列を、決められた文章に変換してくれます。重要度★４で紹介しますが、自分で追加・編集もできます。

###**・エラーを起こす箇所の表示**
赤い見た目で分かりやすく、間違っている場所を指摘してくれます。大文字小文字、スペルミス、ピリオドやセミコロンの抜けなどが主な原因でしょうか。
![Error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323695/1b23be07-a6dd-5da1-f6d6-20d67c4e3cd3.png)

重要度★５の便利機能は以上です。★４で更に便利になる設定を紹介しているので、是非ご覧ください。
[IntelliJ IDEA　初心者のための便利機能　（重要度★４）](https://qiita.com/bana3194/items/6117caaba9acc86b133e "IntelliJ IDEA　初心者のための便利機能　（重要度★４）")
文字列をARGに設定したらよくわからない値になった時の対応方法


- 環境
    - CentOS Linux release 7.8.2003 (Core)
    - Docker Engine Version: 19.03.8
    - docker-compose version 1.25.5

# docker-compose.ymlで「0」始まりの文字列をARGに設定したらよくわからない値になった
docker-compose.ymlで「0」始まりの数字文字列「06000001」をARGに設定して、

```yml:docker-compose.yml
version: '3.8'
services:
  app-java11:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        my_code: 06000001
...省略...
```

Dockerfile内で`sed`するのに使った・・・

```bash:Dockerfile
FROM centos:centos7.7.1908
# ...省略...
ARG my_code

COPY app/domain.xml payara5/glassfish/domains/domain1/config/
RUN sed -i -e "s/{{my_code}}/${my_code}/g" payara5/glassfish/domains/domain1/config/domain.xml
# ...省略...
```

結果「06000001」ではなく「1572865」というわからない値になった

```bash
$ docker-compose up -d --no-recreate --build
# ...省略...
Creating app-java11 ... done
$ docker exec -it app-java11 bash
# grep files /opt/payara5/glassfish/domains/domain1/config/domain.xml
        <jvm-options>-Dapp.resources.dir=/var/app/files/1572865</jvm-options>
```

# 原因 : シングルクォーテーションで囲んでないから
ダブルクォーテーションでもOK。
気が付けば普通だが気が付くのに時間がかかった。

## 対応方法 : 文字列をシングルクォーテーションで囲む

```yml:docker-compose.yml
...省略...
      args:
        my_code: '06000001'
...省略...
```

```bash
$ docker-compose up -d --no-recreate --build
# ...省略...
Creating app-java11 ... done
$ docker exec -it app-java11 bash
# grep files /opt/payara5/glassfish/domains/domain1/config/domain.xml
        <jvm-options>-Dapp.resources.dir=/var/app/files/06000001</jvm-options>
```
RubyでもParquetファイルがつくりたい

# 背景

Pythonの `pandas` や `DataFrame.to_parquet` が優秀すぎて「parquetファイルを扱うならPython」という風潮ですが、
https://pandas.pydata.org/pandas-docs/version/0.22.0/generated/pandas.DataFrame.to_parquet.html#pandas.DataFrame.to_parquet

Rubyでも簡単につくれることが判明したので、共有しておきます。

# やり方

apacheの公式gemを使えばいける。
（≠red-arrowなので注意）
https://github.com/apache/arrow/tree/master/ruby/red-parquet

## 検証

### ファイル作成

gemインストール

```
$ gem install red-parquet
```

テストファイル作成(csv)

```
$ echo colA,colB > test.csv
$ echo 1,2  >> test.csv
```

ruby上で変換処理(csv->parquet)
※save時に拡張子を変えるだけ

```
$ irb
irb(main):001:0> require "parquet"
=> true
irb(main):002:0> table = Arrow::Table.load("./test.csv")
=> #<Arrow::Table:0x7fbb0d3e6708 ptr=0x7fbb0e0a4010>
	 colA	 colB
0	    1	    2
irb(main):003:0> table.save("./test.parquet")
=> true
```

### 確認

test.parquetをS3にあげて、S3 Selectで確認

<img width="794" alt="スクリーンショット 2020-06-08 19.08.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363295/03293660-8f34-27ac-0d9b-dc4d743dac15.png">

できた！！（型推論もしてくれてる...！）

# 備考

このあたりを読んでると、案外Rubyでもファイル操作ができそう。
https://www.slideshare.net/kou/datasciencerb
【Laravel】@errorディレクティブを使って任意のエラーをメッセージ表示する。

メモとして残します。

基本的にはブレードでは`@input`ディレクティブを使うため、エラーメッセージは自動的に生成されます。
しかしながら、配列入力のN件の入力項目で、0件の場合にエラーとする場合、エラーメッセージ用の要素を生成しなければならないと思います。
そんなときに`@error`ディレクティブが便利でした。
わざわざ、`$errors->get()`でエラーの存在を確認する必要もありませんし、スマートです。

#■やり方
指定した要素のエラーがある場合のみ、ディレクティブ内の処理をします。
また、`@error`ディレクティブ内の`$message`は特別で指定した要素のエラーメッセージが入っています。

```php
@error('attrname')
<div class="invalid-feedback" role="alert" style="display:block">
    {{ $message }}
</div>
@enderror
```
Nim：koch tools の失敗。原因と対処。

# koch.exeによるtoolsのビルドの失敗と対処

## 手順

以下のコマンドをnimのランタイムがあるルートディレクトリで実行。

```shell
nim-1.2.0>koch.exe tools
```

## 現象

以下のエラーメッセージが表示。

```shell

nim-1.2.0/dist/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot open output file [PROGRAM_DIRPAH]s/nim-1.2.0/bin/nimsuggest.exe: Permission denied
collect2.exe: error: ld returned 1 exit status
Error: execution of an external program failed: '[PROGRAM_DIRPAH]\nim-1.2.0\dist\mingw64\bin\gcc.exe  @nimsuggest_linkerArgs.txt'
FAILURE

```
## 原因と対処

自分の場合、VSCodeで開発中であった為、エラーがでていた。
なので、VSCodeを終了させて、再実行したら、成功した。
同じ問題に遭遇した人のためのメモ。
Googleフォームの選択肢をスプレッドシート管理して、さらに回答されたものは自動削除する

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Google%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E9%81%B8%E6%8A%9E%E8%82%A2%E3%82%92%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E7%AE%A1%E7%90%86%E3%81%97%E3%81%A6-%E3%81%95%E3%82%89%E3%81%AB%E5%9B%9E%E7%AD%94%E3%81%95%E3%82%8C%E3%81%9F%E3%82%82%E3%81%AE%E3%81%AF%E8%87%AA%E5%8B%95%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/)をご覧ください😀

# はじめに
Googleフォームで選択肢を動的にしたいときってありますよね！

具体的には、
① スプレッドシートに候補日リストつくる
② Googleフォームで①から1つ選んで予約する
③ ②で選ばれたやつが①から消えてフォームで選べなくなる
みたいなことがやりたい！

# 作ったもの
https://github.com/naoqoo2/auto-delete-choices-gas
ほぼリアルタイムで選択肢を最新化します。
- スプレッドシートの変更反映
- 回答された選択肢の削除

![d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/55a21453-1a40-e234-f559-eba2af9d8fb6.gif)


# 導入手順

1. フォームとスプレッドシートを作る
2. スプレッドシートにスクリプト貼り付け
3. スプレッドシートにトリガーを設定する
4. フォームにスクリプトを貼り付け
5. フォームにトリガーを設定する

## 1. フォームとスプレッドシートを作る

いつも通り作成します。
のちほどIDを使いますのでURLから取得しておいてください。

## 2. スプレッドシートにスクリプト貼り付け

まずスクリプトエディタを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/d79b131c-3972-d02b-788a-21579ea8ead4.png)

[このコード](https://github.com/naoqoo2/auto-delete-choices-gas/blob/master/%E3%82%B3%E3%83%BC%E3%83%89.gs)をコピペして保存します。
下記を書き換えてください。

```
var form_id = '1zpr5c46YWqJqhTBMIFAr9X8bXezJtOdP6OSkoLptvLs'; // フォームID
var question_title = 'ご希望の日程をお選びください'; // 動的にしたい質問のタイトル
var sheet_id = '1Psa8ngX9_Q5sP4YS3P7DR0ACQoHK_tiSh9D9uZaK0qE'; // スプレッドシートID
var sheet_name = 'シート1'; // シート名
```
## 3. スプレッドシートにトリガーを設定する

スクリプトエディタからトリガーを開きます。（時計アイコン）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/ba1e3310-ecd6-f966-027a-3c5a8e7aaf1d.png)


### セルを追加・変更した時にフォームに反映させるためトリガーを設定

- 実行する関数：change_pulldown_list
- イベントの種類を選択：編集時
- エラー通知設定：今すぐ通知を受け取る　（問題があった時にすぐ気づけるのでオススメ）

こんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/ad02178a-6e54-52fe-1d35-939787de7095.png)

保存時に「Googleアカウントへのアクセスをリクエストしています」と聞いてくるので許可してください。

### 行を削除した時にフォームに反映させるためトリガーを設定

行の削除は「編集時」イベントでは拾えないため、「変更時」のトリガーも設定してあげます。

- イベントの種類を選択：変更時

となるだけで、あとは同様です。

## 4. フォームにスクリプトを貼り付け

2と全く同じスクリプトをフォームのスクリプトエディタにも設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/004cab84-ca15-90ee-63d2-9ce3596b2bde.png)

## 5. フォームにトリガーを設定する

### 回答された選択肢を削除するためトリガーを設定

- 実行する関数：triger_submit　※スプレッドシートと異なるのでご注意ください
- イベントの種類を選択：フォーム送信時

これで完成です。


# 参考
- https://qiita.com/fuku_sato1/items/d1f3377850caceb6f95c
- https://twitter.com/naoqoo2/status/1268840794787418113?s=20
- https://twitter.com/naoqoo2/status/1268840961980764161?s=20
【MAMP × SSI】SSIが組み込まれているファイルをローカル環境でも確認したい

SSIを許可するためにはApacheサーバの設定を変更する必要がある。

① 「SSIとCGI（perl）」を許可する

```/Applications/MAMP/conf/apache/httpd.conf（変更前）
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
```

↓ に変更


```/Applications/MAMP/conf/apache/httpd.conf（変更後）
<Directory />
Options Indexes FollowSymLinks ExecCGI Includes
AllowOverride All
</Directory>
```


② AddOutputFilterディレクティブでSSIを有効にする（どの拡張子に対してSSIディレクティブの解析するかを指定）

```/Applications/MAMP/conf/apache/httpd.conf（変更前）
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
</IfModule>
```

↓ に変更


```/Applications/MAMP/conf/apache/httpd.conf（変更後）
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml .html .htm .php
</IfModule>
```


③ Apacheを再起動したら問題なく表示できる（はず）
Homebrewインストール



```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

% sudo chown -R $(whoami) /usr/local/* 

```


```
% brew -v                                                                                             
Homebrew 2.3.0
Homebrew/homebrew-core (git revision a5f63; last commit 2020-06-08)
```
SQLのCASE式を使ったテーブルの縦横変換

# 使用DB
postgresql 12.2

# やりたいこと
**テーブルデータの縦持ちを横持ちにして集計する。**

参考にしたのは、[達人に学ぶSQL徹底指南書 第2版](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-CodeZine-BOOKS/dp/4798157821)

サンプルデータとして、以下のような県ごとの男女比別人口があるテーブルを用いる。
sex = 1 は男で、2は女である。

pref_name|sex|population|
---------|---|----------|
徳島       |1  |        60|
徳島       |2  |        40|
香川       |1  |       100|
香川       |2  |       100|
愛媛       |1  |       100|
愛媛       |2  |        50|
高知       |1  |       100|
高知       |2  |       100|
福岡       |1  |       100|
福岡       |2  |       200|
佐賀       |1  |        20|
佐賀       |2  |        80|
長崎       |1  |       125|
長崎       |2  |       125|
東京       |1  |       250|
東京       |2  |       150|

# 欲しい結果

男女別の徳島、香川、愛媛、高知の人口と、四国、すべてについての人口を得たい。
以下のように縦横変換されてほしい。

```sql 
性別|徳島|香川 |愛媛 |高知 |四国 |すべて|
--|--|---|---|---|---|---|
男 |60|100|100|100|360|855|
女 |40|100| 50|100|290|845|
```

# SQL

```sql 
select
	case when sex = '1' then '男' else '女' end as 性別
	,sum(case when pref_name = '徳島' then population else 0 end) as 徳島
	,sum(case when pref_name = '香川' then population else 0 end) as 香川
	,sum(case when pref_name = '愛媛' then population else 0 end) as 愛媛
	,sum(case when pref_name = '高知' then population else 0 end) as 高知
	,sum(
		case when pref_name = '徳島' then population
			 when pref_name = '香川' then population
			 when pref_name = '愛媛' then population
			 when pref_name = '高知' then population
			 else 0 end) as 四国
	,sum(population) as すべて
from
	poptbl2
group by
	sex
order by
	sex
;
```

# 感想
SQLのCASE式は強力な機能だなと思った。
AndroidStudio(kotlin)画面回転fullSensorの挙動

# やりたいこと

* 画面を縦横に回転させたときの挙動を整理する。
* fullSensor と portrait を比較する。

# AndroidStudioでプロジェクト新規作成時のデフォルト

新規作成時に生成されるマニフェストは

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yamato200608b">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```

である。
この時点では、

```xml
            android:screenOrientation=""
```

の記述が無い。


# screenOrientationへの設定

```xml
        <activity android:name=".MainActivity">
```

に追記する。



## fullSensor

赤い〇はカメラの位置。回転に合わせて表示の向きが最適化される。


```xml
        <activity android:name=".MainActivity" android:screenOrientation="fullSensor">
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/910ec268-992a-232f-85b7-705d06321cca.png)



## portrait


```xml
        <activity android:name=".MainActivity" android:screenOrientation="portrait">
```

回転させても、表示はタテ（一方向）に固定される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/a9b0286b-de44-8a95-f3fb-3e1a4a08afc9.png)
ANTLR4をC#から使ってみる #02 javaでのツリー構造の出力

ANTLRはもともとJavaのツールなので、C#で開発するにしてもJavaを使ったほうが良い場合もある。
ツリー構造を出力するのはその1例。

# Javaでのツリー構造の出力方法
[Antlrのサイト](https://www.antlr.org/)のQuick StartとSamplesの通り。

# 例

- 準備  
 - Quick Startに従い、jarファイルダウンロードと、antlr4.batとgrun.bat を作成
 - g4ファイルをbatの下のcalcフォルダにコピー
- コマンドプロンプトでcalcフォルダから下記を実行

```
SET CLASSPATH=.;C:\lib\Java\antlr-4.8-complete.jar;%CLASSPATH%
..\antlr4 Calculator.g4
javac Calculator*.java
..\grun Calculator expression -gui
```

- 最後のコマンド実行後に数式を入力
- Enterを押す
- ctrl-Zを押す
- Enterを押す
- ツリー構造が表示される。

再度実行する場合は、最後のコマンドの実行から行う。

#出力例
![antlr4_parse_tree3_tr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71468/17be7714-2a89-7a4f-fe26-cb3a1a58c710.png)

#補足
##grunのオプション
>
java org.antlr.v4.gui.TestRig GrammarName startRuleName
  [-tokens] [-tree] [-gui] [-ps file.ps] [-encoding encodingname]
  [-trace] [-diagnostics] [-SLL]
  [input-filename(s)]
Use startRuleName='tokens' if GrammarName is a lexer grammar.
Omitting input-filename makes rig read from stdin.
git pushしても、「Everything up-to-date」

ブランチで作業した後マージしようと
`git add -all`→`git commit -m "コミットメッセージ"`→`git push origin master`
をすると、

```
Everything up-to-date
```
という表示が出て、pushできない

以下を参考に
https://hacknote.jp/archives/15240/

```
git push git@github.com/◯◯◯.git ローカルブランチ名:master
```
をすると、成功
現在の日付をUNIX時間に変換する

# unixtimeとは

>UNIX時間（ユニックスじかん）またはUNIX時刻（ユニックスじこく、UNIX time（ユニックスタイム）、POSIX time（ポジックスタイム））とはコンピューターシステム上での時刻表現の一種。
UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数（すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの）として表される。
GPS時刻などとは異なり、大多数のシステムでは、本当の経過秒数を表すものではない。
wiki

```javascript
var date = new Date(); // 2020-06-08T09:23:53.264Z

// UNIXタイムスタンプを取得する (ミリ秒単位)
var a = date.getTime(); // 1591608233264

// UNIXタイムスタンプを取得する (秒単位 - PHPのtime()と同じ)
var b = Math.floor( a / 1000 ) ; // 1591608233
```
Kerasでの中間層出力の取得について私なりの回答

# どうやって中間層の値を取得するか
既に同じ問題に遭遇した先人の答え
[Kerasでの中間層出力の取得について](https://qiita.com/gen10nal/items/66de8bd9bdf55405083d)

# 私なりの回答

何が何でもカスタムモデルを利用して中間層を取得するスタイルです。

```python
import tensorflow as tf
import numpy as np


class MyModel(tf.keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()

    # noinspection PyAttributeOutsideInit
    def build(self, input_shape):
        self.dense1 = tf.keras.layers.Dense(units=input_shape[-1])
        self.dense2 = tf.keras.layers.Dense(units=input_shape[-1])
        self.dense3 = tf.keras.layers.Dense(units=1)

        self.h2_add = tf.keras.layers.Add()

        self.built = True

    def call(self, inputs, training=None, mask=None):
        h1 = self.dense1(inputs)
        h2 = self.h2_add([self.dense2(h1), inputs])

        # h2の値を取得したい
        outputs = self.dense3(h2)
        return outputs


def main():
    # 目的のモデル
    model1 = MyModel()

    # 踏み台を用意
    inputs = tf.keras.Input(shape=[3])
    outputs = model1(inputs)
    model2 = tf.keras.Model(inputs, outputs)

    # 目的の中間層の値
    h = model2.layers[1].dense3.input

    # 実際に学習などで利用するモデル
    model3 = tf.keras.Model(inputs, [outputs, h])

    x = np.random.randn(2, 3).astype(np.float32)

    # 実際に利用 
    y, h2 = model3(x)
    print(y)
    print(h2)


if __name__ == '__main__':
    main()
```

実行例

```console
tf.Tensor(
[[1.8381262 ]
 [0.71730536]], shape=(2, 1), dtype=float32)
tf.Tensor(
[[-1.2135824  -1.8959625  -0.9535742 ]
 [-0.61568236  0.62535363 -1.6006978 ]], shape=(2, 3), dtype=float32)
```

# Function APIだけで良くない？
3段階とかいったい何の冗談かといいたくなります。
とても回りくどいと思っています。

# カスタムモデルを利用するメリットはある
中間層の値を取得する部分で目的の中間層に**名前でアクセス**できます。

```python
# 目的の中間層の値
h = model2.layers[1].dense3.input
#                     ↑ MyModel.dense3
```

`model2.layers[1].dense3`は`model1.dense3`を指しています。(model1はカスタムモデル`MyModel`のインスタンス)
カスタムモデルを構築する際に各層に名前を付けるので、中間層を指定する際にその名前でアクセスできます。

Function APIを使う場合は名前を付けられないので、インデックスで指定するしかありません。
`model2.layers[1]`はまさにそのことの表れです。
インデックスの1はマジックナンバーです。

中間層を名前でアクセスできるのはメリットだと思います。
特にモデルの構造が複雑で入れ子になっている場合は全てのインデックスを適切に指定するのは人間の仕事ではないと思います。

# おまけ

```python
h2 = self.h2_add([self.dense2(h1), inputs])
```

の部分を

```python
h2 = self.dense2(h1) + inputs
```

にすると

```console
AttributeError: Layer dense_2 is not connected, no input to return.
```

というようにエラーになります。

普通にカスタムモデルを利用する分には全く問題ないのですが、今回のようにFunction APIで中間層を取得しようとするとエラーになります。

ResNetが登場した当時は、Kerasで実装する際にうっかり+演算子を使ってしまってエラーになった人は多いと思います。
Tensorflowがバージョン2になった今でも、ネットワーク構造を先に定義するということをしているので、バージョン1の頃とその点は変わっていないので、注意は必要です。
【Matlab】自分用忘備録 ~プロット編~

#ラベル操作

xtickslabel: x軸のラベルを操作する
ýtickslabel: y軸のラベルを操作する

```matlab:sample.m
x = linspace(0,10);
y = x.^2;
plot(x,y)
xticks([0 5 10])
xticklabels({'x = 0','x = 5','x = 10'})
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610270/60c25d82-a16c-592a-253a-3ae13b19db9c.png)
nodeとnpmとyarnをmacから削除したコマンド


```
$ which node
→ /usr/local/bin/node
$ sudo rm -rf /usr/local/bin/node
```

```
$ brew uninstall nodebrew
$ brew uninstall node
```

```
brew: brew uninstall yarn

tarball: rm -rf "$HOME/.yarn"

npm: npm uninstall -g yarn

ubuntu: sudo apt-get remove yarn && sudo apt-get purge yarn

centos: yum remove yarn

windows: choco uninstall yarn
```


## 参考

[How Do I Uninstall Yarn](https://stackoverflow.com/questions/42334978/how-do-i-uninstall-yarn)

[ローカルからnode.jsを削除する](https://qiita.com/gaipoi/items/406d6c4b1ccd1733318a)

[Node.js を完全にアンインストールする](https://qiita.com/ucan-lab/items/a662532f1ce46f152c4e)