OmniAICreator/Qiita-1.07M huggingface dataset:
WHR-300HP2にDD-WRTを入れてみた(2018年版)

前回の経験( https://qiita.com/SquidSky/items/1b7bd34fca3666a1e2b0 )を踏まえ、もう少しリサーチして再チャレンジしてみました。

# 準備物
- PC(TFTPで書き換えるなら) + 3cdaemon (TFTPサーバー、**絶対に**)
- スマホやタブレット(純正WebGUIで書き換えるなら)

# インストール方法
WHR-300HP2では、**TFTP**と**WebGUI**からの書き込みができます。
# インストール手順(TFTP)
##  1. TFTPサーバーとファームウェアを用意する
WHR-300HP2用のファームウェアは以下のURLからダウンロードできます。
http://download1.dd-wrt.com/dd-wrtv2/downloads/betas/2017/12-29-2017-r34311/buffalo_whr_300hp2/firmware.uimage

TFTPサーバーの3cdaemonはこちらです。
https://drive.google.com/open?id=0Byf30eD0ZzXcV2dtQy1OSGt3YVk

3cdaemonをインストールしたら、TFTPのルートディレクトリをファームウェアがあるフォルダに設定します。
次に、firmware.uimageを**firmware_WHR-300HP2.ram**へ名前を変更します。
PCのIPアドレスは**192.168.11.168**に固定します。

## 2. ルーターをTFTPモードで起動して、インストール
いよいよインストールです。
まず、ルーターの電源を切った状態から始めます。
最初に、AOSSボタンを押しっぱなしにして、電源を入れます。
5秒くらい経ったら、指を離します。
上手く行けば約4秒後に転送が始まって、インストールされます。
さらに数分待って、Wi-FiとインターネットのLEDが点灯したら成功です。

# インストール手順(WebGUI)
**WebGUI**で書き込むときのファームウェアは以下のURLからダウンロードします。
http://download1.dd-wrt.com/dd-wrtv2/downloads/betas/2017/12-29-2017-r34311/buffalo_whr_300hp2/firmware-jp.bin

ダウンロードできたら、ルーターの管理画面を開きます。
ファームウェア更新画面へ行き、ダウンロードしたfirmware-jp.binを選んで更新開始します。
3分程度かかります。

数分待って、Wi-FiとインターネットのLEDが点灯したら成功です。

# 初期設定
初期ではルーターのIPが192.168.1.1になっているので、http://192.168.1.1/ にアクセスします。
最初はユーザー名とパスワードを設定する画面が出ますので、適当に設定します。
ここで設定したユーザー名とパスワードはWeb管理画面にアクセスするときに必要になります。

光回線終端装置がある場合は、INTERNE
Tポートではなく、普通のポートに挿し込みます。
そして、DD-WRTのIPアドレスを192.168.1.2にします。
インターネットに接続されている時はインターネットのランプが緑点灯しますが、そうでない時はさらに下のランプがオレンジに点灯します。

ちなみにですが、**設定したら必ず最後に一番下のApply Settingsか、Saveを押してください。**

次に無線LANの設定です。Wireless→Basic Settingsへ行きます。各種項目を説明します。
##Wireless: Basic Settings
###Wireless Mode
無線LANのモードです。通常はAPを選びます。
###Wireless Network Mode
無線LANの通信規格を選びます。
通常はMixedかNG-Mixedを選びます。
**ただし、Channel Widthで40MHzを選択した場合は、NG-Mixedを選ばないとHT40が使えません。**
###Wireless Network Name
SSIDのことです。自由に決めてください。
デフォルトではdd-wrtなので、元々のルータのSSIDにしてもいいです。
###Wireless Channel
無線チャンネルを選びます。干渉がない限りAutoで構いません。
###Channel Width
802.11nの拡張チャンネルを指定します。
Wide HT40を選ぶとHT40対応端末では速度が上がります。
**Wide HT40を選択した場合は、Wireless Network ModeでNG-Mixedを選ばないとHT40が使えません。**
###Extension Channel
拡張チャンネルの場所を選びます。
lowerだと1〜4ch、upperだと8〜12chです。

ここまでできたなら、次は詳細設定へ進みます。
##Wireless: Advanced Settings
###Transmission Fixed Rate
マルチキャストの転送レートです。
ここでは最大の54Mbpsを選んだ方が吉です。
###Frame Burst
フレームバーストはBroadcomチップ限定の機能です。Disableのままでいいです。
###TX Power
TX powerは無線LANの出力を指定します。
最初にManualを選びます。
現在お住まいの地域が都会で、無線LANが多く使われている場合は15mW、田舎の場合は500mWがおすすめです。
それでも弱いなら、都会ではせいぜい50mWが限界です。
慎重に決めないと電波法に違反するため、よく調べてください。
**絶対にAutoにはしないでください。**

次にオンラインゲーム向けの設定をします。
##NAT/QoS: UPnP
UPnPはオンラインゲームで必須のものです。無効になっていると遊べません。
UPnP ConfigurationのところのUPnP serviceをEnabledにして、設定を保存してください。

# 最後に
ここまでで、上手く導入と設定はできたでしょうか。
保証外になりますが、DD-WRTを導入することで幅が広がります。
ただし、法に触れない程度で。
それでは、いいDD-WRTライフを。
エンジニアでポートフォリオ作りました

## はじめに
ポートフォリオと聞くとデザイナーさんをイメージしますが、僕も転職する際など見せれるものがあればいいなと思い、作成しました。
https://nsuzuki7713.github.io/portfolio/

<img width="1035" alt="portfolio.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/c6d3e41e-4bba-5fe5-cdbf-85e83e7360e8.png">


ただ、デザインスキルとかHTML/CSSも得意でない自分がどのように作成したかを書いておきます。

## 記載する内容
まずは他のエンジニアの方がどんなものを作成しているかを調べ、下記記事を見つけました。
カッコよかったのでかなり参考にさせていただきました。
[エンジニアだけどポートフォリオサイト作ってみた](https://qiita.com/musou1500/items/24ed32d7f5b0a6377bc5)

上記記事を参考にし、まずは記載する内容を決めました。
・ 自己紹介
・ 技術スキル
・ 成果物
・ 連絡先

## テンプレートを決める
一からデザインをコーディングするのは時間も掛かるので、テンプレートから探します。
下記サイトで無料のテンプレートがあるのでこちらを使用させていただきました。
ただ、かなりポップで自分には合わない所もあるので細い所は修正します。
https://webdesigner-go.com/template/portfolio/

<img width="730" alt="Webデザイナー.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/bf4b4e3d-8003-a00f-5c9a-1e7b5750cd30.png">

## コーディング
テンプレートをもとに自分好みにカスタマイズしていきました。（調べながら泥臭くやりました。）
テーブルとかはbootstrapを入れて調整しました。（一部cssが競合してデザインは崩れました。。）

アイコンはfontawesomeから探して使用しています。
https://fontawesome.com/

## ホスティング
僕はgithub.ioを使用しました。gitに登録して、設定から公開すれば完了です。
モンテカルロ法での円周率の近似計算

### 円周率の近似値の計算方法

##### 1.  (1×1)の正方形のマスにランダムに点を打つ。
##### 2.  計N回繰り返す。
##### 3.  原点からの距離が1以下である確率が π/4 に近づく
##### 4.  つまり（原点からの距離が1以下である確率)×4がπに近づく

モンテカルロ法をpythonで実行するとこのようになります。

```python:monte.py
import math
import numpy as np
import matplotlib.pyplot as plt

x_all=[]
y_all=[]
pi = []
pi_mean = []
count=[]
N = 100

for i in range(1000):
    count.append(i)
    for i in range(N):
        incount = 0
        allcount = 0
        x = np.random.rand()
        y = np.random.rand()
        x_all.append(x)
        y_all.append(y)
        if x ** 2 + y ** 2 < 1:
            incount += 1
        allcount += 1
        pi.append(4 * incount / allcount)
    pi_mean.append(np.mean(pi))

plt.plot(count,pi_mean)
plt.axhline(y=math.pi, color='red')
plt.show()
```

以下は試行回数100回を1000セットやった時に計算された円周率の平均の結果になります。
これを見てわかる通り、だいたいモンテカルロ法で計算された円周率がだいたい近似できていると言えます。
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/266796/f3aae494-495b-2ff4-5dc7-7f761c521c35.png)


### 参考
[モンテカルロ法と円周率の近似計算](https://mathtrain.jp/montecarlo)
AWSのサービスを使ってSSL化する方法について検討(解決)


## 現状の構成
現状以下のような構成になっており、SSLがされていないので、表示されない状態になっている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280371/019d39c3-dd38-8efb-3169-22eeb32ae10a.png)

##今後作りたい構成
CDN（CloudFront）を活用し、SSL化を行いたい、CloudFrontにはACMから証明書を引っ張ってSSLする機能があるのでそれを利用したい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280371/bce5e3e6-f65c-12f3-42c2-cf2ab65314ef.png)


他にも、ロードバランサー（ELB）にSSL証明書を紐づける方法もあるが、、、ELBが月＄４０くらいかかるのでとても料金的に難しくこんな方法を・・・

#CloudFrontについて
CDNについては以下の記事の”CloudFrontについて”読んでご理解を・・・
https://qiita.com/Ichiro_Tsuji/items/38592e737257cb45ca13

#SSLの設定について

http://developers.goalist.co.jp/entry/2018/04/25/170000

上記の方法にしたがって行なった。鬼門となったのは、WordPress内で持つURLの書き換え（WordPress内のリソースは全てURLで持っているそう）、
以下のスクリプトでDB内のURLを一括置換（http://example　→　https://example）、書き換え後SSLの対応も終わっていた。
https://interconnectit.com/products/search-and-replace-for-wordpress-databases/
対応終了後上記スクリプトは削除

CloudFront→Client間のSSLは本方法により対応を終えた。
A5:SQL Mk-2でSQL整形

# A5:SQL Mk-2でSQL整形

**整形前**
![整形前.png](https://qiita-image-store.s3.amazonaws.com/0/99691/e585f4a9-1fd6-16b1-3b6e-f5aef63802cb.png)


**整形実行**
![整形実行.png](https://qiita-image-store.s3.amazonaws.com/0/99691/7d7cbafb-56ee-e45c-8bd5-d65aa3736ad7.png)

　※もしくは「Ctrl＋Q」

**整形後**
![整形後.png](https://qiita-image-store.s3.amazonaws.com/0/99691/ca9937b2-c3e5-acc5-c7bc-115851dad359.png)


**整形対象SQL**
```
select distinct  tb1.id  ,tb1.name  ,tb1.type  ,case 
tb1.type   when '1' then 'typeA'   when '2' then
 'typeB'   else 'type0'   end as tp_namefrom  TB_ONE
 tb1   inner join (     select      tb2.id     
 ,tb2.point      ,tb2.category    from      TB_TWO
 tb2    where      tb2.category > 'X'  ) tb2_x    
on tb1.id = tb2.idwhere  tb2.point >= 100  and (tb1.type
 = 1 or tb1.type = 2) union select  * from  
(select * from TB_OLD)
```
スクロールしない高さ自動調整のListView

ListViewを全てのアイテムを表示できる高さで配置したい場合があります。そんなときのためのカスタムViewです。

```kotlin
class NonScrollListView : ListView {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    init {
        isVerticalScrollBarEnabled = false
        isHorizontalScrollBarEnabled = false
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        val customHeightMeasureSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE shr 2, View.MeasureSpec.AT_MOST)
        super.onMeasure(widthMeasureSpec, customHeightMeasureSpec)
        layoutParams.height = measuredHeight
    }
}
```

あとは普通にレイアウトxmlの中で配置して、通常のListView通りにアダプタを設定してやればOKです。
PythonのFlaskで自動翻訳REST APIを作るまで

こんにちは

職場でPythonを使用しています。

Pythonを使うメリットとして

* とにかく速い
* virtualenvで環境にあったPythonが組める
* 大きなボリュームのあるデータを処理するためのアルゴリズムが豊富
* すぐにサーバーを立ち上げられる

などのメリットがありました。
そんなまだPython歴の浅い私がFlaskを使用して自動翻訳を作成しました

まずは準備です

以下のモジュールをインストールします

仮想環境を用意しましょう

```terminal

$ virtualenv env
```
仮想環境をアクティブ化します

```terminal
$ source pyenv/bin/activate
```

モジュールをインストールします

* Flask
* Flask_Restful
* googletrans

```terminal
$ pip install flask flask_restful googletrans
```

プロジェクトを作成します

```terminal
$ mkdir translator && cd translator && nano translator.py
```

REST APIを作ります

```translator.py
from flask import Flask, render_template, url_for, request, redirect, json,jsonify
from flask_restful import Resource, Api, reqparse
from googletrans import Translator

app = Flask(__name__)
api = Api(app)

class TranslatorSimple(Resource):
    def get(self):
        pass
    def post(self):
        pass

api.add_resource(TranslatorSimple, '/translate')

```

トランスレーターの部分を追加します

```translator.py
from flask import Flask, render_template, url_for, request, redirect, json,jsonify
from flask_restful import Resource, Api, reqparse
from googletrans import Translator

app = Flask(__name__)
api = Api(app)

class TranslatorSimple(Resource):
    def get(self):
        pass

    def post(self):
        data = request.json
        translator = Translator()
        keyword = data.get('keyword')
        lang = data.get('lang')
        if len(data.get('lang')) == 0 or data.get('lang') == None:
            lang="en"
        t = translator.translate(keyword,lang)
        res = {'text':t.text}
        return jsonify(res)

api.add_resource(TranslatorSimple, '/translate')

if __name__ == '__main__':
	app.run(host='127.0.0.1', port=8000, debug=True)
```

Pythonを起動して8000番のポートでサーバーをたてます

```terminal
$ python translator.py
```

テストしてみます

```terminal
$ curl -X POST -d '{"keyword":"こんにちは","lang":"en"}' -H 'Content-Type:application/json;charset=UTF-8' http://localhost:8000/translate
```

結果がこんな感じでかえってきます

```
$ curl -X POST -d '{"keyword":"こんにちは","lang":"en"}' -H 'Content-Type:application/json;charset=UTF-8' http://localhost:8000/translate
{
  "text": "Hello"
}
```

お疲れ様でした。今回は日本語を英語にしましたが詳しくは以下のドキュメントをご覧ください

[googletransのドキュメントのリンクです(英語)](https://pypi.org/project/googletrans/) 


他にもいろんな情報をブログで共有させてもらっています。Python関連が中心です。
よろしかったら是非ご覧になってください＾＾

ご一読ありがとうございます！

http://shinnegishi1986.hatenablog.com/
Canvas 繪圖 - 基本教學 By 彭彭

JavaScript 進階功能
/* Canvas 繪圖
 * a. 基本教學 
 * b. 影像處理 
 * c. 檔案的輸入與輸出
 */

a. 基本教學 

```ruby:qiita.rb

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Canvas 繪圖</title>
<script type="text/javascript">
window.onload=function(){
	var cvs = document.getElementById("cvs");
	var ctx = cvs.getContext("2d"); //2d繪圖 Canvas Context Object
	// Fill 填滿
	ctx.fillStyle = "pink";
	ctx.globalAlpha = 0.9;
	ctx.fillRect(50, 50, 100, 100);
	// Stroke 描邊
	ctx.globalAlpha = 1;
	ctx.strokeStyle = "dark gray";
	ctx.strokeRect(200, 100, 200, 200);
	// Path 路徑
	ctx.beginPath(); //開始建立路徑
	ctx.moveTo(200, 50); // 移動當前所在位置
	ctx.lineTo(400, 50);
	ctx.closePath();
	ctx.stroke(); // ctx.fill(); 描邊or填色
	// 利用路徑畫出多邊形
	ctx.beginPath();
	ctx.moveTo(200, 200);
	ctx.lineTo(300, 200);
	ctx.lineTo(300, 300);
	ctx.closePath();
	ctx.stroke();
	ctx.fill(); // ctx.fill(); 描邊or填色
};
</script>
</head>
<body>
<canvas id="cvs" width="600" height="500" style="border:1px solid #000000"></canvas>
</body>
</html>

```

b. 影像處理
初学者が送る初学者のためのオブジェクト指向講座

# QiitaでAdventCalendarをするよって話

夏真っ盛りにQiitaでAdventCalendarをしますよって季節外れな企画が始動しました，
期間は8/12~9/12となりますので頑張っていきましょう．
まず初回を飾らせてもらいます,何を書くか1日考えたのですが，まだ初学者なもので書くことがあまり無いということで初学者が送る初学者のためのオブジェクト指向の記事でもタラタラと書いてみようかと思います．

## では本題行くで

と，簡単な宣伝はおしまいにして本題に入っていきましょう．
**まとめにソースファイルをあげているgitを載せているので参考にしてください．**

## 初学者が送る初学者のためのオブジェクト指向講座

まずオブジェクト指向ってなんやねん！って方もいるかと思います.
私も2ヶ月ほど前までは実際にオブジェクト指向に触れたことはなかったのでそちら側の人間でしたので，私が一ヶ月ほどで培った知識のみで語らせていただきますのでご容赦をお願いします．
そしてこの記事ではオブジェクト指向言語のJavaを用いて**(Javaしか書けない)**記事を書いていきます．

### だからオブジェクト指向ってなんやねん

オブジェクト指向はよくたい焼きの型とたい焼きに例えられます．
クラスをたい焼きの型,インスタンスをたい焼きと例えられています．
クラスという型に複製してインスタンスを生成するためそういう例えがされています．

しかしそんなありきたりの比喩は面白く無いと思うんですよ，***ほならね，自分が例えてみろって話でしょ？***

では例えてみましょう.....(3時間後)

オブジェクト指向とは....合体ロボです．でもただの合体ロボではありません，パーツをカスタマイズできる合体ロボです．そしてたい焼きの例のように比喩するとインスタンスが合体ロボのパーツでロボット工場がクラスとなります．
なぜパーツをカスタマイズできる合体ロボかというとオブジェクト指向プログラミングにおいてパーツ(クラス)は自分で作ることができます．しかし,たい焼きの型は通常自分で型を作ったりすることは無いかと思います．そしてMain.java(胴体)に色々なインスタンス(腕や脚)を合体させていきます．Javaには3つの大事な要素があります.これについて話していきます．

### Javaの三大要素ってなんやねん
Javaの三大要素とは1.継承,2.ポリモーフィズム,3.カプセル化です．それらについて軽く話します．

#### 1.継承
継承とはあるクラスを別のクラスに継承させることでサブクラス(子クラス，継承したクラス)からスーパークラス(親クラス,継承されたクラス)のメソッドや変数にアクセスすることができるというものです．
なぜ継承すると便利かというと，例えば図形のクラス(Figure)を作るとします.しかし長方形や三角形,円があり,長方形のクラス(Rectangle)と三角形のクラス(Triangle)と円のクラス(Circle)の各クラスは内容が似たようなものになります.例えば図形に色があり，半径や高さ，底辺があり面積を算出することができますが，それぞれで計算式が異なるため統一できないときにFigureをそれぞれ継承することで色などの共通の情報をいちいち記述するてまがなくなり再利用性が高まります．
そしてサブクラスでスーパークラスと同名のメソッドを定義することでメソッドをオーバーライドすることができます．オーバーライドすることで各サブクラスでの微妙な違いを埋めることができます．先ほど例にあげたようにRectangleとTriangleとCircleでは計算式が違います．しかしFigureでcalcAreaメソッドを定義し，各サブクラスでオーバーライドし計算式を同名メソッドで分けることが可能です．
<img width="751" alt="IMG_0123.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/269859/e7514ee5-8a7c-9d00-a2ed-342c29d68766.jpeg">




#### 2.ポリモーフィズム
ポリモーフィズムとは継承したサブクラスをスーパークラスとしてインスタンスを生成することができるというものです．
スーパークラスでインスタンスを生成することにどんなメリットがあるかというと,同じ型だから同じ配列やArrayListに格納することができます.
しかしメリットだけではありません．その代わりスーパークラスに無いメソッドを呼び出すことはできません．しかしスーパークラスにあるメソッドから呼び出すことは可能です．
なので，概形(汎用パーツ)を作りそれを継承し各キャラクター等に派生させて，メソッドをオーバーライドしてディティールを固め，スーパークラスでインスタンスを生成し，キャラクターを一つの配列にまとめるなど共通の方で色々な動作をすることができます．

<img width="367" alt="IMG_0124.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/269859/707aeac2-5938-97e2-6f27-da95e1c1ebe8.jpeg">



#### カプセル化
カプセル化とはローカル変数をprivateで宣言し，セッターやゲッターと呼ばれるメソッドを用いてあたいの代入や取り出しを行うというものです.
なぜメソッドを使ってめんどくさく値に干渉するのかというと，ワンステップ踏んで値に干渉することで，意図せぬ代入などにより発生するエラーを未然に防ぐためです．

### まとめ
まだまだオブジェクト指向は奥が深いですが，初学者が初学者におくるオブジェクト指向講座なので，今回はJavaの三大要素を解説してみました．もっとできる奴になったらもっとわかりやすい解説を描きたいなと思います．
git:https://github.com/kindainoob/Figure.git

### 最後の最後に
AdventCalendarとは別にワンナイト人狼を作ろうという記事を後々数記事に分けて描きますのでそっちもよろしくお願いします．．．
Visual StudioでReactを遊んでみる。

###1.Visual Studio起動後、新規プロジェクト作成で「ASP.NET Core Webアプリケーション」を選択する。

###2.Node.js / npmをインストールする（for Windows）
   https://qiita.com/taiponrock/items/9001ae194571feb63a5e

###3.Error: Cannot find module './wwwroot/dist/vendor-manifest.json'とか出たら、以下のページを参考にする。
   https://stackoverflow.com/questions/49734822/asp-net-core-application-wont-run-no-dist-folder-and-cannot-find-module-ww
Rubyで独自コマンドを作ってみよう ( コマンドはバイナリじゃなきゃ駄目って誰が決めたんだ？ )

なんとなく無意識に「コマンドというとバイナリ」というイメージがあったが、自分の環境で実行できるものなら、スクリプトでもコマンドを作れる。

- `$PATH` のディレクトリの中にスクリプトを置く
- Shebang を書く
- 実行権限を付ける

これだけでOK。


## 例

コマンド引数を表示するだけのRubyスクリプト。

```rb:/usr/local/bin/ruby-echo
#!/usr/bin/env ruby

ARGV.each do |argv|
  puts argv
end
```

実行権限を付与

```
$ chmod +x /usr/local/bin/ruby-echo
```

## コマンド実行

動くでしょ。

```
$ ruby-echo Are you happy hacking

Are
you
happy
hacking
```

## Ruby gem

ところで Ruby gem をインストールすると一緒にコマンドも入るタイプのものがあるが、これもRubyスクリプトで書かれているものがあったりする。

[Ruby — 自作 gem の実行コマンドを作る手順 - Qiita](https://qiita.com/YumaInaura/items/f6a1dcbde2fa288bd86d)

## Ruby on Rails 

何を隠そう Ruby on Rails で `bin` に入っているコマンド群も Ruby スクリプトだったりする。

bin のコマンド＝バイナリでしょと思い込んで、途中まで中身を読んだことさえなかったので、rubyスクリプトだと知った時には驚いた。

```rb
#!/usr/bin/env ruby
begin
  load File.expand_path('../spring', __FILE__)
rescue LoadError => e
  raise unless e.message.include?('spring')
end
APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot'
require 'rails/commands'
```

( `Rails 5.2.1` )


## 環境

- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
- Mac OS X High Sierra

## 関連

- [Gist](https://gist.github.com/YumaInaura/443a5c1a06f17be67122c7f2c1f17299)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Toolbarだと思ってたものがActionbarだった話

Toolbarの文字の色を変えたくていろいろ調べてたんですが、そもそもデフォルトで見えてるのはToolbarではなくてActionbarだったみたいですね。

Actionbarをいじるには**styles.xmlでスタイルを作成**して、**AndroidManifest.xmlにandroid:theme="作成したスタイルのパス"を書く**みたいなんですが(多分)、よくわからなかったのといじりやすければActionbarでもToolbarでもどっちでもいいや！ってことで「Actionbarを消してToolbarをのせる」ことにしました。

# Actionbarを消す

#### 方法１：スタイルを作成してセットする

```xml:app/src/main/res/values/styles.xml
<!--スタイルを作成-->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar"></style>
```
```xml:app/src/main/AndroidManifest.xml
<!--作成したスタイルをセット-->
<activity android:name=".MainActivity"
    android:theme="@style/AppBaseTheme" />
```
他の画面がある場合も、同じようにスタイルをセットしてあげればActionbarを消せます。
スタイル名(AppBaseTheme)はhogeでもなんでもいいですが、わかりやすい名前にしてくださいね。

私は今回こっちの方法でActionbarを消しました。

#### 方法２：継承をActivityに変更する

```kotlin:MainActivity.kt（変更前）
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 中略
    }
}
```

```kotlin:MainActivity.kt（変更後）
class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // 中略
    }
}
```

# Toolbarを実装する
android:textは普通に文字列を入れても大丈夫です。(android:text="hello world"みたいな)
ただ、基本的には`res/values/strings.xml`に文字列を書くようにした方がいいみたいです。

> https://codezine.jp/article/detail/9387
アプリを他言語に対応させたい場合、別言語で記述されたstrings.xmlを作成し、所定のフォルダ（例えば日本語ならvalues-ja）に入れておくだけで、Android OSの言語設定に従ってOS側で自動的にstrings.xmlを切り替えてくれる仕組みが整っているからです。


文字色を変えるには`android:textColor="#ffffff"`のようにRGB形式で書くか、リソースに追加した色を指定します。(下記のコードに書いてある感じ)

```xml:activity_main.xml
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar_main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent" >

    <!-- Toolbarに表示する文字(例) -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="15dp"
        android:text="@string/main_title"
        android:textColor="@color/color_text"
        android:textSize="18sp" />

</android.support.v7.widget.Toolbar>
```

![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/199895/e489a4e1-7eb8-d87e-eacc-5a5039a86aa4.png)


分かってしまえば簡単なんですけど、これを知るのに半日使ったんですよね。
もっと上手に調べものできるようになりたい。

**2021/9/30追記**
余談ですけど「リスト一覧」って日本語おかしいですね…。
JavaScriptの変数の巻き上げ

## 以下のコードはどの様に出力されるか

```js
  var variable = 'Global';
  function global_or_local() {
    console.log(variable);
    var variable = "Local";
    console.log(variable);
  }
  global_or_local();
```

## 出力結果

```js
undefind
Local
```

## なぜこうなるのか？

以下のコードと同じ動きになる。

```js
  var variable = 'Global';
  function global_or_local() {
    var variable;
    console.log(variable);
    var variable = "Local";
    console.log(variable);
  }
  global_or_local();
```

前のコードの5行目の
var variable = "Local";
の  **宣言の部分** であるvar variable
だけが巻き上げられ、後のコードの様に
関数global_or_localの冒頭にあるのと同じ扱いになる。

ただし、宣言の部分だけで **代入はされていない** ので
出力してもundefindとなる。
代入後はLocalが出力される。


以下の場合はGlobalが出力される

```js
  var variable = 'Global';
  function global_or_local() {
    console.log(variable);
  }
  global_or_local();
```

## 参考
[知らないと怖い「変数の巻き上げ」とは？]
(http://analogic.jp/hoisting/)
簡単にMacから全てのディスクを取り外す

# やりたいこと
MBPの持ち出しのときに、ディスクのアンマウントをディスク数分行う必要があり、煩雑に感じていました。(全部をマウスで選択してcommand + eを押せばよいのですが煩わしいです)
macOSにて全ての外付けディスクのアンマウントを一回の操作で取り外したい。
その方法をメモします。

## AppleScriptをAutomatorでサービス化し、ショートカットを割り当てる

利点はショートカット操作できることです。

スクリプトに直接ショートカットを割り当てたいが方法がない(と思われる)ので、Automatorでサービス化し、ショートカットを設定可能にする。

Automatorで「新規書類」→「サービス」(「ワークフロー」を選んでしまうと`/Library/Services/`に保存されないので注意)→「AppleScriptを実行」として、全ての取り出し可能なディスクを取り出すスクリプトを次のように書く。

```AppleScript
on run {input, parameters}
	tell the application "Finder" to eject (every disk whose ejectable is true)
end run
```

次の選択項目を受け取る:「なし」を選択し、検索対象:「Finder」として保存する。

メニューの「Automator」→「サービス」→「サービス環境設定」と開き、「一般」の項目に増えた今作ったサービスを選択して、ショートカットを割り当てます。
jQueryのremoveAttrメソッド

##removeAttrメソッドとは？

HTML要素の **属性** を削除するメソッド


##属性とは何ぞや

以下のコードの例だと、href,classが属性にあたる

```html
<a href="#" class="hoge">リンクだよ</a>
```

##実際に削除してみよう

```html
<a href="#" class="hoge">リンクだよ</a>
```

```javascript
var linkAfter = $('a').removeAttr('class');
```

### 結果
classが無くなっている

```html
<a href="#">
```

## 参考
[要素の属性を操作するには？（attr／removeAttr]
(https://www.buildinsider.net/web/jqueryref/007)
[30分で理解！jQueryのattr()で属性操作を極めるコツ！]
(https://www.sejuku.net/blog/37402)
jQueryのattrメソッド


## attrメソッドとは何か？

HTML要素の **属性** を取得,変更,新規追加できるメソッド

## 属性とは何ぞや？

以下のコードの例だと、href,classが属性にあたる

```html
<a href="#" class="hoge">リンクだよ</a>
```

## 取得してみよう
```javascript
var className = $('a').attr('class');
console.log(className);
```
### 取得結果
class="hoge"となっているので、以下の様になる。

```html
hoge
```

## 変更してみよう

```javascript
var newClassName = $('a').attr('class', 'uha');
```


### 結果

*hoge* だったclassが*uha*になる

```html
<a href="#" class="uha">リンクだよ</a>
```

## 追加してみよう

変更する時と書き方は同じ

```html
<a href="#" class="hoge">リンクだよ</a>
```

```javascript
$('a').attr('id', 'ihi');
```

###結果
idが追加されている。

```html
<a href="#" class="hoge" id="ihi">リンクだよ</a>
```

## 参考
[30分で理解！jQueryのattr()で属性操作を極めるコツ！]
(https://www.sejuku.net/blog/37402)
かっこいいVBAマクロの組み方

ちょっとベテランと思われるような、VBAマクロの組み方を考えてみる。
（所詮EXCEL-VBAの素人プログラマを脱出できていないけど）

#書き方の入り口

##マクロの作り方（現状）
　以降はあくまで我流のやり方であるが、マクロ作成のパターンとしては、
目的としているデータシートがあるので、邪魔にならないように、適当にボタンを配置する。
　ボタンをダブルクリックすると、シートに関連したプロージャが開くので、そのままでは汎用性がないので、とりあえずCALL main()関数を書いておく。
　次に、標準プロージャに適当なモジュール（module1）を追加。そこにmainで始まるコードの中身をゴリゴリ書く（mainというのは、ちょっとC言語を意識しているっぽい）
→　ここまでは、ほとんど手癖みたいになっている。ちょっと素人っぽいので見直すことにする。


##改善
・マクロの動作のきっかけとしては、シートに加えたボタンでやるのは避けたい
・あくまでEXCELのカスタムメニューの一環で動かしたい
・ブックが起動したら、アドインが読み込まれるようにする
・アドイン起動時に、自動的に最新バージョンに更新されるようにする
Command::spawnのデザイン(unix)

## まえがき

- std::processはポータブルな実装だがにここではunix着目する

---

## プロセス起動

- 新しいプロセスを立ち上げてプログラムを実行する
- サブプロセスと言ったりもする

---

## プロセス

- プログラムを実行している主体
- いろいろ状態をもってる
    - メモリ空間
    - ファイルディスクリプタ
    - 環境変数

---

## prcess::Command

- プロセス起動を行うためのAPI
    - 実装はポータブル(Posix/Windows)
    - UNIXでいうfork-execを行う
- シェルを経由する専用APIは用意しない
    - newやargの引数に `sh -c` を渡せばできる

---

## イメージ

- 以下の例ではシェルを経由して実行
    - `output` で出力を受け取るまで暗黙にwait

```rust
let output = Command::new("sh")
                     .arg("-c")
                     .arg("echo hello")
                     .output()
                     .expect("failed to execute process");
```

---

## デザイン

- `Command::new` 時点ではプロセスを生成しない
    - `spawn` などを呼ぶまでの間にやりたいことを設定
      - 引数の追加(`arg/args`)
      - リダイレクト(`stdin/stdout/stderr`)
      - 環境変数の追加/クリア(`env_clear`)
      - カレントディレクトリ(`current_dir`)

---

## デザイン

- waitするかどうかはAPIによって変わる
    - spawnはwaitしないので親が明示的に行う
    - outputやstatusは当然行う

---

## spawn

- ジェネリックなプロセス起動API
- `std::process::Child` を返す
    - 子プロセスのPIDをもつ
    - waitをメソッドにもつ

---

## spawnの内部実装

- 条件が合えば `posix_spawn` を使う
- そうでない場合 `fork` と `exec` を使う

---

## posix_spawn

- fork-execまで一気にやってくれるAPI
- 現時点でいくつかのプラットフォームで使える(ただしそれぞれいくつか制約条件はある)
    - Linux/Glibc2.24+, MacOS , FreeBSD

---

## posix_spawnを使う意図

- メモリを複製しない実装が使われることが多い
    - Linuxなら ~~`clone(CLONE_VM/E_VFORK)`~~ [注:コメント欄で指摘いただきました](https://qiita.com/kubo39/items/45b702e4bf6e82c4aae1#comment-ae8afe2f6cdf506ac4b2)
    - Linux: clone(CLONE_VM|CLONE_VFORK)
    - MacOS/FreeBSDなら `vfork`
- fork-exec間に差し込めない処理もある
    - `current_dir` など使ったらforkを使う

---

## before_exec

- UNIXなシステムのみ存在
    - Windowsではそもそも不可能
- fork-exec間で行いたい処理をフック可能
    - 他ではPythonの `preexec_fn` などがある
- リダイレクトや環境変数以外にもやりたいことはある
    - リソース管理 (例: core dump)
    - fdのclose処理を書きたいかも

---

## before_execは問題ないのか

- 任意の処理が記述できてしまう
    - fork-exec間はasync-signal-safeな関数のみ使うべき
    - 危険性はドキュメントで注意喚起している
        - Pythonも同様

---

## FDの挙動

- 他の言語のように3番以降のFDをcloseするAPIを提供していない
    - Rustのstd自体はCLOEXEC前提
        - execのときにcloseするフラグ
    - Cのライブラリ関数は保証がない
        - リークしちゃうかも

---

## 過去の議論

- https://github.com/rust-lang/rust/pull/27609
    - 標準ライブラリの範囲では不要という判断
    - どうしても必要なら `before_exec` でできる
    - 将来的には変わるかも

---

## spawnのまとめ

- プロセス起動のプリミティブなAPI
- fork+属性設定+exec
    - posix_spawnを使えるときは使う
- `before_exec` で振る舞いを自由に記述できる
    - 注意は必要
レスポンシブデザインについて１ box-sizing: border-box;

**box-sizing: border-box;**はpaddingなどを追加した際、要素の幅が崩れてしまうときなどに使うプロパティ。
これを指定すると要素の幅にpaddingとborderが含まれるようになる(marginは含まれない)。
box-sizing: border-box;を指定する際は、CSSの全ての要素に指定することが推奨されている。
すべてのようにに対して指定する際は**　* {}　**　と指定してあげれば良い。
remot3.itでインバウンド全閉じ状態のマシンにインターネット経由でアクセスしてみた

[remot3.it](https://www.remot3.it/web/index.html)（リモートイット）というソリューションを使うと、とても便利にリモート接続が可能になる、とのことなので、試してみました。

# remot3.itとは
エージェントベースで動作する、リモートデバイス監視用のソリューションです。通常の通信方式とは異なる方法でリモートデバイスに疎通させるため、簡単に言えばデバイスのインバウンドポートを全て閉じていてもそのデバイスにリモートからアクセスが可能になります。

# Sign UP
ラズパイ（Model B）が手元にあるので、ラズパイで接続を試してみます。（ラズパイ用エージェントはフリーで配布されている）ちなみにサインアップ確認メールが来なかったら迷惑メール確認は忘れずに（久々にこんなことでハマってしまった）

無事サインアップが終わったら、こんなデバイス一覧画面が表示されます。当然まだデバイスを一台も登録していないので、中身はありませんが。

![スクリーンショット 2018-08-11 23.28.55_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/eee1d6c8-7391-21d1-e592-41c088de781f.png)

# ラズパイのセットアップ

ラズパイのセットアップを進めて、リモートデバイスとして管理できる様にします。[こちら](https://remot3it.zendesk.com/hc/en-us/articles/115006015367-Installing-the-remot3-it-weavedconnectd-daemon-on-your-Raspberry-Pi)のページを参考にします。

特に問題がなく、デバイスの登録が完了しました。デバイス一覧画面に登録した端末が表示されました。

![スクリーンショット 2018-08-11 23.50.12_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/6242a493-d93a-3a86-db49-a401bdf91055.png)

今回、WEBとSSH、VNCポートのアクセスをできるようにインストールしてみました。

![スクリーンショット 2018-08-12 15.03.30.png](https://qiita-image-store.s3.amazonaws.com/0/102769/7c256e56-015b-0d48-2d78-a670cb7bf58c.png)

これだけでセットアップは完了です。

# SSHで外のネットワークからアクセスしてみる
※ルータやマシンに外部からのアクセスをOKするような設定はしていません。

```ssh-pi-01``` を選択すると、アクセスするためのコマンドが発行されます。

これを打ち込むだけです。

![スクリーンショット 2018-08-12 15.03.47_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/6a8792b4-8767-4620-bc48-64cf5aaf12eb.png)

パスワード入力は求められますが、無事ログインできました。（以下はログイン後のコマンド発行結果。ラズパイにアクセスできたのがわかります。）

```sh
pi@raspberrypi:~ $ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```

すでに自宅のネットワーク内に入っているので、ここから他の端末にももちろんアクセスが可能になります。（ラズパイを通して他の端末にリモデしたりもできるようになります。）

# まとめ
かなり簡単に設定が完了して外からのアクセスが可能になりました。インバウンドのアクセスを全てOFFにしていても外からのアクセスを可能にしてしまうので、使い所はかなり慎重になる必要がありますが、安全に簡単に接続をすることが可能になり、便利なツールです。
Mac OS X High Sierra のキー入力速度を速くする

今まで自分のMacのキー入力が割ともっさりしてるなと思っていたのですが、Macのキー入力の設定変更でかなり快適になって感動したので、メモしておきます。

## 環境

* Mac OS X 10.13.6 High Sierra

## 設定方法

大きく分けて2種類あります。手軽さは 1.の方法、システム上限を超えてキー入力を速くしたい場合は2. の方法を使う形になります。

1. システム環境設定から設定する
2. ```defaults``` コマンドから設定する

## システム環境設定から設定する

手軽に設定したい場合はこちらから。

[System Preferences] - [Keyboard] より、Key Repeat(キーのリピート)、Delay Until Repeat(リピート入力認識までの時間)をどちらも一番右の最速にします。設定は即時反映されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/118fbe97-ba32-15b5-c8c8-2cf797ba6789.png)


## defaults コマンドでシステム環境設定より速く

システム環境設定の上限よりも速くしたい場合は、```defauts``` コマンドを使います。
**※システム上限値を超えた設定を行うので、設定値の吟味・実際の設定は自己責任でお願いします。**

<a href="https://ss64.com/osx/defaults.html" target="_blank" rel="nofollow noopener">defaults</a> とは MacOSX の 各種ユーザー設定をストレージ管理する、User Defaults System を操作するコマンドです。こちらを使ってキー入力の設定を変更できます。

設定には以下のコマンドを実行します。なお、**設定の反映はログアウトが必要です。**

```
$ defaults write -g InitialKeyRepeat -int 10
$ defaults write -g KeyRepeat -int 1
```

※ 設定値は以下の Github Issue で盛んに議論されていた内容を設定しました。 
<a href="https://github.com/mathiasbynens/dotfiles/issues/687" target="_blank" rel="nofollow noopener">Key repeat broken in macOS Sierra · Issue #687 · mathiasbynens/dotfiles · GitHub</a>

```write``` で書き込み、```-g``` オプションが ```NSGlobalDomain``` というすべてのアプリケーションから参照される共通設定を表します。

設定項目はそれぞれ以下の通りです。

* InitialKeyRepeat: リピート入力認識までの時間
* KeyRepeat: キーのリピート

```-int``` は値の型を表します。1 あたり 15 ms のようです。つまり、

* InitialKeyRepeat: 10 * 15 ms = 150 ms
* KeyRepeat: 1 * 15 ms = 15ms

となります。

ちなみにシステム環境設定からの設定だと下記の通りです。

* InitialKeyRepeat: 15 * 15 ms = 225 ms
* KeyRepeat: 2 * 15 ms = 30ms

設定内容は ```defaults read``` コマンドで確認できます。

```
$ defaults read -g InitialKeyRepeat
$ defaults read -g KeyRepeat
```

## キー入力速度の比較

今回の設定変更で、どんなふうに速度が上がったかをまとめてみました。システム環境設定の最速にするだけでもかなり速度が改善されますが、```defaults``` コマンドで変更すると更に速くなります…！

### 設定変更前

![before.gif](https://qiita-image-store.s3.amazonaws.com/0/222030/921315b9-7877-861e-862d-1498d4f56758.gif)

### システム環境設定の最速

![system.gif](https://qiita-image-store.s3.amazonaws.com/0/222030/807f668e-e3f5-3039-f982-b139ef5a006e.gif)

### ```defaults``` コマンドで設定

![fastest.gif](https://qiita-image-store.s3.amazonaws.com/0/222030/2f0e6ec2-266e-b3ac-916e-99fc677af82e.gif)

## 終わりに

Mac 使いの方々には常識だったのかも知れませんが、僕はこれを知ってかなり快適になりました。もっと早く知っていればよかった…

## 参考

* <a href="https://ottan.xyz/system-preferences-terminal-defaults-2-4643/" target="_blank" rel="nofollow noopener">システム環境設定をターミナル（defaultsコマンド）から設定する方法（一般） – OTTAN.XYZ</a>
* <a href="https://dev.classmethod.jp/tool/mac-keyboard-speed-2/" target="_blank" rel="nofollow noopener">[Mac] キーボードの反応速度を速くする方法 2 ｜ Developers.IO</a>
* <a href="https://apple.stackexchange.com/questions/10467/how-to-increase-keyboard-key-repeat-rate-on-os-x" target="_blank" rel="nofollow noopener">How to increase keyboard key repeat rate on OS X? - Ask Different</a>
持っているソフトウェアテスト本を書き出してみる

テストに関わるようになり、片っ端からテストの本を買っていたのでリスト化してみました。
何か興味のある本があればぜひ読んでみてください！

# 雑誌

[ソフトウェアテストPRESS　総集編](http://amzn.asia/g140PUr "ソフトウェアテストPRESS　総集編")が欲しかったのですが、CD付きが手に入りません。。なので興味があるものだけ購入しましたが、やっぱり全部読みたい。。

-  [ソフトウェアテストPRESS　Vol2](http://amzn.asia/4BIGM37 "ソフトウェアテストPRESS　Vol2")  
 インスペクション、テスト管理、組み合わせテストの特集です。
-  [ソフトウェアテストPRESS　Vol3](http://amzn.asia/g6AoHMa "ソフトウェアテストPRESS　Vol3")   
テスト自動化、セキュリティテストの特集です。
- [ソフトウェアテストPRESS　Vol5](http://amzn.asia/fmQYOGG "ソフトウェアテストPRESS　Vol５")  
テスト計画、テストチームの作り方の特集です。
- [ソフトウェアテストPRESS　Vol６](http://amzn.asia/0ZaD1Ma "ソフトウェアテストPRESS　Vol６")  
テスト計画、テストチームの作り方の特集です。



# JSTQB
ソフトウェアテストの資格としておなじみのJSTQBです。Foundation　Level取得時に購入していました。実務を始める前、学生時代に取得してしまったのでもう一度読み直したら新たな発見がありそう。

- [ソフトウェアテスト教科書 JSTQB Foundation 第3版](http://amzn.asia/ewTeI7V "ソフトウェアテスト教科書 JSTQB Foundation 第3版 ")

# テスト自動化・自動テスト
流行っているテスト自動化についても色々書籍があるみたいですね。

- [初めての自動テスト ―Webシステムのための自動テスト基礎](http://amzn.asia/aFsWQIy "初めての自動テスト ―Webシステムのための自動テスト基礎 ")  
テストに携わる人なら一度は目を通しておきたい名著だと思います！挿絵が多く読みやすかったです。
- [JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus) ](http://amzn.asia/5xSlEFry "初めての自動テスト ―JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)")  
Javaのテストフレームワークとして有名なJUnit。前職でJavaで開発をしていましたが、今はC#なので本棚に眠ってます。
- [実践 Selenium WebDriver](http://amzn.asia/44WNzKb "実践 Selenium WebDriver")  
UI自動化ツールとしてSeleniumは有名ですよね。これも現職では少し導入してメンテナンスができてないと聞いているのでできそうであれば触りたい。
- [Seleniumデザインパターン & ベストプラクティス](http://amzn.asia/7UgGPj3 "Seleniumデザインパターン & ベストプラクティス")   
これもSelenium本。
- [システムテスト自動化 標準ガイド (CodeZine BOOKS)](http://amzn.asia/71E62XW "システムテスト自動化 標準ガイド (CodeZine BOOKS)")   
これも名著。分厚いので読むのに苦労しそうだが、システムテストに悩んでいるので読み直してみよう。

# テスト技法
手動テストにも自動テストにも使える考え方があります。

- [ソフトウェアテスト技法ドリル―テスト設計の考え方と実際](http://amzn.asia/bTEtjLS "ソフトウェアテスト技法ドリル―テスト設計の考え方と実際")  
テスト技法がここまでまとまっている書籍は他にないです。組み込み系の例が多いです。（著者が組み込み系に携わっているからだと思います。）
- [ソフトウェアテストHAYST法入門 品質と生産性がアップする直交表の使い方](http://amzn.asia/jinYLd4 "ソフトウェアテストHAYST法入門 品質と生産性がアップする直交表の使い方")  
実はまだ読めていないです。余裕ができたら紹介します。

# テスト全般
分類が難しかったものをこちらにまとめました。

- [知識ゼロから学ぶソフトウェアテスト 【改訂版】](http://amzn.asia/bwk3nYB "知識ゼロから学ぶソフトウェアテスト 【改訂版】")  
本当に知識ゼロから読んでもなんとかなるほどわかりやすい！笑
- [【この1冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践](http://amzn.asia/cmdh6Jc "【この1冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践")  
[知識ゼロから学ぶソフトウェアテスト 【改訂版】](http://amzn.asia/bwk3nYB "知識ゼロから学ぶソフトウェアテスト 【改訂版】") と同様に初めての人に読んでほしい。
- [ソフトウェアテスト293の鉄則](http://amzn.asia/f5w8yzI "ソフトウェアテスト293の鉄則")  
テストに困った時にパラパラと見るのが良いらしい。今読むしかない。
- [マインドマップから始めるソフトウェアテスト](http://amzn.asia/hkQ8rLM "マインドマップから始めるソフトウェアテスト")  
マインドマップを使ってテストを考えていこう！という本。マインドマップ自体を学ぶのにも良さそう。
- [ステップアップのためのソフトウエアテスト実践ガイド 改訂版](http://amzn.asia/93trKFR "ステップアップのためのソフトウエアテスト実践ガイド 改訂版")  
まだ読んでいないですが、国際標準、業界標準に対応しているとのことで読んだら紹介します。
- [現場の仕事がバリバリ進む ソフトウェアテスト手法](http://amzn.asia/f8PKTPH "現場の仕事がバリバリ進む ソフトウェアテスト手法")  
これは初心者よりもテストマネージャーが読むのが良さそう。
- [テストから見えてくる グーグルのソフトウェア開発](http://amzn.asia/2W96dH9 "テストから見えてくる グーグルのソフトウェア開発")  
Googleのテストの考え方がわかる？
- [ZERO BUGS シリコンバレープログラマの教え](http://amzn.asia/2W96dH9 "ZERO BUGS シリコンバレープログラマの教え")  
本棚に眠っていた一冊。読んだら紹介します！

# まとめ
思ったよりいろんな本を買っていたことに驚きです。
買っただけで満足せず、実践して自分の身にしていきます！
TDDとかも学んでいきたい。。。
Glueの使い方的な⑳(クローラーオプション_Grouping behavior for S3 data)

## クローラーオプション Grouping behavior for S3 data

クローラー作成画面にこんなオプションが追加されました。

![スクリーンショット 0030-08-12 14.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/27932/6aa695e0-5368-5de5-06dc-6d28637bd557.png)

これはクローラー実行時のオプションで以下のような効果がります。

### オプションなし(デフォルト)

クローラが S3 に格納されたデータのテーブルを定義するとき、データの互換性とスキーマの類似性の両方を考慮します。
データの互換性の考慮事項には、データが同じ形式（JSONなど）、同じ圧縮形式（GZIPなど）、S3 パスの構造、およびその他のデータ属性であるかどうかが含まれます。
スキーマの類似度は、別々の S3 オブジェクトのスキーマがどれほど似ているかを示す指標です。

### オプションあり

可能であれば、CombineCompatibleSchemasを共通テーブル定義に設定することができます。このオプションを使用すると、クローラは引き続きデータの互換性を考慮しますが、指定されたインクルードパスで S3 オブジェクトを評価する際の特定のスキーマの類似性は無視されます。

# 今回使うGlueのリソース名
#### クローラー名
se2_in9

#### データ
入力:in9

# 全体の流れ

* 前準備
* オプションなしでクローリング
* オプションありでクローリング
* まとめ


# 前準備

### 今回使うサンプルログファイル

2つのcsvファイルを使う

```csv:①csvファイル
deviceid,uuid,appid
iphone,11111,001
android,11112,001
iphone,11113,009
iphone,11114,007

```

```csv:②csvファイル(①と異なるスキーマ)
aaid,bbid,ccid
ueue,11115,002
piopio,11116,002
hoge,11113,004
hoge,11112,007
```

#### ディレクトリ構成

スキーマのことなるデータ①②を以下のように配置

```
$ aws s3 ls s3://test-glue00/se2/in9/
                           PRE year=2017/
                           PRE year=2018/
2018-08-12 13:13:01          0 
$ aws s3 ls s3://test-glue00/se2/in9/year=2017/
2018-08-12 13:52:15          0 
2018-08-12 13:57:22         89 cvlog1.csv
$ aws s3 ls s3://test-glue00/se2/in9/year=2018/
2018-08-12 13:52:24          0 
2018-08-12 13:57:36        136 cvlog2.csv
```

## オプションなしでクローリング(デフォルト)

それぞれ別々のスキーマを作りたいならデフォルト

2つのデータのスキーマの類似度が低いため、"se2_year_2017"と"se2_year_2018"の2つのテーブルが作成されている

![スクリーンショット 0030-08-12 14.27.18.png](https://qiita-image-store.s3.amazonaws.com/0/27932/9f2b2e43-3f7a-4bb5-82ea-2bcc256ab5fb.png)

①のデータの"se2_year_2017"テーブル

![スクリーンショット 0030-08-12 14.29.11.png](https://qiita-image-store.s3.amazonaws.com/0/27932/615dbcfa-b97d-b806-092f-fa03b24d47f7.png)

②のデータの"se2_year_2018"テーブル

![スクリーンショット 0030-08-12 14.29.23.png](https://qiita-image-store.s3.amazonaws.com/0/27932/f60eb3ec-6610-0120-e860-5e82e1914cd2.png)

## オプションありでクローリング

オプション有効にする

![スクリーンショット 0030-08-12 14.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/27932/02a1b7c7-40ec-d9ce-6548-d9c65ac362f2.png)

クローリングを実行

スキーマの類似性を無視してスキーマが1つとしてテーブルが作成される

![スクリーンショット 0030-08-12 14.19.20.png](https://qiita-image-store.s3.amazonaws.com/0/27932/d1c9107d-2631-777b-a4c7-d066aefcaa3c.png)



* ディレクトリの途中にデータが存在してたりするとパーティションが認識されず複数のテーブルができてしまいます(これは今まで通り)。
例えば、se2/in9/xxx.csvが追加で存在すると、"se2_cvlog2_csv"、"se2_year_2017"、"se2_year_2018"の３つのテーブルが出来上がります

* 形式の異なるデータが1つでもあると複数のテーブルができてしまいます。
例えば、se2/in9/year=2019/test.json が追加で含まれていると、"se2_year_2017"、"se2_year_2018"、"se2_year_2019"の３つのテーブルが出来上がります。

## まとめ

JSONなどのデータの形式やGZIPなどの圧縮形式が同じであれば、あるS3パス配下のデータは多少異なるカラムがあってもスキーマを結合してしまいたい場合にいいのかも。

## こちらも是非

AWS Glue コンソールでのクローラの設定
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/crawler-configuration.html

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f
Progateのスライドのみを見る方法

プログラミング学習サイトProgateで学習しながら、何かつくったりしてるとき、「Progateのスライドのあのあたりに載っていたなぁ」と思うことありませんか。そんな時にスライドだけをササッと見る方法です。Progateのスライドは内容の概要がよくまとまっているので、スライドだけを何度か見てみるのもおすすめです。

#スライドのみを見る方法
1.Progateの上のメニュー部分から「スライド検索」をクリック
2.表示されたページの左に言語の一覧とチェックボックスがでるので、見たいLessonの番号をクリック。
3.スライドのサムネイルが右側に表示されるので、好きなスライドを見る。
react-nativeでreact-native-config`を使用するための設定

READMEにも記載されてある単純なことだが忘れがちなので備忘録。

## 目的
`react-native init`にて新たに作成したプロジェクトにて`react-native-config`を使用できるようにする。

## `react-native-config`とは
`react-native-config`はReact-native用の`dotenv`である。
このライブラリを使用することで`.env`ファイルに記載されている変数をプロジェクト内で環境変数として扱うことができる。

## セットアップ

### `react-native-config`のインストール
```
yarn add react-native-config
```
### `react-native-config`を`react-native`のプロジェクトに適用する
```
react-native link react-native-config
```
### Androidの場合

`android/app/build.gradle`に下記変更を加える。

```
// 二行目に新たにapplyを追加する。
apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
```

---

これで`react-native`のプロジェクトで`.env`から変数を取ってくることができる。
レスポンシブデザインについて１ メディアクエリ

**レスポンシブデザインとは**ユーザーのデバイスに関係なく、画面幅に応じてデザインを変えることができる。

書き方の一つとして**メディアクエリ**というものがある。
@media (max-width or min-width: px ) {
   CSSコード
}

追記
メディアクエリを反映させるためには、headタグにviewpointを指定する必要がある。
swift4 storyboardが見つからない ~'Could not find a storyboard named ~'~

# xcodeで開発をしていて表題のエラーにぶち当たった時の対処法
'Could not find a storyboard named 'Main' in bundle NSBundle’
↑こんなやつね。

自分の場合は開発中のプロジェクトフォルダ内にエラー内で"参照したい'Main'って名前のstoryboardがないやんけ！"ひたすら言われ続けたが確認したところ普通に'Main.storyboard'の存在を確認できた。

実はこのエラーの前に、他のエラー処理をしていて'Main.storyboard'を量産してしまい、
調子に乗って消しまくってしまったことから、xcodeさんが"これは俺の知っている'Main.storyboard'ちゃう！"って不満をぶちまけていたのである。(多分

# 対処としては以下の手順

①info.plistのMain story board file based nameを確認。

②1が問題なければ、xcode内のツリー上からMain.storyboardを右クリックして削除。

③プロジェクトを右クリックして、Add Files to [Your Project]を選択。
<img width="303" alt="スクリーンショット 2018-08-12 14.35.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/254495/cb909d7b-987a-2eba-8b4d-5ba9bf9761f0.png">
④Main.storyboardを追加する。

⑤プロジェクトをクリーンして再ビルド。

# 今回のケースから得た教訓
他にもケースに応じて対処法は変わってくるけども、エラーログを観まくることが大切だと悟す。勝手にエラーログから「こいつが原因か！！」って食ってかかることが自分自身も含め初学者にありがちだと思うので、とりあえず、「エラーログを観まくる」「Google先生に聞く」これに限る。
Github — コンソールからGithubレポジトリをWebブラウザで開く

`git remote` コマンドの1行目から https のURLを抜き出して `open` コマンドで開く例。


## Macの場合

```
$ open $(git remote --verbose | head -n 1 | awk '{ print $2 }')
```

### git config への登録例

```
[alias]
  open=!open $(git remote --verbose | head -n 1 | awk '{ print $2 }')
```

( @yuta0801 さんアイディア ) 

## Windowsの場合

Windowsでは `open` を `start` に変えると動くようです。( @yuta0801 さん情報 ) 


## 前提

- https protocol を利用していること
  - `git remove --verbose` の1行目でURLが取れること

```
origin	https://github.com/YumaInaura/gist (fetch)
origin	https://github.com/YumaInaura/gist (push)
```

## もっと単純な例

先述の例のように動的に値をとらず、固定でURLを書いておいても良い。

URLだけを記録したファイルを作成しておく。

```
echo 'https://github.com/YumaInaura/gist' >> .github.url
```

```
open $(cat .github.url)
```

このファイルを git commit しておけば、いつでも手早く開けていいかんじ。

## 関連

- [Mac OS —Open in web browser Github remote repository from console](https://gist.github.com/YumaInaura/a302e564eb4ceb2cfdfcd0bc077ecb5c)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UbuntuでGO言語はじめました

UbuntuでGO言語開発環境を整えました

リファレンス
https://golang.org


VS Codで開発するために下記のExtensionをインストルール
https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go


最新バージョンのgolangをインストール
apt-get golang-1.10

シンボリックリンクを書き換え
ln -s /usr/lib/go-1.10/bin/go /usr/bin/go
ln -s /usr/lib/go-1.10/bin/gofmt /usr/bin/gofmt

golang入っているのでシンボリックリンクを貼るときに、上書きするために-f使った

デバッガの導入

[delve](https://github.com/derekparker/delve)

go get -u github.com/derekparker/delve/cmd/dlv


チュートリアル
https://tour.golang.org/welcome/1


Hello Worldを VS Codeのデバッガで表示！

ここからが本番ですね
docker上のWASとFLASKのアプリケーションを連動させる

# 始めに
Dokcer上で稼働しているWASとFlaskを連動させてみました
FlaskからWASに向けてHTTPリクエストを投げてJSONのデータを取得してみました

# 前提
## 開発環境
 - Windows10 pro
 - Docker for windows
 - WAS Liberty 
 - Python + Flask

## DOckerの構成
WASとFlaskのdocker-compose.ymlは別にしています

# 異なるdocker-compose.yml同士のContainerを通信させる設定について
異なるdocker-compose.yml同士のContainerを通信させる必要があるので、自前のnetwork構成を定義します
具体的には

 - docker network createコマンドで新規ネットワークを作成する
 - 新設したネットワーク構成を反映させるため、docker-compose.ymlを修正する
 
## 新規ネットワークを作成
dockerで新規ネットワークを作成する方法は[Docker-docs-da](http://docs.docker.jp/engine/reference/commandline/network_create.html)を読んでみてください

## docker-compose.ymlの修正
新規設定したdockerのネットワーク設定を追加します
GitHub上のソースの差分を参考にしてみてください

 - [WASのdocker-compose.ymlの差分](https://github.com/triple4649/wassample/blame/master/docker-compose.yml)
 - [Pythonのdocker-compose.ymlの差分](https://github.com/triple4649/pythonweb/blame/8880e9d93a947b04695330e8eb70f235e6c59290/docker-compose.yml)
 
# アプリケーションの修正
#WASのアプリケーションの修正
[Java:WASをDockerで起動させ、自前のアプリケーションをデプロイする](https://qiita.com/triple4649/items/d8c615454e7367846f87)をJSON形式でレスポンス情報を返すように修正しました。
詳細はGitHub上のソースを見てください

 - https://github.com/triple4649/wassample/blame/master/src/main/java/jpn/JapaneseAnalyser.java
 - https://github.com/triple4649/wassample/blame/master/src/main/java/router/SampleRooter.java

#Flaskのアプリケーションの修正
主な修正ポイントは以下の通りです

 - WASのWebアプリケーションに対してGetリクエストを投げ、データを受信する処理を追加した    
 (詳細はGitHub上のソースを見てください : https://github.com/triple4649/pythonweb/blame/master/app.py)

なお、ここでのソースの修正ポイントはWASに投げるURLを「コンテナ名＋Docker上で起動しているポート名」で指定する点です。
Docker上に新規作成したネットワークはDNSの代わりとなり、コンテナのIPアドレスとコンテナ名を紐づけてくれるため、URLを生成するときIPアドレスの代わりにコンテナ名でアクセスできるというわけですね
Github豆知識 — PullRequest と Issue には共通の連番が割り振られる

重複することはない。

実際にURLなどを見てみると、PullRequest と Issue であわせて連番になっているのが分かる。


- https://github.com/YumaInaura/script2md/pull/10 (PullRequest)
- https://github.com/YumaInaura/script2md/pull/11 (PullRequest)
- https://github.com/YumaInaura/script2md/issues/12 (Issue)
- https://github.com/YumaInaura/script2md/issues/13 (Issue)

## 経緯

よく知るエンジニアが「PullRequestのIssue番号」という表現をしていたことから気付いた。

「PullRequestでもIssue番号という表現を使うのかどうか」という出典は探せていない。あとで余裕があれば調べる。

## 参考

- [Mastering Issues · GitHub Guides](https://guides.github.com/features/issues/)
- [Autolinked references and URLs - User Documentation](https://help.github.com/articles/autolinked-references-and-urls/#issues-and-pull-requests)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
任意のドメイン名でEC2にsshログインする

生成したEC2インスタンスに任意のドメイン名でsshログインする手順をまとめた。

# ダイナミックDNSの設定
sshで任意のホスト名でアクセスするには、外部DNSの設定が必要。
まず、任意のドメインを取得して、IPアドレスとホスト名の紐付けを行う。
はじめにmyDNSでドメインを取得して、cronで回してsshアクセスする方法を試したが、myDNSのコンソール上で、AWSのインスタンスのIPの登録ができていることまで確認ができたが、結果sshログインができなかった。一旦、myDNSからの外部DNSの設定は諦め、AWSのヘルプに記載があったno-ipで試し、sshログインができたのでその手順をまとめる。

### 1. no-ipでドメインの取得(無料でカード情報の登録は不要）
  https://www.noip.com/

### 2 EC2のインンスタンンス(Amazon Linux 2)に最新のepel-release パッケージをインストール
~~~
# まずインストール済みの yum リポジトリを確認
$ sudo yum repolist all
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum-config-manager --enable epel
~~~

参考）取得したリポジトリを有効にする。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/add-repositories.html

参考) AWSでのno-ipでの設定手順まとめ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/dynamic-dns.html

### 3 noip パッケージをインストール
~~~
$ sudo yum install -y noip
$ sudo noip2 -C
$ sudo systemctl enable noip.service
$ sudo systemctl start noip.service
~~~

### 4 ssh接続
~~~
# 独自ドメインでssh接続
$ ssh -i was-key.pem  ec2-user@<独自ドメイン名>
~~~
EC2のインスタンス生成

事前準備:EC2
https://qiita.com/hiroshik1985/items/f078a6a017d092a541cf

![snap-2.png](https://qiita-image-store.s3.amazonaws.com/0/234299/ea949ea6-d8c0-1c96-5e15-140e24561e45.png)

勉強のため、いろいろ入っているAmazon Linux AMI ではなく
Amazon Linux 2 LTS Candidate 2を選択。

![snap-3.png](https://qiita-image-store.s3.amazonaws.com/0/234299/f31fe70b-9b4d-4f7c-511b-294b1d4e230f.png)

2.インスタンスタイプの設定
3.インスタンスの設定
4.ストレージの追加
5.タグの追加
までは、ウィザードに従いデフォルトのまま設定。

6.セキュリティグループの設定
デフォルトではセキュリティグループの設定（ファイアウォールの設定）が
何もされていないので、ここでは設定が必要。

|        |        |        |
|:-----------------|------------------:|------------------|
| ssh             |              TCP |        マイIP  EC2にアクセスするIPアドレスを指定        |
| HTTP           |            TCP |       カスタム　0.0.0.0/0, ::/0       |
| HTTPS             |              TCP |        カスタム　0.0.0.0/0, ::/0        |

作成をクリックすると、「キーペアの設定」が表示されるので、
キーの作成が必要
キー作成で任意の名前を設定して、

![snap-5.png](https://qiita-image-store.s3.amazonaws.com/0/234299/0c15848b-575c-7e7c-e871-b66c0405b578.png)

![snap-6.png](https://qiita-image-store.s3.amazonaws.com/0/234299/d8595bd0-7d38-0f64-bfa1-5071cbd98195.png)

インスタンスにssh接続する際に必要なため、
秘密鍵は保存しておくこと。
「インスタンス作成」クリックでインスタンスが作成される。

インスタンスへの接続
接続元ホスト: Mac

ユーザ名: ec2-user
パブリックDNS名: Ec2 Management　consoleのパブリックDNS名を指定

![aws_ec2_instance.png](https://qiita-image-store.s3.amazonaws.com/0/234299/9da3f51c-cfca-af22-5632-cd6031eddd35.png)

ssh -i <was.key.pem> <ユーザ名>@<パブリックIP or パブリックDNS名>

```
chmod 400 was-key.pem
ssh -i was.key.pem ec2-user@<パブリックDNS名>
```
Glueの使い方的な⑲(ユーザー設定)

### "ユーザー設定"

クローラー、ジョブの画面の右上に"ユーザー設定"が追加されてた

![スクリーンショット 0030-08-12 11.50.35.png](https://qiita-image-store.s3.amazonaws.com/0/27932/9c97ac58-ab05-661c-4b0a-96621bec1661.png)

![スクリーンショット 0030-08-12 11.50.49.png](https://qiita-image-store.s3.amazonaws.com/0/27932/6233d3ba-2090-0609-7b4e-277fe85cf74d.png)


クリックするとこのような画面になり、デフォルトのクローラーのIAMロール、デフォルトのジョブのIAMロールやスクリプトパスなどを設定できます。

![スクリーンショット 0030-08-12 11.58.56.png](https://qiita-image-store.s3.amazonaws.com/0/27932/f6c63e50-9f42-b195-f317-5bc1142f0ea6.png)

![スクリーンショット 0030-08-12 11.58.27.png](https://qiita-image-store.s3.amazonaws.com/0/27932/ff4a2834-e36b-91e7-da72-f6771666ba7d.png)

### 試す

ジョブの作成をクリックすると、"ユーザー設定"で入れたIAMロール, スクリプトパス, 一時ディレクトリのパスがデフォルトで入っていることが確認できます。
個人的にとても便利だと感じてます

![スクリーンショット 0030-08-12 11.59.42.png](https://qiita-image-store.s3.amazonaws.com/0/27932/332fe460-c89c-423d-08e0-05ec93300365.png)

## こちらも是非

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f
fish shellでjupyter notebookを使う時にkernelが立ち上がらない

# fishは素晴らしいshellである
bashからfishに変えてから無駄な時間を大幅に減らせた。
導入方法は、[fish shell を使いたい人生だった](https://dev.classmethod.jp/etc/fish-shell-life/)に従えば良さそうです。

# fishでjupyter notebookでカーネルが開かない...!
jupyter notebookを立ち上げて、カーネルを起動させようとすると

```  
File "/usr/local/lib/python2.7/dist-packages/notebook/notebookapp.py", line 83, in <module>
    from IPython.paths import get_ipython_dir
ImportError: No module named paths
```
なぜだ！そもそもpython3を使いたいはずなのにpython2.7を見ているのかな？

`jupyter kernelspec list `
これを実行するとPathが通っていない?ことが判明
ipythonのドキュメントをみると
https://ipython.readthedocs.io/en/latest/install/kernel_install.html#kernels-for-python-2-and-3

```
python3 -m pip install ipykernel
python3 -m ipykernel install --user
``` 
上記を実行すると上手くkernelが開きました。
外国からサイトに接続してみる

#概要
AWSのアメリカリージョンにOpenVPNサーバを立てる
iPhoneのOpenVPNクライアントアプリでVPN接続して、外国からサイト　にアクセスする

#こんな感じで
OpenVPNクライアントアプリを起動して、接続開始→[VPN]マークが表示される→アメリカからインターネットを繋いでいる。となっているの図
![スクリーンショット 2018-08-12 11.03.07.png](https://qiita-image-store.s3.amazonaws.com/0/185989/106557fe-a2ae-6912-74d7-8b85292da0e7.png)


#作りかた
必要スキル：AWSでLinuxインスタンスを作成できるくらい
こちら👉[【無料】EC2にOpenVPNサーバを立てる【GUI設定】](https://qiita.com/akihiyo/items/5994d2eb55c54548628b)

初期セットアップウィザードのうち、下記は**yes**にしないといけない。

```terminal
Should client traffic be routed by default through the VPN?
> Press ENTER for default [no]:
Should client DNS traffic be routed by default through the VPN?
> Press ENTER for default [no]:
```
IntelliJでRustのファイルを保存したときにrustfmtをかける

# rustfmtを入れる
https://github.com/rust-lang-nursery/rustfmt#quick-start

```shell
# 最新のrustfmtはnightly版を要求する
rustup install nightly

rustup component add rustfmt-preview --toolchain nightly
```

nightly版を使う必然性はないけど、

> For the latest and greatest rustfmt

とか言われると使いたくなる。

# IntelliJの設定

`File Watchers` プラグインを入れ、↓の設定を追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7930/95e47a0c-8b35-3af8-6807-633e55ad3c81.png)
gitでpushができないときの対処法

ごめんなさい。絶対にmasterってブランチがあるみたいで、そこにpushしないとダメみたいです。
なので、僕のやり方じゃ根本的な解決はできないっぽいです。
結局分からないままでした。

以下何か参考になる知識があれば使ってください。

pushしようとしたらこういうエラーが出る。
やったことは
git push origin **master**って書いて送ったこと。

```
error: src refspec master does not match any.
error: failed to push some refs to 
```

とりあえずgit branchで、今あるブランチを見てみる。
```
$ git branch
  radio
* test
```
radioとtestのブランチはあるけど、「**master**」のブランチがないからこんなエラーが出たらしい。
だから、git branchして、アスタリスクマークのついてるやつの名前をoriginの後に書けばちゃんとpushされます。
(僕の場合なら、git push origin **test**でpushできる)

超初歩的だからそんなエラーの対象法は書いてませんでした。

みんながんばれ
AWS Lambda の CloudWatch Logs かんたんログ出力 (Python3.6)

AWS Lambdaで、自作のログを手間を掛けずに超簡単に出力したいならば、
難しいライブラリ等を使わなくても、`print` を使えば出来ます。

# ログ出力サンプルコード

```Python:Lambda
from datetime import datetime 

# ログ出力関数
def logging(errorLv, lambdaName, errorMsg):
    loggingDateStr=(datetime.now()).strftime('%Y/%m/%d %H:%M:%S')
    print(loggingDateStr + " " + lambdaName + " [" + errorLv + "] " + errorMsg)
    return

# lambda_handler
def lambda_handler(event, context):
    logging("info", context.function_name, "実行開始")
    logging("error", context.function_name, "エラーログテスト")
```

# ログ出力サンプル

ログはCloudWatch Logsに出力されます。

```text:sample
2018/08/11 23:02:26 loggingTest [info] 実行開始
2018/08/11 23:02:26 loggingTest [error] エラーログテスト
```

# サンプルコードのポイント
- Pythonの `print` でCloudWatch Logsにログを書き込めますので、利用します。
- `print` の引数の文字列でログのフォーマットを組み立てます。
- lambda_handlerの `context.function_name` で関数名を取れるので、実行元の情報をログ出力する場合に利用します。

# 最後に
これだけで、簡単にログを出力できます。
ログのフォーマットをお好みで変更してください。
フォーマットの変更は `print` の引数の文字列を変えるだけですから、楽勝です。
GuardianWallを調べてみた

GuardianWall

日本製で日本文化にあったメール誤送信対策の。Gateway型


・メールが自動的に暗号化される。送信ボタンを押した直後に気が付いたら、パスワードを送らなければよい。１通のメール漏えいでは添付ファイルがばれない
・ルールによりメールを送信を途中で保留にできる。
・個人情報がメールで漏れていないかチェックできる。
・ActiveDirectoryやldapと連携して、メール送信者ごとにルールを決める。（外注さんは社外送信できない、コンプライアンス部はどこでも送信できる、
一般社員はグループ会社のみ送信可能など。
・メールの保留機能。たとえば個人情報やクレジットカード番号らしきものが含まれる場合は、監査部門がチェックし問題なければ監査部門がメールをリリースする

などなど、これは便利。テスト版で検証中です。