OmniAICreator/Qiita-1.07M huggingface dataset:
Ｃｏｍｐｏｓｅｒに用いられているバージョン定義

本文は https://getcomposer.org/doc/articles/versions.md　に関するノートみたいなものです。

# バージョンの定義

Composer には、バージョンが数種類ありますが、よくあるものは、数字と点とタグの合わせたもの、及びブランチであります。例として、`v1.0`、`1.3.4`、`2.0-alpha`、`dev-master`などであります。先導の`v`は消し去り、ブランチ名の前に`dev-`を加えるなど特殊な規則もあります。[数字と点は三段まで使うが通常です、「バージョンナンバーは、メジャー.マイナー.パッチとし」ています](http://semver.org/lang/ja/)。

#　バージョンの指定

## 精確

もちろん、精確なバージョン名は、唯一存在するバージョンに繋がります。

## 比較

バージョンの先後関係が数字で比較できる場合（むしろこれは通常だとおもいます）は、比較演算子を使うが可能です。

    >=1.0
    >=1.0 <2.0
    >=1.0 <1.1 || >=1.2

それぞれ使えます。しかし個人的にあまり使わないと感じます。

## 短横線

二つのバージョン名を短横線によって組み合わせることもあります。短横線の両側のバージョンは含まれています。

    1.0 - 2.0 →　つまり >=1.0.0 <2.1 の意味、2.0 は 2.0.*　になる。
    1.0.0 - 2.1.0　→ つまり >=1.0.0 <=2.1.0　の意味。

## 任意

スターマークは任意としまします。

    1.0.* →　つまり >=1.0 <1.1　。

## 波線

波線は、このバージョンは最低バージョンとして、また次の通常バージョン（メジャーやマイナーが可能）以下とします。

    ~1.2　→ つまり >=1.2 <2.0.0　。 
    ~1.2.3 →　つまり >=1.2.3 <1.3.0　。

## キャレット

キャレットは次のメジャー以下を示します。

    ^1.2.3 →　つまり >=1.2.3 <2.0.0　。

だが、`1.0` 以前はマイナーとします。

    ^0.3 →　つまり >=0.3.0 <0.4.0　。
kibana(ELK)でユーザーやグループ毎に見せる/見せないをコントロールする。

# 概要
いわゆるRBACの機能をKibana/Elasticsearchに実装する。

各サーバからfluentdなどを使い、各ログをログサーバに送り、
ログサーバで適切な形でDB(Elasticsearch)に保存、
Kibanaで可視化というのは非常に多くの会社で実装していると思うが、
Kibanaはデフォルトでは現状、認証・認可やセキュリティ対策のような機能は実装されていない。

その為、Shieldなど有償のプラグインを使って補う事が一般的だが、
今回は無料のプラグインであるsearch-guardを使ってポリシーベースで
ユーザーやグループに見せる/見せないをコントロールする。

# search-guardとは
Kibana/Elasticsearchのセキュリティーを強化するツール。
この機能を使うことでRBACはもちろんLDAP認証も可能になる
ただし、2017年7月時点で日本での知名度はほぼなく、
日本語のドキュメントはほとんど存在しない。

https://floragunn.com/


# 前提

既にELK環境が構築できているものとする。

# 導入手順
## elasticsearchのプラグインを導入

installするプラグインのバージョンは環境に寄って違うので適宜Kibana/Elasticsearchのバージョンとあわせる

``` command
/usr/share/elasticsearch/bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.4.2-12
cd /usr/share/elasticsearch/plugins/search-guard-5/tools
sh install_demo_configuration.sh
sh sgadmin_demo.sh
```

## kibanaのプラグインを導入

``` command
cd /tmp/
wget https://github.com/floragunncom/search-guard-kibana-plugin/releases/download/v5.4.2-3/searchguard-kibana-5.4.2-3.zip
/usr/share/kibana/bin/kibana-plugin install file:///tmp/searchguard-kibana-5.4.2-3.zip
```

## kibanaのプラグインを編集

vi /etc/kibana/kibana.yml
以下追加

``` command
elasticsearch.username: "kibanaserver"
elasticsearch.password: "kibanaserver"
elasticsearch.url: "https://localhost:9200"
elasticsearch.ssl.verificationMode: none
```

jksファイルをコピー

``` command
cp -p /etc/elasticsearch/truststore.jks /etc/logstash/truststore.jks
```

## elasticsearchでロールを作成
vi /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_roles.yml

以下追加

``` comamnd
sg_readonly_nginx:
  cluster:
    - CLUSTER_COMPOSITE_OPS_RO
  indices:
    'messages-*':
      '*':
        - READ
    '?kibana':
      '*':
        - INDICES_ALL
```


# 権限登録

グループを作り、権限を付与する。
今回はあくまでも例なのでここで登録するグループ、権限は以下の通りとする。

インデックス単位で権限をコントロールすることができる。
sg_readonly_nginxグループではnginx-*のインデックスのみ参照が可能なグループ。
sg_readonly_nginxグループにはtsukadaユーザーが属すこととする。


## ユーザー作成

``` commands
$ /usr/share/elasticsearch/plugins/search-guard-5/tools/hash.sh
[Password:]
$2a$12$MiyI73Dpa3qbajPW05ZYVOsSF93TdOBAfPciCTgwnbXS/fw2ok1YO
$
```
出力されたハッシュをコピーして以下のファイルに追加する
vi /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_internal_users.yml

``` commands
tsukada:
  hash: $2a$12$MiyI73Dpa3qbajPW05ZYVOsSF93TdOBAfPciCTgwnbXS/fw2ok1YO
```

## グループ作成、ユーザー設定
sg_readonly_nginxグループにはtsukadaユーザーが属する。

vi /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_roles_mapping.yml
以下追加する

``` commands
sg_readonly_nginx:
  users:
    - tsukada
```

## グループに権限を設定 

インデックス単位で権限をコントロールすることができる。
sg_readonly_nginxグループ
nginx-*のインデックスのみ参照が可能。書き込み負荷のグループ

vi /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_roles.yml
以下追加する

``` commands
sg_readonly_nginx:
  cluster:
    - CLUSTER_COMPOSITE_OPS_RO
  indices:
    'nginx-*':
      '*':
        - READ
    '?kibana':
      '*':
        - INDICES_ALL
```

## 反映
登録完了後、以下のスクリプトを実効する。

``` commands
/usr/share/elasticsearch/plugins/search-guard-5/tools/sgadmin_demo.sh
```
CSS3のbackground-clipプロパティって知ってた？

いや～私は知りませんでした。
背景画像の表示領域を設定するCSSのプロパティ値です。

#background-clip プロパティ

```css:style.css
div {
	background: url("bg.jpg") no-repeat center; /*背景画像*/
	width: 210px;
	height: 360px;
	padding: 25px; /*パディング*/
	border: double 20px #CCC; /*ボーダー部分を分かりやすくするため二重線に*/
}
	
#border-box{
	background-clip: border-box;
}
#padding-box{
	background-clip: padding-box;
}
#content-box{
	background-clip: content-box;
}
	
h1{
	color: #FFF;
}

```

##表示例
確認環境：Chrome59
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/777329dd-9a88-11cb-1113-1abd85b8f563.png)

| プロパティ値 | 適応範囲 |
|:--|:--|
| border-box  | border領域を含む範囲（初期値）  |
| padding-box  | padding領域を含む範囲  |
| content-box  | padding領域も含まない、内容部分のみに表示  |

border領域を分かりやすくするためにかなり太目に取っていますが、モデル化するとこんな感じかな？
「コンテンツ内容」の文章と、contentの間には文字のpaddingが利いてることになりますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/95cf797c-de79-791c-b2df-4aad9e7ff077.png)


#所感とか
コンテンツ内容にpadding掛けたり応用方法はいろいろありそうですね。
こんな感じとかも出来るみたいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/ac4f9f96-2897-cd22-71c5-1320770ce37a.png)


#参考書籍
[HTML5プロフェッショナル認定試験 レベル1 対策テキスト＆問題集（マイナビ）』](https://book.mynavi.jp/ec/products/detail/id=38366)
Kotlin:関数引数を使ってRxJavaのObserverの実装を簡潔にしてみた

# はじめに
KotlinではJavaではできなかった関数を引数に持つ、ということができる。
RxJava系を色々使ってる時にこれを使ってObserverの実装をCoolに書けたので紹介(注：個人の感想です)

# えっ、まだObserverのオーバーライド全部書いているんですか！？
まずは[こちら](http://qiita.com/chooblarin/items/1cb6a58f6e52b8792c52)のサンプルをkotlinに変換したもの(説明の都合上、一部修正)

```kotlin:Observerのサンプル
fun someMethod() {
            val names = arrayOf("Ben", "George")

            Observable.from(names).subscribe(object : Observer<String>() {
                fun onCompleted() {
                }

                fun onError(e: Throwable) {
                }

                fun onNext(s: String) {
                    println("Hello, $s!")
                }
            })
}
```

なんらかのデータをsubscribeして、ObserverのonComplete,onError,onNextをそれぞれオーバーライドしている。
もちろんこれでも問題ないが、実際の実装では大半がonNextだけを実装して、onErrorはせいぜいログ出力、onCompletedに至っては空実装、なんてことはないだろうか。
そしてそんなムダなコードをObserver毎に実装してないだろうか。

## それ、関数引数で解決できるよ
で、登場するのが以下の関数

```kotlin:DefaultObserver.kt
class DefaultObserver<T>(val next:(T)->Unit = {},
                                        val error:(Throwable)->Unit = {},
                                        val completed:()->Unit = {}) : Observer<T>() {
    override fun onNext(t: T): Unit = next(t)

    override fun onError(e: Throwable): Unit = error(e)

    override fun onCompleted(): Unit = completed()
}
```

最大のポイントはプライマリコンストラクタのnext,error,completedの変数。
これらがそれぞれonNext,onError,onCompletedと同じ型と引数を持つ変数になっているので、onNextらに代入できる。
さらにデフォルト値として空関数をセットしている。これにより実装しなければ何もしない、ということが実現できる。
もちろん、errorのデフォルト引数でログ出力などしても良いだろう。


で、肝心の使うとどうなるか。

```kotlin:DefaultObserber使ってみた
fun someMethod() {
    val names = arrayOf("Ben", "George")
    Observable.from(names).subscribe(DefaultObserver<String>(next = {println("Hello, $it!")}))
}
```

実装したのは必要最小限の`next = {println("Hello, $it!")}`だけ。使わないonCompletedやonErrorの実装は記載していないのでデフォルトの空実装が呼ばれるようになる。
加えて`object : ~~`といった、情報として意味を持たない実装も消せるところがポイント。

可読性も上がるし、コード量も減るのでかなりオススメです。
systemdでサービスを動かす際、/var/runにディレクトリを作った時の落とし穴と対策

# 環境
```
CentOS 7
```

# どんな状況？
* systemdでサービスを起動したい。
* その時の実行権限がrootじゃない。
* 故に `/var/run/[dir]` を作成。
    * もちろん `chown` で[dir]の権限を実行ユーザにしている。
* 作成した[dir]に、pidファイルやsockファイルが作られたりする。

# 何が問題？
* CentOS 7 は、rebootした時、`/var/run`配下を全部消す
* 参考 : [お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ](http://qiita.com/suemoc/items/e29285e8e67263298f35)
* 次回起動したら、前回作成したディレクトリが無いので、エラー

# 対策
/etc/systemd/system/[サービス名].service

```
PermissionsStartOnly=true
ExecStartPre=/usr/bin/mkdir /var/run/[dir]
ExecStartPre=/usr/bin/chown -R [実行ユーザ]:[実行グループ] /var/run/[dir]
ExecStopPost=/usr/bin/rm -rf /var/run/[dir]
```
サービス起動前に[dir]を作成
サービス終了時に[dir]を削除(次回起動時にエラーになるため)
参考 : [Handling /var/run with systemd](https://blog.hqcodeshop.fi/archives/93-Handling-varrun-with-systemd.html)
参考 : [Systemd入門(4) - serviceタイプUnitの設定ファイル](http://enakai00.hatenablog.com/entry/20130917/1379374797)
gem パッケージの作り方と Rubygems.org への公開方法

久しぶりに Ruby を触ったら完全に忘れていたのでメモです。

### 前提

gemspec ファイルがすでに存在していること。
無い場合は gemspec の書き方を検索して下さい。

### .gem ファイルを生成する

```bash
gem build product_name.gemspec
```

pkg ディレクトリ配下に product_name-n.n.n.gem が生成されます。
gem install コマンドの引数にこのファイルを指定するとローカルにインストールできます。

### インターネットに公開する

```bash
gem push product_name-n.n.n.gem
```

Rubygems.org の ID とパスワードを質問されるので入力します。
成功するとファイルがアップロードされ、インターネットに公開されます。

### おまけ

Jeweler というツールで .gemspec ファイルの自動生成もできます。

[参考]
http://qiita.com/riocampos/items/c7cbdc36eba156f573d2

この記事の目的はとにかくシンプルに .gem パッケージを生成し公開したい方法の備忘メモです。
CSSで同じ種類の要素のうち、特定の要素だけ適用しない方法。

<h1>概要</h1>
例えばページ内のdiv全部に適用しているスタイルがあるけど、
このひとつだけは適用したくない！
というときがありませんか？
そんなときに使える方法をご紹介します。

<h1>内容</h1>
否定擬似クラス":not"を使います。
divのうち、クラスが指定してあるものは適用しない例で書いてみます。
スペースが入ると効かなかったりするので、注意してください。

```
div:not([class]) {
    width:300px;
    margin-bottom:20px;
}
```

クラス名で指定したければ、こう書きます。

```
div:not([class="test"]) {
    width:300px;
    margin-bottom:20px;
}
```

全てのulの中のliに適用したいが、クラスが指定してあるulの方には適用しない場合などは、
このように":not"のあとに記せばOKです。

```
ul:not([class]) li {
    width:150px;  
    margin: 0px;
    background-color:#ff0000;
}
```


<h1>まとめ</h1>
最初からクラス指定でスタイルを書いてあれば問題ないのですが、
あとから、ここだけ適用させたくない！
いままでのページ全部クラスに置き換えるの大変...
なんてときに使えますね！
"!important"で書き換えることはできますが、
無しにしたいときの手段が思いつかず、この方法になりました。

アコーディオンを実装していて、全ページの中身のdivを"display:none"にしてたけど、
1ヶ所だけ表示している状態からスタートの仕様にしたかったときに、
大変困っていたので...

そんな体験からこの方法を見つけました。
SSHで一気にコマンドいろいろ投げたい

###memo
パスなしSSHログインできるよう準備が必要。(そこは略）

```bash:sample1
ssh user@hostname1 "mkdir /tmp/dir"
```

コマンドのecho出ないし標準出力に吐くコマンドじゃないと正常終了かどうかわかりにくい。（なのでSSHしたらhostnameを打っておく。）でもエラーの時はメッセージ出る。
複数のコマンドを一気に投げたい場合。（シェルスクリプトを作成してscpで飛ばして実行でもよいけど）
testも書ける。

```bash:sample2
-bash $ ssh user@hostname1 <<EOC
hostname
cd /tmp
if [ -d dir ]; then
  rm -rf dir
fi
mkdir dir
EOC
```

```bash:sample2-1
-bash $ ssh user@hostname1 "cd /tmp;rm -rf dir;mkdir dir"
```

複数のコマンドを複数ホストに一気に投げたい場合はforで回す。

```bash:sample3
#!/bin/bash
HOSTS="hostname1 hostname2 hostname3"
for i in ${HOSTS}; do
ssh user@$i <<EOC
hostname
cd /tmp
if [ -d dir ]; then
  rm -rf dir
fi
mkdir dir
EOC
done
```

sudoを使おうとすると怒られる(sudoの設定による)ときは -t を使う。

```bash:sample4
ssh -t user@hostname1 "sudo mkdir /tmp/dir"
```

###これなに？
サーバいっぱいでSSHで入って同じコマンド投げるの大変なときや、インスタントに投げるのに使える。窓たくさん開きたくない。
特定の列を見て、条件に合ったら横一列に色を塗る

よく使いそうなので個人メモ。

スプレッドシートではしばしばxx管理一覧を作成するが、
条件付き書式では、とある列を見て横一列の色を替えることができなかったので、
今回はL列(確認者欄)に名前が入ったら列をクローズするスクリプトを作成。

```
function coloring() {
  var spreadSheet = SpreadsheetApp.openById("スプレッドシートID");
  var targetSheet = spreadSheet.getSheetByName("シート名");
  
  // 今回はB4:Mxxx(最大row数)を対象にしたかったので、それを指定
  var values = targetSheet.getRange(4, 2, targetSheet.getLastRow(), 12).getValues();
  for (var i = 0; i < values.length; i++) {
    // B列が空だったら処理を終わる
    if (values[i][0] == "") {
      Logger.log("break row: " + i);
      break;
    }
    // L列が空ではない場合該当行の4〜12列をグレー背景
    if (values[i][10] != "") {
      targetSheet.getRange(i + 4, 2, 1, 12).setBackground("#6E6E6E");
    } 
  }
}
```

１シート５００行くらいでも、`targetSheet.getRange("B５").getValue()` を多用すると、
処理が１，２分に返ってこないようになってしまう。

`targetSheet.getRange("B５:M500").getValues()`を使用して、配列をloopすると２秒くらいで終わるぽい。
Bitbucketからの"git pull"に失敗する

## git pull したらこんなエラーが発生した
```
remote: Invalid username or password. If you log in via a third party service you must ensure you have an account password set in your account profile.
fatal: Authentication failed for 'https://XXXXXXXX@bitbucket.org/XXXXX/XXXXX.git/'
```

## 原因
Bitbuckethaはユーザー名を変更すると、アカウント名でログインできなくなり、メールアドレスでしかログインできなくなります。
このブランチはユーザー名変更前に`git clone`していたので、当時のログイン情報（アカウント名）でアクセスしていたのが原因でした。

※`ユーザー名`はユーザーが任意に変更できるやつ
※`アカウント名`は最初に発行されて変更できないやつ（Bitbucket内ではフルネームと言われる）
※他の原因の場合もあるので必ずしもこれが原因とは限らないです

## 対処
`git pull`した時のアカウント情報を更新して、正しいログイン情報を設定します。

### 手順１
`.git/config`から、アカウント名（username@）を削除します

```
[remote "origin"]
	url = https://username@bitbucket.org/XXXXX/XXXXX.git
```
↓

```
[remote "origin"]
	url = https://bitbucket.org/XXXXX/XXXXX.git
```

### 手順２
もう一度`git pull`を実行して認証

このとき、`username`はBitbucketにログインできるものでなければいけません。
Bitbucketでは、ユーザー名を変更すると**メールアドレスでしかログインできなくなる**ので、`username`には**メールアドレスを入力します**

```
$ git pull
Username for 'https://bitbucket.org': XXXXX@example.co.jp　　　　←メールアドレス！
Password for 'https://XXXXX@example.co.jp@bitbucket.org':
```

これで、無事`git pull`ができるようになります！
AnsibleでIPアドレスの4オクテット目をserver_idにする

特に知らなくても気にしなくてもid重複事件が起きないように靴屋の小人的にデフォルトに設定しておきたい用途の備忘録。

roles/mysqld/defaults/main.ymlとかに

```
server_id: "{{ ansible_default_ipv4.address.split('.')[3]}}"
```

と書いとく。
で、roles/mysqld/templates/my.cnf.j2 とかに

```
server-id = {{ server_id }}
```
とかいとく。
上書きしたいならinventoryのhost_varsとかにホスト毎に一意になるように定義しとく。

変数の順位はここらに書いてあった
http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

```
注意
どのセクションでも、varを再定義すると前のインスタンスが上書きされます。複数のグループに同じ変数がある場合は、最後にロードされたグループが優先されます。プレイのvars：セクションで変数を2回定義すると、2番目の変数が勝ちます。
```

優先度のあたりの注意書きのとおり、グループ（webとかdbとかのインベントリでセクションわけてグループ化してるやつ）違うのに同時に動かすのはだめっぽくてsite.yml一個でなくグループ毎にplaybook作ってvars_fileをグループ用の指定して動かすのが無難というか同時に動かすと本当に最後に読まれた値になってた。
http://dev.classmethod.jp/server-side/ansible/ansible-inventory-pattern/

chefだとこんなんしていた
http://qiita.com/smallpalace/items/157bd0fc9be9b3c4464c

ipaddressフィルタ(netaddr)というのがありよくマニュアルをみたらこのモジュールはサブネットマスク刈込してくれるかipv4からv6に変換って感じでオクテット分割はしてくれなかった。
http://docs.ansible.com/ansible/playbooks_filters_ipaddr.html

参考：
http://qiita.com/yteraoka/items/7119d4e1e2f8faddfb64
http://docs.ansible.com/ansible/playbooks_loops.html
http://docs.ansible.com/ansible/playbooks_variables.html
https://stackoverflow.com/questions/25470712/ansible-replace-the-host-part-of-an-ipv4-address
http://docs.ansible.com/ansible/playbooks_filters_ipaddr.html

いっぱいあって絶対かぶらせたくないみたいな話の場合（需要があるかアレですが）足したり掛けたりするとよさそうです。

```
server_id: "{{ ansible_default_ipv4.address.split('.')[2]|int * ansible_default_ipv4.address.split('.')[3]|int }}"
```
[servier_idの範囲は1=65535みたい](http://nippondanji.blogspot.com/2009/05/mysql.html)なので、`255 * 255`で掛けても大丈夫そう。
《Brackets》Brackets 1.10にアップデートしたら動かないときの対処法。


## 原因

Brackets1.10ではマルチエンコーディングに対応するようになりました。
そこで、以前までの他エンコーディングに対応するための定番プラグイン「brackets-shizimily-multiencoding」が競合を起こして、
Bracketsが起動出来なくなってしまいます。

## 対応策

なので、削除しましょう。
ぼくのMacOS環境だと、

```

/Users/[ユーザー名]/Library/Application\ Support/Brackets/extensions/user/brackets-shizimily-multiencoding/

```

という場所に格納されていました。

おわります。
Postmanで楽にログインできる Postman Intercepterには罠がある

## 対象者
APIのログイン周りのリクエスト等を楽にしたいと思っている人
Chromeに複数のユーザでログインしてる人

## 環境
Postman for Chrome v5.0.2
Postman Interceptor v0.2.23


## 何が罠か
[「Postman Intercepter」Cookie利用時のREST用ツール](http://qiita.com/katsu_suzuki/items/fb8036776b4513366995)
こちらの記事を参考に、ログインしようとしているとどうにも違うCookieがPOSTされている気がした。

最初は、ドメインが同じ(開発環境だったのでlocalhost)、別のCookieが送られているのかと思った。
けど、よくよく考えてみると、Railsでは　`secrets.yml` の`secret_key_base`で暗号化されてるので、別のプロジェクトのcookieを復号できる訳がないと思った。

いろいろ調査していると、Chromeで複数のユーザでログインしていると、Postman Interceptorが想定している動きをしない。

具体的にどういうバグかというと、ユーザA(デフォルトユーザ)とユーザBがいるとする。
Postman InterceptorをユーザBの方のChromeでオンにして、開発しているサイトにログインする。
PostmanでもInterceptorをオンにする。
何故か、ユーザAのCookieが確定で送られてくる。

この挙動を見ていると、デフォルトユーザのCookieがどんな場合でも送られているっぽい。


## 解決策
デフォルトユーザ（ユーザA）のChromeでInterceptorをオンにして、デフォルトユーザのChromeでログイン処理をする。


これだけのことなんだけど、結構時間を使ってしまった。
デバッグに`nc`が便利で`nc -l 9999` とかで サーバを立てて、そこにPostmanでリクエストするとCookieの値が見える。その値がChromeの開発者ツールで見れるCookieの値と違うならば、何かがおかしいということになる。
さくらのクラウドに「vnstat」をインストールする際に躓いた話

さくらのナレッジに書かれているパフォーマンス取得を試してみようと思ったときに、vnstatを使いたいと思ったときにインストールがうまく行かなかったので、やったことの備忘録です。

[Linuxパフォーマンスモニタを活用したボトルネックの把握 – 「さくらのクラウド入門」(6)](http://knowledge.sakura.ad.jp/sacloud/6350/)

この中の `ネットワークの流量を把握する` の項目で使われているコマンドになります。

今回使ったのはCentOS6です。
標準ではvnstatコマンドがインストールされていないので以下の様にコマンドがないよという警告が表示されます。

```shell-session
[root@localhost ~]# vnstat -i eth0 -l
-bash: vnstat: command not found
```

ではYumでインストールしてみます。

```shell-session
[root@localhost ~]# yum install vnstat
Loaded plugins: fastestmirror, priorities, security
Setting up Install Process
Determining fastest mirrors
base                                                     | 3.7 kB     00:00
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  29 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 2.5 MB     00:00
No package vnstat available.
Error: Nothing to do
```

何もしない（Nothing to do）

実はepel.repoがdisabledとなっていることが原因です。
epel.repoを修正してみます。

ちなみにさくらのクラウドではCentOSのリリースノートを公開しているのでちゃんと読まないといけないですね:innocent:
[CentOS 6.9 64bit リリースノート](https://cloud-news.sakura.ad.jp/public_archive_iso/centos69-releasenote/)

```shell-session
[root@localhost ~]# vi /etc/yum.repos.d/epel.repo
```

`enabled=0` となっているので `enabled=1` に変更する。


では実際にインストールを行ってみます！

```shell-session
[root@localhost ~]# yum install vnstat

　~中略~

Installed:
  vnstat.x86_64 0:1.11-1.el6

Dependency Installed:
  gd.x86_64 0:2.0.35-11.el6           libXpm.x86_64 0:3.5.10-2.el6

Complete!
```

インストール成功しました！

```shell-session
[root@localhost ~]# vnstat -i eth0 -l
Monitoring eth0...    (press CTRL-C to stop)
 ...
```

ちゃんと動くようになりました:blush:
TypeScript の基礎


## 特徴・メリット
- 静的型付け言語であり，あいまいさを回避しやすい（javascript は 暗黙型変換）
- コード補完を効かせることができる
- ECMAScriptのスーパーセットで，かつECMA Script 6の機能を先取りしている
- 変換しても平易なECMAScriptが出力される
- 既存ライブラリとの相互運用のために外部に型定義ファイルを持てる
- クラスベースのオブジェクト指向プログラミング

例：クラスの定義を定義した場合の javascript と typescript の比較

```
// javascript
var Greeter = /** @class */ (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
}());
```
```
// typescript
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}
```
コンパイルエラーでビルドが通らないため、バグが生まれにくい。

```
var message: string; // string（文字列型）の変数を定義
message = 1;
// ↑ エラー: Cannot convert 'number' to 'string'.
```


# 導入手順

## インストール 
```
$ npm install -g typescript
```

## コンパイル
```
$ tsc sample.ts
```

## Javascriptファイルの実行
```
$ node sample.js
```

##Typescript と javascript のソースコードを一度に表示できるサイト
http://www.typescriptlang.org/play/

## 実装する上で大変勉強になったサイト
ポリモーフィズムを活用するとなぜ if や switch が消えるのか？
https://qiita.com/Nossa/items/a93024e653ff939115c6
[iOS] Objective-CでSKStoreReviewControllerの実装


## まえふり
[新 App Store 審査ガイドライン 翻訳&差分ガイド 2017年6月号](http://qiita.com/midnightSuyama/items/522e1eeabc763ccb032f)の記事で、
>iOS 10.3 で追加された SKStoreReviewController の使用が必須。

と書かれてあったため、おそらく今後リジェクトされると思い実装した。



## 実装内容
直で呼び出すとアラートは表示されないので、ワンクッション(Buttonの実装を)入れた。

```objc:
- (IBAction)onButton:(id)sender {
    [self showReviewAlert:@"レビュー" reviewAlertMessage:@"お願いします。" reviewAlertAppId:@""];
}



// レビューさせるポップアップ表示
- (void)showReviewAlert: (NSString *)title reviewAlertMessage:(NSString *)message reviewAlertAppId:(NSString *) appId {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle: title
                                                                   message: message
                                                            preferredStyle: UIAlertControllerStyleAlert];
    
    UIAlertAction *cancelAction = [UIAlertAction  actionWithTitle: @"Cancel"
                                                            style: UIAlertActionStyleCancel
                                                          handler: nil];
    
    
    [alert addAction: cancelAction];
    
    UIAlertAction *reviewAction = [UIAlertAction  actionWithTitle: @"Review"
                                                            style: UIAlertActionStyleDefault
                                                          handler: ^(UIAlertAction *action) {
                                                              [self setReviewAlert: appId];
                                                          }];
    [alert addAction: reviewAction];
    
    // 表示
    [self presentViewController:alert animated:YES completion:nil];
}


// SKStoreReviewControllerの呼び出し
- (void)setReviewAlert: (NSString *) appId {
    // iOS 10.3以上の処理
    float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (iOSVersion > 10.2f) {
        if([SKStoreReviewController class]){
            [SKStoreReviewController requestReview];
        }
    }
    else {
        if(!appId || appId.length == 0) return;
        
        NSString *url = [NSString stringWithFormat: @"%@%@%@", @"itms-apps://itunes.apple.com/app/id/", appId, @"?action=write-review"];
        // iOS 10以上
        if (iOSVersion > 9.9f) {
            [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]
                                               options: @{}
                                     completionHandler: nil];
        }
        // iOS 10未満
        else {
            [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
        }
    }
}

```





---

### 以下の記事を参考にさせていただきました
　
[【iOS】アプリ内からレビューを依頼する 10.3にも未満も対応](http://qiita.com/asashin227/items/f0c44821020af6ee846d)
　
[<Swift> iOS 10.3からアプリ内レーティングが可能に！- SKStoreReviewController -](http://qiita.com/mshrwtnb/items/6b9b7e9850f02f43e254)
PHP 製の課題管理ツール Mantis Bug Tracker

## Mantis Bug Tracker
https://github.com/mantisbt/mantisbt
**Mantis Bug Tracker (MantisBT)** は2000年から PHP で開発されている[バグ管理システム](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B0%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)。
他の BTS に [Redmine](http://qiita.com/bezeklik/items/483b61c637c805f2945f) や [Trac](http://qiita.com/bezeklik/items/139c7096663a676481ea) がある。

## システム要件
https://www.mantisbt.org/docs/master/en-US/Admin_Guide/html/admin.install.requirements.software.html

## 検証環境

- VirtualBox 5.1.22
 -  CentOS 7.3.1611 (minimal)
  - Apache 2.4.6 (base)
   - PHP 5.4.16 (base)
   - MariaDB 5.5.52 (base)

## インストール
### Apache / PHP / MariaDB
```bash
yum -y install httpd php{,-mbstring,-gd,-mysql} mariadb-server
sed -i.org 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php.ini
firewall-cmd --permanent --add-service=http{,s} && firewall-cmd --reload
systemctl start httpd mariadb && systemctl enable httpd mariadb
```

### Mantis
```bash
curl -LO https://downloads.sourceforge.net/project/mantisbt/mantis-stable/2.5.1/mantisbt-2.5.1.tar.gz
tar xf mantisbt-2.5.1.tar.gz --strip=1 -C /var/www/html
chown apache. /var/www/html -R
setenforce 0 #TODO
```
最新版の URL は以下から確認できる。
https://sourceforge.net/projects/mantisbt/files/mantis-stable/

データベースは未指定なら bugtracker という名称で自動生成される。

#### ログイン
|ユーザー名|パスワード|
|---|---|
|administrator|root|

## 画面
### 登録

![mantis.png](https://qiita-image-store.s3.amazonaws.com/0/15175/a5efb2b4-cc37-cc5a-9fca-5987de1595f4.png)

「問題」（いわゆるチケット）の登録画面。（画面によっては「課題」になっており訳語が安定していない様子。）
デフォルトでは以下のタグが許可されているのみで、textile や Markdown は利用できないようだ。[^g_html_valid_tags]

```php:config_defaults_inc.php
$g_html_valid_tags = 'p, li, ul, ol, br, pre, i, b, u, em, strong';
```

[^g_html_valid_tags]: [https://github.com/mantisbt/mantisbt/config_defaults_inc.php#L1816](https://github.com/mantisbt/mantisbt/blob/8462c710dccc77f9143bd34b6bbb0a251c68f560/config_defaults_inc.php#L1816)
マークダウンメモアプリをBoostnoteに乗り換えた話

ここ二年半くらいメモアプリとしてKobitoを利用していたが
Dropboxでうまく同期/バックアップができなくなっていることに最近気づいたのと
Qiitaに投稿することも減ったし、Kobitoである必要もないかな…と思ったので
代わりのメモアプリを探してみた。

## 探した条件

このへんが満たせると嬉しいなーと思いながら探してみた。

- マークダウンでメモが書ける
- メモ一覧が更新日順で並べられる
- ファイルがDropboxなどで同期できる
- MacでもWindowsでも利用できる

## Boostnote

Boostnote
https://boostnote.io/

Boostnoteなら上記の条件が全て満たせそうだった。

### 良かったところ

- マークダウンで書ける
  - エディタとプレビューが別れてないタイプだが、今となってはこちらの方が使いやすそう。
  - 入力中はマークダウンエディタだけが見えていて、入力終了するとスタイルが反映される。
- Dropboxで簡単にメモが同期できる
  - ファイルの保存先も自由に選べたので、Dropbox内を指定。
  - Electronで作ってあり、⌘+Rでリロードするとファイルが全部読み直されるのも他のマシンと同期させてると地味に便利。
- Mac Windows 両方にアプリがある
  - 特に文字化けしたりすることもなく両方で同期しつつ編集できたので良い。
- Storage機能
  - アプリ内でメモのフォルダ分けみたいなことができる。
  - メモの分類に良い。プロジェクトごとにStorageを分けると一覧性が高まる。
- Vimバインディング
  - エディタの編集にVimのキーバインドが利用できる。
  - これは期待してなかったので驚いた。
  - いまのところほぼ違和感なく使えている。メモだけでなくソースコードも書けそう。
  - default, vim, emacs の3種類のキーマップが用意されている。

### ちょっと気になったところ

- ショートカットキーが個人的に直感的じゃない・少ない
  - 検索がCtrl+Sだったり(Command+F or Ctrl+F あたりで使いたい)
  - 前後のメモへの移動がCtrl+J/Ctrl+Uだったり(Ctrl+J/Ctrl+Kなら分かりやすかった)
      - (2017/07/30追記: [こちらCtrl+J/Ctrl+Kに修正されました！:clap:](http://qiita.com/koyopro/items/ecfccae056f4ffd22826#comment-5c0ecc82c2994fb9fb41))
  - Storageの切り替えのショートカットキーがなかったり
  - etc.

とはいいつつ実はBoostnoteはオープンソースなので個人的に調整するのもありかもしれない。
 
## まとめ
 
概ね機能面では満足しているのでしばらくBoostnoteを使ってみようと思う。
マークダウンのメモだけではなくスニペット機能というものがあったり
ソースコードを書くのに便利な機能がいろいろありそうだが、とりあえずメモアプリとして以上。
SourceTree v2.1.2.5 > bug:ブランチ切替直後にpullしてはいけない

```txt:動作環境
SourceTree v2.1.2.5
Windows 7/8.1/10 etc
```

Switching branch and hit 'pull' to fast causes a pull of the old branch into the new one
https://jira.atlassian.com/projects/SRCTREEWIN/issues/SRCTREEWIN-7592?filter=allopenissues

ブランチ切替直後にpullすると、切替前のブランチの内容がプルされるというバグ。

v2.1.2.5より前のどのバージョンから影響を受けるバグなのか不明。
Capistranoで新しいrake taskを実行するときの注意


capコマンドでrake taskを実行するときの話しではなく、rake taskをdeply時に実行するようにしたときの話しです。言葉だと想像しにくいと思うので、コードで書くと

```ruby
namespace :new_task do
  desc 'Exeute new task'
  task :new_task do
    on roles(:db) do |host|
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, 'new_task:new_task'
        end
      end
    end
  end
end

after 'deploy:migrate', 'new_task:new_task'
```

こんな感じにmigrateの後に`rake new_task:new_task`を常に実行したいときのケースです。

肝は`release_path`内でtaskを実行することです。

既にdeploy済みのコードにrake taskがある場合、`current_path`でも問題ないのですが、これからdeployするコードに追加したrake taskを実行する場合、エラーになります。これはdeployが完了したときに、`current_path`のシムリンクが張り替えられるため、current_path内のコードにrake taskが存在しません。なので、これからdeployするコードに追加したrake taskを実行する場合は、`release_path`でrake taskを実行する必要があります。
初心者だけどwebアプリを作りたい！その２ 〜フォント地獄〜

# フォント地獄
## あるいは、chromeの罠
前回webフォントを適用できるのかというところで終わっていましたが、結論から言うと適用できてません（現在進行形）
いや、適用自体はできたんですけどおもったような挙動をしてくれないというか

そもそもローカルでフォントがちゃんと適用されているのか？と思って試してみました。
**だめでした。**

>Failed to decode downloaded font:
>OTS parsing error: post: Bad post version 0

延々↑こんなエラー？警告？が出ます。
調べてみてもGitでフォントファイルを扱っているとフォントファイルが破損することがあるという情報ばかり出てきます
**いやGitでフォント管理してないよ！！！**

その後なんやかんや試してみてどうやらChromeでようじょふぉんとを使った場合のみフォントが読み込まれていないということがわかります。
で、けっきょく[こちら](http://wisdomtrees.net/?p=453)の情報をみてフォントファイルをwoffに変換したら適用されました。されたんですが…

**フォント指定部分のCSSを外部CSSにするとフォントが読み込まれません。**（←今ココ）
Htmlに直接書き込めば適用されます。
でも外部CSSにするとだめです。
フォント以外のスタイル指定はちゃんと効いているのでCSS自体は読み込まれているようです。
Chromeのデベロッパーツール上でもフォントファイルが読み込まれていないのでフォントだけがだめみたい

さあどうしたものか…

## 関係ないけど最終的にやりたいこととか
・ガチャ結果を画像ツイート
・ガチャ結果からwikiのキャラ個別ページにリンク
・ガチャ演出（レア確定演出みたいなの）
・ほかにあったら追記
NDKでのエンディアン変換について

ndkというかjni一般の話だと思うけど普通のjniでは試してない

## jintarray ->int*の変換時

jintArrayでjni側で受け取って、GetIntArrayElementsでshort*に変換した場合には、自動でエンディアンの変換が行われている様子。(Big Endian@java -> Little Endian@nativeなど)

で、c側でintの配列に破壊的変更を掛けた場合も、env->ReleaseIntArrayElementsで開放してjavaに返して上げた場合、java側で正しく変更された値が読めている。utf8の文字列とかも普通に変換してくれている。

演算子のオーバーロードでエンディアン変換して書き込むみたいなことをしてないのだとすると、多分GetとReleaseのタイミングでエンディアン変更をしているのではと思っている。実際はしらん。もしかしたらもっと奥のjniのメソッドをディスパッチするとかのタイミングで暗黙の変換が起きているのかもしれない。

# int[] -> byte[] -> jbytearray -> byte*とかをする場合

jbyteArrayの場合はエンディアンの変更がかからないので、jni側がbyte*で受け取る場合に、javaのint配列とかを、byteの配列に変換してjniに渡すみたいなことをする場合は、以下のようにByteBufferを使って自分でendianの変更をかける必要がある。

明示的にBigEndianを指定してbyte[]を渡してCでint*として見たらちゃんと違う値として認識された。

```java
public static byte[] intArr2byteArr(final int[] in, ByteOrder destOrder){
    byte[] dst = new byte[in.length*4];
    ByteBuffer buf = ByteBuffer.wrap(dst);
    buf.order(destOrder).asShortBuffer().put(in,0,in.length);
    return dst;
}

int[] intArray = new int[100];
process(intArray);
byte[] byteArray = intArr2byteArr(intArray, ByteOrder.LITTLE_ENDIAN);
```

まぁそんなめんどい事するぐらいならポインタのキャスト一発で終わるCレベルで軽いラッパー書いたほうが良いと思うけど。

# 値そのものの場合

普通にintをそのまま返してもC側のエンディアン関係なくちゃんと読めてたなと思った。ということはGetXXXArrayElementsのタイミングじゃなくて呼び出しの時点でなんかフックが掛かってるのかも。

Androidを支える技術の2巻に、dexoptでインストール時にバイトコードをネイティブのエンディアンに揃える(内部表現じゃなくてバイトコード)という話も書いてあったし知らない仕様がいっぱいある。
いつの間にかAzureの仮想マシンサイズ毎のネットワーク性能が公開されていた

以前までAzureの仮想マシンサイズ毎のネットワーク性能は高、中、低などのサイズ間の相対的な情報しか公開されていなかった。

いつのまにかMbpsの値まで公開されている模様。
サイトはWindowsVMというタイトルだが、Linuxでも同じはず（ハードウェアの制限なのでOSに依存しない）
ネットワークインターフェース毎でなくVM単位なので注意が必要

Sizes for Windows virtual machines in Azure
https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sizes-general

![size.png](https://qiita-image-store.s3.amazonaws.com/0/192113/7f38756f-33c6-696e-25cf-e41c19622104.png)

なお、まだ英語サイトでのみ記載されていて日本語の公開情報には記載がないが、
そのうち公開されると思われる

Azure の Windows 仮想マシンのサイズ
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sizes-general
ナップザック問題を貪欲法で解いたメモ

ナップザック問題を貪欲法で解いた際のメモです。

##貪欲法の方針

容積あたりの価値が大きいものを先にナップザックに入れて、入り切ったものが解！
というのが、ナップザック問題の貪欲法における方針です。
例えば、過酷なサバイバルの準備のために、どちらも容積がほとんど同じである「うま〇棒」と「〇本満足バー」を好きなだけナップザックに詰めて持っていけるのなら、ナップザックいっぱいに「〇本満足バー」だけを詰め込むでしょう。そういうヒューリスティックに基づいています。

##実装についてのメモ

１つの品物に１つのタプル（品物,価値,容積）を割り当て、それをリストで保持する方法が個人的に便利だと思います。
つまり、リストは次のような具合になります。

tuples = [
(品物,価値,容積),
(品物,価値,容積),
　　　  :
(品物,価値,容積)
]

リスト内のタプルの要素にアクセスするとき、例えば、

**品物"3"の"容積"**

にアクセスするときは

**`tuples[2][2]`**

で値を取得できます。

###コード
```knapsack_greedy.py
import numpy as np

C = 2             #ナップザックの大きさ
len = 10          #品物の数
tuples = []       #（インデックス、価値、重さ、価値/重さ）を保持するリスト

#貪欲法の解とその初期化
sol = np.zeros(10)

#価値と重さの初期化
values = np.random.rand(len)
costs = np.random.rand(len)


#（インデックス、価値、容積、価値/容積）
for i in range(len):
    tuples.append((i,values[i],costs[i],float(values[i]/costs[i])))

#ソート後のタプル
tuples_sorted = []
    
#価値/容積の順で、ソートする
for x,y,z,w in sorted(tuples,key=lambda x:x[3],reverse = True):
    tuples_sorted.append((x,y,z,w))

sum = 0         #代入用変数    

for i in range(len):
    #容積あたりの価値が大きい物からナップザックに入れていく
    sum+=tuples_sorted[i][2]
    if(sum < C):
        sol[tuples_sorted[i][0]]=1         #容量オーバーしないなら入れる
    else:
        sol[tuples_sorted[i][0]]=0         #容量オーバーするので入れない

print("ナップザックの大きさ"+str(C))
print("価値")
print(np.round(values,3))
print("重さ")
print(np.round(costs,3))
print("選んだ品物")
print(sol)

sum_ = 0
for i in range(len):
    sum_ += sol[i]*costs[i]
    
print("選んだ品物の総容量")
print(str(sum_))

```
###出力
```
ナップザックの大きさ2
価値
[ 0.631  0.543  0.668  0.337  0.011  0.454  0.536  0.527  0.434  0.833]
重さ
[ 0.823  0.546  0.759  0.028  0.005  0.638  0.694  0.468  0.474  0.351]
選んだ品物
[ 0.  1.  0.  1.  1.  0.  0.  1.  1.  1.]
選んだ品物の総容量
1.87266067297
```
Visual Studio CodeでC++のコンパイルと実行を一発で行う

#概要
Visual Studio CodeでC++のコンパイルと実行を一発で行う．

##背景
調べてもプログラムの実行にデバッグ機能を使うものばかりだった．もっとサクッとやりたいのでコマンド一発で出来るようにする．
VScodeではタスクという機能を使ってコマンドを実行できるらしいので，実行のためにtasks.jsonを編集する．

#準備
C++実行までの事前準備は調べるとたくさん出てくる．
<dl>
  <dt>コンパイラ</dt>
  <dd>コンパイラを入れるのにVisual Studioをインストールしたくなかったので，MinGWでG++をインストールした．</dd>
  <dt>コンパイル用エクステンション</dt>
  <dd>Ctrl+Shift+Xで拡張機能バーを出しC++と検索して，C/C++という拡張機能をインストールする．
　</dd>
</dl>

#プログラム
VSCodeでファイルを新規作成してcppファイルで保存する．
中身は適当なコードにする．

```hello.cpp
#include <iostream>

using namespace std;

int main(){
    cout << "aaa" << endl; 
    return 0;
}
```

#tasks.jsonファイルの作成
新規作成後はjsonファイルが作成されていない．
ctrl+shif+Pでコマンドパレットを出し，`task`と入力する．
幾つか候補が出てくるので，`タスク：タスクランナーの構成`を選択するとファイルが自動で生成される．
生成された`tasks.json`ファイルの中身を書き換える．

```tasks.json
{
    "version": "0.1.0",
    "command": "g++",
    "isShellCommand": true,
    "showOutput": "always",
    "args": ["-o","${fileBasenameNoExtension}","${file}","&","${fileBasenameNoExtension}.exe"],
    "isBuildCommand": true
}
```

g++コマンドにargsで引数を渡している．
以下のコマンドと同等になる．
`g++ -o hello.exe hello.cpp & hello.exe`
コンパイルして出来た実行形式ファイルを実行してるだけ．

##tasks.jsonで使える環境変数
`${file}`などのように環境変数を使うことが出来る．
詳細は公式ドキュメントで
https://code.visualstudio.com/Docs/editor/tasks#_variable-substitution

#コンパイル&実行
プログラムの画面でctrl+shift+bでコンパイルと実行が行われる．

#おわりに
とりあえず一発でコンパイルから実行まで出来るjsonファイルを書きました．
コンパイル用タスクと実行用タスクに分割して，それぞれをインクルードして使うのも良いと思います．
WordPress REST APIを使ってPython で新規投稿する方法

Basic認証用のパスワードは「Application Passwords plugin」から発行しています。
## コード

```python:wp_rest_api_post.py
#coding: utf-8

import requests
import json

passward = "anCN 2JnY rcEu H2z4 JRi2 T4Fr" # 自分の環境に合わせて変更してください
user_id = "admin" # 自分の環境に合わせて変更してください
end_point_url ="http://xxx.xyz/wp-json/wp/v2/posts" # 自分の環境に合わせて変更してください

p_title = "APIからの投稿"
p_content = "内容のサンプル<br />サンプルあああああああ"
p_status = "draft"

payload = {
			'title': p_title ,
			'content' : p_content ,
			'status' : p_status
			}

headers = {'content-type': "Application/json"}

r = requests.post( end_point_url, data=json.dumps(payload) , headers=headers, auth=(user_id, passward) )
print(r)
```

## 参考文献
[WordPress REST APIで投稿の取得から新規投稿を行う](https://www.tam-tam.co.jp/tipsnote/cms/post10274.html "WordPress REST APIで投稿の取得から新規投稿を行う")
[Requests: 人間のためのHTTP](http://jp.python-requests.org/en/latest/ "Requests: 人間のためのHTTP")
[Python Authentication](http://docs.python-requests.org/en/master/user/authentication/ "Python Authentication")
[WP REST API](http://ja.wp-api.org/reference/posts/ "WP REST API")
スクリーンセーバの怪…


# 急に
スクリーンセーバを作りたくなりました。
えー、そりゃぁもう突然に…

# でも
作った事ないんですよね。
初体験、って奴ですか。

# さて
んじゃ、ネットで調べてむにゃむにゃすればオッケーでしょう。
で、むにゃむにゃしました！

# 本題
作りましたよー
スクリーンセーバモードとプレビューモードとオプションモードを実装したり、とか
AnyCPUで作んないと駄目だよ～、とか
二重起動防止にMutex使いましょう、とか
もろもろ実装してさ

最終的に拡張子を`.scr`にして`c:\Windows\System32`の下に置いてスクリーンセーバ設定を開いて選択！
おー、小窓プレビューが動いてるー
プレビューボタンで全画面スクリーンセーバもばっちり！

じゃぁ、取り敢えず待ち時間を１分にして「適用」ボタン押して待機。
わくわく…
どきどき…
わくわく…
………
１分って長いなぁ…
<br/>
で、いよいよその時が来ました。
チラッ、と画面がフリッカして…
終了～～～
<br/>
なんでだよー

# 結果
結構悩みましたが、結局原因は「Mutex」でした。
恐らく、小窓プレビューでMutex確保してしまっているので、本チャンのスクリーンセーバがMutex取れずに終了してしまうという…

でも疑問点が一つ。
小窓プレビュー表示してても「プレビュー」ボタンで実行されるスクリーンセーバは動くんだよなー

そもそもスクリーンセーバを誰がどうやって多重起動するんだよー
と云う事で、Mutexは放棄。

で、綺麗に動くようになりました。
何でみんなMutexが必要って書いてあるんだろ？
とても大事な理由があるんだろうか？
私には思いつきませんでした…

よ。
「すべて〇〇じゃない」「1つだけ○○か」「どれか○○か」「すべて○○か」

# `none?` すべて○○でないかを調べる。

```rb
[1,2].none?{|item| item >= 1 } # => false
[1,2].none?{|item| item >= 2 } # => false
[1,2].none?{|item| item >= 3 } # => true
```

ブロックを省略するパターンは、

```rb
[nil, false].none? # => true
[nil, 0].none? # => false
[nil, "a"].none? # => false
```

# `one?` 1つだけ○○かを調べる。

```rb
[1,2].one?{|item| item >= 1 } # => false
[1,2].one?{|item| item >= 2 } # => true
[1,2].one?{|item| item >= 3 } # => false
```

ブロックを省略するパターンは、

```rb
[nil, "a"].one? # => true
[nil, false].one? # => false
["a", "a"].one? # => false
```

# `any?` どれか○○かを調べる。

```rb
[1,2].any?{|item| item >= 1 } # => true
[1,2].any?{|item| item >= 2 } # => true
[1,2].any?{|item| item >= 3 } # => false
```

ブロックを省略するパターンは、

```rb
[nil, "a"].any? # => true
[nil, false].any? # => false
["a", "a"].any? # => true
```

# `all?` すべて○○かを調べる。

```rb
[1,2].all?{|item| item >= 1 } # => true
[1,2].all?{|item| item >= 2 } # => false
[1,2].all?{|item| item >= 3 } # => false
```

ブロックを省略するパターンは、

```rb
[nil, "a"].all? # => false
[nil, false].all? # => false
["a", "a"].all? # => true
```
epoch time 1500000000 チェック


<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Unix epoch time passes 1500000000 this week! <a href="https://t.co/fhYKYOnBH5">pic.twitter.com/fhYKYOnBH5</a></p>&mdash; Graham Krizek (@gkrizek) <a href="https://twitter.com/gkrizek/status/884578170489507840">2017年7月11日</a></blockquote>
らしいですね。

というわけで確認を。
せっかくなので jshell を使ってみます。

# 起動

とりあえず Eclipse 4.7 に同梱されていたので java\9\bin\jshell.exe をキックします

![1.png](https://qiita-image-store.s3.amazonaws.com/0/18223/7787efad-15b6-0a6a-99e1-8d7224efd7fb.png)
まあなんの苦労も無く動きますね (記事にしがいがなさすぎてビックリした...)

# 実行
せっかくなので `java.time` 使います。
(未だに理解があやうい)

## まずは現在日時のEpoch確認
![2.png](https://qiita-image-store.s3.amazonaws.com/0/18223/3c878872-b48a-37b5-995d-df64471091b0.png)
はい。
もうあとちょっと！感が良いですね。

## 1500000000
![3.png](https://qiita-image-store.s3.amazonaws.com/0/18223/d0443c87-dc82-61c4-4366-cc50e5135934.png)
というわけで日本時間 `2017-07-14T11:40` らしいです。
備えよう


# 感想
jshell 始めて使ったんですがいつもと全く感覚が違いますね。
まずはあれっ Ctrl+space で補完されない、そうかシェルなんだから Tab かそりゃそうだ...から始まって、Tab 連打グセのある自分はまあこんな感じになります。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/18223/c4d9e4bc-6172-2050-2e70-b446ae48bcc8.png)
あとイヤホンさしてるとﾋﾞｰﾌﾟ音も気になったり

ぱっと確認するには良いけど、やはりある程度まとまった試行錯誤なら IDE 上で Sandbox プロジェクト作るなあ…
使い分けはもうちょっと使ってから考えよう

# おまけ
![5.png](https://qiita-image-store.s3.amazonaws.com/0/18223/394f8e5c-819a-b816-ba6b-6fa8041e0300.png)
ちゃんと `/help` 読もう。
終了は `Ctrl+D` でもいける。readlineかな
History APIで履歴をいじる

# History APIってなんなん

History APIは以前からありjavascriptから「戻る」「進む」などの操作を提供していました。
HTML5になって履歴情報を操作(追加/変更/移動監視)することが可能となりました。

# 履歴の移動

## 前のページへ(`back`)

前のページに移動するには、以下の様にします。

``` javascript
window.history.back();
```

## 次のページへ(`forward`)

次のページに移動するには、以下の様にします。

``` javascript
window.history.forward();
```

## 指定ページに移動(`go`)

指定ページへの移動は、以下の様にします。
以下の例では、1つ次のページへ進みます。(`window.history.forwad()`と同じ動きになります。)

動きは引数にセットする値により変わります。
`+`の場合、現在のページより先へ
`-`の場合、現在のページより前へ

``` javascript
window.history.go(1)
```

# 履歴情報の操作

履歴情報では以下の情報を扱います。

- state
  任意のオブジェクト
- title
  現在は使用されていない値
- url
  履歴のURL

## 履歴情報の追加(`pushState`)

履歴を追加するには、以下の様にします。
追加した`state`は、`popState`イベントの第1引数のオブジェクトに`state`プロパティとして格納されます。

``` javascript
window.history.pushState({name : 't-okushima'}, null, '/name')
```

## 履歴情報の置き換え(`replaceState`)

履歴を置き換えるには、以下の様にします。

``` javascript
window.history.replaceState({name : 'aaaa'}, null, '/name')
```

## 履歴情報の監視(`popState`)

ブラウザの「戻る」「進む」または、同様の操作が行われた際に呼び出されるイベントとなります。
以下の様にします。

``` javascript
window.addEventListener('popstate', function(event) {
    // 任意の処理
    var state = event.state;
    alert(state.name):
});
```

## 現履歴情報の取得(`state`)

現在の履歴情報を`popState`以外から扱いたい場合に利用できます。
以下の様にします。

``` javascript
window.history.state
```

# サンプル

``` html
<!DOCTYPE html>
<html>
    <head>
        <title>History API Sample</title>
    </head>
    <body>
        <label for='name'>Name</label>
        <input type='text' id='name' value='' />
        <input type='button' id='pushButton' value='pushState' />
        <hr />
        <input type='button' id='replaceButton' value='replaceState' />
        <script>
            document.getElementById('pushButton').addEventListener('click', function() {
                var name = document.getElementById('name').value;
                window.history.pushState({name : name}, null, './history-api.html');
            });

            document.getElementById('replaceButton').addEventListener('click', function() {
                var name = document.getElementById('name').value;
                window.history.replaceState({name : name}, null, './history-api.html');
            });

            window.addEventListener('popstate', function(e) {
                var state = e.state;
                if (state) {
                    document.getElementById('name').value = state.name;
                    alert(state.name);
                } else {
                    document.getElementById('name').value = '';
                }
            });
        </script>
    </body>
</html>
```
matplotlibのグラフをRetinaの高解像度で表示する方法

## 一時的な設定
２通りの方法がある。
設定方法１の方が簡単だけど、IPython 2.0のリリース時点ですでにDeprecated。

```py3:notebook
# 設定方法１ (Deprecated)
%config InlineBackend.figure_format = 'retina'

# 設定方法２
%config InlineBackend.figure_formats = {'png', 'retina'}
```

## 設定ファイル
~/.ipython/profile_default/ipython_kernel_config.pyに下の１行を書いておく。

```py3:ipython_kernel_config.py
c.InlineBackend.figure_formats = {'png', 'retina'}
```

## 参考リンク
[2.x Series — IPython 6.1.0 documentation](http://ipython.readthedocs.io/en/stable/whatsnew/version2.0.html#selecting-matplotlib-figure-formats)
クラス変数の作り方



## インスタンスを作らないで、その変数にアクセスしたい
要はクラス変数ってこと

###Hoge.h

```
// interfaceの中にかく
@interface Hoge : NSObject
@property (class, nonnull) NSString *classVar;
+ (NSString *) classVar;  //アクセサメソッドが必要
+ (void) setClassVar:(NSString *) value;  //アクセサメソッドが必要



@property (nonnull, readonly) NSString *readOnlyclassVar2;
+ (NSString *) readOnlyclassVar2;   //アクセサメソッドが必要、ただしreadonly

@end
```

###Hoge.m

```
static NSString * classVar2 =@"yahoo.co.jp";
static NSString * readOnlyclassVar2 = @"this is what came for";

@implementation Hoge {
}

// アクセサメソッドを書いておかないと他のクラスから読めないよ
+ (NSString *) classVar{
    return classVar;
}
+ (void) setClassVar:(NSString *) value {
    classVar = value;
}

+ (NSString *) readOnlyclassVar2{
    return readOnlyclassVar2;
}
+ (NSString *) getReadOnlyClassVar2
{
    return self.readOnlyclassVar2 ; //同じクラスからアクセスする時にはこうかく。
}

@end
```

- 宣言はimplementationの外にかく。その時に初期値を与えられる
- アクセサはimplementationの中に書く。readonlyならgetterだけでおk
- 初期値を与えられる
- 同じクラスからもアクセスできる

### MainViewController.m

他クラスから、インスタンスを作らなイでアクセスの仕方を以下に示す。

```
- (void)viewDidLoad {
    [super viewDidLoad];

    //インスタンスを作らずにアクセスさせるためにはこうする
    NSString *fuga = Hoge.classVar;
    NSLog(@"%@", fuga);    // => yahoo.co.jp

    // アクセサを使ってセット
    [Hoge setClassVar:@"こうやってセット"];
    NSLog(@"%@", readClassVar2);    // => こうやってセット
    
    NSString *readClassVar2 = [ClassVariableObject getReadOnlyClassVar2];
    NSLog(@"%@", readClassVar2);    // => this is what came for

}
```
pythonのmultiprocessing Poolをctrl+c(KeyboardInterrupt)で終了したい

# 問題
pythonのmultiprocessing Poolを、普通に書いて、実行中にctrl+cすると、プロセスが終了せず止まったままになる。

```py:pool.py
import time
from multiprocessing import Pool

def worker(arg):
    print("process {}".format(arg))
    time.sleep(2)

if __name__ == '__main__':
    p = Pool(2)
    p.map(worker, range(6))
    p.close()
```

(上記のソースを実行中にCtrl+Cすると)

```
(略)
KeyboardInterrupt

```
(この状態で停止してしまう)

プロセスIDを指定してkillしても、ゾンビのようにpythonが復活してしまう。
なんとかCtrl+Cできれいに終了させたい。

# 原因
StackOverflowにまったく同じ悩みを抱えている方がいらっしゃった。
https://stackoverflow.com/questions/1408356/keyboard-interrupts-with-pythons-multiprocessing-pool

Poolの中で呼んでる処理にKeyboardInterruptの入力が伝達されず、wait関数がいつまでも待ち続けてしまうらしい。

# 解決方法
タイムアウトを設定してやるとOK。

```
p.map(worker, range(6))
```
を

```
p.map_async(worker, range(6)).get(9999999)
```
に置き変える。
Visual Studio for Mac で作ったプロジェクトを Visual Studio 2017 で実行する時気をつけること

小ネタです。

Xamarin でのモバイルアプリ開発では、 Mac の方が（主に iOS 関連で）都合がよいことが多いので、Visual Studio for Mac を使っています。

そんなわけなので新規ソリューション作成も Visual Studio for Mac（以前は Xamarin Studio） で行っているのですが、これらで作成したソリューションを Windows の Visual Studio 2017 で開いてビルドし、いざ実行しようと「デバッグの開始(F5)」を押しても、一向にアプリが起動しません。それどころかAndroidエミュレータも起動しません。

こんなこと初めてだなー、と思っていろいろみていたら、ふとソリューションの構成マネージャーに、「配置」をいう項目が増えているのに気づきました。

![](http://blog.amay077.net/assets/images/posts/solution_created_vs4mac_does_not_running_on_vs2017_01.png)

「キミ、いつからそこに居たの・・・」、完全にこれが犯人じゃん。
ということで、この「配置」にチェックを入れて、再度 F5 で実行すると、無事、エミュレータが起動してアプリが実行できました。

ちなみに下は Visual Studio for Mac の構成マネージャー的な画面ですが、「配置」なんてないんですよね。。。

![](http://blog.amay077.net/assets/images/posts/solution_created_vs4mac_does_not_running_on_vs2017_02.png)

Win と Mac で同じ機能はまったく期待してない Visual Studio ですが、細かいところ（可能なところ）は統一してほしいなあと思います。
プロセスの終了を待機してコマンドを実行する方法

シミュレーションが終わるのを待って次のシミュレーションを回したり、メールをとばしたりするために、
特定のプロセスが終了するのを検知する方法です。

同じシェル内のバックグラウンドプロセスなら`wait`コマンドが使えますが、
別シェルのプロセスを監視する場合は他の方法が必要です。

# ループを使う方法

```bash
while ps -p XXXX > /dev/null; do sleep 60; done; echo "end"
```

XXXXは監視するプロセスのPID。

原理としては無限ループを回しておいて、プロセスが終了したらループを抜けるようにしています。
`ps`コマンドの`-p`オプションでプロセスを指定すると、プロセスがあれば、終了ステータスが0で終わり、ループが続きます。
プロセスがなければ（監視しているプロセスが終了していれば）ループを抜けて次のコマンドが実行されます。

# tailコマンドを使う方法

コメント欄で別のやり方も教えていただきました。

```bash
tail -f /dev/null --pid=XXXX; echo "end"
```

--pidオプションが指定されたPIDのプロセスが終了した時点でtailコマンドも終了することを利用しています。

※こちらはGNU系のtailが必要です。
Linuxは問題なく使えますが、macOSなどのBSD系のtailでは--pidオプションがないため、1つ目の方法を使ってください。

また、この方法は指定したプロセスが標準出力をファイル等にリダイレクトしている場合はうまく動作しなさそうです。
Facebookのsdkを使わずにURL共有/ページを起動する


初めてAndroidアプリからFacebookに共有する実装をしたので記録しておく。

# URLをFacebookに共有する

urlのみであればsdkは不要だが、url以外を共有したい場合はFacebookのsdkが必要になる。

```Java
String url = "https://www.google.com";
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, url);
intent.setPackage("com.facebook.katana");
startActivity(intent);
```

### 画面
![スクリーンショット 2017-07-13 23.15.04.png](https://qiita-image-store.s3.amazonaws.com/0/52227/e513ab4f-1cdf-7ffe-a3e0-6d4c09cae2ad.png "スクリーンショット 2017-07-13 23.15.04.png")

facebookアプリが入ってなければExceptionが飛んできてアプリが落ちるので、アプリが存在するか事前チェックが必要。

ちなみに、
`"Googleだよ https://www.google.com";`
とurl以外を埋め込んでもキッチリurlのみ共有する動作になった。

# Facebookの特定ページを開く

Facebookの企業ページを開きたい場合もsdkは不要だった。

```Java
String url = "https://www.facebook.com/GoogleJapan";
String uriString = "fb://facewebmodal/f?href=" + url;
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(uriString)));
```

### 画像

![スクリーンショット 2017-07-13 23.15.23.png](https://qiita-image-store.s3.amazonaws.com/0/52227/4957b9be-9cac-8d9b-3221-a34591eb1d3f.png "スクリーンショット 2017-07-13 23.15.23.png")

こちらもfacebookアプリが入ってなければExceptionとなるので、アプリが存在するか事前チェックが必要。

### Facebookアプリのバージョンについて

Facebookアプリのバージョンが11.0.0.11.23(3002850)未満と古い場合は、
`uriString = "fb://page/GoogleJapan"`としなければならないらしい。

2017/07/13時点のFacebookアプリバージョンは132.0.0.20.85(64682900)だった。

11.0.0.11.23(3002850)って相当古いんだけど、そんな化石バージョンな人いるんかいな...
と思ったけど、アプリをスマフォ購入から一度も更新してないという強者が知人にいたから、バージョン判定は必要なのかもしれない。
【C#】Flickr.Netでtag検索をする【API】

# 今回のゴール

Flickrでタグ検索をして画像URLを取得すること。

# 準備するもの

- FlickrNet API Library
- API key

visualstudioを利用している方はNuGetから FlickrNet API Libraryを入れるのが楽かもしれません。

APIkeyの取得方法はこちらを参考にしてください。
[flickr APIの使い方まとめ](https://syncer.jp/flickr-api-matome)

今回は検索が目的ですので、tokenを使ってoAuthで認証する必要はありません。

# コードを書く


```csharp:imgAPI.cs
namespace FlickrAPI
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    using FlickrNet;

    /// <summary>
    /// イメージAPIを扱うクラス
    /// </summary>
    public class ImgAPI
    {
        private Flickr flickr;
        private string flickrApiKey = "取得してきたAIPkey";
        private PhotoCollection photos;

        /// <summary>
        /// Initializes a new instance of the <see cref="ImgAPI"/> class.
        /// </summary>
        public ImgAPI()
        {
            this.flickr = new Flickr(this.flickrApiKey);
            this.photos = new PhotoCollection();
        }

        /// <summary>
        /// 写真のURLを取得するメソッド
        /// タグの中からランダムに取得してくる
        /// </summary>
        /// <returns>ingUrl 画像URL</returns>
        public void GetImg()
        {
            Random random = new Random();
            PhotoSearchOptions opt = new PhotoSearchOptions();
            opt.Tags = "Mountain";
            opt.TagMode = TagMode.AllTags;
            this.photos = this.flickr.PhotosSearch(opt);
            var imgNumber = random.Next(this.photos.Count);
            var imgUrl = this.photos[imgNumber].LargeSquareThumbnailUrl;
            counsole.WriteLine(imgUrl);
        }
    }
}


```

## 各種説明
>    using FlickrNet;

これがないと始まりません
 
> Flickr

Flickrというクラスが全ての根になっています。

> PhotoCollection

このクラスで返ってきた結果から今回はURLを取り出して、表示します。

> PhotoSearchOptions

今回はタグ検索だけですのでシンプルですが、他にもいろいろパラメータがあります。

タグ検索した結果の中から乱数を利用してランダムに取得してきています。
今回は直接Tagsプロパティにタグを入力していますが、相手の入力を受け取るようにしてみても面白いですね。


# 参考

- [C# – Flickr.NETでtag検索](http://shokai.org/blog/archives/1481)
ERB や Slim などのテンプレートエンジンの partial でうまく早期リターンする

通常は partial の先頭で以下のように記述します。

```erb
<%# @condition が未設定の場合は、 partial の内容全体をレンダリングしない %>
<% return unless @condition %>

<div>
  早期リターンしなかったときの記述内容
</div>
```

ただ、 partial の途中で早期リターンしたいこともあるかと思います。その際に以下のように記述しても、早期リターン前の記述内容は最終的に出力されません。

```erb
<div>
  早期リターン前の記述内容
</div>

<%# @condition が未設定の場合は、 partial の内容全体をレンダリングしない %>
<% return unless @condition %>

<div>
  早期リターンしなかったときの記述内容
</div>
```

この場合は以下のように記述します。

```erb
<div>
  早期リターン前の記述内容
</div>

<%# @condition が未設定の場合は、 partial の内容全体をレンダリングしない %>
<% return self.output_buffer unless @condition %>

<div>
  早期リターンしなかったときの記述内容
</div>
```

`self.output_bufffer` にそれまでの実行結果が保存されていて、それを返すわけですね。
`return output_buffer` だけでも良いかと思って検証しましたが、どうもローカル変数として定義されているようで nil が返ります。
`@output_buffer` とすることもできますが、お勧めはできませんね。