OmniAICreator/Qiita-1.07M huggingface dataset:
Test Data Builder Pattern の Builder を自動生成

僕の携わるアプリケーションの開発では、テストデータを Test Data Builder Pattern を用いて生成しています。データクラスと対になるように Builder クラスを実装するのですが、この Builder 実装を自動化したいと思います。

まず最初に、少しだけ Test Data Builder Pattern について触れてみます。

## Test Data Builder Pattern :construction_site: 
Test Data Builder Pattern は、Unit テストなどのテストデータを Builder Pattern を利用して生成する方法です。データクラスと対になるように Builder クラスを実装し、テストデータの生成は Builder クラスを通して行うようにします。

```kotlin:User.kt
data class User(val id: Int, val name: String)
```
```kotlin:UserBuilder.kt
class UserBuilder(private var id: Int = 0, private var name: String = "Atsushi") {

    fun build() = User(this.id, this.name)

    fun withId(id: Int): UserBuilder {
        this.id = id
        return this
    }

    fun withName(name: String): UserBuilder {
        this.name = name
    }
}
```
```kotlin:利用方法
val testUser = UserBuilder().withId(1).build()
```

この方法でテストデータを生成する**メリット**は

- コンストラクタ呼び出しによるデータ生成が乱立しない
- 必要なパターンに応じたテストデータの組み立てが容易になる

などが挙げられます。生成処理が乱立せず一箇所に集約できるため、データクラスの構造変更に強くなります。(データクラス構造の変更可能性が少ない場合は特に採用の必要は無さそうです)
一方で、**データクラスが多くなってきたりプロパティを多く持つデータクラスの Builder クラス実装は、かなりコストが掛かります**。

## Builder クラス自動生成 :robot: 
データクラスと Builder クラスは、「同一のプロパティを持つ」「build メソッドを持つ」「with メソッドを持つ」といったシンプルな関係になっています。この条件をもとに Builder クラスを自動生成できれば、**データクラスが多くなってきたりプロパティを多く持つ場合でも問題無く Builder クラスを作れそう**です。

Builder クラスの自動生成には [BuilderKit](https://github.com/atsushi130/BuilderKit) を利用します。Kotlin 用の Builder クラス自動生成ライブラリです。先程の User クラスを参考にします。

まずは プロジェクトに BuilderKit を追加して下さい。

```xml:pom.xml
<dependency>
    <groupId>com.github.atsushi130</groupId>
    <artifactId>builderkit</artifactId>
    <version>0.5.0</version>
</dependency>
``` 
次に自動生成クラスの書き出しディレクトリを作成します。プロジェクトのルートディレクトリに `generate/src` を作成して下さい。(書き出し先はデフォルトで `generate/src` ですが指定することもできます)

```bash
❯ mkdir generate/src
```
最後に `src/gen/kotlin` などに `Generator.kt` を作成して下さい。ここで自動生成対象のクラスを定義していきます。

```kotlin:Generator.kt
import builderkit.BuilderGenerator

class Generator {
    companion object {
        @JvmStatic fun main(vararg args: String) {
            BuilderGenerator.generates(User::class)
        }
    }
}
```
`BuilderGenerator#generates` は可変長引数で KClass を取るので複数のクラスを指定することができます。設定後に main メソッドを実行すると `generate/src` にデータクラスに対応した Builder クラスが生成されます。

自動生成される UserBuilder の形式は以下のようになります :baby_chick:

```kotlin
class UserBuilder(private var id: Int, private var name: String) {
    fun build() = User(this.id, this.name)

    fun withId(id: Int): UserBuilder {
        this.id = id
        return this
    }

    fun withName(name: String): UserBuilder {
        this.name = name
        return this
    }
}
```
自動生成後の Builder クラスは Primary Constructor のデフォルト引数が未設定の状態なので、任意の値を設定して下さい。
適切な package に移動すればテストデータ生成の準備完了です！

## 終わりに
仕様変更や修正に弱いテストコードを、実装コストを抑えつつ少しでも辛さを軽減できるようにして行きたいです。[BuilderKit](https://github.com/atsushi130/BuilderKit) への PR もお待ちしています :sparkles:
pandas入門した際に参考になった資料

最近pandasを使う機会があったので、参考になった資料をまとめておく。

# pandasのドキュメント

http://pandas.pydata.org/pandas-docs/stable/
多機能なのでドキュメントがたくさん

# 書籍「Pythonによるデータ分析入門」

https://www.amazon.co.jp/dp/4873116554
ちょっと古い部分もある。

# sinhrksさんのブログ「StatsFragments」

http://sinhrks.hatenablog.com/
大変わかりやすい。

http://sinhrks.hatenablog.com/entry/2015/01/28/073327
図で見るデータ連結のページは特によく見る。

https://speakerdeck.com/sinhrks/pyconjp-2016-pandas-niyoru-shi-xi-lie-detachu-li
時系列データ分析の資料も良かった。

# ゆるふわPandasチートシート

https://qiita.com/tanemaki/items/2ed05e258ef4c9e6caac
最初の頃に特によく見た。

# Modern Pandasシリーズ

https://tomaugspurger.github.io/modern-1-intro
読み始めたところ。一通り使えるようになった段階で読むと良い（気がする)
ThirdPersonControllerをベースにしたオリジナルキャラの移動とアニメーションの遷移

ThirdPersonControllerのインポート
![1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/9e842436-8e98-c7bd-9477-7278155717ff.png)
ThirdPersonControllerの表示
![1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/bb8359f2-7f5e-eef6-ee23-37c830afa65f.png)
ThirdPersonControllerの使わない部分の削除
![2.png](https://qiita-image-store.s3.amazonaws.com/0/214359/c4968470-8601-15bc-52d5-74a33dddce24.png)
プレイヤーにしたいキャラのインポート
![4.png](https://qiita-image-store.s3.amazonaws.com/0/214359/dc195234-33a5-f5f3-2f45-35aad645f3ef.png)
プレイヤーにしたいキャラの表示
![3.png](https://qiita-image-store.s3.amazonaws.com/0/214359/43b4b292-535c-1169-9890-f724517de021.png)
プレイヤーにしたいキャラの大きさの調整
![6.png](https://qiita-image-store.s3.amazonaws.com/0/214359/ed2a2589-ea20-4b19-1132-c6d3525d2de9.png)
AnimatorControllerの作成
![7.png](https://qiita-image-store.s3.amazonaws.com/0/214359/0c9a738d-a2e1-64fc-1a2d-c6db225e6d46.png)
AnimatorControllerの名前の変更
![8.png](https://qiita-image-store.s3.amazonaws.com/0/214359/2079b569-031c-dbd4-f7f6-b2aa72fbe6b7.png)
AnimatorControllerにアニメーションを移す
![9.png](https://qiita-image-store.s3.amazonaws.com/0/214359/87c6dfe8-9a56-5e5e-b3f4-8e2c4440fba3.png)
アニメーションの名前の変更
![10.png](https://qiita-image-store.s3.amazonaws.com/0/214359/894bf421-9d1e-d39a-a0c3-54dae6b0bbc9.png)
アニメーションを繰り返し動くようにする設定
![11.png](https://qiita-image-store.s3.amazonaws.com/0/214359/a4f2febf-284b-d09d-488a-893198b594c3.png)
Bool変数の作成
![12.png](https://qiita-image-store.s3.amazonaws.com/0/214359/f9467169-e100-1578-2128-c081cd4731f9.png)
Bool変数の名前の変更
![13.png](https://qiita-image-store.s3.amazonaws.com/0/214359/f507df3d-2427-b651-4f14-91ace9348822.png)
アニメーションの遷移の設定
![14.png](https://qiita-image-store.s3.amazonaws.com/0/214359/6c862fcc-605e-59f4-4dd9-47bc332ef5db.png)
アニメーションの遷移の条件の設定　待機→走り
![15.png](https://qiita-image-store.s3.amazonaws.com/0/214359/4bf82f2a-9f94-49c4-ccc9-b2241d6b0866.png)
アニメーションの遷移の条件の設定　走り→待機
![16.png](https://qiita-image-store.s3.amazonaws.com/0/214359/43691a0b-29a6-4dea-d2ac-20cd7545ad32.png)
AnimatorControllerの貼りつけ
![17.png](https://qiita-image-store.s3.amazonaws.com/0/214359/9c83a620-419b-1db2-49cb-52edb99cd176.png)

```Player.cs
using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{

    float h, v;

    Animator anim;

    void Start()
    {

        anim = GetComponent<Animator>();
    }

    void Update()
    {


        h = Input.GetAxis("Horizontal");
        v = Input.GetAxis("Vertical");

        if (v != 0f || h != 0f)
            anim.SetBool("isRunning", true);
        else
            anim.SetBool("isRunning", false);

        }

    } 
```
スクリプト貼り付けるオブジェクト：自分がThirdPersonCharacterの下に入れたキャラクター

こんな風に動きます♪
 ![Qiita](https://media.giphy.com/media/xT0xeANjEXbWUuHh96/giphy.gif)

[目次に戻る](https://qiita.com/takasaki19841121/items/55daf89bbd2e0998a16c)
Effective C# 社内勉強会 - #2 constよりもreadonlyを使用する

この記事は、[Effective C# 社内勉強会](https://qiita.com/ykoji1112/items/0fbb470d6e2242035bcd)において、参加者が疑問に思った点、質問があった点をまとめたものです。

新人と、プログラム経験年数3,4年目あたりの、あまり技術向上に興味のない人が参加するとどのようなことになるか、コーヒーでも飲みながら読んでいただければ。

また、これからEffective C# を読む人の一助になれば。

そして、参加者の備忘録として。


さて、Chapter2も2週に渡り、約4時間で読破。
コンパイル時定数、実行時定数がキモの話でしたね。

#####予習
Chapter1の反省？を踏まえ、Chapter2からは説明する人を当番制にしました。
ただ、個人の負担を大きくしたくないので、内容の区切りとなる約２段落分ずつ割り振ることに。



#####疑問点
- コンパイル時定数とは
- 実行時定数とは
- リテラル値とは
- 副作用
- readonly
- static
- shared(VB.NETの場合）
- コンストラクタとは
- デフォルトコンストラクタ
- インスタンス
- クラスメンバ
- インスタンスメンバ
- 静的定数とは
- アセンブリ境界
- シリアル化とは
    - バイトストリーム
    - テキストストリーム

#####感想
まだまだ基本知識の部分で、疑問点が発生しています。コンストラクタ知らなくてもプログラム書けるのね。
社内で開発されたフレームワークに乗っかってアプリケーションを開発しているとこうなるんです。

Chapter1に出てきた用語は理解できている様子。「バイナリ」等の用語で躓かなくなっています。

当番制に関して。自分の担当した部分は、やはり理解が深い。しばらくは、この方式で続けて行こう。


#####その他
ミスを発見した。
９ページ目の４段落目
”最も重要な違いは、readonlyキーワードが指定された値はコンパイル時に解決される。”
これ、
”最も重要な違いは、readonlyキーワードが指定された値は「実行」時に解決される。”
ですね。
利用している本は中古で買ったので、内容が古いんでしょうね。
ちなみに、Effective C# 初版
でした。
BitStarで利用しているXaaSまとめ [開発編]

# はじめに
BitStarのCTOの山下です。
前回の「BitStarで利用しているXaaSまとめ [オフィス編]」に引き続き [開発編] を書かせて頂きます。

# XaaSとは
っという方は前回の「BitStarで利用しているXaaSまとめ [オフィス編]」を見てください。


# BitStarで使っているSaaS
BitStarで採用しているSaaSを調べてみました。

* 全社向け
  * G Suite (旧 Google Apps for Business)
  * Microsoft Office 365
  * Slack
  * Sansan
* 開発向け
  * Wercker
  * New Relic
  * GitHub
  * ZenHub
  * MailChimp
  * Mandrill
  * Bugsnag
  * CircleCI
  * Code Climate
* デザイナー
  * Adobe Creative Cloud

こう見ると思った以上に多いですね。
大きく分けると、エンジニア系のSaaSと

## 開発向け
### Wercker
![Werckerとは](http://deeeet.com/images/wercker.png)
CI+Deployツールとして活用しています。
最近Oracleに買収されてしまいましたが、引き続き無料で使えるサービスです。
BitStarではGitHubのMasterブランチにリリースされると、
テストを自動で走らせて本番にDeployする所まで全て自動で行ってます。
### New Relic
![New Relicとは](https://dka575ofm4ao0.cloudfront.net/pages-transactional_logos/retina/283/bFIPWaH8SjeRNN1f2Y9g)
Amazon Cloud Watchとだいぶ重複しますが、プロセス単位の監視をするならこっちかなと。
無料範囲で使ってます。
### GitHub
言わずもがなGitHub。
BitStarではZenHubというExtensionと合わせて活用しています。
### ZenHub
GitHubをさらにパワフルに拡張する機能。
スクラム開発でのSprintを回せるのとBurndownチャートも生成されたりタスクの管理もできます。
機能的にはGitHubのissueをtrello的な表示＋管理できるのと。
GitHubのJIRA的機能が付いている感じです。
開発の全てがGitHubで完結するのでパワフルな機能ですが、
JIRAレベルの大規模開発には向かないかもしれません。
### MailChimp
![MailChimpとは](https://www.webmecanik.com/wp-content/uploads/mailchimp-logo.png)
メールマガジンのマーケティング、配信ツールの「MailChimp」です。
BitStarではメールの配信にMailChimpを使っています。
### Mandrill
![Mandrillとは](http://res.cloudinary.com/dfmjjtd8d/image/upload/c_scale,w_400/v1463435551/mandrill_etgfxg.png)
MandrillとはMailChimpと同じ会社が運営する別サービスです。
確認メールなど)。
### Bugsnag
バグ検出と通知
### CircleCI
CIツールです。
Werckerとかぶるだろうという話もありますが。
はい、そうなんです。
っというより正直WerckerからCircleCIに移動したいなと思いつつなかなかできてません。。。
### Code Climate
静的コード解析に追加います。
っといってもなかなか見れてないのが現状です。
## デザイナー向け
### Adobe Creative Cloud
![Adobe Creative Cloud](http://wwwlog.me/wp-content/uploads/2015/11/adobe-creative-cloud-large.png)
アドビシステムの開発するAdobe Creative Cloudです。
Photoshop, Illustrator はデザイナーには必須のサービスです。
以前は買い切りのサービスだったのですが、サブスクリプションに全部切り替わりました。
BitStarではその他にもPremiere Proも動画編集で活用してます。
C/C++からgnuplotでgifアニメーション


ちょっとした計算結果をアニメーションにしたいとき、テキストファイルや静止画ファイルが多量発生するのはあまりうれしくないですよね。
なのでプログラム中から直接アニメーションgifを生成する方法を検討してみました。

# C/C++からのgnuplot呼び出し
参考：[C言語でgnuplotを動かしてアニメーションを作る](http://www.eng.kagawa-u.ac.jp/~haruna/memo/gnuplot/gnu_anim.html)

必要な操作はこれだけです。

```C++
#include <cstdio>
FILE *gp = popen("gnuplot", "w");
```

あとはfprintf(gp, fmt, ...)でコマンドを流し込んでいけばOK。ofstreamにする方法もきっとあるんでしょうがここでは触れません。

# 座標の直接指定
参考：[gnuplotで直接座標を指定して点を打つ](http://setup.blog.so-net.ne.jp/2010-10-29)

いちいちテキストファイルを生成したくないときは、ファイル名に'-'を指定してからデータを流し込んでやります。最後に"e"の文字を送るとファイルの終わりです。あとの方の例で出てくるように

```gnuplot
plot '-', '-'
```

のように複数指定することも可能です。

# アニメーションgifのターミナル
参考：[gnuplotとアニメーション](http://slpr.sakura.ne.jp/qp/gnuplot-animation/)

```gnuplot
set terminal gif animate optimize delay 10 size 400,400
set output 'tmp.gif'
```

こんなふうにしてあとはplotコマンドを連発するだけです。

# 実例

```C++
#include <cstdio>
#include <cassert>

int main(){
    FILE *gp = popen("gnuplot", "w");
    assert(gp);

    fprintf(gp, "set terminal gif animate optimize delay 10 size 400,400\n");
    fprintf(gp, "set output 'tmp.gif'\n");

    fprintf(gp, "set nokey\n");
    fprintf(gp, "set size square\n");
    fprintf(gp, "set xr [0:15]\n");
    fprintf(gp, "set yr [0:15]\n");

    for(int j=0; j<10; j++){

        fprintf(gp, "plot '-' pt 5 ps 2, '-' pt 5 ps 2\n");
        fprintf(gp, "%d, %d\n", 1+j, 1+j);
        fprintf(gp, "%d, %d\n", 2+j, 2+j);
        fprintf(gp, "e\n");
        fprintf(gp, "%d, %d\n", 1+j, 2+j);
        fprintf(gp, "%d, %d\n", 2+j, 1+j);
        fprintf(gp, "e\n");
    }
    pclose(gp);

    return 0;
}
```

絵がださいのは仕様です。
![tmp.gif](https://qiita-image-store.s3.amazonaws.com/0/184542/380fdcd6-57dc-50f0-7760-c68cdd1439c1.gif "tmp.gif")
`find . | peco` が地味に便利

ただカレントディレクトリ以下の全ファイルをインクリメンタルサーチして標準出力に出すだけのコマンド。

```bash
$ find . | peco
```

ただそれだけなんだけど「ファイル名だけ部分的に覚えてる...」「あのファイルどのフォルダにあったっけ？」みたいな時に相対パスを取れるので記憶の補助ツールとして便利。
iTerm を使っていれば出力されたパスを Command キーを押下しながらクリックで開ける。

git にコミットされているファイルだけの方が良ければ以下。

```bash
$ git ls-files | peco
```

無理に peco の結果をパイプとかシェル芸で使う必要はなくて、カジュアルに検索のために使う peco も全然ありだと思う。
macOS High Sierra と VMware Fusion7 

macOS を Sierra から 高みを目指すべく High Sierra　にしたところ、VMware Fusion7 を起動すると Mac自体が落ちた。

## 解決方法

1. VMWare Fusion7のバージョンが 7.1.2 だったので、7.1.3にアップデート。
2. Mac を再起動
3. コマンドを実行　`sudo xattr -r -d com.apple.quarantine /Applications/VMware\ Fusion.app`
Git stash でバック・トゥ・ザ・フューチャーした話

ほぼ自分用メモ
次起こさないための戒めとして。

# 経緯

開発中

git stashして過去のソースを確認した
↓
git stash popで未来に帰る
↓
うっかりCtrl+zでUndoしてしまったので、Ctrl+yでRedoすることに

が、しかし<strong>エディタの設定上、Ctrl+yは1行削除</strong>になっているため・・・

歴史
`実装 ⇒ stash ⇒ pop`
↓ Ctrl+z
`実装 ⇒ stash（⇒ pop）`
↓ Ctrl+y
`実装 ⇒ stash ⇒ Ctrl+y`

お分かりいただけただろうか・・・

popの内容がそのまま消し飛んでしまったのである。

こりゃヘビーだ。

Ctrl+z連打で実装の部分をメモリから呼び起こせればよいのだが、
戻る確証が無い＆量が多かったためコマンドで解決することに。

# コマンド

コンソール上にstashのhashが残っていたので、それを利用

まずは、stashの内容をmerge
`git merge f846a79320cc54b348645a515dd158fc15a3569a`

mergeされているか確認
`git log`

```
commit f846a79320cc54b348645a515dd158fc15a3569a
Merge: 1370998 816884a
Author: momiji <hogehoge@fugafuga.piyo>
Date:   Thu Nov 16 14:37:37 2017 +0900

    WIP on hoge_branch: 1370998 イケてるcommitコメント

commit 816884ad654f564651b65165165c164a6487aaf7
Author: momiji <hogehoge@fugafuga.piyo>
Date:   Thu Nov 16 14:37:36 2017 +0900

    index on hoge_branch: 1370998 イケてるcommitコメント

commit 1370998ea849845f64d8465ee156184b4654f848
Author: momiji <hogehoge@fugafuga.piyo>
Date:   Thu Nov 16 10:20:24 2017 +0900

    イケてるcommitコメント

```

このままでは余計なものがcommitとして残されてしまうので、時間を逆戻し
`git reset HEAD^ --soft` * 2

巻き戻せたか確認
`git status`

```
$ git status
On branch hoge_branch
Your branch is up-to-date with 'origin/hoge_branch'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   apl/html/hoge/fuga/piyopiyo.html
```


万事解決
歴史に傷がつくことも無く元通りになりましたとさ。

前にも似たようなことをやらかしたときは`git reflog`を駆使して解消したのだけれども、
それより楽に直せる手段が欲しいなあということでちょっと考えてみた結果です。
【Github】複数のcommitを1個のcommitにまとめてプルリクの内容を修正する手順

一度プルリクを送ったが、さらに修正が発生した際にcommitをまとめてきれいにする手順の自分用メモ

# コミットを1個にまとめる

直前の2個のコミットをまとめる場合

## git rebase -i

```shell-session
git rebase -i HEAD~~
```

## rebase内容の修正

```
pick dd8397af8 カート追加のAjax化
pick 676ec47b6 カート追加のAjax化

# Rebase 7b445f35f..676ec47b6 onto 7b445f35f (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

上記のような編集画面が立ち上がるので、rebaseするコミットの先頭の `pick` を `s` に書き換える。
`pick` がそのままで `s` が直前のこコミットに含めるという意味。

```
pick dd8397af8 カート追加のAjax化
pick 676ec47b6 カート追加のAjax化
```

↓

```
pick dd8397af8 カート追加のAjax化
s 676ec47b6 カート追加のAjax化
```

上書き保存

## コミットメッセージの編集

編集して保存

## GithubにForce Push

GithubにForce Push


でプルリクが上書きされる。
過去問5

##データ解析基礎論 過去問5
[問題](http://peach.l.chiba-u.ac.jp/course_folder/oldEX5.pdf)
###Q1
~~~R
# data input
dat4 <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/dat_ex1_4D.csv")
dat2 <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/dat_ex1_2D.csv")
# plot
plot(dat2$medicine,dat2$BloodPressure,xlab = "medicine type",
     ylab = "Blood Pressure",col = c("skyblue","orange","green","yellow"))
~~~
![RplotWAA13.1.png](https://qiita-image-store.s3.amazonaws.com/0/210627/3877bdcf-9f08-dcfb-5d39-7178c8f8ba1b.png)


###Q2

~~~R
# data input
dat4 <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/dat_ex2_4D.csv")
dat2 <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/dat_ex2_2D.csv")
# plot
interaction.plot(dat2$gender,
                 dat2$medicine,
                 dat2$BloodPressure,
                 ylab = "blood pressure",
                 xlab = "gender",
                 type = "",
                 pch = c(19,19),
                 col = c("skyblue","orange"),
                 trace.label = "medicine")
~~~


![RplotWAA13.5.png](https://qiita-image-store.s3.amazonaws.com/0/210627/3d25ec09-232a-77dd-1ab0-d713e9af07ad.png)


###Q4

~~~R
# data input
dat4 <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/dat_ex4_4D.csv")
dat2 <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/dat_ex4_2D.csv",
                 stringsAsFactors = F)　　#factorをつけないようにする
sapply(dat2,class)　　#class確認
~~~
####Q4.1
~~~R
# data　molding
improved <- dat2[dat2$medicine == "improved",]
old <- dat2[dat2$medicine == "old",]
befor_A <- rbind(improved,old)
befor_A$medicine = factor(befor_A$medicine)  #factorにしないとプロットできない
befor_A.lm <- lm(BloodPressure ~ medicine,befor_A) 
summary(befor_A.lm)

# plot
plot(as.numeric(befor_A$medicine)-1,befor_A$BloodPressure,pch = 19,
     xaxt = "n",ylab = "blood pressure",xlab = "medicine",xlim = c(-0.5,1.5))
axis(1,c(0,1),label = c("improved","old"))
abline(befor_A.lm,col = "red")
~~~
![RplotWAA13.2.png](https://qiita-image-store.s3.amazonaws.com/0/210627/a0f1f3d6-b276-7556-a686-ebb8c7462471.png)


####Q4.2

~~~R
# data　molding
newX <- dat2[dat2$medicine == "newX",]
newY <- dat2[dat2$medicine == "newY",]
new2 <- rbind(newX,newY)
new2$medicine = factor(new2$medicine)
new2.lm <- lm(BloodPressure ~ medicine,new2)
summary(new2.lm)

# plot
plot(as.numeric(new2$medicine)-1,new2$BloodPressure,pch = 19,
     xaxt = "n",ylab = "blood pressure",xlab = "medicine",xlim = c(-0.5,1.5))
axis(1,c(0,1),label = c("newX","newY"))
abline(new2.lm,col = "red")
~~~
![RplotWAA13.3.png](https://qiita-image-store.s3.amazonaws.com/0/210627/d162191e-7f7a-e53b-9ff6-c18fc1e2ae80.png)


####Q4.3

~~~R
# data molding
newX_old <- rbind(newX,old)
newX_old$medicine = factor(newX_old$medicine)
newX_old.lm  <- lm(BloodPressure ~ medicine,newX_old)
summary(newX_old.lm)

# plot
plot(as.numeric(newX_old$medicine)-1,newX_old$BloodPressure,pch = 19,
     xaxt = "n",ylab = "blood pressure",xlab = "medicine",xlim = c(-0.5,1.5))
axis(1,c(0,1),label = c("newX","old"))
abline(newX_old.lm,col = "red")
~~~
![RplotWAA13.4.png](https://qiita-image-store.s3.amazonaws.com/0/210627/72b7ddb6-938f-120c-ddcd-dafd58a9fc42.png)
Chrome Headless - 2

When use Headless Browsers to take screenshots of a web page, the non-English characters might not be displayed correctly if no right fonts installed.

To fix this, we have to install special fonts.

# Fix Steps

## Copy TTF files to `/usr/share/fonts/east_asian`

You can get TTF files from a windows PC(`c:\windows\fonts` or so), etc. Rename TTC to TTF if needed.

## Restore Debian Font Cache

```bash
mkfontscale
# if this is not found, install it
# apt-get install ttf-mscorefonts-installer

mkfontdir

fc-cache -fv
```

## Refresh System

Call `. /etc/profile` or reboot.
簡単な漢字と語彙のFlash cardsをPythonで作成する

簡単な漢字と語彙のFlash cardsをPythonで作成する

# 概要
日本語を学ぶための漢字フラッシュカードプログラムで作成する。

# 環境
OS : Linux based
Terminal
Python 2.7
必須ではない : Intellij IDEAのPyCharm IDE

# インストール
python 2.7

# 使い方
プロジェクト全体をダウンロードするには、この手順に従います。

1. リポジトリの[コード]タブに移動します。
2. クローンまたはダウンロードをクリックします。
3. 提供されたURLをコピーします。
4. コマンドラインまたはターミナルアプリケーションを開き、リポジトリをコピーするディレクトリを入力します。 これは、ホームディレクトリのようなローカルファイルシステムのどこにでも置くことができます。

    ```
    cd ~/
    ```

5. リポジトリのURLをコピーします。 この場合、漢字フラッシュカードプロジェクトをクローンしたいので、URLは次のようになります。

    ```
    git clone https://github.com/evanhutomo/kanji-flashcard.git
    ```

6. kanji-flashcardディレクトリに移動し、クローンの状態を確認します

    ```
    cd kanji-flashcard
    git status
    ```

プロジェクトのダウンロードが完了しました。 コードを実行する前に、このプログラムを使用するためのシステムを紹介します。
実際には、このプログラムはあなたに3つの主要な特徴を与えています：

   1. データのCRUD（作成、読み取り、更新、削除）
   2. QUIZ（ローマ字と英語の語彙を推測してクイズを行う）
   3. 検索（新しい一意のデータを挿入するための検索データ）

プログラムを実行するには、端末を開いて /kanji-flashcardフォルダに移動します

```
python main.py
```

その後、プログラムはこのようになります

```
-------Kanji Flashcard v0.1---------
-------------M E N U----------------
---------type 'q' to close----------
(1) DATA
(2) QUIZ
(3) SEARCH
```

# 補足
  このプログラムはJSONをデータ構造として使用しているため、JSONの基本知識が役立ちます。

# まとめ
このプログラムはまだ開発中ですが、私はこのプログラムがJSONを使ってPythonに基づいた簡単なプログラムを作る方法を理解するのを助け、外国人が日本語を独学で学ぶのを助けることができれば幸いです。 バグが見つかった場合、または質問がある場合は私に連絡するか、この記事または私のGithubのページ[こちら](https://github.com/evanhutomo)にコメントをしてください。 プログラム全体がまだ完璧ではないかもしれない、まだいくつかのバグがあり、英語で書かれているので、私は不便をおかけして申し訳ありません。
Slackが完全日本語対応したってよ【APIへのPost用フォームも追加されたよ】

# はじめに
Slackが11月17日から完全日本語対応スタートってCTOが目の前で言ってたので試してみたよ。
年中日本語のカスタマーサポーターもいるってよ。

## 日本語設定の手順
### 手順１
**Preferences**を押して設定を開く
![スクリーンショット 2017-11-17 14.40.41.png](https://qiita-image-store.s3.amazonaws.com/0/141711/c7ad21a7-c410-d885-3061-a7c4e6542113.png)

### 手順2
**Language & Region**から日本語を選択してワークスペースを開き直す
![スクリーンショット 2017-11-17 14.44.56.png](https://qiita-image-store.s3.amazonaws.com/0/141711/17c5b009-7bd2-bd97-8a50-6a2567d018d4.png)

## 感想
英語のがカッコいいけど、日本語のが解りやすいから日本語で行きます

## 最後に
### **ジャップは日本語使おうぜ！**

## 詳細リンク
[公式](https://get.slack.help/hc/ja)
[公式ヘルプ](https://get.slack.help/hc/ja/articles/215058658-%E8%A8%80%E8%AA%9E%E8%A8%AD%E5%AE%9A%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
[関連記事](http://jp.techcrunch.com/2017/11/17/slack-japan/)

## あれ、Post用フォームは？
目の前でデモ見せられて超使いたい！紹介したい!って思ったけど、写真撮り忘れたのでまた今度
Webスクレイピングで電気料金を取得する（中部電力）

電気料金を取得してLINEとかで通知したいです。
情報が以下のWebにしかないので止むを得ずスクレイピングします。

[カテエネ（PC） | 中部電力が運営する家庭向けWEB会員サービス](https://katene.chuden.jp/)

#１ モジュールの導入
必要なモジュールをラズパイにインストールします。
カテエネがjavascriptゴリゴリなのでseleniumに加えてphantomjsも使います。

```bush
sudo apt-get install python3-lxml
sudo apt-get install python3-cssselect

sudo pip3 install selenium
sudo pip3 install phantomjs
```

#２ プログラム
以下の通りです。

```py3:sc.py
import lxml.html
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

#カテエネのサイトを開く
target_url = 'https://www.chuden.co.jp/home/index.html'
driver = webdriver.PhantomJS()
driver.get(target_url)

#ログインする
login_id = driver.find_element_by_id("loginId")
password = driver.find_element_by_id("password")
login_id.send_keys("ID")
password.send_keys("PW")
password.send_keys(Keys.RETURN)

#電気料金の照会ページへ移動
button = driver.find_elements_by_id("clubkatene-list-top-gn_data")
button[1].send_keys(Keys.CONTROL)
button[1].click()

#ページ下部、電気料金の表の値を取得
root = lxml.html.fromstring(driver.page_source)
date = root.cssselect("#tPastPerformanceTable th")
links = root.cssselect("#tPastPerformanceTable td")

#表示してみる
print("最新: "+date[6].text)
print(links[0].text)
print(links[5].text)
print(links[10].text)
print(links[15].text)
print(links[20].text)
print(links[25].text)
print(links[30].text)
print(links[35].text)
print(links[40].text)
print(links[45].text)
print(links[50].text)
print(links[45].text)
print(links[60].text)

#終了
driver.close()
driver.quit()
```

#３ 実行
結果：
<img width="581" alt="スクリーンショット 2017-11-17 13.53.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/183242/43fce462-4783-5420-231c-8151eb52d157.png">

取れました。



#４ 終わりに
・意外と簡単にできる割りには楽しい
・lambdaに上げて定期実行して電気料金API化すると良さそう
・スクレイピングはサービス妨害になり得るので一日一回くらいで
Kotlinで月の日数を求める


Calendarクラスの `getActualMaximum` メソッドを使うことで簡単に月の日数を求めることができます。
いままでタイムスタンプを一日毎に足していって、月が変わるまでループしてました。。。

```Kotlin
import java.util.*

fun main(args: Array<String>) {
    val calendar = Calendar.getInstance()
    val year = 2020
    val month = 2
    calendar.set(year, month - 1, 1) // 月の指定は0始まりなので注意
    val maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH)
    print("${year}年${month}月は${maxDay}日まであるよ")
}
```
プログラムをよく知らないプランナーはこんな勘違いをしている

こんにちは。
株式会社BitStarでWebディレクターをしているmakuriruiです。
普段は、YouTubeなどの動画に関するメディアの運営を行っています。
今回は、前職のゲーム運営で学んだことをお伝えできればと思います。
現在も、エンジニアとコミュニケーションを取るときに気をつけている話です。


##自分がしていたよくない勘違い


自分は、何度かエンジニアとコミュニケーションを取るときに衝突することがありました。
正直プランナーとして、ゲームのプログラムに関しての知識がほとんどなく、エンジニアの作業をいろいろと勘違いをしていたためです。

エンジニアは、プログラムに関して造詣が深いと思いますが、そうではないプランナーはこんなことを考えているということを自分の経験と合わせて伝えることができればと思います。


###このページと同じ感じに作ってという依頼は、コードをコピペすればいいものだと思っている


ゲームの新たな施策を考える際に、まずは以前行った同じような施策がどういう内容だったかを調べます。
そういった場合に、自分は日時や施策のなかで行うべき内容など内部のことはしっかり詰めていましたが、見た目に関しては、前と同じでいい感じにやっていればいいんじゃないかなという感じで進めていました。

結局同じようなことをするのは事実ですが、毎回の施策で細かい違いが出るのは当たり前のこと。
そこの調整を違う人に丸投げするのは、ナンセンスであるとよくわかっていませんでした。
結局は、実装の方法やUIデザイナーの意見とかで変わるものですが、デザインについて学ぶことたたき台までは出して、自分の意見を載せることは重要だと思います。
見た目を実装する際に甘い認識のプランナーがいれば、一回突っ返してみてもいいと思います。


###このキャラだけ違う設定を入れるには、そのキャラだけ例外処理をすればいいと思っている


プランナーって案外デバッグの手順とか軽視していることがあります。
１キャラだけ設定を変えてとかであれば、そのキャラだけちょっと変えてそのキャラだけ確認すればオッケーとか普通に思っていました。

何かを変えるときに周りに影響があること、そこまで考えてから行動するべきということは自分はなかなかできなかったです。
デバッグリストを作ったり、デバッガーとの対応をプランナーがすることがあると思いますが、間にエンジニアを通すことを面倒だけど徹底すべきです。


###前の段階に戻すのは簡単にできるものだと思っている


試しに入れてやっぱ戻すは多いこと。
自分は、リビジョンを戻せば大丈夫かというやばい感じで動いていました。

戻す時は確認すること・・・当たり前だと思いますが、プランナーは勝手に自分で考えて動くものと思った方がいいです。
ファイル共有ソフトについて、わからないことがあればエンジニアに相談させる流れを確認しておいた方がいいと思います。


###上の鶴の一声で変わるものだと思っている


プランナーって内容なんて軽く変わるもんだと思って進めてることが多いです。
ディレクターは、「ゲームはスクラップアンドビルドである」という精神をだいたい持っているからです。

エンジニアは、設計の段階からしっかりと作り上げているので、後々変わるとなって嫌な顔をされることは多かったです。
自分も嫌な顔したくなりましたけど、頑張って平静を保ってましたw

これはゲームという現場ではどうしようもないことだと思います。
ただ、この時間に見てもらうとか、見せてみたらいい反応だったという話をすると少しだけ減らせるようになりました。

プランナーの中でディレクターやプロデューサーのことが嫌いだったり、あまり関わりたくないという人も多いと思います。
自分もそうでした。
ただ、最終的にどっちがいいのかというのを考え始めてからこまめに動けるようになってきました。


##新人プランナーの動きをちょっとだけ変えるには


プランナーとして入る人間は、エンジニアの知識やデザイナーの知識など色々な知識が80%以上必要だと思います。
しかし、完璧にエンジニアとして動けるプランナーはそこまで多くないのも事実です。
違うことは違うと伝えること、工数を丁寧に伝えることでプランナーとエンジニアの齟齬は少しずつなくなっていくと思います。

そして、プランナーにわからないことは抱え込むのではなく、エンジニアに話してみるのも手だと伝えておくのもいいと思います。
（本当は自分で気づくべきですが、そうでない人もいるので・・・）

最後に個人的にエンジニアとの付き合いで意識が変わったのは、なんでもない日常会話の中で「あの仕事やばかった」とかプランナーのやばい話が出てきた時です。
もっとやらなきゃなと背筋が伸びましたw
Visual Studio を使ったリモートデバッグのやり方

## 2019年09月20日追記
「Visual Studio 2019」でも同様の方法でリモートデバッグできました。インストールするツール群を2019に置き換えて実施して下さい。

## 概要
手元のPCでは動いたけどいざ本番環境のPCでは動かない！本番環境のPCでデバッグしたい！といった時はリモートデバッグが便利です。
ですが、デバッグビルドしたアプリをリモートPCに配置する際にローカルと同じパスを再現する必要があり、少しとっつきにくいです。
そこで、プロセスをアタッチする方法で行うリモートデバッグがようやく自分の環境でできるようになったのでそのやり方を解説します。

## リモートPCの環境を整える

まずは「Remote Tools for Visual Studio 2017」をダウンロードします。下記リンクの下部にダウンロードボタンがあるので、32bitか64bitを選択してダウンロードしてください。**ここで選ぶのはリモートPCと同じものです。**
https://www.visualstudio.com/ja/downloads/?q=Remote+Tools+for+Visual+Studio+2017

次に、「Visual Studio 2017 の Microsoft Visual C++ 再頒布可能パッケージ」が必要なのでそれもダウンロードします。ここでも32bitか64bitを選択するのですが、**ここで選ぶのはデバッグしたいアプリケーションと同じものです。** 
PCが64bitでもビルドしたアプリが32bitの場合は32bitを使用します。
https://www.visualstudio.com/ja/downloads/?q=Visual+Studio+2017+%E3%81%AE+Microsoft+Visual+C%2B%2B+%E5%86%8D%E9%A0%92%E5%B8%83%E5%8F%AF%E8%83%BD%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8

上記2つをリモートPCにインストールして下さい。

## リモートデバッガーの初期設定
最初にリモートデバッガーの初期設定を行います。リモートPCで「Remote Debugger Configuration Wizard」を起動します。

ここはそのまま「次へ」を選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/212587/670f15e7-0d58-bb55-c05a-ac55b21ecc67.png)

ファイアウォールの設定です。上2つにチェックが入っていれば問題ないと思います。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/212587/566a3287-9fb9-7653-2cb0-46bde6c64f0e.png)

これで設定は完了です。
では「Remote Debugger」を起動しましょう。この画面が開いていれば待機状態です。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/212587/671dff33-d6f0-1105-5071-ec1f8f796bfb.png)

## アプリの配置
Visual Studioでデバッグビルドを行い、Debugフォルダを丸ごとリモートPCにコピーして起動しておきます。

## プロセスにアタッチ
Visual Studioを開き、**デバッグ** → **プロセスにアタッチ** をクリックします。
接続先の欄に、**[リモートPCのIPアドレス]:4022** と入力して「検索」ボタンを押して下さい。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/212587/535b1b77-618e-4335-b20c-f23b9fdfade6.png)

ポート番号はRemote Debuggerの既定の設定ですが、変更した場合はそちらのポートを使用して下さい。正常に接続できるとRDPと同じようにユーザー名とパスワードが聞かれるはずです。
正常に接続できると、リモートPCのプロセスがずらっと出てきます。その中で起動しておいたアプリケーションを選択し、「アタッチ」ボタンを押して下さい。

すると、ローカルPCでデバッグした時と同じような感じに切り替わると思います。これでリモートデバッグが開始されました。ブレークポイントを打ってみると、きちんと止まるはずです。
欠点として、コード修正するたびにビルドしたものをリモートPCに配置する必要がありますが、出力先を共有ストレージなどに設定しておくと少し楽になるかと思います。

プロジェクトのプロパティより、ビルドを選択し、出力パスを、リモートPCに用意した共有フォルダに設定すれば自動で配置されます。配置されたアプリケーションを起動し、プロセスにアタッチすれば大丈夫です。

他の開発者さんのデバッグに少しでも役に立てれば幸いです。
Git BashでSSHキーを生成する

# Git BashでSSHキーを生成
※Git Bashはgitをインストールすると使えます→[Git for Windows](https://git-scm.com/download/win)

``ssh-keygen``で生成
**※このときオプションで** `` -t rsa`` **（RSA暗号化方式）で生成すること**

```
sola@note-pc MINGW64 ~
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/sola/.ssh/id_rsa):
Created directory '/c/Users/sola/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/sola/.ssh/id_rsa.
Your public key has been saved in /c/Users/sola/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:2ddfgxrdAghKc***********************g21mAE3sdT4 sola@note-pc
The key's randomart image is:
+---[RSA 2048]----+
|    ..o=O+*oX=++o|
|    o+ +o+ X+*oo+|
～～～略～～～
|                 |
|                 |
+----[SHA256]-----+

sola@note-pc MINGW64 ~
$
```
<br>
``ssh-keygen``のhelp

```
sola@note-pc MINGW64 ~
$ ssh-keygen --help
ssh-keygen: unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       ssh-keygen -y [-f input_keyfile]
       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
       ssh-keygen -B [-f input_keyfile]
       ssh-keygen -D pkcs11
       ssh-keygen -F hostname [-f known_hosts_file] [-l]
       ssh-keygen -H [-f known_hosts_file]
       ssh-keygen -R hostname [-f known_hosts_file]
       ssh-keygen -r hostname [-f input_keyfile] [-g]
       ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
       ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
                  [-j start_line] [-K checkpt] [-W generator]
       ssh-keygen -s ca_key -I certificate_identity [-h] [-U]
                  [-D pkcs11_provider] [-n principals] [-O option]
                  [-V validity_interval] [-z serial_number] file ...
       ssh-keygen -L [-f input_keyfile]
       ssh-keygen -A
       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
                  file ...
       ssh-keygen -Q -f krl_file file ...
```
<br>
生成したSSHキーの強度を確認

```
sola@note-pc MINGW64 ~
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
2048 SHA256:Wej8Grz3/Px+**********+CjUtRtKd0QFSHPxz79Uk sola@note-pc (RSA)
```
<br>
RSAの1024bitsの鍵は使用するのはやめておいた方がいいみたいです
以下参考
- [お前らのSSH Keysの作り方は間違っている - Qiita](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
- [GitHubユーザーのSSH鍵6万個を調べてみた - hnwの日記](http://d.hatena.ne.jp/hnw/20140705)
CSSで赤い丸を作ってみる

##イメージ
<img width="25" alt="スクリーンショット 2017-11-17 13.54.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/94307/851437dd-1cfa-7119-360b-4a3ffd49cebf.png"><img width="26" alt="スクリーンショット 2017-11-17 13.59.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/94307/d85cca72-e7fa-514e-d301-811fb6edce11.png">

こんな感じで、丸の中に数字を入れる！

##コード

###HTML
```html:html
<p class="maru">{数字}</p>
```
今回はpタグで作ったけど別になんでもいい。

###style
```css:css
.maru{
    display: inline-block;
    width: 22px;
    height: 22px;
    border-radius: 22px;
    background-color: #e82a2a;
    color: #fff;
    text-align: center;
    line-height: 22px;
    margin-bottom: 6px;
}
```

サイズとか色は後で好きに変える感じ！（・ω・）/


色々色変更があるバッヂのように使うのであれば下記のように
ベースと背景色を分けてもいいかも

```css:css
.base{
    display: inline-block;
    width: 22px;
    height: 22px;
    border-radius: 22px;
    color: #fff;
    text-align: center;
    line-height: 22px;
    margin-bottom: 6px;
}
.red{
    background-color: #e82a2a;
}
```
WRF > WPS > namelistの設定 > Geogrid: Defining Model Domains > stand_lon, map_projなど

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS。

WPSで設定するnamelist.wpsについて。

## 関連

[WRF / WPS > namelistの設定 > truelat1 / truelat2](https://qiita.com/7of9/items/72f0860464a028611288)

### Geogrid: Defining Model Domains

[PDF資料](http://www2.mmm.ucar.edu/wrf/users/tutorial/200907/Basic/WPS-general.pdf)のpage13に「Geogrid: Defining Model Domains」の説明がある。

truelat1, truelat2については[こちら](https://qiita.com/7of9/items/72f0860464a028611288)で調べた。

> POLE_LAT, POLE_LON: Location of North Pole in WRF
computational grid (only for ‘lat-lon’)
> STAND_LON: The meridian parallel to y-axis

map_projの選択によってはpole_lat, pole_lonは不要のようだ。
PythonでQRコードを生成して直接Tkinterに表示する

PythonでQRコードを生成して直接Tkinterに表示する。

ファイルに保存せずに直接表示するには、PIL.ImageTk.PhotoImageが鍵でした。
ただし、Tkの初期化終了後じゃないと実行できないので注意。

```
pip install pillow qrcode colorama
```

```Python
#!/usr/bin/env python
# -*- coding: utf8 -*-

import sys
import tkinter as tk
import PIL.ImageTk
import qrcode #qrcodeを起動

msg = "Hello World"
w=800
h=500

def makeQR(s):
    qr = qrcode.QRCode(
        version=None, #QRコードの大きさ(バージョン)。Noneで自動設定(1～22)。数値指定しても必要なら自動で大きくなる
        error_correction=qrcode.constants.ERROR_CORRECT_M, #誤り訂正レベルL,M,Q,H
        box_size=3, #サイズを何倍にするか。1ならdot-by-dot(px)
        border=8,#認識用余白(最低4)
    )
    qr.add_data(s)
    qr.make(fit=True)
    return qr.make_image()

root = tk.Tk()
canvas = tk.Canvas(root,width=w,height=h,bg='white')

f = ('FixedSys, 14')
imgtk = PIL.ImageTk.PhotoImage(makeQR(msg))

canvas.create_image(w/2,h/2,image = imgtk,anchor = tk.CENTER)
canvas.create_text(w/2,50,text = "Header",font=f)
canvas.create_text(w/2,450,text = "Footer",font=f)
canvas.pack()

root.mainloop()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/e7271f19-a7a1-3547-5722-7e0d00a67e60.png)


以下のように書き換えると、ウィンドウサイズがぴったりになります。

```python
imgtk = PIL.ImageTk.PhotoImage(makeQR(msg))
canvas = tk.Canvas(root,width=imgtk.width(),height=imgtk.height(),bg='white')
canvas.create_image(0,0,image = imgtk,anchor = tk.NW)
canvas.pack()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/2ff3faba-4032-67d8-f8c6-1154a2c09b47.png)

#参考
[Pythonの「qrcode」を使ってQRコードを生成する](https://qiita.com/ak1procom/items/c9da5d5f1039adea9704)
[qrcode 5.3](https://pypi.python.org/pypi/qrcode)
[PythonのTkinterを使ってみる](https://qiita.com/nnahito/items/ad1428a30738b3d93762)
[【Python】Tkinterのcanvasを使ってみる](https://qiita.com/nnahito/items/2ab3ad0f3adacc3314e6)
[Python/Tkinter プログラミング講座 イメージとファイルの選択](http://bacspot.dip.jp/virtual_link/www/si.musashi-tech.ac.jp/new_www/Python_IntroTkinter/03/index-2.html)
[Tkinter (Canvas)の内容をPILでキャプチャ](http://boxheadroom.com/2009/05/29/tkinter-canvas%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92pil%E3%81%A7%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3)
リレーショナルデータベース（Postgresql）をAI開発に活用

# 企業内で、AI開発を目指す方に役立つ情報を発信する為に、自らが気付いたテクニカルなポイントに対して、備忘ログとして残すとともに、活用いただく為に公開します。

##１．本投稿の概要
　企業内のマスターデータの保管先であるリレーショナルデーターベースを有効活用し、AI開発を活性化させる。

##２．従来のAI開発イメージ
　・課題に応じて、マスターデータの保管先であるリレーショナルデータベースからデータ抽出し、CSVファイル化
　・作成したCSVファイルを、AI開発用環境上へ配置
　・Pythonのノウハウを使ってAI開発

##３．従来の課題
　・企業内で複数人がAI開発を行う場合、効率を考えDockerを利用するが、データ管理が複雑
　・データ抽出や、CSVファイルの配置などが手間
　・Pythonの勉強をして、データの前処理をプログラミングする必要

##４．従来課題の解決策
　リレーショナルデータベース上のデータを、Python上のプログラムから直接IOし、課題を解決
　・DockerコンテナのPythonプログラムから直接IOでき簡単
　・ネットワーク経由でIOする事で、Dockerコンテナーに関する複雑性を排除
　・従来のSQL文の知識を使って、レコード抽出、項目選択、欠損データ保管処理等が実施可能

##５．前提条件
　・リレーショナルデータベースとしては、OSSであり、私の周りでAI開発における利用実績が多い、Postgresqlを
　　使い紹介
　・各ソフトウエアのバージョンは、普段利用しているAIソフトウエアGRID社の"ReNom"を参考に決定
　・ドライバーに関しては、Webを検索した際の利用動向から独断で決定

##６．環境
　・kaggleのタイタニック号の生存者に関する情報をサンプルとして利用します。
　　下のデータ入手先のdataタグから”train.csv”をダウンロード
    [データ入手先](https://www.kaggle.com/c/titanic)
　・コンテナ環境外のネットワーク経由でIO可能なPostgresqlサーバーへ"titanic_train"
　　という名前でテーブルを作成
　・ダウンロードしたデータを事前にインポートしておく

　・コンテナ上のOS：ubunts 16.04 LTS
　・Python：3.6
　・pandas：0.20.3
　・psycopg2：2.7.3.2
　　（Pythonの）Postgresql用ドライバー
    [インストール方法](https://qiita.com/takahi/items/c9b7fc01cdccd4b7f661)

##７．サンプル・ソース
    #!/usr/bin/env python
    # encoding:utf-8
    
     # Postgresql 用のライブラリー"psycopg2"を用意
    import psycopg2
    
    # Pandasのリレーショナルデータベース用ライブラリを用意
    import pandas.io.sql as psql

    # Postgresqlサーバーへネットワークを経由して接続
    # コンテナ利用時にソースデータのフォルダーを意識する必要がない）
    con = psycopg2.connect("host=IPアドレス port=ポート番号 dbname=DB名 user=ユーザーID password=パスワード")
    con.get_backend_pid()
    cur = con.cursor()
 
    # 無処理の状態で、Pandasのデータフレームに読み込む。
    sql = """select * from titanic_train;"""
    df_train_org = psql.read_sql(sql, con)
    # 内容表示
    df_train_org

![titanic_train_00.png](https://qiita-image-store.s3.amazonaws.com/0/210958/92cac6ed-e4e7-526b-2a9e-480f53909149.png)


    # 分析に必要な項目のみSQL文を修正して、読み込む
    sql = """select passengerid, pclass, sex, age, sibsp, parch, ticket, fare, cabin, embarked from titanic_train;"""
    df_train_01 = psql.read_sql(sql, con)
    # 内容表示
    df_train_01

![titanic_train_01.png](https://qiita-image-store.s3.amazonaws.com/0/210958/3401f6d2-33c6-02e9-73ab-5bdbcf4204ee.png)


    # 重要な項目等に欠落があり、レコードを読み飛ばす場合、SQL文を修正して、読み飛ばす
    sql = """select * from titanic_train where age <> 'NaN';"""
    df_train_02 = psql.read_sql(sql, con)
    df_train_02

![titanic_train_02.png](https://qiita-image-store.s3.amazonaws.com/0/210958/ca3a5c68-2d8b-9beb-2cd9-ee8d1fa2246f.png)


    # 教師データ等を単独に、別のデータフレームへ読込事は簡単
    sql = """select survived from titanic_train order by passengerid;"""
    df_train_03_y =  psql.read_sql(sql, con)
    df_train_03_y

![titanic_train_03.png](https://qiita-image-store.s3.amazonaws.com/0/210958/3a7f6dca-3f13-f18d-39f3-b2852ca78c78.png)


## 作者：
### AIエバンジェリスト　前田　正重
　（伊藤忠テクノソリューションズ株式会社　エキスパートエンジニア）
Cent6 環境でIPベース帯域制御させてみる

社内のメールサーバーが会社のネットワークに突如300Mbps超の帯域を5分置きにかけ続けるようになりました。iftopから帯域を使っているIPを割り出して追跡してみると別部署で作ったWebメールのメール同期の仕組みらしい。
社内インフラ稼働にかかわる負荷をかけてくれたので出禁にしたかったですが、そうもいかない事情があり仕方なしにIPベースで帯域しぼることにしました。
tc の設定作成用ツールを使用させていただいてます。

https://github.com/matsumotory/qos-control

##### インストール
```
git clone https://github.com/matsumotory/qos-control.git
yum --enablerepo=epel install perl-Jcode perl-Class-Accessor
cd ./qos-control
sh ./setup.sh
```
##### 使用法
- Rule閲覧

```
./qos-control.pl --method=view --ip=<Server IP>
```
- テストrule 作成

```
./qos-control.pl --method=set --ip=<Server IP> --direction=out --traffic=64 --src=<source ip>

例）172.16.0.100 からサーバー192.168.100.100 へのトラフィックを64Mbps に絞る
./qos-control.pl --method=set --ip=<192.168.100.100> --direction=out --traffic=64 --src=172.16.0.100
*** old [192.168.100.100] settings ***
--------------------------
nothing
--------------------------

Setting ... OK

*** current [192.168.100.100] settings ***
------------------------------
CLSID->interface->eth0       direction->out        bandwidth->64Mbps     server_ip_port>192.168.110.112      src_ip->172.16.0.100
------------------------------
```
- 確認

iftop でみるとわかりやすい。ぶったぎるよりもソフトに抑え込む感じ。
なおプロセス単位で絞りたい場合は trickle を使ってみる手も。
Firebase Authによるパスワードリセットとメルアド変更

前回の記事の続きです。
https://qiita.com/miutex/items/f64dbcd2694cbc2daaf7

# 趣旨
- Firebase Authを使って前回はメールアドレスとパスワードによる認証を行いました。
- 今回はそれに続いて、パスワードリセット（パスワードリマインダ）とメールアドレス変更を行います。
- 事前準備が必要です。その辺りは前回の記事に書いてあります。既にやってあれば今回は楽ちん。

# パスワードリセット
パスワードを忘れた際に、メールアドレスを入力して送信するとリセット用のメールが来るあれです。

```objc:hoge.m
- (void)resetPasswordWithEmail:(void (^)(NSError *error))block
{
    [FIRAuth auth].languageCode = @"ja";
    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    actionCodeSettings.handleCodeInApp = YES;
    actionCodeSettings.URL = [NSURL URLWithString:@"hogefugapiyo://www.example.com/aaaaa/ccc.html"];
    [actionCodeSettings setIOSBundleID:@"com.fuga.piyo"];
    
    [[FIRAuth auth] sendPasswordResetWithEmail:_tf_email.text actionCodeSettings:actionCodeSettings completion:^(NSError * _Nullable error) {
        if(block) block(error);
    }];
}
```
で、これを実行すると、

<img width="300" alt="IMG_0110.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214400/673884df-bf1c-c245-1b88-87819096fae5.png">

メールが来ました。
メールが英語のままなのは、Firebase Consoleの方で日本語のところにも英文が入っていたためと後で判明。
パスワードリセットに限り、メールの本文もカスタマイズできるようです。

<img width="300" alt="IMG_0111.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214400/41733ae3-3fae-7f17-7255-64b8e03afdae.png">

パスワードリセット画面。Firebase側で用意してくれています。
SAVEを押すと設定したURLスキームでアプリに戻ります。

# メールアドレス変更
こちらはログインしているユーザーに対し、メールアドレスの変更を行いますので
事前にログインしておく必要があります。

```objc:hoge.m
- (void)changeEmail:(void (^)(NSError *error))block
{
    [[FIRAuth auth].currentUser updateEmail:_tf_email.text completion:^(NSError * _Nullable error) {
        if (error) {
            if(block) block(error);
        } else {
            [FIRAuth auth].languageCode = @"ja";
            FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
            actionCodeSettings.handleCodeInApp = YES;
            actionCodeSettings.URL = [NSURL URLWithString:@"hogefugapiyo://www.example.com/aaaaa/ccc.html"];
            [actionCodeSettings setIOSBundleID:@"com.fuga.piyo"];
            [[FIRAuth auth].currentUser sendEmailVerificationWithActionCodeSettings:actionCodeSettings completion:^(NSError *_Nullable error) {
                if(block) block(error);
            }];
        }
    }];
}
```
これを実行すると認証時と同様の確認メールが届きます。
違いは、変更完了時に変更前のメールアドレスに変更が完了した旨のメールが届くところですね。

<img width="300" alt="IMG_0112.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214400/dfca08c5-d2cc-ddc5-c4f6-e3e5ef30505b.png">

以上です
[Java]FizzBuzzCounter

これってJava的には「ワンライナー」と言って良いのでしょうか？

```java:FuzzBuzzCounter.java
    public static void main(String[] args) {
        LongStream.rangeClosed(1, Long.parseLong(args[0])).forEach(i -> System.out.println(((i % 3) == 0 ? "Fizz" + ((i % 5) == 0 ? "Buzz" : "") : ((i % 5) == 0 ? "Buzz" : i))));
    }

```
cx_Freezeでファイルサイズを抑える

# cx_FreezeのSetup.pyの注意点
- [Option](https://cx-freeze.readthedocs.io/en/latest/distutils.html#build-exe)
    - ポイント
        - packagesは使わない。includesを利用する。
        - excludesでいらないものを指定する。
- コンソールアプリの場合
    - excludes=["PyQt4","PyQt5"]を指定するだけで、30Mは減る。

```setup.py
import sys
from cx_Freeze import setup, Executable

copyDependentFiles = True
silent = True
base = None

packages = []
includes = ['re', 'webbrowser', 'urllib.parse']
excludes = ["PyQt4","PyQt5"]

# exe にしたい python ファイル
my_exe = Executable(script='hoge.py', base=base)

setup(
    name='Hoge',
    version='0.1',
    options={'build_exe': {'includes': includes, 'excludes': excludes, 'packages': packages}},
    executables=[my_exe]
)

```
SDAccelを用いた回路設計について　その２

前回の記事，[SDAccelを用いた回路設計について　その１](https://qiita.com/misaka0717/items/97651ec59a9336894c66)では，SDAccelのインストール法を紹介しました．

本記事では，引き続き，SDAccelの環境構築について紹介します．
#パッケージのインストール
SDAccelを使うには以下のパッケージをインストールしておく必要があります．

<pre>#yum install kernel-devel</pre>
<pre>#yum install numactl</pre>
<pre>#yum install redhat-lsb-core</pre>
<pre>#yum groupinstall "Development Tools"</pre>

#FPGAにファームウェアを書き込む
xbinstコマンドを実行することで，ホストコンピュータに接続されたターゲットボードのファームウェアとドライバファイルを生成することができる．以下のコマンドを実行して，XIL-ACCEL-RD-KCU1500カードのインストール用のファイルを準備します．
コマンドは，root権限またはsudo権限で実行する必要があります．

xbinstコマンドを使うために，最初に，環境変数を設定します．

<pre>#source /opt/Xilinx/SDx/2017.2/setting64.sh</pre>

次に，xbinstを実行し，KCU1500カードのインストール用のファイルを準備します．

<pre>#xbinst -f xilinx:kcu1500:4ddr-xpr:4.0 -d xil-accel-rd-kcu1500
****** xbinst v2017.2_sdx
**** Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
INFO: [XBINST 60-267] Packaging for PCIe...
INFO: [XBINST 60-268] Packaging for PCIe...COMPLETE
INFO: [XBINST 60-667] xbinst has successfully created a board installation
directory at /opt/xil-accel-rd-kcu1500.
</pre>

xbinstコマンドを実行すると，firmwareフォルダ内に以下のようなコンフッグレーションファイルが生成されます．


<pre>./xil-accel-rd-kcu1500/xbinst/firmware/
xilinx_xil-accel-rd-kcu1500_4ddr-xpr_4_0.mcs
./xil-accel-rd-kcu1500/xbinst/firmware/
xilinx_xil-accel-rd-kcu1500_4ddr-xpr_4_0_secondary.mcs
</pre>

このコンフィグレーションファイルをFPGAに書き込みます．

FPGAボードをホストコンピュータに接続し，以下に示す画像のように，構成します．
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/153905/5db64644-9d80-4069-b8a9-5092caa9a804.png)

上記の画像にあるように，JTAG書き込み機がない場合は，USBケーブルでも代用可能です．

ホストコンピュータの電源を入れ，Programming Computer上でVivadoを起動する．
Vivadoのメインメニューで，「Open Hardware Manager」を起動する．

Hardware Managerが起動したら，「Open Target」⇨「Auto Connect」を押し，Programming Computer上でFPGAを認識させる．

下記の画像にあるように，xcku115_0を右クリックし，「Add Configuration Memory Device」を選択する．
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/153905/8f7644ad-210e-450f-fe1d-a966797f6e10.png)

「memory Configuration Part」欄で，「mt25qu512-spi-x1_x2_x4_x8」を選択し，「OK」をクリックする．

「Program Configuration Memory Device」欄にて，「Configuration file」に「primary.mcs」，「Configuration file2」に「secondary.mcs」を指定する．
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/153905/71e40149-f0b8-9a85-0ef9-2ddc9e71f925.png)

各欄を埋めたら，「OK」を押し，FPGAのコンフィグレーションを行う．

FPGAのコンフィグレーションが終わったら，xcku115_0を右クリックし，「Boot From Configuration Device」を選択する．
tclコンソールにて，「Done pin status:HIGH」と表示されたら，FPGAのBOOTが成功しています．

ホストコンピュータを再起動する．

#FPGAボードのドライバをインストールする
SDAccelを実行する前に適切なドライバをインストールする必要があります．
先程xbinstコマンドを用いて生成したボードインストールディレクトリに移動しインストールスクリプトを実行します．

<pre>$cd /opt/xil-accel-rd-kcu1500/xbinst
$sudo ./install.sh
</pre>

lspciコマンドを実行すると，

<pre>lspci -v</pre>

以下のような結果が得られます．
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/153905/39f17c95-a8fc-e70d-3595-b2a72839522d.png)

FPGAへのコンフィグレーション，デバイスドライバのインストールは以上で終了です．
次回は，サンプルプログラムの実行方法について紹介します．

11/22 [SDAccelを用いた回路設計について　その3](https://qiita.com/misaka0717/items/c13b04a5d58ee4316005)
【ディレクター向け】成果物の品質を担保するために確認すべき項目

前回、[「【ディレクター向け】コーディングをお願いする前に共有・確認しておくこと一覧」](https://qiita.com/Shuny125/items/2d600d23bf8f0099599c)という記事を投稿しましたが、今回は**成果物に対しての確認項目**を書いていきます。

基本的には、非エンジニアの方でも確認出来るような内容になっているかと思いますので、ぜひ参考にしてみてください。
**※大前提として、提供している仕様書やデザインの通りになっているかは確認してください**

## HTMLバリデーターでエラーが出ていないか
https://validator.w3.org/
エラーが出ている場合は、許容として良いものかを確認する

## CSSバリデーターでエラーが出ていないか
https://jigsaw.w3.org/css-validator/
エラーが出ている場合は、許容として良いものかを確認する

## コンソールエラーが出ていないか
ブラウザの開発者ツールを開き、コンソールタブを確認する

## 文書構造が正しいか
https://chrome.google.com/webstore/detail/html5-outliner/afoibpobokebhgfnknfndkgemglggomo?hl=ja
見出し構造が正しく作られているかを確認する

## 共通部分がインクルード化されているか
- ヘッダー、フッター、サイドナビ
- 共通CSS、共通JS
- viewport、og:image
- アクセス解析タグ

※よくインクルードされる項目を抜粋

## パンくずに schema.org が適用されているか
http://schema.org/BreadcrumbList
パンくずに適用するのは割と一般的なイメージなので、入れておきたい

## strongタグを多用していないか
ただデザイン的に目立たせたい場合には、別のタグを使用すること
※設計の話でもある

## ネイティブのSNSシェアボタンを使用する場合、非同期処理になっているか
http://webshufu.com/make-page-loading-time-short-by-asynchronous-communication-and-setting-javascript-in-footer/
※参考サイト

## altが正しく入っているか
画像の中にテキストが入っている場合は、そのテキストが入っているか、
それ以外の場合は、意味が通じるテキストが入っているかを確認する

## ファビコンがマルチアイコン化されているか
https://ao-system.net/alphaicon/

## 画像がボヤけてないか
ブラウザで正しいサイズで表示されているかを確認する

## ページ描画時の挙動に問題がないか
ページを開いた瞬間にカクツクことがないかを確認する

## モバイル フレンドリー テストで確認して問題が無いか
https://www.google.com/webmasters/tools/mobile-friendly/
合格評価が出ることを確認する

## PageSpeed Insightsで確認
https://developers.google.com/speed/pagespeed/insights/
「画像の圧縮」「キャッシュの活用」は、ウェイトが大きいため対応しておきたい

## デザイン以外の形に変化した際に崩れないか
よくある事例として、
デザイン上では3個並んでいる要素が実際のページでは4個になった場合や、テキストが1行から複数行になった場合など、考慮されてないために崩れることがある。

そのため、要素数やテキスト量の増減があり得るものは、開発者ツールで増やしたり減らしたりして崩れないかを確認する
**※実際のページでも要素数が変わらない場合でも、今後ページが増えた際に必要となる可能性があるので確認しておいた方が良い**

## まとめ
全ての確認項目をリスト化させるのは、なかなか難しいのですが、
筆者が**最低限忘れずに確認する項目**をまとめてみました。

出来る人には当たり前すぎる項目もあったかと思いますが、
**確認漏れの可能性はゼロにならない**ので、このように必ずチェックリストにしておく癖をつけておくと良いと思います。
Sleep SortをRxJSで書いた

ちきさんです。

画期的なソートと言われている **Sleep Sort** が社内で話題になったので勢いで書きました。
(出典: [常識を覆すソートアルゴリズム！その名も"sleep sort"！](http://d.hatena.ne.jp/gfx/20110519/1305810786))

デモ → http://jsbin.com/faloraz/7/edit?js,console

コードはたったこれだけです。

```js:sleepsort.js
const array = [2, 4, 1, 5, 3]

Observable.from(array)
  .flatMap(x => Observable.of(x).delay(x * 100)) // xが2なら200ms後に次に流す。
  .toArray()
  .subscribe(console.log)
```

ちなみに`flatMap`は`mergeMap`の[エイリアス](https://github.com/ReactiveX/rxjs/blob/c7cfe444642407f3227a09a0cdf38fd495b867e1/src/add/operator/mergeMap.ts#L6)です。

このときの出力は下記の通りです。

```
[1, 2, 3, 4, 5]
```

確かにソートされていますね、素晴らしいです。
Mac で Cyberduck のブックマーク (接続先情報) をバックアップする

# ０．はじめに

基本的にデータは全部クラウドにバックアップする様にしていますが、
そういえば、
Cyberduck の設定をバックアップしていなかったなぁ、と思い、
やってみました。

# １．事前準備

※特に無し。

# ２．プログラム

1. バックアッププログラム (.command)

```bash:Cyberduck_exportBookmarks.command
#!/bin/bash

# --1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
 
# ==============================================================================
# Cyberduck_exportBookmarks.command
#   …Cyberduck の Bookmark をエクスポートする。
# ------------------------------------------------------------------------------
# 「[Mac] FTP クライアントアプリ Cyberduck のブックマークデータ移行方法 ｜ memocarilog」
# <https://memocarilog.info/mac/8144>
# 「help/en/faq – Cyberduck」
# <https://trac.cyberduck.io/wiki/help/en/faq#Preferencesandapplicationsupportfileslocation>
# 「MacのAutomatorでシェルスクリプトを.appアイコン化してダブルクリック実行 | EasyRamble」
# <http://easyramble.com/mac-automator-shell-script.html>
# ・Cyberduck_exportBookmarks.app
# ==============================================================================
 
cd $(dirname $0)
 
MyDir=`pwd`
MyFil=${0##*/}
CyberduckLibDir=${HOME}/Library/Group\ Containers/G69SCX94XU.duck/Library/Application\ Support/duck/
TgtDir=Bookmarks
ZipFil=${MyDir}/${MyFil}.zip
 
YYYYmmddHHMMSS=`date +"%Y%m%d%H%M%S"`
 
#echo ${MyDir}
#echo ${CyberduckLibDir}
#echo ${TgtDir}
#echo ${ZipFil}
 
#
cd "${CyberduckLibDir}"
zip -qr "${ZipFil}" "${TgtDir}"
#zip -vr "${ZipFil}" "${TgtDir}"
 
# --1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
```

# ９９．ハマりポイント

* 困ったところは、Bookmarks フォルダがどこにあるかわからなかったことですね。以下のサイトを参考にしたんですが、どうもフォルダが見当たらない？？？
    * [\[Mac\] FTP クライアントアプリ Cyberduck のブックマークデータ移行方法 ｜ memocarilog](https://memocarilog.info/mac/8144)
* ということで、こちらのサイトに記載されていました。
    * [help/en/faq – Cyberduck](https://trac.cyberduck.io/wiki/help/en/faq#Preferencesandapplicationsupportfileslocation)
* で、
* 私は作成したシェルをログイン時に起動させたかったので、以下のサイトを参考に設定してみました。

# ＸＸ．まとめ

よかったら使ってみて下さい。

それでは♪