OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant rsync + Railsでコードの変更が反映されない件


# 問題
Vagrantの共有フォルダでVM上とコードをrsync経由で同期させているとき、なぜかローカルで編集した変更がVM上のRailsサーバーに反映されないことがある。Railsサーバーを再起動すれば、ちゃんと反映される。

# 原因
VM上の変更したファイルのmtimeが更新されていないため、Railsのautoloadが実行されなかった。

Railsのautoloadは`ActiveSupport::FileUpdateChecker`を使って以下のようにファイルのmtimeを見て変更されたかどうかを判定している。

```rb:lib/active_support/file_update_checker.rb
def updated?
  current_watched = watched
  if @last_watched.size != current_watched.size
    @watched = current_watched
    true
  else
    current_updated_at = updated_at(current_watched)
    if @last_update_at < current_updated_at
      @watched    = current_watched
      @updated_at = current_updated_at
      true
    else
      false
    end
  end
end

# ...

def updated_at(paths)
  @updated_at || max_mtime(paths) || Time.at(0)
end

# ...

def max_mtime(paths)
  time_now = Time.now
  paths.map {|path| File.mtime(path)}.reject {|mtime| time_now < mtime}.max
end
```

変更したファイルのmtimeをローカルとVMで比べてみると、下のようになった。

```bash:local
$ stat -x app/controllers/accounts_controller.rb
  File: "app/controllers/accounts_controller.rb"
  Size: 117          FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/   naoty)  Gid: (   20/   staff)
Device: 1,4   Inode: 17448444    Links: 1
Access: Wed Oct  7 23:17:24 2015
Modify: Wed Oct  7 23:17:21 2015
Change: Wed Oct  7 23:17:21 2015
```

```bash:vm
$ stat app/controllers/accounts_controller.rb
  File: `app/controllers/accounts_controller.rb'
  Size: 117             Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 2331313     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ vagrant)   Gid: ( 1000/ vagrant)
Context: unconfined_u:object_r:default_t:s0
Access: 2015-10-06 17:47:42.590929945 +0000
Modify: 2015-10-07 14:17:21.000000000 +0000
Change: 2015-10-06 17:47:43.386929905 +0000
```

確かにVM上のmtimeはぜんぜん更新されてない…。

# 解決
rsyncの`--times`オプションをVagrantのrsyncオプションに渡すことで、ファイルのmtimeも転送されるようにする。

```ruby:Vagrantfile
config.vm.synced_folder ".", "/vagrant", type: "rsync",
  rsync__args: %w(--verbose --archive --delete -z --copy-links --times),
  rsync__exclude: %w(.git/ log/ tmp/ vendor/)
```

`rsync__args`で`rsync`に渡す引数を指定できる。ここでは、デフォルトで渡される引数に加えて`--times`オプションを指定している。
CKEditorで<html>,<body>タグを削除しない方法

#CKEditorで<html>,<body>タグを削除しない方法

CKEditorに他のサイトからhtmlタグ付きのソースをそのままコピペすると
html, bodyタグ等が削除されてしまう。
これだと、bodyタグに装飾が指定されている場合は、デザインが異なってしまう。

なんと、html, bodyタグを削除しないモードがあった。

config.jsで下記の設定を追加すればOK

```js

config.fullPage = true;

```
[ERROR] /usr/libexec/mysqld: unknown variable 'default-character-set=utf8'が出たときの解決方法。

MySQLのバージョンが上がってから起動しようとしたらエラーがでてうまく行きませんでした。環境はCentOS6.6です。

# MySQLの起動で失敗
MySQLをstartしようとしたら失敗しました。

```
sudo /etc/init.d/mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]
```
なんてこった＼(^o^)／

# mysqld.logを見る
mysqld.logを確認してみます。

```
sudo tail /var/log/mysqld.log 

InnoDB: 5.5.46 started; log sequence number 17225910
[ERROR] /usr/libexec/mysqld: unknown variable 'default-character-set=utf8'

略
```
あーこれ`default-character-set=utf8`が使えなくなったというやつですかね。。


# my.cnfを編集します。

```
sudo vi /etc/my.cnf

[mysqld]
#default-character-set=utf8
character-set-server=utf8
```
元々が`default-character-set=utf8`のところを、`character-set-server=utf8`に書き換えます。

# MySQLを再起動
MySQLを再起動します。

```
sudo /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]
```
今度はうまくいきました(☝ ՞ਊ ՞)☝
備忘録_ステータスコード

##覚えときたいステータスコード

*1xx : 処理中
*2xx : 成功
*3xx : リダイレクト
*4xx : エラー(クライアント)
*5xx : エラー(サーバー)

##上記詳細

*201 Created
→リソースを新規に作成(新しいリソースはlocationヘッダに入る)
 
*301 Moved Permanently
→リクエストしたリソースが移動している

*303 See Other
→リクエストに対する処理結果が別のURIで取得できる
上の2つはリダイレクト

*400 Bad Request
→リクエストミス(未対応4xx系はこれで対応されるようなってる)

*401 Unauthorized
→認証が必要

*503 Service Unavailable
→メンテナンスなどでサーバーが停止
主キーを識別用以外に使わない

データベースを作るときに、多くの場合「主キー」をつけます。ただ、この「主キー」を、あまり考えなしにつけてしまうと、あとあと厄介なことになります。

# 大原則
主キーは、テーブル内のレコードを識別して、紐付けるための値です。主キーが持つべき性質として、

* 重複しない：主キーが重複してはレコードの識別子でなくなってしまいますので、これは絶対条件です。
* 扱いやすい：レコードを参照するのに、いちいち100文字の主キーで参照するのでは骨が折れます。
* 永続的：レコードが一度作られれば、そこに振られた主キーは中身が変化しようとも変化せず、レコードを削除しても再利用すべきではありません。

のようなものがあります。なお、RDBMSの実装上使いやすいので、主キーを連番として自動的に振ることがありますが、「連番である」ことは主キーの本質と特に関係ありません。

## 外部の都合で変化・重複しうるものを主キーにしない
氏名・住所・電話番号[^1]・生年月日・メールアドレス[^1]といった値は、同じものが発生しうる上に、外的要因で変化するので、主キーとして使うのに適切ではありません。「会員番号」のような一意な値を内部で生成して、それを主キーにしましょう。

## 主キーが連番なことを期待しない
そもそも上で述べたように、主キーは本質的に連番である必要はありませんし、たとえ連番モードにしていても[状況によっては飛ぶことがありえます](https://www.softel.co.jp/blogs/tech/archives/2651)。さらに、削除した項目について主キーを再利用すべきではないので（SQLアンチパターン21章、シュードキー・ニートフリーク）、自然とキーは飛んでいきます。主キーが連続であることに依存しないような処理を行いましょう。

日本の法律でも、例えば[刑法200条](http://law.e-gov.go.jp/htmldata/M40/M40HO045.html#1002000000026000000000000000000000000000000000000000000000000000000000000000000)は「削除」とだけなっています。これは、かつてここにあった尊属殺人罪に違憲判決が出たため、刑法現代語化の際に条文を削ったのですが、そのまま削るだけだとあとの条文番号がずれてしまって、刑法のこれ以降の条項を参照するすべての法律を書き換える必要が出てきてしまうので、「第200条 削除」として番号は消費したままとなっています。

## 主キーに項目識別以上の機能を持たせない
番号にした主キーでも、ときどき番号自体を意識的に振ることで、番号自体に意味をもたせることがありますが、そのようなことをすると行き詰まるケースも多々あります。

たとえば、東京証券取引所など日本の株式市場へ上場している企業には、4桁の数字で「証券コード」が振られています。元々は番号を区分してどのような業種なのかという意味をもたせていたのですが、10000しか番号がないところに東証だけで3500社近くが上場しているため、番号帯による区分が適用できない企業も増加しています。

また、自分が開発していたシステムでの話ですが、選択項目のリストを別テーブルに持たせていました。そして、意識的に主キーで順番を振って、ソートもその順で行なっていたのですが、主キーを連番で振った項目の途中にあとから項目を追加する必要が出てきてしまいました。主キーを動かすのも他所への影響が出そうなので断念して、結局「整列用の順序を別な列に入れて、追加項目の主キーは別な位置にする」という方法で乗り切ることにしました。ということで、「特定の順序を作るために主キーを使う」のも破綻をきたすことがあります。

## 複合主キー
複数列の組み合わせでレコードを確定させる「複合主キー」という機能もあります。ただ、これをやる際にも主キーに含まれる**すべての**列が外的に変更されないものでないと、厄介なことになります。使える場面としては、

* 多対多対応の中間テーブルについて、両テーブルを参照する主キーの組で複合主キーとする（SQLアンチパターン3章、IDリクワイヤド参照）
* 「登録した年月日（など）」＋「一意な番号など」のような組み合わせ

など、限られたものになるとは思います。

# 例外
郵便番号、ISBNコード、JANコード、市区町村コードのように、誰かがコード体系を構築していることがあります。このような体系を取り入れて使う場合、マスターデータの主キーにはこれらのコードそのものを振るのが適当です。もちろん、内部で参照する場合は（そのコード体系と一対一で対応させたいのでなければ）別に振りなおしても構いません。

# 参考文献

* [SQLアンチパターン](http://www.oreilly.co.jp/books/9784873115894/)

[^1]: 当然ながら、これらはサービスを提供する側では一意なので、そちらのシステムでは使ってもいいかもしれません。
elasticsearch plugin 2.0.0 upgradeメモ

1.6.x => 2.0.0にversion upする上でハマったところをメモっておく

# 注意点

* プラグインディレクトリのrootにplugin-descriptor.propertiesが必要
* jarファイルの重複があると落ちる

# plugin-descriptor.propertiesについて

これを参考にしてください
https://github.com/elastic/elasticsearch/blob/f0252f34e97adc32d58215e59a70f2c7bb41dfc8/dev-tools/src/main/resources/plugin-metadata/plugin-descriptor.properties


# pluginクラス

AbstractPlugin => Plugin に変更

```java
package org.elasticsearch.plugin.example;

import org.elasticsearch.plugins.Plugin;

public class ExamplePlugin extends Plugin {
    @Override public String name() {
        return "example-plugin";
    }

    @Override public String description() {
        return "Example Plugin Description";
    }
}
```

# scorer factoryクラス

needsScoresメソッドの追加

```java

    public final class ExampleScoreFactory implements NativeScriptFactory {

    @Override
    public ExecutableScript newScript(final @Nullable Map<String, Object> params) {
        return new ExampleScorer(params);
    }

    @Override
    public boolean needsScores() {
        return true;
    };
```

## query parser

pluginの登録はこんな感じが正解なよう。

```java

import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.indices.IndicesModule;

public class ExampleQueryParserPlugin extends Plugin {
    public String name() {
        return "example query parser";
    }

    public String description() {
        return "example query parser plugin";
    }

    public void onModule(IndicesModule module){
        module.registerQueryParser(ExampleQueryParser.class);
    }

}
```

## 参考

https://github.com/elastic/elasticsearch/tree/2.0/plugins/jvm-example


続く。。。
USB をオンオフできるだけのスイッチ


![20151007-DSC04490.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/f38df890-e8ab-66ff-c1d8-6e941285205d.jpeg "20151007-DSC04490.jpg")

最近の電子工作便利グッズ紹介。

コネクタを抜き差しする手間が省けるだけなんだけど、地味に便利です。

[エスエスエーサービス [ USB スイッチ付コネクタ ] USB・A(オス)-USB・A(メス) SUAM-SWAF](http://www.amazon.co.jp/%E3%82%A8%E3%82%B9%E3%82%A8%E3%82%B9%E3%82%A8%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E4%BB%98%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF-USB%E3%83%BBA-USB%E3%83%BBA-SUAM-SWAF/dp/B00EH6J9T6/ref=pd_cp_147_1?ie=UTF8&refRID=0CZH1ERE8MHRSH8X000C)
スマホサイトのデバッグについて

#スマホサイトのデバッグについて
ウェブシステムを開発している際に、iPhoneのみでのスタイル崩れが起きました。
ブラウザのユーザーエージェントをiPhoneにしても問題なく、iPhone実機で確認するとスタイルが崩れているというデバッグができない状況に陥りました・・・
Safariのウェブインスペクタを使うと良いという記事を見つけたので、忘れないためにもメモです。

#iPhone
iPhoneの「設定」→「Safari」→「詳細」→「Webインスペクタ」にチェックをし、PCに接続します。
それだけ

#PC
Safariを開き、「環境設定」→「詳細」→「メニュバーに開発メニューを表示」にチェックします。
メニュバーの開発をクリックし、接続したiPhoneの名前をクリックすれば、ウェブインスペクタが表示され、デバッグができます。
MySQL v5.6でSTRICTモードにした時のクエリ挙動差異まとめ

MySQL5.6から、SQL_MODEがSTRICTデフォルト化してたので、クエリ挙動の差異についてまとめた。

# SQL_MODEによる挙動変化
sql_mode=""の状態だと、不適切なデータ値が許可されており、データ入力の際にそれらを有効値に強制変換する仕様がある。
MySQL5.5まではデフォルトがsql_mode=""だったが、MySQL5.6からはデフォルトで勝手にSTRICT_MODEが設定されるようになった。

```ini:my.ini
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
```

# MySQL5.5までSTRICTモードにしなかったんだけど？
`sql_mode=""`で運用してきたシステムを、`sql_mode="STRICT_TRANS_TABLES"`にすると以下に述べるようなクエリは全部エラーになる。
残念ながらALLOW_INVALID_DATES(日付の完全チェックを行わない)はtimestampには意味を成さない。
 
SQL_MODEの確認方法は、`select @@global.sql_mode;`　で出来る。

対策としては、my.iniを以下のように修正するしかない。

```
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql-mode=''
```

オンラインで変更もできる。

```mysql
set sql_mode = "";
```

## １、timstampカラムで、範囲外の時間を指定する

検証テーブル

```mysql
CREATE TABLE eudyptes_test_timestamp (
  timestamp timestamp NOT NULL,
  datetime datetime NOT NULL
) ENGINE=InnoDB;
```

実行クエリ

```
> insert into eudyptes_test_timestamp (timestamp, datetime) values ('1013-01-01 00:00:00', '2013-01-01 00:00:00');
> insert into eudyptes_test_timestamp (timestamp, datetime) values ('2013-01-01 00:00:00', '1013-01-01 00:00:00');
```

```mysql:NOT_STRICT
Query OK, 1 row affected, 1 warning (0.00 sec)
Warning (Code 1264): Out of range value adjusted for column 'timestamp' at row 1
  
Query OK, 1 row affected (0.01 sec)
 
+---------------------+---------------------+
| timestamp           | datetime            |
+---------------------+---------------------+
| 0000-00-00 00:00:00 | 2013-01-01 00:00:00 |
| 2013-01-01 00:00:00 | 1013-01-01 00:00:00 |
+---------------------+---------------------+
```

```mysql:STRICT;
ERROR 1292 (22007): Incorrect datetime value: '1013-01-01 00:00:00' for column 'timestamp' at row 1
Query OK, 1 row affected (0.01 sec)
 
+---------------------+---------------------+
| timestamp           | datetime            |
+---------------------+---------------------+
| 2013-01-01 00:00:00 | 1013-01-01 00:00:00 |
+---------------------+---------------------+
```

timestampはエラーになる。　datetimeは変わらない。

## ２、NOT NULL補完

検証テーブル

```mysql
create table eudyptes_not_nulls (
    `id` int(11) not null,
    `id2` int(11) default null
) ENGINE=InnoDB;
```

実行クエリ

```mysql
insert into eudyptes_not_nulls (id2) values(100);
```

```mysql:NOT_STRICT
Query OK, 1 row affected, 1 warning (0.00 sec)
Warning (Code 1364): Field 'id' doesn't have a default value
 
+----+------+
| id | id2  |
+----+------+
|  0 |  100 |
+----+------+
```
０で補完される。
 
```mysql:STRICT;
ERROR 1364 (HY000): Field 'id' doesn't have a default value
```

## ３、varchar の文字列溢れ
 
検証テーブル

```
create table eudyptes_varchar (text varchar(10));
```

実行クエリ

```
insert eudyptes_varchar (text) values('aaabbccddeeffgghhiijj');
```

```mysql:NOT_STRICT
Query OK, 1 row affected, 1 warning (0.00 sec)
Warning (Code 1265): Data truncated for column 'text' at row 1
 
+------------+
| text       |
+------------+
| aaabbccdde |
+------------+
```

```mysql:STRICT;
set sql_mode = 'STRICT_ALL_TABLES';
ERROR 1406 (22001): Data too long for column 'text' at row 1
```
JavaScript再入門~オブジェクトとメソッド~

#オブジェクトとは
オブジェクトとは配列と同じようにグループ化されたデータです。
配列では値のみがグループされていましたが、オブジェクトでは名前と値のペアがグループ化されています。
PHPでいうところの連想配列に近いものです。
下記のように名前と値のペアを定義します。

```javascript
    var user = {
        name: "Tom", // プロパティ
        mail: "tom@email.com",
        score : 80
    };
```

このそれぞれのペアを**プロパティ**といいます。
また、名前のことを**プロパティ名**といいます。

##オブジェクトにアクセスする

```javascript
    var user = {
        name: "Tom", // プロパティ
        email: "tom@email.com",
        score : 80
    };
    console.log(user["name"]); // 出力「Tom」
    console.log(user.name); // 出力「Tom」

    user.score = 100;
    console.log(user.score); // 出力 100
```
それぞれのプロパティの値にアクセスするには、

- 配列と同じようにuser[]として、添字をプロパティ名に
- 大括弧を使わずに「.」でつなげてプロパティ名を使う

という、２つの方法があります。値の書き換えも可能です。

#メソッドとは
オブジェクトはプロパティの値に関数を持つことも可能です。
その関数のことをオブジェクトのメソッドといいます。

```javascript
    var user = {
        name: "Tom",
        email: "tom@email.com",
        score : 80,
        greet: function(name) { // メソッド
            console.log("hello, " + name + " from " + this.email);
        }
    };
    user.greet("Bob");
    // 出力 「hello, Bob from tom@email.com」
```
例えば上記のようにgreetというプロパティを作って、そこに関数を仕込んでいきます。
すると、引数(Bob)を渡して使うことができます。
メソッド内の「this」は今自分がいるオブジェクトを参照しますので他のプロパティもアクセスすることができます。

参考：http://dotinstall.com/lessons/basic_javascript_v2
deploygateへのデプロイを自動化していく軌跡


タイトルの通り、今後も追記していくタイプの記事です。

## （一歩目）とりあえず初めてみる

### ゴール

コマンドラインで
・ipaファイルを生成
・deploygate上のアプリを更新

### やってみたこと

##### deploygateのコマンドラインツールを導入

```
gem install dgate
```

おわり。簡単。

---


##### ipaコマンドの導入

以下を参考に、ipaコマンドを使えるようにする。
（ipaコマンド：一発でipaファイルをbuildしてくれる優れもの）

[DeployGateが超便利そうだったので使ってみたら感動した](http://blog.morizotter.com/2014/04/05/deploygate/)


* ちょっとハマったとこ


```gem install shenzen```


をやってみたところ。nokogiriのインストールでこける。。。
どうも、インストールには”コツ”がいるらしい(；ﾟДﾟ)
(インストールしようとしてるバージョンによると思いますが)

以下、参考にしたサイト
[Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法](http://qiita.com/t_732_twit/items/a7956a170b1694f7ffc2)

```
gem uninstall nokogiri
brew doctor 
brew update
brew upgrade
brew tap homebrew/dupes
brew install libxml2 libxslt libiconv
brew link --force libxml2
brew link --force libxslt
gem install nokogiri -v '1.6.6.2' -- --use-system-libraries --with-xml2-include=/usr/include/libxml2 --with-xml2-lib=/usr/lib
gem install shenzen
```

インストールされた！わーい

---

#### やってみよう

```
cd path/to/project #ここ適宜書き換えて
ipa build
dgate push (ipaファイル名)
```

Push app file successful!と返って来ればOK!

deploygateのダッシュボードを確認してみる。
プ。。プロビジョニングファイルにUDIDがない。。だと。。。

・
・
・

Xcodeの設定が抜けてた。ふぅー。（BMT。俗に言う、凡ミス太郎ってやつですわ）

![](https://lh3.googleusercontent.com/m5tvOorBchBIE-ULjqMoKzpS-HtUllWr2B6ZHMz2VaWceQJyh0-S63vjKv5At8UJCGz8mEXyqHKWmUx0GbCau0rULrFpELp3htbb47hyB1igplCkm2fs559HA7XJyNHH---XEgrz64zy8ODz6s-OXlTNtLIR85Z_0r2Y9st7Bq9uFxtUys4ihEpUiGmLeclSGOObkkiFkvyb4JhoSRhXzlSjleGugDdERy49Vbkizs-D0im5wdoed-mzeE6IBu3ReDR8g4zjjTwmZM-dmeHrVYOpjSmdr4O1qGOCMKbuwf9Kwqi5bfRFyFZzJrr67Cfh5ONWSSD5yckuvYCwcuVLG5aVjWWQyi9AqFuES39EoTd0WXXPx9nDdEk1vw2-WAzZNdZFTX2lKcoGRp65PeG5RQveOzAghSEjwUJCtqmSSZ8o7qhjdbtNefKYgsnaWJvPQKsXeZVOwjsp3zdi_1cUu5zXR9eB8AFBdpAVh1Y2dpg6SkrCAFN2WHFrTiMAVosyJVt-pwTcC5e52CltCAvTD5jqeYeOTSCiQ-UOhV2dJu0=w1139-h267-no)


最後に、端末で最新版をインストールできることを確認。
出来てた。よかった。

１歩目は、これにて終了。あんまり自動化って感じではないけど、下準備は少しできたかなって感じ。
この後は、開発のフローにもよるんだろうけど、
jenkinsおじさんとつなげたりして、ソース更新後テスト実行以降を自動化出来るのかなと思ってる。やったときに↓の章を更新します。

## （二歩目）今後追記予定

工事中（←死亡フラグ..
iTunesを複数のPCで同期させる方法


iTunes（のコンテンツ）を複数のPCで同期させる方法。

# 概要

先にざっくり概要を書いてしまうと、

1.iTunesはそれぞれのPCに普通にインストールする
2.同期させたいコンテンツ（音楽、動画、App、etc...）をどのPCからでもアクセス出来る場所に置く（クラウドドライブ、USBメモリ、SDカード等）
3.iTunes Library.itlもどのPCからでもアクセス出来る場所に置く（複数のiTunesでも1つのiTunes Library.itlで一元管理する、ということ）
4.各PCからiTunesを起動するときに、上記のライブラリファイルを指定して起動する

でOKです。下記詳細。

# やりかた

## 1.iTunesはそれぞれのPCに普通にインストールする
これはそのまま。
（過去にiTunes自体をクラウドドライブにインストールしちゃえば……と考えたｵﾛｶﾓﾉが居たようだが、正常に動作する方が稀。基本やっちゃいけない。）

## 2.同期させたいコンテンツをどのPCからでもアクセス出来る場所に置く
普通のクラウドドライブの使い方をしていると、Cドライブ内にコンテンツデータが数十GB超……ということになるので、基本的にポータブルメディアが良い気がする。

またこの時のポイントとして**コンテンツデータへのパスを基本全て同じにしなければならない**ので、やっぱりポータブルメディアに入れて、ポータブルメディアのドライブ文字をどのPCでも固定にしてしまうのが一番早いと思う。

## 3.iTunes Library.itlもどのPCからでもアクセス出来る場所に置く
これも結局、コンテンツデータと同じ管理の仕方が良いと思う。

初期は`C:\Program Files\iTunes`？か`C:\Users\ユーザー名\Music\iTunes`？とかその辺にあった気がする。（うろ覚え）
それをコピーして、各PCからアクセス出来る場所へ移動。今後はこのライブラリファイル1つで運用していく。

**コンテンツデータを既存の場所から引っ越しする場合**
ただ何も考えずにコンテンツデータの場所を変えると、パスが古いままでiTunesからリンク切れになってしまうので、ライブラリファイルを再生成する必要あり。
こちらの記事を参考にさせていただきました。
→[iTunesの音楽ファイルのパスをXMLファイルから一括変更する方法](http://tipstour.net/free-soft/6704)

**今まで運用していた既存のデーターベース・ライブラリ・XMLファイルは必ず別ディレクトリにバックアップを取ってください。たぶん泣きます。**

## 4.各PCからiTunesを起動するときに、上記のライブラリファイルを指定して起動する
コンテンツデータ等の引っ越しが終わったら、後はiTunesを起動するだけ。
このとき普通に起動するのではなく、**Shift（MacではOption）を押しながらiTunesを起動する**とライブラリファイルを手動で選択するダイアログが出るので、そこで上記のライブラリファイルを指定してやる。ここがポイント。

一度手動で指定すれば、その後は自動で同じものを読んでくれるみたいです。

## 5.楽しむ
自分が愛してやまないコンテンツたちを楽しむ。

# 動作確認環境

* Win10(64bit)
* Win8.1デスクトップ(64bit) 
* Win8.1ノート(64bit)

で動作確認してるので、大丈夫そう。
自分はMacは持っとらんのですが、同じやり方をした人が出来たと言っていたので、大丈夫そう。
c++ builder XE4, 10.2 Tokyo > 文字列をInt型に変換 > エラー時のdefault値を指定 > int val = StrToIntDef(Edit1->Text, 99);

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

String文字列からInt型への変換。
エラー時のdefault値を指定できるものが何だったか忘れた。
以下のものがあった。

```cpp
int val = StrToIntDef(Edit1->Text, 99);
```

http://docwiki.embarcadero.com/Libraries/XE8/ja/System.SysUtils.StrToIntDef

## 検索用キーワード
- strto
［質問］秀丸　正規表現　N行目だけ改行を増やしたい

表題通りです。

前回も正規表現でご質問させていただいたのですが、SEDなどは環境に入っていないので、出来れば秀丸などのエディタで出来る正規表現であれば助かります。

具体的には毎20行目毎に改行を2つに増やしていきたいのですが…。

もし秀丸では難しくともWin環境で簡単に実現出来そうなものであっても助かります。

よろしくお願いします。
JSを使ってプッシュ通知を配信してみる


[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/about.htm)のJSSDKver2.0を活用してプッシュ通知を送ってみた。

というのも[こちらの記事](http://qiita.com/niftycloud_mb/items/415f29bab43d031493ae)で書かれていたものがSDKのver2.0から利用できなくなったので更新した。

## コードはこんな感じ
HTMLはこんな形

```HTML:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>プッシュ！</title>
    <link href="//code.htmlhifive.com/h5.css" rel="Latest">
    <!-- stylesheet compiled and minified CSS -->
    <link rel="stylesheet" href="bootstrap.min.css">
    <link href="style.css" rel="stylesheet">
    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
  </head>
  <body>
    <div class="container">
      <div class="row marketing">
        <div class="col-lg-12">
      <form role="form">
        <div class="form-group">
          <label for="exampleInputEmail1">メッセージ</label>
          <input type="text" class="form-control" id="message" placeholder="メッセージを入力してください">
        </div>
        <button type="submit" class="btn btn-default submit-button">プッシュ！</button>
      </form>
        </div>
      </div>
      <div class="message">
      </div>
    </div> <!-- /container -->
    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="jquery.min.js"></script>
    <script src="bootstrap.min.js"></script>
    <script src="ncmb.min.js"></script>
    <script src="app.js"></script>
  </body>
</html>
```

jsはこんな感じ

```js:api.js
$(
  function() {
  var client_key = window.prompt("クライアントキーを入力してください", "");
  if (client_key == '') {
    alert("クライアントキーが入力されていませんので利用できません");
    return false;
  }
  //ニフティクラウド mobile backendを初期化しています
  var ncmb = new NCMB("APP_KEY", client_key);
  
  // フォームの送信時のイベントを取得しています
  $("form").on("submit", function(e) {
    var message;
    e.preventDefault();
    message = $("#message").val();

    // ここからがプッシュ作成処理になります

    var push = new ncmb.Push();
    push.set("immediateDeliveryFlag", true)
        .set("message", "Hello, World!")
        .set("target", ["android"])
        .set("searchCondition", {"deviceToken":"Your_deviceToken"});

    push.send()
        .then(function(push){
          // 送信後処理
          })
        .catch(function(err){
          // エラー処理
     });


   });
});
```

今回はWeb画面でやったけど、ラズパイとかでも応用できるので次回はラズパイでやってみよう！
ヘッダの確認ができる簡易WEBサーバーを立ち上げる


80 ポートで起動するWEBサーバーを立ち上げるには、
`sudo python -m SimpleHTTPServer 80`

と書けば一発で立ち上がり、そのディレクトリ上のファイルにアクセスが可能になる。
しかし、これではヘッダを入力した時にデバッグができないため、ヘッダが表示される簡易WEBサーバーにした。

```py:printHeadersHttpServer.py
import SimpleHTTPServer
import SocketServer

class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
	def do_GET(self):
		print(self.headers)
		SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

Handler = ServerHandler
SocketServer.TCPServer(("", 80), Handler).serve_forever()
```

実行し、curlでアクセスする。
`sudo python printHeadersHttpServer.py`
`curl http:localhost/peki.txt`
コンソールに以下のようにヘッダも出力される。デバッグにクソ便利。

```
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: localhost
Accept: */*

localhost.localdomain - - [07/Oct/2015 20:20:15] "GET /peki.txt HTTP/1.1" 200 -
```
Xcode7でのipaの作成shメモ

ジェンキンスを使用するにあたり、shから
ipaを吐き出す必要があったので自分用メモ

```lang:build.sh

PROJ_FILE_DIR="Xcodeのディレクトリパス"
PROJ_FILE_PATH="*.xcodeprojのパス"
INFO_PLIST_PATH="コピーするInfo.plistのパス"
SDK="SDKのバージョン 「xcodebuild -showsdks」で一覧が確認可能 iOS9.0の場合はiphoneos9.0"
TARGET_NAME="ターゲットの名前"
CONFIGURATION="ビルド設定 (Debug, Release など) の指定"
OUT_APP_DIR=".appの出力先" 
PRODUCT_NAME=".appfのファイル名"
OUT_IPA_DIR="ipaの出力先"
IPA_FILE_NAME="ipaのファイル名"


# plistのコピー
cp -f "${INFO_PLIST_PATH}" "${PROJ_FILE_DIR}"

# 念のためのクリーン
# -------------------------
xcodebuild clean -project "${PROJ_FILE_PATH}"

# ビルド
# -------------------------
xcodebuild -project "${PROJ_FILE_PATH}" -sdk "${SDK}" -configuration "${CONFIGURATION}" -target "${TARGET_NAME}" ENABLE_BITCODE="NO" install DSTROOT="${OUT_APP_DIR}"

# ipaの作成
# -------------------------
xcrun -sdk "${SDK}" PackageApplication "${OUT_APP_DIR}/Applications/${PRODUCT_NAME}.app" -o "${OUT_IPA_DIR}/${IPA_FILE_NAME}.ipa"
```

こんな感じで。
plist.infoはATSの問題を回避するためにあらかじめ編集したファイルをコピー
ENABLE_BITCODEをビルド時に"No"に指定

あとはipaを作成するだけ

以上
主キーとして利用するカラム名の指定

create_tableメソッドでテーブルを作るとき、主キーであるidカラムは自動的に追加されるので、ブロックの中で記述する必要はない。
もし、主キーのカラム名をid以外のもの（たとえばmember_id)にしたい場合は、次のようにprimary_keyオプションで指定する。
（今回はmemberモデルで作成。*には作成した日時が入る）

```ruby:*********.create_members.rb
class CreateMembers < ActiveRecord::Migration
  def change
    create_table :members,
    primary_key: "member_id" do |t|

      t.timestamps null: false
    end
  end
end
```

そしてモデルクラスの定義の中で主キーのカラム名を指定する

```ruby:app/models/member.rb
class Member < ActiveRecord::Base
　self.primary_key = "member_id"
end
IOS9対応の問題解決方法まとめ

IOS9に対応した際の問題の解決方法のまとめ


# App Transport Security（ATS） 問題

この問題は以下のサイト様を参考にしました。
http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/
http://mushikago.com/i/?p=6150


IOS9では、webViewやwebサーバー、画像ダウンロード等でHTTP通信ができなくなっています。
解決方法としてはHTTPS通信にすればいいのですが、
さすがに既存のアプリ等で全てをHTTPS通信にするのをコストが高い。
ということでHTTP通信でも大丈夫なようにする設定方法です。
ただし、こちらの方法は公式では**非推奨**となっています。
今後使えなくなる可能性があるのに注意してください。

##解決方法

Info.plistを編集すれば
HTTP通信を許可することができます。

特定のドメインのみを許可したりと細かな設定をすることができますが
自分は今回全てをHTTPを許可しました。

設定方法は簡単で
Info.plistに

**NSAppTransportSecurity (Dictionary)**

を追加し、
追加したNSAppTransportSecurity に

**NSAllowsArbitraryLoads (Bool)**

を追加して値をYESにするだけです。

![スクリーンショット 2015-10-07 19.15.50.png](https://qiita-image-store.s3.amazonaws.com/0/6955/dac0ea40-796f-6b30-0e56-77789e27fe0e.png)

余分なキーは削除してますがこんな感じで追加してください。
これて全てのHTTP通信ができるようになります。


# ENABLE_BITCODE問題
以下の投稿を参考にさせていただきました。
http://qiita.com/Takumi_Mori/items/ace01198c43c8bac6df0

これはライブラリファイル(*.a)を使用した際に発生するようです。
自分はUnity4.xでXcodeを吐き出しビルドした際に発生しました。
Xcodeのビルドした際に以下の様なエラーが出た場合の原因がこれです。

```ld: '/***/***/***.a(***.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)```

BITCODEに関しての詳細は以下の投稿に書かれています。
http://qiita.com/gamako/items/f37dbb05de9d3832ce6b

##解決方法

Build Settingsを編集します。
Build Settingsから検索窓にENABLE_BITCODEと入力してみてください。
そうすると
**Build Options**の中に
**Enable Bitcode**
という項目があるかと思います。
これをNoにしてください。

これで先ほどのエラーが解決されるはずです。
RaspberryPiで脈拍データをCSV出力(アナログ入力確認編)

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

今回はI2C通信で行います
ちなみに環境は
RaspberryPi B (512MB)
OS:raspbian ver1.4.1

#参考URL
http://itkobo-z.jp/wp/archives/490
https://www.abelectronics.co.uk/kb/article/1/i2c--smbus-and-raspbian-wheezy

#配線など
今回使用するAD/DAコンバータはこちら
http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4SCU

これですが、ラズパイB+は大丈夫ですが、BだとGPIOのピンを全部埋めることになってしまう
そうなるとGNDなどがもらえないのでこちらを見ながらソケットを付けました（付けてもらいました）
![Raspberry-Pi-GPIO-pinouts.png](https://qiita-image-store.s3.amazonaws.com/0/76572/4f76a00c-703d-7070-5461-1bd8070aa078.png "Raspberry-Pi-GPIO-pinouts.png")
画像URL:http://raspi.tv/wp-content/uploads/2014/07/Raspberry-Pi-GPIO-pinouts.png

こちらの画像のraspberry pi Bを見ると（もう一つのA/Bとしてありますが、たぶん古いBで256MBのだと思う）ピン番号1番と6番に通電させながらソケットをつけたのが以下です

![DSC_0605.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/4073a320-0b7c-f72c-f417-529e6e8d3793.jpeg "DSC_0605.jpg")
![DSC_0606.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/53ac59de-09cc-08b8-1125-06427e562a66.jpeg "DSC_0606.jpg")

そして今回はアナログの入力をしたいので可変抵抗をつけました
可変抵抗のA0に指す方だけメスピンになっています
![DSC_0607.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/11618f00-ba73-ab5f-66f2-3ac0f2c13424.jpeg "DSC_0607.jpg")

ラズパイに挿したらこんな感じ
![DSC_0608.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/d08eff46-ea8a-777b-9523-68cc72d76e4a.jpeg "DSC_0608.jpg")

こちらのつまみを回したら数値が変化するものをまず目指す

#準備
I2Cを使えるための準備をします
ちなみに言わずもがなsshでラズパイにリモートログインしたほうがコピペでコマンド打てるのでおすすめです
基本、参考URL(英語の方)からのまとめです

まずはconfigファイルなどの編集
[1]

```
$ sudo nano /etc/modules
```

この上のコマンドを実行し

```
i2c-dev
```

この一行を一番下に追記
今回はnanoコマンドで編集をしていきます

[2]

```
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
```

```
#blacklist i2c-bcm2708
```

ブラックリストなんかあるんですね
それの一行をコメントアウトではずすらしいですが、自分のosバージョンは既に何も書いてない状態でした(raspbian ver 1.4.1)

[3]

```
$ sudo nano /boot/config.txt
```

```
dtparam=i2c1=on
dtparam=i2c_arm=on
```

こちらも一番下に追記します

次はツールをインストール
[4]

```
$ sudo apt-get install i2c-tools
$ sudo apt-get install libi2c-dev
```

こちらの二行実行します
そしたら再起動します

```
$ sudo shutdown -r now
```

#実験
ここまでの準備が実験とも言えますが・・・
I2Cのアドレスを確認します

```
$ sudo i2cdetect -y 1
```

![スクリーンショット 2015-10-07 19.42.57_2.png](https://qiita-image-store.s3.amazonaws.com/0/76572/1376972b-77e4-0e33-e3dc-7d599a4ba1d2.png "スクリーンショット 2015-10-07 19.42.57_2.png")


上での写真の通り、ADコンバータを接続するとアドレスが表示される
今回は0x48
次はそのアドレスの値を見ます

```
$ sudo i2cget -y 1 0x48
```

末尾の0x48をそれぞれのアドレスの値に変更してください
すると
![スクリーンショット 2015-10-07 19.46.18_2.png](https://qiita-image-store.s3.amazonaws.com/0/76572/585f1515-4022-904c-5d11-c09913123b6d.png "スクリーンショット 2015-10-07 19.46.18_2.png")

何回か実行したりつまみをひねったりすることで値の更新が見られました
成功です

次回はこれらをpythonで実行します
(次回URL予定)
maven installしたのにIntelliJが認識しないんですけど

- mvn installした
- Librariesにも対象クラス入ってる
- なのにIntelliJでは認識しない

mvnの再ロードすればよい

##mvnの再ロード方法
CTRL+SHIFT+Aから、"Reimport All Maven Projects"

##参考
http://stackoverflow.com/questions/9980869/force-intellij-idea-to-reread-all-maven-dependencies
テキストファイル分割

メモ

```bash
split -行数 <ファイル名> <分割後ファイルのプレフィックス>
```

例

```bash
# 1000行ごとにhoge.txtを分割, hige-aa.txt, hige-ab.txt…
split -1000 hoge.txt hige-
```


windowsでは似たようなコマンドはないっぽいです。
Cygwinで代用。
JSchを使って、sftpでファイルを送信しようとしたらcom.jcraft.jsch.JSchException: UnknownHostKey

jsch.setKnownHosts("path_to_known_hosts")で、フィンガープリントを教えてあげると接続してくれる

```java
public static void main(String args) {
    Session session = null;
    Channel channel = null;
    ChannelSftp channelSftp = null;

        try(InputStream input = fileService.loadFile("filePath") {
            JSch jsch = new JSch();
            
            jsch.addIdentity("key_to_prv_key_path"); // 秘密鍵指定
            jsch.setKnownHosts("~/.ssh/known_hosts"); // ←これ
            session = jsch.getSession(user, hostname, port);

            // このやりかたはなぜかうまくいかなかった
    //                Properties config = new Properties();
    //                config.setProperty("StringHostKeyChecking", "no");
    //                session.setConfig(config);

            session.connect();

            channel = session.openChannel("sftp");
            channel.connect();

            channelSftp = (ChannelSftp) channel;
            channelSftp.put(input, "fileName");
        } finally {
            channelSftp.exit();
            channel.disconnect();
            session.disconnect();
        }
}
```

##参考
- http://stackoverflow.com/questions/14830146/how-to-transfer-a-file-through-sftp-in-java
- - http://stackoverflow.com/questions/2003419/com-jcraft-jsch-jschexception-unknownhostkey
Ubuntuでchkconfigライクにサービスを管理したい


14.04だとchkconfigが入っていないようである。
sysv-rc-confを使う。

```bash
$ sudo apt-get install sysv-rc-conf

$ sudo sysv-rc-conf --list | grep rsync
rsync        0:off      1:off   2:on    3:on    4:on    5:on    6:off

$ sudo sysv-rc-conf --help
Usage:
    sysv-rc-conf [ *options* ]

    sysv-rc-conf --list [ *service* ]

    sysv-rc-conf [ --level *levels* ] *service* <*on|off*>

```
Hexoで始めるお手軽な静的ブログ　-画像投稿とプラグインの追加-

[前回](http://qiita.com/in_silico_/items/7e6ed639c24142bdbd04)の続きです。
画像投稿の方法とブログ感を出すために必要な各種プラグインの導入について書きます。
#画像の投稿方法
Hexoにおいて画像の投稿は若干癖があります。

##記事に画像を添付する場合
``_config.yml``の次の値をtrueに書き換えます。（デフォルト値はfalse）

```
post_asset_folder: true
```

これにより記事作成時に`source/_posts/`下に記事名と同名のディレクトリが作成されるようになります。
このディレクトリに対して添付したい画像を追加します。ここでは``lena.bmp``とします。
``記事名.md``の中で画像を挿入したいところで``{% asset_img lena.bmp 画像のタイトル %}``と記述することで画像の挿入ができます。
画像をリンクにしたいときは``{% asset_link lena.bmp 画像のタイトル %}``と記述することで可能になります。
画像のタイトルを省略すると画像ファイル名がそのまま出力されてしまうのでご注意願います。

なおこの方法では画像のスケーリングができないので、今後のプラグイン拡充に期待です。
これらの詳細については[公式リファランスを参照](https://hexo.io/docs/tag-plugins.html#Include_Assets-)願います。

##markdown記法による画像の挿入
markdownに対応しているので``![レナ](lena.bmp)``と記述することで画像が挿入できるのですが…
仕様上URLルートから参照することになってしまうため、この記述だと``http://example.com/lena.bmp``を見ているのと同義になります。
以前のHexo 2.x系ならば解決できるプラグイン``hexo-tag-asset-res``があったのですが、現在のHexoに対して対応していません。
なおここで``{% post_path 記事名 %}/``による補完が可能かどうかを調べましたがパースがおかしくなるため正しく動作しません。

##imgタグの挿入
[公式の画像タグ](https://hexo.io/docs/tag-plugins.html#Image)による画像挿入はうまく動作しません。
またassetディレクトリを参照する方法もうまくできません。
そのためかなりアレゲですがmarkdownの中でHTMLのimgを挿入することでお茶を濁す方法があります。
次のように記述するとその個所にasseディレクトリの画像を参照してその個所に画像を挿入できます。

```
<img src="{% post_path 記事名 %}/lena.bmp" />
```

この方法であればスケーリングも可能ですし、その他もろもろのことが可能です。
なおHexoは``{% post_path 記事名 %}``によってリンクを生成するときに絶対パスに変換してくれるので、個別の記事でもインデックスページでも見ることができます。

#各種プラグインの導入
##RSS
``npm install hexo-generator-feed --save``を実行することでRSSが出力される様になります。
なお標準設定(フォーマットがatomで出力先がatom.xmlで20件まで)であれば``_config.yml``の編集はいりません。
##Sitemap
hexoは標準ではsitemapを出力する機能が備わっていません。
sitemapを出力するプラグインは２つありますが、まあ人があまり見るものでもないし...ということでSEO向けとされるプラグインを入れることをお勧めします。
``npm install hexo-generator-seo-friendly-sitemap --save``を実行することで``sitemap.xml``が出力される様になります。
``_config.yml``を編集することで出力ファイル名を編集できますが恐らくする必要はないでしょう。
##コメント機能
まあ普通disqusを入れればいいのですが…3.xになってからドキュメントを見る限りその機能が保留状態の様です。（正確に言えばテーマファイルが対応していない）ので今後に期待ということで…

以上になります。
特定のユーザでしかログインできない環境でVimをカスタマイズしたい

チームで1つの開発サーバを共用で使用しており、ユーザも新規作成できず、特定のユーザでしかログインが許されていない環境があるとします。
みんな同じユーザを使うから、`.vimrc`も勝手にいじれない。でも素のVimは使いたくないので、カスタマイズしたい。そういう時の方法です。
Linuxサーバで、シェルはbashとします。

# 作業ディレクトリを作成
みんなのhomeディレクトリを汚すのはよくないので、自分専用のディレクトリを作ります。

```bash
mkdir -p /home/shareduser/norawork
cd /home/shareduser/norawork
```

# Vim設定ファイルの作成
自分用のVim設定ファイルを作成します。

```bash
vim .vimconf
```

```vim:.vimconf
syntax enable
set number
set ruler
set list
set showmatch
set autoindent
" などなど
```

# alias設定用ファイルの作成
Vim使用時、作成したVim設定ファイルを読み込むようにaliasを設定します。

```bash
vim .bashconf
```

```bash:.bashconf
alias vim='vim -u /home/shareduser/norawork/.vimconf'
```

# 使い方
毎回ログインしたら忘れずに設定ファイルを読み込みます。

```bash
source .bashconf
```

あとはvimを使うだけ。
sshの認証メモ

##sshの公開鍵と秘密鍵
- クライアントで秘密鍵と公開鍵を生成
- sshしたいサーバーに公開鍵を登録しておけばおk
    - http://www.adminweb.jp/web-service/ssh/index4.html
    - http://qiita.com/gotohiro55/items/36a22516de2b381b3c6e

##~/.ssh/known_hostsファイルってなに？
 - 過去にsshで接続した先の情報
 - フィンガープリントとか呼ばれたりもする
 - 同じ公開鍵なのに違う接続先に接続しようとしたりすると警告だしてくれたりする
 - 警告うざいときあるのでそのときの対応
    - http://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938

##sshの度毎回-iで秘密鍵指定するのめんどくさいんだけど
キーチェーンてのに秘密鍵を登録すればいいみたい

```bash
#ssh-agentへ登録する (-KオプションはMacのみ使用できる)
ssh-add -K ~/.ssh/id_rsa
```
- http://qiita.com/iruseira/items/af8550fea92b5c5f7fca
Gitlab の環境設定画面でログインをチェックアウトし、ログインできなくなった時の対処


```shell
$ sudo gitlab-rails console
ApplicationSetting.last.update_attributes(signin_enabled: true)
Loading production environment (Rails 4.1.12)
irb(main):001:0> ApplicationSetting.last.update_attributes(signin_enabled: true)
=> true
irb(main):002:0> exit
$sudo gitlab-ctl restart
```


そんなわけで、rubyのコンソールを実行させて `ApplicationSetting.last.update_attributes(signin_enabled: true)` を実行すればいいみたい。

ハマッタ


see: https://gitlab.com/gitlab-org/omnibus-gitlab/issues/561
2015年4月からの反省byけんけん

#webプログラミングを、続けたい。
勉強をして成績を上げて来年もきたい

#チャレンジしたいこと
かっこいいデザインにしたい

#中間テストの成績
|科目|点数 |
|---|---|
|国語| 55点|
|数学| 52点|　
|英語|　98点|
|理科|　69点|
|社会|　37点|
宮本:４月から今までの反省

#Keep
・Swiftについて、学ぼうと思った
・アプリ開発と教科書の同時並行
・良好な友人関係を保つ

#Problem
・定期テストにおいての成績不良

#Try
・AVSpeech Synthesizerを使用しての、より人間らしい声を作る
・illustratorの扱いにおいて、メンターに勝る物を身につける
・男子校でしかできない事をする
OpenStack HorizonでなぜかMemcachedが使われない場合の対処法

# はじめに
公式ドキュメント通りにHorizonを設定すると、Memcachedがセッション情報の保持のためのKVSとして利用されるはずである。
ただ、現行のドキュメントのままだと、実はMemcachedは利用されてない。

# 現行のドキュメントの問題点
今のドキュメントの手順(Kilo Release)では、以下の通り記載されている。

```
CACHES = {
    'default': {
         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
         'LOCATION': '127.0.0.1:11211',
    }
}
```

この設定を、`/etc/openstack-dashboard/local_settings.py`に記載するのだが(Ubuntuの場合)、実は、`/usr/share/openstack-dashboard/settings.py`に、以下の設定が入っているため、このままではMemcachedは利用されず、ユーザのブラウザのクッキーが使われることになる。

```
$ grep SESSION_ENGINE /usr/share/openstack-dashboard/settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
```

# 解決策
Memcachedを使うためには、以下の通り、`/etc/openstack-dashboard/local_settings.py`の`CACHES`の項目の前に`SESSION_ENGINE`として、Memcachedを使うように設定を入れる必要がある。

```
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache'
    'LOCATION': '127.0.0.1:11211',
}
```

これで、Memcachedがきちんと使われるようになる。

この問題については、以下の通り今日現在(2015/10/07)の公式ドキュメントには記載がないが、開発者用ドキュメントにはきちんと記載がされている。

GitHubにミラーされているマスターブランチ
https://github.com/openstack/openstack-manuals/blob/master/doc/install-guide/source/dashboard-install.rst

開発者用ドキュメント
http://docs.openstack.org/developer/horizon/topics/deployment.html

# 補足
Memcachedが本当に使われているかどうかについては、telnetでMemcachedに入り確認できる。

```
$ telent 127.0.0.1 11211
```

telnetして、`stats items`を実行すれば、以下の通り出力されるはずである。

```
stats items
STAT items:16:number 3
STAT items:16:age 2994
STAT items:16:evicted 0
STAT items:16:evicted_nonzero 0
STAT items:16:evicted_time 0
STAT items:16:outofmemory 0
STAT items:16:tailrepairs 0
STAT items:16:reclaimed 0
STAT items:16:expired_unfetched 0
STAT items:16:evicted_unfetched 0
```

`number`の値が0の場合、Memcachedには何もストアされていないので、Memcached自体が使われていない可能性がある。
Ubuntu14/CentOS6xにtor入れてrelayサーバーにする

## centos

https://www.torproject.org/docs/rpms.html.en
ここを読みながら。

`/etc/yum.repos.d/torproject.repo`というファイルを作って以下の内容を書き込みます。

```/etc/yum.repos.d/torproject.repo
[tor]
name=Tor repo
enabled=1
baseurl=https://deb.torproject.org/torproject.org/rpm/el/6/$basearch/
gpgcheck=1
gpgkey=https://deb.torproject.org/torproject.org/rpm/RPM-GPG-KEY-torproject.org.asc
repo_gpgcheck=1

[tor-source]
name=Tor source repo
enabled=1
autorefresh=0
baseurl=https://deb.torproject.org/torproject.org/rpm/el/6/SRPMS
gpgcheck=1
gpgkey=https://deb.torproject.org/torproject.org/rpm/RPM-GPG-KEY-torproject.org.asc
repo_gpgcheck=1
```

`yum install tor`します。

## ubuntu

`apt-get install tor`します。

## 以後共通

`service tor start` します。

`/etc/tor/torrc` 以下の設定になるよう編集します。

```/etc/tor/torrc
Nickname hogehoge
ORPort 9001
BandwidthRate 20 KB
BandwidthBurst 50 KB
ExitPolicy reject *:*
```

その他 `iptables` などのファイアウォールを設定します。

`service tor restart` します。

https://atlas.torproject.org/
で 自分のNicknameを検索して動いているか確認します。

## 鍵ファイルのバックアップ
* https://www.torproject.org/docs/faq.html.en#UpgradeOrMove

`/var/lib/tor/keys/secret_id_key` 

リレーサーバーのIPなどを移動するときは鍵のバックアップを取っておきましょう

## ログの確認

* https://www.torproject.org/docs/faq.html.en#Logs

`cat /var/log/tor/log`


## 参考
* https://wiki.archlinuxjp.org/index.php/Tor
* https://www.torproject.org/
* https://www.torproject.org/docs/tor-doc-relay.html.en
* https://www.torproject.org/docs/tor-relay-debian.html.en
simplecovの結果を、Pull requestのコメントに貼る


## 動機

せっかくカバレッジのレポートがあるのであれば、それを見やすいようにしたい。
ただし、お金はかけたくない。（Coverallsとかは、privateリポジトリだと金がかかる）

## やったこと

![image](https://qiita-image-store.s3.amazonaws.com/0/8708/05b0f497-2cf3-23f9-eab9-ea03664c6c5e.png)

CircleCI上でカバレッジをとり、Artifactsとして保存、それをGitHubのプルリクにコメントとして載せました。

## 手順

### CircleCIの設定

GitHubのPersonal access tokenを取得し、`GITHUB_ACCESS_TOKEN`というNameで、"Environment variables"に設定しておきます。

### simplecovの設定

CircleCI上で動く場合に、`$CIRCLE_ARTIFACTS/coverage`以下に結果を出力するようにします。

[公式](https://circleci.com/docs/code-coverage)には、spec_helper.rbなどで指定するような記述がありましたが、
今回は別のエンジニアが`.simplecov`で指定していたので、そちらを変更しました。

```
SimpleCov.start 'rails' do
  if ENV['CIRCLE_ARTIFACTS']
    coverage_dir File.join(ENV['CIRCLE_ARTIFACTS'], "coverage")
  else
    coverage_dir 'public/coverage'
  end
end
```

### circle.ymlの設定

コミットに反応し、実際に処理を行います。
simplecovは、test時にカバレッジを出力してくれるので、test.postに該当の処理を行うように設定しました。

```
test:
  post:
    - scripts/comment_cov.sh

```

### スクリプトの作成

実際にGitHubにコメントするスクリプトを配置します。

```sh:comment_cov.sh
#!/usr/bin/env bash

set -eu

echo 'check pull request'

if [ "$CI_PULL_REQUEST" == false ] || [ -z "$CI_PULL_REQUEST" ]; then
  echo 'not pull request.'
  exit 0
fi

echo 'get pull request number'

if [[ $CI_PULL_REQUEST =~ ([0-9]*)$ ]]; then
  PR_NUMBER=${BASH_REMATCH[1]}
else
  echo 'cannot get pull request number. maybe bug.'
  exit 1
fi

echo "pull request number is $PR_NUMBER"

echo 'add comment'

COV_URL="https://circle-artifacts.com/gh/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM/artifacts/0$CIRCLE_ARTIFACTS/coverage/index.html"
PERCENTAGE=`cat $CIRCLE_ARTIFACTS/coverage/.last_run.json | jq '.result.covered_percent'`
COMMENT_BODY="Coverage report\\n$COV_URL\\n$PERCENTAGE%"
POST_BODY="{\"body\": \"$COMMENT_BODY\"}"
curl -XPOST \
  -H "Authorization: token $GITHUB_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$POST_BODY" \
  https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/issues/$PR_NUMBER/comments
```

echoで書いてある通りですが、下記のような処理を行っています。

1. Pull requestかどうかを判断します。  
今回は、簡略のためにPull requestがある場合のみ行っています。
2. Pull requestの番号（Issue番号）を取得します。  
CircleCIのenvironment variableにはそのまま番号を取得できるようなものがなかったので、正規表現でURLから取得しようとしています。
3. 実際にコメントをPOSTします。

## 感想
実際に動かしてみると、リポジトリ内の全てのプルリクに反応してコメントをつけてくるのは、かなりうざい気がしてきました。
CircleCIの結果のように、ステータスで表示することも考えましたが、それだとリンクは付けられるけど、数値が見えづらくなるので微妙だなと。

結論：金があれば、SaaS使いたい。
Twitter4j とりあえず走り書き

とりあえずメモ用に。
今度まとめます。

twitter4jを使ってtwitter stream apiのpublic/sampleを取得するコード。

```
import twitter4j.StallWarning;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.auth.AccessToken;


public final class Twitter4jSample {
	public static void main(String[] args) {
		// Tweetを取得したときの挙動を定義
		StatusListener listener = new StatusListener(){
			public void onStatus(Status status) {
				String text =
						"[id " +
						status.getId() +
						"] " +
						status.getText();
				System.out.println(text);
			}
			public void onDeletionNotice(StatusDeletionNotice arg0) {}
			public void onException(Exception arg0) {}
			public void onTrackLimitationNotice(int arg0) {}
			public void onScrubGeo(long arg0, long arg1) {}
			public void onStallWarning(StallWarning arg0) {}
		};

		// アクセストークン
		String consumer_key = "";
		String consumer_secret = "";
		String access_token = "";
		String secret_token = "";
		AccessToken accessToken = new AccessToken(access_token, secret_token);

		// Twitter Stream用のインスタンスを生成
		TwitterStreamFactory factory = new TwitterStreamFactory();
		TwitterStream twitterStream = factory.getInstance();
		twitterStream.setOAuthConsumer(consumer_key, consumer_secret);
		twitterStream.setOAuthAccessToken(accessToken);
		twitterStream.addListener(listener);

		// Tweet 取得
		twitterStream.sample();
	}


}
```
iOS9でThe resource could not be loaded because the App Transport Security policy requires the use of a secure connection.のエラーが出る場合のメモ

##問題
iOS9にアップデートしたら、cordovaで開発中のアプリで下記のエラーが発生した。

```
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
```

##原因
ATS(App Transport Security)に引っかかりHTTPへのアクセスができなかったのが原因と思われます。

####ATS(App Transport Security)とは
◎参考
><a href="http://techlog.voyagegroup.com/entry/2015/09/04/182843" target="_blank">iOS9 : App Transport Securityの確認方法</a>
>ATS(App Transport Security) とは、iOS9とOS X 10.11から導入されるネットワークセキュリティ対策です。

>基本的には、アプリとサーバーの間のネットワーク接続をSSLにすることを推奨するというもので、デフォルトの設定では、SSLではないネットワーク接続が失敗となります。 （なお、ATSが適用されるのは、iOS9用にビルドした場合のみであり、iOS8以前用にビルドされたアプリをiOS9で実行してもATSは適用されません。）

##解決策
１番簡単な解決策はATSを無効にすることです。
info.plistファイルを変更して対応することができます。

私はcordovaでビルドしたアプリケーションの為、下記にありました。

```
/Users/me/app/platforms/ios/hogehoge/hogehoge-Info.plist
```

info.plistに下記を追加します。
これで全てのサーバーのATSを無効にできます。

```
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
```

全てのサーバーのATSを無効にするのは非推奨です。
そこで、特定のドメインからのアクセスしかない場合は、
下記のように無効にするドメインを指定します。

```

	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>hogehoge.com</key>
			<dict>
				<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
			<key>fugafuga.jp</key>
			<dict>
				<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
		</dict>


```

この設定を追加することで、 指定したドメインからのアクセスはhttpでもエラーになりません。
bundle install を並列実行するとかなり快適になった

CircleCI のログを眺めてたら、便利なオプションを見つけました。
`bundle install` に `--jobs=4` をつけると並列処理してくれるみたいです。（[Bundler v1.5 以上](http://bundler.io/v1.5/whats_new.html)）

```
bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3 
The following gems are missing
 * autodoc (0.5.0)
 * jbuilder (2.3.1)
 * rspec-json_matcher (0.1.5)
Install missing gems with `bundle install`
Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rails-assets.org/..
Fetching version metadata from https://rubygems.org/...
Fetching version metadata from https://rails-assets.org/..
Fetching dependency metadata from https://rubygems.org/..
Fetching dependency metadata from https://rails-assets.org/..
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Fetching gem metadata from https://rails-assets.org/..
Fetching version metadata from https://rails-assets.org/.
Using i18n 0.7.0
Using json 1.8.3
Using rake 10.4.2
Using CFPropertyList 2.3.1
Using minitest 5.7.0
（省略）
```

CPU コア数にあわせて `--jobs` オプションを指定すれば、`bundle install` が遅い問題を解消できて、きっと幸せになれるはず。

## 追記）Mac 上で、CPU コア数をもとに設定する

```
bundle config --global jobs `expr $(sysctl -n hw.ncpu) - 1`
```

上記のコマンドを実行すると

```~/.bundle/config
BUNDLE_JOBS: '3'
```

と設定される。
AppDelegate,UIViewController,UIViewのライフサイクル/iOS/Swift

# AppDelegate.swift

```
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    func applicationWillResignActive(application: UIApplication) {
        print("AppDelegate/WillResignActive/アプリ閉じる前")
    }

    func applicationDidEnterBackground(application: UIApplication) {
        print("AppDelegate/DidEnterBackground/アプリを閉じた時")
    }

    func applicationWillEnterForeground(application: UIApplication) {
        print("AppDelegate/WillEnterForeground/アプリを開く前")
    }

    func applicationDidBecomeActive(application: UIApplication) {
        print("AppDelegate/DidBecomeActive/アプリを開いた時")
    }

    func applicationWillTerminate(application: UIApplication) {
        print("AppDelegate/WillTerminate/アプリ終了時(フリック)")
    }
    
```
# UIViewController
```
 override func viewDidLoad() {
  super.viewDidLoad()
  print("ViewController/viewDidLoad/インスタンス化された直後（初回に一度のみ）")

 }
    
 override func viewWillAppear(animated: Bool) {
  super.viewDidDisappear(animated)
  print("ViewController/viewWillAppear/画面が表示される直前")
 }
    
 override func viewDidAppear(animated: Bool) {
  super.viewDidAppear(animated)
  print("ViewController/viewDidAppear/画面が表示された直後")
 }
    
 override func viewWillDisappear(animated: Bool) {
  super.viewWillDisappear(animated)
  print("ViewController/viewWillDisappear/別の画面に遷移する直前")
 }
    
 override func viewDidDisappear(animated: Bool) {
  super.viewDidDisappear(animated)
  print("ViewController/viewDidDisappear/別の画面に遷移した直後")
 }

 override func didReceiveMemoryWarning() {
  super.didReceiveMemoryWarning()
  print("ViewController/didReceiveMemoryWarning/メモリが足りないので開放される")
 }



```

# UIView

```
override func willMoveToSuperview(newSuperview: UIView?) {
	print("UIView/willMoveToSuperview/新しいSuperviewに対してaddSubviewされる前")
}

override func didMoveToSuperview() {
    print("UIView/didMoveToSuperview/新しいSuperviewにaddSubviewされた時")
}
    
override func willMoveToWindow(newWindow: UIWindow?) {
    print("UIView/willMoveToWindow/新しいWindowに対してaddSubviewされる前")
}

override func didMoveToWindow() {
    print("UIView/didMoveToWindow/新しいWindowに対してaddSubviewされた時")
}

override func didAddSubview(subview: UIView) {
	print("UIView/didAddSubview/自分自身に他のviewがsubviewとして追加されたとき")
}

override func willRemoveSubview(subview: UIView) {
	print("UIView/willRemoveSubview/自分自身のsubviewsから他のviewが取り除かれようとしているとき")
}


```

# android版
https://qiita.com/kayo_h/items/5c76eb124b90feb66c58
はじめてdeploygateでiphone端末にデプロイするまで


deploygateを初めて体験してみたときのメモ。
deploygateのチュートリアルがよく出来ているので、ほぼその通りやると行ける。
（開発ツール→ipaファイルの作成方法　で出てくるpopup）



## AppleIDをXcodeに登録

## 配布用証明書を作成する(Apple Developer)

## AppIDを登録(Apple Developer)

## iphoneデバイスの登録

#### deviceが自動で登録されていない場合(Apple Developer)

・iphoneをPCに接続
・Xcode → ヘルプ → 検索フォームに「devices」 → 接続しているiphoneが表示されているので、そこのidentifierをUUIDとしてAppleDeveloperに登録する

## ProvisioningFileを作成

・NameをAppIDと合わせておかないと自動で認識してくれない（なんか回避方法はありそう）

## Archiveをビルドしてipaファイルをexportする

## deploygateにアップロードする

## 端末で確認する

・deploygateのアプリ画面からメールorQRコード経由でdeploygateをインストール
・deploygateを開くと上記で登録したアプリが表示されているので、インストール


おわり
シェルスクリプトのechoで色を付けるための補助コード

echoで色を付けるための補助コード。
シェルの最初などに挿入して使う。

#コード

```sh:
##########################
# echo内で色を使う初期化 #
##########################
COLOR_CODE_INIT()
{
  ## echoには-eオプションを付ける

  ##この内容は変更しない#########################
  # 制御コード
  readonly C_ST="\e["  # 色開始エスケープ 
  readonly C_EN="\e[m" # 色終了エスケープ
  
  # 文字色／背景色
  readonly C_LETTER="3" # 文字色
  readonly C_BG="4"     # 背景色

  # カラーコード
  readonly C_BLACK="0"   # 黒
  readonly C_RED="1"     # 赤
  readonly C_GREEN="2"   # 緑
  readonly C_YELLOW="3"  # 黄
  readonly C_BLUE="4"    # 青
  readonly C_MAGENTA="5" # マゼンダ
  readonly C_CYAN="6"    # シアン
  readonly C_WHITE="7"   # 白

  # 付加属性
  readonly C_BOLD="1"           # 太字
  readonly C_LOW_INTENSITY="2"  # 弱強調
  readonly C_UNDERLINE="3"      # 下線
  readonly C_BLINK="4"          # 点滅
  readonly C_REVERSE_VIDEO="5"  # 反転
  readonly C_INVISIBLE_TEXT="6" # 非表示
  ###############################################

  # 背景色＋文字色セット
  readonly C_BY="${C_BG}${C_YELLOW}"      # 背景色黄
  readonly C_BRED="${C_BG}${C_RED}"       # 背景色赤
  readonly C_LBLK="${C_LETTER}${C_BLACK}" # 文字色黒
  readonly C_LWHT="${C_LETTER}${C_WHITE}" # 文字色白

  # 実際に使用するカラーコード
  readonly C_FLUO="${C_BY};${C_LBLK}m"       # 蛍光色：背景黄、文字黒(用途：メッセージの注意を惹くための蛍光色)
  readonly C_NUMBER="${C_BY};${C_LBLK}m"     # 番号色：背景黄、文字黒（用途：番号入力の際の番号の色）
  readonly C_CAUTION="${C_BRED};${C_LWHT}m"  # 注意色：背景赤、文字白（用途：重要なことや重要なファイルパスなどの色）
}

# 色を使う
COLOR_CODE_INIT
```

「`# 背景色＋文字色セット`」と「`# 実際に使用するカラーコード`」を編集して使う。

#背景色＋文字色セットの編集
1. セットする左側に文字か背景かのどちらかを書く：`${C_BG}`（背景色）、`${C_LETTER}`（文字色）
2. 右側に指定したい色を書く：`${C_RED}`（赤）
3. 実際に組み合わせた例：`${C_BG}${C_RED}`背景色を赤で表示
4. これを変数にセットしておく：`readonly C_BRED="${C_BG}${C_RED}"`

#実際に使用するカラーコード
先ほどセットした背景色＋文字色を組み合わせて作る
1. 最後に必ず「m」を置く。背景色と文字色を変えたい場合は「;」で区切る：`${C_BY};${C_LBLK}m`
2. 変数にセットする：`readonly C_CAUTION="${C_BRED};${C_LWHT}m"` 

#使用例
- 色を付けたい文字を`${C_ST}`と`${C_EN}`で括る。
- `${C_ST}`の右側に先ほどの「実際に使用するカラーコード」で定義した変数を置く。

以下の例は対話式で番号を選ぶときの番号を黄色の背景色で強調する。
echoで色を指定するときは「echo -e」とする。

```sh:シェル
echo -e "    ${C_ST}${C_NUMBER}1${C_EN}.ほげ："
echo    "      ○○を行う。"
echo
echo -e "    ${C_ST}${C_NUMBER}2${C_EN}.ぴよ："
echo    "      △△を行う。"
echo
echo -e "    ${C_ST}${C_NUMBER}3${C_EN}.ふが："
echo    "      ××を行う"
echo
echo -e "    ${C_ST}${C_NUMBER}q${C_EN}.処理を終わる"
printf "番号を選んでください(1,2,3,q):"
read input
```

```sh:結果
    1.ほげ：
      ○○を行う。

    2.ぴよ：
      △△を行う。

    3.ふが：
      ××を行う

    q.処理を終わる
番号を選んでください(1,2,3,q):
```

※「1.」～「3.」、「q.」の背景色は黄色で表示される。

あまり色を使用しすぎるとチカチカして見辛いので強調する色は2色ぐらいにする。
（Qiitaで文字の背景色とか文字色の変更ってどうやるのかな・・？）