OmniAICreator/Qiita-1.07M huggingface dataset:
何のためのコードレビュー？

個人ブログでも公開しています!
https://in-thepink.com

# はじめに

以下の 2 記事を読んで、僕なりに解釈したことを記事にしています。

僕自身も含め、コードレビューの認識が変わって、良いプロダクトを作れるきっかけになればと思います！

※本記事では、レビューを受ける側をアサイニーと言います。

- [人間らしくコードレビューするには(パート 1) | Yakst](https://yakst.com/ja/posts/4907)
- [人間らしくコードレビューするには(パート 2) | Yakst](https://yakst.com/ja/posts/4965)

## コードレビューは何を目的にしているのか？

コードレビューの目的はなんでしょうか？

- 品質管理
- アサイニーのスキルの確認 etc….

プロダクトは個人開発でない限り、チームで開発します。

そこで必要になってくるのがコミュニケーションであり、**自分の意見を共有するディスカッションです。**

ディスカッションをする場所が、コードレビューだと思います。
ディスカッションをお互いに意味のあるものにするために、これからのポイントを意識したいと思います。

## レビュワーは感情的にならない

> 私は律儀に気がついた全ての問題を記載し、これは全部で 59 にもなりました。
>
> 私が読んだレビューに関する文献によると、私はとても素晴らしい仕事をやりとげました。
>
> 本当にとてもたくさんの誤りを見つけたのです。つまり、私は良いレビュアーに違いありません。

上記のようにアサイニーのミスを見つけて指摘するだけだと、今後のディスカッションも心理的安全性が下がって億劫になります。

「なんでやねん！」と思うことがあってもコードレビューは指導の場ではなく、プロダクトの品質をお互いに上げていく場所です。

そのような認識があるだけで、良いディスカッションが生まれる場所になります。

### ポイント

- **レビュワー ≠ 答え合わせをする立場の人間**
- 感情的になっても品質は向上しないし、今後のディスカッションもプラスにならない。

## アサイニーが億劫にならないような言葉選び

> レビューの最中に彼らに贈り物を送るチャンスを見つけることです。
>
> 開発者はどのような贈り物を喜んで受け取るでしょうか？
>
> もちろん、コードのサンプルです。

「修正のヒントあげたから、あとは自分で調べて修正してくれ」だとアサイニーは「ありがとうございます！」とはなりません。

「わざわざすいません」と**マイナスの意識**になります。

> 次のようにリスト内包表記を利用してシンプル化することを検討してみてください。

```python
urls = ['https://' + domain + path for path in paths]
```

上記のようにこうやってみたらどうですか？とお互いに目線を合わせて改善していくことで、アサイニーがレビュワーの気持ちを気にしすぎる事なく、ディスカッションを行えるようになります。

### ポイント

- レビュワーはアサイニーに **Give and Give!!!**

## アサイニーは根拠を持つ

> 意見ではなく原則に基づいてコメントをする

アサイニーは、実装部分の責任者である自覚が必要です。
クライアントや企業からお金をもらっていない、個人開発ならコードレビューは必要ありません。根拠が無くても動いていれば十分です。
ですが、他人からお金をもらっている以上、**プロとして責任と根拠を持って実装すべき**です。

### ポイント

- アサイニー(実装者)はプロとしての自覚を持って、根拠と責任を持つ
AWSとか知識ゼロのクライアントエンジニアがAWSとかの勉強を始めてみる 2

...というわけで、前回に引き続き
本当に何から手をつけたらいいのか分からない自分は
とりあえずAWSの世界で使われるコトバや概念を頭に入れるところから始めてみることにした。

語学を学ぶ時と同じように、単語から覚える感覚で。

ただし、そのまま単語だけ覚えてもただの暗記になってしまうので
この段階は早めに突破したい気持ち。

昨日見つけたYoutuberのくろかわこうへいさんの「AWS講座VPC編」を見ているところ。
この内容はきっと基礎中の基礎レベルの解説だと思われるのだけど、
正直、現段階の自分には結構難しい。。

そのうち理解できるようになるだろう...と思いながら、ひとまず最後まで見てみます。
VPC編を見終わったらEC2編かな。


---
### 今日覚えたコトバと概念と理解感

・そもそも「VPC」って何だって話

・リージョン
　---> 国、のイメージでひとまず覚える

・AZ
　---> データセンター、のイメージでひとまず覚える

・サブネット(publicとprivate)
　---> まるでプログラミングのpublic, privateのようだ。

・インバウンド、アウトバウンド
　---> 発信できるかできないかの違い

・ルートテーブル
　---> ルールね

・インスタンス
　---> なんだ、そのことをそう呼んでいたのか。やっと知った。

・Internet gateway
　---> ネットの接続担当みたいな

・NATゲートウェイ
　---> privateサブネットとInternet gatewayの仲介役かな

・ENI
　---> まだ概念のイメージがしづらい。
　　　　でも、これがInternet gatewayと繋がることでインターネット接続が
　　　　できるようになるんだな、ってのはなんとなく分かった。

・Public IP address
　---> インスタンスに付ける(割り当てる)ものなのね、くらいしか現段階ではあまりよく分かってないです。

・Elastic IP address
　---> Public IP addressと同じくらい良く分からないけど
　　　「変わらないIP address」なのが特徴なのね、って認識。

---

今は動画で視覚的に学べる時代で、ありがたい。
学習用の動画を提供してくださっている方々にも感謝。

今日はここまで。
明日、忘れてませんように。
pipで入れた奴が動かないと思ったら→ひょっとしてpython3を使ってませんか？

タイトル通り。
自分が遭遇したのはpythonからapp実行ファイルを作ろうと思って
https://qiita.com/deko2369/items/3de11415a073e0555d7c
こちらの記事の指示通りにpy2appを入れ、py2appletコマンドを入力したが、
コンソールではcommand not foundとなって動かなかった。

解決策は何のこともない。
自分のMACではpython3を使っていたので、pipではなくpip3を使って入れないといけなかったのだった。
<Java>特定の文字列で区切られたファイル名をそのファイル名の一部で一括変換するクイズ

# 背景
- 以下の記事を見ました
    - [\<JavaScript>特定の文字列で区切られたファイル名をそのファイル名の一部で一括変換するクイズ](https://qiita.com/ozaki25/items/33a57ad7eea55822c764)
    - Javaでやれと言われた気がしたのでやります
- やりたいこと
    - [\<JavaScript>特定の文字列で区切られたファイル名をそのファイル名の一部で一括変換するクイズ](https://qiita.com/ozaki25/items/33a57ad7eea55822c764#%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8)と以下同文なので省略
    
# 環境
 - Macでやってます
    
```bash
$ java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.1+7)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.20.0, JRE 14 Mac OS X amd64-64-Bit Compressed References 20200416_40 (JIT enabled, AOT enabled)
OpenJ9   - 05fa2d361
OMR      - d4365f371
JCL      - 5757187cae based on jdk-14.0.1+7)
```

# 事前準備

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


```bash
echo 'IntStream.range(1,101).forEach(i -> {try {Files.createFile(Paths.get("abc_test_ok_"+String.valueOf(i) + "_this.csv"),java.nio.file.attribute.PosixFilePermissions.asFileAttribute(java.nio.file.attribute.PosixFilePermissions.fromString("r--r--r--")));} catch (Exception e) {throw new RuntimeException(e);}})' | jshell -
```
- Javaはコンパイルが必要だからワンライナーは向かないと思われがちですが、最近のJavaではJShellというREPLツールが使えるのでできます。
- echoで書きつつ、パイプでjshellコマンドに渡しています。最後の - は余計な表示をしないようにしています。
- import文はものによって省略できます。
- パーミッションの書き方などがUnixベースなので、Windowsだと動かないと思います。
- ループはFor文で書いたら負けかなと思いましたので、特に意味なくStreamからのforEachつかいました。
- 改行込みで書くと以下になります。例外処理とかが面倒な感じですね。


```java
        IntStream.range(1,101).forEach(i -> {
            try {
                Files.createFile(Paths.get("abc_test_ok_"+String.valueOf(i) + "_this.csv"),
                    PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("r--r--r--")));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
```

# ファイルのリネーム
- ここからが本題です。
- といいつつ、いきなりで以下で動きました。

```bash

echo 'Path path1 = Paths.get(".");try{Files.list(path1).forEach(from -> {String intStr = from.toString().replaceAll("[^0-9]", "");try {Files.move(from, Paths.get(".",intStr + ".csv"));} catch (IOException e) {e.printStackTrace();}});} catch(IOException e) {e.printStackTrace();}' | jshell -
```

- 正規表現で数字だけ取ってファイル名にリネームしているので、フォルダ内に余計なファイルがあると動かない可能性があります。
- 現在のディレクトリのPathを取った後に、listで直下のものをがさっと取ってforEachで回しつつ、moveでファイルリネームしています。
- 改行込みで書くと以下になります。やはり例外処理とかが面倒な感じですね。(例外処理の後処理が上と違うのは特に意味がないです）
- （7/15追記）ラムダ式を使う形にリファクタリングしました。

```java
        Path path1 = Paths.get(".");
        try{
		    Files.list(path1).forEach(from -> {
                String intStr = from.toString().replaceAll("[^0-9]", "");
                try {
                    Files.move(from, Paths.get(".",intStr + ".csv"));
				} catch (IOException e) {
                    e.printStackTrace();
                }
            });
        } catch(IOException e) {e.printStackTrace();}
	}
```

# おわりに
- 久しぶりにJShell触りました。さくっと動くのは良いですね。
- ファイル処理は前回の人と同じく、普段あまりやらないので調べながらやったので、よりよいやり方あればご指摘ください。
jquery よく使うもの

■jQuery = javascript
document.querySelector("要素") = $("h1")

■要素クリックをトリガーで発動　　
$("要素").click(function(){
 $("要素").css("color","purple");
});

■要素を削除する。
$("要素").remove();

■要素をどこに突っ込むか
$("要素").before("<要素></要素> ")

before() 要素の前に突っ込む
after()　要素の後に突っ込む
prepend()　要素の中の前に突っ込む
append()　要素の中の後に突っ込む

■Event reference
$("要素").on("mouseover",function(){

})
※MDN event reference
https://developer.mozilla.org/ja/docs/Web/Events
JSのincludesメソッド

特定の要素が配列に含まれているかどうかを true または false で返すメゾッド。
>配列名.includes（ 配列内にあるか確認したい数字や文字列 ）

~~~javascript
const array1 = [1, 2, 3];
console.log(array1.includes(2));
// => true
~~~

~~~javascript
// 第2引数以降の数字に含まれていない第1引数の配列を返す

const without = (array, ...numbers) => {
  const withoutNumber = []
  for (let i = 0; i < array.length; i++) {
    const filterNumber = array[i]
    if (!numbers.includes(filterNumber)) {
      withoutNumber.push(filterNumber)
    }
  }
  return withoutNumber
}

console.log(without([2, 1, 2, 3, 4], 1, 2))
// => [3, 4]
~~~
Springの中核技術となっているDIとAOPについて簡単に解説(学習まとめ)

#はじめに(前書き)

筆者はここ2年の間、Javaを中心に勉強してきた(つもりの)者ですが、いささか本分から逸れてしまっていたので、ここいら辺で軌道修正を図りたいと思います。
自分としては、昨今のJavaのフレームワークといえば、JavaEEとSpringの2強時代となっているように思われますが、皆さんにとってははいかがでしょうか？
過去にはStrutsやSeasarもありましたが、自分にはなぜそれらのものが時代とともに廃れていってしまったのかはよく知りません(今でも使っている方がいたらすみません)。脆弱性が発見されたからだとか、サポートが終了されたからだとか聞いてはいますが、詳しい経緯については浅学なので存じ上げません(申し訳ございません)。
さて、今回はタイトル通り、Springの中核技術にして基本的な事柄であるDIとAOPについて解説していきたいと思います。どうぞよろしくお願いいたします。


#本題(本文)

まず、DIについて解説していきます。DIとは「Dependency-Injection」の略であり、これは、オブジェクト指向言語を使った開発では当然のことながらオブジェクト同士の間に依存・参照関係を持たせることで、オブジェクト間のメッセージ交換(実際は、互いにメソッドを呼び出し合うこと)を実現していますが、この依存・参照関係の設定をJavaのコードを書いて行うのではなく、XML形式の設定ファイルにタグを書くことで、Javaのコードからオブジェクト間の依存・参照関係を掃きだしてしまおうという考えに基づいています。
こうすることで、Javaのコードを書き換えることなくテストや将来の仕様変更を容易にする目的があります。
また、DIはオブジェクトの初期状態としてフィールドにセットされる値をも、(やはり)XML形式の設定ファイルに掃きだしてしまうものでもあります。
さて次は、AOPですが、これは「Aspect-Oriented-Programming」の略であり、これはPOJOなクラス(＝特殊なインターフェイスを実装していない普通のクラス)に様々な機能を付加させることです。それもクラスの定義にアノテーションと呼ばれるチョコッとした文を添えるだけで(設定ファイルからでもできますが・・・)、従来のJavaのコードを書かずとも、引数のヴァリデーション(=値チェック)やログ出力などが行えるという便利な優れものです(解説が雑ですみません)。


#終わりに(後書き)

同じ内容でも、ほかの投稿者の方のほうがもっと良い内容の記事を書いてくださっているとは思いますが、自分なりの言葉で平易に解説してみたつもりなので、この記事が現在、DIとAOPのところで躓いている方の参考になれれば自分としては幸いです。
また懲りずに色々な記事を書きたいと思います。
それではまた。
MacOS CatalinaでProcessing3のvideoライブラリを使えるようになった

MacOS Catalinaにアップデートすると、32位のアプリはすべて使えなくなった。
これに関する記事：https://www.theverge.com/2019/10/12/20908567/apple-macos-catalina-breaking-apps-32-bit-support-how-to-prepare-avoid-update
#####現在ツールに提供しているvideoは32位のライブラリで使えなくなった。
解決方法はほとんどこの質問から見つけた：
https://github.com/processing/processing-video/issues/134
そこで、私の解決方法を整理して説明する。

a. このサイトで [video2.0beta](https://github.com/processing/processing-video/releases/tag/r6-v2.0-beta4) をダウンロードして、元のvideoライブラリを解冻したフォルダーに置き換える（元々videoがなかったらそのままライブラリのフォルダーに置いたらいい）。ライブラリフォルダーの場所はprocessingを開けたら processing - 環境設定 - スケッチブックの場所　からチェックできる。自分の場合は：/Users/codenew/Documents/Processing、その下のlibrariesにツールからダウンロードしたライブラリ全部ここに置いている。
b. ターミナルを開けて、video - library - macosxまでに行く。
   コマンド：```cd ~/Documents/processing/libraries/video/library/macosx```
c. macosxフォルダーでこのコマンドを実行する：
```xattr -p com.apple.quarantine libavcodec.58.35.100.dylib```
実行した結果はこんな感じに見える：
0081;5dc1bfaa;Chrome;78F18F7D-3F71-4E55-8D58-BAB946AB4707
そこで、0081を00c1に変わって、新しい文字列を作る：
00c1;5dc1bfaa;Chrome;78F18F7D-3F71-4E55-8D58-BAB946AB4707
#####この文字列はパソコンによって違うので、自分の文字列で入れ替えよう
新しい文字列でこのコマンドを実行する：
```xattr -w com.apple.quarantine "新しい文字列" *.dylib```
そして、二つのコマンドを実行：
```cd gstreamer-1.0```
```xattr -w com.apple.quarantine "新しい文字列" *.dylib```
d. Finderを開けて、アプリケーションに行く。Processing.appを右クリックして、パッケージの内容を表示する。Contents/MacOSまで行く、Processingをダブルクリックする。
e. 開いたprocessingにカメラのテストコードを書く（ここはサンプルコードを使用した）

```processing:sample.pde
import processing.video.*;

Capture cam;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();
  
  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }
    // The camera can be initialized directly using an 
    // element from the array returned by list():
    cam = new Capture(this, cameras[0]);
    cam.start();     
  }      
}

void draw() {
  if (cam.available() == true) {
    cam.read();
  }
  image(cam, 0, 0);
  // The following does the same, and is faster when just drawing the image
  // without any additional resizing, transformations, or tint.
  //set(0, 0, cam);
}
```

これを実行すると、カメラのアクセス許可が出るはず。それを許可する。
f. Contentsから開いたprocessingとターミナルを閉めて、いつものprocessingアプリを開いて、サンプルコードで実験すれば、カメラが動けるようになった！
スクリプトとプログラムの違い

#スクリプトとは？
- テキストファイルベースで書かれた命令文(ソースコード)のこと。

- プログラムとは違って、コンパイル(翻訳)が不要だが、その分実行速度が遅い。

- スクリプト言語の例
  - Ruby
  - PHP
  - JavaScript
  - Python

#プログラムとは?
- OSがそのまま実行できるように、機械語にコンパイル(翻訳)されたバイナリーベースのファイルのこと。

- デバック時に毎回コンパイルをするのが手間になる。


参考サイト：https://milestone-of-se.nesuke.com/sv-basic/architecture/compare-script-and-program/
文系卒だけどいきなりRuby on Railsの勉強をはじめてみた #9 発展的なログイン機構

この章では8章の応用的なことをやっていく。
要はブラウザを再起動してもログイン状態を保持するような仕組みをつくれるようになるらしい。
そして、そのために永続クッキーなるものを利用するっぽい。

# 9.1 Remenber me機能
まずはトークンを生成する必要がある。
`urlsafe_base64`というメソッドを利用すれば、ランダムな文字列を生成することができるようだ。

前章からやたらとでてくる「クッキー」について、わかっているようでなにもわかっていなかったので調べてみた。
cookieは“Webサイトとユーザー間でやり取り・保存されるアクセス情報”のことらしい。
完全にキャッシュと同じものだと思っていたが、別物らしい。
Rails云々以前にITの前提知識がないから勉強を進めるのが難しい部分がある気もしてきた。
Railsの勉強をやりつつもITの基本知識もたたきこまないといけない。
（基本情報は取得したはずだけど、実践にまったく生かされていないことを知る機会ともなった。）

#9.2 [Remember me] チェックボックス
この節ではチェックボックスを実装するっぽい。
よくサービスにログインするときにみるやつだ。

この章は短く、erbとscssをいじったらチェックボックスができていた。

#9.3 [Remember me] のテスト
この章は正直ほとんど理解できず、流れ作業になってしまった...。
というより、テストという概念をあまり理解していないのかもしれない。
今日覚えたvim

## カーソル位置の文字を置換

`:%s/<ctrl+r><ctrl+w>/human/g`

## カーソル位置の文字を検索

`*`

## 直前の入力を再入力

INSERTモードで`<Ctrl+a>`

## ESC遠いなら

`<Ctrl+[>`

## tabモード

1. NORMALモード
1. tabe test2で開く
1. tabcでそのタブ閉じる

- gt 次ページ
- gT 前ページ
TDD勉強#2(July 13th, 2020)

#新しい知識
###assertTrue(boolean)
引数がtrueかどうか判別する．
###Object.equals
```java
public boolean equals(Object object){
    return true;
}
```
参考記事
https://engineer-club.jp/java-equals

###型キャスト
対象の変数の直前に(型名)を付与する．

```java
long l = 1026;
int i = (int) l;
```

参考記事
https://java-code.jp/66

###クラスの継承
継承なしのクラス

```java
public class School{
    String name;
    int id;
    attend(){}
    test(){}
}
```
継承すると，

```java
public class Student{
    String name;
    int id;
    attend(){}
}
```
```java
public class School extends Student{
    test(){}
}
```

もとのクラス(student)を親クラス，スーパークラス，継承したクラス(school)をサブクラスという．
・オーバーライド
→スーパークラスのメソッドをサブクラスで上書きすること．

参考記事
https://techacademy.jp/magazine/9246

###アクセス修飾子
`public`
どこからでもアクセス可能．一つのファイルに一つだけ．ファイル名とクラス名は同じである必要がある．

`protected`
そのクラスを継承したサブクラス内部からアクセス可能．

`private`
クラス内部からのみアクセス可能．

###リフレクション
`getClass().インスタンス変数`でクラス情報のインスタンスを取得する．(意味不明)
zshことはじめ　Command not found.エラーに対処する

Mac OSをCatalina辺りにバージョンアップしてから、コマンドライン起動時にとある表示が出てくるようになりました。

```Command
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050
user:~ user$
```

Macユーザであれば見覚えがあるのではないでしょうか。
ガイドラインに沿ってzshに切り替えると、設定が面倒くさかったので個人的な備忘録として残します。

ちなみに、この記事は「パスを通す」という概念がちゃんとわかっている方にとってはごく当たり前のことを書いています。

## zshとは
シェルは何かしらのプログラムに対し、命令を受け付ける窓口のようなものです。
ターミナル＝窓口くらいに思っていましたが、窓口にも色々種類があるようです。

有名どころだと、bash, cshなどがあります。

<b>以前のmac OSでは、bashがデフォルトでしたが、バージョンアップでzshはmac OSのデフォルトとなりました。これは「ドラゴンボ○ルZ」のように、最後のシェル、すなわち最強のシェルです。</b>

具体的にどのようなところが最強かというと、補完機能が使えたり、コマンドに色分けできるようになるところです。
ぶっちゃけ、私にはそこまで大きなメリットがあるとは思えません。。

## zshにすると何が起きたのか
zshにしてからというもの、何かしらのパッケージをインストールしても再起動のたびに``Command not found.``と表示されるようになりました。
例えば、

```Command
% npm install hoge
```

としてnpmのパッケージをインストールしても、
別ウィンドウで開くとエラーが出てしまいます。

```Command
% hoge -v
Command not found: hoge
```

whichを試してみても

```Command
% which hoge
Command not found: hoge
```

困り果ててしまいました。

## 解決策
パスを通せば問題なく使えます。

bashではホームディレクトリにある.bash_profileを編集したように、zshではホームディレクトリにある.zshrcを編集し、パスを追加します。

ホームディレクトリとは、ターミナルを立ち上げたときデフォルトで指定されているパスです。
``/Users/{Macに設定した名前} ``

よく~で表示されますね。そのため、ホームディレクトリ直下にsrcというフォルダがあった場合、以下のように表現されます。
```~/src```

余談ですが、.(ドット)がつくと隠しファイルということを意味しています。
つまり、.zshrcも隠しファイルということですね。
Finder上で存在を確認したいときは、Command + Shift + .(ドット) で隠しファイル表示機能を有効にします。
逆に非表示にしたいときも同じコマンドです。

※ちゃんとしたエンジニアの方によると、このようなやり方でパスを通すのはあまり良くないそうです。よりベターな解決策が見つかった場合は、この記事を更新してお伝えしたいと思います。もしくはコメント欄に「こうすればいい！」というのを教えていただけると助かります！

.zshrcの編集は、以下のやり方が個人的にはしっくり来ました。

### ホームディレクトリにある.zshrcにviでアクセス
もしホームディレクトリ直下にまだファイルができていないようであれば、viコマンド実行時に新規作成されます。

vimエディタを使ったことが無い方は、まずはvimの編集の仕方をググってみてください。
viとvimどちらでもいけます。

```
% vi ~/.zshrc
```

### ターミナル内で.zshrcの中身を編集

```
# tabtab source for packages
# uninstall by removing these lines
[[ -f ~/.config/tabtab/__tabtab.zsh ]] && . ~/.config/tabtab/__tabtab.zsh || true

# environment paths　
# pip
export PATH="$PATH:$HOME/.local/bin"
```

``# environment paths``以下にパスを記述します。上記の例ではホームディレクトリ直下の.localファイルのバイナリ（~/.local/bin)を参照し、pipのパスを通しています。

無駄なスペースとかが入ると通らないので、気をつけてください。
※pipのインストールの仕方によって、パスは変わります。

### パスを通す

以下コマンドでパスを通せば、設定は完了です。
ちなみにこのコマンドは入力しなくても、.zshrc入力後に新規でウィンドウを立ち上げれば問題なく使えます。

```
source ~/.zshrc
```

## パスの記述方法について

調べてみると、パスの書き方にも色々あることがわかりました。
私が実験してみた感じでは、以下の2つの記述方法で問題なくパスが通りました。

```
export PATH="$PATH:{path to file}"
export PATH={path to file}:$PATH
```

## 追記：パスの順番について

「パスを通す」という概念、なんとなくしかわかっていませんでしたが、順番があるようです。

.zshrcにあるファイルだと、上のパスから順番に参照するため、後ろのパスが後回しになり通らなくなることがあります。

優先的に通したいパスほど上に書くか、以下のように書くことで優先されます。

```
export PATH="{path to file}:$PATH"
```

なぜかというと、そもそもzshrcはzshにとってのメモ帳みたいなもので、パスの情報は「\$PATH」の中に格納されているからです。
export~という記述で、\$PATHの中身を上書きしています。
:(セミコロン)によって上書きの順番が決まっているので、\$PATHよりも手前に設定したいパスを入力することで、優先的に参照されます。
React Native Firebase v6 + Android 8+ でプッシュ通知受信時のポップアップ表示させる

## やりたいこと

[React Native Firebase](https://rnfirebase.io/) の Cloud Messaging を使ってプッシュ通知受信時の処理を実装。

ドキュメント通りに対応して iOS ではバックグラウンド・フォアグラウンド（※注1）とも特に問題ない。

Android でも受信するには受信するが、ポップアップ表示されない。Android 8 (Oreo) 以上では通知チャネルを明示的に指定して通知の重要度を設定しなければポップアップ表示されないので、これは当然。

通知チャネルを作成する必要があるので、やり方を調べると `firebase.notifications()` を使用して設定できそうな回答が見つかる。が、 React Native v6 にはこのメソッドは存在しない。どうやら v5 -> v6 で削除されたらしく、チャネルに関する設定を行う方法は v6 では提供されていない模様。React Native Firebase v5 はすでにサポート外となっているので、今更入れるのも微妙。

[公式ドキュメントでは通知チャネルなどの細かい設定を行いたい場合は、同じ開発チームが作っている Notifee を使うことを推奨している](https://rnfirebase.io/messaging/notifications#notifee---advanced-notifications)が、これは1アプリ $240 のライセンス購入が必要。

チャネル設定したいだけなのに……。

## 方法

しかたがないので Android でネイティブ実装してしまう。

`android/app/src/〜/MainActivity.java` にこんな感じでメソッド作って…

```java
  private void createNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      String id = "notification"
      CharSequence name = "お知らせ";
      String description = "新しいメッセージの受信などをお知らせするよ";
      int importance = NotificationManager.IMPORTANCE_HIGH;
      NotificationChannel channel = new NotificationChannel(id, name, importance);
      channel.setDescription(description);
      NotificationManager notificationManager = getSystemService(NotificationManager.class);
      notificationManager.createNotificationChannel(channel);
    }
  }
```

で、 onCreate() の一番下あたりに `createNotificationChannel();` と書いて呼び出す。

あとは React Native プロジェクトルートの firebase.json にデフォルトのチャネルを追加。

```json

{
  "react-native": {
    ...
    "messaging_android_notification_channel_id": "notification"
  }
}
```

id, name, description は適当に変えてください。

## 脚注
※注1: フォアグラウンド時には messaging().onMessage イベントにより任意の処理を実行できるが、 OS ネイティブ UI の通知として表示するには別途対応が必要）
vue（Nuxt.js）で環境ごとにURLのリンク先を変える方法

vue（Nuxt.js）で環境ごとにURLのリンク先を変える方法です。

```vue
<template>
  <div>
    <button @click="toLink">リンク先へ</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  methods: {
    toLink() {
      let url = ''
      switch (window.location.hostname) {
        case 'https://dev.demo.com':
          url = 'https://dev.demo.jp'
          break
        case 'https://stg.demo.com':
          url = 'https://stg.demo.jp'
          break
        case 'https://demo.com':
          url = 'https://demo.jp'
          break
        default:
          url = 'https://localhost:3000'
          break
      }
      window.location.href = url
    }
  }
})
</script>

```

`window.location.hostname`で現在ページのURLのホスト名を取得しています。
それをswitchして、環境ごとにリンク先のURLを変えています。

`window.location.href `でページ遷移させることが可能です。
AWSをゼロから勉強する。vol.2

7/11~13 
　体に結構な怪我を負い、勉強に気が回りませんでした。
　ギプスをしながら生活するのは大変です。

7/14
　久々の勉強。結構忘れてしまっている。
　しかし、進まなければ新しいことを覚えられないのでどんどん先に進もうと思う。
　今日は少なめ。

[EC2(Elastic Compute Cloud)]
　仮想サーバーを構築できる"環境"の事。

[インスタンス]
　仮想サーバーの事。
　EC2の中にインスタンスを複数作る。というようなイメージ。
　インスタンスごとにセキュリティグループを定義することもでき、
　公開範囲をコントロールすることもできる。
　（プロトコル、ポート番号などを定義）

[AMI(Amazon machine images)]
　仮想マシンのパッケージ、テンプレのこと。
　初期設定も含めたものも多数存在して、
　それらをインストールすることでセットアップの時短になる。

[EBS(Elastic Block Store)]
　仮想ディスクのイメージ。（ストレージではない）
Jetson RaspberryPi の画面をPCディスプレイに表示させる

###Jetson RaspberryPi の画面をPCディスプレイに表示させる

HDMIキャプチャカードを使うことでMacのディスプレイに表示させることできます。
#### HDMIキャプチャカードを使うメリット
- VNCをセットアップしなくてよい
- 既存のノートPCのディスレイを利用して表示できる
- 待ち運べる
- VNCをアップデートして動かなくなることがない
- Jetson RaspberryPIを買ってすぐに利用できる
- 経済的

<img width="450" alt="スクリーンショット 2020-07-14 23.36.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674266/0fa89259-b0da-404e-94db-9e8505c58c4e.png">
オープンソースのVLCやOBSを使い表示します。

[OBS](https://obsproject.com/ja)
[VLC](https://www.videolan.org/vlc/index.ja.html)
Potplayer

[HDMIキャプチャカード](https://www.amazon.co.jp/gp/product/B088RF4VWX/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B088RF4VWX&linkCode=as2&tag=iotana-22&linkId=f9536954a94c3e5d03272efbc959abfa)
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B088RF4VWX/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B088RF4VWX&linkCode=as2&tag=iotana-22&linkId=f9536954a94c3e5d03272efbc959abfa"><img width="200" alt="スクリーンショット 2020-07-14 23.09.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674266/02308a27-e31b-3a3d-1ccc-dffc9857df7c.jpeg"></a>

値段は千円から５千円と様々です。解像度が高いキャプチャーカードを選びました。

<img width="300" alt="スクリーンショット 2020-07-14 23.09.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674266/dbb527dc-5391-0d09-d0d7-19c50533239d.png">

<img width="300" alt="スクリーンショット 2020-07-14 23.09.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674266/621366ef-56be-57b4-3bc3-1a7657359175.png">


ケーブルの数が減り、持ち運びしやすくなりました。

**[JetsonでVNCを利用する](https://qiita.com/aqzihb/items/ca3f2f92aa4fb53c1096)**

<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B08MZFQWDP/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B08MZFQWDP&linkCode=as2&tag=iotana-22&linkId=37b7556bf63c7b4bb3652296b3e8cc7a"><img width="300" alt="NVIDIA Jetson Nano 2GB 開発者キット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674266/7370d26c-43d1-3a68-c233-5167e1df46e4.jpeg"></a>
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B08MZFQWDP/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B08MZFQWDP&linkCode=as2&tag=iotana-22&linkId=37b7556bf63c7b4bb3652296b3e8cc7a">NVIDIA Jetson Nano 2GB 開発者キットを購入する</a>
DDD特別夏季講習 / 2時限目：ドメインサービス

## はじめに
本記事は前回の記事の続きになります。DDDをゼロから学びたい方はまず前回の記事からお読みください。
[前回の記事: DDD特別夏季講習 / 1時限目：値オブジェクトとエンティティ](https://qiita.com/Rui1009/items/fbe8eee7f93cae2bbae6)

今日は値オブジェクトやエンティティと同じく、ドメインオブジェクトを実装する際に用いられる「ドメインサービス」について解説していきたいいと思います。

## 対象読者
- 職場でドメイン駆動開発を使って開発を行っている方
- これからドメイン駆動開発の導入を検討している方
- エリック・エバンスの本分厚いよー、ぴえん🥺って方
- その他、ドメイン駆動開発ってなにー？？って方

## ドメインサービス

### 値オブジェクトとエンティティの表現の限界
まずはじめに説明するのが、ドメインサービスです。
ドメインサービスは、値オブジェクトやエンティティでドメインを表現しようとすると違和感が生じる場合に利用されます。例を挙げて見てみましょう。

```javascript

class user {
  constructor(name, age){
  this.name = name
  this.age = age
  }
 
 checkAge() {
  if (this.age < 18) {
  throw new Error("18歳未満の方は入場できません")
 }
 }
}
```
上記のコードではcheckAgeというメソッドを用意して、ユーザーが18歳未満でないか確認して、もしそうであった場合にはエラーを吐くようになっています。まあ、みなさんがよくご愛用なさっているサービスとかでも、こういった仕様は頻繁に見受けられるかと思います笑

こういったドメインがもつバリデーションは、本来ユースケース層ではなく、上記の例のようにドメイン層で持つべきものです。でないと、ユースケース層でuserを呼び出す度にこのバリデーションの処理を書かなければいけなくなります。こういったドメイン固有のルールの流失は原則として避けるべきものです。

といった感じで、上記のコードは正しいように思われます。ホントに？

では、実際にこのcheckAgeメソッドを呼んでみましょう。

```javascript

val user = new user("ruirui", 22)

user.checkAge()
```

ruiruiさんの年齢が18歳未満でないかを確認していますね!　、、、ruiruiさんが。
上記のクラス及びメソッド定義の最大の問題点はここにあります。
これだと、ユーザ自信がユーザの年齢が条件に合致するか否かを判断しているような感じがしてしまいます。クラスに定義されたメソッドというのは、そのオブジェクトの振る舞いを示したものだからです。
ここで今一度、DDDにおける開発の原則に立ち返っていただきたいのですが、DDDとは「現実世界のドメインの知識を、アプリケーションに必要な物にのみ絞り込んだ上で、それをドメインオブジェクトに落とし込む」といった開発手法です。まあ要は、現実世界のドメインを、必要な分だけ取って実装するって感じですね。つまり実装上のドメインの関係性は現実世界に照らし合わされたものである必要があります。
上記の実装は現実の世界のドメインを正確に表しているとは言えませんね。ユーザ自身が、年齢をチェックするわけではありませんからね。

### ドメインサービスの強み
じゃあどう実装すればいいんだよ！まあ、勘の良い方ならもうお気づきでしょう。ここでドメインサービスの出番です。

```javascript
class userDomainService {
  constructor(age) {
  this.age = age
  }
  checkAge() {
  if (this.age < 18) {
  throw new Error("18歳未満の方は入場できません")
 }
 }
}

val user = new user("ruirui", 22)
new userDomainService(user.age).checkAge() // 実際に年齢のバリデーションの処理が走る

```
これで先ほどよりコードに違和感がなくなった感じがしませんか？？
このようにドメインサービスは、値オブジェクトやエンティティだけで現実世界のドメインオブジェクトの関係性を正しく表現した実装が困難な場合に使われます。

上記のケース以外では、口座間送金などがドメインサービスを使う例としてよくあげられます。

### ドメインサービスを使う上での注意点
ドメインサービスは諸刃の剣です。
ドメインサービスは、値オブジェクトやエンティティでは表現しきれない部分の表現を補ってくれるとっても便利な存在ですが、その一方で大きな問題もあります。それはドメインから説明を奪ってしまうことです。これをドメインモデル貧血症と言います（めちゃめちゃ語呂がいいですよね笑）。
理論上、ドメインの持つべきあらゆる振る舞いをドメインサービスで実装することも可能です。例えばuserにchangeName()がある、みたいなものですかね。
ドメインサービスにこういったchangeName()などを持たせると、userドメインからその振る舞いが消えていってしまいます。
これだと、コードを見たときにそのuserクラスがいったい何をするものなのか、見えにくくなってしまいます。

ドメインサービスを使うのは、値オブジェクトやエンティティでオブジェクトを表現できないときのみにするのが良さそうです。


## 終わりに
いかがでしたでしょうか？？ドメインサービスを使うと、値オブジェクトやエンティティではうまく表現しきれないものでも、自然な表現でドメインオブジェクトの実装が可能になります。一方、むやみやたらに使ってしまうと、ドメインクラスから知識を奪いすぎてしまい、「現実世界のドメインをそのまま実装に落とし込む」DDDの思想に完全に反する事態を招いてしまうので注意しましょう。

これで今日の授業は終わりです。[前回の記事](https://qiita.com/Rui1009/items/fbe8eee7f93cae2bbae6)と今回の記事を読んだあなたは、おそらく基本的なドメインを実装に落とし込めるまでにはなったはずです。ですが、DDDの構成要素はドメインを定義するドメイン層と、
それを呼び出して実行する箇所だけではありません。次は主にDB等とのやりとりを行うレポジトリ層について解説したいと思いますのでお楽しみに。
vimでカーソル位置の文字列を置換する

はやくなる（小学生並みの感想）

## 操作
1. カーソルを`vampire`にもっていく
2. `:%s/<ctrl+r><ctrl+w>/human/g`
3. Enter

## Before

```
I am vampire.
```

## After

```
I am human.
```
新卒一年目のプログラマが感動したEclipseショートカット11選

## はじめに

チートシートも兼ね、個人的に愛用しているEclipseショートカットを集めました。

## Eclipseショートカット11選

### Ctrl + Shift + R

リソースの検索／新しくファイルを開きたい時に使用

### Ctrl + Space

予測変換／例えば`System.out.plintln("")`と入力したい時に、`syso`まで入力した後にこのコマンドを打つ等、予測変換の際に用いる

### Ctrl + F

ソース検索／特定の文字列の検索や、変数名メソッド名の確認等に用いる

### Ctrl + Shift + /

複数行のコメント

### Ctrl + H

検索ダイアログの表示

### Ctrl + E

Eclipse内で開いているタブの一覧を表示／素早く作業ファイルを変更したい時に重宝します

### Ctrl + O

メンバの概要を表示／フィールドやメソッドの概要を知りたい時に使えます

### Ctrl + Shift + W

開いているタブを全て閉じる

### Alt + Shift + A

選択範囲を同時にインデント／インデントを一行ごとに行う必要がなくなります

### Ctrl + Alt + H

メソッド・コンストラクタの呼び出し階層の検索／呼び出し元を検索できるほか、メソッド内で呼び出しているメソッドを把握することも出来ます

### メソッドを選択してF3

宣言部分へ移動／メソッドの中身を知りたい時によく使用します。
【PowerShell】csvからインポートした値を配列に格納する方法

# はじめに
よく職場でやっているテクニックになります。
csvからインポートした値を配列に格納する方法についてアウトプットします。

# 今回やること
csvに用意したコマンドを実行結果に表示させる
※少し回りくどいことをしています。

## 処理の流れ

①用意したcsvの読み込み
②「foreach」でcsvの値を配列に入れる
③配列に入れたコマンドを順次表示

# 今回使用するcsv

```powershell:command.csv
command
Get-NetConnectionProfile
Get-Service
Get-NetFirewallProfile
```
<br>
※`Import-Csv`で表示させた場合の結果

```powershell
PS C:\Users\owner> Import-Csv "C:\command.csv"

command                 
-------                 
Get-NetConnectionProfile
Get-Service             
Get-NetFirewallProfile  

PS C:\Users\owner> 
```

# PowerShellスクリプト

```powershell:command.ps1
# ①csv読み込み
## csvはCドライブ直下に保存
$csvpath = "C:\command.csv"
$configs = Import-Csv $csvpath

# ②foreachにて配列に入れる
## 変数宣言
$commands = @()

## foreach実行
foreach ($config in $configs){
  $commands += $config.command
}

# ③配列に入れたコマンドを順次表示
foreach($command in $commands){
  $command
}
```

# 実行結果

```powershell:実行結果
Get-NetConnectionProfile
Get-Service
Get-NetFirewallProfile
```
過去のコミット　pushまで

# はじめに
gitで過去バージョンに戻ってpushまでの方法です。
詳しい内容までは書けていませんので、ご注意ください、、

# バージョンの確認

```
git log  （qで終了）
```
対象のバージョンを確認


# 対象のバージョンに戻る

```
git reset -—hard commitのID
```
これで戻れます。

# リモートリポジトリにpush

```
git push -f origin master  
```
リモートリポジトリを上書きするので1人で開発している時が良いと思います。

★参考
https://qiita.com/ijm/items/8cec0a5653b5e53f7f60
Gitってなんだろう😯？

こんばんは🌷


今日は、「Git」についてまとめたいと思います。

私が、Gitを学び始めた時に、

「そもそもGitって何ができて、どのように使うのだろう…」と思いました

学ぶ中で得た知識をまとめたいと思います☺︎



:open_mouth:ずばり！Gitとは

”無駄なく効率的にファイルのバージョン管理ができるツール”　　


(｀・ω・´)プログラマーは多くのコードを編集しますが、不具合が起こると元に戻したりといった作業が日常茶飯事。

それを１つ１つ保存して、また新しくコードを書いて……

そんな時間もなければ、効率が悪すぎる！！！！

　　　　　　　⇩

　　こんな問題がGitを使うと！！！


٩( ᐛ )وコンピュータ上でファイルの編集履歴と管理ができるので、編集前のファイルを残したまま、新しく編集したファイルを保存することができる！
　　　古いバージョンから新しいバージョンまでの管理が簡単



◉Gitができること

・古いバージョンに簡単に戻せる

・新旧のファイルを管理できる

・編集履歴を複数の人が管理、共有できる

。複数人で修正した内容を１つにまとめることができる






こんなことができるのだなと学びました。
まだ学び始めたばかりなので、間違っていたら教えてくださいm(._.)m
Spring-Boot で Cookie の付与・取得・削除

表題の通りです。

## Cookie の付与

レスポンスボディにCookieを付与すればよい。

```java
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Cookie;

public String cookieTest(HttpServletResponse response) throws Exception {
    Cookie cookie = new Cookie("id", "this_is_the_testmessage"); // Cookieの作成
    cookie.setMaxAge(265 * 24 * 60 * 60); // Cookieの残存期間（秒数）
    cookie.setPath("/"); // Cookieの適用対象となるサーバ上のパス
    response.addCookie(cookie);
    return "content";
}
```

## Cookie の取得

Cookieの取得は、Spring-bootでは`@CookieValue`アノテーションにて行う。

```java
import org.springframework.web.bind.annotation.CookieValue;

public ModelAndView readCookie(@CookieValue(value="id", required=false) String sid, ModelAndView mav) {
  ...
}
```

## Cookie の削除

Cookieの削除は、削除したいCookieの値をnullにし、残存期間を0秒に設定することで行う。したがって、以下のような手順となる。

```java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Cookie;

public String deleteCookie(HttpServletRequest request, HttpServletResponse response) throws Exception {
    Cookie cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        if ("id".equals(cookie.getName())) {
            cookie.setMaxAge(0);
            cookie.setPath("/");
            response.addCookie(cookie);
        }
    }
    return "content";
}
```
Vivado HLSでターミナルから高位合成する

# はじめに
Vivado HLSプロジェクトのソースコードをVSCodeなどで開いて書いている時、ふと、ターミナルからコマンドを入力して高位合成やIP出力できたら開く画面が減って便利ではないかと思いました。

ここでは、ターミナル上でVivado HLSのTclプロンプトを起動し、コマンドで高位合成とIP出力までをまとめようと思います。ただし、プロジェクトは既存のプロジェクトを開くことを前提として、最初のプロジェクト作成はGUIで済ませていることを想定しています。

# 環境
以下に示すバージョンのVivado HLSが入っているマシンにリモート接続して使用しています。

- Vivado HLS 2019.2 (Linux版)

# 手順
XilinxのユーザガイドUG902[^1]の「コマンドプロンプトとTclインターフェイスの使用」に簡単に記載されていました。
プロジェクトオープンからIP出力までのコマンドを順に並べておきます。

[^1]: [Vivado Design Suite ユーザーガイド　高位合成 (UG902)](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2018_3/ug902-vivado-high-level-synthesis.pdf)

## Tclプロンプト起動
インタラクティブモードというらしい。
ターミナルで以下のように入力すると起動する。

```shell
$ vivado_hls -i
```

これでTclコマンドを受け付けるようになります。
画面も、

```shell
vivado_hls >
```

となってコマンドを受け付けるようになっています。

## プロジェクトとソリューションを開く
プロジェクトディレクトリの直上に移動します。
プロジェクト名が、hoge_projであれば、それが見えるところ。

```shell
vivado_hls > open_project hoge_proj
```

ソリューションを開きます。
以下の例では、solution1です。

```shell
vivado_hls > open_solution solution1
```

## 高位合成する

```shell
vivado_hls > csynth_design
```

これで高位合成が実施され、しばらく待つと完了して合成レポートなどがプロジェクトフォルダに生成されています。

## IPとして書き出す
VivadoでIPとして呼び出すために書き出す場合は、以下のコマンドを使います。
いくつかオプションがありますが、詳細はコマンドのhelpを参照してください。
私はデフォルト設定のままで使えました。ここは所望の機能次第だと思います。

```shell
vivado_hls > export_design
```

## コマンドを調べる

コマンド一覧はhelpと入力すると参照できます。
様々なコマンドが存在するようですので、普段GUIで設定していることがコマンドからできるかもしれません。

```shell
vivado_hls > help
```

また、各コマンドの詳細はhelpに続けてコマンド名を入れれば参照できます。

```shell
vivado_hls > help 調べたいコマンド
```

# おわりに
ターミナルからVivado HLSの論理合成・IP出力までの一連のコマンドをまとめました。
Tclスクリプトを書けば色々自動化できそうですが、とりあえずこれでGUIを開かずに処理できそうです。
【AWS】それぞれのDBの特徴を簡単にまとめました(備忘録)

# はじめに
現在、AWSSAAの学習をしております。
DBに関する問題が出題されるのですが、特徴がごっちゃになりがちなので備忘録としてアウトプットします。

# それぞれのDBの特徴

※AWSSAAの問題集に載っているもののみに抜粋しております。

|    |  RDS  |  DynamoDB  |  ElastiCache  |  Redshift  |
| ---- | ---- | ---- | ---- | ---- | 
|  概要  |  リレーショナルデータベース  |  高速なNoSQL  |  インメモリデータストア  |  ペタバイト規模に拡張できるデータウェアハウス  |
|  特徴  |  ・管理が簡単<br>・高いスケーラビリティ<br>・可用性と耐久性<br>・高速<br>・セキュア<br>・安価  |  ・連続した高速なデータ蓄積<br>・大規模<br>・サーバー管理が不要<br>・スケールに応じたパフォーマンス<br>・整合性モデルを採用  |  ・メモリをストレージとする最も高速なアクセス<br>・フルマネージド型<br>・スケーラブル  |  ・複雑なSQLを並列処理で高速に処理**(列検索)**<br>・利用可能なクラウドデータウェアハウスの中で最も高速<br>・大量のデータを短時間で読み出し・分析することが可能  |
|  データ量  |  小～大  |  特大(無制限)<br>自動的にスケールアップ/ダウン  |  小～中  |  特大(無制限)<br>サイジングと拡張操作が必要  | 
|  アクセス速度  |  中  |  高速  |  超高速  |  高速  |
|  トランザクション処理  |  可能  |  -  |  -  |  -  | 

※トランザクション処理とは、「商品を渡して、代金を受け取る」のように「ここからここまでワンセット」になっている処理のこと
詳しくは[こちら](https://wa3.i-3-i.info/word16325.html)

# Amazon Auroraの特徴

## Amazon Auroraについて

- AWSが提供するデータベースエンジン
- 高度なMulti-AZ構成/自動復旧による高可用性/大容量ストレージのサポートを提供
- 他のRDSと比較して高いスループットを提供

## 「Aurora」と「RDS for MySQL」との比較

|  特徴  |  Aurora  |  RDS for MySQL  |
| ---- | ---- | ---- |
|  Multi-AZ構成  |  3つのAZに2つずつのレプリケーションを構成<br>※明示的にMulti-AZを指定しなくても自動構成する  | 2つのAZを使用   |
|  データベースストレージサイズ  |  最大64TiB  |  最大32TiB  |
|  最大リードレプリカ数  |  最大15  |  最大5  |
|  レプリケーションタイプ  |  非同期的(ミリ秒単位)  |  Multi-AZ構成:同期<br>リードレプリカ:非同期  |
|  リードレプリカのフェイルオーバーターゲットとして機能  |  はい(データ損失なし)  |  はい(数分間データ損失の可能性)  |
|  自動フェイルオーバー  |  はい  |  いいえ  |



# それぞれのDBの用途

|  データベースのタイプ  |  ユースケース  |  AWSのサービス  |
| ---- | ---- | ---- |
|  リレーショナル  |  ・従来のアプリケーション<br>・ERP<br>・CRM<br>・eコマース  |  ・Amazon Aurora<br>・Amazon RDS<br>・Amazon RedShift  |
|  キー値  |  ・トラフィックの多いウェブアプリ<br>・eコマースシステム<br>・ゲームアプリケーション  |  ・Amazon DynamoDB  |
|  インメモリ  |  ・キャッシュ<br>・セッション管理<br>・一時データ保存<br>・キューイング  |  ・Amazon ElastiCache for Memcached<br>・Amazon ElastiCache for Redis  |
|  ドキュメント  |  ・コンテンツ管理<br>・カタログ<br>・ユーザープロファイル  |  ・Amazon DocumentDB(MongoDB互換)  |
|  ワイドカラム  |  ・高スケールの業界アプリ<br>・ログファイルのエントリ<br>・チャットアプリケーションのメッセージ履歴<br>・大量の時系列データ  |  ・Amazon Keyspaces  |
|  グラフ  |  ・不正検出<br>・ソーシャルネットワーク<br>・レコメンデーションエンジン  |  Amazon Neptune  |
|  時系列  |  ・IoTアプリケーション<br>・DevOps<br>・アプリケーションのモニタリング |  Amazon Timestream  |
|  台帳  |  ・記録システム<br>・サプライチェーン<br>・銀行トランザクション  |  Amazon QLDB  |


# 参考
[データベースサービス](https://aws.amazon.com/jp/products/databases/)
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集 Kindle版](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
android studioのデバッグで値を監視する


android studioというかintellijというかデバッグもろもろ
最近知って便利なので備忘録
※AndroidStudio3.2

##とりあえずやる

debugでプロジェクトを起動する
debugウィンドウの眼鏡みたいなアイコンをクリックしてwatchesウィンドウを表示する
debugウィンドウが表示されてない場合は「View」→「Tool Windows」→「debug」をクリックして表示する
<img width="363" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272827/9e6462dc-c665-d62e-fe96-0f321ed1679d.png">

watchesウィンドウの緑色のプラスボタンをクリックして確認したい値を入力する
あとは適当に確認したいタイミングにブレイクポイント貼っとくとその時の中身が見れる
<img width="354" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272827/eaac4ee7-936a-c5fc-1a56-5946c155d628.png">

ブレイクポイントで止めてる途中に追加しても見れるしViewの状態も見れるしでいい感じ
<img width="385" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272827/dcbe0a6a-23e8-fb85-fafd-1c1b7be63221.png">

ほかにも便利な機能をうまく使っていきたいなぁ
psycopg2 メモ

ローカルにあったメモ書きをQiitaで供養します。
書いたのが去年なので古い情報もあるかもしれませんです。。

# psycopg2 について

`psycopg2`はPythonでPostgreSQLを扱うライブラリです。  
Refs.: [1](https://qiita.com/hoto17296/items/0ca1569d6fa54c7c4732), [2](http://initd.org/psycopg/docs/index.html)

## psycopg2 で PostgreSQL DB に接続する

`conn = psycopg2.connect({DB_URL(str)})` でDBコネクションを作成できます。  
`{DB_URL}` は `postgresql://{username}:{pass}@{IP Address or hostname}:{port}/{DB name}` で指定されます。

または、`conn = psycopg2.connect(host={IP Address or hostname(str)}, port={port number(int)}, dbname={DB name(str)}, user={username(str)}, password={pass(str)})`でも指定できます。

コネクションは不要になったら`close()`しますが、`with` 構文が使えるので使うといいと思います。

```python
import psycopg2

with psycopg2.connect({DB URL}) as conn:
    # Processes you want to do
```

## クエリを投げる

投げるために、カーソルを作ります。  
カーソルは、`conn.cursor()`で作れます。これも不要になったら`close()`しますが、`wi`（以下略）。

`cursor.execute({query string})`でクエリを実行できます。  
引数を与えたいときは、`cursor.execute('SELECT * FROM EXAMPLE_TABLE WHERE FOO = %s', (fooval, ))`といったように第二引数にタプル(またはリスト)で与えます。

また、引数を辞書（Dictionary型）で与えることもできます。その際は`%(key)s`といったようにプレースホルダにキーを与えます。  

```python
cur.execute("""
     INSERT INTO some_table (an_int, a_date, another_date, a_string)
     VALUES (%(int)s, %(date)s, %(date)s, %(str)s);
     """,
     {'int': 10, 'str': "O'Reilly", 'date': datetime.date(2005, 11, 18)})
```

```python
import psycopg2

with psycopg2.connect({DB URL}) as conn:
    with conn.cursor() as cur:
        cur.execute({query})
```

## クエリの結果を受け取る

`SELECT`とかの結果をPythonオブジェクトで受け取ります。  
`cursor.fetchone()`, `cursor.fetchall()`, `cursor.fetchmany(size)`で受け取れます。

### cursor.fetchone()

結果（クエリのresultset）の次の行から1件だけ受け取ります。結果はタプルで返ってきます。  
`cursor`が終端を指しているときに実行すると、`None`が返ってきます。

### cursor.fetchall()

結果（クエリのresultset）の次の行から全件受け取ります。結果はタプルのリストで返ってきます。  
`cursor`が終端を指しているときに実行すると、空のリストが返ってきます。

### cursor.fetchmany(size)

結果（クエリのresultset）の次の行から`size`件受け取ります。結果はタプルのリストで返ってきます。  
`cursor`が終端を指しているときに実行すると、空のリストが返ってきます。

## コミットする

デフォルトでトランザクションが有効になっているため、コミットしないと変更が反映されません。`connect.commit()`でコミットしましょう。  
`connect.autocommit = True`を設定するとトランザクションが無効になります。

## ロールバックする

`connect.rollback()`です。
コネクションを`with`構文で作成している場合、`with`ブロック内で例外が起きると自動的にロールバックされるようです。便利だね[^1]。

[^1]: [PEP249](https://www.python.org/dev/peps/pep-0249/)を満たしているかららしい
文字列を反転させる

ある文字列 `str` が与えられたとこに、その文字列をひっくり返す方法です。

## 実食

以下はJavaScript, TypeScriptでは鉄板の実装例です。

```typescript
const inverse = (str: string): string => {
  return str.split('').reverse().join('');
};
```

## 解説

やっていることは以下です。

1. `string.split()`
2. `array.reverse()`
3. `array.join()`

### `string.split()`

この文字列を`''`つまり一文字ずつに分解します。戻り値は`Array<string>`です。

### `array.reverse()`

この配列の順序を逆転させます。なおこのメソッドは破壊的🧟なメソッドなので気をつけてください。

```typescript
const arr: Array<number> = [1, 2, 3];
const reversed: Array<number> = arr.reverse();

console.log(arr);
// [ 3, 2, 1 ]
console.log(reversed);
// [ 3, 2, 1 ]
```

### `array.join()`

`Array<string>`を結合して`string`にします。

## 応用

これを使えばその文章が回文かどうかも検証ができます。

```typescript
const isPalindrome = (str: string): boolean => {
  return str === inverse(str);
}
```

しかしながら悲しいことに、これは文字列での比較のなので日本語のような同音ではあるものの文字が異なる言語の回文を判定することはできません。

```typescript
const str: string = '竹藪焼けた';

console.log(inverse(str));
// たけ焼藪竹
console.log(isPalindrome(str));
// false
```
一般家庭のセキュリティ対策まとめ

# 1. はじめに
ホームネットワーク（家庭）で一般的にとられている（とることが望ましいと考えられる）セキュリティ対策をまとめてみたくなったので、まとめてみました。

# 2. 前提条件
どこも見ずに（頭の中にある情報だけで）書きます。

# 3. 基本的なセキュリティ対策
まずは、基本的な（最低限の）セキュリティ対策を列挙します。
一般人（ITに詳しくない人）も含めてみんなやっておいた方がいいと思う対策です。

### 3-1. ネットワーク
- ルータ（ファイアウォール）を適切に設定する
- 無線LANを適切に設定する

### 3-2. デバイス（PC、タブレット、スマホ等）
- 不正プログラム対策ツールを導入する（ウイルス対策ソフトを導入する）
- ソフトウェアを最新化する（OS・アプリをアップデートする）
- 画面ロック機能を有効化する

### 3-3. ユーザ（人）
- 怪しいサイトを閲覧しない
- 不審なメール・SMSは開かない
- サードパーティのアプリストアを利用しない
- パスワードを適切に管理する
- とにかく騙されない
- 自分の身（情報）は自分で守るという意識を持つ

# 4. 追加のセキュリティ対策
続いては、追加の（とろうと思えばとることができる）セキュリティ対策を列挙します。
個人的に、できる限り実施している対策です。（1つ目は除く）

### 4-1. ネットワーク
- 有線LANを利用する（しないけど）

### 4-2. デバイス（PC、タブレット、スマホ等）
- 紛失対策機能を有効化する（GPSを内蔵しているデバイスの場合）
- 定期的にバックアップを取得する
- ローカルストレージを暗号化する（TPMを使用する）
- クラウドストレージにバックアップする（可用性の対策）
- サポート期間中のデバイスを利用する
- 一般権限のアカウントを作成・利用する（むやみに管理者権限を利用しない）
- Bluetoothを無効化する
- 定期的にウイルス対策ソフトのフルスキャンを実行する
- 不要なファイルは削除する（機密性の対策）

### 4-3. ユーザ（人）
- 利用していないサービスは解約・退会する
- 利用していないアプリは削除する
- 利用していない機能は無効化する（OSの機能）
- アプリの利用に必要のない権限は削除する
- 二要素認証・二経路認証を有効化する
- ブックマークを利用する（フィッシング対策）
- むやみにCookieの利用に同意しない（してしまいがちだけど）

# 5. あとがき
投稿後に「[一般利用者の対策｜国民のための情報セキュリティサイト - 総務省](https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/enduser/index.html)」と「[日常における情報セキュリティ対策：IPA （3. 家庭の利用者向け）](https://www.ipa.go.jp/security/measures/everyday.html#section4)」を確認したところ、「個人情報の取り扱い」と「デバイスの破棄」に関する内容が漏れていました。あと一歩。

# 6. 更新履歴
- 2020/7/14：初版投稿。その後、あとがきを追記。
【覚書】DP-200、DP-201取得を目指して、1か月全力で勉強がんばる話。



こんにちは
自分、ひょんなことから資格取得を目指すことになりました。

※これから頑張りますといった決意表明と収集した情報を覚書するための記事です。　
　普通はこういう記事は事後に書くものかもしれませんが事前に書いてます。　学習の進捗状況は随時記事化します。


### DP-200、DP-201とは
Azure Data Engineerとして認定されるための必須試験です。


-- 以下、抜粋 ---------------------------------------
Azure Data Engineers は、Azure データ サービスのあらゆる技術の知識を使用してデータの管理、監視、セキュリティ、およびプライバシーを設計および実装し、ビジネス ニーズを満たします。

職務: データ エンジニア
必須の試験: DP-200、DP-201

出典：https://docs.microsoft.com/ja-jp/learn/certifications/azure-data-engineer


  

###筆者スペック

筆者はいわゆるnoukinキャラなので
ここ数年資格取得を目指した勉強をしていなかったのですが
Azure愛を形にしたいという思いからDP-200、DP-201の資格取得を目指すことにしました。


| ステータス  |   |
|---|---|
| 体力  |  ★★★★★ |  
| 行動力  |  ★★★★★ | 
|  知力 |  ★ |  
| Azure経験値  | ★★★  | 
| Azure愛  | ★★★★★  | 
| 好きな領域  | アプリ、データ、仮想マシンで遊ぶ | 


知力低っ　　まぁ　実際こんなものです。。。
行動力とAzure愛があれば大丈夫はなず・・・！！！



### 学習に用いるもの

基本は公式のラーニングパスを中心に学習していきます。
学習時間は１日４５分を想定しています。　学習状況は随時記事にいたします。

**ラーニングパス**
https://docs.microsoft.com/ja-jp/learn/certifications/azure-data-engineer

**DP-200**
https://docs.microsoft.com/ja-jp/learn/browse/?products=azure&resource_type=learning%20path&roles=data-engineer

**DP-201**
https://docs.microsoft.com/ja-jp/learn/browse/?products=azure&resource_type=learning%20path&roles=data-engineer


　
　
### モチベーションアップや情報収集のために参考にした先人様方の記事
@Shin様 - 【初心者】Azureをざっくり学べる公式ページ　ベスト３
https://qiita.com/Shin/items/7fe494450ccf7f7924bc

Alibaba Cloudの備忘ログ様 - Azure の資格を全部とった話（現在9認定）
https://bigriver.jp/?p=5646

@y_ohr様 - Azure系の資格について
https://qiita.com/y_ohr/items/26181b59fef4ca6d1d4b

@spinrock様 - Microsoft Azure資格 (AZ-101) を取得するまでにやったお勉強のお話
https://qiita.com/spinrock/items/4a0e822eb88bcc2f0fa6

@shingo_kawahara様 - Azure認定資格 AZ-900を取得しました
https://qiita.com/shingo_kawahara/items/86b4b7599318996f6f60
laravelのマイグレーションで実行するSchemaをローカル環境に限定したい時

テスト用DBをつくりたいということで、laravelでマイグレーションを使いDBを作成。
ただ、テスト用を作成するのはローカル環境に限定したい。そう思った時に行った記述。

```php5
// マイグレーションファイル内

public function up()
{
     if (env('APP_ENV') === 'local') {
          Schema::create('users', function (Blueprint $table) {
               // 処理記述
          });
     }
}
```

.envの環境変数がAPP_ENV=localになっていることも確認。

以上。
【Rails】多階層カテゴリーから商品一覧を表示させるプロセスとは

# 前提条件
以下のことが終わっていることとする。終わっていないと機能が正しくなっているか確認が難しい。
**・ancestryを用いてカテゴリーテーブルを作成している。**
**・カテゴリー：商品 = 1：多の関係になっている。**
**・カテゴリーの階層が３段階になっておりそれぞれの命名が「親」、「子」、「孫」になっている**
**・商品モデルのcategory_idには、最下層のカテゴリーidが登録されている。**
**・gem kaminariがインストール済**
**・カテゴリーコントローラーファイルの作成及び、カテゴリーの取得ができるコードが書かれている。**
<details><summary>不安な人はここをクリック</summary>
以下のようなコードが書かれていれば、問題ない。
<img width="742" alt="_Rails_多階層カテゴリーから商品を検索・一覧表示する機能_-_Qiita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/d4ece572-cd89-c636-597e-59f4c2729395.png">
<img width="736" alt="_Rails_多階層カテゴリーから商品を検索・一覧表示する機能_-_Qiita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/9d9cb444-8876-99ca-a2d2-1613b9205d2f.png">
</details>

#カテゴリー別に商品一覧を表示させる
カテゴリーの詳細が見たいわけなのでshowアクションを用います。
###showアクション定義
`app/controllers/categories_controller.rb`

```ruby
before_action :set_category, only: :show

def show
  @items = @category.set_items
  @items = @items.where(buyer_id: nil).order("created_at DESC").page(params[:page]).per(9)
end

private
def set_category
  @category = Category.find(params[:id])
end
```

###モデルメソッド定義

`app/models/category.rb`

```ruby
has_many :items
has_ancestry

def set_items
  # 親カテゴリーだった場合
  if self.root?
    start_id = self.indirects.first.id
    end_id = self.indirects.last.id
    items = Item.where(category_id: start_id..end_id)
    return items

    # 子カテゴリーだった場合
  elsif self.has_children?
    start_id = self.children.first.id
    end_id = self.children.last.id
    items = Item.where(category_id: start_id..end_id)
    return items

    # 孫カテゴリーだった場合
  else
    return self.items
  end
end
```
@items = @category.items と記述するだけでは、
商品モデルのcategory_idには最下層のidが付与されているので@categoryが孫であった場合のみ、情報が取得されることになってしまう。
なので予め、上記のようにカテゴリーが親なのか子なのか孫なのかといったような条件分岐をするとうまくいくはず

###ビュー

`app/views/categories/show.html.haml`

```haml
.items-container
  .items-index
    .title
      = "#{@category.name}の商品一覧"
      .title__border
    - if @items
      %ul.lists
        = render "items/item", items: @items
    = paginate @items
```

このままでは他のカテゴリーへのリンクがまだ設定されていないが、
それはまた、書いていきます
【Salesforce】反省会 

Salesforce案件で過去に苦労したもの、注意すべきものに関するメモ。

■要件定義の進め方
・想定機能を明確にすること
・機能間の依存関係を明確にすること
・各機能の担当部署を明確にすること★
・要件の合意方法を明確にすること、書面／デモ？
・各機能のインプットを明確にすること
・想定成果物を明確にすること
上記のものが揃えたら
・インプットをもらい→インプットを確認／質問し→アウトプット作成→各段階のレビュー→ユーザ合意
までの順でスケジュールを組み立て
・インプットのもらい時期、ユーザさんとのレビューの調整はなるべく早めに実施すること。
注意：一般的に１つ機能検討するのに、期間的に1週間かかると見込んだ方がいいだと。。
【before_action】

##before_actionとは

before_actionはコントローラーで定義された処理を実行する前に共通の処理を行うことができるメソッドのこと

今回はコントローラー内のメソッドの実行内容が重複している場合のbefore_actionの使用例を書いていきます。

<img width="782" alt="set_action1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/e12073c8-458b-6b12-9a56-81241786f8de.png">

上の画像のようにeditアクションとshowアクションの実行内容が同じである場合は共通の処理としてまとめてしまった方が可読性も上がり、変更の際も便利なので処理をまとめる。


<img width="676" alt="set_action2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/8c098ea1-93da-299e-37ee-d85b07efbeb9.png">

まず該当のアクションを削除。

<img width="816" alt="set_action3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/0d37a02c-b151-fcf7-2bbf-23c31a94157d.png">

その後先ほど削除した共通していた処理内容をprivateメソッドの部分にset_actionとして定義する。

<img width="724" alt="set_action5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/8639bd46-499b-5c4c-4c61-4bbd3e3bc4b3.png">

最後にコントローラーの上部にbefore_actionを記述する。
今回の場合はset_actionを適用させたいのはeditとshowアクションのみなのでオプションとしてonlyを記述することで該当のアクションにのみset_actionを実行させれば良い。
Git：リモートリポジトリの指定のブランチをローカルに持ってくるコマンド

実務上で、バックエンドとフロントエンドでリポジトリのブランチが分かれていて、フロント部分との結合テストの際に、ローカルリポジトリ（自分のリポジトリ）にフロントエンドのブランチを持ってきたいと思った時に使ったコマンド。


<h2>手順１：リモートブランチをfetch</h2>
```
git fetch (リモート名）　（リモートのブランチ名）
```
※リモート名はgit remote -vで確認→originだった。

```
例）
git fetch origin develop_front
```

<h2>手順２：ローカルで新しいブランチをを作成</h2>
```
git checkout -b （ローカルで作成する新しいブランチ名） （リモート名）/（リモートのブランチ名）
```
（リモート名）/（リモートのブランチ名）を調べるためには、git branch -aで調べられる。
→remotes/以降の名前が該当

```
例）
git checkout -b develop_front origin/develop_front
```

<h2>確認作業</h2>
```
git log
```
リモートリポジトリの最新のコミットと、ローカルリポジトリの最新のコミットが同じか確認。
※リモートリポジトリはGitHub、GitLabなどでGUIで確認。

もしリモートリポジトリの方が進んでいた場合はgit fetcnとmergeを行う

```
git fetcn (リモート名） (リモートのブランチ名）
git merge (リモート名）/(リモートのブランチ名）
```

※mergeする前に、自分が現在いるブランチが、mergeしたいブランチにいるか必ず確認する
→git branch

```
例）
git fetch origin develop_front
git merge origin/develop_front
```

以上。
Kotlin 1.4-M3で追加された標準ライブラリ以外の機能(一部ピックアップ)の紹介

# はじめに
- 2020/7/6にKotlinの最新のプレビュー版である1.4-M3がリリースされました。
- JetBrainsの公式ブログでは以下の様な記事が挙げられており、標準ライブラリの更新が特に強調されています。
    - https://blog.jetbrains.com/kotlin/2020/07/kotlin-1-4-m3-is-out-standard-library-changes
- 実際には以下のリリースノートの通り、他にも変更内容が色々あり、気になる点もあったので、自分の気になるところをまとめることにしました。
    - https://github.com/JetBrains/kotlin/releases/tag/v1.4-M3
- ※そんなわけで他にも色々変更がありますので皆さんもpreview版を是非触ってみてください。

# 前提
- リリースノートのうち、主にfixes以外の部分を見ることにしました。
- IntelliJ IDEA 2020.1.3を利用しています。
- 大体気になる順に書いています。

# マルチプラットフォーム関連
## プロジェクト作成ウィザード
- IntelliJからマルチプラットフォームプロジェクトを新規作成するウィザードが更新。M2でExperimentalとして追加されたウィザードがそのまま反映され、旧ウィザードが削除された形。
- もう少し並行して残すのかと思いきや、消す思い切りは良いですね。
- ※見た目も若干変わっています。

![スクリーンショット 2020-07-14 22.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151249/44e67c89-55fd-f3ce-d261-3b7150f80526.png)

## Androidアプリのテンプレート誤り修正
- 1.4-M2で新ウィザードを使って新規にPJを作った際、Androidアプリ側ではAndroidManifestの以下の`android:theme`のプロパティが存在せず、端末/エミュレータ上でアプリを動かそうとした時に落ちていました。

```xml

    <application
            android:allowBackup="true"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">

...以下略
```
- 正直なところ、大した修正ではないので、手動でも対応できますが、利用の際に少しでもハードルを下げることはとても重要なので、迅速に更新されたのがとてもありがたいです。

# IDE Navigation
## Kotlinがナビゲーション機能に対応
- IntelliJ2020.1では、Javaにおいてメソッドのナビゲーション機能が使うことができるようになりましたがKotlinには対応していませんでした。
- この機能がKotlinでも使えるようになりました。
  - Kotlinアイコンも表示されます。
  - トップレベル関数も表示されます。

![スクリーンショット 2020-07-14 20.12.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151249/874ca8f9-e583-6e3e-3ec0-075db30be63c.png)

## actual/expect間の遷移
- マルチプラットフォームで使われるexpect/actualを付与した関数・プロパティですが、このactualとexpectの間で遷移できる様になりました。
- expectの方であれば、以下の様な`A`アイコンをクリックすると遷移できます。(actualからも同様に`E`アイコン)

![スクリーンショット 2020-07-14 20.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151249/9d4f80b8-6e44-7912-f23e-9ddd8544d449.png)

# IDE Project View
- IntelliJのStructureタブで、可視性を使ってソートできるようになりました。

![スクリーンショット 2020-07-14 20.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151249/9294b7ed-7b80-e8ca-934b-0d2b43ebbc54.png)

- また、プロパティの表示・非表示についても切り替えられるようになりました。

![スクリーンショット 2020-07-14 20.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151249/afaaea5d-9ae5-cd52-ea8a-ea57203b81cd.png)

# その他IDE関連
## IDEのCodeStyleのKotlinでImport Layoutの項目が追加
- 「インポートの最適化」を行った時のパッケージのimport順序を設定できます。

![スクリーンショット 2020-07-14 21.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151249/35c37720-f9e9-6752-0b35-759b4305c243.png)

## trailing comma関連
- 以下のようなtrailing commaについて、1.4で対応できる様になりますが、この様な状態からJoin linesで1行にまとめる際に、末尾のカンマを削除するようになりました。
- before 

```kotlin
    fun func1(val1: Int,
              val2: Int,
    ) {}
```

- after

```kotlin
    fun func1(val1: Int, val2: Int) {}
```

# その他
- この他、補完などでも追加や変更が入っていますが、実際に使う際に体感することが多いと思いますので、特に記載しません。

# おわりに
- そんなわけで、Kotlin 1.4-M3で、公式ブログ記事で書かれていない内容を中心に自分の気になった点を書いてみました。
- 私がチェックしきれなかった変更は他にもありますので、是非皆様も実際に使ってみてはいかがでしょうか。
- Kotlinはプレビュー版のリリースでも毎回結構な変更が入っているので、今後もチェックしていこうと思います。
[2020July] iPad の UDID を Linux で確認する

# はじめに

iPhone や iPad のアプリをテスト配信する際、純正の TestFlight を利用しない場合は、AdHoc 配信の延長となり、Provisioning Profile に端末の UDID を登録してビルドする、という手順から逃れられないようです。

不幸にも端末に一意の UDID が資産管理台帳に掲載されていない場合でも、トランキーロ、慌てる必要は無さそうです。

UDID は Linux でも確認できます。


# 手順

簡単です。`lsusb -v` コマンドで表示されます。

```
$ lsusb -v
（省略）
Bus 001 Device 010: ID 05ac:12ab Apple, Inc. iPad 4/Mini1
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x05ac Apple, Inc.
  idProduct          0x12ab iPad 4/Mini1
  bcdDevice            5.03
  iManufacturer           1 Apple Inc.
  iProduct                2 iPad
  iSerial                 3 0123456789012345678901234567890123456789
  bNumConfigurations      4
（省略）
```

iSerial の４０桁の１６進数が Xcode で表示される UDID と同じ値です。


# おわりに

「Windows UDID」と検索すると出てくる記事でも、同じ情報を引用する方法が載っています。なので、たぶん、しばらくこの方法が通用するんじゃないでしょうか。

まぁでも、一度だけ正規の手順で調べて台帳に書いておく、それが正解だと思います。