OmniAICreator/Qiita-1.07M huggingface dataset:
Raspbian Stretchで"iface eth0 inet dhcp"って書きたい。

Raspbian StretchでNode-redとDALIを動かすときにネットワーク周りでハマったのでメモ。

##/etc/network/interfacesにDHCP設定すると、起動時にdhcpcd.serviceエラーになる。


Jessieのときのソース(/etc/network/interfaces)は以下

```/etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

# iface eth0 inet manual

auto eth0
iface eth0 inet dhcp

auto eth0:0
iface eth0:0 inet static
    address 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

```

エラーを解消するには、/etc/network/interfaces.d 以下に拡張子なしでファイルを作れば読み込んでくれるらしい。
なので、/etc/network/interfaces と /etc/network/interfaces.d/hoge に分割(?)する。


```/etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

```

```/etc/network/interfaces.d/hoge

auto lo
iface lo inet loopback

# iface eth0 inet manual

auto eth0
iface eth0 inet dhcp

auto eth0:0
iface eth0:0 inet static
    address 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

```

##eth0が使えなくなってる問題
Stretchでeth0ではなく、個別の名前なってしまった。けど使いたいので、以下修正。

/boot/cmdline.txt  の末尾に
`net.ifnames=0`
をつけて、eth0の認識させる。
モックテスト de Mockito

##モックとは
>モックライブラリでは、例えば、テスト対象のクラスAが別のクラスBに依存している場合に、[...]クラスBをクラスB自身の実装に依存しないmock(ハリボテ)として生成し、更にそのメソッドの戻り値を任意に設定するという事ができます。これにより「クラスBがこういう状態でこういう値を戻す場合のクラスAのテスト」が容易に書けます。

引用：[Mockito初めの一歩](https://qiita.com/mstssk/items/98e597c13f12746c907d)

##モックライブラリ　Mockito (モキート）
[Mockito](http://site.mockito.org)は、モックを簡単に使えるように手助けしてくれるライブラリの一つ。
導入方法は簡単で、Mavenプロジェクトの場合は[ここ](https://mvnrepository.com/artifact/org.mockito/mockito-all)から好きなバージョンを選んでpom.xmlにコピペするだけ。
簡単な使い方としては、Mockito#mockメソッドもしくは@Mockアノテーションを使うと、そのクラスの実装に依存しないモックオブジェクトを生成することができる。
モックオブジェクトはメソッドごとに戻り値を指定することができ（これを「スタブ」という）、自分の思い通りのふるまいをさせることができる。

##モックオブジェクトをつくる

###Mock (訳：真似る)
全てのメソッドをモックする。対象のクラスのインスタンスに一切影響されない。
@Mockアノテーションか、mock()メソッドを用いる。
###Spy (訳：監視する)
一部のメソッドのみをモックする。
Mockと違い、対象のクラスのインスタンス通りのふるまいをする（スタブしない限り）。
@Spyアノテーションか、spy()メソッドを用いる。

[MockとSpyの違い](http://www.baeldung.com/mockito-spy)をまとめると、全てモックする(Mock)か、一部のみモックする(Spy)か。

##モックオブジェクトを操作する
###Stub (訳：端くれ）
モックオブジェクトの特定のメソッドが呼ばれたときに何を戻すかを指定すること。
スタブとはテスト対象の間接入力をテストシナリオに合わせて都合よく書き換えるためのもの。モックとはテスト対象の間接出力が正しいことを確認するためのもの。
任意の値に戻り値を指定することを「[スタブ化](http://tech.cm55.com/wiki/mockito/Manual)」というらしい。
通常、
`when(Mockオブジェクト.メソッド名()).thenReturn(戻したい値);
`を用いてモックのふるまいを指定する。
ただ、Spyの場合は 
`doReturn(戻したい値).when(Spyオブジェクト).メソッド名()`
 を用いる。

>Dummy: This is an object that is used only for code to compile and has no business logic associated with it, like a parameter passed to a function.
Fake: This is an object that has an implementation but not ready for production, like H2 in-memory database.
Stub:  This is an object that has predefined answers to method executions made during the test.
Mock:  This is an object that has predefined answers to method executions made during the test and has recorded expectations of these executions.
Spy: This is an object similar to stubs, but they additionally record how they were executed.
http://www.discoversdk.com/blog/getting-started-with-mockito

##Mockitoその他機能
###Verify (訳：検証）
`verify(クラス名, times(回数)).メソッド名(引数)`
指定したメソッドが、指定した引数を持って指定した回数だけ実行されたかどうか検証することができる。
テスト対象の中で、他クラスのメソッドを呼んでる部分をテストする際などに使うと良い。
（他クラスのメソッドの振る舞いは、他クラスのテストクラスでテストすればいいので、ここでは**呼び出されているかどうかの検証だけ**で十分。）
また、times(回数)の部分をnever()とすることで、**一回も実行されていないことを検証することも可能**。

##参考リンク
- [Getting Started with Mockito](http://www.discoversdk.com/blog/getting-started-with-mockito)
- [Unit tests with Mockito](http://www.vogella.com/tutorials/Mockito/article.html)
- [Getting Started with Mockito annotations](http://www.baeldung.com/mockito-annotations)
- [Mockito事始め](http://niwaka.hateblo.jp/entry/2015/09/19/171610)
- [Junitライブラリ「Mockito」の@Mockと@InjectMocksの使い方](http://javatechnology.net/java/mock-injectmocks/)
- [Junitライブラリ「Mockito」の@Spyの使い方](http://javatechnology.net/java/mockito-spy/)
- [Junitライブラリ「Mockito」のverifyの使い方](http://javatechnology.net/java/mockito-verify/)
Androidアプリの設定をadbからクリアする

Androidアプリを作っていると、アプリインストール時の時点まで設定等の情報を消したい時ってありますよね。

adbから直接削除することが可能です。

# 簡単に言うと
1. adb shellで端末に入って
2. コンソールから削除する

です。

# 前準備
## データを削除したい端末(or エミュレータ）にShellで入ります。

```
$ adb shell
```

## 削除するアプリのパッケージ名を知っておく
削除対象アプリのパッケージ名を調べます。

```
$ pm list packages
```

大量に出てくるので、何かユニークな文字列で`grep`するとよいでしょう。

```
$ pm list packages | grep sample
```

# データを削除する
下記コマンドのように投げます。

```
$ pm clear net.furusin.www.sample
```

これでログインテストやSharedPreferencesのテストが楽にできるようになります。
carthageでupdateの方法を指定する


利用するライブラリが多くなると、 `carthage update` が長くて困るってことありませんか？
そんな時のために、carthageのupdate方法をまとめます。
その時々で適切なやり方で、carthage updateするようにしましょう。

#### 環境

Homebrew 1.3.2
Carthage 0.24.0

#### carthage update ケース別種類

##### 一般

一般的に利用される `carthage update` は、下記コマンド。

```ruby
$ carthage update
```

##### 1つだけアップデートしたい場合

`carthage update` すると、Cartfileで設定しているライブラリ全てアップデートしてしまう。
例えばRxSwiftだけに限定したい場合は、下記コマンド。

```ruby
$ carthage update RxSwift
```

##### 複数指定してアップデートしたい場合

スペース区切りで記載すれば良いです。例えばRxSwiftとrealm-cocoaに限定したい場合は、下記コマンド。

```ruby
$ carthage update RxSwift realm-cocoa
```

##### platformを指定したい場合

`carthage update` すると、platform[Mac, iOS, tvOS, watchOS] 全てアップデートしてしまう。
例えばiOSだけに限定したい場合は、下記コマンド。

```ruby
$ carthage update --platform iOS
```

##### binaryを使用しない場合

```ruby
$ carthage update --no-use-binaries
```

##### Cartfile.resolvedを参照したい場合

`carthage update` はCartfileに記載された最新のライブラリバージョンをBuildする。
ただ、チーム開発などで、ライブラリのバージョンを揃えたいときがある。
このとき、下記コマンドを実行すると、Cartfile.resolvedに記載されたバージョンをBuildしてくれる。

```ruby
$ carthage bootstrap
```

##### 注意事項：Xcode再起動の必要

`carthage update` 後、すぐにXcode上で反映されない場合は、Xcodeの再起動をしましょう。

##### 注意事項：Carthage updateを行なう順番

`carthage update` 時、xcodeのバージョンを参照するようである。
つまり、現在のxcodeのバージョンに適したライブラリをBuildするようにする、ということ。
そのため、下記順番で実施することがおすすめ。

1. Xcodeをアップデート
2. carthage update

逆にしてしまうと、もう一度carthage updateするハメになってしまうかも。

#### 補足、まとめ

現状、知っている範囲でまとめてみました。
ただ、入れているライブラリの中にplatform[iOS]がなかった場合など、 `carthage update --platform iOS` がエラーになってしまいます。そういう場合は、 `carthage update` でまとめてやる方が良いかもです。

まあそれについては、また別の機会に。
kubeadmのインストール

## kubeadm対応ディストリ

|dist|対応|
|:--|:-:|
| CentOS 7 | o |
| Ubuntu 16.04 | o |
| Ubuntu 14.04 | x |
| debian 9 | x |
| debian 8 | x |
| CentOS 6 | x | 


### CentOS 7 にインストール

* [Installing kubeadm | Kubernetes](https://kubernetes.io/docs/setup/independent/install-kubeadm/)の方法では以下.xml〜エラーが出る。
    * [[Installation Failure] Mirror unavailable when yum install · Issue #37922 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/37922)
* 以下修正版

```sh:/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
```

```sh:
# selinux無効
setenforce 0

# docker-engine
yum install -y docker
systemctl enable docker && systemctl start docker

# kubeadm
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
```

### ansibleを使えば以下のようにかける

```rb:main.yml
- hosts: servers
  user: root

  tasks:

    - name: Disable SELinux
      selinux: state=disabled
    
    - name: Copy repo file.
      copy: src="files/kubernetes.repo" dest="/etc/yum.repos.d/kubernetes.repo"
    
    - name: Install docker
      yum: name=docker state=present

    - name: Install docker
      yum: name="{{ item }}" state=present
      with_items:
        - "docker"
        - "kubelet"
        - "kubeadm"
        - "kubectl"
    
    - name: Set docker service to start on boot.
      service: name=docker enabled=yes

    - name: Set kubelet service to start on boot.
      service: name=kubelet enabled=yes

    - name: upgrade all packages
      yum: name=* state=latest
```


## Ubuntu 16.04 の場合

ansibleで入れてみよう。

```sh:
mkdir files
touch ./files/docker.list \
 main.yml \
 hosts \
 run.sh
```

```rb:./files/docker.list
# deb https://apt.dockerproject.org/repo ubuntu-trusty main
deb https://apt.dockerproject.org/repo ubuntu-xenial main
```

```rb:main.yml
- hosts: server01
  user: root

  tasks:

    - name: Add docker gpg key.
      shell: "apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D"
    
    - name: Copy docker.list file.
      copy: src="files/docker.list" dest="/etc/apt/sources.list.d/docker.list"

    - name: Install docker-engine.
      apt: name=docker-engine state=present update_cache=yes
    
    - name: Set docker service to start on boot.
      service: name=docker enabled=yes
```

```sh:hosts
[server01]
11.22.33.44
```

```rb:run.sh
if [ ! -e /usr/sbin/ansible-playbook ];then
    sudo apt install -y ansible
fi
ansible-playbook -i hosts main.yml  -v
```

### kubeadmのインストール

```sh:
apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

echo "deb http://apt.kubernetes.io/ kubernetes-trusty main" > /etc/apt/sources.list.d/kubernetes.list

apt-get update
apt-get install -y kubelet kubeadm kubectl
```
Project Euler Q23 【非過剰数和】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
完全数とは, その数の真の約数の和がそれ自身と一致する数のことである. たとえば, 28の真の約数の和は, $1 + 2 + 4 + 7 + 14 = 28$ であるので, 28は完全数である.

真の約数の和がその数よりも少ないものを不足数といい, 真の約数の和がその数よりも大きいものを過剰数と呼ぶ.

12は, $1 + 2 + 3 + 4 + 6 = 16$ となるので, 最小の過剰数である. よって2つの過剰数の和で書ける最少の数は24である. 数学的な解析により, 28123より大きい任意の整数は2つの過剰数の和で書けることが知られている. 2つの過剰数の和で表せない最大の数がこの上限よりも小さいことは分かっているのだが, この上限を減らすことが出来ていない.

2つの過剰数の和で書き表せない正の整数の総和を求めよ.

## 解答
※実行には4分くらいかかります。

```bash
seq 28123 |
awk '{for(i=1;i<=$1;i++){if($1%i==0){s[NR]+=i}};print s[NR]-NR,NR}' |
awk '$1>$2{printf $2" "}' |
awk '{for(i=1;i<=NF;i++){for(j=i;j<=NF;j++){print $i+$j}}}' |
sort -u |
join -v1 <(seq 28123 | sort) - |
awk '{s+=$1} END{print s}'
4179871
```

できたけど約数の和を算出する処理でどうしても時間がかかってしまう。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/023.html
【練習】マークダウン記法を使ってみた

# **この記事の経緯**
今回Githubを使用するにあたって、『マークダウン記法(Markdown)』の使い方に慣れておかなければならないということで様々な応用を備忘という形で残します。



# **URL(リンク)の貼り付け**
Google
<https://google.co.jp/>
Yahoo!
<https://www.yahoo.co.jp/>
Bing
<https://www.bing.com/>



# **テーブル(表の作成)**
| 見出し1 | 見出し2 | 見出し3 |
| :------:| :-----: | :------:|
| 内容1 | 内容2 | 内容3 |

『:--』が左寄せ、『:--:』が中央寄せ、『--:』が右寄せなので表の作成も楽になるかと思います。



# **文字色**
<font color="Red">テキスト</font>
『＜font color="~~~"＞テキスト＜/font＞』※<>は小文字です。
このように入力すると文字の色を変えることができ、さらに
***<font color="Red">テキスト</font>***
『*』を使うとこのように強調することができます。



# **文字の強調**
先ほど紹介したように、『＊』では装飾ができます。 
『＊テキスト＊』では、『*テキスト*』を斜体にすることができて、
『＊＊テキスト＊＊』では、『**テキスト**』と太字にすることができます。
他にも『～』では『～～テキスト～～』と入力すると、『~~テキスト~~』打消し線を引けます。
『-』では『---』このように入力すると水平線を引くことができます。『***』でも可

例
---


# **最後に**
今回は【リンクの貼り付け】【テーブルの作成】【文字色変更】【文字の強調】を使ってみました。
まだ初歩的な技術でも少しもたついてしまうので、今回を機に『マークダウン記法』に慣れるよう反復をしていきます！

チェックリストが上手くいかなかったのですが、何かアドバイスがある方よろしくお願いします。
AWS API Gateway, Lambda, DynamoDB, Cognito を使ってGoogle+でログインし、ユーザーごとにアクセス権を与える

## Cognitoを使ってGoogle+でログイン
手順：
http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/google.html
Google Console:
https://console.developers.google.com
- プロジェクト作成
- Google+ APIを有効化
- 認証情報を作成し、OAuthクライアントIDを取得
- AWS ConsoleでID Poolを作成

AWS CLIを使ってRoleを作る。
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Cognito.Credentials.html
Googleログインボタンを挿入。
http://rmdi.hatenablog.com/entry/2015/12/22/142059
## CognitoでAPI Gatewayをアクセス制限
以下のURLの手順に従う。
http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html
1. 作ったID PoolとAPIを結合。
2. ヘッダーにIDトークンを入れて、アクセス制限のあるAPIにアクセス。

jsでCognitoIDを取得し、XMLHttpRequestでAPIにアクセス。
http://edtheron.me/projects/store-messages-aws-dynamodb-lambda-api-gateway-cognito

## Fine-Grained Access ControlでDynamoDBのアクセス制限
UserIDをハッシュに設定し、IAMポリシーのConditionに${cognito-identity.amazonaws.com:sub}をdynamodb:LeadingKeysとして設定し作成。
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/specifying-conditions.html

## GoogleIDを更新
アクセス制限のAPI先でDynamoDBアクセス拒否時に、IDを更新。jsで実装。
- gapi.auth2.getAuthInstance().signIn()でGoogleIDを更新。
- AWS.config.credentials.refreshでAWS認証情報を更新。コールバックに[Promise](https://techracho.bpsinc.jp/tanaka/2014_04_23/16726)を使い、解決した時にAWS.config.credentials.identityIdを返す。
KotlinでIntentを用いた画面遷移

#android studio KotlinでのIntentを用いた画面遷移について
Kotlinを学び始めて少し経ったので、以前Javaで書いていたコードをKotlinでどう書くのだろうと思い、まず簡単にIntentを用いて画面遷移を書いて見た。

若干Javaと違う表記の仕方があったので、今回それをまとめて見た。

```title:Java
Intent intent = Intent(MainActivity.this, SecondActivity.class)
startActivity(intent)
```

これが、Javaでの、Intentを用いた、画面遷移だったので、Kotlinの方で、

```title:Kotlin
val intent: Intent = Intent(MainActivity.this, SecondActivity.class)
startActivity(intent)
```

これで、いけるんじゃないかと思ってやってみると、エラー

色々調べて見たところ、

```title:Kotlin
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
```

こちらの方で、画面遷移ができた。
単純に書き方が間違っていただけっぽいが、
```::class.java```
の部分がイマイチピンとこなかった…

```
class.java
```
っていう部分は、多分Javaのクラスってことを意味してるんだと思うけど、、

わかり次第追記して行きます。
【Android】Notification(通知)でGlideを使ってhttps経由の画像を表示させる

RemoteViewクラスのsetImageViewUri(int viewId, Uri uri)
では、できないのでメモ。

Glide 4.1.1 を使用しました。

```java
//☆まずはNotificationを作る =========================================

//NotificationManagerを取得
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//Intentを生成
Intent intent = new Intent(context, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

//カスタムレイアウトを使う場合は、RemoteViewsを使用する
//今回は、TextView ×2 と ImageViewのレイアウト
RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification);
contentView.setTextViewText(R.id.title, "タイトル");
contentView.setTextViewText(R.id.body, "サブテキスト");

//Notification インスタンスを生成
Notification notification = new NotificationCompat.Builder(context)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setTicker("Ticker")
                .setPriority(Notification.PRIORITY_MAX)
                .setDefaults(Notification.DEFAULT_VIBRATE)
                .setContent(contentView)
                .setContentIntent(contentIntent)
                .setAutoCancel(true)
                .build();

//idはなんでも良い
manager.notify(1, notification);

//☆ここからがGlideの処理 =========================================

//NotificationTarget インスタンスを生成する
NotificationTarget notificationTarget = new NotificationTarget(
                context,
                R.id.image,
                contentView,
                notification,
                1);

//StringのURLをUriクラスにパースする
Uri uri = Uri.parse("https://〜");

//Gride 4.1.1
Glide.with(getApplicationContext())
               .asBitmap()
               .load(uri)
               .into( notificationTarget );
```

GlideのNotificationTargetクラスを使用して、
RemoteViewsのカスタムレイアウトにあるImageViewに画像を表示させることができました :beer: 

参考：
[Glide--Loading Images into Notifications](https://futurestud.io/tutorials/glide-loading-images-into-notifications-and-appwidgets#loadingimagesintonotifications)
react-native-fcmでiOSのプッシュ通知がどうにも届かなかった問題

ドはまりしたもんで調査手順残しておきたかったのでメモ
雑ですみません

## 問題

公式
https://github.com/evollu/react-native-fcm

や、この記事
https://qiita.com/mah_lab/items/a4eb922ac6d6a2d0cad3

を参考にiOSアプリケーションを設定。

その後、firebase consoleからメッセージ送信。
ステータスは「完了しました」になるが届かない。

## 通信経路おさらい

FirebaseConsole --(1)--> FCM --(2)--> APNs --(3)--> iOS

つかうサービスはFCMですがAPNs経由で端末に届きます。
ってことで順々に切り分けました。

## (1)について

FirebaseConsoleではいけてるようにみえるので、
念のためTerminalからcurl使って検証

```bash

$ curl --header "Content-Type: application/json" \
--header "Authorization: key=ここにAPIkeyいれる" \
https://fcm.googleapis.com/fcm/send \
-d '{"notification": {"body": "Hello from curl via FCM!", "sound": "default"},
"priority": "high",
"to": "ここにFCMトークンをいれる"}'
```
APIkeyはFirebase consoleからコピー。
FCMトークンは、Xcodeのデバッガで

```objc

po [[FIRInstanceID instanceID] token]
po [[FIRMessaging messaging] FCMToken]
```

とかやるととれる。

結果：

```bash
{"multicast_id":8804927118733666407,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1511123702440988%f98f6759e98f6759"}]}
```

success=1だしエラーもないが、端末に届かない。

## (2)について

APNs用の証明書の期限とか20回ぐらい確認。問題なし。

## (3)について

これもTerminalからcurlで検証したかったがなんか上手く行かなかったのでこれを
インストール（git cloneで勝手にapplicationsに入ったとおもう）
https://github.com/noodlewerk/NWPusher

使い方はシンプルなので起動すればわかると思う。
APNs証明書とAPNsトークンを入力して送信するだけ。

APNｓトークンのとり方はこれをAppDelegateとかに書いてdeviceTokenの中身みたら入ってる

```objc
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  //デバイストークン取得後の処理
}
```

結果：

ちゃんと端末に通知が届く



なんだぜんぜんわからん！！！


## 結局なんだったのか

もうね変なところ無いし明らかにおかしいよとおもったら
react-native-fcm@10.0.3が、
Firebase系podの新しめのバージョンに対応してませんでした。
（FirebaseCoreとかFirebaseUnstanceIDとか）

これ
https://github.com/evollu/react-native-fcm/issues/526

ということでFirebaseのpod群をダウングレード。
pod deintegrate して Podfile.lock書き換えて pod installで届くようになりました
上のスレッドではFirebaseInstanceIDだけ言及されていますが
僕はFirebaseCoreも4.0.6->4.0.0に落としたりしないとNGでした

最初からIssuesみればよかったよ！！！！


## 【参考】 うごいたときのPodfile.lock

```
PODS:
  - FirebaseAnalytics (4.0.0):
    - FirebaseCore (~> 4.0)
    - FirebaseInstanceID (~> 2.0)
    - GoogleToolboxForMac/NSData+zlib (~> 2.1)
  - FirebaseCore (4.0.0):
    - GoogleToolboxForMac/NSData+zlib (~> 2.1)
  - FirebaseInstanceID (2.0.0):
    - FirebaseCore (~> 4.0)
  - FirebaseMessaging (2.0.0):
    - FirebaseAnalytics (~> 4.0)
    - FirebaseCore (~> 4.0)
    - FirebaseInstanceID (~> 2.0)
    - GoogleToolboxForMac/Logger (~> 2.1)
    - Protobuf (~> 3.1)
  - GoogleToolboxForMac/Defines (2.1.1)
  - GoogleToolboxForMac/Logger (2.1.1):
    - GoogleToolboxForMac/Defines (= 2.1.1)
  - GoogleToolboxForMac/NSData+zlib (2.1.1):
    - GoogleToolboxForMac/Defines (= 2.1.1)
  - Protobuf (3.4.0)
```

## 参考文献
Google公式ブログのやつ。めちゃめちゃ役に立ちましたありがとうございます
https://developers-jp.googleblog.com/2017/02/debugging-firebase-cloud-messaging-on.html
EC2 の c5 instance では専有ホストを使わなくても PMU が使える

EC2 の c5 インスタンスタイプが発表されました。

参考: https://dev.classmethod.jp/cloud/aws/ec2-c5-instance/

個人的に今までのGCEやEC2の不満は PMU が使えないことです。例えば perf コマンドでキャッシュミスや分岐ミスをプロファイリングできません。

C5インスタンスではハイパーバイザーがKVMに変更されたということで、この点に変化が無いか調べてみました。結果、 9xlarge (1ソケット専有) と 18xlarge (ホスト＝2ソケット専有) では Hardware PMU Event を見ることができました。（テナンシーは通常の「共有」のまま、AMI は Amazon Linux 2017.9）

結果: https://gist.github.com/methane/3c523b7bc8e99508a90ca06b5d4bf601

一方で、 perf -b や perf --call-graph lbr は動きませんでした。 /proc/cpuinfo にも lbr が載ってないので、 lbr は利用できないようです。これ使えるともっと嬉しいんだけどなー。

```
ec2-user]# perf record -b python fib.py
Error:
PMU Hardware doesn't support sampling/overflow-interrupts.
```
IDCFクラウドのビリングAPI利用方法

# はじめに
IDCFのビリングAPIの利用方法に関しては、下記参考URLに記載されております。
しかし、実際に下記の記事を参考にIDCFの利用明細を取得しようとした際、どういった値を入力すればよいのかがわからず、利用できるようになるまで時間がかかりました。
今回はビリングAPIを利用するにあたり、必要な値を記載していこうかと思います。

# ビリングAPI利用方法
## ビリングAPI使い方
ビリングAPIを利用するのに、追加でインストールするパッケージはございません。
curlコマンドによって利用明細を取得することができます。

▼例

```
$ curl -n https://your.idcfcloud.com/api/v1/billings/history \
  -G \
  -d format=json \
  -H "X-IDCF-APIKEY: SrE5Ceeb1Q9MPl0yM0qbd3D3_CCpLWqnbcruMBj2WyK03Q6r0l6YJhIdCsYUmB7VM8AFttoqsxc3FxQrsAh8VQ" \
  -H "X-IDCF-Expires: 1437142261" \
  -H "X-IDCF-Signature: EenNFoNxnYEQVGW279XcQ+tBgwFPpMmTkDZQvKryIZg="
```

ここでひとつ疑問に思うのは、どの値をどのように変更すればよいのかということです。
そこで変更する箇所について説明しようかと思います。

### 必要なHTTPヘッダ項目と入力例
1.history
```2017-10```
※[xxxx年]-[xx月]形式で取得したい利用明細の年月を指定

2.format
```format=json```
※利用明細の出力形式を「json」or「csv」で指定

3.X-IDCF-APIKEY
```SrE5Ceeb1Q9MPl0yM0qbd3D3_CCpLWqnbcruMBj2WyK03Q6r0l6YJhIdCsYUmB7VM8AFttoqsxc3FxQrsAh8VQ```
※管理画面上で確認できるIDCFアカウントの[ API Key ]を指定

4.X-IDCF-Expires
```1437142261```
※APIコマンドの有効期限をUNIX時間で定義

5.X-IDCF-Signature
```EenNFoNxnYEQVGW279XcQ+tBgwFPpMmTkDZQvKryIZg=```
下記手順で作成したシグネチャを指定

## シグネチャ生成方法
### 必要な項目と入力例
1.HTTPリクエストメソッド
```GET```
※利用明細を取得するので「GET」を指定

2.リクエストAPIのパス
```/api/v1/billings/history```
※historyに[xxxx年]-[xx月]形式で年月を指定

3.APIキー
```SrE5Ceeb1Q9MPl0yM0qbd3D3_CCpLWqnbcruMBj2WyK03Q6r0l6YJhIdCsYUmB7VM8AFttoqsxc3FxQrsAh8VQ```
※管理画面上で確認できるIDCFアカウントの[ API Key ]を指定

4.有効期限
```1437142261```
※APIコマンドの有効期限をUNIX時間で定義

5.クエリストリング
```format=json```
※利用明細の出力形式を「json」or「csv」で指定

### 生成手順
1.上記5項目を改行(\n)で連結

```
GET\n/api/v1/billings/history\nSrE5Ceeb1Q9MPl0yM0qbd3D3_CCpLWqnbcruMBj2WyK03Q6r0l6YJhIdCsYUmB7VM8AFttoqsxc3FxQrsAh8VQ\n1437142261\nformat=json
```

2.当該アカウントのSecret Keyを秘密鍵として、上記2の文字列をHmacSHA256でエンコードし、それをBase64でエンコード実施。

# 参考URL
Billing API：http://docs.idcf.jp/cloud/billing/#s_fid=73BA0820D8B366EE-2F120BC0DAB7D752
APIリクエスト方法：http://docs.idcf.jp/cloud/billing/create_request.html
URLエンコード

###URLエンコード

URLは「Webページ（ホームページの中の1ページ）の住所」

エンコードは「データを他の形式へ変換すること」

URLに日本語等が表示されていると
その部分が以下のようになる。

http://xxxxxxx/test/user/日報/2017/11/07
↓
http://xxxxxxx/test/user/%E6%97%A5%E5%A0%B1/2017/11/07

「日報」の部分を変換するとこのようになる。
URLには日本語は使えません。
アルファベットのみ使えます。

参考URL
http://wa3.i-3-i.info/word13354.html
Vue.jsの外から情報を渡したい


Vue.jsとRailsを組み合わせている時、Rubyの世界からJSの世界に値を楽に渡したいと思ったことはありませんか？
私はあります。

そこでWeb APIを経由せずにデータを渡す方法をいくつか試してみたので、まとめてみました。
※ 以下、vue-cliで生成されたファイルで試しています。

## 共通
App.vueは共通のものを使用します。
このコンポーネントの`props`に情報が渡れることを目的とします。
追加したのは`props`と`<div>{{ arg1 }}</div>`だけです。

```html:src/App.vue
<template>
  <div id="app">
    <div>{{ arg1 }}</div>
    <img src="./assets/logo.png">
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld'

export default {
  name: 'app',
  props: {
    arg1: { type: String, required: true }
  },
  components: {
    HelloWorld
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```

## 同じ変数名で渡す
`src/main.js`が読み込まれる前に変数を`index.html`で定義する

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
  </head>
  <body>
    <div id="app"></div>
    <script>
      var arg1 = 'arg1'
    </script>
    <!-- built files will be auto injected -->
  </body>
</html>
```

```src/main.js
import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

if (typeof arg1 === 'undefined') {
  throw new Error('Not found arg1')
}

new Vue({
  el: '#app',
  template: `<App arg1="${arg1}"/>`,
  components: { App }
})
```

## Appをindex.htmlで書く
Vueインスタンスではtemplateを書かずに`index.html`で書く

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
  </head>
  <body>
    <div id="app">
      <App arg1="arg1"></App>
    </div>
    <!-- built files will be auto injected -->
  </body>
</html>
```

``` src/main.js
import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  components: { App }
})
```

## Rootで受け取る
mountするelementにarg1を書いて、renderが呼ばれたときに取得し、propsで渡す

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
  </head>
  <body>
    <div id="app" arg1="arg1"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
```

```src/main.js
import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  template: '<App/>',
  components: { App },
  render: function(createElement) {
    const arg1 = this.$el.getAttribute('arg1')
    return createElement('App',
      {
        props: {
          arg1: arg1
        }
      })
  }
})
```

# 最後に
思いついたものの列挙なので、もっと良い手段やそもそもこんなことしないでいいよというものがあれば教えていただけると嬉しいです
wekaのsmoをターミナルから使用　~ memo

#はじめに
SMOのターミナルからの実行

#ターミナル
以下が実行時のコマンド
<>で囲まれた部分を各自の環境に合わせる。
ヘルプの画面が表示されなければ成功

```:実行概要
$ java -cp <weka.jarのpath> weka.classifiers.functions.SMO -t <トレーニングデータ> -c <教師データのクラスの位置>
```


```:実行例
$ java -cp /Applications/weka-3-8-1-oracle-jvm.app/Contents/Java/weka.jar weka.classifiers.functions.SMO -t training.arff -c 1
```

-c : 教師データ
-t : トレーニングデータ

##引数
-T : テストデータ指定
-l : 使用するmodel名
-d : 出力するmodel名


#参考
[weka SMO](http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/SMO.html)
AtomエディタがWindows7 32bitではgit機能が使えないのでいじってみた。

# いきなり結論
32bit版のAtomエディタについてくるGitは、64Bit用の実行ファイルしかない模様。
(WindowsもUbuntuも32bit版は同じ？と思う）
よって、Atom の他にGit for Windows https://git-for-windows.github.io/ などの32bit版Gitをインストールして、AtomからGit for Windows 32bit版のGitを実行するようにしなければだった。
上記の方法でとりあえずGit:Cloneは動いてますが、すべてを試したわけではないので不明です。
もっと良い方法あれば教えてください。

## やり方
Windowsのユーザーがadminとして話をします。

* Atom の Git のありか

`C:\Users\admin\AppData\Local\atom\app-1.21.2\resources\app.asar.unpacked\node_modules\dugite`

この dugite のフォルダは https://github.com/desktop/dugite (Elegant bindings for working with Git in your Node applications) の関係だと思います.
で、このフォルダの下にgitフォルダがありますが64bit用です。
このgitフォルダを削除かgit64などにリネームします。

* Git for Windows の Git のありか

`C:\Users\admin\AppData\Local\GitHub\PortableGit_f02737a78695063deace08e96d5042710d3e32db`

このフォルダの下が、上記Atomのgitフォルダと対応しているようです


[Windowsでシンボリックリンクを作る](https://dev.classmethod.jp/etc/make_windows_symbolic_link/) より

mklink で Git for Windows の Git を Atom の git の場所に置きます。

コマンドラインより
`mklink /d C:\Users\admin\AppData\Local\atom\app-1.21.2\resources\app.asar.unpacked\node_modules\dugite\git C:\Users\admin\AppData\Local\GitHub\PortableGit_f02737a78695063deace08e96d5042710d3e32db`

実行結果
`C:\Users\admin\AppData\Local\atom\app-1.21.2\resources\app.asar.unpacked\node_modules\dugite\git <<===>> C:\Users\admin\AppData\Local\GitHub\PortableGit_f02737a78695063deace08e96d5042710d3e32db のシンボリック リンクが作成されました`

* これでGitは動きますが git clone でつぎのエラーが出ます。

`fatal: Unable to find remote helper for 'https'`

これは、curl (https://ja.wikipedia.org/wiki/CURL) が見つからないと出るようなので
環境変数のPathに、以下のcurlのある場所を追加します。
`C:\Users\admin\AppData\Local\atom\bin;C:\Users\admin\AppData\Local\GitHub\PortableGit_f02737a78695063deace08e96d5042710d3e32db\mingw32\bin`

* 新たなエラーとして、シェルスクリプトgit-sh-setupの46行目 "$(git --exec-path)/git-sh-i18n" が見つからないといわれる。

環境変数 GIT_EXEC_PATHを追加、内容は以下のPath
`c:\Users\admin\AppData\Local\GitHub\PortableGit_f02737a78695063deace08e96d5042710d3e32db\mingw32\libexec\git-core`

* これで動くかと思います。

# 経緯
GitHubは2017年6月13日（現地時間）にAtom1.18をリリース、Git / GitHub連携機能が標準で使えるようになったとのこと。

あまりGitに詳しくない私は、AndroidStadioやNetbeansなどのIDE上からGitを利用した程度。
GitHubのREADMEなどのMarkDownをブラウザから直接編集していたので、AtomエディタからGitを使えるなら、GitHubのMarkDownもスマートにAtomで出来ると思い、メインPCのWindows 64BitでAtomのGitを早速試して、なんとか出来ました。

で、譲り受けた古いウルトラライトブックPC「バイオvpcx11alj」を持ち歩いているのですが、これでAtomエディタができればいいぞとAtomをインストールしました。

さて、このPCは、インテルAtomプロセッサーZ550で、CPUは64bitに対応しておりません。
なので、Windows7の32bitがOSなのですが、、Atomは32Bit版もありますので、時間はかかりますが無事インストールは出来たわけであります。

で、早速　Git:Clone　をしたわけですが、GitHubのリポジトリURLとローカルフォルダの指定は入力できるのですが、そこから先クルクル回って、エラーも出るでもなく、いくらたっても終わりません。
gitのクリエイトリポジトリも指定はできるのですが、そこから進みません。何か他のことをすると右上に赤いエラー表示で「リポジトリが作れませんでした」みたいなエラーが出るだけ。

そういえばGitって、このPCに入ってなかった！
Atom入れてもGitはインストされないんだな。とおもい、Git for Windows からインストールしてもだめ、
GitのPathを設定してもだめだった。

で、Windowsはだめかと、無理矢理USBブートさせて、Xubunduをインストール、
非公式の32Bit版Atomをいれたが、GitまでPathは通っているようだが、だめだった。
でも、このGitのPathはAtom用のGitぽい。

WindowsのAtomのgitはないかと検索して見つけ、クリックしてみたら32bitでは動かんと言われて、64bit用かよ！と気がついたとのです。
Alexa Skills Kit が日本語に対応したので早速試してみる

Amazon Echoの日本語版がついに正式発表されましたね！
わたしも早速招待メールのリクエストを行いました。楽しみです。

Amazon Developer Consoleにも Japanese が追加されており、日本語のスキル開発が可能になっていました。
同時にコンソールやドキュメント類も日本語化されています。やったぜ！
https://developer.amazon.com/ja/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html

# Alexaスキルの作成
## スキル情報
日本語が設定できます！
今回はコンソール上でテストするだけなので、Invocation name等は適当です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/4507eb93-280c-14dd-88b7-1aa1fed223c2.png)

## 対話モデル
インテントスキーマの設定自体は日本語になっても特にかわらないかと思います。
日本人の名前、都市名、都道府県名など日本語に対応したBuilt in Slotも追加されています！
https://developer.amazon.com/ja/docs/custom-skills/slot-type-reference.html#list-types
これまでカスタムスロットで無理やり都道府県を定義したりしていましたが、そんなのは不要ですね。

重要なのはサンプル発話(Sample Uttarance)ですね！
ユーザの発話によってどのインテントを処理させるかAlexaが判断する元になります。
今回会社の同僚が作ってくれた近隣のラーメン店を検索するスキルを使用したので、以下のように設定してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/720197c5-6cad-77dc-26f0-22c31e4536e6.png)

## 設定
エンドポイントの設定もこれまでと変わらないかと思います。
「デフォルト」にはスキルを実行するLambdaファンクションのARNを指定します。
English開発のときはバージニア北部にデプロイしなければいけないのが注意点でしたが、
今回は東京リージョンにデプロイして、そのARNを指定しました。

## テスト
早速サービスシュミレーターでテストしてみます。
日本語で発話を入力し、スキルを呼び出すとAlexaが見事に適切なインテントリクエストを投げてくれました。
ロケールも ja-JP になっています。
聞くボタンを押すと、SSMLの結果も自然な日本語で読み上げてくれます。感動！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/9516fd5b-e595-3e4b-ed12-46ce569d341a.png)

# 最後に
実機確認として[Amazon Fireで試してみよう](http://www.itmedia.co.jp/pcuser/articles/1707/31/news092.html)と思いましたが、恐らく言語設定の問題で
今のところは日本語を認識してくれませんでした。
早速試してみた内容をお伝えしました。参考になれば幸いです。
Google ChromeでサイトにSSL証明書がインストールされているか確認したいとき

#1. サイトを開いて、ディベロッパーツールを開く
- 右クリック > 検証
- キーボードショートカット [Command] + [Option] + [i] （Mac）

#2. Securityタブをクリック、「View certificate」をクリック
![Chrome ディベロッパーツール キャプチャー](https://qiita-image-store.s3.amazonaws.com/0/40940/771f15e9-8cda-db3e-005b-6552fdb31323.png)

#3. 「この証明書は有効です！」 と出る
![スクリーンショット 2017-11-08 15.42.56.png](https://qiita-image-store.s3.amazonaws.com/0/40940/63491224-c788-0c8b-f827-ee600208c4a4.png)
ReactNative で一番細い線を指定する

1 より細い線を描きたい場合、 `StyleSheet.hairlineWidth` を指定する。デバイスによりこの値は異なる。

ref. https://qiita.com/YutamaKotaro/items/d0cd253c998f9b28dd55#hairlinewidth

知らなかった便利だ…！
How to fix Plone buildout error : Couldn't find index page for 'Products.PloneHotfix20170117' (maybe misspelled?)

## Symptom

all of sudden, plone buildout fails like this when trying to apply Plone Security patches

```
Couldn't find index page for 'Products.PloneHotfix20170117' (maybe misspelled?)
```


### How to fix


```yaml:~/.buildout/default.cfg
[buildout]
index = https://pypi.python.org/simple/
```

voila

```
We have no distributions for Products.PloneHotfix20170117 that satisfies 'Products.PloneHotfix20170117'.
Getting distribution for 'Products.PloneHotfix20170117'.
Running easy_install:
/usr/bin/python "-S" "-c" "import sys,os;p = sys.path[:];import site;sys.path[:] = p;[sys.modules.pop(k) for k, v in sys.modules.items() if hasattr(v, '__path__') and len(v.__path__)==1 and not os.path.exists(os.path.join(v.__path__[0],'__init__.py'))];from setuptools.command.easy_install import main;main()" "-mUNxd" "/home/plone/plone/PORTAL_2017-08-10_14-49-49/SciencePortal/eggs/tmpT0y1nj" "-Z" "-v" "/home/plone/plone/PORTAL_2017-08-10_14-49-49/SciencePortal/downloads/dist/Products.PloneHotfix20170117-1.0.zip"
path=/home/plone/plone/PORTAL_2017-08-10_14-49-49/SciencePortal/eggs/setuptools-0.6c11-py2.7.egg

Processing Products.PloneHotfix20170117-1.0.zip
```
:relaxed:

cf.
Buildout not working / Couldn’t find index page for / Couldn’t find a distribution / Disabling non HTTPS access to APIs on PyPI
https://community.plone.org/t/buildout-not-working-couldnt-find-index-page-for-couldnt-find-a-distribution-disabling-non-https-access-to-apis-on-pypi/5069



### Plone Hotfix - add lines below, then bin/buildout -c default.cfg -N -vvv 

```yaml:etc/buildout.cfg

eggs =
   ...
    Products.PloneHotfix20170117
    Products.PloneHotfix20161129
    Products.PloneHotfix20160830
    Products.PloneHotfix20160419
    Products.PloneHotfix20151208
    plone4.csrffixes
   ...
```

```yaml:etc/version.cfg

...
plone4.csrffixes = 1.0.9
plone.protect = 3.0.18
plone.keyring = 3.0.1
plone.locking = 2.0.9
Products.CMFQuickInstallerTool = 3.0.12
Products.PlonePAS = 5.0.4

```
Project Euler Q22 【名前のスコア】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
5000個以上の名前が書かれている46Kのテキストファイル [names.txt](http://odz.sakura.ne.jp/projecteuler/index.php?plugin=attach&refer=Problem%2022&openfile=names.txt) を用いる. まずアルファベット順にソートせよ.

のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.

たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは $3 + 15 + 12 + 9 + 14 = 53$ という値を持つ. よってCOLINは $938 × 53 = 49714$ というスコアを持つ.

ファイル中の全名前のスコアの合計を求めよ.

## 解答

```bash
printf "%s\n" {A..Z} |
awk 'BEGIN{printf "sed "} {printf "-e \047s/"$1"/"NR" /g\047 "} END{print "<(cat names.txt | tr \047,\047 \047\\n\047 | sort)"}' |
bash |
tr -d '"' |
awk '{for(i=1;i<=NF;i++){s[NR]+=$i};t+=NR*s[NR]} END{print t}'
871198282
```

アルファベットを数値に変換する処理をもっとスッキリ書けないかなあ。
`\047`はシングルクォーテションです。
`awk`でシングルクォーテションを使いたいときはこのように書いています。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/022.html
リモートログインでMacにSSH接続する

自分の開発機MacにSSH接続したい事案が発生したのでメモ。

左上の🍎マークから、

🍎 > システム環境設定 > 共有 > ✅ リモートログイン

<img width="668" alt="item15399500L2.png" src="https://qiita-image-store.s3.amazonaws.com/0/124843/c453fce0-e418-cc72-9b6f-8115fe646031.png">


のチェックを入れると

```
このコンピュータにリモートからログインするには、
“ssh tom@192.168.xx.xx”と入力してください。
```
みたいに出る。

あとはコンソールから

```
$ ssh tom@192.168.xx.xx
```

で接続出来る。

SSH鍵認証で接続する場合は

```
$ ssh-keygen -t rsa
```
を叩くとパスフレーズどうするって聞かれるので入力して作成する。

```
$ chmod 600 ~/.ssh/id_rsa
```
パーミッションを600とかに設定してあげる。

あとはその鍵とパスフレーズと上記のユーザ名、ホスト名で接続してあげる。
いまさらながらの jQuery 非対応のサイトでも console で jQuery を使いたい！

[前回の投稿](https://qiita.com/zyyx-matsushita/items/85e9e0a52a3e88b68de1)に引き続き地味に便利なブックマークレットを紹介します。

jQuery 離れがささやかれている昨今ですが、まだまだ需要の高い jQuery に関するブックマークレットです。

jQuery なしでも Chrome Dev Tool では `$`, `$$` でセレクタでの DOM の抽出ができますが、抽出した DOM をどうこうしたい、という場合、急に手足がでなくなります 笑

そんな時はこのブックマークレットで jQuery をサイトに読み込んでいます。

```js
javascript:(function()%7B(function() %7Bvar s %3D document.createElement("script")%3Bs.type %3D "text%2Fjavascript"%3Bs.src %3D"http%3A%2F%2Fcode.jquery.com%2Fjquery-2.2.4.min.js"%3Bdocument.body.appendChild(s)%3Bs.onload %3D function()%7B console.log('jQuery ready!')%3B %7D%7D)()%7D)()
```

`<script>` タグを生成して非同期で読み込んでいるだけです。
確認作業などが主な目的なのでバージョンが低いままですが、読み込み先のURLを変更すれば別バージョンも読込できます。

Lodash や Underscore.js など別のライブラリも同じ方法でいけるので、インスタントにライブラリを試したい時などにも利用できそうですね。
scikit-learn（sklearn）の使い方

纏まった記事があまりなかったので、scikit-learnの使い方を纏めてみました。
scikit-learnはPythonで使える機械学習ライブラリで、読み方は「サイキットラーン」です。

本記事では教師あり学習を想定していますが、教師なし学習でも基本的には同じ流れになります。
また、scikit-learnやnumpyのインストールは既に済んでいるものとします。

# データセットの用意
まずは、当たり前ですが、データセットを用意する必要があります。

書籍などではscikit-learn付属のデータセットを用いる場合が多いですが、日常の研究や業務では自分達で用意したCSVファイルを使うことが多いと思います。
その場合、numpyの[loadtxt関数](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.loadtxt.html)を使うと便利です。

例えば、1列目が目的変数、2列目以降が説明変数となる

``` foo.csv
1,1.2,12,...
1,2.0,5,...
1,1.5,3,...
2,1.8,1,...
2,0.5,10,...
2,1.0,8,...
```

というCSVファイルがあった場合、

``` python
import numpy as np
from sklearn import preprocessing
from sklearn.model_selection import train_test_split

data = np.loadtxt('foo.csv', delimiter=',', dtype=float)
labels = data[:, 0:1] # 目的変数を取り出す
features = preprocessing.minmax_scale(data[:, 1:]) # 説明変数を取り出した上でスケーリング
x_train, x_test, y_train, y_test = train_test_split(features, labels.ravel(), test_size=0.3) # トレーニングデータとテストデータに分割
```

と書くと、CSVファイルをnumpy形式で読み込んだ上でトレーニングデータとテストデータに分けることができます。

ここで忘れてはいけないのが、説明変数のスケーリングです。
説明変数毎にスケールが異なると正しく学習できないので、各変数のスケールを合わせておく必要があります。
今回は[minmax_scale関数](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.minmax_scale.html#sklearn.preprocessing.minmax_scale)を使い、各変数を[0,1]の範囲にスケーリングしています。

また、[train_test_split関数](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)を利用してデータをトレーニングデータとテストデータに分割していますが、クロスバリデーションしても問題ありません。

# モデルの選択
データを用意できれば、次にやることはモデルの選択です。
scikit-learnにはSVM、ニューラルネットワーク、ランダムフォレストなどの様々なアルゴリズムが用意されているので、好きなものを選びます。

例えば、SVMを使う場合、

```python
from sklearn import svm

clf = svm.SVC(kernel='rbf', C=10, gamma=0.1) # clfはclassificationの略語
```

と書くだけです。

使用するkernelやパラメータは引数で指定できます。
指定可能は引数については[公式ドキュメント](http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)に載っています。

また、ニューラルネットワークを使う場合、

```python
from sklearn import neural_network

clf = neural_network.MLPClassifier(activation="relu", alpha=0.0001) # clfはclassificationの略語
```

と書くだけです。

SVMと同様、使用する活性化関数やパラメータは引数で指定できます。
こちらも、指定可能は引数については[公式ドキュメント](http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html)に載っています。

SVMやニューラルネットワーク以外のアルゴリズムでも基本的には書き方は全く同じです。
scikit-learnで使えるアルゴリズムは[公式ドキュメント](http://scikit-learn.org/stable/modules/classes.html)をご覧下さい。

# 学習
データセットを用意してモデルも選択できれば、次にやることはトレーニングデータを使った学習です。

```python
clf.fit(x_train, y_train)
```
と書くだけです。
たった一行書くだけで学習ができます。

# 予測
最後はテストデータを使った予測です。

```python
clf.predict(x_test)
```
と書くだけです。
学習フェーズと同様、たった一行書くだけで予測ができます。

正解率（accuracy）、適合率（precision）、再現率（recall）を出したい場合は、

``` python
from sklearn.metrics import accuracy_score, precision_score, recall_score

predict = clf.predict(x_test)
print(accuracy_score(y_test, predict), precision_score(y_test, predict), recall_score(y_test, predict))
```

のようにscikit-learnに用意されている関数を使えばすぐに出すことができます。
RailsでMissing host to link to!が出たときに。model内でURL組み立てる場合の設定

## 前置き
あまりネットで検索しても困っている人を見つけられなかったので設計が変なきもするけれど、ちょっとだけはまったのでメモ

RUby2.4.1、Rails5.1で、ローカルのcentos（vagrant）でもHerokuでも発生。

## 対象エラー
```
Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
```

ActionMailerのviewのなかで、modelのメソッドを読んでURLを設定するときに出た。

## 対策
routes.default_url_optionsに設定する必要がある。

```/config/environments/development.rb
  host = 'samplehost'
  Rails.application.routes.default_url_options[:host] = host
```

production.rbにも同じように設定する必要があります。

## 関連
このエラーで検索すると環境設定ファイルに以下のように設定するとよいという記事がStack Overflowをはじめいろいろ出てくる。
ActionMailerのviewで直接URLを表示するときにはこれが必要。

```/config/environments/development.rb
config.action_mailer.default_url_options = { host: "samplehost"}
```

https://qiita.com/saicologic/items/1c692b42ba203bf2d406

## その他
railsのconfig設定がどうなっているか、consoleなどで確認したいのだけれどどうしたらいいだろう？
rails cしてRails.applicationを閲覧すると巨大なオブジェクトはみえるけれど、action_mailer系は見えない。
富士通のF-03Hはバッテリー10％以下でカメラを起動しようとするとjava.lang.RuntimeException: camera low batteryでアプリが落ちる


## 事象

タイトル通りです。別の機能の検証をしていた時に、たまたま電池がない端末があり、たまたまarrowsだった為に起こった様です。どうやら ```RuntimeException - Camera.checkBattery```という実装がなされているようです。

こちらはFirebase Crash Reportingのスクショとなります。

![スクリーンショット 2017-11-08 15.01.39.png](https://qiita-image-store.s3.amazonaws.com/0/25250/184cf39e-e657-db29-db3d-f94f7d5fec85.png "スクリーンショット 2017-11-08 15.01.39.png")


＿人人人人人人人人人人人人人＿
＞　camera low battery　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣


## 対応

やむなくカメラ起動の処理で例外をcatchしてしのぎました。

## :paperclip: Refs

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">昨日のもくもく会でそこそこ知見っぽいあれで、富士通の端末は電池残量が10%以下になるとカメラが起動しなくなる。Camera APIのopneに失敗する！という知見を話してきたｗちなみに、端末が充電中でも失敗しますのでご注意ください😊<br> <a href="https://twitter.com/hashtag/AndroidMokuMokuRetty?src=hash&amp;ref_src=twsrc%5Etfw">#AndroidMokuMokuRetty</a></p>&mdash; shinobu.apk (@operandoOS) <a href="https://twitter.com/operandoOS/status/888189299736301568?ref_src=twsrc%5Etfw">2017年7月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
googleのgo github SDKを使ってrevision間の差分抽出をしてみたメモ

## TL;DR

特定のファイルがdiffに含まれるdeployを抽出してアラート出すとか、
承認入れるとかそんなことをする必要が出てきたので,githubのgoSDKを
使ってみたメモ。

## ライブラリ

Google様が用意してくれていたので巨人の肩に乗る。やったぜ。
ちなみにv4(GraphQL)は未対応。

[go-github](https://github.com/google/go-github)

## 使い方

* 認証情報のsetUpをざっくり書く
    * githubのtoken取得は[こちらの記事](https://qiita.com/kz800/items/497ec70bff3e555dacd0)あたりが良いかも

```
package github

import (
	"os"

	"github.com/google/go-github/github"
	"golang.org/x/oauth2"
)

func NewClient() *github.Client {
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")},
	)
	tc := oauth2.NewClient(oauth2.NoContext, ts)

	return github.NewClient(tc)
}
```

サンプルコードでは環境変数に認証情報をおいてますが、この辺はお好みで。


* 特定のcommitとcommitの差分を取得するコード
    * [このendpoint](https://developer.github.com/v3/repos/commits/#compare-two-commits) に対応する`CompareCommits` を使って取得する。
    * contextは第１引数で渡す方が行儀良いです（手抜き

```
package github

import (
	"context"

	ggithub "github.com/google/go-github/github"
)

type ChangeDiffFetcher struct {
	client *github.Client
}

func NewChangeDiffFetcher() *ChangeDiffFetcher {
	return &ChangeDiffFetcher{
		NewClient(),
	}
}

// from~toのDiffのchangeFilesを取得する
func (c *ChangeDiffFetcher) FetchDiffFiles(from string, to string) ([]ggithub.CommitFile, error) {
	compare, _, err := c.client.Repositories.CompareCommits(context.TODO(), "ownerName", "repositoryName", from, to)
	if err != nil {
		return nil, err
	}

	return compare.Files, nil
}
```

* 取得できるgithub.CommitFileに含まれるデータはこんな感じ

```
 49 // CommitFile represents a file modified in a commit.
 50 type CommitFile struct {↲
 51 >...SHA         *string `json:"sha,omitempty"`
 52 >...Filename    *string `json:"filename,omitempty"`
 53 >...Additions   *int    `json:"additions,omitempty"`
 54 >...Deletions   *int    `json:"deletions,omitempty"`
 55 >...Changes     *int    `json:"changes,omitempty"`
 56 >...Status      *string `json:"status,omitempty"`
 57 >...Patch       *string `json:"patch,omitempty"`
 58 >...BlobURL     *string `json:"blob_url,omitempty"`
 59 >...RawURL      *string `json:"raw_url,omitempty"`
 60 >...ContentsURL *string `json:"contents_url,omitempty"`
 61 }
```

## まとめ

[githubのAPI](https://developer.github.com/v3/)は充実してるので
goでサクッと使えるのはありがたい。
Project Euler Q21 【友愛数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$d(n)$ を $n$ の真の約数の和と定義する. (真の約数とは $n$ 以外の約数のことである. )
もし, $d(a) = b$ かつ $d(b) = a$ ($a ≠ b$ のとき) を満たすとき, $a$ と $b$ は友愛数(親和数)であるという.

例えば, $220$ の約数は $1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110$ なので $d(220) = 284$ である.
また, $284$ の約数は $1, 2, 4, 71, 142$ なので $d(284) = 220$ である.

それでは$10000$未満の友愛数の和を求めよ.

## 解答
※実行には124秒ほどかかります。

```bash
seq 2 10000 |
awk '{for(i=1;i<=$1;i++){if(i==$1){print i""}else if($1%i==0){printf i" "}}}' |
awk '{for(i=1;i<=NF-1;i++){s[NR]+=$i};print s[NR],$NF,$NF,s[NR]}' |
xargs -n2 |
sort -n |
uniq -c |
awk '$1==2 && $2!=$3{s+=$2} END{print s}'
31626
```

等比数列の和の公式を使用する方法もあるが、実行時間があまり変わらない上にワンライナーが複雑になったのでやめた。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
[Project Euler 21 _ 友愛数 - PEをMathematicaで](http://variee.hatenadiary.com/entry/2017/03/14/002427)
ORACLE PGXを生物の人が実際に使ってみる③（クエリ検索）

連続で失礼します。少しづつパソコンに慣れてきているところです、、
今回は統合したデータについて、簡単な検索を行ってみようと思います！！

- 今回タグにSQLを入れていますが、**これはあくまでもSQLライクのクエリ言語です！！**
- PGQLというタグも勝手に入れていますが、**これがPGXで用いている専用言語です！！**

> PGQLが気になる方は[こちら](http://pgql-lang.org/)を見てください！ちなみに最新版が最近出ました！⇒[PGQL1.1](http://pgql-lang.org/spec/1.1/)

<br/>
---

今回入っているデータを整理すると

- 薬剤－タンパク質のつながりのデータ（有向性アリ）
- タンパク質－タンパク質のつながりのデータ（有向性ナシ）

なので、このイメージでやっていきましょう！

###①ある薬剤が結合するタンパク質は何？

```
pgx > G.queryPgql(" \
       SELECT a.name, x.name \
       WHERE (x)-->(a), x.name='DB00099' \
      ").print(10)
```
「薬剤番号99番の薬剤はどのタンパク質に結合する？」という質問

＜結果＞

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/190039/351e0f5f-a894-1735-503a-8ede59465f98.png)
2つのタンパク質が表示されました！このように、今回はどちらが薬剤でどちらがタンパク質かが分かるのでノードの識別の必要はないです。

###②その続きのつながりは？
```
pgx > G.queryPgql(" \
       SELECT x.name, a.name, b.name, r.combined_score \
       WHERE (x)-->(a)-[r]-(b), x.name='DB00099' \
      ").print(10)
```
薬剤番号99番の薬剤が結合するタンパク質は他にどのタンパク質と繋がっている？という質問

＜結果＞

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/190039/474e7763-dd5d-20b8-f1e1-335dd802201b.png)
色々出てきました！ネットワークはこの時点で複雑になりそうな予感がしますね、、、
なお、タンパク質同士の結合力も r.combined_scoreという形でクエリ内で指定して見ています！
このような感じで「()-[r]-()」ノード()をつなぐエッジ--の間に参照したい値を入れれば簡単に検索することが出来るのもPGXのいいところです！

###③ある薬剤Aと薬剤Bが結合しているタンパク質同士はつながりを持つ？

```
pgx > G.queryPgql(" \
       SELECT x.name, a.name, b.name, y.name, r.combined_score \
       WHERE (x)-->(a)-[r]-(b)<--(y), x.name='DB00099', y.name='DB00244' \
       ORDER BY r.combined_score DESC \
      ").print(10)
```

＜結果＞

![図3.png](https://qiita-image-store.s3.amazonaws.com/0/190039/c79cf991-a889-da9a-2792-82d0d78b447a.png)
重複していますが出てきました！もしかしたら、この画像の”ELNE”と”PERM”というタンパク質は薬剤番号99番と244番の影響をどちらも受けるのかもしれませんね。繋がっているから！

<br/>
---


簡単なクエリ検索を行ってみましたが、このようにグラフ構造をとっていれば2つ以上のDBを統合しても検索しやすいですね！

今後は可視化を視野に入れていきたいと思っています！

それでは～
ローカル環境で編集したjavascript/cssがIllegal Charcterになった

#問題点

vagrantで構築したLAMP環境にホスト側のエディタで編集したjavascriptを転送した時に、Illegal Charcterエラーが発生して、正常に動作しない。
改行するだけでも発生した。

#解決策
ゲストマシンのhttpd.confに以下を追記。

```
EnableSendfile Off
EnableMMAP Off
```

nginxの場合はnginx.confで

```
sendfile off;
```

とすればいい。

参考。
https://cakebox-music.com/archives/772
新卒エンジニアが考える効率の良い技術書の読み方

技術書を読んでいると、途中でだらけてきたりしませんか？
僕はけっこうな頻度であります。

また、技術書を一から全部読んでると、時間がかかるし集中力が全体に分散されてあまり記憶に残らないですよね。

あんなに勉強したのに、何も身についてない。。
なんて状況にはなりたくない。
全部を理解したい気持ちはあるんですが、効率が悪いです。

なので、技術書を全部読むのはやめましょう。仕事に使うのは一部ですしね。

そして、今回は僕が実践している技術書の読み方を紹介していきます。

#目次を熟読する
目次を熟読しましょう。
目次を読むだけで、その本に何が書いているか分かります。

目次を読まずに本を一から読んでいると、部分的で具体的な内容ばかりに目がいきます。
例えば、データベースの全体像について理解したいのに、トランザクションの意味が分からずにつまずいて、そこばかりに集中してしまいデータベース全体の理解がおろそかになってしまう。
けっこうあるあるではないでしょうか。

しかし、目次を読むということは、全体像を知るということです。
全体像を知れば、自分が優先的に学習すべきところが分かります。
なので、時間の無駄がないんですね。

だから、まずは目次を熟読しましょう。

#興味のあるところから読む
目次を熟読した後、興味があるところから読みましょう。
そう、興味ファースト。

なぜかというと、人間は興味あるものの方が記憶に残りやすいんですね。
これに関しては、どんな人でも感覚的に分かると思います。

そして、興味あるところを理解した後、それを読んだことによって興味をもったところを、また目次から探して読む。
これの繰り返しが効率いいと思います。

だから、興味ファーストで読んでみてください。

#関連させて読む
プログラミングは様々な分野がありますが、それぞれの分野を関連させて読みましょう。
例えば、RubyエンジニアがPHPの技術書を読むとき、Rubyと関連させて読んだり。

どの分野でも共通する部分、例えば具体的な単語とかが絶対あると思うので、地図を作るかのようにそれらを線でつなげていく。
そして、その地図が大きくなればなるほど、エンジニアとしてのレベルが上がると思います。

関連させて読むのは本当に大事です！

#プログラミングの学習法は試行錯誤あるのみ
簡単に技術書の読み方を紹介しました。
僕もまだまだペーペーなので、これよりももっと効率の良い学習方法があるはずです。

効率の良い学習方法は、一朝一夕で身につくものではないので、試行錯誤を継続して自分に最適な学習法を身につけたいですね。

これを読んでくださった方で、
「自分はこうやって勉強してる！」
みたいなのがあればコメントください。
よろしくお願いします。
Animate CCで重ね順に困った話

# 経緯
Flappy Birdを作ったはいいが背景が物足りない......
せや！クリアした土管の数に合わせて背景を変化させたろ！
と、安直な発想で背景に画像を流すことに。

これまでに作ってきたゲームでも重ね順によって操作が...みたいなことがあったので
今回はAnimate内でレイヤーを分けて重ね順を管理することに。


# 重ね順
1. 地面、ゲーム開始時などの文字
2. 鳥
3. 土管
4. 背景
5. レイヤーを４つに分けて数字が大きいほうが後ろに来るように配置。


# 結果
コード等すべて用意して実行してみると...
背景に流れる画像以外は思った通りの動き。
ただ、背景に流れる画像だけは土管の前に来る。なんで？


# 土管と鳥と背景と地面
背景の画像がどの位置にいるのか確かめるためにいろいろ位置を変えたりしてみた結果、、
以下の順番で重なっていた。
（数字が大きいほうが後ろ）

1. 地面
2. 鳥
3. 背景画像
4. 土管


そこでそれぞれのゲーム内への追加のされ方だろう、ということで見てみると...
地面と鳥はAnimate内ですでに配置をされていて座標をいじっているだけの状態。
背景画像と土管はAnimateで配置したムービークリップに対してコード上でアドしている。
たぶんこれが原因だ、ということで解決策を考える。
レイヤー分ければ解決するはずなんだけど...


# 解決方法
まずaddChildだったものをaddChildAtに変えてみる。
これでaddChildのタイミングでindexを指定できるらしい。

```js
addChildAt(child, index)

//実際に書いたコード
sceneContainer.bgContPos.addChildAt(bgCont, 100);
```

で土管を前に！とz-indexと同じ要領でやってみたら、消えた。
見事に一番後ろに回ってしまった。

ということでaddChildAtは置いておいてsetChildIndexを使ってみる。
これで任意のchildのindexを指定できる。

```js
setChildIndex(child, index)

// 実際に書いたコード
sceneContainer.bgContPos.SetChildIndex(bgCont, 0);
```

やってみたけどうまくいかない。
なんでだ？と思ってたけどよく考えたら原因がわかった。

childで指定してる対象が土管なり背景の画像なりでaddChildしたムービークリップ内でindexを変えているだけだった。

ということで背景画像をアドしているムービークリップのindexを変えてみる。

```js
sceneContainer.setChidIndex(sceneContainer.bgContPos, 1);
```

できた。
けどなんかやり方がキモイ。

# 謎
本来であればaddChildされるムービークリップの重ね順をAnimate内で変えれば結果もそうなるはず。
だけどならなかった。よくわからない。

ということでこれはまた今度原因を調査してみる。
windows版kobitoのデータexport方法

## はじめに

ubuntuからmacに乗り換えるためlinuxのkobitoのデータをバックアップしておきたかった。macのほうはexport方法書いた記事あるけどwindows版のほうはなかったので調べた結果を記録として残しておく。
kobitoは今後積極的にメンテされないみたいなので他のツール探したほうがいいのかな、使いやすく気に入っていたので残念。

## export手順

- kobitoを起動
- メニュー内「kobito」→「設定」→「開発者向けツールを表示する」をクリックしてdeveloper toolを表示
- consoleに以下のソースを貼り付けて実行する

```js
var fs = require("fs");
var openReq = indexedDB.open('IDBWrapper-items');

openReq.onsuccess = function(event){
  var db = event.target.result;
  var trans = db.transaction('items', 'readonly');
  var store = trans.objectStore('items');
  var request = store.openCursor();
  
  request.onsuccess = function (event) {
  
    if(event.target.result == null) {
      return;
    }
    
    var cursor = event.target.result;
    var data = cursor.value;
    fs.writeFile(cursor.key + ':' + data.title + '.md', data.body, (error) => { console.log(error) });
    cursor.continue();
  }
  
}
```

## 内容について

indexedDBにデータを保存しているようなので、全データ持ってきてファイルに書き出しているだけ

## 参考

https://qiita.com/mizchi/items/8b676d598325cedaa3f2
url_helper で id とかが勝手に補完される件

例えば routes.rb で

```rb
resources :entries
```

と定義されていて、 ``/entries/3`` にアクセスしたとする。

``app/views/entries/show.html.erb`` 内に edit_entry_path とかを書く場合、通常は

```erb
<%= link_to 'edit', edit_entry_path(@entry.id) %>
```

とか

```erb
<%= link_to 'edit', edit_entry_path(params[:id]) %>
```

とか書くと思うんだが、実は id を省略して、

```erb
<%= link_to 'edit', edit_entry_path %>
```

と書くことが出来、この場合 id: 3 が補完される。

調べた限りこの書き方はどこにもドキュメントされていないのでおそらく推奨はされていないが、とにかくこれは動く。

具体的に、何がどのように補完されるのかコードを追ってみたところ、

https://github.com/rails/rails/blob/b383b346600d5325a211376837bc83b7ae472f46/actionpack/lib/action_controller/metal/url_for.rb#L33

```rb
def url_options
      @_url_options ||= {
        host: request.host,
        port: request.optional_port,
        protocol: request.protocol,
        _recall: request.path_parameters
      }.merge!(super).freeze
```
というコードがあり、ここで ``:_recall`` に渡されている ``request.path_parameters`` が url_helper の足りない部分を補完する挙動となっている。

view の spec を書くと「id 指定がないよ」とエラーになる。補完すべき id がわからないので当然とも言える。