OmniAICreator/Qiita-1.07M huggingface dataset:
ElectronでSWFを扱おうとして失敗した話（コメント欄で解決、近々本記事も更新します）

Electronの内部にSWFを埋め込み、JS←→SWFで命令を送り合いたかったけれど、あまりうまく行かなかったお話

## 検証バージョン
- Electron v0.29.2
- Mac OSX Yosemite バージョン10.10.4
- Mac OSX、Chrome用のPepperFlashPlayer.plugin(Adobe Flash Player 18.0 r0)

## できたこと
「[using-pepper-flash-plugin.md - GitHub](https://github.com/atom/electron/blob/master/docs/tutorial/using-pepper-flash-plugin.md)」や「[hokein/electron-sample-apps/pepper-flash-plugin - GitHub](https://github.com/hokein/electron-sample-apps/tree/master/pepper-flash-plugin)」 を参考にelectron-prebuiltでSWFを表示してみること。

## うまく行かなかったこと
- electron-packagerでパッケージ化した時に「Couldn't load plugin.」と表示されswfを表示できなかった。
- JavaScript側からExternalInterface経由でFlashへ命令を送れなかった。
- Flash側からExternalInterface経由でJSへ命令を送れなかった。

## 使用したファイル / コード

- [main.js](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-main-js)
- [package.json](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-package-json)
- [index.html](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-index-html)
- [ElectronSwfViewer.html](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-electronswfviewer-html)
- [ElectronSwfViewer.swf](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-electronswfviewer-swf) -  [ElectronSwfViewer.as](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-electronswfviewer-as)をビルドしてできたswf
- swfobject.js - [swfobject - GoogleCode] (https://code.google.com/p/swfobject/)
- PepperFlashPlayer.plugin - chrome://plugins からChromeのプラグインが保存されている場所を調べ、コピーしてきたFlashのプラグインファイル

## 上記を試した時の挙動

### JavaScript側からExternalInterface経由でFlashへ命令を送れなかった。
- FlashのSecurity.sandboxType が "localWithNetwork" になっているため？"localTrusted"になれるとよさそうだけれど・・・。
![electron-debug0.png](https://qiita-image-store.s3.amazonaws.com/0/1423/9277eb6c-d38f-bc1e-d86d-93c7c135433a.png)

- 通常ならJSから呼び出せるはずのSWFで定義されているcallSwfFunc()関数がundefinedだった

> alert("" + document.getElementById("ElectronSwfViewer").callSwfFunc )

![electron-debug1.png](https://qiita-image-store.s3.amazonaws.com/0/1423/a58a7911-ac32-db5d-8091-166b3de82ed5.png)

( 期待していた挙動 - [ElectronSwfViewer.html](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-electronswfviewer-html)をローカルサーバーで実行した例 ) 
![testボタンを押した時に期待する表示.png](https://qiita-image-store.s3.amazonaws.com/0/1423/5e27be5a-2dd4-12eb-0c9e-a8ec1078c739.png)


### electron-packagerでパッケージ後に、SWFが表示されない
[main.js](https://gist.github.com/nyamogera/90dfab58a7add3aaf066#file-main-js)

![SWFがロードされない.png](https://qiita-image-store.s3.amazonaws.com/0/1423/fbdb0958-d473-4afd-8fa1-b1b6dbd27d63.png)

## まとめ
パッケージ化した時に動かないとなると他の人に渡すためには使えないし、JSとの連携もできないとSWFを表示させているだけのあまり意味のないものになりそう。プラグインを直接埋め込んでるというのも、Flash Playerがリリースされるたびに差し替えないといけないのか？というところが気になる。
Electronのwebview内の扱いがよくわかっていないので、あとでもうちょっと調べたい。
(個人的メモ）(ruby) 見出しつきテキストとか読み込んで加工処理するケース


#想定するケース

整形されたデータを読み込んで
いろんな処理をしたくなることはよくあります。

一番上の行に見出しが、そこから下に延々とデータが並んでいるケースとか。

# 見出し行とそれ以外で処理が異なる

見出し（ヘッダ）の行のときの処理
スルー　もしくは見出しに応じた判定処理とか

見出し以外の行のときの処理
各項目のパラメータを取得するなど、様々な処理を行う。

# サンプルコード

こんな流れになる。といった観点で見ていただければ

<pre>

#ファイルの読み込み
f = open("read1.txt")
#カウンタの用意 （判定用のフラグを用意する）
i = 0;

#１行ずつ読み込む
f.each {|line| 

#最初の行とそれ以外で処理が変わる分岐処理
  if i == 0
    puts 'ここに、ヘッダのときの処理を記述'
  else 
    puts 'ここに、ヘッダ以外のときの処理を記述'
  end

  i = i + 1
}
	
f.close
</pre>
国際登録の取消しの後の商標登録出願の特例による出願に関する拒絶理由の特例について

# 商標法第68条の34の条文

（拒絶理由の特例）

* **第六八条の三四**　第六十八条の三十四第六十八条の三十二第一項又は前条第一項の規定による商標登録出願についての第十五条の規定の適用については、同条中「次の各号のいずれかに該当するとき」とあるのは、「次の各号のいずれかに該当するとき又は第六十八条の三十二第一項若しくは第六十八条の三十三第一項の規定による商標登録出願が第六十八条の三十二第一項若しくは第六十八条の三十三第一項若しくは第六十八条の三十二第二項各号<font color="#9b9">（第六十八条の三十三第二項において読み替えて準用する場合を含む。）</font>に規定する要件を満たしていないとき」とする。
* **2**　国際登録に係る商標権であつたものについての第六十八条の三十二第一項又は前条第一項の規定による商標登録出願<font color="#9b9">（第六十八条の三十七及び第六十八条の三十九において「旧国際登録に係る商標権の再出願」という。）</font>については、第十五条<font color="#9b9">（第一号及び第二号に係る部分に限る。）</font>の規定は、適用しない。

## 旧国際登録に係る商標権の再出願でない場合

商標登録出願の出し直しの場合は第1項の規定による。結局は我が国における通常の商標登録出願となるため、商標法15条(拒絶の査定)の規定による審査は当然するし、68条の32もしくは68条の33の利益を得るための要件を具備しているかも審査する。

## 旧国際登録に係る商標権の再出願である場合

第2項の規定による。一度権利になっているため、15条の規定は適用しないが、15条3号の審査は行う。

* **第一五条**<br/>　**三**　その商標登録出願が第五条第五項又は第六条第一項若しくは第二項に規定する要件を満たしていないとき。

5条5項は、商標登録を受けようとする商標を特定するものでなければならない、という規定で、H26改正より追加。新しいタイプの商標(→施行規則4条の8、ホログラム商標、動き商標、位置商標等)の出願に関する明確性の要件。

6条は一商標一出願の要件。
【Swift】Int型の数字から[Int]型の配列を生成する。数字を桁ごとに分ける。


# Swift 2 & Swift 3 & Swift 4

```swift

let num = 1234
let numList = "\(num)".characters.flatMap { Int("\($0)") }
// let numList = String(num).characters.flatMap { Int(String($0)) }

print(numList)
// [1, 2, 3, 4]
```

Swift3でも動作することを確認。(2016/09/28）
Swift4で動作確認。（2017/10/04）
raspberry pi の HDMI になんか出力したい


せっかく HDMI ついてるんだし、X を経由せずになんか出力したい。

OpenGL ES2 のサンプルが /opt/vc 以下にあってコンパイルして出力できるけど、この低レベルのAPIを弄るのは辛いのでもっとカジュアルに。

## openFrameworks を使う

of になれてるならこちらで。

- http://openframeworks.cc/setup/raspberrypi/

オフィシャルにもドキュメント用意されている。現在リリースされてるバージョンは 0.8.4 系だが raspi2 で動かすには [Raspberry Pi 2 Setup Guide](http://forum.openframeworks.cc/t/raspberry-pi-2-setup-guide/18690) の方法で動かすか、0.9RC1 を使うのが良い。

## OpenVG を使う

cho45 さんに教えて貰うまで知らなかったんだけど、もっと気軽に 2D 弄りたい用途なら [OpenVG](https://en.wikipedia.org/wiki/OpenVG) が使える。
 
raspi なら C/Go の API を提供してる [ajstarks/openvg](https://github.com/ajstarks/openvg) や node での実装の [node-openvg](https://github.com/luismreis/node-openvg) が使えた。go, node 共に raspbian のパッケージが古いので、

- http://dave.cheney.net/unofficial-arm-tarballs
- https://nodejs.org/dist/v0.10.28/

から arm バイナリを入れる。

また node-openvg の作者が作っていた [node-openvg-canvas](https://github.com/luismreis/node-openvg-canvas) という Canvas ぽく触れるライブラリもあったんだけど、raspi2 + node 0.10.28 の環境ではセグフォで動かなかった。
CoffeeScriptで覚えたい文法

ワイ用のメモや

#商の整数値

```coffeescript:coffee
a // b
```

```js:js
Math.floor(a / b)
```

# 整数化（切り捨て）

```coffeescript:coffee
a // 1
```

```js:js
Math.floor(a)
```


#累乗

```coffeescript:coffee
a ** b
```

```js:js
Math.pow(a, b)
```

#配列の走査

```coffee:coffee
for value, key in array
   console.log key
   console.log value
```

```js:js

var i, key, len, value;

for (key = i = 0, len = array.length; i < len; key = ++i) {
  value = array[key];
  console.log(key);
  console.log(value);
}

```

#連想配列の走査

```coffee:coffee
for key, value of hash
   console.log key
   console.log value
```

```js:js

var key, value;

for (key in hash) {
  value = hash[key];
  console.log(key);
  console.log(value);
}

```

#配列要素の指定
`.. `は右端を含む
`...`は右端を含まない
**点の数と意味の覚え方**
`..`は「近い」ので「含む」。`...`は「遠い」ので「含まない」。
（@puriketu99談）


```coffee:coffee
test = [0,1,2,3,4,5,6,7,8]

ika = test[0..3]
miman = test[0...3]

for i in [0..3]
   console.log i
for i in [0...3]
   console.log i
```

```js:js
var i, ika, j, k, miman, test;

test = [0, 1, 2, 3, 4, 5, 6, 7, 8];

ika = test.slice(0, 4);

miman = test.slice(0, 3);

for (i = j = 0; j <= 3; i = ++j) {
  console.log(i);
}

for (i = k = 0; k < 3; i = ++k) {
  console.log(i);
}
```

#スワップ
```coffee:coffee
[theBait, theSwitch] = [theSwitch, theBait]
```
```js:js
ref = [theSwitch, theBait], theBait = ref[0], theSwitch = ref[1];
```


# いらん要素を捨てる
```coffee:coffee
text = "Every literary critic believes he will
        outwit history and have the last word"
[first, ..., last] = text.split " "
```

```js:js
var first, last, ref, text;

text = "Every literary critic believes he will outwit history and have the last word";

ref = text.split(" "), first = ref[0], last = ref[ref.length - 1];
```

#比較演算子の連結
```coffee:coffee
healthy = 200 > cholesterol > 60
```
```js:js
healthy = (200 > cholesterol && cholesterol > 60);
```

# ヒアドキュメント
`"""`で囲む
インデント入れてよし

```coffee:coffee
text = """
       ora
       ora
       ora
       """
```

```js:js
var text;

text = "ora\nora\nora";
```
スラッシュで項目を分けたリストの表示をCSS ::before で

ブログから転載します。
[スラッシュで項目を分けたリストの表示をCSS ::before で](http://detham.tumblr.com/post/126818346814/%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A7%E9%A0%85%E7%9B%AE%E3%82%92%E5%88%86%E3%81%91%E3%81%9F%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%82%92css-before-%E3%81%A7-%E3%81%8A%E9%A1%8C-%E6%94%AF%E5%BA%97-%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A8%E3%83%BC%E3%82%AF)

## お題

> 支店： ニューヨーク / 大阪 / ホーチミン市 / プノンペン

こういうやつ、最後のスラッシュがないのがポイント。どうするか、結構めんとくさい。

### 1. Rubyの場合、下のような感じ

```lang:ruby
支店: 
<%= @branches.collect{|branch| branch.name }.join(' / ') %>
```

わりとスマート。問題なし

### 2. PHPの場合、下のような感じ

```lang:php
支店: 
<?php foreach($branches as $index => $branch)
{ if ($index != 0) echo " / "; echo $branch->name; } ?>
```

なんか違うかも。

### 3. Twigの場合、下のような感じ

例１)

```lang:twig
支店: {% なんか長くてややこしいコード %}
```
例２)

```lang:twig
支店: {% $branches|list_names_with_seperater(' / ') %}
```

…..考えるのもいや。

### 4. 解決策 by CSS

HTMLは普通に羅列するだけ。で囲むのがポイント

```lang:html
支店: 
<span class="inline-item">ニューヨーク</span>
<span class="inline-item">大阪</span>
<span class="inline-item">ホーチミン市</span>
<span class="inline-item">プノンペン</span>
```

::before 擬似要素で / を入れていく、:first-child は表示しない

```lang:css
.inline-item::before {
  content: "/";
  margin-left: .5em;  
  margin-right: .5em;  
}
.inline-item:first-child::before {
  content: none;
}
```

追記：もっとスマートな方法 by @ShibuyaKosuke さん

```lang:css
.inline-item + .inline-item::before {
  content: "/";
  margin-left: .5em;  
  margin-right: .5em;  
}
```

なんか長年の問題が解決して嬉しい。スッキリ。

参考: [プログラム組んだら負け！実はHTML/CSSだけでできること2015夏](http://www.slideshare.net/yusukehirao/htmlcss2015)
Vagrant 上に Chef-Soloの環境構築

Chef-Soloの環境を作って、クックブックやレシピの開発環境を整備します。
この環境は、[Rubyの環境を作った記録](http://qiita.com/MahoTakara/items/f48cdf29ddfd17f954bf)で作成した BOX を元にしています。

# ベース環境の起動

Chef-Soloを動かすディレクトリを作成して、移動します。

```
pxedhcp1:Vagrant maho$ mkdir Chef-Solo
pxedhcp1:Vagrant maho$ cd Chef-Solo/
pxedhcp1:Chef-Solo maho$ ls -la
total 0
drwxr-xr-x   2 maho  staff   68  8 16 15:49 .
drwxr-xr-x  21 maho  staff  714  8 16 15:49 ..
```
BOX名を指定して初期化します。

```
pxedhcp1:Chef-Solo maho$ vagrant box list
RoRDev_Ubuntu14     (virtualbox, 0)
Ubuntu14.04_minimam (virtualbox, 0)
pxedhcp1:Chef-Solo maho$ vagrant init RoRDev_Ubuntu14
```
Vagrantfile を編集して、メモリとCPU数を追加、プライベートLANを追加します。

```
pxedhcp1:Chef-Solo maho$ vi Vagrantfile 
```
仮想マシンを起動します。

```
pxedhcp1:Chef-Solo maho$ vagrant up
```
仮想マシンが起動したらログインして、Chefをインストールしていきます。

```
pxedhcp1:Chef-Solo maho$ vagrant ssh
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Sun Aug 16 05:53:19 2015 from 10.0.2.2
vagrant@vagrant-ubuntu-trusty:~$ 
```

# Chef-Solo のインストール
インストール実行

```
vagrant@vagrant-ubuntu-trusty:~$ gem install chef
vagrant@vagrant-ubuntu-trusty:~$ gem install knife-solo
vagrant@vagrant-ubuntu-trusty:~$ gem install berkshelf

```
導入結果確認

```
vagrant@vagrant-ubuntu-trusty:~$ knife -v
Chef: 12.4.1
vagrant@vagrant-ubuntu-trusty:~$ chef-apply -v
Chef: 12.4.1
vagrant@vagrant-ubuntu-trusty:~$ chef-solo -v
Chef: 12.4.1
```
リポジトリを作って初期化する

```
vagrant@vagrant-ubuntu-trusty:~$ mkdir chef-repo
vagrant@vagrant-ubuntu-trusty:~$ cd chef-repo/
vagrant@vagrant-ubuntu-trusty:~/chef-repo$ knife solo init .
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...
```
クックブックを作成する

```
vagrant@vagrant-ubuntu-trusty:~/chef-repo$ knife cookbook create dstat
** Creating cookbook dstat in /home/vagrant/chef-repo/cookbooks
** Creating README for cookbook: dstat
** Creating CHANGELOG for cookbook: dstat
** Creating metadata for cookbook: dstat
```

# Chef-Client solo クライアントのインストール

rootでログイン可能かたssh鍵が共有されたサーバーに対して、chef-clientをリモートでインストールする

```
vagrant@vagrant-ubuntu-trusty:~/chef-repo$ knife solo bootstrap 192.168.33.21 -i ~/key/identity 
```


# その他
vagrant + VirtualBoxで動作させる場合に、以下のユーテリティをインストールしておくと、ホストのファイルシステムを共有できる。

```
root@vagrant-ubuntu-trusty:~# apt-get install virtualbox-guest-utils 
```
Linux Foundation Certified Engineer Domains & Competencies


# Network administration
* Configure network services to start automatically at boot
* Implement packet filtering
* Monitor network performance
* Produce and deliver reports on system use, outages and user requests
* Route IP traffic statically and dynamically
* Troubleshoot network issues

# Network filesystems and file services
* Configure systems to mount standard, encrypted and network file systems on demand
* Create, mount and unmount standard Linux file systems
* Provide/configure network shares via NFS
* Transfer files securely via the network
* Update packages from the network, a repository or the local file system

# Network security
* Configure Apache log files
* Configure the firewall with iptables
* Install and configure SSL with Apache

# Remote access
* Configure the firewall with iptables

# HTTP services
* Configure an http client to automatically use a proxy server
* Install and configure an Apache web server
* Install and configure the Squid proxy server
* Restrict access to a web page with Apache
* Restrict access to the Squid proxy server
* Setting up name-based virtual web hosts

# Email services
* Configure email aliases
* Install and configure an IMAP and IMAPS service
* Install and configure an smtp service
* Restrict access to an smtp server

Refer: https://training.linuxfoundation.org/download-free-certification-prep-guide
Linux Foundation Certified System Administrator Domains & Competencies


# Local system administration
* Creating backups
* Creating local user groups
* Managing file permissions
* Managing fstab entries
* Managing local users accounts
* Managing the startup process and related services
* Managing user accounts
* Managing user account attributes
* Managing user processes
* Restoring backed up data
* Setting file permissions and ownership

# Local security
* Accessing the root account
* Using sudo to manage access to the root account

# Shell scripting
* Basic bash shell scripting

# Software management
* Installing software packages

# Command-line
* Editing text files on the command line
* Manipulating text files from the command line

# Filesystem & storage
* Archiving and compressing files and directories
* Assembling partitions as LVM devices
* Configuring swap partitions
* File attributes
* Finding files on the filesystem
* Formatting filesystems
* Mounting filesystems automatically at boot time
* Mounting networked filesystems
* Partitioning storage devices
* Troubleshooting filesystem issues

Refer: https://training.linuxfoundation.org/download-free-certification-prep-guide
CentOS7 インストール


## Centos7
http://www.centos.org/download/

DVD ISOをダウンロードして、DVD-Rに焼く。
または、USBメモリをLiveUSB化する
http://www.linuxliveusb.com/en/download

DVD又はUSBからBOOTしてインストールする
以下の設定以外は次へで大丈夫

ネットワーク設定でIPv4タブで、手動を選択する。
ルーターのIPが192.168.1.1、作成するサーバのIPを192.168.1.50の場合
アドレス: 192.168.1.50
サブネット: 24
デフォルトゲートウェイ: 192.168.1.1
DNS: 8.8.8.8, 8.8.4.4

このDNSのIPアドレスはGoogleのDNSです。
他にDNSサーバがあれば、それでもかまいません。
ルーターのIPがわからない場合は、ローカル側のコマンドプロンプトで

```
netstat -r
```

と入力して、0.0.0.0またはdefaultの行のゲートウェイの列に書かれているのがデフォルトゲートウェイのIPです。

次はHost名を入力します。

最後にroot(管理者)のパスワードを入力します。

後は進んでいくだけでインストールは完了

今度はローカル側から接続します。
Macの場合はTerminal、Windowsの場合は、Puttyをダウンロードしてインストールして下さい。
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html


Terminalの場合

```
ssh root@192.168.1.50
```

先程設定したパスワードを入力すれば接続出来るはずです。
ログインができたら、脆弱性等あるかもしれませんので、まずはCentOSのアップデートをします。

```
yum -y update
```
WEB開発をするまで



---

何もないところから、JavaでのWEBサイト構築が出来るところまでの情報を記載します。【新人向け】


* [CentOS7 インストール](http://qiita.com/FSMS/items/4a6f7c36d50aa087ef84)
* [CentOS7 CentOS7でノートPCを閉じてもサスペンドさせない](http://qiita.com/FSMS/items/0a562a330ba7914e98cf)
* [CentOS7 ユーザ作成](http://qiita.com/FSMS/items/a86a0fe5908b474fe61c)
* [CentOS7 sudo](http://qiita.com/FSMS/items/980f078f0455a98dd098)
* [CentOS7 sshの設定](http://qiita.com/FSMS/items/44c6c207f2653d40fc72)
* [CentOS7 Java Tomcat Mavenのインストール](http://qiita.com/FSMS/items/082815821d6b0206780b)
aesの中でローカル変数を使いたい

# Q.
`aes`の中でローカル変数を使おうと以下のコードを試しました。

```NG_example.R
library(ggplot2)

xy <- data.frame(x=1:10,y=1:10)

plotfunc <- function(Data, YMul=2){
  ggplot(Data, aes(x=x, y=y*YMul)) + geom_line()
}

plotfunc(xy)
```

でも以下のエラーが出てうまくいかないです。
`以下にエラー eval(expr, envir, enclos) :  オブジェクト 'YMul' がありません`
どうしたらいいでしょうか？

# A.
以下のように、`environment`の引数を指定するとうまくいきます。これでローカルの環境で実行できるようになります。

```OK_example.R
library(ggplot2)

xy <- data.frame(x=1:10, y=1:10)

plotfunc <- function(Data, YMul=2){
  ggplot(Data, aes(x=x, y=y*YMul), environment=environment()) + geom_line()
}

plotfunc(xy)
```

# 参考資料
この記事はStackOverFlowの以下の質問の日本語訳です（一部省略および改変）。
http://stackoverflow.com/questions/10659133/local-variables-within-aes
scala勉強ノート5 ～値、変数及び遅延値～

値は変更不可である。↓は2行目でエラーとなる。

```scala
val v = 1
v = 2
```

変数は変更可能である。

```scala
var v = 1
v = 2
```

遅延値は1回目のアクセス時に評価される。通常の値は作成時に評価される。

```scala
val v = { println("kitty on your lap"); 1 }
println(v)
lazy val lazyv = { println("kitty on your lap"); 1 }
println(lazyv)
println(lazyv)
```
arduinoで7セグメントLED

aitendoで入手した７セグメントLEDをarduino unoに、つないで見ました。

##写真

![MVC-015S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e79935f9-c3c9-8d6e-b710-37a1f3aa264c.jpeg)

##ライブラリー作りました。

https://github.com/ohisama/Sevenseg595

##サンプルコード

```
#include "Sevenseg595.h"

int sc = 12;
int lc = 11;
int sd = 10;
Sevenseg595 seg;

void setup()
{
	seg.registerPins(sc, lc, sd);
	seg.clear();
}
void loop()
{
	seg.disp('I');
	delay(500);
	seg.disp(' ');
	delay(500);
	seg.disp('L');
	delay(500);
	seg.disp('O');
	delay(500);
	seg.disp('V');
	delay(500);
	seg.disp('E');
	delay(500);
	seg.disp(' ');
	delay(500);
	seg.disp('Y');
	delay(500);
	seg.disp('O');
	delay(500);
	seg.disp('U');
	delay(500);
	seg.disp(' ');
	delay(500);
	seg.disp(' ');
	delay(500);
}

```

ideは、1.6.5を使ってます。

以上。
geom_densityで端が切れるのをやめさせたい

# Q.
以下のように`geom_density`を使って確率密度関数を描くと端が切れちゃいます。これだと積分して1になっていないし、なんか気持ち悪いのでやめさせたいのですが。

```NG_example.R
library(ggplot2)

ggplot(faithful, aes(x=waiting)) +
  geom_density(fill='green', alpha=0.2)
```
![NG_example.png](https://qiita-image-store.s3.amazonaws.com/0/12869/ded94282-22a3-dd4b-7110-db48cdf1744e.png)


# A.
以下のように`xlim`を追加すればOKです。

```OK_example1.R
library(ggplot2)

ggplot(faithful, aes(x=waiting)) +
  geom_density(fill='green', alpha=0.2) +
  xlim(30, 110)
```
![OK_example1.png](https://qiita-image-store.s3.amazonaws.com/0/12869/44f014a2-d8b8-6818-b83b-24a3fb479030.png)

範囲を手動で決めるのが嫌なら`density`関数で求めてそのrangeを使うのがよいでしょう。二度手間ですが。

```OK_example2.R
library(ggplot2)

dens <- density(faithful$waiting)
ggplot(faithful, aes(x=waiting)) +
  geom_density(fill='green', alpha=0.2) +
  xlim(range(dens$x))
```
![OK_example2.png](https://qiita-image-store.s3.amazonaws.com/0/12869/11dbaf1c-3176-29fb-cc66-f7a8b0854dc8.png)

# 参考情報
もともとの回答は@kohskeさんにslackで教えてもらいました。
https://r-wakalang.slack.com/messages/ggplot2/

回答を元に検索し、下記のStackOverFlowの質問をもとにこの記事を書きました。コードはほぼ引用です。
http://stackoverflow.com/questions/28698852/adjusting-x-limits-xlim-in-ggplot2-geom-density-to-mimic-ggvis-layer-densiti
[Swift] FacebookSDK iOS 4.4 で logout した後に loginViewControllerに戻って再度loginしても画面遷移が行われない場合

# TDLR

- 作業メモ・備忘録なので状況がよくわからないかもしれません。
- モーダルを出したらちゃんと消そうということ。

# 状況

## Storyboardを2つ用意しています。
- 1. Login周り
- 2. その他メイン用

## FacebookSDK iOS 4.4を使ってログインして、メインのStoryboardに遷移

```swift
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
　・
　・
　// accessTokenとか諸々をアプリ用サーバーに登録したり、RealmやUserDefaultsなんかに保存したり。。。
　・
　・
　// メインのStoryboardのInitialViewControllerへ遷移
　    var storyboard: UIStoryboard = UIStoryboard(name:"Main", bundle: nil)
      var nextVC: UIViewController = storyboard.instantiateInitialViewController() as! UIViewController
     self.navigationController?.pushViewController(nextVC, animated: true)
}
```

## FBSDKLoginManager().logOut()でログアウトして、ログイン用のStoryboardに戻る

```swift
FBSDKLoginManager().logOut()
let storyboard = UIStoryboard(name: "Login", bundle: nil)
let nextVC = storyboard.instantiateInitialViewController() as! UIViewController
self.presentViewController(nextVC, animated: true, completion: nil)
```

## 結果

だいたい以上の様な流れのコードをRunしてみました。
- FBログイン→ログアウト→FBログイン
↑をしたところ、SafariのFBログイン画面でConfirmした後、アプリに戻りましたが、ログイン画面のまま遷移しませんでした。

# 対応

ログアウト後の画面がモーダルになっていたので、以下のコードを画面遷移に追加しました。

```swift
self.dismissViewControllerAnimated(true, completion: nil)
```

これによってうまく動きました。

# 疑問

Facebookログインとは別にOAuth2を用いたソーシャルログイン機能も実装していまして、そちらは上記の対応をしなくても問題なく動作していました。

FacebookSDKの中身を覗いても特別複雑な処理はしていませんでした。

同じ画面遷移のコードでどうして動作に差が生まれたのかがわかりません。

# 画面遷移について

[こちらが参考になりました](http://qiita.com/omatty198/items/cb037b8aa8b9b410be03)
HyBrisの質問について


①Impexと、CSVインポートで違いはあるのか。
hybris上、
インポート処理はCSVファイルにしても、最終的に全部impexファイルに変換して処理するので、理論上データベースにある全部のデータをimpexでインポート、アウトプット可能です。
違いとしては、書き文法

外部からもらうデータなら、CSVのほうが多いです。

Hot　Folda　https://wiki.hybris.com/display/R5T/Hot+Folder

Impexでは可能な操作がCSVインポートではできないことはないのか、知りたいです。
データのインポートといえば、ないと

②CSVインポートでValidation処理は可能か。
内部処理は最終的impexですが、Validation処理ある
③ワークフローをキックすることは可能か。
行列の積

行列のスカラ倍、ベクトルの内積、転置行列、行列の積を求める関数を、Pythonで実装してみました。

* 行列の積については、教科書でおなじみの手計算を模したアルゴリズムを組むとループがすごいことになりそうだったので、いったんBの転置行列B_tを作成し、Aの行ベクトルとB_tの行ベクトルとの内積を求め、その値を結果の(i,j)成分に埋め込むという作りにしました。
* Pythonでは多次元配列の初期化は、リスト内包表記をネストした書き方になります。

```py3:matrix.py
#!/usr/bin/env python                                                                                                                   
# -*- coding : utf-8 -*-

def get_matrix_scalar_mul(matrix, n): 
    if isinstance(matrix[0], list):
        return [get_matrix_scalar_mul(matrix[i], n) for i in range(len(matrix))]

    return [x*n for x in matrix]

def get_inner_prod(raw, col):
    return sum([x*y for (x,y) in zip(raw,col)])

def get_matrix_trans(matrix):
    # malloc n*m matrix
    matrix_t = [[0 for j in range(len(matrix))] for i in range(len(matrix[0]))]

    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            matrix_t[j][i] = matrix[i][j]

    return matrix_t

def get_matrix_mul(matrix1, matrix2):
    # malloc A_m*B_n matrix
    result = [[0 for j in range(len(matrix2[0]))] for i in range(len(matrix1))]
    matrix2_t = get_matrix_trans(matrix2)

    for i in range(len(result)):
        for j in range(len(result[0])):
            result[i][j] = get_inner_prod(matrix1[i], matrix2_t[j])

    return result

if __name__ != '__main__':
    exit(None)
#
# main
#
A = [ [1,2], \
      [0,1], \
      [5,1]]

B = [[1,-2,4,0], \
     [0,-1,2,3]]

print '2A = '
print get_matrix_scalar_mul(A, 2)

print 'A x B = '
print get_matrix_mul(A, B)

exit(None) 
```

```bash:実行結果
$ python sample.py 
A = 
[[1, 2], [0, 1], [5, 1]]
B = 
[[1, -2, 4, 0], [0, -1, 2, 3]]
2A = 
[[2, 4], [0, 2], [10, 2]]
A_t = 
[[1, 0, 5], [2, 1, 1]]
A x B = 
[[1, -4, 8, 6], [0, -1, 2, 3], [5, -11, 22, 3]]
```
PHP+PostgreSQLのためのpgsql.soの生成手順

macにapache,phpがプリインストールされていますが、phpとPostgreSQLと連携するためのモジュール「pgsql.so」は自前で用意する必要があります。
ここではpgsql.soの生成〜php.iniへの設定までをまとめた手順になります。


## 導入環境
* Mac OSX Yosemite(10.10.1)

## 準備編 - autoconfインストール
1. インストールの有無を確認
<pre>$ autoconf --help</pre>
2. 導入されてなければautoconfのダウンロード
<pre>$ curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz</pre>
3. 解凍
<pre>$ tar xvzf autoconf-2.69.tar.gz</pre>
4. 解凍したディレクトリまで移動
<pre>$ cd autoconf-2.69</pre>
5. Makefileを生成、インストール
<pre>$ ./configure && make && sudo make install</pre>
6. インストール先の確認
<pre>$ which autoconf
/usr/local/bin/autoconf</pre>

## 準備編 - automakeインストール
1. インストールの有無を確認
<pre>$ automake --help</pre>
2. 導入されてなければautomakeのダウンロード
<pre>$ curl -OL http://ftpmirror.gnu.org/automake/automake-1.14.tar.gz</pre>
3. 解凍
<pre>$ tar xvzf automake-1.14.tar.gz</pre>
4. 解凍したディレクトリまで移動
<pre>$ cd automake-1.14</pre>
5. Makefileを生成、インストール
<pre>$ ./configure && make && sudo make install</pre>
6. インストール先の確認
<pre>$ which automake
/usr/local/bin/automake</pre>

## 作業編
1. phpのバージョンを確認し、同じバージョンのソースコードを[ダウンロード](http://php.net/downloads.php)
<pre>
$ php -v
PHP 5.5.14 (cli) (built: Sep  9 2014 19:09:25) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans</pre>
2. 解凍
<pre>$ tar xvzf php-5.5.14.tar.gz</pre>
3. pgsqlをusrディレクトリへmv
<pre>$ mv php-5.5.14/ext/pgsql /usr/include/php/ext/pgsql/</pre>
4. No.3の移動先のディレクトリへ移動
<pre>$ cd /usr/include/php/ext/pgsql/</pre>
5. ビルドする
<pre>$ phpize<pre>
6. Makefileを生成、明示的にpgsqlコマンドの場所を指定する
<pre>$ ./configure --with-pgsql=/Users/doishun/.pgvm/environments/current/bin/</pre>
7. インストール
<pre>$ make && sudo make install
/usr/lib/php/extensions/no-debug-non-zts-20121212/ などと結果が表示される</pre>
8. php.iniを開く
<pre>sudo vi /private/etc/php.ini</pre>
9. php.ini設定
<pre>extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/pgsql.so</pre>
10. apacheの再起動
<pre>apachectl graceful</pre>
Chef-soloでcookbook反映までの手順メモ


## Chefのインストール

Chefは公式からインストール
https://downloads.chef.io/chef-dk/

knife-soloも同時にインストール

```
sudo chef gem install knife-solo
```


## レポジトリの作成

```
knife solo init chef-repo-myblog
```

treeで見ると下記のようなディレクトリが生成

```
|____.chef
| |____knife.rb
|____cookbooks
|____data_bags
|____environments
|____nodes
|____roles
|____site-cookbooks
```

## cookbookの作成
今回はMysqlのモジュールをインストール

```
knife cookbook create mysql -o site-cookbooks
```

※ `-o site-cookbooks`で生成するディレクトリの指定。サードパーディからとってきたcookbook以外はすべてsite-cookbooks内に作っていく

モジュールを入れているだけですが、一応レシピの中身

```site-cookbooks/mysql/recipes/default.rb
%w{mysql mysql-devel mysql-server}.each do |pkg|
  package pkg do
    action :install
  end
end

service "mysqld" do
  action [ :enable, :start]
end
```

## リモートにchefをアップ

cookbookを反映する準備としてprepareコマンドでchefをリモートにアップします。

```
knife solo prepare my-blog
```

※`~/.ssh/config`にホスト情報を書き込んでいるためHost Nameのみで認証可能となっています。

例

```
Host my-blog
    HostName IP_Address
    IdentityFile    Path_to 認証ファイル
    User            認証user
```

## nodesの編集
prepareコマンド後にnodesにファイルの追加されているのが確認できる

```nodes/my-blog.json
{
  "run_list": [

  ],
  "automatic": {
    "ipaddress": "my-blog"
  }
}
```

`run_list`に作成したcookbookを追加

```nodes/my-blog.json
{
  "run_list": [
     "recipe[mysql]"
  ],
  "automatic": {
    "ipaddress": "my-blog"
  }
}
```

## Cookbookの反映
これでnodeに追加したレシピがリモートに追加される

```
knife solo cook my-blog
```

## 参考
Chef Soloの正しい始め方
http://tsuchikazu.net/chef_solo_start/

Chefに入門(4) 〜knife-soloの導入〜
http://qiita.com/us10096698/items/fb90e1317349abf1c45c

ちなみにドライランも可能
http://d.hatena.ne.jp/rx7/20120910/p1
転がるサイコロを試してみました

## はじめに

転がるサイコロを思い付いたので、それを試してみました。立体のサイコロというよりも、平面に展開されたサイコロで敷き詰められた平面をイメージして作りました。

## Gist

[こちら](https://gist.github.com/t-mochizuki/a639e71d0b9775fff38a)にアップロードしました。

ダウンロードして、index.htmlを開くと次のような展開されたサイコロが表示されます。

![dice.png](https://qiita-image-store.s3.amazonaws.com/0/29884/a2e04837-4fb5-d305-9eb0-7d773163c8d0.png)


## 使い方

h, j, k, lで、左、上、下、右方向に転がります。他のキーでは転がりません。

## 振り返り

本当は平面に展開されたサイコロが平面を移動するイメージだったのですが、そちらは実装できていません。

また、サイコロで敷き詰められた平面も実装できていません。その理由の１つは、平面に展開されたサイコロで平面を敷き詰めることができるのかどうか分からなかったからです。時間があれば、手を動かして確認してみたいと思います。

ひとまず、転がるサイコロというイメージを試してみました。
JuceDemoPluginをビルド(Mac)


[JUCE](http://www.juce.com/)のサンプルに入っているJuceDemoPluginをMacでビルドするまでの手順です。（OSX10.10.5, XCode6.4, JUCE3.2.0）

failed to find AUResources/AUResources.rとか、VST SDKが見つからないとか言われてエラーが出ます。

その場合、必要な物は以下の２つです。

- Core Audio Utility クラス
- VST3 SDK

## Core Audio Utility

[Core Audio Utility Classes](http://developer.apple.com/library/ios/#samplecode/CoreAudioUtilityClasses/
)をダウンロードして、/Applications/Xcode.app/Contents/Developer/Extrasに置けば良さそうです。

/Library/Developer/CoreAudioにおいて、シンボリックリンクをはりました。

```sh
$ sudo ln -s /Library/Developer/CoreAudio /Applications/Xcode.app/Contents/Developer/Extras
```

## VST SDK

http://www.steinberg.net/en/company/developers.html
からVST 3.6.5 SDK（VST 3.6.5 Audio Plug-Ins SDK） をダウンロードします。

~/SDKsを作って、ダウンロードした中からVST3 SDKフォルダをコピーします。（~/SDKs/VST3 SDKができるている状態）

JuceDemoPluginのプロジェクトにヘッダサーチパス設定されているのでこれでビルド可能になります。

## 参考
http://hoxtonowl.com/forums/topic/audiounits-compilation-tips/
CentOS7.0にVirtualBoxとVagrantをインストールする

#環境
* CentOS Linux release 7.0.1406 (Core) 
* Vagrant 1.7.4



##Virtualboxインストール
###レポジトリ追加

```
$ cd /etc/yum.repos.d
$ sudo wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
```

###パッケージインストール
```
$ sudo yum install kernel-devel kernel-headers dkms
$ sudo yum groupinstall "Development Tools"
$ sudo yum update
$ sudo shutdown -r now
```

###Vboxインストール、起動

```
$ sudo yum install VirtualBox-5.0
$ sudo /etc/init.d/vboxdrv setup
```                                               

#vagrantインストール
$ sudo mkdir ~/vagrant_start
$ cd ~/vagrant_start
$ sudo wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.rpm
$ sudo rpm -Uvh vagrant_1.7.4_x86_64.rpm

##box追加

```
$ sudo vagrant init hashicorp/precise32
$ sudo vagrant box list
centos6.5           (virtualbox, 0)
hashicorp/precise32 (virtualbox, 1.0.0)
```

##起動
`$ sudo vagrant up`

##接続

```
[hoge@localhost vagrant_start]$ sudo vagrant ssh
[sudo] password for hoge: 
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)

 * Documentation:  https://help.ubuntu.com/
New release '14.04.3 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Welcome to your Vagrant-built virtual machine.
Last login: Sun Aug 16 03:22:05 2015 from 10.0.2.2
vagrant@precise32:~$ 
```

##OSロールバック設定
* saharaプラグインをインストールし、ロールバック可能にします。

`$ sudo vagrant plugin install sahara`

* 有効化

`$ sudo vagrant sandbox on`

* 無効化

`$ sudo vagrant sandbox off`

* ロールバック

`$ sudo vagrant sandbox rollback`

* 変更を確定

`$ sudo vagrant sandbox commit`
MBA内のVBoxにインストールしたWindows10を触ってみた


話題の `Windows10` ですが、VM環境にインストールしていろいろとさらっと触ってみました！！
特に触る程度だったので、特にカスタマイズすることもなくインストールして状態で触りました。


### □感想① Windows8よりは使いやすい
もうこれは皆さんご存知のことだと思います。
スタートボタンもできたし、Windows7使ってて10にアップグレードしますという人にはいいかも・・・
といいつつ、画面周りがダイブグラフィカルになったので慣れるまでは大変そう。。。

### □感想② Macみたいにデスクトップを複数作って使えるのはいいね
Macを使っていたのでWindowsでデスクトップが複数作れなかったのが非常に不便だったけど、使えるようになったのでいいね。
仕事とかやりやすくなりそう！！

### □感想③ Edgeの使用感はIEとあんまり変わらなかった
ちょっと期待していたけど、ほぼIEと同じ…
なんか残念。。。


以上、こんな感じでした〜！！
CentOS 7にしたらpgrepコマンドの仕様が変わっていた

最近になって、ようやく手元の環境をCentOS 6系からCentOS 7系に移行しています。
ファイルシステムのデフォルトが`ext4`から`xfs`になったとか、`systemd`とか色々と大きな変更点がありますが、自分が普段からよく使っているコマンドで結構な変更がされていて少し戸惑ったのでメモ。

プロセスのPID確認に`pgrep`コマンドを多用していました。

```
pgrep -fl postgres
$ pgrep -fl postgres
22727 su - postgres
22760 /usr/local/pgsql/9.5dev/bin/postgres
22761 postgres: logger process
22763 postgres: checkpointer process
22764 postgres: writer process
22765 postgres: wal writer process
22766 postgres: autovacuum launcher process
22767 postgres: archiver process
22768 postgres: stats collector process
```

fオプションでコマンドライン全体にマッチさせて、lオプションで出力結果にプロセス名をPIDとともに表示させてます。

`ps aux | grep hoge | grep -v grep`とか打つより断然早いし、出力がスッキリするので気にっていました。

ところが、CentOS 7にすると、

```
$ pgrep -fl postgres
25702 postgres
25703 postgres
25705 postgres
25706 postgres
25707 postgres
25708 postgres
25709 postgres
25710 postgres
31583 su
```
...（ ＴДＴ）なにこれ

man読んでも今までと特に変わってないみたいだし、なんでプロセス名の一部しかでなくなったのか。。。

で、最終的にはググった結果、aオプションなるものが新たに追加されているらしいことを発見。

```
$ pgrep -a postgres
25702 /usr/local/pgsql/9.5dev/bin/postgres
25703 postgres: logger process
25705 postgres: checkpointer process
25706 postgres: writer process
25707 postgres: wal writer process
25708 postgres: autovacuum launcher process
25709 postgres: archiver process   last was 000000010000000000000017
25710 postgres: stats collector process
```

おお！これですこれです、望んていた出力は╭( ･ㅂ･)و
というか、manに書いておいてよ。。。

後から気づきましたが、`pgrep --help`だとaオプションが記載されてますね。

```
 -l, --list-name           list PID and process name
 -a, --list-full           list PID and full command line
```
こっちを見れば早かった（反省）

***
で、`pgrep`のバージョンを調べていて分かりましたが、CentOS 7（おそらくRHEL 7も）はpgrepを提供していたのが、procpsからprocps-ngというのに変わっているようです。

```
$ cat /etc/redhat-release
CentOS release 6.6 (Final)
$ pgrep -V
pgrep (procps version 3.2.8)
```

```
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
$ pgrep -V
pgrep from procps-ng 3.3.10
```

ngはNew Generationの略みたいですね。(https://gitlab.com/procps-ng/procps)
本家のprocpsの開発が遅くなったから、新たにforkして色々バグ改修と機能追加を行っているプロジェクトのようです。

>History
>This is a fork of procps. This fork was started by the maintainers of Debian, >Fedora and openSUSE and assisted by a small group of independent developers.
>
>The aim of the procps fork, which is now the only maintained version of procps, was to remove the number of distribution-specific patches and differences between the distributions.
>
>The import occurred in late 2010 and was then followed by a flurry of patching imports that was held back previously. Eventually the level of backlogged patches reduced and procps is now actively maintained.

procps-ngのwikiより引用(https://gitlab.com/procps-ng/procps/wikis/home)

ということで、そもそも元になっているプロジェクトが6系から7系で変わってしまっているので、互換性もクソもありません。


`pgrep`コマンド以外にも`ps, top, vmstat, kill`などもっとよく使うコマンドも含まれているので、そのあたりの仕様変更もいっぱいありそうです。
ListBoxをネストして利用する

WPFではListBoxをネストして利用できる。ただ、子ListBox内でマウスホイールでスクロールしても親ListBoxまでスクロールイベントが伝わらない。
これは子ListBox内ScrollViewerでスクロールイベントを処理してしまっているためなので、子ListBoxからScrollViewerをとりのぞけばOK

↓こんな感じでStyleを定義しておいて、


        <Style x:Key="NestedListBoxStyle" TargetType="ListBox">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <ItemsPresenter />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

こう使う。

        <ListBox ItemsSource="{Binding Persons}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock>Header</TextBlock>
                        <TextBlock Text="{Binding Name}" />
                        <ListBox ItemsSource="{Binding Children}" Style="{StaticResource NestedListBoxStyle}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Name}" />
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                            
                        </ListBox>
                        <TextBlock>Footer</TextBlock>
                    </StackPanel>

                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

すると子ListBox内のスクロールイベントが親ListBoxに伝わるようになった。

# 追記（2015/08/16）

kiichi54321さんからコメントをいただきました。
ItemsControlを使用すればデフォルトのスタイルで親ListBoxのスクロールができるようです。
お好みの方法でどうぞ。
haml 書き方 まとめ for Rails

#hamlとは

Haml (HTML Abstraction Markup Language)

★概要
HTML template engine
HTMLをすっきり＆美しく
Ruby / Ruby on Rails

★公式サイト
http://haml.info

#準備
Gemfileに追加してbundle install。

```
gem 'haml-rails'
```

#使い方
##基本
```haml
!!!
%html
  %body
    hello world!
```

入れ子構造を使うためには字下げを行う。
字下げの空白は統一する。

### !!!
DOCTYPEの生成

### %
タグ名の開始タグ、閉じタグを生成する

##コメントアウトの書き方
###html的なコメント
 htmlにコメントアウトが表示される

一行

```haml
/ bodyの終わり
```

複数行

```haml
/
     comment
     commemt
```
###hamlにだけコメント
一行

```haml
-# コメント
```

複数行

```haml
-#
     コメント
     コメント
```

##属性の付け方
###属性の書き方
```haml
%html{:lang => "ja"}
%html{lang: "ja"}
%meta(charset="UTF-8")
```

### id、classの扱いとdivの省略
```haml
%div{:id => "main", :class => "myClass"}
%div(id="main" class="myClass")
%div#main.myClass
-# id、classは属性の中でも省略した書き方が出来る。
#main.myClass
-# さらにdivは省略可能なので、よりすっきりと書ける。
```

##改行のコントロール
一行にまとめて書ける

```haml
%p
  hello
```
↓

```haml
%p hello
```

###hamlは複数行でhtmlの表示は一行にする

```haml:haml
%ul
  %li<
    item
```
↓

```html:html
<ul>
  <li>item</li>
</ul>
```

<  : 改行をとってくれる
\>  : 親要素の改行をとってくれる

```haml:haml
%ul
  %li<>
    item
```
↓

```html:html
<ul><li>item</li></ul>
```

##フィルター機能
特定言語としてコンパイルする

```haml
:css
  .myStyle {
    color: red;
   }

:javascript
  alert(1);
  if (1) {
    alert(2);
  }

%div
  :escaped
    <html>
    </htlm>
```

:escapedは実体参照として表示する

##Rubyの使い方
```haml
%p total is #{5 * 3}
-# #{}を使う
%p= Time.now
-# =を使うことも出来る
- x = 5
%p x
- (1..10).each do |i|
     -# %p= i
     %p{ :id => "item_#{i}"} #{i}
     -# 複雑な表示も出来る
```








#参考
[Hamlが5分で分るチートシート [Rails初心者チュートリアル]](http://morizyun.github.io/blog/beginner-rails-tutorial-haml/)
[Haml入門(ドットインストール)](http://dotinstall.com/lessons/basic_haml)
arduino uno ピン配置

##atmega328
![FR97029H4B2N7DQ.LARGE.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/c5beea9a-546d-f714-6656-f6d85fb211f9.jpeg)
##ピン
```
PB0     D8
PB1     D9 (OC1A)
PB2     D10 (SS, OC1B)
PB3     D11 (MOSI, OC2A)
PB4     D12 (MISO)
PB5     D13 (SCK)
PB6     xtal
PB7     xtal
PC0     A0
PC1     A1
PC2     A2
PC3     A3
PC4     A4 (sda)
PC5     A5 (scl)
PC6     reset
PD0     D0 (RX)
PD1     D1 (TX)
PD2     D2
PD3     D3 (OC2B)
PD4     D4
PD5     D5 (OC0B)
PD6     D6 (OC0A)
PD7     D7
```
VBoxにWindows10 proインストールしてみた


MBA内のVBoxにWindows10インストールしてみました！！

![kobito.1439693390.677191.png](https://qiita-image-store.s3.amazonaws.com/0/33479/d75d295f-d753-fe91-144e-1dee380d209f.png "kobito.1439693390.677191.png")

お試し用に認証とかしてないので、さくっと画面周りだとか、噂のEdge使ってみようと思います。

また更新しますね！！
SonarQube のインストールから設定，実行まで for Mac OS X yosemite

**環境**
* SonarQube 5.1.2
* sonar-runner 2.4
* Maven 3.2.5
* Mac OS X Yosemite
* MySQL 5.6.26

**手順**
1. terminal を起動する．
2. homebrew をインストールする．
3. homebrewを使って，以下のソフトウェアをインストールする(インストール方法は，ググればすぐにわかる)：
    * SonarQube
    * SonarRunner
    * MySQL
    * Maven
4. [ここ](http://kenzo0107.hatenablog.com/entry/2014/06/22/024501)の第3ステップをを参考にして，SonarQube 用のデータベースを作成する．
5. [ここ](http://pumuduruhunage.blogspot.jp/2014/11/using-sonarqube-with-maven-and-mac-osx.html)の第3ステップを参考にして，SonarQube のconf ディレクトリ下にあるsonar.properties を編集する．
6. [ここ](http://kenzo0107.hatenablog.com/entry/2014/06/22/024501)の第5ステップをを参考にして，sonar-runner のconf ディレクトリ下にあるsonar-runner.properties を編集する．
7. [ここ](http://pumuduruhunage.blogspot.jp/2014/11/using-sonarqube-with-maven-and-mac-osx.html)の第4ステップを参考にして，~/.m2/ ディレクトリ下にsettings.xml を作成する．
8. 以下のコマンドを実行して，mySQL を起動する：
mysql.server start
9. sonarqube-5.1.2/bin/macosx-universal-64 に移動し，以下のコマンドを実行して，SoanrQube を起動する：
./sonar.sh start
10. 分析対象のプロジェクトがあるディレクトリに移動し，以下のコマンドを実行してSonarQube での分析を実行する:
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true
mvn sonar:sonar
11. ターミナルに build success と表示されたら，分析成功．以下のURLにアクセスして分析結果を確認する:
http://localhost:9000
12. sonarqube-5.1.2/bin/macosx-universal-64 に移動し，以下のコマンドを実行して，SoanrQube を終了する：
./sonar.sh stop
13. 以下のコマンドを実行して，mySQL を終了する：
mysql.server stop

編集/作成した設定用ファイルはGitHub にアップロードしてあります：
https://github.com/hideshis/scripts_for_research/tree/master/sonarQube_settings

**おまけ:もしも，Unable to read hogehoge/target/jacoco.exec: Incompatible version 1007. というエラーメッセージとともにビルドが failure したら**
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true
のかわりに
mvn clean org.jacoco:jacoco-maven-plugin:0.7.4.201502262128:prepare-agent install -Dmaven.test.failure.ignore=true
を実行する．
Macのターミナル編集関連

# 準備
## ターミナルの色変更
[Mac Terminal のカラー設定をSolarized にする](http://qiita.com/Humangas/items/848f0318dfc3c6f5b8e2#1-2)

## Neo bundleの設定
[Vim pluginへの入門[NeoBundle.vim]](http://qiita.com/himinato/items/caf5a0b19ce893a75363)

## gitの補完設定
[bash で git コマンドのブランチ名などを補完するには](http://qiita.com/snaka/items/4b0437a32da832d2e0db)

## vimの設定
[初心者向け　Vimでクリップボード連携(コピー&ペースト)する方法](http://qiita.com/iwaseasahi/items/a45b99a484966662adbe)


# 設定

## vimrc

```vim:.vimrc
if has('vim_starting')
  set nocompatible
  if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    echo "install neobundle..."
    :call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
  endif
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
call neobundle#begin(expand('~/.vim/bundle'))
let g:neobundle_default_git_protocol='https'

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'nanotech/jellybeans.vim'
NeoBundle 'altercation/vim-colors-solarized'

NeoBundleCheck
call neobundle#end()
filetype plugin indent off
set t_Co=256
syntax on
set clipboard+=unnamed
set backspace=indent,eol,start
set expandtab
set tabstop=4
set shiftwidth=4
set background=dark
colorscheme solarized
```

## screenの設定

```bash:.screenrc
startup_message off

shelltitle "$ |bash"
hardstatus alwayslastline "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %Y %m/%d %C%a "
hardstatus off

termcap * 'G0:S0=\E(%.:E0=\E(B:TY=iso2022'
autodetach on
defflow off
crlf off
vbell off
vbell_msg "Bell"
screen 0
screen 1
```

## bashrcの設定

```bash:.bashrc
alias ls='ls -G'
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
export PATH=$HOME/.nodebrew/current/bin:$PATH
source /usr/local/git/contrib/completion/git-prompt.sh
source /usr/local/git/contrib/completion/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
```
RubyでできるアレをObjective-Cでやりたい


# Array#reject!

ObjectiveSugarの `- (NSArray *)reject:(BOOL (^)(id object))block` を使う。

https://github.com/supermarin/ObjectiveSugar/blob/master/Classes/NSArray%2BObjectiveSugar.h#L155

または、

`filterUsingPredicate`と`predicateWithBlock`を組み合わせて使う

```objective-c
NSMutableArray *array = [@[@1, @2, @3, @4, @5] mutableCopy];
[array filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSNumber *evaluatedObject, NSDictionary *bindings) {
            return evaluatedObject.intValue > 2;
        }]];
NSLog(@"%@", array);
```

http://qiita.com/Ushio@github/items/0cf61b273aa0b4f36253
ErlangのQueue実装

```erlang
-module(fifo_types).
-compile(export_all).

%% 概要
%% キューをシミュレートするためにはスタックとして2つのリストを使います。
%% 片方のリストに新しい要素を保存し、もう片方を使ってキューから要素を
%% 削除します。削除するリストが空の時に要素追加するほうのリストを逆順
%% にして、そちらを削除するリストとします。

%% 2> c(fifo_types).
%% {ok,fifo_types}

%% 18> Q = fifo_types:new().
%% {fifo,[],[]}
%%
%% 19> Q1 = fifo_types:push(Q, 1).
%% {fifo,[1],[]}
%%
%% 20> Q2 = fifo_types:push(Q1, 2).
%% {fifo,[2,1],[]}
%%
%% 21> {Val, Q3} = fifo_types:pop(Q2).
%% {1,{fifo,[],[2]}}
%%
%% 22> {Val1, Q4} = fifo_types:pop(Q3).
%% {2,{fifo,[],[]}}
%%
%% 23> fifo_types:empty(Q4).
%% true
%% 24> fifo_types:empty(Q3).
%% false
-spec new() -> {fifo, [], []}.
new() ->
    {fifo, [], []}.

-spec push({fifo, In::list(), Out::list()}, term()) -> {fifo, list(), list()}.
push({fifo, In, Out}, X) -> {fifo, [X|In], Out}.

-spec pop({fifo, In::list(), Out::list()}) ->  {term(), {fifo, list(), list()}}.
pop({fifo, [], []}) -> erlang:error('empty fifo');

%% popするときにリストが空になって、Inのほうを逆順して、popに使う
pop({fifo, In, []}) -> pop({fifo, [], lists:reverse(In)});
pop({fifo, In, [H|T]}) -> {H, {fifo, In, T}}.

%% list()は[any()]とほぼ同じで、どちらも空リストを含みます。list()が型として指定
%% されると`[]`と重なります。
-spec empty({fifo, [],[]})-> true;
           ({fifo, nonempty_list(), nonempty_list()}) -> false.
empty({fifo, [], []}) -> true;
empty({fifo, _, _}) -> false.

```
前庭電気刺激(GVS)で仮想空間の加速度を感じる


はじめに：**`この記事を読んだ結果生じたいかなる損害に対しても責任は負えません．特に電気の事故は生命に関わる場合もあるため，よく理解した上で遊んでください．`**

前庭電気刺激について会社のエンジニア向けのLTで発表したところ結構ウケたので，内容を整理しつつ書きます．

# 宣伝

より詳細な解説や製作記をコミックマーケット88で頒布予定の「ななかInside PRESS vol.7」に書きました．詳しくは[第7開発セクションのサイト](https://sites.google.com/site/dai7sec/)へ．

# 前庭電気刺激(GVS)

前庭電気刺激というと聞きなれない言葉かも知れませんが，古くから知られている現象で100年以上前から存在は知られています．前庭というのは，加速度を知覚し平衡感覚を司る前庭という組織で，内耳内の角速度を感じる三半規管に接する場所にあります．

前庭に1～2mAの電流を流すと平衡感覚が狂い架空の加速度を感じます．加速度の方向は電流の向きでコントロールできることも知られています．頭に電流を流して感覚を操作するというと難しそうに感じるかもしれませんが，電流を流してみるだけなら簡単な回路で実現できるので作ってみることにします．

# 実験

手頃な電流源が家になかったため，定電流回路と簡単なプログラムを書いて実験してみました．

## 回路

![circuit.png](https://qiita-image-store.s3.amazonaws.com/0/58515/f73dd528-7655-62ca-8a40-6d6762d15977.png)


| 部品名                 | 購入場所 | 価格(円) | 備考・URL                              |
| ---------------------- | -------- | -------: | -------------------------------------- |
| オムロン 電極パッド    | Amazon   |    1,345 | http://www.amazon.co.jp/dp/B0002ERMBE  |
| DC-DC昇圧回路          | aitendo  |      600 | http://www.aitendo.com/product/6872    |
| MOSFET 2SK3234         | 秋月     |      200 | 耐圧とゲート・ソース間電圧に注意       |
| OPアンプ LMC662CN      | 秋月     |      150 | フルスイング出力可能なもの             |
| D/Aコンバータ MCP4922  | 秋月     |      200 | SPIなのでマイコンと接続が楽です        |
| AVR ATMEGA88           | 秋月     |      170 | SPIで通信できるお好きなマイコンでOK    |
| 2c接点ラッチングリレー | 鈴商     |     不明 | 5Vで動作するもの                       |

注：価格は参考です

各種パーツの購入場所リンク：

- [Amazon](http://www.amazon.co.jp/)
- [Aitendo](http://www.aitendo.com/)
- [秋月](http://akizukidenshi.com/)
- [鈴商](http://www.suzushoweb.com/)

基本的には教科書通りの定電流回路です．回路図上ではATMEGA88を使っていますが，MCP4922とSPIで通信できて，リレーを制御するIOが2本あれば，お好きなマイコンやArduino等が利用可能です．

## プログラム

ATMEGA88からMCP4922にコマンドを送ったり，リレーで極性を切り替えるテストプログラム．


https://github.com/binzume/gvs/blob/master/firmware/da_test.c


makeして出てくるtest_da.hexを実行すると，Ipp=±2mAな台形波(?)が出力されます．最初は矩形波で実験していたのですが後述する問題があったので，台形波にしました．

## 動作確認

1. 電極になにも繋いでいない → 約200Vかかっている
2. 10kΩの抵抗をつなぐ → ±20Vが周期的に変化 (±2mA流すテストなため)
3. 抵抗値変える → 電圧も追従して変化する
4. 一度電源を切り腕に電極を貼り再スタート → 多少ピリピリする程度なら大丈夫
5. MOSFETのドレインとソースをショートさせる → 腕が感電して痛いが，許容範囲なら次へ ※1
6. 耳の後ろあたりに電極を貼って前庭に電流を流す

じっとしているのに左右に身体が揺れている感じがしたら成功です．

※1： 試行錯誤しているうちにほぼ間違いなく感電するので許容できるかを事前に確認．このとき右手に電極を貼って左手でMOSFETの足に触ったりすると胴体を電流が流れて危険なので注意．

# 色々

当初，矩形波を流して実験していたのですが，どういうわけか実験中に**電気の味がする**ので調べたところ，矩形のエッジ部分で電圧が上がりすぎ口の中にまで電流が流れてしまっているようでした．立ち上がりを緩やかにしたら改善しました．

こういう実験をすると慎重に作業していても，ちょっとしたミスで感電するので，感電した場合も致命的なことにならないことを確認しつつ進めましょう．一人暮らしなので自宅で実験して何かあっても誰も助けてくれないので，最初は会社のオフィスでやってました．

色々なパターンの電流を流してみましたが，左右に傾いたとか，揺れているとかの大雑把な加速度は感じられますが，細かい制御は難しそうです．重力加速度を打ち消す程の大きな加速度も与えられそうに無いのと，人間は前庭以外の全身でも加速度を感じているので，感覚をごまかすのは難しいです．

動画をOculus Riftに表示しつつ，映像に合わせて電流を流すというのも試してみましたが，少し面白いかなあ，くらいの感想．

まとめ：

- 舐めなくても，電気の味がするよ
- 慎重にやっても感電する可能性は常にあるので注意
- あまり複雑なことできないが，可能性感じます
- SAOのナーヴギアはまだまだ遠いです

## 課題

- 昇圧回路は非絶縁なので複数同時に使えない
- 三半規管もどうにかしたい
- 安全性とか

# 参考文献

- http://www-hiel.ist.osaka-u.ac.jp/japanese/exp/gvs.html 大阪大 前田研究室
- http://www.todesking.com/hitosinigaderu/ 電極探していたら低周波治療器の電極使っていたのでパクりました．回路も参考になりました
Ableton Live の Operator の設定値を WebAudioAPI で利用する

![スクリーンショット 2015-08-16 7.05.17.png](https://qiita-image-store.s3.amazonaws.com/0/2568/95743afb-0dfe-d10e-820b-d3cc3ad8111a.png)

Ableton Live の FM音源 Operator では Coarse と Fine の値で各オシレーターの周波数の調節ができます。

調節後の周波数を求める式は以下のとおり。

```js
outputFrequency = inputFrequency * Coarse * (1 + Fine / 1000);
```

上記の式をすごく雑に説明すると、計算前の周波数に対する比率を計算していて、Coarse が整数部分、Fine が小数点以下の部分となっています。

```
計算後の周波数 =　計算前の周波数 * Coarse.Fine

# Coarse = 11, Fine = 965 のときなら、計算前の周波数に 11.965 をかける
```

そこで、以下のような関数を用意すると..

```js
function convertFineIntoRatio(fine) {
  if (fine < 0) {
    return 1 / (1 - fine / 1000);
  }
  return 1 + fine / 1000;
}
```

冒頭のスクリーンショットの設定は、このように書ける。

```js
opA.frequency.value = frequency *  0.5 * convertFineIntoRatio(993);
opB.frequency.value = frequency * 12.0 * convertFineIntoRatio(  0);
opC.frequency.value = frequency *  0.5 * convertFineIntoRatio(995);
opD.frequency.value = frequency * 11.0 * convertFineIntoRatio(965);
```

マイナス値の設定にも対応しているので、このようにも書ける。

```js
opA.frequency.value = frequency *  1.0 * convertFineIntoRatio( -7);
opB.frequency.value = frequency * 12.0 * convertFineIntoRatio(  0);
opC.frequency.value = frequency *  1.0 * convertFineIntoRatio( -5);
opD.frequency.value = frequency * 12.0 * convertFineIntoRatio(-35);
```

比率からMIDIノート番号を計算してやれば、その100倍が detune の値となるので、以下のような関数を用意すると..

```js
function convertFineIntoDetune(fine) {
  var sign = fine < 0 ? -1 : +1;
  var ratio = 1 + Math.abs(fine) / 1000;

  return sign * Math.log(ratio) * Math.LOG2E * 12 * 100;
}
```

このように書ける。

```js
opA.frequency.value = frequency * 0.5;
opB.frequency.value = frequency * 12;
opC.frequency.value = frequency * 0.5;
opD.frequency.value = frequency * 11;

opA.detune.value = convertFineIntoDetune(993);
opB.detune.value = convertFineIntoDetune(0);
opC.detune.value = convertFineIntoDetune(995);
opD.detune.value = convertFineIntoDetune(965);
```

もしくはマイナス値を使ってこう。

```js
opA.frequency.value = frequency;
opB.frequency.value = frequency * 12;
opC.frequency.value = frequency;
opD.frequency.value = frequency * 12;

opA.detune.value = convertFineIntoDetune(-7);
opB.detune.value = convertFineIntoDetune(0);
opC.detune.value = convertFineIntoDetune(-5);
opD.detune.value = convertFineIntoDetune(-35);
```

ちなみに Level 値の dB は以下の式で変換できるので、

```js
function convertDecibelIntoGain(db) {
  return Math.pow(10, db * 0.05);
}
```

こう書ける。

```js
opALevel.gain.value = convertDecibelIntoGain(-2.8);
opBLevel.gain.value = convertDecibelIntoGain(-22);
opCLevel.gain.value = convertDecibelIntoGain(-5.7);
opDLevel.gain.value = convertDecibelIntoGain(-40);
```

けど、多分変調方式が異なる (よくある位相で変調するやり方に対して、Web Audio API は周波数でしか変調できない) のでゲインの値は適宜調節が必要。

僕はモジュレーターのゲイン値は勘で調節している。

```js
opALevel.gain.value = convertDecibelIntoGain(-2.8);
opBLevel.gain.value = convertDecibelIntoGain(-22) * frequency * 20;
opCLevel.gain.value = convertDecibelIntoGain(-5.7);
opDLevel.gain.value = convertDecibelIntoGain(-40) * frequency * 20;
```

これをFMアルゴリズムに従って接続すれば **そこそこ** 同じ音がつくれる。

参考にしたトピック
https://forum.ableton.com/viewtopic.php?f=4&t=26560