OmniAICreator/Qiita-1.07M huggingface dataset:
Django: モデルフィールドのプライバシー制御を設定する


## 方針

- あるモデルに OneToOneでプライバシー制御を設定するモデルを定義する
- プライバシー制御モデルは元のモデルと同じフィールド名とする
- プライバシー制御モデルは動的に定義する

## 元モデル:個人属性(Profile)

- 抽象モデル

~~~py

class AbstractProfile(models.Model):
    user = models.OneToOneField(User)
    age = models.IntegerField()
    gender = models.IntegerField(choices=((0, 'Femail', ), (1, 'Male', ), ))

    class Meta:
        abstract = True
~~~

- 具体モデル

~~~py
class Profile(AbstractProfile):                                                     
    pass   
~~~


## モデルに対してプライバシー制御モデルのフィールドを生成

- 抽象モデルのフィールドを返す

~~~py
def create_privacy_fields(model_class, field_class, **kwargs):    
	# メタクラスを abstract = Trueで作る                                               
    fields = {
        '__module__': model_class.__module__,
        'Meta': type('Meta', (object, ), {'abstract': True, }),
    }

    for i in model_class._meta.fields:
        if isinstance(i, models.AutoField):
            continue
        fields[i.name] = field_class(i.verbose_name, **kwargs)

    return fields
~~~    

## プライバシ制御モデル(ProfilePrivacy)

- 抽象モデルをAbstractProfileを元に動的に生成

~~~py
AbstractProfilePrivacy = type(
    'AbstractProfilePrivacy',
    (models.Model,),
    create_privacy_fields(
        AbstractProfile, models.BooleanField, default=False),
)   
~~~

- 具体モデル: `Profile <-(OneToOne)- ProfilePrivacy`

~~~py
class ProfilePrivacy(AbstractProfilePrivacy):
    profile = models.OneToOneField(Profile)
~~~

## マイグレーション


~~~bash
$ python manage.py makemigrations accounts

Migrations for 'accounts':
  0001_initial.py:
    - Create model Profile
    - Create model ProfilePrivacy
~~~

~~~bash
$ python manage.py migrate

Operations to perform:
  Apply all migrations: accounts
Running migrations:
  Rendering model states... DONE
  Applying accounts.0001_initial... OK
~~~

~~~bash
$ python manage.py shell
~~~
~~~py
In [1]: from django.contrib.auth.models import *
In [2]: from accounts.models import *
In [3]: u = User.objects.get(username='admin')
In [4]: p = Profile.objects.create(user=u, age=33, gender=0)
In [5]: pr = ProfilePrivacy.objects.create(profile=p)
In [6]: u.profile.profileprivacy.gender
Out[6]: False
In [7]: pr.gender = True
In [8]: pr.save()
In [9]: u.profile.profileprivacy.gender
Out[9]: True
~~~

## テンプレート

~~~html

<td>{% if request.user == profile.user or profile.profileprivacy.age %}
    {{ profile.age }} {% else %} 公開されていません {% endif %}</td>

~~~
技術英語 > two suits of clothes / cloth simulator

引用: 冠詞マスター教本 by 石井隆之さん

> clothesは「衣服、着物」という意味の単語で複数扱い。
...
two suits of clothes (服二着）というような表現にする。

<hr>
衣服の3DCG作成などに使われるシミュレーターは cloth simulator (cloth simulation)のようだ。

https://github.com/derekblair/ClothSimulator
> A native OSX app that demonstrates real time cloth simulation using OpenGL and advanced algorithms.

githubにて「clothes simulator」では検索結果0だった。

(追記 2015/09/21)
よく考えるとcloth simulatorは衣服の方でなく「布地」のsimulatorだった。

たまに見る、立っている人の動画を撮って、その人の服を別の服に入れ替えて見せるソフトなどの場合は「布地」でなく「衣服」のsimulatorになるが、その場合は[clothes simulator]というのだろうか?（未調査)。
Windows Git 2.6.1で~/.bashrcがGit Bashから読み込まれるようにする

新しいWindows PCにGitを入れたら、環境変数HOMEを設定しているにもかかわらず、Git Bash起動時にホームディレクトリ配下の.bashrcが読み込まれなかった。

毎回```$ source .bashrc```を打つのでもいいが、bash.bashrcに以下のようなif文を追加して、ホームディレクトリ配下の.bashrcも起動時にロードされるようにするほうが楽だと思う。

- C:\Program Files\Git\etc\bash.bashrc  
（11行目くらいの# System-wide bashrc fileコメントの下に追加した例）

```bash:bash.bashrc
# System-wide bashrc file
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
```
【Swift】エラーまとめ（随時更新）

初心者はよくエラーの意味が理解できないこともあると思うので、まとめます。

## スペルミス等で起こるエラー

エラーコード1
Use of unresolved identifier 'hoge'

これは宣言していない変数等を記入しているために出るエラーです。

例、
numberと変数を宣言しているのに、namberと打ってしまっている。
![スクリーンショット 2015-09-20 5.16.33.png](https://qiita-image-store.s3.amazonaws.com/0/75302/8ed3292f-039b-6910-fdfd-71d376fd4eee.png)


##Entry pointによる

Entry pointがないことによるエラー
コンソールに表示されるエラーメッセージのreasonのなかに、Entry pointがどうのこうのと描かれているので、そこで、ストーリーボードを見たときに、Entry pointをなければ追加してください。

詳しくはこちら
[Entry pointの追加の仕方、変更の仕方](http://qiita.com/ShinokiRyosei/items/bf18aba49c8a2d9d8d55)



## nilで起こるエラー

### fatal error: unexpectedly found nil while unwrapping an Optional valueというエラーメッセージ

【関連付けの場合】

<img width="762" alt="スクリーンショット 2015-12-31 2.30.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/75302/cdafb9d9-1072-d5f9-803e-0087760c9684.png">

コンソールの左側にすべての変数などの値が表示されます。
その中でnilになってしまっているものがある場合、上記のようにエラーになります。

今回はlabelの値がnilになっていたために、エラーとなっていました。
関連付けすべきものを関連付けしていないとそれの値がnilになりますので、その場合は関連付けしましょう。
【Swift】GIFをUIImageViewで表示する

#ローカルのGIFを表示する場合に使うもの
[SwiftGifOrigin](https://github.com/bahlo/SwiftGif)からDownload ZipからUIImage+GIF.swiftをGIFを使用したいプロジェクトに入れてしてください

あるいは
[Cocoapod](https://cocoapods.org/pods/SwiftGifOrigin)からインストールしてください

#ローカルのGIFを表示するためのコード

sample.gifというgifを表示したい時は以下のようにします。

```swift

let image = UIImage.gif(name: "sample")
imageGIFView.image = image

```


#オンラインからGIFを表示する場合に使うもの
mayoffさんのgithubにやり方が載っているものを試して、日本語にしたものになります。
mayoffさんのuiimage-from-animated-gifというrepositoryからUIImage+animatedGIF.hとUIImage+animatedGIF.mという2つのファイルを使わせていただきます。
下記URLから使えます。
https://github.com/mayoff/uiimage-from-animated-gif

GIF画像ですが、オンラインのURLが必要になりますので、そちらの準備もお願いします。

#手順
##1 ファイルをインポートする
UIImage+animatedGIF.h
UIImage+animatedGIF.m
という2つのファイルをXcodeにインポートする。
その時に、Bridging-headerファイルをつくる。Xcodeが作りますかといきいてくるので、Yesを選ぶだけでよい。

##2 Bridging-headerファイルを編集
次に、Bridging-headerファイルに

```objc:Bridging-Header.h
#import "UIImage+animatedGIF.h"
#import "UIImage+animatedGIF.m"
```

と記入

##3 UIImageViewにGIFを表示させる

ここで、GIFのURLを使います。

ViewControllerに以下のように記入します

```swift:ViewController.swift

@IBOutlet var imageGIF: UIImageView!

 override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib
        var strImg : String = "http://33.media.tumblr.com/0493c9fd0153d514fd3273507e44b68e/tumblr_mj7lwsQZYb1rmtxh8o1_500.gif"
        
        var url: NSURL = NSURL(string: strImg)!
        
        imageGIFView.image = UIImage.animatedImageWithAnimatedGIFURL(url)
    }
```

以上のやり方で、strImgに入っているURLからGIFを表示します。

私のサンプルは以下より
[GIFtest](https://github.com/ShinokiRyosei/GIFtest)
Rubyのe-ラーニング研修システム ミニツク演習2について

ミニツクの演習コース模範解答がRuby1.8以前のものでRuby1.9以降に対応していないので、自分なりに最新のRubyに対応した模範解答を考えてみた。
ちなみに問題は以下のようなもの
>### 出題
>コード例で呼び出しているclever_printメソッドを定義しましょう。clever_printメソッドのおこなう処理は、コメントアウトされている出力例から推測してください。

>```ruby
> clever_print(["Ruby"], "the", ["Programming", "Language"])
>  #=> Ruby the Programming Language  
>  clever_print(["Agile", "Web", "Development"], "with", { :Rails => 3.0 })
>  #=> Agile Web Development with Rails 3.0
>```
> [ミニツク - Rubyのe-ラーニング研修システム](http://www.minituku.net/courses/500228005/lessons/137422063/exercises/762982128?locale=ja)


元々の模範解答は、

```ruby
def clever_print(*args)
   converted = []
   args.each { |arg| converted << arg.to_a } #問題はココ！
   puts converted.join(" ")
end
```

 なんだけど、  問題は"to_a"メソッド。Ruby1.9以降ではStringクラスからto_aメソッドが排除されているので、上の例だとno method errorになる。
 なので、String型を判別して条件分岐させ、
 
 ```ruby
def clever_print(*args)
  converted = []
  args.each { |arg|
  	converted << (arg.is_a?(String) ? arg : arg.to_a)
  }
  puts converted.join(" ")
end
 ```
 みたいにするのが一番シンプルかなー。もっとクレバーな方法があったら教えてください・・・
Railsの命名規則についてのメモ

railsでモデルやコントローラー名の命名規則でたまにミスることがあるので、改めてまとめてみた。

例えばとあるWebサービスで会員情報をMemberというモデルで管理する場合、

### モデル名: Member
モデル名は先頭が大文字。複数の単語を用いる場合は、"WomenMember"みたいに先頭が大文字の単語をつなげる。しかしファイル名は小文字で複数の単語はアンダースコアでつなげる。"women_member.rb"みたいな感じ。

```ruby
class Member < ActiveRecord::Base

end
```

### テーブル名: members
テーブル名は小文字で複数形に。

```ruby
class CreateMembers < ActiveRecord::Migration
  def change
    create_table :members do |t|
      t.timestamps
    end
  end
end
```

### コントローラー名: Member::SessionsController

例えばsession関係の処理を行うためのコントローラー"sessions"を作成する場合は、"rails g controller sessions"となり、コントローラー名は基本的に複数形でも単数形でもいい？・・・

```ruby
class Member::SessionsController < ApplicationController
	def new
	end

	def create
	end

	def destroy
	end
end
```

ルーティングでは、

```ruby
namespace :member do
  root 'top#index'
  get 'login' => 'sessions#new', as: :login
  post 'session' => 'sessions#create', as: :session
  delete 'session' => 'sessions#destroy'
end
```
となる。で、リダイレクトやリンク等でアクションを指定する時は、

```ruby
redirect_to :member_login
```

みたいな感じ。

他にも言及すべきことがあったら思い出し次第追加したいです。
Frequency Modulation(周波数変調)

　AM(Amplitude modulation)は信号に対して振幅で変調をかけるのに対し、FM(Frequency modulation)は周波数で変調を掛ける。

##用途
　ラジオやアマチュア無線で使われる。送信電力の変動が無い為、同じ周波数で強い信号が送られてきたら、マスキングされて受信できなくなる。これは弱肉強食特性と呼ばれている。

##音楽での用途
![YAMAHA_DX7.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/ff909fd4-fe79-5e23-a493-faae1928673f.jpeg)
YAMAHA DX7

　スタンフォード大学のCCRMAでJohn Chowningが開発し、それをYAMAHAがライセンスを受けてDX7を開発した。これは、FMを搭載し、フルデジタルで当時としては安価だったので大人気となった。しかし、FMの扱いが難しい為に、熟練者がサウンドプリセットを作り販売するなどしていたそうだ。

##Maxで作る
###基本形
![スクリーンショット 2015-09-20 1.55.25.png](https://qiita-image-store.s3.amazonaws.com/0/93396/f2b93c18-7b27-07b3-a436-cae4b831a0ee.png)
　最後の[cycle~]の周波数数値を、別の[cycle~]で変調する。2,000Hzのサイン波のキャリアに対して、1,000Hzのサイン波で変調をかけている。
　この状態では2,000Hzのサイン波に、1,000Hzの頻度でプラスマイナス1Hzの変調がかかっている。次は変調の深度を変える。

###変調の深度を変える
![スクリーンショット 2015-09-20 2.00.32.png](https://qiita-image-store.s3.amazonaws.com/0/93396/1505405c-0542-78ca-9ecb-840bb1cd9b10.png)
　モジュレータのサイン波の次に[*~]を挟み、音量をコントロールできるようにした。これを音として見れば音量のコントロールだが、周波数に足してあげると、周波数の増減にすることができる。
　前のパッチと見比べると、基本周波数以外の山が増えて高くなったように見える。FMではキャリア周波数にモジュレータの周波数を足したもの、引いたもの。２倍のモジュレータ周波数を足したもの、引いたもの、３倍の…という風に山ができる。
　深度を変えれば山の高さが増減する。

###周波数比で音色を作る
　上のパッチを触って貰うと分かるが、キャリアの周波数に対してモジュレータの周波数の比率が複雑になると、響きがキツくなる（印象ですいません）。これを利用して、あえて周波数比をずらしてから、単純な比率に戻し鐘のような音を作るなどしている。
![スクリーンショット 2015-09-20 2.21.06.png](https://qiita-image-store.s3.amazonaws.com/0/93396/e7960613-025f-17ef-c4cd-252798d30106.png)
　キャリアに対し比率の数値を掛けるように変更。それをモジュレータの周波数に突っ込む。比率を変更した時に、小数点以下に数値があるとキツい音になる。
DB Predictive Detection

AWR スナップショット + Oracle R Enterprise を組み合わせて、Oracle DB に関する障害(主にパフォーマンス系)の予兆検知ができないかを模索してみる予定です。

Oracle R Enterprise は、DB に格納されているデータを透過的に扱うことができますので、DB との親和性が高く、また、DB から取り出して集計したデータを再度 DB に格納することもできます。なお、統計の知識が浅いのでアドバイスやコメントをいただけると嬉しいです。

# 動機付け

Oracle DB を運用していく上で、

- **障害を事前に検知したい**

  - 異常なほど急激な待機時間の増減が見られないか？

- **システムの成長率を予測したい**

  - 待機時間は増加傾向にあるか？

  - 限界はいつ頃訪れるか？

といった要望があると想定しています。

# 基本的なアプローチ

定期的(デフォルトでは 1 時間毎)に取得されている AWR スナップショットの情報をベースに、主に DB CPU や待機時間から外れ値の検出や今後の成長率を予測していきます。

予兆検知を考慮する上で、以下を前提条件とします。

- RAC 環境の場合、各インスタンスには負荷が均等に掛かっている(アプリケーションパーティショニングなどで、インスタンス毎の負荷傾向が異なる場合は、各インスタンス毎に分析する必要があります。ここでは議論を簡略化するため、全インスタンスに均等に負荷が掛かっているとします。)

- 処理の負荷傾向は 24 時間を通してほぼ同じ傾向を示している(OLTP 系のシステムでは、1 日の特定の時間帯に負荷が集中する傾向があり、その傾向が大きく変化しないことを前提としています。)


## アプローチ(1)

昨日までの AWR スナップショットから DB CPU を抽出して、箱ひげ図を出力します。出力された箱ひげ図と本日の DB CPU の傾向を比較し、外れ値になっていないかを確認します。連続して外れ値が現れた場合には、これまでと傾向が異なる状態と判断し、DBA に予兆検知を通知します。

[DB CPU の箱ひげ図サンプル]
![DBCPU_boxplot.png](https://qiita-image-store.s3.amazonaws.com/0/94001/6616dd10-2431-3e33-88d0-618704a57093.png)

このシステムでは、

- 18:00-19:00 に負荷のピークが来る傾向にある

- 4:00-5:00 が最も負荷が低い

といった傾向を把握できます。この結果と本日の DB CPU を照らし合わせることで、通常時と同様な傾向かを把握することができます。
Oracle Enterprise Manager を使用することで、リアルタイムに処理状況を把握することはできますが、過去の傾向からの比較は行いませんので、予兆検知は困難です。

## アプローチ(2)

*引き続き検討中...*
【メモアプリ】React.js LIST表示を管理するcomponentを作成

# LIST表示を管理するComponent作成
LIST表示のみの機能を受け持つcomponentを作成する。また、動的にLISTの要素が増えるインターフェースを設ける。

```lang:InputMultiLine.js
{/*
	・propsで指定した数分、複数の入力項目を表示すること。
	・末尾の入力項目には、項目を追加するインターフェースを設けること。
*/}
window.React = require('react');
var React = require('react/addons');
var InputLine = require('./InputLine.js');
var CurrentTime = require('./CurrentTime.js');

var InputMultiLines = React.createClass({
	propTypes:{
		allowLines: React.PropTypes.number.isRequired
	},
	getInitialState: function(){
		return{
			allowLines: this.props.allowLines
		}
	},
	handleAdd: function(event){
		this.setState({allowLines: this.state.allowLines+1});
	},
	renderLine: function(number){
		var lines = [];
		for(var i=0; i < number; i++){
			if(i+1 == number){
				lines.push(<InputLine num={i+1} addLine={this.handleAdd}></InputLine>);
			}else{
				lines.push(<InputLine num={i+1}></InputLine>);
			}
		}
		return lines;
	},
	render: function(){
		return <div>{this.renderLine(this.state.allowLines)}</div>
	}
});

module.exports = InputMultiLines;
```

## 初期表示する箇条書きの入力項目数の指定
以下の様に、propsを使用して、初期表示するLSIT要素数を親から指定できるように
インターフェースを設ける。以下では、初期表示の数として、propsにて
allowLinesの要素数を指定できるようにする。初期表示以降、動的に変更される値については、
stateにて状態として管理するため、stateのallowLinesにpropsのallowLinesの値をセットしている。

>propTypes:{
>　　　　allowLines: React.PropTypes.number.isRequired
>},
>getInitialState: function(){
>　　　　return{
>　　　　　　　　allowLines: this.props.allowLines
>　　　　}
>},

## 動的に箇条書きの項目数を追加
handleAddにてList表示する要素数をsetStateを使用して変更することで、再renderされ、LISTの要素数が１つ追加される。

>　　　　handleAdd: function(event){
>　　　　　　　　this.setState({allowLines: this.state.allowLines+1});
>　　　　},


LIST要素の末尾の項目のみhandleAddをpropsとして子に渡すことで、
末尾の項目に何らかのアクションがあった場合に、
子にて受け渡したhandleAddを実行して、LISTの要素を追加する。

>　　　　renderLine: function(number){
>　　　　　　　　var lines = [];
>　　　　　　　　for(var i=0; i < number; i++){
>　　　　　　　　　　　　if(i+1 == number){
>　　　　　　　　　　　　　　　　lines.push(<InputLine num={i+1} addLine={this.handleAdd}></InputLine>);
>　　　　　　　　　　　　}else{
>　　　　　　　　　　　　　　　　lines.push(<InputLine num={i+1}></InputLine>);
>　　　　　　　　　　　　}
>　　　　　　　　}
>　　　　　　　　return lines;
>　　　　},
>　　　　render: function(){
>　　　　　　　　return <div>{this.renderLine(this.state.allowLines)}</div>
>　　　　}


例えば、今回は、TABキーが押下された場合に子に受け渡したaddLineが実行されLIST要素を
追加する様にした。
以下は、子側で実装したfunctionとなり、9は、TABのキーコードである。
もちろん、末尾以外のLISTのINPUT項目には、addLineがpropsで受け渡されていないため、
大外の条件にマッチしない。

>        keydown: function(e){
>            if(this.props.addLine!==undefined){
>                if((e.which && e.which === 9) || (e.keyCode && e.keyCode === 9)){
>                    this.props.addLine();
>                }
>            }
>        }
UIImagePickerでできる動画のtmpファイル

なんかアプリの容量がすごい増えるという話があり調査すると
UIImagePickerで撮影したり、選択するとtmp配下に動画とか作り出しちゃうという。。。。
知らないし、削除処理とかサンプルに入ってないじゃん？
でも確かに考えてみるとそーりゃそーだよなー勝手に消すとか、アプリも削除するタイミングわかるわけないよなーって。

で調べても特に見つからなし
[UIImagePickerController doesn't delete temp video capture file from /tmp/capture](http://stackoverflow.com/questions/20225360/uiimagepickercontroller-doesnt-delete-temp-video-capture-file-from-tmp-capture)
こちらのStackOverFlowくらいでこれ普通に削除してるだけだなって。
なんか起動時にtrimとか削除するようなのあると思ったけどなさそうなので
自分でやらないとダメなんだろなーってカメラ起動時にtmp配下の「trim.~」を削除するようなサンプルをとりあえず作ってみた。
UIImagePickerから動画を選んだ場合はそういう名前でできるみたいなので。
この法則とかどっかに載ってないだろう。。。。。

[作ったサンプル](https://github.com/kameware/ImagePickerSample)
名前は気にしないで。。。。

触ってみたところ写真は残らない模様

[NSFileManager よく使うファイル操作メソッド(保存、削除、取得、列挙)](http://qiita.com/yusuga/items/4698478a246245a0f6b4)
削除の処理はこちらを参考にさせていただきました。
Nightmare2・ES6によるWebGUIテストを始めよう

# まえがき

今回はNightmareのVersion2で実行するまでに勘違いがあったり、ハマったりしたので簡単なサンプルを動かすまでのメモを残しておこうと思います。

# Nightmareとは

JavaScriptのスクレイピングライブラリ
最近Version2と一新され、いままでPhantom.jsベースで動いていたものがElectronベースで動くので高速になっていたり、
ES6でAPIを叩くようになったり、そもそもAPIの仕様がガラッと変わったりしている。
また、CasperJS・Phantom.jsと比べてもAPIがシンプルである。

- http://www.nightmarejs.org/
- https://github.com/segmentio/nightmare

# 必要なライブラリのinstall

```
npm install --save espower-babel
npm install --save co-mocha
npm install --save nightmare
npm install --save power-assert
```

# 簡単なサンプルテストプロジェクト作成

```text:test/mocha.opts
--reporter spec
--recursive
--growl
--timeout 30000
--require co-mocha
```

```js:test/sample.js

var Nightmare = require('Nightmare');
var assert = require('power-assert');
require('babel/register');

describe('Nightmare2を使ってみる', function () {

  var driver;

  beforeEach(function() {
    driver = Nightmare();
  });

  afterEach(function*() {
    yield driver.end();
  });

  it('yahooさんのタイトルを取得することができる', function*() {
    var title = yield driver
      .goto('http://yahoo.com')
      .title();

    assert(title === 'Yahoo');
  });

  it('qiitaさんのタイトルを取得することができる', function*() {
    var title = yield driver
      .goto('http://qiita.com')
      .title();

    assert(title === 'Qiita - A technical knowledge sharing platform for programmers.');
  });

  it('qiitaのorganizationに登録されている企業数はNである', function*() {
    var items = yield driver
      .goto('http://qiita.com/organizations')
      .evaluate(function(){
        return $('.organizationsList_item');
      });

    assert(171 === items.length);
  });
});

```

# テストの実行

```text
./node_modules/.bin/mocha --compilers js:espower-babel/guess test/


  Nightmare2を使ってみる
    ✓ yahooさんのタイトルを取得することができる (4908ms)
    ✓ qiitaさんのタイトルを取得することができる (2836ms)
    ✓ qiitaのorganizationに登録されている企業数はNである (2934ms)


  3 passing (11s)
```

# 感想

・yield便利すぎて怖い
・セレクタ関係のAPIを使って要素をつかむよりevaluateしてjQueryでつかむ方が個人的には楽でいいなぁと
十二平均律での周波数の求め方

#十二平均律での周波数の求め方
　しょっちゅう忘れては調べるのでメモ。

##計算
・半音(x)を12個重ねると１オクターブ。 f(x^12)
・１オクターブ上は周波数(f)が２倍。f*2

　を合わせると、

f(x^12) = f*2
x^12 = 2
x = 2^1/12
x = 1.05946.....

　になる。基本周波数に1.05946....を掛ければ半音上の音になる。
n半音高い音の計算は

f*2^n/12

##Maxで作る
![スクリーンショット 2015-09-20 0.40.27.png](https://qiita-image-store.s3.amazonaws.com/0/93396/29201101-d72e-348c-60ed-79b8c69f8bb4.png)
　まずはn/12のところ。

![スクリーンショット 2015-09-20 0.41.04.png](https://qiita-image-store.s3.amazonaws.com/0/93396/4c94f22e-c39a-c5a3-4c9f-9a449492039b.png)
　２の自乗に繋げる。
　[pow]は自乗のオブジェクトで、左インレットに入った数字を右インレット分掛けてくれる。今回は左インレットの数字を２に固定して、右インレットの数値を変えたかったので[trigger]で数値を右に入れた後、２を左に打っている。
　というわけで、完全五度（７半音）上は、基本周波数に1.498...を掛けた数値とでてくる。

![スクリーンショット 2015-09-20 0.46.32.png](https://qiita-image-store.s3.amazonaws.com/0/93396/a2412869-0b82-bb28-2680-5232a40d90c2.png)
　そして最後に基本周波数を掛けてあげると、求めたい周波数が出てくる。
mecab-python

備忘録です。
Python で形態素解析を行うために、Oracle Linux 6.6 に mecab-python をインストールします。

# Mecab 本体をインストール

```
cd mecab-0.996
./configure --prefix=/home/u1/Mecab
make
make check
make install

cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8 --with-mecab-config=/home/u1/Mecab/bin/mecab-config
make
make install
```

# mecab-python をインストール

```
export PATH=~/Mecab/bin:$PATH
cd mecab-python-0.996
python setup.py build
python setup.py install --prefix=/home/u1/Mecab/pybuild
```

python-devel-2.6.6-52.el6.x86_64.rpm を事前にインストールしておかないと下記エラーが発生するので注意。

```lang:error
  :
building '_MeCab' extension
creating build/temp.linux-x86_64-2.6
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/home/u1/Mecab/include -I/usr/include/python2.6 -c MeCab_wrap.cxx -o build/temp.linux-x86_64-2.6/MeCab_wrap.o
MeCab_wrap.cxx:149:20: error: Python.h: そのようなファイルやディレクトリはありません
  :
```

# 環境変数設定
PYTHONPATH を通しておく。

```
export PYTHONPATH=/home/u1/Mecab/pybuild/lib64/python2.6/site-packages
```

# 動作確認
test.py を実行して、mecab-python が正しくインストールされているかを確認。

```
$ python test.py
0.996
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

        BOS/EOS,*,*,*,*,*,*,*,*
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
        BOS/EOS,*,*,*,*,*,*,*,*
EOS
EOS
filename: /home/u1/Mecab/lib/mecab/dic/ipadic/sys.dic
charset: utf8
size: 392126
type: 0
lsize: 1316
rsize: 1316
version: 102
$
```
Macのターミナルコマンド一覧（基本編）

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

プログラミングは必ずと言っていいほどターミナルを使います。
この記事では、基本的かつ重要なコマンドをまとめています。
ターミナルを触るのが初めての人は、軽く読んでからターミナルを触ってみるといいでしょう。
こういったものは使っていかないと覚えないので、実際にコマンドを打って覚えていくとよいかと思います。
※この記事では実際にファイルを操作しますので、何もファイルがないディレクトリで行った方がよいかと思います。

コマンドを説明する前によく出てくる単語の説明をしましょう。

ディレクトリ・・・フォルダのこと。
カレントディレクトリ・・・現在いるディレクトリのこと。
ホームディレクトリ・・・ターミナルを起動したときのデフォルトのディレクトリのこと。

# コマンド一覧

## ls コマンド
カレントディレクトにあるファイルを表示する。（listの略）

```bash:ターミナル
ls  #カレントディレクトリにあるファイルやディレクトリを表示する
ls -l  #ファイルやディレクトリの詳細も同時に表示する
ls -a  #隠しファイルも含めファイルやディレクトリを全て表示する
ls −la  #隠しファイルを含む全てのファイルやディレクトリの詳細を表示する
```

隠しファイルとは通常では表示されないようになっているファイルやディレクトリのことです。
重要なファイルをユーザーが勝手にいじってしまわないように、通常では表示されないようになっています。
隠しファイルは名前の前に「.（ドット）」がついているファイルやディレクトリになります。
実際にホームディレクトリでやってみると、これまで見たことのない.がついたファイルが表示されると思います。

## cd コマンド
カレントディレクトリにあるファイルに移動する。（change directoryの略）

```bash:ターミナル
cd test.html  # testテストというファイルに移動する
cd ~/  #ホームディレクトリに移動する
cd ..  #一つ上の階層のファイルに移動する
```

## pwd コマンド
カレントディレクトリのパスを表示する。（print working directoryの略）

```bash:ターミナル
pwd  #カレントディレクトリのパスを表示する
```

## touch コマンド
中身が空のファイルを作る。

```bash:ターミナル
touch test.html  #test.htmlという中身が空のファイルを作る
```


## mkdir コマンド
新しい空のディレクトリを作る。（make directoryの略）

```bash:ターミナル
mkdir test #testというファイルを作る
```

## mv コマンド
ファイルを移動したり、ファイル名を変更したりする。（moveの略）

```bash:ターミナル
mv test.html tmp/  #test.htmlというファイルを相対パスでtmp/に移動する
mv test.html test2.html  #test.htmlというファイルをtest2.htmlに名前変更する
```

## cp コマンド
ファイルをコピーする。（copyの略）

```bash:ターミナル
cp test.html tmp/  #test.htmlを相対パスでtmp/というディレクトリの中にコピーする
cp test.html test2.html  #test.htmlをtest2.htmlという名前でコピーする
cp −r dir /tmp/  #dirというディレクトリとその中身を絶対パスで/tmp/にそっくりコピーする
```

## rm コマンド
ファイルを削除する。（removeの略）

```bash:ターミナル
rm test.html  #test.htmlを削除する
rm -r test  #testというディレクトリとその中身を削除する
rm -f test  #testというファイルを警告なしで削除する
rm -rf test  #testというディレクトリとその中身を警告なしで削除する
```

rmコマンドは取り返しのつかないファイルの削除になります。
コマンドにあまり慣れていない人は、使わないでください。
このコマンドで色々な悲劇が起きてきました、、、。

rmコマンドの悲劇については[こちら](http://japanese.engadget.com/2016/04/15/rm-rf-qanda/)を参照ください。


## openコマンド
ターミナルからFinderでファイルを開く。

```bash:ターミナル
open .  #現在のターミナルのディレクトリFinderで開く
open ~/  #ホームディレトリをFinderで開く
```

## source コマンド
ファイルの設定を読み込み有効にする。

```bash:ターミナル
source ~/.bash_profile  #ホームディレクトリにある.bash_profileに書き込んだ設定を読み込み有効にする
source .bash_profile  #カレントディレクトリにある.bash_profile設定を読み込み有効にする
```

## history コマンド
これまでのコマンド履歴を表示する。

```bash:ターミナル
history  #これまで実行してきたコマンドの履歴を表示する
history -c  #これまで実行してきたコマンドの履歴を消去する
```

# まとめ
以上が基本編になります。
ではでは、よいターミナル生活を！
[中級編はこちら](https://qiita.com/ryouzi/items/73f63f09573b7b4e246c)になります。
Swift入門してライブラリを公開するまでの記録

# 概要

iOS9/Xcode7のリリースが間近に迫った頃、そろそろSwift導入に向けて動きたいなぁと思ったときに勉強を初めて、何かしら成果物を出すまでの記録しておく。

# 前提

- わたしは会社員プログラマー（時間はたくさんは取れない）
- 普段はiOS/Android/Ruby on Railsでスマホアプリを開発している
- Swiftは業務では導入されておらず、Objective-Cがメイン言語

# 入門してから成果物をアウトプットするまでの期間

10日くらいだと思います。毎日少しずつ書籍/資料で勉強&サンプルコードを実行しておいて、最後の3日くらいでバッと成果物を作った。

# 勉強に利用したツール/書籍/資料

まずどこから手をつけようかといった時に、ざっとSwiftの概要をつかむために幾つかの資料/書籍をまずは読んでいった。自分が読んだものは以下。

選んだポイントとしては、あまり古いともう使い物にならなそうなので、少なくともSwift1.2以上に対応しており、かつ意識的に更新されているものを選びました。

- [The Swift Programming Language (Swift 2)]
(https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/)
 - 基本的にはリファレンス的に使いました。実際に手を動かしてわからない事があった時にこの資料に立ち返って、「ふむふむ、なるほど」をするための資料。
- [Swift離陸ガイド](http://www.amazon.co.jp/dp/B00NBK9KC0)
 - 比較的新しく、更新も頻繁に行われているのでKindleに入れて朝の電車でパラパラめくりながら出社した。ただ、サンプルコードが少ない。時間のある時に読んでおき「あーこんなことあったなー」と思い出す種を作るための書籍。

あとは、自宅や休み時間などにXcode7 Betaを使ってサンプルコードをコピペ実行してく日々だった。

# 成果物

結果として ```Migrator``` というアプリのアップデート時のMigration処理をハンドリングするライブラリを作ったので、CocoaPodsで公開した。

https://github.com/radioboo/Migrator

ライブラリの実装自体は以前から、[MFMigrationManager](https://github.com/fortinmike/MFMigrationManager)を参考にしてObjective-Cで自身の必要な仕様を含める形でカスタムして実装していたのをSwiftに移植した。

- [Protocols](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID267)
- [Error Handling](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)
- [Optional Chaining](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html#//apple_ref/doc/uid/TP40014097-CH21-ID245)
- [Closures](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94)

などなど、今後もよく使っていくであろう部分を意識して仕様に取り込んで実装していった。

# Swiftで実装をした感想

今回、Swiftを使って数日間プログラムを書いてきた感想はこんな感じ。

- コンパイラがいちいち注意してくれるのである程度安心して書ける
- 普通にアプリ実装する上ではそんなにObj-C時代と大きく変わることはなさそう
- むしろObj-C時代の知見が生きてすんなりSwiftも身につけられそう
- Xcodeが不便
    - Refactor機能が動いてくれなかったり
    - CleanしてBuildし直さないと他のクラスからメソッド補完できないとかが何度もありかなりイライラした
    - Obj-Cの時のように参考となるコーディングガイドラインがないのでこれでいいのか？みたいに思う時もある
- まだまだ覚えていくこと多そうなのでどんどん取り入れて効率的にプログラムしたい
Ruby on Railsでgemのdeviseをインストールした直後のエラー

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい


また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提
deviseをインストールして作業していたところ以下のようなエラーがでてきました。

```bash:ターミナル
'method_missing': undefined method 'devise' for User (call 'User.connection' to establish a connection):Class (NoMethodError)
```

このエラーが出続けるので`rails s`や`rake  ~~~`というコマンドが使用できなくなりました。
このときGemfileには`gem 'devise'`と記述し、ターミナルでは以下のような履歴になっていました。

```bash:ターミナル
#ターミナル履歴
bundle install
rails g devise user
rake db:migrate
```

・・・あっ、`rails g devise:install`をしていない！  
`rails g devise install`をしていないと`rails s`や`rake ~~~`と`devise  ~~~`などのコマンドが競合してしまい、すべてのコマンドが使用できなくなってしまうようです。
このエラーに対処するためにdeviseを`bundle install`の直後まで設定を戻してからもう一度deviseをインストールしました。

## 対処法
1. routes.rbにある`devise_for :users`というコードを削除する（これでrailsコマンドが使えるようになります！）
2. `rake db:rollback`でマイグレーションファイルをロールバックする。（これをすることによって先ほど作ったuserテーブルのマイグレーションファイルをなかったことにしましょう。）
3. userテーブルを作ったときのマイグレーションファイルを削除する。
4. `rails d model user`を行いuserモデルを削除する。

これらの作業でdeviseをインストールする前の状態に戻ることができました。
以上の作業が終わったら、`rails g devise:install`からコマンドを実行していけば正常に動くようになります。
オルガン式加算合成

#加算合成とは
　複数の信号を足しあわせていく合成方法。オルガンのストップ（音栓）を開いてパイプの音を足しあわせていくのに似ている。
![IMG_7713.JPG](https://qiita-image-store.s3.amazonaws.com/0/93396/cef0d6ec-623b-d527-b6df-c2a1cc1469ba.jpeg)
岐阜ふれあい福寿会館のサラマンカホールの辻オルガン

![スクリーンショット 2015-09-17 18.24.05.png](https://qiita-image-store.s3.amazonaws.com/0/93396/63d1f08d-a045-546f-699b-57182f58842e.png)
鍵盤の左右にあるものがストップ

#オルガン式加算合成
##基本形
![スクリーンショット 2015-09-19 23.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/93396/998521b4-efcb-c16a-9cb9-69f62f3a4669.png)

　鍵盤からMIDIノートナンバーを貰って、[mtof]で周波数に変換。それを[cycle~]に突っ込んで、キーボードをクリックするとその音程が鳴る。　Toggleのオン/オフで制御すればストップっぽい。
　[cycle~]の上にある「8'」は「8フィート」の意味。オルガンでヘ音記号における下第二線のC音を鳴らすために必要な開管のパイプ長が８フィートになることから。４フィートなら１オクターブ上の音、１６フィートなら１オクターブ下の音が鳴る。

###例：
・16' 　１オクターブ下のドの音
**・8'　　ドの音**
・4'　　１オクターブ上のドの音
・2'　　２オクターブ上のドの音
・1'　　３オクターブ上のドの音

##協和
![スクリーンショット 2015-09-17 18.37.34.png](https://qiita-image-store.s3.amazonaws.com/0/93396/3c842ac8-2cd7-32d6-0745-13882ff0bf5f.png)
　完全５度や完全８度は振動比が小さく協和しやすい（ノイジーにならない）。なので、パイプオルガンのパイプは基音に対してオクターブか５度を足したものが多い。

##複数のストップをつける
![スクリーンショット 2015-09-19 23.55.36.png](https://qiita-image-store.s3.amazonaws.com/0/93396/2b981db6-9a7e-281a-cede-d9afae571688.png)
　付けたいストップをコピペしただけ。[mtof]の直前で+12すればオクターブ上、+7すれば完全五度上になる。

##ハモンドオルガン
![Hammond_c3_Emilio_Muñoz.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/6ab7e772-ee0b-5de4-85fc-93a8e15f4abd.jpeg)
　電子式にしたオルガンの一つにハモンドオルガンがある。
![2000px-Hammond-drawbars-plain.svg.png](https://qiita-image-store.s3.amazonaws.com/0/93396/8d983582-ef61-a8f1-b937-967f13b1f60c.png)
　これは、ストップそれぞれの音量を変えることが出来る（引くほど大きくなる）。

##ハモンドオルガン型加算合成
![スクリーンショット 2015-09-20 0.01.08.png](https://qiita-image-store.s3.amazonaws.com/0/93396/7156426a-008d-8e55-bba4-6bdfcc55eb09.png)
　先ほどToggleを使ってオン/オフをしていたところを[gain~]に変更した。これでそれぞれの倍音をコントロールすることができる。
プロキシ環境でターミナルからのGitHub接続

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提
プロキシ環境下でGitHubに接続する際には、ターミナルでプロキシ設定をしないと接続することができません。
今回はプロキシ環境で、ターミナルからGitHubに接続する際の設定を説明したいと思います。
※この記事はMacOSが前提となります。

# 設定方法

## ターミナル自体にプロキシの設定をする

```bash:ターミナル
export http_proxy="http://プロキシ名:ポート番号"
export https_proxy="http://プロキシ名:ポート番号"
```

と実行します。
こうすることによってターミナル自体に、現在のプロキシ環境の設定をすることができます。

## Gitにプロキシ設定をする（global設定）
ターミナルで以下のコマンドを実行します。

```bash：ターミナル
git config --global http.proxy http://プロキシ名:ポート番号
git config --global https.proxy http://プロキシ名:ポート番号
```

Gitにプロキシの設定を行うことができました。
設定が反映されているかどうか確認する時は、ターミナルで以下のコマンドを実行しましょう。

```bash：ターミナル
git config --list
```

このコマンドは、現在のGitの設定を確認することができます。
最後のところに上で書いた設定が表示されていればすべての設定の完了です。


# 解除方法

## ターミナルのプロキシ設定の解除
ターミナルのプロキシ設定を解除するには、以下のコマンドを実行します。

```bash:ターミナル
export http_proxy=""
export https_proxy=""
```

## Gitのプロキシ設定の解除
`git config`のプロキシ設定を削除するときは、ターミナルで以下のコマンドを実行します。

```bash：ターミナル
git config --global --unset http.proxy
git config --global --unset https.proxy
```

以上になります。
ChromeでBootstrapのボタンの表示がおかしいと思ったらFontAwesomeのせいだったっぽい話

Bootstrap(v3.3.2)でサイトを作っていたら、
Firefoxでは大丈夫なんですが、Chromeでボタンの表示がおかしなことになっていました。
これが
![バスLOVE 管理画面.png](https://qiita-image-store.s3.amazonaws.com/0/93882/b27544ad-324c-3fdf-6a60-1d31d64b8268.png)
こんな感じ
![Desctop screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/93882/05ae8975-af8a-9007-f9af-5c8eb3e62407.png)
ちょっと見えずらいですが色が抜けてしまっていました。
onmouseすると色が復活するという謎現象・・・。

で、いろいろ原因を探っていてもよくわからなかったのですが、
試しにFontAwesome(v4.3.0)の呼び出し部分をコメントアウトしてみました。

```html
<!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> -->
```

そしたら、なぜだかよくわかりませんが**なんか直った。**
でも、FontAwesome使えないと困ります。
なので試しに最新バージョン（2015/09/19現在で）のv4.4.0にしてみたら大丈夫でした。

参考になるかわかりませんが、もし同じ現象が起きたら試してみてください。
CakePHP2系で画像がなかったらnoimage画像を出す



HTMLヘルパーを拡張して、なるべく新しいコードを書かずに、
画像のリンク切れをさせずに代わりにnoimage画像を表示させます。

動作確認環境はPHP5.6.13、CakePHP2.6.4です。

ちなみにCakePHPは/app/webrootで`php -S localhost:8383`して動かしています。


## .ctp

```php:/app/View/Pages/imagetest.ctp
<div>
<?= $this->Html->image('myIcon.jpg')?>
</div>

<div>
<?= $this->Html->image('//localhost:8383/img/myIcon.jpg')?>
</div>

<div>
<?= $this->Html->image('http://localhost:8383/img/myIcon.jpg')?>
</div>

<div>
<?= $this->Html->image('https://localhost:8383/img/myIcon.jpg')?>
</div>

<div>
<?= $this->Html->image('noimage.jpg')?>
</div>

<div>
<?= $this->Html->image('anotherIcon.jpg')?>
</div>

```

今回`myIcon.jpg`と`noimage.jpg`はあって表示され、`anotherIcon.jpg`は存在せずリンク切れになっている状態とします。

この.ctpは変更せずに、うまいことHTMLヘルパーの拡張だけで済ませます。

## CustomHtmlHelperで画像の存在チェック

`CustomHtmlHelper.php`を作って、image()をオーバーライド。

画像のパスを出す前に一度ファイルの有無を確認して、ない場合はnoimageに変える。

```php:/app/View/Helper/CustomHtmlHelper.php
<?php

App::uses('AppHelper', 'View/Helper');
App::import('Helper', 'Html');

class CustomHtmlHelper extends HtmlHelper {

	public function image($path, $options = array()) { // override

        // 画像のパスをパース(HtmlHelper::image()と同様)
		$realPath = $this->assetUrl($path, $options + array('pathPrefix' => Configure::read('App.imageBaseUrl')));

        // 同ホストの画像の場合のみ
        if (!preg_match('|(https?:)?//|',$realPath) && !file_exists(WWW_ROOT.$realPath)) {
            $path = 'noimage.jpg';
        }

        return parent::image($path, $options);
    }
}

```

## CustomHtmlHelperの読み込み

次にViewを変更する手間を省くために、`Html`で`CustomHtml`のヘルパーを読み出せるようにしてしまいます。

```php:/app/Controller/AppController.php
class AppController extends Controller {
    public $helpers = array(
        'Html' => array('className' => 'CustomHtml')
    );

（略）
}
```

これで上のViewファイルで画像がない場合もnoimage.jpgが表示されるはずです。


## ひとこと

ちょっと気持ち悪いのが、parent::image()でないでやる処理の一つと全く同じ処理をつけた形になっていること。
本当はparent::image()使わないで継承せずに純粋に上書きしたほうがスマートに書けるが、なるべく書く量を少なくしてみた。

noimageを出す時のサイズは別に指定する必要があったりと純粋にこれだけでnoimageを安心して出せるわけではない。
参考までにどうぞ。
unity > RS-232C > 送信成功

```txt:環境
ビルド: Unity 5.1.3-f1 on MacOS X 10.8.5
実行: Windows 8.1 pro (64bit)
```

using System.IO.Ports;によるエラーは以下で回避。
http://qiita.com/7of9/items/c545392169d78c9d09f2

以下は送信用スクリプト。COM3使用に固定(要改善)。

```sendTest.cs
using UnityEngine;
using System.Collections;

using System.IO.Ports; // for RS-232C

public class rs232cTestCS : MonoBehaviour {

	void Test_rs232c() {
		SerialPort sp = new SerialPort ();
//		string[] portname = SerialPort.GetPortNames ();
//		sp.PortName = portname[0];
		sp.PortName = "COM3";
		sp.BaudRate = 9600;
		sp.DataBits = 8;
		sp.Parity = Parity.None;
		sp.StopBits = StopBits.One;
		sp.Handshake = Handshake.None;
		sp.Encoding = System.Text.Encoding.ASCII;

		sp.Open ();
		string msg = "hello";
		sp.Write (msg);
		sp.Close ();
                sp.Dispose ();
	}

	void Start () {
		Test_rs232c ();	
	}	
}
```

##実行

以下を用意した
1. USB-シリアル変換ケーブル (VE488) x 2本
2. クロス用治具 (DSub-9pin x 2を TX, RXクロスで接続. GNDはそのまま接続)

上記をWindows8.1で使用すると、COM3とCOM4としてお互いが通信できるようになっていることを確認。

COM4側をTeraTermなどのターミナルソフトで立ち上げておいて、上記のスクリプトを実装してビルドした.exeファイルをWindows 8.1側で実行すると、「hello」の文字がCOM4で受信(COM3から送信)されることが確認できた。


とりあえず送信はできたが、受信は以下を見るとややこしそう。
http://tips.hecomi.com/entry/2014/07/28/023525
has_one throughに関して

#Rails has_one "through"に関して

```
Railsの"through"に関して簡単に理解するには、簡単な英文を書いてみるのが良いと考える。
概念図から理解しようとすると難しい感覚を覚えるけど、シンプルに考えると英文らしくコードも記述されていることを理解できると思う。
```

```
基本形
A has one some through B => AはBを通じて何かを一つを持つ。

例文
A has one account through B => AはBを通じて一つのアカウントを持つ
```



#簡単な関連図

```
Class Sipplier

Supplierはaccountを持ち、accountを通じてaccout_historyを持つ。
```

```
Class Account

accountはsupplierに属していて、account_historyを一つ持つ
```

```
Class AccoutHistroy

AccountHistoryはaccoutに属している
```

![has_one_through.png](https://qiita-image-store.s3.amazonaws.com/0/81345/dc3fe7c0-7eb5-eb37-e74f-13de5b2296f0.png)

参考サイト
http://guides.rubyonrails.org/association_basics.html
スワップ領域がないときにスワップできるようにする

今は21世紀なのでswap領域とか誰も意識していないと思うのですが、世の中にはswapする必要のある構成のアプリケーションというのもあります。
しかし先程も書いたように、今は21世紀なので仮想環境などswap領域がそもそも存在しないということも多いです。

どうしてもswapしないと死んでしまう！みたいな時はswapする領域を作ってあげます。

  * [SwapFaq - Community Help Wiki](https://help.ubuntu.com/community/SwapFaq)

ここに全部書いてあるのでこれ通りやります。

```
sudo fallocate -l 512m /mnt/512MiB.swap
sudo chmod 600 /mnt/512MiB.swap
sudo mkswap /mnt/512MiB.swap
sudo swapon /mnt/512MiB.swap

echo "\n/mnt/512MiB.swap  none  swap  sw  0 0" >> /etc/fstab
```

それとswap領域はメモリの倍くらいあった方がよいと言われてきましたが、今は21世紀なので、作るとしてもそんなにいらないと思います。
unity > RS-232C > The type or namespace name 'Ports' does not exist

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

RS-232CをUnityで使おうとした。

参考
http://hagehage.com/hagelog/post/20131127/335

`using System.IO.Ports; // for RS-232C`
を入れていると

`The type or namespace name 'Ports' does not exist`
というエラーがでる。

以下を見つけた。
http://tips.hecomi.com/entry/2014/07/28/023525
> Player Settings から API Compatibility Level を .NET 2.0 Subset から .NET 2.0 へと変更すると、System.IO.Ports.SerialPort クラスが扱えるようになります。

[Edit]>[Project Settings]>[Player]で以下の部分を変更するようだ。

![Main_unity_-_150919-rs232cTest_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/a9f8b45a-31fb-7fc9-2ce1-c2a5fc95e9e3.jpeg)

確かに.NET 2.0にするとエラーはなくなった。
Atlas上のTerraformがEC2インスタンスにSSH接続できるようにする方法

## TL;DR

Terraformのchef provisionerなどで対象ホストにSSH接続させるとき、秘密鍵のファイルパスを指定する必要があります。しかし、TerraformをAtlasで実行する場合、現状のAtlasにはSSH秘密鍵ファイルをアップロードする手段が無いので困ってしまいます。
そこで、環境変数を介してテンポラリなSSH秘密鍵ファイルを作成する手法を提案します。

## 背景

Terraformには、作成したEC2インスタンス上をChefでプロビジョニングしてくれるchef provisionerというものがあります。
これは、作成したEC2インスタンスにSSH接続してchef-clientを実行する、という仕組みになっています。
SSH接続するときには、適切なSSH秘密鍵へのファイルパスをTerraformに渡してやる必要があります。
AtlasでTerraformを実行することができますが、Atlasには現状SSH秘密鍵ファイルをアップロードする手段がありません。

## 解決策

今のところは、Atlasの環境変数に、改行を `\n` に置き換えたSSH秘密鍵を設定しておいて、
それを以下のようなlocal-exec provisionerでファイルに書き出してやるとよいです。

```
resource "aws_instance" "web" {
   # ...

   provisioner "local-exec" {
        command = "/bin/bash -c \"echo -e \\\"$SSH_PRIVATE_KEY\\\" > key && chmod 600 key\""
    }

    provisioner "chef" {
        # ...
        connection {
            user = "ec2-user"
            key_file = "key"
        }
    }
}
```

local-exec provisionerで `> key` として `key` というファイルにSSH秘密鍵を書き出して、chef provisionerのconnectionで `key_file = "key"` と指定することで、書きだしたSSH秘密鍵を使って Atlas上のTerraformがEC2インスタンスにSSH接続できるようにしています。

SSH_PRIVATE_KEY環境変数には、SSH秘密鍵の改行を `\n` に置き換えたものが入っています。
改行を `\n` に置き換えているのは、今のところAtlasの環境変数に複数行文字列を指定できない(一行目のみが環境変数の値として設定されている模様)からです。
`\n` のままファイルに書き出しても正しいSSH秘密鍵にならないので、それを `echo -e` で改行に変換しています。

bashを使っている理由は、local-exec provisionerが使うシェルが sh で、shのechoには `-e` オプションが存在しないから…なのですが、今試したところ `bash` の`echo -e`とshの`echo`は同じ結果になるようなので、わざわざbashを使う必要はなかったかも。
fs.watchでのファイル監視時に日本語ファイル名が正しく取得できない(node.js)

# fs.watchでのファイル監視時に日本語ファイル名が正しく取得できない(node.js)

fs.watchでファイル名を1バイトで取得しているために起こるらしい。

以下のようにすることで正しいファイル名が取得できる。

```js
fs.watch(PATH, function(event, filename) {
  console.log(Buffer(filename, 'binary').toString());
});
```

https://github.com/nodejs/node/issues/2088
Spring Data RedisでRedis Sentinelを利用する


[前回](http://qiita.com/yoshidan/items/f7c10a43d2a40c3ce8df)はSpring BootとSpring Data Redisを利用してRedisを利用する方法を書いた。
今回はSpring Data RedisをRedis Sentinel構成で利用する方法。

![スクリーンショット 2015-09-13 17.24.29.png](https://qiita-image-store.s3.amazonaws.com/0/39230/a5dc384f-00cc-e63b-1141-d8adf6a3b724.png "スクリーンショット 2015-09-13 17.24.29.png")


## 利用方法

* applicaion.ymlにSentinelの情報を記載する。

```
spring:
    data:
        redis:
            Sentinel: 
                  master: cluster1
                  nodes: localhost:26379,localhost:26380,localhost:26381
```          

* masterプロパティはSentinelに設定したクラスタの名称。
以下はSentinelのログ、Sentinelで認識しているクラスタの名称と同じにする必要がある。

```
[1] 13 Sep 07:41:51.043 # Sentinel runid is 2510f2561aff03a249726db05e195efc8ee80920
[1] 13 Sep 07:41:51.046 # +monitor master cluster1 192.168.59.103 6379 quorum 2
[1] 13 Sep 07:41:52.047 * +slave slave 172.17.42.1:6380 172.17.42.1 6380 @ cluster1 192.168.59.103 6379
```

* nodesプロパティはSentinelの接続先をカンマ区切りで指定する。
* Sentinel構成では無い時に指定していたhost/portの設定は不要。

上記の設定だけでSpring Data RedisがSentinelのプロセスからマスターノードの情報を取得するため、Sentinel構成の時でない場合と同様にRedisTemplateを利用してRedisを操作することができる。


## Masterの判定方法を追ってみる

次にSpring Data RedisからどのようにしてMasterの情報を取得しているのか確認する。
前提として、Spring Data Redisがデフォルトで利用するRedisのクライアントであるJedisを利用した状態で確認する。
流れを簡単に図示すると以下のようになる。

![スクリーンショット 2015-09-13 20.33.01.png](https://qiita-image-store.s3.amazonaws.com/0/39230/f4fede83-8925-0924-15a0-293d8ff56f16.png "スクリーンショット 2015-09-13 20.33.01.png")


### Sentinelへのコネクションプール生成

Spring Boot起動時など、まずJedisConnectionFactoryがBeanとして初期化されるタイミングで、application.ymlにSentinelの設定がなされていれば、Sentine用のコネクションプールJedisSentinelPoolを作成している。以下はJedisConnectionFactoryのソース一部抜粋。

```
public void afterPropertiesSet() {
		
	// 略
		
	if (usePool) {
		this.pool = createPool();
	}
}

private Pool<Jedis> createPool() {

	if (isRedisSentinelAware()) {
		return createRedisSentinelPool(this.SentinelConfig);
	}
	return createRedisPool();
}
```

### Masterの判定

JedisSentinelPoolのコンストラクタで以下の処理が行われる。

* Sentinelに対して順番にMasterが見つかるまで以下のコマンドを発行

	```
	SENTINEL get-master-addr-by-name cluster1
	```
	
* 一つ以上のSentinelからmasterの情報が取得できなければ例外
そのため、JedisConnectionFactory初期化のタイミングでは必ず1台のSentinelには接続できなければならない。

* 見つかったMasterに対してコネクションプールを生成

### SentinelへのSubscribe開始

上記と同時にSentinelのプロセス毎にMasterListenerというスレッドを起動する。
MasterListerでそれぞれが担当するSentinelプロセスに対してマスター変更をサブスクライブする。

```
SUBSCRIBE +switch-master
```	

### SentinelによりMasterが変更された時

MasterListenerが新Masterの接続先情報を受け取る。その後JedisSentinelPoolが新Masterに対するコネクションプールを作成する。

## 障害時の振る舞い

* Redisのマスターが停止してからSpring Data Redis側でコネクションプールを再生成するまではRedisTemplateでのRedisへのアクセスはエラーとなる。

* Sentinelが全停止していてもMasterが停止していなければRedisTemplateでエラーになることはない。

* Sentinelが停止してもMasterListenerはデフォルトで5秒毎に再接続試行しているため、Sentinelを再起動すれば接続が復旧する。
 
## その他

Masterに対してはアクセスできるが、Slaveだけアクセスする仕組みはないため、Read処理をSlaveから実施したい場合には自作する必要がある。
Cloud Foundry(Bluemix)を使ってmarkdown編集の出来るblogのghostを無料で使う


## はじめに

日本Cloud Foundryグループでは現在Cloud Foundry(PaaS)上でアプリをデプロイする為の知見を100個のアプリケーションで100日に渡って公開する[Cloud Foundry百日行](http://blog.cloudfoundry.gr.jp/2015/06/cf100apps-000.html)という企画を実施しています

その中で公開された[Ghost](http://docs.ghost.org/ja/)はMarkdownで編集することが可能なシンプルなblogアプリケーションです。

Ghost自体は無料でソースコードを入手する事が出来ますが、ホスティングサービスを利用する場合は[料金ページ](https://ghost.org/pricing/)を見ると8$/月ほど必要となるので、
無料で試す方法として、Bluemix上でデプロイする方法を紹介したいと思います。
※bluemixでは利用者毎に一定のサイズのアプリケーションまでは無料で利用可能です。

今回は[Cloud Foundry百日行のghost](http://blog.cloudfoundry.gr.jp/2015/09/cf100apps-059-ghost.html)の記事の中で使われているCloud Foundry向けに修正されたコードを元に[作成した版](https://github.com/morikat/ghost/tree/fix-service-environment-spec)のソースを利用して説明をします。
※最新版を利用したい場合は百日行の手順をベースに自分で編集する事をオススメします。

## 事前準備
1. bluemixのアカウントを入手
bluemixのアカウントがない場合は『KenichiSekineさんのQiita記事 [IBM Bluemixフリートライアルアカウント作成手順](http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63)』を参照して作成してください。
1. cfコマンドを準備
Cloud Foundryの公式cliの最新の[リリース](https://github.com/cloudfoundry/cli/releases)から自分のOSに応じたファイルを入手します。

## アプリケーションのデプロイとサービスの紐付け

####  ghostのソースを準備する

```bash
$ git clone https://github.com/morikat/ghost.git
$ cd ghost
$ git checkout fix-service-environment-spec
```
####  cfコマンドでbluemixのapiにログイン

下記のコマンドを入力するとEmailとPasswordを聞かれるので登録した値を入力します。
```bash
$ cf login -a https://api.ng.bluemix.net
```
####  アプリをpaas上にpushする 

※ここではサービスと紐付ける為に--no-startでpushします。また、cf-hostの部分がアプリ名でbluemix内でユニークで有る必要がある為、この手順を試す場合は別の名称でpushします。

```bash
$ cf push cf-ghost -m 256m --no-start
```
#### msyqlを作成する

※cf-ghost-mysql部分はpushしたアプリ名に-mysqlをつけると分かりやすいです。
```bash
$ cf create-service mysql 100 cf-ghost-mysql
...
OK
```
####  アプリとmysqlを紐付ける

```bash
$ cf bind-service cf-ghost cf-ghost-mysql
```
#### アプリを起動

```bash
$ cf start cf-ghost
OK

App cf-ghost was started using this command `./vendor/initial_startup.rb`

Showing health and status for app cf-ghost in org morika-t@hotmail.co.jp / space dev as morika-t@hotmail.co.jp...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: cf-ghost.mybluemix.net
package uploaded: Sat Sep 19 12:17:52 UTC 2015

     state     since                    cpu    memory       disk           details
#0   running   2015-09-19 09:19:20 PM   0.0%   203M of 256M   193.2M of 1G
```
#### アプリにアクセス
※アプリ名がcf-ghostの場合は https://cf-ghost.mybluemix.net となります

![image](https://qiita-image-store.s3.amazonaws.com/0/37192/88eb5a95-19cc-2860-c925-74f6623b0906.png)

#### 管理画面にアクセス
※アプリ名がcf-ghostの場合は https://cf-ghost.mybluemix.net/ghost/setup/ となります。 

CREATE YOUR ACCOUNTからアカウントを作成する事で記事を編集可能になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/37192/72e0e413-379c-ba33-3340-72d8559f41bd.png)

#### サンプル

今回のQiitaの記事をそのままghostにmarkdownを貼り付けて記事を[書いてみました](https://cf-ghost.mybluemix.net/)
※サンプルで上げている為、後ほど上記のURLはアクセス不可になるかも知れません

![image](https://qiita-image-store.s3.amazonaws.com/0/37192/279ae983-21bd-8fd9-e78e-a60f06765c34.png)
playframeworkでStackOverflowErrorとなった場合の対応について

linux(CentOS7)環境でplayframeworkを利用したアプリをコンパイルしようとしたら、

```
[error]
[error]      while compiling: /risachi/target/scala-2.10/src_managed/main/routes_reverseRouting.scala
[error]         during phase: erasure
[error]      library version: version 2.10.2
[error]     compiler version: version 2.10.2
    --途中省略--
[error] uncaught exception during compilation: java.lang.StackOverflowError
java.lang.StackOverflowError
        at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4621)
        at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5526)
        at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:840)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5604)
        at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5689)
        at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5697)
        at scala.tools.nsc.transform.Erasure$Eraser.adaptMember(Erasure.scala:786)
    --途中省略--
        at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:840)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5604)
        at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$92.apply(Typers.scala:4570)
[error] (compile:compile) java.lang.StackOverflowError

```
のようなエラーが発生してしまう事象が発生した。

https://github.com/playframework/playframework/issues/4146
によると、`-Xss1M`を追加すればよいとのことだったが、

```
export PLAY_OPTS="-Xms512M -Xmx1024M -Xss1M";play compile
```

としても駄目だった。
色々悩んだあげく、

```
export PLAY_OPTS="-Xms512M -Xmx1024M -Xss4M";play compile
```

のように`-Xss`のサイズを大きくすることでコンパイルエラーが回避出来た。
RailsでQRコードを表示するのがとても簡単だった(rqrcode)

# RailsでQRコードを表示するのがとても簡単だった(rqrcode)

gemを追加します。

```ruby:Gemfile
gem 'rqrcode'
```

application helperにqrcode_tagメソッドを追加します。

```ruby:app/helpers/application_helper.rb
module ApplicationHelper
  def qrcode_tag(text, options = {})
    ::RQRCode::QRCode.new(text).as_svg(options).html_safe
  end
end
```

viewで表示します。

```html
<%= qrcode_tag request.url, module_size: 5 %>
```

完成

svg形式で表示していますが、
`as_svg`の所を他の形式に変えればsvgに未対応のブラウザでも表示させるようにもできます。

https://github.com/whomwah/rqrcode
Ethereumのgethで同期失敗(Synchronisation failed)への対処方法

以下に移行しました<br><a href="http://block-chain.jp/tech/ethereum-geth-synchronisation-failed/" title="Ethereumのgethで同期失敗(Synchronisation failed)への対処方法">Ethereumのgethで同期失敗(Synchronisation failed)への対処方法</a>
runC でユーザディレクトリ領域をマウントする


runC でユーザのディレクトリをマウントさせて, データを読ませたりコンテナ内で実行した結果を書き込みたいですよね!

やってみましょう.

    $ pwd
    /home/docker-user/

    $ mkdir data
    $ touch data/bora

`data` ディレクトリを `runtime.json` の mounts に登録します.

```
        "mounts": {
                "data": {
                        "type": "bind",
                        "source": "/home/docker-user/data",
                        "options": [
                                "rbind",
                                "rw"
                        ]
                },
                ...
```

すでにあるホスト側のディレクトリの場合, `type` には `bind` を指定するようです. 

`config.json` にマウント情報を追加します.

```
        "mounts": [
                {
                        "name": "data",
                        "path": "/data"
                },
```

ホスト側の `/home/docker-user/data` ディレクトリを, コンテナ内では `/data` にマウントします.

ディレクトリの権限に応じて, uid, gid を調整します. 今回はホスト側の docker-user アカウントの uid, gid とすることで, ホスト側の docker-user 権限でコンテナを実行することにします.

```
        "process": {
                "terminal": true,
                "user": {
                        "uid": 1001,
                        "gid": 1001,
                        "additionalGids": null
                },
                "args": [
                        "cp", "bora", "dora"
                ],
                "env": [
                        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                        "TERM=xterm"
                ],
                "cwd": "/data"
        },
```

実行してみます

    $ ls -la data
    total 16
    drwxrwxr-x  2 docker-user docker-user 4096 Sep 19 12:31 .
    drwxr-xr-x 12 docker-user docker-user 4096 Sep 19 12:40 ..
    -rw-rw-r--  1 docker-user docker-user    5 Sep 19 12:25 bora

    $ sudo runc start

    $ ls -la data
    total 16
    drwxrwxr-x  2 docker-user docker-user 4096 Sep 19 12:31 .
    drwxr-xr-x 12 docker-user docker-user 4096 Sep 19 12:40 ..
    -rw-rw-r--  1 docker-user docker-user    5 Sep 19 12:25 bora
    -rw-r--r--  1 docker-user docker-user    5 Sep 19 12:31 dora

Voila! コンテナ内でファイルがうまくコピーされてホスト側のディレクトリに反映されています.

# 参考文献

* https://github.com/opencontainers/specs/blob/master/config.md
* https://github.com/opencontainers/specs/blob/master/runtime.md