OmniAICreator/Qiita-1.07M huggingface dataset:
【jQuery】【CakePHP】ajaxで擬似的なリダイレクトを行う

##やりたいこと
ajaxでサーバにPOST（GET）して、結果によっては別ページにジャンプさせたい。

※そもそもやりたいこと
ajaxでサーバにPOSTしたときにAuthのセッション切れだったら、ログインページに飛ばしたい。

##実装
ajaxでは大本のページをリダイレクトさせることはできないので、サーバ側ではフラグと遷移先URLを返して、クライアント側ではフラグを評価してジャンプが必要な場合は遷移先URLへジャンプする。

```js:クライアント側
$.ajax({
  url:'isLoggedIn',
  type:'get',
  dataType:'json'
}).done(function(data){
  //ジャンプが必要かのチェック
  if(!data.isLoggedIn){
    location.href = data.url;
  }
})
```

```php:サーバ側（CakePHP）
public function isLoggedIn(){
  $user = $this->Auth->user();

  //ユーザがログイン中かのチェック
  if(empty($user)){
    //ログイン中でない場合
    $res = [
      'isLoggedIn'=>false,
      'url'=>  'http://foo/bar/Users/login'
    ];
  }else{
    //ログイン中の場合
    $res = [
      'isLoggedIn'=>true,
    ];
  }

  $this->viewClass = 'json';
  $this->set(compact('res'));
  $this->set('_serialize','res');
}
```

ちなみに、チェック用のメソッドはAuthから外しておく。

```php:Authの外し方
$this->Auth->allow(isLoggedIn);
```

参考：[【CakePHP】jsonを出力する](http://qiita.com/kazu56/items/5fefeadbd9acc59b54b9)
Windows7 EnterpriseをProfessionalにダウンエディションした。

会社で使用しているマシンはプリインストールOSがWindows7 32bitだったので、使うことなく64bit版をクリーンインストール。
しかし、Enterprise Editionのライセンスで入れてしまっていた。

![enterprise.png](https://qiita-image-store.s3.amazonaws.com/0/63464/4ebe7be2-9512-0867-51ae-e6180cd494d1.png)

このたび、MSDNの期間切れでWindows7はライセンスを返却せざるを得ない状況に。

7→8→8.1Updateとしてもいいが、8に対しては一抹の不安があるので、別に買ってあったDSP版Professionalを上書きインストールしてダウンエディションすることにした。

まずはレジストリエディタで、下記のツリーにある
<pre">HKLM\Software\Microsoft\Windows NT\CurrentVersion
HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion
</pre>２つのキーを変更。

```text:ProductName
"Windows 7 Enterprise" → "Windows 7 Professional"
```
```text:EditionID
"Enterprise" → "Professional"
```

この状態でリブートせずに、DSP版Windows7 Professional SP1(64bit)のDVDを入れてアップグレードを選択。
![upg.png](https://qiita-image-store.s3.amazonaws.com/0/63464/e124b279-ede4-50d1-992c-d3a12343fcc8.png)

何度か再起動を繰り返して、無事に完了しました。
![professional.png](https://qiita-image-store.s3.amazonaws.com/0/63464/a0642a11-e6f3-50b7-0765-638c271c3932.png)

SSDのおかげで、所要時間は１時間強。
まだしばらくはWindows7を使い続けることにします。
SwiftではEnumにコンストラクタが書ける

## 初期化するとき

例えばenumを変数として保持しておいて、どこかのタイミングで書き換えるみたいなケース。最初に変数を宣言するときは初期値は入れておきたいのでこんな風に書きますよね。同僚に教えてもらうまではこんな風に書いていました。

```swift
enum Size {
    case Small, Medium, Large
}

var size = .Small // .Smallで初期化
```

これでも問題はないっちゃないんですが、デフォルト値は`.Small`であるという情報はここには現れていません。

## 引数なしコンストラクタ

enumには`init`で以下のようにコンストラクタが定義できます。

```swift
enum Size {
    case Small, Medium, Large
    
    // 引数なしコンストラクタ
    init() {
        self = .Small
    }
}

var size = Size() // -> .Smallが設定される
```

これであればデフォルト値は`.Small`であるという意図がより伝わりやすいと思います。

## 引数ありコンストラクタ

引数ありのコンストラクタも作れます。コンストラクタが設定できることを教えてもらうまではわざわざメソッドを作っていましたが、コンストラクタの方がより意図が伝わりやすいと思います。

```swift
enum Size {
     case Small, Medium, Large

     // 引数ありコンストラクタ
     init(height: Int) {
         if height < 160 {
              self = .Small
         } else if height < 170 {
              self = .Medium
         } else {
              self = .Large
         }
     }
}

var size = Size(height: 190) // -> .Large
```

## 失敗するかもしれないコンストラクタ

さらには失敗するかもしれない（nilが返ってくるかもしれない）コンストラクタも作ることができます。その場合は、`init`の後ろに`?`をつけて`init?`と宣言します。

```swift
enum Size {
     case Small, Medium, Large

     // 失敗するかもしれないコンストラクタ
     init?(height: Int) {
         if height < 160 {
              self = .Small
         } else if height < 170 {
              self = .Medium
         } else if height < 180 {
              self = .Large
         } else {
              return nil
         }
     }
}

var size = Size(height: 190) // -> nil
```
XcodeのPlaygroundでlocaleを変更する方法


国際化周りの実装を試すのに、XcodeのPlaygroundでlocale変更出来たら便利だなーと思って調べてたのですが、情報が全く見つからず。
で、ちょっと考えて試したらMethod Swizzlingでうまく行きました(　´･‿･｀)

シミュレーターの切り替えはこちら:
[iOS - Xcode6で言語設定の切り替えが簡単になった - Qiita](http://qiita.com/mono0926/items/63aaf95a48f18eefdaa6)

```swift
extension NSLocale {
    class func mono_currentLocale() -> NSLocale {
        return NSLocale(localeIdentifier: "fr") // ここは適当に変えましょう
    }
}

let method = class_getClassMethod(NSLocale.self, "currentLocale")
let swizzledMethod = class_getClassMethod(NSLocale.self, "mono_currentLocale")
method_exchangeImplementations(method, swizzledMethod)
print(NSLocale.currentLocale().localeIdentifier) // -> "fr"
```

`method_exchangeImplementations(method, swizzledMethod)` をコメントアウトすると、デフォルトの `en_US`になるはずです。

以前は[How To Test Locale In Your Playground in Swift](http://natashatherobot.com/locale-playground-swift/)の方法で出来たようですが、Xcode 6.3.2でコンパイルエラーになってしまったので、新しいやり方を考えたらうまくいきました。
(http://stackoverflow.com/questions/31065859/how-can-i-change-the-locale-on-the-xcode-playground で質問してセルフ回答)


locale一覧はこちら:
https://gist.github.com/jacobbubu/1836273
Ruby on Rails チュートリアル 第７章

# cannot load such file -- bcryptと表示されてユーザーが表示されない

大抵の場合、WEBrick起動したままで動作確認できるのだが、bcrypt-rubyモジュールを追加した場合は、再起動が必要だった。
どういう場合は再起動が必要で、どういう場合は必要ないのかわからん。。

しかもエラーメッセージが意味不明だったので、メモとして残しておく。
[iOS][Swift]Storyboardでボタン背景色の設定がしたい

iOSは初心者なのですが、Androidのようにボタンの背景をstateごとに分けて指定したいのですが、調べるとみんなカスタムビューを実装するか、コードで指定しててちょっと面倒です。。
Androidみたく、単にdrawableのselectorとかのxmlを書いて背景に指定すればいい、っていうくらい気楽な方法がなさそうでした。

でもIBInspectableを使って小さなカスタムビューを作ってStoryboardで指定できるようにする、っていう方法が一番しっくりきたのでメモしておきます。

元ネタ：[How to change the background color of a UIButton while it's highlighted?の回答](http://stackoverflow.com/a/28293846)

# やり方

リンク先がすごく簡単なのでやり方説明するまでもないんですが、以下のカスタムボタンを実装してstoryboardに置いたボタンに関連付けるだけです。

```swift:BackgroundHighlightedButton.swift
class BackgroundHighlightedButton: UIButton {
    @IBInspectable var highlightedBackgroundColor :UIColor?
    @IBInspectable var nonHighlightedBackgroundColor :UIColor?
    override var highlighted :Bool {
        didSet {
            if highlighted {
                self.backgroundColor = highlightedBackgroundColor
            }
            else {
                self.backgroundColor = nonHighlightedBackgroundColor
            }
        }
    }
}
```
そうすると右のインスペクタで編集できるようになります。

![スクリーンショット 2015-06-26 14.37.06.png](https://qiita-image-store.s3.amazonaws.com/0/42594/9ea5c79a-35de-8abe-8da3-036dd18ff4d4.png)

まあ、iOS開発ではそろそろInterfaceBuilderやStoryboardが使えるようになってきてると思うので、こういう使い方の方がメンテとか楽かなーとおもって使ってみました。

# 他の方法

## UIButton.setBackgroundImage:forState:

stateごとに背景を指定できるのでこちらで指定します。
引数はUIImageだったりするので、上の例とは全く同じではないですね。
まあ、単純に一色塗りのボタンを作ることもあまりないと思うのでこちらでもいいかと思います。

色を入れたいときもUIColorからUIImageを作ればいいだけでしょう。

```swift:
extension UIButton {
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color), forState: state)
    }
}
```
こんな風に拡張メソッドsetBackgroundColor:stateを追加してやる例もありました。

# まとめ

普段Android開発ばかりしているとiOSのStoryboardやXibがxml(plist)を直にいじれないのが、なんだか嫌な気がしますが、プロパティ編集がAndroidのツールよりもしっかりできてるので、なるべく必要なくしたいんでしょうね。。

あと、拡張メソッドとかを追加する方法はAndroidJavaだとまだできないので、いいですね。
自分でプロパティの項目がいじれるのは面白いのでもっと遊んでみようと思いました。

（Swiftでたまに遊ぶとJavaがつらいですね(+_+)）

## 参考

* [How to change the background color of a UIButton while it's highlighted?](http://stackoverflow.com/questions/14523348/how-to-change-the-background-color-of-a-uibutton-while-its-highlighted)
* [Change background color of UIButton when Highlighted](http://stackoverflow.com/questions/4022763/change-background-color-of-uibutton-when-highlighted)
* [Storyboard上だけでUIButtonを角丸に！カスタムクラスで設定項目を拡張する！](http://iritec.jp/objective-c/9167/)
AWS CLIちょいメモ

**CLIの設定ファイル**
`C:\Users\USERNAME\.aws\config`
`C:\Users\USERNAME\.aws\credentials`

**S3のBucket作成**
`aws s3 mb s3://Bucket名`

**Bucket一覧**
`aws s3 ls`

**Objectアップロード**
`aws s3 cp アップロードしたいファイルパス s3://Bucket名/`

公開する場合はpublic-readを付与する
`aws s3 cp アップロードしたいファイルパス s3://Bucket名/ --acl public-read`
【RoR】where like orの書き方

```rb
@params = '田中'

User.where("first_name LIKE :name OR last_name LIKE :name", name: "%#{@params}%") 
```

まあ、ファーストネームとラストネームに分けなくても方法はあると思うのですが、わかりやすいと思ったので。

※ コメントを頂いて、よりdryになりました。
Homebrewによるunicode-path対応のSubversion1.8系のインストール


# 問題
- Macのファイルシステムは文字コードが特殊（UTF-8-MAC）なため、svnコマンドで濁点や半濁点を含むファイルパスを正常に処理できず、必ず差分として検出されてしまう。
- この問題を解消するためには、--unicode-pathパッチをあてたsvnをインストールすることが必要だが、Homebrewのsvn1.8系には、--unicode-pathパッチが対応していない。  
（MacPortsでは++unicode_pathをつけることでsvn1.8系をインストール可能）
- 回避策として、以下のコマンドで、svn1.7系をインストールすることが可能。

```bash
$ brew tap homebrew/versions
$ brew install subversion17 --unicode-path
```

# 対策
- HomebrewのSubversionのFormulaファイルを修正し、--unicode-path対応可能なsvn1.8系のFormulaファイルを作成する。
- unicode-path用のパッチは、Subversion公式の課題トラッカーから取得。
 - http://subversion.tigris.org/nonav/issues/showattachment.cgi/1291/svn_1.8.x_darwin_unicode_precomp.patch
 - 利用は自己責任:-)
- Homebrewは任意のGitHubに置いたFormulaを`brew tap`で利用可能。

# 結果
- SubversionのFormulaファイルを修正したものを作成し、個人のGitHubに配置した。
- 以下のコマンドで、unicode-pathパッチ対応のsvn1.8系をインストール。
- 2015/06/26現在、問題なく利用可能。ただし、将来的な保証はない。


```bash
$ brew tap takuyao/misc
$ brew install subversionutf8 --unicode-path
```
Apache SparkのソースファイルをIntelliJでデバッグする

最近[Apache Spark](https://github.com/apache/spark)のissueを見て修正できそうなものはコントリビュートしているのですが、そこで欠かせないのがデバッグIDEです。

私は普段IntteliJで`scala`を書いているのでIntteliJでデバッグしようと思ったのですが、これがなかなか一筋縄ではいかなかったので共有することにしました。

## 1. Apache Sparkのソースコードを取得する

まずはGitHubから最新のソースコードを取得します。

```bash
git clone git@github.com:apache/spark.git
```

## 2. IntelliJでSparkを開く

次に、取得したソースコードをIntelliJで開きます。
※ 1.を飛ばしてIntelliJから`git clone`しても大丈夫です。

![open_intellij.png](https://qiita-image-store.s3.amazonaws.com/0/31408/23aceaad-1fc8-807f-c098-3670471a505f.png)

## 3. Reimport Maven Projects

`Apache Spark`の依存管理は`maven`で行われています。
開いたら何はともあれ`maven`プロジェクトの設定インポートを行いましょう。
初めて開いた時には`Maven project need to be imported`というダイアログが表示されるので`Import Changes`をたっぷタップすればOKです。

![import_maven_projects.png](https://qiita-image-store.s3.amazonaws.com/0/31408/908e3691-db35-bf5d-8741-c0b4b0dc11bb.png)

初めて開いたのではない場合は明示的に再インポートします。

![reimport_maven.png](https://qiita-image-store.s3.amazonaws.com/0/31408/bd36071f-a930-8e81-0748-8c17d28ebb67.png)

## 4. 依存ライブラリの`scope`を変更する

正直、ここが一番面倒なステップです :cold_sweat: モジュールの依存管理を開き、`scope`が`provided`もしくは`runtime`になっているライブラリを`compile`に変更します。
※ デバッグしたいモジュールとそれの関連モジュール。

![scope.png](https://qiita-image-store.s3.amazonaws.com/0/31408/1346b409-52f2-aef4-e046-10d13ccd5968.png)

（`pom.xml`の`scope`を置換してから`Maven Projects`で`Reimport`した方が楽かもしれません :sweat_drops: ）

## 5. paradiseをコンパイルオプションに追加する

`Apache Spark`では`scalaマクロ`を使っているのでコンパイル・オプションにパラダイスの指定が必要です。
IntelliJの設定から`Scala Compiler` > `Additional compiler options`に`paradise`のパスを指定してあげましょう。

```bash
# /Users/ユーザ名/.m2の部分はmavenホームです
-Xplugin:/Users/ユーザ名/.m2/repository/org/scalamacros/paradise_2.10.4/2.0.1/paradise_2.10.4-2.0.1.jar
```

![paradise.png](https://qiita-image-store.s3.amazonaws.com/0/31408/5e7a8f31-b9c9-e824-b7f2-2069f05163dd.png)

## 6. avroファイルからクラスファイルを生成する

`spark-streaming-flume-isnk`モジュールに`avro`フォーマットのファイルが入っているのでこれをコンパイルしてクラスファイルを生成します。
ごちゃごちゃ言ってますがやり方はかんたんで、`Maven Projects`から`plugins` > `avro:protocol`を実行するだけです。

![avro.png](https://qiita-image-store.s3.amazonaws.com/0/31408/20a21042-7f6f-7e96-14c6-6a0471edb3aa.png)

これで`sparkflume.avdl`がコンパイルされてクラスファイルが生成されます。

## 7. 生成したavroのクラスファイルをソース・パスに追加する

`maven`プラグインで生成したavroクラスファイルは

```
spark/external/flume-sink/target/scala-2.10/src_managed/main/compiled_avro
```

に生成されるので、このディレクトリをソース・パスに追加します。

![flume-sink.png](https://qiita-image-store.s3.amazonaws.com/0/31408/7b7bd395-ea9b-5690-07d9-1e2f2b42e88c.png)

以上で準備はおしまいです :relaxed: 
一旦ここでリビルドしてみましょう。

## 8. デバッグ実行する

あとは`examples`モジュールから適当なオブジェクトを選択してデバッグ実行(^↑F9)するなり、`test`ソースから適当なクラスを選択してデバッグ実行すればOKです :ok_woman: 

![debug.png](https://qiita-image-store.s3.amazonaws.com/0/31408/308cf06e-5341-8735-a9e2-d63418c00768.png)
monacaでスマホアプリを作ろう #6

# ページを切り替える

一般的にアプリは複数のページで構成されています。一覧ページと詳細ページとか。
そんなわけでmonacaでもページの切り替えをやってみます。

やることは簡単で前回作成した```page1.html```内の```ons-list-item```に```ng-click```を追加するだけです。

```html
    <ons-list-item modifier="chevron" ng-repeat="os in oss" ng-if="os.kind == 'android'" ng-click="myNavigator.pushPage('page2.html');">
```


``myNavigator``がキモでページ切り替えを制御しています。ページのスタックを管理してくれているんですな。
ちなみに```myNavigator```は```index.html```で定義されています。

```html:index.html
...
<body>
    <ons-navigator var="myNavigator" page="page1.html">
    </ons-navigator> 
</body>
...
```
これっすな。


ちなみにページ切り替えのアニメーションは変更できます。

下から上にスルーっと現れるパターン

```html
<ons-list-item modifier="chevron" ng-repeat="os in oss" ng-if="os.kind == 'osx'" ng-click="myNavigator.pushPage('page2.html',{animation:'lift'});">
```



もやーんと切り替わるパターン

```html
<ons-list-item modifier="chevron" ng-repeat="os in oss" ng-if="os.kind == 'osx'" ng-click="myNavigator.pushPage('page2.html',{animation:'fade'});">
```


[詳しくはOnsen UIのドキュメントを参照のこと。](http://ja.onsen.io/reference/ons-navigator.html#method-pushPage)



# 次のページにデータを渡す

ページが切り替わったら次はデータ。
動的なデータを扱うには``Controller``があったほうが良いということで、``page2.html``にも``Controller``を設定します。

```js:js/controller/page2controller.js
// This is a JavaScript file
app.controller('Page2Ctrl',function($scope, OSService){

    var searchCallback = function(os){
　　　　//受け取ったosをviewに渡す
       $scope.os = os;
    }

    // navigator経由でpage1.htmlで設定されたオプションを取得
    var page = myNavigator.getCurrentPage();
    var osname = page.options.osname;   
    
　　//osnameに一致するOSを取得。検索結果は例によってcallbackで受け取る
    OSService.getOS(searchCallback,osname);
}) ;
```

serviceにosname指定でosオブジェクトを取得するメソッドを追加

```js:js/service/osservice.js
...
   /**
     * osnameとnameが一致するosのオブジェクトを返す
     */
    service.getOS = function(callback,osname){
        for(var i=0; i<oss.length; i++){
            if(oss[i].name == osname){
                callback(oss[i]);
            }
        }
    }
...
```

page1.htmlに選択された行の情報をpage2に渡す処理を追加

```html:page1.html
...
    <ons-list-item modifier="chevron" ng-repeat="os in oss" ng-if="os.kind == 'android'" ng-click="myNavigator.pushPage('page2.html',{osname:os.name});">
...
```


page2.htmlを書き換え

```html:page2.html
<ons-page>
    <div ng-controller="Page2Ctrl">
        <ons-toolbar>
            <div class="left"><ons-back-button>Back</ons-back-button></div>
            <div class="center">Page 2</div>
        </ons-toolbar>
        <div style="text-align: center">
            <h1>Page 2</h1>
            
            <p>{{os.name}}</p>
            <p>{{os.kind}}</p>
            <p>{{os.desc}}</p>
            
            <ons-button onclick="myNavigator.popPage()"> Pop Page </ons-button>
        </div>
    </div>
</ons-page>
```

``index.html```に追加したコントローラーの読み込みを追加

```html:index.html
...
    <script src="js/controller/page2controller.js"></script> <!-- 追加 -->
...
```




無事page2に選択したOSの情報が渡りました。

![Screen Shot 2015-06-26 at 13.47.33.png](https://qiita-image-store.s3.amazonaws.com/0/74328/7b6dfca9-9d84-2ddd-3e0e-bd2b05d608ea.png)



これにてmonacaでスマホアプリを作ろうシリーズは一旦完了です。
もしリクエストがあればコメントして頂ければ書いてしまうかも！？
Rails slack連携をしてみた

#はじめに
便利なチャットアプリslackとの連携をRailsで実現したい思います。
ここでは、メッセージの送信とリポジトリの作成をやってみます。
思っていた以上に簡単だったので、お手軽にアプリケーションからslackへ通知を送れます！

方針1. gem slack-apiを使う
方針2. gem httpartyを使う

#実装

##方針1. gem slack-apiを使う

###Gemfileに追加
```
gem 'slack-api'
```
###bundle install

```
bundle install
```

###アクセストークンの取得
下記URLから、アクセストークンを取得します。Authenticationの項目にて、トークンを作成、確認出来ます。
https://api.slack.com/web

###設定ファイルの作成
```rb:config/initializers/slack_api.rb
require "slack"
 
Slack.configure do |config|
  config.token = "取得したトークン"
end
```

###メッセージを送る

```rb
Slack.chat_postMessage(text: 'テキスト', username: '適当な名前', channel: "#チャンネル名")
```

例:

```rb
Slack.chat_postMessage(text: 'hello!', username: 'slack_test_bot', channel: "#slack_test")
```

これを好きなとこで実行するだけ！

###チャンネルを作成する

```rb
Slack.channels_create({name: 'slack_test'})
```

名前はお好きに！これだけ！

###他のメソッド
他にも便利なメソッドがあるので下記を参考に。
https://api.slack.com/methods

###参考
[Rails からの通知を Slack で行う](http://diary.mansion-market.com/626/)

##方針2. gem httpartyを使う
方針1でOKなのですが、slack-apiを使わずにslackのapiを叩く方法で実装出来るみたいなのでメモ。
[Railsアプリからslackのchannelを自動作成する方法](http://qiita.com/kansiho/items/2d9cda5716eca753fa6c)

###Gemfileに追加

```
gem 'httparty'
```

###bundle install

```
bundle install
```

###チャンネルを作成する

```
HTTParty.get("https://slack.com/api/channels.create?token=zzzzzzzzzzzzzzzzzzz=#{channelname}")
```

他のメソッドも方針1と同様に使えそうです。

#おまけ

##チャンネル作成時のresponse

```rb
response = Slack.channels_create({name: params[:name]})
```
を実行したときのresponse

```
{"ok"=>true, "channel"=>{"id"=>"hogehoge", "name"=>"aaaaaaa", "is_channel"=>true, "created"=>11111111, "creator"=>"hogehoge", 
"is_archived"=>false, "is_general"=>false, "is_member"=>true, "last_read"=>"0000000000.000000", "latest"=>nil, "unread_count"=>0, 
"unread_count_display"=>0, "members"=>["hogehoge"], "topic"=>{"value"=>"", "creator"=>"", "last_set"=>0}, "purpose"=>{"value"=>"", 
"creator"=>"", "last_set"=>0}}}
```
のようなのものが返ってきます。

ふむふむ、
response[:ok]で作成成功か失敗か返ってくるのね。

既にchannelがある場合はfalseで返ってきました。

```rb
  def create
    response = Slack.channels_create({name: params[:name]})
    if response[:ok]
      render 'create'
    else
      redirect_to new_channel_path, alert: 'チャンネル作成に失敗しました。既に同名のチャンネルがないか確認して下さい。'
    end
  end
```

こんな感じに実装すれば良いな。

slack連携、お手軽なのでぜひ！
2015-06-26 c++ builder > Excel時間(シリアル値）を計算

```txt:動作確認
C++ Builder XE4
```

TDateTime型からEXCEL時間を取得する。
引っかかったのはEXCELには「1900/2/29」があること。これを考慮しないと1ずれる。
2029年あたりにも別の問題があるが、以下では考慮していない。

http://www.relief.jp/itnote/archives/001333.php
> Excelで「1900/2/29」と入力すれば、シリアル値「60」の日付と認識してくれます。
ですから、、Excelでは、1900年3月1日より前の日と、それ以降の日とで計算をすると1日ずれが生じてしまいます。


```cpp
double getExcelTimeSerial(TDateTime aNow)
{
	TDateTime origin = StrToDateTime(L"1900/1/1 0:0:0");

	double serial;

	serial = DaySpan(aNow, origin);

	// EXCELは1900/2/29が存在するため、1900/3/1以降には+1しておく
	if (aNow >= StrToDateTime(L"1900/3/1 0:0:0")) {
		serial = serial + 1.0;
	}

	return serial + 1.0; // for 1900/1/1 as 1st day
}
```


### 補足 (2020/05/26) 

DaySpan()を使うため、下記をインクルードしておく。

```
#include <DateUtils.hpp>
```
Rails production環境(heroku)でgmailSMTPのメールが送れない

##現象
railsのdeviseのメール認証機能を使うときに、SMTPとしてgmailを使っています。

安全性の低いアプリのアクセスをonにすれば（https://www.google.com/settings/security/lesssecureapps より)、develop環境ではメールを送信出来ています。
しかし、herokuにあげるとエラーが起きてしました。
以前までは、これで動いていたはずだが。。


##対応
下記のような文章を含んだメールが届いていました。
>
引き続き問題が発生する場合は http://www.google.com/accounts/DisplayUnlockCaptcha にアクセスし、Gmail のユーザー名とパスワードを使用してログインします。必要であれば、歪んだ画像に表示されている文字を入力してログインを完了します。

その通りに、アクセスすると問題は解消されました。
セキュリティーが強化されたのでしょうか。
pryでメソッドの挙動を最初からトレースする。

# 概要

`binding.pry; Hoge.hoge`でトレースを開始することができます。
編集してbinding.pryを埋め込む必要がないので便利です。

# 使用例

RailsのModelを新規作成するときの挙動が知りたい！

```rb
[28] pry(main)> binding.pry; User.new name: "sachaos"

Frame number: 0/20

From: /Users/hogehoge/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/activerecord-4.2.2/lib/active_record/inheritance.rb @ line 49 ActiveRecord::Inheritance::ClassMethods#new:

    48: def new(*args, &block)
 => 49:   if abstract_class? || self == Base
    50:     raise NotImplementedError, "#{self} is an abstract class and cannot be instantiated."
    51:   end
    52:
    53:   attrs = args.first
    54:   if subclass_from_attributes?(attrs)
    55:     subclass = subclass_from_attributes(attrs)
    56:   end
    57:
    58:   if subclass
    59:     subclass.new(*args, &block)
    60:   else
    61:     super
    62:   end
    63: end

[1] pry(User)> args
=> [{:name=>"sachaos"}]
```

捗りますね。
Docker コマンドリスト

# Dockerのコマンド

## イメージ
イメージの一覧を表示

```cl
$ docker images
```

イメージの削除

```cl
$ docker rmi <ImageID>
```

## コンテナ
コンテナ一覧

```cl
$ docker ps -a
```

停止中のコンテナ削除

```cl
$ docker rm `docker ps -a -q`
```

## docker runについて

```cl
$ docker run [オプション] --name [コンテナ名] [イメージ名] [コンテナで実行するコマンド] [引数]
```

| コマンド | 意味 |
|:---------:|:----:|
|`docker run`|指定したコンテナを立ち上げる|
|`--name`|コンテナの名前を指定|
|`--link hoge:fuga`|コンテナ間で通信を行う<br>hogeというコンテナにfugaというエイリアスでアクセスできる|
|`-d`|バックグラウンドで実行|
|`-i`|コンテナの標準入力を開く<br>/bin/bashなどでコンテナを操作するときに指定|
|`-t`|tty（端末デバイス）を確保する<br>/bin/bashなどでコンテナを操作するときに指定|
|`-h`|ホスト名の指定|
|`-p 80:8080`|ポートフォワーディング<br>ホストの80とコンテナの8080をマッピング|
|`-v /hoge:/fuga`|ホストOSのファイルシステムをマウントする<br>ホストの/hogeとコンテナの/fugaを共有|

## コンテナに入る
hogeという名前のコンテナに入る

```cl
$ docker exec -it hoge bash
```
shellが不要なら

```cl
$ docker exec -it influxdb ps -ef
```
コンテナ内のファイルをリダイレクトして親ホストに保存したり、パイプで処理をつなげたりすることができる



### 参考
http://takasing104.hateblo.jp/entry/2015/04/27/150000
EC-CUBE3のログ設定ファイル

# EC-CUBE3の暫定のログ設計

## 設定ファイル
```yaml
prefix: site_
suffix:
format: Y-m-d
action_level: WARNING
log_level: INFO
max_files: 90
```

| 項目名        | 内容               |
|--------------|--------------------|
| prefix       | ログファイルの接頭辞 |
| suffix       | ログファイルの接尾辞 |
| format       | ログファイルに付与される `date()` のformat |
| action_level | 発火させるレベル下限 |
| log_level    | `action_level` で発火した際にログインされるレベル下限 |
| max_files    | 残す世代数 |

## ファイル名
* prefix：PREFIX_
* suffix：__SUFFIX
* format: Ymd

とした場合、`PREFIX_20150626__SUFFIX.log`として記録される



## action_level / log_level

####設定できるレベル

* DEBUG
* INFO
* NOTICE
* WARNING
* ERROR
* CRITICAL
* ALERT
* EMERGENCY

#### `action_level` `log_level` の関係
以下を参照してください。
http://blog.jicoman.info/2014/05/monolog/
CLI環境しかない状況でKVMのゲストVMのコンソールに入りKickstartで設定する方法

# 概要
ISOからKVMのqcow2イメージを作成しようと思ってKVMホストの環境を作った。その際、ネットをいろいろ調べるとGUIによる設定の方法は掲載されているが、CLIしかない環境で行う方法があまり見当たらなかった。今回は、CLI環境でKVMのホストからISOでゲストVMをKickstartで構築しqcow2イメージを作成する方法を記す。なお、KVMホストは構築済みであることが前提。本環境では、CentOS7.0.1406を利用して、CentOS6.3のISOからqcow2イメージを作成する。
# 手順
KVMのdefaultネットワークを起動する。defaultネットワークが起動していないとVMが上がってことないので忘れないこと。

```bash
virsh net-start default
```
## ISO取得

ISOイメージを取得する。CentOS6.XのISOイメージは`http://archive.kernel.org/`のcentos-vaultという場所にある。

```bash
cd /usr/loca/src/
wget http://archive.kernel.org/centos-vault/6.3/isos/x86_64/CentOS-6.3-x86_64-bin-DVD1.iso
```

取得できたらマウントする。

```bash
mkdir /mnt/centos-6.3
mount /usr/loca/src/CentOS-6.3-x86_64-bin-DVD1.iso /mnt/centos-6.3
```

## Kickstart設定

Kickstart用にApacheを起動する。なお、Kickstartファイルは、`/var/www/html/centos-6.3-x86_64`直下に設置する。

```bash
yum install httpd
mkdir -p /var/www/html/centos-6.3-x86_64
```

```bash:マウントしたISOのディレクトリにシンボリックリンクを貼る
cd /var/www/html/centos-6.3-x86_64
ln -s /mnt/centos-6.3 iso
```

```bash:Apache起動
systemctl start httpd
```

## KVMゲスト起動

qcow2イメージを生成してからKVMゲストを起動する。10GBで作るがqcow2はthinプロビジョニングされるので実際のサイズはもっと小さい。

```bash:--locationにマウントしたISOディレクトリ、--extra-argsにKickstartファイルの指定とconsoleの設定をする
qemu-img create -f qcow2 /tmp/centos-6.3.qcow2 10G
virt-install --virt-type kvm \
  --name centos-6.3 \
  --ram 1024 --hvm --connect qemu:///system \
  --nographics --accelerate --network network:default \
  --disk /tmp/centos-6.3.qcow2,format=qcow2 \
  --os-type=linux --os-variant=rhel6 \
  --location=/var/www/html/centos-6.3-x86_64/iso \
  --extra-args="ks=http://127.0.0.1/centos-6.3-x86_64/ks.cfg console=ttyS0,115200n8 serial"
```

## 後処理

あとは、Kickstartが勝手にVMを構築してくれる。完了したらshutdownして、MACアドレス情報を削除してVMのドメインとXML定義ファイルを削除する。

```bash
virt-sysprep -d centos-6.3
virsh undefine centos-6.3
```

これで、`/tmp`配下に`centos-6.3.qcow2`というqcow2イメージが作成された。

## 参考
[OPENSTACK VIRTUAL MACHINE IMAGE GUIDE](http://docs.openstack.org/image-guide/content/centos-image.html)
Heroku buttonはGithubプライベートリポジトリにも対応している

Heroku buttonがいつの間にかGithubプライベートリポジトリでも使えるようになっていました。

設定方法は[パブリックなリポジトリのボタン](https://devcenter.heroku.com/articles/heroku-button#adding-the-heroku-button)と少し違っていて、ボタンのリンクに `template={リポジトリへのURL}` をつける必要があります。
Markdownならこう書きます。

```
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/{Githubのid}/{リポジトリ名})
```

また、デプロイにはHerokuアカウントとプライベートリポジトリへのアクセス権があるGithubアカウントを連携させておく必要があります。
連携させていない状態でHeroku buttonを使うと、以下のような画面が表示されます。赤丸部分をクリックすると、デプロイ画面に進みます。
![heroku_button.jpg](https://qiita-image-store.s3.amazonaws.com/0/7809/a0d30979-b32a-24fc-69e2-89d9e9c6cd2f.jpeg)

参考: [Creating a 'Deploy to Heroku' Button | Heroku Dev Center](https://devcenter.heroku.com/articles/heroku-button#private-github-repos)
Unity プロジェクトを Visual Studio でデバッグ（ステップ実行等）

導入にちょっとハマったのでまとめておく。

## 環境の前提
- Unity がインストールされていること
- Visual Studio 2010,2012,2013,2015 のいずれかがインストールされていること

## Visual Studio Tools for Unity 導入
https://msdn.microsoft.com/ja-jp/dn833194.aspx
この中から手元の Visual Studio のバージョンにあったインストーラを入手

![web.png](https://qiita-image-store.s3.amazonaws.com/0/25555/bb8c0f37-c36d-e3b1-db64-85f6a11eb4b2.png)

## Unity 側設定：パッケージのインポート
1. プロジェクトを開く
2. Assets - Import Package - Visual Studio xxxx Tools メニューを選択

![unityvs0.png](https://qiita-image-store.s3.amazonaws.com/0/25555/15dba149-d930-277c-31d5-90f5c2dffc47.png)

<img src="https://qiita-image-store.s3.amazonaws.com/0/25555/708ae425-e4cc-c5d4-1686-c52df41d1510.png" width="300"/>

インポートに成功すれば、「Visual Studio Tools」メニューが増える。

![unityvs2.png](https://qiita-image-store.s3.amazonaws.com/0/25555/721d914a-b469-dfcf-04f1-2982ef8519cc.png)


## Unity プロジェクトから Visual Studio を開く
Visual Studio Tools - Open in Visual Studio メニューを選択すると、Visual Studio が立ち上がる。

![unityvs3.png](https://qiita-image-store.s3.amazonaws.com/0/25555/75785000-e611-c487-c003-c0cad53bb110.png)


## Visual Studio から Unity プロセスにアタッチする
DEBUG - Attach Unity Debugger メニューを選択すると、任意の Unity プロセスにデバッガをアタッチすることができる。

![vs0.png](https://qiita-image-store.s3.amazonaws.com/0/25555/6cf818ea-55ac-d74b-ef94-c41a9d6062b5.png)

![vs1.png](https://qiita-image-store.s3.amazonaws.com/0/25555/e0a53d64-74d5-b00a-cc12-4efaf0758120.png)

![vs2.png](https://qiita-image-store.s3.amazonaws.com/0/25555/4d0c17c7-eaa6-e11a-5891-ad71d61879cf.png)


## ブレークポイント設定
ソースコードの左端をクリックしてブレークポイント設定。
![vs3.png](https://qiita-image-store.s3.amazonaws.com/0/25555/6d46494f-2967-c1c7-c97d-b1ee5d5bfc52.png)

ブレークポイントの行が実行される直前で中断され、ステップ実行したりウォッチウィンドウ見れるようになったりする。
![vs4.png](https://qiita-image-store.s3.amazonaws.com/0/25555/05130998-baff-a17b-248c-bae7b5988aed.png)

## おしまい
脱 MonoDevelop !!!!! ⊂二二二( ^ω^)二⊃
シェルスクリプト・PowerShellのメモ

■Node.jsがすでにインストール済みか確認、入っていなければダウンロード

```
#!/bin/sh
node -v &> /dev/null
if [ $? -ne 0 ]; then
  curl -O https://nodejs.org/dist/v0.12.5/node-v0.12.5.pkg
fi
```

■ コマンド &

コマンドをバックグラウンドで実行する
●参考URL
http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230589/

■ /dev/null

ゴミ箱を指す
●参考URL
http://www.hangout.co.jp/blog/archives/168

■ -ne 

 等しくないを表す、おそらく not equel　の略
●参考URL
 http://shellscript.sunone.me/if_and_test.html

■コマンドの実行結果を変数に設定する
```
　VAR=`command`
```
　計算結果、文字列の編集結果、等を変数に設定したい場合は、「``」(バッククォート)を使用する。 

　**Macのキーボードでバッククオートの入力**
　Shift+@

■カレントディレクトコマンドの実行結果を変数に入れて、表示
```
　PathData=`pwd`
　echo $PathData 
```

■ファイルやディレクトリの存在をチェックする方法

**例）指定パスにフォルダがなければ権限付き作成**

```
Current=`pwd`
NodePath=/NodeJs
CheckPath=$Current$NodePath
if [ ! -e $CheckPath ]; then
	mkdir -m 777 NodeJs
fi
```

**例）指定ファイルがなければ権限付き作成**

```
JsFileName=LocalServer.js
if [ ! -e $JsFileName ]; then
	touch $JsFileName
	chmod 777 $JsFileName
fi
```

●参考URL
http://sweng.web.fc2.com/ja/program/bash/bash-check-file.html


■(Linux)シェルスクリプトで変数に改行を含めたい

```
JsString="var connect = require('connect'),
    	serveStatic = require('serve-static');
	var app = connect();
	app.use(serveStatic(__dirname));
	app.listen(5000);"

	echo "$JsString" > $JsFileName
```

●参考URL
http://jehupc.exblog.jp/15728862/



# ■PowerShellのメモ

■powerShellから他の処理を実行して終了待ち

```
Start-Process -FilePath "C:\Program Files (x86)\teraterm\ttpmacro.exe" -ArgumentList "C:\work.ttl" -Wait
```

●参考URL
http://harikofu.blog.fc2.com/blog-entry-28.html

●Windows管理者のためのPowerShell
http://powershell.wiki.fc2.com/wiki/パスの操作



■ダウンロード完了を待ってインストールファイルを実行

下記がやってることは、指定URLのファイルをダウンロードし、指定した名前で保存 --> 保存したファイルを実行

```
Invoke-WebRequest -Uri https://nodejs.org/dist/v0.12.5/x64/node-v0.12.5-x64.msi -OutFile ./node.msi
./node.msi -ms
```

■指定フォルダが存在するか確認し、無ければ作成

下記がやっている事は NodeJsフォルダが存在するか確認し、無ければ NodeJsフォルダを作成

```
$NodeJsPath = "NodeJs"
if(-not(Test-Path $NodeJsPath))
{
	echo Not Found
	# カレント・ディレクトリにNodeJsという名前のフォルダを作成する
	New-Item $NodeJsPath -type Directory
}
else
{
	echo Found
}
```

■指定ファイルに指定文字列を書き込み

```
$JsFileName="LocalServer.js"

#JSファイルのソースコードを文字列にする
$JsString="var connect = require('connect'),
serveStatic = require('serve-static');
		var app = connect();
		app.use(serveStatic(__dirname));
		app.listen(5000);"

# ファイルに書き込む
Set-Content $JsFileName $JsString
```
うるう秒対応のAnsible Playbookを書いた


# はじめに

2015/07/01 09:00:00 JST はうるう秒。もうすぐです。
すごく単純なAnsible Playbookにしました。実行するとntpdが再起動します。

CentOS6でのみ動作確認済み。
一応、実行前に

* 試しに1台でyum update ntpで4.2.6p5-3以上にアップデートできることを確認して下さい。
* /etc/sysconfig/ntpdの設定値が違う場合は気を付けてください。

# 手順というかPlaybook

```ntp_update_and_setslew.yml
- hosts: all
  sudo: yes
  gather_facts: no
  tasks:
    - name: update ntpd
      yum: name=ntp state=latest

    - name: replace sysconf/ntpd
      replace:
        dest: /etc/sysconfig/ntpd
        regexp: '^OPTIONS=.*$'
        replace: 'OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g -x"'

    - name: stop ntpd
      service: name=ntpd state=stopped

    - name: reset stat and freq to kernel
      command: ntptime -s 0 -f 0

    - name: start ntpd
      service: name=ntpd state=started
```

# 参考
https://access.redhat.com/ja/node/1362753
chibiosでLチカの練習　その１０

## queueを使ってみた。
```
#include "ch.h"
#include "hal.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static input_queue_t iq;
static uint8_t ib[16];
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		(void) chIQGet(&iq);
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		(void) chIQGet(&iq);
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		(void) chIQGet(&iq);
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
	}
}
int main(void)
{
	halInit();
	chSysInit();
	int n;
	n = 0;
	chIQObjectInit(&iq, ib, sizeof(ib), NULL, NULL);
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		n++;
		if (n > 3) n = 1;
		chThdSleepMilliseconds(1000);
		chIQPutI(&iq, n);
	}
	return 0;
}

```
chibiosでLチカの練習　その９

## poolを使ってみる。
```
#include "ch.h"
#include "hal.h"
#include "test.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static memory_pool_t mp1;
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_FUNCTION(Thread1, arg)
{
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
		chThdSleepMilliseconds(2000);
	}
}
static THD_FUNCTION(Thread2, arg)
{
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
		chThdSleepMilliseconds(2000);
	}
}
static THD_FUNCTION(Thread3, arg)
{
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
		chThdSleepMilliseconds(2000);
	}
}
int main(void)
{
	halInit();
	chSysInit();
	chPoolObjectInit(&mp1, 4096, NULL);
	int i;
	for (i = 0; i < 3; i++) chPoolFree(&mp1, wa[i]);
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	chThdCreateFromMemoryPool(&mp1, NORMALPRIO + 1, Thread1, NULL);
	chThdSleepMilliseconds(1000);
	chThdCreateFromMemoryPool(&mp1, NORMALPRIO + 1, Thread2, NULL);
	chThdSleepMilliseconds(1000);
	chThdCreateFromMemoryPool(&mp1, NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		chThdSleepMilliseconds(1000);
	}
	return 0;
}

```
ssh-copy-idで公開鍵を渡す

鍵認証による ssh を行おうとすると ssh する元のサーバで公開鍵を生成してそれを ssh 先のサーバに持って行って`.ssh/authorized_keys`に追記しないといけない。めんどくさいなぁと思っていたんだが、`ssh-copy-id`というコマンドで簡単にコピーすることができる。

#### ssh-copy-id の利用
引数にアカウント@接続先ホスト名を指定して実行する。これはssh接続するときと同じ。

```bash:~/.ssh/id_rsa.pubを渡す場合
ssh-copy-id ${USER}@${target_host}
```

-iオプションで任意の公開鍵を指定することもできる

```bash
ssh-copy-id -i ${identity_file} ${USER}@${target_host}
```

#### いつも使っていた方法

```bash
cat ~/.ssh/id_rsa.pub | ssh ${USER}@${target_host} "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"
```
ofxOculusRiftはそのままでは動かない


ofxOculusRift
https://github.com/andreasmuller/ofxOculusRift

macであればwinと書いてあるファイルを削除したら自分は動いた

mac osx 10.10
xcode 6.2
openframeworks 0.8.4
ofxOculusRift 0.2.1(OVRVersion.hに書いてあった)

削除したファイル、フォルダ一覧
/license.md
/README.md
/libs/LibOVR/Lib
/libs/LibOVR/Projects
/libs/LibOVR/Src/OVR_Win32_DeviceManager.cpp
/libs/LibOVR/Src/OVR_Win32_DeviceManager.h
/libs/LibOVR/Src/OVR_Win32_DeviceStatus.cpp
/libs/LibOVR/Src/OVR_Win32_DeviceStatus.h
/libs/LibOVR/Src/OVR_Win32_HIDDevice.cpp
/libs/LibOVR/Src/OVR_Win32_HIDDevice.h
/libs/LibOVR/Src/OVR_Win32_HMDDevice.cpp
/libs/LibOVR/Src/OVR_Win32_HMDDevice.h
/libs/LibOVR/Src/OVR_Win32_SensorDevice.cpp
/libs/LibOVR/Src/OVR_Win32_SensorDevice.h
/libs/LibOVR/Src/Kernel/OVR_ThreadsWinAPI.cpp

ofxOculusRift.hを修正
http://cvl-robot.hateblo.jp/entry/2014/07/23/192217

または、
libsディレクトリ全部消している方もおられました
http://blog.rettuce.com/openframeworks/setup_ofxoculusrift/

emptyExampleに入れる場合
http://hrhrblog.blogspot.jp/2013/07/ofxoculusrift-emptyexample.html
AWS CLIでUnicodeWarningが出る場合の対処方法

#現象
Windows版のAWS CLIをインストーラ形式でインストールした環境で、aws s3コマンドを使用した場合、`Unicode equal comparison fail to convert both arguments to Unicode`という`UnicodeWarning`が出力される場合があります。
処理は継続されるので問題ないとしている記事もありますが、処理されない場合もあるようで困っていました。
`chcp 65001`を試してみたり、旧バージョンのAWS CLIインストーラを試してみたりしましたが、エラーは解消されませんでした。
#対処方法
先日[AWS CLIのGitHub](https://github.com/aws/aws-cli)を見ていて、ふと思いついてインストーラ形式ではなくPythonをインストールして、pipコマンドでAWS CLIをインストール`pip install awscli`することで`UnicodeWarning`が解消されました。

Pythonは今時点での最新の3.4.3、AWS CLIも最新の1.7.36で確認しています。
HTML5で意外と知らない7つのメモ書き


## HTMLはプログラミング言語ではない

Hyper Text Markup Language = HTML

## 全要素に適応可能な属性 = グローバル属性

1. id
	- ひとつしか持てない
	- identifier（識別子）の略
	- ページ内遷移の時とかに使う
2. class
	- 複数ある要素を指定する
	- スペースを開ければ複数指定できる
3. style
	- スタイルを直接指定
	- “~~: ~~;”の形で同様に指定可能

## セクション
1. header
2. footer
3. nav
	- パンくずリストやサイドメニュー
4. article
	- メインの独立しているコンテンツ
	- そのコンテンツをそのまま配信しても違和感のない情報
5. aside
	- メインとは関係の無い情報
	- 補足情報など
6. section
	- その他の情報の塊
	- たいてい見出しがつけられる
7. h1~h6
	- セクションにつける見出し

## 個別のタグ
1. hr
	- horizontal rule
2. pre
	- pre-formatted
	- 改行やインデントを保持したまま表示
3. li
	- list item
4. dl
	- definition list
5. dt
	- definition term
6. dd
	- definition description
7. br
	- break

## ページ内リンク
1. 被リンク対象にid属性で固有の値を付与
2. リンクのhref属性に#で被リンク対象のIDを指定する

## 表組みの作成
1. table：テーブル宣言
	- thead / tbody：役割指定
	- tr(record)：レコードを一行作成
	- th(header) / td(description) × カラム数：各セルのデータを記述
2. colspan属性に数値を指定することでセルの結合ができる

## フォームの作成(form + input)
1. form（フォームフィールド）
	- action属性：データをどこに送るか
	- method属性：データをどういった方法で送るか（get/post）
2. input（一行入力欄）
	- name属性：データの表題
	- type属性：データの形式
		1. number = 数字をカーソルで選択可能／HTML5から一部ブラウザで対応
		2. date = 日付をカレンダーから選択可能／HTML5から一部ブラウザで対応
		3. password = 入力した文字が不可視になる
		4. hidden = 表示したくないが一緒に送信したい値を指定
		5. checkbox/radio = <checked>を指定するとデフォルトで選択状態
			- label = checkbox/radioを囲むと表示文字をボックスに紐付け可
			- label for = 表示文字を囲み、紐付け先IDを指定することで紐付け可
	- size属性：入力欄の大きさ
	- maxlength属性：入力文字数制限
	- value属性：データの初期値を設定
	- disabled属性：入力無効化／JSと組み合わせると何らかの処理に連動可
3. textarea（複数行入力欄）
	- cols属性：横幅
	- rows属性：縦幅
4. button（ボタンの作成）
	- こちらも<type>を指定することで機能を定義できる
	- `<input type =“submit”>` よりもリッチにフォントを指定できる
	- JSと組み合わせるとボタンを押した際の処理を規定できる
5. select（選択項目の作成）
	- optionタグでvalueを設定し項目を作成する
	- selected属性：指定した候補がデフォルトで選択状態になる
	- size属性：候補の表示数を規定する
	- multiple属性：複数選択を可能にする
6. 数値文字参照＆文字実体参照
	- >
		- \&#60
		- \&gt;
	- <
		- \&lt;
	- “
		- \&quot;
	- &
		- \&amp;
7.  カテゴリーとコンテンツモデル
	- カテゴリー：このタグがどの分類か？
	- コンテンツモデル：どの分類に属するタグを入れられるか？
		- W3Cの仕様書にてすべて規定されている
		- トランスペアレント規定：親要素のコンテンツモデルが適用されるという概念
bashrc備忘録

# よくやるbashrc
環境設定のときにしかやらないのでここで備忘録

## ssh-agent
朝最初の起動時にだけssh鍵のパスフレーズを一回だけ聞いてくれる（ＰＣ起動時）

```bash:~/.bashrc
   :
   :
source ~/.ssh-agent-info > /dev/null
ssh-add -l >& /dev/null
if [ $? == 2 ] ; then
        echo -n "ssh-agent:restart...."
        ssh-agent > ~/.ssh-agent-info
        source ~/.ssh-agent-info
fi

if ! ssh-add -l >& /dev/null ; then
        ssh-add ~/.ssh/id_rsa
fi
```

## ヒストリ数
```ctrl+r``` で前に使ったコマンドをと思ったときに消えてなくなってしまってる事が多いので多めに盛っておく。

```bash:~/.bashrc
   :
   :
HISTSIZE=50000
HISTTIMEFORMAT='%Y/%m/%d %H:%M:%S '
```
chibiosでLチカの練習　その８

## heapを使ってみた。
```
#include "ch.h"
#include "hal.h"
#include "test.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static memory_heap_t heap1;
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
		chThdSleepMilliseconds(2000);
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
		chThdSleepMilliseconds(2000);
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
		chThdSleepMilliseconds(2000);
	}
}
int main(void)
{
	halInit();
	chSysInit();
	chHeapObjectInit(&heap1, test.buffer, sizeof(union test_buffers));
	cdtp = chThdCreateFromHeap(&heap1, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	chThdCreateFromHeap(&heap1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	chThdSleepMilliseconds(1000);
	chThdCreateFromHeap(&heap1, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	chThdSleepMilliseconds(1000);
	chThdCreateFromHeap(&heap1, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		chThdSleepMilliseconds(1000);
	}
	return 0;
}

```
chibiosでLチカの練習　その７

## eventを使ってみました。
```
#include "ch.h"
#include "hal.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	eventmask_t m;
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		m = chEvtWaitOne(ALL_EVENTS);
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	eventmask_t m;
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		m = chEvtWaitOne(ALL_EVENTS);
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	eventmask_t m;
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		m = chEvtWaitOne(ALL_EVENTS);
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
	}
}
int main(void)
{
	halInit();
	chSysInit();
	chEvtGetAndClearEvents(ALL_EVENTS);
	int n;
	n = 0;
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	thread_t * tp1 = chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	thread_t * tp2 = chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	thread_t * tp3 = chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		n++;
		if (n > 3) n = 1;
		chThdSleepMilliseconds(1000);
		if (n == 1) chEvtSignal((thread_t *) tp1, 1);
		if (n == 2) chEvtSignal((thread_t *) tp2, 1);
		if (n == 3) chEvtSignal((thread_t *) tp3, 1);
	}
	return 0;
}

```
chibiosでLチカの練習　その６

## mailboxを使ってみました。
```
#include "ch.h"
#include "hal.h"
#include "test.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static MAILBOX_DECL(mb1, test.wa.T0, 3);
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	msg_t msg1, msg2;
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		msg1 = chMBFetch(&mb1, &msg2, TIME_INFINITE);
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	msg_t msg1, msg2;
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		msg1 = chMBFetch(&mb1, &msg2, TIME_INFINITE);
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	msg_t msg1, msg2;
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		msg1 = chMBFetch(&mb1, &msg2, TIME_INFINITE);
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
	}
}
int main(void)
{
	halInit();
	chSysInit();
	msg_t msg1;
	chMBObjectInit(&mb1, (msg_t *) test.wa.T0, 3);
	int n;
	n = 0;
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		n++;
		if (n > 3) n = 1;
		chThdSleepMilliseconds(1000);
		msg1 = chMBPost(&mb1, '1', TIME_INFINITE);
	}
	return 0;
}

```
IntelliJ IDEAでGoのinterface実装を探しやすくする


こちらの2014秋のGoConで鵜飼さんのキーノートにあるinterfaceのチェックを使うとすごく捗ります。
という話です。（IntelliJだと捗る話は最後に）

http://ukai-go-talks.appspot.com/2014/gocon.slide#17

# 例

## こんなinterfaceがあるとする

```go:interface
type BotMessagePlugin interface {
	CheckMessage(ctx context.Context, message string) (bool, string)
	DoAction(ctx context.Context, message string) bool
}
```

```go:interfaceの実装
type EchoMessage struct {
}

func (r EchoMessage) CheckMessage(ctx context.Context, message string) (bool, string) {
	return true, message
}

func (r EchoMessage) DoAction(ctx context.Context, message string) bool {
	plugins.SendMessage(ctx, message)
	return true // next ok
}

var _ plugins.BotMessagePlugin = (*EchoMessage)(nil)
```

## interfaceのMethodを増やした場合

`go build`でエラーになります。

```go:Hoge()Mehtodを追加
type BotMessagePlugin interface {
	Hoge() bool
	CheckMessage(ctx context.Context, message string) (bool, string)
	DoAction(ctx context.Context, message string) bool
}
```

![2015-06-26 7.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/40887/dd8706c4-c42c-dfc4-e0aa-f93c7283f822.png)


## interfaceのMethodの引数が変わった場合

これはinterfaceを使ってる箇所でも普通にbuildエラーになると思いますが。
未使用でもチェックできるようになります。

```go:DoActionにhoge引数を追加
type BotMessagePlugin interface {
	CheckMessage(ctx context.Context, message string) (bool, string)
	DoAction(ctx context.Context, message string, hoge bool) bool
}
```

![2015-06-26 7.20.17.png](https://qiita-image-store.s3.amazonaws.com/0/40887/14a5bcce-7850-267c-d74a-d141ced44ea5.png)

# IntelliJのDeclarationで実装がわかるようになる

ショートカットキーは、「Preferences」 -> 「keymap」で`Declaration`を探してください。

![スクリーンショット 2015-06-26 7.24.21.png](https://qiita-image-store.s3.amazonaws.com/0/40887/8f74cef7-f280-a96b-40e9-82b3556fcaf8.png "スクリーンショット 2015-06-26 7.24.21.png")

チェックを入れている箇所、interfaceを定義している箇所、interfaceを使用している箇所が一覧で出てきてかなり捗ります。
（もちろん選択してJump to Sourceできます）

# おわり

IntelliJ完全に使いこなしているわけではないので、
他にも良い方法等ありましたら、コメント等いただけると嬉しいです。
chibiosでLチカの練習　その５

## messageを使ってみた。
```
#include "ch.h"
#include "hal.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	thread_t * tp;
	msg_t msg;
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		tp = chMsgWait();
		msg = chMsgGet(tp);
		chMsgRelease(tp, msg);
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	thread_t * tp;
	msg_t msg;
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		tp = chMsgWait();
		msg = chMsgGet(tp);
		chMsgRelease(tp, msg);
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	thread_t * tp;
	msg_t msg;
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		tp = chMsgWait();
		msg = chMsgGet(tp);
		chMsgRelease(tp, msg);
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
	}
}
int main(void)
{
	halInit();
	chSysInit();
	int n;
	n = 0;
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	thread_t * tp1 = chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	thread_t * tp2 = chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	thread_t * tp3 = chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		n++;
		if (n > 3) n = 1;
		chThdSleepMilliseconds(1000);
		if (n == 1) (void) chMsgSend(tp1, 1);
		if (n == 2) (void) chMsgSend(tp2, 1);
		if (n == 3) (void) chMsgSend(tp3, 1);
	}
	return 0;
}

```
excel で配列を用いて複数条件 100% match 検索


office 2010 の excel

## LOOKUP
これはそもそも、ダメ。日本語が混った時とか。

```
=lookup("あ",{"foo","bar"},{1,2})
```

これで、#N/A とならず、 2 となる。
そもそも学校の先生の点数範囲でランク付けとか、そこらで使うっぽい。

## choose & match

```
=choose(match("あ",{"foo","bar"},0),1,2)
```
これは、完全一致が保証

## んで。

複数条件の完全一致で、文字列を返す時とか。

val は uniq だとして。

|key1|key2|key3|val|
|:-:|:-:|:-:|:-:|
|foo|bar|buz|1|
|bar|buz|foo|2|
|buz|foo|bar|3|

の判定表の元

|A1|B1|C1|D1|
|:-:|:-:|:-:|:-:|
|foo|bar|bar|
|bar|buz|bar|
|buz|foo|bar|

を判定させたい場合

```
=CHOOSE(MATCH(OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),0,−3)&OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),0,−2)&OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),0,-1),{"foobarbuz","barbuzfoo","buzfoobar"},0),1,2,3)
```
      
を、D2D3D4にペーストすればいい。存在しないものは、きちんと #N/A になってくれる。

```
INDIRECT(ADDRESS(ROW(),COLUMN())
```
は自身のアドレスの参照を取得。なぜ参照かと言うと OFFSET が参照を要求するから。
で、

```
OFFSET(ADDR,0,-3)
```
は ADDR から三つ左隣りのデータを取得。で、`&` で連結して検索文字列作成。と。

もちろん上記では、例えば 1,12,1 と11,2,1 がマッチしてしまうので、必要があれば、それなりのセパレータを挟んでやる必要有り。
8桁バーコードのチェックデジット

[チェックデジット計算方式](http://www.dsri.jp/jan/check_digit.htm)

`modulus10, weight3`

## excel

Numbers でも動作

```
=RIGHT(
    10-RIGHT(
        SUM(
            SUM(
                MID(A1,1,1),
                MID(A1,3,1),
                MID(A1,5,1),
                MID(A1,7,1)
            )*3,
            SUM(
                MID(A1,2,1),
                MID(A1,4,1),
                MID(A1,6,1)
            )
        )
        ,1
    )
)
```

A1 はセル位置。



## perl

```
my @d = split //, BARCODE_DATA ;
sub ad{ eval join q{+}, @_ } ; 
my $che = ( (  10 - ( ( ad @d[0,2,4,6] ) * 3 + ad @d[1,3,5]  ) % 10 ) % 10 )  ;
die if $che != $d[-1] ;
```

BARCODE_DATA はもちろん、対応するバーコード文字列


## 20151027 追記

結局マクロを触らなきゃならんくなった、、、

### VBA

```
Function digit8(Byval d As String)
    Dim o As Integer
    Dim i As Integer
    
    For i = 1 To 7 Step 2
        o = o + CLng(Mid(d, i, 1))
    Next
    o = o * 3
    
    For i = 2 To 6 Step 2
        o = o + CLng(Mid(d, i, 1))
    Next
    o = (10 - (o Mod 10)) Mod 10
    
    digit8 = o
    
End Function
```

適当なセルにて `=digit8(A1)` とかする、、、

### ruby

```
$ ruby -e 'd = "9876543".split("").map(&:to_i) ;  p  ( 10 - (d.values_at(0,2,4,6).inject(:+) * 3 + d.values_at(1,3,5).inject(:+) ) % 10 ) % 10 '
0
```