OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelで簡単にSQL動作確認をする

## ◆実行されるSQL文確認

```
User::where('name', '山田')->toSql();
```

## ◆実行されたSQLを一気に確認

```
DB::enableQueryLog();//SQL保存有効
$userList = User::where('name', '山田')->get();
$foodList = Food::where('name', 'ラーメン')->get();

dd(DB::getQueryLog());//DB::enableQueryLog();以降に実行されたクエリ確認
DB::disableQueryLog();//SQL保存無効
```

実行された処理を保存したい場合などもDB::getQueryLog()は活躍しそう

## おまけ副問い合わせ(toSqlを使った)

```
①
$query = DB::raw('(生クエリ)');
$collection = Model::from('model as m')
    ->join($query. 'as q', 'q.model_id', '=', 'm.id')->get();
joinしたテーブルどうしに同じカラム名のものがあるとエラーになる。

②
$query = DB::raw('(生クエリ)');
$collection = Model::from('model as m')->select('m.id as mid', 'a.id as aid')
    ->join($query. 'as q', 'q.model_id', '=', 'm.id')->get();

実はこれにも問題が発生するときがあり、生クエリを書くところで、whereなどをしたいときに、変数をバインドすることができないので、laravelのtoSql()を使用する。

③
$query = SampleModel::from('sample')
    ->where('price', 100)
    ->get();
$collection = Model::from('model')
    ->select('model.id', 'sample.price')
    ->join($query->toSql(), 'sample.model_id', '=', 'model.id')
    ->mergeBindings($query)
    ->get();
$query->toSql()でプレースホルダ付きのクエリを生成してくれる。
mergeBindingsでプレースホルダの値をバインド。

```
【Selenium】find_element_by_ と find_element() の違い【Python】

```find_element_by_hoge``` は
 ```find_element(by=hoge, value=hoge.val)``` を
内部で利用している。


webdriver.pyに下記の記述がある。(xpathの場合)

```python:webdriver.py
def find_element_by_xpath(self, xpath):
    return self.find_element(by=By.XPATH, value=xpath)
```


```By.XPATH = 'xpath'```
と定義されている。

基本は```find_element_by_hoge```を使用すればよいだろう。
あとは好みの問題。
Seleniumでiframeに出入りしてみた

##なぜか取れないiframeの中身

以前スクレイピングをしていた際、検証モードからセレクタを指定しているのにも関わらず

**selenium.common.exceptions.NoSuchElementException**

とエラーを吐きました。


中を見ると操作したい部分がiframe構造の中に入っており、どうやらiframeの外からでは中のDOMを操作できないようになっていました。面倒だったので対処法を残しておきます。


##iframeに入ろう！
```python

    iframe = driver.find_element_by_css_selector('欲しいiframeのcssセレクタ')
    driver.switch_to_frame(iframe)
```

これでiframe内のDOMにアクセスできるようになりました。

##iframeから抜けてみよう！

```python

    driver.switch_to.default_content()
```

一行でiframeから抜け出せます。
##最後に

この記事を見ると、iframe内のリンクを直接開く方法もありますね。
seleniumで操作しなければいけない工数が少ない場合は、こちらの記事にある方がお勧めだと思います。

[直接開く方法はページの真ん中より少し下に載っています。](https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a)
（備忘録）Pythonでお天気情報取得アプリ作成

# 1. はじめに
2019年3月24日に[NPO法人 まちづくりエージェント SIDE BEACH CITY.](https://sidebeachcity.connpass.com/)様主催にて開催された[SBCamp. Pythonではじめる！プログラミング入門講座](https://sidebeachcity.connpass.com/event/121287/)でのPythonプログラミング入門について、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学べる内容

- Pythonインストール
- Visual Studio Codeインストール
- Visual Studio Code おすすめ拡張機能
- Pythonで天気情報取得アプリ開発

# 3. 事前準備

- [Python](https://www.python.org/downloads/)インストール
- [Visual Studio Code](https://code.visualstudio.com/download)インストール

# 4. Visual Studio Code おすすめ拡張機能
Pythonプログラミングでおすすめの拡張機能

- Python
- indent-rainbow
- Bracket Pair Colorizer 2

その他おすすめ拡張機能

- Settings Sync
- Auto Close Tag
- Auto Rename Tag

# 5. Chromeブラウザおすすめ拡張機能
Chromeブラウザ上でJSON内容を展開して見やすく表示する拡張機能

- [JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=ja)

# 6. お天気情報取得API
- [お天気Webサービス（Livedoor Weather Web Service / LWWS）](http://weather.livedoor.com/weather_hacks/webservice)

# 7. Pythonで天気情報取得アプリ

```python:main.py
# -*- coding: utf-8 -*-
import urllib.request
import json

# 天気クラス
class Weather:
    def __init__(self, data):
        # 日付
        self.date = data["date"]

        # テロップ
        self.telop = data["telop"]

        # 最高気温
        if data["temperature"]["max"] is not None:
            self.temperature_max = "{0}℃".format(data["temperature"]["max"]["celsius"])
        else:
            self.temperature_max = "--"

        # 最低気温
        if data["temperature"]["min"] is not None:
            self.temperature_min = "{0}℃".format(data["temperature"]["min"]["celsius"])
        else:
            self.temperature_min = "--"

    def print(self):
        print(self.date)
        print("  " + self.telop)
        print("  最低気温：{0}".format(self.temperature_min))
        print("  最高気温：{0}".format(self.temperature_max))

# Weather Hacks URL
URL = "http://weather.livedoor.com/forecast/webservice/json/v1?city={0}"

# 町コード：横浜市
ID = 140010

# リクエスト実行
req = urllib.request.Request(URL.format(ID))
with urllib.request.urlopen(req) as res:
    # レスポンス結果
    data = json.load(res)
    print(data["title"])
    
    # 天気結果の取得
    weathers = []
    for forecast in data["forecasts"]:
        weathers.append(Weather(forecast))

    # 天気結果の出力
    for item in weathers:
        item.print()

```

# 8. 実行確認

```shell:コマンドプロンプト
# Python3系にて実行
$ python main.py
神奈川県 横浜 の天気
2019-03-24
  晴時々曇
  最低気温：--
  最高気温：--
2019-03-25
  晴のち曇
  最低気温：4℃
  最高気温：18℃
2019-03-26
  曇時々晴
  最低気温：--
  最高気温：--

```

# 9. おわりに
Python学習の参考になれば幸いです。
ハンズオン開催してくださいました[NPO法人 まちづくりエージェント SIDE BEACH CITY.](https://sidebeachcity.connpass.com/)様、感謝いたします。

2019/03/24 TAKAHIRO NISHIZONO
Redisのmac用GUIクライアント

redisのキーやバリューをサラサラ〜っと見たい。


Windowsなら「Redis Desktop Manager」が有名らしいですが、
まぁ、、、Windows用。


macだとredis-cli使ってコマンドベースで見ないとダメなんか。
バリューを見るのは、大してめんどくさいことでもないのでいい。


ところが、キーが日本語だった時がとてもめんどくさい。。
多言語リソースをRedisで管理していたりすると、日本語のラベルがそのままエンコードされてキーになってたり。


エンコードされたまま出てくるから何書いてあるのかもわからないし、そもそもキー指定どうすんの？？？


なわけで、エンコードやデコードもいい感じにやってくれるGUIクライアントが欲しい！


ありました。
「Medis」
https://github.com/luin/medis
MITライセンスで公開してくれています。
パッケージングされたアプリケーションだと有償配布ですが、自分でnpmコマンド叩くなら無償。
お決まりコマンドだし、1回きりしか叩かないし、パッケージングされていなくても問題ないので無償で使わせていただきます。
ありがたや。

```bash:
cd /Applications
git clone https://github.com/luin/medis.git && cd medis
npm install
npm run-script build
npm start
```

これだけ！

SSHのトンネル接続もできるので安心。


# おまけ
毎回 cd して、npm start って地味に面倒ですよね。。
なわけで、「medis」これ一発で起動できたらちょっとはよくなるはず。
こんなファイルを作っておいて、実行権限つけておけばOK。

```bash:~/bin/medis
cd /Applications/medis
nohup npm start &>/dev/null &
```

12/25 [zhaoguoyuan](https://qiita.com/zhaoguoyuan)さんからコメントいただいて起動用コマンド修正しました。
~~`npm start`~~
=> `nohup npm start &>/dev/null &`

# 参考記事
https://murabitoleg.com/mac-redis/
laravel DB関係個人的メモ

## ◆Modelクラス
$guarded = ['id', 'created_at'];　編集不可のものを指定する

## ◆findメソッド
findでデータがない場合を考慮している処理を入れている場合はいいが、それが考慮されていない場合はfindOrFailを使う

```
try{
 findOrFail
}catch(ModelNotFoundException $e){}
```

## ◆where
汎用的なメソッドを作成するときにwhere('カラム名', 値)を使うが、それ以外は
whereカラム名(値)で検索したほうが可読性が上がるかもしれない　
例：whereName('山田')

## ◆create・save・insert
https://qiita.com/katsunory/items/87a73297f44a65f1474f

## ◆物理削除
delete()もしくはdestory()　destoryはidで指定する

##◆論理削除
マイグレーションファイルに

```
$table->softDeletes();
```

テーブルにdeleted_atが追加される。そのマイグレーションファイルのテーブルに対応したModelクラスに

```
use SoftDeletes;
```

を追加しておく。

こうしておくとdelete()・destroy()を使用した際に、自動的にdeleted_atカラムに
削除時間が登録されて、データを取得する際に、自動で含まれなくなる。
例 User::get();

```:取得方法
User::withTrashed()->get; 削除済みを含むすべてのデータ
User::onlyTrashed()->get();削除済みのみのデータ
```

## ◆リレーション
###1対1 hasOne・belongsTo
- hasOne
つなげる元のModelクラスに
<b>hasOne(つなげ先のModel, 内部キー, 外部キー);</b>

- belongsTo
つなげられるModelクラスに
<b>belongsTo(つなげ元のModel, 内部キー, 外部キー);</b>

内部キーと外部キーは省略することも可能で、省略時
内部キーは「モデル名_id」、外部キーは「id」が適用される。

### 一対多 hasMany
hasManyは基本的にhasOneと指定方法は同じでデータの在り方が1対1なのか1対多の違いだけで、引数も同じ

## Laravel Eloquent最後の一行取得

```
$last= Model::query()->limit()->orderByDesc('id')->first();
```

idをオートインクリメントにした場合は、これで一番後ろ取得可能

### laravelでDBトランザクション(エラーログ付き)(メモ)

```
DB::beginTransaction();
try {
    データベース更新処理
    DB::commit();
} catch (\Exception $e) {
    DB::rollback();
    Log::error($e->getMessage(). PHP_EOL. $e->getTraceAsString());
}
```

・\ExceptionのgetMessage()は例外メッセージ取得
・\ExceptionのgetTraceAsString()は例外スタックトレースを文字列取得
tcpdumpコマンドの使い方

# ダンプ取得
## start
 バックグラウンドで起動するのが便利

```
tcpdump -D          ---- IF番号の確認
tcpdump -i eth0  -w hoge &
tcpdump -i IF番号 -w hoge &
tcpdump -i any   -w hoge &
```

## stop
バックグラウンドジョブを確認し、停止

```
$ jobs -l
$ kill -HUP PID
```

# ダンプ結果を参照

```
tcpdump -n -r hoge [FILTER]
``` 

## Tcpflags

| char | flag |
| :---: | :--- |
| S | SYN |
| F | FIN |
| P | PUSH |
| R | RST |
| U | URG |
| W | ECN CWR |
| E | ECN Echo |
| . | ACK |
| none | if no flags |

## ECN : Explicit Congestion Notification
中継ルータが明示的に congestionの発生を知らせる
[解説PDF](https://www.nic.ad.jp/ja/materials/iw/1999/proceedings/C03.PDF)

- ECN CWR : Congestion Window Reduce. ECN echoに従って輻輳ウインドウを減少させたことを通知する
- ECN Echo : 輻輳が起こっていることを相手側に通知

# OPTIONS

 -D : インタフェース名表示
 -i : インターフェース名
 -w : 出力ファイル
 -r : 入力ファイル
 -n : アドレス、ポートの名前変換しない
 -v : 詳細１(ttl)
 -vv : 詳細２
 -A : パケットをASCIIで
 -X : パケットをHEXで

# FILTER例
- host 192.168.xx.xx / host hoge.jp ** FQDN可能
- port 22
- net network-address
- src host w.x.y.z and dest host w.x.y.z
- tcp / tcp port 22
- udp / udp port 53
- src, dst
- icmp, icmp6

# テスト
```
ping -c 1 
traceroute -n -q 1 -I HOST
traceroute —n -q 1 -T -p 80 HOST
traceroute -n -q 1 -U -p 162 HOST 
```
CodeBuildのログをLambdaでログを整形

# 経緯
CodeBuildのログを整形してメール通知する必要がありました。

# 構築
今回はCodeBuildの失敗ログがトリガーになるので、CloudWatch Eventsで
CodeBuildの失敗するイベントを作成します。
そこからSNS経由でロググループとログストリーム名をLambdaで受け取り、ログをなんやかんやします。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/316662/0866cf5f-7014-49ec-41df-fe97ba105fab.png)

※AWSのアイコンがアップデートされてさらにおしゃれになってました
　こういう細かなアップデートがあるのもAWSの魅力ですね。
　ただ、最新版にEmailのアイコンが無くなったような・・・？

## CloudWatch Events

| 項目 | 値 |
|---|---|
|イベントパターン|チェック|
|サービス名|CodeBuild|
|イベントタイプ|CodeBuild Build State Change|
|特定の状態|FAILED|
|ターゲット|SNS①|

## SNS①

- トピック名：任意
- サブスクリプション: Lambdaのエンドポイント(プロトコル：Lambda)

## Lambda

| 設定項目 | 値 |
| --- | --- |
|関数の作成|一から作成|
|名前|任意|
|ランタイム|Python3.6|
|ロール|1つ以上のテンプレートから|
|ロール名|任意|
|ポリシーテンプレート①|Amazon SNS 発行ポリシー|
|ポリシーテンプレート②|CloudWatchLogsReadOnlyAccess |
|トリガーの追加|SNS①|
|タイムアウト|1分|
|環境変数|SNSarn/SNS②のArn|


###　コード

```
import json
import boto3
import os
import time


TOPIC_ARN = os.environ['SNSarn']

def lambda_handler(event, context):
    
    message_unicode = event['Records'][0]['Sns']['Message']
    message_dist = json.loads(message_unicode)

    group_name = message_dist['detail']['additional-information']['logs']['group-name']
    stream_name = message_dist['detail']['additional-information']['logs']['stream-name']
    
    time.sleep(90)
    
    client = boto3.client('logs')
    logs = client.get_log_events(
        logGroupName=group_name,
        logStreamName=stream_name,
        startFromHead=True
    )
    body = logs['events']
    message = ""
    for line in body:
        log = '{}'.format(line['message'])
        message = message + log + '\n'
    
    Msg = message
    
    sub = '[Codebuild FAILED]'
        
    client = boto3.client('sns')
    response = client.publish(
        TopicArn=TOPIC_ARN,
        Message=Msg,
        MessageStructure='context',
        Subject=sub
    )
```

## SNS②

- トピック名：任意
- サブスクリプション: 通知したいメールアドレス

# 最後に
実際に検討を行ったCodeBuildのログは7000行あり、
メールが複数来たり、内容が不足していました。
原因は（環境差があると思いますが、）CodeBuildからCloudWatch Logsにログが出力されるまで約1分差がある事です。
Lambda起動時にはログがすべて出力され切らないまま動作し、またLambdaが3秒でtimeoutしてしまいます。
そこでPythonのコード上でスリープを入れ、Lambdaのtimeoutを3秒から増やしました。

するとSNSの本文に記載できる量をオーバーしてのエラーになった為、
一旦、S3へ保存し、通知したい内容を選別しSNS本文に記載する内容を絞りました。

苦戦しましたが、やりたい事は実現できました。
もっとスマートな方法がありましたら、ご教示頂けますと幸いです。
Railsチュートリアル-本番環境でメールが送れないとき

Railsチュートリアルの「11.4 本番環境でのメール送信」について。
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-activation_email_in_production

チュートリアルの手順を実施してもメールが送れなかったので解決方法をメモ。

# 症状
メールが送れない。

SenderGridの状態を確認。
herokuのappのページ -> Resources -> Add-onsのSendGrid -> Activityを開く。
すると、sample_appからのメール送信リクエストは受け取っているが、
ステータスが"Processed"で止まっていた。

# 原因
SenderGridのページの上部を見ると、
アカウントがSuspendされているというメッセージが表示されていた。
これが原因。

# 解決方法
SenderGridのサポートに、アカウントのSuspendを解除してもらうように依頼。
それで解決。

# 参考ページ
https://qiita.com/yuta-ushijima/items/f43ef5e0b59c2510ff52
例外処理について

プログラミング初学者です。
今回は前回の**例外**の記事に続きということで**例外処理**についてアウトプットさせていただきます。
#Q1: 例外処理とは？
実行時に例外が投げられた**後の**処理のこと。
（例外処理をしていなければシステムは中断されますが例外処理をしておけば中断されるまでに必要な処理を実行することができます。）
(例)・「予期せぬエラーが発生しました」と表示する。
　　・ファイルを閉じる処理をする   etc...　
#Q2: 例外処理はどうやって書くの？
**[try→catch→finally]構文**で書きます。

```java:qiita.java
try {
    // 実行したい処理（例外が投げられる可能性がある）
} catch() {
    // 例外が投げられた際にキャッチしてくれる
} finally {
    // 例外が発生しcatchされてもされなくても必ず行われる処理を書くことができる。
}
```
#finallyは別に書かなくても良い？
はい。
別に書かなくても[try→catch]だけで大丈夫です。
ですが、僕は初学者なのでまだわからないのですが、finallyがすごくありがたく感じる瞬間がいつか来るという記事をどこかで見たので書かなくてもいいけど重要なのは間違いない様です。

[参考文献]
https://eng-entrance.com/java-finally


**※間違い等ありましたら、恐れ入りますがコメントで教えていただけると幸いです。**
はじめての投稿

# <strike>言い訳</strike> はじめに
本稿は実務経験0の30代後半が、2019年4月からwebプログラマーになって<strike>しまい</strike>、一人前になる為に必死に勉強する様を記した内容です。自分の為の備忘録に近いです。
一応、趣味レベルで、html/css/Javascript/MySQL/PHP/Javaを触ってはいましたし、kotlinで、メモアプリ、電卓アプリぐらいは作ったりもしました。
諸兄から見ると拙い内容かも知れませんが、都度ご指摘いただければ幸いです。

内容は、基本的Java（servlet、JSP）ですが、必要に応じてJavascriptも使います。
学習環境はEclipseです。
Seleniumでリンクテキストを部分一致で探し、クリック(find, click)


```python:hoge.py
# インポート等
from selenium import webdriver
driver = webdriver.Chrome(executable_path=".\driver\chromedriver.exe")

# Seleniumでリンクテキストを部分一致で探し、クリック(find, click)
driver.find_element_by_partial_link_text("hoge").click()
```
参考：[find_element_by_partial_link_text-Python](http://www.seleniumqref.com/api/python/element_get/Python_find_element_by_partial_link_text.html)
[WIP] Windows で ":terminal に関する小さい Tips” を

[:terminal に関する小さい Tips](https://qiita.com/mattn/items/e99e5dc7c4054ba25e7d) を Windows で試したメモ。
まだ動いていない。

```bat:gofv.bat
@echo off

for /f "usebackq delims=" %%a in (`gof`) do "echo.exe" -e "\x1b]51;[\"drop\", \"%%a\"]\x07"
```

Vim から `:terminal gofv.bat` を実行して gof からファイルを選択しても開いてくれなかった。
echo.exe は msys2 のものを使用。

ちなみに `:terminal gofv` だと `CreateProcess failed` になった。
DockerfileのRUNとCMD、docker-compose.yaml内のマウントタイミング

#例えば

```yml:docker-compose.yml
build: './test'
volumes:
  - ./:/var/www/html
```

```dockerfile:test/Dockerfile
RUN chmod +x /var/www/html     # var/www/html not found
CMD chmod +x /var/www/html     # 思い通りに動く
```

`docker-compose.yaml`でマウントしたファイルに対して、`Dockerfile`で操作したいときは
`RUN`ではなく`CMD`を使う。

順番は、`RUN`→`volumes`→`CMD`だ。
Vim の "make test" を読み解く 第 4 回 (単体 new-style-testing の実行)

今回は、単体の new-style-testing のファイルが実行されるときの手順を見ていきます。以下は test_\*.vim のテストを実行して、結果ファイルの test_\*.res を作成するターゲットとルールです。

```Makefile:src/testdir/Makefile
.vim.res:
	@echo "$(VIMPROG)" > vimcmd
	@echo "$(RUN_VIMTEST)" >> vimcmd
	$(RUN_VIMTEST) $(NO_INITS) -S runtest.vim $*.vim $(REDIR_TEST_TO_NULL)
	@rm vimcmd
```
`vimcmd` というファイルでは、Vim のバイナリ名や実行時のオプションを一時的に覚えておいて、テスト側から参照できるようにしているみたいです。shared.vim から参照していて、いくつかのファイルから `source` されていました。テストが終わるたびに削除されます。

ルールの 3 行目が肝心のテスト実行箇所ですが、これだとちょっと分かりづらいので実際の実行時の値を見てみます。以下は test_assert.vim を実行しているときのプロンプトの例です。

```shell-session
VIMRUNTIME=../../runtime; export VIMRUNTIME;  ../vim -f  -u unix.vim -U NONE --noplugin --not-a-term -S runtest.vim test_assert.vim --cmd 'au SwapExists * let v:swapchoice = "e"' > /dev/null
```
1. `$VIMRUNTIME` を現在のリポジトリのものに設定
1. `-f` (GUI のみ？) fork せず foreground で実行
1. `-u unix.vim` unix.vim を vimrc ファイルとして読み込む
1. `-U NONE` gvimrc の読み込みをスキップする
1. `--noplugin` プラグインを読み込まない
1. `--not-a-term` 後述するように標準出力を /dev/null に捨てているが、その警告を出さない
1. `-S runtest.vim` ファイルを読み込んだ後に runtest.vim を読み込む (`source` する、実行する)
1. `test_assert.vim` Vimに読み込ませるファイルの指定、テストの場合このファイルにテストの実行内容が記述してある
1. `--cmd 'au SwapExists * let v:swapchoice = "e"'` スワップファイルが存在していても無視してファイルを編集するための自動コマンドの設定
1. `> /dev/null` 標準出力を /dev/null に捨てる

要するに、test_assert.vim を普通のファイルとして開いて、その中に書いてあるテスト内容を runtest.vim で実行するという形になっています。runtest.vim の内容については次回以降に見ていきます。

unix.vim の内容は以下の通り。

* 'shell' を `sh` に設定
* $HOME を `g:tester_HOME` に覚えておく
* setup.vim を `source` する

中で読み込まれている setup.vim の内容は以下の通り。

* 多重読み込みの抑止
* runtimepath と packpath をテスト用ディレクトリに設定
* 環境変数の変更
    * $XAUTHORITY は実際のものを使用する
    * $HISTFILE を空にする
    * $HOME をテスト用ディレクトリに設定

第 4 回はここまで。
LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法

##環境
PHP:v7.0.31
Laravel:v5.5
IDE:cloud9

##エラー内容
```terminal
composer require intervention/image
```
も実行した。

```config/app.php
//provider
Intervention\Image\ImageServiceProvider::class,
//aliases
'Image' => Intervention\Image\Facades\Image::class,
```
この2つも追加した。

```app/http/Controllers/PhotosController.php
use Image;
```
も対象のコントローラのトップに追加してある。
しかしながら、以下

```Driver.php
GD Library extension not available with this PHP installation.
```
このエラーが出る。

##なんと
実は、「Intervention/image」はPHP5.4以上で画像処理ライブラリのGDまたはImageMagickがインストールされている必要があるそうです。てことでGDをインストールします。

```terminal
sudo apt-get update
sudo apt-get install php7.0-gd
```
以上2つのコマンドをターミナルでうち、apache再起動すれば動くと思います。
学習メモ01（forward/redirect）

# 【servlet/JSP】forwardとredirect
どちらも、servletからJSPにページ遷移をするために使う命令文。
細かいところで挙動が違うらしい。（実務経験0なので実感が沸かんｗ）

## forward
RequestDispatcher rd = request.getRequestDispatcher("test01.jsp");
rd.forward(request, response);

－－－－－－－－－－－－－－－－－－－－
・javax.servlet.RequestDispatcherをインポートする必要あり
・リクエストスコープを使って値をservlet→JSPに受け渡しできる
－－－－－－－－－－－－－－－－－－－－

### redirect
//リダイレクト
response.sendRedirect("test02.jsp");

－－－－－－－－－－－－－－－－－－－－
・URLが書き換わる
・リクエストスコープを使って値をサーブレット→JSPに受け渡しできない
－－－－－－－－－－－－－－－－－－－－
中間層でMixup! ~Manifold Mixup: Better Representations by Interpolating Hidden States~

AAAIに採択された論文です。Data Augmentationの１手法であるMixupを発展させた論文になります。

# 概要を２行で
* 中間層の出力をMixupするManifold mixupの提案
* 従来の入力をMixupする手法よりも高い精度を得た。

# Mixupってなんだっけ？
MixupはData Augmentationの一手法であり，$X_i$をサンプル$i$の説明変数，$y_i$をそのラベルと置くと，以下の式で表されます。

$X = \lambda X_1 + (1 - \lambda) X_2 $
$ y = \lambda y_1 + (1 - \lambda) y_2 $

式から分かるように，説明変数とラベルを一定の係数$\lambda \in [0, 1]$で足し合わせる手法です。ちなみに$\lambda$はベータ分布$Be(\alpha, \alpha)$からサンプリングされます。

元論文では画像の矩形のマスクをランダムに行うData AugumentationであるRandom Eracingと比較して良い精度を出しているようです。
Random Eracingに関しては[こちら](https://qiita.com/dsanno/items/d32f3c928cdbcbe5de60)が詳しいです。

詳細な理論は省きますが，よく「クラス間の中間のデータを作ることで汎化性能を高くする境界平面を上手く学習する」みたいな文脈で説明されることが多いです。

# Manifold Mixupとは？
本手法は一言で言うと，入力データではなく，__ある中間層（入力層含む）の出力をMixupする__手法となります。

手順は以下の通りです。
1. ランダムに層$k$を選ぶ（入力層含む）
2. ランダムに選んだデータの組$(x, y), (x', y')$を上記で選んだ層$k$まで通常通りに計算する。（random minibatchと言ってるので，組は複数でも良さそう）
3. 層$k$における出力をそれぞれ$g_k(x), g_k(x')$とおくと，左記出力に対して以下の式でMixupを適用する。$(\tilde{g_k}, \tilde{y}) := (Mix_\lambda (g_k(x), g_k(x')), Mix_\lambda (y, y'))$
4. Mixupした中間層の出力をそのまま最終層まで伝播させてLossを計算する

割と単純ですね。すみませんが，理論は省きます。

## 効果を可視化
筆者によると，Manifold Mixupは決定境界を滑らかにする効果がある模様。特に，入力の決定境界だけではなく，中間表現の決定境界を滑らかにすることができるようです。この論文では渦の２クラス分類問題でそれを示しています。（論文からの引用です。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185518/b1a1c264-2bc3-666c-90b8-89439ad70511.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185518/80c6ec97-7abb-0be5-db26-0ca1d50d9bde.png)

上記(a), (b)はバニラな学習と提案手法の決定境界を表した図になります。バニラな場合は渦の隙間に別クラスの領域が入ってしまっていますが，提案手法はきちんと渦を描けています。加えて(d), (e)は中間層の決定境界です。これはかなりわかりやすいですね。バニラだと平面が複雑ですが，提案手法だと青と赤がはっきり分かれてます。

下の図では他の正則化手法と比較してます。普通のMixupでも中間層はやっぱり上手く行ってないですね。あとBatchNormすごい。

（決定境界ってどうやって描画してるんだろう...）

# 実験
Cifar10, Cifar100での精度の比較を行った結果が以下です。（論文からの抜粋です。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185518/f06c0dbc-ee61-c38c-48a7-bf00ac6c566a.png)

NLLはNegative Log Likelihoodです。ResNetだけでいいのかなという感じはしますが，他の手法よりもTest Errorが低かったことがわかります。（Adamixは論文探しても出てきませんでしたが，提案手法に似た手法で，データのオーバーラップを防ぐために分布を考慮してデータをミックスする手法のようです。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185518/bd561991-252a-297e-5b53-412c8e0c8b09.png)

また，筆者は上記の表でMixupを行う中間層の集合の要素数や$\lambda$を生成する$\alpha$を変動させた表を提示して，ハイパーパラメータへの頑健性を主張しています。プレーン（空集合）より全て精度が上がっているのがいい感じですね。

## 筆者の実装
pytorchで実装されているので参考までに。
https://github.com/vikasverma1077/manifold_mixup

## 参考文献
* Mixupの論文: https://arxiv.org/pdf/1710.09412.pdf
* 解説記事: https://qiita.com/yu4u/items/70aa007346ec73b7ff05
【JavaScript】反復処理② for【自己学習】

##forでできること
条件式がtrueの間、処理を繰り返すwhileやdo...whileに対し、forは指定した回数だけ処理を繰り返すことができる。

##forの書き方

```for-1.js
for (let i = 1; i < 4; i++) {
  console.log(`${i}回目の反復です`);
}

//コンソール
//1回目の反復です
//2回目の反復です
//3回目の反復です
```

反復処理を実行するにあたり、for()内に下記３つの式を左から順に記述する。

① 初期変数（`let i = 1`）
② 条件式(`i < 4`)
③ 変数の更新(`i++`)

3つの式はそれぞれセミコロン(;)で区切る。また、①〜③の式はカンマ(,)を使うことで複数の式を記述することもできる。

```for-2.js
for (let i = 1, x = 1; i < 4; i++, x++) {
  console.log(`${i}×${x}は${i * x}です`);
}

//コンソール
//1×1は1です
//2×2は4です
//3×3は9です
```
上記のコードでは①と③をカンマを使って2つずつ定義している。
複数バージョンのRubyを切り替えられるようにする

rbenvというツールを使う。brewはインストール済み前提。
https://github.com/rbenv/rbenv


# rbenvの導入
Macのターミナルで以下のコマンドを実行。

```bash
brew install rbenv
rbenv init
rbenv install -l # rubyのバージョン一覧を確認する。
rbenv install 2.6.2 # 2019/3/24時点の最新版をインストール
rbenv install 2.4.5 # 動作確認用に適当なバージョンをインストール
rbenv global 2.6.2 # 2.6.2を使うように設定
```

~/.bashrcに以下を記述。

```bash
export PATH=~/.rbenv/shims:$PATH
```

# 動作確認
Macのターミナルで以下のコマンドを実行。実際に2.6.2が選択されていることがわかる。

```bash
$ rbenv versions
  system
  2.4.5
* 2.6.2 (set by /Users/XXX/.rbenv/version)
$ ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18]
```
DialogのYes/Noをそれぞれbooleanで返す方法を探しています・・・

現在AndroidStudioにてJavaを使いアプリ開発の勉強を行っており、
Dialogの部分で躓いております。

機能としては例を挙げると下記の様に動かしたいと考えております。
A画面にて登録ボタン押下
　　　　　　　↓
Dialog：
　登録してよろしいでしょうか
　　　　　はい/いいえ
　 ↓　　　　　　　　　　↓　
はい押下　　　　　　いいえを押下
　 ↓　　　　　　　　　　↓
A画面へTrueを返す　　画面へFalseを押下
　　　　　　　↓
A画面にてTrue又はFalseを受け取り以降の処理を継続

調べてみたのですが調べ方が悪いのか、
booleanをreturnするようなDialogのサンプルを見つけることが出来ませんでした。

皆様のお力をお借りできませんでしょうか？
以上、よろしくお願いいたします。
pythonistaでuiを作成する（label, button）

# uiの作成に当たって
pythonistaのuiはGUIから部品をポチポチと貼り付けて作成するのと、部品をコーディングで作成する方法があります。
前者は、他でも記事（[iPhoneでiPhoneアプリを作ろう](https://qiita.com/ttsutchi/items/34fb3395f085e5e11f6e)）を見かけますが、後者はあまり見られないように感じたため、コーディングによって画面を作成する最低限のコードをまとめてみました。

※部品をコーディングによって作成すると、画面の向きが変わったときに部品のサイズを動的に変更したりなどカスタマイズ性が柔軟になって便利になる？と思ってこの記事を作成しました。

#ソース
```
from objc_util import *
import ui
import console

def button_tapped(sender):
	
	console.clear()
	i = console.alert('Info', 'Hi!!', 'Take Photo', 'Take Movie')
		
	if i == 1:
		print('your choise is take photo!')
	else:
		print('your choise is take movie!')
	return

def main():
	
	# メイン画面の作成
	main_view = ui.View(frame=(0, 0, 375, 667))
	main_view.name = 'test view'
	main_view.background_color = ('white')
	
	# ラベルの追加
	label = ui.Label(frame=(0, 0, main_view.width, 30))
	label.background_color = (0, 0, 0, 0.5)
	label.text_color = 'white'
	label.alignment = ui.ALIGN_CENTER
	label.text = 'test_label!!'	
	main_view.add_subview(label)
	
	# ボタンの追加
	button = ui.Button()
	button.frame = (10, 100, main_view.width-20, 30)
	button.title = 'test_button'
	button.action = button_tapped
	button.background_color = (0, 0, 0, 0.5)
	button.tint_color = ('white')
	main_view.add_subview(button)
	
	main_view.present('sheet')
	main_view.wait_modal()
	
if __name__ == '__main__':
	main()
```

#実行結果
1. 実行後
![IMG_0241.PNG](https://qiita-image-store.s3.amazonaws.com/0/368822/30666466-d4f2-8826-5cab-0e9056b05f37.png)

2. tap_button押下後
![IMG_0242.PNG](https://qiita-image-store.s3.amazonaws.com/0/368822/f3ef8a45-0983-11d4-a821-80e4d7b5f969.png)

3. console押下後
![IMG_0243.PNG](https://qiita-image-store.s3.amazonaws.com/0/368822/b02aa9e3-c6ca-acf1-9672-45a5c48c3e82.png)

#解説
- mainスレッドでラベル、ボタンを作成
・ui.View()でメインとなる画面を作成する。
・ui.label()、ui.button()でラベル、ボタンを定義する。
・main_add_subview(定義した部品)で部品をメイン画面に追加する。

- ボタン押下時のコールバックを定義
・button.actionでコールバックの関数を設定する。
・コールバックの関数を定義する（ここではbotton_tapped）。
　→ボタン押下時にconsole画面を表示して、そこでタップした内容に応じてログを出力するという機能。

- 参考元
[http://omz-software.com/pythonista/docs/ios/ui.html](http://omz-software.com/pythonista/docs/ios/ui.html)

#まとめ
labelとbuttonの説明しかまとめませんでしたが、今後はmotionセンサにより画面のサイズを動的に変化（縦横サイズ）することくらいは最低限取り入れたいと思います。
【Spring Boot】SpringDataJpa/集計関数等使用時に参考にした記事一覧

SpringDataJpaで集計関数等を使用したクエリーを発行する際に参考した記事の一覧を備忘録としてアップします。

[［1］TERASOLUNA（6.3. データベースアクセス(JPA編)）6.3.3.2. Entity以外のオブジェクトにQueryの取得結果を格納する方法](http://terasolunaorg.github.io/guideline/5.4.1.RELEASE/ja/ArchitectureInDetail/DataAccessDetail/DataAccessJpa.html#entityquery)（以下は抜粋です）

>想定される適用ケース
>>Query内で集計関数を使用して集計済みの情報を取得したい場合は、集計結果をEntityにマッピングすることはできないため、別のオブジェクトにマッピングする必要がある。

>実装要件
>>(1) Query結果を格納するJavaBeanを作成する(*1)。
>>(2) Queryを実行した結果でオブジェクト生成するためのコンストラクタを用意する。
>>*1 [[Java]新人向けにJavaBeansの直列化やフィールド・プロパティの謎をPOJOとの違いを交えて解説](https://qiita.com/ukitiyan/items/3b7f1ea7eb3d208ed5fe) (@ukitiyanさんの投稿を引用させていただきました）

[［2］@kagamihogeさんの「spring-data-jpaの@Queryでカスタムオブジェクトを返す」](https://qiita.com/kagamihoge/items/b299d17a20f86f03562c)
>抜粋
>Spring Data JPAでgroup byの集計結果などをエンティティではない自前のオブジェクトとして返す。

JPQL等ネットでの調査時の留意点
>下記の記事に記載の通り、Spring Data JPAは、生のJPA実装（Hibernate JPA参照実装）をラッピングしています。ネットで調査する場合、生のJPA実装に基づく記事なのか、Spring Data JPA実装に基づく記事なのかを意識して行う必要があります。
[TERASOLUNA : 6.3.1.2. Spring Data JPAについて](http://terasolunaorg.github.io/guideline/5.4.1.RELEASE/ja/ArchitectureInDetail/DataAccessDetail/DataAccessJpa.html#spring-data-jpa)

尚、こちらも良ければ参照下さい。
[「SpringDataJpa/集計関数等使用時に、新しいJavaBeansを作成するのではなく既存Entityを流用して実装してみた。」](https://qiita.com/Hisashi-Yamauchi/items/d4cdb5c321255d141a13)
[「SpringDataJpa/集計関数等使用時に、new xxxClass()を使用しない方法を試してみた。」](https://qiita.com/Hisashi-Yamauchi/items/926dd1ad34ac6364286e)
tracerouteを使って、TCP,UDPのポートが開通しているか確認する。途中で遮断されている場合。

## まとめ
[一覧で整理,GoogleDrive](https://drive.google.com/open?id=19libLFVqr476GhSXGNM4xhfxjm3pgvRw)
[一覧で整理,webdav](http://hrsk0310.mydns.jp:11377/webdav/webdav.share/Traceroute_via_firewall.pdf)

## TCP、途中遮断
途中でパケットがDROPされているので、タイムアウト（＊＊＊）している

~~~
$ sudo traceroute -n -q 1 -T -p 81   192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  2.174 ms
 2  192.168.1.1  2.415 ms
 3  *
 4  *
~~~

## TCP、途中遮断なし

~~~
$ sudo traceroute -n -q 1 -T -p 8080 192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  2.043 ms
 2  192.168.1.1  2.723 ms
 3  192.168.1.254  4.015 ms
 4  192.168.0.120  6.878 ms
~~~


## UDP、途中遮断

~~~
$ sudo traceroute -n -q 1 -U -p 162 192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  2.357 ms
 2  192.168.1.1  2.052 ms
 3  * ---- ここにある、192.168.1.254でDROP
 4  *
~~~

## UDP、通過

~~~
$ sudo traceroute -n -q 1 -U -p 53 192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  2.601 ms
 2  192.168.1.1  2.349 ms
 3  192.168.1.254  3.518 ms ------- ここは通過して
 4  192.168.0.120  4.828 ms !X ---- ここで拒否応答 
~~~


## tracerouteの結果の見方
[引用元１](https://milestone-of-se.nesuke.com/sv-basic/linux-basic/traceroute-result/)
[引用元２](https://milestone-of-se.nesuke.com/nw-basic/ip/icmp-type-and-code/)

~~~
! は [ICMP Type=3] Destination Unreachable

!H は [Type=3/Code=1] Host Unreachable
宛先IPの1つ手前のNW機器が宛先IPのARPを解決しようとしたが
(ホストダウン等が原因で)ARP解決できなかった場合に返されます。

!X は [Type=3/Code=13] Communication Administratively Prohibited 
途中のNW機器がACLによりその通信を拒否していることが多いです。
!X が表示されている行のIPがアサインされているNW機器の設定を調べましょう。

!N は [Type=3/Code=0] Net Unreachable
宛先の2つ以上手前のNW機器において、NextHopのARPが応答しないときなどに返されます。

!P は [Type=3/Code=2] Protocol Unreachable
そもそもそのホストのOS等で UDP 自体をサポートしていない場合に返されます。

!Z [Type=3/Code=13] 
communication with destination host administratively prohibited
宛先ネットワークへの通信がACLで拒否されている 
~~~
エンジニアとして働く前に読んでおきたかった本5選


---------------------------------------

未経験からポテンシャル採用でエンジニアになって約１年が経ちました。
１年の中で色々と本を読みましたが、「仕事始める前に出会いたかった！」と思った本を５冊ピックアップしてみたので参考までにどうぞ。


##読んでおきたかった本

### [リーダブルコード](https://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1)

- これはあまりにも有名なので「これは最低限読んでおけよ」って声も聞こえそうですが、心底読んでおくべきだったと
思ったので挙げてみました。コードを書く上でのお作法が中心となっているのですが本当に大事なことばかり書いてあります。僕は、働き出す前、変数名すらあまり意識をしてこなかったため何度もレビューで指摘を受けmergeまでかなりの時間を要していました。これを読んでおけばもう少しPRがスムーズにmergeされたに違いないと思います。


### [コーディングを支える技術](https://www.amazon.co.jp/コーディングを支える技術-成り立ちから学ぶプログラミング作法-WEB-PRESS-plus/dp/477415654X/ref=sr_1_1)
これはif文やfor文、エラー処理、スコープといったプログラミング言語の中にある文法や規則といったものがどのようにしてできたのか、どのような経緯で必要になったのかなどを説明しています。プログラミング言語によって細かい仕様は違えど、同じような文法、仕組みがあるのでプログラミングの基礎知識として読んでおくと良いと思います。


### [ハッカーと画家](https://www.amazon.co.jp/ハッカーと画家-コンピュータ時代の創造者たち-ポール-グレアム/dp/4274065979/ref=sr_1_1)
エンジニアとして最前線で働いた筆者が成功を勝ち取るまでにとった戦略、プログラミング言語に対する考え、世の中にある格差といった広い範囲のトピックについて考えを述べているエッセイです。読み物として面白いので勉強の合間などに読んでモチベーションを高めてみてはどうでしょうか。


### [開眼javascript 言語仕様から学ぶjavascriptの本質](https://www.amazon.co.jp/開眼-JavaScript-―言語仕様から学ぶJavaScriptの本質-Cody-Lindley/dp/487311621X/ref=sr_1_fkmrnull_1)
僕は入社前javascriptに関しては簡単なdom操作、何となくコピペでやってみた非同期通信くらいの実装ぐらいしかしたことがありませんでした。そういうわけで、仕様に苦しまされることが多かったのですが、この本を読んでからはそのような時間が実感として減ったように思います。これもかなり有名かと思うので既に読んでいる人が大多数かとは思いますが、javascriptを業務で使う方は是非読んでおいた方がいいと思います。


### [シス管系女子](https://www.amazon.co.jp/まんがでわかるLinux-シス管系女子-日経BPパソコンベストムック-Piro-結城洋志/dp/4822224961/ref=sr_1_3)
linux。名前だけは誰もが聞いたことあると思います。でもよく分からない。僕もそうでした。
業務で使う前だと中々仕様シーンなどがつかめず、勉強する理由も分からないという方もいるかと思います。しかし、この本は利用シーンも（マンガ）で見ながら学ぶことができるので使い方だけでなく業務での重要性も理解できると思います。linuxコマンド全く知らないとなると困ることが必ず出てくるので、この本をとっかかりに学習していくと良いと思います。

#### 補足
ちなみにですが、僕は本を選ぶ時クックパッドさんの方がおすすめされている下記のリストから選ぶこと
結構多かったです。上記5冊のうち２冊はここから
https://techlife.cookpad.com/entry/2015/03/31/093000
Railsチュートリアル(AWSのS3のアクセス権設定)

# はじめに
Ruby on Railsチュートリアルの13.4.4の本番環境での画像アップロードについて。
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-image_upload_in_production

AWSのS3を画像アップロードの場所として使うが、チュートリアルではS3の権限設定の手順が省略されている。ここでは、S3の権限設定の手順を記述する。

チュートリアルの手順に沿って、AWSにサインアップ、IAMユーザ作成、S3バケット作成までは実施している前提。
細かいことは置いておいて、とりあえずチュートリアルがこなせれば良い人向け。

# AWSのS3の権限の設定手順
## S3バケットへのパブリックアクセスを許可する
S3バケットの一覧ページを開く -> チュートリアルに沿って作成したバケットを選択。
![S3のバケット一覧のページ.png](https://qiita-image-store.s3.amazonaws.com/0/196890/cf9b98de-fb47-03a2-8917-715c87d77e89.png)

アクセス権限設定タブを選択 -> 編集を押す。
![S3バケットの権限設定.png](https://qiita-image-store.s3.amazonaws.com/0/196890/8d134660-0ced-3d17-be2a-f71ba118fef9.png)

「パブリックアクセスコントロールリスト (ACL) を管理する」の項目を両方共Offにする。
![S3の権限設定2.png](https://qiita-image-store.s3.amazonaws.com/0/196890/fee2c709-13a6-cfde-37c8-a4675d39509c.png)

## IAMユーザにS3へのアクセス権を付与する
IAMユーザの一覧を開く -> IAMユーザを開く。
![IAMユーザ一覧.png](https://qiita-image-store.s3.amazonaws.com/0/196890/8190cf4b-c8de-9420-8749-42414506af0c.png)

IAMユーザにアクセス権限の追加を押す
![IAMユーザアクセス権限の追加.png](https://qiita-image-store.s3.amazonaws.com/0/196890/5aa067c8-2ceb-0f27-81c3-f06df092ffb0.png)

既存のポリシーを直接アタッチを選択 -> ポリシーのフィルタに'S3'を入力 -> AmazonS3FullAccessを選択して、権限付与
![IAMユーザアクセス権限の追加2.png](https://qiita-image-store.s3.amazonaws.com/0/196890/de603936-29f3-7346-5b95-a65b77a7eafe.png)
Tomcat 8.5.37でfurther occurrences of http header parsing errors will be logged at debug level.とエラーが出たときの対処

Tomcat 8.5.37を用いて、サーブレットの開発をしていた時のこと。
突如として

note: further occurrences of http header parsing errors will be logged at debug level.
 java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:428)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

というエラーが発生しました。その時は
https://localhost:8080/プロジェクト名
でアクセスしていたのですが、これをhttp://にすることで解決。

参考：
https://stackoverflow.com/questions/42218237/java-lang-illegalargumentexception-invalid-character-found-in-method-name-http
【勝手に毎日投稿祭り】スイッチングハブを勢いで購入したので、物理サーバとWindows端末の通信に使ってみた

※1週間限定で、「勝手に毎日投稿祭り」と題して毎日投稿しています。
ぜひぜひ、皆さんも便乗して下さい。

##スイッチングハブを使ったことありますか？
![DSC_0415.JPG](https://qiita-image-store.s3.amazonaws.com/0/235933/414654ff-4fff-6bee-ce5c-da7f4e9e61bb.jpeg)

私は、スイッチングハブやルータが、業務で使われているものは見てきたが、自分で設定をしたり、使ったことはない。
家庭にあるルータも業者が設定をしてから自分で何かいじることはなかった。ルーティングとかの勉強はしてもそれを活かせる実践の場がなかったのだ。
![1189863.jpg](https://qiita-image-store.s3.amazonaws.com/0/235933/f77471f1-0403-bd54-81b8-4b22f5a7d3cc.jpeg)

先日、夜勤作業があった帰りにECサイトを見ていたら、1000円程で手に入るのが分かり、夜勤明けでイケイケな気分だったこともあり、即購入ボタンを押していた。

***「買ってしまった」***

***「もったいないし、ちゃんと使わなあかんやん」***

と、いうことで特に下調べとかせずに買ってしまったスイッチングハブを使ってみることにした。
まず、開封すると説明書があった。

***「ふむふむ、装置の名称ね、設置場所の注意点ね、接続できないときの確認ポイントね・・・、って後はないんかい！？」***

操作説明とかあるかと思ったら、特に使い方の説明はない。しょうがないので、とりあえず、使ってみることにした。
思い付きで、買っていた為、LANケーブルも一本しかなく、先ほど買い足してとりあえず、こんな風にしてみた。
![DSC_0417.JPG](https://qiita-image-store.s3.amazonaws.com/0/235933/e7b09a0d-c55f-f536-33d5-2e8ace6bd621.jpeg)

配線の汚さは見なかったことにしてください。
今回は、物理サーバ(CentOS6.9)とPC端末(Windows)を繋いで、以下のように接続して使用します。
[![Image from Gyazo](https://i.gyazo.com/81c058e677bf651ef20f5102e41768dc.png)](https://gyazo.com/81c058e677bf651ef20f5102e41768dc)

まずは、同じネットワークで繋がるように、CentOS、Windowsそれぞれに以下のように設定をした。
####CentOS6.9
```/etc/sysconfig/network-scripts/ifcfg-eth0 ```

ファイル内にIPADDRとNETMASKを追加し、ONBOOTとBOOTPROTOに関しては、以下のように書き換えた。

```
~略~
IPADDR=192.168.10.10
NETMASK=255.255.255.0

ONBOOT=yes
BOOTPROTO=none
```

ネットワークを再起動し、IPアドレスが適応されていることを確認

```
service network restart
ip addr
```

その他、vsftpdのパッケージをインストールし、サービスを立ち上げと自動起動設定をして、ファイアウォールとSElinuxの無効化を行った。

####Windows
ネットワークとインターネットのネットワーク接続から、LANケーブルで使用するイーサネットのIPv4に設定する

[![Image from Gyazo](https://i.gyazo.com/0c4efa785b566937b9a71bca08b4f27d.png)](https://gyazo.com/0c4efa785b566937b9a71bca08b4f27d)

上記を右クリックし、プロパティをクリック→ネットワークプロトコルバージョン4（TCP/IPv4）をクリック→プロパティをクリック
すると、以下のようなダイアログが表示されるので、IPとサブネットマスクに設定を入力しOKボタンを押下
[![Image from Gyazo](https://i.gyazo.com/a95889a23afb3611fecb9ed0644b7771.png)](https://gyazo.com/a95889a23afb3611fecb9ed0644b7771)

###では、これで使えるかやってみる
Windows側で、コマンドプロンプトを立ち上げ、まずは、pingが通るか

[![Image from Gyazo](https://i.gyazo.com/0032cb1fad88a448404acf0b28c1ccd4.png)](https://gyazo.com/0032cb1fad88a448404acf0b28c1ccd4)

通った！
次に、ftp接続ができるかやってみる。
[![Image from Gyazo](https://i.gyazo.com/51da11c02b9b80ac5a9f2173f1d62e83.png)](https://gyazo.com/51da11c02b9b80ac5a9f2173f1d62e83)
接続できた。
スイッチングハブ自体には、設定なく繋ぐだけで使えることが分かった。これから活用してみようと思う。
皆さんも、手ごろな価格で手に入るので、是非、試してみて下さい。
Java メソッド


# 本日学習したこと

- メソッドとは
- 戻り値
- 引数
- オーバーロード

## メソッドとは
・複数のプログラムをまとめ、それを一つの処理(機能)として名前をつけたもの。

### メソッドを使用するメリット
・機能単位に記述するため、修正範囲を限定できる。
・開発現場では数千〜数万行に及ぶソースコードが必要になるため、メソッドを使用してなるべくシンプルに記述することができる。(プログラムの見通しが良くなり把握しやすくなる)

### メソッドの定義

```ruby:java
public static 戻り値の型 メソッド名(引数){
  メソッドが呼び出された後に実行される具体的な処理
}#戻り値の型はメソッド内の処理の結果の値のデータ型を記述。処理結果が数値であればint、文字列であればStringになる。

# 例えば
public static int score(引数){
  処理...
}
#scoreというメソッドがあり点数という結果を呼び出し元に返す時、処理結果(点数)は数値なのでintになる。




#メソッドの呼び出し
メソッド名(引数); #戻り値を利用できない。

#戻り値の受け取り
変数の型　変数名 = メソッド名(引数); #戻り値を変数に入れて利用できる。
#メソッドは定義しただけでは実行されない。呼び出して初めてメソッドの処理が実行される。
```

- 戻り値とは

呼び出されたメソッドから、呼び出し元のメソッドへ返す値(データ)のことを戻り値または返り値という。

```ruby:java
return 戻り値; #こうすることで呼び出し元のメソッドに値を返すことができる。
#この戻り値がそのメソッドの実行結果となる。
```

## 引数
メソッドを呼び出す際に呼び出し元から値を渡すことができる。

```ruby:java
public static void main(String[] arg) {
  hello("岡村"); #helloメソッドを呼び出している。岡村という文字列のデータ(実引数)をhelloメソッドに渡している。
  hello("山本"); #上記に同じ
  hello("佐々木"); #上記に同じ
}

public static void hello(String name) { #メソッド呼び出しの際、仮引数として岡村がString型の変数nameに代入される。
  System.out.println(name + "さん、こんにちは"); #変数nameに代入されているデータをここで出力する。
}

# 実行結果は
>岡村さん、こんにちは
 山本さん、こんにちは
 佐々木さん、こんにちは
#となる。



#引数は複数渡すことができる。その場合は、カンマ(,)で引数を区切る。

.....mainメソッド(...){ #めちゃくちゃ簡略化してます。めんどくさがってごめんなさい。
  add(10, 20); #addメソッドに10,20という数値を引数として渡す。
}
.....addメソッド(int a, int b){ #addメソッドは引数を受け取り、aに10,bに20が代入される。
  引数を利用した処理...
}
#ここで注意なのが引数として記述された１番目の数値10はaに代入されるというところだ。
#()内の配置によってどの変数に代入されるかが決まる。
```



#### オーバーロードとは
・同じ名前のメソッドを定義すること。多重定義ともいう。
・メソッド名が同じでもデータの型や引数の数が違えばオーバーロードできる。
【Python】基本編

# はじめのコマンド
- 以下のコマンド実行で、Pythonプログラマが心すべき言葉が出力されます。

```py
import this
```

```
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
```

翻訳した結果

＜Pythonの禅 ～By Tim Peters＞
- 美しさは醜いよりも優れています。
- 明示的は暗黙的より優れています。
- 単純は複雑よりも優れています。
- 複雑は複雑よりも優れています。
- フラットは入れ子よりも優れています。
- 疎は密よりも優れています。
- 読みやすさが重要です。
- 特別な場合は、ルールを破るほど特別なわけではありません。
- 実用性は純度を打ち負かすが。
- エラーは黙って渡されるべきではありません。
- 明示的に沈黙していない限り。
- あいまいさに直面して、推測する誘惑を拒否します。
- それをするための一つの、そして好ましくは一つだけの明白な方法があるべきです。
- あなたはオランダ人でない限り、その方法は最初は明白ではないかもしれませんが。
- 今ではないよりはましです。
- 今では*正しい*よりも多くの場合決して良いことはありませんが。
- 実装を説明するのが難しい場合、それは悪い考えです。
- 実装が説明しやすいのであれば、それは良い考えかもしれません。
- 名前空間は素晴らしいアイデアの1つです - それらをもっとやろう！

時々、このコマンドを実行して内省したいと思います。

# Hello World の出力

```py
print('Hello World')
```

#ブロックの表現
- インデントで表現します

```py
i=3

if i % 2:
  print('偶数')
else:
  print('奇数')
```

- 上記のif文を例とすると、if と elseのインデントを揃えて、条件分岐内の処理は、そこからインデントして、表現します。インデントの文字数は半角スペース4文字、タブでなくても構いません。上記の例では2文字の半角スペースで表現しています。

#繰り返し

```py
for i in range(1, 100):
  print(i)
```

#型
- 明示的に型の宣言は不要です。

~~- 変数名 = (値)で自動的に型が定義されます。~~

> 型は値(オブジェクト)が持ってます。
> 変数は値(オブジェクト)を参照しているだけで、type関数は値(オブジェクト)の型を表示してるだけです。
> 変数は変数辞書に格納され、変数名は辞書キーとして使う単なる文字列です。


```py
# 整数
i = 10
print(i,type(i))

# 浮動小数点
f = 3.141592
print(f,type(f))

# 文字列
s = "hoge"
print(s,type(s))

=>
10 <class 'int'>
3.141592 <class 'float'>
hoge <class 'str'>
```

- 上記の例で分かるように、自動的に適した型が定義されます。

#コレクション

- 複数のデータ型をまとめてコレクションできます。

```py
my_collect = ['hoge', 'foo', 'bar', 2, 3.141592]
print(my_collect)

for val in my_collect[0:5]:
    print(val, type(val))

=>
['hoge', 'foo', 'bar', 2, 3.141592]
hoge <class 'str'>
foo <class 'str'>
bar <class 'str'>
2 <class 'int'>
3.141592 <class 'float'>
```

# 辞書

```py
# 辞書の作成
my_dict = {
    'key1': 'val1',
    'key2': 'val2',
    'key3': 'val3',
}

# リストの出力
print(my_dict)

# キーのみ出力
for key in my_dict.keys():
  print(key)
  
# 値のみ出力
for val in my_dict.values():
  print(val)

=>
{'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}
key1
key2
key3
val1
val2
val3
```
13日目(1)：Deviseによるログイン機能付きサイトの作成

[12日目：12日目：PostgreSQLを用いたログイン機能付きサイト](https://qiita.com/OriverK/items/ef1883408ea924376c1c)の続き

#環境
- ホストOS: Windows10 Home
- 仮想環境OS: Ubuntu Bento/Bionic
- Ruby：2.51
- Rails: 5.2.2
    -主使用gem : devise([参照](https://github.com/plataformatec/devise))
- DB: PostgreSQL

#前回やったこと
1. nodejsとpostgresqlのインストール
2. rails new self_univ3 -d postgresql とbundle install (devise)
3. PostgreSQLのパス設定、DB作成
4. rails g devise:install
5. modelsにdeviseを追加。rails g devise Student

#今回
1. controllersとviewsを以前の大学データの方から流用
2. migrationファイル作成
3. rooting変更


#実作業
##controllersフォルダとviewsフォルダのコピー
```
# cp -r コピーしたいフォルダの場所　ペースト先
```
##migrationファイル作成 
```
rails g migration AddNameToStudents name:string gender:integer age:integer opinion:text
#　実行
 create    db/migrate/20190324043018_add_name_to_students.rb
```
###DBに反映
```
rails db:migrate
```
##rooting変更
```app/confing/routes.rb
# 追加
resources :students
root to: 'students#index'
```
##viewsの変更
```erb:app/views/student.html.erb
# 今回不要なExamResultNewのリンク削除
# ログアウトリンクの作成
<% @students.each do |student| %>
      <tr>
        <td><%= student.try(:name) %></td>
        <td><%= student.email %></td>
        <td><%= student.try(:gender) %></td>
        <td><%= student.try(:age) %></td>
        <td><%= student.try(:opinion) %></td>
        <td><%= link_to 'Show', student %></td>
        <td><%= link_to 'Edit', edit_student_path(student) %></td>
        <td><%= link_to 'Destroy', student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        <%= link_to 'Log Out', destroy_student_session_path, method: :delete %>
      </tr>
    <% end %>
```
##コントローラ変更
```app/controllers/student_controller.rb
class StudentsController < ApplicationController
  before_action :authenticate_student!
```
![devise-logout.JPG](https://qiita-image-store.s3.amazonaws.com/0/294402/b0e658f1-85cd-a82a-7d65-68674997c3ee.jpeg)

次からは、このページに、以前の大学データを組み合わせる
ソースコードを GitHub に公開する方法

# はじめに
VSCodeの拡張機能をつくってみて、折角だからGitHubとMS Marketplace に公開しよう、と思ったもののさて何から始めればいいのやら、状態。まずはGitHubへの登録から、という事で、色々調べて何とか公開できたっぽい。明日の自分のために、とりあえずその方法をまとめておく。


# 目標
- ローカルリポジトリに登録されているコードをGitHubのリポジトリにpushする。

# 環境・前提条件
前提にする環境と諸条件は以下の通り。
## 環境
- OS
  - Windows 10

## 前提条件
- GitHubのアカウントを持っている。
- PCにgitがインストールされている。
- push対象のソースはgitのローカルリポジトリに登録されている。

# 準備　[`.gitignore`を作る]
他の人が作ったVSCode の拡張機能の GitHub リポジトリをちょぼちょぼ覗いていると、 `out` やら `node_modules` といったフォルダが push されていない。なので、まぁそういう風にするのが VSCode のお作法なのだろうということは分かったのだけれど、まさか、更新するたびにpushするファイルをちょぼちょぼと選択しているとも思えない。

と思いつつ、色々見ていたらどうやら、pushしないファイル（無視するファイル）は、`.gitignore` に書いておけばよいらしい。そういうわけで、諸先輩方のものを参考に、以下のように `.gitignore` を作成。

```markdown
out
node_modules
.vscode-test/
*.vsix
```

そんで、この `.gitignore` は最初に登録しておくらしいのだけれども、あとから作っちまたので、以下を参考に無視したいファイルをリポジトリから削除した。

[あとからまとめて.gitignoreする方法](https://qiita.com/yuuAn/items/b1d1df2e810fd6b92574)

# 公開する

## GitHub 上でリポジトリを作成
1. GitHub にログインした状態で、https://github.com/ にアクセスすると、左上にリポジトリ一覧と `New` ボタンが出ているので、このボタンをクリック。
    ![2019-03-24-12-07-28.png](https://qiita-image-store.s3.amazonaws.com/0/119094/94e1b203-e764-d34e-30fe-c6bf073111e1.png)

2. `Create a new repository` に遷移するので、 `Repository name *` にリポジトリ名を入れて `Create repository`をクリック。
![2019-03-24-12-12-02.png](https://qiita-image-store.s3.amazonaws.com/0/119094/0cd6710d-4dd4-fef0-60ce-42a6ec956fdb.png)

3. リポジトリの初期画面に遷移するので、`...or push an existing repository from the command line` に書かれているコマンドを、作った拡張機能のルートディレクトリで実行。場合によっては認証画面が出るので、GitHub の認証情報を入力。

![2019-03-24-12-15-33.png](https://qiita-image-store.s3.amazonaws.com/0/119094/e5adeea1-a3f0-f18b-534e-2b22e99d50da.png)


4. ブラウザでリポジトリにアクセスして、公開できていることを確認。
![2019-03-24-12-28-09.png](https://qiita-image-store.s3.amazonaws.com/0/119094/7c1c9a1a-be47-48cc-26b2-9fe57be28b78.png)


# おわりに
恥ずかしながら、初めて GitHub にコードを公開した。色々めんどそうなイメージがあって、イマイチやる気にならなかったのだけれど、やってみると簡単。Privateリポジトリも使えるので、他にもいろいろ活用していこう。
自作したAnsibleモジュールのsanityテストをTravis CIでやってみた

自作したAnsibleモジュールのsanityテストをTravis CIでテストした時のメモです。

# Travis CI

https://travis-ci.org/

プライベートリポジトリを使う場合はProへ

https://travis-ci.com/

# Travis CIドキュメント

https://docs.travis-ci.com/


# モジュールテストについて

テスト自体は、以下のようにGitLabでやっていたので、それをベースとしてやってみます。

https://qiita.com/sky_jokerxx/items/7aef76fdf1a303ee6c68

# 使うリポジトリ

今回は以下のリポジトリを使ってテストをやってみます。

https://github.com/sky-joker/ore-ore-ansible

# テスト対象

テスト対象のモジュールは上記リポジトリにある `modules` ディレクトリ配下にある全てに対してsanityテストをやってみます。

# CI準備

## Travis CIでリポジトリの有効化

Travis CIでGitHubアカウントでログインし連携した後に対象のリポジトリを有効化します。

![TravisCI01.png](https://qiita-image-store.s3.amazonaws.com/0/180118/3c2faf1e-489e-fb68-6cc0-f5b4adebbe10.png)

## Dockerファイル

Ansibleモジュールのテストは、あらかじめ用意されているテスト用コンテナイメージを使ってテストします。
以下のようなDockerファイルを作成しました。

```shell-session:Dockerfile
FROM quay.io/ansible/default-test-container:latest
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN cd /opt && \
    git clone https://github.com/ansible/ansible.git && \
    cd ansible && \
    mkdir lib/ansible/modules/salf_made/ && \
    mkdir test/units/modules/salf_made
ADD ansible_module_test.sh /opt
ADD modules /opt/ansible/lib/ansible/modules/salf_made/
RUN chmod +x /opt/ansible_module_test.sh
RUN apt-get -y install man-db
```

## テスト用スクリプト

コンテナ内で実行するテスト用スクリプトです。

```shell:ansible_module_test.sh
#!/bin/sh
version=$1
module_dir='lib/ansible/modules/salf_made/'

cd /opt/ansible
. hacking/env-setup
for module in $(find $module_dir | grep "\.py$" | awk -F / '{print $(NF)}' | sed -e "s/\.py$//g" | grep -v "__init__" | sort) ; do
    if [ $version = "2.6" ] ; then
        ansible-test sanity --python $version --skip-test botmeta $module
    elif [ $version = "3.8" ] ; then
        ansible-test sanity --python $version --skip-test pylint $module
    else
        ansible-test sanity --python $version $module
    fi

    if [ $? -ne 0 ] ; then
      exit 1
    fi
done
```

python 2.6, 3.8では、一部のテスト用モジュールが対応していないためかエラーが出るためスキップしています。

## CIファイル

Travis CIのCIファイルは以下のようにしました。
リポジトリにあるDockerファイルを元にイメージをビルドしてコンテナを起動し、コンテナ内に配置したスクリプトを実行します。

```yaml:.travis.yml
language: python
services:
  - docker

before_install:
  - docker build -t ansible-ci:latest .
  - docker run -d -it --name ansible-ci ansible-ci:latest

jobs:
  include:
    - stage: sanity test
      name: python 2.6
      script: docker exec ansible-ci /bin/sh -c '/opt/ansible_module_test.sh 2.6'
    - name: python 2.7
      script: docker exec ansible-ci /bin/sh -c '/opt/ansible_module_test.sh 2.7'
    - name: python 3.5
      script: docker exec ansible-ci /bin/sh -c '/opt/ansible_module_test.sh 3.5'
    - name: python 3.6
      script: docker exec ansible-ci /bin/sh -c '/opt/ansible_module_test.sh 3.6'
    - name: python 3.7
      script: docker exec ansible-ci /bin/sh -c '/opt/ansible_module_test.sh 3.7'
    - name: python 3.8
      script: docker exec ansible-ci /bin/sh -c '/opt/ansible_module_test.sh 3.8'
```

# CI実行

後は、リポジトリにpushすればCIが実行されます。
結果例は以下の通りです。

https://travis-ci.org/sky-joker/ore-ore-ansible/builds/510495879
tracerouteを使って、TCP,UDPのポートが開通しているか確認する。

# ルータ、FWを間に挟むNWで、通信不通の事象があり、原因切り分けのメモ
途中のNW機器で遮断されず、あて先まで通信している例

## ICMP
あて先までルーティングが通っているか、IP到達可能かを確認。

~~~
linux : traceroute -I DEST-IP
osx   : traceroute -P icmp DEST-IP 

$ sudo traceroute -n -q 1 -I 192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  3.012 ms
 2  192.168.1.1  23.497 ms
 3  192.168.1.254  24.483 ms
 4  192.168.0.120  24.598 ms
~~~

## TCP
SYNを送信し、Time-to-live exceededを待っている。「！x」が帰ってきていると、そこで遮断されている。

~~~
linux : traceroute -T -p PORT DEST-IP
osx   : traceroute -P tcp -p PORT DEST-IP
~~~

DEST-IPのPORTまで疎通した場合、応答あり。

~~~
$ sudo traceroute -n -q 1 -T -p 8080  192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  6.110 ms
 2  192.168.1.1  5.858 ms
 3  192.168.1.254  7.588 ms
 4  192.168.0.120  8.910 ms
~~~

DEST-IPでPORTを閉じている場合、応答なし!Xのエラー応答。

~~~
$ sudo traceroute -n -q 1 -T -p 443  192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  1.608 ms
 2  192.168.1.1  1.747 ms
 3  192.168.1.254  2.500 ms
 4  192.168.0.120  3.836 ms !X
~~~


## UDP
UDP+PORT指定の場合、0バイトのデータを送信するだけ。

~~~
linux : traceroute -U -p PORT DEST-IP 
osx   : traceroute -P udp -p PORT DEST-IP
~~~

DEST-IPでPORTをLISTENしている場合、データは受けていて応答がないので、＊＊＊となる

~~~
$ sudo traceroute -n -q 1 -U -p 162 192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  1.335 ms
 2  192.168.1.1  1.844 ms
 3  192.168.1.254  2.415 ms
 4  *
~~~


DEST-IPでPORTを閉じている場合、!Xが帰ってくる。

~~~
$ sudo traceroute -n -q 1 -U -p 999  192.168.0.120 
traceroute to 192.168.0.120 (192.168.0.120), 30 hops max, 60 byte packets
 1  192.168.4.1  2.914 ms
 2  192.168.1.1  1.565 ms
 3  192.168.1.254  4.123 ms
 4  192.168.0.120  3.841 ms !X
~~~

## tracerouteのオプション

~~~
OPTIONS
  -n : no DNS hostname resolve
  -q : nqueries per hop 
~~~

## よくあるPORT番号

~~~
IP-protocol No
 1:ICMP 4:IP in IP 6:TCP 17:UDP
 88:EIGRP 89:OSPF
   osx:   traceroute -P TCP|UDP|ICMP
   linux: traceroute -P nn

UDP-port
  53:domain 69:tftp 123:ntp 
  137:netbios-ns 138:netbios-dgm 139:netbios-ssn
  161:snmp 162:snmptrap

TCP-port
  20:ftp-data 21:ftp 22:ssh 23:telnet 25:smtp
  53:domain 80:http 123:ntp 
  3389:RDP 445:SMB 993:IMAPS
~~~