OmniAICreator/Qiita-1.07M huggingface dataset:
ふつうに Selenium でスクリーンショットを撮りたい

ただ、別マシンから Windows 上のfirefox でスクショとりたいだけなのに、Selenium がややこしすぎたのでMEMO。

#用意する環境

ブラウザ操作される側
Windows7,10
standalone.jar
gecko.exe

指示側
Centos
ruby
selenium-webdriver

#起動の仕方

standaloneでwebdriverを指定するとドライバー経由で起動してくれる。
ドライバー単体でも起動できるが、個別にドライバーを起動する必要はない。むしろ起動してしまうとポートがぶつかってややこしい。

```
java -Dwebdriver.gecko.driver="C:\geckodriver.exe" -jar selenium.jar
```

ruby
```
driver = Selenium::WebDriver.for :remote , url: "http://192.168.1.11:4444/wd/hub", desired_capabilities: :firefox
driver.navigate.to "https://google.com"
driver.save_screenshot('path/to/filename.png')
```

スクリーンショット取れたぞー。


#混乱させられた所

名前で混乱
サーバー側で起動するときは、geckoとなっているが、rubyではfirefoxとなっている。
レンダリングエンジン名とブラウザ名がばらばらでわかりずらい。

Webドライバーで混乱
W3Cwebdriver と selenium webdriver　二つがあってどうやら、W3CがW3CwebdriverというAPIを提供しているようだ。Selenium3.0? からは W3Cwebdriver に向かおうとしてるみたい。
ブラウザが統一のAPIを提供しだしたということは、Selenium Driverはお役ごめんとなりそう。

用語多すぎて記事が少なすぎて混乱
Selenium2.0?3.0? SeleniumSelenium RC? Selenium Grid? Selenium-standalone? Selenium-server? Selenium-webdriver? Marionette? chromedriver?
Seleniumの中で大きな変化が起こっているようで、新しい記事が間に合っていない。
こんなに混乱させられるなら、Seleniumって名前は捨てて新しいソフト名で作ったほうがいいように思いました。
私だけ？
ansible-vaultで暗号化したファイルの差分をgit diffで確認する

# はじめに

ansible-vault で暗号化したファイルの差分を `git diff` で見れるようにする方法を説明します。

# 手順
## パスワードなしで vault ファイルを閲覧できるようにする
　
プロジェクトのホームディレクトリに `./ansible.cfg` を作成する

```ini:ansible.cfg
# ansible-vaultのパスワードを格納したファイルのパスを指定
[defaults]
vault_password_file = ./.vault_password
```

パスワードを格納するファイルを作成（ここでは `.vault_password` とする）

```:.vault_password
hogehoge123
```

パスワードファイルは誤ってリポジトリにコミットしないように、 `.gitignore` に追加しておく。

```:.gitignore
.vault_password
```

## vaultファイルのテキストコンバータを ansible-vault に設定する

- `.git/config` または `~/.gitconfig` に以下の記述を追加。

```ini:.git/config
[diff "ansible-vault"]
  textconv = ansible-vault view
  cachetextconv = true
```

- vaultファイルのパスを指定

`.gitattributes` または `~/.gitattributes` にvaultファイルのパスを指定

```ini:.gitattributes
# *-vault.yml *.vault.yml などワイルドカードでも指定できる
sample.vault.yml diff=ansible-vault merge=binary
```

## ファイルの差分を確認

これで、 `git diff` で vault ファイルの差分を確認できるようになります。

```bash
$ git diff
diff --git i/sample.vault.yml w/sample.vault.yml
index 0a181e0..658372b 100644
--- i/sample.vault.yml
+++ w/sample.vault.yml
@@ -1,2 +1,2 @@
 ---
-hoge = hoge
+hoge = hogehoge
```

# 終わりに

ansible-vaultで暗号化されたファイルの差分が可視化されるようになり、うっかりミスに気づきやすくなりました。

# 参考

* ansible.cfg の仕様
  - 
 http://docs.ansible.com/ansible/latest/intro_configuration.html
* .gitattributes, .gitconfig の仕様
  -  https://git-scm.com/docs/gitattributes
yum groupinstall "Development tools" で入るパッケージ一覧（CentOS）

（2018/02/17 時点）

中身がわからなくてすこし困ったので。
`# yum groupinstall "Development tools"` をそのまま実行してみて、インストールされたパッケージのメモ。

## 環境
CentOS7
（vagrant の centos/7）

## 一覧
途中のスペースより上（ `systemtap` まで）がメインのパッケージ。  
下（ `apr` から）がメインのパッケージの依存関係を解決するために入るパッケージ。


```
autoconf
automake
bison
byacc
cscope
ctags
diffstat
doxygen
elfutil
flex
gcc-c++
gcc-gfortran
git
indent
intltool
libtool
patch
patchutils
rcs
redhat-rpm-config
rpm-build
rpm-sign
subversion
swig
systemtap

apr
apr-util
avahi-libs
boost-date-time
boost-system
boost-thread
dwz
dyninst
efivar-libs
emacs-filesystem
gdb
gettext-common-devel
gettext-devel
gnutls
libdwarf
libgfortran
libgnome-keyring
libmodman
libproxy
libquadmath
libquadmath-devel
libstdc++-devel
m4
mokutil
neon
nettle
pakchois
perl-Data-Dumper
perl-Error
perl-Git
perl-TermReadKey
perl-Test-Harness
perl-Thread-Queue
perl-XML-Parser
perl-srpm-macros
subversion-libs
systemtap-client
systemtap-devel
systemtap-runtime
trousers
unzip
zip
```

vimは手で入れないといけないのね（）
Mac の sed で改行コードを変換

Mac は BSD sed なので、情報が少ないんですよね。

### Windows(CRLF) → UNIX(LF) へ置換する

```shell
sed -i.bak 's/'$'\r//' filename
```

拡張子を指定して、まとめて置換したい場合はこちら

```shell
export LANG=C # Mac の BSD sed を使う場合のおまじない

find . -name '*.html' -or -name '*.css' -or -name '*.js' -print0 | xargs -0 sed -i.bak 's/'$'\r//'
```

### GNU sed を使う

Linux と挙動が違ってて面倒！っていう人は、 GNU sed を入れてください

```shell
brew install gnu-sed
```

でも、さくらのレンタルサーバーなんかは FreeBSD なので、 BSD sed も覚えておいて損は無いと思いますよ
Formikを試してみた

Reactでフォームを作るときにどうするのがいいのか調べてたら[Formik](https://github.com/jaredpalmer/formik)がいいらしいので試してみる。

`withFormik()`で作る方法と`Formik`コンポーネントを直接使う方法がある。どちらも結果は同じなので好きな方を使えば良い、らしい。
`withFormik()`はHigher-Order Componentsというやつで取っつきにくいが記述が楽っぽいのでこちらでやる。

## 基本

最小のサンプル。
送信ボタンを押すと入力内容がコンソールに表示される。

```jsx
import React from 'react'
import { withFormik } from 'formik'

const InnerForm = ({
  handleChange,
  handleSubmit
}) => (
  <form onSubmit={handleSubmit}>
    <input type="email" name="email" onChange={handleChange} />
    <input type="submit" />
  </form>
)

const SampleForm = withFormik({
  handleSubmit: (values) => {
    console.log(values)
  }
})(InnerForm)

export default SampleForm
```

React DevToolsで見るとわかるが`InnerForm`コンポーネントが`Formik`にラップされる形になっている。

`InnerForm`の`handleChange`と`handleSubmit`のふたつのプロパティは必ずないといけない。
`handleSubmit`がないと送信ボタンを押した時に普通にページ遷移してしまう。
`handleChange`がないと`values`に入力値が入らない。

## `Field`コンポーネント

`<input>`をそのまま使うと`onChange`を入力項目ごとに都度書かないといけなかったりで面倒。
そのあたりを面倒みてくれるのが`Field`コンポーネント。

こんなふうに書ける。

```jsx
import React from 'react'
import { withFormik, Field } from 'formik'

const InnerForm = ({
  handleSubmit
}) => (
  <form onSubmit={handleSubmit}>
    <Field type="email" name="email" />
    <input type="submit" />
  </form>
)

const SampleForm = withFormik({
  handleSubmit: (values) => {
    console.log(values)
  }
})(InnerForm)

export default SampleForm
```

`InnerForm`の`handleChange`プロパティが不要になった。

ただこれだとWarningが出る。

```
Warning: A component is changing an uncontrolled input of type email to be controlled.
```

ここ、よく分かっていないが、`mapPropsToValues`を設定しておくといいらしい。
[uncontrolled to controlled switch warning · Issue #28 · jaredpalmer/formik](https://github.com/jaredpalmer/formik/issues/28)

```jsx
const SampleForm = withFormik({
  mapPropsToValues: props => ({
    email: ''
  }),
  handleSubmit: (values) => {
    console.log(values)
  }
})(InnerForm)
```

## `Form`コンポーネント

`<form>`に`onSubmit`を書くのも定型的なので楽したい。
そういう時は`Form`コンポーネントを使う。

```jsx
import React from 'react'
import { withFormik, Form, Field } from 'formik'

const InnerForm = () => (
  <Form>
    <Field type="email" name="email" />
    <input type="submit" />
  </Form>
)

const SampleForm = withFormik({
  mapPropsToValues: props => ({
    email: ''
  }),
  handleSubmit: (values) => {
    console.log(values)
  }
})(InnerForm)

export default SampleForm
```

`InnerForm `の`handleSubmit`プロパティが不要になった。
プロパティが何もなくなってとてもすっきり。

# バリデーション

バリデーションについては今回試していないが、ドキュメントを読むかぎり他のパッケージと連携するようになっていて、Formik自身はあくまでフォームの実装に専念する形になっており、筋のよさを感じる。

# まとめ

Formikのdescriptionに"without the tears"とあるがまさにそんな感じで、楽にフォームを実装できそうだった。
Atomツリービューのフォント/サイズを変更

atomのツリービューにおけるデフォルトの文字サイズが小さすぎて見にくかったので変更した
Macではメニューバーの[Atom]→[スタイルシート]を開き、以下を追加する

### ツリーのフォント変更

    .tree-view {
      font-family: "Ricty Diminished"; 
      font-size: 17px;
    }

### タブのフォント変更

    atom-workspace {
      font-family: "Ricty Diminished"; 
      font-size: 17px;
    }
    
Macbookだと、font-sizeは17pxくらいが見やすい気がする


参考
[Atom ツリーのフォントサイズを変更する](https://ameblo.jp/konica/entry-12098807495.html)
DataFrame で groupby の際、any() を簡単に 100 倍近く高速化する方法

概要
====

`groupby` の `any()` はなぜか遅い。
しかし、次のようにすることで高速化が可能。

方法
====

```py:計測につかった集計元データ
import pandas as pd
df = pd.DataFrame({
    "A": np.arange(100000) // 10,  # 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, ... という具合に 10 個ずつ 1 万種類の数値を持たせる
    "B": list(map(lambda x: x == 0, np.random.randint(0, 20, size=100000)))  # 5%の確率でTrueにする
})
```

```py:従来の方法（遅い）
grp = df.groupby('A')[['B']].any()  # B 列でいずれかが True なら True にする
# 830 ms くらいかかる
```



```py:新しい方法（速い）
# any2 という早い関数を groupby クラスに追加する
def any2(self):
    sums = self.sum()  # True の合計数を算出
    return sums > 0  # 1以上なら True 
pd.core.groupby.DataFrameGroupBy.any2 = any2

grp = df.groupby('A')[['B']].any2()
# 8～9 ms で終わる
```

このように `sum()` を介することで速くなる。
なぜか `any()` や `all()` のような bool 系の集計メソッドは遅いので、数値計算系の集計で実現する方が速くなる。


ちなみに `all()` も高速化するなら下記:

```py:allの高速化
def all2(self):
    sums = self.sum()  # True の合計数を算出
    counts = self.count()
    return sums == counts  # すべて一致なら True
pd.core.groupby.DataFrameGroupBy.all2 = all2

grp = df.groupby('A')[['B']].all2()
# 11 ms くらいで終わる
```
Alexa skill Team への問い合わせ内容


##Alexa Skill Teamへの質問内容
Alexa Skill Kitの仕様について、よく分からないことばかり。 
そんな皆様のココロのスキマをお埋めできたらいいかなあと。 
さて、そんなフォームから問い合わせた内容は・・・？

###■ユーザー応答、魔の8秒間について
```markdown
【質問】
Alexaが「response」内容発話後、8秒間応答がない場合「reprompt」内容をAlexaが発話し
ユーザー発話を促し、それでも8秒間応答がない場合スキルが終了するが、この8秒間のコントロール、
又は、終了インテント発話まで待つことはできるか？

【回答】
現在、「reprompt」の8秒の待ち時間またはセッションの待ち時間は固定となっております。
ご不便をおかけいたしますが、何卒よろしくおねがいいたします。
```

「reprompt」後8秒たったら勝手に終わる仕様ってつかえなさすぎ（怒


###■リリース後のバージョンアップ時の対応について
```markdown
【質問】
１．スキルリリース後、ステータス「Development」側のエンドポイント側（AWS Lambda）
の更新でバグがあった場合、現在リリースされているスキルに影響があるのでしょうか？

【回答】
LiveとDevelopmentの両バージョンで同じエンドポイントを使われている場合、
Developmentのエンドポイントに変更が行われますとLiveにも変更は反映されます。
AWS Lambda 関数のバージョニングとエイリアス機能をご利用いただきますと
効率的に運用することが可能ですので一度ご検討いただければと存じます。

【質問】
２．上記の様に「Development」側のエンドポイント側（AWS Lambda）の更新を行った際、
スキルの再申請は必要なのでしょうか？

【回答】
AWS Lambdaのみに更新があった場合はスキルの再申請は必要ありません。
しかし、Lambda関数変更後のスキルが弊社の定める規約に反すると認められた場合には
認定が取り消しになる場合もございますので、再申請されることを強くお勧めいたします。
```

AWS Lambdaにバージョニング機能がある事を今知った。使い方がよくわかんない。

###■「アレクサＸＸＸを開いて」以外にスキルを起動できるのか？
```markdown
【質問】
Alexaの起動フレーズはカスタマイズ可能か？

【回答】
現在、起動フレーズのカスタマイズは非対応となっております。
日本語スキルの起動フレーズはドキュメントの通りとなっております。
```

これもなんか汎用性がなさ過ぎて使いづらい。

###■Amazon.Numberスロット値が取れない
```markdown
【質問】
以下、Amazon.Numberのスロット値が取得できないのですが
何かサンプル発話の登録方法があるのでしょうか？

■例
スロットタイプ「slot_PizzaName」に値「マルゲリータ」を登録
「slot_OrderCount」はAmazon.Numberで登録。

以下サンプル発話を登録

intent_PizzaName {slot_PizzaName}
intent_PizzaName {slot_PizzaName} {slot_OrderCount}
intent_PizzaName {slot_PizzaName} {slot_OrderCount} 枚
intent_PizzaName {slot_PizzaName} {slot_OrderCount} 個
intent_PizzaName {slot_PizzaName} を {slot_OrderCount} 注文
intent_PizzaName {slot_PizzaName} を {slot_OrderCount} 注文して
intent_PizzaName {slot_PizzaName} を {slot_OrderCount} 枚
intent_PizzaName {slot_PizzaName} を {slot_OrderCount} 枚注文
intent_PizzaName {slot_PizzaName} を {slot_OrderCount} 枚注文して
intent_PizzaName {slot_PizzaName} を {slot_OrderCount} 個注文
intent_PizzaName {slot_PizzaName} を {slot_OrderCount} 個注文して

テスト画面で行った際

１.「マルゲリータを1枚」でテスト
→「slot_PizzaName」「slot_OrderCount」共に正常にvalueを検知する。

        "slot_PizzaName": {
          "name": "slot_PizzaName",
          "value": "マルゲリータ"
        },
        "slot_OrderCount": {
          "name": "slot_OrderCount",
          "value": "1"
        }

２．
「マルゲリータ1枚」
「マルゲリータを1枚注文」
「マルゲリータを1枚注文して」でテスト

→「slot_PizzaName」ではvalueを検知するが、「slot_OrderCount」が検知できない。

        "slot_PizzaName": {
          "name": "slot_PizzaName",
          "value": "マルゲリータ"
        },
        "slot_OrderCount": {
          "name": "slot_OrderCount"
        }

【回答】
回答待ち
```
メモ：DataFrame で順序をシャッフルする方法

注: index が連番である前提

```py
import numpy as np
def shuffle_df(df):
    shuffler = np.random.permutation(len(df))  # シャッフルされた番号の配列を返す
    df = df.take(shuffler)  # 渡された番号順のDataFrameを返す
    return df
```
メモ：DataFrame で複雑な条件で抽出する方法

単純な条件なら

```py
df = df.query('A > 0 and B > 0')
# もしくは
df = df[df.A > A & df.B > 0]
```

のように抽出可能なのだが、ブロードキャストができないような、もっと複雑な条件の場合、
たとえば「A列(str)の後ろから4文字目が "8" である行」 だけ抽出する場合は次のように書く。

```py
df = df[df.A.map(lambda x: x[-4] == '4')]
```
バリューサーバーでjpドメイン取得　備忘録

#経緯
- 芸術家として自分の独自ドメインとWebサイトを持ちたい
- メールアドレスも取得しときたい
- 今月キャンペーン中らしい（Feb.2018 現在）

#ドメインとレンタルサーバ
[バリュードメイン](https://www.value-domain.com)で独自jpドメイン取得 & レンタルサーバ契約（「バリューサーバ」と呼ばれる）
1. 総額 ¥3,110-（独自jpドメイン＋初期費用ゼロのレンタルサーバ1年分50%off）
 以前 さくらのレンタルサーバ を ¥5,000/年 で利用してたので割安だ
2. コアサーバー・バリューサーバーの２種類あって紛らわしかったが、[こちら](http://www.value-rentalserver.com/value-core-server/)によると、「バリューサーバーのエコプラン」で充分だ

```
(１)CORE-MINI スペックがほぼ同じでより安い、エコプランを選択した方がよい
```

#実際の作業
[簡単スタートアップ](https://www.value-server.com/startup/domain_web.html?_ga=2.181485543.1113322874.1518785683-1760604097.1518089930&_gac=1.220375530.1518849597.CjwKCAiAn5rUBRA3EiwAUCWb20wRDaw0fwhlhjJFfAodQuJVeTFDG0-yeSruBtQEYai-kaxqben8gBoCruAQAvD_BwE)に従って、作業を進めてゆく
具体的には次の手順：

1. ネームサーバーの設定
[VALUE-DOMAINのネームサーバーの変更方法](https://www.value-domain.com/userguide/manual/modns/?_ga=2.205724371.1113322874.1518785683-1760604097.1518089930&_gac=1.191670872.1518849597.CjwKCAiAn5rUBRA3EiwAUCWb20wRDaw0fwhlhjJFfAodQuJVeTFDG0-yeSruBtQEYai-kaxqben8gBoCruAQAvD_BwE)
自分の場合、「4-2 汎用JPドメインの場合」へ（ns1〜5 が自動入力された）

2. DNS設定
[DNS情報・URL転送の設定](https://www.value-domain.com/userguide/manual/moddns/)
サーバとjpドメインを紐付けする作業のこと
自分は「3-2 VALUE-DOMAINのネームサーバーをご利用の場合」

```
DNS設定は、ドメインとサーバーを関連付ける作業となります。

例えば、ドメイン「○○○.com」と、IPアドレス「000.111.222.333」を関連付けます。
また、メールアドレス「yamada@○○○.com」にメールサーバーを設定します。
WEBサイトの公開やメールの送受信には、この設定が必要です。
```
```こんな感じになる（自動）
a * xxx.x.xxx.xx
mx @ 10
txt @ v=spf1 ip4:xxx.x.xxx.xx ~all
```

3.ドメインウェブの設定
「ドメインの利用」→「ドメインウェブの設定」
※ どうやらこれをしないとwebサイトにつながらない
サブドメインを複数作る可能性を考え、Sub1に「獅子さんjp」を登録してボタン登録。FTPで確認すると、数分も経たないうちにサブフォルダができ、ブラウザからもドメインにアクセスできるようになった。
※ index.php>index.htmの順ぽい。
/public_html/shishisan.jp/

4.[メールの設定](https://www.value-server.com/startup/mail_thunderbird.html)
昨日まで上手く行かなかったのは、たぶんDNS設定がまだだったからだろう。上記1〜3を行った後はメール送受信ができるようになった。

5.おまけ（ファビコン）
Webサイトをブックマークしたとき出てくるアイコンのこと。設定しときたかったのでコードを書いておく。

```
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>獅子さんち</title>
  <link rel="shortcut icon" href="./img/icon.png" type="image/png">
</head>
```

#リンク
※ バリュードメインのコンパネは非常に使いづらいため、注意が必要（以下、自分用にリンクを貼ってゆく）

- [ドメイン](https://www.value-domain.com/modall.php)
- [コンパネ](https://www.value-domain.com/mypage/)


#備考 
ネームサーバー設定・DNS設定設定・URL転送設定などは、数年前にやったことがあったものの、頻繁にする事でないため、何がどうだか忘れていて、ドキュメントがあったので助かった。（前回は格安で海外ドメインだったため、英語話者といえどそこそこ苦労した覚えがある）
Numpyでitertools.productと同じことをやる

```python
import numpy as np
from itertools import product
from pprint import pprint

x = [1, 2, 3]
y = [4, 5]

pprint(list(product(x, y)))

"""
[(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]
"""

pprint(np.array(np.meshgrid(x, y)).T.reshape(-1, 2))

"""
array([[1, 4],
       [1, 5],
       [2, 4],
       [2, 5],
       [3, 4],
       [3, 5]])
"""
```

# 参考
- [Python - itertools.product(*iterables, repeat=1)](https://docs.python.jp/3/library/itertools.html#itertools.product)

- [Using numpy to build an array of all combinations of two arrays
](https://stackoverflow.com/questions/1208118/using-numpy-to-build-an-array-of-all-combinations-of-two-arrays)
【Rails】form_tagで2回目以降の検索をするとキーワードがURLに追加されていく問題

#2回目以降の検索でキーワードがURLに追加されている！？

##結論
×  => `= text_field`
◯ => `= text_field_tag`
##概要
####【条件】
- Rails 5.0.6
- Ruby 2.3.1
- haml

####【機能】
- 検索
- submitボタンはなし（Enter）
- 画面移管する

####【課題】
- 2回目以降の検索でURLにキーワードが追加され続ける。
- 検索はできる。

下記のコードで実装していました。
##views
```haml:header.html.haml
.col-md-1.search-box
  = form_tag( search_articles_path, method: :get ) do
    = image_tag 'glass.svg', { class: 'glass' }
    = text_field :key, params[:key], { placeholder: "検索する", class: "text" }
```
##controller
```ruby:articles_controller.rb
def search
  @article = Article.new
  @comment = Comment.new
  #検索機能
  @articles = Article.search(params[:key])
end
```
##model
```ruby:article.rb
def self.search(key)
  if key
    Article.where(['title LIKE ?', "%#{key}%"])
  else
    #ここは改善の余地あり
    Article.all
  end
end
```
これでは検索の度にURLに`/articles/search?utf8=✓&key%5B%7B"ドラマ"%3D>"qiita"%7D%5D=確認`の様にどんどん増え続けてしまって格好が悪いですよね。

####これで解決！！

##views（修正）
```haml:header.html.haml
.col-md-1.search-box
  = form_tag( search_articles_path, method: :get ) do
    = image_tag 'glass.svg', { class: 'glass' }
    = text_field_tag :key, params[:key], { placeholder: "検索する", class: "text" }
```
##解説
1時間悩みましたが、結局はform_tagの中で`= text_field`では無く`= text_field_tag`に変えるだけで解決しました。
hamlの書き方に慣れていなかった事やform_tagについて理解が浅かった事が原因でしょうね。

##お願い
`= text_field`と`= text_field_tag`の明確な違いをご存知の方はコメント欄で教えていただけるとありがたいです！！
td-client-rubyでTreasureDataにテーブルとカラムを作る

`td-client-ruby`を使っていろいろTreasureDataに投げ込む作業をしてたんですが、そもそもテーブルの作り方もカラムの作り方も、ソース以外に書いてありそうなものがなくて戸惑ったので、メモ書きです。

## テーブルの作成
```ruby
client = TreasureData::Client.new("TD_APIKEY")
```
とか適当に初期化は済んでいる前提で

```ruby
client.create_log_table("DB名", "テーブル名")
```

これ実態としては

```ruby
client.create_table("DB名", "テーブル名", "log")
```
で、そもそも`log`ってなんぞやっていうとTDにはテーブルのタイプというのがあるようなんですが、いまはlogしかないのかな？
https://docs.treasuredata.com/articles/td-cli#td-tablecreate
cliでもtypeオプションはあるんですが、log以外の扱いについて記述はないですね。

なので、今のところテーブル作成は

```ruby
client.create_log_table("DB名", "テーブル名")
```
でよいようです。
(というか`create_table`の方は呼べないはず)

## カラムの作成
いやいや、TDって自動でよしなにカラム作成してくれるからいいじゃんって思うじゃないですか？
そう思ってたんですけどね、投げ込むデータによっては、longだと誤認されて死亡とかそういうこともあるし、**なによりカラム順がぐちゃぐちゃだと見づらくて死ぬ**みたいなこともあるので、指定して作成できるならそうしたい。

```ruby
client.update_schema("DB名", "テーブル名", table_schema)
```
update_schemaというのがあるのでこんな感じでできるんですが、困ったのは**table_schemaをどういう形で渡したら満足するのか**ということ。
なんとなくjsonで渡すのかなあとかやってみると"Arrayでよこせ"と言われArrayで渡そうとすると500が返る。。

まあ結論、二次元配列なんですけどね。

```ruby
table_schema = [["hoge", "string"],["fuga", "long"]]
```

といった形で渡してあげると、stringのhoge列とlongのfuga列(とtime)を持ったテーブルになります。

https://github.com/treasure-data/td-client-ruby/blob/master/lib/td/client/api/table.rb#L71
もしかしてここ、Array of arraysであるべきでは…？

以上、なにかの参考になればｍｍ
アレクサ誤起動の話


## トリガーフレーズが聞こえてきたらどうなる？ ##
スマートスピーカーを持っていない人からたまに聞かれる話に

**テレビやラジオとかでトリガーフレーズが聞こえてきたらどうなるの？**

ということがあります。
※ちなみに上記ではトリガーフレーズと書いてますが、ALEXAの用語的には「ウェイクワード」と呼びます。


## 回答 ##
答えとしては
$\color{red}{\rm 割と簡単に誤起動します}$

我が家では秋から冬にかけてはNFLを見ているのですが、
アレキサンダーという選手が活躍して、実況や解説にてコールされると
アレクサも「お、呼んだか？」みたいな感じで反応してました。

また、テレビのスマートスピーカーを紹介していた時に
テレビ内の命令に一緒になって反応しようとしていました。
※そういう意味ではBS1のある番組でGoogleHomeの特集をしていた際に、命令する際には放送側で音声をミュートにしていたのはなかなか考えているなあと感心しました。

我が家では買い物はできるようにはしていないので金銭的に何かに直結することはないですが、
それでも危うさはあるなーというのはほんの少しだけ感じます。
※ウェイクワードは3種類から変更することはできるので、
デフォルトじゃないものに変えておくのも一つのセキュリティ対策なのかなと思います。

ただ、そもそも起動してなくても常に音声を拾われているのでそっちのほうが若干気持ち悪いなという気もしますが。
tigervncserverがCentOS7のsystemctlでenable化に再起動後失敗する。その忌々しい現象を解決した。

　以前書いていた問題について解決したのでここにご報告申し上げたい。
　と、言っても偶然の成功であり技術的な知見の向上によるものではないので、同じような悩みをお持ちの方の力にはなれない。
　むしろ真似したら状況は悪化するかもしれない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48602/428b3b67-9164-aa78-5ce3-efaa2833a83e.png)
　こんな感じ。
　あとから分かったのだが、どうやらVNC側のバグらしい。
　https://qiita.com/HiroshiAkutsu/items/6856e84c6efc126b801c
　とはいえ設定ファイルのひな型が実際のファイルとほぼすべての指南サイトで違っていることについてはいまだわからない。
　というかこれが解決したのは数か月前で、それからまったくVNC関係の記事を見ていないので今はどうかわからない。
　また、同じようなことに悩んでいる人が皆無に近いことも不思議である。

　というわけで今後とも頑張ります。
　
＝＝＝＝＝＝　以下まったく役に立たない駄文　＝＝＝＝＝＝

　去年の末ごろにさくらのVPS上でtigervnc-serverをguacamole経由にて使用していたのですが、CPUの脆弱性がどうのとかでyum updateをかけたら何もかも使えなくなったので、再構築を試みましたが二ヵ月かけても全く復旧できなくてそれを業者のせいにすべく、さくらを解約してお名前.comのVPSに乗り換えたらさらに泥沼化してしまったのでここに記録します。

　まず、さくらVPSで以前導入時にrootのhistoryを記録していた（つもり）だったのでなぞってみたところ、うまくいかず（初期にどううまく行かなかったのかくわしくは忘れた）どうにかつながったが挙動がおかしい。
１．表示されるデスクトップにWindowsでいうところのタスクバーが表示されない。
　　このため、デスクトップとその上にあるアイコンしか操作できない。
２．デスクトップ上で右クリックして試しに壁紙を変更しようとしても出来ない。
　　仮想？モニタが正常に認識されていない雰囲気。
３．それでもしばらくは使用できているが１分前後で接続が勝手に切れてしまう。
　　systemctl statusを見るとfailedとなっている。
　　daemon-reloadをやりなおしてstartやrestartをやるとその時だけ青信号や灰信号になる。
　　が、電源を入れなおすとfailedの赤信号。
　　ちなみに-kill :1 とか　x1を消そうとしましたが、そもそも存在しませんでした。
４．さくらのコントロールパネルのVNCまでも何となくおかしい。

　この時点でコンパネのVPSとユーザのVPSの何かが衝突していると判断し、さくらを解約する。
　が、やがてお名前.comでもユーザ側のVNCはうまくいかず、さくらのコンパネのVNCがおかしかったのはこちら側のローカル環境所以であったと判り、ひどい邪推であったと反省する事になる。
　
　次にお名前.com VPSに移行後（結局どこでやっても同じなのだが、一応エポックを区切る）にとりあえずtigervnc-serverを単体で起動させ続ける事を目標にやってみるが、１mmも前進しない。
　で、ここまでで不思議な事は以下の通り。
１．systemctl status がFailedの状態でもvncserver :1とすると正常に作動する。
２．１の場合タスクバーから何からなにまでちゃんとviewer側に表示される。
３．壁紙も変更できる。
４．もちろん２，３はインターネット越しの別の端末で確認した。
５．vncserver@.serviceファイルの元ネタとコピー先についての解説にサイトによりゆれがある。
　　(/usr/から始まっていたりいなかったり…この辺はこちらの無知ゆえなのだろうが）
６．最も一番最大に不思議なのは、vncserver@.serviceの編集対象<USER>の場所について。
　　Webの解説によると数日前の編集のものも含め例外なく以下の様になっている。
　　[Service]
　　Type=forking
　　# Clean any existing files in /tmp/.X11-unix environment
　　ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
　　ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"　
　　PIDFile=/home/<USER>/.vnc/%H%i.pid
　　ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
　　
　　しかし実際のファイルにはExecStartに<USER>はなく代わりに[USER]のところに書き換えるべき箇所がある！

　６については巷間のファイルを実際のファイルに丸写ししてからそこのところをユーザー名に書き換えてみたが、だめだった。

　まとめ
　tigervnc-serverは手でvncserver :1と起動すると正常に作動するが、自動に起動させる為systemctlを用いる事はできない。

　なぜなのか？
さくらVPSでSpringBootを動かす

## きっかけ

AWSのElastic BeanstalkでSpringBootを動かしていたが
ちょっとさくらVPSに浮気してみた時のメモ書き。

## 目標

さくらVPSでSpringBootで作ったアプリを動かす!

## 手順

### 1.Jarの作成

作ったSpringBootのアプリからMavenからJarファイルを作成

> Eclipseを使用した場合
（プロジェクトを右クリック、実行->Mavenビルドを選択してゴールにPackageと入力して実行）
![springboot.png](https://qiita-image-store.s3.amazonaws.com/0/230829/1fc076d1-6caa-3c26-5506-f8b20f46c007.png)

### 2.Jarの転送

SCPを使用し上記のJarをさくらVPSのサーバに転送する

>TeraTermを使用した転送方法
（ファイル->SSH SCPを選択し該当のJarを選択してSendする）
![springboot2.png](https://qiita-image-store.s3.amazonaws.com/0/230829/7bef111c-9554-06eb-24b4-0d5f0e3f4314.png)

### 3.Javaのインスール

以下コマンドでJavaをインストール

```sh:Javaインストール
sudo yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 
```

### 4.ポートの解放

SpringBootは8080で動くので8080を解放

```sh:ポートを解放
sudo firewall-cmd  --permanent --add-port=8080/tcp
systemctl restart firewalld
```

### 5.Jarファイル実行

```sh:JavaコマンドでダウンロードしたJarを実行。SprigBootが起動

 java -jar xxxx-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.9.RELEASE)
```

### 6.画面確認

以下のアドレスで動作することを確認

http://IPアドレス:8080

![springboot.png](https://qiita-image-store.s3.amazonaws.com/0/230829/f2d76569-377d-834b-17fd-62ca390900f3.png)
CentOS 7にnodebrewを使ってNode.jsをインストール

CentOS 7にnodebrewを使ってNode.jsをインストールするときのコマンド。

2018/02/17時点のLTS版のNode.js v8.9.4をインストールする。

```bash
sudo yum -y groupinstall 'Development tools'
curl -L git.io/nodebrew | perl - setup
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
nodebrew install v8.9.4
nodebrew use v8.9.4
```
Haskell 環境準備 (for Windows10)

Haskellの環境準備備忘録
仕事でHaskell使ってますが、プライベートでも使っていこうと思ってWindows環境にいれたので、そのメモ。

## Install Haskell
HaskellのInstallは、stackでやるのがいい。

### Stackのインストール
stackは、以下から
https://github.com/commercialhaskell/stack/releases
windows版(stack-1.6.3-windows-x86_64-installer.exeにした。)を落として来たらインストール。

### Stackのsetup
stackがインストールできたら、プロンプト開いて
`stack setup`
を実行。  
shellをリスタートしろ的なCAUTIONと、

```
[0mstack will use a sandboxed GHC it installed[0m
[0mFor more information on paths, see 'stack path' and 'stack exec env'[0m
[0mTo use this GHC and packages outside of a project, consider using:[0m
[0mstack ghc, stack ghci, stack runghc, or stack exec[0m
```
でてきて終了。
(`[0m` ~~これ文字化け？~~ANSIカラーのエスケープシーケンスだったみたいですね。windowsでは、7以降廃止されてて、今はansiconを入れないといけないみたい。)

## Execute Haskell 
### ghci
`stack ghci`
で、起動。  
ghciが入ってなかったら、まずインストールされる。
インストールが終わるとghciが起動する。

```
Prelude> 
```
が表示されたらOK。
こんな感じ。
![ghci_test.png](https://qiita-image-store.s3.amazonaws.com/0/162097/b4625091-db38-f216-0b22-c5cf05a0fe1f.png)

`:q`
でghciから抜ける。

### ghc
`stack ghc ファイル名`
で、実行。

buildされて、
`~.hi`
`~.o`
`~.exe`
が生成されるので、~.exeを実行。
こんな感じ。
![ghc_test.png](https://qiita-image-store.s3.amazonaws.com/0/162097/e84974ef-e427-24a3-702c-ee9525146fa0.png)


### runghc
`stack runghc ファイル名`
で、実行。
こんな感じ。
![runghc_test.png](https://qiita-image-store.s3.amazonaws.com/0/162097/c905b5df-431b-2a2c-427e-0ad03a157e1a.png)

### Haskell project
`stack new プロジェクト名`
で、新規プロジェクト作成。 

```
All done.
```
が出たらOK。
プロジェクト名のディレクトリができてるはず。

作成されたプロジェクト名のディレクトリに移動して、
`stack build`
で、build。

`stack exec プロジェクト名-exe`
で、実行。
こんな感じ。
![stack_exec_test.png](https://qiita-image-store.s3.amazonaws.com/0/162097/5718e473-58f9-7686-4a3c-4333021f5a28.png)

実行する実行ファイルは、
プロジェクトディレクトリ以下の
`/.stack-work/dist/`
の下を見たらいるはず。
(gdbとかでdebugしたいときは、それを起動すればいい。はず。)


## おまけ
つかったfeb.hsは、こんな感じ。

```feb.hs
main :: IO ()
main = do
  print $ feb 10
  return ()

feb :: Int -> Int
feb i
  | i == 0 = 1
  | i == 1 = 1
  | otherwise = feb (i-2) + feb (i-1)
```
取りあえずの確認用。
Amazon EchoのSkillで何かを作ってみて申請してみた話：最終回

## 〇前回までのアレクサスキル！ ##

[適当なSkillを作成して申請してみた。](https://qiita.com/ryo_naka/items/936d9a6853be85bae88b)

[Amazon EchoのSkillで何かを作ってみて申請してみたら申請結果が返ってきた](https://qiita.com/ryo_naka/items/86c404ba6ea7140b8f31)

## 〇今回の話 ##
長いことほったらかしていましたが、アレクサスキル申請してみた話の続きです。

前回では「非公式」とうたえばいけるみたいと書きましたが、  
結論から言うと**ダメ**でした。  
何回か申請→却下を繰り返した結果、**許可をもらってないとダメ**だということは変わりませんでした。  
※なら、「非公式」と書いてあればええよというのはなんだったんだ？ということにはなりますが。

ということで、そこについては諦めました。  

ただ、それ以外では  
・トリガーについての改善提案  
・スキル概要の記載についての改善提案  
などは丁寧に記載されていたので、それに従っていれば割とあっさりでした。  

ということで、昨年末に申請していたスキルはなんだかんだで結構あっさりと公開できました。
  
<img width="455" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/28b4afac-f794-9bc2-6c4e-5642b94fe217.png">



権利の都合でレスポンスを修正したのにスキル名については修正しなかったので  
レスポンスとスキル名とスキル概要については全然合っていないのですが、そこらへんは審査の対象外みたいです。


##いいのかな？と思う部分
結局のところ今回のレスポンスの実処理部分はLambdaで実施しているわけなのですが、  
ここの処理って審査後でも簡単に変更することができるわけです。  
とすると、審査の時には権利の都合で戻していた処理を審査後公開されてから以前の処理に戻すことだって可能なわけです。

この辺がどうにもモヤモヤするわけですが、まあAmazonさんがそれでいいというのであればそうなのでしょう。

## 終わり ##
ということで、とりあえず申請してみたものについては公開されたのでいったんクローズです。  
なんか面白そうなアイデアが思いついたら何かしら実用的なものを作ってみたいものです。

ちなみに
個人で遊ぶ分には申請なしでDevバージョンで普通に使えます。  
我が家では簡単な占いを作って遊んでいます。
WindowsでvcpkgでインストールしたライブラリをRustから使う

# Rustは数値計算に使えそう

RustはGoよりも数値計算のライブラリが充実していそうです。

* [nalgebra](http://nalgebra.org/)
* [chfft](https://qiita.com/chalharu/items/9a6b23170349ae013f40)

必要なものがcrateとして用意されているとは限りません。C/C++のライブラリ使う方法は[FFI](https://doc.rust-lang.org/book/first-edition/ffi.html)に書かれています。この例では圧縮ライブラリ[snappy](https://github.com/google/snappy)を使っています。

ドキュメントにはプロジェクト名の指定はなかったので

```Powershell
> cargo new ffi_snappy --bin
```

でプロジェクトを作成しました。

# vcpkg

[vcpkg](https://github.com/Microsoft/vcpkg)は，Microsoft謹製のパッケージ管理システムです。vcpkgはVisual C++のプロジェクトで使うオープンソースのライブラリをビルドすることを目的としています。[FreeBSD](https://www.freebsd.org/)の[Ports collection](https://www.freebsd.org/ports/index.html)を手本にしていますが，portsファイルは[CMake](https://cmake.org)で書かれています。

vcpkgでsnappyをインストールします。

```PowerShell
.\vcpkg install snappy:x64-windows
```

vcpkgは様々なプラットフォーム（triplet）向けのコンパイルが可能です。平成も30年ですが，デフォルトは`x86-windows`（32-bit）なので，`:x64-windows`を指定しました。

# Rustからsnappyを使う

## dllとlibをコピー

パッケージは`installed\x64-windows`にインストールされます。vcpkgでは，共有ライブラリをプロジェクトにコピーして使うことを想定しているようです。ここでもそれに従って`bin\snappy.dll`と`lib\snallpy.lib`を`ffi_snappy`にコピーしました。

静的ライブラリ（snappy:x64-windows-static）をインストールして`installed\x64-windows-static\lib\snappy.lib`をコピーした場合は`cargo build`はうまくいきましたが，`cargo run`でエラーが出ました。

## dllをコピーしlibをbuild.rsで指定

プロジェクトのルートに`build.rs`を置く方法もあります。

* [Build Scripts](https://doc.rust-lang.org/cargo/reference/build-scripts.html)
* [Cargoで任意の共有ライブラリをリンクするには](https://qiita.com/kjunichi/items/31aef0cf3f4f7fe6dc32)

```Rust
fn main() {
    println!("cargo:rustc-link-search=native=path-to-vcpkg/installed/x64-windows/lib/");
}
```

この場合でも`bin\snappy.dll`はコピーしないと`cargo run`でエラーが出ます。`rustc-link-search`のあとは`=`です。最初は`-`かと思いましたが，`-`では正しくリンクされません。

`installed\x64-windows\bin`（共有ライブラリ）`x86-windows-static\lib`（静的ライブラリ）を指定したときは

```
  = note: Non-UTF-8 output: ffi_snappy-d4b8872a8faeecc5.ffi_snappy0.rcgu.o : error LNK2019: \x96\xa2\x89...
```

というエラーが出てしまいました。

# まとめ

vcpkgでライブラリをインストール。dllとlibをプロジェクトにコピー。
【初心者向け】JavaScriptとjQuery【違いは？】

## javaScriptとは
ブラウザで実行されるクライアントプログラムだよ。
ブラウザは、ウェブページを画面上に写すソフトだよ（ChromeとかFirefoxとかね！）。
HTMLの操作がおもな役割だよ。
~~芦田愛菜だよ。~~
## javaScriptの機能
- **HTML要素の操作**<br>
HTMLをいろいろいじれる。例えば、HTMLの要素の属性値やCSSプロパティを変更したり、HTML要素自体を動的に作り出したりできる。
- **実行条件の指定**<br>
条件に合わせて処理を行なったり、行なわなかったり決めれて、複雑な動きや機能をつけられる。
- **webサーバとの通信**<br>
Ajaxを使って、ページ遷移せずにwebサーバーと通信をすることができる（例:GoogleMapがぬるぬる動くのはこれのおかげですよ）。

## jQueryとは
jQueryはjavascriptの**フレームワーク**。
**フレームワーク**…元になる機能を隠して、ユーザーにより使いやすいようにしてくれるもののこと。
jQueryの各機能はjsの一つ以上の機能をまとめたもので、jsを書くよりも簡単に短くプログラミングができてとっても便利。
ちなみにプラグインを追加することで、jQueryに新しい機能を追加することもできる。

## jQueryの人気のある理由
- プログラムの知識がない人でも比較的簡単に使える
- jsだと何行もするプログラムをたった数行で実行できる
- jsにはある『ブラウザによる違い』を無くしてくれる（クロスブラウザ対策）
- 手軽に使えるプラグインがたくさんあり、新しい機能を追加できる

##  jQueryを使うには
以下のサンプルのようにHTMLファイルの`scriptタグ`から読んであげます。
このようにjQueryファイルを読み込むことで、同じくHTMLから読み込んでいるjsファイル内でjQueryが使えるようになります。
ダウンロードする場合

```html
<html>
<head>
    <script type="text/javascript" src="js/jquery-3.1.0.min.js"></script>
</head>
<body>
    <script type="text/javascript" src="js/main.js"></script>
</body>
</html>
```

ダウンロードしない場合

```html
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<body>
    <script type="text/javascript" src="js/main.js"></script>
</body>
</html>
```
自分で作ったAndroidアプリのSQLiteのDDLを確認する

個人のアプリをAndroid Architecture ComponentのRoomに変更してみようと思いました。
ただ、現状は [OrmLite](http://ormlite.com/) を利用しているので、そもそものDDL文がありません。（classへのアノテーションで表現している）
そのため、まずは現状調査のために、Android上で動作しているSQLiteのDDLを取得してみようと思います。

## DBファイルを取得する

[Android SQLiteのファイルをadbコマンドで取得 - Qiita](https://qiita.com/aroundfourty/items/c6239c181505b4f5e25c) に書かれている通りです。

例えば、今回のアプリでは `build.gradle` は下記のようになっています。

```groovy
android {
    defaultConfig {
        applicationId "hm.orz.chaos114.android.slideviewer"
    }
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
        }
    }
}
```

また、 `SQLiteOpenHelper` 継承のクラスが、下記のようになっていました。

```java
public final class DatabaseHelper extends OrmLiteSqliteOpenHelper {
    private static final String DATABASE_NAME = "slide_viewer.db";
    private static final int DATABASE_VERSION = 1;
    public DatabaseHelper(Context context) {
        super(context.getApplicationContext(), DATABASE_NAME, null, DATABASE_VERSION);
    }
}
```

そのため、
[パッケージ名] : `hm.orz.chaos114.android.slideviewer.debug`
[データベース・ファイル名] : `slide_viewer.db`
となり、実行するコマンドは下記のようになりました。

```shell
adb shell run-as hm.orz.chaos114.android.slideviewer.debug cat databases/slide_viewer.db > app.db
```

## DDLを取得する

`sqlite3` コマンドは、Android SDKの中にあるようです。
`adb` コマンドなどと同様に、 `...Android/sdk/platform-tools` のようなフォルダにPATHが通っていれば、そのまま実行できるはずです。
例えば、今回はCREATE文だけが欲しかったので、下記のようにしてみました。

```
> sqlite3 app.db .dump | grep CREATE
CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE `talk` (`id` INTEGER PRIMARY KEY AUTOINCREMENT , `modifiedAt` INTEGER , `ratio` FLOAT , `url` VARCHAR );
CREATE TABLE `slide` (`id` INTEGER PRIMARY KEY AUTOINCREMENT , `original` VARCHAR , `preview` VARCHAR , `talk_id` INTEGER , `thumb` VARCHAR );
CREATE TABLE `talkmetadata` (`id` INTEGER PRIMARY KEY AUTOINCREMENT , `talk_id` INTEGER , `title` VARCHAR , `user` VARCHAR );
```

これを、Roomに変えたあとでも確認して、同じようになっていればOK、といった確認ができそうです。
oracle,tomcatでWebAPサーバとDBサーバを構築して適当に遊ぶ環境を作る（環境構築編）

#<b>この記事の目的とか範囲</b>#
本記事では、LinuxOS上（今回はCentOS）にWebの環境構築するときのWeb、AP、DBなどの基本的なインストール方法をまとめています。
色々なソフトウェアや手順がありますが、今回はJavaのWebアプリが動作するという前提で、Apache、Tomcat、oracleをインストールし、更に簡単なアプリのデプロイ～動作までを範囲とします。
なお、前後編構成になっていまして、本記事はこの前編です。前編ではOSインストールからoracleまでを一気にインストールします。

#<b>環境構成</b>
サーバHW：中古のThinkPadX201(SSD:320GB/mem:8GBに改造)
OS：CentOS7.2
その他：Apache、Tomcat9、DBサーバにoracle12cR2を利用します。
なお、今回は１台にWeb/APサーバとDBサーバが相乗りしている状態。
クライアントマシン：Windows 10 64bit(NEC Lavie Hybrid Zero)
※以下に示す手順はVMとかの仮想環境でも十分参考になると思います。

#<b>1.OSインストール</b>
今回はUSBブートを使いました。まずはISOを落とします。4～5GBくらいあるので、時間かかります
<a href="http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso">CentOS Mirror</a>

次にUSBブートのためのツールを用意します。最初はUNetbootinというのを使いましたが、インストール時にうまくいかなかったので、Etcherというのを使いました。
<a href="https://etcher.io/">Etcher</a>
※UNetbootinでCentOS7系のUSB作成するとたまにインストールがうまくできない時があるようです。。。理屈は不明。
<a href="https://wiki.centos.org/HowTos/InstallFromUSBkey">HowTos/InstallFromUSBkey - CentOS Wiki</a>

なお、MacOS(その他LinuxOS）の人はddコマンドでUSBメモリ作成できます。
<a href="http://marmotte.pyrites.jp/blog/2015/01/04/create-bootable-usb-from-iso-file/">MacOSX上でISOファイルからインストールUSBディスクを作る - re:inventing the wheel</a>

ISOとEtcherダウンロードできたら、USB作成します。Etcherの使い方は以下(画面キャプチャはMacだけどWinも全く同じです)
<a href="http://www.moongift.jp/2017/10/etcher-3%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF/">Etcher - 3ステップで簡単にイメージ書き込み MOONGIFT</a>

あとは、インストールしたい端末のBIOSでブートの優先順位を一番上にし、端末に作成したUSB挿した状態で起動すればCentOSのインストール画面が出ます。（途中でネットワークの設定をしていますが、ここは僕はやっていません。めんどくさかったから笑）
<a href="https://webkaru.net/linux/centos-7-x86_64-install/">CentOS 7 x86_64 をインストールしてみた - Linux入門 - Webkaru</a>

#<b>2.oracleインストール</b>
oracleダウンロードします。oracleへのユーザ登録が必要です（手続きは簡単）。
<a href="http://www.oracle.com/technetwork/jp/database/enterprise-edition/downloads/index.html">Oracle Database ソフトウェア･ダウンロード</a>
上記サイトの「oracle12c Release 2」という部分の「Linux x86-64」をダウンロードします。
手順はここに書かれている通りです。
http://www.oracle.com/technetwork/jp/database/enterprise-edition/documentation/sidb12201-inst-linux-x64-ja-v10-3627443-ja.pdf

上記の4.1までがoracleのインストール。4.2がDB作成です。なお、DB作成のところですが、手順と少し異なったことをしています。「標準構成」で「コンテナデータベースとして作成」のチェックを外しています。理由はよくわからなかったから笑。標準構成でDB作成すると、その後の手順が一気にショートカットされます。
とりあえず4.2の17まで行けばOKです。
#<b>3.OpenJDK、tomcatインストール
##<b>3.1 OpenJDK
tomcatを落とす前にJavaの実行環境も落としましょう。今回はOpenJDKを使います。
最近Java9が出ましたが、あえてJava8で行きます笑。yumコマンドで楽勝。
<a href="https://qiita.com/ytkumasan/items/2098c6ca93eaa44746b0">CentOS 6&amp;7/Fedora 20にOpenJDK 8環境を構築 - Qiita</a>

##<b>3.2 tomcat
さて、次はtomcat行きます。yumでtomcatでもよいのですが、これだとtomcat7で少々古いです（javaEE7に対応していないっぽい？）。今回はzipファイル展開して進めます。
<a href="https://qiita.com/fk_2000/items/ff7b4768260459553fa1">CentOS7にTomcat9をインストールする - Qiita</a>
上記はJava9、tomcat9.0.1でやっていますが、java8でも大丈夫です。なお、僕はtomcat9.0.0でやりました。理由は特にありません。

さて、これで環境は整いました。次は実際にDBアクセスし、データを画面に表示するアプリを作って簡単に疎通確認してみましょう。
ターミナルでLinuxを使っていて表示が右端で折り返されないとき

ターミナルでLinuxを使っていると、表示が右端で折り返されないときがある。

折り返す方法について記載する。

## psコマンド
`ps aux`実行時（赤線の箇所、右端で折り返されていない）
![2018-02-17_15h45_11.png](https://qiita-image-store.s3.amazonaws.com/0/177284/06f01f5c-71bf-1ab3-f1b1-bb433c8a93c6.png)

【対処法】wオプションを2回つけると右端で折り返されるようになる。
`pw auxww`実行時（→折り返されている）
![2018-02-17_15h57_34.png](https://qiita-image-store.s3.amazonaws.com/0/177284/070379bb-4151-a1e4-0b9f-945b48fa0dd3.png)


## journalctlコマンド
`journalctl`実行時（赤線の箇所、右端で折り返されていない）
![2018-02-17_16h01_58.png](https://qiita-image-store.s3.amazonaws.com/0/177284/03f05481-91bc-88ed-f21c-ad51273a1b44.png)

【対処法1】パイプでlessに渡す
`journalctl | less`実行時（→折り返されるが色はつかなくなる）
![2018-02-17_16h08_18.png](https://qiita-image-store.s3.amazonaws.com/0/177284/f8f6e229-11b0-70d1-2526-6a6d982125ee.png)

【対処法2】環境変数 SYSTEMD_LESS にページャへのオプションを指定する
`export SYSTEMD_LESS=FRXMK`で環境変数を設定してから`journalctl`実行した時（→折り返されるし、色もつく）
![2018-02-17_16h07_28.png](https://qiita-image-store.s3.amazonaws.com/0/177284/bd40572f-c0e3-0f96-fd5c-bee02c72e77a.png)
ScalaでListの末尾追加はしてはいけない

# Scalaで末尾追加が遅い
他の言語を経験していると、当然のように行ってしまう末尾追加。
Scalaの場合は末尾追加が遅いとさまざまな場所で警告されているが、実際に計測してみたのでメモ。
桁違いとはこのことだった。

末尾追加 vs 先頭追加

※Seq[Int]() のように生成するとListが生成される(コメント欄参照)

## 結論
先頭追加してreverseしよう

```scala:sample.scala
import org.apache.commons.lang3.time.StopWatch

def func = {
	val tail = new StopWatch
	tail.start

	var tailSeq = Seq[Int]()
	for(i <- 0 to 10000){
		tailSeq = tailSeq :+ i // 末尾追加
	}
	
	for(i <- tailSeq){
		i + 1 // 適当に計算
	}

	tail.stop
	println("tail:" + tail.getTime)
        
    val head = new StopWatch
	head.start

	var headSeq = Seq[Int]()
	for(i <- 0 to 10000){
		headSeq = i +: headSeq // 先頭追加
	}
	
	for(i <- headSeq.reverse){
		i + 1 // 適当に計算
	}

	head.stop
	println("head:" + head.getTime)
}
```

```
// 結果 ms
tail:1447
head:8
```
Adobe Animate CC　HTML書き出しの読み込み進捗を表示する

#概要
Adobe Animate CC でHTML(canvas)コンテンツを制作すると、以下のようなローディング画面を入れられます。

![180217_capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/207dff2d-f72d-fe32-da2e-f203d0ef5a7e.png)

使用されている素材はプリロードされ、便利なのですが・・・同じコンテンツをFlashで制作した場合と比べると、ローディングにやたら時間かかります。
（Flashと比べると体感5～10倍くらい。ブラウザによる。）

そこで、○% と読み込み進捗を表示する方法です。

##環境
Adobe Animate CC 18.0.1 (ビルド 115)
Windows10

##手順
書き出したHTMLを開き、loaderの宣言個所を探す
※コンテンツ内容によって若干かわります。

```js
	var loader = new createjs.LoadQueue(false);
	loader.installPlugin(createjs.Sound);
	loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
	loader.addEventListener("complete", function(evt){handleComplete(evt,comp)});
	var lib=comp.getLibrary();
	loader.loadManifest(lib.properties.manifest);
```

以下を追加する
他のイベントリスナー宣言の前に以下を挿入。

```js
	loader.addEventListener("progress", function(evt){handleProgress(evt)});
```

`function init()` の下に以下を挿入。

```js
function handleProgress(evt){
	document.getElementById("progresstxt").innerHTML = String(Math.floor(evt.loaded*100))+"% Loaded.";
}
```

プリロード画像 `<img src=images/_preloader.gif style='vertical-align: middle; max-height: 100%'/>` の直後に以下を挿入。

```html
<p id="progresstxt" style="position:absolute;top:0;width:100%;text-align:center;"></p>
```

挿入後のイメージ
![180217_capture2.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/e5f4d3b4-59c7-f27d-ea63-37d226ee0586.png)

![180217_capture3.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/f89991d8-b7ed-4653-87f5-42708f580cea.png)


##結果
このようになりました。

![180217_capture4.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/a77a0b69-aa15-b16c-654a-eeb4ba0def86.png)
LibreOfficeバンドルのPythonにUbuntu - Pythonのパッケージのパスを追加する

防備録ですが、誰でもわかるようにできるだけ詳しく書きます。

**環境**
　　Ubuntu Studio 17.10
　　LibreOffice6.0

　　Ubuntu
  　　Python 2.7.14(64bit)
  　　Python 3.6.3(64bit)

　　LibreOffice 6.0
  　　Python 3.5.4(64bit) 
　　　Verが少し違うのですが、現在の所問題がありません。（パッケージがインストールされているのはpython3.6フォルダではなくpython3フォルダの方でした。）


LibreOfficeのマクロを作成するためにPythonを始めたのですが、（まだ一からプログラムを作成できるほど知識はありません。ネットで見つけたプログラムを自分用に改造して使っています。）
UbuntuのPythonでは、動作するのにLibreOfficeのPythonではModuleNotFoundErrorが出るので、Ubuntu側のPythonからフォルダ・*.pyファイルをコピーして使用していました。（最近シンボリックリンクに変えてみましたが、これでも動作します。）

数日前にP--Qさんのブログ
　https://p--q.blogspot.jp/2015/06/linuxbean140438libreofficepython.html
「linuxBean14.04(38)LibreOfficeバンドルPythonにパッケージを追加」
を発見したので、参考にして「sites.pth」を/opt/libreoffice6.0/program/python-core-3.5.4/lib/site-packages　に保存しましたが、動作しませんでした。

#重要
「sites.pth」の
/usr/lib/python36.zip
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
を削除しました。これがあるとエラーになります。
薄々問題がありそうな気がしていたのですが、今迄問題にならなかったので放置していましたが、今日エラーが出て削除するとエラーがなくなりました。（今回の分だけですが。まだどうなるかわかりません。）

site-packages/READMEを読むとsite.pyを参照しろと言うことなので見ると、「lib/site-packages」はWindows用みたいです。
Unixでは「lib / python ＜version＞ / site-packagesを追加します。」とありますので、フォルダを作成します。

＜version＞の番号も問題です。
@chatrate　さんのブログ「【Python】site-packagesのパスを確認する方法【pip install】」
https://qiita.com/chatrate/items/eb4b05cd1a6652529fd9
で、丁度このパスを調べる方法が書いてありました。

```python:path
$ /opt/libreoffice6.0/program/python
・・・
＞＞＞ import site; site.getsitepackages()
['/opt/libreoffice6.0/program/python-core-3.5.4/lib/python3.5/site-packages']
```

上記のフォルダに「sites.pth」を置くと

```python:sites.pth
$ /opt/libreoffice6.0/program/python /opt/libreoffice6.0/program/python-core-3.5.4/lib/site.py
sys.path = [
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib',
    '/opt/libreoffice6.0/program',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/lib-dynload',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/lib-tk',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/site-packages',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/python35.zip',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/python3.5',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/python3.5/plat-linux',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/python3.5/lib-dynload',
    '/opt/libreoffice6.0/program/python-core-3.5.4/lib/python3.5/site-packages',
    ~~'/usr/lib/python3.6',~~　＜ーこれがあるとエラーになります
    ~~'/usr/lib/python3.6/lib-dynload',~~　＜ーこれがあるとエラーになります
    '/home/ty/.local/lib/python3.6/site-packages',
    '/usr/local/lib/python3.6/dist-packages',
    '/usr/lib/python3/dist-packages',
    '/usr/lib/python3.6/dist-packages',
]
USER_BASE: '/home/ty/.local' (exists)
USER_SITE: '/home/ty/.local/lib/python3.5/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
```

LibreOfficeのPythonにパスが追加されました。
何故か？python3.6なのに、パッケージがインストールされているのは/usr/lib/python3/dist-packagesでした。

~~これで、今の所はLibreOfficeのPythonでも動作するようになりました。~~

$ pip3 install pandas
でPython3にインストールしPython3でimport出来るようになりましたが、LibreOfficeのPythonでは
 ImportError: Missing required dependencies ['numpy']
（必要な依存関係がありません）
のエラーがでて、単純にパスが通っているだけでは駄目そうですね。
LibreOfficeのPythonは同じファイル名でも中身が違うのではないでしょうか。
【Django】タイムゾーンを標準ライブラリのみでローカルタイムへ変換する

Python 3.6.3
Django 1.11.6

# 背景
Pythonのdatetime.datetimeはnaive（タイムゾーン情報を持っていない）とaware（タイムゾーン情報を持っている）の2種類に区別されます。

今回はタイトルの通り、タイムゾーンが東京になっていない箇所をどうやったらローカルタイムへ変換できるのかまとめました。

その場合、タイムゾーン情報をsettings.pyから参照して変換したい！という方には参考になるかと思います。
自分もハマったので忘備録として残します。

# 答え
```python:utils.py
# 動作確認していないので実用性は低いです
from django.utils import timezone

datetime.astimezone(tz=None)
```
Noneとするとタイムゾーン情報がなくなりsettings.pyのtimezone情報から参照して変換してくれます。

# 終わりに
Pythonのタイムゾーン変換でググるとその場でtzinfoに+9hしたものが多く、苦労しました。
それとPythonでのタイムゾーン変換はpytzが有名らしいですが、

Qiita記事
[Python3のdatetimeはタイムゾーンを指定するだけで高速になる](https://qiita.com/mattsu6/items/5511c5631e7a54550f7f#pytz%E3%81%A7%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88)

上記の記事を見るとpytzは読み込みが遅いらしい。

pytzを使用せず、標準ライブラリのみでどうにかできないか試行錯誤した結果こうなりました。

# 参考
[Pythonでdatetimeにtzinfoを付与するのにreplaceを使ってはいけない](http://nekoya.github.io/blog/2013/07/05/python-datetime-with-jst/)
[Convert a python UTC datetime to a local datetime using only python standard library?
](https://stackoverflow.com/questions/4563272/convert-a-python-utc-datetime-to-a-local-datetime-using-only-python-standard-lib/13287083#13287083)

[How to make an unaware datetime timezone aware in python
](https://stackoverflow.com/questions/7065164/how-to-make-an-unaware-datetime-timezone-aware-in-python)
[備忘録]2D&3Dスマホゲーム入門　part2

クラスを使うと管理に便利。
クラスで使う変数をメンバ変数、クラスで使う関数をメンバ関数と呼ぶ。

「this」→自分自身のクラスが持つ変数を利用するときに使う。thisはつけなくても動作するが、次のようにメンバ変数とお同じ名前のローカル変数を宣言した場合、powerとだけ書くとローカル変数の値が優先的に使われてしまう。そこでメンバ変数を使うときは明示的に[this]をつけておくことでバグを減らすことができる。

```csharp

private int power = 50;
(省略)
public void Attack(){
    int power = 999;
    Debug.Log(power + "のダメージを与えた");
    //ローカル変数が優先され、999のダメージを与えることになる。
}
```

---
##Vectorとは？
3Dゲームを作る場合、空間上のどこにOBを置くのか、どちらの方向も移動するのか、どちらに力を加えるかなどを決めるため、**float型の「x,y,z」の３つの値**を扱う。

そしてこれらをひとまとまりにしたものが**Vector3クラス**。
2Dゲーム用にはVector2クラスもある。（ｘ，ｙのみ）

```csharp
void Start()
    {
        Vector2 playerPos = new Vector2(3.0f, 4.0f);
        playerPos.x += 8.0f;
        playerPos.y += 5.0f;
        Debug.Log(playerPos);
    }
```

```:UnityOfficial
**変数**
magnitude	ベクトルの長さ（読み取り専用）
normalized	magnitude を 1 としたベクトル（読み取り専用）
sqrMagnitude	ベクトルの 2 乗の長さを返します（読み取り専用）
this[int]	[0] や [1] を使用して x や y 成分にアクセスします
x	ベクトルの X 成分
y	ベクトルの Y 成分
```
```csharp:Vector2同士の減算。ベクトルの長さを求めている。
 void Start()
    {
        Vector2 startPos = new Vector2(3.0f, 4.0f);
        Vector2 endPos = new Vector2(8.0f, 4.0f);
        Vector2 dir = endPos - startPos;
        Debug.Log(dir);

        float len = dir.magnitude;
        Debug.Log(len);
    }
```
ゼロからはじめる量子コンピュータ #2


【前回のおさらい】
ひとまず、インストールは出来たみたい？

【今回のテーマ】
IBMのＱISKITを使って遊んで見る

さて、開発環境も整ったので、
quantum circuit example（量子回路の例）
に挑んで見る

「回路」と言っているからには
何かしらの構造があって、インプットとアウトプットがあるんだろうなぁ
程度のイメージです。

あと、simulatorと言っているからには
多分、量子回路なるものを仮想化してくれるんでしょう

早速動かそう。。。
と思ったらimport エラーか
パスがとっていないので、qiskitの実体を

```
/home/xxxxx/anaconda3/lib/python3.6/site-packages
```
にバコッとコピー
IBMQuantumExperience
requests_ntlm
ntlm_auth
もコピー

すると、パスが通って
qiskitが使えるようになります。
っていうか、、、、ここまでは量子回路と何の関係もない
ファイルシステム依存の問題。

で、いよいよ量子コンピュータを作り始めます

https://github.com/QISKit/qiskit-sdk-py

の量子コンピュータ(のシミュレータ)を作ってみます。

まずは写経

古典的なレジスタと量子レジスタの両方を準備するみたいです。

```
#Create a Quantum Regsister called qr with 2 qubit
    quantum_reg = q_program.create_quantum_register("qr",2)
    #Create a Classical Register called cr with 2 bits
    classical_reg = q_program.create_classical_register("cr", 2)
```

#【Ｈゲートの追加】

```
#ADD the H gate in the Qubit 0, putting this qubit in superposition.
    quantum_circuit.h(quantum_reg[0])
```

と言っているので、Ｈゲートなるものを追加してみます。

そもそもＨゲートって何だ？？？？

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

https://en.wikipedia.org/wiki/Hadamard_transform#Quantum_computing_applications

多分「Hadamard gate」

のことですね。
Walsh systemのsuperpositionがHadamard gate
みたいなので、Walsh system
について、調べてみます。

https://ja.wikipedia.org/wiki/アダマール変換

(引用)これは1つの量子ビットの回転であり、量子ビットの基底状態
から、2つの重みが等しい重ね合わせへの写像

なるほど　コードのこの部分は
量子ビットを回転させて、重みを等しい状態にしようとしているのかな

#【ＣXゲートの追加とBell状態への移行】

```
# Add the CX gate on control qubit 0 and target qubit 1, putting
# the qubits in a Bell state
quantum_circuit.cx(quantum_reg[0], quantum_reg[1])
```

続いてＣXGateを追加してBell Stateなる状態にしたいという事のようです。

Bell Stateについて調べているうちに

IBMQのユーザーズガイドにめぐり合いました。
https://github.com/QISKit/ibmqx-user-guides

（ユーザーズガイドからの引用）To do all of this, quantum computers will use two fundamental properties of the quantum world: superposition and entanglement.

superposition と entanglement.
について理解することが重要な様です。

superposition と entanglement.
について、次回検証して見ることにします。
OpenCV(Python)で画像をトリミング


Qiita初投稿です．
はてなブログで需要がありそうな記事の移植になりますが．

[OpenCV(Python)で画像をトリミング-完全に実力不足な理系大学生からの成長ブログ ]
(http://yori1029.hatenablog.com/entry/2017/01/15/012819)

OpenCVって簡単なことやりたいのになかなか検索でひっかからなかったりするんですよねー．

```python:toriming.py
import cv2

if __name__ == '__main__':

　　#画像入力
    im = cv2.imread('Lena.bmp',0)
    
    #新しい配列に入力画像の一部を代入
    dst = im[200:400,70:270]
    
    #書き出し
    cv2.imwrite('cut.bmp',dst)
```

![alt](https://cdn-ak.f.st-hatena.com/images/fotolife/y/yori1029/20170115/20170115012702.jpg)
入力画像

![alt](https://cdn-ak.f.st-hatena.com/images/fotolife/y/yori1029/20170115/20170115012723.jpg)
出力画像

pythonだと簡単にできちゃいますね．
以上です．
Alexa Skill のテストで「Invalid ApplicationId」エラーが出る場合の対処法

## 症状

Alexa SkillのLambda関数をテストすると、以下のようなエラーが発生します。

![1](https://qiita-image-store.s3.amazonaws.com/0/10290/169fb25f-a367-f4b1-e5b3-0616635af0da.png)

```text:内容
{
  "errorMessage": "Invalid ApplicationId: amzn1.ask.skill.d317bd99-c687-4d3f-9485-84cd74096bfe",
  "errorType": "Error",
  "stackTrace": [
    "AlexaRequestEmitter.ValidateRequest (/var/task/node_modules/alexa-sdk/lib/alexa.js:157:27)",
    "AlexaRequestEmitter.HandleLambdaEvent (/var/task/node_modules/alexa-sdk/lib/alexa.js:126:25)",
    "AlexaRequestEmitter.value (/var/task/node_modules/alexa-sdk/lib/alexa.js:100:31)",
    "exports.handler (/var/task/index.js:9:11)"
  ]
}
```

![2](https://qiita-image-store.s3.amazonaws.com/0/10290/d2e6b8a5-6dc7-0058-4618-ba04fcbeb681.png)

```text:内容
START RequestId: c3d35de6-13a9-11e8-a575-6f749581c416 Version: $LATEST
2018-02-17T06:14:09.162Z    c3d35de6-13a9-11e8-a575-6f749581c416    The applicationIds don't match: amzn1.ask.skill.[unique-value-here] and amzn1.ask.skill.d317bd99-c687-4d3f-9485-84cd74096bfe
2018-02-17T06:14:09.163Z    c3d35de6-13a9-11e8-a575-6f749581c416    {"errorMessage":"Invalid ApplicationId: amzn1.ask.skill.d317bd99-c687-4d3f-9485-84cd74096bfe","errorType":"Error","stackTrace":["AlexaRequestEmitter.ValidateRequest (/var/task/node_modules/alexa-sdk/lib/alexa.js:157:27)","AlexaRequestEmitter.HandleLambdaEvent (/var/task/node_modules/alexa-sdk/lib/alexa.js:126:25)","AlexaRequestEmitter.value (/var/task/node_modules/alexa-sdk/lib/alexa.js:100:31)","exports.handler (/var/task/index.js:9:11)"]}
END RequestId: c3d35de6-13a9-11e8-a575-6f749581c416
REPORT RequestId: c3d35de6-13a9-11e8-a575-6f749581c416  Duration: 65.45 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 34 MB
```

## 原因

ログに、「The applicationIds don't match: amzn1.ask.skill.**[unique-value-here]**」という文言があります。これは、テストデータのアプリID設定が、サンプルで作ったままとなっていることを示しています。

## 対処

「テストイベントの設定」を選択します。

![test1](https://qiita-image-store.s3.amazonaws.com/0/10290/67ebc009-1d24-dbcc-1274-2c58d13b2717.png)

「保存されたテストイベント」のテキストフィールドを確認すると、あちらこちらに`[unique-value-here]`と書かれています。

![test2](https://qiita-image-store.s3.amazonaws.com/0/10290/36e92dd3-694a-7878-97c3-690f8802c8a7.png)

これらを全て、アプリIDの`amzn1.ask.skill.`より後ろの部分(「症状」の例の場合、`d317bd99-c687-4d3f-9485-84cd74096bfe`)に置き換えます。
macにRMagick使える環境を整える話

#この記事について
https://qiita.com/makito/items/9f1e67955b8ed851592c の続き程度のメモ。解説はあまりない。

#手順

##前提

- brew で入れる
- bundler使ってライブラリを管理している


##インストール

```bash
$ brew install imagemagick
```

RMagick本家はここ→ https://github.com/rmagick/rmagick

Gemfile に `gem 'rmagick'` を書き加え

```bash
$ bundle install --path vendor/bundle
...
Bundle complete! 2 Gemfile dependencies, 19 gems now installed.
Bundled gems are installed into `./vendor/bundle`
```

こんな感じで成功
UbuntuにRubyMineをインストールした話

Rubyのプログラムを書くためにIDEを導入することにしました。JetBrain製のRubyMineをUbuntuにインストールした時のメモです。
## RubyMineのインストール
Ubuntuの場合、インストールは超簡単です。

```
sudo snap install rubymine --classic
```

## RubyMineのデバッガを使えるようにする
RubyMineのデバッガを使うためのgemをインストールします。
RubyMineで作ったプロジェクトのディレクトリに移動してGemfileを作成します。
（以下はhelloworldプロジェクトを作成済みの場合の例）

```
cd ~/RubymineProjects/helloworld
bundle init
```

作成されたGemfileに以下の行を追加します。

```
gem 'ruby-debug-ide', require: false
gem 'debase', require: false
```

以下のコマンドでプロジェクトのディレクトリ配下にgemをインストールします。

```
bundle install --path vendor/bundle
```

プロジェクトのディレクトリの下にvendor/bundleディレクトリが自動で作られ、そこにgemがインストールされました。
これでRubyMineのデバッガを使うことができます。
React Native Navigation　ヘッダーを透明にする。

# React Native Navigation　ヘッダーを透明にする。 

こんな感じでheaderのバックグラウンドを透明にしたかった。

![6b337541da86c520d835bfffd162b266.png](https://qiita-image-store.s3.amazonaws.com/0/229570/81d2df75-ab06-7007-27eb-137e7678d0ec.png)

```javascript
navigationOptions = {
  headerTitle: '',
  headerStyle:{ 
    position: 'absolute',
    backgroundColor: 'transparent',
    zIndex: 100,
    top: 0,
    left: 0,
    right: 0,
    borderBottomWidth: 0,
   },
```

メモ。