OmniAICreator/Qiita-1.07M huggingface dataset:
Rustの構造体メンバーにクロージャを持たせるには

# この記事は

structにIterator traitを実装をして、そのイテレーションに任意のクロージャをfilterとして用いたかった。
そこで表題のようにstructをインスタンス化する際にクロージャをメンバーとしてアサインしようとしたが、少し詰まったのでその備忘録である。

# クロージャの型ってなんだっけ

結論から言うとこの問に答えられなかったのが全て。
最初`f: Fn(usize) -> bool`とか書いてたの本当に愚かだった。

```rust
struct A {
    count: usize,
    exp: Fn(usize) -> bool,
}

impl Iterator for A {
    type Item = usize;
    fn next(&mut self) -> Option<usize> {
        self.count += 1;
        if (self.exp)(self.count) {
            Some(self.count)
        } else {
            None
        }
    }
}

fn main() {
    let a = A {
        count: 0,
        exp: |x| x < 5,
    };
    
    for c in a.into_iter() {
        println!("{}", c);
    }
}
```
これは下記のエラーをくらう。

```rust

   |
22 |         exp: |x| x < 5,
   |              ^^^^^^^^^ expected trait std::ops::Fn, found closure
   |
   = note: expected type `std::ops::Fn(usize) -> bool + 'static`
              found type `[closure@src/main.rs:22:14: 22:23]`
```
そのままだが、これは`Fn`がtypeではなくtraitだからである。

# Fnとfnの違い

結論から言うとクロージャの型は`fn(T) -> U`である。

`fn`は[primitive type](https://doc.rust-lang.org/std/primitive.fn.html)だが、`Fn`は[trait](https://doc.rust-lang.org/std/ops/trait.Fn.html)である。

`f: Fn(usize) -> bool`をメンバーとして定義するなら、`Fn`を満たすtypeを別途定義してから渡す必要があるわけで、`|x| x < 5`はtypeではなく値である。

# 結論

今回やりたかったのは`f:  fn(usize) -> bool`だったという話。

```rust
struct A {
    count: usize,
    exp: fn(usize) -> bool,
}

impl Iterator for A {
    type Item = usize;
    fn next(&mut self) -> Option<usize> {
        self.count += 1;
        if (self.exp)(self.count) {
            Some(self.count)
        } else {
            None
        }
    }
}


fn main() {
    let a = A {
        count: 0,
        exp: |x| x < 5,
    };
    
    for c in a.into_iter() {
        println!("{}", c);
    }
}
```
catすごい

なぜcatが怒られたのかが知りたいっす.
[Linuxコマンドは単語の意味を理解するとグッと身近なものになる - Qiita](https://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02)

:訂正感謝です
P.S.はてぶのやふにリンク挿入後にブログカード作ってほっしいなぁ‥
【jQuery】ajax-config.jsなるものを作ってみた。(Spring Security利用時にも使える)

このJavaScriptを好きにカスタマイズして、ajaxメソッドのトップで読み込めば設定が全体に生きる。

### thymeleaf
```html:sample.html
	<!--/* CSRFトークン取得用metaタグ */-->
	<meta name="_csrf" th:content="${_csrf.token}" />
	<meta name="_csrf_header" th:content="${_csrf.headerName}" />
```
### ajax-config.js
```js:ajax-config.js

///////////////////////////////////////////////////////////////////////////////////////////////
// Ajax通信の設定
///////////////////////////////////////////////////////////////////////////////////////////////
$(function () {
    /**
     * layout.htmlから取得したコンテキストパス.
     * 例）/elabel/edit にアクセスしたい場合は「contextPath + 'elabel/edit'」がURLとして利用できる.
     */
    contextPath = $('#contextPath').val();
});

/**設定を変更したい場合は個別JSファイル内のAjaxメソッドにオプションを記述して上書き */
(function () {
    $.ajaxSetup({
        cache: false, /** 一度使用したAjax通信のレスポンスをキャッシュさせない. */
        timeout: 15000, /** タイムアウト設定（暫定） */
        beforeSend: function (xhr, settings) { /** 通信開始直前の処理 */
            setCsrfTokenToAjaxHeader();
            // ここにクルクルGIFが動き出す処理とか入れるといい感じ
        },
        success: function (data, status, xhr) { /**通信成功時の処理 */
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {/**通信失敗時の処理 */
            console.log("ajax通信に失敗しました");
            console.log("XMLHttpRequest : " + XMLHttpRequest.status);
            console.log("textStatus     : " + textStatus);
            console.log("errorThrown    : " + errorThrown.message);
        },
        complete: function (xhr, status) { /**通信完了時の処理（エラーか否かに関わらず） */
            // ここにクルクルGIFを止める処理とか入れるといい感じ
        },
    });
})();

/**
 * Spring SecurityのCSRF対策によるトークンをajax通信のヘッダに埋め込める関数.
 * 利用するAjax通信の直前に呼び出す形で利用してください.
 */

function setCsrfTokenToAjaxHeader() {
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    $(document).ajaxSend(function (e, xhr, options) {
        xhr.setRequestHeader(header, token);
    });
}
```
Rails モデルの関連付け(アソシエーション)


## アソシエーション
テーブル間のリレーションシップをモデルの上の関係として操作できるようにする仕組み。
アソシエーションを利用すると複数のテーブルにまたがるデータ操作もより直感的に利用できる。

## 参照先テーブルと参照元テーブル
【例：Twitter】
1つユーザ(`usersテーブル`)に対して、複数のツイート(`tweetsテーブル`)が結びついているとする。

| users      | 			  | tweets       |
|:-----------|:-----------:|:-------------|
| **id**     |             | id           |
| name       |             | **user_id**(FK)  |
| email      |             | context      |
| password   |             | created_at   |
| created_at |             | updated_at   |
| updated_at |             |              |

### - 参照先テーブル(被参照テーブル)
関連において主キーを持つテーブル
`usersテーブル`に当たる

### - 参照元テーブル
外部キーを持つテーブル
`tweetsテーブル`に当たる

※ `主キー`:関係データベースにおける行(レコード)を一意に識別するための列(カラム)(usersテーブルのid)
※ `外部キー`:他のテーブルとの関連づけに使うキー(tweetsテーブルでusersテーブルに関連づけされたカラム。要はtweetsテーブルのuser_id)

<hr>

## belongs_to
参照元テーブルから参照先テーブルの情報にアクセスするアソシエーション
参照元テーブル → 参照先テーブル

```tweet.rb
class Tweet < ApplicationRecord
	belongs_to :user
end
```

`belongs_to`によって参照先(userモデル)から値を参照できる。

```
@tweet.user.name
```

## has_many
1:nの関連を表すアソシエーション
`belongs_to`では参照元テーブル → 参照先テーブルへのアクセス
`has_many`を利用することでようやく双方向の関係を定義可能に

```user.rb
class User < ApplicationRecord 
	has_many :tweets
end
```

このように`tweets`と **複数形** になっていることから1つのUserオブジェクトに対して複数のTweetオブジェクトが存在するという意味になる。

```
@user.tweets.each do |tweet|
	p tweet.context
end
```
<font color="red">tweetsメソッドの戻り値が配列であることに注意</font>

## has_one
1:1の関係

```user.rb
class User < ApplicationRecord 
	has_one :author
end
```

```author.rb
class Author < ApplicationRecord 
	belongs_to :user
end
```

```
@user.author.name
```


## has_many through
n:mの関係を表現するアソシエーション。

| items      | reviews		  | users       |
|:-----------|:----------- |:-------------|
| **id**     | id          | id           |
| name       | **item_id**(FK) | email  |
| price      | **user_id**(FK) | password      |
| description| context     | created_at   |
| created_at | created_at  | updated_at   |
| updated_at | updated_at  |              |


item:review = 1:n
item:user = n:m
user:review = 1:n

```item.rb
class Item < ApplicationRecord
	has_many :reviews
	has_many :users through: :reviews
end
```

```review.rb
class Review < ApplicationRecord
	belongs_to :item
	belongs_to :user
end
```

```user.rb
class User << ApplicationRecord
	has_many :reviews
	has_many :items through: :reviews
end
```

Item → Review → Userによる回りくどいアクセスをしなくても
`has_many thorough`を利用することでItemから直接Userモデルにアクセスすることができる。
SpringBootでPOSTリクエストを処理する

## RestTemplateを利用する
SpringでRestTemplateを利用した簡単なPOSTリクエストを飛ばしてみた。
シチュエーションとしてはあらかじめ指定されているパラメタを認証APIに渡し、認証が降りたら認証トークンなる物が返却されてくる。

```java:PostService.java
    private final RestOperations restOperations;

	public PostService(RestTemplateBuilder restTemplateBuilder) { // サービスクラスのコンストラクタで、RestTemplateBuilderをコンストラクタインジェクション
		this.restOperations = restTemplateBuilder.errorHandler(authenticationErrorHandler).build(); // エラーハンドリングつきRestTemplateを生成
	}

	public Token getToken()  { //認証トークンをJSONで返却してくれる認証APIを叩く
		String result = doPost("/token", new Parameter()); //認証API側に渡すパラメタを表すDTO（Parameterクラス）
		Token token = Jackson.fromJsonString(result, Token.class);
		return token;
	}

	/**
	 * POSTリクエストする.
	 * @param mapping URLを指定
	 * @param param 送信したいオブジェクト
	 * @return 返却されたJSON文字列
	 */
	private <T> String doPost(String url, T param) throws SampleException {
        
        //ここでPOSTリクエスト実行、第三引数で返却物をStringクラスで受け取ると指定
		ResponseEntity<String> result = restOperations.postForEntity(url, param, String.class); 

		HttpStatus responseHttpStatus = result.getStatusCode();

		if (responseHttpStatus.equals(HttpStatus.OK)) { // 200
			return result.getBody();

		} else if (responseHttpStatus.equals(HttpStatus.BAD_REQUEST)) { 
			// ステータスコード400の場合

		} else if (responseHttpStatus.equals(HttpStatus.UNAUTHORIZED)) { 
			// ステータスコード401の場合
		}
		
		throw new SampleException();

	}
```

```java:Stub.java
    @PostMapping("/token")
	public Token authentication(HttpServletRequest request) throws Exception {

		BufferedReader bufferReaderBody = new BufferedReader(request.getReader());
		String body = bufferReaderBody.readLine();

		/**
		 * 成功時の処理
		 */
		Parameter paramJson = Jackson.fromJsonString(body, Parameter.class);
		if ("一致してほしい条件".equals(paramJson.getApplicationkey()) ) { //認証処理（てきとう）
			return new Token(); //認証トークンを返却
		}
		throw new Exception(); //任意の例外を起こすなどする。
	}
```

## エラーハンドラ
参考記事：[TERASOLUNAさん](https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/ArchitectureInDetail/RestClient.html#restclienthowtouseerrorhandling)
エラーハンドリング、例外ハンドリング(デフォルトの動作)、ResponseEntityの返却（エラーハンドラの拡張）
のあたりを参考にして実装する。
ボードゲーム「カタン」のプログラム【Python3】

# [catan-spectator](https://github.com/rosshamish/catan-spectator)

- カタンのゲーム進行を記録するためのプログラム（CPUとの対戦機能なし）

`git clone https://github.com/rosshamish/catan-spectator`
`cd catan-spectator`
`pip3 install -r requirements.txt`
`python3 main.py`

# [catan 0.4.2](https://pypi.python.org/pypi/catan/0.4.2)

- Pythonにあるカタンのパッケージ

`pip3 install catan`

#[catan](https://github.com/damargulis/catan)

- カタンのゲーム（CPUとの対戦機能あり）
- pygameをインストールしておく必要あり
- UIはイマイチだが，コードをいじりやすく，カタンのゲームAIづくりにはこれが１番向いてそう

`python3 game.py`
【GAS】スクリプトエディタ上で実行するJavascriptの扱う桁数が8桁以上になるときは注意！

#問題点
　8桁以上の数値は変てこりんな結果になる

```js

function test() {
  var num1 = 9999999;
  var num2 = 10000000;
  Logger.log(num1);
  Logger.log(num2);
}
```
　結果

```
[18-02-25 07:45:29:530 PST] 9999999.0
[18-02-25 07:45:29:530 PST] 1.0E7
```

　9999999までは大丈夫ですが、10000000と8桁になった途端、「あれ？」っとなります。10000000のはずが「1.0E7」って？以前からJSは日付と数値は扱いにくいな−とは思っていましたが。

# 解決策

　いろいろ調べたのですがtoString(10)として10進数に変換すればOKでした。

```js
function test() {
  var num = 10000000;
  Logger.log(num.toString(10));
}
```
　結果

```js
[18-02-26 00:56:15:483 JST] 10000000
```

　今までスクリプトエディタ上のJS上で8桁以上の数字を計算する機会がなかったので気付きませんでした。たいていシート上や外部から結果を取得して簡単な処理しかやらせていなかったので。これはスクリプトエディタに問題があるのかもしれませんね。メモ帳などでJavascript書いてテストしたらtoString(10)しなくてもちゃんと期待した結果が出てきましたので。
TypeScriptのd.tsで、既存のモジュールにプロパティを追記する方法

nodejsでpostgresqlを使うpgモジュール、コンストラクタにプロパティが一つ足りてないので追加。
declare module～の所が重要。

```
import { Client } from "pg";
declare module "pg" {
    export interface ClientConfig {
        application_name?: string;
    }
}
export async function 接続済みDBを取得(config: any): Promise<Client> {
    const client = new Client({
        host: config.database.host,
        port: config.database.port,
        user: config.database.user,
        password: config.database.password,
        database: config.database.database,
        application_name: config.database.applicationName
    });
    await client.connect();
    return client;
}
```
cronを動かしてみよう

# はじめに
知識としては知っていたものの自分で設定したことはなかったので、やってみました。

# cronはどう動くのか
cronは毎分/etc/crontabファイルの中身を見て、そこに書かれたコマンドを実行すべきか判断して実行します。

# crontabはどうやって書くのか
crontab -eコマンドでエディタが起動しますので、書式に従って作成、保存します。

# 書式
分 時 日 月 曜日 コマンドの順で記述します。
迷った時はデフォルトの/etc/crontabもしくはcrontabのマニュアルを読みましょう。

# とりあえず動かしてみる

```text:cron
# crontab -e
* * * * * echo Hello penguins.
```

これで1分置きに"Hello penguins."と表示されるはずです。

……少し待っても反応がないためEnterを押してみたところ、以下のメッセージが出ました。

```
新しいメールが /var/spool/mail/root にあります
```

メールで"Hello penguins."が来てしまいました。
続きは来週調べてみます。
LaTeXで文書を書く時によく使う設定などの備忘録

# 注意

それぞれの意味が何であったのかをメモし忘れたので，後で書きます．
なお，TeXLiveの`uplatex`+`dvipdfmx`を普段は使用しています．

また，日本語フォントの埋め込みに関しては，色々と変わっている所があるようなので，現在のバージョンに適合しないかもしれません(未検証)．
ご注意下さい．
[ここ](https://texwiki.texjp.org/?TeX%20Live%2FMac#bcb0d462)と[ここ](https://texwiki.texjp.org/?%E3%83%92%E3%83%A9%E3%82%AE%E3%83%8E%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88#macos-hiragino-setup)を読むと良い気がします．

# TeXLiveにおける日本語フォント埋め込みのセットアップ

セットアップは1回やればよいので，この記事に書くべきか迷ったけれど，とりあえず書いておきます．

* macOS Sierra 10.12.6
* TeXLive 2018

日本語組版でヒラギノフォントなどを使用する場合は，その設定を行うパッケージが必要．
それらはメインストリームのリポジトリ(main)からTLContribというリポジトリに移動した模様．

[リポジトリの設定方法](https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2366)を参考にして，リポジトリを追加:

```shell
$ tlmgr repository add http://contrib.texlive.info/current tlcontrib
$ tlmgr pinning add tlcontrib '*'
$ sudo tlmgr update --self --all
```

次に[必要なパッケージ](https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2382)をインストール:

```shell
$ sudo tlmgr install japanese-otf-nonfree
$ sudo tlmgr install japanese-otf-uptex-nonfree
$ sudo tlmgr install ptex-fontmaps-macos
$ sudo tlmgr install cjk-gs-integrate-macos
```

その後は，[TeXWikiの解説](https://texwiki.texjp.org/?TeX%20Live%2FMac#l8c867e9)に従って，フォント関連の設定を実行:

```shell
$ sudo cjk-gs-integrate --link-texmf --cleanup
$ sudo cjk-gs-integrate-macos --link-texmf
$ sudo kanji-config-updmap-sys --jis2004 hiragino-elcapitan-pron
```

ここまで実行すれば，日本語のフォント(上の場合はヒラギノ)が埋め込まれるようになる．
フォントが埋め込まれているかどうかは，Adobe Readerなどで開いて「プロパティ」から，または`pdffonts`コマンドなどで確認できる．
最後のコマンドについては，自分の環境に合致したコマンドを実行すること．

# TeXファイル内で行うパッケージなどの設定

まずは，冒頭の部分，クラスファイルを指定する前に:

```latex
\RequirePackage[l2tabu, orthodox]{nag}
```

次はpreamble:

```LaTeX
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[full]{textcomp}
\usepackage[utf8]{inputenc}

\usepackage[all,warning]{onlyamsmath}
\usepackage{amsmath,amssymb,amsfonts}
\usepackage{type1cm}
\usepackage{amsthm}

%% ここからは好きなものを使う．同時に使えないものもある．

%\usepackage{newtxtext}\usepackage[varg]{newtxmath}
\usepackage{newpxtext}\usepackage[varg]{newpxmath}
\usepackage[zerostyle=c]{newtxtt}

% \usepackage{txfonts}
% \usepackage{euler}
```

# 参考文献

* [QA: japanese-otf & japanese-otf-uptex 2018-02-11](https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2366)
* [QA: cjk-gs-integrate & ptex-fontmaps 20180306.0](https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2382)
* [macOS High Sierra / macOS Sierra / OS X El Capitan に付属するヒラギノフォントのセットアップ # TeX Live/Mac - TeX Wiki](https://texwiki.texjp.org/?TeX%20Live%2FMac#l8c867e9)
* [使ってはいけない LaTeX のコマンド・パッケージ・作法 - Ichiro Maruta Homepage](https://ichiro-maruta.blogspot.jp/2013/03/latex.html)
Excelで便利な関数とかまとめ

##基本
###VLOOKUP関数
- 他のシートから検索条件に一致したデータを取り出す
- VLOOKUP(検索値, 範囲, 列番号, [検索方法])
 - 検索値・・・検索する値。行を一意に特定できるものが良い
 - 範囲・・・検索する範囲。検索値と取り出したいデータを含める必要がある。検索値で指定するデータを左端にする
 - 列番号・・・取り出したいデータが左から何番目かを指定する。マイナスの指定は不可
 - 検索方法・・・TRUEならあいまい検索、FALSEなら完全一致検索
- 複数条件を指定したい場合
 - 2つ以上のデータを結合した行を用意し、それを検索対象とすれば良い

###SUBSTITUTE関数
- 文字列を置換する
- SUBSTITUTE(文字列, 検索文字列, 置換文字列, [置換対象])
 - 文字列・・・置換対象のセル
 - 検索文字列・・・置換前の文字列
 - 置換文字列・・・置換後の文字列
 - 置換対象・・・置換対象文字列に検索文字列が含まれている場合に、何番目を置き換えるか指定する。省略した場合は全て置換

###MID関数
- 文字列を切り出す
- MID(文字列, 開始位置, 文字数)

###IF関数
- 条件分岐
- IF(論理式, 真の場合, 偽の場合)
 - 論理式・・・真偽の判定が可能な条件式（例：A1=B1）
 - 真の場合・・・真の場合に動かしたい関数や文字列を入れる。文字列は""で囲む
 - 偽の場合・・・偽の場合に(ry

###COUNTIF関数
- 条件に合うセルの数を数える
- COUNTIF(範囲, 検索条件)
 - 範囲・・・検索する範囲
 - 検索条件・・・カウントする条件。ワイルドカードの使用が可能（例：A1&"*"）

###COUNTIFS関数
- COUNTIFで条件を複数指定したい場合に使う
- COUNTIFS(範囲１, 検索条件１, 範囲２, 検索条件２, ...）

###INDIRECT関数
- INDIRECT(参照文字列, 参照形式)

###SUMIF関数
-条件を指定して合計を計算する
-SUMIF(範囲, 検索条件)
-#N/Aを含むデータの計算に使うと便利（例：SUMIF(A1:A10, "<>#N/A")

##小ネタ
###重複データを除いた数を数えたい
- SUMPRODUCT(1/COUNTIF(検索範囲, 検索範囲))

###IF関数でワイルドカードを使う
- IF(COUNTIF(範囲,検索条件)>0,真の場合,偽の場合)
 - この検索条件にはワイルドカードを含めることができる

###文字列連結とかで改行を入れたい
- CHAR(10)
Raspberry pi (Raspbian OS Stretch Lite 2017-11-29) でSPIが動かない

###まず結論

現時点(2018/02/25)では、Raspberry Pi ZeroにRaspbian OS Stretch Lite 2017-11-29を入れるとSPIインタフェースがうまく動きません。Jessie最終版(2017-07-05)で塗り直したところ、全く同じハードウェア構成で動きました。

私が試したのはZeroですが、Zero Wや初代RPiなど、bcm2835を使っているものは軒並み動かないのではないかと推測されます。
また、インストールしたOSはStretch Lite 2017-11-29ですが、apt-get update / apt-get upgradeはかけてます。

いやー、だいぶハマったよ。半日つぶれた。

なお、以下はあんまり参考にならない周辺情報です。

### 経緯
Raspberry Pi Zero (Wではない)でNeoPixel(ws281x)を使ってフルカラーなLチカをやろうと思って色々セットアップしていました。可変抵抗を3つつないでRGBをつまみで変更できるようにしたいと思っていて、ADコンバータとしてMCP3208を用意し、これをSPIインタフェース経由でラズパイにつなぐつもりで作業していました。

NeoPixelを光らせる方は本題ではないのでここでは特に触れませんが、まあ問題なくできました。

では次に、RGB値の変更の方だね、ということで、MCP3208をブレッドボード等々で繋いで、

```sh
$ sudo raspi-config
```
で、5.Interfacing OptionsからSPIを有効にしてリブート(raspi-configの代わりに/boot/config.txtを直接いじってもOKなはず)、
更に

```sh

$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python3 setup.py install
```

とやって(たぶんpython3でなくてもいけると思われる)、
では、ということで、例えば以下のようなコードを走らせてみると、

```python:analoginputtest.py
import time
import sys
import spidev

spi = spidev.SpiDev()
spi.open(0,0)

def readAdc(channel):
    adc = spi.xfer2([(0x07 if(channel & 0x04) else 0x06), (channel & 0x03) << 6, 0])
    data = ((adc[1] & 0x0f) << 8) | adc[2]
    return data

'''
def convertVolts(data):
    volts = (data * 3.3) / float(4095)
    volts = round(volts,4)
    return volts
'''

if __name__ == '__main__':
    try:
        while True:
            data = readAdc(0)
            print("adc  : {:8} ".format(data))
            volts = convertVolts(data)
            #print("volts: {:8.2f}".format(volts))

            time.sleep(0.01)
    except KeyboardInterrupt:
        spi.close()
        sys.exit(0)
```

```sh
$ sudo python3 analoginputtest.py
```
数値が正しく取れません。全く同じコードと同じ構成で、RPi2(Jessie使用)では動いたのに！
コマンド起動直後に0.5秒間くらいだけなんとなくそれっぽい数値が見えて、その後ずっと0になってしまうという謎挙動です。SPIインタフェースの初期化に失敗しているのではないか？と思われるような感じです。

### 原因
はっきり追いきれていません。

「raspi zero spi」とかで調べてみると幾つか事例っぽいものが出てくるのですが、ハンダ不良のケースだったり([ここ](https://www.raspberrypi.org/forums/viewtopic.php?t=196239))とか、初期化がうまくない？([これ](https://www.raspberrypi.org/forums/viewtopic.php?t=202978))とか、ちょっと違うのが出てきて、ドンピシャリのものを見つけ出せていません。

一番参考になったのは[これ https://github.com/raspberrypi/linux/issues/1547]
(https://github.com/raspberrypi/linux/issues/1547)で、ハードウェアの初期化まわりでアーキ毎の差異を吸収できてないっぽい、というのが推測されます。つい最近までコード直してるよ。

んでそんなら、過去に実績のあるバージョンで試してみるか、ってことでjessieに戻したら動いたというわけです。

それから、[この記事](https://qiita.com/clses/items/ecc23d0a1d7a762958ae)は、使えないっていう現象は同じなのですが、症状は違うようです。

ご参考まで。
DebianでEclipseを利用してnode.jsを実行させる方法

Debianに、Eclipseをインストールして、node.jsのコーディングとデバッグをしたい。

しかし、Debianに、node.js公式の方法を用いてnode.jsをインストールすると、node.jsを実行するときのコマンドが「node」でなく「nodejs」になったり、「npm」コマンドが認識しなかったりする。

一方、Eclipseでnode.jsを実行させる場合、npmコマンド、nodeコマンドを使うので、Debianで実行させようとすると、「コマンドが見つかりません」と言われて実行できない。

Debian　×　Eclipse　×　node.js　の方々は結構いると思うのだが、解決法が見つからず、この問題を解決するのに２日（睡眠・休憩も含む）もかかったのでここに書いておこうと思う。

---

nvmを使えは、Debian上で「node」コマンドや「npm」コマンドを実行できるし、好きなバージョンのnode.jsをインストールすることができる。

方法は、@FePlusさんの以下の記事を見てほしい。
https://qiita.com/FePlus/items/a01e6059b9942f1f86b2

気を付けるのは、公式手順では　.bashrc　の末尾に追加する以下のスクリプトを、/etc/profile　の末尾に追加する。

```sh:/etc/profile
export NVM_DIR="/home/hogeuser/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
nvm use 9.8.4 > /dev/null
```

１行目は、nvm.sh があるディレクトリを指定。（インストールしたユーザーのホームディレクトに作成されているはず。）
３行目の、use のあとの数字はダウンロードしたnode.jsのバージョンを指定。

なぜ/etc/profile　なのか？
@hirokishiraiさんの以下の記事を参考にした。
https://qiita.com/hirokishirai/items/5a529c8395c4b336bf31

.bashrc に追加すると、コマンドプロンプトが起動されるたび（？）にnvm.shが実行となるため、GUIのメニューから起動するEclipse起動時には、nvm.shが実行されず環境が作成されない。
/etc/profile　だと、システムが起動されたときに、nvm.shが実行され環境が作成されるからだと思う。
ユーザーがログインするたびに実行される、~/.bash_profileに上記３行を追加すれば事足りるのかもしれないが試していない。
Atcoder Beginer Contest 051 A問題 解説[Brainf*ck]

#問題
https://beta.atcoder.jp/contests/abc051/tasks/abc051_a
#考察
「1文字入力→出力」×5
「1文字入力→空白を出力」
「1文字入力→出力」×7
「1文字入力→空白を出力」
「1文字入力→出力」×5
でいけるのでは？
#コード
今回はワンライナー，嬉しい.

```
+++[->++++++++++<]>++>,.,.,.,.,.<.>,,.,.,.,.,.,.,.<.>,,.,.,.,.,.
```

#解説
pn(n≧0) は先頭からnポインタ目のポインタを，\*pnはその値を指す．

```
+++[->++++++++++<]>++
```
\*p0を3に→\*p0＝＝0まで\*p1を10回インクリメント→\*p1を2回インクリメント．
*p1をASCIIコード32番，空白にする．

```
>
```
p2に移動．

```
,.,.,.,.,.
```

\*p2に入力→出力を５回

```
<.>
```
p1に移動→\*p1，つまり空白を出力→p2 に移動．

#感想
入力数固定かつ文字列処理は簡単で素晴らしい．
undef_methodとremove_methodの違い

# undef_methodとremove_methodの違いは継承元のメソッドが代わりに呼ばれるかどうか

remove_methodは現在のクラスからメソッドを削除しますが、
継承元にメソッドが定義されてあれば継承元のメソッドが呼ばれます。

undef_methodはメソッド呼び出しへのレスポンスを止めます。
remove_methodと違い、継承元のクラスにメソッドが定義されていてもエラーとなります。

```ruby

class A
  def my_method
    p "This is A's my_method"
  end
end

class RemovedB < A
  def my_method
    p "This is B's my_method"
  end
  remove_method :my_method
end

class UndefedB < A
  def my_method
    p "This is B's my_method"
  end
  undef_method :my_method
end
```



```
RemovedB.new.my_method
=> "This is A's my_method"
```
remove_method では継承元Aのメソッドが呼ばれる。

```
RemovedB.new.my_method 
=> undefined method `my_method' for #<UndefedB:0x007fe382956088> (NoMethodError)
```

undef_methodではメソッドが呼ばれない。
バッチファイルでの日付取得（地域設定に依存しない）

# はじめに

バッチファイル内で日付を取得するには、%DATE% を使う方法が簡単ですが、この方法はPC（というかユーザー）の地域の設定によっては使えないケースがあります。
serverfault でロケールに関係なく日付を取得する方法がありましたのでまとめておきます。

# 地域設定に影響されない書き方
現在の日時をYYYYMMDDで取得しCUR_DATEに入れる例です。
<pre>
for /f %%a in ('wmic os get LocalDateTime ^| findstr \\.') DO set LDT=%%a
set CUR_DATE=%LDT:~0,8%
</pre>


# (参考)日本語OSでは有効な書き方
日本語を前提とすればこの書き方でシンプルです。
<pre>
set CUR_DATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
</pre>

# 説明

wmic os get LocalDateTime
でコンピュータの日時を取得することができます。
これはロケールに関係ない形式なので先頭から8文字を切り出すことで日付(YYYYMMDD)となります。
同様の方法で時刻も取り出すことができます。

# 実行例
実行例です。コマンドプロンプトで直接実行なので%%aではなく%aにしています。
<pre>
C:\Users\xxxx>for /f %a in ('wmic os get LocalDateTime ^| findstr \\.') DO set LDT=%a

C:\Users\xxxx>set LDT=20180226185910.173000+540

C:\Users\xxxx>set CUR_DATE=%LDT:~0,8%

C:\Users\xxxx>set cur
CUR_DATE=20180226

C:\Users\xxxx>

</pre>

# 参考

こちらを参考にさせてもらいました。
https://serverfault.com/questions/227345/locale-unaware-date-and-time-in-batch-files
ストアに出ているアプリのアップデートテストをしようとしたら、つまった…困った…！【解決済み】iOS、Android

ストアに出しているアプリをインストールした後に、
次回リリース予定のアプリでアップデート（上書き）しても
エラーが出ないかテストしようとしたら、

そもそも上書きできない…
なぜかインストールできない…
詰んだ…！
となった時の記録と、その時の解決方法。

# iOSの場合
### ＜状況＞

- まず、App Storeにある「リリース済みのアプリ」を実機にインストール。
- その後、Xcodeで制作中の「次回リリース予定のアプリ」をDeployGateにアップ。
 - Xcodeで、Product > Archive
 - Export > Ad Hoc で進め、作成したipaファイルをアップ。
- 実機でDeployGateの「インストール」ボタンをタップしたが、何度押しても反応がない。
　インストールされない。

### ＜解決方法＞

・「インストール」ボタンの左側にある「App Store版を上書き」をタップ。
　すると無事インストールできました。
　
### ＜感想＞

「App Store版を上書き」をタップしたら、
もしかしたら「次回リリース予定のアプリ」がApp Storeにアップされてしまうのでは…！
と一瞬怖くなりましたが、
全然そんなことはありませんでした。
「App Storeにあるアプリを上書き」じゃなく「App Store版のアプリを上書き」だったのね…
かんちがい。

# Androidの場合

### ＜状況＞

- まず、Playストアにある「リリース済みのアプリ」を実機にインストール。
- Android StudioでRunボタン（ツールバーの緑の三角）を使用して上書きを試みる。
- できない。エラー発生。

###### 【エラー内容】
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3131333933352f63323061313338632d333262652d613862362d323635362d6533353366656530613862642e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/113935/c6e9a7e0-ac65-ce3d-d749-681311fc233a.png)
Application Installation Failed
Installation failed with message
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES.
It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.
WARNING: UnInstalling will remove the application data!
Do you want to uninstall the existing application?

インストール済みのアプリと、上書きしようとしているアプリの証明書が違う事が原因らしい。
そのため、一旦アンインストールしてからアプリを入れ直せばエラーなくインストールできる。
しかし、それではストアに出ているアプリのアップデートテストにならない。

### ＜他の方法でインストールテストを試みる＞

- まず、Playストアにある「リリース済みのアプリ」を実機にインストール。
- デバック用のapkファイルを作成。
 - Android Studioの Build > Generate Signed APK
 - ModuleやKey storeを設定し、Build Typeを「debug」にしてapkファイルを作成
- DeployGateに作成したapkファイルをアップ。
- 実機でDeployGateの「インストール」ボタンをタップしようとしたが、できない。
 - 「署名が異なります」と表示される。
 - また、「異なる証明書で署名されたアプリ（バージョンXXX)が既にインストールされています。新しいアプリをインストールする前に、一度アンインストールしてください。」と表示される。

そのため、一旦アンインストールしてからアプリを入れ直せばエラーなくインストールできる。
しかし、それではストアに出ているアプリのアップデートテストにならない。

### ＜解決方法１＞
- まず、Playストアにある「リリース済みのアプリ」を実機にインストール。
- リリース用（またはデバック用）のapkファイルを作成。
 - Android Studioの Build > Generate Signed APK
 - ModuleやKey storeを設定し、Build Typeを「release」（または「debug」）にしてapkファイルを作成。
- （Macのため）ターミナルで、まず作成したapkファイルがある場所まで移動。実機をPCにつないだ状態で下記を実行。

```
adb install -r ○○○○○.apk
```

- できた！

### ＜解決方法２＞
- まず、Playストアにある「リリース済みのアプリ」を実機にインストール。
- リリース用のapkファイルを作成。
 - Android Studioの Build > Generate Signed APK
 - ModuleやKey storeを設定し、Build Typeを「release」にしてapkファイルを作成。
- DeployGateに作成したapkファイルをアップ。
- 実機でDeployGateの「インストール」ボタンをタップ。
- できた！

### ＜原因＞

デバック用のアプリと、リリース用のアプリでは、証明書の署名が違うらしい。

そのため、DeployGateにアップしたデータ（デバック用のアプリ）と
リリース済みのアプリでは署名が違ってしまうため、エラーとなっていたみたい。
そんなわけで、DeployGateに「リリース用のアプリ」をアップすれば、うまくいきました。

また、ターミナルでインストールする時も、 -r を付け忘れるとエラーになりました。
これは既に同じ署名のapkファイルがインストールされている場合はエラーになることが原因らしいです。
 -r をつけると上書きできるようになるみたいです。

### ＜感想＞

署名のエラーだったので、
証明書やキーチェーン関係を触らないといけないと思ったのですが、
触らずに済んで安心しました…。
CentOS7の日本語入力(かな切替)

日本語入力で詰まったのでメモ。

## 作業環境
VMwareでCentOS入れたて

## 状態
Windowsキー+Spaceキーを押してもかな入力ができない。たすけてー

## 対処
- 1. 右上の<b>「アプリケーション」</b>→<b>「システムツール」</b>→<b>「ソフトウェア」</b>を選択
- 2.<b>「ibus - kkc（Japanese Kana Kanji input method for ibus）」</b>がダウンロードされていることを確認
(入っていなければダウンロード&再起動)

- 3.<b>「アプリケーション」</b>→<b>「システムツール」</b>→<b>「設定」</b>→<b>「地域と言語」</b>を選択
- 4.<b>「＋」ボタン</b>→追加画面起動
- 5.<b>「日本語」</b>を選択→<b>「日本語（Kana Kanji）」</b>を選択

終了

## 結果
上記の手順を経たところ、Windowsキー+Spaceキーでかな入力に切り替わった。
MySQLのクエリキャッシュについてまとめた。

Webサービスのパフォーマンス改善の一環として、
理解が適当だったクエリキャッシュについて改めて調べたので、メモ

## クエリキャッシュとは
SQL実行結果をクライアントに返すと同時に内容をキャッシュしておき、
同一のSQLが送信された時にキャッシュされた内容をそのまま返し、
SQL実行を避ける事で応答速度の向上が可能。

## 対象DB
MySQL 5.6

## 特徴
- アプリ実装なしにDB設定のみで透過的にキャッシュの恩恵を受けられる。
- ロックはクエリキャッシュ全体で一つのみ利用可能。
- 明示的にクエリキャッシュを利用したい場合はSQLに「SQL_CACHE」を追加する。
    - システム設定 query_cache_type を「ON」もしくは「DEMAND」にすること

## クエリキャッシュを利用する上での注意点
- クエリキャッシュのチェック、格納、無効化にコストがかかるため、キャッシュヒットが低いと逆に遅くなる可能性がある。
- クエリキャッシュをSQLを大文字小文字、スペースの数、コメントのサイズを完全に一致させること。
- クエリキャッシュのサイズは大きくしすぎないようにする。
    - サイズの大きさに比例して、キャッシュの無効化のコストが増大するため。
        - クエリキャッシュのロックは全体で一つのみなので、そのキャッシュにアクセスするすべてのクエリをロックされ、システムがストールする可能性があり。
    - 数十メガバイトを超えない程度の小さなクエリキャッシュをちょうど良い。
- 以下のクエリはそもそもキャッシュされない。
    - ユーザー定義関数、ストアドファンクション、ユーザー変数、一時テーブル、mysqlデータベース内のテーブル、または列レベルの特権を持つテーブルを参照するクエリ
    - NOW() 、CURRENT_DATE()などの非決定的なクエリ

## クエリキャッシュを利用するかの判断ポイント
- 他に利用できるキャッシュストアが存在しない場合はお手頃にキャッシュの効果を受けられる可能性がある。
- 参照に比べて、更新頻度が高いサービスではクエリキャッシュは有効にならないケースが多いため、無効にしたほうが良い。
- キャッシュヒット率が高く、更新の頻度が少ないシステムには特に有効。
    - 参照系の処理が大多数のECサイトやSNSには相性が良いかも。
- 負荷が高いシステムであれば、memcash、Redisを検討してみるのも手。

## 参考URL
- [MySQL クエリーキャッシュ](https://dev.mysql.com/doc/refman/5.6/ja/query-cache.html)
- 実践ハイパフォーマンスMySQL第3番 第7章12節

## 最後に...
ここまで調べて最後にとても重要な事実を見つけてしまった...

https://dev.mysql.com/doc/refman/5.7/en/query-cache.html

>The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0.
（クエリキャッシュは5.7.20で非推奨に、8.0で削除されます。）

( ﾟдﾟ)ﾎﾟｶｰﾝ
ローカルのEd25519鍵をGitKrakenで使う

最強とか言うフレーズに弱いので、すぐに使ってしまう。
[SSH認証に最強の「Ed25519鍵」を使おう](https://linuxfan.info/ssh-ed25519)

## Ed25519とは？
楕円曲線暗号の一種
RSAに比べて短い鍵で同等の強度を持つことができる。

>High security level.
This system has a 2^128 security target; breaking it has similar difficulty to breaking NIST P-256, RSA with ~3000-bit keys, strong 128-bit block ciphers, etc.
The best attacks known actually cost more than 2^140 bit operations on average, and degrade quadratically in success probability as the number of bit operations drops.
<cite>[Ed25519: high-speed high-security signatures](https://ed25519.cr.yp.to/)</cite>

## Ed25519鍵の生成
* 環境
	* Mac Sierra v10.12.6
	* OpenSSH v7.4
	* GitKraken v3.3.4

```console
$ ssh-keygen -t ed25519
```

ファイル名はデフォルトだと

* 秘密鍵`id_ed25519`
* 公開鍵`id_ed25519.pub`

このままだとEd25519鍵使ってくれないのでssh-agentに登録する。  
ここで登録するのは**秘密鍵**  

```console
$ ssh-add ~/.ssh/id_ed25519
```

このままでは、GitHubとの接続に今まで使っていたRSA2048とか使ってしまうので、

```console:~/.ssh/config
Host github.com
    HostName github.com
    IdentityFile ~/.ssh/id_ed25519
    User git
```

と書いて、Ed25519鍵使うように設定しておく。


公開鍵の方は、GitHubとかGitLabとかSSH接続先に置く。

## GitKrakenの設定
* preferences
	* Authentication
		* General
			* Use local SSH agent 	←これにチェック

<img width="1139" alt="スクリーンショット 2018-02-25 23.47.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/99090/05623cb6-0772-6d18-dccc-3d46790a9a39.png">

これだけでおｋ    
これでGitHubやGitLabでもローカルのEd25519鍵使ってくれる。[^1]

**:exclamation:注意:exclamation:**
GitKraken -> Authentication内のGitHubの`Add existng SSH key`に公開鍵/秘密鍵を**設定してはならない**

[^1]: 接続先に公開鍵置いたり、`ssh/config`に設定追加しておく必要はある。
[^2]:
Node.jsアプリケーションをHerokuにデプロイ

# 事前準備
1. node.jsをインストール
 https://nodejs.org/ja/

1. gitをインストール
 https://git-scm.com/downloads

1. herokuに登録
 https://id.heroku.com/login

1. Heroku Toolbeltをインストール
 https://devcenter.heroku.com/articles/heroku-cli

# アプリ
```:ディレクトリ構成
[app-dirctory]
   │
   ├─app.js
   │
   └─Procfile
```

```js:app.js
var http = require('http'); //httpモジュール呼び出し
var server = http.createServer(function (request, response) {
    // リクエストを受けると以下のレスポンスを送信する
    response.writeHead(200, {'Content-Type': 'text/plain'}); //レスポンスヘッダーに書き込み
    response.write('Hello World\n'); // レスポンスボディに「Hello World」を書き込み
    response.end(); // レスポンス送信を完了する
});
server.listen(process.env.PORT || 8080);  //8080番ポートで待ち受け
```

```:Procfile
web: node app.js
```

サーバーの待受ポートはheroku上で勝手に決められるためこういった設定にしないといけない
ローカル実行した場合には8080ポートが使用される
```server.listen(process.env.PORT || 8080);```


# コマンドライン操作
1. package.json作成<br>```npm init```
1. gitリポジトリを作成<br>```git init```
1. gitリポジトリにアプリ追加<br>```git add --a```
1. gitリポジトリにコミット<br>```git commit -m "commit"```
1. herokuアプリ追加<br>```heroku create```<br>または<br>
 ```heroku create アプリケーションネーム```
1. herokuにプッシュ<br>```git push heroku master```
1. アプリを開く<br>```heroku open```

---
Hello Worldが出れば成功！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/b3969e8b-9ff8-7b35-5190-985fc015239a.png)
RubyのArray#bsearchの速さを調べてみた

# RubyのArray#include?, Array#bsearch, Set#include? ベンチマーク
Arrayクラスにbsearch(Binary Search: 二分探索)なるものがあるということでその速さを検証してみました

## 二分探索
二分探索ってなんだ？って人はこちらを参照してください
https://www.codereading.com/algo_and_ds/algo/binary_search.html
要約すると配列の真ん中からだんだん範囲を絞って行くということです
そのため事前にソートしておく必要があります
大学の授業で、C言語で二分探索実装したのを思い出しました(懐かしい

## Ruby version 2018年2月25日現在
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin17]

## ソースコード
https://github.com/shan-shan95/array_sort/blob/master/array_sort.rb

## 実行結果

TestArray size: 1000000

|method|execution time|
|:-------------|:-------------|
|Array#include?|0.30897300s|
|Array#bsearch|0.00052300s|
|Set#include?|0.00031000s|
|SetInIt time|29.90226800s|

## 考察
各メソッドの実行時間のみを見ると`Set#include?`が一番早いが、`Array#to_set`に時間がかかるため、`bsearch`の方が実用的だと考えられます

参考サイトの3年以上前のものと比べると、`Array#include?`と`Array#to_set`が高速化されているのがわかります↓↓↓

## 参考サイト
http://pocke.hatenablog.com/entry/2014/11/27/224651
Arduinoでwifi接続

■目的
・Arduinをwifi送受信させたい

■実施内容
①以下の参照URLを利用して回路を組み、PGを書き込む
②シリアルモニタにHElloWorldが出てこなくて困ったが、http://deviceplus.jp/hobby/entry0033/によれば、readyが来れば帰ってこなくてもOKだそうなので、つづけた。また文字化け文字すら出てこないのは、接触不良。ESPのピンを金属部分触れさせる(斜めにするなどをすれば動く)
③PHPはまだ。






<参照URL>
・【Arduino】ESP-WROOM-02( ESP8266 )を使ってWifiで無線通信する
http://nn-hokuson.hatenablog.com/entry/2017/04/09/091148

・Arduinoと数百円のWi-Fiモジュールで爆安IoTをはじめよう
https://ics.media/entry/10457/3

・爆速にIoTできるESP32を試してみました：IoTLT vol.25
https://techplay.jp/slide/164108

<用語調べる>
・シリアル通信（http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/arduino_use2.htm）
・RXDやTXDなど
・ブレッドボードの仕組み(http://jsdiy.web.fc2.com/avr_7segclockbb/)
・ボーレート
SASSを５分で理解&導入する【for Mac】

## 対象
* HTML/CSSをそれなりに理解して書けるようになった人。
* それなりの規模のWebサービスのCSSを書いた経験がある人。

## SASS（サス）とは？
SASSとは「***S***yntactically ***A***wesome ***S***tyle ***s***heets（文法的にイケてるスタイルシート）」の略で、CSSをより効率的・構造的に書けるように生まれたものです。（変数や関数を活用しながら、CSSが書けます。）

SASSをコンパイルすることで、CSSが生成され、そのCSSがHTMLから読み込まれます。

## SASSをインストールしよう
SASSをインストールするためには、Rubyがインストールされてることが前提ですが、Macではデフォルトでインストールされているため、SASSをインストールするところから始めます。

```unix
sudo gem install sass
```
これだけ。

## SASSを書いてみよう
SASSには二つの記法があります。

***SASS記法***
SASS記法はインデントで、要素名・クラス名を構造化します。
`div`の中の`p`タグは`padding: 0 0 0 10px`、さらにその`p`タグの中の`span`タグは`font-size: 2em`という書き方。

```sass
div
  background-color: lightgray
  margin: 0 auto
  p
    padding: 0 0 0 10px
    span
      font-size: 2em
```
***SCSS記法***
SASS記法に対して、SCSS記法は中括弧によって、要素/クラスのスコープを定義します。

```scss
div{
  background-color: lightgray;
  margin: 0 auto;
  p{
    padding:  0 0 0 10px;
    span{
      font-size: 2em;
    }
  }
}
```
上記をSASSコマンドでコンパイルすると以下のようになります。

```css
div {
  background-color: lightgray;
  margin: 0 auto;
}
div p {
  padding:  0 0 0 10px;
}
div p span {
  font-size: 2em;
}
```
普通にCSSを書くと、`div`とか`p`とか何度も書くのが手間ですよね。
SASS、SCSSでは構造的に書けるので、同じ要素名、クラス名を書く必要が無くなります。

## コンパイルしてCSSを生成しよう
基本形はこんな感じ

```
sass [INPUT]:[OUTPUT]
```
実際には、

```
sass style.sass:style.css
```
style.sassをコンパイルして、style.cssを生成します。
また、`[INPUT]`の前にオプションをつけることができ、そのオプションによって、生成されるCSSのフォーマットが変わってきます。詳しくは[こちら](https://web-design-weekly.com/2014/06/15/different-sass-output-styles/)から。

.sass/.scssを修正するたびに、いちいちSASSコマンドでコンパイルするのがめんどくさい人たちは、

```
sass --watch style.sass:style.css
```
としておけば、修正して保存するとそれを検知してくれて、自動でコンパイルしてくれます。

よいSASSライフを。
先頭に固定表示をトップページ以外で利用する

```php
<div class="subLoop">
	<ul class="list vertical">
		<?php
		$list_count = 5; // 取得したい件数を指定する
		// まずは先頭固定記事のみを取得する
		$q_parm = array(
			'category_name'  => 'news',
			'post_type'      => 'post',
			'posts_per_page' => $list_count,
			'post__in'       => get_option( 'sticky_posts' )
		);
		// global変数wp_queryを上書きする(必要がある場合はべつ変数に待避しておく)
		$the_query = new WP_Query( $q_parm );
		?>
		<?php
		while ( $wp_query->have_posts() ):
			$wp_query->the_post();
		?>
		<li class="pickUp">
			<div class="thumbnail">
				<a href="<?php the_permalink(); ?>">
					<?php the_post_thumbnail('200_thumbnail'); ?>
				</a>
			</div>
			<div class="textBody">
				<span class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></span>
				<span class="upDate">
					<?php the_time(Y年n月j日); ?>
				</span>
				<span class="description">
					<?php the_excerpt(); ?>
				</span>
			</div>
		</li>
		<?php endwhile; ?>
		<?php
		// 続いて先頭固定記事以外を取得する
		$q_parm = array(
			'category_name'  => 'news',
			'post_type'      => 'post',
			'posts_per_page' => $list_count,
			'post__not_in'   => get_option( 'sticky_posts' )
		);
		// global変数wp_queryを上書きする(必要がある場合はべつ変数に待避しておく)
		$wp_query = new WP_Query( $q_parm );
		?>
		<?php
		while ( $wp_query->have_posts() ):
			$wp_query->the_post();
		?>
		<li>
			<div class="thumbnail">
				<a href="<?php the_permalink(); ?>">
					<?php the_post_thumbnail('200_thumbnail'); ?>
				</a>
			</div>
			<div class="textBody">
				<span class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></span>
				<span class="upDate">
					<?php the_time(Y年n月j日); ?>
				</span>
				<span class="description">
					<?php the_excerpt(); ?>
				</span>
			</div>
		</li>
		<?php endwhile; wp_reset_postdata(); ?>
	</ul>
</div>
```

参考
<a href="https://o-84.com/article/sticky-posts/">サイドバーなどの記事一覧で先頭固定を有効にする</a>
GitHub のアカウントを個人用と会社用で同じものを使うときはユーザ名とメールアドレスの設定に注意

# はじめに

GitHub のアカウントを個人用と会社用で同じものを使っている場合、コミット履歴に残るユーザ名やメールアドレスに注意しましょう。不必要に社内用メールアドレスを公開してしまうリスクがあります。

この記事では、このような場合にユーザ名やメールアドレスをどのような設定にしておくべきかを説明します。

# 背景

会社で GitHub を使っていて、プライベートでも何かリポジトリを作って遊んでみようと同じアカウントで使っていたとき、うっかり Public なリポジトリのコミット履歴に社内で使用しているメールアドレスが残ってしまい、履歴を書き換える羽目になってしまいました。

コミット履歴は各リポジトリのディレクトリで `git log --pretty=fuller` で確認できます。

# 対策

- 個人用と会社用とで GitHub のアカウントを使い分ける。
- Git の Author をリポジトリごとに設定する。

前者はいちいちアカウントを切り替える手間があったり Contribution が分散してしまったりして個人的にイマイチだなと思ったので、今回は後者の方法を紹介します。

## リポジトリごとに Author を設定する

まず、Git でグローバルな設定にある Author を使わないようにしましょう。

```shell-session
$ git config --global --unset user.name
$ git config --global --unset user.email
```

続いて、各リポジトリで Author を設定するようにします。なお、`--local` は省略可能です（Git version 2.7.4 で確認）。

```shell-session
$ git config --local user.name "Your name"
$ git config --local user.email "your-name@example.com"
```

なお、プライペートでは自分のメールアドレスを公開したくないという場合があると思います。その場合は、次で説明する GitHub の設定で、プライペート用のメールアドレスをここで設定しましょう。

## GitHub の設定でメールアドレスの設定を変更する

コマンドラインから Git を使う場合はこれだけで問題ありませんが、GitHub 上で直接ファイルを編集してコミットしたりするような場合は、コミット履歴には GitHub の設定が利用されます。

そこで、GitHub のアカウントの設定も見ておきましょう。

まず、[Setting > Profile](https://github.com/settings/profile) ページで Name を設定します。ここで入力した内容が、コミットの Author になります。空欄にすると Username（`@` から始まるアカウント名）になります。

続いて、[Settings > Emails](https://github.com/settings/emails) で Primary email address を選択します。GitHub 上でのコミットの Author のメールアドレスは、ここで選択したメールアドレスになります。

なお、ここでメールアドレスを公開したくないという場合は、少し下にある設定項目 Keep my email address private にチェックを入れます。チェックを入れると、GitHub 上でのコミットの Author のメールアドレスは、この設定項目の説明文に表示されている `<ID>+<your-username>@users.noreply.github.com` のようなものになります。

前述の Git の設定でもこのメールアドレスは利用可能です。

# 私の場合

- 個人用（プライベート）では…
    - Author は各リポジトリごとに設定
    - ユーザ名は GitHub の Name、メールアドレスは `@users.noreply.github.com` のものを設定
- 会社用では…
    - Author は `--global` で設定（社用端末）
    - ユーザ名は GitHub の Username、メールアドレスは社内用のものを設定

# 参考

- GitHub Help
    - [About commit email addresses - User Documentation](https://help.github.com/articles/about-commit-email-addresses/)
    - [Setting your commit email address in Git - User Documentation](https://help.github.com/articles/setting-your-commit-email-address-in-git/)
ゲートウェイとは？について初心者がまとめる

dockerを勉強していてゲートウェイがわからなかったのでまとめる。

 ## ゲートウェイとは？

企画の違うネットワークを中継する機械です。


ネットワーク間での通信は、特定の決まりごと（プロトコル）によって行われています。

異なるプロトコルのネットワーク同士ではもちろん通信を行うことはできません。日本語しか喋れない人と、英語しか喋れない人が意思疎通できないのと同じ。

ゲートウェイとはそんな時に通訳として働く機械のことです。

## 実際にはどんな処理が行われているのか？

これが気になったんですが、調べてもわからないから、わかったら書くことにする。
WebDriverでアクセスしたWebサイトのソースコードを取り出したい

WebDriverでアクセスしたWebサイトのソースコード(html)を取り出したいという場合は、`webdriver`の`page_source`属性を利用すればよいようです。以下はWebDriverでアクセスしたサイトのソースコードをBeautifulSoupに食わせるサンプルコードになります。

```python
from selenium import webdriver
from bs4 import BeautifulSoup


if __name__ == '__main__': 
    driver = webdriver.Firefox()
    driver.get('https://helloworld.jp/hello/world')
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    for div in soup.find_all('div'):
        do_someting(div)
    driver.quit()
```

参考: http://selenium-python.readthedocs.io/api.html
CodeIQ「進捗ジエンドマーク」に参加しました。

[CodeIQ「進捗ジエンドマーク」](https://codeiq.jp/q/3539)の公開期限が終了したということで、自分の解答をさらしてみたいと思います(´・ω・｀) なおCodeIQはそのサービスの性質上、解答の公開は原則禁止ですが、本問については[出題者の@tbpgrさんの許可](https://twitter.com/tbpgr/status/967443014950961152)のもと、解答を公開しています。

さて「進捗ジエンドマーク」はおおよそ以下のような問題でした。

- 標準入力から1から100までの整数が与えられる。これをnとする。
- nが偶数の場合はinvalidを標準出力に出力する。
- nが奇数の場合は「進捗ジエンドマーク」を出力する。
    - n×nの正方形に半角小文字のjでJを描く。
        - 右辺と下辺はすべてjで埋める。
        - 左辺は下半分をすべてjで埋める。
        - 残りはすべて.で埋める。
    - 具体例は以下の`test`メソッドを参照。

解答コードは以下の通り。言語はPython3で一発合格でした(｀・ω・´)ｼｬｷｰﾝ 実際のビジネスロジック(?)よりもテスト用のコードのほうが長くなってしまったのは内緒。よいこのみんなはきちんと[unittest](https://docs.python.jp/3/library/unittest.html)を使いましょう…。

```python
def draw(n):
    if n % 2 == 0:
        return 'invalid'

    matrix = [['.' for _ in range(n)] for _ in range(n)]
    for i in range(n):
        matrix[n - 1][i] = matrix[i][n - 1] = 'j'
    for i in range(n // 2 + 1, n):
        matrix[i][0] = 'j'

    return '\n'.join(''.join(row) for row in matrix)

def test():
    expects = {
        1 : 'j',
        2 : 'invalid',
        3 : """
          ..j
          ..j
          jjj
        """,
        5 : """
          ....j
          ....j
          ....j
          j...j
          jjjjj
        """
    }
    for n in expects:
        expected = expects[n].replace(' ', '').strip()
        actual = draw(n)
        assert expected == actual, 'expected: {0}, actual: {1}'.format(expected, actual)


if __name__ == '__main__':
    n = int(input())
    print(draw(n))

    # test()
```

参考:

- https://codeiq.jp/q/3539
- https://togetter.com/li/1193329
- http://tbpgr.hatenablog.com/entry/2018/02/25/215356
macOS:VisualStudioCodeのPythonインタプリタを設定する

MacでVisualStudioCode(以下VSCode)を使ってPythonを書こうとしたところ以下の警告メッセージが表示された。

> Selected interpreter is macOS system Python which is not recommended. Please select different interpreter

macOSデフォルトのPythonインタプリタはVSCodeでは非推奨との事らしいので設定を変更する。

## 環境
- macOS HighSierra 10.13.3
- VisualStudioCode 1.20.1

## Python enviroments
なぜVScodeでPythonの実行環境を指定する必要があるかといえば、リンターなどのExtensionやVScodeのターミナルでの実行が設定した環境に依存するという事のようだ。

## 設定の変更
具体的な理由はわからないが非推奨だし警告メッセージも煩いわしいので設定を変更する。

F1を押して検索から「Python: Select Interpreter」と入力すると選択可能なPythonの実行環境リストが表示されるのでpyenvでインストールしてあったものを選択。環境によって選択出来る項目は変わるはずなので場合によってはVSCodeが推奨とするインタプリタを新たにインストールする必要があるかもしれない。

選択するとワークスペース内に.vscodeファイルが作成され選択が反映されているのが確認できる。

```json:.vscode
{
  "python.pythonPath": "/Users/ユーザー名/.pyenv/versions/3.6.4/bin/python"
}
```

## ユーザー設定
設定する項目がわかったのでユーザー設定にも設定を追加しワークスペース毎に設定する手間を省く。

Code > 基本設定 > 設定

```json:ユーザー設定
{
  ...,
  "python.pythonPath": "/Users/ユーザー名/.pyenv/versions/3.6.4/bin/python"
}
```

これで新たにPythonのファイルを開いても警告メッセージが表示されなくなった。

### 参照
https://code.visualstudio.com/docs/python/environments
EqualsVerifierを使ったらequals()のテストが一瞬で終わった


# はじめに

Javaでクラスの同値性をチェックする場合、`equals()` および `hashCode()` を適切に実装する必要があります[^1]。通常は自前で実装しないのでまず間違いはないと思いますが、テストをしないのは不安です。

効率のいい方法がないかと探していたところ、[EqualsVerifier][]というライブラリを見つけました。

# インストール

[Getting Started](http://jqno.nl/equalsverifier/manual/getting-started/)にMavenでの設定方法が書かれています。他のツールの場合はMvnRepositoryを参照してください。

- [Maven Repository: nl.jqno.equalsverifier » equalsverifier](http://mvnrepository.com/artifact/nl.jqno.equalsverifier/equalsverifier)

# 使い方

例えば以下のようなNameクラスがあります。この `equals() ` と `hashCode()` はIntelliJ IDEAで自動生成したものです。

```java
import java.util.Objects;

public final class Name {
    private final String name;

    public Name of(String name) {
        return new Name(name);
    }

    public Name(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Name name1 = (Name) o;
        return Objects.equals(name, name1.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}
```

これに対するテストは次の通りです(JUnit 4.12を使用)。

```java
import nl.jqno.equalsverifier.EqualsVerifier;
import org.junit.Test;

import java.sql.Timestamp;

public final class EqualsVerifierTest {
    @Test
    public void test_name() {
        EqualsVerifier.forClass(Name.class).verify();
    }
}
```

これだけです。簡単ですね。

もちろんこれでは本当にテストしたか分からないので、例えば、`equals()`の一般契約に従っていない、[Timestamp][]クラスでテストします。

```java
EqualsVerifier.forClass(Timestamp.class).verify();
```

以下のようなエラーが出ました。

> java.lang.AssertionError: Overloaded: More than one equals method found.
> Signature should be: public boolean equals(Object obj)
> For more information, go to: http://www.jqno.nl/equalsverifier/errormessages

# 特定のフィールドを除外したい場合

[Ignoring fields](http://jqno.nl/equalsverifier/manual/ignoring-fields/)にありますが、例えば、以下のようにして除外できます。詳細はドキュメントを参照してください。

- `withIgnoredFields` メソッドに、無視するフィールド名を渡す
- Javaのキーワード `transient` を使う

自分としては transient を使うのがいいかなぁと思います。

# 動作原理

[Why, what, how?](http://jqno.nl/equalsverifier/manual/why-what-how/)の下の方に書かれていますが、だいたい以下の通りです。ちょっと黒魔術ですね。

1. モッキングフレームワークと同じように、コンストラクタを呼ばずにインスタンスを生成する。
2. リフレクションを使ってフィールドに値を設定する。
3. これらに対して `equals()` と `hashCode()` が期待される結果になるか確認する。
4. `equals()` メソッドのシグネチャを調べ、オーバーロードでなくオーバーライドを使用していることを確認する。

# おわりに

楽をしたい気持ちは大切だと思いました( ´ω`)

[EqualsVerifier]: http://jqno.nl/equalsverifier/
[Timestamp]: https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Timestamp.html

[^1]: Effective Java 第2版 「項目8 equalsをオーバーライドする時は一般契約に従う」および「項目9 equlsをオーバーライドする時は、常にhashCodeをオーバーライドする」を参照。
サブネットについてわかったことを初心者がまとめる

dockerを勉強しているときにサブネットという単語がわからなかったので、まとめます。

## サブネットとは？

ネットワークの規模が大きくなった時に、小さいグループとしてネットワークを管理する。そのネットワークのこと。

もともと、IPアドレスは

IPアドレス　= ネットワーク部（どのネットワーク） + ホスト部(どのコンピュータ)

の構成になっているが、サブネットを使うことによって、

ホスト部 = どのネットワーク　+ どのネットワーク

に分けることができます。

## サブネット化のメリット

http://www.runsurunet.com/2017/01/20/%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E5%8C%96%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/

このサイトを読むとわかりやすいですが、

- アクセスが早くなる
- セキュリティが向上する

## IPアドレスのどの部分が「どのネットワーク」かを示していて、どの部分が「どのコンピューター」かを示しているの？

これを書いているのがサブネットマスクと呼ばれるものになります。

例えばサブネットマスク「255.255.255.0」があったとします。これを2進数に変換すると「11111111.11111111.11111111.00000000」となります。

- 1が並んでいる部分がネットワーク
- 0が並んでいる部分がどのコンピューターか？

に関する情報を表しています。

例えば、「192.168.0.2」というIPアドレスがあったとします。これを2進数に変換すると「11000000.10101000.00000000.00000010」となります。

このIPアドレスとサブネットマスクを並べて書くと

11000000.10101000.00000000.00000010
11111111.11111111.11111111.00000000

となっています。これでいうと「11000000.10101000.00000000.」までがネットワークに関する情報で、「00000010」がそのネットワークのどのコンピュータか？に関する情報ということ。


## 参考文献

http://wa3.i-3-i.info/word11973.html
Domo のデータセットを削除する (go)

こちらのプログラムを go で書きました。
[Python で Domo のデータセットを削除する](https://qiita.com/ekzemplaro/items/371bef175b6e85c6349a)

```go:delete_dataset.go
// ----------------------------------------------------------------
/*
	delete_dataset.go

					Feb/25/2018
*/
// ----------------------------------------------------------------
package main
import (
	"fmt"
	"os"
	"log"
	"io/ioutil"
	"net/http"
)

// ----------------------------------------------------------------
func delete_dataset_proc (access_token string,dataset_id string) {
	fmt.Fprintf (os.Stderr,"*** delete_dataset_proc ***\n")
	fmt.Fprintf (os.Stderr,dataset_id)

	url_datasets :="https://api.domo.com/v1/datasets/" + dataset_id

	req, _ := http.NewRequest("DELETE", url_datasets, nil)
	req.Header.Set("Authorization", "Bearer " +  access_token)

	client := new(http.Client)
	resp, err := client.Do(req)

	if err != nil {
		log.Fatalln(err)
		fmt.Printf("%s", err)
		os.Exit(1) 
	} else {
		defer resp.Body.Close()
		contents, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Printf("%s", err)
			os.Exit(1)
		}

	json_str_out := string(contents)
	fmt.Printf("%s\n", json_str_out)
	}
}

// ----------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")
	dataset_id := os.Args[1]
	fmt.Printf ("%s\n",dataset_id)

	access_token := get_token_proc ()

	fmt.Fprintf(os.Stderr,"%s\n", access_token)

	delete_dataset_proc (access_token,dataset_id)

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ----------------------------------------------------------------
```

get_token.go はこちらです。
[Domo の アクセストークンを取得する (go)](https://qiita.com/ekzemplaro/items/675804b80933317e5ccf)

```text:Makefile
delete_dataset: delete_dataset.go get_token.go
	go build delete_dataset.go get_token.go
clean:
	rm -f delete_dataset
```
「透過的」＝「存在を意識しなくても使える」

# はじめに
フレームワークやツールの説明などで、「透過的なインタフェース」とか「透過性」とかいう言葉を見かける。
ふわっとして分かりづらい言葉だと思ったので自分なりに理解した内容をメモしてみる。
ちなみに「参照透過性」とは別物。

# 透過的/透過性 とは
「存在を意識しなくても使える」ということ。

# イメージ - 不便な郵便屋さん

透過的ではないインタフェースを考えてみよう。
郵便物を投函するためのポストが青・黄・赤の３種類あり、
用途によって使い分ける必要があるとする。

* 送り元と先で郵便番号が同じ場合は、徒歩で配達するので 青いポスト に投函してください。
* 同じ都道府県内の場合は、バイクで配達するので 黄色いポスト に投函してください。
* 県外の場合は、トラックで配達するので 赤いポスト に投函してください。

利用者は、宛先に郵便物を送りたいという目的は共通しているにも関わらず、
物理的な輸送方法を意識して投函するポストを選択する必要がある。
つまり、この郵便サービスは透過的なインタフェースを提供していない。

実際の郵便屋さんは、物理的な輸送方法に関わらず赤いポストに投函すれば良いので、
物理的な輸送方法に対して透過的なインタフェースを提供していると言える。

話は変わるが、郵便物の重さを自分で測って値段を調べて切手を貼る必要があるのは、とても透過的じゃないインタフェースだなあと思った。
Domo のデータセットを作成する (go)

こちらのプログラムを go で書きました。
[Python で Domo のデータセットを作成する](https://qiita.com/ekzemplaro/items/5b772b95e120e1e6dd3c)

```go:create_dataset.go
// ----------------------------------------------------------------
/*
	create_dataset.go

					Feb/25/2018
*/
// ----------------------------------------------------------------
package main
import (
	"fmt"
	"os"
	"log"
	"io/ioutil"
	"net/http"
)

// ----------------------------------------------------------------
func create_dataset_proc (access_token string,file_json string) {
	fmt.Fprintf (os.Stderr,"*** create_dataset_proc ***\n")
	fmt.Fprintf (os.Stderr,file_json)
	fp, err := os.Open(file_json)

	url_datasets :="https://api.domo.com/v1/datasets"

	req, _ := http.NewRequest("POST", url_datasets, fp)
	req.Header.Set("Authorization", "Bearer " +  access_token)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/json")

	client := new(http.Client)
	resp, err := client.Do(req)

	if err != nil {
		log.Fatalln(err)
		fmt.Printf("%s", err)
		os.Exit(1) 
	} else {
		defer resp.Body.Close()
		contents, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Printf("%s", err)
			os.Exit(1)
		}

	json_str_out := string(contents)
	fmt.Printf("%s\n", json_str_out)
	}
}

// ----------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")
	file_json := os.Args[1]
	fmt.Printf ("%s\n",file_json)

	access_token := get_token_proc ()

	fmt.Fprintf(os.Stderr,"%s\n", access_token)

	create_dataset_proc (access_token,file_json)

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ----------------------------------------------------------------
```

get_token.go はこちらです。
[Domo の アクセストークンを取得する (go)](https://qiita.com/ekzemplaro/items/675804b80933317e5ccf)

```text:Makefile
create_dataset: create_dataset.go get_token.go
	go build create_dataset.go get_token.go
clean:
	rm -f create_dataset
```