OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS Lambda】python で VPC mysql に接続する【mac】

### macOS の環境
```
> sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G29
```
### macOS 環境下のpythonのバージョン
```
> python -V
Python 2.7.10
```

### 作成開始

- lambda をコンパイするためのディレクトリの作成

```
> mkdir lambda_app
```
-  mysql を接続するための情報を記述するファイルの作成

```
> vi rds_config.py
```
```
#config file credentials for rds mysql instance
db_username = "接続したいDBユーザ名"
db_password = "接続したいDBパスワード"
db_name = "接続したいDB名"
```
- mysql を接続するアプリケーションの作成

```
> vi app.py
```

```
import sys
import logging
import rds_config
import pymysql
#rds settings
rds_host  = "xx.rds.amazonaws.com"
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name

logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except:
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
    sys.exit()

logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
def handler(event, context):
    """
    This function fetches content from mysql RDS instance
    """

    item_count = 0

    with conn.cursor() as cur:
        cur.execute("select * from 接続したいDB名")
        for row in cur:
            item_count += 1
            logger.info(row)


    return "Added %d items from RDS MySQL table" %(item_count)
```

-  lambda で接続するために pymysql をインストールする

```
pip install PyMySQL -t /任意のフォルダ/lambda_app
```

```
>ls
- pymysql
- PyMySQL-0.7.11.dist-info
```
この時、 app.py と同じ階層にファイルが無いとだめ

- lambda 用に zip で固める

```
>zip -r ../app.zip *
```

これで完了。

### 設定など

作成した zip ファイルを AWS Lambda にアップロードをする.
*python2.7* を選択する必要がある。
ハンドラは、上記の例だと *app.handler* となる。
正しくは、実行ファイル名+'.'+実行関数名である。
この時、 ロールには *Basic with VPC* を設定する必要がある。
詳細設定で、VPC の設定をする。
接続する RDB 側と Lambda のセキュリティグループに *from-vpc* を設定する。←結構ここで詰んだ
ssh-add -dで`No such file or directory`と言われる場合

ssh-addで登録した鍵を個別に削除したい場合、例えばawsの用にpemファイルしかない場合に

```
Bad key file .ssh/xxxx.pem: No such file or directory
```

のようにエラーが出ることがある。この場合、同じディレクトリに公開鍵無いことが問題なので、以下のように同じディレクトリに公開鍵を生成すると上手くいくようになる。

```
$ ssh-keygen -y -f ~/.ssh/xxx.pem > ~/.ssh/xxx.pem.pub
```

```
$ ssh-add -d ~/.ssh/xxx.pem
Identity removed: .ssh/xxx.pem (.ssh/xxx.pem.pub)
```
フロントエンドエンジニアQA：DAY1

Frontend Engineerが面接で聞かれそうな質問↓
https://github.com/h5bp/Front-end-Developer-Interview-Questions#general-questions
に答えるDAY1

General Questionsは飛ばして、HTML Questionsの最初の質問から

## What does a doctype do?
訳：doctypeってナニ？何してるん？

調べた結果、、、

>
The <!DOCTYPE> declaration must be the very first thing in your HTML document, before the <html> tag.
The <!DOCTYPE> declaration is not an HTML tag, it is an instruction to the web browser about what version of HTML the page is written in.
In HTML 4.01, the <!DOCTYPE> declaration refers to a DTD, because HTML 4.01 was based on SGML. The DTD specifies the rules for the markup language, so that the browsers render the content correctly.
HTML5 is not based on SGML, and therefore does not require a reference to a DTD.
Tip: Always add the <!DOCTYPE> declaration to your HTML documents, so that the browser knows what type of document to expect.

HTMLファイルの一番最初に書く<!DOCTYPE>宣言は

- HTMLタグではない。
- ブラウザにそのページのHTMLのバージョンを教える。
- HTML4.0１の場合、必要。
- HTML5の場合、不要。
BottomNavigationViewをカスタマイズして使う

## Overview
Design Support Libraryの`BottomNavigationView`はマテリアルデザインに準拠していますが、見た目や挙動が少々トリッキーです。要件によってはカスタマイズが必要なことがあります。
ややハック的な内容ですが、以下2つの要件に応じて行ったカスタマイズ例を紹介します。

- タブのTextを常に表示する
- タブ切り替え時のAnimationをdisableにする

ここでは4タブのBottomNavigationViewを使う場合を例に説明します。

## タブのTextを常に表示する
標準だと、選択しているタブ以外のTextは非表示になっています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/38442/040489c1-3992-ee57-b56a-c1c11ae18e7b.png" width=400>

（引用: https://material.io/guidelines/components/bottom-navigation.html#bottom-navigation-style ）

### 解決策
`BottomNavigationMenuView`からタブそれぞれのitemを参照後、<b>`shitingMode`を`false`、かつチェック状態を`false`にすることでTextを常に表示することができます。

```kotlin
// force showing title
val menuView: BottomNavigationMenuView = bottomNavigationView.getChildAt(0) as BottomNavigationMenuView
for (i in 0..menuView.childCount - 1) {
    val itemView = menuView.getChildAt(i) as BottomNavigationItemView
    itemView.setShiftingMode(false)
    itemView.setChecked(false)
}
```

## タブ切り替え時のAnimationをdisableにする
4タブのBottomNavigationViewでは、タブ選択時にitemが左右に動くAnimationがデフォルト設定されています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/38442/bb31543a-88ec-6c23-a748-e88d2421989e.gif" width="400">

（引用: https://material.io/guidelines/components/bottom-navigation.html#bottom-navigation-behavior ）

個人的にはリッチUIで好きなんですが、プロダクトのデザインガイドラインに反する場合も多いかもしれません。

### 解決策
<b>`BottomNavigationMenuView`内のField（mShiftingMode）にfalseを設定します。</b>

```kotlin
object BottomNavigationViewHelper {

    fun disableShiftMode(view: BottomNavigationView) {
        val menuView = view.getChildAt(0) as BottomNavigationMenuView
        try {
            menuView.javaClass.getDeclaredField("mShiftingMode").apply {
                isAccessible = true
                setBoolean(menuView,
                           false)
                isAccessible = false
            }
            for (i in 0..menuView.childCount - 1) {
                val item = menuView.getChildAt(i) as BottomNavigationItemView
                item.setShiftingMode(false)
                item.setChecked(item.itemData.isChecked)
            }
        } catch (e: NoSuchFieldException) {
            Log.e("BNVHelper",
                  "Unable to get shift mode field",
                  e)
        } catch (e: IllegalAccessException) {
            Log.e("BNVHelper",
                  "Unable to change value of shift mode",
                  e)
        }
    }
}

```

```kotlin
// turn off shit animation
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView)
```


## 注意
これらのTipsは、推奨されるガイドラインから逸脱したハックの可能性があります。実装の際はご留意ください。

## 参考リンク
- How to remove icon animation for bottom navigation view in android  
https://stackoverflow.com/questions/41649494/how-to-remove-icon-animation-for-bottom-navigation-view-in-android
[Survey] Kaggle - Quora 5位解法まとめ

Kaggle - Quora Question Pairs[^1]の5位解法[^2]の調査記事です．

Title: [5位] 5th Place Solution Summary
Author: Faron, KazAnova
Discussion URL: https://www.kaggle.com/c/quora-question-pairs/discussion/34349
Code(フォーラムに添付): https://kaggle2.blob.core.windows.net/forum-message-attachments/190488/6625/mark_dodgie_qs_in_test.py

## Summary

- 600以上の特徴量をXGBoostで学習
- 特徴量の25以上は右記モデルの予測値(LightGBM, NN, LSTM, SGD)
- 0.13程度に正例をover sampling.

## NLP

様々な方法で特徴量を抽出

- 前処理を行ったテキストから抽出
	- 原文
	- 疑問部分
	- ステミング処理
	- テキストクリーニング
	- ストップワードのみ
	- ストップワード除去
- トークンを集計することで抽出
	- 共通/非共通のトークン
	- トークンの数
- 両質問に共通する最長の部分文字列
	- 文法や句読点の誤りを

- 学習済みGloVe
- Word2Vec
- Spacy
- Doc2Vecは役に立たなかった
- PyLucene[^3]も役に立たなかった
- スペルチェックがテストデータにあるランダムな単語(重複しているかどうかの判断を困難にさせるために仕込んだ?)の除去に役立った
- このランダムな単語がある文は文法的にも論理的にも間違ってた．

## グラフ構造

各質問をノード，質問1と2を辺としたグラフの特徴に価値があった．

- 両質問に共通する質問の数
- 一意な質問の数
- 質問1と2の間での長さnのパスの数
- 最大クリーク数
- 成分の数
- y(q1,q3) = y(q2, q3) = a ならば y(q1, q2) = a

## その他の特徴量

負例の作り方が作為的だったため，下記特徴量も改善に繋がった．

- min(qid1, qid2)
- abs(qid1 - qid2)
- 全てのテキストをソートした際のindexとの差

## References

[^1]: Kaggle, [Quora Question Pairs](https://www.kaggle.com/c/quora-question-pairs), 2017.
[^2]: Faron, [5th Place Solution Summary](https://www.kaggle.com/c/quora-question-pairs/discussion/34349), 2017.
[^3]: Apache, [PyLucene](http://lucene.apache.org/pylucene/)
【Swift】Optionalな要素を持つArrayをループでunwrapして使う

## はじめに

次のような、Optionalで包まれた要素をもつArrayがあるとします。
このArrayに対して、ループの中でnilでない要素をunwrapして処理を実行する状況を考えます。

```swift
let items: [Int?] = [1, 3, nil, 6, 10, nil, nil, 8]
```

このような処理の書き方を、初めて知ったやり方もあったので、4種類ほど紹介してみます。
4種類とも処理の結果は同じになります。

## 実行したSwiftバージョン

- Swift 5.1


## 書き方

### ▼ 単純なループ

ループしながらguardでnilを弾いてみます

```swift
for i in items {
    guard let item = i else {
        continue
    }
    print(item)
}

// ↓出力結果
// 1
// 3
// 6
// 10
// 8
```

### ▼ Enumeration Case Pattern

Enumeration Case Pattern によるパターンマッチング

```swift
for case .some(let item) in items {
    print(item)
}

// ↓出力結果
// 1
// 3
// 6
// 10
// 8
```

### ▼ Optional Pattern

Optional Pattern によるパターンマッチング

```swift
for case let item? in items {
    print(item)
}

// ↓出力結果
// 1
// 3
// 6
// 10
// 8
```

### ▼ Functional

関数型で書いてみます

```swift
items.compactMap({ $0 }).forEach({ print($0) })

// ↓出力結果
// 1
// 3
// 6
// 10
// 8
```


## おわりに

きっと他にもいろんな書き方ができるんだろうな〜と思います。
間違いなどありましたらご指摘ください:bow_tone1:

## 参考

https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#
peco の超基本

# 基本的な動作

- 標準出力をpecoに渡すと、インタラクティブに選べる
- 選んだテキストが標準出力される

これだけ！

# 一番簡単な例

テキストを改行区切りで peco に渡す。

```
echo "A\nB\nC" | peco
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cb193f8f-554e-9374-384a-a006324d3e4a.png)

テキストを選ぶと標準出力される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f8822410-bb78-3e17-1eaa-6c66ab16a91e.png)

これだけ。


# 応用

peco で選んだテキストは標準出力されるだけなので、その後にパイプを渡して、好きな動作をさせてあげれば良い。

## 例: クリップボードに入れる (Mac限定)

```
ls | peco | pbcopy
```

## 例: grep で絞り込む

(特に意味はない)

```
echo "A\nB\nC" | peco | grep 'A'
```

# 環境

- peco version v0.5.1
- zsh 5.3.1 (x86_64-apple-darwin16.3.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Windows】NW切り替え後接続できなくなった場合に試したい手順

# 【Windows】NW切り替え後接続できなくなった場合に試したい手順

　有線→無線の切り替えや、アクセスポイントの切り替え時に接続が切れるサービスやサイトがあるため、手順をまとめました。
　個人的にはWindows側に残ったキャッシュが悪さをしているケースに遭遇することが圧倒的に多いため、その観点から手順をまとめています。


## WindowsのDNSキャッシュクリア

　一番手っ取り早く、良く試される手順。【ipconfig /flushdns】でキャッシュをクリアし、【ipconfig /displaydns】でクリアされたかどうかを確認します。

```CMD:キャッシュクリア手順
C:\Users>ipconfig /flushdns

Windows IP 構成

DNS リゾルバー キャッシュは正常にフラッシュされました。

C:\Users>ipconfig /displaydns

Windows IP 構成

（以下キャッシュされた情報が出力される。接続できなくなったサイトの情報が無いことを確認する）

````


## DNS Clientサービスの再起動

　【ipconfig /flushdns】しても接続できなくなったサイトの情報がクリアされないことがあります。その場合はこのサービスを再起動することで、クリアされることがあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/151198/3ef95c55-00ba-bb32-082d-1f641b71f93a.png)


## hostsの確認

　キャッシュをクリアしてもhostsに誤った情報が残っていると、アクセスできないため、hostsも確認します。
　hostsは `C:\Windows\sysem32\drivers\etc\hosts` にあります。
　hostsの変更は「notepadを管理者モードで起動」などで行います。


## それでもだめだった場合
　上記だめだった場合、PC再起動・「ネットワークの問題の識別と修復」・接続NWの変更などを試すことになります。
Vuetify.jsでVDataTable内部にNumber型のVTextFieldが強制的にblurされる

要するにinputフィールドで文字を入れた瞬間にフォーカスが外れて困った話。
比較的レアケースではあるが、困ったのでメモ。

## まずはバージョン

| モジュール | バージョン |
| --- | --- |
| [vuetifyjs](https://vuetifyjs.com/) |  0.14.8 | 
| [vue.js](https://jp.vuejs.org/index.html) |  2.4.2 |

## 発生する前提条件
* VDataTable内でVTextFieldを利用している
* VTextFieldが`type=Number`になっている
* VTextFieldに`v-model`ないしは`v-bind`で値を設定している

## 発生する問題
VTextFieldに任意の値を入力した場合に強制的にblurされてしまいフォーカスが外れてしまう。

## 原因
VDataTable全体がリフレッシュされることで、VTextFieldも再Mountされてしまう模様。
(VTextField#mountedが呼ばれることを確認)

## 対策
[#1293 Text field in data table loses focus](https://github.com/vuetifyjs/vuetify/issues/1293)に書いてある。

要するに、template部分をtrタグで囲って、キーを付与しろとのこと。
つまり、以下のbefore-afterで動くようになる。

#### before
```html
<v-data-table slot="content" :headers="headers" selected-key="id" :items="dataItems" >
  <template slot="items" scope="props">
    <td>{{ props.item.name }}</td>
    <td>
      <v-text-field slot="content" required v-model="props.item.value" type="Number"/>
    </td>
  </template>
</v-data-table>
```
#### after
```html
<v-data-table slot="content" :headers="headers" selected-key="id" :items="dataItems" >
  <template slot="items" scope="props">
    <!-- trタグでくくってkeyを付与する -->
    <tr :key="props.item.id">
      <td>{{ props.item.name }}</td>
      <td>
        <v-text-field slot="content" required v-model="props.item.value" type="Number"/>
      </td>
    </tr>
  </template>
</v-data-table>
```
JSON型のデータを普通の配列のデータに変えたいとき

`"[\"1\", \"2\"]"`みたいなデータを`[1, 2]`みたいな普通の配列のデータにしたいときに自分用のメモとして書きたいと思います。

```rb
json = '[\"1\", \"2\"]'
array = JSON.parse(json)  #=> ["1", "2"]
``` 

すると、`array`は

```rb

array #=> ["1", "2"]
```

みたいなデータになります。これを`map`を使えば、`[1, 2]`というデータに変換できます。

```rb
array.map{|id| id.to_i} #=> [1, 2]
```

これをまとめて1行で書くと下記みたいになりますね。

```rb
JSON.parse(json).map{|id| id.to_i} #=> [1, 2]
```

## 追記
下記のコメントで初めて知ったのですが、`map`のところでもっと簡単にかけます。

```rb
JSON.parse(json).map(&:to_i) #=> [1, 2]
```

ちなみに、ブロックの代わりに **&:メソッド名** という引数を渡せる条件は、

```
・ブロック引数が1個である
・ブロックの中で呼び出すメソッドには引数がない
・ブロックの中では、ブロック引数に対してメソッドを1回呼び出す以外の処理がない
```

です。
【FileMaker】Server 16でのApacheエラー

久しぶりにFileMaker Serverのインストールをする機会がありまして。
Server周りは浦島状態だったので、記録として残しておきます。

FileMaker Server 16をmacOS(Sierra 10.12.6)にインストールしようと、インストーラを叩いたら、

Apache止めろや

とメッセージが出て先に進めなくなったので、知っている限りのserveradminで対応したのですが、httpdが止まらない。。。
[マニュアル](https://fmhelp.filemaker.com/docs/16/ja/fms16_install.pdf)見ても、コマンドなどの情報は載っておらず。

[サポートページ](http://filemaker-jp.custhelp.com/app/answers/detail/a_id/13488/~/%E3%83%9D%E3%83%BC%E3%83%88-80-%E3%81%8A%E3%82%88%E3%81%B3-443-%E3%81%8C%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E5%A0%B1%E5%91%8A%E3%81%95%E3%82%8C-filemaker-server-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)を参考にして、

sudo lsof -i -P | grep "LISTEN"

すると、確かに、httpdが動いている。
でも、なんども

sudo kill nnnn(プロセスid)

しても、ゾンビのように復活。

たどり着いたのが、Appleコミュニティ。
さすがです。[ありました。](https://discussionsjapan.apple.com/thread/10166313?start=0&tstart=0)

ただ、こちらに書いてあったserveradminなどの方法でもダメで、今回は、httpd_server_app.confを開いて、わざとlistenポートを起動しないようにし、ようやっとインストーラが先に進みました。

以下、こちらでやってみた手順です。
※いつもこの手順で解決するとは限りません。

(1)ターミナルを起動
(2)cd /Library/Server/Web/Config/apache2/
(3)vi httpd_server_app.conf
(4)"listen 80","listen 443"をコメントアウト
(5)保存

インストールが済んだ後は、listenポートのコメントアウトを必ず外して元に戻しておいてくださいね。
Cognos BI 10.2.Xのサポート期限と延長サポート

#Cognos BI 10.2.Xのサポート期限と延長サポートプログラム
Cognos BI 10.2、10.2.1、10.2.2をご使用の皆様は、これらのバージョンのCognosのサポート期限が、**「2018年4月30日」**である事をご認識されていますでしょうか。
現在、非常に多くの環境がこのバージョンで稼動していると思います。
*Software lifecycle*
https://www-01.ibm.com/software/support/lifecycleapp/PLCSearch.wss?q=Cognos+Business+Intelligence&ibm-search=Search

2018年4月30日後のサポートに関して、過去事例の障害検索ベースでの対応を行う「Continuing Support」プログラムと、これまで通りのバグFixも行う「Service Extension」プログラムが、以下のTechnoteで説明されています。

**Cognos BI 10.2.x Continuing Support**
http://www-01.ibm.com/support/docview.wss?uid=swg22005165

気がつかずにサポートが切れていた、という状況にならないように、早めのご対応をご検討下さい。
初のNode.js #1

#はじめに

普段仕事ではAccessやExcelばかり使っていますが、
今日はWindowsの環境でnode.jsを初めて使ってみる事を書いてみます。
Node.jsは何のためにと問うならば、お仕事と勉強の為です！

#環境
```
Windows7(64-bit)
```

#インストール編
[Node.jsのサイト](https://nodejs.org/en/)より、まずはプログラムをダウンロードします。
最新バージョンの**V8.0.4**（2017/09/12現在)がありましたが、ほとんどの人にお勧めと
ある、**v6.11.3**の方をインストールしました。
設定やインストール先は何も考えずDefaultで進めました。

#確認編
インストールがFinishしたら、Windowsのプログラムファイルから、
すべてのプログラムの中にある、**Node.js** のフォルダを開きます。

その中にある、**Node.js command Prompt** をクリックすると、
Windowsでもおなじみ？コマンドプロンプトが表示されます。
ここで、インストールされているか確認の意味で、

```
node.exe -v
```
と入力すると、

```
V6.11.3
```
と出力されました。
これはバージョンを知るコマンドコマンドです。

```
node.exe -h
```
でヘルプが表示されます。
また、cd(カレントディレクトリ）やmkdir（メイクディレクトリ）も使えました。

#初歩編
基本的な使い方を覚えるために、まず、テキストエディタでjsファイルを作成します。

```hello.js
console.log("HELLO WORLD!");
console.log("コンニチワ!!!!");
```
このファイルがあるディレクトリに移動し、下記コマンドをたたきます。

```
node.exe hello.js
```

すると、コマンドプロンプトにHELLO WORLDとコンニチワが表示されます。


次回はパッケージのインストールや利用方法を追っていきたいと思います。
QiitaもしくはQiita:Teamからmdをダウンロードするコード


# 前回のおさらい

[Qiita:Teamを移行するかもしれない件について](http://qiita.com/akashima/items/c53abba9a77b1fafda87)

Qiita:Teamから移行するかもしれないので、データを取れるようにしてみました。
今まではcurlを叩いてほうほう、とうなづいていたのですが、今度はコーディングです。
ベースはpython3でできております。
python2？マルチバイトの処理が面倒なので使わないですよ。

## コードを書いた結果

なんか3時間近くコーディングして、httpライブラリってどうやって使うんだっけ、みたいなところをやってたわけですが、一応ダウンロードまでできました。
引数チェックしてないのは、用途が限られているからであって、他に利用価値がないからです。

```
#!/usr/bin/env python
# coding: utf-8

import sys
import json
import urllib.request
import urllib.parse

apiUrl = ''
apiKey = ''
teamName = ''
api = '/api/v2/items?per_page=100'

def argmentscheck():
    global apiUrl
    global apiKey
    global teamName

    if len(sys.argv) == 2:
        apiKey = sys.argv[1]
        apiUrl = 'https://qiita.com'
        print('Qiitaからデータを抜き出します')
    elif len(sys.argv) == 3:
        apiKey = sys.argv[1]
        teamName = sys.argv[2]
        apiUrl = 'https://' + teamName + '.qiita.com'
        print('Qiita:Teamの' + teamName + 'からデータを抜き出します')
    else :
        print('引数の数が何かおかしいです')

def main():
    headers = {"Authorization" : "Bearer " + apiKey}
    requestUrl = apiUrl + api
    request = urllib.request.Request(requestUrl, None, headers)
    response = urllib.request.urlopen(request)
    jsonRaw = response.read().decode('utf-8')
    json.dumps(jsonRaw, ensure_ascii=False)
    jsons = json.loads(jsonRaw)

    for oneWrote in jsons:
        print(oneWrote)

if __name__ == '__main__':
    argmentscheck()
    main()
```

parseいらないんですけど、なぜか毎回書いてしまう…。

## 使い方

事前準備として、python3の最新版を持ってきます。

```
brew install python3
```

pip3は使いません。使わなくて良いように標準ライブラリのみを利用しています。

```
python3 qiita-download.py {APIキー} {Qiita:TeamのID}
```

具体例はこんな感じでしょうかね

Qiitaから引っ張ってくる場合は、

```
python3 qiita-download.py abcdefghijklmn
```

という具合でいけるかと思います。

Qiita:Teamから引っ張ってくる場合は、

```
python3 qiita-download.py abcdefghijklmn zyx
```

## jsonのデータが取れたまではいいけど、どう使うか

試しに以下の箇所を書き換えてみるといいでしょう。

```
        print(oneWrote)
```

例えばタイトルが欲しければ

```
        print(oneWrote['title'])
```

他に記事そのもののURLが欲しければ、

```
        print(oneWrote['url'])
```

こんな感じで取得できます。

あとはpython使える人なら楽勝なはず。
pythonが使えなくてもコーディングが複雑じゃない分理解しやすいと思います。

# これからやること

残タスクはざっとこんな感じです。

- 年ディレクトリ作成処理
- 月ディレクトリの作成処理
- urlに.mdを加えて素のMarkdownのダウンロード
- Qiita:Teamからイメージを取得する処理
- Qiita:Team内の画像パスを相対パスに書き換える対応

できたらまた記事投稿します。それでは。
Portainer でできること


Docker の管理をシンプルなUIで行うためのOSS。
できることを確認してみた。

一言で言うと「**だいぶ簡単で必要最低限なオペレーションはDockerホスト単独に於いては可能**」
>Swarm Clusterも対象とできるが今回は未確認

# 使うまでの準備
* Docker のホスト
    * ローカルホスト：つまりportainerを同じホストで動かす
    * リモートホスト：daemon 起動に -H tcp://0.0.0.0:2375 のようにLISTENしておく
* Portainer のインストール
    * コンテナとして稼働可
    * コンテナ使わず稼働可

https://portainer.readthedocs.io/en/stable/deployment.html

# ざっくりできること羅列

* ダッシュボードによるDockerホストの俯瞰
    * Node Info（Hostname , Docker version , CPU , Memory）
    * Containers
    * Images
    * Volumes
    * Networks
* テンプレートからの起動
    * 「App Templates」からカタログのような形で提供されているものからコンテナを起動可能
* コンテナの起動、停止、リスタート、削除、ポーズ、リジューム
* コンテナへの情報・ステータス確認、ログ確認、コンソールアクセス、ACL、イメージ作成
    * ステータスはCPU,Memory,NetworkのUsageがグラフで確認可能
    * プロセスも確認可能（ps出力的な）
* イメージ一覧、Pull、削除可能
* ネットワーク一覧、作成、削除可能
* ボリューム一覧、作成（ドライバ利用）、削除可能
* イベントログ
* Dockerホスト情報確認
* イメージレジストリの登録可能
* Portainerユーザの管理
* Portainerチームの管理
* Docker ホストの管理（Endopoints）
* Portainer画面のロゴやテンプレートなどのカスタマイズ
* コンテナ起動時にLabelをつけられてるコンテナに対して、それを指定しPortainerUIから隠すこともできる

# 他
* RANCHER Cattleのライブラリからデプロイし、利用することも可能

# Ref
* https://portainer.io/
* https://portainer.readthedocs.io/
* https://docs.docker.com/
react-routerのv4で同じパスにリダイレクトしようとするとエラーが出る

## あらすじ

重い腰をあげて自分が扱っているプロジェクトのReact Routerのバージョンをv4に上げてリファクタしている際に出てきたこのエラー。

`Warning: You tried to redirect to the same route you're currently on: "リダイレクト先のパス"`

意訳すると、『今いるパスと同じところにリダイレクトしてるよ』って怒られてるみたいですね。
リダイレクトは普通に行われているけど、console上でエラーが何度も出ているのはどうもよろしくない🤔

原因として考えられるのは、SPAである以上同じContainerやComponentを何度も呼び出している関係上、こういったエラーが出てきていると推測しています。


## なんとかしたい（した）

これの対処方とか色々ググってはみているものの、全然解決策が転がっていないのでひとまず以下のようなかんじでなんとかしました！

```js:hoge.jsx
...

render() {
  const path = isLoggedIn ? '/' : '/login';
  
  return (
    ...

    {location.pathname !== path &&
      <Redirect to={path}>
    }
  )
}

...
```

絶対もっといい方法があるなと思っているのでマサカリお待ちしています😇
Watson Retrieve and Rankでよく使用するコマンド

# APIドキュメント
https://www.ibm.com/watson/developercloud/retrieve-and-rank/api/v1/

# 公式チュートリアル
https://console.bluemix.net/docs/services/retrieve-and-rank/getting-started.html

# Commands

* list clusters
```curl -k -G -u "{username}:{password}" "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters"```

* create cluster
```curl -k -X POST -u "{username}:{password}" "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters" -d ""```

* del cluster
```curl -k -X DELETE -u "{username}:{password}" "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/{cluster_id}"```

* solrの設定ファイルをアップロード
```curl -k -X POST -H "Content-Type: application/zip" -u "{username}:{password}" "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/{cluster_id}/config/{作成する設定の名前}" --data-binary @setting_files.zip```

* Collectionの作成
```curl -X POST -u "{username}:{password}" "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/{cluster_id}/solr/admin/collections" -d "action=CREATE&name={作成するコレクションの名前}&collection.configName={コレクションに適用したい設定名}"```

* JSON形式で回答データをアップロード

```curl -X POST -H "Content-Type: application/json" -u "{username}:{password}" "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/{cluster_id}/solr/{collection_name}/update" --data-binary @answers.json```
修正版リリース待ち）DreamweaverCC2017でSASS出力先が反映されない

DreamweaverCC2017 MacでSASSを使いたいと思って設定をしたのだが、出力先が反映されない。
具体的には以下の状況。

- サイトの管理＞CSSプリプロセッサー＞ソースと出力 画面で「出力フォルダーを定義」のラジオボタンを選択し、出力先を設定。仮に「CSS」フォルダとしておく。
- 同じ画面でソースフォルダを選択。仮に「SCSSフォルダ」とする。

SCSSファイルをSCSSフォルダ内に配置し、編集する。自動コンパイルの設定をチェックしているので自動でCSSフォルダにコンパイルされて出力されるはずだが、なぜかSCSSフォルダ（ソースと同じフォルダー）に出力される。

試しにfoundation/_base.scssのアンダーバーをとってfoundation/base.scssにしてみたところ、やはり同じフォルダ内（foundation/base.css）にCSSファイルが生成された。

webで見ても今のところ事例が見つからないんだけど、とりあえずQiitaなら情報が集まるかも……ということで上げておいてみます。

![170912-0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/166369/beedbdb7-bbbd-4cc0-114a-c3fd77cb2b9c.jpeg)


追記）Dreamweaverのバグリポートにも上げておきました。

追記）Dreamweaverのバグリポートから回答きました。「対応済み。プレリリーズ版を使えるなら最新ビルドを試してみてね。でなかったらパブリックリリースをお待ち下さい」とのこと。
原文は以下。

> We have fixed this issue, if you are a pre-release user you can verify in the latest builds shared on the forum. Else you can wait on the public release to verify.
gemがインストールされてるかの確認方法

### Gemfileに書いてbundle install

```ruby:Gemfile
gem 'aws-sdk', '~> 3'
```

```:コンソール
$ bundle install
```

### コンソールを立ち上げて見る

```:コンソール
$ rails c

[1] pry(main)> Aws::IoTDataPlane::Client　# 該当gem内で使うクラスを入れてみる
=> Aws::IoTDataPlane::Client　# 入ってる！yay!
```
Docker でRedmine コンテナを使ってみるの巻

#目的
コンテナとして、Redmine を作成した際のつまずきを共有

#前提
CentOS Linux release 7.X 上にDocker を導入済み
※導入の手順は、以下のサイト参照
　https://ic8ghatake.wordpress.com/2017/09/08/docker-%e3%81%a7redmine-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%81%ae%e5%b7%bb/

下のサイトの転載
ic8ghatake.wordpress.com/2017/09/08/docker-%e3%81%a7redmine-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%81%ae%e5%b7%bb/


#構築
下のサイトを参照

http://qiita.com/tily/items/8996831d0603c6ef1cfc

やったとこだけ抜粋

ディレクトリ作成
`mkdir redmine_plugin_of_yours/`

作成したディレクトリに移動
`cd redmine_plugin_of_yours/`

docker-compose 設定ファイル作成
`vi docker-compose.yml`
 
```docker-compose.yml
version: "2"
services:
  app:
    image: sameersbn/redmine
    environment:
      - DB_HOST=db
      - DB_NAME=redmine_production
      - DB_USER=root
      - DB_PASS=root
    links:
      - db
    depends_on:
      - db
    ports:
      - 8080:80
    volumes:
      - ./:/home/redmine/redmine/plugins/redmine_plugin_of_yours/
  db:
    image: mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=redmine_production
```
 

起動

`docker-compose up -d`
 

5分後に

x.x.x.x:8080 でアクセス出来ました

 

PW の再設定、管理者設定をして、デフォルトの設定をロードして完了。

※Redmine の初期ログインID/PW (admin/admin)




#Tips

Redmine の設定を行っていると下のエラーが発生

Internal error

An error occurred on the page you were trying to access.
If you continue to experience problems please contact your Redmine administrator for assistance.

If you are the Redmine administrator, check your log files for details about the error.
 

どうも日本語の入力はハジかれるようだ。

調べてみると下のページにいきつく。

http://redmine.jp/tech_note/first-step/admin/create-user/

 

デフォルト設定をロードしていなかったので、実施。

管理　＞　「デフォルト設定をロード」

するとエラーが、、、

デフォルト設定がロードできませんでした: Mysql2::Error: Incorrect string value: '\xE7\xAE\xA1\xE7\x90\x86...' for column 'name' at row 1: INSERT INTO `roles` (`name`, `issues_visibility`, `position`) VALUES ('管理者', 'all', 1)
 

調べると下のサイトが近い状況

https://fight-tsk.blogspot.jp/2017/06/official-redminedocker-compose.html

https://blog.leko.jp/post/how-to-use-redmine-with-docker-in-japanese/

http://unskilled.site/docker%E3%81%AE%E5%85%AC%E5%BC%8Fmysql%E3%81%AF%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%8C%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7utf8%E3%81%8Butf8mb4%E3%81%AB%E3%81%97/

 

どうもmysql のコンフィグファイルをうまく読み込めていない様子。。。

公式MySQLでインストールされているMySQLは/etc/mysql/conf.d/に*.cnf形式のファイルが入っているとその設定を優先するようになっています。

 

上の文を信じて、conf.d フォルダを作成して、cnf データを置いてみる。

mkdir /etc/mysql
mkdir /etc/mysql/conf.d
cp -p /etc/my.cnf /etc/mysql/conf.d/
 

再度、コンポースアップ

docker-compose up -d
 

再度、Redmine を試してみるもダメ。。。

フォルダとファイル、コンテナを全て削除。

 

下のサイトを参考にして解決

http://qiita.com/neko-neko/items/de8ea13bbad32140de87

結論として、

docker-compose.yml へ

command: mysqld –character-set-server=utf8 –collation-server=utf8_unicode_ci

を追加することで、対応できた。

今後、mysql を利用するときは、上のコマンドが必須だと感じた。。。

 

 

まずは、起動しているコンテナのID を取得

docker ps
 

redmine のコンテナを停止/削除する

docker stop "コンテナID"
docker rm "コンテナID"
 

問答無用で、コンテナ全てを削除するには下のコマンド

docker rm -f `docker ps -a -q`
FaceTrackerを試してみた

研究でopenFrameworksのFaceTrackerを使ってみようと思い
自分のMacBookに環境構築した際の備忘録です。

MacにXcodeがインストールされている前提で話を進めますがopenFrameworksの[公式ガイド](http://openframeworks.cc/ja/setup/xcode/)に従ってインストールすれば問題ないと思います。
ちなみにわたしはOS 10.11.6、Xcode 7.3.1 を使用しています。

# これから導入するもの

- openFrameworks 0.9.8
- FaceTrackerを使用するのに必要なアドオン2種類
    - ofxCv
    - ofxFaceTracker
    
# openFrameworksのインストール
[公式HPのガイド](http://openframeworks.cc/ja/setup/xcode/)に従ってインストールします。
新規プロジェクトの生成までできたらOKです。

ここでopenFrameworksをインストールしたディレクトリをOF_ROOTとしておきます。

# アドオンの導入
下記のリンクからダウンロードできます。

[**ofxCv**](https://github.com/kylemcdonald/ofxCv/tree/stable)
ダウンロードしたフォルダの名前を「ofxCv」に変更して、OF_ROOT/addons/に移動。
※OF0.9.8をインストールした場合、必ず「stable」という方をDLしないとサンプルをコンパイルするときにエラーが出てしまいます。

[**ofxFaceTracker**](https://github.com/kylemcdonald/ofxFaceTracker)
同様にダウンロードしたフォルダをOF_ROOT/addons/に移動。

# サンプルプログラムを動かす
これから、OF_ROOT/addons/ofxFaceTracker/ にあるサンプル example-** を動かしてみます。

**新規プロジェクトの作成**
projectGeneratorで新規プロジェクトを作成します。
プロジェクトの作成時にアドオンを適宜追加するのですが
必要なアドオンがサンプルによって多少異なります。
何を追加すればよいかは example-**/addons.make に書いてあるので参照してください。

たとえばexample-extractionを動かすときには

- ofxCv
- ofxOpenCv
- ofxFaceTracker
- ofxGui

の4つが必要になります。

**ソースのコピー**
example-**/src を、先ほど作成したプロジェクトフォルダにコピーします。
すでにsrcというフォルダが存在するはずなので、置き換えてください。

**モデルデータの追加**
OF_ROOT/addons/ofxFaceTracker/libs/FaceTracker/model にあるすべてのファイルを、
新規プロジェクトのbin/data/modelにコピーします（フォルダが存在しなければ新規作成）。

**サンプルのコンパイル**
これでプロジェクトの設定が全て完了したので、Xcodeでプロジェクトを開いてコンパイルします。
はじめは少し時間がかかると思いますが待っていれば実行できると思います。


# おわりに
example-extractionなどは、Macの内蔵カメラの映像をリアルタイムにトラッキングしてくれるものです。
わたしがサンプルを動かしたときは画面が真っ暗で何も起こらなかったのですが、内蔵カメラに問題があったようで、PCを再起動することで正しく動作しました。

あらかじめ録画した映像を使いたいときは、example-non-realtimeを参考にするといいと思います。これは、内蔵カメラの映像のかわりに bin/data/**.mov を使用するサンプルです。

FaceTrackerでは顔の特徴点を60箇所くらい検出してくれるみたいなのですが
ピンポイントで「鼻だけ」とか取りたい場合はどうすればいいか、また投稿したいと思います。
【PostgreSQL】特定のテーブルを除外してdumpする

これでいけた

```
$ pg_dump -h ホスト名 -U ユーザ名 -p ポート -d DB名 -T --exclude-table=除外するテーブル名 --exclude-table=除外するテーブル名 > hogehoge.dump
```

ただし、これを元にリストアすると除外指定したテーブル自体が作られないっぽいので、後でテーブルだけ作る必要があるかも
RailsとかLaravelとかDjangoを使っているならDB作って、migrateした後にリストアする、って感じでしょうか

<hr>

以下のようにするとスキーマを取れるので、migrateとかする必要がなくなる

```
$ pg_dump -h ホスト名 -U ユーザ名 -p ポート -d DB名 -T --exclude-table=除外するテーブル名 --exclude-table=除外するテーブル名 > hogehoge.dump
$ pg_dump -h ホスト名 -U ユーザ名 -p ポート -p ポート -s >> hogehoge.dump
```
[JavaScript][TypeScript] 文字列("true", "false")をboolean型に変換する

文字列("true", "false")をboolean型に変換しようと思ったが、良い方法が思いつかなかったのでメモ

#前提条件
TypeScriptで、引数文字列をboolean型に変換するメソッドを作りたい

```typescript
public toBoolean(booleanStr: string): boolean {
    // 引数文字列をboolean型に変換した結果を返却
}
```

#悪い書き方(と思われる)
```typescript
public toBoolean(booleanStr: string): boolean {
    return JSON.parse(booleanStr);
}
```
わざわざ`JSON.parse()`を使うのは大げさな気がするし、コストが高いような気がする...
さらに、`JSON.parse()`は厳密な使い方でないとエラーを吐くことが判明

```javascript
JSON.parse("true");    // true
JSON.parse("false");   // false
JSON.parse("TRUE");    // エラーになる
JSON.parse("FALSE");   // エラーになる
JSON.parse(null);      // null
JSON.parse(undefined); // エラーになる
```

#良い書き方(と思われる)
[converting String true/false to Boolean value [duplicate]](https://stackoverflow.com/questions/3976714/converting-string-true-false-to-boolean-value)を参照したところ、良さそうな書き方があったので書き直し

```typescript
public toBoolean(booleanStr: string): boolean {
    // "true"文字列と比較した結果を返す
    // 念のため小文字化しておく
    return booleanStr.toLowerCase() === "true";
}
```
この方法であれば、厳密な使い方をしなくてもエラーにはならない

```typescript
XXX.toBoolean("true");    // true
XXX.toBoolean("false");   // false
XXX.toBoolean("TRUE");    // true
XXX.toBoolean("FALSE");   // false
XXX.toBoolean(null);      // エラーにならず, false
XXX.toBoolean(undefined); // エラーにならず, false
```

#おわりに
文字列("true", "false")をboolean型を変換する機会はあまりないと思われるので、お役に立てたらと思います。
間違い・気付きなどあれば、コメントをいただけると助かります。
Macで `Can't find initialization file gs_init.ps.` と怒られる


久々に `gs` コマンドをさわったら `Can't find initialization file gs_init.ps.` と怒られた。

`GhostScript` は HomeBrew でインストールした認識。


## 原因

`gs` コマンドが X11 の方へリンクを向いていた。恐らく X11 をインストールした時に強制的に上書きされた気配。 `/usr/local` だったらまぁブッキングはあるわな…


## 対処

`brew link --overwrite ghostscript` で Homebrew の ghostscript のコマンドを強制上書き


## 参考

[gs_init.psが見つからない時の対応方法メモ -- Qiita](http://qiita.com/greymd/items/9ca59ad3e6cf10e8a2f6)
.net Runtime エラー　1022に関して

たぶんインストールしているソフトウェアが悪いさしていると思っているのですが

1022　.Net Runtime のエラーが
WinServ2012r2にいっぱい入ってしまいます……

グーグルさんで調査しても不明なんだよな……

https://social.technet.microsoft.com/Forums/en-US/9a080be3-6359-40cc-badc-a92769845dc3/net-runtime-?forum=winserver8

に書いても返答無くて放置されているんだよな……

((+_+))
Liferay 7 / DXP用大量データ一括作成ツール、Dummy Factory

# Dummy Factoryとは？
[Dummy Factory(ダミーファクトリー）](https://github.com/yasuflatland-lf/liferay-dummy-factory)は、開発中やデモ用途で、大量または頻繁にユーザーやサイトなどのデータを生成するのに利用します。

## 生成できるデータ
* 組織
* サイト
* ページ
* ユーザー
* Webコンテンツ
* ドキュメント
* 掲示板

## 主な機能
* 複数組織の一括生成（階層化された組織の作成も可能)
* 組織と同時に組織サイトの生成
* サイトの一括生成(階層化サイトの作成も可能）
* ページの一括生成
* ユーザーの一括生成、組織、サイトへの同時割り当て
* ユーザー名の意味のある名前でのランダム生成
* Webコンテンツの一括生成
* ドキュメントメディアデータの一括生成

## 環境要件
* JDK 1.8 以上
* Liferay 7 GA1 / Liferay DXP SP1 以上

## 使い方
1. [最新版](https://github.com/yasuflatland-lf/liferay-dummy-factory/releases)をダウンロードします。
2. ```${liferay-home}/deploy```にデプロイします。
3. Liferayにtest@liferay.com, パスワードtestでログイン
4. 右ペインの「アプリケーション」から「Dummy Factory」を選択して、任意のページに配置し、利用してください。
Vagrant+VirtualBoxでローカルWEBサーバー on Windows

# WindowsPCにWEB開発環境を構築するぞ
というわけで、Vagrant+VirtualBoxでVMをつくったメモ。
OSはCentOS6.5を選択。

## ① VirtualBoxインストール
https://www.virtualbox.org/wiki/Downloads

1. 「Window hosts」からダウンロード
1. インストーラーを起動してインストール

## ② Vagrantインストール
https://www.vagrantup.com/downloads.html

1. 「Windows」からダウンロード
1. インストーラーを起動してインストール
1. Windows再起動

## ③ boxファイルの登録
コマンドプロンプトを立ち上げ、以下のコマンドを打つ。

```
vagrant box add hogehoge https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```

※ソースは http://www.vagrantbox.es/ から適したものを探す。

・コマンドの意味
vagrant box add {box名} {ソース}

登録が終わったら、下記コマンドで確認。

```
vagrant box list
```

## ④ Vagrantfile作成
ルートとなるディレクトリをつくり、そこに移動。

```
cd C:\path\to\hoge
```

以下のコマンドを実行。

```
vagrant init hogehoge
```
※box名は③で登録した名前

## ⑤ Vagrantfile編集
④のディレクトリに「Vagrantfile」というファイルができるので、テキストエディタで開く。

プライベートネットワークの行を編集してコメント外す。

```
config.vm.network "private_network", ip: "192.168.33.10"
```

同期フォルダの行を編集してコメント外す。（任意）

```
config.vm.synced_folder "C:/path/to/src/", "/var/www/html/"
```

これをやると対象のディレクトリがローカルとVMで同期されるので、
ソースファイルのアップロードのような作業が不要になる。

## ⑥ hosts追加（任意）
ブラウザアクセスしやすいようにhost名を指定する。
hostsをテキストエディタで編集。

C:\Windows\System32\drivers\etc\hosts

```
#追記
192.168.33.10 hogehoge
```
※⑤で指定したIP

# 動かしてみよう

## VM起動
④のディレクトリで以下のコマンドを実行。

```
vagrant up
```
少し時間がかかる。
※VirtualBoxのアクセスを確認するUACダイアログが出たら許可。

色々出た後、

```
==> default: Machine already provisioned. ...
```

と出れば成功。

また、

```
vagrant status
```

で状態を確認できる。

## VMに接続
起動が完了したら、WinSCP/Putty/TeraTermなどでSSH接続できる。

- ホスト：⑤で指定したIP/⑥で指定したhost名
- ユーザー：vagrant
- パスワード：vagrant

必要な初期設定をする。（とりあえずApache）

```
$ sudo yum update
$ sudo yum -y install httpd
$ sudo service httpd start
$ sudo chkconfig httpd on
```

ブラウザでも⑤のIP/⑥のhost名でアクセス可。

## VM終了
④のディレクトリで以下のコマンドを実行。

```
vagrant halt
```
少し時間がかかる。

# おまけなど

## boxファイル作成
共有用にVMイメージをboxファイルとして作成できる。
VM終了後、④のディレクトリで以下のコマンドを実行。

```
vagrant package --output hoge.box
```

box導入側は③のソースをOSリンクではなくboxファイルを指定すればOK。

## パーミッションについて
VM上の /home/vagrant 及び認証鍵のパーミッションを変えると正しく起動できなくなる。
次が正しいパーミッション。

- /home/vagrant => 700
- /home/vagrant/.ssh => 700
- /home/vagrant/.ssh/authorized_keys => 600

## vagrantコマンド用プロンプト
いつもカレントディレクトリを移動しないといけないので、
そこにバッチファイルを用意しておいてそれを叩くことにしてみた。

```
@echo off

title Vagrant Prompt

cd /d %~dp0
prompt $G

cls
vagrant -v
echo.
echo Current Directory is: "%cd%"
echo.

echo ================================
vagrant status
echo ================================
echo.

cmd /q /k

goto :eof
```

念のため最初にVMの状態をチェックする。
立ち上がったプロンプトに `vagrant up` 打てばOK。

# 参考
[Windows上でVirtualBox+Vagrant+CentOSによる仮想環境構築](http://qiita.com/hiroyasu55/items/11a4c996b0c62450940f)
[Windows上にVirtualBox+VagrantでCentOS環境構築](http://qiita.com/TakashiOshikawa/items/d2fb48d59e9e316af9a2)
[Vagrantのインストール、設定手順](http://qiita.com/Esfahan/items/41c4469f28f6011ab33b)
pythonでlist(配列)からランダムに要素を選択する


randomモジュールのchoice関数を使うことで、配列からランダムに1つの要素を取得することができます。

ただし、要素数が0の場合Exceptionをraiseするので注意が必要。

```python
>>> import random
>>> random.choice(["hoge","fuga","piyo"])
'piyo'
>>> random.choice(["hoge","fuga","piyo"])
'fuga'
>>> random.choice([])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib64/python2.7/random.py", line 275, in choice
    return seq[int(self.random() * len(seq))]  # raises IndexError if seq is empty
IndexError: list index out of range
```
フロントエンド開発 悪魔の辞典

### フロントエンド開発
クライアントサイド開発のカッコイイ言い方。なにか特別なことをしているような高揚感を与えてくれる。

### エコシステム
無駄だらけのシステムのこと。npmには日々コピペプログラマの功名心のために、役にも立たない車輪の再発明が登録される。npmのモジュールをインストールすると、ディスクのいたるところに同じファイルがぶちまけられる。一度それを使ってしまうと、互換性を無視した無秩序なアップグレードにより時間も浪費することになる。

### モジュールバンドラ
何でもまとめて巨大化させる究極のエコシステム。これを使うとわずかな差分しかないコピペモジュールが複数生産されるコピペプログラマ垂涎のシステム。生産されるモジュールは巨大であり、スマホの通信料を無駄遣いさせるがファイルが1つであることが何より重要なのだ！

### タスクランナー
ディスクI/Oを忌み嫌うNode信者によって生み出されたUnixのパイプを関数呼び出しの連鎖で実現するシステム。その設定は複雑怪奇で導入による自動化で得られた時間を無に帰す。標準入出力の単純さをなめていたとしか言いようがない。今はただのエイリアスでしかないnpm-scriptsにとって代わられた。

### トランスパイラ
本来はNode仕様のJavaScriptをブラウザ仕様に変換するだけだったはずが、調子に乗っていろんな言語を生み出し、フロントエンド界にバベルの塔の寓話のごとき混乱をもたらした。秩序の回復にバベルを用いるのは何の皮肉か。

### Node.js
トランスパイラを動かす言語。

### ノンブロッキングI/O
Node界に入門しようとするものを惑わす悪魔の呪文。I/Oはブロックするが、プログラムはブロックしないと悟るのに8年の修業を要す。

### フロントエンドエンジニア
簡単なことを難しくやる連中。日々その技巧をQiitaなどで競い合っている。

他にはない？
macOSでRuby, Python, PostgreSQLなどがインストールされているフォルダまとめ（随時更新）

Ruby　& macOSで色々なものがどこにインストールされているか調べてみました
# 環境
* macOS Sierra
* Homebrew 1.3.2
* rbenv 1.1.1
* pyenv 1.1.3
* postgres (PostgreSQL) 9.6.3

# macOS自体のフォルダ構成概要
```
/bin
/sbin
/usr
/Applications
/Users/user_name/Applications
~ #=> /Users/user_name
```

#フォルダの場所
## Ruby
### rbenv経由でインストールしたRuby
```
/usr/local/Cellar/rbenv/1.1.1    #rbenv本体
/Users/user_name/.rbenv/versions #Ruby
```
### SystemのRuby
```
/System/Library/Frameworks/Ruby.framework/Versions
```


## Gem
### rbenv経由でインストールしたRubyのGem
```
/usr/local/Cellar/rbenv/1.1.0/versions/2.3.3/lib/ruby/gems/2.3.0/gems
```
### SystemのRubyのGem
```
/Library/Ruby/Gems/2.0.0/gems
```

## PostgreSQL
```
/usr/local/Cellar/postgresql/9.6.3 # PostgreSQL本体
/usr/local/var/postgres/base       # DBファイルの場所
```

## Python
### pyenv経由でインストールしたPython
```
/usr/local/Cellar/pyenv/1.1.3    #pyenv本体
/Users/user_name/.pyenv/versions #Python
```
### SystemのPython
```
/System/Library/Frameworks/Python.framework/Versions
```

# 今後調べること
## Rubyがインストールされている場所
rbenv経由でインストールしたRubyがなぜ`/usr/local/Cellar/rbenv/1.1.0/versions`にインストールされるのか。`/Users/user_name/.rbenv/versions`にインストールされるというページもある。
追記: `RBENV_ROOT`が`/usr/local/opt/rbenv`に設定されているため。しかし設定した覚えがなく、どこで設定したのか調査中。基本的にはデフォルトの`/Users/user_name/.rbenv/versions`にインストールした方がいいようだ（[rbenv rehashは何をやっているのか？](http://dqn.sakusakutto.jp/2014/02/rbenv_rehash_what_it_does.html)参照）。
追記2: oh-my-zshのpluginファイル`/Users/user_name/.oh-my-zsh/plugins/rbenv/rbenv.plugin.zsh`の設定によるもののようだ。
[このPR](https://github.com/robbyrussell/oh-my-zsh/pull/4384)がマージされれば直るらしい(関連：　[Issue #3093](https://github.com/robbyrussell/oh-my-zsh/issues/3093), [PR #3808](https://github.com/robbyrussell/oh-my-zsh/pull/3808), [PR #4384](https://github.com/robbyrussell/oh-my-zsh/pull/4384), [Issue #4998](https://github.com/robbyrussell/oh-my-zsh/issues/4998), [PR #6168](https://github.com/robbyrussell/oh-my-zsh/pull/6168))。
追記3: 上記のプラグインファイルをPRの通り編集してもうまくいかないので、oh-my-zshのプラグインのうちrbenvのものを使わないようにして、Rubyをインストールし直したところ、推奨通りの動きとなった。


# 参考
[Rubyが参照してるgemのパスやインストール済gemを確認する方法](http://qiita.com/h5y1m141@github/items/74029cab9706971c8dbe)
[Rails開発環境の構築（複数バージョン共存可能）（Homebrew編）](http://qiita.com/emadurandal/items/e43c4896be1df60caef0)
[rbenv + ruby-build はどうやって動いているのか](http://takatoshiono.hatenablog.com/entry/2015/01/09/012040)
[postgreSQLの構築](http://qiita.com/DaikiandNatsu/items/135f53844524417fa605)
[rbenvおよびbundlerの基本的な使用方法](https://www.qoosky.io/techs/8a0f1d8d9e)
[rbenv rehashは何をやっているのか？](http://dqn.sakusakutto.jp/2014/02/rbenv_rehash_what_it_does.html)
[Mac に Python 3.x 系と 2.x を共存するベストな方法](http://blog.miyadi.net/archives/2018)
[oh-my-zsh を使って zsh の便利な設定をまとめて取り入れる](http://mollifier.hatenablog.com/entry/20101009/p1)

# （参考）Ubuntuフォルダ構成（作成中）
```
/usr
/bin
```
コールバック（callable）を連続的に実行する`php-pipeline`を公開しました


## はじめに
作った動機を箇条書きにすると、こんな感じです。

- どうしても長くなってしまう操作・処理がある
- いわゆる手続き型プログラミング
- 例えば、イベントリスナー
  - 何かの前処理や後処理を一箇所で書けて、かつ呼び出しも自動的に行われるから便利
  - 目的ごとに、複数のリスナーを用意しているが、それでもビジネス要件によってやることは増える
- 例えば、コマンド
  - バッチ処理など、手動または自動で実行される処理をCUIで呼び出すことができて便利
  - オプショナルの引数が増えるなどして、少しずつ処理が複雑になっていく
- とにもかくにも、いったん何かの単位でコードを分割したい

最初はそんな動機で何か既にある素晴らしいライブラリがないか探しました。

## `league/pipeline` を使うだけで良さそうに思えた
[league/pipeline](http://pipeline.thephpleague.com/) を見たときは、「ああ、これだよ。これでいいじゃん」って思いました。
しかし、結論からいうと、今回は車輪の再発明覚悟で自作することにしました。 
今回、一度、構築したパイプライン（callableの配列）に、コールバック（callable）を後から差し込みたかったのですが、そのインターフェイスがなかったというのが最大のポイントでした。

## `league/pipeline`を参考にしつつも、自分なりにライブラリを作ることに
自作するにあたって、`league/pipeline`を真似した部分とそうでない部分があります。

### `league/pipeline`を真似した部分
- [callable](http://php.net/manual/ja/language.types.callable.php)の配列を順番に処理する
  - `callable`であれば良いので、[__invoke](http://php.net/manual/ja/language.oop5.magic.php#object.invoke)を実装したクラスでもOK
- `Be immutable.` 防御的コピーを活用して、状態が不変（イミュータブル）になるようにしました

### `league/pipeline`を真似しなかった部分
- `callable`の配列に追加する際、配列のキー（int型）を指定できるようにした
  - 配列は`ksort`によって並べ替えられるので、後から`callable`を任意の位置に挿入することが可能に
- `PipelineBuilder`のかわりに、`Pipes`を作成し、`Pipeline`はコンストラクタで`Pipes`を受け取るようにした
  - `Pipeline`のコンストラクタで`array`を受け取っていたのでは、`callable`以外のものを突っ込まれる可能性があるので
- `ProcessorInterface`で`Processor`を入れ替えられるようになっているが、用途が思いつかないので、採用しなかった
- コールバック（callable）の引数は、`array $payload`ではなく、`Context`オブジェクトを渡すようにした
- `Status`を`isStopped`に変更することで、処理を途中でやめることができるようにした

## ということで公開しました
小さいライブラリなので、`Scrutinizer-ci`のスコア10点満点、カバレッジ100％にして公開しました。

- https://packagist.org/packages/imunew/php-pipeline
- https://github.com/imunew/php-pipeline

## おわりに
お手伝いしている現場でも実際に使ってみて、長い処理をひとまず分割していけたらと思います。
`league/pipeline`がこれを真似してくれたら、嬉しいですね。 
実際、本番で動くようになったら、様子をみて、v1.0.0にしたいと思います。 
ではでは。
VisualStudioCodeでMarkdownの時だけ末尾の空白をトリミングしない方法

Visual Studio Code で Markdown を書くようになりました。
私は設定で末尾の空白は自動で削除してくれるように設定をしています。

```
// 有効にすると、ファイルの保存時に末尾の空白をトリミングします。
"files.trimTrailingWhitespace": true,
```

ただ、この設定をしていると Markdown の改行スペースが削除されてしまう……。
なので、下記の記述を追加します。

```
// Markdownの場合は空白トリミングは実施しない
"[markdown]": {
    "files.trimTrailingWhitespace": false
}
```

これで Markdown の時だけ末尾の空白が削除されないようになります！
Android Studio Beta 5 環境で DataBinding 関連の「シンボルが見つけられません」が出た時の対処法

# 現象
Android Studio Beta 5 で Gradle を更新したらビルドは通るが、実行時に DataBinding 周りで「シンボルを見つけられません」が大量発生した 

# 環境
Android Studio 3.0.0 Beta 5
Gradle : 4.1
GradlePlugin : 3.0.0-beta5

# 対処法
gradle.properties に下記を追加したら問題解決した

```gradle.properties
android.enableAapt2=false
```
dockerでalpine linux ベースのcontainerに入って、shellを使いたいとき。

# 内容
- `docker exec -it {container_name} /bin/bash`
- alpineベースのimageのcontainerで/bin/bashを上記コマンドを実行したらbashがないと怒られた。

# 解決方法
- `docker exec -it {container_name} /bin/ash`
- `bash`ではなく`ash`を利用する。
- alpine linuxはbusyboxを元に作られていて、シェルには`ash`が使われている。
    - https://stackoverflow.com/questions/35689628/starting-a-shell-in-the-docker-alpine-container

# 終わりに
- 地味にはまった。
Slack APIでユーザー宛のメンションができなくなったので対策した

あるアクションに対して、API経由でユーザー宛にメンションする仕組みを動かしていたのですが、本日突然メンションされない（Slackアプリ上でリンクがつかず、通知も飛ばない）状態になりました。

```
curl -XPOST -d "token=TOKEN" -d 'channel=channellname' -d "text=<@username> こんにちは"  -d 'as_user=true' 'https://slack.com/api/chat.postMessage' >&/dev/null
```

どうやらSlack APIに仕様変更があったらしい。
https://api.slack.com/changelog/2017-09-the-one-about-usernames
> When evaluating messages to determine if your user or bot user is mentioned, look for a user ID, not a username.

<@username>ではなく<@userID>を使え、ということのようです。

ユーザーIDなんて知らんがな。
ということでWebテスターからサクッと探します。
https://api.slack.com/methods/users.list/test

結果から、メンションを飛ばしたい相手を見つけてidをコピーし、usernameを置き換え。

```
curl -XPOST -d "token=TOKEN" -d 'channel=channellname' -d "text=<@userID> こんにちは"  -d 'as_user=true' 'https://slack.com/api/chat.postMessage' >&/dev/null
```

無事メンションできました。
[Excel]VLOOKUPよりINDEX+MATCH

Excelによるデータ編集を多用する現場において
VLOOKUP関数を魔法の杖のように使うところも多いと思いますが、
個人的にはINDEX関数とMATCH関数の組み合わせが汎用的で好みです。

## VLOOKUP vs INDEX+MATCH

```
=VLOOKUP(検索する値, 検索範囲, 検索範囲における列番号, 0)
```
＊0=完全一致

VLOOKUPの弱点は、検索範囲の左端列(1番目)を基準にしなければいけない点です。
データベース的な表であれば必ず左端にキーがあるとは限りません。

そこで、

```
=INDEX(表示する列範囲, MATCH(検索する値, 検索先の列範囲, 0))
```
＊0=完全一致

INDEXとMATCHを組み合わせれば、何番目を検索し何番目を表示するか自由に指定できます。

（参考）
[VLOOKUPの限界](http://www.vlookup.skr.jp/vlookup_index_match.html)
[VLOOKUPよりINDEX・MATCHを使おう！](http://gadget-nail.com/tips/excel_indexmatch/)

## おまけ：テーブル機能
表を「テーブル」に変換しておくとデータの操作が便利になります。
また、関数での参照も楽に/見やすくなります。

1. 「挿入」->「テーブル」で範囲指定
<br>＊フォーカスしているセルを含む表の範囲がデフォルト選択状態<br>＊先頭行を見出しとするかも選べます
1. 「デザイン」->「テーブル名」で名前をつけておく

こうしておくと、例えば

```
=INDEX(商品テーブル[商品名],MATCH(売上テーブル[商品ID],商品テーブル[商品ID],0))
```

のようにカラム名で書けるので、関数式自体の視認性も上がります。

（参考）
[Excelテーブルについて](http://www.becoolusers.com/excel/table.html)

## 新関数 XLOOKUP（2019/09/03追記）
本記事の内容を一つの関数で満たすものが実装されるそうです。
[Microsoft、新しいExcel関数「XLOOKUP」を発表 ～「VLOOKUP」や「HLOOKUP」の後継](https://forest.watch.impress.co.jp/docs/news/1204053.html)
便利になりそうですね。
Thymeleaf リクエストパラメータの文字列比較


Thymeleafでリクエストパラメータを使うには`${param.hoge}`のように書けばいいんですが、`th:if`の中で比較しようとするとうまくいかない。

というわけでパラメータ文字列を比較する場合は以下に注意。（公式より引用）


>param : リクエストパラメータを取得するために使用します。 ${param.foo} は foo リクエストパラメータの値を持つ String[] です。ですので、最初の値を取得するために普通は${param.foo[0]} を使用します。

つまり

```
<label th:if="${param.hoge[0].equals('hogehoge')}"></label>
```
こういうことですね。


参考：
[Tutorial: Using Thymeleaf (ja) - 17 Appendix A: Expression Basic Objects - request/session 属性などに対するウェブコンテキストネームスペース]
(http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html#requestsession-%E5%B1%9E%E6%80%A7%E3%81%AA%E3%81%A9%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%8D%E3%83%BC%E3%83%A0%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9)
Mac OSXでJohn the Ripperのインストール方法

#1 John the Ripperをダウンロードする。
John the Ripperはフリーのパスワード解析ツールです。

http://www.openwall.com/john/

Macの場合は、Proもあるようですが有償で高いので、普通にソースをダウンロードしてコンパイルする方向で行きます。
[ここ](http://www.openwall.com/john/j/john-1.8.0-jumbo-1.tar.xz)からソースをダウンロードして、適当なディレクトリに保存します。
ソースを展開したら、展開したディレクトリに移動して、

```zsh:コマンド
$ cd src
$ ./configure && make
```

これでうまく行けばコンパイル完了。

```zsh:コマンド
$ cd ../run
$ ./john --format=** --wordlist=***.lst hash.txt
```

みたいな感じでクラックを開始すればOK.あとは時間が許す限りパスワードが解析されるのを眺めていられます。当然ですが、悪用はしちゃダメですよね。ハッシュを解析したい、しなければならない正当な理由がある人はこの記事が参考になれば幸いです。

#2 コンパイルに失敗する場合
私の環境の場合、opensslのヘッダが見つからないと言われてコンパイルエラーが発生しました。
OSXだと割と多いみたいですね。このエラー。
色々調べてやってみたけど最終的には以下で解決できたと思います。

.zshrcに以下を追加しました。bash使っている人は.bash_profileとかに追加して下さい。追加終わったらsourceするのを忘れないように。

```zsh:.zshrc
export PATH=/usr/local/opt/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$LD_LIBRARY_PATH
export CPATH=/usr/local/opt/openssl/include:$CPATH
export LDFLAGS=-L/usr/local/opt/openssl/lib
export CPPFLAGS=-I/usr/local/opt/openssl/include
export PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH
```

それと以下のシンボリックリンクを作成。

```zsh:コマンド
$ cd /usr/local/include
$ ln -s ../opt/openssl/include/openssl .  
```

Johnのsrcディレクトリに再び戻り、

```zsh:コマンド
$ make clean
$ ./configure && CFLAGS="-L/usr/local/opt/openssl/lib -I/usr/local/opt/openssl/include" make
```

これでコンパイルが正常に完了しました。
ご参考になれば。

# 参考URL
http://qiita.com/marumaru/items/ca801c957986302f6fe6
https://github.com/erlio/vernemq/issues/206
rails on heroku Herokuでrails動かすまでにつまづいた点まとめ

Herokuでrailsデプロイして動かすまでに参考にした情報と、参考にした情報だけでは足りずにつまづいた箇所をまとめます
【自分がかかった時間】ローカル環境でrails動かすまで3時間　herokuでrails動かすまで更に8時間
【各サイトで醸し出してる必要な時間】15分
全然簡単じゃなかった。っていうか前提とされる知識が自分に足りなすぎた。特にgit

自分の環境
ubuntu

必要なもの　ローカル側
rbenv
ruby
ruby on rails
postgresql
git

必要なもの　サーバー側
githubアカウント
herokuアカウント


英語読めるならまず参考にした方がいい公式ドキュメント
https://devcenter.heroku.com/articles/getting-started-with-rails5


参考にしたサイト
http://qiita.com/ibara1454/items/40ce2d82926f48cf02bc
https://www.oiax.jp/rails/zakkan/rails_4_2_installation_on_ubunt.html
https://techacademy.jp/magazine/6401#sec3
https://git-scm.com/book/ja/v1/使い始める-Gitのインストール
ハマらなければ上記4サイトでいけると思います。ただし、後述の.git/configの書き換えと、config/database.ymlの設定のコピペでハマらなければ。この2点にみんなハマると思う。

参考にしたサイトでつまづいた箇所を補足するサイト
https://git-scm.com/book/ja/v1/使い始める-Gitのインストール
http://qiita.com/yyyske/items/e0c2bb615daa323cfd90
http://qiita.com/konweb/items/621722f67fdd8f86a017
http://qiita.com/ay3/items/8d758ebde41d256a32dc
http://qiita.com/s-kiriki/items/3f9b1926d85aaa65c694
http://d.hatena.ne.jp/wats/20100915/1284478558
http://tetsuwo.tumblr.com/post/49687103213/heroku-push-fatal-heroku-does-not-appear
http://qiita.com/yyyske/items/e0c2bb615daa323cfd90
http://tweeeety.hateblo.jp/entry/2016/02/10/000712
http://qiita.com/RyochanUedasan/items/d447cbf2733e389994bb

必須ではないが推奨のサイト
http://fiveteesixone.lackland.io/2015/01/27/migrate-from-unicorn-to-puma-on-heroku/

つまづいたところ
gitの使い方が全然わからなかった(上記補足するサイトで補完OK。時間はかかるけどgitある程度知らないとどうにもならない)
.git/configの[remote "origin"]を[remote "heroku"]に書き換えないと動かないことに気づかなかった。っていうか参考サイトにはそのことは載ってなかった
config/database.ymlの設定が　https://techacademy.jp/magazine/6401#sec3 の、データベースの設定の項目のサンプルをコピペしても動かない
動かないというのは具体的には(サイトに書いてあるやつコピペの動かない方は)
production:
半角空白1文字<<: *default
半角空白1文字adapter: postgresql
半角空白1文字encoding: unicode
半角空白1文字pool: 5
だと動かない。
production:
半角空白2文字<<: *default
半角空白2文字adapter: postgresql
半角空白2文字encoding: unicode
半角空白2文字pool: 5
だと動く。
要は参考にしたサイトに載ってるconfig/database.ymlのコピペのままだと、行頭が半角空白1文字だから動かねーっていうのでハマった
そのあとさらにgitでpushの仕方が分からなくてハマった(addしてpushしなきゃいけないのを、pushさえすればリモートリポジトリに追加されると思ってheroku側のconfig/database.ymlの書き換えができなかった)

以上です。
herokuでrails動かそうとして動かなかった人たちの参考になれば嬉しいです。