OmniAICreator/Qiita-1.07M huggingface dataset:
最近のnologinは/etc/shellsに含まれていない

PIでFTP専用アカウントを作ろうとしたらハマったので忘れないように記録。

`# useradd -s /usr/sbin/nologin newuser`
`# passwd newuser`
という感じでユーザーを作成するも、ftpクライアントからは何をやっても接続を拒否される。
最初は単にパスワード指定を忘れたのかと再設定しても解決せず。
どうにも理由がからぬまま、試しにシェルを特に指定しないでadduserにてユーザーを作成
(即ちデフォルトの/bin/bashが指定されてる）した所、あっさり接続に成功。このためどうもシェル指定が怪しいと調べてみると
最近のディストリビューションは/etc/shellsにはnologinを含まないのがトレンドのようでした。

/sbin/nologinに含まれていないプログラムでは自動的にログオンを拒否されるとのこと。
このため/etc/shellsを修正することとします。

```sh:/etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
```
次のように修正

```sh:/etc/shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/sbin/nologin　#←追加
```
ちなみにvsftpdによるftpサーバーも同等の結果になりました。

#参考文書
[/bin/false と /sbin/nologin と /etc/shells について](http://d.hatena.ne.jp/littlebuddha/20090805/1249457771)
Vue.jsのv-modelにオブジェクトの配列をバインドする

# やりたいこと
Vue.jsのv-modelにバインドされるデータをオブジェクトの配列にする

例えば、

```js
new Vue({
  el: '#app',
  data: {
  	vals: [
		{id: 1, name: "a"},
		{id: 2, name: "b"},
	],
    checkedVal: []
  }
});
```
のようなデータを以下の通りバインディングしたとき、

```html
<p v-for="val in vals">
  {{ val.name }}
  <input type="checkbox" v-model="checkedVal">
</p>
```
チェックボックスにチェックをつけると ```checkedVal``` には ```vals``` の要素オブジェクトまるごとを入れたいという感じ。

jsfiddle書いたのでそちらを見たほうが早いかもしれない
https://jsfiddle.net/seihmd/kaghf0xd/

# やりかた

v-modelをつけたタグに ```v-bind:value="val"``` をつければいい。

```html
<input type="checkbox" v-model="checkedVal" v-bind:value="val">
```
実際の動作はfiddleのほうで。

# 初期値を設定したいとき

v-modelにバインドする配列（上記jsで言えば``` checkedVal ```）に値を設定しておけばチェックボックスをtrueにしておくこともできるが、オブジェクトの場合は各プロパティの値が同じであれば同一とみなされるようだ。

こう書くと対応する対応するチェックボックスがtrueの状態でレンダリングされる。

```js
data: {
	vals: [
		{id: 1, name: "a"},
		{id: 2, name: "b"},
	],
    checkedVal: [{id: 1, name: "a"}]
  }
```

比較のパフォーマンスは落ちるだろうし、どのような値のプロパティでも比較できるわけはないので、オブジェクトまるごとを使うのはシンプルな構造の場合にとどめておいたほうがいいと思う。

# 一部のプロパティだけ渡したい

オブジェクトまるごとではなく一部のプロパティだけを渡したい場合はvalueで指定してやればok

```html
<input type="checkbox" v-model="checkedVal" v-bind:value="{id: val.id, name: val.name}">
```

https://jsfiddle.net/seihmd/emcbempx/
【Go】超軽量なスクレイピングライブラリ作ってみた

# リポジトリ

https://github.com/nakabonne/netsurfer

# はじめに

Webクローラーを開発する際、フルスクラッチで作るのは少し面倒だし、フルスタックなのはいらない、、という時に丁度いいライブラリがなかったので作りました。
本当に最低限の機能のみ搭載しました。

# 機能

主な3つの機能を紹介します

## オーガニック検索

キーワードを入れて自然検索結果画面に表示されるページURLを返します。

```sample_search.go
import "github.com/ryonakao/netsurfer"
urls, err := netsurfer.OrganicSearch("キーワード", 3)
```

## 順位調査

指定キーワードで検索した時、指定ページがオーガニックで何位に掲載されるかを返します。

```sample_rank.go
import (
	"net/url"
	"github.com/ryonakao/netsurfer"
)
u, _ := url.Parse("https://qiita.com/ryonakao")
rank, _ := netsurfer.GetRank(u, "ryonakao", 2)
```

## HTML取得

```sample_HTML.go
import "github.com/ryonakao/netsurfer"
html, err := netsurfer.GetHTML("https://qiita.com/ryonakao")
```

## まとめ

もし使って頂き、不備等がございましたらお申し付け下さいませ。
Kotlin(3)関数

# 前回
[変数について](https://qiita.com/pe-Daniel/items/a87ac42f76124064b4b4)
# 関数について
プログラミングをするにあたって関数は乱用したほうがいい(?)ので、Kotlinでの関数の使い方を説明します。

# 普通の形
多くの言語と似たような書き方です

```
fun 関数名(引数名1: 型,引数名2: 型): 返り値の型{
    //処理
    return 返り値
}
```

もちろん戻り値がないような関数では省略できます

```
fun 関数名(引数名1: 型,引数名2: 型){
    //処理
}
```
## 例文

```kotlin
fun main(args: Array<String>) {
    val a = 5
    val b = 8

    val s = sum(a, b)

    println("a + b = $s")
    // a + b = 13
}

fun sum(a: Int, b: Int): Int{
    return a + b
}
```

# 短い関数
上の例文のように中身が少ない関数については下のように書くこともできます。

```
fun 関数名(引数名1: 型,引数名2: 型): 返り値の型 = 返り値
```
戻り値の型がはっきりしている場合は更に

```
fun 関数名(引数名1: 型,引数名2: 型) = 返り値
```
とできます

## 例文
```kotlin
fun main(args: Array<String>) {
    val a = 5
    val b = 8

    val s = sum(a, b)

    println("a + b = $s")
    // a + b = 13
}

fun sum2(a: Int, b: Int) = a + b
```

# 次回
if文を忘れていたのでfor文と一緒に紹介します
ExcelVBAのThisWorkbookのコードにテキストファイルの内容を貼り付ける


ThisWorkbookのコードにC/work/Macro.txtの内容を貼り付ける

```
ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.AddFromFile "C:\Work\Macro.txt"
```

テキストを貼り付けたい場合は以下

```
ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.AddFromString ("Sheet1")
```
AWS RDSのセキュリティグループとaws rds download-db-log-file-portion

#こんばんは
神谷です。４回目の投稿です。
#今日も小ネタ
すごい小さいネタです。
RDSのセキュリティグループ、インバウンドをTCP/3306オンリーにして、aws rds download-db-log-file-portionが出来るのかどうかです。
#結果
出来ました。フツーに。
サーバ内部の情報を取得するコマンドなので、サーバに対して何かしらの通信をしちゃうんじゃないかと思い、セキュリティグループを制限する事でコマンドが失敗してしまうのでは……と恐れていたのですが、杞憂でした。
出来るんですね。
#終わりに
超小ネタですが、自分が調べた限りではどこにも載ってなかったので書いてみました。
(調べたら公式に載ってたりするかもですが)
ではでは。
TensorFlowで「Nan in summary histogram for:」というエラーに遭遇した時

TensoFlowを色々と触りながら試している時に
「InvalidArgumentError (see above for traceback): Nan in summary histogram for」
というエラーに遭遇しました。

# 原因
**学習率が高すぎて、コストが無限大に発散してしまっている。**

日本語でこのエラーに遭遇した記事がなかったので、英語のstackoverflowをググっていると
どうにも「learningRateを下げてみてくれ」と書いてあるようだったので、その通りに試してみたところうまくいきました。

学習率を0.01 → 0.001に修正することで、このエラーが出なくなりました。

[この記事のコメント3つ目](https://stackoverflow.com/questions/35976511/issue-with-tensorflow-summary)
![スクリーンショット 2017-11-06 21.15.41.png](https://qiita-image-store.s3.amazonaws.com/0/114709/59012b0f-a20a-a8b5-7c19-32e0c19bb7f8.png)
Spring Boot において、Interceptor を定義した結果、JUnit にて想定外の動作になる現象が発生した話

#概要
原因は全くわかりませんが、下記のようなインターセプターを定義した結果、JUnit 上の検証において、全く想定と異なる動作になりました。

例：

- 本来 NULL になり得ない値が NULL になる。
- CSVの出力結果を zip で取得し、解凍したところ、思いもしない文字列が取得された

```interceptor.java
@Aspect
@Component
@Slf4j
public class TraceInterceptor {

    private static final String POINT_CUT = "com.example.service.*.*(..))";

    @Before(POINT_CUT)
    public void before(JoinPoint joinPoint) {
        log.info("{}#{} is called … parameters = {}, by \n",
                joinPoint.getTarget().getClass(),
                joinPoint.getSignature().getName()
                Arrays.toString(joinPoint.getArgs());
    }

    @After(POINT_CUT)
    public void after(JoinPoint joinPoint) {
        log.info("{}#{} is successfully finished \n",
                joinPoint.getTarget().getClass(),
                joinPoint.getSignature().getName());
    }
}
```

もちろん、@Around においても同様の動作となりました。

#対処策
現在検討中です。。。なんとか対処したいところです。

```
TypeScriptで型定義されていないモジュールを読み込む方法

# 普通に
普通に読み込むとエラーになります。

```ts:app.ts
import * as hoge from 'hoge';
```

# 推奨
ソースフォルダに`適当な名前.d.ts`ファイルを作って以下の内容を書きます。

```ts:types.d.ts
declare module 'hoge';
``` 

あとは普通に読みこめばOKです。

```ts:app.ts
import * as hoge from 'hoge';
```

## ワイルドカード
ワイルドカードも使えます。

```ts:types.d.ts
declare module '*';
``` 

# 非推奨
これでも一応出来ますが、あまりおすすめはしません。

```ts:app.ts
declare function require(path: string): any;
const hoge = require('hoge');
```

# 参考
* https://github.com/Microsoft/TypeScript/issues/6615
オフラインリアルタイムどう書くF06の回答

枝刈りとかを工夫して1時間以内。

```ruby:f06.rb
def count( n, t, m )
  return 0 if n < t
  return 1 if n == t
  m[n] || m[n] = count( (n/2-10), t, m ) + count( (n*2/3), t, m )
end

def solve( input )
  parent, target = input.split(',').map( &:to_i )
  count( parent, target, {} ).to_s
end

def test( input, expected )
  actual = solve( input )
  if expected != actual
    puts 'NG: input = %s, expected = %s, actual = %s' % [ input, expected, actual ]
    exit 1
  else
    puts 'OK: input = %s, actual = %s' % [ input, actual, ]
  end
end

test( "123,4", "5" )
test( "1,1", "1" )
test( "2,1", "1" )
test( "3,3", "1" )
test( "19,5", "1" )
test( "69,5", "3" )
test( "88,9", "2" )
test( "1,100", "0" )
test( "100,4", "4" )
test( "101,9", "0" )
test( "456,7", "7" )
test( "567,8", "12" )
test( "756,10", "10" )
test( "789,10", "12" )
test( "896,29", "2" )
test( "7764,6", "664" )
test( "1234,56", "3" )
test( "8563,29", "35" )
test( "12345,67", "10" )
test( "72927,51", "263" )
test( "71441,145", "22" )
test( "123456,78", "397" )
test( "123456,789", "1" )
test( "592741,216", "55" )
test( "913826,584", "81" )
test( "1234567,89", "2293" )
test( "10000000,1", "19383507" )
test( "12345678,9", "3567354" )
test( "6215879,358", "2907" )
test( "12345678,90", "79419" )
test( "5745432,1032", "1287" )
```
オフラインリアルタイムどう書くE17の回答

1時間ほど。
回分になる値の最小と最大でループを回してチェックしています。

```ruby:e17.rb
def get_min_head( num, base )
  head_length = num.to_s(base).length / 2
  if head_length > 0
    ("1" + "0" * (head_length - 1)).to_i(base)
  else
    1
  end
end

def get_max_head( num, base )
  str = num.to_s(base)
  length = str.length
  if length.even?
    str[0...(length/2)].to_i(base)
  else
    ("1" + "0"*(length/2)).to_i(base) - 1
  end
end

def is_include( num, base, min, max )
  (min...max).include?( num.to_i(base) )
end

def solve( input )
  a, b, base = input.split(',').map( &:to_i )
  min_head = get_min_head( a, base )
  max_head = get_max_head( b, base )
  sum = 0
  (min_head..max_head).each { |n|
    head = n.to_s(base)
    sum += 1 if head.length == 1 and is_include(head, base, a, b)
    sum += 1 if is_include((head+head.reverse), base, a, b)
    (0...base).each { |i|
      sum += 1 if is_include((head+i.to_s(base)+head.reverse), base, a, b)
    }
  }
  sum.to_s
end

def test( input, expected )
  actual = solve( input )
  if expected != actual
    puts 'NG: input = %s, expected = %s, actual = %s' % [ input, expected, actual ]
    exit 1
  else
    puts 'OK: input = %s, actual = %s' % [ input, actual, ]
  end
end

test( "12,34,5", "5" )
test( "10,11,10", "0" )
test( "1,100,3", "18" )
test( "11,12,10", "1" )
test( "12,13,10", "0" )
test( "123,456,7", "33" )
test( "38,274,14", "17" )
test( "98,76543,2", "535" )
test( "987,6543,2", "103" )
test( "5057,5202,3", "2" )
test( "98,76543,21", "589" )
test( "987,6543,21", "264" )
test( "1097,2889,11", "35" )
test( "2764,6482,17", "132" )
test( "16333,24085,8", "121" )
test( "21759,67173,20", "114" )
test( "32026,57805,22", "53" )
test( "188318,407853,6", "523" )
test( "51669,116065,30", "72" )
test( "294104,515248,32", "216" )
test( "444257,740280,15", "1316" )
test( "645098,2741620,9", "2876" )
test( "12345,987654321,2", "62684" )
test( "2467130,8433468,2", "2902" )
test( "323901,4712975,10", "4389" )
test( "12345,987654321,36", "67446" )
test( "3969344,4086910,24", "205" )
test( "19743263,83912295,5", "11553" )
test( "6349529,39870823,10", "6637" )
test( "66160071,153732445,5", "5605" )
test( "18799557,189007582,14", "33741" )
test( "78547566,225312226,20", "18346" )
test( "143084571,506549072,18", "62323" )
test( "2099642384,2789567569,6", "14787" )
```
【jQuery】slickを使ってカルーセル(スライダー)を実装する

# 概要

jQueryを使用しているサイトに「slick」でカルーセル(スライダー)を導入する方法。

![スクリーンショット 2017-11-06 19.19.29.png](https://qiita-image-store.s3.amazonaws.com/0/95607/232390e6-b753-f597-0f1d-2e4f0af064da.png)

個人的な要件は以下の通りです。

- Tumblrの無料配布テーマ(jQuery、Google Fonts使用)にカルーセルを導入したい
- スライドさせる要素を外出しにしたい（同ドメイン他ファイル）
- スライドさせる要素をリンクにしたい

## slickについて

[slick - the last carousel you'll ever need](http://kenwheeler.github.io/slick/)

jQuery、Google Fontsの他に、スタイルシートとJSを読み込めば以下のコードでカルーセルを実装できるプラグインです。

```js
$('.slick').slick();  // 子要素をスライドさせる
```
## 試したTumblrテーマについて

[Craft Space  | Tumblr](https://www.tumblr.com/theme/39318)

jQueryとGoogle Fontsを使用しているレスポンシブテーマです。
左カラムのpostの上にカルーセルを配置するものとします。

# 実装

## プラグインの読み込み

### スタイルシートの読み込み

Google Fontsを読み込んでいる箇所より後でプラグイン用CSSとテーマCSSを読み込みます。

```HTML
<!-- slick -->
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.1/slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.1/slick/slick-theme.css"/>
```

### プラグインJSの読み込み

jQueryを読み込んでいる箇所より後でプラグインJSを読み込みます。

```HTML
<!-- JavaScript: slick -->
<script type="text/javascript" src="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.1/slick/slick.min.js"></script>
```

**【引っかかったポイント】**

- slickのドキュメントが書かれた後に[jsDelivr](https://www.jsdelivr.com/)の仕様が変わっているので、ドキュメントに記載されているCDNのURLを叩いても何も出ません。
- `slick-theme.css`を読み込まないとデフォルトのデザインは使えません。カスタムする場合もテーマCSSを読み込んだ後に上書きする方が時間がかからないと思います。

## スライドさせる要素の実装

### HTMLの記述

スライドさせる要素を記載します。今回は以下の理由で子要素を外出しにしました。

- 要素が多い(6ステージ * 6海域 = 36)
- 記述の変更がすぐ必要になりそう
- 同様のカルーセルをサイト内で複数使うかもしれない

```HTML:/index.html
<!-- slick -->
<div class="slick"></div>
```
```HTML:/slick/kancolle
<ul class="slick__kancolle">
  <!-- 1 /////////////////////////-->
  <li><a href="/tagged/鎮守府正面海域">1-1. 鎮守府正面海域</a></li>
  <li><a href="/tagged/南西諸島沖">1-2. 南西諸島沖</a></li>
  <li><a href="/tagged/製油所地帯沿岸">1-3. 製油所地帯沿岸</a></li>
  <li><a href="/tagged/南西諸島防衛線">1-4. 南西諸島防衛線</a></li>
  <li><a href="/tagged/鎮守府近海">1-5. 鎮守府近海</a></li>
  <li><a href="/tagged/鎮守府近海航路">1-6. 南西諸島沖</a></li>
  ...
</ul>
```
### JavaScriptの記述

以下の順で実行するようにしました。

1. 外部HTMLファイル読み込み
2. カルーセル実装

なお、HTMLファイルの読み込みは以下の理由から`$.get()`を使いました。

- 読み込むファイルの配置先が同一サイト(ドメイン)内
- 読み込むファイルがそれほど大きくない

ドメインを跨ぐ場合や、ファイルの読み込みにおそろしく時間がかかる場合は`$.ajax()`で色々する必要があると思います。

```JS:index.html
<script>
  $.get('//fromjunkyard.tumblr.com/slick/kancolle', function(sk){
    $('.slick').append(sk); // GETした内容をdiv.slick内に追加
    $('.slick__kancolle').slick({
      dots: true,　　// スライダー下部のドットを表示する
      infinite: false,  // 無限スライドさせない
      speed: 300,
      slidesToShow: 6,  // 6要素分表示
      slidesToScroll: 6  // 6要素分送り
    }); 
  });
</script>
```

**【引っかかったポイント】**

- Tumblrのテーマ編集エディタ画面で実装しようとするとドメインを跨ぐことになるので動作確認できない

自分しか見ていないようなサイトなので最低限の設定しかしていません。
デバイスサイズに応じて要素数を変えるとか色々できるようですが、最新のプロパティについてはGitHubのREADME読むのが一番早そうです。

[kenwheeler/slick: the last carousel you'll ever need](https://github.com/kenwheeler/slick/)
サイト内の動画をGoogleアナリティクスで計測したい（WordPressの場合のおまけ付き）

# 2021年5月18日 追記
今はこんな面倒なことをしなくても Google Tag Manager で設定できるので、この記事のことは忘れて Google Tag Manager の使い方を覚えましょう。
https://tagmanager.google.com/

# 仕様
* 動画の再生回数をGoogleアナリティクス（イベントトラッキング）で計測したい
    * WordPressの投稿本文部分で入れた動画も計測したい
    * Youtubeなど外部サイトの動画は含めなくて良い
* 1回再生したら1カウント。一時停止後の再生は含めない

# コード
```js:movie.js
// video ga
var video = $('video');
var video_url = '';
if( video.length > 0 ){
	var isPlay = false;
	video.on('play playing',function(){
		if( isPlay === false ) {
			video_url = $(this).attr( 'src' );
			// Googleアナリティクス analytics.js の場合
			if ( typeof ga === 'function' ) {
				ga( 'send', {
					hitType: 'event',
					eventCategory: 'Videos',
					eventAction: 'play',
					eventLabel: video_url
				});
			}
			isPlay = true;
		}
	});
	video.on('ended',function(){
		if( isPlay === true ) {
			isPlay = false;
		}
	});
}
```
WordPress本文部分にアップロードした動画を埋め込んだ場合、単純な `video` タグではなく [mediaelement.js](https://github.com/mediaelement/mediaelement/blob/master/docs/api.md#events) が使われているので、イベントに `playing` を併記するのがポイント。
（mediaelement.jsを使ってなければ入れる必要なし）

# 同一ページ内に複数の動画ある場合。

`video` タグにIDを付与するなどして、再生フラグの変数を動的にすれば良いと思うよ（未検証）

現場からは以上です。
マストドンを2.0.0へバージョンアップを行う

# 概要
既に動いているインスタンスを2.0.0へ上げる
動かし方としてはEC2上から `docker-compose up -d` でそのまま使っている。
バージョンを上げるついでに画像データはS3へ、DBはRDSへ同時に移行させる。

## 環境
```console
$ cat /proc/version
Linux version 4.4.0-1039-aws (buildd@lcy01-02) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #48-Ubuntu SMP Wed Oct 11 15:15:01 UTC 2017
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
$ docker -v
Docker version 17.05.0-ce-rc3, build 90d35ab
$ docker-compose -v
docker-compose version 1.12.0, build b31ff33
$ git describe --tags #マストドン
v1.4rc3-24-gbbc3db8
```

# やったこと
## RDSの作成
* 時間がかかるので一番最初に作成してしまう。
* 何らかの方法で適宜RDS(PostgreSQL)を作成。
  - 特に設定はしていない。文字コードぐらい？

## S3の作成
* コンソールからS3を作成
* バケットポリシーを変更

```json:バケットポリシー
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicS3Objects",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::<YOUR BUCKET NAME>/*"]
    }
  ]
}
```

* S3へ既存の画像データをアップロード
  - `$ aws s3 sync ./public/system/ s3://<YOUR BUCKET NAME>/`

## 既存DBのダンプを取得
* docker内からダンプを取得するため、 `docker-compose.yml` を書き換える
  - dockerとバージョンの合ったpsqlコマンドを取得するのが面倒なため中から実行する。

```
  db:
    restart: always
    image: postgres:9.6-alpine
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data
      - ./dump:/dump
```

* ダンプを取得する
  - `$ docker-compose run --rm db pg_dump -h localhost -p 5432 -U <USER NAME> <DB NAME>  > /dump/dump.sql`
* 取得したダンプをRDSへ流し込む
  - `$ psql -h <RDS ENDPOINT> -U <USER NAME> <DB NAME> < ./dump/dump.sql`

## リポジトリをクローンし直す
* 現在動いているマストドンを停止させる
  - `$ docker-compose stop`
* 適当なディレクトリに移動し、マストドンをcloneする

    ```
    $ cd /opt
    $ git clone https://github.com/tootsuite/mastodon
    $ cd mastodon
    ```

## .env.productionの編集
* 運用していたマストドンディレクトリから `.env.production` を取得
  - `$ cp /path/to/mastodon/.env.production ./`
* `.env.production` を編集
    - 編集するのは `DB` パラメータと、 `S3` パラメータ。
    - S3はENDPOINTは以下の通り編集する必要あり
        - ex) `S3_ENDPOINT=https://s3-ap-northeast-1.amazonaws.com`
* VAPIDを埋める
  - `$ docker-compose run --rm web rake mastodon:webpush:generate_vapid_key` を実行して出力されたパラメータをコピペ


## DBのマイグレーションとアセットのコンパイル
* DBのマイグレーションの実行とアセットのコンパイル
  - `$ docker-compose run --rm web rake db:migrate; docker-compose run --rm web rake assets:precompile`

## マストドンの起動
* `$ docker-compose up -d`

# 参考
* [Update from 1.3.2 to 2.0.0 · Issue #5471 · tootsuite/mastodon](https://github.com/tootsuite/mastodon/issues/5471)
* [documentation/Docker-Guide.md at master · tootsuite/documentation](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Docker-Guide.md)
GlassFishを起動しようとしたら Application with name appName is already registered. となってしまった時の対応方法

- 環境
    - OS : Windows7
    - Eclipse : Kepler Service Release 2
    - GlassFish : 4.1.1

### 事象
Eclipse で GlassFish を起動したらエラーになって起動できなかった。

```text:ダイアログに表示されたエラー
cannot Deploy appName
deploy is failing=Error occurred during deployment: Application with name appName is already registered. Either specify that redeployment must be forced, or redeploy the application. Or if this is a new deployment, pick a different name. Please see server.log for more details.
```

### 原因 : 不明
`appNameという名前のアプリケーションがすでに登録されています。` と言われても・・・何度GlassFish配下のアプリケーションを削除してCleanしても解決しない・・・。

### 対応方法
1. GlassFishを停止します。
2. 同じアプリケーションをうまくデプロイできた人のdomain.xmlをもらいます。
3. もらったdomain.xmlを開きます。
4. 以下をコピーします。

```xml:もらったdomain.xml
<applications>
    <application .......各設定値.........>
      <省略>
    </application>
  </applications>
```

５. 自分のdomain.xmlの同じ位置に貼り付けます。
６. デプロイしてGlassFishを起動します。
７. GlassFishを停止 > Clean > デプロイして起動します。
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第九章 暗黙的な概念を明示的にする5  制約・プロセス

# それほど明白でない概念をモデル化する方法

よくあるオブジェクト指向の入門書では、「名詞(属性)・動詞(メソッド)」と説明されますが、名詞・動詞以外の概念をモデルで表現することができます。

書籍の中では、「制約」「プロセス」「仕様」について説明されていますので、読んでいきます。

## 制約

書籍ではバケツの例を上げています。
「バケツには、最大容量以上は追加できない」という制約ですね。

リファクタリング前では、「注ぐ(pourIn)」というメソッドのなかでif文制御していますが、制約を明示的に表現するために「最大容量以下に制限する(constrainedToCapacity)」というメソッドを追加しています。

このリファクタリングの効果は

- 制約に名前が付くので議論がしやすい
- 制約を変更しやすい
- 他の制約も追加しやすい
- 呼び出し側(バケツの例ではpureIn)がシンプルになる

といったいい効果があるので今すぐ実践したいところですね。

### 複数のオブジェクト間で成り立つ制約

上記の例は1つのオブジェクトに制約を表現したメソッドを追加しましたが、中には、複数のオブジェクトにまたがる制約もあるかと思います。

そんなときは、制約を取り出してオブジェクトにすると表現がしやすくなります。

書籍では、貨物の「オーバーブッキングポリシー」が例としてあげられています。

最近だと、飛行機のオーバブッキングポリシーが話題になりましたね。
(http://www.sankei.com/wired/news/170413/wir1704130001-n1.html)

キャンセルを埋め合わせるため、何％か予めオーバーブッキングしておくというものですが、これは「貨物」(サイズ)と「運行」(積載量)の２つのオブジェクトが関わります。

そこで「オーバーブッキングポリシー」クラスを作ることで複数のクラスにまたがる制約を表現しています。

## プロセス

ここでいうプロセスはオブジェクトを取得して→Validationして→DBに格納する・・・といったプロセスではなく、9章の最初の例であったような、「荷受け地と荷出し地から輸送日程を割り出すプロセス」といったドメインに関するプロセスのことです。

9章の最初の例のように「経路選択サービス」クラスを用意するか、12章で説明されるストラテジーパターンを使うのも方法としてありそうです。

## リファクタリングから「制約」「プロセス」を導き出す

書籍には無い内容ですが、制約とかプロセスといった概念的なオブジェクトはドメインエキスパートとの会話から出ることも多いですが、リファクタリングから導き出されることも多いような気がします。

[「現場で役立つシステム設計の原則」](https://www.amazon.co.jp/dp/B073GSDBGT/)の第2章では、「場合分けのロジックを整理する」リファクタリングの例がたくさん掲載されています。

ifの条件をメソッド化することで、それが制約として利用できたり、

料金クラスから子供料金、大人料金のクラスを作成して、それを使用して料金の合計を計算するプロセスを扱うクラスをシンプルにしたり、

JavaのEnumを利用して状態遷移のプロセスを表現したり、
暗黙的な概念を表すやり方がとてもわかりやすいので、お勧めです。

また、4章でも業務ルールの整理の仕方がわかりやすく解説されています。DDD本の9章を読む際には、[「現場で役立つシステム設計の原則」](https://www.amazon.co.jp/dp/B073GSDBGT/)も読んでおくと理解が深まると思います。

明日は「仕様」を読みます。
[C#]csvファイルの特定列の値を取得する ※ヘッダー項目を指定して取得

メモとして投稿

＜前提＞
csvにヘッダーがあること

```csharp:csvの特定列の値を取得
using System;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 全行読込
                string[] lines = File.ReadAllLines(@"D:\vcCsvPrc\test.csv",
                    Encoding.GetEncoding("Shift_JIS"));

                // 指定カラム名列判定
                int siteiClm  = 0;
                string[] sp = lines[0].Split(','); // ヘッダ
                for (int i = 0; i < sp.Length; ++i)
                {
                    if (sp[i] == "指定カラム名")
                    {
                        siteiClm  = i;
                        break;
                    }
                }

                // 指定カラム名値判定
                string[] sp2 = lines[0].Split(',');
                for (int i = 1; i < lines.Length; ++i)
                {
                    sp2 = lines[i].Split(',');
                    if (sp2[siteiClm ] == "あいうえお")
                    {
                        Console.WriteLine("エラー");
                        break;
                    }
                }
            }catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return;
        }
    }
}


```

#TextFieldParcerを使う
こっちの方がテスト的に楽かもしれない

```csharp:csvの特定列の値を取得
using Microsoft.VisualBasic.FileIO;
using System;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                TextFieldParser parser = new TextFieldParser(@"D:\vcCsvPrc\test.csv", Encoding.GetEncoding("Shift_JIS"));

                using (parser)
                {
                    parser.TextFieldType = FieldType.Delimited;
                    parser.SetDelimiters(",");

                    // 指定カラム名列判定
                    int scoreClm = 0;
                    string[] sp = parser.ReadFields();
                    foreach (String header in sp) {
                        if (header == "指定カラム名")
                        {
                            break;
                        }
                        scoreClm++;
                    }

                    // 指定カラム名値判定
                    while(!parser.EndOfData) {
                        string[] data = parser.ReadFields();
                        if (data[scoreClm] == "")
                        {
                            Console.WriteLine("エラー");
                            break;
                        }
                    }
                }
            }catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return;
        }
    }
}

```
GlassFishを起動しようとしたら"ローカル・ホスト の GlassFish 4.0 に公開中..." 中に内部エラーが発生しました。となってしまった時の対応方法

**環境**
OS : Windows10
GlassFish : GlassFish 4.1
Eclipse : Kepler Service Release 2

### 事象
EclipseでGlassFishをCleanしたらエラーになった。
![360-1.png](https://qiita-image-store.s3.amazonaws.com/0/159761/ff866d9c-5278-561d-b550-010688f65680.png)

それでも GlassFish を起動したらエラーになって起動できなかった。
![360.png](https://qiita-image-store.s3.amazonaws.com/0/159761/37d5181c-276b-8fdc-d651-bb5c5ebc3d9b.png)

```text:ダイアログに表示されたエラー
"ローカル・ホスト の GlassFish 4.0 に公開中..." 中に内部エラーが発生しました。
java.lang.NullPointerException
```

### 原因 : JREが変な設定になっていた

### 対応方法
1. [設定] > [サーバ] > [サーバ・ランタイム環境]を選択します。
2. 使っているGlassFishを選択して[編集]ボタンを押下します。![480.png](https://qiita-image-store.s3.amazonaws.com/0/159761/c71e1689-5202-87da-751f-f7ade70d0d6c.png)
3. [JRE] > アプリにあったJREを設定します。
4. GlassFishをクリーンします。
5. GlassFishを停止します。
6. プロジェクトをクリーンします。
7. デプロイしてGlassFishを起動します。
8. これで同じ事象が発生する場合はググって対応方法を探します。

### 参考にさせていただいたサイト様
- [「Glassfish server runtime requires full JDK instead of JRE」でGlassfishがEclipseにサーバー登録できない | gele.log()](http://gele.jp/glassfisheclipse/)
[C#]csvファイルを指定数分のファイルに分割する

# csvファイルの分割

アナログに分割します。。
もっといい方法、懸念事項等あればご教示ください(+o+)
※2017/11/11　ループ内のEOF判定が不要なので削除しました。

```csharp:csvファイル分割

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            
            try
            {
                // 行数を取得(ヘッダー分含まず)
                string[] lines = File.ReadAllLines(@"D:\vcCsvPrc\test.csv",
                    Encoding.GetEncoding("Shift_JIS"));
                long cntRow = lines.Length - 1;

                // 分割数の決定
                long syou = cntRow / 9;   // 商(切捨) 9は可変にする
                long amari = cntRow % 9;  // 余り     9は可変にする

                // ファイル読込
                using (var sr = new System.IO.StreamReader(@"D:\vcCsvPrc\test.csv", 
                    Encoding.GetEncoding("Shift_JIS")))
                {
                    // ヘッダー読込
                    string headRow = sr.ReadLine();

　　　　　　　　　　　// 9ファイル作成(新規作成)
                    for (int i = 1; i <= 9; ++i)
                    {
                        using (var sw = new System.IO.StreamWriter(@"D:\vcCsvPrc\bunkatsutest" + i + ".csv", 
                            false, System.Text.Encoding.GetEncoding("shift_jis")))
                        {
                            // ヘッダー挿入
                            sw.WriteLine(headRow);

                            // 余りがある場合
                            if (amari > 0)
                            {
                                // 商 + 1回数分ループ
                                for (int j = 0; j < syou + 1; ++j)
                                {
                                    // 商分書き込む
                                    sw.WriteLine(sr.ReadLine());
                                }

                                // 余り - 1
                                amari = amari - 1;
                            }
                            else
                            {
                                // 商の回数分ループ
                                for (int j = 0; j < syou; ++j)
                                {
                                    // 商分書き込む
                                    sw.WriteLine(sr.ReadLine());
                                }
                            }
                        }
                    }
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return;
        }
    }
}


```

おーわり
Migrations are pending. To resolve this issue, run: bin/rails db:migrate RAILS_ENV=development

エラーの内容
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/167576/69c0ec98-8132-89be-7fa2-95e5d37a4ef7.png)

やったこと
・bin/rails db:migrate RAILS_ENV=developmentを実行

エラーが出る。reservationモデルがないです。（自分は、このモデルを消したわけではない）

・rails db:migrate:reset RAILS_ENV=development

思い切ってリセットした。

rails db:migrate:reset RAILS_ENV=development
rails aborted!
ActiveRecord::NoEnvironmentInSchemaError: 

Environment data not found in the schema. To resolve this issue, run: 

        bin/rails db:environment:set RAILS_ENV=development
とエラーで出てダメだった。

##自分の仮説
自分は、このherokuにあげている途中ででたので、　herokuと関連したエラーでないかと思って今解決法を探しています。

http://y-yagi.tumblr.com/post/142064773890/rails-5%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9Fdb%E7%A0%B4%E5%A3%8A%E7%B3%BBtask%E3%81%AE%E9%98%B2%E6%AD%A2%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

このURLのエラーも関係あるかなと思っています
PyQtでアプリケーションにBokehのプロットを表示する

## やりたいこと
- PyQtのアプリケーションのウィンドウ（Widget）上に、Bokehで作成したプロットを表示する。

## 環境
- macOSX Sierra + Homebrew
- Qt 5.9.2 + PyQt 5.9.1 + Python 2.7.14

## コード
- 参考[1][2]を組み合わせただけ。。。

```bokeh_test.py
import sys

from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QSurfaceFormat
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView

from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import file_html

QSurfaceFormat

app = QApplication( sys.argv )
wv = QWebEngineView()

plot = figure()
plot.circle([1,2], [3,4])

wv.setHtml( file_html( plot, CDN, 'test plot' ) )
wv.show()
app.exec_()
```

## 結果と問題点
- プロットはちゃんと表示されて、インタラクティブな操作も可能。
- 一度HTMLに吐いてQtのウィジェットに読ませているのでオーバーヘッドは大きい。リアルタイムの更新にはまったく向かない。
- 下のようなエラーが延々と出つづけるが、`QWebEngineView` にURLでwebコンテンツを流し込んでも同じエラーが出るので、bokeh由来のものではないと思われる。
  - PyQt 5.10 で解決している？[3]

```
$ python ./bokeh_test.py
AVDCreateGPUAccelerator: Error loading GPU renderer
[74021:54803:1106/192459.078484:ERROR:gl_context_cgl.cc(136)] Error creating context.
[74021:54803:1106/192459.080919:ERROR:gl_context_cgl.cc(136)] Error creating context.
[74021:54803:1106/192459.081294:ERROR:gl_context_cgl.cc(136)] Error creating context.
[74021:54803:1106/192459.087998:ERROR:gl_context_cgl.cc(136)] Error creating context.
```

## 参考
1. [Bokeh - Embedding Plots and Apps](https://bokeh.pydata.org/en/latest/docs/user_guide/embed.html)
2. [stack overflow - Answer by ranieribt](https://stackoverflow.com/questions/39329523/pyqt5-qtwebenginewidgets-have-no-effect)
3. [Qt - QTBUG-60605](https://bugreports.qt.io/browse/QTBUG-60605)
itch.ioに投稿する際に使用するコマンドラインツールについてのメモ

# 前置き
[itch.io](https://itch.io)はPay What You Want方式を採用した、インディー開発者向けのゲーム配信プラットフォームです。配信可能なものは主にゲームですが、それ以外のものも配信可能のようです。販売価格については、完全無料、無料+寄付、最小価格の3種類から選ぶことができます。

くわしくは、[About](https://itch.io/docs/general/about)や[FAQ](https://itch.io/docs/general/faq)を読むといいです。

# itch.ioのコマンドラインツール「butler」
ダッシュボードのプロジェクトのウェブページからzipファイルをアップロードしても良いのですが、効率化や自動化のために[butler](https://itch.io/docs/butler/)というコマンドラインツールが用意されています。

butlerを使うと毎度毎度自分でzipファイルを作成しなくて済みます。2回目以降には、各ファイルの変更のチェックを行うので、効率的にアップロードしてくれます。

## 使い方
使い方については上記のリンクからドキュメントを読めばわかるのですが、必要そうな部分だけ大雑把にメモします。Windows環境っぽい感じで書きますが、mac版、Linux版もあります。

`butler.exe push <directory> <username>/<project>:<channel>`
directoryはアップロードするファイルの入ったフォルダを、
usernameはitch.ioのアカウント名を、
projectはプロジェクト名(プロジェクト作成時にProject URLとして指定した文字列)を、
channelはwinだとかbetaだとかを記述します。
projectとchannelを組み合わせたものが、ユーザーがダウンロードするzipファイルの名前になります。
[channelに指定する文字列](https://itch.io/docs/butler/pushing.html#channel-names)によってitch.ioが自動的にOSを認識します。

識別番号がアップロード毎に自動で割り振られますが、別途、任意のバージョン名をつけたい場合は、
`--userversion <version_string>`
を追加します。
version_stringは数字でもアルファベットでも好きなものをつけられます。
ダウンロードボタンの周辺に表示されるようになりますが、zipファイル名には含まれないようです。

アップロード状況の確認には、
`butler.exe status  <username>/<project>`
を使います。

# itch.ioのマニフェストファイル
ところで、itch.ioにはクライアントアプリである[App](https://itch.io/app)があります。これはSteamクライアントと同じようなもので、ゲームアプリの管理をしてくれます。
Webから直接ゲームのzipをダウンロードすると、インストール(zip展開)やアップデートについてはユーザーが自分で行わなければなりませんが、Appを入れておけば、インストールやアップデートなどを自動で行ってくれます。
なにより、Webは英語のみであるにも関わらず、Appは日本語化されています。

個人的には、絶対に入れた方が良いと思っているのですが、公式的にはあくまでWebがベースでAppは二番手の扱いのようです。

## App Manifest
[App Manifest](https://itch.io/docs/itch/integrating/manifest.html)を、アップロードするフォルダの中に含めると良いことがあります。
起動ファイルの指定をしたり引数を指定したり、ゲームの公式サイトを開いたり、説明書PDFを開いたりするボタンをAppに追加することができます。
TOMLというコンフィグファイル言語で記述します。

難しいものではないのですが、私がハマってしまった罠としては、プロジェクトのClassificationによってはマニフェストが無視されることがあるというものがあります。
UE4で開発したあるVR音楽鑑賞アプリについて、Gameではないと思いSoundtracksにしたところ、マニフェストの内容が全く無視され、フォルダが開くボタンしか表示されないということがありました。(Toolは大丈夫でした。)
Bashでsplitみたいな処理

メモ書き。

引数で指定したファイルのレコードを1行づつデリミタで区切る処理。
(例はカンマ(,)区切)

#読み込むファイル
```test.txt
bokuha,hentai
```
#シェル
```split.sh
#!/bin/sh
filename=$1
IFS=','
while read line ; do
  set -- ${line}
  echo $1
  echo $2
done < ${filename}
```

#実行結果
[xxx@xxx xxx]# ./split.sh test.txt
bokuha
hentai
[xxx@xxx xxx]#

#説明(一応)
`filename=$1`
→引数1に指定したファイル名を変数に設定。

`IFS=','`
デリミタ変数IFSに','を設定。
IFSはBashのデリミタの環境変数。デフォルトだと`"$'\n'$'\t' "(改行・タブ・半角スペース)`が設定されている。

`while read line ; do ～ done < ${filename}`
ファイルを1行ずつ読み込み。
readコマンドはIFSの値で読んだ行を区切り変数に格納($1,$2,...)

#補足
IFSはexportで定義しちゃうと(今回は関係ないけど)子プロセスに影響を与えちゃうので注意(用が済んだら戻す/必要なければシェル変数で)。
Visual Studio Code + Vim拡張で行端のカーソル移動設定

いつの間にかwhichwrap設定が追加されていた。ありがたや。
https://github.com/VSCodeVim/Vim#vim-settings

Setting|Description
:--|:--
vim.whichwrap|(略)To wrap "everything", set this to h,l,<,>,[,].

---

Visual Studio CodeにVim拡張を入れて使用しているが、行頭左移動で前の行末、行末右移動で次の行頭に移動したいと思った。
keybindings.jsonから次の設定を削除した（左の例だが右も同様に削除する）。

```
{
  "command": "extension.vim_left",
  "key": "left",
  "when": "editorTextFocus && vim.active && !inDebugRepl"
}
```

これで**カーソルキーによる移動については**実現できた。
Vimなので、肝心なのは**hl**なのだが…

~~whichwrapに対応する設定がVSCodeのVim拡張には現在は存在しない。
https://github.com/VSCodeVim/Vim/issues/1211~~
【MarkLogic Server】XML要素名の命名規則についての考察

はじめに
===
「要素」はXML形式データにはなくてはならないものです。XMLは要素によってデータを識別します。関係データベースにおける表名や列名に相当するものです。
基本的にあらゆるデータを表形式にとらわれずに表現できるのがXMLの特徴ではありますが、この要素名には決まりがあります。今回はそれを整理してみましょう。

要素のネーミング規則
===
以下に、要素名の許可ルールです。大まかに1文字目とそれ以外で分かれています。このルールはMarkLogicに限らずXMLファイルとしてのルールです。

| 文字の位置 | 利用可能な文字 |
|---|---|
| 1文字目 | 英字, _(アンダースコア), :(コロンただし非推奨), 漢字, 全角ひらがな, 全角カタカナ |
| 2文字目以降 | 1文字目に使える文字, 数字, .(ピリオド), -(ハイフン)など  |

また以下の使用不可もしくは非推奨があります。例を示しつつ列挙してみました。

| 記述例 | 説明 |
|---|---|
| 2020年10月 | 先頭が数字は使用不可 |
| ﾌﾘｶﾞﾅ | 半角カナ、全角英数字、全角空白は使用不可 |
| xml | XML宣言の被るため使用不可。Xmlなど大小文字を混ぜるのも含む。 |
| 要 素 | 途中のスペースは使用不可 |
| a:date | コロンは名前空間で使われるため非推奨 |

先頭に数字が禁止されている点は、Oracleとも共通していたりします。「2018_10_30の売上高」といったような数字による分類があるときは気を付けましょう。一方で予約語については、それぞれのDBの特徴が出ています。例えば「DATE」というのはOracleの列名では使えませんが、XMLDBの要素名としては使えたりします。

要素の長さについて
===
ここで気になったのは、要素名の長さが性能に影響するかです。というのも表形式のデータの場合、最初の行だけに列名を書いていますが、XMLの場合は全ての列に要素名を記述することになるからです。そこで要素名長を変えつつ、データロードと検索を行ってみました。

データは基本的にこんな感じのものを100万ファイル用意します。実際には100万行のCSVファイルをContent Pumpを用いてロードしました。

```
<root>
    <key01>Tjr5v8Ye_000000000001</key01>
    <key02>0ZCIjYAg_000000000001</key02>
    <key03>EdnTwU9F_000000000001</key03>
    ・・・ (47要素) ・・・
</root>    
```

試験パターンとして各要素名の末尾に一定数の「kkk...k」という文字を付加してみます。例えば、key01の場合はkey01kkkkkkkkkkkkkkkkkkkkとします。

CSV出力クエリはこんな感じです。PROCESSクエリだけ表示します。$elementName-seqへの代入の部分は長くなるので省略しますね。
(試験環境やCoRBによるCSV出力方法については[こちら](https://qiita.com/JucoML/items/2842091ba1ee0c47414e)をご参照ください。)

```
xquery version "1.0-ml";
declare variable $URI xs:string external;
let $elementName-seq := ("key01", "key02", ..., "key50")
let $doc := cts:search(/*, cts:document-query($URI))
let $text-seq := 
  for $i in $elementName-seq
    return $doc/*[fn:name() = $i]/text()
return fn:string-join($text-seq, ",")
```

結果はこうなりました。

| 末尾のkの数 | データロード[秒] | データサイズ[GB] | CoRBによるCSV出力[秒] |
|---|---|---|---|
| 0 | 2,685 | 12.83 | 898 |
| 20 | 2,831 | 13.73 | 922 |
| 40 | 3,007 | 14.25 | 942 |

おおよそ、要素名の長さに比例してロード時間・データサイズ・処理時間が増加しているようです。ただ、純粋なXMLファイルのサイズが1813→3813→5813文字とかなり増加していることを考えると、現実的には多少要素名の長さが増えるのは性能面で許容可能と見ることができます。

考察
===
要素名の長さについては議論の余地があります。短すぎる要素名は意味が分からなくなるかもしれませんし他の要素名と被る可能性が出ます。一方で、長くすると可読性が低下するほか性能にも微妙な影響を与えるようです。こういったことを総合的に判断して一定の制限を加えるのが妥当だと考えます。

おわりに
===
ソースコードのコーディング規約はよく作りますが、XMLについてはどうでしょうか？おそらくXMLDBを使わない限り、Webアプリケーションが利用する少数のXMLファイルに対してのみとなり、そこまで重視されないでしょう。
しかし、XMLのコーディング規約を作ってしまえば、要素のネーミング規則として挙げた「先頭文字を数字はNG」といったことは、そう変わることがないため使いまわしが可能と考えます。

```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
Kerasで予測値の内訳を返す

#はじめに
kerasを触り始めて数日。
精度だけでなくテストデータの予測値も出力して欲しいと思ったので実装しました。

#最初に見た記事
[[Keras/TensorFlow] KerasでMINSTの学習と予測](https://qiita.com/agumon/items/4c6ff24bfd77a5c8101d)
agumon様の記事を参考に実装を始めました。

#詰まった所
記事のこの部分で少し詰まりました。

```
predict_classes = model.predict_classes(x_test[1:10,], batch_size=32)
true_classes = np.argmax(y_test[1:10],1)
print(confusion_matrix(true_classes, predict_classes))
```

##model.predict_classes
属するクラスの予測を格納した Numpy 配列を返してくれます。
[predict_classesに関する公式ドキュメント](https://keras.io/ja/models/sequential/)

##confusion_matrix
sklearnに備わっているメソッド。
正解ラベルと予測ラベルを引数に入力すると、配列で正答の内訳を返してくれる。
以下は[公式ドキュメント](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html)の例（縦軸が正解、横軸が予測）

```
>>> from sklearn.metrics import confusion_matrix
>>> y_true = [2, 0, 2, 2, 0, 1]
>>> y_pred = [0, 0, 2, 2, 0, 2]
>>> confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])
```

#終わりに
内訳は今回実装できたので次はどのデータが弾かれたのかを確認しないといけませんね。。。
ld: framework not found IOSurface for architecture arm64

いつのまにかこんなエラーが出るようになってしまいました。

>ld: framework not found IOSurface for architecture arm64

※arm64の部分は場合によってはarm7だったりarm7sだったりします。

簡単に言うと、Xcode9でビルドしたスタティックライブラリ(.a)等をXcode8でリンクしようとしたときに発生します。正確に言うと、iOS11 SDKでビルドしたものをiOS10以下のSDKでリンクした場合、です。

スタティックライブラリには参照するFrameworkがビルド時に書き込まれるんですが、iOS11からIOSurface.frameworkがPublicなFrameworkになって明示的に書き込まれるようになったものの、iOS10のSDKのFrameworkサーチパスには存在しない、というのが原因でした(iOS10以前でも存在してるけどPrivateFrameworkらしい)。

Xcode9であれば、以下にIOSurface.frameworkがあるはずです。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks

解決策としては、Xcodeの"Build Settings"の"Apple LLVM 9.0 - Language - Modules"にある"Link Frameworks Automatically"をNoにしてスタティックライブラリをビルドすればFrameworkの参照が書き込まれなくなるのでエラーは出なくなるはずですが、今度はアプリ側の"Build Phases"に必要なFrameworkをちゃんと設定しておかないと、アプリのビルド＆リンクでこれまたエラーになると思います。

![LinkFrameworksAutomatically.png](https://qiita-image-store.s3.amazonaws.com/0/141731/bdee37be-ee84-0ce6-4842-6476f9858679.png)

そのスタティックライブラリではIOSurfaceを使っているわけではないのでコードの変更ではなんともならず、Xcode9からXcode8に戻すのも手間だし(AppStoreが導入されてからはさらに難しく…)、かといって足並みがそろわないうちにXcode9に上げるのもなんだし、なかなか悩ましい問題なのです。
Ethereum Gethをインストールして開発環境を整える (1)

Gethとは、「Go Ethereum」の略で、イーサリアムの全てのノードを操作するためのコマンドラインインターフェースです。Githubの https://github.com/ethereum/go-ethereum からダウンロードできます。
特定のバージョンを希望の場合は、https://geth.ethereum.org/downloads/ からダウンロードできます。
Go言語でかかれていますが、Go言語を扱う必要はありません。

# Geth （Go Ethereum）で出来る主なこと
Gethでは、CLIを通じて、さまざまなことが出来るのですが、主に３つのことが出来ると覚えておくとまずはいいと思います。

１．イーサリアム-ブロックのマイニング
   マイナーは、マイニングの報酬として、イーサリアム通貨であるEthを受け取ります。
2.イーサリアムのアカウントを作成、管理する。
   イーサリアムの通貨であるEtherを保存することも出来ます。アカウント間で、Eth通貨のトランザクションを可能にします。
3.コントラクトを作成するために使われます。
   コントラクトは、アカウント間の通貨転送のように、コントラクトを転送することも出来ます。

さて、早速、環境からさくっと整えていきます。

# Vagrant環境構築

コンソールを開き、以下のコマンドを打ち込み、ubuntu16.04をインストールします。

```linux:
対象のフォルダまで、cdで移動する。
$ vagrant box add gbarbieru/xenial https://atlas.hashicorp.com/gbarbieru/boxes/xenial
$ vagrant init gbarbieru/xenial
$ vagrant up
$ vagrant ssh
```

# Geth (Go-Etherum)のインストール

仮想環境に入ったら、以下のコマンドを打ち込みgethをインストールします。かなり簡単にインストールできます。

```Linux:ubuntu16
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
```

# Gethプロセスの起動

gethとタイプします。起動のメッセージが表示されれば、バックグラウンで起動する状態となります。
通常、ポート30303が開かれ、その他のノードと繋がります。

```Linux:ubuntu16
$ geth
```

![alt](https://s3-ap-northeast-1.amazonaws.com/images-drive/dfefefs.png)

INFO [11-06|03:32:21] IPC endpoint opened: /home/vagrant/.ethereum/geth.ipc 
について。
IPC（Inter-process Communications）は、ローカルコンピュータで動作していることを意味しています。

この状態にしておくと、他のノードとポート30303上でコミュニケートを図ろうとします。以下のようなメッセージが出て、ブロックを受け入れていることがわかります。

```Linux:ubuntu16
$ INFO [11-06|03:44:55] Imported new block receipts  count=26  elapsed=376.12µs  bytes=104  number=39770 hash=fab379…f739b8 ignored=0
```


これは、Gethが、geth.ipcファイルをデータディレクトリに置くことで、他のノードとのコミュニケーションプロセスに使われるためです。

2017年現在、クライアントのみで動くgethは開発中のようです。
このままにしておくと、次々にブロックを次々にインポートする状態ですので、一旦、プロセスを終了します。（Ctl+C)
Google Maps で緯度経度を指定して開く(マーカー付き)

例えば、緯度 `35.6812405` 経度 `139.7649361` の場合


マーカー**あり**
`/maps?q={lat},{lng}`
https://www.google.com/maps?q=35.6812405,139.7649361


マーカー**なし** (中央の指定のみ)
`/maps/{lat},{lng},{scale}`
3つめの表示範囲の指定が必要

https://www.google.com/maps/@35.6812405,139.7649361,17z
「デザインガイドライン」はデザイナー・エンジニアの救世主なのです。

みなさま初めまして。
株式会社BitStarでデザイナーをしている菊地です。

同社のデザイナー採用第1号ですので、社内のデザイナーは私一人です。
私が入るまでは社内にデザイナーはいなかったので、デザインの積み残しが多少なりとも存在します。

そこで私のサイドミッションとして、<b>「自社サービスのUI/UXの向上」</b>を目指してみることにしました。
ですが、

・デザイナーは私一人。リソースに限りがあります。
・エンジニアも他の開発が優先で、UIについて細かな話ができない。
・すでにリリース済みのサービスの全体改修となるとだいぶ先になりそう。
・でも、リリース済みのサービスに関しては随時の機能追加などがイケてないデザインで追加されている

などの課題があります。

そこで、大規模サービスなどで採用されている<b>「デザインガイドライン」</b>の導入を検討することにしました。

いきなり全体改修でなく、まずは今後追加される機能やページについてこちらで作成した「デザインガイドライン」に沿って作業を行ってもらえば今後の作業フローになれるだろうし、
「デザインガイドライン」に沿って作業してもらえば、UIについて話さなくても良いし、後の全体改修の工数も減るし、
チームとして、「自社サービスのUI/UXの向上」について共通認識を持ちやすくなる。

ということで、私の復習も兼ねて、もし同じような状況に面している方のためになれたらと思い

 1・デザインガイドラインの有用性
 2・デザインガイドラインとは

について記していきます。
 


<h1>1.デザインガイドラインの有用性</h1>
<b >「デザインガイドライン」はデザイナー・エンジニアの救世主</b>
―――――


チーム開発においてエンジニアもデザイナーも自身の作業に集中しているタイミングで作業を中断しなくてはいけない状況というのは作業効率・やる気の面でも健全ではありません。

そこであなたの作業を中断させず爆速で仕事を敢行するために必要なのが「デザインガイドライン」です。

「デザインガイドライン」と聞くと、デザイナーの領域に聞こえるかもしれませんが、
「デザインガイドライン」とは「誰でもこのガイドラインを見ればどうやってデザインするかがわかる指針」となるものです。
ですので、

デザイナにとっては
・これを作っておけば自分がいちいち細かな部分まで確認しなくてもイケてない部分が出てこない

エンジニアにとっては
・これがあれば、細かな部分や急な仕様変更があった場合などもデザイナに意見を聞くために作業を中断する必要がなく
作業に集中できる

こんな素晴らしいものは作らない他ありません。
もし、あなたの作業環境に「デザインガイドライン」がない場合はデザイナーに作成を依頼しましょう。

デザイナーがチームにいない場合は、下記の「デザインガイドラインとは」を参考にして作ってみるのもいいのではないでしょうか。



<h1>2.デザインガイドラインとは</h1>
<b>デザインの骨組み</b>
―――――

デザインガイドラインは、配色やフォントや見出しルールなど、デザイン上の共通項目をまとめたものです。
ルールを策定することで、ブランドイメージを保持し、見た目の印象を統一することができます。
また、更新作業時にも一定のトーン＆マナーを保持でき、大規模案件や長期的に運用が必要なWebサイトなどで効果を発揮します。

<h3>（１）サービス全体の共通ルール</h3>

デザインガイドラインに記すべき情報については大まかに下記の項目になります。

1. 配色
・ベースカラー
・サブカラー
・アクセントカラー
・その他背景色やホバー時の色などサービスによって追加修正が可能なように

2. フォントの指定
・書体
・サイズ
・色など

3. 見出しルール

4. バナーサイズ

5. アイコン

6. ロゴのルール

7. 余白の取り方

8. 禁止事項など

これらのルールを記載していくのですが、このままだと様々なパターンに対応しにくい＆更新が行いずらいので
これらのルールをさらに細分化しコンポーネント別でまとめていきます。

<h3>（２）コンポーネント別に抽出し、細分化したルール付け</h3>

各画面のコンポーネント別に細かなルールづけを行なっていきます。


<h3>（３）エンジニアなどのフィードバックからチームに最適化したデザインガイドラインにカスタマイズ</h3>

上記で作成したガイドラインについて、実際に使用するエンジニアやデザイナーのフィードバックをもとに改善・最適化していきましょう。

ガイドラインのセオリーを理解するために、一般的にどのように作成されているのかを下記ページなどを参考にするのもいいかもしれません。

・Human Interface Guidelines iOS
https://developer.apple.com/ios/human-interface-guidelines/overview/themes/
・Material Design
https://material.io/guidelines/






<h1>・デザインガイドライン作成のお役立ちサービス</h1>

・既存のWEBサイトのURLを入力すると自動でガイドラインを作成してくれるサービス
http://stylifyme.com/

・ブラウザー上でスタイルガイドが作れるFrontifyを試してみた｜Webクリエイターボックス 
https://www.webcreatorbox.com/webinfo/style-guide-frontify




デザイナーは一人ですが、ただデザインを良くしようとかではなくどのようにしてチームとしてイケてるサービス開発を行えるか最優先で考えております。
エンジニアは３名在籍しております。


株式会社BitStarのプラットフォームサービスを一緒に開発していただける方を探しています！
イケてるサービスを一緒に作っていただけるエンジニアの方を募集中です。
興味のある方は<a href="https://www.wantedly.com/companies/bizcast/projects?occupation_type=engineer">こちら</a>から！
作業ブランチのマイグレーションをdownするコマンドを生成するときのコマンド

作業ブランチでのマイグレーションが他のブランチでの問題を隠匿してしまうことがあるため
作業ブランチから移動するときには `migrate:down` するようにしている。

「マイグレーション実施前にdownすべきバージョン番号をメモし、後でdown用のコマンドに置換する」
という作業が面倒になったので
最初からdown用のコマンドを標準出力してくれるコマンドを用意した。
マイグレーション実施前にメモしないといけない問題はまだ変わらないが。

```bash
bundle exec rake db:migrate:status | grep down | sed -e 's/ down \+\([0-9]\+\) \+.*/bundle exec rake db:migrate:down VERSION=\1/g' | tac
```

マイグレーションでのスキーマ運用に行き詰まったらridgepoleを参考に検討すると良さそう。
https://github.com/winebarrel/ridgepole
Flask で Cors を使う

Flask で CORS (Cross Origin Resource Sharing) を使う方法です。

[Flask-CORS](http://flask-cors.readthedocs.io/en/latest/)をインストールします。

```bash
sudo pip install -U flask-cors
```

Flask を起動する時、python welcome.py としていたら、welcome.py の冒頭に追加コードを書きます。

```py3
import sys
import os

from flask import Flask
from flask_cors import CORS
from flask import jsonify
from flask import request
app = Flask(__name__)
CORS(app)
```

追加したのは、上記のうちの次の２行です。

```py3
from flask_cors import CORS
CORS(app)
```

Flask を起動します。

```bash
python welcome.py
```
MacでMastodonを立ち上げてみた

## STEP.1 ソースコードをダウンロード
```
cd $HOME
mkdir mastodon && cd mastodon
git clone https://github.com/tootsuite/mastodon.git
cd mastodon
rm -rf .git
```
ここでの`pwd`コマンドを実行した結果と`echo $HOME"/mastodon/mastodon"`コマンドを実行した結果を比べてみてください．
同じだったら次へ行ってください．
違ったら，`rm -rf ../../mastodon && cd`を実行して最初からやり直してください．
## STEP.2.1 環境ファイルコピー
```
cp .env.production.sample .env.production
cat .env.production #ここで中身を確認します．
```
## STEP.2.2 Dockerイメージの作成
それから，macのテキストエディタでdocker-compose.ymlを編集します．

```
db:
restart: always
image: postgres:alpine
volumes:
- ./postgres:/var/lib/postgresql/data

redis:
restart: always
image: redis:alpine
volumes:
- ./redis:/data

```

```
mkdir postgress
mkdir radis
```

## STEP.2.3 ビルド
```
docker-compose build
```

## STEP.3.1 設定項目を埋める
.env.productionを編集する！

```
LOCAL_DOMAIN=localhost:3000

LOCAL_HTTPS=false
```

## STEP.3.2 シークレットキーをセットする
パスフレーズの方をやっていきます！

1. docker-compose run --rm web rails db:migrateを実行
1. 一番最後に出てきた長いランダムな文字列をメモ
1. docker-compose run --rm web rails db:migrateを実行
1. 一番最後に出てきた長いランダムな文字列をメモ
1. docker-compose run --rm web rails db:migrateを実行
1. 一番最後に出てきた長いランダムな文字列をメモ
1. .envproductionの`PAPERCLIP_SECRET`と`SECRET_KEY_BASE`と`OTP_SECRET`にそれぞれメモした文字列を入力していきます．

## STEP.3.3 変更箇所確認
今までの感じでこんな感じになると思います．
##### パスフレーズなどはサンプルです
```
# Federation
LOCAL_DOMAIN=localhost:3000
LOCAL_HTTPS=false

# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=to4u3iyt8q93y489f***************5ab06b400a34f3(サンプルです)
SECRET_KEY_BASE=e98qyt498******************dc7cb70cd90d6c(サンプルです)
OTP_SECRET=1278u498qut4*****************93655d0f6eb15(サンプルです)
```
## STEP.4 データベース
`docker-compose run --rm web rails db:migrate`
 
## STEP.5 アセットファイル
`docker-compose run --rm web rails assets:precompile`

## STEP.6.1 マストドンの___最初の___起動
`docker-compose up`
起動に少し時間がかかりますが、起動が無事終了したらhttp://localhost:3000/aboutにアクセスしてください。ログイン画面が表示されると思います。

以上でローカルでMastodonを動かすことができるようになりました。

## STEP.6.2 Mastodonの停止
`docker-compose stop`

## STEP.6.3 MASTODONの再起動
Mastodonをstopで停止した場合は、startで再起動します。
`docker-compose start`
# トラブルシューティング
リモートサーバでjupyter notebookを起動させローカル環境で使う

#やりたいこと
1. 高性能GPU搭載サーバに自分のmacでリモート接続(今回はローカルLAN環境)
2. リモート上でJupyter Notebookを起動しプログラムの実装・実行

#環境
Python 3.5.2
macOS Sierra 10.12.6

#実装
まずJupyter Notebookをインストール
`pip install jupyter`

ipythonを起動してJupyterログイン時のパスワードを設定

`$ ipython`

```
In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password: [パスワードを入力]
Verify password: [パスワードを再度入力]
Out[2]: 'sha1: [ハッシュ化されたパスワード]'
```

外部接続環境用の設定ファイルを作成

```
$ mkdir ~/.jupyter
$ vim ~/.jupyter/jupyter_notebook_config.py
```

```python:jupyter_notebook_config.py
c = get_config()

# Notebook上でplotを表示できるようにする
c.IPKernelApp.pylab = 'inline'
# 全てのIPから接続を許可
c.NotebookApp.ip = '*'
# IPython notebookのログインパスワード
c.NotebookApp.password = 'sha1:[ハッシュ化されたパスワード]'
# 起動時にブラウザを起動させるかの設定
c.NotebookApp.open_browser = False
# ポート指定
c.NotebookApp.port = [接続ポート]
```

Jupyter起動
`jupyter notebook`

リモートサーバから`http://[all ip addresses on your system]:[接続ポート]/`に接続してねと言われるので接続する。
設定したパスワードを入力してログインする。

#終わりに
Jupyter Notebookで効率的なプログラミングライフを目指しましょう。
画像認識データセットOmniglotをMnist風に使えるようにしました

元のデータはこちら
https://github.com/brendenlake/omniglot

今回作ったものはこちら
https://github.com/TatsuyaMizuguchi17/Products

作ったというよりは。まとめた、という感じですが…

#Omniglotとは
OmniglotとはMnistと同じ文字認識用データセットですが、Mnistよりもシビアなものになっています。例えばsklearnのMnistと上のOmniglotを比較すると、

|  | データ数 | 分類クラス | 1クラスあたりのデータ数 |
|:-:|:-:|:-:|:-:|
| Mnist     |  70000 | 10  |7000|
| Omniglot  |  32460 | 1623 |20|

と1クラスあたりのデータ数が非常に少ないです。
そのため超多クラス分類やOne-shot-learningをやっている人にとっては、より実用に近いデータセットになっています。

#使い方
ダウンロード

```git clone https://github.com/TatsuyaMizuguchi17/Products.git
```

形式はsklearn.datasetsのfetch_mldataと同じにしました。
なので、これまでsklearnでMnistを使っていた場合、コードを大きく変更することなく使用できると思います。
もちろん初めからコードを書く場合も扱いやすいようにしています。

sklearnの場合、

```py3:Mnist.py
from sklearn.datasets import fetch_mldata

mnist = fetch_mldata("MNIST original")
data = mnist["data"].astype(np.float32)
label = mnist["target"].astype(np.int32)

N = 60000
N_test = 10000
train_data = data[:N].reshape((N, 1, 28, 28)) / 255.0
test_data = data[N:].reshape((N_test, 1, 28, 28)) / 255.0
train_label = label[:N]
test_label = label[N:]
```

と書くところを、今回は


```py3:Omnist.py
import omniglot

dataset = omniglot.omniglot("small1") #small1 or small2 or large

train_data = dataset["train_data"]
train_label = dataset["train_label"]
test_data = dataset["test_data"]
test_label = dataset["test_label"]
```

とすればOKです。
次に説明しますが、omniglot.omniglotの引数には、small1、small2、largeのどれかを使います。

#データ内訳
データセットは3種類あります。それぞれクラス数が異なります。

|  | Trainデータ数 | Testデータ数　|クラス数 | 1クラスあたりのデータ数 |
|:-:|:-:|:-:|:-:|:-:|
|small1   | 2040  | 680  | 136  |　20 　|
|small2   | 2340  | 780  | 156  |  20 |
|large   | 14460  | 4820  | 964  | 20  |

試しで使用する場合はsmall1を使うことをお勧めします。

#選択肢付きデータセット
よくある(?)問題設定として、１つの問題画像Aと複数の選択肢画像B,C,...,Nが提示され、画像Aと同じクラスに分類する画像をB~Nの中から１つ選んで解答するというものがあります。

下の例では、一番左が問題画像で、その他の５つが選択肢の画像になっています。
カッコの中身がクラス番号を表していて、一番左の文字と同じクラス(51)に属するものを右の選択肢の画像の中から選ぶ、というのが問題設定です。

![スクリーンショット 2017-11-06 16.57.30.png](https://qiita-image-store.s3.amazonaws.com/0/210451/c8c14bdb-c818-5d69-68f4-df6fb2d1c752.png)




今回は、この問題設定に準じたデータセットを簡単に作成することができます。

```py3:Omniglot.py
train_questionset = omniglot.get_omniglot_questionset(train_data,train_label,QUESTION_NUM=1000, CHOICE_NUM = 5)
test_questionset = omniglot.get_omniglot_questionset(test_data,test_label,QUESTION_NUM=300, CHOICE_NUM = 5)
```

QUESTION_NUMが問題数、CHOICE_NUMが選択肢の数です。
ここでは、選択肢が5つである問題文を1300問（トレーニングデータ1000問、テストデータ300問）とってきています。

get_omniglot_questionsetは問題数の大きさのリストLを返します。
L[i]は"question_data","question_label","ans_data","ans_label"をキーに持つ辞書です。

"question_data" : 問題の画像 shape=(1,1,105,105)
"question_label" : 問題のラベル shape=(1)
"ans_data" : 選択肢の画像 shape=(CHOICE_NUM,1,105,105)
"ans_label" : 選択肢の画像 shape=(CHOICE_NUM)


問題を出力して見たい場合はshow_questionset(data)で出力できます。

```py3:Omniglot.py
omniglot.show_questionset(train_questionset,line=7)
```

と言うわけで、以上が今回作ったデータセットの説明でした。