OmniAICreator/Qiita-1.07M huggingface dataset:
【Java開発】第12回 final

#初めに

皆さん。こんにちは！

DreamHanksの254cmです。

今回はfinalについて説明していきます。

Java記事のまとめは[こちら](https://qiita.com/DreamHanks/items/6b1996e1f8ed66bbd456)です。

前回の記事は[【Java開発】第11回 static](https://qiita.com/DreamHanks/items/7892e78e833bbfad09e4)です。

#final

Javaプログラムでfinalの意味は最後で決めたので修正できませんという意味です。

つまり、finalが付与された要素は初期化の以後に修正することができません。

finalは変数、メソッド、クラスに付与できます。

##final変数

```java
final 型 変数名 = 値
```

finalが付与された変数は定数になります。

定数は変わらない数を意味し、定数で宣言した変数は値を変えることができません。

定数は英語の大文字と_で作成します。

普段、final変数はstaticと組み合わせて色んなところで共有する固定値を指定して使います。


**サンプル**

```java
public class FinalSample {		
	final int INDEX_LIMIT = 100;	
		
	public void display() {	
		System.out.println(INDEX_LIMIT);
		int[] arr = new int[INDEX_LIMIT];
		INDEX_LIMIT = 1005;
	}	
}		
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/bb90284c-1a32-ff76-1004-bef22c931feb.png)

上記のようにfinalは配列の長さなどの変わらない値を作成するために使われます。

しかし、作成されたfinal変数に値を変える動作を行うとコンパイルエラーが表示されます。

###・オブジェクト変数の場合

オブジェクト変数の場合、フィールドを変更することはできますが、

オブジェクト変数に新しいオブジェクトを代入することはできません。

**サンプル**

```java
public final class FinalSample {		
	public static void main(String[] args) {	
		final int RESULT = 10;
		RESULT++;
		
		final SampleClass SAMPLE = new SampleClass();
		SAMPLE.a = 10;
		SAMPLE.a = 15;
		
		SAMPLE = new SampleClass();
		
	}	
}		
		
class SampleClass {		
	int a;	
}		

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/c4178901-daea-e98c-a6cb-c98d009028c9.png)


###・引数の場合

引数にもfinalを付与することができます。

付与するとその引数は使われるメソッドの中で変更することができません。

**サンプル**

```java
public final class FinalSample {		
	public void finalTestMethod(final int a) {	
		a = 10;
	}	
}		
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/0c47859b-5c55-ccc1-d520-f0d6292bd93d.png)

##finalメソッド

finalメソッドは継承された子供クラスで再定義することができません。

**サンプル**

```java
public class ExampleCalss extends FinalMethodTest {		
	@Override	
	public final void printResult() {	
		
	}	
}		
		
class FinalMethodTest {		
	int result = 10;	
	public final void printResult() {	
		System.out.println(result);
	}	
}		
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/ea8b3204-9c5f-4167-258d-910d4079b0c1.png)

##finalクラス

クラスをfinalを付与して作成するとその内容を修正できますので継承ができません。

finalは変数やメソッドを再定義すると機能が正常的に動作されないクラスに付与して使います。

**サンプル**

```java
public class ExampleCalss extends ExtendTest {	
	public static void main(String[] args) {
	
	}
}	
	
final class ExtendTest {	
	int a;
}	
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/d174a64a-c5ad-8d3b-977b-2882f827bec6.png)

上記のようにfinalで宣言されたクラスは継承するとコンパイルエラーが表示されます。

#終わりに

今回の記事は以上になります。

次回はJavaの変数のスコープを学びましょう。

私たちの最新の記事は[こちら](http://blog.dreamhanks.com/java%e5%85%a5%e9%96%80%e8%ac%9b%e5%ba%a7/)で確認することができます。

ご覧いただきありがとうございます。
SpringBootで/errorに対応する自作Controllerを作成する方法

想定外の例外をログ出力するのに必要だったので、
SpringBootで/errorに対応する自作Controllerを作成する方法を調べた。

下記URLの通りにやれば可能。
https://www.logicbig.com/tutorials/spring-framework/spring-boot/implementing-error-controller.html

URLがリンク切れになった時ようにソースをコピペしておく。

```java:
@Controller
public class MyCustomErrorController implements ErrorController {

  @RequestMapping("/error")
  @ResponseBody
  public String handleError(HttpServletRequest request) {
      Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
      Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
      return String.format("<html><body><h2>Error Page</h2><div>Status code: <b>%s</b></div>"
                      + "<div>Exception Message: <b>%s</b></div><body></html>",
              statusCode, exception==null? "N/A": exception.getMessage());
  }

  @Deprecated
  @Override
  public String getErrorPath() {
      return "/error";
  }
}
```

APIの例外ハンドリングの情報は多いけど、この情報はなかなか出てこなかった。。

getErrorPathに@DeprecatedがないとGradleタスクのbootjar実行時にエラーになる
https://qiita.com/sakazoo/items/b4c9ae140df9d26e816f
プログラミング経験者がPythonを勉強し始めたときにありがちなミス

# はじめに
元々、サーバーサイドがメインでPHP、あるいは学校の授業でC言語を主に触っていました。今回、就活のコーディングテスト対策としてPythonが効率よさそうなので勉強し始めました。

Pythonを触った感想としては、他の言語よりシンプルすぎて、言われてる通り、まさに英語という感じです。非常にシンプルであるがゆえに、他の言語とは違い、少し戸惑ってしまいました。そこで、自分のよくある凡ミスをまとめます。Python初心者なので、そこのとこよろしくです。

# コロンの付け忘れ
自分はこれがめちゃくちゃ多いです。pythonはfor文とif文で{}を使わない分忘れてしまいます。

# for文の書き方が全然違う
ほとんどの言語は、

```
for(i=0;i<N;i++){
   #hogehoge
}
```
という書き方ですが、pythonでは、

```python
for i in range(0,N) :
    #hogehoge
else:
    #forが終わった後の処理
```
といった書き方です。forが終わった後の処理をelseで書けるのは見やすくていいですね！

# 配列の扱い方が楽すぎる

```python
if s in str : 
    print('s is in str')
if s not in str :
   print('s in not in str')
```

といったようにほぼ英語で書けます。その分、コロンを忘れやすいのですが。。。まあ、慣れですね。

#  pythonは書いてて楽しい！
といった感じで他の言語とは一線をなしてる感はあるのですが、書いててめちゃくちゃ楽しいです。あと、記述量がめちゃくちゃ少なくていいですね！！もっと勉強頑張ります。
Rubyにおける日時の扱い。DateとTimeの使い分け。


# はじめに
Rubyにおける日付や時刻の操作にはDateクラス、Timeクラスを使います。
Dateクラスは年月日だけを扱い、Timeクラスは年月日時分秒を扱います。
Timeクラスだけ使っておけばいいような気がしますが、Dateクラスにも得意分野があるので、その使い分けについて解説していきます。

# 目次
１．Dateは年月日、Timeは年月日時分秒
２．Dateクラスは日付処理が得意
３．結論

# １．Dateは年月日、Timeは年月日時分秒
まず、時分秒まで表示したい、つまり、日時を扱いたい場合はTimeを使います。DateクラスのサブクラスであるDateTimeクラスも使えますが、require 'date'しないといけないことや、サマータイム、うるう秒を扱えないことなどを考慮すると、Timeクラスを使っておくのが無難だと思われます。

# ２．Dateクラスは日付処理が得意
日付や年単位での処理はDateクラスを使うと便利です。

```pry

[1]pry(main)> Date.today.next_month # 来月の同日
=> #<Date: 2020-10-29 ((2459152j,0s,0n),+0s,2299161j)>

[2] pry(main)> Date.new(2020,10,-1) # 月末日（２０２０年１０月）
=> #<Date: 2020-10-31 ((2459154j,0s,0n),+0s,2299161j)>

[3] pry(main)> Date.today.leap? # うるう年の判定（今年＝２０２０年）
=> true

[4] pry(main)> Date.today.next_year.leap? # うるう年の判定（来年＝２０２１年）
=> false

[5] pry(main)> Date.today + 3　# 3日後
=> #<Date: 2020-10-02 ((2459125j,0s,0n),+0s,2299161j)>

[6] pry(main)> Date.today - 7 # １週間前（７日前）
=> #<Date: 2020-09-22 ((2459115j,0s,0n),+0s,2299161j)>

[7] pry(main)> Date.today >> 6　# 半年後（６ヶ月後）
=> #<Date: 2021-03-29 ((2459303j,0s,0n),+0s,2299161j)>

[8] pry(main)> Date.today << 1　# 1ヶ月前
=> #<Date: 2020-08-29 ((2459091j,0s,0n),+0s,2299161j)>

```
来月の同日や月末日の取得、うるう年の判定などを簡単にできるのは便利です。
また、日付のインクリメント、デクリメント操作はTimeクラスでは、秒単位で扱わなければならないため少々面倒くさいです。その点、Dateクラスでは日単位は、+ と - ,月単位は << と >> で楽にできる。

# ３．結論
時刻まで表示したいときなど、基本的にはTimeクラスを使えばいいが、日、月、年単位での処理を主に行うときはDateクラスを使うと便利。
[Unity] Component GUI Layer in Main Camera for Scene Assets/****.unity is no longer available.

## TL;DR

Cameraにアタッチされている，`Flare Layer`を削除(無効化)すると治る！

## なんでなったの？

Unityのバージョンを2019.4.8f1にあげたところ，エラーが発生しました．

ビルドするときに，一応ビルドは完了するが，毎回このエラーが大量にでるのはうっとうしいので，使っていないなら消したほうがいいと思います．

## やり方

1. 無効化するときは，チェックボックスを外すとできます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487681/da18f0e3-56aa-48c5-7438-aea5062d8cf2.png)

2. 削除するときは,　右の3点マークをクリック(or右クリック)で`remove component`を選択するとできます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487681/f33b6e8c-7c82-6464-ecc3-97e624e1b257.png)

無効化している時点で，使っていないはずなので，削除してあげるほうがいいと思います．
PowerToys Run

https://github.com/microsoft/PowerToys/wiki/PowerToys-Run-Overview

#機能
Microsoftがオープンソースで開発しているコマンドライン型のランチャー。まだ機能が少ない。

- ファイル操作：インクリメンタルサーチを行い、選択したファイル/フォルダーに対して以下の操作が行えます。
    - ファイルを実行する
    - 管理者権限で実行する
    - パスをクリップボードにコピーする（実行ファイルは対象外）
    - エクスプローラーで開く
    - コマンドラインプロンプトで開く
- 計算機：検索ボックスに式を入力すると計算結果が表示されます。
    - [Enter]を押すと計算結果がクリップボードにコピーされる。

#基本操作
検索ボックスを表示/非表示は、設定で変更可能

|操作|動作|
|---|---|
|[Alt]+[Space]|検索ボックスを表示/非表示が押すたびに切り替わる|
|[ESC]|検索ボックスを非表示|
|[Ctrl]+[Shift]+[Enter]|管理者権限で実行する|
|[Ctrl]+[Shift]+[e]|エクスプローラーで開く|
|[Ctrl]+[c]|パスをクリップボードにコピーする|
|[Tab]|検索結果を順番にフォーカスする|
gitコマンドまとめ（よく使うやつ）

#よく使うコマンドをまとめる


```
$ git checkout -b <ブランチ名> origin/<ブランチ名>
```
 ローカルに持ってきてブランチ切り替え

 ```
$ git reset HEAD --hard
 ```
 現在のディレクトリの全てのファイルをリセット(HEADは直前）

  ```
$ git branch -D <ブランチ名>
  ```
 ブランチを削除　detached HEADの時に使える

```
$ git log --oneline
```

１行でlogを見る

```
$ git checkout -- <file_name>
```

Fime_nameの変更点を消せる

```
$ git commit --amend
```

前回のコミットに変更点を載せるイメージ

 ```
$ git checkout -b <ブランチ名>
 ```

 ローカルにブランチを作る

 ```
$ git push origin HEAD
 ```
current branch に push （5/3 追記）

 ```
$ git checkout -b remotes/origin.... orgin/....
 ```
リモートリポジトリにローカルリポジトリに
ANTLRをKotlinで使うための環境構築

## はじめに
最近ANTLRを使う機会があったのでKotlinのプロジェクトへの導入方法を簡単に書いておきます。
環境構築と言っていますが、KotlinとGradleの環境があれば用意するものはないです。

## Gradle
GradleがANTLRをサポートしているのでGradleを使うのが楽だと思います。
今回の記事では[Gradle公式ページ](https://docs.gradle.org/current/userguide/antlr_plugin.html)に載っているものに少し足すだけで足ります。

```build.gradle.kts
plugins {
    kotlin("jvm") version "1.4.10"
    application
    antlr
}

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib"))
    antlr("org.antlr:antlr4:4.7.2")
}

application {
    mainClassName = "MainKt"
}

tasks.generateGrammarSource {
    maxHeapSize = "64m"
    arguments = arguments + listOf("-visitor", "-long-messages")
}
```

## 文法定義ファイル
まず、src/mainの下にantlrディレクトリを作ります。このディレクトリの下に.g4ファイルを置きます。今回はsrc/main/antlr/Hello.g4を用意します。

```Hello.g4
grammar Hello;
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
```

このファイルを作成したら、コンソールで以下のコマンドを打ってください。

```shell:
$ ./gradlew generateGrammarSource
```

これをすると、buildディレクトリの中に構文解析用のjavaファイルが生成されてるはずです。

## Kotlin
先ほど生成されたファイルを使用してみましょう。
src/main/kotlin/Main.ktを用意します。

```Main.kt
import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream

fun main() {
    val text = CharStreams.fromString("hello world")
    val lexer = HelloLexer(text)
    val tokenStream = CommonTokenStream(lexer)
    val parser = HelloParser(tokenStream)

    println(parser.r().children)
}
```

これを実行してみましょう。

```shell:
$ ./gradlew run
```

実行して`[hello, world]`と出力されていたら成功です。

## おわり
Gradleに慣れていると結構簡単にできちゃいます。
これを機にMavenから乗り換えてみては
Navigator operation requested with a context that does not include a Navigator

flutterで`RaisedButton`に`Navigator`を入れたらタイトルのエラーが発生しました

`Builder`で囲むことで対処できました。

```
// だめ
RaisedButton(
  onPressed: () {
  print("入った");
  Navigator.push(context, MaterialPageRoute(builder: (context) => GoogleMapSample()));},
  child: const Text('Mapをみる', style: TextStyle(fontSize: 20),),
),

// ok
Builder(
  builder: (context) {
    return RaisedButton(
      onPressed: () {
      print("入った");
      Navigator.push(context, MaterialPageRoute(builder: (context) => GoogleMapSample()));},
      child: const Text('Mapをみる', style: TextStyle(fontSize: 20),),
    );
  },
),
```
###参考記事
[【Flutter】画面遷移でのエラーについて](https://teratail.com/questions/294503)
知識の構造(ツリーではない)



# 「パタン・ランゲージ」

大学に入って驚くのは，思っていたほど講義が難しくない割に，知識が定着しないことです．これは，なぜでしょうか? ひとつの答えは，扱う知識そのものが確立していないからかな．では，そもそも知識と言うのはどんな構造をしているのでしょうか．より身近でわかりやすい建築を例に紹介します[^nishitani\_11]．

ケンブリッジ大の数学科に進んで後に建築家になったクリストファー・アレグザンダーが1977年に著した「パタン・ランゲージ」では，都市・町並み・家・部屋などの建築の全ての構成物を形式・粒度によって分類し，「無名の質」という美意識を基準にカタログとして提供しています[^alexandar]．

アレグザンダーが提案した知識構築への考え方は，複雑な全体像を理解，記憶，利用しやすいように，「階層構造，細かな分類，相互参照」など構造的にすることです．小さい部分から見始めても，大きな全体像から見ても理解できるようになっています．さらに，図1 に示したように体裁を整えて「名称，写真や図，上位参照，問題，考察，解答，下位参照」が定まった順序に提供されています．

| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/b363dbfb-0f0f-fca4-92e4-95bc07a7e57d.png)|
|:--------------------------------------------------------------------------------------------------------------|
| 図1:パタン・ランゲージの「No.115:生き生きとした中庭」を例にした体裁 [3]．                                     |

これだけではわかりにくいですが，図2にまとめ直したように，粒度の上下項目との関連や，問題，一目で分かるイラスト，箇条書きのまとめ等によって覚えやすい工夫がなされています．粒度や上下参照はまさに頭の中にある知識構造を表出させたようなイメージを与えてくれます．木構造，あるいはピラミッドのような，単一のルートによって上下関係や階層構造が定められているのでないというのが肝です．あるいは，「逆引き」という形態での知識提供の源流なのかもしれません．

| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/2838629f-4a74-5dd1-94f7-564ef4fced85.png)|
|:--------------------------------------------------------------------------------------------------------------|
| 図2:パタン・ランゲージの「No.115:生き生きとした中庭」を中心にして，粒度，上下 参照の模式図，問題，覚えやすいイラスト， 箇条書きの解答．|

現実の庭はこのような美意識を逆撫でするように作られています．残念ですよね．

| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/1fcd78c9-44b6-8e99-2ddc-31663ecc5149.png)|
|:--------------------------------------------------------------------------------------------------------------|
| 図3:現実の中庭．                                                                                              |

このような知識の構造は，セミラティスとかリゾームと呼ばれています[^kato]．セミラティスの構造を再現しようというのが，BobTheFish shellです(嘘)．でも，wikiはこれを原点にしています(ホント)[^ewatari] ．領域やマルチスケールでは，こういう視点で知識を習得する練習をしていきます．まずはメモソフトのmy\_helpから．


# 引用文献

[^nishitani\_11]: 西谷滋人，廣岡愛未著，「パターンとペアプロの数式処理ソフト学習への適用」，RIMS研究集会報告書(2011). 

[^ewatari]: 江渡浩一郎著，「パターン，Wiki，XP」，(技術評論社，2009).

[^alexandar]: クリストファー・アレグザンダー著，平田翰那訳「パタン・ランゲージ環境設計の手引」,(鹿島出版会1977).

[^kato]: 加藤弘一.『パターン、wiki、xp~時を超えた創造の原則~』江渡浩一郎(技術評論社), [書評空間::紀伊國屋書店 kinokuniya::booklog](https://booklog.kinokuniya.co.jp/kato/archives/2010/07/post_206.html)．



------
 - **source** ~/Desktop/lecture_24f/multi_scale_24f/w4_hyper_card/hyper_card/semi_lattice/pattern_language.org
Amplifyで簡単にHostingする

# 前提
- これまでの記事を前提に作成しております。
    - [[Amplify, (ionic) Angular ] 一日で認証付きチャットツールを作成（準備編）](https://qiita.com/taaabooon/items/957cba923ceddc55a5b2)
    - [[Amplify, (ionic) Angular ] 一日で認証付きチャットツールを作成（実装編）](https://qiita.com/taaabooon/items/2a6c1d8c3a5205ebdde4)
    - [Amplify mockがすごく便利！](https://qiita.com/taaabooon/items/ac20e1eac5963719b231)

# 実行

- AmplifyにHostingを追加する

```
$ amplify add hosting
```

- CDNであるCloudFrontとS3を使用してホスティングします。

```
? Select the plugin module to execute: Amazon CloudFront and S3
```

- SSL対応したいために下記を選択

```
? Select the environment setup: PROD (S3 with CloudFront using HTTPS)
``` 

- S3のバケット名を指定します。

```
? hosting bucket name: test-chat
```

- 設定をAmplifyに反映にします

```
$ amplify publish

| Category | Resource name              | Operation | Provider plugin   |
| -------- | -------------------------- | --------- | ----------------- |
| Hosting  | S3AndCloudFront            | Create    | awscloudformation |
? Are you sure you want to continue? (Y/n) Y
? Do you want to update code for your updated GraphQL API (Y/n) Y
? Do you want to generate GraphQL statements (queries, mutations and subs
cription) based on your schema types?
This will overwrite your current graphql queries, mutations and subscript
ions (Y/n) Y
```

・
・　10分ほど待つ
・

- 下記が出力されることを確認する

```
✔ Uploaded files successfully.
Your app is published successfully.
https://d3sddsev2inq7d.cloudfront.net
```

- アクセスしてみる

![スクリーンショット 2020-09-29 14.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176216/69e6a6f4-8bd4-c586-1f75-53d62e75f1a5.png)

アクセスできない。

今回はCloudFrontからS3に接続しているので、CloudFrontのコンソールを確認してみる。
![スクリーンショット 2020-09-29 14.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176216/86ed91da-ed69-c0de-7ca7-62f3ad2b6671.png)

赤枠のところが Progressのままでは、アクセスできないので、 Enableまで待つ

- Enableになったら、アクセスしてみる

![スクリーンショット 2020-09-29 14.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176216/db406c56-3190-e8b6-c167-a58c905bf6ee.png)


# まとめ
AmplifyはAWSの各サービスがパッケージされており、コマンド一つで簡単に開発からホスティングまで可能となる

次は、Route53を使用して独自ドメインでホスティングしてみようと思います。
Pandas100本ノック on Google Colaboratory


Python初学者のためのPandas100本ノック
https://qiita.com/kunishou/items/bd5fad9a334f4f5be51c

ColabでPandas100本ノック動きます。
https://colab.research.google.com/drive/1xITqd8wQC-EfYlPZlMydeCZDJl1nNNAy?usp=sharing
ルーティングのネストによって起きていること

動作環境
Ruby 2.6.5
Rails 6.0.3.2

ルーティングのネストによって何が起きているのかがわかりづらかったので、自分の確認を兼ねて投稿してみました。

##ルーティングのネストをした場合
```ruby:routes.rb
Rails.application.routes.draw do
  resources :hoges do
    resources :fugas, only: [:index]
  end
end
```
上記のコードでは、hogesに対してfugasがネストされており、ターミナル上でrails routesを実行すると、以下のようになります。

Prefix ➡︎ hoge_fugas
Verb ➡︎ GET
URI Pattern ➡︎ /hoges/:hoge_id/fugas(.:format)
Controller#Action ➡︎ fugas#index

もちろん、上記以外も表示されますが今回はネストの箇所のみを扱います。
これだけだといまいちわかりづらいので、ルーティングのネストをしていない場合と比較していきます。

##ルーティングのネストをしない場合
```ruby:routes.rb
Rails.application.routes.draw do
  resources :hoges
  resources :fugas, only: [:index]
end
```
上記のコードでは先ほどのコードと違い、ネストされていません。では先ほどと同様にターミナル上でrails routesを実行して、同じ箇所を確認してみましょう。

Prefix ➡︎ fugas
Verb ➡︎ GET
URI Pattern ➡︎ /fugas(.:format)
Controller#Action ➡︎ fugas#index

先ほどと比べてPrefixとURI Patternが異なっていることがわかります。
PrefixはURI Patternを簡単に書いたものなので、URI Patternのみに注目していきます。

##ルーティングのネストをした場合としない場合の違い

ネストした場合
URI Pattern ➡︎ /hoges/:hoge_id/fugas(.:format)
ネストしない場合
URI Pattern ➡︎ /fugas(.:format)

つまり、ルーティングのネストとはURI Patternを変更するために行っているものと言えると思います。しかし、この言い方だとわかりづらいと思うので、もう少し詳しく説明します。

ネストすることによってURI Patternが変更したためにfugasコントローラーのindexアクションを作動するには、hoge_idを指定する必要が出てきます。
そのため、paramsの中にhoge_idを入れることができるようになります。
つまり、先ほどはルーティングのネストをURI Patternを変更するためのものと言いましたが、**paramsの中にネストする側（今回はhoge）のid情報を入れるためのもの**と言い換えることができます。

paramsにネストする側（今回はhoge）のid情報を入れることにより、ネストされた側（今回はfuga）のコントローラー内でネストする側の情報を扱うことができるということになります。
iOS 14からUNNotificationPresentationOptionsの「.alert」が「.banner」と「.list」に分かれた

## はじめに

プッシュ通知の表示オプション（ `UNNotificationPresentationOptions` ）に `.alert` がありますが、iOS 14 から非推奨になりました。
代わりに `.banner` と `.list` の2つに分かれ、これらの挙動を調べたので紹介します。

## 環境

- Xcode：12.0 (12A7209)
- Swift：5.3
- iOS：14.0

## プッシュ通知の挙動

以下の表の通りです。

`.alert` ではバナーと通知センターの両方に通知が来ましたが、iOS 14からは `.banner` と `.list` を使うことでどちらか片方のみに通知が来るようにできます。

|UNNotificationPresentationOptions|バナー|通知センター|
|:--|:--|:--|
|`.alert`|![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-09-29 at 13.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/d895f500-4571-5e7e-43c3-538360a4c60e.png)|![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-09-29 at 13.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/88744de1-ed46-b3e4-4ca9-e6493b3d8fd5.png)|
|`.banner`|![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-09-29 at 13.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/d895f500-4571-5e7e-43c3-538360a4c60e.png)|![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-09-29 at 13.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/cf6d7116-975f-9eb3-a731-649b1515a4c1.png)|
|`.list`|![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-09-29 at 13.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/e7398f5d-18e5-343b-3fa1-cc8fd390dda8.png)|![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-09-29 at 13.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/88744de1-ed46-b3e4-4ca9-e6493b3d8fd5.png)|

## 実装

iOS 13以前も引き続き対応する場合、OSのバージョンで分岐させるのがベターです。

```swift:AppDelegate.swift
extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(
        _ center: UNUserNotificationCenter,
        willPresent notification: UNNotification,
        withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        if #available(iOS 14.0, *) {
            completionHandler([.banner, .list, .sound])
        } else {
            completionHandler([.alert, .sound])
        }
    }
}
```

## おまけ：シミュレータでプッシュ通知を試す

iOSのシミュレータにプッシュ通知を送るのは、以下の記事が役立ちました。
https://qiita.com/koogawa/items/85c0dd0abd2f1970c5fc

こちらの記事のおかげで、プッシュ通知をかんたんに送って試すことができました。

## おわりに

iOS 14からは通知の表示を細かく制御できるようになったことがわかりました。
`.list` のみ指定することでAndroidのサイレント通知のように使えたりと、使いこなせると便利そうです。

もし便利な使いみちがありましたら、コメントなどで教えていただけると嬉しいです :relaxed:

## 参考リンク

- [UNNotificationPresentationOptions | Apple Developer Documentation](https://developer.apple.com/documentation/usernotifications/unnotificationpresentationoptions)  
~~`.banner` と `.list` が「No overview available.」でなければ本記事を書かなくて済んだのはナイショ~~  
2022/02/08に確認したら説明が追加されていました
- [How to use `UNNotificationPresenta… | Apple Developer Forums](https://developer.apple.com/forums/thread/661953?login=true&page=1#637286022)
- [UhooiPicBook/AppDelegate.swift at master · uhooi/UhooiPicBook](https://github.com/uhooi/UhooiPicBook/blob/master/UhooiPicBook/AppDelegate.swift)
SorbetでRubyに型を付けてみた

# SorbetでRubyに型を付けてみた

`sorbet`というGemと遊んでみた。

https://sorbet.org/

Rubyに漸進的に型を付けるライブラリーだ。

## 自己紹介

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457797/89402d68-ae95-b662-e0fe-9a3eb087262b.jpeg" width="300" />
アメリカ人で、日本は３年目。

１年強、東京の[ユニークビジョン](https://uniquevision.co.jp/)で働いている。

## きっかけ

実は、RubyもRailsも苦手！全部魔法的に見える。型で探検したい。

そして`sorbet`でRailsにも型が定義されている。

https://github.com/chanzuckerberg/sorbet-rails

---

# 「漸進的型付け」とは？

プログラミング言語の中で、「強い型付け」と「弱い型付け」言語が存在する。

「強い型付け」は例えば、型が合わないとコンパイルできない言語。

それに引き換え、「弱い型付け」言語は型が使えるが、別に頑張って合わせる必要がない。

また、その方が実行時（dynamic）、コンパイル時（static）にチェックされると言う軸もある。
<center>
![1_BddwVWW6hFU0miT9DCbUWQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457797/31616832-fc68-3c64-43b6-1a3b1f064e7f.png)
</center>

要するに、漸進的型付けとは、プロジェクトを部分的に「static」と「strong」の右上の隅に引っ張っていくことだ。

普段は関数単位あるいはファイル単位で行われていると思う。

`sorbet`はRubyの型を強くしない。代わりに、ファイル単位での型チェックをコンパイル時に移動する。

---

# `sorbet`の例（１）

```ruby
sig do
  params(
    name: String
  )
  .returns(String)
end
def get_welcome_message(name)
  "Welcome, #{name}!"
end
```

`bundle exec srb tc`

```
No errors! Great job.
```

---

# `sorbet`の例（２）

```ruby
sig do
  params(
    name: String
  )
  .returns(String)
end
def get_welcome_message(name)
  43110
end
```

`bundle exec srb tc`

```
lib/main.rb:14: Returning value that does not conform to method result type https://srb.help/7005
    14 |    43110
            ^^^^^
  Expected String
    lib/main.rb:13: Method `get_welcome_message` has return type `String`
    13 |  def get_welcome_message(name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Got Integer(43110) originating from:
    lib/main.rb:14:
    14 |    43110
            ^^^^^
Errors: 1
```

---

# 複雑な型

関数に型を付ける以外にも機能はたくさんある。例えば、`nil`の場合：

```ruby
sig {params(x: T.nilable(String)).void}
def foo(x)
  if x
    puts "x was not nil! Got: #{x}"
  else
    puts "x was nil"
  end
end
```

```ruby
# without this T.let, x would have the inferred type NilClass
x = T.let(nil, T.nilable(Integer))
(0..10).each do |n|
  x = n if n % 3 == 0
end
```

---

# ユニオン型

```ruby
class A
  extend T::Sig

  sig {params(x: T.any(Integer,String)).void}
  def self.foo(x); end
end

# 10 and "Hello, world" both have type `T.any(Integer, String)`
A.foo(10)
A.foo("Hello, world")

# error: Expected `T.any(Integer, String)` but found `TrueClass`
A.foo(true)
```

---

# flow typing

```ruby
sig {params(x: T.nilable(String), default: String).returns(String)}
def maybe(x, default)
  # (1) Outside the if, x is either nil or a String
  T.reveal_type(x) # => Revealed type: `T.nilable(String)`

  if x
    # (2) At this point, Sorbet knows `x` is not nil
    T.reveal_type(x) # => Revealed type: `String`

    x
  else
    # (3) In the else branch, Sorbet knows `x` must be nil
    T.reveal_type(x) # => Revealed type: `NilClass`

    default
  end
end
```

---

# まとめ／感想

いいところ

1. `sorbet`はRubyの型チェックを開発時にしてくれる。
2. 型を定義する仕組みはたくさんある。TypeScriptに近い！
3. ツールがそろっているみたい（VSCode拡張機能など）。

どうかな、というところ

1. 個人的に、型定義の構文が読みにくいと思う。
2. 当然だが導入後は学習コストはある。

---

# 以上

ご清聴、ありがとうございました！

機会があれば、ぜひ使ってみてください。

https://sorbet.org/
AWS ALBリスナールール変更

リスナールールでターゲットグループを重み付け指定するコマンド

```cli:
aws elbv2 modify-rule \
--rule-arn "<arn:ListenerRule>" \
--actions \
'[{
   "Type": "forward",
   "Order": 1,
   "ForwardConfig": {
    "TargetGroups": [
       { "Weight": 1, "TargetGroupArn": "<arn:TargetGroup>" },
       { "Weight": 0, "TargetGroupArn": "<arn:TargetGroup>" }
     ]
   }
}]'
```
[aws:modify-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-rule.html)
【Java7以降】一時ファイル削除漏れを防ぐ

# 目的
一時ファイルの削除し忘れや、異常終了時にファイル削除されずに終了してしまうことを防ぐ。

# 実装例
### delete文を使用してファイル削除
```java:delete文で一時ファイル削除
    Path path = null;
    try {
        // 一時ファイル作成
        path = Files.createTempFile("test", ".tmp");
        OutputStream out = Files.newOutputStream(path);
        String data = "test";
        out.write(data.getBytes());

        // ファイルに書き込み
        out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 処理終了時にファイル削除
        Files.deleteIfExists(path);
    }
```
この実装では、JVM異常終了時には削除されないこともあるようです。

### DELETE_ON_CLOSEを使用してファイル削除
```java:DELETE_ON_CLOSEを使用した一時ファイル削除
    Path path = null;
    try {
        // 一時ファイル作成
        path = Files.createTempFile("test", ".temp");
        try (BufferedWriter bw = Files.newBufferedWriter(path, StandardOpenOption.DELETE_ON_CLOSE)) {
            String data = "test";
            // ファイルに書き込み
            bw.write(data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
```
StandardOpenOptionのDELETE_ON_CLOSEは、ファイルのオープン時のオプションとして利用すると
ストリームをクローズした時に自動的にファイルが削除される。
さらに「try-with-resources」構文を使用することで、close処理を実装しなくても自動的にクローズとファイル削除が実行されるので、実装もすっきりして削除漏れもなくなります。
win環境のOracleDBでリスナー起動時にTNS-12560エラーが表示される

#概要
タイトルの通り、以下のエラーが表示される

```
C:\Users\username>lsnrctl start
LSNRCTL for 64-bit Windows: Version 12.2.0.1.0 - Production on 29-9月 -2020 13:32:06
Copyright (c) 1991, 2016, Oracle.  All rights reserved.

tnslsnrを起動しています。お待ちください...
Unable to OpenSCManager: err=5
TNS-12560: TNS: プロトコル・アダプタ・エラー
 TNS-00530: プロトコル・アダプタ・エラーです。
```
※今回はlsnrctlコマンドでリスナー名を指定していないため、デフォルトリスナーが起動の対象となっている

#環境
windows10
Oracle 12c release2

#対処
コマンドプロンプトを「管理者として実行」して同じコマンドを実行するとエラーが発生せずに起動できた

```
C:\WINDOWS\system32>lsnrctl start
LSNRCTL for 64-bit Windows: Version 12.2.0.1.0 - Production on 29-9月 -2020 13:41:48
Copyright (c) 1991, 2016, Oracle.  All rights reserved.

tnslsnrを起動しています。お待ちください...
TNSLSNR for 64-bit Windows: Version 12.2.0.1.0 - Production
システム・パラメータ・ファイルはC:\app\user\product\12.2.0\dbhome_1\network\admin\listener.oraです。
ログ・メッセージをC:\app\user\diag\tnslsnr\DESKTOP\listener\alert\log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=DESKTOP)(PORT=1521)))

(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for 64-bit Windows: Version 12.2.0.1.0 - Production
開始日                    29-9月 -2020 13:41:55
稼働時間                  0 日 0 時間 0 分 4 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      C:\app\user\product\12.2.0\dbhome_1\network\admin\listener.ora
ログ・ファイル            C:\app\user\diag\tnslsnr\DESKTOP\listener\alert\log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=DESKTOP)(PORT=1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。


```
画像分類モデルをCore MLに変換する

#画像分類モデル変換はクラス・ラベルを指定する
![スクリーンショット 2020-09-29 13.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3ed0f04f-6702-2206-eebf-2aa8341ccf67.png)
###1,クラス・ラベル・ファイルを読み込む。
クラスラベルファイルはモデルの作成者から提供されていることが多いみたいです。

```python
class_labels = open('labels.txt', 'r').read().splitlines()
print(class_labels)
### ['black', 'white', 'grey', ...] 
```

###2,クラス・ラベルがString型の配列であることを確認しておきます。

```python

for i, label in enumerate(class_labels):
  if isinstance(label, bytes):
     class_labels[i] = label.decode("utf8")
```

###3,Core ML ToolsのClassifier Configという形式でクラス・ラベルを指定して変換します。

```python
import coremltools as ct

image_input = ct.ImageType(shape=(1, 224, 224, 3,),
                           bias=[-1,-1,-1],
                           scale=2/255)

classifier_config = ct.ClassifierConfig(class_labels)

mlmodel = ct.convert(model,
                     inputs=[image_input],
                     classifier_config=classifier_config)
```

🐣

****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
gzipメモ

ファイルを最大圧縮率で圧縮

```
# gzip -9 ファイル名
```

ファイルを圧縮させながら別の場所に吐き出させる場合

```
# cat error_log | gzip -9 >> /tmp/error_log.gz
```

圧縮させたファイルの中身を見たいだけなら

```
# zcat 圧縮ファイル名
```

通常のファイルをlessで確認するのと同様にしたいならzless

```
# zless 圧縮ファイル名
```

圧縮ファイルの中で特定の文字列を含む箇所を見つけたい時は zgrep が使える

```
# zgrep 文字列 圧縮ファイル名

これも同様の結果
# zcat 圧縮ファイル名 | grep 文字列
```

tar+gzip圧縮（tar zcpvf xxx.tgz aaa bbb）したファイルの中身は less で確認できる。
Laravel Passportでgrant_typeを制限する

https://qiita.com/h1na/items/25a08122418df782d2b9
ここにほとんど書いてある


Laravel公式に追加しろって書いてある`Passport::routes();` ←これ

```php
public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }
```

たどってPassport.phpをみてみると、 デフォルトのコールバックが`$router->all();`

```php
public static function routes($callback = null, array $options = [])
    {
        $callback = $callback ?: function ($router) {
            $router->all();
        };
    }
```

all()って何？って思ったら`\Laravel\Passport\RouteRegister`に書いてあった

```php
public function all()
    {
        $this->forAuthorization();
        $this->forAccessTokens();
        $this->forTransientTokens();
        $this->forClients();
        $this->forPersonalAccessTokens();
    }
```

じゃあ例えば、`forAuthorization`と`forAccessTokens`だけ使いたい！ってなったとき

```php
        Passport::routes(function (RouteRegistrar $router) {
            $router->forAuthorization();
            $router->forAccessTokens();
        });
```

こうすればいい
勉強日誌24日目

今日からは記入形式だけでなく模擬試験も取り入れる
記入形式は安定して8割以上
模擬試験は安定して9割以上解けたら受験することにしました。
ここ1年は色々と行動したので余裕がないのでお金のこと考えるとなかなか踏み出せないですね。

筋トレも自衛隊教官流継続中
英語に毎日触れることも継続中

記入形式で出題されなかった10進数の問題と詳しいgpg sshの問題が出ると弱い


模擬試験正答率88%(86)

暗号化したファイルを別のユーザに送信するときは相手ユーザの公開鍵が必要

ssh-keygenコマンドで公開鍵/秘密鍵のペアを作成する
ユーザの公開鍵は　id_鍵の種類.pub
公開鍵方式を用いたSSH接続の説明

/etc/aliases
あるメールアドレスに宛に送られてきたメールを別のメールアドレスに転送するように設定

個別のメールアドレスなら~/.forward

公開鍵では受信者の公開鍵で暗号化→受信者が自身の秘密鍵で複合
共通鍵暗号方式ではデータを送信する相手ごとに鍵を作成

-l
-full
systemdの動作するシステムで、各Unitが出力する表示可能なログをすべて表示

正答率　84%(71)

timedatectl status
現在のシステム時刻や時刻同期の状態を表示するsystemd

server
時刻を取得するNTPサーバを指定、自信は「クライアントとしてNTPサーバの時刻に同期」する関係

ntpq -p
時刻サーバなどの表示(remote refid など)

timedatectl set-time "年-月-日 時:分:秒"

pool
複数のNTPサーバを集約した名前

正答率　79%(61)

-D
--directory
journalctlのオプションで指定した「ディレクトリ」のログを表示

/var/log/journal
「systemd-journald」のログを永続的に保存させるディレクトリ

/etc/logrotate.conf
logrotate
ログローテーションの設定ファイル
ログローテーション機能

_SYSTEMD_UNIT=
journalctlでログの指定

--since
--until
journalctlのオプションで特定の期間のログに限定して表示

/etc/systemd/journald.conf
systemd-journald デーモンの設定ファイル

正答率　92%(60)

/etc/cups
印刷サービスCUPSの設定ファイルが置かれるディレクトリ

lpstat
CUPSの標準的な印刷コマンドで、プリントキューにある印刷ジョブを表示するコマンド
TensorFlow1のモデルをCore MLに変換する

#グラフからの変換

TensorFlow1からの変換は、
**１、凍結グラフからの変換**
**２、グラフからの直接変換**
があります。
*１、の凍結グラフの作成方法については「[AnimeGANv2をCore MLに変換してiOSでつかう](https://qiita.com/john-rocky/items/e4c757306b4d8f0f2c36)」とおなじです。*

#TensorFlow1の変換

###１、凍結グラフからの変換

```python

mlmodel = ct.convert('inferrence.pb')
```
###２、グラフからの直接変換

```python

mlmodel = ct.convert(self.sess.graph)
```
グラフからの直接変換は、sess.runしているスクリプトの下に書き込んでしまうのがおすすめです。

****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
脆弱性診断とは

#はじめに
待機期間を利用して、研修で少しかじった「脆弱性（脆弱性診断）」について、もう少し深く学びたいと思い、現在コツコツと勉強を進めています。
今回は、「**脆弱性**」ってなに？　「**脆弱性診断の対象**」って？などについて、簡潔にまとめてみました。
#そもそも脆弱性とは？
プログラムの間違いは「**バグ**」と呼ばれており、意図したとおりにプログラムを動作させたい場合には、プログラムからこの「バグ」をなくす必要がある。

「バグ」の中にはそれを悪用することで、「**情報漏洩**」を起こしてしまったり、データの不正な書き換えを起こしたりしてしまう可能性が高いものがある。

こういった悪用可能な「バグ」を「**脆弱性**」と呼ぶ。
#脆弱性ってどうやって見つけるの？
「脆弱性」も「バグ」を見つけるのと同様で、脆弱性を見つけるためのテストを実施することで発見することが可能。

そのテストのことを「**脆弱性診断**」という。

また脆弱性診断では、「脆弱性」以外にも「**セキュリティ機能の不足**」を発見することが可能。

★脆弱性診断は「**セキュリティテスト**（Security Testing）」と訳すが、「**ペネトレーションテスト（Penetration Testing）**」と訳されることもある！

#主な脆弱性診断の対象　　～2つ～
脆弱性診断は診断対象によって分類されていて、主に下記の2つ。

* プラットフォーム脆弱性診断
*  Webアプリケーション脆弱性診断

#プラットフォーム脆弱性診断
≪対象≫
**OS**や**ミドルウエア**、**TCP/IP**の各種サービスなどのプロダクト

ネットワークに接続されたホスト(サーバ/クライアント/ネットワーク機器)で稼働している **OS**、**アプリケーション**、**サービス**などを検出し、それらが「危険な設定になっていないか」、「脆弱性を含んだバージョンのまま稼働していないか」などを検査。

【主な診断項目】

* ネットワークスキャン
* ポートスキャン
* アプリケーションバナー情報の調査
* メールサーバの不正利用
* OS とアプリケーションのセキュリティ 等

#Webアプリケーション脆弱性診断
≪対象≫
Webアプリケーション

攻撃者の視点から様々な疑似攻撃を「**考察・試行**する」ことで、Webアプリケーションの安全性を徹底的に調査。

【主な診断項目】

* サイバー攻撃に対する脆弱性
* セッション管理診断
* ユーザ認証診断
* パラメータ操作診断
* 暗号化方式の診断　等

#参考文献
書籍：Webセキュリティ担当者のための脆弱性診断スタートガイド
　　　上野宣が教える新しい情報漏えいを防ぐ技術　第2版
著者：上野　宣

#まとめ
今回は「脆弱性診断とは」についての基礎の部分を簡潔にまとめました。
「脆弱性診断」は奥が深いので、学んでいてとても難しく感じる部分もありますが、基礎をしっかりおさえていきたいと思います。
Unity2019.4.1 Visual Studio Codeでのコード補完（インテリセンス）が効かない場合

# 問題
Unityのバージョンアップを行ったらVScodeでインテリセンスが効かなくなっていた。
※インテリセンス（コード補完）・・・クラス名や変数名などが予測で表示される機能

# 確認環境
Unity2019.4.1f1
macOS Catalina 10.15.6
Visual Studio Code 1.49.2

# 解決方法
Package ManagerにデフォルトでVScodeをサポートする様になっていたのでそれが問題を起こしていた様だ。

対応方法は
` [Unity] -> [Preferences] -> [External Tools]` 
を開いて
![ore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549803/da33606f-db33-d12e-9730-ea18583fba01.png)

` Genarate .csprj files for` のチェックをいれる。
![pre1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549803/17b17673-1783-2494-1fba-a4b9cca67b46.png)

これでvscosdeを再起動すると直りました。

` Genarate .csprj files for`がない場合はPackage Managerから「Visual studio Code Editor 」をインストールする事で表示されます。

Package Managerは
`Window ->  Package Manager` 
から選択して
![pake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549803/b3894759-8a95-d286-4072-d4c5744a451e.png)
RemoveやInstallが可能です。

# 備考
Unityメニュー [Assets] -> [Open C# Project]を試すと直る場合もあります。
そしてVScodeが設定を何かしら読み込んでいる場合があったりして、インテリセンスが効かない？時間もある様なのでちょっと時間を置くと治ってたりします。

以上
Slack:特殊文字(文字コード:0xA0)があるとスニアペットできない

# 事象

テキストファイルがスニアペットできない。
↓TEST FILEの中身
<pre>
TEST FILE
       0xA0
</pre>

↓Slackにテキストファイルを添付した際の画像
![スニアペット不可.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350256/502e1513-c310-67d3-8cf1-fbe7ff5ac26f.jpeg)


# 原因

文字コード:0xA0の文字が含まれている為。
↓文字コード:0xA0
![文字コード.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350256/eb7232b6-8293-da78-a1ea-526b176785f2.jpeg)


# 対処

文字コード:0xA0の文字を削除
↓0xA0の文字を削除した状態でSlackにテキストファイルを添付した際の画像
![スニアペット可能.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350256/12447782-eff3-631b-c400-1e44c973e85d.jpeg)
［Laravel8］Factoryの使い方メモ

Laravel8でテストデータを入れたい時の、Factoryの使い方メモです。
環境：XAMPP for Windows, Laravel Framework 8.6.0

☞ 今回のケース ☜
・ 例えば、Twitterのクローンアプリを作っていて、ツイートを管理するテーブルにテストデータを入れたい時。
マイグレーションファイルはこのような感じ。↓↓ データを入れたいのは、'user_id'と、'body'の二つだけ。

```database\migrations\2020_09_28_045814_create_tweets_table.php
    public function up()
    {
        Schema::create('tweets', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id');
            $table->string('body');
            $table->timestamps();
        });
    }
```


手順1．ターミナルで以下コマンドを打って、TweetFactory.php を作る。
・database\factories\TweetFactory.php にファイルができます！

```
php artisan make:factory TweetFactory --model=Tweet
```

手順2．Laravel8になってから、globalなfactory()関数は削除されました。その為、モデルのFactoryクラスを使います。
該当するモデルファイルに、『Illuminate\Database\Eloquent\Factories\HasFactory』がインポートされているかを確認すること。

```\app\Models\Tweet.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;　// ←ここ確認。
use Illuminate\Database\Eloquent\Model;

class Tweet extends Model
{
    use HasFactory;
}
```

手順3：作成したTweetFactory.phpを編集する。
・連携するモデルがインポートされているかを確認して、return[]部分を追記します。

```database\factories\TweetFactory.php
<?php

namespace Database\Factories;

use App\Models\Tweet; //←モデルがインポートされているかを確認！
use App\Models\User; //←モデルがインポートされているかを確認！
use Illuminate\Database\Eloquent\Factories\Factory;

class TweetFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Tweet::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'user_id' => User::factory(), //←ここ追記
            'body' => $this->faker->sentence //←ここ追記
        ];
    }
}
```

手順4. DatabaseSeeder.phpに追記する。

```database\seeders\DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // \App\Models\User::factory(10)->create();
        \App\Models\Tweet::factory(10)->create(); //←ここ追記
    }
}
```

手順5．seedを実行する。
ターミナルで以下コマンドを実行します。

```
php artisan db:seed
```

以上で該当のテーブルにテストデータが入ります。
usersテーブルにもデータが入り。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235741/07808789-b196-8acf-3605-6bbdee00f66e.png)

tweetsテーブルにもデータが入ってる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235741/0b48a40c-1014-979a-3deb-bb9df7a50083.png)

テストデータを日本語にしたい場合は、config/app.phpの'faker_locale'を以下のように修正します。

```config/app.php
'faker_locale' => 'ja_JP', 
```

以上です。

＊因みに、上記の手順はteamsオプションを追加していない場合です。teamsオプションを有効にしてJetstreamをインストールしている場合は、以下の参考サイトさんで分かりやすく説明頂いていたので、ご参考に！


参考サイト：
https://blog.capilano-fw.com/?p=7827#Factory
AirflowでGoogleCloudStorageToS3Operatorを使ってGCSのファイルをS3に送る

# 背景
GCSのcsvデータをS3にtransferしたい。
GCSからS3のトランスファーには [GoogleCloudStorageToS3Operator](https://airflow.apache.org/docs/stable/_api/airflow/contrib/operators/gcs_to_s3/index.html) を使用する。
S3のシークレット情報の管理は [Airflow接続](https://cloud.google.com/composer/docs/how-to/managing/connections) で管理する。

# Airflow接続の準備
S3へのシークレット情報はAirflow接続を使って管理する。
Airflowのコンソール画面からAirflow接続情報を登録する。
[新しい Airflow 接続の作成](https://cloud.google.com/composer/docs/how-to/managing/connections#airflow-ui)

↓登録内容


![スクリーンショット 2020-09-29 12.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20307/4175dcbf-c0dc-bb4f-f45e-3929e40ec862.png)

Login: AWSのアクセスキー
Password: AWSのアクセスシークレットキー

# サンプルDAG

```py

import airflow
from datetime import timedelta
from airflow import DAG
from airflow.contrib.operators.gcs_to_s3 import GoogleCloudStorageToS3Operator

default_args = {
    "owner": "airflow",
    "depends_on_past": False,
    "start_date": airflow.utils.dates.days_ago(1),
    "execution_timeout": timedelta(minutes=30),
    "retries": 3,
    "retry_delay": timedelta(minutes=5),
}

dag = DAG(
    "transfer_gcs_to_s3",
    default_args=default_args,
    catchup=False,
    schedule_interval="0 0 * * *",
)

GoogleCloudStorageToS3Operator(
    task_id="transfer_gcs_to_s3",
    bucket='gcs_bucket_name',
    prefix="gcs/path/to/file.csv",
    dest_aws_conn_id='gcs_to_s3_sample', # Airflow接続に登録したid
    dest_s3_key="s3://s3-bucket-name/",
    replace=True,
    dag=dag
)
```

# 参考
#### [使い方サンプルgit: [AIRFLOW-6147] [AIP-21] Rename GoogleCloudStorageToS3Operator] (https://github.com/apache/airflow/pull/6826/files)

#### [S3のシークレットのAirflow接続での扱い方: Airflow s3 connection using UI](https://stackoverflow.com/questions/39997714/airflow-s3-connection-using-ui)
Laravelモデル

今回はmvcモデルのM(モデル)の作成をしていきます。
#Model
モデルとはビジネスロジックを書く場所になります。また、データを処理したり、データをDBに保存するところです。逆に、DBから情報を取り出して、Controllerに送ったりしてくれます。
![image](https://snome.jp/wp-content/uploads/2020/02/mvc02.png)
そして、Laravelでモデルを扱うには<font color=red>Eloquent ORM </font>を使っていきます。
##Eloquent ORM
Laravelで提供されているデータ操作のための機能で、「モデル」と「DB」を対応付けてくれます。**ORM**とは「Object Relational Mapping」の略称で、プログラミング技法のことです。これにより、DBから取得してきた情報をオブジェクトとして扱う事ができます。
##Eloquentモデルの作り方

```terminal
$ php artisan make:model モデル名
```
<font color=red>* モデル名はテーブルの単数形にする必要がある</font>
このコマンドを打つとファイルが生成されるので、その中にmodelの定義などを書いていきます。また、他のテーブルとの紐付けもこのファイルで操作できます。コマンドを打ち、ファイルが作成されたら、ファイルに記述を加えていきます。

```php

<?php

namespace App\Models\Modols;

// use Illuminate\Database\Eloquent\Factories\HasFactory;//テストで使うらしいです。
use Illuminate\Database\Eloquent\Model;

class Blog extends Model//上のモデルを継承してBlogというクラスを作っている
{
    // use HasFactory;//テストで使うらしいです。
    //テーブル名
    protected $table = 'blogs';//使いたいテーブル名を指定

    //可変項目
    protected $fillable = 
    [
        'title',
        'content'
    ];
}
```

#$fillableとguarded
上記で可変項目として、'title','content'と書いてあると思いますが、ここについて説明していきます。
isertやcreateメソッドでテーブルのカラムに値を挿入する際、予期せぬ代入が起こる事を防ぐために、モデルへ、<font color=red>$fillable</font> or <font color=blue>$guarded</font>を設定する必要があります。

##予期せぬ代入とは
複数代入による予期せぬ代入とは、製作者が意図していない代入のことです。ユーザーから変えて欲しくない値（id,passwordなどの管理者権限を管理するカラム）を自由に変えられてしまっては困ります。そこで入力によって変動する値を安全に管理するために、<font color=red>$fillable</font> or <font color=blue>$guarded</font>で値を管理します。

##$fillable
<font color=red>$fillable</font>とはホワイトリストと言い、`複数代入時に代入を許可する属性を配列で設定`します。解釈があってるか分かりませんが、変更可能な値を保存する時に使います。

```php
protected $fillable = ['name','age','update_at'];
```

##$guraded
<font color=blue>$guarded</font>は$fillableとは逆にブラックリストと言い、`複数代入時に代入を許可しない属性と配列で設定`します。変更して欲しくない値を保存する際に使います。両者の属性は併せて使うことはできません。

```php

protected $guarded = ['id'];
```
##他の生成メソッド
他にも属性の複数代入可能なメソッドが2つあります。`firstOrCreate`と`firstOrNew`です。
###firstOrCreate
指定されたカラム/値ペアでデータベースレコードを見つけようとします。モデルがデータベースで見つからない場合には指定された属性でレコードが挿入されます。

```php

$flight = App\Flight::firstOrCreate(['name'] => 'Flight 10');//属性のフライトを取得するか、存在しなければ作成
```

###firstOrNew
指定されたデータベースのレコードを見つけようとします。モデルが見つからない場合は、新しいモデルインスタンスが返されます。こちらが返すモデルはデータベースに保存されません。保存するには`save`メソッドが必要になります。

```php
$flight = App\Flight::firstOrNew(['name'] => 'Flight 10');//属性のフライトか、存在しなければ、新しいインスタンスを取得する
```

#モデル削除
モデルを削除する際には、モデルに対して、`delete`メソッドを呼び出します。

```php

$flight = App\Flight::find(1);
$flight =->delete();
```
上記では`delete`メソッドを呼び出す前にデータベースからモデルを取得しています。しかしモデルの主キーが分かっているのなら`destroy`メソッドを使えます。これによりモデルを取得せずに削除できます。

```php
App\Flight::destroy(1);
App\Flight::destroy([1,2,3]);
```



#終わりに
基本的なモデルの説明でした。

参考サイト
https://snome.jp/framework/mvc-model/
https://qiita.com/kk_take/items/3e0639ed605f74c34619
https://udemy.benesse.co.jp/development/web/laravel-model.html
Firebaseでデプロイ(deploy)時に発生したエラーを解決した（しょうもないミスでした）

# FirebaseでReact+TypeScriptを使用し、deployした際にエラーが発生

エラー内容

```
=== Deploying to 'test-demo-f9999'...

i  deploying firestore, functions, hosting
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint /Users/tarou//test/test-demo/functions
> eslint 'src/**/*'

Running command: npm --prefix "$RESOURCE_DIR" run build

> functions@ build /Users/tarou/test/test-demo/functions
> tsc

✔  functions: Finished running predeploy script.
i  firestore: reading indexes from firestore.indexes.json...

Error: Error reading rules file build

```

# Error reading rules file build

これをみて、最初は意味がわかりませんでしたが、ググりまくってもわからず、
ファイルを見直した際に発覚しました！


# 原因はfirebase.jsonファイルのrulesの記述をミスっていた

```

{
  "firestore": {
    "rules": "build",
    "indexes": "firestore.indexes.json"
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ]
  },
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

よくみてみると、firestoreのrulesが<b>build

になってしまっている・・・
下記のように、rurlesをfirestore.rulesに書き換えることにより、解決。

```

{
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ]
  },
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

環境設定画面で、記述をミスってしまっていた・・・・。
良い経験になりました。

環境設定時は気を引き締めて進めよう。
map連想配列のメンバ関数リスト

| メソッド |概要|
|:-----------|:-----------|
| size|要素数が返り値|
| set(key,val)|キーとバリューのペアをオブジェクトにセット|
| get(key)|指定したキーの要素を取得する|
| delete(key)|指定したキーの要素を削除する|
| has(key)|指定したキーの要素の有無を確認する|
| keys()|すべてのキーの値を取得する|
| values()|すべての値を取得する|
| entries|すべてのキー、値のペアを取得する|
Amplifyでcognito(ソーシャルIDP)使うときにデプロイがうまくいかないケース

cognitoでソーシャルIDP(Facebook, googleログイン等)を使ったログインを実装中にハマったのでメモ。


## :skull: 問題

amplify consoleでビルドログを見ると下記のようなエラーが出る。

```
2020-09-28T14:15:05.671Z [WARNING]: - Fetching updates to backend environment: develop from the cloud.
2020-09-28T14:15:05.891Z [WARNING]: ✔ Successfully pulled backend environment develop from the cloud.
2020-09-28T14:15:05.915Z [WARNING]: ✖ There was an error initializing your environment.
2020-09-28T14:15:05.917Z [INFO]: Failed to pull the backend.
2020-09-28T14:15:05.919Z [INFO]: auth headless is missing the following inputParams facebookAppIdUserPool, facebookAppSecretUserPool, googleAppIdUserPool, googleAppSecretUserPool
2020-09-28T14:15:05.941Z [INFO]: Error: auth headless is missing the following inputParams facebookAppIdUserPool, facebookAppSecretUserPool, googleAppIdUserPool, googleAppSecretUserPool
                                 at updateConfigOnEnvInit (/root/.nvm/versions/node/v10.16.0/lib/node_modules/@aws-amplify/cli/node_modules/amplify-category-auth/src/provider-utils/awscloudformation/index.js:61:15)
                                 at /root/.nvm/versions/node/v10.16.0/lib/node_modules/@aws-amplify/cli/node_modules/amplify-category-auth/src/index.js:230:28
                                 at /root/.nvm/versions/node/v10.16.0/lib/node_modules/@aws-amplify/cli/node_modules/promise-sequential/index.js:16:18
                                 at process._tickCallback (internal/process/next_tick.js:68:7)
2020-09-28T14:15:05.957Z [ERROR]: !!! Build failed
2020-09-28T14:15:06.091Z [ERROR]: !!! Non-Zero Exit Code detected
2020-09-28T14:15:06.092Z [INFO]: # Starting environment caching...
2020-09-28T14:15:06.092Z [INFO]: # Environment caching completed
```


## :zap: 原因


この辺が怪しそうなので調べたところ、amplify pushはしてるのでcognitoの方の設定ファイルでfacebookやgoogleの変数を保持しているのですが、どうやら `環境変数` にも設定しないといけないとビルドでこけるぽい。

```
2020-09-28T14:15:05.941Z [INFO]: Error: auth headless is missing the following inputParams facebookAppIdUserPool, facebookAppSecretUserPool, googleAppIdUserPool, googleAppSecretUserPool

```


## :tada: 解決

使っているソーシャルIDPの環境変数を追加してビルドし直す。

```
AMPLIFY_AMAZON_CLIENT_ID
AMPLIFY_AMAZON_CLIENT_SECRET
AMPLIFY_FACEBOOK_CLIENT_ID
AMPLIFY_FACEBOOK_CLIENT_SECRET
AMPLIFY_GOOGLE_CLIENT_ID
AMPLIFY_GOOGLE_CLIENT_SECRET
```

![Group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60923/27b16f53-30dc-c673-ef50-c152b18982c7.png)



## :pen_ballpoint: 追記

[2020/10/1]
公式のドキュメントにデフォルトで用意されている環境変数について書いてありました。

[引用] Amplify Console environment variables
https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/environment-variables.html

![スクリーンショット 2020-10-01 22.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60923/09d8d9b2-41f2-88aa-c6f2-e34b4a8254cf.png)
windowsのバッチのループ内で変数を置換する


```
@echo off

setlocal enabledelayedexpansion

set before=hoge
set after=fuga

for /D %%f in (*.txt) do (
  set old=%%f
  set new=!old:%before%=%after%!

  echo !old!
  echo !new!
)

endlocal

pause
```

ポイント
・一文字変数のときは%を2つ先頭
・2文字以上変数のときは、%を前後に
・ループ内での変数を再利用するときは、遅延評価しないといけないので!で囲む
・set enabledelayedexpansion が無いと、!で遅延展開されない
MuJoCoライセンス取得，更新から実行まで

# MuJoCo
MuJoCoはロボティクス分野などの研究開発の促進を目的とした物理エンジンです．[楽しそうなデモ](http://www.mujoco.org/image/home/mujocodemo.mp4)
MuJoCoを利用するにはライセンスが必要です．
この記事では，ライセンス取得から簡単なコード実行まで紹介します．
![スクリーンショット 2020-09-27 17.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571510/82ba1fa9-0e28-c892-50f0-f92aa903c041.png)


# MuJoCo Personal License: 1 yearに登録
[MuJoCo](https://www.roboti.us/license.html)にアクセスしてユーザー情報を登録します．
料金体系は以下の通り，学生は無料で使えます!
ライセンスは1年間ですが，再申請すればまた利用できるので，学生の間は使い放題です！
![スクリーンショット 2020-09-27 16.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571510/0fd902d0-5791-cee4-b6a7-20b0738fd051.png)

1. ユーザー情報の入力
名前や所属期間などの情報を入力します．
![スクリーンショット 2020-09-27 16.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571510/ef846c86-6ae5-5ac2-a45f-1ab0cbc3721c.png)
Request licenseボタンを押して，Successと表示されれば成功です．3日以内にMuJoCoからメールが届きます．
メールが届いたら次のステップです．


2. Account numberとComputer id の登録
![スクリーンショット 2020-09-27 17.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571510/87b9b32d-fbc3-d7e7-3d3d-10724a6a8ca3.png)
メールにはAccount numberが記載されているはずです．
Computer id は上の画像の青文字をクリックするとダウンロードされるgetidファイルを用いて取得します．
例）  

```
$ chmod +x getid_linux
$ ./getid_linux
```

getidファイルを実行するとComputer idが取得できるので，それをコピペしてRegister computerをクリックします．するとまたメールが届きます．このメールにactivation keyが添付されてくるので， .mujocoディレクトリに置きましょう．
更新も全く同じ手順です．

# MuJoCoを動かしてみよう！
まず，gymとmujoco-pyをインストールします．

```bash
$ pip install gym
$ pip install mujoco-py
```
その後，以下をコピペして実行します．

```python:[test.py]
import gym
import mujoco_py
     
env = gym.make('Humanoid-v2')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample())
```

実行すると，以下のような画面が立ち上がります．
![humanoid-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571510/61c07a8c-07a4-0bba-9f44-2085fa305040.gif)