OmniAICreator/Qiita-1.07M huggingface dataset:
9/2　今日の学習内容～HTTPの基礎を学習～

###今日の学習内容
***
今日は[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)を読みながら、**HTTP**の基礎について学習していきました。

####HTTPとは
***
まず、**HTTP**とは何なのか？というところから始めました。
「Hyper Text Transfer Protocolの略称で、インターネットで通信するときに使うプロトコル」といったくらいしか知りませんでしたので、この際どんなものなのか確認しておくことにしました(-ω-)/

>HTTP（Hyper Text Transfer Protocol）は、ブラウザーとサーバーがHTMLや画像などの情報をやり取りするときに使われるプロトコル（通信手段）です。
[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)より引用

　
> 基本的には普通のテキストデータを使い、 ブラウザなどのクライアントがWebサーバに対してget、putといったコマンドを送ると、 それに応じた結果がサーバから送られてきます。
（中略）
原則としてステートレス(= stateless 前回の状態は非保持の意)、 つまり1回コマンドを送ったら1回結果が返ってきてそれで終わり、ということが挙げられます。
[インターネット用語１分解説　HTTPとは](https://www.nic.ad.jp/ja/basics/terms/http.html)より引用

なるほど、**HTTPはブラウザとサーバー間での通信手段で、要求に対して応答を返す**といった感じでしょうかね(´-ω-`)

####リクエストとレスポンス
***
HTTPは単純です(^^)/　
ブラウザがサーバーにリクエスト（要求）をするとそれに対してレスポンス（応答）を返します。

![HTTP.png](https://qiita-image-store.s3.amazonaws.com/0/137880/cdc93cd2-32a4-3a1f-2553-0f512a080d33.png)

####URL
***
ブラウザーはURLを解析してサーバーにリクエストを送ります。URLはいくつかのパーツに分かれているようなので、私が昨日書いた記事のURLを参考にして説明していきます。

　
昨日書いた記事のURL↓
``http://qiita.com/shouxuohs/items/d0cb75c7cab47712e7f7``

まず、``html:``の部分ですね。
これは**スキーム**といって、HTTPやFTPなどの**プロトコルの種類**を表しているものです(-ω-)/

　
次に、``qiita.com``の部分です。
こちらは**サーバー名**を表しています。

　
続いて``shouxuohs/items/d0cb75c7cab47712e7f7``の部分ですね。
``shouxuohs``というユーザの``items``の中にある``d0cb75c7cab47712e7f7``というファイルまでの**パス名**となっています。

　
いつも何気なくURLを見ていましたが、何を表しているのかが分かると、ついつい見てしまうようになるかもしれないですね(笑)(@_@。

　
ふつうのウェブサーバーは``/index.html``を要求されると``index.html``を返します。しかし、[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)によると、Railsはパスとファイルが対応しておらず、RailsはURLにあるパスとクエリーを解釈してコントローラのアクションを呼び出し、レンダリングした結果をブラウザーに返す、といった流れになるそうです(@_@。
うーん、難しい...(;´д｀)


###あとがき
***
今日はHTTPについて学習しました。
HTTPについて、そこまで知らなかったのでいい機会だったと思います。（ITパスポートのときはあまりやらなかったので...）
ここのところ朝起きるのが遅くなった気がするので、ちゃんと早起きして学習を進めていきたいと思います(笑)

ここまで読んで下さり、ありがとうございましたm(__)m
　
###参考にさせていただいたサイトなど
***
- [改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)
- [インターネット用語１分解説　HTTPとは](https://www.nic.ad.jp/ja/basics/terms/http.html)
- [図解で学ぶネットワークの基礎：HTTP編  Lesson2：リクエストとレスポンスを繰り返し，必要なコンテンツを持ってくる](http://itpro.nikkeibp.co.jp/article/COLUMN/20071102/286311/)←分かりやすかったのでぜひ読んでいただければと思います。
Matlabがフリーズする

Matlabを起動したとき、なんの操作もしていないのに読み込みが終わらずフリーズしてしまうという事態にこのところ悩まされていました。
何度かアンインストールと再インストールを繰り返してみたり、

<https://jp.mathworks.com/matlabcentral/answers/97019-matlab-busy-initializing>

ここにある対処法を試してみたのですがどれもうまくいかず、
さらにぐぐってみたところ、英語の方だと同じような事態になっている人がしつもんしていました。

<https://jp.mathworks.com/matlabcentral/answers/262442-java-heap-space-out-of-memory-problem>

ここに書かれている手順を試したところ問題が解決しましたのでメモしておきます。

## **手順**

Matlabを起動したら、**設定 > 一般 > ソース管理** で、ソース管理のところを **なし** に設定。  

これだけでした。なんと！
指定したテーブルのカラム名を全て取得する



#### 概要

MｙSQL DB から、テーブル名を指定してそのテーブルに含まれる全てのカラム名を取得する方法について記載する



#### information_schemeを使う

##### コマンド
```
mysql -u [username] -p -D [database_name] -e "select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA where TABLE_SCHEMA=[database_name] AND TABLE_NAME=[table_name];"
```

##### 結果

```
+---------------+------------+-------------+
| TABLE_SCHEMA  | TABLE_NAME | COLUMN_NAME |
+---------------+------------+-------------+
| database_name | table_name | column1     | 
| database_name | table_name | column2     | 
| database_name | table_name | column3     | 
+---------------+------------+-------------+
```


#### show full columns を使用する

```
mysql -u [username] -p -D [database_name] -e "show full columns from [table_name];" 
```


```
+----------------+-----------------+------------------+------+-----+---------------------+----------------+---------------------------------+-----------------------------------+
| Field          | Type            | Collation        | Null | Key | Default             | Extra          | Privileges                      | Comment                           |
+----------------+-----------------+------------------+------+-----+---------------------+----------------+---------------------------------+-----------------------------------+
| id             | int(11)         | NULL             | NO   | PRI | NULL                | auto_increment | select,insert,update,references |                                   | 
| member_id      | varchar(100)    | sjis_japanese_ci | NO   |     | NULL                |                | select,insert,update,references |  this column is uuid              |
| created        | datetime        | NULL             | NO   |     | NULL                |                | select,insert,update,references |                                   | 
| updated        | timestamp       | NULL             | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |                                   | 
+----------------+-----------------+------------------+------+-----+---------------------+----------------+---------------------------------+-----------------------------------+
```


#### 比較

information_scheme テーブルにはMySQLの中に含まれるDB及びテーブル、各テーブルのカラムに関する情報が全て手に入る。
また、show full columns からも同様の情報を取得できるが、こちらはテーブルに付与されたコメントも含めて取得できる。


参考
https://dev.mysql.com/doc/refman/5.6/ja/information-schema.html
[Swift]Hakubaの使い方


## Hakubaとは
[Hakuba](https://github.com/nghialv/Hakuba)とは，UITableViewをCellmodel-derivenで扱うためのマネージャー．
Hakubaを用いることで，`UITableViewDelegate`と`UITableViewDataSource`を実装することなくUITableViewを管理することができ，すっきりしたview controllerを実現できる．


## はじめに
Hakubaの使い方を学ぶために，UITableViewのセルを追加・削除できる簡単なアプリを作りました．
今回のソースコードは，GitHubにアップしたので，参考にどうぞ．


## 環境
- OSX El Capitan
- Swift 2.2
- iOS 8.0
- Xcode 7.3
- Hakuba 2.1.1


## CellとCellModelの実装

Hakubaを使うために，まずCellとCellModelを実装します．

```swift:MyCell.swift
import UIKit
import Hakuba

class MyCell: Cell, CellType {

    typealias CellModel = MyCellModel
    
    @IBOutlet weak var label: UILabel!
    
    override func configure() {
        guard let cellmodel = cellmodel else { return }
        
        cellmodel.editable = true
        cellmodel.editingStyle = .Delete  
    }
}

```

```swift:MyCellModel.swift
import UIKit
import Hakuba

class MyCellModel: CellModel {
    let text = String()
    
    init() {
        super.init(cell: MyCell.self, selectionHandler: nil)
    }
}

```

## ViewControllerの実装
次にコントローラを実装します．
Hakubaで管理したいUITableViewをHakubaのコンストラクタに渡します．

```swift:viewController.swift
import UIKit
import Hakuba

class ViewController: UIViewController {
    private let  tableView = UITableView()
    private lazy var hakuba: Hakuba = Hakuba(tableView: self.tableView)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        configureNavigationBar()
        configureAppearance()
        configureHakuba()
    }
    
    func tapAddBtn(){
        hakuba[0]
            .append(MyCellModel())
            .bump(.Middle)
    }
    
    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        hakuba.setEditing(editing, animated: animated)
    }
    
    func deleteCell(indexPath: NSIndexPath){
        hakuba[indexPath.section]
            .remove(indexPath.row)
            .bump()
    }

}

// MARK - private methods
private extension ViewController {
    
    func configureAppearance(){
        tableView.allowsSelection = false
        tableView.frame = view.frame
        view = tableView
    }
    
    func configureNavigationBar(){
        let addBtn = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: #selector(tapAddBtn))
        navigationItem.setRightBarButtonItem(addBtn, animated: true)
        navigationItem.leftBarButtonItem = editButtonItem()
    }
    
    func configureHakuba(){
        hakuba
            .registerCellByNib(MyCell)
            .commitEditingHandler = { [weak self] style, indexPath in
                if (style == UITableViewCellEditingStyle.Delete) {
                    self?.deleteCell(indexPath)
                }
            }

        // 以下のように，repeatedValue にクラスを渡すと実体は1つのため状態が共有されてしまうので，実際に使うときは注意
        let cells: [MyCellModel] = Array(count: 4, repeatedValue: MyCellModel())
        let section = Section()
        
        hakuba
            .reset(section)
            .bump()
        
        section
            .reset(cells)
            .bump()
    }
}

```
Vagrantのコマンドメモ


端末環境：Mac OS X 10.11.6
vagrantバージョン：1.8.5


## Boxの追加/削除


### 追加

```
$ vagrant box add boxname http://~~~~~
```


### 削除

```
$ vagrant box remove boxname
```



なお、Boxファイルはホームディレクトリ下の.vagrant.d/boxesに保存される。

```
$ ls ~/.vagrant.d/boxes/
centos7
```


## 仮想マシンの起動/停止など

### 起動

```
$ vagrant up
```

### 停止

```
$ vagrant halt
```

### 再起動

```
$ vagrant reload
```


### 状態確認

```
$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```

### 一時停止

```
$ vagrant suspend
```

### 一時停止からの復帰

```
$ vagrant resume
```

## 仮想マシンの削除

Vagranfileのあるディレクトリで下記を実行

```
$ vagrant destroy
```




## 参考

[Vagrantのbox、VirtualBoxのVM、削除/パス](http://qiita.com/kanpou_/items/08a65234355baf6da98f)
翻訳機能付きの TextView

■ 動作条件として、Google 翻訳がインストールされている必要があります。

	class TranslatableTextView : TextView, ICallback
	{
		public TranslatableTextView(Context context) : base(context)
		{
			Init();
		}

		public TranslatableTextView(Context context, IAttributeSet attrs) : base(context, attrs)
		{
			Init();
		}

		public TranslatableTextView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
		{
			Init();
		}

		private void Init()
		{
			SetTextIsSelectable(true);
			CustomSelectionActionModeCallback = this;
		}
		
		public ICharSequence SelectedText()
		{
			return new Java.Lang.String(TextFormatted.SubSequence(SelectionStart, SelectionEnd));
		}

		public bool OnCreateActionMode(ActionMode mode, IMenu menu)
		{
			foreach(var n in Context.PackageManager.QueryIntentActivities(CreateProcessTextIntent(), 0))
			{
				if(n.ActivityInfo.Name == "com.google.android.apps.translate.copydrop.CopyDropActivity")
				{
					menu.Add(Menu.None, Menu.None, 100, n.LoadLabel(Context.PackageManager))
						.SetIntent(CreateProcessTextIntentForResolveInfo(n))
						.SetShowAsAction(ShowAsAction.IfRoom);

					break;
				}
			}

			return true;
		}

		private Intent CreateProcessTextIntent()
		{
			return new Intent().SetAction(Intent.ActionProcessText).SetType("text/plain");
		}

		private Intent CreateProcessTextIntentForResolveInfo(ResolveInfo info)
		{
			return CreateProcessTextIntent()
					.PutExtra(Intent.ExtraProcessTextReadonly, true)
					.SetClassName(info.ActivityInfo.PackageName, info.ActivityInfo.Name);
		}

		public bool OnPrepareActionMode(ActionMode mode, IMenu menu)
		{
			// UNUSE
			return false;
		}

		public bool OnActionItemClicked(ActionMode mode, IMenuItem item)
		{
			if (item.Intent != null && item.Intent.Component.ClassName == "com.google.android.apps.translate.copydrop.CopyDropActivity")
			{
				Context.StartActivity(item.Intent.PutExtra(Intent.ExtraProcessText, SelectedText()));

				mode.Finish();

				return true;
			}

			return false;
		}

		public void OnDestroyActionMode(ActionMode mode)
		{
			// UNUSE
		}		
	}
rubyで早期return

ちょっとrubyでコードを書くことになって、早期returnを使いたくなる場面があったので、そのときの整理。
Javaで結構使っていたのですが、rubyでどう書くか躊躇ったので思い出せるようにメモ。

# サンプルコード

```
def isXXX(arg)
  return false if arg.nil?

  return false if arg == 'hoge' 
 
  return true; 
end
```

# そもそも早期returnとは？

あまり起きないケース、あるいは重要でないケースでifのネストを深くしたり、else句を使うのを避けるためのテクニックです。条件を満たしたときに、後ろに影響を及ぼさないようにすぐにreturnさせる、というそのものずばりです。「ガード節による条件記述の置き換え」ともいうようです。（returnだけでなく例外スローもするケースもあるようです。）

さっきのを早期returnなしで書くとこんな感じです。

```
def isXXX(arg)
   if (arg.nil) 
      false
   else if (arg == 'hoge')
      false 
   else  
      true
   end  
end
```

このくらいなら、そんなでもないですが、条件の記述が長くなったり、パターンが多いときは早期returnの形にすると、それぞれを分けて考えやすくなります。


## 参考サイト

* http://dqn.sakusakutto.jp/2012/08/if-else.html
* http://komaji504.hateblo.jp/entry/2016/06/07/004503
* http://yamitzky.hatenablog.com/entry/2013/11/21/004437
* http://www.slideshare.net/MoriharuOhzu/ss-14083300
* http://d.hatena.ne.jp/asakichy/20090614/1244934302
* http://bleis-tift.hatenablog.com/entry/20090124/1232768059
【Python】printを使う際に注意すること

Python３でprintを使う際は、sepとendのオプションは頭の片隅に意識しておいた方が良い。
非常に基本的な事だが、忘れてしまうと意図しない結果を出力してしまうことがある。

```py
s = 'abc'
t = 'def'

# カンマやタブの前後に空白が入る
print(s, ',', t) # -> abc , def
print(s, '¥t', t) # -> abc ¥t def

# カンマやタブの前後に空白を入れたくない場合はsepに空の文字列を指定
print(s, ',', t, sep='') # -> abc,def
print(s, '¥t', t, sep='') # -> abc¥tdef

# 改行したくない場合はendに空の文字列を指定
print(s, ',', t, sep='', end='') # -> abc,def（改行なし）
print(s, '¥t', t, sep='', end='') # -> abc¥tdef（改行なし）
```
scala-graphの紹介

* http://www.scala-graph.org/

Scalaでグラフ探索する必要があって自分でやるのは面倒でなんかあるだろと探したら発見した。

```build.sbt
libraryDependencies += "org.scala-graph" %% "graph-core" % "1.11.2"
```
として準備。


説明なしに単純な例。

```graphdemo.scala
package example.graph

import scalax.collection.Graph
import scalax.collection.GraphPredef._, scalax.collection.GraphEdge._

object GraphDemo1 {
  def main(args: Array[String]): Unit = {
    val g = Graph(1~2, 2~3, 4~5, 1~4, 4~3, 6~7)
    println(g.get(1).pathTo(g.get(3)))    //=> Some(Path(1, 1~4, 4, 4~3, 3))
    println(g.get(1).pathTo(g.get(2)))    //=> Some(Path(1, 1~2, 2))
    println(g.get(1).pathTo(g.get(6)))    //=> None

    val path = g.get(1).pathTo(g.get(3)).get
    println(path.size)   //=? 5
    println(path.weight) //=> 2
  }
}
```

重み付きとか有向グラフなども扱えるが当面必要ないので略。
iOS 10対応確認項目メモ

## 目的
- xcode8でビルドを通し、ios10で正常に動くようにするためのチェック項目
- 個人的なチェックの意味でまとめます

## ATS
- アプリ内でWebViewをつかっている場合は`NSAllowsArbitraryLoadsInWebContent`を`YES`にする
- ios10とios9での動きを確認する
- `NSAllowsArbitraryLoads`をYESにする正当な理由があるか検討する
- 使っているライブラリが対応しているか確認する

## ユーザーデータへのアクセス
- ユーザーデータへアクセスの目的を`info.plist`に記載している確認
- etc.カメラ,フォトライブラリ

```
<dict>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>フォトライブラリにアクセスする目的を書く</string>
</dict>
```

## deprecatedになったメソッドを置き換える
- 通知を使っているアプリは`UserNotifications`のFrameworkに書き換える


## 参考URL
- [【Apple WWDC 2016】iOS 10のApp Transport Securityと2016年末からのATS必須化についてAppleのエンジニアに聞いてきた](http://developer.hatenastaff.com/entry/2016/06/16/165924)
- [iOS10 ATS(App Transfer Security)のApple公式ドキュメントのまとめと翻訳メモ](http://qiita.com/caffezom/items/e2397de6ae969773e41f)
- [Cocoa Keys](https://developer.apple.com/library/prerelease/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW1)
- [[iOS 10] 各種ユーザーデータへアクセスする目的を記述することが必須になるようです](http://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/)
- [iOS 10 時代の Notification](http://qiita.com/koogawa/items/0dff2f59096b292571db)
- [iOS 9.3 to iOS 10.0 API Differences](https://developer.apple.com/library/prerelease/content/releasenotes/General/iOS10APIDiffs/index.html)
Vuforia for Unityの2眼カメラ表示をカスタマイズする

Vuforiaが提供しているAR/VRサンプル（参考: [Vuforia for UnityのAR/VRサンプルを動作させる](http://qiita.com/arumani/items/4bc595dcea863cb74de7)）のままだと、2眼表示の大きさが画面に対してかなり小さいです（端末によるかもしれませんが）。この表示をカスタマイズする方法について書きます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/42051/231e0b54-3349-b2ec-c38a-aef1c6ddc3da.png">

※以下で挙げているパラメータは、本来の目的はCardboardデバイスの規格（物理的な箱のサイズやレンズ等の実際の距離）に合わせた数値を設定するものです。従ってやり過ぎると視差や見える範囲などが実際とずれ過ぎて違和感が出る可能性がありますが、デフォルトの状態だと覗き窓感が強いので、支障が出なさそうな範囲で大きくしたいと考えました。

※ここではVuforiaの組み込みCardboard対応を使った場合の話となります。2眼表示にCardboard SDKを用いている場合は無関係です。

# 事前準備
0. Vuforia for UnityのAR/VRサンプルプロジェクトを開く
0. Hierarchyで、UserHead -> ARCamera を選択

Inspector内の"Digial Eyewear Behaviour (Script)"にあるパラメータを調整します。

# パラメータ調整
まずパラメータの手動設定を可能にする為に、Viewer Type を初期値 "Cardboard v1 (Google)" から "Custom" に変更します。

以下のパラメータはCardboardの仕様に沿ったものなので、それぞれの詳しい意味などについてはGoogle Cardboardのドキュメント[Enter physical viewer parameters - Cardboard Manufacturer Help](https://support.google.com/cardboard/manufacturers/answer/6324808)を参照して下さい。図入りで分かりやすい説明があります。

### Screen To Lens Distance
画面とレンズの距離。値を大きくすると、カメラ画像が大きくなります。
Cardboard v1 : 0.042

### Inter Lens Distance
2つのレンズ間の距離。値を大きくすると、左右のカメラ画像が離れます。
Cardboard v1 : 0.06

### Tray Alignment
スマホをCardboardに設置する際に、下／中央／上のどこを基準に置かれるか。
Cardboard v1 : TRAY_ALIGN_BOTTOM

### Lens Center To Tray Distance
Tray Alignmentで設定した基準からレンズの中心までの距離。
Cardboard v1 : 0.035

### Distortion Coefficients
歪み係数。
Cardboard v1 : k1=0.441 / k2=0.156

### Field Of View
視野。上記Cardboardドキュメントの順序で、Outer / Inner / Top / Bottomという並びになっています。
Cardboard v1 : 40 / 40 / 40 / 40

# カスタマイズ例
iPhone6sのスクリーンショットです。

**Screen To Lens Distance = 0.042**
![IMG_3827.PNG](https://qiita-image-store.s3.amazonaws.com/0/42051/b7780af7-b23c-9752-e674-92d29752f751.png "IMG_3827.PNG")

**Screen To Lens Distance = 0.07**
![IMG_3828.PNG](https://qiita-image-store.s3.amazonaws.com/0/42051/1f5dbc79-5de4-c2f6-daef-d1ccfda1ffe3.png "IMG_3828.PNG")
scopeの条件はjoinsで絞ろう

Railsのscopeは強力な機能で、ActiveRecordにできることをかなりこなせますが、それが故にトラブルとなることもあります。

# TL; DR
* 絞込用のscope内でのテーブル結合は`.joins`で行う

# 設例
今回の例を説明するサンプルとして、こんなアプリケーションを考えてみます（何がモデルかは気にしないでください）。

* ユーザーが投稿（`Post`）をしていく。
* 投稿には、複数のコメント（`Comment`）を付けられる。
* コメントには、各ユーザーが感謝（`Thank`）を表明できる。

素直にRailsのモデルに起こすと、以下のようになります。

```rb:3モデルまとめて書いています

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
  has_many :thanks
end

class Thank <  ActiveRecord::Base
  belongs_to :comment
  belongs_to :user
end

```

# `scope`とは
[詳しい記事](http://qiita.com/okamos/items/724a4a162dfa9e27754a)があるので詳細は省略しますが、要は「モデルに続けられるメソッドチェーンを束ねたもの」です。これ自体もActiveRecord::Relationを返すようにしておけば、メソッドチェーンの一部として使えるようになります。

ここでは、「ある人が感謝をつけたコメント」というスコープを立ててみます。

```app/models/comment.rb
  scope :thanked_by, ->(id) { eager_load(:thanks).where(thanks: { user_id: id }) }
```

このようにしておけば、`Comment.thanked_by(2)`のように使えます。

## `scope`の`merge`…失敗
Railsの`scope`にはさらに強力な機能がありまして、`merge`というものがあります。これは、「別なテーブルとつないだときにも、検索に同じ`scope`を使える」というものです（[関連記事](http://qiita.com/ojiry/items/1899df6bfee8176b6c7c)）。ということで、さっき作った`thanked_by`を使って、「感謝したコメントのある投稿を検索する」というスコープを作ってみることにします。

```app/models/post.rb
  scope :with_thanked_comments, ->(id) { eager_load(:comments).merge(Comment.thanked_by(id)) }
```

一見動きそうに見えますが、このまま`Post.with_thanked_comments`を使おうとすると、`ActiveRecord::ConfigurationError`になってしまいました。

## 失敗の原因と対策
[ここの記事](http://qiita.com/k0kubun/items/80c5a5494f53bb88dc58)に詳しいのですが、`Comment.thanked_by`の中で使っていた`.eager_load`には、「SQLでテーブルをJOINする」ことと「`eager_load`先をActiveRecordオブジェクトに起こす」という2つの役割があります。そして、mergeした後にも後者の機能が残ってしまって、`Post`上でthanksのリレーションを使おうとして、エラーとなっていたのですた。

ということで、`.eager_load`を`.joins`に置き換えてJOINだけさせるようにすれば、問題なく動くようになりました。なお、`.joins`でJOINした先に対して`.eager_load`や`.includes`を使った場合も、テーブルをもう一度読んでしまうことはなく、最初にJOINした分を有効活用してくれます。

根本的に言えば、絞込用のscopeでActiveRecordを生成する必要は本来ないわけで、そのあたりの役割分担、というのも考えておいたほうがいいかもしれません。
Time Machineでローカルスナップショットのみを有効化する

**(2016/09/30追記)※2016/09/26に公開された TimeMachineEditor 4.5.2 だと下記の操作を行ってもバックアップ実行時にTime Machineの設定が自動的にオフになり、ローカルスナップショットも同時に無効化されてしまいます!**

[TimeMachineEditor](http://tclementdev.com/timemachineeditor/)でTime Machineの実行間隔を調整しています。
そのためTime Machine自体のスケジューラは無効にするためTimeMachineをオフにしていました。

ただ、システム環境設定のTime Machine設定からTime Machineをオフにするとローカルスナップショットも無効になってしまいます。
![timemachine_local_disable.png](https://qiita-image-store.s3.amazonaws.com/0/43589/36d0dc17-db1c-04bf-8cb0-b93bf1a55fd7.png)

外付けHDDあるいはネットワークドライブ上のTime Machineだけではなくローカルスナップショットも利用したいため有効にする方法を調べました。

※OS X 10.11.6 で確認しました。


# コマンドでTime Machineを無効化する

システム環境設定のTime Machine設定がオンの状態でコマンドでTime Machineをオフにします。

```bash
$ sudo tmutil disable
```

そうするとローカルスナップショットは有効のままTime Machineがオフになりました。
![timemachine_local_enable.png](https://qiita-image-store.s3.amazonaws.com/0/43589/d2724d46-7006-6cd4-c389-580aecd65af5.png)


# コマンドでローカルスナップショットを有効化する

あるいはコマンドでローカルスナップショットを有効化します。
(あらかじめTime Machineはオフにしておきます)

```bash
$ sudo tmutil enablelocal
```

こちらも同じようにローカルスナップショットが有効になりました。


# 注意

システム環境設定のTime Machine設定でTime Machineのオン/オフを切り替えるとオフにした時に再びローカルスナップショットが無効になってしまいます。

~~これ表示上はローカルスナップショットが有効のように見えるだけで実は動いてないってことはないよね?~~
→無事にローカルスナップショットが作成されてました
dkms note


# SR_IOV for non amazon linux (centos 7)

## install 
from epel

## config

```bash:
cp ixgbevf-2.16.4.tar.gz /usr/src
cd /usr/src
tar xzvf ixgbevf-2.16.4.tar.gz
```

### dkms.conf
BAD! (AWS's sample, restart build fail)
`MAKE=cd src/; ...`
Good!
`MAKE=make -C src/ ...`

```/usr/src/ixgbevf-2.16.4/dkms.conf
PACKAGE_NAME="ixgbevf"
PACKAGE_VERSION="2.16.4"
MAKE="make -C src/ BUILD_KERNEL=${kernelver}"
CLEAN="make -C src/ clean"
BUILT_MODULE_LOCATION[0]="src/"
BUILT_MODULE_NAME[0]="ixgbevf"
DEST_MODULE_LOCATION[0]="/updates"
DEST_MODULE_NAME[0]="ixgbevf"
AUTOINSTALL="yes"
```

## install this dkms's ko

```
dkms add -m ixgbevf -v 2.16.4
```

## build check for current kernel

```
dkms build -m ixgbevf -v 2.16.4
dkms install -m ixgbevf -v 2.16.4
```


# status

`dkms status`

# tips

## Trigger dkms
1. when new (old) kernel install
2. reboot

## New kernel installed, but did not build ko

You should install `kernel & kernel-xxx` pkg's at same time.

OK:
 `yum install kernel kernel-devel kernel-headers`

NG:

```
yum install kernel
yum install kernel-devel
yum install kernel-headers
```

## Rebooted, but ko was not updated
Set dkms service enabled before reboot.
`systemctl enable dkms`

## best practice
1. Setup dkms & ko sources
2. build ko @ current kernel, commit to build (dev-tool , gcc ...)
3. yum update `kernel kernel-devel kernel-headers`
4. `dkms status.` If you find ko for new kernel, easy to reboot.
5. If you can not find ko, manual build
`dkms autoinstall --verbose --kernelver <new-kernel-ver>'`
`new-kernel-ver` format is `uname -r`.
CentOSにrmagickをインストール

rmagickのインストールでハマったので情報共有です。

2016年9月2日現在だと、
`yum install --enablerepo=remi ImageMagick-last-devel ImageMagick-last-lib  ImageMagick-last`
`gem install rmagicjk`
で、ImageMagick 6.9.5、rmagick2.16.0　をインストールできます。

`yum install ImageMagick-devel ImageMagick-lib ImageMagick`
だと、古いので脆弱性の問題があり、

`yum install --enablerepo=remi ImageMagick7-devel ImageMagick7-lib  ImageMagick7`
だと、ImageMagick7はまだrmagickは対応してないようです。
AsciiDocでドキュメントを書いてみた（１）

AsciiDocで文書を書くと、なんとなくそれらしく見えます。
便利。

# AsciiDoc is 何
AsciiDocは、HTMLやMarkdownのようなマークアップ言語の一つで、「ここは見出し」「ここは補足事項」などと意味づけする事で、それらしい文章を作ってくれます。「Markdownより高い表現力」「HTMLより高い可読性」が特徴で、表の作成なども標準仕様として提供されています。

- 表記例

![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/131348/330cb2ba-54a8-6cfd-48fb-8f193f4ba7c0.jpeg)


# 何を使って書くか
"AsciiDoc"とはいっても、あくまでテキストデータなので、特別に必須となるソフトが存在するわけではありません。
それこそ「メモ帳」やvi,Emacs,秀丸・・何でも「書くこと」はできます。
が、実際に文書を書くとなると、前項目でお見せした表記例左側のような情報のみで書き続ける事は難しいと思います。
もちろん「そんな物いらねえ、俺はメモ帳だけで頑張るんだ！」という方は頑張っていただいても良いのですが、、自分はいやです。

## 個人的にはIntelliJ IDEA Community + 各種プラグインが良い感じ
[JetBrainsのサイト](https://www.jetbrains.com/idea/)からダウンロード出来るIntelliJ IDEA Community Editionと、IntelliJへ追加するプラグインの"AsciiDoc"及び"RedPen Plugin"を組み合わせた環境が使いやすかったです。
IntelliJをインストール後、File > Settings...から"Plugins"を選択。「Browse repositories...」の入力欄へそれぞれプラグイン名を入れて「Install」をクリックするだけと、非常に簡単です。
![adpin.JPG](https://qiita-image-store.s3.amazonaws.com/0/131348/9465a666-47ee-0259-f97b-54eb66472a98.jpeg)


## わりと厳しいredpen
"redpen"プラグインを導入する事で、専属の赤ペン先生も雇えます。
意味のない繰り返しや、ですます調・である調の混在など、本当に目ざとく指摘してくれます。

・・が、ちょっとこの先生、厳しすぎる。
File > Settings... > Editor > RedPen
からルールの設定が出来るので、調度良いレベル・内容で指摘してくれるように調整しましょう。

AsciiDocでドキュメントを書いてみた（２）では、その辺りのルールについていじってみた結果や、記述したドキュメントをPDFなどの形式で出力する方法等について書いてみたいと思います。
CRITICAL_SECTION用のマクロ

C++とC＃をウロウロしてて、ふと

```hoge.cpp
// 排他制御したいところ
EnterCriticalSection(&CS);
...
LeaveCriticalSection(&CS);
```
って、毎度書くのは面倒だなぁと思って
C#の`lock()`構文みたいなマクロを作ってみた
コーディングルール的にめっちゃ怒られそうなやつ

```piyo.cpp
// マクロ定義
#define lock(x) for(char _z = (EnterCriticalSection(&x), 1); _z; _z = (LeaveCriticalSection(&x), 0))

// 排他制御したいところ
lock(CS)
{
    ...
}
```

`for`文の中で定義している変数`char _z`は、他のと被らないように適当な名前が良いし
もちろん`int`型でも`bool`型でも何でも良いです。

無理矢理ポイント
１．変数`_z`を定義して、ループが１回だけ実行されるような無駄ループを組んでいる
２．カンマ演算子を使用して、`Enter`/`Leave`関数をぶち込んでいる

マクロ的にはただの`for`文なので、１行lockも大丈夫

```fuga.cpp
// 排他制御したいところ
lock(CS)
    ....
````

記述側で`break`とか`return`とかされると当然ロック解除されないので、脆弱性が脆くて弱いという性質があります。

結論：`std::mutex`使おう。
smartctlでSATA接続のHDD全台について温度と不良セクタ数を表示する

```
# 不良セクタチェック
lsblk -d -I 8 -n -o NAME,TYPE,TRAN -p | grep -E ' disk ' | grep -E ' (sata|sas)$' | while read LINE; do
	HDD=$(echo $LINE | cut -d' ' -f1)
	SMART=$(sudo smartctl --all $HDD)
	echo $HDD $(echo -e "$SMART" | grep -E '^(Device Model:|Serial Number:) ')
	echo -e "$SMART" | grep -E '^(  5|187|188|197|198) ' | sed -E 's/^ *(.+)$/\1/g' | sed 's/\s\{1,\}/ /g' | cut -d' ' -f 1,2,8,10
done

# 005 代替処理済のセクタ数
# 187 ハードウェアECCで回復できなかったエラー
# 188 コマンドタイムアウト回数
# 197 代替処理保留中のセクタ数
# 198 代替不可能セクタ数


# 温度チェック
lsblk -d -I 8 -n -o NAME,TYPE,TRAN -p | grep -E ' disk ' | grep -E ' (sata|sas)$' | while read LINE; do
	HDD=$(echo $LINE | cut -d' ' -f1)
	SMART=$(sudo smartctl --all $HDD)
	echo $HDD $(echo -e "$SMART" | grep -E '^(Device Model:|Serial Number:) ')
	echo -e "$SMART" | grep -E '^(190|194) ' | sed -E 's/^ *(.+)$/\1/g' | sed 's/\s\{1,\}/ /g' | cut -d' ' -f 1,2,8,10
done

# 190 エアフロー温度
# 194 温度
```
smartctlで取得したSMARTデータのうち必要なものを抽出して表示する。smartctlではIDが0埋めではなくスペース埋めで出てくるため先頭のスペースを削除。続いて連続したスペースを削除。これらの下処理を経てcutコマンドでID#、ATTRIBUTE_NAME、UPDATED、およびRAW_VALUE列を抽出。

lsblkでHDDを列挙する際はIオプションで8を指定してスワップやループバックデバイスなどを排除した。また、grepでTRANがsataのデバイスに絞り込みUSBメモリーなどを排除。TYPEも一応diskで絞り込んでいるが、SSDでもdiskになるためあまり意味がなく、現状SSDを排除できていない。pオプションでsdaではなく/dev/sdaという完全なデバイスパスを表示。

```
# smartctlが入っていない場合はインストール（Debian系）
sudo apt-get install -y smartmontools
```
SwiftのDictionaryをLLDBで確認する時のtips

# 発端

以下のような `[String: AnyObject]` なDictionary（例えばAPIレスポンスのjsonから生成されたもの）を実行時にLLDBでサクッと確認したい、というケースがデバッグ中に発生することもあるでしょう。

```swift
 let dog = ["id": 1, "name": "アレキサンダー", "owner": "ニーナ", "age": 10, "children": [["id": 2, "name": "ポチ", "owner": "ニーナ", "age": 3, "children": NSNull()], ["id": 3, "name": "チビ", "owner": "ニーナ", "age": 2, "children": NSNull()]]]
```

その際、 `po` するとこんな感じになって非常に見難いです…

```
(lldb) po dog
▿ 5 elements
  ▿ [0] : 2 elements
    - .0 : "owner"
    - .1 : ニーナ
  ▿ [1] : 2 elements
    - .0 : "age"
  ▿ [2] : 2 elements
    - .0 : "id"
  ▿ [3] : 2 elements
    - .0 : "children"
    ▿ .1 : 2 elements
      ▿ [0] : 5 elements
        ▿ [0] : 2 elements
          - .0 : owner
          - .1 : ニーナ
        ▿ [1] : 2 elements
          - .0 : age
        ▿ [2] : 2 elements
          - .0 : id
        ▿ [3] : 2 elements
          - .0 : children
        ▿ [4] : 2 elements
          - .0 : name
          - .1 : ポチ
      ▿ [1] : 5 elements
        ▿ [0] : 2 elements
          - .0 : owner
          - .1 : ニーナ
        ▿ [1] : 2 elements
          - .0 : age
        ▿ [2] : 2 elements
          - .0 : id
        ▿ [3] : 2 elements
          - .0 : children
        ▿ [4] : 2 elements
          - .0 : name
          - .1 : チビ
  ▿ [4] : 2 elements
    - .0 : "name"
    - .1 : アレキサンダー
```

# 解決案

## 1. `p` を使う

ずいぶん見やすくなりますが、入れ子になっているchildrenの中身が見れないのでちょっと実用的じゃない感じです。

```
(lldb) p dog
([String : NSObject]) $R1 = 5 key/value pairs {
  [0] = {
    key = "owner"
    value = "ニーナ"
  }
  [1] = {
    key = "age"
    value = 0xb0000000000000a3 Int64(10)
  }
  [2] = {
    key = "id"
    value = 0xb000000000000013 Int64(1)
  }
  [3] = {
    key = "children"
    value = 0x00007fd841702e40 {}
  }
  [4] = {
    key = "name"
    value = "アレキサンダー"
  }
}
```

## 2. `po print(<#value#>)` を使う

マルチバイト文字列がエンコードされちゃってますが、非常に見やすいです。

```
(lldb) po print(dog)
["owner": ニーナ, "age": 10, "id": 1, "children": <__NSArrayI 0x7fd841702e40>(
{
    age = 3;
    children = "<null>";
    id = 2;
    name = "\U30dd\U30c1";
    owner = "\U30cb\U30fc\U30ca";
},
{
    age = 2;
    children = "<null>";
    id = 3;
    name = "\U30c1\U30d3";
    owner = "\U30cb\U30fc\U30ca";
}
)
, "name": アレキサンダー]
```

# 結論

`po print(<#value#>)` を使いましょう・ω・
Laravelのルーティング表

# 表
[公式ドキュメント](https://laravel.com/docs/5.3/controllers#resource-controllers)だと機能名が無く直感的で無かったため、コピペして作りました。メモ的な感じです。

|機能名|Controllerメソッド名|HTTPメソッド|パス|ルート名|
|---|---|---|---|---|
|一覧画面|index|GET|/リソース名|resource.index|
|作成画面|create|GET|/リソース名/create|resource.create|
|作成|store|POST|/リソース名|resource.store|
|詳細画面|show|GET|/リソース名/{resource}|resource.show|
|編集画面|edit|GET|/リソース名/{resource}/edit|resource.edit|
|編集|update|PUT/PATCH|/リソース名/{resource}|resource.update|
|削除|destroy|DELETE|/リソース名/{resource}|resource.destroy|

# htmlのformタグで、httpメソッドのpatch利用したい場合

```html
<form method="POST" action="/user">
{{ method_field('patch') }}
</form>
```

通常は、GETとPOSTしか出来ないですがLaravelの仕組みを使うと(・∀・)ﾔｯﾃｸﾚﾙ!!

# 所感
このルールで統一されていれば分かりやすいですし、Laravelを使うなら乗っかっていきたいルールだと思いました。
stylus を使った clearfix の素敵な書き方

stylus を使って clearfix を記述する場合は、書き方や書き順を気にしないでも、簡単に出力結果を短くできます。

```stylus:mixins
clearfix()
  +cache('clearfix')
    &::after
      content ""
      display block
      clear both
```
```stylus:実行
.sapmle-1
  clearfix()
.sapmle-2
  clearfix()
```

まあ [nib](http://tj.github.io/nib/) に用意されているけれど、出力結果が長ったらしいしので上書きしてます。
んで、メインはキャッシュしましょうってこと。

[`+cache`](http://stylus-lang.com/docs/bifs.html#cachekeys) を使うと以下のように1つまとめてくれます。

```css
.sample-1::after,
.sample-2::after {
  content: "";
  display: block;
  clear: both;
}
```

nib に用意されている `clearfix` はキャッシュされていないので、どう記述するにせよ上書きしておくとよいですよっと。
gmail > extended mail address 2016年9月現在 > プラスは使える

関連 http://qiita.com/7of9/items/5d0117a0802cca97f5f9
関連 http://qiita.com/7of9/items/22461fefe2dd28ec403a
関連 http://qiita.com/7of9/items/6e88b5c8549fadd3b5f1

メール送信テストにて、gmailのあて先に異なる条件でメールを送信しようとしている。

受け取った側のメール識別のために拡張メールアドレスを使おうと考えた。

## プラス(+)使用 > 有効

https://support.google.com/mail/answer/12096?hl=en
> Gmail doesn't offer traditional aliases, but you can receive messages sent to your.username+any.alias@gmail.com. For example, messages sent to jane.doe+notes@gmail.com are delivered to jane.doe@gmail.com.

メールアドレスの@の前に`+test`などをつけて`user+test@gmail.com`とすると`user@gmail.com`あてのメールになる。

2016年9月2日現在、上記の機能は動作しているようだ。

受信したメールの「To欄」にはプラス付きのメールアドレスが入っているので、様々なメールを送信して、どれが成功してどれが失敗したか、などを見るテストに使えそう。

## ドット(.)使用 > 無効

別途、[2007年の小野さんのブログ](http://blog.livedoor.jp/lalha/archives/50158699.html)に記載のドット`.`を使う方法も試したが、こちらはメール送信失敗した。

## プラス(+)使用時の「To欄」

- `user@gmail.com,user@gmail.com,user@gmail.com`あてにメールを送った時
  - 受け取ったメールのTo欄は`user@gmail.com`
  - 受けるメールは1通
- `user+1@gmail.com,user+2@gmail.com,user+3@gmail.com`あてにメールを送った時
  - 受け取ったメールのTo欄は`user+1@gmail.com,user+2@gmail.com,user+3@gmail.com`
  - 受けるメールは1通

この違いが何に使えるかは不明。
【Cocos2d-x】AndroidとiOS両方でブラウザを開く【ネイティブ連携必要無し】

- 「Cocos2dx ブラウザ　起動」等で検索すると、ネイティブ連携コードを書く古い情報しか引っ掛からないので、自分用のメモも兼ねて記述
- いつ追加されたのかまでは裏取りしていないのでご了承ください。(筆者の環境は3.8)

```

Application::getInstance()->openURL("任意のURL");

```

- 上のコード一行でiOSとAndroid両方で指定したURLをブラウザで開くことが出来る。
らじるを録音（シェルスクリプト）

こんにちは。
 「[らじるを録音しようとしてコケた話](http://hanakimi-ikepara.hotcom-web.com/archives/1084)（認証が必要だった）」という記事を見つけたので、それのシェルスクリプトをほぼそっくり動かしてみました。NHK ラジオ番組の聴取・録音の話題です。

* なお「[らじるを聴取・録音（mpv/ffmpeg コマンド利用）](https://qiita.com/kkdd/items/c4d2439f31df0dd8bb82)」は、簡素化を試みた続編です。

必要なコマンドは事前にインストールしておいてください（下記はhomebrew利用の例です）。

```console
$ brew install wget rtmpdump mplayer
$ brew install --with-tools ffmpeg
$ ./radiru.sh -h

Name: radiru.sh

Usage: radiru.sh [options]

Options:
  --help
  --channel R1|R2|FM        (default R1)
  --branch  AK|BK|CK|HK     (default AK)
  --stop duration_time
  --output outputfile.mp4   or playing lively using mplayer if not specified
```

```radiru.sh
#!/bin/bash

# default values
ch="R1"
br="AK"
area="tokyo"
volume=4

usage_exit() {
  PROGNAME=$(basename $0)
  cat << EOS

Name: $PROGNAME

Usage: $PROGNAME [options]

Options:
  --help
  --channel R1|R2|FM        (default $ch)
  --branch  AK|BK|CK|HK     (default $br)
  --stop duration_time
  --output outputfile.mp4   or playing lively using mplayer if not specified

EOS
  exit 1
}

# analysis of arguments
for OPT in "$@"
do
  case "$OPT" in
    '-h'|'--help' ) usage_exit;;
    '-c'|'--channel' ) ch="$2"; shift 2;;
    '-b'|'--branch' ) br="$2"; shift 2;;
    '-s'|'--stop' ) dur="$2"; shift 2;;
    '-o'|'--output' ) ofile="$2"; shift 2;;
  esac
done

ch=`tr '[a-z]' '[A-Z]' <<< ${ch}`
br=`tr '[a-z]' '[A-Z]' <<< ${br}`
case "$ch" in
  'R2' ) case "$br" in 'AK' ) id=63342;; esac;;
  'R1' ) case "$br" in 'AK' ) id=63346;;  'BK' ) id=108232;;
                       'CK' ) id=108234;; 'HK' ) id=108442;; esac;;
  'FM' ) case "$br" in 'AK' ) id=63343;;  'BK' ) id=108233;;
                       'CK' ) id=108235;; 'HK' ) id=108237;; esac;;
esac
[ -z "$id" ] && usage_exit
[ -z "$dur" ] && [ -n "$ofile" ] && usage_exit
[ "$br" = "AK" ] && br=""
playpath="NetRadio_${br}${ch}_flash@${id}"
pageurl="http://www3.nhk.or.jp/netradio/player/index.html?ch=${br}${ch}&area=${area}"

if [[ -z "$tempdir" ]]; then tempdir=$(mktemp -d "${TMPDIR:-/tmp}"/foo.XXXXXXXXX); fi
swf=${tempdir}/rtmpe_ver2015.swf
uswf=${tempdir}/rtmpe_ver2015_u.swf
swfurl="http://www3.nhk.or.jp/netradio/files/swf/rtmpe_ver2015.swf?tm="`date +"%s%3N"`
wget -nv -O ${swf} ${swfurl}
cws2fws ${swf} ${uswf}
size=`wc -c ${uswf}`
hash=`openssl sha -sha256 -hmac "Genuine Adobe Flash Player 001" ${uswf} | cut -d ' ' -f 2`

if [ -n "$dur" ]; then stopdur="--stop ${dur}"; fi
if [ -z "$ofile" ]; then
  pipecommand="mplayer - -volume ${volume}"
else
  flv="${tempdir}/${ofile}.flv"
  output="--flv ${flv}"
  pipecommand="cat"
fi

rtmpdump --rtmp "rtmpe://netradio-${ch}-flash.nhk.jp/live" \
         --pageUrl "${pageurl}" --playpath "${playpath}" \
         --swfhash "${hash}" --swfsize "${size}" --app "live" --live \
         ${stopdur} ${output} | ${pipecommand}

if [ -n "$ofile" ]; then ffmpeg -v 0 -i ${flv} -c:v copy -acodec copy ${ofile}; fi
if [[ -n "$tempdir" ]]; then rm -rf $tempdir; fi
exit $?
```
【VBA】ファイル出力時に同じファイル名があった場合別名保存をする

# やりたいこと
- 保存ダイアログを使って保存する。
- 保存ダイアログで指定した保存先に同じファイル名が存在した場合に、ファイル名の後ろに (1) とか付けたい。

# コード
```vbnet:CSVファイルの場合
Sub outputCSV()
    Dim dtDate As String
    Dim fileSaveName As Variant
    Dim fileSaveName_name As String
    Dim fileSaveName_path As String
    Dim k As Integer

    '''保存ダイアログを開く
    dtDate = Format(Now, "yyyymmdd")
    fileSaveName = Application.GetSaveAsFilename( _
                    InitialFileName:=dtDate & ".csv", _
                    FileFilter:="CSVファイル(*.csv),*.csv", _
                    FilterIndex:=1, _
                    Title:="保存ファイルの指定")
    If fileSaveName = False Then Exit Sub
    
    '''保存しようとしたファイル名と既に同じファイル名が存在するならば、
    '''ファイル名の末尾に(i)をつける
    If Dir(fileSaveName) <> "" Then
        '保存ファイル名を取得
        fileSaveName_name = Dir(fileSaveName)
        '保存先のフォルダを取得
        fileSaveName_path = Replace(fileSaveName, fileSaveName_name, "")
        
        '保存ファイル名の末尾に(i)をつける
        k = 1
        Do While Dir(fileSaveName) <> ""
            fileSaveName = fileSaveName_path & Replace(fileSaveName_name, ".csv", "") & "(" & k & ")" & ".csv"
            k = k + 1
        Loop
    End If

    '''ファイルに対して処理を行う
    Open fileSaveName For Output As #1
        　処理　
    Close #1
End Sub
```

# レビュー
## 保存ダイアログを開く
[【参考】](http://qiita.com/yagi21/items/6eb3e66e646874093737#%E4%BF%9D%E5%AD%98%E5%BD%A2%E5%BC%8F%E3%81%AE%E6%8C%87%E5%AE%9A)

## 同じファイル名のファイルが存在するか
[【参考】](http://officetanaka.net/excel/vba/tips/tips95.htm)

```vbnet
If Dir(fileSaveName) <> "" Then
End If
```
`Dir(フルパス)`でファイル名を返す。そのフルパスが存在しなければ、空を返す。
**例)**　C:\Desktop\hoge.txt　→　hoge.txt

## フルパスをパスとファイル名に分割する
[【参考】](http://officetanaka.net/excel/vba/tips/tips78.htm)

```vbnet
'保存ファイル名を取得
fileSaveName_name = Dir(fileSaveName)
'保存先のフォルダを取得
fileSaveName_path = Replace(fileSaveName, fileSaveName_name, "")
```


## 末尾に(i)がついたファイル名(拡張子付)を返す
```vbnet
'保存ファイル名の末尾に(i)をつける
k = 1
Do While Dir(fileSaveName) <> ""
    fileSaveName = fileSaveName_path & Replace(fileSaveName_name, ".csv", "") & "(" & k & ")" & ".csv"
    k = k + 1
Loop
```
MacにHomebrewでPHPスクリプトの実行&デバッグ環境構築


長いことこの業界にいますが、初めてPHPの開発案件をやることになったんですよ。
言語仕様や文法は何となく分かるんですが、エコシステムがよく分かんない...
とりあえず、今必要なのはスクリプト実行なので、仮想環境使う程でもないかなーと思い、
Mac上で実行環境を作ってみました。

## 環境
OS X EL Capitan
Homebrew 0.9.9

## PHP

Macには元々PHP入ってますが、バージョン等々切り替えたかったりすると思うので、
Homebrewで幾つかのバージョンをインストールしてみます。

#### リポジトリ追加
PHPのリポジトリをtapします。

```
% brew tap homebrew/php
```

#### インストール
PHP5.6をインストールする例。

```
% brew install homebrew/php/php56
```

PHP7.0を入れたい場合は、「php56」の部分が「php70」になります。

php.iniなどの設定ファイルは、以下のディレクトリに入ります。

```
/usr/local/etc/php/5.6
```

#### 複数バージョンのPHPを入れたい場合
Homebrewで入れたPHPのいずれかに、/usr/local/bin/phpからlinkされている状態で、
別バージョンのPHPをインストールしようとすると以下のようなエラーになります。

```
% brew install homebrew/php/php55
==> Installing php55 from homebrew/php
Error: Cannot install homebrew/php/php55 because conflicting formulae are installed.

  php56: because different php versions install the same binaries.

Please `brew unlink php56` before continuing.

Unlinking removes a formula's symlinks from /usr/local. You can
link the formula again after the install finishes. You can --force this
install, but the build may fail or cause obscure side-effects in the
resulting software.
```

メッセージにも出ていますが、一旦unlinkをしてlinkを切る必要があります。

```
% brew unlink php56
...

% brew install homebrew/php/php55
```

新たにインストールしたPHPにlinkが作成されるので、
違うバージョンにパス通したい場合は、unlinkして使いたいバージョンにlinkすればよいでしょう。

```
% brew unlink php56
...
% brew link php70
```

### Xdebug

#### インストール
ステップ実行したいので、Xdebugも入れます。
各バージョンに応じて以下のように。

```
% brew install homebrew/php/php56-xdebug
```

設定ファイルは以下に作成されます。

```
/usr/local/etc/php/5.6/conf.d/ext-xdebug.ini
```

中身をこんな感じに設定します。

```ext-xdebug.ini
[xdebug]
zend_extension="/usr/local/opt/php56-xdebug/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port="9002"
```

通常ポートは9000番を使うようですが、自分の環境では他のアプリで使用されていたため、9002を割り当てています。

オプションは多々あるようですが、

https://xdebug.org/docs/all_settings

ローカルでステップ実行するだけなら、とりあえず上記の設定だけでも大丈夫そうなので、オプションは追々勉強します...


### IDEの設定
IDEはどれがいいかよく分かってませんが、PhpStorm使ってみることにしました。

#### PHPの登録
Preferences → Language & Frameworks → PHPを選択
Interpreterの「...」ボタンを押してInterceptersダイアログを起動して、
PHP executable枠に使用したいPHPのパスを登録します。
￼![intercepters.png](https://qiita-image-store.s3.amazonaws.com/0/51995/8cb8ffec-9326-4031-a441-d6878e4ec6ed.png)


これだけで、php.ini、Xdebugも認識されます。

#### ポート指定
Preferences → Language & Frameworks → PHP → Debugに
「Debug port」の枠があるので、Xdebugに設定したポートを設定しておきます。

#### デバッグ実行
Run → EditConfigurationsを選択。
PHP Scriptを選択し、「+」ボタンを押して、スクリプトの実行設定ダイアログを開きます。
「File」枠にステップ実行したいPHPファイルを指定します。

￼![degug-configurations.png](https://qiita-image-store.s3.amazonaws.com/0/51995/34ce1ad4-da76-7411-62f1-f31c2cd9ef15.png)


OKで戻ると、ウインドウ右上のプルダウンからいま作成した実行設定が選択できるので、
起動したい実行設定を選択してデバッグボタンを押下すると、デバッグ実行が開始されます。
※ブレークポイントは該当ファイルで、設定したい行の先頭をクリックすると設定できます。

## 参考ページ
以下を参考にさせていただきました。
ありがとうございました。  

http://weblabo.oscasierra.net/php-56-mac-homebrew-install/
PHPのアップデート方法のメモ

#vagrantでcentos7を使用しています。update方法についてメモを残しておこうと思います。

##とりあえずアップデートできない時用
（互換性とか無視で入れていきます）
けします
yum remove php-*　（＊root権限がない場合はsudoを頭にお忘れなく！）
↓
新しくインストールします。remiというリポジトリをつかってます。
yum install --enablerepo=remi-php56 php  (＊)
↓
おわり

##remiについて
**remiについて**
いろんな記事でremiをダウンロードしちゃえって書いてありますけど
そもそも最新版どこだよ状態の僕には恐ろしくてそのままコマンドが打てないので、とりあえずサイト貼っておきます
http://rpms.famillecollet.com/enterprise/
このURLでけつに欲しいIDを書けばyumするときに最新版をremiできるかと思います！
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/139390/e81e258b-150d-094f-0c54-4f1c90914ca2.jpeg)


おしまい。
連続して並ぶUILabelの文字の潰されやすさを調節する

文字の潰されやすさを調整する"Compression Resistance Priority"のメモ.
UILabelをいくつか連続して並べた時に、LinebreakModeで優先して潰れてほしいラベルを指定したかった.

例として名前、年齢、都道府県などを、それぞれ別のUILabelで表示している場合はこのようになる.

![スクリーンショット 2016-09-02 17.19.41.png](https://qiita-image-store.s3.amazonaws.com/0/120561/0f56bcc4-e84a-3500-7080-1d292f8e9c9b.png)


もし名前が長い場合、何も設定しないと、このようにはみ出したりする.
![スクリーンショット 2016-09-02 17.23.26.png](https://qiita-image-store.s3.amazonaws.com/0/120561/5236666c-9699-14c0-5d5d-9d8045e59442.png)

この場合では、年齢、出身地は確実に表示するようにして、名前を潰すようにしたかった.
このようなときに文字の潰されやすさを調整する項目が"Compression Resistance Priority"である.

![スクリーンショット 2016-09-02 17.40.17.png](https://qiita-image-store.s3.amazonaws.com/0/120561/b0715a50-c9da-ac99-249e-68f7335968f7.png)
Xcodeのユーティリティエリアにこのような項目がある.
縦方向と横方向に対してそれぞれ潰されやすさを調整できて、値は0~1000の値を取る(デフォルトは750).

今回の場合は名前を表示するUILabelのCompression Resistance PriorityのHorizonalの値を下げることでうまく収まるようにした.
カスタムBuild Configurationsの追加方法

# モチベーション
CocoaPodsを使っている状態でカスタムのBuild Configurationsを追加して
そのコンフィグレーションでのアーカイブがすんなりいかなかったのでメモです。

# What is BuildConfiguration?

Build（ビルド）するときのConfiguration（設定）だ！！

アプリのAPIサーバーはよく、開発、ステージ、本番etc……のように
フェーズごとに複数のエントリポイントが用意されますが、
自分はいつも、これを切り替えるのにBuildConfigurationを見て
環境を切り替えるようにしています。

# 手順

1. プロジェクトファイルの"Info"タブにあるConfigurationsの＋ボタンを押してカスタムコンフィグレーションを追加
2. Podsも同様にカスタムコンフィグレーションを追加
3. pod installする

3.の手順をやらないと追加したコンフィグレーション用のxcconfigファイルなどが生成されないことが問題でした。（これが何なのかはよくわからないですが）
ListViewのヘッダー追加

ListViewには、ヘッダー/フッターを追加することが出来る。

## 設定方法

ヘッダーの追加方法は以下の通り[ListView::addHeaderView()](https://developer.android.com/reference/android/widget/ListView.html#addHeaderView(android.view.View, java.lang.Object, boolean))を利用する。
第3引数は選択可否フラグ。以下例では選択不可にしている。
```
list = (ListView)findViewById(R.id.list_view);
View header = View.inflate(this, R.layout.header_list, null);
list.addHeaderView(header, null, false);
```

## 注意点

選択処理の実装において、OnItemClickListener::onItemClick()を利用するが、
position = 0がAdapterの先頭ではなくヘッダーとなる点に注意が必要。

```
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // headerがposition = 0となるため、adapterから取得するindexを調整する必要がある
        if(position <= 0) {
            return;
        }
        XXXObject  object = adapter.getItem(position - 1);
        if(object == null) {
            return;
        }
        // TODO: 
    }
});
```
rake note コマンドの検索ディレクトリに spec を含めるコマンドメモ

# コマンド

```bash
$ rake notes SOURCE_ANNOTATION_DIRECTORIES=spec
```

# メモ

デフォルトでは、 `rake notes` は app 、config 、lib 、bin 、test ディレクトリを検索するらしい。

# ついでに、カスタムアノテーションを指定する場合のコマンドメモ

```bash
$ rake notes:custom ANNOTATION=MEMO
```

# 参考

- [Railsのコマンドライン | Rails日本語ドキュメント | Ruby STUDIO](http://ruby.studio-kingdom.com/rails/guides/command_line)
簡単かつコストをかけずに、クラウドへデータを高速転送

##概要

HSCPというフリーソフトを利用する。https://ccportal.ims.ac.jp/software/hscp
scpのファイル転送部分をUDP通信に変えることで、高速転送を実現するとのこと。

下記の環境での実測値で通常のscp、FTPクライアント（今回はcyberduck）などの転送より、3倍速かった。
クライアント：mac os X、日本
サーバ：linux、アメリカ（ダラス）
その他：無線LANで測定、ファイルサイズは、tar.gzで440MBほど

供給元では組み合わせにより10倍ほど速くなるケースもある模様。
パフォーマンスサンプル：https://ccportal.ims.ac.jp/node/519

##注意点

非暗号化による高速化のため、特に注意が必要。
その他もろもろ、下記をよく読む必要あり。
https://ccportal.ims.ac.jp/node/500

## インストール
・ダウンロード
　https://sourceforge.net/projects/hscp/files/
　※各Platform用アーカイブにはビルド済みのバイナリがあるため、適宜選択してダウンロード。

・セットアップ
　　クライアントとサーバにhscpをセットアップする。
　・サーバのセットアップ
　　①ダウンロードしたパッケージを解凍
　　②make installを実行
　　③/usr/local/etc/hscp.confに後述の設定パラメータを設定する。
　　　※各パラメータの詳細は、https://ccportal.ims.ac.jp/node/502を参照。

---設定パラメータ
RshPath /usr/bin/rsh
UDPClientStartPort 32768
UDPClientEndPort 33023
/### for server parameters
UDPStartPort 18001
UDPEndPort 18032
ServerAccept 1
SshVerbose 0
SshQuiet 1
StalledBoundary 0) 
StalledContinuously 10
/## for both, UDT parameters
UDTSendBufSize 768000
UDTRecvBufSize 768000
UDPSendBufSize 65536
UDPRecvBufSize 768000
UDTSendSynMode 1
UDTRecvSynMode 1
UDTMaxPktSize 1500
UDTMaxWinSize 25600
UDTMaxBandWidth 500000
---設定パラメータ終わり

　・クライアントのセットアップ
　　サーバと全く同様。①ー③の手順を実行する。

　・実行方法
　　scpコマンドとほぼ同じ。追加スイッチについては、下記を参照。
　　　https://ccportal.ims.ac.jp/node/503

　　サンプルコマンド
<pre>　　　hscp ユーザ名@IPアドレス:リモートの転送対象ファイルを指定 転送するローカルのフォルダを指定 
</pre>

以上
複数スペースをTABに変換するsedスクリプト

## コマンド

```
sed -e 's/ [ ]*/       /g'  ファイル名
```

## はまったところ

- なぜか`[ ]+ `という記述だと空白を認識してくれなかった
- TABを入力するにはCtrl+Vの後にTAB
Keynote（Mac版パワポも）にソースコードを貼る



## Pygmentsやhighlightを使う

Keynoteにシンタックスハイライトされたソースコードを貼り付けるには、RTFでフォーマットされたソースコードをペーストする必要がある。

[Keynoteにソースコードを貼る - pirosikick's diary](http://pirosikick.hateblo.jp/entry/2014/08/27/015535)

上記ブログにまとめた内容が以前やっていた方法。CLIで変換してMacの`pbcopy`コマンドでクリップボードにコピーし、Keynoteに貼り付ける。

```shell-session
# highlightの場合
$ brew install highlight

# file.jsの内容をRTFに変換しクリップボードにコピー
$ cat file.js | highlight --syntax=js -O rtf | pbcopy

# クリップボードにコピーしたソースコードをRTFに変換しクリップボードにコピー
$ pbpaste | highlight --syntax=js -O rtf | pbcopy
```

[Welcome! — Pygments](http://pygments.org/)

Pygmentsは↑です。highlightよりドキュメントが充実している気がします。が、そこまで機能差は無いっぽいです。（あったら教えてください）

### 欠点

- 日本語が文字化けする
- いちいちCLIでコマンドを実行する必要があったので、面倒
- JSXやES2015など新しめのシンタックスに対応していない

文字化けは日本語を使わないでコードを書くなど工夫でどうにかなる。2つ目については、上記のブログにもあるように関数化したりaliasで割りと楽になる。

3つ目が個人的には一番辛くて、この方法はもう使っていない。



## vim-copy-as-rtf

[zerowidth/vim-copy-as-rtf: Copy syntax-highlighted code from vim to the OS X clipboard as RTF text](https://github.com/zerowidth/vim-copy-as-rtf)

vimのプラグイン。インストールすると、CopyRTFコマンドが使えるようになる。
`:CopyRTF`とすると、そのファイルの内容をvimで表示されている見た目のまま、RTFに変換し、クリップボードにコピーしてくれる。また、Visual Modeで選択した後に`:'<,'>CopyRTF`を実行すれば、選択範囲のみRTFに変換することもできる。
Vimの見た目のまま貼り付けることができるので、シンタックスに関してはVimが対応していれば何でもいけると思う。

### 貼り付けてみたスクリーンショット

![image](https://qiita-image-store.s3.amazonaws.com/0/18346/17edf980-36d7-beb6-40be-97309a8dee98.png)

あとは、背景色を同じ色で塗りつぶせばOK!

### 欠点

- Macじゃないと使えない
    - Macにしかないコマンドを使っているため（pbcopyやtextutil）

貼り付け先がKeynoteなので「Macじゃないと」はあまり欠点にならない。今はこの方法で貼り付けている。

### 他のエディタはどうか？

他のエディタに同じようなプラグインがないか、ちょっとだけ調べてみた。（と言っても、AtomとVS Codeだけだけど。Emacsは多分あるでしょう。）

#### Atom

[copy-as-rtf](https://atom.io/packages/copy-as-rtf)

上記プラグインがすぐ見つかったが、内部でPygmentsを使っているので、Pygmentsの欠点はそのまま引き継いでいると思う。

#### VS Code

[Add ability to copy formatted code to clipboard · Issue #3518 · Microsoft/vscode](https://github.com/Microsoft/vscode/issues/3518)

Issueがあった。みんな:+1:しているが、Closeされていないし、おそらく実装されていないはず。プラグインも見つけられなかった。（ちょっとしか調べてないのであるかもしれないけど）


## おわり

調べても、highlightやpygmentsの記事が殆どだったので、vim-copy-as-rtfについての紹介でした。
これ以外でおすすめの方法があったら、ぜひおしえてください。

## 追記：Mac版パワポでもOKでした。

![image](https://qiita-image-store.s3.amazonaws.com/0/18346/c5e5ed31-d7d2-8d41-fe20-a2621639da85.png)

背景色は消えますが、貼り付けることができました！便利！
NativeScriptでiOSアプリのローカライズ情報を日本語のみにする方法

NativeScriptは海外の方が作ったので、英語が正義なのです。
何も考えずにストア申請すると、対応言語が英語、となってしまいます。

これは何故かというと、執筆時点でのiOS用テンプレートにen.lprojというフォルダが存在するからなのです。
ここでいうテンプレートとは、

>tns platform add ios

でplatforms以下に作成されるものを指します。

iTunes Connectでは、*.lprojが存在する言語を全て対応言語としてしまうようなのです。

今回は日本語のみ対応とストアに表示したいので、これをja.lprojとすれば良さそうに思えますが、自力でファイルシステムを直接書き換えるとビルドに失敗します。
めんどくさいですが、platforms/ios以下のXcode用プロジェクトをXcodeから開いて、<プロジェクト名>/Supporting Filesグループに入っているInfoPlist.stringsを選択し、右のFile InspectorでLocalizedの部分のEnglishのチェックを外します。
すると削除して良いか聞かれるので、ばっさり削除しちゃいましょう。

え、いいのか？　と思われるかもしれませんが、これ元々空っぽですから。
InfoPlist.stringをローカライズしたいケースはアプリ名くらいだと思うので、次の手順で解決できます。

ずばり、nativescript-i18nプラグインを導入します。
https://github.com/rborn/nativescript-i18n
導入方法は上記に書いてありますが、一応解説します。

プロジェクトフォルダトップで、

>npm install nativescript-i18n --save

を実行してプラグインをインストールします。

次に、プロジェクトフォルダトップ内にi18nという名前でフォルダを作ります。
さらに、jaというフォルダを作り、中にstrings.xmlというファイルで文字列ローカライズ用のファイルを用意します。

>app/
>　├ i18n/
>　│　└ ja/
>　│　　　└ strings.xml/

これでstrings.xmlがAndroidの場合はそのままコピーされ、iOSの場合はLocalizedStringに変換されてja.lprojフォルダに格納されます。

strings.xmlの最低限のひな形は次のようになります。

```xml:strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">アプリ名</string>
    <string name="title_activity_kimera">Android用アクションバーのタイトル</string>
</resources>
```
公式ドキュメントではstringタグだけあれば良いような印象を受けますが、前述の通り

>tns prepare android

ではこのファイルがコピーされるだけですので、**きちんとresoucesタグ等も記述しないといけません。**

これで日本語のみ対応のiOSアプリのできあがりです！

なお、当然のごとく、英語と日本語対応にしたければ、i18nフォルダにenフォルダを追加してローカライズしていけば良いです。
【論文シリーズ】音声認識の深層学習理論（DBN + HMM）

## 原文
[多語彙音声認識のための文脈依存的かつ事前学習付きの深層ニューラルネットワーク (Context-dependent pre-trained deep neural networks for large-vocabulary speech recognition)
George E. Dahl, Dong Yu, Senior Member, IEEE, Li Deng, Fellow, IEEE, and Alex Acero, Fellow, IEEE (2012)](http://goo.gl/ZWpH4B)



## 1. 要約／背景
* 多語彙音声認識において、**DBN (Deep Belief Network)による事前学習**と**隠れマルコフモデル**を組み合わせた学習器を開発した。
* 本稿発表前までの主流は、混合ガウスモデルを事前学習に用いるスタイルだったが、それをDBNに置き換えた。DBNは、事前学習のみに用いる点も特徴である。


## 2. 骨子の理論
### (1)DBNによる事前学習
積層RBMの学習で表現する。音声データは実数連続値を取るので、**Gaussian RBM**を用いる。

```math
P({\bf v}|{\bf h}) = N({\bf v}; {\bf b} + {\bf h}^T{\bf W}^T, I)
```


### (2)HMMによる信号の並びの予測
(1)の事前学習で抽出された特徴量は、繰り返し想起された確率モデルに当てはめられる(Generative Model; 生成モデル)。当てはめられた確率分布のうち、尤もらしいものが学習結果により決定される。
確率分布の型は、隠れマルコフモデルに基づく。

HMMで表現していることは、3音素(Senone)が「ある遷移確率」に制御されて移り変わる挙動である。

当てはまりの良いときのパラメータwが新しいパラメータとして更新される；

```math
\hat w = \arg\max_w p(w|{\bf x}) = \arg\max_w p({\bf x}|w)p(w)/p({\bf x})
```

![151207223458_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/ac935927-ce48-36c1-d716-64c785da1e6a.jpeg)



## 3. モデル適用例
5層の隠れ層・2000超のユニットを備えたDNNと、GMMによる性能の違いを確かめた。


![151207223458_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/a4f3bb6a-e36c-d1f7-936a-734b9e2e26bf.jpeg)


目覚しい変化があるとは言えないが、若干の変化は認められた。
課題は、計算時間である。
並列処理が難しい構造のため、時間省力化が難しい。