OmniAICreator/Qiita-1.07M huggingface dataset:
mermaidで書かれた図の形式変換コマンドをdocker imageにまとめた


mermaidjsは凄く便利ですね。
大量に図を作った時に、Markdownを一括してpng形式等に変換したいときがあると思います。
公式には「mermaid.cli」という変換コマンドがありまして、これをまとめたDocker imageを作成しました。
(正確には日本語フォントなどの調整。)

[Docker Hub]
[mermaid.cli.jp](https://hub.docker.com/r/yamada28go/mermaid.cli.jp)

以下のように一般コマンドみたいに使用する事が出来ます。

```shell:コマンド例
docker run --rm -v マウントパス:/local yamada28go/mermaid.cli.jp -i /local/対象ファイル.md -o /local/出力ファイル.png
```
Amazonギフト券を自動で購入するスクリプトを作った

# はじめに
ログイン情報を書いたり購入動作もあるので、使う場合は自己責任で。

# Amazonギフト券を自動で買わせてみた
お勉強がてら、Seleniumを使ってAmazonギフト券を買わせてみた。
(少額で動作確認できるからしくじっても安心...？)

## 環境
- Windows10 64bit
- Python3.6
- ChromeDriverダウンロード済
- Seleniumインストール済

※環境準備については他の記事に譲ります

## ソースコード
```python
from selenium import webdriver

def signin(driver, email, password):
    driver.get('https://carriercentral.amazon.co.jp/request')
    time.sleep(1)

    driver.find_element_by_id("ap_email").send_keys(email)
    driver.find_element_by_id("ap_password").send_keys(password)
    driver.find_element_by_id("signInSubmit").click()

    return

def buy_gift_card(driver, amount, send_to):
    driver.get(r'https://www.amazon.co.jp/Amazon%E3%82%AE%E3%83%95%E3%83%88%E5%88%B8-2_JP_Email-Amazon%E3%82%AE%E3%83%95%E3%83%88%E5%88%B8-E%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%97-%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86/dp/B004N3APDM/ref=lp_3128323051_1_2?s=gift-cards&ie=UTF8&qid=1553318863&sr=1-2')
    time.sleep(3)
    driver.find_element_by_id("gc-order-form-custom-amount").send_keys(amount)
    driver.find_element_by_name("emails").send_keys(send_to)
    driver.find_element_by_id("gc-buy-box-bn").click() # 「すぐに購入」

    time.sleep(3)
    driver.find_element_by_id("continue-top").click() # 確認

    time.sleep(3)
    driver.find_element_by_name("placeYourOrder1").click() # 注文確定
    
    time.sleep(3)

    return

if __name__ == "__main__":
    signin_email = 'Amazonサインインメールアドレス'
    signin_password = 'パスワード'
    amount = 100 # 購入金額
    send_to = signin_email # ギフト券送付先メールアドレス

    driver = webdriver.Chrome(r'ChromeWebDriverの実行ファイルフルパス')
    
    signin(driver, signin_email, signin_password)
    
    buy_gift_card(driver, amount, send_to)
```
【小ネタ】docker環境を掃除するコマンド

# はじめに
Dockerを普通に使っていると、停止状態のコンテナやdanglingなイメージ（REPOSITORYやTAGが\<none\>になっているもの）がたまっていきます。
これらを一括削除する方法をまとめてみました。

# 実行コマンド
## 不要なリソースすべて削除する (docker system prune)
何も考えずに、使われていないと思われるリソースを削除します。ローカルの開発環境であればこれが一番簡単です。

docker system prune | Docker Documentation
https://docs.docker.com/engine/reference/commandline/system_prune/

```
$ docker system prune
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
d75069ae85738508edbbcb7027d0caff3174ac09629089462f7bdcafd0a56223
b342fa0ac8d3d5e75e403ad77940045a71e221865cb866f46140d1633249d6ba

Total reclaimed space: 8.402MB
```

## Docker imageで不要なものを削除する (docker image prune)
どのコンテナからも参照されておらず、且つdanglingなイメージを削除します。

docker image prune | Docker Documentation
https://docs.docker.com/engine/reference/commandline/image_prune/

```
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
```

docker image pruneがなかった時代は、以下のようにコマンドを組み合わせていましたが、今となっては不要でしょう。
xargsの代わりに、シェルのコマンド置換（「$()」若しくはバッククォート「``」）を組み合わせたパターンもよく見ました。

```
$ docker images --filter "dangling=true" -q | xargs docker rmi

$ docker rmi `docker images --fileter "dangling=true" -q`

$ docker rmi $(docker images --fileter "dangling=true" -q)
```


## 停止状態のDocker containerをすべて削除する (docker container prune)
停止状態のコンテナ（STATUSがExitedかDeadのもの？）をすべて削除します。

docker container prune | Docker Documentation
https://docs.docker.com/engine/reference/commandline/container_prune/

> **Description**
> Remove all stopped containers

「stoppped」の定義が見つからなかったのですが、コマンドの挙動からおそらくSTATUSがExitedとDeadのコンテナが対象になるのではと思います。

```
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ba802702150e13e1b95d4868b1eabee1c929d37b38da548786b6f4872be056b4
3dbd0f7d84f6d918473e6e90b971af3bf1b0eb2ce3e524a5db1f00061517859f

Total reclaimed space: 4.201MB
```

docker container pruneがなかった時代は、以下のようなコマンドがよく使われていたと思います。
これも、xargsの代わりにシェルのコマンド置換（「$()」若しくはバッククォート「``」）を組み合わせたバリエーションがあります。

```
$ docker ps -q -a| xargs docker rm

$ docker rm `docker ps -q -a`

$ docker rm $(docker ps -q -a)
```

「-a」オプションをつけると、停止状態のコンテナも実行中のコンテナもすべて出力され、docker rmコマンドの対象となります。
実行中のコンテナを削除しようとしてもエラーになるので、結果として停止状態のコンテナのみが削除される、という動きになります。


# 補足：docker image／docker containerに関するコマンドの詳細
最近のdockerコマンドは、第一引数に「container」や「image」、「network」などを指定して実行できるように整理されており、何を対象とした操作なのかわかりやすくなっています。
「docker ps」や「docker container ls」は実質的に同じことを実行します。
しかしながら、公式ドキュメントは古いほうのコマンドの説明しか詳細に書いていなかったりするので、探すときには注意が必要です。

## Docker image lsの詳細
「docker images」に詳細が記載してあります。

docker images | Docker Documentation
https://docs.docker.com/engine/reference/commandline/images/

## Docker container lsの詳細
「docker ps」に詳細が記載してあります。

docker ps | Docker Documentation
https://docs.docker.com/engine/reference/commandline/ps/
DelphiのTTaskでもContinueWithがしたい！

読んで字の如く。

#前置き
DelphiのRTLは .NET Framework を後追いしている印象があり、
`TTask`クラスを始めとした並列プログラミングライブラリも
割と最近のバージョン（XE7）で追加されました。
しかし基盤となる技術が異なる、設計思想が異なる等の理由で
メソッドや記述方法が違っていたり、そもそも機能がなかったりします。

#継続処理は必要でしょ
並列処理を実装していくと、たいてい時間のかかる処理の前後で
UI操作を行ったり処理順を意識する場面が出てきたりします。
こういうとき .NET では `ContinueWith`メソッドを使用しますが、
残念ながらDelphiの`TTask`クラスにはありません。

ということで作ってみました。
[ダウンロード](https://drive.google.com/file/d/1o5oSHIN8OnGr0lOd8cgMxByF6hzO7EXs/view?usp=sharing)（MITライセンス）

`TTask`クラスのヘルパーとして実装されているので
usesするだけで以下のように使用可能です。
メソッドチェーンももちろんOK。

```pascal:Unit1.pas
//----------
uses
  System.Threading, WS.Threading;
//----------

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Enabled := false;
  Label1.Text := '処理1...';

  // 時間のかかる処理（別スレッド）
  TTask.Run(procedure
    begin
      TThread.Sleep(5000);
      //raise EInvalidOperation.Create('例外テスト');
    end)
  // 継続処理のためUI更新（前スレッド完了時のみ。UIスレッド）
  .ContinueWith(procedure(t: ITask)
    begin
      Label1.Text := '処理2...';
    end, [TTaskContinuationOption.OnCompleted, TTaskContinuationOption.Synchronize])
  // 時間のかかる継続処理（前スレッド完了時のみ。別スレッド）
  .ContinueWith(procedure
    begin
      TThread.Sleep(5000);
    end, [TTaskContinuationOption.OnCompleted])
  // 後処理（UIスレッド）
  .ContinueWith(procedure
    begin
      Button1.Enabled := true;
      Label1.Text := '完了';
    end, [TTaskContinuationOption.Synchronize])
  ;
end;
```

`ContinueWith`に指定するプロシージャは前のタスクをパラメータに受け取ることもできます。
`TTask.Run`メソッドだけでなく`TTask.Future<T>`メソッドも継続可能になっていますが、
`ContinueWith`自体は戻り値を返せません。
本当はやりたかったけどインタフェースにジェネリックメソッドを定義できないので
断念しました…。

Delphi 10.1以降で動作確認しましたが
XE7以降なら動くかも。動いたら報告頂けると幸い。
またVCL、FMXのすべてのプラットホーム(Linux含む)で動作します。

ソースはMITライセンスに基づいて自由にしてもらって構いませんが、
バグ報告や機能追加のフィードバックもらえると喜びます。
プロダクトに Ethereum ERC20 トークンを組み込む

プロダクトに Ethereum の ERC20 トークンを組み込むときに設計した構成をまとめた文書です。
自社で Ethereum の ERC20 トークンを発行して、ユーザに付与したり使ってもらうことを想定しています。
プロダクトはウェブでもアプリでもいいです。Ethereum を利用した dApps ではありません。既存のプロダクトにひとつの機能としてトークン管理を追加します。
例えば、EC サイトであれば購入者に対してポイントを付与したり、実店舗と連係したアプリで来店時にポイントを付与するような仕組みがありますが、そのポイントを自社発行トークンに置き換えるような用途を想定しています。

## 要件
- ユーザは Android, iOS アプリを利用します 
- ユーザはアプリで秘密鍵を生成してアドレス（ウォレット）とトークンを保有します
- サーバにはユーザの秘密鍵、パスワードを保有しません
  - セキュリティの観点からユーザに管理してもらいます
- 一定条件を満たしたユーザにトークンを付与します
  - ここでは実店舗にお客さんが来店してチェックインしたら10トークン付与される仕組みを想定します
  - ユーザはトークンを送金して割引サービスを受けられます
- システムの管理者はウェブ UI でトークンの残高や送受信履歴を閲覧します

## アーキテクチャ（論理構造）
- アプリは通常のサーバサイドアプリ と Ethereum ノードに対する2つのエンドポイントを利用します
- サーバサイドアプリは通常の HTTP API です
- Ethereum ノードとは JSON-RPC を利用して通信します
- Ethereum ノードは Geth を利用します
- 開発中は2ノードでプライベートネットワークを構築して利用します
- 1台はアプリが使用するインターネットに公開された認証付の「公開ノード」です
- 1台は管理側で使用するインターネットに公開されていない「非公開ノード」です
- 公開ノードの認証は AWS の API Gateway を利用して実現しました
- 非公開ノードはトークン付与のトランザクションを発行するため秘密鍵を保持して `geth` のアカウントをアンロックした状態にします

![erc20_architecture.png](https://qiita-image-store.s3.amazonaws.com/0/126845/cc7adcf0-19f8-b424-a1df-a266a6cbe7c4.png)


- 本番環境は Ethereum のメインネットワークを利用します
- 本番環境は4ノードでネットワークを構築します
  - 冗長化のため
- 各ノードは手動で設定してあり静的なネットワークを構築しています

## アプリの実装
アプリに必要な最低限の機能は以下の3点でした。

1. 秘密鍵とアドレス（ウォレット）の生成
2. トークンの残高を表示する
3. トークンを送信する

Androidは [web3j](https://github.com/web3j/web3j) で実装しています。 iOS アプリは Swift で実装できる [web3swift](https://github.com/bankex/web3swift.git) を利用しました。

## バックエンドの実装
サーバアプリはユーザのチェックインをトリガーにしてトークンを付与します。トークンを付与するにはトランザクションを発行するので秘密鍵が必要です。非公開ノードの `geth` で発行元のアカウントをアンロック状態にしておく必要があります。サーバアプリからこの非公開ノードへは `geth` の JSON-RPC API を使用します。とはいえただの HTTP リクエストであり、ライブラリも豊富に用意されているので難しいことはありません。
また、この非公開ノードにアクセスされるとトークンの送受信ができてしまうので、上の図のようにインターネットに公開しないで構築しました。
サーバアプリは ERC20 トークン以外の機能も含めて PHP(Laravel) で実装しています。トークン関連の実装は [web3.php](https://github.com/sc0Vu/web3.php) を利用しています。

最低限必要なのは以下の機能でした。

- ユーザとアドレス（ウォレット）の関連付け
- トークンを付与する
- 残高を照会する

### トークンを付与する
ユーザがアプリでチェックインした後にトークンを付与する流れは以下のようになっています。

1. ユーザがアプリでチェックインをする
1. アプリが API サーバにチェックインのリクエストを送る
ここはトークンは無関係で通常の HTTP API リクエスト
1. サーバがチェックインを実行する
ここもトークンは無関係でチェックインの履歴を DB に保存したりする
1. サーバがトークンを付与する
    1. 対象ユーザのアドレスを DB から取得する
    1. 非公開ノードの JSON-RPC ポート NNNN に対してトランザクションを送信する
    1. トランザクション ID を DB に保存する 

トークンの送信処理はコントラクトの `transfer()` メソッドを実行します。PHP で実装されたサーバサイドアプリは非公開ノードに対して JSON-RPC でトランザクションを発行します。 `web3.php` の `Contract` クラスを使って `send('transfer')` を呼び出せばかんたんに実行できます。必要な情報は非公開ノードの IP アドレスとコントラクトの ABI だけです。

```
$contract->send('transfer', $to, $tokens, $params, function ($error, $result) {...});
```

実行時に発行されたトランザクション ID は DB に保存しておいて、後からログを確認できるようにしておきます。

## 課題や検討事項
最も気になるのがセキュリティ面です。とくにサーバサイドの非公開ノードの運用方法です。トークンを付与するためにサーバサイドアプリから `geth` の JSON-RPC を利用してトランザクションを発行していますが、この方法が安全なのか心配です。
またアカウントをアンロックするための秘密鍵の管理方法にも不安があります。サーバに秘密鍵を置かなければ安全ですが、ノードが落ちた場合の再起動には手動オペレーションが必要になります。

## 今後の課題
- 非公開ノードのセキュリティ対策
- BIP 39
- マルチシグ
- スケーラビリティ
インターネットから自宅のRaspberryPiにMQTTでトリガーをかける

# 概要
スマホのホーム画面に配置したボタンをタップすると、スマートコンセントがONかOFFかをLINEで通知してくれるものを作ってみました。家を出た後で「あれ？電源切ったっけなぁ？（心配）」っていうこと、ありますよね。そんなときに、外出先から電源状態（ONかOFFか）を確認できる、というわけです。
![電源状態の確認](https://qiita-image-store.s3.amazonaws.com/0/336603/6157c76b-a15c-08a0-10c7-34da57ea6abf.jpeg)
そもそも、電源状態の確認は、スマートコンセントの管理アプリを使えばできてしまいます。が、そういうアプリを介さずに、できるだけお手軽に（ホーム画面のボタンタップだけで）確認できるように、かつ、お手軽に作れるように、IFTTTとLINEを組み合わせた構成に落ち着きました。

そんな中で、今回つまづいたのは、使っているスマートコンセント（[TP-Link HS105](https://www.tp-link.com/jp/products/details/cat-5258_HS105.html)）に対応するIFTTTのトリガーやアクションでは、スマートコンセントの電源状態を調べる機能がないというところ。電源状態をONにしたりOFFにしたりはできるんですが、電源状態がどうなっているかを調べることができないんです。一方で、このスマートコンセントについては、[Pythonで使える便利なAPI](https://github.com/GadgetReactor/pyHS100)があって、自宅のネットワーク内のRaspberryPiなどでPythonのコードを動かしさえすれば簡単に電源状態を調べられます。

そうすると結局、インターネットから自宅ネットワーク内にあるRaspberryPi上のPythonコードをどう動かすか、つまり、インターネットから自宅ネットワーク内のRaspberryPiにどうトリガーをかけるか、が問題となります。（ようやく本題にたどり着いた・・・）

# 方針
インターネットから自宅ネットワーク内のRaspberryPiにトリガーをかけるために、[pub/subモデル](https://ja.wikipedia.org/wiki/出版-購読型モデル)の軽量メッセージプロトコルである[MQTT](http://mqtt.org)を活用します。あらかじめRaspberryPiをブローカー（メッセージを配信するサーバ）にsubscribeさせておいて、スマホ（のIFTTTアプリ）からブローカーにトリガーをpublishすると、RaspberryPiにトリガーが配信される、という仕組みです。

MQTTのブローカーとしては、[beebotte](https://beebotte.com)を使います。
1日あたりメッセージ50,000件までは無料で使えるので、日曜プログラミングでも使いやすいです。REST APIが用意されているので、IFTTTからWEB Requestでpublishするのも簡単です。

# コード
RaspberryPi上で動くPythonコードを以下に置いておきます。
[nikotan/PlugMonitor - GitHub](https://github.com/nikotan/PlugMonitor)

やっていることは単純で、以下の通り。
ちなみに、MQTTブローカーとの通信経路はSSL/TLSで暗号化しています。

- MQTTブローカーにsusbcrive
- MQTTブローカーからメッセージが配信されるとon_messageメソッドを実行
  - スマートコンセントの状態を確認
  - 確認結果をIFTTT経由でLINEに通知（トリガー"Webhooks"、アクション"LINE"のIFTTTアプレットでwebhookを受けます）

systemdを使ってサービス化して動かしていますが、至って安定してます（使い始めて1ヶ月ほど経ちますがメンテ無しです）。

また、スマホのボタンの方は、IFTTTで作成しました。トリガーを"Button Widget"、アクションは"Webhooks"でbeebotteのREST APIを叩いてpublishするように設定すれば動きます。

# 感想
やりたいことの割に手間がかかってしまいましたが、MQTTの勉強になりました。
MQTTですが、beebotteなどのインターネット上のブローカーだけでなく、ローカルネットワーク内でも[mosquitto](https://mosquitto.org)などのオープンソースのブローカーが使えます。また、クライアントを開発するための各種環境向けライブラリが既に整っていますし、とても軽量なプロトコルなので、RaspberryPiはもちろん、ESP32/ESP8266やArduinoなど、低リソースの端末でも使いやすいです。日曜プログラミングでIoTシステムを作るのにも重宝しそうです。

# 参考
今回は、以下の記事を参考にしました。

- [Google Home + IFTTT + Beebotte(MQTT Broker) + ESP32でLチカしてみた - Qiita](https://qiita.com/mascii/items/1db06be0950a47e6c720)
- [IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する - Qiita](https://qiita.com/msquare33/items/9f0312585bb4707c686b)
- [Paho(MQTT Client Library) -Python- - Qiita](https://qiita.com/n-yamanaka/items/91dbd7bd9fed5b3fbed4)
- [GadgetReactor/pyHS100: Python Library to control TPLink Switch (HS100 / HS110)](https://github.com/GadgetReactor/pyHS100)
- [Pythonで設定ファイルを扱う方法：ConfigParser | UX MILK](https://uxmilk.jp/20599)
- [Pythonでロギングを学ぼう - Qiita](https://qiita.com/__init__/items/91e5841ed53d55a7895e)
- [Systemdを使ってさくっと自作コマンドをサービス化してみる - Qiita](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)
Raspberry Piの時刻設定によってMakeがコケた件メモ #webrtcskyway #enebular


次起きた時に焦らないようにメモっておきます。

今回は[人感センサでLINE通知する監視カメラを作ろう v2](https://skyway.connpass.com/event/122731/)のハンズオンで起きた事象で、（たぶん）会場のネットワークの問題でNTPサーバーに繋げられずRaspberry Piの時刻が[前回のハンズオン](https://skyway.connpass.com/event/118081/)の日付の2/21になってました。

Raspberry Pi上のNode.jsで[johnny-five](http://johnny-five.io)か[pi-io](https://github.com/fivdi/pi-io)のどちらかをインストールする際に内部のmakeがこけました。

```bash
npm i johnny-five pi-io
```

**「修正時刻 10659412 は未来の時刻です」**みたいな感じのエラーが永遠と出ました。
英語だと **make warning: file 'Makefile' has modification time 1.3e+02 s in the future**的な感じのエラーみたいです。

> 参考: [「make: 警告: ファイル Makefile の修正時刻が 1.3e+02 秒分未来の時刻です」について](https://did2memo.net/2014/02/07/make-warning-file-has-modification-time-in-the-future/)

この記事を見ると時刻設定で問題が出てるってのが分かったので、手動で設定してみます。

> 参考: [手動で時刻合わせ](http://katzplus.com/centos-6/ntp/%E6%89%8B%E5%8B%95%E3%81%A7%E6%99%82%E5%88%BB%E5%90%88%E3%82%8F%E3%81%9B/)

```bash
$ sudo date --set='2019/03/23 22:51:20'
```

これでOKです。

一旦モジュールを消してから再度npm iしてみるとうまく行きました。

```
$ rm -rf node_modules package-lock.json
$ npm i
```

日付問題があるとmakeがコケるのと会場のネットワークによってこういったことが起きるのは初だったので勉強になりました。
ggplot2のテーマはどれを使うべきか

ggplot2のデフォルトのテーマ群を試します。

### デフォルトのtheme_gray()

背景が淡い灰色のの特徴的なやつ。いかにもggplotなグラフ。
「エドワード・タフテさんとかbrewerさんのアドバイスに従った」とウィッカムさんが述べています。
画面上では見やすいのですが、論文では使いにくいと思っています。

![01theme_grey.png](https://qiita-image-store.s3.amazonaws.com/0/60438/2d1f6a6e-081a-1c58-1010-672ddd051104.png)

```r
p<-gat%>%
	ggplot(aes(x=年,y=人口,fill=区分))+geom_bar(stat="identity")+
	geom_text(aes(label=人口),size=2,position = position_stack(vjust = 0.5))+
		scale_fill_brewer(palette="YlOrRd")+
		labs(y="人口")+
		theme(axis.title.x = element_blank(),
			axis.text= element_text(size=7),
			axis.text.x=element_text(angle=90),
			legend.title = element_blank(),
			legend.text = element_text(size=7),
			axis.title = element_text(size=7),
			plot.title= element_text(size=9),
			strip.text=element_text(size=9))
```

### theme_bw()

そつなく仕上がったテーマ。濃いめの枠線が引かれているところが特徴でしょうか。私はあんまり使いません。

![02theme_bw.png](https://qiita-image-store.s3.amazonaws.com/0/60438/c3d880de-1e7f-27ea-f658-1c3c6c989a60.png)

```r
p2<-p+theme_bw()
```

### theme_dark()

theme_gray()よりも濃い灰色の背景。ちょっと使う気にならない感じ。

![03theme_dark.png](https://qiita-image-store.s3.amazonaws.com/0/60438/50dff989-a3c5-3e46-027d-21947188d7cc.png)

```r
p2<-p+theme_dark()
```

### theme_light()

theme_bw()の枠線と罫線を薄くしたようなプロット。theme_bw()よりも私には好みです。

![04theme_light.png](https://qiita-image-store.s3.amazonaws.com/0/60438/3e544e53-cfe5-142a-b6b9-d18d6f4723a4.png)

```r
p2<-p+theme_light()
```

### theme_linedraw()

theme_light()との見分けがつきませんが・・・

![05theme_linedraw.png](https://qiita-image-store.s3.amazonaws.com/0/60438/3facd277-3a27-2d94-9299-c1c069b28eb2.png)

```r
p2<-p+theme_linedraw()
```

### theme_minimal()

theme_linedraw()から枠線を取り除いた感じ。私が一番好んで使っているテーマで、論文はもっぱらこれを使っています。

![06theme_minimal.png](https://qiita-image-store.s3.amazonaws.com/0/60438/fccc0280-758d-7d64-2f77-b832c8c06d56.png)

```r
p2<-p+theme_minimal()
```

### theme_void()

voidは「空隙」という意味ですね。「なんにもない」みたいなイメージでしょうか。[データ視覚化のデザイン](https://twitter.com/i/moments/1023047114689892353)を地で行くテーマといえます。

![07theme_void.png](https://qiita-image-store.s3.amazonaws.com/0/60438/c2444c30-0e63-5047-d3f0-5ea8ae16fc25.png)

```r
p2<-p+theme_void()
```

### theme_classic()

theme_void()に片側だけ枠線がついたもの。枠線の有無は好みかと思いますが、割と好ましいと感じます。

![08theme_classic.png](https://qiita-image-store.s3.amazonaws.com/0/60438/26057e13-9cd0-3af1-591c-3053cfa559ff.png)

```r
p2<-p+theme_classic()
```

### theme(panel.grid=element_blank())でシンプルな描画

素直にtheme_void()でも良いのかもしれませんが、なんとなくこの方がしっくりきます。theme_minimal()+theme(panel.grid=element_blank())の組み合わせ。
panel.grid=element_blank()でグリッド線を消しています。

![09theme_minimal_Nogrid.png](https://qiita-image-store.s3.amazonaws.com/0/60438/20d676ff-05ad-0813-2afc-f3151982fc5f.png)

```r
p2<-p+theme_minimal()+theme(panel.grid=element_blank())
```

### まとめ

[データ視覚化のデザイン](https://twitter.com/i/moments/1023047114689892353)の影響かもしれませんが、グラフは極力シンプルなものを使用するようにしています。
したがって、theme_void()、theme_classic()、theme_minimal()あたりが選択肢に残りそうです。

私は最後に紹介したtheme_minimal()でグリッド線を消したものを最近では好んでいます。
php3を終えて

こんにちは
未来電子テクノロジーでインターンをしています
今回はphp3を終えての学びをアウトプットします

<h1>クラスプロパティ</h1>
クラスプロパティとは個々のインスタンスではなく、クラスに関するプロパティのことだ　
staticを用いることで表現できる

<h1>継承</h1>
すでにできているプロパティをほかのクラスに移すことを指す
継承は　class　class名　にextendsをつけることで表現できる
引き継がれたクラス（子クラス）は親クラスのプロパティなどの要素をそのまま引き継いでいる
また子クラスには独自のメゾットを定義することもできる
定義の際には通常の定義と同じく、public　functionを使うことで表現できる
独自メゾットは親クラスには反映されないので注意が必要だ
[Raspberry Pi 3 Model B+]bashでLチカしてみた

#■はじめに
Raspberry Pi 3 Model B+ にて、LEDチカチカ(略してLチカ)をやってみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/451a5183-c71c-fba5-9cbf-87d8304ec3a5.png)



#■準備
|部品|個数|
|:-----------------|------------------:|
|ブレッドボード|1個|
|ジャンプワイヤ(オス-オス)|4本|
|ジャンプワイヤ(オス-メス)|4本|
|抵抗(100Ω)|3個|
|LED(赤、緑、青)|各1個|

#■回路イメージ
・Raspberry PI3 GPIOピン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/60a0043e-d97c-fde6-33a8-4146b2e38a76.png)
https://www.raspberrypi.org/documentation/usage/gpio/README.md

・回路図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/1e117674-c2ce-7df8-f243-72cdcf471d7a.png)

＃上図から逆転
＃2,3,4ピンを出力(電圧源)として利用し、26ピン横のGroundをアースとして利用


#■bashコマンド(gpio)

・gpio状態を確認
`gpio readall`

・gpio 2ピンを出力として利用
`gpio -g mode 2 out`

・gpio 2ピンを有効化(通電)
`gpio -g write 2 1`

・gpio 2ピンを無効化(遮断)
`gpio -g write 2 0`

・gpio 26ピンを入力として利用
`gpio -g mode 26 in`

・gpio 26ピンの状態を確認
`gpio -g read 26`
→結果が0だと遮断、1だと通電

#■シェルスクリプト本体
```bash:loop.sh
#!/bin/bash
lp=10
stime=0.5

gpio -g mode 2 out	 
gpio -g mode 3 out	 
gpio -g mode 4 out

gpio -g write 2 0	 
gpio -g write 3 0	 
gpio -g write 4 0	 

for((i=0;i<$lp;i));do
	gpio -g write 2 1; sleep $stime
	gpio -g write 2 0	 
	gpio -g write 3 1; sleep $stime
	gpio -g write 3 0	 
	gpio -g write 4 1; sleep $stime 
	gpio -g write 4 0	 	 
done
```
＃各ポートごとに0.5秒ずつ`sleep`を入れてLチカさせています。

#結果
```bash:結果
pi@raspberrypi:~test $ bash ./loop.sh
^C
pi@raspberrypi:
```
＃Lチカスクリプトは無限ループのため、`ctrl + c`で停止しています。


![](https://media.giphy.com/media/5z2eanjZxCDURKMrDM/giphy.gif)








#■出典/参考
[Raspberry]GPIO
https://www.raspberrypi.org/documentation/usage/gpio/README.md

「Raspberry Pi3 Model B」で遊んでみよう！Part2
https://pc.watch.impress.co.jp/docs/column/nishikawa/1006048.html

fritzing
http://fritzing.org/download/

Arduino、Raspberry Piの回路図を作成する
https://qiita.com/mininobu/items/74e690999b9901a31ae0
独自ドメインで複数WordPressをポコポコ作る（Google Domains＋Xserver）

# 独自ドメインで複数WordPressをポコポコ作る
　WordPress で独自ドメインを使いたくなるのはよくあることです。更にそれを大量（？）にポコポコ作ることも出来るので、ポコポコ作りたくなるのもよくあることだと思います。

　早速、ポコポコ作っていきます。

### 例１. ひとつの独自ドメイン＆サブドメイン
- yourdomain.com ドメイン　ブランドトップ
    - test.yourdomain.com　サブドメイン１　テスト環境
    - kanda.yourdomain.com　サブドメイン２　神田支店
    - umeda.yourdomain.com　サブドメイン３　梅田支店
    - sapporo.yourdomain.com　サブドメイン４　札幌支店

### 例２. 複数の独自ドメイン＆サブドメイン
- yourdomain.com　ドメイン１　ブランドＡ
    - test.yourdomain.com　サブドメイン　テスト環境１
- mydomain.com　ドメイン２　ブランドＢ
    - test.mydomain.com　サブドメイン　テスト環境２

　こんな感じで、好きな親子関係にして、ポコポコ作っていけます。
　どこまでもポコポコ作っていけます。
　一緒にＥメールアドレスも好きな関係でポコポコ作っていけます。

- 例１
- yourdomain.com にひとつの転送先を設定
    - * @yourdomain.com（＝*が何の文字でも）アドレスＡに転送
- 例２
- yourdomain.com に複数の転送先を設定
    - test @yourdomain.com　→　メールアドレスＡに転送
    - kanda @yourdomain.com　→　メールアドレスＡに転送
    - umeda @yourdomain.com　→　メールアドレスＢに転送

※注意点：
操作の基本はこっちと完全に一緒なので割愛してます。
参考：<a href="https://qiita.com/sakkaonline/items/a2fe86d09130a347d331" target="_blanc">WordPress で独自ドメイン・Ｅメールアドレスを使う（GoogleDomains+Xserver）</a>

### 必要なこと
1. 独自ドメインを Google Domains で用意
    - わかりやすい管理画面でついついドメインをポコポコ購入可
    - 社でもできるけど、まあいいじゃない
    - Ｅメール転送設定が楽でわかりやすくて管理画面がKawai
2. サーバーをひとつ Xserver X10 で用意
    - １年間利用なら、初期3,000円＋1,000円/月×12ヶ月＝15,000円
    - これひとつで複数ドメイン・複数WordPressをポコポコ管理可
    - 日本国内で WordPress をポコポコ作るために契約するなら Xserver にしておけば「サーバーどうする問題」に後日苦しまない予感満点
3. DNS設定
4. やりたい人は更に：WordPress のメール配信・送信元アドレス設定／SMTP、Gmail

※注意点：
　無料で使えるドメインも、無料で使い始められるサーバーも（AWSとかGCPとかも）ありますが、無料ドメインには何らかの「しがらみ」か知識が必要な場合があり、AWSやGCPも「無料で使い始められるサーバー」だというだけで最終的にはどこかにお金がかかってきたりするので、ポコポコ複数作る場合は後日の「ドメインどうする問題」、「サーバーどうする問題」を避けるのが良いはずと判断。
　Google Domains はドメイン全部ここにまとめて良いってくらいわかりやすいし、国内向けの WordPress なら「気楽で安心」も含めて Xserver で間違いないってことで、ポコポコにはこの組み合わせがベストなはず。

　迷いが完全にふっきれたところで、早速ポコポコスタートしていきます。


# 独自ドメインで複数WordPressを大量にポコポコ作り終えて完了！
- ひとつのサーバー契約でＯＫ
- 作るのは気楽
- 実際の運用ではこの後 WordPress のダッシュボードに入ってひたすら設定を変更していく過程が続く・・・
- WordPressログイン画面はアドレスバーに「独自ドメイン/login」と入力すれば開ける、厳密には「/wp-login.php」だけど「/login」でＯＫ
Javaの配列

## 配列とは
・配列(array)とは、同一種類の複数データを並び順で格納するデータ構造。
・配列は中に要素(element)を複数格納しており、要素には添字(index)が0から順に付いている。
・配列も変数と同様でデータ型を指定する。

```ruby:java
要素のデータ型[] 配列変数名;

#例えば
int[] score; #これでscoreをint型の配列変数として宣言している。
score = new int[5]; #配列変数scoreにnew演算子で生成したint型の要素を5つ、代入している。
int[] score = {10,20,30,40,50}; #宣言と初期化を同時に行う。

#配列変数の宣言と代入を同時に行うこともできる。
int[] score = new int[5];


#配列の中の要素を取り出す方法
score[0]; #配列変数scoreのなかの１番目の要素を取得できる。


#配列内の要素を書き換える。
score[0] = 30; #配列変数scoreのなかの１番目の要素に30という値を代入することができる。


#lengthメソッド使用
score.length; #配列変数にlengthというメソッドを使用すると配列内の要素の数を取得できる。
#lengthメソッドは文字列にも使用できる。String型変数名.length()という形になる。
```


### 配列をforループで回す。

```ruby:java
#従来のfor文
for (int i = 0; i < 配列変数名.length; i++) {
  処理....
} #配列の中の要素数をlengthで取得し、その数の分だけループを回している。


#拡張for文
for (要素の型　任意の変数名:配列変数名) {
  処理...
} #拡張for文で書くと従来のものよりシンプルに記述できる。

#例えば
for (int value : score) {
  処理...
}
```

### メモリと変数と配列
コンピューターは使用するデータをメモリに記録する。メモリの中は基盤の目のように区画整備されており、各区画には住所(アドレス)が振られている。そして変数を宣言すると、空いている区画(どこが選ばれるかわからない)を変数のために確保する(変数の殻によって何区画を使用するかは異なる)。変数に値を代入するとは、確保しておいた区画に値を記録すること。
配列変数には一番最初の要素の一番最初のアドレスが代入されていることになる。つまり配列変数に要素が入っているわけではなく、配列変数のアドレスを参照してその配列変数に所属している要素を取得することができるということになる。


### ガベージコレクション
Javaの仕組みの一つ。メモリ上のゴミを排除してくれる。
使用されない変数や配列はメモリを無駄に消費し圧迫してしまう。このメモリのゴミは本来プログラマーが後片付けをしないといけないが、ガベージコレクションという仕組みが常に働いているためメモリのゴミを自動的に片付けてくれる。


### NULL
何もないという意味。
使わなくなった配列変数などにNULLを代入することでその配列変数は要素を参照しなくなり、ガベージコレクションの対象になる。
参照型変数には使用できるが基本型変数には使用できない。

```ruby:java
int[] score = {10,20,30}; #配列変数の要素に値を代入する。
int[] score = null; #配列変数にNULLを代入。
score[0]; #配列変数にはNULLが入っており、参照できなくなっている。
```


### ２次元配列

↓２次元配列とは表のような配列のこと(わかりにくかったらごめんなさいw)

|[0][0]|[0][1]|[0][2]|[0][3]|
|-------|--------|---|------|
|[1][0]|[1][0]|[1][2]|[1][3]|
|[2][0]|[2][1]|[2][2]|[2][3]|

```ruby:java
#２次元配列の宣言
要素の型[][] 配列変数名 = new 要素の型[行数][列数]

#２次元配列の要素の取得
配列変数名[行の添字][列の添字]
```
php2を終えて

こんにちは
未来電子テクノロジーでインターンをしています。
今回はphp２を終えた学びをアウトプットしたいと思います。
<h1>オブジェクト思考</h1>
オブジェクト思考とはそのもののできる要素のこと
プログラミングでも現実世界と同じように複数の要素からデータができている

<h2>クラス</h2>
クラスとはオブジェクト1つ1つの要素を作るためのもの
<？php　class　クラス名　？>で表現できる

<h1>よく使う表現</h1>
＊＄this
$thisはメソッドを呼び出す際に使用する
異なるメソッド間でやり取りをするとコードが複雑になる
そのため、$thisを用いてコードを簡略化する
＊＿＿contrust
＿＿contrustはインスタンスを作成する際に使用する
引数を代入することもできるので便利である

<h1>カプセル化</h1>
カプセル化とは回路を隠すことを意味する
通常のpublicを用いたコードだと誰でも介入が可能になる
しかし、システムの内部に関する部分までpublicで作成すると、情報を変えられる可能性がある
そのため、priveteを用いてカプセル化をして情報を隠す
RaspberryPi3B+にインストールしたpyenvをsudoしても使えるようにする

## はじめに
pyenvで構築したpython環境にて、sudoでpythonプログラムを実行したらimportのエラーが発生。
/etc/sudoersにpyenvのディレクトリパスを追加する事で解決したため、手順を纏めてみた。


## 環境
・RaspberryPi3B+
・Python3.6.5

## RaspberryPiにpyenvとpythonをインストール
[こちら](https://www.suzu6.net/posts/31/)のサイトを参考に構築。pythonのバージョンは3.6.5に変更。

## pyenvにインストールしたpythonに切り替えてバージョンを確認
切り替え前

```
$ python -V
Python 2.7.13
$ sudo python -V
Python 2.7.13
```
切り替え

```
$ pyenv global 3.6.5
```

切り替え後

```
$ python -V
Python 3.6.5
$ sudo python -V
Python 2.7.13
```
sudoした方のversionがpyenvではなく、システム側となっている。


## sudoしてもpyenvを使えるようにする
sudo pythonを実行するとpyenvでなく、システム側のpythonが起動する。
sudoしてもpyenvにインストールしたpythonを起動してもらうため、
[こちら](https://poyo.hatenablog.jp/entry/archives/514)を参考に/etc/sudoersのDefaultsにpyenvディレクトリのパスを追加する。

```
$ sudo nano /etc/sudoers
# Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# home/pi/.pyenv/shimsを追記
Defaults        secure_path="/home/pi/.pyenv/shims:/home/pi/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
```
sudo pythonのバージョンを確認してみる

```
$ pyenv versions
  system
* 3.6.5 (set by /home/pi/.pyenv/version)

$ sudo python -V
Python 3.6.5
````

pyenvで選択されているversionが表示されればOK。
デコレーターのメモ

デコレーターの例。このデコレーターはある関数A内で使われている関数Bについて、
その関数Bの引数を{'関数B':*args, **kwargs}で指定して、関数Aの引数とすることで、関数B内で引き継がれるというもの。

```python
def search_args_kwargs(func):
    func_name=func.__name__
    def wrapper(parent_kwargs, *args1, **kwargs1):
        if func_name in parent_kwargs:
            *args2, kwargs2=parent_kwargs[func.__name__]
            return func(*args1, *args2, **kwargs1, **kwargs2)
        else:
            return func(*args1, **kwargs1)
    return wrapper

def detail1(*args, **kwargs):
    string='My age is {}.'.format(*args)
    print(string)
    string='I was born in {year}.'.format(**kwargs)
    print(string)

def detail2(*args, **kwargs):
    string='Talking about My {} years old {} dog.'.format(*args)
    print(string)
    string='He was born in {year}, who likes {likes}.'.format(**kwargs)
    print(string)
    
def greeting(*args, **kwargs):
    string='I am a {}. My pet is {}'.format(*args)
    print(string)
    kwargs.update({'type_pet':args[1]})
    string='I am {me}. My {type_pet} is {pet}'.format(**kwargs)
    print(string)
    search_args_kwargs(detail1)(kwargs, 28, year=1991)
    search_args_kwargs(detail2)(kwargs, 3, year=2016)

greeting('human','dog', me='Taro', pet='Kuro',
         detail2=('cute',{'likes':'milk'}))

'''
>>I am a human. My pet is dog
I am Taro. My dog is Kuro
My age is 28.
I was born in 1991.
Talking about My 3 years old cute dog.
He was born in 2016, who likes milk.
'''
```

こちらはデコレーターの簡単な例

``` python
def deco(func):
    def wrapper(*args, **kwargs):
        print('Decorated!')
        return func(*args, **kwargs)
    return wrapper

@deco
def f(i):
    return i+1

f(1)

'''
>>Decorated!
2
'''
```
Trusted Platform ModuleでSSH鍵を作る

SSHする際の秘密鍵は、ssh-keygenコマンドなどで生成します。
ただ、最近のマザーボードには、TPMと呼ばれるハードウェア生成器がついているので使ってみましょう。

# Trusted Platform Module とは

TPMとは、Trusted Platform Moduleの略で、耐タンパー性があるチップです。
つまり、物理的な分解、ノイズ解析や、攻撃に耐性があります。
通常のCPUで行う演算の一部を、TPMに委託することで、ある程度安全に暗号計算やハッシュ計算を行えます。

TPMにはバージョンがあり、1.2と2.0が主流です。
機能は以下となります(wikipediaより引用

### TPM 1.0 / 1.2

- RSA演算
- RSA鍵生成
- RSA鍵格納
- SHA-1ハッシュ
- ハッシュ値計算
- ハッシュ値保管
- 乱数生成

TPM1.2から以下の機能が追加された。

- カウンタ
- 単純増加カウンタ
- ティックカウンタ
- オーナー権委任（パスワードは公開しない）
- 不揮発性ストレージ保存機能

### TPM 2.0

- TPM 1.2の機能
- シードとオブジェクトの概念
- 認証形式の追加（KDFによるセッション鍵生成、Policy認証）
- 認証と秘密通信の高速化
- アルゴリズムの大幅な追加
- 各種ハッシュ演算(SHA256、SM3、HMAC、KDFなど)
- 楕円曲線暗号(NIST curve P-256、SM2など)
- AES(128bit～256bit、OFB、CTRなどの各種モード)
- グループの複製(Key duplication)
- 不揮発性カウンタ
- 不揮発性ビットフィールド

# TPMでSSH鍵生成

## ツール/ライブラリのインストール

```
$ sudo modprobe tpm
$ sudo pacman -S  tpm2-tools tpm2-tss
```

これで、`/dev/tpm[0-9]*`、`/dev/tpmrm[0-9]*`とコマンド類が手に入ります。
udevでルールが追加されているので、一回再起動しましょう。

# おわりに

ここまで書いてなんですが、Linuxカーネルでのtpm2は十分にサポートされていないらしく、実際自分の手元でも動作が不安定なため、いつかtpm2がちゃんと動くときまで保留しておきます

参考:

https://blog.hansenpartnership.com/tpm2-and-linux/
https://wiki.archlinux.org/index.php/Trusted_Platform_Module
Markdownについて

# Markdownとは
Markdownとは、webで文章を書く際に使われるマークアップ言語です。手軽に使えるので、ちょっとしたメモ書きにも便利です。

# Markdown記法
ここではMarkdown記法について紹介します。
  

## 見出し

  * Setextスタイル
  
    見出しにする文の下の行に、=を記述すれば第1レベルの見出し、-を記述すれば第2レベルの見出しになります。

        例:
        This is an H1
        =============
        This is an H2
        -------------
  * atxスタイル
  
    行の先頭に1~6個の#を記述することで、第1～6レベルの見出しを作れます。

        例:
        # 見出し1
        ## 見出し2  
        ### 見出し3

  
  

## コードブロック

  コードブロックで作成したい文の行の先頭を半角スペース4つ分空けます。空けるためには、Tabを一回押せばよいです。

## コード挿入
  
  コードを`で囲むことで挿入できます。

## リスト

  * 番号付きリスト
  
    数値.を行の先頭に記述します。
    .の後に半数スペースを入れることに注意です。

        例:
        1. 番号付きリスト1
            1. 番号付きリスト1_1
            2. 番号付きリスト1_2
    
  * 番号なしリスト
  
    *,+,-を行の先頭に付けます。
    このとき、これらの記号と文の間に半角でスペースを空けます。
    
        例:
         * Green
         + Red
         - Blue
  
## 水平線

  1行に3つ以上の-,*,_を入れることで水平線を作成できます。
        
      例:
      ***
      *****
      - - -

## 強調

  文字を*もしくは_1つで囲めば斜体になり、2つで囲めば太字になります。
   
      例:
      **太字** 
      *斜字*

## リンク

  * インラインリンク
    
    [表示文字]＋(URL)でリンク作成します
         
         例:
          [an example](http://example.com/ "Title") 

  * 参照リンク
  
    まず、あらかじめ[定義した文字]：URLでリンク先の参照を定義しておきます。
    そして、[表示文字]+[定義した文字]でリンクが作成できます。
        
         例：
          [Google] [1] 

          [1]: http://google.com/        "Google"
【GAS】Gmailで自動アーカイブや自動削除

#動機
毎回アーカイブするのが面倒なのでアーカイブと削除を自動化しました。大量に届くお知らせメールお前のことだ。
#GAS
メール検索用の文字列作成→メール検索→ヒットしたのを削除ORアーカイブ
するだけです。

```javascript
function cleanGmail() {
  const list = ['info@aaa.com',
                'noreply@bbb.com',
                'notification@ccc.com'];
  
  const addresses = list.reduce(function(pre, cur) {
    return pre + '(from:' + cur + ') OR ';
  },'') 

  const searchWord = 'before:' + makePreviousDate(2) + ' AND (' + addresses + ')'
  
  archiveMailBySearch(searchWord);//2日たったlist内にあるメールをアーカイブ
  deleteMailBySearch('from:info in:read'); //アドレスにinfoのつくアーカイブされたメールの削除
}

function archiveMailBySearch(searchWord) {
  const myThreads = GmailApp.search(searchWord);
  myThreads.map(function(thread) {
    thread.moveToArchive();
  });
}

function deleatMailBySearch(searchWord) {
  const myThreads = GmailApp.search(searchWord);
  myThreads.map(function(thread) {
    thread.moveToTrash();
  });
}

function makePreviousDate(n){
  var dt = new Date(Date.now() - 86400000 * n);
  var y = dt.getFullYear();
  var m = dt.getMonth()+1
  var d = dt.getDate()
  var result = y + "/" + m + "/" + d;
  return result;
}
```
#コメント
```javascript
  const list = ['info@aaa.com',
                'noreply@bbb.com',
                'notification@ccc.com'];
  
  const addresses = list.reduce(function(pre, cur) {
    return pre + '(from:' + cur + ') OR ';
  },'') 

  const searchWord = 'before:' + makePreviousDate(2) + ' AND (' + addresses + ')'
```
list内のメールアドレスで2日たったものをアーカイブします。これは一例で、好きに文字列を作ってください。何ならGmail設定からフィルタの作成で検索したものをそのまま貼り付けても良いかもしれません。

```javascript
function archiveMailBySearch(searchWord) {
  const myThreads = GmailApp.search(searchWord);
  myThreads.map(function(thread) {
    thread.moveToArchive();
  });
}

function deleatMailBySearch(searchWord) {
  const myThreads = GmailApp.search(searchWord);
  myThreads.map(function(thread) {
    thread.moveToTrash();
  });
}
```
違うのは thread.moveToArchive()とthread.moveToTrash()だけ。高階関数でやりたいところ。

```javascript
function makePreviousDate(n){
  var dt = new Date(Date.now() - 86400000 * n);
  var y = dt.getFullYear();
  var m = dt.getMonth()+1
  var d = dt.getDate()
  var result = y + "/" + m + "/" + d;
  return result;
}
```
n日前の日付を返します。4月1日なら3月30日をちゃんと返します。（たぶん）
#あとがき
アーカイブされた中で星マークの無いものを削除したり、逆に特定のメールは誤って削除されても自動で復活するようなプログラムもこれの簡単な変更で出来ると思います。

他にしたいことがある方は以下を参照ください。GASGmailのリファレンスです。
[Class GmailThread](https://developers.google.com/apps-script/reference/gmail/gmail-thread)
golangでUnionFindを作る

# はじめに
Union-Findは素集合のデータ構造を表すのにとても便利です.
ここではそのUnion-FindをGo言語で作成していきます.
Union-Find自体には特に触れないのでご注意ください.

# どんな機能が必要か
自分的に以下の機能が必要と考えました.

* ある要素aの所属するグループを返す
* ある要素aの所属するグループ内の要素数(木のサイズ)を返す
* ある要素aの所属する[グループA] と ある要素bの所属する[グループB] を合体する
* ある要素aとある要素bが同じグループに所属するかどうかを返す

# 実装
上の機能をもつように構造体を作成していきましょう.

```golang
type UnionFind struct {
	par []int
}

/* コンストラクタ */
func newUnionFind(N int) *UnionFind {
	u := new(UnionFind)
	u.par = make([]int, N)
	for i := range u.par {
		u.par[i] = -1
	}
	return u
}

/* xの所属するグループを返す */
func (u UnionFind) root(x int) int {
	if u.par[x] < 0 {
		return x
	}
	u.par[x] = u.root(u.par[x])
	return u.par[x]
}

/* xの所属するグループ と yの所属するグループ を合体する */
func (u UnionFind) unite(x, y int) {
	xr := u.root(x)
	yr := u.root(y)
	if xr == yr {
		return
	}
	u.par[yr] += u.par[xr]
	u.par[xr] = yr
}

/* xとyが同じグループに所属するかどうかを返す */
func (u UnionFind) same(x, y int) bool {
	if u.root(x) == u.root(y) {
		return true
	}
	return false
}

/* xの所属するグループの木の大きさを返す */
func (u UnionFind) size(x int) int {
	return -u.par[u.root(x)]
}

```

# 利用

```golang
func main() {
	// インスタンスの生成
	u := newUnionFind(N)
	
	// 各メソッドの利用
	u.unite(a, b)
	u.same(a, b)
	u.size(a)
	u.root(a)
}
```

# 内容について
親の要素には, その木の大きさをNとすると, $N \times (-1)$が与えられており, 
子の要素には, それが属する木の親の値が与えられるようになっています.

そのため, 要素が負であれば親であることがわかり, それを正の数に戻すことでその木の大きさを得ることできます.
文字コードをコマンドで切り替える(iTerm2 )

環境、ファイルごとに文字コードがeuc, utf-8と混在しており、頻繁に日本語が文字化けしていました。
毎回iTerm2の設定画面で切り替えていましたが、面倒なのでコマンドで切り替えれるようにします。

# プロファイルを文字コードの数だけ作る
iTermを開いている状態で`cmd + , `でPreferencesを開き、
+ボタンから必要な数だけプロファイルを作成します。
名前は文字コード名がよいでしょう。
<img width="916" alt="スクリーンショット 2019-03-23 21.16.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/263190/67178980-eb64-6fe6-1be4-d0ebe1677dd5.png">

Terminal設定で実際の文字コードを設定する
<img width="930" alt="スクリーンショット 2019-03-23 21.22.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/263190/99c95398-9165-d061-6acc-d282a11e6b78.png">

# コマンドでプロファイルを切り替える
`$ echo -e '\033]1337;SetProfile=プロファイル名\a'`で任意のプロファイルに切り替えることができます。

utf-8に切り替えてみる

```zsh
$ echo -e '\033]1337;SetProfile=utf-8\a'
$ cat test.txt
aaa
あああ
```

eucに切り替えてみる

```zsh
$ echo -e '\033]1337;SetProfile=euc\a'
$ cat test.txt
aaa
秧???????
```
参考：https://www.iterm2.com/documentation-escape-codes.html


# シェルに切り替えコマンドを登録する
毎回コマンドを打つのは面倒なのでbash_profileや.zshrcに登録しておきます。

zshrcを更新後、`source .zshrc`コマンドやログインし直して設定値を読み込み直します。

```zsh
alias utf="echo -e '\033]1337;SetProfile=utf-8\aencording:utf-8'"
alias euc="echo -e '\033]1337;SetProfile=euc\aencourding:euc'"
```



簡単に文字コードを切り替えることができるようになりました。

```
$ utf
encoding:utf-8
$ cat test.txt
aaa
あああ
```

```
$ euc
encoding:euc
$ cat test.txt
aaa
秧???????
```
vimプラグインの名前付け

`*.vim` 派と `vim-*` 派がある。
自分で使ってるプラグインという偏重しまくった母集団内でどちらが支配的か調べてみる。
全プラグインで調べるなんて暇なことはしない

```text:*.vim派
async.vim
asyncomplete-lsp.vim
asyncomplete.vim
capture.vim
direnv.vim
fzf.vim
lightline.vim
open-browser-github.vim
open-browser.vim
sudo.vim
tig-explorer.vim
typescript-vim
```
12個。

```text:vim-*派
vim-autoflake
vim-autoformat
vim-bufkill
vim-devicons
vim-dirvish
vim-dirvish-git
vim-dispatch
vim-fugitive
vim-gitgutter
vim-github-hub
vim-go
vim-gogh
vim-javascript
vim-jinja2-syntax
vim-json
vim-jst
vim-lsp
vim-markdown
vim-merginal
vim-pyenv
vim-rhubarb
vim-ripgrep
vim-snippets
vim-srcery
vim-surround
vim-textobj-entire
vim-textobj-user
vim-toml
vim-twiggy
vim-vimlint
vim-vimlparser
vim-wipeout
```
32個。

その他

```text:その他のvimを含む派
jedi-vim
previm
```

```text:vimなんて名前に入れないよ派
favex
lightline-ale
momiji
plantuml-syntax
tsuquyomi
ultisnips
winresizer
```
Anaconda仮想環境をVisual Studio Codeから指定する

Anacondaを使って構築した仮想環境を、VSCodeから指定する方法
__※VSCodeにPython for VSCodeが導入されている場合__

1.ターミナルで仮想環境のアドレスを調べる

```
~$ conda info -e
# conda environments:
#
base                  *  /home/hoge/anaconda3
base2             /home/hoge/anaconda3/envs/base2

```
例の場合`/home/hoge/anaconda3/envs/base2`が指定したい環境

2.VSCodeから仮想環境へのパスを設定する
ファイル→基本設定→設定を選択する
設定の検索に`python.pythonPath`と入力すると現在使用している環境のパスが表示されるので、これを指定したい環境のパスに書き換える。
current_userの↓説明できる？

これって元々どうなってたの？

```app/helpers/sessions_helper.rb
def current_user
    @current_user ||= User.find_by(id: session[:user_id])
end
```

っていうかこれどう動いてたんだっけ？

##Lv.1 if文

```ruby
if @current_user.nil?
  @current_user =  User.find_by(id: session[:user_id])
else
  @current_user =  @current_user
end
```
##Lv1.1 asmさんからご提案頂きました。

```ruby
@current_user = if @current_user.nil?
                  User.find_by(id: session[:user_id])
                else
                  @current_user
                end
```
「移り変わり」感がよりイメージしやすくなりましたね。
##Lv.2 三項演算子
名前でビビりますね。

```ruby
@current_user = @current_user.nil? ? User.find_by(id: session[:user_id]) : @current_user
```
これにリファクタリングできたらかっこいいけど…
##Lv.3 or 演算子　「 || 」


```ruby
@current_user = @current_user || User.find_by(id: session[:user_id])
　　　　　　　　　　　　　　　　　②　　①
```
①@current_userが無ければ(nil)なら、User-を代入
②userと||のスキマ
　@current_userが存在すれば、@current_userの値はそのまま。

##Lv3.5 大前提
```ruby
n = n + 1
n += 1
```
同じ意味でしたね。

##Lv.4 自己代入演算子 「||=」

```ruby
@current_user ||= User.find_by(id: session[:user_id])
　　　　　　　　　　　①
```

①Lv.3.5の
　nが@current_userの立場

##まとめ
いきなりif文から「||=」までは難しい。
条件によりけりですが、Lv.2までは大体リファクタリングできる。
今回がかなり特別。
Ruby on Rails DM 2019 登壇者の影響を受けた3冊まとめ (day.2)

すごいRailsエンジニアの方々がどんな書籍を読んで今に至るのか、またどんな本が人気なのか？をもとに、もっと高みを目指そうということで、Ruby on Rails 2019の冊子で紹介された、

「影響を受けた3冊」

をリスト形式で掲載。途中で力尽きて、著作名のみになっている点はご了承ください。

イベントについて：
Ruby on Rails 2019 3/22~23 開催
https://techplay.jp/event/714867

# Day 1の登壇者の方々 はこちら
https://qiita.com/shogotgm/items/adece25dd5ac16fcb7cf

# Day 2の登壇者の影響を受けた3冊まとめ

### @ moro
・UNIXという考え方-その設計思想と哲学
・テスト駆動開発入門
・エクストリームプログラミング

### @ taiki-t
・オブジェクト指向設計 実践ガイド Rubyでわかる進化しつづける柔軟なアプリケーションの育て方
・イシューからはじめよ -知的生産のシンプルな本質
・Rails Tutorial

### @ masa-iwasaki
・達人プログラマー 職人から名匠への道
・ライト、ついてますか -問題発見の人間学
・OSの基礎と応用 - 設計から実装、DOSから分散OS Amoebaまで

### @ willnet
・ウェブ進化論 本当の大変化はこれから始まる
・RailsによるアジャイルWebアプリケーション開発
・パーフェクトRuby on Rails

### @ fujimura
・RailsによるアジャイルWebアプリケーション開発
・The Little Schemer
・言語哲学大全

### @ kokuyouwind
・マッチ箱の脳(AI)-使える人工知能のお話
・プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識
・数学ガール

### @ koichiroo
・入門 GNU Emacs
・JavaからRubyへ
・達人プログラマー 職人から名匠への道

### @ idesaku
・達人プログラマー 職人から名匠への道
・アジャイルな見積もりと計画づくり ~ 価値あるソフトウェアを育てる概念と技法 ~
・ライト、ついてますか - 問題発見の人間学

### @ koic
・オブジェクト指向スクリプト言語 Ruby
・達人プログラマー 職人から名匠への道
・エクストリームプログラミング

### @ radioboo
・初めてのPerl
・アジャイルソフトウェア開発の奥義
・ねぼけ人生

### @ risacan
・Practical Object-Oriented Design in Ruby
・プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識
・Namluby pana Pipi

### @ joker1007
・ジョジョの奇妙な冒険
・アジャイルサムライ - 達人開発者への道
・パーフェクト Ruby

### @ f440
・Agile Web Developmet with Rails
・エンタープライズ Rails
・ウェブオペレーション - サイト運用管理の実践テクニック

### @ yoshuki
・コンサルタントの秘密 - 技術アドバイスの人間学
・ハッカーと画家 コンピュータ時代の創造者たち
・Ruby on Rails 携帯サイト開発技法

### @ unak
・闘うプログラマー
・プログラミング技法
・達人プログラマー 職人から名匠への道

### @ ikedaosushi
・イシューからはじめよ - 知的生産のシンプルな本質
・CAREER SKILLS ソフトウェア開発者の完全キャリアガイド
・ハッカーと画家、コンピュータ時代の創造者たち

### @ komagata
・プログラミングPerl
・ピープルウエア
・人月の神話

### @ bany
・Rubyist Magazin 出張版 正しいRubyコードの書き方講座
・JavaScript The Good Parts
・UNIXという考え方 -その設計思想と哲学

### @ shinamon129
・Flash&ActionScript3.0 プロが教える本当の使い方
・ツイッターで学んだいちばん大切なこと
・エラスティックリーダーシップ 自己組織化チームの育て方

### @ yasaichi
・テスト駆動開発
・ハッカーと画家、コンピュータ時代の創造者たち
・問題発見プロフェッショナル

### @ knu
・アスキー「256倍使うための本」
・プログラミングPerl
・C言語による標準アルゴリズム事典

### @ mtsmfm
・メタプログラミングRuby
・アジャイルサムライ - 達人開発者への道
・Rails によるアジャイルWebアプリケーション開発

### @ pipopotamasu
・開眼！JavaScript - 言語仕様から学ぶJavaScriptの本質
・やさしいJAVA
・アメリカの少年野球　こんなに日本と違ってた

### @ hokaccha
・ユニバーサルHTML/XHTML
・ハイパフォーマンス Webサイト -高速サイトを実現する14のルール
・初めてのRuby

### @ hanachin
・ハッカーと画家 コンピュータ時代の創業者たち
・情熱プログラマー ソフトウェア開発者の幸せな生き方
・フリーソフトウェアと自由な社会

### @ katsumata-ryo
・たのしいRuby
・SCRUM BOOT CAMP THE BOOK
・落下する夕方

### @ k0kubun
・たのしいC
・たのしいRuby
・きつねさんでもわかる LLVM

### @ 284km
・ジョジョの奇妙な冒険 Part5 黄金の風
・ジョジョの奇妙な冒険 Part3 スターダストクルセイダース
・ジョジョの奇妙な冒険 Part7 スティール・ボール・ラン

### @ sinsoku
・JAVA言語で学ぶデザインパターン入門
・アジャイルソフトウェア開発の奥義 オブジェクト指向開発の真髄と匠の技
・レガシーコード改善ガイド
RaspberryPiで自宅のシーリングライトに目覚まし機能をつけてみた

スマホのアラームが聞こえてるけどそのまま寝続けてしまい起きたら11時……みたいなことが最近多いです．
聴覚刺激はもう自分の体には効かなくなってしまったと悟り，違う感覚を刺激して目を覚めさせようと思いました．
触覚でも良かったのですが，簡単そうな視覚から刺激してみます．あと光で目覚めると体にいいって聞いたことある気がします．（要出典）

#なにをするのか
自宅にある**リモコンで操作できる照明**を，時刻を指定してスイッチオンします．
具体的には，
- リモコンからでる赤外線信号をRaspberryPiに覚えさせ，同じ信号を赤外LEDから発信できるようにする
- 上記の操作を指定した日時に実行できるようにする
といったところ．

#赤外線発信器を作る
とてもわかり易い記事があったので参考にさせていただきました．
みなさんも [格安スマートリモコンのつくりかた](https://qiita.com/takjg/items/e6b8af53421be54b62c9) を見てスマートリモコンを作り，自宅のリモコンを学習させましょう．
準備するものは，上の記事の通りのものを[秋月電子通商](http://akizukidenshi.com/catalog/contents2/akiba.aspx)で買いました．RaspberryPiの型だけはRaspberryPi3 ModelBを使っています．

完成したのがこちらです．赤外LEDは僕の場合は１つで十分でした．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340630/ee003708-e39b-3bf7-df78-3144582400a8.png)


赤外線受信モジュールにリモコンを向けて信号を送り，学習をさせます．
送信のpythonスクリプトを実行するとちゃんと部屋の電気が消えたりついたりします．部屋をハックしている感じが**とても良い:relaxed:**．
次はこのスクリプトを指定時間に実行させます．

#指定した時間に信号を送る
これはcronというものを使えば簡単に行えます．
cronとは定期的にコマンドを実行するためのデーモンプロセスのことですが，詳しくはこちらの記事を．[初心者向けcronの使い方](https://qiita.com/tossh/items/e135bd063a50087c3d6a)．
要は日時指定すれば勝手に実行しておいてくれるやつですね．

まず，実行したいコマンドが含まれたバッチファイルを適当なディレクトリに作りましょう．

```console:バッチファイル作成
sudo touch /home/pi/hogehoge/lightUp.sh
```
```shell:lightUp.sh
for i in `seq 1 3`
do
  python3 /home/pi/hogehoge/irrp.py -p -g17 -f /home/pi/hogehoge/codes light:on
  sleep 1s
done
```
1回では失敗する可能性もあるので， 明かりをつけるコマンドを1秒おきに3回送ることにします．
**相対パス指定ではcronで実行するときうまく動いてくれないみたいなので絶対パスで指定しましょう．**
(ここで手こずりました．)

この時点でのフォルダ構成はこんな感じです．
codesは赤外線受信のコードを使用するとirrp.pyと同じディレクトリに作成される赤外線データファイルです．

```:フォルダ構成
home/
  └ pi/
     └ hogehoge/
          ├ irrp.py
          ├ codes
          └ lightUp.sh
```
ではcronにシェルを登録していきましょう．

```crontab -e```
でcronに登録するためのファイルが開けます．初めて起動するときに，好きなエディタを選べと言われるので好きなエディタを選びましょう．
そのファイルの末尾に，用途に合わせて

```
#毎日8時にlightUp.shを実行
00 8 * * * sh /home/pi/hogehoge/lightUp.sh
#毎月曜日の8時30分に実行
30 8 * * 1 sh /home/pi/hogehoge/lightUp.sh
#平日の８時３０分に実行(もっと賢く書けそう) 
30 8 * * 1 sh /home/pi/hogehoge/lightUp.sh
30 8 * * 2 sh /home/pi/hogehoge/lightUp.sh
30 8 * * 3 sh /home/pi/hogehoge/lightUp.sh
30 8 * * 4 sh /home/pi/hogehoge/lightUp.sh
30 8 * * 5 sh /home/pi/hogehoge/lightUp.sh
```
と追加しましょう．
書式は
分　時　日　月　曜日　コマンド
です．*はワイルドカードで任意の値を指します．

これで指定した時刻にコマンドが実行されます！
朝８時に電気が私を起こしてくれますね．

###cronのログを見る
cron のログを確認できるようにするとちゃんと動いてるか見れて便利です．
```sudo nano /etc/rsyslog.conf```
より，コメントアウトされている以下の行のコメントを外します．

```config:rsyslog.conf
#cron.* /var/log/cron.log
↓
cron.* /var/log/cron.log
```

保存をしたらログ管理システムを再起動します
```sudo /etc/init.d/rsyslog restart```

以下のコマンドでログが見れます．きちんと８時に実行されていますね．
```sudo cat /var/log/cron.log```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340630/90bff408-854d-73a4-47a4-4adab45a4d20.png)

#時間変えるのにいちいちラズパイのcron書き換えないといけないの！？
むしろ起床時間を固定したほうが規則正しい生活をするという目標に合っているので，気軽に書き換え可能でないほうがいい気がします．
でもSlackとかLINEから気軽に起床時間設定できるといいですよね．
数日使ってみてその機能が必要だな〜と思ったら作ろうと思います．

#まとめ
そもそもこういう機能がついた照明とかスマートリモコンとかって結構売ってますよね．
単純な興味で作ったのですが，一から作ってみるといろいろ中身が知れていいですね．

##参考記事
[格安スマートリモコンのつくりかた](https://qiita.com/takjg/items/e6b8af53421be54b62c9)
[初心者向けcronの使い方](https://qiita.com/tossh/items/e135bd063a50087c3d6a)
【vim入門】vimtutorはいいぞ

先日Twitterで「Lpic持ってるのにvim（vi）が使えない人がいて困った」という内容のツイートを見ました。
最初はそんな事あるのか？と思ったんですが、実機操作はせずに完全にping-t等で問題を丸暗記して受験に受かったらそうなるか…
と納得しました（偉そうな事を言っていますが僕はLpic-1すら持っていません）

※因みにLpic-1では「103.8基本的なファイル編集」の部分でviによるファイル操作を学習することになります。
LPIの公式HP↓
https://www.lpi.org/ja/our-certifications/exam-101-objectives

個人的にですが、基本的なvimの習得という観点で言うならLpicよりも"vimtutor"コマンドで学習するのが
学習コストも少なく学べるのではないかと思ったので、"vimtutor"について紹介記事を書く事にしました。


#対象者
・vimなんもわからん
・lpicの学習でviは勉強したけどもう忘れた
・vimの学習したいけど文字読むだけだとつまらん

#前提条件
PC上(Linux)でvimが使える状態である事。



#やり方
```
$ vimtutor
```

このコマンドを打つだけで以下のようなチュートリアルが起動します。

```
===============================================================================
=    V I M 教 本 (チュートリアル) へ よ う こ そ        -    Version 1.7      =
===============================================================================

     Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた非常
     に強力なエディターです。このチュートリアルは、あなたが Vim を万能エディ
     ターとして使いこなせるようになるのに十分なコマンドについて説明をするよう
     になっています。

     チュートリアルを完了するのに必要な時間は、覚えたコマンドを試すのにどれだ
     け時間を使うのかにもよりますが、およそ25から30分です。

     ATTENTION:
     以下の練習用コマンドにはこの文章を変更するものもあります。練習を始める前
     にコピーを作成しましょう("vimtutor"したならば、既にコピーされています)。

     このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し
     ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ
     ならないのです。文章を読んだだけならば、きっと忘れてしまいます!

     さぁ、Capsロック(Shift-Lock)キーが押されていないことを確認した後、画面に
     レッスン1.1 が全部表示されるところまで、j キーを押してカーソルを移動しま
     しょう。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
大体30分～45分くらいで全部終わると思います。

カーソルの移動やvimの起動、終了など、本当に初歩の部分から教えてくれるので
このチュートリアルを1週間ほど毎日実施していれば、かなりvimの操作は上達するはずです。
※少なくとも現場でvi(vim)の使い方が分からなくて怒られたり、マウントを取られたりすることは無くなると思います。


#最後に
これはvimの操作に限った事ではないのですが、何か技術的な勉強する際には文章を読むだけではなく、
実際に手を動かしてやる方が圧倒的に効率が良いです。
実際に手を動かして、苦労しながらやった事の方が記憶には残りやすいですね。


```

     このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し
     ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ
     ならないのです。文章を読んだだけならば、きっと忘れてしまいます!
```
vimtutorのATTENTIONからの抜粋、めっちゃ良い事言ってますね:grinning:
Sublime Text でビルドしたときの文字化け問題（Windows のみ）

# はじめに
普段のエディタは **vim**なんですが、ちょっとした作業や誰かと画面を共有するときは **Sublime Text** を使用しています。

この前、初めてSublime Text の [Build Systems](https://www.sublimetext.com/docs/3/build_systems.html) を使ったのですが、そのときに日本語の文字化けが発生したので、その解決方法を調べました。

# 環境

* Sublime Text 3 Build 3200
* Windows 10

# 事象
日本語を含む Kotlin ソースをビルドして、実行すると文字化け発生。Build には [Kotlin](https://packagecontrol.io/packages/Kotlin) のパッケージを使用。

![image001.png](https://qiita-image-store.s3.amazonaws.com/0/96666/ded1dc5b-4b75-70dd-1bc6-4214a4b7524f.png)

# 解決方法

1. [PackageResourceViewer](https://packagecontrol.io/packages/PackageResourceViewer) のパッケージをインストール
2. コマンドパレットを開いて、`PckageResourceViewer:Open Resource` を実行
  <img width="633" alt="スクリーンショット 2019-03-23 20.54.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/96666/a373016e-330c-4124-5d20-fcb488674ad7.png">
3. `Default` - > `exec.py` と開く
4. `ExecCommnad` class の `run` メソッドの `encoding` 引数のデフォルト値を `cp932` に変更し上書き保存（189行目付近）
5. `C:\Users\<ユーザー名>\AppData\Roaming\Sublime Text 3\Packages\Default` に先程保存した `exec.py` が存在することを確認
![image003.png](https://qiita-image-store.s3.amazonaws.com/0/96666/c668a20f-6aa6-de40-5d07-402c86f81d43.png)
6. Sublime Text に戻ってビルドを行うと日本語が表示されていることがわかります！
![image004.png](https://qiita-image-store.s3.amazonaws.com/0/96666/dffdf736-e636-a8d3-9b49-ef1d25747c8b.png)

# その他の解決方法と原因の考察

今回は、`exec.py` の編集で対応しましたが、以下のように新しいビルドシステムを新規に追加して、`"encoding": "cp932"` と設定する方法もあります。

[Sublime Text3のPythonビルドで日本語出力できない問題と、Python2、3ビルド切り替え | 　みろりHP　](http://guild-elf.jugem.jp/?eid=784)

しかし、これではデフォルトで準備されているビルドシステムをすべて置き換える必要があるため、今回は本記事の方法を採用しました。

解決方法の参考にしたのは、以下の記事です。

[subprocess.run(..., stdout=subprocess.PIPE)で日本語を含む場合のメモ(文字コード判定) - Qiita](https://qiita.com/int_main_void/items/c456d06312817f3bc78d)

`exec.py` の中にも、`subprocess.run(..., stdout=subprocess.PIPE)` を使用している部分があったため、同じ原因だろうと予想しています。もう少し、ちゃんとPython のコードが読めるようになりたい...。

# 終わりに
今回は、Sublime Text の文字化けの対応をしてみました。Windows では `cp932` がまだまだ使われており、Mac や Linux と同じようにうまくは行かないな...と実感しました。

Python もまだまだ理解できていない部分もあるので、引き続き勉強したいと思います。
25日目。JQueryでクリック、マウスオーバーで動くページを作りました。


25日目の今日はProgateのJQuery中級編にチャレンジしました。
クリックやマウスを乗せる、外すといったイベントをキャッチして、HTMLやCSSを書き換える仕掛けを作りました。
最初は何をやっているかわからなくて、2周まわってようやく、なるほどーとなりました。
コードに書いた事と、動作させたい事がだんだん結びついてきた感じです。まさに「言語」という感覚です。

JQuery
http://appdays.herokuapp.com/Day25/

###WEBページを作ろう
JQueryが使えると動きのあるページがつくれる！

###jQueryの準備
・JQueryを使うには、Headの中でライブラリのURLを読み込む。
・xxx.jsファイルに書き込む。`</body>`の直前に書くとWebページの表示が早くなる。→ へええーってなりました。HTMLをずらずらーっとたくさん書いて、最後にjsを読み込みます。なるほどーっ。

```html

<head>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
  <h1>・・・
   <h2> ・・・
   		・・・・・・
   		・・・・・・
  <script src = "script.js"></script>
</body>
```

・HTMLの読み込みが完了してから、JQueryの操作を開始するとよい。そのためにReadyイベントを使用する。
これを省略して`$(function(){ });`と書く。→ 省略形のしか見たことがありませんでした。Readyが隠れていたんですね！

###モーダル
モーダルってなんでしょう。クリックすると表示されるメニューの事でいいでしょうか。
よく広告なんかで見かけますよね。


>モーダルウィンドウ（英: modal window）は、コンピュータアプリケーションソフトウェアのユーザインタフェース設計において、何らかのウィンドウの子ウィンドウとして生成されるサブ要素のうち、ユーザーがそれに対して適切に応答しない限り、制御を親ウィンドウに戻さないもの。
[Wikipedia モーダルウィンドウ](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6)


なるほど。

モーダルは、①CSSで隠しておいて、②Clickしたら表示するように作ります。
なので、コーディングの最初は表示されっぱなしでした。おもしろい。
そのCSSに`display: none;`として、一旦消しておきます。

そして、画面上のボタンをクリックすると、CSSを書き換えて表示させる、という仕組みでした！

ここでidとclassのどっちがどっちか混乱したのでおさらいしました。

id １ページ１箇所だけ。場所を指定してそこにジャンプしたり。
class １ページ何箇所でも。今回はログインモーダルと登録モーダル、両方に同じ閉じるボタンをclassで使いました。

参考にしたページでは、idは優先順位を考えるのが大変になるので、とりあえずclassを使えば安全とありました。ただし、idの方が表示が早いそうなので、目的や好みで使い分けている感じでしょうか。

【イラスト解説】divに付いているidとclassの意味と使い方
https://webliker.info/34436/


###hover機能の準備
hoverはマウスの矢印がのった時に反応する機能です。
マウスをのせた時に動作させたいエリアを`<div class="xxx"></div>`で囲って、
JQueryにてマウスを乗せた時、外した時の動作を書いておきます。

```
  $('.lesson-hover').hover(
    function() {
      // カーソルをのせた時の処理
      $(this).find(`.text-contents`).addClass('text-active');
      
    },
    function() {
      // カーソルをはずした時の処理
      $(this).find(`.text-contents`).removeClass('text-active');
      
    }
  );
 ```

これが面白いのは、一旦読んだCSSを一時的に書き換えているんですね！

#アコーディオン
クリックするとメニューが開くあれです。
こちらも、最初は隠しておきたいメニューをCSSで隠しておいて、マウスでクリックしたらJQueryでメニューが開いているかを判定し、開いていたらCSSで隠すよう、閉じていたらCSSで表示するように書いておきます。

```javascript

// 「.faq-list-item」のclickイベントを作成してください
  $('.faq-list-item').click(function() {
    var $answer = $(this).find('.answer');
    if ($answer.hasClass('open')) {
      $answer.removeClass('open');
    } else {
      $answer.addClass('open');
    }
  });
```

さらに、JQueryでCSSを書き換えられる、ということはHTMLの中身も書き換えられる！

```javascript
$(this).find('span').text('Hello');
```

これは、指定の要素のSPANタグの中身をHelloに変えています。
おもしろーい！！！

###完成！
（所要時間 3時間）