OmniAICreator/Qiita-1.07M huggingface dataset:
windowsにgithubをインストールする

# gitをインストール

まずこのURLにアクセスしてインストールします。
[https://git-scm.com/download/win](https://git-scm.com/download/win)

# 秘密・公開鍵を作成します

```
$ cd .ssh
$ ssh-keygen -t rsa -C "amagurik2@gmail.com"
```

```
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/username/.ssh/id_rsa.
Your public key has been saved in /c/Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:*********************************** example@example.com
The key's randomart image is:
+---[RSA 2048]----+
|     Eoo. o .===B|
|      .. o *+o=+*|
|      o . +.=*.+o|
|     o = . o+oo  |
|      + S +.o... |
|     o + o = oo  |
|      +   . ..   |
|                 |
|                 |
+----[SHA256]-----+
```

下記のように出ればOKです

```
$ ls
id_rsa  id_rsa.pub 
```

# 公開鍵をgithubに設定

公開鍵をコピー

```
$ clip < ~\.ssh\id_rsa.pub
```

Githubの``プロフィール > settings > SSH and GPG keys 
``の場所に貼り付け

titleはお好きに
keyの欄にコピーした公開鍵を貼り付け

# 公開鍵が通ったか試す

```
$ ssh -T git@github.com
```

こう帰ってくれば成功！

```
Warning: Permanently added the RSA host key for IP address 'IPアドレス' to the list of known hosts.
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
```

あとはお好きに　git cloneなど

```
$ git clone git@github.com:hogehoge.git
```
vue.js vu-daterange-pickerで日付範囲を選択出来るようにする。

# インストール
npm install vue-daterange-picker --save

※ momentとvue-clickawayに依存します。

# 例：一年前から昨日までの日付を選択できるpicker
対象version 1.2.5

## script

```javascript

import moment from 'moment'
import VueDaterangePicker from 'vue-daterange-picker'

moment.locale('ja') //曜日や月名を日本語化

export default {
  name: 'コンポーネント名',
  components: {
    VueDaterangePicker
  },
  data () {
    return {
      oneYearAgo: moment().subtract(365, 'days').format('YYYY/MM/DD'),
      yesterday: moment().subtract(1, 'days').format('YYYY/MM/DD')
    }
  },
  methods: {
    getDates: (dates) => {
      console.log(dates) // Object {startDate: "2017-12-25T00:00:00+09:00", endDate: "2018-01-22T00:00:00+09:00"}
      // 取得した日付をイベントに渡す
    }
  }
}
```

## template
```html

<template>
  <vue-daterange-picker
    double // カレンダーを2列表示にする デフォルトは1列
    dates-format="YYYY/MM/DD" // start-date, end-dateに渡す日付の書式
    format="YYYY/MM/DD" // 出力される日付の書式
    titleFormat="YYYY年 M月" // カレンダーの上部に表示される書式 デフォルト MMMM Y
    :start-date="oneYearAgo" // カレンダーの選択可能な開始日付
    :end-date="yesterday" // カレンダーの選択可能な終了日付
    start-place-holder="" // 開始日付のプレースホルダ ※公式ではstart-place-holdersと誤記
    end-place-holder="" //  終了日付のプレースホルダ ※公式ではend-place-holdersと誤記
    @get-dates="getDates" // 期間選択完了時に発火されるイベント
  />
</template>
```

# カスタマイズ
デフォルトではjQueryおなじみのdatepickerのようにカレンダーアイコンをクリックではカレンダーが開かない。
アイコンクリックでカレンダーが開くようにするカスタマイズの例。

vue-daterange-picker.vue

```javascript

// handleEndDateClick() の後ろに追加
      handleCalendarIconClick() {
        this.dateToInput = 'start';
        this.$refs.pointer.style.left = '90px';
        this.$refs.startDateInput.select();      
        this.showCalendar = true;
      },
```

```html

// アイコンにクリックイベントを追加する。
      <img src="./assets/calendar.svg" class="calendar" alt="calendar" @click.stop="handleCalendarIconClick">

```

# 用途
一定期間のデータを抽出する用途のUIに便利です。
Google Adsenseの「電話番号が正しくありません」には「+81」を付ける

GoogleAdsenseを始めようと思ったけど、電話番号認証が出来ない。

**「電話番号が正しくありません。ご確認のうえ、もう一度試してください。」**

となるときの対応。

![Adsense.jpg](https://qiita-image-store.s3.amazonaws.com/0/231781/2048bfbc-b3e5-813d-81d7-501f84cb3700.jpeg)


090XXXXXXXX
　↓
**+81**090XXXXXXXX

でOK。
フォークと本家を同期させる Git エイリアス

毎回ググるのがツラいので、`set-upstream` と `sync-fork` というエイリアスを追加する。


```:~/.gitconfig
[alias]
	set-upstream = !"f() { if [ -n \"$1\" ]; then git remote add upstream $1; else echo 'usage: git set-upstream <url>' && exit 1; fi; }; f"
	sync-fork = !"git fetch upstream && git checkout master && git merge upstream/master"
```

[GitHub Help](https://help.github.com/) より。

- `set-upstream`: [Configuring a remote for a fork - User Documentation](https://help.github.com/articles/configuring-a-remote-for-a-fork/)
- `sync-fork`: [Syncing a fork - User Documentation](https://help.github.com/articles/syncing-a-fork/)
org-babelで出力を生の状態で差し込む

<!---


--->

org-babelでshellを実行して見ます。

```
#+BEGIN_SRC shell
pandoc --version
#+END_SRC
```

すると次のテキストが挿入されます。

```
#+RESULTS:
| pandoc    | 2.1.1             |              |            |                        |         |             |                 |         |             |
| Compiled  | with              | pandoc-types | 1.17.3.1,  | texmath                | 0.10.1, | skylighting | 0.6             |         |             |
| Default   | user              | data         | directory: | /Users/sximada/.pandoc |         |             |                 |         |             |
| Copyright | (C)               | 2006-2018    | John       | MacFarlane             |         |             |                 |         |             |
| Web:      | http://pandoc.org |              |            |                        |         |             |                 |         |             |
| This      | is                | free         | software;  | see                    | the     | source      | for             | copying | conditions. |
| There     | is                | no           | warranty,  | not                    | even    | for         | merchantability | or      | fitness     |
| for       | a                 | particular   | purpose.   |                        |         |             |                 |         |             |
```

table状態に整形されています。


rawの状態にしたい場合は `:results raw` を指定します。

```
#+BEGIN_SRC shell :results raw
pandoc --version
#+END_SRC
```

このコードを実行すると次のテキストが挿入されいます。

```
#+RESULTS:
pandoc 2.1.1
Compiled with pandoc-types 1.17.3.1, texmath 0.10.1, skylighting 0.6
Default user data directory: /Users/sximada/.pandoc
Copyright (C) 2006-2018 John MacFarlane
Web:  http://pandoc.org
This is free software; see the source for copying conditions.
There is no warranty, not even for merchantability or fitness
for a particular purpose.
```

;-)
関数パターンマッチでフォーム入力前後の挙動を変える

Phoenixでフォーム入力させる際、フォーム入力後と、フォーム未入力時や初期状態で、挙動をスイッチする場合、Elixirの関数パターンマッチが便利

```erb:foo.html.eex
<input type="text" name="basis_date" value="<%= params[ "basis_datetime" ] %>" id="datepicker"></td>
```

この例では、basis_dateへの日付入力（jQuery UIのDatepickerを利用）があれば、basis_date以降の更新日付をSQLのwhere句として返し、入力が無い場合や、初期状態（nil）の場合は、where句を指定しないという挙動スイッチをしている

```elixir
	sql = "select * from customer #{ basis_date_where( params[ "basis_date" ] ) }"

	def basis_date_where( "" ),         do: ""
	def basis_date_where( nil ),        do: ""
	def basis_date_where( basis_date ), do: "where updated_at >= '#{ basis_date }' "
```
会社で少し盛り上がった Project Euler をやってみる 004

# Problem 004

> 左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ.

---

# Answer 004 (Python)

```python3
class Problem4:

    def main(self):
        palindromeNumber = 0
        for i in range(100, 1000):
            for j in range(i, 1000):
                num = i * j
                if self.isPalindromeNumber(num):
                    if num > palindromeNumber:
                        palindromeNumber = num
        print(palindromeNumber)

    def isPalindromeNumber(self, num):
        l = list(str(num))
        for i in range(0, int(len(l) / 2)):
            if l[i] != l[-1-i]:
                return False
        return True


if __name__ == '__main__':
    p = Problem4()
    p.main()
```
---

# (参考) Project Euler とは

[Project Euler](https://projecteuler.net/) はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。

サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。

また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
npm で特定パッケージの依存関係を表示したい

`npm ls` コマンドの引数にパッケージ名を指定する。

例）

```shell-session
$ npm ls clone
babel@ /path/to/babel
├─┬ gulp@3.9.1
│ └─┬ vinyl-fs@0.3.14
│   ├─┬ defaults@1.0.3
│   │ └── clone@1.0.2  deduped
│   └─┬ vinyl@0.4.6
│     └── clone@0.2.0
├─┬ gulp-util@3.0.8
│ └─┬ vinyl@0.5.3
│   └── clone@1.0.2
├─┬ gulp-watch@4.3.11
│ └─┬ vinyl@1.2.0
│   └── clone@1.0.2  deduped
└─┬ webpack-stream@4.0.0
  └─┬ vinyl@2.1.0
    └── clone@2.1.1
```

参考: [ls | npm Documentation](https://docs.npmjs.com/cli/ls)
Ruby で Spotify API 使ってエゴサする

[これを見たので](https://qiita.com/musiccoffeetea/items/69a58d6d66e42b3c113f)私も触ってみたというだけの記事です。
昔ディストリビュータに委託してた私の曲が Spotify にも出してくれたみたいなのでエゴサしてみます。

# 準備

上記記事通り、[Spotify for Developers](https://beta.developer.spotify.com/dashboard/applications) で CREATE AN APP して `client_id` と `client_secret` を発行。(非商用でお試しアプリを作成)

# RSpotify

[ドキュメント](https://developer.spotify.com/web-api/endpoint-reference/)を流し読みしつつ、[RSpotify](https://github.com/guilhermesad/rspotify) という gem があったのでこれを使います。
Spotify API のラッパーです。便利すぎる。

# 実行

README.md に書いてあるサンプルを実行してみます。ただ、差分として、Spotify API はすべての API に authenticate が必要になったのでその行だけ足しました。


```ruby
require 'rspotify'

RSpotify.authenticate("client_id", "client_secret")

artists = RSpotify::Artist.search('Nobuhiro Takahashi')

artist = artists.first
p artist.name
p artist.popularity

albums = artist.albums
album = albums.first
p album.name
p album.release_date
p album.images

tracks = album.tracks
track = tracks.first
p track.name
p track.duration_ms
p track.track_number
p track.preview_url
```

# 結果

```console
"Nobuhiro Takahashi"
0
"Meditation"
"2011-04-30"
[{"height"=>640, "url"=>"https://i.scdn.co/image/babad27a9bc486b82de99661363ff6b6d78863f4", "width"=>640}, {"height"=>300, "url"=>"https://i.scdn.co/image/cdb2bf1b59df9b16caa55b768c7a65980b9c5abd", "width"=>300}, {"height"=>64, "url"=>"https://i.scdn.co/image/64293304497ad7b955f949c00f36231aa21003e9", "width"=>64}]
"Meditation"
116499
1
"https://p.scdn.co/mp3-preview/bbb8abdc1bd76a8e86f7b6cef4a19185f83d0ae6?cid=42c6d184012f4a68bd08ef8dcc3358ff"
```

popularity が見事に 0 でした。

本当にありがとうございました。

# 視聴プレイヤーボタン

`preview_url` 突っ込んだら視聴できたので、ウェブ上で視聴プレイヤー作れることがわかったのが収穫でした。
↓こんな感じ

```md
[![](https://i.scdn.co/image/64293304497ad7b955f949c00f36231aa21003e9)視聴](https://p.scdn.co/mp3-preview/bbb8abdc1bd76a8e86f7b6cef4a19185f83d0ae6?cid=42c6d184012f4a68bd08ef8dcc3358ff)
```

[![](https://i.scdn.co/image/64293304497ad7b955f949c00f36231aa21003e9)視聴](https://p.scdn.co/mp3-preview/bbb8abdc1bd76a8e86f7b6cef4a19185f83d0ae6?cid=42c6d184012f4a68bd08ef8dcc3358ff)

# まとめ

本当にありがとうございました。
Windows server2016 WindowsUpdate自動更新の無効化

Winodws server2016で更新プログラムの確認ダイアログが逐一でるので、停止する方法

下記参考URLのままなので、詳細割愛

Windows 10 / Windows Server 2016 でも Windows Update の自動更新は止められます

https://blogs.technet.microsoft.com/jpwsus/2017/09/08/wecanstop-wu/
「新しいGoogleサイト」の使い方

# Overview
「新しいGoogleサイト」が[リリース](https://gsuiteupdates-ja.googleblog.com/2016/11/google.html)されて早1年が経過しました。
そろそろ移行しようとしている人に向けて新旧の差異を比較しつつ使い方をまとめてみようと思います。

# 「新しいGoogleサイト」とは
これまでは独立したサービスだったGoogleサイトがGoogleドライブの機能として提供されるようになりました。
リリース当初は非常に限られた機能しかなかったものの、日々バージョンアップを続けているようです。

「ファイルキャビネット」などのテンプレートが廃止され、「シンプルなものを簡単に」作成する方向に進んでいる印象を受けます。
デザイン面では大きなヘッダーやレスポンシブデザインの導入など、「今どきの」デザインへと大きく変化しています。

なお、各種ドキュメントでは旧バージョンは「以前のGoogleサイト」、新バージョンは「新しいGoogleサイト」と表記されています。

# 作成・公開方法
以下、「以前のGoogleサイト」を「旧版」と表記します。

## 1. Googleドライブ内で「新規」→「Google サイト」を選択する
![スクリーンショット 2018-01-31 23.42.42.png](https://qiita-image-store.s3.amazonaws.com/0/165020/e5f4f90c-4553-c917-c112-7c7a32525fc6.png)


### 旧版との相違点
サイトを作成しようとしたら、まずGoogleドライブを開くことになります（個人的には一番大きな変更点だと思います）。
「新しいGoogleサイト」はドキュメントやスプレッドシートと同じような扱いになっています。
そのため、この時点でフォルダ内の他のデータと同様のアクセス権限・編集権限が付与されています。

## 2. 新規作成画面が開くので適当に入力
### 旧版との相違点
明示的な保存ボタンはありません。Googleドキュメントと同様に自動保存されます。（各種ドキュメントでは「下書き」と表現されています）

## 3. 画面上部、目のアイコンをクリックしてプレビューする（この時点では編集権限がある人のみ閲覧可能）
![スクリーンショット 2018-01-31 23.40.11.png](https://qiita-image-store.s3.amazonaws.com/0/165020/4dd13b39-5d7c-69b3-4ed0-cec0e581efa7.png)

スマホやタブレットでの表示もシミュレートできます。

![スクリーンショット 2018-01-31 23.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/165020/80295b98-5e99-d5ae-7c76-8b668e575f25.png)


## 4. 編集画面右上の「公開」をクリックして設定画面を開く。URLと公開範囲を入力して決定。

![スクリーンショット 2018-01-31 23.39.12.png](https://qiita-image-store.s3.amazonaws.com/0/165020/dab9310a-73a7-3f69-28d5-c803770946b4.png)

### 旧版との相違点1
「編集内容の保存」と「公開」が分離しました。「公開」するまではどんなに編集しても最後に「公開」した時点のものが見えるようです。
今までは編集中のページを個別に非公開設定にするなど面倒だったのでかなり使いやすくなったと思います。

### 旧版との相違点2
**ページ単位での権限設定ができません。** 旧版でページごとに権限を分けていた場合は複数のサイトに分割する必要がありそうです（調査中）。

## 独自ドメインへのマッピング
ここは今までと同じです。
管理コンソールのダッシュボードから「アプリ」→「G Suite」→「サイト」を開いて設定します。
なお、公開範囲が限定されていると単なるリダイレクトになってしまうようです（今までと同じ振る舞い）。

# 編集方法
編集画面はGoogleドライブで当該サイトを開くか、公開URLのフッターにある編集用リンクをクリックして開きます。

## コンテンツの挿入
編集画面右側の「挿入」タブから目的のものを選ぶか、挿入したい場所でダブルクリックして表示されるメニューから挿入できます。
基本的なレイアウトの考え方として、「セクション」というものがあるようです。その内部にテキストや画像を置いていく感じのようです。
セクションの横方向は12等分されており、テキストや画像はその単位で幅を変えられます。

## サブページの追加
編集画面右側の「ページ」タブを開き、画面下部の「ページを追加」ボタンまたはページリストにホバーして表示されるメニューから追加できます。
ページの構造はドラッグ・アンド・ドロップで変更できます。
少し古い記事だと「階層構造は作れない」という記載があるようですが現在は複数階層を作れるようです。

![スクリーンショット 2018-01-31 23.38.22.png](https://qiita-image-store.s3.amazonaws.com/0/165020/253d7c08-9d10-412a-9056-b138161ddeeb.png)

# 案外できること
## HTMLを埋め込める
任意のHTMLを埋め込むことができます。iframeのsandboxの中で実行されるため `alert` などは使えませんが、外部からの読み込み・スタイルシートの記述など比較的自由に記述できます。
挿入→埋め込み から追加できます。

![スクリーンショット 2018-02-01 0.05.23.png](https://qiita-image-store.s3.amazonaws.com/0/165020/e2159948-2b00-efe1-10d4-b02d90dfa1f8.png)

# 2018年1月末現在でできないこと
「以前のGoogleサイト」でできて「新しいGoogleサイト」でできないことは多数ありますが、個人的にインパクトが強いものを以下にまとめます。

## Google Apps Script / API が未提供
APIが未提供のため、自動でページを生成したりコンテンツを追加したりといったことができません。
[Google Sites API](https://developers.google.com/google-apps/sites/) のすべての機能について「classic Sites only」の記載があります。

## 表組みができない
ちょっとした表を簡単に作る方法が見つけられませんでした。
Googleスプレッドシートを埋め込めということなのでしょうか。
前述の「HTMLの埋め込み」を使えば当然可能ですが...

# To Be Continue...
日々機能が追加されていますのでこのページも更新していこうと思います。
（あとスクリーンショットを入れたい）
YYPHP#24 イベントレポート「LaravelとVueをどう設計しているか？Vuexで楽になる部分は？便利なライブラリありませんか？」

これは2018年1月24日に開催したPHPerイベント[YYPHP#24]のイベントレポートです。

[YYPHP]は一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催は**毎週**水曜19:00に高田馬場にて。

[YYPHP#24]: https://yyphp.connpass.com/event/75859/
[YYPHP]: https://yyphp.connpass.com/

## 参加者

* 12名
* PHP歴の分布
    * 10年〜: 2名
    * 5〜9年: 4名
    * 2〜4年: 2名
    * 1年: 1名
    * 1年未満: 2名
* Vue歴の分布
    * だいたいみんな1年以内

## LaravelとVueをどう設計しているか？

* 基本はLaravelで画面を作る
* ダイナミックな画面はVue.jsを使っている
    * LaravelのWeb APIを叩く
    * Vue.js専用のAPIを用意している
* JSの部分はすべてVue
* Vue.jsに引っ張られたAPI設計にはなりにくい
* 認証セッションタイムアウトの対処
    * axiosでPromise.rejectが返ってきたらログインページに飛ばす
* 初期ロードを早くするには？
* API設計
    * REST
    * GraphQL
        * GraphQL元年 2018年
        * [GraphQL](http://graphql.org/)
        * 早くなる？ → あんまり変らない
* Laravel 5.5へのアップグレード
    * [アップグレードガイド 5.5 Laravel](https://readouble.com/laravel/5.5/ja/upgrade.html)
    * [Laravel5.3から5.4にあげたときにHTTPS強制でエラー - Qiita](https://qiita.com/sawadashota/items/79b74592b7d9800868f8)
* Vue.jsからのアクセス判定
    * モバイルからのリクエストを区別したい

## Vuexで楽になる部分は？

* [Vuex とは何か? · Vuex](https://vuex.vuejs.org/ja/intro.html)
* アプリの状態管理ツール
* ReactのReduxのようなもの
* Fluxアーキテクチャ
* 状態の集中管理
* ないと
    * コンポーネントごとが状態を持つことになる
    * デバッグしずらい
* 小規模すぎると、オーバーアーキテクチャになるかも
* [championswimmer/vuex-persist](https://github.com/championswimmer/vuex-persist): A Vuex plugin to persist the store.
* Smart componentとdumb component
    * [Smart and Dumb Components in React | Jake Trent](https://jaketrent.com/post/smart-dumb-components-react/)
* MVC
* Web MVC
* MVVM
* MVW

## 便利なライブラリありませんか？

* みんなのpackage.json見せ合う
* [Element UI](http://element.eleme.io/#/en-US)
* [Vue JS devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja) → Chrome拡張
* axios
* [Buefy: lightweight UI components for Vue.js based on Bulma](https://buefy.github.io/#/)
* [Bulma: a modern CSS framework based on Flexbox](https://bulma.io/)
* Babel
* [Ramda Documentation](http://ramdajs.com/)
* [vuejs/awesome-vue: 🎉 A curated list of awesome things related to Vue.js](https://github.com/vuejs/awesome-vue)
* [Vue.js Newsletter | Revue](https://www.getrevue.co/profile/vuenewsletter)
* [Vue.js Developers](https://vuejsdevelopers.com/)
* [Bootstrap Vue](https://bootstrap-vue.js.org/)?
* [Quasar Framework](http://quasar-framework.org/)
* [Nuxt.js - ユニバーサル Vue.js アプリケーション](https://ja.nuxtjs.org/)
* [MetinSeylan/Vue-Laravel-Validator: Laravel validation error handler for vuejs](https://github.com/MetinSeylan/Vue-Laravel-Validator)

## jQuery中心の社内にどうVueを広めていくか？
「俺が全部Vueで書く！」と宣言する

## その他

* [Node-REDで照明に特化したDALI APIと連携するナレッジをウフル社と共有しました | enebular blog](http://blog.enebular.com/dali/node-red-flow-dali-api-first-contact_01/)



## YYPHPは毎週やってます

PHPについてワイワイ話したい方は、[YYPHPのイベント情報](https://yyphp.connpass.com/)をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います！ では、また来週！
機械学習論文読みメモ_115


[Curriculum Domain Adaptation for Semantic Segmentation of Urban Scenes](https://arxiv.org/abs/1707.09465)
Semantic segmentationにおいてCNNはメインに使われてきた手法である。
一方その学習には膨大なデータが必要な事かボトルネックになっている。
Photo realisticな人工データの利用の研究も進んでいるが、未だ実際の画像とのdomain gapが
大きい。
本論ではこのdomain gapを埋めるための手法としてcurriculum learningを適用した手法を提案する。
このcurriculum domain adaptationでは、まず最初は簡単で基本的な部分に対するadaptationをtarget domainに
対して行う。
このタスクは例えばglobal label distributionや各ランドマークのsuperpixelの分布の一致などである。
こうした分布はdomain毎に明らかな特徴としてあり、推定も難しくない。
こうした特徴を考慮したdomain adaptationを行う事でdomain gapのより最小化を行う事が可能になる。

[Photographic Image Synthesis with Cascaded Refinement Networks](https://arxiv.org/abs/1707.09405)
Semantic layoutに条件付けされたrealistic画像の生成方法について提案する。
このタスクではsemantic segmentationのラベル画像を入力として、それを反映した
現実的な画像を生成する。
この手法は他の関連手法と異なり、adversarial trainingを行わない。
代わりに直接的な回帰対象を与えfeedforward networkにより教師あり学習を行う。
この手法は高解像度画像にも適用する事が可能である。

[Toward Geometric Deep SLAM](https://arxiv.org/abs/1707.07410)
２つのCNNから成り立つpoint tracking systemを提案する。
１つめはMagicPointと呼ばれ、画像を入力としてそのsalient pointを抽出する。
抽出されたpointは画像全体に分布し、かつ孤立しているため、SLAM用途に利用可能である。
このモデルを用いる事で、画像にノイズがある際特に従来手法よりも遥かに高性能を実現出来る。
またこうしたpointが幾何的にstableである場合には、そのtransformationの推定はより簡単になる。
このMagicPointにより抽出された点に対して、２つめのモデルであるMagicWarpを用いて
transformも行う事、画像間のマッチングを可能にする。
このモデルは従来手法と違いlocal point descriptorを必要としないのが特徴である。
org-babelに使用できる言語を追加する

<!---


--->

org-babelではorg-modeで記述したコードスニペットを実行し、その出力をファイルに挿入できます。そこで使用できる言語は `org-babel-do-load-languages` を使って追加します。

```lisp
(org-babel-do-load-languages 'org-babel-load-languages
    '(
        (shell . t)
        (elixir . t)
        (http . t)
        (restclient . t)
        (python . t)
        (plantuml . t)
        (ruby . t)
        (emacs-lisp . t)
    )
)
```
ネームサーバでちょい詰まりした(FQDNというものを知らなかった)

したかったこと
===
hello.example.comに来たリクエストを
outside.testに送りたかった。
(hello.example.com -> outside.test)

問題発生から解決
===
## example.comのネームサーバのコンフィグをこう書いた
```
hello CNAME outside.test
```
## 起こったこと
hello.example.com -> outside.test.example.com

## こう直したらokだった
```
hello CNAME outside.test.
```


どういうこった
===
```
outside.test
```
これは相対的なドメインの書き方で、それがexample.comのなかにあったもんだからoutside.test.example.comなんてドメインになってしまった。

```
outside.test.
```
FQDN(Fully Qualified Domain Name(完全修飾ドメイン名))で書く必要があった。

同じコンフィグ内に書かれているレコードをみて、おしりにピリオド打てばいんだろうなとは気づいていたんだけども、
おしりのピリオドをなんて言えばいいのかわからず検索がつらかった。
Light red and blue alternately

```javascript
const timer = require('timers')

const lightList = ['red', 'blue']

const LIGHT = {};
const lights = 'lights';

for (const light of lightList) {
  LIGHT[light] = `${lights} ${light}`
}

const lightAnyColor = ({light, nextLightFunc, lightTime}) => {
  timer.setTimeout(() => {
    console.log(light)
    nextLightFunc();
  }, lightTime);
}

const lightBlue = () => {
  lightAnyColor({
    light: LIGHT.blue,
    nextLightFunc: lightRed,
    lightTime: 1000,
  })
}

const lightRed = () => {
  lightAnyColor({
    light: LIGHT.red,
    nextLightFunc: lightBlue,
    lightTime: 1000,
  })
}
const start = () => {
  lightRed();
}

start();
```
C 構造体 csv読み込み ファイル入出力

# Cでcsvを扱ったときのメモ
```c:構造体.c
#include <stdio.h>
#define NUM 3
typedef struct student {
  char name[60];
  char gender[10];
  int age;
} STUDENT;

int main(void) {
  int i;
  STUDENT people[3];
  FILE * file;

  //ファイル読み込み
  file = fopen("student.txt", "r");
  for(i=0;i<NUM;i++) {
    fscanf(file, "%[^,],%[^,],%d", people[i].name, people[i].gender, &people[i].age);
    // fscanf(file, "%s", people[i].name);
    // fscanf(file, "%s", people[i].gender);
    // fscanf(file, "%d", &people[i].age);
  }
  fclose(file);

  //出力
  for(i=0;i<NUM;i++) {
    printf("%s %s %d\n", people[i].name, people[i].gender, people[i].age);
  }

  return 0;
}
```
［Swift/iOS］StoryBoardを使わずに、UISwitchを実装する方法

# StoryBoardを使わずに、UISwitchを実装する方法

## Q. なぜ、StoryBoardを使わないのか？
A. GitHubで管理している場合、コンフリクトが発生するため。

## 開発環境
Swift 4
Xcode 9.2

## ポイント
### UISwitech の追加
```swift:sample.swift
let sample_switch:UISwitch = UISwitch(frame: CGRect(x: (self.view.frame.width) / 2, y: (self.view.frame.height) / 2 , width: 50, height: 25))

self.view.addSubview(sample_switch)
```

### UISwitchを切り替えると、発火するfunc
`func` の前に `@objc` を追加 

```swift:sample.swift
var index:Int = 1
    
@objc public func sampleSwitch(sender: UISwitch){
  print("\(index) times switched")
  index += 1
}
```

### UISwitchとfuncの紐付け
```swift:sample.swift
let sample_switch:UISwitch = UISwitch(frame: CGRect(x: (self.view.frame.width) / 2, y: (self.view.frame.height) / 2 , width: 50, height: 25))

//追加したコード
sample_switch.addTarget(self, action: #selector(sampleSwitch), for: UIControlEvents.valueChanged)

self.view.addSubview(sample_switch)
```

## コード例
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
       
        let sample_switch:UISwitch = UISwitch(frame: CGRect(x: (self.view.frame.width) / 2, y: (self.view.frame.height) / 2 , width: 50, height: 25))
        sample_switch.addTarget(self, action: #selector(sampleSwitch), for: UIControlEvents.valueChanged)
        self.view.addSubview(sample_switch)
        
    }
    
    var index:Int = 1
    
     @objc public func sampleSwitch(sender: UISwitch){
        
        print("\(index) times switched.")
        index += 1
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
```

## シュミレータ実行結果
```xcode:Xcode
1 times switched.
2 times switched.
3 times switched.
```
ShellScript メモ

# たまにつかうシェルスクリプトのメモ
```
実行中ファイルの特定
lost [file]
kill [pid]
```
```sh:play_c.sh
#!/bin/sh

if [ $# -gt 0 ]; then
		gcc $1.c -o $1
		./$1
	
else
	echo "1つ以上の引数を渡してください"
fi
```
```sh:play_java.sh
#!/bin/sh
if [ $# -gt 0 ]; then
  javac $1.java
  java $1
else
  echo "1つ以上の引数を渡してください"
fi
```
```sh:
for i in *.txt
do
	mv $i ${i%.txt}.csv
	nkf -s ${i%.txt}.csv >> ${i%.txt}s.csv
done
#%,%%右端から最短の、最長のパターン一致を削除
##,##左端から最短の、最長のパターン一致を削除
```
Vi 使い方

#メモ
vi [FILE] 対象ファイルを開く

i 左から入力開始
I 行頭から入力開始
a カーソルの右から入力開始
A 行末から入力開始

h カーソルを左に
j カーソルを下に
k カーソルを上に
l カーソルを右に

:w 保存
:q 終了 
:! 強制的に

:set nu 行番号表示
:set nonu 行番号非表示

u	BACK
Ctrl+r  FORWARD
.	REPEAT

:new 空の横ウインドウを開く
:vnew 空の縦ウインドウを開く
Ctrl+w w 次のウインドウに移動
% 対応する括弧に移動

:%s/[old]/[new]/c 確認しながらファイル内の検索語句を置換
/[string] 検索
　→n 次へ

Ctrl+d down 半画面下へ
Ctrl+u up　半画面上へ

Ctrl+f forward 1画面下へ
Ctrl+b backward 1画面上へ

[n] Shift+g n行目に移動

[n] yy [n]行コピー
y[n]l [n]文字コピー

p カーソルの右下に貼り付け
Shift+p カーソルの左上に貼り付け

dd 一行削除
x 一文字削除
textareaを中身に応じて自動リサイズする

textareaを内容に応じてリサイズするclassを作りました。How to useに書いてある様に書けば動くと思いますが、もし動作しなかった場合はコメントにて教えてもらえると助かります :bow: 

```javascript
/*
 * How to use
 *
 * import ResizeTextarea from './path/to/ResizeTextarea';
 * let textarea = document.querySelector('#textarea');
 * const resizeTextarea = new ResizeTextarea(textarea);
 * textarea.addEventListener('input', () => {
 *   resizeTextarea.resize();
 * });
 */

export default class ResizeTextarea {
  constructor(textarea) {
    this.textarea = textarea;
    this.style = window.getComputedStyle(textarea, null)
  }

  resize() {
    if (this.scrollHeight > this.offsetHeight) {
      this.height = this.scrollHeight;
    } else {
      while(true) {
        this.height = this.height - this.lineHeight;
        if (this.scrollHeight >= this.offsetHeight) {
          this.height = this.scrollHeight;
          break;
        }
      }
    }
  }

  // get height of textarea from inline style attribute or css
  // return Number
  get height() {
    let heightCss = this.textarea.style.height || this.style.getPropertyValue('height');
    return Number(heightCss.slice(0, -2)) || 0;
  }

  // get line-height of textarea from inline style attribute or css
  // return Number
  get lineHeight() {
    let lineHeightCss = this.textarea.style.lineHeight || this.style.getPropertyValue('line-height');
    return Number(lineHeightCss.slice(0, -2)) || 0;
  }

  // return Number
  get scrollHeight() {
    return this.textarea.scrollHeight;
  }

  // return Number
  get offsetHeight() {
    return this.textarea.offsetHeight;
  }

  // param Number
  set height(height) {
    if (typeof(height) !== 'number') console.error('expect: ResizeTextarea get heightの引数は数値です。got: ', typeof(height));
    this.textarea.style.height = height + 'px';
  }
}
```
rails helper 基本

## helperとは
view内でちょっとした処理をやりたい時に使う。viewをシンプルにする為に。
viewと別の場所(helper)で定義しておいたメソッドをviewから呼び出すことができる。

# 作成方法
```rails g controller```を実施した際に作成される

```ruby:例
rails g controller Test
#↓
create  app/helpers/test_helper.rb
create  app/controllers/test_controller.rb
```

# helperの実体
実体はmodule。
ソースを見るとmoduleが生成されていることがわかる。

```ruby:test_helper.rb
module TestHelper
end
```


## helperのinclude
moduleなのでincludeして使う必要がある。
ただしそれは自動的にやってくれる。

- rails5ではデフォルトは、全てinclude。

```
 By default, each controller 
   # will include all helpers. These helpers are only accessible on the controller through <tt>#helpers</tt> |
   # 
   # In previous versions of \Rails the controller will include a helper which |
   # matches the name of the controller, e.g., <tt>MyController</tt> will automatically |
   # include <tt>MyHelper</tt>. To return old behavior set +config.action_controller.include_all_helpers+ to +false+. 
```

- コントローラに対応するものしか読み込ませたくない時は、```config/application.rb```に以下設定をする

```ruby:config/application.rb
module xxx
  class Application < Rails::Application
    config.action_controller.include_all_helpers = false #これをセット！！
  end
end
```

https://github.com/rails/rails/blob/3464cd5c288323ca115a4929d1e6b435c4afc8d4/actionpack/lib/action_controller/metal/helpers.rb#L8

## helperの呼び出し

- viewでhelperで定義したメソッド名を指定するだけ

```ruby:Atest_helper
module AtestHelper
  def test
    "testA"
  end
end
```

```ruby:viewで呼び出す
<h1><%= test %> #testAが表示される
```

- 異なるヘルパーファイルで同名のメソッドがある場合は注意

helperを全てincludeしていると意図していないメソッドが呼ばれる可能性があるので注意。
以下のようなケース。

```ruby:Atest_helper
module AtestHelper
  def test
    "testA"
  end
end
```

```ruby:Btestb_helper
module BtestHelper
  def test
    "testB"
  end
end
```
```ruby:view
# AtestHelperかBtestHelperどちらが呼ばれるか分からない
<h1><%= test %></h1>
```
Python  __name__ と __main__

# メモ

test.pyを実行すると
→HelloWorld
test2.pyを実行すると
→




```py3:test.py
def test():
  print('Hello World')

if __name__ == '__main__':
  test()

print('モジュール名:{}'.format(__name__))
```

```py3:test2.py
import test
```
Pythonで選択ソート

# Pythonで選択ソートを実装

```py3:選択ソート.py
#!/usr/local/bin/python3
# -*- coding:utf-8 -*-
array = [12, 13, 11, 14, 10]

## main関数
def main():
    # While か for を選ばせる
    how = input("Sort by For Loop (y/n)")

    # 処理
    if(how == "y"):
        forloop()
    else:
        whileloop()

    # 結果を出力
    print("result")
    for i in range(len(array)):
        print(array[i], end=',')
    print("")





## while loop でソート
def whileloop():
    global array
    i=0

    while(i<len(array)-1):
      indexMin = i
      j = i+1

    # 最も小さい値を探す
      while(j<len(array)):
        if(array[j]<array[indexMin]):
          indexMin = j
        j = j+1

    # 入れ替え
      tmp = array[i]
      array[i] = array[indexMin]
      array[indexMin] = tmp

      i = i+1





## for loop でソート
def forloop():
    global array

    for i in range(len(array)-1):
        indexMin = i
    # 最も小さい値を探す
        for j in range(i+1, len(array)):
            if(array[j]<array[indexMin]):
                indexMin = j

    # 入れ替え
        tmp = array[i]
        array[i] = array[indexMin]
        array[indexMin] = tmp





## 実行
if __name__ == '__main__':
    main()
```
SimpleAnimationでisPlayingが常にtrueを返す件

Unity初心者の備忘録的な何かです。
初投稿なので色々至らないところあるかも。

Unityのステートマシンがめんどくさすぎるので何か手を抜ける方法はないかと探してたもんですが、
何やらUnity公式が配布しているコンポーネントに[SimpleAnimation](https://github.com/Unity-Technologies/SimpleAnimation)なるものが。
これで楽できる！
と喜んだのも束の間。

# isPlayingがfalseにならない

再生が終了したタイミングで処理させたいところがあったので、``isPlaying``で再生中かどうか確認。
ところが、アニメーション再生中だけ``true``になるはずの``isPlaying``が、待てど暮らせど``false``にならない。

```AnimationTest.cs
SimpleAnimation anim = GetComponent<SimpleAnimation>();
if(!anim.isPlaying){	//<- falseのとき動くかんじにしたかった
	//実行したい処理
}
```

元々アニメーション関連は避けて通っていたのでイマイチ原因が分からず詰み。。。
アニメーション名を指定できる関数版の``IsPlaying()``でも同じでした。


# 原因
このまま悶々とするのも嫌なので、``SimpleAnimationPlayable.cs``の中身とかを覗いたりしてみました。

どうも、読み込んだAnimationClipのWrapModeが**Once**の場合はきちんと終了するようなのですが、
何も設定していないと**Default**で読み込まれてしまい、終了処理に引っかからないみたいです。

自分は外側からWrapModeを設定する方法がいまいち分からなかったので、
SimpleAnimationPlayableの``DoAddClip()``中に「WrapModeがDefaultのときはOnceにする」という処理を加えて強引に終わらせる事に。

```
if(newState.wrapMode==WrapMode.Default) newState.wrapMode = WrapMode.Once;
```

~~これでとりあえず終了処理が効くようになりました。~~
**2018/01/27追記：**
newStateが取得された直後に``Once``にしてしまうと、Animationファイルの``isLooping``がオンになっていても強制的に単発再生になってしまっていました。よく考えたら当たり前だ・・・
なので、``isLooping``が``true``かどうかを見てから上記のコードを差し込めば、ループも動くようになると思います。
もっといい方法がありそうだけど思いつきません:pensive:



元のコードとかライセンス的に書いていいのかよく知らないのでこんな説明になっちゃいました。わかりにくい・・・
とにかく、はやいとこ修正来てほしいです:cry:
Powershell サービスの実行状態を確認する関数


* Service_Status_Check_Loop.ps1


```ps1

#### 関数定義

<# サービス状態確認関数
    
    サーバー起動後に自動起動のサービスが上がっているか確認するための関数

    チェック間隔(秒)ごとにサービスの状態を取得し、期待値を取得した場合に0を返す。
    チェック回数の上限になっても期待値が取得できない場合、1を返す。

      第一引数：サービス名
      第二引数：期待値(Running/Stopped)
      第三引数：チェック間隔(秒)
      第四引数：チェック回数の上限

#>

function Service_Status_Check_Loop ($SERVICE_NAME,$HEALTH,$Span,$Upto) {

# カウント用変数初期化
$cnt = 0

    # 無限ループ
    while ($true) {

      # チェック回数カウントアップ
      $cnt++

      # サービス状態取得
      $SERVICE_STATUS = Get-Service |?{$_.name -match $SERVICE_NAME}|%{$_.Status}

      # サービス状態判定
      switch ($SERVICE_STATUS) {
        "$HEALTH" {return 0}  # 期待値だった場合に0を返す
        default   {if ($cnt -eq $Upto){return 1}} # チェック回数の上限に達した場合、1を返す
      }

      # 期待値でなく、チェック回数の上限に達していない場合は、指定間隔(秒)待機
      sleep $Span

      # 無限ループに戻る

    }

}


#### 処理開始

# サービス名
$SERVICE_NAME_01="WinRM"

# 期待値(Running/Stopped)
$HEALTH_01 = "Running"

# チェック間隔(秒)
$Span_01 = 3

# チェック回数の上限
$Upto_01 = 10

# サービス状態確認関数の実行
$LAST_CODE = Service_Status_Check_Loop $SERVICE_NAME_01 $HEALTH_01 $Span_01 $Upto_01 

# 終了
exit $LAST_CODE

```
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十六章 大規模な構造5 着脱可能なフレームワーク / まとめ

# これまでの１６章
[進化する秩序](https://qiita.com/YasuhiroKimesawa/items/b6c42408b7912fd691b5)
[システムのメタファ](https://qiita.com/YasuhiroKimesawa/items/692d173aa24921f8fea1)
[責務のレイヤ](https://qiita.com/YasuhiroKimesawa/items/f5bc58d32fb0c5b81a3c)
[知識レベル](https://qiita.com/YasuhiroKimesawa/items/a6b5043549c5fa4567a0)

# 着脱可能なフレームワーク

共有カーネル内の抽象化されたコアをフレームワーク化する。

同一のドメインで多くのアプリケーションが作られた環境・組織であれば、可能かもしれない。

フレームワーク化されれば、同じドメインで仕事をする他社との連携、自社の多くのアプリケーションに適用できる。

・・・難しそうですね。
本当に同じドメインで数をこなして、深いモデルが成熟された段階であれば可能かもしれません。
長い期間ドメインと向き合う必要があるのでしょうね。

# 大規模な構造まとめ

大規模な構造は、ともすれば大きなリファクタリングを実施する必要も生じ、ウォーターフォールっぽい印象もありますが、実際はイテレーションとインクリメントから深いモデルを理解した上で実施可能となるものでした。

この段階になれば、たとえ大きく構造を変えることとなっても、意外と大変ではないのかもしれません。
そして、大規模な構造を進化させることができたあかつきには、さらに蒸留が進み、さらに深いモデルにたどり着けると思います。

メタファや着脱可能なフレームワークはなかなか難しそうですが、責務のレイヤや知識レベルで構造化のアイデアが浮かぶころには、きっとプロジェクトも中盤から終盤にかかるころだと思います。
そのとき、それを実施する勇気をチームで出すことが大事ですね。
賢い機械翻訳を試そう!Watson Language Translation プレビュー版サンプルアプリ

(2018-01-26追記)画面を使いやすいように修正しました。

Watson APIのうち、機械翻訳のAPI(Language Translation)は今まで従来型のアルゴリズムを使っていたため、残念ながらあまり精度がよくなかったです。
しかし、2018-01-12に英日・日英に関しては、深層学習モデルを使ったAPIがプレビュー版として公開されました。
[参考リンク](https://console.bluemix.net/docs/services/language-translator/release-notes.html#release-notes)
そこで、元々あったサンプルアプリを一部改修して、プレビュー版を呼び出すサンプルアプリを作ってみました。
導入手順は、リンク先のREADME.mdに記載されていますが、5,6個のcfコマンドを実行するだけの非常にシンプルなものとなっています。
是非、自分のIBM Cloud環境にデプロイしてその精度を試してみて下さい。
まだ、IBM Cloudのアカウントを持っていない方は、クレジットカード登録なしのライト・アカウントでこの機能を試せますので、この機会に是非アカウント登録を含めてお試し下さい。
アカウント登録手順に関しては、[IBM Cloud (aka Bluemix) ライト・アカウント作成手順](https://qiita.com/KenichiSekine/items/249d2ff691b6565fb127)を参照されて下さい。

[導入ガイド(Github README.md)](https://github.com/makaishi2/language-translator-preview/blob/master/README.md)

翻訳例

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/206130/b2c6f874-92de-6a77-baf4-8bd68ca05111.png)
ネットワークの監視

ネットワークの監視の学過ぎ問題の保証見つける だろう。ネットワークの監視はあまり難しくないです。**あなたはLINUXとBRO要ろう**。

BROはコマンドラインインターフェイスでそ。あなたのオペレーションシステムはLINUXですなら、ここにダウンロードください

https://www.bro.org/download/index.html

`[.../bro/bin]`に`sudo[./broctl]`実行ください。

あなたはこれ見えるすべき

```
Welcome to BroControl 1.7

Type "help" for help.

[BroControl] > 
```
それはBROのインタフェースです。[start]書こうなら、`[.../bro/logs]`助けるます。`[.../bro/logs]`はネットワークの情報持つです! たとえば、`[x509.log]`は証明証もつです。あなたは止ま行きたいなら、`[BroControl]`に`[stop]`書いてください。
Firefox 58 でも、Shift + マウスホイールで「戻る/進む」をできるようにする方法

（この記事は [地平線に行く](http://d.hatena.ne.jp/chiheisen/20180124/1516810415) とのマルチポストです）

今日リリースされた Firefox 58 で、**Shift + マウスホイールで横スクロールができないという有名な<font color="red">16年物のバグ (?)</font> が修正されました。**

ただ、もともと Windows 版 Firefox では Shift + マウスホイールは「戻る/進む」に割り当てられていました。これが、上記の対応によりできなくなりました。
自分はこれを使っていたので、超困ります…。


そこで調べてみたら、**<font color="red">Alt + マウスホイール</font>で同じことができるようになっているそうです。**
（ただし、Alt を離すタイミングでメニューバーが出てきます）

もしくは、**about:config で mousewheel.with_shift.action を 2 にすれば今までどおりの挙動に戻すことも可能。**
どーしても今までどおりがいいという人はこちらを試してみるのもありかと。

## なんで挙動変えたの

[Bug 143038 Make users can scroll contents horizontally with vertical wheel operation with a modifier r?smaug | Diff Viewer | Review Board](https://reviewboard.mozilla.org/r/186794/diff/5#index_header)
このコミットコメントによれば、Webアプリケーション開発者が macOS かどうかをチェックす必要がなくなる（もともと macOS だと、OS標準に合わせて Shift + マウスホイールの横スクロールに対応していた）こと、Chromium と同じ動作になることが理由だそうです。
ようするに、互換性を重視した結果ということ。

## 参考資料

[マウスホイールでページをスクロールする際の小技（Firefox 58以降） - Mozilla Flux](http://rockridge.hatenablog.com/entry/2018/01/24/004355)
インターネットの安全

会社または国ば利用者の権利に違反した。。。利用者はそれに気がつか。そのため、**開発者ばソフトを開くの工具作った**！ 
#DuckDuckGo
安全なブラウザです。プライバシー保護を尊敬。[試みるにここをクリックください](https://dev.to/terceranexus6/duckduckgo.com)

![](https://res.cloudinary.com/practicaldev/image/fetch/s--kadyOPE_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.duckduckgo.com/iu/%3Fu%3Dhttp%253A%252F%252Fwww.technobuffalo.com%252Fwp-content%252Fuploads%252F2014%252F09%252FDuckDuckGo-Logo.jpg%26f%3D1)

#HTTPS EVERYWHERE
あなたはHTTPプロトコル案じるですか
[試みるにここをクリックください](https://www.eff.org/https-everywhere)

![](https://res.cloudinary.com/practicaldev/image/fetch/s--2LRqa3Jn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.duckduckgo.com/iu/%3Fu%3Dhttps%253A%252F%252F2.bp.blogspot.com%252F-5ahOO1RokZo%252FWP0HNlqTCKI%252FAAAAAAAAAwY%252FGJjxDQtnTikWVMT1NehGJCfVq8WhGYjpQCEw%252Fs1600%252Fhttps-everywhere-logo_0.png%26f%3D1)

#PRIVACY BADGER
COOKIESば消す。[試みるにここをクリックください](https://www.eff.org/privacybadger)

![](https://res.cloudinary.com/practicaldev/image/fetch/s--Iyn8bV4i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.eff.org/sites/all/themes/badger/badger-stroke.png)

#PROTONMAIL
安全な[電子メール](https://protonmail.com/)。

![](https://res.cloudinary.com/practicaldev/image/fetch/s--N3D78Rgv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.duckduckgo.com/iu/%3Fu%3Dhttp%253A%252F%252Fwww.zdnet.de%252Fwp-content%252Fuploads%252F2015%252F11%252Fprotonmail.jpg%26f%3D1)

以上。安全に楽しむ
AWSのSESでLaravelからメールを送ろう

なんだかめちゃくちゃハマった。ゲロゲロ

# AWSのメール機能

Simple Email Serviceというのが機能してる。
大まかには

1. ドメイン登録
2. アドレス認証(既にメールが受け取れるアドレスで！gmailとかでよい)
3. AWSサポートへの制限解除依頼
4. SMTP設定
5. IAMユーザー作成

が必要になる。多分、これを読んでくれてる人は、独自ドメインでメールを送りたいという勝手な思い込みが入っている。

## Laravelのenv設定

```
MAIL_DRIVER=smtp
MAIL_HOST=email-smtp.us-east-1.amazonaws.com
MAIL_PORT=587
MAIL_USERNAME=AKISJT76GP4M7ZI3MJQA
MAIL_PASSWORD=AlUtz238aIAlIHvoawJfz2yDmj8HpD95BGKX/1kbIe0H
MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_USER=EXAMPLE
MAIL_ENCRYPTION=tls
```

これをenvに貼れば良い。

```
MAIL_USERNAME=
MAIL_PASSWORD=
```

これはIAMユーザーを作った時に「今回しかダウンロードできません！！！」って忠告されるあれだ。
２つのリストをキーと値のmapとしてマージする

Enum.into()は、リストをマージするのに、なかなか便利に使える

```elixir
defmodule MapList do
	def zip( list1, list2 ), do: Enum.into( List.zip( [ list1, list2 ] ), %{} )
end
```

たとえば、Ectoで直接select文を流した後の結果は、columnsというリストと、rowsというリストのリストで別々のアイテムで返ってくるが、この2つをマージして、columnsの各値をキーとするmap_listに変換することができる

```elixir
Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
|> Tpl.ok
|> rows 
|> Enum.map( &( MapList.zip( columns( result ), &1 ) ) )
```

これをPhoenixのindex.html.eexなんかでforで回すと、けっこう便利な書き方ができる

```erb
<table>
<tr>
<%= for caption <- map_list |> List.first |> Map.keys() do %>
	<th><%= caption %></th>
<% end %>
</tr>
<tr>
<%= for record <- map_list do %>
	<%= for column <- record |> Map.keys() do %>
	<td><%= record[ column ] %></td>
	<% end %>
<% end %>
</tr>
</table>
```

なお、列に日時型があると、上記のままではエラーになってしまうので、[日時タプルから文字列への変換をしてあげる](https://qiita.com/piacere/items/264e0aa261eac072d7c5)
PART 1/8: bitcoinとブロックチェーンとは？

## Introduction to Bitcoin
![bitcoin.jpg](https://qiita-image-store.s3.amazonaws.com/0/212959/953a9a5e-c205-239f-0732-d4eea809d7dd.jpeg)
Image: bitcoin.org


ビットコイン、ブロックチェーンを理解するのに随分時間がかかりました。周りの人もよくわからなさそうでした。たくさんの人にビットコイン、ブロックチェーンについて聞いても、いろんな答えが返ってきました。

なので、様々な本を読んだり、たくさんの人と話したり、ビットコインのソースコードを勉強した結果、知りたいことを全部理解できました。

例えば:

・ビットコインとは何か？

・仮想通貨は、なんで価値がある？

・ビットコインをどう「マイニング」する？

・ブロックチェーンは何？ビットコインとはどう違う？

・１つのビットコインをどう分裂させる？

でした。

今後はブロックチェーンテクノロジーとそれでできたビットコインに書いていきます。

上記に書いた疑問に対する答えを詳しく説明しようと思っています。

エンジニアとして、新しいものをどう動くか、詳しく知りたいです。これからこういう記事を書いていきます：

Part 1 - ビットコインの紹介 (2018/1/25)

Part 2 - ビットコインはどう動くのか

Part 3 - キー、アドレス、ウォレット（財布）

Part 4 - トランザクション

Part 5 - ビットコインネットワーク

Part 6 - ブロックチェーン

Part 7 - マイニング

Part 8 - まとめ、おすすめの参考

ビットコインについて最も良い本は、「Mastering Bitcoin」です。

参考：https://bitcoinbook.info/ 日本語版もあります。

この本はプログラマー向けの本で、読むのが難しいかもしれないので、上記のシリーズで簡単にまとめていきます。

## <center>1. ビットコインとは何か？</center><br>


これらの3つが一緒になると、デジタルマネーエコシステムを形成します。

ビットコインネットワークの参加者（ノードとも言える）間の通信はインターネットを通じて行われますが、

通信は別のプロトコールも可能です。

ビットコインは通貨と同じようにbitFlyer, Coinbaseなどの取引所で購入できます。

日本円やドル等の本物の通貨と違って、ビットコインは全くの仮想通貨です。ビットコインはユーザーのトランザクションだけで存在します。暗号理論のアルゴリズムとプロトコールに基づいて開発されました。

ビットコインに通じてユーザーは送受信したら、トランザクションを証明することもできます。

ビットコインの一番いい点の一つは、分散システムであることです。

政治、銀行を通じて配られた通貨と違ってビットコインは世界のどこにでもある数千のノードに保存されます。bitcoinのフルクライアントまたは"フルノード"と呼ばれるタイプのクライアントはマイニングもできます。

bitcoinは「マイニング」というプロセスで作成します。詳しくいうと、マイニングというのは、ネットワーク上で設定される難易度に合わせて数学的な解を見つけ出すプロセスです。

平均して１０分に一回の頻度で関数的な解を見つけます。見つけたマイナーはその間のトランザクションを検証して、発見者にご褒美として新たなbitcoinを与えられます。

このプロセスで、10分に一回の頻度で新たなbitcoinが生み出します。bitcoinが新たに発行される頻度は４年毎に半減されます。現実世界で、政治は通貨を新たに発行するので、インフレーションがあります。bitcoinはあらかじめ予算が組まれている通貨発行より発行ができないため、インフレーション状態になることはありません。

今後の記事でもっとbitcoinの詳細のことを説明します。わからないこと、はっきりしていないことがあれば、または間違っている問題があれば知らせてください。

### <center>今後の記事で使う単語帳</center><br>

__アドレス__
アドレスとパブリックキーは同じ意味です。1から始まる数字と文字の連なりです。例：1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV

__bitcoin__
bitcoinは３つのことに使います。bitcoin仮想通貨、bitcoinクライアントをインストールしたノードに通じて繋がったbitcoinネットワーク、とそのソフトウェアです。

__ブロック__
グループに求められたトランザクションのこと。タイムスタンプと一つ前のブロックの参考が刻印されています。ブロックヘッダーのハッシュが求められることでproof of workが作られて、それによってそのブロックのトランザクションが検証されます。

__承認__
トランザクションがブロックに含まれると、「承認」が２だと言えます。同じブロックチェーンでそのブロックにもう一つのブロックが繋がると、トランザクションの承認数が２つになります。６認証数以上になると、トランザクションが覆されない十分な証拠だとみなされます。

__手数料__
トランザクションの送り手はネットワークにそのトランザクションの処理をするためにしばしば追加します。ほどんとのトランザクションは手数料は0.5m　BTC (20 satoshis)という最少の手数料で処理されます。

__ハッシュ__
数学的なテジラルフィンガープリントです。

__マイナー__
ビットコインネットワークのソフトウェアがある人。「ノード」とも言えます。そのソフトウェアでハッシュ値の算出を繰り返すことで有効なproof
of workを見つけ出してbitcoinを新たに生み出せます。

__Proof of work__
見つけるために相当量の計算を要するデータ。マイナーは、ネットワーク全体に設定されたdifficultlyターゲットを満たすSHA256に対して、解を見つけなければなりません。

__Satoshi__
bitcoinの最小単位。1 satoshi = 1/100 000 00 BTC.

__秘密鍵__
アドレスに紐づけられた番号。送られたbitcoinを解錠するために必要となります。なくなったら、その送られたbitcoinを返すことができません。

__ウォレット__
アドレスと秘密鍵を格納するソフトウェア。bitcoinを送ったり保有することに用います。
関数を引数で渡して、渡した先で関数を走らせる

処理の大半は、同一の処理を共有したいけど、一部だけ挙動を変えたい、といったとき、関数を引数で渡すテクニックが、役に立つ

下記の例は、HTTP GETでJSON API結果を拾った後に、list_mapを加工する関数を引数渡しして、加工後を返す例

```ex
defmodule Json do
	def get( domain, path, header \\ [], map_function \\ &nop/1 ) do
		domain <> path
		|> HTTPoison.get!( header )
		|> parse( map_function )
	end

	defp parse( response, map_function ) do
		response
		|> get_body
		|> Poison.decode!
		|> map_function.()
	end

	defp get_body( %{ status_code: 200, body: body } ), do: body
	defp nop( map_list ), do: map_list
end
```

呼び出し側は、こんな感じで、「&」とアリティ付きで指定する（未指定時は、デフォルト引数で無加工の関数が呼ばれる）

```ex
defmodule GithubWrapper do
	def run(), do: Json.get( "https://api.github.com", "/rate_limit", &pick_rate/1 )
	defp pick_rate( %{ "rate" => rate } ), do: rate
end
```

無名関数って、Enum.map()等の高階関数の中で使うケースは多いけど、function.()の形式で使うことは少ないんだが、上記みたいなライブラリ／FW側を作るときには、案外、重宝する

あと、こうしたケースをスマートに書くには、「渡す関数の引数を1個に限定する」という、モナドっぽい考え方がコツ
Redis Sentinel構築

# はじめに
他のRedis構築に関するページは以下をご参考ください。
[Redis構築のまとめ](https://qiita.com/ono-soic/items/d63ac849ebccee68b5bc)

▽参考にさせていただきました
http://qiita.com/toshiro3/items/931ededeece6b8b1c680

## Redis Sentinelとは
SentinelがRedisのレプリケーションの状態を監視し、
マスタのダウンを検知すると任意のスレーブがマスタへ昇格してくれる監視プロセス

## 環境
CentOS 6.8
Redis 3.2.5

## 構成

| IPアドレス | ポート番号 | 役割 |
|:--|:--|:--|
| 192.168.56.111 | 6379 | Master |
| 192.168.56.112 | 6379 | Slave |
| 192.168.56.113 | 26379 | Sentinel |
| 192.168.56.113 | 26379 | Sentinel |
| 192.168.56.113 | 26379 | Sentinel |

## 各種設定

### Master/Slaveサーバのredis.conf設定

```
$ vim /etc/redis/6379.conf
daemonize yes
```
デーモンとして使わないのならこの設定はしない

### Sentinelサーバのredis.conf設定

```
$ vim /etc/redis/6379.conf
slaveof 192.168.56.111 6379
```
台数を増やす場合は追記サーバに上記と同様の設定を追加

Masterのレプリケーション確認

```
192.168.56.111:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.56.112,port=6379,state=online,offset=15,lag=0
master_repl_offset:15
repl_backlog_active:1
repl_backlog_size:1048576
```
192.168.56.112がレプリケーション設定されていることがわかる

Sentinelサーバのsentinel.conf設定
(詳細設定は[sentinel.confの設定内容](https://qiita.com/ono-soic/items/0cf12fedf772229c95ee)参照)

```
$ cp  -p /usr/local/redis-3.2.5/sentinel.conf /etc/redis/26379.conf
$ vim /etc/redis/26379.conf
---
protected-mode no //もしくはbindに「0.0.0.0」を設定
port 26379 //プロセス毎にポート番号を+1する
daemonize yes
pidfile redis_sentinel.pid
dir /var/run/redis
sentinel monitor mymaster 192.168.56.111 6379 2
logfile "/var/log/redis/sentinel_26379.log"
loglevel notice
---
```

上記「sentinel monitor mymaster 192.168.56.111 6379 2」の「2」はsentinelでMasterが落ちたと検知したらフェールオーバするための件数(Sentinelが2台検知したらフェールオーバする)

protected-modeが無効になっていないと自動フェールオーバができない
参考)http://kenken0807.hatenablog.com/entry/2016/06/10/103656
 

## sentinelのスクリプト化
service redis startみたいにredis-sentinelも開始できるようにする(redisをスクリプト化してなかったら[Redisインストール〜起動まで](https://qiita.com/ono-soic/items/efbbf56fbbc8d4b44a07)を参照)

```
$ cp -p /etc/init.d/redis /etc/init.d/redis-sentinel // 複数プロセス設定時はredis-sentinel-80,81と設定
$ vim /etc/init.d/redis-sentinel
#chkconfig:345 75 15
REDISPORT=26379 //プロセス毎にポート番号を+1する
EXEC=/usr/local/bin/redis-sentinel
PIDFILE=/var/run/redis/sentinel_${REDISPORT}.pid
  
$ service redis-sentinel start
Starting Redis server...

$ sudo chkconfig redis-sentinel on //自動起動する場合は設定
```

これでredis-sentinelをserviceコマンドが使用できるようになる

※同サーバでsentinelを複数自動起動する場合は、chkconfigの優先度をそれぞれ変更すること

例：「chkconfig: 345 75 15」「chkconfig: 345 76 16」みたいに
引数指定したキーでmapを掘り下げる

関数パターンマッチや、Enumでのパターンマッチでは、通常、mapのキーを指定するケースが多いが、たとえば、mapの値にリストを持っていて、掘り下げていくケース（HTTPoisonによるJSON API呼出結果のパースなど）では、可変のキーを指定したい

```elixir
def dig(map, key) do
	%{^key => value} = map
	value
end
```

「^」を書かないとコンパイルエラーになる

【2018/01/25追記】
上記とは別の取り方で、[get_in()とAccess()で取得](https://qiita.com/niku/items/9a0cb99a2a0e8bcc6fbb)できる模様
Redis構築のまとめ

# はじめに
自社でRedis導入のため、構築や検証をしてナレッジにまとめていたのでQiitaにあげようと思いました。
2017年初旬の構築なので一部古いところはありますが、参考になれば幸いです。
本まとめに使用されているサーバはCentOS6なので、起動コマンドやパスが異なる場合はよしなに変更してください。

<font color="Red">※検証の際に様々なサイトを参考にさせていただきました。一部別の記事と被る点があるかもしれません。丸コピペしていたら修正しますのでご指摘ください。なるべく参考URLは添付いたします。</font>

# ページ一覧
随時更新していきます。

| No | 内容  |
|:--|:--|
| 1 | [Redisインストール〜起動まで](https://qiita.com/ono-soic/items/efbbf56fbbc8d4b44a07) | 
| 2 | [redis.confの設定内容](https://qiita.com/ono-soic/items/ebebbf6b687437d3f75c) |
| 3 | [Redis Cluster構築](https://qiita.com/ono-soic/items/56661d468989c6036852) | 
| 4 | [Cluster構築時のエラーまとめ](https://qiita.com/ono-soic/items/d064f4db0e66249f7c85)
| 5 | [Redis Sentinel構築](https://qiita.com/ono-soic/items/b1437b30f0e3659dc169) | 
| 6 | [sentinel.confの設定内容](https://qiita.com/ono-soic/items/0cf12fedf772229c95ee) |
| 7 | [Redis Replication検証](https://qiita.com/ono-soic/items/d7a3de5f8f859c4add79) |
| 8 | [Redis Cluster検証](https://qiita.com/ono-soic/items/a41044c977da5231297b) |
| 9 | [Redisの各構成比較](https://qiita.com/ono-soic/items/919797be056b5c348ed6) |
| 10 | [Redisのメモリ検証](https://qiita.com/ono-soic/items/46e8620dcaea3d7afda5) |
{ :ok, result }をパイプ中で処理するためのモジュール

File.open()やTimex.parse()のような、タプルで結果を返す処理をパイプで処理するために、関数パターンマッチで:okや:errorを捉える関数を持つモジュールを用意すると、パイプの途中で止めなくて済む

```elixir
defmodule Tpl do
	def ok( { :ok, result } ), do: result

	def error( { :error, result } ), do: result

	def both( { :ok, result } ), do: result
	def both( { :error, result } ), do: result
end
```

both()を使うと、:okと:errorの両方を次に流す
GoogleHomeで体重を記録してLINE Notifyでトレンドグラフを送信

# ざっくりストーリー

1. GoogleHomeに「ねぇGoogle, 体重 ●●キロ」
2. レスポンス「●●キロですね」
3. LINE Notifyでスマホに推移グラフを表示

独自性があるとすれば、新規でグラフ作成せずに、既存グラフを画像にしてLINEに送付ですかね。

# GoogleHomeからIFTTT経由でGoogleスプレッドシートへ入力

- こちらを参考にレシピを作成
 - https://qiita.com/miso_develop/items/be562d8a823ad2639d94
- CreateAtは未だに使えないのでGASを必要あり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/6f41ca30-1390-eb30-1a53-54326f878a62.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/ae274615-59ab-f670-7e28-740d7c8e1405.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/620c68a8-5e04-43ba-9a34-bb0dcb58d5da.png)

# Googleスプレッドシートへの入力を検知して日時データ保管

- さきほどと同じQiita記事から、そのままコードをもらったのでリンク参照
 - [Google Home、IFTTT、Googleスプレッドシートを使って独自音声コマンドでログをとる](https://qiita.com/miso_develop/items/be562d8a823ad2639d94#google%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88)

# 通常のスプレッドシートと同じようにグラフを作成して、それをLINE Notifyに送る

新規グラフを毎回生成するのは手間だし、レイアウト調整が大変そうだったので、いつも通りに作ったグラフを送付したい。できるはずでしょ。ということで、

- [GAS（Google Apps Script）でグラフ（Google Chart Toolsで）をメールに埋め込んで送信する](https://qiita.com/Humangas/items/e4c82e712963647ffcc7)
- [Google Apps Script入門  第32回．グラフ](http://excel-ubara.com/apps_script1/GAS032.html)


```javascript
function sendGraph(){
  var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
  var graphs = mySheet.getCharts()
  for(var i=0; i<graphs.length; i++ ){
      var pic = graphs[i].getBlob();
      sendHttpPostImage("体重トレンド",pic)
  }
}

function sendHttpPostImage(message, blob){
  var token = "[access_token]";

  var formData = {
   'message' : message,
   'imageFile': blob
  }
  var options =
   {
     "method"  : "post",
     "payload" : formData,  // message, imageFile を formData としてPost
     "headers" : {"Authorization" : "Bearer "+ token}
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
```

上手いこと出来ました。