OmniAICreator/Qiita-1.07M huggingface dataset:
ゼロからChefをざっくり理解するまでのノート

## 目的

今さらながら、Chef界隈をざっくり理解する必要に迫られたので、一旦Webで拾い読んだノート。

## Chef

> [Chef初心者向け資料置き場 - Qiita](https://qiita.com/shogomuranushi/items/6ce5b4b1a7d297b7ff43)

このポストを参考に下記をざっと読む。

### Chefの概要

> - [インフラストラクチャ自動化フレームワーク「Chef」の基本 - ＠IT](http://www.atmarkit.co.jp/ait/articles/1305/24/news003.html)
> - [Chef を始める #1 – 概要、Chef Server を EC2 上にインストール、Workstation の設定まで ｜ Developers.IO](https://dev.classmethod.jp/server-side/chef-server-install/)

- 特色
	- インフラをどのように構築し、維持するべきかという定義はRubyの文法で記述される
	- あたかもRubyでプログラミングをするように、インフラの構成管理をコードによって行える
	- べき等性=ある操作を一度行っても何度行っても結果が同じ
		- chefは基本保証するが、cookbook、recipeを自分で書くときはべき等性を保つよう注意
- インフラの定義方法
	- cookbook: rubyで記述されたインフラの定義
	- recipe: cookbook構成要素のひとつ。ruby文法+resource
	- resource: chef専用の命令
- 構成
	- どちらでも運用可能、cookbookの書き方も同じ
		- server/client: 大規模環境向き
			- + serverに構成が一元蓄積され見通しが良い
			- - server維持管理、client構築が手間
		- solo: 小規模向き
			- + 手軽に導入
			- - 全体の確認、ノード連携は自己負担
- 構成要素
	- chef server: Nodeの管理、Cookbook、Recipe情報などの構成管理。Web UI
	- workstation: Knifeコマンドで、CookbookやRecipeを操作したり、Chef Serverに指示
	- node: Chef Serverが管理するマシン。Chef Serverで管理しているCookbookやRecipe情報をNode上のChef Clientが取得、そのタスクを実行


### なぜInfrastructure as Codeが必要か

> - [大規模システム構築に求められる自動化とChefの基本的な考え方とは | Think IT（シンクイット）](https://thinkit.co.jp/story/2013/11/18/4679)

- as-is
	- 設定ミスにより膨大な作業が発生するリスクがある
	- 全体の待ち時間が大きな時間のロスになる
- to-be
	- コード化した状態を他のシステム構築・運用にも流用できる
	- 繰り返し作業を集約できる
	- システムの状態を容易に確認できる

> - [「Immutable Infrastructure」 by 伊藤 直也氏 #jawsdays – JAWS DAYS 2014 参加レポート Vol.02 ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/jawsdays2014-02/)

- Chefについては「”サーバの構成を自動化するツール”ではなく、”サーバの状態をコードにする”が本質」
- 全てをStatelessにすることがImmutable Infrastructureの目的ではなく、Statelessであるべき箇所をImmutableに扱おうということが目的
	- 例えばログなどの状態についてはfluentdで外部に配置するなどの仕組みを用いるべき

> - [今さら聞けない Immutable Infrastructure - 昼メシ物語](http://blog.mirakui.com/entry/2013/11/26/231658)

- 背景
	- auto-scaling - 負荷に応じて自動的にサーバ台数を増減させる技術。自動立ち上げ/shutdown=使い捨て
	- blue-green deployment - サーバ群をまるごと複製し、ロードバランサで切り替えることでデプロイとする
- Immutable Infrastructureとは:
	- サーバを使い捨てにする
	- 一度セットアップしたら二度と状態を変更しない
	- 単なる運用テクニックではなく「サーバをソフトウェア部品として抽象化する」発想シフト
- to-be
	- 全てのサーバが同じ状態であることが保証される
	- 常にゼロからセットアップできることが保証される
	- 自動化が必須になる
	- プロビジョニングがシンプルにできる
	- テストとの親和性
	- サーバのポータビリティが高められる
- issue
	- コスト - サーバ台数分
	- ログ - サーバを使い捨てる分、ログ集約しておく必要
	- DB/ストレージ - 永続的DB/ストレージは使い捨てにくい。ひとつの逃げ道がDBaaS
	- Immutable 前提なプロビジョニングツール -  Chef や Puppet の冪等性がオーバースペック


EOF
railsにおけるactiverecordによるmodelの関連付け

この記事はrailsドキュメントの下記の記事をまとめたもの。

https://railsguides.jp/association_basics.html

# modelの関連付け（association）とは

railsではmodelに記述することでactiverecordモデル同士のつながりを指定します。関連付けを指定することで例えばこれを削除したときはこれも一緒に消すのような処理を行うことができます。

例：親タグと小タグを関連付けて親タグが削除された際にはそれに属する小タグも削除されるようにする。

```ruby:例
@books = Book.where(author_id: @author.id)
@books.each do |book|
  book.destroy
end
@author.destroy
```

を

```ruby:例
class Author < ApplicationRecord
  has_many :books, dependent: :destroy
end
class Book < ApplicationRecord
  belongs_to :author
end
```

で関連付けすることで

```ruby:例
@books.each do |book|
  book.destroy
end
```

のみでどちらも消すことができる。

# 関連付けの種類

## belongs_to関連付け

belongs_toは1対1でつなげたいときに使うもの。

```ruby:例
class Book < ApplicationRecord
 belongs_to :author
end
```
上記の記述でbookのDBとauthorDBを繋げられる。belongs_to関連付けで指定するモデル名は必ず「単数形」にしなければなりません。あくまで1対1でbookのid一つにつきauthorが1idになります。

## has_many関連付け

has_manyは1対多のときに用います。

```ruby:例
class Book < ApplicationRecord
 has_many :author
end
```

注意：has_many関連付けを宣言する場合、相手のモデル名は「複数形」にする必要があります。

## has_many :through関連付け

間にマッチングのためのDBを用いる場合によく使う。多対多を関連付けるときに使う。AのDBを介してBと関連付けたいときに使う。

## 一度に複数のレコードをネストで保存したい時 -accepts_nested_attributes_for-

accepts_nested_attributes_forを使うと一度に複数レコードを保存することができる。またネスト構造で関連付けして保存することができる。

https://railsguides.jp/form_helpers.html

```ruby:例
class Person < ActiveRecord::Base
 has_many :addresses
 accepts_nested_attributes_for :addresses
end
 class Address < ActiveRecord::Base
 belongs_to :person
end 
```
AdMobのInterstitialAdを導入した際に踏んだ罠のメモ

## はじめに
[個人で開発しているプロダクト](https://play.google.com/store/apps/details?id=com.masaibar.nozokimi&referrer=qiita_interstitial)にAdMobのインタースティシャル広告を導入しようとした時に幾つか嵌った罠があるのでメモを残しておきます。

## 罠とは
### テスト用のIDがBannerとは違う
[手順書](https://developers.google.com/admob/android/interstitial)にあるIDをすっかり見落としており、バナーやネイティブ広告と同じdebug用のIDを設定したところ広告が表示されれず手間取りました。
これはドキュメントをちゃんと読まなかった私の自業自得ですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/68671/7f5b25ca-592d-03f0-6ebc-6a2b643d78ec.png)


### リスナーの呼ばれ方もBannerとは違う
同じAdListenerクラスをsetして使うのですが、Bannerと同じリスナーが呼ばれるかと思っていたら挙動が違いました。

|イベント| Banner | Interstitial|
|:-----------:|:----------:|:----------:|
|読み込み完了時|onAdLoaded()|onAdLoaded()|
|表示完了した時|-|onAdOpened()|
|クリック時|onAdOpened()|onAdLeftApplication()|
|閉じた時|-|onAdClosed()|

Bannerは読み込み完了≒表示完了みたいなタイミングです。
それに対してInterstitial広告は予め読み込む必要があるため、読み込み完了時にはonAdLoaded()が呼ばれ、表示時にはonAdOpened()が呼ばれます。

そして、このonAdOpened()は**Bannerではクリック時に呼ばれます。**
クリック数を集計するつもりでBannerと同じ実装でonAdOpened()にログを仕込んだところ、押した覚えのないクリックが発生したことになってしまい混乱しました。

ちなみに、Interstitialの場合は広告クリック時にonAdLeftApplication()が呼ばれました。
ここには出てきていませんが、onAdClicked()というメソッドを差し置いてonAdOpened()やらonAdLeftApplication()が呼ばれるのはなんだか釈然としません。

### 音がいきなり出る、その対処方法
実装が終わり、テスト用の広告の表示も問題なく確認できたので、リリースビルドをして本番用の広告で表示確認をしたところ急に端末から大音量の音楽が流れ出しました。
テスト広告ではただの一枚の画像としての広告でしたが本番用は広告の種類にチェックが入っていた場合、動画広告が流れる場合があります。
そして、この音量はデフォルトoff設定用のフラグなどは見当たらず端末の現在の音量によって決定されます。

MobileAdsクラスにsetAppMuted(boolean)というメソッドが有り、それでミュートに出来るかと思ったのですがうまく動かなかったため代替案として力技でミュートのon/offを実行しました。

```kotlin
private fun setAppMuted(muteState: Boolean) {
    val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
    audioManager.setStreamMute(AudioManager.STREAM_MUSIC, muteState)
}
```

このメソッドを上述のリスナーの適切な位置から呼び出すことで、動画再生前にミュート状態になり、広告を閉じる時点でミュートが解除されるようになります。

せっかくの動画広告なのにミュートにすることで、広告主の伝えたい情報が視覚からのみに半減してしまうのは本末転倒な気もしますが、いきなり大音量が鳴る広告もそれはそれで心証が悪くなるため組み込むアプリの性質に応じてデフォルトでミュートにするかどうかを考えるべきだと思います。

少なくとも私の作っているアプリに関していうと普段音の鳴るコンテンツが殆ど存在しないため、多少広告の効果が下がってもデフォルトをミュートにし、離反を防ぐことで中長期的に広告を見てもらうことを優先すべきだと判断しました。
（そもそも全画面広告を導入したことによってユーザーの離反率が上がるのではないかという問題は別途あります。）

## おわりに
自分がユーザーとして全画面広告というはあまり好きじゃなかったのですが、知り合いから強い勧めを聞いたのでこれから試験的に導入してみます。
また、万が一のレビュー荒れに備えFirebaseのRemoteConfigで表示割合を調整する仕組みの容用意や、AdMobの管理画面からフリークエンシーキャップ[^1]を設定することである程度表示を制御できる仕組みは一緒に導入しておいたほうが良いと思っています。

[^1]: 同一のユーザーに対する広告表示回数を、1 分、1 時間、または 1 日単位で制限するための上限値。
Slackの過去メッセージを取得するスクリプト(Promise版)

当社でもSlackを初めてもうすぐ２年になります。全履歴を取得して、何かできないかなと思ったので、調べてスクリプトを書いたので公開します。

# Slackで使用するAPI
以下です。
https://api.slack.com/methods/search.messages
このAPIを使用するにはTokenが必要なので、それは自分のSlackを使って発行しておいてください。おそらく以下から発行できます。(他人に見られないように)
https://api.slack.com/custom-integrations/legacy-tokens

# 使用したスクリプト
もちろん、最近習得カーブが急上昇しているJavaScriptです。
外部APIにアクセスするので、**superagent**を使用します。
もしかするとたくさんのAPIをコールする可能性もあるので**promise**使っています。
PromiseはAPI名と検索条件をオブジェクトで渡すため、関数でラップしてます。
(検索条件はオブジェクトリテラルでそのまま突っ込んでいますがこの辺りは要改善)

```JavaScript
const request = require('superagent');

const url = "https://slack.com/api/";
const slackLegacyToken = process.env.slackLegacyToken;

var queryObject = {
    "token":slackLegacyToken,
    "query":"after:2017/12/1",  //2017/12/1以降
    "count":"2",                //1度に2件表示する
    "sort":"timestamp",
    "pretty":"1"};

function callSlackApi(apiName,queryObject) {
   return new Promise(
       (resolve, reject) => {
           request.post(url + apiName)
           .query(queryObject)
           .set('Content-Type', 'application/x-www-form-urlencoded')
           .end(
               (error, response) => {
                   if (error) {
                       reject(error);
                   } else {
                       resolve(JSON.stringify(response.body, null, "\t"));
                   }
               }
           );
       });    
}

callSlackApi("search.messages", queryObject)
   .then(
       (obj) => {
           console.log(obj);
       }
   ).catch(
       (err) => {console.error(err); }
   );
```
【yum入門】パッケージ＆コマンドまとめ

# はじめに
LINUXに初めて触れたが、基礎部分が全然わからん。。。
ということで、LINUXの基礎的なところからよく使うコマンドをまとめておこうという備忘録。

# パッケージ管理ツール yum
###**概要**
「yum(ヤム)」とはLinuxのRedHat系ディストリビューション（CentOSなど）で利用されるパッケージ管理ツールのこと。
パッケージ管理ツールとは、OSへのソフトウェアの導入と削除、依存関係の整理などを行うツールを指す。
OSとパッケージの仲立ちをしてくれるのがyumというイメージだ。

yumコマンドを使用することで、パッケージをインストール/アンインストールを行うことができる。

###**パッケージって？**
LINUXが採用しているアプリケーションの配布形態。
正常に動作させるためには「ライブラリ」と呼ぶ別のプログラムを必要とすることがある。
こうした動作に必要な各種プログラムやファイルをまとめてパッケージングしているというわけだ。

また、パッケージは、LINUXディストリビューションごとに形式が異なる。

| ディストリビューション |パッケージ形式|
|:-----------|------------:|
|CentOS|rpm形式|
|Fedora|rpm形式|
|Ubuntu|deb形式|

# yumコマンド基本操作

- パッケージ操作関連

| command ||
|:-----------|------------:|
|yum install [パッケージ名]|指定したパッケージをインストールする|
|yum update [パッケージ名]|指定したパッケージをアップデートする|
|yum remove [パッケージ名]|指定したパッケージをアンインストールする|

- 情報表示関連

| command ||
|:-----------|------------:|
|yum list|インストール可能なパッケージを表示する|
|yum list installed|インストールされているパッケージを表示する|
|yum info [パッケージ名]|指定したパッケージの詳細を表示する|
|yum repolist|ソフトウェアリポジトリの構成を表示する|

# yumコマンドのオプション
yumコマンドはオプションの指定ができる。
yumコマンドの直後にオプションを記述する。

| option ||
|:-----------|------------:|
|-y|全ての問い合わせに「yes」で応答したものとして実行する|
|-c 設定ファイル|yumの設定ファイルを指定する|
|-R 時間|タイムアウトを設定する　単位は分|

- 例

```
yum -y install git
```

# 参考
[【 yum 】 パッケージを取得してインストール/アップデートをする](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/230999/)
[Linuxキーワードパッケージ](http://itpro.nikkeibp.co.jp/article/Keyword/20110427/359976/)
UITextViewにプレースホルダーを設定できるようにする(Swift4)

## はじめに

Obj-C時代から思っていましたが、UITextFieldにはデフォルトでプレースホルダーがあるのに、なぜUITextViewにはないのでしょうか…。
ということで、[こちらの記事](https://qiita.com/Takeshi_Akutsu/items/66a24060fa026b4f41d1)を参考にさせていただき、Swift4でUITextViewにプレースホルダーを実装します。

## プレースホルダーの実装

`@IBInspectable` を使うことにより、ストーリーボード上で `placeHolder` の値を指定できるようにしています。
型推論するとIBInspectableが効かないようなので、明示的に `String` を指定します。

`self.placeHolderLabel.textColor` の値が中途半端なのは、UITextFieldのデフォルト値がそのようになっているためです。

```swift:PlaceHolderTextView.swift
import UIKit

@IBDesignable class PlaceHolderTextView: UITextView {

    // MARK: Stored Instance Properties

    @IBInspectable private var placeHolder: String = "" {
        willSet {
            self.placeHolderLabel.text = newValue
            self.placeHolderLabel.sizeToFit()
        }
    }

    private lazy var placeHolderLabel: UILabel = {
        let label = UILabel(frame: CGRect(x: 6.0, y: 6.0, width: 0.0, height: 0.0))
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        label.font = self.font
        label.textColor = UIColor(red: 0.0, green: 0.0, blue: 0.0980392, alpha: 0.22)
        label.backgroundColor = .clear
        self.addSubview(label)
        return label
    }()

    // MARK: Initializers

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    // MARK: View Life-Cycle Methods

    override func awakeFromNib() {
        super.awakeFromNib()
        changeVisiblePlaceHolder()
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(textChanged),
            name: .UITextViewTextDidChange,
            object: nil
        )
    }

    // MARK: Other Private Methods

    private func changeVisiblePlaceHolder() {
        self.placeHolderLabel.alpha = (self.placeHolder.isEmpty || !self.text.isEmpty) ? 0.0 : 1.0
    }

    @objc private func textChanged(notification: NSNotification?) {
        changeVisiblePlaceHolder()
    }

}
```

Swiftのバージョンが新しい場合、 `.UITextViewTextDidChange` を `UITextView.textDidChangeNotification` に差し替えてください。
LOLIN ESP32 OLED ボードの MicroPython で NTP時刻表示

WEMOS社の LOLIN ESP32 OLED ボード上の MicroPython で NTP (Network Time Protocol) 接続して時刻をあわせ、OLEDに時計を表示してみました。


このボードの特徴は、

- ESP32と小さなOLED (Organic Light-Emitting Diode) ディスプレイがコンパクトに一体化されていて、配線なしでOLED表示ができます。
- US $8.9と安価です。
- 購入時の注意としては、リチウムバッテリー用のコネクタの有無でボードサイズが異なります。
リチウムバッテリー用のコネクタが無いボードは、FRISKケースに組み込めるようです。

![20171217_163607.jpg](https://qiita-image-store.s3.amazonaws.com/0/78212/98832c34-1356-b910-3136-1ff5a1704182.jpeg)

NTPで時刻を合わせてから、１秒毎に日時を更新中です。

---

![20171217_163757.jpg](https://qiita-image-store.s3.amazonaws.com/0/78212/0e6dd16d-7ade-421a-ca45-5f2359f05f5f.jpeg)

WEMOS社の LOLIN ESP32 OLED ボードの裏側 

---

# 時計プログラム (NTP時刻同期付き)
Wi-Fi経由でNTPサーバに接続して時刻を合わせ、OLEDに日時を表示する時計プログラムを作ってみました。掲載した１枚目の写真が実行時のOLED表示です。
MicroPython の time.localtime(), time.mktime() は、2000年1月1日 0時0分0秒 (UTC) 起点のようです。

```python:main.py 
# Watch with NTP synchronization
# MicroPython on Lolin ESP32 OLED 128x64 16x6(0..50)

ssid = "777"; password =  "7777777777"
ntp_host = "ntp.nict.jp"
# (datetime.date(2000, 1, 1) - datetime.date(1900, 1, 1)).days * 24 * 60 * 60
NTP_DELTA = 3155673600

import machine, time, ssd1306
import network, socket, struct

i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0)
#         '1234567890123456'
oled.text('Python NtpClient', 0, 0)
oled.text('SSD1306 128x64  ', 0, 10)

station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False: pass
oled.text(station.ifconfig()[0], 0, 20,1)
oled.show()

NTP_QUERY = bytearray(48)
NTP_QUERY[0] = 0x1b
addr = socket.getaddrinfo(ntp_host, 123)[0][-1]
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
res = s.sendto(NTP_QUERY, addr)
msg = s.recv(48)
s.close()
val = struct.unpack("!I", msg[40:44])[0]
ntpSec = val - NTP_DELTA  + (9*60*60)
deltaSec = ntpSec - time.time() 

def f2(i): return '{:0>2}'.format(i)    
nowString = dayString = ""
while True:
        nowSec = time.time() + deltaSec
        now = time.localtime(nowSec)
        
        oled.text(nowString,0,40,0)
        nowString = '%s:%s:%s' % (f2(now[3]),f2(now[4]),f2(now[5]))
        #print(nowString)
        oled.text(nowString,0,40)

        oled.text(dayString,0,50,0)
        dayString = '%s/%s/%s' % (str(now[0]),f2(now[1]),f2(now[2]))
        oled.text(dayString,0,50)

        oled.show()
        time.sleep(1)

```
# その他
シリアルコンソールからプログラムを削除するには、つぎの手順が利用できます。

```
import os
os.listdir()
os.remove('main.py')
os.listdir()

```

# 付録1 ピン配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78212/a4df1d49-1dc9-5eb9-cc63-a7b117946525.png)



# 参考情報

MicroPython on an ESP32 Board With Integrated SSD1306 OLED Display (WEMOS/Lolin)
https://www.instructables.com/id/MicroPython-on-an-ESP32-Board-With-Integrated-SSD1/

micropython on ESP32 でNTPサーバから時刻取得
http://ippei8jp.hatenablog.jp/entry/2017/08/18/135755

Lolin ESP32 OLED wemosにスケッチを書き込んでみた　　（フリスクケースに格納）
https://geeknavi.net/iot/lolin-esp32-test
[メモ]XAMPP PHP7からMySQLに接続するのにつまずいた点

Google Map API for Javascriptのチュートリアルをやっているときのメモ
https://developers.google.com/maps/documentation/javascript/mysql-to-maps#echoxml


環境：　XAMPP PHP7 mysqli

<br>


```php:test.php
$connection=mysql_connect('localhost', $username, $password);
if (!$connection) {
  die('Not connected : ' . mysql_error());
}
```

↓

```php:test.php
$connection= mysqli_connect('localhost', $username, $password);
if (!$connection) {
  die('Not connected : ' . mysql_error());
}
```


補足：　ネットにはXAMPP/PHP/php.ini の extension=php_mysql.dllをコメントアウトする
という情報があるが 2017/12月にインストールしたXAMPPはすでにコメントアウトされていた。

<br>


```php:test.php
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
  die ('Can\'t use db : ' . mysql_error());
}
```

↓

```php:test.php
$db_selected = mysqli_select_db($connection, $database);
if (!$db_selected) {
  die ('Can\'t use db : ' . mysql_error());
}
```

<br>


<br>

```php:test.php
$query = "SELECT * FROM markers WHERE 1";
$result = mysql_query($query);
if (!$result) {
  die('Invalid query: ' . mysql_error());
}
```

↓

```php:test.php
$result = mysqli_query($connection, "SELECT * FROM markers WHERE 1");
if (!$result) {
  die('Invalid query: ' . mysql_error());
}
```
<br>


<br>


```php:test.php
while ($row = @mysql_fetch_assoc($result)){
  // Add to XML document node
  echo '<marker ';
  echo 'name="' . parseToXML($row['name']) . '" ';
  echo 'address="' . parseToXML($row['address']) . '" ';
  echo 'lat="' . $row['lat'] . '" ';
  echo 'lng="' . $row['lng'] . '" ';
  echo 'type="' . $row['type'] . '" ';
  echo '/>';
}
```

↓

```php:test.php
while ($row = @mysqli_fetch_assoc($result)){
  // Add to XML document node
  echo '<marker ';
  echo 'name="' . parseToXML($row['name']) . '" ';
  echo 'address="' . parseToXML($row['address']) . '" ';
  echo 'lat="' . $row['lat'] . '" ';
  echo 'lng="' . $row['lng'] . '" ';
  echo 'type="' . $row['type'] . '" ';
  echo '/>';
}
```
OpenFOAMのcht計算で各領域ごとの残差を別々に確認する方法

#動機
各領域ごとに残差を確認したいと思ったため

#対象
・chtMultiRegionSimpleFoamやchtMultiRegionFoamなどの流体固体熱連成計算
・CentOS上のOpenFOAM-4.xでの使用を想定

#方法
###(1) logファイルが位置しているディレクトリに移動
``$ cd ◯◯``

###(2) 以下のスクリプトを実行し、logファイル内のデータを領域ごとに分割

``$ ./pre_resPlot``

```shell:pre_resPlot
for i in　(流体領域1) (流体領域2) ･･･
do
grep -A 11 $i  log >> res_$i
done

for i in　(固体領域1) (固体領域2) ･･･
do
grep -A 3 $i  log >> res_$i
done
```

###(3) gnuplotを起動し以下のファイルを読み込み

``$ gnuplot``

``$ load 'resPlot'``

```shell:resPlot
set terminal png
set output 'image_(流体領域1)'
set logscale y
set title "Residuals"
set ylabel 'Residual'
set xlabel 'Iteration'
plot "< cat res_(流体領域1) | grep 'Solving for Ux' | cut -d' ' -f9 | tr -d ','" title 'Ux' with lines,\
     "< cat res_(流体領域1) | grep 'Solving for Uy' | cut -d' ' -f9 | tr -d ','" title 'Uy' with lines,\
     "< cat res_(流体領域1) | grep 'Solving for Uz' | cut -d' ' -f9 | tr -d ','" title 'Uz' with lines,\
     "< cat res_(流体領域1) | grep 'Solving for epsilon' | cut -d' ' -f9 | tr -d ','" title 'epsiron' with lines,\
     "< cat res_(流体領域1) | grep 'Solving for k' | cut -d' ' -f9 | tr -d ','" title 'k' with lines,\
     "< cat res_(流体領域1) | grep 'Solving for p' | cut -d' ' -f9 | tr -d ','" title 'p' with lines
set terminal x11
set output

set terminal png
set output 'image_(固体領域1)'
set logscale y
set title "Residuals"
set ylabel 'Residual'
set xlabel 'Iteration'
plot "< cat res_(固体領域1) | grep 'Solving for h' | cut -d' ' -f9 | tr -d ','" title 'h' with lines
set terminal x11
set output
```
WioLTEで取得したデータをenebular経由でごにょごにょする

##概要
Wio LTEを入手したので、土壌湿度センサーから取得した値をもとに、観葉植物の様子をTwitterに通知してくれるような仕組みを作ってみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/220017/069b6151-80cf-8238-e018-78cc8a30a662.png)

##使用したモノやサービス
- Wio LTE JP Version（マイコンボード）
- SORACOM Air SIM
- GROVE 水分センサ
- enebular
- Milkcocoa
- Twitter

##システムの全体像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/220017/ae1ae1b2-8f4e-a5ce-8f64-281d09de1091.png)

enebularを使ってマイコンモジュールからやってくるデータと、SNSやデータストアサービス間の連携をさせています。

まずWio LTEで取得した土壌センサーの値をenebularに向けてhttp postします。次にenebularではhttp postをトリガーに、Milkcocoaへのデータ蓄積とTwitterへのツイートを行っています。

##Wio LTEについて
Seeed社が開発しているマイコンモジュールで、下記のような特徴があります。

1. Groveコネクタが搭載されているため、はんだ付け無しでGroveのセンサーやアクチュエーターを使用できる
2. LTEモジュールが搭載されているため、SIMカードを挿入すればインターネットに接続できる
3. Arduino IDEを使った開発ができる

ざっくりいうと、ハードの知識があまりなくても、インターネットにつながったプロトタイプが作れるといったウマウマなモジュールなのです。

####参考リンク
- Wio LTEについて https://soracom.jp/products/wio_lte/
- Groveシステムについて http://wiki.seeed.cc/Grove_System/

##enebularについて
enebularは株式会社ウフルのサービスで、Node-REDのフローをブラウザ上で編集し、さまざまな環境にデプロイして動かすことができるサービスです。
直感的にクラウドサイドの開発を進めることができるという、これもウマウマなサービスです。

####参考リンク
- enebularについて https://enebular.com/

##デバイス側（Wio LTE）の開発
Node-REDのアドベントカレンダーに投稿する用の記事なので、Arduinoのスケッチについては詳しく触れませんが、スケッチのサンプルが充実しているので特に迷うことなく実装できました。
スケッチのサンプルはWioLTEのGitHubのページから確認することができます。

今回は下記のスケッチのサンプルを見て、ライブラリの使い方やメソッドの使い方の参考にしました。

- grove/grove-rotary-angle-sensor
>analog入力値を取得するAPIの使い方が確認できます。土壌湿度センサーの値を取得するための参考にしました。

- http/ifttt-webhook（http
>http通信するためのライブラリの使い方が確認できます。enebularに取得データをhttp postするための参考にしました。

####参考リンク
- WioLTE(GitHub)：https://github.com/SeeedJP/WioLTEforArduino/wiki/Home-ja

##クラウド側（enebular）の開発
![image.png](https://qiita-image-store.s3.amazonaws.com/0/220017/3d06c66c-5288-bbb9-c6da-abb945e4bd1b.png)

httpノードでWioLTEからのhttp postを受け取り、これをトリガーにしてフローが動き始めます。Milkcocoaノードで、受け取った土壌湿度データをMilkcocoaに保存しています。続いてswitchノードで土壌湿度の値に応じて分岐させ、functionノードで土壌湿度に応じたtwitter用のメッセージを編集しています。最後にTwitterノードを使用し編集したメッセージを呟きます。


## 結果
Wio LTEから30分に一回、データを送信させたところ、定期的にフローが動いてTwitterに連携することができました！またMilkcocoaにもデータを溜めることができました！

###Twitterのタイムライン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/220017/a9fa7deb-fc55-3504-942d-6fd2e4681191.png)

###Milkcocoaのデータストア
![image.png](https://qiita-image-store.s3.amazonaws.com/0/220017/4c07e15b-f96b-183d-5305-bd0721bf68dc.png)

##はまったポイント
### Wio LTEからhttp postする先はどこ？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/220017/9d7d0d9d-f373-871b-7be3-4793219b7ed3.png)

WioLTEからどのURLにhttp postすればいいかをちょっと悩みました。

httpノードを含んだフローをデプロイするとherokuのURLがiマークから参照できるようになります。
今回はhttpノードのプロパティに`/test`を設定しているので、Wio LTEからは`URL+/test`にhttp postすればいいわけです。

###http postで受け取った値はどこに格納される？

httpノードにdebugノードを引っ付けてデバッグすると、http postに関する色々な値が表示されます。自分がbodyに格納したはずのオブジェクトがどこにあるかわかりませんでした。

実はhttpノードのinfoをみるとちゃんと書いてあり、`msg.req.body`オブジェクトにbodyの値が格納されることが分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/220017/8eff0482-351e-a991-a762-74f9d52cfbe1.png)

##まとめ

- Wio LTEとenebularを組み合わせればサクッとIoTプロトタイピングができる。
- Wio LTEのサンプルスケッチを見ればたいていのことはわかる。
- ノードの使い方が分からないときはinfoタブの情報を読むようにしよう。
- これで水やりを忘れることはない。
create-react-appで作ったプロジェクトをVSCodeでデバッグする

# 概要、目標

`create-react-app`で作ったアプリをローカル環境で動かすときにいろいろ調べた内容の備忘録です。
大まかにやりたかったことは２つ。

* VSCode上からReactアプリをデバッグしたい。
* `npm start`もVSCodeから実行したい。簡単に。

# VSCode上からReactアプリをデバッグする
まず、`Debugger for Chrome`をMarketplacesで探してインストールします。
![Debugger　for Chrome](https://qiita-image-store.s3.amazonaws.com/0/215631/92d8a553-e21c-de21-f124-06553e65d08b.png)

`F5`キーを押して表示されるリストの中から、`Chrome`を選択します。
![Debugger fo Chrome](https://qiita-image-store.s3.amazonaws.com/0/215631/07a852ce-96fb-599e-c747-ce6eae0de376.png)

VSCodeが開いているディレクトリの下に、`.vscode`ディレクトリが作成され、さらにその中に`launch.json`ファイルが作成されます。このファイルの内容を以下のように書き換えます。

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Chrome",
            "type": "chrome",
            "request": "launch",
            "url": "http://localhost:3000",
            "webRoot": "${workspaceRoot}/src",
            "sourceMapPathOverrides": {
                "webpack:///src/*": "${webRoot}/*"
            }
        }
    ]
}
```

これでVSCode上のデバッグ準備は完了です。`F5`キーを押すとChromeが起動してデバッグが始まります・・・が、こんな画面になるはずです。
まだ`npm-start`でサーバーを起動していないからですね。
![Debugger fo Chrome](https://qiita-image-store.s3.amazonaws.com/0/215631/e19fae10-750c-81a1-2cdf-5ab1515490fc.png)

# `npm start`をVS Codeから実行する。
デバッグの実行時、まだ`npm start`がされていなければ自動で起動してくれるのが理想だったんですが、どうにもやり方がわかりません。
そんなに頻繁に実行するものでもないし、無難にターミナルを立ち上げて`npm start`でいい気がしてきました。

ターミナルを起動するには、メニューの[表示] > [統合ターミナル]か、`Control + Shift + @`で開けます。
(Macの人も`Command`ではなく`Control`なので注意)

これで`npm start`してからデバッグを開始すれば、VSCode上で設定したブレークポイントに止まるようになります。

![スクリーンショット 2017-12-17 16.30.52.png](https://qiita-image-store.s3.amazonaws.com/0/215631/833fa91e-b1cd-1401-757d-c98002bd15ad.png)
新人向け押さえてほしい概念リスト

# Who Are You
一応、立場表明として記載しておきます。
私は旧職業能力開発総合大学校 (ここで敢えて「旧」とするのは、小平"分校"の方でなく、相模原の方だったからです) の長期課程・電子情報システム工学科の卒業生です。
新卒でとあるちびっちゃい……なんと言えばいいのでしょう。一応請負もやるけど、殆どは派遣で稼ぐような会社 (サバ読みまくって30人規模) に入り、諸々故あって転職、"文化的な生活"というものが送れるようになった、一人の職業プログラマであります。

これといって特筆するような技能も実績もありませんが、テスト用とはいえ100台規模のネットワークを組んだり、かと思えばWebをやり、C++やVBAを読み、Android/iOSからWin10への移植に携わり、C#の (どうしようもなく悲惨な出来の) コードをいじり……と、あれやこれやと携わった「なんでも屋」です。
(一応これでも社会人4年目とかそんな程度なんですがね……)
強いて言うなら、人生の9割弱をコンピュータとともに過ごしてきたのが自慢でしょうか。

さて、この私から見た「ここを教えるべきではないか」「新人はこういうことを押さえるべきだろう」というものを、いくつか並べておきます。

なお、**本文章は、これまで現場に出て見かけた (ときには尻拭いをさせられた) 「ひどい連中」を基準としています。そのため、「いやそれは……」な内容が含まれる可能性が大いにありますし、逆に「いや、本当にひどい奴らはこれ以前にこんなんもできんのだ！」というものが存在する可能性も大いにあります。あくまで参考程度にご覧ください**。

# プログラムは「文章」である
「プログラミング言語」というのは伊達でも真田でもありません。文章を書くから「言語」なのだ、と言っても良いでしょう。
別段面白い話でもありませんが、**数学は大の得意という人間でも、プログラムは碌に書けない / 悲惨な出来上がりになる、ということは珍しくありません**。

* **文章を読み書きすることに慣れておいてください**。数学はほっといてもどうにかなります。
  * 少し前は「ミーティングこそプログラマの仕事」みたいな話もありましたが、ミーティングさえも「それ大抵はチャットでええやん」みたいな流れになっている昨今、プログラマの仕事は**一日中文章を読み書きする**ことです。
  * 数学はどうにかなるといいましたが、例外として「集合演算」と「論理演算」だけは知らないとどっかでコケます。「ANDとかORとかのアレ」レベルでいいので、多少は知っておきましょう。
* **調べることに慣れてください**。特に英単語は自信がなければ即調べましょう。
  * 辞書を買う必要はありません。スラングや略語は珍しくないので、大抵ググったほうがいいです。
  * 英語を話せるようになる必要はありません (日本の場合、ごく限定的な職場を除く) 。
* **読み書き中の違和感を大事にしましょう**。慣れてくると、変な文章に当たった時「なんか変だな？」と違和感を覚えるようになるものです。
  * 散々言われているのに、未だに regist とか isStart とかやらかす馬鹿がいます。**これらに違和感を覚えるようになれば、それだけでも「マシ」な証拠です**。
* **とにかくまず読みましょう**。答えは、大抵何処かに書いてあるものです。**特にエラーが出たときは、まずエラーをしっかり読みましょう**。
* **さらっと読めるように書きましょう**。重要なことは、**貴方の書いたものは誰かが読む**ということです。**読んだ時違和感があれば、その分読むのに時間がかかります**。

# プログラムは「小さな作業の塊」である
以下は高齢・障害者求職支援機構の公開している資料です。
https://www.jeed.or.jp/disability/supporter/intellectual/om5ru8000000c5rn-att/om5ru8000000c659.pdf
これは作業分解票と呼ばれるもので、見ての通り「作業をバラし、小さな動作の積み重ねに還元する」ために存在します。**漠然と全体を見るよりも、細かく裁断して並べたほうが問題がよく見えるものです**。

* **コンピュータはアホです**。人間のようなファジーさは最近ようやく進歩してきた程度です。まずは**アホでも理解できるレベルまで物事をバラす**ところから始まります。
* 困ったことに**人間も人間でアホです**。ときに意味不明なミスをします。このため、バラすことで理解しやすくするのは**人間にも有益です**。
* **まずはとにかく小さくしていきましょう**。行き過ぎは問題ですが、大抵は行き過ぎよりもやらなさすぎて死んでいます。**小さくほぐして初めて見えるものは腐るほどあるのです**。
* **抽象化しましょう。具体的なものの代わりに、カテゴリや特性を埋め込めませんか**。例えば上記の例は「ピーマン編」ですが、ピーマンでなくてもある程度適用できる気がしませんか？「野菜」としてしまえば、**別のものにも適用できるかもしれません**。
* **「誰がやることなのか」意識しましょう**。作業を分解した結果、**それぞれの作業を別々に割り振ったほうがよくなることは珍しくありません**。

# プログラムは「契約」を果たす
何もかもを分解していくと、最終的にどこかへ行き着きます。しかし、その全てをバラバラに扱っていてはいくらなんでも死んでしまいます。
大抵はばらばらに分解した「作業」たちを何らかの形で「ひとまとめの作業」にして扱います。この時重要なのが**「契約」の概念です**。

**「作業」に問題がなかったことを保証するためには、「検査」が必要です。**
「検査」を行うためには何が必要でしょうか？**「前提」と「結果」です**。「結果」が「前提」から導き出される想定通りなら正常、そうでなければ異常です。

**「前提」が保証される限り、「結果」を保証しましょう。おかしな結果を返すぐらいならエラーを吐いて止めましょう。これが「契約」です**。
これをかっこよくいうと「事前条件」と「事後条件」、そして「例外」になります。
重要なのは、**この「契約」が守られている限り、「契約」を満たすためにどういう処理をしているかは気にしなくて良い** (はず) ということです。だって、**「契約」の通りに動くんだから**。

これが保証されると、**一度作ったものを再利用できる可能性が生まれます**し、**他の部分の「検査」もしやすくなります**。だって、**その部分は「契約」の通りに動く**んですから。

# 番外: 辛くなったら逃げよう
例えば片道3時間通勤になったとか。
例えば給与8万減らすと言われたとか。
例えば残業代がごまかされてたとか。
そういうことがあったら、さっさと逃げて転職しましょう。耐えるのは貴方だけでなく、社会全体への不利益です。
(なお、恐ろしいことに上記の3つは全て私が新卒で入った会社で経験したことです。フィクションだったら良かったんですが……)
**逃げることは悪ではありません。対策の一つです。**
**対策を取らないことは、不適切な対策を取ることよりも邪悪です。**
AWSのEC2で音楽ストリーミングサーバーを動かし，常駐化するお話

 今回はストリーミングサーバーの勉強がしたく，また，ちょうどAWSが無料利用枠期間内だったので，勉強の第一段階としてオープンソースであるCherryMusicをEC2上で常駐化させてみようという試みをしたい．これはあくまでメモ程度として見てもらえるとありがたい．

#実行環境
* Ubuntu Server 16.04 LTS　（AWS EC2, Instance types:t2.micro）
* python 3.6.3

#CherryMusicとは
[CherryPy](http://cherrypy.org/)と[jPlayer](http://jplayer.org/)をベースとした音楽ストリーミングサーバー．
複数のユーザーがWebブラウザを使用してHTTP / HTTPS経由でログインしたり、音楽データベースをブラウズしたり、検索したり、プレイリストを管理する事ができる．

#CherryMusicを動かすまで
## 前準備
### EC2 Management
セキュリティグループで指定するポートへの接続を受け入れるようにしておく必要がある．
使うインスタンスのセキュリティグループのインバウンドルールにルールを追加しておく事．
なお，自分の設定ではポート8080を用いるため，以下のような設定にしている．

![inbound rules.png](https://qiita-image-store.s3.amazonaws.com/0/153113/733da50b-f96a-3420-139f-a05158288fbe.png)

また，後々使うのでグローバルIPを確認しておく事．

### 仮想サーバー内での前準備
CherryMusicはpython2系では2.6以上，3系では3.2以上で動く．
要件を満たさないpythonを用いている場合は各自で用意してほしい．
Pyenv等でバージョン管理をしておくと楽．

## セットアップ
### CherryMusicと依存関係パッケージの用意
各自，任意のディレクトリで以下のコマンドを実行．
CherryMusicをダウンロードできる．

```bash
git clone -b master https://github.com/devsnd/cherrymusic.git
```

次に依存関係パッケージをインストールする．コーデック周りがほとんど．
以下のコマンドでインストール．

```bash
sudo apt install lame vorbis-tools flac faad mpg123 opus-tools ffmpeg imagemagick
```

### サーバーの設定
最後にサーバーの細かい設定を行う．
ありがたいことにブラウザで初期設定を行うページが用意されている．cherrymusicがダウンロードされたディレクトリで以下のコマンドを実行．

```bash
python cherrymusic --setup --port 8080
```
控えておいたグローバルIPを使って，ポート8080へブラウザでアクセス．
以下のようなページが表示される．
基本的にはmedia base directoryを音楽ファイルを入れているディレクトリにしておいて，あとはデフォルトの設定でok．
なお，system capabilitiesの部分は先ほど入れた依存パッケージが入っているかが表示されている．
failedの表示があった場合は入れ忘れているか，失敗している可能性があるので再インストールを試みてほしい．

![setup1.png](https://qiita-image-store.s3.amazonaws.com/0/153113/4a185503-a578-fc67-266f-bd384e129ab4.png)

![setup2.png](https://qiita-image-store.s3.amazonaws.com/0/153113/87b19350-bf1b-e6bb-2c60-f5de43d749c1.png)

ひとまず，セットアップはこれで終了．
以後はcherrymusicを入れたディレクトリで以下のコマンドを実行する．
上記で設定した内容に基づいて，サーバーが立ち上がる．

```bash
python cherrymusic
```

# サーバーの常駐化
CherryMusicを手動でフォアグラウンド・バックグラウンド実行かを管理するのはめんどくさい．
また，アプリが落ちてしまった時はリスタートするようにしておきたい．
そのため，supervisorを使って管理を自動化した．

## supervisorとは
[supervisor](http://supervisord.org/)とは軽量なプロセスの管理，監視ツール．

## supervisorのインストール

```bash
sudo apt install supervisor
```
もしくは,


```bash
pip install supervisor
```

## 設定
インストールしたらWebアプリの起動情報を書き込む．
**/etc/supervisor/conf.d/**へconfファイルを作成する．
筆者は以下のように設定した．
commandの部分は各自のPCの設定に基づいて書き換えてほしい．

```conf
[program:cherrymusicServer]
; directory=/home/ubuntu/files/music
command=/home/ubuntu/.pyenv/shims/python /home/ubuntu/server/cherrymusic/cherrymusic
numprocs=1
autostart=true
autorestart=true
user=ubuntu
redirect_stderr=true
stdout_logfile=/var/log/supervisor/cherrymusic.log
```
## サーバー起動
supervisorから以下のコマンドでcherrymusicを起動する．

```bash
sudo supervisorctl start cherrymusicServer
```

なお，プロセス名は設定ファイルの[program:OOOO]のOOOOの部分で変わるので適宜変えてほしい．

あとは前と同じようにグローバルIPの指定ポートへブラウザにアクセスすれば，幸せになれる．
ちょっと使って見たが，CherryMusic自体にバグがありそう．
今後は少しCherryMusicのバグ潰しをしたり，内部構造がどうなってるかを見ていきたいと思う．
（追記：就活つれぇ．）
[macOS][iOS]EventKitを試す（イベントの追加と削除）

<p>前回の続きで、イベントの追加と削除を試す。</p>

<p>イベントを追加する。</p>

<pre><code>let event = EKEvent(eventStore: store)
event.title = "BUKURO.swift 2017-12"
event.startDate = Calendar.current.date(from: DateComponents(year: 2017, month: 12, day: 6, hour: 19, minute: 30, second: 00))
event.endDate = Calendar.current.date(from: DateComponents(year: 2017, month: 12, day: 6, hour: 22, minute: 00, second: 00))
event.calendar = store.defaultCalendarForNewEvents
do {
    try store.save(event, span: .thisEvent)
}
catch let error {
    print(error)
}
</code></pre>

<p>イベントを削除する。</p>

<pre><code>do {
    try store.remove(event, span: .thisEvent)
}
catch let error {
    print(error)
}
</code></pre>

<p>動作確認が原因で関係者に通知が飛んでしまった。申し訳ない。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/GettingThingsDone">https://github.com/murakami/workbook/tree/master/ios/GettingThingsDone</a> - GitHub<br />

関連情報
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
Scalaでテストのときだけタイムスタンプを固定値にする

ちきさんです。

最近Scalaのコードをがっつり触ることがあり、テストのときはタイムスタンプを固定値にしたいなと思い、よくわからないので色々調べたらわかったのでメモを残します。

## やりたいこと

JavaScriptでこんな風に関数を書き換えられるけど同じようなことをやりたい。

```js
Date.now = () => 1;

Date.now() === 1; // => true
```

## Joda-Timeとかいうのを使うらしい

http://www.joda.org/joda-time/ をScalaで使えるようにしたものが https://github.com/nscala-time/nscala-time なのでこれのREADMEを参考にして依存関係を設定します。

そしてファイルのimport文で下記のように書くと使えるようになります。

```scala
import org.joda.time.{DateTime, DateTimeUtils}
```

## Joda-TimeのDateTimeは簡単にモックできる

このように書くだけでした。

```scala
DateTimeUtils.setCurrentMillisFixed(12345)
```

注意点としては、あくまでJoda-TimeのDateTimeがモックの範囲内なので`System.currentTimeMillis()`などはモックされないということです。以下にまとめました。

- モックされるもの
    - `DateTime.now().getMillis()`, `DateTimeUtils.currentTimeMillis()`等
- モックされないもの
    - `System.currentTimeMillis()`

## テストコードの例

実際にテストコードを書くとこんな感じになります。タイムスタンプを扱うときはJoda-Timeを使っておけば安心できそうですね。

```scala:DateTimeMockSpec.scala
import org.joda.time.{DateTime, DateTimeUtils}
import org.scalatest.{BeforeAndAfter, FunSpec}

class DateTimeMockSpec extends FunSpec with BeforeAndAfter {
  val fixedMillis: Long = System.currentTimeMillis()

  before {
    // beforeの中でモックすることで各テストに反映される。
    DateTimeUtils.setCurrentMillisFixed(fixedMillis)
  }

  after {
    // afterの中で元に戻さないと次のテストにも反映されてしまう。
    DateTimeUtils.setCurrentMillisSystem()
  }

  describe("DateTimeMock") {
    it("DateTime.now().getMillis()はモックされる") {
      assert(DateTime.now().getMillis() == fixedMillis)
    }

    it("DateTimeUtils.currentTimeMillis()はモックされる") {
      assert(DateTimeUtils.currentTimeMillis() == fixedMillis)
    }

    it("System.currentTimeMillis()はモックされない") {
      assert(System.currentTimeMillis() != fixedMillis)
    }
  }
}
```

## まとめ

普段からJoda-Timeを使って現在時刻を表すようにしよう。

---

## 補足

`before`と`after`は一つのClassにつき一回しか呼び出すことができず、**どこに書いても(ネストされた`describe`の中に書いたとしても)** そのClass内の全てのテスト(`it`)の前後で実行されます。

JavaScript脳には？？という感じですがそういうものらしいです。
HerokuのデプロイしたRailsアプリにPumaを導入してみる

# Pumaとは
スレッドベースで動作することにより並列処理を行ってくれるWebサーバです。

# Pumaのインストール
```Gemfile:Gemfile
gem 'puma'
```

# Procfile
```Procfile:Procfile
web: bundle exec puma -C config/puma.rb
```

# pumaの設定

```ruby:config/puma.rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end
```

# Worker数

dynoの一つにつきworkerを増やせるかはメモリ使用量によるが**free**, **hobby**,**standard-1x**のプランだと2-4が目安とのこと。
可能なメモリの上限を超えた時に生じるR14 errorsを監視して設定することをオススメします。

# Threads数

thread数の上限と下限を設定できるが、heroku的には同じ値を設定するのがお勧めとのこと。

# 参考サイト

[Deploying Rails Applications with the Puma Web Server](https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server)
2017年最後に最近のJavaScript入門方法について考えてみる

最近、アナリストだった友人がJavaScriptエンジニアになることが決まり、最近のJavaScript入門について考えてみたのでまとめます。
個人の所感なので、もっと良い方法があるよ！！って人は心のなかにしまっておいてください。

## 想定してるレベル
これくらいの人が入門することを想定してます。

- プログラミング初心者
- JavaScriptについてもよく知らない（EcmaScriptとかしらない）
- HTML/CSSはなんかちょっとわかる
- ES2015〜のモダンなJavaScriptについても学習したい

## オンライン教材編
### [ドットインストール](https://dotinstall.com)
プログラミング入門といえばこれ、って感じですね。もちろんJavaScriptに関するコンテンツも充実しています。
がしかし、JavaScriptのコンテンツは全てES5で書かれているようです。コンテンツが充実しているだけにとてももったいない…
JavaScriptの基礎を学ぶには良い教材ですが、モダンな書き方を学ぶことはできないようです。

### [Progate](http://prog-8.com)
これも最近有名なプログラミング学習サイトです。JavaScriptだけでなくPHP、Ruby、Pythonなども学習できるようです。
Progateの大きな特徴は、自分でコードを書くことができる点ですね。ドットインストールは動画を見るだけですが、ProgateではWeb上でコードを書き課題をクリアしていくという内容になっています。
入門する人は自分でコードを書くハードル高いと思うのでとても良いコンテンツだと思います。

がしかし、こちらも教材全てES5で書かれているようです。やはり基礎を学ぶには良いですがモダンな書き方を学ぶことはできないですね。

### [N予備校 プログラミングコース](https://www.nnn.ed.nico/pages/programming/)
最近話題のN予備校 プログラミングコースですが、受講している人の声を聞く限り、とても良いらしいです。
プログラミング入門 WebアプリコースはフロントエンドもバックエンドもJavaScriptで書くらしいので、JavaScriptを学びたい人にとってはとても良い感じっぽい。
僕は受講していないのでわからないですが、教材も毎日アップデートしているらしく、教材が古くなってしまうということもなさそう。
月額1000円だし、これを選択するのが無難？（受講したことある人、感想教えてください）

### [Codecademy](https://www.codecademy.com)
Codecademyは英語版のProgateに近い、オンライン学習コンテンツです。全コンテンツ英語で書かれていますが、JavaScriptのコンテンツは充実しているようです。
JavaScriptのコンテンツはES2015〜で書かれていました。
月額$19.90と他のコンテンツより金額お高めです。

## 書籍編
書籍は非常にたくさんあるので、ここでは僕が読んで良かったと感じた本を紹介します。（最後の一冊は読んでないのですが、良さそうなので紹介しておきます。）
もっと良い本あるよ！って方は教えてください。

### [初めてのJavaScript 第3版 ――ES2015以降の最新ウェブ開発](https://www.oreilly.co.jp/books/9784873117836/)
オライリーのJavaScript入門本。そこまで深い内容が書いてあるわけではないが、ES2015〜の書き方とか機能とかを学習するにはとても良い感じでした。
しかし、この本はES5のJavaScriptの知識がないとつらい部分もあってので、JavaScriptのことを一通り勉強した後に読むのが良いかな、と思います。

> ECMAScript 2015（ES2015）の入門書。シンプルな例題を多用しブラウザやnodeコマンドで試しながら新しいJavaScriptを楽しく学びます。従来バージョンを使用中のJavaScriptプログラマーにも、これからJavaScriptを習得したい入門者にも有用な情報が満載です。本書を読めば、letやconstによる宣言とスコープ、関数の基本と高度な使い方、オブジェクトとオブジェクト指向プログラミング、イテレータやジェネレータやプロキシといったES2015の新機能、非同期プログラミング、クライアントサイドのDOMやjQuery、サーバーサイドのNode.jsなど、JavaScriptの最新バージョンを使った開発に関する総括的な知識をバランスよく得られます。日本語版では、ES2016およびES2017の新機能の紹介も加えました。

### [改訂新版JavaScript本格入門 ～モダンスタイルによる基礎から現場での応用まで](http://gihyo.jp/book/2016/978-4-7741-8411-1)
JavaScriptの入門本と言えばこれ！って感じの本ですね。少しとっつきにくい感じはありますが、基礎の基礎から実際の開発に役立つ知識まで体系的にまとめられていて、僕はこの本にとても助けられました。
昨年9月にES2015〜の内容を追加した改訂版を出しているので、この本を買えばJavaScriptの基礎からモダンな機能まで一気におさえることができます。

### [徹底マスター JavaScriptの教科書](http://www.sbcr.jp/products/4797388640.html)
本屋で立ち読みしてみた感じだと、とても良さげ。内容も充実しているし、個人的には正規表現の項目があったのがポイント高いです。（正規表現はなかなか覚えられなくて苦労しています…）

## まとめ
どの教材もとても素晴らしいのですが、ES2015〜に対応しているオンラインコンテンツが少ないな…と思いました。
仕事で使うからJavaScript勉強したけど、学習したのと全然違う書き方してて意味不明…ってことになりそうな予感がしますね。とても不幸。
かといって入門する人にEcmaScriptの仕様を確認しろとか言えないし、難しいですね。

また、個人的には内容の薄い入門本を買うくらいなら、少し厚いけど内容が充実した本を買って、一番最初の導入は動画とかのオンラインコンテンツに任せるのが良いんじゃないかなと思います。

今のところ一番良いのは、オンライン教材でJavaScriptの基礎を抑えつつ、オライリーの書籍などでES2015〜の書き方を勉強する感じでしょうか？

オンライン教材がES2015〜に対応してくれると嬉しいなと思うばかりです。

## おまけ：「どんな人が成長早い？」
これ友人に聞かれたんですけど、やっぱり「手を動かしてコードを書いてる人」かなーって返しました。

どんなことにも言えると思いますが、自分の手を動かさないと上達しませんよね。
特にJavaScript界隈は動きが激しいので、新しい技術を自分で試せる人とか自分で何か作ってる人は強いなーと思います。
僕も来年はちゃんとコード書いていきたいです。
Elmの型システムを少しだけ覗いてみる

# 要約

大体HM型システム。

# 導入

[Elm Advent Calender その1](https://qiita.com/advent-calendar/2017/elm) 18日目です。前日は@ebiryu さんの[[Elm] elm-touch-events使ってみた](https://qiita.com/ebiryu/items/235a621006448d1e2dc0)
でした。Elmでタッチイベント、熱い。

Elmに関しては初心者でちょっとしたアプリケーションを作ったくらいなのだが、Elm Advent Calenderを書けという[関係各所(一人)](https://qiita.com/ababup1192)からの圧力がかかってので初心者ながらElmの型システムに関してわあkったことについて書いてみる。最後の方Effect Managerの話ししてるけども。

ざっと[elm-compiler](https://github.com/elm-lang/elm-compiler)のコードをわかんねぇわかんねぇ言いながら読んだだけなのでお手柔らかに。

# 基本の型

他の言語に比べてわりかしプリミティブ型は少ない。

ここらはさくっとくぐり抜けていこう。

## 数値型

`Int`と`Float`がある。

```elm
1 : Int      -- 型注釈は`:`
2.5 : Float
```

`number`は数値型をすべてを引き受ける型として扱える。

## 文字と文字列

`Char`と`String`があるよ！

```elm
'a' : Char
"elm" : String
```

余談だが、Haskellと同様シングルクォートで`Char`、ダブルクォートで`String`だ。

## 論理型

当然`Bool`もあります。

```elm
True : Bool
False : Bool
```

## List

```elm
[1, 2, 3, 4] : List (Int)
```

## Tuple

```elm
(1, 'a') : (Int, Char)
```

## Record

```elm
myRecord = { style = "Blue"
           , number = 1
           , isCool = True
           }
```

## Union

直和型とは本質的に違うので注意。

```elm
type Answer = Yes | No
type Answer' a = Yes | No | Other a  -- このように型変数を使うことも可能
```

## 直積型

```elm
type Position = Position Int Int
```

## Unit

型界のNull(?)、Unit型`()`もある。

## 関数型

引数の型 `->` 返り値の型で関数の型を表す

```elm
add : Int -> Int
add x y = x + y
```

ちなみに`(->)`は左結合の型演算子だよ。

# 多相と型推論

パラメータ多相[^1]は存在するので、型変数を用いた関数を書くことができる。

[^1]: 早い話がlet多相

```elm
add : a -> a
add x y = x + y
```

とは言え残念ながら、高階多相は無い、アドホック多相もない。[^2]

[^2]: 部分型多相はUnion型とか構造的部分型使えばできそうなんだけどなんかうまくいかなかったので誰か頼む。

なので、アドホックな多相を行いたければそういった感じの関数をJSで書くしか無い。[^3]

[^3]: 一生懸命自分で型クラスを実装するという手もある。[彼のように](https://qiita.com/aiya000/items/79e4bf6e1f0ba83c7d9c)

アドホックな関数を実装するために、`number`,`appendable`, `compable`といった型クラスもどきがプリミティブに存在している。

型推論はHindle-Milner型推論を使っているので、型を省略しても大体なんとかしてくれる。


# Effects型

Elmの目玉とも言えるEffectsまわりだが、とりあえず純粋でない計算を行いたいのであればEffects型を返しておけというゆるふわ感がある。このゆるふわな感じのお陰でHaskellほど型パズルに苦しむ必要がない。

Effects型自体は`Port`と`Manager`に大別されるようだ。

`Port`の場合はそのままElmのJavaScriptのコードジェネレータに渡され、プログラムに組み込まれる。

`Manager`は`Cmd`, `Sub`, `Fx`[^4](`Cmdと`Sub`を合わせたもの), `Task`,`Router`を基本的な型としており、型推論や型検査は対応するEffect Managerのパッケージ名とEffects自体が持ってる値を型として扱うことで実現している。

[^4]: elm-compilerのコード内のみでの呼称

型検査後はEffect ManagerをJavaScriptに変換した後、それを参照できるような形で組み込んで他のコードをJavaScriptに変換しているようだ。

# まとめ

見た感じ型システムはHaskellをもっと簡単にしたようなものなので、特につまずくことはないなと感じる。

厄介なのはEffect Managerあたりで、とりあえずは別々にJSに変換してるだけのようだが……

Effect Managerを作ってみて生成されたJSのコードを見てさらに深く探っていきたい。[^5]

[^5]: そんなことしてないでなんか作れ

明日は@4245Ryomt さんの[streamライブラリについて]()

楽しみだ。
Xamarin初心者がXamarin.Forms勉強会を開いてみた

Xamarin.Forms社内勉強会を企画することになりました。
私の略歴としては、仕事でWindowsForm、WebForm、.Net MVCとかその辺りを触ってきたC#エンジニアです。
事前準備から勉強会本番までの流れとかを書いていきます。

# 事前準備

## ターゲット層を考える
社内勉強会をするにあたって、メインのターゲット層を考えました。

- (どの言語でも)プログラミング経験がある
- C#に触ったことがない
- Xamarin(というよりスマホアプリ開発)に興味がある

だいたいこれぐらいのレベルを対象にしようと。
C#エンジニアが数えるぐらいしかおらず「社内でC#を触れる人が増えたらなあ…」というのがきっかけの一つなので、話題性のあるXamarinから引き込めたらいいのではと。
というか、企画した時点ではXamarinの存在は知っていても私自身触れたことがなかったのでどうなるかどきどきでした。
ここから一月でサンプルプロジェクトからスライドまで作成していきました。

## Xamarinに初めて触れる
Xamarinには大きく分けて2つの存在があるそうです。

- Xamarinネイティブ
- Xamarin.Forms

両方触ってみた感想は以下。

### Xamarinネイティブ
- ざっくりとの感想でいえば、裏側だけC#、表側はAndroidとiOSそのまま
- iOSやAndroid開発をしたことある人ならばこちらのほうがとっつきやすいかも？
- しかしiOS開発もAndroid開発もしたことがない…

### Xamarin.Forms
- 裏側はC#、表側はXMLな感じ？
- なんとなくWebFormsやWindowsFormsを思い出す
- XamarinもiOSもAndroidも触ったことがない人としては覚えることがXamarinネイティブより少なそう
- 覚えることが(比較的)少ないのは参加者も僕も嬉しい

ということでXmarin.Formsを勉強会のテーマとして使おうと決めました。

## 勉強会の構成
いくつかアイデアを出し合った結果、2日構成にしようと決めました。
理由は2つ。

- 1日で納得できるレベルまで触れるのか？
- 軽いハッカソンみたいなの、やってみたい

主に2つ目が理由です。企画者だからやってみたいことをやろうと。
ざっくりと決めた構成の流れは以下。

### 1日目
- C#とは
- Linqとは
- VisualStudioとは
- nugetとは
- Xamarinとは
- XamarinネイティブとXamarin.Formsの違いとは
- Xamarin.Formsプロジェクトの作成の仕方
- Xamarin.Formsでアプリ作成
- 成果物発表

C#開発で誰でも触るところを重点的に話し、一人で簡単なアプリの作成を行う計画。

### 2日目
- 1日目で得た経験から、複数人で開発を行う

1日目で作ったものを元手になんかかっちょいい・使えるラインまで作りこんでしまおう、というものです。

結局仕事でこの手のものを扱うには複数人開発になります。
なので、仕事になったときにどういう流れになるのかというのを経験したい・させたいというのがありました。
あとわいわい開発するの面白そうだったからというのもあります。

1日目終了時点のサンプルプロジェクトを用意し、それを元に仕様を満たすもの考えて作ろう！って感じに落ち着きました。

# 勉強会
勉強会で使ったスライドを投稿しました
https://qiita.com/tomopy03/items/18451523e6b8c2f86fbd

参加者がそこまで多いわけではなかったので、Slackで情報交換しながら進行しました。

## 所感
- デモが動かなくて辛かった

PropertyChanged.Fodyがちゃんと動かなくてデモで時間をとられました。
nugetでインストール後にFodyをアップデートしないとちゃんと動きませんでした。
投稿したスライドにはアップデートすることと書いてありますが、本番ではこのことを失念しており、原因特定まで時間がかかりました…。
今回はXamarin.Formsのプロジェクト作成、nugetでFodyをインストール、xamlにlabelの追加、モデルの追加、バインディング、デバッグ実行…とこんな風に作っていくんだよという例を見せながら進めていたので、バインディングがうまく効いてないのは「デモにならないじゃん！」ととにかく焦りました。
不意な出来事に対応できるように動画でも撮っておけばよかったなと思いました。

- アプリ作成は適正な難易度・時間を確保できていたのか

アプリ作成の課題としてタイマーを指定したのですが、参加者がタイマーを動かすところまでなかなか到達できませんでした。
「すぐに全部実装できてはつまらないかもしれない」と思っていたのですが、そもそも最初の課題ならばもうちょっと要件を絞ってやるべきだったなと。
取り掛かり始める選択肢を多くしすぎたのはまずかった気がします。

## よかったこと

時間をかけてデモした甲斐あってわかりやすかったと言ってもらえたのは本当にうれしかったです。モチベーション上がりました。
少人数だったのでそれぞれの問題に対応でき、大勢が最初のデバッグ実行すらできない！という事態にはならなかったのでそこは良かったのかなと。

## 悪かったこと

C#、VisualStudioの説明に時間を取られすぎて作業時間が短かったなと思いました。
C#初めてでも大丈夫だよ！という話で始めたのでその辺りの説明をしないわけにもいかなかったのですが、いかんせん初めからがっつり説明するとなるとC#勉強会なのかXamarin.Forms勉強会なのかわからなくなり…。
この辺りの切り分けをちゃんとすべきでした。どちらに寄せるにも中途半端になってしまった感があります。反省点です。

# おわりに
Xamarinというより勉強会の内容になってしまって技術的な内容書けてない…。
こういう勉強会を最初から企画するのは初めてだったのでなかなか良い経験になりました。

XamarinはC#(WebForm、WindowsForm)経験者にとってかなり取っつきやすい部類の技術だと感じました。
簡単なアプリやデモの作成ぐらいであればサクッと作れちゃうのが魅力ですね。
なかなか踏み出せなかったiOS、Androidアプリ開発への第一歩となったわけで、この取っつきやすさはすごいです。Xamarin.Formsはいいぞ！

あと実は12/8に「[Xamarin.Formsでスリープ状態にしないために](https://qiita.com/tomopy03/private/9a6ffa3b4c0d85a85530)」も投稿してます。併せて読んでいただければ幸いです。

明日は sun_bacon さんです。よろしくお願いします。
どこでも同じ設定でVisualStudioCodeを使う方法

# はじめに

VisualStudioCodeを使い始めて3ヶ月ほどなのですが、統合ターミナルとかプラグインでの機能追加とか、便利ですよね。
これまでvimを使ってきたんですが、VisualStudioCodeに乗り換えようかなと思い、色々と自分なりに設定を試してみたりしています。
でも、職場の端末で見つけた設定を、家の端末にも反映しないといけないのは面倒くさい。
ということで、どこでも同じ設定を使えるようにしてみました。


# 想定読者

次の全てに当てはまる人を対象にしています。

* 複数の端末でVisualStudioCodeを使ってる方。
* 全部の端末で同じ設定を使いたいなという方。

# 概要

どこでも同じ設定で使えるようにするためには、`settings.json` を共有できるようにしましょう。
この記事ではGitHubを使った共有方法を紹介します。

※ 共有するための拡張機能として [Settings Sync](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) もあるようなので、こちらを使う方がお手軽かもしれません。 （@BEACHSIDEさんに教えていただきました。）

# どうすればいいの？

VisualStudioCodeの設定は `settings.json` に書き込まれます。なので、このファイルを複数環境で共有してしまえば、どこでも同じ設定で使えるようになります。
[公式ドキュメント](https://code.visualstudio.com/docs/getstarted/settings)によると、次の場所に配置されるようです。

* Windows `%APPDATA%\Code\User\settings.json`
* Mac `$HOME/Library/Application Support/Code/User/settings.json`
* Linux `$HOME/.config/Code/User/settings.json`

共有方法はなんでもOKです。共有フォルダに置くとかDropbox使うとか。でも次の利点があるのでGitHubなどのGitホスティングサービスを使うのがオススメです。

* 設定のバージョン管理ができる。
* WindowsとMacなど異なるOSの端末間で設定を共有するときに、`settings.json`の文字コードの違いをGitが吸収してくれる。（文字コードが違うと問題が起きるかは確認してませんが。）

本記事では、GitHubを使う方法を紹介します。

## GitHubを使った共有方法

今回はGitHubを介して`settings.json`を各環境で共有します。
手順は次の通り。

1. 設定を管理するリポジトリを作成。
2. リポジトリ内にvscodeディレクトリを作成。その中に`settings.json`を配置してコミット・プッシュ。
3. VisualStudioCodeが参照する場所に、vscodeディレクトリへのシンボリックリンクを作成（コマンドは次の通り）。
    * Windows `mklink /d %AppData%\Code\User {vscodeディレクトリの場所}`
    * Mac `ln -fnsv {vscodeディレクトリの場所} $HOME/Library/Application Support/Code/User`
    * Linux `ln -fnsv {vscodeディレクトリの場所} $HOME/.config/Code/User`

設定を変更した時は`settings.json`への変更をコミット・プッシュしましょう。その後、他端末でプルすれば変更の反映完了です。

シンボリックリンクを作成するのは、自分の好きな場所にgitのローカルリポジトリを配置したかったからです。シンボリックリンクを作成するスクリプトも`settings.json`と一緒に管理しておくと、新しい環境を使い始めたときの初期設定が楽になると思います。

実際に私が使っている設定は次のリポジトリで公開してますので、参考にしてみてください。
（vimとかGitの設定も共有できるようにしてるためごちゃごちゃしてますが、基本は上記の通りです。）
https://github.com/canpok1/dotfiles


# まとめ

`settings.json`をGitHubで管理することで、どこでも同じ設定でVisualStudioCodeを使えるようになりました。
次はインストールするプラグインとかも共有できたらなと思ってます。
もっといい方法などあれば、教えていただけると幸いです。
Raspberry Piでスマートロックをつくった

Raspberry pi 3 model Bを購入して自宅の玄関ドアをスマートロック化してみました。
もともと既存のスマートロック製品を使っていたのですが、解錠命令に対するレスポンスが非情にノロマで使いづらく外部サービスとの連携もできなかったため、じゃあ自分で自分が求めている理想のモノを作っちゃえと思い立ったのが始まりです。機能としては下記を目指しました。

- カギの目の前にいる時はインターネットを介さずダイレクトに即時開閉できる。
- カギの開閉と同時に玄関照明のオンオフをする。
- カギの開閉ログを記録する。
- インターネット経由での遠隔開閉や、現在の開閉状態を知ることができる。レスポンスもできるだけ早くする。

先に結果から言いますとこんな感じで完成しました。
![プレゼンテーション1.jpg](https://qiita-image-store.s3.amazonaws.com/0/222969/5a78837e-81a2-1e14-8b19-aa1e93e95a09.jpeg)
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">やったースマートロック完成したよー＼(^o^)／<br>・Suicaタッチで即開閉<br>・開けたら全室照明オン、閉めたら一斉にオフ<br>・内側からはボタン開閉、開けたら玄関だけ照明オンで宅配受取もスムーズ<br>・Slackで遠隔開閉可能<br>・未許可Suicaがタッチしたらスマホに通知、10分間の開閉許可を出すことも可能 <a href="https://t.co/an3DEi1Lqi">pic.twitter.com/an3DEi1Lqi</a></p>&mdash; undo (@undo) <a href="https://twitter.com/undo/status/940340987477475328?ref_src=twsrc%5Etfw">2017年12月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

採用した技術はおおよそ下記のとおりです。

1. ハードウェア
    - Raspberry Pi 3 model B
    - サーボモーターSG92R
    - NFCリーダライタ SONY PaSoRi RC-S380
    - スマート照明Philips Hue スターターセット
    - タミヤ 楽しい工作シリーズ ユニバーサルアームセット
2. プログラミング
    - Python 2.7
    - nfcpy
    - slackbot
3. 外部サービス
    - Slack
    - IFTTT
    - Google Sheets

Raspberry Piの初期設定から各種機能のプロトタイピング、そして実装までを小分け記事にしてみましたので、ぜひご参考ください。

1. [Raspberry Piの購入、初期設定](https://qiita.com/undo0530/items/4d2f0bc729a1e53f223f)
2. [Raspberry Piでサーボモーターを回す](https://qiita.com/undo0530/items/51cc446eefec6c91c26d)
3. [Raspberry PiにNFCリーダを接続してSuicaを読み取る](https://qiita.com/undo0530/items/89540a03252e2d8f291b)
4. [Raspberry PiでHueを操作する](https://qiita.com/undo0530/items/0d9eee70da46f906062a)
5. [Raspberry PiでIFTTTのMaker WebhooksにPOSTする](https://qiita.com/undo0530/items/95dc85e3b58380ea359a)
6. [Raspberry PiでSlackbotを飼う](https://qiita.com/undo0530/items/2139a1e8b73b3eee6e00)
7. [Raspberry Piで開発したプロトタイプを実装する](https://qiita.com/undo0530/items/a444fa9e10bc060334ad)
python入門

#### 1.インストール
https://www.python.org/downloads/

#### 2.pythonを起動
ターミナルを起動

```
python3
```
<img width="513" alt="スクリーンショット 2017-10-23 18.32.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/69106/6db52861-2388-1ef7-cf17-7fe69ab9d04d.png">
※command + k ターミナルを綺麗に
《UI/UX》2018年のトレンドカラーでグラデーション作りました。


[Pantone - Pantone Color, Chips & Color Guides | Color Inspiration](https://www.pantone.com/)  が、毎年恒になっている、2018年のトレンドカラー「ウルトラバイオレット “Pantone 18-3838”」を[発表](https://www.pantone.com/color-of-the-year-2018)しました。

このカラー [#5F4B8B Hex Color | RGB: 95, 75, 139](https://www.colorcombos.com/colors/5F4B8B) を使って、グラデーションパレットを作ってみました。

UI構築のインスピレーションにどうぞ。

* #5F4B8B

![4EF6C0E9-CB59-4FED-8956-4A11CF877E9B.png](https://qiita-image-store.s3.amazonaws.com/0/150609/2184cd4a-da05-6c89-5d06-20f43029ffb2.png)


## よくあるグラデーション
* #A95691 
* #E36A85 
* #FF8F70 
* #FFC261 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/65d2be14-069a-86aa-58f6-7136e832c24e.png)



### #A95691
![8194EEAD-E100-4968-BCDC-D9161ADE0522.png](https://qiita-image-store.s3.amazonaws.com/0/150609/8f487526-3354-d698-c8f8-7393e2df168c.png)


### #E36A85 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/4c565fde-692e-35a9-e92e-18c843c37abe.png)



### #FF8F70 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/d38f61ea-cebc-5188-6693-bf51bc379c23.png)



### #FFC261 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/d893d7c4-6bbc-0388-f691-d167550b5b59.png)



### mix
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/610a45e0-5de0-6cad-3f88-9d49604c1c48.png)




##  調和したグラデーション
* #3263A9
* #007ABB
* #008FBC
* #00A2AE

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/684083bd-369f-3956-0436-76c651c72b73.png)


### #3263A9
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/84a3166c-a969-f69a-d5c4-41ea2df8769f.png)



### #007ABB
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/b1fe13b0-cbaf-a316-f709-7234477ae533.png)



### #008FBC
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/a14f3c0d-abf4-0a48-e358-30d9fb0d273c.png)



### #00A2AE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/1f0fb736-3e06-f43e-848f-c8136d8884b3.png)



### mix
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/0ce363d2-3f4b-f433-d05d-0c9a0f1da07d.png)




## その他カラーインスピレーション
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150609/4209cf87-9642-e89b-6607-beac57e6a5a9.png)



## 公式のガイドが素敵

デザイナー向けのガイド「[Pantone Color of the Year 2018 Tools for Designers I Ultra Violet 18-3838](https://www.pantone.com/color-of-the-year-2018-tools-for-designers)」にも詳しく書かれているので、目を通しておきたいですね。

PURPLE HAZE というパレットが最初に挙げられているのが印象的で、曖昧で中性的な雰囲気で、ファッション系に取り入れやすそう。

INTRIGUE はコーポレート向け、ATTITUDE は子供っぽい、DRAMA QUEEN は大人っぽいガーリーな雰囲気、
などというように、イメージしやすいパレットが提供されています。





おわります。