OmniAICreator/Qiita-1.07M huggingface dataset:
Asp.Net Coreでコマンドライン引数で起動するURLを設定する

## Asp.Net Coreでコマンドライン引数で起動するURLを設定する

### LinuxでもC#でサーバーを立てられる！

なんと言ってもLinuxでC#のWebサーバーですよ。
かなり遜色ない感じで動いてくれるので感動です。

### 起動するURLの指定方法は

ところが、dotnet runコマンドで起動すると、`\Properties\launchSettings.json` の設定に従って起動するURLが指定されたりします。
まあ、これでもnginxをフロントにしたりすればあまり問題もないのですが。
dockerのコンテナ内で起動しようとしたときに大問題になってしまうのです。

そういう時にはコマンドライン引数で起動URLを指定できる方が利便性が増します。
というわけで、実コード。

### コード

通常、Visual Studio（軟弱でゴメン…）で空のAsp.Net Coreのプロジェクト作ったら以下のようになります。

```csharp:Program.cs
public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}
```

起動するURLを指定するには `.UseUrls()` を使用します。
こんな感じになりますね。

```csharp:Program.cs
    var host = new WebHostBuilder()
        .UseUrls("http://localhost:6001")
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();
```

そして、 [neueccさんのこの記事](http://neue.cc/2009/12/13_229.html) と組み合わせて…。

```csharp:Program.cs
public static void Main(string[] args)
{
    var options = new HashSet<string> { "-u" };
    string key = null;
    var opt_args = args
        .GroupBy(s => options.Contains(s) ? key = s : key)
        .ToDictionary(g => g.Key, g => g.Skip(1).FirstOrDefault());

    IWebHostBuilder host_builder = new WebHostBuilder();
    if (opt_args.Keys.Contains("-u"))
    {
        host_builder = host_builder.UseUrls(opt_args["-u"]);
    }

    var host = host_builder
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}
```

こんな感じになりました！
これで、dockerコンテナ内で

```shell-session
#!/bin/sh

HOSTNAME=`hostname`
dotnet restore
dotnet run --configuration Release -u http://$HOSTNAME:5000/ > site.log
```

こんなスクリプトで起動をかけられます。

### なんでdockerにこだわるの？

や、仕事で与えられたサーバーがCentOS6だったのですよ…。
Atomをバージョンアップしたらapmコマンドが通らなくなった

# 何が起こった
Windowsです。
Atomの自動更新をONにしていて、いつの間にか1.10.1から1.11.1にバージョンアップしていたらしいが、apmコマンドを打とうとしたら

```
/c/Users/hogehoge/AppData/Local/atom/bin/apm: line 2: /c/Users/hogehoge/AppData/Local/atom/bin/../app-1.10.1/resources/cli/apm.sh: No such file or directory
```

って言われた。
環境変数でパスを1.11.1にしても治らなくて少し焦る。
# 修正
`/c/Users/hogehoge/AppData/Local/atom/bin/apm`が悪さをしていそうなので開く。

```
\#!/bin/sh
"$(dirname "$0")/../app-1.10.1/resources/cli/apm.sh" "$@"
```

バージョンを修正する。

```
\#!/bin/sh
"$(dirname "$0")/../app-1.11.1/resources/cli/apm.sh" "$@"
```

ついでに`/c/Users/hogehoge/AppData/Local/atom/bin/atom`も修正しておく。

```
\#!/bin/sh
"$(dirname "$0")/../app-1.10.1/resources/cli/atom.sh" "$@"
echo
```

↓

```
\#!/bin/sh
"$(dirname "$0")/../app-1.11.1/resources/cli/atom.sh" "$@"
echo
```

これでapmコマンドもatomコマンドも使える。

```
$ apm -v
apm  1.12.5
npm  3.10.5
node 4.4.5
python 2.7.12
git 2.7.2.windows.1
```

おっけい。
chainerのconnectionをいじって新しい層を作る（２）

##環境
GPU GTX1070
ubuntu 14.04
chainer 1.14.0
など
##はじめに
chainerで最新のモデルを実装する際には、links/connectionやfunctions/connectionをいじる必要がある。そこで最も単純なlinear.pyをいじって、新しい層を作ってみる。

前回は`chainer/functions/connection/linear.py`のforward関数をいじって順伝播を改良した。
http://qiita.com/masataka46/items/1a5d6cbd49279aeaf734

今回はbackward関数をいじって誤差逆伝播を改良する。
##誤差逆伝播の計算
誤差逆伝播の演算は以下の図のようになる。
![backward01.png](https://qiita-image-store.s3.amazonaws.com/0/116706/017988e1-664b-8951-ab54-eed8cc1b1813.png)
gxを求めるのに、Wのin_size / n側をn倍すれば計算が楽になる。またgWを求める演算を図式化すると以下のようになる。
![backward02.png](https://qiita-image-store.s3.amazonaws.com/0/116706/b84568d0-8bdf-14bc-beef-53d0b07293b7.png)
今度はgxとxとの行列積で出力されたものをin_size軸側に圧縮・足しあわせる必要がある。この際、cupy.sum()を使う。
##linear.pyの変更
`chainer/functions/connection/linear.py`内のbackward関数を以下のように修正する。

```py
    def backward(self, inputs, grad_outputs):

        x = _as_mat(inputs[0])
        W = inputs[1]
        gy = grad_outputs[0]
        
        W_tile = cupy.tile(W, (1, common_num)).astype(W.dtype, copy=False)

        gx = gy.dot(W_tile).astype(gy.dtype, copy=False)
        gW_wide = gy.T.dot(x).astype(W.dtype, copy=False)
        gW_cube = gW_wide.reshape(len(gW_wide), common_num, -1).astype(W.dtype, copy=False)
        gW = gW_cube.sum(axis=1).astype(W.dtype, copy=False)

        if len(inputs) == 3:
            gb = gy.sum(0)
            return gx, gW, gb
        else:
            return gx, gW
```

行列積の結果（gW_wide）に対して、まず次元を増やす（gW_cube）。次にその次元に関して足しあわせて（sum関数）いる。
##修正モデルの学習結果
修正モデルを走らせて、accuracyと処理速度を元のモデルと比較する。

```
python train_mnist3.py -g=0 -e=50
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 50

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy
1           0.204286    0.10436               0.936834       0.9683                    
2           0.0795502   0.0783082             0.975266       0.974
・・・
49          0.00331749  0.124306              0.999166       0.9843                    
50          0.00580243  0.136195              0.998583       0.9836    
```

５０回の学習で１分３０秒、accuracyは0.968から0.984に上昇した。元のモデルだと学習時間１分５４秒でaccuracyは0.971から0.985である。よって、予想通り学習時間が減って、accuracyはわずかに減少している。
単純代入演算子について

本記事は「C言語の単純代入演算子」、その一点のみを解説するものです。

なお、本記事における規定は「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」に準拠しています（一部を除く。後述）。

#はじめに
代入式のポイントは以下です。

- 構文規則　`左オペランド = 右オペランド`
- オペランドの型は、算術型・構造体型・共用体型・ポインタ型である。
- 結果の型は、左オペランドの型（非修飾版）とする。
- 左オペランドで表現される値を右オペランドに代入する時に、型変換が行われる。
- 代入式の評価にともなう副作用は、直近前後の副作用完了点の間に起こらなければならない。
- 左オペランド・右オペランドの評価の順序は**未規定**とする。
- 左右の両オペランドの記憶域が重なるオブジェクトを通してアクセスされる場合、その重なりは完全に一致している必要がある。そうでない場合、**未定義の動作**。

#オペランドの型

単純代入演算子のオペランドの型の組合せには制約があります。規格票からそのまま引用します。

>**制約**　次の条件のいずれか一つが成立しなければならない。

>- 左オペランドの型が修飾又は非修飾の算術型であり,　かつ右オペランドの型が算術型である。
- 左オペランドの型が右オペランドの型に適合する構造体型又は共用体型の修飾版又は非修飾版である。
- 両オペランドが適合する型の修飾版又は非修飾版へのポインタであり,　かつ左オペランドで指される型が右オペランドで指される型の修飾子をすべてもつ。
- 一方のオペランドがオブジェクト型又は不完全型へのポインタであり,　かつ他方が`void`の修飾版又は非修飾版へのポインタである。更に,　左オペランドで指される型が,　右オペランドで指される型の修飾子をすべてもつ。
- 左オペランドがポインタであり、かつ右オペランドが空ポインタ定数である。
>
（「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」「6.3.16　代入演算子」より引用）

上記より、左右のオペランドに要求する型の組合せは、大きく分けて以下の3パターンが存在します。

- 両方が算術型
- 両方が構造体型又は共用体型
- 両方がポインタ型

##両方が算術型の場合
オーバーフローやラップアラウンド等を除けば、特筆すべきことはありません。

##両方が構造体型や共用体型の場合
左右の両オペランドが適合する型である必要があります。

##両方がポインタの場合
両方のオペランドのポインタの指す型が適合型（修飾子を除く）である場合、あるいは片方のポインタの指す型が`void`の場合、左オペランドの型は、右オペランドの型の修飾子をすべて持つ必要があります。

#参考文献
- 「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」
Deep Learning > link > ディープラーニング チュートリアル（もしくは研究動向報告） / cuda-convnet

ConvNetで検索して見つけた。

ディープラーニング チュートリアル（もしくは研究動向報告）
by 岡谷 貴之さん、齋藤 真樹さん
http://www.vision.is.tohoku.ac.jp/files/9313/6601/7876/CVIM_tutorial_deep_learning.pdf

目次

- イントロダクション
  - DNNの事例紹介
- NNの基礎と研究の略史
  - なぜNN研究は廃れたか?
- プレトレーニング
  - Encoder-decoder paradigm
- Convolutional Neural Networks (CNN)
  - プーリングと普遍特徴
  - CNN vs. fully-connected NN
- ニューロサイエンス
  - どこまで分かっている?
- 生成モデル
  - Restricted Boltzmann Machine (RBM)
  - Deep Belief Network (DBN)
- 実践編
  - cuda-convnetを使ったMNISTの学習
- まとめ

cuda-convnet
https://code.google.com/p/cuda-convnet/
が気になるが、2016年10月13日現在、TensorFlowを優先中。

darknetも気になる。
Deep Learning > ConvNet @ LeCunの動画 > CNNと同義 

Deep Learningの本を読んでいて、その中で出てきたLeCunという人がいる。

その人の動画を偶然見つけた。
https://www.youtube.com/watch?v=_1Cyyt-4-n8&index=47&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH

聞き取りやすい英語で、説明もうまい。

動画の中で出てきたのがConvNetという用語。
Convolutional Neural Networkの省略形であるCNNと同義だが、LeCunらはこちらの言い回しを推奨しているようだ。CNNをgoogleで検索すると、無関係の事項がたくさん出るというのがその理由。
技術英語 > The idea is to order the elements left to right, [from smallest to largest].

@ Code Complete (No. 14475 / 36077)

> The idea is to order the elements left to right, <font color=red>from smallest to largest</font>.

この場合、定冠詞theはつかないようだ。

`left to right`の前にfromは付かないのだろうか。アメリカ英語の省略形の１つだろうか (forがなくなるやつとか)。

<hr>
関連して思い出したのは

> from generation to generation

http://qiita.com/7of9/items/a1b2dbbd110db13ceb85
二重のビット否定（~~）の意味は何？？

three.jsのgpgpu birdsのソースコードを眺めていたら、またちょっと？？なコードを見つけた。

https://github.com/mrdoob/three.js/blob/master/examples/webgl_gpgpu_birds.html#L391

```javascript
for( var v = 0; v < triangles * 3; v++ ) {
					var i = ~~(v / 3);
					var x = (i % WIDTH) / WIDTH;
					var y = ~~(i / WIDTH) / WIDTH;
.
.
.

```

この2重のビット否定は何を意味するのだろうか？と少し考えた。が、先を急ぎたいのでググった。
正解は「少数部の切り捨て」だった。
最初の`~`で整数化後ビット反転され、2つ目の`~`でもとに戻す。
元の数字の整数部が32ビット整数であらわされる範囲内でないとおかしくなりそうだけどね。


参考：

http://james.padolsey.com/javascript/double-bitwise-not/
https://www.softel.co.jp/blogs/tech/archives/3049

以上
TensorFlowをAndroidで実行するための方法 自分用まとめ(更新通知用)

なんか今後分散してしまいそうなのでまとめの記事。随時更新していくので、追いたい人はストックしておくと更新通知代わりになるかもしれません。

- 2018/07/27: "TensorFlow Lite C++ API解説"へのリンクを追加

## ビルド方法

- [TensorFlowをAndroidで実行するためのビルド方法(v0.11.0rc0版)](http://ornew.net/build-tensorflow-for-android-v0-11-0rc0)
- [TensorFlowをAndroidで実行するためのビルド方法(〜v0.10.0版)](http://ornew.net/build-tensorflow-for-android-v0-10-0)

## 実装・実行方法

- JNIの書き方とか(執筆中)

## TensorFlow C++API について

- [TensorFlow Lite C++ API解説](https://qiita.com/ornew/items/2dd72e6b63d8ca389d28)

## 理論の話

- [DeepLeraningとモバイルが作る新しいアプリ開発のかたち](http://qiita.com/ornew/items/59f86a76d5d6f5cd9827)
  - 学習と利用の非対称性についてはそのうちまたまとめる予定

## スライド

- [TensorFlow on Android](https://speakerdeck.com/ornew/tensorflow-on-android)

## 登壇予定

11/19 の ABC2016 Autumn で TensorFlow で作った Android アプリケーションの実装の話をします。

[ABC2016 Autumn 公式サイト](http://abc.android-group.jp/2016a/)

---

古川新
ブログ: http://ornew.net/
Facebook: https://www.facebook.com/old.r.new
WordPressで投稿のアーカイブ（投稿一覧）を設定する

WordPressは
トップページと投稿のアーカイブのテンプレートが基本的に同じ。

管理画面の**表示設定**で**フロントページの表示**を
固定ページにすればすんなり分けられるけど
固定ページつくるのは気持ち悪い。

ので探していたら

v4.4から追加された[*register_post_type_args*](https://developer.wordpress.org/reference/hooks/register_post_type_args/)に引っ掛ければで設定を変えられるらしいことがわかる。
[投稿アーカイブを有効にする (WordPress 4.4以降)](http://wpcj.net/1462)

っていうことでやったらできたにはできたけど
シングルのスラッグとアーカイブのスラッグが同じだと問題が。

投稿のパーマリンクを
/news/%post_id%
としている場合で
$args['has_archive'] = 'news';

とすると
/news/ でアーカイブは表示できるが
/news/1 とかでシングルが404になる。

ので却下で海外を探してみるとあった。
[Creating a blog post archive at /blog/ without awkwardly publishing a page](https://handbuilt.co/2016/07/13/creating-a-blog-post-archive-at-blog-without-awkwardly-publishing-a-page/)
フィードも考慮されていてマーベラス。

自分用に変えると

```php:functions.php
/**
 * 投稿のアーカイブページを設定
 */
add_filter('register_post_type_args', function($args, $post_type) {
	if ('post' == $post_type) {
		global $wp_rewrite;
		$archive_slug = 'news';
		$args['label'] = 'ニュース';
		$args['has_archive'] = $archive_slug;
		$archive_slug = $wp_rewrite->root.$archive_slug;
		$feeds = '(' . trim( implode('|', $wp_rewrite->feeds) ) . ')';
		add_rewrite_rule("{$archive_slug}/?$", "index.php?post_type={$post_type}", 'top');
		add_rewrite_rule("{$archive_slug}/feed/{$feeds}/?$", "index.php?post_type={$post_type}".'&feed=$matches[1]', 'top');
		add_rewrite_rule("{$archive_slug}/{$feeds}/?$", "index.php?post_type={$post_type}".'&feed=$matches[1]', 'top');
		add_rewrite_rule("{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type={$post_type}".'&paged=$matches[1]', 'top');
	}
	return $args;
}, 10, 2);
```

で無事にarchive.phpで読めるようになったと。

ちなみに

```$args['label'] = 'ニュース';```
てやると
```get_post_type_object($post_type)->label;```
を使っても「投稿」と表示されずに「ニュース」と表示できる。
Yeomanで作ったAngularのプロジェクトをgithub-pagesで公開する


## TL;DR
- ブランチは`develop`と`master`を用意して、`master`を`gh-pages`のようにして運用する
- リポジトリ [futabooo/futabooo.github.io](https://github.com/futabooo/futabooo.github.io)
- github pages https://futabooo.github.io/



## Angularプロジェクト作成
諸事情によりGruntではなくてGulpを使いたかったので、下記のリポジトリを参考にAngularのプロジェクトを作成
[Swiip/generator-gulp-angular](https://github.com/Swiip/generator-gulp-angular)


こんな感じのディレクトリ構成でプロジェクトが作られる

```
futabooo.github.io
├── bower.json
├── bower_components
├── dist
├── e2e
├── gulp
├── gulpfile.js
├── karma.conf.js
├── node_modules
├── package.json
├── protractor.conf.js
├── src
├── tsconfig.json
├── tslint.json
└── typings.json
```


## gulp-gh-pagesをinstallして設定する
https://www.npmjs.com/package/gulp-gh-pages
deployを簡単にしてくれる

```
$ npm install --save-dev gulp-gh-pages
```

gulpディレクトリ配下に下記のようにファイルを作成

```js:deoploy.js
'use strict';

var gulp = require('gulp');
var ghPages = require('gulp-gh-pages');

// デフォルトはgh-pagesにdeployする設定になっているので、masterに変更してあげる
var options = {branch: "master"};

gulp.task('deploy', function () {
  return gulp.src('./dist/**/*')
    .pipe(ghPages(options));// optionsを渡す
});

```

## githubにpush＆deploy
github上にリポジトリを作成してmasterとしてひとまずpush

```
$ git init
$ git add .
$ git commit
$ git remote add origin https://github.com/futabooo/futabooo.github.io.git
$ git push -u origin master
```

developもpush

```
$ git branch -m master develop
$ git push -u origin develop
```

## githubの設定でdevelopをbaseブランチに変更する
最初はmasterになっているので、developに変更してUpdate
![スクリーンショット_2016-10-13_3_54_37.png](https://qiita-image-store.s3.amazonaws.com/0/9143/1b37a3f0-5733-2ac4-d663-667f2036cb3e.png "スクリーンショット_2016-10-13_3_54_37.png")

## deployする

```
$ gulp clean && gulp build
$ gulp deploy
```

これでmasterブランチには`dist`ディレクトリのみがpushされるようになり、https://futabooo.github.io/ で表示できるようになる

## 参考
gh-pagesはプロジェクト用で、userやorganizationはmasterブランチじゃないとだめになってるらしい
https://help.github.com/articles/user-organization-and-project-pages/

ユーザ名の部分は適宜自分のgithubアカウントに変更していただければ。
Opal gem内のRubyライブラリのみをJavaScriptに変換する

`gem install opal`でインストールされるOpalのgemには、Opal独自のライブラリや、Rubyの標準ライブラリ(の機能限定版)をOpalに移植したものがRubyスクリプトの形で同梱されています。

`opal`コマンドの`-L`オプションを使うと、これらのライブラリをJavaScriptに変換したものが出力できます。

## 例

Dateクラスを定義するdateライブラリのJS版をdate.jsというファイルに保存するには、以下のようにします。

```
$ opal -L -r date > date.js
```

また、Opal独自のライブラリ、nativeライブラリのJS版をnative.jsにするには以下のようにします。

```
$ opal -L -r native > native.js
```
Ubuntu 14.04 LTS をインストールする

今回はUbuntu 14.04 LTSを<Font color="red">クリーンインストール</font>します。
HDDの中身を全て消去してしまうので注意してください。

## 1. Ubuntu をダウンロード

Ubuntuの公式からisoファイルをダウンロードします。

isoが置いてある場所 : http://releases.ubuntu.com/14.04.5/

たくさんisoファイルがあるかと思いますが、

* <Font color="red">**ubuntu-14.04.4-desktop-amd64.iso**</font>

をダウンロードしてください。

## 2. isoファイルをDVDに焼く

ダウンロードしてきたisoファイルをDVDに書き込んでください。
書き込みはWindows7以降なら、isoファイルを右クリックするとディスクイメージの書き込みを選択すればいいです。
詳しくは、http://www.atmarkit.co.jp/ait/articles/1305/13/news070.html

Windowsの標準の機能でできなかった人は、ImgBurnなどのフリーソフトをお試しください。
詳しくは、http://freesoft.tvbok.com/freesoft/dvd_copy/use_imgburn.html


## 3. Ubuntuのインストール

先ほど作成したDVDを光学ドライブに挿入してください。
そしてPCを起動し、BIOSを開きます。
BIOSの開き方はマザーボードのメーカーごとに異なりますが、
<Font color="red">**F2**</font> と <Font color="red">**Delete**</font> を連打すれば大抵開けます。

BIOSを開いたら、Bootする優先順位を変更します。先ほど挿入したDVDが入った光学ドライブを最初にBootされるようにしてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/136317/0bdc25c4-21c6-5287-3a4e-9959e1fa5b8e.png)

これもマザーボードごとに違いがあるのですが、ASUSのH170proは上の画像の赤枠の中をいじると優先順位が変わります。
これでF10 を押して保存して退出。

しばらくすると、Ubuntuの紫画面が見え、下のような画面に変わります。

![VirtualBox_Ubuntu_2_13_10_2016_01_19_50.png](https://qiita-image-store.s3.amazonaws.com/0/136317/26970268-b71b-010c-a257-97a5994faf52.png)

言語は左のボックスの中から日本語を選択してください。
あとは以下の画像のように進めてください。

![VirtualBox_Ubuntu_2_13_10_2016_01_20_08.png](https://qiita-image-store.s3.amazonaws.com/0/136317/0e6e5054-66ad-aaac-21e2-84b117c9a34f.png)

![VirtualBox_Ubuntu_2_13_10_2016_01_20_20.png](https://qiita-image-store.s3.amazonaws.com/0/136317/6fa950a7-8cec-8bdc-4a5d-f088b769242c.png)

![VirtualBox_Ubuntu_2_13_10_2016_01_20_58.png](https://qiita-image-store.s3.amazonaws.com/0/136317/94c9ee3e-15f9-be08-4136-6ccfc3542cb8.png)

![VirtualBox_Ubuntu_2_13_10_2016_01_21_10.png](https://qiita-image-store.s3.amazonaws.com/0/136317/2e8ea2da-0343-51bc-7d59-1cdef59e5d8d.png)

ここからは自分の使い勝手のいいようにユーザ名とホスト名、パスワードを決定してください。
今後、sshでリモートでの使用を考えている人は、自動的にログインする　にチェックをいれてください。

![VirtualBox_Ubuntu_2_13_10_2016_01_22_20.png](https://qiita-image-store.s3.amazonaws.com/0/136317/5b7ad862-f457-3601-1338-08f5574f4eeb.png)

これでインストールが開始されます。あとは待つのみです。お疲れ様でした。
Javaでの文字列連結では、できるだけ＋演算子を使おう！（第二弾）

前に「[Javaでの文字列連結では、できるだけ＋演算子を使おう！](http://qiita.com/sipadan2003/items/9bd4b9c062b29626b3a2)」で書いたことが、Java 9で実現されるということを今更ながら知りました。

「[Java9で文字列の結合の速度を確認する](http://qiita.com/deaf_tadashi/items/73b9d4ecbfe6f8b14e8f)」(@deaf_tadashi さん) に載っているJava 9のjavapコードを拝見しますと…

おお、文字列を＋で連結するコードが、invokedynamic経由で次のメソッドを呼び出すバイトコードに変換されています！

```java
java.lang.invoke.StringConcatFactory#makeConcatWithConstants(MethodHandles.Lookup, String, MethodType, String, Object... constants)
```

invokedynamic呼び出しになるとどうなるかというと、一度Java 9でコンパイルすれば、常にその```makeConcatWithConstants```メソッドを呼び出す「お約束」になります。

以降は、Javaコア側で```makeConcatWithConstants```メソッドを最適化すれば、アプリ側のJavaソースを再コンパイルしなくても、そのまま、＋連結の処理も最適化されることになります。

ちなみに、OpenJDKのJDK 9(64bit)のソースを見たければ、Mercurialをインストールし、```hg clone http://hg.openjdk.java.net/jdk9/jdk9/jdk jdk9-jdk```などと叩きます（複製に時間がかかりますが）。

以上、「Javaでの文字列連結では、できるだけ＋演算子を使おう！（第二弾）」でした。
CentOS 6でRedisを複数立ち上げる

# 目的

開発でRedisのレプリケーションや複数のRedisへの接続を試す環境を作成するためにCentOS 6上で複数のインスタンスを立ち上げる方法を紹介します。

# Redisのインストール

```sh
yum install redis
```

# 初回のみ実施すること

pidファイルとログ用のディレクトリを作成。

```sh
mkdir /var/run/redis/ && chown redis: /var/run/redis/
mkdir /var/log/redis/ && chown redis: /var/log/redis/
```

# ポートごとの設定

データディレクトリ、設定ファイル、起動スクリプトの準備。
実行時はredisユーザーとなるので、ファイルオーナーとグループの設定に気をつけて下さい。

```sh
cp -uvp /etc/redis.conf /etc/redis_6379.conf
mkdir /var/lib/redis_6379 && chown redis: /var/lib/redis_6379
cp -upv /etc/init.d/redis /etc/init.d/redis_6379
```

configファイルの以下の部分を変更

```sh:/etc/init.d/redis_6379
# サーバー名をカスタマイズ
name="redis_6379"

# $nameをredis-serverに書き換え
exec="/usr/bin/redis-server"

# pidファイルのパスを指定
pidfile="/var/run/redis/redis_6379.pid"

# configファイルのパスを指定
REDIS_CONFIG="/etc/redis_6379.conf"

stop() {
    echo -n $"Stopping $name: "
    # 以下はコメントアウト
    #[ -x $shut ] && $shut
    #retval=$?
```

```conf:/etc/redis/6379.conf
# ポート番号の指定
port 6379

# pidファイルのパスを指定
pidfile /var/run/redis/redis_6379.pid

# ログファイルのパスを指定
logfile /var/log/redis/redis_6379.log

# データディレクトリを指定
dir /var/lib/redis_6379/
```

自動起動設定。

```sh
chkconfig --del redis # 既存のRedisを削除
chkconfig redis_6379 on
```

# ポート6380の設定を追加する

上記の6379を6380に読み替えて設定してください。

# 参考

- configファイル（レプリケーション設定あり）
 - https://github.com/tomgoodsun/centos6_lamp_configs/tree/master/config/etc
- 起動スクリプト
 - https://github.com/tomgoodsun/centos6_lamp_configs/tree/master/config/etc/init.d
【コピペ用】写真を褒める用の英語をEyeEmから拾い集めたまとめ

# はじめに

英語力が乏しすぎて写真系SNSでろくに他人の写真にコメントできないので、EyeEm内で使われているコメントを拾い集めてコピペ用にまとめてみました。

## EyeEmとは

https://www.eyeem.com
 
ドイツ発のInstagramのような写真共有アプリだそうです。

## 注意

* 自分は英語全くできません
* 英語は全てコピペです
* 訳はなんとなくです
* 空欄はうまく訳せませんでした
* コピペ元が英語ネイティブとは限らないので誤用もあるかもです

# 褒める

## ざっくり褒める系

| 英語 | 日本語 |
|:--|:--|
| Amazing | 素晴らしい |
| Awesome | 驚き |
| Beautiful | きれい |
| Beautiful gallery | きれい |
| Brilliant |  |
| Charming picture | かわいい |
| Cool shot | クール |
| Excellent | 素晴らしい |
| Fantastic | 素晴らしい |
| Fabulous | 素晴らしい |
| Gorgeous  | ゴージャス |
| Graceful | 優美 |
| Great | 凄い |
| Great image | 凄い |
| Great shot | 凄い |
| Great gallery | 凄い |
| Love it | 好き |
| Lovely | 好き |
| Magic |  |
| Nice | いいね |
| Nice one | いいね |
| Nice shot | いいね |
| Nice photo | いいね |
| Neat photo |  |
| Perfect | 完璧 |
| Pretty | かわいい |
| Super shot | いいね |
| Stunning | 素晴らしい |
| Stunning capture |  |
| Sweet | かわいい |
| Wonderful | 素晴らしい |


## 感動強め系

| 英語 | 日本語 |
|:--|:--|
| Compliment |  |
| Exceptional work | 並外れた |
| Exquisite | 絶妙 |
| Impressive | 印象的 |
| Like a dream | 夢みたい |
| Looks so romantic |  |
| Majestic  | 荘厳・雄大 |
| Minimal and perfect |  |
| Mesmerising picture | 1催眠を誘発する(induce hypnosis in)2磁石によるかのように強く惹かれる |
| Outstanding work |  |
| Simply beautiful |  |
| Simple and beautiful |  |
| Splendid | 壮大・華麗 |
| Superb | すばらしい・実に見事 |
| That's pretty cool |  |
| What a light |  |
| What a fantastic work and gallery |  |
| Well done |  |

## テクニックを褒める系

| 英語 | 日本語 |
|:--|:--|
| Excellent reflections | 反射がすてき |
| Excellent composition | 組み合わせがすてき |
| Fantastic reflection | 反射がすてき |
| Great framing | フレーミングがいい |
| Love the color and light! | 色と明度が好き |
| Love the lines | ラインが好き |
| Love the water splashing up | 水しぶきが好き |
| Nice image with atmosphere | 雰囲気がいい |
| Perfect perspective | パースが完璧 |
| Such a great mood | 雰囲気がいい |
| Such a nice atmosphere | 雰囲気がいい |
| So Vibrantly captured |  |
| Really pretty balance of sunset & sea | 夕日と海のバランスがとてもすてき |
| Very atmospheric |  |
| Wonderful colours | 色がすごい |
| Wonderful composition | 組み合わせがすごい |
| Wonderful photo capturing the moment |  |

## 被写体を褒める系

| 英語 | 日本語 |
|:--|:--|
| Absolutely gorgeous | とてもゴージャス |
| Amazing place | すてきな場所 |
| Beautiful scenery | きれいな景色 |
| Beautiful portrait | きれいなポートレート |
| Gorgeous capture | ゴージャス |
| Lovely view | いい景色 |
| Sighs are nice | いい景色 |

## 惚れちゃった系

| 英語 | 日本語 |
|:--|:--|
| This is one of my favorite photos of yours |  |
| Your work is very very wonderful |  |


## スラング系

| 英語 | 日本語 |
|:--|:--|
| OMG | おーまいがー |
| Goooood | すごくいい |
| Nic  | ナイス？ |

## 情緒

| 英語 | 日本語 |
|:--|:--|
| Smells good |  |

# お礼

## ありがとう

| 英語 | 日本語 |
|:--|:--|
| Big thanks | ありがとう |
| Thanks | ありがとう |
| Thank you | ありがとう |
| Thank you very much | ありがとう |
| Lots of thanks | ありがとう |
| Many thanks | ありがとう |
| I appreciate your comment | ありがとう |

# おわり

こんなもんでしょうか。
でもだいたい、「Beautiful」「Amaging」くらいでやり取りされてる感じでした。

まだまだあると思うので随時追加していきます。
編集リクエストもお待ちしております。
TravisCIでLINE Notifyを使う

# やること
よくあるTravisのテスト結果をチャットに投げるやつをLINE Notifyでやります。本当です。

## 登録
LINE Notifyでトークンを発行します。
マイページ>トークンを発行するからいけます。

トークンは再表示しないようなのでちゃんとコピーしといてください。
(新しくトークルームを作ると何かLINE Notifyのトークルーム選択画面への反映に時間かかるんですけど僕だけですかね)

## secureで暗号化
トークンをそのまま.travis.ymlに書くわけにもいかないのでsecureで暗号化します。

カレントディレクトリは.travis.ymlに移動しておいてください。

`gem install travis`
`travis encrypt "LINE_API_KEY=YOUR_API_KEY" --add env.global`
で.travis.ymlに暗号化されたのが書き込まれてるはずです。

More optins>Settings内から環境変数を設定しても多分大丈夫です。

## .travis.yml編集
テストのスクリプトなどの後に以下を追加します。

```yml:.travis.yml
...

after_success:
- curl -X POST -H 'Authorization:Bearer '$LINE_API_KEY -F "message=Success" 'https://notify-api.line.me/api/notify'

after_failure:
- curl -X POST -H 'Authorization:Bearer '$LINE_API_KEY -F "message=Failure" 'https://notify-api.line.me/api/notify'

```

以上でいけるはずです。（多分）
雑タイマー

# あらまし 

ちょっとしたスクリプトを1時間走らせて、
1時間で取得できる内容とかデータ量(ファイルサイズ的な)が知りたい。
スクリプトは作った。
いちいちcron動かす？スクリプト内で時間計測仕込む？？？
→ めんどい

で、酒飲んだ後の深夜テンションでゴリゴリって遊んでみた。

# こうした(つかった)

- at
- date

# サンプル

```bash
echo "kill -9 <pid>" | at `date +"%H:%M %d.%m.%Y" --date "1 hours"`
```
# たぶんこう出来るんじゃないかな(試してない)

```bash
echo "ps a | grep [s]cript.sh | awk -F ' ' '{print $1}' | xargs kill -9" | at `date +"%H:%M %d.%m.%Y" --date "1 hours"`
```
Borderlessウィンドウで閉じるを有効にする

### 問題
カスタムウィンドウを作る時`NSBorderlessWindowMask`を指定すると、デフォルトのウィンドウを閉じる機能が無効化されてしまい、メニューから閉じたり、`cmd+w`で閉じたりすることができなくなる。

### 解決法
カスタムウィンドウクラスで`validateMenuItem`をオーバーライドして`performClose`を有効化させ、`performClose`をオーバーライドして閉じる処理を記述する。

```swift:
class MyWindow: NSWindow {

...

    override func performClose(sender: AnyObject?) {
        // 処理

        ...

        self.close()
    }
    
    override func validateMenuItem(menuItem: NSMenuItem) -> Bool {
        return menuItem.action == #selector(performClose(_:)) ? true : super.validateMenuItem(menuItem)
    }

...

```

### 参考
http://stackoverflow.com/questions/5051508/performclose-on-a-borderless-window
chainerのconnectionをいじって新しい層を作る（１）

##環境
GPU GTX1070
ubuntu 14.04
chainer 1.14.0
など
##はじめに
chainerで最新のモデルを実装する際には、links/connectionやfunctions/connectionをいじる必要がある。

そこで最も単純なlinear.pyをいじって、新しい層を作ってみる。前回はlinear.pyの中身を確認した。
http://qiita.com/masataka46/items/d66997ac94ec7aa3bcb4

今回は`chainer/functions/connection/linear.py`のforward関数をいじって順伝播を改良する。

##改良モデルの概要
元々の全結合３層を以下の図のように改良する。
![img_161013_4.png](https://qiita-image-store.s3.amazonaws.com/0/116706/9ded39f3-37ed-9362-da1e-5678b237b7be.png)
２層目だけを改良する。この２層目は具体的に以下のように入力側に関して重みを共有する。
![forward01.png](https://qiita-image-store.s3.amazonaws.com/0/116706/2eec40d2-5eb3-d82c-748f-4069a23836b1.png)
この演算処理は以下の図のようになる。
![forward02.png](https://qiita-image-store.s3.amazonaws.com/0/116706/5983e3f9-7e95-8f88-9fbc-049a5d9e902a.png)
Wは入力側n個で重みを共有するので、W(out_size, in_size / n)となる。この重みを１度の行列積で計算できるよう、in_size / n側をn倍し、in_sizeとする。

この重みと入力側からのデータxとの行列積を求めると、y(batch_size, out_size)が出力される。これにより重みのパラメーター数が減るので、演算は速くなるだろう。そして、性能が若干低下するだろう。また今回、計算を簡略化するためbiasは使わないでおく。
##tain_mnist.pyを修正する
train_mnist.pyも若干変わってくるので修正する。

```py
common_num = 10
out_units = 900
    #chnged model
    def __init__(self, n_in, n_units, n_out):
        super(MLP, self).__init__(
            l1=L.Linear(n_in, n_units),  # first layer
            l2=linear_link.Linear(n_units / common_num, out_units, nobias=True),  # second layer
            l3=L.Linear(out_units, n_out),  # output layer
        )
```

グローバル変数で定義したcommon_numが、共有する数。また特に意味は無いが３層目のunit数を900に変えた。
##function下のlinear.pyを修正する
`chainer/functions/connection/linear.py`のLinearFunctionクラス内forward関数を以下のように修正する。

```py
import cupy
    #modified forward function
    def forward(self, inputs):
        x = _as_mat(inputs[0])
        W = inputs[1]

        #modify to original model
        W_tile = cupy.tile(W.T, (common_num, 1)).astype(W.dtype, copy=False)
        y = x.dot(W_tile).astype(x.dtype, copy=False)

        if len(inputs) == 3:
            b = inputs[2]
            y += b

        return y,

```
Wをcommon_num倍する際に、cupy（numpy）のtile()を使った。GPU使うのを想定してcupyをimportしているが、使わないならnumpyに変える必要がある。

またcheck_type_forward関数があるとエラーが出るので、コメントアウトする。

```py
    '''
    def check_type_forward(self, in_types):
        n_in = in_types.size()
        type_check.expect(2 <= n_in, n_in <= 3)
        x_type, w_type = in_types[:2]

        type_check.expect(
            x_type.dtype.kind == 'f',
            w_type.dtype.kind == 'f',
            x_type.ndim >= 2,
            w_type.ndim == 2,
            type_check.prod(x_type.shape[1:]) == w_type.shape[1],
        )
        if n_in.eval() == 3:
            b_type = in_types[2]
            type_check.expect(
                b_type.dtype == x_type.dtype,
                b_type.ndim == 1,
                b_type.shape[0] == w_type.shape[0],
            )
    '''
```

この関数がお節介にもxとWの大きさが対応しているか調べてるみたい。今回、明らかにWだけ小さくしてるので、これが機能するとエラーとなる。
OpenCVを動かそうとしたときのエラー対処

OpenCVを導入し、テストプログラムを動かそうとしたときに、エラーが出たのでそのメモを書く。

#環境
OSX 10.11.6 El Capitan

#エラー

```
dyld: Library not loaded: /usr/local/opt/libpng/lib/libpng16.16.dylib
  Referenced from: /usr/local/opt/opencv/lib/libopencv_highgui.2.4.dylib
  Reason: Incompatible library version: libopencv_highgui.2.4.dylib requires version 42.0.0 or later, but libpng16.16.dylib provides version 38.0.0
Trace/BPT trap: 5
```

バージョン古いから使えないよって感じ(だと思う)

#対処
コマンドライン上で、

```
brew upgrade
```

を実行してから、

```
brew update
```

で解決した。

updateはやらなくても解決したかも
Fabricを使ってみた

# Fabricとは何か

pythonの2.5~2.7で使うことができるライブラリで、アプリケーションのdeployや権限まわりの処理を行うときに使うコマンドラインツール。

>Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.

参考) http://www.fabfile.org/

# インストール方法

Macでpipでライブラリを管理している場合、

```
$ pip install fabric
```

でインストールできます。

# 使い方

今回は

- sshログインして、ファイルを作る

ということをやってみます。

以下のようなファイルを作ります。

```py
#coding: utf-8


from fabric.api import run
from fabric.api import env

env.hosts = ["100.0.0.0"] # sshログインするサーバーのIPアドレス
env.user = "test_user"   # sshログインするサーバーのuser名
env.password = "pass"    # sshログインするサーバーのパスワード

def deploy():
  run("touch fab.txt")
```

# コマンドを実行

```
$ fab -f <ファイル名> <関数名>
```

で実行できます。
上記の例において、ファイル名をremote_touch.pyとすると、

```
$ fab -f remote_touch.py deploy
```

で実行できます。

オプションfがない場合は

```
Fatal error: Couldn't find any fabfiles!
Remember that -f can be used to specify fabfile path, and use -h for help.
Aborting.
```

というエラーが出ます。 これは「ファブファイルがないぞ！」と言われているわけです。

## fabfileとは？
> デフォルトでは、(Pythonのインポート機構にしたがって) fabfile と名付けられた fabfile/ もしくは fabfile.py を探します。

fabコマンドを使うには、対象ファイルをfabfile.pyとする必要があるわけですね。

任意のファイル名を使う場合は、

```
$ fab -f <ファイル名> <関数名>
```

ファイル名をfabfile.pyとする場合は

```
$ fab <関数名>
```

で実行できます。

## 参考
http://fabric-ja.readthedocs.io/ja/latest/usage/fabfiles.html

# 良いところ

## 複数サーバーにするのが楽

env.hostsの配列に、サーバーのIPアドレスを追加するだけでできます。

以下は同じユーザーで同じpasswordの場合のサンプルコードです。

```py
#coding: utf-8


from fabric.api import run
from fabric.api import env

env.hosts = ["100.0.0.0", "100.0.0.1"] # sshログインするサーバーのIPアドレス
env.user = "test_user"   # sshログインするサーバーのuser名
env.password = "pass"    # sshログインするサーバーのパスワード

def deploy():
  run("touch fab.txt")
```

以下は異なるユーザーで異なるpasswordの場合のサンプルコードです。

```py
#coding: utf-8


from fabric.api import run
from fabric.api import env

env.hosts = ["user1@100.0.0.0", "user2@100.0.0.1"]
env.passwords = {"user1@100.0.0.1": "password1",
                 "user2@100.0.0.1": "password2",}
def deploy():
  run("touch fab.txt")
```

というような感じです。楽ですね。

# より詳しい使い方

http://qiita.com/narikei/items/99e77eb2ff4029f2157c
https://heartbeats.jp/hbblog/2015/07/pythonsshfabric13tips.html
Spring Boot でCommandLineRunnerを使いながらJUnitのテストを実行する

SpringBootでコマンドラインアプリ（コマンドラインから引数を受け取って実行するアプリ）を作る際には、本処理を実行するクラスに`CommandLineRunner`の実装クラスとして作成することができます。

ですが、この`CommandLineRunner`でユニットテストを書いた際に、テスト対象のクラスの本処理まで実行されてしまうという問題があります。
例えば、Testを実行しようとしただけで、バッチの本処理が動いてしまい、思わぬ動作をしてしまう、といったことが考えられます。

この問題の解決方法はないかとGithubのissueを探していたら、見つかりました。
https://github.com/spring-projects/spring-boot/issues/830
以下のような方法で記載することができるようです。

```java

@SpringBootApplication
// profileが"test"以外のとき実行する
@Profile("!test")
public class App implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
    
    @Override
    public void run(String... arg0) throws Exception {
        System.out.println("run!");
    }

}

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class AppTest {
    @Test
    public void contextLoads() {
    }
}

```

以下テスト実行時のコンソールの出力です。

```
2016-11-01 23:32:46.962  INFO 42306 --- [           main] com.example.AppTest                      : Starting AppTest on xxx with PID 42306 (started by xxxxx in /xxx/xxx/workspace/commandLineSample)
2016-11-01 23:32:46.964  INFO 42306 --- [           main] com.example.AppTest                      : The following profiles are active: test
2016-11-01 23:32:47.013  INFO 42306 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@a1153bc: startup date [Tue Nov 01 23:32:47 JST 2016]; root of context hierarchy
2016-11-01 23:32:47.178  INFO 42306 --- [           main] com.example.AppTest                      : Started AppTest in 0.643 seconds (JVM running for 1.686)
2016-11-01 23:32:47.208  INFO 42306 --- [       Thread-1] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@a1153bc: startup date [Tue Nov 01 23:32:47 JST 2016]; root of context hierarchy

```

App#runが実行されていないことがわかります。

自分はちょこっとしたコマンドラインアプリでもSpringBootで作ることがあるので、その際には役に立ちそうだなと思っています。

#謝辞
[拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。](http://qiita.com/YumaInaura/items/4d2c602d59c62daa9344)
こちらの記事を見て、小さな発見でも誰かの役に立つかもしれないと考えて、記事を書いてみました。
ありがとうございました。
誤ってコミットしてしまった内容をノーカン(相殺)にするコマンド


毎回検索してる気がするので投稿！！


コマンド

```
git revert 消したいコミットのハッシュ値
```

gitrevertはコミットを消すわけではなくて指定したコミットに対して取り消すように相殺してくれるコマンド。確認してできるので結構安全。


ログには残ります。
Slackへメッセージを送る（PHP）

Slack にこんなメッセージを送ってみます

![snip_20161101233028.png](https://qiita-image-store.s3.amazonaws.com/0/13382/3afb52d0-c0c4-a327-d07b-125e74972d9b.png)

ログイン後、左上のメニューから「Apps & integrations」をクリックします

![snip_20161101125240.png](https://qiita-image-store.s3.amazonaws.com/0/13382/355f1011-7288-fc01-558c-22ee8e96326b.png)

「Incoming WebHooks」を検索して選択します

![snip_20161101125501.png](https://qiita-image-store.s3.amazonaws.com/0/13382/ad261063-4ced-7b40-ed93-6c72f05ef48b.png)

「Add Configuration」をクリックします

![snip_20161101125635.png](https://qiita-image-store.s3.amazonaws.com/0/13382/4e320c33-7f92-a4e0-29d6-59a7abe899ef.png)

Postするチャンネルを選択し「Add Incoming WebHooks integration」をクリックします

![snip_20161101125701.png](https://qiita-image-store.s3.amazonaws.com/0/13382/878682f5-4239-7038-40a3-077ce45c8e93.png)

Webhook URL が表示されるのでコピーします

![snip_20161101125801.png](https://qiita-image-store.s3.amazonaws.com/0/13382/8d2f4de7-1c2d-c599-9808-c81d7567b06a.png)

PHPでメッセージをPOSTします

```php:index.php

<?php

// コピーした Webhook URL
$url = 'https://hooks.slack.com/services/xxxxx';

$message = array(
    'username' => 'なまえ',
    'icon_emoji' => ':smile:',
    'text' => 'Sending Message'
);

// メッセージをjson化します
$message_json = json_encode($message);

// payloadの値としてURLエンコードしてPOSTします
$message_post = 'payload=' . urlencode($message_json);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message_post);
curl_exec($ch);
curl_close($ch);

```
VSCodeにオフラインでExtensionを追加する

# 2018/07/26追記
いつの間にかプラグインのダウンロードができるようになっていました。やったね！

プラグインのサイトの右ペインに「Download Extension」があるので、こちらからダウンロードして、「拡張機能」メニューの「…」の「VSIXからのインストール…」からインストールするか、 `code --install-extension <extensionのファイルパス>` を実行してください。

というわけで、以下は以前の方法となります。

---

オフラインではVisual Studio CodeでExtensionが追加できないってなってたけど、調べてみたらなんとかインストールできたのでメモ。

# プラグインをダウンロードする
こっちが大変。

## URLを作る
パッケージのダウンロードは普通には出来ないらしいのでURLを作ります。
パッケージは以下の形式のURLで取得できます。

```text
https://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publisher}/extension/${extensionname}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage
```

この中のpublisher, extensionname, versionを書き換えていきます。

対象の**マーケットプレイスのWebサイト**を開きます。
C#を例にすると、以下のURLになります。

https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp

このURLの"itemName"パラメータの"."より前(この場合は"ms-vscode")がpublisher, 後ろ("csharp")がextensionnameとなります。

残りのversionはページの右側、More InfoのVersionに表示されています。

![ms-vscode.csharp-web.png](https://qiita-image-store.s3.amazonaws.com/0/110594/4cac3d48-8871-4029-79e2-2de13a296826.png)

この場合は"1.4.1"になります。


以上を踏まえると、この例でのURLは以下になります。

```text
https://ms-vscode.gallery.vsassets.io/_apis/public/gallery/publisher/ms-vscode/extension/csharp/1.4.1/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage
```


## ダウンロードして拡張子を変える
前の手順で作成したURLからパッケージをダウンロードします。
ダウンロードしたファイル名は一緒になるので、名前を書き換えて、拡張子をvsixに変更します。


# プラグインをインストールする
こっちは簡単。
VSCodeはコマンドラインパラメータが指定できるため、これを使ってインストールを行います。
--helpを指定すればパラメータ一覧が表示されます。

Windowsではインストール時にパスを通していればcodeだけで実行可能。
逆に通していなければカレントディレクトリを移動していないとダメでした。

以下のパスはデフォルトのパスなので、必要に応じて修正してください。

```bat:Windows
cd "C:\Program Files (x86)\Microsoft VS Code\bin"
Code.cmd --install-extension <extensionのファイルパス>
```

```bash:macOS
"/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code" --install-extension <extensionのファイルパス>
```

〜 was successfully installed!と表示されたら完了です。VSCodeを再起動すると有効になります。

パッケージのダウンロードがもっと簡単になれば楽でいいんだけどなぁ。

# 参考
参考サイトは以下。
[How to install VSCode extensions offline? - Stack Overflow](http://stackoverflow.com/questions/37071388/how-to-install-vscode-extensions-offline)
Carthageでinstallしたライブラリのライセンス一覧をplistで生成する



hatuyukiです。Qiitaには初投稿になります。
よろしくお願いします。


## ライセンス管理

自分は現在、アプリを開発する中で、cocoapodsとcarthageを併用しているのですが、オープンソースライセンスの管理が面倒になってきます。

cocoapodsの場合は[こちら](http://qiita.com/mox2/items/545f1d39e4829907ac42)の方法で`pods install`する際に自動でplistをコピーし、それをアプリや設定内で表示させることができるのですが、このやり方ではcarthageのライセンスは取得できません。

しかしそもそも `carthage update`した段階でCheckoutsディレクトリの中にソースコード一式チェックアウトしているのだから、そこからライセンス情報を引っ張ってくれば良いのではと思い当たりました。

## generate_carthage_license_list

CarthageのCheckoutsからライセンスのplistを生成する[generate_carthage_license_list.rb](https://github.com/hatuyuki4/GenerateCarthageLicenseList)というものを作成しました。これを使ってplistを作成し、ライセンスを管理していきます。

## 使用方法

generate_carthage_license_listをプロジェクトファイルと同じディレクトリに配置します。generate_carthage_license_listを開くと、ファイルの頭に

```
output_path = "CarthageLicenseList.plist"
carthage_path = "Carthage/Checkouts/*"
```
と書かれている箇所があるので、プロジェクトにあわせて変更します。

`carthage_path`がCarthageのcheckoutsへのパス、`output_path`がplistの出力先のパスになります。

最後に以下のコマンドで実行すれば終わりです

```
ruby generate_carthage_license_list.rb
```

実行後にPods-acknowledgements.plistと同じような構成のplistが出力されます。

## 使用例
CarthageLicenseSampleにsetting.bundleへplistを出力し、ライセンスを表示するサンプルを作ってあります。
単純なplistなので、setting.bundleではなくアプリ内で表示することも可能です。

|settings|Licenses|
|---|---|
|![Simulator Screen Shot 2016.10.31 22.10.30.png](https://qiita-image-store.s3.amazonaws.com/0/48976/efa32385-063a-60a2-3e34-833f8c86b68c.png "Simulator Screen Shot 2016.10.31 22.10.30.png")|![Simulator Screen Shot 2016.10.31 22.10.32.png](https://qiita-image-store.s3.amazonaws.com/0/48976/2bc3cd8b-20c2-19c4-65fe-49bca86f84f1.png "Simulator Screen Shot 2016.10.31 22.10.32.png")|
(RHEL5 CentOS5 に) pyenv でPython2.7 python3.5 をインストールする方法 (2016 Nov)

依然として古いシステムが時々存在します．こうしたシステムでサポートされているpythonのバージョンごとにpythonスクリプトを書き，管理するのは非常に大変です．

調べてみたところ，
- ソースからコンパイル
- 2.6 の rpm からインストール
- easy_install を使ってインストール
といった方法が見つかりましたが，どれもバージョンごとに違う手続きだったり，しっくりしませんでした．

pyenvを使った方法が見つからなかったのでここに共有します．

ちなみに，centos6, RHEL6, centos7, RHEL7 でもこの手順でインストールできます．その場合はgitは `yum install git` でインストールします

# インストール環境

実機でも可能ですが，再現できる検証環境としてvagrantを用意します．この記事でもこの環境で動作確認済みです．

```sh
# ホストで実行
vagrant box add centos5 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-5.10-i386_chef-provisionerless.box
vagrant init
vagrant up
vagrant ssh
```

一応，アップデートしておきます．必須ではありません．

```sh
# vmで実行
sudo yum -y update
cat /etc/redhat-release 
	# CentOS release 5.11 (Final)
```

# Git をインストール

Centos5 / RHEL5 には git はデフォルトで入っていないので，EPELからインストールします

```sh
# vmで実行
sudo rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
sudo yum -y install --enablerepo=epel git

```

# pyenv をインストール

pyenv を github からインストールします．


```sh
# vmで実行
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
exec $SHELL -l

```

# 必要なパッケージをインストール

yum で必要なパッケージをインストールします．

```sh
# vmで実行
sudo yum -y install gcc make 
sudo yum -y install readline readline-devel
sudo yum -y install zlib zlib-devel
sudo yum -y install bzip2 bzip2-devel
sudo yum -y install sqlite sqlite-devel
sudo yum -y install openssl openssl-devel
```

python3をインストールする場合は，追加で以下のパッケージをインストールします．

```sh
# vmで実行
sudo yum -y install patch
```

# python をインストールする

pyenv でインストール可能なバージョンをリストします．

```
# vmで実行
pyenv install -l
```

このなかで，今回は 2.7.12 をインストールします．

```
# vmで実行
pyenv install 2.7.12
pyenv global 2.7.12
```


## pip も普通に使えます．

```sh
# vmで実行
pip install requests
```
外気温を測ってホームページで公開すると気象庁から怒られる件（→怒られなくなった模様）


## 2022年7月2日追記

コメントをいただいて気づいたのですが、過去の「よくある質問集」にあった

> ホームページでの公開は、成果の発表にあたりますので、届出が必要です。

などの記述が消えて、

> 気象観測データをインターネット上のホームページ等で掲載する場合には、その観測データの特徴を踏まえた適切な利用につながるよう、観測データの特徴（例えば、観測の目的や観測場所等）を明示するよう努めていただきますようお願いします。

との記述が追加されていることを確認しました。

現実的な運用になり、嬉しく思います。

## 2022年7月3日追記

[気象観測施設の届出と気象測器の検定](https://www.jma.go.jp/jma/kishou/shinsei/kentei/index.html) のページ内にある [解説資料「気象の観測を行う場合に」 ［PDF形式:218KB］](https://www.jma.go.jp/jma/kishou/know/kansoku_guide/kansoku_doc.pdf) の6-7ページ（PDF上では7-8ページ）に、観測データの特徴の具体的な記載例が書かれています。

平成30年(西暦2018年)3月の文章です。

気づいてあげられなくてごめんな・・・

---

以下は、2016年11月に書いたものです。

---

IoT時代になり、様々な場所にセンサーが仕込まれ、相互に流通してビッグデータがうんたらかんたら。。。

という文脈で、安い温度センサーで気温を測ってグラフ化してホームページに公開してみましょうみたいな話がよくあると思います。

しかーし！

そんなことをすると気象庁から怒られる場合がある、というお話をします。

気象庁のサイトにこんなページがあります。

[気象観測施設の届出・気象測器の検定](http://www.jma.go.jp/jma/kishou/shinsei/kentei/)

これによると、

> 政府機関または地方公共団体が気象観測を行う場合（研究や教育のための観測を除く）、又はそれ以外の方が観測の成果を発表するため、 あるいは災害の防止に利用することを目的として気象観測を行う場合には、技術上の基準に従って行い、気象観測施設設置の届出を気象庁長官に行うことが義務付けられています。（気象業務法第６条）

だそうです。

個人がホームページに公開するのは「それ以外の方」が「観測の成果を発表」することに当たります。


[よくある質問集](http://www.jma.go.jp/jma/kishou/shinsei/kentei/faq.html)  にも


> Q.個人で気象観測を行った観測値を自分のホームページで公開してもよいでしょうか
>
> A.ホームページでの公開は、成果の発表にあたりますので、届出が必要です。
また、その場合には技術上の基準に従った観測を行い、検定に合格した気象測器を使用する必要があります。

と書いてあります。

「検定に合格した気象測器」というのが天下り感のあるプライスでして、簡単に言うとクソ高いです。

オレオレ機器を検定に通すとなると、もっと高くつくと思います。

室内温度なら問題ないですが、在宅・不在がバレバレでセキュリティの問題が発生しますね。

公表しなければそれも問題ないのですが、モチベーションが上がりませんね。

法律を守って楽しくIoTしましょう！（棒読み）
Holderクラスは本当にスレッドセーフなのか？

## お題

「Javaによる関数型プログラミング」のP.133に登場する遅延初期化用のHolderというクラスがあります。本文ではこのクラスはスレッドセーフだとされています。お題は「このHolderクラスは本当にスレッドセーフなのか？」です。

Holderクラスをまるごと掲載すると著作権的な問題がありそうなので、気になる人は 

* http://media.pragprog.com/titles/vsjava8/code/lazy/fpij/Holder.java を参照するか
* https://pragprog.com/titles/vsjava8/source_code からアーカイブをダウンロードして、lazy/fpij/Holder.javaを参照してください。

Holderがスレッドセーフかどうかを考える上で、気になるのは以下の2点です。

* コンストラクタでのheavyの初期化
* createAndCacheHeavy()の中でのheavyの書き換え

## コンストラクタでのheavyの初期化

ここは残念ながらスレッドセーフと言えないでしょう。Javaの言語仕様上、finalでもvolatileでもないフィールドの初期化は他のスレッドから見えることは保証されていないはずです。つまり他のスレッドからはheavyはnullにみえる可能性があります。
ただ現実問題として、どこかで生成されたHolderインスタンスを複数のスレッドで共有する場合、大概は共有の過程のなかでmutexなどを取ったりするので、この点に間しては目をつぶるという選択肢もありえると思います。

## createAndCacheHeavy()の中でのheavyの書き換え

さて問題はこちらです。一応、前提として、コンストラクタでのheavyの初期化は、どのスレッドにも見えていることとします。

本文では例としてHolderにアクセスする3つのスレッドが挙げられています。

* 最初にcreateAndCacheHeavyを実行するスレッド
* 上記スレッドが終わるまで、createAndCacheHeavyのロックがとれるのを待っているスレッド
* 上記2つのスレッドよりもあとにHolder#getHeavy()を呼び出すスレッド

最初の2つのスレッドは、createAndCacheHeavyのsynchronizeで同期しているので、特に問題ありません。2番目のスレッドは、書き換え後のheavyの値を正しく見ることができます。
問題は3番目のスレッドです。このスレッドがHolder#getHeavy()を呼んだ時にフィールドheavyはどこを指しているでしょうか。考えられる可能性は3つです。

* コンストラクタで設定した () -> createAndCacheHeavy();
* 最初のスレッドが設定した、heavy = new HeavyFactory();
* 上記、どちらでもない不定値

結論から言えば、上2つのいずれかと思われます。言語仕様、
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.7
によれば、
```
Writes to and reads of references are always atomic, regardless of whether they are implemented as 32-bit or 64-bit values.
```
とのことなので、3番目の可能性はなさそうです。(Thanks to torutk)

ただし、コンストラクタで設定した () -> createAndCacheHeavy(); が見えてしまう可能性はあります。たとえ、時系列的に最初のスレッドがheavyを書き替えた後でも、3番目のスレッドがロックを取ってない以上、最新の値が可視になる保証はないからです（atomicであることと、可視であることは違う）。

このクラスのうまいところは、3番目のスレッドが

* 仮にheavyの古い値を見てしまったとしても、結局 createAndCacheHeavy()で同期される
* heavyの新しい値を見た場合は、HeavyFactoryがスレッドセーフなので正しい値がgetできる 

ということです。

## まとめ

個人的には、この手のロックの取得をスキップする試みは後になって、欠点が見つかることがよくあるので、実戦で使って良いものかどうか少し迷うところです。

## 余談

このHolderクラスですが、内部的に new Heavy() を呼んでいるので、これ自体を再利用することはできません。しかしHolderのコンストラクタで、Supplier\<T\>をもらって、new Heavy()を supplider.get() に置き換えれば、汎用ライブラリにすることができます。
BigQueryで無から連番のレコードを生成する方法


データ解析をする時に、1から特定の番号までの連番が欲しくなることがたまにあります。
PostgreSQLならばGENERATE_SERIES関数を使うのですが、BigQueryではどのようにすればいいでしょうか？
いろいろと試してみて、それっぽい方法を見つけたので、書き残しておきます。

# 目的
無から以下のようなテーブルを生成する。

| n  |
|----|
| 1  |
| 2  |
| 3  |
| 4  |
| 5  |
| 6  |
| 7  |
| 8  |
| 9  |
| 10 |

# Legacy SQLを使う場合

```sql
SELECT
  n
FROM (
  SELECT
    m,
    ROW_NUMBER() OVER() AS n
  FROM
    FLATTEN((
      SELECT
        SPLIT(LPAD('', 10, '.'), '') AS m
      FROM (SELECT 0)), m))
ORDER BY n
```
LPADで長さ10の文字列を生成して、それをSPLITし、10行分のレコードを生成しています。
そして各行に対してROW_NUMBERで通し番号を振ることで、連番を生成しています。

下から二行目の10という数字を変えることで1〜10以外の連番を生成することもできます。

# Standard SQLを使う場合

```sql
SELECT n FROM UNNEST(GENERATE_ARRAY(1, 10)) AS n ORDER BY n
```

GENERATE_ARRAY関数という、このために用意された関数があるので、こちらの方がシンプルです。

## 【番外編】GENERATE_ARRAYで100万個以上の連番を生成する方法
上で紹介した方法で、連番を作る場合、作れる連番の最大個数は1048576 (=2^20) に制限されてしまいます。
この制限を突破してみたいと思います。
「そんなにデカい連番なんていらないよ」という意見は無視します。

とりあえずは、1億行の連番を作ってみます。

```sql
WITH T AS (SELECT
  GENERATE_ARRAY(100 * l - 99, 100 * l) AS m
FROM
  UNNEST(GENERATE_ARRAY(1, 1000000)) AS l)

SELECT n FROM T, UNNEST(m) AS n
```

GENERATE_ARRAYが2重になりました。
内側のGENERATE_ARRAYで100万までの連番を作り、外側のGENERATE_ARRAYでそれを100倍にしています。

これで、100万行 * 100 = 1億行の連番が作れました。
Excelマクロをバッチから実行する

#はじめに
Excelのマクロを使ってなんやかんやデータの集計をしたりすることがあると思います。これが定型的な処理で日次とか週次で実行する、あるいはパラメーターを変更して大量のケースを機械的に行う必要がある、というような場合、いちいちExcelファイル開いてパラメーター変えてポチっとマクロのボタン押すってのも面倒なので、自動化したいですよね。
バッチファイルからExcelマクロを実行することができる、ってのが分かったので整理します。何かと応用が利いて便利だと思います。

#マクロを実行するVBScript
バッチから...と言いつつ、実はVBScriptです。というのも、VBScriptはよく分からないので、基本バッチを使ってバッチで出来ないところは他の仕組みで補うという方針なもので...

関連記事:
[Windowsバッチまとめ](http://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f)
[Windowsバッチまとめ 補足: バッチで出来ないことを他の仕組みで補う](http://qiita.com/tomotagwork/items/5a0e418ceca9b816df51)

以下のようなVBScriptを用意します。

```vbnet:runExcelMacro.vbs
'argument: <ExcelFile> <MacroName>
'ex: "c:\xxx\yyy\zzz.xlsm" Macro1

Dim obj
Set obj=WScript.CreateObject("Excel.Application")

obj.Visible=False
obj.Workbooks.Open WScript.Arguments(0)
obj.Application.Run WScript.Arguments(1)
```

第一引数にマクロを含むExcelファイル名、第二引数に実行したいマクロ名を指定して、上のVBScriptを実行すると、指定したマクロが実行されます。

次に、以下のような、Macro_Test01というマクロを含むExcelファイルtemplate.xlsmを用意します。

```vbnet:
Sub Macro_Test01()
    Dim env_Arg01
    Dim env_Arg02
    
    env_Arg01 = Environ("Arg01")
    env_Arg02 = Environ("Arg02")
    
    Range("A1").Value = env_Arg01
    Range("B1").Value = env_Arg02
    
    ThisWorkbook.Save
    Application.Quit

End Sub
```

ポイントは以下です。
マクロ実行時に引数を直接渡すのは難しそうだったので、環境変数で値を受け渡しする想定にしています。VBAで環境変数の値を取得するには、Environ()を使います。
処理としては、Arg01, Arg02という環境変数の値を取得して、それぞれA1,B1セルに格納します(サンプルなのでやっている処理に意味は無いです)。本来は、ここに実際に処理したいコードを書きます。
最後に、ThisWorkbook.Saveでファイルを保存し、Application.Quitでアプリケーションを終了します。

このマクロを呼び出すバッチのサンプルを書いてみます。

```bat:macro_test.bat
@echo off
setlocal enabledelayedexpansion
cd %~dp0

copy template.xlsm test01.xlsm

set Arg01=aaa
set Arg02=111

runExcelMacro.vbs %~dp0\test01.xlsm Macro_Test01
```

まず、テンプレートとして作っておいたExcelファイル(マクロ付)をコピーして別名のファイル(test01.xlsm)を作ります。環境変数Arg01, Arg02を設定してから、新しく作ったファイルのマクロをVBScriptにて実行しています。
生成されたtest01.xlsmを開いてみると、指定したArg01, Arg02の値がA1,B1セルに格納されていることが確認できます。

ちなみに、Excelの設定によってはマクロを有効にしているとファイルを保存する際(ThisWorkbook.Saveの際)に、「プライバシーに関する注意: このドキュメントには、マクロ、ActiveX コントロール、XLM 拡張パックの情報、または Web コンポーネントが含まれています。」というようなポップアップが出て、確認を促される場合があります。そうすると「OK」ボタンを押すなどインタラクティブな操作が必要になって自動化の妨げになってしまいます。
このポップアップが出る場合は、以下の情報を参考に、ポップアップを抑止しておくとよいでしょう。

参考: 
[「プライバシーに関する注意: このドキュメントには、マクロ、ActiveX コントロール、XLM 拡張パックの情報、または Web コンポーネントが含まれています。」と表示される](http://pasofaq.jp/office/excel/privacynote.htm)
[Excelの"プライバシーに関する注意"の確認ダイアログを黙らせる](http://qiita.com/ktyubeshi/items/45e65efb5d056b3d9e34)
AppEngineからAWSに接続する

諸事情により、AppEngineからAWSに接続することになったのですが、
エラーにより多大な時間を費やしてしまったので、自分用メモを兼ねて。


# やりたかったこと
GCP上のAppEngineから、AWS上のDynamoDBに接続。
（無事にAppEngineも東京リージョン使えるようになってよかった！）


## GCP側
- AppEngineのみ
  - standard environment 
  - RuntimeはPython 2.7
  - フレームワークはFlask


## AWS側
- DynamoDBのみ


# やってみる
## AppEngineのコード


```app.yaml
application: xxxxxx
module: xxxxx
runtime: python27
version: initial

handlers:
- url: .*
  script: main.app

env_variables:
  AWS_DEFAULT_REGION: 'ap-northeast-1'
  AWS_ACCESS_KEY_ID: 'XXXXXXXXXXX'
  AWS_SECRET_ACCESS_KEY: 'XXXXXXXX'
```

```main.py
from flask import Flask, request, jsonify
import logging, json
import boto3

app = Flask(__name__)

@app.route('/<user_id>')
def dynamotest(user_id):
    dynamodb = boto3.resource("dynamodb")
    table = dynamodb.Table('table_name')
    response = table.get_item(Key = {"user_id":user_id})
    logging.info(response)
    return jsonify(Result=response)
```


# 実行してみる
**エラー！**
`NameError: global name 'ssl' is not defined.`

同じコードをローカルだったりGCEだったりで動かすと全く問題ないのに、AppEngineだと動かない。


# 解決方法
app.yamlに以下を追記すれば解決

```
libraries:
- name: ssl
  version: "latest"
```


分かってしまえばどうってことないのですが、なんだかんだこれでむっちゃ時間を浪費しました。
sslのライブラリは明示的に書かないとダメっぽい。
いい感じにgit flowを使ってリリース時にタグを打つ

## tl; dr

https://github.com/kotamat/dotfiles/commit/4c5f8e045752af3e61bbe63ada311a92d30fd161
## 使う機能

- `git flow`
- `git describe`
- `version_up.sh`
- git config

### git flow

http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html
↑これ見てね
って感じですが、GitLabとかでMergeRequestを作成していると、使わない機能もちらほら。。
その中でも`git flow release`に関しては、とても使い勝手がいいので、これだけのために使ってます。

#### release

git flowでやるreleaseのフローは

1. `start [version]`でreleaseブランチを作成。
2. リリース用のゴニョゴニョする
3. `finish [version]`でdevelopとかmasterにマージ、タグも付けちゃう

なのですが、finishのときに `-p` オプションをつけると、3.で作成したものを全部pushしてくれます。(1. でもしリモートブランチ作成していたらそれも消してくれます)

tagせっかく作ったのにpushしわすれてたーとか発生しません。

しかしながらコード長いのでエイリアスを貼っときます。

```conf:.gitconfig
frs = flow release start
frf = flow release finish -p
```


### git describe

最新のタグを表示するものです。
もし現状のコミットが最新のタグから乖離しているばあいは、`[tag]-[tagから現在までにコミットした回数]-[ハッシュ値]`
となってしまい、辛い感じになってしまいます。

基本的に上記のフローでリリースをしているとmasterブランチは最新のタグの状態になっている**はず**なので

`git describe master`

とやってあげれば直近のタグのみを取得することができます。

### version_up.sh

http://sinsoku.hatenablog.com/entry/2014/06/01/195735
こちら参考にさせていただきました。

`echo 1.1.0 | version_up.sh [上げたいバージョン]`ってやればバージョンアップしたバージョンを返してくれます。

バージョン番号はこのスクリプトだと`[0-9\.]+`しか対応しないので、それ以外の文字列を削除するスクリプトを挟んであげます。

```conf:.gitconfig
vup = !git describe master | sed 's/[^0-9\\.]//' | ~/.zsh/version_up.sh
```

### gitconfig

言わずとしれた、gitコマンドのエイリアス設定ファイル。(まぁほかもあるけどね)}

下記を登録しています。 ( https://github.com/yuroyoro/dotfiles を参考にさせていただいております)

```gitconfig
[alias]
  ff  = flow feature
  ffl = flow feature list
  ffs = flow feature start
  fff = flow feature finish
  ffc = flow feature checkout
  ffp = flow feature publish
  fr = flow release
  frs = flow release start
  frf = flow release finish -p
  fh  = flow hotfix
  fhl = flow hotfix list
  fhs = flow hotfix start
  fhf = flow hotfix finish
  fhp = flow hotfix publish
  fs  = flow support
```


### 全部まとめる

developブランチで

```bash
git frs `git vup bugfix`
```
でリリースブランチ作成

リリースブランチで

```bash
git frf `git vup bugfix`
```
でリリース終了