OmniAICreator/Qiita-1.07M huggingface dataset:
技術英語 > The OCM memory map can be reorganized so that it’s completely [contiguous] > continuous: 時間的連続 / contiguous: 地理的連続

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-49-Using-the-Zynq-SoC-s/ba-p/518579

> The OCM memory map can be reorganized so that it’s completely <font color=red>contiguous</font>

http://ejje.weblio.jp/content/contiguous
> 接触する、隣接する、(…と)隣接して、(時間・順序などで)切れ目のない、連続した、(…と)切れ目がなくて、連続して

<hr>
continuousとどう違うか調べたら以下を見つけた

http://www.igaku-shoin.co.jp/paperDetail.do?id=PA02919_05

> continuous"も"contiguous"もアルファベットが一字違うだけで同じだろうと思ったが，確認のためにその夜また英和辞典を引いた。すると，そこには"continuous（時間的に連続した）"，"contiguous（地理的に連続した）"とあった！　日本語では両方とも単に「連続的」と記憶していたが，時間的と地理的で使い分けがあったのである！

地理的連続でもcontinuousを使っても通じるとは思うが、このような使い分けをすることもあるかもしれない。
Xcode で Objective-C ヘッダーファイルを Swift インターフェースに切り替える方法

Xcode で Swift を書いている時、とあるクラスのインターフェースを見ようと思って開いたら Objective-C ヘッダーファイルが開かれてしまうことがたまにあります。これを何とかしたいです。

<img width="912" src="https://qiita-image-store.s3.amazonaws.com/0/3603/202662a0-8436-0ce9-a82d-ee50649d7c9a.png">
*長い長いデリゲートメソッドをコピペしようにも、ObjC だと困る*

とりあえず Objective-C ヘッダーファイルを開いたら、エディターの左上にある Windows みたいなアイコンをクリックすると現れるメニューに “Generated Interface” というものがあるので、これを実行します。すると内容が Swift インターフェースに切り替わります。あるいはメニューバーの Navigate メニューにある “Jump to Generated Interface” でも同様のことが行えます。これでデリゲートメソッドのコピペも捗りますね。

<img width="222" src="https://qiita-image-store.s3.amazonaws.com/0/3603/88d54eb6-33b5-103f-8a5c-5658a3c47d2c.png"> <img width="405" src="https://qiita-image-store.s3.amazonaws.com/0/3603/8ae1de67-8ccd-1013-f050-ed5545d53690.png">

このエディター左上のメニューは `control + 1` で開くことができるので、続けて `control + N` でフォーカスを移動して `return` で実行すれば、キーボードだけで作業を完結することもできます。メニューに独自のショートカットを割り当てるのも良いでしょう。
Django + MySQLでの設定あれこれ

## 追記 2019/10/29

未だにこの記事読まれてるの謎なんですけど以前に以下のブログ記事を書いたのでこっちを読んでほしい

[DjangoでPyMySQLを使うのそろそろやめよう](https://nnsnodnb.hatenablog.jp/entry/comparing-mysql-api-driver-in-django)

## セットアップ

```bash
$ pip install PyMySQL django
$ django-admin.py startproject <project_name>
$ django-admin.py startapp <app_name>
```

## settings.pyにMySQL接続設定

```<project_name>/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',
        'USER': 'dbuser',
        'PASSWORD': 'password',
        'HOST': '',
        'PORT': '',
    }
}
```

## manage.pyにMySQLを使うように設定

```manage.py
import pymysql
pymysql.install_as_MySQLdb()
```

## 最終セットアップ

```bash
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver
```
AnsibleでDebianのexim4をセットアップし、Gmailを送信できるようにする

# はじめに
ユーザーに届くメールがGmailで読めると、見落とす心配がありません。そのためにexim4をセットアップしてみます。環境はDebian 8、Ansible 2.1です。

基本的に[GmailAndExim4 - Debian Wiki](https://wiki.debian.org/GmailAndExim4)の通りですが、設定ファイルの分割はNO(false)にしています。また /etc/email-addresses だけではなく /etc/aliases も設定しています。

両者の違いは次の通りだと思いますがよく分かりません。

- /etc/email-addresses にはローカルユーザーが、メールを送信するときに使うアドレスを指定する。
- /etc/aliases にはローカルユーザーに届いたメールを、転送する先のアドレスを指定する。

# ansible_playbooks/group_vars/all
```
mail_aliases:
  - { user: 'root', mail: '<user>+root@gmail.com' }
  - { user: 'taro', mail: '<user>+taro@gmail.com' }
smtp_servers:
  - { server: '*.google.com', user: '<user>+root@gmail.com', password: '<password>' }
  - { server: '*.google.com', user: '<user>+taro@gmail.com', password: '<password>' }
```

# ansible_playbooks/roles/exim4/handlers/main.yml
```
- name: restart exim4
  become: yes
  command: "{{ item }}"
  with_items:
   - update-exim4.conf
   - invoke-rc.d exim4 restart
   - exim4 -qff
```

# ansible_playbooks/roles/exim4/tasks/main.yml
```
- name: install exim4
  become: yes
  apt: name='exim4'
  tags: exim4

- name: configure exim4
  become: yes
  lineinfile: 
    dest: '/etc/exim4/update-exim4.conf.conf'
    regexp: "{{ item.regexp }}"
    line: "{{ item.line }}"
  with_items:
    - regexp: '^dc_eximconfig_configtype='
      line: "dc_eximconfig_configtype='smarthost'" # (1)メール設定の一般的なタイプ
    - regexp: '^dc_local_interfaces='
      line: "dc_local_interfaces='127.0.0.1'" # (3)入力側 SMTP 接続をリスンする IP アドレス
    - regexp: '^dc_other_hostnames='
      line: "dc_other_hostnames=''" # (4)メールを受け取るその他の宛先
    - regexp: '^dc_relay_domains='
      line: "dc_relay_domains=''" # (5)メールをリレーするマシン
    - regexp: '^dc_smarthost='
      line: "dc_smarthost='smtp.gmail.com::587'" # (6)送出スマートホストの IP アドレスまたはホスト名
    - regexp: '^dc_hide_mailname='
      line: "dc_hide_mailname='false'" # (7)送出するメールでローカルメール名を隠しますか?
    - regexp: '^dc_minimaldns='
      line: "dc_minimaldns='false'" # (8)DNS クエリの数を最小限に留めますか (ダイヤルオンデマンド)?
    - regexp: '^dc_localdelivery='
      line: "dc_localdelivery='mail_spool'" # (9)ローカルメールの配送方式
    - regexp: '^dc_use_split_config='
      line: "dc_use_split_config='false'" # (10)設定を小さなファイルに分割しますか?
  notify: restart exim4
  tags: exim4

- name: configure smtp server
  become: yes
  lineinfile: 
    dest: '/etc/exim4/passwd.client'
    insertafter: EOF
    line: "{{ item.server }}:{{ item.user }}:{{ item.password }}"
  with_items: "{{ smtp_servers }}"
  notify: restart exim4
  tags: exim4

- name: configure mail from
  become: yes
  blockinfile:
    dest: '/etc/email-addresses'
    insertafter: EOF
    marker: "# {mark} ANSIBLE MANAGED BLOCK {{ item.user }}"
    content: |
      {{ item.user }}: {{ item.mail }}
      {{ item.user }}@localhost: {{ item.mail }}
      {{ item.user }}@{{ ansible_hostname }}: {{ item.mail }}
      {{ item.user }}@{{ ansible_fqdn }}: {{ item.mail }}
  with_items: "{{ mail_aliases }}"
  tags: exim4

- name: configure mail to
  become: yes
  lineinfile: 
    dest: '/etc/aliases'
    insertafter: EOF
    line: "{{ item.user }}: {{ item.mail }}"
  with_items: "{{ mail_aliases }}"
  tags: exim4
```
Pythonでのファイル操作


##読み込み

```python
#coding:utf-8

f = open('test.txt','r')

for row in f:
	print row.strip()

f.close()
```

下記のようにwithを利用すればclose()忘れが無い。

```python
with open('test.txt','r') as f:
    for row in f:
        print row.strip()
```

##書込み

###上書き（追記ではない）

ファイルが存在しない場合は新規作成される。

```python
#coding:utf-8

f = open('test.txt','w')

f.write('hoge\n')

f.close()
```

###追記

ファイルが存在しない場合は新規作成される。

```python
#coding:utf-8

f = open('test.txt','a')

f.write('hoge\n')

f.close()
```

##その他

###存在確認

ファイル系はos.pathを利用します。
exists()を利用すると、フォルダ、ファイル関係なく存在確認ができます。

```python
#coding:utf-8

import os.path

if os.path.exists('test.log'):
	print u"存在."
else:
	print u"非存在"
```

>否定の時は、if not os.path.exists('test.log'): とする。

###削除

ファイルの削除

```python
#coding:utf-8

import os

os.remove('test.txt')
```

###空じゃないディレクトリを再帰的に削除

os系だと空じゃないディレクトリを再帰的に消せないらしいのでshutilを利用します。

```python
#coding:utf-8

import shutil

shutil.rmtree('data')
```
PythonでMySQLやCSVからデータを取り込むメモ


最低限のメモ

###環境

とりあえずpython2.7.x。

そもそも存在確認したりする方法は[こちら](http://qiita.com/zaburo/items/0ba12417dfb39fcb1555)をご覧ください。

##MySQL

###mysql-connector-pythonを利用

MySQLとのやりとりにどのモジュールを使うかは悩ましいですが、ひとまずmysql-connector-pythonを利用。

```python
#coding:utf-8

import mysql.connector 

con = mysql.connector.connect(
		host='localhost',
		db='testdb',
		user='root',
		password='root'
	)

cur = con.cursor(buffered=True)

sql = "select * from members"

cur.execute(sql)

rows = cur.fetchall()

for row in rows:
	print row[1]

cur.close()
con.close()
```

##CSV

###csv(utf-8)

utf-8のカンマ区切りファイルとかならとくに悩むことはありません。

```python
#coding:utf-8

import csv

file = "test.csv"

f = open(file,"r")

reader = csv.reader(f)

for row in reader:
	print row[0]

f.close()
```

###csv(sjisというかcp932)

Excelとかで作られたcsvが送られてきて「読め！」と言われることはよくあることです。
細かく対応するときりがないのですが、とりあえず、下記のようにすれば読めます。

```python
#coding:utf-8

import csv

file = "test2.csv"

f = open(file,"r")

reader = csv.reader(f)

for row in reader:
	print row[0].decode('cp932')

f.close()
```

##素のファイル

訳あって素のファイルを処理しないと行けない場合もあります。

###普通にsplit

strip()で行末の改行を取り除いています。

```python
#coding:utf-8

f = open('test.csv','r')

for row in f:
	item = row.strip().split(',')
	print item[0]

f.close()
```

###正規表現でsplit

正規表現を利用する場合はre.split(pattern,string)を使います。

```php
#coding:utf-8

import re

f = open('test.csv','r')

for row in f:
	item = re.split(',',row)
	print item[0]

f.close()
```

##その他

後はPandas関連でしょうかね。随時追加したいと思います。
O/Rマッパーはなぜ便利か

# 追記(2018/9/29)

元々は炎上ネタに近いなにかだったのでやや僕も書き口が辛辣だったのですこしマイルドにしました。
当時、割と燃えた割に反論記事がなかったので、この人の抽象論を変に解釈して生SQL信者みたいなのが発生しても困るので書いた事情がありましたが、ややこの記事の存在自体が用済みになってきた感もありますね。

# はじめに

この記事は、以下の記事への指摘です。

- [再び、O/Rマッパーはなぜ無駄か (まとめ)](http://qiita.com/kantomi/items/4717c43a2ccc5f7bbad2#comment-4d60844ef1607bf40461)

## この記事の目的

上記の記事がそれなりに反響があり、ほとんどの人は真に受けていないと思うのですが、有望な若手が道を逸らすことがないようにまとめてあります。

# O/Rマッパを使うメリット

O/Rマッパを使うメリットは「再利用性」と「安全性」が特に重要な要素で、ここに(私が想定しているのはRailsの)ActiveRecordならテーブルの1行をオブジェクトにマッピングすることで、オブジェクト指向の恩恵が得られます。

再利用性の良い例に、scopeを使ってwhere,order,joins(includes,references)などの条件を記述しておくことによる恩恵があります。

あるカテゴリ(categories)に属する記事(entries)を抽出するときのSQLとRailsでActiveRecordを使った例を以下に書きます。

`SELECT * FROM entries WHERE category_id = 1;`

`Entry.where(category_id: 1)` （scopeを定義して `Entry.filter_category(category)` としても良いでしょう。ここでのcategoryにはCategoryのインスタンスが入っているはずです。）

さて、ここで単純にページングしつつ記事を10件表示する画面を作るとします。
この場合、kaminariというgemを使うと、RailsのActiveRecordなら以下のコードで書けてしまいます。

```
@entries = Entry.where(category_id: 1).page(params[:page)
```

kaminariの内部でcountと実際の取得を上手にやってくれるから出来る芸当です。

これは簡単すぎる例ですが、SQLを生で使う場合は「件数を取得」して「PAGEとLIMITでいま表示すべき内容を抽出する」少なくとも2つのSQLを構築する必要が出てきます。
また、この場合のWHERE文の使い回しは文字列の連結で行う必要があり、少しのミスがセキュリティホールに繋がります。

WHERE文がさらに複雑だった場合はどうするのでしょう？ 検索条件を複数指定出来て動的にWHERE文を構築したい場合は？
仕様が複雑になるほど、生SQLでは重複コードとメンテナンスコストが跳ね上がるのです。

たとえば、後から「ホーム画面にはView数が10を越えた記事だけを表示する」といった仕様変更をした場合、COUNT側のSQLを書き換え忘れたらページングがバグりますよね。これを私はメンテナンス性と捉えています。再利用性を高めると往々にしてメンテナンス性が上がります。 （DRY原則とほぼ同じ話ですね）
OpenCV for UnityでwebCamTextureToMatできない(WebCamTextureとMatのサイズが違う？)

OpenCV for Unityを使ってウェブカメラの画像をいじろうとしたところ、WebCamTextureをMatに変換するときにエラーが出たため、その時のメモ
※ ビギナーのためコードが汚いと思いますが、ご指摘あればいただけると嬉しいです。

利用環境：Unity5.3, OpenCV for Unity 2.0.1(OpenCV 3.1.0)

# 問題：WebCamTextureとMatのサイズが違うと言われる
```C#:Unity
void Start() {
  webCamTexture = new WebCamTexture(WebCamTexture.devices[0].name);
  webCamTexture.Play();

  mat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC4);
  colors = new Color32[webCamTexture.width * webCamTexture.height];
  texture = new Texture2D(webCamTexture.width, webCamTexture.height);

  GetComponent<Renderer> ().material.mainTexture = texture;
}

void Update() {
  Utils.webCamTextureToMat(webCamTexture, mat, colors); // ArgumentException: The output Mat object has to be of the same size

  // 以下Mat処理
}
}
```
という風に、webCamTextureToMatする時に「Matを同じサイズにしろ」と言われます。
Mat宣言するときにWebCamTextureからwidthとheightを持ってきてるのになんでや。。？

# 原因：WebCamTexture.widthが16と出力される
なにやら、`WebCamTexture.didUpdateThisFrame == false`の状態で`WebCamTexture.width`と`WebCamTexture.height`の値を取得しようとすると(16, 16)で出力されるらしい。そのためmatのサイズが(16, 16)になっていた。

`WebCamTexture.width`の値自体は正常なので、webCamTextureとmatの間にサイズの違いが生じていた模様。

ちなみに下記の参考URLではiOSへのビルドに限って起こるUnity自体のバグと書かれているけど、自分の場合は他のプラットフォームにswitchしても生じたので、そこのところは謎。

参考URL
[https://issuetracker.unity3d.com/issues/ios-webcamtexture-dot-width-slash-height-always-returns-16](https://issuetracker.unity3d.com/issues/ios-webcamtexture-dot-width-slash-height-always-returns-16)

# 解決法：WebCamTexture.didUpdateThisFrame == trueになるまで待つ
`WebCamTexture.didUpdateThisFrame == true`になるまでmatの宣言を待ちつつ、`Utils.webCamTextureToMat(webCamTexture, mat, colors);`はmatが宣言されるまで実行しないようにしたところ、一応問題は解決した。

```C#:Unity
void Start() {
  webCamTexture = new WebCamTexture(WebCamTexture.devices[0].name);
  webCamTexture.Play();
  StartCoroutine (init ());
}

private IEnumerator init (){
  if(webCamTexture.width <= 16){ 
    while(!webCamTexture.didUpdateThisFrame){ 
      yield return new WaitForEndOfFrame(); 
    } 
    webCamTexture.Pause ();
    colors = webCamTexture.GetPixels32 ();
    webCamTexture.Stop ();

    yield return new WaitForEndOfFrame ();
    webCamTexture.Play(); 

    // 宣言
    texture = new Texture2D(webCamTexture.width, webCamTexture.height);
    mat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC4);

    GetComponent<Renderer> ().material.mainTexture = texture;
  }
}

void Update() {
  if (webCamTexture.didUpdateThisFrame && mat != null) {
    Utils.webCamTextureToMat (webCamTexture, mat, colors);

    // 以下Mat処理
  }
}
```
OpenFOAMに関する情報を得られるウェブサイトのまとめ

# 全般

- [OpenFOAM](http://www.openfoam.com/)
- [The OpenFOAM Foundation](http://openfoam.org/)
- [OpenFOAM Wiki](https://openfoamwiki.net/index.php/Main_Page)
- [OpenFOAM Training - CFD Support](http://www.cfdsupport.com/OpenFOAM-Training-by-CFD-Support/OpenFOAM-Training-by-CFD-Support.html)

# マニュアル

- [OpenFOAM User Guide (web page)](http://cfd.direct/openfoam/user-guide/)
- [OpenFOAM User Guide (pdf)](http://foam.sourceforge.net/docs/Guides-a4/UserGuide.pdf)
- [OpenFOAM User Guide 日本語訳 (pdf)](http://foam.sourceforge.net/docs/Guides-a4/UserGuide-Japanese.pdf)
- [OpenFOAM Programmers Guide](http://foam.sourceforge.net/docs/Guides-a4/ProgrammersGuide.pdf)

# クラス説明およびソースコード

- [OpenFOAM C++ Documentation](http://www.openfoam.com/documentation/cpp-guide/html/)

# 日本語情報

- [PENGUINITIS](http://www.geocities.jp/penguinitis2002/study/OpenFOAM/index.html)
- [富山県立大学 機械システム工学科 機械エネルギー工学講座 中川グループ](http://eddy.pu-toyama.ac.jp/jog88d8td-116/)
- [新潟大学大嶋研究室 OpenFOAM関連リソース](http://oshima.eng.niigata-u.ac.jp/OpenFOAM/ja/)
scalaでJavaCV使ってみたかっただけ

### 手順

 1. IntelliJ ideaでsbtプロジェクトを作成する
 1. build.sbtを編集する
 1. plugin.sbtを編集する

### build.sbt

```
// @formatter:off

name         := "sample"
organization := "com.github.cive"


scalaVersion  := "2.11.8"
scalacOptions ++= Seq("-unchecked", "-deprecation", "-Xlint")

classpathTypes += "maven-plugin"

libraryDependencies ++= Seq(
  "org.scala-lang.modules" % "scala-swing_2.11" % "1.0.1",
  "junit"                   % "junit"           % "4.12" % "test",
  "com.novocode"            % "junit-interface" % "0.11" % "test"
)

resolvers ++= Seq(
  Resolver.sonatypeRepo("snapshots"),
  // Use local maven repo for local javacv builds
  "Local Maven Repository" at "file:///" + Path.userHome.absolutePath + "/.m2/repository"
)

autoCompilerPlugins := true

fork := true
javaOptions += "-Xmx1G"

shellPrompt in ThisBuild := { state => "sbt:" + Project.extract(state).currentRef.project + "> " }
```

### plugin.sbt

 - sbt-javacvのバージョン1.7ではエラーが出たので1.6を使用

```
logLevel := Level.Warn

addSbtPlugin("org.bytedeco" % "sbt-javacpp" % "1.4")
addSbtPlugin("org.bytedeco" % "sbt-javacv" % "1.6")
```

### sample.scala

```
import java.awt.image.BufferedImage
import java.awt.{AWTException, GraphicsEnvironment, Robot}
import java.io.IOException
import javax.swing.JFrame

import org.bytedeco.javacpp.opencv_core._
import org.bytedeco.javacv._

object mainApp extends App {
  val image: Mat = try {
    val bounds = GraphicsEnvironment.getLocalGraphicsEnvironment.getMaximumWindowBounds
    val robot = new Robot
    val screen: BufferedImage = robot.createScreenCapture(bounds)
    new OpenCVFrameConverter.ToMat().convert(new Java2DFrameConverter().convert(screen))
  } catch {
    case e: AWTException => {
      println("awt" + e)
      new Mat(1, 1, CV_8UC3)
    }
    case e: IOException  => {
      println("io" + e)
      new Mat(1, 1, CV_8UC3)
    }
  }
  val canvas = new CanvasFrame("My Image", 1)

  canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

  val converter = new OpenCVFrameConverter.ToMat()
  canvas.showImage(converter.convert(image))
}
```
Ansible のregister ,with_items,stdout_linesについて

軽く調べたので復習がてら軽くまとめる


#### register

何らかの処理結果を変数に格納し、再利用するための機構。

http://docs.ansible.com/ansible/playbooks_conditionals.html#register-variables


#### with_items
ループを構築するための機構、種々の言語におけるforeachのようなもの。

http://docs.ansible.com/ansible/playbooks_loops.html#standard-loops

#### stdout_lines

stdoutの亜種
stdoutはregisterで登録した変数の標準出力にアクセスするためのコマンド
stdout_lineはstdoutの出力結果を一行ずつに分割してくれるもの

https://blog.1q77.com/2014/02/ansible-register/

#### commandとshellについて
どちらもシェルコマンドを実行するための機構だが、一部性質が異なる。

shell は実行マシンにおけるbin/sh を経由して実行され、
commandは bin/shを経由せずに実行される。

このため、commandにおいてはパイプ処理や環境変数の参照などが行えない。
環境によらない処理となるため、冪等性などの観点ではcommandの方が優秀と言える。
逆に環境変数などを利用したいときはshellを使うべき。


http://docs.ansible.com/ansible/command_module.html#command
http://docs.ansible.com/ansible/shell_module.html
https://bacchi.me/ansible/tips-2/

#### まとめ

これらをまとめて使うことで、下記の公式のplaybookのように、特定のコマンド結果を利用したループ処理などが構築できる。

http://docs.ansible.com/ansible/playbooks_conditionals.html#register-variables
phpを利用したpc/spサイトの振り分け方法

##pcとspサイトの振り分け方法について。
pcサイトとspサイトを別々に制作して同一urlで振り分ける方法はphp/javascript/.htaccessを利用した方法がある。今回は、リダイレクトは避けたいという理由、それから設置が比較的簡単だという理由からphpファイルを利用した振り分けを行った。

##ディレクトリ構成
/ root
|-index.php
|-/pc pc用ファイル
|-/sp sp用ファイル

##index.php
index.phpの記述内容は下記の通り。urlにアクセスするとpcの場合pcディレクトリに、sp（モバイル端末）の場合spサイトに振り分けられるように記述している。なお、以下の設定ではiPadはpcサイトに振り分けるように設定している。  


```index.php
<?php
$ua = $_SERVER['HTTP_USER_AGENT'];

if ((strpos($ua, 'Android') !== false) && (strpos($ua, 'Mobile') !== false) || (strpos($ua, 'iPhone') !== false) || (strpos($ua, 'Windows Phone') !== false)) {
// スマートフォンからアクセスされた場合
    header("Location: sp/");
    exit();

} elseif ((strpos($ua, 'Android') !== false) || (strpos($ua, 'iPad') !== false)) {
// タブレットからアクセスされた場合
    header("Location: pc/");
    exit();

} elseif ((strpos($ua, 'DoCoMo') !== false) || (strpos($ua, 'KDDI') !== false) || (strpos($ua, 'SoftBank') !== false) || (strpos($ua, 'Vodafone') !== false) || (strpos($ua, 'J-PHONE') !== false)) {
// 携帯からアクセスされた場合
    header("Location: sp/");
    exit();

} else {
// その他（PC）からアクセスされた場合
    header("Location: pc/");
    exit();
}
```
ROS (Kinetic Kame) のインストール


## はじめに

* Ubuntu 16.04 (Xenial Xerus) に ROS (Kinetic Kame) をインストールします。
* ほぼ 1 年前にインストールしてから、あまり触れていなかったので、今回はもう少し頑張りたい。
 * [ROS チュートリアル (1. 初級 - ROSパッケージを作る)](http://qiita.com/Suna/items/7be9bf2bdd343f8201c9)
 * [ROS (Robot Operating System) のインストール](http://qiita.com/Suna/items/2afb31eb245a36748d06)
* 後は、Qiita の[スライドモード](http://help.qiita.com/ja/articles/qiita-slide)をちょっと試してみたかった。

----

## ROS インストール

### 0. 参照ドキュメント

* [ROS.org - Ubuntu install of ROS Kinetic](http://wiki.ros.org/kinetic/Installation/Ubuntu)

ほぼドキュメントの手順通りに行っています。

### 1. sources.listを設定する

```bash
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```

----

### 2. 鍵の設定

```bash
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116
```

### 3. パッケージを最新のものにアップデート

```bash
$ sudo apt-get update
```

----

### 4. ROS のフルセット版をインストール

```bash
sudo apt-get install ros-kinetic-desktop-full
```

### 5. rosdepの初期化
```bash
$ sudo rosdep init
$ rosdep update
```

----

### 6. 環境変数の設定
```bash
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

### 7. rosinstallの準備
```bash
$ sudo apt-get install python-rosinstall
```

----

## 感想

* 改めて書く必要もなかったのかもしれない。
* これをやってみたい。
 * [sphero_ros 0.1 documentation](http://mmwise.github.io/sphero_ros/contents.html)
docker-compose.yml で $ を使いたい場合は $$  にすればいいというはなし

タイトルで全部言い切っちゃってますけど、 `docker-compose.yml` の `command` のところなんかで `$` を使いたいケースってままあると思うんですよ。

例えば以下のようにみたいに環境変数渡したりとか。

```
command: '$HOGE=hoge something'
```

ただこれ動かなくて、たぶんコマンド実行時には `=hoge something` って解釈されちゃうんですね。
で、何となく `$$` にしたら動いたのですが、これが正しいソリューションなのかよく分かってなかったんですが、ちゃんとドキュメントに書いてあったので、以下のように `$$` にするが正解でよさそうでした :ok_woman: 

```
command: '$$HOGE=hoge something'
```

## ドキュメント

**Compose File Reference - Variable substitution**
https://docs.docker.com/compose/compose-file/#variable-substitution

> （日本語は拙訳）
> Both `$VARIABLE` and `${VARIABLE}` syntax are supported. Extended shell-style features, > such as `${VARIABLE-default}` and `${VARIABLE/foo/bar}`, are not supported.
> `$VARIABLE` と `${VARIABLE}` の両方がサポートされています。
> `${VARIABLE-default} や `${VARIABLE/foo/bar} といった拡張シェルスタイル機能はサポートされていません。
> 
> You can use a `$$` (double-dollar sign) when your configuration needs a literal dollar sign. This also prevents Compose from interpolating a value, so a `$$` allows you to refer to environment variables that you don’t want processed by Compose.
> `$`リテラルをコンフィグに記載したい場合、`$$` (ダブルダラーサイン）を利用することができます。
> `$$` を利用することで、`docker-compose` による値の補完から防ぐことができ、あなたが利用したい環境変数の値を指し示すことができるようになります。
> 
```
web:
  build: .
  command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"
```
> 
> If you forget and use a single dollar sign ($), Compose interprets the value as an environment variable and will warn you:
> もし誤って `$` を利用した場合、 `docker-compose` はをれを環境変数だと判断し、次のようなメッセージを表示するでしょう。
> 
> The VAR_NOT_INTERPOLATED_BY_COMPOSE is not set. Substituting an empty string.
> 


とのことですので、気兼ねなく `$$` していきましょう。
Swift 3 で Kitura のサーバアプリケーションを動かすには

**注意** : Swift の仕様がまだ全然安定してないので README に書いてある通りの環境を用意するのが基本となります。ここに書いてあることはすぐ風化する恐れがあります。

Swift を勉強したかったのですが、アプリを作るのは飽きてしまったので、Kitura をやってみることにしました。
現在 Kitura の master ブランチは Swift 3 の最新版に対応済みとなっていて、今から Swift を勉強するなら 3 だろうということで、これを頑張って動かすことに。

## ビルド環境

コミット [55e73b24](https://github.com/IBM-Swift/Kitura/tree/55e73b24d0f1900bc391d6d9aa25c898c30a139d) の README に書いてある docker のやり方は現時点では動きません(docker の image が更新されていない)
README からビルドに必要なものを読み取り、自作します。

- Swift は `DEVELOPMENT-SNAPSHOT-2016-06-06-a version of Swift 3 trunk (master)`
    - 依存パッケージは[公式ページ](https://swift.org/)で確認
    - ubuntu は 14.04 か 15.10
- Kitura の依存パッケージは README で確認
- [libdispatch](https://github.com/apple/swift-corelibs-libdispatch/) なるものが必要。
    - こいつのコミット 7b5b57c3 のインストール手順では　`Initial focus is on ubuntu 15.04.` と書かれている。
    - こいつもまた複数のパッケージに依存する

ということで、まとめると **ubuntu 15.10 に Swift 3 DEVELOPMENT-SNAPSHOT-2016-06-06-a と libdispatch をインストール** すればビルドできそうです。

### docker で環境作成

上記のビルド環境はおそらくガンガン変わっていくのが予想されるので、下記のような感じで docker で作成することにします。 

```docker
FROM ubuntu:15.10

RUN apt-get update -y && apt-get install -y \
  curl git build-essential \
  clang libicu-dev \
  autoconf libtool libkqueue-dev libkqueue0 \
  libcurl4-openssl-dev libbsd-dev libblocksruntime-dev \
  pkg-config systemtap-sdt-dev

RUN curl https://swift.org/builds/development/ubuntu1510/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a-ubuntu15.10.tar.gz > /tmp/swift.tar.gz && \
  tar -xvzf /tmp/swift.tar.gz --directory / --strip-components=1 && \
  rm -f /tmp/swift.tar.gz

ENV PATH /usr/bin:$PATH

RUN git clone --recursive -b experimental/foundation https://github.com/apple/swift-corelibs-libdispatch.git && cd swift-corelibs-libdispatch && sh ./autogen.sh && ./configure --with-swift-toolchain=/usr --prefix=/usr && make && make install
```

## サンプルをビルドして実行してみる

下記コマンドで swift の環境を起動します。 8090 ポートにサーバが立つので予め開けておきます。

```bash
docker build -t swift-kitura .
docker run --privileged -p 8090:8090 -i -t --name mykitura swift-kitura /bin/bash
```

サンプルは [Kitura-Sample]() を動かしてみます……が、 **現時点では master にあるものは SwiftyJSON が古いらしくビルドが通りません。** develop ブランチがあるのでそちらを clone して試しましょう。

```bash
git clone https://github.com/IBM-Swift/Kitura-Sample -b develop && cd Kitura-Sample
make run
```

`Starting an HTTP Server on port 8090...` と表示されてから、 localhost 8090 にアクセスして下記のように表示されれば成功です。

![image](https://qiita-image-store.s3.amazonaws.com/0/17722/a26f6aca-dded-79a2-9d11-c2b1e8db43ec.png)

## 以上となりますが

お察しの通り、 Swift の勉強はまだ一切できておりません。 Docker のいい勉強になりました（開き直り
MacのVimでCtrl + sとCtrl + qのキーマップ割り当てが効かない問題

`.vimrc` に `Ctrl+q` で保存済みバッファをすべて閉じるキーマップを書いたけど効かない。むむむ。

```vim:.vimrc
nnoremap <c-q> :qall<CR>
```

ちなみに環境は Mac + iTerm2 + tmux + zsh + vimです。
んーどこかターミナル上で、横取りされてるのかなぁと思ったらsttyが悪さしていた模様。

`.zshrc` に以下のように書いたらvim上で `Ctrl + q` が使えるようになった。（ついでに `Ctrl +s` も使えるようになる）

```zsh:.zshrc
stty stop undef
stty start undef
```

sttyで `Ctrl + s` が画面出力のstop、 `Ctrl + q` が画面出力の再開に割り当てされてるみたいで、これが原因で効かなかったようです。

(参考) [bashのキーバインド(キーボードショートカット) まとめ - readlineとbind、ついでにstty編](http://hogem.hatenablog.com/entry/20090411/1239451878)

---
(2018/3/16追記)
コメント欄にて @Ress さんから教えてもらいましたが、zshのフローコントロールの問題だったようで、以下の設定でよかったようです。

```zsh:.zshrc
setopt no_flow_control
```
Amazon LinuxにAnsible2.1をインストール 

◆概要
　・Amazon Linux(ami-6154bb00)にAnsible2.1をインストール

◆Ansibleとは？
　・構成管理ツール(サーバとかの設定を自動でやってくれるもの)
　・ChefとかPuppetの類似サービスで後発ツールのため、従来ツールの弱点を克服
　・ChefとかPuppetとは違いクライアント側にAgentが不要
　・デプロイメントツール、オーケストレーションツール、構成管理ツールがinclude
　・構成管理ツールにMUSTな冪(べき)等性も確保されている

◆前提
　・pythonがインストールされているか確認しておく（python --version）
　　→インストールされていなければ、$ sudo yum -y install python
　・今回利用したAmazonLinuxにはデフォルトでpython 2.7.10が入ってた

◆インストール
　・$ sudo pip install ansible
　　...
　　Successfully installed ansible-2.1.0

◆注意点、気になった点
　・インターネットでググッてる感じだとyum install ansibleでインストールするより、
　　sudo pip install ansibleでインストールする方がトラブルがなさそう。
　・インストール直後、$ ansible localhost --connection=local -m pingしても
　　コマンドがないって怒られたので、EC2インスタンスを再起動したら
　　正常にコマンドを実行できた。
Apache LibcloudでAWS, OpenStack, VMwareと接続する

tl;dr
----
* Apache Libcloudが1.0になったので以下を試す
 * Amazon Web Services
 * OpenStack (Mitaka)
 * VMware ESXi 6.0
* ClientはCentOS Linux release 7.2

todo
----
* VMwareは上手く動作しなかったので動くようにしたい。

install pip
----
    # curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
    # python get-pip.py
    # pip -V
    Successfully installed pip-8.1.2 setuptools-23.1.0 wheel-0.29.0


install Apache Libcloud
----
    # pip install apache-libcloud
    Successfully installed apache-libcloud-1.0.0

    # pip install backports.ssl_match_hostname
    Successfully installed backports.ssl-match-hostname-3.5.0.1

    # pip install pysphere
    Successfully installed pysphere-0.1.7


code
----
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    from libcloud.compute.types import Provider
    from libcloud.compute.providers import get_driver

    import libcloud.security
    libcloud.security.VERIFY_SSL_CERT = False

    EC2_ACCESS_ID  = 'XXXX'
    EC2_SECRET_KEY = 'XXXX'

    # Amazon Web Services
    ec2 = get_driver(Provider.EC2)
    driver = ec2(EC2_ACCESS_ID, EC2_SECRET_KEY, region="ap-northeast-1")
    print driver.list_nodes()

    # OpenStack
    openstack = get_driver(Provider.OPENSTACK)
    driver = openstack('admin', 'admin',
        ex_force_auth_url='http://192.168.1.1:5000',
        ex_force_auth_version='3.x_password',
        ex_tenant_name='admin',
        ex_domain_name='Default')
    print driver.list_nodes()

    # VMware ESXi
    vsphere = get_driver(Provider.VSPHERE)
    driver = vsphere(host='192.168.1.2', username='root', password='XXXX')
    print driver.list_nodes()


error
----
    ImportError: No module named backports.ssl_match_hostname
    ※pipでbackports.ssl_match_hostnameをインストールすればOK

    TypeError: __init__() got an unexpected keyword argument 'retry_delay'
    ※VMware接続時に発生。原因不明。バグ？    
    https://issues.apache.org/jira/browse/LIBCLOUD-806

reference
----
* [サポートされているクラウド基盤一覧](https://libcloud.readthedocs.io/en/latest/compute/supported_providers.html)
cakephp3.x系でformをつかってPOSTを送る

CakePHP3でformを作った時に、例があんまりなかったり、２系の情報見てうまくいかなかったりしたのでめも

##例
```php
    <?=$this->Form->create(null,['type' => 'post'])?>
    <ul class="list">
        <?= $this->Form->input('reportType', [
            'type' => 'radio',
            'options' => [
                ['value' => 'blue', 'text' => '青'],
                ['value' => 'mint', 'text' => 'ミントグリーン'],
                ['value' => 'red', 'text' => '赤']
                ['value' => 'white', 'text' => '白']
                ['value' => 'purple', 'text' => '紫']
                ['value' => 'yellow', 'text' => '黄']
            ],
            'templates' => [
                'nestingLabel' => '{{input}}<label{{ attrs }}>{{ text }}</label>',
                'radioWrapper' => '<li class="listItem">{{ label }}</li>'
            ],
            'label' => false, //デフォルトはtrue　trueのままでいい場合に明示的に入れるとlabelが表示されるべきところに 1 とか出力される罠マジでビビる
        ]); ?>
    </ul>
    <?=$this->Form->submit('推し',['class' => 'submitbtn',
        'id' => 'fn-reportSubmitBtn', 'submitContainer' => '{{ content }}']) ?>
    <?=$this->Form->end() ?>
```

##ハマったこと

'div' => false は使えなくて消したかったらtemplatesをいじるしかないっぽいです。divもclassも消えなくてはまっていました。
templateを使えば自分の好きなように項目の前後などにほしいタグが出力されたりもするので便利です。
Swift：プロパティ　個人メモ

個人用のポイントメモです。
閲覧した方でここは覚えてた方がいいよって教えてくれる親切な方がいたら是非コメントください。

---

# プロパティ

## 2種類のプロパティがある

- 保持型プロパティ
- 計算型プロパティ

## 保持型プロパティ

- クラスに持たせる属性
- 定数プロパティだと初期値設定後変更できない。

```swift

class Person {
    let name: String // 名前
    var age: Int // 年齢
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

print(Person.init(name: "hoge", age: 12).name)

// 定数プロパティは初期値設定後変更できない
var p = Person(name: "fuga", age: 10)
p.age = 30
// p.name = "piyo"

```

- lazy(遅延評価)
    - インスタンス生成時には生成されず、実際にアクセスしないと生成しない
    - 定数プロパティにはlazy指定できない
    - 使用ポイントは生成にコストがかかるインスタンスかつそれが使用されるかわからない場合にパフォーマンス向上が見込める

```swift

class Fuga {
    lazy var fuga = Person(name: "piyo", age: 5)
}

var fuga = Fuga() // ここでは生成されない
print(fuga.fuga.name) // この行を書いたときに生成される

```

## 計算型プロパティ

- 値を保持せず他のプロパティの値から都度計算して結果を返したり設定するプロパティ
- 値の設定・返却に**get,set**を使う

## プロパティ監視

- プロパティ値が設定される前と設定された後に処理ができる
- 設定される前に呼ばれるのは**willSet()**
- 設定された後に呼ばれるのは**didSet()**
- willSet()に引数を与えない場合は**newValue**で値を参照できる
- didSet()に引数を与えない場合は**oldValue**で値を参照できる

```swift
class Person2 {
    let name: String
    var age: Int = 0 {
        willSet {
            print("\(self.age)から\(newValue)歳へ年齢を変更する")
        }
        didSet {
            print("\(oldValue)歳から\(self.age)歳へ年齢を変更した")
        }
    }
    // イニシャライザ
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let p2 = Person2(name: "hogehoge", age: 30)
print(p2.age)
p2.age = 20
print(p2.age) // willSet,didSetが呼ばれている
```

- willSet(),didSet()はイニシャライザ内からの変更時には呼ばれない
- プロパティ監視ではlazyは使えない
- プロパティ監視では計算型プロパティにも使用できない
- 配列やディクショナリ型のプロパティに対しては代入だけでなく追加削除でも呼ばれる

## クラス・構造体・列挙型にもプロパティを持たせられる

- クラスは計算型プロパティのみ持てる
- 構造体と列挙型は保持型・計算型プロパティ両方持てる
    -　イニシャライザがないので保持型プロパティには宣言時に初期値が必要
-　statciをつけて宣言する

```swift
/* ログイン情報 */
struct LoginInfo {
    static var url = "https://login.com/"
    static var port: Int {
        if self.url.hasPrefix("https") {
            return 443
        } else {
            return 80
        }
    }
    var userId: String = "001"
}

print(LoginInfo.url)
print(LoginInfo.port)

LoginInfo.url = "aaa"
print(LoginInfo.port)
```

- 型プロパティはインスタンスの属性としてアクセスできない
- 型名.プロパティ名という形式でのみアクセスできる

```swift
var loginInfo = LoginInfo()
print(loginInfo.userId)
// print(loginInfo.url) // これはエラー
print(LoginInfo.url)
```
tesseract-OCR for Python [日本語対応版]

# tesseract-ocr for Python

## はじめに、やりたいこと
OCR 技術を利用して、日本語を抽出したい。
また抽出した日本語は、色々な用途で利用予定。

## 利用環境
MacBook Pro (13-inch, Mid 2012)
プロセッサ: 2.5 GHz Intel Core i5
メモリ: 4 GB 1600 MHz DDR3
OS: OS X El Capitan (Ver.10.11.4)


## インストール参照先:
- [tesseract-ocr(Mac版)](https://github.com/tesseract-ocr/tesseract/wiki#mac-os-x)

You can install "Tesseract" using either "[MacPorts](https://www.macports.org/)" or "[Homebrew](http://brew.sh/)".
(あなたは"MacPorts"か、"Homebrew"のいずれかで、"Tesseract"をインストールすることができます。)

### 1. 利用したもの
- [MacPorts](https://www.macports.org/)

```sh:ターミナル
sudo port install tesseract
# '<langcode>'部分に処理したい言語のパッケージをインストールする (英語:eng, 日本語:jpn)
sudo port install tesseract-<langcode>
```

- [Homebrew](http://brew.sh/)


```sh:ターミナル
brew install tesseract
```

### 2. 実行
今回は、日本語と英語を混ぜた画像を用意しました。

``` sh:ターミナル
tesseract test.png out -l eng+jpn

```
※実行した画像の情報
大きさ: 996 x 517
↓↓↓↓画像↓↓↓↓
![test.png](https://qiita-image-store.s3.amazonaws.com/0/12007/30348a1f-5be6-2eea-1f34-3de49585fbd7.png)
↑↑↑ここまで↑↑↑

# 結果
```sh:テキスト出力結果
tesseract—ocr for Python

はじめにヽ やりたいこと

OCR 技術を利用 して、 日本語を抽出 したい。
また抽出 した 日本語はヽ 色々 な用途で利用予定。
```

# 反省点
細かく試していないので、特にこれといったことではないのですが、
おそらく"解像度"や"空白部分(余白含め)"などあらゆる条件でも結果が変わってくると思います。
いつか必要があれば、検証してみます。

ちなみに、"英語のみ"や"日本語のみ"だと、かなりいい結果となっています。
cakephp3でcomposerを使ってtwiliosdkを管理


composerでtwilioをinstall

```
composer require twilio/sdk
```

設定を追記

```config/bootstrap.php
require_once(ROOT . DS . 'vendor' . DS  . 'twilio' . DS . 'sdk' . DS . 'Services' . DS . 'Twilio    .php');
```
finatra 五歩目


# Moduleの利用
今回はModuleを利用して

```scala
lazy val db = source(new MysqlAsyncSourceConfig[Literal]("db")) 
```

としていた部分をModule化していちいち書かないようにします。

今回~~パクる~~参考にするコードは
https://github.com/ikhoon/finatra-mysql-seed/blob/master/src/main/scala/com/github/ikhoon/modules/QuillDatabaseModule.scala
です。

# Module とは

http://twitter.github.io/finatra/user-guide/getting-started/#modules

```
Modules are used in conjunction with dependency injection to specify how to instantiate an instance of a given type. They are especially useful when instantiation of an instance is dependent on some type of external configuration (see: Flags).
```

# コードに出てくる Provides ってなにもの？

`@Provides`の説明は↓を見るとわかりますが
[Provides メソッドでインジェクションするインスタンスを定義する](http://qiita.com/opengl-8080/items/6fb69cd2493e149cac3a#1-8)
>このメソッドの戻り値がインジェクションに利用される。

とあるように
`@Provides`をつけたメソッドの戻り値がインジェクションに利用されるよーということです。

なので

```scala
@Provides @Singleton
def provideDataBaseSource() = source(new MysqlAsyncSourceConfig[Literal]("db"))
```

とした場合、

```scala
class GroupRepository @Inject()(db: QuillDatabaseSource) {
```

とすることで、`db` には `source(new MysqlAsyncSourceConfig[Literal]("db"))`が入っていることになるのです。

# こんな感じに

参考元ではconfigもいじってますが、そこまでする気はないので↓のような感じになります。

```
package modules

import com.github.mauricio.async.db.mysql.MySQLConnection
import io.getquill._
import com.twitter.inject.TwitterModule
import io.getquill.naming.Literal
import io.getquill.sources.async.MysqlAsyncSource
import io.getquill.sources.sql.idiom.MySQLDialect
import com.google.inject.{Provides, Singleton}

/**
  * Created by Fumiyasu on 2016/06/25.
  */
object QuillDatabaseModule extends TwitterModule {
  type QuillDatabaseSource = MysqlAsyncSource[MySQLDialect, Literal, MySQLConnection]

  @Provides @Singleton
  def provideDataBaseSource() = source(new MysqlAsyncSourceConfig[Literal]("db"))
}
```

https://github.com/FScoward/handshake-api/tree/0.4
楽しいClojureの話

# これはなに？
沖縄で行われた[ハッカーズチャンプルー 2016](http://hackers-champloo.org/2016/)の懇親会のLT大会で発表した資料です。

----

# Clojureとは
- Lisp方言のひとつ
- インタラクティブな開発(REPL)
- 関数型プログラミング
- 並行処理をしやすい
- 多様な実行環境(JVM、ClojureScript)

---

# Lispの特徴

```clj
(str "カッコが多い言語です")

;; 関数をカッコの1番目に、2番目からあとにはその関数の引数をいれます
(+ 1 2 3 4) ; => 10

;; マクロを使って新しい文法を自分で追加できます
(defmacro unless [test then]
  (list 'if (list 'not test)
    then)))

(if true "then" "else") ; => "then"
(unless true "then" "else") ; => "else"

```
---

# インタラクティブな開発(REPL)

<img width="1440" alt="スクリーンショット 2016-06-25 16.37.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/26205/2d15323c-e4ea-a7b1-f5e9-be57e879536d.png">


---  

# 基本、不変なデータ(変数じゃない)
```clj
; シンボルにデータを束縛する
(def my-name "arakaki yuji")
my-name ; => "arakaki yuji"

; レキシカルスコープ内のみで一時的に束縛
 (let [my-name "yuji"]
   my-name) ; => "yuji"

; スコープ外には影響ない
my-name; => "arakaki yuji" 

; 文字
/a 

; 文字列
"Hello World"

; list(Lispのベースとなるデータ型)
(list 1 2 3) ; => (1 2 3)

; Vector(順番を持ったコレクション)
["a" 1 'hello \a]

; Map(キーと値を対応させたコレクション)
{:name "arakaki yuji" :age 27}

; Set(値が一意になること保証したコレクション)

; シンボル
(symbol "my-name") ; my-name

; 関数
(fn [n] (+ n 5))
; => #object[user$eval19622$fn__19623 0x243a2394 "user$eval19622$fn__19623@243a2394"]

```

---

# 関数が第一級オブジェクト

```clj
; 関数定義
(defn hello-world [name]
  (str "Hello World, " name))

; 関数が第1級オブジェクトなので引数で関数を返せる関数作れる
(defn add-factory [number]
        (fn ([] number)
            ([n & more] (apply + (conj more n number)))))

(def add-8 (add-factory 8)
(def add-100 (add-factory 100))
(add-8 2)
; => 10
(add-100 30)
; => 130

```

---


# 変更可能なデータもある
基本不変データのClojureですが、変更可能なデータ型もある。
それらは用途に応じて使い分けれるように複数あります。

---

# 変更可能なデータ型の種類
- atom
- ref
- agent

```clj
; atom 
(atom x 1)
x ; => #object[clojure.lang.Atom 0x757c7948 {:status :ready, :val 1}]
;; 値を参照するには@をつける
@x ; => 1
;; 単独で値を変更したいデータの時に使う
(reset! x 5)
@x ; => 5

; ref
(def y (ref 1))
y ; => #object[clojure.lang.Ref 0x3fe68e45 {:status :ready, :val 1}]
;; 値を参照するには@をつける
@y ; => 1
; refは複数の値を協調して変更したい場合に使う
(def z (ref 5))
(dosync 
  (ref-set y 10)
  (ref-set z 20))
@y ; => 10
@z ; => 20

; agent
(def a (agent 1))
a ; => #object[clojure.lang.Agent 0x307b6b7e {:status :ready, :val 1}]
@a : => 1
; agentは非同期でデータを変更したい場合に使う
(send a + 100)
; => #object[clojure.lang.Agent 0x307b6b7e {:status :ready, :val 1}]
a
; => #object[clojure.lang.Agent 0x307b6b7e {:status :ready, :val 101}]

```
---

# 並行処理をしやすい
Clojure自体が並行処理を前提として設計されている

- 不変なデータ型
- 関数型プログラミングにより副作用を減らす
- 並行処理をサポートする機能を複数用意

---

# 並行処理用の機能
まだちゃんと勉強できていないのでこんなのあるよ〜ぐらい・・

- agent
- thread
- core.async
- future

---

# 多様な実行環境
- Clojure(.clj)
    - JVM上で実行される
    - Javaのライブラリを使用可能

- ClojureScript(.cljs)
    - JavaScriptにコンパイルされる(AltJS)

- 両方でコードを共有可能(.cljc)
    - フロントエンドとサーバーサイドでロジックを共有できる
    - 各動作環境の独自機能は共有できないので注意

---

# 最後に
Clojure楽しいがまだ自分は大きなアプリケーション書いたことはないので、これから書いていきたい。

もし他にも興味ある方がいれば一緒にやりましょう^^/
Windowsで作ったProjectをMacでhub amしたら失敗する話

改行コードが違うのが原因


# バージョン

```
$ hub --version
git version 2.4.5
hub version 2.2.1
```

# 経緯

1. GitHubにRepository作る
2. Windows(＝改行コード「CR+LF」)でファイルを作って、GitHubにpushしてる
3. ↑↓開発チームが移管
4. 改修を行い、pull requestを作る
6. GitHubのWebページで「Merge pull request」する(ここまでは成功する)
7. リリースが決定する
8. Macで、リリース用ブランチにてhub amする

    ```
$ hub am <pull requst>
```

9. patchの適用に失敗する

    ```
error: patch failed: 
```

10. 悲しい気持ちになる

# 解決法1：dos2unixコマンドを使う

解決法1は、commit後に「git log -p -2」すると、
ファイルの全行が更新されたことになってしまう。
そのかわし、一度やれば、以降は
該当ファイルは普通にhub amできるようになる。

1. 更新したいファイルの改行コードを変更する

    ```
$ dos2unix <ファイルパス>
```

2. patchを手動適用

    ```
$ patch -p1 < .git/rebase-apply/patch
```

3. rejファイルがないことを確認

    ```
$ find . -name "*\.rej" | wc -l
```

4. patchの適用に成功したら、git add & git am & git push

    ```
$ find . -name "*\.orig" | xargs rm
$ git add .
$ git am --continue
$ git push origin <リリース用ブランチ>
```
最初の「find . -name "*¥.orig" | xargs rm」は、
patchファイルに空白のみの行があった時などに
origファイルが作成されてしまうため、削除しておく。
※本当は、出ないようにpull requestを作成するのが正解

# 解決法2：patchコマンドに--binaryオプションをつける(未検証)

解決法2は、更新したい箇所だけを更新できるから、
リリース用ブランチのチェックは正確にできそう。

1. patchを手動適用

    ```
patch --binary -p1 < .git/rebase-apply/patch
```

2. patchの適用に成功したら、git add & git am & git push

    ```
$ git add <更新したファイル>
$ git am --continue
$ git push origin <リリース用ブランチ>
```

# 解決法3:Windowsでマージする

※前準備
git for windowsをインストール
https://git-for-windows.github.io/

1. ブラウザで以下のURLにアクセスし、patchファイルをローカルに保存

    ```
http://github.com/・・・/・・・/pull/1.patch
```

2. Git BASHを起動し、プロジェクトに移動

    ```
$ cd プロジェクトパス
$ git checkout <リリース用ブランチ>
```

3. git amを実行

    ```
$ git am patchファイル置き場/1.patch
```

4. 失敗するので、patchを手動適用

    ```
patch --binary -p1 < .git/rebase-apply/patch
```

5. patchの適用に成功したら、改行コードがLinux(LF)になってしまう為、エディター等を使い、改行コードを戻す

6. git add & git am & git push

    ```
$ git add <更新したファイル>
$ git am --continue
$ git push origin <リリース用ブランチ>
```
link_to data: { confirm: 'Are you sure?' }をスイートに


## スイート？

![sweet_confirm.gif](https://qiita-image-store.s3.amazonaws.com/0/38472/9b8ebf26-1ced-acaa-6098-05c542346d81.gif "sweet_confirm.gif")

ブラウザ標準の確認ダイアログの代わりに、[Sweet Alert2](https://limonte.github.io/sweetalert2/)を使います。

## 事前準備

Sweet Alert2をインストールします。

- rails-assets
- distを`app/assets/javascripts`に直接置く
- CDNをHTMLから読み込む

など

## 呼び出し側の準備

```erb
<%= link_to '削除する', @resource, method: :delete, data: { sweet_confirm: '本当に削除してよろしいですか？' } %>
```

通常は`data: { confirm: '...' }`とするところを
`data: { sweet_confirm: '...' }`に変える。

※デフォルトを上書きしたい場合は変えなくていいと思います。
※後ほど書くJSでどうにでも対応できるので、`sweet_confirm`じゃなくても大丈夫です。

## JSを用意する

Sweet Alert2のダイアログを表示し、Yesの場合は呼び出し元のリンクをそのままリクエストするようにします。

※ruby側は`sweet_confirm`（アンダースコア）ですが、JS側は`data-sweet-confirm`（**ハイフン**）です。

```js
$('a[data-sweet-confirm]').on('click', function(e) {
  e.preventDefault();
  e.stopPropagation();

  var $link = $(this);

  swal({
    title: $link.data('sweet-confirm'),
    text: "You won't be able to revert this!",
    type: 'warning',
    showCancelButton: true,
    confirmButtonColor: '#3085d6',
    cancelButtonColor: '#d33',
    confirmButtonText: 'Yes, delete it!'
  }).then(function() {
    $link.trigger('click.rails');
  }, function(dismiss) {})
});
```

元のリンクを処理する部分はrailsの`jquery-ujs`がリッスンしている
`click.rails`イベントを起こしています。
こうすることで、`remote: true`のリンクにも対応できます。

## 以上

簡単にスイートにできました。
Gitでファイル名の大文字・小文字の変更を検知するようにする

Gitはデフォルトでファイル名の大文字・小文字の変更は検知しない設定になっている。
（たとえば、hoge.htmlからHoge.htmlにしても検知しない）

```bash
$ git config -l --local | grep core.ignorecase
core.ignorecase=true
```

これをfalseにしてあげたらOK.

```bash
$ git config core.ignorecase false
```

確認。

```bash
$ git config -l --local | grep core.ignorecase
core.ignorecase=false
```
Atom タブ移動のショートカットキーとおすすめパッケージ

#ショートカットキー
##左右のタブに移動
|キー|コマンド|備考|
|:--|:--|:--|
|⌘⇧[|pane:show-previous-item|前のタブに移動|
|⌥⌘←|〃|〃|
|^pageup|〃|〃|
|⌘⇧]|pane:show-next-item|次のタブに移動|
|⌥⌘→|〃|〃|
|^pagedown|〃|〃|
##最近使用したタブ順に移動
|キー|コマンド|備考|
|:--|:--|:--|
|^⇧tab|pane:show-previous-recently-used-item|前の最近使用したタブに移動|
|^tab|pane:show-next-recently-used-item|次の最近使用したタブに移動|
##タブ番号を指定して移動
|キー|コマンド|備考|
|:--|:--|:--|
|⌘1~9|pane:show-item-1~9|番号1~9のタブに移動|
##タブリストを表示
|キー|コマンド|備考|
|:--|:--|:--|
|⌘B|fuzzy-finder:toggle-buffer-finder|開いているバッファーのリストを表示|
##タブを左右に移動
|キー|コマンド|備考|
|:--|:--|:--|
|^⇧←|pane:move-item-left|タブを左に移動|
|^⇧→|pane:move-item-right|タブを右に移動|
#おすすめパッケージ
##[tab-numbers](https://atom.io/packages/tab-numbers)
![tab-numbers-screenshot](https://i.github-camo.com/c6ad28be973ba88c19aa9dd2aa38d8a25185f9a6/68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f4d526f64616c67616172642f61746f6d2d7461622d6e756d626572732f6d61737465722f73637265656e73686f74732f707265766965772e706e67)タブの閉じるボタンをタブ番号にするパッケージ。
番号指定のショートカットキーを使うときに便利。
ステータスバーの総タブ数は設定から非表示にできます。
##[expose](https://atom.io/packages/expose)
![expose-screenshot](https://i.github-camo.com/ebe00b0f6d52cf01dba5fd0a0ec3ae861222c4a3/68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6d726f64616c67616172642f61746f6d2d6578706f73652f6d61737465722f73637265656e73686f74732f707265766965772e706e67)Mac OSX Exposéのようにタブ一覧を表示できるパッケージ。
[minimap](https://atom.io/packages/minimap)と[file-icons](https://atom.io/packages/file-icons)を入れると見た目が良くなります。
`⌘⇧E`で表示。
`←`と`→`で選択、`1`~`9`でジャンプ。
`Enter`か`ESC`で閉じる。
設定からアニメーションをオフにできます。
Amazon EC2にTensorFlow開発環境をコマンドコピペで構築する

## はじめに
布教用メモです。ローカルリソース実行だとPCがつらいことになるので環境を分離したい人向けです。
学習コピペ用に先頭の`$`表記は外しています。
再構築の手間(Docker上ではないけど構築失敗しても気軽にインスタンスをつぶせる)と価格を重視しています。実行速度重視、GPUをぶん回したい場合は[別記事](http://qiita.com/h860a/items/294262d98e1223008252)を参考にしてください。

## 手順
### Amazon EC2インスタンス追加
* https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LaunchInstanceWizard
* Ubuntuパッケージを選択。
* 「セキュリティグループ」でポートをいい感じにあけておく。細かくは省略。
 * ssh: 22
 * Jupyter: 8888
* AWS未契約の人は`t2.micro`を使えば(たぶん)新規契約から1年間は無料。
* 作成後、パブリックDNS(ec2-xxxxxxxxxx.ap-northeast-1.compute.amazonaws.com)はコピーしてテキストエディタに貼り付けておく

### sshログイン
```sh
chmod 600 xxxxxxxxxx.pem
ssh -v -i xxxxxxxxxx.pem ubuntu@ec2-xxxxxxxxxx.ap-northeast-1.compute.amazonaws.com
```

### パッケージ更新
```sh
sudo apt-get update && sudo apt-get -y upgrade
```

### Python準備
#### pipインストール
```sh
sudo apt-get install -y python-pip python-dev
sudo pip install -U pip
```

### 機械学習ライブラリ + TensorFlow
#### よく使うライブラリのインストール
以下をインストールしている。

1. numpy: 行列計算ライブラリ
1. scipy: 科学計算ライブラリ
1. pandas: データフレームライブラリ
1. matplotlib: グラフ描画ライブラリ
1. Pillow: 画像処理ライブラリ
1. scikit-learn: 機械学習ライブラリ
1. google-api-python-client: Google API Client for Python

```sh
sudo apt-get install -y libpq-dev python-matplotlib gfortran
sudo pip install --upgrade pip
sudo pip install numpy scipy pandas matplotlib Pillow scikit-learn
sudo pip install google-api-python-client
```

#### TensorFlowインストール
2016/09/01時点での最新版をインストール。
[最新版](https://www.tensorflow.org/versions/master/get_started/os_setup.html#pip-installation)を確認してからインストールしてください。

```sh
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl
```

### Jupyter
#### Jupyterインストール
```sh
sudo pip install jupyter
```

#### Jupyter config変更(ポート設定など)
```sh
jupyter notebook --generate-config && ipython profile create
echo "c = get_config()" >> /home/ubuntu/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.ip = '*'" >> /home/ubuntu/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.open_browser = False" >> /home/ubuntu/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.port = 8888" >> /home/ubuntu/.jupyter/jupyter_notebook_config.py
echo "c.InteractiveShellApp.matplotlib = 'inline'" >> /home/ubuntu/.ipython/profile_default/ipython_kernel_config.py
```

#### Jupyterのログインパスワード設定
ログインパスワードを登録。登録完了後に表示されるsha1をコピーしておく。

```sh
python -c 'import IPython;print(IPython.lib.passwd())'
```

コピーしたsha1をconfigに追加する。

```sh
echo "c.NotebookApp.password = 'sha1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'" >> /home/ubuntu/.jupyter/jupyter_notebook_config.py
```

#### Jupyter起動
`jupyter notebook`
で起動すると`http://ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com:8888/`でログイン可能。
EC2インスタンス起動と同時に起動したい場合は`/etc/rc.local`に起動スクリプトを登録しておく。

### Jupyter動作確認
ブラウザからログイン、[TensorFlowのHello, Worldサンプル](https://www.tensorflow.org/versions/master/get_started/os_setup.html#run-tensorflow-from-the-command-line)で42が表示されればOK

```python
import tensorflow as tf

hello = tf.constant("Hello, TensorFlow!")
sess = tf.Session()
print(sess.run(hello))

a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a + b))
```
golangでURLをパース


net/urlパッケージを使ってパースする.

```golang:parse.go
package main

import (
  "fmt"
  "log"
  "net/url"
)

func main() {
  //General form
  u, err := url.Parse("http://user1@bing.com:8080/search?q=foo%2fbar&q2=hoge#fragment")
  if err != nil {
    log.Fatal(err)
  }
  fmt.Printf("URL: %s\n", u.String())
  fmt.Printf("Scheme: %s\n", u.Scheme)
  fmt.Printf("Opaque: %s\n", u.Opaque)
  fmt.Printf("User: %s\n", u.User)
  fmt.Printf("Host: %s\n", u.Host)
  fmt.Printf("Hostname(): %s\n", u.Hostname())
  fmt.Printf("Path: %s\n", u.Path)
  fmt.Printf("RawPath: %s\n", u.RawPath)
  fmt.Printf("RawQuery: %s\n", u.RawQuery)
  fmt.Printf("Fragment: %s\n", u.Fragment)
  
  for key, values := range u.Query() {
    fmt.Printf("Query Key: %s\n", key)    
    for i, v := range values {
      fmt.Printf("Query Value[%d]: %s\n", i, v)          
    } 
  }  
}
```

```console
$go run parse.go
URL: http://user1@bing.com/search?q=foo%2fbar&q2=hoge#fragment
Scheme: http
Opaque:
User: user1
Host: bing.com:8080
Hostname(): bing.com
Path: /search
RawPath:
RawQuery: q=foo%2fbar&q2=hoge
Fragment: fragment
Query Key: q
Query Value[0]: foo/bar
Query Key: q2
Query Value[0]: hoge
```
herokuの環境変数に登録したRSA公開鍵からOpenSSLオブジェクトを生成する方法

herokuの環境変数にRSA公開鍵を登録し、それを使ってOpenSSLオブジェクトを生成する際に手間取ったのでまとめます。

##　はじめに

はじめに、以下の様な形でコードを書きました。

```rb
open_ssl_obj = OpenSSL::PKey::RSA.new ENV['RSA_PRIVATE_KEY']
```

そしてherokuの環境変数は以下のように設定しました。

```
$ heroku config:set RSA_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...中略...-----END PRIVATE KEY-----\n"
```

しかし、このコードを実行した際に以下のエラーが起こりました。

```
OpenSSL::PKey::RSAError (Neither PUB key nor PRIV key: nested asn1 error)
```

色々と試していくと以下のようなことが分かりました。

- ローカル環境にて環境変数ではなく、直接RSA公開鍵の内容を入れて実行する → 成功！
- ローカル環境にて環境変数にRSA公開鍵を設定し、実行する → 成功！
- herokuにて環境変数ではなく、直接RSA公開鍵の内容を入れて実行する → 成功！

`heroku config` で `ENV['RSA_PRIVATE_KEY']` の値を確認したのですが、値自体は合っていました。

## 解決方法

またもや色々と調べた結果、以下のコードで解決しました。

```rb
open_ssl_obj = OpenSSL::PKey::RSA.new ENV['RSA_PRIVATE_KEY'].gsub("\\n", "\n")
```

どうもherokuの環境変数に設定した値に `\n` や '&' などがあった場合は、エスケープされる様子。
なので、コード上で読み込む際にそのエスケープされた部分を消してあげることが必要なようです。
Windows Power Shell 5.0 を Windows7 にインストールする手順

# やりたいこと

* Windows Power Shell 5.0 を Windows7 にインストールする。

# 前提環境

* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64
* .NET Framework 4.5 以上 ([.NET Framework 4.6.1 を Windows7 にインストールする手順](http://qiita.com/bu-son/items/acb54f852962426eb2ed)) (16/08/09 19:58追記)

# インストールするソフトウェア

* Windows Management Framework 5.0

# 手順

## インストーラをダウンロード

[Windows Management Framework 5.0](https://www.microsoft.com/en-us/download/details.aspx?id=50395) で **Download** を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/116788d8-5db5-06db-383e-1a36d4c80160.png)

1. **Win7AndW2K8R2-KB3134760-x64.msu** を選択
2. **Next** を選択しインストーラをダウンロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/b206f1ea-f5df-b9d7-3e44-d5f3cad03384.png)

## インストーラを実行

ダウンロードされたインストーラ **Win7AndW2K8R2-KB3134760-x64.msu** を実行

**はい** を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/01ce9065-b05c-c653-9263-5b0f663b1b79.png)

**同意します** を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/5c81b297-cc65-3d76-b47c-600112ad9fc7.png)

**今すぐ再起動** を選択して、PCを再起動。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/2b167e2b-f188-a0f3-1c24-47cde87c7d63.png)

1. PowerSheel を起動。`%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe`
2. PowerShell のバージョンを確認

```ps1:コマンド
PS C:\> $PSVersionTable
```

```ps1:出力結果
Name                           Value
----                           -----
PSVersion                      5.0.10586.117
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.10586.117
CLRVersion                     4.0.30319.34209
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

# 完了

# 参考文献

- [PowerShell/Windows7にPowerShell5.0をインストールしてみた](http://win.just4fun.biz/PowerShell/Windows7%E3%81%ABPowerShell5.0%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F.html)