OmniAICreator/Qiita-1.07M huggingface dataset:
セキュアで簡便なGithubアクセスの実現


## はじめに
これまで会社で利用しているGithubのプライベートレポジトリへのアクセスにはHTTPSを利用していた。
リモートレポジトリへプッシュする度にユーザ名とパスワードを入力するのが面倒だったが、セキュリティ上我慢していた。
また設定ファイルやoriginのURLに直接ユーザ名、パスワードを指定するのはもってのほかだと思って我慢していた。

でももう我慢する必要はない。

GithubへはSSH接続できることが分かったからだ！（遅い）

## Githubへのアクセスに利用できるプロトコル

公式に利用できるのは以下の2つ。

* https
* ssh

sshなんてあったかなと思うかもしれないが、
「Clone or Download」ボタンを押下すると右上に
「Use SSH」というリンクがありssh用のURLもコピーできるようになっている。

なおドキュメントはないが以下も利用できるらしい。*1

* http
* git

どちらもセキュアではないのであえて利用する必要はない。
gitについてはread-onlyアクセス。

またGitとしては上記に加えてLocal（ファイルシステムアクセス）が利用できるらしい。*2

##　HTTPSとSSHの使い分け
所感だが、Pro Git Book (*2) を参考にすると以下のような使い分けになる。

* HTTPS
	* パブリックレポジトリとして不特定多数に公開する場合（読込み専用レポジトリ）
	* 企業ネットワーク内からアクセスする場合（ファイヤーウォール対策）
* SSH
	* プライベートレポジトリとして特定のメンバーに公開を限定している場合
	* 転送効率を重視する場合

## SSHによるアクセス方法

前置きが長くなったがSSHアクセスの設定方法を
「これからcloneする新規のレポジトリ」と「すでにcloneしている既存のレポジトリ」のそれぞれのケースで紹介する。

### cloneの段階でSSHのURLを選択する場合（新規のレポジトリ）
1. sshの秘密鍵と公開鍵を生成（パスワードなしでアクセスしたい場合はパスフレーズを空にする）
2. 生成した公開鍵をGithub上に登録
	* レポジトリへのプッシュを行うユーザのアカウントの「Settings」>「SSH and GPG Keys」>「New SSH key」に登録
3. 「Clone or Download」>「Use SSH」で表示されるURLをコピー
4. コピーしたURLでレポジトリをClone

	```
	% git clone git@github.com:レポジトリ所有者アカウント名/レポジトリ名.git
	```
	※URLの@の左側がgitとなっているが、このユーザ名は認証には利用していないようなので「hoge」でも省略でも問題ない。
5. 確認

   ```
   % ssh github.com
   Enter passphrase for key '/Users/xxxx/.ssh/id_rsa':
   PTY allocation request failed on channel 0
   Hi <プッシュを行うユーザのアカウント名>! You've successfully authenticated, but GitHub does not provide shell access.
   Connection to github.com closed.
   ```
   ※SSHの鍵生成時にパスフレーズを設定しなかった場合はパスワード要求はない

### cloneの段階で一旦HTTPSのURLを選択した場合（既存のレポジトリ）
1. sshの秘密鍵と公開鍵を生成（パスワードなしでアクセスしたい場合はパスフレーズを空にする）
2. 生成した公開鍵をGithub上に登録
	* レポジトリへのプッシュを行うユーザのアカウントの「Settings」>「SSH and GPG Keys」>「New SSH key」に登録
3. cloneしたマシン上でoriginのURLを変更

	```
	% git remote -v
    origin  https://github.com/レポジトリ所有者アカウント名/レポジトリ名.git (fetch)
    origin  https://github.com/レポジトリ所有者アカウント名/レポジトリ名.git  (push)
    
	% git remote set-url origin git@github.com:レポジトリ所有者アカウント名/レポジトリ名.git
	
	% git remote -v
    origin  git@github.com:レポジトリ所有者アカウント名/レポジトリ名.git (fetch)
    origin  git@github.com:レポジトリ所有者アカウント名/レポジトリ名.git (push)

	```
	※URLの@の左側がgitとなっているが、このユーザ名は認証には利用していないようなので「hoge」でも省略でも問題ない。

4. 確認

   ```
   % ssh github.com
   Enter passphrase for key '/Users/xxxx/.ssh/id_rsa':
   PTY allocation request failed on channel 0
   Hi <プッシュを行うユーザのアカウント名>! You've successfully authenticated, but GitHub does not provide shell access.
   Connection to github.com closed.
   ```
   ※SSHの鍵生成時にパスフレーズを設定しなかった場合はパスワード要求はない

## 参考URL
*1: http://qiita.com/chroju/items/67da13c672efcd2bc787
*2: https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB
Rubyでアノテーションを実装してみた

# Rubyでアノテーション

RubyでJava的なアノテーションが使いたくなったので実装してみました。
参考にしたのは以下の質問に対する回答。

> How to simulate Java-like annotations in Ruby?
> http://stackoverflow.com/questions/3157426/how-to-simulate-java-like-annotations-in-ruby

そのまんまだとインスタンスメソッドにしか対応できなかったので、クラスメソッド含めアノテーションを付与できるようにしてみました。

# 使い方

メソッドに対して`_`で始まるアノテーションを記述する。

```ruby:sample.rb
require './annotations'

class Sample
  annotate!

  _label_only
  def instance_method1; end

  _with_args arg1: 'val1', arg2: 1
  def instance_method2; end

  _label_only
  def self.class_method1; end

  _with_args arg1: 'val2', arg2: 2
  def self.class_method2; end
end
```

`クラス名.annotations()`でメソッド名をシンボルで指定することで、メソッドに追加されたアノテーションを取得できる。引数も指定可能。
クラスメソッドとインスタンスメソッドで同名が使われるとアノテーションが混在してしまうので、インスタンスメソッドのシンボルはメソッド名の頭に`_`を付与することにした。

```ruby:test.rb
require './sample'

p Sample.annotations(:_instance_method1)  # {:label_only=>[]}
p Sample.annotations(:_instance_method2)  # {:with_args=>{:arg1=>"val1", :arg2=>1}}
p Sample.annotations(:class_method1)      # {:label_only=>[]}
p Sample.annotations(:class_method2)      # {:with_args=>{:arg1=>"val2", :arg2=>2}}
```

# annotations.rbの実装

```ruby:annotations.rb
module Annotations
  @@__last_annotation__ = nil

  def annotations(meth=nil)
    return @@__annotations__[meth] if meth
    @@__annotations__
  end

  private

  def singleton_method_added(m)
    (@@__annotations__ ||= {})[m] = @@__last_annotation__ if @@__last_annotation__
    @@__last_annotation__ = nil
    super
  end

  def method_added(m)
    (@@__annotations__ ||= {})["_#{m.to_s}".to_sym] = @@__last_annotation__ if @@__last_annotation__
    @@__last_annotation__ = nil
    super
  end

  def method_missing(meth, *args)
    return super unless /^\_/ =~ meth
    @@__last_annotation__ ||= {}
    @@__last_annotation__[meth[1..-1].to_sym] = args.size == 1 ? args.first : args
  end
end

class Module
  private

  def annotate!
    extend Annotations
  end
end
```

Gistにも投稿しました。
https://gist.github.com/matsukaz/06bd42aca25cba9dc569bc5aaaf3374f
node-redでズンドコサーバー

#概要
node-redでズンドコサーバー作って見た。
ランダムに「ズン」か「ドコ」を返すだけ。
#サンプルコード
```
[{"id":"40e2bfe9.d6df2","type":"function","name":"loop","func":"var k = Math.floor(Math.random() * 2);\nif (k < 1)\n{\n\tmsg.payload = \"ズン\";\n}\nelse\n{\n\tmsg.payload = \"ドコ\";\n}\nreturn msg;","outputs":1,"x":349,"y":334,"z":"48c6bf4e.ce845","wires":[["fbcde758.8b0428"]]},{"id":"fbcde758.8b0428","type":"function","name":"header","func":"msg.res.header('Access-Control-Allow-Origin', '*');\nmsg.res.send(msg.payload);\nreturn msg;","outputs":1,"x":521,"y":333,"z":"48c6bf4e.ce845","wires":[["d65ab857.81b9f8"]]},{"id":"6b3579c9.2044b8","type":"http in","name":"","url":"/zundoko","method":"get","x":177,"y":335,"z":"48c6bf4e.ce845","wires":[["40e2bfe9.d6df2"]]},{"id":"d65ab857.81b9f8","type":"http response","name":"","x":701,"y":331,"z":"48c6bf4e.ce845","wires":[]}]
```
#実際のズンドコサーバー
http://ohijs0.paas.jp-e1.cloudn-service.com/zundoko
#ズンドコゲッター
ズンドコサーバーを利用する、ズンドコゲッターを作ってみた。
#サンプルコード
```
var z = "ズン";
var d = "ドコ"; 
var s = "";
var a = [];
while (a.join("") !== z + z + z + z + d) 
{
    a.shift();
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200)
        {
            a[4] = xhr.responseText;
        }
    };
    xhr.open('GET', "http://ohijs0.paas.jp-e1.cloudn-service.com/zundoko", false);
    xhr.send();
    s += a[4] + " ";
}
document.getElementById('helloWorld').innerHTML = s + "キ・ヨ・シ！";

```
#実際のズンドコゲッター
http://jsdo.it/ohisama1/iiVL
iOS の Remote Push Notification 通知実装手順メモ


参考になるかと思って開いた方、完全に自分用メモなので荒削りですいません。

軽い気持ちで Push 通知したくなって調べてみたら結構途方もない感じだったのでメモしました。
間違いもあるかもしれません。

## Certification 準備

1. https://developer.apple.com に移動、ログイン
2. Certificates から Development (Production) を選択して + ボタンを押す
3. 「Apple Push Notification services SSL (Sandbox)」を選択して Continue ![kobito.1463612250.591767.png](https://qiita-image-store.s3.amazonaws.com/0/10012/85ac1bab-b334-96d7-dcb3-577aa284b6a3.png "kobito.1463612250.591767.png")
4. 紐付ける Bundle ID を選択して Continue 
5. 「CSR をアップロードしろ」とでる（作り方の説明付き）ので、その通り作ってアップロードする
6. .cer ダウンロード
7. .cer をキーチェーンに取り込み
8. p12 書き出し
9. pem にする
	``$openssl pkcs12 -out dev2.pem -in dev2.p12 -nodes -clcerts``
10. Server 側の pem ファイルが完成


## Code for iOS
参考: [What's New in iOS Notifications
](https://gist.github.com/yatatsu/367402303199c8919a6d)

1. UIUserNotificationActionContext.Default or Minimal
2. UIMutableUserNotificationCategory 
  - 複数の Action をまとめる
3. UIMutableUserNotificationCategory:setActions:forContext
  - Action とその Action が有効になる Context (通知ダイアログの状態？)を紐付ける
4. registerUserNotificationSettings:
  - ユーザーに通知の許可を得る
7. aplication:didRegisterUserNotificationSettings:notificationSettings:    
5. registerForRemoteNotifications:
6. application:didRegisterForRemoteNotificationsWithDeviceToken: 
  - Device token 取得 ( Push宛先 )



## Code for server (Provider)

```ruby
require 'apns'
# sandbox
APNS.pem = "/your/pem/file"
token = "your device token"
APNS.send_notification(token,"message")
```
firewalldでhttpの許可とチェインの追加を行う

新しくサーバを作った場合に、firewalld周りでやることをいつも忘れるのでメモ書きとして。

```shell-session:httpを許可する
# デフォルトのゾーンを確認
firewall-cmd --get-default-zone

# ゾーンにhttpが追加されているか確認
firewall-cmd --list-service --zone=public

# 無かったら追加
firewall-cmd --add-service=http --zone=public --permanent

# リロードも忘れずに
firewall-cmd --reload
```

```shell-session:国別制限リスト用のチェインと、SSHGuard用のチェインを追加
# チェインの追加
firewall-cmd --permanent --direct --add-chain ipv4 filter sshguard
firewall-cmd --permanent --direct --add-chain ipv4 filter countries
firewall-cmd --permanent --direct --add-chain ipv6 filter sshguard
firewall-cmd --permanent --direct --add-chain ipv6 filter countries

# ルールにチェインを適用
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 2 -j sshguard
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 3 -j countries
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 2 -j sshguard
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 3 -j countries

# リロードして反映させる
firewall-cmd --reload
```

国別制限のリストは、割とよく不正アクセスを狙ってくる国のIPはシャットダウンしているのでそれ用です。
そのままINPUTに追加してもいいんですが、定期的に更新する際のクリア処理で、他のルールまでクリアしてしまうのでチェインに対してクリアするようにしてます。

SSHGuardってfirewalld対応してなくない？って件は、自分でソースコード書き換えて対応させると良いです。
iptablesの部分を参考にしながら吐き出すコマンドに、firewalld版を追加すればできます。
記事として書いてもいいけど、需要なさそう。
「パターン認識と機械学習」の読書メモ(1.1)

# はじめに
- [パターン認識と機械学習](http://goo.gl/hHPWRF)を読もうと思う
- 継続するために、読書メモを投稿することにしました。


# 第1章 序論
## はじめに
- パターン認識
  - 学問分野として、計算機アルゴリズムを通じてデータの中の規則性を自動的に見つけ出し、さらにその規則性を使ってデータを異なるカテゴリに分類する、というようなデータ処理を行うことに関連している。
　　　
- 機械学習
  - 基礎
        - 訓練集合
           - モデルのパラメータを適応的に調節するための集合。ラベル付けされている。
       - 目標ベクトル
         - １つ１つのカテゴリを表現する
  - 流れ
     - 訓練段階・学習段階
         - 入力を入れると、目標ベクトルと符号化の等しい出力ベクトルが出力される
         - テスト集合を入れるとカテゴリを決められる。
         - 汎化：カテゴリを決められる能力。パターン認識における中心的な課題。
       - 前処理（特徴抽出）
         - 問題を解きやすくするために、入力変数を新しい変数に変換すること。
         - 精度の向上、計算の高速化を目的とする。
  - 種類
      - 教師あり学習
         - 入力ベクトルとそれに対応する目標ベクトルの事例で構成される問題
      - 教師なし学習
         - 訓練データが入力ベクトルのみで対応する目標値が存在しないパターン認識の問題
         - 例
              - クラスタリング
              - 密度推定
              - 視覚化
       - 強化学習
         - ある与えられた状況下で、報酬を最大にするような適当な行動を見つけるという問題。
         - 最適な出力は試行錯誤を通じて学習アルゴリズム自らそれを発見しなければならない。
         - 信頼割り当ての問題
              - 報酬に結びついた全ての行動に対し、報酬を適切に割り当てる問題
      - 探査と知識利用のトレードオフ
           - 探査
             - 新しい種類の行動がどれくらい有効であるかを試す
           - 知識利用
             - 高い報酬が得られることが分かっている行動をとる
           - 探査と知識利用のどちらかに偏りすぎると性能が落ちる


## 1.1 例：多項式曲線フィッティング
  - 目標
    - 訓練集合を利用して、新たな入力変数の値 x^ に対して目標変数 t^の値を予測すること
    - 難い理由
      - 有限個のデータ集合から汎化しなければならない
      - 観測データはノイズが乗っており、与えられたx^に対するt^の値には不確実性あり
        - 確率論を用いて不確実性を厳密かつ定量的に表現する
  - 曲線フィッティングに基づく単純なアプローチ
    - 多項式 y(x,W)
      - xの非線形関数
      - 係数Wの線形関数
        - 未知のパラメータに関して線形であるような関数は重要
    - 訓練データに多項式を当てはめて係数を求める
     - 誤差関数の最小化で達成できる
      - 誤差関数
        - 関数y(x,W)の値と訓練集合のデータ点との間のズレを図るもの
        - 広く用いられるのは二乗和誤差
          - 非負。0になるのはy(x,W)が全訓練データ点をちょうど通るときのみ。
      - 誤差関数を微分することで最小を求められる。
        - 誤差関数は係数Wの二次関数のため、微分はWの要素に関して線形。
    - 多項式の次数Mを選ぶ問題
      - 例
        - 次数が小さすぎると予測としては不適当
        - 次数が大きすぎると、訓練データには非常によく当てはまるものの予測としては不適当(過学習)
      - モデル比較・モデル選択
        - 汎化性能がMにどう依存するかを定量的に評価する
        - 独立したテスト集合を、訓練集合と同じやり方で生成
        - 平均二乗平方根誤差 ERMS
          - Nで割ることでサイズの異なるデータ集合を比較することができる
          - 平方根をとることで、ERMSは目的変数tと同じ尺度であることが保証される
    - モデルの次数を固定しデータ集合のサイズを変えた時の振る舞い
      - データ集合のサイズが大きくなるにつれて過学習の問題は深刻でなくなる
      - データ集合を大きくすればするほど、より複雑で柔軟なモデルをデータに当てはめられる
    - 入手できる訓練集合のサイズに応じてモデルのパラメータの数を制限するのは納得できない、モデルの複雑さはむしろ解くべき問題の複雑さに応じて選ぶのが最も
      - 最尤推定
      - ベイズ的アプローチ
    - 正則化
      - 過学習の現象を制御するために使われるテクニック
      - 誤差関数に罰金項を付加することで、係数が大きな値になることを防ぐ
        - 単純なものは係数を二乗して和をとったもの
      - 呼び方
        - 統計学では縮小推定と呼ぶ
        - 二次の正則化をリッジ回帰
        - ニューラルネットワークの文脈では荷重減衰
    - 誤差関数を最小にするようなアプローチで実際の応用問題を解こうとする最には、モデルの複雑さを適切に決める方法を見つけなければならない
slick.jsをモーダルなど、最初非表示のもので使うとき

slick.js
http://kenwheeler.github.io/slick/

こちらのスライダーのプラグインを、モーダル内で使おうとしたとき、表示崩れが起きた。
調べてみたら、`display: none;`のため、`width`が`0px`になっていた。

再設定できるeventが用意されていたので、それを試してみても、うまくいかず・・・

```js
    $(function(){
        var slider = $('.slider').slick();
        $('.open-modal').click(function(){
            slider.slick('setPosition');
        });
    });
```

丸2日頭を悩ませてしまったが、とてもシンプルな理由だった。

私はてっきり、`slider.slick('setPosition');`が動いていないと思ってしまった。
原因は、モーダルが300ミリ秒かけて表示していたこと。
なので、300ミリ秒後に再設定すれば良い。
300ミリ秒間、表示崩れした状態が見えてしまうので、`opacity`でごまかした。

```js
    $(function(){
        var slider = $('.slider').slick();
        $('.open-modal').click(function(){
            slider.css('opacity',0);
            slider.animate({'z-index':1},300,function(){
                slider.slick('setPosition');
                slider.animate({'opacity':1});
            });
        });
    });
```

違和感出るかなーと思ったが、意外と言われてもわからない程度だったので良かった。
【言語バージョン管理】mise(旧名rtx)使おう(erlang/elixir, node, etc...)

# 2024年3月追記

asdfのプラグインと互換性を持ち、同一のサブコマンド体系を持つ後発プロジェクトの[`mise`(旧名`rtx`)](https://github.com/jdx/mise)が登場しており、筆者は現在こちらをおすすめしています。使用感も大きく変わりません。
バージョン切替をshim scriptではなく環境変数の動的書き換えによって管理する方式となっており、[`direnv`](https://github.com/direnv/direnv)と組み合わせて利用することでエディターとの連携も安定して実現できます。

---

愛用者も多いとは思いますが[`asdf`](https://github.com/asdf-vm/asdf)を使った言語環境構築やバージョン切り替えが非常に便利です。
CommonLispの[ASDF](https://common-lisp.net/project/asdf/)プロジェクトとの関係は僕にはわかりませんが、何がしかあるのかもしれませんし、ないのかもしれません。

# 強み

**rvm/rbenvやnvm等のバージョンマネージャを1コマンドに統一できる** 、というのが大きいです。その辺りの開発動機は[ポエム](https://github.com/asdf-vm/asdf/blob/master/ballad-of-asdf.md)になっています。
`local`でインストールすれば`.tool-versions`ファイルが生成されるので、それをGitに入れればプロジェクトで共有もできます。

Pluginを作ることで、手頃なバージョンマネージャのない言語に対応できるのもグッド。

`asdf`は左手で容易に入力できるのも素晴らしいですね。

# 準備

OSX準拠です。基本的には[README](https://github.com/asdf-vm/asdf/blob/master/README.md)通り。

```
$ brew install automake autoconf openssl libyaml readline libxslt libtool unixodbc # 準備。大概入ってそうですが。

$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf
$ echo '. $HOME/.asdf/asdf.sh' >> ~/.bashrc # この2行は各自の環境合わせで。
$ echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

$ . ~/.bashrc
```

# Erlang/Elixir

更新も早いので積極的に追従していきたいですね。[公式でも紹介](http://elixir-lang.org/install.html#compiling-with-version-managers)されています。

```
$ asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
$ asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git

$ asdf install erlang 18.3
(数分かかる)
$ asdf global erlang 18.3

$ asdf install elixir 1.2.5
(結構すぐ終わる)
$ asdf global elixir 1.2.5
```

Erlangインストールの前にopensslをインストールするのを忘れていると、`:ssl`モジュールがインストールされません。Hexがこれに依存しているので実質的に必須です。
brew経由でインストールしていれば、自動的にopensslのパスを解決して`:ssl`をインストールしてくれます。
手動で指定する場合、

```
$ ERLANG_EXTRA_CONFIGURE_OPTIONS="--with-ssl=/usr/local/opt/openssl/" asdf install erlang 18.3
```

このようにオプションを渡します。

# node.js

nodeとバージョン管理は不可分ですね。。

``` 
$ asdf plugin-add nodejs https://github.com/asdf-vm/asdf-nodejs
```

後はほぼ同じです。注意点として、`node`ではなく`nodejs`という名前でpluginを追加し、その後も`nodejs`の各バージョンをインストールします。コマンド名はOSXの場合`node`になります。

# 他

RubyとかGoもできます。Luaもある。
インストールが簡単だと新しい言語に触れようというやる気も湧いてきます。湧いてきません？
jsからDOMを操作できない

```rb
= link_to 'ここを押してね！', '', id: 'trap-button'
```

```js
# test.js.coffee
$ ->
  $('#trap-button').bind 'click', (e) ->
    alert('莫迦め、罠だ')
    $('#trap-button').hide()
```

こういうリンクを作った
`ここを押してね！`を押すとリンクそのものが消えるという恐ろしいトラップだ。

しかし実際にはリンクは消えなかった。
調査した結果。以下で解決した。

```rb
# test.html.haml
= link_to 'ここを押してね！', '', id: 'trap-button'
```

```js
# test.js.coffee
$ ->
  $('#trap_button').bind 'click', (e) ->
    alert('莫迦め、罠だ')
    $('#trap_button').hide()
```

前：`trap-button`
後：`trap_button`

`-` だとjsからのDOM操作が効かないっぽい
htmlになった段階で `-`から`_`に置き換えられるから。
hamlなにしてくれんねん。
Windows on VirtualBox on Macのかな切り替えの方法

やりたいこと
---

* Mac上のVirtualBoxにWindowsを乗せて動かしている
* Macと同じキーバインドにしたいので、「かな」で全角入力モードに、「英数」で半角入力モードにIMEを切り替えたい

でもできない
---

* IMEのキーバインドを変えればうまくいくという情報がたくさん出てくるけどうまくいかない
* どうやらそれらの記事はbootcamp向けのようで、VirtualBoxだとだめ

原因
---

* VirtualBoxがWindowsに押されたキーを渡す時に、「かな」「英数」ともに「半角/全角」という同一のキーにマッピングしてしまう
* Windows側では区別ができないので、役割を別々にすることができない

対処
---

* [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)を使って「英数」キーを別のキーに変更してしまう
    * これを使うと、Mac上のキーバインドをアプリごとに変更することができる
    * VirtualBoxに対してだけ、「英数」が押されたら「Ctrl+¥」が押されたことにする

対応手順
---

* Karabinerをダウンロードし普通にMacにインストールする
* Misc&Uninstall > Open private.xml　でFinderを開きprivate.xmlをなんらかのエディタで編集する

```:private.xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>VirtualBox</appname>
    <equal>org.virtualbox.app.VirtualBoxVM</equal>
  </appdef>
  <item>
    <name>Use EISUU as CTRL + YEN in VirtualBox</name>
    <identifier>private.virtualbox_eisuu</identifier>
    <only>VirtualBox</only>
    <autogen>__KeyToKey__ KeyCode::JIS_EISUU, KeyCode::JIS_YEN, ModifierFlag::CONTROL_L</autogen>
  </item>
</root>
```

* 保存した後、 Change Key > Reload xmlを選択して、private.xmlを反映する
* 表示されたprivate keyチェックボックスにチェックを入れる
* WindowsのIMEのキーバインド設定で、Ctrl+¥をキー追加して、IMEオフに紐付ける
* 「半角/全角」キーはIMEオンに紐付ける

終わりに
---

上記private.xmlを使った方式を編み出した[先人](http://sunflat.hatenablog.com/entry/2016/01/21/105011)に感謝。

参考
---

* [VirtualBox（Mac）のWindowsで、かなキーと英数キーを区別する](http://sunflat.hatenablog.com/entry/2016/01/21/105011)
* [Macのキーバーインドを変更 - アプリ「Karabiner」](http://pc-karuma.net/mac-app-karabiner/)
jupyterとpandasインストール


Execute envirment OSX 10.11.4

ref from http://jupyter.readthedocs.io/en/latest/install.html

Install conda and jupyter, and others.

```
$conda install jupyter, matplotlib, pandas, seaborn
```

Excute on project root.

```
$jupyter notebook
```

Add the following to the notebook.

```
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn; seaborn.set()
from pandas import Series, DataFrame
import pandas as pd
import numpy as np

import sys
reload(sys)
sys.setdefaultencoding('UTF-8')
seaborn.set(font='Osaka') # 日本語フォントを指定する

# 以下使える
```
OnsenUI2のKitchensinkをCordovaでAndroidアプリにする

Kitchensink:https://github.com/OnsenUI/react-onsenui-kitchensink

> cordova create kitchensink

で、プロジェクトフォルダを作成します。

> cd kitchensink
> cordova platform add android

カレントプロジェクトに移動して、Androidのプラットフォームを追加します。

hello\wwwフォルダの中を削除して、あらかじめダウンロードしておいた、kitchensinkのデモアプリをhello\wwwフォルダにコピーします。

> cd www
> npm install
> cordova build android

プロジェクトをビルドします。すると、aapt.exeのところでエラーが発生。真のエラーを確認するため、直接gradlew --info を実行すると、同じファイルを一緒にパッケージにしているとか何とか。

パッケージを確認するとsemverの中にsemver.browser.js、semver.min.jsとsemver.browser.js.gz、semver.min.js.gzがある。あやしいと思いgzを削除したら無事ビルドできました。
AWRから待機イベントクラス別DB時間を時系列グラフ化

AWR(DBA_HIST*)から待機イベントクラス別のDB時間を抽出して時系列グラフにしたときのSQL。
かなり力技・・・

![wait_classes.png](https://qiita-image-store.s3.amazonaws.com/0/109229/9ed03bd6-fbcc-13ea-3ab5-699d8017cf13.png)


```sql
SELECT  runtime     ,
        e.wait_class,
        SUM(e.time_waited)
FROM
        (
                SELECT  e1.snap_id        ,
                        e1.dbid           ,
                        e1.instance_number,
                        e1.EVENT_NAME     ,
                        e1.wait_class     ,
                        (e1.TIME_WAITED_MICRO-e2.time_waited_micro)/1000000 "TIME_WAITED"
                FROM    dba_hist_system_event e1,
                        dba_hist_system_event e2
                WHERE   e1.snap_id            =e2.snap_id+1
                        AND e1.dbid           =e2.dbid
                        AND e1.instance_number=e2.instance_number
                        AND e1.event_id       =e2.EVENT_ID
                        AND e1.DBID           =:dbid
                        AND e1.wait_class    !='Idle'
        ) e,
        (
                SELECT  snap_id        ,
                        dbid           ,
                        instance_number,
                        TO_CHAR(BEGIN_INTERVAL_TIME, 'YY-MM-DD HH24:MI:SS') runtime
                FROM    dba_hist_snapshot
                WHERE   DBID                    =:dbid
                        AND begin_interval_time > :start_time
                        AND begin_interval_time < :end_time
                ORDER BY snap_id DESC
        ) s
WHERE   e.snap_id            =s.snap_id
        AND e.dbid           =s.dbid
        AND e.instance_number=s.instance_number
GROUP BY runtime,
        wait_class
ORDER BY runtime
```
coffeescript で、bootstrap toggle button を使うときは、false を返さないように注意

bootstrap のトグルボタンを、coffeescript で扱った時に、罠にはまってしまったので、共有と自戒を込めて書く。

まず、Bootstrap は、トグルボタンを簡単に作ることができる。

> 
```
<button id="button1" type="button" class="btn btn-primary" data-toggle="button" aria-pressed="false" autocomplete="off">
  Single toggle
</button>
```
> http://getbootstrap.com/javascript/#buttons-single-toggle

これを coffeescript で使った時、いくらクリックしても、トグルしなかった。
原因に想像が付くだろうか？

```
$ ->
  $('#button1').on 'click', ->
    toggleState($(this).hasClass("active"))
```

理由は `toggleState` が `false` を返してくるからだった :sweat: 

イベントハンドラが false を返すと、イベントのバブリングが止まってしまう。
そして、bootstrap 自体は、`document` でイベントを拾っているので、バブリングを止めてしまうと、`toggle` まで届かず、処理が終わってしまう。

```
$(document)
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      var $btn = $(e.target)
      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
      Plugin.call($btn, 'toggle')
      e.preventDefault()
    })
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
    })

```

よって、`toggle` の処理として、`click`を貼ることがあるなら、絶対に false を返してはいけない。

特に coffeescript は意図せずに、false を返しやすい。
上記の coffeescript は下記のように展開される

```
$(function() {
  return $('#button1').on('click', function() {
    return toggleState($(this).hasClass("active"));
  });
});
```

coffeescript では、最後の行が`return`されることは知っていても、普段あまり意識せずに書いていないだろうか。

coffeescript と bootstrap toggle button を 素の click で使うときは、充分気をつけよう。
CLionのセットアップ方法と簡単な使い方

# 環境
Windows 10を想定しています

# CLionのインストール
1.[ここ(CLion)](https://www.jetbrains.com/clion/)よりまずはCLionをダウンロードしましょう。
無料版なら[GET FREE 30 DAY TRIAL]
有料なら右上[Download]よりOSを選択して[DOWNLOAD]を押してください。

2.インストールしたexeを実行しましょう。ウィザードをよく読み、進めましょう。

3.インストールが完了したら今度はCのコンパイラを導入しましょう。
  CLionではMinGWかCygwinを利用できます。私はMinGW派なのでMinGWのインストールをします。
　すでにインストールしている場合は[CLionの初期設定]に進んでください。

# MinGWのインストール
1.[ここ(MinGW)](http://www.mingw.org/)から右上にある[Download Installer]をクリックしexeをダウンロードしましょう。

2.ダウンロードしたexeを起動し[Install]を選択し、必要な項目を設定してから[Continue]をクリックしましょう。

3.インストールが終わるまで待ちましょう。終わると新しいウィンドウが出ると思います。

4.CLionはC/C++向けのIDEなのでC/C++のコンパイラをインストールしましょう。
　右上リスト内のPackageより[mingw32-base]と[mingw32-gcc-g++]にチェックを付けます。

5.メニュー内[Installation]->[Apply Changes]を選択するとダイアログが出てくるので
　[Apply]をクリックするとインストールが始まります。

6.MinGWのインストールは完了です。

# CLionの初期設定
1.まずはCLionを起動しましょう。

1.最初に以前の設定を読み込むか聞かれます。以前に利用したことのない方はそのまま進みましょう。

2.[Set UI theme]が出てくると思います。好きな方を選んで進みましょう。

3.[Configure MinGW/Cygwin, CMake and debugger]が出てくると思います。
　[Use MinGW home]にチェックを付けインストールしたMinGWのフォルダを選択します。

4.選択するとMinGWのversionが表示され、しっかりと動作しているかテストされます。
　動作確認が終わると下のリスト全てにチェックマークがつくので次へ進みましょう。

5.[Tune CLion to your tasks]が出てくると思います。好きな設定をして次へ進みましょう。

6.[Download featured plugins]が出てくると思います。好きな設定を(ry

7.これで設定は終了です。お疲れ様でした。

#CLionの簡単な使い方
1.まずは[New Project]を選択しましょう。

2.ダイアログが出るので各項目に適当に入力し、[OK]を押します。

3.またダイアログが出てきます。[Tip of the Day]はCLionを使う上でのヒントを表示してくれます。
　今後起動するたびに出てくるので嫌な場合は[Show Tips on Startup]のチェックを外し、[Close]しましょう。

4.右下に何か出ていると思います。[Got it!]を押しましょう。

5.テスト用のコードの書かれたmain.cppがあるので実行しましょう。
　右上の緑色の▶の横にあるPopupMenuからprojectnameで指定したものを選択し、▶を押しましょう。

6.下のウィンドウに「Hello, World!」と出たら成功です。お疲れ様でした。

<FONT color="RED">日本語を使用する場合には画面右下UTF-8(defaultであり違う場合があります)をクリックし[more]->[Shift_JIS]にしましょう。</FONT>

#最後に
訂正があればコメントください。

またCMakeLists.txtはCMakeに使われるファイルです。
詳しい設定はggって見てください。(投げやり
代入と三項演算子を組み合わせる時は、演算子の優先順位に注意

↓のように書くと「"sss and bbb"」と出力されそうな気がするが

```
s = "sss and "

s << "aaa" == "aaa" ? "bbb" : "ccc"

p s
```

結果は↓

```
"sss and aaa"
```

と出てしまう。「<<」の演算子の優先順位が「==」より高いため、代入が先に動いしまうよう。

なので、()をつけて右辺の優先順位を上げてあげないとダメ。

```
s = "sss and "

s << ("aaa" == "aaa" ? "bbb" : "ccc")

p s
```
↓結果
```
"sss and bbb"
```

- 演算子の優先順位(関係演算子、論理演算子)
 - http://www.rubylife.jp/ini/if/index5.html
EaseUS Partition Master 最新バージョン11.0　新機能解説！

EaseUS Partition Masterの最新バージョン11.0に搭載される便利なクリーナーツールを皆さんに紹介します。
<a href="https://jp.easeus.com/partition-manager-software/free.html" >EaseUS Partition Master</a>で一時ファイル、エラーファイル、ログファイル、バックアップファイルなどの「不要なファイル」、ブラウザ閲覧履歴やファイル使用履歴などの「痕跡」を削除できます。以下は使用方法です。

ステップ1.ソフトを運行し、上側の「クリーンアップ/最適化を実行」をクリックして、メニューが出ます。
![cleanup-01.png](https://qiita-image-store.s3.amazonaws.com/0/124905/aaaba45f-e6a8-5d3a-db65-700d5e3548bc.png)

ステップ2.「ジャンクファイルクリーン」を選んで、全般的にジャンクファイルを分析して消せます。
![cleanup-02.png](https://qiita-image-store.s3.amazonaws.com/0/124905/4c4d3446-0076-5415-8dcd-d96e5c661394.png)

ステップ3.あるディスクでの大容量ファイルを消したいなら、「大容量ファイルクリーンアップ」をクリックして、クリーンの選択操作ができます。
![cleanup-03.png](https://qiita-image-store.s3.amazonaws.com/0/124905/512630a6-676e-95c9-82cd-4df12bc6ab19.png)

ステップ4.「ディスク最適化」を選んで、ディスクずつ最適化することが可能です。パソコンをスピードアップさせます。
![cleanup-04.png](https://qiita-image-store.s3.amazonaws.com/0/124905/1d951479-b147-20ab-706b-cbcbc789e2a5.png)

さあ、EaseUS Partition Masterの新機能を使ってみましょう。
HPはこちらへ：https://jp.easeus.com/partition-manager-software/free.html

そのほか、[パーティション変更](https://jp.easeus.com/partition-manager/resize-partition-windows-10.html)、パーティション結合、データ消去などを簡単に実現できます。
[Git]ブランチ間の差分をコミット単位で知る・見る

ずっと探してたんですが、やっと方法を見つけました 
マージ先ブランチ：master
マージするブランチ:issue123

```git log --no-merges master..issue123```

これでissue123ブランチにはあって、masterにないコミットのログを表示できます。

※ドットの数にご指摘がありましたので補足資料を添付しておきます。
https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#_double_dot


※ソースコード単位の差分はこちらをご参考ください
[Qiita - マージ前にやることまとめ(git diff, 差分を見る)](http://qiita.com/iKenji/items/42248085c4f4b55660d6)

訂正ありましたらご指摘頂けると助かります... 

----
### 過去に書いた Git関連の記事 :arrow_double_down: 

[Qiita-何も知らない人がGitとGitHubを独学で知る](http://qiita.com/iKenji/items/367e8344490dd37e14f0)
[Qiita-git checkout できないとき、私はこうしてます。](http://qiita.com/iKenji/items/c03bd6e72f57291da24c)
[Qiita-プルリクエストで表示される差分の仕組みを GitHub に問い合わせたときの話](https://qiita.com/ikenji/items/7417d4f41ac8b564b36d)
[Qiita-git 差分を見る](https://qiita.com/ikenji/items/42248085c4f4b55660d6)
PerlとGCMでAndroidへPush通知

# tl;dr

JSONペイロードにタイトル・メッセージボディを詰めて、Android端末へPush通知したいときのメモ。

## Snippets
 - メッセージボディのみの場合

```perl
    my $gcm = WWW::Google::Cloud::Messaging->new(
        'api_key' => $args->{api_key}
    );
    my $res = $gcm->send(
        {   registration_ids => $args->{reg_id},
            collapse_key     => $collapse_key,
            data             => {
                message =>
                    'hogehoge',
                score     => 12345,
                is_update => JSON::true,
            },
        }
    );
```

 - タイトルとメッセージボディの場合
 
```perl
    my $gcm = WWW::Google::Cloud::Messaging->new(
        'api_key' => $args->{api_key}
    );
    my $res = $gcm->send(
        {   registration_ids => $args->{reg_id},
            collapse_key     => $collapse_key,
            notification => { "title" => "hoge", "body" => "fuga" },
        }
    );
```

※注
api_keyは文字列
registration_idsは配列のリファレンス


### Library 
WWW::Google::Cloud::Messaging
http://search.cpan.org/~xaicron/WWW-Google-Cloud-Messaging-0.06/lib/WWW/Google/Cloud/Messaging.pm#build_request(\%payload)
FuelPHP1.8 + twig 環境を構築

# 1.はじめに

Smarty もいいけど twig もね。と言われたので twig を FuelPHP で使ってみようと思い実験。VirtualBox + Vagrant + ScotchBox 環境で実行しました。

ScotchBox の取得と、インストール方法は、以下のサイトに詳しいです。
https://box.scotch.io/

# 2.FuelPHP を、サーバーで動くようにします。

http://fuelphp.com/ から、FuelPHP1.8 をダウンロードして解凍したものをサーバーに転送します。当方は、これだけで動きました。

# 3.twig を使えるようにします。

/composer.json ファイルを編集して、"require" の項目に twig/twig" : "1.*" を追加します。以下の例では、最終行に追記しています。一個前の行の行末に、"," を付けるのを忘れないようにします。

```lang:/composer.json
    "require": {
        "php": ">=5.3.3",
        "composer/installers": "~1.0",
        "fuel/core": "1.8.*",
        "fuel/auth": "1.8.*",
        "fuel/email": "1.8.*",
        "fuel/oil": "1.8.*",
        "fuel/orm": "1.8.*",
        "fuel/parser": "1.8.*",
        "fuelphp/upload": "2.0.6",
        "monolog/monolog": "1.5.*",
        "phpseclib/phpseclib": "2.0.0",
        "michelf/php-markdown": "1.4.0",
        "twig/twig": "1.*"
    },
```

# 4.cpmposer の実行

以下のコマンドを実行します。数分必要でしたが、2016/05/24 時点での最新の twig 1.24 がインストールされました。

```
php composer.phar update
```

# 6.config.php を更新

always_load に、parser パッケージを追加しします。

```/fuel/app/config/config.php
'always_load' => array(
  'packages'  => array(
    'parser',
  ),
),
```

# 6.使ってみる

view の拡張子を .twig にします。view については、http://fuelphp.jp/docs/1.8/general/views.html が参考になります。

```lang:拡張子を.twigにする例
return View::forge('home/index.twig', $data);
```

面白いことに、拡張子に .twig を指定しないと、標準の方法で出力されるので、拡張子の書き方で出力方法を混在させられるようです。

# 7.twig 内で、FuelPHP の関数を使う

/fuel/packages/parser/classes/twig/fuel/extension.php の中に、twig で使える、FuelPHP の関数が記載されています。例えば Form::open は、form_open に置き換えられます。

```lang:標準の方法
<?php echo(Form::open(array('action'=>Uri::create('index'), 'method'=>'get'))); ?>
```

```lang:twigで書く場合
{{ form_open({'action':url('index'), 'method':'get'}) }}
```

# 8.twig の動作環境を設定するには

/fuel/app/config/parser.php に記載がありますので、こちらの twig 部分を変更します。

# 9.twig を機能拡張するには

以下に、書きました。
[https://c5.yorozu-1.com/tech/fuelp/twig_extension](https://c5.yorozu-1.com/tech/fuelp/twig_extension)
SimpleDBをCLIで作成・削除

# SimpleDBの操作メモ

## 準備
- aws cliが導入済み
- `~/.aws/credentials` にPROFILEを記載

## CLIの設定
最初にhelpを見ようとしたところsdbが有効になっていなかったらしく設定を変更。
Preview serviceのデフォルト設定なのかは不明(テスト環境ではaws-cli/1.8.3を使用)

```
% aws sdb help
This service is only available as a preview service.

However, if you'd like to use the "aws sdb" commands with the
AWS CLI, you can enable this service by adding the following to your CLI
config file:

    [preview]
    sdb=true

or by running:

    aws configure set preview.sdb true

% aws configure set preview.sdb true
```

## 一覧の取得

```
% aws sdb list-domains --region REGION --profile PROFILE
{
    "DomainNames": [
        "simple_db_name"
    ]
}
```
## 作成

```
% aws sdb create-domain --domain-name sample_db_name --region REGION --profile PROFILE
```

## 削除

```
% aws sdb delete-domain --domain-name simple_db_name --region REGION --profile PROFILE
```

## 削除後の確認

```
% aws sdb list-domains --region REGION --profile PROFILE
{
    "DomainNames": []
}
```

## 感想とか
CLIから操作出来るのはかなり楽
（Consoleから削除出来ないし、SDKの導入も手がかかる為）
他のPreviewになっているCLIも同様にpreview trueにしないといけないのかも

## 参考URL
[sdb — AWS CLI 1.10.32 Command Reference](http://docs.aws.amazon.com/cli/latest/reference/sdb/index.html)
Google スプレッドシート で Google カレンダー に書いたデータを集計して遊ぶ

みなさん体重とかチェックしてますか？
聞いてみましたが特に人そのものには興味はないですー
記録方法とか器具とか気になります


今回は Google カレンダーと Google スプレッドシートを連携して遊びます


はじめに書いたとおり、 Google カレンダーに記録している体重情報を使ってチャート描画したり、回帰分析をしたりしようかなと思ってその前段階として記載した情報をシートにまとめてみました

基本的にタイトルに情報をまとめています
そのタイトルも規則性をもたせたものにしています

```text
$$.$kg $$.$% 
```

`体重 体脂肪率` という形式で書いています
統一した書き方をするとやりやすいですね
次にそれを集計するコードです
コードはかなり雑なのであまり書き方とかは参考にしないでくささい

```js
function getWieghts() {
  var sheet = SpreadsheetApp.openById("スプレッドシートのID （URLの一部分）").getSheets()[0];
  var calendars = CalendarApp.getAllCalendars();
  for (var i = 0; i < calendars.length; i++) {
    if (calendars[i].getName() == "体重") {
      var startTime = new Date(2013,1,1);
      var endTime = new Date();
      var calendarEvents = calendars[i].getEvents(startTime, endTime);
      var taizyu = [];
      var taishibo = [];
      for (var j = 0; j < calendarEvents.length; j++) {
        sheet.getRange(j+1, 1).setValue(calendarEvents[j].getStartTime());
        var splitedData = calendarEvents[j].getTitle().split(" ");
        for (var k = 0; k < splitedData.length; k++) {
          var str = (splitedData[k]).replace(/[^0-9.]/g, '');
          sheet.getRange(j+1, 2+k).setValue(str);          
        }
      }
    }
  }
}

```

やっていることは目的のカレンダーから特定期間のイベントを取得して
そこからタイトルのみを取得、単位を排除してシートに書き出すだけ

あとはスプレッドシートのチャート機能とかで自分の体重の傾向とか見てみましょう
ゴールデンウィークのおかげで量的体重緩和が起きたりしているのがみえるはずです

痩せなきゃ！
Swiftの関数やクロージャをC言語の関数ポインタとして処理する

# 概要
[前回](http://qiita.com/YOCKOW/items/09fe8f38e974a6d80224)はCからSwiftの関数を呼び出してみる方法を書いたけど、`swift.h`というヘッダを別に用意する必要があって面倒だし[^1]、`@_silgen_name("...")`というattributeもなんだか怪しげな匂いがするし、…というわけで、Swiftの関数やクロージャをC言語の関数ポインタとして処理するという方法もあるので書いてみる。

[^1]: 小規模なプロジェクトなら`c.c`に関数プロトタイプを書くだけでもいいけど…ね？

# 要約
1. `@convention(c)`を使う。
2. 以上(これだけで解った貴方はこの記事を読む必要はありません)

# 環境
* OS X = OS X El Capitan + Xcode 7.3 (Swift 2.2)
* Linux = CentOS 7 + Swift 2.2.1

```console:OS&#x0020;X
$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Target: x86_64-apple-macosx10.9
```

```console:Linux
$ clang --version
clang version 3.8.0 (tags/RELEASE_380/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin

$ swift --version
Swift version 2.2.1 (swift-2.2.1-RELEASE)
Target: x86_64-unknown-linux-gnu
```

# ソースファイル
[前々回](http://qiita.com/YOCKOW/items/3b56f546f2bf9bbce5f6)と同様、ファイルは3つだけ。

```console
$ ls
c.c  c.h  swift.swift
```
```c:c.h
#include <unistd.h>
void call_me_later(void (*closure)(), unsigned int seconds);
```
```c:c.c
#include "c.h"
void call_me_later(void (*closure)(), unsigned int seconds) {
  sleep(seconds);
  closure();
}
```
```swift:swift.swift
func swift_function() {
  print("I just woke up! Yes, I'm Function.")
}
let swift_closure:@convention(c) ()->() = {
  print("I just woke up! Uh-oh, I'm Closure.")
}
call_me_later(swift_function, 0)
call_me_later(swift_closure, 2)
```
※関数であれば`@convention(c)`すら要らない。

# コンパイル手順

## C言語ソースからオブジェクトファイルを作成

```console:OS&#x0020;X,&#x0020;Linux共通
$ clang -c c.c -oc.o
$ ls
c.c  c.h  c.o  swift.swift
```

## オブジェクトファイルと一緒にSwiftソースをコンパイル

```console:OS&#x0020;X
$ xcrun --sdk macosx swiftc swift.swift c.o -import-objc-header c.h
ld: warning: object file (c.o) was built for newer OSX version (10.11) than being linked (10.9)
$ ls
c.c		c.h		c.o		main		swift.swift
$ ./main
I just woke up! Yes, I'm Funtion.
I just woke up! Uh-oh, I'm Closure.
```

```console:Linux
$ swiftc swift.swift c.o -import-objc-header c.h
$ ls
c.c  c.h  c.o  main  swift.swift
$ ./main
I just woke up! Yes, I'm Funtion.
I just woke up! Uh-oh, I'm Closure.
```

できた。これでおわり。
ね、簡単でしょう[^2]？

[^2]: [ググれば](https://www.google.com/search?q=%40convention%28c%29)いろいろ応用編がありそうですね。
任意の色グラデのCMYK分解カーブを可視化する

一応動くからもう触らない宣言

この画像をデスクトップに置いておく。JSはESTKで実行する。
![gradationplot.png](https://qiita-image-store.s3.amazonaws.com/0/35477/15f87eff-f0d4-3e10-d2b6-c9942284508a.png)

Photoshopで401×20pxの新規画像を作成、グラデを引いておき、最前面に（activeDocument）
以下を実行すると、デスクトップにプロファイル名のファイルが作られる。

```js:PsCMYK.jsx
#target photoshop
var myColor = new SolidColor;
//app.showColorPicker();

var doc = app.documents.add(100, 50, 72, "CMYK Separation Curves", NewDocumentMode.CMYK);
var profile_name = doc.colorProfileName;
var myTime= Math.round(new Date().getTime() / 1000);
doc.close(SaveOptions.DONOTSAVECHANGES);
profile_name=profile_name.replace (/\//g, '_');



var myDoc=app.activeDocument;
myDoc.colorSamplers.removeAll();
var myPick=myDoc.colorSamplers.add([1,10]);

var myFile=new File('~/Desktop/'+profile_name+'_'+myTime);
myFile.open("w");
myFile.encoding='BINARY';
for (var myG=0;myG<101;myG++){
    var myCol=myPick.color;

    myC = myCol.cmyk.cyan;
    myM = myCol.cmyk.magenta;
    myY = myCol.cmyk.yellow;
    myK = myCol.cmyk.black;
    myR = myCol.rgb.red;
    myGr = myCol.rgb.green;
    myB = myCol.rgb.blue;   
    var myCol2 = new SolidColor();
 myCol2.cmyk.cyan=myC;
 myCol2.cmyk.magenta=myM;
 myCol2.cmyk.yellow=myY;
 myCol2.cmyk.black=myK;
 myR2=myCol2.rgb.red;
 myGr2=myCol2.rgb.green;
 myB2=myCol2.rgb.blue;
        myWrite = myG+"\t"+myR+"\t"+myGr+"\t"+myB+"\t"+myC+"\t"+myM+"\t"+myY+"\t"+myK+"\t"+Math.round(myR2)+"\t"+Math.round(myGr2)+"\t"+Math.round(myB2);
    myFile.writeln(myWrite);
    myPick.move([myG*4,225]);
        
    }
myFile.close();
```


作成されたファイルをBridgeで選択しておき、以下を実行


```js:BridgeCMYKChart.jsx
#target "Bridge"
var myFile=app.document.selections;
var mySc=File(myFile[0].path);

var myLine=new Array();
mySc.open("r");
while(!mySc.eof){myLine.push(mySc.readln());}
mySc.close();

var myImg=new BitmapData(new File("~/Desktop/gradationplot.png"));

var myAry=new Array();
for(var i=0;i<100;i++){
    myAry[i]=myLine[i].split("\t");
 
    var myColor=new Color(0,255,255);
    var myColor2 = new Color(myAry[i][1],myAry[i][2],myAry[i][3]);
    var myColor3 = new Color(myAry[i][8],myAry[i][9],myAry[i][10]);
    myDraw2(i*4,201,myColor2);
    myDraw2(i*4,221,myColor3);
myDraw(i*4, 200-myAry[i][4]*2,myColor);
        var myColor=new Color(255,0,255);
myDraw(i*4, 200-myAry[i][5]*2, myColor);
        var myColor=new Color(255,255,0);
 myDraw(i*4, 200-myAry[i][6]*2, myColor);
        var myColor=new Color(0,0,0);
 myDraw (i*4, 200-myAry[i][7]*2, myColor);
 
}

myImg.exportTo(new File(myFile[0].path+".jpg"),100);

function myDraw(x,y,c){
    for(var a=0;a<4;a++){
        for(var b=0;b<2;b++){
    myImg.setPixel (x+a, y+b, c);
    }
}
}
function myDraw2(x,y,c){
    for(var a=0;a<4;a++){
        for(var b=0;b<20;b++){
    myImg.setPixel (x+a, y+b, c);
    }
}
}
```

こういう比較ができる。
カラーバーの上段は元RGB、下段はCMYK分解色

Japan Color 2001 Coatedでの紫色の分解カーブ

![jp2001.jpg](https://qiita-image-store.s3.amazonaws.com/0/35477/9c9ee855-e370-fe1e-c295-eb1ba1b81e3f.jpeg)


Japan Color 2011 Coatedでの紫色の分解カーブ

![jp2011.jpg](https://qiita-image-store.s3.amazonaws.com/0/35477/ff5c765f-242d-1823-4d47-9a80cc9eb96c.jpeg)

2001では濃い紫がグレーになってしまうが、2011では素直に出ている。
LINEのようにロックスクリーンにActivityを表示する方法

# 目的
Android 版 LINE の通知を再現するスタディです。
ここでは、メッセージを受け取った時に表示されるLINEの画面を、ポップアップActivityと呼びます。

観察すると、以下の仕様のようです。(Android 5.0で観察)

- ポップアップ表示がONの時
    - ホーム画面でメッセージを受け取ると、バイブと音が鳴り、割り込んでポップアップActivityが表示される。通知センターに通知も追加されている。
    - ロック画面でメッセージを受け取ると、ポップアップActivityが表示される。戻るボタンを押すと、ロックスクリーンに通知が追加されている。
    - 画面がOFFの状態でメッセージを受け取ると、バイブと音が鳴り、画面がONになりポップアップActivityが表示される。
- ポップアップ表示がOFFの時
    - 画面がOFFの状態でメッセージを受け取ると、バイブと音がなる。画面はOFFのまま。
    - ロック画面でメッセージを受け取ると、バイブと音が鳴り、通知が表示される。
    - ホーム画面でメッセージを受け取ると、バイブと音が鳴り、通知センターに通知が追加される。
- その他の情報
    - LINE内で該当のスレッドを開いている場合、通知もポップアップActivityも表示されない。
    - LINE内で設定画面などを開いている場合、通知のみ追加される。

因数分解すると、メッセージを受け取った時に
1. 通知センターに通知を追加し、音とバイブを鳴らす処理
2. ポップアップアクティビティを表示し、画面をONにする処理
の2つの処理に分けられることが分かります。


# 実装
## 表示させる Activity を作成

1. app用build.gradleで、minSdkVersionを17以上に設定。
1. 表示させる HogeActivity を普通に作成
1. HogeActivity に以下のコードを追加

```java:HogeActivity.java
@Override
public void onAttachedToWindow() {
	Window window = getWindow();
	window.addFlags(
			WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
			| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
			| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
	);
}
```

1. res/values/styles.xml に以下のコードを追加

```xml:res/values/styles.xml
<style name="Translucent" parent="Theme.AppCompat.Light.NoActionBar">
	<item name="android:windowBackground">@android:color/transparent</item>
	<item name="android:colorBackgroundCacheHint">@null</item>
	<item name="android:windowIsTranslucent">true</item>
	<item name="android:windowAnimationStyle">@android:style/Animation</item>
	<item name="android:windowNoTitle">true</item>
	<item name="android:windowContentOverlay">@null</item>
</style>
```

1. AndroidManifest.xml に定義された HogeActivity を以下のように設定

```xml:AndroidManifest.xml
<activity android:name=".activities.HogeActivity"
		  android:showOnLockScreen="true"
		  android:theme="@style/Translucent"
		  android:launchMode="singleInstance"/>
```

## 作成した Activity を表示

たとえばプッシュ通知を受け取ったタイミングなどで以下を実行すると、Activityを表示できます。

```java
// アクティビティを表示
void showActivity( Context context ){
	Intent intent = new Intent(context, KindlizedNotificationActivity.class);
	PendingIntent pendingIntent = PendingIntent.getActivity(context,0, intent, 0);
	try {
		pendingIntent.send();
	} catch (Throwable e){
		Logging.error(e);
	}
}

```
調子にのってプルリクのブランチを全部持ってきてしまったので、全部消す。

他人のプルリクをローカルに持ってきたい。から、以下でプルリクを `fetch` してみた。

```bash
git fetch upstream '+refs/pull/*:refs/remotes/pr/*'
```

で、上をすると、信じられないくらい大量のブランチが僕のリモート（追跡ブランチ）に追加される。そして、`git branch -a` とか二度と打ちたくなくなる。

これは、いけません。くそ、プルリク番号を指定して、fetchしてくるんだった。。

ということで、追跡ブランチをまとめて消しました。

```
git branch -r | grep pr | xargs git branch -d -r
```

（普段、追跡ブランチをdeleteすることがないので、そこが勉強になりました。`-r` をつければよいのですね。）

ちゃんと、他人のプルリクをfetchするときは、

```bash
git fetch upstream '+refs/pull/9999/head:refs/remotes/pr/9999/head'
```

としようと思いました。

（pushしようとするともうちょっと勉強しないとだめだなぁ。
https://help.github.com/articles/checking-out-pull-requests-locally/


## 追記
ちなみに、上でつくったブランチでpullをしたいときは。

```bash
git pull upstream '+refs/pull/9999/head:refs/remotes/pr/9999/head'
```

そのままじゃないか。と思われるかもしれないのですが。..

## 追記2
ただ、PRを持ってくるだけなら

```bash
git fetch upstream pull/ID/head:BRANCHNAME
git checkout BRANCHNAME
```

でいいのか....！これならプルも下のような感じ。

```bash
git checkout BRANCHNAME
git pull upstream pull/ID/head
```
cronに仕込んだスクリプトの多重起動を制御したい

# **経緯**
crontabに仕込んだシェルスクリプトの多重起動防止のロジックを入れたところ、うまく動作しなくて原因がわかって改良したのでその覚書です。

原因がわかった時に自分の無知さに打ちひしがれましたが、これで一つ賢くなったと前向きに考えたいと思います＼(^o^)／

# **改修前**
## **スクリプト**
```bash:多重起動防止ロジック
if [ $$ -ne `pgrep -fo "$0"` ]; then
       exit 1
fi
```

## **解説**
|コマンド|説明|
|:--:|:--|
|$$|自分自身のプロセスID|
|pgrep|パターンにマッチするプロセスのプロセスIDを返す|
|-f|パターンをコマンドライン全体（パスや引数を含める）と照合する|
|-o|パターンにマッチする一番古いプロセスのプロセスIDを返す|
|$0|自分自身のスクリプト名（パス名）|

$$（現在起動しているスクリプトのプロセス番号）と`pgrep -fo "$0"`（スクリプトの一番古いプロセス番号）が一致しなかったら既に起動していると見なし、`exit`で抜けるという処理。

# **何が悪かったか**
cronからプロセスを起動させる場合、cronから子プロセスとして起動するため、多重起動の処理が誤判定をしてしまい、スクリプトが実行されていなかった。

# **改修後**
## **スクリプト**
```bash:多重起動防止ロジック
lock=test_file.lock
exec 44 > $lock
flock --nonblock 44 || exit 0
```

## **解説**
#### `lock=test_file.lock`
- lockファイルの定義

#### `exec 44 > $lock`
- `$lock`ファイルを任意のファイルディスクリプタ44で開く

#### `flock --nonblock 44 || exit 0`
- システムコール`flock`にてファイルディスクリプタ44で開いているファイルをロックできれば、スクリプト処理を実施し、できなければ`exit`で強制終了させる

# **参考**
[シェルスクリプト多重起動の防止（flock(2) を用い、極力可搬に）](http://qiita.com/knaka/items/582289c5b98ca5f55506)
jQueryで複数選択不可のチェックボックスをつくる


#目的

- デフォルトでは１つ目にチェック
- 片方選んだら片方のチェックボックスは外れる
- ラベルでもチェックはつけれる

#コード

```html:index.html
<input type="checkbox" class="checkbox" id="first" checked><label for="pre">１つ目</label>
<input type="checkbox" class="checkbox" id="second"><label for="deferred">２つ目</label>
```

```js:common.js
$(".checkbox").on("click", function(){
        $('.checkbox').prop('checked', false);	//	全部のチェックを外す
        $(this).prop('checked', true);	//	押したやつだけチェックつける
});

```


[日本語リファレンス](http://js.studio-kingdom.com/jquery/attributes/prop "日本語リファレンス")によると、.prop()は
>属性プロパティに値を設定、または設定されている値を取得します。
[PHP] phpenvコマンドで /usr/local/phpenv/libexec/rbenv: No such file or directory というエラーがでる場合の解決方法


環境はMac OS X 10.11.4 

phpenvコマンドを叩くと以下のエラーが

```
/Users/your_name/.phpenv/bin/phpenv: line 4: /usr/local/phpenv/libexec/rbenv: No such file or directory
/Users/your_name/.phpenv/bin/phpenv: line 4: exec: /usr/local/phpenv/libexec/rbenv: cannot execute: No such file or directory
/Users/your_name/.phpenv/bin/phpenv
```

/Users/your_name/.phpenv/bin/phpenv
を見ると環境変数  RBENV_ROOT, PHPENV_ROOT
を参照しているので、.bash_profileにそれぞれ設定することで解決

```
export RBENV_ROOT="$HOME/.rbenv"
export PHPENV_ROOT="$HOME/.phpenv"
```
アニメーションしている UIButton でもハイライト効果を得たい

`UIButton.imageView`でアニメーションをさせていると、タップしてもハイライト効果が得られない・`UIControlStateHighlighted`の画像が表示されないのであれこれと試してみた。
最終的に TouchDown 時にアニメーションを止めて一旦別画像に差し替えてから、async で元の画像に戻すという暴挙にでることで対応。

もう少しスマートな対応方法はないものだろうか…。

```objc
- (IBAction)buttonTouchDown:(id)sender {
    // アニメーションしているボタンはハイライト効果が得られないため、
    // アニメーションを止めて画像を一旦差し替えて再描画を行うようにする。
    if ([self.button.imageView isAnimating]) {
        [self.button.imageView stopAnimating];
        
        // set other image
        __block UIImage *originalImage = [self.button imageForState:UIControlStateNormal];
        UIImage *otherImage = [UIImage imageNamed:@"other"];
        [self.button setImage:otherImage forState:UIControlStateNormal];

        dispatch_async(dispatch_get_main_queue(), ^(void) {
            // set original image
            [self.button setImage:originalImage forState:UIControlStateNormal];
        });
    }
}
```
ssh キーボードの挙動修正


BeagleBoneBlack(BBB)にUbutuを入れて数日が経ちました。これまで、Ubuntuを起動し、BBBに接続したキーボードで操作を行ってきました。しかし、今日Macからsshで接続し操作したらキーボードの挙動がおかしい。なぜかと思い調べてみるとログインシェルがおかしい模様。挙動がおかしい理由としてはuseraddなどでユーザを追加する際、-sオプション(shell)を指定せずに追加した場合などログインシェルが/bin/shになるようですね。

```
$ echo $SHELL
/bin/sh
```

以上のようにログインシェルが設定されているので **/bin/bash** に設定する。
設定は **chsh** コマンドを用いて行っていきます。デフォルトでは/bin/bashが使われるようになっているので、そのままEnterでいきます

```
$ chsh
Changing the login shell for ユーザ名
Enter the new value, or press ENTER for the default
	Login Shell [/bin/bash]:

```


しかし、ログインシェルは変わりませんでした。そのため、別の方法を試します。

**/etc/passwd**を修正します。
シェルを変更したいユーザの最後にシェルを指定してあげます。ほにゃららのところは皆さんの設定次第ですので、 **重要なのは最後にシェルを指定することです。**

```/etc/passwd
ほ:にゃ:ら:ら::ら:ら:/bin/bash
```

これでシェルが変わっているはずです。
Watson IoT Platform - MQTT - Publish/Subscribeしてみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
[MessageSightを動かす](http://qiita.com/egplnt/items/246205f6574cde268712)でMQTTブローカーとしてMessageSightを準備しました。

#Publishしてみる
1. 下記のようなプログラムを使ってpublishします。
2. トピック名やClientID、payload(送付するデータ)などを変化させて試してみます。

```py:pub.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import time
import paho.mqtt.client as mqtt
import random

topic = "topic/test"
clientID = "pubTester"
broker = "172.16.xxx.xxx"

mqttc = mqtt.Client(clientID)
mqttc.connect(host=broker, port=1883, keepalive=60)
while mqttc.loop() == 0:
 
	temp = random.randrange(-10,40)
	humidity = random.randrange(20,99)
	print "temp = " + str(temp) + ", humidity = " + str(humidity)
	msg = " {\"d\": {\"temperature\": " + str(temp) +",\"humidity\": " + str(humidity) + "} }";

	mqttc.publish(topic, payload=msg, qos=0, retain=False)
	print "message published"

	time.sleep(1)
```

#Subscribeしてみる
1. 下記のようなプログラムを使ってsubscribeします。
2. トピック名やClientIDなどを変化させて試してみます。

```py:sub.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt

topic = "topic/test"
clientID = "subTester"
broker = "172.16.xxx.xxx"

def on_connect(client, userdata, flags, rc):
    print("connected")
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

mqttc = mqtt.Client(clientID)

mqttc.on_connect = on_connect
mqttc.on_message = on_message

mqttc.connect(host=broker, port=1883, keepalive=60)

mqttc.loop_forever()
```
Pythonに通知させる

terminal notifier便利だからみんなライブラリ作ってるもんですね。

## インストール

```
pip install pync
```

## 使い方

```py
> from pync import Notifier
> Notifier.notify('hogepiyo ~')
```

## 結果

<img width="216" alt="dcf3ad41-98d9-5332-419b-da257194a5e1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/28555/61ebea71-e645-a7ec-3044-aad73ddbbc01.jpeg">
Rに通知させる

Rで処理を書いて計算すると、計算量が多すぎて数十分返ってこない事が時々ある。
そのため処理が終わっているかどうか、作業の合間に確認することをよくやりがちだが、正直面倒くさい上に集中力が削がれる。

ので、Rに通知させる方法を調べていたら面白い記事があったのでトライしてみた。
けっこういい感じ。ちなみにMacだけ。Rstudio-serverでの方法はしらない。Winでのやりかたはもっと知らない。

## やりかた

1. terminal-notifierをインストール。

```
$ brew install terminal-notifier
```

2. Rのコンソールに移動し、下記コマンドを入力。

```
> install.packages("devtools")
> library(devtools)
> source_gist("9c419af5547fde20d2a7")
```

3. 好きに通知する

```
> notify("hogepyiyo ~")
```

その結果はこんな感じ。

<img width="208" alt="7c31425e-6506-cf2b-7e24-c5cabc763a66.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/28555/e5cc93e3-2191-b12c-a9d7-05dd75956655.jpeg">



notifyの中身はただのsystem関数。

```notify.R
function(msg="Operation complete") {
  
  in.osx <- (Sys.info()['sysname'] == "Darwin")
  in.rstudio <- (Sys.getenv("RSTUDIO") == "1")
  in.rgui <- (Sys.getenv("R_GUI_APP_REVISION") != "")
  dir.notifier <- system("which terminal-notifier", intern = TRUE)
  
  if (in.rstudio) { # hack to see if running in RStudio
    title <- "RStudio"
    sender <- activate <- "org.rstudio.RStudio"
  }
  
  if (in.rgui) { # running in R GUI app?
    title <- "R GUI"
    sender <- activate <- "org.R-project.R"
  }
  
  # if running in RStudio or R GUI app use NotificationCenter otherwise use message()
  if ((in.rstudio | in.rgui) & in.osx) {
    system(sprintf(paste(dir.notifier, "-title '%s' -message '%s' -sender %s -activate %s", sep = " "),
                   title, msg, sender, activate ),
           ignore.stdout=TRUE, ignore.stderr=TRUE, wait=FALSE)
  } else {
    message(msg)      
  }
  
}
```