OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-Cのダサい配列操作をわりかしまともにする

# Objective-Cしんどい

大昔Objective-Cはサイコーだと思ってた時期はあったが、近代的な言語に触れてからだとだいぶ冗長でしんどく感じるObjective-C。
Objective-CとSwiftが混ざっているプロジェクトを触る必要があって、せめてよく使う配列操作だけでもなんとかしようと工夫してみた。

```objc
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSArray<__covariant ObjectType> (Functional)

@property(nonnull, readonly) void (^forEach)(void(^)(ObjectType _Nonnull object));
@property(nonnull, readonly) NSArray<ObjectType>* _Nonnull (^filter)(BOOL(^)(ObjectType _Nonnull object));
@property(nonnull, readonly) NSArray<id>* _Nonnull (^map)(id(^)(ObjectType _Nonnull object));
@property(nonnull, readonly) NSArray<id>* _Nonnull (^flatMap)(NSArray<id>* _Nonnull (^)(ObjectType _Nonnull object));
@property(nonnull, readonly) id (^reduce)(id initialValue, id (^)(id accum, ObjectType _Nonnull object));

@end

NS_ASSUME_NONNULL_END
```

```objc
@implementation NSArray (Functional)

-(void (^)(void (^ _Nonnull)(id _Nonnull)))forEach {
	return ^(void(^block)(id)) {
		for(id elem in self) block(elem);
	};
}

-(NSArray<id>* _Nonnull (^)(BOOL (^ _Nonnull)(id _Nonnull)))filter {
	return ^(BOOL (^blk)(id)) {
		NSMutableArray<id> *arr = NSMutableArray.array;
		for(id elem in self) if(blk(elem)) [arr addObject: elem];
		return arr;
	};
}

-(NSArray<id> * _Nonnull (^)(id (^ _Nonnull)(id _Nonnull)))map {
	return ^(id(^blk)(id)) {
		NSMutableArray<id> *arr = NSMutableArray.array;
		for(id elem in self) [arr addObject: blk(elem)];
		return arr;
	};
}

-(NSArray<id> * _Nonnull (^)(NSArray<id> * _Nonnull (^ _Nonnull)(id _Nonnull)))flatMap {
	return ^(NSArray<id>*(^blk)(id)) {
		NSMutableArray<id> *arr = NSMutableArray.array;
		for(id elem in self) [arr addObjectsFromArray: blk(elem)];
		return arr;
	};
}

-(id (^)(id, id (^ _Nonnull)(id, id _Nonnull)))reduce {
	return ^(id initialValue, id (^blk)(id, id)) {
		id accum = initialValue;
		for(id elem in self) accum = blk(accum, elem);
		return accum;
	};
}

@end
```

# 動くか確かめる

```objc
+(void)test {
	NSArray<NSNumber *>* array = @[@1, @2, @3, @4, @5, @6];
	id a = array.map(^id(NSNumber *  _Nonnull object) {
		return @(object.intValue * 2);
	});
	
	id b = array.filter(^BOOL(NSNumber* _Nonnull object) {
		return object.intValue % 2 == 0;
	});
	
	id c = array.flatMap(^NSArray<id> * _Nonnull(NSNumber* _Nonnull object) {
		return @[object, object];
	});
	
	id d = array.reduce(@0, ^id _Nonnull(NSNumber* _Nonnull accum, NSNumber* _Nonnull object) {
		return @(accum.intValue + object.intValue);
	});
	
	NSLog(@"%@", a);
	NSLog(@"%@", b);
	NSLog(@"%@", c);
	NSLog(@"%@", d);
}
```

```terminal:出力
2020-10-19 22:34:31.161505+0900 Objective-C Hacks[37672:1250661] (
    2,
    4,
    6,
    8,
    10,
    12
)
2020-10-19 22:34:31.161649+0900 Objective-C Hacks[37672:1250661] (
    2,
    4,
    6
)
2020-10-19 22:34:31.161797+0900 Objective-C Hacks[37672:1250661] (
    1,
    1,
    2,
    2,
    3,
    3,
    4,
    4,
    5,
    5,
    6,
    6
)
2020-10-19 22:34:31.161942+0900 Objective-C Hacks[37672:1250661] 21
```

# まだ極めてイケてない

これがObjective-Cの限界か？
マクロとかゴリゴリ悪用したらもっとよくならないかな。
それから配列にオブジェクトしか入らない粗末な仕様だからNSNumber入れたり出したりがダサさを際立たせてる。

こうしてみるとSwiftの型推論だとかクロージャとかがマジで記述量減らしてくれて楽。
環境構築, Build, apkまで - Vue-Vuetify-Cordova 編 -

#私のスタイル
初めまして。翁と申します。
ミニマルで強迫観念やストレスなく、かつ最大限を提供する
"Huge Minimalism"
を提唱し、スタイルとして活動させていただいてます。
お手柔らかによろしくお願いいたします。

あくまで"より高みへ。"を意識しており
一記事執筆5分以内と制限しております。ご理解いただけたらと思います。

少しでも痒い所に手が届くような貢献が出来たらと思います。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791056/d34ae6c5-0abd-c26f-82c3-7c2cce947b29.png" width="300px">


## １．Cordovaによるapk作製
```
vue create sample-app
vue add vuetify
vue add cordova
cd src-cordova
```

以下を使うことで、普通のdistへのjs吐き出しじゃなくて、cordova内に吐き出す

```
yarn cordova-serve-android # Development Android
yarn cordova-build-android # Build Android
//これそのままBuild全部、リリースまでしてくれる

//その他
yarn cordova-serve-ios # Development IOS
yarn cordova-build-ios # Build IOS
yarn cordova-serve-browser # Development Browser
yarn cordova-build-browser # Build Browser
```


## ２．署名していく
署名がないとapkファイルが開けない。
### １．署名
```
//keytool -genkey -v -keystore <鍵ファイル名> -alias <エイリアス名> -keyalg RSA -validity <有効期間>
keytool -genkey -v -keystore .keystore -alias test -keyalg RSA -validity 10000

//jarsigner -verbose -keystore .keystore unsigned.apk test
jarsigner -verbose -keystore .keystore unsigned.apk test
```

### ２．最適化する
```
//zipalign -v 4 <元のapkファイル> <最適化後のapkファイル>
zipalign -v 4 
```
ネットワーク知識

#ネットワーク

##ネットワーク階層構造

| OS参照モデル| TCP/IPプロトコル | TCP/IPモデル |
|:----------------:|:-:|:-:|
| アプリケーション層|HTTP、SMTP、POP３、DNSなど|アプリケーション層|
| プレゼンテーション層|HTTP、SMTP、POP３、DNSなど|アプリケーション層|
| セション層|TCP、UDP、アプリ層プロトコル含む|アプリケーション層|
| トランポート層|TCP、UDP|トランスポート層|
| ネットワーク層|IP|インターネット層|
| データリンク層|LAN、WANの規格|ネットワークインタフェース層|
| 物理層|LAN、WANの規格|ネットワークインタフェース層|

＊データリンク層はMACアドレス宛先で通信を実施


・レイヤ２スイッチ
　OSI参照モデルのデータリンク層該当
　MACアドレスを参照してフレーム中継を実施。必要なポートだけに送信が可能。
　レイヤ２スイッチが持つテーブルを**MACアドレステーブル**と呼ぶ

・ルータ、レイヤ３スイッチ
　OSI参照モデルのネットワーク層に該当
　IPアドレスを参照してパケット通信を実施。異なるIP同士でも通信可能。
　ルータが持つデーブルは**ルーティングテーブル**と呼ぶ
　
##VLAN
・VLANとは？
　Virtual LANの略。レイヤ２スイッチを複数の仮想スイッチに分割する機能。
　VLANを使うことで、接続されている端末をグループ化し、仮想的なセグメントを構成することができる。
　物理構成にとらわれない仮想的なサブネットを構成できる。

・どうやってVLANするの？
　最も一般的な方法として**ポートベースVLAN**が挙げられる。
　スイッチの物理的なポート単位でVLANのグループを構成する方法である。

・気をつけることは？
　異なるVLAN同士は同じレイヤ２スイッチに接続されていても直接の通信を行うことができない。
　VLAN間通信を行うにはルーターやレイヤ３スイッチが提供する「ルーティング機能」が必要になります。

##ルーティング
・ルーティングって？
　宛先ホストまでにパケットを届ける経路制御のこと。
　OSI参照モデルのネットワーク層の機能として定義される。

・どうやってルーティングするの？
　ルーターやレイヤ３スイッチはルーティングテーブルをもち、
　ルーティングテーブルと受信パケットの宛先IPを参照して、転送する。

・ルーティングする方法は？
　**スタティックルーティング**と**ダイナミックルーティング**がある。
　前者は手動でルート情報を追加/更新する。作業負荷が高い。
　後者はルーティングプロトコルにより自動的にルート情報を追加/更新する。障害時の冗長化も提供される。
　代表的なルーティングプロトコルはRIP・OSPF・EIGPP。

##IEEE802.1Q　タグ
・何それ？
　IEEE802.1Qはスイッチ間リンクを流れるフレームをタグ付けするためのIEEE標準規格。
　タグはVLANを識別するためのVLAN　IDが含まれる。
うんち💩でも足し算がしたい！～絵文字で四則演算～

# はじまり

実家に帰ったら甥(6)にこんな質問をされた。

**「💩+6は なーんだ？」**

「カレーライス！」と適当に答えると、甥は満足そうに「正解！100点！」と言って去っていった。このとき私はまだ齢6才の甥がUnicodeを知っていることに気づいていなかった…。
<br>

# 💩の足し算を考えてみる

甥曰く

「先生に”数字以外で足し算はできません。"って言われた」

らしい。だがそんなことはない、Word2Vecで
`「王様」- 「男」+ 「女」= 「女王」`
の演算ができたように、💩にも四則演算を導入してあげればいいのだ！（適当）



「うんこ」という文字列に対して6を足すのは難しそうなので、絵文字「💩」に6を足すことを考える。絵文字に限らず文字は内部的にはUnicodeで表現されているらしい。（2020/06現在ではUnicode 13.0 が最新）

例えばフルーツと野菜は以下のような種類がある。[参考][1]

| Unicode | 表示 | 名称        |
| :------ | ---- | ----------- |
| 1F345   | 🍅    | TOMATO      |
| 1F346   | 🍆    | AUBERGINE   |
| 1F347   | 🍇    | GRAPES      |
| 1F348   | 🍈    | MELON       |
| 1F349   | 🍉    | WATERMELON  |
| 1F34A   | 🍊    | TANGERINE   |
| 1F34B   | 🍋    | LEMON       |
| 1F34C   | 🍌    | BANANA      |
| 1F34D   | 🍍    | PINEAPPLE   |
| 1F34E   | 🍎    | RED APPLE   |
| 1F34F   | 🍏    | GREEN APPLE |
| 1F350   | 🍐    | PEAR        |
| 1F351   | 🍑    | PEACH       |
| 1F352   | 🍒    | CHERRIES    |
| 1F353   | 🍓    | STRAWBERRY  |

ここで足し算を
`🍌 + 1 = (🍌のUnicode値 + 1 の絵文字) = 🍍`と決めよう。

その他演算も同様に

引き算：
`🍌 - 1 = (🍌のUnicode値 - 1 の絵文字) = 🍋`

わり算：
`🍌 / 2 = (🍌のUnicode値 / 2 の絵文字) = 簾`

かけ算：
`🍌 * 2 = (🍌のUnicode値 * 2 の絵文字) = U3E698`

また絵文字同士の四則演算も同様にできることにする。

※わり算は見たことがない漢字が出てきがちで、かけ算はUnicodeの範囲から外れてしまうのが残念…。でもとりあえず足し算ができるのでヨシ！としよう。


# Pythonでいじる

Unicodeの表を眺めて探すのは人間のやることではない。Pythonにやらせよう。

Unicodeの値はPythonでは組み込み関数`ord`で取得できる．

```python
>>> ord('💩')
128169

# 16進表示で`U+1F4A9`と書くのが普通なので一応
>>> hex(ord("💩"))
'0x1f4a9'
```

そして`chr`でUnicode値を文字に変換する。

```python
>>> chr(128169)
'💩'
```

このUnicode値で足し算をしてみる。

```python
>>> chr(ord('💩') + 6)
'💯'
```

なるほど．`💩+ 6 = 💯` ！！　確かに「うんこ + 6 = 100点」、甥っ子すげえな！

<br>

# Unicode物語

どうでもいいけど、💩の絵文字の近くは物語を感じる配置になってる。



| Unicode | 表示 | 名称                   | 物語                               |
| ------- | ---- | ---------------------- | ---------------------------------- |
| 1F4A1   | 💡    | ELECTRIC LIGHT BULB    | バグを解決する方法をひらめいた💡    |
| 1F4A2   | 💢    | ANGER SYMBOL           | と思ったが、ダメダメでおこ💢        |
| 1F4A3   | 💣    | BOMB                   | 勢いでＰＣを爆破💣                  |
| 1F4A4   | 💤    | SLEEPING SYMBOL        | 家に帰って寝るぜ💤                  |
| 1F4A5   | 💥    | COLLISION SYMBOL       | たたき起こされた💥                  |
| 1F4A6   | 💦    | SPLASHING SWEAT SYMBOL | 急いで職場へ向かう💦                |
| 1F4A7   | 💧    | DROPLET                | 泣いて謝る💧                        |
| 1F4A8   | 💨    | DASH SYMBOL            | 謝ったらスッキリして屁が出た💨      |
| 1F4A9   | 💩    | PILE OF POO            | ついでに💩                          |
| 1F4AA   | 💪    | FLEXED BICEPS          | 💪<力こそパワー。筋肉は裏切らない。 |

（※これで何かがわかることは決してないし、Unicodeを定めた人はこんなアホなことを考えていないと思う。）



# 個人的におもしろかった数式

## 一位： 💩 / 6 = 危

→ 排泄物の16.6%は危ない

おわり。

<br>

# 最後に

単純にUnicodeの値で四則演算をすると演算が閉じていないのが残念だけど、とりあえずうんこでも足し算ができることがわかりました！！

# 参考文献

[1]:http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/u1f300.html
[2]:https://lets-emoji.com/pile-of-poo-emoji/

[図書館員のコンピュータ基礎講座][1]
：Unicodeの表を参考にした

[Let’s EMOJI][2]
：絵文字の一覧表や検索が便利
Macのメモアプリで検索できなくなった時の対処法

# 環境
macOS 10.14.5 Mojave
-> 10.15.7 Catalina

# メモアプリのバグ

いつ頃からか覚えていないが、メモの中身には書いてあるのに検索してもでてこなくなった。

iphoneでの同様のバグ

[iPhoneメモアプリの検索機能で検索できない見つからない時の対処法](https://monew.jp/iphone-memo-search-doesnt-work/)

iOSの方はiOS 13.2.3で修正された模様
[Apple、iOS13.2.3 リリース。メール・ファイル・メモ検索ができない問題を修正](http://itea40.jp/news/software-update/ios-13-2-3-software-update/)

# 動くようになるまでにやったこと

手動で見つけたが検索にヒットしないメモの内容を更新する
=> 更新された記事が検索にヒットするようになる。

このことから、キャッシュが原因であることが予想できる。


メモの再起動
=> 治らない

OSのアップデート
macOS 10.14.5 Mojave -> 10.15.7 Catalina
=> 治らない

検索条件の一部を古いメモに記述 (Timelineと検索してたのでtimeと入力した)
=> **治った**(全てのメモから検索できるようになったっぽい)

# 考察
メモの検索対象のキャッシュに問題があったと仮定する。

その時以下の対応のどれかで治ったのではないかと予想する。

## 予想1 OSをCatalinaにアップデートした上で、なんらかのメモを更新する
OSのアップデートでは治らなかった。
更新したら治ったというところから、以下が考えられる。

- **OSをアップデートすることによってキャッシュの作り方が更新されるが、キャッシュそのものは更新されない**
- **メモの更新を行ったことでキャッシュの更新が走った**

## 予想2 古いメモを更新すると治る

- **OSのアップデート更新関係なく、古いメモを更新すると治る？**

## 予想3 検索条件をいれたまま更新すると治る

- **検索条件を入れたままにするとキャッシュの更新が走る？**

# まとめ
どうしてなおったのかが確定せずにすっきりしないが、動くようになった。
私と同様のバグに遭遇したら是非上記の対応を試してみてください。

何かわかったらコメントいただけると幸いです。
Ubuntu18.04でTP-LinkのArcher T9UHを使う

## はじめに
usbで差すタイプのwifiアダプターをubuntu PCで使う時に、セットアップで沼ったのでそのメモ

## そもそも
自作PCを作ってwifi繋ごうとしたら有線のみだったという大ボケかまして
渋々usbタイプのwifiアダプター(TP-Link)を使ってその場をしのいでました。

その後わけあってUbuntu 18.04をデュアルブートして、いざ使おうとしたら問題が発生。
ドライバのインストール方法がUbuntu 16.04 しかない！

参考サイト
https://itectec.com/ubuntu/ubuntu-installing-driver-for-tp-link-archer-t9uh-ac1900-on-ubuntu-18-04/

Ubuntu 20.04とかリリースしてるのになんで無いんだよ！
ということで，Ubuntu 18.04でセットアップしたときの方法をまとめました。

ちなみにセットアップの過程で一回有線繋ぎました。
オフラインでインストールする方法についても簡単に記載しました。(2021/3/7追記)

## インストールしたもの
gcc v7.5.0
git v2.17.1


## 手順
有線に繋いで必要なものをインストール

```
sudo apt-get install gcc
sudo apt-get install git
```
以上です。
Ubuntu 16.04のマニュアルではバージョンが明記されてましたが、最新のgccでドライバを動かすのは十分でした。

次にドライバですが、これはgitにソースコードがあるのでそれをクローンしてきます。
オフラインで行うなら別のPC(Windowsとか)でZIPファイルをダウンロードしてUSB経由でコピーするでも可。

```
git clone https://github.com/aircrack-ng/rtl8814au.git
cd rtl8812au
```
この後ビルドをするわけですが、ここで何度ビルドしてもwifiに繋がらず、沼にハマりました。
結論から述べるとgitのブランチを変えれば良かったというクソショウもない理由でした。

ブランチを見てみるとこんな感じ

```
$git branch -a 
  remotes/origin/EXPERIMENTAL
  remotes/origin/HEAD -> origin/v5.6.4.2
  remotes/origin/v4.3.21
  remotes/origin/v5.1.5
  remotes/origin/v5.2.20
  remotes/origin/v5.2.9
  remotes/origin/v5.3.4
  remotes/origin/v5.6.4
  remotes/origin/v5.6.4.1
  remotes/origin/v5.6.4.2
  remotes/origin/v5.7.0
```

見て分かるようにいくつかバージョンがあることが判明
ということで適当に繋がるブランチにしてビルド→再起動の流れ

```
git checkout -b v5.7.0 origin/v5.7.0
sudo make
sudo make install
sudo reboot
```
自分の環境では上のブランチでwifiに繋がるようになりました。
gitのブランチとか単純なことだけど意外と沼る人は多いんじゃないですかね？

## 有線に繋げないという方は~~(2021/3/7追記)
有線を探すのが一番簡単ですが、できない方はubuntuのインストールメディアを使ってbuild-essentialのインストールが出来ます。
※ubuntuのバージョンやbuild essentialのバージョンなどで多少場所が異なると思います。

```
sudo apt install /media/${USER}/UBUNTU\ 18_0/pool/main/b/build-essential/build-essential_12.4ubuntu1_amd64.deb
```
ドライバに関しては↓のリンク先のCodeからzipファイルをダウンロードしてUSB経由でUbuntuのどこかに設置して下さい。
https://github.com/aircrack-ng/rtl8814au

設置したらあとは以下のコマンドで終了

```
cd rtl8814au
sudo make
sudo make install
```

再起動してwifiつながったらbuild-essentialをアップデートするとか、
ドライバをgitで管理できるようにするとかするのが無難かと思います。


## 補足(たまにwifi繋がんなくなる時がある)
時たまあるアップデートのときに再起動するとなぜかwifiに繋がらなくなります。(kernelがアップデートされるから？)
その時はビルドして再起動で動くようになります。
dkmsとかで設定すると治るのかな〜
## あとがき
マニュアル見た時、無線しかないからドライバ買ってんのにapt-getでインストールさせるとかアホなの？って正直思いましたwww。

Ubuntu 20.04もリリースしてしばらく経つのでそろそろそっちにアップグレードするのも視野に入れ始めてます。
多分同じ方法で対応できるとは思いますが、駄目ならまたgitのソースコード探す必要がありそうです。
[GAS]フォルダ一覧の取得

```javascript

function getFolders() {
  
  rowIndex = 1; // The starting row of a range.
  colIndex = 1; // The starting row of a column.
  
  const sheetName = "シート1"; //入力したいシートを宣言
  
  const folder_id = "1*********************"; //フォルダIDを指定する
  
  const folders = DriveApp.getFolderById(folder_id).getFolders();
  
  let foldersArray = [];
  
  while(folders.hasNext()){
    const childFolder = folders.next();
    //console.log(childFolder.getName())
    //console.log("Name: "+ childFolder.getName()+" \nURL: https:\/\/drive.google.com\/drive\/u\/0\/folders\/"+childFolder.getId())
    foldersArray.push([childFolder.getName(), childFolder.getUrl()]);
  }
  
  const range = SpreadsheetApp.getActive().getSheetByName(sheetName).getRange(rowIndex, colIndex, foldersArray.length, foldersArray[0].length);
  range.setValues(foldersArray);
}
```

時間ができたら細かく説明します

# 参考


- [【GAS】Google Apps Script 活用事例　Google Driveのフォルダ一覧を取得する方法｜nepia_infinity｜note](https://note.com/nepia_infinity/n/n5b7b01d09199)
- [GAS 入門 - DriveApp クラスリファレンス｜Yuta NAKAMIZO｜note](https://note.com/yutanakamizo/n/n64821c3125ca)
- [Google Apps Script - GASで特定フォルダ内のフォルダ名一覧を作る方法を教えてください。｜teratail](https://teratail.com/questions/245033)
- [フォルダの一覧取得・作成・削除（Folder）｜Google Apps Script入門](https://excel-ubara.com/apps_script1/GAS037.html)
- [【GAS】Google Apps Script 活用事例　Google Driveのフォルダ一覧を取得する方法｜nepia_infinity｜note](https://note.com/nepia_infinity/n/n5b7b01d09199)
Google ChromeでBad Requestが発生した件

# 概要
社内で運用しているWebアプリに、Google Chromeでアクセスした場合に「Bad Request」になるとの声があがっていました。

気になる点としては、
- 再現性が低いこと
- Cookieやローカルストレージを削除しても改善されないこと

事象が発生したブラウザではどうあがいても再発し、発生しないブラウザでは特に発生しない。そんな感じでした。
原因の切り分けに非常に時間を要したので、備忘録に記録しようと思います。

# 環境
AWSのEC2サービスで、下記の運用としています
- ALB
- EC2(Amazon Linux2) * 2
    - httpdとtomcatをAJP連携

# 事象発生の操作
アクセスするとログイン画面が表示され、ログインを実行することにより、サービスが使用できる、というものなのですが、
ログインページアクセスのGETリクエストは問題無くでき、ログイン処理のPOSTリクエストでBad Request発生と言う、なんとも気持ち悪いものでした。

# 切り分けで確認したこと
- ログはどこまで届いているか
    - httpdのaccess_logに、400エラーの記録有り
        - httpd.confに「RemoteIPAddr X-Forwarded-For」の設定があるにも関わらず、400エラー発生時はクライアントIPがELBのIPで出力され、ヘッダの「X-Forwarded-For」にアクセス元IP情報が残っていた
    - tomcatのcatalina.outにはhttpアクセスログの記録無し
- ALBまわりでエラーは無いか
    - リクエストやレスポンスにスティッキーセッションで割り当てられるCookieが確認できた
        - このサービス設定面においては、特に問題は無さそう

このあたりで、不思議な点がいろいろ出てきてすごく混乱しました。笑
まずRequest Headerを成功時と失敗時で比較すると何かわかるかと思い、ChromeのDevelopper Tool機能でファイルダンプして比較してみたところ、差分が確認できました。
参考：https://smakoma.com/http-header-chrome.html

差分としては、失敗時のヘッダに「sec-ch-ua」「sec-ch-ua-mb」の2件がありました。なんやねんこいつら…
調べてみると、User-Agent Client Helper機能によるものだそう。
参考：https://qiita.com/nightyknite/items/257251b9692dff1b62be

試しに、成功する方のブラウザで機能をONにしたらそれらの情報がリクエストヘッダに載り、Bad Requestが再現しました。
しかしながら、Bad Request発生ブラウザを確認しても、その環境も当該機能はOFFだし、OFF→ON→OFFにしても変わらずリクエストヘッダには載る… なんでやねん。載らんでいらんねん。

とは言え、これらの有無の差分が今回の事象のネックだろうと。
ただ、User-Agent Client Helperまわりのリクエスト不具合をググっても何も出てこない。

土日挟んで今日の月曜も悩んでるところに、httpdの「LimitRequestFields」のブログ記事を見つけました。
リクエストヘッダ件数がこの値を上回った場合、エラーとなると。
これちゃうか、、、

試しに、失敗時のダンプからリクエストヘッダ件数を見ると21件。httpd側の設定値は20。
こいつかい〜〜

# 原因と解消法
- Google ChromeのUser-Agent Client Helper機能によって、リクエストヘッダ件数が2件増えていて、httpd側の制限を超過していた
    - httpd側の制限を拡張

# 所感
これに1週間くらい費やしました。。。
まだ、不明確な懸念点もいくつか残っていますが、取り急ぎBad Request表示は解決されました。
ただ、何故環境によってはUser-Agent Client Helper機能が強制有効なんでしょうか… これほんま謎。

しかし、困ったら成功パターンと失敗パターンで差分確認する。これやっぱ鉄則ですね。
スライディングウィングを創造で書いた。


```
img = np.array(range(100)).reshape([10,10])
img = np.zeros([100,100])
img[0:50,0:50] = 1

win_size = 2
def SlidingWindow(win_size,img):
  split_img = []
  yx = []
  for i in range(img.shape[0]-win_size+1):
    for j in range(img.shape[1]-win_size+1):
      split_img.append(img[i:i+win_size,j:j+win_size])
      yx.append([i,j])
  all = []
  for img_,yx_ in zip(split_img,yx):
    all = all + [(i+yx_[0],j+yx_[1]) for (i,j) in list(zip(*np.where(img_ == 1)))]
  return Counter(all)
SlidingWindow(4,img)
```
AWS Cloud9でNext.jsを動かしたときのメモ

# 状況
開発に使っていたMBPが修理行きになり帰ってくるまでの数日だけAWS Cloud9で凌ぎたい
(数日だけの為に非開発用途のPCに開発環境を建てて汚したくない)

# 手順
### 1. 普通にCloud9立ち上げる
https://aws.amazon.com/jp/cloud9/

### 2. Cloud9からGithubにSSH通るようにする
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

### 3. next.jsプロジェクトをgit cloneしてくる

### 4. 依存パッケージ入れる(npm install / yarn)

ここらへんで`No space left on device`とかのエラーがでたら初期容量10GBがいっぱいになってるのでディスク増やす
https://qiita.com/itotoma/items/d266df563367a0a14268

### 5. next.js立ちあげる(npm run dev / yarn dev)

ここらへんで `Error from chokidar (/home/ec2-user/environment/....): Error: ENOSPC: System limit for number of file watchers reached, watch '/home/ec2-user/environment/....'`ってエラーが頻発する場合はファイル同時監視数の上限なので上限をあげる
https://www.virment.com/how-to-fix-system-limit-for-number-of-file-watchers-reached/

ちなみに`yarn dev --port 8080`または`npm run dev --port 8080`として8080ポートで立てると`Preview => Preview Running Application`でプレビューが確認できる。

# おまけ
Cloud9のエディターは補完があんまり良く動かないのでEC2から公開鍵登録してsshでvscode繋げると多少は良い
https://blog.mmmcorp.co.jp/blog/2019/08/30/cloud9-with-vscode/

# あとがき
手順 4, 5 ではまった3つの箇所以外は基本的に何の問題もなく導入できた。
最初iPadでやろうとしたけど、マウスポインター無いのは操作が不便すぎて諦めた。

慣れないのもあるし普通に使いにくい気もするけど修理から返ってくるまでは何とか耐え凌ぎたい
【Java】オーバーロード・オーバーライド・継承について

Javaのオーバーロード・オーバーライド・継承について学んだことをメモします。

#オーバーロード
オーバーロードとは、**引数の型や数が異なる同名のメソッドやコンストラクタを複数記述すること。**

##オーバーロードを用いたメソッド

同じメソッド名だが、与える引数の数によって返り値が変わることも。
これは足し算を行うplusメソッドを定義する。

```keisan.Java
//足し算をする sumメソッド

public class sum {
    public int sum(int a) {
        return a;
    }
    public int sum(int a, int b) {
        return a + b;
    }
    public int sum(int a, int b, int c) {
        return a + b + c;
    }
}
```
##クラスを継承する。
継承とは、任意のクラスを別のクラスで受け継ぐこと。

今回は先ほどのKeisan.JavaをTask.javaで継承し、引数を与えて計算をする。

```Task.java
public class Task extends Keisan {

     public void taskJikkou() {
       System.out.println("【実行結果】");
       System.out.println("aは"Sum(1)); //結果:aは1
       System.out.println("a + bは"Sum(5, 10)); //結果: a + b は15
       System.out.println("a + b + cは"Sum(100, 150, 200)); //結果: a + b + c は450
       }
} 
```
Main.javaでインスタンスを生成し実行する。

```Main.java
 public class Main {
 
     public static void main(String[] args) {
        Task task = new Task(); //インスタンスを生成
        task.taskJikkou(); //Task.javaの taskJikkouメソッドを呼び出す。
     }
 }
```
```
【実行結果】
aは1
a + b は15
a + b + c は450
```

今回は計算でやっていましたが、これらを使うことでいろいろなことを表現できそうですね。
車の「運転」や、RPGの「こうどう」など、使い道はたくさんありそうでワクワクします。
【初心者でもわかる】ちょっと浮くボタンの作り方と、押した風のボタンの作り方

# どうも7noteです。2種類の動きアリのボタンの作り方。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/fuwabtn/
さっそくiOS14のWidgetKitを導入してみて分かったこと

iOS 14 からウィジェットが導入されて、ホーム画面から様々な情報を得ることができるようになりましたね。今回は、自分のアプリで導入にチャレンジしてみて得た Tips を軽くまとめたいと思います。

# Tips（ポジティブ編 😀）

## ウィジェットのサイズは３タイプあり、指定できる

ウィジェットには、Small、Medium、Large の３タイプがありますが、WidgetConfiguration の supportedFamilies()で任意のタイプのみを指定できます。また、表示する時にそれぞれのタイプごとにコンテンツを切り替えることもできます。

## Web 通信した情報に基づいて表示を更新できる

URLSession を用いた通信であれば許されます。https を用いましょう。通信が重い非同期処理の場合は`onBackgroundURLSessionEvents()`というのを使えばいい感じになるらしいですが、挑戦例がほぼないので使い方はよくわかりませんでした。

## Asset Catalog を使っていくつかの項目の色を指定できる

WidgetKit のターゲットに Asset Catalog を追加すると、AccentColor と WidgetBackground の二つの項目がデフォルトで用意されます。AccentColor はウィジェットを追加する時のボタンの色を指定できます。WidgetBackground は指定しただけだと背景色に変化は起こりませんが、SwiftUI の Color で指定すれば使えます。

# Tips（ネガティブ編 😨）

## UIKit のコンポーネントを含んだビューは扱えない

SwiftUI の View は`UIViewRepresentable`を使えば UIKit の View コンポーネントを組み込むことができますが、WidgetKit は UIViewRepresentable 非対応です。（[ソース](https://developer.apple.com/forums/thread/653471)）

## リンクを開く以外のユーザアクションは皆無

ボタンを押して本体アプリのあるページに飛ぶというのはできますが、ウィジェット上でユーザインタラクションをすることはできません。面白くないですね。HIG 的にはただ一瞬情報を確認させるためだけのものというのがウィジェットの立ち位置のようです。

## アニメーションはできない

あらゆる手段を使ってみましたが、アニメーションを含んだビューは正しく表示されません。唯一アニメーションを許された時計アプリが羨ましい...

## ウィジェット背景の自由度は低め

- 透明/半透明にはできない
- `UIVisualEffectView`みたいな磨りガラス風にはできない
- ライトモード/ダークモードで背景色を変更することは可能

# 所感

ウィジェット系は昔から悪戯し甲斐があるので好きなのですが、こと WidgetKit に関しては悪戯できる余地がほとんどなくて非常につまらないです。サードパーティのウィジェットが活発に流行る気がしません。

# 宣伝

GitHub のコントリビューション（草）の状態を確認することができるアプリ GitGrass をウィジェットに対応させてみました。タダなので興味のある方はインストールしてみてください。[AppStore リンク](https://apps.apple.com/au/app/gitgrass/id1503987405?l=ja)、[リポジトリのリンク](https://github.com/Kyome22/GitGrass)
![kusa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/028e9b82-fdb5-4776-a4a6-8fa2be47cc03.png)
読みやすいCSSを書くために心がけていること

読みやすい、理解されやすい、CSS（Stylus, SCSS, SASS）を書くために、
日頃意識している「これはやらない」を挙げていけば、
きっと読みやすいCSSが書けるようになるのでは・・・のアプローチです。

本記事では、SCSS記法で例示します。

# 色は直書きせずに変数で定義する
* 増えがちな無彩色は、rgb値で整理する
* その他は、連番で定義する

```scss

$white: #fff;
$black: #000;

$color-255: rgb(255, 255, 255);
$color-240 : rgb(240, 240, 240);
$color-51 : rgb(51, 51, 51); 
```

# media queryも変数で定義する
突然のbreakpointの変更にも対応できる

```
sm = "(max-width: 899px)"
md = "(min-width: 900px) and (max-width: 1023px)"
lg = "(min-width: 1024px)"
```

SCSSには、[postcss-custom-media](https://www.npmjs.com/package/postcss-custom-media)を使用して次のように書く

```
.block__element--modifier {
  @media(--lg) {
    // pc用の記述
  }
  @media(--sm) {
    // sp用の記述
  }
}
```


# media query で打ち消さない
:no_good: PCで定義して、SPでその記述を打ち消す

```scss

.example {
 // PC
 float: left; 

 @media (--sm) {
   float: none; //SPのためにfloatを打ち消す
  }
}
```

:ok_woman: SPとPCの定義を分ける

```
.hogehoge {
　　// SPとPCで共通したスタイル
 @media(--sm) {
   // スマートフォン用のスタイル
  }
　@media(--lg) {
   // タブレットおよびPC用のスタイル
  }
}
```

# プロパティの順番をぐちゃぐちゃにしない
思いついた順、ではなく、一定のルールを意識してコーディングする癖をつける

[stylelint-config-recess-oreder](https://www.npmjs.com/package/stylelint-config-recess-order)を`.stylelintrc.js `で定義すると楽

# 孫セレクタをつくらない
  1つのBlockに対し、Elementは1つ、Modifierも1つ

:no_good: `__(element)` `--(modifier)` が2個以上続く

```
.area__heading__icon
.area__heading__text
.area__imge__shoulder

```
:ok_woman: `__(element)` `__(modifier)` は1つだけ 
`block__element1(子)__element2(孫)` となった場合は、`element1` をBlockレベルに上げて、`block-element1__element2` とする

```
.area__image
.area__heading
.area__shoulder
```
# ネストは深くしない
* blockが親、elementが子、media query が孫になるように記述する

```scss
.block {
 &__image {
 }
 &__heading {
   @media (--lg) {
     // pc用のスタイル
   }
   @media (--sm) {
     // sp用のスタイル
　　}
 }
```

# Media queryの中にクラスの定義はしない
書き出されたCSSとは逆の入れ子になるが、クラス名の中にmedia queryが内包されるようにする
:no_good:

```scss
.block　{
   @media (--pc)
     &__image
      // Something here
```

:ok_woman: 

```
.block
   &__image
     @media pc
       // Something here
```

# urlは、パスを記述するときはダブルクオーテーション
「付けない」「シングルクオーテーション」「ダブルクオーテーション」を付けるのいずれかを徹底する

```
background: url("../images/bg.png") left top no-repeat
```

# idセレクタは使わずclassセレクタを使う

# スペース、改行、セミコロン、カンマの記法を揃える
## SCSS記法、`{}:,`を使う場合
* セレクタのあとは `.selector {` スペース１つあけて、`{`
* 1行にプロパティ1つ
* プロパティのあとは、コロンの前にはスペースを入れず、コロンのあとにスペースを1つ入れる
* rgba値など、カンマが続く場合は、カンマのあとにスペースを1つ入れる ex `rgba(25, 25, 25, 0.2)`
Route53のルーティングポリシーは何があるの?

## 種類

- シンプルルーティング
- 加重ルーティング
- 位置情報ルーティング
- レイテンシールーティング
- フェイルオーバールーティング
- 複数値回答ルーティング

## 概要

### シンプルルーティング

一般的なDNS
1つのレコードに対して、1つのIPアドレスが存在する

- 構成

![プレゼンテーション1 - PowerPoint 2020-10-19 19.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/229db141-adad-cc5d-4d08-da748d47a671.png)


- 設定項目

![シンプルRoute 53 Console Hosted Zones - Google Chrome 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9d907632-7967-bb13-c9ce-57b052358d7b.png)


### 加重ルーティング

0～255 の値によって、問い合わせの方向を変化させる
40%のルーティングを1.1.1.1に流す、60%のルーティングを2.2.2.2に流すというようなことが出来る。
ABテストの検証などで使用されることがある。


- 構成

![プレゼンテーション1 - PowerPoint 2020-10-19 19.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/201635d5-7f3c-dc9d-49e3-e5fe7e0c3808.png)


- 設定項目

![加重Route 53 Console Hosted Zones - Google Chrome 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/fbd84d3e-c561-d8c6-e632-7913e0a6874d.png)


### 位置情報ルーティング

位置情報によって、優先度が変わる。
地域別によって、配信する情報を変化させたいときに利用する。

- 構成

![プレゼンテーション1 - PowerPoint 2020-10-19 19.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f00fc40f-5317-814f-47d1-7e03d2bab380.png)


- 設定項目

![位置情報Route 53 Console Hosted Zones - Google Chrome 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9dab346d-f2f5-c12a-d9a9-f502f3044e21.png)


### レイテンシールーティング

レイテンシーが最小になるリソースを優先的にアクセスさせるルーティング方式
世界中にシステムを展開した際に、近いリソースにアクセスをさせたほうが早く回答が出来る。

- 構成

![プレゼンテーション1 - PowerPoint 2020-10-19 19.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1dcbe494-8121-de99-e9d2-f8d44b46be09.png)


- 設定項目

![レイテンシーRoute 53 Console Hosted Zones - Google Chrome 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9d9e6a12-9472-cd55-82f3-c82d494a2490.png)


### フェイルオーバールーティング

プライマリとセカンダリで分けて
プライマリのヘルスチェックに失敗したらセカンダリにアクセスがされるようになる。

- 構成

![プレゼンテーション1 - PowerPoint 2020-10-19 19.53.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/2ea19c7d-9b45-75aa-f70d-5fd6e30de74e.png)


- 設定項目

![フェイルオーバーRoute 53 Console Hosted Zones - Google Chrome 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b1504b81-0f65-6b54-4d82-e104e9cd46f2.png)


### 複数値回答ルーティング

複数のレコードからランダムに回答をするルーティング方式

- 構成

![プレゼンテーション1 - PowerPoint 2020-10-19 21.17.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7669a102-de9f-b9f9-390e-136b17507482.png)



- 設定項目

![複数値回答Route 53 Console Hosted Zones - Google Chrome 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e2fee8a1-70c0-8bb9-cd8f-74ab8dd5ba09.png)


## 参考

- [Amazon Route 53](https://qiita.com/leomaro7/items/75151348409b936f52e0)
- [AWS Route53の「マルチバリュー応答」試してみました](https://engineers.weddingpark.co.jp/?p=1004)
- [AWS｜AWSのRoute 53についてまとめました【解説】](https://dev83.com/aws-route53/)
collisionEnterで、当たったオブジェクトの名前を出力する

##コード

```C#
void OnCollisionEnter(Collision collision)
{
  string hitObjectName = collision.gameObject.name; //当たったオブジェクトの名前
  Debug.Log(hitObjectName);
}
```

##thisはscriptをアタッチしたオブジェクトの名前が出力される
```C#
void OnCollisionEnter(Collision collision)
{
  if(collision.gameObject.tag == "Player")
  {
   string thisOjectName = this.GetComponent<Collider>().gameObject.name;
   Debug.Log(thisObjectName);
  }
} 
```
Unity オブジェクト間の距離を求める


オブジェクト間の距離を求めるにはVector3.Distanceを使う。(今日知った泣)
![スクリーンショット 2020-10-19 21.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436955/5eeaf25c-0051-48f7-e1b0-89fe9a784706.png)


```csharp
using UnityEngine;
using UnityEngine.UI;

public class DistanceController : MonoBehaviour
{
    public GameObject MajorObj;
    public GameObject Surface;
    public Text MajorText;

    // Update is called once per frame
    void Update()
    {
        Vector3 Apos = MajorObj.transform.position;
        Vector3 Bpos = Surface.transform.position;
        float dis = Vector3.Distance(Apos, Bpos);
        MajorText.text = "現在の距離: " + dis+ "m";
    }
}
```
【 情報圧縮ノート002 】$PATHを通さないと $conda で Anacondaが使えない

![#1j1k  PATH.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792464/edd0e814-e046-22be-068b-1aa48828da8a.jpeg)

なぜか英語を使ってますが、理由は、まぁその、早い話が自分のインスタグラムの使い回しの画像だからです。
＊情報圧縮ノートは、今まで文章で説明されたいた概念(Knowledge)を１枚のjpegで表現するものです。
【 情報圧縮ノート001 】TerminalとShell(石原さとみ)とKernel(おじさん)の関係性


![#1j1k What is Shell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792464/df618dd4-2e79-cf54-7a23-41af99196f71.jpeg)

わざわざShellに石油会社の画像を使う理由は、
こないだ東京証券取引所を破壊した「石原さとみショック」の原因たる
<< GS社員 >> というTwitterのトレンドを見たとき、
小学５年から石原さとみを追っかけてきた自分ももれなく「ガソリンスタンド」を思い浮かべたからです。

＊情報圧縮ノートは、今まで文字で説明されていた概念(Knowledge)を１枚のjpegで表現するものです。
Webスクレイピングツール５選 | Webクローラーツールを簡単評価(1)

[Webスクレイピングツール](https://jp.scrapestorm.com/)は、Webサイトで必要な情報を取得するように開発されています。今回はこの五つのWebスクレイピングツールを紹介します。
##1.Scraper API
Scraper APIツールは、プロキシ、ブラウザ、CAPTCHAの管理に役立ちます。 これにより、簡単なAPI呼び出しで任意のWebページからHTMLを取得できます。 APIキーとURLを使用してGETリクエストをAPIエンドポイントに送信する必要があるだけなので、統合は簡単です。
特徴：
・JavaScriptのレンダリングに役立つ
・各リクエストのヘッダーとリクエストタイプをカスタマイズできる
・地理的に配置された回転プロキシを提供する
![1.Scraper API.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/be258ddf-d9f9-f9ab-6cbd-9e40e1582598.png)
##2.FMiner
FMinerは、[Webスクレイピング](https://jp.scrapestorm.com/)、[データ抽出](https://jp.scrapestorm.com/)、[クローラー](https://jp.scrapestorm.com/)、およびWindowsとMac OSのWebマクロサポート用のソフトウェアです。FMinerを使用すると、データマイニング技術をすばやく習得して、オンライン製品カタログや不動産分類サイトから人気のある検索エンジンやイエローページディレクトリに至るまで、さまざまなWebサイトからデータを収集できます。
特徴：
・使いやすいビジュアルエディターを使用してデータ抽出プロジェクトを設計できる。
・リンク構造、ドロップダウン、またはURLパターンマッチングの組み合わせを使用して、サイトページをドリルスルーするのに役立つ。
・クロールが難しいWeb 2.0動的Webサイトからデータを抽出できる。
・サードパーティの自動デカプチャサービスまたは手動入力の助けを提供し、ウェブサイトのCAPTCHA保護をターゲットにすることができる。
![2.FMiner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/391969bc-fb36-d932-4218-d49bb03120eb.png)
##3.Cheerio
CheerioはHTMLを簡単に解析するサーバー専用に設計されたツールです。 jQueryに似たAPIが用意されているため、jQueryに精通している開発者はすぐにCheerioを使用してHTMLを解析できます。 非常に高速で、テキスト、html、idなどを抽出するに多くの便利を提供します。
特徴：
・ほぼすべてのHTMLまたはXMLドキュメントを解析できる。
・解析、操作、およびレンダリングは非常に効率的だ。
・jQueryライクに記述可能
![3.Cheerio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/07336fbf-7127-2976-1db2-b0b61451234f.png)
##4.ScrapeHero
ScrapeHeroは、米国に拠点を置く、完全に管理されたエンタープライズクラスのWebスクレイピングサービスを提供します。 [Webクロール](https://jp.scrapestorm.com/)、データ抽出、自動品質チェックを行い、使用可能な構造化データを提供します。顧客には、フォーチュン50のスタートアップやその間のすべての人が含まれます。
特徴：
・人工知能を利用したデータ品質チェック
・配信データ配信の中断を回避するために、毎日何千ものアラートが監視される
・複雑なウェブサイトを処理するための巨大なブラウザファームを提供する
![4.ScrapeHero.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/39d7743e-762d-fed0-a0dd-2c5588ce464c.png)
##5.VisualScraper
VisualScraperは、自動Webスクレイピング、インターネットからのコンテンツ抽出、およびWebハーベストに使用される視覚的なツールです。 ソフトウェアは自動的にウェブサイトをスキャンし、製品カタログや検索結果などのデータを収集します。
特徴：
・プロジェクトを特定の時間に実行するようにスケジュールできる
・データは、Amazon S3、FTP、または電子メールを介して、任意の形式オプションでエクスポートできる
![5.Visual Scraper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/d96d5a72-15a4-3d5d-d44f-c697b438ee4f.png)
Dynamoの検索でハッシュ値を必ず指定しなくてはならない決まりの対策

#Dynamoを用いた検索での厄介なルール
ハッシュ値やソートキーについては以下の記事に説明があります
https://aws.typepad.com/sajp/2017/02/choosing-the-right-dynamodb-partition-key.html

普通にquery()使ってデータを取得するとき、パーティションキーを必ず指定しなくてはならない。
じゃあ、ハッシュ値のデータを他のキーを条件にして取り出したいとき、無理やんって思った。

もちろんすべてのデータを取得するscanを使ってしまえば解決できるが、全てのデータを取得してそこからフィルターをかけるのは、この先データの量が多くなったときに大変な負荷になるので普通に考えたら使わない。

いろいろググったら、グローバルセカンダリインデックスがハッシュ値の代わりになるってのを知っていろいろ試行錯誤してなんとか成功した。

## よくある通常のテーブル定義
以下のようにテーブル名やパーティションキーを設定する。
以下のようなテーブル定義なら、普通にhogeIDを指定したら、普通にデータを取得できる。

```json:anime-suko.json
{
  "TableName": "hoge",
  "AttributeDefinitions": [
    {
      "AttributeName": "hogeID",
      "AttributeType": "S"
    }
  ],
  "KeySchema": [
    {
      "AttributeName": "hogeID",
      "KeyType": "HASH"
    }
  ],
  "ProvisionedThroughput": {
    "WriteCapacityUnits": 1,
    "ReadCapacityUnits": 1
  }
}


```

が、例えば上記に書かれていないが他の時間のデータを使った条件に該当するhogeID一覧を取り出したかったら、以下のようなテーブル定義だと不可能。検索しようとしたら、パーティションキーを指定してくれよぉ～ってエラーが出る。

## パーティションキーを指定しなくてもいいようにするテーブル定義
グローバルセカンダリーインデックスを利用する。

**アトリビュートするもの一覧を定義**
mysql的には、使うカラム一覧を定義する感じ。

今回重要になるのが、仮に「gsiId」という名前でカラム(属性)を追加した。この属性に全てのレコードに1を入れてしまえば、SQLの部分でハッシュとして仮に作った「gsiId」を使って「gsiId=1 and 〜」みたいにしたら、必ずハッシュ値を指定しなきゃいけないルールはなんとか解決できる。

```json:anime-suko.json
 "AttributeDefinitions": [
    {
      "AttributeName": "あらかじめ自分が用意している名前",
      "AttributeType": "S"
    },
    {
      "AttributeName": "gsiId",
      "AttributeType": "S"
    },
  ]
```

**グローバルセカンダリーインデックスの部分を追加**
自分の場合はカラムとなる部分が複数あって、その分インデックスを追加する感じ。
今回は省略して2つ。endDateは日付のデータが文字列で入っていて、
この日付のデータを使って検索しようとしたとき、通常のテーブル定義では不可能。
なので、startDateとendDateにそれぞれインデックスをくっつけるイメージ

```
 "GlobalSecondaryIndexes": [
    {
      "IndexName": "hoge-index",
      "Projection": {
        "ProjectionType": "ALL"
      },
      "ProvisionedThroughput": {
        "WriteCapacityUnits": 5,
        "ReadCapacityUnits": 10
      },
      "KeySchema": [
        {
          "KeyType": "HASH",
          "AttributeName": "gsiId"
        },
        {
          "KeyType": "RANGE",
          "AttributeName": "startDate"
        }
      ]
    },
    {
      "IndexName": "hoge2-index",
      "Projection": {
        "ProjectionType": "ALL"
      },
      "ProvisionedThroughput": {
        "WriteCapacityUnits": 5,
        "ReadCapacityUnits": 10
      },
      "KeySchema": [
        {
          "KeyType": "HASH",
          "AttributeName": "gsiId"
        },
        {
          "KeyType": "RANGE",
          "AttributeName": "endDate"
        }
      ]
    }
  ],
```

**実際にデータを取得**

```typescript:anime-suko.ts
   const params = {
      TableName: 'テーブル名',
      IndexName: 'インデックス名',
      ExpressionAttributeNames: {
        '#sc': 'mysql的にカラム名',
        '#gi': 'mysql的にカラム名',
      },
      ExpressionAttributeValues: {
        ':start_date': '2020-10-06T11:30:15Z',
        ':end_date': '2020-10-06T11:40:17Z',
        ':gsi_value': '1',
      },
      KeyConditionExpression:
        '#gi = :gsi_value and #sc BETWEEN :start_date AND :end_date',
    }
    const hoge = await documentClient.query(params).promise()
```

## まとめ
くっそ苦戦した。mysqlとかポスグレなら普通に検索できるのにdynamoだと普通に検索するだけで大変だった。
でも一度覚えたらいけそう
【学習】読んだ本の一部を簡単に紹介

# 前置き
今回は、今までに呼んだ技術参考書で良かったモノを紹介します。
対象となるのは、私と同じような初級エンジニアの方々です。

また、本記事は新たに書籍を読んだりする度に更新予定です。
さらに、これらの書籍単体に関する記事もアップすることがあるかもしれません。
その場合には、本記事にリンクを作成していきます。

# ネットワーク構築
### 書籍：[Amazon Web Services 基礎からのネットワーク＆サーバー構築](https://www.amazon.co.jp/gp/product/B084QQ7TCF/ref=ppx_yo_dt_b_d_asin_title_o09?ie=UTF8&psc=1)
こちらは、前回記事にして学習をアウトプットしました。
実際にAWSを触ってみながら学習するのにとてもオススメです。
無料期間で試せる内容だと思うので、気になった方は是非記事もご覧ください。

記事：[【学習】Amazon VPCを使ったネットワーク構築](https://qiita.com/EasyLazy555/items/a112975eae46eaef01da)

# データベース設計
### 書籍：[達人に学ぶDB設計 徹底指南書](https://www.amazon.co.jp/gp/product/B00EE1XPAI/ref=ppx_yo_dt_b_d_asin_title_o07?ie=UTF8&psc=1)
こちらは、データベース設計に関する書籍です。
データベースの使用経験はありますが、構築経験がなく知識レベルとして疑問があったために購入しました。
正規化など基本的な内容から、パフォーマンスチューニングやバッドノウハウなど実践的な知識を学ぶことが出来ました。
とても参考になったので、初級者で向上心のある方にオススメです。

# サーバー負荷試験
### 書籍：[Amazon Web Services負荷試験入門 ――クラウドの性能の引き出し方がわかる](https://www.amazon.co.jp/gp/product/B075SV3VN3?ref_=kin_pc_dp)
こちらは負荷試験に関する書籍です。業務で少し関わった際に学習として使用しました。
負荷試験に関する書籍は数自体が少なく、JMeterなどのツールについてまで日本語で触れている書籍なので購入しました。
基本知識から分析方法まで、幅広く学べたので興味がある方や業務で扱う方にはオススメです。

# Docker入門
### 書籍：[ITエンジニアになる！ チャレンジDocker仮想化環境構築入門](https://www.amazon.co.jp/gp/product/B07JW4MKNT/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)
こちらはDockerに関する書籍です。実務でDockerを経験し、非常に便利だと感じたので学習しました。
本書では、Dockerの基本的な扱い方からdocker-compose、kubernetisなどの応用編まで幅広く学ぶことが出来ます。
私自身も一通りの仮想環境を作ることが出来るようになったので、オススメです。

# Unity入門
### 書籍：[Unity 3D/2Dゲーム開発実践入門 Unity2019対応版](https://www.amazon.co.jp/gp/product/B0855CF2FR/ref=ppx_yo_dt_b_d_asin_title_o05?ie=UTF8&psc=1)
こちらはUnityに関する書籍です。
エンターテイメント領域では、最近ではUnityの知識は持っておいて当たり前くらいの風潮だと感じたので学習しました。
2Dと3Dのゲームで簡単なモノが作れるようになります。実際に手を動かしながらサンプルプログラムを組んで学習できます。
業務でUnityでクライアント部分まで扱えるようになるとは言えませんが、最低限クライアントエンジニアさんとのコミュニケーションは取れるようになると思います。

# 最後に
技術書以外にもいくつか読んでいるのですが、いったんここまでとします。
技術トレンドや自信の経験などから、何かオススメを思い出す度に追加していきます。
個人的には深層学習(Deep learning)やVR、仮想通貨の本など面白かったのでオススメしたいですね。。。
VSCodeでPythonが動かなくなった話(Windows10)

# 起きたこと
+ 変数のマウスオーバーで型が出てこないことに困った
+ そもそも実行できない
+ 「Python入ってないからインストールしなさいよ。拡張機能のPython(※)より。」と英語で通知
    + python is not installedとかって書いてあったんだと思う
+ 下の画像の赤枠に「パイソンのインタプリタが選択されてないから選択しなさいよ」と英語で言われる
    + select python interpreterって書いてあったと思う

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670872/6b5c7cb0-95ba-804c-0b44-e4815488adc9.png" width="25%">

+ ※Microsoftが出してるPythonの拡張機能。VSCodeでPython書くときに必ず入れるやつ

# ダメだった対策
+ コマンドプロンプトから"python"と打って起動することの確認。インストールは勿論パスが通っていることも確認できた。
+ 「インタプリタを選択しろ」と言われているところをクリック
    + バツを付けているものが出ていれば選択して解決だったが、何も出ず。
    + python.exeの場所を確認しパスを書き込んでも動かず
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670872/88fb0ffd-1c47-9245-0a80-b56753ce90c9.png" width = "50%">
+ 設定(ctrl+,)から"python.pythonpath"と検索しパスを入力
    + 一つ上の項目ができない時にやってみる対策らしいが意味なし

# 最終的な解決
+ Pythonの拡張機能のフォルダを消して、当該拡張機能を再度インストール
    + "C:\Users\username\.vscode\extensions"に拡張機能のフォルダがあって、その中の"ms-python..."ってフォルダ

# お気持ち
+ 半日溶かした。英語の記事読むのは疲れるけど3つくらいは全部ちゃんと読み込んでみた方が良い。誰かの役に立ってほしいというよりも単純に、140字以内に愚痴をまとめられなかった。
なでしこの研究

#概要

なでしこをplunkerでホスティングしてみた。

#サンプルコード

```
カメ作成
4回
　　50だけカメ進む
　　90だけカメ右回転
ここまで
```

#成果物

https://plnkr.co/edit/SkfY1N8mgOHwp3Wm?preview

以上。
Att Email Setup and Setting

Do you want to use an Att email and need to set up? If yes then visit our Att email settings website for steps to setup. Att email is a paid and very secure email that is mainly used to send and receive important files and documents. As compared with other emails, Att has lots of functions that you could ask through At&t email experts. And we provide support for Att email, so if you need any types of Att mail support then dial our toll-free number or visit the AT&T mail support website. And visit the given web page for more information.
Not only we solve roadrunner email problems but also we provide Verizon support for Verizon email customers. Get the help today and resolve your Verizon mail issues,
We also provide Microsoft office 365 support via Microsoft 365 support site and to avail its related services dial the Office 365 tech support phone number.
Also, if you want to build a website - WordPress website and Magento website, you can have sessions with our experts for 30 minutes as free consultation on how to create your own website / make your own website.
Visit our  Blog on Roadrunner email problems to get the details.
http://www.email-customer-care.com/att-support
http://email-customer-care.com/blog/roadrunner-email-problems-settings/
EC2でnode.jsサーバーを立てる時に最低限インストールするもの。

# 概要
EC2立てた後に、node.jsを入れる手順

# インストールするもの
・nvm(必須) これはgitが必要なのであとでやる。
・git(必須)

１、yumでgitをインストールする

```sh

$ sudo yum install git
```

2、nvmをインストールする。

```sh
// git cloneする
$ git clone https://github.com/creationix/nvm.git ~/.nvm

// nvmへのパスを通す。
$ source ~/.nvm/nvm.sh

// ログアウト時にパスの設定が消えてしまうので.bash_profileに記述しておく
$ vi .bash_profile
→ファイルが開くので、下記を追加
# nvm
if [[ -s ~/.nvm/nvm.sh ]] ; then
        source ~/.nvm/nvm.sh ;
fi
```

3,node.jsをインストールする

```
// インストール可能なバージョンを確認する。
nvm ls-remote

//インストールして使用する
nvm install v12.19.0
nvm use v12.19.0

//きちんとインストールできていることを確認する
node -v
```
【JS】各要素に対応する配列があるか調べるプログラム

#【JS】各要素に対応する配列があるか調べるプログラム

JSの勉強。

ある配列の各要素の２乗に対応する要素が含まれているか確認するプログラム(same)を作成する。

・同不順
・出現回数が合っていること


```js:例１
//関数sameの結果例
arr1 = [3,2,1,7,2]
arr2 = [49,4,4,9,1]

same(arr1, arr2)
//true
```
対応する要素がある場合は、trueを返す。

<br>

```js:例２
//関数sameの結果例
arr1 = [3,2,1,7,2]
arr2 = [49,4,9,1]

same(arr1, arr2)
//false
```

２乗に対応する値が存在しても、出現回数が合っていない場合はfalseを返す。


##same1

```js:解答１
function same1(arr1, arr2){
    if (arr1.length !== arr2.length){
        return false
    }

    else{   
        arr1 = arr1.sort((a,b)=>a-b)
        arr2 = arr2.sort((a,b)=>a-b)

        for(let i=0; i<arr1.length; i++){
            if(arr1[i]**2 !== arr2[i]){
                return false
            }
        }
     return true
    }
}
```

sortメソッドを使って各配列をソートしてから比較する。


<br>

>※注
sortは文字列として並べ替えするため、２桁の数値がある場合は並びが意図しない形になる。

>引数で`sort((a,b)=>a-b)`を指定することで、２桁の数値も正しく並び替えることができる。


```js:sort
arr1 = [6,5,8,10,1,72,25,9]
arr1.sort()

// [1, 10, 25, 5, 6, 72, 8, 9]
```

```:js:sort
arr1 = [6,5,8,10,1,72,25,9]
arr1.sort((a,b)=>(a-b))

// [1, 5, 6, 8, 9, 10, 25, 72]
```



<br>
##same2


```js:解答2
function same2(arr1, arr2){
    //要素の個数が合っていない場合はfalse
    if(arr1.length !== arr2.length){
        return false;
    }
    for(let i=0; i<arr1.length; i++){
        //arr2の中で、arr1の２乗と対応する値の配列番号を格納していく。
        let correctIndex = arr2.indexOf(arr1[i] ** 2)
        
        //該当する値がなければ(-1)、falseを返す
        if(correctIndex === -1){
            return false
        }
    }
    return true
}
```

indexOfメソッドを使う方法。
`arr.indexOf(str)`

指定した値の配列番号を返す。値がない場合は-1を返す。




<br>
##same3


```js:解答3
function same3(arr1, arr2){
    if(arr1.length !== arr2.length){
        return false;
    }
    //オブジェクトを２つ用意
    let frequencyCounter1 = {}
    let frequencyCounter2 = {}
    for(let val of arr1){
        //指定したキーに値があればその値＋１、なければ0+1する。（キーに該当する数値が何回出現したかカウントする）    
        frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
    }
    for(let val of arr2){
        frequencyCounter2[val] = (frequencyCounter2[val] || 0) +1
    }
    for(let key in frequencyCounter1){
        //指定した値の有無を確認。なければfalseを返す
        if(!(key**2 in frequencyCounter2)){
            return false
        }
        //出現回数が合っているか確認
        if(frequencyCounter2[key**2] !== frequencyCounter1[key]){
            return false
        }
    }
    //カウンター確認用
    console.log(frequencyCounter1)
    console.log(frequencyCounter2)

    return true

}
```

オブジェクトを用意し、数値の出現回数をカウントして比較する。

```js:確認
arr1=[3,5,2,1,3]
arr2=[25,4,1,9,9]
same3(arr1, arr2)

//{1: 1, 2: 1, 3: 2, 5: 1}
//{1: 1, 4: 1, 9: 2, 25: 1}
//true
```


・オブジェクトは`key:value`で定義される配列。
・`obj[key]=value`で指定したキーに値を代入する。
【Nuxt.js】ページ移動先の、非同期通信のお作法

#ページ移動先で使うプロパティ

よくページ構築時で使うプロパティとして`mounted`がありますが、それだと例えば`v-for`でコンポーネントを作成する時に、移動した後に構築される動きが見られてしまいます。

そうならないためにも、ページコンポーネントを作成された段階には、v-forで回すデータを格納しておく必要があります。

ここで、登場するのがNuxt.jsだけに許された`asyncDataプロパティ`というものがあります。


#ページコンポーネント構築前の非同期通信と、後の非同期通信の比較

| 通信タイミング | プロパティ | 用途 | /_idの取得 |
|:-:|:-:|:-:|:-:|
| データ初期化前  | async asyncData (context)  | コンポーネントのdataにデータを格納したい時  |  context.params.id |
|  データ初期化前 | async fetch (context)  | Vuexのstateにデータを格納したい時  | context.params.id  |
| データ初期化以降  | async mounted ()  | コンポーネントのdataにデータを格納したい時  | this.$route.params.id  |



mounted等と違うのは、ページロード前にデータを取得できるので、**コンポーネントが完成された状態でページを表示することができる**点



#Usage

```javascript:
async asyncData(context) {
  const res = await context.$axios.$get(`/api/offices/${context.params.id}`);
  return {
    office: res,
    office_name: res.name,
    office_introduction: res.introduction,
  };
 },
```

 データ初期化前の処理のため、thisや$メソッドを使うことができない
HHKB プログラミングコンテスト 2020

参加はしなかったので１時間４０分かけて解いた問題を記載

##[A - Keyboard](https://atcoder.jp/contests/hhkb2020/tasks/hhkb2020_a)

```Python:Python
S = input()
T = input()
 
if S == 'Y':
  print(str.upper(T))
else:
  print(str.lower(T))
```

##[B - Futon](https://atcoder.jp/contests/hhkb2020/tasks/hhkb2020_b)

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
int dx[4] = { 0, 1, 0, -1};
int dy[4] = {-1, 0, 1,  0};
char filed[100][100];
 
int main(int argc, const char * argv[]) {
    int H, W;
    cin >> H >> W;
    
    rep(y, H){
        rep(x, W){
            cin >> filed[y][x];
        }
    }
    
    int ans=0;
    rep(y, H){
        rep(x, W){
            if(filed[y][x]=='#') continue;
            
            rep(i, 4){
                int xx = x + dx[i];
                int yy = y + dy[i];
                
                if(xx<0 || W<=xx || yy<0 || H<=yy) continue;
                
                if(filed[yy][xx] =='.') ans++;
            }
        }
    }
    
    cout << ans / 2 << endl;
    
    return 0;
}
```

##[C - Neq Min](https://atcoder.jp/contests/hhkb2020/tasks/hhkb2020_c)

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
int p[200000];
int pp[200000];
 
int main(int argc, const char * argv[]) {
    int N;
    cin >> N;
    
    rep(i, N){
        cin >> p[i];
    }
    
    int ans=0;
    rep(i, N){
        pp[p[i]]++;
        if(ans == p[i]){
       		while(pp[ans]>0){
        		ans++;
        	}
        }
        cout << ans << endl;
    }
    
    return 0;
}
```
Docker 開発環境のパフォーマンスを上げる

# やりたいこと

Docker コンテナ環境 (特に VSCode Remote Containers) を快適に動かす

# 方法

[DockerでVolumeをマウントするとき一部を除外する方法](https://qiita.com/suin/items/e53eee56da23d476addc) を使って、ビルドファイル等(.gitignore に書くような場所)のボリュームマウントを外す。

# 経緯

VSCode の Remote Container を使ってコードのビルドを行うと動作が重くなったり、突如 **Docker ホストが落ち** たり、というということが発生して、最初は何が原因なのか検討もつかなかった。
マウントファイルの高負荷が原因と疑って実施してみたところ、解決、パフォーマンスも改善した。

Remote Containers を 使う場合は開発時にマウントさせる必要もあまりないと思うので、 cached のオプションを使うよりも効果が高そう。

# サンプル

この方法を使っているサンプルリポジトリ
- https://github.com/tktcorporation/youtube_to_m3u8

# 参考

- https://qiita.com/suin/items/e53eee56da23d476addc
- https://www.366service.com/jp/qa/8bc9e2acccd4309e504a8c3877c6fe2a

# さいごに

Remote Conyainers すてき！
Railsで開発する際の準備




#はじめに

Railsで開発をする際、コードを書き始めるところまでの準備を書いていきます。
VirtualBox、Vagrantを既にインストールしている状態で話を進めます。
まだVirtualBox、Vagrantのインストールが終わってない場合は、Googleで検索してみてください。

#目次
1. Vagrantの初期設定
2. Vagrantの起動
3. 仮想環境への接続
4. 仮想環境の共有フォルダへ移動
5. Ruby on Railsでの開発を始める
6. 作業終了時
7. 終わりに


#1. Vagrantの初期設定

まず、ターミナルでデスクトップに移動する。

```
$ cd Desktop
```
そして、「work」という名前のフォルダを作成し、そのフォルダに移動する。

```
$ mkdir work
$ cd work
```
その後、「work」というフォルダ内に、「vagrant」というフォルダ名を作成し、そのフォルダに移動する。

```
$ mkdir vagrant
$ cd vagrant
```

この「vagrant」というフォルダ内で、Vagrantfileを作成する。

```
$ vagrant init
```

これでVagrantの初期設定は終わりになります。
下記のようになっていることを、ターミナルで確認してください。

```
ユーザー名：vagrant ユーザー名$
```


#2. Vagrantの起動

続いて、Vagrantを起動していきます。
ここから先は、開発をしていく際に毎回行う作業になってくるかと思います。


Vagrantの起動は簡単です。
以下のコマンドを打ちましょう。

```
$ vagrant up
```
一番初めの起動は、ものすごく時間がかかります。
ご飯を食べて、お風呂に入れるかもしれません。
もしかしたら、映画を1本見れるかもしれません。
そのくらいのことをしていたら、気づいたときには終わっていると思います:baby:

最初の起動が完了すると、
下の方に、
`Your now on Rails!`という言葉と共に、
汽車の絵 :steam_locomotive: のようなものがあらわれます。

これでVagrantの起動が完了しました。


※ 2回目以降のVagrantの起動は数秒で終わります。
　飲み物を飲む程度のことはできるかもしれません :coffee:


#3. 仮想環境への接続

自分のPCと仮想環境に安全に通信するために「SSH接続」を行います。
以下のコマンドを打ちましょう。

```
$ vagrant ssh
```

正しく接続されると

```
[vagrant@localhost ~]$
```

このように表示されます。

これで仮想環境への接続が完了しました。


#4. 仮想環境の共有フォルダへ移動

仮想環境内の共有フォルダは、`/home/vagrant/work` にあります。
ですので、その共有フォルダに移動します。

```
[vagrant@localhost ~]$ cd /home/vagrant/work
```

以下のように表示されると、移動できたことになります。

```
[vagrant@localhost work]$
```


#5. Ruby on Railsでの開発を始める

Ruby on Railsで新規のアプリケーションを作成する際は `rails newコマンド`を使用します。
「sample」というアプリケーションを作成する場合、以下のように打ちます。

```
$ rails new sample
```

このコマンドが正しく実行されると、sampleフォルダが共有フォルダ内に作成されます。

VScodeなどでファイルメニューの「開く」または、「Open」を選択し、
「デスクトップ」→「work」→「vagrant」→「sample」を選択して、
`sampleフォルダ`を開きます。


ここまでできたら、以下のコマンドを打ち、先ほど作成したsampleディレクトリに移動します。

```
[vagrant@localhost work]$ cd sample
```

「work」となっていた部分が「sample」となれば移動できたことになります。

```
[vagrant@localhost sample]$
```



以上で、実際にコードを書き始めていくまでの準備が完了しました。
ここまで終われば、コードを書き始められます。

お疲れ様でした。


#6. 作業終了時

作業が終了し、パソコンを閉じる前には、毎回仮想環境からのログアウトと仮想環境のシャットダウンを行った方がよいかもしれません。


このコマンドで、「SSH接続」されているところからログアウトすることができます。

```
[vagrant@localhost work]$ exit
```
以下のようになればログアウト完了です。

```
ユーザー名：vagrant ユーザー名$
```

次に、仮想環境のシャットダウンです。
以下のコマンドを打つとシャットダウンすることができます。

```
$ vagrant halt
```

仮想環境をシャットダウンし、また仮想環境を起動する場合は、
`$ vagrant up`からやり直してください。


#7. 終わりに

最後まで見ていただいた方、ありがとうございます。
実際には、忘れたときの未来の自分用に書きました。

間違っているところがあれば、教えてくださると嬉しいです。

これからも、未来の自分のためと私の記事を偶然にも見つけてしまい、見てくれた方のために記事を書いていきたいと思います。
【Unity2D】スペースキーでジャンプさせる

## スペースキーの入力を受けとる
update関数の中にGetKeyDownでspaceキーの入力を受け取ります

```c#
void Update() {
  if (Input.GetKeyDown("space"))
          {

          }
}
```

## Jump関数を作成
自身のRigidbody2Dを取得し、上方向に力を加えます。

```c#
Rigidbody2D rigidbody2D;

 void Jump()
    {
        // 上方向に力を加える
        rigidbody2D.AddForce(Vector2.up * 400);
    }
```

## Jump関数を呼びだす
```c#
void Update() {
  if (Input.GetKeyDown("space"))
          {
            Jump();
          }
}
```
PhpStormでVim修行したい

## インストール方法

PhpStorm＞Pregerences＞Plugins

Marketplaceを選択し、「IdeaVim」を検索

![スクリーンショット 2020-10-19 18.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/c2b1f334-8929-d87d-52bc-7f8de586d8e6.png)

インストール後、再起動する

再起動すると、なにやらポップアップが出てきた

![スクリーンショット 2020-10-19 18.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/f2e10d61-625a-8329-ab1c-31552e55ad48.png)

Noを選択すると、移動キー[ h , j , k , l ]を押したままカーソルを動かし続けることができなくなるようなのでYesを選択

IdeaVimを無効にしたいときは、Tools＞Vim Emulatorのチェックを解除する

## 修行内容

カーソル移動系

|  キー | 動作 |
| --- | --- |
|  Ctrl + f | １ページ下 |
|  Ctrl + b | １ページ上 |
|  Ctrl + u | 半ページ下 |
|  Ctrl + d | 半ページ上 |
|  b | カーソル位置より前にある単語の先頭へ移動 |
|  ge | カーソル位置より前にある単語の末尾へ移動 |
|  w | カーソル位置より後にある単語の先頭に移動 |
|  e | カーソル位置より後にある単語の末尾へ移動 |
|  ^ | 行頭に移動 |
|  $ | 行末に移動 |

ページ移動系

|  キー | 動作 |
| --- | --- |
|  gg | ファイルの先頭 |
|  G | ファイルの終わり |
|  Ctrl + y | カーソルを固定してページ上 |
|  Ctrl + e | カーソルを固定してページ下 |
|  zz | カーソルがある行を画面中央に |

操作系

|  キー | 動作 |
| --- | --- |
|  Ctrl + [ | 標準モードに戻る |
|  u | １つ戻す |

選択系

|  キー | 動作 |
| --- | --- |
|  viw | １単語選択 |
|  V | １行選択 |

挿入系

|  キー | 動作 |
| --- | --- |
|  a | カーソルの後ろに文字を追加 |
|  i | カーソルの前に文字を追加 |
|  A | 行末に文字を追加 |
|  I | 行頭に文字を追加 |
|  e | 改行してインサートモード |

削除系

|  キー | 動作 |
| --- | --- |
|  x | １文字削除 |
|  diw | １単語削除 |
|  ciw | １単語削除してインサートモード |
|  dd | １行削除 |
|  2ddとか3dd | 複数行削除 |

コピー系

|  キー | 動作 |
| --- | --- |
|  yiw | １単語コピー |
|  yy | １行コピー |
|  2yとか3y | 特定の行コピー |

検索系

|  キー | 動作 |
| --- | --- |
|  f + 任意のキー | 右側の一行一文字検索 |
|  F + 任意のキー | 左側の一行一文字検索 |

fキーとの組み合わせ

|  キー | 動作 |
| --- | --- |
|  ; | 右方向に繰り返し検索 |
|  , | 左方向に繰り返し検索 |