OmniAICreator/Qiita-1.07M huggingface dataset:
React NativeのiOS/Androidを実機とシュミレーターで起動する方法


忘備録としてReact NativeアプリケーションをiOS/Androidのシュミレーター/実機アプリで立ち上げる方法について簡単にまとめる。初回起動については[Getting Started|React Native](https://facebook.github.io/react-native/docs/getting-started.html)を参考にするのがよい。あくまで立ち上げ方を忘れた時用。

## サンプルのアプリケーションを用意する

何かしらのアプリケーションは必要なので、ない場合は下記のコマンドで用意する。

```
$ react-native init [APP_NAME]
```


## iOS
### シュミレーター

`react-native run-ios`を実行するとiOSシュミレーターが起動する。

### 実機

`ios`ディレクトリにある`AppName.xcodeproj`をXcodeで開く。
下記の画像のようにビルド先を選択してビルドボタンをクリック。

![Kobito.jSQHR4.png](https://qiita-image-store.s3.amazonaws.com/0/25228/e7f61579-ed87-04f2-9da7-f55e88a75174.png "Kobito.jSQHR4.png")

![Kobito.mjAHYT.png](https://qiita-image-store.s3.amazonaws.com/0/25228/9a784a49-110e-ef92-90c2-feffee2bea14.png "Kobito.mjAHYT.png")

#### iPhoneがロックされていると出た場合

iPhoneがロックされていないにも関わらず、下記のようなエラーが出る場合は「位置情報とプライバシーをリセット」をするとよい。(参考: [Development cannot be enabled while your device is locked.](http://qiita.com/ukandori/items/ea2554d18ae480d43741))
![Kobito.FgM6BI.png](https://qiita-image-store.s3.amazonaws.com/0/25228/eb4c0b4c-3ae0-3282-fa0f-5395cdd0a7be.png "Kobito.FgM6BI.png")

#### development teamを選択するよう出た場合

```
Signing for "TabbarSample" requires a development team. Select a development team in the project editor.
Code signing is required for product type 'Application' in SDK 'iOS 10.2'
```

TARGETS ＞ General ＞ Signing ＞ Automatically manage signing にて、適切なチームを選択する。

(参考: [Xcode 8: xcodebuildで、Automatic Signingに対応する](http://qiita.com/SCENEE/items/c170bca6b8e8bcb2769f))



## Android
初めてのセットアップの場合は、[こちら(Android Setup)](https://facebook.github.io/react-native/releases/0.23/docs/android-setup.html)の記事を参考にするとよい。

###シュミレーター
Android開発ではGenymotionを使うのがよさそう。個人利用の場合は無料。
Genymotionを起動して仮想デバイスを選択した状態で`react-native run-android`

`⌘+M`でデバッグメニューの表示。

### 実機

開発者モードからUSBデバッグをONにする。`adb devices`で接続を確認する。
その状態で`react-native run-android`


## その他
### Application SampleApp has not been registered. エラー

`Application SampleApp has not been registered.`のようなエラーが出た場合、プロセスが残ってしまっているのが原因かもしれない。(参考: [react−nativeの最初につまずいたところメモφ(｡_｡ )](http://qiita.com/miyukiw/items/805c3a8eadc4be58acdc))

```
$ ps aux | grep react
kotazi           34534   0.1  1.0  3277536 163328 s002  S+    9:00PM   0:09.91 node /SampleApp/node_modules/react-native/packager/../local-cli/cli.js start
kotazi           34529   0.0  0.0  2437480    828 s002  S+    9:00PM   0:00.00 bash /SampleApp/node_modules/react-native/packager/launchPackager.command
kotazi           37067   0.0  0.0  2424600    456 s005  R+    9:31PM   0:00.00 grep --color=auto react
$ kill -9 34534
```
UbuntuでAzure AD認証

UbuntuでAzura AD認証をできるようにしてみた。

# 必要なもの

* golang 1.8 （たぶん、1.7でも大丈夫）
* [pam-exec-oauth2](https://github.com/shimt/pam-exec-oauth2)

# インストール

Goの環境が整っていることが前提。

1) [pam-exec-oauth2](https://github.com/shimt/pam-exec-oauth2)をビルド
2) `/opt/pam-exec-oauth2`にpam-exec-oauth2をコピー
3) `/opt/pam-exec-oauth2`にpam-exec-oauth2.yamlを作成

```
go get github.com/shimt/pam-exec-oauth2

PREFIX=/opt/pam-exec-oauth2

sudo mkdir $PREFIX
sudo cp go/bin/pam-exec-oauth2 $PREFIX/pam-exec-oauth2
sudo touch $PREFIX/pam-exec-oauth2.yaml
sudo chmod 755 $PREFIX/pam-exec-oauth2
sudo chmod 600 $PREFIX/pam-exec-oauth2.yaml
```

# 設定

## PAM

`/etc/pam.d/common-auth`に以下を追加。

```
auth sufficient pam_exec.so expose_authtok /opt/pam-exec-oauth2/pam-exec-oauth2
```

## pam-exec-oauth2.yaml

`/opt/pam-exec-oauth2/pam-exec-oauth2.yaml`を環境に合わせて修正

```yaml
{
    client-id: "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
	client-secret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
	redirect-url: "urn:ietf:wg:oauth:2.0:oob",
    scopes: ["email"],
	endpoint-auth-url: "https://login.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/authorize",
	endpoint-token-url: "https://login.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/token",
	extra-parameters: {
		resource: "https://graph.windows.net/"
	},
	username-format: "%s@example.org",
}
```

# テスト

環境変数`PAM_USER`にユーザ名を設定し、標準入力からパスワードを入力する。

`$?`が`0`であれば認証成功。

```
# PAM_USER=username /opt/pam-exec-oauth2/pam-exec-oauth2
usernameのパスワード
# echo $?
```
INSERT ALL 複数のテーブルに複数のレコードを一気に登録 Oracle

周りで SQL の速度改善の話が紛糾していて、INSERT ALL を使ってみたら逆に速度が低下した！なんでや！？
というようなやり取りが起きていたのを聞き、INSERT ALL がどういうものかよくわからなかったのもあって気になり調べてみました。

速度は別の手段で解決したらしいけど (後日調査予定)。

INSERT ALL とは、Oracle で使えるマルチテーブルインサートと呼ばれるもの。
他の DB で同様の書き方という形で一緒に紹介されているのはマルチレコードインサート (そんな言葉はなさそう) と言ったほうが正しいもので、標準の書き方で複数のテーブルに一括でインサートできるのは Oracle のみの様子？ (MySql は何やら複雑なことをしないとダメらしい)

構文としては

INSERT ALL
  INTO TABLE1 (col1, col2) VALUES ('var1', 'var2')
  INTO TABLE2 (colA, colB) VALUES ('varA', 'varB')
  SELECT文
  
が基本形の模様。SELECT文は、利用しない場合でも省略不能で
SELECT * FROM DUAL;
が定番のようでそこかしこに書かれています。

SELECT文は、検索結果をそれぞれの VALUES 句の中で使えます。
構文としては

INSERT ALL
  INTO TABLE1 (col1, col2) VALUES ('var1', res)
  INTO TABLE2 (colA, colB) VALUES ('varA', res)
  SELECT res from TABLE3 WHERE ID = 1;
  
というような書き方。
SELECT文で複数の結果が得られる場合でも使えるのかは不明。ためしに一例やってみたところ、インサートされる側のテーブルの一意制約違反のエラーが出ました。

うまく使えると芸術点が高そう・・・。
R Markdownファイルからコード部分だけを抜き出してRファイルに出力

毎度忘れるのでメモ。

## サンプルファイルの準備

以下のファイルがあるとします:

    ---
    title: "Untitled"
    output: html_document
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    ```
    
    ## hogehoge
    
    hogehoge.
    
    ```{r cars}
    # hogehoge
    summary(cars)
    ```
    
    ## fugafuga
    
    Why are you using SJIS?
    
    ```{r pressure, echo=FALSE}
    #' fugafuga
    #' hogfuga
    plot(pressure)
    ```
    
    end.

このファイルを`purl_test.Rmd`とします。

## `knitr::purl()`で抜き出し

チャンク内のコード部分を抜き出して別のRスクリプトファイルに吐き出させるには`knitr::purl()`関数を使います:

```r
> knitr::purl("purl_test.Rmd")


processing file: purl_test.Rmd
  |.................................................................| 100%
output file: purl_test.R

[1] "purl_test.R"
```
これで`purl_test.R`というファイルが生成されます。内容はこんな感じ:

```r:purl_test.R
## ----setup, include=FALSE------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)

## ----cars----------------------------------------------------------------
# hogehoge
summary(cars)

## ----pressure, echo=FALSE------------------------------------------------
#' fugafuga
#' hogfuga
plot(pressure)
```

シンプルな仕上がりです。

## 引数による出力パターンの指定

先の例だと，各チャンクのヘッダー部分も持ってきてくれています。この`knitr::purl()`は`documentation=`という引数があり，出力のパターンを指定することができます:

- `documentation = 0`: チャンク内のコードのみのピュアなRスクリプトを出力
- `documentation = 1`: 各チャンクのヘッダー部分も合わせて持ってくる**(デフォルト)**
- `documentation = 2`: チャンク部分以外のテキスト(冒頭yaml部分も含む)を，roxygenスタイルのコメント(`#'`)で全て持ってくる

ということで引数を与えてみて試してみます。なおすでに生成予定のファイル名と同一のものが存在している場合，上書きされず何もされないみたいです。

`knitr::purl("purl_test.Rmd", documentation = 0)`の実行結果は以下の通り:

```r:purl_test.R
knitr::opts_chunk$set(echo = TRUE)
# hogehoge
summary(cars)
#' fugafuga
#' hogfuga
plot(pressure)
```

そして，`knitr::purl("purl_test.Rmd", documentation = 2)`の実行結果は以下の通り:

```r:purl_test.R
#' ---
#' title: "Untitled"
#' output: html_document
#' ---
#' 
## ----setup, include=FALSE------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)

#' 
#' ## hogehoge
#' 
#' hogehoge.
#' 
## ----cars----------------------------------------------------------------
# hogehoge
summary(cars)

#' 
#' ## fugafuga
#' 
#' Why are you using SJIS?
#' 
## ----pressure, echo=FALSE------------------------------------------------
#' fugafuga
#' hogfuga
plot(pressure)

#' 
#' end.

```

最後の`2`はパッケージ開発とかで使えそうですし，`0`や`1`も状況によって使えそうですね。

**Enjoy!**
TestAssistantの高DPI時の対応

またFriendly絡みの話です。
補助ツールのTestAssistantについてです。
高DPI時には画面が潰れるということが起きました。
まあWinFormのあるあるではあると思いますが。
完全対応はできませんでしたが部分対応はできたのでその対処方法を載せます。

# 対応方法
高DPIだとWinFormはレイアウトが崩れる的な話は記憶にあったので
それっぽく調べたら↓のサイトが見つかったので参照しました。
https://blogs.msdn.microsoft.com/ttanaka/2014/08/22/dpihigh-dpi-3-12503/

単にapp.configを修正すればいいらしい
で以下を追記すればいいみたい。

```xml
<assembly xmlns=”urn:schemas-microsoft-com:asm.v1″
    manifestVersion=”1.0″
    xmlns:asmv3=”urn:schemas-microsoft-com:asm.v3″ >
  <asmv3:application>
    <asmv3:windowsSettings
    xmlns=”http://schemas.microsoft.com/SMI/2005/WindowsSettings“>
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
```

今回はTestAssistantを使いたいので
フォルダ内の↓の2ファイルを書き換える。
2つは32bit版と64bit版となる。
Codeer.TestAssistant_x86.exe.config
Codeer.TestAssistant.exe.config

TestAssistantの対応としては以上。
ただこれだけでは全部はできないみたい。

トップレベルウインドウ解析で出る画像がなんかずれる。
自分の使い方がおかしいだけかもしれないけど。。。
右の構造ツリーと照らし合わせると大体わかるしいいか。
![error.png](https://qiita-image-store.s3.amazonaws.com/0/147331/742898ed-2859-0170-6b25-727d3c2384b5.png)

# WinFormの高DPI対応について
WinFormの高DPIで来てしまった方向けに
多分、その他のWinFormの高DPIも同じ解決法で大体いけると思います。
app.configに上記のxmlタグを追記すれば対応完了です。(完全ではなく大体かもですが)
app.configが用意されていない場合は気になるけど
WinFormなんて何年も作ってないしこれからも作る気はないので放置します。
Jupyter Notebook (IPython Notebook) で遊んでみる

ref: http://qiita.com/shizuma/items/027167c6257f1c9d2a6f

上の記事に従って, anaconda (Python & 各種パッケージの詰め合わせ) の最新版を pyenv 経由でインストールする. (pyenv は homebrew などで入れる)

```
pyenv install anaconda3-2.4.1
pyenv global anaconda3-2.4.1
```

起動は任意のフォルダに移動して

```
ipython notebook
```

すると, `localhost:8888` が立ち上がる.

## shortcuts

esc 状態で以下のショートカットが使える. vi のコマンドモードライク

ショートカット|機能
---|---
h|ヘルプ
b|新しい cell 作成
dd|現在の cell の削除
shift+enter|現在の cell の実行
s|保存
y|code cell へ
m|markdown cell へ

## テーマの変更

jupyterthemes を使う.

```
pip install jupyterthemes
jt -t onedork
```

## mysql に接続しデータを表示する

ref: http://qiita.com/shrkw/items/c38def7d60b0099b0c55

```
pip install pymysql
```

```
import pymysql

conn = pymysql.connect(host='localhost',
                       user='root',
                       password='',
                       db='mydatabase',
                       charset='utf8mb4',
                       cursorclass=pymysql.cursors.DictCursor)
```

## ユーザー情報の取得

pandas の dataframe にそのまま変換したいので, pandas の sql ライブラリを使う
ほか, 必要そうなライブラリも import しておく

```
import pandas
from pandas.io import sql
import numpy
import pylab
import pymysql
import matplotlib.pyplot as plt
%matplotlib inline
```

users 情報を取る

```
users = sql.read_sql('''SELECT users.* FROM users''', conn)
```

## pandas.DataFrame

基本統計量を出す

```
users.describe()
```

ヒストグラム一覧を出す

```
users.hist()
```

ユーザーの年齢をヒストグラムとして出す（ビンを 30 本とする）

```
# http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.hist.html
users.age.hist(bins=30)
```
fastlaneコマンド一発でin-houseビルドしてBeta Distributionする

# はじめに

fabricで公開されている[fastlaneのセットアップ手順](https://fabric.io/features/distribution)だけではin-houseなiOSアプリをCrashlytics Beta Distributionできなかったので、手順をまとめました。

# 前提条件

* 対象のアプリがXcodeからin-houseビルドできること
    * Product->Archive->Export->Save for Enterprise Deploymentで成功すること
* fabricのアカウントを取得していること

# 事前準備

## Crashlyticsのインストール

Crashlytics Beta Distributionだけしか使わない場合でも、Crashlyticsのインストールが必要です。
（未インストールだと、fastlaneが途中でコケる）

[公式の手順](https://fabric.io/kits/ios/crashlytics/install)通りにインストールして下さい。
その後、一度アプリをビルドしてRunして下さい。
（このタイミングで、Fabricにアプリの情報が送信される模様）

## Provisioning Profileの作成と指定

fastlaneでビルドするには、Automatically manage signingをオフにして手動でProvisioning Profileの指定が必要です。

まず、[Apple Developer Console](https://developer.apple.com/account/ios/profile/)からDevelopmentとDistribution(In House)両方のProvisioning Profileを作成し、
[fastlaneの公式ドキュメント](https://docs.fastlane.tools/codesigning/xcode-project/)を参考にXcodeからProvisioning Profileを指定して下さい。

## 配布先端末でのメールアカウントセットアップ

Crashlyticsからのメール受信に必要です。
自分の場合、 iCloudメールを使いました。

# fastlaneのセットアップ

まず、冒頭で紹介した[fastlaneのセットアップ手順](https://fabric.io/features/distribution)通りにセットアップします。
その後、Fastfileを開いて下記を参考にscheme、workspace、methodを指定します。

```
# More documentation about how to customize your build
# can be found here:
# https://docs.fastlane.tools
fastlane_version "1.109.0"

# This value helps us track success metrics for Fastfiles
# we automatically generate. Feel free to remove this line
# once you get things running smoothly!
generated_fastfile_id "d92ef24f-4e9d-452b-a5d1-a2c0e7a86e76"

default_platform :ios

# Fastfile actions accept additional configuration, but
# don't worry, fastlane will prompt you for required
# info which you can add here later
lane :beta do
  # build your iOS app
  gym(
    scheme: "hoge",                            # スキーム名
    workspace: "hoge/hoge.xcworkspace",        # ワークスペースのパス
    export_method: "enterprise"                # "Save for Enterprise Deployment"の指定
  )

  # upload to Beta by Crashlytics
  crashlytics(
    api_token: "your api_token",
    build_secret: "your build_secret"
  )
end
```
これでセットアップ完了です！

# ビルドからアプリの起動まで

## ビルドしてCrashlytics Betaにアップロード

下記のコマンド一発です。

```bash
$ fastlane beta
```

## アプリの配布とインストール

[Fabricのホーム](https://fabric.io/home)から配布したいアプリを選択後、左のメニューからBetaを選択し、「Add Testers」で配布先端末が受信できるメールアドレスを入力します。

その後、クラスメソッド様の[[iOS][Android] Crashlytics で配信されたベータ版アプリのインストール手順のまとめ](http://dev.classmethod.jp/smartphone/how-to-install-to-crashlytics-beta-app/)を参考にインストールします。

## アプリの起動

in-houseビルドなアプリの場合、iOSの設定画面から開発元のプロファイルを信頼しないと起動できません。
[カスタムのエンタープライズ App を iOS にインストールする際のガイドライン](https://support.apple.com/ja-jp/HT204460)を参考に、開発元のプロファイルを信頼して下さい。
【メモ】Android WIFI


`Android allows applications to access to view the access the state of the wireless connections at very low level.`
`Application can access almost all the information of a wifi connection.`

`The information that an application can access includes connected network's link speed,IP address, negotiation state, other networks information.`
`Applications can also scan, add, save, terminate and initiate Wi-Fi connections.`

`Android provides WifiManager API to manage all aspects of WIFI connectivity.`
`We can instantiate this class by calling getSystemService method.`

> https://www.tutorialspoint.com/android/android_wi_fi.htm

-----

### TDLS?
![tdls.png](https://qiita-image-store.s3.amazonaws.com/0/134166/b68c2de0-d375-576e-51bf-55ae1a3e309c.png)

-----


### WPS/WPA
`Wi-Fi Protected Setup`
`Wi-Fi Protected Access`


### DHCP
`Dynamic Host Configuration Protocol`


### FQDN
`Fully Qualified Domain Name`


### BSSID
`Basic Service Set Identifier`
Controllerの名前空間ややこしい問題


こんがらがる。

#Controllersディレクトリ直下

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    public function dummy(){
        return view('dummy');
    }
}
```

#Controllersのサブディレクトリ直下

```
<?php

namespace App\Http\Controllers\Ec;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class CartController extends Controller
{
    public function dummy(){
        return view('dummy');
    }
}
```
Azure Resource Manager で Ubuntu でいくつかのディスクをアタッチして１つにみせたい

# 概要

複数のディスクを束ねてひとつに見せたい。


# 目標

* １つあたりのディスクのサイズと、
* １つのマシンに何本ディスクをアタッチできるかを指定することができる

ARM を書きたい

# 結論

１つのディスクあたりのサイズの変更であることはわかった。

あとは、可変個だが、ARMだけではむずかしいか？

# 現在までにわかっていること

## Ubuntu

Ubuntu 用のスクリプトがあった

* [azure-quickstart-templates/vm-disk-utils-0.1.sh at master · Azure/azure-quickstart-templates](https://github.com/Azure/azure-quickstart-templates/blob/master/shared_scripts/ubuntu/vm-disk-utils-0.1.sh)

* [Azure/azure-quickstart-templates: Azure Quickstart Templates](https://github.com/Azure/azure-quickstart-templates)

の中に、いくつかディスクを束ねているテンプレートを見つけた。

どのようになっているのか調べた

## Windows (に限った話ではないが)

* [Azure VM に大容量ディスクを作ってみる – 一身独立して、一国独立す。](http://www.syuheiuda.com/?p=3908)

ディスクをアタッチしたあと、GUIで束ねている？
Laravel5.4が勝手に名前空間をつけてしまう問題


Controllerの名前空間がダブったりしてしまう問題を解決したい。

##解決法

`RouteServiceProvider.php`にある部分を以下のようにコメントアウトする。

```
    protected function mapWebRoutes()
    {
        Route::middleware('web')
//             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }
```
[obsolate]「らじるらじる」のエアチェックを rtmpdump(1) じゃなく、ffmpeg(1) でやってみる。

ネット上で rtmpdump コマンドを用いて録音するコマンドが、彼方此方で公開されている。
例では国営放送の FM で大阪放送局を、約五秒間録音出来るコマンドだ。

    % rtmpdump -r 'rtmpe://netradio-bkfm-flash.nhk.jp/live/NetRadio_BKFM_flash@108233' -W http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf -B 5 -o HOGEHOGE.flv

出来上がった録音ファイルは、flv コンテナに格納されるため、特定の音楽再生ブログラムでファイルを認識しない。
なので mp4 の書式に変換する手間を、省こうと思い実験してみる。

ffmpeg にも rtmp の各種プロトコルに対応しているので、rtmpdump に与えているスイッチを、ffmpeg に対応させてみる。
この ffmpeg には特に codec のライブラリはマージさせて無くても、録音ダケなら上手くいくはず。

    % ffmpeg -i 'rtmpe://netradio-bkfm-flash.nhk.jp/live/NetRadio_BKFM_flash@108233' -rtmp_swfurl http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf -t 5 HOGEHOGE.flv

各コマンドのスイッチに対応する表

| rtmpdump | ffmpeg       |
|:--------:|:------------:|
| -r       | -i           |
| -W       | -rtmp_swfurl |
| -B       | -t           |

これで、一発録音と変換が出来る。

2017/09/02 以降 rtmpe プロトコルでの配信が停止した模様で、url 一覧のアドレスも変更になった模様。

    http://www.nhk.or.jp/radio/config/config_web.xml

故に、rtmpdump が利用できなくなり、以下のコマンドに差し替えを要する。
例では国営放送の FM で福岡放送局を、約五秒間録音出来るコマンドだ。

    % ffmpeg -i 'https://nhkradiolkfm-i.akamaihd.net/hls/live/512097/1-fm/1-fm-01.m3u8' -t 5 -codec copy HOGEHOGE.m4a
Slackにより断片化した集中タイムを取り戻すための、Bot開発

Slackは、チーム内のコミュニケーションを取るためにはとても便利なツールです。

しかし、おそらくあなたが気付いているように、Slackはあなたの「集中タイム」を断片化します。投稿をしたら反応が気になる、投稿をしていなくてもどんな話題が交わされているのか気になる、時には重要な情報が飛んで来ることもあるから見逃せない・・・こうして、Slackのタブに灯る「*」マークは一瞬にして集中していた作業時間をストップさせてしまいます。

堅苦しい会議も時間の無駄になりがちですが、その一方でこうしたチャットツールによる「コミュニケーションの断片化」もまた問題であると言えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/a244d4f4-61fe-6d3e-4945-8c13e6c4de12.png)

そこで今回考案したのが、**Slack Referee**です。これは、端的にはSlackチャンネルを休憩スペースにするというアイデアです。つまり、休憩時間中だけ会話が可能で、それが終わったら作業を行う集中タイムに戻る、ということです。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/de59552a-238b-92f6-bbf6-632f93b6c70f.png)

コードは以下で公開しています。Heroku Buttonをつけているので、デプロイして使ってみることも可能です。

[chakki-works/slack-referee](https://github.com/chakki-works/slack-referee#readme)
(Starをいただけると励みになりますm(_ _)m)

<img alt="icon.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/25990/b59466dc-d6ae-6b6b-6be8-2bc1a993b5df.jpeg" width="100px"/>

ちなみに、Botの開発には[botkit](https://github.com/howdyai/botkit)を利用しました。botkitはSlack以外のチャットツールにも対応しているので、Slack RefereeもSlack以外へ転用することができる・・・はずです！

では、このSlack Refereeの機能を紹介したいと思います。

# 機能

## 発言の消去

Slack Refereeは、設定された「チャンネルの開放時間」以外に行われた発言を全て消去します(!)。チャンネルの開放時間にコミュニケーションを集中させることで、作業が妨げられることがなくなります。
作業への集中については、個人レベルでSlackを閉じるなどすればいいと思うかもしれません。が、自分以外のチームメンバが発言＆チャンネルを見ているとなると、コミュニケーションに齟齬が出る可能性があります。
チーム全体で発言について一定のルールを持つようにする、というのがこの対策のポイントです。

![slack_forbit.gif](https://qiita-image-store.s3.amazonaws.com/0/25990/7c7aedcd-215d-6f8f-f0e8-5deb446ef6a9.gif)

そう、Refereeを無視して発言をすることはできないのです。発言者には、ダイレクトメッセージで注意と次に紹介する伝言の記録機能が案内されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/30e42967-4dc8-a81b-2b81-790c81d7005d.png)


## 伝言の記録

とはいえ、チャンネル開放時間に居られるとは限りませんし、待っていると忘れてしまいそうだということもあります。そのため、共有しておきたい情報があればRefereeにダイレクトメッセージを送っておくと、次回のチャンネル開放時にその情報がチャンネルに公開されます。

メッセージを送っておく。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/4f2b77f8-daf9-26e5-df8b-94ed1838e99d.png)

チャンネルが解放されると。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/4d0334ce-b38c-668e-c789-d70cc8f5e520.png)


これでSlackコミュニケーションに秩序が持たされました！

# 効果

実際発言が削除されるのは、だいぶ不便になるかなと思いました。が、意外とそうでもなかったです。「絶対に通知がこない」とわかっているのはかなり集中力の向上に貢献しましたし、またチャンネルの開放時間が決まっているため相手からの返信を待ち続けるような時間もなくなりました(この方が効果として大きかったかも？)。

Slackでのコミュニケーションにお悩みの際は、ぜひ使ってみてください！
Dropbox > Link > Inside LAN Sync > LAN Syncのプロトコル

[networkについて検討中](http://qiita.com/7of9/items/c5f63a9f41a3a0c48634)にDropboxのLAN Syncという機能を知った。

そのプロトコルは以下のようだ。
https://blogs.dropbox.com/tech/2015/10/inside-lan-sync/

- SNI
- HEAD
- GET
- 200 OK

などが使われている。
Apex(ユーティリティ)

####SJISでのバイト数を取得する
```java
/*
 * SJISでのバイト数（全角2、半角1）を算出する
 * (String.length()は全角 半角を区別しない)
 */     
private static Integer getSJISLength(String s) {
    Integer zenkakuLength = s.replaceAll('[\\uFF61-\\uFF9F\\u0020-\\u007E]', '').length();
    Integer hankakuLength = s.length() - zenkakuLength;
    return zenkakuLength * 2 + hankakuLength;
}
```

####HTML文字列をPlainテキストに変換する
```java
/*
 * HTML文字列をPlainテキストに変換する
 *  html HTML 文字列
 *  戻り値 Plainテキスト
 */
public static String convertToHtmlToText(String html){
    String htmlPattern = '<(?i).*?>';
    String breakPattern = '(?i)<br\\s*/?>';  // matches <br>, <BR>, <br/>, <br />, <br   />, etc.
    String whitespacePattern = '\\s+';

    String workingText = html!=null ? html : '';

    // replace all HTML break tags with the newLine character
    Pattern lineBreaks = Pattern.compile(breakPattern);
    Matcher matchedLineBreaks = lineBreaks.matcher(workingText);
    workingText = matchedLineBreaks.replaceAll(CommonUtility.CRLF);

    //plainテキストに変換した時に見栄えがよくなるようにする
    workingText = workingText.replaceAll('</li>', CommonUtility.CRLF);
    workingText = workingText.replaceAll('<li>', '- ');
        
    // HTMLタグの削除
    Pattern htmlTags = Pattern.compile(htmlPattern);
    Matcher matchedHTML = htmlTags.matcher(workingText);
    workingText = matchedHTML.replaceAll('');

    //urlEncodeしてスペースと改行を補正する
    workingText = EncodingUtil.urlEncode(workingText, 'UTF-8');
    workingText = workingText.replaceAll('%C2%A0', '+'); //space
    workingText = workingText.replaceAll('%3Cbr%3E', '%0D%0A'); //carriage return
    workingText = EncodingUtil.urlDecode(workingText, 'UTF-8');   
            
    return workingText;
}        
```

####日付から日本語の曜日を返す
```java
private static Map<String, String> JPN_YOUBI = new Map<String, String>{'Monday'=>'月', 'Tuesday'=>'火', 'Wednesday'=>'水', 'Thursday'=>'木', 'Friday'=>'金', 'Saturday'=>'土', 'Sunday'=>'日' };

/*
 * 日付から日本語の曜日を返す
 *  dt 対象の日付時間
 */ 
public static String getJapaneseYoubi(Datetime dt){
    return JPN_YOUBI.get(dt.format('EEEE'));    
}
```
HTMLの全要素について同じパスごとに出現回数を数える。

# はじめに

&nbsp;&nbsp;今いま、取り組んでいる仕事で、頻繁にHTMLをパースすることがあって、そこで直面した課題と、それを楽に切り抜けたという小話。パーサーはNokogiriです。

# お題

&nbsp;&nbsp;あるHTMLの、とりあえず`<body>`の中で、同じパスの位置に出現する要素別に、その出現回数を数えなければならないという、ちょっと面倒なタスクが発生した。ここでいうパスとは、ざっくりいうと、XPathによる表記から n-th を表す `[n]`を除去したもの、ぐらいの意味。

&nbsp;&nbsp;たとえば、こういうHTML

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
    <p>あいうえお</p>
    <ul id="list_1">
        <li id="item_1" class="red">かきくけこ</li>
        <li id="item_2" class="blue">さしすせそ</li>
        <li id="item_3" class="red">たちつてと</li>
    </ul>
    <div>
        <p>なにぬねの</p>
    </div>
    <ul id="list_2">
        <li id="item_4" class="red">はひふへほ</li>
    </ul>
</body>
</html>
```
があったとして、クラスやid、および n-thは無視して、同じパスに出現する要素をカウントして、できれば多い順に

```
/html/body/ul/li: 4回
/html/body/ul: 2回
/html/body/p: 1回
/html/body/div/p: 1回
/html/body/div: 1回
/html/body: 1回
```
という結果が欲しい。

# 解法

&nbsp;&nbsp;出現順にソートするのは後でやるとしても、まずは、パスごとに出現回数を数えるようなものを作る必要がある。そのためには、要素のすべてを走査するようなロジックを書かないといけない。しかし、全要素をたどるメソッドを（再帰を使ったりして）自分で書くのは、車輪の再開発以外の何ものでもないなと思って調べたら、ありました。

[Nokogiri::XML::Node#traverse](
http://www.rubydoc.info/gems/nokogiri/Nokogiri%2FXML%2FNode%3Atraverse)

&nbsp;&nbsp;この`traverse`にブロックを渡してやれば、あとは面倒をみてくれそう。これは便利。ということで、以下で切り抜けました。

```ruby:count_element_paths.rb 
# coding: utf-8

require 'nokogiri'

body = Nokogiri::HTML.parse(<<-TARGET_HTML).css('body')[0]
	<!DOCTYPE html>
	<html lang="ja">
	<head>
	    <meta charset="UTF-8">
	    <title>Test</title>
	</head>
	<body>
	    <p>あいうえお</p>
	    <ul id="list_1">
	        <li id="item_1" class="red">かきくけこ</li>
	        <li id="item_2" class="blue">さしすせそ</li>
	        <li id="item_3" class="red">たちつてと</li>
	    </ul>
	    <div>
	        <p>なにぬねの</p>
	    </div>
	    <ul id="list_2">
	        <li id="item_4" class="red">はひふへほ</li>
	    </ul>
	</body>
	</html>
TARGET_HTML

# カウント結果を保存する、パス => 回数のハッシュ（回数の初期値：0）
counters = Hash.new(0)

# traverseメソッドで、全ノードについて、そのパスをカウント
body.traverse do |node|

  next if node.name == 'text' # テキストは数えない

  path_ignored_nth = node.path.gsub(/\[\d+\]/,'')  # パス文字列から n-th を表す部分を削除

  counters[path_ignored_nth] += 1  # カウンターを更新

end


# 結果を出力
counters.each do |path, counter|
  puts "#{path}: #{counter}"
end

```

上記を実行して、以下が得られました。

```shell-session
$ ruby count_element_paths.rb 
/html/body/p: 1
/html/body/ul/li: 4
/html/body/ul: 2
/html/body/div/p: 1
/html/body/div: 1
/html/body: 1
```

&nbsp;&nbsp;このあとは、対象のHTMLをファイルなりURL経由のものにしたり、結果をソートしたりなどの作業を淡々とこなして完成。

&nbsp;&nbsp;何か作ろうとしたときに、それのある部分について
「これはきっと、すでに他のデキる人が作ってくれてるハズ」
っていう予感みたいなの大事ですねと、改めて感じた次第。
（まあ、今回の`traverse`は自分で書いても数行の話ではありますけれども。）
ricohapi/video-streaming-sample-appで音声を出るようにした

#修正
## 場所1
* https://github.com/ricohapi/video-streaming-sample-app/blob/master/samples/common/app.js#L60

```js
- conn.mediaConstraints.audio = false;
+ conn.mediaConstraints.audio = true;
```

## 場所2
* https://github.com/ricohapi/video-streaming-sample-app/blob/master/samples/common/app.js#L100

```
- conn.session = { audio: false, video: true, oneway: this.isOneWay };
+ conn.session = { audio: true, video: true, oneway: this.isOneWay };
```


## 場所3
* https://github.com/ricohapi/video-streaming-sample-app/blob/master/samples/common/app.js#L157
```
- conn.session = { audio: false, video: true, oneway: true };
+ conn.session = { audio: true, video: true, oneway: true };
```


#説明
##const conn = new RTCMultiConnection();
* http://www.rtcmulticonnection.org/docs/

##conn.mediaConstraints.audio = false;
* http://www.rtcmulticonnection.org/docs/mediaConstraints/

##connection.session
```js
// it is same like "connection.session={audio:false}"
connection.mediaConstraints.audio = false;
```


##Constraintsとは
* https://w3c.github.io/mediacapture-main/getusermedia.html#terminology
Lumen 5.4 でハマるところ [WIP]

# 最初に

2017年3月2日未明にLaravelの軽量版Lumen、デフォルトブランチが5.4になったようです。そのため、`composer create-project --prefer-dist laravel/lumen blog`をやると、5.4系のLumenがインストールされます。

## 環境
- Laravel Framework Lumen (5.4.5) (Laravel Components 5.4.*)

# ハマるところ
## artisanが動かない。
```
$ php artisan -V

  [Symfony\Component\Debug\Exception\FatalThrowableError]
  Class 'Memcached' not found
```

エラー出ます。
`.env`に設定されている`CACHE_DRIVER=memcached`が原因。`.env`を治します。

```diff
- CACHE_DRIVER=memcached
+ CACHE_DRIVER=file
```

```
$ php artisan -V
Laravel Framework Lumen (5.4.5) (Laravel Components 5.4.*)
```
動いた。

## routes.php はどこ？
Laravel5.4系にならって`routes/web.php`になったようです。


## php artisan serve?
```
php -S localhost:8000 -t public
```

## Eloquent( DB::Where() や User::Where() などの機能)が動かない。

```diff:/boostrap/app.php
- // $app->withEloquent();
+    $app->withEloquent();  // コメントアウトを解除
```




# Lumen5.3系までのハマるところ

- [Lumen、いろいろハマるところ](http://qiita.com/yyano/items/57735763bec54e8ac8ee)
PEAR::DB 1.8以降でDB::connectが無くなった

> PHP Fatal error:  Cannot make static method DB::connect() non static in class DBcommon in 〜.php

`DB::connect()`を書き換えずに使い続けるなら1.7系最後の`1.7.14`を使う。

* https://pear.php.net/package/DB/download/All

```
pear install DB-1.7.14
```


* [rpm自作 (pearの例) - Qiita](http://qiita.com/tukiyo3/items/7125805e2e2e39a44a32)
AndroidのViewHolderパターンをKotlinでいい感じに書く

# 動機
AndroidのListViewなどで使われるViewHolderパターンをJavaで書いているような形をそのままKotlinで書いてしまうとなんだか気持ちがわるいコードになっていたのでいい感じに書けないか考えてみた。

# やってみる
## Java版

https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html

ここで紹介されているViewHolderパターンを元にKotlinのコードでいい感じに書いてみます。

```HogeAdapter.java
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolderItem viewHolder;
    if(convertView==null){
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);
        viewHolder = new ViewHolderItem();
        viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.textViewItem);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolderItem) convertView.getTag();
    }

    ObjectItem objectItem = data[position];
    if(objectItem != null) {
        viewHolder.textViewItem.setText(objectItem.itemName);
        viewHolder.textViewItem.setTag(objectItem.itemId);
    }

    return convertView;

}
```

## Kotlin版

Java版をKotlinで書き換えるのですが、そのまま書き換えると`var`を使った再代入のあるコードになってしまいそう。
Kotlinではfinalな変数を`val`で簡単に表現できます。
せっかくなのでそっちを使う方向に持っていきたいと思います。
`Pair`を使えばいい感じに書けそう？

```HogeAdapter.kt
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
    val (viewHolder, view) = if(convertView == null) {
        val inflater = (context as Activity).getLayoutInflater()
        val view = inflater.inflate(layoutResourceId, parent, false)
        val viewHolder = ViewHolderItem()
        viewHolder.textViewItem = view.findViewById(R.id.textViewItem) as TextView
        view.setTag(viewHolder)
        Pair(viewHolder, view)
    } else {
        Pair(convertView.tag, convertView)
    }

    val objectItem = data[position]
    if (objectItem != null) {
        viewHolder.textViewItem.text = objectItem.itemName
        viewHolder.textViewItem.tag = objectItem.itemId
    }

    return view
}

// 動作確認していないので動くかわからない…
```

`var`を使わずにViewHolderパターンを書くことができました :sparkles:

他にも良い書き方があれば教えていただけるとー 

# 参考
https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/
RおよびRStudioのインストール方法(Mac/Windows)

分析をする際によく用いられる「R」のインストール方法をまとめました。
また、RStudio は、GUIでRを扱いやすくしたものであり、
こちらを使用することで作業スピードがとてもあがるので、
こちらも合わせてインストールすることをオススメします。
※MacとWindowsではインストール方法が異なるので注意してください

#まずは紹介
以下のような画面での作業ができます。
##R
![スクリーンショット 2017-03-02 16.49.23.png](https://qiita-image-store.s3.amazonaws.com/0/147821/7df73c98-1e19-5056-a76e-b9c767866a8d.png)

こんな感じです(Mac)

##RStudio
![スクリーンショット 2017-03-02 16.48.35.png](https://qiita-image-store.s3.amazonaws.com/0/147821/e98cd4a4-57d3-b6b6-9fbe-41c0e6837f5f.png)

こんな感じです(Mac)



#Rのインストール
それでは、インストールしていきましょう！
https://cran.r-project.org/

をクリックしてインストールします。



![スクリーンショット 2017-03-02 16.12.49.png](https://qiita-image-store.s3.amazonaws.com/0/147821/accb254f-2165-19bd-c505-eb222acd1ed6.png)

このような画面がでてきます。


##Windowsの方
1. この画面上部の、「Download R for Windows」 を選択
2. 遷移先のページの、「base」 を選択
3. ![スクリーンショット 2017-03-02 16.15.34.png](https://qiita-image-store.s3.amazonaws.com/0/147821/9ea3bf1d-a3fd-e80a-6fcb-0a426fe12b72.png)
「Download R X.X.X for Windows」(X.X.Xはバージョン)をクリック
4. ダウンロードできたファイルをダブルクリックして、進めてください。("はい"、や"次へ"など肯定的な方を選択してください)
5. これでRのインストールは完了です。下にRStudioのインストール方法も記載しているので、そちらも進めていきましょう！


##Macの方
1. この画面上部の、「Download R for (Mac) OS X」 を選択
2. 
![スクリーンショット 2017-03-02 16.23.15.png](https://qiita-image-store.s3.amazonaws.com/0/147821/81df417e-a888-373a-1445-5b55c4600694.png)
 「R-X.X.X.pkg」(X.X.Xはバージョン)を選択するとダウンロードが始まります。
3. これでRのインストールは完了です。下にRStudioのインストール方法も記載しているので、そちらも進めていきましょう！


#RStudioのインストール
https://www.rstudio.com/products/rstudio/download/

をクリックしてインストールします。
ページ下部まで移動してください。
![スクリーンショット 2017-03-02 16.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/147821/ab8c56d7-0eb8-4d9d-1a53-8a5808a913ae.png)


##Windowsの方
1. 「RStudio X.X.X - Windows Vista/7/8/10」(X.X.Xはバージョン)を選択。
2. ダウンロードできたファイルをダブルクリックして、進めてください。("はい"、や"次へ"など肯定的な方を選択してください)
3. インストール完了です、開いてみてください。

※ユーザ名を日本語(アルファベットでないもの)にしている場合、正常にインストールできないことが多いです。ユーザ名を変更してみてください。

##Macの方
1.　「RStudio X.X.X - Mac OS X 10.6+ (64-bit)」(X.X.Xはバージョン)を選択。
2.　ダウンロードできたファイルをダブルクリックすると、ウィンドウが開きます。「RStudio」 をドラッグ&ドロップして、「Applications」の上にもっていくと、インストールが開始します。
3.　インストール完了です、開いてみてください。
SublimeText3 Keybindingsメモ

Sierraアップデートでひどい目にあってキーボードがむちゃくちゃになった上での設定

```json:json

[
  { "keys": ["end"], "command": "move_to", "args": {"to": "eol"} },
  { "keys": ["shift+end"], "command": "move_to", "args": {"to": "eol", "extend":true } }
]

```
2017年 Atomオススメパッケージ

---

## はじめに

[Atom](https://atom.io/)とはGithub社が開発元のテキストエディタです。デザインテーマやプログラミングをする際に便利なパッケージが豊富にあり、それらを簡単に管理画面から追加・変更出来るため人気のエディタです。

今現在使用していて、[Sublimetext](https://www.sublimetext.com/3)に比べると多少のもっさり感があるものの気に入って使っています。[Sublimetext](https://www.sublimetext.com/3)に関する記事も以前に書いたものがあるので、気になった方は見てみてください。
[こちらにリンクを貼っておきます](http://ken-sayama.hateblo.jp/entry/2015/08/21/003948)

## パッケージのインストール方法

上部メニューよりPreferencesを選択し、表示された管理画面のInstallよりパッケージを検索して、installを行います。
稀にAtomの再起動が必要なパッケージもあるようなので、インストールが終わったらとりあえず再起動としておきましょう。

## 用途別パッケージ

### とりあえず入れておくパッケージ

* [Linter](https://atom.io/packages/linter)

> 構文チェック

* [emmet](https://atom.io/packages/emmet)

> コーディングを強力にサポートしてくれる

* [Project-manager](https://atom.io/packages/project-manager)

> プロジェクトごとに管理する

* [file-icons](https://atom.io/packages/file-icons)

> 各プログラミング言語毎にfileのアイコンを変更してくれる

* [autocomplete-paths](https://atom.io/packages/autocomplete-paths)

> ファイルのパスなどを自動補完してくれる

* [atom-clock](https://atom.io/packages/atom-clock)

> ついつい時間を忘れがちだけど、時間を意識するための予防線

* [imdone-atom](https://atom.io/packages/imdone-atom)

> タスク管理

* [open-recent](https://atom.io/packages/open-recent)

> 直近で開いたファイルを記憶してくれる

* [pigments](https://atom.io/packages/pigments)

> カラーコードをハイライトしてくれる

* [remote-edit](https://atom.io/packages/remote-edit)

> サーバー内のファイルをいじるときにAtomでいじれるようにしてくれる

* [smart-tab-name](https://atom.io/packages/smart-tab-name)

> タブに表示されるファイル名にパスを追加してくれる

* [show-ideographic-space](https://atom.io/packages/show-ideographic-space)

> 全角スペースのハイライト

* [atom-beautify](https://atom.io/packages/atom-beautify)

> 大抵の言語のコード補完をやってくれる

* [Auto-Indent](https://atom.io/packages/auto-indent)

> 空白をよしなにしてくれる

* [Atom Tool Bar](https://atom.io/packages/tool-bar)

> Atomにツールバーをつけてくれる



### git関連

* [git-plus](https://atom.io/packages/git-plus)

> atomでgitを使うときはとりあえず入れておくと便利

* [git-log](https://atom.io/packages/git-log)

> gitのコミット履歴なんかをみれるようにする

* [tree-view-git-branch](https://atom.io/packages/tree-view-git-branch)

> branchをatom上で見れて変更も出来る

* [merge-conflict](https://atom.io/packages/merge-conflicts)

> コンフリクトが起こったときに解消しやすくしてくれる便利なやつ


### minimap関連

* [minimap](https://atom.io/packages/minimap)

> minimapを使えるようにする

* [minimap-pigments](https://atom.io/packages/minimap-pigments)

> minimapにpigmentsを適用させる

* [minimap-highlight-selected](https://atom.io/packages/minimap-highlight-selected)

> 選択中の行をminimapにもハイライトしてくれる

* [minimap-git-diff](https://atom.io/packages/minimap-git-diff)

> minimapにもgit-diffを適用してくれる

* [minimap-autohide](https://atom.io/packages/minimap-autohide)

> minimapがスクロール時にだけ出るようにする




### terminal関連

* [terminal-plus](https://atom.io/packages/terminal-plus)

> ここについてはterm3などAtomエディター上でターミナルを開けるプラグインはいくつかありますが、terminal-plusはIDEのように下から出てきてくれるので、邪魔な時にいちいちタブを消す必要がないので、とにかく便利です！

　
　
　
---

常時いいのがあったら更新予定です。
オススメのパッケージなどありましたら、コメントで教えていただけると幸いです。

---

#### 2017年9月22日更新
実装はまだだけど、ルートにコントローラは紐付けておきたい時


ダミーのビューを返すメソッド `@dummy` を作っとくと便利。

```
// コントローラ
...
class HomeController extends Controller
{
	public function dummy(){
	    return view('dummy');
	}
}

// ルート
...
Route::get('/home', HomeController::class.'@dummy');
```
プレミアムフライデーを求める記述をKotlinで書いてみた

# これは何？
[プレミアムフライデーを求めるメソッドを作った（Java8版） \- Qiita](http://qiita.com/deaf_tadashi/items/963a62072338f09f12a5)のコードをKotlinで書いてみたもの。

#コード

```Kotlin
import java.time.*
import java.time.Month.*
import java.time.format.DateTimeFormatter
import java.time.temporal.TemporalAdjusters

object PremiumFridayKotlin {

    @JvmStatic fun main(args: Array<String>) {

        val years = intArrayOf(2017, 2018, 2019, 2020)
        for (year in years) values()
                    .filterNot { year == 2017 && it == JANUARY }
                    .map { YearMonth.of(year, it) }
                    .map { getMonthOfPremiumFriday(it) }
                    .forEach { println(DateTimeFormatter.ofPattern("yyyy/MM/dd(E)").format(it)) }
    }

    private fun getMonthOfPremiumFriday(ym: YearMonth): LocalDate {

        val premiumFriday = ym.atEndOfMonth().with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY))

        return premiumFriday

    }


}
```

すごーい、わかりやすい！

## 注意
あくまでも趣旨はプレミアムフライデーの日付を返すことなので、別のメソッドにしています。

## 懺悔
Kotlin全く書けないマンなので、[IntelliJ IDEA the Java IDE](https://www.jetbrains.com/idea/) を使ってJavaのコードをKotlinに変換してもらっただけです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/syobochim">@syobochim</a> <a href="https://twitter.com/aa7th">@aa7th</a> あと、JavaコードをコピーしてKotlinファイルに貼り付けても変換してくれる！</p>&mdash; 山本 裕介 (@yusuke) <a href="https://twitter.com/yusuke/status/773392975531483136">2016年9月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

このコードはインチキだ！などとクレーム付けないでください。
こう書けるよ、という指摘は勉強になるのでお願いします。


##何が言いたいかというと
### Kotlin1.1のリリース、おめでとうございます
[Kotlin 1\.1 リリース – JavaScriptサポート、コルーチン\(coroutine\)等々 \| JetBrains ブログ](https://blog.jetbrains.com/jp/2017/03/01/739)

### IntelliJ IDEAは素晴らしいツール！
業務で使う機会あるかなぁ
Firebase 入門 - 環境を整える

いま作ろうとしている ロボット的な物のサーバとして GoogleのBaaS Firebase を使ってみようと思っているので、初期設定等のまとめを書いてみました。  

#新規作成＆デプロイ
* Googleアカウントで firebase console へログインする<br>
https://firebase.google.com/?hl=ja
* 新規プロジェクトを作成する。<br>"国 / 地域" として日本が選べるので選択する  
* コマンドラインツール firebase-tools を npm でインストールする <br>  `npm install -g firebase-tools`  
* コマンドラインツールでログインをする <br>`firebase login` 
* プロジェクトディレクトリを初期化する <br>`firebase init`
* 今回はサンプルなので `Hosting` を選び、2で作成したプロジェクトを選択する <br> 残りの選択は全て Yes で。<br> `firebase.json` や `public` ディレクトリが作成される。
* `public/index.html` を開いて適当に編集する。
* ローカル環境で実行して内容を確認してみる <br> `firebase serve` <br> 表示される URLをブラウザで開く<br> http://localhost:5000
* デプロイを実行する <br>`firebase deploy --only hosting`<br>`--only hosting`で一部デプロイ。--only パラメータで指定出来るのは `hosting`、`database`、`storage` この3種類。
* デプロイ成功したら ブラウザで開いてみる. <br>`firebase open hosting:site` 

非常に簡単に環境を作ることができ、デプロイまで実行できました。

# 参考
[Firebaseの始め方](http://qiita.com/kohashi/items/43ea22f61ade45972881)
Circle CIでparallelが有効な場合のcircleci-bundle-update-prの使い方

# 課題

gemのバージョンが古くなったままになっていたまま放置されていた。
ときどき、個別にbundle updateしていたが、もっと小まめにやりたい。
どうせなら勝手にやって、問題があるときだけ教えてほしい。

# 調査

ありがたいことに、ci-bundle-updateというHerokuアプリと、circleci-bundle-update-prというgemが存在しました。

## ci-bundle-update

ci-bundle-updateはHerokuアプリ。
Herokuのアプリといっても、Web用の画面はなく、コマンドラインのみ。
Heroku Schedulerを使って、cronのように1日1回Circle CIに該当リポジトリのNightly buildを依頼するという役割のみ。

- [ci-bundle-update](https://github.com/masutaka/ci-bundle-update)

上記のリンクから`Deploy to Heroku`ボタンを押して、適切な環境変数を設定すれば、Circle CIのNightly buildのAPIを使ってビルドしてくれます。

このアプリ、よく考えたら名前がよくない気がします（ありがたいアプリではあるのですが）。
というのも、`bundle update`をするかどうかは、該当プロジェクトの`circle.yml`の設定次第だからです。
ci-nightly-buildとかがいいような…。

ちなみに、Heroku Schedulerに設定するコマンドは、こう。

```bash
bundle exec ruby ci-bundle-update.rb
```

Heroku Schedulerに指定する前に、手動で動かして動作チェックしたい場合、ローカルで以下のように打ちます。

```
heroku run bundle exec ruby ci-bundle-update.rb --app [app_name]
```

## circleci-bundle-update-pr

circleci-bundle-update-prは、Circle CI上でbundle updateしてgithubへのPull Requestを作るgemです。
ci-bundle-updateによるNightly buildの依頼がきたときのみ、実行するものになります。

- [Circleci::Bundle::Update::Pr](https://github.com/masutaka/circleci-bundle-update-pr)

## 使い方

使い方はppworksさんが詳しく書いてくれているので、そちらを参考にしてください。

- [Circle CIでbundle updateのPull Request作成を自動化する手順](http://ppworks.hatenablog.jp/entry/2015/12/23/214644)

上記のURLの説明と違う部分のみ後述します。

### bundle updateを実行したプロジェクトのcircle.yml

`deployment`ブロックは以下の通り。ci-bundle-update経由での依頼の場合のみ、`BUNDLE_UPDATE`という変数が有効になっているので、そのときだけcircleci-bundle-update-prをインストールし、即実行しています。
`<github user_name>`,`<github user_email>`,`<branch_name>`は省略できるかもしれないが、私は省略しなかったので、もし動かなかった場合は全部入れましょう。`<branch_name>`は省略するとmasterが指定されるのはソース読んで確認しました。

```yaml:circle.ymlのdeploymentブロック
deployment:
  production:
    branch: master
    commands:
      - |
        if [ "${BUNDLE_UPDATE}" ] ; then
          gem update bundler --no-document
          gem install circleci-bundle-update-pr
          circleci-bundle-update-pr <github user_name> <github user_email> <branch_name>
        fi
```

次に、`test`ブロックです。ppworksさんの記事のように、`${BUNDLE_UPDATE}`がある場合はテストをスキップしたいのですが、ヒアドキュメントで記述しながら並行実行の設定をする方法がわかりませんでした。

```yaml:circle.ymlのtestブロック（ppworksさんバージョン）
test:
  override:
    - |
      if [ -z "${BUNDLE_UPDATE}" ] ; then
        bundle exec rspec --fail-fast
      fi
```

結構ググったのですが、多分なさそうだなと思ったので、シェルスクリプトを作成して指定しました。

参考URL
- https://circleci.com/docs/1.0/parallel-manual-setup/#manual-balancing

```bash:bin/rspec.sh(新規作成)
#!/bin/bash

if [ -z "${BUNDLE_UPDATE}" ] ; then
    bundle exec rspec --profile 20 --format documentation --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec.xml $@
fi
```

忘れずに実行権限を与えましょう。

```bash
chmod +x bin/rspec.sh
```

その後、circle.ymlを修正します。

```yaml:circle.ymlのtestブロック(並列実行)
test:
  override:
    - bin/rspec.sh:
        parallel: true
　　　　　　　　　　　　　　　　files:
          - spec/**/*_spec.rb
```

これで完成です。

# まとめ

自動で`bundle update`が実行され、その差分へのリンクをcircleci-bundle-update-prが作ってくれるため、もし`bundle update`後のPRでテストがこけても、調査するための時間が短くて済みます。やっといて損はないなと思います。
[GCC][C/C++] GCCのサポートしている規格を一覧表示

これまでGCCのバージョンと以下のページを比較してどの規格がサポートされているか確認していたけれども、もっと簡単な方法があったのでメモ

[C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)](https://gcc.gnu.org/projects/cxx-status.html)

# TL;DR

以下を実行すればよいかと思います。

```
$ g++ -v --help 2>/dev/null | grep -E "^\s+\-std=.*$"
```

# 使用例

```console:サポートしている規格の一覧表示
$ g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -v --help 2>/dev/null | grep -E "^\s+\-std=.*$"
  -std=<standard>          Assume that the input sources are for <standard>
  -std=f2003                  Conform to the ISO Fortran 2003 standard
  -std=f2008                  Conform to the ISO Fortran 2008 standard
  -std=f2008ts                Conform to the ISO Fortran 2008 standard
  -std=f95                    Conform to the ISO Fortran 95 standard
  -std=gnu                    Conform to nothing in particular
  -std=legacy                 Accept extensions to support legacy code
  -std=c++03                  Conform to the ISO 1998 C++ standard revised by
  -std=c++0x                  Deprecated in favor of -std=c++11
  -std=c++11                  Conform to the ISO 2011 C++ standard
  -std=c++1y                  Conform to the ISO 201y(7?) C++ draft standard
  -std=c++98                  Conform to the ISO 1998 C++ standard revised by
  -std=c11                    Conform to the ISO 2011 C standard (experimental
  -std=c1x                    Deprecated in favor of -std=c11
  -std=c89                    Conform to the ISO 1990 C standard
  -std=c90                    Conform to the ISO 1990 C standard
  -std=c99                    Conform to the ISO 1999 C standard
  -std=c9x                    Deprecated in favor of -std=c99
  -std=gnu++03                Conform to the ISO 1998 C++ standard revised by
  -std=gnu++0x                Deprecated in favor of -std=gnu++11
  -std=gnu++11                Conform to the ISO 2011 C++ standard with GNU
  -std=gnu++1y                Conform to the ISO 201y(7?) C++ draft standard
  -std=gnu++98                Conform to the ISO 1998 C++ standard revised by
  -std=gnu11                  Conform to the ISO 2011 C standard with GNU
  -std=gnu1x                  Deprecated in favor of -std=gnu11
  -std=gnu89                  Conform to the ISO 1990 C standard with GNU
  -std=gnu90                  Conform to the ISO 1990 C standard with GNU
  -std=gnu99                  Conform to the ISO 1999 C standard with GNU
  -std=gnu9x                  Deprecated in favor of -std=gnu99
  -std=iso9899:1990           Conform to the ISO 1990 C standard
  -std=iso9899:199409         Conform to the ISO 1990 C standard as amended in
  -std=iso9899:1999           Conform to the ISO 1999 C standard
  -std=iso9899:199x           Deprecated in favor of -std=iso9899:1999
  -std=iso9899:2011           Conform to the ISO 2011 C standard (experimental
```

# 参考
[c++ - g++ standards support - Stack Overflow](http://stackoverflow.com/questions/3595750/g-standards-support)
UIActivityを使ってSwiftからInstagramやSnapchatに写真を共有する

UIActivityを使って各SNSへ写真の共有が出来るようにしようとして、Instagramの対応を行う時に一点ハマったのでメモ。

## 問題の箇所
```swift
  // シェア機能で共有したい項目
  let activityItems: [Any] = [<シェアする内容（title, url, image）>]
        
  // VCの初期化
  let activityVC = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
```
ここで、activityItemsに入れる項目の種類によって、選択できるActivitiesが変動しています。
InstagramやSnapchatを適用させたい場合はactivityItemsに画像のみを入れて初期化すると適用されます。
Firefox+vimperatorユーザーがChrome+cvimに乗り換えた話

## 経緯など

マウスを使わずして、viライクなキーバインドでブラウザを操作できるプラグインvimperator。
これがあるからこそ、ずっとFirefoxユーザーをつらぬいてきたわけですが、最近のFirefox 51 へのバージョンアップにともない動作がおかしくなってしまいました。

タブ周りが動作しなくなっちゃったのは、以下の記事を参考にどうにかなりました。

> **Firefox 51で使えなくなったVimperatorのtabopenなど一部機能を自分で実装する**
https://rcmdnk.com/blog/2017/01/27/computer-firefox/


しかし困ったのが、リンクをキーボードだけで操作するhint機能。
これがVimperatorだけでは使えない。他のプラグインを組み合わせればどうにかなるっぽいけど、そこまでやりたくもない。


で探してみたら、Chrome + cvimというソリューションがあるらしい！
(ちなみに以前、Chrome + vimniumを試してそっととじした苦い経験もあり)


<img width="400" alt="Screen Shot 2017-03-02 at 16.03.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/c6517f49-4733-03c3-2a9e-6dc9039bcffb.png">



使ってみたら、なかなか良かったので共有です。
openのsuggestionの出る位置がアドレスバーの近くというのがvimperatorユーザーとしては違和感ありですが、それ以外はほぼ問題なし。
ついにFirefoxを去る時が来たか。。


cvimrcには以下の最低限な設定をしてます。
これだけで使い物になるのが素晴らしい。

```
" vimのキーバインドが優先されるようフォーカス外す
set noautofocus

" 日本人
let locale="jp"

" タブは修飾キーなしで操作したい
unmap h l d
map h previousTab
map l nextTab
map d closeTab
```


## 後日談

今日ひさびさにFirefox立ち上げてみたら、Vimperatorがまともにうごくようになっている！
実はFirefoxのinspectorの方が好みだったりするので、またもとさやに戻りましたとさ。

おしまい。
BigQuery のドキュメントの English <-> Japanese の興味深い差

## 2017-03-02 15:00 JST 時点

English Version のみに存在

```
Copy jobs

The following limits apply to copying tables in BigQuery.

Daily Limit: 1,000 copy jobs per table (copy destination table) per day (including failures), 10,000 copy jobs per project (under which the copy job is running) per day (including failures).
```
sqlfiddleのかわりにつかえそうなonline sql editor

ブラウザ上で手軽にSQLが試せる [sqlfiddle](http://sqlfiddle.com/)、非常に便利なのですが最近不調なことが多いです。
アクセスしても何も表示されなかったり、一見うまく動いてテーブル等が作れたように見えてそれ以降クエリ実行しようとすると固まったり……。

ということで、かわりになるものを探しました。
見つかり次第追記するかもしれません。
「こんなのあるよ」というのがありましたら是非教えてください。

## MS SQL Server

http://rextester.com/l/sql_server_online_compiler
このrextester.comというサイトは、SQL以外にもいろいろ試せていい感じです。

## Oracle

http://rextester.com/l/oracle_online_compiler
https://livesql.oracle.com/apex/f?p=590:1:0
Oracle公式。要Oracleアカウント。

## MySQL

http://rextester.com/l/mysql_online_compiler
https://www.tutorialspoint.com/execute_sql_online.php
こっちはMySQLじゃなくてMariaDBでしたが、まあほぼ同じでしょう（適当）

## PostgreSQL

http://rextester.com/l/postgresql_online_compiler

## sqlite

https://sqliteonline.com/
mysql float, double, decimal区別

- DECIMAL：　Fixed-Point Types (Exact Value)
- FLOAT, DOUBLE：　Floating-Point Types (Approximate Value) 

http://stackoverflow.com/questions/10446581/mysql-round-weird-bug
https://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html
https://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html
WordPress のテスト環境でリダイレクトループする場合の対処法

テスト環境で Browsersync を使っていたり、実際の URL と異なるところから閲覧するとリダイレクトループしてしまう場合があります。

解決するには、テーマの functions.php に以下の一行を追加します。

```
remove_action('template_redirect', 'redirect_canonical');
```

おしまい。本番環境では使わないことをオススメします。
sudo の応答が遅い：原因は名前解決

- 原因は名前解決でした。
    - 以下のファイルをチェック
        - [ ] ホスト名に対するIPアドレスは正しいか
        - [ ] Nameserver のIPアドレスは正しいか
- これらのファイルを修正したら応答が格段に早くなりました。

```
/etc/hosts
/etc/resolv.conf
```
Ergodoxのマウススピード


Ergodoxのマウス機能を使っている方がどれだけいることやらわかりませんが
マウススピードを設定する方法をググってもわかりずらかったのでメモ

`git grep`をかけてみると`qmk_fireware/keyboards/ergodox/config.h`の冒頭にこのようにあります

```c:config.h
#define MOUSEKEY_INTERVAL       20
#define MOUSEKEY_DELAY          0
#define MOUSEKEY_TIME_TO_MAX    5
#define MOUSEKEY_MAX_SPEED      2
#define MOUSEKEY_WHEEL_DELAY 0
```

どうやらこれをいじれば良さげ
自分の`keymap.c`と同じディレクトリに`config.h`を用意
私の場合は以下のようにしています

```c:config.h
#include "../../config.h"
#define PREVENT_STUCK_MODIFIERS

#undef MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 20

#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_MAX_SPEED 5

#undef MOUSEKEY_MOVE_DELTA
#define MOUSEKEY_MOVE_DELTA 5

#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
```
[C++][C++11~] コピペ用クラス定義テンプレート

毎回調べてるのでテンプレートをメモ

```cpp:class_template.h
#pragma once

class X {
 public:
	X();
	~X() = default;

 private:
	X(const X&) = delete;
	X(X&&) = delete;
	X& operator=(const X&) = delete;
	X& operator=(X&&) = delete;
};

X::X() {
}
```

よくあるパターンとして以下を禁止しています。

+ コピーコンストラクタ
+ コピー代入演算子
+ ムーブコンストラクタ
+ ムーブ代入演算子

必要があれば上記を定義してpublicに移動する運用です。
以下などで置換して使用します。

```vim:vim
:%s/X/Hoge/g
```

# 参考
[C++11時代におけるクラスの書き方 - イグトランスの頭の中](http://dev.activebasic.com/egtra/2011/12/02/451/)
ヘッドレスブラウザのヘッドって何?

# 背景

スクレイピング業界(?)ではすっかりお馴染みのヘッドレスブラウザ(headless browser)ですが、ヘッドレスの「ヘッド」ってつまり何なのか、語源や意味を調べてみました。

# で、ヘッドって何?

ヘッドレスブラウザ自体は、GUI が無いブラウザのことを指していますが、その語源は、GUI のないソフトウェアである Headless Software 、さらにモニターやらキーボード・マウスの類が必要ない Headless Computer から来ていると推測されます。Headless Computer まで遡ると、当時のパソコンは、モニターが CRT モニターでしたので、CRT を頭に例えて、CRT が不要なことを headless と指し始めたのではないかと推測しました。

# 詳しく

https://en.wikipedia.org/wiki/Headless_computer


> A headless system is a computer system or device that has been configured to operate without a monitor (the missing "head"), keyboard, and mouse.