OmniAICreator/Qiita-1.07M huggingface dataset:
Mac に複数バージョンのkibana を同居させる

# 目的

Elasticsearch を色々と使っているのですが、
バージョンアップが激しく、本番と開発環境でバージョンが違うことがザラにあります。

そして、Elasticsearch と切り離せない機能にkibana があると思うのですが、
諸般の事情によりkibana はmac にインストールして本番サービスや開発環境に接続しています

となると、色んなバージョンのElasticsearchが動いている中、色んなバージョンのkibana をmac にインストールしなければなりません
その時の対応メモです

# 内容

## 前提条件

+ 管理は全部`Homebrew` でやりたい

```bash
$ brew -v
Homebrew 1.6.3
Homebrew/homebrew-core (git revision fc37b; last commit 2018-05-15)
```

## 対応内容

```bash
$ unlink kibana # 旧バージョンをunlink しておく
$ brew install kibana # 最新バージョンを入れる
```

+ 最新（6.2.4) にする

```sh
$ brew switch kibana 6.2.4
Cleaning /usr/local/Cellar/kibana/6.2.4
Cleaning /usr/local/Cellar/kibana/6.2.3
3 links created for /usr/local/Cellar/kibana/6.2.4
$ kibana --version
6.2.4
```


+ 旧バージョン（6.2.3) にする

```sh
$ brew switch kibana 6.2.3
Cleaning /usr/local/Cellar/kibana/6.2.4
Cleaning /usr/local/Cellar/kibana/6.2.3
3 links created for /usr/local/Cellar/kibana/6.2.3
$ kibana --version
6.2.3
```

# 問題点

switch 出来るのは**過去にインストールしたことがあるバージョンのみ**

brew search してもマイナーバージョンの違いのものはインストール出来ない

```sh
$ brew search kibana
==> Formulae
kibana ✔                                                                        kibana@5.6 ✔
```

## log から復活させる

brew log で対象のパッケージの過去情報を取得する

```bash
$ brew log kibana
commit 7e3dcc02b6d3e148d230d9268fb538bb1a654275
Author: BrewTestBot <homebrew-test-bot@lists.sfconservancy.org>
Date:   Sun Nov 25 05:37:56 2018 +0000

    kibana: update 6.5.1 bottle.

commit ed6d5a64e6945f89182fcaa0f60adc88c471f931
Author: Igor Kapkov <igasgeek@me.com>
Date:   Sun Nov 25 08:01:33 2018 +1100

    kibana 6.5.1

    Closes #34430.

    Signed-off-by: Jan Viljanen <527069+javian@users.noreply.github.com>

commit 5bb310b4d1dbcd575ee7cfab6b3e633083b303b4
Author: BrewTestBot <homebrew-test-bot@lists.sfconservancy.org>
Date:   Mon Nov 19 19:20:57 2018 +0000

    kibana: update 6.5.0 bottle.
```

それっぽいcommit ログを見つけたら、以下コマンドでインストール出来るようになる

```
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/{コミットログ}/Formula/{パッケージ名}.rb
```

例：kibanaの6.2.4をインストールする場合

```
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/3bf33c76fce31a262267907b1aeb58fe97009b71/Formula/kibana.rb
```
Androidで、Exifを見て、画像を回転させる

# 前提
 - Androidプログラミングの知識はないため、間違っている可能性があります。ご指摘をお願いいたします。

# 参考にしたサイト
https://qiita.com/neonankiti/items/e387a81a64d934ba8d9f
https://www.samieltamawy.com/how-to-fix-the-camera-intent-rotated-image-in-android/

# build.gradleに、依存関係を追記します。

```gradle
dependencies {
    implementation 'com.android.support:exifinterface:27.1.1'
}
```

# Exifを見て、画像を回転させるメソッドを作ります。
ここでは、`bitmap`を引数で受けていますが、次のように、fileDescriptorから取り出すこともできます。
`Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);`

**@neonankiti様より、コメントを頂戴しました。ありがとうございます。**
>念のために書かせていただきますと、FileDescriptor自体はKitkat(OSバージョン4.4以上)からの導入ですので、それ未満のサポートを考えた場合には、私の記事にも書いておりますが、画像データはUriからストリームとして扱ってあげると良いかと思います。
https://qiita.com/neonankiti/items/e387a81a64d934ba8d9f

```java
    /**
     * Rotate an image if required.
     * https://www.samieltamawy.com/how-to-fix-the-camera-intent-rotated-image-in-android/
     *
     * @param bitmap The image bitmap
     * @param context
     * @param uri    Image URI
     * @return The resulted Bitmap after manipulation
     */
    public static Bitmap rotateImageIfRequired(Bitmap bitmap, Context context, Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
                context.getContentResolver().openFileDescriptor(uri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();

        ExifInterface ei = new ExifInterface(fileDescriptor);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        parcelFileDescriptor.close();

        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                return rotateImage(bitmap, 90);
            case ExifInterface.ORIENTATION_ROTATE_180:
                return rotateImage(bitmap, 180);
            case ExifInterface.ORIENTATION_ROTATE_270:
                return rotateImage(bitmap, 270);
            default:
                return bitmap;
        }
    }

    /**
     * rotate image
     *
     * @param bitmap
     * @param degree
     * @return
     */
    private static Bitmap rotateImage(Bitmap bitmap, int degree) {
        Matrix matrix = new Matrix();
        matrix.postRotate(degree);
        Bitmap rotatedImg = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        bitmap.recycle();
        return rotatedImg;
    }
```
Brakemanのオプション(和訳)

Brakemanのオプションドキュメント（[OPTIONS.md](https://github.com/presidentbeef/brakeman/blob/master/OPTIONS.md)）を翻訳しました。

共同翻訳者は@jnchitoです。

【2018年5月30日 追記】
翻訳は公式ドキュメントに取り込まれました。今後はこちらのページを参照してください。

https://brakemanscanner.org/docs/options/ja
過激なエンジニア(エクストリームエンジニア)とは

#はじめに
「エクストリーム・エンジニアへの道」というテーマでお話を聞く機会がありました。
その内容を参考にした記事の作成を通じて、
いま自分ができることは何なのか、今後自分がどうなっていくかを
整理していくことを目的とします。

##講義内容
主にアジャイル開発の手法が取りあげられました。
従来のウォータフォール型とどこが違うのか、
その実態から最終的に将来どういった人物が
技術者として生き残っていくのかといったお話で
午前中は終了しました。

##アジャイル開発について私が感じた従来型との大きな違い
従来のウォーターフォール型と大きく違う点としては
ユーザ(これからサービスを提供しようとしている顧客)と開発者が
一体となってプロジェクトを進めているという点でした。

私が知っているユーザや顧客というのは、外部に開発を委託して
請け負った業者が実際に対応していくものです。
当然、受注側には仕事を完了させる義務があり
責任範疇は受注側となります。

しかしアジャイル開発の現場では責任範疇についても異なっており、
ユーザが責任者となる点についても大きな違いです。

ただこれについてはどっちが良いかという話ではなく
環境によって適応していくしかないのが現状じゃないかなと思いました。


## アジャイル開発と運用作業
講義を聞いていて、アジャイル開発は
アメリカで慣習化されていて先進的だと
感じたのですが、私が現場で経験した運用作業と
意外な共通点がありました。
それは2人ペアで作業を進めていくという点です。

アジャイル開発の現場で行われてる開発手法に
ペアプログラミングがあります。
これは運用の現場に置き換えるとクロスチェックで
運用作業を進めていく手法とよく似ているなと感じました。

ただ運用作業については定例化されているものが
ほとんどなのでスキル向上につながるかというと
そういうわけではない部分が残念です。

# まとめ
かつてトヨタ生産方式で唱えられた**「多能工」**という言葉が
講義のなかで紹介されていました。
アジャイルエンジニアもこの考え方で、
アメリカのソフトウェア業界で広まっていったことなんだそうです。
なのでアジャイル開発という考え方の元ネタは日本人が発祥ということです。

ウォーターフォール工程が8割を占めている日本の
IT業界でも、現在は少しずつアジャイル化が進んでいるそうです。
そのため、昨今のような分業体制が無くなる可能性があるかもしれません。

そういったときに生き残るエンジニアが
**「エクストリームエンジニア」**ということなのでしょう。

わたしの今後の方針としては、継続的に週末を利用して個人でできる範囲で
学習を進めていくことと、いろんな人と会って得られる機会が
増えていくように行動を起こしていきたいと思います。

# 参考リンク(Qiita)
[そもそもアジャイル開発ってなんだ](https://qiita.com/newta/items/f39f4a89da26e828f702)
[アジャイル開発時におけるプロジェクトの進め方（その1）](https://qiita.com/sinaku-developer/items/bd74bde161b640b75b70)
[[翻訳] スクラムがアジア圏でうまくいかない4つの理由 - Scrum does not work here in Asia](https://qiita.com/wataradio/items/6b79130b8ea53aa698aa)
ActiveHash で定義したデータを FactoryBot の association で用いる

```rb
class Item < AppliactionRecord
  belongs_to_active_hash :item_detail
end
```

```rb
class ItemDetail < ActiveHash::Base
  include ActiveHash::Associations
  self.data = [
    {id: 1, name: 'Hoge'},
    {id: 2, name: 'Foo'},
  ]
  has_many :items
end
```

な関連があるとき factory で次のように定義する。

```rb
FactoryBot.define do
  factory :item do
    item_detail { ItemDetail.all.sample }
  end 
end
```

---

もし以下のように定義してしまうと、 `FactoryBot.create(:item)` したときに新しい `item_detail（id: 3, name: nil）` が作成されてしまう。

```rb
FactoryBot.define do
  factory :item do
    association :item_detail
  end 
end
```

Ref: [FactoryBot（旧FactoryGirl）で関連データを同時に生成する方法いろいろ](https://qiita.com/metheglin/items/47116ccbdb26aa00e034)
iOSアプリでOAuth認証

# iOSアプリでOAuth認証
AccessTokenの取得までは [OAuthSwift で AccessToken 取得 - techium](https://techium.hatenablog.com/entry/2017/08/30/075622) の通り出来たが、取得したトークンの保存だのといった取り回しが良く分からなかったので調べながら実装。

## TL;DR
Keychain使いなさい、ということで。  
今回作ったものはこちら。

[kfurue/RxSwiftRailsTutorial at keychain-trial](https://github.com/kfurue/RxSwiftRailsTutorial/tree/keychain-trial)

## 環境
- Swift 4.1
- Xcode Version 9.3 (9E145)
- 対向Webサービス
    - [Doorkeeper - awesome OAuth2 provider for your Rails app.](https://github.com/doorkeeper-gem/doorkeeper) を使った自作サイト
- 利用OSS
    - [OAuthSwift/OAuthSwift/ Swift based OAuth library for iOS](https://github.com/OAuthSwift/OAuthSwift)

## Store credential
ひとまず[Store credential · OAuthSwift/OAuthSwift Wiki](https://github.com/OAuthSwift/OAuthSwift/wiki/Store-credential)を参照。

かいつまんで言うとKeychainにストアしようね、っていうだけの内容だったので、[kishikawakatsumi/KeychainAccess: Simple Swift wrapper for Keychain that works on iOS, watchOS, tvOS and macOS.](https://github.com/kishikawakatsumi/KeychainAccess)を使って実装してみる。

### KeychainAccess 導入
Carthageを使っているので[ここ](https://github.com/kishikawakatsumi/KeychainAccess#carthage)の通りに。

現状最新はv3.1.1。特にハマるところは無いはず。

### 実装
動作確認目的なのでとりあえずViewController上で実装してみる。

```swift
    override func viewDidAppear(_ animated: Bool) {
        let keychain = Keychain(service: "kfurue.RxSwiftRailsTutorial-token")

        if keychain["oauthToken"] == nil {
            oauthswift.authorizeURLHandler = SafariURLHandler(viewController: self, oauthSwift: oauthswift)
            oauthswift.authorize(
                withCallbackURL: URL(string: "sample-app://oauth-callback")!,
                scope: "", state: "hoge",
                success: { credential, _, _ in
                    print(credential.oauthToken)
                    // OAuthSwiftで取得したトークンをKeychainにストアする
                    keychain["oauthToken"] = credential.oauthToken
            },
                failure: { error in
                    print(error.localizedDescription)
            }
            )
        }

    }
```

ストアしたトークンを取り出す。

```swift
        let keychain = Keychain(service: "kfurue.RxSwiftRailsTutorial-token")

        guard let token = (try? keychain.get("oauthToken")) as? String else {
            return
        }
```

取り出したトークンを使ってリクエストを投げてみる。

```swift
        SampleAppClientAPI.customHeaders["Authorization"]
            = "Bearer " + token
        feedTableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")

        viewModel.feeds.asDriver().drive(
            feedTableView.rx.items(cellIdentifier: "Cell"),
            curriedArgument: {_, micropost, cell in
                cell.textLabel?.text = micropost.content
        }).disposed(by: disposeBag)
```

動作確認完了。
Cockpit のインストール

なんか面白そうだったのでメモ

# 前提条件
以下の環境を想定しています

|  OS・ミドルウェア  |                バージョン               |
|:--------------|-------------------------------------:|
| CentOS        | CentOS Linux release 7.5.1804 (Core) |

# 手順

1. Cockpit をインストールする

    ```
    # yum -y install cockpit cockpit-dashboard
    ```

2. サービスを起動する

    ```
    # systemctl start cockpit && systemctl is-active cockpit
    ```

3. 次の URL でログインする

http://＜IPアドレスもしくはホスト名＞:9090/

<img width="1223" alt="Cockpit_home.png" src="https://qiita-image-store.s3.amazonaws.com/0/34297/ade4cbf7-e0f2-1511-f826-a77c6f3b3139.png">

## 参考

以下を参考にしました

- [https://cockpit-project.org/](https://cockpit-project.org/)
- [How to Install Cockpit on CentOS 7](https://www.vultr.com/docs/how-to-install-cockpit-on-centos-7)
- [CHAPTER 2. INSTALLING AND ENABLING COCKPIT](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/getting_started_with_cockpit/installing_and_enabling_cockpit)
わたしからみたデザイン

やあやあ、ごきげんよう。🐱です。故あって俗世でもうちょいお付き合い下さい。これで何重管理になるんだろう。

今日はデザインのおはなしをしましょう。

#HackMD最高ー！
この美しいプロダクトをご覧ください。

![667B71B1-E0DF-4EF6-8233-DF0DBBC0F81D.jpeg](https://qiita-image-store.s3.amazonaws.com/0/168954/51c23756-2312-caae-de03-5551eff82fee.jpeg)

Markdownの驚嘆すべきところは、その信じられない学習コストの低さにある。

Facebookからログイン出来ますので、インターフェースの命ずるままぽちぽちしてみなよ（専門用語で"アフォーダンス"と呼びます）。

どうだ？ 画面上にボールドのボタンがある。押してみよう。ボールドになる。そのうち、カーソル移動が面倒になって、Markdownを直で書くようになるだろう。タグが表示されているからだ。

**Hell yeah!!!** 諸賢は最高にCoolなEngineerだ。最高にCoolなEngineerは機械の怠惰に一切容赦しない。

**Qiitaはしのごの言ってねえで、さっさとボタンをつけろ。**

さらに言うと、HackMDはバークレーの学生さんたちが作ってる。ツイッターで問い合わせをしたらすぐ答えが返ってくるよ。

"俺たち、お前をサポート出来ることにマジエキサイトしてるぜ！"だってさ。たまんねえな。わたしたちにぴったりのBuddyだと思わないか？　コーヒー奢ってて寄付募ってる。コーヒー一杯くらい、いいだろ？

#ぴあの
Pianoをご存知か？ 早速諸賢の認識をハックさせてもらうぜ。

**あれは、弦楽器だ**。

鍵を押すと、ハンマーが動き、弦を叩く。鍵は何種類ある？ そう、2種類。白と黒。

基本的にピアノは半音ずつ上下する。ドレミファソラシド。その繰り返し。どうして黒鍵が出っ張ってるんだ？ 如何にも押して欲しそうじゃないか？

あれは、重要なんだ。黒鍵の両隣の白鍵は、全音のインターバルだからだ。

#暗黒美無王
暗黒美無王の謂。

"エディタに拘らないで、何に拘るんだ？"

まったくその通りだ。Vimがあれば、機械に好きな命令が出来る。ツイッターも出来る。ルールに従えば、思考と視線移動と指が同期する。

これぞ、まさに、人機一体。

そしてエコシステムの沼にはまり、OSSでイシューを上げることになり、なんなら直すことになり、**進捗は出ない**。

誰か……助けて……助け……。

#あっぷる
あの、Thinkpadの**へんな赤いまる**が人間工学的に最高速度というのは、承知で🐱はMacBook Proを買った。画面が広く、美しいからだ。

散々悩んで、スタッフにご迷惑をおかけした旨お詫びすると、"お買い物を楽しんでくれてありがとう"だってさ。

新しいiPad、いいですねえ。美しい。彼らはずっとアラン・ケイを追っています。憧れているんでしょうね。兵站が整えば、またあっという間に驚くような世界にしてくれると思いますよ。

スティーブ・ジョブズは、仕事を残さなかった。

#ホスピタリティ
要するに、デザインとはホスピタリティだと🐱は思うんだよ。

その意味で当サイトも🐱もホスピタリティが足りていない。

こんな話があった。一流ホテルのボーイ（ポリティカリィかな？）に"お待たせしてごめんなさいって英語でどう言うの？"と問うたら、こんな答えが返ってきた。

"そのような概念がないので、そのような言葉はありません。**私たちは、お待たせしません**"

#結びに
関東大震災において、わたしたちを救ってくれたのは駅員さんだと信じて疑わない。

午前2時、丸ノ内線を動かしてくれた事をわたしは生涯忘れないだろう。"えー、あー行けるところまで、行きます"だってさ。

あの大災害の最中に、呑気かな？ 流石は元官だよ。有事を軽々とコントロールしやがった。でも、これはまた、べつの話。

読んでくれてありがとう。やーっと、あのポエムが書けるよ。

My pleasure.
My honour.
see ya soon.
Your faithful 🐱
Node.jsを利用してGoogle APIsでAnalyticsのv4を使うとanalyticsreportingがnot a function言われる時の対応

Google AnalyticsからGoogle APIsを経由して利用する場合にちょっとだけハマったのでメモ

[Node.jsでGoogle AnalyticsのPV数を取得](https://qiita.com/nishii/items/b33f217c0a0521d82093)
[Google APIs Analytics Samples](https://github.com/google/google-api-nodejs-client/blob/master/samples/analyticsReporting/batchGet.js)

上記のものを参考にコードを書いても analyticsreporting の箇所で

```
TypeError: google.analyticsreporting is not a function
```

とエラー吐いて終わります・・。
他のサンプルも同様の書き方になってるものが多く、なんか僕だけ指から電波出して動かないのか？と不信になる程調べても原因が見つかりません。

で、調べてみると以下のリリース情報を見てるとどうやら呼び出し方が26.0.0から変わってる模様。
https://github.com/google/google-api-nodejs-client/releases


```javascript:before
var {google} = require('googleapis');
```

を

```javascript:after
const {GoogleApis} = require('googleapis');
const google = new GoogleApis();
```
に変更すれば動いた・・・・。
オブジェクトと配列のでストラクチャーリング JavaScript (ES6, ES2015)


## Destructuring　(分割代入)

日本語難しいので、**デストラクチャーリング** って横文字で読んでます。、
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

### 1. オブジェクトのデストラクチャーリング(Object Destructuring)

今までのデータをこう読み込んでいたのが・・・

```data.js
var user = {
  name: 'Ayako Sayama',
  age: 16,
  location: 'Vancouver',
}

var name = user.name;
var age = user.age;
var location = user.location;
```

こうやって読み込むことができるようになりましたー。

```data.js
var user = {
  name: 'Ayako Sayama',
  age: 16,
  location: 'Vancouver',
}
const { name, age, location } = user;
```

### 2. 配列のデストラクチャーリング(Array Destructuring)

配列も上記のオブジェクトと一緒です。
{} が []に変わるだけ。

```data.js
var user = [
  'Ayako Sayama', 'Vancouver', 'Megane'
];

var name = user[0]; // 'Ayako Sayama'
var age = user[1]; // 'Vancouver'
var location = [2]; // 'Megane'

```

```data.js
var user = [
  'Ayako Sayama', 'Vancouver', 'Megane'
];
const [ name, age, location ] = user;
console.log(name); // 'Ayako Sayama'

```

ここでは、デストラクチャーリングする時に、好きな変数に置き換えることができます。(name="Ayako Sayama")

### 3. 関数のパラメーターをでストラクチャーリング(Destructuring in function parameters)

#### Before

パラメーターの中身もわからないし、順番も正確じゃないといけないので面倒！

```fetchData.js
function fetchData(language, name, age, nationality, hasBoyfriend) {
  ...
}

fetchData("Japanese", "Ayako", 10, "Japanese", true);
```

#### After

```fetchData.js
function fetchData({ language, name, age, hasBoyfriend, nationality }){
  ...
}

fetchData({
  language: 'Japanese',
  name: 'Ayako Sayama',
  hasBoyfriend: true,
  nationality: 'Japanese',
  age: 16,
});

```
順番はバラバラでOK!
さくらVPS(Ubuntu16.04)で動いているbitcoindに対して、JSON-RPCコマンドの受付を有効にする

**はじめに：セキュリティに関わる設定を変更するので自己責任でお願いします。**

外部からJSON-RPCコマンドでgetblockchaininfoメソッドなどの情報を取得したいのに
"No route to host（ホストへの経路がありません）"となっておりました。
もちろんpingは通っております。
ただtelnetは同様のエラーになっていました。

結論からいうとfirewall(iptables)の設定と、
bitcoin.confのrpcallowipによって外部からはコマンドが叩けなかった。

## iptablesでポートを解放する
まずBitcoin RPCPortのポートをiptablesのルールが記載されたファイルに追加します。
`sudo vi /etc/iptables/iptables.rules`
sshのINPUTをACCEPTしている箇所があると思うので、
```-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT```
この下に以下の1行を追加します。
```-A INPUT -m state --state NEW -m tcp -p tcp --dport 8332 -j ACCEPT```

現在のsshしか許可されていない状態をまず確認します。
```sudo iptables -L```

```
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere 
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
```

では変更を反映するためにiptablesのserviceをrestartします。
```sudo /etc/network/if-pre-up.d/iptables restart```

それでは反映されたか確認してみましょう。
```sudo iptables -L```

```
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:8332
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
```
最後のREJECTの前に追加されていることがポイントです。

## bitcoin.confの設定を行う

`~/.bitcoin/bitcoin.conf`

```
rpcuser=myuser
rpcpassword=mypass
rpcallowip=0.0.0.0/0 #全てのipaddrからの接続を許可する場合の設定
```
を記載の上で、bitcoindを立ち上げます。

## 外部からcurlでJSON-RPCコマンドを試してみる
これで外部からcurlなどで情報が取得できるようになったと思います。
```
curl --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"getblockchaininfo","params":[]}' -H 'content-type:text/plain;' http://myuser:mypass@myipaddress(domainname):8332
```
localhostでは取得できるのに〜という方に。
以上、備忘録的に記載させていただきましたが自己責任で宜しくおねがいします。
Qiitaの限定公開の悲しみ ~公開日には気をつけろ~


#はじめに
Qiitaの限定公開はあくまで限定した人に対して公開する機能である。

#会社での使われ方
会社のオーガナイゼーションなどに入っていると、限定公開で社内共有して、問題がなければ全体公開にする。
という流れがあります。

#悲しみ
今日気がついたんですが、5月11日に限定公開 => 5月15日に公開とした時、新着投稿の欄では、しれっと5月11日のところに追加されちゃうんですね。。。
くそー、これじゃみんなの目につく機会がなくなってしまうではないか。

#使い方
* そもそも、社内チェックで限定公開を使うというのが間違い？
* そもそも、新着に乗らないとみんなの目につかない記事を投稿するのがよくない？
    * 例えば「submodule」について、の記事などは「submodule」 について調べたければ必然的に見られそうだし

#願い
わがままながらこんな願いが頭をよぎった。

* 限定公開 から 公開 にしたときは、公開日が更新されると幸せ。
* または、社内共有用に作成途中の記事を共有する機能の追加。

#まとめ
公開日は限定公開をした日になるため、以下のことには気をつける。

* 新着にはのらない
* アドベントカレンダーの場合 12月1日以前には限定投稿しない [(参考)](http://d.hatena.ne.jp/minamijoyo/20161202/p1)
    * これは 予約投稿 でもだめなのかは未検証だけど、気をつけるよろし。


#新着にのらなくて悲しみを覚えた記事
[新卒にGitを別の物に例えて教えてみる試み ~ オ・トワ・ラヴィ ~](https://qiita.com/kinpira/items/06cdd594f9df88720460)
[新卒用のネットワーク課題でおきた悲劇 ~自作DHCPサーバーの恐怖~](https://qiita.com/kinpira/items/d30341571a1933262057)

#追記
この記事を見た人から教えてもらったんですが、回避方法としては、限定公開記事は削除して、新たにコピーしたものを作成するといいというアドバイスを受けました。
ちょっと納得いかないなーと思いつつ、現状の回避方法として有効なので追記しておきます。
ccxtを利用したBitcoinのシステムトレードをやろうとして謎に思ったこと

##ccxtを通してBitFlyerのオリジナルのAPIを使おうとしたとき
初めまして。プログラミング初心者です。

```python:trade.py
import ccxt
from pprint import pprint

bitflyer = ccxt.bitflyer()
response = bitflyer.public_get_getboard()
pprint(response)
```
こういうコードを書いてBitFlyer Lightningの板情報を得ようとしました。
BitFlyer側では/getboardというAPIが定義されていたので、ccxtでは.public_get_getboard()が定義されてそうだなーと当たりをつけて、どうやらこれが当たっていたっぽいんですけど、帰ってきた結果が
```
   {u'price': 751050.0, u'size': 0.2},
   {u'price': 751001.0, u'size': 0.0133},
   {u'price': 751000.0, u'size': 0.4},
   {u'price': 750902.0, u'size': 0.2},
   {u'price': 750848.0, u'size': 0.01},
   {u'price': 750782.0, u'size': 0.1},
   {u'price': 750777.0, u'size': 0.033},
```
こんな感じになりました。ここで「ん？」となりました。
というのもAPIの説明の方にはレスポンスは
```
{
  "mid_price": 33320,
  "bids": [
    {
      "price": 30000,
      "size": 0.1
    },
    {
      "price": 25570,
      "size": 3
    }
  ],
  "asks": [
    {
      "price": 36640,
      "size": 5
    },
    {
      "price": 36700,
      "size": 1.2
    }
  ]
}
```
と書いてあったからです。
約定価格はどれ？となったので、ダメ元でresponse["mid_price"]をprintしたらなぜかちゃんとmid_priceを表示してくれました。
u'price'だかなんだかはどこへ行ったのでしょうか？誰か分かる方いたら丁寧に教えていただけると嬉しいです。
RSS勉強関連リンク集


## RSSの仕組み
[http://loadpiece.xyz/blog/web-rss-summary01/](http://loadpiece.xyz/blog/web-rss-summary01/)

## RSS 2.0 のフォーマット
[http://phpjavascriptroom.com/?t=topic&p=rss_format](http://phpjavascriptroom.com/?t=topic&p=rss_format)

## qutoutiaoのフォーマット
[https://mp.qutoutiao.net/rss_interface](https://mp.qutoutiao.net/rss_interface)
Windowsで映像入力デバイスからの映像をffmpegでエンコードする

ffmpegを使うとビデオキャプチャやWebカメラ等の映像入力デバイスからの映像データをキャプチャしてエンコードしてファイルに保存することができます。

まず以下のコマンドを実行して利用可能な映像入力デバイスを表示します。

    ffmpeg -list_devices true -f dshow -i dummy

こんな感じの出力が出ます。

    [dshow @ 000001d34aa46c20] DirectShow video devices (some may be both video and audio devices)
    [dshow @ 000001d34aa46c20]  "Microsoft Camera Front"
    [dshow @ 000001d34aa46c20]     Alternative name "@device_pnp_\\?\display#int3470#4&1aaa636&0&uid13424#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{bf89b5a5-61f7-4127-a279-e187013d7caf}"
    [dshow @ 000001d34aa46c20]  "Microsoft Camera Rear"
    [dshow @ 000001d34aa46c20]     Alternative name "@device_pnp_\\?\display#int3470#4&1aaa636&0&uid13424#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{7c9bbcea-909c-47b3-8cf9-2aa8237e1d4b}"
    [dshow @ 000001d34aa46c20] DirectShow audio devices
    [dshow @ 000001d34aa46c20]  "Microphone Array (Realtek High Definition Audio(SST))"
    [dshow @ 000001d34aa46c20]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{FC6BC544-7D5E-46AD-A8A3-C066F5DA799D}"
    dummy: Immediate exit requested


`DirectShow video devices`の下に"Microsoft Camera Front", `"Microsoft Camera Rear"`のようなものがいますね。この名前が入力ソースとして指定可能なデバイス名です。
これらのデバイスから映像を取り込んでエンコードするには、以下のようなコマンドを入力します。

    ffmpeg -f dshow -i video="Microsoft Camera Front" output.mkv

`video="○○"`の部分にデバイス名を入れます。コマンドが実行できると映像が`output.mkv`というファイル名に保存されます。

このコマンドでは実行してから永遠にキャプチャを続けるので、手動でキャプチャを止めなければいけません（さもないとディスクが満杯になります）。キャプチャを止めるには`Q`キーを押します。
HTTPS 通信したい。ただし IP を狙いうちたい

# curl の場合
```
curl -H 'Host: www.hoge.com' --resolve 'www.hoge.com:443:1.1.1.1' https://www.hoge.com/
```
[元ネタ](https://cloudpack.media/39491)

# Python
[forcediphttpsadapter](https://github.com/Roadmaster/forcediphttpsadapter/)を使うとできる
https://www.tomechangosubanana.com/2017/forcing-python-requests-to-connect-to-a-specific-ip-address/

```
import requests
from adapters import ForcedIPHTTPSAdapter

url = 'https://hoge.com'
s = requests.Session()
s.mount(url, ForcedIPHTTPSAdapter(dest_ip='1.1.1.1'))

s.get(url)
```

できたと思ったら、以下のようなエラーが

```
__new__() got an unexpected keyword argument 'key_dest_ip'
__new__() got an unexpected keyword argument 'key_dest_ip'
Traceback (most recent call last):
  File "/python/lib/python2.7/site-packages/requests/sessions.py", line 555, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/python/lib/python2.7/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/python/lib/python2.7/site-packages/requests/sessions.py", line 625, in send
    r = dispatch_hook('response', hooks, r, **kwargs)
  File "/python/lib/python2.7/site-packages/requests/hooks.py", line 31, in dispatch_hook
    _hook_data = hook(hook_data, **kwargs)
  File "/python/lib/python2.7/site-packages/requests/auth.py", line 257, in handle_401
    _r = r.connection.send(prep, **kwargs)
  File "/python/lib/python2.7/site-packages/requests/adapters.py", line 405, in send
    conn = self.get_connection(request.url, proxies)
  File "/python/lib/python2.7/site-packages/requests/adapters.py", line 309, in get_connection
    conn = self.poolmanager.connection_from_url(url)
  File "/python/lib/python2.7/site-packages/urllib3/poolmanager.py", line 279, in connection_from_url
    pool_kwargs=pool_kwargs)
  File "/python/lib/python2.7/site-packages/urllib3/poolmanager.py", line 227, in connection_from_host
    return self.connection_from_context(request_context)
  File "/python/lib/python2.7/site-packages/urllib3/poolmanager.py", line 238, in connection_from_context
    pool_key = pool_key_constructor(request_context)
  File "/python/lib/python2.7/site-packages/urllib3/poolmanager.py", line 103, in _default_key_normalizer
    return key_class(**context)
TypeError: __new__() got an unexpected keyword argument 'key_dest_ip'
```
Digest 認証するリクエストの場合でるのはわかったけど、、、
とりあえず、dest_ip が余計なのはわかったので、以下のように修正。

```
100 行目
kwargs['dest_ip'] = self.dest_ip ⇒ コメントアウト

101 行目
return ForcedIPHTTPSConnectionPool(host, port, **kwargs)
↓
return ForcedIPHTTPSConnectionPool(host, port, destip=self.dest_ip, **kwargs)
⇒ destip を引数に追加

107 行目
self.dest_ip = kwargs.pop('dest_ip', None)
↓
self.dest_ip = kwargs.pop('destip', None)

```

さらに Timeout の validate でもエラーが出たので urllib3 の import 分にくっついてる requests.packages をことごとく削除
(多分最初 rpm でインストールして、そのあと pip でアップデートとかだとでるっぽい)

# その他
/etc/hosts に書く
【IE10対応】input[type="file"]を.val('')で上書きできない→changeイベント発火しない。

前回に引き続き、IE10対応のメモです。

input[type="file"]にファイルをアップロードした後、モダンブラウザ？だと`$(this).val('')`などでvalueを初期化できるのですが、IE10はそうはいきませんでした。

```html
<input type="file" id="sample">
```

みたいなhtmlがあったとして、「サンプル.PNG」というファイルをアップロードしたとして、その後に開発者ツールのコンソールから以下を打っても

```javascript
$('#sample').val('');
console.log($('#sample'));
→ "C:\fakepath\サンプル.PNG"
```
と帰ってきます。セキュリティ上の問題で、上書きは出来ないようです。

`$('#sample').on('change', funcition(){ // do something });`

という感じで、新しいファイルをアップロードしたら、別の関数の処理が走るようになっていたのですが、肝心のvalue値が変わらないので、処理が走らず、新規でファイルをアップロードできませんでした。

以下、解決内容です。

```javascript
$target = $('#sample');
$target.wrap('<form>').closest('form').get(0).reset();
$target.unwrap();
```

上記の内容を、削除ボタンなどの、インプットファイルを初期化するイベントが発火した後に実行します。

▼参考
> https://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery

## input[type="file"]の名前・呼び方
input[type="file"] のことをなんと呼べばよいのか、共通の言葉があるのか探した所「ファイルコントロール」や「ファイル選択コントロール」、「ファイルフィールドコントロール」などと呼ばれていました。
> [JavaScriptプログラミング講座【ファイル選択コントロールについて】](https://hakuhin.jp/js/input_file.html)
> [File Field コントロールを使用してのファイルのアップロード](https://msdn.microsoft.com/ja-jp/library/aa478971.aspx)
マウントしたディレクトリでシンボリックリンクが作れないとき

WindowsのDocker Toolboxで作ったコンテナ内でシンボリックリンクを作ろうとすると、「プロトコルエラー」と言われてしまった。

```console:Docker内

ln -s /path/to/distination ./link_name

ln: failed to create symbolic link ‘link_name’: プロトコルエラー

```

Windowsのフォルダにマウントしたディレクトリ内にリンクを作ろうとしているため、どうやらWindowsとLinuxのファイルシステムの違いによりリンクが作成できないらしい。

そこでWindows側でコマンドプロンプトを使用し、シンボリックリンクを作りたいフォルダでmklinkコマンドを実行する。

+ コマンドプロンプトを**管理者権限**で起動するとmklinkコマンドが使える。
+ ```ln -s``` と ```mklink /D``` はほぼ同じ動きだが、リンク名とリンク先の順番が逆なので注意する。
+ リンク先はdokcer内のパスをダブルクォーテーション（""）で囲んで指定する。

```console:Windowsコマンドプロンプト

mklink /D link_name "/path/to/distination"

link_name <<===>> /path/to/distination のシンボリック リンクが作成されました

```

Docker側で確認するとマウントしたディレクトリにシンボリックリンクが作成されている。

```console:Docker内
ll link_name
lrwxrwxrwx 1 1000 ftp 0  5月 15 12:07 link_name -> /path/to/distination
```

## 追記

今回作成したシンボリックリンクはsvnにコミットできなかった。
gitでも同じと[思われる](https://qiita.com/yukimura1227/items/f83dd2a27c65e21ac53d)。
Google Maps APIが新料金体系に変わった(が、やっぱりわかりにくかった。)

# 料金体系の改定による主な変更点

- 無償版、有償版の撤廃
- 公開、非公開ライセンスの撤廃
- 月額の従量課金制
- (US)$200までの無償枠
- 18種類のAPIを３つに分類
 - Maps
 - Routes
 - Places


##Maps
| API | 機能 | 無料枠(月額) | 1,000call毎の料金 |1,000call毎の料金 |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| |  |  | 0~100,000call|100,001call〜 |
|Mobile Native Static Maps|Maps SDKで静止地図を表示する|無制限のロード|$0.00|$0.00|
|Mobile Native Dynamic Maps|Maps SDKでユーザが操作可能な地図を表示する|無制限のロード|$0.00|$0.00|
|Embed|HTMLでWEBに埋め込む|無制限のロード|$0.00|$0.00|
|Embed Advanced|※詳細不明|最大14,000ロード|$14.00|$11.20|
|Static Maps|Mapを画像として実装|最大100,000ロード|$2.00|$1.60|
|Dynamic Maps|Mapをカスタマイズ可能|最大28,000ロード|$7.00|$5.60|
|Static Street View|360度パノラマを使用した実世界の静止画像を表示|最大28,000ロード|$7.00|$5.60|
|Dynamic Street View|対象地域の、指定された道路からの360度パノラマを表示|最大28,000ロード|$14.00|$11.20|


##Routes
| API | 機能 | 無料枠(月額) | 1,000call毎の料金 |1,000call毎の料金 |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| |  |  | 0~100,000call|100,001call〜 |
|Directions|地点間の道順を計算する(交通情報含まない)|最大40,000コール|$5.00|$4.00|
|Directions Advanced|地点間の道順を計算する(交通情報含む)|最大20,000コール|$10.00|$8.00|
|Distance Matrix|移動時間と距離を計算する(交通情報含まない)|最大40,000エレメント|$5.00|$4.00|
|Distance Matrix Advanced|移動時間と距離を計算する(交通情報含む)|最大20,000エレメント|$10.00|$8.00|
|Roads - Route Traveled|経路に沿って収集した GPS 地点を受け取り、車両が走行していた可能性が最も高い地点にスナップした一連の同様のデータを返す|最大40,000コール|$10.00|$8.00|
|Roads - Nearest Road|座標を取り、各地点の最も近い道路上の区間を返す|最大40,000コール|$10.00|$8.00|


##Places
| API | 機能 | 無料枠(月額) | 1,000call毎の料金 |1,000call毎の料金 |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| |  |  | 0~100,000call|100,001call〜 |
|Autocomplete - 文字数ごと|ユーザーの入力に応じて場所の名称や住所を自動的に返す。文字数ごとの課金。|最大70,000文字|$2.83|$2.26|
|Autocomplete - セッションごと|ユーザーの入力に応じて場所の名称や住所を自動的に返す。セッションごとの課金。|最大11,000文字|$17.00|$13.60|
|Places Details - 基本|場所の名称・住所情報|最大11,000コール|$17.00|$13.60|
|Places Details - 基本+連絡先|場所の名称・住所情報 + 連絡先|最大10,000コール|$20.00|$16.00|
|Places Details - 基本+付帯情報|付帯(料金レベル/評価)情報　場所の名称・住所情報+付加情報|最大9,000コール|$22.00|$17.60|
|Places Details - 基本+連絡先+環境|場所の名称・住所情報+評価情報|最大8,000コール|$25.00|$20.00|
|Places Photo|場所の画像|最大28,000コール|$7.00|$5.60|
|Geocoding|住所を地理的座標(緯度と経度)に変換|最大40,000コール|$5.00|$4.00|
|Geolocation|端末が検出できる基地局やWiFiノー ド情報に基づいて位置と精度半径を返す|最大40,000コール|$5.00|$4.00|
|Time Zone|地点の時間やオフセットデータ|最大40,000コール|$5.00|$4.00|
|Elevation|地点の標高データ(海底も取得可能)|最大40,000コール|$5.00|$4.00|
|Find Place|入力した文字列(名称、住所)から位置情報を検索|最大11,000コール|$17.00|$13.60|
|Places - Nearby Search (基本+ 連絡先+付帯情報を含む)|周辺検索|最大5,000コール|$40.00|$32.00|
|Places - Text Search (基本+連絡先+付帯情報を含む)|文字列に基づいて関連する場所の情報を返す|最大5,000コール|$40.00|$32.00|

**※無償枠はMaps, Routes, Placesの合算になる。**
GCP Cloud Memorystoreを触ってみた

GCPでRedis(Cloud Memorystore)が使えるようになったので、触ってみた。

# 初期設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152303/bfdb03c8-e7fd-13a5-b732-ed179b8384a8.png)

選択項目としては以下のようになってる。

* Redisバージョン
    * 3.2固定
* インスタンスの階層
    * 基本
        * 可用性がないが安い
    * 標準
        * 自動フェイルオーバーされる。SLA99.9%
* ロケーション
    * asia-east1
    * europe-west1
    * us-central1
    * us-east1
    * us-west1
* インスタンスの容量
    * 1GB〜300GBまで選択可

また詳細設定で、Redisのパラメータを一部指定できる。以下のもの以外は現在は設定できない

* maxmemory-policy
* notify-keyspace-events

# 動作確認
プライベートIPしか振られないので、内部ネットワークからのアクセスしか無理っぽい。
今回はGCEインスタンスを立てて検証する。

色々コマンドを打ってみる

```shell
# Redisの動作確認をするので、redis-cliインストール
$ sudo apt-get install redis-tools

# インスタンス情報取得
$ gcloud beta redis instances describe test-instance --region=us-central1
authorizedNetwork: projects/{PROJECT_ID}/global/networks/default
createTime: '2018-05-15T05:41:19.175803Z'
currentLocationId: us-central1-a
displayName: test-instance
host: 10.0.0.3
locationId: us-central1-a
memorySizeGb: 1
name: projects/{PROJECT_ID}/locations/us-central1/instances/test-instance
port: 6379
redisVersion: REDIS_3_2
reservedIpRange: 10.0.0.0/29
state: READY
tier: BASIC

# Redisに入る
$ redis-cli -h 10.0.0.3 -p 6379

# 普通のset/get
10.0.0.3:6379> set test-key "hoge"
OK
10.0.0.3:6379> get test-key
"hoge"

# インクリメント
10.0.0.3:6379> INCR test
(integer) 1
10.0.0.3:6379> INCR test
(integer) 2
10.0.0.3:6379> INCR test
(integer) 3

# Pub/Sub
## Subscribe
10.0.0.3:6379> subscribe test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
1) "message"
2) "test"
3) "hello!"

## Publish
10.0.0.3:6379> publish test hello!
(integer) 1

# select database
10.0.0.3:6379> select 0
OK
10.0.0.3:6379> set test "hoge"
OK
10.0.0.3:6379> get test
"hoge"
10.0.0.3:6379> select 1
OK
10.0.0.3:6379[1]> get test
(nil)
```

Redisで出来ることは出来そう

細かいところはあとはこの辺に大体書いてある。ドキュメント充実してるなぁ。
https://cloud.google.com/memorystore/docs/redis/redis-overview

パフォーマンスに関しては後日検証。
PHPUnitでメモリ制限を増やす

テストでメモリが足りなくなる場合にテストの際のみメモリ制限を増やす。

```
PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted
```

[-d key[=value] Sets a php.ini value.](https://phpunit.de/manual/6.5/ja/textui.html#textui.clioptions)

```
vendor/bin/phpunit -d memory_limit=512M
```
Capistranoのrails_envはどこで設定されているか

Capistranoでオリジナルのタスクを書いていて、ふとrails_envはどこで設定されているのか気になったので調べたメモ。

直接的にはcapistrano/railsの[set_rails_env.rake](https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/set_rails_env.rake#L8)で設定されている。

```ruby
Capistrano::DSL.stages.each do |stage|
  after stage, 'deploy:set_rails_env'
end
```

`after stage`と書かれているので、productionやstagingがタスクになっているのだけど、そのタスクはどこで設定されているのだろうという疑問も湧いてきたので更に調べる。

### stageのタスクについて

各stageのタスクはcapistranoの[setup.rb](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/setup.rb#L21)で設定されている。

```ruby
stages.each do |stage|
  Rake::Task.define_task(stage) do
    set(:stage, stage.to_sym)

    ...
  end
end
```

そしてstageのタスクは`bundle exec cap production deploy`などでcapに渡された最初のタスクとして実行される。

[cap](https://github.com/capistrano/capistrano/blob/master/bin/cap)では`Rake::Application`のサブクラスである[Capistrano::Aplication](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/application.rb)をrunしているため、cap以降の引数はそれぞれRakeタスクとして実行される。
Vagrantを使って軽量・高速にローカルPostgreSQL環境を作成するメモ

# 概要
ローカルのPostgreSQL環境が欲しくなりました。
なるべく素早く簡単に作成する方法を検討した結果のメモです。

何度も再作成したりPostgreSQLのバージョンを切り替えたりしてもなるべく時間がかからない方法を検討しました。

# 内容
使用するBOXはこちらです。
https://app.vagrantup.com/ailispaw/boxes/barge

PostgreSQLは公式のalpineを使います。
https://hub.docker.com/_/postgres/

# 手順
```bash:Vagrantファイル取得
vagrant init ailispaw/barge
```

```ruby:Vagrantファイル編集
Vagrant.configure("2") do |config|

  # ～ 間にいろいろ ～

  # 以下を追記
  config.vm.network "forwarded_port", guest: 15432, host: 15432
  config.vbguest.auto_update = false
  config.vm.provision "shell", inline: <<-SHELL
    docker pull postgres:alpine
    docker run -p 15432:5432 -d --restart=always --name docker-edit-postgres postgres:alpine
  SHELL
end
```

```bash:Vagrant起動
vagrant up
```

# 接続情報
サーバー名：localhost
ポート：15432
データベース名：postgres
ユーザーID：postgres
パスワード：mysecretpassword
円グラフをjQueryでフェードさせながら表示

<b>円グラフをjQueryで順番にフェードさせる簡単な方法</b>です。
「jQueryに詳しくないけど動きをつけたい」という方はぜひ参考にしてください。

<h2>デモ</h2>
https://aruto-room.github.io/demo/graph.html
<h2>コード</h2>

<h3>HTML</h3>
```html

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<div class="graph">
<img src="img/graph00.png">
<img src="img/graph01.png">
<img src="img/graph02.png">
<img src="img/graph03.png">
<img src="img/graph04.png">
</div>
```
<h3>CSS</h3>
```css

.graph {
  position: relative;
}
.graph img {
  position: absolute;
  left: 0;
  top: 0;
}
.graph img:first-child {
  position: relative;
}
```
<h3>JS</h3>
```js

jQuery(function(){
	// リストを非表示
	$('.graph img').css("opacity","0");

        // 繰り返し処理
	$('.graph img').each(function(i) {
 
		// 遅延させてフェードイン
		$(this).delay(300 * i).animate({opacity:1}, 500);
        })
})
```

<h2>参考</h2>
[jQueryでli要素を順番にフェードさせながら表示する](URL "http://www.dataplan.jp/blog/jquery/203")
pythonのCSV出力で、カンマが大量発生してしまう原因

pythonのCSV出力を行う際に、カンマが大量発生してしまったりして上手くいかない事がある。
特に、複数行にわたるCSV出力を行いたい時によく遭遇する。
これは、writerowとwriterowsの使い方を間違えている事が原因。

## 出したいCSV

```
abcdeffghij
klmnopqrset
```

## よくある間違いの例１

```code1.py
import csv

output = ["abcdeffghij", "klmnopqrset"]

outf = open("test.csv", 'w', newline='')
writer = csv.writer(outf)
writer.writerow(output)
outf.close()
print("出力完了")
```

```test.csv
abcdeffghij,klmnopqrset
```

csv.writerで改行を挿入する場合は、2次元配列を使用しなければならない。
今回のoutputは1次元配列なのでwriterowで問題ないが、改行が入らず１行で出力されてしまう。

## よくある間違いの例２

```code2.py
import csv

output = ["abcdeffghij", "klmnopqrset"]

outf = open("test.csv", 'w', newline='')
writer = csv.writer(outf)
writer.writerows(output)
outf.close()
print("出力完了")
```

```test.csv
a,b,c,d,e,f,g,h,i,j
k,l,m,n,o,p,q,r,s,t
```

1次元配列に対してwriterowsを使用してしまうと、改行は挿入されるものの、各文字列に対してカンマが大量挿入されてしまう。

## 正しい例

```code3.py
import csv

output = [["abcdeffghij"], ["klmnopqrset"]]

outf = open("test.csv", 'w', newline='')
writer = csv.writer(outf)
writer.writerows(output)
outf.close()
print("出力完了")
```

```test.csv
abcdeffghij
klmnopqrset
```

writerowsを使用する場合は、対象を２次元配列にすることを忘れずに。
ちなみに、空配列を置くことで空白行も挿入する事も出来る。
linux > mail > X時間後にメールを送信する > atコマンドの使用 > 実行 | スケジュール確認 | 取消し

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

### 処理概要

- X時間後にメールを送信する

時間のかかる処理を開始して、その終了時刻あたりにメールを受け取りたい。
自分自身へのリマインダー。

処理の終了チェックを行わず、「現在時刻 + x時間」での方法を検討した。

### atコマンド

[【at】Linuxで指定した時刻にジョブを実行する](http://uxmilk.jp/53442) by MINER STUDIO, Inc. 

情報感謝です。

### 手順

1. atを起動
2. mail送信コマンドを実行
3. Ctrl+D

以下は1分後に送信する例。

```
$ at now + 1minute
at> mail -s "test mail" 7of9@software.com
at> <EOT>
job 1 at 2018-05-15 14:29
```

メールタイトルには適宜実行日時などを入れると開始時刻が分かる。

### X時間後に送信

X時間後の場合、以下で良い。

```
$ at now + 14 hours
```

### スケジュールの確認

atqコマンドを使う。

```
$ atq
2      2018-05-16 04:49 XXX
```

XXXには文字列が入る。

### 取消し

atrmコマンドを使う。
指定する番号はatqコマンドで確認する。

```
$ atrm 2
$ atq
```

上記では、削除されていることをatqコマンドで確認している。
Microsoft Graph を使ってみよう : 概要

# Microsoft Graph とは

Microsoft のサービスである Office 365 や Azure AD など、様々なサービスのデータをグラフ形式で扱えるエンドポイントです。グラフ形式でデータを扱えるので、「自分の予定」や「自分の上司」などデータを関連から取得できます。

<img src="https://cdn.graph.office.net/prod/GraphDocuments\ja-jp\concepts\images/microsoft_graph.png" alt="Graph の一部である主要なリソースとリレーションシップを示すイメージ" class="x-hidden-focus">

Microsoft Graph は以下のような機能を提供します。

- 単一の API (https://graph.microsoft.com) を提供
- 共通の認証方式
- 業界標準の REST/OData/JSON/OAuth での開発が可能
- ユーザー認証およびアプリケーション認証のサポート
- グラフ形式でのデータアクセス
- データの CRUD (作成、読み取り、更新、削除)、ページング、バッチ処理、関数実行などをサポート
- 関連の高い人やドキュメントのトレンドなど、インテリジェントなデータを取得可能
- 変更履歴の取得をサポート
- カスタムデータの追加が可能
- Office 365 の使用状況などが分かるレポート機能
- 複数言語をサポート、また各種 SDK とサンプル
- Graph エクスプローラー: GUI で簡単に試せるツール

# バージョン

現在 Microsoft Graph は以下のバージョンが利用できます。

**ベータ版**

- https://graph.microsoft.com/beta で公開
- プレビュー段階の機能を提供
- 随時重大な変更が発生する可能性があるため、本番利用は非推奨
- 現行バージョンに採用されるかは未定

**一般提供バージョン**

- 現在は v1.0 として https://graph.microsoft.com/v1.0 で公開
- 本番環境で利用が可能

**※サポートライフサイクル**

[Microsoft Graph のバージョン管理、サポートと重大な変更の方針](https://developer.microsoft.com/ja-jp/graph/docs/concepts/versioning_and_support) を参照。

# Microsoft Graph で扱えるサービスやデータセット

現時点で既に非常に多くのサービスやデータセットをサポートしています。また今後もどんどん追加される予定です。このブログでも主なものは紹介していきます。

- ユーザーおよびグループ
- Outlook (予定表、メール、タスク)
- OneDrive
- OneNote
- Excel
- Microsoft Teams
- プランナー
- SharePoint
- Azure AD
- Intune
- Microsoft ブッキング
- ソーシャルインテリジェンス
- インサイト
- クロスデバイスエクスペリエンス
- セキュリティ関連
- レポート

# 連携するサービス

各種言語の SDK があるだけでなく、Microsoft の各種サービスとも連携が可能です。以下に一例を紹介します。

- PowerApps : Graph 用のテンプレートが提供されます
- Flow : 各種リソースの操作がコードレスで行えます
- Azure Function : Graph 用のバインディング
- Bot Framework : Azure AD 用のコネクター

# まとめ
Microsoft Graph は、ただ Office 365/Windows 10/EMS のデータ操作ができるだけではなく、拡張することでカスタマイズしたり、インテリジェントな機能やクロスデバイス体験サポートなど、次々と新機能を提供してきていますので、開発者にとっても目が離せない API だと感じます。

[目次に戻る](https://qiita.com/kenakamu/items/6a1ca508dc093779eefa)

# 参照
[Microsoft Graph の概要 オフィシャルドキュメント](https://developer.microsoft.com/ja-jp/graph/docs/concepts/overview)
[Graph エクスプローラー](https://developer.microsoft.com/ja-jp/graph/graph-explorer)
[Microsoft Graph: Connect to essential data every app needs : Build 2018 (英語)](https://www.youtube.com/watch?v=05HGIjpuTww&t=2171s)
Laravel5.5でパスワードリセット後のログイン認証に失敗する

Laravel5.5でパスワードリセット後のログイン認証に失敗したのでメモします

## 原因

パスワードのリセット時に、`User.php`で定義している`sertPasswordAttribute()`とパスワードリセット時に通過する`resetPassword()`関数で二重にハッシュ化されているのが問題でした

```php:User.php
    // こっちは自分で実装しました
    public function setPasswordAttribute($value = '')
    {
        $this->attributes['password'] = Hash::make($password);
    }
```



```php:ResetPasswords.php

    /**
     * Reset the given user's password.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @param  string  $password
     * @return void
     */
    protected function resetPassword($user, $password)
    {
        $user->password = Hash::make($password);

        $user->setRememberToken(Str::random(60));

        $user->save();

        event(new PasswordReset($user));

        $this->guard()->login($user);
    }
```

## 解決方法

幸いにもトレイトを利用して実装されていたので`ResetPasswordController.php`の中で`resetPassword()`をオーバーライドしましょう

```php:ResetPasswordController.php

    /**
     * Reset the given user's password.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @param  string  $password
     * @return void
     */
    protected function resetPassword($user, $password)
    {
        $user->password = $password;

        $user->setRememberToken(Str::random(60));

        $user->save();

        event(new PasswordReset($user));

        $this->guard()->login($user);
    }
```

これでうまくいくはず！同じ現象で困っていてうまくいかない人はコメントください(´ε｀ )

## 余談

2015年のIssueですが、当時話題に上がってたようです

[setPasswordAttribute conflicts with password reset process](https://github.com/laravel/framework/issues/8287)
GitLabからGitLabへのプロジェクトexport/import時にハマった話

# はじめに
システム保守移管で元々使っていたGitLabから別のGitLabへプロジェクトをそっくりそのまま移動したくなった。
GitLabバージョン8.9から実装された、[プロジェクトのexport/import機能](https://gitlab.com/help/user/project/settings/import_export.md)を使ってやろうとするといくつかハマりポイントがあったのでまとめる。
※ 記事記載時の最新の

# その1「GitLabバージョンの差異」
GitLabにはバージョンとは別にexport/importバージョンがあり、export/importバージョンが違うGitLabの移管はできない。
（後方互換性があるかは不明）
もし移管先のexport/importバージョンが古い場合はGitLabのバージョンアップが必要

[GitLabバージョンとexport/importバージョンの対応](https://gitlab.com/help/user/project/settings/import_export.md)

# その2「binaryファイルのマージリクエストがあると、importできない」
importしたいプロジェクトのマージリクエストにbinaryファイルのマージリクエストがあると、下記エラーとなる。
Error importing repository  into hogehoge - invalid base64
対処法は、exportで作成されたtar.gzのアーカイブを解凍して、中にあるproject.jsonを変更する必要がある。

```package.json
"merge_requests": [
    "merge_request_diff": [
        "merge_request_diff_files": [
        ...,
        {
            "binary":"true"
        },
        ...
        ]
    ]
]

```

"binary":"true"となっているmerge_request_diff_filesをごっそり削除。

[参考](https://gitlab.com/gitlab-org/gitlab-ee/issues/5642)

# その3「文字化けしてるファイルがあるとimportできない」
windows備え付けの解凍/圧縮ツールで、exportされたアーカイブをそのまま解凍すると、日本語名のファイルのファイル名が文字化けすることがある。
そのままimportしようとするとファイル名が長すぎるためimportできないエラーとなる。7-zipを使うか、windowsアップデートにて文字化けを回避する必要がある。

[参考](https://www.petitmonte.com/internet_blog/zip_garbled_characters.html)

# その他
[GitLabサーバのメモリが少ないとexportできない](https://qiita.com/tetsukay/items/9144b1ea1c7269a138d8)
a-blog cmsのエントリー位置リストの距離表示を最適化する校正オプション

a-blog cmsには、各エントリーに登録した位置情報に基づいて、近い距離順でエントリーの一覧を表示する、「**エントリー位置リスト（Entry_GeoList）**」モジュールがあります。

<img width="240" alt="acms_corrector.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/21117/e6a7ef50-b6fd-660a-d0ea-309a9ba102e9.jpeg">

このモジュールでは、現在地からの距離を表示する変数「**{geo_distance}**」が使用できますが、バージョン2.8の時点では、表示はメートル単位での半角数字となるため、長距離の場合は距離感がわかりづらくなります。

一般にはJavaScriptを使用して動的に整形することが多いのですが、PHPで文字列を整形する「校正オプション」を自作して、以下のルールで自動表示する校正オプションを作ってみました。

- 1,000m未満では、そのまま「m」で表示
- 1,000m以上では、小数点第一位に変換して「km」で表示

## 校正オプションを作る

以下のパスに格納されている、追加校正オプションの定義ファイルをテキストエディタで開きます。

**2.8系以降**
（a-blog cmsを設置したパス）/extension/acms/Corrector.php

**2.8系以前**
（a-blog cmsを設置したパス）/php/ACMS/User/Corrector.php

Corrector.phpでは、「ACMS_User_Corrector」クラス内に文字列を加工する処理を書きます。

```php
class ACMS_User_Corrector
{
// ここに校正オプションを書くと追加される
}
```

距離変換を行う処理は以下の通りです。

校正オプションと同じ名前の関数を作成し、第一引数に「$txt」を指定すると、そこに対象となる文字列が入るので、加工してreturnで返すだけです。

引数を指定する校正オプションを作成する場合は、「未指定の場合の初期値」を設けてやると親切です。

```php:acms_corrector.php
class ACMS_User_Corrector
{

    /**
     * distance
     * 数値を距離に変換する
     *
     * @param  string $txt  - 校正オプションが適用されている文字列
     * @return string       - 校正後の文字列
     */
    public static function distance($txt, $args = array())
    {
        // 例 {var}[distance(2)]
        // {var}は強制的に数値に変換される
        // 1000未満の場合は単位がm
        // 1000以上の場合は単位がkm
        // 引数: 丸める小数点の位、指定なしの場合は1

        $round = isset($args[0]) ? (int)$args[0] : (int)1;

        if ( (float)$txt >= 1000 ) {
            return round( ( (float)$txt / 1000 ) , $round ) . 'km';
        } else {
            return $txt . 'm';
        }

    }

}
```

## テーマ側に校正オプションを反映する

校正オプションができたら、{geo_distance}の後ろに校正オプションを追加します。

```
{geo_distance}[distance]
```

冒頭の画像のように距離が表示されていれば問題ありません。

----

a-blog cmsはデフォルトの段階で多彩な校正オプションが実装されているため、自作する機会はあまり多くありませんが、コンテンツによって柔軟な出力を行いたいときに、自作をするといろいろ捗ります。

https://developer.a-blogcms.jp/document/reference/proofreading.html
nvidia-dockerで機械学習環境を構築してPyCharmのインタープリタとして使う

機械学習環境構築時の覚え書きです。
Dockerに慣れていないので、おかしいところがあればご指摘お願いします。

# 動機

UbuntuでGPUを使って機械学習をしたいが、ライブラリによって要求するCUDAとcuDNNのバージョンが違ってつらいのをDockerでどうにかしたい。
慣れたエディタ(PyCharm)からDockerの開発環境を使いたい。

# やったこと

- グラボのドライバを入れる
- Dockerを入れる
- nvidia-dockerを入れる
- NVIDIAのDockerイメージをベースにDockerfileを書く
- DockerfileからDockerイメージを作る
- コンテナを立ち上げる
- 作業ディレクトリをマウントしてみる
- (おまけ) DockerコンテナをPyCharmのインタプリタにする

## ホスト側の環境

- GTX 1080
- Ubuntu 16.04
- NVIDIA-SMI: 384.111
- Docker: 18.03
- nvidia-docker: 2.0.3

## Docker側の環境

- CUDA 9.0
- cuDNN 7
- Python: 3.5.2
- tensorflow-gpu: 1.8.0
- keras: 2.1.6

## グラボのドライバを入れる

下のNVIDIAのサイトでGPUに対応するドライバのバージョンを調べてインストールする。

http://www.nvidia.co.jp/Download/index.aspx?lang=jp

## Dockerを入れる
公式サイトを見ながらUbuntu用のDockerをインストールしました。

https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository

## nvidia-dockerを入れる

DockerでGPUを扱うには、nvidia-dockerを使う必要があるらしいので、こちらもインストールします。

https://github.com/nvidia/nvidia-docker/wiki/Installation-(version-2.0)

## NVIDIAのDockerイメージをベースにDockerfileを書く

今回はCUDA9.0で構築したいので、下記のようなDockerfileになりました。
KerasとTensorflowとPythonをインストールしています。

```:Dockerfile
FROM nvidia/cuda:9.0-cudnn7-runtime

RUN apt-get update
RUN apt-get -y install python3-pip curl
RUN pip3 install keras tensorflow-gpu
```

## DockerfileからDockerイメージを作る

Dockerfileのあるディレクトリで以下を実行します。
mykerasimageは任意の名前です。

```
sudo nvidia-docker build -t mykerasimage .
```

しばらく時間がかかります。
終わったら以下のコマンドで確認します。

```
sudo docker images
```


## コンテナを立ち上げる

nvidia-dockerを使ってコンテナを立ち上げます。
Docker上でGPUを正しく認識していることを確認します。

```
sudo nvidia-docker run mykerasimage nvidia-smi
```

## 作業ディレクトリをマウントしてみる

以下のコマンドでコンテナのbashに入ることができます。

```
nvidia-docker run -v ホスト側のマウントしたいディレクトリのパス:コンテナ内のマウントしたいディレクトリのパス -i -t mykerasimage  /bin/bash
```

## DockerコンテナをPyCharmのインタプリタにする

https://qiita.com/DQNEO/items/da5df074c48b012152ee

こちらを実行してユーザをDockerグループに追加して再起動してからでないと権限周りでエラーになりました。

![Screenshot from 2018-05-15 20-40-54.png](https://qiita-image-store.s3.amazonaws.com/0/184968/16e8e88c-c0f6-a968-266d-5688565d3b38.png)

こちらの画面でUnix socketを選択して問題なければ、好きなイメージをPythonのインタプリタとして使用できます。
GitBookに楽譜(MusicXML)を埋め込む


<img width="840" alt="Screen Shot 2018-05-15 at 12.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/186574/0e854f2b-df58-dcac-f7ba-ef9aba4a064f.png">

`GitBook` に `MusicXML` を埋め込むというのを試してみたので紹介。

`MusicXML`は`Finale`や`Sibelius`などのミュージックノーテーションソフトなら大体対応しているフォーマットなので、`MusicXML`が`GitBook`でそのまま扱えれば楽譜ファイルは`MusicXML`だけ管理すればいいことになるので非常によさそうです。

## 設定

難しいことは特にする必要がなく、[gitbook-plugin-musicxml](https://github.com/ymcatar/gitbook-plugin-musicxml) というプラグインがあるので、インストールするだけです。

`boook.json` の `plugins` に `musicxml` を追加。

```json
{
  "plugins": ["musicxml"]
}
```

インストールを実行

```bash
$ gitbook install
```

## 使い方

書式はこのような感じです。

```
{% musicxml %}xmlファイルのパスを指定{% endmusicxml %}
```

パスはrootからの相対パスで指定します。

`GitBookディレクトリ/assets/musicxml/myscore.xml` にファイルがあれば、
`{% musicxml %}assets/musicxml/myscore.xml{% endmusicxml %}` という感じです。

実際に作ってみるとこんな感じになります。

```markdown:README.md
# MusicXML with GitBook

MusicXML を GitBook で表示させるとこのようになります。

{% musicxml %}assets/musicxml/myscore.xml{% endmusicxml %}

カンタンですね。
```

```xml:assets/musicxml/myscore.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.1 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
<score-partwise version="3.1">
  <work>
    <work-number>UWV. 911</work-number>
    <work-title>just Do it.</work-title>
  </work>
  <part-list>
    <score-part id="P1">
      <part-name>pf</part-name>
    </score-part>
  </part-list>
  <part id="P1">
    <measure number="1">
      <attributes>
        <divisions>1</divisions>
        <key>
          <fifths>0</fifths>
        </key>
        <time>
          <beats>4</beats>
          <beat-type>4</beat-type>
        </time>
        <clef>
          <sign>G</sign>
          <line>2</line>
        </clef>
      </attributes>
      <note>
        <pitch>
          <step>C</step>
          <octave>4</octave>
        </pitch>
        <duration>4</duration>
        <type>whole</type>
      </note>
    </measure>
  </part>
</score-partwise>
```

`$ gitbook serve` して `http://localhost:4000` をひらくと

<img width="840" alt="Screen Shot 2018-05-15 at 12.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/186574/8f5a88e8-dcdf-e4df-74c1-c4390eb3b35e.png">

うまくいきました。

やってみて分かったのですが、現在は`PDF`や`ePub`、`mobi`などの出力には対応していません（対応する気配はなさそう）。

<img width="840" alt="Screen Shot 2018-05-15 at 13.03.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/186574/7838f787-591f-8d20-c6a3-5fdee40fcbee.png">

↑このように何もなかったことのようになる。

最近のミュージックノーテーションソフトなら`SVG`出力に対応しているので、`PDF`などに出力したい場合は`SVG`ファイルを埋め込むのが良さそうかなという感じです。
ただ、やはり楽譜ファイルと画像ファイル両方を管理しないといけないと言うのはスマートじゃないですよね。

なにか良い方法を知っている方は教えてくださると嬉しいです。