OmniAICreator/Qiita-1.07M huggingface dataset:
よく使う記述のメモ

調査とかでよく使う記載のメモ帖

##リンク先から特定の要素を抽出してコンソールにあれするあれ
```javascript:listAre
$('リスト要素').each(function(index) {
	var thisLink = $(this).find('a').attr('href');
	$.ajax({
		 type: "GET"
		,url: thisLink
	}).done(function( msg ) {
		var thisObj = $(msg);
		var thisDetail = thisObj.find('ぶっこぬき対象のセレクタ').text();
		console.log( thisLink + ':' + thisDetail );
	});
});
```

##facebookのコメント欄のデータを区切り文字で区切って抽出するあれ
あれする前に jQueryソース（ https://code.jquery.com/jquery-1.11.3.min.js ）を Consoleに貼る

```javascript:facebookAre
// .UFIContainer のIDを使う
$('#（コメントのラッパー要素のID） ._3b-9 .UFIRow').each(function(index) {
	var tSep = '<>';
	var thisAre = tSep + index;
	thisAre += tSep + $(this).find(".UFICommentActorName").attr("href");
	thisAre += tSep + $(this).find(".UFICommentActorName").text();
	thisAre += tSep + $(this).find(".UFICommentBody span").text();
	thisAre += tSep + $(this).find(".uiLinkSubtle abbr").attr('title');
	console.log(thisAre);
});
```
twitterをmobile twitterで開き直すbookmarklet

新しくbookmark作って下記をURLにコピーする。

```javascript
javascript:var%20host%20=%20location.hostname;var%20path%20=%20location.pathname;if(host==='twitter.com'){window.location.href%20='https://mobile.'+host+path};
```

最近できたtwitterのブックマーク機能はモバイルからしか使えない。いまのところAPIも公開されていないようなので作ってみました。
Visual Studio Tools for AIを使う

昨年のIgniteで発表されたAI系のツール、開発環境群の中で、Visual Studio Tools for AIはVisual Studioの拡張機能としてリリースされた各種Deep Learningフレームワークを操るためのツールである。

[Microsoft Visual Studio Tools for AI ](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vstoolsai-vs2015)

Deep Learningでは主流なPythonやC,C++のサポートを中心に、Visual Studioから、DL処理でよく行う作業を支援するツールとなっております。
ビルド、テスト、デプロイを直感的なインターフェイスで効率よく開発できるようになっており、すべてをコードで行わなくても良くなっております。

# インストール

以下のインストラクション通りですが、VS拡張はいつもの調子でやるだけです。事前の前提条件は特にありません。

[インストール](https://docs.microsoft.com/ja-jp/visualstudio/ai/installation)

[ツール] > [拡張機能と更新プログラム] を選択します
からTools for AIを探してみましょう。

これでディープラーニングができるようになるわけではなく、基本的には手動で各種フレームワークをセットアップする必要があります。
この辺はAnacondaやDockerなどが提供する機能で簡単に済ませると良いと思います。

## GPU環境

これは、お決まり通り、NVIDIA GPU ドライバー、CUDA、cuDNNの順に入れていきます。

## Python

互換性のためと書かれてPython 3.5.4を薦められています。Anacondaでもいいでしょう。
そして、Python Tools for Visual Studio (PTVS)をインストールします、これはVisual Studio 2017のData Science Workloadをインストールしている人ならすでに入っています。
以下のPATH指定を忘れずに。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/26fc02bb-7f2e-6641-4042-77528d57b3a8.png)


## Deep Learning framework

CNTK, Tensorflow, Caffe2, MXNet, Keras, Theano, PyTorch, Chainerを入れます。
というか、全部を入れる必要はないと思いますが、一応これだけのものに対応しているということです。

しかし、インストールに関して、このツールやMicrosoftツールによる支援は全くありません（汗）

# 使ってみる

以下を試験的に起動してみてください。VS内で実行されるだけなので、PTVSを入れた段階とそれほど変わらないと思います。

[クリックスタート](https://docs.microsoft.com/ja-jp/visualstudio/ai/tensorflow-local)

githubにコミットされている、サンプルソリューションを元に、MNISTなどの代表的なものは実行するだけで試すことができます。

今後、ここにアップデートします。
新･PHPでのnullチェックとjs変数のデフォルト値について


その名は
**『null合体演算子』**
isset地獄からサヨナラできます。（注：PHP7以降）

```
○ = △ ?? □;
```
△がnullなら□を返却します。


配列での値のチェックもできる！！

```hoge.php
<?php

$basket = ["apple" => 1, "melon" => 2, "strawberry" => 3];

$breakfast = $basket["apple"] ?? "banana";
$lunch = $basket["peach"] ?? "banana";

echo($breakfast); // 1 が出力
echo($lunch);     // banana が出力

```


### 余談
---
そういえば似たようなことがjsでもできましたね。
**nullとかundefinedの場合に初期値を設定する方法**

```hoge.js
/**
* getHoge("東京",null);
* 
**/
function getHoge(argA, argB) {
  var hoge = argA || "日本",
      fuga = argB || "米国";

  console.log(hoge); // 東京 が出力
  console.log(fuga); // 米国 が出力
}

```
ReactNativeアプリをExpo経由で開こうとしたら開けなかった時の対処法

# はじめに
ReactNativeアプリをExpo経由で開こうとすると、Timed out, no manifest in cache　と表示されてしまった。
エミュレータだと開けるので、ネットワークがあやしそう。

# 結論
VMwareのネットワークアダプタが悪さしてました。
expo向けのサービスは優先度が一番高いネットワークで開始されるみたい。

windowsの場合はコマンドプロンプトでipconfigをしてみて一番上にいるのが優先度が高いネットワークの模様。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131037/8e8b1a35-d4a6-eff2-e390-e759784c52d7.png)


expo経由でアプリを表示させたいスマホのネットワークと同じネットワーク内のアダプタが最上位になるように、設定を変更する必要がある。

# 設定
<ネットワークと共有センター>⇒<アダプターの設定の変更>⇒<優先度を上げたいアダプターを右クリック>⇒<プロパティ>⇒<TCP/IPv4プロパティ>⇒<詳細設定>⇒<自動メトリックのチェックを外して、メトリックを指定。１が最強。>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131037/10dfc39d-a18e-d2ff-1f00-a964f9deefa6.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131037/a1f7a9f2-3dca-a9af-8834-a473fb4c3880.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131037/33325746-5e0c-08ae-34f9-b89d2a258132.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131037/1187741b-eb1c-957c-b92e-96899b16b7e7.png)
react AWS S3で連携してWEBアプリケーションを作る

## react AWS S3で連携してWEBアプリケーションを作る

## react app作成
```
$ npm i -g create-react-app
$ create-react-app test_app
$ cd test_app
```

## ローカルで実行する

```
$ npm start
```

## ローカル実行画面
![スクリーンショット 2018-03-13 14.53.50.png](https://qiita-image-store.s3.amazonaws.com/0/88511/c7f6b5dd-af0a-1be1-e671-e3daed68cf3f.png)


## AWS CLIのインストール
 - https://qiita.com/yuyj109/items/3163a84480da4c8f402c
 
## AWS S3 バケット作成、設定
 - バケット作成
 
## バケットのプロパティの設定
 - バケットのプロパティのタップを選択しインデックスドキュメント、エラードキュメントにindex.htmlを入力する
 - エンドポイントもメモとく
  
![S3 Management Console 2018-03-13 14-49-51.png](https://qiita-image-store.s3.amazonaws.com/0/88511/65101602-5204-0509-1277-6929d02b21e4.png)



## build、S3にアップロード
```
$ npm run build && aws s3 sync build/ s3://バケット名
```

## バケットにファイルがアップされたかを確認する

![スクリーンショット 2018-03-13 14.51.36.png](https://qiita-image-store.s3.amazonaws.com/0/88511/cea851ad-ea88-e578-8258-10b2ce0947fc.png)


## メモといたエンドポイントで確認する

![スクリーンショット 2018-03-13 14.53.50.png](https://qiita-image-store.s3.amazonaws.com/0/88511/a6327480-4143-4250-b357-7987e015b219.png)
AE　シェイプレイヤーの塗りにエクスプレッションを一括で適応　+ラベルの色も変更

メモ用です。

プロパティを持っている状態で

```js

//選択アイテムをselItemとする
var selItem = app.project.selection[0];
//選択レイヤーをselLayとする
var selLay=selItem.selectedLayers;

app.beginUndoGroup("undo");//アンドゥグループ開始
for(var i=0; i<selLay.length; i++){
        var myLay=selItem.selectedLayers[i];
        myLay.property("ADBE Root Vectors Group").property("ADBE Vector Group").property("ADBE Vectors Group").property("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color").expression='thisComp.layer("調整レイヤー 3").effect("カラー制御")("カラー")';
        myLay.label=(1)
        }
    app.endUndoGroup();//アンドゥグループの終わり

```
ipa 書き出し時の「Failed to verify bitcode in ...」というエラーの解決法について

エラーについての情報が少なかったので投稿


# 概要
`Carthage` で Framework をいくつか追加していて、
いざ ipa を書き出そうとしたら、こういうエラーが出た

<img width="422" alt="スクリーンショット 2018-03-13 12.50.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/19668/79ac7f03-c990-e6d7-6ca1-23c949a9b062.png">

```
An error occurred during export

Failed to verify bitcode in *****.framework/
Neptune:
error: Clang option verification for bitcode 01
(unrecognized arguments: -disable-llvm-passes)
```
-disable-llvm-passes の部分は、Framework によって arm64 とか書いてたりした

ipa 書き出せないのすごい困った

# 解決法

## 1. Carthage で追加した Framework を消して、Cocoapods で入れる
エラーが表示された Framework を Cocoapods に置き換えて試したところ、
別の Framework のエラーが表示されたので
多分効果ある

多分、と言ってるのは、
自分の場合、１つだけ Cocoapods に置き換えらない Framework があって
最後まで試せなかったため

## 2. Xcode8 ではなく Xcode9 で ipa を Archive/Export する
Xcode8 と Xcode9 を両方インストールして、諸事情で Xcode8 で開発を続けてたけど
Xcode9 で書き出してみたら通った

これで Carthage を Cocoapods に書き換える作業が全部いらなくなった

## 3. その他
> Balto開発で得たiOSのSDK開発の知見 on @Qiita
> https://qiita.com/HirokiTerashima/items/a94f9720b02b7861f48f

わからん
JavaのLocalDateTime.now()のタイムゾーンはどこ？

JavaのLocalDateTime.now()は、デフォルトのタイムゾーンを取得するとあるけど、実際どうなのかやってみました。

ソースコード

```Java
package test;

import java.time.LocalDateTime;
import java.time.ZoneId;

public class Test {
    public static void main(String[] args) {
        System.out.println("LocalDateTime.now() " + LocalDateTime.now().toString());
        System.out.println("LocalDateTime.now(ZoneId.of(\"Asia/Tokyo\") " + LocalDateTime.now(ZoneId.of("Asia/Tokyo")).toString());
        System.out.println("LocalDateTime.now(ZoneId.of(\"GMT\") " + LocalDateTime.now(ZoneId.of("GMT")).toString());
    }
}
```

実行結果（日本時間の3月13日14時33分に実施しています）

```
LocalDateTime.now() 2018-03-13T14:33:01.625
LocalDateTime.now(ZoneId.of("Asia/Tokyo") 2018-03-13T14:33:01.625
LocalDateTime.now(ZoneId.of("GMT") 2018-03-13T05:33:01.625
```
JUnit 実行時に@Autowired されていない

JUnit 実行時にNullPointerExceptionが出て詰まった。

非テストクラス側でAutowiredしているはずなのに、nullが出てしまう。

```java:Sample.java
public class Sample{
   @Autowired
   private Hoge hoge; //←テスト実行時null
    
   /** 以下メソッド*/
} 
```

##原因
テストコード側で、Autowiredしていなかった。

```java:SampleTest.java
public class SampleTest{
   @Autowired
   private Hoge hoge; //忘れてた
    
   /** 以下メソッド*/
} 
```


Spring実行時にInjectionされるから、気にしなくていいと思っていたけどテスト側でも宣言しないといけないんやね。
rails、君に決めた！！~目次

#[rails、君に決めた！！~1](https://qiita.com/satousatou/items/fa09357070783846709e)
### 環境構築
#[rails、君に決めた！！~2](https://qiita.com/satousatou/items/f7374ada93b793624160)
### アプリ開発前の準備
- サーバーの立ち上げ
- デバッグ
- Railsの基本コマンド


#[rails、君に決めた！！~3](https://qiita.com/satousatou/items/d7fa798d858af0ec9cd0)
### アプリ開発
- ルーター

#[rails、君に決めた！！~4](https://qiita.com/satousatou/items/44aee1d2f67e909f3ce1)
### アプリ開発
- コントローラ

#[rails、君に決めた！！~5](https://qiita.com/satousatou/items/e38c18558d37eae7f66a)
### アプリ開発
- セッション管理
- エラーハンドリング

#[rails、君に決めた！！~6](https://qiita.com/satousatou/items/853dfedd27beb78edc03)
### アプリ開発
- ルーターの整理



#[rails、君に決めた！！~7]()


#[rails、君に決めた！！~8]()

#[rails、君に決めた！！~9]()

#[rails、君に決めた！！~10]()

#[rails、君に決めた！！~11]()

#[rails、君に決めた！！~12]()

#[rails、君に決めた！！~13](https://qiita.com/satousatou/items/b760beb498a3421e7fbe)
### アプリ開発
- テスト基礎編

#[rails、君に決めた！！~14]()

#[rails、君に決めた！！~15](https://qiita.com/satousatou/items/1e9b5079341897edfc88)
### 運用編
- 初期環境設定

#[rails、君に決めた！！~16]()

#[rails、君に決めた！！~17]()
TOPPERS/FMPカーネルソース勉強会(0) docker, build_fmp.sh

TOPPERSのC++のconfiguratorを使い、FMPカーネルをコンパイルするshell scriptを用意
~/workdir/scripts/build_fmp.sh〜

 <この項は書きかけです。順次追記します。>

```build_fmp.sh
#!/usr/bin/env bash
set -eu

cd $HOME/workdir
wget https://releases.linaro.org/components/toolchain/binaries/7.1-2017.08/aarch64-elf/gcc-linaro-7.1.1-2017.08-x86_64_aarch64-elf.tar.xz
mkdir aarch64-elf-gcc
tar xvf gcc-linaro-7.1.1-2017.08-x86_64_aarch64-elf.tar.xz -C aarch64-elf-gcc --strip-components 1
echo 'export PATH=$HOME/workdir/aarch64-elf-gcc/bin:$PATH' > ~/.bash_profile
source ~/.bash_profile

wget http://www.toppers.jp/download.cgi/cfg-1.9.6.tar.gz
mkdir cfg-1.9.6
tar xvf cfg-1.9.6.tar.gz -C cfg-1.9.6 --strip-components 2
cd cfg-1.9.6
nkf -e -Lu --overwrite configure
./configure --with-libraries=/usr/lib/x86_64-linux-gnu/
make
cd ..
echo $PATH
# build a FMP kernel
git clone https://github.com/YujiToshinaga/RPi64Toppers.git
cd RPi64Toppers/fmp
mkdir cfg
cd cfg
mkdir cfg
cd cfg
ln -s ../../../../cfg-1.9.6/cfg/cfg cfg
cd ../../
mkdir build; cd build
perl ../configure -T rpi_arm64_gcc
make fmp.bin

exit 0
```

# バイナリのクロスコンパイラのダウンロードと展開

```
wget https://releases.linaro.org/components/toolchain/binaries/7.1-2017.08/aarch64-elf/gcc-linaro-7.1.1-2017.08-x86_64_aarch64-elf.tar.xz
tar xvf gcc-linaro-7.1.1-2017.08-x86_64_aarch64-elf.tar.xz -C aarch64-elf-gcc --strip-components 1
```
# PATHの宣言と有効化

```
echo 'export PATH=$HOME/workdir/aarch64-elf-gcc/bin:$PATH' > ~/.bash_profile
source ~/.bash_profile
```
# configuratorのダウンロードと展開・構築

```
wget http://www.toppers.jp/download.cgi/cfg-1.9.6.tar.gz
mkdir cfg-1.9.6
tar xvf cfg-1.9.6.tar.gz -C cfg-1.9.6 --strip-components 2
cd cfg-1.9.6
nkf -e -Lu --overwrite configure
make
```
#Raspberry pi用toppers/fmpのダウンロード

```
git clone https://github.com/YujiToshinaga/RPi64Toppers.git
```

# 難解1 configuratorの置き場所

```
cd RPi64Toppers/fmp
mkdir cfg
cd cfg
mkdir cfg
cd cfg
ln -s ../../../../cfg-1.9.6/cfg/cfg cfg
cd ../../
```
# configuration and make

```
mkdir build; cd build
perl ../configure -T rpi_arm64_gcc
make fmp.bin
```

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 　20180313
ver. 0.02 ありがとう追記　20230513
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
CircleCI v2 にするときに、デバッグで試したこと

# 前提

`origin` と `upstream` の remote を持っています。

`git push origin hoge` して、その後 GitHub からプルリクをつくって、CircleCI が回ります。

そのときに、 `Rebuid with SSH` していろいろ動きをみていました。

![スクリーンショット 2018-03-13 13.42.01.png](https://qiita-image-store.s3.amazonaws.com/0/45822/acbbd401-ab7c-c589-9438-e8ff6c25886d.png)

今回は、 staging サーバにデプロイするという設定です。


# SSH Permissions

![スクリーンショット 2018-03-13 13.46.06.png](https://qiita-image-store.s3.amazonaws.com/0/45822/f00d8eec-6c3c-8ad8-6d7b-044cdb6fe580.png)


これは、ローカル Mac で適当に鍵をつくって、 `id_rsa_hoge.pub` を staging サーバに登録して、 `id_rsa_hoge` を CircleCI に登録しました。

これで、CircleCi コンテナから、staging サーバへ `ssh` できるようになりました。

# Checkout SSH keys

これ、ちょっと謎。勉強しないと。

結局よくわからなくて、staging から `git clone` できるようにするために、鍵をつくって GitHub に登録しなおした。

だから staging の `.ssh/config` は以下のような感じ

```console
[ec2-user@release_server ~]$ cat .ssh/config
Host github.com
    HostName github.com
    IdentityFile ~/.ssh/id_rsa_staging
    TCPKeepAlive yes
    IdentitiesOnly yes
    User git
```

# CircleCI の環境変数

ここに一覧があります。便利です。
https://circleci.com/docs/1.0/environment-variables/


### 特定のユーザー配下へのマージのときだけ deploy を動かしたい

今回、ざっくり以下のようなデプロイコマンドを書いていました。

```yaml:.circleci/config.yml_抜粋
- deploy:
    name: Deploy
    command: |
      if [ "${CIRCLE_BRANCH}" == "staging" ]; then
        bundle exec cap staging deploy
      elif [ "${CIRCLE_BRANCH}" == "master" ]; then
        bundle exec cap production deploy
      fi
```

これだと、 `mochizukikotaro/project_name` へのマージでも `company_name/project_name` へのマージでも `staging` ブランチへのマージだと、デプロイが動いてしまいます。

これは辛いです。 `company_name/` のときだけデプロイをしたいです。

ということで、環境変数の `CIRCLE_PROJECT_USERNAME` を使います。

```
if [ "${CIRCLE_PROJECT_USERNAME}" == "basicinc" ]; then
```

としました。この辺は workflow つかったりして、コードを綺麗にしたい気持ちなりました。（まだしてない）
ShellScriptでsqlを定期実行

## やりたいこと

MySQLに何かを定期的に実行させるということをShellScriptで実現させる。

## 環境

* MySQL 5.5
* Bash 4.2.46

## 手順

1. mysqlのコマンドを実行するShellScriptを書く
2. crontabに定期実行のタスクを登録する

## 1. mysqlのコマンドを実行するShellScriptを書く

`mysql.sh`的なファイルを作成する。
作成したら、中に以下を記述していく

```sh
#!/bin/bash

#------------------------------------------------
# date variables
#------------------------------------------------
YEAR=$(date +%Y)
MONTH=$(date +%-m)
DAY=$(date +%-d)
UNIX_TIME=$(date +%s)

#------------------------------------------------
# mysql variables
#------------------------------------------------
MYSQL_USER='hoge'
MYSQL_PASSWORD='hoge'
MYSQL_HOST='localhost'
MYSQL_DATABASE='hoge_db'
# 以下に実行したいsql文を書く
MYSQL_SQL="UPDATE articles SET update_y = $YEAR, update_m = $MONTH, update_d = $DAY WHERE publish_status = \"public\";"

#------------------------------------------------
# do
#------------------------------------------------

eval "mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_DATABASE --password='$MYSQL_PASSWORD' > ~/hoge-backup.sql"
eval "mysql -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_DATABASE --password='$MYSQL_PASSWORD' -e '$MYSQL_SQL'"
```


### 注意が必要な部分

* ShellScriptからMySQLのクライアントを操作する場合、パスワードの入力を手動でしないように`--password='パスワード'`としなければならない。
* `MYSQL_SQL`のSQL文の最後の方で`public_status`（公開設定のフラグ）をbool型で定義していないのはわざとで、文字列の場合上記のようにダブルクウォーテーションをエスケープする必要がある
* シングルクウォーテーションとダブルクウォーテーションで変数の宣言がふた通りあるのは、変数内でさらに変数を呼び出したい場合や式を展開したい場合は、後者を使い、それ以外は前者ということ。

## 2. crontabに定期実行のタスクを登録する

まずはcronが使えるかどうか確認していきます。

```
$ sudo service crond status
```

上記でrunningと返って来ればいいと思います。

様々なサイトで`crontab -e`でエディタを開いてタスクを登録する方法が記載ありますが、`crontab -r`でタスクが全て消えてしまうので、タスクをファイルに記述して、登録をするという方法をで行いたいと思います。

## cron.scheduleファイルを作成

ファイル名はなんでもいいのですが、`cron.schedule`としておきましょう。

自分はvimを使って編集するので、`vi cron.schedule`としてエディタを開きます。

```vim
SHELL=/bin/bash
MAILTO=""

0 9 * * 1 sh mysql.sh
```

シェルをbashと指定し、cronが実行された際にメールの送信は不要なので、`MAILTO=""`としています。

`0 9 * * 1 sh mysql.sh`の部分が定期的に実行したいタスクです。
文法は`* * * * * 実行したいコマンド`となります。

上記の例ですと、毎週月曜日の午前9時00分にmysql.shのシェルスクリプトを実行するというようになっています。

実行タイミングに関しては、[こちら](https://qiita.com/katsukii/items/d5f90a6e4592d1414f99)の記事が大変参考になります。

## crontabに登録

```
// 先ほど作ったcron.scheduleを登録
$ crontab cron.schedule

// 以下で登録出来ているか確認出来る
$ crontab -l

// 登録しているタスクを削除したい場合は以下
$ crontab -r
```


理解が怪しい部分が多々あるので、ツッコミお待ちしておりますm(_ _)m
Server Timing APIでサーバーの処理時間を可視化する


# Server-Timing API
W3Cによって策定されている各種Timing APIは、Webのパフォーマンスを計測するためのAPIです。そのうち`Server-Timing API`は、サーバー側の処理に要した時間を示します。
Google Chromeではバージョン65より、レスポンスヘッダに付与した`Server Timing API`の値がDeveloper ToolsのNetworkタブで表示されるようになりました。この機能により、サーバー側における処理時間を簡潔に確認することができるようになっています。

# Server-Timingを使ってみる
Node.jsで*Hello World!*を表示するだけのコードをもとにして、`Server-Timing`を試してみましょう。
以下のコードでは、`Server-Timing`レスポンスヘッダに適当な値をセットしています。

```javascript:main.js
const http = require('http');

http.createServer((req, res) =>{
  // 処理にかかった時間を適当に定義
  const startup = 2.3;
  const dbread= 10.6;

  res.writeHead(200, {
    'Content-Type': 'text/html',
    'Server-Timing': `su=${startup};"Start-up",db-read=${dbread};"Database Read"`
  });
  res.end('Hello World!');
}).listen(8080);
```

Chromeでこのページを表示してからDeveloper ToolsのNetworkタブを選択し、当該リクエストのTimingを確認すると次のように表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12152/2d42fbc3-76dc-3268-f622-9f89b7333ffb.png)

各種処理時間がグラフとともに表示され、一瞥することができます。

なお、`Server-Timing`レスポンスヘッダには、計測対象としたいメトリクスを好きなだけ追加することができます。この機能を使えばサーバー側のパフォーマンスチューニングに役立ちそうですね😊

# 参考
[New in Chrome 65](https://developers.google.com/web/updates/2018/03/nic65)
[Server Timing](https://w3c.github.io/server-timing/#dom-performanceservertiming)
[パフォーマンスに関する各種ブラウザAPI - EagleLand](https://1000ch.net/posts/2016/performance-api.html)
aws cliが古くてAWS BatchのジョブでIAMロールの権限がつけられなかった

AWS BatchのジョブでIAM権限のエラーが出てしばらくハマったので内容をメモしておきます。

## 発生した現象

AWS Batchのジョブ中でaws cliを使ってaws cpしても以下のようにエラーになった。

```
$ aws s3 cp s3://[バケット名]/test /app --recursive
A client error (AccessDenied) occurred when calling the ListObjects operation: Access Denied
```

ジョブ定義で設定されているジョブロールを以下のようにしてもダメ

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}
```

## 原因と対応

Batchで使っているaws cliが1.4.2と古すぎてBatchが利用しているECSをサポートしていなかった。
もらったDockerイメージをあまりよく確認せずに使ってapt-get install awscliしていた。
pip install awscliにしたら最新のaws cliが入って正常に動作した。
Windows10のPleiades（PyDev）でGUI上からpipできるようにする

# はじめに

普段はペチパーですので、初心者向けPython開発環境を無料で整えるには、Pleiadesさんしかないかととりあえずインストールしてみたんですが、どうせならGUIでpipしたいよねってことでメモります。

# この投稿のゴール

下記の環境を構築して、eclipseのGUI上からpipを使ってライブラリをインストールできるようにする。

|name|version|
|:--:|:--:|
|Windows|10|
|Eclipse| 4.7 Oxygen|
|Python| 2.7.14|
|setuptools| 28.8.0 |
|Pip| 9.0.1|


# Pleiades Pythonをインストール
http://mergedoc.osdn.jp/
から下記のように選んでzipをダウンロードします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/ea23c81f-29c3-1134-81f9-1f5e98e33c1d.png)

downloadフォルダでZIPを開くと**pleiades**ってフォルダがあるので、Cドライブにドラッグ＆ドロップしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/bb991183-055c-0747-436d-ff69e4d1a472.png)
*３万個程度の合計２G程度のファイルたちがコピーされるので、気長にお待ちください。*

**C:\pleiades\eclipse** まで移動して**eclipse.exe**をダブルクリックしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/452d1ed6-45b5-57ce-f2a4-05e45f9cdeb2.png)

初回はごにょごにょ何かしら動いて、こんなんでますが、チェックを付けて起動してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/28a17a6a-4671-fef1-e26b-ae8d8419906f.png)

**選択された変更を適用**をクリックしてください。
eclipseの画面が起動したら、とりあえず成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/a913090b-39f4-09ac-830a-2ebec305ec8b.png)


# Pythonの設定
設定を開きます。
**推奨設定**をやっておくといいことがあるかもなので、やっておきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/7b65fed5-1626-c67d-6aa8-f4209b8db339.png)

Pythonといえば、豊富なパッケージってことで、ここでがつがつインストールすっぞ！と思ったら、動かないんですよ。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/63d592c3-daaa-2530-ca92-aa04c9fbb9b6.png)

そこで下のURLを右クリックして**名前を付けてリンク先を保存**を選んでください。
https://bootstrap.pypa.io/ez_setup.py

今回は、python2系の環境ってことで、**C:\pleiades\python\2**へ移動し、保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/f6f56f04-2b0f-a1d3-93f7-16a3121d9e99.png)

**C:\pleiades\python\2**のフォルダまで移動して、下記のようにPowerShellを開いてください。
（コマンドプロンプトでもいいですので、２のフォルダへ行ってみてください。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/43b5c914-306a-e92d-5bee-6ed7aacbe554.png)

``.\python.exe  .\ez_setup.py  --insecure``
と入力して、Enterを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/4498dcc1-410f-a533-9fd3-59a3c57d4e30.png)

```text
....
Processing dependencies for setuptools==33.1.1
Finished processing dependencies for setuptools==33.1.1
```
みたいになって止まったら、立て続けに
``.\Script\easy_install.exe pip``
と入力して、Enterを押します。するとこんな感じで終われば成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/4bf5dd3f-b5f0-fccd-96ae-8a9846247988.png)


Eclipseに戻ると、こんなんが出てたら、**選択された変更を適用**してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/b277b936-cd1b-ddd1-6f88-72f51eb9ddf0.png)
設定のパッケージのインストール画面に行くと、パッケージが追加されとります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/aeee8d95-a45a-5471-8892-3fee64667432.png)

ためしに、データ分析したいねってことでpandasってのを入れてみます。
下記の手順のようにinstall **Pandas** って入力して実行すると、簡単にパッケージがインストールできるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/45b5321b-ade4-6200-2cef-6e95c8f95440.png)

# おわりに
ほんとはpython入門記事でも書こうと思いましたが、力尽きました。。
@slack/client 4.0.0 の IncomingWebhook sendとレスポンスエラー(ParseError: Unexpected token o in JSON at position 0)

# バージョン

`@slack/client` 4.0.0
[slackapi/node-slack-sdk: Slack Developer Kit for Node.js](https://github.com/slackapi/node-slack-sdk)


# 症状

2つ。

1つ目は

`IncomingWebhook`の`send`メソッドに、
メッセージのみの`string`を渡すと
`payload.text = message;`
`TypeError: Cannot set property 'text' of undefined`

bot名なども指定できるオブジェクトを渡すと
`payload = Object.assign(payload, message);`
`TypeError: Cannot convert undefined or null to object`

と引数関連。

これを回避すると、2つ目に

`Error: { ParseError: Unexpected token o in JSON at position 0 in "https://hooks.slack.com/services/～"`
`got\index.js:366:15`

とレスポンスの扱いエラー(送信は成功している。)
軽くググるとこちらはすでにJSONのものを再度JSONにしようとしている？(token o はObjectのoらしい)


# Github上では修正済み

ググってもそれらしい情報がなかったので、GitHubのIssuesから検索したらバグとして出ていた。

[JSON.parse(res.body) in got/index.js:335:15 throwing a ParseError for statusCode: 200 · Issue #477 · slackapi/node-slack-sdk](https://github.com/slackapi/node-slack-sdk/issues/477)

(内容は読んでいない)

症状1の原因としてはデフォルトで持つペイロードの初期値を決めてなかったので、`undefined`を操作しようとしてエラー。

症状2はgotに最初からjsonだと教えていたのでエラー？こちらはよくわからない。


# 一時回避方法

コミット済みとはいえ、まだリリースされていないので、npmの更新ではダメ。
手動で修正する。

症状1は呼び出し側のワークアラウンドで対応可能。

デフォルト値が指定されていないなら、引数で仮のデフォルト値を渡せばいい。


```js
constructor(url: string, defaults: IncomingWebhookDefaultArguments)
```


```利用側スクリプト.js
const { IncomingWebhook } = require('@slack/client');
const url = 'https://hooks.slack.com/services/～'
//const webhook = new IncomingWebhook(url);
// ↓ デフォルト値を空のオブジェクトにしてやる。
const webhook = new IncomingWebhook(url, {});
```

本家の修正も

```js
constructor(url: string, defaults: IncomingWebhookDefaultArguments = {}) {
```

とデフォルト引数を付ける修正。

なので、
`@slack/client/dist/IncomingWebhook.js`
のconstructorにちゃちゃっと` = {}`を付けるほうがいいかも。

***

症状2は内部のことなのでコミット参照してコピペする。
tsではなくてdistのコードへ。
(ts関係ない修正でよかった…)


```(31行目before)@slack/client/dist/IncomingWebhook.js
        const implementation = () => {
            return got.post(this.url, {
                json: true,
                body: payload,
                retries: 0,
            });
        };
```

```(31行目after)@slack/client/dist/IncomingWebhook.js
        const implementation = () => got.post(this.url, {
            body: JSON.stringify(payload),
            retries: 0,
        }).then(() => {
            return;
        });
```

(ただしsendのコールバックのレスポンスがundefinedになるっぽくて、エラーにはならないが応答が取れてなさそう。)

***

4.0.0のリリースが**2018/3/9**で、私が(初めて)インストールしたのもその**当日**という、リリース直後のバグを踏んだ形でした。不運！
しかしわずか9時間後にはIssueで報告されているのは助かった！
マジのマジにプログラミングしてない人がPythonでNLP環境作ろうとしました。

#マジでやったことないです
マジでやったことなくて、大学の研究用にせいぜいArduinoに圧力センサー繋げて、ありもののコード切り貼りして、processingという大学以外で聞いたことない言語でなんかやった...みたいなレベルの人間がやるとこうなりました。
あとMacでやった方がベターとのことで慣れ親しんだWindowsから切り替えたので余計に厳しく、環境の書き方もよくわからなかったので調べました。

#環境
Mac OS 10.12.6

#Pythonをインストールするぞ
[【超初心者向け】MacにPython 3をインストールする方法+アンインストール方法](http://develtips.com/python/191)
これは大丈夫でした。特に問題なし。
次はMecab！（Mecabがナイスと聞いたので）

#Mecabをインストールするぞ
[Python3を使った日本語自然言語処理②　MeCabによる形態素解析](https://qiita.com/asai0304/items/669caac902f17ae6a642)
いきなり②なの不安だけど行くぞ。

>このジップファイルがあるディレクトリに移動し、解凍、ターミナルで以下のコマンドを入力します。

ディレクトリに移動...?（は？）
ググりました。
[【保存版】Macでターミナルで使える基本のコマンド８選](https://qiita.com/kenju/items/77a2dc1b6a60697b1133)
ありがとうございます。

進みました。
#つったらおいおいpythonのバージョンが変わらないじゃないか
もちろん切り替えてないからです。
(python -Vって入れたら2.7だ。python3 -Vにしないと出ない。)

[MAC SIERRAでPYTHON2.7をPYTHON3.Xに切り替えて使用する](http://graphbooth.com/2017/05/31/pythonmac.html)
>はじめてやってみる人には.bash_profileの編集あたりで時間がかかってしまうかもしれません。

なるほど、時間がかかりそうですね。
手順にしたがって進めます。

>下記のコマンドを書き込んで保存します。

保存？（は？）
勝手に保存されるのか？あと前の画面に戻れない。編集モードのままだ。ターミナル消したりしました。

[VIM (Vi) をターミナルで操作 / Mac OS X](http://feb19.jp/blog/archives/000226.php)
こういうことね。。。
保存できました。

これで無事に回りました。完。
予約販売のアプリをiTunes Connectで再提出するとエラーが発生する場合の解決法

**2018年4月15日更新**
この問題は修正されたようです。iTunes Connectでアプリを再提出する際に「Version Release」セクションが表示され、「Manually release this version」がデフォルトで選択されるようになりました。

---

2017年末からiTunes Connectでアプリの予約販売ができるようになりました。予約注文ができるアプリは新規アプリに限られますが、新たな販売方法として活用できます。

アプリケーションの予約注文に対応する
https://developer.apple.com/jp/app-store/pre-orders/

今回予約注文を設定してアプリを提出したところリジェクトされ、再提出するときにエラーが起きてハマってしまったので、その解決法を共有します。

# どんなエラーになるのか

アプリを再提出するボタンをクリックすると「There are one or more errors on the page」というエラーが発生します。

<img width="500" alt="error.png" src="https://qiita-image-store.s3.amazonaws.com/0/243326/ab0fd372-bc2b-26fa-c056-dd56097c4c15.png">

# エラーの原因

予約販売するアプリはリリース方法が「Manually release this version」になっている必要がありますが、再提出時は自動的に「Automatically release this version」が選択されてしまうのでエラーが発生していると思われます。

# 解決法

まず「Pricing and Availability」でアプリの予約販売を中止します。「Make available for pre-order」のチェックを外してセーブします。

<img width="500" alt="preorder.png" src="https://qiita-image-store.s3.amazonaws.com/0/243326/1417fc5a-f488-7ad0-28b9-810917d67daa.png">

次にアプリに戻って下にスクロールするとアプリのリリース方法を選択できる画面が表示されているので「Manually release this version」を選択してセーブします。

<img width="500" alt="manual.png" src="https://qiita-image-store.s3.amazonaws.com/0/243326/558a57c6-5f23-b886-bd17-f9a5806defc2.png">

その後「Pricing and Availability」に戻って予約注文を再度設定すると、アプリをサブミットしてもエラーが発生することなく無事に提出できます。
Windowsで認証プロキシを回避してpip install tensorflowする方法

# はじめに
昨今のAIブームの煽りを受けて社内でOSSを使うことになったエンジニアも相当数いるのではないでしょうか。
社内でOSSを使おうとすると認証プロキシの影響でうまくいかないことありますよね。
私は認証プロキシ下でpip installをしようとして試行錯誤しました。
周りにも困っている人がいたので助けになればと思い認証プロキシとpip install のキーワードがセットになっている記事を作成しました。

この記事では、認証トークンを初めからヘッダーへ挿入しておき、プロキシの認証ステップをスキップすることで対応する方法を紹介します。
pip install を他の認証プロキシに対応していないアプリケーションに置き換えても本記事の方法でいけると思います。

# ダウンロード
まずは以下をダウンロードしてください。

fiddler
https://www.telerik.com/download/fiddler
Fiddlerは、Webアプリケーションのデバッグやセキュリティチェックに使われる、ローカルプロキシです。

# Fiddlerをインストールする
ダウンロードした以下のファイルを実行してください。

FiddlerSetup.exe

# Fiddlerを起動する
ダイアログが表示されますが、キャンセル、いいえを選択していけば大丈夫と思います。
※内容はバージョンによって変わるの自身で判断してください。

# Fiddlerをセットアップする
次の二つの手続きを行うことで、認証プロキシに対応していないアプリケーション(ここではpip install)を、認証プロキシ環境下で動くように設定していきます。

1. 認証トークンを取得する
2. HTTP・HTTPS通信時のヘッダーに強制的に認証トークンを挿入するようスクリプトを変更する

以下の記事の以下の章を参考にしてセットアップを進めてください。
 https://qiita.com/Nuits/items/1bd84b45b0b092527d8d

　Fiddlerをセットアップする
　　認証トークンを取得する
　　Fiddlerのスクリプトを変更し、認証トークンをヘッダーへ挿入する

# Pythonをインストールする
Python公式からWindows向けのpythonをインストールしてください。
https://www.python.org/downloads/

# tensorfowをインストールする
コマンドプロンプトから以下を入力してインストールしてください。
`$ pip install tensorflow`

# おわりに
以下の記事をかなり参考にさせていただいています。
https://qiita.com/Nuits/items/1bd84b45b0b092527d8d
solrで日本語形態素解析結果を調べる(Mac版)

Macでsolr導入から日本語形態素解析結果のテストをするまでの手順メモです。

## 前提
OS Mac OS 10.13.3
Java 1.8.0_151-b12

## 手順
- [Solr サイト](http://www.apache.org/dyn/closer.lua/lucene/solr/7.2.1)からダウンロード

- zip ファイルの解凍

- 下記コマンドでサーバーの起動・コア作成 

```sh:
$ cd solr-7.2.1
$ bin/solr start
$ bin/solr create -c mycore
```

- ブラウザから[管理画面](http://0.0.0.0:8983)起動

- Core selector で mycore 選択

![solr1.png](https://qiita-image-store.s3.amazonaws.com/0/206130/e05f6f45-326d-445b-14e9-c4246990823d.png)

- 左のメニューから「analysis」選択

![solr2.png](https://qiita-image-store.s3.amazonaws.com/0/206130/418cbb4f-93a4-6e5d-58e0-d2bea8d48c9a.png)

- 「Fieldname / Field type」で「text_ja」を選択

![スクリーンショット 2018-03-13 12.26.04.png](https://qiita-image-store.s3.amazonaws.com/0/206130/576252a0-55b4-1907-aaf6-7442e6e7483a.png)

- Filed Value(Query)に質問文を入力し、「Analysis Values」ボタンをクリック
(一番上の「JT」(JapaneseTokenizer)の結果)
![スクリーンショット 2018-03-13 12.29.19.png](https://qiita-image-store.s3.amazonaws.com/0/206130/295e371f-037c-b1ed-32fd-0b8ff0a619e6.png)

(一番下の「LCF」(LowerCaseFilter)の結果)
![スクリーンショット 2018-03-13 12.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/206130/e2b28c15-2ad2-853a-0f4e-4d812844ad90.png)

## 補足
デフォルトで自動生成される構成ファイル(solr-7.2.1/server/solr/mycore/conf/managed-schema)の「text_ja」部分

```xml:
  <fieldType name="text_ja" class="solr.TextField" autoGeneratePhraseQueries="false" positionIncrementGap="100">
    <analyzer>
      <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
      <filter class="solr.JapaneseBaseFormFilterFactory"/>
      <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt"/>
      <filter class="solr.CJKWidthFilterFactory"/>
      <filter class="solr.StopFilterFactory" words="lang/stopwords_ja.txt" ignoreCase="true"/>
      <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>
```
関連リンク [Mac で Elasticsearch 6](https://qiita.com/makaishi2/items/598d24ea65e6ec79f887)
フリーランスエンジニアが個人で新規ARサービスを作った話

#プロフィール
フリーランス エンジニア歴(1年半)
会社員時代はPHP/ASP.NETなどのエンジニア(6~7年)


#作ったサービス
誰でも無料でARコンテンツ(マーカー型)が作成できるサービス。

UNIVERSE.AR
"とっておきの1枚から、広がる世界"
https://universear.hiliberate.biz/

#動機(モチベーション)
AR/VRに興味があり記事を読んだり実際にチュートリアルを試している中でカスタマーがマーカー型ARコンテンツを作成できるサービスを思いつく。
調べてみると類似サービスはほとんど無く、日本では初。(恐らく)
世界には2つほど同じコンセプトのサービスがあり、これなら作る価値があると考えました。

同時にエンジニアとして対外的に見せられるものがあまり無いので、それを作るという意味でも有益だと考えました。

#構成
サーバー側
Python(django) / AWS(ECS) / Docker

アプリ側
Unity / xcode / objective-c

#開発期間
6ヵ月(一人で)

#苦労した点
####1.技術的な障壁
未経験のモノばかりを採用したのでがいくつかありました。
一番苦労したのはビデオをARでテクスチャとして表示して表示する部分。(普通に実装すると全画面表示となってしまい、ジャストな情報が無かった)

サーバー側(Django)はユーザーのサインアップ周りや画像圧縮など苦労しつつも想定の範囲内で実装できました。

本番環境にもDockerを採用したかったのでAWSのECSを採用。これも少し苦労しましたが、負荷によってEC2インスタンスを増減させるオートスケーリングを設定したり完成してみれば中々便利な構成になりました。


####2.テスター集め
TestFlightを通してリリース前のアプリを色々な人に試して欲しいとなった時、協力者を集めるのに苦労しました。
基本的にはリアルの友人/知人を頼りましたが、募集ページを作成してSNSで告知したら面識の無い方も数人協力してくれました！（本当にありがとうございました！）
https://universear.hiliberate.biz/hlar/beta_monitor/

全15名ほどの方に協力して頂けて非常にありがたかったのですが、もっと沢山出来るに越したことは無いな、とも思いました。
この辺はエンジニアの方々やコミュニティで横の繋がりをもっと持てると良い状況になるのかなと感じました。私の場合、当たり外れがありましたが勉強会に足を運ぶのは一つの良い方法でした。


####3.マーケティング
これまでPM(プロジェクトマネージャー)の経験はありましたが開発したものを外部に向けて広めていく、という点は全くの未経験なのでこれは現在も手探りで試行錯誤中です。
マーケティングの本を数冊読んで知識を付けましたたが、まだまだ足りないと感じています。


#上手く出来た、良かった点

モチベーション管理が大変という話を良く聞きますが、そこは問題無かったです。
開発に当てた時間ですが、日々の仕事はフリーランス契約で週3~4日は出社。なので帰宅後に平均2h程度、出社しない平日と土日のどちらか1日で開発しました。
ただこれ以上(半年以上)一人で続けるとモチベーションが落ちてきそうだな、という感じはしました。

Django/AWS/Unity/xcode など新しいスキルが付いた。

今まで未経験だった部分、マーケティング・ブランディング・グロースについて考えるきっかけになりました。
運用するものが出来たので、これを元に色々と試していきたいです。


#まとめ
何といってもリリースまで完遂できた事は良かったと感じています。
企画からリリースまで全てを経験する事で今まで気付けなかった視点や知識をフォローして新しい方向性を見出せました。
自分自身まったく考えていなかったインプットがある(と思う)ので少しでもアイデアがある方はぜひ自身のサービスを開発する事をオススメ致します。

具体的にグロースやマーケティングについては本当に奥が深いということを肌で感じ、今後そういった部分のスキルも伸ばしてつつ、プロダクトマネージャーとしてキャリアを積みたいと考えるようになりました。

対外的にもアピール出来るものが完成したので、お仕事の依頼もお待ちしております！(2018/4月末で現契約が満了になります)

最後まで読んで頂きありがとうございます！

あなただけのオリジナルARコンテンツ(マーカー型)が簡単に作成出来ますので是非こちらのサービスも楽しんで頂けたら幸いです！！

---------------
UNIVERSE.AR
"とっておきの1枚から、広がる世界"

●official HP
https://universear.hiliberate.biz/

●アプリ
https://itunes.apple.com/us/app/universe-ar/id1287387215?mt=8

![UNIVERSEAR](https://universear.hiliberate.biz/static/images/ogp_icon.jpg)
SonarQubeコンテナの認証をAD連携させる

SonarQubeコンテナの認証をActiveDirectory連携させる方法です。
ADに関する各種設定値は、sonar.propertiesを変更するのではなく、コンテナ起動時の環境変数に設定することで実現させました。

# 動作環境
以下の環境下で動作確認しています。

* Docker
    * 17.12.0-ce
* Docker Compose
    * 1.18.0
* SonarQube
    * 7.0 / 6.6
* SonarQube LDAP Plugin
    * 2.2.0.608

# 事前準備
LDAPプラグインはバンドルされていないので、事前にダウンロードしてDockerサーバに配置しておきます。

[LDAPプラグインダウンロード](https://docs.sonarqube.org/display/PLUG/LDAP+Plugin)

# イメージビルド
* Dockerファイルを作ります。  

```dockerfile:Dockerfile
FROM sonarqube:7.0

# plugin install
COPY sonar-ldap-plugin-2.2.0.608.jar /opt/sonarqube/extensions/plugins
```

* ビルドします。

```
cp -p /xxx/sonar-ldap-plugin*.jar ./
docker build -f ./Dockerfile -t sonarqube:7.0-1.0 .
```

# コンテナ起動
* 以下のようなcomposeファイルを作ります。データ永続化はしてないので必要に応じて修正を加えてください。

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

services:

  test_sonarqube:
    image: sonarqube:7.0-1.0
    ports:
      - 9000:9000
    depends_on:
      - test_sq_mysql
    environment:
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=sonar
      - SONARQUBE_JDBC_URL=jdbc:mysql://test_sq_mysql:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
      - LDAP_HOST=ldap://[YOUR LDAP HOSTNAME]:[YOUR LDAP PORT]
      - LDAP_USER_BASE_DN=CN=[YOUR AD CN],DC=[YOUR AD DC],DC=[YOUR AD DC],DC=[YOUR AD DC]
      - LDAP_USER_REQUEST=(&(objectClass=user)(sAMAccountName={login}))
      - LDAP_BIND_DN=[YOUR LDAP USERNAME]
      - LDAP_BIND_PASSWORD=[YOUR LDAP PASSWORD]
    command: bash -c "./bin/run.sh -Dsonar.security.realm=LDAP -Dldap.url=$$LDAP_HOST -Dldap.bindDn=$$LDAP_BIND_DN -Dldap.bindPassword=$$LDAP_BIND_PASSWORD -Dldap.user.baseDn=$$LDAP_USER_BASE_DN -Dldap.user.request=$$LDAP_USER_REQUEST -Dldap.user.realNameAttribute=displayname -Dldap.user.emailAttribute=mail"

  test_sq_mysql:
    image: mysql:5.7.21
    command:
      mysqld
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --max_allowed_packet=64MB
    environment:
      - MYSQL_DATABASE=sonar
      - MYSQL_USER=sonar
      - MYSQL_ROOT_PASSWORD=sonar
      - MYSQL_PASSWORD=sonar
```

# 動作確認
* http://[YOUR DOCKER HOST]:9000 にアクセスし、ADユーザでログインしてください  
* SonarQubeコンテナ起動直後からADユーザでログイン可能になっているはずです
mac OSのdockerでrun hello worldがunauthorized: incorrect usernameで失敗する

pythonの機械学習を勉強しようと思ってこの本を買ってきて

[Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう]
(http://amzn.to/2FODQ0D)

Appendix「作業の準備と環境構築」に書いてあるとおりに

```
docker run hello-world
```

とやるとエラーになる。

```
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/latest: unauthorized: incorrect username or password.
See 'docker run --help'.
```

dockerを最新版にしてみたり、入れ直してみたりしたけどだめ。

結局、


```~/.docker/config.json
{
  "auths" : {
    "https://index.docker.io/v1/" : {

    }
  },
  "credsStore" : "osxkeychain"
}
```

この "credsStore" : "osxkeychain"を消せばよいことが分かった。
Trello のキーボード・ショートカットまとめ

先日開催されたイベント [Trello LT](https://connpass.com/event/79634/) (2018/03/09) にて話した、「Trello のショートカットキーってめっちゃ充実しているんだぜ」という LT 内容のまとめです。

## Trello のショートカットキー

意外かもしれませんが、Trello のショートカットキーはかなり充実していて、ほとんどの操作がキーボードだけで可能です。

### 全般

- `?` でショートカット一覧を表示
- カーソルキーでカードを選択
- `Enter` で開く
- `ESC` で閉じる
- カードを開いた状態で、 `J` `K` で、上下のカードに遷移 (vim っぽく)
- `,` `.` でカードを左右に移動 (レーンの一番下に移動)
- `Shift + ,` `Shift + .` でカードを左右に移動 (レーンの一番上に)

### カード編集

- `N` で新規カード作成
- `E` でクイック編集
    - カードを右クリックしたときと同じ挙動
- `C` でアーカイブ
- `D` で期日設定
- `L` でラベルづけ
- `1` 〜 `0` の数字キーでも一瞬でラベルづけができる
- `;` で、ラベルの文言の表示／非表示
    - 以前は [Card Color Titles for Trello](https://chrome.google.com/webstore/detail/card-color-titles-for-tre/hpmobkglehhleflhaefmfajhbdnjmgim?hl=ja) って Chrome拡張使ってたけど、どうやら最近標準の機能に入ったっぽい
    - ラベル自体をマウスでクリックしたときと同じ挙動
- `T` でタイトル編集
- `M` でメンバーアサイン
- `Space` で自分にアサイン

### フィルタリング

- `Q` で自分にアサインされたカードだけを表示／非表示
- `F` でフィルタリングメニューを表示
- `X` でフィルターをクリア

### その他

- `W` でサイドメニューの表示／非表示
- `/` で全カードの検索 (ボードをまたいで)
- `B` でボード選択メニュー (からのカーソルでボード選んで `Enter` で移動)

### めっちゃ充実

というわけで、だいたいの操作がキーボードから手を離さずにできるのではないでしょうか。
個人的には `C` でのアーカイブ、`1` など数字キーでのラベリング、`D` で期日設定、`Space` での自分へのアサインなどはかなり使っています。

### 意外と、このショートカットキーがない？？？

「カードを上下に移動させる」ってショートカットキー、あっても良さそうなんですが今のところ見つけられず……。あったら頻繁に使いそうなんだけどな。情報求ム。

### link

- [Trello](https://trello.com/)
- [TrelloLT - connpass](https://connpass.com/event/79634/)
- <https://monaural.net/post/201803/trello-lt/>
さくらのVPSにGitLabを構築する - その1

# 概要

社内向けにさくらのVPS上での、下記構成のリポジトリサーバ構築メモ  
ところどころ抜けてるかも  
[後編はこちら](https://qiita.com/rot-z/items/3173f9cdb8481f47f18a)

一部作業は作業中です  

- さくらのVPS使用(RAM 2GB, HDD 200GB)
- CentOS 6.9 (Final)
- GitLab CE Omnibus ver.10.5.2
- 通知用メールはGMailを使用
- リポジトリおよびデータのバックアップはGoogle Driveを使用
- SSLに対応するため、Let's Encryptのサーバ証明書を使用**（WIP）**

# OSのインストール

諸事情によりCentOS6を使用したかったので、スタートアップスクリプトを使用せず、さくらのコントロールパネルからCentOS6をクリーンインストール

インストール後、管理者ユーザを作成したり、SSHの設定をしたりしたけど、とりあえず割愛。

# GitLabのインストール

基本的には公式のインストールガイドに従っただけで、すんなり入った。  

## 必要なパッケージとサービスの設定

```bash
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
```

通知メールにはGMailを使用する予定のため、postfixはインストールしない  

## yumのリポジトリの設定

```bash
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
```

## GitLabのインストール

```bash
sudo EXTERNAL_URL="http://gitlab.northtorch.co.jp" yum install -y gitlab-ce
```

## GitLab再起動

```bash
gitlab-ctl reconfigure
```

## GitLabへのアクセスの確認

ブラウザを使用して、さくらのVPSのIPアドレスへアクセス  
GitLabのrootのパスワード設定を求められるので、設定する  

# GitLabとGMailの連携設定

GitLab用にGMailアカウントを新規に追加する  
(設定ファイルにGoogleアカウントのログインパスワードを埋め込むことになるので、既存アカウントを使いまわすのはちょっと怖い）  

## GitLabの設定ファイルを変更

```ruby:/etc/gitlab/gitlab.rb
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'northtorch.gitlab@gmail.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab Auto Mail'
gitlab_rails['gitlab_email_reply_to'] = 'northtorch.gitlab@gmail.com'

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "northtorch.gitlab@gmail.com"
gitlab_rails['smtp_password'] = "ntgitlab"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false

###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'**
###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
```
## GitLab再起動

```bash
gitlab-ctl reconfigure
```

## GitLabからのメールが届くか確認

有効なメールアドレスと紐づいたユーザを作成すると、そのユーザのメールアドレスにメールが飛んできます。

とりあえず、ここまででインストールは完了です  

# 参考URL

- [Installation - GitLab Documentation
](https://docs.gitlab.com/ce/install/README.html)
- [さくらVPS(Cent OS6)にGitlabをインストールする①](https://qiita.com/ei1206/items/68a906185f92f60715d5)
- [さくらVPS(Cent OS6)にGitlabをインストールする②](https://qiita.com/ei1206/items/7f93c7e28269a508e60f)  
- [gitlabをsakura vpsに入れてみた](https://www.codelab.jp/blog/?p=1076)
- [SMTP settings - GitLab Documentation](https://docs.gitlab.com/omnibus/settings/smtp.html)
- [GitLabのメール通知をGmailで送る](http://h-otter.hatenablog.jp/entry/2015/07/31/220511)
- 
本記事は、[弊社スタッフブログ](https://www.northtorch.co.jp/archives/386)に転載しました。
Visual Studio Team Services へのコミットをgithubへ同期する

Visual Studio Team Servicesを使っていて、途中からgithubへ公開しようということになることはよくあります。
リモートリポジトリを２つにして、別々にコミットすることも可能なようですが、VSTSをプライマリにして、あと、githubへコピーしてくれればいいよという場合は、VSTSのCIの機能で実現することが可能です。

# Build を作成

Buildを作成します。[プロジェクト名]-CIという名称のBuild Definitionができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/b7315e81-65a4-cb6c-db87-8efd4cdb04e3.png)

# Sourceの設定

ソースとなるのはこの場合VSTSのgitになりますので、それを選択します。当たり前の設定のようですが、このプロジェクトをしていておきます。こちらを外部のgitリポジトリやsubversionなどを監視することで、どのようなマルチサイト構成でも対応できそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/512c6a59-de5b-c82e-68f4-c59e17480ff8.png)


# Agentの設定

これも自動的に生成されますが、Agentとして、フェーズをまとめた自動化スクリプトを記述できるようになります。ここでは、基本的には複数のコマンドラインコマンドの実行のみを行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/a653fb69-18ae-058e-6293-79dc4b2049e3.png)

# Taskの作成

具体的に行うアクションを指定します。ここではgithubへの操作を行うだけなのですが、特に特別なタスクテンプレートは用意されておらず、直接gitコマンドをコマンドラインで実行することになります。git pull, git pushする形で、同期を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/f3fc5749-f004-d8d8-0116-a6cc564aee92.png)

## pullタスク

以下のようなコマンドで指定できました。personaltokenはあらかじめ指定しておきます。allow-unrelated-historiesというものを指定しないと、通らなかったので入れました。

```
pull https://$(githubpersonaltoken)@github.com/hoge/project.git master --allow-unrelated-histories
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/d1496ba6-d2b2-9213-7b2f-c817446edac1.png)

## pushタスク

プッシュ時もほぼ同様です。タスクを分ける必要がないように思いますが、エラー時に切り分けがしやすいようでした。

```
push https://$(githubpersonaltoken)@github.com/hoge/project.git  head:master
```

またgithubアクセスのセットアップとして、email,nameを指定しなければいけないので、以下2行を追加しました。

```
config --global user.email "your email address"
config --global user.name "hoge"
```

# Triggerの作成

VSTS（のgitリポジトリ）にPUSHされたタイミングで同期をかけたいので、Enable CI をチェックしてトリガーを作成します。またフィルタにより、特定のブランチや特定のフォルダだけを監視することも可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/770157fc-8333-2a0a-eff2-7e8890fcc8e3.png)

# まとめ
これでいいのかどうかわかりませんが、どうやら所望の動きはしているようです。
githubへの同期はVisual Studioから直接できますが、２種類のリポジトリを扱うのは面倒なので、一元化したいと思います。
今度はソリューションとプロジェクトごとに管理を変えるということに挑戦してみたいと思います、。
Excel VBAでIE操作時にオートメーションエラーが出た時は、対象のURLが「信頼済みサイト」に登録されているからかもしれない。

#はじめに
ExcelのデータをWEBページに転記するためのVBAを書いていた時にハマったので、メモ書きです。

##ハマったソース（イメージです）
```vb
Sub IE_OpenUrl()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    With IE
     .Visible = True
     .Navigate "（ここにURLを入力）"

    Set objectelement = IE.Document
    With objectelement
        .GetElementById("btn").Click
    End With
End Sub
```

#結論
Excel VBAでIEを操作しようとした際に、下記のようなメッセージが表示されたら、開いているURLがIEの「信頼済みサイト」に登録されているからかもしれません。（特に操作対象が社内のイントラネットだったりすると怪しい）



>実行時エラー'-2147467259
>オートメーションエラーです。
>エラーを特定できません。

エラーになる理由は下記のページが詳しいです。

- [IE の保護モードの違いによって整合性レベルの切り替えの有無が変わりオートメーションの操作に影響が出る場合がある - デクノスティック](http://dechnostick.hatenablog.com/entry/2015/01/27/032113)
- [internet explorer - Excel VBA Controlling IE local intranet - Stack Overflow](https://stackoverflow.com/questions/12965032/excel-vba-controlling-ie-local-intranet)

>Here's what's happening. When your browser internally "jumps" to a different security zone - from say a local address to an inTRAnet address or to an inTERnet address - IE closes/drops the current process of IE and opens another one with tighter security. 

セキュリティゾーンをまたぐ場合に、セッションを維持することができないことが原因のようです。

#対策
##信頼済みサイトから該当のURLを削除する
簡便ですが、故あって信頼済みサイトに登録されているのでしょうから、オススメしません。

##InternetExplorerMediumを使う
`CreateObject("InternetExplorer.Application")`ではなく、`New InternetExplorerMedium`を利用します。
明示的に、Integrity Level(整合性レベル)が中(MediumIL)でインスタンス化することで切り替えが発生せずに操作を継続できるようです。（まだ理解が曖昧）

```vb
'Microsoft Internet Controlsが必要なので、ツール->参照設定->Microsoft Internet Controlsにチェックを入れて「OK」

Sub OpenIEAndSetValue()
    Dim IE As Object
    Set IE = New InternetExplorerMedium

    '中略

End Sub
```

#参考サイト
- [internet explorer - Excel VBA Controlling IE local intranet - Stack Overflow](https://stackoverflow.com/questions/12965032/excel-vba-controlling-ie-local-intranet)
- [IE の保護モードの違いによって整合性レベルの切り替えの有無が変わりオートメーションの操作に影響が出る場合がある - デクノスティック](http://dechnostick.hatenablog.com/entry/2015/01/27/032113)
pythonでvSphere操作　その3　APIレファレンス　&　ヘルプ表示

#APIレファレンス
pyvmomiはVmware公式ライブラリなので、わざわざcurlやrequestせずとも容易にアクセスする手段が用意されている。
便利なサンプルも同梱されているが、ここはAPIの理解を深めるために、レファレンスから調べることにする。

レファレンス：
　　https://code.vmware.com/apis/196/vsphere#/doc/index-mo_types.html

これでしたいことが大体調べられるので便利。

やりたいことを整理する。

・ログインする
・フォルダを指定する(なければ作成)
・VMの構成情報(スペック)を指定して作成する
・作成したVMの情報を確認する
・ログアウトする

#ヘルプ表示
pythonでモジュールやその中のメソッドのヘルプを表示するには、importしないといけない。

```python:tty
>>>
>>> import pyVim
>>> help(pyVim)
(ヘルプが表示される)
>>> help(pyVim.connect)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'connect'
>>> import pyVim.connect
>>> help(pyVim.connect)
(ヘルプが表示される)
>>>
```
Visual Studio Code キーボードショートカット一覧（チートシート）

# 本家

Key Bindings for Visual Studio Code
https://code.visualstudio.com/docs/getstarted/keybindings

Keyboard Shortcuts Reference
https://code.visualstudio.com/docs/getstarted/keybindings#_keyboard-shortcuts-reference

# 日本語に訳してみた

Visual Studio Code
Keyboard shortcuts for Windows
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81548/0528fc38-7a21-56eb-131a-5bcfcd8f69e1.png)

Word, PDF でそれっぽいの作ったけど Qiita は画像しか添付できなかった、そんなおち。
cp でバックアップ取るのをちょっと楽する


## 導入
随分前に書いた [BraceExpansionでお手軽に複数処理](https://qiita.com/suzuki-hoge/items/e1de04ddd47d95cbf4d9) でやってたのを使う。

```
$ echo {k,c}atherine
katherine catherine
```

これは知ってたんだけど、こんな使い方がある。

## 例
```
$ cp path/to/file.txt{,.org}
```

## 解説
記号が多いけど、もとをちゃんと分かっていれば十分実用範囲内だと思う。

`echo`してみるとイメージが湧く。

```
$ echo path/to/file.txt{,.org}
path/to/file.txt path/to/file.txt.org
```

## 他
`.org`に限らず、何らかのファイルを別名コピーする場面で使える。

```
$ echo conf/xxx{,_user1}.conf
conf/xxx.conf conf/xxx_user1.conf
```

## おしまい
この間ペア作業した人がやっているのを見てハッとした。
ELBのMigrationWizardについてのリンク

ELBのMigrationWizard公式
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/userguide/migrate-to-application-load-balancer.html

ELBのMigrationWizard クラスメソッド
https://dev.classmethod.jp/cloud/aws/migrate-clb-to-alb-with-wizard/

※ELBに証明書入れてないとNLBしか移行先の選択肢がない。ALBはTCPに対応していない。
https://aws.amazon.com/jp/elasticloadbalancing/details/#compare
個人的なPHPerKaigi2018のまとめ


# PHPerKaigiとは

長谷川さん(@tomzoh)が主宰で開催されたPHP関連のイベントで第一回目の開催でした。

>PHPerKaigi（ペチパーカイギ）は、現在PHPを使用している、過去にPHPを使用していた、これからPHPを使いたいと思っているエンジニアが、技術的なノウハウを共有するためのカンファレンス（イベント）です。
https://phperkaigi.jp/2018/

## スライド・資料に関して

すでに資料のまとめはこちら → [PHPerKaigi2018 スライド リンクまとめ](http://www.manasnote.com/2018/03/phperkaigi2018.html)

## イベント風景・感想など

[ブログに書いた](http://gremito.hateblo.jp/entry/2018/03/11/233504)のでブログを見ていただけると幸いです。
環境変数を使ってEmbulkで変数を


Embulkの導入など最低限のことを以前にまとめたのはこちら
[Embulkについてまとめてみた　2017/08](https://qiita.com/tashiro_gaku/items/f7fa0f1a99c759d947a7)

Embulkのバージョンは0.8系（0.9系がリリースされましたので、そちらはまた別途）

Embulkでは、環境変数を使って、環境毎に値を変えて差し込み、実行することが可能。
テンプレートエンジン **liquid** を使って可能（**Embulk0.7**以降で利用可能）

ディレクトリ構成はこんな感じ

```sh:ディレクトリ構成
embulk
├ config.yml.liquid
├　 exec_embulk.sh
├ setparams
└ env 
　├　setenv_localhost
　├ setenv_staging
　└ setenv_product
```

```yml:config.yml.liquid
in:
  type: http
  url: {{ env.DOMAIN }}/api/report/
  params:
    - {name: accesskey, value: {{ env.ACCESS_KEY }}}
    - {name: year, value: {{ env.YEAR }}}
    - {name: month, value: {{ env.MONTH }}}
  read_timeout: 300000
  method: get
  parser:
    charset: UTF-8
    newline: LF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    default_timezone: "Asia/Tokyo"
    columns:
    - {name: date, type: timestamp, format: '%Y/%m/%d'}
    - {name: total, type: long}
    - {name: item1, type: string}
    - {name: item2, type: string}
out:
  type: mysql
  host: {{env.DB_HOST}}
  user: {{env.DB_USER}}
  password: {{env.DB_PASSWORD}}
  database: test_db
  table: test_table
  mode: merge
```

※上記の**default timezone**は、**Embulk0.9**より使えなくなってるらしい（[タイムゾーンの呪いの書](https://qiita.com/dmikurube/items/15899ec9de643e91497c))

使い方は、 exec_embulk ($profile) ($month) ($year) 
profile : localhost, staging, product など

```sh:exec_embulk.sh
echo "profile:$1, year:$2 month:$3"

source $EMBULK_HOME/env/setenv_$1
source $EMBULK_HOME/setparams $2 $3
embulk run $EMBULK_HOME/config.yml.liquid
exit 0
```

```sh:setenv.sh
export YEAR=$1
export MONTH=$2
```

```sh:env/setenv_loalhost
export DOMAIN=https://hogehoge.org/api
export EMBULK_HOME=/tmp/embulk/
export ACCESS_KEY=*********************
export DB_HOST=localhost
export DB_USER=embulk
export DB_PASSWORD=*********
```
GitHubのプルリクでhidden [items|conversations]を自動的に開く

## はじめに
[GitHubのプルリクでoutdated diffへのコメントが閉じてるのを全部開く](https://qiita.com/shingo-nakanishi/items/129188bd3885d22d9477)
このブックマークレットを便利に使わせてもらってます。

しかし、「hidden itemsやhidden conversations」の「Load more...」はやってくれないので、
この中に隠れてるコメントを読みたい時は手動クリックする必要があります。
<img width="691" alt="スクリーンショット 2018-03-13 10.21.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/24333/5827e2d4-fa45-ff50-72f2-db92d939226f.png">

「コメント全部開いてるのに、前にコメントしたはずの単語をページ内検索しても引っかからぬ！なぜだ！なぜだ！！！」
となってしまう場合は、大体これが理由です。

## このブックマークレットで自動的に開くことができる
```
javascript:Array.from(document.getElementsByClassName('ajax-pagination-btn')).forEach(l => l.click());
```

diffコメントを開くブックマークレットをちょっと改造させてもらいましたw

## 問題点
「hidden [items|conversations]」が沢山あるとき、一回の「Load more...」では全部とってこれず、
繰り返しクリックする必要があります。
結局は画面を見て確認しなければいけないという・・・

<img width="819" alt="スクリーンショット 2018-03-13 10.39.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/24333/da140b56-98d9-2558-6b99-d4bad627df92.png">
　↓
<img width="828" alt="スクリーンショット 2018-03-13 10.40.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/24333/ffa37ec9-4d45-58f6-23cb-bb5e896e0b63.png">

だいたい1回のクリックで80件を取ってくる(155→75)感じっぽいですが
必ず80件とも限らず、詳しい仕様はよく分かりません。

「全部とってこれなかったらもう一回クリック」ってのは不可能ではないはずだけど、
非同期処理の完了を待つなど途端に面倒なコードになりそうなので手をつけてません。
気が向いたらまた書きます。誰か気が向いたらコメントくださいw
（最近こういう「面倒くさいのでここまで」系の終わり方が増えてきたな・・・）