OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter × VSCodeでファイル保存時にホットリロードさせる

## 概要

- VSCodeでFlutterの開発をする際にホットリロードを有効にする方法
- 公式の↓に書いてあることそのままだけど備忘として残す
    - https://flutter.io/get-started/test-drive/

## 事前準備

- [FlutterでHelloWorldを動かすまで]( https://qiita.com/ozaki25/items/1d8701f8f4b8e9e20b0d)
- [VSCodeでFlutterの開発環境を整える](https://qiita.com/ozaki25/items/41d5c2c0dcb4dd377dc6)

## アプリの起動

- **アプリの起動はVSCode上からやらないといけない**
    - ここではまった
- 手順
    1. シミュレータを起動しておく(ios/androidどちらでも)
    2. VSCodeからアプリ起動
        - メニューから行く場合は、「デバッグ」 -> 「デバッグの開始」
<img width="391" alt="スクリーンショット 2018-03-07 15.57.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/14b8c407-759c-3bbf-6742-aad8efb80212.png">
        - ショートカットで行く場合は「fn + F5」
    3. 起動するまで待つ
        - 結構長い
        - ログの見かたが分からないから動いてるか不安だけど動いてる

## ホットリロードさせる

- 上記のやり方で起動できたらファイルを保存するだけで勝手に画面が更新される

![auto_hotreload.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/c3455716-9188-382f-96c1-57dcd4c40dea.gif)

## [参考]コマンドラインからアプリを起動させる場合

- 以下のコマンドで起動

```
flutter run
```

- この場合だとファイルを保存してもホットリロードが動かない
- コマンドラインで上で`r`を押すと画面が更新される

![manual_reload.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/cea18e3e-f314-44f8-640f-89f5280da811.gif)
TwitterでHPのリンクを貼ったときにCardsを表示する

# Twitter Cards
[公式ページ](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started)
Twitter Cards（以後Cards）は、Twitterに写真を添付することで、その対象のウェブサイトへの流入を加速させるための機能です。

最近のウェブサイトの特徴として、あらゆるページに画像が多いです。字を並べるよりも、画像の方が印象に残りやすく、感覚的に理解しやすい利点があります。
TwitterなどのSNSでも画像を使用することで、目に付きやすく、印象に残るようにしてウェブサイトに訪れてもらおうということです。

# SEO対策
最も代表的なSEO対策として、「タイトル」、「ページの説明」、「キーワード」があります。

```.html
<title>タイトル</title>
<meta name="description" content="ページの説明" />
<meta name="keywords" content="キーワード" />
```
日本語の部分を編集して使ってください。

これからは、ここにSNS対応としてこれらも入れましょう。

```.html
<meta property="og:site_name" content="サイト名" />
<meta property="og:title" content="ページ名" />
<meta property="og:description" content="ページの説明" />
<meta property="og:type" content="website" />
<meta property="og:url" content="サイトのトップURL" />
<meta property="og:image" content="Cardsで使用する画像のURL" />
```
これらは、`content`の中身を編集して使ってください。

## Cards用の設定
Twitterには、Cardsの表示方法に4つあります。

### 要約
タイトル、説明、サブネイルのみを表示する。
`<meta name="twitter:card" content="summary" />`

### 要約と大きな画像
要約のときに比べて表示するサブネイルが大きい。
`<meta name="twitter:card" content="summary_large_image" />`  
さらに、この設定の場合、複数（最大4枚）の画像を表示することができる。

```.html
<meta name="twitter:image0" content="Cardsで使用する1枚目の画像のURL" />
<meta name="twitter:image1" content="Cardsで使用する2枚目の画像のURL" />
<meta name="twitter:image2" content="Cardsで使用する3枚目の画像のURL" />
<meta name="twitter:image3" content="Cardsで使用する4枚目の画像のURL" />
```

### アプリ
App StoreやGoogle Playのアプリページに直通できるよう表示する。

```.html
<meta name="twitter:card" content="app" />
<meta name="twitter:app:id:iphone" content="App Storeでの表示するアプリのapp ID" />
<meta name="twitter:app:id:ipad" content="App Storeでの表示するアプリのapp ID" />
<meta name="twitter:app:id:googleplay" content="Google Playでの表示するアプリのapp ID" />
```

### プレイヤー
ビデオや音楽などを表示できる。

```.html
<meta name="twitter:card" content="player" />
<meta name="twitter:player" content="表示するHTTPS URL" />
<meta name="twitter:player:width" content="表示する横幅(pixels)" />
<meta name="twitter:player:height" content="表示する高さ(pixels)" />
<meta name="twitter:player:stream:content_type" content="MIMEタイプ" />
```


Twitterの公式には、`twitter:site`などを設定するように書かれてますが、
`<meta property="og:site_name" />`などがしっかりと定義されていれば、問題なく表示されます。

# 参考
- About Twitter Cards — Twitter Developers  
    [developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards)
- もうmeta要素を迷わない！最低限入れるべきmeta要素のまとめ  
    [qiita.com/pompom0c0/items/5c00a188aab744cfc918](https://qiita.com/pompom0c0/items/5c00a188aab744cfc918)
Go言語で、よう分からん error の正式な型名を確認する

エラーメッセージがダサいので差し替えようと思ったが、その型名がそもそもよう分からん時は、reflect パッケージで調べられる。

```go:foo.go
package main

import (
	"os"
	"reflect"
)

func TypeName(obj interface{}) string {
	return reflect.TypeOf(obj).String()
}

func main() {
	_, err := os.Stat("NOT_FOUND_FILE")
	println(err.Error())
	println(TypeName(err))
	println("os.IsNotExist=" , os.IsNotExist(err))
	println("os.IsExist=" , os.IsExist(err))
}
```

```shell-session
$ go run foo.go
CreateFile NOT_FOUND_FILE: The system cannot find the file specified.
*os.PathError
os.IsNotExist= true
os.IsExist= false
```

os.Stat でファイルが存在しない時のエラーは、`os.PathError` へのポインタだった。
なお、普通は `os.IsNotExist(エラーオブジェクト)` を使う模様。

reflect パッケージ、邪悪ですばらしいですね！
mvコマンドでワイルドカード使ってるときの挙動の話。

業務でサーバのファイルを移動しようとmvコマンドを使った時の話。

以下のコマンドを実行したかったのに誤って

```
$ mv *.hoge ~
```

これで実行してしまった。

```
$ mv *.hoge
```

この時。`*.hoge`に該当するファイルは以下の2つ

```
$ ls *.hoge
test_1.hoge  test_2.hoge
$
$ cat test_1.hoge
111111
$
$ cat test_2.hoge
2222222
```

すると以下のように。

```
$ ls *.hoge
test_2.hoge
$
$ cat test_2.hoge
111111
```

幸い、問題ないファイルだったので良かったのですが
ちょっと挙動に興味が出てきたので実験。

さきほどと同じ2つのファイルを用意し、3つ目のファイルを追加。

```
$ ls *.hoge
test_1.hoge  test_2.hoge  test_3.hoge
$
$ cat test_1.hoge
111111
$
$ cat test_2.hoge
2222222
$
$ cat test_3.hoge
333333
```

この状態でさきほどのコマンドを実行

```
$ mv *.hoge
mv: target `test_3.hoge' is not a directory
```

`test_3.hoge`はディレクトリちゃうぞと。

ここで↓をたまたま発見。
http://d.hatena.ne.jp/m-hiyama/20081211/1228976433
> Unixでは、ワイルドカード展開をシェルがするので、cp foo/* bar は、cp foo/a.txt foo/b.txt bar と同じです。

つまり`*.hoge`に該当したファイルがたまたま2つあった故に後者を移動先とみなして
以下が成立した。

```
$ mv test_1.hoge test_2.hoge
```

`*.hoge`に該当したファイルが3つ以上あると

```
mv test_1.hoge test_2.hoge test_3.hoge
```

となり、この場合は最後の引数がディレクトリであれば成立するようだ。
`test_3.hoge`配下に`test_1.hoge`と`test_2.hoge`を移動しようとしたためエラーが出た。
（てかmvって引数3つ以上でも可能なパターンあったんだ）

というちょっとしたメモ。
IME 日本語入力中に esc でキャンセルした時の挙動を制御する

esc キーを押したらモーダルを閉じるや処理をキャンセルするというイベントを設定していたのですが、IME で日本語を入力して変換している時に押される esc にも反応してしまい、思わぬ挙動になってしまっていました。

そこで IME で入力中かどうかを判定するように `compositionstart` / `compositionend` を使って制御してみました。

```javascript
let isCompositing = false

document.addEventListener('keydown', function () {
  if (e.keyCode == 27 && !isComposit) {
    console.log('esc event')
  }
})

document.addEventListener('compositionstart', function () {
  isCompositing = true
})

document.addEventListener('compositionend', function () {
  isCompositing = false
})
```

`keyup` ではなく `keydown` にしているのは、イベントの発火順が `keydown` -> `compositionstart` -> `compositionend` -> `keyup` になっているためです。 `keyup` で esc キーイベントを設定すると、入力を完全にキャンセルしたときにも発火してしまいます。

### ブラウザ対応

以下のブラウザで動作確認をしました。古い IE をサポートしないのであればこれで充分そうです。

- Chrome 64
- Safari 11
- Firefox 58
- Edge 40
- Internet Explorer 11
【PHP】名前空間を使用したクラスのコンストラクタが実行されなかった話し

古いPHPプラグラムを改修していると意外とあるかもしれない事例です。

## 同一クラス名を定義した場合
同じクラス名を定義している2ファイルを読み込み実行してみます。

```php:hoge.php
<?php

class Hoge {
    function Hoge() {
        echo 'filename is hoge.php' . PHP_EOL;
    }
}
```

```php:hogehoge.php
<?php

class Hoge {
    function Hoge() {
        echo 'filename is hogehoge.php' . PHP_EOL;
    }
}
```

```php:test.php
<?php

require_once('hoge.php');
require_once('hogehoge.php');

$hoge = new Hoge();
```

```bash
$ php test.php

Fatal error: Cannot declare class Hoge, because the name is already in use in hogehoge.php on line 3
```

当然ですが既に使われているクラス名で定義しようとしエラーになります。

## 名前空間を使用する
この問題を解決するために名前空間を定義します。
名前空間について：http://php.net/manual/ja/language.namespaces.rationale.php
**※ファイルの例が身近な例えでわかりやすいです。**

hogehoge.phpに名前空間を定義します。

```php:hogehoge.php
<?php

namespace hogehoge; # 追加

class Hoge {
    function Hoge() {
        echo 'filename is hogehoge.php' . PHP_EOL;
    }
}
```

hogehoge.phpの修正に合わせ、呼び出し元も修正します。

```php:test.php
<?php

require_once('hoge.php');
require_once('hogehoge.php');

$hoge = new Hoge();
$hoge2 = new hogehoge\Hoge(); # 名前空間hogehoge
```

実行してみましょう。

```bash
$ php test.php
filename is hoge.php
```

今度はエラーならず動作しましたね。と思いきや<font color="red">hogehoge.phpのコンストラクタが実行されません。</font>

## コンストラクタの仕様
公式にしっかり書いてありました。
http://php.net/manual/ja/language.oop5.decon.php
`PHP 5.3.3以降、名前空間つきのクラス名の最後の部分と同じ名前のメソッドは、コンストラクタとみなされなくなりました。`

古い形式のコンストラクタを修正しましょう。

```php:hogehoge.php
<?php

namespace hogehoge;

class Hoge {
    function __construct() { # 修正
        echo 'filename is hogehoge.php' . PHP_EOL;
    }
}
```

```bash
$ php test.php
filename is hoge.php
filename is hogehoge.php
```

今度はちゃんと動きました。
古いシステムは今の形に合わせてメンテナンスしないといけないですね。
ほっとくとクソコードが使いまわされてしまう可能性があるので気づいたら修正しましょう。

お疲れ様でした。
WordPressのWP REST API v2でカテゴリ名を取得する

# 前提
WP REST API v2のインストールしておきます
WP REST API v2ではカテゴリーのIDは取得できますが、Nameが取得できないため、下記を追加し、カテゴリーのNameがjsonで返ってくるようにします。

# 追加箇所
```wp-content/plugins/rest-api/plugin.php

add_action( 'rest_api_init', 'register_rest_category_name'); 

if ( ! function_exists( 'register_rest_category_name' )) {
    function register_rest_category_name() {
        register_rest_field( 'post', 'category_name',
        array(
            'get_callback' => 'get_category_name'
        ));
    }
    function get_category_name( $object ) {
        $category = get_the_category($object[ 'id' ]);
        return $category[0]->cat_name;
    }
}
```

#下記を参考にさせていただきました。ありがとうございました。
https://qiita.com/yumayamada1029/items/c40e40200899330f957b
[WIP] Vectorizerを使いこなすために

## TfidfVectorizer

### 代表的なパラメータ

* strip_accents : {‘ascii’, ‘unicode’, None}
    * ascii/unicodeに含まれないアクセント文字の置き換え
* tokenizer : callable or None (default)
    * トークナイザの関数を渡す
    * 文字列を引数として、文字列のリストを返す
* ngram_range : tuple (min_n, max_n)
    * 文字分割の方法として、N-gramを設定する
    * nの下限、上限を設定できる
* max_df : float in range [0.0, 1.0] or int, default=1.0
    * 除去したい頻出単語の割合
* min_df : float in range [0.0, 1.0] or int, default=1
    * 除去したい出現頻度の低い単語の割合
* use_idf : boolean, default=True
    * 出現頻度の逆数で重み付けするかの判断
* smooth_idf : boolean, default=True
    * Falseにするとidfの分母の代わりにidfに "1"が追加されます。
* sublinear_tf : boolean, default=False
    * スケール（対数スケールなど）をとるか

### 使い方

```python

vectorizer = TfidfVectorizer(...)
fitted = vectorizer.fit(train['feature'])
counted = fitted.transform(train['feature'])
```
Spring Boot 2.0 (Spring 5) の WebMvcConfigurer覚書

### はじめに
Spring Boot 1.5.10で作っていたアプリを勇んでSpring Boot 2.0 にしてみたらWebMvcConfigurerAdapterが非推奨になってしまったのでメモ。
Spring4　→　Spring5になったからですね。

追記）2.0.0マイグレートに関するもろもろは [こちら] (https://qiita.com/yukina-ge/items/1ca029ed69494bfd36d6)にまとめてみました。

### Javadoc先生が教えてくれた

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html

>as of 5.0 WebMvcConfigurer has default methods (made possible by a Java 8 baseline) and can be implemented directly without the need for this adapter

なるほど、Spring5からはjava8以降が必須になったので、defaultメソッドが使えるようになったんだなぁ。


### 治療

**変更前のWebMvcConfig.java**

``` java:変更前のWebMvcConfig.java
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter
{
    // 略
}
```

**変更後のWebMvcConfig.java**

``` java:変更後のWebMvcConfig.java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer
{
    // 略
}
```

これだけ。

おわり

### 余談

Thymeleafの自作Dialectもエラーだわっしょい！
ファイル名をvimで編集する

# Renamer

Renamerを用いるとファイル名をvimで編集することができる．
導入に少しはまったので以下に載せて置く．

## インストール
https://www.vim.org/scripts/script.php?script_id=1721
から行う．

## 導入
最初にインストールしてから起動するとエラーが出る．
原因はvim-renamer-master/autoload/renamer.vimの15行目，20行目にある．
それぞれ以下のように""を付け加えるだけで解決する．

```vim
      \ "Renamer: change names then give command :Ren" . ("g:RenamerSupportColonWToRename" ? "(or :w)" : '') . "\n" ,
```

```vimscript
let s:headerLineCount = len("s:header") + 2 " + 2 because of extra lines added later
```

## 使い方
使い方はvimのノーマルモードから:Renamerで起動．
編集方法はvimの操作とほぼ一緒
変更を反映させるのに:Renを実行する
structとTaskでハマった話

# 問題

以下のコード、何が表示されると思いますか？

```c#
struct S
{
    public int Value;
    public S(int init) => Value = init;
    public async Task F()
    {
        Value++;
        await Task.CompletedTask;
    }
}

public static async Task Main()
{
    var s = new S(10);
    await s.F();
    Console.WriteLine(s.Value.ToString());
}
```

答えは **10** です。

では、以下のコード、何が表示されると思いますか？

```c#
struct S
{
    public int Value;
    public S(int init) => Value = init;
    public Task F()
    {
        Value++;
        return Task.CompletedTask;
    }
}

public static async Task Main()
{
    var s = new S(10);
    await s.F();
    Console.WriteLine(s.Value.ToString());
}
```

答えは **11** です。

どうしてこのようになるのでしょうか？

<details><summary>答えはこちら</summary><div>

# 解説

上記2つのコードの違いは `S.F()` がasyncメソッドかどうかという点です。

どうしてこうなるか、というと、asyncメソッドの場合Awaiterというものが作成されます。
これは、デリゲートの場合でいうファンクタオブジェクトのようなものです。
このAwaiterに構造体Sがコピーされてしまうため、`S.F()`が呼ばれるインスタンスは`Awaiter.s`であり、ローカル変数のsではないことが原因です。

# 解決策

- Sをclassにする
- F()の返り値を`Task<S>`にして、`return this`したうえで呼び出しを`s = await s.F()`にする

</div></details>
Python軽量フレームワークFalconでAPI開発 入門(その1)

# Falconとは？
Falconは、Pythonの軽量フレームワークの一種で、WSGIアプリケーションでもあります。
シンプルな設計と圧倒的な速度が特徴です。

Pythonフレームワークと言えば、主にDjango,Flask,Bottleなどが有名ですが、Falconは他のフレームワークのようにO/Rマッパなどのフレームワーク一つあればWEBアプリケーションが作成できるような機能は備えていません。

シンプルにリクエストが来たらjsonなどのレスポンスを返すだけのフレームワークですが、その分他のフレームワークよりはパフォーマンスは最速です。
主な用途としては、WEB APIを構築するためのWSGIアプリケーションとして適しています。

# チュートリアル
実際にチュートリアルとして、FalconでWebAPIを作成してみましょう。今回はリクエストが飛んだ場合に、jsonを返すシンプルなWebAPIを作成します。

Pythonのバージョンとしては自分はPython 3.4を使用していますが、Python 3.0系であれば、特に問題はないと思います。


以下が続きの内容となっています。
[Python軽量フレームワークFalconでAPI開発 入門(その2)](https://qiita.com/shimakaze_soft/items/911b339257f0e0bdd310)
[Python軽量フレームワークFalconでAPI開発 入門(その3)](https://qiita.com/shimakaze_soft/items/a752357497c85373e80a)

## インストール
まずはpipを使って、falconを導入しましょう。非常に簡単です。

```Terminfo
$ pip install falcon
```
## 実装
実際にコーディングしていきましょう。以下は`127.0.0.1`の`8000`番ポートに向かってGETリクエストを飛ばすと、メッセージ付きのjsonが返ってくるというものです。非常に簡単に実装できます。

```python:app.py
import json
import falcon

class AppResource(object):

    def on_get(self, req, resp):

        msg = {
            "message": "Welcome to the Falcon"
        }
        resp.body = json.dumps(msg)

app = falcon.API()
app.add_route("/", AppResource())


if __name__ == "__main__":
    from wsgiref import simple_server
    httpd = simple_server.make_server("127.0.0.1", 8000, app)
    httpd.serve_forever()
```

上記のコードを少し詳しく見ていきます。

```python
app = falcon.API()
app.add_route("/", AppResource())
```

ここの処理でAPIを定義しています。`add_route`メソッドでURLパスを指定し、そのURLパスのリクエストに対して、どのResourceクラスが担当するかを指定しています。
Resourceクラス自体は継承もしていないただのPythonのクラスです。

上記では、ルートパスに対してリクエスト(つまり`http://127.0.0.1:8000`)が飛んで来た場合に、その処理を`AppResource()`というクラスに任せています。

```python
class AppResource(object):

    def on_get(self, req, resp):

        msg = {
            "message": "Welcome to the Falcon"
        }
        resp.body = json.dumps(msg)
```
`on_get`というメソッドで、GETリクエストを処理しています。
同じURLパスに対して、POSTリクエストをした場合は、`on_post`というメソッドを定義することで、POSTリクエストに対する処理も行えます。
上記はGETリクエストが飛んで来た場合に、msgというディクショナリ(辞書)型を定義し、json型に変換して`resp`(レスポンス）のボディ部に格納して、レスポンスを返しているというものです。


```python
if __name__ == "__main__":
    from wsgiref import simple_server
    httpd = simple_server.make_server("127.0.0.1", 8000, app)
    httpd.serve_forever()
```
WSGIサーバーを起動するための処理です。
`WSGIServer`クラスは WSGI サーバのリファレンス実装です。WSGIアプリケーションであるFalconのappを`simple_server.make_server`の引数として与えて実行しています。

## 動作
実際にFalconのアプリケーションを動かしてみましょう。

```Terminfo
$ python app.py
```

以下を実行してGETリクエストを投げて見ましょう。

```Terminfo
$ curl -v 127.0.0.1:8000
```

# まとめ
これで実際にシンプルなWebAPIが完成します。
Falconは他にもHookとMiddlewareという機能がありますが、次回にご紹介します。
コントローラ以外で Slim のテンプレートを描画する

HTML を描画する処理をヘルパやデコレータで content_tag や concat を駆使して書いていると、コードの行数がどうしても膨らんでしまう。そのためヘルパやデコレータから Slim の機能を使って Slim テンプレートを描画してみる。

```app/views/components/context_menu/item.html.slim
li disabled=disabled
  a.js-context-menu-item data-method=(method || :get) href=url
    = body
```

```rb
locals = { disabled: true.to_s, method: :get, url: '#', body: 'リンク' }
slim_path = Rails.root.join('app/views/components/context_menu/item.html.slim')

Slim::Template.new(slim_path).render(Object.new, locals)
#=> "<li disabled=\"true\"><a class=\"js-context-menu-item\" data-method=\"get\" href=\"#\">リンク</a></li>"
```

次のようにヘルパメソッド化すると便利。

```rb
# app/views/components ディレクトリ以下の Slim ファイルを描画する。
def render_component(name, locals = {}, options = {}, &block)
  slim_path = Rails.root.join('app/views/components', "#{name}.html.slim")

  Slim::Template.new(slim_path, options).render(Object.new, locals, &block)
end
```
windows10 で LL 言語での開発がだいたいなんとかなりそうな環境をふわっと


## PHP のインストール
   - https://windows.php.net/download 
   C:\ 直下に php とか適当に名前かえておいて環境変数からパス通す。php.ini.* を適当にコピーして使う extension のコメント外したり追加する。

## Ruby のインストール
   - https://rubyinstaller.org/downloads/ インストーラーで楽ちん。

## Python のインストール
 - https://www.python.org/downloads/ インストーラーで（ｒｙ

## Composer のインストール
   - https://getcomposer.org/download/
   インストーラーから入れると簡単
→インストーラーから入れるとパスが正しくない模様。自分で設定する。 ``C:\composer``

　　
## Laravel のインストールとプロジェクト作成

```
composer global require laravel/installer
laravel new project名
php artisan serve
```
http://127.0.0.1:8000/ にアクセスして確認。



## PostgreSQL のインストール
- https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows
インストーラーでインストール。環境変数を追加。 
``C:\Program Files\PostgreSQL\10\bin``　[ロケールはCを選択するべきらしい](https://lets.postgresql.jp/documents/tutorial/windows/)。

## MySQL のインストール
- http://dev.mysql.com/downloads/installer/ 
インストーラーでインストール。環境変数追加 ``C:\Program Files\MySQL\MySQL Server 5.7\bin``

## Redis のインストール
- Windows 対応してないらしい。マジで？？
[でもこれ本家が作ってるらしいので使ってみる](https://github.com/MicrosoftArchive/redis)。

- インストーラーがあったので楽ちん。https://github.com/MicrosoftArchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.msi

# Laravel/Homestead 使うのが一番いいじゃんという結論。。。

- メモ

Homestead デフォの mysql の文字コードもろもろを変更

``ALTER DATABASE DB名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;``

/etc/mysql/mysql.conf.d/mysqld.cnf に追記。

```
[mysqld]
character-set-server=utf8mb4

[client]
  default-character-set=utf8mb4
```
再起動する。

``sudo /etc/init.d/mysql restart``

確認

```
mysql> SHOW VARIABLES LIKE "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

こうして 7 年ぶりの Windows 環境が出来上がりました。
リスト・辞書・集合型の空の要素やNoneの判定に利用できる組み込み関数(bool)

```python:sample
>>> value = 'abcd'
>>> bool(value) 
True
>>> value = ''
>>> bool(value)
False
>>> bool(1)
True
>>> bool(0)
False
>>> bool([])
False
```
APIで取得したJSONデータの解析・判定時に利用できる。
i18nを使いReact Native(CRNA)で多言語化

react-native-i18nのエラー
----------
[CRNA](https://github.com/react-community/create-react-native-app)で[react-native-i18n](https://github.com/AlexanderZaytsev/react-native-i18n)を使用すると下記のエラーが出てしまう

```
"react-native-i18n module is not correctly linked"
```

Expo用にラップされた[ex-react-native-i18n](https://github.com/xcarpentier/ex-react-native-i18n)を使う

I18n.localeがenしか取得できない
---------
- 描画前に「I18n.initAsync()」を実行する必要がある
    - 参考: https://github.com/xcarpentier/ex-react-native-i18n/issues/7#issuecomment-332475245

```js:App.js
import React from 'react'
import { AppLoading } from 'expo'
import I18n from 'ex-react-native-i18n'
import Top from './Top'

export default class App extends React.Component {
  state = { isAssetsLoaded: false }

  componentWillMount() {
    this.loadAssetsAsync()
  }

  loadAssetsAsync = async () => {
    try {
      await I18n.initAsync()
    } catch (e) {
      // console.log(e.message)
    } finally {
      this.setState({ isAssetsLoaded: true })
    }
  }

  render() {
    return this.state.isAssetsLoaded ? <Top /> : <AppLoading />
  }
}
```

ファイルで管理する方法
----------

```js:i18n/index.js
import I18n from 'ex-react-native-i18n'
import en from './locales/en'
import ja from './locales/ja'

I18n.fallbacks = true

I18n.translations = {
  en,
  ja
}

export default I18n
```

```js:i18n/locales/en.js
export default {
  cat: 'Cat',
  hello: 'Hello'
}
```

```js:i18n/locales/ja.js
export default {
  cat: 'ねこ',
  hello: 'やぁやぁ'
}
```
今すぐ試してできるmongo dbのレプリカセット　3分クッキング

# レプリカセットを設定できるようになる記事
レプリカセット：　メインDBが落ちた時にサブDBに自動で切り替える機能


## AWSインスタンスを4台立てます。
セキュリティーグループ設定
27017ポートを解放しましょう。

※ 本日は3分しかない時間の関係上用意しておいたインスタンスを使います。

## 4台にmongoをインストールします
```
sudo vim /etc/yum.repos.d/mongodb-org-3.6.repo
````

```mongodb-org-3.6.repo
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/6Server/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
```

```
sudo yum install -y mongodb-org
```

## 設定ファイルを書き換えます
```
sudo vi  /etc/mongo.conf
```

```rb:/etc/mongod.conf
net:
  port: 27017
  bindIp: 0.0.0.0 # 本当は0.0.0.0解放したらだめだぜ！でもテストなので一旦おk

# その少し下にある設定
replication:
  replSetName: "hogeReplication" #なんでもいいけど、4代とも同じ名前にしてね
```

```
sudo service mongod restart
```

```rb
# 初期化
> rs.initiate()
# セカンダリーを追加　（private IPをつかってね）
> rs.add("127.xx.xx.xx:27017")
# もう一台追加
> rs.add("127.xx.xx.xx:27017")
# アービターを追加
rs.addArb("127.xx.xx.xx:27017")
```

## 設定完了！
プライマリーのサーバにて

```
sudo service mongod stop
```

これで他のDBサーバがプライマリーになっていたら完成！


## よくわからなくなった！初期化したい！
```
sudo vi /etc/mongod.conf
レプリカの設定コメントアウト
sudo service mongod resatrt
mongo
use local;
> db.dropDatabase();
> exit
sudo vi /etc/mongod.conf
レプリカの設定コメントイン
sudo service mongod resatrt
mongo
> rs.initiate();
```
HTMLのhead要素テンプレートとメモ

# head要素とメモ
  あれ書いたっけ？これ書いたっけ？となりがちなので備忘録として。

## 全体コード
```html
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="・・・">
  <meta name="format-detection" content="telephone=no,address=no,email=no">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="robots" content="noindex,nofollow">
  <title>・・・</title>
  <link rel="shortcut icon" href="・・・" >
  <link rel="stylesheet" href="・・・">
</head>
```

## &lt;meta charset="utf-8"&gt;
  文字コードの指定。`shift_jis`なんかもよく見る。  

## &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
  携帯端末で表示した場合の画面サイズの指定。  
  `width=device-width` … 幅をデバイスの幅にする。  
  `initial-scale=1.0` … 初期表示時のスケールを等倍にする。

## &lt;meta name="description" content="・・・"&gt;
  サイトの説明を記述。検索結果にも引用され、SEOにも影響する。  
  120文字程度におさめることが良いとされている。  
  空白や未設定の場合、検索エンジンはページ内のテキストやalt属性の値を抽出して検索結果に表示する。

## &lt;meta name="format-detection" content="telephone=no,address=no,email=no"&gt;
  携帯端末において、電話番号やメールアドレスなどに推測し得る文字列に自動的にリンクが付与される機能を制御する。  
  制御をしない場合は記載をしなければよい。  
  ```
  <!-- メールアドレスのみ制御 -->
  <meta name="format-detection" content="email=no">
  ```
  ※W3Cには記載のない情報

## &lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
  IEの古いバージョンでの互換表示を防ぐ。

## &lt;title&gt;・・・&lt;/title&gt;
  ページのタイトルを指定する。  
  検索結果やブックマークにも引用される。  
  30文字以内におさめることが良いとされている。

## &lt;link rel="shortcut icon" href="・・・" &gt;
  faviconを指定する。  
  タブバーだけでなく、ブックマークや携帯端末でホーム画面に追加した際にも使われる。

## &lt;link rel="stylesheet" href="・・・"&gt;
  CSSの読み込み。
Ansibleでネストした辞書のkeyが存在するかチェックする自作フィルター作った

以前はwhen: a.b.c is definedで問題なく使用できましたが、Ansibleのバージョン2.0から2.4にあげたらa.bが未定義の場合落ちてしまったので代わりになるフィルターを自分で作ってみました。

# とりあえず動かす

サンプルコードを作ったので以下の手順でとりあえず動作確認できます。

```
git clone https://github.com/ko-he-/ansible_custum_filter_has_nested_keys
cd ansible_custum_filter_has_nested_keys
ansible-playbook test.yaml
```

# 使い方

- ansible.cfgに自作フィルターをディレクトリのパスを書く。

```ansible.cfg
[defaults]
filter_plugins=plugin
```

- 自作フィルタを配置(plugin/plugin.py)。

```plugin/plugin.py

def has_nested_keys(nested_dict, *keys):
    from jinja2.runtime import Undefined
    if isinstance(nested_dict, Undefined):
        return False

    for key in keys:
        if not isinstance(nested_dict, dict):
            return False
        nested_dict = nested_dict.get(key, {})
    return True if nested_dict != {} else False


class FilterModule(object):
    def filters(self):
        return {
            'has_nested_keys': has_nested_keys
}
```

- playbookで「has_nested_keys」呼び出す。

```
    - name: "dict_foo_bar is NOT defined"
      debug: msg="dict_foo2_bar2 is NOT defined"
      when: dict| has_nested_keys('foo2', 'bar2')
```

`dict| has_nested_keys('foo2', 'bar2')`は`dict['foo2']['bar2']`が定義されているかをTrue or Falseで返します。(dcitが未定義 or 辞書でない、dict['foo2']が未定義 or 辞書でない場合もFalse)
ASP.netでIPアドレスを取得する

C# IISを使ったASP.netで、クライアントのIPアドレスを取得する

            // 要求元クライアントのIPアドレス
            string userIp = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

            // または以下（こっちの方が文字列リテラルが含まれないので美しい）
            userIp = System.Web.HttpContext.Current.Request.UserHostAddress;


なお、実行環境自身のIPアドレスを取るには

            IPAddress[] lIp = Dns.GetHostAddresses(Dns.GetHostName());

            // IPv4を抽出する必要がある
            foreach (var iIp in lIp)
            {
                if (iIp.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    return iIp.ToString();
                }
            }
Adobe XDのファイルから画像を抽出するメモ


1. XD上で「ファイル」ー＞「書き出し」ー＞「すべてのアートボード…」
1. フォーマットで"PDF"を選択して「すべてのアートボードを書き出し」
1. 保存したPDFファイルを、[LibreOffice](https://www.libreoffice.org)で読むこむ。
1. OpenDocument形式(拡張子.odg)で保存する。
1. 保存したファイルの拡張子を .odg から .zip に変更する。
1. .zipファイルを解凍する。

	![スクリーンショット 2018-03-07 14.29.05.png](https://qiita-image-store.s3.amazonaws.com/0/20722/b9b1205f-e5f0-fb57-e3c8-eb94f8cd1aff.png "スクリーンショット 2018-03-07 14.29.05.png")


以上の手順で、Picturesフォルダの中に画像が保存される。

参考：　[PDF中の画像ファイルのみを抽出する](https://qiita.com/aokomoriuta/items/066b760a28da461531b6)
git cloneする時にローカルユーザーを同時に指定できるサブコマンド作ったよ！

# はじめに
**「あっ、コミットユーザー間違えた・・・」**

gitでこのような経験をした人はいるだろうか。
本家のGithubにしかPushしない場合は遭遇することは少ないだろうが、例えば会社ではGithubEnterpriseを使っている場合などは、それぞれの環境で異なるアカウント名、メールアドレスを使っている、といったケースが多いだろう。
最近だと、フリーランスで働く人も多くなっている現状、会社毎に異なるアカウント名/アドレスが配布され、それぞれ異なるアカウント名、アドレスで作業をする、といったケースもあるのではないだろうか。

このような時、GitではlocalコマンドでUser名とメールアドレスを個別に指定できる機能がある。

```
$ git config --local user.name <UserName>
$ git config --local user.email <E-Mail>
```

が、この指定は`git clone`とは別コマンドで指定するため、うっかり忘れが発生してしまう。加えて、地味にコマンドが長いので打つのがメンドクサイ。

そこで`git clone`と同時にlocalのユーザー情報を指定できるコマンド、`cloneas`コマンドを作成した。

# 使い方

## インストール
まずはGithubからシェルを取ってくる
https://github.com/kiuchikeisuke/git-cloneas

次に内包されている`git-cloneas`ファイルを、任意のパスが通ったフォルダに配置する。これでコマンドのインストールは完了

## ユーザー情報を設定する
**global**の`.gitconfig`ファイルを開き、任意のユーザー情報を記載する

```config:.gitconfig
[SomeUser1]
   name = some-user1
   email = some.user1@some.com
[SomeUser2]
   name = some-user2
   email = some.user2@some.com
...
```

## `git cloneas`する
コマンドの仕様は以下のとおり

```
$ git cloneas <User> <git-repo>
```

例えば今回のgit-cloneasのレポジトリに、SomeUser1の設定を追加したい場合は、以下のようになる

```
$ git cloneas SomeUser1 git@github.com:kiuchikeisuke/git-cloneas.git
Cloning into 'git-cloneas'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), 4.52 KiB | 0 bytes/s, done.
set local user.name some-user1
set local user.email some.user1@some.com
```

これで、**Cloneすると同時にlocalのuser情報がセットされる**ので、うっかり忘れがなくなる。
[WIP] 予測モデルのアンサンブルスニペット

[0,1]の範囲に収めなければならないようなケースでは`minmax_scale`を使うと良いでしょう。

重みの列を持って処理しても良いかもしれない。

```
ensemble[col] = w1*minmax_scale(model1[col].values) + w2*minmax_scale(model2[col].values) + ...
```
C言語で文字列操作するのに便利な「utstring」

C言語で文字列操作するのにいちいち動的にメモリ確保したりするの面倒だなあというときには、「utstring」を使うと便利かもしれません。

# utstringとは

utstringは、C言語で動的に文字列操作するためのライブラリです。大部分がマクロで実装されているのが特徴で、utstring.hをincludeするだけで使えるので非常にお手軽。
下記サイトから入手できます。
https://troydhanson.github.io/uthash/utstring.html

以下は公式サイトでも説明されている内容なので、正確な情報は公式サイトを参照してください。また、utstring.hは単なるマクロ定義の塊なので、細かい挙動はソースコードからも確認できます。

# 使い方

utstring.hをダウンロードして、includeするだけで使えます。

```c
#include "utstring.h"
```

文字列型としてUT_stringという構造体が定義されているので、通常のchar*の代わりにこれを使います。
UT_stringの構造体定義は次のようになっています。dが内部文字列の領域へのポインタで、nが確保された領域のサイズ、iが未使用領域へのインデックスとのことです。

```c
typedef struct {
    char *d;  /* pointer to allocated buffer */
    size_t n; /* allocated capacity */
    size_t i; /* index of first unused byte */
} UT_string;
```

UT_stringを使って文字列操作するためのさまざまなオペレーションがutstring_xxxxという名前で用意されているので、これを使えば、string.hでできるような一連の操作を行えます。
具体的には、次のようなオペレーションが用意されています。

- utstring_new(s) : 新規utstringを作成する
- utstring_free(s) : sの領域を解放する
- utstring_init(s) : sを初期化する
- utstring_done(s) : sの文字列領域を解放する
- utstring_renew(s) : sがNULLの場合は、新規に領域を確保する。NULLでない場合はクリアする（utstring_clearと同等） 
- utstring_printf(s,fmt,…) : sに文字列をセットする
- utstring_bincpy(s,bin,len) : char*の文字列をsにコピー（追加）する
- utstring_concat(dst,src) : utstring同士を連結する
- utstring_clear(s) : sをクリアする（空文字列にする）
- utstring_len(s) : sの文字列長を返す
- utstring_body(s) : sの文字列をchar*として返す
- utstring_find(s,pos,str,len) : s内の部分文字列をposの位置から後ろ方向に検索する
- utstring_findR(s,pos,str,len) : s内の部分文字列をposの位置から前方向に検索する

# utstring_new(s)/utstring_free(s)とutstring_init(s)/utstring_done(s)の違い

utstring_new(s)はutstring_free(s)はsそのもののメモリ領域を確保/解放します。utstring_init(s)/utstring_done(s)は内部文字列の領域の初期化と解放を行います。
なお、utstring_clear(s)は内部文字列としてヌル文字をセットしてサイズを0にするだけで、メモリは解放しません。

# 使用例

```c
#include <stdio.h>
#include "utstring.h"

int main() {
	UT_string *s;
	
	utstring_new(s);	// 新規作成
	utstring_printf(s, "number=%d", 123);	// 文字列を格納
	printf("%s\n", utstring_body(s));	// 出力 number=123

	UT_string *t;
	char *str = "hoge";
	utstring_new(t);
	utstring_bincpy(t, str, strlen(str));	// char*から文字列をコピー
	printf("%s\n", utstring_body(t));	// 出力 hoge
	
	utstring_concat(s, t);			// tをsに連結
	printf("%s\n", utstring_body(s));	// 出力 number=123hoge

	utstring_free(s);	// 解放
	utstring_free(t);
}
```
iPhoneの言語を英語にする方法

まず設定画面を開きます。
<img width="375" alt="IMG_4647.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/242423/7ed61cfd-8ad1-dbb6-a825-4da34fc593b2.png">

次に一般を押します。
<img width="375" alt="IMG_4649.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/242423/a1ce4a1f-77b7-149d-5a0c-7f890b5ec7bc.png">

次に言語と地域を押します。
<img width="375" alt="IMG_4650.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/242423/1675efcb-bc2b-f7df-ee4b-9fa38675cbda.png">

最後にiPhoneの使用言語で英語を選ぶとiPhoneが英語で使えるようになります。
電子回路入門　７セグメントLED　複数桁

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614)に沿って引き続き進めていきます。
[前回](https://qiita.com/aikawa_YO/items/fdc2d1d9352c4d0d116e "電子回路入門　７セグメントLED")書けなかった部分の内容になってます。

#**ダイナミック制御とは**
複数の7セグを高速で切り替え・点灯させて、あたかもすべて光っているかのように見せる技です。

7セグメントLEDで複数桁表示させようと思ったとき、[前回](https://qiita.com/aikawa_YO/items/fdc2d1d9352c4d0d116e "電子回路入門　７セグメントLED")のやり方ではいっぱい配線しなきゃいけないので大変です(;´Д｀)
そこで、ダイナミック制御を使用して少ない配線でたくさん点灯させようと思います。

#**使用部品**
- PSoC 5LP
- 抵抗(100,2kΩ)
- 74HC4511
- [4桁7セグメントLED](http://akizukidenshi.com/catalog/g/gI-03673/)
（無い場合は7セグメントLEDを4つつなげてください。下記ブレッドボード図参照）

#**回路図**
地獄絵図…(;´Д｀)
今回は4桁のまとまっている7セグを使用しますが、通常の1桁の7セグを使用する場合は↓のように配線します。
![4桁_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/27d1d986-b1a9-8544-078a-7501f045b533.png)

↑をそのまま回路図にすると大変だったので、回路図ではまとめてあるものを使用することにしました。
7セグのピン番号が違っていますが…仕様書見てくださいm(_ _"m)
![４桁_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/4c4fb997-3d3f-5646-4c35-552146bcf991.png)

#**プログラム**

「4321」と表示させるプログラムです。

```c
#include "project.h"
#include "stdio.h"

int main(void)
{
    CyGlobalIntEnable;
    for(;;)
    {
        LED_1_Write(1);
        Pin_1_Write(0b0001);
        CyDelay(3);
        LED_1_Write(2);
        Pin_1_Write(0b0010);
        CyDelay(3);
        LED_1_Write(3);
        Pin_1_Write(0b0100);
        CyDelay(3);
        LED_1_Write(4);
        Pin_1_Write(0b1000);
        CyDelay(3);
    }
}
```

#**あとがき**
PSoCでは内部的に7セグのドライバーがあるのかもしれない。(74HC4511は不要だったかも)
![7segu .png](https://qiita-image-store.s3.amazonaws.com/0/195542/06005389-dba0-8533-6ece-2734bd0bd926.png)
dart:htmlの使い方

若干所見殺しだったようなので簡単に説明します。

ルール

 -  "dart:html"と"dart:io"はどちらか一つしか使えない
 - "dart:io"をインポートしたらJSにトランスパイルできない
 - "dart:html"をインポートしたらcliで実行できない

"dart:io"はファイルアクセスや生ソケット等の標準ライブラリが入っています。当然ブラウザでは使えないです。
"dart:html"はwindowオブジェクトやHTML要素などが入っています。これはChromeやFFなの機能を呼び出すだけなのスタンドアロンのVMでは使えないです。TypeScriptで言うところのlib.es2016.full.d.tsです。

"dart:html"で遊ぶ方法はこちらです。
まずFile構成はこんな感じです。

```
- hoge
  - web/
    - index.html
    - index.dart
  - pubspec.yaml
```

ディレクトリ名の「web」は規約なので変えられないです。

```html

<!DOCTYPE html>
<html lang="ja">
<head>
    <title>Top</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

</head>
<body>

<script defer src="index.dart.js"></script>
</body>
</html>
```

```dart
import 'dart:html';

void main() {
  var message = new DivElement()..text = "いえーい";
  document.body.append(message);
}

```

これで```pub serve```コマンドを打つと

``` Serving [prjname] web on http://localhost:8080```
とか言われるのでそこにアクセスしてください。
気が済んだら``` pub build``` するとJSが./buildディレクトリに吐き出されます。

## 解説

### pub serveとは？
webpack-dev-server的なものです。Dartは自動的にトランスパイル+連結されます。

### DivElementとdocumentはどこから来た？
"dart:html"からです。

### どうしたら書いたDartがブラウザで実行できるの？
"${dart_file_name}.js"にアクセスするとJSが取得できます。
main.dartならmain.dart.js、love.dartならlove.dart.jsです。
pub serverはhoge.dart.jsにアクセスが来るとhoge.dartを探し出してそれをトランスパイルしてレスポンスしてくれます。
だらか\<script src="hoge.dart.js"\>タグで読み込みましょう。


## 補足

### HTMLに書き込んだButtonにリスナーを設定したい
document.getElementById(elementId)かquerySelector(selectors)を使ってbuttonを取得してそこにイベントリスナーを設定してください。

```
  (querySelector('#button') as ButtonElement)
    ..onClick.listen((_) => print("うぇーい"));
```

### querySelectorとかがグローバルに生えてるのいやなんだけど

```"dart:html" as sukina_namae```

### sassが使いたい
たぶんこの質問が出てくるということはgulp-webserverに何もかもやってもらってる人だと思います。
pubにはtransformerという仕組みがあり、ここでpub serve時とpub buildに処理を挟めます。

```
dependencies:
  dart_sass_transformer: any
transformers:
  - dart_sass_transformer
```
こんな感じで使えます。

### ほかの記事に\<script src="packages/browser/dart.js"\>ってのがあったんだけどなにこれ

packages/browser/dart.jsを見てもらえばわかりますが、HTML上のscriptタグの中で拡張子がdartなものを全部hoge.dart.jsに置き換えてるだけのものです。
pubspec.yamlに browser: ^0.10.0 を追加すると使えます。
dartiumとの連携に便利だったりするので使われているイディオムです。

```html

<script src="index.dart" type="application/dart"></script>
<script src="packages/browser/dart.js"></script>
<!--<script src="index.dart.js"></script>-->

```
slackのカスタム絵文字用に画像をリサイズするコマンド

```bash

curl http://1.bp.blogspot.com/-_Klr-z5WhJA/WlGpUE2oDgI/AAAAAAABJmQ/7FTA91uQ0SI7LWdAvkzDIMh3ckGc8QQuACLcBGAs/s800/game_savepoint.png \
| convert - -resize 128x128 ~/game_savepoint.png
```

`convert`コマンドで128x128にリサイズしよう。

ちなみに画像がローカルにある場合は、こちら

```bash

convert ~/Desktop/pray.png -resize 128x128 ~/pray.png
```
VISUAL ASSISTがとっても優秀な件

#c++でインテリセンス(IntelliSense)を使っている皆様
皆さん、このようなインジケータが長く表示されてしまったので、コーヒーで一服した経験ございませんか？
![インテリセンス.png](https://qiita-image-store.s3.amazonaws.com/0/175864/13a84062-1fd5-73f9-a623-b822604c0c00.png)

私はあります。定義に飛ぶのに時間がかかって、待っていられないので自分でgrepしたりします。特にUE4などの**デカデカプロジェクト**ではこうなります。そして思うのです。これは果たしてintelligenceなのかと。

#VISUAL ASSIST
同じことを思った方はこちら。
https://www.wholetomato.com/
[ツール] -> [拡張機能と更新プログラム]でも検索可能。
こちらをインストールするだけで、標準のC++のインテリセンス(IntelliSense)を超える入力補完機能を入手できます。

#インテリセンス(IntelliSense)より速いVISUAL ASSIST略してVA
基本的にはインテリセンス(IntelliSense)がやっていることと同じなのですが、速度が違います。ソースがたくさん含まれる商用プロジェクトでもサクサク動作します。

サクサク動作するので本来インテリセンス(IntelliSense)でやってほしい動作を待たずして恩恵を受けられます。
※C++を使っている時の感想です。

#インテリセンス(IntelliSense)から完全移行したい

##基本使う操作
- リファクタリング
   - [右クリック] -> [Quick Action And Refactorings]
![VA右クリック.png](https://qiita-image-store.s3.amazonaws.com/0/175864/5a4959c3-7955-300b-03ed-881f0ab416fa.png)
- 定義に飛ぶ
    - VAssistX.GotoImplementation を使用。デフォルトで[Alt + G]なので[VAをインテリセンス(IntelliSense)と同じように使いたい](https://qiita.com/sy_/private/20717560a0c9e914e5e5#va%E3%82%92%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%A8%E5%90%8C%E3%81%98%E3%82%88%E3%81%86%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84)にてショートカットをいつもの「F12」にするのがおすすめ。

- ツールチップ
   - デフォルトでオフになっているので[VAをインテリセンス(IntelliSense)と同じように使いたい](https://qiita.com/sy_/private/20717560a0c9e914e5e5#va%E3%82%92%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%A8%E5%90%8C%E3%81%98%E3%82%88%E3%81%86%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84)にて設定。

- ショートカットキー何があるのか知りたい
    -  [VAssistX] -> [Help] -> [Keyboard Shortcuts]
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/d04f5317-3a5b-03d8-75ae-95b161829c45.png)

##VAをインテリセンス(IntelliSense)と同じように使いたい
インストールしたそのままの状態ですと、ショートカットキーが分かりにくかったり「インテリセンス(IntelliSense)であったアレってVisualAssistの中のどれ？」って状態になると思います。
なので最低限よく使うものを紹介。これで十分と言えば十分かも？

- ツールチップの設定
[VAssistX] -> [Visual Assist Options...] -> [Display]
-> Show Quick Info tooltips for more sumbols
![VA.png](https://qiita-image-store.s3.amazonaws.com/0/175864/8805f678-b075-835f-7ae6-e10bd347d037.png)

- ショートカットキーの設定
[VAssistX] -> [Help] -> [Keyboard Shortcuts] -> [Customize...]
![VA ショートカット.png](https://qiita-image-store.s3.amazonaws.com/0/175864/523ac837-ecba-9eba-60cc-788a441ccf5f.png)
ショートカットキーに入力して「割り当て」クリックするだけ。

- デフォルトのシンタックスハイライト嫌い
    - [VAssistX] -> [Visual Assist Options...] -> [Display] -> [Coloring and Attributes]
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/a898fcc0-4136-49c7-d434-4a3d077d8a48.png)

    - [Enable Enhanced Syntax Coloring] を切るとVisualAssistのカラーは切れます。最近はVisual Stusioの定義そのまま使った方が細かく設定出来るのかもしれません。そちらを優先したい場合インテリセンス(IntelliSense)を切ると色つかないものも出てきますけどね。。

##インテリセンス(IntelliSense)を切る（C++の場合）
[ツール] -> [オプション] -> [テキストエディタ] -> [C/C++] -> [詳細設定] -> [IntelliSense] -> [IntelliSenseの無効化]
![IntelliSense無効化.png](https://qiita-image-store.s3.amazonaws.com/0/175864/1148daa4-ee62-a40b-a638-24fbdba2731a.png)


#結局何が良いの？
多機能がいいというより「速度」が良いです。
試用期間が30日あります。一度使ってみると快適すぎて購入を検討せざるを得ません:innocent:
ftp設定メモ

とりあえず
シンプルな「FileZilla Server」をインストールしようとする。

https://ja.osdn.net/projects/filezilla/releases/
から
FileZilla_Server-0_9_60_2.exe
をダウンロードして実行
「IAgree」＞そのまま「Next」＞そのまま「Next」＞14147ポートだけどそのまま「Next」
＞StartServeraftersetupcompletesにチェックあるのでそのまま「Next」
＞「Install」＞「Close」

なんか「127.0.0.1」で起動する。
推測されにくいパスワードを JavaScript でさっと生成する（ブックマークレット付き）

## パスワードの生成

下記スクリプトで、英数字、記号（スペースを除く）をランダムに混ぜて10桁のパスワードを生成します。

```js
function generatePassword() {
  var first = '!'.charCodeAt();
  var last = '~'.charCodeAt();
  var password = '';
  
  for (var i = 0, max = 10; i < max; i += 1) {
    var code = first + (Math.random() * (last - first) | 0);
    password += String.fromCharCode(code);
  }

  return password;
}
```

パスワードに使用している文字列は、下記の通りです。

```
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}
```

## おまけ

### パスワード生成後、クリップボードにコピーする

クリップボードへコピーするスクリプトは下記になります。
Range API を使っているので、IE9 以降、Edge、Chrome、Firefox、Safari は対応しています。

```js
var password = generatePassword();

var elem = document.createElement('span');
elem.style.opacity = 0;
elem.textContent = password;
document.body.appendChild(elem);

var range = document.createRange();
range.selectNode(elem);
getSelection().removeAllRanges();
getSelection().addRange(range);

document.execCommand('copy');
document.body.removeChild(elem);

alert('以下のパスワードをクリップボードにコピーしました。\n\n' + password);
```

<img width="513" alt="クリップボードにコピーするイメージ" src="https://qiita-image-store.s3.amazonaws.com/0/25283/f839ad6a-faf7-335a-43cc-424c8a427c42.png">

#### ブックマークレット

下記文字列をコピーしてブックマーク URL に設定してください。

```
javascript:(function(){for(var a,b="!".charCodeAt(),c="~".charCodeAt(),d="",e=0;10>e;e+=1)d+=String.fromCharCode(b+(Math.random()*(c-b)|0));a=d;var f=document.createElement("span");f.style.opacity=0;f.textContent=a;document.body.appendChild(f);var g=document.createRange();g.selectNode(f);getSelection().removeAllRanges();getSelection().addRange(g);document.execCommand("copy");document.body.removeChild(f);
alert("\u4ee5\u4e0b\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\u3002\n\n"+a);})()
```

### スプレッドシートに組み込む

スプレッドシートでパスワード管理している場合は、メニューバーから提供するのもありかと思います。パスワードの生成は記事冒頭にある `generatePassword` と同一内容です。

※ スプレッドシートでパスワード管理を推奨する内容ではありません、管理は自己責任でお願いします。

```js
function onOpen(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var menus = [
    {name: 'パスワードの自動生成（選択中のセルに書き込まれます）', functionName: 'writePasswordToActiveRange'}
  ];
  sheet.addMenu('スクリプト', menus);
}

function writePasswordToActiveRange(){
  var range = SpreadsheetApp.getActiveRange();
  
  if (range.getValue() === '' || Browser.msgBox('現在のセルの内容を上書きしますか？') === 'ok') {
    range.setValue(generatePassword());
  }
}

function generatePassword() {
  var first = '!'.charCodeAt();
  var last = '~'.charCodeAt();
  var password = '';
  
  for (var i = 0, max = 10; i < max; i += 1) {
    var code = first + (Math.random() * (last - first) | 0);
    password += String.fromCharCode(code);
  }

  return password;
}
```

![スプレッドシートに組み込んだイメージ](https://qiita-image-store.s3.amazonaws.com/0/25283/ea3c2c4e-5bea-030b-125e-3e5cc56d2df0.gif)

以上です。
RSpecでコンソールにログを出力させる

自分用の備忘録です。

`spec/spec_helper.rb`に各クラスの`logger`変数に代入してあげる


Rails.loggerのログ

```rb

Rails.logger = Logger.new(STDOUT)

RSpec.configure do |config|
```

SQLの実行ログは`ActiveRecord::Base`クラスにオブジェクトを代入

```rb

ActiveRecord::Base.logger = Logger.new(STDOUT)

RSpec.configure do |config|
```
DartでConstructorの引数と本文の間に式をかける件について

DartでConstructorの引数と本文の間に式をかけることがわかりづらいそうなので簡単に説明します。
本文という言い方が正しいのかどうか知らないですが、ここでは波カッコから波カッコの間のことです。

```Dart:main
class Lion {
  String name;
  double feet;

  Lion(this.name) : feet = 6.0 {
    //              ↑これなんだ？
  }
}

```

Dartではfinalフィールドをコンストラクタの本文で初期化することが許可されていません。

```dart:error1
class Lion {
  String name;
  final double feet;

  Lion(this.name, double meter){
    feet = meter * 3.28;
    // error: 'feet' can't be used as a setter because it is final.
  }
}
```

なので、このようにコンストラクタの本文が始まる前に初期化を終えておきましょう。

```dart:ok1 
class Lion {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meter * 3.28 {
    
  }
}

```

superで親コンストラクタの呼び出すときも、本文には書けません。

```dart
class Lion extends Animal {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meter * 3.28 {
        super(8);// ←エラー
  }

}

```

正解はこちら。

```dart
class Lion extends Animal {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meter * 3.28 , super(8) {
  }

}

```


ちなみに、引数と本文の間でインスタンスメソッドは使えないです。staticにしましょう。
ただ、あまりにも複雑になるならfactoryコンストラクタを使ったほうがいいかもです。

```dart

class Lion {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meterToFeet(meter) {}

  // ↓static は必須。インスタンスメソッドは↑で使えない。
  static double meterToFeet(double meter) {
    return meter * 3.28;
  }
}
```


Javaでコンストラクタのfinalフィールドを初期化するときのルールが結構多いことをご存知の方は存在意義わかっていただけると思います。
ModelerクライアントからModeler Serverに接続するポート

ModelerクライアントとModeler Serverの間にファイアウォールがある場合、どのポートを開けるかの設定が必要です。
使用するのはすべてTCPになります。

## Modeler Server接続に必要なポートは2種類あります。
1. Option.cfg の「port_number」で指定したポート
デフォルトはModeler18.1.1なら28057です。バージョンによってデフォルトは変わります。この番号はデフォルトなので変更は可能です。

2. Option.cfg の「min_server_port」と「max_server_port」で指定した範囲のポート
デフォルトは指定がないためランダムなポートになります。ファイアウォールで設定するためにはランダムでは設定できないため明示的に指定する必要があります。以下のように使われます。

- ストリーム１つごとに２つ
    - ストリームは実行していなくてもオープンした時点でポートが必要
- クライアントあたりのODBC1接続ごとに３つ
- ポートが足りなくなった場合はModelerServerへの接続エラーとなります。ストリームの実行はできませんが、保存などは可能です

## 設定例
ModelerServer側のoption.cfg（Modeler Client側のoption.cfgではない）に設定します。

- 想定：Modelerバージョン18.1.1。3ユーザーがDB接続ありの5ストリームをオープン。(3user*5stream*2ポート+3user*3ポート=39）

    - port_number,28057
    - min_server_port, 30000
    - max_server_port, 30038

- 上記設定の場合はModeler Client側:any port→Modeler Server側が28057,30000-30038のファイヤーウォールの設定が必要です。

## 参照
以下のTechnoteが元ネタになります。
IBM How many ports are utilized when a Modeler Client connects to Modeler Server? - United States
http://www-01.ibm.com/support/docview.wss?uid=swg21488421

IBM Knowledge Center - 接続/セッション
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.1.1/modeler_mainhelp_client_ddita/clementine/server/adminguidesource/admin_pem_sessions.html
ポート番号: (port_number) SPSS® Modeler Server が listen するポート番号。別のアプリケーションが既にデフォルトを使用している場合は、これを変更します。

IBM Knowledge Center - パフォーマンス/最適化
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.1.1/modeler_mainhelp_client_ddita/clementine/server/adminguidesource/admin_pem_performance.html
最大および最小サーバー・ポート: (max_server_port および min_server_port) インタラクティブ・モデルおよびストリーム実行のために必要なクライアントとサーバーの間の追加ソケット接続に使用できるポート番号の範囲を指定します。
【Git】ローカルに存在しないリモートのブランチの作成方法

ローカルに存在しないリモートリポジトリのブランチをローカルに反映させたいときは、以下の手順で作業を行う。

```bash
# リモートリポジトリのブランチの最新の状態をローカルに取得する
$ git remote update
Fetching origin
remote: Counting objects: 1, done.                                                                     
Unpacking objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
From ssh://git.nantoka.com/project/repo
   7b654551..27241234  branch01 -> origin/branch01

# ブランチを作成しながら、切り替える
$ git checkout -t origin/branch01
```
WindowsでもGitlabを使いたい！

ようやく出来た記事です。
いやぁ、長かった……！

# Windows(10 pro)でGitlabを運用したいのでVagrant+VirtualBoxで環境を作って運用できそうな話
→まだやってないので、これからっぽいタイトルにしておきます。
→<a href="https://qiita.com/nomurasan/items/5671326dc3e16f8b7890">結局うまくいかなかったので、Hyper-Vで作り直しました。</a>

なお、よく忘れるので先に書いておきますが、gitlabの初期ログインパスは、

* root
* 5iveL!fe

です。
ログイン後に変更しろと言われるので、その時にパスワードを変更します。

# 実施環境
Windows: 10 Pro
Vagrant: 2.0.2　（インストール時点）
VirtualBox: 5.2.8-121009-Win

書く必要はないんですが、本環境は64bitです。
gitとかはvagrant boxの方で入っているものと思ってたんですが、インストール直後は見つからなかったです。

# 事前準備
Vagrantインストール
https://weblabo.oscasierra.net/install-vagrant-onto-windows/

VirtualBoxインストール
https://eng-entrance.com/virtualbox-install
読み飛ばし項目は未実施

前の記事とかでDocker入れたりHyper-Vが動いてたりしてるので、こいつが障害になったため、後で止めてます。
その前提で以下を読み進めてください。

# 手順
大体は<a href="http://growsic.com/blog/vagrantubuntu1404gitlab/">こちら</a>の手順です。
実行時はpowershellで行います。

``` powershell.sh
mkdir (vagrant_directory)
cd (vagrant_directory)
vagrant box add ubuntu1404s https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box
vagrant init ubuntu1404s
vagrant up
vagrant ssh
# ここでコンソールの表記が vagrant@ubuntu-14:~$ に変わる事でログインができたことを確認できる
# 以下、ログイン後を想定。普通のubuntuの設定
sudo apt-get install openssh-server
sudo apt-get install postfix
wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.9.2-omnibus-1_amd64.deb
sudo dpkg -i gitlab_7.9.2-omnibus-1_amd64.deb
sudo gitlab-ctl reconfigure
```

後で知ったんですが、vagrant upの前にvagrantfileを編集しておいた方が良いです。
私がやったのは
``` # config.vm.network "private_network", ip: "192.168.33.10" ```
のコメントを外しました。

``` powershell.shの続き
exit
# ここでコンソールの表記がpowershell従来のものに戻る
vagrant reload
```
この時に、WindowsのVirtualBoxを実行しようとしています。
うまくいかなかったのはこの辺りにも理由がありそうです……

もしかすると、追加の手順が必要かもしれませんが、私の環境ではこれだけでできました。
あとは、<a href="http://192.168.33.10">http://192.168.33.10</a>にブラウザでアクセスすればログインページになっていました。
もちろん、通常通りログインできましたが、場合によっては追加で調査が必要かもしれません。
私の環境ではそのままWelcome to GitLab!まで出来たので、とりあえず環境構築はここまでとします。
また問題があれば別記事で起こします。

# 参考
Docker for Windowsを使うためにHyper-Vを入れてたり、Vagrantfileを編集する必要はあるので、以下も合わせて参考のこと
http://growsic.com/blog/vagrantubuntu1404gitlab/

vagrant upコマンドで失敗する場合
http://eiua-memo.tumblr.com/post/143625719906/vagrantwindows10にアップグレード後vt-x-is-not

ipアドレスにアクセスできない場合
http://to-developer.com/blog/?p=1827

今回うまくいかなかった方法
http://semper-fi.hatenablog.com/entry/2017/04/05/122446
→vagrant box addしている https://atlas.hashicorp.com/webysther/boxes/gitlab-ce-ubuntu-x64-14.04/versions/1.0/providers/virtualbox.box が見つからない。ただし http://www.vagrantbox.es には居る。
　上記リンク先で404エラーになっているので、このURLは使えない。

# 過去記事
<a href="https://qiita.com/nomurasan/items/a2cdaa55aa00fd44e29e">Windows(10 pro)でGitlabを運用したいのでDocker for Windowsで環境を作ってみたけど運用できなかった話</a>
<a href="https://qiita.com/nomurasan/items/b725c9ee9179bcac2b22">Windows(10 pro)でGitlabを運用したいのでBash on Ubuntu on Windowsで環境を作ってみたけど運用できなかった話</a>

## 事の発端
<a href="https://qiita.com/nomurasan/items/5197100a1ae3e5a30f4c">レベル０のDockerプレイヤーが可能な限りシンプルな状態から勉強したい時の話</a>

# 注釈
Windows(10 pro)でGitlabを運用したいのでWSL2で環境を作ってみたけど運用できなかった話

<a href="">似たようなタイトルの記事</a>[^1]を書いてますが、今回はアプローチを変えてチャレンジしました。
今度はDocker for WindowsではなくてBash on Ubuntu on Windowsです。要は「既にGitlabがサポートする[^2]ディストリビューションがあるんだからそれを使おう」

[^1]: 【同リンク有】<a href="">似たようなタイトルの記事：Windows(10 pro)でGitlabを運用したいのでDocker for Windowsで環境を作ってみたけど運用できなかった話</a>
[^2]: Gitlabがサポートするディストリビューション：厳密に言うと純正のUbuntuではないので対象外だと思います。

# Windows(10 pro)でGitlabを運用したいのでBash on Ubuntu on Windowsで環境を作ってみた
結論からいうと、なんか上手くいってるっぽいんですがipからのログインが出来ませんでした。

``` commands.sh
sudo apt-get install curl openssh-server ca-certificates postfix
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce
sudo gitlab-ctl reconfigure
```

なんか出来そうな気がするんですが……

# 参考
https://about.gitlab.com/installation/#ubuntu

# 類似記事
<a href="https://qiita.com/nomurasan/items/a4291f5a18f3b6cc1525">Windows(10 pro)でGitlabを運用したいのでVagrant+VirtualBoxで環境を作って運用できた話</a>
<a href="https://qiita.com/nomurasan/items/a2cdaa55aa00fd44e29e">Windows(10 pro)でGitlabを運用したいのでDocker for Windowsで環境を作ってみたけど運用できなかった話</a>
【ココ】Windows(10 pro)でGitlabを運用したいのでBash on Ubuntu on Windowsで環境を作ってみたけど運用できなかった話

# 注釈