OmniAICreator/Qiita-1.07M huggingface dataset:
内閣府Webサイトから四半期名目GDPをgetする( Bash & awk )

内閣府Webから四半期GDPを得るスクリプト。
最新の統計表一覧ページおよびcsvファイルのURLはデータがアップされるごとに変更されるため、[ 四半期GDP速報トップ ]( http://www.esri.cao.go.jp/jp/sna/sokuhou/sokuhou_top.html )からリンクを辿っている。

``` bash:gdpget.sh
#!/bin/bash
wget http://www.esri.cao.go.jp/jp/sna/sokuhou/sokuhou_top.html -O sokuhou_top.html
wget http://www.esri.cao.go.jp/jp/sna/sokuhou/$(cat sokuhou_top.html |sed -e 's/\r//g' -e 's/href="/href="\n/g' -e 's/html"/html\n"/g' |grep -a1 統計表一覧|head -1) -O gdemenuja.html
curl http://www.esri.cao.go.jp/$(cat gdemenuja.html |sed -e 's/\r//g'|grep csv|grep 名目原系列|sed -e 's/href="/href="\n/g'  -e 's/csv"/csv\n"/g'|grep gaku|grep -v kgaku)|nkf > tmpa
cat tmpa|awk -F, 'NR==3||NR==4||NR>=8{print}END{}'|sed -e 's/[0-9],\([0-9]\{3\}\)./\1./g' -e 's/"//g'|awk -F, 'BEGIN{OFS=","}NR==1{NF=13;$1="time";$4="家計消費";$5="持家帰属家賃を除く家計消費";$11="純輸出";$12="輸出";$13="輸入";print}NR>=3{NF=13;print}'|sed -e 's/\t/,/g' -e 's/ //g' >nominalgdp.csv
rm sokuhou_top.html gdemenuja.html tmpa
echo nominalgdp.csvへ名目GDPデータを保存しました
```

``` shell-session
$ ./gdpget.sh
(略)
nominalgdp.csvへ名目GDPデータを保存しました

$ head -3 nominalgdp.csv
time,国内総生産(支出側),民間最終消費支出,家計消費,持家帰属家賃を除く家計消費,民間住宅,民間企業設備,民間在庫変動,政府最終消費支出,公的固定資本形成,純輸出,輸出,輸入
1994/1-3.,12796.3,6829.3,6215.9,5617.9,984.4,2312.5,-480.9,1358.4,1191.5,-113.7,714.8,1249.3
4-6.,12571.1,6713.6,6447.8,5747.1,320.7,1545.6,820.6,2182.0,672.2,31.8,284.6,1981.7

$ tail -3 nominalgdp.csv 
2017/1-3.,13617.5,7058.5,7411.6,6932.7,303.3,2086.5,-960.8,2349.5,539.9,8.2,232.5,2936.4
4-6.,13533.1,7956.0,7933.0,6450.6,212.8,1283.9,110.9,2360.8,737.8,0.6,870.2,2092.4
7-9.,13285.3,7531.6,7560.7,6067.4,527.5,2195.5,171.1,2566.3,593.9,1.7,697.6,2828.8

```

Done.(ヽ'ω`)
同様にすれば実質GDPも取得できる。
Pythonでデザインパターン　Strategyパターン

#概要

**取り替え可能パーツ群を戦略的に利用せよ！！**

#参考

@kidach1 さん、
Rubyによるデザインパターン【Strategy】-取り替え可能パーツ群を戦略的に利用せよ-
https://qiita.com/kidach1/items/02f8f6df955ba1d0e93b

ストラテジ(Strategy) | Ruby デザインパターン
http://morizyun.github.io/ruby/design-pattern-storategy.html

#どんなパターンか
抽象的な処理と具体的な処理を分離することで、
**変化に強い構造**を実現する。

→その目的はTemplate Methodとほぼ同等

#Template Methodの課題
しかし、Template Methodには欠点がある。それは、
継承をベースにしていること。

**継承の欠点**
http://qiita.com/kidachi_/items/4b63de9ad5a97726c50c#2-3

スーパークラスの振る舞いの変更は、サブクラスの振る舞いを変える
サブクラスはスーパークラスの中身を覗くことが出来る
そこでStrategyでは、
変化しやすいコードの塊を抽出し、
**全く別のクラス**に閉じ込める。

つまり、集約を使う。

#異なるオブジェクトからアルゴリズムを引き出す
同じ目的を持った一群のオブジェクトをストラテジ（群）と捉える。
ストラテジ群は、そのすべてが全く同じインターフェイスを提供する。

コンテキスト（ストラテジを利用する側）は、各ストラテジを
**取り替え可能パーツ**として扱うことが出来るようになる。

→**関心の分離** を実現する。

#ストラテジの構成
ストラテジは次の3つのオブジェクトによって構成されます。

**コンテキスト(Context)**：ストラテジの利用者
**抽象戦略(Strategy)**：同じ目的をもった一連のオブジェクトを抽象化したもの
**具象戦略(ConcreteStrategy)**：具体的なアルゴリズム

ストラテジのアイデアは、**コンテキストが「委譲」によってアルゴリズムを交換できる**ようにすることです。**委譲**とは、**ある機能をもつオブジェクトを生成してオブジェクトに処理を依頼すること**です。

#ストラテジのメリット
- 使用するアルゴリズムに多様性を持たせることができる
- コンテキストと戦略を分離することでデータも分離できる
- 継承よりもストラテジを切り替えるのが楽

#実装
レポートをHTML形式とプレーンテキスト形式で作成するプログラムをサンプルとしてストラテジーパターンを解説します。サンプルの概要は次のとおりです。

- **Report(コンテキスト)**：レポートを表す
- **Formatter(抽象戦略)**：レポートの出力を抽象化したクラス
- **HTMLFormatter(具象戦略1)**：HTMLフォーマットでレポートを出力
- **PlaneTextFormatter(具象戦略2)**：PlanTextフォーマットでレポートを出力

まずイメージしやすい、HTML形式で出力するHTMLFormatterクラスとPlaneTextFormatterクラス、そしてその2つのクラスのインタフェースを規定するFormatterクラスを作成します。

```python
# レポートの出力を抽象化したクラス(抽象戦略)
class Formatter:
  def output_report(self, title, text):
    raise 'Called abstract method !!'

# HTML形式に整形して出力(具体戦略)
class HTMLFormatter(Formatter):
  def output_report(self, report):
    print ("<html><head><title>"+ report.title + "</title></head><body>")
    for line in report.text:
      print("<p>"+ line +"</p>")
    print ('</body></html>')

# PlaneText形式(*****で囲う)に整形して出力(具体戦略)
class PlaneTextFormatter(Formatter):
  def output_report(self, report):
    print ("***** " +report.title + " *****")
    for line in report.text:
      print( line )
```

続いてレポートを表すReportクラスを作成します。このクラスにはformatterがあり、このformatterによって出力フォーマットを設定します。

```python
# レポートを表す(コンテキスト)
class Report:
  def __init__(self, formatter):
    self.title = 'report title'
    self.text = ['最高', '順調', '普通']
    self.formatter = formatter
  def output_report(self):
    self.formatter.output_report(self)
```

コーディングは以上です。では結果を確認します。

```python
html_report = Report( HTMLFormatter() )
html_report.output_report()
#<html><head><title>report title</title></head><body>
#<p>最高</p>
#<p>順調</p>
#<p>普通</p>
#</body></html>
plaintext_report = Report( PlaneTextFormatter() ) 
plaintext_report.output_report()
#***** report title *****
#最高
#順調
#普通
```

Reportクラス内のformatterがレポートの出力を委譲されています。
上の結果からformatterをスイッチすれば出力形式(戦略)を変更させることができるのを確認できました。

ちなみに、ここにあるFormatterクラスはインタフェースを規定するだけのクラスですので、Pythonらしく書くなら不要です。(ダック・タイピング哲学)

#ストラテジの注意点
- コンテキストとストラテジ間のインターフェイスがストラテジの種類の増加を妨げないようにする
- コンテキストの変更がストラテジに影響を与えないようにする

コンテキストからストラテジへのデータの渡し方は、

(1) ストラテジメソッドを呼び出すときに適切なデータを渡す
(2) コンテキストへの参照をストラテジに渡すといった方法があります。

これを適切に選択してストラテジの種類を増やすことを阻害しないようにしてください。
WIP：JavaScript：関数宣言とか関数式とか表現が曖昧なので改名したいと思って色々調べたら割と適切だった

# 関数宣言 - function declarations
```javascript
function myFunc(){
  console.log('test')
}
```

* 実態は関数
* スコープの上部（ファイルのとかscriptタグ内の上の方と思えばいいのかな？）で宣言された扱いになるので、宣言の記述よりも上の方で呼び出す事ができる
    * これを「巻き上げ - hoisting」と呼ぶ



# 無名関数 - anonymous function

```javascript
function() {
  console.log('test')
}
```

* 名前の無い関数
* 匿名関数と呼ばれたりもしている
* 即時実行関数のことを無名関数と説明しているサイトもある


# 関数式 - function expressions
```javascript
var my_var = function(){
  console.log('test')
}
```
* 無名関数を変数に代入する「式」
* 関数宣言とは違って「巻き上げ」されない



# 「式」とは

参考：[[WIP] JavaScriptの入門書](https://asciidwango.github.io/js-primer/basic/statement-expression/#%E5%BC%8F)


>評価した結果を変数に代入できるものは式であるという理解で問題ありません。

な、なるほどー！だから「関数式」は「関数式」で適切なのか！
ちょっと「関数宣言」の「宣言」が余計な気がする！

# 改名案
「関数と関数式」の方がしっくりくるのでは！
因みに、コメントで教えていただいたのですが、同じく「関数宣言」を「関数」と表現している方々も既にいらっしゃるようです。



# まとめ
適切でした。
とにかく参考で紹介した[[WIP] JavaScriptの入門書](https://asciidwango.github.io/js-primer/basic/statement-expression/#%E5%BC%8F)の説明がすごくわかりやすかったです。
「式」についての知識が得られました。
関係無いんですが、だれかメンターになってください。。
Android端末のApplication directoryにアクセスする

Android端末において、data/data/<application directory>の領域にアクセスするには、
root権限が必要。
user buildのSWがFlashされている場合など、root化されていない端末では、
debug時など不便だが、```run-as```コマンドを使用することで解決することができる。

```command.java
adb shell
run-as <package name> // e.g. run-as com.android.sample
```

※Linux環境で確認
ローカルのみのコミットの取り消し

何度か検索し直すことが多かったため備忘録として投稿いたします。
## 目的
リモートで変更を行なったにも関わらず、ローカルに反映せず作業してしまった時、
ローカルの行なった作業は残しておきながらリモートの内容をpullもしくはfetch&margeしたい

## 作業前提
- リモートには反映していない
- 作業内容は保持していたい

## コミットを取り消し
```bash
git reset --soft HEAD^
```

## ステージングの取り消し
```bash
git reset HEAD .
```

## 作業内容の一時保存
```bash
git stash
```

## 何かしらの作業
- ブランチの切り替え
- pull

## 作業内容の復帰
```bash
git stash pop
```

あとはいつも通り作業すれば問題ない
QASHJPYの現在値を確認するpython3スクリプトをつくってみたよ。



``` 
#!/usr/local/bin/python3
import json
import requests
import urllib.parse
last = requests.get('https://api.quoine.com/products/50').json()['last_traded_price']
ask = requests.get('https://api.quoine.com/products/50').json()['market_ask']
bid = requests.get('https://api.quoine.com/products/50').json()['market_bid']
print("last:", last, "ask:", ask, "bid:", bid)
```
俺のRailsチュートリアルがこんなにJSなわけがない

#事象
GitHubには、リポジトリのメイン言語を表示する機能がある。

<img width="376" alt="スクリーンショット 2018-01-09 1.04.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/161070/7682f0da-c2d5-8fbd-bec6-46f1359a6167.png">

いや、JavaScriptとか書いてないんだけど・・・

![スクリーンショット 2018-01-09 0.51.08.png](https://qiita-image-store.s3.amazonaws.com/0/161070/58bf164c-cf1b-1990-38a5-b147f0c68d27.png)

いや、結構頑張ってRuby書いたんだけど・・・

#原因
- public/assetsにいくつかある、application-*.jsが膨大な量。
- 言語の割合を判定している[linguist](https://github.com/github/linguist#overrides)（GitHubのライブラリ）がすべてのソースコードを統計に含めてしまう。

#解決策
ルートディレクトリ（[Railsチュートリアル](https://railstutorial.jp/)なら、sample_appの直下）に、.gitattributesを作成して、`無視したいファイルのパス linguist-vendored`を記述する。

```
public/assets/application-*.js linguist-vendored
```

#結果
![スクリーンショット 2018-01-09 0.59.25.png](https://qiita-image-store.s3.amazonaws.com/0/161070/5f55b907-693e-b72c-b2a9-3181968cd296.png)

![スクリーンショット 2018-01-09 0.59.36.png](https://qiita-image-store.s3.amazonaws.com/0/161070/016d0a5f-cd26-2142-a27a-73919da64cf9.png)
戻り値のある関数・メソッド内でguard文を使う


戻り値のある関数やメソッド内で定義したguard文に戻り値を設定しないと、コンパイルエラーが起きてしまいます…。

```
var num:Int?

func numFunc() -> Int {
    
    num = 123
    
	guard let num_ = num else { return } // コンパイルエラーが起きる
    
    return num_
}
print(numFunc())
```

これを回避するには、**”guard文でその関数・メソッドの戻り値の型の空要素を返す”**ことで回避することができます！

```
var num:Int?

func numFunc() -> Int {
    
    num = 123
    
    guard let num_ = num else { return 0 } // 戻り値の型の空要素を返す
    
    return num_
}
print(numFunc())
```
【WordPress】ローカル環境から問い合わせフォームのメール送信を行う（その際mailtrapで引っ掛ける）

# 1.問い合わせフォームを作成
「[MW WP Form](https://ja.wordpress.org/plugins/mw-wp-form/)」とかのプラグインを入れて作成

# 2.SMTPの設定を行う
このままではローカルからメールの送信確認ができないので「[WP Mail SMTP](https://ja.wordpress.org/plugins/wp-mail-smtp/)」というプラグインを入れてSMTPの設定をします。
この時、[mailtrap](https://mailtrap.io)を使用することでメールの誤送信を防げます。（※[mailtrap](https://mailtrap.io)を使用するには登録が必要です。）
使った方がいいと思うので、ここではSMTPホストにmailtrapを設定する方法を書いておきます。

**管理画面から「設定」→「WP Mail SMTP」→「設定」を開き以下の項目を入力**

- *Mail*
  - 送信元アドレス：（ご自由に）
  - 送信者名：（ご自由に）
  - メーラー：**Other SMTP**
  
- *Other SMTP*
  - SMTP ホスト：**smtp.mailtrap.io**
  - SMTP ポート：**2525** (or 25 or 465)
  - 認証：**ON**
  - SMTP Username：（mailtrapの画面に記載されているUsernameを入力）
  - SMTP Password：（mailtrapの画面に記載されているPasswordを入力）

↓実際の画面
![FireShot Capture 55 - WP Mail SMTP Options_ - http___project-name.wp_wp_wp-admin_options-general.php.png](https://qiita-image-store.s3.amazonaws.com/0/85815/91307aa6-b06e-5fa6-cd1d-ab27c2fa1fdd.png)


# 3.送信できるか確認
「Email Test」を開き、**Send To**に送るメールアドレスを入力し「Send Email」ボタンを押す。
（**Your email was sent successfully!**のメッセージが出たら送信成功）

![Send_test.png](https://qiita-image-store.s3.amazonaws.com/0/85815/762417c7-27e8-3f2c-2bee-a759f36d7e38.png)


# 4.実際のお問い合わせフォームから送信できるか確認
送った内容はmailtrap上で確認できます。

以上

# 参考URL
- [ローカルのWordPressからお問い合わせフォームのメールが送れない場合](http://websae.net/wp-mail-smtp-20170203/)
Mac で日本語名が入った公開鍵を作る

以下のような感じにしたい。。。。

```
% gpg --list-key
---------------------------------
pub   rsa4096 yyyy-mm-dd [SC]
      DA55A6D60BAD9265F0430A50B346DA3C543BB398
uid           [  究極  ] Kazuki MATSUDA / 松田一樹 <matsuda.kazuki@facebook.com>
sub   rsa4096 2015-04-19 [E]
```

普通にやると
==========
![52cc241e5e523c6259853e92f9c5ac7d.png](https://qiita-image-store.s3.amazonaws.com/0/52956/29a37f84-fd70-612d-7421-17d5175c0e57.png)

ｑあｗせｄｒｆｔｇｙふじこｌｐ；「

解決法
======
`LANG=C gpg` でいける

![2082e76c3327ba73f32e77fd9e92009c.png](https://qiita-image-store.s3.amazonaws.com/0/52956/6a990af7-69fe-8f3c-9a86-ae5b774ec81f.png)
cakephp3 コア定義定数まとめ

#パス定数の基本定義

| 定数 | 説明 |
|:-:|:-:|
| **ROOT**  | ルートディレクトリーへのパス  |
| **APP_DIR**  | アプリケーションのディレクトリ名  |
| **CAKE_CORE_INCLUDE_PATH**  | Cakeライブラリへのパス  |
| **WEBROOT_DIR**  | webrootディレクトリ名  |
| **WWW_ROOT**  | webrootへのフルパス  |
| **DS**  | PHPのDIRECTORY_SEPARATORの省略語。 <br>つまりLinux の場合は / Windows の場合は \ を指します。  |

## 基本定義から組み合わせた定数

| 定数 | 説明 |
|:-:|:-:|
| **CORE_PATH**  | **CAKE_CORE_INCLUDE_PATH** + ディレクトリセパレータ <br> define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);  |
| **CAKE**  | **CORE_PATH** + 'src' + ディレクトリセパレータ <br> define('CAKE', CORE_PATH . 'src' . DS);  |
| **APP**  | **ROOT** + **APP_DIR** + ディレクトリセパレータ <br> define('APP', ROOT . DS . APP_DIR . DS); |
| **APPLIBS**  | define('APPLIBS', APP . 'Lib' . DS);  |
| **TESTS**  | Testディレクトリ<br> define('TESTS', ROOT . DS . 'tests' . DS);  |
| **TMP**   | TMPディレクトリ(キャッシュやCakeログのベース) <br> define('TMP', ROOT . DS . 'tmp' . DS);  |
| **CACHE**  | キャッシュが保存されるディレクトリ<br> define('CACHE', TMP . 'cache' . DS);  |
| **LOGS**  | Cakeログが保存されるディレクトリ <br> define('LOGS', ROOT . DS . 'logs' . DS);  |

## CSS JS 画像ファイルのパス

### app.phpでの定義

    'App' => [
        'namespace' => 'App',
        'encoding' => env('APP_ENCODING', 'UTF-8'),
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
        'base' => false,
        'dir' => 'src',
        'webroot' => 'webroot',
        'wwwRoot' => WWW_ROOT,
        // 'baseUrl' => env('SCRIPT_NAME'),
        'fullBaseUrl' => false,
        'imageBaseUrl' => 'img/',
        'cssBaseUrl' => 'css/',
        'jsBaseUrl' => 'js/',
        'paths' => [
            'plugins' => [ROOT . DS . 'plugins' . DS],
            'templates' => [APP . 'Template' . DS],
            'locales' => [APP . 'Locale' . DS],
        ],
    ],

css/であれば、
App.cssBaseUrlとして呼び出しが可能。

# 定義を変更する場合

tmpやcacheディレクトリを別に設定する場合下記のように変更する

    if (!defined('TMP')) {
        define( 'TMP', "TMPディレクトリへのパス");
    }

# Reference

https://book.cakephp.org/3.0/ja/core-libraries/global-constants-and-functions.html#id3

cakephp3だと、下記ファイルにdefineされています。
app/config/paths.php
JSON で任意の要素を jq と sed で TSV にする方法

```bash

echo '{"dataset_id":"hoge","row_count":"123","table_id":"fuge_20180101"}' | jq -c '{table_id: .table_id, row_count: .row_count}' |sed -e 's/{"table_id":"//g' | sed -e 's/","row_count":"/\t/g' | sed -e 's/"}//g'

```

```zsh
echo '[{"dataset_id":"hoge","row_count":"123","table_id":"fuge_20180101"},{"dataset_id":"hoge","row_count":"123","table_id":"fuge_20180101"}]' | jq -c .[]|jq -r '"\(.table_id)\t\(.row_count)"'
```
MacでRの日本語処理関係


# Rの環境

```
macOS High Sierra 10.13.2
Homebrew 1.4.3
R 3.4.3	
RStudio 1.1.383
```

Rは `brew install r` からインストールしたもの。
RStudioは `brew cask install rstudio` でインストール。
caskにもGUI版の R があったが、 `brew doctor` で Warning 出まくりのためパス。


# plotの文字化け対策
以下を参考に .Rprofile を作成。
[RStudio for Mac OS X で日本語のプロットが上手くいかない場合の対処法](http://blog.0093.tv/2011/05/rstudio-for-mac-os-x.html)


# 日本語ファイルの読み込み
[Rで学ぶデータマイニング](https://www.amazon.co.jp/R%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%E3%80%881%E3%80%89%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%81%AE%E8%A6%96%E7%82%B9%E3%81%8B%E3%82%89-%E7%86%8A%E8%B0%B7-%E6%82%A6%E7%94%9F/dp/4861671760)
↑勉強中のこの本のCD-ROMデータを読み込むと、マルチバイト関係のエラーが発生。
nkfで調べるとWindows用にShift JISになっているようなので、
`encoding="Shift_JIS"` を試すも改善されず。ファイルからの読み込みには `fileEncoding="Shift_JIS"` が正解の模様だが、拡張コードの `fileEncoding="cp932"` を指定したほうがベターかも。
Virtualboxで作ったVMに通信できなかった問題

# はじめに
Virtualboxで作成したVMのネットワーク設定はNAT+ホストオンリーアダプタの組み合わせがよく用いられると思うが、久しぶりにやったらホストOSとVM間で通信できなくて小1時間悩んだのでメモを残しておく。
ちなみに、自分がNAT+ホストオンリーアダプタの組み合わせを使用するのは、社内ネットワークで検知されない範囲でVMがインターネットに接続できるから。ブリッジアダプタだと何でもできるんだけどMACアドレスで社内検知に引っかかるorz

# 環境
ホストOSがwindows10
ゲストOSがubuntu16.04
今回はあまり環境は重要でないけど

# やった設定
まずは、VMのネットワーク設定でアダプタを2つ(NAT+ホストオンリーアダプタ)選択する。NATは多分デフォルトで選択されてる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221948/39589980-3fde-27c6-114a-a67d4ad70d4a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221948/8b795ddd-d015-bed2-4fda-72b973b90923.png)

続いて、VM側のネットワーク設定。/etc/network/interfacesに以下を追記した。

```
auto enp0s8
iface enp0s8 inet static
address 192.168.1.2
netmask 255.255.255.0
```

# つまった原因
addressの値は選択したアダプタ（今回であれば#2）の下の図のセグメントの範囲内の値でなければならなかった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221948/f596f17d-eedb-9ea2-823e-9325c2531d4c.png)

下記のように書き換えて、通信可能になった。

```
auto enp0s8
iface enp0s8 inet static
address 192.168.33.2
netmask 255.255.255.0
```

あるいは、アダプタ側の種類を変えてもよい。


ちなみに、割り当てるアドレスをDHCPにしたい場合は下から設定できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221948/013b402c-4a9e-dea0-afe9-486a2515304b.png)

# 最後に
Vagrant+Virtualboxだったらここらへん考えなくても良かった気がするけど、久しぶりにVirtualboxソフトからVM作ったら嵌まった。よかったよかった。
言語処理100本ノック03

#はじめに
言語処理100本ノックの元サイトのリンク
http://www.cl.ecei.tohoku.ac.jp/nlp100/#data

今回は、あちこちぶつかりながらもなんとか調べて、目的のリストを出力するところまで行きました。

>#03 円周率
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

```python3:03knock.py
from collections import Counter
st="Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."

words=st.replace(",","").replace(".","").split()

list=[]

for i in words:
	k=len(i)
	list.append(k)
print (list)
```
出力結果
`[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]`


最初に躓いたのはスペースで区切る方法。調べるとすぐ出てきました
https://qiita.com/como1559/items/abfcd4f0ce2f611d5193
次に、','と'.'をどうするか悩みなしたが、どうもreplaceとsplit関数は
`.replace().split()`
と重ねることができるみたいです
http://python-remrin.hatenadiary.jp/entry/2017/04/24/174405

次に躓いたのがlist.append()。最初自分は
`list=list.append()`
としていましたが
` 'NoneType' object has no attribute 'append'`
とエラーが出てしまう...どうもappend関数は値を返すのではなくて書き換えるみたいです
http://sphdien.hatenablog.com/entry/2013/12/05/181031

最後に躓いたのがfor文の分岐
文字変数を分岐に使えるとは...知らなんだ
Vue.jsのURLに含まれる#を取り除きたい

Vue.jsで書いたファイルをブラウザで確認するとき、routerで設定したURLにアクセスするが、その際にどうしてもrouterで指定したURLに/#/ がついてしまう。/#/ を含んだURLになってしまい見た目が格好良くない。
これを取り除く方法が公式に書いているが、いつもどこに書けばよいか忘れるので備忘録として書く。

## この記事を読む対象の人
- Vue.js を少しでも触れている人
- Vue.js のプロジェクトを既に作成した人

## 解決策
プロジェクト名/src/router/index.js に"mode: 'history'"を以下のように記述する。

```js
export default new Router({
  mode: 'history',
  routes: [
    {
(以下略)
```

## 参考URL
公式サイトを参考にしました。公式を参考にした方が早いと思います…。
https://router.vuejs.org/ja/essentials/history-mode.html
言語処理100本ノック0２

#はじめに
言語処理100本ノックの元サイトのリンク
http://www.cl.ecei.tohoku.ac.jp/nlp100/#data

今回は00,01の問で学んだことをもとに自力で解いてみました！

##02.
###「パトカー」＋「タクシー」＝「パタトクカシーー」
「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

```python3:02knock.py

s="パトカー"
v="タクシー"

for i in range(1,5):
	print (s[i-1:i]+v[i-1:i],end="")

```
出力結果

```
パタトクカシーー
```
うまくいきました！

s[開始:終了]の位置で手間取ったのと、改行コードが入らないようにend=""を入れることを忘れてた…ので修正して完成です

#zip関数について

@shiracamusさんにほかの方法でも書けるよとコメントで指摘していただいたので、とりあえずzip関数について学んでみました！　便利ですね...

@segavvyさんの[サイト](https://qiita.com/segavvy/items/725b20f21951975a06fd)より、これを見てよくわかりました.
>```python:main.py
# coding: utf-8
target1 = 'パトカー'
target2 = 'タクシー'
result = ''
for (a, b) in zip(target1, target2):
    result += a + b
print(result)
```

同一要素を合わせたい場合はよくあるので、今後使っていきたいです！
wicked_pdf で chartkick のグラフを表示する

HTMLをPDFとしてレンダリングできる[Wicked PDF](https://github.com/mileszs/wicked_pdf)では，HTML上では正常に表示されいる[chartkick](https://github.com/ankane/chartkick)のグラフが正常に表示されず， `Loading...` の表示のままPDFが生成される．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/a38f6ae7-2e15-0ead-085f-d4fda9e784f3.png)


## `window_status` オプションを指定

[オプション](https://github.com/mileszs/wicked_pdf#advanced-usage-with-all-available-options)の `window_status` を用いると，JSで `window.status` が更新されるまで，グラフのレンダリングを待ってくれる．

似たようなオプションで `javascript_delay` が使えるようだが，このオプションだといくら待っても `Loading...` のままだった．
> --javascript-delay <msec>: Wait some milliseconds for javascript finish (default 200)
https://wkhtmltopdf.org/usage/wkhtmltopdf.txt


```ruby:app/controllers/pdfs_controller
class PdfsController < ApplicationController
  def show
    respond_to do |format|
      format.html
      format.pdf do
        render pdf: "file_name",
               layout: "pdf",
               window_status: "FLAG_FOR_PDF" # Wait until window.status is equal to this string before rendering page
      end
    end
  end
end
```

## JS側で `window.status` を設定し，グラフを再レンダリング

```javascript:app/assets/javascripts/pdf.js
//= require libs/chartkick
//= require libs/loader
setTimeout((function () {
    window.status = "FLAG_FOR_PDF";
    Object.keys(Chartkick.charts).forEach(function (key) {
        Chartkick.charts[key].redraw();
    });
}), 3000);
```

# Production環境で動作しない問題

ローカル環境では正常に動作するが，プリコンパイルをしているProduction環境で，いくら待ってもPDFがレンダリングされない問題が発生した．
サーバのログ的にはPDFレンダリングがいつまで経っても実行されていなかったので `window.status` が正常に更新されないと推測，JSファイルの読み込み方 `wicked_pdf_javascript_include_tag` から `javascript_include_tag wicked_pdf_asset_base64` に変更したところ正常に動作した．

```erb:app/views/layouts/pdf.html.erb
<!DOCTYPE html>
<html>
  <head>
    <%= csrf_meta_tags %>

    <%= wicked_pdf_stylesheet_link_tag 'application' %>
　　 <!-- 本番環境で動作しなくなる -->
    <!-- <%= wicked_pdf_javascript_include_tag 'pdf' %> -->
    <%= javascript_include_tag wicked_pdf_asset_base64('pdf') %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```
（組み込み系の）展示会リスト2018

2018年の展示会のリスト

###1月

1/17(水)～1/19(金)
ネプコン ジャパン
ウェアラブルEXPO
ロボデックス
東京ビッグサイト（東1～8ホール、西1,3,4ホール　86,540m2）

###2月

2/7(水)～2/9(金)
テクニカルショウヨコハマ
パシフィコ横浜　（A・B・Cホール　13,300m2）

2/21(水)～2/23(金)
Japan IT Week 関西
組込みシステム 開発技術展
インテックス大阪（前回、6号館　19,358m2）

###3月
###4月

4/11(水)～4/13(金)
名古屋 ものづくり ワールド
機械要素技術展
ポートメッセなごや(前回、1～3ホール　33,946m2)

4/18(水)～4/20(金)
TECHNO-FRONTER
幕張メッセ

###5月

5/9(水)～5/11(金)
Japan IT Week 春
組込みシステム 開発技術展
東京ビッグサイト(前回、東1～6ホール、西1,3,4ホール 71,780m2)

###6月

6/15(金)～6/16(<font color="DarkTurquoise">土</font>)
ものづくり博2018in東三河
豊橋市総合体育館

6/20(水)～6/22(金)
日本 ものづくり ワールド
機械要素技術展
東京ビッグサイト(前回、東1～8ホール 66,140m2)

6/28(水)～6/30(金)
AI・人工知能 EXPO
東京ビッグサイト

###7月

7/5(木)～7/6(金)
Embedded Technology West 2018
組込み総合技術展 関西
グランフロント大阪内 コングレコンベンションセンター（A・B・Cホール　1,700m2）

###8月

8/4(<font color="DarkTurquoise">土</font>)～8/5(<font color="Red">日</font>)
Maker Faire Tokyo
東京ビッグサイト　（西1・2ホール）

###9月

9/5(水)～9/7(金)
JASIS 2018
科学機器展
幕張メッセ国際展示場

9/5(水)～9/7(金)
名古屋ネプコンジャパン
ポートメッセなごや

9/26(水)～9/28(金)
センサエキスポジャパン
試験機器展
東京ビッグサイト

###10月

10/3(水)～10/5(金)
関西 ものづくり ワールド
機械要素技術展
インテックス大阪

10/16(火)～10/19(金)
CEATEC JAPAN 2018
幕張メッセ

10/17(水)～10/19(金)
ITpro EXPO
Japan Robot Week
東京ビッグサイト

10/24(水)～10/26(金)
Japan IT Week 秋
組込みシステム 開発技術展
幕張メッセ

10/下旬？
メカトロテックジャパン
ポートメッセなごや

###11月

11/14(水)~11/16(金)
Embedded Technology 2018／組込み総合技術展
パシフィコ横浜

11/下旬？
国際ロボット展
東京ビッグサイト(前回、東1～6ホール 51380m2)

###12月
AWS EC2 T2 Unlimitedの有効化

T2インスタンスに対してT2 Unlimited機能を有効にしてみた。


## T2 Unlimited機能について

T2インスタンスはCPUクレジットを消費してCPU能力を上げるバーストという機能が使用できる。

このバーストはCPUクレジットを消費し尽くした場合は使えなくなってしまうが、消費し尽くした場合でもバーストし続けることができる機能をT2 Unlimitedと呼ぶ。


CPUクレジットの消費量は1vCPU毎1分間に1クレジットで、CPUクレジットの回復量と回復上限はインスタンスタイプごとに違う。<br />
具体的には下記ページの表にまとまっている。<br />
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/t2-instances.html

### バースト / T2 Unlimited詳細

CPUクレジットを消費し尽くした後T2 Unlimitedによりバーストが発生してもすぐには課金されない。

この場合CPUクレジットの回復上限の値までCPUクレジットを使って、初めて課金 (vCPU時間あたり0.05ドル)が発生する。


これらはそれぞれCPUSurplusCreditBalanceとCPUSurplusCreditsChargedというメトリクスで追跡できる。


つまり、バースト発生 → クレジットを使い切る → CPUSurplusCreditBalanceも上限 (CPUクレジットの回復上限の値) まで使い切る → 課金が発生という流れになる。


なおCPUSurplusCreditBalanceを使った場合では、CPUクレジットの回復にはまずCPUSurplusCreditBalanceの返済が必要で、返済が終わった段階からCPUクレジットの回復が始まる。

## 監視 (アラート)

何らかの問題によりバーストが発生し続けて、T2 Unlimitedの課金が気が付かれずに発生し続けることを避けるため、監視とアラートを設定する。


CloudWatchで設定を行い、アラートは課金が始まった時、つまりCPUSurplusCreditsChargedが0より大きくなった場合にアラートを送信するよう設定する。

## 設定

下記設定でT2 Unlimitedの設定と監視（アラート）の設定を行った。

* 対象: T2系インスタンス
* アラート条件: CPUSurplusCreditsChargedが0より大きくなった時 (5分間隔1回連続)
* アラート送信先: (既存SNSトピックを使用)


```bash

#!/bin/bash
set -euo pipefail

RET=$(aws ec2 describe-instances --query \
      'Reservations[].Instances[].{HostName:Tags[?Key==`Name`].Value|[0],InstanceId:InstanceId}' \
      --filters "Name=instance-type,Values=t2.*" --output text | awk '{ print $1","$2}' | sort)

for LINES in $RET;
do
        INSTANCE_NAME=$(echo $LINES | awk -F, '{ print $1 }')
        INSTANCE_ID=$(echo $LINES | awk -F, '{ print $2 }')
        echo $INSTANCE_NAME

        aws ec2 modify-instance-credit-specification \
                --instance-credit-specification "[{\"InstanceId\": \"${INSTANCE_ID}\",\"CpuCredits\": \"unlimited\"}]"

        aws cloudwatch put-metric-alarm \
                --alarm-name "$INSTANCE_NAME でのT2 Unlimited課金発生" \
                --namespace AWS/EC2 \
                --metric-name CPUSurplusCreditsCharged \
                --dimensions "Name=InstanceId,Value=$INSTANCE_ID" \
                --period 300 \
                --statistic Average \
                --threshold 0 \
                --comparison-operator GreaterThanThreshold \
                --evaluation-periods 1 \
                --alarm-actions (既存SNSトピックを使用) \
                --ok-actions (既存SNSトピックを使用)
        echo "-----------"
done
```


参考
https://aws.amazon.com/jp/blogs/news/new-t2-unlimited-going-beyond-the-burst-with-high-performance/
REACT ROUTER試すだけ

# 前提

* mac
* npm使える

# やること

REACT ROUTER試す

https://reacttraining.com/react-router/web/guides/quick-start

これをクイックスタートするだけ

# :writing_hand:

:writing_hand: 最初にreact環境速攻で作るためにこいつをインストール

```
npm install -g create-react-app
```


```
create-react-app demo-app
cd demo-app
npm install react-router-dom
```

:writing_hand: 　`src/App.js`を編集

```src/App.js
import React from 'react'
import {
  BrowserRouter as Router,
  Route,
  Link
} from 'react-router-dom'

const Home = () => (
  <div>
    <h2>Home</h2>
  </div>
)

const About = () => (
  <div>
    <h2>About</h2>
  </div>
)

const Topic = ({ match }) => (
  <div>
    <h3>{match.params.topicId}</h3>
  </div>
)

const Topics = ({ match }) => (
  <div>
    <h2>Topics</h2>
    <ul>
      <li>
        <Link to={`${match.url}/rendering`}>
          Rendering with React
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/components`}>
          Components
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/props-v-state`}>
          Props v. State
        </Link>
      </li>
    </ul>

    <Route path={`${match.url}/:topicId`} component={Topic}/>
    <Route exact path={match.url} render={() => (
      <h3>Please select a topic.</h3>
    )}/>
  </div>
)

const BasicExample = () => (
  <Router>
    <div>
      <ul>
        <li><Link to="/">Home</Link></li>
        <li><Link to="/about">About</Link></li>
        <li><Link to="/topics">Topics</Link></li>
      </ul>

      <hr/>

      <Route exact path="/" component={Home}/>
      <Route path="/about" component={About}/>
      <Route path="/topics" component={Topics}/>
    </div>
  </Router>
)
export default BasicExample
```

:writing_hand: `npm start`で動作

`http://localhost:3000`にアクセスしてみて
BQのテーブルをGCSにアップロードするshell

UIから手動で実行するのは面倒だし、API使ってプログラム書くのも面倒だしと思って簡易なshellを作成。備忘録程度に。

```bash:
#! /bin/bash

tables=`bq --project_id $1 ls $2 | perl -ane 'print $F[0] . "\n" if $.>2'`
for table in $tables
do
  bq --project_id $1 extract $2.$table gs://$3/tables/$table.csv
done
```

`$1`はproject id、`$2`はdataset、`$3`はbucket

削除する場合は`bq --project_id $1 rm -f $2.table`を代わりに使う。

テーブルの行数を数えるときは、`bq --project_id <project> show <dataset>.<table> | perl -ane 'print $F[6] . "\n" if $.==5'
1`をtabelsに代入してtotalを求める
Python3で、他階層にあるクラスを継承する方法 

図つきは[個人ブログ](https://nnahito.com/articles/22)に載せました。


`sample.py`からほか階層にある`Core.py`を継承した`Children.py`に定義されている`hello`メソッドを呼び出したい。

## sample.py

```python
# -*- coding: utf-8 -*-

from business.Children import Children

c = Children()

c.hello()

```


## Core.py

```python
# -*- coding: utf-8 -*-


class Core:
    def __init__(self):
        print('hello core')
```

## Children.py

```python
# -*- coding: utf-8 -*-

from business import Core


class Children(Core.Core):
    def __init__(self):
        pass

    def hello(self):
        print('children hello')
```
Vue.jsで Hello World!


##やりたいこと
Node.jsもnpmも使わず最小構成でVue.js使ってHello World!を表示する。
とりあえずVue.jsこうすれば試せるよ！こんな雰囲気だよ！ってのを示したいだけの内容です。

また読者としてはWEBフロントエンド入門者（webpackやGulpはもちろんNode.jsもnpmのこともふんわりとしかわからない）
を対象としています。
きちんと学ぶつもりの方やWEBフロントに慣れてる方は
こんなエントリなんて見ずに公式ドキュメントに目を通しましょう。
Vue.jsは公式に日本語ドキュメントがあるうえに内容も充実しています。

##前準備
適当な場所に index.html を作成します。
エディタで開いてとりあえず雛形を作りましょう。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Vue.js test</title>
</head>
<body>

</body>
</html>
```

##CDNを利用してVue.jsが利用可能な状態にする
Vue.jsはCDNを公開していますのでこれを利用します。
次の一文を\<head>\</head>に挿入しましょう。

```
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
```

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <!--下の一文を挿入-->
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <title>Title</title>
</head>
<body>

</body>
</html>
```

Vueの機能を利用するためには「Vueインスタンス」を作ってやる必要があります。
そのためには次のふたつのことをします。

- Vueインスタンスをマウントする場所を作る
- Vueインスタンスを作成しマウントする

順番にやっていきましょう。


##Vueインスタンスをマウントする場所を作る
bodyタグの中にdivを作成し、id="app"とします。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <title>Title</title>
</head>
<body>
<!-- id="app"としてbodyの下にdivタグを作成 -->
<div id="app">
    
</div>
</body>
</html>

```

##Vueインスタンスを作成しマウントする
Vueインスタンスを作成します。
\</body>の下に\<script></script>を作成し、その中にVueインスタンスを作成するコードと#appにマウントするコードを書きます。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <title>Title</title>
</head>
<body>
<div id="app">

</div>
</body>
<!-- <script>タグを追加しVueインスタンスを作成する -->
<script>
    const app = new Vue({
        el: '#app' //これで<div id="app"></div>にマウントされる
    });
</script>
</html>
```

これでVueの機能が利用可能な状態になりました。

##データバインディングを使って'Hello World!'
Vueで定義（バインド）された値をhtmlに反映させてみます。
まずdataプロパティを用意し、そこでtestValという値を定義しましょう。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <title>Title</title>
</head>
<body>
<div id="app">

</div>
</body>
<script>
    const app = new Vue({
        el: '#app',

        data: {
            testVal: 'Hello World!' //testValを定義
        }
    });
</script>
</html>
```

次に\<div id="app">\</div>の中で ```{{ }}``` を使うことでバインドされた値を表示させることができます。ここでは```{{ testVal }}``` となります。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <title>Title</title>
</head>
<body>
<div id="app">
	<!-- testValの内容を表示 -->
    {{ testVal }}
</div>
</body>
<script>
    const app = new Vue({
        el: '#app',

        data: {
            testVal: 'Hello World!'
        }
    });
</script>
</html>
```

htmlファイルを開いてみてください。
Hello World!と表示されているはずです。
testValの値を変更すれば、表示されるテキストも当然かわります。

##最後に
これだけで何ができるわけではありませんが、
その気になれば手軽に利用できること、
そして「シンプルなフレームワーク」であることがなんとなくでも伝われば幸いです。

Vue.jsは公式ドキュメントが優れています。
続きの学習はぜひ公式ドキュメントからすすめてください。

- [はじめに — Vue.js](https://jp.vuejs.org/v2/guide/)
TypeScript を使って Alexa Custom Skills を作ろう (1) 設計

# はじめに
この投稿では、スキルの音声設計についてではなく、TypeScriptでどう作っていこうかというところを考えていきます。
今後の投稿の実装編ではJavaScriptで作成したサンプルを元にTypeScriptにどう変換していくかを書いていきます。

# アーキテクチャパターンについて考える
せっかく TypeScript を使うのに、ただTypeScriptで書くだけではつまらないので、
WEBアプリケーションフレームワークのMVCのようなアーキテクチャパターンをカスタムスキル作成でも考えてみます。

## MVCをざっくり解説
MVCでは、プログラム構造を大きく以下の３つに分割しています（ざっくり）。

名前 | 概要
:---:|:---|---
Model(M) | ビジネスロジックを書く
View(V) | ユーザに見える部分を書く<br>ユーザからの要求を取得する部分を書く
Controller(C) | ユーザからの要求を受け付けて、インテントを経由して必要であればモデルに渡して結果（ビュー）を返す

## Alexa Custom Skillsの場合を考える
MVCと似た感じで、Alexa Custom Skillsについては、以下の3つに分類していきます。

名前 | 概要
:---:|:---|---
Model(M) | ビジネスロジックを書く
Utterance(U) | ユーザとAlexaの対話内容（発話）部分を書く
Handler(H) | 対話の状態によって、ユーザからの要求（発話）を受け付けて、必要であればモデルに渡して結果（発話）を返す

以上の感じで、ざっくりディレクトリ構成を決めていきます。

# ディレクトリ構成を決める

## 前提
将来的にASK CLIを使うことを考慮したディレクトリ構成です。
[ASK CLIとスキルマネジメントAPIドキュメント](https://developer.amazon.com/ja/docs/smapi/ask-cli-intro.html)

## プロジェクトルートディレクトリ構成
※ ここのモデルは前述のモデルとは関係ありません

```text:ProjectRootDirectory
├── .ask                                        … Alexa Skills Kit ディレクトリ
│   └── config                                  … スキル構成情報
├── lambda                                      … lambda関数格納 ディレクトリ
│   └── custom                                  … カスタムスキル関数格納 ディレクトリ
├── models                                      … モデル（インテントスキーマ等） ディレクトリ
│   └── ja-JP.json                              … ローカライズファイル（日本語）
└── skill.json                                  … スキルマニフェストファイル
```

## AWS Lambda ファンクション ディレクトリ構成
※ 前述のディレクトリ構成のlambda部分です。

```text:/lambda/custom
lambda
└── custom
    ├── enums                                   … 列挙型
    ├── handlers                                … ハンドラ
    ├── helpers                                 … ヘルパー（ユーティリティとか）
    ├── intents                                 … インテント
    ├── models                                  … モデル
    ├── tests                                   … 単体テスト
    └── utterances                              … 発話
```

# まとめ
この投稿では、アーキテクチャパターンを考え(MVCの解釈をちょっといじった程度ですが。。。）、ディレクトリ構成を決めました。
ざっくりでもいいので、処理毎に役割を分けることによって、プログラム全体が見通しよくなればレビューがしやすいなぁと思った結果の設計になっています。

次回は、[環境構築](https://qiita.com/daisukeArk/items/f5cbc6065308ecd735b7)について書きます！
ツリー型タブを使っていて、ピン留めしているタブから新規タブを開く際の挙動

# そもそも
ツリー型タブ、死ぬほど便利ですよね。
ぶっちゃけて言うと挙動の早いchromeにも、MAC純正のsafariにも移行せず~~頑なに~~firefoxを使っている理由はこのtree型タブから離れたくない、という一点のみです。
最近ではQuantumがリリースされ非常に早くなったのでよりfirefoxから離れられなくなりました。
(一応書いておくとchromeにも同じようなアプリはあるが、ウインドウが別れてしまって使いづらい。safariにはかなり要件を満たしたものが合ったが、safariのアップデートについていけてないようで使うのをやめてしまった)

# 事象
(多分)firefoxをQuantumに上げた頃からこの事象に悩んでいたんですが、(ツリー型タブの素早いupdate対応には脱帽です)
ピン留めされたタブから新しいタブを開くと**謎のタブ(中にもとのタブ名と一時的なグループの文字)の小タブとして開かれてしまいます**
この謎のタブ、非常に邪魔だったんですが、以下の方法ででなくなって感動しているので感動が薄れないうちに書いておきます。

# やったこと
- アドオン -> 拡張機能
- 新しいタブの挙動
- 同じピン留めされたタブから開かれたタブから開かれたタブを自動的にグループ化する のチェックを外す
- (コメントにてより正しい解決方法を教えていただきましたので当初より記事の内容を変更しています。教えていただきありがとうございます!)

# 最後に
ツリー型タブ最高！
Rubymineのトラブル解決集（随時更新、Versionは不定）

# エラーの箇所がハイライトされない&波線（under_wave）が出てくれない

**原因**
Color Schemaが`Monokai`に設定されていた

**解決策**
Color Schemaを`Darcula`に設定した（他のものでも良いかも）


# 開いているファイルの改行コードや文字コードなどの情報が下部に表示されない
**原因**
`Status Bar`にチェックが入っていない

**解決策**
shiftキー二回押し → `Status Bar`を検索 → `Status Bar`をonにする
macOS環境にDockerをHomebrew Caskでインストールする

# 2018/08/21 更新

最近は大丈夫のようです。

# あらまし

macOS HighSierraにDockerインストールしたらコマンド見つからなかったので、
設定方法をここに記録する。

# Dockerのインストール

Homebrew Cask イントール済と仮定。

```shell
brew cask install docker
```

# Docker コマンドへのパスを通す

```shell:.bashrc
echo 'export PATH="/Applications/Docker.app/Contents/Resources/bin:$PATH"' >> ~/.bashrc
```

必要に応じて、 `. ~/.bashrc`

`fish` 等の非sh系の人は、どうにかして`/Applications/Docker.app/Contents/Resources/bin`へのパスを通してください。

# テスト

```shell-session
$ docker-compose
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help
...
```

# まとめ

Homebrew CaskでDockerをインストールする方法を解説した。
PHPの多次元連想配列でキー名を保持しつつ子連想配列の特定キーでソート

1年に1回くらい必要になり、そのたびに妙に時間かけてググっている気がするので…

以下のようなデータ構造で定義されたT○KI○のメンバーを身長(降順)でソートする場合を想定します。
array_multisortだとメンバー名のところが吹っ飛ぶのでuasortを使います。

```usort.php
<?php

$ary = [
  "shigeru" => ["height" => 173, "birthday" => '1970/11/17', "出身地" => "奈良県"],
  "tatsuya" => ["height" => 167, "birthday" => '1972/01/10', "出身地" => "埼玉県"],
  "taichi" => ["height" => 167, "birthday" => '1974/09/02', "出身地" => "東京都"],
  "masahiro" => ["height" => 181, "birthday" => '1977/01/11', "出身地" => "北海道"],
  "tomoya" => ["height" => 184, "birthday" => '1978/11/07', "出身地" => "神奈川県"],
];

uasort($ary, function($x, $y) {
    $key = 'height';
    if ( $x[$key] == $y[$key] ) { return 0; }
    else if ( $x[$key] > $y[$key] ) { return -1; }
    else { return 1; }
});

var_dump($ary);
```

結果です。

```php

array(5) {
  ["tomoya"]=>
  array(3) {
    ["height"]=>
    int(184)
    ["birthday"]=>
    string(10) "1978/11/07"
    ["出身地"]=>
    string(12) "神奈川県"
  }
  ["masahiro"]=>
  array(3) {
    ["height"]=>
    int(181)
    ["birthday"]=>
    string(10) "1977/01/11"
    ["出身地"]=>
    string(9) "北海道"
  }
  ["shigeru"]=>
  array(3) {
    ["height"]=>
    int(173)
    ["birthday"]=>
    string(10) "1970/11/17"
    ["出身地"]=>
    string(9) "奈良県"
  }
  ["tatsuya"]=>
  array(3) {
    ["height"]=>
    int(167)
    ["birthday"]=>
    string(10) "1972/01/10"
    ["出身地"]=>
    string(9) "埼玉県"
  }
  ["taichi"]=>
  array(3) {
    ["height"]=>
    int(167)
    ["birthday"]=>
    string(10) "1974/09/02"
    ["出身地"]=>
    string(9) "東京都"
  }
}
```
FileMaker//マウスオーバーイベントを実装する

#FileMakerにマウスオーバーイベントはないよ！
というところが今回の発端

##マウスオーバー、ロールオーバー、あるアイコンやフィールドにカーソルを合わせた時に何かしら「ここだよ」と反応して欲しい
OnMouse イベントとか関数があれば楽なんですが、どうやらFileMakerにはないらしい。ヾ(ﾟДﾟ )ｫｨｫｨ
と思って調べていたら、以前はあったけど今はない。みたいな掲示板の記述を発見。
以前あってなくなったのなら、別の機能で代替されている可能性があるので探してみました

###フィールド・ボタンを設置して、インスペクタ＞ポイントしたときに表示　がマウスオーバーの代替のようです
<img width="256" alt="スクリーンショット 2018-01-10 16.36.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/181254/7e9bc16d-baae-c0f6-0db6-ebfc9e5675e2.png">


---
[FileMakerHelp / オブジェクトの表示状態の指定](http://www.filemaker.com/help/13/fmp/ja/html/edit_layout.10.9.html)
バックライト輝度を変えるfishコマンド

## なぜ
ノートPCの輝度調節用キーが反応しなくて困ってた(acpi_listenしてみたら認識されてない)

## なに
fish shellでfunction(コマンド)を作成して気軽に輝度を変えたい
キーボード・ショートカットにも登録できるようになる

## これ

```zsh:adjust_backlight.fish
function adjust_backlight --argument direction percentage
    # echo 400 | sudo tee /sys/class/backlight/intel_backlight/brightness をしたい

    set -l now (cat "/sys/class/backlight/intel_backlight/brightness")
    set -l max (cat "/sys/class/backlight/intel_backlight/max_brightness")
    set -l min 0
    set -l cent (math -s2 (math $max - $min) / 100.0)
    
    if string match -ar "[0-9]+" $percentage >/dev/null
        
        set -l new_p $now
        switch $direction
            case "INC" "Inc" "inc" "Increment" "increment" "UP" "Up" "up" "--inc" "-i" "-I" "--up" "-u" "-U"
                set -l temp (math -s0 "($now + ($cent * $percentage) / 1) / 1")
                if test (math $temp - $max) -gt 0
                    set temp $max
                end
                set new_p $temp
            case "DEC" "Dec" "dec" "Decrement" "decrement" "DOWN" "Down" "down" "--dec" "--down" "-d" "-D"
                set -l temp (math -s0 "($now - ($cent * $percentage) / 1) / 1")
                if test (math $temp - $min) -le 0
                    set temp $min
                end
                set new_p $temp
            case "SET" "Set" "set" "--set" "-s"
                set new_p (math -s0 "$cent * $percentage / 1")
            case *
                set new_p $now
        end
        
        echo "set to $new_p"
        echo $new_p | sudo tee "/sys/class/backlight/intel_backlight/brightness" >/dev/null
    else
        echo "max: $max"
        echo "now: $now"
        echo "usage: adjust_backlight [inc | dec] PERCENTAGE"
    end
end
```


おんなじようなことを fishのshebangつけたシェルスクリプトにしてNOPASSWDにすればキーボードショートカットとかから叩ける

## 所感
`function` の `--arguments` が値入れなくてもエラー出さないし便利
あと変な記号少なくて頭に優しい

## 参考
https://askubuntu.com/questions/149054/how-to-change-lcd-brightness-from-command-line-or-via-script
C++ Builder 10.2 Tokyo > Naming > ReleaseとUpdate > Updateで統一するのが良い

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
```

10.2 Tokyoの情報を下記のように書いている例もある。

> RAD Studio 10.2 Tokyo Release 2

UpdateとReleaseは何が違うのだろうか。

### IDEのバージョン情報 > Update

「インストール済みの更新」は下記の表示になっている。

> RAD Studio 10.2 Tokyo Update 2

### ヘルプ > Release

[RAD Studio 10.2 Tokyo ヘルプ](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)
の記載は以下。

> 概要
> 10.2 Tokyo - Release 2

### ヘルプ (Berlin)

[Berlinの時のヘルプ](http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)
> Subscription Update 2 - Anniversary Edition

[XE8 のリリース ノート](http://docwiki.embarcadero.com/RADStudio/XE8/ja/XE8_%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9_%E3%83%8E%E3%83%BC%E3%83%88)
> XE8 Update 1 のリリース ノート

### 推測

- もともと「Update」という用語を使っていたのが、Tokyoだけ「Release」という用語を使うようになった
- IDEのバージョン情報表記はそれに追随していないため「Update」になっている

どちらでもいいのであるが、用語は統一していただいた方が情報を探すときに困らない。

現状を見るとTokyoについても「Update」に統一する（ヘルプを書換える）のが混乱が少ないだろう。

@ テスト駆動開発による組み込みプログラミング by James W. Grenningら
p66
> もちろん、あなたはテスト済みのコードをコピーするのはまったく安全だと思っているだろう。だが注意しよう。2つのコピーは、将来きっと枝分かれすることになる。

すぐに修正すると混乱は少ないだろう。
ale.vimを通して、PSR-2での静的解析を行う

#概要
こちらの記事のale版です。
https://qiita.com/hidelafoglia/items/7f42b83788acab9a60ba

aleというvimの非同期lintプラグイン上で、
PHP_CodeSnifferというPHPのコード静的解析チェッカーを通す。
そのときのコーディング規約を「PSR-2」とします。

* [vimプラグイン ale](https://github.com/w0rp/ale) 
* [PSR-2](http://www.php-fig.org/psr/psr-2/) 

##前提条件
下記インストール済み

* vim
* ale.vim
* PHP_CodeSniffer

#設定
##説明
通常状態だと、aleから、phpcs（PHP_CodeSnifferを呼び出すコマンド）を呼び出してくれないことがあるので、.vimrcでパスを指定。
また、phpcsは複数のコーディング規約でチェックすることが出来るため、どの規約でチェックさせるのかを.vimrcで設定しなければならない。

##phpcs確認
```:zsh
まず、phpcsがどこにあるか確認して下さい。
pearで入れているとこんな感じになります。

$ which phpcs
/Users/ユーザ名/pear/bin/phpcs

次に、現在インストール済みのphpcsが使えるコーディング規約を確認して下さい。

$ phpcs -i
The installed coding standards are MySource, PEAR, PSR1, PSR2, Squiz and Zend

PSR2がなければ、アップデートお願いします。

```

##.vimrc設定

```:.vimrc
" 今回はglobal設定を想定します。
" phpで使うチェッカーの種類を指定
" デフォルト設定だと、phpcs以外のチェッカーも動いてしまいます。
let g:ale_linters                  = {
\    'php': ['phpcs'],
\}
" phpcsコマンドの設定
" どこからphpcsを実行するのか。
" which phpcsの結果を入れます。
let g:ale_php_phpcs_executable = '/Users/ユーザ名/pear/bin/phpcs'
" コーディング規約の指定 
" phpcs -i　で返ってきた値を使えます。
let g:ale_php_phpcs_standard = 'PSR2'
" グローバルで設定する
let g:ale_php_phpcs_use_global = 1
```

#動作確認
##PSR2
<img width="1118" alt="スクリーンショット 2018-01-10 16.04.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/98082/6a550554-b82a-8896-1f65-8e149aa0b581.png">


PSR2.Classesから呼び出されている！

##PEAR

```:.vimrc
let g:ale_php_phpcs_standard = 'PEAR'
```

に切り替えて、PEARになるのか動作確認

<img width="1084" alt="スクリーンショット 2018-01-10 16.06.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/98082/e7b575a6-4613-cc21-9902-be6e0571cebf.png">

PEAR.Classesから呼び出されている！

#参考
ale/doc/ale-php.txt
https://github.com/w0rp/ale/blob/7086586b1776d2b5f3bf87a7f0c25595a5d7e1b0/doc/ale-php.txt
パソコンで再生中の作業用BGM(YouTube)をGoogleHomeで聞く

作業用のBGMを再生するだけならこの方法で十分かなと思います
**※ただのスピーカーとして使っているだけです**

# Chromeブラウザからキャストする

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/223901/72bea67a-985f-c06f-96d2-f1f2b8c73cc2.jpeg)

キャストを選択したあとは対象のデバイス(GoogleHome等)を選択するだけで音声が再生されるようになります

# まとめ

最初はBruetooth接続をして、、、音声で自動的に、、、、などいろいろ検討してみたのですがパソコンで流していたBGM用の動画についてはこの方法で十分満足できる結果になってしまいました。
Windows で appium / appium desktop 環境セットアップの覚書

# Java8
**9にしてはいけない。**

* Oracle のページからインストーラを落としてくるか実行ファイルを落としてパスを通す。 ~~個人的には後者がおすすめ~~ 今 Windows 用の実行ファイル落とせないのね。かなしみ……
* 環境変数 `JAVA_HOME` を `C:\Program Files\Java\jdk1.8.0_***` に設定する
* パスを `C:\Program Files\Java\jdk1.8.0_***\bin` に通す

# node.js
* 公式ページからインストーラ落としてインストール

# Android Studio
* 公式ページからダウンロード、インストール。

## Android SDK 
* 現在(多分Android Studio 3 系から)SDKマネージャーが単体で落とせなくなったので、起動時のスタートアップメニューからSDKをダウンロードする。
* Android SDK の tools と platform-tools にパスを通す。デフォルト設定なら `C:\Users\ユーザ名\AppData\Local\Android\Sdk\tools` みたいなフォルダに入ってるはず。

# Appium
* [appium for windows](https://bitbucket.org/appium/appium.app/downloads/) というのがあるらしいのでインストーラを落として入れる

# appium-doctor
* `npm install -g appium-doctor`
* appium の実行環境が整ってるか調べてくれるすごいやつ
* コマンドラインから実行して設定に漏れがないかを確認。「Everything looks good, bye!」と出たら大丈夫。
MacでWindowsキーボードを使う

# Karabinerを使ってキー配置を変更しよう。
## Karabinerのダウンロード
このアプリケーションでキーボードのキーの設定を変えられる。
[Karabiner](https://pqrs.org/osx/karabiner/)
(2018/1/10時点では、バージョン11.5.0)

## Karabinerをインストール。
<img width="189" alt="スクリーンショット 2018-01-10 16.03.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/bcafb908-3c57-43eb-e0cb-503a89def46f.png">

## Karabinerを起動、設定を変えよう。

### キーボードのタイプを選ぶ
<img width="493" alt="スクリーンショット 2018-01-10 16.04.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/279cc6f9-1588-85ce-8d79-a99b8366ee1c.png">
macのキーボードがJISであるなら画像と同じものを選択する。

### Karabinerが適用するキーボードを選択する。
タブの「Devices」を選択。
<img width="482" alt="スクリーンショット 2018-01-10 16.09.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/a844b5f5-e8cd-9d1c-c3be-5c4bc551203a.png">
恐らく初期状態は"Apple Internal Keyboard / Trackpad (Apple Inc.)"にチェックがついているはずなのではずす。
そうすることで純正キーボードには適用されない。

### キーの設定を変更する。
<img width="489" alt="スクリーンショット 2018-01-10 16.11.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/e505c4a3-4520-e1d2-f5cb-f34cb5bb7f13.png">
僕はこんな感じ。
上記の設定をすることでMacで打っているキーとほぼおなじ環境になる。

## 確認してみる。
うまく適用されていたらOK。
低速ネットワーク環境を用意してアプリをテストする

## きっかけ
　アプリ起動時、APIからのレスポンスが一定時間以上かかるためにタイムアウトが発生していた。4G回線で確認したが再現できない。:man_with_gua_pi_mao_tone3: 低速ネットワーク環境がないと開発もデバッグも満足にできないため調べてみました。

## 環境
* macOS Sierra
* Android Studio 3
* Androidの実機
* エミュレータ（Android Oをインストールしてます）

## 使用ツール
* [Charles](https://www.charlesproxy.com/)

## 方法は２つ。
* エミュレータを使う。または、Charlesを使う。
* エミュレータはAndroid Studioから起動して、エミュレータの設定から回線速度をいじれます。
* CharlesはMacをProxyにしてスマホとサーバとのやりとりするソフト。Windowsだと他にもツールがあるようなのですがMacだとあまりないようなのでこれを使います。

### エミュレータを使う
1. エミュレータを起動して設定画面を開く。Pixelの場合はエミュレータの右側に設定メニューが並んでいたのでそこから開いてます。

<img width="600" alt="スクリーンショット 2018-01-10 14.49.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/36517/943c2b78-097a-6f18-e32f-7addff3b4a69.png">


2.メニューの「network type」から回線速度を選択する
 
* 選択した項目の回線スピードが分かりづらいです。。日本語での良いサイトが見つからなかったので、今回はウィキペディアを参考にしています。

* [EDGE](https://ja.wikipedia.org/wiki/Enhanced_Data_Rates_for_GSM_Evolution)はここです。そのほかの項目は適宜ご確認ください。

3.エミュレータで回線速度を測る[webページ](https://fast.com/ja/)を開いて期待通りの回線速度か確認します。

4.アプリを起動してテストする。


## Charlesを使う

0. Charlesをインストールする
1. Charlesを起動する。
2. メニューの「Help」 → 「Local IP Address」 からmacのIPアドレスを確認する
3. メニューの「Proxy」 → 「Proxy Settings...」を選択して表示されるポート番号を確認する

### ここからはスマホ側の設定
1.WIFI設定を開いて、どれが適当なネットワーク設定を編集する。プロキシを手動に変更して、以下の２つを変更する。
 * プロキシのホスト名
 * プロキシのポート
2.ブラウザなどを開いて適当なページにアクセスする。
3.Charlesの左側のURL一覧の中に開いたページが表示されていることを確認する。

### ここからはmac側の設定
1.Charlesのメニュー「Proxy」 → 「Throttle Settings..」を開く
2.Enable Throttleingにチェックを付けて有効にする。

<img width="542" alt="スクリーンショット 2018-01-10 15.37.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/36517/b0d1d8f5-a47a-4a4e-6bb6-d3f11829a97c.png">

3. BandWidth を修正する
 * Download。3Gだと数Mbpsから14Mbpぐらいらしいです。上記の画像では700kbpsを設定しています。
 * Upload。アップロードはテストは考えていなかったので適当に設定しています。


4.エミュレータを起動して回線速度を測る[webページ](https://fast.com/ja/)を開いて期待通りの回線速度か確認します。

4.アプリを起動してテストする。


## 終わりに
* AndroidはiOSと比べると、低速回線を準備するのが大変だと思っていましたが、エミュレータでも確認ができるので、思ってたよりラクに用意ができて良かったです。
* 4Gでも電車の中で1Mを切る時があります。低速回線時でも、ある程度はアプリを快適に使えるように確認やチューニングが必要だと思いました。


## 追記
Charlesは有料ですが（そのまま使えるような気もしますが）、無料で同じようなツール[Network Link Conditioner](https://dev.classmethod.jp/smartphone/iphone/network-link-conditioner/)があるようです。
intra-mart実践入門の作成記録 #002 執筆環境作成途中

# 執筆環境作成途中

　[前回の投稿](https://qiita.com/hiroaki-kushida/items/9d0bcf25aefe73b8313e "intra-mart本(仮)の執筆記録 #001 執筆環境作成開始")で[TeX Live 2017](https://www.tug.org/texlive/)のインストールに非常に時間がかかるという問題があったので、まずはそこの改善を行いました。[Paperist](https://paperist.mikumiku.moe/)さんの[Dockerfile](Paperist/docker-alpine-texlive-ja)を参考にして[TeX Live 2017](https://www.tug.org/texlive/)のインストールオプションを変更しました。それと、[Ruby](https://www.ruby-lang.org/ja/)も2.5.0に上げました。

## Hello World!!
　今回はシェルスクリプトで動作確認してみました。結果としてセットアップ時間が約3時間から約30分[^1]に短縮されました。

```shell:review.sh
#!/bin/bash
# 最低限のセキュリティアップデート
yum -y update
# 最低限のユーティリティ
yum -y install wget zip unzip

# rubyインストール
yum -y install openssl zlib gcc make zlib-devel openssl-devel
mkdir /tmp/ruby
wget  -qO- https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz | tar zxv -C /tmp/ruby --strip-components=1
cd /tmp/ruby
./configure --prefix=/usr/local/ruby
make
make install
echo "export PATH=/usr/local/ruby/bin:$PATH" >> /etc/profile
source /etc/profile
cd ~
rm -rf /tmp/ruby


# Re:VIEWのインストール
gem install review

# perlのインストール
yum -y install perl-Digest-MD5

# TeX Live 2017のインストール
mkdir /tmp/texlive
wget -qO- http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz | tar zxv -C /tmp/texlive --strip-components=1
echo "selected_scheme scheme-basic" > /tmp/texlive/texlive.profile
echo "option_doc 0" >> /tmp/texlive/texlive.profile
echo "option_src 0" >> /tmp/texlive/texlive.profile
perl /tmp/texlive/install-tl --profile=/tmp/texlive/texlive.profile
echo "export INFOPATH=/usr/local/texlive/2017/texmf-dist/doc/info:$INFOPATH" >> /etc/profile
echo "export MANPATH=/usr/local/texlive/2017/texmf-dist/doc/man:$MANPATH" >> /etc/profile
echo "export PATH=/usr/local/texlive/2017/bin/x86_64-linux:$PATH" >> /etc/profile
source /etc/profile
rm -rf /tmp/texlive

# TeX Liveの更新
tlmgr install collection-basic collection-latex
tlmgr install collection-latexrecommended 
tlmgr install collection-latexextra
tlmgr install collection-fontsrecommended
tlmgr install collection-langjapanese
tlmgr install latexmk
tlmgr install xetex
tlmgr update --self
tlmgr update --all

# サンプルプロジェクトの作成とPDF変換
review-init hello
cd hello/
rake pdf
```

## 雑感
　次は執筆用のエディターの選択を行います。マークアップを扱うのでシンタックスハイライトや入力補完がないと文章に集中できませんからね。

[^1]: Windows 10のHyper-VでCPUコア数1、メモリ4096MBの割当したVMで確認。ネットワークは100Mbpsのマンション用光ファイバー
[Swift]enumにunknownを生やし、switchではdefaultを禁止すると良いのでは

# 課題感

enumの要素を増やした場合に、defaultでもみ消しているswitch文はコンパイルを通過し影響範囲をコンパイラが認識出来ない。

# 提案

enumにunknown要素を必ず入れ、イニシャライズは失敗するとunknownを返すmake関数を利用する。
switch文ではdefaultを禁止する

# 効果

enumの要素が増えるとswitch文でコンパイルエラーが発生し、影響範囲と対応が必須になる。

# 実装

```swift
enum State: Int {
  case unknown = 0
  case idle
  case processing
  case finished

  static func make(rawValue: Int) -> State {
    return State(rawValue: rawValue) ?? .unknown
  }
}
```

```swift
switch state {
case .idle: print("idle")
case .processing: print("processing")
case .finished: print("finished")
case .unknown: break
}
```

# 議論

switchにdefaultを使わない事を強制出来るか…？（linter?)
unknownが必須にすることを強制出来るか…？
enumにrawValueが必須になることで起こる問題無いかな…？