OmniAICreator/Qiita-1.07M huggingface dataset:
SSLの設定後Apache再起動する際にパスフレーズの入力を省略する方法

SSLを設定するとAapache再起動する際にパスフレーズが聞かれる。
このパスフレーズの入力を省略するような設定方法を記載する。

# 設定手順
先に作った秘密鍵（私の場合は`.key`）を元に、改めて秘密鍵を作成する。
以下コマンド。

```bash
# 秘密鍵ファイルのリネーム
mv server.key server.key.back

# 秘密鍵を作り直す
openssl rsa -in server.key.back > server.key
```

上記のコマンドを叩くと、パスフレーズの入力を求められるので、パスフレーズを入力する。

```bash
Enter pass phrase for server.key.back: パスフレーズ

# 入力すると以下の行が表示される
writing RSA key
```

以上で設定は完了！
実際にApacheを再起動してもパスフレーズを求められなくなった。

# 余談（httpsへのリダイレクトの設定）

SSLを設定したので、ついでに`http`でアクセスされたときに`https`にリダイレクトするような設定方法も記載。今回は`.htaccess`ファイルにて設定するので、このファイルに以下を追記。
※`mod_rewrite`というモジュールがインストールされていることが前提。

```bash
# モジュールのインストール
yum -y install mod_rewrite
```

以下、追記内容。

```apache
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*)?$ https://%{HTTP_HOST}/path to redirect page/$1 [L, R]
```

細かい書き方や、正規表現については今回は割愛。
ではー。
Swiftはじめたい...その８ 文字列操作関数など


# 今回は文字列操作などの関数を試してみます。

## まずは文字の切り取りから

### substringです

+ substringはimport Foundationが必要でした。

```swift:substring
let s = "abcdefghijklmn"
// 先頭から5文字目まで
print(s.substringToIndex(s.startIndex.advancedBy(5)))
// 4文字目から最後まで
print(s.substringFromIndex(s.startIndex.advancedBy(5)))
// 3文字目から5文字目まで3文字
print(s.substringWithRange(Range<String.Index>(start: s.startIndex.advancedBy(2), end: s.startIndex.advancedBy(5))));
// 後ろから3文字
print(s.substringFromIndex(s.endIndex.advancedBy(-3)))
```

```shell:結果
abcde
fghijklmn
cde
lmn
```

+ **なんじゃこりゃぁ〜〜〜〜〜？！バカにしてんのか？？**


### substring：日本語も試してみます。

```swift:substring
import Foundation

let s = "日本語はABCちゃんとつかえるかな"
// 先頭から5文字目まで
print(s.substringToIndex(s.startIndex.advancedBy(5)))
// 4文字目から最後まで
print(s.substringFromIndex(s.startIndex.advancedBy(5)))
// 3文字目から5文字目まで3文字
print(s.substringWithRange(Range<String.Index>(start: s.startIndex.advancedBy(2), end: s.startIndex.advancedBy(5))));
// 後ろから3文字
print(s.substringFromIndex(s.endIndex.advancedBy(-3)))

```

```shell:結果
日本語はA
BCちゃんとつかえるかな
語はA
るかな
```

+ 日本語でも問題なさそうです。でも萎えました...他に方法ないのかな？

### substring：こっちのほうがむしろすっきりするかも？

+ めんどいうのでもう配列で処理してみます。

```swift:array
let s = "日本語はABCちゃんとつかえるかな"
print([Character](s.characters)[2..<5].map{ String($0) }.joinWithSeparator(""))
```

```shell:結果
語はA
```

+ これでも一応答えはでました。


## その他の文字関数 大文字小文字など

+ 小文字化、大文字化、文字列を含むかどうか？を試してみます。

```swift:文字関数いろいろ
let s = "abcXYZ日本語"
// 小文字
print("lowercaseString:",s.lowercaseString)
// 大文字
print("uppercaseString:",s.uppercaseString)
// 文字を含む
print("containsString:",s.containsString("ABC"))
// 合わせ技で文字を含むか？
print("upper->contains:",s.uppercaseString.containsString("ABC"))
// 日本語でで文字を含むか？
print("contains KANJI:",s.containsString("日本語"))
```

```shell:結果
lowercaseString: abcxyz日本語
uppercaseString: ABCXYZ日本語
containsString: false
upper->contains: true
contains KANJI: true
```

+ substringはがっくりでしたが、こっちはふつーです。
+ 基本的に日本語化どうかはもう関係ないみたいですね。


## 乱数

+ なんかObjective-cと一緒なんですね...

```swift:結果
for i in (0..<10) {
    print("[",i,"] = ",arc4random_uniform(UInt32(100)))
}
```

```shell:結果
[ 0 ] =  50
[ 1 ] =  49
[ 2 ] =  35
[ 3 ] =  91
[ 4 ] =  90
[ 5 ] =  47
[ 6 ] =  36
[ 7 ] =  8
[ 8 ] =  90
[ 9 ] =  25
```

+ 当たり前ですが実行するたびに値が変わります。


## まとめ

+ substringはめんどくさいですねー
+ 正規表現まで試そうと思ってたんですがググるとNativeに扱えない感じ？なので放置
+ 時間関数はNSDateだってんでそれじゃSwiftじゃなくていいじゃん、なので後回し
+ perl好きとしては文字列操作が面倒だとイライラします。

# 今日はここまで

+ 次回は関数かな〜
RailsにJSONパラメータを送った際のwrap_parametersについて


# はじめに
Railsのwrap_parametersについてちょっと調べたのでメモ。

# 普通のパラメータ
Railsでは以下のようにパラメータを送ると、一塊のハッシュにしてくれる。
※paramsは正確にはハッシュのサブクラスらしいです

```
Content-Type: application/x-www-form-urlencoded

user[id]: 1
user[name]: y-sugasawa
user[hobby_id][]: 100
user[hobby_id][]: 200
```

``` users_controller.rb
class UsersController < ApplicationController
  def index
    p params[:user] # {id: 1, name: "y-sugasawa", hobby_id: [100, 200]}
  end
end
```

# wrap_parameters
パラメータがJSON形式の時は、パラメータのkeyから「user」の部分を取り除けます。
キーの「user」というのはcontrollerの名前から自動的に決定されます。


```
Content-Type: application/json
{
  "id": 1,
  "name": "y-sugasawa",
  "hobby_id": [100, 200]
}
```

``` users_controller.rb
class UsersController < ApplicationController
  def index
    p params[:user] # {id: 1, name: "y-sugasawa", hobby_id: [100, 200]}
  end
end
```

# 注意点
上記のjsonの例で、以下のようなUserモデルがあった場合

```
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t:string :name
      t.timestamp null: false
    end
  end
end
```

users_controllerは自動的にUserモデルのためのパラメータと解釈してUserモデルに存在しないカラムは除外されてしまう

``` users_controller.rb
class UsersController < ApplicationController
  def index
    p params[:user] # {id: 1, name: "y-sugasawa"}  hobby_idが除外されている
    p params[:hobby_id] # [100, 200]
  end
end
```

これを回避する場合は以下のように記述する

``` users_controller.rb
class UsersController < ApplicationController
  
  wrap_parameters :user, include: [:name, :hobby_id]

  def index
    p params[:user] # {id: 1, name: "y-sugasawa", hobby_id: [100, 200]}
  end
end
```
DB(MySQL)のダンプを取得し圧縮するスクリプト

業務で、__念のため定期的にDBのダンプを取得したい。__と言われることがよくある。実際は「毎日」と言われることがほとんどだが。そのためのスクリプトを書いた。

このスクリプトを`cron`などで定期的に実行してやればよい。

```bash
# 諸々の設定
user=hogeuser
password=hogepass
dbName=hogedb
tableName='hogetable（※複数ある場合は半角スペース区切り）'
today=`date '+%Y%m%d'`
backupDir=/path to backup directory/
fileName=hogefile

# dumpを圧縮して取得
mysqldump -u ${user} -p${password} -t ${dbName} ${tableName} | gzip > ${backupDir}${fileName}${today}.dump.gz

```

※`=`の前後に半角スペースを入れると上手く動かなかったので注意。  
後は、取得すると言っても、

- サーバーの容量
- 1日の取得回数
- 取得時間
- 何日分を残し、過ぎたら削除

などを考慮し、タイミングと取得するデータを決める必要もあるので、その辺は要相談。

## 2105/01/15追記
[KazBond](http://qiita.com/KazBond)さんにコメントいただき、圧縮して取得するように修正致しました。
Webエンジニアとしての最低限必要なネットワーク基礎知識をまとめてみた【逐次更新】

いくらＷｅｂアプリをメインで扱うといっても、ネットワークの基礎は知っておかないと仕事にならない。
というわけで書籍などを読んだ結果を随時まとめるための備忘録。

◆TCP/IPの基本
[IP(IPv4)通信の中身]
・IP通信とは、パケットと呼ばれる小包を送ったり受け取ったりする通信！
　　パケット…通信単位。中に様々な情報を詰めている
　　IPアドレス…発信元や受信先を示すアドレス。その名の通り住所
　　IPヘッダ…様々な管理情報。いわゆる小包に張る伝票
　　ペイロード…送り届けたいデータ。いわゆる小包に詰める荷物
　→これらを規定のフォーマットやサイズに指定して、
　上位レイヤ（トランスポート層）にあるTCP（いわゆる郵便屋）の力を借りて、届ける

[IPアドレス概説]
・IPアドレスは、個人固有の住所！
　固い言い方をすれば、ネットワーク上の通信機器を特定するための識別子。
　32ビットの数値で表されるが、普段は8ビットずつ4つに分けて区切り10進数に表して
　人間にやさしい表記になっている（「192.168.1.3」など）。

・ネットワーク部は住まいのマンション名、ホスト部は部屋番号
　IPアドレスはネットワーク部とホスト部で構成されている。
　　ネットワーク部…通信機器が所属するネットワーク
　　ホスト部…所属するネットワーク内での通信機器個別識別番号

・サブネットマスクは、IPアドレス内のネットワーク部とホスト部の区切り
　とはいっても、実際は0と1の数値であるIPアドレス。
　どこがネットワーク部でホスト部かを判別しやすくする為の区切りがサブネットマスク。
　ちなみに、
　　サブネットマスクが短い
　　→ネットワーク部が短い/ホスト部が長い
　　→マンションの部屋数が多くなる！（通信機器に割り振れるIPアドレスの数が多くなる）
　ということになる。

・厳重な鍵付きのマンションと、誰でも使える公民館/プライベートIP、グローバルIP
　外部から直接アクセスできないネットワークで使用されるのが、プライベートIPアドレス。
　（会社のイントラネットやサーバファームの内部ネットワークなどに使用される）
　一方、インターネットのどこからでもアクセスできるのがグローバルIPアドレス
dockerでhubotが動作する環境を作る

初投稿です。tuboneです。

hubotはnode.jsとnpmで動作しますが、node.jsの環境構築がめんどくさかったのでとりあえずdockerでnode.jsの環境を構築して、hubotのインストールまでやっていきたいと思います。非常に簡単に構築できますが、つまずいた点がいくつかあったので（海外のリファレンスでもanswerまとまっていなかったので）まとめてみたいと思います。

使用したサーバ環境:CentOS release 6.7 (Final)
***

#dockerでnode.jsが動く環境を作る

###dockerのインストール
まずdockerが動かなければ意味が無いのでdockerを入れて下さい。
epelリポジトリからyumが便利です。

```
# rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
# yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum -y install docker-io
```

注意したいのは"docker" ではなく "docker-io"です。

dockerのサービスを起動します。

```
# service docker start
# chkconfig docker on
```

###node.jsのコンテナを作る
node.jsのイメージはdokerhubに公式があります。

今回はそれを使います。

```
# docker pull node
```

イメージが入ったことを確認して下さい。

```
# docker images
```

```bash:結果
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
node                latest              811aa8ed56dd        1 hours ago        643 MB

```

このイメージを利用してコンテナを作成します。
hubotの設定もあるのでbashを起動します。

nameでコンテナにhubot1という名前をつけました

```
$ docker run -it --name "hubot1" node /bin/bash
```

するとhubot1のbashに切り替わります。

```bash:結果
root@811aa8ed56dd:/# #hubot1のbashです
```

#hubotを導入する

###Yeomanでgenerator-hubotをインストール

最新のhubotはYeomanをつかって導入しますので

```
root@811aa8ed56dd:/# npm install -g yo generator-hubot
```

とやるとなにやらダウンロードし始めます。さらに

```
root@811aa8ed56dd:/# npm list -g generator-hubot yo

npm info it worked if it ends with ok
npm info using npm@3.3.12
npm info using node@v5.4.1
/usr/local/lib
+-- generator-hubot@0.3.1
`-- yo@1.6.0

npm info ok

```

これでyoと generator-hubot　のインストールができました。

###hubotを実際のディレクトリにいれる作業

このままディレクトリを作成しyo しようとするとエラーがでます。
（自分はここでかなりつまずきました）

rootのままインストールしようとするとこんなエラーが出てきます。

```
Error: EACCES: permission denied, open '/root/.config/configstore/insight-yo.json' You don't have access to this file.
```

permission deniedだから権限がおかしいかと思ってchmod chownしてもなんか上手くいかないし、そもそもこんなファイルないし…
かなり困りました。


dockerでは基本的にrootユーザで作業しますが、それが悪かったようです。

まずhubot用の一般ユーザを作り、そのユーザーのhomeディレクトリで
作業します。

```bash:user追加
root@811aa8ed56dd:/# adduser myhubot
Adding user `myhubot' ...
Adding new group `myhubot' (1000) ...
Adding new user `myhubot' (1000) with group `myhubot' ...
Creating home directory `/home/myhubot' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for myhubot
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
```

ユーザをrootからmyhubot に切り替えディレクトリも切り替えちゃってください。

```
root@811aa8ed56dd:/# su myhubot
myhubot@811aa8ed56dd:/$ cd ~
myhubot@811aa8ed56dd:/$ pwd
/home/myhubot
```

で、

```
myhubot@811aa8ed56dd:/$ yo hubot
```

でmyhubotができました！
あとは画面に則って情報を入力すればいいです。
(ownerとかbotnameとか)

とりあえずお疲れ様でした。


将来的には孤独を忘れさせる便利対話botを作りたいですね。
今日から日課をここに書いていこう


#2016
## 1/14 
*　Ricoh Theta S で撮った映像を他の３６０度パノラマプレイヤーで再生するとクォリティーが落ちることが発見。
* Ricohのプレイヤーと一番似ているのはKolorのSphereモード。クォリティーは劣る。
* KolorのSDKはPublicではない。メールでリクエスト。
* Kolorめんどくさい。
## 1/15
* Kolorから返事がない。
* PanframeのSDKを使ってみることにした。  http://www.panframe.com/
PlantUMLのサンプル

# PlantUMLとは
http://ja.plantuml.com/
UMLをテキストで書ける。
PNGなどで出力できる。
RubyMineやAtomなどのプラグインがあるので便利。

以下サンプル

# シーケンス図

http://plantuml.com/sequence.html

```puml:sequence
@startuml
Alice -> Bob: こんにちは
Bob --> Alice: こんにちは、こんにちは
@enduml

```

![sequence.png](https://qiita-image-store.s3.amazonaws.com/0/109450/29a332fb-b7cc-8490-faab-50e27d3e457d.png)

# オブジェクト図

http://plantuml.com/objects.html

```puml:objects
@startuml

object Company
object Employee

Company o-- "0..*" Employee

@enduml
```

![objects.png](https://qiita-image-store.s3.amazonaws.com/0/109450/fcec9bbc-6da1-c7c0-9d4f-09802821cd20.png)
例外処理


## ensure節
例外の有無に関わらず最後に必ず実行したい処理はensure節に記述する。例えば、ファイル操作に失敗したも確実にファイルをcloseしたいときとか。

```ruby
begin
  raise StandardError, 'raise StandardError'
rescue => e
  puts e.message
ensure
  puts 'エラーが起きても実行されます'
end
```

## else節
例外が発生しなかったときにだけ実行される処理を記述する。
以下の例では、fileを開いて無事に開けた場合だけfileの中身を読む。


```ruby
begin
  file = File.open('else_sample.txt', 'r+')
  puts file
rescue => e
  puts 'ファイルを開くときに何かが起こりました'
else
  puts '無事にファイルが開けました'
  puts file.read
ensure
  file.close
end
```

## begin節の戻り値
begin節はif式などのように値を返す。begin節、rescue節、else節で最後に評価された式の値が戻り値になる。
ensure節は実行されるが戻り値にはならない。

```ruby
return_value = 
  begin
    value = 'これが戻り値'
    raise
  rescue
    value
  ensure
    puts '実行されるが戻り値にはならない'
  end

puts return_value #=> '実行されるが戻り値にはならない'、'これが戻り値'の順で出力される
```
## retry処理

```ruby
begin failed ||= 0
  puts 'trying...'
  
  process # 例外が発生するかもしれない処理
rescue
  failed += 1
  retry if failed < 5 #5回までリトライする
end
```

## catch ... throw
catchのブロックの中でthrowを呼ぶとcatchの呼び出し元までもどることができる。
throwの第二引数には戻り値を指定できる。

```ruby
catch :triple_loop do
  loop do
    puts 'one'
    
    loop do
      puts 'two'
      
      loop do
        puts 'three'
        
        throw :triple_loop, 'return value'
      end
    end
  end
end
```
オープンクラス

# オープンクラスとは
既存のクラスを自在に拡張するようなコードを書けること。

## 例. Numericクラスの拡張
selfが正の数なら0からselfの数まで1ずつ増やした配列を返すメソッドstepを定義してみる。

```ruby
class Numeric
  def steps
    return [] if self <= 0

    0.upto(self).to_a
  end
end

p 10.steps  #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
p 8.steps   #=> [0, 1, 2, 3, 4, 5, 6, 7, 8]
p -20.steps #=> []
p 0.steps   #=> []
```
method_missing

# method_missingとは
呼びだされたメソッドが存在しなかった時に呼ばれるメソッド。
NoMethodErrorを返してくれるやつ。
BasicObjectクラスに定義されている。

# rubyのメソッド探索の流れ
rubyでは呼びだされたメソッドが見つかるまで継承ツリーを辿っていき、最終的に最上位であるBasicObjectクラスまで探しに行く。
BasicObjectまで探しに行っても見つからなかった場合は、レシーバーの直接のクラスにmethod_missingメソッドが無いか探索し、ない場合は再び継承ツリーを辿ってmethod_missingメソッドを探しに行く。

## 例
以下のようなクラス、モジュールがあったとします。

```ruby
module Hello
  def hello
    p "Helloモジュール"
  end
end

class GrandParent
  def hello
    p "GrandParentクラス"
  end
end

class Parent < GrandParent
  include Hello
end

class Child < Parent
end

child = Child.new
child.hello        #=> "Helloモジュール"
p Child.ancestors  #=> [Child, Parent, Hello, GrandParent, Object, Kernel, BasicObject]
```

childオブジェクトに対してhelloメソッドが呼ばれると、childオブジェクトの直接のクラスであるChildクラスから継承ツリーを辿ってhelloメソッドを探しに行く。最初にhelloメソッドをもっているのはHelloモジュールなので、"Helloモジュール"という文字列が出力される。

メソッド探索の流れは
Childクラス -> Parentクラス -> Helloモジュール -> GrandParentクラス 
-> Objectクラス -> Kernelモジュール -> BasicObjectクラス
となる。

したがって、存在しないメソッドを呼び出したときも上記の流れでmethod_missingメソッドを探しに行く。

# BasicObject#method_missingをオーバーライド
特定のクラスでmethod_missingメソッドをオーバーライドすることで定義されていないメソッドが呼ばれてもNoMethodErrorを出さない(特定の処理を実行させる)ことができる。

method_missingに渡される引数は以下のようになっている。

| 引数 | 中身 |
|:-----------|------------:|
| 第一引数   | 呼び出しに失敗したメソッド名のシンボル |
| 残りの引数 | 呼び出しに失敗したメソッドに渡された引数(可長変引数) |

## 例
Arrayのような振る舞いをさせたいDelegateArrayクラスをArrayを継承せずに作ってみます。

```ruby:delegate_array.rb
class DelegateArray
  attr_reader :array

  def initialize
    @array = []
  end

  def method_missing(name, *args)
    if Array.instance_methods.include?(name)
      p "method_missingが呼ばれました"
      return @array.__send__ name, *args
    end
	
	# method_missingないで存在しないメソッドが呼ばれると
	# SystemStackErrorが発生するので、Arrayに定義された
	# メソッド以外のときはsuperを呼び出す
    super
  end
end

delegate_array = DelegateArray.new
delegate_array << 1     
p delegate_array.array
```

実行結果

```ruby
$ ruby delegate_array.rb
"method_missingが呼ばれました"
[1]
```
rubyで複数行の文字列

複数行の長い文字列を作成する場合にはヒアドキュメントを使用することができる。

書式は以下の通り。

```ruby
<<"識別子"
文字列
文字列
文字列
最終行
識別子
```
ルール

* 識別子をダブルクオーテーションで囲んだ場合は文字列をダブルクオーテーションで囲んだ場合と同じ
* シングルクオーテーションで囲んだ場合は文字列をシングルクオーテーションで囲んだ場合と同じ
* 単に識別子が記述された場合は、ダブルクオーテーションで囲んだ場合と同じ
* 「<<"識別子"」の代わりに「<<-"識別子"」を使うと最後の識別子の前に空白やタブを記述することが可能


識別子には任意の文字列を指定できるが、「EOS」などがよく使われているらしい。(EOS=End of String)
こんな感じ。

```ruby
<<"EOS"
hello, world!
hello, ruby!
hello, ruby on rails!
EOS
```

変数に入れることもできる。

```ruby
str = <<-EOS
hello, world!
hello, ruby!
hello, rails!
EOS

p str #=>"hello, world!\nhello, ruby!\nhello, rails!\n"
```
Kernal.#eval

# Kernal.#evalとは
Kernelモジュールに定義されているevalメソッドは引数に渡された文字列をプログラムとして実行する。

```ruby
irb(main):001:0> eval "1+2"
=> 3
irb(main):002:0> eval "[1,3,5].each { |value| p value }"
1
3
5
=> [1, 3, 5]
# 変数操作も可能
irb(main):003:0> a = 10
=> 10
irb(main):004:0> eval "a = 1"
=> 1
irb(main):005:0> a
=> 1
```

**attr_readerメソッドのようなメソッド名は違うが処理内容はほとんど同じメソッドを定義するときに便利。**

## 例. インスタンス変数へ値を代入したときに別のインスタンス変数に変更前の値を保存するメソッドを定義してみる

```ruby
class LoggingInstanceVariable
  logging_instance_val_names = %w(first_val second_val third_val)
  
  logging_instance_val_names.each do |val_name|
    eval <<-END_OF_DEF
      attr_reader :#{val_name}, :before_#{val_name}

      def #{val_name}=(val)
        @before_#{val_name} = @#{val_name}
        @#{val_name} = val
      end
    END_OF_DEF
  end
end

obj = LoggingInstanceVariable.new
obj.first_val = 1
obj.first_val = 2
p obj.first_val        #=> 2
p obj.before_first_val #=> 1

obj.third_val = "third_val"
obj.third_val = :third_val

p obj.third_val        #=> :third_val
p obj.before_third_val #=> "third_val"
```
[Ruby]単純な計算結果がおかしい

どうでもいい話ですが、Ubuntu で ruby 1.9.3p484 使ってて単純な計算結果が変であることに気づく。何で？丸め誤差？

```
xxxxx@titan:~$ uname -a
Linux titan 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:02 UTC 2015 i686 i686 i686 GNU/Linux
xxxxx@titan:~$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [i686-linux]
xxxxx@titan:~$ ruby -e 'puts 1.1*2.2'
2.4200000000000004
xxxxx@titan:~$ ruby -e 'puts 1.1*2.2*3.3'
7.986000000000001
xxxxx@titan:~$ 
```
[WIP] rhelにjenkinsをインストール ver.[追加設定]


### 事前作業
[rhelにjenkinsをインストール ver.[基本設定]](http://qiita.com/iganari/items/12f5862aac701ca98a16)

### pluginのupdate
+ 後に伸ばすとリスクでしかないので、始めにやっておく
    + Manage Jenkins > Manage Plugins
        + Select --> All
            + [Download now and install after restart]
        + 再起動反映
            + [Restart Jenkins when installation is complete and no jobs are running]

### ユーザを作る && ログインを基本とする


+ ミスった時…

### webの設定系
+ デフォルトのport=8080から8090へ変更する
    + /etc/sysconfig/jenkins

```
# l.56あたり
- JENKINS_PORT="8080"
+ JENKINS_PORT="8090"
```

+ 設定の変更内容の反映

```
# service jenkins restart
```

+ ドメイン(サブドメイン)でアクセスしたい

### [WIP] pluginとか
+ [GIT plugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin)
+ [SSH plugin](https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin)
+ [ThinBackup](https://wiki.jenkins-ci.org/display/JENKINS/thinBackup)
    + GUIで簡単にバックアップ出来る
    + 必ずチェックするもの
        + Backup 'userContent' folder(作成したユーザの権限まわりの設定のバックアップ)
        
+ [PegDown Formatter](https://wiki.jenkins-ci.org/display/JENKINS/PegDown+Formatter+Plugin)
+ [disk-usage plugin](https://wiki.jenkins-ci.org/display/JENKINS/Disk+Usage+Plugin)
+ [Monitoring](https://wiki.jenkins-ci.org/display/JENKINS/Monitoring)
    + http://yourhost/monitoring
+ [GitHub plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin)
+ [Timestamper](https://wiki.jenkins-ci.org/display/JENKINS/Timestamper)
+ [Nested View Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Nested+View+Plugin)
+ [Xvfb plugin](https://wiki.jenkins-ci.org/display/JENKINS/Xvfb+Plugin)
+ [Slack Notification Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Slack+Plugin)
+ [Locale plugin](https://wiki.jenkins-ci.org/display/JENKINS/Locale+Plugin)
    + 

[http://192.168.33.12:8080/safeRestart]

+ [Emotional Jenkins Plugin]()

+ [Green Balls](https://wiki.jenkins-ci.org/display/JENKINS/Green+Balls)
    + カラーボールが青から緑になる。
    + それだけだけど、なんとなく成功してる感が高まるw
+ [Parameterized Trigger Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin)
    + githubのhookをビルドトリガーにしたい時


### 参考URL
+ [Jenkinsをインストールしたら入れるプラグイン18個](http://qiita.com/shufo/items/4a128a0bf08affbecff8)
+ [Jenkins がもっと便利になるおすすめプラグイン 8 つ](http://blog.fenrir-inc.com/jp/2012/12/jenkins_plugins.html)
+ [Jenkins がもっともっともっと便利になるプラグイン 8 つ](http://blog.fenrir-inc.com/jp/2013/06/jenkins_plugins-2.html)
+ [Javaユーザに贈るJenkins 25のTips ](http://www.slideshare.net/linoSth/javajenkins-25tips)
STM32F303VCにSWDで書き込む

#STM32F303VCとは

STM32F303VCは[STM32F3-discovery](http://www.st-japan.co.jp/web/jp/catalog/tools/PF254044)に載ってるマイコンで、割と強めな方。

基本スペックはリンク参照で。


Discoveryをボードで普通に使う分には

書き込みのことはほとんど考えなかったけど、

DiscoveryにオンボードでST-LINKもあるみたいなので使ってみた。

#やってみた
##準備する

1,ST-LINK UtilityというソフトをSTMicroelectronics社のHPからDLする。
2,Discoveryのピンヘッダ(CN4)のジャンパを外す。[^1]

##ピンを接続する

Discovery上のピンヘッダ(CN3)がSWDのポートっぽい

ピンヘッダの白丸のところが1ピンでそこから全部で6ピン存在する。

それぞれの名称

| 番 |名称|
|:---:|:---:|
|  1 |VDD_TARGET|
|  2 |SWCLK|
|  3 |GND|
|  4 |SWDIO|
|  5 |NRST|
|  6 |SWO|

接続法

|ピンヘッダ|ボード|
|:---:|:---:|
|VDD_TARGET|VDD|
|SWCLK|PA14|
|GND|GND|
|SWDIO|PA13|
|NRST|NRST|
|SWO|PB3|

(書き込むだけならPB3は繋がなくてもいけた。)

##書き込む

PCとST-LINK基板をUSBコネクタでつなぐ。

ST-LINK Utilityを開いてST-LINK基板とConnectする。

Connect後にMCUがSTM32F30xとかになっていれば接続はOK。

接続されたら[Ctrl+P][^2]で書き込むファイルを選択する。

あらかじめ生成しておいた.hexファイルを選択し、書き込む。

##動作確認

ボード上のLEDがちかちかしてくれたんでOK。

無事動いたし、めでたしめでたし。

#まとめ

とりあえず書き込みすることができたのでOK。

STM32の他の奴(F4とかF7とか)でもできるっぽいので楽しみ。

#注釈
[^1]: ジャンパを外すとST-LINKモードとなる。ジャンパを付けるとDescoveryモードとなる。
[^2]: [Target]-[Program&verify...]のショートカットキー
日本語入力のための設定 part2

### 日本語入力のための設定 part2 (2016.01.14, Raspbian from NOOBS LITE v1.5)

[「ラズパイ超入門」](http://www.amazon.co.jp/exec/obidos/ASIN/4822236080/namamusu-22/) などを参考にさせていただきました

画面左上の "Menu" をクリック -> 設定 -> Raspberry Pi Configuration -> Localisation

として、

- Set Locale -> ja, JP, UTF-8
- Set Timezone -> Asia, Tokyo
- Set Keyboard -> Japan, Japanese (OADG 109A)

ターミナルを起動して、以下を入力（フォントは、fonts-vlgothic などでも可）

```
sudo apt-get update
sudo apt-get install fonts-takao ibus-mozc
sudo reboot
```

再起動後に、画面右上の US マークをクリックして日本語を選択

> - キーボードの設定が、勝手に元に戻ったら、Japan, Japanese (OADG 109A) を再設定
> - GUI の Set Keyboard を押しても何も起こらない時は、ターミナルで `sudo raspi-config` としてもキーボードの設定を変更できる（[日本語入力のための設定など part1](http://qiita.com/NariseT/items/caed4fa6eae7857d7dbb)）
Python requests で取得したログインセッションクッキーを Selenium ブラウザに渡してログインする

# 何を言ってるのか

クライアントがモバイルアプリなど、Webブラウザ以外を想定している Web アプリがあるとします。

それは、よくある Web サービスで見るようなログインページを持たないとします。クライアントアプリにログインフォームが入っているためです。

でも、自動テストとかする時は、Selenium のブラウザからアクセスして動作を見たい。
そんな時。

# コード

```python:python
import requests
from selenium import webdriver

cookie_name = 'session_id'

# requests でログインしてセッションクッキーを作る
s = requests.session()
login_data = {
    'email': 'xxxx@xxxx.xx',
    'password': 'xxxxxxxxxx',
}
res = s.post('https://example.com/login/', data=login_data)
res.raise_for_status()

# セッションクッキーの値
cookie_value = s.cookies.get(cookie_name)

# Firefox起動
driver = webdriver.Firefox()
# 事前に、ターゲットドメインの適当なページを開いておく。
# これをしないと、add_cookie でエラーになる
driver.get('https://example.com/')
# requests で取得したセッションクッキーを Firefox に渡す
driver.add_cookie({
        'name': cookie_name,
        'value': cookie_value,
        'domain': 'example.com'})
# ログイン後のページを表示
driver.get('https://example.com/mypage/')
```

これで、Firefox でログイン後のページが見れます。

なお、webdriver.Chrome でも同様に add_cookie メソッドが動きますので、同様にログインできます。多分、他の web ドライバでも動きます。


# ダメだった例

ローカルに、適当なフォームの HTML を作り、その action= をログインURL にした場合、method="POST" にしてもなぜか GET でリクエストされました。最近のブラウザだとセキュリティのためかクロスドメインでの POST での送信はできなくなっている模様。

# がんばれば selenium だけでできるかもしれない案

Selenium で、ログイン先のドメインの適当なページを開いて、JS でログインフォームを作り、そこから POST 送信すればログインできるかもしれません。でも大変そうなのでやってないです。
【Android】複数のプロジェクトにまたがるdependenciesの解決


# 言葉

この記事で使用する言葉を以下の通り定義します

| 言葉  | 意味 |
|:---|:---|
|プロジェクト|Android Studioでいうプロジェクト． `gradle.settings` があるところ．（だいたいの場合において）|
|モジュール|Android Studioでいうモジュール．プロジェクト以下のアプリケーションとかライブラリのこと|

# はじめに

モジュールが増えて少し大きなプロジェクトになると，例えばプロジェクトAのライブラリを用いてプロジェクトBを立てることもあると思います．
私の所属するチームの場合，プロジェクトAで作成したアプリケーションのサブツール（バッチやらデバッグ用ツールなど）をプロジェクトBで管理しています．
Gitリポジトリはプロジェクト毎に切っていて，A, BそれぞれGitリポジトリとなっています．

# 依存問題

プロジェクトBはプロジェクトAに依存しているので，プロジェクトBにプロジェクトAをサブモジュールとして登録します
仮にこんなディレクトリ構造になったとしましょう

```text
└─ProjectB
    ├─Module1
    └─ProjectA // (git submodule)
        ├─Library1
        ├─Library2
        └─Module1
```

[ProjectB-Module1] が， [ProjectA-Library2]に依存していると仮定します．

この状態で素直に `gradle.settings` を書くと

```groovy
include ':Module1'
include ':ProjectA:Library2'
```

となります．
この依存関係であれば上手くいくのですが，以下の条件でビルドが通らなくなります

- [ProjectA-Library2] は [ProjectA-Library1] に依存する

上の条件が足されると，

```groovy
include ':Module1'
include ':ProjectA:Library1'
include ':ProjectA:Library2'
```

では通りません．
`:ProjectA:Library2` の `build.gradle` の `dependencies` ブロックに `:Library1` としか書いていないため， [ProjectA-Library2] が依存する [ProjectA-Library1] を解決できないためです．

## プロジェクトの場所を指定してあげる

前置きが長くなりましたが，要はプロジェクトBとプロジェクトAは同じ階層にあるように見せてあげれば良いです．
それは プロジェクトB の `gradle.settings` に記載します．

```groovy
include ':Module1'
include ':Library1'
include ':Library2'

project(':Library1').projectDir = new File('ProjectA/Library1');
project(':Library2').projectDir = new File('ProjectA/Library2');
```

こうすることで，プロジェクトAに余計な変更を強いず，プロジェクトBは git submodule のプロジェクトAに素直に依存しながら，依存解決もできるようになります．
BIOS環境で今更ハマったGrub2トラブル

# 今更BIOS boot
って内容ですが。古いサーバマシンのトラブルついでにUbuntuのupgradeやってたらgrub-installでcritical errorが起きて焦ったので、その対応メモなど。

# 事例１：core.img ‘unusually large’
Grubが何やってるか知らないとまったく意味不明なエラーですが「最初のパーティションの開始位置をもう少し後ろにずらして下さい」というエラーでした。

ディスクの先頭512BがMBRと呼ばれる部分です。BIOSはここにローダがあると想定して読んで実行するんですが、Grubはlegacyの頃からMBRより後ろ、かつ先頭パーティションの直前までの隙間領域（伝統的には62セクタ）を利用していました。legacyだとStage 1.5とか呼ばれていた部分。2でも同じ場所にStage 2を読むためのcore.imgというのをこっそり置いています。

で、upgradeの際にcore.imgが少し大きくなっちゃって入りきらなくなった、というのが今回のエラーでした。……知らんがな。自分はまるまる1パーティションをraid用に切って突っ込んでたので、パーティションをずらすのは面倒。このディスクにGrubを入れるのは諦めて、かわりに/tmpとswapに使ってたSSDの先頭をずらしてインストールしました。先頭がswap用だったので```% sudo swapoff -a```してからfdiskで1つ目のパーティションを切り直して```grub-install /dev/sdX```（Xは環境に合わせて変えてください）。当面こっちから起動して、次にディスク交換する時に余裕を持ってパーティションを切ることにします。

# 事例２：this GPT partition label contains no BIOS Boot Partition
壊れたRAIDのディスクを交換する際にサイズを2TBから3TBに上げたのですが、fdiskが

```shell-session
WARNING: The size of this disk is 3.0 TB (3000592982016 bytes).
DOS partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID 
partition table format (GPT).
```

と言っていたので、partedから何も考えずにGPTでパーティションを切りました。で、こちらのエラーはGPTではcore.img用の領域を明示的に作ってください、というエラー。確かに言われるがままにGPTで切ってしまいましたが、EFI環境外で使うとなると、なんらかのケアが必要なのは確かに想定できたトラブル。

で、このcore.img用の特殊なパーティションについては、partedで適当なパーティションを作って```(parted) set X bios_grub on```（Xはパーティション番号）で設定できました。パーティション番号が1である必要はないみたいです。確保するセクタ位置について縛りがあるかどうかは今回調べていません（先頭が空いてたので、冒険はせずに先頭に確保した）。

# おわりに
昔はこの手のメモを日記としてウェブ上に書き残してたもんですが、最近はGoogle Docsに自分用のメモを書くだけになってました。トラブル時に検索しても「ハマった」情報ばかりで、解決したという情報が少ない時代が続いていた気がしますが、最近は検索結果からQiitaの記事があれば「この情報でいけるか？」みたいな雰囲気があったので、せっかくだから自分もまた書き残すことにしました。
grep -A 的なコード


```
$ grep -A 2 kwd FILE
```

的に、kwd からの数行を見たい時[^1]。

[^1]: grep は重複をきちんとフォローするが、そこは望まないとして。

簡単にコードを書くと。

### 範囲演算子利用

```perl:test.pl
#!/usr/bin/env perl

my $f ;
while(<>){
    next if !( $f = /kwd/ ... $f == 2 )  ;
    print join "\t", $f, $., $_ ;
}
```

```
$ perl test.pl test.pl
1	5	    next if !( $f = /kwd/ ... $f == 2 )  ;
2	6	    print join "\t", $f, $., $_ ;
3E0	7	}
```

範囲演算子の解釈は、この上なく明白。

- 一行前のフラグが `== 2` であったら、終了ですよ、と書いてるだけ。
- `..` では、範囲演算子の右辺が unintialized value 警告を出す。

### 自力でフラグ

```perl:test2.pl
#!/usr/bin/env perl

my $f ;
while(<>){
    $f = 0 if /kwd/ ;
    print $_  if defined $f and $f ++ <= 3 ;
    undef $f if $f  == 3 ;
}
```

```
$ perl test2.pl test2.pl
    $f = 0 if /kwd/ ;
    print join "\t", $f, $., $_  if defined $f and $f ++ <= 3 ;
    undef $f if $f  == 3 ;
```

- フラグ管理が三個所に渡るので、煩雑になる。
- `$f = 0` の時、`! $f` は真であるとか、そこらにも気をつけないといけない[^2]。
	- 範囲演算子の場合のフラグは `> 0` or `undef` が保証される。

[^2]: このコードでは無関係だけど。

### perl6

```perl6:test3.pl
use v6 ;
my $f ;
for @*ARGS[0].IO.lines {
    next if !( $f = /kwd/ fff $f == 2 )  ;
    .say;
}
```
fswatch @OSX



[こっち](http://qiita.com/bunzaemon/items/16ed464cb3825d8f557c)ではファイルのみを対象にしてたから気付かんかったが、ディレクトリ監視させたら、勝手に子ディレクトリも孫ディレクトリも捕捉してくれやがる。

散々、頭を悩ませて、[ソース](https://github.com/emcrisostomo/fswatch/)からインストールしてみたりしたものの、原因不明。

で、ソース内を、

```
$ find . -type f -exec grep -Hni recursive {} \;
```

してみたら、しれっと、 `./doc/fswatch.info` にこんな事が書いてあった。

>5.2.1 Peculiarities
>-------------------

>The ('--recursive', '-r') and ('--directories', '-d') options have no
effect when used with the FSEvents monitor since the FSEvents API
already monitors a directory's children by default.[^1]

[^1]: `FSEvents API` は OS X での使用する API。l 

どーりで勝手に再帰的に見てくれやがるわ、、、

仕方ないので、正規表現で長々と exclude 指定して、
取り逃したのを、スクリプト内で捕捉[^2]。

[^2]: どーせ、ファイルの追加と削除の区別が付かんから、パイプしてスクリプト内で弄らないとならんし。

```
$ fswatch -E -e '\.DS_Store|README|20[0-9][0-9]' /PATH/TO/DIR
```

これだと、 ゴミ[^3]と、README.txt とかと、 2015 みたいな年号で始まるファイルやディレクトリを無視してくれる。

[^3]: 不可視ファイルを一挙に exclude しようとして、 `-e '\.|REA...` してもダメだった。なして？
RstudioでRパッケージを作ってみる 2 ～マニュアル作成～

# 目次
1. [RstudioでRパッケージを作ってみる 1 ～自作関数を実行～ - Qiita](http://goo.gl/HKMem0)
2. RstudioでRパッケージを作ってみる 2 ～マニュアル作成～ - Qiita
3. [RstudioでRパッケージを作ってみる 3 ～パッケージ配布～ - Qiita](http://goo.gl/hi8rIw)

#はじめに

前回は自作関数を実行してみました。今回はパッケージのマニュアルを作成してみましょう。

パッケージのマニュアルって何でしょうか？
これです（左下）。
英語ではPackage Documentationと言います。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/89145/9ffc0eb5-7716-972e-e37e-e33963503168.png)

マニュアルは(ホームディレクトリ)/HelloWorld/man以下に保存されている拡張子Rdのファイルです。

マニュアルを新しく作成してみましょう。RstudioのFile > New File > R Documentationを選択します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/89145/b156104f-ede5-5948-d704-1c94da0f9df3.png)

すると、Rdファイルが新しく作成されます。ここで、新しく作成したファイルを既存のRdファイルと置き換えておきましょう。保存ボタンを押すとmanフォルダが開かれるので、そこのHelloWorld.Rdファイルに上書きしておきます。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/89145/1d18ef93-5206-56df-3cd4-2bfcea871dc9.png)

RdファイルはLaTeXに似た構文で記述することが出来ます。
主要な項目を説明しておきますと、以下です。

|項目名                 |説明                 |
|:----------------------|:-------------------|
|name                   |関数の名前           |
|title                  |表題                |
|description            |関数の説明文         |
|examples               |使用例              |

さて、Rdファイルに適当に記入していきましょう。

```
\name{hello}
\alias{HelloWorld}
%- Also NEED an '\alias' for EACH other topic documented here.
\title{
%%  ~~function to do ... ~~
hello
}
\description{
%%  ~~ A concise (1-5 lines) description of what the function does. ~~
It prints "Hello world!" ten times. That's all.
}
\usage{
hello()
}
%- maybe also 'usage' for other objects documented here.
\arguments{
  \item{No argument}{
%%     ~~Describe \code{x} here~~
No argument for this function.
}
}
\details{
%%  ~~ If necessary, more details than the description above ~~
Again, it prints "Hello world!" ten times. That's all.
}
\value{
%%  ~Describe the value returned
%%  If it is a LIST, use
%%  \item{comp1 }{Description of 'comp1'}
%%  \item{comp2 }{Description of 'comp2'}
%% ...
}
\references{
%% ~put references to the literature/web site here ~
[1] www.dummyurl.com
}
\author{
%%  ~~who you are~~
John Doe
}
\note{
%%  ~~further notes~~
This is the note.
}

%% ~Make other sections like Warning with \section{Warning }{....} ~

\seealso{
%% ~~objects to See Also as \code{\link{help}}, ~~~
}
\examples{
# prints "Hello world" ten times
hello()
% Add one or more standard keywords, see file 'KEYWORDS' in the
% R documentation directory.
\keyword{ keyword1 }
\keyword{ keyword2 }
\keyword{ keyword3 }
}
```

これでPreviewボタンを押すと、以下の様に出力されます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/89145/e5b4e46c-84a0-3300-6be9-cd5a6783b3ec.png)



いかがでしたでしょうか？次回は自作パッケージの公開をしてみます。
プロジェクト管理ツール機能比較

# 以下の機能の比較
- asana
- Redmine
- JIRA

## asana
https://asana.com/
商用のTODO管理のサービス。
使いこなせばプロジェクトの管理もできそう。
タスクの開始日を入力できない。
タグ付けや子タスクの追加などの操作が直感的で分かりやすい。

### カレンダー
使いやすい。ここからもタスクを登録できる。

### ガントチャート
Instaganttと連携すると見られる。開始日も入れられる。
http://www.instagantt.com/

### かんばん
なし

### wiki
なし

## Redmine
http://www.redmine.org/
オープンソースのプロジェクト管理ツール。
自分でサーバを立ててインストールする。

### カレンダー
使いづらい。

### ガントチャート
使いづらい。

### かんばん
Backlogsプラグインを入れると使える。
開発が終了している模様。

### wiki
あり。普通に使える。

## JIRA
https://ja.atlassian.com/software/jira/
商用のプロジェクト管理ツール。
10ユーザまでなら1000円/年で使える。

### カレンダー
使いやすい。

### ガントチャート
使いやすい。

### かんばん
使いやすいけど、ユーザーストーリとタスクの区別ができない。

### wiki
Confluenceと連携する。使いやすい。

## まとめ
TODOリストとして気軽に使えるのはasanaだが、プロジェクトをちゃんと管理するとしたらJIRAの方が使いやすい。
Redmineは機能が揃っていてかんばんは一番使いやすいけど、カレンダーとガントチャートの日付を修正できないのが痛い。
uGUIでドラッグについてちょっとだけ詳しく

#実装してみる
##Hierarchy
![DragHierarcy.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/9dd3c52f-487d-14b8-f4d2-701f3ca26688.png)
Canvas追加してそのしたにImageいれました。

##Script
```csharp:TestDrag.cs
using UnityEngine;
using UnityEngine.EventSystems;

public class TestDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
	// ドラックが開始したとき呼ばれる.
	public void OnBeginDrag(PointerEventData eventData)
	{
		Debug.Log(1);

	}

	// ドラック中に呼ばれる.
	public void OnDrag(PointerEventData eventData)
	{
		Debug.Log(2);
	}

	// ドラックが終了したとき呼ばれる.
	public void OnEndDrag(PointerEventData eventData)
	{
		Debug.Log(3);
	}
}
```
こんな感じ。
IBeginDragHandler, IDragHandler, IEndDragHandler３つのインターフェースを継承するのがポイント。
IEndDragHandlerだけ継承してやってみたら反応しなくてちょっと嵌った。
とりあえず、~Handler系を3つ継承すれば大丈夫です。
これをImageにアタッチします。

##Game
![DragGame.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/49db2c15-8058-d748-0ad0-d65f133b5b47.png)
白い画像の上をドラッグすればログがでるよ！

#知っておくとよいこと
##Drag Threshold
![DragEventSystem.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/47cbf13a-4500-457e-d618-0cc68c6cbbcf.png)
ここの設定でどのくらいで移動でドラッグかという設定が行えます。

##スクリーン座標での前フレームからの移動量 eventeventData.delt
```csharp
	// ドラックが終了したとき呼ばれる.
	public void OnEndDrag(PointerEventData eventData)
	{
		Debug.Log(eventData.delta);
	}
```
よく使いそうなのが、OnEndDragでどのくらい量をドラッグしたかということ。
eventData.deltaを使うとよい。戻り値はVector2
これはドキュメントみてもよくわからなかったんだけど「スクリーン座標での前フレームからの移動量」を表しているらしい。
すなわちヒュと素早く移動させたときに値が多くなる。

- 左にヒュとやると(-10.0, 0.0)みたいな感じでxのマイナス値
- 右はその逆
- 上にヒュとやると(0.0, 10.0)みたいな感じでyのプラス値
- 下はその逆

ドラッグでページを切り替えるみたいなときに使いそう。
大体5ぐらいがちょうどいいかも。

##eventData.button

```csharp
	// ドラックが開始したとき呼ばれる.
	public void OnBeginDrag(PointerEventData eventData)
	{
		Debug.Log(eventData.button);
        if (eventData.button != PointerEventData.InputButton.Left) return;

	}
```

ここのbuttonは、InputButton列挙型。Left, Right, Middleがある。
基本的にPCだけだと思うが、マウスなどで「左クリックを押しながらドラッグ」した場合は、「Left」が戻る。
実用的には、Left以外はreturnするなどすればいいかな。

##座標をローカル座標に変換

```csharp
Vector2 localPos = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
    GetComponent<RectTransform>(),
    eventData.position,
    Camera.main,
    out localPos
);
```

CanvasのRender Modeが「Screen Space - Camera」の場合は、上記でlocalPosに変換された値が入る。

---
知っておくとよいことは、まだよくわかっていないんだけど、わかり次第追記していきます。
CakePHP3公式ドキュメントの翻訳が一石N鳥だった件

#概要
私がCakePHP3翻訳を知ったキッカケは、以下の記事を書いた方の呼びかけでした。
[CakePHP3の公式ドキュメントを翻訳する方法](http://coodip.com/articles/3426)

この方の主催している「CakePHP3翻訳会」に参加することになり、
当初自分が想像していたよりも、たくさんの良いことを発見しましたので、書いていきます。

#Nの内訳
##1. 英語が勉強できる
翻訳の際、google先生にはいつもお世話になっていますが、先生の誤訳を直したり、なるべく自力で翻訳できるようにしたりしながら勉強しています。
プルリクエストを出す際も多少、英語で作文をするかも知れません。

##2. Githubでオープンソースにプルリクエストできる
CakePHPのドキュメントはGithubで管理されているので、
フォークします。
コミットします。
（リベースするかも）
プルリクエストします。
これらも業務上必要な知識なので知ってはいましたが、
使ったことの無い機能もありましたので、意外と勉強になりました。
他のオープンソースにプルリクエストを送る練習にもなります。

##3. CakePHP3の勉強になる
業務ではCakePHP2系を使って開発しているので、新機能について勉強になります。
CakePHP3翻訳会では、成果発表をして共有したりもしているので、
他の人が翻訳した機能について知ることができるかも知れません。

##4. CakePHPerと交流できる
翻訳をする上で分からないことは、メンバーに聞く事ができます。
CakePHPをやっている人に悪い人はいない（はず）ので、分からなくてもレクチャーしてくれます。

##5. 翻訳の面白さに気付ける
翻訳すること、翻訳で人が喜ぶこと、オープンソースを支える喜びを知ることができました。

##6. 意識高い感が出る
何も知らない人からすれば、「なんかすげー」って思われること請け合いです。

#後記

当初は翻訳に高い壁を感じていましたが、（英語できないし、コミュ障だし）
参加してみれば壁なんて無く、今では元気に翻訳する姿がそこに。

上で紹介したページに翻訳の参加方法ややり方について記載がありますので、
気になった方がいましたらお気軽にご参加ください。
詳解Swift改訂版を読んで気になった基本的な文法の再確認


[詳解Swift改訂版](http://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Swift-%E6%94%B9%E8%A8%82%E7%89%88-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/4797386258/ref=sr_1_1?ie=UTF8&qid=1451713222&sr=8-1&keywords=swift)が出てきたので、気になった文法を復習がてらまとめていきます。
業務でswiftを使ってはいるものの、swift2.0以降の新しい機能を使ってなかったり、基本的なところで、あまり意識できてなかったところがあったので、そのあたりについてつらつらと書いていきます。

## あんまり意識できていなかった系
### 変数の宣言の仕方
宣言時には、型を明記するより、明記せずに積極的に初期値を設定する(型推論で型の判断)にとどめるのがよい。

```swift
var count: Int = 10 // つまりこちらより、
var count = 10 // こちら

```

### print関数
print関数の引数は異なる型が混じっててもよい


```swift
print(2016, "正月", true)
// "2016 正月 true\n"
```

separator(複数の引数間を区切る文字列の指定)を使うとデバッグの時に便利そう

```swift
print(2016, "正月", true, separator:"; ")
// "2016; 正月; true\n"
```

###配列の初期化のパターン
イニシャライザを呼び出す形での初期化

```swift
var s: [String] = [] //空配列入れるやり方だけでなく
var s = [String]() //イニシャライザでの初期化もある
```

###識別子
予約語はバッククォーテーションで囲むと識別子として利用することができる

```swift
var `var` = 10

```

###for文で複数の変数
for文は複数の変数をつかって、複数の変数に関する値の更新することもできる

```swift
// カンマでくくったm=1やm*=2のとこ
for var i=0, m=1; i<3; i++, m*=2 {
    print("\(i) \(m)")
}
```

###for-in文で条件指定
Swift2.0以降でwhere節で条件指定が可能になった

```swift
for i in 1..<10 where i%2 == 0 {
    print(i, terminator: " ")
    // 偶数だけ表示される
}
```

###do文
ブロック内で変数を定義

```swift
var a = 1
var c = 10
if a >= 0 {
   	{ let t =  a; a = c; c = t} //変数tはこのままだと宣言できずエラー
    print(a)
    print(c)
    
}
```

```swift
var a = 1
var c = 10
if a >= 0 {
    do { let t =  a; a = c; c = t} //エラー解消
    print(a)
    print(c)
    
}
```

ラベルをつかってdo文ブロックからの離脱

```swift
myLabel: do { //ラベル名: myLabel
    for i in 0 ..< 10 {
        if i > 5 { break myLabel } //条件満たしたらdo文ブロックからの離脱
        print("\(i)", terminator: " ")
        // 0 1 2 3 4 5 
}

```

## swift2.0以降の機能でちゃんと使っていなかった系
### guard文
使うシチュエーションは、optional binding(if-let文)と重なるが、optional vindingだと複雑なケースでif文のネストが深くなっていき、それぞれの例外に対しての処理も書いていくと見にくいコードになるが、guard文を使うと、例外的な状況への対応とそこからの離脱(returnやbreak)をコンパクトに記述できるからより見やすくなる。

```swift
let box = ["01", "02", "5", "q", "X"]
for str in box {
    guard let v = Int(str) else { // else{} はguardの条件節を満たさなかった場合に実行される
        print(str + "???")
        break
    }
    print(v, terminator: "  ") // guardの条件節で宣言した定数vを利用することができるのが特徴的
    // 1  2  5  q???
}

```

###nil合体演算子の複数組み合わせ
if-let文の簡易版として??が使われるが、??を複数組み合わせることもできる

```swift
let val = a ?? b ?? c ?? 0
// aがnilじゃないならaの値をアンラップしてを返し、nilなら次はbを評価、bがnilじゃないならbの値をアンラップして返し・・・・
```
foreverコマンドでNodeJSアプリを起動したままにする

# NodeJsアプリをデーモン化する
利点："node app.js"をやらなくていい

## npmでforeverを入れる
```
npm install -g forever
```

## foreverコマンドの使い方
### 起動
```
forever start app.js
```

### 停止
```
forever stop app.js
```

### 再起動
```
forever restart app.js
```

### foreverで実行しているリスト
```
forever list
```
こんなのが出る

```
info:    Forever processes running
data:        uid  command       script forever pid   id logfile                 uptime
data:    [0] ioGt /usr/bin/node app.js 39066   39068    /root/.forever/ioGt.log 0:0:0:13.174
```

### ログ
```
forever logs
```
結果

```
info:    Logs for running Forever processes
data:        script logfile
data:    [0] app.js /root/.forever/ioGt.log
```

### 設定確認
```
forever config
```
結果

```
data:    {
data:      root: '/root/.forever',
data:      pidPath: '/root/.forever/pids',
data:      sockPath: '/root/.forever/sock',
data:      loglength: 100,
data:      logstream: false,
data:      columns: [
data:          'uid',
data:          'command',
data:          'script',
data:          'forever',
data:          'pid',
data:          'id',
data:          'logfile',
data:          'uptime'
data:      ]
data:    }
```

## まとめ
foreverコマンドはstartしたらずっと動いてるので、便利。
便利だけど、ずっと動いてるので使い方忘れそう。
オプションもあるから、使えそうなら使ってみる。
RstudioでRパッケージを作ってみる 1 ～自作関数を実行～

# 目次
1. RstudioでRパッケージを作ってみる 1 ～自作関数を実行～ - Qiita
2. [RstudioでRパッケージを作ってみる 2 ～マニュアル作成～ - Qiita](http://goo.gl/vCyszM)
3. [RstudioでRパッケージを作ってみる 3 ～パッケージ配布～ - Qiita](http://goo.gl/hi8rIw)

#はじめに

Rをある程度使ったことのある方なら、パッケージを導入したことがあるかと思います。

```r
require(ggplot2)
library(dplyr)
```

このパッケージ、実は自作も可能ってご存知でしたか？
今回はRstudioを使ってパッケージをお試しで作ってみようと思います。

#パッケージを自作

まず、RstudioのFileメニューからNew Projectを選びます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/89145/b0463567-b711-5c1b-995d-1a053ff5425a.png)

New directoryを選択します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/89145/d6fe47eb-0e2b-0103-83af-3131a37cb2f4.png)

R packageを選択します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/89145/a4d1b292-7fe2-845a-1e2d-3a5c4c327af2.png)

Package Nameを入力します。ここではHelloWorldとしました。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/89145/87bc57d1-3026-1b30-7db0-d353e6afa21d.png)

Create Projectを押すと、パッケージの作成画面が開きます。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/89145/a976345f-f84f-daf8-d9c3-e779fbe08280.png)

1. パッケージの中身が表示されています。
2. Buildペインで、パッケージのビルドができるようになっています。

ここで、既にHello worldを表示するプログラムが出来上がっていますが、このままでは面白くないので一捻り加えましょう。

```r
hello <- function() {
  # Hello world を10回表示
  for(i in 1:10){
    print("Hello, world!")
  }
}
```

ここで、BuildペインのBuild & Reloadボタンを押すと、ビルドが始まります。Consoleに> library(HelloWorld)と表示されるはずです。作成されたパッケージがRに読み込まれました。さあ、hello()とタイプして関数を起動してみましょう。

```r
> hello()
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
```

無事パッケージ内の自作関数が起動されました。


次回はマニュアルの執筆について書きます。それでは！
Apache FlexでHelloWorldアプリを作り、配布できるようにパッケージングするところまで（AIR for Desktop）

# はじめに

Apache Flex を使って、Hello Worldを表示するデスクトップアプリを作成します。
また、配布できるようにパッケージングするところまでの手順を書きます。
今回は、IDEは利用せずに、コマンドプロンプトにてコンパイル等を行います。

## アプリの完成イメージ

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/9b762a6b-c405-64ef-e2b3-2e53ac6b58ea.png)

## 試した環境/バージョン

Windows 10
Apache Flex 4.16.1
Adobe AIR 32.0.0.116


# 環境作成

環境作成の手順は以下を参照
[Apache FlexでAdobe AIRアプリを作るための環境作成（zipを利用する場合）](https://qiita.com/lune1122/items/67dc781aa66fb4391736)

# Hello World アプリの作成、実行

## 作業用フォルダーの作成

任意の場所にフォルダーを作成する
（今回は、MyApplicationというフォルダー名でフォルダーを作成）

## mxmlの作成

srcフォルダーを作成し、その下に以下のMain.mxmlを作成する
（Apache Flexでは、アプリの画面デザインをMXMLで、処理をActionScriptで記述する）

```mxml:Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       width="400" height="300">

    <fx:Style>
        * { 
            font-family: "Meiryo";
        }
    </fx:Style>

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;

            /**
             * アラートを表示する処理
             */
            private function showMessage():void {
                // アラートを表示
                Alert.show('Hello World');
            }
        ]]>
    </fx:Script>

    <!-- ラベル -->
    <s:Label left="10" top="10" text="Click the button."/>

    <!-- ボタン -->
    <s:Button left="10" top="40" label="Click Me" 
        click="showMessage();" />

</s:WindowedApplication>
```

## コンパイル

コマンドプロンプトで以下を実行するとMain.swfが作成される

```
> amxmlc src/Main.mxml -output Main.swf
```

## application.xmlの作成

以下のxmlを作成する

```application.xml
<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/32.0">
	<id>MyApplication</id>
	<versionNumber>1.0</versionNumber>
	<filename>MyApplication</filename>
	<initialWindow>
		<content>Main.swf</content>
		<requestedDisplayResolution>high</requestedDisplayResolution>
	</initialWindow>
</application>
```

## アプリの実行

コマンドプロンプトで以下を実行するとデスクトップアプリが起動する

```
> adl application.xml
```

# 配布できるようにパッケージング

## 証明書の作成

コマンドプロンプトで以下を実行
※最初に作成するときの１回のみ実行する

```
> adt -certificate -cn "TestCert" 2048-RSA "TestCert.p12" pass
```

TestCert.p12が作成される

## パッケージング

コマンドプロンプトで以下を実行

```
> adt -package -tsa none -storetype pkcs12 -keystore "TestCert.p12" -storepass pass Main.air application.xml Main.swf
```

Main.airが作成される

このMain.airを実行することで作成したアプリをインストールすることができる
（インストール、アプリの実行にはAdobe AIRのインストールが事前に必要だが、WindowsとMacの両方のOSに対応）

## Adobe AIRを内包してパッケージングしたい場合

もし、Adobe AIRを内包してパッケージングしたい場合は以下

```
> adt -package -tsa none -storetype pkcs12 -keystore "TestCert.p12" -storepass pass -target bundle Main application.xml Main.swf
```

Mainフォルダーが作成される
Mainフォルダーの下にあるMyApplication.exeを実行することでアプリを実行できる
（アプリのインストール作業が不要となり、また、Adobe AIRのインストールをしなくてもアプリを実行することができる）

とりあえず今回はここまで
XenServerでOSを複製するときの注意点

# XenServerでOSを複製した際、MACアドレスまで複製してしまう
調べてみると、Ubuntuには起こらず、Minimal CentOSにのみ起こる問題らしい。。。

`Ubuntu仮想マシンでは、生成ルール内にVMwareやHyper-Vといった仮想環境上ではインターフェースとMACアドレスの関連付けを行わないように、例外が設定されているためです。`

### 以下の設定でこれを解決する
1. /etc/sysconfig/network-scripts/ifcfg-eth0を編集してHWADDRの設定行を削除

2. /lib/udev/rules.d/75-persistent-net-generator.rulesを開いて、以下の行を指定箇所に追記

```
# ignore VMWare virtual interfaces
ENV{MATCHADDR}=="00:0c:29:*|00:50:56:*", GOTO="persistent_net_generator_end"
```

これでnetworkをrestartすれば、ネットワーク問題を発生させずに複製できる。
werckerで複数の環境にdeployする

werckerから例えばawsのtokyoとvirginiaの環境に同時にdeployしたい場合。

### deploy targetの登録
`staging`(tokyo) と `staging-us`(virginia) という名称で登録した例

<img width="600" alt="スクリーンショット 2016-01-14 19.48.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/10256/749e40d4-6d92-d16f-78e5-15e3a2c9b6b2.png">

### wercker.yml

deploy stepsは、サンプルなどでは、

```yaml
deploy:
  steps:
    - hotakasaito/elastic-beanstalk-deploy:
        key: $AWS_ACCESS_KEY_ID
        secret: $AWS_SECRET_KEY
        app_name: app01
        env_name: stg
        region: ap-northeast-1
```

と書いているところを以下の様にstepsの変わりにdeploy target毎に書ける(elasticbeanstalkにdeployする例)。

```yaml
deploy:
  staging:
    - hotakasaito/elastic-beanstalk-deploy:
        key: $AWS_ACCESS_KEY_ID
        secret: $AWS_SECRET_KEY
        app_name: app01
        env_name: stg
        region: ap-northeast-1

  staging-us:
    - hotakasaito/elastic-beanstalk-deploy:
        key: $AWS_ACCESS_KEY_ID
        secret: $AWS_SECRET_KEY
        app_name: app01
        env_name: stg-us
        region: us-east-1
```

### deploy
gitのdevelopブランチにpushされたら自動でdeployするように設定をしておけば以下の様に複数deployが動く。

<img width="600" alt="スクリーンショット 2016-01-14 19.56.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/10256/42215d51-8bc5-60cc-ce62-a0fd943d96fa.png">
Edison(busybox)のshで終了ステータスで条件分岐するときの注意


- pingを実行し続けて、応答が返ってくるまで待機するという動作をさせたい
  - ネットワークアダプタが通信状態になるのを待ったりとか
- Macのbash(GNU bash, 4.3.42)だと以下のコードが期待通りの動きをする
- Edisonのログインシェルで、スクリプトをワンライナーとして実行すると期待通りの動作をする
- スクリプトをファイルに書いて、`sh ping.sh`とすると、`[ "$?" -eq 0 ]`の結果がなぜか必ずtrueになってしまい期待通りの動作をしない

```ping.sh
#!/bin/sh
while :
do
  ping -c 1 8.8.8.8
  if [ "$?" -eq 0 ]
  then
    echo "network connected"
    break;
  else
    sleep 1
  fi
done
```

- 以下のように終了ステータスをいちど変数に書き出したら期待通りの動作になった

```ping.sh
#!/bin/sh
while :
do
  ping -c 1 8.8.8.8
  ping_status="$?"
  if [ $ping_status -eq 0 ]
  then
    echo "network connected"
    break;
  else
    sleep 1
  fi
done
```

なんなんだろうこれ。
MEMO: Veertu の boot2docker で HDD のセットアップをする

### IP アドレスを調べて SSH でログインする。

```bash
root@boot2docker:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 76:6D:78:96:A3:20
          inet addr:192.168.64.10  Bcast:192.168.64.255  Mask:255.255.255.0
          inet6 addr: fe80::746d:78ff:fe96:a320/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:101 errors:0 dropped:0 overruns:0 frame:0
          TX packets:103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:12069 (11.7 KiB)  TX bytes:14451 (14.1 KiB)
```

```bash
$ ssh docker@192.168.64.10 -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
docker@192.168.64.10's password:
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.9.1, build master : cef800b - Fri Nov 20 19:33:59 UTC 2015
Docker version 1.9.1, build a34a1d5
docker@boot2docker:~$ 
```

### HDD をセットアップをする

```bash
docker@boot2docker:~$ curl -OL https://raw.githubusercontent.com/ailispaw/boot2docker-xhyve/master/contrib/makehdd/makehdd.sh
docker@boot2docker:~$ chmod +x makehdd.sh
docker@boot2docker:~$ sed -i 's/vda/sda/g' makehdd.sh
docker@boot2docker:~$ sudo ./makehdd.sh
docker@boot2docker:~$ sudo shutdown -h now
```

### 起動ディスクを DVD-ROM にする

![Screenshot_1_14_16__7_11_PM.png](https://qiita-image-store.s3.amazonaws.com/0/65768/46487395-beff-2160-89eb-7446b67d7e18.png)

### 起動する

![Screenshot_1_14_16__7_13_PM.png](https://qiita-image-store.s3.amazonaws.com/0/65768/7e751f59-82e3-4651-f656-83a812209169.png)
El Capitanでport install gnuplotがコケる場合

## 事案

```bash
$ sudo port install gnuplot
```

が失敗する。

## 環境

```bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.2
BuildVersion:	15C50
```

```bash
$ uname -rs
Darwin 15.2.0
```

```bash
$ port version
Version: 2.3.4
```

## 調査

```bash
/opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_aqua_aquaterm/aquaterm/main.log
```

を見ると

````log
:info:build Exception: Unable to lookup com.apple.CoreSimulator.CoreSimulatorService in the bootstrap.
```

とのこと。このエラーメッセージでググる。

# 解決

[Build failures after upgrading to Xcode 7.2](https://trac.macports.org/wiki/ProblemHotlist#xcode7.2)によると以下のコマンドをたたくがよろしとのこと。

```bash
$ sudo chmod -R g-w $(xcode-select -p)/Library/PrivateFrameworks/CoreSimulator.framework/Versions/A/XPCServices/com.apple.CoreSimulator.CoreSimulatorService.xpc
$ sudo chown -R root:wheel $(xcode-select -p)/Library/PrivateFrameworks/CoreSimulator.framework/Versions/A/XPCServices/com.apple.CoreSimulator.CoreSimulatorService.xpc
```

うまくいった！