OmniAICreator/Qiita-1.07M huggingface dataset:
Googleフォームのプルダウンリストにスプレッドシートの内容をぶち込むスクリプト

googleフォームで参加希望を取るときに、名前を入力してもらうことが多々あります。しかし、名簿があるのにわざわざ入力させるのはイヤですよね。(データ処理的にも)
今回はGoogleAppScriptでスプレッドシートにある名前一覧をgoogleフォームのプルダウンリストにぶち込むプログラムを公開したいと思います。

```js
function addListItem() {
  var ssid = "*******"; //スプレッドシートのID
  var ss = SpreadsheetApp.openById(ssid);
  var sheets = ss.getSheets();
  var mst = sheets[0]; //シートナンバー(0から始まる)
  
  var formid = "*******"; //フォームのID
  var form = FormApp.openById(formid);
  var item = form.addListItem();
  
  item.setTitle('あなたの名前は') // フォームの質問のタイトル
  
  var choices = [];
  
  for(var i = 1; i < 20; i++){
    var range = mst.getRange(i, 1); //(行, 列)
    choices.push(item.createChoice(range.getValue()));
  
  }
  
  item.setChoices(choices);
  
}
```
これを一回実行すれば"リストにぶち込んでやるぜ"って事ができるはずです。
EC2インスタンス作成時のユーザーデータ・メタデータのまとめ

# 前書き

EC2作成時にユーザーデータを指定したいが、
メタデータについて忘れがちなのでまとめた。

# ユーザーデータ

* OSの起動スクリプト
* EC2インスタンスの初回起動時(作成時)に実行したい処理を設定する。

## 使い所

* Apacheをインストールして、Webサービスを起動し、OS再起動時にもWebサービスが起動する様にする。
* ElasticIPをEC2インスタンスに紐つける。

# メタデータ

* インスタンスIDやIPアドレス、ホスト名などEC2インスタンス自身に関するデータ。
* 実行中のEC2インスタンスは設定や管理の為にメタデータを利用する事ができる。

## 使い所

* ユーザーデータから(作成前の状態)からインスタンス作成後のインスタンスIDやホスト名などを取得したい時に利用できる。

## 主なメタデータ

| **メタデータ** | **説明** |
| :--- | :--- |
| ami-id | インスタンスの作成にしようされたAMI ID |
| hostname | ホスト名 |
| iam/security-credentials/role-name | IAMロール名 |
| instance-id | インスタンスID |
| local-ipv4 | プライベートIPアドレス |
| public-ipv4 | Public/ElasticIPアドレス |

# 後書き

しっかりユーザーデータを書いて、効率的にEC2を起動したいです。
(認定試験でも必須っぽいです)
yumからPostgreSQLの最新版をインストールする


PostgreSQLの最新版をyumでインストールするための手順です。
詳しくは以下のサイトを参照してください。
https://yum.postgresql.org/howtoyum.php
https://yum.postgresql.org/

## RPMパッケージの最新版を確認する  
* https://yum.postgresql.org/repopackages.php  

## RPMのダウンロードとyumインストール
【例】CentOS7 x86_64、PostgreSQL9.6(2017年6月現在の安定版)

```
$ wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
$ sudo rpm -ivh pgdg-centos96-9.6-3.noarch.rpm
$ sudo yum -y install postgresql96-server postgresql96-devel postgresql96-contrib
```
## DB初期化、自動起動設定、接続設定の編集
```
$ sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
$ sudo systemctl start postgresql-9.6
$ sudo systemctl enable postgresql-9.6
$ sudo systemctl status postgresql-9.6
$ sudo vi /var/lib/pgsql/9.6/data/pg_hba.conf
```

## DBユーザの作成
```
$ su - postgres
$ psql
# CREATE USER hoge WITH PASSWORD 'hogehoge';
# \q
$ psql hoge
```

## PostgreSQLディレクトリ構成
* コマンド、ライブラリなど  
```/usr/pgsql-9.6```  

* データ関係  
```/var/lib/pgsql/9.6```
Chef ではまるところ（自分用メモ）

# chef をつかっていてはまるところを自分用にメモしておきます。

#### ssh でははいれるのに、chef でエラーになる。
```
Too many authentication failures for *username*
```
が出るパターンです。ssh-config に、IdentitiesOnly yes　と書くと
いいみたい。ssh client がいろいろアクセスを試みるのでエラーになるのでそれを防ぐようにします。
Matlabのオブジェクトの値渡し

# はじめに
Matlabでは、オブジェクトのプロパティを
可変にする場合、handleクラスを継承して書き始めます。

まず下のようなクラスファイルを準備してみてください。

```matlab:SpecializedCopy.m
classdef SpecializedCopy < handle
   properties
      Prop1
      Prop2 = datestr(now)
   end
   methods(Access = protected)
      function cp = copyElement(obj)
         cp = SpecializedCopy;
         cp.Prop1 = obj.Prop1;
         cp.Prop2 = datestr(now);
      end
   end
end
```

そのあとで、次のように実行していくと、
matlabのhandleクラスが参照渡しであることがわかります。

```matlabsession
>> a = SpecializedCopy
a = 
  SpecializedCopy with properties:
    Prop1: []
    Prop2: '29-Jun-2017 10:54:19'
>> a.Prop1 = 'not copyable';
>> b = a
b = 
  SpecializedCopy with properties:
    Prop1: 'not copyable'
    Prop2: '29-Jun-2017 10:54:19'
>> b.Prop1 = 'change a property'
b = 
  SpecializedCopy with properties:
    Prop1: 'change a property'
    Prop2: '29-Jun-2017 10:54:19'
>> a
a = 
  SpecializedCopy with properties:
    Prop1: 'change a property'
    Prop2: '29-Jun-2017 10:54:19'
```


# オブジェクトの値渡し

参照渡しをすると、コピーしたはずのオブジェクトのpropertyを書き換えたとき、
元々のオブジェクトのプロパティも書き換わり望ましくない挙動をすることがあります。

そこで、値渡しの出番です。
`handle`クラスの代わりに、`matlab.mixin.Copyable`を
継承してクラスを書けば実現できます。

# 実装・実行例

クラスファイルをまず下のように書きます。

```matlab:SpecializedCopy.m
classdef SpecializedCopy < matlab.mixin.Copyable
   properties
      Prop1
      Prop2 = datestr(now)
   end
   methods(Access = protected)
      function cp = copyElement(obj)
         cp = SpecializedCopy;
         cp.Prop1 = obj.Prop1;
         cp.Prop2 = datestr(now);
      end
   end
end
```

コンソールにて、下のように実行すれば、オブジェクトをコピーすると
値渡しが実現出来ていることが確認できると思います。

```matlabsession
>> a = SpecializedCopy;
>> a
a = 
  SpecializedCopy with properties:
    Prop1: []
    Prop2: '29-Jun-2017 10:50:58'
>> a.Prop1 = 'copyable';
>> b = copy(a)
b = 
  SpecializedCopy with properties:
    Prop1: 'copyable'
    Prop2: '29-Jun-2017 10:51:19'
>> b.Prop1 = 'rewritten'
b = 
  SpecializedCopy with properties:
    Prop1: 'rewritten'
    Prop2: '29-Jun-2017 10:51:19'
>> a
a = 
  SpecializedCopy with properties:
    Prop1: 'copyable'
    Prop2: '29-Jun-2017 10:50:58'
```


# 参考文献
[オブジェクトのコピー - MATLAB & Simulink - MathWorks 日本](https://jp.mathworks.com/help/matlab/matlab_prog/copying-objects.html)
C++ で関数引数の評価順序を保証したかった

[ブログ記事](http://secret-garden.hatenablog.com/entry/2017/06/28/201315)からの転載です。

## [関数引数の評価順序]

C++ではと関数を呼び出す際に渡される引数の評価順序は未規定になっています。  
どういうことかというと次のようなコードの場合、処理系によって出力される値が異なる可能性があります。

```cpp
template<typename T>
auto
print(T value){
	std::cout << value;
	return value;
}

template<typename... Args>
void
func(Args&&...){}

// 123 と出力されるかもしれないし 321 と出力されるかもしれない
func(print(1), print(2), print(3));
```

上記のようなコードの場合、 clang では `123` と出力されますが、gcc では `321` と出力されます。
ただし、これは関数呼び出しの場合のみで、コンストラクタの `{}` 呼び出しや、初期化リストの `{}` では順序が『左から右の順で評価される』ことが保証されています。
ですので次のような初期化リストを呼び出した場合は期待通りの動作を行います。

```cpp
template<typename T>
auto
print(T value){
	std::cout << value;
	return value;
}

// 123 と出力されることが保証されている
auto dummy = { print(1), print(2), print(3) };
```


## [可変長テンプレート引数で引数分関数を呼び出したい]

上記の仕様を踏まえた上で、次のような処理を考えてみます。

```cpp
template<typename F, typename... Args>
auto
call(F f, Args... args){
	// 可変長引数の数だけ f を呼び出してその結果を tuple で返す
	return std::make_tuple(f(args)...);
}

using namespace std::literals::string_literals;
auto twice = [](auto a){ return a + a; };
auto result = call(twice, 1, 3.5, "homu"s);

assert(result == std::make_tuple(2, 7.0, "homuhomu"));
```

『可変長引数の数だけ `f` を呼び出してその結果を `tuple` として返す』という簡単な関数です。
しかし、残念なことに `std::make_tuple(f(args)...)` という関数呼び出しでは、評価順序が処理系によって異なってしまいます。

```cpp
auto print = [](auto a){
	std::cout << a << std::endl;
	return a;
};
// print の呼び出しが不規定なのでどういう出力になるのかが保証されてない
call(print, 1, 3.5, "homu"s);
```

## [`std::make_tuple` ではなくて `std::tuple` コンストラクタを使う]

上記の問題は `std::make_tuple` ではなくて `std::tuple` のコンストラクタを呼び出すことで回避できます。

```cpp
template<typename F, typename... Args>
auto
call(F f, Args... args){
	// std::tuple のコンストラクタを呼び出すことで評価順序を保証する
	return std::tuple<decltype(f(args))...>{f(args)...};
}

auto print = [](auto a){
	std::cout << a << std::endl;
	return a;
};
// 出力結果が保証される
call(print, 1, 3.5, "homu"s);
```

これで意図した順番で評価される事が保証されます。

## [参照]

* [C/C++関数引数の評価順序 - yohhoyの日記](http://d.hatena.ne.jp/yohhoy/20120304/p1)
* [括弧初期化リスト(braced-init-list)内では順番に評価される - とくにあぶなくないRiSKのブログ](http://sscrisk.hatenablog.com/entry/2014/07/15/%E6%8B%AC%E5%BC%A7%E5%88%9D%E6%9C%9F%E5%8C%96%E3%83%AA%E3%82%B9%E3%83%88%28braced-init-list%29%E5%86%85%E3%81%A7%E3%81%AF%E9%A0%86%E7%95%AA%E3%81%AB%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%82%8B)
Linuxのviで文字化けをしないようにする



# はじめに
　いまどきのLinuxOSの文字コードはutf8となっているが、マイグレーションや、過去に作成したEUCのシェルなどをそのまま使いたい場合、そのようなファイルをviで表示、保存できるようにしたいと思い、その方法をメモしておきます。
 
# メニュー
 
1.ファイルの文字コードを確認する
2.文字コードを指定して表示しなおす
3.ファイルのエンコードを指定して保存する
4.~/.vimrcファイルの設定



## 1.ファイルの文字コードを確認する
 　viであるファイルを開いたときに文字化けしていた場合、下記のコマンドでファイルの文字コードを確認できます
  
  ファイルエンコードの確認
  `:set fenc?`
  
  
# 2.文字コードを指定して表示しなおす
  `:e ++enc=文字コード`
  例）euc-jpのファイルを表示しなおす
 ` :e ++enc=euc-jp`
 
 **表示だけが変わります。保存時の文字コードを変更するのは下記を参照** 
 
# 3.ファイルエンコードを指定して保存する
`:set fenc=文字コード`
例) 保存形式をeuc-jpに変える
`:set fenc=euc-jp`
**これでは保存はされないので「:wq」で保存してください**
 
# 4.~/.vimrcの設定
```
# vi ~/.vimrc
---- 追記 ----
set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
set fileformats=unix,dos,mac
---------------

※ 設定を反映
# source ~/.vimrc
```


以上
[Swift] ローカル通知と通知アクションの呼ばれ方

#[Swift] ローカル通知と通知アクションの呼ばれ方
```
import UserNotifications

//ローカル通知クラスとして実装
class NotificationManager: NSObject, UNUserNotificationCenterDelegate {

    //シングルトン
    static let shared = NotificationManager()
    
    private override init() {
        super.init()
        regist()
    }
    
    func regist() {
        //デリゲート設定
        UNUserNotificationCenter.current().delegate = self
        //通知利用の登録
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            // Error
        }
    }
    
    //フォアグラウンド時の通知
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])
    }
    
    //通知タップ
    //以下の場合呼ばればい
    //・通知をタップしない場合
    //・通知を×ボタンで閉じた場合
    //・ロック画面で消去をタップした場合
    //・フォアグラウンド指定なしでアプリが起動していない場合
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        completionHandler()
    }
    
    func add() {     
        //フォアグラウンド指定なしなのでアプリが起動していない場合は通知タップが呼ばれない   
        let action1 = UNNotificationAction(identifier: "action1", title: "action1", options: [])
        
        //フォアグラウンド指定ありなのでアプリが起動していない場合も通知タップが呼ばれる
        let action2 = UNNotificationAction(identifier: "action2", title: "action2", options: [.foreground])

        let category = UNNotificationCategory(identifier: "myCategory", actions: [action1, action2], intentIdentifiers: ["action1", "action2"] , options: [])       
        UNUserNotificationCenter.current().setNotificationCategories([category])
        
        let content = UNMutableNotificationContent()
        content.title = NSString.localizedUserNotificationString(forKey: "title", arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: "body", arguments: nil)
        content.sound = UNNotificationSound.default()
        content.categoryIdentifier = "myCategory"
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)
        let request = UNNotificationRequest(identifier: "myNotification", content: content, trigger: trigger)

        //通知の追加
        UNUserNotificationCenter.current().add(request) { (error : Error?) in
            if error != nil {
                // Error
            }
        }
    }
}
hdparmでHDDの電源を落とす

Ubuntu 17.04で動作確認。

udevからhdparmを呼び、スピンダウンタイムアウトを設定します。removableではないこと（USBメモリーではない）、rotationalであること（HDDである）を条件にしています（参考：[hdparm \- ArchWiki](https://wiki.archlinuxjp.org/index.php/Hdparm)）。/etc/hdparm.confから設定すると個別にディスクを設定する必要があるので、udevから設定する方が楽です。

``` /etc/udev/rules.d/50-hdparm.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{removable}=="0", ATTR{queue/rotational}=="1", RUN+="/sbin/hdparm -S 240 /dev/%k"
```

その後不必要に復帰していないか、一括で確認します。

```
lsblk -d -n -o NAME,RM,TYPE,MODEL,SERIAL -p |
  while read LINE; do NAME=$(echo $LINE | cut -d' ' -f1) &&
    [ $(echo $LINE | cut -d' ' -f2) -ne 0 -o "$(echo $LINE | cut -d' ' -f3)" != 'disk' ] &&
    continue;
    echo $(sudo hdparm -C $NAME | grep -e 'drive state is:') \
      $NAME \
      $(echo $LINE | cut -d' ' -f4) \
      $(echo $LINE | cut -d' ' -f5) \
      $(echo $LINE | cut -d' ' -f6);
  done
```
WPSのPBC方式をWiresharkでキャプチャしてみた

勉強がてら、WPS（Wi-Fi Protected Setup）のPBC（プッシュボタン方式）のやりとりをWiresharkでキャプチャして仕様書と見比べてみました。

# WPSの仕様書

WPSの仕様書は下記URLからダウンロードできます。

- http://www.wi-fi.org/downloads-registered-guest/Wi-Fi_Simple_Configuration_Technical_Specification_v2.0.5.pdf/29560

この仕様書から、PBCのメッセージ交換の図（Firugre 11）を引用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/46856/4e2d52f0-59ef-552f-3c18-4f014fde08b5.png)

Enrolleeがいわゆる子機、AP+Registrarが親機です。我々が普段使うような環境であればAPとRegistrarは同一機器なので通信は発生せず、単なるライブラリコールとなります。

# Wiresharkでキャプチャ

手近にあったUSB無線LAN子機と親機とをPBCで接続してみた上で、別のマシンを使ってモニタモードでパケットキャプチャしてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/46856/7b978895-8aa4-2478-30eb-57f0ac720fd3.png)

仕様書と同じようなやりとりが行われているのがわかります。M1やM3が何度も送られているのは、おそらくそういうものなのでしょう。

M8にはPSKが含まれており、この一連のやりとりの後で改めてWPA/WPA2の認証を行うと考えられますが、M8の値は暗号化されているため、実際に何の情報が含まれているかは確認できませんでした（M1/M2でDiffie-Hellman鍵交換を行っているため、盗聴者にも解読は不可能）。
Raspberry Pi 2で時刻を合わせる

# はじめに
ntpdateコマンドを実行しても時刻があわなくて困ったので、記録する。

# TL;DL
1. 時刻ズレが大きいと、Fixしてくれない
2. `the NTP socket is in use, exiting` は `sudo systemctl stop ntp` で一度停止するればよい
3. `no server suitable for synchronization found` は 社内サーバを指定することで対処 (社内Proxyの問題?)
 
# 環境
Raspberry PI 2 Model B
RASPBIAN JESSIE LITE (2017-06-21)

# 手順
addressは、`ntp.jst.mfeed.ad.jp` で良いと思いますが、社内から使えなかった。

```
sudo systemctl stop ntp
sudo date -s '06/29 10:19:58 2017'
sudo ntpdate <address>
sudo systemctl start ntp
```
RippleでBIP44 HDWALLETを作成する

# RippleでBIP44 HDWALLETを作成する

ledger wallet nano sでbip44ウォレットを使っていたのでニーモニックからアドレスを復元する互換ライブラリを開発してみた

この方法で作成されたリップルアドレスにはシークレットキーが存在しないのでシークレットキーを利用したサービスが利用できないので注意する必要がある

## 用意

npm で以下のモジュールをインストール

* bip39
* ripple-bip32

bip39は乱数の初期化ベクトル作るだけの仕組みでビットコイン全く関係ないからビットコインのモジュールそのまま使える

## BIP仕様

* https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
* https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
* https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

## コイン種別

* コイン種別は144
* satoshilabsのslip-44で追加されている
* https://github.com/satoshilabs/slips/blob/master/slip-0044.md

## サンプルコード

```
var bip39 = require('bip39');
var bip32 = require('ripple-bip32')

var mnemonic = 'armed bundle pudding lazy strategy impulse where identify submit weekend physical antenna flight social acoustic absurd whip snack decide blur unfold fiction pumpkin athlete';
var password = '';
var masterseed = bip39.mnemonicToSeed(mnemonic, password);
var hdnode = bip32.fromSeedBuffer(masterseed);

var getKeyPair = function(hdnode){
    return {
        "address" : hdnode.getAddress(),
        "private" : hdnode.keyPair.getKeyPairs().privateKey,
        "public" : hdnode.keyPair.getKeyPairs().publicKey,
    }
}

// cointype=144=xrp
// m / purpose' / coin_type' / account' / change / address_index
console.log(getKeyPair(hdnode.derivePath("m/44'/144'/0'/0/0")))
console.log(getKeyPair(hdnode.derivePath("m/44'/144'/0'/0/1")))
```

# 利用場面

* 共通のカギから個別入金アドレス生成（destination_tagを普通は利用するのでニーズは低い）
* ledger walletのアドレスを復元
* https://www.ledgerwallet.com/r/f750?path=/products/ledger-nano-s%C2%A0%E2%80%A6

![ledger-nano-s-fold-large.png](https://qiita-image-store.s3.amazonaws.com/0/9834/1d5b8c01-c8c0-ad83-df35-b7860d2edfef.png)


# 残高確認やトランザクションの送信

* ripple-libでrippledにつないでwebsocket経由でおこなう
* トランザクションの署名はbip32で作ったアドレスはripple-libのsecretkeyと互換性がないので別途ripple-sign-keypairsをインストールして署名する必要がある

# 関連ページ

* https://www.npmjs.com/package/ripple-bip32
* https://www.npmjs.com/package/ripple-sign-keypairs

# なぜbip32で生成するとrippleのsecretkeyと互換性がないか

```:BIP32
mnemonic + password -> seed -> xprv -> privatekey -> wif
                                   +-> xpub -> publickey -> address
```

```:ripple(AccountFamily)
secretkey -> privategenerator -> privatekey
                             +-> publicgenerator -> publickey -> address
```

上記図からsecretkeyと呼んでいるものはbitcoinにおけるseedとなっていてアドレスに対応した秘密鍵ではないことがわかる

* [AccountFamilyについて](http://qiita.com/you21979@github/items/ddcdd4de31fb96c26ad2)
Rails deviseでfacebookログイン機能実装する


## gemを入れる

```txt:Gemfile
gem 'devise'
gem 'omniauth-facebook'
```
```
$ bundle install
```


## Userモデル作成
```
$ rails g devise:install
$ rails g devise user
```

## providerカラム、uidカラム作成

デフォルトで設定されているカラムのようなので、おとなしくレファレンス通りに設置。

```
$ rails g migration AddOmniauthToUsers provider:string uid:string
$ rake db:migrate
```


## facebook developers登録

ここらから登録できます。
https://developers.facebook.com

登録後、アプリ名を入力し、このダッシュボードまで行きましょう。その後、”プラットフォームの追加”からウェブサイトを登録でlocalhostを登録しておきましょう。ウェブサイトに登録していないとエラーがでました。

<img width="1383" alt="fb01.png" src="https://qiita-image-store.s3.amazonaws.com/0/112515/6eeb4eae-b796-c940-2e45-5b31d9c8a060.png">


```

```


## deviseの設定

環境変数で登録します。

```rb:config/initializers/devise.rb
Devise.setup do |config|
  #ここを追加
  #:facebook,アプリケーションID,シークレットキーの順
  config.omniauth :facebook,ENV['PICTWEET_FB_ID'],ENV['PICTWEET_FB_SECRET']
```

環境変数を登録。APP_ID, SECRET_IDはご自身のに置き換えてください。 


```
$ export PICTWEET_FB_ID=APP_ID
$ export PICTWEET_FB_SECRET=SECRET_ID
```

## ルーティングの設定


```rb:user.rb
# :omniauthable, omniauth_providers: [:facebook] を追加

devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable, omniauth_providers: [:facebook]
```


```
$ rake routes

#↓が追加されていることを確認

user_facebook_omniauth_authorize GET|POST /users/auth/facebook(.:format)          users/omniauth_callbacks#passthru
user_facebook_omniauth_callback GET|POST /users/auth/facebook/callback(.:format) users/omniauth_callbacks#facebook
```

## viewにリンクを設置


```
<%= link_to "Sign in with Facebook", user_facebook_omniauth_authorize_path, class: "post" %>
```


## controllerの設置

ファイルの作成

```
$ touch app/controllers/omniauth_callbacks_controller.rb
```

レファレンスからそのままコピペ 

```rb:app/controllers/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def facebook
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?#persisted?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

  def failure
    redirect_to root_path
  end
end

```

完成！！！

https://gyazo.com/1ba4b70310cc2e3e177b9ceaf671288b

参考
http://qiita.com/hiyoko/items/3c9a2e2a351fcd5b0698
https://github.com/plataformatec/devise/wiki/OmniAuth%3A-Overview
消えてしまったメモ達

消えてしまったメモ達。悲しい。

<h1>mautic</h1>

mauticさんと日々戦ってらっしゃる企業
https://webloco.webolha.com/websuccess/2016/07/09/about-mautic/



<h1>ajaxzip3</h1>

郵便番号検索を快適に

>http://shanabrian.com/web/library/ajaxzip3.php

mauticとうまく組み込みたかった(過去形)


<h1>googleとfirefoxのflickity </h1>

サイトの読み込み(スライドショー)が違いすぎる・・

>https://syncer.jp/how-to-use-flickity
>


<h1>google map api</h1>

地図上では横移動だけにしたい･･。
そんな時はgooglemap apiでカスタマイズだ！
ただし！地図の作成からな！(白目)

https://www.ajaxtower.jp/googlemaps/

<h1>構造化マークアップ</h1>

しらべればしらべるほどやるはんいがおおい

>検索結果表示画面では、ヒットしたWebページのタイトルの下に数行のテキストが表示されています。
これらのテキストはスニペットと呼ばれ、ユーザーがページの内容や検索キーワードとの関連性を把握できるようにするために表示されています。
https://www.seohacks.net/basic/terms/rich_snippet/

現在では(2016年の時)SEO的には関係ないけど、今後関わってくるから
書いておいたほうがいいよ！っていうもの

書き方参考
>http://qiita.com/narumana/items/b66969b80cce848b2ddf
react内で、ajax通信の結果を、setStateしたい時のthisのbindの仕方

ブログに記事を写しました。[react-nativeで、ajax通信の結果を、setStateしたい時のthisのbindの仕方](http://u-kan.hatenadiary.jp/entry/rn-ajax-this)

reactと組み合わせてjqueryを使っている時に、ajaxでPOST通信を送ろうとした。この時のmthisのbindの位置が直感とはずれてたので、メモ。


## thisにjqueryの関数自身が入る

```ex1.js
export default class Example extends React.Component

  constructor() {
    this.example = this.example.bind(this);
  }

  example() {
    $.ajax({
      type: 'POST',
      url,
      data: JSON.stringify(data),
      success(res) {
        // ここのthisの話
        this.setState({ res });
      },
      error(error) {
        // ここのthisの話
        this.setState({ error });
      },
    });
  }
}

```

そりゃそうか。直さなきゃ。

## thisにjqueryの関数自身が入る〜Part2〜

ajaxメソッドを読んだ時に、thisをbindしなきゃいけないから、きっと関数の閉じカッコの後ろにつけてあげればいいんだろうな。。。から。

```ex1.js
export default class Example extends React.Component

  constructor() {
    this.example = this.example.bind(this);
  }

  example() {
    $.ajax({
      type: 'POST',
      url,
      data: JSON.stringify(data),
      success(res) {
        // ここのthisの話
        this.setState({ res });
      },
      error(error) {
        // ここのthisの話
        this.setState({ error });
      },
    }).bind(this);
  }
}

```

しかしこれもajax関数自身がthisに入ってくる。

そんで以下を試したら解決

## 解決策

結局綺麗に（？）bindするのが無理だったので、変数に格納して取って置くことにした。すっきりしないけど、困ったら愚直に

```ex1.js
export default class Example extends React.Component

  constructor() {
    this.example = this.example.bind(this);
  }

  example() {
    const _this = this;
    $.ajax({
      type: 'POST',
      url,
      data: JSON.stringify(data),
      success(res) {
        // ここのthisの話
        this.setState({ res });
      }.bind(this),
      error(error) {
        // ここのthisの話
        this.setState({ error });
      },
    }).bind(this);
  }
}

```


あれ、no_underscore_dungleのlinter errorでてる。。。（気にしない）
今すぐ使えるMySQLのコマンド集 - スロークエリの調査

# はじめに

- 業務をする上で良く忘れる場合があるため、まとまったメモとして残してます
- 周囲に教える際の参考資料のためでもあります
- 前提条件など結構すっ飛ばしております

# スロークエリとは

- SQLを実行する際に予めMySQLにて設定された実行結果までのタイムを越えたクエリ
- MySQLの設定でログとして出力することができる

```mysql:mysql-slow.log
# Time: 110723 13:22:02
# User@Host: root[root] @ localhost []
# Query_time: 7.677186  Lock_time: 0.156390 Rows_sent: 1  Rows_examined: 1386155
use hoge_db;
SET timestamp=1311394922;
SELECT count(*) FROM `hoge_table` WHERE (hoge_time between '2011-07-19 18:00:00' AND '2011-07-19 19:00:00') AND (hoge_id = 1) AND (hage_id = '1');
```

- 1行目 記録日時
- 2行目 ユーザーIDとリクエストした端末
- 3行目 Query_time（実行時間）　Lock_time(ロック時間)　Rows_sent（送信行数）
 Rows_examined（処理対象となった行数）
- 4行目 SQL文

# EXPLAINとは

- スロークエリを最適化する際に、どのように最適化すれば良いかをMySQLが教えてくれるコマンド
- 主に見るべきところとしてはtype、rows、

```mysql
mysql> EXPLAIN SELECT * FROM hoge;
+----+-------------+----------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+----------+------+---------------+------+---------+------+-------+-------+
|  1 | SIMPLE      | hoge  | ALL  | NULL          | NULL | NULL    | NULL | 46497 |       |
+----+-------------+----------+------+---------------+------+---------+------+-------+-------+
```

## type

|#|ステータス名|説明|
|:---|:---|:---|:---|:---|
|1|system|テーブルに1レコードしかない状態|
|2|const|マッチするレコードが1件しかない状態。PRIMARY KEYまたはUNIQUEインデックスを利用して検索される|
|3|eq_ref|JOINにおいてPRIMARY KEYまたはUNIQUEインデックスを利用して1つのレコードを検索している状態|
|4|index|すべてのレコードのインデックスをスキャンする必要がある状態(フルインデックススキャン)|
|5|ALL|すべてのレコードを走査する必要がある状態(フルテーブルスキャン)|

### 最適化ポイント
- const、eq_ref、rengeは、インデックスを有効に利用できている
- indexはインデックスをフルスキャンしているので遅い。インデックスの見直しが必要
- ALLの場合はテーブルフルスキャン。インデックスもしくはテーブル構成の見直しが必要

## row

- クエリによって取得が想定される行数
- 実際に取得された数ではないところに注意が必要

## Extra

|#|ステータス名|説明|
|:---|:---|:---|:---|:---|
|1|Using where|WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することが出来ない場合に表示される|
|2|Using index|クエリがインデックスだけを用いて解決できることを示す。Covering Indexを利用している場合に表示される|
|3|Using filesort|メモリ上のバッファでソート処理ができず、テンポラリファイルが作成されてソート処理がされている場合に出力される。SQL文にORDER BY句を指定している場合に表示される|
|4|Using temporary|クエリの実行にテンポラリテーブルが必要な場合に表示される。SQL文がJOINかつORDER BY句を利用している場合やGROUP BY句とORDER BY句で指定しているカラムが異なる場合などで発生することがある|
|5|Using index for group-by|MIN()/MAX()がGROUP BY句と併用されているとき、クエリがインデックスだけを用いて解決できることを示す|
|6|Range checked for each record (index map: N)|JOINにおいてrangeまたはindex_mergeが利用される場合に表示される|
|7|Not exists|LEFT JOINにおいて、左側のテーブルからフェッチされた行にマッチする行が右側のテーブルに存在しない場合、右側のテーブルはNULLとなるが、右側のテーブルがNOT NULLとして定義されたフィールドでJOINされている場合にはマッチしない行を探せば良い・・・ということを示す|


# 全ページリンク
- [今すぐ使えるMySQLのコマンド集 - スロークエリの調査](http://qiita.com/neriai/items/586a8f100a7b3308c8d1)
- [今すぐ使えるMySQLのコマンド集 - INDEXの作成](http://qiita.com/neriai/items/63c6042da429cca881d2)
OMS（Operation Management Suite）でWindows Server 仮想マシンの死活監視

# Operations Management Suite（OMS）とは

- Microsoft のクラウドベースの IT 管理ソリューションです。  
  https://www.microsoft.com/ja-jp/cloud-platform/operations-management-suite

# 想定シナリオ

- 「Azureの東日本リージョンにあるVMを手動でShutdown。登録したメールアドレスにアラートを送信する事」を想定します。

# 事前準備環境

- Azureアカウント
- OMSワークシート（推奨ブラウザ：Edge or IE　推奨言語：English）
    - 他ブラウザでは、ログインエラーの可能性あり。（2017年4月17日現在）
    - 日本語はプルダウンメニューが正常ではない等の現象があります。（2017年4月17日現在）
- Windows VM（windows server 2012 R2、Azure東日本リージョン）

## Login
- 事前準備した、Azureアカウントでログインします。  
  https://mms.microsoft.com

##Workspace
- Login後、Workspaceを作成します。

## エージェント
- Workspaceのホーム画面で「Setting」⇒ 「Connected Sources」からダウンロードします。
- WORKSPACE IDとPRIMARY KEYをコピペしておきます。
- インストール時のウィンドウは、基本デフォルトでOKです。
    - Connect the agent to Azure Log Analytics(OMS)は選択の必要があります。
    - コピーした「Workspace ID」と「Workspace Key」はペーストします。
   
![Inkedlink３_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/189488/6b278e43-8a60-108c-2ae7-20c2ab6545bf.jpeg)

## 設定
- ホーム画面の「Log Search」⇒ 検索ボックスに「*」を入力してEnter。
- 「+Add」⇒ Heartbeatの項目にチェックを入れ、画面左上の「Alert」を選択します。
- Alert Ruleの設定して「save」します。

![link６.png](https://qiita-image-store.s3.amazonaws.com/0/189488/25e39d80-5d1a-7397-6d71-7bcb11d8633c.png)

![link７.png](https://qiita-image-store.s3.amazonaws.com/0/189488/752592bb-3cbc-d994-1ea3-a77ae59d7737.png)

![Inkedlink８_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/189488/0e51d20d-2ea0-6b86-1c08-72a046c5ae1c.jpeg)

![link９.png](https://qiita-image-store.s3.amazonaws.com/0/189488/b4d95c2e-5772-ad12-2fb9-48586856ccac.png)

## 確認
- 「setting」⇒「Alert」から設定を確認します。
- VMをShutdownして、アラート受信を確認します。

![link１０.png](https://qiita-image-store.s3.amazonaws.com/0/189488/73b500ff-800f-07f1-5405-cb50b571bc04.png)

![link１１.png](https://qiita-image-store.s3.amazonaws.com/0/189488/aa962d05-fe23-1584-90f6-baf857bf9419.png)

# 参考

**How to generate an alert in Microsoft OMS when a computer is down or unreachable
**
https://blogs.technet.microsoft.com/msoms/2016/09/08/how-to-generate-an-alert-in-microsoft-oms-when-a-computer-is-down-or-unreachable/
[WordPress]MW WP Form セレクトボックスで登録しているユーザーを選択肢として表示する


フォームを手軽に作れてデータベース保存もできるWordPressプラグインのMW WP Form。

セレクトボックスを作るときに、フィルターフックを使えば自分で選択肢を色々と変更できます。

公式マニュアルにも別例が掲載されていますが、こちらはユーザー一覧の例を

[マニュアル \| MW WP Form](https://plugins.2inc.org/mw-wp-form/manual/)

## セレクトボックスでフォーム側で作っておく

```
ユーザー一覧
// childrenの初期値は、入力値が空で「選択してください」のラベル表示が目的。必須チェックに。
[mwform_select name="field-name" children=",:選択してください"]
```

## フィルターフックでセレクトボックスの一覧をカスタマイズ

```functions.php
function set_users_for_select( $children, $atts ) {
  if ( $atts['name'] == 'field-name' ) {
    foreach ( get_users() as $user ) {
      // ログインIDを入力値、表示それぞれに反映
      // 配列のキーが入力値、配列の値が表示内容
      $children[$user->user_login] = $user->user_login;
    }
  }
  return $children;
}
// xxxの部分にはフォーム識別子を設定する
// [mwform_formkey key="1"] の「1」
add_filter( 'mwform_choices_mw-wp-form-xxx', 'set_users_for_select', 10, 2 );
```
GETされたデータが数字かどうか調べる

index.php?p=123

このようにindex.phpにGETでデータを与えることが多々あると思われる。

例えば...
index.php?p=123
index.php?p=about

その時に、これらを区別したい時

        $p = $_GET["p"];
        if($p+1 < 2){echo "文字列だよ";}
        else{echo "数字だよ";}

<strong>メリット</strong>
多分これが一番短いと思います。

<strong>デメリット</strong>
負の数字が使えない。

<strong>解説とか</strong>

        $p = "hoge";
        $p = $p+1;

とかやると、$pは整数型の1になる。
すなわち、変数が文字列の状態で足し算すると、入っていた文字列は0として扱われる。(または、無視されるのどちらか。)

十分に検証していないため、予期せぬ挙動を示すかもしれない。
Kali LinuxのLive USBをMacで作成する

Mac OSX El Capitanにて、Persistence付きのKali Linux live USBを作成します。

## Prerequisite 

**Kali Linux ISO file**
下記、URLから’Kali 64bit のISOを選択。現時点でのVersionは'2017.1'でした。
> https://www.kali.org/downloads/

**USBドライブ**
買ってきてください。私は16GBを用意しました。

## Step 1 : USB Drive Formatting 
Mac付属の'Disk Utility'を使用して、USBドライブのフォーマットを行います。
USBドライブを挿した後、Disk Utilityを見ると、'NO NAME'みたいな名前で、認識されていると思います。
その一つ上の階層を選択してハイライトした後、'Erase'をクリック、
 - Name : NAME_YOU_LIKE
 - Format : MS-DOS (FAT)
 - Scheme : Master Boot Record
以上を選択したら、また'Erase'をクリック。

*'Scheme'が出てこない場合は、一旦USBドライブを抜き差ししてみてください。

## Step 2 : Kali Linux Installation
Kali LinuxをUBSにインストールします。
'Terminal'を開いて、

```shell
diskutil list
```

>/dev/disk3 (external, physical):
>   #:                       TYPE NAME                    SIZE       IDENTIFIER
>   0:     FDisk_partition_scheme                        *15.4 GB    disk3
>   1:                 DOS_FAT_32 NAME_YOU_LIKE           15.4 GB    disk3s1


で目的のUSBドライブの名前を確認し、(NAME_YOU_LIKE)で置換したあなたが決めた名前になっているはず。
\#0になっているIDを確認して、下記コマンドの入力。

```shell
diskutil unmountDisk /dev/disk3
```

`Unmount of all volumes on disk3 was successful`と出たら完了。
*'disk3'は環境によって異なります。

```shell
sudo dd if=~/Downloads/kali-linux-2017.1-amd64.iso of=/dev/rdisk3 bs=1m
```

Passwordを聞かれるので入力したら、何も表示されませんが、しばらく待ちます。
おおよそ6分かかりました。

>real    6m4.050s
>user    0m0.027s
>sys     0m1.621s


```shell
diskutil eject NAME_YOU_LIKE
```

## Step 3 : Make Persistence Region on USB Drive
shut downした状態のMacにUSBドライブを挿して、起動ボタンを押す。
その直後から、left optionキーを押し続けると、
起動可能なドライブの選択画面が出現する。(ここでoptionキーを離す)
EFI Boot -> Live System (persistence, ...)　と選択。

Terminalを起動して、
```shell
gparted
```

と入力してreturn。

出現したgpartedのwindowで、
現在挿しているUSBドライブのうち、Kali Linuxの入っていない領域をを選択する。
File System : unallocated になっているはずです。(あとは容量で確認)
選択後、メニューバーから'pertition' -> 'New'
Label : persistence
に書き換え、
'Add'をクリック。
'Edit' -> 'Apply All Partitions'
終わったら'Close'

先ほど、unallocatedになっていた、Partitionに名前がついていると思います。e.g. /dev/sda3
これをメモしておいて下さい。

その後、GPartedも閉じる。
そうすると、Terminalに戻るので、下記を入力
/dev/sda3のところは、先ほどメモした、Partition名を入力して下さい。

```shell
mount /dev/sda3 /mnt
echo “/ union” > /mnt/persistence.conf
umount /dev/sda3
```

```shell
reboot
```

再び、Kali LinuxをPersisitenceモードで起動したら、適当に、新規ファイル作成やWifi設定などを行ってみて下さい。
もう、再起動しても設定が消えないはずです。

ありがとうございました。
SPF（Sender Policy Framework）について調査した

メモです。
違っている点などあればご指摘頂けますと。

# 参考

+ [送信ドメインを認証するためのSPFレコードに詳しくなろう](https://sendgrid.kke.co.jp/blog/?p=3509)
+ [SPF（Sender Policy Framework）](http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/)

# SPF is 何?

+ Sender Policy Framework（SPF）
+ SMTPを利用したインターネット電子メールの送受信において送信者のドメインの偽称を防ぐ仕組み

# どうすれば対応出来る?

+ 対応するためにはPostfixなどをインストールしたメールサーバーのIPアドレスについてメールアドレスのドメインのDNSのTXTリソースレコードもしくはSPFレコードを登録しておく

# SPFのチェックを行う場合の通信の流れは？

+ Postfixなどの送信メールサーバーから受信メールサーバーにSMTP通信を行う
+ 受信メールサーバーはMAIL FROM:コマンドの引数に与えられたメールアドレスのドメイン部分を利用してDNSにSPFのレコード情報を取得する
+ 取得したレコードの情報に送信メールサーバーのリストがあるので送信メールサーバーがリストに存在するか確認する。存在すれば正しい送信メールサーバーと判断とする

# SPFレコードの確認

TXTレコードとして登録されている場合、以下のようにすることで確認できます。

```bash
$dig mydomain.com txt +short
"v=spf1 ip4:xxx.xxx.xxx.xxx -all"
```

この例であればipv4の「xxx.xxx.xxx.xxx」というIPアドレスが送信メールサーバーであることを示しています。

gmailで試すと以下のようになっておりました。

```bash
$dig gmail.com txt +short
"v=spf1 redirect=_spf.google.com"

$dig _spf.google.com txt +short
"v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"
```

SPFレコードの場合、`dig -t SPF mydomain.com`という感じで確認出来るよという記事があったのですが例がなく確認ができず。。

[[手順] ドメインに SPF レコードが正しく設定されているか確認するにはどうすればよいですか？](https://support.plesk.com/hc/ja/articles/213901545--%E6%89%8B%E9%A0%86-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AB-SPF-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B-)


# 他のチェック方法は?

いくつかのサイトが有るようです。
以下が機能が豊富そうでした

[SPF Record Testing Tools](http://www.kitterman.com/spf/validate.html)
面接で絶対に押さえておきたいアルゴリズム問題(4)

## 問題：Roman to Int (ローマ字から整数へ)


(0~4999)までのローマ字を数字に変換せよ。ちなみにローマ数字と整数は以下。

let romanValues = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
let arabicValues = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]


## 例：

```
input： DCXXI
return: 621

input: MCMXCVI
return: 1996

input MMMMXCVI
return: 4096
```

## ヒント：



## 解答：

```
func romanToInt(_ s: String) -> Int {
        
        var arabicValue = 0
        var romanValue = s
        
        let romanChars:[String] = ["CM", "M", "CD", "D", "XC", "C", "XL", "L", "IX", "X", "IV", "V", "I"]
        let arabicValues = [900, 1000, 400, 500, 90, 100, 40, 50, 9, 10, 4, 5, 1]
        
        
        for (index, chars) in romanChars.enumerated(){
            
            
            if romanValue.range(of: chars) != nil{
                
                let tok = romanValue.components(separatedBy: chars)
                let count = tok.count-1
               
                arabicValue += (arabicValues[index] * (count))
                
                romanValue = romanValue.replacingOccurrences(of: chars, with: "")
            }

        }

    return arabicValue
        
 }
```

### メモ / ポイント
        
1. まずは2文字を探して、1文字ずつのローマ字を探す
2. それぞれ見つけたら、数字を足していき、ローマ文字を取っていく。
3. ポイント：2文字のローマ字から先に探す
        

あくまで、自分流解き方です！
もっといい方法があれば、どしどし載せて言ってください。

### メモ /　ポイント

ちなみに、「数字 > ローマ字」を解いた人がいたので、参考にしてみました
https://gist.github.com/kumo/a8e1cb1f4b7cff1548c7
curlコマンドの出力をjqで整理して表示する

## curlコマンド

```bash
$ curl -s https://randomuser.me/api | jq '.'
{
  "results": [
    {
      "gender": "male",
      "name": {
        "title": "mr",
        "first": "dominic",
        "last": "gauthier"
      },
      "location": {
        "street": "6629 tecumseh rd",
        "city": "melbourne",
        "state": "yukon",
        "postcode": 82683
      },
      "email": "dominic.gauthier@example.com",
      "login": {
        "username": "bigkoala670",
        "password": "nasty",
        "salt": "3BIaho9m",
        "md5": "32e1eafd2e3333279d08ba937b7754f7",
        "sha1": "63a68d471159981a9482fbe50cb2c776f6b36743",
        "sha256": "642181246f52f0269fb005bde6ef844d683e86f1c39605273ee1dc1d8429ca07"
      },
      "dob": "1955-12-25 09:38:26",
      "registered": "2015-06-12 04:49:56",
      "phone": "024-571-2877",
      "cell": "461-200-6741",
      "id": {
        "name": "",
        "value": null
      },
      "picture": {
        "large": "https://randomuser.me/api/portraits/men/42.jpg",
        "medium": "https://randomuser.me/api/portraits/med/men/42.jpg",
        "thumbnail": "https://randomuser.me/api/portraits/thumb/men/42.jpg"
      },
      "nat": "CA"
    }
  ],
  "info": {
    "seed": "c36fa7af7c25f85c",
    "results": 1,
    "page": 1,
    "version": "1.1"
  }
}
```

## 場所指定
.の後ろに文字指定する

```bash
$ curl -s https://randomuser.me/api | jq '.info.page'
# 1

$ curl -s https://randomuser.me/api | jq '.info.seed'
# "65a0130f9f6548f6"
```
sublimeでmarkdown

# sublimeでmarkdownをプレビューする

つまり
OmniMarkupPreviewer: markdownがsublimeでできる
QLMarkdown: macのpreviewでmdが見れる
が最高だ
ということ. 

## OmniMarkupPreviewer
### install
- ```command shift p```でPackage Control: install Packageを開く
- OmniMarkupPreviewerを探して```enter```

### usage
```
command option o: プレビューを表示
command option x: htmlに出力
```

## QLMarkdown
### install 
brew-caskを経由してもできるらしい

```
$ brew tap phinze/homebrew-cask
$ brew install brew-cask
 
$ brew cask install qlmarkdown
```
けど, どうも上手くいかず. 

なので, 
https://github.com/toland/qlmarkdown/releases
からDLしたものを```/Library/QuickLook```に置いて解決した. 
置いた直後はなぜか上手く表示されなかったけど, 気がついたら表示されるようになってました. 

### install
finderでmdファイルを選択した状態でspaceを押せば見れます. 

## result
https://youtu.be/gOIxzQmGedI

## git
https://github.com/KeitaSumiya/sublimetext/tree/master/OminiMarkupPreview

## ref
http://dev.classmethod.jp/tool/markdown-tool-for-mac/
http://nasimeya.blog.fc2.com/blog-entry-1038.html
http://futago-life.com/sublime-text3-wiki/how-to/markdown
https://github.com/timonwong/OmniMarkupPreviewer
https://github.com/toland/qlmarkdown/


# Markdownの目次自動作成
## MarkdownTOC
sublime3用. すごい. 

### install
- [Markdownの目次自動作成（SublimeText PlugIn）](https://qiita.com/naokazuterada/items/daa34bf80fa683d80b6d)
- [https://github.com/naokazuterada/MarkdownTOC](https://github.com/naokazuterada/MarkdownTOC)

### 好きな設定

```
<!-- MarkdownTOC autolink="true" autoanchor="true" indent="    " -->
:
:
<!-- /MarkdownTOC -->
```
echoで.bashrcとかに追記するのやめよう

＃ 追記
@7of9 さんの投稿がもっと良い解決策に感じました
http://qiita.com/7of9/items/96a6873c3e87c7b71c6e

```set -o noclobber```
で、既存ファイルに対して `>` が使えなくなるそうです

# typoで環境吹っ飛んじゃう
環境構築中にQiitaとか参考にしてるとこういう一文がサラッと出てきますよね
```echo export PATH='/path/to/bin:$PATH' >> ~/.bashrc```

`>` の数がtypoで一つ少ないと、ファイルが上書きされて詰んでしまうのでなるべくエディタを使いましょう
CordovaのFirebase系プラグインがAndroidで動かなかった問題

Ionicでアプリを作っていた時、 cordova-plugin-fcm と cordova-plugin-firebase-analytics プラグインを入れたところ

```bash
* What went wrong:
A problem occurred configuring root project 'android'.
> Cannot add task ':processDebugGoogleServices' as a task with that name already exists.
```

というエラーで動かなくなってしまった。

既にprocessDebugGoogleServicesがあるのに、もう一度立ち上げようとしてるというエラーだったので、相性の問題？と思い検索していたところ

https://github.com/fechanique/cordova-plugin-fcm/issues/319

同じような問題に直面している人がいたので対処策が書かれていた。

※ FCMのプラグインの方は既に3.0.0になっているので、Analyticsの対応待ち？問題の根幹がわかってないからなんとも。
https://github.com/sesangsokuro/cordova-plugin-fcm/commit/e1f070d35372e1c65ae0561fbbfd2d16d72a78d6

それぞれのプラグインのgradleファイルのバージョン指定がずれていることに問題があるらしく、対処療法的だけれども cordova-plugin-firebase-analytics の方の com.google.gms:google-services を3.0.0にしてあげることでビルドが通った。

```[/plugins/cordova-plugin-firebase-analytics/src/android/build.gradle]
buildscript {
	repositories {
            jcenter()
			mavenLocal()
        }
    dependencies {
        classpath 'com.android.tools.build:gradle:+'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}
```

一応応急処置したのはこんな感じだよと伝えたかったので、プルリクを送ってみた。こんなんでいいんだろうか。
https://github.com/chemerisuk/cordova-plugin-firebase-analytics/issues/33
https://github.com/chemerisuk/cordova-plugin-firebase-analytics/pull/34
EthereumのコントラクトでPayment Channelを実装してる記事について

最近はBitcoinも送金手数料が高くなっているらしく、当初言われていたような「マイクロペイメントに使える！！」も無効化されそうな勢い。

 

Ethereumも高騰しているので、何回も何回も送金してたら手数料がかかりまくる。
 
PaymentChannelはビットコイン用に考案されてマイクロペイメントの技術だが、Ethereumにも適用されようとして開発が進んでいるらしい。（Raidenネットワーク）

とは言え、そんなの作らなくてもPaymentChannel作れるよ、と言う記事があった。

 

[Ethereum Payment Channel in 50 Lines of Code – Matthew Di Ferrante – Medium](https://medium.com/@matthewdif/ethereum-payment-channel-in-50-lines-of-code-a94fad2704bc)

 

Mediumのこの記事が面白そうだったので読んでみた。コードもわかりやすかった

 

Githubに全部載ってる

[GitHub - mattdf/payment-channel: Ethereum Payment Channel in 50 lines of code](https://github.com/mattdf/payment-channel)

 
コードは５０行ほどで難しくはないのですが、全部解説みたいのが面倒くさかったのでだいたいの流れをまとめてみます。



##最初
 [目的] 
AliceがBobに１Tweetごとに0.001ETHを贈りたい。だけど毎回確認して送金してると手数料がバカにならない。
 また､Bobも、Tweetしたらちゃんと貰えるのかわからないので不安

 
という問題が長らく暗号通貨の世界の信頼性問題としてありました。サードパーティーの企業や個人を仲介するやり方はありますが、それではブロックチェーンのtrustless(信用しなくても信頼できるプロトコル）の理念に反します。

今回はこの問題が、Ethereum上で作るコントラクトで解決できたよ、という話でした。

 

手続きは以下の通り

1. Aliceがコントラクトを発行し、同時に有効期限も定める。その時に必要金額全部を送金する。（0.001ETHを100回送る予定なら0.1ETHをコントラクトアドレスへ。

 

2. Bobはそれを確認し、ちゃんとETHがあるとわかる。

 

3. BobがTweetしたのを確認したら、Aliceは自分の秘密鍵で0.001ETHを送るメッセージ付きで署名してBobへ送る（コントラクトを経由せず、別の方法で良い）

 

4. BobがさらにTweetをし続けたら、Ａliceは0.002ETHに署名,0.003ETHに署名、と署名付きメッセージを更新してBobへ送信する。 

 

 

##出金方法

 

・Bobは任意の時点で出金できる。（Aliceにもらった署名付きメッセージとBob自身の署名をコントラクトに送信する。）

ただし、出金できる量はAliceが署名した時のETHの量までなので、0.001ETHに対してしか署名していなければ0.001ETHしか得られない。

 

・Aliceは任意の時点で出金はできないが。最初に定めたコントラクトの有効期限を超えた場合には残っている分を全額出金できる。

 

 

##メモ
以上のやりとりがマイクロペイメントチャネルと同じっぽいので、Ethereum上で実装できたと言えばそうであるような気がする。

マイクロペイメントチャネルの解説はこちらが詳しい
[Layer2解説 第1回 マイクロペイメントチャネル - 25歳海外駐在員の暗号通貨ルポ](http://cryptocoin.hatenablog.com/entry/2017/05/08/022159)

Bitcoinでの2-of-2マルチシグ、LocktimeなどをEthereumコントラクト上で実現できているわけですね。

ただ、より低レイヤーのクライアントソフトレベルでやれるようにしたほうが効率やセキュリティの面でいいのかもしれない。（不明）

ともかくも、早くLightning NetworkやRaiden Networkの実装が待たれるところです。
[ruby]ク・ク・クイズ

# 問題

```ruby
a=1,b=nil,c=2

a
# => ?
b
# => ?
c
# => ?
```

:innocent:
:hushed: 
:hugging: 
:innocent:
:hushed: 
:hugging: 
:innocent:
:hushed: 
:hugging: 
:innocent:
:hushed: 
:hugging: 
:innocent:
:hushed: 
:hugging: 

# 答え

```ruby
a=1,b=nil,c=2

a
# => [1, nil, 2]
b
# => nil
c
# => 2
```
Rails + whenever で failed to load command: bin/rails エラー

## 概要

[gem whenever を使って Rails で定時処理を作る](http://qiita.com/hirotakasasaki/items/3b31966294a809b99c4c)
という記事などを参考に、定時処理を実装していたら、
`runner` 実行時に `bundler: failed to load command: bin/rails (bin/rails)`
というエラーに襲われてはまったので解決法をメモ

## 環境
* Docker for mac 17.03
* ベースイメージ: `rails/app` `Debian GNU/Linux 8`
* Rails 5.0.0.1
* Whenever 0.9.7

## 症状

`lib/tasks` 以下に `test.rb` というタスクを作成
(単に "yakisoba" と出力する機能しかないタスク)

```rb:lib/tasks/test.rb
class Test
  def self.yakisoba
    puts "yakisoba"
  end
end
```

これを実行するようにスケジュールに設定

```rb:config/schedule.rb
set :output, '/usr/src/app/log/crontab.log'

every 1.minute do
  runner "Test.yakisoba", :environment => :development
end
```

こうすることで、 1分おきに `/usr/src/app/log/crontab.log` に
**yakisoba** と出力してくれるはず。

っと思ったらログファイルにダラダラと以下のようなエラーが。

```text:log/crontab.log
bundler: failed to load command: bin/rails (bin/rails)
Bundler::GemNotFound: Your bundle is locked to rake (12.0.0), but ...
/usr/local/lib/ruby/gems/2.3.0/gems/...
/usr/local/lib/ruby/gems/2.3.0/gems/...
```

(´・ω・` )

## 解決法

`schedule.rb` 内で環境変数を読み込ませる。

```rb:config/schedule.rb
set :output, '/usr/src/app/log/crontab.log'
ENV.each { |k, v| env(k, v) } #追加

every 1.minute do
  runner "Test.yakisoba", :environment => :development
end
```

これでちゃんと動いた(ﾉ_-｡)


## 参考
[Can I use Whenever to run scheduled tasks (cron jobs) on Enclave?]
(https://www.aptible.com/support/topics/enclave/how-to-use-whenever/)
redux + react-navigation

react-native+reduxを触り始めてそんなに経ってませんので備忘録

react-navigationのStateをreduxで管理しようという試みです。

公式リファレンスだとコードが一箇所にまとめられてて
パッと見わかりづらかったのでメモ（自分だけ？）

### 1. Navigationのコンポーネントを作成
今回の例だとこんな感じ

```js:Navigation.js
import {
	StackNavigator
} from 'react-navigation';

import screens from './screens';

export default StackNavigator({
	Splash: {
		screen: screens.Splash,
		navigationOptions: {
			header: null,
		}
	},
	MainScreen: {
		screen: screens.MainScreen,
		navigationOptions: {
			title: 'メイン画面',
			headerBackTitle: null,
		}
	},
	DetailScreen: {
		screen: screens.EventScreen,
		navigationOptions: {
			title: '詳細画面',
		}
	}
})
```

スプラッシュ画面→メイン画面←→詳細画面
みたいな構成だと仮定。

### 2. NavigationのStateを加工するReducerを作成
これはほぼ公式通りに作れば良さそう。
`getStateForAction`がよしなにNavigationのStateを作ってくれる。

```js:navReducer.js
import nav from './Navigation'; //(1)で作ったやつ

// 初期画面名を指定して初期ステートを作成
const initialState = nav.router.getStateForAction(nav.router.getActionForPathAndParams('Splash'));

export default (state = initialState, action) => {
  const nextState = nav.router.getStateForAction(action, state);

  return nextState || state;
};
```

### 3. StoreにReducerを渡す
```js:Store.js
import navReducer from './reducers/navReducer';

const appReducer = combineReducers({
  nav: navReducer,
  ...
});
```

### 4. ReduxとのConnect(コンテナ作成)
実際は、いちいちContainerとComponentを分けなくてもよさげです。
コメントのところはフワッとした理解なので、コードを見てみようかと思います。

```js:NavigationContainer.js
import React, { Component } from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { addNavigationHelpers } from 'react-navigation';

import Navigation from '../routes/Navigation';

class Nav extends Component {
  render() {
    // addNavigationHelpersが生成したnavigationが、
    // actionをdispatchしてくれて
    // reducerが新しいNavigationのStateを作って
    // 新しいStateでNavigationが更新されるという仕組み(多分)
    return (
      <Navigation
        navigation={addNavigationHelpers({
          dispatch: this.props.dispatch,
          state: this.props.nav,
        })}
      />
    );
  }
}

const mapStateToProps = (state, ownProps) => ({
  nav: state.nav
});

export default connect(mapStateToProps)(Nav);
```

### 5. Providerの中でコンテナを使う
普通のreduxのように使えばOK

```js:App.js
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import store from './store';
import Navigation from './containers/NavigationContainer';

export default class App extends Component {
  render() {
    return (
      <Provider store={store}>
        <Navigation />
      </Provider>
    );
  }
}
```

もうちょっと掘り下げて色々やってみようかと思います。
react-native-router-fluxからもうまく移行できるようなやり方を模索中です。

### 参考
公式リファレンス
https://reactnavigation.org/docs/guides/redux
IPersistentStack

普段Clojureを書く中であまり使わない(というか一度も使ったことない)popとpeekについて調べてまとめてみた。

# 要点
- peek = 最後に追加された要素を取得、 pop = 最後に追加された要素以外を取得
- それぞれIPersistentStackのインターフェースメソッド
- ClojureのlistとvectorはIPersistentStackを実装している

## スタック?
一般的にはLIFOな抽象データ型で以下の3つの操作をサポートしている物

- push(要素の追加)
- pop(最後に追加した要素をスタックから除外し返却)
- peek(最後に追加した要素を取得)

このうちpushとpop操作がスタックを満すのに必須で、peekは任意っぽい

## ClojureでImmutableなスタック？

一般的なスタックの操作はミュータブルで、Clojureと相性が悪いためスタック操作のイミュータブル版は以下になる
- push(要素を追加した後のコレクションを取得) -> 要はconjで後述する
- pop('最後に追加した'要素を除外したコレクションを取得)
- peek('最後に追加した'要素を取得)

注：イミュータブルなコレクションの文脈では'最後'というのは関数の適用の順序で
'追加'も要素を追加した後のコレクションを返す関数をコレクションに適用するという意味になる

## conj

listは先頭に、vectorは最後尾に要素を追加した物が返ってくる

```clj
;; conj to a list
(conj '(1 2 3 4) 5) => (5 1 2 3 4)

;; conj to a vector
(conj [1 2 3 4] 5) => [1 2 3 4 5]
```

## peek

追加する先がlistにせよvectorにせよイミュータブルなスタックとみなした場合、
'最後'にconjした要素が5なのでpeekをすると5が返ってくる。

```clj
(-> [1 2 3 4]
    (conj 5)
    peek) =>5

(-> '(1 2 3 4)
    (conj 5)
    peek) => 5
```


## pop

追加する先がlistにせよvectorにせよイミュータブルなスタックとみなした場合、
'最後'にconjした要素が5なのでpopをすると5を除外したコレクションが返ってくる。

```clj
;; popping from a vector
(-> [1 2 3 4]
    (conj 5)
    pop) => [1 2 3 4]

;; popping from a list
(-> '(1 2 3 4)
    (conj 5)
    pop) => (1 2 3 4)
```

## tips:vectorの最後の要素を取得したい場合はlastよりもpeek
lastはシーケンスの抽象に依存しているなので、先頭から最後に辿り付くまで要素を全て走査してしまうため遅いが、
vectorに対するpeekは高速で最後尾の要素を取得できる

```clj
(time
 (last [1 2 3 4 5 6 7 8 9]))
;; "Elapsed time: 0.171368 msecs"


(time
 (peek [1 2 3 4 5 6 7 8 9]))
;; "Elapsed time: 0.066708 msecs"
```


### 参考
- https://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29
- https://github.com/clojure/clojure/blob/f572a60262852af68cdb561784a517143a5847cf/src/jvm/clojure/lang/IPersistentStack.java
- https://github.com/clojure/clojure/blob/ebfdbca535b81808b3ddc369d4a4e98b8f1524c7/src/jvm/clojure/lang/APersistentVector.java#L318
コピペで出来るUIImageの画像サイズを変更（リサイズ）


Swift4.0で動作確認済みです

UIimageのextensionを作る

```
extension UIImage {
    func ResizeUIImage(width : CGFloat, height : CGFloat)-> UIImage!{
        // 引数の画像の大きさのコンテキスト作成
        UIGraphicsBeginImageContext(CGSize(width: width, height: height))
        // コンテキストに画像を描く
        self.draw(in: CGRect(x: 0, y: 0, width: width, height: height))
        // コンテキストからUIImageを作成
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        // コンテキストを閉じる
        UIGraphicsEndImageContext()
        return newImage
    }
}
```

###使用方法

```
// リサイズする
let resizeImage: UIImage = image.ResizeUIImage(width: 100, height: 100)
```
最短経路を求めるプログラムをC言語で作成してみた

#はじめに
おひさしぶりです。ここ半年は仕事や将来の事で本当に忙しく、twitterすら行う余裕がありませんでしたが、最近はほんの少しだけ余裕が出てきたので約9ヶ月ぶりにQiitaの記事を更新したいと思います。

さて、今回の記事ですが、最短経路を求めるプログラムをC言語で作成したのでそのソースコードを公開したいと思います。最短経路を求める問題は学生時代に自分が所属していた研究室でも行っていましたが、当時はGAやNNで手一杯であり、最短経路は蚊帳の外でした（興味はあったんですけどね）

そんなわけで学生時代に出来なかった最短経路を今から求めていこうと思います。短い記事になると思いますが、よろしくお願いします。

#参考資料
いきなりソースコードを紹介してもいいと思いますが、今回は最短経路を求めるプログラムを書く際に参考にした資料から紹介したいと思います。ぶっちゃけて言うとこの資料にソースコードのほとんどが書かれていたので、そのコードをC言語に置き換えたものになっています（苦笑）プログラムの説明も詳しく書いてあるので気になる方は下記のURL先の資料と一緒に見てください。

参考資料（基本情報技術者試験 平成29年春期午後問8 p35-40）：
URL：https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_1/2017h29h_fe_pm_qs.pdf

#ソースコード
ソースコードは下記のURL先にあるのでご覧ください。

URL：https://gist.github.com/KUKDfhia/ef142e1ce3d230e8dff1ac831dfb1c90

#動かしてみる
今回は下記の図にある経路を使って最短経路を求めていこうと思います。参考資料にある図と同じです。

![capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/137627/97587640-14a1-e0d9-d5a1-1bd84c28fd68.png)
※基本情報技術者試験 平成29年春期午後問8 p35より引用

出発地の地点番号が0、目的地の地点番号を6とする時、最短経路および最短距離は
![capture1.PNG](https://qiita-image-store.s3.amazonaws.com/0/137627/dabc042f-29a8-de74-a76f-190334477e68.png)
　　　　　　　図2:実行結果①

出発地の地点番号が5、目的地の地点番号を1とする時、最短経路および最短距離は
![capture2.PNG](https://qiita-image-store.s3.amazonaws.com/0/137627/106c0804-9b95-3829-fa8b-4124860697de.png)
　　　　　　　図3:実行結果②

とまぁ、こんな感じでコンソール上に最短経路と最短距離が表示されます。今回は地点数が少ないので頭の中でも最短経路は求められると思いますが、これが地点数N=20、30……となると難しいところです。地点数と経路の設定はソースコードをいじれば増やす事が出来ますので、興味があればぜひとも試してみてください。ちなみに最短経路に関する問題を卒業研究でやってみたいのであれば

・アルゴリズムの変更（GAやアントコロニー等）
・各アルゴリズムによる最短経路計算時間の比較、検討
・高速化（地点数が1000、10000でもすぐに求められるかどうか）

などをやってみると担当教授の受けがいいかもしれません（笑）

#むすび
今回は最短経路を求めるプログラムについて紹介しました。参考資料として基本情報の問題を使いましたが、最近は自習に使える問題が多く出題されていてびっくりしています。自分は基本情報に合格しており、今は応用情報に向けて勉強していますが、仕事しながらなのでモチべが上がらずに困っています。何か短時間でも出来る効率的な勉強法があればぜひとも教えてください。TwitterでもQiitaでも待ってます(>_<)
LaravelでのDBトランザクション

こんな感じ。

```php
DB::beginTransaction();
    try {
      $blog = Blog::find($id);
      $blog->comments()->detach();
      $blog->delete();
      DB::commit();
      $success = true;
    } catch (\Exception $e) {
      $success = false;
      DB::rollback();
    }
```

【参考】
http://programmer-jobs.blogspot.jp/2017/02/laravel-5-4-database-transactions.html
Android gradle plugin 3.0.0-alpha4でローカルのaarの.soファイルが読み込まれない


# 現象

Android gradle plugin を3.0.0-alpha4にしたところ、以下のようにインポートしたローカルのaar内の.soファイルが読み込まれない(apkに含まれない？)状態になり実行時にリンクエラーになってしまいました。
バグなのか仕様なのかはわかっていません。

```gradle
implementation project(":module_name")
```

# 対策

jarみたいにlibsなどに直接いれて、flatDirを使うといけました。

```gradle
repositories {
	flatDir {
		dirs "libs"
	}
}

dependencies {
	implementation(name: 'aar_name', ext: 'aar')
}

```

# 追記 2017-10-03

少なくともbeta6では直っているようです。