OmniAICreator/Qiita-1.07M huggingface dataset:
Visual studio 2019でさくっとFlask

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/0b50609e-0625-55bf-7da2-71b1c6dc0528.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/d553b1bc-95c8-ffc2-d588-bba3f661d07c.png)

# raspberry pi 3 に直接デプロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/5ffaeadf-7736-c4b3-e396-ede5529eee36.png)
## 作成されたファイル

```
.
├── FlaskWebProject1
│   ├── __init__.py
│   ├── static
│   │   ├── content
│   │   │   ├── bootstrap.css
│   │   │   ├── bootstrap.min.css
│   │   │   └── site.css
│   │   ├── fonts
│   │   │   ├── glyphicons-halflings-regular.eot
│   │   │   ├── glyphicons-halflings-regular.svg
│   │   │   ├── glyphicons-halflings-regular.ttf
│   │   │   └── glyphicons-halflings-regular.woff
│   │   └── scripts
│   │       ├── _references.js
│   │       ├── bootstrap.js
│   │       ├── bootstrap.min.js
│   │       ├── jquery-1.10.2.intellisense.js
│   │       ├── jquery-1.10.2.js
│   │       ├── jquery-1.10.2.min.js
│   │       ├── jquery-1.10.2.min.map
│   │       ├── jquery.validate-vsdoc.js
│   │       ├── jquery.validate.js
│   │       ├── jquery.validate.min.js
│   │       ├── jquery.validate.unobtrusive.js
│   │       ├── jquery.validate.unobtrusive.min.js
│   │       ├── modernizr-2.6.2.js
│   │       ├── respond.js
│   │       └── respond.min.js
│   ├── templates
│   │   ├── about.html
│   │   ├── contact.html
│   │   ├── index.html
│   │   └── layout.html
│   └── views.py
├── FlaskWebProject1.pyproj
├── FlaskWebProject1.pyproj.user
├── FlaskWebProject1.sln
├── obj
│   └── Debug
├── requirements.txt
└── runserver.py

8 directories, 33 files
```
実行

```
$ export SERVER_HOST=0.0.0.0 #アドレス設定
$ export SERVER_PORT=8891 # ポート設定
$ python runserver.py
 * Running on http://0.0.0.0:8891/ (Press CTRL+C to quit)
```
実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/7193916a-9a36-7faf-b59a-ba2054be686d.png)
TkinterでEntryに入力したデータが取得出来なかった件

#はじめに
pythonでプログラムを組んで、実験で得られるデータを解析・整理することを、最近始めました。
やり出すと欲が出て、ファイル名やデータの入力もGUI形式でやってみよう！と思いたち、作ったところ、なぜかエントリに入力したデータが取得出来ない。。。
いろいろググったのですが、私のやりたい事が載っている記事が見つからなかったので、備忘録として記事にします。

#やりたいこと
エントリに入力したデータを取り出す

#環境
・Windows 10 PRO
・Python Ver3.7.3
・Microsoft VS Code上で動作確認

#最初に書いたコード
```GUItest.py
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox

# ウインドウ
root = tkinter.Tk()
root.title(u"テストプログラム")
root.geometry("400x300")

# データ数入力
Static1 = tkinter.Label(text=u'データ数')
Static1.place(x=5,y=5)
EditBox1 = tkinter.Entry(width=5)
EditBox1.place(x=100, y=5)

value = EditBox1.get() # エントリに入力されたデータを取得

root.mainloop()

print("value=",value) # データが格納されたことを確認
```
##結果
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284023/a8eaf8aa-ac40-745e-9335-5e49c08670bf.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284023/5e59ce33-ce6f-0cd8-ae56-61ed10168822.png)
valueの所に値が入っていない。
検索しても検索しても「get()で文字を取得する」としか書いていない・・・
なぜ？？
#対処法
```GUItest1.py
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox

def func():
    global value
    print("in the function =",EditBox1.get())
    value = EditBox1.get()

# ウインドウ
root = tkinter.Tk()
root.title(u"テストプログラム")
root.geometry("400x300")

# データ数入力
Static1 = tkinter.Label(text=u'データ数')
Static1.place(x=5,y=5)
EditBox1 = tkinter.Entry(width=5)
EditBox1.place(x=100, y=5)

b = tkinter.Button(text='Exec', command=func)
b.pack()

root.mainloop()

print("value=",value) # データが格納されたことを確認
```
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284023/42306716-56bb-87e3-49b4-a1310d8f2866.png)

何か刺激がないと（？）データが取得できないのではないかと思い、ボタンを付けて、押したときに関数を起動させる様にしたところ、関数側ではデータが取得できる事が分かったので、その値を全体で使えるようにしたら解決した、という事です。

もっといいやり方（正しいやり方？）があるとは思いますが、使えればいいので
(^o^)v
Atomエディタインストール場所について。

HTMLを始めようと思い、Atomをダウンロードしました。

しかし、、、

インストール場所を見つけるのにとても苦戦しました。

これは、誰もが通る道なのでしょうか（笑）

**ファイルを開く→C:￥User￥name￥AppDate￥Local￥app-**
ちなみにnameは自分の名前です。

ここにありました:sunny:


見つけられていない人は是非参考までに！
PHPでcURL

# body取得

```php
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// exec時に出力させない
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);// リダイレクト許可
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);// 最大リダイレクト数
$body = curl_exec($ch);
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
```

# ダウンロード

**CURLOPT_RETURNTRANSFERは指定してはだめ**

```php
$tempFilePath = tempnam(sys_get_temp_dir(), 'download_');
$fp = fopen($tempFilePath, 'w');
if ($fp === false)
{
    throw new \RuntimeException('失敗');
}
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
$result = curl_exec($ch);
fclose($fp);
curl_close($ch);

if ($result === false)
{
    throw new \RuntimeException('失敗');
}
```

# その他

## retry

`curl`コマンドの`--retry`オプションは？

無いようなので[エラーで判定したり](https://stackoverflow.com/questions/6080369/curl-retry-in-php)

## FTP

以下を気にする

```
CURLOPT_FTP_USE_EPRT
CURLOPT_FTP_USE_EPSV
```

## Cookie

以下を気にする

```
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
```

## POST

以下を気にする

```
CURLOPT_POST
CURLOPT_POSTFIELDS ※http_build_queryを行ってから送る
```

ファイルを送る場合は[CURLFile](https://www.php.net/manual/ja/class.curlfile.php)を使う

## GETとPOST以外やGETでbodyを送る

以下を気にする

```
CURLOPT_CUSTOMREQUEST
```
ファイル探索のための サクラエディタ正規表現Grep法

##概要
本投稿では、正規表現とgrepの活用方法を説明します。

正規表現を使用した検索置換をマスターすると、
テキストファイルの整形時は勿論のこと、ドキュメントの編集など業務のあらゆる場面で楽が出来ます。

また、ファイルサーバ内などのファイルを高速に検索するために、[**ファイル一覧化バッチ**](https://qiita.com/X-IA/items/2dc5d1d497231ddbd9a0)で一覧化し、サクラエディタでgrepしましょう。
サーバを逐一読みに行かなくて済むため、頻繁にファイルを探す用事がある人はかなり楽になると思います。

※「正規表現」とは、ある特徴を満たす文字列の事を、決まった法則で表す手法の事です。テキストファイルから文字列を検索する際の、検索条件に使われることが多いです。
※「grep」とは、複数のファイルからキーワードに該当する部分を一括で抽出してくれるプログラムの事です。

サクラエディタの使用を前提としています。
定常的な運用作業に便利なバッチも作成しましたので、良ければ[**こちら**](https://qiita.com/X-IA/items/6e368d5af60cca7d32fe)もご活用ください。

諸般の事情によりサクラエディタを使用できないという方は、[**FINDSTRコマンドでgrep**](https://qiita.com/X-IA/items/c961196146b7f716e765)してみてください。

##環境
Windows 10, Windows 7
サクラエディタ v2.2.0以上

##準備
1. [**サクラエディタ**](https://sakura-editor.github.io/)をインストールします。
2. 正規表現ライブラリ [**bregonig.dll**](http://k-takata.o.oo7.jp/mysoft/bregonig.html)をサクラエディタと同じフォルダに配置します。
3. [**ファイル一覧化バッチ**](https://qiita.com/X-IA/items/754483076c96ba932ef8)でファイルサーバ内のファイルの一覧を作成しておきます。
4. Grepが直ぐにできるよう、ショートカットファイルを作成しておきます。<br/>リンク先例: ``` "C:\Program Files (x86)\sakura\sakura.exe" -GREPMODE -GREPDLG -GFOLDER=Z:\filelist -GOPT=RP1 ```

※[**サクラエディタ コマンドラインオプション**](http://sakura-editor.sourceforge.net/htmlhelp/HLP000109.html)

##Grepのやり方
[**利用可能な正規表現**については**こちら**](http://sakura-editor.sourceforge.net/htmlhelp/HLP000089.html)を参照してください。

今回はデモデータとして、WordPressのファイル一式とPythonのソースファイル一式をZドライブ直下に配置して使用しました。

####Grep対象ファイルの絞り込み
Grep対象ファイルのサイズが大きかったりファイル数が多いと所要時間が掛かるため、目的のものが含まれるファイルが見当付く場合は初めに絞り込みます。
ワイルドカード '*' が使用可能です。'!'を先頭に付けると、それ以外という意味になります。一つの文字列内にワイルドカードを複数使用可能です。

|項目|設定値|説明|
|:--|:--|:--|
|ファイル|\*WP\*|WordPressフォルダの各ファイルのパスが記述されたファイルが対象|

####拡張子の絞り込み
拡張子はファイル名の末尾にあるため、正規表現の末尾を示す '$' を使用します。

|項目|設定値|説明|
|:--|:--|:--|
|条件|.png$|拡張子が "png" のものに限定|

####特定の文字列を除外
正規表現で否定のパターンを示す "?!" とOR（論理和）を示す '|' を使用します。

|項目|設定値|説明|
|:--|:--|:--|
|条件|^(?!.\*(.php&#x7C;.css&#x7C;.png)).\*$|PHP, CSS, PNGを除外|

####期間の絞り込み
ファイルの更新日時で絞り込みたい場合は、文字の範囲または括弧内の何れか一文字を示す "[]" を使用します。

|項目|設定値|説明|
|:--|:--|:--|
|ファイル|\*Attr\*|各ファイルのサイズおよび更新日時が記述されたファイルが対象|
|条件|^(?!.\*(200[0-9]&#x7C;201[1-8])/[01][0-9]).\*$|2000年～2018年のファイルを除外|

####複数の文字列を含むものに絞り込み
複数の文字列で検索したい場合は、任意の一文字を示す '.' と直前の文字の繰り返しを示す '+' を使用します。
また、それら文字列がともにファイル名に含まれるとは限らず、フォルダ名とファイル名に分かれているかも知れません。そのため、ファイルパスの一覧をGrep対象ファイルに指定します。

|項目|設定値|説明|
|:--|:--|:--|
|条件|lib.+test|"lib", "test" を含むものに限定|
|ファイル|\*Path\*Py\*|Pythonフォルダ内の各ファイルのパスが記述されたファイルが対象|

####Grep結果をさらに絞り込み
一度のGrepで目的のファイルを直ぐに見つける事は至難の業です。
Grepのヒット数が多すぎて見つけられない場合は、置換機能で絞り込みます。
[Ctrl]+[R]キーを押下で、置換ダイアログが開きます。

|項目|設定値|説明|
|:--|:--|:--|
|条件|^(?!.\*(main)).\*$|"main" を含むもの以外|
|置換対象|行削除|条件に合致したものを削除|

####Grepのやり直し
Grepしても目的のものが見つからなかった場合は、条件を変えて最初からGrepをやり直します。
[Ctrl]+[G]キーを押下で、Grepダイアログが開きます。
テキストボックス内で[↑]/[↓]上下キーを押下するか、テキストボックス右端の [∨]印をクリックすると、履歴が表示されます（直近30件）。

####ファイル一覧の該当行を開く
結果出力形式で「ノーマル」を選択してGrepし、そのGrep結果をダブルクリックすると、
該当行の位置にカーソルが移動した状態でGrepしたファイルが開かれます。

|項目|設定値|説明|
|:--|:--|:--|
|結果出力形式|ノーマル|条件に合致した行を含むファイルおよび当該行の内容を表示|

####検索に合致したファイルを開く
Grep対象ファイルにファイルパスの一覧を指定し、結果出力形式で「結果のみ」を選択してGrepし、
そのGrep結果をダブルクリックすると、条件に合致したファイル自体がサクラエディタで開かれます。

|項目|設定値|説明|
|:--|:--|:--|
|ファイル|\*Path\*|各ファイルのパスが記述されたファイルが対象|
|結果出力形式|結果のみ|条件に合致した行の内容のみを表示|
独自WidgetのattrをStyleで指定したい

# はじめに
Android開発をしていて独自Widgetを作成することはよくあるかと思います。
その際にstyle.xmlでapp:~の指定をしたいことがあるでしょう。僕はありました。
そんなときにどう指定したらいいのかわからなかったので備忘録として残しておきます。

# どうしたか
簡単です。style.xml内に記載する際に```app:```を外して指定してあげるだけです。

# おわりに
いくらかググってみたのですがうまく解決策が見つけられず、こうやったらいけたりするだろうか？と思ったことを試したらうまくいっちゃったパターンでした。
こういうのに嵌ると解消したときに時間を無駄にした感が強かったりするんですよね。
Excel Shortcut Key

転職することとなり、後輩のために色々と残せるものはないかと考えた時、こういうものがあれば良いなと思ったので、ここに残していく。少しでも役にたてばと思います。今後入ってくる後輩のためにもなればなと思ってます。
その他便利なコマンド知っていたら、コメント欄に記載して頂けると励みになります。
# 1. 使用頻度　★★★★★
|Short Cut|Operation|
|:-------:|:------:|
|Ctrl-移動キー|端まで移動|
|Ctrl-Shift-移動キー|端まで選択|
|Ctrl-c|コピー|
|Ctrl-v|貼り付け|
|Ctrl-x|切り取り|
|Ctrl-z|戻る|
|Ctrl-y|進む|
|Ctrl-a|全て選択|
|F2|セル内編集|
|F9|再計算|
|Ctrl-PageDown|右のシートに移動|
|Ctrl-PageUp|左のシートに移動|
|Ctrl-Shift-PageDown|シートの選択(右)|
|Ctrl-Shift-PageUp|シートの選択(左)|

# 2. 使用頻度　★★★★☆
|Short Cut|Operation|
|:-------:|:------:|
|Ctrl-h|置換|
|Ctrl-f|探索|
|Ctrl-w|閉じる|
|Ctrl-s|保存|
|Alt-F4|全体を閉じる|
|Alt-PageUp|一画面左にスクロール|
|Alt-PageDown|一画面右にスクロール|
|Ctrl-Home|ワークシートの先頭|
|Ctrl-End|ワークシートの最後|

# 3. 使用頻度　★★★☆☆
|Short Cut|Operation|
|:-------:|:------:|
|Alt → O→H→R|シート名変更|
|Alt → v→u|全画面表示|
|Ctrl-n|新しいファイル|

# 4. 使用頻度　★★☆☆☆
|Short Cut|Operation|
|:-------:|:------:|
|Ctrl-b|太字|
|Ctrl-u|下線|
|Ctrl-i|イタリック|
|Ctrl-p|印刷|

# その他、個人的に多用するショートカット
|Short Cut|Operation|
|:-------:|:------:|
|Shift-F9|再計算(アクティブシート)|
| = → = 置換|選択セルのみ再計算|
|Ctrl-Space|列全体選択|
|Ctrl-ShiftSpace|行全体選択|
|Ctrl-.|選択範囲の次の隅に時計回りで移動|
|Ctrl-!|書式を数値(,)に変更|
|Ctrl-%|書式を%に変更|
|Shift-F11|新しいワークシートの追加|
|Ctrl-Shift-l|フィルター|
|Ctrl-[|アクティブセルを直接参照する数式を含むセルのみを選択|
|Ctrl-Shift-[|アクティブセルを直接参照するか間接参照する数式を含むすべてのセルを選択|
|Ctrl-d|下方向にコピー|
|Ctrl-r|右方向にコピー|
|Alt → h→a→c|テキストの中央揃え|
|Ctrl-Shift-+|行か列の挿入|
|Ctrl--(マイナス)|行か列の削除|
|Ctrl-9|選択した行を非表示|
|Ctrl-0|選択した列を非表示|
|Ctrl-Shift-(|選択した行を再表示|
|Ctrl-Shift-)|選択した列を再表示|
RxでUndeliverableExceptionが発生する

# はじめに
Observableで返して、subscribeする際にUndeliverableExceptionなるものが発生していました。
これでググるとDispose後にonErrorが呼び出されると発生する、という記事は見かけたのですが、Disposeは画面が終了するときにしか呼んでいないため今回は当てはまらない…なぜだ…となりました。
とりあえず解消は出来たので、その備忘録として残しておきます。

# 結局理由はなんだったのか
実装を一から見直してみたところ、メインスレッドで動くべきところでメインスレッドが指定されてない…というチョンボを見つけました。
ここ関係ないよな…と思いつつobserveOnでメインスレッド指定してみたら解消されました。

# おわりに
結局UndeliverableExceptionがスレッド指定に因るものだったのか根本解析は出来ていないのですが、発生しなくなってちゃんと動いてくれているようなので「とりあえず」解決。
こういった何が悪いのかわからないときは実装を見直す必要がやっぱりありますね。
GCEにsocket.ioを利用したNode.jsアプリケーションをデプロイする

socket.io(websocket)を利用するため今回は[Google Compute Engine](https://cloud.google.com/compute/?hl=ja)にデプロイします。

#デプロイするアプリケーション
https://github.com/takm-reason/websocket-server-node

#Node.jsのインストール
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt install -y nodejs

#Gitのインストール
sudo apt install -y git

#Nginxのインストール
sudo apt install nginx -y

#Gitリポジトリのクローン
git clone https://github.com/takm-reason/websocket-server-node

#Nginxの設定ファイルを配置
```/etc/nginx/conf.d/nodejs.conf
server {
    listen 80;
    server_name _;
    client_max_body_size 10M;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://localhost:3000/;
    }
}
```

#デフォルトのvhostを削除
rm -rf /etc/nginx/sites-enabled/*

#Nginx起動
sudo service nginx start

#アプリケーション起動
npm install && npm start
iOSアプリの設計手法について

# 背景
いままでiOSアプリを開発する時、MVCフレームワークを利用しているケースが多かったと思います！！
(実際私も現場でMVCの開発が多かった・・・💦)

MVCですと、Controllerのビジネスロジックが肥大化し、かなり見づらくなり、管理もしずらくなります!!

そんな中、iOSの開発現場で生まれたのが、`VIPER`です❗️

# VIPERとは？
VIPERは、各レイヤーの頭文字の組み合わせで **VIPER** と呼びます。

* **V**iew
* **I**nteractor
* **P**resenter
* **E**ntity
* **R**outer

# 各レイヤーの関係
## 公式の図(よく分からなかった・・・💦)
![alt](https://camo.qiitausercontent.com/feb56d873a71f7ede208c38bd6e31fa4d6d44569/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f39333931382f34346139656132642d623961362d646438322d616665362d6131643866333234613831382e706e67)

公式 [iOS Project Architecture: Using VIPER ](https://cheesecakelabs.com/blog/ios-project-architecture-using-viper/) から引用しました。

## 自分が読み取って関係図を作成✨
![VIPER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417396/54936c1f-ac10-b25f-580c-f535ec25ae82.png)

たぶん、こんな感じ・・・💦
間違ってたら指摘ください。すぐに直します❗️

## 各レイヤーについて
### 「View」
基本的には、画面のUI表示、UIのイベント受信を行う。
また、ビジネスロジックは、Presenterへ処理を投げる。

### 「Presenter」
DB等のデータの更新、画面表示の更新、画面遷移の処理を各レイヤーへ投げる。

### 「Router」
画面遷移を行う。
画面間のデータの受け渡しにも利用できる

### 「Interactor」
ユースケースごとにデータのCRUDをする
また、システムのビジネスロジックや動的な処理を担う
Backgroundな通信周りなども含む

### 「Entity」
データの定義を行う
GETTER / SETTER

## 命名
| 役割 | プロトコル名 | 実体名 |
|:--|:--|:--|
| `View`       | `{ModuleName}View` | `{ModuleName}ViewController` |
| `Interactor` | `{ModuleName}Usecase` | `{ModuleName}Interactor` |
|              |  | `{ModuleName}InteractorDelegate` |
| `Presenter`  | `{ModuleName}ViewPresentation` | `{ModuleName}ViewPresenter` |
| `Entity`     | - ※1 | `{~~}Entity` ※2 |
| `Router`     | `{ModuleName}Wireframe` | `{ModuleName}Router` |

引用そのままパクってきましたw

※1:Entityはテストの際に差し替える必要がないほどシンプルな構造なのでプロトコル不要
※2:1つのモジュールで複数のEntityを扱うこともあるため

## まとめ
画面周りとDBを完全に切り分けることで、それぞれに機能としての役割を持たせることができ、簡潔に設計できることが分かりました。
また、Interactorに限っては、スタンドアローンな設計であるので、ブラックボックスなテストがしやすいです。

テストコード(XCTest)については、以下の記事をご覧ください❗️

:arrow_forward: [やさしいSwift単体テスト~テスト可能なクラス設計・前編~](https://qiita.com/yokoyas000/items/b00012c8b1a84238becf)
:arrow_forward: [XCTest入門 (Swift) ~UITest編~](https://qiita.com/okuderap/items/b6211cc3524ad2385150)

## 引用
詳細な内容については、以下の記事をご覧ください❗️

:arrow_forward: [iOS Project Architecture : Using VIPER [和訳]](https://qiita.com/YKEI_mrn/items/67735d8ebc9a83fffd29)
:arrow_forward: [VIPERアーキテクチャ まとめ](https://qiita.com/hicka04/items/09534b5daffec33b2bec#interactor)
:arrow_forward: [VIPERアーキテクチャでプロダクトのiOSアプリを1から作ったまとめ](https://qiita.com/hirothings/items/8ce3ca69efca03bbef88)
usingステートメントにtry~catchを使うときは、usingの外側に書く

#はじめに

usingステートメントについて、外側に`try~catch`を使っている場合と、中側に使っている場合、2種類のサンプルを見かけるのですが、どちらの書き方にした方がいいのか、社内でフィードバックをもらったのでまとめました。

# usingステートメントとは

- ファイルの読み込み時など、外部のリソースからデータを取得するような場合、リソースがロックされる
- リソースを確実に解放するためには、`Dispose()`を呼び出す必要があり、通常は`try~finally`を使って自前で書かなくてはならない
- usingステートメントを使うことで、例外が発生したときも自動で`Dispose()`が呼び出され、リソースの解放ができる

[using ステートメント - Microsoct Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-statement)

# try~catchを使うときは外側に書く

usingステートメントに対して、try~catchを使う場合、usingの外側に記述します。

これにより、try~catchの処理を待たずにDisposeを行うことができるため、最速でリソースを解放することができます。

```cs
try
{
    using (StreamReader sr = new StreamReader("TestFile.txt"))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
    }
}
catch (Exception e)
{
    Console.WriteLine("The file could not be read:");
    Console.WriteLine(e.Message);
}
```

[StreamReader Class - Microsoct Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.io.streamreader?view=netframework-4.8)
【視聴メモ】What’s new in Angular (Google I/O ’19)

この記事は Google I/O '19 のセッションの視聴メモです。
想定読者は自分なので正確性や網羅率には問題があるかもしれません。

---

## References

https://www.youtube.com/watch?v=FiVw6zjgw24
Speaker(s): Stephen Fluin, Vikram Subramanian

## Abstract

> Angular has evolved a lot in the last year. Hear about the changes that you can opt into to make your applications smaller, faster, and easier to use. Opt-in to new capabilities such as the new rendering engine from Project Ivy, scaled builds with Bazel. Hear about some new use cases the Angular team is taking on to deliver great performance for consumer facing applications and our ideas to implement best practices into your application by default.

訳

> Angularは昨年大きく進化しました。 アプリケーションをより小さく、より速く、そしてより使いやすくするために選択できる変更について聞いてください。 Project Ivyの新しいレンダリングエンジンなどの新機能へのオプトインは、Bazelを使用して行われます。 Angularチームがコンシューマ向けアプリケーションに優れたパフォーマンスを提供するために採用している新しいユースケース、およびデフォルトでベストプラクティスをアプリケーションに実装するという当社のアイデアについてお聞きください。

## Contents

* なぜAngularが好きかというアンケート
    * cliが良い: 忘れがちな操作も含めてすべて自動化してくれるし速い
    * アーキテクチャに開発者の意見が取り入れられる
    * コミュニティが良い: カンファレンス(ng-**)がいたるところで開かれている
* Schematics
    * 新しいコンポーネントを作るときに適切な場所に作ってくれるし、他の場所にある参照も更新してくれる
* `ng-add` サードパーティ製ライブラリをSchematicsを考慮した上で追加できるコマンド
* nestjs
    * アプリケーションのバックエンドを支えるライブラリ
    * サービスとのコミュニケーションやCode SharingやSSRを行う
* `ng-update` ライブラリのバージョンアップデートをするときにSchematicsを考慮した上で変更を行ってくれる
    * AirFranceがコードベースをAngular7にアップデートしたとき、`ng-update`を使って1日で完了した
    * バージョンが上がるたびにアップデートにかかる時間が減少してる（下図）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/8529abbb-f55a-7177-934a-14c3af13b9fb.png)

* 昨年からの新機能
    * Drag and Drop
    * Virtual Scroll
    * Performance Budgets
    * Angular Console in VS Code
    * Differential Loading of Polyfills
* 8.0.0の新機能
    * Expanded Differential Loading
        * バンドル後のファイルでES2015の機能をそのまま使ってサイズを削減
        * チャンクをLazyload
    * Builder API
        * ng-build, ng-serve, ng-generate, ng-new 等のコマンドを変更できるように

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/1e5ff38f-b4a3-4ccf-742e-2fe1c06fec5b.png)

### Project Ivy

* Angularのレンダリングエンジン
* Tree Shaking
    * バンドルにはAngularフレームワークのうちの必要な部分のコードしか含まれなくなる
* Code Splitting
    * ページ単位のチャンクからコンポーネントレベルのチャンクへ
* Progressive Hydration
    * FCPとTTIを速くするためのコンポーネントレベルでのHydration
    * ページが表示されたときにHydrateする積極的Hydrationと
    * ユーザーが操作したときに必要なものを取りに行く受動的Hydrationがある
        * Ivyではこちらに対応した

## Memo

* Angular使ったこと無いのでコードの書き方はよく知らないが、Progressive Hydration等、Reactなどが関心を持ってる事柄にも同様に注目している
* Angular cliめちゃくちゃ便利そう
* Googleがいろいろ言っているだけあってAngularのProgressive Hydration対応は良さそう
* 国内ではAngular案件はほとんど聞かない気がするがGoogleの内部では結構使われているのか
    * このまえGoogle Japanの求人でFrontend Engineer (Angular,Polymerに詳しいこと) というものが出ていた
Ruby練習プロゲート


好きな西暦を変数に代入すると、その年に夏季オリンピックが開催されたかどうか出力するプログラミングを作る。
<img width="487" alt="Ruby_学習コース_Ⅰ___プログラミングの入門なら基礎から学べるProgate_プロゲート_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378273/56fedc8d-9305-35c9-1ddf-67df6b53e8fc.png">
プロゲートで練習中
間違えた場所オレンジ色で引かれている部分を下の条件式の下に入力してしまい、うまく出力できなかった。
上から順番に、処理してくれる。
ExcelからLaTexの表を作るアドインを作ってみた

# はじめに
私はLaTexの表を作るときにはいつもExcelで大体の表の構成を作った後に[Tables Generator](http://www.tablesgenerator.com/latex_tables)のようなWebアプリにコピーしてLaTexの表を作っていました。すごく便利ではあるのですが、罫線やセルのマージなどの情報はWebアプリに渡す段階で消えてしまいますし、作った表の体裁を保存しておくこともできないのである程度作り込んだ表の場合は毎度の作業が少し面倒でした。

そこでExcelのアドインをC#で作ることができる[Visual Studio Tools for Office (VSTO)](https://docs.microsoft.com/ja-jp/visualstudio/vsto/office-solutions-development-overview-vsto?view=vs-2019)というものでExcel上の選択範囲をLaTexの表に変換するアドインを作ってみました。同様の拡張機能はHTMLやMarkdownの場合にはすでにしっかりしたものを作ってらっしゃる方がいるみたいですが、LaTexはやはりマイナーだからなのか同様のものはまだないようです。結果的に自分がほしい機能は作れて、少なくとも自分は使いたいと思うものができたので満足してます。

制作したものは[GitHubにあげてみました。](https://github.com/ymzkd/Excel_LaTeXTable_Addin)リリース機能でインストーラーを簡単に配布できるということだったので初めて使ってみました。

# できること
シンプルです。Excelで選択した範囲をLaTexの表に変換してコピーするだけ。
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147589/4ec034c0-0ab2-31a4-9101-6210d2b64e44.gif)

残りはLaTexの表のオプションです。作成したあとに変更しても構いません。Excel側の操作で折り畳まれた行をスキップしないというオプションを付けてみました。

![sample2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147589/6ca23bc0-3241-4742-b250-000f79eefb8d.gif)

ということで作った機能概要は次の通りです。

- 選択範囲をLaTexの表としてクリップボードに貼り付ける
- 選択範囲をLaTexの表としてファイルに保存する
  - 複雑な表だと本文中に置くとかなり邪魔なので別ファイルにしてincludeするとき
- 基本的な表のオプションを指定する
  - 表を中央に寄せるか
  - 表を本文中のどこに優先的に配置するか
  - ラベルの指定
  - キャプションの指定
- Excel表の非表示行(又は列)が選択範囲に含まれている場合LaTexでも非表示にするか
- 一度設定した内容を設定ファイルとして保存することで再度Excelを開いたときにも設定内容を保持

# 今後やるとしたら
- セルの色、文字の色の反映
  - そもそも色付きのLaTexの表を作ったことがないが...
- 文字列の折返し
  - 表の幅を指定すればできるらしい。
- 特殊文字の自動変換
  - LaTexで入力してもそのまま表示されない文字の変換
  - 表自体は最終的にLaTexの表にする前提で作っているわけではないので、どっちみち数式など、あとで手直しは必要と割り切っている部分がある。

# 最後に
C#に触れたのはほとんど初めてでしたが、高機能の開発環境(VS)とネット上のわかりやすい情報のおかげで簡単にアドインを制作することができました。趣味でしかプログラミングはやったことがないので良いものができたのかわかりませんが、よかったらお試しいただけたら幸いです。
アルゴリズムとO記法

# アルゴリズムとは
- 問題を解くための手順

# アルゴリズムの備える性質
- **【正当性】**入力に対してアルゴリズムの与える出力が，確かに与えられた問題の解であること
- **【有限性】**有限の時間で出力すること
- **【停止性】**任意の入力に対してアルゴリズムが停止すること
- **【決定性】**同じ入力に対して同じ出力を与えること
    - 手続き中にランダム性を取り入れた，乱択アルゴリズムというものもある
        - 素数判定アルゴリズムが有名．ランダム性を取り入れることで，「間違える可能性もあるけどとても低い」実用上耐えるアルゴリズムを考えることができる


# 計算量complexity
- **時間計算量**：アルゴリズムが出力を出すまでにどのくらい計算時間を要するか
    - プログラムでアルゴリズムを書き下した時の，それぞれの文が何回実行されるのかで定量的に計る
- **空間計算量**：アルゴリズムが出力を出すまでにどのくらいのメモリを必要とするか
- 平均・最良・最悪

# 計算量の漸近的な評価
- 問題のサイズ$n$に対する計算量の漸近的な振る舞いを以ってアルゴリズムの効率の良さを表現する
- $O$記法

# O記法
- アルゴリズム$f(n)$（ここで$n$は問題のサイズ）の$n\rightarrow \infty$とした時の漸近的な振る舞いを書き下す記法

## O(・)
$f(n) = O(g(n))$の時，$f(n)$は$g(n)$によって漸近的に上から抑えられる．
要するに，$f$は$n$がいくら大きくなったところで$g$を超えることができない．

### 具体例
- $O(1)$
    - 問題のサイズが何倍になろうとも，そのアルゴリズムは一定の計算量で結果を出力するという意味．
    - 例えば，問題のサイズが$5$倍になれば出力を得るまでに要する計算量が$1$倍になるということ．
- $O(n)$
    - 問題のサイズに比例して計算量がかかる．
    - 例えば，問題のサイズが$5$倍になれば出力を得るまでに要する計算量が$5$倍になるということ．
- $O(n^2)$
    - 問題のサイズの二乗に比例して計算量がかかる．
    - 例えば，問題のサイズが5倍になれば出力を得るまでに要する計算量が25（＝$5^2$）倍になるということ．
- $O(\log n)$
    - 問題のサイズの対数に比例して計算量がかかる．
    - 例えば，問題のサイズが$5$倍になれば出力を得るまでに要する計算量が$2.32$（＝$\log_{2} 5$）倍になるということ．
- $O(n \log n)$
    - 「問題のサイズ」×「その対数」に比例して計算量がかかる．
    - 例えば，問題のサイズが$5$倍になれば出力を得るまでに要する計算量が$11.6$（＝$5\log_{2} 5$）倍になるということ．
- $O(2^n)$
    - 問題のサイズの$2$の指数乗に比例して計算量がかかる．
    - 例えば，問題のサイズが$5$倍になれば出力を得るまでに要する計算量が$32$（＝$2^5$）倍になるということ．
- $O(n!)$
    - 問題のサイズの階乗に比例して計算量がかかる．
    - 例えば，問題のサイズが$5$倍になれば出力を得るまでに要する計算量が$120$（＝$5!$）倍になるということ．

## Θ(・)
$f(n) = \Theta(g(n))$の時，$f(n)$は$g(n)$によって漸近的に下から抑えられる．
要するに，$f$は$n$がいくら大きくなったところで$g$を下回ることができない．

## Ω(・)
$f(n) = O(g(n))$の時，$f(n)$は$g(n)$によって漸近的に上下から抑えられる．
要するに，$f$は$n$がいくら大きくなったところで$g$とだいたい同じ感じになる．
Toolbarのナビゲーションアイコンとタイトルの間を詰めたい

# はじめに
Toolbarとタイトルの間隔とか全然気にしない環境で仕事してきたんですが、今回携わっている業務でえらくデザインに凝られまして、ナビゲーションアイコンとタイトルの間の間隔まで指定されたのでちょっと困りました。そんな際に求めている情報の日本語記事があまりなかったので備忘録として残しておきます。

# で、結局なにをしたのか
まず、今回使っているのはandroidxのToolbarです。
Toolbarタグの中に以下のふたつを追加しました。

```java
app:contentInsetStartWithNavigation="0dp"
app:titleMarginStart="0dp"
```

# おわりに
これでAndroidStudioのtoolからLayoutInspectorで確認するときっちり詰まっているはずです。
数年前の記事だったりすると要素名が変わっていたりして思うようにいかなかったりするので、随時確認が必要になりますね。
iPadOS13 を iPad mini（gen5）にインストールする方法（How to Install iPadOS13 in iPad mini gen5）

#iPadOS13 を iPad mini（gen5）にインストールする方法
##1) Apple Developer Program の　Downloads よりインストールするiPadに対応したレストアイメージをダウンロードします。※今回は、iPad (5th generation)を選択
参考：https://developer.apple.com/download/
##2) ダウンロードされたレストアイメージを任意のフォルダに配置
例:users>develop>tmp>iPadOS_Beta>iPad_Spring_2019_13.0_17A5492t_Restore.ipsw
##3) Finderを開き、iPadを選択し開きます。
##4) 'option'キーを押しながら　Restore iPadをクリック
※'option’キーが重要！！
##5) レストアイメージの場所を聞かれるので、2)で配置したイメージを選択するとレストアが開始されiPad mini　に iPadOS13 がインストールされます。
##6) 幸せ
Oculus Quest をwindowsPCにつなぐ

## 参考
* [Oculus Quest/Oculus Goに非公式アプリ（apk）をインストールする（上級者向け）](https://vr-maniacs.com/entry/oculus-quest-go-install-thirdparty-apk/)


正直参考にさせていただいたサイト見ればいいと思います．
ほぼ私的メモ．

## 1. 開発者モードの有効化
* OculusQuestをスマートフォンアプリに接続
* 設定→Oqulus Quest→その他の設定→開発者モードをクリック
* Oculusに開発者として登録していない場合，ポップアップしたリンクから開発者登録を行う．(団体名は何でもよい)

## 2. 必要なアプリのインストール

* Oculusの開発者向けサイトにある[GO/Quest用ドライバ](https://developer.oculus.com/downloads/package/oculus-go-adb-drivers/)をダウンロード． 解凍し，android_winusb.infを右クリック，インストールする．

* android用開発ツール[platform-tools](https://dl.google.com/android/repository/platform-tools-latest-windows.zip)をDL，適当なファイルに解凍


## 3. adb によるデバイス有効化
* QuestとPCを有線でつなぐ．
* コマンドプロンプトを起動．platform-toolsのディレクトリに移動し，`adb devices`と入力.
* 最終行にunauthorizedと表示される. Quest側にPCに接続するか問う内容が表示されるので許可を行う．

## 4. 完了
* エクスプローラにQuestが表示されるようになる．


## ちなみに
パターンロックを解除した後は一度Questを再起動しないとUSB接続を許可する画面が出ません…
僕はこれで大変つまりました…
会員登録が必要なiOSアプリでリジェクトを受けたもの

iOSアプリの審査でリジェクトを受けた内容を記しておきます。自分用メモなのでやや乱暴な書き方かもしれません。

* 会員登録が必要なアプリで、会員登録を行う際はSafariwを立ち上げる仕様としたらリジェクトされた
→ Safariを立ち上げるのではなくSafariViewControllerを用いてアプリ内ブラウザを立ち上げる仕様へ変更
* 登録項目は必要最低限のみにし、なぜ必要か明示的に（マーケティング用途で性別とかを取得してもユーザ機能には何も関係なかったりするとリジェクトされる）
* 会員登録をするメリットをきちんと示す
* （もちろんだけど）アプリ内に不必要に情報保持するな
* 個人情報の同意文言ちゃんとおけ
バブルソートを用いた正解率の算出

#何がしたいのか

例えばこんな感じのグラフがあるとする。（雑でごめんなさい）![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339669/4e24f506-d9af-0806-9893-221ae605ce8a.png)

求めたいのは、このグラフが**理想的な並び**にどこまで近いか、というものです。
##理想的な並びと正解率
今回は赤と青、この二種類のみのグラフを想定します。
<img width="260" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339669/975ff839-de0d-1063-85c6-b853b5113a02.png",
<img width="260" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339669/04832c67-a7f7-a3a9-86b2-fe63d40f1e64.png">

例として、正解率100%の並び（理想の並び）とその真逆の正解率0%の並びの図です。見たまんまですが、赤色と青色が逆になっています。ここでは極端な例なので0%と100%のみですが、以下のようなグラフではどうでしょうか。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339669/4ba87f3f-ee51-824b-78fe-b04ea39bc20c.png">

このグラフが、正解率100%の並びとどれだけかけ離れているか、それを求めればこのグラフの正解率がわかると考えました。

#結論
<img width="475" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339669/1b808dc3-2599-e3d3-1caf-eb606fcf5064.png">
で、正解率っぽい率になります。説明は↓へ

#算出方法
言語はpythonでやっています。
お題にもあるように、算出にバブルソートを用いました。バブルソートでどうやって求めるのか…それは、ソートで移動した回数、　**スワップ数**をもとに計算します。

##スワップ数を求める
ここでは2種類のスワップ数を求めます。
**ソート時に要したスワップ数** と　**最悪何回入れ替えが発生するかの最大スワップ数** です。
### ソートに要したスワップ数
まずこのスワップ数を求めます。要はソートすればいいだけです。何回でソートできたかを調べます。
*引数rowはソート前のグラフの並びを0,1で置き換えたlistです。*

```python

def swap_count(row):# 必要スワップ回数
    count = 0
    for j in range(len(row)):
        for i in range(1, len(row)-j):
            if row[i-1] > row[i]:
                row[i-1], row[i] = row[i], row[i-1]
                count += 1
    return count
```

###最悪スワップ数
最悪何回の入れ替えが発生するか、入れ替えにかかる回数の最大値を求めます。Counterを使用しています。

```python
from collections import Counter
def max_count(row):    # 最高スワップ回数
    c = Counter(row)
    assert len(c.values()) == 2 # ２種類のみ通すよ
    l_len = len(row)
    max_cnt = 1
    for v in c.values():
        max_cnt *= l_len - v
    return max_cnt
```

##２つのスワップ数から正解率を求める。
[結論](#結論)の式の通り、実際のソートで発生したスワップ数を最悪スワップ数で割り、それを100%から差し引くだけです。
特徴として、この式では正解率はマイナス値になりません。

#おわり
何かと使えるかなと思いメモとして残しました。異論受け付けます。
【Django】テストでリダイレクト先のページを検証する方法

## はじめに
Djangoのテストをしようとしたが、views.pyの中で、
`return redirect(reverse('menu:main'))`
のようにしていると、テスト時に以下のようにHTTPのレスポンスコードを検証すると、エラーになる。
`self.assertEqual(response.status_code, 200)`

リダイレクトするときは一旦#302で一時ページが来てから最終的に#200でリダイレクト先のページというように返ってくるためである。
これを解消する方法を説明する（備忘録）。

## テスト方法
TestCaseの以下のメソッドを用いる。
`assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)`

| 引数                     | 意味                           | 
|:------------------------|:-------------------------------|
| response                | GET/POSTしたレスポンス             |
| expected_url            | 最終的にリダイレクトされるURL          |
| status_code             | はじめに返ってくるHTTPのレスポンスコード  |
| target_status_code      | 最終的に返ってくるHTTPのレスポンスコード |
| msg_prefix              | テスト結果のメッセージのプレフィックス    |
| fetch_redirect_response | 最終ページをロードするか否か          |

## テストコード例
```python:tests.py
class AccountsAuthViewTests(TestCase):
    def test_auth_success(self):
        data = {
            'username': 'test',
            'password': 'password',
        }

        response = self.client.post(reverse('accounts:auth'), data)
        self.assertRedirects(response, reverse('menu:main'), status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)
```

## 参考
https://stackoverflow.com/questions/14951356/django-testing-if-the-page-has-redirected-to-the-desired-url
【Atcoder】 ABC120D/UnionFind

#はじめに
初めまして、初投稿です！
とある事情から自分のコーディングスキルを指標にして他人に示さないといけない（？）という状況になり、今慌ててatcoderで水色レートをとるべく、勉強しています。
文系就職ゆえに普段コードを書く仕事ではないので絶賛リハビリが必要な状況です・・・
Qiitaはアルゴリズム勉強メモ、情報交換用として活用していこうと思います:wave:



#UnionFind
早速今日学んだアルゴリズム、UnionFindですが競プロ界では必須な模様。
今回の問題は[こちら](https://atcoder.jp/contests/abc120/tasks/abc120_d)
橋をつなげていくとどの島にたどり着けるか？というように逆に考えていく問題。
これテストケースは正解するのに提出するとWAになってしまうぞ？？なんでだ？？？

```c++

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
typedef long long ll;
using namespace std;

struct UnionFind {
    vector<int> par; // par[i]:iの親の番号　(例) par[3] = 2 : 3の親が2
    vector<int> count; //それぞれ何個の島を辿れるか

    UnionFind(int N) : par(N+1), count(N+1) { //最初は全てが根であるとして初期化
        for(int i = 0; i < N; i++) par[i] = i, count[i] = 1;
    }

    int root(int x) { // データxが属する木の根を再帰で得る：root(x) = {xの木の根}
        if (par[x] == x) return x;
        return par[x] = root(par[x]);
    }

    int size(int x) {
        return count[root(x)]; 
    }

    void unite(int x, int y) { // xとyの木を併合
        int rx = root(x); //xの根をrx
        int ry = root(y); //yの根をry
        if (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのまま
        if (size(rx) < size(ry)) swap(rx, ry);
        count[rx] += count[ry]; //xとyの根が同じでない(=同じ木にない)時：xの根rxをyの根ryにつける
        par[ry] = rx;
    }

    bool same(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返す
        int rx = root(x);
        int ry = root(y);
        return rx == ry;
    }
  
};

int main() {
    int N, M;
    cin >> N >> M;
    vector<int> A(M), B(M);
    vector<ll> ans;

    UnionFind tree(N);
    ll cnt = N*(N - 1)/2;

    for(int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        A[i] = a - 1;
        B[i] = b - 1;
    }

    for(int i = M-1; i >= 0; i--) {
        int a = A[i];
        int b = B[i];
        ans.push_back(cnt);
        if (!tree.same(a, b)) {
            ll x = tree.size(a);
            ll y = tree.size(b);
            cnt -= (ll)x*y;
            tree.unite(a, b);
        }
    }
    
    for(int i = M-1; i >= 0; i--){
      cout << ans[i] << endl;
    }
    return 0;
}

```

道のりが長い・・・:robot:
[まとめ]DockerでRailsを扱う

## 1.プロジェクトの作成
**1-1.Dockerfileの作成**
**1-2.docker-compose.ymlの作成**


### 1-1.Dockerfileの作成


```Dockerfile
FROM ruby:2.5.3-stretch

RUN gem install rails

RUN apt-get update && \
    apt-get install -y nodejs mysql-client

COPY Gemfile /Gemfile
COPY Gemfile.lock /Gemfile.lock
RUN bundle install

```

### 1-2.docker-compose.ymlの作成

```docker-compose.yml
version: '3'
services:
  mysql:
    image: mysql:8.0.13
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - "./mysql-data:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: root
  app:
    build: .
    volumes:
      - ".:/app"
    ports:
      - "3000:3000"
    tty: true
    depends_on:
      - mysql
    working_dir: "/app"
```

```:ターミナル
$ docker-compose up --build
```

```:ターミナル
#appはdocker-compose.ymlで定義したコンテナ名
$ docker-compose exec app /bin/bash
```

## 2.Railsを立ち上げる

appディレクトリに入って

```
$ rails new .
```
するとrailsのファイルがインストールされる。

## 3.MySQLの導入

・Gemfileのsqliteをmysql2に書き換えて**bundle install**する

・config/database.ymlを書き換え

```config/database.yml
default: &default
  adapter: mysql2
  encording: utf8
  username: root
  password: root
  host: mysql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
#アプリの名前に合わせてpracのところを変更して下さい。
  database: prac_development

test:
  <<: *default
#アプリの名前に合わせてpracのところを変更して下さい。
  database: prac_test

production:
  <<: *default
#アプリの名前に合わせてpracのところを変更して下さい。
  database: prac_production

```
その後データベースを作成するために

```
$ rails db:create
```
データベースが出来たか確認。
database.ymlでpasswordやhostを設定したので以下のようなコマンドになってます。

```
$ mysql -u root -proot -h mysql
$ show databases;
```

```
#以下でサーバー起動
$ rails s -b 0.0.0.0
```


#### 補足
サーバーを一度落とすと以下のようになってサーバーが開かなくなるのが今の問題です

```
A server is already running. Check /app/tmp/pids/server.pid.
Exiting
```
シェルスクリプトの概要

# シェルとは
シェルは入力されたコマンドのパスを見つけ出し、Linuxカーネルに実行するようにお願いしてくれます。要するにコマンドを解釈するものです。このことからシェルは別名コマンドインタープリターとも呼ばれます。
シェルはLinux特有のものではなく、windowsではファイルを管理するエクスプローラー(GUI)がシェルです。

# Linuxカーネルとは
ハードウェアの抽象化やプロセス管理など、OSの核となる部分。
シェルとLinuxカーネルを分離することで、シェルが何かしらの原因で異常終了してもLixuxカーネルには影響を及ぼさないこと(このことからカーネルを守る殻”シェル”と名付けられる)や、シェルがコマンドのインターフェイスに徹することでユーザー好みにカスタマイズできるなどのメリットがあります。

# シェルスクリプトとは
▪️簡単に説明
シェルが解釈できるコマンドライン(Unix系コマンドなど)を予め記述したファイルのこと。
ポイントとしては、シェルスクリプトは、DSL（Domain-Specific Language）であり、汎用プログラミング言語(Ruby,PHPなど)と違うためシェルスクリプトらしい書き方をする意識する必要がある。
また、慣習として拡張子を.shとするが、実際の動きは、拡張子があろうとなかろうと一緒。(linuxに拡張子という概念はないです)

▪️詳しく説明
複数のコマンドと条件分岐やループ処理等を使用し、一連の処理を実現するプログラムのことである。bash、zsh などのシェルを利用し、シェルによって解釈・実行されるスクリプトなので、シェルスクリプトと呼ばれる。

# なぜシェルスクリプトを使うのか

- 開発環境等のバックアップやメンテナンスをする際にいちいちコマンドを沢山打たなくて済む。要は作業を自動化することができ、属人性を排除することができる

# 最低限理解する必要のある単語
###標準入出力 (標準入力、標準出力、標準エラー出力)
この概念は非常に大切なのでなぜ標準と呼ばれていのかもゆっくり理解した方がよいです。まず、標準入出力とは、下記3つの総称のことです。

- 標準入力(stdin)：プログラムの標準的な入力。通常ははキーボードが指定されているがファイルにすることも可能
- 標準出力(stdout)：プログラムの標準的な出力。通常は端末ディスプレイが指定されているが、ファイルやプリンタも可能
- 標準エラー出力(stderr)：プログラムのエラーメッセッジを主力するための標準的な出力。通常は端末ディスプレイが指定されているが、ファイルやプリンタも可能
<img width="856" alt="スクリーンショット 2020-07-29 17.58.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332147/e19d85bd-d4cc-4b61-e806-0ef3e02bb1f6.png">

要するに、標準入出力とは、キーボードやファイルなどを抽象化(標準化)したものです。抽象化することで各コマンドは標準入力から入力を受け取り、結果を標準出力に返すといった感じに、プリンターやファイル、キーボードなどを意識する必要がなくなります。

 <img width="1003" alt="スクリーンショット 2020-07-23 23.43.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332147/627104aa-e84a-ee2b-da20-148456b4539d.png">

#書き方

### １行目で必ずシェルの種類を指定

```example.sh
#!/bin/bash
```
" #! "は、Shebang(シェバン)と呼ばれ、コメントアウトではない。"#! bashの絶対バス"で、bashによって解釈、実行されることになる。
（Shebangは Hash(#) と Bang(!) をくっつけた HashBang の省略形）

シェルにzshを使っているのであれば下記のようになる

```example.sh
#!/bin/zsh
```

### 実行時に引数を渡すことができる
もちろんbashで関数をかけますが、ファイル自体を関数のように扱うことができます。バッチ処理などで引数に日付や定数などを渡して実行したりすることが多いです。例えば、第一引数であれば、$1と書く事でその値を参照できます

\$0 : ファイル名
\$1 : 第一引数
\$2 : 第二引数

```example.sh
#!/bin/bash

#引数の存在チェック

echo "$0"

if [ "$1" -gt "$2" ]
then
    echo "1番目の引数が2番目の引数より大きい"
elif [ "$1" -eq "$2" ]
then
    echo "1番目の引数と2番目の引数は同じです"
else
    echo "1番目の引数が2番目の引数より小さい"
fi
```
引数を渡して実行

```
$ bash example.sh 4 8　#（引数０（$0）；example.sh、引数1（$１）；4、引数２（$２）；8に相当）
hello.sh 
1番目の引数が2番目の引数より小さい　
```
### if文の癖
if文の後ろには条件式ではなく、コマンドを書きます。結果として、真or偽で判断するのではなく、終了ステータスが0or0以外かで判断します。

```example.sh
#!/bin/bash

if grep -q 'shellscript' /etc/passwd ;then
    echo "shellscript found"
fi
```

では、a>bなどの条件式を書きたい場合はどうするのか？
その場合はtestコマンドを使います。testコマンドは [ と表記します。

```example.sh
# '['はただのカッコではなくコマンドです。最後の引数は']'で終わる決まりがあります。
# 下の例だと、[ コマンドの第一引数は"$1", 第二引数は-gt, 第三引数は"$2",第四引数は ]になります。
# あくまでコマンドと引数という関係なので全てに間にスペースが必要になります。

if [ "$1" -gt "$2" ]
then
    echo "1番目の引数が2番目の引数より大きい"
elif [ "$1" -eq "$2" ]
then
    echo "1番目の引数と2番目の引数は同じです"
else
    echo "1番目の引数が2番目の引数より小さい"
fi

# -gtは、greater thanの略称で、=を含みません。($1>$2と同義。)
# -eqは、イコールのことです。
```


# シェルスクリプトらしい書き方とは
配列の中に追加（自分メモ用）

#配列の中に値を追加。


```ruby
a = [1, 2, 3]
a.insert(2, "a") => [1, 2, "a", 3]
```

(2, "a")の第一引数（2）が何番目に追加するか、第二引数が何を入れるかとなる。
Gmailに来たメッセージを特定のSlackチャンネルに送信したい

## 動機

業務の都合で特定のGmailアドレスに受信されるメールを早く確認したかったので、メールを受信したらすぐにSlackに投げ込みたかった。

## 必要なもの

- 送信したいSlackのチャンネル（新規で作るのが良いです）
    - 有料プランにする必要があるようです
- Gmailのアカウント

## 手順

### emailインテグレーションの設定

メールを表示させたいチャンネルに移動して「アプリを追加する」を選択。
<img width="1209" alt="スクリーンショット_2019-06-09_16_45_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/d1ff7f49-dbc2-7f69-bf31-2b99a63fef24.png">

emailを選択する。
<img width="1143" alt="スクリーンショット_2019-06-09_16_48_18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/4994f818-6873-a764-503f-941ba63449e7.png">

ブラウザが開くのでインストールしてチャンネルを選択してインテグレーションを追加する。
![スクリーンショット_2019-06-09_16_51_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/46f2c7af-4fb3-7b25-51ff-9e4506832790.png)

メールアドレスが生成されるのでメモっておくこと。
![スクリーンショット_2019-06-09_16_54_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/f07f86e5-a9b4-4dde-c916-5a3c5fd9e09e.png)

このメールアドレスをGmailでメール受信時に転送するように設定すると、メールを受信したらslackに投げ込まれるように出来ます。


### Gmailの設定

![スクリーンショット_2019-06-09_17_01_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/c60607d8-314e-ce7a-3086-744e2c4573ef.png)
歯車アイコンから「設定」をクリックする。

![スクリーンショット 2019-06-09 17.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/01cd32bd-93b4-997f-32c4-86344788c4cc.png)
「メール転送とPOP/IMAP」タブをクリックすると「転送」があるので、「転送先アドレスの追加」を押して先程メモったアドレスを入力して追加する。

<img width="986" alt="スクリーンショット_2019-06-09_17_07_16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/8c2c2364-9e46-a265-b7a3-f73364004135.png">
メールを表示したいチャンネルに自動転送リクエストのメールが飛んでくるので、承認リンクをクリックしてリンク先で「確認」ボタンを押すことで連携できます。

![スクリーンショット_2019-06-09_17_12_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/e54b6693-ff37-e8fb-1e76-489c3a722e9e.png)
最後に、Gmailに戻って受信メールを転送するようにラジオボタンを切り替えて、「変更を保存」で完了です。
【初心者向け】Mac+Eclipse+TomcatにMySQLを連携させる

**※すべての情報は記事作成当時のものです**
「<a href = "https://qiita.com/y_sit0521/items/a9034b5d77ac6201d961">MacOSでJavaによるWebアプリケーション開発環境を構築するまで</a>」より. 
「<a href = "https://qiita.com/y_sit0521/items/b50f0fff1fd087dd19c2">EclipseにTomcatを導入</a>」の続き. 

# 必要なもの
1. MySQL
2. JDBCドライバ
3. DBViewer Plugin

# MySQLのインストール
1.  下記サイトにアクセス<br>
    https://www.mysql.com/
2.  「DOWNLOADS」→「MySQL Community Edition (GPL)」の<br>
    「Community (GPL) Downloads »」をクリック
3.  「MySQL Community Server」をクリック
4. 「macOS 10.14 (x86, 64-bit), DMG Archive」の
    「Download」をクリック
5.  アカウント作成を勧められるが, ここでは無視する<br>
    「No thanks, just start my download.」をクリックして対象ファイルをダウンロード
6. `mysql-8.0.16-macos10.14-x86_64.dmg`を開く
7. `mysql-8.0.16-macos10.14-x86_64.pkg`を開く
8. インストーラが起動する（警告が出てきたら「続ける」をクリック）
9.  「はじめに」〜「インストール」までは「続ける」をクリック
10. 「Configuration」では「Use Strong Password Encryption」を選択して<br>「Next」をクリック
11. rootユーザのパスワードを設定する（**絶対忘れないように！**）<br>
    **パスワードは8文字以上なければならない**（「Finish」がクリックできない）
12. インストーラを閉じる<br>
--------以下, 動作確認--------
13. 「システム環境設定」を開き, 「MySQL」があるかを確認
14. 「MySQL」を開く
15. 「Start MySQL Server」をクリックすればMySQLサーバが起動し, <br>
    「Stop MySQL Server」をクリックすればMySQLサーバが停止する
16. 「Start MySQL when your computer starts up」をチェックを入れると<br>
    PC起動時に毎回MySQLを起動する設定になる（不要ならチェックを外す）

# JDBCドライバのインストール
1.  下記サイトにアクセス<br>
    https://dev.mysql.com/downloads/connector/j/
2.  「Select Operating System:」のプルダウンから「Platform Independent」を選択
3.  「Platform Independent (Architecture Independent), <br>Compressed TAR Archive」の
    「Download」をクリック
4.  アカウント作成を作成を勧められるが, ここでは無視する<br>
    「No thanks, just start my download.」をクリックして対象ファイルをダウンロード
5.  `mysql-connector-java-8.0.16.tar.gz`を解凍
6.  `mysql-connector-java-8.0.16/mysql-connector-java-8.0.16.jar`を<br>`/Applications/apache-tomcat-9.0.20/lib`の中にコピーする

# DBViewer Pluginのインストール
1.  Eclipseを起動
2.  メニューバーから「ヘルプ」→「新規ソフトウェアのインストール」をクリック
3.  「追加」をクリック
4.  名前に「DBViewer UpdateSite」<br>
    ロケーションに`http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/`<br>
    をそれぞれ入力して「OK」をクリック
5.  使用可能なソフトウェアとして、「DBViewer GenerateVO Option」と<br>
    「DBViewer Plugins」の2つがが表示されるので, 「DBViewer Plugins」にはチェックを入れる<br>
    「DBViewer GenerateVO Option」はどっちでもいいと思う（今回は入れないことにした）<br>
    チェックを入れたら「次へ」をクリック
6.  「次へ」をクリック
7.  「使用条件の条項に同意する」を選択して「次へ」をクリック
8.  インストールが開始される<br>
    インストール中, 「インストールを続行しますか？」という警告ダイアログが表示されたら<br>
    「OK」もしくは「インストール」をクリックしてインストールを続行する<br>
9.  インストールが完了したらEclipseを再起動
10. Eclipseの「パースペクティブを開く」をクリック
11. 「DBViewer」が存在していたらインストール成功

# EclipseとMySQLの連携
1. 「パースペクティブを開く」から「DBviewer」を選択して「開く」をクリック
2.  「DBツリー・ビュー」にある「DBviewerPlugin」を右クリックし, <br>「登録」をクリック
3.  「データベース定義名」（ここではexampleとした）を設定して<br>「次へ」をクリック
4.  DB接続情報を設定する. ここでは以下のように設定した
    - JDBC Driver:com.mysql.jdbc.Driver
    - JDBCタイプ:Type4
    - 接続文字列: jdbc:mysql://localhost:3306/example
    - 接続ユーザ:root
    - 接続パスワード:MySQLインストール時に設定したパスワード
5.  「テスト接続」をクリックして正常に接続されたらOK
6.  「次へ」をクリック
7.  「デフォルトスキーマのみ」をクリック（exampleだけにチェックが入るはず）
8.  「完了」をクリック<br>
--------以下, 動作確認--------
9.  先ほど作ったDBをダブルクリックして, 黄色い人間みたいなアイコンが出てくれば成功

# 最後に
お疲れ様でした！！
これでEclipseでWebアプリケーション開発ができる（はず）！！
【初心者向け】Mac+EclipseにTomcatを入れる

**※すべての情報は記事作成当時のものです**
「<a href = "https://qiita.com/y_sit0521/items/a9034b5d77ac6201d961">MacOSでJavaによるWebアプリケーション開発環境を構築するまで</a>」より. 
「<a href = "https://qiita.com/y_sit0521/items/37124314ba5f0cc4ada5">MacにEclipseをインストール</a>」の続き. 

# 必要なもの
1. Tomcat
2. Eclipse Tomcat Plugin

# Tomcatのインストール
1.  下記サイトにアクセス<br>（本ドキュメント作成当時のTomcat最新バージョンはv9.0.20なのでそれをインストール）<br>
    https://tomcat.apache.org/download-90.cgi
2.  「Binary Distributions」→「Core:」の「tar.gz」をクリックして対象ファイルをダウンロード
3. `apache-tomcat-9.0.20.tar.gz`を解凍
4. `apache-tomcat-9.0.20`をフォルダごと`/Applications`に移動

# Eclipse Tomcat Pluginのインストール
1.  下記サイトにアクセス<br>
    https://sourceforge.net/projects/tomcatplugin/files/
2.  「Download Latest Version」をクリックして対象ファイルをダウンロード
3.  `net.sf.eclipse.tomcat.updatesite-yyyy-mm-dd.zip`があるか確認<br>
    （本ドキュメント作成当時は`net.sf.eclipse.tomcat.updatesite-2019-01-28.zip`）
4.  Eclipseを起動
5.  メニューバーから「ヘルプ」→「新規ソフトウェアのインストール」をクリック
6.  「追加」をクリック
7. 「アーカイブ」をクリック
8. Finderが出てくるので, 
    `net.sf.eclipse.tomcat.updatesite-yyyy-mm-dd`を選択し, <br>「Open」をクリック
9.  「Tomcatプラグイン」にチェックを入れ, 「次へ」をクリック
10. インストール詳細画面が出るので, 「次へ」をクリック
11. 「使用条件の条項に同意する」を選び, 「完了」をクリック
12. ソフトウェアがインストールされたことを確認（右下のバーで確認可）
13. Eclipseを再起動
14. Eclipseの上部バーにTomcatの猫のマークがあればインストール完了

# EclipseでTomcatの環境設定
1.  メニューバーから「Eclipse」→「環境設定」をクリック
2.  「Tomcat」をクリック
3.  Tomcatのバージョンを選ぶ（本ドキュメントではバージョン9.x）
4.  「Tomcatホーム」の「参照」をクリック
5.  `/Applications/apache-tomcat-9.0.20`を選択
6.  「コンテキスト宣言モード」の「コンテキストファイル」が選択されていることを確認して<br>「適用して閉じる」をクリック<br>
--------以下、動作確認--------
7. Tomcat起動ボタン（猫のボタンの一番左）をクリック
8. 画面下のコンソール画面で「情報: サーバの起動 [xxx]ms」という表示が出ればサーバ起動完了
9. Webブラウザに以下のURLを入力してアクセス<br>
    http://localhost:8080
10. Apache Tomcatのホームページが出力されればOK

# 次は
<a href = "https://qiita.com/y_sit0521/items/0464d9462e56261b5d10">EclipseとMySQLを連携</a>
【初心者向け】MacにJDK+Eclipseをインストール（Pleiades All-in-One不使用）

**※すべての情報は記事作成当時のものです**
「<a href = "https://qiita.com/y_sit0521/items/a9034b5d77ac6201d961">MacOSでJavaによるWebアプリケーション開発環境を構築するまで</a>」より. 

# はじめに
- MacOS Mojave 10.14.3でAll-in-Oneを利用して統合開発環境「Eclipse」をインストールしようとした
- しかし「アクセス権がない」という警告が出てインストールできなかったため, 別の方法を取ることに

# やること
- All-in-Oneで一括インストールできるはずのものを別々にインストールする

# 必要なもの
1. JDK
2. Eclipse
3. Pleiades (日本語化プラグイン)

# JDKのインストール
1.  下記サイトにアクセス<br>
    http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
2.  「Java SE Development Kit 8u211」の「Accept License Agreement」を選択
3.  `jdk-8u211-macosx-x64.dmg`をクリックして対象ファイルをダウンロード
4. `jdk-8u211-macosx-x64.dmg`を開く
5. `JDK 8 Update 211.pkg`を開く
6. インストーラに従ってJDKをインストール

# Eclipseのインストール
1.  下記サイトにアクセス（Eclipseの公式サイト）<br>
    https://www.eclipse.org/downloads/packages/
2.  「Eclipse IDE for Enterprise Java Developers」の「Mac Cocoa」の横にある<br>
    「64-bit」をクリックして対象ファイルをダウンロード
3.  `eclipse-jee-2019-03-R-macosx-cocoa-x86_64.dmg`を開く
4.  `Eclipse.app`を`/Application`にドラッグ&ドロップ
5.  `/Application`へのコピーが完了したら`/Application`からEclipseを実行<br>
    「開発元が不明……」などの表示が出てきたら「システム環境設定」<br>→「セキュリティとプライバシー」から
    アプリケーションを開くのを許可してやる
6.  正しく実行されればWorkspaceを設定する画面が出てくるはず

# Pleiadesのインストール
1.  下記サイトにアクセス<br>
    http://mergedoc.osdn.jp
2.  「Pleiades プラグイン・ダウンロード」の「Mac」のボタンをクリック<br>
    `pleiades-mac.zip`がダウンロードされる
3.  `pleiades-mac.zip`を解凍
4.  `pleiades-mac/features`の中身を<br>
    `/Applications/Eclipse.app/Contents/Eclipse/features`の中にコピー
5.  同様に, `pleiades-mac/plugins`の中身を<br>
    `/Applications/Eclipse.app/Contents/Eclipse/plugins`の中にコピー
6.  `/Applications/Eclipse.app/Contents/Eclipse/eclipse.ini`を<br>テキストエディタで開く
7.  最後の行に以下の2行をそのまま追記（行頭のハイフンも）

        -Xverify:none
        -javaagent:../Eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

8. `eclipse.ini`を上書き保存して閉じる
9. `Eclipse.app`を実行すると日本語化されているはず

# 次は
<a href = "https://qiita.com/y_sit0521/items/b50f0fff1fd087dd19c2">EclipseにTomcatを導入</a>
【初心者向け】MacOSでJavaによるWebアプリケーション開発環境を構築するまで

**※すべての情報は記事作成当時のものです**

# はじめに
- JavaによるWebアプリケーション開発について学ぶ機会があった
- 自習用として, MacOSに開発環境を構築
    - Eclipse (IDE) + Tomcat (Webアプリケーションサーバ) + MySQL (DBMS)
- 意外と面倒だったので, 忘備録として作業手順をメモ

# 必要なもの
- JDK
- Eclipse (IDE)
- Pleiades (Eclipseの日本語化プラグイン)
- Tomcat (Webアプリケーションサーバ)
- Eclipse Tomcat Plugin
- MySQL (DBMS)
- JDBCドライバ
- DBViewer Plugin

# 環境
- ハードウェア: MacBook Pro (Retina, 13-inch, Mid 2014) 
- OS: MacOS Mojave 10.14.3

# 作業手順
1. <a href = "https://qiita.com/y_sit0521/items/37124314ba5f0cc4ada5">MacにEclipseをインストール</a>
2. <a href = "https://qiita.com/y_sit0521/items/b50f0fff1fd087dd19c2">EclipseにTomcatを導入</a>
3. <a href = "https://qiita.com/y_sit0521/items/0464d9462e56261b5d10">EclipseとMySQLを連携</a>
UnityでgRPCを動かす #3 iOS

ゴール：Unity(iOS/Android)でgRPCを動かす

* [UnityでgRPCを動かす #1 コンソールアプリ]
(https://qiita.com/nakaken0629/items/faf355db576542c2712c)
* [UnityでgRPCを動かす #2 Unity](https://qiita.com/nakaken0629/items/2cda78997befb71f7e3d)
* UnityでgRPCを動かす #3 iOS
* [UnityでgRPCを動かす #4 Android](https://qiita.com/nakaken0629/items/bd86a62e762f7fd073ae)

開発環境：macOS Mojave + Unity 2019.1.5f1

今回はその３です。

# iOSでgRPCのサンプルを動かす

[UnityでgRPCを動かす #2 Unity](https://qiita.com/nakaken0629/items/2cda78997befb71f7e3d)で別プロセスのサーバーを呼び出すよう修正したプロジェクトからスタートします。Build SettingsでPlatformを"iOS"にしてください。特にソースコードの修正などは不要です。ビルドをした後、Xcodeで実行するとシミュレーター上でクライアントが動作します。

<img width="535" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/c5e44b7d-42b0-79e3-51c9-89ae665ccb38.png">

# 次回予告

ここまで、iOSアプリとしてサンプルを動かしてきました。次はAndroidで動作させてみます。
Javaメソッドとメソッドのオーバーロード

今回は、javaのメソッドとメソッドのオーバーロードと扱ってみました！

メソッド→複数の処理をまとめたものになります。
![メソッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/ec7d128f-641b-3029-cdf6-31d8a1cb5647.png)

オーバーロード→メソッド名で引数の異なるメソッドのことを言います。
![メソッドのオーバーロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/8e0d0103-ed30-c7f8-dfda-10ca47fa3977.png)

このような形になりました。

**感想**
初めは言語に慣れる時期だと思うので頑張りましょう。
【危険。あかん】rpi-update firmware upate時の(y/n)プロンプト回避

Qiita、2度めの投稿です。

rpi-updateはとても有用なツールなのですが、夜間に自動で走らせている場合、ファームウェアのアップデートに(y/n)のプロンプトが出て、（私のように）「もうええったらええねん。リスクは先刻承知の上や。とっとと黙ってアップデートしとき」的ユーザーには悩ましいところです。

で、まあ、こんなふうに書いて、cronを設定して回そうとするわけですけれども、

`#!/bin/bash
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade
sudo purge-old-kernels -y
sudo apt-get -y autoremove
sudo apt-get -y autoclean
sudo apt-get -y clean all`
**sudo rpi-update -y**
`sudo sync`

ダメです。糞詰まってしまいます。太字9行目は、

**sudo SKIP_WARNING=1 rpi-update**

でなくては走りませんというお話でした。

ここに、ちゃんと見れば、オプションが書いてあります。
https://github.com/Hexxeh/rpi-update/blob/master/rpi-update
**ただし自動で走らせた場合 rpi-update 自体による影響とリスクがもちろんあります。**
検索力を身に着けよう！！

#検索力とは
Googleなどの検索エンジンを用いて、導きたい情報を見つけ出すスキルです。

#最短で情報を導くに必要な事

①複数キーワードで検索する（省略します）
②期間指定で新しい記事を探す
③英語で検索する
④Googleの検索テクニックを利用する

##期間指定で新しい記事を探す方法
検索情報が古いと現在でも通用する情報か判断がしにくい為、
Googleの「検索ツール」という機能が検索後右上などに表示されます。
なるべく新しい情報を検索するようにしましょう！

##英語で検索する
プログラミングの技術などが多いのですが、外国語で作られているサイトが多いです。
その為、日本語の意味を英単語に変えて検索してみましょう！
ヒット数が格段に上昇します。英語はGoogle翻訳等を使用しましょう。

##Googleの検索テクニックを利用する
###マイナス検索
方法は、除きたいワードの前に-をつけます。
それにより、情報サイトが固まって引っかかる際も弾いて探してくれます。
###フレーズ検索
方法は***完全一致で検索したいワードを"で囲みます。***

指定した検索キーワードに完全に一致するワードを含むWebサイトを検索結果として表示する機能です。

#まとめ
普段はキーワード検索のみが多いと思いますが、これを４つの方法を
使用してみるといいかもしれません。
何度か使っていると慣れて検索の幅が広がると思います。