OmniAICreator/Qiita-1.07M huggingface dataset:
GCPと連携してPepperに音声ファイル分析機能を搭載

##概要
ペッパーの音声認識機能として、Speech Recoボックスがありますが、これで聞き分けられるのは、事前に設定しておいた文字列だけです。
そこで、GCP（Google Cloud Platform）のSpeech APIという音声認識APIとペッパーを提携して、ペッパーの音声認識機能を拡張してみたいと思います。
今回はそれの前段階として、**日本語の音声ファイルをテキストに起こし、それをペッパーに喋らせる**というものを作りました。ペッパーに録音もさせるのは次回、やってみようと思います。

※当記事のコードは、[PythonでCloud Speech APIを叩いて音声をテキスト化](https://to-kei.net/python/google-cloud-speech-api/)をpepperで動くように書き換えたものです。

###PythonSDK
PythonSDK(PythonだけでPepperの開発が出来るSDK)を使って開発しています。PythonSDKの導入は↓
https://qiita.com/kyohara/items/ae0dd0f57413caa90674 
などをご覧ください。

##ソースコード
音声ファイル名(日本語が入ってる)、APIKey、ペッパーのIPアドレスを入れると実行できます。

```python:speech.py
#coding:utf8
import base64
from googleapiclient import discovery
import httplib2

from naoqi import ALProxy #pepperのライブラリを使うため

#ペッパーの接続情報
pepperIP = "YourIPAddress"

#APIキーを設定
key = "YourAPIkey"

#音声を保存するファイル名
WAVE_OUTPUT_FILENAME = "sample.wav"

#インスタンスを生成
tts = ALProxy("ALTextToSpeech",pepperIP,9559)

#APIのURL情報
DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest?'
                 'version={apiVersion}')

#APIの情報を返す関数
def get_speech_service():
    http = httplib2.Http()
    return discovery.build(
        'speech', 'v1', http=http, discoveryServiceUrl=DISCOVERY_URL, developerKey=key)

def SpeechAPI():
	#音声ファイルを開く
	with open(WAVE_OUTPUT_FILENAME, 'rb') as speech:
	    speech_content = base64.b64encode(speech.read()) 

	#APIの情報を取得して、音声認識を行う
	service = get_speech_service()
	service_request = service.speech().recognize(
	    body={
	        'config': {
	            'encoding': 'LINEAR16',
	            'sampleRateHertz': 44100,
	            'languageCode': 'ja-JP', #日本語に設定
	            'enableWordTimeOffsets': 'false',
	        },
	        'audio': {
	            'content': speech_content.decode('UTF-8')
	            }
	        })

	#SpeechAPIによる認識結果を保存
	response = service_request.execute()

	#認識した日本語をペッパーにしゃべらせる。
	for i in response["results"]:
	    tts.say(i["alternatives"][0]["transcript"].encode("utf-8"))

if __name__ == "__main__":
	SpeechAPI()	
```

##まとめ
今回は外部APIと連携してPepperに音声ファイルからテキストを取得する機能を搭載しました。やっぱりAPIを使うと出来ることがだいぶ広がりそうです。
次回以降、ペッパーのマイクを用いて、音声ファイルを生成して、それをテキストに起こすというのをやってみたいと思います。

by アトリエスタッフ
Salesforceの本番組織からJSforce Metadata ToolsでApexクラスなどを削除する

## Salesforceの本番組織からApexクラスなどを削除するのはかなり面倒

以下のような方法があるけど、めんどい。

- Force.com IDEで削除（[参考](https://help.salesforce.com/articleView?id=000006188&type=1)）
- Force.com Migration Toolで削除（[参考](https://help.salesforce.com/articleView?id=000004460&language=ja&type=1)）
- Workbenchで削除（[参考](https://help.salesforce.com/articleView?id=000247186&language=ja&type=1)）

## JSforce Metadata Toolsで削除する

node.jsのコマンドラインツール[JSforce Metadata Tools](https://jsforce.github.io/blog/posts/20151106-jsforce-metadata-tools.html)も上記方法と同じくMetadata APIを実行しているので、これを使っても削除できます。

### 1. JSforce Metadata Toolsインストール

```
$ npm install -g jsforce-metadata-tools
```

### 2. 以下のようなフォルダ構成でファイルを作ります

```
.
└── metadata
    ├── destructiveChanges.xml
    └── package.xml
```

```xml:package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
   <version>42.0</version>
</Package>
```

`destructiveChanges.xml`に削除したいリソースを記載。

```xml:destructiveChanges.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>DeleteExample</members>
        <name>ApexClass</name>
    </types>
    <types>
        <members>DeleteExampleTrigger</members>
        <name>ApexTrigger</name>
    </types>
    <version>42.0</version>
</Package>
```

### 3. 以下のコマンドを実行

```
$ jsforce-deploy -u <ユーザ名> -p <パスワード> -D ./metadata/ --rollbackOnError
```

以下のような結果が表示されれば成功です。組織に入って確認してみましょう。

```
Logged in as: <ユーザ名>
Deploying to server...

Deploy Succeeded.

Id: 0Af0000000XXXXXXX
Status: Succeeded
Success: true
Done: true
Number Component Errors; 0
Number Components Deployed: 2
Number Components Total: 2
Number Test Errors; 0
Number Tests Completed: 31
Number Tests Total: 31


Test Total Time: 8246
```

## まとめ

他の方法より面倒じゃない…気がする
busyboxのshでは |& の表記が使えない

メモです。

```shell:a.sh
#!/bin/sh
echo stdout
echo stderr >&2
```

このようにstdoutとstderrの出力するプログラムの両方の出力をpipeに渡したい。

```
# ./a.sh |& cat > out
-sh: syntax error: unexpected "&"
```

|& の表記をサポートしていないようだ。
代替方法は以下。

```
# ./a.sh 2>&1 |cat > out
#
```

これならエラーにならない。

```
# cat out
stdout
stderr
```

出力も想定通り。
クエリを利用してPostGISの座標データをカラムにつっこむ

# 結論

文字列連結すれば何とかなった．
これが本当に普通のやり方なのか，他にもっといい方法がないのか，よく分からん．

# 背景

DBに入っているxy座標から，2次元のgeometry('point')型に変換したい．
webで検索しても，ST_GeomFromTextに生でデータを手書きしているサンプルしか見付からなくて絶望感にうちひしがれた．

できればpythonからつっこみたかったが，executemanyでは難しそうだったし，データ数が多くてexecuteをforで回すのはヤバそうなので，諦めた．

参考：
 [python \- Unable to execute ST\_GEOMFROMTEXT using executemany \- Stack Overflow](https://stackoverflow.com/questions/44529348/unable-to-execute-st-geomfromtext-using-executemany)

なので，とりあえずxy座標をDBにカラムとして入れた状態からスタートする．

# 準備

```sql
CREATE EXTENSIONS postgis;
CREATE TABLE _point (
    x integer,
    y integer,
    geom geometry('Point')
);
```

```sql
INSERT INTO _point VALUES (10,15), (15,20);
```

# 更新

```sql
UPDATE _point SET geom = ST_GeomFromText('Point(' || x || ' ' || y || ')');
```

※コメントで指摘いただいたPostGISの型を生成する関数についてドキュメントを読んでみたところ，geometry('point')型の生成には[ST\_GeomFromText](http://www.postgis.net/docs/ST_GeomFromText.html)の他に，[ST\_Point](http://www.postgis.net/docs/ST_Point.html)や[ST\_MakePoint](http://www.postgis.net/docs/ST_MakePoint.html)，[ST\_PointFromText](http://www.postgis.net/docs/ST_PointFromText.html)などがあり，OpenGISとの互換性や内部処理の有無による実行速度及び精度に差があるらしい．格納されているデータのオリジンや今後予定している移植の可能性などを踏まえ適切な関数を選択するのが良さそう．

# 結果

```sql
SELECT * FROM _point;
```
```
 x  | y  |                    geom                    
----+----+--------------------------------------------
 10 | 15 | 010100000000000000000024400000000000002E40
 15 | 20 | 01010000000000000000002E400000000000003440
(2 rows)

```
Centos7でcrontabを編集してもシェルが実行されない

久しぶりにCentOS7をつかったら、crontabを編集してもシェルが実行されない

#原因はanacron
`cron`のかわりに用意されている`anacron`が諸悪の根源

CentOS7では CentOS6にあった`cron`のかわりに、`anacron`が用意されている。

いろいろ違いはあるが、

`cron`は**分単位**の指定時刻で実行されるが
`anacron`は**日単位**の指定時刻でしか動作されない
[anacronふたたび。（「RHEL6で悩ましい諸々」シリーズ）](http://enakai00.hatenablog.com/entry/20111004/1317718773)

どうやら仮想マシンでよくある同時バッチ対策でランダム遅延が挿入されるらしい
[AppleScript] GmailをChromeで開くアプリを作った MacOS

#はじめに
GmailをMacOS純正のメールアプリで使うとタグ付けが不便、端末ごとに設定するのが面倒、...等々の理由から、完全にブラウザベースでメールを処理することを決意しました。
ただ、GoogleChromeを開いて、ブックマークからGmailを開いて...も面倒。
そこで、ドッグにGmailのショートカットがあれば便利！とのことで、初AppleScript挑戦。

<!-- 
######MacOS純正のメールアプリと比べた利点
- ブラウザベースのため、どの環境でも同じように使える
- 検索機能の充実
- 端末の保存容量削減

######MacOS純正のメールアプリと比べた欠点
- オフラインでメールが見れない
- 未読数が一発でわからない　( →Chrome開いている間は [Google Mail Cheker](https://chrome.google.com/webstore/detail/google-mail-checker/mihcahmgecmbnbcchbopgniflfhgnkff)で解決)
-->

通知はChromeの設定で、Chromeを開いている限り受け取ることが可能。
以下手順。

#作成手順
##エディタの起動
アプリケーション/その他/スクリプトエディタ
新規書類
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230141/99bf2548-c4e6-7557-3533-68683368cd18.png)

##ソースコード
以下を貼り付け (AppleScript初コーディングのため汚いのはご容赦ください。ついでにQiita投稿もこれが初。)

```main.scpt
set addr to "https://mail.google.com/mail/" #表示アドレス
tell application "Google Chrome"
	activate
	set n to 1
	repeat with w in windows #すでにGmailを開いていないか確認
		set i to 1
		repeat with t in (tabs of w)
			if (URL of t as string) contains addr then
				set active tab index of window n to i
				set index of window n to 1
				if i > 1 then #タブを固定する
					tell application "System Events"
						keystroke "x" using {command down, shift down}
					end tell
				end if
				error number -128	#プログラムの終了
			end if
			set i to i + 1
		end repeat
		set n to n + 1
	end repeat
	open location addr #Gmailを新規で開き、タブを固定する
	tell application "System Events"
		keystroke "x" using {command down, shift down}
	end tell
end tell
```

##仕様

- Gmailを重複して開かない。すでに開いている場合は最前面に表示。
- Gmailタブを固定し、一番左に移動する。

##保存
そして、メニューからファイル/保存する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230141/ec9ddc34-0fe2-31ea-0216-b32fb4f33d35.png)
名前:Gmail
場所:アプリケーション
ファイルフォーマット:アプリケーション

これで完成。
あとはドッグにD&Dすれば、ドッグからのワンクリックでChrome経由のGmailが開く。
ただし、アイコンは初期設定のままなのはダサいため、変更する。

##おまけ:アイコンの変更
Finder/アプリケーション/Gmailを右クリック　→「パッケージの内容を表示」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230141/abaf88ad-2448-3e95-13fe-48155d4c915b.png)
そこからContents/Resources/applet.icnsを変更することでアイコンを書き換え可能。
ただ、見慣れない拡張子のためフリーでダウンロードが手っ取り早い。
https://www.easyicon.net/language.ja/iconsearch/mac/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/230141/e9114256-6701-1fa2-3353-2ed56f743933.png)
[Gmailアイコン](https://www.easyicon.net/language.ja/1171983-google_mail_icon.html)
ちなみに自分はこれを使用。

ここからicns形式でダウンロードし、applet.icnsの名前に変更、デフォルトアイコンと同じ位置に配置することで完了。
ついでに、アプリの仕様変更は
Contents/Resources/Scripts/main.scptを書き換えると可能。

##完成図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230141/fde14caa-9131-c1cf-794b-0b3e2c382e0a.png)


#役立った資料
[AppleScript入門(Introduction)](http://tonbi.jp/AppleScript/Introduction/)
[[Mac][Chrome]Google ChromeをAppleScriptで操作する](http://d.hatena.ne.jp/LaclefYoshi/20101024/1287887644)

<hr>

### 追記(2018/10/16)
macOS Mojave (10.14)以降、起動時にアクセシビリティの許可を求められます。
キーボードアクセスのため、許可をすることで使用可能になります。

### 追記(2020/02/07)
macOS Catalina (10.15)でも当時作ったアプリが問題なく動作することを確認しました。
(アプリの作成は保証していません)
【React Native】setActivityCallbacksの利用 (Android)

react nativeでMainActivityを触ることがある。
react-native-fbsdkではCallbackManagerという、
Facebookログイン実行後のコールバックなどに必要な設定を行う。

react-native-navigationを利用すると、
MainActivityに実装した設定が反映されない。
＊そのように感じただけで未検証です。

そのため、MainActivityに書くはずの設定を、MainApplicationに記載した。

react-native-navigationを導入した後で、
react-native-fbsdkを導入する例を記載しておく。


＞MainApplicationのNavigationApplicationのonCreateを下記のように修正
setActivityCallbacksを追加して、MainActivityで受け取れるcallbackをMainApplicationで受け取れるようにする。


```
    @Override
    public void onCreate() {
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);

        setActivityCallbacks(new ActivityCallbacks() {
            @Override
            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                mCallbackManager.onActivityResult(requestCode, resultCode, data);
            }
        });

        FacebookSdk.sdkInitialize(getApplicationContext());
    }
```
Graftrootメモ

G.Maxwell が提唱した [Graftroot](https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-February/015700.html) の自分なりの理解メモ。

ビットコインで条件分岐のあるコントラクトを書く場合、条件分岐先の処理のうちいずれか一つしか実行されないので、実行されなかった処理まで含めた全プログラムをブロックチェーンに書き込むのは非常に非効率。

多くのコントラクトの場合、

```
if (正常な場合) then
  <AliceとBobが両者とも電子署名すれば送金できる>
else /* 異常系処理 */
  <一週間経ってAliceが応答しなかったらBobだけの電子署名で送金できる>
endif
```

のように「正常処理のマルチシグ + 異常系処理のコントラクト」といった組み合わせで構成されることが多い。
多くの場合、異常系処理は呼ばれないので、正常な場合は普通のマルチシグtxになって、異常な場合だけ複雑なスクリプトをブロックチェーンに書き込めば効率的。

そこで、ビットコインのコンセンサスルールをいじってあげて、異常系スクリプトと、そのスクリプトに対するAliceとBobによる電子署名があれば、そのスクリプトを実行できるようにしてあげる。

つまり、

```
ScriptPubKey = Pub_{Alice} Pub_{Bob} による電子署名
```

に対して、通常の場合には

```
ScriptSig = Sig_{Alice} Sig_{Bob}
```

でコインをredeemできるけど、異常発生時には

```
ScriptSig =
  <S = 異常系スクリプト>
  <AliceおよびBobによる、Sに対する電子署名>
```

というデータを与えればコインをredeemできるようにコンセンサスルールを変更してあげればいい。
電子署名はマルチシグを作ったときに予めAliceとBobで交換しておく。

こうすることで、Merkelized Abstract Syntax Tree (MAST) のような複雑なことをしなくても、いくつでも異常系スクリプトを仕込める（AliceとBobで異常系スクリプト S1, S2, ..., に対する電子署名を交換しておけばいい。Merkle Tree を使った commitment なんて不要）。

---

英語力ないんで、間違ってるかも。。。変なところがあったら[Twitter](https://twitter.com/visvirial)等で教えてクレメンス。
【Unity】enumでtagのように管理するスクリプトを作成する

# Unityのtag管理
Unityのtag管理では`TagManager.asset`というファイルで管理され, Git管理する際, 違うブランチで同時にtagを変更してしまうと, `コンフリクトを起こしてしまう`などの問題があります.
そこで, enumでtagのように管理をするスクリプトを作成します.

---

## 1. GameDataType.csを作成します.
```c#:GameDataType.cs
using UnityEngine;
namespace kkkkoyo.basic
{
    public class GameDataType : MonoBehaviour
    {
        public DataType dataType = DataType.None;
    }
    public enum DataType : int
    {
        None,
        CubeA,
        CubeB
    }
}
```

## 2. 2つのキューブにGameDataType.csをアタッチして, 各DataTypeを設定します.  
<img width="693" alt="pic1.png" src="https://qiita-image-store.s3.amazonaws.com/0/139949/b371f051-a265-f68e-935b-ab3dd7cbe713.png">  

## 3. Player.csを作成しPlayerオブジェクトにアタッチします.  
```c#:Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using kkkkoyo.basic;//追加
public class Player : MonoBehaviour
{

    void OnTriggerEnter(Collider collider)
    {
        GameDataType componentType = collider.gameObject.GetComponent<GameDataType>();

        if (componentType == null)
        {
          /*
          GameDataType.csがコンポーネントに追加されてない
          オブジェクトと接触した際のエラー回避
          */
          return;          
        }
        if (componentType.dataType == DataType.CubeA)
        {
            Debug.Log("CubeAと接触");
        }
        else if (componentType.dataType == DataType.CubeB)
        {
            Debug.Log("CubeBと接触");
        }
    }
}
```

## これで完成です.
![gif](https://img.gifmagazine.net/gifmagazine/images/1374578/original.gif)　

---

# おわりに
Unityのtagは`TagManager.asset`としてプロジェクト内に1つのファイルとして管理されており, 大きいプロジェクトになると管理が難しくなります.   
`GameDataType.cs`のようにenumでtagのように扱うスクリプトを複数作成することにより, tagを用いるより管理が容易になります.
Oracle explain plan による実行計画の確認方法

```SQL:実行計画の解析
SET LINESIZE 200
explain plan for
SQL文 ;
```
解析されました。

```SQL:実行計画の表示
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()) ;
```
実行計画が表示される。

-- 以下、[Oracle11.1.0以降はPLAN_TABLEは提供されているのでCREATEは不要](http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05771-04/statviews_5.htm#72593)
> PLAN_TABLEは、すべてのユーザーに対してEXPLAIN PLAN文の出力を保持するグローバル一時表として自動的に作成されます。

ご指摘いただい ora_gonsuke777さん、ありがとうございます。

-- Oracle10.2.0 以下のバージョンでは最初にPLAN_TABLEをCREATEしておかなければならない。
```SQL:準備
-- create PLAN_TABLE(CREATE USERしたらPLAN_TABLEもCREATEしておこう)
@?/rdbms/admin/utlxplan.sql
 ↑
sqlplus で ? は ORACLE_HOME(Oracleをインストールしたディレクトリ)
```
PLAN_TABLE はOracleのバージョンによりテーブルの内容が異なる。
Oracleのバージョンアップで古いバージョンのPLAN_TABLEをCREATE しまっていたら、
DROP TABLE PLAN_TABLE PURGE ;
し、現バージョンのPLAN_TABLEをCREATEし直す。
異なるバージョンのPLAN_TABLEを使っても、実行計画が正しく表示される保障はない。


昔、Oracleのパフォーマンス・チューニングで呼ばれた外資系の会社で。

PLAN_TABLEがないので実行計画を確認できない。
使うように指示されたスキーマには SELECT ANY TABLE権限などが設定されていたが
CREATE TABLE権限がない。ボスにPLAN_TABLEの必要性を説明したが、どうしてもPLAN_TABLEをCREATEさせてもらえない。最初からオラクル・サポートのアカウントはもらえたので、困り果ててオラクル・サポートにOracleやSQLの知識のない人にもPLAN_TABLEの必要性を説明するわかり易い文章をいただけませんか？って泣きついた。
statspackについても同じ手段を使った。

3ヶ月の契約が終わる頃、仕事が遅いから延長はなし。そりゃ、ほとんど毎日何とか権限が必要なので ... ってやっていたから実際にチューニングできる時間はかなり少なかったからね。

仕事が終わる数日前にわたしより前にOracleのパフォーマンス・チューニングで呼ばれた人が2人はいたことが判明。ボスは誰も契約の延長はしなかった。わたしの次のチューニング担当が決まっている、とのこと。

オラクル・サポートには今でも感謝している。
escript 同士でメッセージをやりとりする

## 目的
ひとつの escript を ノード A では server モードで起動して， ノード B では client モードで起動すると，  ノード B の escript がノード A の escript に connect しにいき，互いに Message を送受信できるような escriptをつくりたい． 

忘備録程度にまとめる．

```
A$ ./myescript --server
waiting for connection...
... (waiting) ...
B connected.
B sent me message: connected
```

```
B$ ./myescript --client A
connecting to A... connected.
sending "connected" to A... sent
```

## 成果物

 - `net_kernel:start([NodeName])` で long-name を設定できる．
 - escript を実行しているメインプロセスの pid がわからないので， escript 起動時に `register/2` しておく．
 - メッセージを送る際は対象ノードに rpc し，メインプロセスの名前に向かって `!` する．

```
-module(myapp).

%%
%% $./myapp hoge server
%% I am `hoge@localhost`
%% ...
%% received: {<5437.2.0>,connected}
%%
%% $./myapp fuga client "hoge@localhost"
%% I am 'fuga@mlocalhost'
%% connected to 'localhost'
%%

-export([
    main/1,
    rpc_send_message/1
        ]).

%% Macro
-define(MYNAME, myname).

%% Exported

main([NodeNameStr, Command|Rest]) ->
    NodeName = list_to_atom(NodeNameStr),
    net_kernel:start([NodeName]),
    io:format("I am ~p~n", [node()]),
    true = register(?MYNAME, self()),
    case Command of
        "server" ->
            do_receive();
        "client" ->
            [ServerNodeStr] = Rest,
            do_connect(list_to_atom(ServerNodeStr))
    end.

rpc_send_message(Msg) ->
    ?MYNAME ! Msg.

%% Internals

do_receive() ->
    receive
        Msg -> io:format("received: ~p~n", [Msg])
    end.

do_connect(ServerNode) ->
    case net_kernel:connect(ServerNode) of
        true ->
            io:format("connected to ~p~n", [ServerNode]),
            Self = self(),
            rpc:call(ServerNode, myapp, rpc_send_message, [{Self, connected}]);
        false ->
            io:format("connect failed~n")
    end.
```
[PHP] 日本語が出力できないときは文字コードを疑え

日本語が格納された変数を `htmlspecialchars` すると **"空"** になる

```example.php
$example = 'こんにちは';

/* なにも表示されない */
echo htmlspecialchars($example, ENT_QUOTES, 'UTF-8');
```

#原因は文字コード
簡単なコードだったので、メモ帳を使ってつくった
　　↓
エラーメッセージに日本語を使ってる
　　↓
メモ帳の文字コードは`Shift_JIS`
　　↓
文字化け
　　↓
出力の際の`htmlspecialchars`が化けた値を削除？
　　↓
空に。

ということらしい。

第3引数に`SJIS`を指定するか、ファイルの文字コードを`UTF-8`にするとなおった

```example.php
htmlspecialchars($example, ENT_QUOTES, 'SJIS');
```

メモ帳を使ってコーディングする際はご注意を

#追記
[[PHP]htmlspecialchars()を使うと文字が消える？ | PHP Archive](https://php-archive.net/php/htmlspecialchars/)
> この引数を省略すると、PHP 5.4.0 より前のバージョンでは ISO-8859-1 、PHP 5.4.0 以降では UTF-8 が指定されます。
> そして、指定されたエンコーディングとして有効でない文字は切り捨てられます。 

とのこと
Androidの一部の機種で Flutter v0.0.21だと起動できない？

2018/03/07追記: [#4742](https://github.com/flutter/engine/pull/4742) で、この問題がなおったらしい。最新版の Flutter では問題ないかもしれません。確認できたら、さらに追記します。

----

v0.0.21 以降を使ったバージョンをリリースしたところ、自分の手持ちのデバイスおよび、Firebase Test Lab にリストされている実機ではクラッシュしないのですが、ごく少数の Android ユーザーから「起動できない」という報告がありました。GitHub でも Issue が立っていたりするので、起動できない問題は実際にあるようです。

関連 Issue:

- https://github.com/flutter/flutter/issues/14491
- https://github.com/flutter/flutter/issues/14504

この問題は Flutter v0.0.21 以降で発生しており、v0.0.20 では起きません。また、もしかしたら、使用しているアセットが少ないと、v0.0.21 以降でも問題ないかもしれません。

クラッシュが発生する特定の機種が手元にないので、確認が難しいですね……。

Flutter アプリ側で使用するアセットを、Android/iOS側でも使えるようにできる修正が v0.0.20 と v0.0.21 の間にあり、それが原因なのではないか……というところで、修正中（2018.02.14現在）です。

なお、iOS では問題は起きていないようです。

というわけで、自分のところでは v0.0.20 をベースにしてアプリをリリースしています。ところが、v0.0.20 には Android 4.1, 4.2 でクラッシュする不具合があるので、flutter/engine に以下の変更をチェリーピックしてカスタムビルドしています。

https://github.com/flutter/engine/commit/e1b01d7d7bdacf8167bdcd6366e404b3b90a072c
HTML5の書き方_3(外部CSS)

# 記述方法

```外部css
<link href="ディレクトリ/ファイル名.css" rel="stylesheet" type="text/css">
```

### 各種説明
1.linkタグ
記述しているhtmlファイルとcssファイルもしくは別htmlファイルを関連づける

2.rel属性
そのファイルとどういう関係であるのかを示す
上記の場合は「ファイル名.cssはスタイルシートですよ～」と示してる

3.href属性
↓に記載↓
[HTML5の書き方_2(リンクの貼り方)](https://qiita.com/2_MaYu_2/items/b8b4e7fdc03361adec4d)

4.text属性
ブラウザ(クライアント)側にドキュメントタイプを伝える
※詳しいところは今のとこわからないが入れておいたほうが無難
ちなみ上記の場合だと「cssは人間が理解できる記述だよ～」ということらしい

5.aタグとの違い
linkタグは内部的なもの(headタグ内に記載)
aタグは見せるもの(bodyタグ内に記載)

6.記述場所
&lt;head&gt;&lt;/head&gt;の中に記述する

### 注意点
・属性の順番はなんでもよい
・ディレクトリは記述するhtmlファイル上から記述

### 感想
text属性は意味わからんな
今度調べよう
GCPと連携してPepperに感情分析機能を搭載

##概要
Pepper(ペッパー)にテキスト文からの感情を分析する機能（ネガポジ判定）を搭載しました。

外部APIとしてGoogle Cloud Platform(GCP)のNatural Language APIを利用しています。

今回載せたコードは[PythonでGoogle Natural Language APIを叩いて感情分析](https://to-kei.net/python/google-natural-language-api/)をほとんどそのまま使い、Pepperで動くように書き換えています。

###PythonSDK
PythonSDK(PythonだけでPepperの開発が出来るSDK)を使って開発しています。PythonSDKについて詳しくは↓

https://qiita.com/kyohara/items/ae0dd0f57413caa90674 (PythonSDKの導入方法)
https://qiita.com/Atelier-Akihabara/items/3289e60985586b8da709 (Python SDKによるsay hello)
http://naoqi.memo.wiki/d/Python%20SDK (PythonSDKリファレンス)

##ソースコード

ご自身のペッパーのIPアドレスと、APIキーを入力すれば、実行できます。

```python:sentiment.py
#coding:utf8
from naoqi import ALProxy #pepperのライブラリを使うため
import requests

#ペッパーの接続情報
pepperIP = "YourPepperIPaddress"

APIkey = "YourAPIkey"

#感情分析に使うテキスト文章
text = "今日食べたケーキ、美味しかった！"

#インスタンスを生成
tts = ALProxy("ALTextToSpeech",pepperIP,9559)

#APIのurl情報
url = 'https://language.googleapis.com/v1/documents:analyzeSentiment?key=' + APIkey

#各種設定
header = {'Content-Type': 'application/json'}
body = {
    "document": {
        "type": "PLAIN_TEXT",
        "language": "JA",
        "content": text
    },
    "encodingType": "UTF8"
}

#分析結果の格納
response = requests.post(url, headers=header, json=body).json()

#とりあえずペッパーに挨拶させとく！
tts.say("こんにちは！")

#こちらが話した内容によってペッパーの反応を変更
#ポジティブな内容のとき
if response["documentSentiment"]["score"] >= 0.5:
	tts.say("なんだか嬉しそうだね！")

#普通の内容のとき
elif response["documentSentiment"]["score"] < 0.5 and response["documentSentiment"]["score"] >= -0.5:
	tts.say("何かいいことがあるといいね！")

#ネガティブな内容のとき
else:
	tts.say("なんだか元気がないぞーーー！！")

```

##実行すると、、、
入力したテキストの文章によって、ペッパーの反応が変わります。-0.5未満、-0.5以上0.5未満、0.5以上で分けました。（このAPIは感情を-1.0~1.0の間で分析。0以上がポジティブ、0以下がネガティブ）
今回は、3パターンにしましたがもうちょっと細かくしてもいいのかもしれませんね。


##まとめ
これでペッパーが日本語から感情を読み取れるようにパワーアップしました！しかし、テキストベースだとまだまだ実用性に乏しい、、、。次は**ペッパーに音として認識させた内容を感情分析させる**といったことに取り組みたいと思います。



by アトリエスタッフ
GCP認定資格Professional Cloud Architectを取得しました

Google Cloud Platform認定資格「Professional Cloud Architect」を取得したので、合格までの道のりや勉強方法を書き溜めておきます。

# 事前情報

## 私のこと
インフラエンジニアです。
GCPの経験はありませんが、AWS/Azureはそれなりに分かっています。

* AWS
    * ソリューションアーキテクト アソシエイト
* Azure
    * MCP 532/533/534 
* GCP
    * 経験なし

## 試験結果
合格  

試験後に点数は表示されませんし、結果レポートも出ません。
なので自分が何点取ったかは不明。
確実に正解かなという問題は5割強くらいでした。

## 総勉強時間
15時間くらい

# GCPアカウント取得
触るのが1番の近道なのでまずはGCPのアカウントを取得します。
ここはググれば手順がいっぱい出てくるので割愛します。

# 試験概要確認
試験概要を確認しましょう。

[認定試験ガイド](https://cloud.google.com/certification/guides/cloud-architect/?hl=ja#certificate-exam-guide)

とりあえずなんか試験範囲広そうだなぁくらい思っておけばよいです。

時間：2時間
問題数：50問

# 他の方の体験記を見てみる
先人の知恵を借りましょう。以下の記事を参考にさせて頂きました。

[Google認定プロフェッショナル クラウドアーキテクト試験](https://qiita.com/onooooo/items/86659d3f15b9ab25c0fe)

[Google公認プロフェッショナル - クラウドアーキテクトを受けてみた](https://qiita.com/sirotosiko/items/e363997d8166b9fb3476)

見てみると皆さん書籍から入っているのでそれに習います。

# 書籍購入

[プログラマのためのGoogle Cloud Platform入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEGoogle-Cloud-Platform%E5%85%A5%E9%96%80-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F%E3%81%8B%E3%82%89%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E6%A7%8B%E7%AF%89%E3%81%BE%E3%81%A7-%E9%98%BF%E4%BD%90/dp/4798137146/ref=sr_1_1?ie=UTF8&qid=1518482875&sr=8-1&keywords=GCP)

内容は解説→チュートリアルという流れです。一通り本の通りにやってみました。
良本ですね。「プログラマのための」と書いてある通り、GCP解説の前に基本的なインフラの解説が入ります。
インフラエンジニアにとっては基本かもしれませんが、改めて読んでみるととても勉強になります。
書籍を一通り読み終わるとGCPのことが分かった気になります。

ここまでで大体10時間くらい

# 模擬試験
なんだかGCPのことが分かった気になったので模擬試験を受けてみました。
GCPの模擬試験は無料で何回でも受けれるのでいいですね！

[模擬試験](https://cloud.google.com/certification/practice-exam/cloud-architect?hl=ja)

正解率は5割強でした。

# 足りないところは独学で
模擬試験の結果を受けて、Dataflow、Pub/Subといったビッグデータ関連サービスの理解が乏しいことが分かりました。
ビッグデータを中心に公式ドキュメントから全体的にサービス内容を把握するのと、実際に触って理解を深めました。

ここまでで大体15時間
受験したら無事合格でした

# まとめ
書籍を一通りやって模擬試験受ける、足りないと思ったところを公式ドキュメント見ながら触ってみる。で、合格できました。
インフラやパブリッククラウドがある程度分かってる場合はこれくらいの勉強量でいけるかなと思います。

導入事例のサンプルについてはほとんど事前に見てないです。
試験にももちろん出ましたが、事例関係ない問題が多かったのと、試験当日見ても問題ないかなと。

試験時間は120分ですが、時間は20分あまりくらいでした。

# 追記：フード付きトレーナーが届きました！
合格したらおめでとうございますメールが届きます。
それに従って申請すると、2ヶ月後くらいにフード付きトレーナーが送られてきました！
かっこいい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/13583038-7e6b-9789-6331-9bf518a091c5.png)
Pythonで音を録音して可視化する

# はじめに

「音をテーマに機械学習の題材を調査する」という宿題を頂いたことから、まずは音を収集する方法を調べてみたのでメモします。

# 環境

- MacBook Air
- Python 3.6.0 Anaconda custom (x86_64)
- Jupyter Notebook

# ライブラリのインストール

pyaudioというのを使うとすぐにできるという情報があったのでインストールします。

まずは依存しているPortAudioというライブラリをインストールします。

[PortAudio](http://www.portaudio.com)

```
./configure --disable-mac-universal && make
sudo make install
```

Macでは、pyaudioをインストールしようとすると「pa_mac_core.hがないよ」って言われるので、以下のコマンドでコピーしておきます。

```
sudo cp include/pa_mac_core.h /usr/local/include/
```

引き続き、pyaudioのインストール

```
pip install pyaudio
```

以上。

# 録音と可視化

[raspberryPi と pyaudioで録音、音声波形処理](http://hanpakousaku.tumblr.com/post/105771613672/raspberrypi-と-pyaudioで録音音声波形処理)

上記のサイトに音を録音してファイルに保存する方法が記載されていたので、こちらを参考にさせて頂きました。

```py:
import pyaudio
import sys
import time
import wave

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 3

p = pyaudio.PyAudio()

stream = p.open(
    format = FORMAT,
    channels = CHANNELS,
    rate = RATE,
    input = True,
    frames_per_buffer = chunk
)

all = []
for i in range(0, int(RATE / chunk * RECORD_SECONDS)):
    data = stream.read(chunk)
    all.append(data)

stream.close()
p.terminate()

data = b''.join(all)
```

ここで、dataに音のデータが入るので、これを以下の手順で可視化します。

```py:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.frombuffer(data, dtype="int16") / 32768.0

plt.figure(figsize=(15,3))
plt.plot(x)
plt.show()

x = np.fft.fft(np.frombuffer(data, dtype="int16"))

plt.figure(figsize=(15,3))
plt.plot(x.real[:int(len(x)/2)])
plt.show()
```

柏手を数回打った音を録音した結果を可視化すると以下のとおりでした。

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/1f20b4c8-9371-199f-d13f-08602d30459b.png)

![Unknown-2.png](https://qiita-image-store.s3.amazonaws.com/0/114240/7b79711a-f0dc-abe4-0ecf-158fcc470f7c.png)

上が音の波形で、下がFFTの結果です。

ということで、さてこれからどうしよう...(^_^;)

# その後

スクリプトを改造し、以下の記事を書いてみました。あわせてご覧下さい(^-^)

[Pythonで音を監視して一定以上の音量を録音する](https://qiita.com/mix_dvd/items/dc53926b83a9529876f7)
【vimrc】set expandtabしててもnoexpandtabになってしまう件

普段そんなことなかったのに新しいMacで今までと同じ設定いれたらなぜかタブ入力するとそのままタブが入ってしまうことがあったのです。
（字面だけ見るとそりゃそうだろ。って話ですけどそういう話じゃないんですｗ）


vimrc上、

```
"set number
set ruler
set incsearch
set hlsearch
"set nowrap
set showmatch
"set whichwrap=h,l
set wrapscan
set ignorecase
set smartcase
set hidden
set history=2000
set autoindent
set expandtab
set tabstop=2
set shiftwidth=2
set paste
```

で、
`set expandtab`

しているのですが、

`:verbose set expandtab?`
で確認すると。

```
noexpandtab
        Last set from ~/.vimrc
```


となってしまうという不思議な状態。

## 解決方法

`set expandtab`

を

`set paste`

の下に持っていってあげたら解決しました。

おそらく何かが邪魔していたのでしょうが深くは気にしないことにします。

誰か詳しい人教えてください。
Rails5.1をDockerに乗せて開発する


## はじめに
Dockerの勉強をするために趣味で開発しているRailsプロジェクトを途中からDockerで立ち上げるようにしました。
その際の手順と感じたことをメモしていきます。

今回はRails newからではなく、もともとあるプロジェクトをDockerで立ち上げていくようにします。

## バージョン
 - Docker for mac 17.12.0-ce-mac49
 - Docker 3
 - Ruby 2.4.2
 - Rails 5.1.4

## Rubyのimageをpull
```
$ docker pull ruby:2.4.2
```

## Dockerfile
まずは`Dockerfile`を設定していきます。
railsプロジェクトのルート直下に`Dockerfile`というファイルを作成します。

今回`Dockerfile`でやっていることとしては、`ruby:2.4.2`のimageを元にRailsプロジェクトを立ち上げるimageを作成しています。


```.dockerfile:Dockerfile

FROM ruby:2.4.2

RUN mkdir /app

ENV APP_ROOT /app

WORKDIR $APP_ROOT

# 必要なものをインストール
RUN apt-get update
RUN apt-get install -y nodejs mysql-client --no-install-recommends
RUN rm -rf /var/lib/apt/lists/*

# ホスト側のGemfileをコピー
ADD Gemfile $APP_ROOT
ADD Gemfile.lock $APP_ROOT

# bundle install
RUN  bundle config --global build.nokogiri --use-system-libraries
RUN  bundle config --global jobs 4
RUN  bundle install

ADD . $APP_ROOT

# docker runした時に起動するコマンドを設定、ポートは3000を設定
EXPOSE  3000
CMD ["rails", "server", "-b", "0.0.0.0"]
```
 - Railsプロジェクトのルートディレクトリで以下を実行してimageを作成します。

```
docker build -t project_name .
```

 - `-t`オプションをつけることでリポジトリ名をつけることができます
 - `docker images`を実行してimageが確認できれば成功

```
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
project_name        latest              bfdf79815c47        About a minute ago   1.32GB
```

## docker-compose
次に`docker-compose`を作成してコンテナ起動の設定をしていきます
ここでは主に環境変数の設定とボリュームの指定、ポートの設定を行なっています(ちょっとまだ理解しきれていない感じがするので、もっと改善する場所があるかもしれないです..特にボリューム)

```.yml:docker-compose.yml
version: '3'
services:
  app:
    build: .
    command: bin/rails s -b "0.0.0.0"
    env_file: .env # railsの環境変数を.envで記載する場合
    ports:
      - "3000:3000"
    volumes:
      - ".:/app"
    depends_on:
      - db
  db:
    image: mysql:5.7.10
    environment:
      MYSQL_ROOT_PASSWORD: password # 本番環境では別ファイルで管理すること
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/mysql-data:/var/lib/mysql
volumes:
  mysql-data:
```

 - 作成できたらコンテナをビルドします

```
$ docker-compose build
```

 - 次にコンテナを起動

```
$ docker-compose up
```

- DBが作成されていないので作成します(ついでにmigrateも実行)

```
$ docker-compose run --rm app rake db:create db:migrate
```

これでブラウザからRailsプロジェクトの動作が確認できるはずです！！！

## 注意点
以上でDockerの環境はできましたが、自分で調べている際にハマったことがあります
### Dockerのバージョンには気をつけること

日本語の記事はほとんど(自分が調べた限りでは)version2で書かれたものでした
なので`docker-compose.yml`で`volumes_from`や`extends`などのコマンドが使えなかったのでハマって時間がかかりました。
まあバージョンの確認しなかった自分が悪いのですが...バージョン確認は基本なのにできていなかった...
あとはDockerに限らずですが、ちゃんと公式を見たほうがいいなと思いました

## まとめ
一旦Railsプロジェクトを途中からDockerに載せる手順をずらっと書いてきました、自分自身Dockerに関してはまだまだ勉強中なので何か指摘があればコメントをお願いいたします:bow:

## 参考
https://qiita.com/togana/items/30b22fc39fe6f7a188ec かなり参考になりました:bow:
iOS開発をするときに、エンジニア的にやめて欲しい・気をつける必要のあるデザイン まとめ

iOSアプリを開発していると、開発、デザインを別々の会社が行うことがよくあります。

できるデザイナーさんがデザインしてくれたデザインで有れば無理なく実装が可能ですが、たまにちょっと困る指示書を出してくるデザイナーさんもいらっしゃいます。

ここでは、

* こんなデザインが来たら、実装時に気をつける必要がある
* 個人的にデザイナーさんになるべく避けて欲しいデザイン
* **こんなデザイン指示書はやだ**

について、紹介します。
**最近開発していた案件のデザインで苦労した八つ当たりついでに書いてます。ごめんなさい。**

# フォントにヒラギノを指定

iOSでフォントをヒラギノ系を使用すると、思わぬところでテキストが切れることがあります。
ボタンないのテキストが切れたり、autolayoutでサイズの自動拡大・縮小の計算がずれたりと、とっても大変なので、ヒラギノは使わないで頂けると助かります。

ある程度、作成した後に、フォントが切れていることに気付くと悲惨なことになります。

## 対策

* [UIButtonでヒラギノフォントが切れる対策](https://qiita.com/Sasakky/items/0243ed45113f8797e81e)
* [iOS でヒラギノフォントが明示的に指定された時に描画サイズの計算が正しくならない問題を修正する](http://akisute.com/2015/11/ios.html)

# 一つの解像度しか考慮していないデザイン & 細かいデザイン指示書

かなり昔で有れば、一つの解像度のみを対応すれば良い時代がありましたが、今はiPadでも複数解像度に対応する必要がある時代です。
iPhone専用アプリでも、iPadで表示可能にさせる必要があるため、最低でも、2つの解像度に対応させる必要があります。

**特に、細かいデザイン指示があるのに、複数解像度に対応していない指示書が来た時は、
見積もり、実装・テスト中にエンジニアは警戒する必要があります。**

デザイン指示書等で、一切考慮されていないと、何度もクライアントさんとエンジニアがデザインの調整を行う羽目になることが多いです。
複数解像度に対応していないデザインの時は、デザイン指示書を作成せず、スクショと素材だけいただけると嬉しいです。
（実装側で、いい感じに調整しやすいため）

# つじつまが合わないデザイン指示書

似たデザインなのに、paddingが変わってたり、フォントサイズが合っていなかったりすると、アプリの見た目がガタガタになります。
やばいです！

大抵の場合、クライアントさんとデザイナーさんとエンジニアとで調整が必要になってしまうので、最低限揃えてください。

# 標準UIにデザイン指示を入れてる

UIPickerなど、ただの標準UIにデザイン指示が入っている指示書が割とあります。
標準UIとほぼ変わらないデザインを指示書に指定を書かれると、デザイン指示書通り必ず作成しなければいけない開発の場合、無駄な工数がかかりまくります。

標準UIとほぼ変わらないものを作成するのは、クライアントさんにとっても無駄な工数の可能性が高いので、拘らずにOS準拠とか描いて頂けると嬉しいです。
（クライアントさんにこだわりがあるので有れば、別です。。）

# デザインの納品が何回も伸びる

デザインの納品が伸びても、開発側の納期が伸びないことが不思議とよくあります。（ひどいです）
すべて、開発側にしわ寄せがくるので、納期は守って欲しいです。
Local by Flywheelで開発したサイトをロリップにアップロードする

#Local by Flywheelとは
[Local by Flywheel](https://local.getflywheel.com/)からインストールできる、簡単にwpのローカル環境を構築できるツールです。
インストールも環境構築も簡単なのでとても便利です。

#ファイルのアップロード
一気にファイルをアップロードする必要があるのでCyberDuckというFTPソフトを用いました。ここではその使い方の説明は省略します。
ロリポップの公式の説明では`/wordpress`にファイルをアップロードするようにと書いてあるのですが、ややこしくなるのでrootにアップロードします。
Local by Flywheelで開発したファイルのうち`app/public/`以下のファイルをFTPでロリポップにアップロードします。**このときに、wp-config.phpというファイルだけはアップロードしないようにしてください。**

#DBの作成
ロリポップの管理画面からデータベースを作成してください。

#wordpressをロリポップにインストールする
rootディレクトリにアクセスします。すると、wordpressのインストール画面が出てくるので、指示にしたがってインストールしてください。**このとき、Local by Flywheelで作成したユーザー名やパスワードを指定するようにします。**

#ローカルのDBをロリポップのDBにインポートする
ここが一番難しくなります。
なぜかというと、リンク等が絶対パスで保存されているからです。そのため、それらを書き換えてからインポートする必要があります。二つ方法があるので、ふたつとも紹介します。

##ローカルの管理画面からDBを変更する方法
**この方法のまずいところは、ローカルのサイトが変更した瞬間にアクセスできなくなってしまうことです。そのため、この変更を行う前にローカルのDBをエクスポートするなどしてバックアップをとって置く必要があります。**

それでは、手順を説明します。
まず、ローカルで管理画面から一般設定を開きます。そこから、サイトのアドレスと書いてあるところを変更します。そして、Local by Flywheelのdatabaseのタブのところから、adminerを起動してエクスポートのところから保存を選択してエクスポートします。
次に、ロリポップのphpMyAdminを開き、インポートを選択します。このときに、インポートしたいDBを選択しておく必要があるようです。（でないと、No Database ..的なエラーが出ます。）これで、DBの移行が完了です。

##DBを直接変更する方法
上記の方法と同じようにDBをエクスポートしてきます。そのファイルをeditorで開いて、ローカルのドメインを全て実際の環境のドメインに書き換えます。
あとは同じように、ロリポップにDBをインポートして完了です。
sqlファイルは重いので、比較的DBが小さいときにしか使えませんが、簡単で楽なのはこちらです。

#おわりに
DB関連がややこしくて嵌ったのでまとめてみました。Local by Flywheelは便利ですが、比較的新しくソースがあまりなかったので参考になれば、と思います！
Vue.jsの単一ファイルコンポーネントでTypeScriptを使う方法

最初どうやるのか分からなくて、単一ファイルコンポーネントの書き方かTypeScriptどっちか諦めざるを得ないと思ったがそんなことなかった。

## 前提
* `typescript` や `ts-loader`がインストールされている
* tsconfig.json がある

## 方法
プロジェクト内に `index.d.ts` というファイルを作成し、中身を下記のように記述します。ちなみにファイルの設置箇所とファイル名についてですが、拡張子が `.d.ts` で `tsconfig.json`内の`path`に含まれるようならどこでもどんな名前でもいいみたいです。

```js:index.d.ts
declare module "*.vue" {
  import Vue from "vue";
  const _default: Vue;
  export default _default;
}
```

これによりTypeScriptが `.vue` の拡張子のファイルを認識してくれるようになります。

あとは単一ファイルコンポーネント内の `<script>` のところで `lang="ts"` をすればバッチリです。

```html:Sample.vue
<template>
  <h1>tsが使える！！</h1>
</template>

<script lang="ts">
//your awesome code
</script>
```
mysqldumpの--databasesオプションを勘違いしていた話

一言にすると、
「"特定のデータベースのみdumpする場合、かならず--databasesオプションが必要である"と勘違いしていた」という話です。

# 失敗例
あるデータベースdb_aのフルダンプを取って、
同じホストにある別のデータベースdb_bにそれをリストアしようとしていました。

```shell
# databases以外のオプションは省略して記載しています
mysqldump -uUSER -hHOST -p --databases db_a | gzip -9 > db_a_dump.sql.gz

# 上記のdumpをリストア
gzip -dc db_a_dump.sql.gz | mysql -uUSER -hHOST -p db_b
```

しかし、これだとdb_bではなく **db_aにdumpしたデータが入ります** 。

# 何が問題だったのか
公式リファレンスを確認してみましょう。
https://dev.mysql.com/doc/refman/5.6/ja/mysqldump-sql-format.html

> 特定のデータベースのみをダンプするには、コマンド行でそれらを指定し、--databases オプションを使用します。

この記述だけを見て、「複数DBが乗っているサーバでdumpをとる場合は--databasesでDB名を指定しないといけないのだ」と勘違いしていたのです。

--databases引数を指定しなくても、DB名を記載していれば特定のDBのみdumpを取得できます。
では何が違うか？ポイントはここです。

> --all-databases または --databases を使用すると、mysqldump は、各データベースのダンプ出力の前に、CREATE DATABASE および USE ステートメントを書き込みます。これにより、ダンプファイルがリロードされると、それが各データベースが存在しなければ作成して、デフォルトのデータベースにするため、データベースの内容がそれらの作成元の同じデータベースにロードされます。

つまり、--databasesを指定して作成したdumpファイルには以下の記述が含まれています。

```sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db_a`;

USE `db_a`;
```

そのため、以下のようにdb_bを指定してもそれが無視されたのです。

```shell
gzip -dc db_a_dump.sql.gz | mysql -uUSER -hHOST -p db_b
```

# 解決策
dumpを取得するDBとリストア先のDB名が異なる場合は--databases引数をはずしましょう。

```shell
mysqldump -uUSER -hHOST -p db_a | gzip -9 > db_a_dump.sql.gz

# db_a_dump.sql.gzには use db_a; の記述が入っていないため、
# db_bにリストアされます。
gzip -dc db_a_dump.sql.gz | mysql -uUSER -hHOST -p db_b
```

すでに--databases引数付きでdumpを取得してしまって再取得が難しい場合は……展開してsed等でDB名を置換ですかね。
(もう少しスマートな方法があれば教えてくださいっ)
【vim-go】関数呼び出し元を一覧表示

1.
呼び出し元を表示したい関数定義の上ににカーソルを置く

2.

```
:GoCallers
```

# 参考

vim-goドキュメント
https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt#L547
Font Awesome 5 Freeで疑似要素(:after,:before)のcontent指定する場合

[Font Awesome5](https://fontawesome.com/)のフリー版CDNを使った場合、疑似要素(:after,:before)のcontentにアイコンを指定する方法が、ver4とちょっとだけ違っていてハマったのでメモします。

CDNはこちらのCSS

```html
<link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
```

CSSで ```font-family: "Font Awesome 5 Free";```と指定

```css
a::after {
  font-family: "Font Awesome 5 Free";
  content: "\f107";

  -webkit-font-smoothing: antialiased;
  display: inline-block;
  font-style: normal;
  font-variant: normal;
  text-rendering: auto;
  line-height: 1;
}
```

ちなみにPro版だと ```font-weight: 900 (Solid), 400 (Regular or Brands), 300 (Light) ``` と切り替えられるみたいです。

参考: https://fontawesome.com/how-to-use/web-fonts-with-css#pseudo-elements

追記） 2018.03.07
一部のアイコンには、 ``` font-weight: bold; ``` を指定しないと表示されない模様。現在調査中です。

//追記ここまで


また[Brands(ブランド系)アイコン](https://fontawesome.com/icons?d=gallery&s=brands&m=free)を使う場合はfont-familyの指定が違う模様。

```css
.twitter::before {
  font-family: "Font Awesome 5 Brands";
  content: "\f099";
}
```

BrandsアイコンはFreeに全て同梱されててProとの差はないようなので（2018年2月14日時点）、Pro版購入しても修正の必要はなさそうです




# SVG置換する場合

JS版だと 疑似要素内のfont-familyを検索して、SVGに置換してくれる。

CDNからJavaScriptを読み込む

```html
<script>
  FontAwesomeConfig = { searchPseudoElements: true };
</script>
<script defer src="https://use.fontawesome.com/releases/v5.0.6/js/all.js"></script>
```

CSSの疑似要素に　font-family、contentをそれぞれ記述

- ```display: none;``` が必須。
- font-familyで Solid,Regular,Brandsを指定

```css
.sample1::before {
  display: none;
  font-family: "Font Awesome 5 Solid";
  content: "\f007";
}
.sample2::before {
  display: none;
  font-family: "Font Awesome 5 Regular";
  content: "\f1ea";
}
.sample3::before {
  display: none;
  font-family: "Font Awesome 5 Brands";
  content: "\f099";
}
```

.sample1 は実際にこんなHTMLに変換されます。

```html
<a class="sample1"><svg class="svg-inline--fa fa-user fa-w-16" data-fa-pseudo-element=":after" aria-hidden="true" data-prefix="fas" data-icon="user" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg=""><path fill="currentColor" d="M256 0c88.366 0 160 71.634 160 160s-71.634 160-160 160S96 248.366 96 160 167.634 0 256 0zm183.283 333.821l-71.313-17.828c-74.923 53.89-165.738 41.864-223.94 0l-71.313 17.828C29.981 344.505 0 382.903 0 426.955V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48v-37.045c0-44.052-29.981-82.45-72.717-93.134z"></path></svg><!-- <i class="fas" data-fa-pseudo-element=":after"></i> --></a>
```

font-familyの指定を "Solid" を "Regular" に変えてもフリー版にない太さだったら表示されないので注意。
自由に変更できるのがPro版。
Free版は使いたいアイコンが"Solid"か"Regular"かを毎回確認しないといけないから少し面倒かも。


参考：　https://fontawesome.com/how-to-use/svg-with-js#pseudo-elements
[Hololens] Unityエディタ上でのビルドエラー　error CS1929: 'SpatialInteractionController' does not contain a definition for 'TryGetRenderableModelAsync'

HoloLensアプリを作ってて、別のPCにUnityプロジェクト一式持ってきてビルドしたらエラーになって困った話。Unityのバージョンも同じなのに・・・なぜ？と思っていたら、**Windows SDKのバージョンが違ってた**件。

### 現象

PC-Aではうまくビルドできるけど、同じソースがPC-Bではビルドエラーになる。
Unityのバージョンは同じ。（Unity 2017.2.0f3）

### エラー内容
```
error CS1929: 'SpatialInteractionController' does not contain a definition for 'TryGetRenderableModelAsync' and the best extension method overload 'InteractionSourceExtensions.TryGetRenderableModelAsync(InteractionSource)' requires a receiver of type 'InteractionSource'
```
何かが足りてないよね、というのはすぐに想像ついた。

### 原因

Unityのバージョンは同じ（2017.2.0f3）だったけど、SDKのバージョンが違ってた。
![unityerror.jpg](https://qiita-image-store.s3.amazonaws.com/0/231781/6b6cbec6-072b-c4ef-28f9-8c056de2483f.jpeg)

どっちのPCも「Latest installed」って表示されてたので、なかなか気づけなかった。。。
プルダウンあけてみると、候補に出てくるバージョンが違ってた。

### 解決策

Windows SDKをどうやって上げようかと思ってたら、Visual Studioのバージョンが違うことに気づいた。
- PC-A(ビルド通る方)：Visual Studio Commnunity 2017 Version 15.5.4
- PC-B(エラーの方)　：Visual Studio Commnunity 2017 Version 15.1
　　→ 最新版（15.5.6）にアップデートしたら、SDKのバージョンも揃った。ビルドも通った。
solidity の memory とか storageというkeywordが実際に何をしているのか

##公式ドキュメント
[公式ドキュメントのFAQ](https://solidity.readthedocs.io/en/latest/frequently-asked-questions.html#what-is-the-memory-keyword-what-does-it-do)に書いてありました。

---
What is the memory keyword? What does it do?
The Ethereum Virtual Machine has three areas where it can store items.

The first is “storage”, where all the contract state variables reside. Every contract has its own storage and it is persistent between function calls and quite expensive to use.

The second is “memory”, this is used to hold temporary values. It is erased between (external) function calls and is cheaper to use.

The third one is the stack, which is used to hold small local variables. It is almost free to use, but can only hold a limited amount of values.

For almost all types, you cannot specify where they should be stored, because they are copied everytime they are used.

The types where the so-called storage location is important are structs and arrays. If you e.g. pass such variables in function calls, their data is not copied if it can stay in memory or stay in storage. This means that you can modify their content in the called function and these modifications will still be visible in the caller.

There are defaults for the storage location depending on which type of variable it concerns:

state variables are always in storage
function arguments are in memory by default
local variables of struct, array or mapping type reference storage by default
local variables of value type (i.e. neither array, nor struct nor mapping) are stored in the stack

---

##以下解説
Ethereum Virtual Machene (EVM)　には3つのストレージ領域が存在します。

###1. storage
storage領域は、全てのcontractに対して割り当てられた領域で、全ての状態変数はこの領域に保持されます。データは複数の関数呼び出しの間でも永続的に保持されますが、使用には非常にコスト（gas）がかかります。

###2. memory
これは一時的な値を保持するストレージで、複数の関数呼び出し間で値は保持されませんが、コストはやや安くなります。

###3. stack
stackはローカル変数をほぼ無料で保持できますが、使用量に制限があります。ローカル変数は基本スタックに保存されるが、structとarray,mappingはデフォルトでstorageを参照する。つまり、ローカル変数のstruct,array,mappingは関数の中で書き換えることができる。

struct,array,mapping以外の値は使われるたびにコピーされるため、ほぼ全ての型に関して、変数がどこに格納されているかを知ることはできない。

***変数とストレージまとめ***
- 状態変数はstorageに保存される
- 関数の引数はデフォルトでmemoryに保持される
- ローカル変数でも、struct,array,mappingはデフォルトでstorageを参照する。
- struct,array,mapping以外のローカル変数はstackに保持される。

こんな感じ。最近solidity楽しくなってきた。
How to disable SSH Host Key Checking

### How to disable SSH Host Key Checking


 **StrictHostKeyChecking no**
 **UserKnownHostsFile=/dev/null**



- after

```/etc/ssh/ssh_config

Host *
	StrictHostKeyChecking no
	UserKnownHostsFile=/dev/null

```

```/etc/ssh/sshd_config

# GSSAPI options
#GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

```


- before

```/etc/ssh/ssh_config

Host *
	GSSAPIAuthentication yes

```


```/etc/ssh/sshd_config

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

```
AWS EC2 Tomcat セットアップ

AWS EC2のCentos7でTomcatをセットアップしたので、
忘備録として残しておこうと思います。

# EC2でインスタンス生成

まず最初にAWSにログインし、EC2でインスタンスを作成する。

その際、8080番ポートをセキュリティグループに追加しておく。

# Java jdkをインストール

Javaのjdkとコンパイラをyumでインストールする。
`$ sudo yum install java-1.8.0-openjdk-devel`
(バージョンは適宜変更する。openjdk-develをつけないとコンパイラがインストールされないので注意。)
`$ java -version`
`$ javac -version`
を入力し、バージョン情報が表示されたら次へ進む。

# Tomcatをインストールする

Tomcatをyumでインストールする。
`$ sudo yum install tomcat` 
終わったらブラウザで確認できるようにwebappsと管理画面の管理に使用するadmin-webappsをインストールする。
`$ sudo yum install tomcat-webapps tomcat-admin-webapps`

# Tomcatを起動させる 

次のコマンドで本当にインストールされたか確認
`tomcat version`
表示されたらTomcatを起動させる
`$ sudo systemctl start tomcat`

このあと8080番ポートにアクセスする

ブラウザに猫が現れたら成功!!!

# 手こずったところ

####学校のネットワークのポートが空いていなかった

学校のネットワークで作業してたら8080番ポートが空いていなくてちょっと焦った。

###admin-webappsを入れ忘れた

admin-webappsを入れ忘れて猫に会えなかった。

# 思ったこと

Tomcatをセットアップしたけど、HelloWorld!しか作っていないので何かに使えないか考えることにします。
連続した日付の出力

```python
import datetime
from datetime import timedelta

start_date = datetime.datetime(2016, 8, 1)
end_date = datetime.datetime(2016, 8, 30)

target_date = start_date

while True:
    print(target_date.strftime("%Y%m%d"))

    if target_date == end_date:
        break

    target_date = target_date + timedelta(1)
```

そんだけ
Apache再起動時にmod_sslのパスフレーズを聞かれてシステムが動かなくなった話。解決まで。

## ことの発端
ことの発端は些細な事だった。
ある日とある会社のサーバの面倒を見ることになり、引き継いで間もないころ
「WordPressのアップロードがうまくいかない」との要望がきました。

まあよくあるphp.iniのアップロード容量制限で引っかかっていたため以下の設定を行う。

```
post_max_size = 30M
upload_max_filesize = 30M
memory_limit = 128M  # これは元々
```

php.ini変更はApache再起動が必要なため、再起動。

```
service httpd restart
```

はい、終わり。と思ったら。

```
Enter pass phrase for /path/to/ssl.key: 
```

という文字が・・・
ワナワナ・・・これからがほんとうの地獄だ・・・

## 今まで一回もApache再起動したことがなかった

お客様、表題の通りでございます。
誰もパスフレーズ知らないわけなんですよ。
そして、マゴマゴしている間、Apacheは止まっているため全サービスがダウン。
（10サービスぐらい動いていたｗ）
パニック！！ｗ

（冷静に考えればこの後の作業をぺぺぺーってやれば良かったんだけどね。）


## やってはいけないこと：過去のメンバーに事情聴取

運が良ければパスフレーズ分かるかもですが、100億％分かりません。
そんなことしてる間もサービスは落ち続けているのでやめましょう。

## １．とりあえずSSL止める。

SSLの設定が少数であれば、まずはその設定を外して再起動してしまいましょう。
それだけで、被害は減る可能性が高いです。
なのでVirtualHostの設定を確認して443の記述を根こそぎ消しましょう。
NSSLからリダイレクトさせてる可能性もあるのでそのへんも確認。

```
cd /etc/httpd/conf.d/
grep SSL *
```
SSLCertificateFile /etc/httpd/ssl/ssl-hoge.crt
こんな感じの行が見つかるのでその記述があるVirtualHostごとコメントアウトしましょう。

で、再起動。
他に設定が無ければ、再起動出来て、SSLのサイト以外は復旧出来るはずです。

## ２．今のSSL設定は諦める

あきらめましょう。

## 3.新たにCSR発行
SSL証明書の発行に当って、大概の会社は再発行が出来ると思います。
なので、新たな秘密鍵、CSRを作って新しい気持ちで証明書を再発行しましょう。

###　sslの再発行のために秘密鍵を作成

```
cd /etc/httpd/ssl/
openssl genrsa -des3 -out ssl-hoge.key 2048
# パスフレーズを外す
openssl rsa -in ssl-hoge.key -out ssl-hoge.key
```

###　CSR作成

```
openssl req -new -key ssl-hoge.key -out ssl-hoge.csr
```
※ CommonName（出来ればCSR情報全て）は以前のSSL設定のものと合わせましょう。そこで引っかかる可能性があります。

### SSL発行の管理画面からCSRをコピペする（会社によってやり方が違う可能性あり）

はい、こぴーあんどぺーすとです。

### 待つ

大体再発行に小一時間かかりそうです。無限にも思える時間の始まりです。


### 証明書がメールで送信されるのでコピーする
メールじゃない場合もあります。
その場合は、SSL発行管理画面等からダウンロードしたりしましょう。

### 証明書をサーバに置く

```
vi /etc/httpd/ssl/ssl-hoge.crt
```
※以前のCRTを書き換える形で置きましたが、ふつーにコピーでもOKです。

## コメントアウトを戻してapache再起動
パスフレーズは外した秘密鍵で作ったのでふつーに再起動出来るはずです。

## 最後に。
知らないサーバでいきなり再起動は、だめ、絶対！！
【備忘録】vCenter Server Appliance 6.5のインストールが80%で止まる問題について

#はじめに

私は月に1, 2回、25台ほどのクラウド上のベアメタル・サーバーにvSphere環境を同時に導入するという儀式を行っています。そこで急に詰まったので備忘録として書いておきます。

2018/2/17追記 この事象についてVMware KBの方に記事があるとコメントいただきましたので、そちらを参考に修正しました。
https://kb.vmware.com/s/article/51124


#事象

・vCSA(vCenter Server Appliance)をGUIツールを利用してインストールする際に80%のところで止まる。
・特にエラーが出るわけではない
・今までまったく同じ環境で問題なくインストールできていたが、ある日急にインストールできなくなった。
・25台が同じところでスタックした

#原因

・アプライアンスOSがbuildされてから1年でvCSAのovfに含まれている初期rootパスワードがExpireされ、インストール時に止まるように設定されている。


#解決策

**・最新のbuild番号のvCSAを利用する**
VMware KBにはこの方法が解決策として記載されていました。どのbuildのものがいつ利用できなくなるのかは下記URLで確認できます。
https://kb.vmware.com/s/article/51124
私はこの方法で解決しました。

**・導入するサーバーの時刻をパスワードが無効化される前の時刻に戻す**
コミュニティによるとどうしても古いbuildのものを利用したい場合はこの方法でも解決できそうです。もちろんサポートや動作保証の観点で全くおすすめできませんが。

**・ESXiのHost Clientからデプロイする**
こちらもコミュニティに記載がありました。
ESXiのHost Clientにはovfテンプレートから仮想マシンをデプロイする機能があるため、その機能を利用してvCSAを無理やりデプロイする方法です。もちろんおすすめしません。

~~・ESXiに無料版のライセンスを利用している場合は有料版のライセンスキーを導入する~~

#参考URL

詳しくはVMware Knowledge Baseをごらんください。
https://kb.vmware.com/s/article/51124

コミュニティでも議論されています~~が、結論は出ていないようです~~。
https://communities.vmware.com/thread/560551
DNSサーバ（ネームサーバ）を指定して、nslookup / digする方法

DNSサーバを自分で設置したり、設定をいじっていると、サーバを明示的に指定して`nslookup`や`dig`したいことがあります。

いつもやり方を忘れるのでリストにしました。

## DNSサーバを指定して、解決後のIPアドレスを取得

```bash
nslookup google.com 8.8.8.8
# nslookup [調べたいドメイン名] [DNSサーバのアドレス]

# --- 実行結果 (`nslookup google.com 8.8.8.8`) ---
# Server:		8.8.8.8
# Address:	8.8.8.8#53
#
# Non-authoritative answer:
# Name:	google.com
# Address: 172.217.26.46
```

nslookupをインタラクティブモードで使う場合は、以下のようにハイフンを入れます。

```bash
nslookup - 8.8.8.8
# > google.com (解決したいドメイン名を入れてエンターを押すと、インタラクティブに結果が返ってくる)
## Server:		8.8.8.8
## Address:	8.8.8.8#53
##
## Non-authoritative answer:
## Name:	google.com
## Address: 172.217.25.78
# > ...
```

## digコマンドで同じことをするには

```bash
dig @8.8.8.8 google.com
# dig @[DNSサーバのアドレス] [調べたいドメイン名]

# --- 実行結果 (`dig @8.8.8.8 google.com`) ---
# ; <<>> DiG 9.10.6 <<>> @8.8.8.8 google.com
# ; (1 server found)
# ;; global options: +cmd
# ;; Got answer:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23813
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
#
# ;; OPT PSEUDOSECTION:
# ; EDNS: version: 0, flags:; udp: 512
# ;; QUESTION SECTION:
# ;google.com.			IN	A
#
# ;; ANSWER SECTION:
# google.com.		69	IN	A	172.217.26.46
#
# ;; Query time: 36 msec
# ;; SERVER: 8.8.8.8#53(8.8.8.8)
# ;; WHEN: Thu Oct 03 12:17:25 JST 2019
# ;; MSG SIZE  rcvd: 55
```

nslookupよりも詳細なデータが表示されます。

### おまけ: どのDNSサーバから返ってきた情報なのかを得る方法

ANSWER SECTION が返答に追加されて、ネームサーバの詳細がわかるようになります。

```bash
dig google.com ns

# --- 実行結果 (`dig google.com ns`) ---
# ; <<>> DiG 9.10.6 <<>> google.com ns
# ;; global options: +cmd
# ;; Got answer:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33847
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
#
# ;; OPT PSEUDOSECTION:
# ; EDNS: version: 0, flags:; udp: 512
# ;; QUESTION SECTION:
# ;google.com.			IN	NS
#
# ;; ANSWER SECTION:
# google.com.		21599	IN	NS	ns3.google.com.
# google.com.		21599	IN	NS	ns1.google.com.
# google.com.		21599	IN	NS	ns4.google.com.
# google.com.		21599	IN	NS	ns2.google.com.
#
# ;; Query time: 102 msec
# ;; SERVER: 8.8.8.8#53(8.8.8.8)
# ;; WHEN: Thu Oct 03 12:12:08 JST 2019
# ;; MSG SIZE  rcvd: 111
```

ネームサーバ指定と組み合わせることも可能です。

```bash
dig @8.8.8.8 google.com ns

# --- 実行結果 (`dig @8.8.8.8 google.com ns`) ---
# ; <<>> DiG 9.10.6 <<>> @8.8.8.8 google.com ns
# ; (1 server found)
# ;; global options: +cmd
# ;; Got answer:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26086
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
#
# ;; OPT PSEUDOSECTION:
# ; EDNS: version: 0, flags:; udp: 512
# ;; QUESTION SECTION:
# ;google.com.			IN	NS
#
# ;; ANSWER SECTION:
# google.com.		21599	IN	NS	ns3.google.com.
# google.com.		21599	IN	NS	ns1.google.com.
# google.com.		21599	IN	NS	ns2.google.com.
# google.com.		21599	IN	NS	ns4.google.com.
#
# ;; Query time: 76 msec
# ;; SERVER: 8.8.8.8#53(8.8.8.8)
# ;; WHEN: Thu Oct 03 12:13:16 JST 2019
# ;; MSG SIZE  rcvd: 111
```