OmniAICreator/Qiita-1.07M huggingface dataset:
El Capitan libv8がインストール出来ない

OSX 10.11 El Capitanにアップグレードした際に、Ruby on Railsの環境構築で失敗したので個人的なメモ。

## bundle installで失敗したgem
- libv8
- therubyracer

## libv8のエラー
こんな感じのエラーが出た

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /usr/local/var/rbenv/versions/2.1.7/bin/ruby extconf.rb
creating Makefile
Compiling v8 for x64
Using python 2.7.10
Using compiler: /usr/bin/c++ (clang version 7.0.0)
In file included from ../src/conversions.cc:32:
In file included from ../src/conversions-inl.h:43:
../src/scanner.h:444:5: error: unused typedef '__StaticAssertTypedef__444' [-Werror,-Wunused-local-typedef]
    STATIC_ASSERT(kCharacterLookaheadBufferSize == 1);
    ^
../src/checks.h:283:30: note: expanded from macro 'STATIC_ASSERT'
#define STATIC_ASSERT(test)  STATIC_CHECK(test)
                             ^
../src/checks.h:251:5: note: expanded from macro 'STATIC_CHECK'
    SEMI_STATIC_JOIN(__StaticAssertTypedef__, __LINE__)
    ^
../src/checks.h:240:32: note: expanded from macro 'SEMI_STATIC_JOIN'
#define SEMI_STATIC_JOIN(a, b) SEMI_STATIC_JOIN_HELPER(a, b)
                               ^
../src/checks.h:241:39: note: expanded from macro 'SEMI_STATIC_JOIN_HELPER'
#define SEMI_STATIC_JOIN_HELPER(a, b) a##b
                                      ^
<scratch space>:63:1: note: expanded from here
__StaticAssertTypedef__444

...
```

## apple-gcc42のインストール
`apple-gcc42`をインストールすることで回避できた。

```
$ brew tap homebrew/dupes
$ brew install apple-gcc42

$ export CC=/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2
$ export CXX=/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/g++-4.2
$ export CPP=/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/cpp-4.2

$ gem install therubyracer
```

## インストールされたgemのバージョン

```
$ gem list --local

libv8 (3.16.14.11 x86_64-darwin-15)
therubyracer (0.12.2)
```

あとはいつも通り、`bundle install`すればOK

## 参考
https://www.snip2code.com/Snippet/674372/Fix-libv8-in-El-Capitan
add○○という関数に対してremove○○を用意しない実装

このコンセプトは、「追加したヤツが責任を持って削除するべき」「追加したヤツのよかり知らぬところで削除させない」という発想に基づいている。

remove 関数を用意する代わりに、add 関数が remove 関数を返す。

以下は CoffeeScript の例。

```coffeescript
"use strict"

module.exports = ->
  listeners = {}
  notifying = {}
  return {
    addListener: (eName, listener) ->
      listeners[eName] ?= []
      return (->) if listener in listeners[eName]
      listeners[eName].push listener
      return -> # remove 関数
        i = listeners[eName].indexOf listener
        if i >= 0
          listeners[eName].splice i, 1
    notify: (eName) ->
      return if notifying[eName] # 無限ループ防止用
      notifying[eName] = true
      listener.apply undefined, arguments for listener in (listeners[eName] or [])
      notifying[eName] = false
  }
```
さくらのVPSにBitnami Redmine を導入した時の手順メモ



###1.ログイン
> \(user/pass入力)

###2.サーバから「あれ」を持ってくる
> \# wget https://bitnami.com/redirect/to/71821/bitnami-redmine-3.1.1-0-linux-x64-installer.run

###3.アクセス権を「あれ」する
> \# chmod 755 bitnami-redmine-3.1.1-0-linux-x64-installer.run

###4.「あれ」する
> \# ./bitnami-redmine-3.1.1-0-linux-x64-installer.run

###Extra
VPS自体の初期設定としてNTPと同期していないものもあるのでNTPDを有効にすると便利。（結構ずれる）


参考：http://manablog.org/bitnami-redmine-sakuravps/

過去投稿：http://qiita.com/wei_yuan/items/11bac0b0f1665d79c88e
Swiftで抽選マシン（ガチャ）を作ってみる　その1

車輪の再発明っぽいですが、Swiftで抽選マシンを作ってみることにしました。
（素人です）

## 要件
### 必須
抽選をすると以下の確率で結果が帰ってくるようにする

| ラベル | 確率（％） |
|:-:|:-:|
| 特賞  |  0.01 |
|  1等 |  0.49 |
|  2等 | 4.5  |
|  3等 |  45 |
|  はずれ |  50 |


## やったこと
### Prize Classをつくる
```swift
class Prize:NSObject {
    var name: String
    var probability: Double
    var prizesNo = 0
    let lotNo = 10000.0

    
    init(name: String, probability: Double){
        self.name = name
        self.probability = probability
    }
    
    func number() -> Int{
        var result: Int
        result = Int(Double(lotNo) * Double(probability/100))
        return result
    }
}
```
prize.numberでlotNoの個数のときの景品数を返します。

### Prizeを作る
```swift
let prizeList = [
    Prize(name: "特賞", probability:0.01 ),
    Prize(name: "1等", probability:0.49 ),
    Prize(name: "2等", probability:4.5 ),
    Prize(name: "3等", probability:45.0 ),
    Prize(name: "残念", probability: 50.0)
]
```


### 乱数と抽選
 arc4random_uniform(最大値)
0から最大値までの乱数を返してくれる。
なんかここは綺麗にできてない。
商品の数10000っていうのを乱数の最大数で入力しているけれど、
prizeの中でも同じものを定義しててだめなかんじ。
ほんとはまとめたい。

```swift
let prizesNo = arc4random_uniform(10000)
///1万を最大値にとる乱数

let prizes = prizeList.count-1
var k = 0

print(prizes)

for prize in prizeList{
    k = k + prize.number()
    if Int(prizesNo) < k {
        print(prize.name)　//ここで抽選結果を表示する
        break
    }
    print(k)
}

```


## はまったところ
IntだとおもってあつかっていたものがIntとUint32とあって、
大小比較ができなかったので、型変換した。

`binary operator 'hoge' cannot be applied to operands of type Int and Uint32`

エラーはこんなんだった。
Rust1.3でCSV読み込み

注目の新言語Rustは半年くらい前まで仕様変更が激しすぎて学び甲斐がなかったが、最近は少しずつ仕様が安定してきているような印象。

Rust1.3でCSVを読み込む例。CSVライブラリは[https://github.com/BurntSushi/rust-csv]()を使う。

```rust:read_csv.rs
extern crate csv;
extern crate rustc_serialize;

#[derive(RustcDecodable,Debug)]
struct MyRecord {
	id: i32,
	x: f32,
	y: f32,
}

fn main() {
	let mut rdr = csv::Reader::from_file("/path/to/file.csv").unwrap().has_headers(true);
	let mut rows: Vec<MyRecord> = Vec::new();
	for record in rdr.decode() {
		if let Ok(r) = record {
  			rows.push(r);
		}
	}
	println!("{:?}", rows);
}
```

* `csv::Reader::from_file`は`Result`型を返す。`Result`型は`Ok`と`Error`のenum。
* `unwrap`は`Result`から`Ok`を取り出す。
  * `Error`に対して`unwrap`するとエラー（パニック＝スレッド停止）を起こす。
* `if let`はパターンマッチに成功した時にブロック内の式を実行する。
* この例では、CSVの各行は`MyRecord`型に自動で変換される。
  * `decode()`は、`rustc_serialize::Decodable`トレイトを実装した型を`Result`で包んで返す。
  * この例では、型推論により`MyRecord`が`Result`に包まれた値を返す。
  * `MyRecord`は`#[derive(RustcDecodable)]`の指令により`Decodable`を自動で実装
Debian8　コンソールで日本語利用（fbterm）

#参考にしたサイト
http://www.geocities.jp/xsybr354/debian/wheezy/console.html
http://d.hatena.ne.jp/baku4893/20130304/p1

#起動時にエラー
[input] can't change kernel keymap table, all shortcuts will NOT work! see SECURITY NOTES section of man page for solution.
##対処方法
chmod u+s /usr/bin/fbterm

セキュリティ的には、上記方法は良くないのかもしれませんが、
ノートパソコンで、個人利用のためOKかと。。。

# 追加ユーザでfbtermを起動するとエラー
can't open framebuffer device!
↑Debianをインストール時に作成するユーザでは起こらない。
追加したユーザにのみ起こる。
##対処方法
usermod -G video [追加したユーザ]

#fbtermの設定
一度 fbtermを起動させると。.fbtermrcが作成される。

変更箇所は以下。
font-size=12
↓
font-size=18

color-foreground=7
↓
color-foreground=2

#fbterm上で、日本語入力

$ fbterm
$ uim-fep

or 

$ fbterm -- uim-fep
↑個人的には、こちら。。


# 日本語入力の設定
インストール時に、LXDEのライブCDを利用しました。
X-Windowsとコンソールを同居させるため、以下のファイルを編集。

$ vi .uim.d/customs/custom-global-keys1.scm

````
(define generic-on-key '("zenkaku-hankaku" "<IgnoreShift><Control>\\"))
(define generic-on-key? (make-key-predicate '("zenkaku-hankaku" "<IgnoreShift><Control>\\")))
(define generic-off-key '("zenkaku-hankaku" "<IgnoreShift><Control>\\"))
(define generic-off-key? (make-key-predicate '("zenkaku-hankaku" "<IgnoreShift><Control>\\")))
````
追加した部分
````
""<IgnoreShift><Control>\\""
````

上記追加が終わったら、fbtermを起動させて
[Ctrl] + \
キーで日本語入力のOn/Off出来るか確認する。
RailsでjQueryライブラリのbody内読み込みをさせてみる


最近Railsを始めたのですが、アプリ内でJavascriptを読み込むときに一般的なhead内でのアセットパイプライン出力ではなく、`</body>`タグ直前付近で読み込ませたいなと思い、調べてやってみました。

※Rails、マークダウンとも慣れていないのでなにかありましたらご指摘ください。

## lightbox2を例に

### 配置
vendor/assets
　┠/lightbox（DL・解凍した時点ではsrcというフォルダ）
　┃　　┠/js─lightbox.js
　┃　　┠/css─lightbox.css
　┃　　┗/images─（矢印等一式　※今回触れてません）
　┗/javascripts・/stylesheets等

### 手順
1. lightboxファイル一式を入れたフォルダは`vendor/assets`以下に配置
2. cssはheadの方のアセットパイプラインへお任せ<br>`*= require css/lightbox`（application.css）
3. javascriptは下記のような書き方でした。配列なので複数指定することもオケなようです

```ruby:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( js/lightbox.js )
```

後はapplication.html.erbの`</body>`直前や、index・show等のビュー下部で

```ruby:layouts/application.html.erb
<%= javascript_include_tag "js/lightbox.js" %>
</body>
```
とすることで読み込まれました。

直接publicに置いたりCDNで読み込ませる方法もあると思いますが、ライブラリのファイル一式を固めて置いとけるのが気持ちスッキリということでのやり方でした。

## 参考
+ [Railsでvendor/assets/javascripts以下にあるファイルを特定のページでのみ使用する-Qiita](http://qiita.com/teitei_tk/items/bf444c6aa6398bde83bf)
+ [Lightbox](http://lokeshdhakar.com/projects/lightbox2/)
I/O電圧が3.3VのUSB/TTLシリアル変換アダプタ

# イントロダクション

USB/TTLシリアル変換では、[FTDIのTTL-232R-5VおよびTTL-232R-3V3](http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm)で用いられている6つのピンの並びを参考にしたものが各社から販売されています。

オリジナルはI/O電圧が5Vと3.3Vの2種類あるものの、VCCは5Vで共通でした。しかしながら、途中からI/O電圧を選択可能な製品が幾つか出てきたため、一口に「3.3V対応版」といってもVCCが5Vのものと3.3Vのものの2種類があります。

ここで、VCCが3.3VのものはFT232RLの機能として提供する3.3Vを利用しているため、50mAしか供給できません。これはちょっとした実験には便利な場合もありますが、Wi-FiモジュールのESP8266のようにそれなりの電流が必要となる場合には使えません。

全製品のリストを作ることはとてもできないのですが、備忘録として日本で入手しやすいものについて簡単にまとめてみました。

# VCCが5V
* [TTL-232R-3V3](http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm)（FTDI）

# VCCが3.3V
* [FTDI Basic Breakout](https://www.sparkfun.com/products/9873)（SparkFun）
* [FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)](https://www.switch-science.com/catalog/1032/)（スイッチサイエンス）
* [USB⇔シリアル変換モジュール MM-FT232](http://www.sunhayato.co.jp/material2/index.php/item?id=758)（サンハヤト）
* [極小USBシリアル変換モジュール [FT232-6P-ISP]](http://www.aitendo.com/product/10149)（aitendo）
タイル型ウィンドウマネージャのi3を試す + 備忘録

awesomeでフォーカスのあるウィンドウを縦または横に分割するってのができなかったのでi3というタイル型ウィンドウマネージャを試してみる。

[i3 - improved tiling wm](http://i3wm.org/)

試した環境は次の通り。

・Ubuntu 14.04(32bit)
・i3 version 4.7.2

この記事は自分が忘れないように、自分が使う範囲で操作方法を簡単に残しておくのが目的。
何か調べたらその都度更新する予定。

# インストール

    $ sudo apt-get install i3

一度ログアウトしてパスワードを入力するエリアの右上からi3を選んでログインする。
初回起動のときは初期設定ウィンドウが表示されるので、設定ファイルを作るかどうか、Modキーをどのキーにするかを選択する。

# 操作
i3のデフォルトのキーバインドが公式ドキュメントに図で載ってるのでそれを参考にする。

[i3: i3 User’s Guide]
(http://i3wm.org/docs/userguide.html#_default_keybindings)

自分が使う操作を表に載せる。表記は次のルールで書く。

・ModはAltまたはWindowsキー
・大文字はShiftキーを押す
・矢印記号(→, ←, ↑, ↓)はカーソルキー
・"num"は数字キー

## 基本操作
|アクション|操作|説明|
|:--|:--|:--|
|ターミナルを開く|Mod + Enter|現在設定されている分割方向にウィンドウが分割され、新しいターミナルが開く。|
|ターミナルを閉じる|Mod + Q|現在フォーカスがあるウィンドウを閉じる。|
|ログアウトする|Mod + E||
|分割方向を横にする|Mod + h|新しいウィンドウを開くときに横方向に分割される設定にする。|
|分割方向を縦にする|Mod + v|新しいウィンドウを開くときに縦方向に分割される設定にする。|
|タブレイアウトにする|Mod + w|1つの画面を全画面で表示するレイアウト。上部に開いているウィンドウを表すタブが表示される。|
|デフォルトレイアウトにする|Mod + e|デフォルトのタイル型レイアウトにする。|
|フォーカスを右にウィンドウに移動する|Mod + → or Mod + ;||
|フォーカスを左にウィンドウに移動する|Mod + ← or Mod + j||
|フォーカスを上にウィンドウに移動する|Mod + ↑ or Mod + l||
|フォーカスを下にウィンドウに移動する|Mod + ↓ or Mod + k||
|フルスクリーンモードにする/ 戻す|Mod + f|入力する度にフルスクリーンモードにしたり、フルスクリーンモードから元のモードに戻したりする。|
|ワークスペースを切り替える|Mod + num|ワークスペースを切り替える。ワークスペースは左下に番号で表示される。|
|ウィンドウサイズ変更モードにする|Mod + r|（次項の「ウィンドウサイズの変更」を参照）|
|dmenuを表示する。|Mod + d|アプリケーション名をタイプして起動するメニューを開く。開けるアプリケーションは\$PATHにあるものになる。|

分割方向はデフォルトで横方向に分割される。また、一度ログアウトするとデフォルトの横方向に戻る。

## ウィンドウサイズの変更
i3では次のようにウィンドウサイズ変更モードにしてからサイズを変更する。

1. "Mod + r"でサイズ変更モードにする。（左下に"resize"と表示される。）
2. 次の表の通りに操作してフォーカスのあるウィンドウのサイズを変更する。
3. "Enter"または"Escape"でリサイズモードを終了する。

|アクション|操作|
|:--|:--|
|横方向に縮める|j|
|横方向に広げる|;|
|縦方向に縮める|l|
|縦方向に広げる|k|

ウィンドウの位置に関わらず上記のキーで操作するので、例えば右端にあるウィンドウのサイズを広げる時でも（左側にある"j"ではなく）右側にある";"を入力する。ここが直観的じゃないので注意。

# 設定
ショートカットの変更などは"~/.i3/config"を編集して行うことができる。

## dmenuではなくi3-dmenu-desktopを利用する
デフォルトのdmenuだと\$PATHにあるアプリケーションを起動できるが、.profileに\$PATHを変更するスクリプトを追加しても反映されなかった。(原因は分からず。)

一部のアプリケーションが開ければよいので、dmenuの代わりにi3-dmenu-desktopが実行されるようにした。

```text
...
# start dmenu (a program launcher)
bindsym $mod+d exec dmenu_run
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
...
```
これを以下のように変更する。

```text
...
# start dmenu (a program launcher)
# bindsym $mod+d exec dmenu_run
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
...
```

コメントにあるように、i3-dmenu-desktopは.desktopファイルで定義されたアプリケーションだけ表示する。
.desktopファイルについてはこの記事が参考になる。

[Ubuntu - UnityのLauncherにコマンドラインで*.desktopファイルを登録する方法 - Qiita](http://qiita.com/ma2shita/items/2a0f1382e013940e82d0)
Slack API で取得したメッセージのフォーマットが微妙に使いにくい


API叩いてメッセージを取得したものの、最低限取得したい

- ユーザID
- 時刻
- テキスト

このうちユーザIDの取得がままならないので試行錯誤してみました。
ここで述べる話は[GitHub](https://github.com/hassaku63/slack-dev-memos/blob/master/README.md)にオリジナルが置いてあります。

#️ 要件
なにかしらの分析ネタをやるにしても、最低限以下の3つの情報はないと話にならないと思われる。

- 時刻
- ユーザ名(ID)
- POSTしたテキスト

(特定チャンネルの)全ポストからこの3つの情報を抽出したい、っていうのが今回の要件。

# 結論
試行錯誤の結果以下のような感じがよかよう、と結論。

時刻とテキストについては、

```python
data = json.load(open("posts.json"))
for msg in data:
	print msg.get("ts", "")
	print msg.get("text", "")
```

のような感じでOK。

ユーザの取得については、以下の条件で取得できないものはスルー。

```python
def get_user_id(m):
    if m.has_key("user"): return m["user"]
    if m.has_key("bot_id"): return m["bot_id"]
    return None

for msg in data:
	uid = get_user_id(msg)
	if uid is None:
		continue
	# do something ...
```

検証条件の下では、これに該当するポストは全体の0.2[%]だったので無視して良いと結論づける。

# 検証条件
データは自社の _random_ チャンネルから。
具体的な期間やポスト数の公開は差し控えますが、およそ1年半くらいの期間でポストされたメッセージを見てみました。

以上。
Codeigniter 3. Authなパッケージを使う

# 1. Ion Auth というのを使う。
ここを見た。
http://blog.pisyek.com/5-best-authentication-libraries-for-codeigniter/
4番目の [Ion Auth](http://benedmunds.com/ion_auth/)。

Composerでできた vendorディレクトリあたりに git clone してくる。
third_partyとかの方がいいのかな、まあいいや。

```
$ mkdir vendor/benedmunds
$ cd vendor/benedmunds
$ git clone git@github.com:benedmunds/CodeIgniter-Ion-Auth.git
```
```
#　例えば
/
├── .htaccess
├── application
├── composer.json
├── composer.lock
├── index.php
└── vendor
    ├── autoload.php
    ├── benedmunds
    ├── codeigniter
    ├── composer
    └── mikey179
```
そして、apprication/config/autoload.phpを編集する。

```autoload.php
$autoload['packages'] = array('vendor/benedmunds/CodeIgniter-Ion-Auth');
```
READMEにもあるとおり、Codeigniter 3を使う人は、modelファイルのファイル名を、頭の文字大文字に変更する。

```
models/ion_auth_model.php  =>   models/Ion_auth_model.php
```

# 2. テーブルを作る
落としてきたファイルの、sql内のどれかを使えばテーブルができる。

# 3. サンプル
controllers内の auth.phpがサンプルなので、apprication/controllersにコピーしてくると動作が確認できる。modelファイル同様 Codeigniter 3では、ファイル名の頭を大文字にする Auth.php。

http://(my_site)/index.php/auth のようにするとログイン画面が開く。
***
![login_img.png](https://qiita-image-store.s3.amazonaws.com/0/72911/3fa0e5fc-0a7a-66ca-f41a-f3f3465087d4.png)

# 4. Codeigniter 3.0.3
なんか動かないと思ったら、バージョンアップの影響があった。
> Changed Config Library method base_url() to fallback to $$_SERVER['SERVER_ADDR'] when $config['base_url'] is empty in order to avoid Host header injections.

脆弱性があるから、手動で設定しなさいということらしい。そうしないとローカルのIPアドレスが入る。
多重Listのコピー

##Listのコピーについて
標準ライブラリ`copy`をしたくないときメモ
たった一回のためにimportをしたくない性格なので
###一次元の場合
```test1.py
list1 = [1, 2, 3]
list2 = list(list1)
```
###二次元の場合
```test2.py
list1 = [[1, 2, 3], [4, 5, 6]]
list2 = map(list, list1)
```
###３次元の場合
```test3.py
list1 = [[[1, 2], [3, 4]], [[5, 6], [7, 8] ]
list2 = map(lambda x: map(list, x), list1)
```
4次元以降は再帰的にやればいけると思います。

普通に標準ライブラリ`copy`の`deepcopy`を使えばいけます。
Vagrantでローカル開発環境を構築する。


## 環境の準備
VirtualBoxのインストール

```bash
brew cask install virtualbox
```

Vagrantのインストール

```bash
brew cask install vagrant
```

## 仮想マシンを構築する
- 作業ディレクトリを作成する

```bash
cd
mkdir
cd workspace
```

boxファイルのURLを入手する

http://www.vagrantbox.es/ へアクセス
centosnのURLをコピー

- vagrantコマンドでboxを追加する

```bash
vagrant box add centosxx "URL"
```

- vagrantfile を生成する

```bash
vagrant init centosxx
```

- vagrantfile をカスタマイズ

```bash
sudo vi Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 8888 を追記
config.vm.provider :virtualbox do |vb| と end のブロックにて、コメン トアウトを解除。ブロック内に下記2行を追記
vb.customize ["modifyvm", :id, "--memory", "1024"] vb.customize ["modifyvm", :id, "--cpus", 1
```

- CentOS仮想マシンを作成する

```bash
vagrant up
```

- CentOS仮想マシンに接続する

```bash 
vagrant ssh
```

- CentOS仮想マシンを作成する

```bash
vagrant up
```

CentOS仮想マシンに接続する

```bash
vagrant ssh
```
初期設定をするときの MyGem.configure { |config| ... } の実装

## 概要

以下の例のように、Rubyでよく見かける初期設定を行うときに使用するメソッドの実装例について書きます。

いくつか実際のgemのソースを調べてみたのですが、今回の例は [tweetstream](https://github.com/tweetstream/tweetstream) を参考にさせていただきました。

```ruby
MyGem.configure do |config|
  config.username = "Config太郎"
  config.password = "xxxxxxxxxxxxxxxx"
end

obj = MyGem::MyClass.new
obj.username #=> "Config太郎"
obj.password #=> "xxxxxxxxxxxxxxxx"
```


## 1. クラスインスタンス変数について

実装にはクラスインスタンス変数を使用します。いろいろとややこしいクラスインスタンス変数ですが、今回は **self がクラス自身をさすコンテキストでのみ定義と参照ができる** 、という性質を利用します。

以下のコードではセッターとゲッターを定義してみました。HogeClassというクラスオブジェクト自身に `@class_instance_val` というインスタンス変数を持たせられたことがわかります。

```ruby
class HogeClass
  class << self
    def class_instance_val
      # self #=> HogeClass
      @class_instance_val
    end
    def class_instance_val=(val)
      # self #=> HogeClass
      @class_instance_val = val
    end
  end
end

HogeClass.class_instance_val = "new val"
HogeClass.class_instance_val #=> "new val"
```


## 2. モジュールとクラスインスタンス変数

次に、モジュールでクラスインスタンス変数を使用して、先程の例を書きなおしてみます。

以下のコードでは HogeModule のメソッドを HogeClass の特異メソッドとして取り込むことで、実は HogeModule ではクラスインスタンス変数のゲッターセッターを定義していた、ということにしました。

```ruby
module HogeModule
  attr_accessor :class_instance_val
end

class HogeClass
  extend HogeModule
end

HogeClass.class_instance_val = "new val"
HogeClass.class_instance_val #=> "new val"
```


## 3. 実装

それではこれまでのことを踏まえて、冒頭の要件を満たす最低限の MyGem を実装してみます。一番上の名前空間が MyGem で、その内側にconfigureメソッド等を定義するための Configuration モジュール、何らかの処理をする MyClass クラスがあるという構成を想定しています。

```ruby
module MyGem
  module Configuration
    # 変数の追加はここを増やすだけで済む
    OPTIONS_KEYS = [:username, :password]
    attr_accessor *OPTIONS_KEYS

    def configure
      yield self
    end
  end

  # MyGemの特異メソッドとして
  # Configurationモジュールのメソッドを取り込む
  extend Configuration

  # セットされた username などを使って
  # 何らかの処理をするクラス
  class MyClass
    attr_accessor *Configuration::OPTIONS_KEYS
    def initialize
      @username = MyGem.username
      @password = MyGem.password
    end
  end
end
```

Configuration を MyGem にextendすることによって `@username` や `@password` は MyGem のクラスインスタンス変数になっていたわけです。

また、configureメソッドに渡すブロックのconfigという変数の中身はself、つまり MyGem だったということになるので、configureメソッドは結局以下に示すようなはたらきをしていたことになります。

```ruby
MyGem.configure do |config|
  # config #=> MyGem なので
  # MyGem.username = "Config太郎"
  # MyGem.password = "xxxxxxxxxxxxxxxx"
  # としているのと同じ

  config.username = "Config太郎"
  config.password = "xxxxxxxxxxxxxxxx"
end

obj = MyGem::MyClass.new
obj.username #=> "Config太郎"
obj.password #=> "xxxxxxxxxxxxxxxx"
```


## おわりに

MyClassでセットされた値を参照する処理は割と適当に書いてしまいましたが、ここもどのように値を渡すか、受け取るかというところでいろいろ工夫しがいがあると思います。

今回紹介した例以外にも実装方法はあるので、いろいろ調べてみるとおもしろいかもしれません。私はこの Configuration モジュールをつくる方法がとても気に入っています。

参考
[tweetstream](https://github.com/tweetstream/tweetstream)
[MyGem.configure Block](https://robots.thoughtbot.com/mygem-configure-block)
ConoHaのアプリケーションイメージ「WordPress」ですぐにWordPressが立ち上がらない件

新生ConoHaではOSのイメージタイプに「Linux Cent XX」以外に「WordPress」などのアプリケーションがあります。

![スクリーンショット 2015-10-01 21.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/36931/9047f2d1-4146-ed9a-7a40-24eee1f5d44e.png)


これで、インスタンスをつくればWordPress初心者の僕でもすぐにWordPressが立ち上がると思っていました。



#WordPressインスタンスを構築してサイトにアクセスすると・・

![スクリーンショット 2015-10-01 20.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/36931/1aebaa8a-6884-6ad9-0c08-974a318aaf10.png)


これはひどい・・・
もう辞めたくなりましたが、ここで諦めても問題は解決されません


#Nginxログでなんかエラーがでている


```
cd /var/log/nginx
cat default.error.log


Call all to undefined function wp() in /var/www/wordpress/wp-blog-header.php on line 14" while reading response header from upstream, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"
```


これはひどい・・・

#Homeディレクトリになんかあるんすよ・・

cd ~ してlsすると　``mysql-root-password.txt``

とかいうファイルがあって中身はmysqlのパスワードが書かれているんですね。
これだけだと何を主張したいのかまったくわからないですがおそらくこの鍵を使ってWordPressを起動しろということらしい。


#たぶんwp-config.phpにデータベースの設定がないんだろうと推理した

```
cd /var/www/wordpress/
cat cat wp-config.php
----------------------------
/* Direct plugin/theme install */
define('FS_METHOD','direct');

/* Disable debug mode */
define('WP_DEBUG', false);

```

うん、二行しかないしこれだとたぶん起動しないね。


とりあえずこのファイルはコピーしておく

```
cp wp-config.php wp-config.php0
```


# wp-config-sample.php を wp-config.php にコピーしてデータベース接続設定を編集


```
/** WordPress のためのデータベース名 */
define('DB_NAME', 'wordpress');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'root');

/** MySQL データベースのパスワード */
define('DB_PASSWORD','')
```


# 起動するか確認

インスタンスのIPにアクセス

![スクリーンショット 2015-10-01 20.36.18.png](https://qiita-image-store.s3.amazonaws.com/0/36931/69b4ce20-c23f-3d3e-b69c-4f5f4053fe2c.png)

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!


# WordPressアプリケーションのイメージってすぐにWordPressが立ち上がるようになってほしい

インスタンスをつくってWordPressを立ち上がるまで１〜２時間かかりました。
(Nginxの設定とかログとか総なめしました）

普通に考えてアプリケーションのイメージならインスタンス作ったらすぐにアプリケーション使えるべきなので改善がまたれます。
HTML/JS ハイブリッドアプリ開発環境について


##クラウドで手軽
- monaca ブラウザ上でのコーディング　又はVisual Studioで連携
- monacaデバッガーアプリ（実機確認）





##ローカル（オフライン）開発環境

###インストールすべきもの
iOSの場合
参考：「Cordova準備、iOSエミュレータ起動まで」
http://qiita.com/tomo_makes/items/b51c2cb30f0eaac7af38

1. Xcode
2. Node.js
3. cordova
4. ionic

- XcodeのエディタはiOSアプリ(swift言語で開発)用らしい


##ionicの特徴
[ionic serve]コマンドでローカルのブラウザが立ち上がり、でリアルタイム・デバッグできる（Web感覚）

-> 別途ビルドでエミュレータ起動、または実機確認
- ビルドは時間がかかるため、開発時のデバッグは基本的にブラウザでする

#### monacaデバッガーの利点
- 実機でのcordovaプラグインの動作（本体機能のアクセス）を簡単に確認できる


 
##### cordovaプラグイン使うにはmonacaデバッガーと併用が良いかもしれない



##OnsenUIかionicか
- 両方共AngularJSベース（jQueryも使える）
- ionicのほうが世界的にユーザーが多い。コミュニティ活発らしい
- Web開発に近い感覚で作業できる（scssを使っている。OnsenUIはstylus)

- OnsenUIは日本製で、monacaを本格的に使うとサポートなど効果が高そう(ドキュメントも日本がメイン）

###ポイント
　OnsenUIでも[ionic serve]コマンド使えるのでブラウザ上のデバッグはできる

違いは？
- CSSにstylusを使っている（Onsen)
- デザインなどの違い


[参考]
スタートアップ向けハイブリッドUIフレームワークの比較
http://blog.guildworks.jp/2014/11/26/ui-framework-comparison/


##実機デバッグ

- weinreというツール
- リモートデバッグ
 


##その他参考になりそうなリンク

- Ionic, Cordova開発でよく使うコマンド
http://qiita.com/tq_jappy/items/5905d2f72b1e7f777e28

- nifty提供の動画
超速アプリ開発！ニフティクラウド mobile backend 入門
http://dotinstall.com/lessons/basic_ncmb
簡単ゲーム開発！ニフティクラウド mobile backend でワンタップゲームを作ろう (全18回)
http://dotinstall.com/lessons/onetap_game_ncmb

- 本
1.[iOS/Android対応] HTML5 ハイブリッドアプリ開発[実践]入門
2.クラウドでできるHTML5ハイブリッドアプリ開発 Cordova/Onsen UIで作るiOS/Android両対応アプリ (Monaca公式ガイドブック)
Quiltのtopをプロンプトに表示する

Quiltとは何かについてはこちら。
[Linux - quiltの使い方 - Qiita](http://qiita.com/htano/items/9440073e5a08c43d66ba)

Gitの`__git_ps1`のように、quiltのtopをプロンプトに表示してみた。

```bash:.bashrc
__quilt_ps1 () {
    local db=".pc/applied-patches"
    if [ -e $db ]
    then
        echo "($(tail -n 1 $db))"
    fi
}
PS1='[\u@\h \W\[\033[36m\]`__quilt_ps1`\[\033[0m\]]\$ '
```

誰得と思ってたらストックされたので改良してみた。パッチが空でなければ``+``を、パッチから変更があれば（refreshの必要があれば）``*``をプロンプトに表示します。

```bash:.bashrc
__quilt_ps1 () {
    local db=".pc/applied-patches"
    local w=""
    local i=""
    local ps=""
    if [ -e $db ]; then
        if [ -n "$(quilt diff -z)" ]; then
            w="*"
        fi
        if [ -n "$(quilt diff)" ]; then
            i="+"
        fi
        echo "($(tail -n 1 $db)$w$i)"
    fi
}
PS1='[\u@\h \W\[\033[36m\]`__quilt_ps1`\[\033[0m\]]\$ '
```
Microsoft SQL Server 2012 

新着情報～マイクロソフト公式トレーニング等のドキュメントがあるHPの紹介です。
特に、技術情報(自習書シリーズ)は役に立ちました。
個人的な覚書ですが(^^)/

http://www.microsoft.com/ja-jp/server-cloud/local/sqlserver/2012/default.aspx

①新着情報
②製品コンセプト
③エディション情報
④ライセンスと価格
⑤技術情報 (自習書シリーズ)
⑥導入事例
⑦マイクロソフト公式トレーニング
iOS7風のアイコンを画像・JSなしでCSSのみで作ってみた！

#これ画像使ってないです
![27d56fe2ba644efc1153f83b512568c0.png](https://qiita-image-store.s3.amazonaws.com/0/35783/e8eddc40-12f5-3e1c-d8c5-4165702ca616.png)


#ひとこと
これは、専門学校1年生のとき（2013年）に制作したものです。
Web歴9ヶ月だった当時、CSSの学習とCSSだけでどれだけ再現できるかにチャレンジしました。

少々粗っぽい箇所も多数ありますが、一度見て頂いて
「CSSだけでこれだけ再現できる、JSは最終手段にしよう」と思って頂ける方が増えれば幸いです。

#制作物をみる
[CSS3でiOS7風アイコン | 画像・JS一切なし！！](http://jsdo.it/Masato.Takahashi/eOCI)
上記のリンクより制作物を見ることができます。
Laravel5でレスポンスヘッダの'Cache-Control:no-cache'をどうにかしたい時のためのミドルウェア

laravel5では特に設定を行わないとレスポンスヘッダに以下の値がセットされる

```
Cache-Control:no-cache
```

例えばこの状態だとブラウザキャッシュをしてくれなくなるので
ブラウザキャッシュが可能なコンテンツであればこの設定を変えてしまって良いはず

# ミドルウェア作成

そんな訳でミドルウェアを作成する。
名前は何でも良いけどここではAllowCache.phpとする。
[アプリ]/app/Http/Middleware/以下にソースを作成。
今回はno-cacheをpublicに変えてみる

```php:AllowCache.php
<?php

/**
 * リクエストヘッダを修正
 *
 * @copyright Copyright (c) 2015 All About, Inc.
 */

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;

class AllowCache implements Middleware
{
    /**
     * Handle an incoming request.
     *
     * @param  Request $request
     * @param  Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        if (!$response->isRedirect()) {
            $response->header('Cache-Control', 'public');
        }

        return $response;
    }
}
```

# ミドルウェアを登録
[アプリ]/app/Http/Kernel.php/以下にミドルウェアを登録
追記場所はとりあえず末尾に。

```php:Kernel.php
protected $middleware = [
    ...,
    ...,
    ...,
    ...,
    'App\Http\Middleware\AllowCache',
];
```
node.jsでwindowsのドライブレター一覧を取得する

PCのドライブレターを取得する方法。Windowsのみ。

```js 
// Windows のみ...
  var exec = denodeify(require('child_process').exec);
  // ドライブレターを取得
  exec('wmic logicaldisk get caption')
  .then((stdout,stderr) => {
        stdout.split(/\r\r\n/).forEach((d)=>{
          if(d.match(/\:/)){
            // ドライブレター(C:,D:..)が入る
            let driveLetter = d.trim();
            // do somthing ...
          }
        });
  });
```

ちなみにここで使っている```denodeify()```は[ここ](http://qiita.com/SFPGMR/items/ccad29c4b8684681591a)に書いた。nodeの非同期関数を```Promise```でラップするもの。

ドライブレター一覧を取得すればそれを使って各ドライブ中のファイルの存在チェックとかできるようになると思う。
Windows Server 2008の基礎知識

基礎的説明なHPの紹介です。
個人的な覚書ですが(^^)/

http://www.atmarkit.co.jp/fwin2k/winsv2008/index/

①IIS 7.0
②Active Directory
③ターミナル・サービス 
④NAP
⑤Server Core 
⑥Hyper-V
build.gradleのwarning "cannot be applied to '(groovy.lang.Closure)'" を解消する

## 概要
Android Studioをバージョンアップした時にbuild.gradeで以下のようなwarningがでてしまったので、warningを消すための解消方法です。

```
cannot be applied to '(groovy.lang.Closure)'

This inspection reports assignments with incompatible types
```

## やったこと

**プロジェクトを閉じて、再度開く。**

プロジェクトを開く時にAndroid Studioが自動的に設定を適切になおしてくれるみたいです。


## 参考
http://alessio.franceschelli.me/android/fix-gradle-warnings-after-android-studio-1-3-update/
ghq listと同じことをfindでやる方法

ghq.rootが ~/src だとすると、これで同じことができます。

```
find ~/src/github.com -follow  -maxdepth 2 -mindepth 2 -type d
```

結果

```
$ find ~/src/github.com -follow  -maxdepth 2 -mindepth 2 -type d
/Users/DQNEO/src/github.com/deyunanhai/tupai.js
/Users/DQNEO/src/github.com/dietcake/dietcake
/Users/DQNEO/src/github.com/DQNEO/fluent-logger-php
/Users/DQNEO/src/github.com/DQNEO/git-delete-remote-merged-branch
/Users/DQNEO/src/github.com/DQNEO/memo
/Users/DQNEO/src/github.com/DQNEO/minigit
/Users/DQNEO/src/github.com/DQNEO/myelectron
```

これをpecoに食わせるといい感じになりそうです。

## `find -follow`は何？

-followをつけるとシンボリックリンクもリストアップしてくれます。

## ghq listはシンボリックリンクをリストアップしてくれないの？

下記記事によるとghq v0.7.1でなおったと書いてあるのですが、私の環境だとなぜかシンボリックリンクを拾ってくれませんでした。
http://motemen.hatenablog.com/entry/2015/08/ghq-v07

(それ以上深追いはしてない)
Mac OSX 10.11 El Capitanでruby環境リセットされた

# ruby環境全部リセットされた

なんとかする

1.rbenvのパスを通す

```bash
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
rbenv install 2.0.0-p645
rbenv global 2.0.0-p645
```

2.bundleをインストール

```bash
gem install bundler
```

ここからは、middlemanを動かすためにやったこと

3.eventmachineをインストール

ここに書いてあった。
http://jupitech.co/event-engine-ruby-on-rails/

```bash
sudo gem install eventmachine -v '1.0.7' -- --with-cppflags=-I/usr/local/opt/openssl/include
```
opensslにパスを通してあげる。

4.libv8をインストール

libv8 (3.16.14.7 ruby x86_64-darwin-15)
だとエラー出るから
libv8 (3.16.14.11 ruby x86_64-darwin-15)
に書き換えて行けた。


---


ruby環境リセットされたのを復元するのと、rubyのバージョンに依存してるgemをアップデートしなきゃいけない感じですね。

素直に、systemのRuby使ってればよかった説はある。

検索ワードにMacのバージョンの [10.11]って入れると結構ヒットする。
[覚書]PostgreSQL の基本的な使い方

### 初期化

```bash
$ pg_ctl init -D data/
```

### サービスの起動/停止/ステータス確認

```bash
$ pg_ctl start -D data/
$ pg_ctl stop -D data/
$ pg_ctl status -D data/
```

### ロール(ユーザ)の作成/削除/一覧表示

**作成/削除**

```bash
$ createuser testuser
$ dropuser testuser
```

**一覧表示**

```psql
test=> \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 xxxxxx    | Superuser, Create role, Create DB, Replication | {}
 testuser  |                                                | {}
```

### データベース作成/削除/一覧表示

**作成/削除**

```bash
$ createdb -O testuser test
$ dropdb test
```

**一覧表示**

データベース接続していない場合。

```bash
$ psql -l
                               List of databases
   Name    | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
-----------+--------+----------+-------------+-------------+-------------------
 postgres  | xxxxxx | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | xxxxxx | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/xxxxxx        +
           |        |          |             |             | xxxxxx=CTc/xxxxxx
 template1 | xxxxxx | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/xxxxxx        +
           |        |          |             |             | xxxxxx=CTc/xxxxxx
(3 rows)
```

データベース接続している場合。  

```psql
test=> \dl
      Large objects
 ID | Owner | Description 
----+-------+-------------
(0 rows)
```

### データベース接続/切断

**接続**

```bash
$ psql test testuser
psql (9.4.4)
Type "help" for help.

test=> 
```

**切断**

```psql
test=> \q
```


### テーブル一覧/定義表示

**一覧表示**

```psql
test=> \dt
            List of relations
 Schema |    Name     | Type  |  Owner   
--------+-------------+-------+----------
 public | roles       | table | testuser
 public | roles_users | table | testuser
 public | users       | table | testuser
(3 rows)
```

**定義表示**

```psql
test=> \d users
```

以上
Xcodeでplistをソースコード表示にする


![スクリーンショット 2015-10-01 19.29.34.png](https://qiita-image-store.s3.amazonaws.com/0/37767/561dad50-2969-1b43-0298-6af802b324ae.png "スクリーンショット 2015-10-01 19.29.34.png")

恐らくXcodeでplistを選択すると上の画像のように表示されると思います。

![スクリーンショット_2015-10-01_19_30_05.png](https://qiita-image-store.s3.amazonaws.com/0/37767/ebeff0b4-72ce-1afe-a202-0ecf56721a61.png "スクリーンショット_2015-10-01_19_30_05.png")

これをソースコードで表示したい場合は、plistファイルの上で右クリックし、Open As→Source Codeを選択すると…

![スクリーンショット 2015-10-01 19.30.33.png](https://qiita-image-store.s3.amazonaws.com/0/37767/0859ac70-5dd7-3b47-5500-04a5b31943e9.png "スクリーンショット 2015-10-01 19.30.33.png")

このようにソースコードで表示することが出来ます。
Jupyter notebookをリモートサーバで実行する

##jupyter のインストール
pyenv でanaconda環境に切り替えたのち
`pip install jupyter`


##jupyter/notebookのインストール
nodejsとnpmが入っていることをはっきりさせる
`sudo apt-get install nodejs-legacy npm`
macなら `brew install node`
jupyter notebookをcloneしてビルド

```sh
git clone https://github.com/jupyter/notebook.git
cd notebook
pip install --pre -e .
jupyter notebook
```

##ipythonの設定

`pip3 install ipython`

`ipython3`でIpythonを立ち上げて、以下のコマンド


```python
from notebook.auth import passwd
passwd()
```
passを入力するとsha鍵が出るので、これを
`~/.jupyter/jupyter_notebook_config.py`内に以下のような形で書く

```python
c = get_config()

# 全てのIPから接続を許可
c.NotebookApp.ip = '*'
c.NotebookApp.password = u'sha1:bcd259ccf...<先ほどの鍵をコピペ>'
#ブラウザは立ち上げない
c.NotebookApp.open_browser = False

# 特定のポートに指定(デフォルトは8888)
c.NotebookApp.port = 9999
```

後は`jupyter notebook &`で立ち上げてローカルのブラウザから
`http://<サーバのIP>:9999`でログイン

セキュリティを気にする時はIPを制限したり、SSLとか使う。詳しくは[公式](http://jupyter-notebook.readthedocs.org/en/latest/public_server.html)

`/etc/rc.local`とかに`nohup jupyter notebook &`を書いておくとreboot時に自動で立ち上がる
ASP.NET Webサービスの隠し仕様：制御文字を含んだ文字列は（エンコードされていても）パースエラーになる

ASP.NET 3.5で引っかかったまさかの障害。

ローカルネットワーク向けのSOAP Webサービスへのアクセスがなぜか400 Bad Requestで失敗するという障害が起きていました。クライアント側も.NET FrameworkのWeb参照クライアントライブラリなので、SOAPリクエストが形式異常なんてことはないはず。その後のリトライもすべて失敗しているので偶発的な誤動作というものでもなさそう。
一体何が起こった？

答はタイトルの通り、SOAPリクエストの引数として文字列に制御文字が含まれていたことでした。
それも、クライアントライブラリ側はきっちりエンコード（実体参照化）してくれていたにもかかわらず、それが制御コードであればサーバ側は400 Bad Requestを返すのでした。
フレームワークのバグっぽい動きですねこれは。
Travis CI の script で sudo できない時の対処法

こんなエラーが出る場合。

```
$ sudo make install
sudo: must be setuid root
The command "sudo make install" exited with 1.
```

Travis の設定で sudo を許可しよう。

```yaml:.travis.yml
sudo: true
script:
  - sudo make install
```

ただしテストは少し遅くなるらしい。



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
[Grails]Grails3.0.8でctrl-cでGrailsが停止しない

# 概要
Grails 3.0.8で、 **非インタラクティブモード** でGrailsを起動すると、`ctrl-c`をタイプしてもGrailsが終了しない。

# 環境
|Type|Value|
|----|-----|
|OS|Linux Mint 17|
|Grails|3.0.8|
|Groovy|2.4.4|
|JVM|1.8.0_25|

なお、Grailsはsdkmanでインストールした。

# 現象
コンソールから `grails run-app` で **非インタラクティブモード** でGrailsを起動した場合、コンソールがそもそもキー入力を受け付けていないっぽい。（Enter押しても改行されない）
この時点で`ctrl-c`を入力すると、一応キーボードの入力がコンソールに表示されるようになる。
が、続いて`ctrl-c`を押してもGrailsは止まらない。

# 暫定対応
`ctrl-z`で抜けた後、コンソールで`grails stop-app`を実行すればGrailsはちゃんと停止する。

# その他
Grails 3.0.0の時はダメだったけど、インタラクティブモードで`stop-app`が使えるようになっている！
なので、常に`grails`コマンドでインタラクティブモードに入って、その中で`run-app`と`stop-app`を叩くのも有りのはず。
自分が開発しているシステムはGrais 2.4系だけど常にインタラクティブモードで作業している。

ちなみに、自分の環境では100%の確率でこの問題が発生。しかし、環境によっては高確率で発生するけど100%とまでは行かない、そもそも再現しない、等環境によって差異がある模様。
IE10以上でWebフォントが表示されない時はms-font-feature-settingsを確認

IE10から搭載された `-ms-font-feature-settings` は、指定したフォントがサポートするスタイルセットが使えるようになるプロパティですが、これによって一部のWebフォントが表示されない時があります。

下記のHTMLはIE10以上では表示されません（IE11で確認）。

```html
<!doctype html>
<head>
	<link href='https://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>
	<style>
		p.font1{
			font-family: 'Montserrat', sans-serif;
			-ms-font-feature-settings: "kern", "liga", "pnum";
		}
	</style>
</head>
<body>
	<p class="font1">Web font</p>
</body>
```

`-ms-font-feature-settings: "kern", "liga", "pnum";` という組み合わせは [Bourbon Bitters](http://bitters.bourbon.io/)でデフォルトで設定されているので、自分はこれでハマりました。

#対応方法

IEで表示されないWebフォントがある時は、そのフォントだけ `-ms-font-feature-settings: "normal";` を指定すると表示されます。

```css
p.font1{
	font-family: 'Montserrat', sans-serif;
	-ms-font-feature-settings: "normal";
}
```

フォントによって違うので他の組み合わせも可能ですが、とりあえず表示させたいなら `normal`で確認するのが良いと思います。

#参考サイト

* [CSS コーナー: フォントの全要素を使用する - Internet Explorer ブログ (日本語版) - Site Home - MSDN Blogs](http://blogs.msdn.com/b/ie_jp/archive/2012/02/02/10263114.aspx)
* [IEへの対応が抜けていました、、アイコンフォントをIEでも表示させるために追加したCSS | 極楽ひだまり保育園](http://nekomoriya.biz/works/4635.html)
【iOS】開発中、UISearchBarにフォーカスしてもキーボードが表示されない時

**シミュレータ上からアプリを一旦削除したら直った。**

Swiftで開発中に起こった。
シミュレータを再起動しても、Xcodeを再起動しても直らず。

アプリを削除で解決した。
iOSアプリ開発者としてやっておきたいこと(マルウェア感染チェック、aliace設定)


# 1.自分のXcodeがマルウェア感染していないか確認する

## マルウェア感染とは？
> セキュリティ対策ソフトメーカーのパロアルトネットワークスが、中国のアップル App Store が配布するiOSアプリにマルウェアが混入しているものを発見しました。マルウェアは改ざんされた非純正の開発環 境 XcodeGhost を使って作られたことが分かっています。

[参考サイト_1](http://japanese.engadget.com/2015/09/20/app-store-xcodeghost/)
[参考サイト_2](https://developer.apple.com/news/?id=09222015a)

## 設定のまでの流れ
### 1.1ターミナルで以下の「検証コマンド」を実行(マシンスペックによっては10分程度掛かる。。。)

**検証コマンド**

```
spctl --assess --verbose /Applications/Xcode.app
```

### 1.2実行結果を確認する

**実行結果**

```
/Applications/Xcode.app: accepted
source=obsolete resource envelope
```


**マルウェア感染しているか確認**

 - 感染していたら「accepted以外」が表示
 - 感染していなかったら「accepted」が表示

**マルウェア感染していた時の対応**

 - Xcodeを再ダウンロードしてプロジェクトをビルド

# 2.Xcodeをターミナルで起動

## ターミナル起動のメリット

 - 起動が楽(フォルダ移動→クリックで起動→プロジェクト選択..という作業が面倒)

## 設定のまでの流れ

### 2.1ターミナルを開いてvi ~/.bash_profileを実行し、開いた「bash_profile」に以下をコピペ

(他にaliace設定している人はコメントも付けると安心)

```
## Xcode aliace設定
alias xopen='open -a /Applications/Xcode.app'
```

### 2.2設定反映のためターミナルを再起動

## 修正前後比較

**修正前**


![変更前.gif](https://qiita-image-store.s3.amazonaws.com/0/15812/4f50c1d4-fa2d-d344-d8eb-3e7174665b24.gif "変更前.gif")



**修正後**
xcodeのあるディレクトリまで移動し、拡張子が「.xcodeproj」または「.xcworkspace」に対して「xopen」を使う。

![変更後.gif](https://qiita-image-store.s3.amazonaws.com/0/15812/badc78f8-6807-d1b7-ac23-d82c740b4950.gif "変更後.gif")
usortで返す数

いつも混乱する。昇順、降順という言い方をするとよく分からんので、以下のようにまとめる。

```php:php

usort($array, function($a, $b){
});

```

**`$a`が上に来てほしい場合は`-1`**
**`$b`が上に来てほしい場合は`1`**
Rails+Elasticsearchにおけるindex_documentについて

## 前提

+ Gemfile

```rb
ruby '2.2.2'
〜略〜
source 'https://rubygems.org' do
  〜略〜
  gem 'elasticsearch-model', '0.1.7'
  gem 'elasticsearch-rails', '0.1.7'
  gem 'elasticsearch-extensions', '0.0.18'
end
```

## 作成したアプリにおけるindexについて

+ `elasticsearch-model` の`index_document`, `update_document`, `delete_document` を利用する方針にした
+ 一つの`index`に対して複数のテーブルから情報を`merge`して投入するため、`as_indexed_json`を編集した
    + 以下イメージ

```rb
  def as_indexed_json(_options = {})
    { id:                id,
      name:              name,
      address:           address,
      service_name:      service.name,
      detail:            section.title,
    }
  end
```

## この状況に置ける問題点

+ `section.title`だけに更新が走った時に`update_document` でデータがうまく更新されない

## 調査した結果

+ elasticsearch-model-0.1.7/lib/elasticsearch/model/indexing.rb
    + `changed_attributes` の辺りで基本となるテーブルに対する更新がないと`update`されないようになってるっぽい

```rb
        def update_document(options={})
          if changed_attributes = self.instance_variable_get(:@__changed_attributes)
            attributes = if respond_to?(:as_indexed_json)
              self.as_indexed_json.select { |k,v| changed_attributes.keys.map(&:to_s).include? k.to_s }
            else
              changed_attributes
            end

            client.update(
              { index: index_name,
                type:  document_type,
                id:    self.id,
                body:  { doc: attributes } }.merge(options)
            )
          else
            index_document(options)
          end
        end

```

## 対策

+ 消して作りなおす！
+ ダウンタイムは一旦無視する！！！

```rb
  after_commit :update_elasticsearch

  def update_elasticsearch
    begin
      __elasticsearch__.delete_document
    rescue StandardError => e
    end
    begin
      __elasticsearch__.index_document
    rescue StandardError => e
      Rails.logger.error e.message
    end
  end
```
RaspberryPiで脈拍データをCSV出力

目標はraspberryPiで脈拍をとってcsvデータを出力
現在は既にraspberryPiの初期セットアップは終わっていて、自分は既にArduinoとかいじったことある程度
#用意
今回使用するものはraspbereyPi BとB+
B+が自分ので、それでいろいろ試して最終的にたくさんのBで実装する感じになると思う
電源ケーブルやSDカードは既にある想定
http://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi

arduinoはすぐにできるが、ラズパイはアナログ信号を扱いたいときはADコンバータが必要らしい
今回使用するのはこちら
実は用意して頂いたものを使用するので、違うかも・・・
http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4SCU

脈拍取るのにはこちら
http://akizukidenshi.com/catalog/g/gK-09433/

その他
ブレッドボード
ジャンプワイヤー（メスオスがあると便利）

主にネットワーク経由でSSH接続で開発していく予定

#手順とリンク
1.準備と基礎編
ここ
2.アナログ入力確認編
http://qiita.com/tkyko13/items/981989a006a95821ccde
3.pythonで確認
http://qiita.com/tkyko13/items/44ca53b027fa249acdc6
4.脈拍センサ
http://qiita.com/tkyko13/items/e4afc73add81d7bbb426
5.csv出力
http://qiita.com/tkyko13/items/9c0eb46c1b65129d2556

#1.Lピカ
##参考URL
http://deviceplus.jp/hobby/raspberrypi_entry_009/
参考の先では2番ピンを利用していましたが、自分はなんとなくですが4番にしています
もちろんその後違う番号でも同じように動きました
参考先のそのままが多いのでここではメモ程度にします

##配線図
（画像予定 4番ピンとGNDの間にLEDがある）

##実装
コマンド
GPIOポートの使用する準備
以下のコマンドで「/sys/class/gpio/」に「gpio4」という仮想フォルダが作成される


```
$ echo 4 > /sys/class/gpio/export
```

「gpio4」が入力出力のどっちなのかの指定
今回は出力にする

```
$ echo out > /sys/class/gpio/gpio4/direction
```


出力の値は「value」に設定
「1」が点灯「0」が消灯

```
$ echo 1 > /sys/class/gpio/gpio4/value
$ echo 0 > /sys/class/gpio/gpio4/value
```

終了のコマンド
これで「gpio4」の仮想フォルダが消える

```
$ echo 4 > /sys/class/gpio/unexport
```

#2.pythonで点灯
##参考URL
http://make.bcde.jp/category/5/
参考先のそのままが多いのでここではメモ程度にします

##配線
1と同じにしています

##実装
pythonのGPIOライブラリのインストール

```
$ sudo apt-get install python-rpi.gpio
```

pythonコードを書く
自分はvimで作成しました
GUIの人はPyCharmなど使用できていいと思います

```gpiooutput.py
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(4, GPIO.OUT)
while True:
    GPIO.output(4, True)
    time.sleep(1)
    GPIO.output(4, False)
    time.sleep(1)
```

コマンドでこのpythonを実行します

```
$ sudo python gpiooutput.py
```

ここまではすごく情報もあってすんなり
後半は独自の実装も増えてくると思います

続き
・アナログ入力確認編
http://qiita.com/tkyko13/items/981989a006a95821ccde
spark naive bayes 実験メモ


```scala
import org.apache.spark.mllib.classification.{NaiveBayes, NaiveBayesModel}
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.feature.HashingTF

val htf = new HashingTF(10000);

val pos_data = sc.textFile("test_pos.txt").map { text => new LabeledPoint(0, htf.transform(text.split("\\s+")))};
val neg_data = sc.textFile("test_neg.txt").map { text => new LabeledPoint(1, htf.transform(text.split("\\s+")))};

var data = pos_data.union(neg_data);
var splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0)
val test = splits(1)

val model = NaiveBayes.train(training, lambda = 1.0, modelType = "multinomial")

var result = test.map { t =>
        val predicted = model.predict(t.features)

        (predicted, t.label) match {
          case (0.0, 0.0) => "TN"
          case (0.0, 1.0) => "FN"
          case (1.0, 0.0) => "FP"
          case (1.0, 1.0) => "TP"
        }
}.countByValue()

val totalCount = test.count()

val truePositiveCount = if(result.contains("TP")) result("TP").toDouble else 0;
val trueNegativeCount = if(result.contains("TN")) result("TN").toDouble else 0;
val falsePositiveCount = if(result.contains("FP")) result("FP").toDouble else 0;
val falseNegativeCount = if(result.contains("FN")) result("FN").toDouble else 0;

val accuracy = (truePositiveCount + trueNegativeCount) / totalCount
var threatscore = truePositiveCount / (truePositiveCount + falsePositiveCount + falseNegativeCount);
var percision = truePositiveCount/(truePositiveCount + falsePositiveCount);
var recall = truePositiveCount / (truePositiveCount + falseNegativeCount);
var f = truePositiveCount /( truePositiveCount + (falsePositiveCount + falseNegativeCount) /2)

println("accuracy: " + accuracy)
println("threatscore: " + threatscore)
println("percision: " + percision)
println("recall: " + recall )
println("f: " + f)

test.collect.foreach { t =>
        val predicted = model.predict(t.features);
        println(t.label +": "+ predicted)
}
```
文字と文字列と文字コードのお話

プログラミングをする上で文字にかかわることを避けることはほぼ出来ない。
今回は文字に関する概要をまとめていく。

##文字と文字列について
文字とは１字の事を指し、文字列とは文字の集合体を指します。
ただし言語や文字コードによっては１字でも文字列として扱わなくてはいけない場合があります。
これは後述で説明します。

##文字コードについて
文字コードは**文字の表**のことを指します。
コンピュータは数値しか扱えないため、「この数値の時はこの文字として扱いなさい」と決めてあげる必要があります。
その時、どの数値がどの文字に対応するかを決めるのが文字コードで、ASCII、Shift-JIS、Unicodeなどの種類があります。

##シングルバイト文字とマルチバイト文字について
1byteで表現する文字をシングルバイト文字、複数byteで表現するものマルチバイト文字といいます。
これらは文字コードの種類によって分かれます。
ASCIIはシングルバイト文字、Shift-JISとEUCとUnicodeはマルチバイト文字となります。
マルチバイトは固定長のものと可変長のものがあります。

##各文字コードの簡単な説明
###ASCII
1byteで英数字と記号を扱う

###Shift-JIS
1～2byteの可変長でASCIIに日本語を追加した文字コード。
半角は1byte、全角は2byteで扱う。

###Unicode
世界的に使われる文字コードで複数のスキームが存在する。
よく使われるスキームを以下に抜粋する。
####UTF-8
1～4byteの可変長文字列で、ASCIIをベースに様々な文字を扱える文字コード。
最近のネットではほとんどUTF-8が使われる。

####UTF-16
2byteの固定長文字列で使える幅が割りと広い文字コード。
C#の内部文字コードはUTF-16を採用している。

####UTF-32
4byteの固定長文字列でUTF-16より更に幅広い文字を扱える文字コード。


■余談1
UTF-16は正確には固定長ではなく、サロゲートペアを使う可変長である。
しかし、実務レベルにおいて可変長として扱うことはないため
固定長として扱ったほうがプログラムとして都合がよいことが多い。

##プログラミング言語における文字の扱いについて
###基本知識
C,C++のchar型は1byteでC#のchar型は2byteである。
そのため、C#はUTF-16の全ての文字を扱うことが可能だが
C,C++の場合、マルチバイト文字を扱うことは出来ない。

C#

```csharp:Char.cs
// 正常に動作する
char c = 'あ';
```

C++

```cpp:Char.cpp
// マルチバイト文字であるため、正常に動作しない(1byteに切り詰められる)
char c = 'あ';
```

■余談2
Cでは、sizeof('a')とsizeof('あ')は、sizeof(int)と同等であるが
C++では、sizeof('a')はsizeof(char)と、sizeof('あ')はsizeof(int)と同等である。
これはC++では型の厳密性が高くなったために変更されたと思われる。

###環境というものを知る
環境とは、プログラミングを行う状況のことであり
実務レベルでいうとプログラミング開発ツール（と厳密には追加でCPU）のことである。
環境によって使用する文字コードは変化するため、以下のコードはShift-JIS環境とUTF-8環境ではまるで意味が異なる。

```cpp:Char.cpp
// Shift-JIS環境では1byteであるため正常に動作するが、UTF-8環境では3byteであるため警告がでる
char c = 'ｱ';
```

■余談3
環境というのはchar型のビット数にも影響がある。
C,C++のchar型は1byteと決まっているが、1byteが8bitであるということは決まっていない。
そのため、1byteが16bitの環境も組み込み系で存在するらしい。

###ワイド文字の登場
C,C++にはwchar_tというワイド文字型というのが存在する。
ワイド文字は固定長の文字を扱う型で、環境により2byteと4byteの場合がある。
大抵の場合、これらの型にはUTF-16かUTF-32を当てはめて使用する。
なお、C++11には環境に依存しないchar16_t, char32_tという型が存在している。
wchar_t型を扱うコードは以下となる。

```cpp:wchar_t.cpp
// 文字の頭にLをつける
wchar_t wc = L'あ';
```

###ロケールのお話
wchar_tを正式に使う場合、現在の環境をsetlocalで設定してあげる必要があります。
以下はShift-JISの環境下でロケールをセットしてあげる手順です。

```cpp:local.cpp
#include <stdio.h>
#include <locale.h>

int main()
{
	// ワイド文字が使用するロケールがわからないため、正常に表示されない
	wprintf(L"%c\n", L'あ');

	// ロケールを設定してやる(Shift-JISであることを教える)
	setlocale(LC_ALL, "Japanese");

	// 正常に表示される
	wprintf(L"%c\n", L'い');
}
```

###文字列の終端を知る方法
プログラミング上で文字列を管理するとき、その終端を知る方法は２つある。
一つは終端文字(NULL文字)を設定すること。
一つは文字列の長さを記録しておき、先頭から長さで終端と判定すること。

Cは終端文字判定、C++は終端文字判定と長さの両方、C#は長さで判定することが出来ます。
各長所と短所について説明します。

■終端文字判定
・長所
どれだけ長い文字列でも終端判定に必要なのは1byteである。

・短所
1byteずつ判定する以外に文字列の終端を検索する方法がないため、文字列が長いと終端判定まで時間がかかる。

■長さ判定
・長所
終端の位置が即座にわかる。

・短所
長さを確保するメモリ領域が必要となる。（大抵の場合4byte）

総合的に判断すると、長さを保持していた場合のほうがメリットが大きいです。
今時、文字列ごとの長さ保持の4byteが負担になることはありませんし、文字列連結などの
処理に負担をかけることのほうがコストが大きいためです。

■余談4
あるメール受信プログラムで、複数のメールの文字列を一つの文字列にまとめて表示しようとしたところ
strcatで連結していたら30分かかっていたが、連結後の終端文字のポインタを返す自作のstrcatを作って
連結したところ2秒で終わったという。
そのくらい、文字列の終端を検索するという行為は遅い。

■余談5
プログラミング言語pascalでは先頭の8bitに文字列の長さを詰めて管理していました。
そのため、pascalでは256文字より大きい文字列は扱えません。
CloudPebbleによるPebble Appの開発


[CloudPebble](https://cloudpebble.net/)を使えば、
SDKのインストール不要でPebbleのAppの開発、ビルド、実機へのインストールまで
ブラウザ上できるということなので試してみた。

## プロジェクトの作成

プロジェクト一覧ページの "CREATE" からプロジェクトの新規作成を行う。
今回はjsで作りたいので PROJECT TYPE は "Pebble.js(beta)" を選択する。

![Kobito.5Wf8BR.png](https://qiita-image-store.s3.amazonaws.com/0/82948/61b69c7e-e2bd-8399-3031-322f8c645545.png "Kobito.5Wf8BR.png")

## ビルドと実行

左ペインにある COMPILATION から "RUN BUILD" を実行するとビルドのキューが発行されしばらくするとビルドが完了する。

### エミュレータでの実行

"COMPILATION" の画面で "EMULATOR" を選択し、
"INSTALL ON APLITE" もしくは "INSTALL ON BASALT" を実行すると、
ブラウザ上のエミュレータが起動しビルドしたAppが実行される。

![Kobito.Lqzke5.png](https://qiita-image-store.s3.amazonaws.com/0/82948/daa4d77c-2fc3-0a7e-6688-7f7b19c09501.png "Kobito.Lqzke5.png")


- APLITE: 初代Pebble(モノクロ)
- BASALT: Pebble Time(カラー)

のことらしい。

エミュレータの起動中に、

- Rendering cats...(猫をレンダリングしています…)
- Petting unicorns...(ユニコーンをかわいがっています…)

といった、全然関係ないメッセージが出てくるところで
シムシティのローディングメッセージを思い出したりした。

[ローディングメッセージ - SimCityシムシティ（2013年版）攻略情報wiki](http://seesaawiki.jp/simcity2013/d/%A5%ED%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0%A5%E1%A5%C3%A5%BB%A1%BC%A5%B8)

エミュレータを起動するとページ左上に下のように表示される。

![Kobito.nRg38e.png](https://qiita-image-store.s3.amazonaws.com/0/82948/30efa532-fc74-2cb5-8c1f-ad2a935c5699.png "Kobito.nRg38e.png")

もちろんクリックによるボタン操作が可能で、
歯車アイコンから

- バッテリの残量
- 充電中か？
- Bluetoothがオンか？

などのステータスが設定できる。

### 実機へのインストール

CloudPebbleから実機に直接Appをインストールすることもできるが、
iPhone/AndroidのAppで事前に準備が必要。

1. Pebble AppにCloudPebbleと同じアカウントでログインしている前提
2. PebbleのAppの "SETTINGS" から "Developer Mode" をオンにする。
3. Developer Modeをオンにすると "DEVELOPER(ON)" という項目が現れるので、その中にある "Enable Developer Connections" をオンにする。

![Kobito.3smZ5t.png](https://qiita-image-store.s3.amazonaws.com/0/82948/e8092f66-2642-f81d-37d2-47a987096ee9.png "Kobito.3smZ5t.png") ![Kobito.3jrQxi.png](https://qiita-image-store.s3.amazonaws.com/0/82948/4668514f-825b-f488-2f61-7eb7179533d8.png "Kobito.3jrQxi.png")


上の手順が済んだらCloudPebbleに戻り、
"COMPILATION" で　"PHONE" を選択し、"INSTALL AND RUN" を実行する。

![Kobito.gRzZcL.png](https://qiita-image-store.s3.amazonaws.com/0/82948/e00d84ac-dd0f-70a8-9d81-381f9e9cb8c1.png "Kobito.gRzZcL.png")

関連づけられたスマートフォン経由で実機にAppがインストールされる。

![Kobito.spuBu5.png](https://qiita-image-store.s3.amazonaws.com/0/82948/9690fdf7-8d93-6a38-9e60-bb38b5018eed.png "Kobito.spuBu5.png")


## GitHubリポジトリとの連携

上メニューにある "SETTINGS" の "GITHUB INTEGRATION" にある
"LINK YOUR GITHUB ACCOUNT" というボタンを押すと
GitHubの認証に遷移するので "Authorize application" を押して認証を行う。

"PROJECTS" メニューから先ほどのプロジェクトに戻り、
左ペインの "GITHUB" を選択するとリポジトリ登録画面が表示されるので、
GitHubで作ったリポジトリの情報を記載して "SAVE" を実行する。

![Kobito.51TiLO.png](https://qiita-image-store.s3.amazonaws.com/0/82948/db5f1fc4-33a2-8933-ffe7-912903c477ce.png "Kobito.51TiLO.png")

リポジトリの登録に成功すると "PUSH NEW COMMIT" が実行可能になるので、
実行するとGitHubのリポジトリにコードがコミットされる。


## 余談

Pebble Time Steelがやっと届いたんですが、
extra metal bandセットにbackしたはずなのにバンドが入っていませんでした。
どうやらバンドは別に送られてくるらしいです…