OmniAICreator/Qiita-1.07M huggingface dataset:
JSONExportの使い方

英語訳があるので日本語でいきます。
#JSONExportってなに?
JSONExportはJSONオブジェクトを簡単にモデルコードに変換することができるMac用アプリケーションです。
あっ、Swift 3.0 対応してます。

#JSONExportを使う目的は？
JSONからコードを見ていちいちコーディングするのは頭の体操にはなりますが人によっては時間がかかる+ミスになります。
そこでJSONExportって楽しようやってのが目的です。

#サポートされている言語 
1.  Java for Android.
2.  Java for Realm Android.
3.  GSON for Android
4.  Swift Classes.
5.  Swift Classes for SwiftyJSON library.
6.  Swift Classes for Realm.
7.  Swift - CoreData.
8.  Swift Structures.
9.  Swift Structures for Gloss
10. Swift Mappable Classes for ObjectMapper
11. Swift Structures for Unbox
12. Objective-C - iOS.
13. Objective-C - MAC.
14. Objective-C - CoreData.
15. Objective-C for Realm iOS.

#使用方法
まず公式(https://github.com/Ahmed-Ali/JSONExport)でgit clone or downloadしましょう。
<img width="1058" alt="スクリーンショット 2016-10-05 13.07.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/129117/3f20886a-9476-68c4-b291-f921627678e5.png">

ダウンロードしたフォルダーを開き"JSONExport.xcodeproj"をダブルクリック
<img width="320" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/129117/c7539727-8de0-42bf-f6e1-eb72ee60eac5.png">

Xcodeが起動しましたら左上のRunボタンを押して起動!
<img width="1272" alt="スクリーンショット 2016-10-05 13.10.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/129117/4baac9f7-970f-6007-67aa-a916fe94d6b0.png">

するとアプリケーションの画面がどーんとでます。
![スクリーンショット 2016-10-05 13.12.43（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129117/5a94132a-4072-fcf9-b5bc-ea2e89284108.png)

ここからは僕がよく使っているSwift + Unboxを例に説明します。
`{
"data" : {
"content" : [{
        "description" : “Qiitaおもしろい”,
        “qiitaUserId" : “law”,
        “Name” : “NoName”,
        "countComment" : 0,
        "isFollow" : true,
　　　　　　}]
　　　　　}
　　　}
`
このJSONコードを・・・左につっこみます。すると…
![スクリーンショット 2016-10-05 13.24.12（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129117/bd193573-d22f-e8d5-8db7-5b9265449236.png)
左下のUtility Methodsは使わない場合チェックを外しても構いません。

はやい！！！！面倒臭い作業が早く終わらせて別の作業にうつることが可能に！！！
出力されたコードはコピーして使用しても可。または右下のSaveボタン押せばなんと選択したdirectoryにコードファイルを生成して保存していただけるという…！！！
便利な世の中になったものですね。
Mac Node.jsインストール〜ローカルサーバー起動


# 環境

* MacBook Air El Capitan iOS 10.11.6

# やること

* MacにNode.jsインストール
* ローカルサーバー起動
* チャットアプリ作成

# 環境構築 ケース１：公式よりpkgインストール
* パッケージ管理とか面倒臭い！とにかく手っ取り早く始めたい向け

## インストール
* 以下いずれかの公式サイトより「Install」
 * [Node.js公式（EN）](https://nodejs.org/en/)
 * [Node.js公式（JP）](http://nodejs.jp/nodejs.org_ja/)

* ダウンロードした「node-v0.11.11.pkg」を選択し、ウィザードに従いインストール
* 私の環境では以下になりました
![nodejs-setupcomplete.png](https://qiita-image-store.s3.amazonaws.com/0/79788/87b8fa54-cd65-b6bb-79fd-36dbb86e3b77.png "nodejs-setupcomplete.png")

# 環境構築　ケース２：バージョンマネージャーを利用してインストール
* いやいや、俺はちゃんとパッケージ管理したいんだ！という方向け

## nodebrewインストール
### Yosemite以降は不可のようです（2016/10/05執筆時点）
* Homebrewを使い、nodebrewを入れます

```
$ brew install nodebrew
```

### Yosemite以降の方
* 上記のようにHomebrew経由でnodebrewを入れた場合、``nodebrew install-binary``にて以下のエラーになりました

```
$ nodebrew install-binary v0.11.11
Fetching: https://nodejs.org/dist/v0.11.11/node-v0.11.11-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/shockyeah/.nodebrew/src/v0.11.11/node-v0.11.11-darwin-x64.tar.g
Warning: z: No such file or directory

curl: (23) Failed writing body (0 != 942)
download failed: https://nodejs.org/dist/v0.11.11/node-v0.11.11-darwin-x64.tar.gz
```

* [hokaccha/nodebrew](https://github.com/hokaccha/nodebrew#install)を利用してインストール

```
$ curl -L git.io/nodebrew | perl - setup
```

### 共通

* 起動時に読み込みされるようPATHの設定、読み込み

```
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
```

## Node.jsインストール

* インストール可能なバージョン一覧を表示

```
$ nodebrew ls-remote
```

* インストール

```
$ nodebrew install-binary v0.11.11
```

* 対象バージョンを有効化

```
$ nodebrew use v0.11.11
use v0.11.11
```

* インストール済みバージョンを確認

```
$ nodebrew ls
v0.11.11

current: v0.11.11
```

# 動作確認

* バージョン

```
$ node -v
v0.11.11
```

## ローカル上にサーバーを立ててHello World
 * 以下を任意のディレクトリへ作成

``` example.js
var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');
```

 * 実行

```
$ node example.js 
```

 * 任意のブラウザで以下にアクセス
  * http://127.0.0.1:8124/

 * 「Hello World」が表示されればOK

# チャットアプリを作ってみる

* この時点まででNode.jsのパッケージを管理するnpmコマンドが利用出来るようになっています。  
これを利用してsocket.ioをインストール。

```
$ npm install socket.io
```

* [SOCKET.IO 1.0](http://socket.io)を利用したチャットアプリを作るつもりでしたが、いろいろ調べている結果、  
既に同様にまとめていらっしゃる方がいましたので、そちらの方のリンクを貼らせていただきます。
 * [【node.js】socket.ioで構築したローカルで動くシンプルなチャットルーム。みんなで書けるリモート版も公開中。](http://www.tettori.net/post/852/)

# 参考
* [Node.js v0.11.11 マニュアル & ドキュメンテーション](http://nodejs.jp/nodejs.org_ja/api/)
なぜ ArrayList は List 型で宣言するのか

ArrayList を使う際、

```
List<E> arrayList = new ArrayList<>();
```

と List 型で宣言しすべきと一般的に言われています。

なぜそうなったのか気になったので、調べた結果をまとめました。

### ArrayList を List 型で宣言すると...
1. 「これは List インターフェースにある機能だけで充分で、ArrayList 等の独自の機能は必要としていない」ということを明示できる
2. 後で型が変わる場合に変更範囲がより少なくなる 

主に上記の2点のメリットを得ることが出来ます。

### List 型のメソッドだけで事足りる場合の ArrayList の扱い
ArrayList を使う際、ただ要素を Add して取り出すだけといった用途の場合があるかと思います。
そういった際は List インターフェースのメソッドだけで事足りるのですが、もちろんインターフェースは実装しなければ使えないため、List インターフェースを継承した、ArrayList や LinkedList といったオブジェクトを代入する必要が生まれます。

それなら ArrayList じゃなくて LinkedList でも変わらないのか、と言われると実はそうではなく、場合によってどちらがより適して来るのかが変わってきます。
[こちらで別にまとめましたので気になる方は御覧ください。](http://qiita.com/BumpeiShimada/items/522798a380dc26c50a50)

上記の理由から、ArrayList 固有のメソッドが必要な場合のみ、

```
ArrayList<> arrayList = new ArrayList<>();
```

と宣言することが好ましいとされています。

### List 型で宣言しておけば、後で必要になった時に ArrayList 以外の型も入れられる
後で機能拡張を行う可能性がある場合、出来るだけ拡張性を高めておくことがより好ましい場合があります。

List 型で宣言された変数には、必要であれば、ArrayList だけでなく、LinkedList といった他の List インターフェースを継承したオブジェクトを代入出来るようになるため拡張性が広がります。

## 参考
- [Java、ListとArrayListの違い。 - 
マコトのおもちゃ箱　～ぼへぼへ自営業者の技術メモ～](http://piyopiyocs.blog115.fc2.com/blog-entry-219.html)
- [Java初級者のための必須Java標準APIまとめと簡易解説 - つかびーの技術日記](http://tech-blog.tsukaby.com/archives/192)
curator 4.1.1 で Elasticsearchにたまったlogstashのログを消すメモ

Logstashのログが気付いたらめちゃんこ溜まってたので処理したときのメモ


http://qiita.com/hakobera/items/48e15c4bb4cc8110c495

こちらの記事を見つけて、 curatorを使わざるを得ない　
と思ったけどいろいろ変わってて泣いたのでまとめました。

# 環境
CentOS 7.2

# インストール
自分は yum を使いたかったので、公式を参考に設定した。
[Curator 4.1 Instration](https://www.elastic.co/guide/en/elasticsearch/client/curator/current/installation.html)

```bash
# /etc/repo.d/curator.repo を作成 編集
[curator-4]
name=CentOS/RHEL 7 repository for Elasticsearch Curator 4.x packages
baseurl=http://packages.elastic.co/curator/4/centos/7
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
```

で、 yum install

```bash
sudo yum install python-elasticsearch-curator
```

# 設定ファイルの作成
したいこと
- localhost:9200 のElasticsearchへ接続
- logstash で始まるindex　の削除
- 過去30日分だけ残す
## configファイルの作成
curator を実行するユーザーの ~/.curator/ ディレクトリに curator.yml を作成
<strong>別の場所に作っても、パス指定できるので問題ない。</strong>

公式を参考に...
[Curator4.1 Configuration](https://www.elastic.co/guide/en/elasticsearch/client/curator/current/configfile.html)

```bash
### ~/.curator/curator.yml
client:
  hosts:
    - localhost # 接続先IP かホスト名
  port: 9200
  url_prefix:
  use_ssl: False
  certificate:
  client_cert:
  client_key:
  ssl_no_validate: False
  http_auth:
  timeout: 30
  master_only: False

// ログ出力の設定
logging:
  loglevel: INFO
  logfile:
  logformat: default
  blacklist: ['elasticsearch', 'urllib3']

```

## actionファイルの作成
やりたいことの設定ファイルを作成　今回はindexを消したい

場所はどこでもいいです。　私は設定ファイルと同じ場所に置きました
ファイル名は適当に、 delete_indices_30_days にしました

公式のサンプルを参考に...
[Curator Examples](https://www.elastic.co/guide/en/elasticsearch/client/curator/4.0/examples.html#ex_delete_indices)

```bash
### ~/.curator/delete_indices_30_days

# Remember, leave a key empty if there is no value.  None will be a string,
# not a Python "NoneType"
#
# Also remember that all examples have 'disable_action' set to True.  If you
# want to use this action as a template, be sure to set this to False after
# copying it.
actions:
  1:
    action: delete_indices
    description: >-
      Delete indices older than 45 days (based on index name), for logstash-
      prefixed indices. Ignore the error if the filter does not result in an
      actionable list of indices (ignore_empty_list) and exit cleanly.
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: True
    filters:
    - filtertype: pattern
      kind: prefix
      value: logstash-
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 30 #何日前まで残すか
      exclude:
```

このままだと実行できないので、 
"disable_action: True" を False にします。

# 実行
```bash
# 設定ファイルを ~/.curator/curator.yml に作った場合
$ curator ~/.curator/delete_indices_30_days

# 設定ファイルを それ以外の場所に作った場合
$ curator --config /path/to/curatoy.yml  ~/.curator/delete_indices_30_days
```

いけました！ ではでは
atomでReactのコンポーネント新規作成用snippetを登録してみた

ReactでES2015のクラス定義でコンポーネントを作成することが多いのだけど、いかんせん記述量が結構あるので毎回辛いなと思っていた。
そういえばatomはsnippet登録出来るはずだよなと思い調べてみました。

## 結論 `~/.atom/snippets.cson` に書くだけ

ターミナルで `atom ~/.atom/snippets.cson` してファイルを開いてsnippetを追加すれば、エディタの再起動も必要なくすぐ使えた。

登録したsnippetはこちらです

```cson
'.source.jsx':
  'Component Skelton':
    'prefix': 'rcs'
    'body': """
      import React, { Component, PropTypes } from "react";

      export default class ${1:YourComponentName} extends Component {
        static get componentName() {
          return "${1:YourComponentName}";
        }

        static get propTypes() {
          return {
          };
        }

        constructor(props) {
          super(props);
          this.state = {
          };
        }

        render() {
          return (
            <div>
            </div>
          );
        }
      }
    ""
```

※ __R__eact __C__omponent __S__kelton の略で `rcs` にしました。

これで `hoge.jsx` を開いているときに `rcs` と入力すると

![スクリーンショット 2016-10-05 13.01.55.png](https://qiita-image-store.s3.amazonaws.com/0/673/7408f730-f6ea-7141-0478-4288fd98f1ac.png)

というメニューが現れるのでtabキーを押すと

![スクリーンショット 2016-10-05 13.02.06.png](https://qiita-image-store.s3.amazonaws.com/0/673/9f4af260-5cd6-77f9-adbd-843acbd1f682.png)

こんな感じでスニペットが記述されていくらか幸せになれます。

## 余談 `static get componentName()` ってなに

railsのフロントでreactを使うことが多いのだけど、htmlに `<span data-component="YourComponentName"></span>` とだけ書いておいて、
application.jsで `YourComponentName.componentName()` に一致するnode全部に自動でマウントするということをやっています。

最初は単純に `Function.name` を使って紐付けてたんですが、
minifyすると正しく動かなくなってしまうのでこうしています。
Google の Pixel と Home と Chromecast Ultra と Daydream Controller の Bluetooth 認証情報

Google の Pixel と Home と Chromecast Ultra と Daydream Controller の Bluetooth 認証情報を調べてみました。

# Google Pixel
たぶん Google Pixelです。 Fluoride 1.1を使っているから。

* HTC G-2PW4XXX, G-2PW2XXX [D030914](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=30914)
 * Qualcomm QCA6174a; QCA6164a; QCA9377 [D025335](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=25335)
 * Fluoride 1.1 [D024527](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=24527)

# Google Home
* Google Home [D032816](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=32816)
 * Marvell® Avastar™ 88W8887_Class II [D022279](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=22279)
 * Marvell Android BLUETOOTH 4.1 Stack	[D022722](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=22722)

# Google Chromecast Ultra
* Google Chromecast Ultra [D032815](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=32815)
 * Marvell® Avastar® 88W8997_Class II [D030682](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=30682)
 * Marvell Android BLUETOOTH 4.1 Stack	[D022722](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=22722)

# Google Daydream Controller

* Google D9SCA [D032614](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=32614)
 * DA14680 - Controller [D028635](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=28635)
 * DA14680 - Host [D028636](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=28636)
 * DA14680 - Profiles [D028997](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=28997)
LINE messaging API サンプル php

#オウム返しbot

```php
<?php
define('TOKEN', 'トークンを入力');

//callback確認
$obj = json_decode(file_get_contents('php://input'));

//textとreplyToken取得
$event = $obj->{"events"}[0];
$text = $event->{"message"}->{"text"};
$replyToken = $event->{"replyToken"};

$post = [
	"replyToken" => $replyToken,
	"messages" => [
                    "type" => "text",
	                "text" => $text]
	              ];

$ch = curl_init("https://api.line.me/v2/bot/message/reply");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json; charser=UTF-8',
    'Authorization: Bearer ' . TOKEN;
    ));
```
IBM Bluemixの独自ドメインをSSL化するのにハマった話


もりちゃん　こと　森田です。

今回は、IBM Bluemixを使って独自ドメイン＋SSL通信を試した際にハマった話をしようと思います。

前提として、

- 独自ドメインは設定済み
- 証明書はアップロード済み
- なのに、アクセスしてもアップロードした証明書が使われていない

こんな人が対象になります。

アップロードとかその辺は、他のページをみてね。


## 先に結論

***DNSにレコードを追加する際に、「CNAME」は使わず、「A」を使う。***

これだけです。


## たどり着くまで

公式っぽいとこ
[ IBM Bluemix - アプリの保護](https://console.ng.bluemix.net/docs/manageapps/secapps.html)

ここを見ると、こう書いてありました。

> カスタム・ドメインを使用する場合、SSL 証明書を提供するために、 以下の地域エンドポイントを使用して、Bluemix で組織に割り振られた URL 経路を指定します。
>
> US-South: secure.us-south.bluemix.net
> EU-GB: secure.eu-gb.bluemix.net
> AU-SYD: secure.au-syd.bluemix.net

これに則ってDNSの設定をするとこんな感じ

| RECORD NAME | TYPE  | TTL  | CONTENT
|:------------|:------|:-----|:--------
| app01       | CNAME | 7200 | secure.us-south.bluemix.net


これでアクセスすると・・・。

![screenshot 3.png](https://qiita-image-store.s3.amazonaws.com/0/11643/9d2c6e19-abb4-1ed4-5333-91377589dcab.png "screenshot 3.png")


### えっ・・・。
『この接続ではプライバシーが保護されません』・・・。
証明書は「*.mybluemix.net」のまま・・・。

***ここで1日使いました。***

これ無理じゃね？？


### そこに現れた良さげなstack overflowの質問と回答

> ## Custom SSL cert not working in Bluemix
> ### Question
> We purchased a certificate from GoDaddy and I have uploaded the public, private and intermediate keys into the domain management dialog. When I view the cert it says "unknown" and still serves the *.mybluemix.net cert.
>
> I used openssl to convert the crt and key into a p12 to verify they match and the -modulus/md5 checks match.
>
> is there something on the Bluemix side I have to do, or does it just take 24 hrs to work?
>
> ### Answer
> By changing our DNS from "CNAME" to "A" the Bluemix server gave us the correct cert.


つまり、 ***「CNAME」じゃなくて「A」でやれ*** と・・・。


### 「A」使えとか言われてもIPわからねーよ！

とりあえず、`nslookup`してIPを調べましょう。
多分こんな感じ。

```sh
$ nslookup secure.us-south.bluemix.net
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   secure.us-south.bluemix.net
Address: 75.126.81.68
```

***IPアドレスGETだぜ！***


### ここまでの情報をもとにDNSを再設定

| RECORD NAME | TYPE  | TTL  | CONTENT
|:------------|:------|:-----|:--------
| app01       | A     | 7200 | 75.126.81.68


***これでおしまい***


## なんでこれで出来るの？（推測）
CNAMEだとmybluemix.netとしてアクセスした体になって、
*.mybluemix.netが使われるんじゃないかな？と思います。

※違ったら指摘頂けると助かります


## 最後に

Bluemixについての日本語ページはそこそこある感じですが、
欲しいところが抜けていたりして、ちょっとハマりました。

公式ページにすら罠が貼られているとは・・・。

本質を理解して使っていかないと、惑わされていくばかりですね。
気をつけよっと。


## 参考

- [ibm - Custom SSL cert not working in Bluemix - Stack Overflow](http://stackoverflow.com/questions/35369069/custom-ssl-cert-not-working-in-bluemix)
- [アプリの保護](https://console.ng.bluemix.net/docs/manageapps/secapps.html)
文字(UITextView)の一部をHyperlink化させる

見返すためにちょこっとメモ
The code in this post is written in Swift 2.3. Sorry for Swift 3.0 users lol
I will convert this to Swift 3.0 soon.

# Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 2.3

#  Code
```swift:ViewController.swift
import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var textView: UITextView!
    var textRange: NSRange = NSRange()

    override func viewDidLoad() {
        super.viewDidLoad()
        setStrings()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
extension ViewController{
    func setStrings(){
        // for Text
        textView.text = "Qiitaに投稿！自分用のメモとして使用しています！"
        textView.userInteractionEnabled = true
        let text = textView.text!
        textView.backgroundColor = UIColor.clearColor()
        
        let linkText = "Qiita"
        textView.editable = false
        textView.selectable = true
        textView.scrollEnabled = false
        textView.textAlignment = .Center

        let nsTex = text as NSString
        let linkRange = text.rangeOfString(linkText)
        
        let style = NSMutableParagraphStyle()
        style.alignment = NSTextAlignment.Center
        
        let attributedString = NSMutableAttributedString(string: text, attributes: [ NSParagraphStyleAttributeName: style ])
        
        let start = text.startIndex.distanceTo(linkRange!.startIndex)
        let length = linkRange!.startIndex.distanceTo(linkRange!.endIndex)
        textRange = NSMakeRange(start, length)
        
        /*リンク位置範囲生成*/
        // all text colour
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor(), range: NSMakeRange(0, nsTex.length))
        // link colour
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor(), range: textRange)
        
        // underline
        attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: textRange)
        textView.attributedText = attributedString
        let tapGes = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapText(_:)))    
        textView.addGestureRecognizer(tapGes)
    
    func tapText(tap: UITapGestureRecognizer) {
        let location = tap.locationInView(textView)
        let textPosition = textView.closestPositionToPoint(location)
        let selectedPosition = textView.offsetFromPosition(textView.beginningOfDocument, toPosition: textPosition!)
        if NSLocationInRange(selectedPosition, textRange) {
            let url = NSURL(string: "http://qiita.com/")
            if UIApplication.sharedApplication().canOpenURL(url!){
                UIApplication.sharedApplication().openURL(url!)
            }
        }
    }
}
Resqueのenqueueの処理

`@redis.pipelined`で突っ込んでいた

[/lib/resque.rb#L352-L354](https://github.com/resque/resque/blob/5b21082fa19775df9535a38520787a07cea45540/lib/resque.rb#L352-L354)

```rb
  def enqueue(klass, *args)
    enqueue_to(queue_from_class(klass), klass, *args)
  end
```

[/lib/resque.rb#L365-L379](
https://github.com/resque/resque/blob/5b21082fa19775df9535a38520787a07cea45540/lib/resque.rb#L365-L379)

```rb
  def enqueue_to(queue, klass, *args)
    # Perform before_enqueue hooks. Don't perform enqueue if any hook returns false
    before_hooks = Plugin.before_enqueue_hooks(klass).collect do |hook|
      klass.send(hook, *args)
    end
    return nil if before_hooks.any? { |result| result == false }

    Job.create(queue, klass, *args)

    Plugin.after_enqueue_hooks(klass).each do |hook|
      klass.send(hook, *args)
    end

    return true
  end
```

[/lib/resque/job.rb#L87-L97](
https://github.com/resque/resque/blob/4bb44413a045fca78d25e22ad535b3f5ea97fab8/lib/resque/job.rb#L87-L97)

```rb
    def self.create(queue, klass, *args)
      Resque.validate(klass, queue)

      if Resque.inline?
        # Instantiating a Resque::Job and calling perform on it so callbacks run
        # decode(encode(args)) to ensure that args are normalized in the same manner as a non-inline job
        new(:inline, {'class' => klass, 'args' => decode(encode(args))}).perform
      else
        Resque.push(queue, :class => klass.to_s, :args => args)
      end
    end
```

[/lib/resque.rb#L270-L272](https://github.com/resque/resque/blob/5b21082fa19775df9535a38520787a07cea45540/lib/resque.rb#L270-L272)

```rb
  def push(queue, item)
    data_store.push_to_queue(queue,encode(item))
  end
```

[/lib/resque/data_store.rb#L102-L107](https://github.com/resque/resque/blob/39ffc387d6709bd34379d6ef96e94bff27a56098/lib/resque/data_store.rb#L102-L107)

```rb
      def push_to_queue(queue,encoded_item)
        @redis.pipelined do
          watch_queue(queue)
          @redis.rpush redis_key_for_queue(queue), encoded_item
        end
      end
```
Quantum Chemistry - Reduced Mass

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Reduced Mass
https://www.youtube.com/watch?v=iUwBW4e9n6g&index=45&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- reduced massについて
  - [関連投稿](http://qiita.com/7of9/items/b35f7137113359d55b4a)
- Harmonic Oscillatorモデルにおいてどういうmassを扱うのがいいか?
- 左上の図
  - atom1(massはm1)
  - atom2(massはm2)
  - 2つのatomはspring constant kで結ばれている
    - そのためPotential energy function V(x)は水色の式となる
  - x1はatom1の位置
    - xはrとr0の差分
        - r0 (r nought): energy minimumの時のr
  - x2はatom2の位置
  - オレンジの式: rはx1とx2の差の絶対値として定義
- 左上の紫の式
  - V()の微分はF
  - それはmass * 加速度
  - 加速度はxの2回微分
- 中段の緑の式
  - atom1, atom2についてそれぞれの式を見る
  - 左側は質量と加速度の積
  - 2つ目の式は、本人に確認したところ以下のようだ(僕の理解が間違っている可能性はある)
     - 力は(r - r0)に係数kがかかったもの
     - r - r0にてrというのは2つのatomの距離(x2 - x1)
     - そのため (x2 - x1 - r0)に係数kがかかった式となる
  - 3つ目の式は
     - x2 - x1 = r
     - r - r0 = xよりkxとして求まる
  - atom2についても同様に得られる
     - 2つ目の式においては、力のかかる向きが反対のためマイナス符号がつく
- 紫の式1つ目
  - 緑の式の1つ目を足した式
  - それはkxと-kxの合計なので0になる
- 紫の式2つ目
  - 紫の式1つ目を整理
  - $d^2$ / $dt^2$で囲ったのが右上の$m_1 x_1 + m_2 x_2$
  - さらに$(m_1 + m_2)$の係数を出して(左側)、同時に$1/(m_1 + m_2)$倍とした(右下)
- 右上のピンク
  - total mass M
  - 質量の重心 X
     - (補足) center of gravityとい用語を思い出した
- 黄色の式
  - 左下の紫の式にMとXを入れた
  - c.o.m : center of mass
  - c.o.mは時間変化しないことを示す
     - 外力が働かない限りc.o.mの時間変化はない (左上の図にて系が静止している状態。atom同士は移動している)
- 水色の式
  - 反対のケースを検討
  - x2の2回微分からx1の2回微分を引いた式
  - x2の2回微分は左中段の緑の式2つ目をm2で割って得られる
      - -kx / m2
  - 同様にx1の2回微分は kx / m1
- オレンジの式
  - 水色の式を整理
  - 左: $d^2$ / $dt^2$で囲った
  - 右: kで囲った
     - (補足) 囲うの英語: factor out
- 紫の式
  - $\mu$という定義を導入
  - その逆数の和は1/m1 + 1/m2
  - $\mu$を逆数の和から計算すると右のm1m2/(m1+m2)が得られる
- 緑の式
  - オレンジの式の左に$\mu$をかける
  - x = (x2 - x1)
  - 右側の(1/m1 + 1/m2)に(1/m1 +1/m2)^(-1)がかかって1になる
     - -kxが残る
  - 左側は$\mu$に加速度がかかった値
  - 右側-kxはForce
- 水色
  - 以上で分かった事項
  - massというのはreduced mass $\mu$であった
  - そのためangular velocity omegaはk/$\mu$の平方根となる
Mac Appのインストール時にスクリプトを実行させる


Mac Appの開発でインストーラ(~.pkgってやつ)を作ってたんだけど、`pkgbuild`でインストール前後にシェルスクリプトを差し込めるそうなので試してみた。

# 注意
開発の都合で古いバージョンを使ってやってます。
- Xcode 6.1
- MacOS SDK 10.7

# 手順

## 1. スクリプトファイルを作る

- preinstall → インストール前に実行するシェルスクリプト
- postinstall → インストール後に実行するシェルスクリプト
	
今回はこんな感じのフォルダ構成に(プロジェクト名をHogeとする)
	
```
├ Hoge.xcodeproj
├ Hoge
└ InstallScripts
  ├ preinstall
  └ postinstall
```
	
※この時、preinstallとpostinstallのパーミッションに気をつけること
自分は実行権限が付いていなくてパッケージング完了後にインストールを試したら失敗しましたｗ
多分755が無難？

## 2. アーカイブを作成する
この辺はiOSと同じ。
XcodeでProduct→Archiveを選んでアーカイブ作成

## 3. appファイルにエクスポートする
ここも大体iOSと同じ。
違うのはエクスポートの選択肢
![Kobito.8afL1z.png](https://qiita-image-store.s3.amazonaws.com/0/135304/f19536a2-4758-7241-7fc3-3a62bdac1dbc.png "Kobito.8afL1z.png")
ここでは一番上の`Export a Developer ID-signed Application`を選択

## 4. `pkgbuild`を実行する

```
pkgbuild \
--component Hoge.app \
--identifier com.hoge.Hoge \
--install-location /Applications \
--version "Hogeのバージョン" \
--scripts /path/to/InstallScripts \
HogeInstaller.pkg
```

増えるのは--scriptsのオプション。
ここで指定したパスの中にあるpreinstallとpostinstallを取り込む模様

## 5. pkgファイルの出来上がり
あとはこのpkgを実行してインストールが完了すれば無事スクリプトが実行されてるはず

## ちなみに
pkgからのインストールで失敗した場合、下記のコマンドでダンプが取れるとか取れないとか

`sudo installer -dumplog -pkg HogeInstaller.pkg -target /`

# 考察
これでインストール時にApplication Support配下のファイルを見に行って特定のファイルを消すとかリネームするとかできそう( 'ω')

しっかしiOSと違ってOSXだと日本語どころか英語の資料も少なくてつらたん...
RiotGear を require() すると "riot is not defined" になる


```js:app.js
var riot = require('riot');
require('riotgear');
require('./app.tag');

riot.mount('app');

```

browserrify

`browserify -t [ riotify ] ./src/app.js > ./src/build/bundle.js`

##結果

```err
bundle.js:2673 Uncaught ReferenceError: riot is not defined
```

なんで＞＜
【iCloud】電話帳を移行する方法

# Apple ID同士で電話帳移行を行う

今回、Apple ID to Apple IDで電話帳を移行する手順をまとめました。

## Apple ID to Apple ID移行のイメージ![icloud_migration.png](https://qiita-image-store.s3.amazonaws.com/0/127585/3ff755b3-b3b3-bd72-8696-6ed1c7362800.png)


旧Apple IDから、新Apple IDへ電話帳をまるっとコピーしちゃうという事です。
1件1件AirDropで同期する方法もありますが、数が多いと骨が折れちゃいますね:sweat:

と、いうことで早速手順を紹介します。

# 手順

## ①旧Apple IDでiCloudにサインインする
まず、移行元の電話帳が保存されているiCloudのIDにサインインします。
https://www.icloud.com/ ←ここからサインインできます。

![スクリーンショット 2016-10-05 11.46.57.png](https://qiita-image-store.s3.amazonaws.com/0/127585/f5b4d577-ca46-ab07-a6f4-68b2ad2dac0c.png)

## ②電話帳を開いて、電話帳をエクスポートする
サインインが完了すると、アプリケーションの一覧が現れます。
今回は連絡先（電話帳）を移行したいので、連絡先をクリックします。
![スクリーンショット 2016-10-05 11.56.04.png](https://qiita-image-store.s3.amazonaws.com/0/127585/8fcae7df-cd53-6448-801b-b55eacd86786.png)

連絡先をクリックすると、現在のApple IDに保存されている連絡先が一覧表示されます。

書き出す連絡先を選択します。すべて選択するには（Ctrl + A）ですべて選択します。

今回は、一度に連絡先を書き出す方法を利用します。***左下にある歯車のマーク***をクリックしてください。

![スクリーンショット 2016-10-05 11.57.37.png](https://qiita-image-store.s3.amazonaws.com/0/127585/68489738-f03d-d440-86a4-06a8b41b827f.png)

クリックすると、小さなメニューが開きます。
「　***vCardを書き出す***　」　という項目がありますので、ここをクリックします。

![スクリーンショット 2016-10-05 12.03.02.png](https://qiita-image-store.s3.amazonaws.com/0/127585/fec6ebf1-d19f-a6f4-da99-7504efdce985.png)

Windows / MacなどのOSによって現れるダイアログは異なりますが、
Exported iCloud vCards.vcf　というファイルがダウンロードされます。
次のステップで利用しますので、わかりやすい場所に保存しておくことをおすすめします。

![スクリーンショット 2016-10-05 12.06.23.png](https://qiita-image-store.s3.amazonaws.com/0/127585/84d58371-9d6a-d106-7ccf-77e20e6ae969.png)

## ③旧Apple IDからサインアウトする

ファイルの保存が終わったら、先程のiCloudの画面に戻ります。
右上に自分の名前 若しくは iCloudに登録している名前が表示されています。

サインアウトする為に、名前の横にある "下向きの矢印" をクリックし、サインアウトをクリックします。

![スクリーンショット 2016-10-05 12.07.53.png](https://qiita-image-store.s3.amazonaws.com/0/127585/303edbcf-5558-89d2-c204-977af6cd0930.png)

## ④新Apple IDでサインインする
①・②で行った手順を参照し、新Apple IDでサインインします。

## ⑤連絡先をインポートする
手順②で紹介した、左下の歯車をクリックします。
　![スクリーンショット 2016-10-05 11.57.37.png](https://qiita-image-store.s3.amazonaws.com/0/127585/f2f1377b-800d-4e1d-35b9-27c754abd86f.png)

今度は、連絡先を読み込みたいので「vCardを読み込む...」をクリックします。

![スクリーンショット 2016-10-05 12.20.11.png](https://qiita-image-store.s3.amazonaws.com/0/127585/558a6585-4f40-fb63-8d95-3c2417f52969.png)


先程ダウンロードした Exported iCloud vCards.vcf を選択します。

## 完了

上記で Apple ID to Apple IDの連絡先移行は完了です。
WRF > output option > AVGFLX_RUM / AVGFLX_RVM / AVGFLX_RWM

WRF(Weather Research and Forecasting Model)関連。

風速場関連で以下のファイルがあるようだ。

- AVGFLX_RUM 
- AVGFLX_RVM 
- AVGFLX_RWM

http://www2.mmm.ucar.edu/wrf/users/tutorial/201207/WRF_nml_Wang.pdf
のp33に以下の記載あり。

> `do_avgflx_em = 1: `
output history-time-averaged, column-pressurecoupled
u, v and w: AVGFLX_RUM, AVGFLX_RVM, AVGFLX_RWM – useful for driving downstream transport model 


downstream transport modelは未消化。

(追記 2016/10/06)
AVGFLX_RWM でなく AVGFLX_WWMが正しい名前のようだ。
WRFで処理したwrfoutファイルをncviewで確認したところ、4DVARの結果に AVGFLX_RUM, AVGFLX_RVM, AVGFLX_WWMが見られた。
VB.NET GoogleGeocodingで住所から座標情報取得

大量の住所から座標情報取るときに使ってます。
[詳細はここ](https://developers.google.com/maps/documentation/geocoding/intro?hl=ja)

```vbnet:GoogleApi.vb
Imports System.Text
Imports System.Web.Script.Serialization

Public Class GoogleAPI
    Private Const APIKEY As String = "ここにGoogleから取得したAPIキーを入力"

    ''' <summary>
    ''' Main method which performs the call to the REST service
    ''' </summary>
    ''' <remarks></remarks>
    Public Function GetGeoCode(fullAddress As String) As GeoResponse
        Try
            Dim req As System.Net.WebRequest = System.Net.WebRequest.Create($"https://maps.googleapis.com/maps/api/geocode/json?address={fullAddress}&key={APIKEY}")
            req.Method = "GET"
            Dim resp As System.Net.WebResponse = req.GetResponse
            If (resp Is Nothing) Then
                Return Nothing
            End If
            Dim sr As System.IO.StreamReader = New System.IO.StreamReader(resp.GetResponseStream)
            Dim jsonData As String = sr.ReadToEnd.Trim

            Dim ser As JavaScriptSerializer = New JavaScriptSerializer
            Dim res = ser.Deserialize(Of GeoResponse)(jsonData)
            Return res
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Class GeoResponse
        Public status As String = ""
        Public results As GeoResult() = {}
    End Class
    Public Class GeoResult
        Public address_components As AddressComponents()
        Public formatted_address As String = ""
        Public geometry As Geometry
        Public partial_match As String = ""
        Public place_id As String = ""
        Public types As String() = {}
    End Class
    Public Class AddressComponents
        Public long_name As String = ""
        Public short_name As String = ""
        Public types As String() = {}
    End Class
    Public Class Geometry
        Public bounds As NESWLocation
        Public location As GeoLocation
        Public location_type As String = ""
        Public viewport As NESWLocation
    End Class
    Public Class NESWLocation
        Public northeast As GeoLocation
        Public southwest As GeoLocation
    End Class
    Public Class GeoLocation
        Public lat As String = ""
        Public lng As String = ""
    End Class
End Class
```

こんな感じでつかう

```vbnet
Try
    Dim ggl As New GoogleAPI
    For Each address In Addresses
        'APIから情報を取得する。
        Dim geo As GoogleAPI.GeoResponse = ggl.GetGeoCode(address)
        If "OK".Equals(geo.status) Then
            'ロケがとれたとき
        ElseIf "OVER_QUERY_LIMIT".Equals(geo.status) Then
            'クエリ発行上限にひっかかったとき
            Return
        Else
            'ロケが取れなかったとき
        End If
    Next
Catch
    Throw
End try
```
WRF > sigma levels > Sigma coordinate system

WRF(Weather Research and Forecasting Model)関連。

風速場というのをsigma levelsで扱うという記載あり。

sigma levelsの記載は以下を見つけた。
https://en.wikipedia.org/wiki/Sigma_coordinate_system

> The sigma value at the scale reference is by definition 1: i.e., if surface-scaled, $\sigma _{0}=1$.

地表面がreferecenの場合はsurface pressure $p_0$に対応する$\sigma_{0}$は1。

シグマレベル使用の特徴
> The sigma coordinate system allows surfaces to follow model terrain; where terrain is sharply sloped, so are the sigma surfaces.

他の利点は未消化。


http://forum.wrfforum.com/viewtopic.php?f=22&t=414
> WRF needs the vertical pressure field rather than the sigma model levels. 

垂直方向に区切りとしては以下の2つがあるようだ。

- vertical pressure field
- sigma model levels
WRF > Spin-up time >  the time taken for an ocean model to reach a state of statistical equilibrium under the applied forcing.

WRF(Weather Research and Forecasting Model)で出てくる用語。

Spin-up
http://www.oc.nps.edu/nom/modeling/initial.html

> <font color=red>Spin-up</font> is the time taken for an ocean model to reach a state of statistical equilibrium under the applied forcing.

WRFデータを使った某システムで稼働する時にこのSpin-upの設定が重要になる。
[Unity] Animatorのローカル時間を合わせて同期する

環境 Unity5.4.0
複数の同じアニメーションを同期させないといけなかったのでメモ

### 結果

以下のコードをテキトーなスクリプトに記述して(Animatorがアタッチされている)ゲームオブジェクトにアタッチ

```
	IEnumerator Start () 
	{
		Animator animator = GetComponent<Animator> ();
		yield return null;
		animator.SetTime (Time.time);
	}
```

SetTime ()使うとAnimatorのローカルタイムを設定できる
ex. SetTime(5f)なら5秒アニメーションが動いた状態から動き出すようになる
SetTimeの引数にTime.timeを使うことでどのタイミングからアニメーションを動かしても同じ時間からスタートできる （アニメーションをloopさせること前提だけど)
yield return null で1フレーム待たないとSetTimeが機能しなかったのでコルーチン使ってる

応用として以下のようにSetTime ()の引数値をずらしてやれば意図的にアニメーションをずらすこともできる

```
	public float offset;
	IEnumerator Start () 
	{
		Animator animator = GetComponent<Animator> ();
		yield return null;
		animator.SetTime (Time.time + offset);
	}

```
ghq のご紹介、あるいは「考えないと便利」

# ghqとは

git（やhg他）のレポジトリをいい感じにチェックアウトし、一覧したりできるようにするツールです。

---

# install

```
brew tap motemen/ghq
brew install ghq
```

`go get` は非推奨とのこと

---

# 必要な設定

---

# `ghq.root`

ghqがリポジトリをインストールするチェックアウト先

デフォルトは `~/.ghq`

---

# `ghq.<url>.vcs`

特定のホスト以下はどのVCSを使うか決め打ちできる。GHEなどで必要

```
$ git config --list | grep ghq
ghq.https://ghe.your.host.vcs=git
```

---

# 使う

```
ghq get https://github.com/haconiwa/haconiwa
```

---

# すると

(デフォルトで)

`~/.ghq/github.com/haconiwa/haconiwa` と言うディレクトリを掘って、チェックアウトしてくれる

---

# 何をチェックアウトしたかの一覧

```
$ ghq list | head
bitbucket.org/ged/ruby-pg
bitbucket.org/kardianos/osext
bogomips.org/unicorn
code.google.com/p/freetype-go
code.google.com/p/go-uuid
code.google.com/p/go.crypto
code.google.com/p/go.net
code.google.com/p/go.text
code.google.com/p/go.tools
code.google.com/p/goauth2
```

フルパスなら `ghq list -p` （pecoと組み合わせると...??）

---

# なぜ必要か

---

# ディレクトリ規約を考えるのは面倒

「決めの問題」は、いい感じのスタンダードに乗るのが一番

c.f. Ruby on Rails

「規約に沿ったファイルシステムを作る」だけで、例えば一覧機能もあっさり利用できたりするわけで。

---

# go言語のライブラリの規約にも沿っている

`$GOPATH/src` を `$GHQ_ROOT` に向けるとそのままソース置き場になる

こんな感じです

```
$ ls -la ~/.go      
total 4
drwxr-xr-x    6 udzura staff  204  8 20  2014 ./
drwxr-xr-x+ 150 udzura staff 5100 10  5 10:55 ../
drwxr-xr-x  119 udzura staff 4046  6 20 11:56 bin/
drwxr-xr-x    5 udzura staff  170  5 26  2015 pkg/
lrwxr-xr-x    1 udzura staff   18  8 20  2014 src -> /Users/udzura/.ghq/
drwxr-xr-x    4 udzura staff  136  7 14  2014 src.orig/
```

---

# ghq でどんどんOSSをチェックアウトしよう
AWS oracleインスタンス上ロックされたテーブルの削除

[Amazon RDSメソッド](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.CommonDBATasks.html)ってのがあって、通常通るはずのコマンドが通らず、ちょっと手間取ったのでメモを残しておきます。

AWS oracleインスタンスにてロックがかかってしまったテーブルを削除しようとしました。

```sql
select object_name,oracle_username,s.sid,s.serial#,s.logon_time,sql_address
from v$locked_object l,dba_objects o, v$session s
where l.OBJECT_ID=o.OBJECT_ID
and l.SESSION_ID=s.SID
;
```

でSID, SERIAL#が表示されるので、それを使ってロックを解除したいテーブルをkillします。

```sql
exec rdsadmin.rdsadmin_util.kill(SID, SERIAL#);
```

改めてテーブルを消します。

```sql
DROP TABLE "MEMBER"."dipatch_stop_history" CASCADE CONSTRAINTS PURGE ;
```

以上。
sed > hello以降の行を表示する > sed -n '/hello/,$p'

```txt:動作環境
CentOS6.8
GNU sed version 4.2.1
```

以下のような構文があった

```
sed -n '/hello/,$p'
```

例を作ってみた。

```sedSample.txt
AAA
hello
CCC
DDD
EEE
FFF
```

``` bash
$ cat sedSample.txt | sed -n '/hello/,$p'
hello
CCC
DDD
EEE
FFF
```

`-n`はmanによると
> suppress automatic printing of pattern space

残りのsedの部分はhelloを見つけた、その行以降を出力するというものらしい。
ubuntu-slimをベースにDockerイメージをつくるときに役立つコマンド

bashやtopのような基本的なコマンドを入れながら色々と試行錯誤するときに役立ちそうなコマンドを書いておきます。

## kubectl runでshコンテナ起動

```
name=sh-ubuntu-slim
image=gcr.io/google_containers/ubuntu-slim:0.4

# Waiting for	pod..を消すために--quiet
# https://github.com/kubernetes/kubernetes/issues/28695#issuecomment-231902836

# topコマンド等を動かすためにTERMを設定
# https://github.com/kubernetes/kubernetes/issues/28280

# --restart=NeverでCtrl-C時にリスタートしないようにする(なくてもリスタートしないみたいだけど一応)
# http://blog.kubernetes.io/2015/10/some-things-you-didnt-know-about-kubectl_28.html

kubectl run ${name} --image=${image} --quiet --rm -i --tty --restart=Never -- env "TERM=${TERM:-xterm}" sh
```

## 欲しいコマンドを含むaptパッケージを探す

```
$ apt-get update

# apt-fileはbashがないと実行時エラーになるのに、apt-get install apt-fileだけではインストールされないので、明示的にインストールしておく
$ apt-get install apt-file bash -y

$ apt-file update

$ apt-file search --regex '/top$'
broctl: /usr/share/broctl/scripts/helpers/top
crossfire-maps: /usr/share/games/crossfire/maps/santo_dominion/magara/well/top
crossfire-maps-small: /usr/share/games/crossfire/maps/santo_dominion/magara/well/top
liece: /usr/share/emacs/site-lisp/liece/styles/top
lubuntu-extra-sessions: /usr/share/lxpanel/profile/Lubuntu-Nexus7/panels/top
lxpanel: /etc/xdg/lxpanel/two_panels/panels/top
procps: /usr/bin/top
quilt: /usr/share/quilt/top
trn4: /usr/share/doc/trn4/examples/univ/top
trn4: /usr/share/trn4/HelpFiles/top

# topコマンドが含まれているのはprocpsなので、それをインストール
$ apt-get instal procps
```

## 開発時に必要なパッケージ

これくらいは入れておくと良いです。

```
$ apt-get update && \
  apt-get install -y curl bash apt-file vim jq && \
  curl -O https://storage.googleapis.com/kubernetes-release/release/v1.3.6/bin/linux/amd64/kubectl && \
  chmod +x kubectl && \
  mv kubectl /usr/local/bin/kubectl && \
  https://github.com/Yelp/dumb-init/releases/download/v1.1.3/dumb-init_1.1.3_amd64.deb -o dumb-init.deb && \
  dpkg -i dumb-init.deb
```
一括！！Windowsプリンタインストールバッチ

# バッチファイル一発でプリンタのインストールする
自分用のメモです。
小さな会社とかで複数PCにインストールする時に使ってます。
## 対応環境
* WindowsXP ～ Windows10
* 32 or 64bit

## 手順
1.プリンタドライバを準備
2.必要な情報を探す
3.バッチファイルを作る！

## 1.プリンタドライバを準備
1.プリンタドライバをメーカーサイトからダウンロードします。
2.ダウンロードしたファイルを一式適当な場所に格納します。

## 2.必要な情報を探す
### 1.ファイルの中から.infファイルを探します。
![image](https://qiita-image-store.s3.amazonaws.com/0/143280/4a5fedc6-1e8b-3a99-8af0-abb513bf8022.png)
※リコーだとこんなやつ
### 2.ファイルを開いてプリンタ名を探す
![image](https://qiita-image-store.s3.amazonaws.com/0/143280/1f6294a5-3738-9b06-9c6e-bd878166f5f0.png)
※リコーだとこんなやつで、これの「**RICOH MP C4504 JPN RPCS**」とかいうのがプリンタ名
この場合は５種類のプリンタに対応してるっぽい？

## 3.バッチファイルを作る！
### 1.バッチファイルに情報を当てはめて準備完了
※32bit版と64bit版が別ドライバなら、各々のファイルを用意する。

「call :setup～」の行をプリンタの数だけ並べればエンター１発で全部使えるようになる！はず。。。。

```bat:printer_install.bat
@echo off

call :checkWinVer
call :setup <プリンタに割り当てたIPアドレス> "<Windowsに設定するプリンタ名>" "<みつけたプリンタ名前>" "<32bitのINFファイルパス>" "<64bitのINFファイルパス>"
exit

:checkWinVer
VER | find "XP" > nul
IF not errorlevel 1 SET WIN_VER="Windows XP"
VER | find "Version 5.2." > nul
IF not errorlevel 1 SET WIN_VER="Windows XP"
VER | find "Version 6.0." > nul
IF not errorlevel 1 SET WIN_VER="Windows 2008"
VER | find "Version 6.1." > nul
IF not errorlevel 1 SET WIN_VER="Windows 7"
VER | find "Version 6.2." > nul
IF not errorlevel 1 SET WIN_VER="Windows 8"
VER | find "Version 10.0." > nul
IF not errorlevel 1 SET WIN_VER="Windows 10"
exit /b

:setup
REM #######  設定  #######
set PRT_IP=%1
set PRT_NAME=%2
set PRT_DV_NAME=%3
set PRT_DV_PATH_32=%4
set PRT_DV_PATH_64=%5
REM #######  処理  #######

IF EXIST %SYSTEMROOT%\System32\prnport.vbs (
set PRNPORT=%SYSTEMROOT%\System32\prnport.vbs
)
IF EXIST %SYSTEMROOT%\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs (
set PRNPORT=%SYSTEMROOT%\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs
)

if "%PROCESSOR_ARCHITECTURE%" EQU "x86" SET PRT_DV_PATH=%PRT_DV_PATH_32%
if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" SET PRT_DV_PATH=%PRT_DV_PATH_64%
cd %SYSTEMROOT%\System32\Printing_Admin_Scripts\ja-JP
cscript %PRNPORT% -a -r IP_%PRT_IP% -h %PRT_IP% -o raw -n 9100
rundll32.exe printui.dll,PrintUIEntry /if /u /f %PRT_DV_PATH% /v %WIN_VER% /m %PRT_DV_NAME% /r IP_%PRT_IP% /b %PRT_NAME%
exit /b
```

変なところないかな。。。。。。
rebase -iからcommitまで自動化する


**注: この記事で書いたことはvimscriptで頑張らなくてもgitの機能を使えばできます。**
> GIT_EDITOR=: git rebase -i --autosquash HEAD^^ のように GIT_EDITOR 環境変数に : を指定するとエディタの起動がスキップされます

指摘してくださったyuku_tさん、ありがとうございます。

## rebase -iめんどくさい

こんな感じで、タイポ修正など小さな修正してrebaseするとき結構めんどくさいですよね。

![rebase.gif](https://qiita-image-store.s3.amazonaws.com/0/131581/f02e5577-3bf6-7dc9-13f9-0e32ec59dfd7.gif)

ですので自動化しました。

gitで起動するエディタはvimです。

### ~/.zprofile
```
function execIfCommandExists () {
  if type $1 2>/dev/null 1>/dev/null;then
    $1
  fi
}

# 現在の変更を1つ前のコミットと結合する
function gcommit-and-fixup(){
  git add .
  git commit --fixup=HEAD
  git rebase -i --autosquash HEAD^^
  execIfCommandExists tig
}
```

### ~/.vimrc
```
"gcommit-and-fixup用の設定
"自動で上書き保存して閉じる
function AutoSaveIfRebaseFixup()
  if match(getline(2), "fixup") == 0
    exec ":wq"
  endif
endfunction

if expand("%:t:r") == 'git-rebase-todo' && match(getline(2), "fixup")
  autocmd BufNewFile,BufRead git-rebase-todo call AutoSaveIfRebaseFixup()
endif
```

## 設定
`git commit --fixup=HEAD`を使うとHEADのコミットメッセージの先頭に`fixup!`という文字列を追加したものが自動でコミットメッセージになります。
そして`git rebase -i --autosquash HEAD^^`は自動で対象コミットへのアクションを`fixup`にします。
<img width="1364" alt="スクリーンショット 2016-10-04 11.23.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/131581/2a08533b-47fd-4466-d7aa-5d824677bb02.png">


また、rebase -iで編集するファイル名は`git-rebase-todo`ですのでこのファイル名のファイルかつ2行目に`fixup`という文字列が含まれるもの

普段は`git commit --fixup=HEAD`を使わない人向けです。

![gcommit-and-fixup.gif](https://qiita-image-store.s3.amazonaws.com/0/131581/d72a96f5-1726-0e7e-b89f-ece87018a95e.gif)

gif作ってみたかったので割と張り切りました。
connpassのイベント告知ページで使う画像のサイズ(このサイズでデザイナーに頼むといいよ)

#connpass上でよく使われる画像のサイズ

![connpass画像サイズ(主に①と②に対応してほしい).png](https://qiita-image-store.s3.amazonaws.com/0/99740/36356f50-7719-b822-04d3-b713496d92bf.png)

上記の画像とともに、
下記のようにいつもお願いしてます。

```
①の660×270pxで作ってほしくて、
②のサイズ、③のサイズでもきれいに見れると超Goodです。
(特に③はSNSのシェアがいい感じになります)
お願いしやすm(_ _)m
```

#SNSでシェアした場合画像サイズ

ちなみにですが、SNSのシェアされた時の画像は下記な感じでした。

##connpass上からfacebookにシェアする(イベント公開時や申込時にそのままシェアする場合)

下記な感じで155.764×155.764pxの正方形になります。

![facebook_connpass3.png](https://qiita-image-store.s3.amazonaws.com/0/99740/6cfdeee1-5495-be4a-0f7c-b320127e9adf.png)

##facebook上のタイムライン投稿フォームからにリンクを貼る場合

483.5559×252.778pxになります。

![facebook_connpass2.png](https://qiita-image-store.s3.amazonaws.com/0/99740/4b538702-9dfd-5bf4-8bae-4dfeb8b4d6ba.png)


横/縦=1.913なので、横/縦がこの数値より小さいものは下記のように途切れてしまいます。

![facebook_connpass3.png](https://qiita-image-store.s3.amazonaws.com/0/99740/7b6c5eca-7fc5-d575-1702-87a33f360683.png)



##twitterでシェアした場合
やはり正方形ですね。③はSNSできれいに拡散されるためには重要な感じです。

![afroscript@teratail @afroscript10Twitter.png](https://qiita-image-store.s3.amazonaws.com/0/99740/6d52cd95-72a4-6d87-32d1-7956e36025b7.png)
python > link > strftime()とstrptime()の振る舞い / コード

```txt:対象環境
python 2.6.6 on CentOS 6.8
```

strftime()やstrptime()は過去にコーディングで使っていたが、記憶力が良くないので内容を忘れてしまう。

以下のリンクを見つけた。

http://docs.python.jp/2/library/datetime.html#strftime-strptime-behavior

> 大雑把にいうと、 d.strftime(fmt) は time モジュールの time.strftime(fmt, d.timetuple()) のように動作します。

「xのように動作します」と書かれて「x」を知らなければお手上げ。self-containedなドキュメントではない。

> 逆に datetime.strptime() クラスメソッドは日付や時刻に対応する書式文字列から datetime オブジェクトを生成します。

自分の理解では(間違っているかもしれない)

- strftime() : datetime型を指定の書式文字列に変換
- strptime() : 指定の書式文字列をdatetime型に変換

コードを実装してみた。
参考 http://qiita.com/shibainurou/items/0b0f8b0233c45fc163cd



```py
import datetime

today = datetime.datetime.today()
print today

wrk = today.strftime("%Y-%m-%d_%H:%M:%S")
print "strftime:", wrk

dt = datetime.datetime.strptime(wrk, "%Y-%m-%d_%H:%M:%S")
print "strptime:", dt
```

```txt:結果
Success	time: 0 memory: 9168 signal:0
2016-10-05 01:30:12.561105
strftime: 2016-10-05_01:30:12
strptime: 2016-10-05 01:30:12
```
Xcode8 での 'QuickTime/QuickTime.h' file not found を解決する



##概要
タイトルそのままですがXcodeをアップデートして8.~にすると
![スクリーンショット 2016-10-05 9.42.03.png](https://qiita-image-store.s3.amazonaws.com/0/56510/77b91d33-ac92-ccbd-280e-5e027002c23b.png)

openFrameworksのフォーラムでも報告されていますが、SDKのQuickTimeの部分が取り除かれたみたいで、openFrameworksのバージョンof_v0.9.3_osx_releaseとかだと`'QuickTime/QuickTime.h' file not found`と言われてビルドできません。
https://forum.openframeworks.cc/t/macos-10-12-sierra-xcode-8-quicktime-deprecation-workaround/24179


解決法を調べてみると
- http://qiita.com/hiruko_jp/items/b73910ad6d146b3a73a2
- http://qiita.com/mari_286/items/389a6b42f1e7a28d0730
の記事が大変参考になりました。

__が、うまくいかなかったみたいな声も散見されたので補足させていただきます。__

##実際にやってみる(上記のQiitaで書かれてるとこまで)

まず、扱うプロジェクトはビルドの確認ができればいいので`emptyExample`とします。
![スクリーンショット 2016-10-05 9.46.55.png](https://qiita-image-store.s3.amazonaws.com/0/56510/09003e76-a5d7-da18-940b-4c5e8ebe1f3e.png)

Xcodeで`emptyExample.xcodeproj`を開くと
プロジェクトのBaseSDKが10.12となっていると思います。これをQuickTimeの部分が取り除かれる前のバージョン 10.11にしたいのですが、、選択肢に10.11が出てきません。



![スクリーンショット 2016-10-05 9.23.27.png](https://qiita-image-store.s3.amazonaws.com/0/56510/97e69f26-6d29-e63e-3c5a-4c79c5885cc9.png)

そこで
http://nuafk.jp/downloads/MacOSX-SDKs/index.html
から10.11をダウンロードし`/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs`に展開します。Xcodeを右クリックし(二本指クリック)

![スクリーンショット 2016-10-05 9.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/56510/6f257647-8b9f-ba44-9abe-a7954ce68df2.png)

該当のディレクトリは今はこんな感じ

![スクリーンショット 2016-10-05 9.27.28.png](https://qiita-image-store.s3.amazonaws.com/0/56510/d4d53575-c558-5afc-e756-2e6ed8943ae0.png)

SDK10.11を追加した後が以下となります。

![スクリーンショット 2016-10-05 9.27.52.png](https://qiita-image-store.s3.amazonaws.com/0/56510/43721d05-bab4-2efc-7d1e-b89977bc1394.png)

選択肢として10.11が出てくるのでBaseSDKを10.12から10.11に変更

![スクリーンショット 2016-10-05 9.28.29.png](https://qiita-image-store.s3.amazonaws.com/0/56510/a7f326f8-f936-faef-6698-d851175490ff.png)

一応Deployment Targetも10.11に変更

![スクリーンショット 2016-10-05 9.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/56510/f924c99e-b433-743b-93f6-89b4f30cb47b.png)

ここまでは冒頭のQiitaにも書いてありました。

##実際にやってみる(`openFrameworksLib.xcodeproj`のSDK変更)

Project openFrameworksLib のBaseSDKの変更

![スクリーンショット 2016-10-05 9.59.12.png](https://qiita-image-store.s3.amazonaws.com/0/56510/9af0dc58-6512-b42e-8e1a-c597805258e4.png)

Project openFrameworksLib のDeployment Targetの変更
![スクリーンショット 2016-10-05 10.00.29.png](https://qiita-image-store.s3.amazonaws.com/0/56510/13ec5e5c-65ca-6143-756f-8b13c85afa3b.png)

##Build Succeeded

![スクリーンショット 2016-10-05 10.01.39.png](https://qiita-image-store.s3.amazonaws.com/0/56510/98d9ead9-cb2f-1c89-c275-7efda7db6897.png)
RemoteホストのXWindow(端末とかEmacsとか)を、Localホスト画面上に表示する。

#環境
Remoteホスト ubuntu14系, 192.168.XXX.XXX とする。
Localホスト ubuntu15系 192.168.YYY.YYY とする。
*TCSHの場合は、exportをsetenv にすれば、いけるはず。。。おそらく。

#Localホストで操作
Remoteホストからのコントロールを有効にする

```bash:全ホスト許可の場合
 [localhost]$ xhost +
 access control disabled, clients can connect from any host
```

```bash:特定ホスト許可の場合
 [localhost]$ xhost +192.168.XXX.XXX(RemoteホストのIPかname)
 192.168.0.12 being added to access control list
 ※note: 192.168.XXX.XXXは適当に置き換えてね。  
```

#Remoteホストで操作(bashの場合)
Xwindowの出力先を指定する。

```bash:Xwindowの出力先を指定
 [remotehost]$ export DISPLAY="192.168.YYY.YYY:0.0"
 ※note: 192.168.YYY.YYYはLocalホスト(つまり、表示先)のIPv4アドレス.  
```

#テスト
```bash:xeyes
 [remotehost]$ xeyes
```
python > strip()の使用例 > src = '0123456789ABCDEF' / wrk = src.strip('DEF')

```txt:動作環境
CentOS 6.8
Python 2.6.6
```

strip()の使い方を勉強。
http://docs.python.jp/2/library/string.html
> string.strip(s[, chars])
> 文字列の先頭と末尾から文字を取り除いたコピーを生成して返します。 chars を指定しない場合や None にした場合、先頭と末尾の空白を取り除きます。 chars を None 以外に指定する場合、 chars は文字列でなければなりません。

http://ideone.com/5TrMOy

```py
src = '0123456789ABCDEF'
wrk = src.strip('012')

print "1:", wrk

wrk = src.strip('79')
print "2:", wrk

wrk = src.strip('789')
print "3:", wrk

wrk = src.strip('DEF')
print "4:", wrk
```

```txt:結果
1: 3456789ABCDEF
2: 0123456789ABCDEF
3: 0123456789ABCDEF
4: 0123456789ABC
```

charsの使用は未消化。
confluence > ソースを展開

confluenceの機能

### ソースを隠している状態

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1bff4762-5625-4386-0734-51d69ea87dda.png)

### ソースを展開している状態

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a17b4ae4-c9de-d130-e7c0-47a21861b368.png)
python > コマンドの出力を文字列として得る > import commands / outstr = commands.getoutput('date') > Wed Oct  5 02:34:59 PDT 2016

```txt:動作環境
CentOS 6.8
Python 2.6.6
```

```command.py
import commands

outstr = commands.getoutput('date')
print outstr
```

```txt:結果
Wed Oct  5 02:34:59 PDT 2016
```
fabric を python 内でそのまま使う(fabric3)

通常のスクリプト内から、fabric を簡単に使えることがわかったので、
メモ的に書いておきます。

jupyter から、使うと結構便利かも

from fabric.api import env,sudo,get,run,put,local,execute,hosts 
from fabric.decorators import task,hosts 
from fabric.context_managers import hide

と指定しておいて

# ssh_config ある場合は、
env.use_ssh_config = True 
env.host_string= '対象ホスト' 
env.user = 'ユーザ名' 
env.password = 'パスワード名'

#keyfile を指定する場合
env.key_filename='/Users/hoge/.ssh/id' のように指定します。windows でも使えます。#key_filename にしないといけないようです。ubuntu では、env.keyfile でもいけるようです。

それであとは、
x = run('ls -l /srv/www')

などとします。get,put なんかはまだ確認していませんが、多分使えるでしょう。
Alpine Linux3.4でLAMP (apache2)

* proxmox4.3でAlpineLinx3.3のLXC templateを使用した。3.4に更新

```bash:セットアップ
setup-alpine
# Asia/Tokyoを選択,vda,sys,後はEnter連打
sed -i -e 's/v3.3/v3.4/' \
  -e 's/^#//' \
  /etc/apk/repositories
apk update && apk upgrade
```

## apache + php7 + mariadb

```bash:phpmyadmin設定
apk add \
  apache2 \
  php7 php7-apache2 \
  \
  mariadb mariadb-client \
  \
  postfix mailx \
  \
  logwatch pflogsumm
```

```bash:
# mariadb
/etc/init.d/mariadb setup
service mariadb start
/usr/bin/mysqladmin -u root password 'パスワード'
#
rc-update add mariadb
rc-update add apache2
#
reboot
```

## phpmyadminをどうしても入れたい場合

* phpmyadminパッケージはphp5に依存、Apache2.2用の設定ファイルと使わないほうがいいが、一応メモを残しておく。

```
apk add phpmyadmin
chown -R apache:apache /etc/phpmyadmin
```

* phpmyadminの設定ファイルがApache2.2用のため2.4用に修正

```diff:/etc/apache2/conf.d/phpmyadmin.conf
  Alias /phpmyadmin "/usr/share/webapps/phpmyadmin"
  <Directory "/usr/share/webapps/phpmyadmin">
  	AllowOverride All
  	Options FollowSymlinks
- 	Order allow,deny
- 	Allow from all
+ 	Require all granted
  </Directory>
```

* http://ipaddress/phpmyadmin にアクセス

![myadm.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7c7f78f3-11a3-96e9-9dda-4cac9a8efcba.png)

## postfix

```bash:
echo "root: メールアドレス" >> /etc/postfix/aliases
newaliases
date | mail root
```

* [PHP: mail - Manual](http://php.net/manual/en/function.mail.php)

```php:/var/www/localhost/htdocs/test_mail.php
<?php
mail('メール@アドレス', 'My Subject', "message");
```

* 指定したメールアドレス宛にメールが届いていることを確認。
* [postfix: warning: smtputf8_enable is true, but EAI support is not compiled in](https://bugs.alpinelinux.org/issues/5089)のエラーが出るがメール送信が問題なかった。


## その他インストール

```bash:
#apk add samba-common-tools samba-server
#apk add nagios nagios-web nagios-plugins
apk add vim
```