OmniAICreator/Qiita-1.07M huggingface dataset:
S3でIP制限

S3でIP制限

静的なファイルの配置先としてS3を利用している場合、アクセス制限などを設けたい場合があります。どこからでもアクセスできるとセキュリティ的にもコスト的にもあれあので。
今回は特定のIPのみを許可する方法です。

		
##実現方法
S3管理画面、特定のバケットの選択、プロパティを選択、
アクセス許可の欄より、バケットポリシーの編集をクリック

以下にてバケットポリシーを生成します。
http://awspolicygen.s3.amazonaws.com/policygen.html

説明は以下
![s3.png](https://qiita-image-store.s3.amazonaws.com/0/8972/50df453f-36a6-fb80-ce4a-a5c20160b202.png)


- Select Type of Policyは「S3 Bucket Policy」を選択
- Effectは「Deny」
- Principalは「`*`」アスタリスクですべて
- AWS Serviceは「Amazon S3」
- すべてのアクセスに適用させたいなら「All Actions」にチェック
- Amazon Resource はバケット以下が対象なら「`arn:aws:s3:::yourBucketName/*`」のような形で
- 「Add Conditions (Optional)」をクリックでIP制限を追加
- Condition　「NotIpAddress」を選択
- Keyは「aws:SourceIp」を選択
- Valueは許可したいIPアドレスを入力
- 「Add Condition」で追加
- 「Add Statement」で正式に追加
- 複数IP追加したい場合は再度Add Conditions (Optional)で上記手順

最後に「Generate Policy」にて生成され、
S3のバケットポリシーエディターに貼り付け保存。


##生成されたソースの例

```json
{
	"Version": "2012-10-17",
	"Id": "Policy*************",
	"Statement": [
		{
			"Sid": "Stmt**********",
			"Effect": "Deny",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": "arn:aws:s3:::yourBucketName/*",
			"Condition": {
				"NotIpAddress": {
					"aws:SourceIp": "192.0.2.0/24"
				}
			}
		}
	]
}

```

##最後に確認
###許可IPからのアクセスの場合
ファイルにアクセス可能
###NGの場合、以下のXMLレスポンス
AccessDenied

```xml
<Error>
 <Code>AccessDenied</Code>
 <Message>Access Denied</Message>
 <RequestId>2EE0407CB8D16397</RequestId>
 <HostId>
 ******************************************************
 </HostId>
</Error>
```
VagrantのrailsにNATで接続

何が原因かずっと悩んでおりましたが、ようやく複合要因であった事が分かりました。

原因は以下の通りです。

<blockquote>１：ufwでiptablesの設定をoff(disable)にしていなかったため、外部からのアクセスを遮断されていた。

２：HOSTが定義されていなかったためLOCALHOST:portでアクセス出来なかった。

３：Marvericsの不具合のためVirtulBoxがリロード出来ていなかった。</blockquote>

ということで、

<blockquote>１：ufwでiptablesの設定を切る（あとからshellに書き込む）

２：Vagrantfileに固定ip（プライベートアドレス）を書き込む

３：Vagrantfileにホストネームを定義する（実は既にherokuで定義されていたからしなくても良さそう）

４：VirtulBoxのシャットダウンをコマンドラインで強制的に行う</blockquote>

を行った所、Mac側のブラウザからアクセス出来ました。

参考にしたのは

[Vagrantでお手軽にVMを作っては壊し作っては壊す](http://kb1111.blogspot.jp/2013/07/vagrantvm.html)

[Mavericksを変更後にVagrantでエラー…](http://blog.mizoshiri.com/archives/1821)

の二つです。

何となくですが、ホストネームとかやらなくても良さそう。ちゃんとやらないと行けないのはVagrantfileを定義した後にvagrant haltでシャットダウン出来ない事やvagrant reload出来ない可能性がある事を理解して、Virtulbox側の強制終了を行う事が重要な気がしました。

ようやく、次のアプリケーション構築に進めそうです。

#追記

その後、Vagrantfileをいじって色々試しましたが、結果は以下の通りです。

- 1:ホストネームの再定義は関係なかった。
- 2:ufwについてはシェルで既にiptables -Fをやっていたので関係なかった

ということで、プライベートアドレスの付与とVirtulBoxのプロセスをダウンさせられなかった事による物と考えられます。
Vagrantは開発環境として本当に有効

これは思い出話です。

Ruby on Railsで環境を用意しようとしていた時期もありますが、環境を作り込む時に壊れてにっちもさっちもいかなくなっているという状態でした。そんな時、[トレタCTOの増井さん](https://twitter.com/masuidrive)さんに[Vagrant](http://www.vagrantup.com/)を教えていただき、環境を壊してもすぐに再構築出来る様になりました！

（その節も増井さんありがとうございました！）

ただ、ここで少しだけ罠があるので、注意だけ。

単純にネットを検索して色々なサイトでVagrantのインストールの仕方が掲載されていますが、やはりVagrantの公式マニュアル（ヘルプサイト）をしっかり読んでその通りにやって行く様にするのが第一段階です。とくにVagrantfileを作りますが、これは昨年の途中にv2に移行してしまったため、たとえば[heroku用のGithub](https://github.com/ejholmes/vagrant-heroku)に書かれている様に

```Vagrantint
Vagrant::Config.run do |config|
  config.vm.box = "heroku"
  config.vm.box_url = "https://dl.dropboxusercontent.com/s/rnc0p8zl91borei/heroku.box"
end
```

としてしまうと、これはv1の記述なのですが一応動きますが、PortをローカルからVM上へ転送しようとするforwarded_portという記述を追記した場合はエラーがでます。

したがってPort等を転送したい場合は書き方としても以下のように変更する必要があります。

```
Vagrant.configure("2") do |config|
  config.vm.box = "heroku"
  config.vm.box_url = "http://dl.dropbox.com/u/1906634/heroku.box"
  config.vm.network :forwarded_port, guest: 3000, host: 4000
end
```

また、.boxと書いてある所も最新版が常に更新されているので、.boxファイルが格納されている所をから落とす様にしてください。

例：[http://www.vagrantbox.es/](http://www.vagrantbox.es/)

さらに、[VirtualBox](https://www.virtualbox.org/wiki/Downloads)も最新版だとheroku.boxが古いため上手く動かない可能性があります。ターミナル等に表示されると思いますが、[v4.3.28](https://www.virtualbox.org/wiki/Downloads)をダウンロードして使ったりすると良いかもしれません。2014年11月30日現在、virtulboxをv4.3系に上げつつubuntsのversionも最新にしても動いているので、scriptや.boxファイルを間違えなければ動くと思われます。(AngularJSを最近は入れている関係で、CentOS6.5に変更済み）

このように常に進化中のため、きちんと公式ドキュメントを追っかけておかないと駄目だったりするような気がします。

今回は手軽にherokuを使う為にこちらを選択していますが、同じPaaSのEngineYardをVagrantで使うという荒技もあるみたいです。

EngineYard Blog : [Permanent Link to Travis CI上でPHPアプリのWebベースのテストを自動化する](http://www.engineyard.co.jp/blog//2014/testing-php-app-with-selenium-on-travis/)

最近はHerokuが相当強化されたのでHerokuで本番まで動かすことは十分に可能になりましたね。

こんな感じで、細かい所を気にする必要があるのがRails関連の玉に傷な所ですが、スクラップアンドスクラップにならなくなっただけ、Vagrant様々っていった所です。

ですので、お手軽に開発環境をローカルに作って、サクサクでもしたいなんて時には本と便利で良いと思います。

是非使ってみて下さい。

[実践 Vagrant](http://amzn.to/1MTcccW)
better_errorsの罠

デバッグにハマっていた時が一年ほど前にあり、良いデバッグツールが無いかなと思っていた処、トレタCTOの増井さんの記事を見つけました。

[第4回 デバッグお役立ちツール『Better Errors / Rails Footnotes』](http://www.school.ctc-g.co.jp/columns/masuidrive/masuidrive04.html)

上記の内容の通り、bundlerでインストール開始。

すんなり行きましてerrorを出したものの画面が変更しない。なんでかなと思ったら、Qiitaにありました。

[better_errorsがvagrantで動作しない対処](http://qiita.com/osamu1203/items/c72a1b2c27ac3e02cb15)

Vagrantだとデフォルトダメっぽいので、これを追記したら変更されました。
Asset filtered out〜っていうエラーが出た場合の対処。

Asset filtered out and will not be served: add <code>Rails.application.config.assets.precompile += %w( books.css )</code> to <code>config/initializers/assets.rb</code> and restart your server

ていうエラーが昨日から出ていまして困っていましたが、Rails4.1特有の事象みたいです。

解決方法は

```ruby:config/environments/development.rb

config.assets.raise_runtime_errors = <span style="color: #0000ff;">ture</span>
```

を

```rb:config/environments/development.rb
config.assets.raise_runtime_errors = <span style="color: #ff0000;">false</span>
```

に書き換えます。
その後Ｗｅｂサーバだけ再起動して、アクセスすれば動きます。

[Ruby on Rails 4アプリケーションプログラミング](http://amzn.to/1L7NCXS)

の159pですので皆さんお気をつけ下さい。あと結構この本誤植があるので、都度読み替えないとダメっぽいです。
COBOL　>>　Ruby(on Rails)　>>　Go(revel)　>>　JavaScript(AngularJS + YEOMAN)

元々COBOL85やヘタすればCOBOL2を書いていたときがある。そのため、オブジェクト指向を把握出来る様になるまでかなりの時間を要してしまった。

で、自社のメインとなる言語は何が良いか必死に考えた時に色々と出したのが、

- 最も開発者の多いJAVA。Libraryが豊富。でもモダン開発に向くかというと不明。
- 取っ付き易く、開発者も多いphp。でもhtmlの中にかけるので可読性が低い。
- LLのなかでインデントでプログラムの開始位置が判断されるPython。フレームワークがあんまりない。
- 流行りのRuby。書きやすい。Railsはフルスタックフレームワークとして優秀。

と、色々考えたのですが、Frameworkも含めて考えた方が良いよなぁということで、JavaBeansでもJ2EEでも、CakePHPでも、Djangoでもなく、Railsにしようと考えましたが現在はまた違います。

生産性考えると、大量に人掛けられるならJAVA 一択なんですが、そういうわけでもなくphpも構文があんまり好きじゃない、Pythonでも良かったしインデントを綺麗にするのは嫌いじゃなかったのですが、フレームワークがあれじゃなぁとRubyかなと考えた。

やっぱり日本人は日本人が作った物選ぶべきかなというのもあるし、勉強していくと構文自体にあまり迷いがないので、Pythonより楽で良いなというのが感想です。

しかし、最近だとJavaScriptがCORDOVA含めてめちゃくちゃ凄くて、PhoneGapしか知らない人だと”何やねん”なんですが、angularJS とそのフルスタックフレームワークであるYEOMANまで含めて考えるとかなり凄い。あと、最近で試したのはGo+revelですね。こちらもフルスタックフレームワークですが、ActiveRecordが無いのでダイレクトにSQL書かないと動きません。そこは面倒ですね。

Goとか出やる場合はPaaSとかで動かすことを前提としているのかもしれませんね。

ちなみに、修得するならJAVAは複雑すぎて昔諦めたし、COBOLerからのRybyは案が良いかもしれません。サイバーエージェントさんは新人研修でJAVAを教えるらしいですが、それは企業規模が大きくなったからですね。その時は複数人で開発するのでJAVAが非常に適していると思います。エンタープライズになればなるほどJAVAは適しているし、何よりも実績が豊富です。

ちなみに、COBOLはOpenCOBOLが出来るまで有償コンパイラでした。Frameworkも各社の社内用で持っていたり（日立はCanDoと言っていた）とやっぱりメインフレームは偉大だなあと思ったりします。

現在の最新のCOBOLさんはこんな感じです。

<h5><a href="http://www.cobol.gr.jp/" target="_blank">COBOL コンソーシアム</a></h5>

最新はCOBOL2002って奴です。富士通さん、NetCOBOLなんて作ったり、COBOL技術者の為のJAVAとか涙ぐましい努力をされています。COBOLはECMAScriptに準拠したCOBOLScriptも実装してますし、オブジェクト指向にも対応していて、英語で書けるというのがすごい！！

というのが売りなんですが、定義の仕方が現在のプログラムとかけ離れている（identification division, enviroment division, data division, procedia division）ため、データの型から定義とか面倒だったりします。

こういうのからするとRubyとか神みたいなプログラムです。定義の定義って何よとか言わなくて済みます。書けば何か動くし、書き方にクセが少ないので、取っ付きやすい。インデントが無いのも嬉しいです。（COBOLにもインデントは無いですが、習った時からインデントにはうるさかった・・・）

とひとしきり感動してましたが、Railsで毎回手を焼いています。単体では動いたのですが、Git経由でアップロード掛けようとしても動きません。多分インストールの手順違いなんでしょうけれども・・・、という時代も過ぎ、普通にRailsチュートリアルを手順通りにやれば動くし、みたいな。

今は先日も書きましたが、AngularJS+Yeomanですからね、やろうとしたの。
ということで、一年前の記事を焼きなおしてみました。
中古のMacBookAirを購入したのでセットアップメモ。


以前のMacBook Air が Late2010 という古物だったけどだいぶ我慢して使っていた。Sofmapにふと行った時に今の最新と比べたらスペック不足だが自分のよりは天地の差があったのが手頃だったので買いました。せっかくなのでメモを取りながらセットアップします。

# 新旧比較

| -   | 型番                  | CPU               | Mem | HDD       | Price    |
|:----|:---------------------|:------------------|:---|:----------|:---------|
| 旧型 | MC505J/A (Late 2010) | Core 2 Duo 1.4GHz | 2GB | 64GB-SSD  | 25Kで売却 |
| 新型 | MC968J/A (Mid 2011)  | Core i5 1.6GHz    | 4GB | 128GB-SSD | 55Kで購入 |

# Yosemiteまで

* とりあえず購入したらHDDクリーン主義なのでCommand-Rで起動してディスクユーティリティで消去
* そのあと復元メニューから Lion をインストール
* しかしこれをスタバでやったことでWifiの認証がとれず _電源OFF_ って帰宅。
* 帰宅後、再度Command-Rで起動すると復旧メニュー起動せずWifiのAPを選択がまず表示されその画面でハマる。
* ネットで調べるとまさに↓の状況

https://discussionsjapan.apple.com/thread/10096076

* うちのWifiだとそもそもAP発見できない。WPA／WPA2の設定変えたりAP名を変えたりでようやくAPが選択に現れるもPASS入れたところで無反応。まさに↑のURLの状態...
* あーあ、StoreのSupportに持ち込みかなと思ったけど、ふとiPhoneのテザリングでやったらどうかなと思って試した。
* あっさりできて復旧メニュ起動した。ヽ(^◇^*)/
* 復旧メニューまでくると通常に自宅のAPに接続できあとはLionインストール
* すぐさまYosemiteにアップデート

# appのインストール

* xcode
	* Cocoapod - https://cocoapods.org/

```
$ sudo gem install cocoapods
```

* Homebrew - http://brew.sh/
	* tmux

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install tmux
```

* Perlbrew - http://perlbrew.pl/

```
$ \curl -L http://install.perlbrew.pl | bash
$ cat ~/perl5/perlbrew/etc/bashrc >> .bashrc
$ perlbrew install perl-5.22.0 
$ perlbrew switch perl-5.22.0
$ perlbrew install-cpanm
```

* nodebrew - https://github.com/hokaccha/nodebrew

```
$ curl -L git.io/nodebrew | perl - setup
$ nodebrew install-binary stable
$ nodebrew use v0.12.4
```

* iStats
* Chrome
* iTerm2
* Kobito
* DropBox
* SublimeText - http://www.sublimetext.com/3
	* package control - https://packagecontrol.io/installation
		* flatland thema - https://github.com/thinkpixellab/flatland
* AWS CLI - http://docs.aws.amazon.com/cli/latest/userguide/installing.html

```
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
```

* bitbucket - https://bitbucket.org/
	* SourceTree - https://www.sourcetreeapp.com/
* MySQL - http://dev.mysql.com/downloads/mysql/ 

```
$ sudo tar -zxvf mysql-5.6.25-osx10.9-x86_64.tar.gz -C /usr/local/
$ cd /usr/local
$ sudo ln -s mysql-5.6.25-osx10.9-x86_64 mysql
$ cd mysql
$ sudo mkdir /var/mysql
$ sudo ./scripts/mysql_install_db --datadir=/var/mysql
$ sudo chown -R _mysql /var/mysql
$ sudo ./support-files/mysql.server ./bin/
$ sudo vim ./bin/mysql.server # datadir=/var/mysql
$ sudo ./bin/mysql.server start
```

* Elasticsearch - https://www.elastic.co/
	* JDK

```
$ unzip elasticsearch-1.6.0.zip
$ mv elasticsearch-1.6.0 elasticsearch
$ cd elasticsearch
$ vim config/elasticsearch.yml #http.port: 9200
$ ./bin/elasticsearch
```

* Office2011

とりあえずいつも作業するにはほぼ困らない程度に元に戻った。
最新のairのスペックには見劣りするがかなり快適になりました。
VBScriptでエンコードを指定してファイルを連結する

##目的
VBScriptでエンコードを指定してファイルを連結するスクリプトを記述する

##スクリプト

```vbnet:jointext.vbs

'* 指定ディレクトリの検索を行う
'* @param [in] searchPath 検索対象のパス
'* @param [out] fileList  パスを格納するコレクション
'* @param [in] targetExt  検索対象の拡張子
'* @param [in] excludeDir 検査対象のディレクトリ名
Sub SearchFile(ByVal searchPath , ByRef fileList, ByRef targetExt, ByRef excludeDir)
    Dim fso
    Dim oFile
    Dim oDir
    Dim oSubDir
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oDir = fso.GetFolder(searchPath)

    For Each oSubDir In oDir.SubFolders
        If Not excludeDir.Contains(oSubDir.Name) Then
            SearchFile searchPath & oSubDir.Name & "\", fileList, targetExt, excludeDir
        End If
    Next

    For Each oFile In oDir.Files
        If targetExt.Contains(fso.GetExtensionName(oFile.Name)) Then
            fileList.add searchPath & oFile.Name
        End If
    Next

End Sub

'* エンコードを指定してファイルを読んで出力ストリームに書き込む
'* @param[in] path 入力パス
'* @param[in] enc  エンコード
'* @param[out] outStream 出力ストリーム
Function ReadAndAppend(ByVal path, Byval enc, Byref outStream)
    Dim inStream
    Set inStream = CreateObject("ADODB.Stream")
    inStream.type = 2            '1:バイナリデータ 2:テキストデータ
    inStream.charset = enc       '入力ファイルの文字コード設定
    inStream.open
    inStream.LoadFromFile path   '入力ファイルを読み込む

    outStream.WriteText "// copy... " & path, 1
    outStream.WriteText inStream.ReadText(-1), 1   'WriteTextの第二引数：0:文字列のみ書き込む 1:文字列＋改行を書き込む

    inStream.Close
    Set inStream = Nothing

End Function

Dim objParm
Dim searchPath
Dim fileList
Dim excludeDir
Dim targetExt
Dim enc
Dim outputFileName
Set fileList = CreateObject("System.Collections.ArrayList")
Set excludeDir = CreateObject("System.Collections.ArrayList")
Set targetExt = CreateObject("System.Collections.ArrayList")
Set objParm = Wscript.Arguments
If objParm.Count < 3 Then
   WScript.echo "CScript jointext 検査対象のフォルダ 出力パス エンコード"
   WScript.echo "例： CScript jointext.vbs C:\dev\WSH\jointext\js\ out2.txt UTF-8"
   WScript.Quit
End If

targetExt.add "js"

excludeDir.add ".svn"
excludeDir.add ".git"

searchPath = objParm(0)
outputFileName = objParm(1)
enc = objParm(2)

SearchFile searchPath, fileList, targetExt, excludeDir

fileList.Sort

Dim outStream
Set outStream =CreateObject("ADODB.Stream")
outStream.type = 2
outStream.charset = enc '出力ファイルの文字コード設定
outStream.open 


Dim f
For Each f In fileList
   WScript.Echo f
   ReadAndAppend f, enc, outStream
Next

outStream.SaveToFile outputFileName, 2
outStream.Close
Set outStream = Nothing

```

##実行例

```
CScript jointext.vbs C:\dev\WSH\jointext\js\ out2.txt UTF-8"
```

C:\dev\WSH\jointext\js\ 以下のJavaScriptを連結して出力する。
この時、.gitや.svnはフォルダは見ない。
windows8.1 に python3 を導入する

導入しようとしたらいろいろてこずったのでメモ。

###やりたいこと
windows8.1上でpython3をvenv使って動かす。
pythonは統計処理のために使おうとしている。

###必要だったこと
・python3 のインストール
・自分の使いたいライブラリーのインストール
以上。

###つまずいた原因
pip / easy_install にこだわりすぎた
最初にpython3.4 インストールして、venv でpython 開けるようにするまではよかった。
そのあとnumpy とか scipy とかいれるのにはまった。
まず、pipだとコンパイルが必要なやつはインストールできないらしい。(正確には違うかもだが)
Visual Basic C++ とかをインストールする方法もあるみたいだけど、今回は別の方法を捜索。
easy_install で普通にできるよーって書いてあるサイトもあったけど、なぜか動かなかった。
wheel 形式のファイルをダウンロードしてきて、easy_install ファイル名.whl ができなかった。
結果、exe ファイルをそのままダウンロードして導入することに。
欲しかったのは、numpy/scipy/matplotlib/pandas あたりだったので探した。
scikit-learnとかはnumpyとか必要なの入れたあとにpipで入れられるようになる。

以下、リンク集。pythonの種類に合わせて3.4とか2.7とか選んでいただければ。
あと、32って書いてあるから32ビットでしか動かないのかなーと思って最初避けてたらどうやら64でも動く様子。
というか自分の環境下(windows8.1 64ビット)でも動いた。 
[numpy](http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/)
[scipy](http://sourceforge.net/projects/scipy/files/scipy/0.16.0b2/)
[matplotlib](http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.4.3/windows/)
[pandas](https://pypi.python.org/pypi/pandas/0.16.2/#downloads)

これでインストールする際に、自分のvenv環境のところを指定すれば動くようになる。
指定し忘れた場合は
Python34/Lib/site-packages
の中にあるnumpyとかを自分のvenvのsite-packagesにコピーすればよい。

だいぶ面倒だし、もっと良い方法もあるはずだが、とりあえず動くようにはなった。
Windows でVimの設定するときにつまずいたとこ

パソコンを買い替えて環境が変わったので、vim使ってみようと思って設定始めたらめっちゃつまずいたので備忘録的に。

###つまずいたとこ
NeoBundle 使ってプラグインの管理しようとしたとき
現象としては、NeoBundle がコマンドモードで認識されない
という状態だった。

###対処方法
vimrc のNeoBundle のところを変更する。
```
set runtimepath+=~/.vim/bundle/neobundle.vim
call neobundle#begin(expand('~/.vim/bundle/'))
```
ここが相対パスになってるから絶対パスに変更すればよかった。
実際変えたら動いた。
ねこゆきさんありがとうございました。

###学んだこと
エラーメッセージ読むの大事。
エラーメッセージで問題起こっている場所をある程度特定して、内容を検索するとだいたい先人の知恵の恩恵を受けれる。

###参考にしたサイト
[NeoBundleを用いたVimプラグイン管理と色設定メモ](http://qiita.com/muran001/items/3080c4816b7c2e65e40b)
[Vim pluginへの入門](http://qiita.com/muran001/items/3080c4816b7c2e65e40b)
[<Vim, NeoBundle> NeoBundleの導入。](http://nekoyukimmm.hatenablog.com/entry/2015/04/05/000709)
MacOSX（10.10.3）にPlone（4.3.6）をインストールする


## 参考URL

* http://docs.plone.org/manage/installing/installation.html#installing-plone-from-source-on-os-x

## ライブラリのインストール

上記のドキュメントを参考に、必要なライブラリをインストール

```
brew install libxml2 libxslt
```

## ソースコードのダウンロード、展開

### ダウンロード

* https://plone.org/products/plone/releases/4.3.6

### 展開

```
tar -xvzf  Plone-4.3.6-UnifiedInstaller.tar
cd Plone-4.3.6-UnifiedInstaller/
```

## Ploneのインストール

### インストール

/usr/local/user_installed/Plone にインストールする。

```
./install.sh --target=/usr/local/user_installed/Plone standalone
```

インストールに成功すると管理画面用のユーザー名とパスワードがコンソールに出力される。

``` 
#####################################################################
######################  Installation Complete  ######################
 
Plone successfully installed at /usr/local/user_installed/Plone
See /usr/local/user_installed/Plone/zinstance/README.html
for startup instructions
 
Use the account information below to log into the Zope Management Interface
The account has full 'Manager' privileges.

  Username: admin
  Password: ***********（実際にはランダムなパスワード）

This account is created when the object database is initialized. If you change
the password later (which you should!), you'll need to use the new password.

Use this account only to create Plone sites and initial users. Do not use it
for routine login or maintenance. 
 
- If you need help, ask the mailing lists or #plone on irc.freenode.net.
- The live support channel also exists at http://plone.org/chat
- You can read/post to the lists via http://plone.org/forums
 
- Submit feedback and report errors at http://dev.plone.org/plone
(For install problems, specify component "Installer (Unified)")
``` 

## 起動

```
cd /usr/local/user_installed/Plone/zinstance
./bin/instance fg （フォアグランドで起動）
```
## ログイン

インストール時に作成されたユーザー名とパスワードを使用してログイン

* http://localhost:8080/

![plone.png](https://qiita-image-store.s3.amazonaws.com/0/6604/2f12718b-7cb6-3cdf-96ea-280fab7b1c77.png "plone.png")
Parrot Flower  Powerとは

#Parrot Flower Powerとは
![Parrot Flower Powerとは](http://www.parrot.com/static/images/theme/catalog/flower_power/package_blue.png)
ドローン等を開発しているフランスのParrot社による、植物向けセンサーとスマートフォンのアプリで植物の管理ができる製品。
センサーからParrot社にデータをアップロードされ、Parrot社のホームページやスマートフォンで確認できる。またWebAPIも用意されている。

* Flower Powerのセンサーが、植物の状態を定期的に計測
* Flower Powerのセンサーの情報から水やりなどの世話が必要な場合にスマートフォンへ通知
* 各種センサー情報をスマートフォンやWebAPIから取得できる

## 値段
7,344円 

## 購入方法
[Amazon](http://www.amazon.co.jp/gp/product/B00Q8AXVF2/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00Q8AXVF2&linkCode=as2&tag=knyanet-22">)
[ヨドバシ](http://www.yodobashi.com/Parrot-%E3%83%91%E3%83%AD%E3%83%83%E3%83%88-PF900072-FLOWER-POWER-%E3%83%96%E3%83%AB%E3%83%BC-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E6%A4%8D%E7%89%A9%E7%AE%A1%E7%90%86%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC/pd/100000001002599288/)

# 取得できる情報
|センサー情報| 単位 | API範囲|説明|
|:-----------|:------------|:------------|:------------|
|土壌湿度|%|0-50|一般的に12%-18%が良好|
|日光量|mole x m-2 x d-1（光強度)|0.13 to 104 |APIでは104までだが、スマートフォンでは104以上出ているので、光強度から表示用に変換していると推測|
|気温|°Cまたは°F|- 5 to +55 (°C)||
|肥料|dS/m (電気伝導率)|0 to 10 |電気伝導率は土壌中の物質のイオン濃度の総量。一般的に1から3が良好|

# 仕様
1.15分おきに、４つのセンサー情報をFlower Power内のメモリに保存
2. ２時間置きにスマートフォン経由でParrot Cloudに自動更新
※インターネット接続ができるスマートフォンが通常10m以内にあること
3.植物に世話が必要になった任意のタイミングでスマートフォンにアラートを通知

#外部情報
[日本語サイト](http://www.modernity.jp/brand/parrot/parrot-flower-power/)
[説明書](http://www.modernity.jp/wp/wp-content/themes/modernity/download/manual/Parrot_FlowerPower_Manual.pdf)
[Python API](https://github.com/Parrot-Developers/FlowerPower-Tools)
[raspberry API](https://github.com/Parrot-Developers/node-flower-bridge)
[Android API](https://vsis-www.informatik.uni-hamburg.de/oldServer/teaching//projects/flowerpower4android/index.php)
簡単にSwiftでRailsと連携する方法


Swiftをはじめて1ヶ月あたりでアプリを作ってみた。
その中でどうせならRailsと連携してDBを使いたかったので、導入してみたときの記録。

今回はHTTP通信部分（GET・POST）の記述のみを簡単に紹介。

ちなみにRailsはscaffoldでさくっと作成。
.json.jbuilderのひな形みたいなのも作ってくれたのでよかった。

## データ受信（GET）

###Swift側
ViewController/HomeTableViewController.swift

```swift
func loadDiaries() {
        let url = NSURL(string: "http://localhost:4000/diaries.json")
        var request = NSMutableURLRequest(URL: url!)
        
        request.HTTPMethod = "GET"
        
        var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, responce, error) -> Void in
            
            if (error == nil) {
                self.diaries.removeAll(keepCapacity: false)
                var diaries = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! Array<Dictionary<String, AnyObject>>
            
                for diaryInfo in diaries {
                    let diary = Diary(attributes: diaryInfo)
                    self.diaries.append(diary)
                }
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    self.tableView.reloadData()
                })
            } else {
                // when error
            }
        })
        task.resume()
    }
```

### Rails側

views/diaries/index.json.jbuilder

```ruby
json.array!(@diaries) do |diary|
  json.extract! diary, :id, :name, :title, :text, :created_at
  json.url diary_url(diary, format: :json)
end
```

### 


## データ送信（POST）
簡単にいうと、
配列にデータをいれて、URLとHTTPメソッドを指定して送るだけ。

### Swift側

ViewController/NewDiaryViewController.swift

```swift
func save() {
        var url = NSURL(string: "http://localhost:4000/diaries")
        var request = NSMutableURLRequest(URL: url!)
        
        request.HTTPMethod = "POST"

        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        var params: [String: AnyObject] = [
            "name": "ただち",
            "title": titleField.text,
            "text": textField.text
        ]
        
        request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: nil)
        
        var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
            if (error == nil) {
                var result = NSString(data: data, encoding: NSUTF8StringEncoding)!
            }
        })
        task.resume()
        close()
    }
```

保存ボタンを押したときこのメソッドが走るように設定。

Rails側にSwift用の記述はしなくて大丈夫です。



## その他

プロジェクトは以下。
https://github.com/yuta-t/today

制作期間2日くらい。
メモ：PushbulletでRaspberry Piからスマホ/デスクトップにプッシュ通知を投げる

時間のかかる処理の終了通知で投げると便利。

内容は[Pushbullet API](https://docs.pushbullet.com/)のサンプル記述のまま。もちろんだけど、Raspberry Piでなくても使える。

事前にapt-getでcurlをインストールし、[Accountページ](https://www.pushbullet.com/account)からアクセストークンを取得すること。

```push.sh
#!/bin/bash
CURL=/usr/bin/curl
PUSHBULLET_TOKEN=YourPushbulletAccessToken
PUSHBULLET_TITLE=Raspberry\ Pi

LANG=ja_JP.utf8

${CURL} --header "Access-Token: ${PUSHBULLET_TOKEN}" \
        --header "Content-Type: application/json" \
        --request POST \
        --data-binary "{\"type\": \"note\", \"title\": \"${PUSHBULLET_TITLE}\", \"body\": \"$1\"}" \
        https://api.pushbullet.com/v2/pushes
```

テスト。

```
$ push.sh "ごはんですよは、桃屋ですよ！"
```

PCの結果。

> ![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/82738/3a9299d1-e889-e018-ca9b-3e240845c6de.jpeg)

Androidの結果。

> ![キャプチャ2.jpg](https://qiita-image-store.s3.amazonaws.com/0/82738/254bbd8b-6589-38f8-2f26-e9b1901b8e14.jpeg)
注文APIにおける証明書の利用について質問です。

注文APIを利用する時の証明書の使い方について質問があります。

以下のような処理を実行した場合、証明書の有無で有効期限はどう変わるか教えてもらえますか？

■証明書無しの場合
１．Authorizationエンドポイントで認可コードを取得
２．Tokenエンドポイントで認可コードを渡してアクセストークンとリフレッシュトークンを新規取得（証明書無し）
　・アクセストークン：有効期限＝3600秒
　・リフレッシュトークン：有効期限＝12時間
３．アクセストークン更新のためTokenエンドポイントにリフレッシュトークンを渡してアクセストークンを新規取得（証明書無し）
　・アクセストークン：有効期限＝3600秒
　・リフレッシュトークン：有効期限＝12時間のまま変わらず
４．注文詳細APIにアクセストークンを渡して注文情報を取得（証明書無し）
　・アクセストークン：有効期限＝3600秒のまま変わらず
　・リフレッシュトークン：有効期限＝12時間のまま変わらず

■証明書を最初の１回目の取得だけで使用した場合（リフレッシュトークンを取得するところだけで）
１．Authorizationエンドポイントで認可コードを取得
２．Tokenエンドポイントで認可コードと"証明書"を渡してアクセストークンとリフレッシュトークンを新規取得（証明書有り）
　・アクセストークン：有効期限＝3600秒
　・リフレッシュトークン：有効期限＝4週間
３．アクセストークン更新のためTokenエンドポイントにリフレッシュトークンを渡してアクセストークンを新規取得（証明書無し）
　・アクセストークン：有効期限＝3600秒
　・リフレッシュトークン：有効期限＝4週間のまま変わらず
４．注文詳細APIにアクセストークンを渡して注文情報を取得（証明書無し）
　・アクセストークン：有効期限＝3600秒のまま変わらず
　・リフレッシュトークン：有効期限＝4週間のまま変わらず


Tokenエンドポイントで認可コードを渡してリフレッシュトークンを新規取得するところだけ証明書を利用すれば、４週間はリフレッシュトークンをそのまま使いアクセストークンを更新し続けることができるという認識で間違いないでしょうか？
アクセストークン更新時と注文詳細APIでは証明書を使わない通常の方法で利用してもリフレッシュトークンの有効期限は4週間のままということで間違いないでしょうか？

よろしくお願いいたします。
macでJava開発環境構築　PostgreSQL編

# ターミナルからインストール
1. Homebrewのインストール

```text:ターミナル
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
<br/>
2. HomebrewでPostgreSQLのインストール

```text:ターミナル
$ brew install postgresql
```
<br/>
3. UTF-8でデータベースの初期化

```text:ターミナル
$ initdb /usr/local/Cellar/postgres -E utf8
```
<br/>
4. PostgreSQLサーバの起動

```text:ターミナル
$ postgres -D /usr/local/Cellar/postgres
```
<br/>
5. PostgreSQLサーバの起動

```text:ターミナル
$ pg_ctl -l /usr/local/Cellar/postgres/server.log start
```
<br/>
6. PostgreSQLサーバの停止

```text:ターミナル
$ pg_ctl stop -s -m fast
```
<br/>

# Installerからインストール

1. サイトへ移動<br/>
http://www.pgadmin.org/download/macosx.php<br/>
http://www.enterprisedb.com/products-services-training/pgdownload#osx<br/>
Mac OS X の最新版をダウンロードしてインストール（StackBuilderも）
<br/>
<br/>
2. StackBuilderからその他ツールもインストール
EDB Language Pack<br/>
pgMemcache<br/>
pgJDBC<br/>
PostgreSQL database server（最新）<br/>
<br/>


以下、参考にしたサイト
> http://codenote.net/mac/homebrew/187.html
> http://qiita.com/tstomoki/items/0f1a930bd42a8e1fdaac
> http://blog.a-z0-9.net/archives/221
Rails4.2でBootstrapに対応したときのメモ

# インストール
以下のサイトを手順通りに実行したらうまくいった
https://rubyplus.com/articles/1371

# 参考情報
[Autoprefixer ― CSSのベンダー接頭辞をいろいろする](http://myakura.hatenablog.com/entry/2013/09/30/035244)

# トラブルシューティング
## 問題：SyntacError
```
Sass::SyntaxError at /
File to import not found or unreadable: bootstrap-sprockets.
Load paths:
```

## 解決
サーバーを再起動する
RS-232C通信 > エラーチェックなど (リンク情報)

RS-232C通信を使う時の関連情報がまとまっている。
http://www.fukufukudenshi.jp/v2/RS-232C/

>シリアル通信では、テキスト送受信の失敗が前提としてシステムを設計します。
...
レスポンスのタイムアウトは、３秒程度。リトライ回数は、最大３回まで一般的です。
しかし、高速性を要求されるシステムや、データの重要性が要求されるシステムなどでは、システムに応じてタイムアウトやリトライ回数は大きく異なります。
PHP でプラグインのようなものを実装

# 初めに

Smarty や pukiwiki には、あとから機能を追加できるようなプラグインが用意されていますが、あれに近いことをやってみたいと思いました。

# 実装する機能

例えば、こんな感じで実行したいプラグインを並べた配列があったとします。

```lang:index.php
$command_list = array(
   'plugin_1',
   'plugin_2',
   'plugin_3',
);
```

この配列に指定されたプラグインを外部の php ファイルから読み込んで実行したいと思います。

# 実際のコード

まず、実行するプラグインを作成します。今回は、実行すると、実行したプラグインが分かるような文字列が返るようにします。

```lang:plugin_1.php
<?php
class plugin_1 {
    function toString() {
        return 'execute_plugin_1';
    }
}
```

```lang:plugin_2.php
<?php
class plugin_2 {
    function toString() {
        return 'execute_plugin_2';
    }
}
```

```lang:plugin_3.php
<?php
class plugin_3 {
    function toString() {
        return 'execute_plugin_3';
    }
}
```

各プラグインを、このように plugin_1.php ~ plugin_3.php まで作っておきます。次に、これを順次実行するようなサンプルを作ってみます。

```lang:index.php
<?php
$command_list = array(
   'plugin_1',
   'plugin_2',
   'plugin_3',
);

$plugin = array();
$txt = '';

foreach($command_list as $v) {
    if (isset($plugin[$v]) === false) {
        require_once($v.'.php');
        $plugin[$v] = $v;
    }   
    $txt .= $plugin[$v]::toString();
}
echo $txt;
```

index.php を実行すると、

```lang:実行結果
execute_plugin_1execute_plugin_2execute_plugin_3
```

と出力されます。

# 最後に

サンプルでは、プラグインを3個用意していますが、将来的に exec_plugin_4 を追加したくなるかもしれません。その時は、plugin_4.php を作れば、機能が拡張されます。

実際に作成する場合は、$command_list は DB や外部ファイルから読み込んだり、リリース時のプログラムと分離できるようにする必要など考慮した方がいいでしょう。また、存在しないプラグインを実行できないようにしたり、ファイルの存在確認や、今回のケースだと、クラスに toString() 関数が実装されているか確認したり、色々やることがありそうです。
技術英語 > have any particular xxx > Do you have any particular tools in mind?

特に考えているものがあるか聞きたい場合 have any particular を使えばいい。

Do you have any particular tools in mind?

<hr>
http://user.it.uu.se/~pierref/courses/SE/
> the study of any particular tools

http://askubuntu.com/questions/605086/from-terminal-how-can-i-upgrade-a-particular-software-only
> From terminal how can I upgrade a particular software only?

<hr>
particularと似たものでspecificがある. 両者を比較したものが以下にある。

http://www.dailywritingtips.com/particular-vs-specific/
>  I’d probably choose specific in the business context and particular in the leisure context.
...
Generally speaking, I’d choose specific when the content seems to call for precision.
...
Something specific needs to meet a set of conditions or requirement.
Something particular is usually something NON-specific.
...
Also, as adjectives, particular can imply choosiness or fussiness, whereas specific denotes detail or precision.

と色々意見はあるようだ。
埋め込んだYouTubeでFacebookみたいな動画自動再生を実装した話。スクロールで再生するやつ

InstagramやFacebookなどスクロールして画面内に入るとタイムライン上の動画が自動で再生されるようなサイトが増えてきました。（インフィード動画再生？）
他のサイトでもGIFアニメーションを使ってループ再生させているサイトもありますね。

例えばamazonの広告とか
![s_スクリーンショット 2015-06-14 1.38.56.png](https://qiita-image-store.s3.amazonaws.com/0/7132/bed2b73e-f194-21e6-1e0b-ea417c7221af.png)

動画の自動再生はページ滞在時間や広告効果の向上があると言われています。Facebookでは広告効果が10%も上がったとか。

自サイトで動画コンテンツを扱う場合、YouTubeにファイルをアップロードして、それをembedする方法が一般的かと思います。そこでYouTube動画の自動再生機能を実装した方法を解説します。


##『YouTube埋め込みプレーヤー』で自動再生させる
自動再生で一番簡単な実装は、読み込むiframeのURLにautoplayパラメータを付ける方法です。

```html
<iframe width="560" height="315" src="https://www.youtube.com/embed/8-en4JdCGRo?autoplay=1" frameborder="0" allowfullscreen></iframe>
```
[サンプル](https://jsfiddle.net/qbtzg756/)

**autoplay=1**とすることで自動再生は実現できます。しかし、この方法では読み込んだ瞬間に再生されます。
さらにミュートの状態がキャッシュされるので、一度ミュートを解除すると勝手に音声が流れてしまいます。
今回はこれでは不適切な実装となってしまいます。

##『YouTube IFrame API』で再生プレイヤーを制御する
[YouTube IFrame API](https://developers.google.com/youtube/iframe_api_reference)を埋め込んだ動画の制御ができます。

操作は簡単でYouTubeのapi用jsが読み込まれると定義した**onYouTubeIframeAPIReady関数**が実行されます。
そこで作った動画プレイヤーでplayVideoとpauseVideoの実行、これとブラウザのスクロールイベントと合わせて、画面内に入ったら自動再生・画面外で停止の制御を実装していきます。

```html
<div id="player"></div>

<script>
var player

// YouTube IFrame APIのjsが読み込まれ終わったときの処理
function onYouTubeIframeAPIReady() {
  // プレイヤー作成
  player = new YT.Player("player", {
    height: 390,
    width: 640,
    videoId: "8-en4JdCGRo",
    events: {
      "onReady": function(event){
        // ミュート設定をする
        event.target.mute()
      }
    }
  })
}

// スクロールイベント
window.addEventListener("scroll", function() {
  // 画面内にプレイヤーがあるかを判定
  if (window.scrollY < player.getIframe().offsetTop &&
      window.scrollY + window.screen.height > player.getIframe().offsetTop + player.getIframe().offsetHeight) {
    // 動画再生
    player.playVideo()
  } else {
    // 動画停止
    player.pauseVideo()
  }
})
</script>
<script src="https://www.youtube.com/iframe_api"></script>
```

[サンプル](https://jsfiddle.net/vkbbg5bs/)

player.getIframe()でiframe要素を取得できるので、そこから位置・高さの取得が可能です。
こんな感じで動作させることができました。
もっと細かくプレイヤー制御を行うことができますので[ドキュメント](https://developers.google.com/youtube/iframe_api_reference#Events)を参考にしてください。

##実際の実装例
[![ゲーム攻略コミュニティ『GAMY』](https://qiita-image-store.s3.amazonaws.com/0/7132/8dfe91b5-ecd3-3fec-7690-6557d18089c2.png)](http://gamy.jp/uchi_hime/%E5%9C%B0%E7%8D%84%E4%BA%94%E8%81%96%E7%8D%A3%E8%A5%B2%E6%9D%A5%E9%97%87%E3%81%AE%E8%81%96%E7%8D%A3%E9%BA%92%E9%BA%9F%E5%9C%B0%E7%8D%84%E9%AD%94%E7%8E%8B%E7%B4%9A%E7%84%A1%E8%AA%B2%E9%87%91%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%B3%E6%94%BB%E7%95%A5)
[ゲーム攻略コミュニティ『GAMY』](http://gamy.jp)で実際に動画の自動再生を実装してみました。
こちらの『[地獄クエスト「五聖獣襲来！闇の聖獣麒麟(地獄魔王級)」無課金ノーコン攻略＆動画](http://gamy.jp/uchi_hime/%E5%9C%B0%E7%8D%84%E4%BA%94%E8%81%96%E7%8D%A3%E8%A5%B2%E6%9D%A5%E9%97%87%E3%81%AE%E8%81%96%E7%8D%A3%E9%BA%92%E9%BA%9F%E5%9C%B0%E7%8D%84%E9%AD%94%E7%8E%8B%E7%B4%9A%E7%84%A1%E8%AA%B2%E9%87%91%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%B3%E6%94%BB%E7%95%A5)』という記事で動作していますので参考にどうぞ。
デスマーチの現場をコレクション操作で表す #ruby

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
デスマーチの現場をコレクション操作で表します

## <i class="fa fa-cube" style="font-size:1em;"></i> 仕様
開発者は以下の3つのパラメータを持つ

* 名前
* スキルレベル
* タフさ

プロジェクトの

## <i class="fa fa-code" style="font-size:1em;"></i> プログラム

~~~ruby
Person = Struct.new(:名前, :スキルレベル, :タフさ)
デスマーチプロジェクトチーム = [
  Person.new('田中', 10, 10),
  Person.new('佐藤', 8, 5),
  Person.new('城島', 6, 1),
  Person.new('長瀬', 6, 5),
  Person.new('東野', 6, 10),
  Person.new('今田', 4, 1),
  Person.new('くにお', 4, 5),
  Person.new('りき', 4, 10),
  Person.new('さおとめ', 2, 1),
  Person.new('にしむら', 2, 5),
  Person.new('りゅーいち', 2, 10),
]

テスター = [
  Person.new('テスター1', 1, 10),
  Person.new('テスター2', 2, 7),
  Person.new('テスター3', 2, 2),
  Person.new('テスター4', 3, 3),
  Person.new('開発要員だと騙されて連れて来られた人', 6, 8),
]

補強メンバー = [
  Person.new('補強要員1', 1, 10),
  Person.new('補強要員2', 3, 10),
  Person.new('補強要員3', 4, 10),
  Person.new('当たりクジ補強要員4', 7, 8)
]

class Array
  def print_rest
    puts "残り #{size} 人"
    self
  end

  def print_comment(comment)
    puts(comment)
    self
  end
end

デスマーチプロジェクトチーム.print_rest
                      .print_comment("スキルレベルが高いメンバーは早い段階で危機を察知してより良い仕事に逃亡")
                      .delete_if{ |e|e.スキルレベル > 7 }
                      .print_rest
                      .print_comment("タフさが足りないメンバーは燃え尽きて離脱")
                      .delete_if{ |e|e.タフさ < 5 }
                      .print_rest
                      .print_comment("補強メンバーを補充")
                      .+(補強メンバー)
                      .print_rest
                      .print_comment("テスターを増員")
                      .+(テスター)
                      .print_rest
                      .print_comment("スキルレベルが足りないメンバーは規模縮小フェーズで離脱")
                      .delete_if{ |e|e.スキルレベル < 5 }
                      .print_rest
                      .print_comment("残留メンバーをスキルレベルの高い順にソート")
                      .print_comment("保守・次期開発フェーズに残留メンバーの上位3名を選ぶ")
                      .take(3)
                      .print_rest
                      .print_comment("最終残留メンバー")
                      .tap { |e|puts e.map { |e|"#{e.名前} スキル(#{e.スキルレベル}) タフさ(#{e.タフさ})" }.join("\n") }
~~~

## <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~
残り 11 人
スキルレベルが高いメンバーは早い段階で危機を察知してより良い仕事に逃亡
残り 9 人
タフさが足りないメンバーは燃え尽きて離脱
残り 6 人
補強メンバーを補充
残り 10 人
テスターを増員
残り 15 人
スキルレベルが足りないメンバーは規模縮小フェーズで離脱
残り 4 人
残留メンバーをスキルレベルの高い順にソート
保守・次期開発フェーズに残留メンバーの上位3名を選ぶ
残り 3 人
最終残留メンバー
長瀬 スキル(6) タフさ(5)
東野 スキル(6) タフさ(10)
当たりクジ補強要員4 スキル(7) タフさ(8)
~~~
DDDにおけるIdentifier/Entity/Repository間の関係をScalaで型付けする

**2016/06/07 追記**
下記の実装には問題点がある（gakuzzzzさんからコメントで指摘いただきました）ので、そちらも合わせてご参照ください。

## はじめに
DDDにおいては、ドメインの登場人物を取り扱うための、様々なデザインパターンが登場します。

典型的には、例えばユーザというエンティティを考えると

- ユーザは一意なIdentifier(ID)を持つ
- IDをリポジトリに渡すと、リポジトリはDB上のデータからユーザを生成する

リポジトリはエンティティのライフサイクルにおける、永続化部分の隠蔽を担当します。関連する部分の雰囲気だけコードに表すと、こんな感じになるでしょうか。

```scala
class User(val id: Long)

class UserRepositry {
    def resolve(id: Long): User = ??? //省略： DBアクセスしてUserを取得するコード
}
```

## 問題点
上のようなシンプルな方針には問題点があるので、ある程度以上大きなプログラムだと何らかの改良をしたくなります。

- `id`が`Long`になっている。型として一般的すぎるので、何のIDなのかという情報が欠けてしまっている
- そのため、値の混同を起こしやすい。現実的なプログラムには、`User`に振られたID以外にも、様々な種類のIDがあるはずだが、これらが全て`Long`になってしまう

うーん困った。そこで、IDにちゃんと専用の型をつけることで、エンティティ・リポジトリを含む枠組みを整理できないか考えてみました。

## 解決策？
Scalaの場合は、ID、エンティティ、リポジトリそれぞれにベースになるトレイトを作り、これらの間の関係性を型的に保証するというテクニックが使えそうです。

まずはIDを表すトレイトから。「同値比較ができればいいが、具体的な型（`Long`かどうか等）は決めない」という方針にするため、型パラメータ`A`を導入しています。

```scala
trait Identifier[A] {
  def value: A
  override def equals(obj: Any): Boolean = obj match {
    case other: Identifier[_] => this.value == other.value
    case _ => false
  }
  override def hashCode: Int = value.hashCode
}
```

次にエンティティ。必ずIDを持つがそれがどの型かはまだ決まっていないので、ここも型パラメータになります。本当はもっと色々なメソッドが付いていてもおかしくないですが、ここでは`Identifier`を利用して比較ができるという事だけを実装しました。

```scala
trait Entity[ID <: Identifier[_]] {
  val id: ID
  override def equals(obj: Any): Boolean = obj match {
    case other: Entity[_] => this.id == other.id
    case _ => false
  }
  override def hashCode: Int = id.hashCode
}
```

最後にリポジトリです。ここで定義する抽象的なリポジトリは、ある`Identifier`から対応する`Entity`を探すための`resolve`メソッドを持ちます。`ID`と`E`との間に`E <: Entity[ID]`の関係があり、かつ`resolve`の戻り値の型が`E`である点に注意してください。つまり、必ずIDと対応するエンティティが返ってくることが保証できています。

```scala
trait Repository[ID <: Identifier[_], E <: Entity[ID]] {
  def resolve(id: ID): E
}
```

上記のように定義された一般的な`Identifier`、`Entity`、`Repository`を枠組みとして使うことで、最初に題材にした`User`周りについては以下のように書くことができます。

```scala
class UserId(val value: Long) extends Identifier[Long]

class User(val id: UserId) extends Entity[UserId]

class UserRepository extends Repository[UserId, User] {
  def resolve(id: UserId): User = ??? //省略
}
```

## まとめ
リポジトリパターンに関連する部分のエンティティ・IDについて、IDも含めて専用の型を付けるという方針で、Scala実装しました。

実際のところ、[じゅんいちかとう氏の実装例](https://github.com/j5ik2o/spetstore/tree/master/app/com/github/j5ik2o/spetstore/domain/support/support)の焼き直しになっているような……うん、ほとんど変わらないですね。これ、もしかして結構一般的なパターンなのかなあ……？
特定の処理の完了を待ってから次の処理へと移りたい場合の実装

# 開発中に生じた問題

・ViewDidLoad()内にClass A,B,Cをインスタンス化したa,b,cの順に処理を行いたいのだが、
実際のところb,c,aの順に処理が行われ想像通りの結果になってくれない。

# 問題の原因

・a,b,cの処理が非同期で行われるため処理が早く終わる順になってしまう。（同期処理に変更、または実質同期処理にしたら良いのでは）

非同期：レスポンスを待っている間に他の処理も行える。
同期：レスポンスが車で他の処理を行わずにレスポンスを待ち続ける。

#問題解決へのアプローチ

・現在a,b,cの順に処理が行われてしまうのは非同期なため、処理が早く終わる順になっているのでb,a,cの順に処理が行われてしまう。そのため、aの処理が終わってからb,cの処理を行うようaを同期処理にする。
・解決方法として、処理が遅いクラスaで特定の処理が終わった際にViewControllerへ通知しb,cの処理を行う方法を今回実装してみました。

#コード

・freeNameとなっている箇所は使用場面に応じて適切な変数名、関数名を決めてください。


```swift:ViewController.swift



import UIKit

class ViewController: UIViewController {
    
    var a = A()
    var b = B()
    var c = C()

    // Define Notification（定義
    let freeName = "freeName"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        a.getElement()
        
        // Register Notification（登録）
        NSNotificationCenter.defaultCenter().addObserver(
            self,
            selector: "freeName:",
            name: freeName,
            object: nil
        )
    }
    
    // Notification Method（通知受信時のメソッド）
    func freeName(notification: NSNotification) {
        //aの処理後行いたい処理を記入
        b.getElement()
        c.getElement()
    }
}
```

```swift:A.swift

import UIKit

class A: UIViewController{
    // Define Notification（定義）
    let freeName = "freeName"
    // Post Notification（送信）
    let ns = NSNotificationCenter.defaultCenter()
    func getElement(){
        //行いたい処理を記入



        ns.postNotificationName(freeName, object: nil)
    }
}
```

※以下C.swiftも同様な内容

```swift:B.swift
import UIKit

class B: UIViewController{
    func getElement(){
        //行いたい処理を記入
    }

}

```

# 最後に
今回はNSNotificationを使って実装してみましたが、以前Qiitaに投稿した[UIScrollView内に複数の画像を表示し、タップされた画像を判別する方法](http://qiita.com/yotsu7/items/ca288c546dc27e21627b)こちらのほうでデリゲートを使用した値渡しを行った同様の処理で今回の問題を解決する別アプローチがあるような気がしたので試してみたいと思います。


# 参考

サイト
siro:chro URL:http://www.sirochro.com/note/swift-nsnotification-usage/
numpy.ndarrayをc++から操作する小技 -イテレータを使いたい-

#目的
boost.pythonやboost.numpyを利用することで、c++でnumpy.ndarrayを扱えるpythonのモジュールを簡単に作成することができます。
boost.numpyは良くできたライブラリですが、イテレータが使えないなどデータへのアクセスにやや不便な点があります。そのため、データへ簡単にアクセスできるようにします。

# 背景
## numpy.ndarrayとは
pythonのパッケージの一つnumpyが提供する多次元配列です。これなしにpythonでの数値計算があり得ないくらい広く使われています。
## boost.numpyとは
numpyをc++から操作できるようにするライブラリです。以下のような感じでデータにアクセスします。

```cpp
namespace bp = boost::python;
namespace np = boost::numpy;

void func(np::ndarray &data2d) {
  // data2d は二次元配列としてi,j要素に0を代入
  for (int i = 0; i < data2d.shape(0); ++i) {
    for (int j = 0; j < data2d.shape(1); ++j) {
      data2d[bp::make_tuple(i, j)] = 0.0;
    }
  }
}
```

# 小技の条件
この小技を利用するためには、以下の条件が満たされる必要があります。

* 配列の次元数、要素型がコンパイル時定数である
* numpy.ndarrayのデータのメモリが連続である

一つ目の条件は多くの場合で満たされるを思います。また、二つ目に関しても、元々は大きな配列から一部を切り出した変数でない限りは、満たされるはずです。

# イテレータを使えるようにする
利用するのはboost.multi_array_refです。
numpy.ndarrayがpythonの多次元配列なので、c++でも多次元配列のライブラリを利用します。
boost.multi_array_refはboost.multi_arrayの自分でメモリを確保しないバージョンです。boost.multi_arrayの詳しい説明はこちらをどうぞ。([boost::multi_array - Kmonos.net](http://www.kmonos.net/alang/boost/classes/multi_array.html)) ちなみに、boost.const_multi_array_refという読み込みのみで、書き込みできないバージョンもあります。
## 具体例

```cpp
void func(np:ndarray &data2d) {
  const std::array<int, 2> shape = {data2d.shape(0), data2d.shape(1)};
  boost::multi_array_ref<double, 2> wrapper(reinterpret_cast<double*>(data2d.get_data()), shape);
  // i,j要素へはwrapper[i][j]でアクセスできるがイテレータを利用
  for (boost::multi_array_ref_double, 2>::subarray<1>::type &&sub : wrapper) {
    boost::fill(sub, 0.0);
  }
}
```

そうすると、こんな感じにアクセスできます。

もちろん、boost.multi_array_refを利用することによるオーバーヘッドはあります。また、ポインタを直接操作する方法([C++でPythonを拡張するためのBoost.NumPyチュートリアル(実践編)](http://qiita.com/termoshtt/items/81eeb0467d9087958f7f))もありますが、多少のオーバヘッドは気にせず安全策でいきたいと思います。

ちなみに、上記の例ではわかりやすさや、紹介の意味もあるので`boost::multi_array_ref<double, 2>`と2次元配列のラッパーを用意していますが、

```cpp
const std::array<int, 1> shape = {data2d.shape(0) * data2d.shape(1)};
  boost::multi_array_ref<double, 1> wrapper(reinterpret_cast<double*>(data2d.get_data()), shape); 
boost::fill(wrapper, 0.0);
```

とすることで、一発で処理が完了します。


# 最後に
やっぱりここでもboostライブラリは頼りになります。
他にいい方法(boost.multi_array_ref以外のライブラリ、boost.numpyに代わる何かなど)をご存知の方は、是非ともお知らせください。
rake assets:precompileでdigestハッシュ無しのアセットを生成する方法

## 目的

通常、

```bash
rake assets:precompile
```
でアセットをコンパイルすると**public/assets**ディレクトリに**application-9ac74f0fddf98cc98595755d9e0c96aa.css**の様なファイル名のファイルが生成されます。
これはとても便利なんですが、場合によってはダイジェスト値を含まない**application.css**というファイルを生成して欲しいことが有ります。
(理由は後述します)

## 方法

これを実現するには**lib/tasks/assets.rake**などのファイルを作り、以下の内容で保存します。

```rb
namespace :assets do

  def without_digest
    Sprockets::Asset.class_eval do
      def hacked_digest_path
        logical_path
      end

      alias_method :org_digest_path, :digest_path
      alias_method :digest_path, :hacked_digest_path
    end
    yield
    Sprockets::Asset.class_eval do
      alias_method :digest_path, :org_digest_path
    end
  end

  task :precompile_without_digest => :environment do
    without_digest do
        Rake::Task["assets:precompile"].invoke
    end
  end

end
```
これで

```bash
rake assets:precompile_without_digest
```
を実行するとダイジェスト値の無いアセットが生成されます。

あとは、**`stylesheet_link_tag`**などのメソッドがダイジェスト無しのファイル名を返すように、**config/environments/xxxxx.rb**の設定を以下の様に変更します。(xxxxxは適宜、環境に応じて読み替えて下さい)

```rb
config.assets.digest = false
```

## そもそもなぜダイジェスト値の無いアセットが欲しいのか
**ダイジェスト値を持つ**アセットを生成することのメリットは以下です。

1. アセットのブラウザキャッシュ有効期限を遠い未来にすることでサーバへのアセットリクエスト数を激減させることが出来る。
2. アセットに変更が有った場合には**`stylesheet_link_tag`**などのメソッドは新しいダイジェストを持つファイル名を返すので、ブラウザは確実に新しいアセットを取得しに行く。

ただし、これが機能するのは常にページが動的に生成されている場合に限られます。
サーバ負荷を下げる目的で、[actionpack-page_caching](https://github.com/rails/actionpack-page_caching)やNginxのキャッシュ機能を使用していた場合には、アセットを更新してもページキャッシュが残っている間はブラウザは古いアセットを取得し続けます。
新しいアセットをブラウザに読み込ませるにはページキャッシュを消すなり、更新する必要があります。

そこで、登場するのがダイジェスト無しのアセットです。
コレには以下のメリットが有ります。

* アセットを更新してもページキャッシュには何もしなくていい。

同時に以下のデメリットも有ります。

* アセットはブラウザキャッシュさせられない。

結局、どちらがいいかは、

* ページキャッシュによる負荷削減
* アセットがブラウザキャッシュされないことによる負荷増加

のトレードオフを考慮してどちらが得かによって決まると思います。

余談ですが、もう一つの選択肢として、ダイジェスト付きアセットを使いつつ、アセットの更新時にページキャッシュを再生成するという方法もあります。
これが実装は面倒ですが一番負荷を下げられる方法ですね。(ページをブラウザキャッシュさせてる場合は意味無いですが)
macでJava開発環境構築　Eclipse編

1. Eclipseダウンロード
https://eclipse.org/downloads/
Mac OS X 64 Bit　のやつ
**Eclipse IDE for Java EE Developers**
※2015/06/14現在　Eclipse Luna SR2 (4.4.2) 
ダウンロードしたらファイルを解凍して適当な場所に移動
<br/>

2. Eclipse All in Oneダウンロード
http://mergedoc.osdn.jp/
64bit　Standard Edition　Java　をダウンロード
<br/>

3. pleiadesのフォルダを展開していくとpleiades/eclipse/dropins/MergeDocというフォルダがあるので、これをeclipse本体の方のeclipse/dropinsフォルダの下にコピー
<br/>

4. eclipse.iniの編集
eclipse本体のEclipse.appの上で右クリックしてメニューを表示⇒「パッケージの内容を表示」をクリック
最下行に下記を追加して保存

```text:eclipse.ini
-Dfile.encoding=UTF-8
-javaagent:../../../dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```
　
5. Eclipseを開いてみる
Eclipse.appをクリック
または

```text:ターミナル
$ cd /Applications/eclipse
$ Eclipse.app/Contents/MacOS/eclipse -clean -clearPersistedState
```

を実行
“eclipse”は、開発元が未確認のため開けません。
システム環境設定＞一般タグ＞このまま開く
<br/>
~~6. JStyle改行プラグイン
http://osdn.jp/projects/mergedoc/releases/p12531
jstyle_4.4.2.0-64bit.zip
インストール方法はダウンロードしたファイルに含まれているabout.htmlを参照~~
macは使えなかった
<br/>
7. subversion
ヘルプ＞マーケットプレイス＞subversionで検索
Subclipseをインストール
<br/>
8. Eclipse Color Theme
ヘルプ＞マーケットプレイス＞Eclipse Color Themeで検索
Eclipse Color Themeをインストール
http://eclipsecolorthemes.org/
好きなテーマをダウンロード（おすすめはlight eclipse）
適用　一般＞外観＞色テーマ
<br/>
9. Findbug
ヘルプ＞マーケットプレイス＞Findbugで検索
Findbugをインストール
<br/>
10. Checkstyle
ヘルプ＞新規ソフトウェアのインストール
http://eclipse-cs.sf.net/update/
インストール
<br/>
11.JadClipse
ヘルプ＞新規ソフトウェアのインストール
http://feeling.sourceforge.net/update
インストール
<br/>
12.Eclipse Runner
ヘルプ＞新規ソフトウェアのインストール
http://eclipserunnerplugin.googlecode.com/svn/trunk/EclipseRunnerSite
インストール
<br/>

以下、参考にしたサイト
> http://www.utano.jp/entry/2014/01/eclipse_japanese_localization_for_mac
> http://qiita.com/deonathg/items/b544e824e7c5461d2ad2
> http://qiita.com/chosan211/items/2b375202c598e8e55c4d
Mac のショートカットキーについて

僕は、Macのショートカットキーの表記が分からなくなる事があります。
なので、小ネタですが、ショートカットキーについて書いてみました。

---

######【ショートカットキーの記号について】
https://support.apple.com/kb/PH18802?locale=ja_JP&viewlocale=ja_JP

######【特にこのあたりがよく使うのかな？と思うキーの記号】
command:![modcm.png](https://qiita-image-store.s3.amazonaws.com/0/63777/3cad75d6-0661-d305-0d1a-6a8a632bc821.png)
shift:![modsh.png](https://qiita-image-store.s3.amazonaws.com/0/63777/3c85f94b-8c66-3c62-d1b7-e3eb2c36e9d4.png)
option:![modop.png](https://qiita-image-store.s3.amazonaws.com/0/63777/1042123f-d0f1-d70d-a6d1-8b258ddf4c6f.png)
control:![modcn.png](https://qiita-image-store.s3.amazonaws.com/0/63777/388f6c10-2466-8617-7637-49cd51541c1a.png)

---

######【あると便利なショートカットキーの一覧表示アプリ】
(コマンドキー長押しでアクティブなアプリやMacOSのショートカットキー表示)
http://www.cheatsheetapp.com/CheatSheet/
※導入後、セキュリティの変更が求められます。
waifu2x を OSX で動かしたメモ

いまさら waifu2x に参戦。まだ OSX 版のバイナリはないみたいなんで自分でビルドしよう。
本家ではなく OpenCV を使う http://github.com/WL-Amigo/waifu2x-converter-cpp を使います。

```bash
brew tap homebrew/science
brew install homebrew/science/opencv3 --without-tests --without-numpy --without-python
git clone http://github.com/WL-Amigo/waifu2x-converter-cpp
cd waifu2x-converter-cpp
vi Makefile # 下の makefile を持ってくる
make
```

```mf
OPENCV=/usr/local/opt/opencv3

CXX=clang++
CXXFLAGS=-I$(OPENCV)/include -I$(CURDIR)/include -I./include -std=c++11 -pthread -Wall
LDFLAGS=-L$(OPENCV)/lib -pthread -Wl,-rpath,$(OPENCV)/lib
LDLIBS=-lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_features2d

waifu2x-converter-cpp: src/main.o src/modelHandler.o src/convertRoutine.cpp
        $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)

clean:
        rm */*.o%
```

w_o さんの Makefile を参考にした https://github.com/tanakamura/waifu2x-converter-cpp/blob/master/Makefile

動くけどCUDA版を使ったことないので早いのか遅いのすらわからない…。

OSXのOpenCLで動かすところまではやりたい。

## 追記： w_o さんの OpenCL 版まで動かした

さすがにかなり変更したのでgithubにあげた。

https://github.com/iwag/waifu2x-converter-cpp/tree/workaround-osx

バイナリもあげたぞい。
threadPool の移植を諦めてるのでマルチスレッドになっておらず遅いはず。
OSXで OpenMPって簡単に使えるんだっけ…
Sublime Text を日本語化する(Mac)

環境はmac + sublime textは3です。
<hr>
######【参考】ホームディレクトリにライブラリを表示させていない人は
作業を進めるにあたって、ライブラリフォルダが表示されていると便利です。
そこで、ライブラリフォルダが表示されていない人は以下の方法にて対応してもらえればと思います。

ホームディレクトリでファインダーの「表示」から「表示オプションを表示」を選択して、
「"ライブラリ"フォルダを表示」にチェックを入れる。
<hr>
1)japanizeと言うパッケージをインストールする。
2)Finderで~/ライブリ/Application Support/Sublime Text 3/Packages/に移動する。
3)Defaultフォルダを作成
4)Japanizeフォルダにある以下のファイル(拡張子がjpのもの)をDefaultフォルダにコピー

```
Context.sublime-menu.jp
Indentation.sublime-menu.jp
Main.sublime-menu.jp
Side Bar Mount Point.sublime-menu.jp
Side Bar.sublime-menu.jp
Tab Context.sublime-menu.jp
```

5)Defaultフォルダに移動して、全てのファイルの拡張子から.jpを削除する。
6)念のためsublime textを再起動
すぐ忘れる！SourceTreeを使ったリベースとスカッシュの手順

Git操作をGUIで行える[SourceTree](https://www.sourcetreeapp.com/)は、私にとって今では無くてはならない存在です。
コレのお陰で、ターミナル恐怖症のデザイナーさんにもGitでファイルの変更を管理してもらえるようになって、デザイナーさんとの連携がとても楽になりました。
もう、これなしでは開発したくないと思えるほど便利です。

でもSourceTreeのいくつかの機能はお世辞にも直感的とは言えず、間違った操作を誘発する危険性をはらんでいます。私もハマって結構大変な目に会いました。

私が、そして私のような方が同じ過ちをおかさないように、ここにハマりそうなSourceTree操作を記録しておきます。

## リベース手順
例えば、**develop**ブランチから分岐した**feature/hoge**ブランチで作業している途中で、他の開発者のコミットが**develop**ブランチにマージされた場合、後々大きなコンフリクトが発生するのが怖いので、早めに**develop**の先頭にリベースしたくなります。
こういう時は以下の手順で作業します。

1. **feature/hoge**ブランチをダブルクリックしてチェックアウトする。
2. グラフ上で**develop**ブランチの先端を右クリックして「リベース」をクリック。
3. 競合が発生しなければこれで終わり。
4. 競合が発生したら、サイドバーの**「作業コピー」**をクリックして、コンフリクトしてるファイルを確認し、エディタで競合を解決する。
5. 作業ツリーのファイル一覧から競合を解決したファイルを右クリックして、**「競合を解決」**->**「解決済みにする」**をクリック。
6. メニューから**「操作」**->**「リベースを続ける」**をクリック。
7. もしまた競合が発生したら、4〜6の作業を繰り返す。

特に手順5の後にコミットメッセージを入力してコミットしてしまうというミスを犯しやすいので注意が必要です。

## スカッシュ手順
例えば、**master**ブランチから分岐した**feature/hoge**ブランチで、作業を進めるうちに、以下の様に**恥ずかしいコミットメッセージ**や**無駄なコミット**が蓄積してたとします。
![150614-0005.png](https://qiita-image-store.s3.amazonaws.com/0/66753/a2d0dd5b-cae8-8fbb-5037-b4da442b21af.png)
このまま**master**にマージするのはマズイですよね。
汚いコミット履歴をまとめて、1つのきれいなコミットに書き換えたい場合には以下の様にします。

1. **feature/hoge**ブランチをダブルクリックしてチェックアウトする。
2. グラフ上でブランチの分岐元(この例だとfacea0b)を右クリックして、**「xxxxxxの子を対話形式でリベース」**をクリック。
3. ダイアログ上で、一番上のコミットを選んだ状態で**「過去を含めてsquashする」**をクリック。クリックする度に1つずつ過去のコミットがスカッシュ対象に加えられるので、以下の様に全てのコミットがスカッシュ対象になるまでクリックする。
![150614-0003.png](https://qiita-image-store.s3.amazonaws.com/0/66753/2113b76e-8674-6b3b-b28b-431d16495767.png)
4. **「メッセージを編集」**をクリックしてコミットメッセージを入力。
5. **OKボタン**を押して完了。

すると、以下の様なきれいな歴史に書き換わります。
![150614-0004.png](https://qiita-image-store.s3.amazonaws.com/0/66753/ed74cc8d-5291-347c-a101-e01d533badd7.png)