OmniAICreator/Qiita-1.07M huggingface dataset:
[Atomパッケージ]１行入力エディタの実装


## はじめに

Atomを使っていると、下のような１行入力パネルが表示されることがよくある。


![スクリーンショット 2016-02-07 9.52.21.png](https://qiita-image-store.s3.amazonaws.com/0/20722/a230e5ca-67c6-bc1e-d12a-2465152043d1.png "スクリーンショット 2016-02-07 9.52.21.png")

これを自分で開発しているパッケージで表示しようとすると、Web上の情報が意外と少ないのでまとめておく。


## 実装

基本的には１行のみのTextEditorを作って表示してやる。

TextEditorを表示するには、ビューとモデルが必要になる。

ビューは```document.createElement('atom-text-editor')```で作れる。
モデルは```atom.workspace.buildTextEditor()```で作るのが現時点での方法っぽい（new TextEditor()を直接呼ぶのは古い書き方らしい）。
buildTextEditor()にはいくつかオプションを渡せるので、オプションで{mini: true}を指定してやると、１行入力になるようだ。

その他のオプションは、[https://github.com/atom/atom/blob/master/src/text-editor.coffee](https://github.com/atom/atom/blob/master/src/text-editor.coffee)のconstructorあたりを見ればだいたいわかる。

後は、ビューにモデルをセットすれば表示出来る。

全体のコードは以下。


```coffee:
module.exports =
class OneLineInputView
  callback: null
  element: null
  editorElement: null
  editor: null

  constructor: (serializedState) ->
    # Create root element
    @element = document.createElement('div')
    @element.classList.add('atom-keyboard-macros')

    # Create Editor & Editor element
    @editorElement = document.createElement('atom-text-editor')
    @editor = atom.workspace.buildTextEditor({
      mini: true,  # １行のみのエディタ
      lineNumberGutterVisible: false,  # 行番号は非表示
      placeholderText: 'Macro name'    # 説明文
    })
    @editorElement.setModel(@editor)
    self = this
    @editorElement.onkeydown = (e) ->
      # Enterキーでコールバック関数を呼ぶ
      if e.keyIdentifier == 'Enter'
        value = self.editor.getText()
        self.clearText()
        self.callback?(value)
    @element.appendChild(@editorElement)

  focus: ->
    @editorElement.focus()

  clearText: ->
    @editor.setText('')

  # Returns an object that can be retrieved when package is activated
  serialize: ->

  # Tear down any state and detach
  destroy: ->
    @element.remove()

  getElement: ->
    @element

  setCallback: (callback) ->
    @callback = callback
```
LibreOffice BASE は使えるか？ (2) マクロで、SQL実行 

SQLデータベースを実際に扱うと、いろんなSQL文をつくる必要があります。
そのSQL文の中にはなんども使うものもあれば、たまにしかつかわないものもあります。SQLデータベースには、操作画面を提供するアプリケーションがいくつもありますが、カスタマイズをするのは結構面倒です。
そこで、Base　をつかって、用途限定されていてつかいやすい。データ操作用の画面を簡単に作れないかを模索しています。 

まずは、簡単に、SQL実行できるマクロをつくりました。

****

## 環境
* OSなんでも
* LibreOffice 4.4.7でつくりましたが、他のバージョンでも大丈夫でしょう。

##  sql 実行だけ
組み込みDBのHSQLDB用のマクロです。
関数名は、動詞＋目的語　で　snake case でつくっています。
（この辺りは、好みがあるのでお好きに変更してください）
このマクロを使う場合には、他のマクロから呼び出してつかいます。
マクロエディタの中からでも、実行できます。
Thiscomponent.parent... という指定も見かけますが、この指定だと
フォームのボタンからしか、実行できません。

*エラーや戻り値の処理はこれから考えます。*

外部DBを指定しているときは、
getconnection("","")　を変更する必要ありです。

```
' sql 実行
sub do_sql(sql as string)
'msgbox(sql)
oresult = ThisDataBaseDocument.DataSource.getconnection("","").createstatement.executequery(sql)
end sub
```

sqlの指定は、下記のように書きます。ダブルコーテーションで囲むので
その中で、ダブルコーテーション　を使う場合には、"" と書きます。
```
sql ="update ""hoge"" set ""hoge_name""='xxxx' "
```

##  count だけ返す関数
データが何件あるかだけを返す関数です。実際に、データを扱っていると全文で何件あるかというのは重要な情報です。
select 文の from 以降を送り込むと実行して結果を返してきます。

```
' count
function get_sql_count( condition as string)
sql = "select count(*) from "& condition
oresult = ThisDataBaseDocument.DataSource.getconnection("","").createstatement.executequery(sql)
oresult.next
get_sql_count = oresult.getstring(1)
end function
```
basename : ファイルパスからファイル名を取得できるコマンド

# basename
ファイル名からディレクトリ、または末尾(拡張子など)を削除したものを返す。

```shell-session
ディレクトリを取り除く
$ basename /var/tmp/file.txt
file.txt

ディレクトリと拡張子を取り除く
$ basename /var/tmp/file.txt
file
```
プロセスが終了しないように、バックグランドで起動させる


# nohup 
ハングアップシグナル（SIGHUP, HUP）を無視するかたちでコマンドを実行させるコマンド。

```shell-session
nohup find / -name test.txt & ← & をつけてバックグラウンドで実行
```

ターミナルが突然切断された等の理由（TeraTermを×で閉じるとか、切断するとか）
でクローズされる場合、その端末から起動されたプロセスグループにはHUPシグナルが送信される。
このHUPシグナルを受けて、それまで実行していたプログラムは終了するが、
nohup コマンドを使ってプログラムを実行した場合は、
このHUPシグナルを無視するので、結果、そのプログラムは処理を続ける。
bashで使用する特殊な記号


# 直前のコマンドを実行
```shell-session
・直前に実行したコマンドを再現 
!!

・前のコマンドの最後を実施
!$

・以前実施したコマンドの中で、検索文字列にマッチしたコマンドを実行
!+検索

・直前に実行したコマンド、引数の一部を置換して実行
!:s/before/after
⇒ vim txt1.txt
   !:s/1/2
   vim txt2.txt
   ・全て置換
   !:s/txt/csv
   vim csv2.csv

・historyのn番目のコマンドを実行
!n
```

# 前のコマンドの引数を実施
```shell-session
・すべての引数
!*

・ 最初の引数
!^

・ 最後の引数
!$

・ n番目
!:n
```

# エスケープ
コマンド先頭にエスケープ文字をつけるとエイリアスを無視する。

```shell-session
\rm
```
Swiftで同期HTTP通信を走らせる

　`NSURLSession` を使って通信を走らせる場合、コールバックやデリゲートなどで後処理を指定する非同期通信となります。基本的に通信処理を非同期で扱うのは正しいと思います。しかし、コールバックやデリゲート、`Future` や `Observable` などのスタイルに縛られず処理を書きたいとなると、同期通信にしたくなります。

　そこで強制的に同期通信にしてしまうコードを書いてみました。これで晴れてコールバックを渡す必要も無く、デリゲートを指定する必要もない。そして `Future` や `Observable` に包む必要のない状態になりました。

```swift
public class HttpClientImpl {
    
    private let session: NSURLSession
    
    public init(config: NSURLSessionConfiguration? = nil) {
        self.session = config.map { NSURLSession(configuration: $0) } ?? NSURLSession.sharedSession()
    }
    
    public func execute(request: NSURLRequest) -> (NSData?, NSURLResponse?, NSError?) {
        var d: NSData? = nil
        var r: NSURLResponse? = nil
        var e: NSError? = nil
        let semaphore = dispatch_semaphore_create(0)
        session
            .dataTaskWithRequest(request) { (data, response, error) -> Void in
                d = data
                r = response
                e = error
                dispatch_semaphore_signal(semaphore)
            }
            .resume()
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
        return (d, r, e)
    }
    
}
```

　実際にUI層から呼び出す前に、適当なタイミングで `Future` なり `Observable` なりに `lift` すればよいので、同期である方が柔軟な設計が可能になるのではないかなと思います。`execute` の戻り型が、 `Either<NSError, HttpResponse>` とかになっているとさらに良さそうですね。

　純粋な `HttpClient` が `Future` や `Observable` に依存する必然性がないので、このコードが安定したものであれば、使っていきたいと考えています。iOS開発に詳しい方、このコード実際どうなんですかね？（丸投げ）
Atom + plantuml-preview

plantuml-viewerプラグインがうまく動かなかったので代わりを探した。

## 参考

* [plantuml-preview](https://atom.io/packages/plantuml-preview)
* [PlantUML Cheat Sheet - Qiita](qiita.com/ogomr/items/0b5c4de7f38fd1482a48#basic )

## インストール

```bash:ubuntu16.04
apt-get install -y plantuml
```

![plant.png](https://qiita-image-store.s3.amazonaws.com/0/25728/906a5709-2ef9-e928-862a-6fd1c6e245a3.png)

* 保存のたびに生成される

![plant2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/145b8b0a-f2eb-494c-446e-0771341d9bcd.png)
playframework:@helper.inputText(xxForm("hoge"))エラー 


### 環境条件
+ play framework 2.4
+ eclipse 4.3

``` play
@helper.inputText(userForm("name"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```


### エラー表示内容
---
この行で見つかった複数の注釈:
- not enough arguments for method apply: (implicit handler: views.html.helper.FieldConstructor, implicit messages:play.api.i18n.Messages)play.twirl.api.HtmlFormat.Appendable in class inputText. Unspecified value parameter messages.
- could not find implicit value for parameter messages: play.api.i18n.Messages

---


## 対応内容
下記をimportして解消。

``` play
@import play.api.Play.current
@import play.api.i18n.Messages.Implicits._
```
AWS S3のバケットをネットワークドライブに割り当てる方法

TntDriveというソフトを使用することで、S3のバケットをWindowsのネットワークドライブに割り当てることができます。

## 手順①：TntDriveのインストール
はじめに、TntDriveのページからファイルをダウンロードし、インストールします。
https://tntdrive.com/  ※トライアル版(１ヵ月間)は無料ですが、トライアル版以降はライセンス版($39.95)を購入する必要があります。


## 手順②：S3への接続設定
インストールが完了したらTntDriveを起動し、「Add New Mapped Drive」を選択する。

![image](https://qiita-image-store.s3.amazonaws.com/0/100291/f36a5a6c-f590-70e3-79ca-15b80ed75cef.png)

Storage Typeに「Amazon S3 Storage」を選択し、S3にアクセスするためのAccess Key、Secret Access Keyを入力する。

![image](https://qiita-image-store.s3.amazonaws.com/0/100291/edc276f5-c179-53bc-3f01-7296284b13d6.png)


## 手順③：S3へ接続

トップ画面にて「Open」ボタンを押下する。
![image](https://qiita-image-store.s3.amazonaws.com/0/100291/2867d0e2-306e-b159-3ce6-06e7bc8669bb.png)

ネットワークドライブにS3のバケットがマウントされていることを確認。
![image](https://qiita-image-store.s3.amazonaws.com/0/100291/a2ab44ba-7c49-c2a6-576f-50ba3343df65.png)


以上です。

製品版を購入するには40ドル程度の出費になりますが、いちいち管理コンソールからファイルをアップロードせずに済むため、購入してみる価値はあると思います。
Aruduino > [調査中] 1MHzのクロックを出す方法 > delayMicroseconds() / Digital write takes about 4us / PORTB: なし / GPOS / GPOC

チャージポンプ（負電圧）がきっかけで調べ初めたこと。

1MHzのクロックをESP8266でどう出力するのか。

### link1

「ファンクションジェネレーターが壊れて困っている。Arduinoで50%のDuty比で1MHzを出したい」という質問者に対して、Resinatorさんの回答として delayMicroseconds()使用が記載されている。

http://forum.arduino.cc/index.php?topic=116094.0

delayMicroseconds()のリファレンスは以下。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2595

~~次に時間ができる時に試す予定。~~(下の方で試した。)

同じ人の他の回答としては PWM を使う、とやはりある。でもこの人はPWMを使ったことがないとのこと。

あと以下が気になった。

> <font color=red>Digital write takes about 4us</font> so thats not an option for even moderate frequencies direct port addressing is what you need

これが本当ならGPIOの変更自体を変えないといけないということだろう。

```
PORTB = B100000;         // Digital pin 13 high
```

のようにしているのは、この問題の回避なのかもしれない。以下を使うよりは上を使う方がいいのだろうか。

```
gpio.write(4, gpio.HIGH)
```
 
ESP8266で PORTBへの代入例はあった。
http://www.esp8266.com/viewtopic.php?p=29911

<hr>
(追記 2016/02/08)

### delayMicroseconds() > 効果なし

とりあえず `usleep()` を `delayMicroseconds()`に変更してみたが、速くはならなかった。

### PORTB > 宣言なし

Arduino IDEでESP8266のコードに `PORTB`を以下のように使おうとしたが、`PORTBは見つかりません`となった。

```
PORTB |= B10000;
```

PORTBを使っているコードは AVR/io.h をincludeしているなどで、こちらで同じものを探したが見つかっていない。

### GPOS, GPOC レジスタ?

別途、digitalWrite()が遅い（複数の処理をしているため)という情報があったので、digitalWrite()の中身を見た。

[esp8266_wiring_digital.c](https://github.com/sandeepmistry/esp8266-Arduino/blob/master/esp8266com/esp8266/cores/esp8266/core_esp8266_wiring_digital.c)

上記の中で 
`extern void ICACHE_RAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) {`
にて複数のifやelseなどを使っているのが遅いのだろうか、と疑問に思った。

見ていると GPOS, GPOC というレジスタ？に値を設定しているようだ。

- GPOS : おそらくset
- GPOC : おそらくclear

`GPOS = (1 << 4);`のように使うとIO4のピンがHighレベルとなり、`GPOC = (1 << 4);`のようにするとLowレベルとなった。

これらをdigitalWrite()と組合せて試したが、速くはならなかった。

移植性を考えると、GPOS, GPOCを使うよりは digitalWrite()を使っておくほうがやはりいい。
技術英語 > migratory birds / resident birds

@ LOE > November 30, 2012

http://loe.org/shows/shows.html?programID=12-P13-00048
> migratory birds, resident birds, 

migratory birds の方はすでに覚えていた。
resident birds は今回初めて意識した。

これらの用語が技術者同士の会話の中で出てくるかどうかは不明だが覚えておこう。

WATARIDORI という映画があって、その撮影技術の話などはいいかもしれない。その時には migratory birds という用語は使うだろう。

WATARIDORIを知っているか訊いて、知っていたら、今の最新技術でどう撮影するか、という話の流れにする。

<hr>
(追記)
WATARIDORIという映画タイトルは海外では「Winged_Migration」だった。
https://en.wikipedia.org/wiki/Winged_Migration

違和感があったが、やはり。
AndroidでCustomViewGroupを作るときMarginLayoutParamsのClassCastExceptionで落ちる

## まず解決策

```java:CustomViewGroup.java
    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new MarginLayoutParams(getContext(), attrs);
    }

    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    }
```

これを書き忘れると落ちる。

## てかonMeasuer()とonLayout()の書き方ようわからんわって人は

これが超参考になります。
http://lucasr.org/2014/05/12/custom-layouts-on-android/

あとAndroid界の女帝yanzamさんのこれも、画面回転時に保持したい変数をどう扱えば良いか書いてくれてるんで参考になります。
http://www.slideshare.net/yanzm/droid-kaigi2015-yanzm
僕はこれ読んでCustomView作らねばと思い、標題の件でハマった次第です。
ググると、LinearLayoutのLayoutParamsとRelativeLayoutのLayoutParamsが全然別クラスでClassCastExceptionで落ちるよ〜みたいなのばかり出てきて、肝心のこの情報になかなか行き着けなくて苦労しました。

暇できたらViewGroupのサブクラスの書き方など詳しく書きます。
Playプロジェクトをapache上にデプロイするための備忘録


自分用のメモ
誰かの参考になれば

## GitHub上にあったやつを使う
[play2-war-plugin](https://github.com/play2war/play2-war-plugin)を使った

|version|Tomcat ver|
|:---:|:---:|
|Servlet 3.0|Tomcat 7|

## playでの記述

```scala:APP_HOME/project/plugins.sbt
resolvers += Resolver.url(
  "bintray-sbt-plugin-releases",
   url("http://dl.bintray.com/content/sbt/sbt-plugin-releases"))(
       Resolver.ivyStylePatterns)

addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "1.3-beta3")
```

```scala:build.sbt
...
import ... // other imports
import com.github.play2war.plugin._
...

version := "1.0-SNAPSHOT"
...
Play2WarPlugin.play2WarSettings

Play2WarKeys.servletVersion := "3.0"
```

## war作成

`activator war`

`APP_HOME/target`配下にwarファイルができる

これをApp名にリネーム

あとは通常のwarのデプロイと一緒

## おまけ
アプリケーションルートの設定をしておいた方がいいと思います

```scala:conf/application.conf
...
application.context=/my-app/
...
```
単一責任の原則（SRP）

<div class="alert alert-info text-center">この記事は <a href="http://amzn.to/1QmyJ4h">アジャイルソフトウェア開発の奥義 第8章 </a> の劣化版まとめです</div>

**Single Responsibility Principle（単一責任の原則）**は、Tom DeMarco の [Structured Analysis and Systems Specification](http://www.amazon.com/dp/0138543801) と、Meilir Page-Jones の [The Practical Guide to Structured Systems Design](http://www.amazon.com/dp/0136907695) で説明されている。この原則は次のようなものだ。

> クラスを変更する理由は複数存在してはいけない

## なぜこうする必要があるのか？

　役割が単一なクラスの仕様要求が変化した場合、その変更部分は浮き彫りになり、どのように変化したのかわかりやすい。これは、ほとんどの人が納得するはなしではないだろうか。

　しかし、役割が複数あると、その1つ1つが変更理由になってしまう。複数の変更理由によってクラスが変更されると、変更部分がぼやけてしまう。また、ある理由により変更した部分が、他の役割に影響してしまい、連鎖的に変更が必要になるなどといったケースが生じうる。これは **もろい設計** にあてはまる。もろい設計がソフトウェア開発にどんな影響を及ぼすかは、[前に書いた記事](http://53ningen.com/agile-design/)を参照されたい。

## 役割とはなにか？

　「役割＝変更理由」と定義している。この判断が非常に難しいケースも多々有る。

> 変更の理由が変更の理由たるのは、実際に変更の理由が生じた場合だけである

　変化の兆候がないのにSRPを含めた原則を適用するのは賢明ではない。原則を適用することを目的にするのはナンセンスである。

 
>  結合している役割を見つけそれらを分離する作業は、ソフトウェア設計の本質である

　非常に身にしみる言葉。

## どのように分離するのか

たとえば、次のようなモデムインターフェースを考える。

```
interface Modem {
    public void dial(String pno);
    public void hangup();
    public void send(char c);
    public char recv();
}
```

　最初の2つのメソッドは接続の開始と終了、すなわち接続管理の機能を持つ。後半の2つのメソッドはメッセージのやりとりに用いる。この2つの役割を分離すべきかどうかは今後このアプリケーションがどのように変更されるか次第。たとえば接続管理の機能が影響を受けるような変更がはいる場合は、`send` と `recv` のみを呼び出しているクラスをリコンパイル、リロードしなおさなければならない。もっとも単純にこの状態から打破するには、以下のように分離すればよい。ModelImplはその場しのぎではあるが、すべての依存関係が解消しているはずだ。

![oymhIIrAIqnELN19B4bqpaZCoqlDKQZcqbOeJirBqR1ApaWiqWJoYbAJopGqkMgvk3BXEfppWOgJIpBpyy0QKZ8JSpGAylAj589BYZBpqa7QWEQbbnP0D29RO5EZgwlWcv-IckkPMv2Zm8La59eS0000.png](https://qiita-image-store.s3.amazonaws.com/0/56771/00e5b7ed-fb6b-83da-fe03-af8bf20977f1.png)


　テスト主導の開発方法に従えば、設計に怪しい兆しが現れる前に、複雑な役割を持ったクラスは分離されるはずだ。なぜならば、複雑な役割をもったクラスのテストを書くのは非常に難しいからだ。しかしそれでもなお、「硬さ」や「もろさ」を感じる場合には `Facade` や `Proxy` などを使ってリファクタリングするとよいそうだ。

## 余談

　アジャイル開発の奥義を読むまでは、SRPの名前からして、なぜ「クラスの役割は複数存在してはいけない」という原則ではないのかという疑問を持っていた。読んだ結果自分なりには、「変更」という観点に立ったときにはじめて「役割」ごとに分離する必要がでてくるから、「クラスを変更する理由は複数存在してはいけない」と主張しているのではないかと思った。

　たしかに役割は1つのほうが、見通しがよいかもしれないが、複雑にはなる。変更がとうてい生じないような場所に関して、無駄に分離してコードを複雑にする必要がないという意味を込めたい場合、たしかに「クラスを変更する理由は複数存在してはいけない」のほうがよい言葉だと感じた。この解釈自体は、完全に自分が読んだ感想なので、なにか間違っているなどの指摘がある方はコメントいただけるとありがたい。
playframework で main.scala.html に渡すパラメータを追加する方法

知っている人には常識なのかもしれないけど知らなくてかなりハマった playframework 2.4 で main.scala.html に渡すパラメータを増やす方法。もっとスマートな方法を知っている人がいたら補足ください。

## デフォルト値を指定して呼び出し互換性を保つこと!

main.scala.html は `<html>`〜`</html>` を既述してサイト全体で共通化されたレイアウトを実装する目的で使われます。要はここでヘッダやフッタ、左右のカラムなどが配置するわけですが、状況によってそれらの一部を変更したいことがしばしばあります。例えば「ログイン中であれば右上にログアウトボタンを出す」などですね。

この場合、単純に main.scala.html のパラメータを増やすだけではエラーになってしまいます。

```main.scala.html
@(title: String, uid:Option[String])(content: Html)
```

![Compilation error](https://qiita-image-store.s3.amazonaws.com/0/2287/f38835a6-850e-f83a-3882-fe5f5e7031a1.png)

`@main()` に新しく追加した UID を渡しているにも関わらず:

>not enough arguments for method apply: (title: String, uid: Option[String])(content: play.twirl.api.Html)play.twirl.api.HtmlFormat.Appendable in class main. Unspecified value parameter uid.

と出力されています。エラーの指摘場所も宣言部分に見えますね。

これは以下のように追加分のパラメータにデフォルト値を定義することで回避することができます。

```main.scala.html
@(title: String, uid:Option[String] = None)(content: Html)
```

この挙動からの憶測になりますが、playframework はエラーページの表示などの目的で内部的に `main.scala.html` を参照しているため、パラメータ追加の変更に耐えられないのが原因なんだろうと思います。なのでデフォルト値を指定して呼び出し互換性を維持してやらないといけないんでしょうね。

しかしこの手の TIP はドキュメントのどこに書いてあるんだろ…
Bitbucketの導入手順

# 環境
1. os mac
1. バージョン管理は git
1. gitはすでにインストールされていること
1. proxyサーバ等の設定でsshのポートが塞がれていないこと

# Bitbucketとはなにか、gitHubとどう違うのか
課金の方式が違う
gitHubはプライベートな利用は有料、公開は無料
Bitbucketは少人数は無料、チーム規模が大きくなると有料
となる

利用するチームの状況に応じて上記の論点で判断できる

# 手順

## 公開鍵の登録
### 端末の公開鍵を取得
鍵の作成は例えば以下等が参考になります
http://qiita.com/shizuma/items/2b2f873a0034839e47ce

公開鍵をcatコマンドでそのまま表示できるようにしておきます

```
cat ~/.ssh/id_rsa.pub
```

### Bitbucketへの鍵の登録
まず右上のアイコンからプロファイルを表示
![スクリーンショット 2016-02-07 1.59.50.png](https://qiita-image-store.s3.amazonaws.com/0/57455/381de95e-729f-3d11-1eba-f1e74a7a4a56.png)

![スクリーンショット 2016-02-07 2.03.03.png](https://qiita-image-store.s3.amazonaws.com/0/57455/455ce89b-224f-f631-3c07-319a932e4131.png)
右にある***Bitbucket settings***を選択します
![スクリーンショット 2016-02-07 1.59.50.png](https://qiita-image-store.s3.amazonaws.com/0/57455/0157d303-47f6-7258-79e3-dc47314e0e51.png)

セキュリティのSSHキーを選択します
![スクリーンショット 2016-02-07 2.04.43.png](https://qiita-image-store.s3.amazonaws.com/0/57455/0ce9c9df-b092-3a93-ff14-9d1efbcd04b1.png)
キーの追加を押下し、キーの追加画面を開きます。
![スクリーンショット 2016-02-07 2.05.02.png](https://qiita-image-store.s3.amazonaws.com/0/57455/43af799d-877a-acdc-07a4-1ebc706970be.png)

ここへ、任意のラベル名と、先ほどのキーになる文字列を貼り付け、登録を行うと、この端末からの鍵認証ができるようになります。





![スクリーンショット 2016-02-07 2.13.12.png](https://qiita-image-store.s3.amazonaws.com/0/57455/79a8c865-2d8b-9b82-f6c2-ecd967003ae4.png)


## プロジェクトの作成
リポジトリを先に作ってしまい、プッシュすることも可能ですが、
今回はbitbucket上でプロジェクトを作成してしまい、
ローカルへクローンして、そこからプッシュします

***Project***を選択し、プロジェクト作成画面から、プロジェクトを作成します。
![スクリーンショット 2016-02-07 2.16.17.png](https://qiita-image-store.s3.amazonaws.com/0/57455/54a22ccb-5166-6dfc-43fc-7c4b8020184b.png)

## リポジトリの作成
プロジェクトからリポジトリを新規作成します。

新規のリポジトリ名称を設定する。
プライベートに利用する場合は
アクセスレベルに***これは非公開リポジトリです***
を設定する

## クローン
リポジトリから今回作成したリポジトリに入り、
左側のツールバーから、クローンを選択します
![スクリーンショット 2016-02-07 2.22.58.png](https://qiita-image-store.s3.amazonaws.com/0/57455/b4edd8f9-4486-000b-223f-e5bc4c3b5025.png)

gitのコマンドがすでに表示されているので、
ローカル上で今回の開発で使うプロジェクト用のディレクトリへ入り、実行します。
![スクリーンショット 2016-02-07 2.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/57455/08c21788-0999-6ee2-04a9-4a25ef50f728.png)

```
$git clone git@bitbucket.org:yukihigasi/higasinakano_base_2.git
Cloning into 'higasinakano_base_2'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
```
以下のような感じで、端末へクローンされてきます。
![スクリーンショット 2016-02-07 2.35.18.png](https://qiita-image-store.s3.amazonaws.com/0/57455/cf89655c-3246-d435-fb78-f34f7d3a7afb.png)



## 初回コミット
試しに、以下のようなファイルを作ってみてみます

```
$ vim test.html
first test

```

以下のコマンドで配下のすべてののファイルをステージングし、
メッセージに test commit　というコメントをつけ、コミットをします

```
$git add -A
$git commit -m "test commit"

```

## プッシュ

```
git push
```

コマンドでローカルからBitbucketへプッシュされます


## Bitbucket上からのソースの確認

Bitbucketから確認してみます
リポジトリの左側ツールバーのノートマークを選択すると、
![スクリーンショット 2016-02-07 2.47.30.png](https://qiita-image-store.s3.amazonaws.com/0/57455/b3c1c208-7c8c-f913-1ac6-a71499c4dd8f.png)
test.htmlが追加されているのがわかります。

![スクリーンショット 2016-02-07 2.47.44.png](https://qiita-image-store.s3.amazonaws.com/0/57455/65e603ad-5077-e786-a1e0-e27d15ccd436.png)

以上で、Bitbucketとローカルの連携ができました。

# 参考
http://railstutorial.jp/chapters/beginning?version=4.2#sec-bitbucket
白黒画像の色反転 > ペイントブラシ使用

# コマンドラインの画像色の反転
レポートでスクショをとった後に、コマンドラインの背景を白にしていなかったときのお話

まず元の画像はこんな感じ


![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/96838/ce08734e-e205-b12f-f82c-19c72f1a45c2.png)

これをペイントで開き、ctrl+Aか選択から全選択

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/c41453e6-3a5a-0917-4125-09336c6549d3.png)

そして、画像を右クリックして色の反転を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/23b5411a-1477-13cf-4ffe-a3eb872de2b0.png)

するとこんな風になります

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/24bcf59e-5129-8977-aa7f-37cb95dbc998.png)

以上終わり
TypeScriptでtsdからtypingsへ移行した後のtsconfig.json

[tsdが非推奨になった](https://github.com/DefinitelyTyped/tsd/issues/269)ので代わりに推奨されている[typings](http://github.com/typings/typings)に移行した。[typings](http://github.com/typings/typings)についてはすでに詳細な記事がQiitaでも書かれているのでこちらを見ると良い。

* [TypeScriptのtsdが非推奨になったので、typingsへ移行](http://qiita.com/ueokande/items/19bb6a22b1285622d2c7)
* [TypeScriptの型定義管理ツールTypingsについて](http://qiita.com/literalice/items/d83249a5646abcb0bec6)

本記事ではtsconfig.jsonの注意点についてだけ補足として書いておく。

# tsconfig.jsonの注意点

[tsconfig.json](https://github.com/Microsoft/TypeScript/wiki/tsconfig.json)で`exclude`を使ってビルドしている場合は、適切に設定しないと`error TS2300: Duplicate identifier`が大量に発生してしまうので注意。原因は、[typings](http://github.com/typings/typings)で型定義をインストールすると、`typings/browser/...`と`typings/main/...`にそれぞれ型定義がインストールされるため、二重に自動的に読み込まれて`Duplicate identifier`となってしまうのである。

解決策としては[typingsのREADME](https://github.com/typings/typings#maindts-and-browserdts)に書かれているとおり、`exclude`で使わない方の型定義を除外してやればOK。例えばフロントエンド向けの開発の場合は、`typings/browser.d.ts`の使用を推奨とあるので、下記のように`exclude`設定に`typings/main.d.ts`、`typings/main`を新たに追加してやれば良い。

```json:tsconfig.json
{
    "compilerOptions": {
        ...
    },
    "exclude": [
        "typings/main.d.ts",
        "typings/main",
        "node_modules"
    ]
}
```

また、[tsconfig.json](https://github.com/Microsoft/TypeScript/wiki/tsconfig.json)で`exclude`ではなく`files`を使っている場合は、逆に`files`に使う方の型定義を指定すれば良い。

```json:tsconfig.json
{
    "compilerOptions": {
        ...
    },
    "files": [
        "typings/browser.d.ts",
        ...
    ]
}
```
botkitでfileごとにプラグインを管理する

hubotと違って、botkitではプラグイン機能が提供されてないので、使う側でプラグインをrequireする必要がある。
以下、`plugins`ディレクトリにある`hello.js`を読み込むサンプル。
`controller`をプラグイン側に渡してやればよい。

```js:index.js
'use strict';
const botkit = require('botkit');
const fs = require('fs');
const path = require('path');

const controller = botkit.slackbot({debug: false});

controller.spawn({token: process.env.SLACK_TOKEN}).startRTM();

const pluginsPath = path.resolve(__dirname, 'plugins');
fs.readdir(pluginsPath, (err, list) => {
	for (const file of list) {
		const pluginPath = path.resolve(pluginsPath, file);
		require(pluginPath)(controller);
	}
});
```

```js:hello.js
'use strict';
module.exports = controller => {
	controller.hears('hello', ['direct_message', 'direct_mention', 'mention'], (bot, message) => {
		bot.reply(message, 'Hello!');
	});
};
```
CocoaPodsの導入と利用

Swift2を勉強中なので備忘録備忘録。
開発を進めていく上でライブラリの利用は必要不可欠ですよね。
iOSアプリ開発においては、CocoaPodsというライブラリ管理ツールを利用するのが定番中の定番みたいです。
ということで今回はその導入、そして利用まで進めていきます。
# 動作環境
- OS X El Capitan(10.11.2)
- Xcode 7.2
- Swift 2

# インストール手順
ターミナル開いて以下のコマンドを実行しましょう。
まずはインストール

```
$ sudo gem install cocoapods
```

そしてセットアップ

```
$ pod setup
```

これで完了。とっても簡単です。

# 使ってみる
## プロジェクトへのCocoaPods導入
インストールは終わったものの、プロジェクトで利用するにはまだ下準備が必要です。
それではターミナル上でプロジェクトフォルダ（xcodeprojファイルがある場所）へ移動しましょう。
そこで下記のコマンドを実行してくだい。

```
$ pod init
```
さすれば、ディレクトリ内に `Podfile` が作成されていることでしょう。

## CocoaPodsを使ってライブラリの導入
 `Podfile` を開くとこのような内容になっています。

```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '8.0'
# Uncomment this line if you're using Swift
# use_frameworks!

target 'testCocoa' do

end
```

これを以下のように編集して、導入したいライブラリを以下のように追記しましょう。
（２行のコメントアウト解除も忘れずに！）

```Podfile
# Uncomment this line to define a global platform for your project
platform :ios, '8.0'
# Uncomment this line if you're using Swift
use_frameworks!

target 'testCocoa' do
	pod 'SwiftyJSON', :git=> 'https://github.com/SwiftyJSON/SwiftyJSON'
end
```

今回はJSONを扱うためには必須とも言えるライブラリ、
SwiftyJSONを例にしてみました。
他にもたくさんライブラリがあるので、[公式サイト](https://cocoapods.org/)で検索してみるのもいいのではないでしょうか。
ここにのってるのは大概 [本家の方](https://github.com/SwiftyJSON/SwiftyJSON#integration)にも記述のしかたについて載ってると思います。

ここで本題に戻りますが、編集が終わったら以下のコマンドでインストールしましょう。

```
$ pod install
```

ちなみに、このインストールが永遠に終わらないこともあったりなかったり。
（当方は前者）
以下のコマンドで治ると思われます。もしこんな症状になったら試してみましょう。


```
$ pod repo remove master
$ pod setup
$ pod install
```

インストールが成功したら、プロジェクトディレクトリに
`testCocoa.xcworkspace`が生成されます。
要は、`<プロジェクト名>.xcworkspace` ってことですね。
これを開くと、いつも通りにプロジェクトが開けて編集できます。
ここで重要なのは、
**今後は生成されたxcworkspaceを開いて編集していかなければならない**ということです。
xcodeprojファイルから開くと**ライブラリは利用できない**のでお気をつけて…
<br />それではxcworkspaceを開きましょう！

## Xcode上での下準備
このように、適当にディレクトリを展開していくと、
Podsが、SwiftyJSONが導入されていますね。成功です。

![スクリーンショット 2016-02-07 00.58.41.png](https://qiita-image-store.s3.amazonaws.com/0/36573/2d9c440b-10b0-f151-a8ef-3c829950c757.png)

ここで早速、swiftファイルに import …　とやりたくなりますが、
一旦抑えて `Command + B` でビルドしましょう。
さもなければ…
![スクリーンショット 2016-02-07 01.03.39.png](https://qiita-image-store.s3.amazonaws.com/0/36573/4447bd92-9db1-beb6-6c31-63b758a840dd.png)

このように、怒られてしまいます。
(ビルドが必須なのを知らず、これでかなりの時間を浪費しました…)
気持よくビルドした後は余裕のコード補完。

![スクリーンショット 2016-02-07 01.09.58.png](https://qiita-image-store.s3.amazonaws.com/0/36573/0c7cdd7c-4a85-4da3-3b88-7c330a7e5c2c.png)

…胸がすく思いですね。
以上でCocoaPodsの導入、利用については終わり！
お疲れ様でした！

# 参考サイト様
[iOSライブラリ管理ツール「CocoaPods」の使用方法](http://qiita.com/satoken0417/items/479bcdf91cff2634ffb1)
[pod installが永遠に終わらない | 秋山ブログ](http://d.akiroom.com/2015-08/pod-install-forever/)
SSHからRaspberry piでGUIを操作する方法

## SSHのX11 Forwardingを使う
ラズパイを使っているとなるべく画面とかコードを付けたくありません。
なので、基本はmacとかから繋いでコマンドラインによる操作になります。

しかし、カメラを繋いで画像処理をする、みたいなときにはGUIで確認したい必要性が生まれます。
その時の選択肢

- ディスプレイ接続（コードがいろいろ辛い）
- VNC (tightserverとか)（非力なラズパイで重い）
- X11 Forwarding（悪くない）

この中で自分が一番いいと思ったのは、X11 ForwardingしてPC上でGUIを表示する方法でした。
しかし[X11](http://www.wikiwand.com/ja/X_Window_System)が自分の年とほぼ同じとは。。。知らなかった。

## HOW
- MacでX11サーバを立てる。
  - XQuartzを入れる＆XQuartzを起動
  - 普通に[XQuartz](http://www.xquartz.org/)を入れる
  - これがMac上で動くX11サーバになる
- `SSH -X`でラズパイに接続
    - X11を使うときにフォワードしてくれる
- raspi上でGUIを実行
    - emacsとか、PythonのOpenCV使ったプログラムとかのウィンドウが表示される
    - :smile: 
- デスクトップ環境も飛ばしたければ
    - raspi上で`lxsession&`
    - 軽量デスクトップマネージャが起動

## Prerequisites
- ラズパイにはraspbian OSが入っていると仮定
- 必要だったらアップデートしておく。`sudo apt-get update`
underscoreコードリーディング（values）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##valuesとは


###[underscorejs.orgのvalues](http://underscorejs.org/#values)

こんな説明。
>####_.values(object) 
Return all of the values of the object's own properties.


```javascript
_.values({one: 1, two: 2, three: 3});
=> [1, 2, 3]
```
------------- 
objectのプロパティのすべてのvalueを返します。

###[underscore.compose](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L948)
コード的にはこのあたり。

```javascript
  // Retrieve the values of an object's properties.
  _.values = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[keys[i]];
    }
    return values;
  };
```

_.keysを用いてobjのkeyの配列をkeysに格納する。
keysの長さをlengthに格納する。
valuesにlengthの長さ分の配列を作って入れる。
lengthまでの長さだけfor分を回し、keysのi番目のkeyを元にobjのvalueをi番目のvaluesに格納する
valuesを返す。
Parse Server - Heroku ディプロイ編

MBaasのParseが2017年1月28日をもってサービスを終了することになりましたね。ただし、App側のSDKに加えバックエンドのParse Serverもオープンソース化されましたので、[ミグレーションガイド](https://parse.com/docs/server/guide#migrating)に従い自前でサーバーを立てれば、サービス終了後も自力で継続することは可能です。細かいところはミグレーションガイドを参照していただくとして、稼働中のデータ移行を除けば、Paas/IaaSなどでサーバーを立てアプリ側をそちらにアクセスするように設定を切り替えるだけで作業は完了です。

とりあえずサンプルのParse Serverを敷居も低く無料で始められるHerokuへディプロイしてみたので、いくつか気付いたことを載せておきます。

# 1. Parse Server Example ディプロイ

息込んで書き始めてしまいましたが、[Github](https://github.com/ParsePlatform/parse-server-example)ページにある"Deploy to Heroku"ボタンをクリックして指示に従うのみで、[Deploying a Parse Server to Heroku](https://devcenter.heroku.com/articles/deploying-a-parse-server-to-heroku)の記載の通りです。サンプルといいつつ、自分のアプリ向けにいっさい手を加えずそのまま使えます。ちなみに1アプリにつき1サーバー立てる感じです。curlを投げてresultが返って来ればおk。

# 2. アプリ側でサーバー設定

普通にParseのバックエンドを利用していたアプリを、明示的にサーバーを指定するように変更します。

```swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    ...

    // Parse.setApplicationId("YourParseApplicationId", clientKey: "YourParseClientKey")
    Parse.initializeWithConfiguration(ParseClientConfiguration { configuration in
        configuration.applicationId = "YourParseApplicationId"
        configuration.clientKey = "YourParseClientKey"
        configuration.server = "https://your-parse-server.herokuapp.com/parse"
    })
    ...
}
```

ちなみに、ParseClientConfigurationクラスでサーバー指定がコミットされたのは今年に入ってからなので、SDKは最新版でないと対応していないと思います。V4にまつわるもろもろを先延ばしにしていたアプリの場合、まずはSDKのバージョンアップ対応からですね。

いくつか問題がでて対処しましたので、参考までに載せておきます。

## Facebookログインに失敗する。

```
[Error]: Facebook auth is not configured. (Code: 101, Version: 1.12.0)
```

Heroku側にもFacebookAppIDを設定する必要があります。

```
heroku config:set FACEBOOK_APP_ID=your-facebook-app-id --app your-heroku-app-name
```

http://stackoverflow.com/questions/35096737/error-using-facebook-login-with-parse-server

## PFUserのサブクラスが登録されていない。

```
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'The class YourUserSubClass must be registered with registerSubclass before using Parse.'
```
今風のSubclassはNSObject#initialize()をオーバーライドしていて問題ないと思いますが、PFUserのSubclassはGuideに記述もなく実行しても怒られることもなかったのでregisterSubclassしてませんでした。自分は古風にdidFinishLaunchingWithOptionsでYourUserSubClass.registerSubclass()を呼びましたが、以下でよいと思います。

```swift:
override class func initialize() {
    struct Static {
      static var onceToken : dispatch_once_t = 0;
    }
    dispatch_once(&Static.onceToken) {
      self.registerSubclass()
    }
}
```
https://www.parse.com/questions/subclassing-pfuser-trouble
FileZillaのMacでの設定方法

<p>macにfilezillaを設定したので覚え書き。</p>
<ol>
<li>filezilaをインストール</li>
<li>macのアプリケーションへ追加</li>
<li>filezilla設定</li>
</ol>
<p>1はまあインストールするだけだから簡単なんやけど、2で少し詰まった。
filezillaのappを開こうとしても、警告のダイアログが出て、</p>
<blockquote>
<p>このappは壊れているため開けません。ゴミ箱に入れる必要があります。</p>
</blockquote>
<p>みたいな表示がされてしまった。</p>
<p>何度かインストールを繰り返してみても、結果は同じだったので、調べてみると、mac側のセキュリティが強いので（たぶんYosemiteになってから強化されたと感じる）よくわからないappは受け付けないのか慎重な感じだった。
そこで、調べてやってみた方法</p>
<p>macのリンゴマークの「システム環境設定」→「セキュリティとプライバシー」→「一般」→鍵マーク開ける→ダウンロードしたアプリケーションの実行許可：を「Mac App Storeと確認済みの開発元からのアプリケーションを許可」から『すべてのアプリケーションを許可』にチェックを変更</p>
<p>filezillaをこれで開くことができる。
開いたあとは、さっきのシステム環境設定のセキュリティの設定を元のものに戻しておく。</p>
<p>appを開く完了。</p>
<p>3.filezillaの設定</p>
<p>左上のサーバー(?)のアイコンをクリック→ダイアログボックス表示→左側のNew Siteをクリック→新しいサイトができるので任意の名前を設定</p>
<p>今回設定した内容</p>
<p><strong>タブGeneral</strong></p>
<blockquote>
<p>Host: ホスト名
Plotocol: FTP - File Transfer Protocol<br>
Encryption: Use explicit FTP over TLS if available</p>
<p>Logon Type: Normal<br>
User: ユーザ名
Passwoed: パスワード</p>
</blockquote>
<p>(Logon Type: Normal はパスワードをfilezillaが記憶してくれるそうだ。その分セキュリティに注意ってことなんだけど、今回はこれで)</p>
<p>これでConnentを押して、サーバーにつながれば成功。</p>
<p>そのあと、</p>
<p><strong>タブ　Advanced</strong></p>
<blockquote>
<p>Default local directory:
自分が参照したいフォルダを参照</p>
</blockquote>
<p>で自分がデータをUPするフォルダを設定する。
実際にサーバーに上げてみて、実際にWeb上で確認できれば完了。</p>
<p>以上、filezilla覚え書き。</p>
borderColorをアニメーションさせる CATransaction



`UIView`の`backgroundColor`などのプロパティは`UIView`のクラスメソッド`+animateWithDuration:animations:`でアニメーションが可能です。

しかし`CALayer`のプロパティ`borderColor`は上記メソッドでは変化しないので、別法でアニメーションさせます。


## Swift
```swift
let view = UIView.init(frame: CGRectMake(0, 0, 100, 100))
self.view.addSubview(view)
view.layer.borderColor = UIColor.blackColor().CGColor
view.layer.borderWidth = 10.0
view.layer.cornerRadius = 50.0

CATransaction.begin()
// borderColorを指定
let borderColorAnimation = CABasicAnimation.init(keyPath: "borderColor")
// 開始時の色
borderColorAnimation.fromValue = UIColor.blackColor().CGColor
// 終了時の色
borderColorAnimation.toValue = UIColor.greenColor().CGColor
// アニメーションの持続時間
borderColorAnimation.duration = 5.0
// アニメーションのカーブ
borderColorAnimation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseOut)
// 完了後にリセットされないようにする (デフォルトはkCAFillModeRemoved)
borderColorAnimation.fillMode = kCAFillModeForwards
borderColorAnimation.removedOnCompletion = false
// アニメーション完了時  (※ addAnimationの前に記述しないといけない)
CATransaction.setCompletionBlock { () -> Void in
    
}
// ターゲットへ設定、任意のアニメーション名をつける
view.layer.addAnimation(borderColorAnimation, forKey: "borderColorAnimation1")
CATransaction.commit()
```

## Objective-C
```objc
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[self.view addSubview:view];
view.layer.borderColor = [UIColor clearColor].CGColor;
view.layer.borderWidth = 10.0f;
view.layer.cornerRadius = 50.0f;

[CATransaction begin]; {
    // borderColorを指定
    CABasicAnimation *borderColorAnimation = [CABasicAnimation animationWithKeyPath:@"borderColor"];
    // 開始時の色
    borderColorAnimation.fromValue = (__bridge id)[UIColor clearColor].CGColor;
    // 終了時の色
    borderColorAnimation.toValue   = (__bridge id)[UIColor redColor].CGColor ;
    // アニメーションの持続時間
    borderColorAnimation.duration = 3.0;
    // アニメーションのカーブ
    borderColorAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    // 完了後にリセットされないようにする (デフォルトはkCAFillModeRemoved)
    borderColorAnimation.fillMode = kCAFillModeForwards;
    borderColorAnimation.removedOnCompletion = NO;
    // アニメーション完了時  (※ addAnimationの前に記述しないといけない)
    [CATransaction setCompletionBlock:^{
        
    }];
    // ターゲットへ設定、任意のアニメーション名をつける
    [view.layer addAnimation:borderColorAnimation forKey:@"borderColorAnimation5"];
} [CATransaction commit];
```

## 参考
Facebookが開発・メンテナンスをしている`pop`というアニメーションライブラリもおすすめです。

:link: [facebook / pop](https://github.com/facebook/pop)
:link: [CATransaction](https://developer.apple.com/library/prerelease/ios/documentation/GraphicsImaging/Reference/CATransaction_class/index.html)
guard varという書き方は文法的に大丈夫っぽい

guardとオプショナルバインディングを行うというと`guard let`というイメージが強かったのですが、`guard var`という書き方もできるようです。

```swift
var hoge: String? = "hoge"
hoge = "hogehoge"
print(hoge)
# => Optional("hogehoge")
        
guard var str = hoge else {
  return
}
print(str)
# => hogehoge

str = "String"
print(str)
# => String
```

[The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)の中でも`guard var`という書き方をしている部分があるので、この書き方は大丈夫なのではないかと思われます。
Hoge.order(Hoge.arel_table[:created_at]).last が効かない件

```rb
Hoge.order(Hoge.arel_table[:created_at]).last # => created_at でソートして、最後のレコードが欲しい
```

上記のコードは、最後に作成されたレコードを1件取得して欲しい、と思って書いたのですが、
予想に反して結果は最新のレコードが1件取得されます。

出力されたSQLを見てみると、`created_at desc` が抜けています。

```sql
SELECT 
  `hoges`.* 
FROM 
  `hoges` 
ORDER BY 
  `hoges`.`created_at` 
LIMIT 1
```

先ほどのコードに`.asc`を付けると上手く動作しました。

```diff
- Hoge.order(Hoge.arel_table[:created_at]    ).last # => NG
+ Hoge.order(Hoge.arel_table[:created_at].asc).last # => OK
```

出力されたSQLも正しくなっています。

```sql
SELECT 
  `hoges`.* 
FROM 
  `hoges` 
ORDER BY 
  `hoges`.`created_at` DESC 
LIMIT 1
```

SQLを書く時の習慣で`ASC`は省略してしまいがちですが、こんな形で罠にハマるんですね。
今回の場合、降順の場合はちゃんと`Hoge.arel_table[:created_at].desc`と書いていたので、気付くことができました。
ちなみに少し古い Rails3.2 を触っているので、最新の ActiveRecord では修正されているかもしれません。
Terminalで複数サーバに一発でssh接続


Terminalのタブを複数開いて、各タブでssh接続した状況にするのを一発でやる方法です。

それぞれのサーバで、同一コマンドを実行させたいのであれば別のやり方がありますが、今回の方法は各サーバで別々の作業をしたいときなどに便利です。

まず、Terminalで新規タブを開いて、そのタブでコマンドを実行するApple Scriptを用意します。Terminal以外でもカスタマイズしたらできそうです。

```newtab.scpt
#!/usr/bin/osascript
on run argv
   # open new tab in terminal
   tell application "System Events"
      tell process "Terminal" to keystroke "t" using command down
   end tell

   delay 1

   # execute command in new tab
   tell application "Terminal"
      activate
      repeat with execCmd in argv
         do script with command execCmd in selected tab of the front window
      end repeat
   end tell
end run
```

続いて、一発で複数実行するためにスクリプトを書きます。
server001 server002 server003 といったように連番になっている場合は、以下のようにするといいかと思います。
サーバ名が連番ではない場合は、forループは使わず、愚直に一つずつ書くといいでしょう。

```Bash:sshonce.sh
#!/bin/bash
for no in `seq 1 3`; do
   number=`printf "%03d" ${no}`
   osascript newtab.scpt "ssh server"${number}
done
```

そして実行すると、Terminal のタブが一つずつ開いて、それぞれのサーバにssh接続します。実行中は触らないように注意です！

```Bash
$ ./sshonce.sh
```
Pythonによる一般化線形モデル（GLM）入門


## 一般化線形モデルとは

一般化線形モデルとは線形回帰やポアソン回帰、ロジスティック回帰などの、説明変数(x)によって応答変数(y)を説明する統計モデルの総称です。
さらに具体的に言うと、確率分布、線形予測子、リンク関数によって決まる統計モデルのことです。

### 確率分布

応答変数が従う確率分布です。
カウントデータなどの離散データを扱うためには、`二項分布`や`ポアソン分布`がよく使われます。
株価などの連続量を表す連続データを扱うためには、`正規分布`や`ガンマ分布`がよく使われます。

### 線形予測子

説明変数の一次結合で表されるモデル式のことです。
どの説明変数を使用するかであったり、どの交互作用項（説明変数の積で表される項）を使用するかを指定することができます。

```math
z = β_0 + β_{1}x_{1} + β_{2}x_{2}
```

### リンク関数

式を変換して線形予測子に対応させる関数のことです。
リンク関数のおかげで値が０から１しか取ることのできない確率も線形予測子に対応させることができます。
分布によって使うリンク関数はある程度決まっているので、詳しく知りたい人は記事下の参考にあるリンク先の書籍を参照してください。

```math
log(y) = β_0 + β_{1}x_{1} + β_{2}x_{2}
```

## Pythonでの実装

一般化線形モデルはRの`glm関数`を使えば簡単に実行することができます。
しかしながら、

* R使いたくないよ
* Pythonでやりたいよ

という人も多いと思うので、Pythonでやってみます。
探してみると、`statsmodels`というRの`glm関数`のようなモジュールがありました。

### モジュールのインストール

```
$ pip install statsmodels
$ pip install patsy # statsmodelsをimportしたら必要と言われたのでインストールしておく
$ pip install pandas # データ加工のためにインストールしておく
```

### データ取得してモデリング

```Python
import statsmodels.api as sm
import pandas as pd

# 下の参考URLにあるデータを読み込み
data3a = pd.read_csv("http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/poisson/data3a.csv")
# 変数xと定数項による線形予測子を作成
data3a.x_c = sm.add_constant(data3a.x)

# 分布はポアソン分布、リンク関数は対数リンク関数の一般化線形モデルを作成
# ポアソン分布の場合はデフォルトで対数リンク関数が指定される
model = sm.GLM(data3a.y, data3a.x_c, family=sm.families.Poisson())
result = model.fit()

# 結果
result.summary()
```

`statsmodels`べんり！

## おわりに

線形モデルなどの統計モデルを拡張した一般化線形モデルでしたが、やはり現実の事象はこれほど簡単なモデルには落とし込むことが難しいです。
下の書籍では一般化線形モデルの発展形である一般化線形混合モデルなどの手法も説明されているので、参考にしてください。

## 参考

http://hosho.ees.hokudai.ac.jp/~kubo/ce/IwanamiBook.html

http://statsmodels.sourceforge.net/devel/glm.html
PythonでElasticsearchのReindex


## はじめに
- あるindexを作りなおしたい（=reindex）ときにBulk APIを使ってインサートするのが推奨されている。とくに本番環境とかではないので、Aliasうんたらっていうのは不要でしたので、Python APIで実施したときの調べたメモ。

## Elasticsearch
#### 確認
- Bulk で入れる前に[ElasticSearchのインデクシングを高速化する](http://kakakazuma.hatenablog.com/entry/2015/03/15/153704)を一読。とても参考になりました。
	- レプリカシャードを0に設定
	- コミットの頻度を変更
	- _allフィールドを無効化

#### 新しいIndexを作成
- 前のindexで設定し忘れたシャードの数とか、マッピングとかを正しく入れる。

```
PUT 'XXX.XXX.XXX.XXX:9200/[new index]' -d '
index :
    number_of_shards : 3
    number_of_replicas : 0
'
```

## Bulk API (Pythonで）

[Helpers](http://elasticsearch-py.readthedocs.org/en/master/helpers.html)のドキュメントを読む。と以下の感じでできそう。

```
from elasticsearch import Elasticsearch
from elasticsearch import helpers
es = Elasticsearch(host="XXX.XXX.XXX.XXX", port=9200)
helpers.reindex(es, source_index = "old-index", target_index = "new-index")
```

indexのサイズは10MBくらいずつ入れるのが推奨。下記参考より。
参考：[Elasticsearchインデクシングパフォーマンスのための考慮事項](http://qiita.com/rjkuro/items/e79eec7ffb0511b7c678)


## おわりに
- Bulk API簡単でよかったです。

## 参考
- [Helpers](http://elasticsearch-py.readthedocs.org/en/master/helpers.html)
- [Elasticsearch + Pythonでバルクインサート(helpers.bulk)](
http://symfoware.blog68.fc2.com/blog-entry-1542.html)
- [ElasticSearchのインデクシングを高速化する](http://kakakazuma.hatenablog.com/entry/2015/03/15/153704)
- [Elasticsearchインデクシングパフォーマンスのための考慮事項](http://qiita.com/rjkuro/items/e79eec7ffb0511b7c678)
[小ネタ]配列の中身が辞書型の時の宣言の仕方

ぱっと書けなかったのでメモです。

```
func getAllPath() -> Array<[String:AnyObject]> {

　　　var allPath:[[String:AnyObject]] = [[:]]
     ...
　　　return allPath
}
```

###余談
やっぱ型を厳密に指定した方が安心
Node.jsでLambdaからAuroraに接続する

# はじめに
AWS独自のSQL互換データベースのAuroraですが、
Asia Pacific 1 (Tokyo)への展開は昨年10月ということもあり、
まだまだNode.jsからRDS Auroraに接続する情報について、
日本語情報があまり見つからない状況ですので、
現時点での手順を整理しておこうと思います。

# VPCのセキュリティグループの設定

まず、大事な点はRDSは必ずVPCの中にあるということ（2016年2月時点）。
古い情報などでは、RDSをVPCの外側に置けていたようですが、
現時点ではRDSを起動する際にVPCの指定は必須となります。

以下、VPCの作業を備忘録として記録しておきますが、
あれこれ試行錯誤しながらやっていたので、手順として適切かは自身がありません。

まず、事前にVPCを作成しておく必要があります。

次にルートテーブルを作ります。
送信先「0.0.0.0/0」というセキュリティ的にアウトの設定を追加します。
ターゲットは今回対象となるVPCですね。
ここはきちんと制約かけないといけないと思いますが、
LambdaのグローバルIPが固定でないので、範囲をきちんと絞る必要がありそうです。

![2016-02-06 (9).png](https://qiita-image-store.s3.amazonaws.com/0/112407/88e4573d-24e2-19ec-9b4a-a843b8870dae.png)

さらにサブネットを作成して、ルートテーブルと関連付けます。
そして、そのVPCをインターネットから接続できるように
インターネットゲートウェイも作成します。

最後にセキュリティグループにインバンドとして「MySQL/Aurora」を
全てのアクセス元からアクセス可能なように設定します。

![2016-02-06 (10).png](https://qiita-image-store.s3.amazonaws.com/0/112407/4bdd8f62-ed1c-c236-da73-d76813869ad6.png)


これで、VPCの設定は完了です。

# RDSのセットアップ

続いてはRDS側のセットアップです。
こちらで注意するのは１点だけ、「パブリックアクセス可能」に「はい」を選択するだけ。

![2016-02-06 (11).png](https://qiita-image-store.s3.amazonaws.com/0/112407/01aa98a9-986d-ad49-1670-11069ddc335c.png)

そしたら、ローカルからSQL Clientでアクセスして、
適当なテーブルとデータを作っておきましょう。
ここらへんは特にクセはありませんでした。

# Lambda関数の実行

これでっと、Lambdaの出番です。
AuroraはSQL互換なので、mysqlモジュールを同梱してあげればアクセス可能になります。
npmでmysqlモジュールを取得して、index.jsと同じフォルダに格納して
一緒にZIP化してアップロードすればOKです。

```
npm install mysql
```

コード自体もMySQLに接続するのと何ら変わりありません。
もちろん細かなチューニング等に違いはあると思いますが、
アプリケーションの視点から見ると、さほど差異は意識しないですみそうです。
以下のサンプルではitemテーブルから全件取得しています。

```js:index.js
var mysql = require('mysql');

var conn = mysql.createConnection({
    host     : 'xxx.xxx.ap-northeast-1.rds.amazonaws.com',
    user     : 'your username',
    password : 'your password',
    port     : '3306',
    database : 'your database'
});

exports.handler = function(event, context){
    console.log('Begin Process');
    conn.connect();
    console.log('Connected');
    conn.query('select * from item;', function(err, rows, fields) {
        conn.destroy();
        context.done(null, rows);
    });
};
```

結果はごらんの通り。

```
[
  {
    "sku": "1234567890123",
    "store": "us",
    "lang": "en",
    "name": "T-Shirt",
    "price": 10
  }
]
```

RDSをVPCの外側から見れるようにするための手間が95％くらいを占めていました。
ローカルのSQLクライアントからRDSに接続できるようになってから
上記のコードを実行してみるまでの所要時間は10分もかかりませんでした。
思った以上にスムーズに導入できそうな感じです。
[小ネタ]辞書型から値を取ろうとした時に起きたエラー

久しぶりにswift触ったらなかなか解決出来なかったのでメモ。

##コード
```swift
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
       
        let array = Beat.sharedInstance.getAllPath()
        cell.textLabel?.text = array[indexPath.row]["name"] //error
        return cell
    }
```

##error内容
```
Cannot subscript a value of type '[String : AnyObject]' with an index of type 'String'
```

あれー、辞書型のアクセス方法ってこれで合ってるはずなのになぜ…と調べること数十分…

##原因
cell.textLabel?.textの型がStringなのに、辞書型の値から取り出した値がAnyObjectだったからでした。
よくよく考えれば確かに、、となったのですが型がゆるい言語を最近触っていたせいかなかなか気づけなかったです。。

##解決コード
```swift
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
       
        let array = Beat.sharedInstance.getAllPath()
        cell.textLabel?.text = array[indexPath.row]["name"] as? String
        return cell
    }
```

これでOKですね！

##余談
今思うと使う時にいちいちキャストしなきゃいけないような構造ってあんまりよくない気がしました。
単純に辞書型で返すのでなくて、オブジェクトを1個作ってプロパティでnameとかを管理したほうが
使いやすいな。。
Amazon Linux に CouchDBをインストール

Amazon Linux に CouchDB 1.6.1 をインストールした。
また、既存DBからの移行を行った。

# 参考にさせていただきました
- [Amazon LinuxにCouchDB1.6.1をインストールする方法](http://qiita.com/f-akazawa/items/80202ec152714eca26fb)
- [CouchDB - セキュリティ](http://couchdb-jp.github.io/couchdb-guide/editions/1/ja/security.html)

# 環境
- Amazon Linux AMI 2015.09.1 (HVM), SSD Volume Type - ami-383c1956
 - ssh, http, :5984 をオープン
 - 何もインストールされていない状態
- CouchDB 1.6.1

# インストール
**1.各種ライブラリを最新化**

```
sudo yum update
```
**2.epel リポジトリを有効にする**

```
sudo vi /etc/yum.repos.d/epel.repo
```
[epel] セクションのenable を 1 にする。

**3.必要なライブラリをインストール**

```
sudo yum install gcc gcc-c++ libtool libicu-devel openssl-devel autoconf-archive erlang python27 python-sphinx help2man js-devel
```
参考にした記事に、js-develを追加

**4.SpiderMonkey をインストール**

```
wget http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz
tar xvzf js185-1.0.0.tar.gz
cd js-1.8.5/js/src
./configure
sudo make
sudo make install
cd ../../../

```

**5.CouchDBをインストール**

```
wget http://ftp.jaist.ac.jp/pub/apache/couchdb/source/1.6.1/apache-couchdb-1.6.1.tar.gz
tar xvzf apache-couchdb-1.6.1.tar.gz
cd apache-couchdb-1.6.1
./configure --with-erlang=/usr/lib64/erlang/usr/include/
sudo make
sudo make install
cd ..
```

**6.iniファイルの修正**

```
sudo sed -i -e 's/;bind_address = 127\.0\.0\.1/bind_address = 0\.0\.0\.0/g' /usr/local/etc/couchdb/local.ini
sudo sed -i -e "/^\[admins\]$/a admin = xxx" /usr/local/etc/couchdb/local.ini
```
- 127.0.0.0 に bind されているのを、0.0.0.0 に変更する。（他のIPからアクセス可能にする）
- admin の id, パスを設定

**7.User と Permission の設定**

```
sudo adduser --system --home /usr/local/var/lib/couchdb -M --shell /bin/bash --comment "CouchDB" couchdb
sudo chown -R couchdb:couchdb /usr/local/etc/couchdb
sudo chown -R couchdb:couchdb /usr/local/var/lib/couchdb
sudo chown -R couchdb:couchdb /usr/local/var/log/couchdb
sudo chown -R couchdb:couchdb /usr/local/var/run/couchdb

sudo chmod 0770 /usr/local/etc/couchdb
sudo chmod 0770 /usr/local/var/lib/couchdb
sudo chmod 0770 /usr/local/var/log/couchdb
sudo chmod 0770 /usr/local/var/run/couchdb
```

**8.自動起動設定 & 起動**

```
sudo ln -s /usr/local/etc/rc.d/couchdb /etc/init.d/couchdb
sudo chkconfig --add couchdb
sudo /etc/init.d/couchdb start
```

# DBの確認
Futon という Web ベースのユーティリティツールで DB にアクセスできる。
http://xxx.xxx.xxx.xxx:5984/_utils/index.html
![スクリーンショット 2016-02-06 21.38.33.png](https://qiita-image-store.s3.amazonaws.com/0/27486/e638d519-e56c-d71f-397a-12ac3fb659c4.png)


# 起動

## 自動起動設定している場合
```
sudo /etc/init.d/couchdb start
```

## 自動起動設定していない場合
```
sudo -i -u couchdb /usr/local/bin/couchdb -b
```


# 停止
## 自動起動設定している場合
```
sudo /etc/init.d/couchdb stop
```

## 自動起動設定していない場合
```
sudo -i -u couchdb /usr/local/bin/couchdb -d
```

# 既存 DB の移行
## 移行元からのコピー
couchdb を停止し、
/usr/local/var/lib/couchdb/hoge.couch をコピーする

## 移行先へのコピー
/usr/local/var/lib/couchdb/ に hoge.couch をコピーし、couchdb を起動する。
※owner は couchdb, 権限は 660

Futon で確認すると、hoge DB が利用できる。
![スクリーンショット 2016-02-06 21.53.40.png](https://qiita-image-store.s3.amazonaws.com/0/27486/7cc2cec5-8f40-f538-f0d3-71fbe8319ea1.png)
とあるJavaエンジニアが驚いたJavaScriptのオブジェクト指向(レベル１)

# 概要
[Progate](https://prog-8.com)のJavaScriptコースを終えたので、次は何の教材を使ってJavaScriptの勉強をしようかなと思って部屋を見渡してみるとかなり前に購入した[初めてのJavaScript 第2版]("http://www.amazon.co.jp/gp/product/487311425X/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=487311425X&linkCode=as2&tag=maemuki-22")を発見したので手にとってとりあえず3章まで進めるも分岐とかデータ型とか繰り返しとか面白くなかったのですが、ひとつだけ面白いなと思って脱線してしまったことをつらつらと書いていきます。

## JavaScriptのオブジェクトにはどうやら動的にプロパティを追加できるみたいだ
低レベルな話で済みません。ただ実務で一番使っている言語が静的型付け言語(Javaのこと)で、それと比較して面白いなと思ってしまったのです。


```
var anObj = new Object();
if (anObj.piyo === undefined){
// anObjにはpiyoというプロパティがないのでこちら側のブロックが処理されます。
	console.log("anObj.piyo is undefined.");
	console.log(anObj);// -> Object {}と出力
}else{
	console.log(anObj.piyo);
	console.log(anObj);
}

// (驚きポイント)しかしanObjに対してあたかもpiyoというプロパティがあるが如く値を設定すると
anObj.piyo = "XYZ";
if (anObj.piyo === undefined){
	console.log("anObj.piyo is undefined.");
	console.log(anObj);
}else{
// こちら側のブロックが処理されます。=> JavaScriptのオブジェクトには動的にプロパティを追加出来るみたいだということが分かった。
	console.log(anObj.piyo);//XYZ
	console.log(anObj);// Object {piyo: "XYZ"}
}
```

## 更に驚いたことに

```
var User = function(firstName,lastName){
	this.firstName = firstName;
	this.lastName  = lastName;
}

var oneUser = new User("Taro","Yamada");
var twoUser = new User("Jiro","Suzuki");

console.log(oneUser);// => User {firstName: "Taro", lastName: "Yamada"} 
console.log(twoUser);// => User {firstName: "Jiro", lastName: "Suzuki"}

// (驚きポイント)同じクラスから生成したオブジェクトに対して、個別にメソッドを追加出来るみたいです。
oneUser.sayHello = function(name){
 	console.log("Hello, " + name);
}

oneUser.sayHello("Tanaka");// Hello, Tanakaと表示

twoUser.sayHello("Watanabe");//twoUserには、sayHelloメソッドを定義していないので、Uncaught TypeError: twoUser.sayHello is not a functionというエラーになる。
```

## そしてプロトタイプを使うと
```
var User = function(firstName,lastName){
	this.firstName = firstName;
	this.lastName  = lastName;
}

var oneUser = new User("Taro","Yamada");
var twoUser = new User("Jiro","Suzuki");

User.prototype.sayHello = function(name){
 	console.log("Hello, " + name + " from " + this.lastName);	
}

// (驚きポイント)prototypeを使うと同じクラスから生成されたオブジェクト全てに対して、メソッドが追加されているみたいだ。

oneUser.sayHello("Tanaka");// Hello, Tanaka from Yamadaと出力

twoUser.sayHello("Watanabe");// Hello, Watanabe from Suzukiと出力
```

ここが今日勉強していて、面白く感じ書籍のサンプルコードを写経するという当初の目標から大きく脱線し遊んでしまったところです。

今のところ何故JavaScriptがこういう言語仕様になっているかは全く分かりませんが、Javaのクラスベースとは全然違うんだろうなということは感じることは出来ました。

学習を進めていくと何故にJavaScriptがこういう仕様になっているのかが、いつかきっと分かる日が来るのだろうなというのを楽しみにしつつ今日の学習はこれにて終了。

お疲れ様でした。
PHPでCSV文字列を作る方法


# 制約

極力ライブラリに頼らず、大抵の環境で使えるようにする。
そうしないと使いでが悪いからね。

但し、PHPのバージョンは5.6以降。

# そもそも

PHPのネイティブ実装ではCSV"文字列"をそのまま作成できる処理が存在しない。

# 備考

まだ簡単な疎通しかしてない。

# 実装

## A案

PHPのネイティブ関数を使う。
fputcsvを使ってメモリ上に展開してから取得する。

```php
function to_csv (array $data) {
	$memory = 'php://memory';
	$mp = fopen($memory, 'bw+');
	foreach ($data as $row) {
		fputcsv($mp, $row);
	}
	rewind($mp);
	return stream_get_contents($mp);
}
```

## B案

自力で組み立てる。

```php
function to_csv (array $data) {
	$result = [];
	foreach ($data as $row) {
		$tmp = [];
		foreach ($row as $col) {
			$enclosing_flag = false;
			switch (true) {
				case strpos($col, '"') !== false:
					$col = str_replace('"', '""', $col);
					$enclosing_flag = true;
				case strpos($col, "\r\n") !== false || strpos($col, "\r") !== false || strpos($col, "\n") !== false:
					$enclosing_flag = true;
			}
			if ($enclosing_flag) {
				$col = sprintf('"%"', $col);
			}
			$tmp[]	= $col;
		}
		$result[]	= implode(',', $col);
	}
	return implode("\r\n", $result);
}
```