OmniAICreator/Qiita-1.07M huggingface dataset:
Excelで効率よく作業するためにしたこと

# 背景
現在新米エンジニアとして派遣先企業に出向しています。そちらでExcelを使用した設計書を作成することになりました。
**これが…噂に聞いてたExcel方眼紙設計書か…**などと思いながら作成しています。その中で、効率よく作業するために行った工夫をいくつかしたので紹介したいと思います。

# 環境
- Windows7
- Excel2010


# 実際にやっていること
## ①ウィンドウ表示は最大にしない
これはExcel2010までの問題でウィンドウというのは、アプリケーション自体のウィンドウのことではなくファイルごとのブックに対するウィンドウです。Excel2010までは複数ウィンドウでエクセルを開くことができません。Excelファイルをいくつ開こうとも、一つのウィンドウ内に収まってしまうのです。[MicrosoftのDeveloperにも記事がありました。](https://blogs.msdn.microsoft.com/office_client_development_support_blog/2016/12/19/excel2013-changes-to-sdi/)

同時に扱うファイルが多くなれば見にくくなり、ウィンドウを最大表示にしていると左右で違うファイルを扱うのが困難になってきます。そのためウィンドウは最大化しないほうが扱いやすくなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165191/1fd37dfb-8345-e288-d32a-3f1be7d32679.png)
Excel2010まではこのようにウィンドウを自由に並べることはできない。

## クイックアクセスツールバーの活用
自分自身も初めて活用したのがクイックアクセスツールバーです。ウィンドウの左上にある小さいボタン群のことです。
これの良いところは、登録すると**Alt+数字キー**のショートカットが使用できるということです。
「Excelのショートカットキーってたくさんあるからいらないのでは？」と思っていました。ですが、罫線の枠を削除する。や外枠だけ使用する。などのかゆいところに手が届くを実現してくれるのがクイックアクセスツールバーです。わたしは以下のように登録しています。

1. ウィンドウ整列
2. ウィンドウの切り替え
3. 外枠太罫線
4. 罫線なし
5. その他の罫線(セルの書式設定を開く)
6. 格子

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165191/36640ed9-5a9c-45e1-bd70-be8ada74fefe.png)
写真はExcel2013

①ウィンドウ表示は最大にしない　とウィンドウの整列は非常に相性がよく、Alt+1のショートカットキーで簡単に並び替えができるので重宝しています。比較したいファイル以外は一旦最小化しておいて並び替えするととてもスムーズに作業ができます。これを言いたいがためにこの記事を書いたといっても過言では無いです。

## 印刷設定を早めにしておく
今回作成しているのが設計書ということもあって、印刷して提出するということも想定しています。また、内容のチェックを行う際にディスプレイで確認するのと、手元に紙を置いて赤ペンでチェックをつけていくのとでは後者の方がやりやすいように思います。そのため、印刷することを意識して設計書を作成しています。
しかし、いくら印刷を意識していたとしても印刷設定を疎かにしてしまうとあとからレイアウトが崩れてしまいます。そのため、早めに印刷設定を行っておくのがよいかと思います。
おすすめは、拡大縮小の項目を**『全ての列を1ページに印刷』**にしておくことです。これで横幅めいっぱい使用した印刷ができます。

# 最後に
Excelで設計書を作成している企業はたくさんあると思います。なにかと便利なExcelですが、そもそもこのアプリケーションは**表計算ソフト**です。Excelが便利なのは百も承知ですが本質は忘れないようにしたいと思います。最後に一番伝えたいことを一言お伝えして終了したいと思います。

### Excelの設計書なんて滅んでしまえ！！
Swift 構造体

#構造体（struct）とは
**クラスと同様にカプセル化を実現する方法として提供されている機能。**

```swift

struct selfIntroduction {
    var name: String
    var age: Int
}

var all = selfIntroduction(name: "kunio", age: 21)

print("name: \(all.name)")
print("age:\(all.age)")
```

初期値がある場合インスタンスに引数を設定する必要はない。

```swift

struct selfIntroduction {
    var name: String = "kunio" 
    var age: Int "21"
}

var all = selfIntroduction()

print("name: \(all.name)")
print("age:\(all.age)")
```
イニシャライザについて
https://qiita.com/KunioTerada/items/1a7611924b8e97668c6f

## クラスと構造体の違い
大きな違いは２つある
- 参照型であるか
- 継承が可能であるか

クラスは参照型であり、継承ができる。
構造体は値型であり、継承ができない。

随時更新
MySQLバックアップ（に必要最小限な権限を付与した）ユーザの作成

MySQLデータベースのバックアップ（に必要最小限な権限を付与した）ユーザの作成

# 環境
| # | バージョン |
|:--|:--|
| OS  | CentOS Linux release 7.5.1804 |
| mysql  | 14.14 Distrib 5.7.24  |
| mysqldump  | 10.13 Distrib 5.7.24  |

# スクリプト

## MySQL8.0

MySQL8.0からはGRANTと同時にユーザを作成することができなくなりました。このため最初にユーザを作成(`create user`)してから、権限付与(`grant`)します。

```sql
# ユーザ作成
create user '<username>'@'%' identified by '<password>';

# 権限付与
GRANT SELECT, LOCK TABLES, SHOW VIEW, RELOAD ON <dbname>.* TO '<username>'@'%';

# 変更の反映
flush privileges;

```

## MySQL5.7まで

GRANT時に新規ユーザ作成も可能です。上述した手順(ユーザ作成ー>権限付与)も可能なので参考程度で。

```sql
GRANT
	SELECT,
    LOCK TABLES,
    SHOW VIEW,
    RELOAD
ON  <dbname>.* 
TO '<username>'@'localhost' 
identified by '<password>'
;
```

上記のスクリプトはホスト名部分に`localhost`を指定しています。これは同一サーバ上にあるMySQLからmysqldumpでバックアップを取得する前提です。バックアップを実行する端末とMySQLが配置されているサーバが異なる場合は、ホスト名(上記では`localhost`) の部分をバックアップ端末のIPアドレスにするか'%'を指定します。

# 参考

- [MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2.6 権限変更が有効化される時期](https://dev.mysql.com/doc/refman/5.6/ja/privilege-changes.html)
- [mysql8 grant user create - Google 検索](https://www.google.com/search?q=mysql8+grant+user+create&rlz=1C1CHBH_jaJP802JP802&oq=mysql8+grant+user+create+&aqs=chrome..69i57j0l3.8743j1j4&sourceid=chrome&ie=UTF-8)
- [MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2.3 アカウント名の指定](https://dev.mysql.com/doc/refman/5.6/ja/account-names.html)
サーマルプリンタで印刷する: 印刷サービス編

![DSC_5047.JPG](https://qiita-image-store.s3.amazonaws.com/0/58479/6a591f03-633d-1bd3-97f0-5ad3d04407b3.jpeg)

## 0. 前回までのあらすじ

サーマルプリンタをLinuxから印刷できるように[セットアップ](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)し、Raspberry Piから文字、画像を[テスト印刷](https://qiita.com/yuyakato/items/3309b0ede886c2698526)しました。
これまでの記事については『[目次](https://qiita.com/yuyakato/items/288962fbc39446644668)』をご覧ください。

## 1. 印刷サービスをセットアップする

Python、CUIツールから画像を印刷できるようになったので、今度はWebサービスとして「印刷サービス」を構築しました。
印刷サービスは、Docker、Python 3などを使って実装しています。ソースコードは https://github.com/nayutaya/thermal-printer/tree/master/service/printing を参照ください。

```text
# thermal-printerリポジトリをclone済みの場合は、以下の3行は不要です。
pi@raspi-3bp$ mkdir -p ~/repo/github.com/nayutaya
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/
pi@raspi-3bp$ git clone https://github.com/nayutaya/thermal-printer.git

pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/
pi@raspi-3bp$ git pull
pi@raspi-3bp$ git checkout service-printing-v1.0.0
pi@raspi-3bp$ git branch -v
* (HEAD detached at service-printing-v1.0.0) 2f45e48 Merge pull request #7 from nayutaya/issue#2_printing_service
  master 2f45e48 Merge pull request #7 from nayutaya/issue#2_printing_service

pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/service/printing/
pi@raspi-3bp$ ./build_image.sh
pi@raspi-3bp$ ./run_service.sh
pi@raspi-3bp$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                    NAMES
3798bbbc7239        thermal-printer/service/printing   "uwsgi --module=app …"   8 seconds ago       Up 6 seconds        0.0.0.0:3030->8080/tcp   thermal-printer_service_printing
```

印刷サービスの起動に成功すると、バージョン番号、日時などがサーマルプリンタから印刷されます。記事の先頭にある写真のうち、上の用紙がその印刷結果です。

## 2. 印刷サービス経由で印刷する

印刷サービスはWebサービスとして動作しており、`3030/tcp`（サーマルサーマル）で待機しています。`GET /`を送信することで動作を確認することができます。

```text
pi@raspi-3bp$ curl http://localhost:3030/
{"Service":{"Name":"Printing Service","Version":"1.0.0"},"Time":"2018-11-08T15:25:28.387769"}
```

`POST /print`に対して画像（PNG）を送信することで印刷することができます。

```text
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/service/printing/
pi@raspi-3bp$ curl \
  --request POST \
  --header "Content-Type: image/png" \
  --data-binary @hello.png \
  http://localhost:3030/print
{"Service":{"Name":"Printing Service","Version":"1.0.0"},"Time":"2018-11-08T15:25:06.839144"}
```

記事の先頭にある写真のうち、下の用紙がこのコマンドの印刷結果です。
JavaScript 再帰による実装例いろいろ

# 何
- 昔Haskellをみていた時に、ループなしで再帰だけでなんでもできるんだなーと思ってjsで色々実装した思い出が発掘されたので移設
- コメントのa -> [a] -> [a]みたいなやつは、Haskellの表現で、この場合、値と値の配列を渡すと値の配列が帰ることを表現している。
- 型の推移を最初に意識して実装ができれば、Javaなどでも役に立つのではと思った記憶があり。
- 業務のコードで勝手に再帰しばりをやっていたら失職するでしょう。

``` js
//***準備開始

//a -> [a] -> [a]
function con(v, ary) {
  return [v].concat(ary);
}

//(Ord a) => a -> a -> Bool
function max(a, b) {
  return a > b ? a : b;
}
//***準備終了

//最大値取得
//(Ord a) => [a] -> a
function getMaximum(ary) {
  if (!ary) {
    throw "error bad param.";
  }

  if (ary.length == 0) {
    throw "error empty.";
  } else if (ary.length == 1) {
    return ary[0];
  } else {
    var x = ary.shift();

    //再帰呼出し
    return max(x, getMaximum(ary));
  }
}

//値を指定個数繰り返し配列に
//Int -> a -> [a]
function replicate(n, v) {
  if (n <= 0) {
    return [];
  } else {
    //再帰呼出
    return con(v, replicate(n - 1, v));
  }
}

//配列の要素を先頭から取得
//(Num n, Ord n) => n -> [a] -> [a]
function take(n, ary) {
  if (n <= 0) {
    return [];
  } else if (ary.length == 0) {
    return [];
  } else {
    var v = ary.shift();

    //再帰呼出
    return con(v, take(n - 1, ary));
  }
}

//配列の要素を逆転
//[a] -> [a]
function reverse(ary) {
  if (ary.length == 0) {
    return [];
  } else {
    var v = ary.shift();

    //再帰呼出
    return reverse(ary).concat([v]);
  }
}

//２つの配列の要素をまとめて配列の要素に
//[a] -> [b] -> [(a,b)]
function zip(ary1, ary2) {
  if (ary1.length == 0) {
    return [];
  } else if (ary2.length == 0) {
    return [];
  } else {
    var v1 = ary1.shift();
    var v2 = ary2.shift();
    var v = [v1, v2];

    return con(v, zip(ary1, ary2));
  }
}

//配列に値が存在するか
//(Eq a) => a -> [a] -> Bool
function elem(v, ary) {
  if (ary.length == 0) {
    return false;
  } else {
    var x = ary.shift();

    if (v == x) {
      return true;
    } else {
      return elem(v, ary);
    }
  }
}

//テスト開始
var a = [3, 2, 5, 20, 4, 2];
var b = [1, 2, 3, 4];

//a.slice(0)は、配列の複製です。参照渡しでaの中身が変わらないようにしてます。

console.log(getMaximum(a.slice(0))); //20

console.log(replicate(3, 5)); //[5,5,5]

console.log(take(2, a.slice(0))); //[3,2]

console.log(reverse(a.slice(0))); //[2,4,20,5,2,3]

console.log(zip(a.slice(0), b.slice(0))); //[[3,1],[2,2],[5,3],[20,4]]

console.log(elem(5, a.slice(0))); //true

console.log(elem(999, a.slice(0))); //false

//step2

//配列の要素それぞれに関数を適用し、新しい配列を返す
//(a -> b) -> [a] -> [b]
function map(f, ary) {
  if (ary.length == 0) {
    return [];
  } else {
    var v = ary.shift();

    return con(f(v), map(f, ary));
  }
}

var a = [3, 2, 5, 20, 4, 2];

console.log(map(function(n) {
    return n * 2;
  }, a.slice(0))
); //[6,4,10,40,8,4]
```
人見知りなエンジニアの人間関係・社交術・人脈術  – Slack Skype ChatWork などの社内チャットでチーム・プロジェクト・会社の人と仲良くなるコツ

長いタイトル。軽い記事。

ここではSlackに例を絞る。


# GIVE & TAKE – とても大事な参考書

この本に寄ると、人と仲良くなるコツ、人脈術、人間関係術というのは、ただひとつに集約される。

それは「人と友だちになること」だという。

つまり打算は要らない。

[Amazon.co.jp： ＧＩＶＥ ＆ ＴＡＫＥ「与える人」こそ成功する時代 三笠書房　電子書籍 eBook: アダム・グラント, 楠木 建: Kindleストア](https://www.amazon.co.jp/dp/B00IRV39FM/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1de76e61-f34a-e143-f1ec-dee34f4f142c.png)

# エンジニアは他の人と協力して働く仕事だ

他の人と仲良く出来るかどうか、協力できるかどうかということは、仕事そのものの成果や、あなたの人事評価にも大きく影響する。

エンジニアに大事なのは技術力などのハードスキル。そしてそれ以外のソフトスキルだ。

このハードスキルとソフト組み合わせの重要度は、社風や業務内容によっても違ってくると思う。

だけどソフトスキルが全く必要ない職場や仕事というのはまず稀で、ほぼ存在しないと言っても良い。

# 飲み会や勉強会への参加は要らない

人脈を広げたり、人間関係のために、出たくもない飲み会や、勉強会へ参加するのはやめよう。

どうせ飲み会や勉強会が嫌いなあなたが多少の努力をしたからといって、それがそもそも好きな人たちにはかなわない。焼け石に水だ。

好きこそものの上手なれ。嫌いはものの下手なれ。

それよりあなたがやりやすい方法を考えよう。

# 口頭の話やリアルコミュニケーションは要らない

テキストだけでも仲良くなることは出来る。

確かにリアルコミュニケーションに比べて情報量は落ちるかもしれない。
だけど「嫌いなリアルコミュニケーション」よりは「好きなデジタルコミュニケーション」の方がずっと良い。

僕の場合も、口頭で会社の人に話しかけるのがとても苦手だった。
だけど「口頭で話しかけばければ、人間関係は広がらない」と思い込んでいたフシがある。

だけど「Slack楽しいじゃん！」「テキストでもどんどん絡もう！」と悟ってからは、それを武器に、Slackベースで人と絡めるようになってきた。

# 好きから苦手を克服する。

いったんSlackで多少のコミュニケーションをとっておけば、口頭でも話しやすくなるという効果はある。

# 社内チャットで遊ぼう

雑談系のチャンネルや、技術系のチャンネルで遊んでみよう。

`#neko` チャンネルとか `#koke` チャンネルとか `#叫ぶ部屋` チャンネル `#typo` チャンネルとか、今僕が働いている会社にも、いろいろなSlackチャンネルがある。

「好きなチャンネル」「興味のあるチャンネル」選びには、時間をかけて良い。時間を掛けるだけの価値がある。

# 分報で遊ぶ

- 自分の分報を作って、書く
- 人の分報に絡みに行く

これだけで人と仲良くなれる。

会社で話したこともない人の分報にjoinしてみよう。今日が湧きそうであれば。

# 「ちょっといっぷく」 休憩中にスマホでSlackを開く

業務中、仕事に集中していると、なかなかやろうと思っても「他の人と仲良くなる」ということになかなか時間が割けない。

朝の集中力が高い時間帯は、集中力を要する仕事に当てたいし、逆に夕方にはエネルギーを消費しきっていて、とてもSlackで遊べるような状態ではない。

なのでスマホを片手に、休憩中にSlackで遊んでみる。

「ちょっといっぷく」はSlackの合図だ。

# プライベートでもSlackを開く

会社が終わってからも、あなたが抵抗さえ感じなければ、Slackを開いて遊んでみる。

僕の場合は「プライベートでも会社のことを考えるのかよ」というよりは「帰属しているグループの1個として、遊び場が確保されている」という感覚。


たとえばフレックス退勤で早めに仕事をあがった日に、カフェでお茶でもしながら社内Slackを見たりしていると、本当に業務を気にする必要がなくて自由だし、業務中には出来なかった好きなことをすることが出来る。

自分が好きな場所にいたり、とても心地良い時に社内チャットで遊ぶと、わりとなんだか楽しくなってくる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/75a760f4-665a-fa5d-6592-a564ee1bc681.png)


# それでも緊張する？ 話しかけづらい？

- コメントが無理なら絵文字リアクションだけ付けてみる。
- 何も書き込むことがないように思えても、興味のあるチャンネルや分報を定期的にチェックして「今なら行ける！」というのを試してみる。
- もし何も話しかけることがなくても、誰がどんな話をしているかだけは見ておく。興味が引かれるものがないかをキャッチしておく。いつかなにかのきっかけで、会話の糸口になるかもしれない。「興味を持った」時点で勝ちだ。

# 集中力・注意力の管理に気をつけよう

チャットツールは集中力、注意力を削ぐ。ご利用は計画的に。

- [Slackでの集中力管理 – Slack API で複数のチャンネルを一斉にミュート・ミュート解除する ( Rubyの例 ) - Qiita](https://qiita.com/YumaInaura/items/d5cac70e774cc07f76cc)
- [Slackでのチャンネル整理術 「ミュート+お気に入り」(注意力を大事にしよう) - Qiita](https://qiita.com/YumaInaura/items/52d4bd8c9f4d8eca0dd7)

# あわせて読みたい？

- [Slackでスレッド駆動分報 (社内チャット活用事例) - Qiita](https://qiita.com/YumaInaura/items/f3718f5f7fc2206e8ecb)
  - 工夫の痕跡。
- [Slack — 分報を、荒らしちまった悲しみに。(失敗談) - Qiita](https://qiita.com/YumaInaura/items/d4d6adfdf20234d14136)
  - そんなこともあった。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
json形式のリクエスト方法

# はじめに

必要な時に毎回ググるのでメモとして残しました。
随時、情報を追加して行きます。

```bash1
curl -i -X POST -H "Content-Type:application/json" \
-d '{"firstName": "Frodo", "lastName": "Baggins"}' \ http://localhost:8080/people
```

# References
https://qiita.com/takayukioda/items/edf371b3566bea64d046
Swaggerを記述するときのポイント

Swagger (Open API）3.0 がリリースされてから初めて使う機会があったので、自分なりの記述のポイントと、記述例をまとめました。

### ポイント

* リソースIDやリソースといった複数のAPIで使われるプロパティ・オブジェクトを `components/schemas` に定義する。
* リソースIDのようなリクエストには指定しないが、レスポンスには指定されるプロパティは `readOnly: true` で表現する。
* 個別取得APIでは返却されるが、一覧取得APIでは返却されないプロパティは、スキーマを分離して `allOf` を指定して共通のプロパティを定義する。
* ページングや検索などの複数のAPIで使われるパラメータを `components/parameters` に定義する。
* エラーレスポンスの形式が共通である場合は `components/responses` に定義し、エラーコードを `description` に表形式でまとめる。

### 記述例

[Gist - Swagger 3.0 Example](https://gist.github.com/unhurried/65be039436581b6a6124a5c53b890c43)

### 参考：エディタ

Swaggerを編集するときは、[Swagger Viewer](https://marketplace.visualstudio.com/items?itemName=Arjun.swagger-viewer)（Visual Studio Codeプラグイン）が、リアルタイムプレビューに対応していて、かつ動作も軽いため使いやすい。
html スニペットメモ

### input 属性

```html
<input class="c-search__textBox"
  type="text"
  spellcheck="false"
  autocapitalize="none"
  autocomplete="off"
  autocorrect="off"
  tabindex="0"
  placeholder="検索"
  aria-label="検索"
  aria-haspopup="false"
  role="combobox"
  aria-autocomplete="list"
  dir="ltr">

```

※参考: [Youtube](https://www.youtube.com/)の検索ボックス
初めてのQiitaなので色々試してみる。

#はじめに
ここでは主に備忘録を目的としてQiitaを利用いたします。筆者のプログラミング経験はほとんどありません。

##C#を選んだ理由
Unityを使うためです。
C#はプログラミングの習得レベルが比較的高いと言われていますが、動機が明確なので抵抗はないです。

##プログラミング経験
大学の時にCをやっていましたが、挫折した経験があります。当時プログラミングを取得したいという願望がそれほどでもなかったからだと考えています。


#Hello worldを表示させてみる(コンソール)
~~~C#
using System;

namespace ConsoleApp6 //名前はなんでも良い
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world"); //Hello world を出力する
            Console.ReadKey();//何かキーを押せばアプリ終了。
        }
    }
}
~~~

#出力結果
    Hello world

#画像
![Helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/307841/1b968cc6-33e8-7e29-b157-8f8a1ca88f17.png)


#感想
unityではコンソールではなくDebug Logを使います。
Markdown記法を使ったことないので、だんだん慣れていきます。
エクスペリエンサビリティとUIデザインの重要性

#まとめ
- エクスペリエンサビリティとはサービスをどれくらい(再び)使いたくなるかの指標。
- サービスを何度も使ってもらうためには、エクスペリエンサビリティを高める必要がある。
- 優れたUIデザインでサービスへの期待感を高めることは、エクスペリエンサビリティを高める手段の1つ
- （スタートアップ企業こそUIデザインで勝負するべき）

#はじめに
[UI GRAPHICS 新版](https://www.amazon.co.jp/%E3%80%90%E6%96%B0%E7%89%88%E3%80%91UI-GRAPHICS-%E6%88%90%E5%8A%9F%E4%BA%8B%E4%BE%8B%E3%81%A8%E6%80%9D%E6%83%B3%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E3%80%81%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%A8UX-%E5%AE%89%E8%97%A4-%E5%89%9B-ebook/dp/B07JGSJGBV/ref=pd_sim_351_1?_encoding=UTF8&pd_rd_i=B07JGSJGBV&pd_rd_r=19335bc8-e35d-11e8-8145-b54c864963e0&pd_rd_w=Rvpch&pd_rd_wg=Y4Mf5&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=b79503b3-46ea-4244-8b06-2f14c40a97b1&pf_rd_r=MM4E54D2QRXBDGC3YEXY&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=MM4E54D2QRXBDGC3YEXY)という本を読んで、UIデザインについてためになる知識があったので、自分なりにまとめてみました。
上記の（）の中は自分の考えです。
できるだけ平易な言葉使い＆自分なりの理解のため、正確でない表現があるかもしれません。

#エクスペリエンサビリティとは
![エクスペリエンサビリティ.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/268579/e13cdc84-5238-b8e9-02fc-bc6663beb498.jpeg)
**エクスペリエンサビリティ**とは、サービスに触れていないユーザがサービスを使おう、使いたい（もしくは再び使いたい）とどれくらい思うかの指標です。
似た言葉に**ユーザビリティ**があります。これはサービスを使っている時の使いやすさの指標です。
それぞれ正確に定義すると

**エクスペリエンサビリティ**・・・
サービスに向かっていないユーザが目標を抱き，目的が(再)発生するまでの有効性/効率/満足度/再現性と、その達成のためにサービスの利用に至るまでの有効性/効率/満足度/再現性

**ユーザビリティ**・・・
サービスを利用するユーザの目的達成までの有効性/効率/満足度

となります。

#サービスの継続的利用のためのUIデザインの重要性
大量の類似サービスが溢れる現代では、ユーザに「あのサービスを使ってアレがしたい」と何度も思わせる必要があります。（エクスペリエンサビリティのうちの再現性）

再現性を高める方法は2つあります。
- 内発的モチベーション喚起
- 低ストレスな外発的モチベーション喚起

外発的モチベーションはpush通知やメールなどのことです。あまり多いと逆にユーザが離れる原因になるため、ストレスとならないよう、できるだけユーザの日常のコンテクストに溶け込ませる必要があります。

内発的モチベーションを高める要因を**イネブラ**（後援者という意味らしい）と呼び、2つに分類されます。
- 感情的イネブラ
- 実存的イネブラ

実存イネブラの例としてはポイント還元や割引などがあります。
感情的イネブラの例としては優れたUIデザインをもつサービスの世界観から生まれる、そのサービスへの期待感があります。
**割引などをする体力のないスタートアップ企業こそ、UIデザインをつくりこみ、感情的イネブラで勝負することが求められるのです。**

#そもそものフィルタリングを突破するためのUIデザインの重要性
先述のとおり、現代では大量に類似サービスがあるがゆえに、ユーザは得た情報に対して無意識に**フィルタリング**を行なっています。
フィルタリングをパスして初めてユーザはサービスに関心を向けます。
そしてこのフィルタリングを突破するためにも、やはり優れたUIデザインが重要になります。
UIデザインから感じる世界観で、ユーザが望む情報があることを期待させるのです。

ユーザが望む情報があると期待させるには、有名メディアへの露出や新らしい技術なども有効です。
しかし、コネクションや資金力、技術力のないスタートアップは、まずこのデザインによる期待感で勝負することが求められるでしょう。


#感想
イケてるUIデザインは大事だ！
「えくすぺりえんさびりてぃ」って声に出したら噛みそう
router-linkで外部リンクも内部リンクも済ませてしまいたい時の対処法

https://github.com/vuejs/vue-router/issues/1280

上記英語質問サイトの丸パクリですが、対応する日本語記事が見つからなかったので、メモ代わりに投稿させてください。

## コード
```vue.js
<template>
  <component v-bind:is="linkProps(to)">
      <slot></slot>
  </component>
</template>

<script>
  export default {
    props: {
      to: {
        type: String,
        required: true,
      },
    },
    methods: {
      linkProps(url)
      {
        if (url.match(/^(http(s)?|ftp):\/\//))
        {
          return {
            is: 'a',
            href: url,
            target: '_blank',
            rel: 'noopener',
          };
        }
        return {
          is: 'router-link',
          to: url,
        };
      },
    },
  };
</script>
```

必要な箇所に毎回メソッドを書く方法もありますが、多用するようであればコンポーネントにしておいた方が使いまわしが楽かもしれません。
Swift プロトコル

# プロトコルとは
- クラスや構造体が特定の性質や機能を持つために必要なインターフェースを定義する機能
- インターフェースは型がどのようなプロパティやメソッドを持っているか示す
- プロトコルが要求するインターフェースを型が満たすことを**準拠**という

## メリット
複数の型で共通となる性質を抽象化できる

## 定義方法
protocolキーワードを使用して宣言し、{}内にプロパティやメソッドなどのプロトコルを構成する要素を定義

```swift

protocol SomeProtocol {}
```
## 準拠方法
型はプロトコルに準拠することにより、プロトコルで定義されたインターフェースを通じて扱うことが可能となる

```
struct 構造体名 : プロトコル名１, プロトコル名２... {
    構造体の定義
}
```
Node.jsのexportメモ

#1.使うタイミング

ファイルが違うモジュール(関数とか変数)を別ファイルから呼び出して使う

#2.別ファイルのモジュールを呼出す

##パターン①export.key=

↓呼び出される側のjs:huga

```javascript:utils.js

var foo = 'あいう';
var huga = 'えお';
exports.foo = foo;

```

↓呼び出す側:index.js

```javascript:index.js

var utils = require('./utils.js');
console.log(utils.foo);   // あいう←出る！
console.log(utils.huga); // undefined ←出ない…

```
fugaはexportに含まれていないので未定義扱い

##パターン②module.export = {foo}

↓呼び出される側のjs:huga

```javascript:utils.js

var foo = 'あいう';
var huga = 'えお';
module.exports = {foo,huga};

```

↓呼び出す側:index.js

```javascript:index.js

var utils = require('./utils.js');
console.log(utils.foo);   // あいう
console.log(utils.huga); // えお

```
Firefoxでプロキシを設定する方法

愛用のFirefoxでプロキシ設定を行った際のメモです。

1. メニューをクリック
2. オプションをクリック
3. ネットワーク設定の「接続設定」をクリック
4. 「手動でプロキシを設定する」を選択
5. HTTPプロキシに設定するIPアドレスを入力
6. ポートに設定するポート番号を入力
7. 「すべてのプロトコルでこのプロキシを使用する」にチェック
8. 「OK」をクリック

画像付きの解説はブログに載せていますので、良ければ見てください。
<a href="https://tsukasa-labz.hateblo.jp/entry/2018/11/08/233032" target="_blank">つかさラボのBlog@hatena</a>
続・ぼくのかんがえたさいきょうのReact+Redux+CleanArchitecture

 前回：[ぼくのかんがえたさいきょうのReact+Redux+CleanArchitecture](https://qiita.com/putan/items/55c2f6ae7dc656eaf6db)

## 前回のさいきょうパターンの検証結果
まずは前回のさいきょうパターンですが、会社内の勉強会で実装を進めて行ったところ、少し整理されてこのようになりました。
![clean4.png](https://qiita-image-store.s3.amazonaws.com/0/5514/5b80e831-5705-e472-3f54-1dba8dcaabc3.png)

- Entity（図中model）はExternal層で使えるようにImmutable.jsのRecordを使って実装
    - ReadOnly、副作用NGという意図
    - ○ React+Redux的には使いやすかった
    - × mutateメソッドで複製が作れてしまうため、"見るだけ"の意図を突破できちゃった
- UseCaseはredux-thunkを用いたThunkActionで実装
    - ○ CleanArchitectureを意識しないで作っていた頃に似た形で実装できた
    - × Storeの構造に依存してしまった
- re-ducks構造が合わなかったので廃止した
    - re-ducks構造ではaction/operationはreducerと一対だがここではそうならなかった
- selectorは無くならなかった
    - Reducerだけでは更新タイミングの違う複数の値を束ねた制御が管理しきれなかった
    - Reactコンポーネントからプレゼンテーションロジックを排除するのに大いに役立った
- Repository検証しきれず

### 検証結果
- Good
    - 小さめのアプリケーションでは「ビジネスロジックを分離する」という点においては十分な成果を出した
- Bad
    - そもそもCleanArchitectureは小さめのアプリケーションには冗長
    - ビジネスロジック（UseCase）にビュー側で採用したいライブラリ（Redux）が入り込んでいるため、UI刷新などには対応しきれない

## 新・さいきょう
さらにさいきょうを目指し、下記を踏まえて改訂版を作りました。
[試験実装はこちら](https://github.com/putan/react_redux_clean_sample)

- ビジネスロジックをビュー側のツールから切り離したい
- よーしパパTypeScript入れちゃうぞー 

![clean5.png](https://qiita-image-store.s3.amazonaws.com/0/5514/a5b6624b-b15a-da83-2d0e-dc9c32dd3fba.png)


### 主な変更点
- UseCasePortとしてInterfaceを利用する（あるべき姿！）
    - これによって依存関係を逆転し、Usecaseを保護
- ControllerとしてActionCreatorを使う
    - UseCaseを呼ぶ前後で複数のActionCreatorを呼びそうなのでthunkで実装

### 現在の自己評価
- Good
    - Reduxの立場が明確に
        - ビジネスロジックから抜き出せた！
        - InterfaceAdapter層に収まり、つなぎ役として明確になった（今の所）
        - **将来Reduxをやめたい**、という場合にも動きやすそう
    - みんな大好きre-ducks構成がはめやすい
- Bad
    - 今の所見当たらない！？
- Think
    - UseCaseInteractorはRepositoryを綺麗に分離する場合はクラス＋DI、そうでなければ関数という分けでやれそうか
    - この捉え方でInterfaceAdapter層にロジックが入らないようにできるのか


というところで、ご意見、ご感想、マサカリなどなど、コメントお待ちしております！

## まとめ
- React + Redux + TypeScript で[前回](https://qiita.com/putan/items/55c2f6ae7dc656eaf6db)よりもCleanになった構成を紹介
- Reduxの立場が明確になり扱いやすそうな構成ができた
- またもや仮実装を始めたばかりなので検証を続ける

## 参考文献
- [Clean Architecture　達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/dp/B07FSBHS2V)
- [クリーンアーキテクチャ(The Clean Architecture翻訳)](https://blog.tai2.net/the_clean_architecture.html)
- [リファクタリングして学ぶTypeScriptでクリーンアーキテクチャ](https://qiita.com/kotauchisunsun/items/ec6b4086abe670c478fe)
一文字目が勝手に確定されて、"kおんにちは"となるのを勝手に治す

# 一文字目が勝手に確定される現象

たまに、Chromeの拡張機能を使っていると、
勝手に一文字目が確定されて、`kおんにちは`と入力されてしまうことがあります。

> ちなみに、Slackの入力にも同じ現象がChrome64→65のバージョンアップの時に起きていたようです。

その原因は"Quill"というRich Text Editor Moduleの可能性があります。
日本語の入力ができないと、素晴らしそうな拡張機能を諦めてしまいますが、
一手間で使えるようにしちゃいましょう。

# 解決法：Quill を勝手にバージョンアップ

一文字目が勝手に確定される現象の原因を調べられている方がいらっしゃって、
サイトにまとめてくれていました。http://var.blog.jp/archives/74792986.html

Chromeの拡張機能をインストールすると、以下のようなディレクトリが作られています。
Windowsでは、`ユーザのホームディレクトリ / Appdata / Local / Chrome /（省略）/ 対象の拡張機能のディレクトリ`
その中にあるQuillを見つけて、バージョンアップしてしまえば治るかもしれません。

例として、このアプリ

> TabText. Synchronized notepad in each new tab
> https://chrome.google.com/webstore/detail/tabtext-synchronized-note/nfbkjfalikjfepompedddljmjoonmgla

このアプリでは拡張機能のフォルダの中に、`quill.min.js`のような実体を見つけることができました。

Quillの公式サイト（ https://quilljs.com/ ）から、Direct Downloadで、最新版のモジュールをダウンロードしてきます。
そして、拡張機能の中のファイルを置き換えたら、入力できるようになりました。
めでたし。

# ただし

Quillの実体を見つけづらい場合には、この方法は使えないとおもいます。
あまり詳しくないのですが、拡張機能の作成にWebpack？を使っているものでは、見つけることができませんでした。

以上です。
論文まとめ：Learning Discriminative Reconstructions for Unsupervised Outlier Removal

# はじめに
Y. Xia らの 
[1] "Learning Discriminative Reconstructions for Unsupervised Outlier Removal"をまとめてみた。

ICCV 2015にacceptされた論文なのでかなり古いが、最近読んでる論文のrelated workによく出てくるので、とりあえずまとめ。

CVFの論文リンク
https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Xia_Learning_Discriminative_Reconstructions_ICCV_2015_paper.pdf

# 概要 
1. autoencoderを用いて画像のデータ群から外れ値を取り除くモデル 
2. まず再構築誤差を用いて正常値と外れ値をざっくり分離する
3. ざっくり分離された正常値を用いて再構築誤差を最小化させるよう学習し、分離精度を上げる
4. ２と３を繰り返すことで外れ値を取り除いていく

以下の[1]Figure 1 で説明すると

<img width="693" alt="LDRUOR_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/92c90e14-2014-2b22-d34f-d3317eeb959e.png">

ネット等からクマノミの画像（Positives）を集めたい。スクレイピングしてみるとクマノミ以外の画像の外れ値（Outliers）も含まれてしまう。

この外れ値を自動で取り除くモデル。

# アルゴリズム  
アルゴリズムの概要は以下の図[1]Figure 5のように Discriminative Labeling と Reconstruction Learning を繰り返す。

<img width="367" alt="LDRUOR_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/d5ccda82-5113-760c-04db-3dd159e660ba.png">

### Discriminative Labeling 
auto-encoder $f$ にミニバッチ $\{ x_i \}$ を入れ、それぞれの再構築誤差 $\epsilon _i$ を求める。

それぞれのデータをpositive ラベル $y_i = 1$ とoutlier ラベル $y_i = 0$ にわけるが、このとき以下の目的関数 $h$ が最小となるように行う。

```math
\begin{eqnarray}
\min_y h &=& \frac{\sigma_w}{\sigma_t} \\
 &=& \frac{\Sigma_{y_i=1} (\epsilon_i - c^{+})^2 + \Sigma_{y_i=0} (\epsilon_i - c^{-})^2}{\Sigma (\epsilon_i - c)^2}
\end{eqnarray}
```

分母 $\sigma_t$ は再構築誤差 $\epsilon _i$ と全再構築誤差の平均値 $c$ との差を積算したもの。

２行目の分子第１項は positive データに対して再構築誤差 $\epsilon _i$ とその再構築誤差の平均値 $c^{+}$ との差を積算したもの。

２行目の分子第２項は outlier データに対して再構築誤差 $\epsilon _i$ とその再構築誤差の平均値 $c^{-}$ との差を積算したもの。

positive ラベル $y_i = 1$ とoutlier ラベル $y_i = 0$ との分け方によって $h$ の値は変化する。

分子の第１項と分子第２項が小さくなるのは、再構築誤差が小さいもの（positive;$y_i=1$ ）と大きいもの（outlier;$y_i=0$）とに、ある閾値でうまく分離した時だろう。

### Reconstruction Learning 

目的関数は以下。

```math
\mathcal{L}(f) = \frac{1}{n^+} \Sigma_{y_i=1} \epsilon_i + \lambda h
```

右辺第１項は positive のみを使用した再構築誤差。

右辺第２項は上記の $h$ 。

第１項により positive なデータを再構築するよう学習する。第２項により positive と outlier をより分離するよう学習する。

# 実験と結果 
(a)単純にauto-encoderで学習させる場合、(b)予めpositive と outlier が分かってるとして positive のみで学習させた場合、と(c)本手法、とを比較した結果は以下。

<img width="890" alt="LDRUOR_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/82197b4b-05ba-10d8-32f4-9bd729fb43d5.png">

上段から(a), (b), (c)。

それぞれoutlierが10%の場合、30%, 50%, 70%。

(a)の単純にauto-encoderで学習させて閾値で判定する場合は、outlierの割合が高くなると分類が難しくなる。

(b)の予め positive を知っていて、それのみで学習させた場合、当然ながら分類性能が高くなる。

(c)の本手法は、outlierの割合が高い時でも(b)と比肩しうる分類性能である。
tomcat をsystemdに登録したらエラーでた

#systemdに登録
自分で配置したtomcatをsystemdに登録する方法は以下の人たちが丁寧に解説してくれてます。
https://qiita.com/nyao/items/8ad51a56638e646b2ec1
https://qiita.com/ariaki/items/6fafac7d89ea14b12203

#systemctl start tomcat.serviceが動かない
statusを見ると

```
[root@Server bin]# systemctl status tomcat.service
● tomcat.service - Apache Tomcat Servlet Container
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 木 2018-11-08 23:00:37 JST; 38s ago
  Process: 67018 ExecStop=/apache-tomcat/bin/shutdown.sh (code=exited, status=203/EXEC)
  Process: 67016 ExecStart=/apache-tomcat/bin/startup.sh (code=exited, status=203/EXEC)
 Main PID: 67016 (code=exited, status=203/EXEC)

11月 08 23:00:37 Server systemd[1]: Started Apache Tomcat Servlet Container.
11月 08 23:00:37 Server systemd[1]: Starting Apache Tomcat Servlet Container...
11月 08 23:00:37 Server systemd[1]: tomcat.service: main process exited, code=exited, status=203/EXEC
11月 08 23:00:37 Server systemd[1]: tomcat.service: control process exited, code=exited status=203
11月 08 23:00:37 Server systemd[1]: Unit tomcat.service entered failed state.
11月 08 23:00:37 Server systemd[1]: tomcat.service failed.
```

赤や黄色の文字で文句を言われました。

#ログは/var/log/messageに！

```
Nov  8 22:44:51 Server systemd: Started Apache Tomcat Servlet Container.
Nov  8 22:44:51 Server systemd: Starting Apache Tomcat Servlet Container...
Nov  8 22:44:51 Server systemd: Failed at step EXEC spawning /apache-tomcat/bin/startup.sh: Permission denied
Nov  8 22:44:51 Server systemd: tomcat.service: main process exited, code=exited, status=203/EXEC
Nov  8 22:44:51 Server systemd: Failed at step EXEC spawning /apache-tomcat/bin/shutdown.sh: Permission denied
Nov  8 22:44:51 Server systemd: tomcat.service: control process exited, code=exited status=203
Nov  8 22:44:51 Server systemd: Unit tomcat.service entered failed state.
Nov  8 22:44:51 Server systemd: tomcat.service failed.
```

ただのPermission deniedでした。
startup.shとshutdown.shに実行権限与えたらちゃんと動きました！！
Colaboratory で利用できるマシンリソースや構成を調べる

[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb) は無料で利用可能な Jupyter Notebook 環境です。

この記事では、ノートブック上でどのくらいのマシンリソースが使えるのか、またマシンの構成がどのようになっているかを確認する方法を示します。具体的には、Python のモジュールを活用して確認したり、OS コマンドを実行することで確認できます。Jupyter Notebook 上で OS コマンドを実行するには先頭に「!」を付与します。これを活用します。

ノートブック環境は、VM 上にコンテナを起動して割り当てているように見えます。ですので、CPU、メモリに関しては、ホスト OS 側とコンテナ側のリソースを確認する方法を示します。

### OS 情報

Linux ディストリビューションによって異なりますが、Ubuntu の場合は「/etc/os-release」ファイルを開くと確認できます。

```python
!cat /etc/os-release
```

### OS パッケージ一覧

Linux ディストリビューションによりますが、Ubuntu 系だと「dpkg -l」で確認できます。

```python
!dpkg -l
```

### Python バージョン

Python 標準モジュールの sys モジュールで調べることができます。

```python
import sys
print(sys.version)
```

### Python パッケージの一覧

「pip list」を実行するだけでいいのですが、データフレーム化することで見た目が綺麗になったり、条件に合致する行の抽出がやりやすくなります。

なお、パッケージを追加する方法は公式ドキュメントの[ライブラリのインポートと依存関係のインストール](https://colab.research.google.com/notebooks/snippets/importing_libraries.ipynb)をご参照ください。

```python
out = !pip list

import pandas as pd
df = pd.DataFrame(out.fields()[2:], columns=out.fields()[0])
df
```

![pip_list](https://qiita-image-store.s3.amazonaws.com/0/48133/6b265e4e-9cda-961e-01f3-d161bb97e95c.png)

### CPU

ホスト OS に搭載されている CPU コア数、CPU の種類、周波数などを確認するときは「/proc/cpuinfo」を開きます。

```python
!cat /proc/cpuinfo
```

コンテナへのコア割り当ては次のファイルで確認します。コア「0, 1」に割り当てられています。

```python
# コマンド
!cat /sys/fs/cgroup/cpuset/cpuset.cpus
# 出力
0-1
```

### メモリ

ホスト OS のメモリ搭載量は「/proc/meminfo」ファイルを開くことで確認できます。データフレーム化すると綺麗に見れます。

```python
out = !cat /proc/meminfo

import pandas as pd
df = pd.DataFrame(out.fields()[:])
df
```

一方でコンテナのメモリ上限は[次のファイルで確認できます](https://docs.docker.com/engine/reference/commandline/run/#specify-hard-limits-on-memory-available-to-containers--m---memory)。この出力は約 12.6 GB。

```python
# コマンド
!cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# 出力
12616466432
```

### ディスク

ディスク搭載量は「df」コマンドで確認できます。データフレーム化すると綺麗に見れます。

```python
out = !df -hP
out[0] = out[0].replace('Mounted on', 'Mounted')

import pandas as pd
df = pd.DataFrame(out.fields()[1:], columns=out.fields()[0])
df
```

### GPU

[ランタイム] → [ランライムのタイプを変更] からハードウェアアクセラレータを選択できます。GPU をアタッチした状態で「nvidia-smi」コマンドを実行すると GPU の情報を出力できます。Tesla K80 が搭載されています！

```python
!nvidia-smi 
```

### 最後に

無料でこれだけのリソースを利用できるのは、凄すぎると思いました。
二乗中抜き法の欠点とTAOCP

今ではもう利用されなくなった古典的な乱数生成アルゴリズムに、二乗中抜き法(middle-square method)というのがあります。平方採中法とも訳されます。
かのノイマンが1946年ごろに発明したとされる、世界初の疑似乱数生成アルゴリズムです。

使われなくなったのは欠点があるかららしいのですが、この記事では欠点についてTAOCP(The Art of Computer Programming)とその演習問題を通して見ていきます。

※ この記事のお題は、[The Art of Computer Programming Volume 2 Seminumerical Algorithms](https://asciidwango.jp/post/122327922390/the-art-of-computer-programming-volume-2)の最初の方で取り上げられている話題です。

## 二乗中抜き法

アルゴリズムとしてはとてもシンプルです。

1. 適当な初期値を定め、最初の値とする。値に相応の桁数も定めておく。
2. 次の値は、今の値を二乗して、中央から同じだけの桁数を取ったものとする（桁数が足りない場合は上位桁に0を詰める）

実装も簡単です。乱数生成器をRubyでざっと書いてみました。

```ruby
def msm_enum(x0, digits = x0.to_s(10).bytesize)
  Enumerator.new do |yielder|
    x = x0
    loop {
      yielder << x
      # 二乗して文字列化する。桁数がちょうど倍になるように（必要なら）頭にゼロ埋めする
      square = sprintf("%0#{digits * 2}d", x ** 2)
      x = square[(digits/2) ... (digits/2 + digits)].to_i
    }
  end
end
```

実行例です。

```text
>> msm_enum(1763).take(20)
=> [1763, 1081, 1685, 8392, 4256, 1135, 2882, 3059, 3574, 7734, 8147, 3736, 9576, 6997, 9580, 7764, 2796, 8176, 8469, 7239]
```

## 何がまずいのだろうか？

実行例はそれらしい乱数列が生成されており、そこまで悪くないようにも見えます。

別の初期値で動かしてみます。

```text
>> msm_enum(1010).take(20)
=> [1010, 201, 404, 1632, 6634, 99, 98, 96, 92, 84, 70, 49, 24, 5, 0, 0, 0, 0, 0, 0]
```

途中から値が`0`だけになってしまっています。このアルゴリズムは、前の値から二乗によって次の値を生成します。ひとたび0になると、0の二乗は0となり、それに中抜き操作をしても0というわけです。これは良くない性質です。

さて、このようにゼロが続く数列を生み出してしまう場合はどれぐらいあるのか調べます。

```ruby
require 'set'

def detect_zero(enum)
  set = Set.new
  while (value = enum.next) != 0
    return false if set.include?(value)
    set << value
  end
  true
end
```

`detect_zero`は、「周期が見つかるか、ゼロが見つかる」まで乱数を生成してみるというメソッドです。ゼロが見つかったかどうかで真偽値を返します。

これを使って2桁以下の数すべての挙動を見てみます。

```text
>> (0 .. 99).map {|x| detect_zero(msm_enum(x, 2)) }.count(true)
=> 62
>> (0 .. 99).map {|x| detect_zero(msm_enum(x, 2)) }.count(false)
=> 38
```

半数以上の数がゼロになってしまうことが分かります。

## ゼロになる場合の解析例

ゼロになる問題について、TAOCPには少し異なる切り口からの演習問題も載っていました。

> 基数$b$で$2n$桁の数を使う二乗中抜き法には、数列内に上位$n$桁が0の数を含む場合、その後の数は次々と小さくなり、最終的に0を繰り返すという欠点があることを証明せよ

こんな数$X_i$が出てきたときのことを考えよ、と言われました。

```math
X_i = \overbrace{0\ 0\ \cdots\ 0}^{n桁}\ \overbrace{b_n\ b_{n-1}\ \cdots\ b_0}^{n桁}

```

※ ここでは下$n$桁の各桁を、添字を付けて$b_i$と表記しています。

これを二乗して中抜きすることを考え、次の数$X_{i+1}$がどうなるか考察します。
出発点は、$X_i < b^n$です。この関係は、$X_i$が$n$桁の基数$b$の数であることから得られます。

二乗します。$X_i$は正数なので大小関係は変わりません。

```math
X_i^2 < (b^n)^2 = b^{2n}
```

$X_i^2$を中抜きします。

- 元が$2n$桁なので2乗すると$4n$桁になっています
- 中央の$2n$桁を取り出すので、下$n$桁を切り落とします
    - 上$n$桁は0になっていることに注意してください（つまり忘れて構いません）

切り落とすには$b^n$で割って床関数を付ければ良く、これが次の数$X_{i+1}$にあたるので

```math
X_{i+1} = \lfloor X_i^2/b^n \rfloor \le X_i^2/b^n
```

です。最後の変形は一般に$\lfloor a \rfloor \le a$であることを使っています。

さて、$X_i < b^n$だったことを利用して、$X_i^2/b^n$を評価すると

```math
X_i^2/b^n < X_i b^n / b^n = X_i
```

となるので、まとめると

```math
X_{i+1} \le X_i^2/b^n < X_i
```

したがって

```math
X_{i+1} < X_i
```

つまり、乱数列の値がどんどん小さくなっていくというわけです。少なくともこういう場合がある以上は、二乗中抜き法はあまり良いアルゴリズムとは言えなさそうですね……。

## まとめ

- 二乗中抜き法について紹介しました
- アルゴリズムについて簡単に解析し、特にゼロの発生パターンについて見てみることで、アルゴリズムの欠点を調べました
    - このやり方はTAOCPの練習問題ほとんどそのままですが、ある程度手抜いています
ユーザーIDとパスワードが必要なホームページにpythonでアクセスする

##背景
とあるサイトからPDFをダウンロードするために、そのサイトにIDとパスワードを入力する必要があった。
参考にした記事がいくつかある。

[Pythonでのウェブサイトへのログイン](https://qiita.com/morinokami/items/46b76b365f030be83418)
[【Python3】ログイン機能付サイトでスクレイピング【requests】【BeautifulSoup】](https://qiita.com/shunyooo/items/36af8bcb501baf8c7014)
[Pythonのrequestsモジュールでログインしようとしたらうまくいかなかった話](https://qiita.com/guitar_char/items/b906d83ad64c133254e2)

本命のサイトではまだ試していないが、「小説家になろう」にログインすることに成功した。注意点を含めてコードを載せる。

```python

import requests

# メールアドレスとパスワードの指定
USER = "各個人のID"
PASS = "各個人のパスワード"

# セッションを開始
session = requests.Session()

# ログイン情報
login_info = {
    "narouid":USER,
    "pass":PASS
}

#htmlにあるformタグを考慮したURL
url_login = "https://ssl.syosetu.com/login/login/"
p = session.post(url_login, data=login_info)

#ブラウザに表示されているURL
r = session.get("https://ssl.syosetu.com/login/input/")

```

ログインするためには二つのURLが必要になる。
一つはログインページのブラウザに表示されているURL。
もう一つはhtmlの　form action="xxx" method="post"　の部分を考慮したURL。

小説家になろうにあるformタグのコードは

```html

<!-- URL -->
<form action="/login/login/" method="post">
<dl>
<dt>IDまたはメールアドレス</dt>

<!-- ID -->
<dd><input name="narouid" type="text">
</dd>

<dt>パスワード</dt>
<dd>
<!-- password -->
<input size="20" name="pass" type="password"><br>


```
このようになっている。

ログイン情報をPOSTするURLは、小説家になろうだと、末尾に/login/login/で書き換えないといけない。
ログインページのURLが

前：https://ssl.syosetu.com/login/input/
後：https://ssl.syosetu.com/login/login/

と変更しないと、ただしくデータが送信されない。
IDとパスワードのinputタグのnameが正しいことを確認して、再度https://ssl.syosetu.com/login/input/ でアクセスすれば、ログインできているはずである。

大切なのはPOSTするURLとログインするURLが異なることに注意することだと思う。
spark-shell コマンドではじめてのテキストファイル読み込み

使用している spark のバージョンは 1.6.3（古い） です。

##### spark-shell 起動
ローカルモードで起動しています。

```
$ spark-shell --master local[*]
Using Spark's repl log4j profile: org/apache/spark/log4j-defaults-repl.properties
To adjust logging level use sc.setLogLevel("INFO")
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.3
      /_/

```

##### テキストファイルのデータをRDDとして取得 (textFile)
```
scala> val rawData = sc.textFile("directory_name")
rawData: org.apache.spark.rdd.RDD[String] = linkage MapPartitionsRDD[1] at textFile at <console>:27
```

##### 先頭の要素を取得 (RDD.first)
```
scala> rawData.first
res0: String = "col_1","col_2","col_3"
```

##### 要素の総数を取得 (RDD.count)
```
scala> rawData.count
res3: Long = 1000   
```

##### 先頭から10個の要素を取得 (RDD.take)
```
scala> val head = rawData.take(10)
head: Array[String] = Array("col_1","col_2", ....
```

##### 各要素を1行ずつ出力 (foreach)
```
scala> head.foreach(println)
"col_1","col_2","col_3"
70031,70237,1
84795,97439,1
36950,42116,1
25965,64753,1
49451,90407,1
37291,53113,1
39086,47614,1
42413,48491,1
39932,40902,1
```

##### 関数を定義 (def)
"col_1" という文字が含まれていれば、1行目であると判断する関数

```
scala> def isFirstLine(line: String): Boolean = {
     | line.contains("col_1")
     | }
isFirstLine: (line: String)Boolean
```

##### 上記の関数でフィルターにかける (filter)
1行目のみが抽出されるはず。

```
scala> head.filter(isFirstLine).foreach(println)
"col_1","col_2","col_3"
```

##### 1行目以外を抽出する
例として無名関数を使っている。

```
scala> head.filter(x => !isFirstLine(x)).foreach(println)
or
scala> head.filter(!isFirstLine(_)).foreach(println)
70031,70237,1
84795,97439,1
36950,42116,1
25965,64753,1
49451,90407,1
37291,53113,1
39086,47614,1
42413,48491,1
39932,40902,1
```

##### 4行目を取得
実際には、head.apply(4) が呼ばれている。

```
scala> val line = head(4)
line: String = 25965,64753,1
```
PHPの [$obj, "someMethod"] の意味

# おまけ
<font color="LightGray">なぜか最初におまけを書きます</font>
メソッドを動的に呼び出したり、コールバックとして引数に渡したいときは、今回紹介する方法ではなくリフレクションを使ったほうがわかりやすいかもしれません。
記事を書いた目的は私がなんとなく気になっただけです。

# 本題

たとえばこんな関数があったとして

```php
function doSomeTask($callback) {
    // ...

    $callback();
}
```

なにか適当な処理を実行してコールバックを実行するものです。

```php
doSomeTask(function() {
    echo "hogehoge";
});
```

上記のように匿名関数を渡すときは簡単ですが、インスタンスのメソッドを渡したいときはどうするのでしょうか。

```php
// $personのクラスにgreetっていうメソッドがある設定
doSomeTask($person->greet);
```

上だとエラーになってしまいます。

どうすればいいのかというと、こうすればいいのです。

```php
doSomeTask([$person, "greet"]);
```

これだとうまく動作します。

# なぜこれで動くのか

インスタンスとメソッド名を渡すだけで、なんで`$callback();`を実行できるの？

答えは**可変関数**というPHPの機能です。

[PHP: 可変関数 - Manual](http://php.net/manual/ja/functions.variable-functions.php)

> これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、同名の関数を探し実行を試みます。

以下のようなコードでは`$func`が`"doHoge"`という文字列だから、`doHoge()`を実行するということですね。スクリプト言語ではよくある仕様じゃないかと思います。

```php
$func = "doHoge";
$func();
```

その可変関数の機能の一つとしてインスタンスのメソッドを呼び出せるのです。
それが配列の形式です。

> ```php
class Foo
{
    function baz()
    {
        echo "baz\n";
    }
}

> $func = array(new Foo, "baz");
$func(); // "baz"を表示します。
```

配列の[0]にインスタンス、[1]にメソッド名をいれて、それを関数のように呼び出せば、メソッドが実行されるというわけです。

<!--
なんだか、「なぜ〜なのか」と言っておきながら、「そうなっているから」という説明になってしまいました。
ソースコードを読んでもっと具体的に説明できるようになりたいなぁ。
-->
[Node.js]sftpでも「ls -R」したい

# はじめに
sftp接続しか出来ない環境でファイルリストをとってくるっていうのをPythonでやってるのを見てnode.jsでも出来るかなと思ってやってみました。
sftpだとlsコマンドが再帰的に実行できないっぽくてコマンド一発とはいかないのが少し困りますね。

# 準備
sftp接続に使うモジュールをインストール

```bash
npm install --save ssh2-sftp-client
```

# 実装
```javascript
const SftpClient = require('ssh2-sftp-client');
const fs = require('fs');

const sftp = new SftpClient();

(async () => {

  let result = {};

  await sftp.connect({
    host: "", //接続IP
    port: "", //接続ポート
    username: "", //ID
    password: "", //パスワード
  })

  await lsR("/"); //探索開始ディレクトリを指定

  await fs.writeFileSync('result.json', JSON.stringify(result,null,2)); //結果をjsonファイルに出力する

  sftp.end();

  async function lsR(path){
    let list = await sftp.list(path);

    console.log(path);

    result[path] = list;

    for(let i=0; i<list.length; i++){
      let item = list[i];
      if(item.type === "d"){
        await lsR(path + item.name + "/")
      }
    }

  }
})();
```
Ionicでngx-translateを使って多言語対応する方法

## はじめに

この記事は、現在参画しているプロジェクトで　Ionicを使っているため、そのときの知見をまとめたものになります。

今回は多言語対応についてです。

## バージョンについて
```bash

Ionic:

   ionic (Ionic CLI)  : 4.3.1 
   Ionic Framework    : ionic-angular 3.9.2
   @ionic/app-scripts : 3.2.0

Cordova:

   cordova (Cordova CLI) : 8.1.2 (cordova-lib@8.1.1)
   Cordova Platforms     : none
   Cordova Plugins       : no whitelisted plugins (0 plugins total)

System:

   NodeJS : v11.0.0 
   npm    : 6.4.1
   OS     : macOS
   Xcode  : Xcode 10.1 Build version 10B61
```

## ngx-translateの導入

ターミナルから次のようにinstallします。

```bash
npm install @ngx-translate/core --save
```

`package.json`が以下のような感じで導入されていればOKです。

```package.json
...
 "@ngx-translate/core": "^11.0.0",
 "@ngx-translate/http-loader": "^4.0.0",
...
```

## app.module.tsにimport

`npm install` した `ngx-translate` を、`app.module.ts`にimportして、諸々の設定を行います。

```app.module.ts
import { HttpClient } from '@angular/common/http';
import { TranslateLoader, TranslateModule} from '@ngx-translate/core'
import { TranslateHttpLoader } from '@ngx-translate/http-loader'

export function createTranslateLoader(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}

@NgModule({
....
TranslateModule.forRoot({
       loader: {
         provide: TranslateLoader, 
         useFactory: (createTranslateLoader), 
         deps: [HttpClient] 
       }
     })
  ]
})
```

### Componentごとに　Moduleがある場合

lazyLoadingなどでComponentごとに　Moduleがある場合、それぞれ以下のように`TranslateModule`をimportしてください。

```components.module.ts
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import { TranslateModule } from '@ngx-translate/core';

@NgModule({
  declarations: [],
  exports: [
    LoginFormComponent
  ],
  imports: [
    IonicPageModule.forChild({}),
    TranslateModule.forChild()
  ]
})
export class ComponentsModule { }
```


## 翻訳するためのjsonファイルを設定

`www/assets`ディレクトリ配下に`i18n`ディレクトリを作成して、その中に任意の言語のjsonファイルを作成します。

```bash
$ mkdir www/assets/i18n
$ touch www/assets/i18n/ja.json
```

translateしたい言語の設定を記述します。

```json
{
  "Mail": "メールアドレス"
}
```

## それぞれのtsファイルにTranslateServiceをimport

各Componentで使用しているtsファイルに、TranslateServiceをimportして、諸々の設定を行います。

```ts
import { TranslateService } from '@ngx-translate/core';

@Component({
  selector: 'page-hoge',
  template: `  
     <ion-item>
        <!--- {{ 'Mail' | translate }} の部分が多言語対応部分 -->
        <ion-label padding>{{ 'Mail' | translate }}</ion-label>
        <ion-input type="text"></ion-input>
     </ion-item>
  `,
  styles: [],
})

export class HogeComponent {
 
  /* 多言語対応用プロパティ */
  lang:any;

  /* 多言語対応のconstructorを設定 */
  constructor(private translate: TranslateService) {
    /* プロパティにjaを設定(jsonファイル(例:ja.json)のprefixを記入) */
    this.lang = 'ja';
    /* デフォルトの言語を設定 */
    this.translate.setDefaultLang('ja');
    /* 使用する言語 */
    this.translate.use('ja');
  }
}
```

## 参考サイト

Ionic公式サイト

[Using ngx-translate](https://ionicframework.com/docs/developer-resources/ng2-translate/)


## まとめ

比較的ラクにIonicの多言語対応ができましたー。
また知見が溜まったら追記していきたいと思います。
ソルトを軽くまぶして

パスワードのハッシュ化は比較的知られる技法となってきましたが、それと比べればソルトはまだまだ知名度が低い気がします。

## 単純なハッシュ化の問題点

パスワードをそのまま保管したり、復号可能な暗号化を行うような形ではもとのパスワードが判明してしまいます。そして、パスワードは正しいかどうかさえ判別できればよく、**もとの値を記録しておく必要は必ずしもない**[^1]ものです。

ということで、「一方向性ハッシュ関数」という、「出力から入力の値を判別することができない」関数を使うことで、

* パスワード設定時→元のパスワードをハッシュ関数にかけて、それを記録
* ログイン時→入力されたパスワードをハッシュ関数に通して、保存されたパスワードと比較

という手順を取ることで、DBのデータから元のパスワードを簡単には復元できなくなります。

…が、ハッシュ関数を同じように通していることで、「同じパスワードが同じハッシュ値になる」という問題があります。そのため、

* 同じパスワードを使ったユーザーが一目瞭然となります。
* 事前に計算してテーブルを用意しておく[^2]

などの攻撃が成立します。

## ソルトとは

もちろん、ハッシュ関数は決定的（同じ値には同じ結果）なものなのですが、そのまま使えば上のような事態を招いてしまいます。ということで、登場するものがソルトで、

0. ハッシュ化の際に、ランダムにソルトを生成して、「ソルト＋パスワード」をハッシュ化する
1. ソルトとハッシュ値をセットで保存しておく
2. 検証のときは、「保存してあったソルト＋入力すたパスワード」をハッシュ化して比較する

というような過程で使われます。ソルトとハッシュ値は一般にセットで保管されますので、「1つのパスワード」に対する攻撃に対しては特に強度が上がるわけでもありませんが、パスワードが大量に並んでいる場面でもテーブル化などの技が通用しなくなって、1つ1つ攻略する手間が生じることとなります。

## 便利な関数

PHPでは、その名もズバリ`password_hash()`という標準関数があります（[リファレンス](http://php.net/manual/ja/function.password-hash.php)）。保存する値として「ハッシュ値」「ソルト」以外に「ハッシュ化アルゴリズム」も記録されますので、`password_verify`で検証する際にも適切なハッシュ化アルゴリズムが自動で選ばれます。他言語でも、同様な形式でハッシュ化を行う関数があるようです。

[^1]: 「他のサービスにログインするためにそのパスワードを預かる」なんていう、危険極まりないことを行うような場合は別ですが。
[^2]: 2chなどで使われるトリップのように、広くデータベースが構築されている事例もあります。
Prism.Wpf 7.1 でDIコンテナ(Unity)を直接操作する


Prism.Wpf 7.1 が正式リリースされました。DIコンテナの抽象化がされており、各モジュールをDI非依存で書けます。ただ、そうはいっても使いたい機能がない！ということはあるので、コンテナを直に触ることも可能になっています。この記事ではUnity(ゲームじゃないほう)を例に説明します。

なお、本記事のコードは下記リポジトリにあります。プロジェクトはPrism Template Packを使って作成しています。

https://github.com/GtTmy/UnityDIDemo

## コンテナの触り方
今回はModuleAというモジュール内で触ってみます。下記のコードが全てです。

```csharp:ModuleA/ModuleAModule.cs
using ModuleA.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
using Prism.Unity;
using Unity;
using Unity.Injection;

namespace ModuleA
{
    public class ModuleAModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
            // 画面遷移を行う
            // 今回の本題とは関係ないので説明略
            var regionManager = containerProvider.Resolve<IRegionManager>();
            regionManager.RequestNavigate("ContentRegion", nameof(ViewA));
        }

        // ここでコンテナへの登録作業を行う
        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // ContainerRegistryが抽象化されたコンテナへの登録用Interface

            // GetContainerでUnityのコンテナに直接アクセスできる
            // NugetにてUnity、Prism.Unityを導入する必要あり
            var container = containerRegistry.GetContainer();

            // 普通にUnityが利用可能
            container.RegisterType<Models.ModelA>(new InjectionFactory(x =>
            {
                return new Models.ModelA("Hello, Prism 7.x !");
            }));

            // Viewの登録
            containerRegistry.RegisterForNavigation<ViewA>();
        }
    }
}
```

注意点は下記2点です。

1. Prism Template Packでモジュールを作成すると、最初は`containerRegistry.GetContainer()`が呼び出せません。Prism.UnityをNugetで追加してください。
2. Prism.Unityの追加だけでは、Unityの一部機能しか使えません。欲しい機能がない場合、NugetでUnityを追加してください。

## おわりに
上記のように、自由にUnityのコンテナを触れます。ただし、依存が増えるのでコンテナの乗り換えが大変になることに気を付けてください。

なお、Prism.Wpfの7系はまだ情報が少ないですが、Xamarin向けは先にリリースされていたのでそちらと、あとは[公式のサンプル](https://github.com/PrismLibrary/Prism-Samples-Wpf)を参考にするとよいです。
iMPACT, ChipScope等のISE labtoolをwindows10に入れる際の注意点


新しいPCにXilinx FPGA開発環境を入れる場合，Vivadoを導入するケースが多いと思う．

しかし過去資産のbuild script fileを使用する際など、ISE labtool中(iMPACT, ChipScopeなど)のツールを用いて記述されている場合がある．



当初はISE14.7を入れることを検討したが，install packageが大きく時間がかかりそうだなと横着していたところ，どうやらlab toolのstandalone installerが存在しているようだ．

[AR# 12858 iMPACT: ライセンスなしでスタンドアロンの iMPACT または ChipScope をラボで実行する方法
](https://japan.xilinx.com/support/answers/12858.html)

stand alone版はinstall packageが1,2GB程度しかなく，数分で上記URLの案内に従いinstallが終わった．

Testの意味で，iMPACT.exeをGUIから起動したところ何やら怒られて起動できなかった．
installした14.7のlabtoolはすでにサポートを終了していたので，OS(win10)が原因かと思い至り以下の記事を発見．

[AR# 62380
ISE インストール - Windows 8.1 または Windows 10 マシンに ISE 10.1 または 14.7 をインストールして実行する方法](https://japan.xilinx.com/support/answers/62380.html)


このページの中段の**ISE 14.7 64 ビット - SmartHeap をオフにする**に解決法が記載されていた．

上記Page手順に従い，SmartHeap機能を無効にしたところ無事iMPACTの起動を確認できた．
Yarn で `EACCES: permission denied` に悩まされたら.yarnrcが悪かった

Yarn で `EACCES: permission denied` に悩まされて自己解決したので記事投下します。dotfiles作ってる人は要注意。

## 環境

* Ubuntu 18.04 (WSL)
* Yarn 1.12.3

Yarnはいくつか別のバージョンも試しましたが再現しました。OSは関係なさそうです。

## 現象

```bash
> yarn
yarn install v1.12.3
error An unexpected error occurred: "EACCES: permission denied, mkdir '/home/differentusername'".
info If you think this is a bug, please open a bug eport with the information provided in "/path/to/run/yarn/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```

## 原因

`mkdir 'home/<存在しないユーザー名>` ってとこが判定のポイント。

当方の環境の場合、 `.yarnrc` に `yarn-offline-mirror "/home/username/.npm-packages-offline-cache"` が登録されていたのが原因でした。 `username` が違う環境から `.yarnrc` 持ってくると存在しないユーザーディレクトリを作成しようとして起こるようです。

## 感想

割とすぐに気づけてよかった。
rails new した後のgit管理（GitHub Desktop使用)

## 目的
新しくrails アプリケーションを作成する時、git管理をGitHubに加えて、ローカルリポジトリはGitHub Desktopでも管理したい。

## 手順
◾️アプリケーションの作成　（ターミナルで該当のディレクトリに移動後）
```$ rails  new sample _5.0.1_ -d mysql  #アプリケーションを作成
$ cd sample  #sampleディレクトリに移動
$ bundle exec rake db:create  # データベースを作成
```

◾️GitHubにて右上の＋マークのところでNew repositoryを作成

◾️新しいレポジトリを作成した後に出る表示（.. or create a new repository on the command line)の手順に従う。(該当のディレクトリにいることを確認してから）
```$ git init
$ git add READE.md
$ git commit -m "first commit"
$  git remote add origin https://github.com/******/sample.git
$ git push -u origin master
```

これでGitHubの設定ができました。

◾️GitHub Desktopの設定

左上の+マークを押すしてAddを選んでください。
<img width="461" alt="スクリーンショット 2018-11-08 22.14.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/270244/a1231273-049a-52ad-5d16-a2c52bfaa5b3.png">

そこでパソコン上にあるsampleフォルダを選択しましょう。

すると、rails newで作成したファイル等をコミットできるようになるので、masterにてコミット、プッシュしましょう。


以上でrails newからのGitHub、GitHub Desktopの設定になります。