OmniAICreator/Qiita-1.07M huggingface dataset:
ksnctf 3 Crawling Chaos 100pt

#問題

https://ksnctf.sweetduet.info/problem/3

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/194b7ec1-469a-2294-921a-6cb175d6861f.png)

#解いてみた

- URLにアクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/cacb8a8a-1dfa-305d-dfd3-6388b92179ea.png)

- 入力欄だけのシンプルな画面です。
- 適当に文字を入力してみましたが、NOと表示されるだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3fcabaa7-9360-7f60-4b46-c79407327e09.png)

- ソースを見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b1ddfced-5e4d-8140-a082-8cf13687919c.png)

- scriptタグのなかにめちゃんこ長い「うーにゃー」みたいな変な奴が書かれています。
- まさかこれがjavascriptじゃないですよね？？？
- コンソールにエラーが出てるはず。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e799845a-fb58-0897-5144-9b90e6573cfe.png)

- 出てない。
- ということはエラーなく処理されているということでしょう。。。
- ネットで調べてみると変換サイトがありました。
    - (」・ω・)」うー!(/・ω・)/にゃー!encode
    - http://sanya.sweetduet.info/unyaencode/
- そもそもjavascriptで変数とかに全角が使えることを知りませんでしたよ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/19a3eb7e-4886-5e3d-8f52-494f7ce795ae.png)

- 内容がよくわからないので、console.log()で囲って実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/50f79bc4-df14-487c-0929-5f82bdf7b2e1.png)

- エラー出ました。
- 中盤はよくわかりませんが、最後の方の読めるところを抽出します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a2d0831c-e815-c4ec-b35e-bea80de552a2.png)

- わかることは入力した文字列が配列pと同じ長さ。入力した文字列をユニコードに変換して(i番目+1)をかけた数値がpのi番目と一緒。
- 結構数があるので、一つずつやるのは大変です。
- pから逆にやってみましょう。
    - pのi番目の数値を(i+1)で割って文字に戻す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/aefa388a-8a64-8928-1dc8-82b8297a8cb6.png)

- こんな感じで。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/11293bab-3cf7-6b88-7685-c57df1a97986.png)


- 答え出ました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2de71b40-5374-1abf-8a1e-8fa5f74310ef.png)
pandasでタグの集計をする（列にリストを含む場合の集計処理）

例えばQiitaもそうですが、記事ごとに複数のタグが割り当てられていることが多々あります(この記事だとPython, pandas, データ分析など)。
これらタグは可変長の属性になりやすく、リストや","で区切って一つの文字列として列に収められていることが多いことでしょう。
この記事では、上記のような構造を持ったデータに対して、タグで集計処理をしたい場合の処理について楽が出来るようになる方法を共有したいと思います。

具体的には、以下のようなデータを"変換後"のような新しい構造にしたデータフレームを作成します。

```python
import pandas as pd
import numpy as np

df = pd.DataFrame({'name':['aaa', 'bbb', 'ccc'], 'tag':[['X', 'Z'], ['Y'], ['Y', 'Z']]})
```
***変換前(df)***

|| name | tag |
|---|-------|--------|
|0| aaa   | [X, Z] | 
|1| bbb   | [Y]    | 
|2| ccc   | [Y, Z] |

***変換後***

| | name | tag |
|---|---|---|
|0|aaa|X|
|1|aaa|Z|
|2|bbb|Y|
|3|ccc|Y|
|4|ccc|Z|

# 結論

次の関数をコピペして使ってみてください。

```python

def flatten_col(df, key, col):
    df = df.dropna(subset=[col])
    k = np.repeat(df[key],df[col].apply(len)).reset_index(drop=True)
    c = np.concatenate(df[col].values)
    return pd.DataFrame({key:k, col:c})
```
### 使用例

```python

dff = flatten_col(df, 'name', 'tag')
```

***dff***

| | name | tag |
|---|---|---|
|0|aaa|X|
|1|aaa|Z|
|2|bbb|Y|
|3|ccc|Y|
|4|ccc|Z|

```python

import seaborn as sns
sns.countplot(x="tag", data=dff)
```

![output.png](https://qiita-image-store.s3.amazonaws.com/0/104478/23578649-fc80-0ce3-a368-4c0f19ceee65.png)

このようにseabornのcountplotに渡してあげれば簡単に集計結果が得られます。

### おわりに

- もし他にちゃんとした方法を御存知の方は教えていただければ幸いです
- この記事のタイトルとflatten_col()の関数名に納得してない…w
勾配ブースティング回帰（自分用）

#勾配ブースティング回帰とは？
複数の決定木を組み合わせてより強力なモデルを構築するもう１つのアンサンブル手法。名前に「回帰」とあるがクラス分類にも利用できる。

デフォルトでは回帰木に乱数はない。その代わりに強力な事前刈りが使用される。深さは１から５ぐらいの非常に浅い決定木を用いる。そのため、モデルに占めるメモリが小さくなり予測が速くなる。

このモデルのポイントは簡単なモデル（弱学習機）を多数組み合わせことである。決定木を繰り返し追加することで、性能を向上させていく。

ランダムフォレストに比べパラメータの設定の影響を受けやすいが、正しく設定するとこちらの方が性能が良くなる。

#長所、短所
###長所
・教師あり学習の中でも最も強力
・特徴量のスケール変換は必要なく、2値特徴量と連続値特徴量が混在しても機能する。

###短所
・パラメータのチューニングに注意が必要なこと。
・訓練にかかる時間が長い。
・高次元の疎なデータに対してうまく機能しない。

#重要なパラメータ
###n_estimators（決定木の数）
ランダムフォレストでは決定木は多ければ多いほどよかったが、勾配ブースティングの場合は多くしすぎると、複雑なモデルになり過剰学習してしまう。

###learning_rate（学習率）
個々の決定木がそれまでの決定木の過ちをどれくらい強く補正するかを制御するパラメータ。
値を大きくすると、補正が強くなり、モデルが複雑になりやすい。

n_estimatorsを時間とメモリ量で決めて、learning_rateに対して探索を行う方法がよく用いられる。
vscodeでObserverの型推測が正しく働かなかった現象について


この記事は、[Business Bank Group Developers Advent Calendar](https://qiita.com/advent-calendar/2018/bbg_developers) 2日目の記事です。

# はじめに

RxJSの5系統を使用して開発していた際に、Observableの型推測が正しく働かなかった事象を体験したので紹介しようと思います。

# 発生事象

```ts
const observable = Observable.of(new Task())
  .do({
    next: _.noop,
    error: console.log
  });

// エラーにならない。
observable.subscribe((val: number) => {
  console.log(`result: ${val}`);
});
```
上記のコードはstreamを生成する際にエラー時に共通でログに出力などそういった処理をさせたい意図で書かれたコードになっています。

上記のコードはコメントにあるように、subscribe時の引数がnumberでもエラーになりません。
observableは定義された時、 `observable: Observable<any>`　になっているためです。

なぜ、anyになってしまうかというと、 `_.noop` はlodashの関数になっていますが、これの定義に原因がありました。

```ts:lodash.d.ts
noop(...args: any[]): void;
```
[noopの定義ファイル](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/lodash/common/util.d.ts#L885)では上記のように定義されていたため、
observableはanyの引数を持つ、すなわちanyのstreamであるとvscodeに解釈されてsubscribe処理で自由な型指定ができてしまう現象になっていました。

## 回避策

いくつかあると思いますが、簡単なのは3つほど

```ts:その１
const observer = Observable.of(new Model());
observer.do({
  next: _.noop,
  error: console.log
});
```

```ts:その２
const observer: Observable<Model> = Observable.of(new Model())
  .do({
    next: _.noop,
    error: console.log
  });
```

```ts:その3
const observer = Observable.of(new Model())
  .do({
    next: () => {},
    error: console.log
  });
```

その１は型推測に影響を与えるdoを分離させる方針。
その２は変数に型を宣言する。
その３は型推測に影響を与えるnextの関数の引数を正す。

のいずれかの対応で回避することが可能です。

# 感想とRxJS 6の話

そもそも後続に影響を与えないdo関数で型推論に影響を与えているのは腑に落ちない気持ちはありますが、
これはvscodeの限界だと認めて安心できるコードを保つために置き換えていくのが大事と感じます。

また、doはRxJS 6になると廃止になりpipeで行うようになるので、型推論の問題から解放されるかと思いましたが、

```ts
const observer = of(new Model)
  .pipe<Model>(
    tap((val: string) => console.log(val)),
    map((val: number) => val.toString())
  );
```
上記のようなコードでもエラーにならないで通ってしまうので、RxJSでの型はなかなか難しい部分があるのかもしれません。


明日のカレンダーは @kyokoshimizu さんが担当します。よろしくお願いします。
aws-serverless-expressでサーバレス入門

この記事は[ハンズラボ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) 4日目の記事です。
サービス開発チームで主にフロントエンド（Angular + ngrx)を担当しているhxrxchangです。


#aws-serverless-expressについて

遊びでSPAを作る際のバックエンドを、もっと簡単作れないかなと思っていたとき、
[potato4dさんのスライド](https://speakerdeck.com/potato4d/ge-ren-kai-fa-zhe-falsetamefalseaws-serverless-express-number-kyotojs)で、aws-serverless-expressの存在を知りました。
node.jsのwebアプリケーションフレームワークであるExpressの書き方で、デプロイするとAPI Gateway + lambdaで動くという奇跡の代物です。
aws-serverless-expressの良さは[上記のスライド](https://speakerdeck.com/potato4d/ge-ren-kai-fa-zhe-falsetamefalseaws-serverless-express-number-kyotojs)に書いてあるので、触ってみて嵌ったところを共有させて頂きたいと思います。

# AWS CLI
前提としてAWS CLIの設定が必要になります。
まだ設定が済んでない方はこちらの記事がわかりやすかったです。
https://qiita.com/yuyj109/items/3163a84480da4c8f402c
AWS Access Key IDやAWS Secret Access Keyが分からなくなったら、AWSマネジメントコンソールで

- IAMを開く
- 「ユーザー」をクリック
- 該当のIAMユーザーをクリック
- 認証情報タブを開く

でアクセスキーを作成することができます。

また**複数のアクセスキーをaws-cliに登録している場合、今回使用するアクセスキーをdefalutにしないとダメでした。**
これから打つコマンドで`--profile`オプションをつけても想定通りに行かなかったのでご注意を。

# とりあえずデプロイしてみる
まずはAWSが用意してくれてる雛形をデプロイして雰囲気を確かめましょう。
[basic-starterのREADME](https://github.com/awslabs/aws-serverless-express/tree/master/examples/basic-starter)通りです。

### cloneする
 
```
git clone https://github.com/awslabs/aws-serverless-express.git && cd aws-serverless-express/examples/basic-starter
```

### 下記のコマンドを実行
```
npm run config -- --account-id="<accountId>" --bucket-name="<bucketName>" [--region="<region>" --function-name="<functionName>"]
```
S3バケット名は他の全ユーザーのバケット名と被らないように。
regionは`ap-northeast-1`を、function-nameは指定しなければデフォで`AwsServerlessExpressFunction`になります。

### デプロイ
```
npm run setup
```
このコマンドはnpm installとバケット作成とアプリケーションのデプロイをします。
この際にaws-cliでdefaultで設定されているアクセスキーが、accountIdのアカウントにないと上手く動きません。

### 確認
マネジメントコンソールでcloudformation(https://console.aws.amazon.com/cloudformation/home)
を開き、AwsServerlessExpressStackを選択、「出力」のApiUrlを開いてこんな画面が開いたら成功です。

<img width="954" alt="スクリーンショット 2018-12-02 14.35.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/178093/3840e402-7049-c68b-fc70-df4425ff9e93.png">

また`/users`にアクセスするとユーザー一覧のJSONが返ってくるように、`app.js`に書いてある通りルーティングができていることが分かります。

# API Gatewayを見てみよう
![スクリーンショット 2018-12-02 15.22.00.png](https://qiita-image-store.s3.amazonaws.com/0/178093/53a15b5d-90d9-bdbc-d296-97b7d226d306.png)


ん？？
エンドポイント一個だけ？？ `/users`とかなかったっけ？？
現在業務で作ってるアプリがserverless frameworkを使っているため、API Gatewayでルーティンングして、各エンドポイントに対応したlambda functionが動くという想定を勝手にしていました。。
aws-serverless-expressではエンドポイントとlambda functionは一個で、
lambda上でexpressが動いて、そのexpressがルーティングをしてくれているようです。

# 最後に
サーバレスなのに開発時にいちいちデプロイしないでローカルで動かせるのが最大の嬉しさだと思いました。
本当はDynamoやCognitoなどを組み合わせてアプリケーションを作るところまでやりたかったのですが、続編として別記事で書きたいと思います。(怠けましたすみません :bow:)
これからばんばん個人開発やっていくぞ！！

[ハンズラボ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab)、明日の担当は@jnuankさんです。


# 参考文献 :bow:
https://speakerdeck.com/potato4d/ge-ren-kai-fa-zhe-falsetamefalseaws-serverless-express-number-kyotojs

https://qiita.com/yuyj109/items/3163a84480da4c8f402c

https://github.com/awslabs/aws-serverless-express/tree/master/examples/basic-starter
Donkey Carで動きそうなラジコン

# 関連Qiita

- [Donkey Carの作り方(RasPi側)
](https://qiita.com/akira-sasaki/items/c37468e88c9bbd739a65)
- [Donkey Car PS3 Joystick(RasPi側)](https://qiita.com/akira-sasaki/items/987ba17060637cff2c3e)
- [Donkey Carで動きそうなラジコン](https://qiita.com/akira-sasaki/items/753106d6ad9f62a31a40)
- [Donkey Carの作り方(Mac側)
](https://qiita.com/akira-sasaki/items/66f31a969712d8dea758)
- [Donkey Carの作り方(Windows側)](https://qiita.com/akira-sasaki/items/dc06b0ca21821fc8ef48)
- [Donkey Car Emulator(Mac側)](https://qiita.com/akira-sasaki/items/5e838b4f5125e25b4523)
- [Donkey Car学習(Mac側)](https://qiita.com/akira-sasaki/items/e0cc64dae5565b38987d)
- [Donkey Car Commandメモ](https://qiita.com/akira-sasaki/items/4097f9bdea46fb654a04)
- [Donkey Car Officialのドキュメント(リンク)](https://docs.donkeycar.com/)
- [AWS DeepRacerまとめ](https://qiita.com/akira-sasaki/items/c29282c281ca274d2691)

# 条件

- PWMでスピードコントローラーが制御できる事
- PWMで前輪用サーボが制御できる事

## 中華

HSPラジコン
https://www.amazon.co.jp/gp/product/B07GCKNG72/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1

HSP内部画像

![china.png](https://qiita-image-store.s3.amazonaws.com/0/63450/f196ef9b-b04f-61e9-d24f-2567b6e4b3c5.png)


## 日本

Tamiya TT-01(1/16スケール)
https://ja.wikipedia.org/wiki/TT-01
Tamiya TT-02(1/16スケール)
https://ja.wikipedia.org/wiki/TT-02
Tamiya CC-01(1/10スケール)
https://ja.wikipedia.org/wiki/CC-01

CC-01内部画像

![IMG_3156.png](https://qiita-image-store.s3.amazonaws.com/0/63450/cb87bda8-6ec0-f229-c8e2-160f6dc2b656.png)
xmlファイルの要素をterminalから変更する方法

xmlの要素にファイル名が書かれてあり、その要素に拡張子「.jpg」を追加したい場合、terminalからどのように変更するのかを調べてみました。

**Before** : ```<filename>IMG_1928</filename>```
**After**  : ```<filename>IMG_1928.jpg</filename>```

ファイル内のデータを加工する場合は```sed```というコマンドを使うようです。

```
sed -i -e 's/変換前の文字列/変換後の文字列/g' ファイル名
```

この変換前の文字列には正規表現が使えるため、この場合は4桁の数字の後に「.jpg」をつけるようにしました。
以下のようになります。

```
sed -i -e 's/\([0-9]\{4\}\)/\1.jpg/g' sample.txt
```
「\」は環境によっては円マーク「¥」になったりします。
「\1」は正規表現の参照場所で、この場合は最初の該当場所という扱いだと思います。
また、変換を行うとなぜか「.xml-e」ファイルが生成されます。これが何か分かりませんでした。何だろ。。。

## 自動化してみる
xmlデータが大量にあり、同じようにファイル名に「.jpg」の拡張子をつける必要があったため、
シェルスリプトで自動化してみました。

``` sh
files="./*"

for filePath in $files; do
  if [ -d $filePath ] ; then
    for i in $filePath; do
      for file in `\find $i -maxdepth 1 -name '*.xml'`; do
        base=${file%.*}
        replaceFile=$base".xml"
        sed -i -e '3s/\([0-9]\{4\}\)/\1.jpg/g' $replaceFile

        deleteFile=$base".xml-e"
        rm -f $deleteFile
      done
    done
  fi
done
```

実際のxmlデータは、3行目に```<filename>IMG_1928.jpg</filename>```があったため、
```sed```で変換する際に```'3s/```と3行目を変換することを明確にしてます。また、変換後になぜか生成される「.xml-e」ファイルを後で削除しています。


実際のスクリプトとテストデータは[github](https://github.com/mitsuyacider/AutomationUtils/tree/master/ReplaceXmlElement)に上げてあります。
8946 Take#２０

#問題

http://www.hackerschool.jp/hack/take20/index.pl?file=main.txt

![スクリーンショット 2018-12-01 18.52.29.png](https://qiita-image-store.s3.amazonaws.com/0/17681/93d5a9b7-563b-fddb-fab2-2c8d9996dc24.png)

#解いてみた

- ソースを見てみます。

![スクリーンショット 2018-12-01 18.53.47.png](https://qiita-image-store.s3.amazonaws.com/0/17681/54423f91-5f46-d73d-39c9-ee1265080d3b.png)

- いい感じの情報はなさそうです。
- URLが少し気になりますね。
- 今回はPHPではなくPerlです。
- かつ、fileというパラメータが付いていますね。
- これはまたおなじみの勘でファイル名を当てるパターンでしょうか。
    - password.txt
    - pass.txt
- というようななんとなくのファイルをいくつか入れてみましたが、何も変化せず。
- Perlだと何かできそうな気がしたので調べるとパイプを使ってOSのコマンドを入力すると実行できるようです。
    - OSコマンドインジェクション
- http://www.hackerschool.jp/hack/take20/index.pl?file=main.txt|ls とやってみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0f07c6d6-e01d-bfcf-23c7-bc501acca2f7.png)

- おぉ、ファイルの一覧が取得できました。
- http://www.hackerschool.jp/hack/take20/index.pl?file=password.inc で答え出るかな？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/849d83c0-8891-e6b9-83b0-a3c6e99a97f6.png)

- ファイルを表示するcatを使ってみます。
- http://www.hackerschool.jp/hack/take20/index.pl?file=password.inc|cat%20password.inc

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ba2b19d4-6c53-b0dd-f5aa-a6f477dfbb9a.png)

- 以下が答えです。
    - id:adminadmintake20
    - password:passpasstake20

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/83879953-bd40-a74b-a3e8-61f522f856c2.png)
URScriptによるURロボットの外部制御

#この記事を書く目的

最近は仕事でUniversal RobotsのURシリーズを使う機会が増えてきました。
外部制御なんかがすごくやりやすいので、外部制御のやり方をまとめていきます。

Universal RobotsのロボットUR3,UR5,UR10は共通のコントロールボックスCB3.1によりコントロールされます。(最近-eシリーズとかリリースされたので、そっちはまだ触ってないのですが。。。)
コントローラー内には小型のLinux PC(Debian)が入っているので、SSHからログインして中身をごにょごにょしたりできます。(通常ロボット使うときにはしませんが。。)

産業機械等でロボットを使うときはたいてい特定の条件が整ったら、プログラムを起動させるとか、ロボットの動きをあらかじめ作っておく使い方をします。もちろんURにもそういったジョブコールの仕組みはあるのですが(後日記事を書きます)、今回は特定の座標に直接ロボットの手先を移動させたりI/Oを使用したりといった、外部からプログラムを流し込む使い方についての解説をしていきます。

外部制御は、溶接などの分野でロボットに一定のパスをなぞらせたり、ジョイスティック等でロボットの手先座標を制御する場合などに用います。

#誰に？
この記事は仕事でUniversalRobotsのロボットを使う必要が出てきたプログラマ向けに書いています。自分のメモ書き程度のつもりなので、詳しい解説など必要でしたらコメント欄にコメントいただけると助かります。
また、言語はpythonを使用していきます。pythonの解説に関しては他の記事や公式のドキュメント等を参照してください。

# 環境・前提条件
使用した
- コントロールボックス CB3.1 SW3.5
- ロボット UR5
- プログラム言語 python3.6


# 方法
ロボットコントローラの30002番ポートにTCPでコネクションを張って、スクリプトのテキストを送ります。
スクリプトの詳細は[UR公式の外部制御マニュアル](https://s3-eu-west-1.amazonaws.com/ur-support-site/32554/scriptManual-3.5.4.pdf)を参照してください。

# 最小のプログラム
以下にロボットが完全に腕を伸ばした状態へ持っていくスクリプトを記述します。

movejというのがロボットに動作をさせるためのスクリプトです。第一引数の配列に各関節の角度がラジアンで入っています。度で入力するわけではないので、注意してください。第二引数はロボットを動作させる際の加速度第三引数は速度です。
また、**スクリプトの終端には改行を入れる必要があります。**
(忘れやすいので強調しておきます)

``` python:ur_test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import time

HOST = "192.168.250.110"
PORT = 30002

def toBytes(str):
    return bytes(str.encode())

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.send(toBytes("movej([0,-1.57,0,0,-1.57,1.57], a=1.40, v=1.04)" + "\n"))
    # ラジアン
    time.sleep(3)
    data = s.recv(1024)
    s.close()
    print("Receved", repr(data))
    print("Program finish")

if __name__ == '__main__':
    main()

```

# 複数行のスクリプトの実行
複数行のプログラムを動かす場合、例えば、現在地から100mmだけ右へ動かす等の場合にはちょっと書き方が変わります。
スクリプトを1行ごと送っても同じようなことは実現できそうですが、変数はプログラムの1回の実行ごとに破棄されるので、変数を使って計算等をする場合には変数が破棄されない様に複数行まとめて実行させる必要があります。
複数行を実行させるには、送信する文字列を*"def myProg():\n"* ~ *"end\n"*で囲います。

以下は現在地を取得してx方向に100mm動かす際プログラムです。

```python:multiline.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import time
import sys

HOST = "192.168.250.110"
PORT = 30002

def toBytes(str):
    return bytes(str.encode())

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))

    s.send(toBytes(
        "def myProg():"+"\n" # 複数行で書く場合のおまじない
        +"begin_pos = get_actual_tcp_pose()" +"\n"  # 現在の手先座標取得
        +"pos_end = pose_add(begin_pos, p[0.100, 0.0, 0.0, 0.0, 0.0, 0.0])" +"\n"# 座標値の演算
        +"movel(pos_end , a=0.39, v=0.05)" + "\n"
        +"end" +"\n")) # ココもおまじない
if __name__ == '__main__':
    main()

```

# まとめ
- URへの外部制御スクリプトの送信方法をまとめた
- URへの複数行のスクリプトの送信方法をまとめた

参考資料においた、スクリプトリファレンスを見ると、I/Oの制御や条件分岐で待ち続けたり、マルチスレッドでプログラムを動かす等、結構いろんなことができるので、皆さん遊んでみてください。


#参考
[UR公式のスクリプトリファレンス](https://s3-eu-west-1.amazonaws.com/ur-support-site/32554/scriptManual-3.5.4.pdf)

[Overview of client interfaces](https://www.universal-robots.com/how-tos-and-faqs/how-to/ur-how-tos/overview-of-client-interfaces-21744/)
女子大生っぽい記事書きましたよ

# はじめに
皆さまこんにちは！
情報通信システム工学科3年の ほの(@hnk1031 )です。
今日は[情報通信システム工学科アドベントカレンダー](https://qiita.com/advent-calendar/2018/ics2018)2日目ですね。
昨日は大木君(@2357gi )がVimの入力について書いてくれていましたね！
初心者の私でも理解できて、非常に分かりやすい記事でした:star2: (大木見てるか〜⁉︎)
さて、ここから2日目の記事を書いていこうと思います。
# 女子大生っぽい記事書くって言ってたけど
さてはて何について書こうかな〜とずっと考えていて、
<img width="887" alt="スクリーンショット 2018-12-02 13.13.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/8f9b141a-dc45-9654-71ed-c0e17c2979b8.png">
今回の参加者の中で唯一の女子なので、女子大生っぽい記事書こう と思いついたわけですが…
**女子大生っぽい記事ってなんやねん** と気付いてしまったんですよ。
工大生活3年目にして女子大生の定義が分からなくなってきた というのが本音です:sweat:
(ここ笑うところですよ皆さん！！！)
しかし、そんな私にも1つだけ分かることがあるんです！

**女子大生は可愛いものが好き**

もはや女子大生だけじゃないですよね。笑
地球上の全女子に共通しているはず！です。

そこで今回は**MacOSのターミナルを可愛くしてみよう**と思います！
(Windowsユーザーの皆さまごめんなさいいい:bow:)
# ターミナルとは
一言でいうと、**コマンドと呼ばれる命令文を用いてMacの操作や設定をおこなうためのツール**です。
Windowsだと「コマンドプロンプト」と呼ばれているものとほぼ同じです。
初期設定ではこんな感じなんですけど、
<img width="682" alt="スクリーンショット 2018-12-02 13.46.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/cda7ab03-8cfb-6377-76c1-4da30bc9bd99.png">
**全然可愛くない…:rolling_eyes:**
この状態が見やすくて良いという方もいると思いますが、
女子大生にとって**見た目は重要**なので、可愛いターミナルに変身させます！
# カスタマイズしてみよう
まずはターミナルを起動します。
<img width="462" alt="スクリーンショット 2018-12-02 14.01.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/73eaf7b8-c708-060a-7d8d-7c74d726e5a4.png">
上図のように `ターミナル > 環境設定` を開きます。
するとこんな画面が出てくるはずです。
<img width="779" alt="スクリーンショット 2018-12-02 14.06.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/f17c81e8-a9ca-91f3-9ee5-75c5b18d7699.png">
デフォルトがBasicになってますね。
見ていただくと分かるように、Grass, Homebrew, Man Page, Novel, ... とあらかじめテーマが複数用意されています。
勿論この中からテーマを選ぶのも良いと思うのですが、女子大生好みのデザインとは言えない感じがします:thinking:


そこで、**テーマを自分で作ってみましょう！！**
左下にある`+`ボタンを押すとテーマを増やすことができます。
<img width="779" alt="スクリーンショット 2018-12-02 14.13.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/a8589ca7-a8a0-9f8e-4693-5636015ba8a6.png">
今回はクリスマスも近いので、クリスマスカラーのターミナルを作ってみます:christmas_tree:
背景、フォント、テキスト、ANSIカラー、カーソル をちょっといじってみると…
<img width="682" alt="スクリーンショット 2018-12-02 14.35.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/097a0e29-5d1b-6250-d0ce-5286fe2d4358.png">
何となくクリスマスっぽさが出たような？？？
これは私の配色センスの無さが光ってますねぇ:innocent:

色の組み合わせとフォントを変えるだけでとっても印象が変わるんです！
**皆さんも自分好みのターミナルにしてみてはいかがでしょうか〜:hugging:**
<img width="842" alt="スクリーンショット 2018-12-02 14.44.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/a0def3a1-289e-2e2d-3b1d-3d00d3e89d50.png">
<img width="762" alt="スクリーンショット 2018-12-02 14.55.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/317882/ee682992-906e-0fe7-4406-b9fff3fb84f8.png">

# 終わりに
結局最後まで女子大生っぽい記事って何なんだろう と思っていましたが、
ここで伝えたかったことは、**見た目って大事なんですよ！**
女子大生だけでなく、是非この機会に皆さんのターミナルを変身させてみてはいかがでしょうか！

明日はたつぱか君(@Yoshida_kun )がDjangoについて書いてくれるそうです。
PythonのWebフレームワークとは非常にナウいですね〜
それでは、お楽しみに！
会社の中に会社辞めたい人が何人いるかわかるかもしれない「会社辞めたい」

[クソアプリ2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app2)　2日目！！

こんちゃす！俺のクソサイトを見てくれ！！！

## 作ったもの
[会社辞めたい](https://kaisya-yametai.com/)
[![2018-12-02_15h39_05___.png](https://qiita-image-store.s3.amazonaws.com/0/213100/07e39d2c-8612-bbad-37db-3d149d862313.png)](https://kaisya-yametai.com/)

### こーゆー感じ

 1. 会社を辞めたい人が会社のPCから「会社辞めたい」でググる
 1. 検索結果から上記「会社辞めたい」をクリック
 1. 同じリモートホストからのアクセスが何回あったか表示する    
 1. 「辞めたいと思ってるのは俺だけじゃないんだ！うおお！！」ってなる

### おまけ機能
ツイートボタンからツイートすると会社辞めたいの画像文字付きでツイートできます。フォントは安定の[吐き溜](http://www.ankokukoubou.com/font/hakidame.htm)です。[暗黒工房](http://www.ankokukoubou.com/)さんは良い仕事するねえ。ありがてえありがてえ。
↓こんなかんじ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あなたの弊社からは何回見られてるかな？？<br><br>私の近くの辞めたいっぽい人が9回見に来たっぽいです｜会社辞めたい <a href="https://t.co/svHMe3Sl9R">https://t.co/svHMe3Sl9R</a> <a href="https://twitter.com/kazunii_ac?ref_src=twsrc%5Etfw">@kazunii_ac</a>から</p>&mdash; 土橋一夫（確定申告大好きマン） (@kazunii_ac) <a href="https://twitter.com/kazunii_ac/status/1069201774236467200?ref_src=twsrc%5Etfw">2018年12月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

要するにtwitter cardを使ってるだけです。（ドヤ

### クソ仮想通貨
ついでに、クソ仮想通貨「YAMETAI」を作って無料配布しています。何の役にも立たないクソ通貨ですが、収集癖のある方とかいらっしゃったらどうぞ。ずっと持っといて数年後とかに眺めて「あん時は辞めたかったんだよな～～」とか思い出に浸るのも良し。詳しくは↓こちら
[会社辞めたい - 仮想通貨YAMETAIをあげます](https://kaisya-yametai.com/cryptocurrency.php)
※詳しい方へ：このYAMETAIは、ただのカウンターパーティートークンです。[IndieSquare](https://wallet.indiesquare.me/)でチョイチョイと作りました。えっへん。

## 使ってる技術

 - PHP
 - MySQL
 - bootstrap

技術っつっても、PHPで$_SERVER['REMOTE_ADDR']を取ってMySQLのテーブルに全部そのまんま突っ込んで、

```sql
select count(*) from table where remote_host = 'remote_host'
```

みたいに数えて出してるだけです。我ながらクソな造りだなあ。

え？クッキー？？なにそれおいしいの？？？

## 退職
ななななんとびっくり、この「会社辞めたい」をクソアプリアドベントカレンダーに書こうと手を挙げた直後、急転直下で私も会社を辞めることになりました！ほんとにくそびっくりした。引き寄せの法則的なアレですかね。よくわかんないですけど。

色々あったけど、素晴らしい取締役と部長の下で働けて幸せでございました。ほんとにこのお二人にはどんなに感謝してもしきれない。クソお世話になりました！！
↓こんなかんじ
https://goo.gl/images/xXATsT

そんなわけで来年1月から[ひとり会社の代取](https://strix-ppc.com/ja/company)でございます。事業内容は、インターネット広告に関する不正対策とイナゴの養殖です。お仕事があったら私に持ってきてくださいまし。いろいろつくってがんばります！


オレは
ようやく
のぼりはじめた
ばかりだからな

この
はてしなく遠い
男坂をよ…

＜未完＞

### ↓ほかのクソたちも見てくれよな！！！
[クソアプリ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app)
[クソアプリ2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app2)
docker-compose でMySQL環境簡単構築

## はじめに
docker-composeを使って、MySQL環境を構築します。サンプルとしてtestテーブル作成〜phpMyAdminで確認できるまでの手順をご紹介します。なるべく、シンプルにという事で、MySQLとphpMyAdmin用のコンテナのみの構築となっております。

## 環境
MySQL 5.7

## 構成
以下のような構成になります。
なお、dataはディレクトリになります。MySQL起動しSQLを叩いた際に、data以下に各種ファイルなどが自動的に作成されるようになります。

```
├── docker
│   └── db
│       ├── data
│       ├── my.cnf
│       └── sql
│           ├── 001-create-tables.sql
│           └── init-database.sh
├── docker-compose.yml
└── init-mysql.sh
```

## 構築
### 1. docker-compose.yml 作成
MySQLとphpMyAdmin用のコンテナをそれぞれ構築します。

```docker-compose.yml
version: '3'

services:
  # MySQL
  db:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306

  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=mysql_host
    - PMA_USER=root
    - PMA_PASSWORD=root
    ports:
    - 8080:80
````

### 2. SQL　作成
#### MySQLの設定ファイル
お好みに合わせてご変更ください。

```cnf:mycnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4
```

#### サンプルテーブル構築用のcreate文

```sql:001-create-tables.sql
---- drop ----
DROP TABLE IF EXISTS `test_table`;

---- create ----
create table IF not exists `test_table`
(
 `id`               INT(20) AUTO_INCREMENT,
 `name`             VARCHAR(20) NOT NULL,
 `created_at`       Datetime DEFAULT NULL,
 `updated_at`       Datetime DEFAULT NULL,
	PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

```

### 3. 初期化用シェルスクリプト

#### コンテナ内に配備するinit-database.sh
こちらのシェルスクリプトでsqlファイルを実行します。

```bash:init-database.sh
#!/usr/bin/env bash
#wait for the MySQL Server to come up
#sleep 90s

#run the setup script to create the DB and the schema in the DB
mysql -u docker -pdocker test_database < "/docker-entrypoint-initdb.d/001-create-tables.sql"
```

#### コンテナにわざわざ入るのが面倒(笑)なのでinit-mysql.sh
注: 実行権限を付与していないとエラーになる場合があるので１行目で権限変更しています。

```bash:init-mysql.sh
#!/bin/sh
docker-compose exec db bash -c "chmod 0775 docker-entrypoint-initdb.d/init-database.sh"
docker-compose exec db bash -c "./docker-entrypoint-initdb.d/init-database.sh"
```

## 実行

### docker起動

```bash
docker-compose up -d
```

### docker起動確認
注: 起動に失敗していたら上記のdocker起動コマンドを再度叩いてください。

```
docker-compose ps
```

### DB初期化(シェル実行)

```bash
./init-mysql.sh
```

## 確認
phpMyAdminで確認してみましょう。

http://localhost:8080

下記のようになって入れば成功です。

<img width="1131" alt="スクリーンショット 2018-11-28 11.28.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/290840/9fd05591-36bb-0728-8d9f-e82c97a4a306.png">

## 最後に
docker-composeを使用しての、MySQL環境の構築でした。実際には、PHPやRubyなど他のコンテナと組み合わせて使用する事になるかと思います。今回はなるべくシンプルにMySQLのコンテナに絞ってご紹介させていただいたので、ぜひ他のコンテナと組み合わせて使用してみてください。
メモリ512M最安VPSでnginx + php + elasticsearch on dockerを起動する

困ったのはelasticsearchだけなので、php, nginxにはほぼ触れない。

# VPS
amazon Lightsail 512MBプラン
https://aws.amazon.com/jp/lightsail/
OS：amazon Linux

# docker-compose.yml
```yaml
version: "2"
services:
  # php-fpm
  phpfpm:
    build: ./phpfpm/
    links:
      - elastic
    volumes:
      - ./data:/var/www/html
    mem_limit: 64m

  # nginx
  nginx:
    build: ./nginx/
    ports:
      - 80:80
    links:
      - phpfpm
    volumes:
      - ./data:/var/www/html
    mem_limit: 64m

  # Elasticsearch
  elastic:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
    environment:
      - cluster.name=docker-cluster
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      nproc:
        soft: 4096
        hard: 4096
      memlock:
        soft: 256000
        hard: 256000
      nofile:
        soft: 65536
        hard: 65536
    mem_limit: 256m
    memswap_limit: 2g
```

着目すべきはelasticsearchの設定。~~かなりマシンリソースが必要なので、そもそもこんな使い方をしてはいけない。~~


基本はElasticsearch公式。それをもとにゴニョゴニョした結果が上記。
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

* プロセス数(nproc)は4096の確保が必須。確保しないとelasticsearchのヘルスチェックでfailしてコンテナが停止
* ファイルディスクリプタ(nofile)は65536の確保が必須。確保しないと(ry
* (memlockはmem_limitに合わせただけ。確保すべき値は不明)
* mem_limitはホストマシンのメモリの半分≒256mを確保。えいや〜
* memswap_limitで2Gを確保。えいや〜
* bootstrap.memory_lock: true の設定を**使わない**。true = スワッピングをさせない
  （当然Elasticsearchの公式では、パフォーマンスとノードの安定性のためにこの設定をtrueにするように言及している）

> Swapping needs to be disabled for performance and node stability.

こんな貧弱なマシンを使わないなら上の設定は書かなくていい気がする。（手元のローカルPCでは必要なかった）

# （参考）swap領域の確保
https://qiita.com/kooohei/items/22a5b92794affacc1ea7
CSSフレームワーク一覧【2018年12月投稿】

個人でアプリ開発をしていたときに、
「CSSフレームワークってどれがいいんだ？ とりあえず、Bootstrapを使っておけばいいのか？」
と思って調べたときに作成した一覧を公開します。
調査・検討する際の補助資料として使っていただければと思います。
自分で使ったり、ドキュメントを読み込んだりした訳ではないですし、全てを網羅している訳ではないので、その点はご承知おきください。

## 対象読者

- どのフレームワークを使おうか迷っている
- そもそもどんなフレームワークがあるのだろう？という方

## CSS フレームワーク一覧

|CSS フレームワーク|GitHub Star|GitHub Link|Document|
|:--|--:|:--|:--|
|Bootstrap|129,058|https://github.com/twbs/bootstrap|https://getbootstrap.com/|
|Semantic UI|43,632|https://github.com/Semantic-Org/Semantic-UI|https://semantic-ui.com/|
|Materialize|34,521|https://github.com/Dogfalo/materialize|https://materializecss.com/|
|Bulma|31,510|https://github.com/jgthms/bulma|https://bulma.io/documentation/overview/start/|
|Foundation|27,828|https://github.com/zurb/foundation-sites|https://foundation.zurb.com/|
|Pure|19,347|https://github.com/pure-css/pure|https://purecss.io/|
|Skeleton|16,248|https://github.com/dhg/Skeleton|http://getskeleton.com/|
|UIkit|13,513|https://github.com/uikit/uikit|https://getuikit.com/|
|mini.css|2,484|https://github.com/Chalarangelo/mini.css|https://minicss.org/docs|
|Micron.JS|1,944|https://github.com/webkul/micron|https://webkul.github.io/micron/docs.html|
|PROPELLER|1,141|https://github.com/digicorp/propeller|https://propeller.in/|
|SkyBlue|452|https://github.com/Stanko/skyblue|http://stanko.github.io/skyblue/|

## 所感
CSSについてそこまで詳しくない自分は一旦Bootstrapを使おうと思います。
「Star数が多い = 情報が豊富」なので嵌った際の解決法がネット上で得られる可能性が高いからです。
(Bootstrapの利用者が多いとは思っていましたが、ここまで差があるとは想像していませんでした。)

また、「CSS フレームワーク」で検索すると上位に出てくるCSSフレームワーク(記事)は玉石混交だなと感じました。
調べている時間は有限な開発リソースを削っていることになるので、情報の取捨選択を上手に行っていきたいと思った所存です。
Bootstrap4でアラート表示

## 概要
フロントフレームワークを使ってみたのでメモする。

## サンプル
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <title>BootStrap Sample</title>

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>
<body>
  <div class="container">
    <div class="row">
      <!-- 2秒間だけアラートを表示する -->
      <div class="col-12">
        <div id="alert-1" class="lead"></div>
      </div>

      <!-- 表示中のアラートをボタンクリックで消す -->
      <div class="col-12">
        <div id="alert-2" class="alert alert-danger lead">this is alert message</div>
        <button class="btn btn-primary" id="btn-2">Close</button>
      </div>

      <!-- Closeボタン付きアラートを表示する -->
      <div class="col-12">
        <div id="alert-3" class="lead">this is alert message</div>
        <button class="btn btn-secondary" id="btn-3">Add</button>
      </div>
  </div>

  <!-- Optional JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
  <script>
    /**
     * アラート要素を生成する
     */
    function alert(msg) {
      return $('<div class="alert" role="alert"></div>')
        .text(msg);
    }

    /**
     * アラート要素(Closeボタン付き)を生成する
     */
    function alertWithCloseBtn(msg) {
      return alert(msg)
        .addClass('alert-success alert-dismissable')
        .append(
          $('<button class="close" data-dismiss="alert"></button>')
            .append(
              $('<span aria-hidden="true">☓</span>')
            )
        );
    }

    (function($){
      const e = alert('this is alert.').addClass('alert-warning');

      // アラートを表示する
      $('#alert-1').append(e);

      // 2秒後にアラートを消す
      setTimeout(() => {
        e.alert('close');
      }, 2000);

      // ボタンクリックでアラートを消す
      $('#btn-2').on('click', function(){
        $('#alert-2').alert('close');
      });

      // Closeボタン付きアラートを表示する
      $('#btn-3').on('click', function(){
        $('#alert-3').append(
          alertWithCloseBtn('this is alert.')
        );
      });
    })(jQuery);
  </script>
</body>
</html>
```

## 参考資料
- [Bootstrap 4 Alerts](https://www.w3schools.com/bootstrap4/bootstrap_alerts.asp)
とあるゲームの検証項目

# はじめに
弊社では複数の協力会社様と一緒に携帯ゲームのテストをつくっています。
本記事では、その中で見えてきたゲーム開発に共通するテストケースの構成とか、
今後どうやってより良いテストをつくっていったらよいかを検討してみた結果を書いてみます。
ちなみに、ここで取り扱うテストケースは、新規開発ではなく、リリースしてしばらく経った**運用フェーズでのもの**となりますのでご留意ください。
# 時間的な制約と仕様的な制約
携帯ゲームの開発において、テストケースの作成工数を十分に取ることは可能でしょうか？
何をもって十分かはありますが、私の経験上、十分ではないと思っています。
(これはこれで課題ではあるのですが)
携帯ゲームのテストでは、大きく2つの制約があると考えています。
1つは**時間的な制約**で、これは携帯ゲームの開発に携わったことがある方ならご理解いただけると思いますが、
週に複数の施策(いわゆるガチャとかイベント)や、月数回のバージョンアップがあり、
開発スケジュールは常にカツカツです。
弊社では、仕様書が共有されてから、約2日間の期間をテストケース作成に割り当てています(※定常的なイベントの例で、新規機能はもう少しあります)。
しかも、その2日間では並行してテスト実行も稼働しているので、
テスト設計者はテスト管理と並行してテストケースを作成します。
加えて2つ目の制約である**仕様的な制約**です。
多くの施策では、仕様書がテスト開始ギリギリまで完成しません(もちろんしっかりと作成してくれる方もいますが)。
細かな設定値や、遊び感に関するバランス周りは、けっこうな確率で未Fixで共有されたりします。
これを1つ目の制約とあわせると、**約2日間でテストケースを作成したいが、仕様書は一部未Fix**という条件で
テスト実行の開始までに作成をしないといけないので、前述のとおり不十分と考えたわけです。
# テストケースの構成
ちょっと前置きが長くなりましたが、上記制約のもとテストケースをつくるとどうなるのか
事例をもとに紹介したいと思います。
ちなみに弊社では、基本的なテストケースの構成は以下としています(一部、実際のものと異なります)。
![tc_format.png](https://qiita-image-store.s3.amazonaws.com/0/321152/8295a92e-8dbc-cb52-49cf-6e95e21b8980.png)
## 事例1.更新箇所は関数使って効率化型
基本的にはこの方法を取ることが多いです。
携帯ゲームでは、イベントの基本ロジックはほぼそのままに、
画像や設定値を差し替えて更新する箇所があります。
そうした箇所は、テストケースと別のシートでマスタデータとして管理しておいて、
テストケースはそこから関数でデータを引っ張り、作成工数を効率化します。
一番最初の作成工数はそこそこかかってしまいますが、一度データ化してしまえば以降の作成はスムーズになります。
![tc_table.png](https://qiita-image-store.s3.amazonaws.com/0/321152/e26cb97b-7eab-62e7-3707-bf8ea73d0dd7.png)
仕様書を作成する方と、どこをデータとして引っ張るから、
どういうつくりにしてほしいかを事前に認識あわせしておくと、マスタ部分は仕様書からコピペすることも可能になります。
## 事例2.慣れたテスト実行者がいるからセーフ型
あまり望ましくないですが、熟練したテスト実行者に頼るかたちで、確認手順などを省略することがあります。
ただ、この方式は属人化が進むことや、テスト結果の再現性を低くすることにもつながるので、極力避けたいところではあります。
実際のところ、この方法は意図してやるものではなく、テスト設計者の余裕がなくてやむをえずこうなっているケースが多いので、
気づいたタイミングでテストケースを整備したりしています。
## 事例3.諦めて探索的テストっぽくする型
これは本当にやばいとき(仕様書がほぼない、もしくは更新されていないときや、テスト設計者が未熟だった場合など)に発生したりします。
そういうときは、最低限何をどれくらい確認したかわかるくらいにはしておきます。
(なんか1000hくらいテストしたから大丈夫でしょう、的な考えは危険)
いくら仕様が決まらない、テスト設計者が未熟とはいえ、大枠の基本機能自体は変わらない(変わりにくい)ので、
縦軸に基本機能、横軸にテスト観点(できれば観点も定義したいところです)や結果を記入する欄くらいは用意して、
どの機能をどれくらいテストして、結果どうだったのかを記録できるようにします。
![tc_探索.png](https://qiita-image-store.s3.amazonaws.com/0/321152/fd60c7da-be9e-c05b-4e98-7f5fbd4073b5.png)
めったに発生しませんが、発生した場合には開発とテスト範囲とテストの進め方の認識を合わせて実施します。
# 今後どんなテストケースをつくっていくべきか
正直なところ、現在も試行錯誤中ではありますが、できるだけ事例1の方法を取り入れたいと思っています。
一方で新規要素も入ったりするので、そこはデータ引用だけではなくしっかりとテスト設計をしたいところです。

新規要素を時間がない中で、どうテストしていくかが今後の大きなポイントです。
(特に、協力会社様と一緒に取り組んでいくことが重要)
## テスト観点の整備
新規周りで一からテストをつくっていると、多めに工数を確保しているとはいえ抜け漏れのリスクが大きくなります。
そのため、短期間でも抜け漏れ少なくテストを設計するためにテスト観点を整備しています。
(例えば、「表示：画像が正しいこと、文言のテキスト内容が正しいこと」、「設定：設定内容が仕様と合致していること」、
「条件：複数条件で動作する機能の場合、各条件の組み合わせで正常に動作すること」など)
テスト観点は、ゲーム開発の変化にあわせて更新していく必要があるため、
今後も継続的に整備して、うまく運用していきたいと思います。
## 影響範囲の考慮
こちらは、12/1の記事にて詳しく紹介がされていたので割愛します。
(大変参考になる記事でしたので、ぜひ見てください。)
# さいごに
思うままに書いてしまったので、読みづらいところも多々あるかと思いますが、
またどこかでまとめとかやってみたいと思います。
引き続きよろしくお願いいたします。
Python&Macでスクレイピングをはじめようとしたらつまづいたこと

#0.はじめに
Pythonをはじめた人なら誰もが興味をもつスクレイピング。
やってみたい記事がたくさんありますよね。

- [Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12](https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a
)
- [python3でwebスクレイピング(Beautiful Soup)](https://qiita.com/matsu0228/items/edf7dbba9b0b0246ef8f)

と思いきや、環境設定でつまづく人も多いハズ。私もその一人です。
私のつまづいたことと解決方法を共有します。

#１．Macではデフォルトで2.xのPythonが入っているがゆえにurlopenが使えない
【つまづいたところ】 "NameError: name 'urlopen' is not defined"というエラーがでる
【解決方法】 Pythonを使っているとバージョンの違いに苦しめられることが多いです。デフォルトのエディタのPythonの設定を確認しましょう。

私の場合は3.xを使いたいので、過去のQiitaの記事　[atomでpython3を実行する](https://qiita.com/B4Li/items/496f402526715359569d)
がとても参考になりました。

参考）[NameError: name 'urlopen' is not defined](https://stackoverflow.com/questions/17330910/nameerror-name-urlopen-is-not-defined)


#2.証明書エラー
【つまづいたポイント】　"CERTIFICATE_VERIFY_FAILED error"というエラーが出る
【解決方法】　アプリケーションフォルダにあるPythonフォルダで"Install Certificates.command"を実行してあげましょう。以下のような実行結果が出るはずです。

参考）[Scraping: SSL: CERTIFICATE_VERIFY_FAILED error](https://stackoverflow.com/questions/50236117/scraping-ssl-certificate-verify-failed-error-for-http-en-wikipedia-org)

```実行結果
##実行結果
 -- pip install --upgrade certifi
Requirement already up-to-date: certifi in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (2018.11.29)
 -- removing any existing file or link
 -- creating symlink to certifi certificate bundle
 -- setting permissions
 -- update complete
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
Deleting expired sessions...none found.
[プロセスが完了しました]
```![error]()
```

他にもなにかあれば更新していきます。
require_auth 処理の詳細

スマートコントラクトの権限チェック `require_auth` で何をやっているかを調べてみました

## 結論
`require_auth(user)` は、`user` アカウントがアクションの認証情報にあるかどうかを確認して、存在していない場合は、アクションを以上終了させるようにしています。

## 詳細
まず、アクションの定義は下記になっています。

```c++
  struct action {
    scope_name scope; // the contract defining the primary code to execute for code/type
    action_name name; // the action to be taken
    permission_level[] authorization; // the accounts and permission levels provided
    bytes data; // opaque data processed by code
  };
```

コメントどおりですが、パラメータの意味は下記になります

|パラメータ|意味|
|-------|----|
|scope  |実行するアクションのターゲットになっているスマートコントラクトのアカウント|
|name   |実行したいアクション名|
|authorization|アクションの呼び出しに認可されている権限レベル|
|data   |実行するアクションに必要なパラメータ|

たとえば、`cleos push action hello hi '["bob"]' -p bob@active` でアクションを送信する時は、

|パラメータ|値|
|-------|----|
|scope  |hello|
|name   |hi|
|authorization|[{ "account": "bob", "permission":"active" }]|
|data   |["bob"]|

次は、`require_auth(user)` が呼び出された時は、`authorization` に `user` の認可情報があるかどうかをチェックします。
認可情報がない場合は、アクションを失敗させ、異常終了にします。

上記例ですと、

- `require_auth('bob')` でチェックする場合は、`bob` の認可情報があるので、正常に処理されます。
- `require_auth('alice')` でチェックする場合は、`alice` の認可情報がない為、アクションが失敗になります。

## 横展開
単にチェックするだけ、異常終了したくない場合は、`has_auth` 関数があります。

```c++
bool has_auth( account_name name );
```

チェックする仕組みは一緒ですが、認可情報に該当するアカウントが存在してない場合は、失敗せずに、戻り値が `false` になるだけです。

また、上記はアカウント名だけでチェックしていますが、もっと厳密的に、権限名もチェックしたい場合は、下記の `require_auth2` 関数があります。

```c++
void require_auth2( account_name name, permission_name permission );
```

チェックしたいアカウント名と権限名を厳密的にチェックされます。
`require_auth` と同じく、チェックに引っかかった場合処理失敗になります。

**厳密のイコールなので、仮に、チェック対象権限より上位権限で実行しても失敗になります**

## まとめ
スマートコントラクトの開発には、セキュリティがすごく重要なので、慎重に権限をチェックしましょう。
OpenLambdaを使って自分だけのLambda環境を作る

これは[#CloudGarageアドベントカレンダー](https://adventar.org/calendars/2967)2日目のブログ記事です。

AWS Lambdaに代表されるマイクロサービスやAPIで実行されるサービスが人気です。サーバを立てることなく、ちょっとしたコードをさくっと実行できるので重宝します。

[CloudGarage](https://cloudgarage.jp)にはそういった機能はありませんので、代替を考えてみました。今回はAWS Lambdaクローンとして作られている[OpenLambda](https://github.com/open-lambda/open-lambda)をCloudGarageのインスタンス上にホストする方法を紹介します。

## OSはUbuntuで

今回はLinuxディストリビューションとしてUbuntu 18.04を使っています。恐らくCentOSなどの他のディストリビューションでも同じように構築できるはずです。

## ダウンロード

まずコードをダウンロードします。

```
wget https://github.com/open-lambda/open-lambda/archive/master.zip
```

最初はunzipもなかったのでインストールします。

```
sudo apt-get install unzip
```

そして解凍します。

```
unzip master.zip
```

## インストール

インストールはスクリプトが用意されているので簡単です。

```
cd open-lambda-master
sudo ./quickstart/deps.sh
```

このスクリプトはDockerやGo言語などをインストールしてくれます。そしてインストールを実行します。

```
sudo make test-all
```

これでインストール完了です。ちなみに私の環境では `At least one worker failed the status check` といったエラーが出てしまっていました。

## クラスターの用意

まず最初にクラスターを作ります。

```
./bin/admin new -cluster my-cluster
```

そしてこのクラスターを実行します。

```
./bin/admin workers -cluster=my-cluster
```

ワーカーのステータスは status コマンドで分かります。

```
./bin/admin status -cluster=my-cluster
Worker Pings:
  http://localhost:8080/status => ready
 [200 OK]

Cluster containers:
```

## 関数の作成

では実際に関数を作成します。まずテンプレートをコピーします。

```
cp -r ./quickstart/handlers/hello ./my-cluster/registry/hello
```

内容は次のようになっています。

```py

# my-cluster/registry/hello/lambda_func.py の内容
def handler(event):
    try:
        return "Hello, %s!" % event['name']
    except Exception as e:
        return {'error': str(e)} 
```

handlerというイベントが呼ばれるので、そこの何か返すだけです。

## 実行する

では実行してみます。実行はHTTP経由でできます。

```
curl -X POST localhost:8080/runLambda/hello -d '{"name": "CloudGarage"}'
"Hello, CloudGarage!"
```

ちゃんと実行されて、結果が返ってきました。

----

OpenLambdaは今のところPythonにしか対応していないようですが、Dockerベースなので他の言語への対応もさほど難しくはないでしょう。Dockerを使うことで、安全にセキュアな環境でコードを実行して結果を得られます。

オリジナルで手軽な関数実行環境を手に入れるのにOpenLambdaは良い選択肢になりそうです。

[open-lambda/open-lambda: An open source serverless computing platform](https://github.com/open-lambda/open-lambda)
Githubに登録する際にパスワード侵害を警告された話

Githubに登録してみようと思って、ささっとメールアドレスなどを入力して「Create an account」を押したら、
>「There were problems creating your account.」

というメッセージが出て、パスワードのところに
>「Password has been compromised in a third party data breach」

なんてメッセージが。。。

とりあえず、Google翻訳に通したら、
>パスワードが第三者のデータ侵害で侵害された

えっ・・・！！
要するに、パスワードが漏れてるから使うなってこと？？

しかも、そのあと気づいたが、上の方にも
>「The new password you provided has been reported as compromised due to re-use of that password on another service by you or someone else. GitHub has not been compromised directly. Your password was not saved. Please choose a stronger password.」
（Google翻訳）あなたが提供した新しいパスワードは、あなたまたは他の人が別のサービスでそのパスワードを再使用したために改ざん（侵害？）されたと報告されています。 GitHubは直接妥協されて（侵害して？）いません。パスワードが保存されませんでした。より強力なパスワードを選択してください。

なんてメッセージが。

そこで、
*[パスワードが漏洩しているかどうかを確認する – Urusu Lambda Web](https://urusulambda.wordpress.com/2018/08/04/%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%8C%E6%BC%8F%E6%B4%A9%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B/)*
で紹介されていた、
*[Have I Been Pwned_ Pwned Passwords](https://haveibeenpwned.com/Passwords)*
でパスワードを通してみると、
>このパスワードは、以前はデータ侵害にあったため、決して使用しないでください。あなたが以前にどこでもそれを使用したことがあるならば、それを変更してください！

なんて言われてしまった。

パスワードの使いまわしはしないようにしましょう。（結論）
java.io.IOException: Cleartext HTTP traffic to {ドメイン名} not permitted

Androidアプリ開発で「HttpURLConnection」を使ってネットワーク通信しているあたりでタイトルのようなエラーが出た。

以下の記事の最初のコメントの「Option 1〜3」を実施して、
さらに、接続先URLの「http://〜」の部分を「https://〜」にしたらエラーが解消されました。

Android 8: Cleartext HTTP traffic not permitted
https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted
ORM order句でfieldを使ったソート

この記事は [CakePHP Advent Calendar 2018](https://qiita.com/advent-calendar/2018/cakephp) 18日目の記事です。

##やりたい事

ORMでDBからデータを取得する時、ある値だけを昇順や降順でソートし、取得したい。

##order句でfieldを使用したソート

```php:ORM
$test = $this->Hoge
    ->find()
    ->order([
        'field(id, 3, 5, 7)' => 'DESC'
    ]);
```

order句の連想配列は、`key`がソート対象、`value`がソート条件となっています。

`field`の第一引数には、`ソート対象とするカラムを指定`します。
今回の場合、idを対象としています。

第二引数以降は、`第一引数に指定したカラムに存在する値を指定`します。
今回はidカラムに存在する`3,5,7`を対象としています。


```sql:発行クエリ
SELECT Hoge.id AS `Hoge__id`,
       Hoge.name AS `Hoge__name`
FROM hoge Hoge
ORDER BY field(id, 3, 5, 7) DESC
```

発行クエリはこのような形になります。

fieldの指定はORM独自の書き方ではなく、SQLのクエリの書き方です。
なので、order句で指定した書き方と全く同じ形でクエリが発行されるはずです。

##contain句に指定したTableをfieldの条件にしたい場合

```php:ORM
$test = $this->Hoge
    ->find()
    ->contain('Fuga')
    ->order([
        'field(Fuga.id, 2, 4, 6)' => 'DESC'
    ]);
```

次は、contain句でジョインしたテーブルをorder句の対象とした場合です。

contain句でジョインしたテーブルをorder句のfieldで指定する場合、カラム名の先頭にテーブル名を付与する必要があります。今回で言うところの`Fuga.id`の部分です。

このような指定をする理由としては、参照先が不明確になるため、データの整合性が合わずエラーになるからです。
もし、`'field(id, 2, 4, 6)'`のように指定した場合、`Database Error`になるはずです。

なので正確にいうと、ジョインしたテーブルをorder句で指定したい場合ではなく、ジョインして複数のテーブルからデータを取得するORMを書いた場合、order句での指定はカラム名の先頭にテーブル名を付けた`テーブル名.カラム名`としなくてはならない、が正しいです。


```sql:発行クエリ
SELECT Hoge.id AS `Hoge__id`,
       Hoge.name AS `Hoge__name`,
       Fuga.id AS `Fuga__id`,
       Fuga.name AS `Fuga__name`
FROM hoge Hoge
LEFT JOIN fuga Fuga ON Fuga.id = (Hoge.fuga_id)
ORDER BY field(Fuga.id, 3, 5, 7) DESC
```

発行されたクエリがこちらです。
ジョインの結合条件on句の部分はTableクラスでアソシエーションが貼られていないと当たり前ですが、取得できません。
その場合おそらくエラー内容が`The ジョインしたテーブル名 association is not defined on ジョイン先テーブル名.`みたいなエラーが表示されるかと思うので、order句によるエラーではない事はわかると思うのですが、念の為記載致します。

##変数に格納された配列をfieldの条件にしたい場合
```php:ORM
$array = [
    '1' => '3',
    '2' => '5',
    '3' => '7'
];

$test = $this->Hoge
    ->find()
    ->order([
        'field(id,' . implode(',', $array) . ')' => 'DESC'
    ]);
```

最後に変数に格納された配列の値を元にorder句でソートしたい場合です。

fieldでの指定方法は全く変わりません。第一引数に対象とするカラムを、第二引数に対象としたカラムの値を指定します。
このとき注意なのが、[implode](http://php.net/manual/ja/function.implode.php)で配列を文字列で連結してあげる必要があります。

[implode](http://php.net/manual/ja/function.implode.php)後、上記の配列が`3,5,7`という形になるので、これで初めてソートできるようになります。

これをやらないと`Array to string conversion`と`Database Error`の重ね技で怒られますので、要注意です。


```sql:発行クエリ
SELECT Hoge.id AS `Hoge__id`,
       Hoge.name AS `Hoge__name`,
FROM hoge Hoge
ORDER BY field(id,3,5,7) DESC
```

こちらが発行クエリです。
implodeで整形した事によって、発行クエリの形は1番最初に紹介したソートと全く同じ状態になりました。

##参考
https://book.cakephp.org/3.0/ja/orm/query-builder.html
http://php.net/manual/ja/function.implode.php
https://yoku0825.blogspot.com/2016/02/where-in-order-by-field.html
http://atsuizo.hatenadiary.jp/entry/2016/07/27/150000

##おまけ
Twitterやってます！外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います！[@Tatsuo96](https://twitter.com/Tatsuo96)
p.s.今年の2月までは溶接職人でした。ガッツ系エンジニアとしてやらせて頂いております。
[Ethereum]テストネット上でEthereumをやりとりする

# Ganacheを用いてテストネットにつなぐ

おなじみのやつ

```
const Web3 = require('web3')
const web3 = new Web3('http://127.0.0.1:7545')
```

## アカウント間でEthereumをやりとりする

テストアカウントを使う

```
const account1 = 'xxxxxxxxxxxxxxxxxxx'
const account2 = 'xxxxxxxxxxxxxxxxxxx'
```

アカウント１の残高を見てみる

```
web3.eth.getBalance(account1, (err, result) => { 
    console.log(result) 
})
> 100000000000000000000
```

アカウント１からアカウント2に送金する

```
web3.eth.sendTransaction({
    from: account1,
    to: account2,
    value: web3.utils.toWei('1', 'ether')
})
```

それぞれの残高を見てみる

```
web3.eth.getBalance(account1, (err, result) => { 
    console.log(result) 
})
> 98999958000000000000

web3.eth.getBalance(account2, (err, result) => { 
    console.log(result) 
})
> 101000000000000000000
```

# Infuraを用いてテストネットにつなぐ

今回はRopstenでやってみます

Infuraでやりとりするには、[ethereumjs-tx](https://github.com/ethereumjs/ethereumjs-tx) というやつが必要らしい。

ご参考
https://noumenon-th.net/programming/2018/06/17/ethereumjs-tx/

```app.js
var Tx = require('ethereumjs-tx')
const Web3 = require('web3')
const web3 = new Web3('https://ropsten.infura.io/v3/xxxxxxxxxx')
```

## アカウントを設定する

アドレスと秘密鍵は自分のやつをどうぞ

```app.js
const account1 = 'xxxxxxxxxxxxxxxxxxx'
const privateKey1 = Buffer.from('your private key', 'hex')
const account2 = 'xxxxxxxxxxxxxxxxxxx'
const privateKey2 = Buffer.from('your private key', 'hex')
```

テスト用にEthereumがない人はここでクレクレしてこよう。１日１ETHもらえます。

https://faucet.ropsten.be/

残高を見てみる

```
web3.eth.getBalance(account1, (err, balance) => { 
    console.log('account 1 balance:', web3.utils.fromWei(balance, 'ether')) 
})

web3.eth.getBalance(account2, (err, balance) => { 
    console.log('account 2 balance:', web3.utils.fromWei(balance, 'ether')) 
})

>　account 1 balance: 1.998581233
>　account 2 balance: 0
```

##送金する

ガスの料金とかはいい感じに変えてください

```app.js
web3.eth.getTransactionCount(account1, (err, txCount) => {
    // Build the transaction
    const txObject = {
        nonce: web3.utils.toHex(txCount),
        to: account2,
        value: web3.utils.toHex(web3.utils.toWei('1', 'ether')),
        gasLimit: web3.utils.toHex(21000),
        gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei'))
    }

    // Sign the transaction
    const tx = new Tx(txObject)
    tx.sign(privateKey1)

    const serializedTransaction = tx.serialize()
    const row = '0x' + serializedTransaction.toString('hex')

    // Broadcast the transaction
    web3.eth.sendSignedTransaction(row, (err, txHash) => {
        console.log('txHash', txHash)
    })
})

> txHash 0xe33b5408cf03c499f3ebd14a9b7990b06586a67857ea86433a3a0d25b6c4bd76
```

##トランザクションを確認

ばっちり1ETH動きました

https://ropsten.etherscan.io/tx/0xe33b5408cf03c499f3ebd14a9b7990b06586a67857ea86433a3a0d25b6c4bd76