OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL 5.6からDATETIMEは小数点以下が四捨五入(round)されるので気を付けよう

MySQL 5.6からTIME, DATETIME, TIMESTAMPがマイクロ秒精度をサポートしました。

[MySQL 5.6 Reference Manual :: 11.3.6 Fractional Seconds in Time Values](http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html)

で、ドキュメントにはちゃんとroundされるけどこれはSQL標準に従う挙動だからエラーとかワーニングは出ないよってさらっと書いてあるんですが、5.5では小数点以下は切り捨てだったんでマイクロ秒を付けてクエリ投げてた場合ハマりポイントになってます。

[MySQL Bugs: #68760: Datetime rounding problem](http://bugs.mysql.com/bug.php?id=68760)

## ActiveRecordにおけるDATETIMEのマイクロ秒サポート

ここからはジョーカーさんの[Rails-4.2+MySQL-5.6での時刻オブジェクトのミリ秒の扱いについて](http://qiita.com/joker1007/items/d4043eced880cbbce21c)へのアンサーエントリになるんですが、ActiveRecord 4.2では以下のPRがマージされたことでMySQLでもマイクロ秒を付けてクエリを送るようになりました([Rebuild: 56](http://rebuild.fm/56/)でmiyagawaさんがマージされるのに1年半ぐらいかかったって言ってたやつです)。

[MySQL 5.6  Fractional Seconds by arthurnn · Pull Request #14359 · rails/rails](https://github.com/rails/rails/pull/14359)

これは5.6のためにマイクロ秒付けるけど5.5には影響ないだろう(travis-ciはMySQL 5.5だからマイクロ秒のテストをCIで回せないというのがもともと1年半ぐらい放置されていたときの言い分だった)ということだったんだけど、roundされて切り上がると思った通りに動かないということをみんな甘くみていて、これ関係のissueがいくつか上がってきています。

[queries with ActiveSupport::TimeZone have extra fractional time · Issue #17239 · rails/rails](https://github.com/rails/rails/issues/17239)

小数点以下をそのカラムが持つマイクロ秒精度以上送ってroundされて切り上がるのは望ましくない挙動であることはコアチームの人も認識はしていて、精度に応じたフォーマットをするべきだよねとは言っています。

で、MySQLでは問題になってるけどPostgreSQLのほうはどうなってるのか、ちゃんと精度に応じたフォーマットがされているのかというと、PostgreSQLでも最大精度でマイクロ秒を送るので当然round問題は存在します。以下のテストはMySQLもPostgreSQLも`date`がroundされた結果`2014-08-17 12:30:01`として保存されるので`Foo.find_by(created_at: date)`でレコードがヒットしません。

```ruby
    def test_formatting_datetime_according_to_precision
      ActiveRecord::Base.connection.create_table(:foos, force: true) do |t|
        t.datetime :created_at, precision: 0
        t.datetime :updated_at, precision: 4
      end
      date = ::Time.utc(2014, 8, 17, 12, 30, 0, 999999)
      Foo.create!(created_at: date, updated_at: date)
      assert foo = Foo.find_by(created_at: date)
      assert_equal date.to_s, foo.created_at.to_s
      assert_equal date.to_s, foo.updated_at.to_s
      assert_equal 000000, foo.created_at.usec
      assert_equal 999900, foo.updated_at.usec
    end
```
[activerecord-mysql-awesome/test/cases/datetime_test.rb#L57-L69](https://github.com/kamipo/activerecord-mysql-awesome/blob/master/test/cases/datetime_test.rb#L57-L69)

PostgreSQLでこの挙動がこれまで問題とされてこなかったのは、精度を指定しなかった場合の挙動がMySQLとPostgreSQLでは異なるからです。MySQLでは精度を指定しない場合マイクロ秒を持たないとなりますが、PostgreSQLでは精度を指定しない場合マイクロ秒精度に制限を持たない(実質最大の精度を持つ)となるため、ふつうに使ってるひとがハマる機会があまりないということになります。

この問題は以前から認識していたので直す前段階として[#17673](https://github.com/rails/rails/pull/17673)をPRしてたけど空気的に4.2.0には入れてくれなさそうなんで4.2.0出たら直そうと思ってたんですが、ジョーカーさんがこの問題踏んだのでとりいそぎ修正PRを出しておきました。

[Format the datetime string according to the precision of the datetime field. by kamipo · Pull Request #18067 · rails/rails](https://github.com/rails/rails/pull/18067)

このまま4.2.0が出るとMySQL使ってるひと阿鼻叫喚だと思うんで上記PRをバックポートしたactiverecord-mysql-awesome 0.0.2をリリースしておいたのでどうぞお納めください。これを使うと4.0, 4.1, まだ出てないけど4.2でマイクロ秒サポートの恩恵を受けることが出来ます。

[activerecord-mysql-awesome 0.0.2](https://rubygems.org/gems/activerecord-mysql-awesome)
いずれかひとつが必須のチェックボックス群

# 概要

「複数あるチェックボックスのうち、最低ひとつを選んでください。」みたいなのよくやりますよね？

探し方が悪かったのか、もっといいものがあるのに頑張って実装してしまいました。
`(;-;)`

悲しいので何かの参考代わりに置いておきます。

# もっといいもの

こちらのほうが、機能充実。見た目もよいです。

http://plnkr.co/edit/FWsQVP7yWqnFf2uE1uXv?p=preview

# コードの屍

## 一応使い方

```html
<input type="checkbox" checkbox-group="enqBring" name="enqBring" >Search engine
<input type="checkbox" checkbox-group="enqBring">SNS
<input type="checkbox" checkbox-group="enqBring">Email newsletter
```

## ソースコード

```js:angular-checkbox-group.js
/* 
 * (C) 2014
 * 最低ひとつのチェックをrequireする
 * <p>
 * usage:
 * <pre>
 * &lt;input type="checkbox" name="opt" checkbox-group="optgroup"&gt;
 * &lt;input type="checkbox" checkbox-group="optgroup"&gt;
 * &lt;input type="checkbox" checkbox-group="optgorup"&gt;
 * </pre>
 */
angular.module('checkbox-group', []).directive('checkboxGroup', [
    '$parse', '$log',
    function ($parse, $log) {
        $log.debug('initializing checkboxGroup directive.');

        var linkFn = function (scope, element, attrs, ctrl) {
            $log.debug('checkboxGroup linkFn called.');

            var representCtrlGetter = $parse(attrs.checkboxGroup + 'RepresentCtrl');
            var representCtrlSetter = representCtrlGetter.assign;
            var getter = $parse(attrs.checkboxGroup);
            var setter = getter.assign;
            var count = getter(scope.$parent);

            if (typeof count === 'undefined') {
                count = 0;
                setter(scope.$parent, count);
                $log.debug('initialized number of checked boxes to 0.');
            }

            /* save a represent control of checkboxes group */
            if (ctrl.$name) {
                $log.debug('saving a represent control.');

                if (typeof representCtrlGetter(scope.$parent) !== 'undefined') {
                    throw 'only one checkbox can have NAME attribute.';
                }

                representCtrlSetter(scope.$parent, ctrl);
            }

            ctrl.$validators.requiredCheckbox = function (modelValue, viewValue) {
                $log.debug('checkboxGroup validator called.');
                var count = getter(scope.$parent);

                if (viewValue === true) {
                    count += 1;
                } else if (count > 0 && viewValue === false) {
                    count -= 1;
                }
                setter(scope.$parent, count);

                $log.debug('number of checked boxes is: ' + count);

                representCtrlGetter(scope.$parent).$setValidity('requiredCheckbox', (count > 0));

                return (count > 0);
            };
        };

        return {
            restrict: 'A',
            require: 'ngModel',
            scope: true,
            link: linkFn
        };
    }]);



```
No resource found that matches the given name: attr 'android:actionModeShareDrawable'


参考: http://stackoverflow.com/questions/26431676/appcompat-v721-0-0-no-resource-found-that-matches-the-given-name-attr-andro

上記ページのとおり

build.gradle を開いて、 `compileSdkVersion` を 21 にしたら治った。
Hatena Engineer Seminar #3 @ Tokyo!!! レポ


* はてぶではなくキータに書いてごめんなさい。はてぶの宣伝ということで！！
* はてなって京都の会社だった。
* はてなはツイッターIDで互いをよぶほどなかがいい。本名知らない。

## オンプレミスとクラウド、そしてDocker

### 登壇者
* @y_uuk1 さん

### 概要
* サーバ運用の新しい可能性をみせてくれるDockerを切り口に、オンプレミス環境とクラウド環境の両方を持ち、さらにはアプリケーションコードまで読み書きするはてなならではのサーバ運用の考え方と課題について紹介します。

### 資料
* https://speakerdeck.com/yuukit/on-premises-cloud-and-docker

### メモ
#### はてなのインフラ事情

* AWS + 自社サーバー + ベンダー
* デプロイはCapistrano（カピストラーノ）
* インフラプロビジョニングはChef

#### docker

* VMにそもそもログインしてなにかやるものではない
* アプリケーションごとにコンテナを作るイメージ
* アプリごとにユーザランドを用意するイメージ
* バージョンの違うMYSQLを3台うごかせますか？ドッカーだと楽勝
* ドッカーファイルにかいてさくっとつくる
* 全ての環境で同じドッカーイメージを使わないとメリット薄い デザイナーも
* マイクロサービスの各コンポーネントをドッカー化
* 各クラウドサービスと連携することで楽をする
* ドッカーファイルは1年後動かないかも。イメージも。
* 今日書いたDockerfileは1年後動かない可能性


## はてなにおけるモダン Android アプリ開発入門

### 登壇者
* @cockscomb　さん
* 真のアプリケーションエンジニア


### 概要
* はてなブログAndroidアプリの開発では、はてなにおけるAndroidアプリ開発の技術的な進歩を目標としました。AccountManagerによるアカウント管理や、Android Lollipopの最新機能とMaterial Designを大きく取り入れたUIなど、はてなの新しいAndroidアプリ開発を紹介します。

### 資料
* https://speakerdeck.com/cockscomb/hatenaniokerumodanandroidapurikai-fa-ru-men

### メモ
* WWDCいってすぐの仕事がandroidだったよ。
* はてなのandroidアプリつくったよ。
* シュッとするよ。
* はてなのスマホは7人くらい?

#### モチベーション
* androidアプリまだー？がおおかった。

### 開発プロセス
* ペーパープロト！全部書き出す！クオリティたかめにやる！
* プロトタイプの段階でかなりシビアな紙芝居でユーザビリティテストする！
* ハンバーガーボタン（ナビゲーションドロワー）はさいあく？いやいや、そんなことない！！プロトのユーザテストでわかった！
* スクラム開発の手法を使う！水曜からはじめる。土日でテンションさげない。
* スプリントとユーザビリティテストの同期！！
* Android Studio
* Genymotion
* Trelloで軽快にタスク管理
* マテリアルデザイン！！
* アップコンパットを使ってポリフィルする。

#### フラグメントでくそはまる！！
* Fragmentの復元
* Fragmentの入れ子

#### はてぶの編集モード
  * 編集モードの複雑なコードは単体テストを確実におこなう。
  * UIがなくても細部を検証できる。開発効率もあがる！

#### アカウントとAPI
* androidのアカウントマネージャーでアカウント管理。
* httpはボレイもいいけどレトロフィット！！


## サーバー管理ツール Mackerel Overview

### 登壇者
* id:Songmu / @songmu さん

### 概要
* Mackerelは、はてな初のB向けメインのWebサービスであるだけではなく、技術的にもScala/PostgreSQL/Graphite/AngularJSなど新しい技術を採用しています。下記の様なトピックを取り上げながらMackerelの現状とこれからについてお話します。

### 資料
* http://songmu.github.io/slides/hatenatech-3/#0

### メモ
* 着る服が欲しい人ははてなにくるといい

#### まかれる
* クラウドパフォーマンス管理ツール
* もともと社内ツール
* 30秒で会員登録
* 基本的なところはカジュアルに
* プラグインもけっこうあるよ

#### 全体のアーキテクチャ
* エージェントはGo
* Webアプリはplay@Scala(ハスケルがよかったがおとしどころ)
* フロントはAngular
  * ガルプ
  * 描画の一部にタイプスクリプト
* specs2をすててscalatest!!
* パールだ！！
* テスト時間とのたたかい！！
* ポスグレだ！！Redisだ！！
* ORMはSlick
* 時系列データベースだ！！KVSだ！パイソン性だ！めっっちゃぱいそんだ！
* scalaコードをperlの正規表現でおきかえるんだ！

#### 開発フロー
* リモートワーク
* スクラム
* Github
* Slack
* 制度として在宅勤務がある
* zoomでリモートペアプロ！！
* リモート制約でスケーラブル性を高める。
* リモートは自立的にルールを決める。
* リモートアンチとしてひとりがやりすぎて知見共有がしずらい。ノウハウが偏在！！
* プルリク駆動開発
* プルリクしたひとがマージするよ。
nanapi勉強会 vol6 - エンジニアとデザイナーの協働

nanapi勉強会 vol6 - エンジニアとデザイナーの協働に参加してきました。
http://nanapi.doorkeeper.jp/events/18274

| コンテンツ |発表者| 資料 |
|---|---|---|
| プロダクト開発を最適化するためにやめた4つのこと|株式会社nanapi 小島 泰洋さん|[プロダクト開発を最適化するためにやめた4つのこと](http://www.slideshare.net/TaiyoKojima/nanapi-study-kozyty20141218)|
|Coineyのチーム文化| コイニー株式会社 松本 隆応||
|デザイナーとエンジニアの何を変えて開発効率を変えたか？|株式会社VASILY 村田 卓朗||
|Qiita/Qiita:Teamの開発|Increments株式会社 小西 智也||

# 挨拶（KDDIの社員）
* 経歴：ヤフー → Facebook → KDDI
* Facebook社はエンジニアが企画をしている
* Facebook社はエンジニアが本番環境で作っている
* Facebook社はエンジニアからめちゃくちゃなサービスがどんどん上がってくる
* エンジニアがプロデューサーになって、どんどん作っていくべき
* Facebook社のエンジニアはマーケティングの知識を持ってる


# プロダクト開発を最適化するためにやめた4つのこと(株式会社nanapi 小島さん)
## 自己紹介
* http://nanapod.kozyty.com を粛々とやってます
* Git AdventCalendar2014に3回参加してるよ
* Git覚えたい人はDMしてね
* emosiってアプリがあるよ

## 会議をやめた
* リアルタイムコミュニケーションが活発になった

## カンバンをやめた
* Pivotalを導入 http://www.pivotal.io/jp
* +Slack連携
* カレンダーはホワイトボードで管理（丸見えカレンダー） 

## 開発することやめた
* 外部サービスにあるものはやらない

## エンジニアをやめた
* 開発だけすることをやめた
* プロダクトに合わせて立ち振舞を最適化する

## まとめ
* チームでは「自走」することが重要
* 最小構成の事例になるようにやってる

## 質問
* リーダー、ディレクションするひとは特に決めていない

# Coineyのチーム文化(コイニー株式会社 松本さん)
エンジニアもデザイナーも完璧を求めすぎだね
## 完璧主義の問題（完璧主義を捨てる）
* ツールとコードの間にギャップがあるよ
* 一番大事な部分の質が低下する・・・
* プライドってかなり邪魔するよね・・・

* 完璧主義をやめて７０％ルールにした
* あえて手を抜きチームで考える余白を残すことで創造を超えるアイデアを発見できるようにした
* どんなデザインも最初は駄作だよね 
* 衝突がないのは危険信号だ！

## 作業しすぎることの問題（思い込みを捨てる）
* オフィスでは本当の問題は解決できない・・・
* 画面とにらめっこしすぎて、視野が狭くなりユーザー体験が見えなくなる・・・
* ヒアリング遠足 → 実際にユーザーの声を聞いてみよう！
* これからは、オフィス＋リモートワーク＋フィールドワーク になる
* お互いのことを知り信頼関係を気づくのが大事

## 役割分担の問題 （肩書を捨てる）
* 「誰かがやるだろう」の文化・・・良くないね
* 肩書を捨てよう
* ちょっとウザいくらいがちょうど良い
* 問題解決の化学反応を起こす → チーム全体の問題として捉えることで化学反応が起こる
* きれいなジャイアニズム　→ おまえのものは俺のものw

## まとめ
お互いのことを理解・尊敬し、信頼しあうことが重要！

## 質問
* 広めるための工夫は？ → 自らやって結果を出して示していく

# デザイナーとエンジニアの何を変えて開発効率を変えたか？(株式会社VASILY 村田さん)
* 元ヤフーの人
* 41名（デザイナー4名、エンジニア18名）

## ICONについて
200万人、1,400万投稿

## デザイナーとエンジニアの役割の拡張
* ディレクターってやること多いね
* 役割分担が偏るとコミュニケーションコストが高いな
* エンジニアも数値管理をするようにした

## プロダクト開発の仕方を変えた
* プロトタイプを作り、懸賞と修正を重ねる時間帯
* プロトタイプが重要

### プロトタイピングでよかったこと
* 認識のズレが減った
* 検証の効果が高くなった
* 軌道修正が格段にしやすくなった
* プロダクトを速く作る能力がついた

## まとめ
* 社外のUIアドバイザーの意見をもらっている
* プロトタイプをどれだけ速く作り、最後にどれだけ磨ききるかが重要

## 質問
*  数値を見る等の役割の拡張はどうやってるの？ → 人によって決めている（全員ではない）
* リリースサイクル → 1週間〜2週間で回している

# Qiita/Qiita:Teamの開発(Increments株式会社 小西さん)
* サービスを開始して3年
* Qiitaはデザイナー2名、エンジニア3名で作っている

## 文化（意識していること）
* 謙遜(Humility)、尊敬(Respect)、信頼(Trust)
* 属人性の排除 → 人間のSPOFを減らす
* Focus
* [QiitaやKobitoを作る開発チームの文化](http://blog.qiita.com/post/74997115585/increments-dev-team-culture)

## 基板
* ツールは超重要
* Github + Slack + Qiita:Team
* デザイナーもGithubを使っている
* Github：3年間で4600commit（デザイナー）
* [docomoru](http://qiita.com/r7kamura/items/55f398624dbce1c6dc14)は面白い
* 日報もQiitq:Teamを使っている

## 体制
* スクラム（みたいなやつ）→ 自社サービスなので、緩くスクラムをやってる
* 課題の追求
* 検証サイクル（ユーザーヒアリング）
* 常に改善し続ける

## 個人
* 個人が強く主張する
* ポジションを与える
* 一番身近な人から話を聞く
WatchKitでiPhone Appとデータ共有する方法


App Groupsを使います。

App GroupsはiOS8から追加されてApp Extensionでだいたい利用しますが、
WatchKitでも使えます。

### 事前準備

#### App Groupの登録

App Groupsを使うには事前にiOS Dev Centerで登録が必要です。

`Certificates, Identifiers & Profiles > iOS Apps > Identifiers > App Groups`

こちらで、App Groupの情報(App Groups Description / Identifier)を登録します。

今回の例ではIdentifierに"group.com.hoge.example"と指定したことにします。

#### プロジェクトの設定
App Groupsを使うことをプロジェクトに設定します。

`Project > Capabilities > App Groups`をONにします。

先ほど登録したIdentifierが表示されるのでチェックします。
これをiPhone App / Watch Appの両方に対して行います。

### NSUserDefaultsを使う
`NSUserDefaults(suiteName:)`に先ほどのIdentifierを指定します。

```swift
// 設定
var def = NSUserDefaults(suiteName: "group.com.hoge.example")
def?.setObject(123, forKey: "score")
```

```swift
// 取得
var def = NSUserDefaults(suiteName: "group.com.hoge.example")
let score = def?.objectForKey("score") as? Int
```

設定をiPhone App側、取得をWatch App(Watch Extension)側に書けば、
iPhone Appで設定した値をWatch Appで取り出せます。

逆にすればWatch Appで設定した値をiPhone Appで取り出せます。

### ファイルを使う
```swift
// 設定
let fileManager = NSFileManager.defaultManager()
if let path = fileManager.containerURLForSecurityApplicationGroupIdentifier("group.com.hoge.example")?.URLByAppendingPathComponent("score.txt").path {
    // ファイルが無かったら作る
    if fileManager.fileExistsAtPath(path) == false {
        fileManager.createFileAtPath(path, contents: nil, attributes: nil)
    }
    
    // 書き込み
    if var fileHandle = NSFileHandle(forWritingAtPath: path) {
        var score = NSInteger(123)
        var data = NSData(bytes: &score, length: sizeof(NSInteger))
        fileHandle.writeData(data)
    }
}
```

```swift
// 取得
if let path = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.hoge.example")?.URLByAppendingPathComponent("score.txt").path {
    var fileHandle = NSFileHandle(forReadingAtPath: path)
    if let data = fileHandle?.readDataOfLength(sizeof(NSInteger)) {
        var score : NSInteger = 0
        data.getBytes(&score, length: sizeof(NSInteger))
        println(score)
    }
}
```

### CoreDataを使う
Stack Overflowにわかりやすい回答があるのでそちらが参考になります。

[How to access CoreData model in today extension (iOS)](http://stackoverflow.com/questions/25407428/how-to-access-coredata-model-in-today-extension-ios) -StackOverflow

## まとめ
App Groupsに対応しておくとApp Extension対応だけじゃなくWatch App対応も捗る。

参考：
[WatchKit app Architecture > Sharing Data with Your Containing iOS App](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/DesigningaWatchKitApp.html) -Apple Watch Programming Guide
[How to access CoreData model in today extension (iOS)](http://stackoverflow.com/questions/25407428/how-to-access-coredata-model-in-today-extension-ios) -StackOverflow

## P.S.
データ共有の次はコードも共有したくなります。
そんな時はEmbedded Frameworkを作成することになります。

手順はApp Extensionで行う場合と変わらないので
[Developers.IO](http://dev.classmethod.jp)に掲載されてる記事が参考になります。

[[iOS 8] App Extension #2 – Embedded Framework を利用して共有コードを Framework 化する](http://dev.classmethod.jp/references/ios-8-embedded-framework/)
Faild to find: com.android.support:appcompat-v7:21.+ 


参考: http://stackoverflow.com/questions/24607741/android-studio-failed-to-find-com-android-supportsupport-v419-1-0

"Android Support Repository" がインストールされてなかった

Android SDK Manager を開き、"Android Support Repository" をインストールしたら解決。
void value expression メモ

void value expression は、返す値がない式をreturnしたり代入したりすると返されるエラーだそうです。

次のコードで void value expression がでて少し迷いました。

```
return 123 <= 456 and 456 <= 789
```

以下のようにすることで回避できました。

```
return (123 <= 456 and 456 <= 789)
```

### ちなみに
これはエラーを返さないみたいです。

```
return 123 <= 456 && 456 <= 789
```

これは、Rubyのandと&&の優先度の違いによるもののようです。
andの方が低いです。
=> http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2foperator.html#and
App Storeに上がっているアプリを譲渡する方法


iTunes connectが日本語化される前は「Transfer App」とか言われていたもの

2014/11/01時点での方法

## 譲渡条件
1. Apple IDが保留または変更中ではない

2. 以下の機能が譲渡可能な状態
iCloud
Passbook
In-App Purchase

詳しくは [iOS Developer Library アプリケーションの譲渡と削除](https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_Jpn/Chapters/TransferringAndDeletingApps.html)

## 譲渡するために必要なもの
アプリを譲渡するためには送り先の次の２つの情報が必要になります
1. Recipients's Team Agent Apple ID
2. Team ID

これらは Apple Developer > Member Center > [Account Information](https://developer.apple.com/membercenter/index.action#accountSummary) で確認することができます

![re0.png](https://qiita-image-store.s3.amazonaws.com/0/33505/96c12d8d-e12c-f204-a6ff-294d8c9703a6.png "re0.png")


## 譲渡元の手続き
まずはアプリを譲渡する側から以下の方法でおこなっていきます

### 1.譲渡するアプリを選択

[iTunes connect](https://itunesconnect.apple.com/)から、譲渡したいアプリを選択し マイAPP の詳細を開く
![re1.png](https://qiita-image-store.s3.amazonaws.com/0/33505/e0c64792-66c9-0337-2f6f-2518ce507423.png "re1.png")
`その他`から`Appを転送`を選ぶ

> You must meet the criteria below before you can initiate an app transfer.

と表示されたページがひらかれる
ここで何か問題があれば、エラーが表示される

問題がなければ `Continue` で進む

### 2.譲渡先の指定

![re2.png](https://qiita-image-store.s3.amazonaws.com/0/33505/acd7badf-75fc-f84b-01bd-bd5738511fc2.png "re2.png")
譲渡先の Apple ID と Team ID を入力し `Continue` で進む

### 3.譲渡する

> APPLICATION TRANSFER AGREEMENT
が表示されるので、問題がなければ `Continue` で進む

![re4.png](https://qiita-image-store.s3.amazonaws.com/0/33505/971aa065-7563-959d-2303-ebbf9a0f9827.png "re4.png")
譲渡側の手続きが完了すると マイ App には、上図のインフォメーションが表示される

### 譲渡のステータスの確認やキャンセル

アプリの譲渡のステータスや、譲渡自体のキャンセルは iTunes Connect > 契約／税金／口座情報 から選択できる
![れ５.png](https://qiita-image-store.s3.amazonaws.com/0/33505/23d525da-6203-b346-0726-2c9140784dc2.png "れ５.png")

## 譲渡先の手続き
次にアプリを譲渡される側から以下の方法でおこなっていきます

### 1.受け取りの確認

上記までの対応を譲渡側で行われると、アプリの受け取り側の iTunes Connect では、次のようなリクエストが届く
![れ６.png](https://qiita-image-store.s3.amazonaws.com/0/33505/ee1a0209-61a6-a82c-f608-e2c7eb077460.png "れ６.png")
契約／税金／口座情報 から選択できる

### 2.受け取りの許可

あとは流れにそればOKです...(´Д｀)書くの飽きた。
URLSchemeでの起動をXcodeでデバッグする方法

EditSchemeの中の、Runを選んで、Infoタブを表示するじゃろ。
その中に「Wait for executable to be launched」っていうのがあるじゃろ。
これを選んでXcodeのデバッグを実行すると自動でアプリが立ち上がらなくなるんじゃ。

そして、safariとかでURLSchemeを使ったURLを叩くじゃろ。
すると、アプリが立ち上がって、そのタイミングでデバッガーが仕事を始めるんじゃ。

アプリ起動中にURLSchemeが叩かれたら、とか、通知が来たら、というプログラムは普通にもデバッグできるけど、
アプリが立ち上がっていない状態でURLSchemeが来たらとか、通知から起動したら、というデバッグはこれを使う必要があるんじゃ。

わかったかの。
Atomで日本語がうまく改行してくれない問題を解決

# Atom 1.2.4 にて
久々に需要があってAtomを入れ直したところ、
japanese-wrap(0.2.7)を入れていることにより残念ながら変な挙動（入力するたびに改行が混ざって正常に入力できない）になることが分かったので、Uninstallした。
ありがとうjapanese-wrap!

Help > Welcome Guide > Install a Package の Open Installer > Search Packageにて名前入力して探すと、InstallしたりUninstallしたりが簡単にできる。すごい。

以下古い記事ですがとりあえず置いておきます。
----

# 利用シーン
いつも主にmarkdownの文章を書くときにAtomを使っているんですが、日本語の改行がうまくいかないことに気づきました。つらい。
\# こんな感じ〜という画像入れようと思ったら大きいの出しすぎて制限にひっかかりました、残念

# 導入方法
このPackageを導入 -> https://github.com/raccy/japanese-wrap

\#上記URLに書いてあるままだけど一応詳細を下記に書いておきます。
\#MacOSXです

1. Atom > Preferences... > SettingsでSettingsを開く
2. Settings 項目を確認して以下にチェックをつけておく（ちょっとスクロールしたところにあった）
    - Soft Wrap
    - Soft Wrap At Preferred Line Length
3. Install 項目 > japanese-wrap を検索、出てきたのをインストール
4. Atomを再起動

快適です！

#追記メモ
- 2015/05/03
 - Atom 0.196.0 で Preferencesの内容が変わっていたのを確認したので修正
 - なんだかAtomバージョンアップのためか残念ながら Failed to activate が...しばらく様子見？
CakePHP input typeの自動設定


_magicOptions

CakePHP 2.4.5だと /Cake/View/Helper/FormHelper.php L1137

このfunctionを見ればどこまで動的にinputタグを生成してくれているかがわかる。

使っていて一番便利だと思ったのは、テーブルのカラム名のsuffixを_idとすること。

こうすることでViewを表示するとselect boxができあがっている。

よって、DBもCakePHPを使うとなれば命名規約も先に整理するのがベスト。

よく使うメモ

| カラム名 | 型 | type |
|:--:|:--:|:--:|
| (xxx)_id | - | select |
| - | boolean | checkbox |
|-|date|月-日-年|
|-|text|textarea|
|'psword' or 'passwd' or 'password'|-|password|
|'tel' or 'telephone' or 'phone'|-|tel|
[Unity][GUI] スクリプトから Button を作ろう


Unity のスクプトには, GUI というクラスが定義されており
これを使うことで簡単にボタンやテキストフィールドといった GUI を作ることができます.

ただ, 処理としては重いのでデバッグ機能を作るときなどに使いましょう♪

## Button を作ろう!

まず, 適当なスクリプトを作って `OnGUI()` というメソッドを定義します.

```cshape
public class ButtonTest : MonoBehaviour {

    void OnGUI() {
    
    }
    
}
```


この OnGUI の中でボタンやテキストを生成すると画面上に表示されます.
ボタンを生成するには `GUI.Button(四角形, 表示する文字列)`を使います.

```
void OnGUI() {
    if ( GUI.Button(new Rect(20, 20, 100, 40), "Button") ) {
        Debug.Log ("pushed!");
    }
}
```

Unity で実行してみてください.
画面上にボタンが表示されているのがわかるかと思います.

![button1.png](https://qiita-image-store.s3.amazonaws.com/0/7756/e38b6f8b-0a66-6c0e-90f9-027aa6b703f6.png "button1.png")


なぜ if 文で囲っているかというと, GUI.Buttton は押された時のみ true を返すので
こうすることで押した時のみ行う処理を書くことができます.

今回でいうと `Debug.Log ("pushed!");` が押した際に行う処理にあたります.

押すと下図のように Console パネルに "pushed!" という文字列が表示されるのが
わかるかと思います.

![button2.png](https://qiita-image-store.s3.amazonaws.com/0/7756/545d1fa3-b6e7-0297-df2f-b799cd2ee470.png "button2.png")

OnGUI って毎フレーム呼ばれてるんですよね.
そりゃ重いわ.

以上, 備忘録でした.
HipChat APIでファイルを送ろうとしてはまった

##やりたいこと
HipChatのルームにスクリプトでファイルを送りたい

##やってみた
curlでローカルのファイルを送ってみた。

    curl https://api.hipchat.com/v2/room/${ROOM_ID}/share/file?auth_token=${API_TOKEN} -X POST -H "content-type=multipart/related" -F 'file=@sample.jpg;type=image/jpeg'

- HipChat API V2 https://www.hipchat.com/docs/apiv2/method/share_file_with_room


##できない。。。
エラーが返ってくる。

    {
    	"error": {
    	"code": 400,
    	"message": "Request must be sent using UTF-8",
    	"type": "Bad Request"
    }

なぜか文字コードを怒られる。。。

　
切り分けのためにテキストファイルを送ってみる。

    curl ttps://api.hipchat.com/v2/room/${ROOM_ID}/share/file?auth_token=${API_TOKEN} -X POST -H "content-type=multipart/related" -F 'file=@hoge.txt;type=text/plain'
　

    {
    	"error": {
   		"code": 400,
    	"message": "The request requires a properly encoded body with the 'content-type' header set to '['multipart/related']",
    	"type": "Bad Request"
    }


お、エラーが変わった。
でもcontent-typeはmultipart/relatedで指定してるはず。。。
　
試しにcurlに--trace-asciiオプションをつけて中身を見てみる。

    〜
    00d5: Content-type:multipart/form-data;
    〜
あれ。。。

##出来た
結局、書き方が違ってただけという。
× "content-type=multipart/related"
○ "Content-type:multipart/related"

    curl https://api.hipchat.com/v2/room/${ROOM_ID}/share/file?auth_token=${API_TOKEN} -X POST -H "Content-type:multipart/related" -F 'file=@sample.jpg;type=image/jpeg'
で出来た！
インテルが求める「FPGAアプリケーションエンジニア」とはこんな人

なんとインテルが、[FPGAアプリケーション エンジニアなる職種で求人](https://app.work4labs.com/job/standalone/46532481/151643501347)を始めてた。

![Screen Shot 2014-12-18 at 17.27.50.png](https://qiita-image-store.s3.amazonaws.com/0/38290/5545ead1-c3e5-3b94-c48a-57208ec1c9fc.png)

From [Jobs at Intel](https://app.work4labs.com/job/standalone/46532481/151643501347)

この募集要項がいろいろ味わい深いので、まとめてみた。

### 目的：次世代のクラウドをFPGAでつくる

```
The DCG/CPG (Data Center Group/Cloud Platform Group) team develops technologies that accelerate cloud computing. We are looking for FPGA Application Engineers to help us deliver the next generation cloud computing platforms.
```

目的はずばり、「次世代クラウドプラットフォームの構築」。単なる組み込みデバイスの開発じゃなくて、データセンター／クラウドプラットフォームチームの採用なのだ。あの大きなお客さんのお手伝いもしたりするのかな。。？

```
Your primary responsibility will be optimizing different workloads using tightly coupled FPGA accelerators. Duties will include:
- Designing and developing RTL code using Verilog,
- Developing and debugging CPU Host SW that effectively offloads parts of workloads to FPGA,
- Developing OS and device drivers
```

お仕事内容は、FPGAアクセラレータの開発。

- Verilog HDLでハードウェア実装したり、
- FPGAに仕事を割り振るホストCPU側のソフトを書いたり、
- それらの**OS**やデバドラを書いたりしてもらうよ

あっ、ハイ。OSからですかそうですか。

### 求められるスキル

インテルが求めるFPGAアプリケーションエンジニアはこんな人だ！

```
- Experience in programming in C and/or C++ and assembly language,
- Experience in design,development and debugging of multithreaded programming code,
- Experience in hardware development using Verilog or System Verilog (or VHDL),
- Familiarity with FPGA design tools used for RTL development,
- knowledge of network protocols(TCP/IP),
- knowledge of storagetechnologies (RAID, file system),
- familiarity with revisioncontrol systems (GIT),
- Very good Linux OS understanding and experience in software development for Linux.
- Good English communication skills, both written and oral,
- Disciplined design approach, and ability to work smoothly with a team.
```

- C/C++とアセンブラ書けて、マルチスレッドの設計や開発は当然できて
- Verilog HDL/VHDLもすらすら書けて、FPGA開発ツールの経験もあって、
- TCP/IP熟知しつつ、RAIDやファイルシステムも理解し、
- 当然gitを日々使ってて、
- Linux OSの中身に精通し、
- 英語の会話も読み書きもすらすら、チームとのコミュニケーションもまかせとけっ

あっ、ハイ。

うちの東京オフィスにはこういう宇宙人がちらほらいて、それはそれでどんな会社やねんと思うのだけど。

さらに、あると望ましいスキル：

``` 
- Knowledge of CPU architecture, general GPU architecture,
- Prior experience working with heterogeneous (FPGA, CPU, GPGPU) hardware systems,
- Subject matter expertise in a particular class of algorithms, e.g. speech, cryptography, compression, image processing, etc,
- Activity in opensourcecommunity,
- Familiarity with computernetworks management (QoS,routing)
- OpenStack.
```

- 俺様CPUアーキ作れるぜ
- そういやFPGA/CPU/GPUヘテロ開発の経験もあるし
- 音声認識・暗号化・圧縮・画像処理もやったっけ
- GitHubにもいろいろ上げてるし
- ネットワークのQoSやルーティングも書けるかな
- OpenStackね。知ってる。

そんなサイヤ人どこにいるんだ……これは俺のことだろ！って方は、ポーランドのグダニスクにあるインテルオフィスで優雅な謎FPGA開発に携われるらしいので、ぜひぜひご応募あれ。
配列のマージって色々ある

PHPは色んな便利標準関数があって助かります。

そんな中でも、配列のマージ（合体）で希望通りの動きを実現するまでに
結構時間がかかってしまったのでメモ。

[こちら](http://qiita.com/pb_tmz08/items/6cc51290be9f5b602abb)も参考にしましたので、合わせてご覧ください。

# 前提
* 多次元配列
* キーは数字・文字混合で、変化させない（これが厄介でした）
* 配列`$before`を元として、`$artisan`をマージする
* キーが`$before`になく`$artisan`にあるものは単純に加える
* キー`$before`にも`$artisan`にもあるものは、`$artisan`の値で上書きする
* 結果は出来る限り`$after`に（`$before`や`$artisan`を変える形になっても良し）

# こんな配列を想定する

```php
$before = array(
    '0' => 0,
    '1' => array(
        '0' => 0,
        '1' => 1,
    ),
    '2' => 2,
    'string' => 'string',
);

$artisan = array(
    '0' => '000',
    '1' => array(
        '0' => '000',
        '2' => '222',
    ),
    'string' => 'STRING',
    '3' => 3,
);
```

## 結果の想定

```php
$after = array(
    '0' => '000',
    '1' => array(
        '0' => '000',
        '1' => 1,
        '2' => '222',
    ),
    '2' => 2,
    'string' => 'STRING',
    '3' => 3,
);
```

# array_merge

```php
$after = array(
    '0' => 0,
    '1' => array(
        '0' => 0,
        '1' => 1,
    ),
    '2' => 2,
    'string' => 'STRING',
    '3' => '000',
    '4' => array(
        '0' => '000',
        '2' => '222',
    ),
    '5' => 3,
);
```

キーが文字列の場合はきちんとマージされているが、
キーが数字の場合は添え字を振り直している。

# array_merge_recursive

再帰的にマージする関数。

```php
$after = array(
    '0' => 0,
    '1' => array(
        '0' => 0,
        '1' => 1,
    ),
    '2' => 2,
    'string' => array(
        '0' => 'string',
        '1' => 'STRING',
    ),
    '3' => '000',
    '4' => array(
        '0' => '000',
        '2' => '222',
    ),
    '5' => 3,
);
```

数字のキーは先ほどと変わらず、重複があった場合は振り直し。
文字のキーは重複があった場合、配列として全て保持するように変更されている。

# +（プラス）演算子

```php
$after = array(
    '0' => 0,
    '1' => array(
        '0' => 0,
        '1' => 1,
    ),
    '2' => 2,
    'string' => string',
    '3' => 3,
);
```

キーは文字数字問わず、重複する場合は＋演算子の前にある配列が優先され、
子要素などを持っていようと、評価していない。
一次元目のキーだけを見て、重複していないもののみ追加している様子。

# foreachで再帰的に回してみる

[こちら](http://okwave.jp/qa/q5273084.html)より。

```php
function mymerge($arr1, $arr2)
{
    foreach($arr2 as $key=>$value) {
        if(!is_array($arr1)) {
            $arr1 = array($arr1);
        }
        if(is_array($value)) {
            $arr1[$key] = mymerge($arr1[$key], $value);
        } else {
            $arr1[$key] = $value;
        }
    }
    return $arr1;
}
```

```php
$after = array(
    '0' => '000',
    '1' => array(
        '0' => '000',
        '1' => 1,
        '2' => '222',
    ),
    '2' => 2,
    'string' => 'STRING',
    '3' => 3,
);
```

素晴らしい。要件通りです。

けれど、foreachで回すとなると大規模データでの速度が気になります。
（速度の検証はしませんが）他の手段はないものか探していたら…

# array_replace_recursive

```php
$after = array(
    '0' => '000',
    '1' => array(
        '0' => '000',
        '1' => 1,
        '2' => '222',
    ),
    '2' => 2,
    'string' => 'STRING',
    '3' => 3,
);
```

おお、まさかのreplace。盲点でしたが要件通りで完璧な挙動です。
同じく検証をしていないため、ひょっとしたらforeachと大差ないかもしれませんが、
標準関数なので信用しちゃいます。


# 追記
`array_diff`とか`array_intersect`とかでも考えていたのですが、頭がパンクしたのでストップ。
これ以外にも上手いやり方がありましたらぜひご教示下さい。
正規表現：RegExp('Hello\sworld!')はマッチしない

ハマったのでシェアします。

RegExpを使ってマッチさせるには以下のように書きます：

```js
var re = new RegExp('Hello\\sworld!');
```

**`\s`や`\W`といった正規表現を使う場合は、RegExpを使うとわかりにくくなってしまう**ので、個人的にはそういうときは以下のような書き方にしておいた方が良いと思います。

```js
var re = /Hello\sworld!/;
```

なお、以下の追記2にある通り`RegExp`を使わないとできないこともあります。

### 追記1

[mattn](http://qiita.com/mattn)さんより以下のアドバイスをいただきました。ありがとうございます。

```js
/Hello\sworld!/
```

は正規表現リテラルなので`\s`をエスケープする必要はありません(見たまま解釈されます)。

しかし

```
RegExpr('Hello\sworld!')
```

は文字列なので`RegExp`に正しく`\s`(つまり`\`と`s`の2文字)を渡すにはエスケープして`\\s`とする必要があります。

### 追記2

[think49](http://qiita.com/think49)さんより以下のアドバイスをいただきました。ありがとうございます。

`new RegExp`は引数に変数を取れるのが利点です。
例えば、次のケースでは`new RegExp`を使わないと書けません。

```js
var word = 'World!';
var reg = new RegExp('Hello\\s' + word);
console.log(reg.test('Hello World!')); // true
```

実用的には正規表現メタキャラクタのエスケープ処理が必要です

---
ブログやってます：[Weed software](http://weed.cocolog-nifty.com/wzero3es/)
Qiitaの二段階認証でログインできなくなった場合！！


Qiitaを使ってて２段階認証ができなくなった場合の対処法についてまとめました。
携帯を買い換えたりして２段階認証ができなくなった場合、バックアップコードからログイン出来るらしいですが、いままでそのバックアップコードの使い方を知らなかったので、

# バックアップコードの使い方
バックアップコードをダウンロードされる方も多いと思いますが、そのままコピペして登録すると「不正なコードです」と言われてしまいます。

ログイン出来なくてすごく焦りました。。

サポートにメールさせてもらって初めてわかったのですが、実は全部コピペするとダメだそうです。

ダウンロードしたファイルが以下の様な場合


>98xxx-c0d22
f2bbb-c32ss
37ccc-05bqq
77ddd-ef2dd
eeeee-f0css
0afff-e71xx
b9ggg-ad6dd
b0hhh-d1fff
3byyy-57dbg
2e8ii-echhh
b4qwe-74juj
a7qqq-0360j
f1www-f2kkk
c8eee-55ree
b4rrr-fdyuu
7cttt-f2iuy
1ayyy-b3ewr
2euuu-c8tre
6aiii-c5uyt
8aooo-1ee32


これって実は１行だけ使えばいいそうです。
最初から親切にたくさんコード書いてくれなくていいのに。。。

実際に使うのは

98xxx-c0d22

みたいな感じで１行だけだそうです！


どこにも説明書いてなかったのでログインできなくなって苦労しました。
何も知らないで全部のコードコピーして入力フォームに貼付けしてました。。

皆さん、気をつけてくださいね。
peco とjqを使ってaws へのSSHを楽にする

EC2インスタンスへアクセスするsshの鍵(~/.ssh/)とホストのタグ名をpecoで選択してec2-userでログインする
VPC前提なので、GIPで直接SSHの場合は要修正

```zshrc

function awsssh(){
  SSH_TARGET_HOST="$(aws ec2 describe-instances|jq -r '.Reservations[].Instances[].Tags[].Value'|peco)"
  ssh -i ~/.ssh/"$( ls ~/.ssh/ |peco)" ec2-user@"$(aws ec2 describe-instances|jq -r --arg SSH_TARGET_HOST $SSH_TARGET_HOST '.Reservations[].Instances[]|select(.Tags[].Value == $SSH_TARGET_HOST )|.PrivateIpAddress'|peco)"
}
```
ローポリでも角が見えないレンダリング方法のアイデア

ローポリなモデルをフォンシェーディングで補間する場合、普通は物体の縁とかにポリゴンの頂点が来ちゃったりしてそこだけ角になったりする。

これを解消するためには法線が向こう側を向いている点では描画しないという処理が必要になる。フラグメントシェーダの出力で描画それ自体を抑制するとなるとアルファテストに失敗させることで目的を達成できる可能性がある。

つまり頂点シェーダの出力に法線を含めてフラグメントシェーダでは法線が向こう側を向いていたらアルファテストに失敗するような計算をしておけばいい。上手くすればピクセル単位で縁を補完できるのでジオメトリシェーダーで同様に補完するより軽くてきれいな結果になる。ピクセル単位のカリングだ。

しかしフラグメントシェーダだけではポリゴン内部にしか描画できないのでこの方法だとモデルより小さく描画されてしまう。そこで向こう側の頂点まで倒れちゃってるポリゴンを真の稜線を通るように頂点シェーダで引き起こす。これで稜線のところにちょうど法線が真横を向いている点が来ればあとはフラグメントシェーダで余計な部分を切り落とせる。

残る問題は「真の稜線を通る」って点だ。もちろんこれは補間して求めた点でありモデリング時の真の稜線ではないのだがとりあえずそう呼んでおく。モデリング時のそれは「モデルの稜線」とでもしておこう。
OpenStackのVNCコンソールで:(コロン)が入力出来ない

### 事象

OpenStackのVNCコンソールで:(コロン)が入力出来ない。というか、日本語キーボードで入力出来ない。
しかも、用意されているクラウドイメージのパスワードにコロンが使われているため、ゲストにログインすることも出来ない。

### 対処

#### 恒久対処(既に作成されているインスタンスには無効)

Computeノードの/etc/nova/nova.confに以下を追記。

```
vnc_keymap=ja
```

サービス再起動。
```
$sudo service nova-compute restart
```

これで新規に作成されるインスタンスは日本語キーボードが有効になるはず。

#### 既に作成されているインスタンスでの設定

virshで直接書き換えます。ゲストをシャットダウンした後、

```
$virsh list -all (該当インスタンス名確認)
$virsh edit *** （該当インスタンス名）

<graphics..>のkeymapパラメータを'ja'に変更
```

インスタンスを起動すればOK。

■参考
OpenStackのダッシュボードで日本語キーボードがうまく使えない | Works | URAMIRAIKAN http://www.uramiraikan.net/Works/entry-1999.html

Openstack noVNCのコンソールで日本語キーボードを使用するための方法 https://gist.github.com/takekawa/3869340
$A.componentService.newComponentAsyncが動作しない、改めうまく動いたよ

$A.componentService.newComponentAsyncが動作しないですね・・・で、困ってる。

```hoge.cmp
<aura:component>
    <ui:button aura:id="foobar" label="submit me!" press="{!c.doInit}" />
</aura:component>
```

```hogeController.js
({
	doInit : function(component, event, helper) {
        console.log('clicked!');
		$A.componentService.newComponentAsync(
        	this,
            function(newButton){
               	newButton.addHandler('press',component,'c.doInit');
                var body = component.get('v.body');
                body.push(newButton);
            },
            {
                "componentDef": "markup:// ui:button",
                "localId":"myLocalId",
                "attributes" : {
	                "values":{"label":"Submit"}
                }
            }
        )
    },
    
})
```

うーんうーんと悩んでいたところ、@twk　から「[これで](http://qiita.com/twk/items/e2c8f061795b7a377353)できるよ、ボケッ」というツッコミをもらいました。で見なおしてみたところ・・・
☓"markup:// ui:button"　→　◎"markup://ui:button"　余計なスペースが入っているのを発見し、修正・・・で、結果、ちゃんと動作しました。

```
<aura:component>
    <ui:button aura:id="foobar" label="submit me!" press="{!c.doInit}" />
    <div aura:id="hogehoge"/>
</aura:component>
```

```
        $A.componentService.newComponentAsync(
            this,
            function(newButton){
                newButton.addHandler('press',component,'c.doInit');
                var c = component.get('hogehoge')
                console.log(c);
                c.set("v.body",newButton);
            },
            {
                "componentDef": "markup://ui:button",
                "localId":"myLocalId",
                "attributes" : {
                    "values":{"label":"Submit"}
                }
            }
        );
```
Go 言語でCSVをドラッグアンドドロップして簡単収益シュミレーション

ソース or 実行ファイルダウンロード
======
[github]
https://github.com/kuxuxun/go_lang_calculation_sample

[実行ファイル]
https://raw.githubusercontent.com/kuxuxun/go_lang_calculation_sample/master/calc_all_win.zip

何?
======
なにかサービス作ろうとしたとき、ユーザ数とか課金率とかのパターンとか いくつか出して
全パターン掛け算してなんとなくそれぞれのリターンがいくらになるか見たいじゃないですか。

いかにもエクセルな感じのお仕事ですけど、 われわれはエンジニアなのでエクセルとか可能な限り開きたくないわけじゃないですか。
なのでCSVドラッグアンドドロップすると全パターンの掛け算して吐き出すだけのスクリプトをGoでちゃちゃっと作りました。

例えば
======

|想定ユーザ数|想定課金率|想定ARPPU|
|------------|----------|---------|
|1000|0.01|1000|
|10000|0.3|2000|
|50000|||

というデータをCSVで用意してexeにドラッグアンドドロップすると

|想定ユーザ数|想定課金率|想定ARPPU|計算結果|
|------------|----------|---------|--------|
|1000.0000|0.0100|1000.0000|10000.0000|
|1000.0000|0.0100|2000.0000|20000.0000|
|1000.0000|0.3000|1000.0000|300000.0000|
|1000.0000|0.3000|2000.0000|600000.0000|
|10000.0000|0.0100|1000.0000|100000.0000|
|10000.0000|0.0100|2000.0000|200000.0000|
|10000.0000|0.3000|1000.0000|3000000.0000|
|10000.0000|0.3000|2000.0000|6000000.0000|
|50000.0000|0.0100|1000.0000|500000.0000|
|...|...|...|...|

といった感じのファイルを吐き出します。

コード
======
```go

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"

	"code.google.com/p/go.text/encoding/japanese"
	"code.google.com/p/go.text/transform"
)

func noErrorOrPanic(err error) {
	if err != nil {
		panic(err)
	}
}

func validate(records [][]string) {
	if len(records) == 0 {
		panic("ファイルが空っすね")
	}
}

func main() {
	if len(os.Args) < 2 {
		panic("ファイルを指定してください")
	}
	file, err := os.Open(os.Args[1])

	noErrorOrPanic(err)
	defer file.Close()

	reader := csv.NewReader(transform.NewReader(file, japanese.ShiftJIS.NewDecoder()))

	var records [][]string
	for {
		record, err := reader.Read()
		if err == io.EOF {
			break
		} else {
			noErrorOrPanic(err)
		}

		records = append(records, record)
	}

	validate(records)
	header, data := records[:1][0], records[1:]

	// 転置
	var vs [][]float64 = make([][]float64, len(header))
	for _, row := range data {
		for col := 0; col < len(header); col++ {
			if v, err := strconv.ParseFloat(strings.Trim(row[col], " "), 64); err == nil {
				vs[col] = append(vs[col], v)
			}
		}
	}

	output, err := os.Create(file.Name() + ".calc.csv")
	defer output.Close()
	writer := csv.NewWriter(transform.NewWriter(output, japanese.ShiftJIS.NewEncoder()))

	writer.Write(append(header, "計算結果"))

	toStrs := func(nums []float64) []string {
		ss := []string{}
		for _, n := range nums {
			ss = append(ss, fmt.Sprintf("%.4f", n))
		}
		return ss
	}

	multipleAll := func(nums []float64) {
		r := 1.0

		for _, n := range nums {
			r = r * n
		}
		writer.Write(toStrs(append(nums, r)))
	}

	var d []float64
	walk(vs, d, multipleAll)

	writer.Flush()
}

func walk(datas [][]float64, currentDatas []float64, proc func([]float64)) {
	currentLevelDatas, nextLevelDatas := datas[:1][0], datas[1:]
	if len(nextLevelDatas) == 0 {
		for _, each := range currentLevelDatas {
			ds := append(currentDatas, each)
			proc(ds)
		}
		return
	}

	for _, each := range currentLevelDatas {
		ds := append(currentDatas, each)
		walk(nextLevelDatas, ds, proc)
	}

}
```
感想
======
営業さんやマーケターの方が何かお困りで、何か作ってあげたい、となった時、
Goだとexeにコンパイルしてちゃちゃっとばら撒けるので楽ですね。
Railsで静的なページの管理をするgem Magazineを作った

最近小さなgemをたくさん作ることに凝っています。

今回はRailsで静的なページの管理をするためのgemを作りました

magazine | RubyGems.org
http://rubygems.org/gems/magazine

## 使い方

### インストール

まずはGemfileにmagazineを足してインストールして下さい

```
$ vim Gemfile
+ gem 'magazine'

$ bundle install
```

### config/magazine.yml

インストールできたらconfig/magazine.ymlにルーティングに必用なデータを作成します
最低限必要なのは```category_slug```と```articles```以下の```slug```のみです

```
# config/magazine.yml
-
  category_slug: ruby
  articles:
    -
      slug: array
```

### config/routes.rb

次にMagazine::Engineを任意のパスにマウントします

```
# config/routes.rb
MyApp::Application.routes.draw do
  mount Magazine::Engine => '/language'
end
```

すると以下のパスが追加されます

```
magazine /language  Magazine::Engine

Routes for Magazine::Engine:
          root GET  /                                       magazine/articles#index
category_index GET  /:category_slug(.:format)               magazine/articles#index
       article GET  /:category_slug/:article_slug(.:format) magazine/articles#show
```

パスのヘルパーは、以下の３つが使えるようになります

- ```magazine.root_path```
- ```magazine.category_index_path```
- ```magazine.article_path```

### viewを作る

config/magazine.ymlで定義したデータの通りに```/language/ruby/array```というrouteが通るようになっていますので```app/views/magazine/articles/show.html.erb```等のファイルを作成して以下のようにするとymlで定義したデータを取り出せるようになっています。

```
<%= @magazine_rack.data.to_json # yml内のすべてのデータ %>
<%= @category.to_json # 現在のカテゴリーと内包するすべてのarticleデータ %>
<%= @article.to_json # 現在のarticleデータ %>
```

### ヘルパー
- ```magazine_image_tag```
    - app/assets/images/magazine以下のフォルダとファイルを現在のパスに合わせて組み立てる
    - /language/ruby/arrayにアクセスしている場合は```magazone_image_tag('thumb.jpg') # => /images/magazine/ruby/array/thumb.jpg```となる

## 何かあれば

ここにコメントかgithubまでお願いします
Vagrantのコマンド(Basic)

vagrantboxを作りすぎて整理するためにコマンドをいろいろ調べたので、その中でも基本的なのを自分のメモ用に記す

##Vagrantでboxを作成
###前提条件
1. Virtualboxがインストールされている
2. Vagrantがインストールされている
3. ここで使うPCはMacOSである
4. [Vagrantbox](http://vagrantbox.es)サイトから作りたいBoxのURLをコピーしておく

###Box作成
```shell-session

1. vagrantboxを作成したい場所に移動
2. vagrant add box hoge 先ほどコピーしたURL
3. vagrant init hoge

```


##Vagrantコマンド

```コマンド #使う場面```

### 起動
```vagrant up #vagrantを起動したいとき```

### 終了
```vagrant halt #vagrantを終了したいとき```

### 再読み込み
```vagrant reload #Vagrantfileを編集したとき```

### SSH接続
```vagrant ssh #ssh接続したいとき```

### vagrant一覧表示
```vagrant box list #vagrantのboxを一覧表示```

### 破壊
```vagrant destroy #vagrantを真っさらにしたいとき```

### Boxの削除
```vagrant box remove hoge #hogeという名前のboxを削除```
Pythonでの機械学習を支援するツール MALSS（導入）

<Font color="red">Python3に対応しました(2016.01.25)</font>

Pythonでの機械学習を支援する，MALSS（Machine Learning Support System）というツールを作ってみました（[PyPI](https://pypi.python.org/pypi/malss/)／[GitHub](https://github.com/canard0328/malss)）．
色々ご意見頂けると嬉しいです．

こちらに続きを書いています．
・[Pythonでの機械学習を支援するツール MALSS（基本）](http://qiita.com/canard0328/items/5da95ff4f2e1611f87e1)
・[Pythonでの機械学習を支援するツール MALSS（応用）](http://qiita.com/canard0328/items/3713d6758fe9c045a19d)

# 目的
オープンソースの開発環境が充実したことで，機械学習を **使う** のが本当に簡単になりました．
しかし，特に勉強をしなくても簡単に使えてしまえるからこそ，思わぬ落とし穴にはまってしまうこともあるのではないでしょうか．
MALSSは特に初学者がはまってしまいがちな部分を自動化するとともに，機械学習の使い方についても学んでもらえることを目指して開発しました．
また，熟練者にとっても分析の導入部分を自動化することで効率化に貢献できるのではと思います．

# 対象
ビジネスにおける機械学習の適用先として，以下の2つが挙げられます．

- データ分析案件
- **システム開発案件**

データ分析案件ではデータから何らかの知見を発見することが求められます（データマイニング）．
一方，システム開発案件では，未知のデータを用いて何らかの予測などを行うモデルをシステムに組み込んで使用します．
本ツールは後者の **システム開発案件** 向け機械学習を支援することを想定しています．これは，システム開発案件むけ機械学習の方が，初期の検討段階でパターン化（自動化）できる部分が大きいと考えているからです．

また，機械学習の分類として，

- **教師あり学習**
- 教師なし学習

があります．
教師あり学習は，データが入力と出力のペアからなるもので，出力が数値で，入力からそれを予測する回帰（regression）と，出力がカテゴリ値で，入力からどのカテゴリに分類されるのかを予測する分類／識別（classification）があります．
教師なし学習は，データが入力だけからなるもので，入力をなんらかの基準でカテゴリ分けするクラスタリング（clustering）や，外れ値検出（outlier detection）などがこれに該当します．
本ツールは前者の **教師あり学習** を対象としています．これも，教師あり学習の方がパターン化できる部分が大きいと考えているからです．

# 導入
## 依存関係
MALSSは以下のパッケージに依存しています．
インストール時に依存パッケージを自動でDLしたりはしないので，お手数ですが手動で対応してください．
[Anaconda](https://store.continuum.io/cshop/anaconda/) なら全部入っているので便利です．

- python (>= 2.7 or >= 3.4)
- numpy (>= 1.10.2)
- scipy (>= 0.16.1)
- scikit-learn (>= 0.17)
- matplotlib (>= 1.5.1)
- pandas (>= 0.14.1)
- jinja2 (>= 2.8)

## インストール
コマンドラインから
`pip install -U malss`
でインストールできます．

または，[PyPI](https://pypi.python.org/pypi/malss/) や [GitHub](https://github.com/canard0328/malss) からソースをDL，解凍して展開先ディレクトリに移動，コマンドラインから
`python setup.py install`
でインストールできます．

# なぜPythonか
機械学習の部分を[scikit-learn](http://scikit-learn.org/stable/)にお任せしているからです．

# おわりに
ツールとしてまだまだ至らない点あると思うので，色々ご意見頂けると嬉しいです．
[次回](http://qiita.com/canard0328/items/5da95ff4f2e1611f87e1)は具体的な使用方法について書きたいと思います．
Visual Studio 2013からGitを使う

昔はgitbashを使っていたのですが、最近Visual StudioからGitを操作するようになったので、Visual StudioからGitを扱う際の各画面について解説します。Gitは勉強中なので、私の分かる範囲で…

##ホームと接続
Visual Studioのバージョン管理機能にアクセスするには、「表示>チーム エクスプローラー」を開きます。次のような画面が開きます。
![git1.png](https://qiita-image-store.s3.amazonaws.com/0/32800/6effbaf7-648e-d0ae-519c-d02a3f96b2f3.png)
ホーム画面からは、変更、分岐、同期、設定画面へ飛ぶことができるようになっています。この画面には、現在"接続"されているリポジトリ内のソリューションが表示されています。各画面では、接続されているリポジトリに対して操作を行うことになります。接続先のリポジトリを切り替えるには、「接続」ボタン(コンセントのプラグのようなアイコン)をクリックします。次のような画面が開きます。

![git2.png](https://qiita-image-store.s3.amazonaws.com/0/32800/7d31e130-30ed-9ae8-c0f3-742707cfc2d3.png)
「ローカル Git リポジトリ」から目的のリポジトリをダブルクリックして接続できます。
「新規」から、新しいリポジトリを追加することができます。新しいフォルダが作成され、`git init`され、gitignoreなども追加されます。
「追加」から、既存のリポジトリを追加することができます。
「複製」から、リモートからリポジトリを`git clone`することができます。

以下、変更画面と同期画面について説明します。

##変更
変更画面から、`git commit`を行うことができます。
![git3.png](https://qiita-image-store.s3.amazonaws.com/0/32800/8c411662-7425-4722-8db5-b98f6304f16b.png)
「含まれる変更」には、`git add`されるファイルが表示されます。「除外される変更」や「追跡対象でないファイル」からファイルをドラッグして追加できます。変更を編集し終えたら、コミットメッセージを入力して「コミット」ボタンでコミットします。

##同期
同期画面では、リモートとの同期をとることができます。`git pull`や`git push`のことですね。リモートが登録されていない場合は次のような画面が表示されます。
![git4.png](https://qiita-image-store.s3.amazonaws.com/0/32800/27e59260-01b2-dc48-57f7-632afbc6f165.png)
リモートとしてGitHubなどにリポジトリを登録して、そのURLを入力して発行すれば同期できるようになります。実際の同期は「同期」ボタンを押すだけで`git pull`と`git push`を一気にやってくれます。
vagrant 1.7以降は'vagrant up'した時にinsecure_keyを差し替える

vagrantをアップデートしたらゲストにログインできなくなって焦った。
原因はタイトルの通り。

ちゃんと見てなかったけどログにも出てた。

```
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if its present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
```
この機能を無効化したい場合、Vagrantfileで以下を設定する

``` ruby:Vagrantfile
  config.ssh.insert_key = false
```

ゲストにログインする際に``` vagrant ssh```しない（主にWindowsな）人はご注意を。

※参照
https://twitter.com/mitchellh/status/525704126647128064


もう面倒だからRakeからTeraTerm呼び出すtask作った。

``` ruby:Rakefile
desc 'login with TeraTerm SSH'
task :ssh do
  host, port, user, keyfile = nil, nil, nil, nil
  `vagrant ssh-config`.each_line do |l|
    host = l.sub('HostName','').strip if l.strip.match(/^HostName\s/)
    port = l.sub('Port','').strip if l.strip.match(/^Port\s/)
    user = l.sub('User','').strip if l.strip.match(/^User\s/)
    keyfile = l.sub('IdentityFile','').strip if l.strip.match(/^IdentityFile\s/)
  end
  spawn({"PATH" => "C:\\Program Files\\teraterm"}, "ttermpro #{host}:#{port} /ssh /auth=publickey /user=#{user} /keyfile=#{keyfile}")
end
```
Rubyのブロック引数とブロックパラメーターを混同しないで

Rubyの「ブロック引数」と「ブロックパラメーター」を混同した文章を見かけます。

ブロック引数というのは，メソッドに与えられたブロックを `Proc` オブジェクトとして受け取るための仮引数のこと。つまり

```rb
def foo(&b)
  b.call
end
```

における `b` のことですね。

一方，ブロックパラメーターはメソッド側からブロックに渡されるオブジェクトを受け取るもの。つまり

```rb
ary.map{ |x| x**2 }
```

における `x` のことですね。
CentOS 6.xでカーネル再構築→RPM

CentOS 7が出る直前に構築してしまったCentOSの6.xサーバ

色々動かしちゃってていまさらクリーンインストールして環境再構築するのが面倒
一応アップグレードという手段もあるけれど、その最中に小一時間ほど止まる事態ってのは避けたい
ただ、CentOS 6の場合は標準だとdockerがらみで色々とハマるポイントも多く、ログには「カーネル古すぎ、3.8以上使って」という意味の文言が残ってたりするし、カーネルアップデートしてから1回リブートかけるぐらいのダウンタイムぐらいは許容範囲だったので思い切ってカーネルを再構築することに

今回はカーネルを素のままインストールするのではなく、ディストリビューションの流儀に合わせてRPMを作ってインストールする形で

というわけで、rpm作りの環境を整えます

```bash
sudo yum install rpm-build
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

```

以上で最低限のRPMパッケージの構築環境は完成
最近のカーネル(現在のところは3.18)を[ここ](https://www.kernel.org/)から持ってきて、~/rpmbuild/SOURCESに展開

```bash
cd ~/rpmbuild/SOURCES
tar xvJf linux-3.18.tar.xz
cd linux-3.18
```

現在のカーネルの設定をベースにするための.configファイルをもらってくる

```bash
cp /boot/config-2.6.x-y.z.el6.x86_64 ./.config
make menuconfig
```

たいていはデフォルトのままでいいのだけど、Dockerを使う上でハマると思うのが**iptablesのモジュール不足**
これでやりなおし(´・ω・｀)
もう面倒くさかったので、これでもかとばかりにiptables関連を色々盛ってビルド

具体的には
Networking support -> Networking options -> Network packet filtering framework (Netfilter) -> Core Netfilter Configuration
の**"addrtype" address type match support**周辺と

Networking support -> Networking options -> Network packet filtering framework(Netfilter) -> IP: Netfilter Configuration

の**iptables NAT support**周辺をおさえておけば問題はなさそう

あとはmake
最近は便利になったもので

```bash
make rpm

```
とすれば、SPECファイルからrpmを作った時と同様に~/rpmbuild/RPMS/CPUのアーキテクチャ/にrpm形式で

* kernel
* kernel-devel
* kernel-headers

の3つのパッケージを作ってくれるので、それらを

```bash
sudo rpm -Uvh ...

```

でインストールすればおｋ・・・というところでハマりポイント

> エラー: 依存性の欠如:
>         kernel-drm-nouveau = 16 は (インストール済み)xorg-x11-drv-nouveau-1:1.0.10-1.el6.x86_64 に必要とされています

ぐぐったらNvidiaのVGA関連のドライバ云々ということですが
そんなパッケージあるんかねえ・・・と思ってあまり期待はせずに

```bash
sudo yum install kernel-drm-nouveau

```
と叩いてみたら、kernel-debugがインストールされ、それが終わったら無事に自前ビルドしたrpmからカーネルも入るように

あとはgrubの設定をいじって再起動

結局、費やした時間と調べる労力を考えると、別ディスクで運用してる/homeディレクトリ以外は特にバックアップ要らないので、周りの早くしろという無言のプレッシャーに耐えながらCentOS7をクリーンインストールして再構築したほうが色々幸せだったのでは？という・・・
iPhone をつなげた時に iPhoto を自動的に立ち上がらなくする方法 (Mac OS X Yosemite)


Mac OS X Yosemite にアップグレードし、iPhone から USB ケーブルを繋げてテザリングしようとすると、iPhoto が自動的に立ち上がってしまい、ちょっと面倒くさくなっていました。 iPhoto が自動起動するのをストップする方法をお教えします。

# 画像付き

画像付きの説明はこちら
http://ja.katzueno.com/2014/12/3363/


# iPhoto での設定

1. iPhoto を起動
1. 左上の **iPhoto** メニューから **環境設定** を選択
1. **カメラ接続時に開くアプリケーション** の`割り当てアプリケーションなし`を選択

# iPhoto で既に「割り当てアプリケーションなし」となっていても、起動しちゃう場合 → イメージキャプチャで設定

Mac OS X に付属している **イメージキャプチャ** というアプリを以前に一度でも使われて、そちらの設定が優先されている可能性があります。

1. 予め iPhone を Mac にUSB接続
1. **アプリケーション** フォルダにある **イメージキャプチャ** を起動
1. iPhone を選択
1. 左下の小さい上向きの三角形のアイコンをクリック
1. **この iPhone を接続時に開くアプリケーション** を `割り当てなし`に選択

これで、完了です。

複数の iOS デバイスの写真のインポートをするときに、このイメージキャプチャのアプリケーションで個別の設定をすることが出来ます。

参考 [How do I disable iPhoto (Yosemite) from automatically launching when I plug in my iPhone?](https://discussions.apple.com/thread/6605115)
コミットしたらGitBucketとJenkinsとHipChatに任せて他の事やってましょう(2)

[コミットしたらGitBucketとJenkinsとHipChatに任せて他の事やってましょう(1)](http://qiita.com/ryuthky_github/items/c27b8f0f15b7e658efc2)
のつづきですが

こっちのほうが本筋なのかもしれません

* ローカルリポジトリ
* GitBucket
* Jenkins
* HipChat

それぞれを連携していきます

# 4.GitBucketのリポジトリ連携設定
GitBucketにUserを追加等は適宜やっておく
ローカルリポジトリとのリモート設定
## 4.1.新規にリポジトリを起こす場合　
![GitBucket.png](https://qiita-image-store.s3.amazonaws.com/0/10605/6e8aec55-3864-3d8a-f157-7e7869c70275.png)
![Create a New Repository.png](https://qiita-image-store.s3.amazonaws.com/0/10605/1c845996-a0a9-00cc-d190-4b9f5331982b.png)
起こしたリモートリポジトリをローカルにクローンします
コマンドでのやり方は書いてあるとおりに
個々のGitクライアントツールでは指定URLをクローンしてくる形になります
## 4.2.既存リポジトリをリモートリポジトリとして登録する場合
既存のGitリポジトリをそのままリモートへ登録します
「`git remote add origin http://[LOCALHOST]:8080/gitbucket/git/user/test.git`」
そうすると今までのコミットがそのまま引きつがれます
個々のGitクライアントツールでは指定URLをリモート登録してPUSHします

# 5.Jenkinsの設定
##　5.1.Jenkinsのプラグイン管理
Git系は入っていないのでいれないと動かないよぉ
[ダッシュボード]-[Jennkinsの管理]-[プラグインの管理]-[利用可能]
から以下のものにチェックを入れてインストール後にjenkins再起動はしたほうがいいです
1.)GIT client plugin
2.)GIT plugin
3.)GIT server plugin
4.)GitBucket Plugin
5.)HipChat Plugin
![アップデートセンター  Jenkins .png](https://qiita-image-store.s3.amazonaws.com/0/10605/6e5a7b68-015f-9e54-44df-de480b368d6e.png)
![アップデートセンター  Jenkins2 .png](https://qiita-image-store.s3.amazonaws.com/0/10605/4066981f-74d2-1095-fc05-3c55614316d7.png)
指定したもの以外も入ってきます
6.)SCM API Plugin
7.)Matrix Project Plugin
複数リポジトリをまとめてビルド等もできるようになるためのプラグインです

##　5.2.Jenkins Jobの作成
ここを詳しく書くと長くなってしまうので
[参考](http://qiita.com/chihiro/items/af1db90372605c4690c6)
などを見てつくってください

Gitのリポジトリ設定やHipChatの通知設定の項目をうめていく
![qiita Config  Jenkins .png](https://qiita-image-store.s3.amazonaws.com/0/10605/fccbb633-5531-8310-096b-f8f76be6f26f.png)
![qiita Config  Jenkins2 .png](https://qiita-image-store.s3.amazonaws.com/0/10605/6190360a-04a1-ae46-09db-9344f238b734.png)

HipChatについては後ほど

![qiita Config  Jenkins3 .png](https://qiita-image-store.s3.amazonaws.com/0/10605/09aff388-ec87-4057-494a-812d3c991ac0.png)
　左端の？ボタンを押すとHelpがでてきます
 ここにGitBucketからWebHookするための記述が書かれているのでこのURLをのちほどGitBucketに設定します

# 6.GitBucketとJenkinsの連携設定

いよいよです
GitBucketのリポジトリの[Setting]-[ServiceHooks]を開きます
![Settings.png](https://qiita-image-store.s3.amazonaws.com/0/10605/b278c881-0fef-3325-4389-35bf08f5dcdf.png)


URL：http://[LOCALHOST]:8080/jenkins/gitbucket-webhook/
を入れます
「TestHook」して問題なければ「Add」します

ためしにJenkinsが動くか試してみます
1.)自分のリポジトリにコミット
2.)GitBucketのリモートリポジトリにPush
3.) GitBucketがWebHookを使ってJenkinsにビルド要求

ビルド結果がでてます
![qiita  2  Jenkins .png](https://qiita-image-store.s3.amazonaws.com/0/10605/207f4704-0e14-d64b-3b71-4d61b42beba2.png)
 
「GitBucketからのHookでビルドはじめました」っという記載が確認できました！
[コミットしたらGitBucketとJenkinsとHipChatに任せて他の事やってましょう(3)](http://qiita.com/ryuthky_github/items/6bb3a62477f474b0fe19)
にはHipChatとJenkins連携を書いています