OmniAICreator/Qiita-1.07M huggingface dataset:
UIAlertControllerを拡張してアラート表示をちょっと便利にした

1つのプロジェクトの中の複数の箇所でアラートを表示していたので、
アラートの表示処理を少し楽にするためにUIAlertControllerを拡張しました。

# コード

```swift:
import UIKit

extension UIAlertController {
    
class func singleBtnAlertWithTitle(title: String, message: String, completion: (() -> Void)?) -> UIAlertController
{
  let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
  alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: {
    (action:UIAlertAction!) -> Void in
    if let completion = completion {
      completion()
    }
  }))
  return alert
}

class func doubleBtnAlertWithTitle(title: String, message: String, otherBtnTitle:String, completion: (() -> Void)?) -> UIAlertController
{
  let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
  alert.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil))
  alert.addAction(UIAlertAction(title: otherButtonTitle, style: .Default, handler: {
    (action:UIAlertAction!) -> Void in
    if let completion = completion {
      completion()
    }
  }))
  return alert
}

```

OKボタンしか存在しないアラートを使用したい場合はこんなかんじ。

```swift
let alert = UIAlertController.singleBtnAlertWithTitle("title", message: "message", completion: nil)
self.presentViewController(alert, animated: true, completion: nil)
```

ボタンが2つあって、一つはOKボタン(.Cancel)、もう一つは何か処理を行うアラートを使用したい場合はこんなかんじ。

```swift
let alert = UIAlertController.doubleBtnAlertWithTitle("title", message: "message", otherBtnTitle: "view表示", completion: {
  let vc = UIViewController()
  let nav = UINavigationController(rootViewController: vc)
    self.presentViewController(nav, animated: true, completion: nil)
  })
self.presentViewController(alert, animated: true, completion: nil)
```
Chromebookだけで仕事できるか確かめてみた

# いきさつ

大学教員です。パソコンの先生をしています。
Chromebookだけで仕事ができるか1ヶ月挑戦をしてみました。概ね、うまくいったので、やったこと・だめだったところなどまとめておきたいと思います。
当然のことながらこの原稿もChromebookで書いています。
（同僚に向けての内部的な報告ですが、何か参考になることもあればと思い、一般公開の形にしておきます）

# 環境など

## マシン
- ASUS　C300M（2015年10月20日購入）
- 自宅でのみ使用（光回線、WiFiはIEEE802.11a）
- プリンタ：キヤノンMG7530

## チートなところ
- 大学では教員用PCを使用（Win7または8）
- ただし、意識してなるべくウェブサービスを利用
- 仕事時間における職場と自宅の配分は半々ぐらい（研究室とかないので、自宅が研究室代わり）
- 今回は、外出時の持ち出しは行っていない
- サービスインの時から、メールはGmailに完全移行している
- 個人データはすべてDropboxに保存している
- 大学によりOSが違うので、もともとソフトウェアのスクリーンショットは当該大学で作成せざるを得ない状況だった

# 利点と欠点
## 実験期間中の主な授業（仕事）内容
- 映像編集と画像編集
- JavaScript入門
- パワーポイント
- 上記に関する授業資料作り（印刷資料とスライド資料）

## Chromebookで利用している主なサービス
1. Googleドライブ（有料相当。一年間は無料で増量されている）
2. Onedrive（有料相当。Office365のアカデミックアカウントなので実際は無料）
3. Dropbox（有料）
4. Evernote（有料）
5. Amazonプライム（有料）
6. Hulu（有料）
7. Googleミュージック（有料）
8. Youtubeの映像編集機能
9. WeVideo（有料）
10. Monaca
11. Cloud9
12. Soundtrap
13. Facebook
14. fc2（有料、って、おい^^;）
15. Pixlr Editor
16. Janvas
17. Line（ChromeApp）

## 利用方法
- 授業資料（スライド）の作成：1.または2.
- 印刷資料の作成：1.または2.
- 映像編集：8.または9.
- 音楽制作（Garagebandの代替）：12.
- 画像編集：15.（授業では未展開）
- JavaScriptの授業：10.
- 印刷：Googleクラウドプリントを利用

## タブレットではなくChromebookである理由
- タブレット同様、電源の持ちはすばらしい
- 無制限のマルチウィンドウが可能
- Flashに対応（映像系・画像系ではまだまだFlashが基盤のサービスは多い）
- 日本語入力もGoogle日本語入力なので、変換でイライラすることはない
- （年がバレるかもしれないが）マウスを使えるのはやっぱり嬉しい
- 安いは正義

## Chromebookではできなかったこと
以下のことはChromebookではできなかったので、日常的に利用していたMacbookAir(2011)を起動しました。「そりゃそうだろ！」という項目も含まれますが、記録としてすべて記載しておきます。

- OSXで暗号化されたディスクイメージに保存されたデータの検索
- SoundtrapでUSB接続のMIDIキーボードが使用不能（ピアノロールでの編集や予め取り込んだMP3ファイルのエフェクト操作とかはOK）
- カラースキームを保ったまま、コードを書き出す方法がなかった。JavaScript関連で印刷資料を作る目的。しかたないので、macvimを経由してワードに取り込む（この時は取り込みもMBAで行った）
- ChromeAppでもvimっぽいエディタ系やSSHクライアントはあるのだけれど、日本語が通らない
- ワードオンラインで、表の枠線と塗りつぶしを個別に設定できない。任意の色が選択できない。パワポオンラインも同様
- ワードオンラインで図形挿入ができない
- wevideoの問題点として「10フレーム以下のクリップが作れない」「クロマキー処理は有料」「Chromebookでは日本語メニューが文字化けする（メニューを英語にするしかない。テロップへの日本語入力そのものは問題なし）

# 今後の展開・その他

## 未展開・今後の検討事項
- イラレの代替として16.
- WordPressの設置場所として11.
- PDFの編集をするにはどれがいいか？（OSXのプレビューの代替としてどのサービスがいいか？例えば注釈をつけたり、ページを増やしたり）

## 大学で授業展開するときの問題点（一部予測含む）
- ネット接続が不可欠
- 接続速度もある程度ほしい
- 有料プランに加入しないと使い物にならないものもある
->（ソフトに支出するのではなく、サービスに支出させる文化が受け入れられるか？）
- 英語メニューしかないサービスも少なくない
- 電源の持ちがよいので、普通教室でも展開が可能（？）

## コツ
- ちょこちょこしたメモ書きなどは、サービスを固定せず、たまたま開いているサービスに書き込み、後日Evernoteにまとめる
- メモ書きのためだけに、何かをわざわざ開くのは面倒なので

## ひとこと
Monacaに出会ってなければ、そもそもこの実験も思いつかなかったと思います。ただいま、それくらいMonacaラブです。

特定のソフト（具体的にはPremiereElmtとかPowerPoint）の使い方そのものを教えなければならない部分もあり、そこは代替不能でした。

PPTを教えているから、ということもありますが、「（印刷するのでなければ）画像の編集はPPTでいいんじゃない？」「アニメーションソフトがなければパワーポイントを使えばいいじゃない」「イラレは高いから、レイアウトはPPTで充分じゃね？」的に、パワポ狂信者になりつつあります。以前よりもいろんなことに妥協的になってます。

あと、iPhoneなければ、絶対に無理だったと思います。改めて自分の生活パターンを見てみると、以前であればパソコンを起動していた場面でも、相当程度iPhoneで済ませていることが多いことに気付かされました。
Vimチートシートを作りました（超初心者用）

　
Vimチートシートを作りました。

![vimチートシート.jpg](https://qiita-image-store.s3.amazonaws.com/0/80608/d6ab3c97-999a-7acb-7447-9b65b838ceb6.jpeg)


[SlideShare](http://www.slideshare.net/SatomiKawaguchi/vim-55382254)


プリントアウトしてご活用ください！

#このチートシートのポイント

ただvimコマンドをダラダラと羅列させるだけならコマンドをググればオッケーです

このチートシートはVim初心者がプリントアウトして傍に置きながら勉強できるように作成しました。

つまり
・pdfで
・本当に使うコマンドだけ
・見やすく
・書き込みやすく
です。

ベテランびまぁの皆様、
書き加えたほうがいい項目等、ご教示いただけると助かります。


#参考にしたもの

この本と
[実践vim](http://www.amazon.co.jp/実践Vim-思考のスピードで編集しよう-Drew-Neil/dp/4048916599)
このサイトと
http://vimblog.hatenablog.com:embed:cite
この元祖チートシート
http://www.namaraii.com/files/vim-cheatsheet.pdf:image=http://www.namaraii.com/files/vim-cheatsheet.pdf
です。

これからまだまだ改良を加えていくので、ご意見お聞かせください。


※2019/06/10追記
こんな記事も書きました。
[Vim8でプラグイン管理 - Qiita](https://qiita.com/hattys2/items/c19d73ae045f5258768b)
GitLabでLDAP連携するための設定

以下の設定ファイルを編集すればOK
（GitLab CE Omnibus packageでインストールした環境であることが前提です）

```bash
sudo vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
```

```yaml:デフォルト
  #
  # 3. Auth settings
  # ==========================

  ## LDAP settings
  # You can inspect a sample of the LDAP users with login access by running:
  #   bundle exec rake gitlab:ldap:check RAILS_ENV=production
  ldap:
    enabled: false
    host:
    port:
    uid:
    method:  # "tls" or "ssl" or "plain"
    bind_dn:
    password:
    active_directory:
    allow_username_or_email_login:
    base:
    user_filter:
```


```yaml:編集後（例）
  #
  # 3. Auth settings
  # ==========================

  ## LDAP settings
  # You can inspect a sample of the LDAP users with login access by running:
  #   bundle exec rake gitlab:ldap:check RAILS_ENV=production
  ldap:
    enabled: true
    host: ***.***.***.***
    port: 389
    uid: sAMAccountName
    method: plain # "tls" or "ssl" or "plain"
    bind_dn: CN=Administrator,CN=Users,DC=gitlab,DC=local
    password: ********
    active_directory: true
    allow_username_or_email_login: false
    base: DC=gitlab,DC=local
    user_filter:
```

```bash:再起動
sudo gitlab-ctl restart
```

LDAPのユーザでログインできるようになります。

![Sign in - GitLab (1).png](https://qiita-image-store.s3.amazonaws.com/0/36230/d5bca7b5-2ce8-8b52-99a8-2653a6e09a7c.png)
TextViewのsetText()、リソースIDを変数で

TextView comment = (TextView) findViewById(R.id.comment);
comment.setText(R.string.xxxx);


strings.xmlに
string name="str0"
string name="str1"
string name="str2"
string name="str3"

を用意しておいて、０−３を変数にしたかった。
int num = 0;　　//仮に0としています
String id = "R.string.str" + num;
comment.setText(R.string.id);

なんてやってもうまくいかず。

これで解決
int num = 0;　　//仮に0としています
final int[] strId = {R.string.str0, R.string.str1, R.string.str2, R.string.str3};
comment.setText(strId[num]);
Golangを書くときに便利なIntelliJショートカット(よく使うやつだけ)

* GoをMac版 IntelliJ Idea で書き始めました
* よく使うショートカットの備忘録です
* ところでQiitaマークダウンで表書くのむずかしいですね


# ドキュメント表示
|Shortcut|Action| Note |
|:-----------|:------------|:------------|
|esc|サブウィンドウを閉じる||
|(メソッドの上で)F1|簡易ドキュメント表示||


# 移動系
|Shortcut|Action| Note |
|:-----------|:------------|:------------|
|⌘ + ⌥ + →| Forward ||
|⌘ + ⌥ + ←|Back||
|⌘ + 左クリック|そのメソッドへ移動||
|⌘ + 左クリック|そのパッケージの階層を開く||
MacのVirtualBoxにCentOS7環境をつくる際に参考にしたサイト

* VirtualBoxにCentOS7環境をつくる際に参考にしたサイトの自分用リンク集です。(忘れそうなので…)

# VirtualBoxのダウンロード
* [Downloads – Oracle VM VirtualBox]
(https://www.virtualbox.org/wiki/Downloads)

# CentOS7環境の構築
* [VirtualBoxにCentOS7をインストールしてみる - yk5656 diary]
(http://d.hatena.ne.jp/yk5656/20141120/1419172461)
* 上記サイトの設定通りで問題なく構築できました。感謝。

#

* [VirtualBox 仮想マシンのクローンとネットワークアダプターの再設定（CentOS7） | あぱーブログ](https://blog.apar.jp/linux/963/)
正式リリース前のBeta版 PostgreSQLをDLして動かす

# 概要
* 正式リリース前のBeta版PostgreSQLのソースコードをDLして動かす方法の備忘録です

# 環境
* CentOS Linux 7 64bit (Mac に VirtualBox で VM環境を建てています)

# ソースコード
[postgres/postgres](https://github.com/postgres/postgres)
* GitHubの上記リポジトリからソースコードをcloneします
* (上記ページにも書いてあるように、PostgreSQLのオフィシャルリポジトリは別にあり、GitHubはミラーリポジトリです)

# インストールパス
* 今回は以下のパスにインストールします

| 概要 | パス |
|-----------|------------|
| ソースコードをDLする場所       |        /usr/local/src/postgres |
| PostgreSQLをインストールする場所     |      /usr/local/pgsql |


## 手順

### 1.リポジトリからソースコードをダウンロード

```
# cd /usr/local/src/
# git clone https://github.com/postgres/postgres.git postgres
```

### 2.Makeファイル作成
#### 基本的な開発環境の構築(まだの場合)

```
# yum install git gcc zlib-devel bison flex readline-devel openssl-devel
```

#### Makefile作成

```
$ cd postgres
$ ./configure --prefix=/usr/local/pgsql –-enable-depend --enable-debug –-enable-cassert 
$ ls -al | grep Makefile | grep -v grep   #Makefileが作成されたことを確認
```

* `./configure --help` で各オプションの説明が表示される。以下3つはデバッグ用です。
* enable-depend ... ヘッダファイルを修正した際に、それに依存する全てのソースファイルもリビルドされるようになります。ソースコードを頻繁にリビルドする場合はつける
* enable-debug ... デバッグ用情報をつけてコンパイルする
* enable-cassert ... 各種チェックが走るようになる

### 3.ソースコードをコンパイル

```
$ make
$ make check
$ make install
```


### 4.DBを初期化

```
$ /usr/local/pgsql/bin/initdb –encoding=UTF8 –no-locale
```

### 5.PostgreSQLを起動

```
$ pg_ctl -w start 
$ ps aufx | grep postgres | grep -v grep   # 起動したことを確認
```

### 6.DBに入って確認

```
$ /usr/local/pgsql/bin/psql
psql (9.6devel)
Type "help" for help.

postgres=#
```

* バージョンに devel(developer) と表示されました。

# 参考
* [PostgreSQL/PostgreSQLをソースからCentOSにインストール - 調べる.db](http://db.just4fun.biz/?PostgreSQL%2FPostgreSQL%E3%82%92%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89CentOS%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
* [CentOS7にPostgreSQL9.3と最新のもので環境構築してみた。](http://maplesystems.co.jp/blog/all/programming/11668.html)
* [第33回 PostgreSQL 勉強会(2015年11月14日) — NPO法人 日本PostgreSQLユーザ会](https://www.postgresql.jp/wg/shikumi/pgstudy_33/view)
ITMS-90060エラーでiTunes Connectへバイナリがアップロードできない件

# 問題
iTunes Connectへバイナリをアップロードする際に, 以下のエラーで失敗してしまう (****の部分はプロジェクトによって違う).

```
ERROR ITMS-90060: "This bundle is invalid. The value for key CFBundleShortVersionString `****` in the Info.plist file must be a period-separated list of at most three non-negative integers."
```

# 原因
iTunes Connectへバイナリをアップロードした際に, サブミットしようとしているアプリのバージョンだけでなく, CocoaPodsでバンドルしているモジュールのバージョンもチェックされるようになった. 結果, バンドルしているモジュールすべてのInfo.plistがチェックされ, その中に不正なバージョン名のものが存在すると上記エラーが発生してしまう.

バージョン名はエラーメッセージにある通り, ピリオドで区切られた非負の整数である必要があるが, 例えば `1.0.0-alpha1`や`1.0.0-rc1`のようなバージョン名のPodを利用した際などにエラーが発生する.

# 対処方法
[Issueスレッド内の投稿](https://github.com/CocoaPods/CocoaPods/issues/4421#issuecomment-150372394)で提案されているフックをPodfileに追記する.

上記フックは `pod install`実行後にすべてのモジュールの中の不正なバージョン番号を自動で置き換えるもの.

# 参考
* [Uploads to iTunes Connect fail when pods' Info.plist versions do not conform to %d.%d.%d format #4421](https://github.com/CocoaPods/CocoaPods/issues/4421)
デバイス側の232C通信/TCP通信を作成する方へのお願い


# デバイス側の232C通信/TCP通信を作成する方へのお願い

  IoTの流行で、RaspberryPiなどの小型のデバイスで計測したデータを送信したり、外部機器と通信したりするプログラムを自作する機会も増えていると思いますが、以下の点に注意してもらえれば、あなた以外の人がそのデバイスと通信する時に余計な苦労をしなくてすみます。ぜひご検討ください。

## 1.アスキーデータ
データの終端にはデリミタを必ずつけましょう。
特に、垂れ流し出力の場合は必ずデリミタをつけるようにしましょう。
  232Cの場合のデリミタは、CR, LF, CR/LFのいずれか、TCP/IPの場合のデリミタはCR/LFを推奨します。
  また、あくまでも、CR/LFであって、LF/CRはだめですからね。
  もしも、うっかり特定のケースの時だけデリミタつけない、つけるのを忘れたという場合、相手側からすれば、かなり面倒な類の「不具合」なので、つべこべいわずにとっとと直しましょう。
そして、アスキーデータというからには、アスキーコード以外のデータは入れないでください。（アスキーデータといいつつ途中に00Hなんか入ったりするとトラブルになりやすい。）

  まれですが、ターミナルソフトで通信することを想定して、初心者でもわかりやすいように  "\n\r>"などプロンプトを送信するのものがありますが、コンピュータ同士で通信する場合には、余計なお世話、です。
  プロンプトなど、コンピュータ同士で通信するのに意味のないデータはつけないでください。

## 2.バイナリデータ
バイナリデータの送信時のフォーマットで、データの末尾につける終端コードにETX(03H)をつけるのはあまり意味がありません。
データの途中にETXと同じコード(03H)が含まれていたら、データ終了と誤って判定してしまうので、受信側はデータ終端の判定には使えません。CRやLFでも同様です。
  バイナリデータの送受信の場合は、バイト数を決めて出力するようにしましょう。または、先頭にデータの長さ（バイト数）を入れるという方法もあります。

## 3.起動時の出力
  起動時に、スタートアップの意味でファームウェアのバージョンなどを出力するものがありますが、通信の邪魔になるのでやめましょう。
  通信中に、なんらかの理由でデバイス側が再起動してしまった時に、相手がその出力を受け取ってしまうと、受け側のソフトは予期しないデータを受け取ることになり、それをフィルターするプログラミングにどれだけ無駄な時間がかかるのか。最悪、フィルターしきれずに誤動作する可能性があります。
 せっかく、性能のよいデバイスを作っても、通信で誤動作が頻発してたらデバイスの信頼性を疑われてしまいます。

## 4.エコーバック出力
デバイス側が受け取ったコマンドをそのまま送り返すエコーバックですが、基本的にエコーバック出力はしないか、もしくは、オプションなどの設定でエコーバックの有無を切り換えられるようにしましょう。
たぶん親切心でやっているのかもしれませんが、エコーバックは無駄です。

## 5.通信プロトコルの説明
送信するコマンドの書式については正確に記載されていても、デバイスから返す応答メッセージについての記載は、なおざりだったりします。ろくに書いてない場合も多々あります。
デバイスと実際に通信すればわかる、ということなのでしょうが、そのデバイスが手元にある場合はそれでいいのですが、そうでない場合もあるのです。
成功した時、SyntaxErrorだった時、範囲外だった時に、どういう応答メッセージを返すのかできる限り具体的に記載しましょう。
最低限、終端につけるのはCRなのか、LFなのかCR/LFなのかくらいは、きちんと書きましょう。
また、応答メッセージのフォーマットが、各コマンドでばらばらだったりしないよう、統一感のあるものにしましょう。
入れ子になったクラスで内部クラスから外部クラスの情報を取得する

以下の様なクラスがあった場合に

```csharp
public class OuterClass
{
    public class InnerClassA
    {
    }
    public class InnerClassB
    {
    }
    public class InnerClassC
    {
    }
}
```
`InnerClassA`から`OuterClass`の情報を取得したい。

```csharp
var innerTypeA = typeof(OuterClass.InnerClassA);
var outerType = innerTypeA.DeclaringType;
```

とすれば以下のように取得できる。
![image](https://qiita-image-store.s3.amazonaws.com/0/41133/b14987c0-5be0-b70f-afe2-0136d82bb420.png)


逆に外部クラスから内部クラスの情報を取得するには

```csharp
var outerType = typeof(OuterClass);
var innerTypes = outerType.GetNestedTypes();
```

とすれば取得できる。
![image](https://qiita-image-store.s3.amazonaws.com/0/41133/ae4818cf-5907-086c-034b-e8d2af940b27.png)
Unity拡張：GUILayout.Label で自動折り返し表示

EditorWindow による独自ウィンドウ内にて GUILayout.Label を自動折り返し表示する方法。

## GUIStyle.wordWrap
GUIStyle の wordWrap を true にすると自動折り返し表示されます。

```csharp
void OnGUI()
{
    GUIStyle style = new GUIStyle(GUI.skin.label);
    style.wordWrap = true;
    GUILayout.Label("折り返し折り返し折り返し折り返し折り返し折り返し折り返し折り返し折り返し", style);
}
```


![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/25555/ba7091c3-7535-e702-f42c-46c6bb33804d.png)

## サンプルプロジェクト
- [kobake/unity-editor-ext-sample](https://github.com/kobake/unity-editor-ext-sample)
    - [BuildWindow.cs ](https://github.com/kobake/unity-editor-ext-sample/blob/master/Assets/Editor/BuildWindow.cs)

## 参考
- [How can I enable word wrapping for GUI? - Unity Answers](http://answers.unity3d.com/questions/50365/how-can-i-enable-word-wrapping-for-gui.html)
プログラミングを最初に学ぶ時に知っておきたいテーブル駆動方式

テーブル駆動方式は、スティーブ・マコネルの『コード・コンプリート』にも記述のある古典的なプログラミングテクニック。

大して難しくないし、データ構造を利用することでアルゴリズムが劇的にシンプルになることが体験出来るので、新人にやらすといいと思っている。DBのデータモデルを注意深く検討する意識付けにもなる。

配列を使うので、別にオブジェクト指向言語でなくても使える。
特にSI企業とかで、複雑な業務ルールを扱うことになるプログラマや設計者には、一回は体験させておきたい。

ググると、何人かの方が記事書いている。
http://www.geocities.co.jp/Playtown-Domino/5148/prog_03.html
http://www.sakalab.org/3zemi06/no8.html

新人研修とかで、使っていたのは、血液型の相性判定プログラム。２値の組み合わせで出力が変わるタイプのもの（テーブルで仕様を表現できるもの）なら題材はなんでもいい。

if-elseで書かれたコードを下記のように書き直して見せれば、かなりショックを受けるはず。

```java:Sample.java
public class Sample {
    
    private final static int TYPE_A = 0;
    private final static int TYPE_B = 1;
    private final static int TYPE_O = 2;
    private final static int TYPE_AB = 3;
    
    public static void main(String[] args) {

        //相性のルールをテーブルで定義
      String[][] affilityTable = {
              //        A           B             O          AB
              /*A*/  {"GOOD"     ,"BAD"      ,"VERY_GOOD","NORMAL"    },
              /*B*/  {"BAD"      ,"GOOD"     , "NORMAL"   ,"VERY_GOOD"},
              /*O*/  {"VERY_GOOD","NORMAL"   , "GOOD"     ,"BAD"      },
              /*AB*/ {"NORMAL"   ,"VERY_GOOD", "BAD"      ,"GOOD"     }
                
        };

        //A型とAB型の相性
        String result = affilityTable[TYPE_A][TYPE_AB];
        System.out.println("A型とAB型の相性は"+result);

    }
}
```

kotlinでオブジェクト指向っぽく書いてみた。

```kotlin:Table.kt
package sample.table

import sample.table.BloodType.AffinityResult.VERY_GOOD
import sample.table.BloodType.AffinityResult.GOOD
import sample.table.BloodType.AffinityResult.NORMAL
import sample.table.BloodType.AffinityResult.BAD

import sample.table.BloodType.A
import sample.table.BloodType.B
import sample.table.BloodType.AB

/**
 * 血液型相性占い
 */
fun main(args: Array<String>) {

    //A型とB型の相性
    val result = A.calcAffinityWith(B)
    println("A型とB型の相性は${result.name}")


    //AB型とB型の相性
    val result2 = AB.calcAffinityWith(B)
    println("AB型とB型の相性は${result2.name}")

}

/**
 * 血液型のEnum
 */
enum class BloodType(val index: Int) {

    //デフォルトで、originalを使えば、0〜3が割り当てられるが、言語仕様に依存するので、別途indexを定義
    A(0), B(1), O(2), AB(3);

    /**
     * 相性の結果Enum。内部クラスとして定義する。これは外に出してもいいかも。
     */
    enum class AffinityResult {
        VERY_GOOD, GOOD, NORMAL, BAD
    }

    /**
     * コンパニオンオブジェクト内で相性ルールをテーブル(二次元配列)で定義。
     * 通常のフィールド定義でも動くが、同じテーブルがA,B,O,ABそれぞれで作られてしまうため、無駄
     */
    companion object Inner {
        private val AFFINITY_TABLE = arrayOf(
                arrayOf(GOOD     ,BAD      , VERY_GOOD, NORMAL  ),
                arrayOf(BAD      ,GOOD     , NORMAL   ,VERY_GOOD),
                arrayOf(VERY_GOOD,NORMAL   , GOOD     ,BAD      ),
                arrayOf(NORMAL   ,VERY_GOOD, BAD      ,GOOD     )
        )
    }

    /**
     * 相性を算出する。
     */
    fun calcAffinityWith(other: BloodType): AffinityResult = AFFINITY_TABLE[this.index][other.index]

}


```

３次元での組み合わせが必要なら、３次元配列にしておけば良い。
オブジェクト指向言語を使っているなら、Strategyパターンと組み合わせれば、アルゴリズムも選択できる。
ASP.NET 5 のチュートリアルをやってみる

# RCになったASP.NET 5 を使ってみる

## ◆やってみたこと

- [コチラ](http://docs.asp.net/en/1.0.0-rc1/tutorials/your-first-aspnet-application.html)のMS公式チュートリアルに沿ってWebアプリケーションをいじってみた
- その際に詰まったことなどを備忘録的に

## ◆環境

- `OS` Windows 7 Professional 64bit
- `IDE` Visual Studio 2015 Community
- `DB` SQL Server 2014 Express

## ◆得られたこと

- なんとなく今までの開発環境と異なったんだ、という感覚
- ホントにこれがLinuxでも動くのか！という感動

## ◆詰まったこと

1. 「Prerequisites」
    - http://docs.asp.net/en/1.0.0-rc1/getting-started/installing-on-windows.html
    - Visual Studioをインストール済だったのに「Install ASP.NET 5 with Visual Studio」の「2. Install ASP.NET 5.」からやろうとした。
        - まだASP.NET 5の環境を作ってなかったため、ここでいきなりミスをして少し時間くったｗ
        - ダウンロードした「AspNet5.ENU.RC1.exe」を実行してもインストールに失敗する？というか完了したっぽいのに次に `dnvm` コマンドがパス通ってなくて実行できなかった
    - 「Install ASP.NET 5 from the command-line」を実施すれば解決！
2. 「Configure the web app before including sample data」
    - 書いてある通り `Microsoft.Framework.DependencyInjection` を `dependencies` に書いても、インテリセンスに「1.0.0-rc1-final」が出てこない
    - よく見ると、画像内は `Microsoft.Extensions.DependencyInjection` と書いてあって、こちらを入力すればインテリセンスに「1.0.0-rc1-final」が出てきた
    ![MS使用画像](http://docs.asp.net/en/1.0.0-rc1/_images/15d2-di-intellisense.png)
3. 「Using data migrations to create the database」
    - 「Run each of the following commands from the **Command Prompt**:」とあるところのコマンド `dnx ef database update` を実行するとエラーになる。
    ![image](https://qiita-image-store.s3.amazonaws.com/0/94207/02ab440b-3d54-5ac5-9fa8-4b8d03e4ca20.png)
    - そもそもSQL Serverをインストールしてなかったのでインストール
        - https://www.microsoft.com/ja-jp/download/details.aspx?id=42299
            - 「Express 64BIT\SQLEXPR_x64_JPN.exe」本体
            - 「MgmtStudio 64BIT\SQLManagementStudio_x64_JPN.exe」SSMS
            - 「LocalDB 64BIT\SqlLocalDB.msi」LocalDB
    - よくよく調べたらSQL Serverインストール時に「LocalDB」は選択しないとインストールされないことを初めて知った。そのせいで結構時間くったなぁ。たぶんSQL Serverのインストールは上みたいに個々にやらずに全部入り(だと思われる)「ExpressAdv 64BIT\SQLEXPRADV_x64_JPN.exe」あたりをダウンロードしとけばいいかもしれない(試してない)。
LabVIEW Tips: GoogleChartAPIでQRコード

# LabVIEW Tips: GoogleChartAPIでQRコード

## はじめに
 他にも同じようにQRコードを作成するサンプルを公開されている方もおられますが、ウェブサービス関連のパレットに含まれている、URLエンコード、画像データを変換するVIなどを使うとより簡潔に書くことができたので、参考までに記事にしてみました。

## 作り方
HTTPクライアント関数のGET.viを使って、URLにGoogleChartAPIのURLを指定、GET.viからの出力を"PNG Data to LV Image"に渡して画像データに変換しています。画像は2Dピクチャー制御器に出力しています。

GoogleChartAPIに日本語を渡す場合は、UTF-8に変換する必要があるようで、"TextToUTF-8"(http://qiita.com/alucky4416/items/64d4557d74b730c36e40) を使って、UTF-8変換後に"Escape HTTP URL"を使ってURL文字列に変換しています。

また、URLに含まれるパラメータ"choe=Shift-JIS"で、出力されるQRコードの文字コードをシフトJISに指定しています。デフォルトでは、UTF-8になってしまうようです。

LabVIEW 2012で作成したVIスニペットを貼り付けておきます。
![LvExample_GetQRImageFromGoogleChartAPI.png](https://qiita-image-store.s3.amazonaws.com/0/43526/3e6107c0-1084-a847-68dd-8c0b282aefdc.png)
lita-slackでIDのわかってるユーザー / チャンネルにBotから話しかける

Ruby製のBot [lita](https://www.lita.io/) でSlack Botを作り始めた。

handlerからSlack上のIDがわかってるチャンネル / ユーザーにBotから話しかける方法を調べたのでメモしておく。

# 手順

## ユーザーを探す

litaの機能でIDを調べておく。

```
lita users find #{USER_NAME}

# => #{SCREEN_NAME} (ID: #{USER_ID}, Mention name: #{USER_NAME})
```

handlerのコンテキストでユーザーを取得する。

```rb
user = User.find_by_id("#{USER_ID}")
```

## チャンネルを探す

Slack appなどからチャンネルのIDを調べておく。

`Add a Service Integration ...`

などを開くと、URLにチャンネルのID文字列がついてるので控えておく。

handlerのコンテキストでチャンネルを取得する。

```rb
room = Lita::Room.find_by_id("#{CHANNEL_ID")
```

## メッセージを送る

取得したuser / channel から `Lita::Source` を作り、 `Lita::Robot#send_message` を叩く。 `Lita::Robot` はヘルパーメソッド `robot` で取得できる。

```rb

source = Lita::Source.new(user: user)

# or

source = Lita::Source.new(room: room)

robot.send_message(source, 'hai!')
```
Redux入門 2日目 Reduxの基本・Actions(公式ドキュメント和訳)

前回 [Redux入門 1日目 Reduxとは](http://qiita.com/kiita312/items/b001839150ab04a6a427)

前回に引き続き、reduxの公式ドキュメントを辿りながら、ざっくり和訳していきます。
2章からはTodoアプリを作成しながらReduxのそれぞれの要素を順番に解説していきます。

## 2.1 Actions
* actionはアプリケーションからの情報をstoreへ送る為のオブジェクト
* actionは store.dispatch()でstoreへ送られます
* actionは、何を行なうものかを識別するために"type"プロパティを必ず持つ。他のプロパティについては自由。

```js
const ADD_TODO = 'ADD_TODO'
{
  type: ADD_TODO,
  text: 'Build my first Redux app'
}
```
* typeの値は文字列。アプリケーションが大きくなる場合は、typeの定義値を別モジュールにするとよい

```js
import { ADD_TODO, REMOVE_TODO } from '../actionTypes'
```

* 下記はTODOが終わったことを伝えるアクション。どのアイテムを参照するかをindexに記載してます。実際にはユニークなIDを発行して使用するのがいいでしょう

```js
{
  type: COMPLETE_TODO,
  index: 5
}
```

* 下記は表示モードを切り替えるactionです

```js
{
  type: SET_VISIBILITY_FILTER,
  filter: SHOW_COMPLETED
}
```

###Action Creators

action creatorsは、その名の通りactionを生成するメソッドです。

* Fluxでは、action creator内でactionを作成して、そのままdispatchまでを行なうのが一般的です

```js
function addTodoWithDispatch(text) {
  const action = {
    type: ADD_TODO,
    text
  }
  dispatch(action)
}
```

* 対してReduxでは、シンプルにactionを作るだけです。その方がテストしやすいからです。

```js
function addTodo(text) {
  return {
    type: ADD_TODO,
    text
  }
}
```

* dispatchするときはcreatorで作成したactionを渡します。

```js
dispatch(addTodo(text))
dispatch(completeTodo(index))
```

* または、bound action creator　としてdispatchまでを行なうcreatorを別途用意します

```js
const boundAddTodo = (text) => dispatch(addTodo(text))
const boundCompleteTodo = (index) => dispatch(completeTodo(index))
```

* react-reduxライブラリのconnectをimportして、ヘルパーのbindActionCreators()を使うのもいいでしょう

```js
import { Component } from 'react'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'

let boundActionCreators = bindActionCreators(TodoActionCreators, dispatch)
```


続き [Redux入門 3日目 Reduxの基本・Reducers](http://qiita.com/kiita312/items/7fdce94912d6d9c801f8)
Vagrant上のCentOS7.1でPlayFramework開発環境を用意し、Herokuにデプロイするまで




## 必要なミドルウェアのインストール
```bash
# git
sudo yum install -y git
# ruby
sudo yum install -y ruby

# java8
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm
rpm -ivh jdk-8u65-linux-x64.rpm
```
他はお好みで。

## svmのインストール
```bash
mkdir -p $HOME/.svm
git clone https://github.com/yuroyoro/svm $HOME/.svm
```

## svmへのパスを通す
.bashrcに下記を追記

```bash
export PATH=$HOME/.svm:$PATH
if [[ -d "$HOME/.svm/current/rt" ]]; then
  export SCALA_HOME=$HOME/.svm/current/rt
  export PATH=$SCALA_HOME/bin:$PATH
fi
```

## scalaのインストール
2015/11/22時点では2.11.7が最新の模様

```bash
svm install 2.11.7
svm use 2.11.7
```

## playフレームワークのインストール

```bash
wget http://downloads.typesafe.com/typesafe-activator/1.2.12/typesafe-activator-1.2.12-minimal.zip
unzip typesafe-activator-1.2.12-minimal.zip
mv activator-1.2.12-minimal /usr/local/lib
ln -s /usr/local/lib/activator-1.2.12-minimal/activator /usr/bin/activator
```

下記コマンドが通っていれば成功

```bash
activator -help
```

## play-scala Applicationの雛形作成
下記のコマンドを実行

```bash
activator new test-app
```

```bash
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
```
と聞かれるので、6を選択

## playサーバを起動
```bash
cd test-app
activator run
```

playはローカル環境では9000番ポートを使うのでここにアクセス。

http://localhost:9000


なにはともあれ、git commitしておきましょう。

```bash
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git init
git add .
git commit -m "init"
```


## Heroku toolbeltのインストール

```bash
wget -qO- https://toolbelt.heroku.com/install.sh | sh
echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```
下記コマンドが通っていれば成功

```bash
heroku --version
```

## Herokuへのデプロイ
```bash
cd test-app
heroku create
git push heroku master
```
だけでデプロイできました。







参考）
[CentOS 7 に svm を使って Scala を入れる](http://blog.tanitanin.net/?p=840)
[CentOS 7 に Play Framework 2.3 を入れる](http://blog.tanitanin.net/?p=847)
[ScalaのPlayフレームワークをvagrant環境に構築する方法](http://qiita.com/dahugani/items/d0a85417ddd74651c359)
[[Scala] 初めてのScala on Play Framework on Heroku](http://qiita.com/susan_mamma/items/f17b8f9b9cc7a1e59ab4)
[説明と違う！MacのPlay初心者がver.2.3インストールでつまづくポイント](http://www.marginalmans.com/entry/2014/12/07/203958)
[MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.08](http://qiita.com/hirolog/items/6b3ff1a19c3d5471a5b9)
[CentOS6.xにOracleのJDK8をインストールする](http://qiita.com/Sa2/items/8ba501294df745be8c78)
naming > epoch time > EaselJS / Unix


EaselJSというもののAPIドキュメント
http://www.createjs.com/docs/easeljs/classes/Event.html

ここで目が止まったのは

> timeStamp Number readonly
Defined in timeStamp:124
The <font color=red>epoch time</font> at which this event was created.

<hr>
epoch timeで検索したところ

https://en.wikipedia.org/wiki/Unix_time
> Unix time (also known as POSIX time or <font color=red>Epoch time</font>) 

Unixのepoch timeとEaselJSのepoch timeの関係性は不明。

EaselJSの方は単純にevent生成時の日時にすぎないのかもしれない。
Reachability 4.2で何が変わったのか確認してみた


サンプルコードでありながら、そのままコード変更なしで使われることも多いと思われる[Reachability](https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html)について、リビジョンが3.5から4.2に上がっていたので何が変わったのか確認してみました。

# Minor bug fixes

[Revision History](https://developer.apple.com/library/ios/samplecode/Reachability/History/History.html#//apple_ref/doc/uid/DTS40007324-RevisionHistory-DontLinkElementID_1)を見てみると、2015/11/12付けで「Minor bug fixes」と書かれています。実際にはコードには下記が追加されています。

### Core Foundationオブジェクトのリリース処理

```objectivec:Reachability.m(79-81行目)
        else {
            CFRelease(reachability);
        }
```

```objectivec:Reachability.m(101-103行目)
        else {
            CFRelease(reachability);
        }
```

### viewDidLoadのsuper呼び出し処理
```objectivec:APLViewController.m(40行目)
    [super viewDidLoad];
```

Reachabilityそのものに関する実質的なバグフィックスとしては、
**Core Foundation(SCNetworkReachabilityRef)オブジェクトのリリース処理が抜けていたので追加した**ということのようです。


# Requirements iOS 8.0 or later

LaunchScreen.storyboardファイルが追加されています。起動画面としてstoryboard(xib)を使えるようになったのは、Xcode 6/iOS 8.0以降なので、RequirementsとしてiOS 8.0 or laterとなっているのでしょう。他にはReachability-Info.plistを確認すると、CFBundleIdentifierのvalueが$(PRODUCT_BUNDLE_IDENTIFIER)に変わっていたりします。


# まとめ
すでにReachabilityを実質的なユーティリティクラスとして使っている場合、リビジョン3.5をベースにして使っていると思われるので、下記を理解しておけば十分かと思います。

 - リビジョン3.5から4.2において、Reachbilityクラス内部においてCore Foundationオブジェクト解放処理が追加された(バグフィックス)。
 - リビジョン3.5から4.2において、公開メソッドは変わっていない。Reachability.{h,m}ファイルを差し替えるだけでOK。
root無しの環境でtensorflowを使う

root権限を持っていない環境でtensorflowを使おうと思った時に詰まるポイントのメモ。
環境はCentOS 6.7ですが、どこでもいっしょだと思います。CUDAは使っていません。

# Pythonのバージョン

2.7系列が入っていないと動きません。pyenvを使いました。[こちら](http://qiita.com/1000ch/items/93841f76ea52551b6a97)を見てください。ただしその時、[こちら](http://qiita.com/cookienote/items/f1c7c4e76140f68cb81b)にあるようにオプションを指定する必要があります。ちなみにオプション無しのpipで入れてしまった場合は、ライブラリを入れなおす必要があります。numpy,sympy,tensorflowを入れなおしました。

# glibc, libstdc++のバージョンについて

コンパイル済みバイナリを使っているので、libcのバージョンが合わないと使えません。そこで、rpmをダウンロードして差し替えます。CentOSでは[packages.debian.org的なものはない](http://serverfault.com/questions/239205/official-online-rpm-package-browser-search-for-centos)らしいので、レポジトリから直接抜いてきます。例えば理研なら[ここ](http://ftp.riken.jp/Linux/centos/7/os/x86_64/Packages/)で、

```bash:
$ mkdir ~/tflib
$ cd ~/tflib
$ wget http://ftp.riken.jp/Linux/centos/7/os/x86_64/Packages/glibc-2.17-78.el7.x86_64.rpm
$ rpm2cpio glibc-2.17-78.el7.x86_64.rpm|cpio -idv
$ wget http://ftp.riken.jp/Linux/centos/7/os/x86_64/Packages/libstdc++-4.8.3-9.el7.x86_64.rpm
$ rpm2cpio libstdc++-4.8.3-9.el7.x86_64.rpm|cpio -idv
```

としておきます。Debian/Ubuntuなら適当に探してきて解凍すればいいと思います。[^1]
[^1]: もしかしたら依存関係があるかもしれませんが、この他に特に何も入れなくても動きました。Debian/Ubuntuならpackages.debian.org的なところで依存関係も見られると思うので、適宜入れてください。
これでいよいよ全部揃ったわけですがld-linux.soのバージョンも合わないとあぼーんなので、

```bash:
$ LD_LIBRARY_PATH=~/tflib/lib64/:~/tflib/usr/lib64/ ~/tflib/lib64/ld-2.17.so ~/.pyenv/versions/2.7.10/bin/python tutorial1.py
```

とかするとようやく起動できます。面倒なので私は

```bash:~/.bashrc
alias tfpy='LD_LIBRARY_PATH=~/tflib/lib64/:~/tflib/usr/lib64/ ~/tflib/lib64/ld-2.17.so ~/.pyenv/versions/2.7.10/bin/python'
```

としておきました。

```bash:
$ tfpy tutorial1.py
```

# 補足

本当は多分numpyとかPython自体も新しいlibcでコンパイルし直さないといけないような気がします。。
今のところエラーは出ていませんが。
re:dashをdockerで立ち上げてみる

※ 2016/07 現在のre:dashについては [いつの間にかre:dashの設定が簡単になってた(Dockerを使えば)](http://taizo.hatenablog.jp/entry/2016/07/02/121040) に書いてます

http://redash.io/

re:dashをdocker-machine上で動かしてみる。

**注意** バージョンは `v0.8.2-rc`。masterブランチを見ると書き換えているようなので、新しいものはこの方法だと使えなくなりそう。

# 必要なもの

* docker-machine
* docker-compose
* node(bower)

# docker imageの準備

## redash 

```bash
git clone git@github.com:getredash/redash.git

# redash image作成
$ cd redash

# Dockerイメージにassetsを入れるために先にbower installしておく
$ cd rd_ui
$ bower install

# 追記: make depsでもok
$ make deps
# 追記2: .envを作成しておく
$ cat <<EOF > .env
REDASH_CONNECTION_ADAPTER: pg
REDASH_CONNECTION_STRING: "dbname=redash"
REDASH_LOG_LEVEL: "INFO"
REDASH_WORKERS_COUNT: 6
REDASH_REDIS_URL: "redis://redis:6379/1"
REDASH_DATABASE_URL: "postgresql://postgres/redash"
REDASH_COOKIE_SECRET: veryverysecret
REDASH_GOOGLE_APPS_DOMAIN: ""
EOF

$ cd ..
$ docker build -t redash:latest .
```

## redash nginx

```bash
$ cd redash/setup/files/docker-redash-nginx
$ docker build -t redash-nginx:1.0 .
```

# docker-compose.ymlの準備

リポジトリ直下に置いた場合。

```yaml:docker-compose.yml
redash:
  image: redash
  ports:
    - "5000:5000"
  links:
    - redis
    - postgres
redis:
  image: redis:2.8
postgres:
  image: postgres:9.3
  volumes:
   - /opt/postgres-data:/var/lib/postgresql/data
nginx:
  image: redash-nginx:1.0
  ports:
    - "80:80"
  volumes:
    - "setup/files/docker-redash-nginx/nginx.conf:/etc/nginx/nginx.conf"
  links:
    - redash
```

### 追記

最初、docker-composeにenvの設定書いたけれど、
この場合 celery が動かなくなるので`.env`を使うようにする必要がある。

```yaml
redash:
  image: redash
  ports:
    - "5000:5000"
  links:
    - redis
    - postgres
  environment:
      REDASH_CONNECTION_ADAPTER: pg
      REDASH_CONNECTION_STRING: "dbname=redash"
      REDASH_LOG_LEVEL: "INFO"
      REDASH_WORKERS_COUNT: 6
      REDASH_REDIS_URL: "redis://redis:6379/1"
      REDASH_DATABASE_URL: "postgresql://postgres/redash"
      REDASH_COOKIE_SECRET: veryverysecret
      REDASH_GOOGLE_APPS_DOMAIN: ""
```


# docker-machineの立ち上げ

```bash
$ docker-machine start redash
$ docker-machine env redash
```

# docker-compose実行

```bash
$ docker-compose up
```

## 追記

最初にDBの初期化が出来ていない場合は、DBを作って、migrationをする必要がある

```bash
$ docker exec -it redash_redash_1 /bin/sh /opt/redash/current/setup/docker_init_postgres.sh
```

# 確認

```bash
$ open http://$(docker-machine ip redash)
```

<img width="794" alt="Screen Shot 2015-11-22 at 4.54.43 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3163/3beaab04-4eb7-73a1-eab5-d52c825e61ff.png">

こんな画面が出ればOK。`admin:admin`でログインできるようになる。

# この後にやること

利用したいデータソースの追加が必要。
とりあえず試すならば、`docker exec -it redash_redash_1 /bin/bash` とかで中で作業するのが早そう。

参考 http://qiita.com/winebarrel/items/0510595715e4e09c9379
c++ builder > shutdown処理 > XE4, 10.2 Tokyo 対応 > ログオフ

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

## シャットダウン処理

http://support.embarcadero.com/article/35937
に記載されているshutdown処理だが、XE4ではいくつか変更しないといけない。

以下で動作した。

```Unit1.cpp
const wchar_t *ErrOpenProcess     = L"Error OpenProcessToken";
const wchar_t *ErrLookupPrivilege = L"Error LookupPrivilegeValue";
const wchar_t *ErrAdjustToken     = L"Error AdjustTokenPrivileges";
const wchar_t *ErrExitWindowsEx   = L"Error ExitWindowEx";

void __fastcall TForm1::AccessPrivilege( wchar_t *Prvlg, String ServerName, bool Mode ) throw(Exception)
{
	HANDLE htoken;
	TOKEN_PRIVILEGES  tknPrvlgs;

	bool success = OpenProcessToken( GetCurrentProcess(),
							 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &htoken );
	if( !success ){
		throw Exception(ErrOpenProcess);
	}

	success = LookupPrivilegeValue( ServerName.c_str(), Prvlg, &(tknPrvlgs.Privileges[0].Luid) );

	if( !success ) {
		throw Exception(ErrLookupPrivilege);
	}

	tknPrvlgs.PrivilegeCount = 1;

	if( Mode ) {
		tknPrvlgs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	} else {
		tknPrvlgs.Privileges[0].Attributes = 0;
	}

	AdjustTokenPrivileges( htoken, false, &tknPrvlgs, sizeof(TOKEN_PRIVILEGES), 0, 0 );

	//AdjustTokenPrivileges は常に true を返すのが仕様らしい？
	//SDK の Help のサンプルにも GetLastError で記述されている
	if( GetLastError() != ERROR_SUCCESS )
	{
		throw Exception( ErrAdjustToken );
	}

}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	try{
		AccessPrivilege( SE_SHUTDOWN_NAME, "", true );
	}catch( Exception &Ex ){
		OutputDebugString( Ex.Message.c_str() );
		return;
	}

	if(!ExitWindowsEx( EWX_SHUTDOWN | EWX_FORCE, 0 )) {
		OutputDebugString( ErrExitWindowsEx );
	}

	try{
		AccessPrivilege( SE_SHUTDOWN_NAME, "", false );
	}catch( Exception &Ex ){
		OutputDebugString( Ex.Message.c_str() );
		return;
	}
}
```


この処理がXE4やXE10などでも最適な方法かはわからない。

別のサイトでdelphi XEシリーズでの実装例があるが、それをC++ builderに変更しようとして失敗したので、上記ページを参考にした。

## ログオフ処理

`	if(!ExitWindowsEx( EWX_SHUTDOWN | EWX_FORCE, 0 )) {`
の部分を
`	if(!ExitWindowsEx( EWX_LOGOFF| EWX_FORCE, 0 )) {`
とすればログオフできる。

参考 [MSDN](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa376868(v=vs.85).aspx)
C# > 参照型（クラス）のリストと配列の初期化と列挙 その2

#その2の経緯
前回の記事において、[ToniTakekawa](http://qiita.com/ToniTakekawa)さんからいろいろ教えて頂き
ました。ありがとうございました。
教えて頂いた事を元に自分なりに改良してみました。
改良の目的は表示用の文字列を一気に列挙する事です。
#気が付いたこと
String.Join()メソッドがstaticメソッドであり、後置記法できないことです。例えば、(文字列型配列).Join("\n")みたいな。拡張メソッドが本来はLINQを実現させる為のものだとどこかで読んだことがあるので従来の基本クラスには追加されなかったのでしょう。
しかし、従来の基本クラスを使う時、ちょいちょい後置記法したい場面がでてくるんですよね～。
片っ端から後置記法できるように自分で拡張メソッドを作ればいいだけの話なんですけどね。やっぱり、String.Join("\n", T[])より、T[].Join("\n")と書きたい(笑)。
#ソースプログラム
```Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            // プリミティブなListの初期化
            var intList = new List<int>() { 1, 2, 3 };
            // ちなみにvarを使わない場合はこちら
            // List<int> intList = new List<int> { 1, 2, 3 };
            // 以下のように宣言する事はできない(配列とは違う)
            // List<int> intList = { 1, 2, 3 };

            // プリミティブな配列の初期化
            var intList2 = new int[] { 4, 5, 6 };
            // ちなみにvarを使わない場合はこちら
            // int[] intList2 = { 4, 5, 6 };

            // 参照型のListの初期化
            var employees = new List<Employee>()
            {
                new Employee {Id = 1, Name = "ジョン" },
                new Employee {Id = 2, Name = "ジャック" }
            };

            // 参照型の配列の初期化
            var employees2 = new Employee[]
            {
                new Employee {Id = 3, Name = "ジョアンナ" },
                new Employee {Id = 4, Name = "ジュリア" }
            };

            // 表示用文字列の列挙を定義
            var intListStrings = intList.Select(i => $"item={i}");
            var intList2Strings = intList2.Select(i => $"item={i}");
            var employeesStrings = employees.Select(o => $"Id={o.Id}, Name={o.Name}");
            var employees2Strings = employees2.Select(o => $"Id={o.Id}, Name={o.Name}");

            // 更にこれらの定義をひとつの定義にまとめる
            var resultStrings = new[]
            {
                intListStrings,
                intList2Strings,
                employeesStrings,
                employees2Strings
            }.SelectMany(e => e);

            // で、最後に一気に表示する
            resultStrings.ForEach(Console.WriteLine);
            // ちなみにForEach拡張メソッドを使用しない場合はこちら
            // Console.WriteLine(string.Join("\n", resultStrings));

            // 結果を確認する為のお約束
            Console.WriteLine("\n\nPush any key!");
            Console.ReadKey();
        }
    }
}
```
```IEnumerableExtension.cs:
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication9
{
    public static class IEnumerableExtension
    {
        public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
        {
            foreach (var x in source)
            {
                action(x);
            }
        }
    }
}
```
```Employee.cs:
namespace ConsoleApplication9
{
    public class Employee
    {
        public int Id { set; get; }
        public string Name { set; get; }
    }
}
```
c++builder > E2342(41): E2034 'char *'型は'const wchart_t*'型に変換できない > 41行目でなく40行目の問題だった

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

```Unit1.cpp
void __fastcall TForm1::AccessPrivilege( char *Prvlg, String ServerName, bool Mode ) throw(Exception)
{
	HANDLE htoken;
	TOKEN_PRIVILEGES  tknPrvlgs;

	bool success = OpenProcessToken( GetCurrentProcess(),
							 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &htoken );
	if( !success ){
		throw Exception(ErrOpenProcess);
	}

	success = LookupPrivilegeValue( ServerName.c_str(),
	Prvlg,
	&(tknPrvlgs.Privileges[0].Luid) );
...
```

上記をコンパイルしようとして以下のエラーが出ていた。

```
E2342(41): E2034 'char *'型は'const wchart_t*'型に変換できない 
```

41行目というのは`	&(tknPrvlgs.Privileges[0].Luid) );`の行。

しかしながら、問題は41行目でなく40行目の`Prvlg,`の方だった。
Prvlgがchar *型だったのでダメだった。

エラーメッセージがmisleadingだ。
KVM NATのDHCPで割り当てられたIPアドレスを確認する (Ubuntu)

「Ubuntuで運用しているKVM環境にゲストOSを作成したが、まだゲストにコンソールを設定しておらず、virsh consoleを使えない状況である。ゲストOSのネットワーク設定はNAT接続としてインターフェイスにはDHCPの設定をしているので、IPアドレスが割り当てられているはずだがIPアドレスが分からない。IPアドレスが分かればSSHできるのだが・・・」

というケースが実際にあったので、KVM側(ハイパーバイザ側)にログインした状態で、ゲストOSへ割り当てられたIPアドレスを確認できないか調べてみた。

## IPアドレス確認方法

結論から先に書くと、下記のパスにあるファイルを確認すればよい。
IPアドレスが確認出来れば、あとはSSHでログインするだけである。

```
$ cat /var/lib/libvirt/dnsmasq/default.leases
1448180977 XX:XX:XX:XX:XX:XX 192.168.122.57 * *
```

複数のゲストOSが起動していて、どれが目的のゲストか分からない場合はvirsh dumpxmlでMACアドレスを確認するとよいだろう。

```
$ sudo virsh dumpxml guestname
...
    <interface type='network'>
      <mac address='XX:XX:XX:XX:XX:XX'/>
      <source network='default'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
...
```

## 詳細

KVMのNAT環境ではDHCPサーバとしてdnsmasqが使用されていて、defaultというネットワークにおいてDHCPのリクエストをすると192.168.122.0/24のIPアドレスが割り当てられる。

プロセスの引数からも推察されるようにdnsmasqが割り当てた情報は/var/lib/libvirt/dnsmasq/default.leasesに記載されている。

```
$ sudo virsh net-list
Name                 State      Autostart
-----------------------------------------
default              active     yes

$ ps ax |grep dnsmasq
1358 ?        S      0:00 /usr/sbin/dnsmasq -u libvirt-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override

$ cat /var/lib/libvirt/dnsmasq/default.leases
1448180977 XX:XX:XX:XX:XX:XX 192.168.122.57 * *
```
ポップインサイト　ユーザテスト第11回　参加レポート

# 勉強会ページURL

https://f3ca6906ee815eb0a7dba46193.doorkeeper.jp/events/31253

# 日時

2015/09/15(水)19:00-20:00

# 参加形式

今回は3人ずつのチームを作り、被験者1人、見学者2人という構成で行った。
モデレーターは主催者。
被験者はweb系の仕事をしている人。

ただ、今まではユーザテストを行ったビデオを皆で見て議論をする形式だったよう。

# ユーザテスト内容

## テスト対象

webの管理保守を楽にするwebサービス

## 注意点

* 被験者
・自然に使う。テストだということを意識しすぎない
・思ったことをなるべくつぶやく

* 見学者
・話しかけない

## シナリオ

あなたはwebの管理保守を普段から行っている人です。
web管理保守が大変だなぁ、便利に管理保守ができるツールないかなぁ、と思っているという状況を想像してください。

## タスク

1. 検索バー(ask, google等)に「web　管理　保守」などというキーワードを入力して、管理保守を楽にできそうな情報が載っているページを探して下さい。
2. LIGのweb管理保守に書かれているwebページ(指定されたページ)を読んで下さい。
3. 2の記事で紹介されていたツール(指定したツール)の公式ページを閲覧して下さい。
4. 実際にそのツールを使ってみて下さい。

## 質問形式

* タスクが終わるごとに気になったことを質問
* タスクが全て終了した時に気になったことを質問

## その他

　　　　机、PC
見学者　被験者　見学者
という配置で行った

# ユーザテスト中に気づいたこと

* ボタン、コンテンツの表示に気づいていないことがある。
チュートリアルの進捗バーに気づいていなかった。
* 自分が今どのような状態なのかがわからないと不安、不満状態になる。
チュートリアルの進捗状態がわからない(気づいていない)と「いつまで続くんだろう？」「面倒だからやめようかな」という気分になる。
* 「慣れ」によって行動に緩急が出る
被験者はLIGのブログをよく読んでいるので「文のはじめの一段落くらいはどうせまた雑談なんだろうから読み飛ばそう」と言って読んでいなかった。

# 一言メモ

サービスを使い始めるところからテストを開始するのではなく、サービスにたどり着くまでもテストしているのが素晴らしいと思った。
UIとして見えているところだけでなくサービスの認知から利用までの総合的なUXをテストし改善することによって、よりユーザにとって気持ちのいい体験を提供することにつなげられる。
AndroidのMatcherはtoString()してから処理する

Android以外のJava実装と、AndroidでのJavaの実装では、
正規表現クラス(`java.util.regex.*`あたり)の実装が異なっています。
Qiita上にも記事があるようです。
そこに書いていない、自分の引っかかったポイントを1つ紹介します。

# 課題
タイトル通り、
**Androidの`Matcher`では与えられた`CharSequence`を`toString()`したものを処理する** という点です。
Javaでは、`toString()`は行わず、そのまま処理されます。
## これによって起こる問題
Matcherに文字を渡す際(`Pattern#matcher(str)`,`Matcher#reset(str)`)、`String`を渡すならどうってことありません。
しかし、`StringBuilder`や`StringBuffer`を、同じ動作と思って渡すと痛い目に遭います。
## それぞれでの書き方の例
正規表現APIを大して使う必要がないサンプルですが、どうかお気になさらず。
`StringBuilder`の中に入った文字列のcをdに置き換える場合。

```java:共通部分
StringBuilder sb=new StringBuilder("abccabc abc abc abc abc");
Matcher m=Pattern.compile("c").matcher(sb);
```

```java:Android以外の場合
int start = 0;
while(m.find(start)){
    sb.replace(m.start(), m.end(), "d");
    start = m.start();
}
```

```java:Androidの場合
int minoff = 0;
while(m.find()){
    sb.replace(m.start() - minoff, m.end() - minoff, "d");
    minoff += m.end() - m.start(); // <- ( このサンプルでは常に += 1 )
}
```
## 独り言
~~Androidでの実装、`toString()`されると遅くなっちゃうんだよな。~~
JNIで処理してくれるので多分そんなこともない。
TensorFlow 

tensorFlowの説明文を和訳してみました。（追記中）

https://www.tensorflow.org/

#TensorFlow とは
データフローグラフを利用した数値計算のオープンソースライブラリ

グラフ内の各ノードは数学的な演算を表していて、そのグラフのエッヂはそのノード間を流れる多次元データの配列です
このフレキシブルなアーキテクチャは複数のCPU、GPUをもつコンピュータやデバイスへコードの書き換えを行わずにデプロイすることを可能にします

テンソルフローは元々google内のgoogle brain femのエンジニアによって、マシンラーニングやニューラルネットワークの研究を行うために開発されました。

このシステムは他のドメインにも幅広くできるように抽象化されています。

##データグラフとは
データフローグラフは指向性のノードとエッヂにより数値計算を表現します。
ノードは一般的に数学的な演算を実装します。それだけでなく、計算結果を出力するエンドポイントや、read/writeの永続的な変数としてもあらわせます。
エッヂはノード間の　インプット・アウトプットの関連性を表します。
このデータエッヂは、多次元配列やテンソルをデータとして受け渡します。

？(要修正)グラフ間を通過するテンソルのフローはテンソルフローがその名前を獲得する場所です。

ノードはコンピュート可能なデバイスに割り当てられ、入力エッジに到着したデータが利用可能になったら、非同期実行をおこないます。

##テンソルとは
　加筆中

##TensolFlowの特徴
###・deep flexibility
TensorFlowは硬直性のあるニュートラルネットワークではありません。
もしあなたが計算処理をデータフローグラフで表す時、テンソルフローを使う事が出来ます。
このTensorFlowで我々はニューラルネットワークでよく使われるサブグラフを組み合わせるためのツールを提供します。
さらにユーザはテンソルフローライブラリを使用して更なるライブラリを作る事が出来ます
新しい計算処理の定義を書くのはpythonで関数を書くのと同様に簡単で、パフォーマンスへの影響がありません。
もしあなたがローレベルで必要とする機能が無ければ、C++で記述する事が出来ます。

###・移植性
どのようなcomputerでも使う事ができ、スケールアップが容易でコードの変更を行う必要がない。
trainされたモデルを簡単にデプロイできる

###・研究と製品をつなげる
研究で行っている学習データを製品へ移植できます。
tracの導入

# tracとは #

[trac](http://trac.edgewall.org/)とは、ソフトウェア・プロジェクトを管理するwebアプリケーションです。

類似の代表的なOSSとしては、[redmine](http://www.redmine.org/)があります。

# 前提条件 #

* webサーバ: apache
* webアプリケーションインタフェース：WSGI
* db:sqlite3

# tracのインストール #

[trac](http://trac.edgewall.org/)のインストールについては、[Trac on Ubuntu](http://trac.edgewall.org/wiki/TracOnUbuntu)に記載されています。

今回は先の紹介ページに記載がないUbuntu 14.04 LTSへの[trac](http://trac.edgewall.org/)の導入について記事にまとめています。

## packageのインストール ##

1. apacheのインストール

    tracには認証が必要となります。そこで、htpasswdを梱包している
    apache2-utilも同時にインストールしておきます。

        $ sudo apt-get intall apache2 apache2-utils

2. WSGIのインストール

		$ sudo apt-get install libapache2-mod-wsg

3. sqlite3のインストール

        $ sudo apt-get install sqlite3

3. tracのインストール

        $ sudo apt-get install trac

# tracの設定 #

以下の手順は、tracのパッケージと同時に配布されるREADME.Debian.gzを参考にしています。

## trac環境の作成 ##
プロジェクト用のtrac環境を作成します。trac環境には、バックエンンドのDB、ログ、設定ファイルなどが格納されます。
	
    $ sudo mkdir /var/local/trac
    $ sudo trac-admin /var/local/trac initenv

trac-adminのinitenvサブコマンドを実行すると、インターラクティブでプロジェクト名とデータベースの質問されます。この記事では、以下の値を採用しました。

* プロジェクト名: SandBox
* データベース接続文字列：sqlite:db/trac.db(デフォルト値のまま)

以下に実行時のログを示します。
![initenv-1.png](https://qiita-image-store.s3.amazonaws.com/0/59920/86799d4d-b2a4-01d9-8065-d68454d7c520.png)



apache用ユーザであるwww-dataからtrac環境にアクセスできるようにパミッションを設定します。

    $ sudo chown -R www-data: /var/local/trac/sandbox

## apacheの設定 ##

trac環境をapacheから参照できるよう展開します。

    $ sudo trac-admin /var/local/trac/sandbox deploy /var/www/sandbox

以下に実行時のログを示します。
![deploy-1.png](https://qiita-image-store.s3.amazonaws.com/0/59920/96cbe1e9-68fc-623d-a8c9-7b3fceacb70e.png)

	
そして、展開したコンテンツの所有者をapache用ユーザであるwww-dataに設定します。

    $ sudo chown -R www-data: /var/www/trac/sandbox

次にtracにログインするためユーザを作成します。以下のコマンド例では、 **-cオプション** を指定することで、パスワードファイル： **/var/local/trac/.htpasswd** の作成も指示しています。既にパスワードファイルが存在している場合は、そのパスワードファイルをトランケートすることになりますので、 **-cオプション** の指定に注意してください。

    $ sudo htpasswd -c /var/local/trac/.htpasswd admin

そして、ファイル： **/etc/apache2/conf-enabled/trac.conf** に以下の内容を記述して、WSGIでtracと連携するよう設定します。

    WSGIScriptAlias /trac/sandbox /var/www/trac/sandbox/cgi-bin/trac.wsgi
    
    <Location "/trac/sandbox/login">
    	  AuthType Basic
    	  AuthName "trac"
    	  AuthUserFile /var/local/trac/.htpasswd
    	  Require valid-user
    </Location>

以上で、tracの設定は終了です。

# 動作確認 #

最後に動作確認を行ないます。

まず、apache2の再起動を行います。

    $ sudo service apache2 restart

そして、webbrowserから、tracのURLである http://localhost/trac/sandbox にアクセスします。

![welcome-1.png](https://qiita-image-store.s3.amazonaws.com/0/59920/a52fb6eb-11a5-85b2-2221-85e1b196a68c.png)


次回は、tracからgitのソースが参照できるプラグインの設定などについて説明する予定です。
undefined method `authenticate!' for nil:NilClass?でテストが失敗する場合の対処方法


Deviseを利用したアプリでRspecを実行した際に、
```
     NoMethodError:
       undefined method `authenticate!' for nil:NilClass
```
というエラーが発生した。

rails_helper.rbに以下を追記することで、対処できた。

```
  config.include Devise::TestHelpers, :type => :controller
```

##参考

http://stackoverflow.com/questions/13168586/test-not-passing-undefined-method-authenticate-for-nilnilclass
c++ builder > Win32Platform > Win7以降でチェックの必要はあるのだろうか?

```txt:関連IDE
C++ Builder XE4
```

delphiのコードで以下の条件文を見た

```
if Win32Platform = VER_PLATFORM_WIN32_NT then  
```

XE4のヘルプを見ると `System.SysUtils.Win32Platform`としてヘルプがある。

- VER_PLATFORM_WIN32s --> システムは Win32s である 
- VER_PLATFORM_WIN32_WINDOWS --> システムは Windows 95 である。 
- VER_PLATFORM_WIN32_NT --> システムは Windows NT である
 
しかしながら、[SO](http://stackoverflow.com/questions/8348957/did-delphi-xe2-remove-the-iswinnt-function/8349058#8349058)には以下の記載がある (RRUZさんの回答)。

> if Win32Platform = VER_PLATFORM_WIN32_NT then 
FYI Delphi XE2 only runs on WinNT based systems

XE4でWindows7以降のアプリの場合、Win32Platform のチェックは無意味なのかもしれない。
複数環境に散らばったJenkinsを集約する事で運用効率をあげる方法

# 概要
* 環境毎に作成された7体のJenkinsを1体に集約した
* 母体となるJenkinsが置かれたサーバに7体分のnodeを作成した

# 初めに
僕の所属するプロジェクトでは検証環境が複数あります。
それらの検証環境のメンテナンス・デプロイ等は各環境に置かれたJenkinsでやっており、
検証環境は全部で7つあるので、Jenkinsも7体います。

タグ切り後のリリース時には、すべての環境にリリースするために、
それぞれの環境毎にあるJenkinsのウェブページをすべて開いてリリースしなければならなく面倒でした。
また、あるバッチ機能を開発した際にはすべての環境で同じジョブを作成する必要があり、これまた面倒でした。

そこで、環境毎に別れてしまったJenkinsを1体に集約することで上記問題を解決する事にしました。

# 方法
## 複数のJenkinsを1体にまとめる方法
JenkinsにはSlave機能というものがあり、1つのjenkinsをmasterとして複数のSlaveに対して操作する事が可能です。
（※Slaveの作成方法はググればすぐに出てくるので、この記事内では触れません）
今回このSlave機能を使って7つのJenkinsを一体にまとめました。
複数のJenkinsをまとめる際に問題となった事はほとんど無かったのですが、
強いて言えば環境変数とssh認証の設定でした。（これらも大した問題ではなかったです）
### 環境変数
Jenkins毎に環境変数を指定する事ができるのでそれぞれの環境の変数をどうするか？と思ったのですが、
Slave毎に環境変数を設定できたので、一瞬で解決しました。
### ssh認証
それぞれのJenkinsに散り散りになっていた公開鍵認証の鍵を一つのサーバでまとめる必要があり、.ssh/configでまとめる必要がありました。

## 運用方法
複数のJenkinsを一体にまとめた場合、一つのjobを作成すればそれを複数の環境に対して並列に実行する事ができます。
NodeLabel Parameter Pluginを入れて、プロジェクトの設定からこのpluginを選択し「Allow multi node selection for concurrent builds 」と「ビルドを並列実行」にチェックを入れます。

![スクリーンショット 2015-11-22 午後3.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/50185/1b137e75-33b6-5f9d-456b-708a7150aadd.png)
↑「Allow multi node selection for concurrent builds」にチェック

![スクリーンショット 2015-11-22 午後3.31.46.png](https://qiita-image-store.s3.amazonaws.com/0/50185/7b1bd9e7-8d48-cf72-c4a8-c5ec60d33065.png)
↑「ビルドを並列実行」にチェック

これで、タグ切り後のリリースは１つのジョブを実行するだけで行えるため、複数の環境へのリリースが楽々行えるようになりました。
また、複数の環境にそれぞれ作成していたジョブも一回作成するだけで良くなり、かなり楽になりました。

# 最後に
たったこれだけで、すべての問題が解決しました。
今までなぜやらなかったのか...と思うくらい簡単にできたので、もし同様の問題に悩んでいる人がいたら是非試してみてください。
PyCharmでeditorの色を変更する方法

自分はMonokai Sublime text 3 のschemeを使用しているが, defaultの設定だと非常に見づらかった. 
下図まで移動した後に, 右下のサンプルコードで変更したい箇所をクリックすると, それの設定まで飛べる.

左のカラムを適当に選択することで, 言語ごとの個別設定もできる


<img width="1032" alt="スクリーンショット 2015-11-22 15.13.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/100729/e5038452-eb05-c5aa-6663-380258c2b0e7.png">