OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】Google Play Storeアプリで任意のアプリや検索結果を開く

AndroidアプリからPlay Storeアプリの自分自身のアプリページやパブリッシャーページを開きたかったので調べてみました。

## アプリページを開く
```kotlin
fun openPlayStore(context: Context, packageName: String) {
    val url: String = "market://details?id=$packageName"
    val intent = Intent(Intent.ACTION_VIEW)
    intent.data = Uri.parse(url)
    try {
        context.startActivity(intent)
    } catch (e: ActivityNotFoundException) {
        intent.data = Uri.parse("https://play.google.com/store/apps/details?id=$packageName")
        context.startActivity(intent)
    }
}
```

`ActivityNotFoundException`発生時はブラウザのPlay Storeを開きます。

## 検索結果ページを開く
```kotlin
fun openPlayStore(context: Context, query: String) {
    val url: String = "market://search?q=$query"
    val intent = Intent(Intent.ACTION_VIEW)
    intent.data = Uri.parse(url)
    try {
        context.startActivity(intent)
    } catch (e: ActivityNotFoundException) {
        intent.data = Uri.parse("https://play.google.com/store/search?q=${query}&c=apps")
        context.startActivity(intent)
    }
}
```

`market://search?q=$query`のところを`market://search?q=pub:<パブリッシャー名>`とすることで特定のパブリッシャーの検索結果を開くこともできます。

例）`market://search?q=pub:Google`

## 補足
他にもデベロッパーページやコレクション（無料トップ、有料トップなど）へもリンクさせることができるらしいです。

まとめ

| Result | Web page link | Android app link |
|-----------------|------------------|------------------|
|Detail|`http://play.google.com/store/apps/details?id=<package_name>`|`market://details?id=<package_name>`|
|Dev|`https://play.google.com/store/apps/dev?id=<developer_id>`|`market://dev?id=<developer_id>`|
|Search|`http://play.google.com/store/search?q=<query>`|`market://search?q=<query>`|
|Collection|`http://play.google.com/store/apps/collection/<collection_name>`|`market://apps/collection/<collection_name>`|


詳しくは [Linking to Google Play | Android Developers]
(https://developer.android.com/distribute/marketing-tools/linking-to-google-play.html) を参照してください。

## 参考
Linking to Google Play | Android Developers
https://developer.android.com/distribute/marketing-tools/linking-to-google-play.html

How to open the Google Play Store directly from my Android application? - Stack Overflow
https://stackoverflow.com/questions/11753000/how-to-open-the-google-play-store-directly-from-my-android-application
初心者向けJava8ラムダ演習1

【注意】
解答はこの記事にコメントせずに、自分の記事として投稿して、この記事にリンクを張るようにしてください。
一旦作った記事なので、演習問題は後日追加されることがあります。

#演習1 ループの置き換え

次のコードに示されるループの部分をStream APIを用いたコードに変換せよ。
なお解答のコードは問題のクラス名にSolをサフィックスとして追加し、さらに[+α]の課題について、問題に示されるクラスが同じものである場合はAをSolの前に追加し、ASolを追加して保存せよ。

## 演習1-1

forループをStream APIのforEachメソッドで置き換えよ。
[+α] コードをより短くなるように改良せよ。

```java:Practice1.java
import java.util.List;
import java.util.ArrayList;

public class Practice1 {
  static public void main(String[] args) {
    List<String> helloWorld = new ArrayList<String>(3);
    helloWorld.add("Hello");
    helloWorld.add(" ");
    helloWorld.add("World");
    helloWorld.add("!");
    for (int i = 0; i < helloWorld.size(); i++) {
      System.out.print(helloWorld.get(i));
    }
  }
}
```

## 演習1-2

次のwhileループをStringクラスのcharsメソッドで取得できるIntStreamを使用して置き換えよ。
(※ IntStreamとして取得されることに注意)

```java:Practice2.java
public class Practice2 {
  static public void main(String[] args) {
    String sourceText = "this is an test script to read.";
    int i = 0;
    char c = sourceText.charAt(i);
    while (c != '.') {
      if (c > 'm') {
        System.out.print(Character.toUpperCase(c));
      } else {
        System.out.print(c);
      }
      c = sourceText.charAt(++i);
    }
    System.out.print(".\n");
  }
}

```

[+α] 以下のようにループの中で計算されている値を条件としている場合はどうなるか。

```java:Practice2A.java
public class Practice2A {
  static private final int MAX = 1024;

  static public void main(String[] args) {
    String sourceText = "this is an test script to read.";
    int i = 0;
    char c = sourceText.charAt(i);
    int sum = c;
    while (sum < MAX) {
      if (c > 'm') {
        System.out.print(Character.toUpperCase(c));
      } else {
        System.out.print(c);
      }
      c = sourceText.charAt(++i);
      sum += c;
    }
    System.out.print("\n");
    if (sum >= MAX) {
      System.out.println("script stopped for MAX size limitation.");
    }
  }
}
```
slackの豆腐文字化けを翻訳するhubot-slack用スクリプト

# 豆腐問題そろそろ解決してほしい。。。
MacからSlackクライアントを使って日本語の文章を投稿する際、日本語変換中にbackspace使ったりすると謎のバックスペース文字(U+0008)が入って文字化けすることが有ります。

![Pasted_Image_2017_08_23_15_14.png](https://qiita-image-store.s3.amazonaws.com/0/24956/fdc02dfb-88a1-a67d-db1e-fe721e451f7a.png)

# hubot-slack用スクリプト書きました。
Channelにbotをinviteしておくと、文字化け投稿を察知するとこんな感じで翻訳してくれます
node.jsのBufferを使っています

![Pasted_Image_2017_08_23_15_14.png](https://qiita-image-store.s3.amazonaws.com/0/24956/abed520f-619b-89e3-9fc1-ac857ee2021b.png)

# 問題の根幹
Slack Client が使っている electron が依存する Chromium の問題のようです

Backspace can not erase the last one character during Japanese IME conversion (macOS) · Issue #9173 · electron/electron
https://github.com/electron/electron/issues/9173

electronまでの修正は終わり、slack clientの取り込み待ち。
このスクリプトもそれまでの命でしょう。

# install
お手持ちのSlack用Hubotのルートディレクトリにて

```
npm install hubot-slack-tofu-honyaku --save
```

その後hubot-slack-tofu-honyakuをexternal-scripts.jsonに追加

```
$ cat external-scripts.json
[
  ... ,
  "hubot-slack-tofu-honyaku",
  ...
]
```

# リンク
## github
https://github.com/takashyx/hubot-slack-tofu-honyaku

## npm
https://www.npmjs.com/package/hubot-slack-tofu-honyaku
Projects for Trelloのバグ修正を依頼してみた

Projects for Trelloが突然正常に動かなくなり、バグ修正を依頼してみたので、その時のことを書きます。

## [Projects for Trello](https://chrome.google.com/webstore/detail/projects-for-trello/mholjhodapabhdbchonjjoecmfhobfoa)

Projects for Trelloはボードにラベルをつけられるので、とても便利なツールです。このツールについては記事がいくつもあるのでここでは詳しく書きませんが、プロジェクトを分類するときに役立ちます。 

## 急に動かなくなった
ところが、いつからかChromeのバージョンアップ後、Projects for Trelloが動かなくなってしまい、困っていました。
通常はラベルにしたい文字列を`｛｝`で囲み、タイトルの先頭に書きます。 が、タイトルに`｛｝`で表示されたままラベルに変更されないのです。ツールを無効化したり、ページを更新したりしましたが、ダメでした。
しばらく修正を待っていましたが、特に対応もなく・・・
Chrome Storeを見て、レビューに動かないという報告がいくつもありました。
私もコメントしてみましたが、特に反応なし。

## Githubで修正依頼
これはおそらく開発者が見ていない（見ているけど、特に対応は必要ないと考えている）と考え、情報を検索。
Githubに[Projects for Trello](https://github.com/agebase/projects-for-trello)のrepositoryがあることを発見！！

早速、[issue](https://github.com/agebase/projects-for-trello/issues/18)を登録しました。幸い英語は得意なので、特に問題はありませんでした。
正直、回答はあまり期待していませんでしたが、１週間ぐらいでChromeのアップデートで解決しました。

## 提供した情報
issueを登録する際に気をつけたのは、ただ動かないと報告してもあまり意味はないということ。QAの時もそうですが、具体的な事象や関連情報を付け加えることで、的を絞れますし、開発者の方の負担を減らすこともできます。
もともと、Projects for TrelloはTrelloScrumから派生したツールだということがありました。そこで、Github内を調べていると、動かなくなった時期に同じような[issue](https://github.com/Q42/TrelloScrum/issues/110)が報告され、こちらは修正されていました。おそらくこれと同じ原因ではと思い、事象はタイトル通りでそれ以上書くこともなかったので、「[issue](https://github.com/Q42/TrelloScrum/issues/110)と同じ原因ですか」とコメントを入れました。

## 解決
開発者から特にコメントはないので、私のissueが役に立ったのかもわかりませんが・・・解決したので何よりです。　原因は同じようなものだったようです。
一言入れてくれると嬉しいですけどね。
アプリとかでもそうですけど、バグって補足情報がとても重要で、切り分けもしていると解決も早くなることを改めて感じました。
また、こういう時は待っているよりは、積極的に動かないといけないことも実感しました。 みんな誰かがやってくれるだろうと思ってると何も前に進まないですし。
今後も、このような時には積極的に対応していきたいと思います。
Bash on Ubuntu on WindowsからhtmlファイルをWindowsのブラウザで開く

素人の備忘録。
ガチの素人が試行錯誤しただけなので変なところだらけだと思います。

# 動機
VimでMarkdownのプレビューに[Previm](https://github.com/kannokanno/previm)を使っている。
普通なら、`:PrevimOpen`で編集中のMarkdownのプレビューがブラウザで開く。
Bash on Ubuntu on WindowsでもVimを使えるようにしたが、Previmがうまくいかない。

# 前提
[wsl-terminal](https://github.com/goreliu/wsl-terminal)を使用しているので、cbwinが使える。
参考：
[Bash on Ubuntu on Windows + オールインワンmintty](http://qiita.com/shiena/items/b8036514c217000a221e)
[Bash on Ubuntu on Windowsからcmd / startを使う](http://qiita.com/shiena/items/b8036514c217000a221e)

`wstart`を使えば、UbuntuからWindowsのhtmlファイルをWindowsのブラウザで開くことはできる。

```shell-session
# cd /mnt/c/Users/user/Documents
# wstart test.html
```

ところが、Ubuntuの`$HOME`以下にあるhtmlファイルをWindowsのブラウザで開くことができない。

```shell-session
# cd ~/Documents
# wstart test.html

The system cannot find the file test.html
```

Previmはプレビュー用のhtmlファイルを作成し、`g:previm_open_cmd`で指定したコマンドで開いているらしい。
`wstart`を指定すればいいかと安易に考えていたが、上記のとおり開くことができない。

# 解決策
試行錯誤してみたところ、windowsのフルパスを`wstart`すれば、Windowsのブラウザで開けることがわかった。

```shell-session
# wstart C:/Users/user/AppData/Local/lxss/home/user/Documents/test.html
```

つまり、引数のファイルについてWindowsのフルパスを取得し`wstart`するシェルスクリプトを作り、それを`g:previm_open_cmd`に指定すればいいはず。
ということで`~/mytools`に以下のシェルスクリプトを作成。
参考：[bash で ファイルの絶対パスを得る](http://qiita.com/katoy/items/c0d9ff8aff59efa8fcbb)

```sh:~/mytool/startwinpath.sh
#!/bin/bash
windir='C:/Users/user/AppData/Local/lxss'
BoWpath=$(readlink -f $1)
wstart $windir$BoWpath
```

作成したシェルスクリプトに実行権限を与える。
参考：[○○.shを./○○.shで実行できるようにする](http://qiita.com/shishamo_dev/items/558b116fda95e4f4f808)

```shell-session
# sudo chmod +x startwinpath.sh 
```

`~/mytool`にパスを通す。

```zsh:.zprofile
export PATH=$PATH:$HOME/mytool
```

`g:previm_open_cmd`を設定（ついでにリアルタイムプレビューも設定）。

```vim:.vimrc
" htmlを開くコマンドを指定
let g:previm_open_cmd="startwinpath.sh"
" リアルタイムプレビュー有効
let g:previm_enable_realtime=1
```

無事`:PrevimOpen`でプレビューがWindowsのブラウザで開いた。
リアルタイムプレビューもうまく動いているようだ。

どうせ素人なのでWindowsのVimを使えばいいのではないかという気がしなくもないが…
Sublime Text 2 > 行半ばと行末のタブを消す手順 (行頭のタブは残す)

```txt:動作環境
Windows 7 Pro (32bit)
Sublime Text 2
```

組込みのCのソースコードなどで、行の半ばや行末におかしなタブが入っているとする。
Sublime Textで消す方法を考えた。

**ただし、「行頭のタブは消さない」とする。**

1. Ctrl + f
2. [Tab]を入力
    - Tabの部分が四角の枠で表示される
3. スクロールしつつ、行の半ばや行末のタブをDeleteキーで消す

検索状態のまま編集もできるというのは知らなかった。
Rails | 現在のタイムゾーン設定を文字列で取得する

# 例

```rb
Time.zone.tzinfo.name
# => "Asia/Tokyo"
```

# 環境

- Rails 5.0.5








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Matplotlibの棒グラフのX軸の表記について


#棒グラフの場合
配列bに日付文字列を「適度な間隔」で格納してset_xticklabelsでセット

```py3:hoge.py
import numpy as np
import matplotlib.pyplot as plt

ax = df.plot(kind='bar', color=['b','r','g'] , label ='hoge' ,alpha=0.3 )  
#ax = plt.gca()

ln = len(df.index)
a = np.arange(ln)+1
b = []
for i in a-1:
    b.append("") if i%5!=0 else b.append(str(df.index[i].strftime('%m/%d')))
#print(b)
ax.set_xticklabels(b,rotation =15)

```

#折れ線グラフの場合
X軸の表記はax.xaxis.set_major_formatterなどでセット

```py3:hoge.py
ax = df.plot(kind='line', color=['b','r','g'] , label ='hoge' ,alpha=0.3 )  

years = mdates.MonthLocator(interval=3)
months = mdates.MonthLocator()
daysFmt = mdates.DateFormatter("%m/%d")

ax.xaxis.set_major_locator(years)
ax.xaxis.set_minor_locator(months)
ax.xaxis.set_major_formatter( daysFmt )

```
strcmp をx64アセンブラで実装してみる

暇だったのでx64のアセンブラに手を出してみました。
普段x64を使っておいて知らないというのは癇に障るので。

nasmを使用しました。

```nasm:strcmp.asm
bits 64
section .text
global strcmp

strcmp:
	enter 0, 0				;スタックフレーム作成
	mov [rbp + 16], rdi		;rdiを[rbp + 16]に保存
	mov [rbp + 24], rsi		;rsiを[rbp + 24]に保存
	cmp rcx, rdx			;引数が等しいなら
	je .eqend				;当然等しいので.eqendに飛ぶ

	mov rsi, rcx			;rsiにrcxを代入
	mov rdi, rdx			;rdiにrdxを代入
	cld						;rflagsのdfをクリアする
.ifeq:						;ループの始まりラベル
	mov al, [rsi]			;byte [rsi]をalに代入
	test al, [rdi]			;alとbyte [rdi]をand演算
	jz .sd					;片方でも次の文字がNUL文字なら.sdに飛ぶ
	cmpsb					;byte [rdi]とbyte [rsi]を比較してフラグを立ててrdiとrsiをインクリメントする
	je .ifeq				;もし比較結果が等しいならループの先頭へ戻る
	dec rsi					;違うならrsiと
	dec rdi					;rdiをデクリメントする
.sd:						;戻り値を作成するラベル
	mov al, [rsi]			;byte [rdi]をalに代入
	sub al, [rdi]			;alからbyte [rdi]を引いてalに代入
	movsx rax, al			;alを符号拡張してraxに代入
	jmp .end				;終了ラベルに飛ぶ

.eqend:						;rax(戻り値)をゼロにするラベル
	xor rax, rax			;raxをゼロにする
.end:						;終了ラベル
	mov rdi, [rbp + 16]		;rdiを復元
	mov rsi, [rbp + 24]		;rsiを復元
	leave					;スタックフレームを開放
	ret						;リターンする
```

#Windowsで使ってみる(VC)
```cpp:test.cpp
#include <Windows.h>
#include <stdio.h>
#include <string.h>

const unsigned char asms[] = { 	//上のアセンブル結果を入れた配列
	0xC8, 0x00, 0x00, 0x00,
	0x48, 0x89, 0x7D, 0x10,
	0x48, 0x89, 0x75, 0x18,
	0x48, 0x39, 0xD1,
	0x74, 0x20,
	0x48, 0x89, 0xCE,
	0x48, 0x89, 0xD7,
	0xFC,
	0x8A, 0x06,
	0x84, 0x07,
	0x74, 0x09,
	0xA6,
	0x74, 0xF7,
	0x48, 0xFF, 0xCE,
	0x48, 0xFF, 0xCF,
	0x8A, 0x06,
	0x2A, 0x07,
	0x48, 0x0F, 0xBE, 0xC0,
	0xEB, 0x03,
	0x48, 0x31, 0xC0,
	0x48, 0x8B, 0x7D, 0x10,
	0x48, 0x8B, 0x75, 0x18,
	0xC9,
	0xC3
};

int main() {
	DWORD oldProtect;
	VirtualProtect((LPVOID)asms, sizeof(asms), PAGE_EXECUTE, &oldProtect);	//配列を実行させるためにメモリの保護を変更

	decltype(strcmp) *mystrcmp = (decltype(strcmp) *)(void*)asms;	//オリジナルのstrcmpの関数ポインタを作成して、配列のアドレスを無理矢理代入

	printf("mystrcmp(\"string\", \"STRING\"): %d\n", mystrcmp("string", "STRING"));	//"string"と"STRING"
	printf("mystrcmp(\"string\", \"string\"): %d\n", mystrcmp("string", "string"));	//"string"と"string"
	printf("mystrcmp(\"String\", \"string\"): %d\n", mystrcmp("String", "string"));	//"String"と"string"

	VirtualProtect((LPVOID)asms, sizeof(asms), oldProtect, &oldProtect);	//メモリの保護を元に戻す

	return 0;
}
```
めんどくさいので配列に機械語入れて実行させちゃいます。


```text:result.txt
mystrcmp("string", "STRING"): 32
mystrcmp("string", "string"): 0
mystrcmp("String", "string"): -32
```

ただしいですな
[Monaca] AndroidのminSdkVersionについて

現在、Monacaで提供しているCordovaの最新バージョンは「6.5」になります。

Cordova6.2までのAndroid「minSdkVersion」の標準設定は「14」でしたが、Cordova 6.5で提供しているAndroid「minSdkVersion」は「16」になります。

プロジェクトに組み込んでいるCordovaプラグインが要求する「minSdkVersion」が、プロジェクトの標準設定では利用できない場合など、開発しているプロジェクトによっては、この「minSdkVersion」を変更したい場合がでてきます。

この「minSdkVersion」は、MonacaクラウドIDEの設定画面からは変更することができません。
「minSdkVersion」を変更する場合は、config.xmlを直接編集する必要があります。


**config.xmlに誤った設定をした場合は、プロジェクトが動作しなくなる恐れがあります。編集する場合には、注意が必要です。**


# minSdkVersionの設定方法

「minSdkVersion」を変更する場合は、config.xmlの `widget` タグ内に記述します。

```
<widget xmlns="http://www.w3.org/ns/widgets" id="com.example.helloworld" version="1.0.0">
  <preference name="android-minSdkVersion" value="18"/>
</widget>
```

この設定は、Monacaが提供している機能ではなく、Cordovaが提供している機能になります。
同様に「targetSdkVersion」「maxSdkVersion」も設定することが可能です。

```
<widget xmlns="http://www.w3.org/ns/widgets" id="com.example.helloworld" version="1.0.0">
  <preference name="android-minSdkVersion" value="18"/>
  <preference name="android-targetSdkVersion" value="20"/>
  <preference name="android-maxSdkVersion" value="23"/>
</widget>
```

Android「minSdkVersion」「targetSdkVersion」「maxSdkVersion」を変更したい場合は、一度お試しください。
pragmaが`h`なjsx書いててESlintに`no-unused-vars`と言われないように

## 追記

`eslint-config-xo-react`読み込んだら`settings.react.pragma`効くようになった@@;
なのでこんな感じで大丈夫になりました。

```json:.tslintrc
{
  "extends": ["xo/esnext", "xo-react/space"],
  "settings": {
    "react": {
      "pragma": "h"
    }
  }
}
```

---


コンポーネントの少ないプロジェクトじゃないとやってられないと思いますが。

## 結果

こんな感じ。

```json:.eslintrc
{
  "extends": "xo",
  "parser": "babel-eslint",
  "rules": {
    "no-unused-vars": [
      "error", {
        "varsIgnorePattern": "^h$|^XxxComponent$"
      }
    ]
  }
}

```

`varsIgnorePattern`で`pragma`とコンポーネントを入れてる変数**すべて**をチェックしないようにゴリ押しできます。こんな感じのファイルで怒られなくなります。

```js
import {h, render} from 'ink';
import XxxComponent from './xxx-component';

render(<XxxComponent/>);
```

## 試したこと

ちなみに、`parserOptions. ecmaFeatures.jsx = true`にしたり、`setting.react.pragma = 'h'`してみたり、`react/jsx-uses-react`設定してみたけど何故か駄目でした…
LaravelにEnvoyタスクランナーを導入する手順

# Envoyタスクランナーって何？
デプロイ作業などをする際に、指定したサーバにsshで接続して、
コマンドを打ち込むなどの手作業を自動的にコマンド１発でやってくれる便利なツール。
コマンド一発で複数サーバに一気にデプロイできたり、さらに平行してコマンドを叩いてくれたりする。
コマンドはローカルから実行すればいいので、すごく楽。

# まずはEnvoyをcomposerでglobalインストール

```
composer global require "laravel/envoy=~1.0"
```

# globalインストールしたのにenvoyコマンドが見つかりませんと言われた場合
PATHが通ってないので設定する
zshの人は.bash_profileじゃなくて.zshrcに設定する。

```
echo 'export PATH=$HOME/.composer/vendor/bin:$PATH' >> .bash_profile
source .bash_profile
```

# Laravelのアプリrootで以下を実行し、雛形を作成
```
envoy init {user_name}@{server ip}
```

# アプリ直下のEnvoy.blade.phpを編集
Laravelのbladeシンタックスで書けばいいのでLaravelerにとって学習コストはゼロに近い。

```
@servers(['web' => '{user_name}@{server ip}'])

// サーバルートにあるhogeというフォルダの中身を見る
@task('hoge')
    cd ~/hoge/
    ls -la
@endtask

// cronに設定されてるバッチを確認する
@task('cron')
    crontab -l
@endtask

// コンファーム付きで本番環境にデプロイする
@task('prod', ['on' => 'web', 'confirm' => true])
    cd /var/www/honban/
    git pull origin master
    php artisan migrate --force
    composer dump-autoload
    gulp --production
@endtask

// コンファーム付きでstaging環境にデプロイする
@task('staging', ['on' => 'web', 'confirm' => true])
    cd /var/www/staging/
    git pull origin staging
    php artisan migrate
    composer dump-autoload
    gulp --production
@endtask
```

# 実行コマンドは開発環境のアプリrootから叩く
- ~/hogeのファイルリスト表示

```
envoy run hoge
```

- crontabリスト表示

```
envoy run cron
```

- 本番デプロイ

```
envoy run prod
```

- stagingデプロイ

```
envoy run staging
```

# プチ情報
sshを鍵認証にしておくとpasswordなども打ち込まなくていいので、非常に気持ちいい。

# メリット
- デプロイ手順を覚えなくていい。
- 手順をミスって本番のコードを開発のbranchで上書きしてしまったなどの事故がなくなる。
- コマンドを貼り付けていくだけなので、とにかく学習コストがゼロ。
- 何をやってるのか、設定ファイルを見れば一目瞭然。
- Laravelじゃなくても使える
- 何をやるコマンドなのかしっかり理解していれば、細かい手順が分かっていなくてもデプロイが可能

# まとめ
導入も簡単で、書くのも簡単でメリットいっぱい。Laravelありがとう。
FreePBXでBlacklistに入れた番号に応答しないようにする

FreePBX 13のBlacklistモジュールでは、Blacklistに入れた番号から着呼した際に、必ずAnswer（応答）してしまう仕様になっています。
これだと、応答したくない場合に困りますが、以下のようにapp-blacklist-checkセクションをオーバーライドして、Answerしないようにできます。

```/etc/asterisk/extensions_override_freepbx.conf
[app-blacklist-check]
include => app-blacklist-check-custom
exten => s,1(check),GotoIf($["${BLACKLIST()}"="1"]?blacklisted)
exten => s,n,Set(CALLED_BLACKLIST=1)
exten => s,n,Return()
;exten => s,n(blacklisted),Answer
exten => s,n(blacklisted),NoOp()
exten => s,n,Set(BLDEST=${DB(blacklist/dest)})
exten => s,n,GotoIf(${LEN(${BLDEST})}?${BLDEST}:app-blackhole,zapateller,1)
```

## 確認した環境

FreePBX 13 Distro 10.13.66-17
std::vectorをインデックスをそのままにラムダ式でsortする

`std::vector`をインデックスそのままでソートしたいな，でもコード内でそんなにたくさん使うわけじゃないしわざわざ比較関数定義したくないなみたいなときに以下のやり方が便利かもしれない

```C++
#include <iostream>
#include <vector>
#include <algorithm>

int main(int argc, char **argv){
    //適当にvectorをつくる
    std::vector<int> vec;
    vec.push_back(3);
    vec.push_back(7);
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(9);
    vec.push_back(4);
    vec.push_back(6);

    //pairの入ったvectorの定義
    typedef std::pair<int, int> pair;
    std::vector<pair> pair_vec;

    //pair入りvectorに添字とvectorの中身を挿入
    std::cout << "before sort" << std::endl;
    for(int i=0; i<vec.size(); i++){
        pair_vec.push_back(pair(i, vec[i]));
        std::cout << i << " " << vec[i] << std::endl;
    }

    //ラムダ式で比較式を書く
    std::sort(
        pair_vec.begin(),
        pair_vec.end(),
        [](const pair& x, const pair& y){return x.second < y.second;}
    );

    std::cout << "after sort" << std::endl;
    for(auto& i: pair_vec){
        std::cout << i.first << " " << i.second << std::endl;
    }

    return 0;
}
```
実行結果

```
before sort
0 3
1 7
2 1
3 2
4 9
5 4
6 6
after sort
2 1
3 2
0 3
5 4
6 6
1 7
4 9
```

### 追記(2017/8/24)
@yumetodo 氏に`std::iota`を使えばよいのではと意見をいただいたいので，参考に書いてみました．圧倒的にシンプルでいいですね…．

```C++
#include <iostream>
#include <vector>
#include <algorithm>

int main(int argc, char **argv){
    //適当にvectorをつくる
    std::vector<int> vec;
    vec.push_back(3);
    vec.push_back(7);
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(9);
    vec.push_back(4);
    vec.push_back(6);

    std::vector<int> index(vec.size());
    std::iota(index.begin(), index.end(), 0);

    std::cout << "before sort" << std::endl;
    for(auto& i:index){
        std::cout << i << " " << vec[i] << std::endl;
    }

    std::sort(
        index.begin(),
        index.end(),
        [&](int x, int y){return vec[x] < vec[y];}
    );

    std::cout << "after sort" << std::endl;
    for(auto& i:index){
        std::cout << i << " " << vec[i] << std::endl;
    }
    
return 0;
}
```

### 参考
* [vectorの配列番号をメモったまま（部分的に）並び変える](http://d.hatena.ne.jp/teramonagi/20130226]/1361886714)
 * vectorをインデックスと一緒にpairに突っ込むのはここを参考にしました
* [C++11のラムダ関数の簡単なまとめ](http://minus9d.hatenablog.com/entry/2015/03/08/232143)
 * ラムダ式を使ったソートはここを参考にしました
Spring BootをDockerで動かす

# はじめに
この記事ではSpring BootをDockerで動かし，hello worldを表示させます．
Dockerは勉強中なので，間違いなどがあればコメントお願い致します．

# 環境
- 言語
    - java8
- ビルドシステム
    - maven

## Springプロジェクトの作成
### 雛形のプロジェクトのDL
**[こちら](https://start.spring.io/)**から雛形を作成することが出来ます．

Dependenciesのところで，`web`と`devtools`を検索し，追加しましょう．
`devtools`を入れることで，ファイルが変更された時にコンパイルしてくれ，ブラウザをリロードするだけで表示に反映させてくれます．入れないと毎回`mvnw spring-boot:run`? `mvn spring-boot:run`? をし直さないとブラウザには反映されない・・・

その後，Generate Projectで雛形のプロジェクトのDLしましょう．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116983/41f9e343-ca9d-8e30-5ce5-12c10ff463cd.png)

DLしたらzipを解凍し，好きな場所にプロジェクトを配置しましょう．

### hello worldの記述
`src/main/java/com/example/demo/DemoApplication.java`（※プロジェクト名がdemoなので，ファイル名が`DemoApplication.java`になった）を変更して，以下のようにします．

`@RequestMapping("/")`はWebのフレームワーク使ったことがある方は分かるかもしれませんが，URLのパスがルートの時，このアノテーションが付いているメソッドが呼ばれます．
つまり，`http://localhost/`にアクセスすると，`public String home()`が実行されます．
もし，`@RequestMapping("/hoge")`のアノテーションをつけたときは，`http://localhost/hoge`で実行されます．

```java:src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello Docker World";
    }
	
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

## Dockerで動かすための設定
次にDockerで動かすためにdocker-compose.ymlを作成します．
### docker-compose.ymlの作成
以下のdocker-compose.ymlを作成します．

volumesを`.:/app`とすることで，作業するホストPC（カレントディレクトリ）とDockerのコンテナ(/appディレクトリ)を共有することが出来ます．

で，commandを`./mvnw spring-boot:run`とすることで，Spring Bootのプロジェクトを起動しています．

```yaml:docker-compose.yml
version: '2'
services:
    app:
        image: openjdk:8-jdk-alpine
        ports:
            - "8080:8080"
        volumes:
            - .:/app
        working_dir: /app
        command: ./mvnw spring-boot:run
```

# プロジェクトを動かす
`docker-compose.yml`があるページで以下のコマンドを実行してください．
そうするとDockerのコンテナで今回作成したプロジェクトがビルドされ，実行されます．

| オプション          |               備考 |
|:-----------------|:------------------|
| -d               |   バックグランドで実行 |

```bash:コマンドライン
docker-compose up -d
```

ちょっと数分待てば，以下のようにhello worldが出来ると思います．
ipアドレスは`docker-machine ip`で取得し，port番号は8080です．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116983/a816756c-def3-20c2-483d-a1ca769d77b1.png)

`Hello Docker World`を修正して保存すると，少し時間たった後にブラウザをリロードすると，表示もかわると思います．
これは，Dockerコンテナとフォルダ共有しているのと，`devtools`を入れたのと，`./mvnw spring-boot:run`を実行しているおかげでこうなってます．〜

# 最後に
出来たものはGithubに公開しています〜
https://github.com/ferretdayo/spring-with-docker

これからDBの連携など色々していきたいと思います〜
ROSのC++のソースコードをgdbでデバッグする方法

ROSを使ってC++のコードを書いた時にgdbでデバッグするときに，rosrunやroslaunchを使った方法を日本語で簡単に解説しているサイトがあまりないので書き留めます．

# 準備
gdbを使用するためには，デバッグ情報を付与する必要があります．
catkin_make，もしくはcatkin toolsでは以下のようにしてデバッグ情報付きでビルドをすることができます．

```
# catkin_makeの場合
catkin_make -DCMAKE_BUILD_TYPE=Debug 

# catkin_toolsの場合
catkin build -DCMAKE_BUILD_TYPE=Debug 
```

# rosrunでgdbを利用する
rosrunではindigo以降，`--prefix`オプションを利用することでgdbなどを利用できるようになりました．以下のように使用します．

```
# 同じターミナル内で実行する場合
rosrun --prefix 'gdb --args' pkg_name node_name
# 別のウィンドウにターミナルを開いて実行する場合
rosrun --prefix 'gnome-terminal -x gdb --args' package_name node_name
```

## roslaunchでgdbを利用する
roslaunchでは`<node>`タグに`launch-prefix`属性を用いることでgdbなどを利用することができます．以下のようなlaunchファイルを作成して使用します．

```
<launch>
  <node pkg="pkg_name" type="node_name" name="name" launch-prefix="gdb --args"/>
</launch>
```
`launch-prefix`の値を変更することで，rosrunで実行する場合と同様に，別のウィンドウにターミナルを開いて，デバッグしたいノード以外の挙動を見ながらデバッグすることも可能です．

#おわりに
ROSでgdbが使えると，自分が書いたコードをデバッグ出来るだけでなく，Navigation stackなどの有名パッケージの動作について，内部の挙動を見ながら理解することが可能になり，非常に便利です．

余談ですが，rosrunの`--prefix`オプションやroslaunchの`launch-prefix`属性では，gdbだけでなく，メモリデバッグツールであるValgrindやPythonのデバッガであるpdbを使用することもできます．
GoogleDataStudioでBigQueryの結果を出力してみた

# GoogleDataStudioとは
GoogleのBIツール

毎日管理画面が変わってるんじゃないかと思うくらい機能追加されている

通常のCSVをインポートすればもちろん可視化できるが、
Googleの他プロダクトとの親和性が高いのが、一番の特徴だと思う

たとえば以下のGoogleプロダクトをデータソースとして扱える

- AdWords
- アトリビューション360
- BigQuery
- CloudSQL
- DCM
- DFP
- GoogleAnalytics
- GoogleSpreadSheet
- SearchConsole
- YouTubeAnalytics

すごい

ファイルのアップロードはもちろん、MySQLやPostgreSQLも
DBの認証情報を入力するだけでデータソースとして扱える


# 使い方
データソースを決めてどうビジュアライズするかを設定するのが基本動作

[新しいデータソースを作成] でデータソースの選択画面に移動

![ds_1.png](https://qiita-image-store.s3.amazonaws.com/0/52794/c5fe5727-89ca-565f-6297-9e5982933c48.png)


データソースの選択画面で対象のデータソースを選択していく

![ds_2.png](https://qiita-image-store.s3.amazonaws.com/0/52794/1ea501ab-2f77-1e03-98b6-213f28e6187a.png)


今回はBigQueryとつなげたいので、以下な感じでポチポチ選択して

![ds_3.png](https://qiita-image-store.s3.amazonaws.com/0/52794/25e23ddd-6feb-6bd2-bc14-dd9fa11fe1b4.png)


[接続]ボタンをおすと、スキーマが表示されるので、
[レポートに追加]を押せばデータソースとして利用できる

![ds_4.png](https://qiita-image-store.s3.amazonaws.com/0/52794/4d00db4e-b41b-28f2-7f81-4e2622e24092.png)


ちなみに[接続]ボタンを押した時点で幾つかBigQueryの
クエリが発火されるのでご注意を

![ds_5.png](https://qiita-image-store.s3.amazonaws.com/0/52794/8674dc6a-54d6-c00d-57eb-6277c7ecfea4.png)


適当にグラフを選択して、ドラッグでグラフサイズを決めれば
簡単にグラフがでる。ついでに指標も変更してみた

![ds_6.png](https://qiita-image-store.s3.amazonaws.com/0/52794/e1308702-bfa1-1fbd-41ee-6fa2b49e8bf2.png)


こんなことをしている間にも裏では淡々とクエリが発行されている
割りと怖いとおもう

特にGAと連携しているデータ使おうと思うとデータ量が多くなるので
かなり怖い

![ds_7.png](https://qiita-image-store.s3.amazonaws.com/0/52794/a895e767-05fa-99ee-4dfa-39adf702aab8.png)

[期間]や[フィルタ]コンポーネントを追加すると、グラフの対象期間や
対象データをインタラクティブに変更できるので良い

![ds_8.png](https://qiita-image-store.s3.amazonaws.com/0/52794/e3c1e71e-454f-e97f-e8af-39f854249efb.png)



# 注意点
クロス集計表みたいなのはつくれないが、そのうち作れるかもしれない

BigQueryとDataStudioを使う上で怖いのがガンガンクエリが発行されるところ

なので、ある程度表示するデータが決まっていて、リアルタイムに取得する必要がないのであれば
GoogleAppsScriptをつかってBigQueryのクエリを一回発行してGoogleSpreadSheetに保存
そのSpreadSheetをDataStudioのデータソースとして利用してやればむやみに
クエリが発行されることがなくお金の心配をせず安心して利用できる

あと、加工も簡単なのでDataStudioを利用するときは一旦GoogleSpreadSheetをかませるのが
自分の中でのベストプラクティスになってる
kintoneプラグイン『機能拡張スタンダード All-In』を使って郵便番号による住所検索を行う

kintoneプラグイン[『機能拡張スタンダード All-In』](https://spica.tokyo/bluelaunch)の<strong>レコード詳細管理 - 住所検索</strong>を使用します。

![bl_ss_gen_menu04.png](https://qiita-image-store.s3.amazonaws.com/0/67365/791b5219-6f2d-7952-d00e-9c1df0b9f477.png)

#概要

レコード詳細編集画面にボタンを設置して、日本の郵便番号から住所を検索します。ボタンはアプリに配置された「スペース」か画面上部に設置することができます。

検索結果は、「都道府県」「市区町村」「町域」を個別または結合した文字列として、文字列フィールドに入力します。

結合する際には区切り文字として、「半角スペース」「カンマ＋半角スペース」「全角スペース」「区切り文字なし」が選択できます。

#設定1. スペースにボタンを設置する
![bl_ss_1.6.1_17082201b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/d8bd2ebe-dd67-0d00-235f-7e4a6068fc3e.png)
<font color="#4040ff">検索に使用する郵便番号</font>：文字列（1行）が選択可能
　<strong>「郵便番号」フィールド</strong>
<font color="#4040ff">ボタンを設置する場所</font>：スペースが選択可能
　<strong>「zipcode_button」スペース</strong>
<font color="#4040ff">取得する言語</font>：
　<strong>日本語</strong>
<font color="#4040ff">検索結果を結合した文字列</font>：文字列（1行）が選択可能
　<strong>「住所（連結）」フィールド</strong>
<font color="#4040ff">結合の区切り文字</font>：
　<strong>半角スペース</strong>
<font color="#4040ff">検索結果の「都道府県」</font>：文字列（1行）・ドロップダウン・ラジオボタンが選択可能
　<strong>「都道府県」フィールド</strong>
<font color="#4040ff">検索結果の「市区町村」</font>：文字列（1行）が選択可能
　<strong>「市区町村」フィールド</strong>
<font color="#4040ff">検索結果の「町域」</font>：文字列（1行）が選択可能
　<strong>「町域」フィールド</strong>

##設定1. 検索結果
![bl_ss_1.6.1_17082202b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/0eca7683-bab3-a42a-a9af-0a8ba37cf07e.png)
「郵便番号」フィールドの右隣に「zipcode_button」スペースが配置されています。
ボタンはここに設置されています。

郵便番号を入力し「住所検索」ボタンを押した結果、入力先として設定されているフィールドにそれぞれ検索結果が入力されます。

#設定2. 画面上部のメニュー部分にボタンを設置する
![bl_ss_1.6.1_17082203b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/febbb52b-a12b-5a7a-bff2-655ca86c9f28.png)
<font color="#4040ff">検索に使用する郵便番号</font>：　文字列（1行）が選択可能
　<strong>「郵便番号」フィールド</strong>
<font color="#4040ff">ボタンを設置する場所</font>：
　<strong>メニューエリア</strong>　※メニューエリアが初期値です
<font color="#4040ff">取得する言語</font>：
　<strong>英語</strong>
<font color="#4040ff">検索結果を結合した文字列</font>：　文字列（1行）が選択可能
　<strong>「住所（連結）」フィールド</strong>
<font color="#4040ff">結合の区切り文字</font>：
　<strong>カンマ＋半角スペース</strong>
<font color="#4040ff">検索結果の「都道府県」</font>：文字列（1行）・ドロップダウン・ラジオボタンが選択可能
　<strong>「都道府県」フィールド</strong>
<font color="#4040ff">検索結果の「市区町村」</font>：　文字列（1行）が選択可能
　<strong>「市区町村」フィールド</strong>
<font color="#4040ff">検索結果の「町域」</font>：　文字列（1行）が選択可能
　<strong>「町域」フィールド</strong>

##設定2. 検索結果
![bl_ss_1.6.1_17082204b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/c6666c5d-86b0-0292-92ab-1d2552467f7e.png)
レコード詳細画面の上部のエリアにボタンが設置されています。

郵便番号を入力し「住所検索」ボタンを押した結果、入力先として設定されているフィールドにそれぞれ検索結果が入力されます。

郵便番号のハイフンは省略可能。

言語に「英語」が選択されていますので、結果の連結順は英語表記に準ずる形式となります。

---
#このプラグインについて
・[自動計算・自動採番](http://qiita.com/spica/items/803af7cd540ae0b8f718)
・[条件書式](http://qiita.com/spica/items/24027003e9dfb9363819)
・[フィールド属性](http://qiita.com/spica/items/73107bda2cff4a94cf41)
・[選択数制御](http://qiita.com/spica/items/1c3ba3927b844b6bb72b)
・[レコード一括更新](http://qiita.com/spica/items/f0e84a1cf430670c4292)
・[自動計算によるレコード一括更新](kintoneプラグイン『機能拡張スタンダード All-In』を使って自動計算でのレコード一括更新を行う)
OpenFrameworksでのLightingについて

#OpenFrameworksでのLightingについてのメモを残していこうと思います。



##光の種類についての説明

 AmbientColorは環境光色

 DiffuseColorは拡散光色:物体自体は光を基本発していなく見た目は光が当たった場合、
 どのような色の光を拡散するかで決まります。

 SpecularColorは鏡面光色:

 EmissiveColorは放射光色:物体が自ら発光する色


##実装
```
setup(){
 material_1.setEmissiveColor(ofFloatColor::blue);
 material_1.setDiffuseColor(ofFloatColor::green);
 light.setPosition(0,100,0);
 light.setPointLight();
 light.setup();
}
```
<img width="513" alt="スクリーンショット 2017-08-23 11.52.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/ffeb8de3-e337-e4f4-b4ba-228dd7714f13.png">

光が当たっている部分は自己発光色と拡散光が合わさっていることが確認できます。
この色は足し算によって計算されるので自己発光色が白だと拡散光色を設定しても白のままです。

またSpecularColorを追加してみると
<img width="574" alt="スクリーンショット 2017-08-23 12.02.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/c3400791-28d6-4a37-002b-89d2e10a5486.png">

この鏡面光は視点に関係なく色が決定されるDiffuseColorに比べて視点の位置によって変化するものです。
またsetShininess(float)で輝き具合を決定してください。
CentOSでニフティクラウドNASのNFSマウント

## はじめに
複数Webサーバのコンテンツ一元配置やユーザからのファイルアップロード集約先にNASを利用するのですが、設定につまずきポイントがありましたのでメモしておきます。

## 前提条件
- インスタンス、NAS（NFSv4）の作成は完了していること
- 構成は　インスタンス（クライアント） - NAS（サーバ）構成
- OS：CentOS6.7, 7.1（共にニフティ提供版）


## 手順（全てクライアント側）
- NFSマウントに必要なライブラリをインストール

```:install
$ yum -y install nfs-utils nfs-utils-lib
```
- インストール後、ユーザ情報を確認

```:command
$ cat /etc/passwd

~
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
```
- ユーザ作成  
uid, gidをnfsnobodyに合わせてユーザを作成。  
おそらくこのnfsnobodyがNFSサーバ側とマッピングされているユーザと推測。 

```:command
$ useradd -o test -u 65534 -g 65534
$ cat /etc/passwd
~
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
test:x:65534:65534::/home/test:/bin/bash

$ id test
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
```
- マウントポイントを作成

```:command
$ mkdir /var/www/share
```
- マウント実行  

```:command
$ mount -t nfs4 10.102.169.164:/ /var/www/share
```
NASのIP（今回は10.102.169.164）とマウントポイントは適宜合わせる。以降も同様。

- マウント確認

```:command
$ df -h | grep share
10.102.169.164:/   99G   60M   99G   1% /var/www/share
```
- 再起動後にも自動マウント  

```:/etc/fstab
10.102.169.164:/ /var/www/share nfs defaults 0 0
```
- 試しにファイルとディレクトリを作成してみる

```:command
$ su test
$ cd /var/www/share
$ touch test.txt
$ mkdir hoge
$ ls -all
drwxr-xr-x 3 nfsnobody nfsnobody 4096  8月 22 14:55 2017 .
drwxr-xr-x 7 root      root      4096  8月 22 14:08 2017 ..
drwxrwxr-x 2 nfsnobody nfsnobody 4096  8月 22 14:55 2017 hoge
-rw-rw-r-- 1 nfsnobody nfsnobody    0  8月 22 14:42 2017 test.txt
```
作れた。

## おまけ
- apache + php(mod_php)でプログラム実行によりNASへの書込み等を行う場合、
apacheの実行ユーザ、グループをアクセスユーザ（今回でいうところのtest:nfsnobody）にする必要があります。
- 尚、実行ユーザを変更する場合は下記のディレクトリのグループを変更する必要があります。

```:command
$ find / -group apache
/var/www/html
/var/cache/mod_proxy
/var/lib/dav
/var/lib/php/session
/usr/sbin/suexec
/var/run/httpd
```

## 最後に
NFSv4の仕様上このような方法となり、少し気持ち悪いですがプロンプトの表示やlsコマンド等での表示がnfsnobodyとなってしまいます。
もう少しスマートな実装方がありましたらご教示頂けると幸いです。

## 参考
[Turbolinux 11 Serverユーザーガイド　第 16章NFS サーバー](http://www.turbolinux.co.jp/products/server/11s/user_guide/x6925.html)
[ニフティクラウド　NAS：NASへの接続（NFS）](http://cloud.nifty.com/guide/nas/connect_nfs.htm)
[apache起動ユーザ変更時にグループ設定を変更する](http://cimacoppi.exblog.jp/14748490/)
ICMPトンネルでSSHする

# 概要

- リージョン間をICMPでSSHする
- http://www.cs.uit.no/~daniels/PingTunnel/
- Amazon Linux

# 手順
## 共通手順（インストール）

ソースコードをダウンロード、解凍

```
# yum -y install libpcap-devel gcc
# make
```

## サーバ側

```
./ptunnel
```

## Proxy側

```
./ptunnel -p [server-ip] -lp 8000 -da [dest ip] -dp 22
```

dest ipはサーバ自身だったら127.0.0.1になる

## クライアント
Proxyに8000番でSSHすればサーバにつながる

# 参考

ICMP（PING）を使ってリモートサーバーにSSH（VPN）できるPing Tunnel http://netbuffalo.doorblog.jp/archives/4318550.html
firebase で auth/network-request-failed が返ってきてしまう

firebase で、 firebase.auth()... 系のAPIをつかうと、error になり、error.code が auth/network-request-failed になってしまうことがある。

html に type="submit" の input があるのが原因だった。

https://stackoverflow.com/questions/38860900/firebase-project-results-in-auth-network-request-failed-error-on-login

さすがに分からない.
RAD Studio/Delphi/C++Builder 機能インストーラを使用する際の注意点あれこれ

RAD Studio/Delphi/C++Builder の機能インストーラは便利だし、インストール時間は早いし便利なのですが、いくつか注意する点があります。( この記事の内容は主に 10.1 Berlin, 10.2 Tokyo での注意点です。)

機能インストーラの基本的な操作は docwiki 上のドキュメントを参照してください。
10.2 Tokyo のドキュメントは[「こちら」](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E6%A9%9F%E8%83%BD%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9)です。

で、この機能インストーラですが、インストールする機能（プラットフォームとか、サンプルやヘルプなど）を選択してインストールでます。

##プラットフォーム選択での注意点
- **Windows 32-bit は必ず選択**してください、たとえ Windows 64-bit のアプリケーションしか作成しなくても
RAD Studio/Delphi/C++Builder の IDE 自身は Windows 32-bit アプリケーションです。コンポーネントパッケージなどのテストを行なうには IDE 自身が実行できる Windows 32bit でビルドされたものが必要なのです

- 後からプラットフォームを追加する際、既にインストールしたものも含めてチェックをつけてください
**チェックを外す＝機能のアンインストール**を意味します

## 追加オプション選択での注意点
- 既に PC に InterBase XE7/2017 Developer Edition がインストールされている場合は、チェックは外す（インストールしない）
InterBase はマルチインスタンス機能というのがありまして、１つの PC 内に複数の InterBase XE7/2017 を別々のインスタンスとしてインストールすることができますが、１つのインスタンスごとに個別のライセンスが必要です
別途個別の InterBase XE7/2017 Server 等のライセンスを持っている場合は別ですが、１つの PC 内に複数の InterBase XE7/2017 をインストールすると、ライセンス関連で InterBase が起動しなくなったりのトラブルが発生する恐れがあります

- FastReport VCL をインストールするときは TeeChart Standard も選択すること
[サポート記事](http://support.embarcadero.com/article/44721) にも記述がありますが、FastReport VCL内で TeeChart のパッケージを参照していますので、FastReport VCLと TeeChart Standard はペアとしてインストールします

- 後からオプションを追加する際、既にインストールしたものも含めてチェックをつけてください
**チェックを外す＝機能のアンインストール**を意味します

###オマケの注意書き
あ、オフラインインストーラ (ISO)と、機能インストーラは同居できないので、以前 ISO でインストールして、機能インストーラに切り替える、又はその逆の場合は、一度手動アンインストールの記事の手順でアンインストールが必要です
[10.2 Tokyo 手動アンインストール](http://support.embarcadero.com/article/44752)
[10.1 Berlin 手動アンインストール](http://support.embarcadero.com/article/44691)
pythonでopencvを使えるようにするまで

開発環境
OS: windows 10 64bit
Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz

pythonを画像処理目的で使う人向けの環境導入

やりたいこと
anaconda(python2.x)を導入
pythonでopencv2系を使えるようにする

ここ参考
https://www.slideshare.net/HirokatsuKataoka/python-45645838

#Anaconda(python)導入
[Anacondaの公式サイト](https://www.continuum.io/downloads)からpython 2.7 version 64-Bitをダウンロード
(最新バージョンを使いたくなければ[ここ](https://repo.continuum.io/archive/)からダウンロード)

インストーラは対話型なので適当にインストール

#opencv導入
opencvをダウンロードして解凍するまでは[ここ](http://qiita.com/chat-flip/items/6bad4b861461fc30cfa1)と同じ(環境変数は変更不必要)

#pythonにopencv導入
ここにあるファイルを```
C:\opencv\build\python\2.7\x64\cv2.pyd
C:\opencv\sources\modules\python\src2\cv.py
```このフォルダにコピー`C:\Anaconda2\Lib\site-packages`
これで終了

#導入確認
コマンドライン起動(Windowsキー+rでcmd)
コマンドライン上で
`python`
`import cv2`
を入力して何もエラーがなかったら導入終了
【擬似要素をjsで動的に】幅100％のサブメニューを設置しホバーで吹き出しつける


擬似要素（:beforeとか:afterとか）のjsからの操作が地味に調べたのと応用できそうだったのでメモ

*【ゆるゆる募】もっと簡単な方法あったのに的なつっこみ*

# やりたいこと
* グローバルメニュー設置
* サブメニューはブラウザ幅100%
* グローバルメニュー内の項目をマウスオーバーしたら該当の項目に向けて吹き出しを出す
* PCのみの表示だけ作ればおk

### 要するにこういうこと

![サンプル.jpg](https://qiita-image-store.s3.amazonaws.com/0/166550/9ea82794-edc5-15fc-8b20-469bac0c6250.jpeg)

[サンプルコード](https://codepen.io/ta-ke-no-bu/pen/NvXdBM?editors=1111)

### 課題
* 擬似要素は非DOMなのでjsから操作するのにstyleを追加しないといけない。

![非DOMイメージ](http://www.08ms-team.net/image/n_ms_03.jpg)
*私の考える非DOMのイメージ*

* 動的に位置を取得しないといけないのでcssのclass追加でごまかせない
* なるべくコードを短くしたい　←　これ

### 実装
#### 擬似要素の操作

下記を参考に
[Change :hover CSS properties with JavaScript](https://stackoverflow.com/questions/11371550/change-hover-css-properties-with-javascript)

マウスがグロナビ内のメニューに来たときにブラウザサイズから位置をとって、headにstyle要素をTextNodeで追加
マウスが離れた時にスタイル自体を削除

```js
var nav, style;
nav = $('#global-nav ul li.outline a.menu');
style = document.createElement('style');

nav.on('mouseenter', function(e){// マウス乗っかった時
  var target, clientRect, leftpx, css;
  target = e.target;

  clientRect = target.getBoundingClientRect() ;

  // 座標とる。なんとなく真ん中あたりにくるように調整
  leftpx = window.pageXOffset + clientRect.left + 70;

  css = '#global-nav ul li.outline ul:after{ left: ' + leftpx +'px; }';

  style.appendChild(document.createTextNode(css));

  document.getElementsByTagName('head')[0].appendChild(style);


}).on('mouseleave', function(){// マウス離れた時

  document.getElementsByTagName('head')[0].removeChild(style);
});
```

### あれ？マウスエンターの範囲が狭いので位置取得失敗するよ
これだと、サブメニュー内のメニューに移動する時に
![サンプル2.jpg](https://qiita-image-store.s3.amazonaws.com/0/166550/c4df0c24-9209-8be0-66dc-04cb65354129.jpeg)

こういう悲しいことになったので、サブメニューからマウスが離れたらstyleを削除するように変更

```js
var submenu, nav, style;
submenu = $('#global-nav ul li.outline ul');
style = document.createElement('style');

nav.on('mouseenter', function(e){// マウス乗っかった時
  var target, clientRect, leftpx, css;
  target = e.target;

  clientRect = target.getBoundingClientRect() ;

  // 座標とる。なんとなく真ん中あたりにくるように調整
  leftpx = window.pageXOffset + clientRect.left + 70;

  css = '#global-nav ul li.outline ul:after{ left: ' + leftpx +'px; }';

  style.appendChild(document.createTextNode(css));

  document.getElementsByTagName('head')[0].appendChild(style);

});
 submenu.on('mouseleave', function(){
  document.getElementsByTagName('head')[0].removeChild(style);
});
```
Gitのブランチ名をエディタで簡単に編集できるコマンド

みなさんは、`git checkout -b` でブランチを作ってから「アッ！スペルミスしてる！」と気づいた経験はありませんか？私はよくあります。

そんな時に、

```
$ git branch feature/162514-shitdown-chrome-api feature/162514-shutdown-chrome-api
```

のようにターミナル上で長いブランチ名を全て入力し直すのは面倒です。

ターミナルではなくお気に入りのエディタで、間違えた部分だけ直せれば、便利でしょう。

# エディタでブランチ名を編集できるコマンド

```
$ git be
```
を実行すると、エディタが起動しブランチ名を編集できます。保存してエディタを終了すると、ブランチ名が書き換わります。

使うエディタは、環境変数`$EDITOR`で指定してください（私は[Micro](https://micro-editor.github.io/)を使っています）。

以下のソースを、`~/bin/git-be` などに保存してください。もちろん `git be` というコマンド名を変えたい場合は、別の名前でも問題ありません。

```bash
#!/bin/bash
branch_name=$(git rev-parse --abbrev-ref HEAD)
if [ "$branch_name" = 'HEAD' ]; then
  echo 'A non-branch revision is currently checked out.' >&2
  exit 1
fi

t="$(mktemp "temp.git-be.XXXXXX")"
trap 'rm -f "$t"' 0 1 2 3 15

echo "$branch_name" >> "$t"
e="${EDITOR:-vi}"
"$e" "$t"
exit_status=$?
if [ $exit_status -ne 0 ]; then
  echo "Editor $e exited with code $exit_status"
  exit 1
fi

new_branch_name="$(cat "$t")"
git branch -m "$new_branch_name" || exit 1
```
Quartus Prime Liteでプロジェクトにsdcファイルを追加する方法

QuartusPrimeでプロジェクトを開き、一旦そのままでコンパイルを実行する
「Tools -> TimeQuestTimingAnalyzer」を選び、TimeQuestTimingAnalyzerを起動する

TimeQuestTimingAnalyzerのウィンドウで、「Netlist -> CreateTimingNetlist」を選ぶ
チェックはデフォルトのまま「OK」
次に「File -> New SDC File」を選びSDCファイルを作成

SDCファイルのウィンドウで、「Edit -> InsertConstraint -> CreateClock」を選ぶ
Clock nameとPeriodを入力
Targetsの右の[...]ボタンをクリックし、「get_ports -> List」をクリックし、リストからターゲットのクロックを選択する
「OK -> Insert」
とするとSDCファイルが完成する

```
create_clock -name CLK50 -period 20 [get_ports {CLK}]
```
「File -> SaveAs」で適当なディレクトリへ保存する
この名前を付けて保存画面にAdd file to current projectのチェックがあるので、チェックを入れて保存する

これでCritical Warning (332148): Timing requirements not metが消える

これでCritical Warning (332012): Synopsys Design Constraints File file not foundが消える
爆速でRaspbianをDLしたいときにやったこと

# 概要
Raspbianの環境作るのにそもそもOS落とすのめちゃくちゃ時間かかるのが困るので対処したかった

# 注意
NW帯域を一時的に激しく専有するので、できるだけ共有NWでは使わないでください

# 用意するもの
Mac/Linuxマシン + aria2
RaspbianのDLリンク([ここから](https://www.raspberrypi.org/downloads/raspbian/)torrentリンクをとってくると一番よい)

# Aria2を入れる
## Macの場合

```
brew install aria2
```

##Linuxの場合

### Debian系

```
sudo apt-get install aria2
```

### RHEL/CentOS

```
sudo yum install epel-release
sudo yum install aria2
```


Torrentが使える環境

```
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest.torrent
```

Torrentが使えない環境

```
aria2c -x5 $(curl -I -Ls -o /dev/null -w %{url_effective} https://downloads.raspberrypi.org/raspbian_lite_latest)
```
C++をそれなりに読めるようになるためのHelloWorld集　②ラムダ式続き、拡張for

#C++のキャプチャありラムダ式でHelloWorld
[昨日](http://qiita.com/kmry2045/items/f508c8323e57414be728)に続いて、C++14のラムダ式を。今回は、外部変数のキャプチャを試してみる。ついでに拡張forなども。


[コード]

```hello_lambda2.cpp
#include <iostream>
#include <vector>　

using namespace std;
int main() 
{  
    const vector<string> hellos  {"Hello", "World", ".\n"}; //①

    //for C++1z
    auto echo2 = [hellos] (string suppl) { //②
        for (string word : hellos) {//③
    	    string prt = (word.size() >4) ? word : (suppl + word); //④
    	    cout << prt;
        }
    };

    echo2 (" /w lambda [outer variable(s)]"); //⑤
    return 0;
}

```
>読み解き:
①const vectorにより定数文字列のリストを変数hellosとして定義。
　　const vector<string> hellos = {"Hello", "World", ".\n"};
　と、統合を入れても良い。
③ 外部変数hellosと引数supplを取るラムダ式をecho2として定義。
③ 　いわゆる拡張for(他言語のforeach)。
④　Cの三項演算子を使ってみた。
⑤　ラムダ式の呼び出し。


前回と比べると、main関数の中にラムダ式echo2が入っていることに気づくだろう。いわゆる関数内関数的にラムダ式は使える。また、以下のように、hellos,echo2を外に出してみるとエラーとなる。これは、vettor等、コレクションのメモリ管理との関係なのだろう。

```cpp
#include <iostream>
#include <vector>　

using namespace std;
//vectorのメモリが確保できないとエラーが出る。
    const vector<string> hellos  {"Hello", "World", ".\n"}; //①

    //for C++1z
    auto echo2 = [hellos] (string suppl) { //②
        for (string word : hellos) {
    	    string prt = (word.size() >4) ? word : (suppl + word); //③
    	    cout << prt;
        }
    };

int main() 
{  

    echo2 (" /w lambda [outer variable(s)]"); //④
    return 0;
}

```

[処理結果]

```
 $ make
./a.out
HelloWorld /w lambda [outer variable(s)].

```
[参考リンク]

-　[C++14 のラムダ式 完全解説 中編](http://d.hatena.ne.jp/gintenlabo/20130526/1369565989) 


#（付記）Cのブロック式によるキャプチャ式は動作せず。
ちなみにclangのCで使えるブロック式(アップル社独自拡張Blocks)でも、C++のラムダ式と同様に変数のキャプチャが行える。
ただ、こちらはC++上で動かなかった。NSからはじまる外部ライブラリがもってこれない(undefined reference to `_NSConcreteStackBlock')というエラーらしいので、Ubuntu上のclangには、アップル社独自拡張のライブラリがディフォルトでは入らないということかもしれない。C++のラムダ式の方が便利で可読性が高いと思うので、clangのコンパイルオプションを眺めた程度で、深追いはせず。
- [参考 Blocksがややこいのでまとめてみる](
http://qiita.com/edo_m18/items/a1ee24cd23d3adde51d8)
- [clangのコンパイルオプション](http://kaworu.jpn.org/cpp/clang++)
pythonで空の多次元配列

空の多次元配列を作成するときにハマったことのメモ
#空の２次元配列の作成
スクリプトの中で、空の2次元配列を作りたいなぁと思い、以下のようなコードで作成してみた。

```py
hoge = [[]] * 5
```
そしたら、なぜか思うような結果が返ってこない。例えば、、

```py
>>> hoge = [[]] * 5
>>> for i in range(5):
        hoge[i].append(i)
```
みたいにして、hogeの中身を確認すると

```py
>>> print hoge
[[0],[1],[2],[3],[4]]
```
となるかと思いきや、

```py
>>> print hoge
[[0,1,2,3,4],[1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4]]
```
こうなってしまった。つまるところ * で複製されるオブジェクトは = による代入でつくられるオブジェクト同様、元オブジェクトの参照でしかないっぽい。
結局、空の２次元配列をつくるには、

```py
[[] for i in range(5)]
```

とやるのがベストかなぁ。
CentOS 7.3 でLAMP環境 + git + Node.js を自動構築する Vagrantfile 作った

# はじめに
LAMP環境 + git + Node.js（gulp） を自動インストールする Vagrantfile を作成しました。
Webサイト制作など比較的小規模な開発環境としての利用を想定しています。
[junsan50/Vagrant-LAMP-CentOS7.3](https://github.com/junsan50/Vagrant-LAMP-CentOS7.3)

# 検証環境
- Vagrant 1.9.7
- VirtualBox 5.1.26

# 概要
- Apache License 2.0
- box は [bento/centos-7.3](https://app.vagrantup.com/bento/boxes/centos-7.3) を使用
- Apache（2.4.6）
- PHP（7.1.8）
- MariaDB は [公式](https://mariadb.com/kb/ja/yum/) のインストール方法と同様（10.1.26）
- git は [CVE-2017-1000117](https://oss.sios.com/security/git-security-vulnerabiltiy-20170813) 修正済みバージョン（2.14.1）
- Node.js は `n stable` でインストール（v8.4.0）

###### ※ バージョン情報は2017年8月23日現在

# 使い方
```bash:get_started
git clone https://github.com/junsan50/Vagrant-LAMP-CentOS7.3.git
cd Vagrant-LAMP-CentOS7.3
vagrant up
```

# setup.sh について
### Apache ドキュメントルート変更
デフォルトで ```/vagrant/html``` となります。
変更したい場合はsed置換している部分を任意のパスに修正してください。

```bash:setup.sh
### Apache ###
sudo yum -y install httpd

# ここを修正してください
sudo sed -i -e "/\/var\/www\/html/s/\/var\/www\/html/\/vagrant\/html/g" /etc/httpd/conf/httpd.conf
```

### mod_ssl をインストールする場合
```bash:setup.sh
### SSL Module (If necessary) ###
sudo yum -y install mod_ssl # コメントを解除
```

### mod_security をインストールする場合
```bash:setup.sh
### WAF Module (If necessary) ###
# sudo yum -y install mod_security # コメントを解除
```

### 別バージョンの PHP をインストールする場合
PHPインストールを行なっている部分を修正してください。
パッケージを変更する場合も同様になります。

```bash:setup.sh
### PHP7.1 ###
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

sudo yum -y install --enablerepo=remi,remi-php71 php php-devel php-common php-cli php-pear php-pdo php-mysqlnd php-opcache php-gd php-mbstring php-mcrypt php-xml php-fpm
```

### Node.js について
CentOS7.3の場合、普通に ```yum -y install nodejs``` すると ```http-parser``` の依存関係でコケるようです…
```http-parser``` を ```rpm```でインストールして依存関係を解決しています。

# その他
```mysql_secure_installation``` は ```vagrant up``` 完了後に手動でお願いします。

# [追記] 2017.10.28
### Xdebugの追加
PhpStormでのデバッグ用としてXdebugのインストールスクリプトを追加しました。
※ idekeyを`phpstorm`にしてるだけなので、SublimeText3とかでも使えるはず

PhpStorm側の設定については以下を参考にしてください。
[PhpStorm で Vagrant 環境のリモートデバッグを実行する](https://luftgarden.work/phpstorm-xdebug-vagrant/)
collectionで追加したパスの後ろにidを追加する

# やりたいこと
projectsに複数のcategoryをぶら下げ、category_idごとにビューを出すために
`projects/categories/:id`
↑こういうパスを作りたい。

# 実装方法
## 前準備
- routes.rbにprojectsのリソースを追加。
- projectsリソースにcollection do ~ endをネストさせる。

```routes.rb
resources :projects do
 collection do
  //HTTPメソッド名　'生成したいパス'
 end
end
```

##生成したいパスを指定する

上記の「生成したいパス」に以下を記述する。
`get 'categories/:id', to: 'projects#category'`

## 説明
- resourcesで生成される７つのルーティング以外のものを生成したいときに`collection`を使用。（似たようなものに`member`がありますがここでは省略します）
- `collection`内に`HTTPメソッド名 'パス名/:id' to: 'コントローラ名#アクション名'`を記述。

## 結果

ターミナル

```
Prefix Verb   URI Pattern                                         Controller#Action
                            //省略//
       GET    /projects/categories/:id(.:format)                  projects#category
```

できました。
prefix生成されないのはなんでだろう・・・？
CentOS7にyumでMariaDB最新版インストール

公式HP見てたらワンライナーがあったのでメモ
 #2018/6/3 少しコマンドが変わっていたので更新

ワンライナーには環境依存はないけれど一応
Host OS : CentOS7.3
Target  : Mariadb-10.2



#リポジトリインストール
```$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash```
これだけ

バージョン指定したい場合は
```$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=mariadb-10.0 ```

その他のオプションは下記URLに
https://mariadb.com/kb/en/the-mariadb-library/mariadb-package-repository-setup-and-usage/

#MariaDBインストール
インストール

```$ sudo yum install MariaDB-server MariaDB-client ```

サービス開始

```$ sudo systemctl start mariadb```

起動時にサービス開始

```$ sudo systemctl enable mariadb```

接続確認

```
$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.                                            
Your MariaDB connection id is 8                    
Server version: 10.2.8-MariaDB MariaDB Server      

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.                                   

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.                         

MariaDB [(none)]> 
```
となれば完了

```$ mysql_secure_installation```
で初期設定



#備考
ワンライナーは下記OSに対応
- Red Hat Enterprise Linux (RHEL)/CentOS 6 and 7
- Debian 7 (wheezy) and 8 (jessie)
- Ubuntu 14.04 LTS (trusty) and 16.04 LTS (xenial)
- SUSE Linux Enterprise Server (SLES) 12
Git alias周りの設定

チラ裏程度ですが、gitのalias周りで普段している設定を晒してみます。
そもそも、zshのエイリアスで `g='git'` にしているので、 `g a` とか、 `g b` とか2文字で動けるようにしてます。
あと、zshのブランチ一括削除コマンドも、結構な頻度で登場し、重宝してます。

## zshrc
```.sh
alias g='git'

# マージ済みブランチの一括削除
alias gdab='git branch --merged | egrep -v "develop|master" | xargs git branch -d'
```

## gitconfig

```.sh
# [user]とか[color]とか[core]とか

[alias]
  a = add
  b = branch
  s = status
  d = diff
  p = push
  ba = branch -a
  co = checkout
  cod = checkout develop

  # commit
  cm = commit
  cma = commit -a
  cmam = commit -am

  # log
  l = log --graph --decorate --all --oneline
  logg = log --graph --all --decorate

  # diff
  difff = diff --name-only
  diffs = diff --cached
```

以上！