OmniAICreator/Qiita-1.07M huggingface dataset:
Unity　アセットバンドル注意事項メモ

# Unity5.3.0f4
■アセットバンドル名の命名時の注意事項

　※（注意１）
　フォルダ内にファイルがある環境を想定

　・フォルダだけにアセットバンドル名を付ける
　　⇒アセットバンドル出力する
　　⇒フォルダの中身のファイルがアセットバンドルになる。

　・フォルダとフォルダ内ファイルの両方にアセットバンドル名を付ける
　　⇒アセットバンドル出力する
　　⇒フォルダはアセットバンドルにならない、フォルダ内ファイルがアセットバンドルになる。

　※（注意２）
　**ライトはアセットバンドル名をつけてもアセットバンドルとして出力されない。**
　ここで言うライトとは、LightingウィンドウのLightmapsタブのLighting Data Assetの事

# Unity5.1.0
■Assetbundle.Unload(false)の使い方

　下記リファレンスの文章によると

---
　unloadAllLoadedObjects が false の場合、アセットバンドルの中にある圧縮された
　アセットのファイルデータはアンロードされますが、このアセットバンドルによりロード
　された実際のオブジェクトはそのまま保持されます。当然ながらこのアセットバンドルから
　追加でオブジェクトをロードすることは出来なくなります。

　unloadAllLoadedObjects が true の場合、既にロードされたオブジェクトも含めて
　破棄されます。 シーン上でこれらのアセットを参照するオブジェクトについて、
　それらへの参照は Missing となります。

---

　と書いてあるので、AssetBundle.LoadAssetした後AssetBundle.Unload(false)を
　使用してAssetBundle自体を保存しておくメモリをアンロードすると**LoaAssetした
　メモリ(AssetBundleから中身をロードしたメモリ)**は削除されないと思っていたが、
　どこにも参照がない(使われていない)ものは、AssetBundle.Unload(false)をした時点で
　メモリ上から 削除されてしまうとの事です。（公式に確認しました）
　
　そもそもTextureやMaterialはInstantiateしないので参照されないとただメモリ上に
　データがあるだけになる、どうしてもAssetBundle.Unload(false)したいのであれば
　変数に入れるなりして参照を持っておく必要あり、ただメモリのピーク値とか管理する仕組み
　をしっかり考える必要あり。

　■リファレンスのページ
　http://docs.unity3d.com/jp/current/ScriptReference/AssetBundle.Unload.html


■マニフェストファイルについて

　GetAllDependencies(アセットバンドル名)で、
　指定したアセットバンドル名に依存する全てのアセットバンドルを取得できる。
　
　ただ、依存関係の最下層からの順にはなっていないので依存関係の最下層からの
　依存関係になるように並び替える必要がある。
（プレハブとAnimatorController以外は順序を考える必要ないとコメントいただきました。）

　RuntimeAnimatorControllerに紐づくfbxが複数あった場合、
　全てのfbxファイルをロードしてからRuntimeAnimatorControllerをよまないと
　Animationが正しく再生できないので元となるものをロードしてから大元をロードする
　ように並び替える必要がある。

　Aに依存するB・CがありBに依存するものがDであった場合、
　GetAllDependencies(A)で帰ってくるのはBDCかもしれないしCDBかもしれない
　このあたりに規則がありそうだが依存関係の最下層からの順番に並び替えてくれる
　わけではないので、自分で並び替えてリスト構造にすればOK
　

■アセットをロードする順番について**（Android実機確認）**
　とりあえず同じことだけど書いておく
　**RuntimeAnimatorController**はFBXを読み込んだ後で無いと(Ver Unity6.1.0f3)ではエラーとなる、
　バージョンが上がれば解決されるかも。

　**prefab**となる**GameObject**は必ず一番最後に読む事・・なんか不安定(Ver Unity6.1.0f3)

　読み順関係ないはずなのだが、**Texture2D**を**Material**より先に読まないと
　テクスチャが外れてるみたいでキャラクターが真っ白になりました。(Ver Unity6.1.0f3)

　アセットバンドルのロード周りはまだ不安が残るなあ。
　 [Issue Tracker](http://issuetracker.unity3d.com/)とか調べようか
RxAndroidメモ1: ボタン群の選択非選択

RxAndroidで例を思いついた時に書き残していくメモ
たとえばメニューを扱うときにボタンが複数あるとする。

```kotlin
val button1: Button by bindView(R.id.button1)
val button2: Button by bindView(R.id.button1)
val button3: Button by bindView(R.id.button1)
```

この内で押されたボタンのみを選択中に、それ以外のボタンを非選択中に変えたい。(メニューとか、radio box的な処理)

```kotlin
fun initView() {
    val buttons = listOf(button1, button2, button3)
    val clicks = Observable.merge(
        listOf(
            ViewObsevable.clicks(button1),
            ViewObsevable.clicks(button2),
            ViewObsevable.clicks(button3)
        )
    )

    buttons.forEach { button ->
        ViewObservable.bindView(button, clicks).subscribe {
            val selected = it.view().identityEquals(button)
            button.setSelected(selected)
        }
    }
}
```

mergeを使うと複数のイベントを簡単にガッチャンコできて便利だ。
CakePHP2でのElementキャッシュで見た目から処理を減らしていく

Webページ内に、この部分は1時間に一回更新されればいいなど、Viewの一部だけキャッシュしたいと思うことが結構ある。

CakePHP2ではElement単位でキャッシュが可能。そのElementを生成するのに必要なデータの取得等の処理も当然省略できる。



## Elementをキャッシュする

```
$this->Element('user_ranking', [], [
    'cache' => true
]);
```

## Elementを生成するときのみに使用する処理の追加

`$this->requestAction()`を利用することでViewからControllerの任意のアクションを呼び出せる。これをElement内にかくことで、このElementを描画するときのみアクションを実行させることができる。

```
$ranking = $this->requestAction([
    'controller' => 'Users',
    'action' => 'getUserRanking'
]);
```

actionはこんなかんじ。`$this->request->is('requested')`で`requestAction()`からのリクエストを検知できる。

```UsersController.php
public function getUserRanking() {
    
    if ($this->request->is('requested')) {
        // requestAction()時のみrankingを返す
        return $this->UserRanking->getUserRanking();
    }
    throw new BadRequestException();
}
```




## 参考資料

ほぼほぼこちらに書いてある内容です。

* http://book.cakephp.org/2.0/ja/views.html
* http://api.cakephp.org/2.3/class-Object.html#_requestAction
BootcampでWindowsのインストールに失敗する問題の解決方法 AppleSSD.sys 0xc0000428 このファイルのデジタル署名を検証できません。

# 最初に
コメントに多くの方々による大変有用な情報があるので、必ずチェックしてみてください！

# 概要
2015/8/15現在BootcampでWindows 7をインストールすると、インストール途中で以下のようなエラーメッセージが表示されます。

![bootcamp_error01.png](https://qiita-image-store.s3.amazonaws.com/0/54186/1b649c5b-99df-e40f-f42a-cda710cd0003.png)


```
ファイル : AppleSSD.sys
状態 : 0xc0000428 
情報 : このファイルのデジタル署名を検証できません。
```

恐らく先日実施されたBootcampのWindows 10対応以降問題が発生しています。
上記の問題を解決する方法を紹介したいと思います。

## 手順
1. OS Xで再起動
2. BootcampでWindows 7などのisoファイルからインストール用のUSBメモリを作成。
3. 正しいBoot Camp Support Softwareをダウンロード
4. インストール用USBメモリを修正
5. インストール


## 1. OS Xで再起動
上記のエラーが表示された方は、まずこの画面から脱出しましょう。
電源キーを長押しするとシャットダウンできます。続いてOptionキーを押しながら電源キーを押すとブートするOSを選択出来る画面になるので、そこでMacを起動してください。


## 2. BootcampでWindows 7などのisoファイルからインストール用のUSBメモリを作成。
上記のエラーが表示された方は、このステップは飛ばして3から作業してください。今からBootcampを始めようと考えている方は2から作業をしてください。

まずはUSBメモリをMacに装着します。
SpotlightでBootと入力して`Boot Camp アシスタント`を起動します。

このとき最下部の`Windows 7　またはそれ以降のバージョンをインストールする`のチェックを外してください。
このチェックを入れたまだとインストールが始まり、同様のエラーが発生してしまいます。
![bootcamp01.png](https://qiita-image-store.s3.amazonaws.com/0/54186/6383b13f-7591-ea7d-ce0a-115566dcba9b.png)


## 3. 正しいBoot Camp Support Softwareをダウンロード
本来はBootCampアシスタントが自動的にダウンロードしてUSBメモリに配置するものですが、この自動的にダウンロードされるものに問題があるため自分でダウンロードして置き換える必要があります。

以下から自分の環境に対応したソフトウェアをダウンロードして展開してください。
https://support.apple.com/ja-jp/HT204048

私が確認した限りではBoot Camp Support Software 5.1.5621ではうまくいきました。
最近リリースされたBoot Camp Support Software 5.1.5769が怪しいです。

## 4. インストール用USBメモリを修正
1で作成したUSBメモリをFinderで開き、`$WinPEDriver$`と`BootCamp`を削除します。
続いて2.で展開したBoot Camp Support Softwareの中から`$WinPEDriver$`と`BootCamp`をUSBメモリにコピーします。

## 5. インストール
再度`Boot Camp アシスタント`を起動します。
そして先ほどとは逆に`Windows 7　またはそれ以降のバージョンをインストールする`だけチェックを入れてください。
![bootcamp02.png](https://qiita-image-store.s3.amazonaws.com/0/54186/593e81d0-09d0-e56e-8917-2de6b1034467.png)

あとは`続ける`を押して進めると正しくインストールが完了します。

既にWindowsパーティションが存在する場合は、1度単一パーティションに戻す必要があることがあります。そのときは単一パーティションに戻したあとに再度`Boot Camp アシスタント`を起動してください。

# 動作確認環境
* Macbook Pro Retina 15inch 2012 
* Yosemite


# 参考
[urgent]get "appleSSD.sys" error when installing windows 7 through bootcamp
https://discussions.apple.com/thread/7171397
CentOS 6.5とvagrant-vbguestで詰まる

[こちらがとても参考になります](http://www.utano.jp/entry/2014/11/vagrant_guest_additions_update_error)

vagrantを立ち上げる時に、centosとvagrant-vbguestを使った環境だとなるようです。
下記のエラーのようにkernel-develがインストールできていなくエラーになりました。

```
yum install kernel-devel-2.6.32-504.el6.x86_64

Building the main Guest Additions module                   [失敗]
```

`vagrant ssh`
コマンドでvagrantにログインして`/usr/src/kernels/`を見てみると何も無く、
本来なら`2.6.32-504.el6.x86_64`というkernel-develがあるはずです。

解決方法はいくつかあるようですが、僕は自分でkernel-develを入れる方法で行きました。
まず、`kernel-devel-2.6.32-504.el6.x86_64`でググりDLできるサイトを探してアドレスをコピー。
`sudo yum install (ここにコピーしたアドレス)`
自分の場合は、
`sudo yum install http://vault.centos.org/6.4/cr/x86_64/Packages/kernel-devel-2.6.32-504.el6.x86_64.rpm`
でした。
これで、`/usr/src/kernels/2.6.32-504.el6.x86_64`にインストールされると思います。
その後に`sudo /etc/init.d/vboxadd setup`コマンドを実行すれば、
`Building the main Guest Additions module                   [  OK  ]`となると思います。
[Swift] NavigationItemをNavigationBarの右側にコードで設定する方法

# 虫眼鏡アイコンを追加してみます

``` swift
overrided func viewDidLoad() {
  // show search button and set action
  var rightSearchBarButtonItem:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "searchButtonTapped")
  // add the button to navigationBar
  self.navigationItem.setRightBarButtonItems([rightSearchBarButtonItem], animated: true)
}
```

# 複数を右側に追加してみます

```swift
overrided func viewDidLoad() {
  var rightFooBarButtonItem:UIBarButtonItem = UIBarButtonItem(title: "Foo", style: UIBarButtonItemStyle.Plain, target: self, action: "fooButtonTapped")

  var rightSearchBarButtonItem:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "searchButtonTapped:")

  self.navigationItem.setRightBarButtonItems([rightAddBarButtonItem,rightSearchBarButtonItem], animated: true)
}
```

# こちらも忘れずに

```swift
func fooButtonTapped(){

}

func searchButtonTapped(){

}
```
Excel VBAでのエラー処理

Excel VBAで組んだ処理でエラーが発生した時、デバッグモードに移ってしまうとどのモジュールのどのプロシージャでエラーが発生したのかよくわからなくなることがあります。
そのような場合、エラー発生箇所と内容を出力する画面をポップアップさせるようにしておくとデバッグが楽です。

方法としては、エラー内容レポート用の標準モジュールを用意しておき、エラートラップから当該モジュールを呼ぶというきわめて原始的な方法です。

エラーレポート用モジュール

```vbnet:ErrorFunction.bas
Option Explicit

Public Sub displayError( _
    plErrNum As Long, _
    psErrDesc As String, _
    psErrApl As String, _
    psErrModule As String, _
    psErrProc As String, _
    Optional pvErrNote As Variant)

    On Error Resume Next
    
    Dim sBuffer As String
    
    If IsMissing(pvErrNote) = False Then
        sBuffer = "エラーが発生しました。" & vbCrLf & _
                    "エラー番号" & vbTab & vbTab & ":" & Space(1) & CStr(plErrNum) & vbCrLf & _
                    "エラー内容" & vbTab & vbTab & ":" & Space(1) & psErrDesc & vbCrLf & _
                    "プロジェクト名" & vbTab & vbTab & ":" & Space(1) & psErrApl & vbCrLf & _
                    "モジュール名" & vbTab & vbTab & ":" & Space(1) & psErrModule & vbCrLf & _
                    "プロシージャ名" & vbTab & vbTab & ":" & Space(1) & psErrProc & vbCrLf & _
                    "備考" & vbTab & vbTab & ":" & Space(1) & pvErrNote & vbCrLf
    Else
        sBuffer = "エラーが発生しました。" & vbCrLf & _
                    "エラー番号" & vbTab & vbTab & ":" & Space(1) & CStr(plErrNum) & vbCrLf & _
                    "エラー内容" & vbTab & vbTab & ":" & Space(1) & psErrDesc & vbCrLf & _
                    "プロジェクト名" & vbTab & vbTab & ":" & Space(1) & psErrApl & vbCrLf & _
                    "モジュール名" & vbTab & vbTab & ":" & Space(1) & psErrModule & vbCrLf & _
                    "プロシージャ名" & vbTab & vbTab & ":" & Space(1) & psErrProc & vbCrLf
    End If
    
    
    Call MsgBox(sBuffer, vbCritical + vbOKOnly)
    
End Sub
```

エラー呼び出し側モジュール

```vbnet:hoge.bas
Option Explicit

Private Const msMODULE_NAME = "hoge.bas" as String

Public Sub hoge
    On Error GoTo ErrTrap

    Const sPROC_NAME = "hoge" as String

    '+ 処理内容を書く

EndProc:
    Exit Sub

ErrTrap:
    Call ErrorFunction.displayError(Err.Number, Err.Description, Err.Source, msMODULE_NAME, sPROC_NAME)
    GoTo EndProc

End sub
```
Androidの画像を手軽に書き出す

Android開発をしているとdrawableの書き出しの作業に時間を取られたりします。
mdpi,hdpi,xhdpi,xxhdpi,xxxhdpiなど、いちいち計算したり、書き出したりする作業に時間を取られてしまうことがあります。

ざっくりと作りましたが、下記手順で簡単に書き出しができるようになりました。
画像ファイルはxxxhdpi画像のみ作成しておきます。

ImageMagickが必要になりますので入っていない場合は予め入れておきます。

```
brew install ImageMagick
```

入れておいたら.zshrcなどに下記を追加

```
function dinit() {
  echo "元画像のファイル名を入力(xxxdpi)"
  read name
  if [ ! -e $name ]; then
    echo "ファイルがみつかりません"
    return 0;
  fi

  convert -geometry 25% $name ../drawable-mdpi/$name
  convert -geometry 37.5% $name ../drawable-hdpi/$name
  convert -geometry 50% $name ../drawable-xhdpi/$name
  convert -geometry 75% $name ../drawable-xxhdpi/$name

  echo "mipmapの書き出し(y)"
  read mipmap
  if [ $mipmap = "y" ]; then
    convert -geometry 25% $name ../mipmap-mdpi/$name
    convert -geometry 37.5% $name ../mipmap-hdpi/$name
    convert -geometry 50% $name ../mipmap-xhdpi/$name
    convert -geometry 75% $name ../mipmap-xxhdpi/$name
    convert -geometry 100% $name ../mipmap-xxxhdpi/$name
  fi
  echo "画像書き出し完了"
}
```

次にxxxhdpi画像を作成し保存した場所に移動します。
cdコマンドでxxxhdpiのあるディレクトリに移動し下記を実行。

```
dinit
```

作成するファイル名を聞かれるので、xxxhdpiに保存したファイル名を入力。
次にmipmapの作成の必要があれば[y]を押しEnter。

これで各サイズの画像を作成できます。
だいぶ手間が省けました。
Capistrano のデプロイで git clone に失敗したときに確認すること

`$ cap production deploy:check` を実行するとこんなエラーが発生しました。

```
Error reading response length from authentication socket.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

原因は `set :repo_url` で SSH の URL をしていたことだったようで、
以下のように HTTPS の URL に変更することでエラーしなくなりました。

```ruby
set :repo_url, 'https://github.com/akisute3/repo.git'
```
Scala便利系機能

よく忘れるので、自分用メモ。随時増やす。

# import
## 別名をつけてインポート

```scala
import scala.collection.immutable.{Seq => ISeq}
```
SeqをISeqで使える。

# 配列系
## zip(Array、AbstractSeq、とか)
二つの要素の内容をタプルにしてひとつの要素にする。
二つの要素の数が違う場合は多いほうは捨てられる。

```scala
val a = Array(1, 2, 3, 4)
val b = Array(10, 20, 30)
val c = a.zip(b)
for (i <- c) println(i)
```

実行結果

```
(1, 10)
(2, 20)
(3, 30)
```
aの4が捨てられる。

## unzip(Array、AbstractSeq、とか)
zipの逆。

```scala
    val origin = Array((1, 10), (2, 20))
    val (a, b) = origin.unzip

    for (i <- a) println(i)
    for (i <- b) println(i)
```

実行結果

```
1
2
10
20
```

## map (Array、AbstractSeq、とか)
配列の各要素に引数の関数の操作を実行し、新たな配列を作る。

```
val a = Array(1, 2)
val b = a.map(_ * 10)
for (i <- b) println(i)
```

実行結果

```
10
20
```

## reduce(Array、AbstractSeq、とか)
言葉で説明するが難しい・・・
要素の0番と1番を関数に渡してその結果と、要素の2番の結果を関数に渡して・・・

```scala
val a = Array(1, 2, 3, 4)
val b = a.reduce(_ + _)
println(b)
```

実行結果

```
10
```

## flatMap
Optionの配列からNoneの値を取り除ける

```scala
val seq: Seq[Option[String]] = Seq(Option("1"), None, Option("2"))
val noOpt: Seq[String] = seq.flatMap(s => s)
println(noOpt)
```
実行結果

```
List(1, 2)
```

# Future操作
## Future.sequence
Futureの配列などをFutureを外側に持ってこれる

```scala
val seq: Seq[Future[Int]]
val future: Future[Seq[Int]] = Future.sequence(seq)
```
[iOS] TableViewのセルの右端に">"みたいな右矢印を出したいとき (Storyboardを使って)

# 状況
iOS開発未熟者がTableViewにとりかかり始めました。
StoryboardでTable View Controllerを設置して、Prototype Cellsをあちゃこちゃしてます。
そこでとりあえず右矢印を出したいとなりました。

![Screen Shot 2015-08-15 at 16.49.23.png](https://qiita-image-store.s3.amazonaws.com/0/18705/8e0ad9b8-c88d-005c-d32a-e76976e82d5a.png)

# やりかた

identifierを設定していればその名前になっているTable View Cellを選択して、Accessoryをいじります。
その中にあるDisclosure Indicatorを選択します。

![Screen Shot 2015-08-15 at 16.49.35.png](https://qiita-image-store.s3.amazonaws.com/0/18705/7bd29c42-d85a-7e92-118c-a4a5b736dcf8.png)

以上です。

# ちなみに

Accessoryには他にもあります。

- Detail Disclosure

![Screen Shot 2015-08-15 at 16.51.14.png](https://qiita-image-store.s3.amazonaws.com/0/18705/8c608603-0025-63f6-c28f-dc414c1ad560.png)

- Checkmark

![Screen Shot 2015-08-15 at 16.51.23.png](https://qiita-image-store.s3.amazonaws.com/0/18705/9ffcfe52-876b-87b9-bd7a-e58e4d3a0f8a.png)

- Detail

![Screen Shot 2015-08-15 at 16.51.29.png](https://qiita-image-store.s3.amazonaws.com/0/18705/3f6e1415-f16a-8c18-e6c3-e52ae18fc918.png)
Notebookを出力など無視しつつdiffする

ここ最近は作業の多くをJupyterでやっています。

なんだかここ最近扱うものの多様さもあいまって、「コマンドの使い方を忘れる」とか「そもそも何のコマンドを使っていたか忘れる」みたいなことが多かったわけですが、普段からJupyter(IPython Notebook)上で作業していれば、実行した内容とそれに対応する出力の記録が残ってくれます。
こうしておけば、あとから見返して、必要であればそのNotebookを再利用して同じような作業を実施する、みたいなことができるわけです。

そんな中で似たようなNotebookが複数できしまい、それらのNotebookのdiffをとりたくなったので試した方法のメモ。

#Notebookのファイル(.ipynb)とdiff

Notebookのファイル(.ipynb)はJSONファイルなのでdiff取っちゃえばいいじゃん、というのはあるのですが、Notebookのファイルには実行カウントや出力結果の情報もあわせて記録されているので、単純にdiffを取るのでは、出力などの実行時に関する情報も差分として現れてしまい、手順や説明だけの差分が見えにくくなってしまいます。

[Using IPython notebooks under version control](http://stackoverflow.com/questions/18734739/using-ipython-notebooks-under-version-control) みたく、Gitでの操作時に出力結果を削っちゃうようなフィルタを施すというのもシンプルでよいなあ、とは思うのですが、出力結果も大事で、それはそれで残しておきたい・・・といった状況。

#出力を無視したdiffの取り方

diffコマンドで差分を取る際に簡単に出力結果を削ることができるスクリプトを用意してみました。

まず、以下のスクリプトをダウンロードし、実行可能権限を付与しておいてください。

- [yacchin1205/nbstripout](https://gist.github.com/yacchin1205/ef4b413790bdfde52991)


で、たとえば `1.ipynb` と `2.ipynb` の内容を、出力結果を無視して比較したい場合はbash上で以下のように実行すればOK。

```console
$ diff <(./nbstripout 1.ipynb) <(./nbstripout 2.ipynb) 
```

##実行例

あるNotebook `test-1.ipynb` から派生して別の環境向けのNotebook `test-2.ipynb`を作った、みたいな状況を例に・・・

Notebookで実行操作をおこなうと、実行カウントが増えたり、たとえばcurlコマンドの実行など、ダウンロード速度などの実行時の状況により出力結果が変化するセルを含んでいれば実行結果が毎回変化したりします。
そのため、Notebookファイルをそのままdiffを取ってしまうと、outputやexecution_countのような実行に関する情報が差分として目立ってしまい、肝心の説明やコードに関する変更点がぼやけてしまうことがよくあります。

```shell-session
$ diff test-1.ipynb test-2.ipynb
9c9,13
<     "出力セルだけ無視してdiffとりたい。"
---
>     "出力セルだけ無視してdiffとりたい。\n",
>     "\n",
>     "##追加説明\n",
>     "\n",
>     "この場合はどういう背景で実行したんだっけみたいな説明。"
14c18
<    "execution_count": 2,
---
>    "execution_count": 3,
25c29
<       "100  1535  100  1535    0     0   3953      0 --:--:-- --:--:-- --:--:--  3956\n"
---
>       "100  1535  100  1535    0     0   7802      0 --:--:-- --:--:-- --:--:--  7791\n"
```

`nbstripout`を通してdiffをとると以下のような感じで、execution_countやoutputの情報が除外されて、説明の部分だけが見えます。

```shell-session
$ diff <(./nbstripout test-1.ipynb) <(./nbstripout test-2.ipynb)
9c9,13
<     "出力セルだけ無視してdiffとりたい。"
---
>     "出力セルだけ無視してdiffとりたい。\n",
>     "\n",
>     "##追加説明\n",
>     "\n",
>     "この場合はどういう背景で実行したんだっけみたいな説明。"
```

この例ではexecution_countやoutputは大した行数ではありませんが、プロットを含んでいたり、多くの処理を実行するようなコマンドの出力結果が含まれていたりすると、非常に大きなものになってつらい気持ちになります。

##参考

ベースとしたスクリプトは以下、

- [minrk/nbstripout](https://gist.github.com/minrk/6176788)

このスクリプト `nbstripout` は引数に指定された.ipynbファイルを読み込み、execution_countやoutputを削ったのち、その.ipynbファイルを上書きする形になっています。

今回はdiffを取るだけで元のファイルは取っておきたいので、このGistをForkさせてもらって、outputなど削った.ipynbの内容を標準出力に出力するように `nbstripout` を変更し、あとは、

- [標準入力同士の diff](http://qiita.com/bsdhack/items/55d5eced2fb3e6625d74)

を参考に、その標準出力の内容を比較すればいいだろう・・・という感じ。


#後で気づく

http://nbdiff.org/ みたいなのもあるんですなあ・・・今度試してみたいなあ。
Coda2で「⌘ + /」でのコメント選択をブロックコメントから行コメントに変更する

## Coda2で「⌘ + /」でのコメント選択はブロックコメント

Coda2でのコメントアウトのショートカットは「⌘+/」ですが、デフォルトでは複数行をコメントアウトするときはブロックコメントになります。

```js
/*
   commented out
*/
```

ですがJSのドキュメントを作るときとかは多くの場合

```js
  /**
   *  @param hoge {Object} hoge object
   */
```

のようにブロックコメントにする必要があり、この部分をまたがってコメントアウトしようとすると当然"*/"の部分でコメントアウトが終わってしまいます。

```js
/*

  /**
   *
   *  @param hoge {Object} hoge object
   * 
   */
   // 以降がコメントアウトされない
   function foo( hoge ) {
     
   }
*/
```

これを"//"でコメントアウトするためには「⌘+option+/」で行コメントでコメントアウトする必要があります。ですが毎回毎回このショートカットをするのはとても面倒です。


## 環境設定でショートカットを変更

ということで環境設定でショートカットを変更します。環境設定の「Keyboard」から「Shortcuts」を選択して、左のメニューから「App Shortcuts」をクリックします。ここで「＋」をクリックして

- Application : Coda2.app
- Menu Title : Comment Selection by Line
- Keyboard Shortcut : （⌘+/を押す）

を登録、さらに

- Application : Coda2.app
- Menu Title : Comment Selection
- Keyboard Shortcut : （⌘＋option+/を押す）

を登録することでショートカットを入れ替えることができます。

![Screen Shot 2015-08-15 at 3.48.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30850/55c39c61-f94c-a5f0-04ff-da1237e104e0.png)


## Coda2を起動して確認

「Text」メニューでComment Selection by Lineに対して「⌘+/」のショートカットが割り当てられていれば成功です。あとは同じく「Text」メニューを開いた状態でオプションを押したときにComment Selectionに対して「⌘+option+/」が割り当てられているのも確認できると思います。

![Screen Shot 2015-08-15 at 3.49.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30850/e5c86481-2613-b0f3-54ed-b699ab9429db.png)

これで先ほどのコードブロックを「⌘+/」でコメントアウトしてみると

```js
//   /**
//    *
//    *  @param hoge {Object} hoge object
//    * 
//    */
//    function foo( hoge ) {
//      
//    }
```

のようになります。
Erlangのdialyzer使い方

Dialyzerは　Erlangコードベース内の型エラーの検知をする。Dialyzerの永続的探索表(PLT: Persistent Lookup Table)を作成します。

```
$ dialyzer --build_plt --apps erts kernel stdlib crypto mnesia sasl common_test eunit
```

必要であれば、sslやreltoolといったアプリケーションを--appsに続けて追加する事もできる

```
$ dialyzer --add_to_plt --apps ssl reltool
```

使うときに`dialyzer`の後ろにファイル名を追加するだけでいいです。

```
$ dialyzer binary_search.erl
  Checking whether the PLT /Users/wang/.dialyzer_plt is up-to-date... yes
  Proceeding with analysis... done in 0m0.56s
done (passed successfully)
```
C言語の引数の[]と*

先日、main関数のプロトタイプに、こんな書き方をしているコードを見つけておや？となった。

```c
int main(int argc, char **argv) {
/* ... */
}
```

確か教科書的には、main関数の引数はこうじゃなかったっけ？

```c
int main(int argc, char *argv[]) {
/* ... */
}
```

どちらでもコンパイルは通るみたい。

確かに、引数の中の`int argv[]` は、`int *argv`と同じように配列の先頭のアドレスが渡されてくるから、似たようなものということか。

個人的には、charポインタの配列が渡ってくるんですよーの意味を込めて、教科書通りの書き方のほうが読みやすいとは思う。
Ruby on RailsでAutoIncrementを使わずにシーケンスidをふる

## シーケンスのIDを自前でふる
Railsの場合、ActiveRecordを使って、AutoIncrementでidを発行しているのが一般的。
でも、自前でふりたい場合がある！
主な理由は、テーブルやデータベースを跨いで連番のidをふりたい場合などかなと思います。例えばシャーディングとか(Railsでシャーディングをサポートしていないけど)。
将来的に大量のレコードが出来て、構成を変える可能性がある場合にはあらかじめ自前でidをふっておくと良い事があるかもしれません。

## テーブル構成
シーケンスidを管理するテーブルと、シーケンスidを使うテーブルを作る。例として、userテーブルにuser_idをふるシステムを考える。

テーブル構造
userテーブルには、user_idとemail、暗号化したパスワードを入れる想定。
user_sequenceにidがどこまで進んだかを記録しておく。
シーケンスの処理は単純なのでトランザクションを考慮しない方がパフォーマンスが出るためMyISAMで。仮にinnodb側がrollbackしても発行されたidが使われないだけなので問題ない。

```
* user_sequence
CREATE TABLE `user_sequence` (
  `id` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

* user_auths
CREATE TABLE `user_auths` (
  `user_id` int(10) unsigned NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `encrypted_password` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
```

## モデルと処理

シーケンス管理側

```
"models/user_sequence.rb"

class UserSequence < ActiveRecord::Base
  self.table_name = :user_sequence
  self.primary_key = :id
end
```

ユーザーテーブル側

```
"models/user_auth.rb"

class UserAuth < ActiveRecord::Base
  before_save :set_user_id

  def set_user_id
    if self.user_id.blank?
      ActiveRecord::Base.uncached do
        UserSequence.connection.execute('UPDATE user_sequence SET id = LAST_INSERT_ID(id + 1)')
        user_id = UserSequence.find_by_sql('SELECT SQL_NO_CACHE LAST_INSERT_ID() AS id').first
        self.user_id = user_id['id']
      end
    end
  end
end
```
以下の動作によりシーケンステーブルに+1した後に、その値をuser_idとして利用している。

- before_saveのhookでset_user_idを呼び出す

- シーケンステーブルに今のID+1をINSERT

- user_idにINSERT後(+1された後の)のLAST_INSERT_ID()を入れる

呼び出し元はどこでも良いので、テーブル間でも一貫性の取れたシーケンスIDをふる事が出来る。

## まとめ
Rails的にはそもそもシャーディングしないっぽいのでそこまで必要無いのかなと思いつつも、将来的に非常に大きくなりそうなアプリの設計をしていたのでこんな感じで作ってみました。
FireLinkがFirefox40で動かない問題を修正した


Firefox40になって動かなくなった自作アドオンを修正しました。

2.3.1はただいまレビュー待ちですが`about:config`から`xpinstall.signatures.required`=falseにすれば先行インストールが可能です。

- [FireLinkがFirefox40で動かない問題を修正した - ブログのおんがえし](http://ongaeshi.hatenablog.com/entry/fix-firelink-for-firefox40)
- [FireLink - WebページのURLやタイトルを好きな形式でコピー](http://firelink.ongaeshi.me/ja/index.html)
vagrant upとsandbox onとteraterm loginを自動にするバッチ

##こんな人向け##
* vagrant up 毎回打つのイヤ
* sandbox on 忘れる
* teraterm 毎回起動が面倒だ


##バッチ内容##
以下のバッチファイルをVagrantfileのあるフォルダに置いておく

```vagrant_auto.bat
::仮想マシンのディレクトリ(Vagrantfileがあるところ)へ移動
::バッチファイルが上記にある場合はこのまま
cd .

::仮想マシンの起動
vagrant up

::sandboxの起動
vagrant sandbox on

::Teratermへ自動ログイン
::passwordでのログインの場合
cmd /k start "" "C:\Program Files (x86)\teraterm\ttermpro.exe" 192.168.33.10 /auth=password /user=vagrant /passwd=vagrant

::publickey(公開鍵認証)でのログインの場合
::cmd /k start "" "C:\Program Files (x86)\teraterm\ttermpro.exe" 192.168.33.10 /auth=publickey /user=vagrant /keyfile=秘密鍵のパス
```
####補足####
　teratermでログインするユーザはデフォルトのIP、vagrant、passwdの設定
　「/user=（ユーザ） /passwd=（パスワード）」を変更

##ちなみに##
`cmd /k コマンド`
最後のコマンドが終ってもコマンドプロンプトを閉じないように。

`start "オプション" コマンド パラメータ`
これを付けないとteraterm終了まで待ち合わせるので、コマンドプロンプトが使えない。

##〆に##
他に楽な方法があったら教えてください。
Mysqlでユニーク制約をつけたvarcharは767byteまでしか入らない話

laravelのmigrationを使って、下記のようなテーブルをつくろうとしていたが、
何度も、`SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes`というエラーが出た。

```php
 13     public function up()
 14     {
 15         Schema::create('site_list', function (Blueprint $table) {
 16             $table->engine = 'InnoDB';
 17 
 18             $table->increments('id');
 19             $table->string('name', 256);
 20             $table->string('url',  512)->unique();
 21             $table->timestamps();
 22         });
 23     }
```

### 何がダメか

Mysqlでユニーク制約をつけたカラムでは767byteまでしか入れられないようになっている。
私はurlカラムにユニーク制約をつけていたが、512バイトじゃないか！！

と思っていたが、MysqlのVarcharに指定する数値は、`バイト`じゃなく`文字数`なのである。
つまり、(今回はutf-8を使っていたので)1文字=3byte -> 512文字x3byte = 1536byte。
アウトーーーｗ

つまり、Varcharカラムにユニーク制約を付けたい場合は、255文字までしか入れれないのでありました。。

ただし、Mysql6以降ではutf8が4byteになるらしいので、255文字でもアウトになる。
その場しのぎ的に対応するのであれば、255文字でも良いが、本格的に対応するのには別の方法をとった方が良さそう。

だが、どうすれば良いかわからないので教えて偉いヒト・・・・
Mac 版 Kobito のローカル記事を Dropbox でバックアップする


先日、4 年間使った Macbook の電源が入らなくなり買い替えました。Time Machine でのバックアップは 2 ヶ月前のものだけ。だいたいのデータは Dropbox, iCould, Google, GitHub, Evernote など何かしらのクラウドサービスに入っていたのですが、Kobito のローカルのメモだけがバックアップされていませんでした。今日は Kobito のバックアップの設定をします。

[KobitoのファイルをDropboxで同期とる(Kobito2.2.0)](http://qiita.com/koyopro/items/2122b6d9d20d578c85f2) を見ると、記事の入ったデータファイルを Dropbox 配下にハードリンクすれば良いとのこと。ただ、ファイル一個一個ハードリンクするのは面倒だし、ファイル名が変わったら動かなくなるのでディレクトリごとハードリンクすることにしました。Mac ではディレクトリにハードリンクするコマンドは用意されていません。

[selkhateeb/hardlink](https://github.com/selkhateeb/hardlink) というツールがあったので Homebrew で入れてみます。（ディレクトリのハードリンクは、循環参照する可能性があるので、注意しましょう！）

```
$ brew install hardlink-osx
==> Downloading https://homebrew.bintray.com/bottles/hardlink-osx-0.1.1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring hardlink-osx-0.1.1.yosemite.bottle.tar.gz
==> Caveats
Hardlinks can not be created under the same directory root. If you try to
`hln source directory` to target directory under the same root you will get an error!

Also, remember the binary is named `hln` due to a naming conflict.
==> Summary
🍺  /usr/local/Cellar/hardlink-osx/0.1.1: 3 files, 20K
```

こんな感じでできました。

```
$ cd ~/Dropbox
$ hln ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito Kobito
```

ハードリンクについてよく知らなかったので調べたのですが、普通のファイルもハードリンクなんですね。Dropbox からしたら普通のディレクトリと変わりないので、バックアップもできるわけですね。
登録画面と編集画面で共通のviewを使用する時に、ボタンのラベルとかをアクションに応じて出し分けする

```ja.yml
ja:
  action:
    new: '登録'
    edit: '編集'
```

```new.html.erb
<%= render 'form' %>
```

```edit.html.erb
<%= render 'form' %>
```


```form.html.erb
<%= t "action.#{controller.action_name}" %>
<%# アクションがnewの時は「登録」、editの時は「編集」が出力される %>
```

provideメソッドやlazy lookupを使うよりこっちの方がすっきり書ける。
書いてて思ったけど、共通画面に限らず一律これにすればコピペが捗るかも?

```show.html.erb
<%= t "action.show" %>
↓
<%= t "action.#{controller.action_name}" %>
```

```index.html.erb
<%= t "action.index" %>
↓
<%= t "action.#{controller.action_name}" %>
```
こわくないScala vol.5 今日のランチbotを作ってみる

いきなりvol.5ですがそれ以前は
http://fscoward.hateblo.jp/
にあります。

# 作るもの
今日のごはんbot(Slack)

Slackのgeneralチャンネルで「ランチ」と発言するとランチを返してくれるbotを作成します。

![general___Sphere_s_Orbit_Slack.png](https://qiita-image-store.s3.amazonaws.com/0/39243/d6470f9c-2b37-b8b5-ecb7-37b3139b1209.png)

# Applicationの登録
https://api.slack.com/applications

# tokenの発行
https://api.slack.com/web
の下の方にトークン発行ボタンがあるので、tokenの発行をしましょう。

# 準備
## Intellij IDEAを使用して空プロジェクト作成
![スクリーンショット 2015-08-15 12.27.23.png](https://qiita-image-store.s3.amazonaws.com/0/39243/79c76ab6-4f5b-7c13-6906-d011ee06fb90.png)

![スクリーンショット_2015-08-15_12_30_24.png](https://qiita-image-store.s3.amazonaws.com/0/39243/5ee5aac1-3699-c3cf-eeab-92533cb9a60f.png)

## ライブラリを使用
https://github.com/gilbertw1/slack-scala-client

```build.sbt
name := "lunch_bot"

version := "1.0"

scalaVersion := "2.11.7"
    
libraryDependencies ++= Seq(
  "com.github.gilbertw1" %% "slack-scala-client" % "0.1.2"
  ,"com.h2database" % "h2" % "1.4.188"
)
```

h2-databaseはとりあえず使おうかなぁって感じでいれています。
やっぱいいやってなったら後で外します。

# 作成
## 空のMainを作成
※他のファイル、フォルダは一旦無視してください。
![Main_scala_-__lunch_bot__-_lunch_bot_-____Dropbox_lunch_bot_.png](https://qiita-image-store.s3.amazonaws.com/0/39243/6130f10a-d5e1-aaab-3bdb-c7fb67fa226c.png)

```scala:Main.scala
/**
 * Created by FScoward on 15/08/12.
 */
object Main extends App {

}
```

## 出来上がったものがこちらです。
![Main_scala_-__lunch_bot__-_lunch_bot_-____Dropbox_lunch_bot_2.png](https://qiita-image-store.s3.amazonaws.com/0/39243/f53c2374-a538-dad6-dc05-27bb8e41c3c0.png)

## Regexについて

```scala:Regex.scala
package util

import scala.util.matching.Regex

/**
 * Created by FScoward on 15/08/14.
 */
object Regex {
  val REGISTER: Regex = """(reg:.*)""".r
  val VOTE: Regex = """(vote:.*)""".r
}
```

ここ作ってる時に最初は括弧でくくらずに

```scala
val REGISTER: Regex = """reg:.*""".r
```

ってやってたんだけどどうやら括弧でくくってやる必要があるらしいです。

## ランチを返してもらうための仕組み作り

```scala:LunchService
package service

import scala.util.Random

/**
 * Created by FScoward on 15/08/15.
 */
trait LunchService {
  val list: List[String] = List("弁当", "大戸屋")
  def search(user: String): String = {
    val r = new Random().nextInt(list.length)
    s"@$user ${list(r)}"
  }
}
object LunchService extends LunchService {}
```

今は「弁当」か「大戸屋」の二者択一です。
まるで役に立ちません。

ここを作りこんでいく必要があります。

# ソースコード
https://github.com/FScoward/lunch_bot

途中から説明がめんどくさくなってだいぶ端折ってしまいました。
わからない部分は聞いてください。
答えられるものであれば回答します。
localhost に VirtualHost Ports 増設


## ポート番号とは

local の Apache環境 にrootをたくさん作りたい場合、portによって増設する方法があります

通常以下のURLでアクセスしている場合

    http://localhost/

デフォルト設定では以下と同義になります。デフォルトのポート番号は80番であるという意味です

    http://localhost:80/

ポート番号とはマシンやプログラムが通信相手を特定する識別子の１つです

この機能を利用して、ローカルプレビュー環境を増設したいときに例えば以下のようにブラウズできるような増設の方法があります

    http://localhost:8000/
    http://localhost:8001/
    http://localhost:8002/
    http://localhost:8003/
    http://localhost:8004/
    ・
    ・
    ・

Webテストアクセスのポート番号には、httpプロトコルのポートである80番を連想させる意味合いからか、8000番周辺を利用する事例を多く見かけるため、ここでは8000番台を例にします

これを設定するには、Apacheが参照している設定ファイルの１つである httpd.conf に追記します
Mac OS Xの httpd.conf はデフォルトでは以下に格納されています

    /private/etc/apache2

※ httpd-vhosts.conf を設定する方法もありますがここでは httpd.conf を利用します

　


## 認証の解除

環境にもよりますが、 `Require all denied` により認証が閉じている場合があります

    <Directory />
        AllowOverride none
        Require all denied
    </Directory>

ローカルプレビュー環境において特に認証が必要ない場合にはこれをコメントアウトしておきます

    <Directory />
        AllowOverride none
    #    Require all denied
    </Directory>


## VirtualHost Portsをhttpd.confに設定する方法

httpd.conf の末尾に以下をペーストします

    Listen 8000
    <VirtualHost *:8000>
        DocumentRoot "/www"
        ServerName localhost
    </VirtualHost>

    Listen 8001
    <VirtualHost *:8001>
        DocumentRoot "/test"
        ServerName localhost
    </VirtualHost>

    Listen 8002
    <VirtualHost *:8002>
        DocumentRoot "/www/project01"
        ServerName localhost
    </VirtualHost>

    Listen 8003
    <VirtualHost *:8003>
        DocumentRoot "/www/project01/test02"
        ServerName localhost
    </VirtualHost>
    ・
    ・
    ・


Apache をリスタートする必要があります

    sudo apachectl restart


以上で http://localhost:8000/ などがブラウズ可能になります
snippet: postfix

## main.cf (DietPi用)

```diff:/etc/postfix/main.cf
-myhostname = dietpi
+myhostname = myhome.com
 alias_maps = hash:/etc/aliases
 alias_database = hash:/etc/aliases
 myorigin = /etc/mailname
 mydestination = myhome.com, dietpi, localhost.localdomain, localhost
-relayhost = 
-mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
+relayhost = relay.provider.or.jp
+mynetworks = 127.0.0.0/8 192.168.10.0/24
 mailbox_size_limit = 0
 recipient_delimiter = +
 inet_interfaces = all
+inet_protocols = ipv4
```

* [postfix - Maildir形式で運用する2つの方法 - Qiita](http://qiita.com/tukiyo3/items/f791cff77685a6487fe4)
* [postfix - 複数relayhost、transport、relayhost+SMTP認証、virtual_mailbox - Qiita](http://qiita.com/tukiyo3/items/a0b12f43f4b4adbbab81)

## op25b

relayhostを設定する場合は
`dpkg-reconfigure postfix`でサテライトシステムを選択しておく。
ローカルのみ にしていた場合送信できないため注意

```diff:/etc/postfix/main.cf
-default_transport = error
-relay_transport = error
+default_transport = smtp
+relay_transport = smtp
```

![サテライト.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f31f380f-e7c3-52e3-8eb8-4cf6451eb826.png)

### plala

* [〔サブミッションポート（port587）とSMTP AUTH〕の標準提供と〔Outbound Port 25 Blocking〕の適用拡大について｜ぷららのメールについて｜ぷらら](http://www.plala.or.jp/support/manual/mail/plala_mail/submission/)

```bash:/etc/postfix/main.cf
relayhost = mmr.plala.or.jp
```

```diff:/etc/postfix/master.cf
- #submission inet n       -       y       -       -       smtpd
+ submission inet n       -       y       -       -       smtpd
```

* 587ポートを開放

### megaegg

```bash:
relayhost = [ms2.megaegg.ne.jp]:25
```

`ms1.megaegg.ne.jp` 〜 `ms14.megaegg.ne.jp` まである様子

## excite

* exciteは無料でメールサーバを設置することは不可能っぽい
素数リストを生成する（Erlang)

素数リストを生成する

考え方はすでに素数と判定されたら、リストに入れる。(PS: Prime List)
素数の判定は：リストに入っている素数すべてに割り切れない時にこの数字の素数です。
奇数だけを判定します。

```
#!/usr/bin/env escript

main(_) ->
    Res = prime_list(1000).
    %% io:format("~p~n", [length(Res)]).

prime_list(Num)->
    prime_list(Num, 3, [2]).

prime_list(Num, PP, PS) when PP >= Num ->
    lists:reverse(PS);
prime_list(Num, PP, PS) when PP < Num ->
    IsPrime = lists:any(fun(X) -> PP rem X =:= 0 end, PS),
    case IsPrime of
        true   -> prime_list(Num, PP+2, PS);
        false    -> prime_list(Num, PP+2, [PP|PS])
    end.
```
メソッドの呼び出し



##メソッドの呼び出し

単純なメソッド呼び出しの構文

```
オブジェクト.メソッド名(引数1, 引数2, ,,,,引数n)

```

引数に関するルール
引数の数と順番はメソッドごとに決められているので、ルールに合わせて指定する

オブジェクトに関して
上記のオブジェクトは「レシーバ(receiver)」とも呼ばれます。
オブジェクト指向の世界では、メソッドを実行することを「オブジェクトにメッセージを送る」と考え、その結果として「オブジェクトはメッセージを受け取る(receiveする)」と定義するからです。

まとめ

オブジェクトに対して、いくつかのパラメータとともにメッセージが送られるというイメージです。
メソッドの引数がパラメータに相当します。



具体例が欲しいね。。。
Virtualboxに作成したCentOS7.0へssh接続

#目的
VirtualBoxにインストールしたCentOS7をホストOSと同じネットワークに所属させて、ssh接続する
#環境
* ホストOS：ubuntu14.04LTS
* Virtualbox:version 5.0.2
* ゲストOS：CentOS Linux release 7.1.1503

#設定
* VbへのCentOSインストールは省略。

##ブリッジ接続


![bridge.jpg](https://qiita-image-store.s3.amazonaws.com/0/58788/1df87788-9e00-b767-10ca-ff5c18aea48a.jpeg)
<hr>

* ホストOS

```
$ ip a
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 20:cf:30:26:dd:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.6/24 brd 192.168.0.255 scope global eth1
```

* ゲストOS

```
$ ip a
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:87:9a:cb brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.5/24 brd 192.168.0.255 scope global dynamic enp0s8
```

##FW
* ゲストOSの22ポートを開放する

defaultzoneの確認

```etc/firewalld/firewalld.conf
# firewalld config file

# default zone
# The default zone used if an empty zone string is used.
# Default: public
DefaultZone=public

# Minimal mark
# Marks up to this minimum are free for use for example in the direct 
# interface. If more free marks are needed, increase the minimum
# Default: 100
MinimalMark=100

# Clean up on exit
# If set to no or false the firewall configuration will not get cleaned up
# on exit or stop of firewalld
# Default: yes
CleanupOnExit=yes

# Lockdown
# If set to enabled, firewall changes with the D-Bus interface will be limited
# to applications that are listed in the lockdown whitelist.
# The lockdown whitelist file is lockdown-whitelist.xml
# Default: no
Lockdown=no

# IPv6_rpfilter
# Performs a reverse path filter test on a packet for IPv6. If a reply to the
# packet would be sent via the same interface that the packet arrived on, the 
# packet will match and be accepted, otherwise dropped.
# The rp_filter for IPv4 is controlled using sysctl.
# Default: yes
IPv6_rpfilter=yes
```

* Port22を開放

`$ firewall-cmd --zone=public --permanent --add-port=22/tcp`

* 確認

```
$ firewall-cmd --zone=public --query-port=22/tcp
yes
```

* サービス有効化を確認しておく

```
$ systemctl list-unit-files | grep firewalld
firewalld.service                           enabled 
$ systemctl list-unit-files | grep sshd
sshd-keygen.service                         static  
sshd.service                                enabled 
sshd@.service                               static  
sshd.socket                                 disabled
```

## 接続

```
$ hoge@work:~⟫ ssh hoge@192.168.0.5
hoge@192.168.0.5's password: 
Last login: Sat Aug 15 11:10:13 2015 from 192.168.0.6
[hoge@localhost ~]$ 
```
delegate で unexpectedly found nil while unwrapping an optional value が出る時


取り急ぎメモ代わりに。

以下のようにdelegateを実装して実行しようとするとエラーが発生し足踏みしていた

```
protocol CalendarViewDelegate {
    func tapDay(dayText: NSString)
}



// とあるメソッドの中身の以下の行でエラー
self.delegate.tapDay("aaaaa")

```
エラーメッセージ

>unexpectedly found nil while unwrapping an optional value

解決策はシンプルで

```
self.delegate?.tapDay("aaaaa")

```

とすれば良い。引数がない場合は?が要らないし、こういう場合はXCodeがコンパイル前にワーニングなりエラーにしてくれたりするから全然分からなかった。
ErlangのBinary Search


```
-module(binary_search).
-export([binary_search/2]).

%% > c(binary_search).
%% 5> binary_search:binary_search([], -1).
%% -1
%% 6> binary_search:binary_search([], 0).
%% -1
%% 7> binary_search:binary_search(lists:seq(3,100000),6 ).
%% 4
%% 8> binary_search:binary_search(lists:seq(3,100000),3 ).
%% 1

%% ソートされているリストの中にNを探す
binary_search(List, N) ->
  binary_search(List, N, 1, length(List), List).

%% _Listは今から処理するリスト
%% _OriListは変わらない、ずっと最初と同じリスト
%% 見つからなかったら、-1を返す

binary_search(_List, _N, Left, Right, _OriList ) when Left > Right ->
    -1; 
binary_search(_List, N, Left, Right, OriList ) when Left =< Right ->

  Middle = (Left + Right) div 2, 

  %% OriListを使って、リストの要素を特定している
  Item = lists:nth(Middle, OriList),

  case Item of
    N -> Middle; %% 見つかったら、ここでIndexを返す
    _ -> 
　　　 case Item > N of
        true  -> binary_search(lists:sublist(OriList, Middle -1), N, Left, Middle-1,  OriList); %% left
        false -> binary_search(lists:nthtail(Middle, OriList), N, Middle+1, Right , OriList)  %% right
      end
  end.
```
第6章　条件判断　楽しいRuby



条件判断

制御構造のひとつである「条件判断」について

- 条件判断文に欠かせない要素
・比較演算子
・真偽値
・論理演算子

ある条件のときにはooをという処理を、そうでないときにはxxという処理をさせたいといったときのために用意されているのが条件判断文です。

そして条件判断文には、大きく3つがあります。
・if文
・unless文
・case文

こんなプログラムがあったとします。

入力された年の単位を西暦から平成に変換するプログラムを書くとします。
この場合、入力された文字列を数値に変換し、1988を引いた値を表示することになります。


```

ad = ARGV[0].to_i
heisei = ad - 1988
puts heisei

#=>ruby heiseiwants.rb 2015

 27 

```

こんな感じです

しかし、このプログラムにはちょっと問題があります。
それは1988年以前を入力すると返す値が0もしくは、マイナスになってしまう点です。

もっとも、1988年以前は平成に換算できないのですからこのような入力を受け付けてしまうことがおかしいわけです。
1988以下の数値を入力された場合は変換できない処理をしなければならない、という課題が見えてきます。

この課題を解決するために、条件判断が必要になるのです。



##　Rubyでの条件

条件と真偽値
条件判断によく使われるものとして、「比較演算子」があります。
等号 「== 」や不等号「<」「>」のことです。

比較演算の結果は、正しい時がtrue,まちがっている時がfalseです。

ですが

比較演算子以外でも、条件を表すメソッドがたくさんあります。
たとえば文字列クラスの「empty?メソッド」です
このメソッドはその文字列の長さが0の時にtrueをそうでないときはfalseを返します。

この0のときにtrueを返すのが面白いですね。



Rubyの真偽値

真　falseとnil以外のすべてのオブジェクト
偽　falseとnil


#論理演算子


「&&」 「||」は複数の条件を一つにまとめるときに使います。

条件1 && 条件2
は条件1と2がどちらも真なら真、となり、どちらか一方が偽であった場合は全体も偽になります。

条件1 || 条件2
は条件1と2のいずれか一方が真なら、全体も真になります。

また否定の論理演算子 
!条件
は条件を反転させます。つまり、条件が「偽」である場合は「真」になり、
「真」である場合は「偽」になります。



# if文に関して
if文はもっとも基本的な条件判断文です。


#　unless文
if文とは反対の役割をする条件判断文です。
unless文は条件が偽のときに文を実行します。

基本形

unless 条件 then
 文
 end
 
 
 #case文
 条件がいくつもある場合、ifとelsifの組み合わせでそれぞれの条件を書いていくこともできますが、比較したいオブジェクトが一つだけで、そのオブジェクトの値によって　場合分けした場合は「case文」を使ったほうがシンプルでわかりやすいです。
 
 

#繰り返しの制御

繰り返しの途中で、処理を中断したり次の回に処理を飛ばしたいことがあります。
Rubyには繰り返しを制御する3つの命令があります。

・break 繰り返しを中断し、繰り返しの中から抜ける
・next 次の回の繰り返しに処理を移す
・redo 同じ条件で繰り返しをやり直す.結果redoが処理をした条件は表示されない


まとめ

timesメソッド　回数の指定された繰り返しに便利
for文 オブジェクトから要素を取り出す時
while文 条件を自由に指定したい時
until文 while文ではわかりにくい指定をしたい場合
eachメソッド　オブジェクトから要素を取り出す場合
loopメソッド 回数制限のない繰り返しに便利
【Riot.js】タグ間で動作を連動させる

Riot.jsでは各タグ内で様々な挙動を実装していくのですが、タグ間で動作を連携させたいときもあります。
そういった場合はobservableを使うとスムーズになります。

まず適当にタグをいくつか用意して、あるタグから他のタグへ何かしらの通知をしてみたいと思います。
[動作サンプル](https://jsfiddle.net/La6fza1e/) (JSFiddle向けに少し記述を変更しています)

呼び出し元となるhtmlが次のようになります。

```
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Riot.js</title>
</head>
<body>
  <foo></foo>
  <bar></bar>
  <baz></baz>

  <script src="https://cdn.jsdelivr.net/riot/2.2/riot.min.js"></script>
  <script src="foo.js"></script>
  <script src="bar.js"></script>
  <script src="baz.js"></script>
  <script>
    var obs = riot.observable();
    riot.mount("foo");
    riot.mount("bar");
    riot.mount("baz");
  </script>
</body>
</html>
```

タグはgulpにて既に変換されたものを利用しています。
ここで

```
var obs = riot.observable();
```

というようにriotの機能であるobservableを全体のスコープで設定しています。
そして、通知を送る側のタグは次のようになっています。

```
<foo>
  <input type="text" oninput={onInput}>
  <script>
    this.onInput = function(e) {
      var text = e.target.value;
      obs.trigger("myEvent", text);
    };
  </script>
</foo>
```

inputによる入力イベントで入力された文字列を取得し、triggerによりイベントを発火、文字列も送り出しています。
最後に、通知を受け取るタグは次のようになります。

```
<bar>
  <input type="text" name="hoge">
  <script>
    var that = this;
    obs.on("myEvent", function(text) {
      that.hoge.value = text;
      that.update();
    });
  </script>
</bar>
```

```
<baz>
  <p>{textLength}</p>
  <script>
    var that = this;
    this.textLength = 0;
    obs.on("myEvent", function(text) {
      that.textLength = text.length;
      that.update();
    });
  </script>
</baz>
```

それぞれonによって任意のイベントをキャッチし、渡ってきたデータを基に処理を連動させています。
実際にはあるタグの中でobservableを定義し、mixinで他のタグに渡すのが良いのかなと思います。
データベースクラスを作成するぞ - vol.2

#まえがき
あーなるほど。
追記編集するのが面倒なので
順番に投稿しよう。そうしよう。

…というわけで、
データベースクラスの再開。

色々と試行錯誤を重ねてはいるものの、
意味がわからなくなり、プチパニック…。

とりあえず、発行したいsql文が似ているから
やりやすいだろう…という安易な考えで、
以下の2つの処理をどうにかできないかと。

```php:
public function select($テーブル名とか) {
    発行したいsql文 = "SELECT * FROM `テーブル名` WHERE `条件`"
}

public function delete($テーブル名とか) {
    発行したいsql文 = "DELETE FROM `テーブル名` WHERE `条件`"
}

// 2つのsql文は似ている?!ww
sql文 = select('SELECT * FROM', 'テーブル名', '条件');
sql文 = delete('DELETE FROM', 'テーブル名', '条件');
```

#考察
ここから、別のfunctionに飛ばして
晴れてsql文を実行できる、という形が良いのかな。

ただ、ここでちょっと悩んでいるのが **'条件'** の部分。

おそらく、配列をうまく利用するんだろうけど。
例えば『会員番号2015番の人を削除』ならば、

```php:
sql文 = delete("DELETE FROM 'テーブル名', '会員番号' = '2015'");
```

という感じで使いたい。ここまではOK。

でも、例えば『スコアが60点以下の人を全削除』なら、

```php:
sql文 = delete("DELETE FROM 'テーブル名', 'スコア' <= '60'");
```

と、なる。もちろん意味は分かる。

ただ、ここで問題…というか悩む。
比較演算子 ( '='とか '<='とか ) が
変わってしまう、ということ。

「なら配列に一緒に入れちゃえ!」ってことですが、
それじゃあ**比較しない**の場合、どーすんのよ…と。

んー飛ばしたfunctionの先で、
ifやらswitchで分岐させるのか。

つーことは…？

メインとなるfunctionに行くときに、持って行って
ついでにSELECTかDELETEか、も一緒に持っていく、と。
で…良いよね？

```php:
public function mainAction($action, $table, $where = array()) {
    // 渡ってきた$whereを分解するごにょごにょ
    // 最終的に、
    // $sql文 = "$action FROM $table WHERE $where"
    // みたいな感じにする。
}
public function SELECT($table, $where) {
    $this->mainAction('SELECT *', $table, $where);
}
public function DELETE($table, $where) {
    $this->mainAction('DELETE', $table, $where);
}
```

感じで言えば、こんな感じだよね。…たぶん。
とりあえず、続きはあとで考える。

#あとがき
問題は、"比較する場合" or "比較しない場合" を
どーすっかねー。
[JS] JavaScriptでIPアドレス計算をしたい！！

経緯としては、アクセス制御を行いたいわけです。
クライアントサイドで。
何言ってるの？と思う方もいらっしゃるでしょうが、ちょっと必要に駆られたのです。
仕方ないことなのです。
要件定義はいつも無情です。
（何度も言うようですが、仕事としてコードを書いてるわけではありません。悪しからず。）

## IPアドレスとバイナリー
IPアドレスはそもそも2進数なのでパソコンに云わせればそちらのほうが扱いが長けています。
当然ですね。

というわけでそんなコードを書いた人がいるにはいますが残念ながらNode.jsの方です。
[npm - ip](https://www.npmjs.com/package/ip)

私が言うのもなんですが、よく出来てますね。
クライアントサイド側にリコーディングできなくはないのでしょうが、時間がかかりますね。

次のアプローチとしてはphpで云うところのip2longとlong2ip的な関数があればなんとかjsでも書けるのではないかと思いました。

そんなわけで色々探してみると、あるもんですね。
[php.js](http://phpjs.org/)

なんかすごそうなライブラリーですね。
この中のネットワークの実装の中にip2longとlong2ipのラッパー関数が存在します。
[ip2long](https://github.com/kvz/phpjs/blob/94f9f969017f17d02bb761af26931e5c23e0dbf6/functions/network/ip2long.js)
[long2ip](https://github.com/kvz/phpjs/blob/94f9f969017f17d02bb761af26931e5c23e0dbf6/functions/network/long2ip.js)

この2つを使わせていただきましょう。
これで準備は完了です。

## 分かるものが分かればなんとかなる
アクセスしてきたIPアドレスのネットワークアドレスとブロードキャストアドレスがわかれば、許可している範囲内かどうかわかるのでその線でいきましょう。

```js:network.js
var ip = '192.168.0.76';
var netmask = '255.255.255.248';

function nwAddress(ip, netmask) {
    return long2ip(ip2long(ip) & ip2long(netmask));
}
// '192.168.0.72'

function bcAddress(ip, netmask) {
    return long2ip(ip2long(ip) | (ip2long(netmask) ^ ip2long('255.255.255.255')));
}
// '192.168.0.79'

```

ネットワークアドレスとブロードキャストアドレスがわかれば、サブネットマスクから注目すべきオクテットを割り出し、後はintに直して大小比較でいけそうですね。

計算部分に関しては書籍を読みあさってみてください。
IPアドレスはAND、OR、XOR、NOTであれやこれやすると面白いことになります。

今回は短めです。
ちなみに、PHPでやったほうが普通はいいと思います。

## 追記

>ネットワークアドレスとブロードキャストアドレスがわかれば、サブネットマスクから注目すべきオクテットを割り出し、後はintに直して大小比較でいけそうですね。

などと書いたのですが、XORで検算して判定すればいいじゃんと友人に言われて、まぁそうだよねとなったので追記。

```js:network.js
//ipとnetmaskは上記と同じです。

function ipControll(check_ip) {
    
    if (check_ip !== long2ip(ip2long(check_ip))) {
        check_ip =  '0.0.0.0'
    }
    
    var nw_ip = ip2long(nwAddress(ip, netmask))
    var check_ip_long = ip2long(check_ip)
    
    if (nw_ip ^ check_ip_long === 0) {
        return true
    } else {
        return false
    }
}

```

こんな感じですかね。
git でアンステージするコマンドは $ git reset

`$ git reset`

で可能。

`$ git reset <file>`

でファイル単位で可能。

「git アンステージ」でググったら、数種類の説明があって手間取った。
だがチュートリアルに正しい説明があった！

>`git reset <file>`
>
>作業ディレクトリに何の変更も加えずに、指定したファイルをステージングエリアから削除するコマンドです。このコマンドを実行すると、変更を書き込むことなく指定したファイルをアンステージします。
>
>`git reset`
>
>作業ディレクトリに何の変更も加えることなくステージエリアをリセットして直前のコミット時の状態と一致させるコマンドです。このコマンドを実行すると、変更を書き込むことなくすべてのファイルをアンステージし、一度ステージされたスナップショットを初めから再構築することができるようになります。

https://www.atlassian.com/ja/git/tutorial/undoing-changes#!reset

**git reset はそもそもが、アンステージするためのコマンドだったのだ！**

（オプションを付けて、他のシチュエーションで使うことが多いので気付かなかった）








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
JSONをRuby,Python,JavaScript,PHPで扱う方法

Python, Ruby, JavaScript,PHPで、JSONのエンコードとデコードの方法について確認してました。


# Pythonの場合

```lang:test_json.py
#!/usr/bin/env python                                                           
# -*- coding:utf-8 -*-                                                          
#                                                                               
import json

# 辞書形式のデータ
dic1 = {"key1": None, "key2": None}
dic1["key1"] = 24
dic1["key2"] = 45
print dic1

# 辞書形式からJSONに変換
json_data1 = json.dumps(dic1, sort_keys=True,indent=4)
print json_data1

json_data2 = json.dumps(dic1,sort_keys=True)
print json_data2

json_data3 = json.dumps(dic1)
print json_data3

dic2 = json.loads(json_data1)
print dic2

# JSONから辞書形式に再変換
dic2 = json.loads(json_data2)
print dic2

dic2 = json.loads(json_data3)
print dic2

# 要素の再確認
print dic2["key1"]
print dic2["key2"]
```


```lang:実行結果
$ ./test_json.py
{'key2': 45, 'key1': 24}
{
    "key1": 24, 
    "key2": 45
}
{"key1": 24, "key2": 45}
{"key2": 45, "key1": 24}
{u'key2': 45, u'key1': 24}
{u'key2': 45, u'key1': 24}
{u'key2': 45, u'key1': 24}
24
45
```

# Rubyの場合

```lang:test_json.rb
#!/usr/bin/env ruby                                                             
# -*- coding:utf-8 -*-                                                          
#                                                                               
require 'json'

# ハッシュ形式データ
h = {"key1" => 10, "key2" => 40, "key3" => "Window10"}
p h
p h["key1"]
p h["key2"]
p h["Windows10"]

# ハッシュからJSON形式へ変換
j = JSON.generate(h)
p j

# JSONからハッシュへ変換
x = JSON.parse(j)
p x
```

```lang:実行結果
$ ./test_json.rb
{"temp"=>10, "humid"=>40, "pos"=>"window"}
10
40
"window"
"{\"temp\":10,\"humid\":40,\"pos\":\"window\"}"
{"temp"=>10, "humid"=>40, "pos"=>"window"}
```



# JavaScriptの場合

コマンドラインから実行できるスクリプトです。
 
```lang:test_json.js
#!/usr/bin/env nodejs
//
var sys = require('util');

// 連想配列
var d = { key1: 24 , key2: 45 , key3: "Windows10"}; 
sys.print(d['key1']+"\n")
sys.print(d['key2']+"\n")
sys.print(d['key3']+"\n")

// 連想配列からJSON形式へ
var json_text = JSON.stringify(d);
sys.print(json_text + "\n")

// JSON形式から連想配列のオブジェクトに戻す
var obj = JSON.parse(json_text)
sys.print(obj['key1']+"\n")
sys.print(obj['key2']+"\n")
sys.print(obj['key3']+"\n")
```

```lang:実行結果
$ ./test_json.js
24
45
Windows10
{"key1":24,"key2":45,"key3":"Windows10"}
24
45
Windows10
```

#PHP5の場合
```lang:test_json.php
#!/usr/bin/env php5
<?PHP

/* 連想配列 */
$arr = array('key1' => 24, 'key2' =>45, 'key3' => 'windows');
print "{$arr['key1']}\n";
print "{$arr['key2']}\n";
print "{$arr['key3']}\n";

/* JSON形式のテキストに変換 */
$json_text = json_encode($arr);
print "{$json_text}\n";

/* 連想配列に変換 */
$obj = json_decode($json_text);
print "{$obj->{'key1'}}\n";
print "{$obj->{'key2'}}\n";
print "{$obj->{'key3'}}\n";

?>
```

```lang:実行結果
$ ./test_json.php 
24
45
windows
{"key1":24,"key2":45,"key3":"windows"}
24
45
windows
```