OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Media ServicesをCLIから操作する

最近、AWSメディアサービスやってみています！ https://qiita.com/tin-machine/items/73d1564eeeeda49a3f6c

でも、動画配信のパラメータを変更して検証するの... :tired_face: 超面倒なんですけど。おっさん辛い。

:persevere: そもそも、都度チャンネル作らなきゃならない設定はなんなの。辛み。
CLIから作りたくなってきた。aws-cliをアップデートするとメディアサービスも使えるようになります！

# 最初に aws-cliをアップデートする
```
pip install -U awscli
```

# チャンネルidを取得する
先にチャンネルのIDを確認します。WebUIだと
[ MediaLive ]->[ Channels ]->作成したチャンネルのラジオボタンをクリック->[ ID ]の所の数字をメモ

CLIからだと

```
aws medialive list-channels | jq -r '.Channels[].Id'
```
で取得できます

# チャンネルの設定情報を取得します
```
aws medialive describe-channel --channel-id チャンネルid > channel_sample.json
```

# チャンネル設定を変更する :relaxed: 
上記の describe-channel はユニークであるべきidやチャンネルごとに振られるIPアドレス、ステータスなども出力されてしまいますので削除します。
* PipelinesRunningCount
* EgressEndpoints
* State
* Id
* Arn

他のアカウントから設定をコピーする場合は
* RoleArn
も修正しましょう

# 既にある設定を削除する :smiling_imp:
注) 下記を実行すると、既にあるチャンネル設定が一つ消えます。高速に検証するため、チャンネル設定を消して作ってを行っていますが、サービスするようになったら変更する必要があるでしょう。

上記のチャンネルidを取得する方法を利用して、既存のチャンネル設定を削除しています。
```
aws medialive delete-channel --channel-id $(aws medialive list-channels | jq -r '.Channels[].Id')
```

# jsonからチャンネルを作る :kissing_heart: 
```
aws medialive create-channel  --region ap-southeast-1  --cli-input-json file://channel_sample.json
```

# チャンネルをスタートする :movie_camera: 
```
aws medialive start-channel --channel-id $(aws medialive list-channels | jq -r '.Channels[].Id')
```

# チャンネルをストップする :no_entry_sign: 
```
aws medialive stop-channel --channel-id (aws medialive list-channels | jq -r '.Channels[].Id')
```
arduinoでdigitalWriteするときとかのアレ。

会社のでっかい先輩からarduinoのアドベントカレンダーがスカスカなのでなんか無いかと誘われたので、地味なところを書きます。
#digitalWriteって良いよね
arduinoのdigitalWrite関数
```digitalWrite(pin, value)```
んで、その中身は

``` c++
void digitalWrite(uint8_t pin, uint8_t val)
{
    uint8_t timer = digitalPinToTimer(pin);
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    volatile uint8_t *out;
 
    if (port == NOT_A_PIN) return;
 
    // If the pin that support PWM output, we need to turn it off
    // before doing a digital write.
    if (timer != NOT_ON_TIMER) turnOffPWM(timer);
 
    out = portOutputRegister(port);
 
    uint8_t oldSREG = SREG;
    cli();
 
    if (val == LOW) {
        *out &= ~bit;
    } else {
        *out |= bit;
    }
 
    SREG = oldSREG;
} 
 ```
ってなっていますね。
一時変数が多いですね、嫌ですね。見るからに遅いっすね。
丁寧に見ていきましょう。```
uint8_t timer = digitalPinToTimer;
```
面倒なので詳細は省きますが、要するに、PROGMEM領域で指定されたピンの対応タイマを返す関数です。
なんでタイマを見てるかというと``` 
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
```はい。タイマが対応してるピンであれば、PWMを切っておこうねってことですね。
はい次！
``` uint8_t bit = digitalPinToBitMask(pin); ```
```uint8_t port = digitalPinToPort(pin); ```
まとめていきましょう。
digitalPinToPortはそのピンに対応したポートを返します。digitalPinToBitMaskはそのポート内でのピンに対応するビットを1にしたuint8_tのビット列が返ってきます。
んでんで、
```if (port == NOT_A_PIN) return;```
これ、これを過信すると死にます。多分。
digitalWriteに対応していないピンがあったら関数を抜けるってことなんですけど、digitalPinToPort関数自体は内部に持ってる配列にアクセスしているだけなので、対応範囲外のピン番号が入ってくると、配列の範囲外を参照してきて所謂未定義動作になります。本番前にハマると死にます。こんなミスしてると来世も極貧です。悲しい。
ここまできたら後は簡単ですね。
正直このif(port == NOT_A_PIN)を過信しないでねって言いたかっただけです。  

```c++ 
    uint8_t oldSREG = SREG;
    cli();
 
    if (val == LOW) {
        *out &= ~bit;
    } else {
        *out |= bit;
    }
 
    SREG = oldSREG;
 ```
後はまとめて、oldSREGには現在のキャリーフラグや割り込みフラグを一時退避します。正直ここはcurrentだと思うのですが...。
で割り込みを禁止して、*outレジスタに値を書き込んで、抜けます。
あれ？sei()なくね？割り込み禁止しっぱなしじゃん！！って思ったあなたとは友達になれそうです。
SREG = oldSREGで割り込みフラグ等の状態を戻すのでsei()は呼ばなくて良いんです。多分。

#ってことは
これ一時変数保存しとけばちょっと早くなりそうじゃない？
ってのでdigitalPinのオブジェクトを作ってしまうのが最近のマイブームです。 

``` c++
struct DigitalWritePin{
public:
    DigitalWritePin(){}

    void init(const uint8_t pin){
        pinMode(pin,OUTPUT);
        digitalWrite(pin, LOW);
        sfdBit = digitalPinToBitMask(pin);
        uint8_t port = digitalPinToPort(pin);
        sfdOut = portOutputRegister(port);
    }

    void operator = (const uint8_t val){
        currentSREG = SREG;
        cli();
        if(val == 0){
            *sfdOut &= ~sfdBit;
        }else{
            *sfdOut |= sfdBit;
        }
        SREG = currentSREG;
    }
private:
    uint8_t currentSREG;
    uint8_t sfdBit;
    volatile uint8_t* sfdOut;
};

```

これで良いんじゃないの？と因みにタイマーとかNOT_A_PINの判定は要りません。最初っから気をつけて書きなさい。
init内部でdigitalWrite呼ぶのイケてないよねって思う人とは友達になりたいです。
こうなるとpinModeも分解したいっすよね。それはまた別の機会に。
Windows > ソフトを起動してもウィンドウが表示されない症状の再現 > X:-32000, Y:-32000

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
```

関連: [Windows > 画面外に出て行ったウィンドウを連れ戻す > 最大化してから、ウィンドウ上部(タイトルバー)を下にドラッグ](https://qiita.com/7of9/items/ccd67d2544adba97561c)

上記の記事にて、座標情報が`X:-32000`と`Y:-32000`になる症状が見つかっていた。

関連して以下を見つけた。
https://stackoverflow.com/questions/1478765/location-coordinates-on-computer-showing-x-32000-y-32000
> The coordinates you're seeing are due to the fact that the application is minimized when it is closed.

### 再現

以下の手順で再現した。

1. ソフトを最小化する
2. タスクバーでそのソフト上にて右クリック
3. 「ウィンドウを閉じる」を選択


```TcpIptool1.ini
[POS]
XPOS=-32000
YPOS=-32000
WIDTH=160
HEIGHT=39
(後略)
```

- Windows 10: 再現した
- Windows 8.1: 再現した
- Windows 7: 再現した

### 備考

ウィンドウの位置情報を保持するソフトを作成した場合、上記の症状は回避できないだろう。

次回起動時にはX,Yが`-32000`であれば通常の位置に表示する、などの工夫があれば、ユーザは混乱しないかもしれない。
ビジネスにおける電話とメールの使い分け

特に新人の社員やコミュニケーションが苦手な社員が、電話とメールの使い分けに悩むことが多いのですが、以下が一つの基準になると思います。
重要なのは、確実に伝えることと、決定スピードを確保すること。

#### ◆スケジュール調整など相手の回答がほしい場合は
まず電話で連絡、その後、その内容のリマインダ(備忘・証拠)として決定事項をメールで送る。

#### ◆説明の難しい内容は
まずはメールで内容を整理して送付。その後一呼吸おいて電話し、口頭でも説明。
認識違いがある箇所については、口頭で内容確認し、その後、議事録としてメールを送る。

#### ◆メールで数行で済む話については
まず電話で連絡。その後、その内容のリマインダとしてメールを送る。

#### ◆電話だけでよいもの
訪問時の到着連絡、約束済みの面会の予定時間の事前最終確認
注意）両者の合意が必要な事案の決定事項は電話だけでは済ませない。

#### ◆メールだけでよいもの
・会議後の議事録送付。打ち合わせで使う長文資料の事前送付(内容は打ち合わせで説明)
・何度電話しても連絡がつかない場合の留守電代わり。ただし後日には必ず口頭確認を行うこと。
注意）相手に必ず読んでほしい内容はメールだけですませない。

#### ◆メールや電話だけですませては絶対いけないこと
謝罪の意を伝える場面
例外を除き相手先に赴いて面前で謝罪しましょう。

だいたい以上のパターンが踏まえられていればよいでしょうか。
電話苦手という人は、決定スピードが１日単位になりがち。
メール苦手という人は、後で言った言わないのトラブルを招く。
よほどの信頼関係が築かれているならメール無しでどんどん意思決定するという場面もあります。
両方の手段をバランスよく効果的に使うのがベスト。
C++ Builder XE4, 10.2 Tokyo > TCPサーバ > echo server > 1対1通信 | (1対N通信)

```txt:動作環境
C++ Builder XE4

RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
    1対1通信の動作確認
```

### 関連

[c++ builder XE4 > tcpサーバ / tcpクライアント](https://qiita.com/7of9/items/51bd31318c6e1332adbf)
にて実装済みではあった。

単純なecho serverとしての実装について整理しておく。

### 確認手順

NonSoftさんの[TCP/IPテストツール](http://nonsoft.la.coocan.jp/Download/SocketTool/index.html)をクライアントとして使わせていただきます。

以下を行った。

1. 接続する
2. TEXT送信 (`hello<CR><LF>`)
3. 2を繰返す
4. 切断する
5. 1に戻る

## 1対1通信

参考: [ソケットライブラリのIndyを利用したクリップボード共有ソフト](https://codezine.jp/article/detail/197)

コマンドを送信したクライアントに対してecho backする実装。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	IdTCPServer1->DefaultPort = 7000;
	IdTCPServer1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
	AnsiString rcvdStr;

	// <LF>終端受信
	rcvdStr = AContext->Connection->IOHandler->ReadLn(IndyTextEncoding(932));

	AContext->Connection->IOHandler->WriteLn(rcvdStr);
}
//---------------------------------------------------------------------------
```

[過去の実装](https://qiita.com/7of9/items/51bd31318c6e1332adbf)ではIdTCPServer1Execute()において`Application->ProcessMessages();`とSleepを実施していたが、不要であるように思う。

## 1対N通信

一つのクライアントからコマンドを受けた時、接続中の全クライアントに応答文字列を返す実装。

LockListを使う。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	IdTCPServer1->DefaultPort = 7000;
	IdTCPServer1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
	AnsiString rcvdStr;

	// <LF>終端受信
	rcvdStr = AContext->Connection->IOHandler->ReadLn(IndyTextEncoding(932));

	TList *threads;
	TIdContext *ac;

	threads = IdTCPServer1->Contexts->LockList();

	for(int idx=0; idx < threads->Count; idx++) {
		ac = reinterpret_cast<TIdContext *>(threads->Items[idx]);
		ac->Connection->IOHandler->WriteLn(rcvdStr);
	}

	IdTCPServer1->Contexts->UnlockList();
}
//---------------------------------------------------------------------------
```

クライアントそれぞれに対する応答ではないので、こういう実装は使う機会がないかもしれない。
TreasureDataにinsertする方法

TreasureDataでinsertする方法はいくつかありますが、自分用にメモ

##やりたいこと
・TreasureDataにinsertする

##CLIからinsert　その１(td query)
参考：https://docs.treasuredata.com/articles/result-into-td

```
td query -d example_db -w -T presto "insert into example_tbl(col1,col2) select '1','2'"
```

あるいは

```
td query -d example_db -w --result 'td://@/example_db/example_tbl' "select '1','2'"
```

##CLIからinsert　その２(td import:auto)
参考：https://docs.treasuredata.com/articles/bulk-import-from-csv
CSVファイルからinsertする場合

```
sudo td import:auto --format csv --column-header --encoding UTF-8 --all-string --time-column time --parallel 8 --prepare-parallel 8 --invalid-columns-handling autofix --auto-create example_db.example_tbl path/to/*.csv
```

注意点としてはtime-columnオプションは必須なので、csvには必ず時間列が必要。もしないって場合はすべて0でもよいので、列を作る必要があり。
またcsvファイルの列が固定出ない場合でも自動で列を生成してくれたりもする。

##コンソールからinsert
新しいバージョンのコンソールの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/97b00b54-1d39-b467-a6cd-738171574ef2.png)

古いコンソールの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/74a7c8c4-33f9-c2eb-e244-b1e2f4f25431.png)

##まとめ
その他知りたいことがあれば、documentを確認しましょう。
https://docs.treasuredata.com/articles/quickstart
Composerで使えるライブラリをカスタムして自社サービスで使いたい

みなさんLaravelつかってますか？

僕もつかってます。今のお仕事で管理画面を用意することになって、何か良い方法はないかと検索していると以下の記事を見つけました。

laravel-adminで管理画面を速攻で構築する。
https://qiita.com/pikonori/items/a04066010e7380b3ee38

こちらのサイトのお陰で、さくっとadmin画面をつくったのはよいのですが、カスタムしたい。

- git管理内に含んで、deployすればすぐに動く状態にする
- deployしてから手動で修正

恥ずかしくもそれぐらいしか思いつかなかったのですが、
**forkしてprivateレポジトリで管理して、修正すればよい**
とのことを先輩に教えてもらったので、やってみました。

>[他人のGithubレポジトリを fork して新たにブランチを追加し、それを composer で取り込んで使う方法]
https://www.pupha.net/archives/3138/

プライベートを同様に対応すると

The "https://api.github.com/hogehogehoge" file could not be downloaded (HTTP/1.1 404 Not Found)

となるので、そもそもプライベート無理なのでは？となっていると

>Composer to download private GitHub repositories
https://stackoverflow.com/questions/39689437/composer-to-download-private-github-repositories


で対応が可能とのこと。これで無事動きました。
自分はHerokuでつかいたかったので、Personal Access Tokensで対応しました。
Herokuでも同様に対応したい場合は[COMPOSER_GITHUB_OAUTH_TOKEN]でconfigに設定しておけば使えるようになりました。

Laravel便利！Composer便利！Heroku便利！

ご指摘、コメントいただけると幸いです。
Qiita:Teamのメディア特性　～グループハックの事例を通して～

# 概要
この記事は2本立てです。

- Qiita:Team上でのコード実行速度の最適化バトルの実例
- Qiita:Teamを盛り上げるためのごく小規模な傾向分析

# Qiita:Team上でのコード実行速度の最適化バトルの実例

すごく単純ですが、こんな問題があります。

```
A zero-indexed array A consisting of N different integers is given. 
The array contains integers in the range [1..(N + 1)], which means that exactly one element is missing.

Your goal is to find that missing element.

Write a function:

function solution(A);
that, given a zero-indexed array A, returns the value of the missing element.

For example, given array A such that:

  A[0] = 2
  A[1] = 3
  A[2] = 1
  A[3] = 5
the function should return 4, as it is the missing element.
```

要するに1以上の整数が連続している配列Aの中で、欠如している要素を答えなさいっていう問題です（この例では4が正解になります）。下記を読み進める前に、自分ならどう実装するかを考えてみる事をお勧めします。下記の一番最適な方法やそれ以上の方法を思いつかれた方は、[こちら](https://www.justsystems.com/jp/employ/career/)へどうぞ。

### 力任せの方法
```
function solution(A) {
    const num = A.length;
    if(num === 0) {
        return 1;
    }
    for(let i = 0; i < num; i++) {
        if(A.indexOf(i + 1) < 0) {
            return i + 1;
        }
    }
    return A[num - 1];
}
```
この方法だと、概ね配列長の２乗に比例する計算時間がかかりますので、大規模だと実用的ではないです。

### ソートで高速化する手法
```
function solution(A) {
    const num = A.length;
    if(num === 0) {
        return 1;
    }
    A.sort((prev, next) => {
        if(prev < next) return -1;
        else if(prev > next) return 1;
        return 0;
    });
    for(let i = 0; i < num; i++) {
        if(A[i] !== i + 1) {
            return i + 1;
        }    
    }
    return A[num - 1] + 1;
}
```
だいぶ早くなりますが、ソートの時点で配列長をNとするとNlogNに比例する
時間が掛かります。ここまでを投稿者が社内Qiita:Team記事にしたところ、次々と高速化のネタが上がりました。

### フラグ配列による高速化
同じ長さのboolean配列を用意して１パスで存否チェック、２パス目で最小の欠けている数の取得で、配列長に比例する計算時間。

### 合計値による高速化
配列の合計と欠けのない合計であるN(N+1)/2の差を返す事で、前の手法の半分の計算時間かつ追加の配列記憶も不要。

### ビット演算による黒魔術
(1) 配列全体のXORを取る
(2) n = 配列要素数+1
(3) nを4で割った余り(下位3bit)が
　0のとき：　解は(1)にnをXORしたもの
　1のとき：　解は(1)に1をXORしたもの
　2のとき：　解は(1)に1をXORし、さらにnをXORしたもの
　3のとき：　解は(1)

例 (n=7; 余りが3のとき)
漏れのない[1,2,3,4,5,6,7]はXORすると「0」ですので、
設問のように１つの要素が抜けていれば、XOR結果は解になります。

この方法だと、加算によるオーバーフローの心配が無く、かつXORが加算より早い処理系もあるので速度面でも有利な場合があります。

# Qiita:Teamを盛り上げるためのごく小規模な傾向分析
前章の様に、コメントで気軽に議論やグループハックができるのがQiita:Teamのいいところです。どの様な要因で、この様な盛り上がりにつながるのか、ごく小規模に分析してみました。社内のある１週間を切り取っただけで、もう少し事例を増やさないと明確な事は言えないですが、参考程度にどうぞ。

まずは、コメント数のヒストグラムから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/98306/585be854-f9b5-3a69-081b-263587e7625a.png)

ランダムにコメントが付くなら、単峰性のポアソン分布になるはずですが、そうはなっていません。ものすごく強引に見ると、コメント0件を除けば、２～４あたりのコメント数をピークとするポアソン分布に見えなくも無いので、

- **最初のコメントが付くかどうかで壁がある**
- **その後はコメントが付きやすくなり、ランダムにコメントされる**

という傾向が示唆されます。この最初のコメントの壁は、記事自体なのか、コメントが付くという社会的評価によるものなのか不明ですが、もし後者ならサクラコメントが効く可能性があります。

次に、投稿が非常に多い日（飽和日）と投稿が少ない日（非飽和日）と社会的評価の比較を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/98306/41840460-91e2-53ea-5924-09c0f0391867.png)

飽和日だと、閲覧が追いつかず、社会的評価も低くなるかと思われたのですが、これを見る限り、関係なさそうです。むしろ、いいね数に限ってはやや多いかもしれません。この原因としては、

- **投稿が集中すると、自分の投稿への反応を見るついでに反応するというコミュニティ活性化効果がある**
- **みんな閲覧効率がよく、一日数十件程度の記事は読みこなせる**
- **みんな仕事が嫌で、Qiita:Team記事を心待ちにしている**

などの可能性があり、今後の分析が待たれます。
既存のプロジェクトを XcodeGen に移行する

[yonaskolb/XcodeGen: Swift command line tool that generates your Xcode project from a simple spec and your folder structure](https://github.com/yonaskolb/XcodeGen)

XcodeGen というのは、複数人で開発しているとよくコンフリクトする project.pbxproj を yaml から生成するように出来るツール。

XcodeGen 自体の説明とか、何が嬉しいかは、この記事を御覧ください :sunglasses:

- [XcodeGenでxcodeprojを卒業する // Speaker Deck](https://speakerdeck.com/nonchalant/xcodegendexcodeprojwozu-ye-suru)
- [XcodeGen で project.pbxproj のコンフリクトとおさらばする - Qiita](https://qiita.com/ryohey/items/3d9b0f0f461dc2392c80)

XcodeGen を既存のプロジェクトで使いたい場合になるべく簡単に移行する助けになればと思い、この記事を書いています。
新規プロジェクトで使いたい場合も、ある程度 Xcode 上で設定してから XcodeGen 使うようにするとかって場合にも助けになればと思います。

僕自身、さっき移行が完了したところなので、内容に不足があるかもしれないけどご了承ください。

# 1. 既存のプロジェクトの Build Settings を xcconfig に抜き出す
既存のプロジェクトの Build Settings を xcconfig に抜き出しましょう。

[xcconfig-extractor で Build Settings を xcconfig に抜き出す](https://qiita.com/gin0606/items/89234cc7639f9792b17a) を見てやってみてください。

xcconfig 自体は Xcode がサポートしている仕組みなので、やっぱり XcodeGen 使うの止めた！みたいな場合に戻りやすくなったりするメリットがあると思います。

あと、xcconfig-extractor という便利ツールのお陰で XcodeGen への移行が楽になる。

# 2. XcodeGen をインストールする
XcodeGen のインストール方法は [XcodeGen/README.md#installing](https://github.com/yonaskolb/XcodeGen/blob/master/README.md#installing) を御覧ください。

# 3. XcodeGen の設定ファイルを作る
設定例

```yaml:project.yml
name: XcodeGenExample
fileGroups:
  - configs
configFiles:
  Debug: configs/Debug.xcconfig
  Release: configs/Release.xcconfig
targets:
  XcodeGenExample:
    type: application
    platform: iOS
    sources: XcodeGenExample
    configFiles:
      Debug: configs/XcodeGenExample-Debug.xcconfig
      Release: configs/XcodeGenExample-Release.xcconfig
    settings:
      CURRENT_PROJECT_VERSION: 1
    scheme:
      testTargets:
        - XcodeGenExampleTests
    dependencies:
      - carthage: Realm
      - carthage: RealmSwift
  XcodeGenExampleTests:
    type: bundle.unit-test
    platform: iOS
    sources: XcodeGenExampleTests
    configFiles:
      Debug: configs/XcodeGenExampleTests-Debug.xcconfig
      Release: configs/XcodeGenExampleTests-Release.xcconfig
    dependencies:
      - target: XcodeGenExample
```

*XcodeGenExample* って書いてあるところとか、 *dependencies* を自分のアプリの設定見て適切に設定すれば大丈夫なはず。

# 4. ドキュメントを読む
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md

3 で例示した設定だと足りない部分も出てくると思うので、ドキュメントを読みつつ設定をアップデートする。

# 5. 生成する
```
$ xcodegen
📋  Loaded spec:
  Name: XcodeGenExample
  Targets:
    📱  application: XcodeGenExample
    📱  unitTestBundle: XcodeGenExampleTests
⚙️  Generated project
💾  Saved project to XcodeGenExample.xcodeproj
```

設定できてれば xcodeproj が生成される。

あとは `pod install` とか `carthage bootstrap` とかして、ビルド通るかとか確認して問題無さそうなら終わり。

# 6. 動かない
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md

- ドキュメントを読んで頑張る
- XcodeGen 使用前のプロジェクトを見て、 project.yml に書き忘れてるものが無いか確認する
- 頑張る

----

以上です。

ハマったらエラーログと一緒に Qiita に記事を書くと同じハマり方した人が嬉しいです！
ASP.NET MVC におけるイベント発生順まとめ

Tipsとしてあげておきます

イベント制御のために何年か前に調べた内容です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/f5973da6-4d2d-142b-3b4d-e1da49f68f01.png)
エンジニア向け勉強会 参加してみた気づき

## この記事を書いた人
23歳エンジニア1年目のエンジニア。
土日ももっと学習したくなり、ここ２ヶ月週２回程のペースで勉強会に参加中。

## この記事の主な内容
- 勉強会に参加してみて感じたメリット
- 勉強会で感じたデメリット
- 勉強会に参加して何が身についたのか？
- まとめ

## 勉強会に参加して感じたメリット
1.知識が深まる・普段知れないことを知ることができた。
2.他の企業が今どんな技術を用いているか知ることができた。
3.エンジニア同士の出会いがある
 
### 1.知識が深まる・普段知れないことを知ることができた。
普段業務で触っている技術や知見を深めるのはもちろん興味はあるが触ったことのない技術に関する勉強会に参加して今まで興味レベルだったものを一歩踏み込んで学ぶことができました。
**発表者に直接質問できるのも大きなメリットのひとつだと思います！**
資料などを用意してあることも多くあとで読み返しながら復習することも可能なのはありがたいです。

### 2.他の企業が今どんな技術を用いているか知ることができた。
勉強会の中には企業を代表して発表される時もありよく使用するサービスやゲームなどの技術の話などを聞きたくて勉強会に参加することもありとても興味深い話が聞けました。

勉強会に参加する際に技術ではなくサービスで決める時もあります。
実例を踏まえながら解説していただける上その企業への理解度も増すことができました。

### 3.エンジニア同士の出会いがある
**個人的に勉強会に参加する上で1番のメリット**だと思います。
ほとんどの勉強会には懇談する時間が設けられているので自分よりキャリアのあるエンジニアと話すことで自分のキャリアプランの参考になったりこれまでに経験されたことなど自社の方には**聞きにくい質問**などをこの場で聞くことができる。

また、勉強会自体勤務後の時間や休日に多いのでそのプライベートな時間を割いて参加されているので**特に学習意欲の高い方エンジニア**の方が多いと感じました。
なので自分よりも頑張っている方と出会うとモチベーションもより高まりますし、ご自身が実践されている勉強法なども聞くことができます。

## 勉強会のデメリット
1.一定時間拘束される
2.学びのスピードが一定
3.学習コストがかかってしまう

### 1.一定時間拘束される
当然ですが勉強会に参加するためには移動か必要となります。移動時間や待ち時間などの時間を踏まえると学習効率は高いと言えるのだろうかと疑問に思うこともありました。

### 2.学びのスピードが一定
勉強会は学びのペースが全体に影響されるのでわからない時などはいいのですが復習のつもりで参加すると時間を持て余すこともあります。

ネットで学ぶこともできるのことを踏まえると勉強会ではなく家で個人的に勉強した方が身につく量が多い人もいるだろうと感じました。
わからない時は質問などできてありがたい時ももちろんあるのですが。
個人的には興味レベルの技術やまだよく知らない言語などの勉強会に参加するのが効率がいいのかなと思っています。

### 3.参加費がかかる
勉強会の中には参加費が発生するものも多くは参加費がかかります。お金を払っているからとよりやる気にすることもできるかもしれませんが、ネットなどでは無料で学べることも多いのでデメリットとさせていただきます。

## 勉強会に参加してなにが身についたのか？
・聞いたことがあるレベルを知っているレベルにすることができる。
・技術に対する理解を深めることができる。
・エンジニアの人脈が広がる。
・実際にどのように実践しているか実例を聞いたりして実際にエンジニアと会って話すのでコミュ力が上がる。
・いろんな企業の方がいるので視野が広がる。
・自分よりすごい方ばかりなのでよりモチベーションが高まる。

## まとめ
「週末を無意味に過ごすよりは何か身につけよう」と漠然と勉強会に参加しだしたのですが、この２ヶ月でたくさんの先輩エンジニアの方々と出会うことができキャリアの相談を聞いていただいたり、知らなかったことを知るきっかけに勉強会はちょうどいいなと感じました。
勉強している感覚があまりなく気軽に学べる勉強会は個人的には向いているなと感じています。

今後は気になった勉強会をQiitaに投稿して学びをアウトプットしていけたらなと思います。

ここまでお読みいただきありがとうございました。
CouchbaseとRDBMSの使い分け

Advent Calendarなのに、信長の野望にハマって書くの忘れててすみません

# そもそもCouchbaseとは？

CouchbaseはCouchDB、Membase、Memcachedの３つを統合したプロダクトで、「開発者がリラックスして、 カウチソファに座っているようにデータベースの 設計・構築・運用ができるように」という CouchDBの思想を引き継ぎつつ、
* Simple (シンプル)
* Fast (高速性) 
* Elastic (柔軟) 

をコンセプトにして作られているNoSQL Databaseです。

https://www.couchbase.com/

# RDBMSとCouchbaseの違い

| DB | RDBMS | Couchbase |
|---|---|---|
| クエリ | SQL | N1QL（SQL準拠） |
| インデックス | ◯ | ◯ |
| ジョイン | ◯ | ◯ |
| 取得/保存形式 | テーブル（一階層のKey/Value） | JSON |
| 多階層構造 | △（*1） | ◯ |
| スキーマ設計 | 必要 | 不要 |
| スケールアップ | ◯ | ◯ |
| スケールアウト | △（*2） | ◯ |
| サーバ構成 | master-slave <br /> master-master | マルチマスタ |
| オフライン設計 | ✕ | ◯ |
| サーバ設定 | CLI & 設定ファイル | Web GUI & API（*3） |

*1: MySQL5.7以上で、JSONカラムを使えばそれっぽくできる
*2: マルチマスタな分散はできない。master-slaveでミラーリング的な同期ならできる
*3: 設定ファイルはあることはあるので、直接いじることも可能でしょうが、複雑すぎてそんな気にはならない。

# Couchbaseであるあるな勘違い

## スキーマレス != データベース設計しない

スキーマレスは、 **データベース設計しない** という意味ではありません。
スキーマ設計をしなければいけない場合、（特に静的言語では）アプリケーション側とDB側でスキーマ設計をして、両方で整合性を取る必要があります。

スキーマレスなDBはスキーマ設計をアプリケーション側に寄せられるという意味です。

## IndexはあくまでもRDBMSと同等なイメージで

**Couchbaseは自由にIndexをはれる** という説明を自分もしてしまうのですが、これはある意味で**嘘**です。
自由にはれるというのは、例えば、DynamoDBみたいな制限はないという意味で、RDBMSと同等に第一階層にIndexをはれるという意味で、基本的にRDBMSだとできないと思っていただいたほうがいいです。
自由にはれない例でいうと、配列になっているデータにIndexがはれるArrayIndexがありますが、1インデックスないでArrayIndexを定義できるのは1つのみです。リクエストで複数の種類の配列の中身をWhere句で指定してるので、それにマッチしたIndexを貼りたいと思っても無理です。（自分もこのパターンに陥ったことあるけど、この場合はそもそもデータ設計見直したほうがいいです。）
あと階層化したデータを第一階層にKey-Value形式で持ってくるUNNESTというものがN1QLにありますが、あれを使うととたんにIndexがかからなくなるケースがありました。

## JOINは最終手段

N1QLはRDBMS同等にJOINができます。正し、最終手段と考えてください。
まず、目に見えて遅くなる場合があります。またはIndexがうまくかからなくなる場合もあります。JOINはできなくはないです。INNER JOINもLeft JOINもRight JOINもできるのです。仕様上は。
ただしパフォーマンスは落ちるので、よく使用する場合は設計を見直すか、別のDBにしましょう。Couchbaseは階層構造もてるので、非正規化して、第2階層とかにしたらなんやかんやで対応できるケースが多いです。

# CouchbaseとRDBMSの使い所

基本的にCouchbaseのアンチパターンに陥りそうだったら、RDBMSや他のNoSQLのDBを使ったらいいと思います

## 一対多のデータを持ちたい

**A. Couchbaseを使う**
一対多のデータを作る場合、RDBMSだと関連テーブルを作って、IDでテーブルをJOINするという方法を使いますが、CouchbaseはJSONで、多階層構造を作れるので、そもそもデータを分ける必要がありません。
データの設計も管理も楽になります。

## いろんなソート、絞り込みをしたい

**A. RDBMSを使う**

Couchbaseはあくまでも、NoSQLです。
データは柔軟に持てますが、RDBMSほど、柔軟なクエリには対応できません。対応できないというかパフォーマンスが落ちます。データが柔軟であるがゆえにひどいN1QLも見たことがあります。
Couchbaseだけではないですが、NoSQLを使う場合は、絞り込み項目やソートの仕方はキチンと決めた上で設計しましょう。これはできる・これはやらないをしっかり決めた上でやらないと本来のパフォーマンスが出せません。

日本のサービスで、これもやりたい・あれもやりたいと言われてソートや絞り込みにエッジを効かせられていないサービスを見ますが、あぁいうのにはNoSQLは向きません。（例え、ソートや絞り込みができたとしても）

## 第3階層以上の多階層を持ちたい

**A. 検索対象になりうるなら、RDBMSを使う**
基本的に階層構造を持っていたら、Couchbaseでもいいです。
しかしながらユースケースで、下位の階層に直接リクエストするケースもあります。

例えば、カテゴリツリー。
リクエストは大カテゴリにも下位のカテゴリにも、アクセスするケースがあります。この場合は、RDBMSで木構造とかつくって対応したほうが、パフォーマンスがいいです。

## アプリにデータ同期が必要。もしくは、オフライン時でも利用できるアプリを作りたい

**A. Couchbaseを使う**

Couchbaseの売りの一つでもあるので、Couchbaseを使うべきです。
データ同期の際にデータの競合解決をどうするかという問題に当ります。
本来ならアプリ側でロジックを組んで対応しないといけないのですが、Couchbase Sync Gatewayを使うと自動で解決します。
（解決のロジックはGitが自動で競合解決するロジックに近いので、それをイメージしてもらえるとわかりやすいかと思います。）
SQLを使ってURLをスキーム、ホスト名、パスに分ける

アクセスログなどのデータにおいてURLを使う際、最近はhttpとhttpsの両方のアクセスが存在する場合などがあり、URLスキーム部分は分離して集計したい場合がある。
例えば、以下のような場合である。(URLは一例)

-  https://qiita.com/shiumachi 
-  http://qiita.com/shiumachi 

そこで、ImpalaのSQLを使って、URLをスキーム、ホスト名、パスに分離する。

# REGEXP_EXTRACT関数

`REGEXP_EXTRACT(str, pattern, index)`

文字列strを正規表現patternにかけ、マッチしたグループのうちindex番目の文字列を返す。
正規表現はGoogleのRE2ライブラリを使っている。
文法は[こちら](https://github.com/google/re2/wiki/Syntax)。


# クエリ例
```sql
SELECT
    REGEXP_EXTRACT(url, '([[:alpha:]]*)://.*',1) AS scheme, 
    REGEXP_EXTRACT(url, '[[:alpha:]]*://(.*?)/.*',1) AS hostname,
    REGEXP_EXTRACT(url, '[[:alpha:]]*://.*?(/.*)',1) AS path
FROM
    access_log
LIMIT 100;
```

# 参考


- [Clouderaドキュメント: Impala String Functions](https://www.cloudera.com/documentation/enterprise/latest/topics/impala_string_functions.html)
Perl の LWP::UserAgent を使って遊ぼう！

Perl には [LWP::UserAgent](https://metacpan.org/pod/LWP::UserAgent) と言って、ネット上にあるコンテンツへアクセスすることが可能になるモジュールが存在します。今回はこれの活用例を見ていきましょう。

cpanm をインストール済みの方は、次のコマンドをターミナルに入力してインストールしてください。

    cpanm LWP::UserAgent

Ubuntu を使っていて、インストールができない場合は
https://qiita.com/tsig/items/cbfb7918c8d4bc56fb87
の記事を参考にするといいでしょう！

## html を取ってくる💪

まずは html を取ってくるようなコードを書いてみましょう。

```perl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use LWP::UserAgent;
 
my $ua = LWP::UserAgent->new;
 
my $response = $ua->get('http://example.com/');

die $response->status_line if !$response->is_success;

say $response->decoded_content;
```

http://example.com へアクセスして、成功すれば html を表示して、失敗すればその [http のステータスコード](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)を表示するといったコードです。

`$response->content` というのもありますが、基本的に `$response->decoded_content` を使うようにすると後から考えることが少なくて済みそうです。

とっても簡単！！

## html をスクレイピングしてみましょう🐶
スクレイピングならおまかせの相棒を紹介します。[HTML::TreeBuilder](https://metacpan.org/pod/HTML::TreeBuilder) です。
先ほどのコードにちょこっと加えましょう。

```perl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use LWP::UserAgent;
use HTML::TreeBuilder 5 -weak;
 
my $ua = LWP::UserAgent->new;
 
my $response = $ua->get('http://example.com/');

die $response->status_line if !$response->is_success;

my $html = $response->decoded_content;

my $tree = HTML::TreeBuilder->new;
$tree->parse($html);
$tree->eof;

say $tree->look_down(_tag => 'h1')->as_text;
```
`use HTML::TreeBuilder 5 -weak;` はおまじないだと思ってください。これを書くことで `$tree->delete()` の過程が不要になります。詳しくは[ここ(英語)](https://metacpan.org/pod/HTML::TreeBuilder#DESCRIPTION)を参照してください。



実行結果は以下のように表示されるはずです！

    Example Domain

[１３行のコードで、Yahoo!Japanのトピックス一覧を取得する！](http://dqn.sakusakutto.jp/2010/06/perlhtml.html)にも使い方が書いてますが、基本的に `use HTML::TreeBuilder 5 -weak;` を使うようにして `$tree->delete()` を書かないといったやり方のほうがシンプルになるのでオススメです！！


## ファイルをダウンロードする👇

```perl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use LWP::UserAgent;
use HTML::TreeBuilder 5 -weak;
 
my $ua = LWP::UserAgent->new;

my $file    = 'example.com.html';
my $response = $ua->get('http://example.com/', ':content_file' => $file);

die $response->status_line if !$response->is_success;

say "Download success";
```

正解した場合、実行結果は

    Download success

と表示されて `ls` を入力すると `example.com.html` と表示されるはずです。
`cat example.com.html` とするとコンテンツが表示されるはずです！

今日はここまでです！
お疲れ様でした！！
形態素解析をして単語を取り出せているつもり・・・か？

「MeCabで形態素解析をして単語を抽出しましょう」とはよく見る文言ですが、いつから形態素と単語が同じものと錯覚していた？というお話です。

例として、「参考人を呼んだ」という文を形態素解析してみます。
普通の感覚では「参考人/を/呼んだ」になりますが、実際に形態素解析すると以下のようになります。

```
参考	名詞,サ変接続,*,*,*,*,参考,サンコウ,サンコー
人	名詞,接尾,一般,*,*,*,人,ジン,ジン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
呼ん	動詞,自立,*,*,五段・バ行,連用タ接続,呼ぶ,ヨン,ヨン
だ	助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
```

「参考/人」と「呼ん/だ」で切れています。つまり、私たちが認識する「単語」と実際の形態素は、一致する場合もあれば形態素がより細かくなる場合もあるということです。

# 「単語」としてのまとまり: 語の統語性

何を「単語」とするかは、発音的観点と文法的操作の観点の2つから考えられます。

* 発音的観点：同じ意味のまとまりとして一体として発音をするか
  * 例えばニュースを読むとき、「事件の・参考・人」というよりは「事件の・参考人」という方が自然になる。
* 文法的操作の観点：単語としてまとまっている場合、その一部を取り出して操作することはできない。
  * [一般と参考]人、とはできない (一般人と参考人)
  * いちご狩りに行って、それ(=>いちご)を食べた
  * 真っ + 黒板 = 真っ黒板

こうした単語としてのまとまりは「語の統合性」と呼ばれます。統合した語は一つのまとまった意味単位として働くため、これを崩すような「真っ黒板」は成立しませんが、「赤い黒板」のように一語のまとまりとして扱う場合は成立します。この統語性は、時代によって変遷します。例えば最初は「人工的な知能」だったのが、「人工知能」という一つのまとまりになっていくなどです。

日本語の場合概ね英語より形態素が細かく、語の統語性を意識しないと意味のある「単語」にならない印象があります。

* 上回っていた => 上回っ/て/い/た
* きれいな => きれい/な
* お遊戯 => お/遊戯

実際、日本語における単語の分散表現は英語のそれに比べ精度が出ていないという報告があります。

[日本語単語ベクトルの構築とその評価](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=141870&item_no=1&page_id=13&block_id=8&utm_content=buffer43028&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)

そのため、日本語の自然言語処理において精度を高めるには、単に形態素解析するだけでなく「語を統合」することも重要になって来ます。以下では、語が統語されるパターンについて紹介して行きます。

# 単語の構成

単語を構成する形態素は、それ単体で意味を持つものと、何かと合わさらないと意味を持たないものの2種類があります。前者を**自立形態素(語幹)**といい、後者を**非自立形態素**と呼びます。単語はこのような種類を持つ形態素で構成されますが、その構成形態は以下のように分けられます。

* 単一の形態素から成る
  * 単純語
* 複数の形態素から成る
  * 派生語: 自立形態素に接頭辞/接尾辞がついたもの
  * 複合語: 複数の自立形態素から成る
  * 文法的複合: 文内部で、活用形の変化により複数の形態素が接着したもの

単純語は、一つの自立形態素から成ります。
ex: 人、花

派生語は、接頭辞＋自立形態素、自立形態素＋接尾辞といった構成を取る単語です。接尾辞はつくことで品詞が変わることがあります(楽しい=>楽しさ、など)。
ex: 「お」「話」、「楽し」「さ」など

複合語は、複数の自立形態素が合わさったものです。冒頭の「参考人」はこのパターンに該当します。名詞同士だけでなく、「焼き肉」といった動詞と複合する、また動詞同士が複合する語もあります(打ち砕く、など)。この時、語の全体の意味を決めるのは後ろの語になります(「焼き肉」は焼いた「肉」、「肉焼き」は肉を「焼く行為」をさす)。

文法的複合は、「走り」「方」のような独立した形態素が活用によりくっついたものです。こうした活用による複合は、辞書に掲載されているような語彙的なものと、自由に作れる生産的なものの2種類があります。例えば、「押し」「付ける」は「押し付ける」として辞書に登録がありますが、「歩き」「続ける」のような単語は「走り」「続ける」というように他の単語と組み合わせてバリエーションを持つことができます(ただ、意味的には"walking"や"running"であり、一語を為す)。
NEologdのような辞書を使うことで「辞書に掲載されているような語彙」の拡充は可能ですが、文法的複合には対応することができません。

以上が、形態素と単語の関係なります。本記事を通じ、何気なく行なっている「形態素解析」と「単語」との関係について関心を持っていただけたら幸いです。

# 参考文献

* [ここからはじまる日本語文法](https://www.amazon.co.jp/dp/4894761742)
* [日本語単語ベクトルの構築とその評価](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=141870&item_no=1&page_id=13&block_id=8&utm_content=buffer43028&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
Cloud Automatorでt2.nanoインスタンスの価値を絞り出す

# 概要・目的
- EC2のインスタンスファミリ、t2ファミリは低コストラインナップが特徴です
- t2ファミリは「CPUクレジット残高」によってパフォーマンスが変動する仕組みが独特です
- t2ファミリの中でも、特に価格の安いt2.nanoを、Cloud Automatorを利用して活用する方法を紹介します

# 前置き
## t2のリリース
- 2017年11月30日、t2に「Unlimited」という機能がリリースされました
    - [新しいT2 Unlimited](https://aws.amazon.com/jp/blogs/news/new-t2-unlimited-going-beyond-the-burst-with-high-performance/)
- 従来はCPUクレジットを使い果たすと処理パフォーマンスが低下し、CPUクレジットの回復を待つ、またはインスタンスのSTOP→STARTによって初期CPUクレジットにリセットするしかありませんでした
- 「Unlimited」機能を有効にすれば、追加料金を支払うことでパフォーマンス低下を回避することができます（CPUクレジットを追加購入しているイメージでしょうか）
- パフォーマンス低下状態から回復したい、でもインスタンスを停止できない、そんなシーンではとても有効な機能です

## T2 Unlimitedの追加料金
- 「T2 Unlimited」、良いリリースだと思うのですが、追加料金はどうなっているのでしょうか
- `LinuxではvCPU時間あたり0.05ドル` と記述があります。リーズナブルに見えます（実際リーズナブルだとも思います）
- しかし、今回ターゲットとするt2.nanoのインスタンス料金は `1時間あたり $0.0058 (us-east1)` です。一桁違います
- 適用局面は違いますが、0.05ドルあれば8時間イケるともいえます

## 結論
- （少々強引ですが）**止めてもいいシステムならやっぱりSTOP→STARTが手っ取り早い**

# 本題
- 前置きが長くなりましたが、やりたいことは、**CPUクレジットを使い切ったインスタンスを自動的にSTOP→STARTして初期CPUクレジットを獲得する**です
- 当然ながら短時間なら停止しても問題のないシステムが対象です
- 実際のところ、t2.nanoのCPUクレジット枯渇時は停止しているようなものと考えて差し支えないと思います
- つまり、t2.nanoを採用している時点で停止は覚悟の上ということです（知らんけど）

## 動作の仕組み
- CloudWatchAlarmでCPUクレジット低下を検知
- AmazonSNS経由でCloud Automatorの `EC2 STOP` ジョブを起動
- （`EC2 STOP` ジョブが完了するまでCloud Automatorは待機してくれます）
- `EC2 STOP` ジョブの正常完了時アクションで `EC2 START`ジョブを起動（Cloud Automatorはジョブ同士を数珠つなぎで起動できるのです）
- `EC2 START` ジョブの完了時アクションで管理者へメール通知

## 参考
- この仕組みは（停止しても問題のない）個人サイトで実際に動作しています
- 仕組み導入前後の様子をCloudWatchのグラフで紹介します

## 導入前
- CPUクレジットを使い果たして復活する様子がありません

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53115/e3f56cb2-cff3-2edd-9dce-4864abd3dfbf.png)


## 導入後
- CPUクレジットを使い果たす前にSTOP→STARTすることで初期CPUクレジットを獲得して復活しています

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53115/2f54d5c8-b697-8e4e-82ee-572534819433.png)


## 最後に
t2ファミリはクセが強いので使いドコロの見極めは必要ですが、上手くつかえばコストを抑えた運用が可能ですね。
T2 Unlimitedのリリースでさらに利用バリエーションが広がり、活用シーンも増えるのではないでしょうか。
今回はちょっとかわったCloud Automatorの利用方法を紹介いたしました。
iOSアプリのサイズが増え続けて困った時の話し

[グレンジ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/grenge) 10日目担当の ma510 です。
株式会社グレンジで、クライアントエンジニアやってます。

今回は、iOSアプリのサイズが、実行してるだけでどんどん増え続けるので、開発し辛くなって困った時の話しです。

#どうしてこうなった
ちょっと前に、iOSアプリを開発中、アプリサイズが制限なく増え続けて、1時間もすると端末の容量を食い尽くし、アプリを再インストールしないといけなくなる事態にハマりました。

以下の感じです。

 **1. 端末にアプリを転送する** 
 **2. 端末でアプリを実行する** 
 **3. ファイルをダウンロードしてないのに、ストレージの「書類とデータ」が制限なく増えていく** 
 **4. 画面を行き来してるだけでどんどん増える** 
 **5. 端末のストレージの容量が足りなくなり、動作しづらくなる** 
 **6. アプリを削除する** 

アプリを再インストールすると、ダウンロードとかやり直しになるので、とっても開発し辛いのです。

このときは、パッと原因を思いつかなかったので、後回しにしちゃいました。

#調べることにした
2日ぐらい放置してたんですが、再インストールが面倒になってきたので、調べることにしました。

まず、同僚に聞いてみました。

> 「そんなん、なったことないです」
> 「なにそれ、初めて聞いた」

どうやら自分だけのようです。

実際に何が増えてるのか、ダウンロードフォルダとかを監視してみました。

> 「特に変化なし」

なんでや。

以前はなってなくて、ちょっと前からなり始めたので、何か原因があるはずだけど直せない、くうー。

#急に解決
数日後、ふと、Xcodeの設定を変更してたことを思い出しました。

不具合調査のため、以下の設定を有効にしていました。

 **Edit Scheme -> Run -> Diagnostics -> Memory Management -> Logging -> Malloc Stack** 

この機能、普段は使ってないんですが、よく分からないまま試しに有効にして、そのままにしてた。。。

そして、この設定を無効にしたら、アプリのサイズが増えなくなりました。

やったー！

#まとめ
 **1. 開発効率が悪いなと思ったら放置しない** 
 **2. 不具合が起きたら自分を疑う** 
 **3. よく分からない機能は使わない** 

以上、楽しいクリスマスを！！
xcconfig-extractor で Build Settings を xcconfig に抜き出す

https://github.com/toshi0383/xcconfig-extractor

# TL;DR
* 基本的には `xcconfig-extractor /path/to/App.xcodeproj configs` で終わり

# インストール
https://github.com/toshi0383/xcconfig-extractor/blob/master/README.md を見てお好みの方法で入れる

# 使ってみる
```
$ xcconfig-extractor /path/to/App.xcodeproj configs
Replacing existing xcconfig: Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig
Replacing existing xcconfig: Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig
Replacing existing xcconfig: Pods/Target Support Files/Pods-AppTests/Pods-AppTests.debug.xcconfig
Replacing existing xcconfig: Pods/Target Support Files/Pods-AppTests/Pods-AppTests.release.xcconfig
```

すでに xcconfig とか cocoapods 使ってる場合もよしなにしてくれる。

基本的にはこれでおしまい。

# 僕がハマったところ
## `pod install` が失敗するようになる
```
$ pod install
[!] Unable to determine the platform for the `App` target.
```

って出て `pod install` 失敗するようになる。

### 解決方法
`pod init` して生成された Podfile でコメントアウトしてある `platform` の設定をちゃんとやる

↓これ

```
# Uncomment the next line to define a global platform for your project
platform :ios, '10.2'
```

動くし〜って感じでスルーしてた。

## fastlane/CLI からバージョンの設定に失敗する
agvtool とか、fastlane の `get_build_number` `increment_build_number`、でバージョン設定してると、失敗するようになる。

### 解決方法
xcproject の方で `CURRENT_PROJECT_VERSION` を設定する。

設定方法は公式のドキュメントを見る。

https://developer.apple.com/library/content/qa/qa1827/_index.html

`VERSIONING_SYSTEM = apple-generic` は xcconfig に書いてあれば良いらしい。
Node.js の mqtt クライアント

Node.js の mqtt クライアントの例です。
Arch Linux で動作の確認をしました。

## 確認したバージョン

```text
$ node --version
v23.9.0
```

## ライブラリーのインストール

```bash
sudo npm install -g mqtt
```

## パブリッシュ

```js:publish.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	publish.js
//
//					Dec/04/2017
//
// ---------------------------------------------------------------
console.error ("*** 開始 ***")
var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://localhost')
const topic = 'topic_1'

client.on('connect', function () {
	const today = new Date ()
	var ddx = (1900 + today.getYear ()) + "-" + (today.getMonth () +1)
	ddx += "-" + today.getDate () + " " + today.getHours()
	ddx += ":" + today.getMinutes () + ":" + today.getSeconds()
	client.publish(topic, ddx)
	console.log(ddx)
	client.publish(topic, 'Good Afternoon mqtt')
	client.publish(topic, 'こんにちは')
	client.end()
	console.error ("*** 終了 ***")
})

// ---------------------------------------------------------------
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
./publish.js
```

## サブスクライブ

```js:subscribe.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	subscribe.js
//
//					Dec/04/2017
//
// ---------------------------------------------------------------
console.error ("*** 開始 ***")
var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://localhost')

client.on('connect', function () {
	client.subscribe('topic_1')
})

client.on('message', function (topic, message) {
  // message is Buffer
	console.log(message.toString())
})
// ---------------------------------------------------------------
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
./subscribe.js
```

## localhost で mosquitto を動かす

```bash
$ sudo systemctl status mosquitto
● mosquitto.service - Mosquitto MQTT Broker daemon
     Loaded: loaded (/usr/lib/systemd/system/mosquitto.service; disabled; vendo>
     Active: active (running) since Tue 2021-01-12 15:54:42 JST; 35min ago
   Main PID: 10924 (mosquitto)
```
jsサイトをスクレイピングするなら、seleniumよりsplash！

ヘッドレスブラウザ[splash](https://github.com/scrapinghub/splash)が便利だったので知見を共有します

## モチベーション

jsで構成されたサイトをスクレイピングしたいなと思い立った時、seleniumがデファクトの選択肢として挙げられると思います。
しかしseleniumの含めヘッドレスブラウザはブラウジングが入ってくるので[処理がそれなりに遅くなってしまいます](https://www.reddit.com/r/learnpython/comments/76ptzc/how_can_i_scrape_a_site_as_if_its_run_in_selenium/)。大量のページをスクレイピングする用途では不向きです。
そこで、サイトをしっかりブラウジングしながらもパフォーマンスを両立するヘッドレスブラウザという要件でseleniumの代わりをさがしていたところ、splashに白羽の矢が立ちました。

## splashとは

scrapyの開発元であるscrapinghub社が開発しているスクレイピングに特化したヘッドレスブラウザです。
splashは他のヘッドレスブラウザとは毛色が違い、Dockerで配布されるHTTP APIです。
[ドキュメント](http://splash.readthedocs.io/en/stable/index.html)にも書いてあるように

```
- 並列でページを処理する
- ページレンダリング速度を上げるためにアドブロックや画像表示をオフにできる
- Luaで細かいブラウジング用のスクリプトをかける
```

といったスクレイピングに嬉しい機能がたくさん盛り込まれています。

## 触って見る

[ドキュメント](http://splash.readthedocs.io/en/stable/install.html)の通り、docker経由でインストールしてみましょう。

```
docker pull scrapinghub/splash
docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash
```

すると、 `localhost:8050` でsplashのUIにアクセスできます。
このUIからsplashのAPIをたたくリクエストを試すことができます。

![splash.png](https://qiita-image-store.s3.amazonaws.com/0/68020/9be6c652-209c-eb20-2225-3e397f941873.png)


### サイトにアクセスしてみる

まずはUI上の `Render me!` ボタンをおしてみてください。
下記のようにsplashを実行した結果を見ることができます。

![splash-execute.png](https://qiita-image-store.s3.amazonaws.com/0/68020/1a0426af-baf2-4573-ee34-a5cff92fd3bc.png)

デフォルトで用意されているブラウジングのためのLuaスクリプトは下記です。

```
function main(splash, args)
  assert(splash:go(args.url))
  assert(splash:wait(0.5))
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }  
end
```

ここでは

1. 与えられたurlを訪れる
2. 0.5秒待つ
3. html, png, harといったリソースを返す

といった処理が記述されています。

### ブラウジングスクリプトを書いてみる

Luaによるブラウジングのスクリプトを書いてみましょう。
以下は[不動産サイトの都道府県を選択するページ](http://chintai.mhe.co.jp/search/area.php?area_cd=03)を訪れて不動産物件の一覧ページを取得するスクリプトです。

先ほどのGoogleのリンクを `http://chintai.mhe.co.jp/search/area.php?area_cd=03` に書き換え、scriptの項目を下記に書き換えてください。

```
function main(splash)
  splash:go(splash.args.url)

  local area = splash:select('.items input#id11')
  area:click()
  local submit_area = splash:select('.tools-wrap input[type=image]')
  submit_area:click()
  while not splash:select('input[alt="検索結果を見る"]') do
    splash:wait(0.1)
  end

  local city = splash:select('h4.city_name input#id_saitama')
  city:click()
  local submit_city = splash:select('section.button input[type=image]')
  submit_city:click()
  while not (splash:select('section.pager-head') and splash:select('form#search_form')) do
    splash:wait(0.1)
  end

  return {html = splash:html(), png = splash:png()}
end
```

ここでは

1. エリア選択のurlを訪れる
2. 埼玉のチェックボックスをクリックして市町区村を選ぶボタンを押して、検索結果を見るボタンが現れるのを待つ
3. 市町区村をすべて選択するチェックボックスをクリックして検索ボタンを押し、物件一覧画面が現れるまで待つ
4. htmlとpngのリソースを返す

といった処理が記述されています。
実行結果は下記です

![splash-script.png](https://qiita-image-store.s3.amazonaws.com/0/68020/3c9148d9-d734-ed55-f38c-dcaab93965ff.png)

## まとめ

上記のように、[Lua言語によって細かいブラウジングの挙動を記述](http://splash.readthedocs.io/en/stable/scripting-overview.html)することができます。
また、splashはデフォルトで並列処理をサポートしているので、splashのAPIに複数リクエストを送った場合でもブラウジングを効率的にさばきます。
そして、[splashのAPIへのリクエストをラップするためのscrapyのプラグイン](https://github.com/scrapy-plugins/scrapy-splash)もあるので、よかったらためしてみてください。
N高の授業で行ったスクレイピングをまとめてみた

**N高に入って9ヶ月が過ぎ、プログラミングでも、自分がしたいことがようやく形になったので、アドバンスカレンダーといういい機会にまとめてみようと思います。**
**プログラミングはまるっきり初心者なので、大目にみてください。**

#スクレイピングをやってみた
N予備校をはじめたあと、とりあえず何か書いてみようと思い、実況パワフルプロ野球というスマホゲームに登場する選手の能力を、全て手打ちでHTML方式で書いてみました。
とりあえず全てのキャラを書き終えたのですが、ソーシャルゲームなので、日々新選手が登場します。
これを一々確認して追記して行くのは面倒だと思い、アプリ攻略を行なっているgamewithの記事から、必要な情報を取ってこようと考えたのが、スクレイピングをしようと思ったきっかけです。

#使用したツール等
- Node.js
 - バージョンは6.11.1
- cheerio-httpcil
 - スクレイピングを非常に便利にしてくれました
- hubot
 - botを使って送信させました

#コード

hubotを起動しているslackに**file>**と送信すると、そのサイトから特定してある部分の内容を、それぞれの形式でファイルにし、自動保存します。

```js:scraping.js
'use strict';
var client = require('cheerio-httpcli');
const fs = require('fs');
const path = require('path');

module.exports = (robot) => {
    robot.hear(/file>/i, (msg) => {
        client.fetch('https://xn--odkm0eg.gamewith.jp/article/show/80449', function (err, $, res, body) {

            const title = $('title').text();
            const table = $('#article-body > div.js-accordion-area.accordion-area > table').html();
            const status = $('#article-body > div:nth-child(15) > table').text();

            // ファイル名
            const file_name = '/newfile.html';
            // 書き込み先のパス
            // __dirname: 現在実行中のソースコードが格納されているディレクトリパス
            // 自分で分かりやすいパスに変更して OK
            const file_path = path.join(__dirname + file_name);
            // 書き込み内容
            const content = (title + table + status)

            fs.writeFileSync(file_path, content);
            msg.send('File created');
        });
    });
};
```
```html:newfire.html
【パワプロアプリ】村雨(むらさめ)の評価とイベントとコンボ | GameWith【パワプロ】<tr><th>レベル</th><th>ボーナス</th></tr><tr><th>Lv.1</th><td>初期評価10(SR),15(PSR)<br>タッグボーナス70%<br>コツイベントボーナス40%</td></tr><tr><th>Lv.5</th><td>初期評価20(SR),25(PSR)</td></tr><tr><th>Lv.10</th><td>タッグボーナス90%</td></tr><tr><th>Lv.15</th><td>コツレベルボーナス2</td></tr><tr><th>Lv.20</th><td>初期評価30(SR),35(PSR)</td></tr><tr><th>Lv.25</th><td>やる気効果アップ75%</td></tr><tr><th>Lv.30</th><td>初期評価40,45(PSR)</td></tr><tr><th>Lv.35</th><td><span style="color:orange;">守備侍</span><br>(技術ボーナス,守備力のコツ)<br>タッグボーナス100%</td></tr><tr><th>Lv.37<br>(SR上限開放時)</th><td>初期評価45</td></tr><tr><th>Lv.40<br>(SR上限開放時)</th><td>初期評価50(SR),55(PSR)</td></tr><tr><th>Lv.42<br>(PSR上限開放時)</th><td>タッグボーナス105%</td></tr><tr><th>Lv.45<br>(SR,PSR上限開放時)</th><td>タッグボーナス110%</td></tr><tr><th>Lv.50<br>(PSR上限開放時)</th><td>タッグボーナス120%</td></tr>評価点7.0点得意練習肩力役割(役割一覧)イベント後イベ(イベキャラ前後一覧)金特ジャストフィット(確定)アイコンタクト(確定)コンボ柳生鞘花楽譜パワフル高校2011投手:ディレイドアーム野手:つるべ打ち(入手できる楽譜一覧)所持コツ送球◯/ レーザービーム/ 守備職人/ 一発逆転/ 守備力
```

これで　newfile.html として、村雨くんの能力をファイルとして書き出してくれます。

#今後取り組みたい点
- cronやHubotcronなどでの定期実行
- URLを自動で設定

#まとめ
心斎橋のTAの人に教えてもらいながらですが、とてもいいものができました。
これからも改良して、もっといいものを作っていきたいです。

記事を書くにあたり実況パワフルプロ野球、GameWithの利用規約を確認させていただきました。
serialplotter　その2

#概要

serialplotter作ってみた。
c#で作ってみた。
115200ボーで送る。
時間軸は、１ｍｓ

#写真

![ana3.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/bade3707-55e9-f7e7-0db8-e718ba460c53.jpeg)


#サンプルコード


```
volatile bool bState = false;
volatile bool sState = false;
volatile bool flg = false;
volatile int count = 0;
volatile byte b0[20];
volatile byte b1[20];

ISR(TIMER1_COMPA_vect)
{
	int i;
	int j;
	count++;
	if (count > 159)
	{
		count = 0;
		sState = !sState;
		flg = true;
	}
	i = count / 8;
	j = count % 8;
	if (digitalRead(2) == LOW)
	{
		if (sState)
		{
			b0[i] |= _BV(j);
		}
		else
		{
			b1[i] |= _BV(j);
		}
	}
	else
	{
		if (sState)
		{
			b0[i] &= ~_BV(j);
		}
		else
		{
			b1[i] &= ~_BV(j);
		}
	}
	bState = !bState;
	digitalWrite(13, bState);
}
void setup()
{
	Serial.begin(115200);
	pinMode(13, OUTPUT);
	pinMode(2, INPUT);
	digitalWrite(13, LOW);
	TCCR1A = 0;
	TCCR1B = 0;
	TCNT1 = 0;
	OCR1A = 1200;
	TCCR1B |= (1 << WGM12);
	TCCR1B |= (1 << CS11);
	TIMSK1 |= (1 << OCIE1A);
}
void loop()
{
	if (flg)
	{
		if (sState)
		{
			Serial.write(b1[0]);
			Serial.write(b1[1]);
			Serial.write(b1[2]);
			Serial.write(b1[3]);
			Serial.write(b1[4]);
			Serial.write(b1[5]);
			Serial.write(b1[6]);
			Serial.write(b1[7]);
			Serial.write(b1[8]);
			Serial.write(b1[9]);
			Serial.write(b1[10]);
			Serial.write(b1[11]);
			Serial.write(b1[12]);
			Serial.write(b1[13]);
			Serial.write(b1[14]);
			Serial.write(b1[15]);
			Serial.write(b1[16]);
			Serial.write(b1[17]);
			Serial.write(b1[18]);
			Serial.write(b1[19]);
		}
		else
		{
			Serial.write(b0[0]);
			Serial.write(b0[1]);
			Serial.write(b0[2]);
			Serial.write(b0[3]);
			Serial.write(b0[4]);
			Serial.write(b0[5]);
			Serial.write(b0[6]);
			Serial.write(b0[7]);
			Serial.write(b0[8]);
			Serial.write(b0[9]);
			Serial.write(b0[10]);
			Serial.write(b0[11]);
			Serial.write(b0[12]);
			Serial.write(b0[13]);
			Serial.write(b0[14]);
			Serial.write(b0[15]);
			Serial.write(b0[16]);
			Serial.write(b0[17]);
			Serial.write(b0[18]);
			Serial.write(b0[19]);
		}
		flg = false;
	}
}

```

以上。
いい加減で良い加減な進捗管理

AdventCalendar、解散カレンダー四日目です。
こんな事してる暇なんて無いのに何してるんでしょうね？

今回は進捗管理についてのお話

「さぁ制作の始まりだ！でもこの人達と組むの初めてだし誰がどれぐらいの力量もってるかわからん・・・」
なんて事ありますよね？
そうなると進捗管理する側としては作業見積もりが曖昧になり全体管理に支障がでてしまうでもわざわざそれらを知るために時間を割く時間もないしもう駄目だお終いだ。

なんて時にやってみた進捗管理方法です。

# **まずはいい加減でいいじゃない**
とりあえず何もタスクを与えない訳にはいかないので何かしらのタスクを与えましょう。
「取り合えずコレを〇日から〇日までにやって」
と期限をいい加減にしてタスクを振ります。
(勿論ですが普段はそんなクソみたいな振り方はしないように)
この時”〇日まで”の部分は必ずデッドライン前にします、要はちょっとキツ目に期限を設定します。
嫌らしいですがお互いに素性がわかってないので平気平気。

そしてそのタスクがいつ上がるかを待ちます・・・
上がったらその与えたタスクの出来をいくつかの項目に分けて見ましょう

# **いい加減度をチェック**

- 期間内に終わったか

一つ目の確認は楽ですね、カレンダー見りゃわかります。
これでその人の進捗スピードを確認できます、そりゃそうだ。
ここで忘れちゃいけないのがちょっとキツ目に期限を設定している事です、口頭で言った期限内で終わったらそれは予想より早く出来ている事になるので万々歳です。
※この時あえてキツく設定した事はお互いの為に伏せておきましょう

- 出来栄えはどうか

二つ目の確認は少々技術面が関わってきますね。
出来栄えについての判定が難しいのなら他の信頼できる人間に頼んだ方が無難です、別に全部一人でやる必要なんてないんです使える物は使いましょう。
そしてここでの確認で大切な事が一つ、それは期限との兼ね合いを考えましょう。
時間は掛かったけど出来は良い、早いけど粗があるなどその人の性格を知る上でも重要なものになるのでよく見て考えましょう。

- 本人はキツそうか

三つ目の確認は適当にコミュニケーションをとって感じましょう、そうとしか言えません。
「メッチャ早く出来たしメッチャ出来も良いじゃん！！」
と思ってもその時本人をよく見ると、目のクマが酷い事になってるなどあると後が大変ですね。
「どうだった？難しかった？」
「なんか困ったことあった？」
など気遣ってあげましょう。

# **いい加減から良い加減へ**
以上のやり方を数回重ね、徐々にいい加減な部分を詰めていく。
相手がどれだけ出来てどれが苦手でどんな性格なのかなど考慮してその人に合ったタスクを良い加減で振って管理してあげましょう。

# **おわりに**
進捗管理は人間管理、相手を知り相手に知ってもらう事が大切です。
自身の持つ机上の空論を押し付けるのではなく互いに理解しあった理論で進めていきたいものですね。
今回はここまで( ◔ ౪ ◔)
【ajaxzip3】郵便番号入力後にフォーカスを自由に移動させる方法

# ajaxzip3とは
郵便番号から住所を引っ張ってきてくれる便利なライブラリです。
使い方などはこちらの記事にまとまっていましたので、実際に使ってみたい方はこちらを参考にすると良いと思います。
https://qiita.com/macer_fkm/items/2fbeceb0e1d93ad4a1f1

ちなみに、現在は`yubinbango`というライブラリを推奨しているようです。 
https://github.com/yubinbango/yubinbango

# 背景
`ajaxzip3`で郵便番号を入力した後のフォーカスを市区町村の入力場所ではなく、番地の入力場所に移動させたいという状況になりました。

![Untitled2.gif](https://qiita-image-store.s3.amazonaws.com/0/68663/66b33b91-74d8-b520-fc11-d7cb3083c25c.gif)

ソースコードはこんな感じです。

```html
<!DOCTYPE html>
<html>
  <head>
    <script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>
  </head>
  <body>
    <div>
       <p>郵便番号</p>
       <input onkeyup="AjaxZip3.zip2addr(this,'','pref','address');" name="zip">
       <p>都道府県</p>
       <input type="text" name="pref">
       <p>市区町村</p>
       <input type="text" name="address">
       <p>番地、建物名</p>
       <input type="text" name="address2">
    </div>
  </body>
</html>
```
# 方法
どうやら、`zip2addr`の第７引数に自動フォーカスするためのフラグがあるようなので、これを`false`に設定し、自動フォーカス機能を切っておきます。

フラグに関してはこちらのPRに載っていました。
https://github.com/ajaxzip3/ajaxzip3.github.io/pull/1

```js
AjaxZip3.zip2addr(this,'','pref','address', '', '', false);
```

あとは、コールバックメソッドの`onSuccess`（住所検索が成功した時に呼ばれる）にフォーカスしたい場所を記述すればOKです。

```js
// JQuery使ってるならこんな感じ
AjaxZip3.onSuccess = function() {
  $('input[name=address2]').focus(); // 番地、建物名にフォーカス
};

// 純粋なJSで書くならこんな感じ
AjaxZip3.onSuccess = function() {
  document.getElementsByName('address2')[0].focus(); // 番地、建物名にフォーカス
};
```

こちらのコールバック機能もPRに載っていました。
https://github.com/ajaxzip3/ajaxzip3.github.io/pull/2

# 実際に動かしてみる
郵便番号を入力し終わると番地、建物名にフォーカスを移動させることができました。

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/68663/1f8b7a3c-a08a-126a-19c5-bc9f78998eb7.gif)

# まとめ
フォーカスを自由に移動させたい場合は
1. `zip2addr`メソッドの第７引数を`false`に設定する
2. `onSuccess`コールバックの中でフォーカスしたい場所を指定する

自由に移動させるのに結構時間食いました。
それではまた。
Windows > 画面外に出て行ったウィンドウを連れ戻す > 最大化してから、ウィンドウ上部(タイトルバー)を下にドラッグ

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
```

関連:
[画面外に出て行ったウィンドウを連れ戻す](https://qiita.com/autch/items/ec60318355ed1fd17417)

### 症状

NonSoftさんのTCP/IPテストツールを使おうとした。
http://nonsoft.la.coocan.jp/Download/SocketTool/index.html

起動したが、ウィンドウが表示されない。

[Winキー] + [カーソル上]でも連れ戻せない。
@autchさんの記事を参考にしながら、「移動」しようとしても連れ戻せない。

@autchさんの記事を参考にしながら、以下とした。

1. タスクバーで該当ソフトを選択状態にする
2. Alt + スペースキー
3. 最大化
4. 最大化したウィンドウの上部(タイトルバー)を持って下にドラッグ
    - > ウィンドウサイズが通常起動時のサイズになる
    - > 適正な位置になる

### 起きていた事象

該当ソフトは.iniにウィンドウの設定情報を保持するようだ。
その中身を見て気になったのが以下の部分

```
[POS]
XPOS=-32000
YPOS=-32000
```

ソフトの問題か、Windows 10の問題か、どちらかで位置情報がおかしな値になっている。

この場合は[Winキー] + [カーソル上]でも連れ戻せないのかもしれない。

(追記)
上記の位置情報はウィンドウが「最小化」の時のようです。
https://stackoverflow.com/questions/1478765/location-coordinates-on-computer-showing-x-32000-y-32000

### 対策の別案

.iniファイルに設定が残っているので、問題なければ.iniファイルを削除するか編集して対応するという案もある。
[PostgreSQL] 接続中のセッションを切断する

`pg_terminate_backend`関数を使うとセッションを切断することができますが、引数に`PID`を指定しなければならないので、まずそれを調べる必要があります。

ということで`pg_stat_activity`ビューを使って現在接続中のプロセスを確認してみましょう。

```psql
select * from pg_stat_activity;
```

いくつか項目が表示されるので、調査の役に立ちそうなやつだけ意味を調べてみます。
詳細を知りたい方は公式ページをご覧ください。
https://www.postgresql.jp/document/9.2/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW

* `datname`  
  接続しているデータベースの名前。
* `pid`  
  プロセスID。これをセッションの切断に使います。
* `usename`  
  接続しているユーザ名。
* `application_name`  
  接続しているアプリケーション名。
* `client_addr`  
  接続しているクライアントのIPアドレス。
* `backend_start`  
  クライアントがサーバに接続した時刻。
* `xact_start`  
  トランザクションが開始した時刻。トランザクション実行中でなければNULL。何か値が入っていて長時間経過していればデッドロックの可能性あり。
* `query_start`  
  直前のクエリを実行開始した時刻。
* `waiting`  
  ロック待機中の場合は`t` (true)
* `state`  
  * `active` - 問い合わせ実行中。
  * `idle` - 次のコマンドを待機中。  
  (※他にもあるけどよく分かりませんでした。あまり出番がない気がします)
* `query`  
  直前に実行したクエリ。

これらの情報を元に怪しいプロセスの`PID`を特定したら、`pg_terminate_backend`関数に`PID`を渡して切断します。

```psql
select pg_terminate_backend(9999); 
```

1つ1つ切断するのが面倒なら、`pg_stat_activity`の検索結果の`PID`をそのまま`pg_terminate_backend`関数に渡すこともできます。

```psql
-- 5時間以上前にクエリを実行したプロセスを全て切断
select pg_terminate_backend(pid) from pg_stat_activity
where query_start < current_timestamp + '-5 hours';
```

以上です。
命名規則まとめ

意外となかったのでまとめ

名称|用例|備考
---|---|---
Upper camel case(アッパーキャメルケース)|SampleTestData|先頭大文字
Lower camel case(ロワーキャメルケース)|sampleTestData|先頭小文字
Screaming snake case(スクリーミングスネークケース)|SAMPLE_TEST_DATA|大文字
Snake case(スネークケース)|sample_test_data|小文字
Kebab case(ケバブケース)|sample-test-data|ハイフン区切り
Train case(トレインケース)|Sample-Test-Data|単語先頭が大文字