OmniAICreator/Qiita-1.07M huggingface dataset:
【PHP, Cakephp3】CSVファイルをアップロードしてパースする

# CSVファイルのアップロードとパース処理
```
if (is_uploaded_file($_FILES["CSV"]["tmp_name"])) {
    $file_tmp_name = $_FILES["CSV"]["tmp_name"];
    $file_name = $_FILES["CSV"]["name"];
    if (pathinfo($file_name, PATHINFO_EXTENSION) != 'csv') {
        $err_msg = 'CSVファイルのみ対応しています。';
    } else {
        if (move_uploaded_file($file_tmp_name, WWW_ROOT."data/".$file_name)) {
            chmod(WWW_ROOT."data/".$file_name, 0644);
            $msg = $file_name . "をアップロードしました。";
            $file = WWW_ROOT."data/".$file_name;
            $fp = fopen($file, "r");

            while (($data = fgetcsv($fp, 0, ",")) !== FALSE) {
                $data = explode(",",$data[0]);
                //utf8へのコンバート
                //mb_convert_encoding($data, "UTF-8", "auto");
            }

            fclose($fp);
            unlink(WWW_ROOT."data/".$file_name);
        } else {
            $err_msg = "ファイルをアップロードできません。";
        }
    }
}
```

# cakephp3でのファイルアップロードフォーム
```
<?=$this->Form->create('Uploads',['url' => '/Uploads/save', 'enctype' => 'multipart/form-data'])?>
<?=$this->Form->input('CSV', array('type'=>'file' )); ?>
<?=$this->Form->submit('アップロード') ?>
<?=$this->Form->end() ?>
```
lsyncdを使用したリアルタイム同期

## 目的
* 開発中、リモート環境で動作確認しなければならない場合に開発を潤滑に行う。
* 検証環境へリアルタイムにデプロイする。

## リアルタイム同期のメリット
* ローカルによる一元管理が可能
* 同期が裏側で行われるため、クラウドなど通信が低速な環境でも作業効率を維持できる。

## 構成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221990/c97144d2-87c9-312f-63e6-4e2716110b65.png)

## 同期設定
### ホスト側（ローカル)
* lsyncdのインストール

```bash
apt-get install lsyncd
```

* lsyncdの設定 [/etc/lsyncd.conf]

```Bash
settings {
    logfile="/var/log/lsyncd/lsyncd.log",
    statusFile="/var/log/lsyncd/lsyncd.status",
    nodaemon=false, # daemonとして実行
    stubborn=true, # 接続に失敗してもプロセスを終了させない。
}
sync {
    default.rsyncssh,
    source="[Source Directory]", # 同期元のディレクトリ
    host="[User@HostName]", # SSHで接続する先
    targetdir="[Remote Directory]", # 同期先のディレクトリ
    delay=1,
    delete=true,
    ssh = {
        port = [PortNumber] # SSHで接続するポート番号
    }
}
```

* lsyncdのサービス化 [/etc/systemed/system/lsyncd.service]

```ini
[Unit]
Description=Live Syncing Daemon
After=network.target

[Service]
Restart=always
Type=simple
Nice=19
EnvironmentFile=/etc/lsyncd.conf
ExecStart=/usr/bin/lsyncd -pidfile /tmp/lsyncd.pid /etc/lsyncd.conf
PIDFile=/tmp/lsyncd.pid
User=[UserNmae] # 実行するユーザ名
Group=[GroupName] # 実行するグループ名

[Install]
WantedBy=multi-user.target
```

* サービスの登録/実行

```Bash
systemctl enable lsyncd
systemctl start lsyncd
```

* サービスの自動起動を無効

```Bash
# sysv-rc-confがインストールされてない場合はインストール
sysv-rc-conf
# 実行後、lsyncdの項目を全て空白に変更
# ↓ Example ↓
# lsyncd [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
```

### 接続先（リモート）
* sshdが動作していること。

## 活用例
* IDEで同期用のワークスペースを作成し、丸ごと同期
    - 開発中のテスト実行がリモート環境で実現
    - 「開発環境では動いた。」という環境依存の問題を解決
* Gitのworktreeディレクトリを同期し、任意のブランチを検証環境へ同期
    - 臨時の修正が発生した際、worktreeでブランチ作成、修正、即時検証環境で検証可能

## 注意事項
* リモートで修正されたものはローカルと同期されないので、変更は必ずローカルで行うこと。
docker-toolbox をmacにインストールするのに色々迷った話

　この記事は、[株式会社Y's アドベントカレンダー 11日目](https://qiita.com/advent-calendar/2017/ysinc)の記事になります。

そもそもdocker-toolboxで何がしたかったのか？
[～短期集中講座～ 土日でわかる Pythonプログラミング教室](http://www.sbcr.jp/products/4797388978.html?sku=4797388978#supportDl)内でまず行う環境設定なのですがmacのdocker-toolboxには色々と落とし穴がありました…

##宣伝
アプリ作るまでのお話を書きました。
読んでいただけると嬉しです☺️
[【3日で実装・公開】エモいアートな画像生成アプリ開発 - Qiita](https://qiita.com/rantaro/items/fdb7bbd55a57c68db834)

#1.まずは普通にダウンロードしてみる

<img width="615" alt="スクリーンショット 2017-12-09 14.51.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/199085/4630015a-8aa8-e92f-bfdc-bd85f2d9aabb.png">

はい、**第一の落とし穴**。
この画面でフリーズしてインストールできません。
調べてみるとそもそもMacではこのルートからインストールできませんでした。

#2.Homebrewでダウンロードを試みる
[Homebrew](https://brew.sh/index_ja.html)

<img width="1138" alt="スクリーンショット 2017-12-09 14.57.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/199085/f8e6b00e-a98a-d69c-fc93-dced26905bf9.png">

本にもあるようにHomebrewでインストールを試みる。
しかしここが**第2の落とし穴**。
パスワード入力後にダウンロード出来ません的なエラー文が表示されました。

**ターミナルに出たエラー**
*System Preferences → Security & Privacy → General
For more information refer to vendor documentation or the Apple Technical Note:
https://developer.apple.com/library/content/technotes/tn2459/_index.html*

**Apple公式の説明を元にインストールを許可！！**

<img width="846" alt="スクリーンショット 2017-12-09 15.11.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/199085/398c60d1-28f8-d9e0-3ee8-3cbd0a57b743.png">


#3.無事インストール出来ました。

<img width="372" alt="スクリーンショット 2017-12-09 15.08.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/199085/8f8c8966-91a7-dcc2-1a2f-457f1fb006f5.png">
#まとめ
いつもは環境構築で躓いてしまうのですが今回はインストールで足止めされました。
結構無駄な時間を過ごしてしまった…
インストールまで知らないと意外とややこしいので記しておきました m(_ _)m


明日は[@kahn_sato](https://qiita.com/kahn_sato)さんの記事です。お楽しみに！！

##宣伝
アプリ作るまでのお話を書きました。
読んでいただけると嬉しです☺️
[【3日で実装・公開】エモいアートな画像生成アプリ開発 - Qiita](https://qiita.com/rantaro/items/fdb7bbd55a57c68db834)
AzureBackupのパスフレーズ設定エラー

# はじめに
Azure Backup でWindows Serverをバックアップしようと、設定を行ったときに次のようなエラーが出ました。

![BackupErr02.png](https://qiita-image-store.s3.amazonaws.com/0/109620/09a25192-acdf-0f1a-1196-b9e45f5eb07a.png)


参った・・・・。
MARSAgentInstaller.exe をダウンロードし直して再実行しても、資格情報コンテナ―の資格情報を再取得しても同じエラー



# 対処策
おそらくこのエラーが出てる方は、何度も繰り返し登録をやっているか、サーバをリストアしたなどなにかしらすでに一度登録を済ませた後にエラーが出てるはずです。

エラーの内容は、以前登録したパスフレーズで登録をしてくださいとの内容です。

⇒ 以前設定したパスフレーズを覚えていれば、そのパスフレーズで設定してください。
⇒ 覚えていない方は、下記手順で再登録です。 


# 再登録方法
再登録を行うには、一度バックアップデータの削除を行う必要があります。
バックアップスケジュールの登録と一緒にバックアップデータの削除も行えます。

① バックアップを取るサーバ上でMicrosoft Azure Backupを起動して、画面右側のペインから「バックアップのスケジュール」を選択します。
　　　![BackupErr03.png](https://qiita-image-store.s3.amazonaws.com/0/109620/bd7d19fe-9541-d54c-6987-4993c3369e13.png)

② 3つの選択肢が出てくるので一番下の「すべてのバックアップ スケジュールの使用を停止して、保存されているバックアップをすべて削除する」を選択します。

　　　![BackupErr04.png](https://qiita-image-store.s3.amazonaws.com/0/109620/7831ae04-2f36-06af-cca5-360a982662e9.png)

③ バックアップの数や、使用済みの記憶域、保持期間のオプションについて確認が入ります。何も逆らわず「完了」を押しましょう。
　　　![BackupErr05.png](https://qiita-image-store.s3.amazonaws.com/0/109620/d83a2731-975f-f8e1-dbf3-926070050fca.png)


④ セキュリティPINを入力します。
  セキュリティPINは、Azure にログイン後、Recovery Servicesコンテナ―に入って、次の手順でPINコードを確認します。
  「プロパティ」－「セキュリティPIN」－「生成」をクリックすると、セキュリティPINが表示されます。その番号を入力して「OK」ボタンを押します。

これで、登録情報、スケジュールともに削除できたので、次にAzure のRecovery Servicesコンテナ―上に登録されているサーバ情報を削除します。

⑤ Azure Portalにログインして、Recovery Servicesコンテナ―を開きます。
  「バックアップインフラストラクチャ」－「保護されたサーバー」－「Azure Backup Agent」－ ＜削除したいサーバ名＞をクリックします。画面上部に「削除」が表示されているので、クリックします。
確認のためにサーバ名の入力を求められるので、入力後画面下部の「削除」ボタンを押します。


これで登録情報の削除が完了します。

⑥ 再度、該当サーバ上で登録作業を行えば、今度はうまくいきます！！
Polymer コミュニティの紹介

Polymer Advent Calendar 2017の9日目です。
昨日は @howking さんの [Polymer & Firebase でサイト更新したらプッシュ通知](https://qiita.com/howking/items/929674f9d9661df7de9e) でした。

今日はこれからPolymerをはじめる人へ、Polymer Japan の @sizuhiko より日本のコミュニティの紹介をします。

# Polymer Japan

日本を代表する Polymer コミュニティです。

<a href="https://polymer-jp.org/">
<img width="1081" alt="公式サイト" src="https://qiita-image-store.s3.amazonaws.com/0/61446/e11a67df-b21c-db63-2c14-fc628538eb89.png">
Polymer Japan サイト</a>

今年の８月に発足したばかりですが、Polymer公式サイトやWeb Components技術情報の翻訳、イベントの開催など積極的な活動を行っています。

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="en" dir="ltr">So excited we got to meet the leaders of Polymer JP at Google Tokyo! 🇯🇵🎉 <a href="https://t.co/n4y0kV5ETW">pic.twitter.com/n4y0kV5ETW</a></p>&mdash; Polymer (@polymer) <a href="https://twitter.com/polymer/status/910738254730715136?ref_src=twsrc%5Etfw">21 September 2017</a></blockquote>

こちらは Polymer Japan 発足にあたり、Google Japan へイベントのため来日していた Polymer 開発チームと話す機会をいただいたときの集合写真です。

## オンラインコミュニティ

[Polymer Japan 公式サイトのコミュニティページ](https://polymer-jp.org/community/)に、各種SNSや勉強会へのリンクがあります。

[Twitter(@Polymer_jp)](https://twitter.com/intent/follow?screen_name=polymer_jp) では、Polymer Japanからの公式アナウンスや国内外でPolymerやWeb Componentsに関してきになるニュースがあったときにRetweetしていたりしますので、フォローしてください。また何かあれば、 `@Polymer_jp` あてにメンションください。

[Google+](https://plus.google.com/communities/101236110975380113593/) / [Facebook](https://www.facebook.com/groups/416344608738146/)は誰でも参加できるグループで、こちらはコミュニティの誰でも書き込むことはできますので、気軽に参加＆発言ください。

[Slack](https://polymer-slack.herokuapp.com/)は、Polymer公式の中に `#japanese` チャンネルがあるので、こちらで日本語のやりとりができるようになっています。またそれ以外にも役立つチャンネルが多くあるので、参加をお勧めします。技術的な質問なども、普段使っているSlackならやりやすいですね！
コミュニティ運営のやりとりのため、[Polymer JapanのSlack](https://polymer-jp.slack.com/)もあります。もしコミュニティ運営に興味がありましたら、こちらから参加ください。

# Polymer.co-edo

[Polymer.co-edo](https://polymercoedo.doorkeeper.jp/)はコワーキングスペース茅場町 Co-Edoを拠点に活動している、私 (@sizuhiko) が主催している、Polymer Japan の地域コミュニティになります。

今年の1月からほぼ毎月ハンズオンや海外のカンファレンスでPolymerに関する発表があったときなどは動画を見ながら解説する会などをやっています。

# お知らせ

Polymer.co-edo では、12/18(月) に[Polymer.co-edo meetup #9 『Polymer ゆく年くる年』](https://polymercoedo.doorkeeper.jp/events/68087)と題したLT大会＆忘年会を行います。
まだ残席ありますので、今年世界的にもさまざまな動きがあったPolymerやWeb Componentsの話をしながら、来年に思いを巡らせましょう。

また年明けにも Polymer Japan ではイベントを計画していますので、各種SNSからの情報をチェックしていてくださいね。

# おまけ

よりPolymerの情報を知りたいと思ったら `awesome` 系のまとめページを参照すると良いと思うので、いくつかリンクを貼っておきます。

- [Awesome Polymer](https://github.com/StartPolymer/awesome-polymer) : 各種 Polymer や Web Components へのリンクが充実
- [公式Wiki](https://github.com/Polymer/polymer/wiki) : Polymer 導入サイトなどの情報があります

# 明日は

@jtakiguchi さんの「Polymer Elementsの紹介(Iron Elements編)」が予定されています。Iron Elementsはマテリアルデザインなどはあたっていない、素のHTMLエレメント拡張などが用意されているので、自分でWebComponentnsを作るときのベースクラスとしても活用しやすいカスタムエレメントですよね。乞うご期待です！
Slack起動時に出てくるメッセージの意味を調べてみた

# はじめに
この記事は[岩手県立大学アドベントカレンダー](https://qiita.com/advent-calendar/2017/ipu)10日目のものです!

エンジニアであれば誰しも使ったことがあるであろうSlackについて書こうと思います。
技術ネタでなくて恐縮です、、ｗ

---
[追記]
書き終わったあとに前日の記事のこんな文章を見つけました。
>さて，明日のアドベントカレンダーはshimokpくんです.
同じ研究室の優秀な後輩なので，多大なる期待をした上で明日の記事を待ちましょう．

こんな記事でほんっとうにすみません笑
余力があれば他の日にも差し込みたいと思います...!

---

Slack起動時に毎回出てくるメッセージありますよね。
いつも何気なく表示されていて、目を通してみるはものの意味がわからないまま見続けてきました🙃
こんな感じのメッセージですね
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197742/9e78c79e-0205-16e4-b39f-3b81b49c6dad.png)

調べてみるとこのメッセージはカスタマイズ可能なようです -> [参考サイト](http://blog.a1yama.com/entry/2016/01/18/170245)
未カスタマイズの状態で15種類のメッセージが登録されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197742/7db04225-2a8b-2909-15e3-ef34f2e3668c.png)


## 1. Please consider the environment before printing this Slack.
このスラックを印刷する前に環境を考えてください

## 2. Please enjoy Slack responsibly.
スラックを責任感を持って楽しんでください

## 3. What good shall I do this day?
私は今日何をするべきでしょう？

##4. Have a great day at work today.
今日は仕事で素晴らしい一日をお過ごしください

##5. More "holy moly!"
もっと驚こう

##6. Sometimes you eat the bear and sometimes the bear, well, he eats you.
時にはあなたはクマを食べ、時にはクマはあなたを食べます。

？？？

調べてみたところこれは熟語で、
時には勝利し、時には敗北します。誰もが成功と失敗を持っています
という意味らしいです。[weblio](https://ejje.weblio.jp/content/sometimes+you+eat+the+bear+and+sometimes+the+bear+eats+you)

##7. You're here! The day just got better.
あなたはここにいるよ！その日はちょうどよくなりました

うーん🤔

##8. The mystery of life isn't a problem to solve, but a reality to experience.
人生の謎は解決すべき問題ではなく、経験する現実です。

##9. Thank you for using Slack. We appreciate it!
スラックを使用していただきありがとうございます。私たちは感謝します！

##10. You look nice today.
今日は素敵ですね

##11. We’re all in this together.
私たちは全て一緒です

##13. Be cool. But also be warm.
クールになれ。しかしまた温かく。

##14. Alright world, time to take you on!
まあまあ、あなたを連れて行く時間！

🤔

##15. Always get plenty of sleep, if you can.
可能ならいつも十分な睡眠をとろう

エイゴムズカシイ。。
うまく訳せない部分が多くありましたので、編集リクエストお待ちしております😬

---

ちなみに日本語版はこんな感じです。
日本らしい文章も幾つか用意されていますね

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197742/d0f5527b-e630-8343-457f-e50acaf0e514.png)


英語、日本語の他にはスペイン語、フランス語、ドイツ語が用意されているようです。

# 多謝
- [Google翻訳](https://translate.google.co.jp/)

# おわりに
ここまで記事をお読み頂きありがとうございました！
明日の担当はまだ未定みたいです。
アドベントカレンダー皆さんで盛り上げていきましょう！
【Raspberry Pi 3B/3B+】スタティックなIPアドレス（固定IPアドレス）を設定する

#OverView
ラズパイに固定IPアドレスを設定したい場合の手順です。
IPアドレス関係の設定ファイルは「/etc/dhcpcd.conf」で行います。
LANケーブル直刺しの場合はeth0、Wi-Fiの場合はwlan0を設定します。
下記ではeth0の説明を行いますが無線の場合はwlan0に置き換えればOKです。

#1.現在のIPアドレスを確認する
$ ip a s | grep glo

もしくは

$ ifconfig

#2.設定
ターミナルで下記コマンドを実行して設定ファイルに追記していきます。
nano /etc/dhcpcd.conf


####### Static IP Address
interface eth0
####### IPアドレスとサブネットマスク（項番１のIP/24でOK）
static ip_address=192.168.10.xxx/24
####### デフォルトゲートウェイ（ルータのIPアドレス *ブリッジしてる場合はそっちのIP）
static routers=192.168.10.xxx
####### DNSサーバ（ルータのIPアドレス *ブリッジしてる場合はそっちのIP）
static domain_name_servers=192.168.10.xxx

#3.設定
~~sudo nano /boot/cmdline.txt~~
~~末尾に『net.ifnames=0』を追記して保存。~~
※2018/8/31追記：3B+であらためて設定を行いましたがこちらは設定不要と思われます。

#4.再起動
sudo reboot

お疲れ様でした。

メモ
iPhoneにFingというアプリを入れるとルーターを含めIP全部確認できる。
【Python】Observerパターン

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from abc import ABCMeta, abstractmethod

class Subject(metaclass=ABCMeta):
    @abstractmethod
    def attach(self, observer):
        pass

    @abstractmethod
    def detach(self, observer):
        pass

    @abstractmethod
    def notify(self):
        pass

class Observer(metaclass=ABCMeta):
    @abstractmethod
    def update(self, subject):
        pass

class Newspaper(Subject):
    def __init__(self, name):
        self.__name = name
        self.__observers = []
        self.__content = ""

    def attach(self, observer):
        self.__observers.append(observer)

    def detach(self, observer):
        if observer in self.__observers:
            self.__observers.remove(observer)

    def breakOutNews(self, content):
        self.__content = content
        self.notify()

    def getContent(self):
        return self.__content + '(' + self.__name + ')'

    def notify(self):
        for each in self.__observers:
            each.update(self)

class Reader(Observer):
    def __init__(self, name):
        self.__name = name

    def update(self, subject):
        print(self.__name, "is reading breakout news <b>" + subject.getContent() + "</b><br>")

if __name__ == "__main__":
    asahi = Newspaper("Asahi")

    sato = Reader("Sato")
    suzuki = Reader("Suzuki")
    tanaka = Reader("Tanaka")

    asahi.attach(sato)
    asahi.attach(suzuki)
    asahi.attach(tanaka)

    asahi.detach(tanaka)

    asahi.breakOutNews("Japan Break down!")
```
005-動的に変化するHTMLメールを作成したい

#結論
Class HtmlServiceにあるcreateTemplateFromFileを用いて別途用意したHTMLファイルを読み込みます。


```js:sample-code1.gs

function sendHtmlMail(){
  /* sendEmailメソッドで利用する連想配列変数を宣言します */
  var mailOpt = {};

  /* 別途用意したmail.htmlを読み込みます　*/
  var htmlBodyTemp   = HtmlService.createTemplateFromFile("mail");

  /* htmlBodyTemp 内の変数「mode」を、文字列"remove"とします*/
  htmlBodyTemp.mode  = "remove";

  /* 変数mailOptの「htmlBody」に、先に設定したhtmlBodyTemp（のScript部分）を評価した結果得られるコンテンツを挿入します */
  mailOpt.htmlBody   = htmlBodyTemp.evaluate().getContent();
  
  GmailApp.sendEmail("hogeratta@ahaaha.hoge", "mail test", "test mail",mailOpt);
}
```

```html:mail.html
<div>
（本メールはシステムにより自動送信されています）<br>
楽しみにしていた社員旅行が
<? if(mode == "remove"){?>
  中止となりました
<? }else{ ?>
  変更されました
<? } ?>
ことをご連絡致します。
</div>
```
#解説
「GASでお気軽Webアプリケーション」で利用される`doGet()`は、`GmailApp.sendEmail`メソッドでも有効です。
単純に「HTMLファイルへ記載した内容をメールとして送りたい」のであれば`createHtmlOutputFromFile()`、PHPライクに変数埋め込む場合は`createTemplateFromFile()`で別途作成したHTMLファイルを呼び出します。

上記例では`createTemplateFromFile()`を使ってますので、`evaluate()`してから`getContent()`しています。
単語の出現頻度を計算するときはCounterを使おう

[Counterクラス]は単語や数値などの出現した回数の数え上げに便利です。
今回は[Counterクラス]の実例を交えた紹介を行いたいと思います。

[Counterクラス]:https://docs.python.jp/3/library/collections.html#collections.Counter

# [Counterクラス]
## [難易度★☆☆] 簡単な動作例 
まずはじめに[Counterクラス]はこんな感じに使えますという例を紹介します。

```py3:対象データ群
names = ["Suzuki", "Tanaka", "Kato", "Suzuki", "Kato"]

numbers = [5, 2, 4, 5, 1, 3, 5, 6]
```
リスト内の重複した要素を数え上げしてくれます。

```py3:要素の数え上げ
from collections import Counter

Counter(names)
"""
Counter({'Kato': 2, 'Suzuki': 2, 'Tanaka': 1})
"""

Counter(numbers)
"""
Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 3, 6: 1})
"""
```
## [難易度★★☆] 応用例 
上の例で紹介したデータであれば目視で頻度を確認できますが・・・
例えばこんなデータの場合

```py3:対象データ
import random

random.seed(1)
# 1から10までの数値を100個用意しました
numbers = [random.randint(1, 10) for i in range(100)]
```
そういう場合に便利なのが`most_common`メソッドになります。
このメソッド引数nで指定したn番目までの要素を出現頻度共に以下のようにして返してくれます。
`[(要素A, 頻度), (要素B, 頻度)...]`

```py3:出現頻度多い順に並べる
cnt = Counter(numbers)
# 出現頻度が多かった５番目までの要素を出現頻度共に表示
cnt.most_common(5)
"""
[(9, 14), (7, 13), (8, 13), (1, 12), (4, 12)]
"""
```

## [難易度★★★] 英文メールを使った実用的な例　
これだけだと面白くないのでもう少し実用的な例を。上記二つの例を組み合わせたものになります。
プログラム中で出てくる`test.txt`は下記リンクの英文メールサンプルを貼り付けたものになります。
[今すぐ使える英語メール文例集【ビジネス英語メール編】 「自己紹介」　サンプル英語メール](http://englishmail.org/business/shokai_1.html)

```py3:単語出現頻度を調べる
from collections import Counter
import re
from pprint import pprint

pattern = "[,.;?!]"
file_name = "test.txt"
with open(file_name, encoding="utf-8") as txt:
	t = txt.read()
sentence = t.split("\n")

p = re.compile(pattern)
result = []

for s in sentence:
    # 文中の記号を除去        
	replaced_sentence = re.sub(p, "", s)
   # 空白で分割 
	words = replaced_sentence.split()
	result.extend(words)

cnt = Counter(result)
# 出現頻度が多かった５番目までの要素を出現頻度共に表示
pprint(cnt.most_common(5))
"""
[('I', 11), ('of', 5), ('a', 5), ('to', 5), ('your', 4)]
"""

```
以上です、お疲れ様でした。

#　参考
 - ライブラリーリファレンス
  - [Counterクラス](https://docs.python.jp/3/library/collections.html#collections.Counter)
研究室のみんなとNefry BTを使ってはじめIotデバイスをつくってみた

#はじめてIotデバイスをつくってみた
Nefry Advent Calendar 2017に投稿してみます！
東海大学で航空宇宙分野を専攻している三上といいます．
東海大学で行われている「ものづくり学生サミット2017 in 湘南」で，Nefry BTを使って人生初のIotデバイスを作ってみた話です．研究室の仲間＋αで試行錯誤しつつ作ってみました．
いろいろと初心者なので，ご容赦ください．

あっ，チームメンバの研究室はこんなところです．
http://www.ea.u-tokai.ac.jp/horisawa/main.html
http://www.ea.u-tokai.ac.jp/ikeda/
https://lss-lab-tokai.jimdo.com/

#子供の不快感を伝えてくれるデバイス「Watchild」
私たちのチームでは「あかちゃんは大人より温度や湿度に敏感」であるという点に注目しました．そして，言葉を操れないあかちゃんは温度や湿度からくる不快感を伝えることができないので，Iotデバイス「Watchild」でそういったことを周知しよう，というのがコンセプトです．

使用する状況は以下の2つを考えました．
###子供の車内放置
車内放置が起こる原因として，「そうせざるおけなかった」という状況があるということが[アンケート調査](http://www.jaf.or.jp/eco-safety/safety/data/info/1103enq/image/jsafe_01.pdf)でわかっています.
例えば，「子供が寝ていて起こせなかった」や「地域の習慣で車内に残していくことがある」といったことです．
▶こういった状況で子供が車内に残っている，ということを周囲に知らせたい！

###ベビーカー内での熱中症
意外なことに，ベビーカーに乗っているあかちゃんには熱中症の危険性が潜んでいます．
特に夏場，地面からの熱の照り替えしがベビーカー内を温めてしまいます．
ベビーカーでの熱中症対策をしている方は[14%](https://news.mynavi.jp/article/20130628-a099/)(!)しかいないそうです．
▶あかちゃんのおかれている状況を周知したい！

#コンセプト
Nefry BTを使うのでとってもシンプルです．
![コンセプト.png](https://qiita-image-store.s3.amazonaws.com/0/212276/332803cf-38b2-8ff9-d6d5-e4ceb070d180.png)

#動作と特徴
###動作
![動作原理.png](https://qiita-image-store.s3.amazonaws.com/0/212276/5cfeadb2-0865-5f11-930d-8ae46b4ed33d.png)
こんな感じで動作．
1．BLE(Bluetooth Low Energy)によりスマートフォンと接続する
2．デバイスとスマートフォンの通信が切断　
　 ▶デバイスの動作が開始
　 ▶つまり，車内から親が離れた
3．車内に幼児の存在を人感センサーで検知
4．基準値以上の温湿度を検出([環境省の熱中症予防サイト](http://www.wbgt.env.go.jp/wbgt.php)を参考に値を設定)
　 ▶危険な状態になったら…
5．表示パネルが点滅
 　 ▶外部に周知

###特徴
・BLE(Bluetooth Low Energy)による通信
　▶省エネ，短距離通信に特化
・人感センサによる検知
・Android アプリによるお手軽操作　　　　
　▶MIT App Inventorを使用
　▶アプリで操作できるような機能もこれから実装する予定
・電源はモバイルバッテリー
　▶現代人はだいたいもっているのでお手軽

BLEとMIT App Inventのことは，また別記事にまとめたいと思います．

#車内での使用例
![車内使用例.png](https://qiita-image-store.s3.amazonaws.com/0/212276/a07908b4-8249-c12a-c2c0-0b81b370ae17.png)

#完成品
動作が不安定が部分もありますが完成しました．
表示パネルが左側，Nefry BTや温度センサ，人感センサが格納された本体が右側です．
人感センサは右側の容器中央部にぴょこっとでているものです．
![IMGP5104＿リサイズ.jpg](https://qiita-image-store.s3.amazonaws.com/0/212276/e2ffc70d-3e11-19c5-78a7-a962bcaacdac.jpeg)

#はやりのIotデバイスをつくってみて…
まずは，**Nefry BTという素晴らしいマイコン**に出会えたことに感謝です！
そして，**Nefry BTのサポート体制**に驚きました！
(わからないことをfacebookのユーザーグループに質問するとすぐに返信がきて，**狂喜乱舞**)

また，Iotデバイスをつくるということをチームで取り組むことができ，**チームで開発する難しさ(情報共有，ディスカッションの取りまとめ…etc)**を感じました．そこは，**チームリーダー**の方がうまく取りまとめてくれました！感謝です！
その反面，当たり前ですが**仲間と目標に向かって取り組むという達成感**はもの凄いものでした．
**(ただし，まだまだ実現できていないことが多くあります．BLE周りが不安定だったり…人感センサの感度が良すぎたり…100%ではない完成なので，また改良していきたいと思っています．)**

これから，何かつくっていこうと思います．
DeployGate配信でiOSアプリのPush通知確認ではまった

## 結論：DeployGateでiOSアプリのプッシュ通知を確認する場合

- CertificateはProduction用のAPNsを使用する
- プロビジョニングプロファイルはProduction用のAdHocを使用する
- iOSの証明書は難しい

でも今回はまったおかげでやっとすっきりしました。

## 証明書は、開発用と本番用がある

### 開発用

- プッシュ通知用の証明書（APNs Development iOS）
- プロビジョニングファイル用の証明書（iOS Development）

### 本番用

- プッシュ通知用の証明書（APNs Production iOS）
- プロビジョニングファイル用の証明書（iOS Distribution）
- それぞれで2種類ずつ必要です。

てっきり「DeployGateへの配信ではDevelopでないといけない」と思い込んでいたのが間違いでした。

- Production用でAdHocを選べばOK

## 証明書の作成

CertificateではApplePush Notification Service SSL(Sandbox & Production)をえらびます。

![cer1.png](https://qiita-image-store.s3.amazonaws.com/0/69972/96317a57-ab1b-e7d7-0f37-fefd7b3f2716.png)


こんな感じで作成されます。
![cer2.png](https://qiita-image-store.s3.amazonaws.com/0/69972/dc295a0d-4f93-30ab-4cf7-f18bb3bf87dc.png)


次にプロビジョニングプロファイルです。
![prov.png](https://qiita-image-store.s3.amazonaws.com/0/69972/7171e233-2d45-029c-f29f-1a6855b52072.png)


プロビジョニング作成時に証明書を選択します。ここにはプッシュ通知用の証明書は表示されません！
てっきり表示されるのかと思ってはまりました。ご注意ください。通常通りアプリのIDを選択してください。

## 勘違いポイント

- DeployGate配信だからDevelopmentじゃね？→残念、Productionでした
- APNsはDevelopmentじゃね？→残念、Productionでした
- プロビジョニングプロファイルでプッシュ通知用の証明書選べばOKじゃね？→残念、選べません

結果的にはDevelopmentのPush通知証明書が不要なので楽ちん
Error running 'development': Rails server launcher wasn't found in project

RubyMineでRails appプロジェクトを作成して、サーバー起動しようとしたらタイトルのエラーが。

`Error running 'development': Rails server launcher wasn't found in project`

## 解決策

https://stackoverflow.com/questions/27883244/cannot-start-the-debugger-in-rubymine-rails-server-launcher-wasnt-found-in-pro

どうもちゃんとRails newする前にRubyMineを開いてしまったら、`.idea`の設定が変になった様子。
一旦RubyMineを終了、`.idea`ディレクトリを削除してもう一度開きなおすとちゃんと設定してくれた。
WEBDNNのWebAssemblyコンパイル環境をDockerで用意



# TL;DR
```
# （事前にカレントディレクトリを変換したいモデルのあるディレクトリへ移動すること）
docker run --rm -v "$(pwd):/src" -it lilacs2039/debian_webasm_webdnn
python /webdnn/bin/convert_keras.py resnet50.h5 --input_shape '(1,224,224,3)' --out output --backend webassembly
```
※コンパイルするモデルに応じて　resnet50.h5 --input_shape '(1,224,224,3)'　を適宜修正のこと

# はじめに
WEBDNNの[Windows版の環境構築](https://mil-tokyo.github.io/webdnn/docs/tutorial/setup_windows.html)が大変だったので、WebAssemblyをコンパイルできる環境をDockerイメージで用意しました。

※ Windows版 環境構築の大変だったところ

- python2/3の使い分けのためにpython3.batを作る
 - PATHを通すと環境が汚れる
 - PATHを通さない場合、DNNモデルコンパイルのたびにbatファイルを移動するのが大変
- Emscripten・Eigenのインストールが必要
 - 時間かかる（Linuxでも同じか…）

# 環境
- Windows 10 Pro
- Docker for Windows

# 実行手順
## ホスト側ドライブの共有を許可（Docker for Windowsの場合）
タスクトレイのDocker for Windwosアイコン - settings - Shared Drives - マウントしたいドライブにチェックを入れてApply

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186338/2a9f830a-59a9-3d85-47ec-7e530437e142.png)

共有が許可できてるか確認

```
docker run --rm -v c:/Users:/data alpine ls /data

#成功例
Administrator
All Users
...
```


## 変換したいモデルのあるディレクトリへ移動
（Windowsの場合、以降の処理はPowerShellから実行のこと。
　のちに実行する$(pwd)は、コマンドプロンプトだとうまく動かないため）

```
cd /path/to/model
```

## DockerHubからモデル読み込み・コンテナの実行

- 初回run実行時はDockerイメージがローカルにないので、自動でDockerhubからイメージをダウンロードしてくれる
- --rmオプションは実行終了時に、イメージから生成したコンテナを破棄
 - コンパイル後のモデルはホスト側のボリュームに残るのでコンテナは不要（というか、いらないコンテナは逐一消さないとコンテナのリストがすぐいっぱいになる）
- -vオプションでマウントするディレクトリを指定
 - ホスト側のカレントディレクトリ（$(pwd)）を、コンテナ側の/srcにマウントしている
 - コンテナの中でlsコマンドを実行することで、ホスト側のファイルが確認できるはず
- -itオプションは、擬似端末(pseudo-tty(text-terminal))を通して（-t)、コンテナを対話的に実行（-i）
 - このオプションでコンテナの中に入らないと、後続のモデル変換処理ができない

```
docker run --rm -v "$(pwd):/src" -it lilacs2039/debian_webasm_webdnn
```

## Dockerコンテナ上でモデルをコンパイル

- コンテナの中（root@4315cf995e5f:/src#　などと表示されているはず）から実行すること
- コンパイルするモデルに応じて**　resnet50.h5 --input_shape '(1,224,224,3)'　** を適宜修正のこと
- webassembly, webgpu, webglのモデルを生成
- outputフォルダの中にコンパイル後のモデルが保存される

```
python /webdnn/bin/convert_keras.py resnet50.h5 --input_shape '(1,224,224,3)' --out output
```

# 実行例：公式チュートリアルのResnet50コンパイル
[次記事](https://qiita.com/lilacs/items/c6fc8c0178a9563c0e2a)をご覧ください。


# Dockerイメージの構成
/
　├ webdnn                      ：　githubからcloneしたwebdnn
　├ src                         ：　作業用ディレクトリ


# その他

- Dockerhub
 -  https://hub.docker.com/r/lilacs2039/debian_webasm_webdnn/
- github
 - https://github.com/lilacs2039/debian_webasm_webdnn


<!-- 
- イメージの内容の説明
- 実行手順でやっていることの説明


-->
サーマルカメラの小型化について調査中

7万円以下の値段で買えるアンドロイド端末用のサーマルカメラが市販されている。

遠赤外線を使うサーマルカメラの分野でも小型が進行している。


- [サーマルカメラ搭載スマホ CAT S60、約9万円で日本発売。建機大手キャタピラーが開発](http://japanese.engadget.com/2017/08/30/cat-s60-10/)
![](http://o.aolcdn.com/hss/storage/midas/1f94405b7c9455c1ae5324809ac7e321/205613437/DSC08254.jpg)

http://www.flir.jp/home/

FLIR ONE PRO [Thermal Imaging Camera Attachment for iOS and Android](http://www.flir.com/flirone/?_ga=2.111897154.716173648.1512793958-1009863610.1512793958)


- [スマホをサーモカメラに変身させる「FLIR ONE for Android」レビュー＆初期不良の交換手続きはこんな感じ](https://gigazine.net/news/20170414-flir-one-for-android/)
![](https://i.gzn.jp/img/2017/04/14/flir-one-for-android/00_m.jpg)

- YouTube [Flir One Thermal Imager for iOS and Android](https://www.youtube.com/watch?v=quYGUAMaym8)



- [What is the difference between
the FLIR ONE Android Gen 3 and FLIR ONE Pro Gen 3
Comparison Guide](https://www.tequipment.net/flir/flir-one-android-gen-3-vs-flir-android-p/)



---

![](https://www.extremetech.com/wp-content/uploads/2014/10/Autoliv-headlamps-vs-far-IR-640x253.jpg)

引用元　https://www.extremetech.com/extreme/193402-what-is-night-vision-how-does-it-work-and-do-i-really-need-it-in-my-next-car

可視画像とFarIR画像は、夜間のヘッドライトのそばにいる人物を見つけるということにおいて決定的な差がある。


https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4431237/
[Excel VBA]複数セルに値を一発で書き込み

# Excel出力の悩みどころ
Excelは1シートあたりで1,048,576行、16,384列まで使える。
使えるが故に、Excelに目いっぱいデータを出力する業務アプリケーションはよくある。
というか、いっぱい作った。

## Excel出力あるある
Excel出力って実装1つですごく遅くなったり速くなったり。
昔、Access VBAでのExcel出力機能を改善することがあったけど、
数時間かかっていたものを書き方を改善させると20秒で出力できたり。

一番あるあるだったのが、1セルずつ出力。
これが100列、10,000行とかあったものだから、そりゃ処理速度遅いよね。。。

# 改善方法
1セルごとの書き込みを、まとめて書き込みに変えられれば、劇的に速度は改善する。

## 実装
出力範囲を先に確定させて、二次元配列に値を編集し、その二次元配列をRangeオブジェクトに叩き込めば、一発で書きこみができます。
(なので、変なセル結合があると困るのです。。。)
※Excel 2016です。

```vb:標準モジュール
Option Explicit
Public Sub RenderingTrial()
    Dim i As Long
    Dim j As Long
    Dim b As Workbook
    Dim w As Worksheet
    Dim r As Range
    Const RowSize = 10
    Const ColumnSize = 5

    ''配列だけど、定義はVariantで
    Dim v As Variant

    ''出力したいセルの範囲と同サイズの二次元配列を作る
    ''１次元目：RowSize
    ''２次元目：ColumnSize
    ReDim v(1 To RowSize, 1 To ColumnSize)
    
    ''テスト用のデータを投入
    For i = LBound(v, 1) To UBound(v, 1)
        For j = LBound(v, 2) To UBound(v, 2)
            v(i, j) = i * j + (i + j)
        Next j
    Next i
    
    Set b = ThisWorkbook
    Set w = b.Worksheets("TEST")
    
    ''配列と同サイズのRangeを作成
    ''左上のセルを起点に、二次元配列と同じサイズになるよう、Resize
    Set r = w.Range("B2").Resize(RowSize, ColumnSize)
    
    ''配列を代入
    r.Value = v
    
    Set r = Nothing
    Set w = Nothing
    Set b = Nothing

End Sub
```

## 実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221879/2232c041-7d38-e138-8818-ec4300f4d4d6.png)
nodejs,npm,dasherの導入がうまくいかなくて得たもの

先生にraspberry pi3とamazon dash buttonを使ってTwitterに「うんこなう」と呟くうんこなうボタンを作れと指令が出た。
早速、どうすればいいのかぐぐってみた。
どうやら、nodejs,npm,dasherを導入すれば良いことがわかった。
qiitaでnodejsとnpmの導入方法の記事がありその通りにやったが何故か最新版にならない。
Debianは最新のnodeを推奨してるとかしてないとかでapt-getでは最新にはならないらしい…
またいろいろ調べてみたところ、nodeのversion管理をしてくれるnというものがあるらしい。
npmでnを導入しnode,npmともに最新にすることが出来た。
そして、最後にdasherだ。これもqiitaに記事があった。
それを参照しつつ、導入したもののエラーを吐き腐る…
自分の環境に合わなかっただけだと思いqiitaで同じことをしている人の記事を参照し片っ端から試していった。
だが、どうしてもうまくいかなかった。
dasher以外にもdash-buttonなどもあるのでそちらでも試してみたがうまくいかない。
qiitaだけではなくwebで似たようなことをしようとしてる人の記事を色々見たがわからなかった。
もうめんどくさくて諦めようと思っていた。
なんとなくdasherのgithubに行った。
そして、readme.mdを眺めていた。
もちろん、cloneした時にreadmeも一緒に来るんだけど英語だしなんだかめんどくさいし記事通りにすればうまくいくだろうと思いもあって読んでいなかった。
下にスクロールしていくとraspberry piの文字が出てきた…
ちゃんと読んだ。
ご丁寧にコマンドまで書いてくれてた…
readme.mdの指示に従い導入し直すと./find-buttonがすんなりと通った…
find-buttonはdash buttonのMACアドレスを取得するものである。

今回のことで感じたこと
Qiitaは素晴らしい情報共有サイトである。
しかし、それだけを見るのではなく公式や作者のreadmeやwebサイトは要チェックである。

当たり前のことでゴメンナサイ
Markdown全く使ってなくてゴメンナサイ
読みにくくてゴメンナサイ
エンジニアになりたいプログラミング初心者文系大学生にとって最も大切なこと


某文系私立大学に在学中で、株式会社LITALICOでRailsエンジニアとしてインターンをしている@koheiyamaguchi0203です。この記事は『LITALICO Advent Calendar 2017』9日目の記事です。

#最も大切なこととは
「プログラミングをやったことがないが、Webサービスを開発するエンジニアになりたい私立文系大学生」に最も大切なこととは、 **メンターがいるかどうか**です。そもそもメンターとは何なのか、メンターがどうして必須なのか、メンターはどこで見つけることができるのかについて書いていこうと思います。

##メンターとは
メンターとは以下の少なくとも以下の要項を満たす人のことを指すと考えます。

###俯瞰した視点
ここでいう俯瞰した視点とは、「目標に対して、いつ、何を、なぜ、どのように実行すれば良いのかを考えることができる」ことを指しています。
目標とは、プログラミングを始める上での目標のことです。例えば、私のプログラミングを始めた理由はざっくり言えば「サービスを開発する」ことでした。その目標に対して、具体的な学習ロードマップを描くには、「いつ、何を、なぜ、どのように実行すれば良いのかを考えることができる」が必要になってきます。

###定期的にフィードバックを与えられる
学習を進める上での疑問点へのフィードバックは絶対に必要です。初心者は何が正しくて、何が悪いことなのかの判断すらもできません。その判断をしてもらうためには第三者からフィードバックしてもらう必要があります。さらに、その状況は長い間続きます。なので、定期的にフィードバックをもらえる必要があります。

##メンターの存在が最も大切である理由
メンターの存在が大切である理由をいくつか挙げます。ここで挙げているのは、独学でプログラミングをしている人と比較して、大切である理由です。挙げればキリがないのですが、「プログラミングをやったことがないが、エンジニアになりたい私立文系大学生」に足りないことを補ってくれることに限定かつ、個人的に重要だと思うことを書きます。

###独学だと良いエンジニアになりにくい
プログラミングをしていると、コードを書くことが沢山あります。良いコードを書くためには、良いコードが何なのかを知る必要があります。ですが、初心者が独学で良いコードに触れる機会はほぼありませんし、あったとしても、それが良いコードである理由を知ることができません。しかし、メンターがいれば、コードレビューをしてもらえます。そうすれば、良いコードはこんな感じで、その理由はこうであるというのを教えてもらえたり、考えるきっかけをもらえます。その積み重ねで少しづつ良いコードを書くことができるようになります。

###勉強方法を知ることができる
多くの私立文系大学生は大学に入ってから、勉強する機会はあまりないと思います。なので、勉強する方法が分からない人が沢山いると思います。勉強方法が分からないまま、勉強することは非効率で、モチベーションを維持するのが大変になってきます。ですが、メンターが様々なアドバイスをくれたおかげで勉強方法を確立させることができました。勉強の方法とは、「調べ物をする際には、原点に当たる」など多くの方法論があります。エンジニアの人たちは様々な勉強方法を試し続けてる人が多いので、効率が良く、自分に合った勉強方法を試行錯誤する手助けになると思います。

###圧倒的な強制力が働く
プログラミングの勉強をしていると、英語で説明されている難しい単語、概念や原則・原理などを理解する必要があります。しかもそれが沢山あります。勉強すればするほど、その難しさを知り、挫折していきます。そうでなくとも、人間は怠惰な生き物なので、めんどくさくなって勉強するのをやめます。ですが、メンターがいると、レビューをしてもらう際に、何も進捗がないとなんか申し訳ないですし、怒られそうです。そうすると、「絶対に勉強しないと。」となり、否が応でも勉強します。私は凄まじく怠惰な人間なので、メンターの存在による強制力に何度も助けられました。

##メンターをどうやって見つけるのか
メンターをどうやって見つけるべきなのか。それは具体的に3つほどあると思います。以下に書いておくので、比較して検討してみてください。

###インターン
学生なら、インターンが最もおすすめです。メンターも見つけやすい環境でありながら、実際の開発にも携われます。この環境は他では得られないと思います。よく言われるのが「初心者でもインターンとかできるの？」です。正直、結構難しいです。僕は10社ぐらい応募しましたが、全ての応募が見送りでした。でも、やる気と学習への意欲があれば、採用してくれる会社も少ないですがあります。個人的には受託会社、プログラミングスクールは初心者を研修して採用するというケースが多い気がします。弊社でも未経験者のエンジニアインターン受け入れの実績はありますので、詳しく知りたい方は私のFacebook messangerで連絡をくれれば、対応できるかもしれません。あと、インターンをする際に、聞くべきなのは研修の有無です。未経験者をいきなりOJTで教育すると言っているところは付いていくのが、スーパーハードな可能性が高いので、自信がない、やめておくべきです。

###スクール
スクールはお金を払えば、誰でも入れますし、簡単なWebサービスを作成する経験を得られるので、プログラミングの雰囲気を感じ取れる場所です。ただ、スクールを卒業してすぐにその辺の開発者と同じように開発できるようになる人は稀です。卒業後はどこかの会社でインターンをするのが良いです。どこの会社もキャリア支援事業をしているので、どこですればいいのかとかも相談するといいと思います。

###Webサービスを活用する
スキルシェア系のサービスで「プログラミング教えます。」と言った募集が沢山あります。なので、そこから良さそうな募集に応募してみるのも良いと思います。注意が必要なのは単発での募集になりがちなので、定期的なレビューをしてもらえるかは分かりません。

##終わりに
もちろん、プログラミング学習をする上でメンター以外にも大切なことは沢山あります。ですが私の経験上、メンターの有無は最も大切なことの一つです。「プログラミングをやったことがないが、Webサービスを開発するエンジニアになりたい文系大学生」は良いメンターと出会い、頑張って勉強しましょう。(自戒)

さて、明日の『LITALICO Advent Calendar 2017』10日目は@Ryotamuさんの「新卒エンジニアの脳みそを広げる非技術本7選」です。お楽しみに！
kibelaを使ってみて

# はじめに
@inductor氏が登録してくださり、エンジニャ雑談用チーム[mohikanz](https://mohikanz.slack.com)に[kibe.la]
(https://kibe.la/ja)が導入される運びになりました。

詳しくは下記をご覧ください。
触ってみた感想、良い点、要望などはほぼ下記の記事で言い尽くされています。

https://qiita.com/inductor/items/8005baa3fc502179ef90

筆者はこういったナレッジベースはおろか、マークダウンさえあまり書かないロートルなのですが、これを機に奮闘し、幾つか記事を書いてみました。

テスト記事：[ノルウェーのジャバ界隈](https://mohikanz.kibe.la/shared/entries/209bc83e-15aa-4dd5-8b55-a94b207310d5)

# 使ってみて
## 記事の編集、投稿
Qiitaのようなナレッジベースを経験していれば、自然に使えるのではないでしょうか。

環境によっては少しMD編集画面とプレビュー画面がずれるのが気になったくらいでしょうか。

例) LinuxMint + Chromium
![Screenshot_from_2017-12-09 12:01:32.png](https://qiita-image-store.s3.amazonaws.com/0/202996/5f875fd6-4fc4-86e6-4649-c94b68284efa.png)


## Wiki
Wikiを管理できるのが良いですね。
テンプレート（標準で日報テンプレートがある）を登録して、さっと書けるのも魅力です（業務で使う場合、過不足なく書ける）。

![Screenshot_from_2017-12-09 12:21:03.png](https://qiita-image-store.s3.amazonaws.com/0/202996/03c8d324-4744-06aa-ca2a-47fa8814d9bb.png)

## 要望
これはあくまで個人の我儘であり、チームとしての要望ではありません。
チーム内の要望に関しては先に掲げた@inductor氏がうまくまとめあげて下さっています。

これはQiitaなどでも言えるのですが、gitコマンドで直接管理できるとありがたい（おそらく履歴管理等で内部的にgitを使っていると思われ?）。
投稿ファイルをマークダウンやテキスト形式だけの制限付でも良いのですので、リポジトリとしてターミナルからvimで書いてpushできると・・・最高です。記事の中途保存など、ローカル側でカバーできる範囲が増えると思います（有償のみでも良いですので）。

あと、web編集画面で自動保存されると安心感が増すのでは、と思いました（もしかしたらされているのかもしれませんが、されていたらインジケータがあるといいと思います）。

# おわりに
素晴らしいサービスを無料で使わせて頂いてありがとうございます。
これからも切磋琢磨してゆかれ、サービス及びビジネスとしての発展をお祈りします。
C++とEigenで状態フィードバックの応答を求める。

#目的
C++言語とEigenとで、状態フィードバックの応答を求める。

状態フィードバックの応答は、別途、
[Python Controlで、状態フィードバックのゲインを求める。
](https://qiita.com/advent-calendar/2017/system_control)で求めておくとする。


#事前準備
[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)をインストールしておく。


#状態フィードバックとは

状態フィードバックとは、状態方程式で表したシステムにて

```math
\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)
```

状態変数xをフィードバックする制御システムである。

```math
u(t)=-Kx(t)
```

#実装

[Python Controlで、状態フィードバックのゲインを求める。](https://qiita.com/advent-calendar/2017/system_control)
もしくは、Matlab・scilabなどツールより、フィードバックゲインKが求められているとすると、

[C++とEigenで状態方程式を解く。](https://qiita.com/nnn112358/private/0ad933a53d7ec8248862)の
時系列応答を求めるループに、u(t)=-Kx(t)を足せばよい。

```c
	for (int i = 0; i < 1000; i++) {
		RungeKutta(dX, X, u, tt, dt, A, B, C, D);
		Y = C*X;
		u = -K*X;
		cout << tt << "," << u(0, 0) << "," << Y(0, 0) << endl;
		tt += dt;
	}
```


#サンプルソース

```c
#include "Eigen/Dense"
#include "Eigen/Core"
#include <iostream>
#include <fstream>
#define _USE_MATH_DEFINES

#include <math.h>
using namespace Eigen;
using namespace std;

void RungeKutta(MatrixXd dX, MatrixXd &X, MatrixXd u, double tt, double dt, MatrixXd A, MatrixXd B, MatrixXd C, MatrixXd D);


int main() {
	// Parameters defining the system
	double m = 250.0;         // system mass
	double 	k = 40.0;          // spring constant
	double  b = 60.0;          // damping constant

	MatrixXd A(3, 3);
	A << 1, -1, 1, 1, -k / m, -b / m, 1, 1, 1;
	MatrixXd B(3, 1);
	B << 0, -1 / m, 1;

	MatrixXd C(1, 3);
	C << 1, 0, 1;

	MatrixXd D(1, 3);
	D << 1, 0, 0;

	MatrixXd K(1, 3);		//FeedBask Gain
	K << 15.80864382, -3.63298165, 7.85453193;

	double dt = 0.01;
	double tt = 0.0;
	MatrixXd X(3, 1);
	X << 10, 0, 0;
	MatrixXd dX(3, 1);
	dX << 0, 0, 0;

	MatrixXd u(1, 1);
	u << 0;
	MatrixXd Y(1, 1);
	Y << 0;

	ofstream ofs("test.csv");
	ofs << "time," << ",u,y,x0,x1,x2" << endl;
	for (int i = 0; i < 1000; i++) {
		RungeKutta(dX, X, u, tt, dt, A, B, C, D);
		Y = C*X;
		u = -K*X;
		ofs << tt << "," << u(0, 0) << "," << Y(0, 0) << "," << X(0, 0) << "," << X(1, 0) << "," << X(2, 0) << endl;
		tt += dt;
	}
	return 0;

}


```
以下のように、フィードバック制御ができていることを確認する。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/73020/2b11c960-8a9f-48e3-f731-a668480d3ff1.png)
webサービスのログ運用について Athena + kinesis firehose + redash

この記事はAltplus Advent Calendar 2017の9日目のエントリです。

こんにちは、サービスのインフラ周りの対応をしている橋本です。
ログの可視化や集計などで、複数サービスに適用を始めたので、
現在のログ運用の構成を書きたいと思います。

# ログ運用について

## 構成

- fluend
- KinesisFirehose
- S3
- Athena + redash


## ログ流れ

```
fluentd -> KinesisFirehose -> S3
```

## ログ参照

```
redash -> athena -> s3
aws-cli -> athena -> s3
web -> athena 
```

## 監視について

アラート用でボトルネックになる部分とAWSサービス側障害用で下記を監視しております。

  - kinesisFirehose 
    - レコード取り込み数
  - fluentd
    - リトライ数

## ログフォーマットについて

他のところにも使うかもしれなかったので加工複数の環境に対応できるよう、JSONフォーマットでの書き出しを行っています。


## 集計時

- DBのデータとのJOINしたいとき
  - DBデータをTSV出力し、S3アップ後、Athenaのテーブル作成

## テーブル

- kinesisFirehoseでS3保存時に作成されるディレクトリの日付毎でパーティションを何年分かを設定しています。

## 困ったところ

Athenaのテーブル設定でパーティションを始め、年、月、日で分けていたのですが、クエリを書きずらかったため、
20171212 などひとつのカラムに年月日の形で入れたほうがクエリが簡単になり便利でした

## 懸念

今後、Athenaで参照するデータがだいぶ増えた場合にクエリにだいぶ時間がかかるようにならないか心配で、
なったときは、bigqueryのほうに引っ越しを考えています。

## クエリ

はじめ bigquery で運用していて、S3のログをGCS転送後そちらを bigqueryにロードするよう設定していました。
Athena側に移行する際に、日付パーティションの指定部分の違いとタイムゾーンの切り替えのところで少し悩んでいたので
where句のところをメモで残せればと思います。

- athena

```
# タイムゾーンのほう
SELECT date_format(time AT TIME ZONE 'Asia/Tokyo' , '%Y%m%d') as event_at,

# パーティションのほう
dt(パーティションのカラム) >= date_format((now() + interval '-30' DAY) AT TIME ZONE 'Asia/Tokyo' , '%Y-%m-%d') )
```

- bigquery

```
# タイムゾーンのほう
SELECT FORMAT_TIMESTAMP('%Y%m', time, 'Asia/Tokyo') AS date_time

# パーティションのほう
_TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 365 DAY))
```


## 所感

- ログを集約して転送する部分のサーバがなく少し運用が楽になりました
- まだそこまでのログ量はないのですが、S3にデータを保存するのだと、
 圧縮した状態で配置できるので、bigqueryに保存するよりもログ量が増えた際にお得になっていきそうに思います。
【React】overflow: scrollコンテンツにスムーススクロールを実装する

初投稿です。

最近業務でReactを使い始めました。
難しいですが楽しいですよね。React。
さて、今回は`overflow: scroll` コンテンツ内でスムーススクロールさせる方法をご紹介します。
方法はとても簡単なのですが、今回使用したreact-scrollというライブラリの公式サンプルが詰め込むだけ詰め込んだ形で私的には読みづかったのでピンポイントで実装方法をご紹介します。
## 実装方法:hammer_pick:
方法はざっくり2パターンあると思っていて、

 1. CSSプロパティ `scroll-behavior: smooth` を使う
 2. JSで書く(今回はreact-scrollというライブラリを使う)

1.に関してはCSS1つ追加するだけなのでシンプルです。ただし、Chrome,FireFox以外のブラウザではPolyfillしないと動作しないので注意して下さい。[can i use scroll-behavior?](https://caniuse.com/#search=scroll-behavior)

今回は2の方法を詳しく説明します。
## react-scrollを使う:hammer_pick:
[react-scroll](https://github.com/fisshy/react-scroll)はReact Componentにスクロール機能を与えるライブラリです。ライセンスはMITです。早速ですが`overflow:scroll`内の任意地点までスムーススクロールさせる方法を見ていきましょう。

```javascript
import React,{ Component } from 'react'
import { Link } from 'react-scroll'

class OverFlowContent extends Component {
  render() {
    return (
      <div>
        <Link to="link1" smooth={true} duration={250} containerId="overFlowScrollArea">リンク１へ</Link>
        <Link to="link2" smooth={true} duration={250} containerId="overFlowScrollArea">リンク2へ</Link>
        <Link to="link3" smooth={true} duration={250} containerId="overFlowScrollArea">リンク3へ</Link>
        <div id="overFlowScrollArea">
          <div name="link1">リンク１</div>
          <div name="link2">リンク２</div>
          <div name="link3">リンク３</div>
        </div>
      </div>
    }
  )
}
```
```JavaScript
import { Link } from 'react-scroll'
```
スムーススクロールを実装したい場合、読み込むのはたったこれだけです。ポイントは２つで、

- `<Link />`Componentの`to="link1`と"`name="link1"`がそれぞれリンクになっている
- `<Link />`Componentの`containerId="overFlowScrollArea"`がスクロールイベントをリッスンして、実際にスクロールを実行するコンテナとなる

公式は`<Element />`Componentをimportしていたり、不要なclassやIDの指定があり少々混乱するかもしれません。基本的には`<Link />`Componentに`to="hoge"`とそれに対応する`name="hoge"`があればリンクとして機能します。そして今回はスムーススクロールなので、`smooth={true}`にしておき`duration={}`は好きな速さに設定してください。

そして大事なのは`containerId`を確実に指定することです。これがないと、`overflow: scroll`のコンテンツ内でスクロールしません。

## まとめ

はやく`scroll-behavior: smooth`が標準実装された世界線に行きたい。
VisualStudioの診断ツールでCPUとかのグラフが見えなくなったときの対処方法

VisualStudioの診断ツールはDebug実行中のメモリ消費量の推移などが見れて便利です。
しかし、ある日そのグラフが非表示になっていまいました。
設定などを見ても該当するものはなく、Google先生も教えてくれず、ツライ。

そして後日、偶然対処方法を見つけたのでメモしておきます。

![スクリーンショット 2017-12-09 12.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/120077/56c4720a-6411-80eb-6409-c971c0e0c772.png)

![スクリーンショット 2017-12-09 12.11.57.png](https://qiita-image-store.s3.amazonaws.com/0/120077/4fefd49d-7e72-a7ac-8f18-d806a1bd2d90.png)

赤い矢印のあたりを下にドラッグする
**これだけ！！！**

こんなことで2時間以上悩んだ。
Laravel5でmigration実行時に外部ファイルのsqlを実行する

#やったこと/サマリ
- 別のサービスで使っているマスタデータをdumpで取得しmigration実行時にデータごと投入する
- 投入は migrate の up() 内で exec コマンドで行う

#背景
migrationは便利ですが初期データを入れるのにはseedと連携する必要があります。
また、seedもデータ数個程度であれば問題ないですが大量のデータを作成するのは面倒です。
特に、マスタ系の情報など、すでに他のDBに作成済みのテーブルやCSVファイルなどを大量に入れるには普通にSQL実行したほうが楽なのではと思っています。

今回は mysqldump で取得した SQL をそのまま migration 実行時に実行することで migration 実行時にデータ付きでテーブルを作成します

#作業内容
##dump ファイルの作成
mysqldumpコマンドでファイルを作成します。
` mysqldump -u username -p dbname tablename > tablename`

今回は`database/dump_data`ディレクトリを作成し、そこにこのファイルを置いています。


##migration の作成
migration ファイルを作成します

`php artisan make:migration create_masters`


##up() にコマンドの追加

```create_masters.php
$file_path = realpath(__DIR__.'/../dump_master/');
$file_name = 'tablename';
exec('mysql -u '.env('DB_USERNAME').' -p'.env('DB_PASSWORD').' '.env('DB_DATABASE').' < ' .$file_path.'/'.$tablename);

```
`realpath(__DIR__)` コマンドでmigrationファイルの存在するパスを取得できるので、そこからの相対パスでdumpファイルを取得します。

###注意
`.env`ファイルに`DB_USERNAME`, `DB_PASSWORD`, `DB_DATABASE`の値が設定されている必要があります。
特に`DB_PASSWORD`については空文字だと正常に動作はしますが、
mysqlコマンドの `-p` オプションが「パスワードが空文字である」と認識できず`enter`キーを押す必要がでるため、
mysqlの設定込でパスワードを設定しておく必要があります。

##migration の実行
`php artisan migrate`を実行すると動くことが確認できるかと思います。


#他のやり方ないの？
もっと Laravel ぽい書き方がしたかったのですが、調べてもすぐには見つかりませんでした。
[Issue with DB::unprepared()](https://github.com/laravel/framework/issues/18390) にかかれていますが、`unprepared()`を使うことでできるケースもあるみたいです。
ただバージョンなどでハンドリングが必要なのでこのやり方でもいいかと思います。

（もっとLaravelっぽくかっこよく書ける人いましたら教えてください！）

以上です。
Ubuntuにpecoを導入してフィルタを素敵にする

# pecoとは

色々なものをフィルタしてくれるツール。
詳細はGitHubのデモを見るのが一番はやい。
https://github.com/peco/peco

# 環境
OS：ubuntu 16.04 LTS
シェル：zsh 5.1.1

# 導入方法
```
# tarファイルをダウンロード
# 2017/12/09時点の最新はv0.5.2
sudo wget "https://github.com/peco/peco/releases/download/v0.5.2/peco_linux_386.tar.gz"

# 解凍
sudo tar xzvf peco_linux_386.tar.gz

# 移動
cd peco_linux_386

# 実行権限を付与
sudo chmod +x peco

# pecoを配置
sudo cp peco /usr/local/bin

# 実行できるかを確認
peco --version
```
## 設定
.zshrcにpeco用の設定を追記

``` zsh:.zshrc
# ----------------------------------
# peco
# ----------------------------------
function peco-select-history() {
  BUFFER=$(\history -n 1 | tac | peco)
  CURSOR=$#BUFFER
  zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```
あとは
``` source .zshrc ```
で再読み込み。

### 設定時の注意点
最初に試した時は
``` BUFFER=$(\history -n 1 | tac | peco) ```
を
``` BUFFER=$(\history -n 1 | tail -r | peco) ```
にしてたらうまく動かなかった。
tailの-rはMacにしかないらしい。
最初「無効なオプションです」って言われてman tailして初めて知りました。。。
※他の方が書いているpecoの設定をそのままコピペしてハマった・・・

# 使ってみる
- Ctrl + r でコマンド履歴を見る。
「ja」でフィルタすると「ja」を含む文字列を出力してくれる。
![範囲を選択_002.png](https://qiita-image-store.s3.amazonaws.com/0/64360/891a969d-c0ed-f66c-737a-89fd86865979.png)


- コマンド実行結果を入力に使う
![範囲を選択_003.png](https://qiita-image-store.s3.amazonaws.com/0/64360/df03792d-6ceb-04e4-d772-b3a9f4add33d.png)
ps の結果をpecoに渡すことができる。
![範囲を選択_004.png](https://qiita-image-store.s3.amazonaws.com/0/64360/5028262d-026e-01ba-077f-8aa2ffa4ab03.png)
そのまま任意のフィルタもできる。
![範囲を選択_005.png](https://qiita-image-store.s3.amazonaws.com/0/64360/16e04860-0f20-5238-ea10-2a91a186d888.png)
会議のUXをちょっと良くするツールデザイン

ある高校のベテラン教諭が、 **説明をする前にプリントを配ってはいけない** とおっしゃっていました。

プリント配布後に説明をしようとしても、生徒の注意はすでにプリントに向いてしまっているので、教師の話は頭に入ってこないぞと。

先に集中して話を聞かせた後で、はじめてプリントを生徒の目に入れるのが良い。

あとになって思えば、これは授業の **UI/UX** の話だったわけです。

これに学び、日頃の会議をUI/UXの観点からデザインし直してみました、という話。

## タイムキープ問題

会社を良くするために1日30分だけ話しあう時間をとりましょうという試みをやっていたんですが、どうにも30分で終わらないことが多く、ズルズルと1時間近く続いてしまいがちでした。

きっちり決めた時間で終わりたいのに、会議中に終了時間を意識できていないのだとしたら、これはたぶんデザインが間違っているわけです。

### タイムキープのUI

というわけで、常に終了時間を意識できるように、シンプルなタイマーアプリを作って、画面に表示しておくようにしました。

![timer_1.png](https://qiita-image-store.s3.amazonaws.com/0/211332/c2b05855-0eb0-0eee-f1cd-f3e4fc8d4a3b.png)

残り時間が減るにつれてでっかくなっていく。

![timer_2.png](https://qiita-image-store.s3.amazonaws.com/0/211332/844631fc-b1e4-733b-c3b5-533ebb20ecd0.png)

00:00を過ぎると、赤文字になって超過時間をカウントアップしていきます。

![timer_3.png](https://qiita-image-store.s3.amazonaws.com/0/211332/4b7bf398-76d8-00c9-10ea-c8c4ba120efb.png)

### 成果

赤文字にしたのも効果があったのか、なんだか「早く終わらせないと！」という気持ちになるらしく、会議の平均時間は目に見えて短くなりました。

反面、残り時間がわずかになると、参加者の注意が完全にタイマーに言ってしまって、話に集中できなくなるデメリットはあるように思います（というかそれを狙っているんだから当然ではある）。

## 議事録の改善

顔をあわせて口頭で行う会議は、やりとりが速い・感情が伝わりやすいといったメリットがある反面、以下のような問題が起こりがちです。

* 道をそれたまま議論が盛り上がり、気づけば当初の課題が未解決のまま
* 発言の意図が正しく伝わらない
* 後になってから「言った」「言わない」でもめる
* その場の空気に流されて結論が極性化する

これらのような問題の多くは、議論される内容が可視化されていないことに起因する部分が大きいように思いました。

ということは、議事録のデザインです。

### 議事録のUI

前述の問題を解消するためには、参加者が議事録をリアルタイムで共有する必要があります。

つまり、 **全員に見える状態で議事録をとる** ということ。
画面上にエディタを表示し、そこで議事を記録していきます。

構造化された文章を素早く打ち込むには、markdownが最適でしょう。
ブラウザで利用できるエディタとして、はじめは [かんたんMarkdown](https://tatesuke.github.io/KanTanMarkdown/)を利用しました。

![kantanmd.png](https://qiita-image-store.s3.amazonaws.com/0/211332/34f26d83-13c6-9e6f-0275-9e52a361ed9e.png)

しかし、この用途で使うには若干の不都合がありました。
（多くのmarkdownエディタがそうですが）編集欄とプレビュー欄でペインが左右に分かれているため、参加者のフォーカスがばらけてしまいます。
これでは、効果が半減してしまう。

そこで、[StackEdit](https://stackedit.io/)を使います。

StackEditも左右でペインが分かれていますが、編集欄自体もWYSIWYG（What You See Is What You Get）になっており、プレビュー欄なしでも、ちゃんと整形された状態で見ることができます。

![stackedit.png](https://qiita-image-store.s3.amazonaws.com/0/211332/7925047c-a8e3-3bd0-f9f4-52774e95f8f2.png)

### 成果

タイマーと比べると議事録は、わかりやすく大成功！といえるほどの成果はなかったかもしれません。

* 議論が盛り上がると、議事録を書いている途中であっても置いてけぼりにして進んでしまう
* 結局、見ないひとは見ない
* 議事録を書く係をやりたくない

といった状況も見られ、まだ改善の余地がありそうです。

ただ、少なくとも決定事項に関しては、「これで決定でいいですね？」というのを書いて文字で共有するので、認識の一致は取りやすくなった気がします。

## まとめ

物事がうまくいかないときに、個々の意識の問題にするのは簡単（必ず個々の意識にも問題はあるので）ですが、「UI/UXの設計は間違っていないか？」という観点を持てるようにしておくと、問題解決の手段が増えるかもしれません。
Dockerfileで、あえてsourceコマンドで環境変数を設定

# はじめに
Dockerfileで環境変数を設定するときはENVを使う
[Dockerfile Reference](https://docs.docker.com/engine/reference/builder/#env)

```
ENV PATH $PATH:/path/to/bin
```

でも、なんかうまくいかなかったから他の方法でやってみたのでメモ


※ これから書く方法を使用しなくても、以下コマンドでPathを通せるとコメントいただきました。

```
. ~/.bashrc
```

---

# 環境
- Windows 10 Pro
- Docker for Windows

# SourceでPathを通す
Dockerfileのビルドはbashではなくshで実行されるため、sourceコマンドを使おうとすると

```
source : not found
```

というエラーが出る。
shをbashへのシンボリックリンクで置き換えて、Dockerfileの終了時に元に戻すことで対応する。

## 例（pyenvへのpathを通して、pyenv経由でanacondaインストール）

```
RUN mv /bin/sh /bin/sh_tmp && ln -s /bin/bash /bin/sh

#pathを通す
RUN echo 'PATH="$PATH:/path/to/pyenv"' >> ~/.bashrc
#pathを読み込んで処理
RUN source ~/.bashrc && \
  pyenv install anaconda3-5.0.1

RUN rm /bin/sh && mv /bin/sh_tmp /bin/sh
```

参考：https://stackoverflow.com/questions/20635472/using-the-run-instruction-in-a-dockerfile-with-source-does-not-work
汎用LED MATRIX DISPLAYを、ラズパイで使ってみる2

さ、次は、配線の検討。

やりたいことは、まあ温度計なので。
I2Cは、残しておきたい感じ。

ライブラリの結線図は、まあ。
![Image8.png](https://qiita-image-store.s3.amazonaws.com/0/216885/d60ab96d-f006-f6e0-7288-df9f12cd0abc.png)
ダメな感じが漂います・・・。
　＃３と５がI2C共用ね。

まあでもよーみてみると、ニコニコマークの１だけ繋げばよさげな感じ。
２と３は、チェーン接続時の縦方向増設用っぽいねえ。

I2Cは、USBコネクタで渡してやろうと画策。
使うデバイスが3.3Vなので、VCCは3にして。
こんな結線でいこうかと。

```test:I2c_DEVICE_USB_PIN_HEADER
1 vcc3.3
2 scl
3 sda
4 gnd
```

まとめてみると、こんな感じになりそうです。

```test:rpi_curcuit
USB1   01 02 VCC5V IN
USB3   03 04 VCC5V IN
USB2   05 06 USB4 (GND)
LEDSTB 07 08 NC
NC     09 10 NC (LEDE)
LEDCLK 11 12 LEDOE
LEDG0  13 14 LEDGND
LEDA   15 16 LEDB
NC     17 18 LEDC
LEDB1  19 20 NC
LEDG1  21 22 LEDD
LEDR0  23 24 LEDR1
NC     25 26 LEDB0
```

ただし！、オイラが買ったの、結線の情報がありません。
![DSC03443.jpg](https://qiita-image-store.s3.amazonaws.com/0/216885/132e5d9c-918c-f253-c6ac-f29f8c218cf0.jpeg)

ま、これは。
Adafruitの配線図から拝借して、まあなんとかなりました。
![Image10.png](https://qiita-image-store.s3.amazonaws.com/0/216885/2c992ba3-2d23-8753-4655-e09fc0e44f9c.png)
https://cdn-learn.adafruit.com/downloads/pdf/32x16-32x32-rgb-led-matrix.pdf

まあぶっちゃけ。
データのビットが0始まりか1始まりか、アドレスのD線、E線があるか無いか、端子名称が「ラッチ」か「ストローブ」か、の差っぽいので。
テスターであたれば、なんとなく予想が付く感じです。

さて。

データバスは、そんな電流流れないので、ほっそい線でも大丈夫っぽいです。
ETFE線で、さっくりとね。
![DSC03455.jpg](https://qiita-image-store.s3.amazonaws.com/0/216885/90cd56d1-28a9-86c7-d353-47fecea79db3.jpeg)

って、バスの流れ的に、コネクタは直交より、平行のほうがよさげな感じでした。
まあ、あとのまつり。

I/Fはこんな感じ。
![DSC03454.jpg](https://qiita-image-store.s3.amazonaws.com/0/216885/83a9eebf-c19a-7d64-cb40-908240ff25c1.jpeg)
パネル１枚だけなら、２６ピン、つまりRPIの初代とかでも対応できる感じ。
まあ、今更初代とかレアだと思いますが。
L字にUSBのピンヘッダ出して、5Vの電源をACアダプタから貰う感じで、作ってみました。
右のビニ線が、LEDへの電源供給ね。

早速ハンズオン。
![DSC03456.jpg](https://qiita-image-store.s3.amazonaws.com/0/216885/335a6d43-0c90-bc12-aa41-09815c8a3cf6.jpeg)

電源入れて、ライブラリ入れてコンパイル、適当なppmファイルをサンプルプログラムに突っ込んでみると・・・。
![DSC03459.jpg](https://qiita-image-store.s3.amazonaws.com/0/216885/b3417b4f-bedf-6c3e-a22d-eb9c7e1719aa.jpeg)

割とあっさり、動いてしまいました、とさ。

さ、次は、こいつで壁掛け温度計をだね。

続き：https://qiita.com/eucalyhome/items/bb578b9e7accb947e61d
ハイブリッドアプリって何？

# はじめに
新卒専用アドベントカレンダー9日目です。
自分が業務で触れているハイブリッドアプリについて書きます。

### 参考サイト
[Cordova公式サイト](https://cordova.apache.org/)
[Cordovaでつくるハイブリッドアプリ](https://qiita.com/mako/items/757523727b3db334eeff)
[ハイブリッドアプリとは](https://qiita.com/soarflat/items/cf5d343c75baadb461dc)

# そもそもハイブリッドアプリって？
ネイティブアプリ（iOS/Android）をWeb技術で開発するためのプラットフォーム。
Webしかやったことない人でもHTML/CSS/JavaScriptでサクサク実装可能
Cordovaはそれ自体がWebViewで構成されています。

# でもスマホのカメラとか使えないんでしょ？
端末の機能もJavaScriptから扱える仕組みが提供されています。
Cordovaの場合はCordova pluginを追加することで以下のようにアクセス可能になります。

```js
navigator.camera.getPicture(cameraSuccess, cameraError, cameraOptions);

        function cameraSuccess (imageData) {
            let image = document.getElementById ('picture');
            image.src = "ファイル置きたい場所" + imageData;
        }

        function cameraError (err) {
            alert ('エラーだよ ' + message);
        }
    }
```

# 手軽に開発したい
便利なハイブリッドアプリ用のフレームワークがあります。
[OnsenUI](https://ja.onsen.io/)
[Ionic](https://ionicframework.com/)

また、クラウドの開発プラットフォームもあり、手軽に試すことも可能です。
[Monaca](https://ja.monaca.io/)

# ハイブリッドアプリのメリット
- Webやってる人は学習コスト下がる
- クロスプラットフォームなので工数削減
- ソースコードを共通化できる

# ハイブリッドアプリのデメリット
- ネイティブアプリに比べてパフォーマンスが悪い（最近ではあまり変わらないそうです）
- マイナーな機能を使いたい場合はプラグインを自作して対応する必要がある

# 終わりに
短くなりましたが、Webしかやったことない！という人でも手軽にスマホアプリ開発を試せるので、ぜひぜひ触れてみて下さい。
組合せ最適化で最短超文字列問題を解く

# これなに
[最短超文字列問題](https://qiita.com/okateim/items/9b2fb3ed0c902102ba9c)を[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)で解いてみましょう。

## 最短超文字列問題とは(上記記事より)

>入力：文字列の集合 $S = \\{s_1, s_2, ..., s_n\\}$
出力：$S$ 中のすべての文字列を部分文字列として含む最短の文字列の長さ

$S = \\{AGA, CTAG, GATC\\}$ ならば、最短超文字列は $CTAGATC$。
$S = \\{CATGC, ATGCAT, CTAAGT, GCTA, TTCA\\}$ ならば、最短超文字列は $GCTAAGTTCATGCAT$。

## 考え方

文字列の集合から部分文字列となるものを除いて、空文字列(`""`)を追加しておきます。
文字列間の距離を**`伸びる長さ`**とすれば、最短超文字列問題は、[巡回セールスマン問題](https://qiita.com/SaitoTsutomu/items/def581796ef079e85d02)そのものです。
早速、やってみましょう。

## Pythonプログラム

以下のプログラムは厳密解を求めるので、サイズが増えると、解けなくなるのでご注意ください。

```py3:python3
def overlap(s,t):
    """sとtの重なりの長さ"""
    m = len(s)
    n = max(0, m-len(t))
    for i in range(n,m):
        if s[i:] == t[:m-i]:
            return m-i
    return 0

def shortest_superstring(words):
    """最短超文字列問題"""
    from ortoolpy import tsp
    words = ['']+words
    n = len(words)
    dist = {(i,j):len(t)-overlap(s,t) for i,s in enumerate(words)
            for j,t in enumerate(words) if i != j}
    _,lst = tsp(words,dist)
    return ''.join(words[j][len(words[j])-dist[i,j]:] for i,j in zip(lst,lst[1:]))
```

## 確認その1

```py3:python3
shortest_superstring('AGA CTAG GATC'.split())
>>>
'CTAGATC'
```

## 確認その2

```py3:python3
shortest_superstring('CATGC ATGCAT CTAAGT GCTA TTCA'.split())
>>>
'GCTAAGTTCATGCAT'
```

どちらも合っています。

以上