OmniAICreator/Qiita-1.07M huggingface dataset:
[Macユーザー編]Rubyを実際に書いてみよう！~準備編(1)~

# Rubyを実際に書いてみよう!~準備編(1)~
### 全６回（予定）の記事で実際にパソコンでプログラミングを実行してみましょう

### 必要なもの
****
・**パソコン(MacBook)**
・**あなたのやる気**
・**ネットがつながる環境**
以上です！

用意できましたか？？？

では今回のレッスンの流れについて説明していきます

**①テキストエディタのダウンロード**
テキストエディタとは、プログラミング言語を書く際に使用するソフトウェアです。
文章を作成するのにWordやExeleを使用するのと同様にプログラミング言語を書く際はテキストエディタを使用します。
**②パソコンの設定と使用方法**
プログラミングが行いやすいように、パソコンの設定を変更します。
また、パソコン初心者向けにパソコン(Mac)の基本的な操作方法について紹介します。

今回のレッスンでは以上の2点を行なっていきます！

では下記の記事から
[テキストエディタをダウンロードしよう！](http://qiita.com/tech-caddiee/items/fb7a92f77cc3bf45df1f)

また次回更新します
①-1テキストエディタをダウンロードしよう！

## テキストエディタとは
もう一度テキストエディタについて説明します。
WordやExcelのように、文章や文字を編集する際に使用するソフトウェアのことです。
テキストエディタにも多くの種類がありますが、
今回は**SublimeText3**をインストールしたいと思います。
## SublimeText3とは
プログラミング言語の編集に特化したテキストエディタです。
無料で使用でき、多くのプログラマーから非常に支持されています。では実際のダウンロードしていきましょう。

**☆以下の手順に習いSublimeTextをダウンロードしていきましょう**
[SUblime Text ダウンロードサイトへ](http://www.sublimetext.com/3)
このサイトに行くと下記のような画面が現れます
![sublime_text.png](https://qiita-image-store.s3.amazonaws.com/0/189268/c71b13f2-de3a-e7ed-a3a6-ae6343418760.png)

その後アプリケーションフォルダに
SublimeText3を移動させ、クリックしてください

![スクリーンショット 2017-06-30 22.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/189268/3707059a-66ea-c9fe-3285-30f2c49f7454.png)
このような画面が表示されれば**成功**です！

では次にSublimeTextを使いやすくする為カスタマイズしていきます

続きはこちらの記事です
[①-2テキストエディタをダウンロードしよう！](http://qiita.com/tech-caddiee/items/734a50c89595783ded98)
visudo: /etc/sudoers がビジー状態です。後で再試行してください

visudo中にネットワークが切れた。

再度SSHしてvisudoしたら
`visudo: /etc/sudoers がビジー状態です。後で再試行してください`
と言わて編集できない。

psコマンドで出てきたvisudoのプロセスをkillしたら治った。
WordPress 4.7以降でREST APIのレスポンスを加工する（ACFの値も追加可能）

WordPressのREST APIのレスポンス内容を必要な値のみに加工する方法です。
標準でREST APIが使用できるWordPress 4.7以降の話になります。

# やること
記事一覧取得APIのレスポンスを、下記フォーマットに加工する

```json:
[
    {
        "post_id":"記事ID",
        "date":"公開日",
        "title":"タイトル",
        "url":"記事詳細ページのURL"
    },
    {
      ・
      ・
      ・
    }  
]
```

# 環境
WordPress 4.7.*
PHP >= 5.4

# 答え
```php:functions.php
function my_rest_api_format( $response, $post, $request ) {

    // 記事ID取得
    $post_id = $response->data['id'];

    // 公開日時を公開日に変更
    $date = $response->data['date'];
    $ts = strtotime($date);
    $date = date('Y年m月d日',$ts);

    // 記事タイトル（20文字オーバーは三点リーダー）
    $title = wp_trim_words( $response->data['title']['rendered'], 20, '...' );

    // 記事詳細URL
    $url = $response->data['link'];


    // 加工したいフォーマットに整形
    $data_formatted = [
      'post_id' => $post_id,
      'date' => $date,
      'title' => $title,
      'url' => $url,
    ];

    return $data_formatted;
}

add_filter( 'rest_prepare_post', 'my_rest_api_format', 10, 3 );
```
# 解説
### アウトライン

REST APIのレスポンス処理中のフィルターフック **rest_prepare_{$post_type}** を使用します。
デフォルトの投稿データの場合は **rest_prepare_post** になります。

### 引数紹介
*$response*
レスポンスしようとしているデータの1件分が入っています。
レスポンス加工の基本の考え方は下記になります。

- `$response` の中から、必要な値のみ取得する
- 取得した値を、新しいフォーマットに当てはめてレスポンスさせる


*$post_type*
投稿タイプ

*$request*
REST APIを呼び出した時の情報が入っています。
呼び出し方によってレスポンスを変えたい時に使用します。

### return値
このフィルターフックは、レスポンスする記事データ1件に対して1回実行されます。
returnもデータ1件分のデータになりますので注意してください。

# ACFの値をレスポンスに含める
ACFの関数 **get_field** がこのフィルターフック内でも使用できます。
例えば
**my_post_thumbnail**
というACFキー名で、記事にサムネイル画像を保持できるようにしていると仮定します。
REST APIのレスポンスにサムネイル画像のURLを追加するコードは下記になります。

```php:functions.php
function my_rest_api_format( $response, $post, $request ) {

    // 記事ID取得
    $post_id = $response->data['id'];

    // 公開日時を公開日に変更
    $date = $response->data['date'];
    $ts = strtotime($date);
    $date = date('Y年m月d日',$ts);

    // 記事タイトル（20文字オーバーは三点リーダー）
    $title = wp_trim_words( $response->data['title']['rendered'], 20, '...' );

    // 記事詳細URL
    $url = $response->data['link'];

    // サムネイル画像URL
    $thumbnail = get_field('my_post_thumbnail', $post_id);

    // 加工したいフォーマットに整形
    $data_formatted = [
      'post_id' => $post_id,
      'date' => $date,
      'title' => $title,
      'url' => $url,
      'thumbnail' => $thumbnail,
    ];

    return $data_formatted;
}

add_filter( 'rest_prepare_post', 'my_rest_api_format', 10, 3 );
```
【ruby】クイズ　〜Rangeという名の鈍器〜

なんとなく使ってたRange。
よく調べてみたら、仕様が面白かったのでクイズです:hugging_face:
みなさんをRangeのクイズで倒しにきました:rocket::earth_africa:

# 序章〜Rangeのおさらい〜
Rangeクラスは範囲オブジェクトです。

```ruby
(1..3).last(3)  # => [1, 2, 3]
(1...3).last(3)  # => [1, 2]
(1..3).include?(2) # => true
(1.3...3.5).include?(2) # => true
(1..3).size # => 3
(1.3...3.5).size # => 3
("a".."c").last(3) # => ["a","b","c"]
```

# 問題

```ruby
# ①
(1..3).last == (1...3).last # => ?
# ②
(1.3...3.0).size == (1.3...3.1).size # => ?
# ③
("a".."c").size == ("a"..."c").size # => ?
```

:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:
:joy_cat: 
:joy:

# 答え

## ①　last

```ruby
(1..3).last == (1...3).last # => true
```

`last`では、終端の要素を返します。
範囲オブジェクトが終端を含むかどうかは、関係ありません。
[exclude_end?](http://ruby-doc.org/core-2.0.0/Range.html#method-i-exclude_end-3F)で、
末端を含むかどうかのチェックもできます。

```ruby
(1..3).last(3)  # => [1, 2, 3]
(1...3).last(3)  # => [1, 2]
```

## ② 小数のsize
`2==2`になり、trueになります。

```ruby
(1.3...3.0).size == (1.3...3.1).size # => true
```

小数の時、二つの数字の差分を見てsizeが出てるみたい。

```ruby
(1.3...3.0).size # => 2
(1.3...3.1).size # => 2
(1.3...3.3).size # => 2
(1.3...3.4).size # => 3
(1.3..3.3).size # => 3
```

## ③ 文字列 size
文字列の時はsizeが出ません。
なので`nil==nil`でtrueになります。

```ruby
("a".."c").size == ("a"..."c").size # => true
```

```ruby
("a".."c").size # => nil
("a"..."c").size # => nil
```

# Rangeよ、ありがとう。:alien:

楽しい時間でした:rocket::moon:
JXAで標準入出力、エラー、パスワード入力、ログ出力

使用OS: macOS 10.12

標準出力
========================

```js:in-out-example1.js
m = 'stdout: think different'
t = '\n'
u = $.NSUTF8StringEncoding
d = $(m+t).dataUsingEncoding(u)
$.NSFileHandle.fileHandleWithStandardOutput.writeData(d)
```

標準エラー
========================

```js:in-out-example2.js
m = 'stderr: think different'
t = '\n'
u = $.NSUTF8StringEncoding
d = $(m+t).dataUsingEncoding(u)
$.NSFileHandle.fileHandleWithStandardError.writeData(d)
```

コンソール出力
========================

```js:in-out-example3.js
m = 'think different'
$.NSLog(m)
```

標準入力
========================

```js:in-out-example4.js
m = 'stdinput: '
u = $.NSUTF8StringEncoding
d = $(m).dataUsingEncoding(u)
$.NSFileHandle.fileHandleWithStandardOutput.writeData(d)
d = $.NSFileHandle.fileHandleWithStandardInput.availableData
answer = $.NSString.alloc.initWithDataEncoding(d,u).js.slice(0,-1)
console.log(answer)
```

パスワード入力
========================

```js:in-out-example5.js
ObjC.import('unistd')
m = 'getpass: '
answer = $.getpass(m)
console.log(answer)
```
Amon2 セッションの有効期限

Amon2でセッションの有効期限を設定したいと思い、

```perl
$c->session->expire();
```
に引数を渡すのかな？と思ったのですが、上手くいかず。

cpanの[HTTP::Session2::ClientStore2](http://search.cpan.org/~tokuhirom/HTTP-Session2-1.09/lib/HTTP/Session2/ClientStore2.pm)を確認したところ、

```perl:ClientStore2.pm
sub expire {
    my $self = shift;

    # Load original session first.
    $self->load_session();

    # Rebless to expired object.
    bless $self, 'HTTP::Session2::Expired';

    return;
}
```
何も受け取ってない…

ソースを読んでいくうちに、

```perl:Expired.pm
    # Finalize session cookie
    {
        my %cookie = %{$self->session_cookie};
        my $name = delete $cookie{name};
        push @cookies, $name => +{
            %cookie,
            value => '',
            expires => '-1d',
        };
    }
```
```perl:ClientStore2.pm
    # Finalize session cookie
    {
        my %cookie = %{$self->session_cookie};
        my $name = delete $cookie{name};
        my $value = $self->_serialize($self->id, $self->_data);
        push @cookies, $name => +{
            %cookie,
            value => $value,
        };
    }
```

```perl:Base.pm
has session_cookie => (
    is => 'ro',
    lazy => 1,
    default => sub {
        +{
            httponly => 1,
            secure   => 0,
            name     => 'hss_session',
            path     => '/',
        },
    },
    # Need shallow copy
    trigger => sub {
        my $self = shift;
        $self->{session_cookie} = +{%{$self->{session_cookie}}};
    },
);
```

とあるので、ここで設定すれば大丈夫かな？と思い、

```perl:
$self->{session}->session_cookie->{expires} = '+3600s'
```
としたところ、正常にセッションが機能しました。
Swiftで波紋の呼吸

永遠の（プログラマ）生命を求める者が｢[Hello World](http://qiita.com/rotors123/items/fe9a759ef779bc4b474b)」して「[Get Wild](http://qiita.com/rotors123/items/93891d20fae128927b6d)」した場合、最終的に「The World ～時よ止まれ／そして時は動き出す～」に至るのは自然な流れであり、ある種の人間賛歌とも言えるだろう。

しかし思うところあり、そこは敢えて後進に譲るとして、触れないでおきたい。
代わりに今回は実践的な「波紋の呼吸の訓練法」を紹介しよう。

```txt:トレーニングメニュー
- 1秒間に10回の呼吸（10 breaths / 1 sec）
- 1分間息を吸い続け、その後吐き続ける（Continue to breathe / 1 min）
- 最後にグラスのワインを溢さず蛙をメメタァ（me-meta to frogs）
```

基本的には上記エクササイズ（物理）を日々欠かさず行う事が肝要だが、冷静にQiita的な見地に立つと、これが有益な情報であるかどうか、若干の疑問が残る。

そこで今回はとかく忙しい現代人の為に、上記のカリキュラムをSwift（Playgrounds）を用い、同期・非同期を織り交ぜて効果的に同時実行可能なコードを紹介して筆を折りたい。


```swift:HamonTrainingPlayground
//: HamonTrainingPlayground

import UIKit

// 波紋初心者向けとして、手始めに2分間(120s)実施する。
// （最終的には10分間）
let executionTime = 120

let op1 = BlockOperation {
    let s = 1
    Thread.current.name = "1秒間に\(s)回の呼吸"
    
    for i in 0 ..< executionTime / s {
        print(Thread.current.description + ": \(i + 1)回目")
        Thread.sleep(forTimeInterval: 1 / Double(s))
    }
}
let op2 = BlockOperation {
    let m = 1, s = m * 60
    Thread.current.name = "\(m)分間息を吸い続け、その後吐き続ける"
    for i in 0 ..< executionTime / s {
        print(Thread.current.description + ": \(i + 1)回目")
        Thread.sleep(forTimeInterval: Double(s))
    }
}

let op3 = BlockOperation {
    Thread.current.name = "グラスのワインを溢さず蛙をメメタァ"
    print(Thread.current.description)
}

op3.addDependency(op1)
op3.addDependency(op2)

let queue = OperationQueue()

queue.addOperation(op1)
queue.addOperation(op2)
queue.addOperation(op3)

queue.waitUntilAllOperationsAreFinished()
```

### 実行結果

```txt:実行例（抜粋）
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 1回目
<NSThread: 0x600000267880>{number = 5, name = 1分間息を吸い続け、その後吐き続ける}: 1回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 2回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 3回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 4回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 5回目
// 中略
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 55回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 56回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 57回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 58回目
<NSThread: 0x600000267880>{number = 5, name = 1分間息を吸い続け、その後吐き続ける}: 2回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 59回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 60回目
// 中略
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 115回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 116回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 117回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 118回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 119回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 120回目
<NSThread: 0x608000270b40>{number = 6, name = グラスのワインを溢さず蛙をメメタァ}
```

### バージョン情報

Swift：3.1
Xcode：8.３.3 (Swift Playgrounds)

### ソースコード

https://github.com/rotors123/HamonTraining.git
ユーザ入力で2次元リスト(内包表記)を作成する。

#入力
6　　　　#以下の入力件数6件
3 5 9
15 20 35
30 45 72
15 20 31
27 33 59
27 35 77
#出力
[[3, 5, 9], [15, 20, 35], [30, 45, 72], [15, 20, 31], [27, 33, 59], [27, 35, 77]]
#プログラム
N = int(input())
medal = [[int(i) for i in input().split()] for i in range(N)]
print(medal)
Alamofire4でSSLエラーを無視し、自己証明書のサーバにリクエストする

Alamofire4のサンプルが見つからなかったので紹介させて頂きます。
このようなクラスを用意して対応しました。

```swift
import Alamofire

struct WebAPI {
    static let sessionManager: SessionManager = {
        switch MyEnvironment.server {
        case .development:
            return Alamofire.SessionManager(
                serverTrustPolicyManager: ServerTrustPolicyManagerForDevelop()
            )
        case .staging, .production:
            return Alamofire.SessionManager()
        }
    }()
    
    private class ServerTrustPolicyManagerForDevelop: ServerTrustPolicyManager {
        
        init() {
            super.init(policies: [:])
        }
        
        override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
            return .disableEvaluation
        }
    }

}
```
position:stickyのpolyfillの内部実装を調べてみた

サイト改修の中で**position:stickyのpolyfill**を使用する機会がありました。
今回は**polyfillの内部実装と利用する際に注意すべきこと**を紹介したいと思います。

#position:stickyとは

まず始めにposition: stickyの簡単な紹介から。

position: stickyは、画面からスクロールアウトする際に、画面の上下左右、指定した位置で要素の固定し、スクロールに追従してくるような配置を可能にするcssの記述です。

下記の場合、.sampleの要素が画面に現れたら、topが0の位置で追従します。

```css
.sample {
  position: sticky;
  top: 0px;
}
```

このcssを用いるとサイドバーとを特定の位置までスクロールさせたら追従させたり、スクロールが発生するtableの組んだ時に、thのみ追従させることが可能になり便利です。

##position:stickyのサポート状況
上記で紹介したとおり、position:stickyは今までjsを使わないと再現できなかったことを簡単に実現できる便利なcssですが、**利用できるブラウザが限られているのが残念**なところ。

[http://caniuse.com](http://caniuse.com/#search=sticky)でサポート状況を調べてみるとIEは11まで対応不可となっており、PCサイトでの実装には単純には使えないことがわかります。

![2017-06-29_180757.png](https://qiita-image-store.s3.amazonaws.com/0/146968/7e1e6ffc-4862-a703-389f-dbc7efd7558e.png)

##position:stickyのpolyfillを使ってみた
position:stickyはブラウザ間をサイトにそのまま利用することは難しいです。
しかし、こんな時に便利なのが**polyfill**です。

polyfillは、 モダンブラウザで出来て、レガシーブラウザで出来ない機能を、既存の技術で補い、同等のものを提供するという手法のこと。

position:stickyのpolyifillは、様々なソースが公開されており、今回は下記2つのpolyifillを試してみました。

- [http://wd.dizaina.net/en/scripts/stickyfill/](http://wd.dizaina.net/en/scripts/stickyfill/)
- [http://philipwalton.github.io/polyfill/demos/position-sticky/](http://philipwalton.github.io/polyfill/demos/position-sticky/)

##position:stickyのpolyifillの内部実装について
結論ですが、position: stickyのpolyifillには大きく2つの実装方法がありました。

###パターン①：特定のスクロール範囲内のみposition: fixedに変更
1つ目のパターンは、position: stickyが指定された要素が任意の場所までスクロールされるとposition: fixedを当て、追従させる方法。
- [http://wd.dizaina.net/en/scripts/stickyfill/](http://wd.dizaina.net/en/scripts/stickyfill/)


####特徴
- シンプルにposition:stickyを再現している。
- 下記のようなbottomやleftなどで要素を固定することはできない。

```css
.div {
  position: sticky;
  bottom: 150px;
}
```

```css
.div {
  position: sticky;
  left: 150px;
}
```

###パターン②：position: stickyを指定した要素を複製し、表示
2つ目のパターンは、position: stickyが指定された要素が任意の場所までスクロールすると要素を複製し、追従しているように見せる方法。
オリジナルの要素を非表示にし、複製された要素にposition: fixedをつけて追従を実現しています。
- [http://philipwalton.github.io/polyfill/demos/position-sticky/](http://philipwalton.github.io/polyfill/demos/position-sticky/)

####特徴

- 追従時には複製された要素が表示されているので、#position: stickyを指定した要素に対-してイベント登録を行いたい場合などは注意が必要。
- パターン①同様にbottomやleftなどで要素を固定することはできない。

##まとめ
position:stickyのpolyfillの内部実装について紹介しました。

シンプルな使い道であれば特に内部実装を気にする必要はないと思います。

しかし、**position: stickyをあてた要素にjsでさらに動きを加えたりする場合は、内部実装を知っておく必要が出てくる**と思うので、参考にしていただければ幸いです。
VirtualBox にCentOS 5.1インストールするよ

##はじめに

Varying Vagrant Vagrantsの場合、Vagrantで稼働するWordPress環境が自動で構築されて
めっちゃ便利なんですが、本番環境に合わせてローカル環境も作らないといけなくなったので
VirtualBoxの使い方を覚えると言う意味も含め　**CentOS 5.1** をインストールしました

##CentOS 5.1 インストールファイルの準備
CentOS 5.1　ってちょっと古いので
ダウンロード先がアーカイブされていました（ｗ
http://vault.centos.org/notonvault.html

./5.1/isos/x86_64/CentOS-5.1-x86_64-bin-1of7.iso
./5.1/isos/x86_64/CentOS-5.1-x86_64-bin-2of7.iso
./5.1/isos/x86_64/CentOS-5.1-x86_64-bin-3of7.iso
./5.1/isos/x86_64/CentOS-5.1-x86_64-bin-4of7.iso
./5.1/isos/x86_64/CentOS-5.1-x86_64-bin-5of7.iso
./5.1/isos/x86_64/CentOS-5.1-x86_64-bin-6of7.iso
./5.1/isos/x86_64/CentOS-5.1-x86_64-bin-7of7.iso

##VirtualBoxに新規VM追加

###▼VirtualBoxの新規VM追加時の参考サイト
http://itemy.net/?p=1218

参考サイトはCentOS 6.8でファイルがひとつだったようなのですが
昔みたいにDISK分かれてるタイプだったので
最初はストレージのところに **CentOS-5.1-x86_64-bin-1of7.iso** を指定して起動！

###▼CentOS 5.1 インストール時の参考サイト
http://rina.jpn.ph/~rance/linux/centos/centos51_install.html

ポチポチしてインストールが開始されると
「DISK2入れてね」っていうメッセージが出るので
VirtualBoxのメニューのVMの設定を開き
ストレージ→コントローラIDE→光学ドライブの右のCDアイコンから
**CentOS-5.1-x86_64-bin-2of7.iso** 入れてVM内に戻ってOK！
っていうのをインストール完了するまで続けます
（※DISK入れ替えは5までだったと思います（うる覚え））

再起動を促されるので、最後はコントローラIDEを空にして再起動ポチって終わり★
あとはログインして初期設定したらCentOSのインストール完了です

##次は
- Apache
- MySQL
- WordPress
をひとつづつ入れていこうと思います！
Firebase Analytics DebugView の設定の仕方

```
This is an article about Firebase Analytics Debugging.
If you don't read Japanese I think you can recognize how to setting the DebugView Report with some images.
```

Firebase Analyticsの仕様として以下のような物があるため、検証時にはデバッグモードでデバッギングを行うのが良いと。

>一般的に、アプリによってロギングされるイベントは、約 1 時間の周期でバッチ処理され、まとめてアップロードされます。このアプローチにより、エンドユーザーの端末のバッテリーが節約され、ネットワーク データの使用量が削減されます。

なかなかFirebase Analyticsのコンソールに、送ってるはずのカスタムイベントが届かないなぁ（STREAM VIEWでも）と思っていたら、こんな仕様があったんですね。

確かに、バッテリーの持ちの良さみたいなものは、モバイルのアプリのユーザビリティの重要な項目だよなぁと。さすがFirebaseはよく考えてるなぁと思いました。

https://firebase.google.com/docs/analytics/debugview?hl=ja

# iOS
```
-FIRAnalyticsDebugEnabled
```

iOSのFirebase Analyticsをデバッグモードにするには、上記のコードをXcodeのコマンドライン引数に指定してあげる。

画像はRunを指定してるけど、それぞれ引数を渡したいところに設定してあげてね。

![Screen_Shot_2017-06-30_at_19_34_21.png](https://qiita-image-store.s3.amazonaws.com/0/103745/b9b5c39a-22b6-ce8d-364a-9ee32736610e.png)

![Screen_Shot_2017-06-30_at_19_38_35.png](https://qiita-image-store.s3.amazonaws.com/0/103745/6615cdd8-bf71-e664-4cd4-f2486badb47b.png)

# Android
```
adb shell setprop debug.firebase.analytics.app <package_name>
```

Androidの場合は、このように指定してあげるだけ。
You just execute this command. That's it!

<package_name> のところは io.thedott.debuggingtestappのように指定するよ！

<img width="1364" alt="Screen Shot 2017-06-30 at 19.41.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/103745/a2580c01-69f7-4e21-6823-f6691777a077.png">

<img width="1387" alt="Screen Shot 2017-06-30 at 19.51.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/103745/f4527981-83f9-c7de-41a1-16c053b4c55e.png">

やったね！
spring / herokuでError R10 (Boot timeout)が出た時

# 概要
* springbootアプリをheroku-container-registyでデプロイした時に以下のエラーが出た   

```
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
```

# 対応
* まぁエラーの通りなんですが。。。   
herokuによって提供されるポートを使うようにしましょう。
* こんな感じになるでしょうか

```Dockerfile
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
# Expose is NOT supported by Heroku
# EXPOSE 8080
ADD hogehoge.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
CMD [ "sh", "-c", "java $JAVA_OPTS -Dserver.port=$PORT -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
```
# 参考
* http://nicholaspaulsmith.com/spring-boot-on-heroku/
MATLABでNNを作る話の備忘録　その１

#無とは
無については、[こちら](http://qiita.com/Ishotihadus/items/c2f864c0cde3d17b7efb)。
本編とは正直そんなに関係もない。
今回は無Keras第１回でやっている簡単な２値分類問題をMATLABで実装していこうと思っている。

##概要
この度必要にかられてMATLABでニューラルネットワーク（NN)を作る事になったので、以前自分がKerasを勉強した時に見た「無から〜」シリーズを参考にしながら、備忘録としてまとめていきたい。

自分用の備忘録だから、冒頭みたいな遊びを入れる意味は特にないと言っていい。

##なぜMATLABか
諸般の事情によるものです。MATLABの経験はありません。
以前はPythonでNNを書いたり上記のようにKerasを触ってみたりしていました。
あと僕は情報系じゃないしコーディング力も低いので、コードがクソとかそういうのは許してほしいと思っている。備忘録なので。

##参考にしたもの
- [Crab Classification](https://jp.mathworks.com/help/nnet/examples/crab-classification.html)：MATLABのExample。カニの雌雄を判別する問題らしい（？）
- [無から始めるKeras 第1回](http://qiita.com/Ishotihadus/items/c2f864c0cde3d17b7efb)：前述の通り、ここでやっている適当な２値分類問題を取り上げます。

#準備
##必要なもの
MATLABと、Neural Network Toolboxが必要です。

##今回の問題
今回やるのは、

> 適当な5次元の配列を入力したら、その和が2.5より大きいときに1と教えてくれるニューラルネットを作ろうという話。

という話。
ぶっちゃけ、カニ雌雄判別問題とほとんど同じである。
練習を兼ねて、データセットをランダムに生成するところからやってみた、って話。

##データ生成
まずrand関数で5*250の行列を生成する。
次に各データの５個の要素の和が2.5より小さいか、2.5以上かでラベリングをする。2.5より小さいなら(1,0)、2.5以上なら(0,1)になる。

```matlab
%%データ生成
%5*250のデータ行列を生成
data = rand(5,250);
%2*250のラベル配列を生成。
label = [sum(data)<2.5 ; sum(data)>=2.5];
```

特にラベル付の方はもっといいやり方ありそうだな…。

#ニューラルネットワークを生成する

```matlab
%%ニューラルネットを作る
%重み行列の初期値を生成するための乱数は固定になっている
setdemorandstream(491218382)
net = patternnet(20);
view(net)
```

patternnetというクラスを使う。「Pattern Recognition Neural Network」と説明には書いてある。生成されるのは、２層（隠れ層が１層）のNNで、出力層の活性化関数はsoftmax関数かな？　隠れ層の活性化関数が何なのかわからないけど、viewを使って表示させてみると非線形関数の形っぽいのが書いてある。
中身がなんにもわからないものを使うのはどうなんだって感じだけど、今回はとにかくNNを走らせることが目標なので。
patternnetの引数で与えたのは隠れ層のノード数。他にtrainFcn、つまりどういうふうに誤差を最小化していくかのアルゴリズムを選べるっぽい。

実際に積み上げて層を作るのは[ここ](https://jp.mathworks.com/help/nnet/examples/create-simple-deep-learning-network-for-classification.html)に書いてある気がするので今度勉強します。

viewを使うとネットワークの構造が可視化される。各層の下の数字はノード数だが、見てわかるように入出力のノード数は0になっている。
これは訓練時にデータを与えてやると勝手に判別してくれる。すごーい！


#訓練する
```matlab
%%訓練する
%訓練データから勝手に入出力を読んでくれる
[net,tr] = train(net,data,label);
nntraintool
plotperform(tr)
```
trainを使うと、データを訓練用、交差検定用（？）、テスト用に分けてくれる。trには訓練過程が保存されるっぽい？

#テストする
```matlab
test_data = data(:,tr.testInd);
test_label= label(:,tr.testInd);
test_result = net(test_data);
testIndices = vec2ind(test_result)

plotconfusion(test_label,test_result)

[c,cm] = confusion(test_label,test_result)

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));
fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);
```
netにデータを与えてやると、ネットワークを通した後の出力を返してくれる。vec2indは、one-hotなベクトルをラベルになおしてくれる。
confusion関数は、正解と出力を比較して、confusion matrixを出力してくれる。cは誤り率。

自分が実行したときの実行結果は、こんな感じ。

```
cm =

    17     0
     1    20

Percentage Correct Classification   : 97.368421%
Percentage Incorrect Classification : 2.631579%
```

正解率97%。めっちゃ正解するNN。

#まとめ
なんとか２値分類をするNNをMATLABで動かすことができた。今回はあくまで動かすのが目的だったので、これでよしとする。
次は自分でNNを組みたい。フルスクラッチではないが、中身の分からないネットワークを使うのもいかがなものかって感じがするので。

疲れた。
FileAPI と jQuery でテキストファイルを読み込んで表示

参考にしたページ
[HTML5 / JavaScript でテキストファイルを読み込んで表示](http://qiita.com/junya/items/6b7ef4a2184e1f743420)

![fileapi_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1a9f0aa5-e4f1-2657-b83b-6ae024e6ea21.png)



```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="fileapi.js"></script> 
<title>テキストファイルの読み込み</title>
</head>
<body>
<h1>File API</h2>
<input type="file" id="getfile" accept="text/*">
<p />

<pre id="preview" ></pre>

<hr />
<div id="outarea_aa">outarea_aa</div>
<div id="outarea_bb">outarea_bb</div>
<div id="outarea_cc">outarea_cc</div>
<div id="outarea_dd">outarea_dd</div>
<div id="outarea_ee">outarea_ee</div>
<div id="outarea_ff">outarea_ff</div>
<div id="outarea_gg">outarea_gg</div>
<div id="outarea_hh">outarea_hh</div>
<hr />
<p>Dec/05/2021</p>
</body>
</html>
```

```js:fileapi.js
// -------------------------------------------------------------------
//	fileapi.js
//
//					Jun/30/2017
// -------------------------------------------------------------------
jQuery (function ()
{
	jQuery("#outarea_aa").text ("*** fileapi.js *** 開始 ***")

	var file = jQuery('#getfile')[0]

	change_monitor (file)

	jQuery("#outarea_hh").text ("*** fileapi.js *** 終了 ***")

})

// -------------------------------------------------------------------
function change_monitor (file)
{
	file.onchange = function ()
	{
	const fileList = file.files
	var reader = new FileReader()
	reader.readAsText(fileList[0])

	reader.onload = function ()
		{
		jQuery('#preview').text(reader.result)
		}
	}

}

// -------------------------------------------------------------------
```

jquery-3.6.0.min.js で動作を確認しました。
Ansible | ssh のキャッシュを無効にする


```:~/.ansible.cfg
[ssh_connection]
ssh_args = -o ControlMaster=no
```

この設定をしておかないと、
**失敗するようにインベントリファイルを書換えたのに、何故かsshコネクションが成功する** という、謎の事態が生じる場合があった。

# 例

- パスワード入力が必要なサーバーに対して、パスワード指定を消してアクセスしたのに、うまく接続できてしまう。
- 手元から known_hosts ファイルを消したのに、認証の質問なしで、うまく接続できてしまう。

など。

# ファイル設場所

いずれかの場所に置く。

- `.ansible.cfg` (カレントディレクトリに設定する場合)
- `~/.ansible.cfg` (ユーザーディレクトリに設定する場合)
- `/etc/ansible/ansible.cfg` (システムに設定する場合)

# 環境

- ansible 1.9.6
- Mac OS Sierra 10.12.4

# 参考

- [ansible is caching connections? · Issue #12006 · ansible/ansible](https://github.com/ansible/ansible/issues/12006)
- [Configuration file — Ansible Documentation](http://docs.ansible.com/ansible/intro_configuration.html)
- [Display Ansible configuration from command line - Stack Overflow](https://stackoverflow.com/questions/32392448/display-ansible-configuration-from-command-line)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
本日のメモ

対策っていっぱいあるね

<h1>schema.org</h1>

schema.orgって何よ
>schema.org は、ウェブ上でデータを記述する共通のボキャブラリを作成してウェブを改善するための、Google、Microsoft、Yahoo! による共同の取り組みです。

Google Search Consoleヘルプより引用

>つまり、構造化データをマークアップするための語彙を定義し、この利用を勧めることで検索結果をより使いやすいものに改善していこうとする取り組みです。Web制作者は、schema.orgで定義されたボキャブラリを決められたルールに従って記述することで、検索エンジンにサイトのコンテンツデータを伝えることができます。
Google、Bing、Yahoo!の大手三社が共同で開発に取り組んでいるので、各検索エンジンに共通のタグセットを用いてマークアップすることができる、現在最も主流のボキャブラリと考えてよいでしょう。
>http://www.dream-net.org/blog/?p=3158&

<h1>インデックス登録</h1>
~~インテックス~~インデックス登録の数がいきなり上がった・・。

謎だけど、ちょっと安心。
他ページもFetch as Googleでクロールしにきてね！とリクエスト送信。
いつ頃に反映されるかな・・。
LaravelのPaginatorに入っているアイテムをいじる

# 環境

Larave 5.1

# やったこと

LaravelのPaginator（`Illuminate\Pagination\LengthAwarePaginator`）で、取得した後に中に入っている `item` をこそっと追加したり、書き換えたいときがある。

例えば、ユーザー一覧を取得した後に、特定のユーザーのみ上に追加したい、など。

下記のように実現できる。


```php
<?php

$user = User::paginate(20);
$user->getCollection()->push(User::find(123));
```

`getCollection()` で内部の `Collection` が取れるので、そこに対してメソッドを実行すれば良い。

# 補足

`shuffle` や `filter` や `map` など、新しいコレクションを返す関数は効果が無い。
`splice` や `transform` などであればOK。

また、IN句を使ってDBから取り直したり、コレクションから `Illuminate\Pagination\LengthAwarePaginator::make()` する方法もありますが、性能が悪かったり面倒なので却下。

`Illuminate\Pagination\LengthAwarePaginator::item` はプライベート変数なので変更できない。
RとVBAでXBRLのデータを触った

ゼミの後輩が内部統制のことを研究テーマとした。
そのため、XBRLの内部統制報告書をダウンロードしてあげた。
ダウンロードはＲで実施した。
以下コードを提示する

```
library(XML)
library(RCurl)
codelist<-read.csv("Book1.csv",header=FALSE)
for (it in 1:nrow(codelist)){
  namelistitem <-codelist[it,1]
  QueryURL<-paste("http://resource.ufocatch.com/atom/edinetx/query/", namelistitem,sep = "")
  objQuery<-getURL(QueryURL)
  objXML<-xmlParse(objQuery,encoding="utf-8")
  objXML.namespaces <- xmlNamespaceDefinitions(objXML,simplify=TRUE)
  names(objXML.namespaces)[ names(objXML.namespaces)=="" ] <- "default"
  nodes.entry <- getNodeSet(objXML,"//default:entry",namespaces=objXML.namespaces)
  for(node in nodes.entry){ # <entry>タグをひとつずつ処理
    lst.temp <- list()
    # 提出書類のタイトルを取得→要素ノード：title の内容を取得
    title.value <- xpathSApply(node,path="default:title",fun=xmlValue,namespaces=objXML.namespaces)
    # 提出書類のタイトルに「内部統制報告書」を含むか否かを判定
    title.split<-unlist(strsplit(title.value, " "))[2]
    title.split2<-unlist(strsplit(title.split,""))[1]
    if( title.split2=="内"){
      htmlurl <- xpathSApply(node,path="default:link[@type='text/html']/@href",namespaces=objXML.namespaces)
      htmlstringlist<-unlist(strsplit(htmlurl,"_")) 
      download.file(htmlurl[1],destfile = paste(namelistitem,htmlstringlist[5],"header",".html"),quiet = TRUE)
      download.file(htmlurl[2],destfile = paste(namelistitem,htmlstringlist[5],"houbun",".html"),quiet = TRUE)    
      print(title.value)      
    }
  }
  it=it+1
}

```


内容の抽出はVBAでやった。
以下コードを提示する

```
Public Sub sample1()
    Dim XMLDocument As MSXML2.DOMDocument
    Dim xmlDate As IXMLDOMNode
    Dim xmlCustomer As IXMLDOMNode
    Dim xmlDataNode As IXMLDOMNode
    Dim i As Long
    Dim htmlname As String
For i = 1 To 12558
htmlname = Cells(i, 1).Value
On Error GoTo ERROR_

    'MSXMLオブジェクトを生成し、xmlファイルをロード
    Set XMLDocument = New MSXML2.DOMDocument
    XMLDocument.async = False
    XMLDocument.Load (htmlname)
    If (XMLDocument.parseError.ErrorCode <> 0) Then 'ロード失敗
        Debug.Print XMLDocument.parseError.reason   'エラー内容を出力
        GoTo ERROR_
    End If



    '<DATA>ノードデータを取得
    Set xmlDataNode = XMLDocument.SelectSingleNode("//body")

    '<DATA>ノードの子要素をループで抽出
    Dim Node As IXMLDOMNode
    For Each Node In xmlDataNode.ChildNodes
        For nlen = 0 To Node.ChildNodes.Length - 1
            Cells(i, nlen + 4) = Node.ChildNodes(nlen).Text
        Next
    Next

ERROR_:

    '各オブジェクトの開放
    If Not XMLDocument Is Nothing Then Set XMLDocument = Nothing
    If Not xmlDate Is Nothing Then Set xmlDate = Nothing
    If Not xmlCustomer Is Nothing Then Set xmlCustomer = Nothing
    If Not xmlDataNode Is Nothing Then Set xmlDataNode = Nothing

Next
End Sub
```

参考になったＵＲＬは後ほど追加する。
[SAP] SAP超初心者メモ

「SAPって、Oracleに買収されたんじゃないっけ？」
「SAPって、ドイツの会社なんだー」
という程度の知識しか持たない人間が、JavaからSAPへアクセスすることを目標に集めた情報のメモです。

間違い多々あるかと思いますので、ご指摘いただけると助かります。


# 「SAP」の読み方

http://www.sapknowledge.net/ より

> 正式な読み方は「エスエイピー」ですが、一般には「サップ」と呼ばれることの方が多いようです。SAPはSystemanalyse und Programmentwicklung（システム分析とプログラム開発）の略です。




# リンク集

- [SAP Help Portal](https://help.sap.com/viewer/index) リファレンスかな？
- [SAP Community](https://www.sap.com/community.html) 調べもの用
- [BAPIプログラミングガイドリファレンス](https://help.sap.com/erp2005_ehp_06/helpdata/ja/c2/4809c79bc611d1acfb080009b0fb56/frameset.htm)
- [開発者向け試用版ダウンロード](https://www.sap.com/japan/developer/trials-downloads.html)
- [Javadocs Index](https://help.sap.com/viewer/p/JAVADOCS) Javadoc一覧
- [JCOクラスの使い方](https://wiki.scn.sap.com/wiki/display/Java/JCO+Connection)


# SAPの製品構成

## SAP HANA

非(?)SQLデータベースです。

2015年リリースの現行バージョンは、このデータベースにしか対応していないそうです。

## SAP NetWeaver

SAPアプリケーションを動かすアプリケーションサーバ（？）です。

# 汎用モジュールあるいはFunctionとは

このあたりの用語の定義はよくわかっていません。大嘘書いていたらごめんなさい。

汎用モジュールは、以下のものを含むことができます。

- インポートパラメータ
- エクスポートパラメータ
- テーブルパラメータ
- ABAPプログラム


インポートパラメータ、エクスポートパラメータ、テーブルパラメータは、ユーザ定義型の値を持つことができます。

インポートパラメータ/エクスポートパラメータは1レコードのみ、テーブルパラメータは複数レコードを持つことができます。

ABAPは、BASICみたいな見た目のプログラムです。

# トランザクションとは

業務画面を起動し、何らかの値を入力し、最後に保存するまでの流れをトランザクションと呼びます。

使用例
「購買発注トランザクションを作成する」
Ansible | ansible コマンド と ansible-playbook コマンドの違い

# $ ansible

Ansibleで何か一時的な処理をおこなう時のコマンド。

## コマンドの例


- 「(インベントリファイルに書かれた)対象のホスト」 ( コマンド引数 )
- 「インベントリファイル」 ( `-i` )
- 「使うモジュール」 ( `-m` )
- 「モジュールに与える引数」 ( `-a` )

などを指定する。

```
$ ansible target_host -i inventory_file -m shell -a 'echo "Hello World"'
```

インベントリファイル以外は、すべてコマンドとして指定する。

# $ ansible-playbook

- 一連の処理の流れを YAML で記述しておいて、それを実行する仕組み。
- 基礎的なレベルでいうと、ansible コマンドのモジュールを、順に実行していく仕組み。
  - つまり ansible-playbook で実行できることは、全て、ansible コマンドでも実行できる。(やろうと思えば)

## コマンドの例

- 「実行する playbook 」 ( コマンド引数 )
- 「インベントリファイル」 ( `-i` )

などを指定する。
```
$ ansible-playbook example-playbook.yml -i inventory_file
```

# 環境

- ansible 1.9.6








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
今更ながらjQueryのon("click")とclick()の違いを認識した恥ずかしい話し

題名でもある通り恥ずかしい話です。
`on()`と`click()`の違いについてようやく得心がいったというお話です。

追記:
コメントでも指摘されていますが`on()`と`click()`の違いではなくてイベントハンドラを設定する対象の違い、が正解ですね。
@sengoku さんありがとうございます！

## 大事なお話

**なおこの内容は恥ずかしい人が書いてるので多分に間違いや勘違いしている可能性があるのでその場合はPRをくれ。
コメントは「こういう方法もあるよ！」や他にもここで書かれていない優れた点の補足がある場合のみくれ。**
タイプミスもPRでください、コメントで指摘とかいう地獄は嫌なんじゃ！！！

# TL;DR

`on()`と`click()`でEventListenerに登録する方法はjQueryではよくみかけることと思う。
ジャバスクリプト初心者は参考事例がどっちも豊富にあって迷うことがあると思う、っていうか迷え。
んでフロントエンドエンジニア識者からは「え？まだ`click()`使ってんの？プププッ」みたいなことをたまに見聞きしてたんだけど具体的にどう`on()`のほうが優れているのか？までは理解していなかった。

# 対象読者

- JavaScriptをジャバスクリプトとか書いちゃう恥ずかしい人
- 10年くらい前のジャバスクリプトの知識で止まって恥ずかしい人
- React.jsだ！Angularだ！Vue.jsだ！ってご時世に「漢は黙ってjQuery！」な人
    - jQueryが悪いわけではない…がまあ上2つに該当する人だいたいjQuery使ってるイメージなので。
- ジャバスクリプト苦手な恥ずかしい人

# 結論:
`on()`のほうが優秀、少なくとも自分が使う範囲で`click()`を使う必要性はないのかなと。
迷ったらとりあえず`on()`で問題なさげ。

## 説明

通常使う分には`on()`も`click()`も大差は感じられないと思う。
具体的にどう優秀なのか？

jQuery使ってると頻繁に目にするこのDOMの読み込みが終わる後に実行する処理。
これはHTMLが完全に読み込まれる前にJavaScriptを実行してしまうと意図せぬ挙動を起こしてしまうことがあるから実装されているわけだ。
なので読み込み終わるまで待ってから`function()`でいろんなイベント登録したり、初期化したりと実装するわけです。

```javascript
$(document).ready(function(){
  // do something.
});
```

ところが最近はいろいろと非同期処理で実装したりHTMLをどっかから持ってくる…みたいなことをしないといけないことが多々ある、めっちゃあることと思う。

んでそういうときにこの`function()`内で件の`click()`を設定してしまうと非同期で持ってきたHTMLにはイベント登録がされていないのでクリックイベントが発火しなくて「なんでだろーなー？？？」ってなってしまったというお話です。

### 流れの概略:

1. DOM(=HTML)の読み込みが完了する
2. ready()内の処理が実行される(**この時点で存在しているHTMLに対して**イベント登録される)
3. 非同期処理とかでどっかからHTML持ってきたり、新しく生成する
4. readyでイベント登録してるからイベント発火するはず、ポチィ！！！→イベント発火しない
5. ぼく「？？？」

だいたいこんな流れです。
でこれを防ぐ…というか根本解決するにあたって`click()`でイベント登録していた内容を`on()`に修正しました。

どう修正したか？というと非常に単純でこれをこうした。

```javascript
$(document).ready(function () {
  $(".click_button").click(function(){
    console.log("clickされたよ！");
  });
});
```


```javascript
$(document).ready(function () {
  $(document).on("click",　".click_button", function(){
    console.log("clickされたよ！");
  });
});
```

これで「特定のクラスが指定されたDOM」から「Documentそのもの」に対してイベントが登録されたことになる(はず)。
なので先程の`4. readyでイベント登録してるからイベント発火するはず、ポチィ！！！→イベント発火しない`では対象となるDOMの要素が存在しなくてイベントが発火しなかったものが対象が変わるため発火するようになりました :smiley: 

## まとめ

両者の具体的な違いというか実行タイミングや対象を柔軟に変更できるという点で`on()`が優れているのだなとようやく理解した。
このあたりの知識はググってもいまいち思い通りの検索結果にたどり着かなくて「おれたちは雰囲気で`on()`を書いている」みたいな状態だったんだけど
「もっと綺麗に実装できると思うんだけどどうやるかわからーん！」ってなって同僚に聞いたら即解決したうえにわかりみしかない内容だったので恥ずかしい備忘録として残しておこうと思う。

今回の件でジャバスクリプトちからが1上げることができたっぽい。
自分たちが使う道具を1から10まで知っている必要はないけども最低でも1は知っておこうな！という恥ずかしいお話でした。

おしまい。

# 参考

- [jQueryの基本 - $(document).ready](http://qiita.com/8845musign/items/88a8c693c84ba63cea1d)
Javaでslf4j使うときに出たよくわからんエラーの解消法

バッチはログが命ということで、
Slf4jつかいたいなーと思いzipダウンロード。
https://www.slf4j.org/download.html

外部jar追加から
slf4j-api-1.7.25.jar だけ追加して、javaに

```
@Slf4j
public class HogeMain {
  public static void main(String args[]){
     ...
     log.info("testosterone");
     ...
  }
```
と書いて実行したら、以下エラー

```
   SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
   SLF4J: Defaulting to no-operation (NOP) logger implementation
   SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
```

slf4j-simple-1.7.25.jar も追加すると直るよ。


ちなみにこのエラーがでるときは、不必要なjarを追加してると思われる。
```
NoClassDefFoundError: android/util/Log
```
slf4j-api-1.7.25.jar
slf4j-simple-1.7.25.jar
ただjavaにログ出したいだけならこの2つのjarだけでとりあえず動いた
UIStackViewのトルツメWarning対応

# 概要
iOSのUIStackViewを使ってトルツメ(空いた部分を詰めるレイアウト)を行う際に発生したWarningとその対応方法

# 実装内容
<img width="600" alt="storyboard" src="https://qiita-image-store.s3.amazonaws.com/0/165931/0ef5dd49-c4b3-c16a-0a5b-c329c92fcc6d.png">
Storyboard上の定義は上記のような形。
Button2をhiddenすることで、Button1とButton3のみの表示にしつつ隙間をつめる。

# Warning
Button2をhiddenしたタイミングで下記のwarningがコンソールに出力された。

```text:console
[LayoutConstraints] Unable to simultaneously satisfy constraints.
	Probably at least one of the constraints in the following list is one you don't want. 
	Try this: 
		(1) look at each constraint and try to figure out which you don't expect; 
		(2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x61000009ae00 UIButton:0x7ff580d07320'Button2'.height == 40   (active)>",
    "<NSLayoutConstraint:0x6000000998c0 'UISV-hiding' UIButton:0x7ff580d07320'Button2'.height == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x61000009ae00 UIButton:0x7ff580d07320'Button2'.height == 40   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
```

# 原因と対応方法
##### [原因]
warning内容にも記載されている通りButton2に設定している`Height=40`制約と、Button2をHiddenしたことによって`Height=0`になるという状態に矛盾が発生していたため。

##### [対応方法]
制約の矛盾を解除すればよい。
ボタンに設定したHeight=40の制約のPriorityを下げる(999など)
<img width="256" alt="Constrain.png" src="https://qiita-image-store.s3.amazonaws.com/0/165931/4ad68340-164a-a9e0-21f6-b094584ea5f1.png">


# おわりに
入り組んだレイアウトを作成している際にぶち当たり、妙にハマってしまいました。
今回は`Content Hugging Priority`と`Content Compression Resistance Priority`を使いませんでしたが、
この辺りをきっちりと理解すれば、とても低コストでレイアウト作成や変更を行うことが出来るようになりますね。

UIStackViewを触るに当たって、下記の記事がとても参考になりました。ありがとうございます。
[StackViewを賢く使ってらくちんAutoLayout](http://qiita.com/yucovin/items/ff58fcbd60ca81de77cb)
git で「error: Could not stat '.git/objects/〜」が出た時の対処法

```bash
$ git fetch origin
```

上のコマンドを打ったら大量のメッセージが。。。

```bash
error: Could not stat '.git/objects/fd/8228deeb3d06cf97b4a5217c9ed41db96c35de'
error: Could not stat '.git/objects/fe/32dfcf48da67cccb56be19aae1da5ecb22d7db'
error: Could not stat '.git/objects/fe/3a20b2cb687a0fa4a8b0606a87562cee6582f1'
error: Could not stat '.git/objects/fe/982e160464abf9441b2130c4b130d6b509f86c'
error: Could not stat '.git/objects/fe/c74bfbf23e35f287f9500b2897bd5e159a1582'
error: Could not stat '.git/objects/fe/cc636605a329f672e6d76ff957864daa7af2fc'
error: Could not stat '.git/objects/fe/f2d99bea2d322f5d849b1b5d50226dc626f052'
error: Could not stat '.git/objects/fe/fb134d4bc58410bbebda59c5770c6c04e0ec6f'
error: Could not stat '.git/objects/ff/41d348337ad94ba30c90df6ce1bdeb24234250'
error: Could not stat '.git/objects/ff/5031d7d57c61d9a5b670798420e6e714d39b44'
error: Could not stat '.git/objects/ff/701e19f6d2c0658fb23b1d94124cba4ce60851'
error: Could not stat '.git/objects/ff/7b0b61a0638b5c96837c3b76bf55f51fcdd59b'
```

特に何かやった記憶はないけどきっとやらかしたんだろうな。。

という事で破損箇所をチェック！

```bash
$ git fsck --full
```

出るわ出るわ・・・

```bash
dangling blob ddeaa805a1c8ea48dbbfda10d8c391bf6221ba4a
dangling blob a76da2812af745ac6e462074aa3f2aa09df5058d
dangling blob a16e3c77122a64bc74c88678328a25b5400296da
dangling blob 0870ba7a2e0022e2f9f1b33680d64ab3403d65c9
dangling blob c3f15729848b981aa5134ce121ba0b161eb26527
dangling blob 2272b1ccc9ed89d056b927c5c621afde12c57e0f
dangling blob 117355253e9a8bb3fba02fc6f2ef6f7ae607aab6
dangling blob e3738f1845f8ca13acc532899a83df0e4b41e3d2
dangling blob 20f487830557e8cbba1e536acbc4f350f55524e1
dangling blob c0f45a6bdea0886a00c0a665b1ca8ff4da819857
dangling blob 2f767a1a0d1e4b3a64110dd0aab7a0970759bed3
dangling blob e377396b4a6b5a6aee7fe6618d159591d94d3123
dangling blob 2a7a9aa37f76fc468886c49a350855bd8839fbce
dangling blob bbfb0c626a8c5c0dc43a2825391f86694bb10f31
dangling blob c3fb6eef6a1cf3acc7709ac952f737306d211c9f
dangling blob 9efd02a5a24258815d5fda48fe51042253cdc475
```

さて、どうするか。。
と思ったのだけど、

**変更点は全て`push`済み**

という利点を活かして、

```
$ git clone
```

しちゃうのが一番早いと気づいたので、今回はその対応をしました

`git ｆｓｃｋ` を実行した意味とは。。。
MySQL Workbench で Google Cloud SQL に接続する時に少々ハマったのでメモ

こんちわー @wezardnet です。梅雨の季節らしくジメジメして蒸し暑い今日この頃です。早いもので 2017 年ももう半年過ぎました :scream:

某案件でフロントに [WordPress](https://ja.wordpress.org/) を使うことになり、そう言えば  Google Cloud Platform(GCP) 上に構築する記事を読んだ気がするのでググってみたところ、以下に手順が詳しくまとまっていたので、こちらに沿って入れてみました。私はインフラまわりの設定がめんどいので Google App Engine(GAE) 押しです (｀･ω･´)ｷﾘｯ

* [WordPressをGAEで簡単に使う10のステップ](http://www.apps-gcp.com/wp-on-gae-2015/)

WordPress は実際インストするのも、触るのも今回が初めてで、単純にデータベースの中身を見てみたいということで [MySQL Workbench](https://www.mysql.com/jp/products/workbench/) で接続してみることにしたのがコトの発端です。

#1. クライアント環境
* macOS Sierra 10.12.5
* MySQL Workbench 6.3.9

#2. サーバー環境
* Google Cloud SQL MySQL 5.6 First Generation
* WordPress 4.7.5

#3. 手順
一応 [Google 公式ドキュメント](https://cloud.google.com/sql/docs/admin-tools?hl=ja)にも手順は記載されてはいますので、併せてお読みいただければと思います。。。

##3.1.  Cloud SQL 側でやること
1. [Google Developer Console](https://console.cloud.google.com/) の Cloud SQL 管理コンソールに入って、クライアントから接続するためのユーザーを作る。
    「Host name」では **Allow any host (%)** を選択します。私は root など「Host name」が **localhost** なユーザーで Workbench から接続していたのですが ```Access denied for user 'root'@'IP Address' (using password: YES)``` というエラーが出てハマりました :fearful:

    ![image01.png](https://qiita-image-store.s3.amazonaws.com/0/12023/6d651f7c-a015-1cf8-1a47-34994ebd4b2b.png)

2. IPv4 アドレスを割り当てる。
    Cloud SQL では IPv6 アドレス（無料）が割り当てられますが Workbench から接続する場合は IPv4 アドレス（有料）が必要になります。

    ![image02.png](https://qiita-image-store.s3.amazonaws.com/0/12023/5762fe84-ca78-e669-b930-1956f98c69dd.png)

3. クライアントから接続するための IP アドレスを承認済みネットワークに追加する。
    自身のグローバル IP アドレスを確認するには ```$ curl ipecho.net/plain; echo``` で確認するか [確認くん](http://www.ugtop.com/spill.shtml)などで調べましょう。

    ![image03.png](https://qiita-image-store.s3.amazonaws.com/0/12023/96a469f2-dd33-e738-aa2c-4409403d4bfa.png)

4. クライアント証明書を作る。
    SSL のトコからボタン押して Key, CERT, CA の 3 つのファイルをダウンロードしましょう。

   　　![image07.png](https://qiita-image-store.s3.amazonaws.com/0/12023/44ef96df-ca3a-dd4b-b01b-846084b5dbb7.png)


##3.2.  クライアント側でやること
1. [MySQL Workbench](https://www.mysql.com/jp/products/workbench/) を MAC にインストする。
2. Cloud SQL への新しい接続を作る。
3. Connection 欄でパラメータの設定を入力する。
    * Connection Method ： Standard (TCP/IP)
    * Hostname ： Cloud SQL で割り当てた IPv4 アドレス
    * Username ： Cloud SQL で作ったユーザー名

    ![image04.png](https://qiita-image-store.s3.amazonaws.com/0/12023/40fca39a-7b03-2465-ddf2-72ee7ea8b794.png)

4. SLL 欄で Cloud SQL で作成したクライアント証明証を入力する。（Key, CERT, CA の 3 つのファイルパスを設定しまっす）
    

    ![image05.png](https://qiita-image-store.s3.amazonaws.com/0/12023/973b0404-1e6f-9d53-ae61-74db64633849.png)

5. 接続テストを行う。成功すると次のようなダイアログが表示されます。

    ![image06.png](https://qiita-image-store.s3.amazonaws.com/0/12023/260dedf1-de34-1a4e-fa88-a59267c82bd5.png)


##4. ミッションコンプリート！
というわけで、めでたく WordPress データベースに接続することが出来ました。クラウド上にある RDB もオンプレと同じように扱えますねっ :sunglasses:

![workbench.png](https://qiita-image-store.s3.amazonaws.com/0/12023/1303b4c6-5a13-951c-9a7b-ab907cb6b214.png)
[Docker]--privilegedオプションを使わないで特権モードのコンテナを作りサービスを起動する[agetty]

通常、コンテナ内でserviceコマンドを使おうと思ったら

```
docker run -itd --privileged --name CONTAINER centos:latest /sbin/init
```

と特権モードを指定してコンテナを作ります。
しかし、--privileged指定かつ/sbin/initを渡すとagettyなるプロセスがコンテナ内で暴走してCPUをめちゃくちゃ食う問題があるようです。

詳細はこちらの記事がわかりやすいです。感謝。
[Dockerを利用していてagettyがCPU使用率を専有してしまったら](http://qiita.com/Tsukasa_Sato/items/387d9e9312226929c272)

agettyが暴れないように--privilegedフラグ以外でdocker runするには次のコマンドでOKのもよう。

```
docker run -itd --security-opt label:disable --cap-add SYS_ADMIN --name CONTAINER centos:latest /sbin/init
```

自分はこれで大丈夫でした。
【Pepper】Choregrapheで終了・最大化・最小化ボタンが表示されない問題の解決法

# Choregrapheで終了・最大化・最小化ボタンが表示されない問題
Choregrapheのバージョン2.4.3では、一部OSバージョンで終了・最大化・最小化ボタンが表示されない問題が起こっているようです。そして長らくそれに悩まされていたのですが、偶然にも解決法を見つけることができましたのでご紹介します。

## OS・Choregrapheバージョン
OS: macOS Sierra 10.12.5
Choregraphe 2.4.3 

## 解決法
ターミナルを起動し、以下のコマンドを入力します
`$ cd ~/Library/Preferences/`
`$ mv com.aldebaran-robotics.www.Choregraphe.plist ~/desktop/`
この操作の後Choregrapheを普通に起動すれば、終了・最大化・最小化ボタンが表示されるようになっているはずです！

やっていることは、Choregrapheの設定ファイルをデスクトップに移動させるということです。
一旦、設定ファイルは消えますが、Choregrapheを起動するとまた再作成されるので大丈夫です。
バックアップとして、デスクトップに移した設定ファイルはどこかに残しておくのがよいと思います。


## 最後に
Choregraphe・Pepperについて詳しいサイト・団体を知っている方いましたら、コメントください。
Rails MySQLを使用するアプリケーションでMSSQLServreにも接続する

# カオスじゃないかこれは:imp:

## 前提条件
- 新アプリケーションではRails + MySQLを使用する。
- 既存のアプリケーションはSQLServreを使用している。
- SQLServreはWindowsServerに配置されている。

## 実現したいこと
新アプリケーションで登録があった場合、
新アプリケーションDB・既存アプリケーションDB共に更新する。

# 実装:writing_hand:

## SQLServerを使うためのgemを導入する

```:Gemfile
# SQLServer用
gem 'tiny_tds'
gem 'activerecord-sqlserver-adapter'
```
そしていつもの

```sh
$ bundle install
```

しかしこれはエラーとなる。
tiny_tdsを使用するにはFreeTDSが必要。

```sh
$ brew install freetds
# または
$ yum install freetds freetds-devel
```

そのあとに

```sh
$ bundle install
```

これでgemの導入は完了。

## SQLServreの情報をセット
database.ymlにSQLServreの情報をセットする。

```yaml:database.yml
# ここら辺はMySQL用の設定
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: [username]
  password: [password]
  host: [host]

development:
  <<: *default
  database: management_development

test:
  <<: *default
  database: management_test

production:
  <<: *default
  database: management_production
  username: management
  password: <%= ENV['DATABASE_PASSWORD'] %>
# 以下を追加
# MSSQLサーバー用
sqlserver:
  adapter: sqlserver
  host: [host]
  database: [database]
  port: [port]
  username: [username]
  password: [password]
```

## Modelの作成
直SQLを実行するだけの機能を実装。
ApplicationRecordは継承しない。

```rb:msss.rb
# MSSQLServerにつなぐもの
class Msss
  # SQL文を実行する
  def self.exec(sql)
    sscnf = Rails.configuration.database_configuration['sqlserver']
    client = TinyTds::Client.new(
      adapter: sscnf['adapter'],
      host: sscnf['host'],
      database: sscnf['database'],
      port: sscnf['port'],
      username: sscnf['username'],
      password: sscnf['password']
    )
    client.execute(sql)
  end
end
```

# 使用例:santa:
単純なSELECT文を実行し、その結果を取得する例

```rb:testcontroller.rb
class TestController < ApplicationController
    def test
        result = Msss.exec("SELECT * FROM [list] ")
        result.each do |row|
            puts row["name"]
        end
        render :text => "text"
    end
end
```

もちろんUPDATEやINSERTも可能。

# 参考にさせていただいたサイト:bow:
[Rails3でSQLServerに接続してみたよ](https://ameblo.jp/murajun1/entry-11266484358.html)
[[Rails][AzureSQLデータベース]Macでtiny_tdsのbundle installが通らない時の対処法](http://qiita.com/satoken0417/items/fb18e1314618035368d0)
yamlファイルを結合したい！swagger-mergerを使ってみた

# はじめに
swaggerでスタブを生成する際、サーバが1つしか立たないため、
複数のyamlに記載していると当然実行が困難となってしまう。

そこで、yamlファイルの結合ができないか調査したところ、
swagger-mergerがマージしてくれそうなので試しに使ってみました。

# 結論：そのままだと動かない
swagger-merger
https://www.npmjs.com/package/swagger-merger


node.jsでswagger-mergerをインストール後、以下のコマンドを実行。
$ swagger-marger -i [マージ元ファイル名].yaml -o [マージ先ファイル名].yaml
⇒実行エラー

function stringJson2JSON(doc, compact = false) {
上記のように"compact = false"と書かれている部分がすべてSysntaxErrorとなる。
（SysntaxError :Unexpected token = ）

# 実行できてもマージじゃなくてコピーに...
"= false"と書かれている箇所を以下のようにすべて削除すると実行に成功した。
function stringJson2JSON(doc, compact = false) {
⇒function stringJson2JSON(doc, compact) {

対象ファイル：
C:\xxxxxx\npm\node_modules\swagger-merger\node_modules\fmtconv\lib
converter.js
transcode.js


実行には成功するが、マージではなくただのコピーファイルが生成されてしまった。

初心者にはよくわかりませんでした。涙
MySQL のレプリケーションは意外と当てにならない


## 事象
Master-Slave 構成のデータベースで Slave 側のステータス(`show slave status\G`)は問題ないのに、Slave のデータを参照すると一部欠損しているデータがあった。

## エラーになっていない
レプリケーションでエラーが出るのは、Slaveに直接書き込みを行ったりして、プライマリキーなどのユニークなデータが衝突するケースが多い。
逆に言えばそれ以外の場合は、ほとんどの場合でエラーにならない。
エラーにならなければレプリケーションは継続される。

## なぜ欠損が発生しているのか
### 構成
先ほど Master-Slave 構成と書いたが、実は Slave は2台あり、うち一台は Master と同じところにあり(Slave1 とする)、もう一台は別のロケーションに設置してある(Slave2 とする)。
両 Slave とも Master からデータの配信を受けている。
今回欠損していたのは別な場所にある Slave2 だった。

### 障害発生
データ欠損の報告を受ける数日前に Master に障害が発生し、一時的に Slave1 を Master に昇格させて運用を継続していた。
Slave は2台ともレプリケーションの受け取りを停止させている。

### 復旧作業
Master と Slave が同スペックのマシンだったらよかったのだが、 Slave1 はあくまで緊急的に使う目的で構築されていたので低スペック。
そのため障害が回復したら Master と Slave1 を元に戻す必要があった。
Slave1 側の dump を取り Master 側に復元し、 Master　側で `master start` やら Slave 側で `change master` やらいつものお決まりを行い、復旧完了。

### 別ロケーションのレプリケーションを再開させる
作業員は何を思ったのか、 Slave2 に Slave1 の dmup を流し込まずに `change master` を行いレプリケーションを再開してしまった。
当然 Slave1 で運用していた間のデータが Slave2 にはない。
しかし幸か不幸か、レプリケーションエラーは一切でないまま、 Master のデータを受け取り続けてしまっていた…。

## 教訓
レプリケーション復旧するときは最新データをちゃんと流し込め(当たり前)。
vagrant box add したら The box failed to unpackage properly. Please verify that the box

# エラー

```

The box failed to unpackage properly. Please verify that the box
file you're trying to add is not corrupted and that enough disk space
is available and then try again.
The output from attempting to unpackage (if any):

x box-disk1.vmdk: Write failed
x box.ovf: Write to restore size failed
x Vagrantfile: Write to restore size failed
bsdtar: Error exit delayed from previous errors.

```

# 治った

わけわからんこれで治るそうなので実行してみたら治った

```
rm -rf ~/.vagrant.d/tmp/box*
```