OmniAICreator/Qiita-1.07M huggingface dataset:
中小底辺事務員が自動化を頑張る（PowerShellでメール一斉送信）


# いきさつ
従業員が使用する、あるオンラインサービスを利用する事になりました。
そこで、全社員のアカウントをあらかじめ作成しておき、アカウント情報は従業員ひとりひとりにメールで通知する事になり、その役を仰せつかりました。

> アカウント作成はデータのアップロードして（想像）
メール送信はてきとうなツール使えばすぐ終わりそう（想像）。

アカウント作成は想像通り、登録情報のcsvアップロードが利用できました。

しかし、個別にIDとパスワードを送信できるようなツールが全然見当たりません。有料のソフトはありますが、無料で使えそうなツールが見当たりません。ちょっと調べれば10個20個くらいズラッと出てくると思ったのに、検索能力が低いのでしょうか。

# 作ってみる
これ以上検索に時間を使っても進展なさそうだったので、諦めて作ってみました。
メールを送る事が出来れば良いので環境はなんでも良さそうですが、ちょうどこの頃PowerShellの存在を知ったところだったので、PowerShellを選びました。

## コード

csvの中身を配列に入れてforで回すだけなので、面白味ないです。

~~~Powershell
#文字化け回避、コンソール上では逆に文字化けするが問題なし
function Encode-MailHeader($subject)
{
    $enc = [System.Text.Encoding]::GetEncoding("iso-2022-jp");
    $strBase64 = [Convert]::ToBase64String($enc.GetBytes($subject));
    "=?{0}?B?{1}?=" -f "iso-2022-jp", $strBase64
}

#送信者情報
$from = "mail@from.dayo"
$smtp = "mail.smtp.dayo"
$port = 587
$user = "mail@from.dayo"
$pass = "PASSWORD" | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $user,$pass

#メールの件名
$title = "メールの件名"
$subject = Encode-MailHeader(Encode-MailHeader($title))

#csv読込
$csv = Import-Csv .\data.csv -Encoding Default -Header "csv_data_a","csv_data_b","csv_data_c","csv_data_d"
$data_a = @($csv | % {$_.csv_data_a})
$data_b = @($csv | % {$_.csv_data_b})
$data_c = @($csv | % {$_.csv_data_c})
$data_d = @($csv | % {$_.csv_data_d})

for ( $i = 0; $i -lt $data_a.Length; $i++ )
    {
    $to = $data_a[$i]
    #メールの本文
    [string]$body = ""
    $body += `
        $data_b[$i]+" 様" `
        +"`n" `
        +"`n" `
        +"○○○のIDとパスワードをお送りします。"`
        +"`n" `
        +"`n" `
        +"ID:"+$data_c[$i] `
        +"`n" `
        +"パスワード:"+$data_d[$i] `
        +"`n" `
        +"`n" `
        +"このメールを受信したあなたが　"+$data_b[$i]+" 様　でない場合は、速やかに○○までご連絡頂くか、" `
        +"`n" `
        +"このメールに返信して下さい。" `

    Send-MailMessage -To $to -From $from -SmtpServer $smtp -Subject $subject -Body $body -Encoding UTF8 -Port $port -Credential $credential
    }
~~~

送った相手のメーラーによって件名が文字化けする問題があり、[こちらのサイト](https://blog.daruyanagi.jp/entry/2017/03/05/090000)を参考にさせて貰いました。（原理はわかってない）

csvファイルは以下のようにします。（↑のスクリプトの場合は内容1＝ID、内容2＝パスワード）

~~~csv:data.csv
メールアドレス,氏名,内容1,内容2
.
.
.
メールアドレス,氏名,内容1,内容2
~~~

これに限らずデータチェックとか、エラー処理とか、ログ出力とか作ってあると良いですね。
「とりあえず動く」みたいなものばかりなので、いつも動かす時は「えいやっ！（ポチッ）」って感じです。
sqlalchemyでselect句にサブクエリを指定する

# sqlalchemyでselect句にサブクエリを指定する

```sql
select
    table1.*,
    (select count(1) from table2 where table2.table1_id = table1.id group by table2.col1) as cnt
from table1
where ...;
```

```py
count_stmt = session.query(func.count(1))\
    .filter(Table2.table1_id == Table1.id)\
    .group_by(Table2.col1)\
    .label('cnt')
session.query(Table1, count_stmt).filter(...).all()
```

# 参考

https://stackoverflow.com/questions/43654336/generate-sql-with-subquery-as-a-column-in-select-statement-using-sqlalchemy

ありがてえ😘

# 途中で出会ったエラー

```
sqlalchemy.exc.InvalidRequestError: Select statement '...' returned no FROM clauses due to auto-correlation; specify correlate(<tables>) to control correlation manually.
```

## 原因

- サブクエリの`.label()`を書き忘れていた
- join句を忘れていた

など
【Rails】バッテリーホイミ機能を実装しました

個人開発のWebアプリ**「[まちかどルート](https://machiroute.herokuapp.com/)」v6.1**に、名づけて**《バッテリーホイミ機能》**なるものを実装したときのメモです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335872/e063a502-d731-d1cb-9014-084a30501c55.png" width="50%">

# TL; DR

まちかどルートは

「道ばたのゴミを拾おう」 
「お年寄りに席をゆずろう」 
「〇〇に行って〇〇しよう」 など。

みんなの日常からちょっとした一日一善やおつかいなどをお題にしてサブクエストを作りクリアしあうことで世界がちょっと明るくなる、そんな**リアルRPG系Webアプリ**です。

そしてユーザーには、レベルや経験値のほか**HP (ヒットポイント:ドラクエのアレ)**という属性値を持たせています。

# Battery Status API

どうやらPCとAndroidのChrome限定のようですが、バッテリーの状態変化でJavaScriptを発火させることのできるBattery Status APIというものがあります。

今回はそれを応用してみました。

**こんな流れです。**
1. まちかどルートを開く
2. 充電を始める
3. APIが充電を検知したことを画面に表示
4. バッテリー残量値を取得
5. 「ホイミ！」ボタンを押す
6. バッテリー残量値をHPに加算してDBに保存

## view / JavaScript 

```erb:index.html.erb
<div id="posts">
 # ここに下記のJavaScriptからDOM要素が挿入されます
</div>
```

```JavaScript:application.js
navigator.getBattery().then(function(battery) {
  // 充電を検知したら発火 
  battery.onchargingchange = function(){
    // 充電開始(true)のときだけ処理
    if (battery.charging === true) {
    // viewのid="posts"のところにDOM要素を挿入
    var element = document.getElementById("posts");
    element.insertAdjacentHTML("afterbegin", "
       <p>充電を検知</p>
       <form action='battery' accept-charset='UTF-8' method='get'>
       <input name='utf8' type='hidden' value='✓'>
          <input type='text' id='battery' name='battery' readonly=''>
          </input>
          <button name='button' id='battery_btn' type='submit' disabled>
            ホイミ！
          </button>
       </form>
     ");
    }
  }
  // 充電の残量が変化したら発火
  battery.onlevelchange = function(){
    // 充電の残量値を入力フォームに表示
    document.getElementById( "battery" ).value = battery.level * 100;
    // 入力フォームのdisabledを無効にして「ホイミ！」ボタンを押せるようにする
    document.getElementById( "battery_btn" ).disabled = "";
  }
 });
```

## controllerでホイミ！

```ruby:posts_controller.rb
    def battery
        # viewから送られてきたバッテリー残量値をHPに加算してDB保存
        if params[:battery] != nil
            battery = params[:battery]
            @current_user.hp += battery.to_i
            @current_user.save
            flash[:notice] = "HPが回復しました！"
            redirect_to root_path
        else
            flash[:error] = "呪文が失敗しました！"
            redirect_to root_path
        end
    end
```

## ルーティング

```ruby:config\routes.rb
  get 'battery' , as: 'battery', to: 'posts#battery'
```

# あとがき

とてもザックリな感じになってしまいましたが、要点は上記のとおりです。HPが残り少なくなったらバッテリーを充電して「ホイミ！」

けっこう楽しいです。

オープンソース開発用のリポジトリを公開しました。今回の件、こちらにもアップしてあります。
https://github.com/west2538/machiroute_oss
毎回Chromeをインストールするたびに拡張機能で色々入れないとイケないのでメモ失礼します。


マウスジェスチャー
「crxMouse Chrome Gestures」のインストール
https://haniwaman.com/mouse-gesture/

【Chrome】開いているページのタイトルとURLを即コピーする拡張機能
http://bamka.info/copy-url-plus
私も
```
リンク取得用のショートカット
【shift】+【option】+【L】
```
としてます。

その本、図書館にあります。
https://chrome.google.com/webstore/detail/%E3%81%9D%E3%81%AE%E6%9C%AC%E3%80%81%E5%9B%B3%E6%9B%B8%E9%A4%A8%E3%81%AB%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82/ldidobiipljjgfaglokcehmiljadanle?hl=ja
ReactでFontAwesomeを簡単に使う

#はじめに
ReactでFont Awesomeをscssで使おうとして、
上手くいかなくて調べていたら、すごくお手軽簡単な方法にたどり着いたので、
今更感がありそうですが、共有します。

#Font Awesome?
ざっくり言うとWebページで、
アイコンフォントが使えるようになるCSSフレームワークです。
例えばSNSのアイコンなんかを画像で用意しなくても使えるので、
お手軽で軽量です。
無料と有料があり、有料だと使えるアイコンの数が増えます。

#環境
windows10
Node.js v8.12
React.js v16.8.6

#前提
* 今回Font Awesome自体の使い方は記載しません
* この方法ではFont Awesomeバージョン4になります
* バージョン5以降を使いたい場合は、公式からDLして設置します
* react専用のnpmパッケージもありますが、今回はふれません（あまりロックインしたくないので）
* 今回のnpmは3年更新されてないようです。そこは気がかり
* とは言え、週間60万もDLされてるのでメジャー且つ人気っぽいです(2019.6.7現在)

[Font Awesome公式](https://fontawesome.com/)はこちら
[基本的な使い方](https://fontawesome.com/how-to-use/on-the-web/referencing-icons/basic-use)はこちら
[具体的な使い方](https://fontawesome.com/how-to-use/on-the-web/referencing-icons/icon-cheatsheet)はこちら
[npm](https://www.npmjs.com/package/font-awesome)はこちら
[React専用](https://github.com/FortAwesome/react-fontawesome)はこちら

#準備
適当にReactのプロジェクトを作ります。

```console
$ create-react-app fontawesome-hello
```

※後述のサンプルは、余計なコードを消していますが、
 これで作られたコードにそのまま記述しても使えます。

# インストール
```console
$ npm install --save font-awesome
```

#コード書き換え

## index.js

一番TOPのコンポーネントです。
ここに先ほどインストールしたcssを読み込みます。

```react
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import * as serviceWorker from './serviceWorker';

// ★これを追加するだけ
import 'font-awesome/css/font-awesome.min.css'; 


ReactDOM.render(<App />, document.getElementById('root'));
serviceWorker.unregister();
```


## App.js
実際にfont Awesomeを利用するコンポーネントです。
公式の使い方の通り、classに設定して利用します。

```react
import React, { Component } from 'react';

// 別にクラスでなくても良い
class App extends Component {
  constructor(props) {
    super(props);
  }

//★ <i className="fa fa-thumbs-up">でグッドアイコンが表示される

  render() {
    return (
      <div>
        hello font awesome<i className="fa fa-thumbs-up"></i>
      </div>
    );
  }

//アイコンだけだとなんとなく寂しかったので文字も出しているが、今回の話と関係ない

}

export default App;

```

#実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380290/4d405d11-8012-eb88-b11d-7346f7e6058e.png)

一番右にグッドアイコンが出てますね。
成功です！

#所感
過去にいろいろ試して四苦八苦したのですが、
1コマンドで用意できてしまうのはすごく楽ですね。
この感じならAnguraやVue.jsでも使えそうですし、
node.jsのサーバサイドレンダリングでもいけそうですね！
（試してませんが）


#参考
[Get Sass and Font Awesome up and running on your Create React App in 5 minutes](https://medium.com/@kevinyckim33/copy-and-paste-these-lines-of-code-to-get-sass-and-fontawesome-up-and-running-on-your-create-react-95e6c626e73b)
gcc on Alpine Linux

Alpine Linuxでgccの最新版をビルドしてみます。
```
apk add --no-cache make build-base
wget https://ftp.iij.ad.jp/pub/gnu/gcc/gcc-14.1.0/gcc-14.1.0.tar.xz
tar -xvf gcc-14.1.0.tar.xz
cd gcc-14.1.0
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
./../gcc-14.1.0/configure --disable-multilib
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc
```
今回は、Docker上のAlpine Linuxでビルドしました。
Dockerイメージをcommitしましょう。
```
C:\>docker ps -a
CONTAINER ID   IMAGE          COMMAND     CREATED       STATUS                      PORTS                    NAMES
08deda41ee8b   f386d2e32cb3   "sh"                      About an hour ago   Exited (0) 12 seconds ago                                                                  epic_allen

C:\>docker commit 08deda41ee8b kazu_gcc:14.1.0
sha256:c99dd5dcd3148c8c8dffddb23c3e9d71503491accba67dd67a4254ada8c6c121
```
コンテナIDでcommitしました。これをsaveすれば他PCでも使用できます。
作成したイメージを使って実行環境を構築します。
試すCソースは以下です。
```hello.c
#include <stdio.h>

void main(void) {
  printf("Hello, world!\n");
}
```
これを使うためのDockerfileは以下です。
```Dockerfile:DockerfileExec
FROM kazu_gcc:14.1.0 as builder

RUN mkdir /src
COPY hello.c /src
RUN /usr/local/bin/gcc /src/hello.c -o /src/hello

FROM alpine
COPY --from=builder /src/hello /bin/
CMD ["/bin/hello"]
```
作成した実行イメージを起動してみます。
```
C:\>docker run kazu_gcc:exec
Hello, world!

C:\>
```
実行形式に依存している共有ライブラリは以下となります。
```
~ # ldd /bin/hello
        /lib/ld-musl-x86_64.so.1 (0x7fe5bc305000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fe5bc305000)
```
Unity ステージセレクトなどでよくある文字を大きくする方法

#はじめに
この記事で行うこと
・実行中にUIの文字の大きさを変える
・配列を使って選んでいるステージを管理する

#準備
・Hierarchyで [Create → UI → Text]でTextUIを2つ作る
・Projectで [Create → C#Script]でScriptを1つ作る
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426728/42be5538-94db-9a4c-58da-fc537e86fce3.jpeg)


#Scriptを書こう
①フィールドに
int型のstageNumber（選択しているステージを判別する用）
Text型のtext1,text2（大きくしたい文字）

```php

public Text text1;
public Text text2;
private int stageNumber;//ステージ番号は変換されると困るのでprivateだよ！

```
②StartメソッドでstageNumberを初期化しよう

```php
void Start()
{
   stageNumber = 0;//最初に選択されているステージは1なのでここで設定しているよ
}
```

③Updateメソッドにコードを書こう
左右キーを押したときに選択しているステージの値を増やしたり減らしたりする
ステージの値によって対応した文字を大きく表示する


```php
void Update()
    {
        //右のキーを押したとき、ステージ番号が1以下ならステージ番号を+1する
        if (Input.GetKeyDown(KeyCode.RightArrow) && stageNumber < 1)
        {
            stageNumber++;
        }
        //左キーを押したらとき、番号が0以上ならステージ番号を-1する
        if (Input.GetKeyDown(KeyCode.LeftArrow) && stageNumber > 0)
        {
            stageNumber--;
        }

        //選択しているステージの文字を大きく表示
        if (stageNumber == 1)
        {
            text1.fontSize = 30;
            text2.fontSize = 50;
        }
        else
        {
            text1.fontSize = 50;
            text2.fontSize = 30;
        }

    }
```
④オブジェクトをアタッチして完成！
スクリプトはGameObjectを作って入れるとGood！
![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426728/9828e101-1d42-08e2-62b1-f04fdca35b9f.jpeg)

左右キーを押せば文字が大きくなるよ！
![キャプチャ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426728/23eac4f5-ed98-37e0-bec2-390468cc3cc6.jpeg)

#終わりに
今回は文字を大きくすることだけをやりましたが、こういった感じに文字を大きくするだけでも見栄えが変わるのでオススメです。
【ターミナル改造④】情報表示のlsコマンドの装飾ツールの「lsd」を導入して、外観からの効率性を問う。

- 白黒ターミナルを利用する生活が多くなってきた無機質生活に、少々彩りを加えるために奔走する記事第四弾。
- とうとうMacのデフォルトシェルがbashからzshへ変わることに、冷静を最大に装いながら、無意識の手の震えが止むことを知らない。
- 今回は、ファイルやフォルダの情報表示のlsコマンドを、カラフルにわかりやすく表示してくれる「lsd」を導入して、外観と効率性の両立を検討していくことにしよう。

## 概要
- Rust製の高速ファイル情報表示コマンドツール。
- 同様のlsコマンドに比べて、「明快な可視化・カラフル」であることが特徴。
- [公式GitHub](https://github.com/Peltoche/lsd)

## 作業環境
- Mac OS X 10.13.4
- Homebrew 2.1.4

## インストール
- 「ターミナル.app」を開き、下記のコマンドをうち、**lsd**の利用環境を構築する。
    - **※Homebrew未導入の場合、[こちら](https://brew.sh/index_ja)を参考にインストールする。**
    - **※HomebrewCaskを未導入の場合、[こちら](https://www.evoworx.co.jp/blog/homebrew-cask/)を参考にインストールする。**

```bash
# brewでlsdをインストール
$ brew install lsd
# lsdのバージョン確認
$ lsd -V
# デフォルトでは、アイコン未表示のため、フォントをインストールする。
$ brew tap homebrew/cask-fonts
$ brew cask install font-hack-nerd-font
```

- フォントのインストール完了後、「ターミナル.app」の環境設定を開き、「プロファイル」欄を開く。
    - **※環境設定ページは、ターミナル上で「cmd + ,」のショートカットで開くことができる。**
- 「プロファイル」欄の「フォント」欄の変更ボタンをクリックして、フォント変更ページを出す。
- フォント変更ページの「ファミリー」欄に、先ほどインストールした**HackNerdFont**に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/850d8326-8275-07f0-e983-e934c38f0f0c.png)

- そのほかのインストール方法は[こちら](https://github.com/Peltoche/lsd#installation)を参考にする。

## 結果
- 下記、実際の画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/76916f2a-26ce-8e62-faf8-abf26c57f996.png)

- フォルダのツリー構造表示も可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/96ab0751-5cb9-73a9-0133-0f70eefeed2b.png)

## 基本操作
- ※基本的には、**lsコマンド**の操作と変わらない。

| 内容 | コマンド |
|:-:|:-:|
|通常表示 | `lsd`  |
| 縦表示  | `lsd -l`  |
| 隠しファイル含め表示  | `lsd -a`  |
| ワンライン表示  | `lsd -1`  |
| ツリー構造での表示  | `lsd --tree`<br>**※オプションで階層制限は現在不可能なため、全ファイル表示されることに注意**  |
|フォルダの中身含め全表示(再帰処理)|`lsd -R`|
|逆順でのソート表示|`lsd -lr`|
|サイズごとのソート表示|`lsd -lS`|

## まとめ
- 今回はカラフルな情報表示ツールの試用ということで、作業効率思考を蚊帳の外に置き、色彩に浸りながら、記事を書く。
- これまでターミナル装飾ツールを色々利用してきたが、圧倒的割合の「外観ひけらかし設定」のため、効率性の本質を自問自答。
- 「外観も効率性向上に必須だ」と数える程度に自分に言い聞かせながら、次の装飾術を探すことにしよう。

## 参考
- https://github.com/Peltoche/lsd  
→公式GitHubです。大変お世話になりました。

- https://wonderwall.hatenablog.com/entry/2019/03/04/220000  
→こちらの記事を参考にしました。大変お世話になりました。

- https://www.evoworx.co.jp/blog/homebrew-cask/  
→Homebrew Caskのインストール方法の紹介として利用いたしました。大変お世話になりました。
VScodeの拡張機能，Code RunnerでPythonの2系と3系を切り替える方法（pathの設定）

## 何があったのか

VScodeの拡張機能であるCode RunnerでPythonを実行したら，2系で実行された．  
3系に切り替えたい．

## 方法

VScodeの拡張機能から，Code Runnerをクリック．表示された詳細の部分に思いっきり書いてある．以下引用

>Configuration
Make sure the executor PATH of each language is set in the environment variable. You could also add entry into code-runner.executorMap to set the executor PATH. e.g. To set the executor PATH for ruby, php and html:

``` setting.json
{
    "code-runner.executorMap": {
        "javascript": "node",
        "php": "C:\\php\\php.exe",
        "python": "python",
        "perl": "perl",
        "ruby": "C:\\Ruby23-x64\\bin\\ruby.exe",
        "go": "go run",
        "html": "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\"",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
    }
}
```

というわけで，表示 -> コマンドパレット -> 基本設定:設定（json）を開く  
より`setting.json`を開く．`setting.json`に以下を記入

``` setting.json
{   //ここの｛｝は元からある
    "code-runner.executorMap": {
        "python": "python3系のpath\\Python37\\python.exe",
    }
}
```

無事，3系で実行できました．  

## 最後に

Code Runner 便利

![coderunner.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266469/83130423-0407-be60-c113-856b0bc04817.jpeg)
結婚発表後の山ちゃんと蒼井優に関するTweetデータを可視化してみた。

##山ちゃん、蒼井優さんおめでとう

お二人の結婚をみんながどのように感じているのか気になったので、
結婚後のTweetデータを利用して、テキストマイニングして可視化してみた。


##利用したデータ

- 期間
    - 2019/6/5-2019/6/7
- ツイート数
    - 1000


##データ加工

- 山ちゃん 
    - 形容詞・感動詞のみ
    - ２文字以上

- 蒼井優さん
    - 形容詞・感動詞のみ
    - ２文字以上



##テキストマイニング結果
- 山ちゃんver
- ![yama2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432245/7767007f-a3c1-38bb-f0e5-edefac85da07.png)


- 蒼井優さんver
![yuaoi2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432245/4174b48a-e439-5f6b-f00c-3b0c5a7fe8ac.png)


##感想

嫉妬してる方もちらほら見受けられたけど、
どちらも祝福のツイートが多いようで何より。
末長くお幸せに。
Gradle設定メモ (マルチプロジェクト to all in one) 自分用

Gradle 5.4.1

```tree.
├─sub
│  ├─sub-sample1
│  │  └─src
│  │      ├─main
│  │      │  ├─java
│  │      │  │  └─sample
│  │      │  │      └─subs
│  │      │  │              Sub1.java
│  │      │  │
│  │      │  └─resources
│  │      │       └─subs
│  │      │               subSample1.txt
│  │      └─test
│  │          ├─java
│  │          └─resources
│  └─sub-sample1
│      └─src
│          ├─main
│          │  ├─java
│          │  │  └─sample
│          │  │      └─subs
│          │  │              Sub2.java
│          │  │
│          │  └─resources
│          │      └─subs
│          │              subSample2.txt
│          │
│          └─test
│              ├─java
│              └─resources
└─src
    ├─main
    │  ├─java
    │  │      Main.java
    │  │
    │  └─resources
    │          sample.txt
    │
    └─test
        ├─java
        └─resources
```

```build.gradle
allprojects {
    apply plugin: 'java'
    group 'sample'
    version '1.0-SNAPSHOT'
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    compileJava.options.encoding = 'UTF-8'
    repositories { mavenCentral() }
    dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' }
}

dependencies { 
    compile project(':sub:sub-sample1')
    compile project(':sub:sub-sample2')
}

def mainProjects = [':sub:sub-sample1', ':sub:sub-sample2']
task allInJar(type:Jar, dependsOn: mainProjects.collect({ it+':compileJava' })){
    dependsOn build
    baseName = rootProject.name
    manifest.attributes 'Main-Class': 'Main'
    def javaSubDir = "/classes/java/main"
    def resourcesSubDir = "/resources/main"
    from(buildDir.path + javaSubDir,
            files(mainProjects.collect{ project(it).buildDir.path + javaSubDir }))
    from(buildDir.path + resourcesSubDir,
            files(mainProjects.collect{ project(it).buildDir.path + resourcesSubDir }))
}
```
gradlew allInJarで実行.
task:build << allInJar

```jar.
│  Main.class
│  sample.txt
│
├─subs
│      sample1.txt
│      sample2.txt
│
├─META-INF
│      MANIFEST.MF
│
└─sample
    └─subs
            Sub1.class
            Sub2.class
```

参考；
　Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築(著 綿引 琢磨, 須江 信洋, 林 政利, 今井 勝信)
　[java – 複数のプロジェクトを1つのjarファイルにGradleできますか？](https://codeday.me/jp/qa/20190303/349670.html)
【Kotlin】LocalDateで2つの日付を比較し、日数の差分を取得する

2つの日付を比較してその差分を取得したい、ということはよくあると思います。

```
例）
- 日付1：2019/06/07
- 日付2：2019/06/01
- 差分：6日
```

方法はいくつかあると思いますが、なるべくシンプルに書ける方法を模索しました。これはそのときのメモです。

# ポイント
## `java.time.LocalDate`ではエラーが出る
`java.time.LocalDate`は、Java8から`java.time`パッケージに追加された日付を扱うAPIです。
これを使って今日の日付を取得しようとすると以下のように書きます。

```kotlin
val today = LocalDate.now()
```
しかしこれだと`now()`の部分にエラーが表示されます。

```
Call requires API level 26 (current min is 15): java.time.LocalDate#now
```
このエラーはminSdkで26未満を設定している場合に表示されるもので、
`java.time.LocalDate`を使うためにはAndroidのAPI26（Android8.0/Oreo）以上が必要になるとこのこと。
大抵のアプリはまだAndroid5.0とか6.0くらいまではサポートしていると思うので、残念ながらこれは使えないケースが多そうです。

## ThreeTenABPライブラリを使う
そこで、代わりにThreeTenABPを使います。
ThreeTenABPはざっくり言うと、`java.time.LocalDate`などの新しいAPIをAndroidでも問題なく使えるようにバックポートしたライブラリです。作者はわれらがJake神。

詳細は下記を参照してください。
[GitHub - JakeWharton/ThreeTenABP: An adaptation of the JSR-310 backport for Android.](https://github.com/JakeWharton/ThreeTenABP)

# コード
前置きが長くなりましたが、**ThreeTenABPの`LocalDate`**を使って日付の差分を取得します。

## ThreeTenABPの導入

build.gradleに下記を追加。

```groovy
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
```

Applicationクラスの`onCreate()`内で初期化します。

```kotlin
class Application : Application() {

    override fun onCreate() {
        super.onCreate()
        // 初期化
        AndroidThreeTen.init(this)
    }
}
```

AndroidManifestのapplicationタグ内に下記を追加。

```groovy
<application
    android:name=".Application"
</application>
```

ここまで完了すると、`java.time.LocalDate`の他に`org.threeten.bp.LocalDate`も選択肢に表示されるようになります。
<img width="406" alt="スクリーンショット 2019-06-07 1.27.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/3f6180b8-c539-8e5d-ee99-28e4dd51fef1.png">


## 差分の取得
```kotlin
val today = LocalDate.now() //2019-06-07
val day1 = LocalDate.parse("2019-06-01")

val diff = today.compareTo(day1) //6(Int)
```

`LocalDate.now()`でLocalDate型の現在日付を取得。
`LocalDate.parse("2019-06-01")`は、引数で指定した文字列をもとにLocalDateクラスのインスタンスを返します。
最後に`today.compareTo(day1)`で2つのLocalDate型を比較し、差分をInt型で取得します。

ライブラリを導入するのは少し手間ですが、とてもシンプルなコードで差分を出すことができました:tada:

# 追記（2019/07/28）
:warning:注意
日数の差分を取得する目的で利用しようとすると、場合によっては期待結果と異なることがあります。
詳細は下記にまとめましたのでご覧ください。
[【Android】LocalDate#compareToで日付を比較する際の注意点](https://qiita.com/orimomo/items/1c59409673f9c8a4df91)

# 参考
* [GitHub - JakeWharton/ThreeTenABP: An adaptation of the JSR-310 backport for Android.](https://github.com/JakeWharton/ThreeTenABP)
* [Androidで日付時刻を簡単に扱えるThreeTenABPの話 - Timers Tech Blog](https://techblog.timers-inc.com/entry/2016/06/27/121939)
* [java - OffsetDateTime.now() requires API 26 - Stack Overflow](https://stackoverflow.com/questions/49348769/offsetdatetime-now-requires-api-26)
* [Java 8 日付と時刻を扱うクラス](https://tech.pjin.jp/blog/2017/03/23/java_8_how_to_use_java_time_api/) 
* [Java - Java日付の比較をしたい｜teratail](https://teratail.com/questions/77784)
Django1.11.18から2.xにアップデートしたら/adminが500だった話

## 環境
- Python: 3.6
- pipenv: 2018.7.1
- pip: 18.0.0
- Django: 1.11.18, 2.1.4

## 執筆したきっかけ
- AWS CodeStarが作成するDjangoが1.11.18製だったので，2.x系にアップデートしたかったから
- あくまで備忘録程度です

## アップデート後，/adminにアクセスができない
原因を調べると，[Python Djangoチュートリアルでadminのページに行けない](https://teratail.com/questions/154165)が参考になりました．
たしかに，[公式ドキュメント](https://docs.djangoproject.com/ja/2.1/topics/http/middleware/#activating-middleware)を見ると，`settings.MIDDLEWARE_CLASSES`が`settings.MIDDLEWARE`に置き換わっていました．また，`django.contrib.auth.middleware.SessionAuthenticationMiddleware`も削除してください．

よって，下記のように書き換えると解決します．

```python:settings.py

# MIDDLEWARE_CLASSES = [
#     'django.middleware.security.SecurityMiddleware',
#     'django.contrib.sessions.middleware.SessionMiddleware',
#     'django.middleware.common.CommonMiddleware',
#     'django.middleware.csrf.CsrfViewMiddleware',
#     'django.contrib.auth.middleware.AuthenticationMiddleware',
#     'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
#     'django.contrib.messages.middleware.MessageMiddleware',
#     'django.middleware.clickjacking.XFrameOptionsMiddleware',
# ]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```

## 参考
[Python Djangoチュートリアルでadminのページに行けない](https://teratail.com/questions/154165)
[公式ドキュメント](https://docs.djangoproject.com/ja/2.1/topics/http/middleware/#activating-middleware)
[Django 1.9 から 2.1 に上げる時の備忘録](https://qiita.com/Brokenumbrella/items/cd0ce6c36ec70f9dcf43)
RSpecで変更が無い事を確認しようとしたらLint/AmbiguousBlockAssociationというLintエラーが発生した

テスト自体は通っていたが、プルリクを出す前にRuboCopを動かして検証したところ、Lint/AmbiguousBlockAssociationという以下のLintエラーが発生した。

`Lint/AmbiguousBlockAssociation: Parenthesize the param change{ analysis.foo_count } to make sure that the block will be associated with the change method call.`

~~~RSpec:該当のspecファイルの記述抜粋（一部、実態のコードから変更）
require 'rails_helper'

RSpec.describe Dummy, type: :model do
  describe '.method' do
    subject { Dummy.method!(foo_analysis: analysis, foo_data: foo_data) }
    let(:analysis) { create :users_foo_analysis }
    context 'when foo_data is empty' do
      let(:foo_data) { [].to_json }
      it { is_expected.to eq Dummy.none }
      it { expect { subject }.to_not change{ analysis.foo_count } }
    end
~~~

動作しない前提で、試しに以下のように変更をかけてテストを動作させてみた。

~~~RSpec:変更前
■変更箇所
　it { expect { subject }.to_not change{ analysis.foo_count } }
~~~
~~~RSpec:変更後
　it { expect { subject }.to_not change analysis.foo_count }
~~~

すると、以下のようなエラーが表示された。

~~~
ArgumentError:
  `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message.
~~~

(`change { }`)の形式ではRuboCopに怒られてしまっていたので、(`change(obj, :msg)`)の形式に修正した形でテストを通しつつ、RuboCopに怒られないようにするためにどうすれば良いか調査してみた。

結論、以下のような記述であれば、テストを通しつつ、RuboCopに怒られずにすんだ。

~~~RSpec:最終形
  it { expect { subject }.to_not change(analysis, :foo_count) }
~~~

`change(obj, :msg)`の:msgって何だろう？と戸惑ったが、普通にメソッドを渡せば動きそうだなと思い、試しにやってみたら上手くいった。

:msgとかではなく、もっと分かりやすいエラーメッセージなら素早く解決できたのに。。。。
コントローラに書くコードを意識する

自分がエンジニアバイトをしているところでは週1回Rails勉強会をしています。今回はそのやったところのまとめを残しておきます。
参考書：[現場で使える Ruby on Rails 5速習実践ガイド]
(https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)

# コードを書く場所を意識する
アプリケーションを作る上で何のコードをどこに書くかはとても重要になってきます。開発が進むにつれ、様々な機能を実装するためコードの量が増え複雑になっていきます。そこで少ないコストで全体を把握するには「 コードを書く場所を意識する」ことが重要になってきます。

## コントローラに書くべきコード
RailではMVCを採用しています。それぞれに役割を持たせることで、どこが何をするところなのかを分けて管理しやすくしています。その中でコントローラの役割は送られてきたリクエストに対して、適切なレスポンスを返すのが仕事です。適切なレスポンスを返すためにModelやViewに対して働きかけます。

```
def index
 @user = User.all
end
```
開発初期の頃は上記のようにとてもシンプルなコントローラですが、開発が進むとModelに書くべきビジネスロジックが増え、どんどん複雑さが増してしまうことが多くなります。そのためコントローラはModelから値を取り出したり、保存したりする計算処理(ビジネスロジック)をあくまで呼び出す処理に集中する必要があります。

### 検索条件を書いたコード

```
User.where(name: "Bob")
```
のように(短いですが)DBから検索をかけるようなコードの場合、コントローラに書くのではなく,Modelにscopeとして書く必要があります。

### オブジェクトのデータを変更させるようなコード

```
@user.name = "Tom"
```

上記のようなオブジェクトがもつデータの変更がおきているコードの呼び出しが多数ある場合、その部分はModelに移したほうがよいでしょう。例えば、「ユーザーの情報を変更するメソッド」のような統合的なメソッドをModelに作り、コントローラ側で呼び出すだけにするとコントローラはスッキリしたものになります。
ラズパイに Open JTalk を導入する

[ラズパイの初期セットアップ個人用メモ](https://qiita.com/_yama_P_/items/17b4414afcd4f5212c1d) から引き続いて実施。

前回で Raspberry Pi に ssh で接続できるようになったので、今回は Windows 10 の WSL(Ubuntu) から ssh で接続して作業します（一部を除く）

# 事前準備
* 3.5mm jack に接続するスピーカーを用意し Raspberry Pi に接続

## 3.5mm jack につないだスピーカーから音が出るように設定
* `sudo raspi-config` でコンフィグを開く
* `7 Advanced Options` を選択

![2019-06-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431508/a22ec9b4-e4c6-ee43-832e-406eb0e80de3.png)

* `A4 Audio` を選択 

![2019-06-06 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431508/fc21cb01-fec1-773e-463e-2f7c166d1236.png)

* `1 Force 3.5mm ('headphone') jack` を選択

![2019-06-06 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431508/10c3c910-a12f-e535-2bc7-4265a1c74c66.png)

* 任意の手段で接続したスピーカーから音が出ることを確認
    * 簡単なのは Raspberry Pi 上でブラウザから Youtube を開いて任意の動画を再生（ここは ssh ではなく Raspberry Pi 上で操作）

# Open JTalk の導入
* `sudo apt-get install open-jtalk` で Open JTalk を導入

![2019-06-06 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431508/270cd5cb-68b9-895e-b966-23978cea9d3b.png)

* 提案パッケージとして推奨された `open-jtalk-mecab-naist-jdic` , `hts-voice-nitech-jp-atr503-m001` を導入
    * `sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001`

![2019-06-06 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431508/135af141-3b11-35ca-5610-d3a5fc68ee50.png)

![2019-06-06 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431508/302481ca-d321-2d6a-1e56-70238c9672e6.png)

* 実行し問題なく作成されることを確認する

```
echo "てすと" | open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow /tmp/test.wav
aplay /tmp/test.wav
```
yamlから欲しい情報をGoでとる(マイグレーションツールを使うときに使うファイルを流用する)

## 動機

　migrationツールを使うと次のようなdb.confを書いたりします。

```yaml

development:
    dialect: mysql
    dir: db/migrations
    datasource: user:password@tcp(db:3306)/db_name?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true

production:
    dialect: postgres
    dir: migrations/postgres
    datasource: dbname=myapp sslmode=disable
    table: migrations

```

せっかくなら、普通のデータベース接続もこのYAMLからデータを取ってきたい！取ってきたくない？

go-yamlを使って簡単に（）実装できます！

## 実装例

```go
buf, err := ioutil.ReadFile("file.pass")

    if err != nil {
        log.Fatal(err)
        return
    }

    m := make(map[interface{}]interface{})
    err = yaml.Unmarshal(buf, &m)
    if err != nil {
        log.Fatal(err)
        panic(err)
    }


    fmt.Printf("%d\n", m["development"].(map[interface {}]interface {})["datasource"])
    db_config :=m["development"].(map[interface {}]interface {})["datasource"].(string)


    db, err := dbr.Open("mysql", db_config , nil)
```

　忘備録だけど、ここに行きつくのにどちゃくそ時間がかかった……
　Goのインターフェースよくわからん。ちなみにdbrを接続用のツールに使っています。

## 参考
https://qiita.com/umanoda/items/07887d33ef1155b26ed2
https://ota42y.com/blog/2014/11/13/go-yaml/
https://qiita.com/daiching/items/a384a5ce229cf714a3b5
赤ちゃんとか大人とか老人は人のサブクラスではありません

先日、こんな記事がありました。[[初心者]オブジェクト指向でなぜつくるのか](https://qiita.com/IZUMIRU/items/959b43dc9eb4f5cdc202)

本の要約だそうで、私は対象の本を読んでないので記事が正しいかはよくわかりません。
ですが、一つ気になる記述がありました。

> 現実世界では、赤ちゃんは大人になり、老人になる。しかしオブジェクト指向の世界では、作られたインスタンスは複数のクラスに帰属することができず、時間が経っても別のクラスに所属替えできない。

これはおそらくクラス図にするとこういうことでしょう。もし間違っていたら連絡していただければ修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/8c31e40c-cf3f-f8b9-43f0-f049149a461a.png)

赤ちゃんは人間であり、大人も人間である。よって赤ちゃんと大人は人間のサブクラスであり、
現実世界の赤ちゃんは大人になるので同じオブジェクトが別のサブクラスのインスタンスへ変位すると。

これは一見正しいように見えますがよくある間違いです。

クラスはただの分類ではありません。オブジェクトを抽象化したものであり、invariant を記述したものです。一方成長段階は多値を取りえる（variant）概念です。variant なクラスなどというものは存在しません。…これだけでは何を言ってるかわからないですよね。

こういえばわかりやすいでしょうか？

仮に、赤ちゃんと大人を人間のサブクラスとして赤ちゃんは成長して人間になれるとする。では、モヒカンとツインテールも人のサブクラスとした場合にモヒカンは成長したらツインテールになれるか？モヒカンは大人になれないのか？なれないとしたら、赤ちゃん＆大人の関係とモヒカン＆ツインテールの関係を区別することはできるか？
ということです。

と言ってもやっぱりわかりにくいですよね。
結論として正しいクラス図はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/e4b4f1d5-96c5-f30d-e108-edf7feb77bb5.png)

この「年代」は「属性」であり、時間によって変わるため「状態」です。簡略化して属性スロットに入れてしまってもいいでしょう。念のため言っておきますがこの「属性」だの「状態」だのというのは別にメモリ上のデータでもなければプログラミング上の概念でもありません。ある人は赤ん坊の状態のこともあれば大人の状態のこともあるだろうというただそれだけの話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/0c87eb6c-b481-bb17-9e82-3794a57478be.png)

「元の人間クラス」の悪い例として、同じように例えば私が今「モヒカンの人」だったとして、成長して「ツインテールの人」になったとしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/0ea3bbe1-5f5d-2da4-fa33-f77521e211f3.png)

これを「元の人間クラス」のもとにマージします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/15fe2aec-eb71-e7a9-38a7-ccd211c82864.png)

さて、この考え方は正しいでしょうか？

一方、例えば私が今「モヒカンの髪型」だったとして、成長して「ツインテールの髪型」になったとしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/6694cfea-84c2-1a28-3a8b-9ec7f8e46cc0.png)

これを「後の人間クラス」のもとにマージします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/81c5523b-d555-7b1d-c8af-b91044a05ee5.png)

人間としてはマージされましたが、年代と髪型は混ざっていませんね。

さて、先ほどのクラス図との違いは何でしょうか？
言うまでもないですね。混ぜてはいけないものを区別して扱えている、ということです。

このように、人が赤ちゃんだったり大人だったりすること・モヒカンだったりツインテールだったりすることは可変 variant です。
一方、赤ちゃんであることとモヒカンであることは別々の事柄であり、別々の事柄であることは決して変わりません。この決して変わらない構造、存在に対する限定こそが invariant であり、クラスで記述するべきことです。

クラスのもとになったイデアとか形相とかは「その文脈の中で変更されないこと」を記述するための手法であり、我々は今何の話をしているのかを規定するものです。
あるクラスのインスタンスが別のクラスのインスタンスにもなれるとした場合、「我々は今何の話をしているのか」のすべてが崩壊します。
これは現実だとかプログラムだとかに限らず「あなたは対象を正しくモデル化できるか。そのモデルを記述するときに論理的に正しく記述できるか」という問題です。

最近、早すぎる抽象化だとか間違った抽象化だとかの記事に多くの良いねが集まっていますが、プログラミング以前に対象としている物事をモデル化することに失敗しているのではないでしょうか？
よくプログラミングのモデル化は難しいとか現実とプログラミングは違うと言う人がいますが、そう言う人が現実をうまくモデル化できている例を見たことがありません。現実のモデル化ができないのなら現実とプログラミングの違いもへったくれもありませんし、早かろうが遅かろうが抽象化はうまくいかないんじゃないですかね。
抽象化の仕方を教える先生とか教科書とか見たことないので難しいところですが勉強とか練習とかしていきたいところです。
まあ現実のモデリングはプログラミング上のモデリングより難しかったりするんですけどねHAHAHA!
Vue.js の slot を使用して並べ替えと絞り込みを行う (v2.5 以前で v2.6 からは deprecated になりそう)

# slot を使用しての並べ替えと絞り込み

[実装例](https://codesandbox.io/s/pbk82)
上記において `{ pref }` の値によるまとまりの並べ替えと
内容となる `list` 自体の反転を行っています。

## props の指定により name を変更する slot

`list` の並べ替えに使用するコンポーネントとなります。

* 子コンポーネント自体には表示対象となる `list` を持たせません。
* `slot` の `name` の指定に `props` からの関数を使用させます。
* `slot` を並べ替える基となる `sortList` を `props` として渡します。

```vue:DynamicSlot
<template>
  <div>dynamic
    <slot v-for="(row, key) in sortList" :name="slotName(row, key)">
      <!-- slot タグには :key 指定ができない模様 -->
      <span :key="slotName(row, key)"></span>
    </slot>
  </div>
</template>

<script>
import Vue from "vue";
export default Vue.extend({
  props: {
    sortList: {
      type: Array,
      default: function() {
        return [];
      }
    },
    slotName: {
      type: Function,
      default: (row, key) => `dynamic-${key}`
    }
  }
});
</script>
```

## slot による並べ替えコンポーネントの使用

以下の実装をしています。

* 表示データとなる `list` と `pref` を並べ替える根拠となる `sortList` を `data` に指定
* 前述の `slot` の `name` を指定するための `slotName` を `methods` に
* 配列操作として `list` `sortList` の反転操作、各要素ごとの `pref` へのインクリメント
  * `pref` が `sortList` に含まれない値になった時点で表示対象より除外されます。

```vue:App.vue
<template>
  <div id="app">
    <button @click="sortList = sortList.reverse()">pref</button>
    <button @click="list = list.reverse()">list reverse</button>
    <DynamicSlot :sort-list="sortList" :slot-name="slotName">
      <p v-for="(row, key) in list" :key="key" :slot="slotName(row, key)">
        {{ row }}
        <button @click="list[key].pref = list[key].pref + 1">pref increment</button>
      </p>
    </DynamicSlot>
  </div>
</template>

<script>
import DynamicSlot from "./components/DynamicSlot";

export default {
  components: {
    DynamicSlot
  },
  data() {
    return {
      sortList: [{ pref: 2 }, { pref: 3 }, { pref: 1 }],
      list: [
        { id: 1, name: "aaa", pref: 1 },
        { id: 2, name: "bbb", pref: 2 },
        { id: 3, name: "ccc", pref: 1 },
        { id: 4, name: "ddd", pref: 3 },
        { id: 5, name: "eee", pref: 2 },
        { id: 6, name: "fff", pref: 1 },
        { id: 7, name: "ggg", pref: 1 },
        { id: 8, name: "hhh", pref: 3 },
        { id: 9, name: "iii", pref: 3 },
        { id: 10, name: "jjj", pref: 1 }
      ]
    };
  },
  methods: {
    slotName(row, key) {
      return `dynamic-${row.pref}`;
    }
  }
};
</script>
```

`pref` の値を基に `slotName` の結果が変更されますが、
`sortList` の反転により並び変わるのは [こちらの挙動](https://qiita.com/ysKuga/items/234e90e22f317efde3de) を利用しており
バグっぽいような感じもしなくもないです・・・。
はじめてのC++ 【49日目】

# はじめに
Webアプリケーションは、違う記事で書こうと思う。今日はAtcoderの復習は休みます。
## ロベールC++
### 静的メンバ関数
昨日に書いた `B.cpp` 

```cpp:B.cppの中のmain関数
int main()
{
  B a;
  a.show();
  {
    B b;
    a.show();
    b.show();
  }//bのデストラクタを呼んでいる
  a.show();
}
```
この `show関数` は、 `m_count` を出力するためだけの関数である。 `m_count`　は `static` なメンバ変数なので、プログラムのはじめに初期化される。なので、クラスを実体化しなくても `m_count` を使うことができる。この場合、 `show関数` は、静的メンバ関数にするべきである。

```B_2.cpp
#include <iostream>

class B {
public:
  B();
  virtual ~B();
  static void show();
private:
  static int m_count;
};

int B::m_count;//静的変数は0で初期化される

B::B()
{
  m_count++;
}
B::~B()
{
  m_count--;
}

void B::show()
{
  std::cout << m_count << std::endl;
}

int main()
{
  B::show();//宣言してないけど、staticな値なので０で初期化されている。
  B a;
  B::show();
  {
    B b;
    B::show();
  }//デストラクタを呼んでいる
  B::show();
}
```
```:実行結果
0
1
2
1
```
静的メンバ関数の注意点は、静的メンバ関数にはそれを呼び出すときの実体のアドレスが渡されないので、静的メンバ関数内では静的メンバ変数と関数しか使えない。
でも、引数に非性的メンバ変数やクラスを渡すと使えるようになる。
### シングルトンクラス (おまけ)
あるクラスのオブジェクトが一つだけ生成したいとき、このオブジェクト指向?の考え方を使う。シングルトンクラスでは、コンストラクタを `private`　にして、その実体を `静的メンバ関数` で返すようにしたらシングルトンクラスの完成です。シングルトンクラスは、比較的安全なグローバル変数といった感じで使う。

# 終わりに
おやすみなさい
最新の cuda + cudnn + cupy を Ubuntu 18.04 へインストールする＠2019年春版

# はじめに

ディープラーニングを行うためにはGPU環境がほぼ必須といえ、現在はGoogle Colaboratory などで簡単に利用できるようになってきました。
しかし本格的にGPUを利用するためには、やはり自前のサーバーを立てて、その上でGPU環境を構築する必要が出てきます。

そこで、記事執筆時である2019年春(5月上旬)ごろにGPUサーバーをセットアップした際のインストール方法を、忘記録として残すことにしました。

# インストール環境

- マシン: GCP Computer Engine (Google提供のクラウドの仮想マシン)*1
- OS: Ubuntu 18.04
- GPU: NVIDIA Tesla K80*2

今回は上記の様な環境に導入しましたが、nvidia製のGCPを積んでいるLinuxマシンであれば、以下の方法で問題なくできるでしょう。

*1 GCP Computer Engine、GPUは使えるリージョンが限られる点に注意。（日本からなら台湾がおすすめ）
*2 K80なら動かしっぱなしでも月300~400ドルくらい（高いけど、基本はColabを使ってほとんど動かさないから問題ない）。


# cuda と cudnn のインストール

まずcudaやcudnnをインストールする前に、自分が使う予定のニューラルネットワークのライブラリが要求している**cudaやcudnnのバージョンを確認しましょう**。
特に、**TensorFlowが要求するcudaのバージョンは非常にタイト**なので、再インストールする羽目にならないように、はじめによく確認しましょう。

次に、以下のサイトからインストールするcudaおよびcudnnのバージョンのURLを確認しておきましょう。
- [https://developer.nvidia.com/cuda-toolkit-archive](https://developer.nvidia.com/cuda-toolkit-archive)
- [https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/](https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/ "https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/")


その後、インストールするサーバー上で以下のコマンドを実行します。なお、URLやファイル名等はバージョンによって適宜変更してください。

## cudaのインストールコマンド

```shell
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.105-1_amd64.deb

sudo apt update
sudo apt upgrade

sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub

sudo apt install ./cuda-repo-ubuntu1804_10.1.105-1_amd64.deb

sudo apt update

sudo apt install cuda cuda-drivers

```

また、使用しているシェルの設定ファイルに**cudaへのパスを追加しましょう**。（よく忘れます

```
# cuda PATH .bashrc や .zshrc などに書く
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
```

その後リブートします

```
sudo reboot
```

## cudnnのインストールコマンド

インストールしたcudaによって対応しているcudnnが異なる点には注意しましょう。

```
wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libcudnn7_7.5.0.56-1+cuda10.1_amd64.deb
sudo apt install ./libcudnn7_7.5.0.56-1+cuda10.1_amd64.deb
sudo apt update

sudo apt-get install libcudnn7
```

# cupy と ディープラーニングライブラリ のインストール

ニューラルネットワークのライブラリをインストールする前に、cupyをインストールしましょう。
cupyはインストールしたcudaによってインストールすべきライブラリが変わるため、注意しましょう。


```
pip search cupy
# いっぱい出てくる。インストールしたcudaのバージョンに合わせる。
# 今回は`cuda 10.1`なので以下の通り
pip install cupy-cuda101
```


最後に使いたいディープラーニングのライブラリをインストールして終わりです。
私はChainerなので、chainerをインストールします。

```
pip install chainer
```

# まとめ

これでGPUを積んだサーバーで、GPUを使用する準備が整いました。あとはバリバリ回しましょう！


# 参考

-  [Ubuntu 18.04へのCUDAインストール方法](https://qiita.com/yukoba/items/4733e8602fa4acabcc35)
iOS13のScene-Basedライフサイクル(UISceneDelegate)

# はじめに
Xcode11が出たので、iOS13のScene-Basedライフサイクルの調べました。
iOS12までは、[アプリライフサイクル(AppDelegate)](https://qiita.com/KenNagami/items/766d5f95940c76a8c3cd)でしたが、iOS13からは、[Scene-Basedライフサイクル(UISceneDelegate)](https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle)が使えるようになりました。Xcode11に実装して動きを調べてみたので、図にしてみました。

# Scene-Basedライフサイクル(ios13以降)
大きな考え方は、ios12のApp-Basedライフサイクルとそれほど変わらなさそうです。
以下の図の赤色部分は、AppDelegateのメソッド、黒色の部分は、SceneDelegateのメソッドです。

フォアグランドに遷移する時には、以下のメソッドが呼ばれます。
- func sceneWillEnterForeground(UIScene)
- func sceneDidBecomeActive(UIScene)

バックグランドに遷移する時には、以下のメソッドが呼ばれます。
- func sceneWillResignActive(UIScene)
- func sceneDidEnterBackground(UIScene)

<img width="700" alt="20190927-ios13-scene-lifecycle.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/feaf6a1d-03db-9bd9-a33e-cdc636176433.png">



# App-Basedライフサイクル(参考)
<img width="500" alt="20190606-ios-lifecycle.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/8a11f2af-debe-e59e-3a35-82edc40ffd3f.png">


# 参考文献
- [アプリケーションライフサイクル(Managing Your App's Life Cycle)](https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle)
- [UISceneDelegate](https://developer.apple.com/documentation/uikit/uiscenedelegate/)

- [アプリ起動時の実装(Responding to the Launch of Your App)](
https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app)

- [アプリフォアグランド移行時の実装(Preparing Your UI to Run in the Foreground)](
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_foreground)

- [アプリバックグランド移行時の実装(Preparing Your UI to Run in the Background）]
(https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background)

- [iOS13以降のシーンの概要(Scenes)](
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/)
remot3.itで外部から自宅マシンにリモートログイン

[remot3.it](https://remote.it/)を使って以前[自宅マシンにSSH接続](https://qiita.com/kojiisd/items/5ccc14098ba34fb508ce)しましたが、今回は自宅マシンに外部NWからリモートデスクトップをしてみたいと思います。

手順はこちらにあるので、参考にしています。

https://docs.remote.it/guides/applications/remote-graphical-desktop-access/using-remote-desktop-connection

ちなみに今回は以下の構成を試します。

外Android　→　remot3.it　→　自宅内Mac

# remot3.itのアップデートとSSH接続の設定

自宅のRaspberryPiにインストールしてあったremot3.itは古いので、一旦アップデートをかけます。

```sh
$ sudo apt update
$ sudo apt full-upgrade
```

結構時間がかかりましたが、エラーなく終わるはずです。

あとはこちらの手順通りセットアップをして、SSH接続ができるようにします。

https://docs.remote.it/guides/applications/remote-graphical-desktop-access/using-remote-desktop-connection


# AndroidからのSSHトンネリング＆VNC

あらかじめMac側の画面コントロールの許可をONにしておきます。（VNCのパスワード設定は現在しなくて良いようです。（すると接続ができなくなるみたい））

![Screen Shot 2019-06-07 at 0.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/670d7d0a-721f-27ca-b7da-2d12cc8bdf88.png)

## Androidにアプリのインストール
最終的にSSHトンネリングを実施してVNC接続をしたいので、[Termux](https://play.google.com/store/apps/details?id=com.termux&hl=ja)をインストールしました。

Termux内で、remot3.it上で取得したSSH接続のURLとポートを利用します。

```sh
$ ssh -L 15901:192.168.11.58:5900 -l pi proxyXX.rt3.io -p XXXXX
```
15901はAndroidがVNC接続する際のポート、192.168.11.58は自宅LAN内のMacのIPアドレス、5900はMacのVNC接続用ポートです。上記でRaspberry Piに接続、トンネリングできることを確認します。

その後、VNCにてAndroidからアクセス。

![Screenshot_20190602-224446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/91a8d79b-3b10-7a3f-336e-ba904f340258.png)

無事アクセスできました。


# まとめ
ご利用は計画的に。
ソフトウェア設計について考える

`この記事には、ソフトウェア開発を経験した中で得たこと・感じたことを備忘録として残す。`
`読みやすい文書でもないし、正解が書いているわけではない。`

##ソフトウェア設計とは何か
###アーキテクチャ設計
要件定義フェーズで決定された機能仕様/非機能仕様を実現するために、ソースコードを記述する必要がある。
この時、無秩序にソースコードを記述してしまうと、複雑度・凝集度・結合度が悪化して品質悪化し、保守性も低下する。
これを避けるためにはアーキテクチャ設計を行い、ソースコードの世界に秩序をもたらす必要がある。

###詳細設計
こと日本においては、詳細設計の実施が重要視されている。
以前は、フローチャートやPADを丁寧に記述し、その内容を徹底的に机上レビューし、不具合が作りこまれていないことを確認してから、コーディングを行っていた。
なぜか？
数台しかない端末、取り合いになるコンパイル用中央コンピュータといった限られたリソース下であるが故に、コーディング作業は最低限の時間内で終わらせる必要があった。
その名残ではないかと思っている。

現在も、詳細設計をきっちり終わらせてからコーディングに移ることが美徳であるとする傾向にないか？（特に大きな企業）
現代においてこの考えは捨てるべきである。
リーンのプラクティスである「決定をできるかぎり遅らせる」の考えに則り、設計の確定はできる限り遅らせるべきである。
これはなにも、「実装してから詳細設計書けばいいじゃん」と言っている訳ではない。
そんなものは無意味である。
必要なタイミングで、必要なレベルの設計を確定し、その設計とソースコードは矛盾ないか確認しながら進めるべきである。

##設計とは何か
ここではソフトウェアという狭い世界から一歩引いて、設計（Design）とは何かということを考えてみたい。
その知見から、改めてソフトウェア設計では何をすべきなのかを考えたいのである。

###Design
設計は英訳すればDesignである。
Designと言ってぱっと連想したのは「グラフィックデザイン」であったので、これを考えてみる。

以下は、学生時代に書いていた小説(いまで言うラノベ)のタイトルロゴを友人に作ってもらったものである。
![alt](http://childs-heart.kill.jp/common/logo_01.png)

要求としては「どのような作品であるか」を伝えた程度だったと思う。
これを受けた友人がデザインを考案するにあたり、事前に色々なことを考えたのではないかと推測する。
「この小説は剣と魔法の世界だから、鋭利なイメージが良いのでは」
「Genesis＝創世記ということは、古代的なイメージが良いのでは」
・・・
具体的な要求もなしに、よくここまで良いデザインを作ってくれたものだと感心しきりである。

さて、ここで友人は「Design」を決定するための事前準備として「Image」を描いている。
- 鋭利なイメージ
- 古代的なイメージ
とてもコンセプチュアルである。
これを私が事前に聞いていたかどうかは最早記憶に残っていないが、**レビューしていたとしたらOKと返事していたことだろう。**

一方で、「Detail」として
- フォントの種類は？
- 文字サイズは？
- Gの文字角度は何度？
なんてことは決めていないはずである。
これを私が事前に聞いたとしても、**良し悪しは答えられない。**

実際にPhotoshopを使って絵を描いているときには、フォント・サイズ・角度、長さ、、、などなどを**試行錯誤**したことだろう。
しかし手を動かす前にやったことは、おそらくコンセプチュアルなところを決めたに過ぎないはずである。
（私も絵描きの端くれだが、自分ならそうやって進めると思う）

### Software Detail Design
ソフトウェアの世界に戻ろう。
詳細設計を描くときに、フローチャートを正確に書くことは重要だろうか？
どこで変数を宣言して、どこで何を代入するのかを正確に書くことは重要だろうか？
私はそうは思わない。
それは最早、コーディングと何も変わらないのである。

コーディングの前にやるべきことは、コンセプトの確立と適切なレビューである。
要件に対して設計コンセプトが適切であることを、レビューアが評価できるために、必要な設計をすべきである。
クラス設計かもしれないし、DFDかもしれないし、タイミングチャートかもしれない。
色々なことをしないといけないビジネスロジックの上位メソッドは、アクティビティ図でシンプル化を図るべきかもしれない。

だがそれら「詳細設計を終えないとコーディングしてはいけない」ということではないと思う。
アーキテクチャ設計はソフトウェアの秩序なので、安易に変更してはならない。
しかし詳細設計は試行錯誤なのである。
コンセプトはしっかり固めておきたいが、ロジックはソースコードで書けばよいのである。
ロジックに不安があるなら、それを分かりやすい形に可視化して、だれかにレビューしてもらえばよいのである。

## 何のために設計をするか
構築から保守にいたる全ライフサイクルにおいて、不具合を埋め込まないためである。

アーキテクチャ設計はソフトウェアの秩序を明確にするために行う。
開発者は、定められたアーキテクチャに従う義務がある。

詳細設計は難しい。
私はソースコードの妥当性を「自分が確信し」「他人が賛同できる」ために行うのだと思っている。

`眠くなったので本日はここまで`
Virtual boxにUbuntu18.04LTSをインストールする際、Who are youでキーボード入力できなくなった時の確認事項

# Who are youでキーボード入力できなくなった時の確認事項
Ubuntu直前にインストール直前にユーザー名やパスワードを入力するときにキーボード入力が効かなくなりました。
以下ができていることを確認したら入力できました。

1. メモリサイズは足りているか？
3. ストレージのPrimary CDに適当なisoを挿入しているか？


1が一番大事な気がします。下の画像の通り、Base memoryは2048MBでしたが初期設定時の推奨は1024MBでしたので。

![memory_size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314457/c5df491e-51b7-dd82-8fe9-2740d843be18.png)

2については、自分がズボラなためStorageのContoller IDEのSecondaryのところに挿入していました。
写真はUbuntuインストール後の状態ですが、一番上に挿入してください。
あと、海外のサイトだとVM起動前にisoは挿入した方が良いみたいなオカルトも書いてありました。

![Controller IDE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314457/1d66b5a1-cbbc-aac3-1950-7bcee0de3af5.png)
goで atcoder の入力例実行の手間を省くツールを作った

## このページについて

atcoderの入力例をすべて取得し、指定された実行スクリプトに標準出力として渡すツールについて紹介しています

[repository](https://github.com/smith-30/acc)

ex.) 実行例
実物は、okだったら緑、errorだったら赤でプリントされます

```
$ acc atcoder -u https://atcoder.jp/contests/abc119/tasks/abc119_b -c "go run ./main.go"
start atcoder test v0.0.0-5780f7c (built with go1.12.1)

Case [0] exp: 48000.0
	ok!
Case [1] exp: 138000000.0038
	ok!
```

## 背景

atcoder の入力例をいちいちfileにコピペして下記のようにコマンド叩いていましたが
さすがに面倒になってきたので作ってみました

```
$ cat file | go run main.go
```

## 内容

### 設計思想

- サイトに迷惑をかけない
    - 最初の一回リクエストしたあとは、cacheを残してそこから取得するようにしました
    - $GOPATH/bin にdbが作られます

### 使い方

```
$ go get -u github.com/smith-30/acc
```

インストールしたらあとはatcoderの問題ページのurlと
テストケースを流したいスクリプトを渡すだけです

```
$ acc atcoder -u http://atcoder.jp/<problem path> -c "go run path/to/main.go"
```

### ライブラリなど

- cahceのdbは[pudge](https://github.com/recoilme/pudge/)というkey-valueのもの使ってます
- htmlのパースは[go-query](https://github.com/PuerkitoBio/goquery)
- cli のテンプレートには[cobra](https://github.com/github.com/spf13/cobra)使ってます

## その他

いろんなテストケースと予想されている出力パターンがあると思いますが
全てに対応しているかはわかりません。うまく使えないとかあればissueお願いします
よかったら使ってみてください。僕も使いながら改良していきます
Twitter API を使うための下準備 令和初頭版

例えば、煮物を作るレシピだと、じゃがいもや鶏肉の下ごしらえから書くのかどうか、ということ。下準備だけ載せるレシピがあるので、他で工夫ポイントがあるなら、他の記事に頼るのが効率的だろう。
そんなわけで、本記事はレシピでいうところの下ごしらえに終始する。

アカウントを作る
=

トップ画面からアカウントを作ろう。
すでにアカウントを持っている人はログアウトするか、シークレットモード等を使って、新しいセッションでアクセスしよう。
https://twitter.com

ボット用のアカウントを作る。gmailならエイリアスを使うのがオススメ。

<img width="607" alt="スクリーンショット 2019-05-27 9.47.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/b0b398b7-3d45-0d89-328e-8f28fb25207f.png">

上記のように、アカウント名の後ろに `+hogehoge`　とつけるだけ。そうすると、自分のメールアドレスを別名として使うことができる。

これで新しいアカウントができたと思う。

開発用に設定
=

新しく作ったアカウントに対して開発用の設定をしよう。

以下にアクセスする
https://developer.twitter.com/en/apps

`Making a bot` を選択し、NEXTを選択。
<img width="302" alt="スクリーンショット 2019-05-27 9.52.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/19981ec1-87cc-9cfa-e8fa-594b4d8a8cbc.png">

`Name` は自分さえわかればいいので、適当に埋める。その後も適当に進める。
<img width="607" alt="スクリーンショット 2019-05-27 9.47.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/394a5070-1c5f-e1c4-fff7-29821f3dc1ee.png">

途中で電話番号認証がはいる。普通に行えばいいが、 `+81` がつくので、最初の0をおとした電話番号を入力しよう。
SMSが届くので、それを使って認証しよう。

```
+81 9012345678
```

何に使うのかをきいてくる。適当に英文で埋めよう。
<img width="572" alt="スクリーンショット 2019-05-27 9.55.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/1b490bd8-9554-7322-0d99-c1bfaf66193f.png">

権限周りの話を聞かれる。単なるボットだと、全部 `No` でいいだろう。

<img width="461" alt="スクリーンショット 2019-05-27 9.57.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/a7ad5ef6-029e-373d-3908-8c54aa7b2ecc.png">

アプリの追加
=

以上が終わると、次のコンソールが表示される。
`Create an app` を選択する。

<img width="876" alt="スクリーンショット 2019-05-27 10.10.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/f751edb7-7108-0d3b-8725-1273bddb47f7.png">

アプリケーション名と説明をいれる。
説明は10文字以上でいいらしいので、適当にうめよう。

<img width="497" alt="スクリーンショット 2019-05-27 10.11.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/84627c0c-8509-b371-1730-0f842141089e.png">

やや面倒な項目たち。
特に認証とか使わないのであれば、適当なアクセス可能なURLを入力するのでいいと思う‥
（昔は `localhost` とかでも問題なかったみたい。今はアクセスできるURLでないとだめみたい)
OAuthを使う場合は真面目に入力する必要があるだろう。

<img width="485" alt="スクリーンショット 2019-05-27 10.11.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/d34f4abc-7054-8995-06df-1f63f7c12a2f.png">

Twitterへどんなアプリなのかを説明する欄。
100文字以上でやや面倒だが、必須項目なので、適当に埋めよう。

<img width="486" alt="スクリーンショット 2019-05-27 10.13.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/0c75effd-e1b3-5911-a28e-7bc3709248c4.png">

APIキーをゲット
=

これでようやくAPIキーを手に入れることができる。
`Keys and tokens` というメニューがあるので、ここでAPIキーをゲットしよう。

<img width="877" alt="スクリーンショット 2019-05-27 10.13.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142812/91a10e2c-8a9c-5076-cd1e-1d55187d8ee1.png">

以上でおしまい。
ここからはアプリ作って煮るなり焼くなり。