OmniAICreator/Qiita-1.07M huggingface dataset:
【クイズ】Pharo/Squeak Smalltalk の (6 + (1 to: 12)) squared sum の Ruby への直訳、(6 + (1..12)).squared.sum #=> 2018 が動作するようにモンキーパッチを当てよ

t/o

#解説

Squeak Smalltalk やその派生である Pharo には APLっぽい配列演算が組み込みの機構として用意されています。

```Smalltalk
(6 + (1 to: 12)) squared sum "=> 2018 "
```

ちなみに本家の APL では同じことを次のように書くことができます。

```APL
+/(6+⍳12)*2
```
https://tio.run/##SyzI0U2pTMzJT////1HvXAXHAB@uR31TH7VN0NbXMNN@1LvZ0EhTy@j/fwA

念のため ⍳(iota) は 1 から与えられた値までの数列を、+/ は要素の合計を返します。あと、APL では * を乗算ではなく累乗をあらわすのに使うようです。


#ヒント
当該機構は他の Smalltalk、例えば GNU Smalltalk には無いので、次のように（足りないメソッドを含めて）補ってやらないと件の式はここでの期待通りには機能しません。（GNU Smalltalk は他の Smalltalk には無い、<code>クラス名 extend []</code> や <code>メッセージパターン []</code> でクラス拡張やメソッド定義が可能な構文を持っています。為念）

```Smalltalk
Interval extend [
	generality [ ^ 300 ]
	coerce: aNumber [ ^ Array new: self size withAll: aNumber ]
]
 
Array extend [
	+ other [ ^ self with: other collect: [:x :y | x + y] ]
	squared [ ^ self collect: [:x | x * x] ]
	sum [ ^ self inject: 0 into: [:acc :x | acc + x] ]
]
 
(6 + (1 to: 12)) squared sum displayNl "=> 2018 "
```

https://ideone.com/MgwIOX

これが、クイズを解くのに参考になるようなならないようなヒントです。

なお、Ruby は Smalltalk 同様、通常の言語の演算子もレシーバーのクラスに定義されたメソッドにすぎないので、<code>(1..12) + 6</code> ではなく <code>6 + (1..12)</code> とすることで難易度を上げてみました。

#解答例

```Ruby
class Range
	def coerce(n)
		[(first+n..last+n).to_a, []]
	end
end
 
class Array
	def squared
		map{ |x| x**2 }
	end
end
 
p (6 + (1..12)).squared.sum #=> 2018
```

2.4 より前の Ruby では sum も別途定義が必要です。

https://ideone.com/O2YmtL

もとより、ケント・ベックの仮実装ばりに酷いコードですので、あとの改良はお任せします。^^;

追記：もう少しまともにした版

```Ruby
class Range
	def coerce(n)
		case caller[0].match(/`(.*)'/)[1]
		when "-"
			[self.class.new(-last, -first, exclude_end?), -n]
		else
			[self, n]
		end
	end

	def +(n); first+n..last+n end
	def -(n); first-n..last-n end
	def *(n); (first*n..last*n).step(n) end
end

module Enumerable
	def squared
		map{ |x| x**2 }
	end
end

p (6 + (1..12)).squared.sum #=> 2018 
p (6 - (1..12)).squared.sum #=> 146 
p (6 * (1..12)).squared.sum #=> 23400 
p ((1..12) + 6).squared.sum #=> 2018 
p 6 - (1..12) #=> -6..5 
p (1..12) - 6 #=> -5..6 
p ((1..12) - 6).squared.sum #=> 146 
p ((1..12) * 6).squared.sum #=> 23400
p ((1..12).squared * 36).sum #=> 23400
```

https://ideone.com/TMUN29
Unity：Ｓｐｒｉｔｅをある領域だけにする方法

Unity：Ｓｐｒｉｔｅをある領域だけにする方法
UnitySpriteをある領域だけ抜き出して生成したい(または既にあるSpriteをコライダーなどに沿ってそぎ落とし成型したい)のです
それも矩形ではなくポリゴンのように自由な形で、またランタイムに生成する形として行いたいのですがどうすればよいでしょう

再現するゲームはNotTetrisです。1段だけ削除された際の欠片の絶妙な残り具合の再現が出来ず困っています
どうかご助言お願いします
Linux上でWindows共有フォルダをマウントする時に"mount error(112): Host is down"エラーが発生

# 結論

mount.cifs で Windows(10以降？)の共有フォルダをマウントするときは、
"vers=2.0" のオプション(もしくは"vers=3.0")をつけること

```mount.cifs  //192.168.1.1/share /mnt/share -o vers=2.0,username=user```

# 参考

https://serverfault.com/questions/414074/mount-cifs-host-is-down
Go言語のCLIからInfluxdbに為替情報を入れてGrafanaで可視化する

# はじめに

為替情報を取得できるOANDA APIについてのWrapperとそれを使用したコマンドラインツール(goanda)をGo言語で作成しました。さらに、goandaとinfluxdbとgrafanaを使用して、為替情報を可視化しました。可視化までについてDocker Composeにまとめました。

# 環境

実際に試した際の環境です。

* Ubuntu 17.10
* Docker 17.12.0-ce
* Docker Compose 1.8.0

今回使用したものです。

* OANDA APIのWrapper
    * 通貨ペア一覧、現在と過去のAskとBid、AskとBidについてのストリーミングデータのみ
        * https://github.com/mmm888/exchange-api-go#usage
* goanda
    * https://github.com/mmm888/exchange-api-go/tree/master/cmd/goanda#usage
* Docker Compose
    * https://github.com/mmm888/exchange-api-docker/blob/master/docker-compose.yml

# 流れ

可視化までの流れです。

1. Docker Composeを起動します。
1. goandaがInfluxDBにデータベースの作成などInfluxDBの初期設定を行います。
1. goandaがOANDA APIを使用して過去データをInfluxDBに保存します。
1. goandaがOANDA APIのStreaming APIを使用してリアルタイムのデータをInfluxDBに保存し続けます。
1. InfluxDBにデータが保存されているので、Grafanaに手動で設定し可視化を行います。

# 実践

実際に起動してみます。

## アクセストークンの取得、設定

* OANDA APIを使用するために口座開設またはデモ口座を開設し、アクセストークンを発行必要があります。
    * https://www.oanda.jp/

```
git clone https://github.com/mmm888/exchange-api-docker
cd exchange-api-docker
cat << '_EOF_' > build/cmd/secret.go
package exchange

var (
    userID = "REPLACE THIS WITH YOUR ACCOUNT ID"
    token  = "REPLACE THIS WITH YOUR ACCESS TOKEN"
)
_EOF_
```

REPLACE THIS WITH YOUR ACCOUNT ID, ACCESS TOKENから発行したアクセストークンに置き換えます。

また、docker-compose.ymlに環境変数を設定して、通貨ペア等の設定ができます。設定できる一覧は[こちら](https://github.com/mmm888/exchange-api-docker#environments)です。 

## 起動

Docker Composeを起動します。

```
docker-compose build
docker-compose up -d
```

## Grafanaの設定

Grafanaが起動しているので、http://127.0.0.1:3000/ にアクセスします。

* User: admin
* Password: admin

![login.png](https://qiita-image-store.s3.amazonaws.com/0/200957/5b3fa725-b2ce-dac5-5768-e3df4474539f.png)

データストアを以下のように設定します。

![datasource.png](https://qiita-image-store.s3.amazonaws.com/0/200957/f1d2bc95-d8ac-96a1-25be-152796246879.png)

グラフを以下のように設定します。

![graph02.png](https://qiita-image-store.s3.amazonaws.com/0/200957/2298ace3-9b2e-d9bd-49c1-44feef64eca4.png)

こんな感じで、可視化できました。

# まとめ

作ったのはOANDA APIのWrappeする部分とそれを使ったコマンドラインツールで、外部サービスを使用して可視化まで行いました。Go言語の勉強 + 外部サービスとあわせて起動するためにDocker Composeの使い方を勉強するのにちょうどよかったと思います。

# 参考

* OANDA API
    * http://developer.oanda.com/docs/jp/
* OANDA API Wrapper & Goanda
    * https://github.com/mmm888/exchange-api-go
* Docker Compose
    * https://github.com/mmm888/exchange-api-docker
オイラー法入門

# オイラー法とは
オイラー法はコンピューター上でで常微分方程式を解くための手法です。
では、具体的にどういう風に常微分方程式を解くのでしょうか？まず、$ \frac{dy}{dx} = f(x, y) $の形にします。まず、初期値$ (x_0, y_0) $を設定します。次の漸化式を使って逐次的に$ (x_n, y_n) $を求めていきます。

```math
\left\{
    \begin{array}{l}
        x_{n+1} = x_n + dx \\
        y_{n+1} = y_n + f(x_n, y_n) dx 
     \end{array}
\right.
```
![a.png](https://qiita-image-store.s3.amazonaws.com/0/108716/aeeb1c61-bbdf-014a-3064-f96846b94d18.png)

これが、オイラー法です。

# ソースコードと実行結果
## ソースコード
$ \frac{dy}{dx} = 2 x $の解を求めるプログラムです。出力結果をCSVにして保存できるようにしてあります。

```euler.c
#include <stdio.h>
#include <math.h>

#define EPS (__builtin_pow(2.0, __builtin_floor(__builtin_log2(1.0e-6))))
#define f(x,y) (2*( x))

int main(){
    double x = 0, y = 0;
    while(x < 2){
        printf("%f, %f \n", x, y);
        y += f(x, y) * EPS;
        x += EPS;
    }
}
```

## 実行結果
このプログラムの実行結果は$ y = x ^ 2 $に近い値が得られるはずです。このプログラムの実行結果をCSVにしてグラフにしてみました
KotlinでBigDecimal

![kotlin_800x320.png](https://qiita-image-store.s3.amazonaws.com/0/107575/a5f2da26-816a-76d6-3446-c4c384063e20.png)

Kotlin を趣味で触り始めて数日ですが, Java の痒い所が丁寧にサポートされていて感動しています. BigDecimal 演算もその一つです.

業務アプリでは数値演算が必要になる事が多いですが, Double は使えたものではないので BigDecimal 一択です. そしてこの BigDecimal 演算は, 可読性が低いことこの上ありません.

# コーディングスタイル比較
## 基本編
```Kotlin:BigDecimalBasicSample.kt
/**
 * BigDecimal coding style : (a + b) / 2
 */
fun main(args: Array<String>) {
    val a = BigDecimal.ONE
    val b = BigDecimal.TEN

    // Java style
    println(a.add(b).divide(BigDecimal.valueOf(2L), RoundingMode.HALF_EVEN))

    // Kotlin basic style
    println((a + b) / 2.toBigDecimal())
}
```
Javaはひどい有様です.
Kotlinは四則演算の演算子を適用できるため, 非常に見やすくなりました. ただ `2.toBigDecimal()` には依然不満が残ります.

## 応用編
```Kotlin:BigDecimalCustomSample.kt

/** custome operator BigDecimal / Long */
operator fun BigDecimal.div(other : Long) : BigDecimal = this / other.toBigDecimal()

/**
 * BigDecimal coding style : (a + b) / 2
 */
fun main(args: Array<String>) {
    val a = BigDecimal.ONE
    val b = BigDecimal.TEN

    // Java style
    println(a.add(b).divide(BigDecimal.valueOf(2L), RoundingMode.UP))

    // Kotlin custom oeprator style
    println((a + b) / 2)
}
```
`BigDecimal / Long` の独自演算子を実装することで, 可読性がより上がりました. 

# 仕組みについて
## Kotlin の演算子の実現方法
Kotlin において演算子は, 決められたメソッドを呼び出すことと等価になります. [Operator overloading](https://kotlinlang.org/docs/reference/operator-overloading.html) において, 各演算子とそれに対応するメソッドが示されています. 四則演算子を抜粋すると以下になります.

| Expression | Translated to |
| -----------|-------------- |
| `a + b` | `a.plus(b)` |
| `a - b` | `a.minus(b)` |
| `a * b` | `a.times(b)` |
| `a / b` | `a.div(b)` |
| `a % b` | `a.rem(b)`, `a.mod(b)` (deprecated) |
| `a..b ` | `a.rangeTo(b)` |

`plus`などのメソッドを `operator fun` で実装することによって, 任意のクラス間の演算子を独自定義することができます. 

## BigDecimal に対する演算子の実装
kotlin-stdlib に含まれている [BigDecimals.kt](https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/kotlin/util/BigDecimals.kt) に演算子の実装が記述されています. サンプルとして除算 "/" の実装を抜粋します. `BigDecimal#divide` が利用されており, 更に引数に `RoundingMode.HALF_EVEN` が使われていることが確認できます.

```Kotlin:BigDecimals.kt
/**
 * Enables the use of the `/` operator for [BigDecimal] instances.
 *
 * The scale of the result is the same as the scale of `this` (divident), and for rounding the [RoundingMode.HALF_EVEN]
 * rounding mode is used.
 */
@kotlin.internal.InlineOnly
public inline operator fun BigDecimal.div(other: BigDecimal): BigDecimal = this.divide(other, RoundingMode.HALF_EVEN)
```
SSHログイン時の"status=0004"エラー

# 結論

"/root" の権限がガバガバすぎた。↓で解決
`(root) # chmod 0600 /root `

"/root/.ssh" あたりの権限もチェックしておくこと

ユーザ名もキチンと確認すること(今回は該当せず)

# 経緯

raspberry pi上のファイル見れるようにしたいなー

よっしゃ！
/root を sambaで見えるようにしたれ！
```(root) # chmod 0777 /root ```

ほんで、 vi /etc/samba/ ...ｹﾞｽﾄｵﾝﾘｰﾃﾞ...ｺﾞﾆｮｺﾞﾆｮ

## 翌日

![[SSH]_error.png](https://qiita-image-store.s3.amazonaws.com/0/179569/deae4a95-b18d-3438-723f-f566ad538896.png)


---------------- {1時間経過} ----------------

わからん、ssh-keygenで鍵変えまくってもだめ・・・ウイルス？
ログ見てもわからんやろな・・・

``` less /var/log/auth.log ```

![[SSH]_log.png](https://qiita-image-store.s3.amazonaws.com/0/179569/d424b376-bb7e-99e2-cc3b-f3a8bb045827.png)

ん？
「bad ownership or modes for directory /root」

ポーン(眼球が飛ぶ音)
EC2インスタンスを〇日後に自動で止める

# またやられた。。。
EC2インスタンスが立ち上がりっぱなしになっていて、多額の請求が来た。。。という経験は誰にでもあるはず。
そこで、atコマンドとaws cliコマンドを組み合わせて、〇日後にインスタンスを自動的に停止するような防衛策を考えました。(〇日後に自動的にインスタンスが停止するだけです。)

# 10日後にインスタンスを自動的に停止するコマンド
自動的に停止したいインスタンスにログインして以下のコマンドを実行する。

```
$ at $(date -d '10 days' '+%Y-%m-%d')
```
すると`at> `という入力待ちモードになるので、以下を入力してEnter

```
aws ec2 stop-instances --instance-ids $(curl -s http://169.254.169.254/latest/meta-data/instance-id)
```
最後にCtrl+Dで入力モードを抜けて終わりです。

# 要素技術の説明
## atコマンド
`at`コマンドは指定された日時にコマンドを自動実行してくれます。使い方は、

1. 日時を指定して`at`コマンドを実行する。
2. `at>`に実行したいコマンドを入力していく。
3. `Ctrl+D`で終了する。

例えば、2020年1月1日の12時34分にtest.txtというファイルを生成するには以下のコマンドを実行します。

```
$ at 12:34 2020-1-1
at> touch test.txt
at> <EOT>
```

`atq`コマンドでジョブができたか確認できます。

```
$ atq
1      2020-01-01 12:34 a ec2-user
```

`at -c`コマンドでジョブの詳細を確認できます。

```
$ at -c 1
```

ジョブの削除は`atrm`コマンドを使います。

```
$ atrm 1
```

## dateコマンド
`date`コマンドは現在日時を返してくれます。現在日時から〇分後、〇日後の日時や、フォーマットを指定して日時を返すこともできます。例えば、現在日時から10日後の日時であれば以下のコマンドで取得できます。

```
$ date -d '10 days' '+%H:%M %Y-%m-%d'
01:09 2018-01-12
```
`'10 days'`の部分を必要に応じて変更して使ってください。
ちなみに、EC2インスタンスのTimeZoneを設定していない場合、日本時間ではなくUTCになっているかと思います。

## aws ec2 stop-instancesコマンド
インスタンスの停止は`aws ec2 stop-instances`コマンドを使います。例えば、インスタンスID`i-0xxxxyyyyzzzzwwww`のインスタンスを停止したい場合は、以下のコマンドで実行できます。

```
$ aws ec2 stop-instances --instance-ids i-0xxxxyyyyzzzzwwww
```
インスタンスIDをいちいちコピペするのはめんどくさいですが、自身のインスタンスIDであれば、以下のようにAWSのインスタンスメタデータサービスを利用することで取得できます。

```
$ curl -s http://169.254.169.254/latest/meta-data/instance-id
```
したがって、自身のインスタンスを停止するコマンドは以下になります。

```
$ aws ec2 stop-instances --instance-ids $(curl -s http://169.254.169.254/latest/meta-data/instance-id)
```

# あとがき
atコマンドとaws cliコマンドをコマンドを組み合わせることで、〇日後にインスタンスを自動停止する仕組みができました。どのインスタンスであっても同じ手順で自動停止の仕組みを取り入れられることは便利かなと思いましたが、10台、20台となってくると、、、
もし継続的なコストを削減したいのであれば、lambdaやCloudWatchを使ったインスタンスの自動停止、自動起動が効果的かと思います。
Kotlin のパターンマッチを使ったメソッドで型パラメータをいい感じに扱って欲しい

Kotlin で

```kotlin
sealed class Query<T>
object StringQuery : Query<String>()
object IntQuery : Query<Int>()
```

みたいなシールドクラスがあったとして、

```kotlin
fun <T> executeQuery(query: Query<T>): T = when (query) {
  is StringQuery -> "何か文字列"
  is IntQuery -> 1000
}
```

という感じで型に応じた返り値を返したいのだけど、上のようなコードを書くと 「Type Mismatch. Required: T / Found: String」 みたいな感じでコンパイラに怒られる。

こういう感じのことをするいい方法ってないものだろうか…… :thinking:
macOSの濁点問題について

# 現象
Node.jsで取得したフォルダ名と文字列リテラルが同じ文字(っぽい)のに一致しない。
ただし濁点付きの文字に限る。

- 確認した環境
 - macOS Sierra v10.12.6
 - node v8.2.1

## 再現手順
こんな感じでフォルダがあったとする。

```console
$ ll /data
total 0
-rw-r--r--  1 mimizq  staff  0  1  2 00:06 せ
-rw-r--r--  1 mimizq  staff  0  1  2 00:06 ぜ
```
フォルダ一覧を取得する。

```javascript
const fs = require('fs');
const chars = fs.readdirSync('/data');
// [せ, ぜ]
```

濁点付きの文字だけ一致しない。

```javascript
let countA = 0;
let countB = 0;

for(let c of chars) {
  if(c === 'せ') countA++;
  if(c === 'ぜ') countB++;
}

console.log(countA); // 1
console.log(countB); // 0
```

# なぜ一致しないのか

文字コードが違うから。

```javascript
for(let c of chars) {
  console.log(c.charCodeAt(0));
}
// 12379
// 12379

// フォルダ名の「ぜ」は、 12379, 12441 となっており、濁点入りで実質2文字扱い。
// 一方、リテラルの「ぜ」は、12380 で1文字扱い。なので当然一致しない。
```

# 理由
macOSのファイルシステムの問題らしい。
こちらの方が詳しく書いてくださっているのでリンクしておきます。
https://qiita.com/knaka/items/48e1799b56d520af6a09

# 結論

こうすればいい。

```javascript
const chars = fs.readdirSync('/data')
  .map(c => {
    return c.normalize('NFC'); // NFCで正規化
  });

let countA = 0;
let countB = 0;

for(let c of chars) {
  if(c === 'せ') countA++;
  if(c === 'ぜ') countB++;
}

console.log(countA); // 1
console.log(countB); // 1 <- 一致した

for(let c of chars) {
  console.log(c.charCodeAt(0));
}
// 12379
// 12380 <- 1文字扱いされている

```

だからテキストエディタでソートしたときの挙動が意図していたものと違ったのかと納得。
macを使い始めて数ヶ月経ちますが、操作はそこそこ慣れてもOSの仕様的なところは全然知らないので結構困ります。

総合的な開発効率は正直Windowsのほうが上だったような。
最近のWindowsはWSLでBash使えるし。
慣れの問題でしょうか。

英語環境だとmac良いのかもしれないけど日本語環境だとちょっと使いづらいかも。
小洒落たポスターとかスライド作るにはいいんだけど。
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十五章 蒸留1 コアドメイン

# 蒸留

その意味の通り、混ざりあったコンポーネントを分離するプロセス。

モデルそのものが、ビジネスの知識を蒸留させたものです。ここまで何度も「蒸留」という言葉が出てきましたね。

戦略的な設計としての「蒸留」はもっと踏み込んで、モデルから特別に価値のある「コアドメイン」を抽出するといことに焦点を当てていきます。

その「コアドメイン」をどう抽出するかということと、蒸留の副作用として出現し、役に立ち、それはそれで価値のある汎用サブドメインなどのテーマにも触れていきます。

# コアドメイン

大きなシステムは関連するコンポーネントが非常に多く、かつ複雑。しかも、**その全てが必要**です。

こうなると、システムを作る動機になっているビジネスの本質部分が埋もれてしまいます。
複雑なビジネスの知識を整理するはずのドメイン駆動設計の目的からも離れてしまいます。

このことが何を意味するかというと、

**コードがわかりずらい、理解するのが難しいシステムと同じこと**が起きるのです。
つまり、**全体像を見失い、変更がしにくい**システムになってしまうということです。

そこで、
**モデルの極めて重要なコアを洗練し、優秀な技術者をコアの実装に割り当てること。
そして、コアに対して、しなやかな設計を開発し、システムのビジョンを実現すること**が必要になってきます。

明日は、誰が、どうコアドメインを抽出し、実装していくのかを読んでいきます。
VP9コーデックメモ

- [VP9 - Wikipedia](https://en.wikipedia.org/wiki/VP9)
- [VP9 Bitstream & Decoding Process Specification Version 0.6](https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf) (PDF)
- [A VP9 Bitstream Overview (draft-grange-vp9-bitstream-00)](https://tools.ietf.org/html/draft-grange-vp9-bitstream-00)
 - 一部VP9に含まれない仕様（Compound INTER-INTRA Modeなど）が言及されている
- [RTP Payload Format for VP9 Video (draft-ietf-payload-vp9-04)](https://tools.ietf.org/html/draft-ietf-payload-vp9-04)
- [A Technical Overview of VP9: The latest royalty-free video codec from Google](http://files.meetup.com/9842252/Overview-VP9.pdf) (PDF)
- [How VP9 works, technical details & diagrams, Doom9's Forum](https://forum.doom9.org/showthread.php?t=168947)
- [Google VP9 "Next Generation Open Video" information posted, Doom9's Forum](https://forum.doom9.org/showthread.php?t=165839)
- [Overview of the VP9 video codec](https://blogs.gnome.org/rbultje/2016/12/13/overview-of-the-vp9-video-codec/)
- [Does VP9 deserve attention? - Part I](https://sonnati.wordpress.com/2016/06/03/does-vp9-deserve-attention-part-i/)
- [Choosing the Right Compression Technology - Comparing VP9, AVC, and HEVC](https://drive.google.com/file/d/0B7a5Sr0jgK2ISTg5NkpRN2pVZjQ/view) (PDF)
- [Recent Developments in Scalable Coding in VP9](http://www.rtc-conference.com/2016/wp-content/uploads/gravity_forms/2-2f7a537445fa703985ab4d2372ac42ca/2016/10/eleft-VP9-2016-10-18d.pdf) (PDF)
- [Inside WebM Technology: The VP8 Alternate Reference Frame](http://blog.webmproject.org/2010/05/inside-webm-technology-vp8-alternate.html)
 - VP9の前身VP8当時の解説だが、Golden/Altref frameの扱いはVP9と同じ。

[Choosing the Right Compression Technology - Comparing VP9, AVC, and HEVC](https://drive.google.com/file/d/0B7a5Sr0jgK2ISTg5NkpRN2pVZjQ/view)より引用：
![feature_cmp_summary.png](https://qiita-image-store.s3.amazonaws.com/0/6657/336064ea-6137-4af3-cfdc-63c4fd11561d.png)
.xcf形式の画像をGIMPで拡張子を変換する

# 環境
- Ubuntu 16.04
- GIMP 2.8.14

# 手順
1. .xcfの画像をGIMPで開く
2. ツールバーのファイルからエクスポート(または名前をつけてエクスポート)を選択
![screenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/227794/832611bd-1b39-05c0-bc11-01d04adb19fe.png)
3. ファイル名と保存先を設定してエクスポートをクリック
4. もろもろ設定の画面が出てくるので必要に応じて設定してエクスポートをクリックしたら終わり
![Screenshot from 2018-01-02 00-36-49.png](https://qiita-image-store.s3.amazonaws.com/0/227794/c637ab78-1eb9-d7d1-d9d6-9b56f10b692b.png)

# 終わりに
プロフィール画像用にアップロードしようと思ったらxcfダメーって言われて調べた結果GIMPのUIでエクスポートしろという結果が。
コマンドで変換出来ないかなーと調べてみましたがヘルプ見てみてもGIMPのコマンドではどうも出来ないようで。
aptでインストールできるツールで可能なのはxcftoolsに含まれるxcf2pngになるみたいですね。
```xcf2png -o 出力ファイル.png 入力ファイル.xcf```
Eclipseでバッチ処理プロジェクトのベースを作成する。

この記事は、Eclipse でバッチ処理を作成することになり、バッチ処理プロジェクトをどのように作るのか、手探りで試行錯誤した事について記載したものです。

前提作業：
１．以下のサイトから、spring-tool-suite をダウンロードして、適当な場所に展開します。
   (例:C:\pleiades\ など)
   ダウンロード先：https://spring.io/tools/sts/all　 
２．Eclipse を起動して、1.で展開した、C:\pleiades\sts-3.9.2.RELEASE をWorkSpace に指定して起動します。

プロジェクトの作成作業：
１．パッケージエクスプローラーで、右クリック->新規->プロジェクト->Springスタータプロジェクトを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/1313c2c9-b7f7-fc83-22da-5ad3dffd81f6.png)

２．名前を入力 -> ここでは、BatchTestApp と入力、次へをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/0990e826-3be5-8a72-c6d5-48fff36d677d.png)

３．バッチをチェックして、完了ボタンをクリックして終了。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/d9b9f573-e78f-743a-b93a-fc62a5e859f8.png)

４．バッチ処理を動かすmain関数が自動生成されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/68de3b71-215e-c8bc-5a64-2f1c3664663d.png)

５．BatchTestApplication.java を右クリックして、デバッグ->Javaアプリケーションをクリックして実行してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/72cde77f-ce51-3c89-e4c0-2920a89bed2e.png)

６．あれ？、エラーになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/096e5fbc-7fdf-844f-147a-9593328ae10e.png)


Exception in thread "main" java.lang.NoClassDefFoundError:org/springframework/core/env/EnvironmentCapable
調べてみると、org/springframework/core/env/EnvironmentCapableクラスが見つからないよというエラーです。

７．pom.xml を確認してみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/fca3f4c2-47f1-a3bc-2edd-0840084fd2e3.png)

いろいろ試行錯誤しながら調べてみると、pom.xml の spring-boot-startar-parent の version が 1.5.9.RELEASE となっているのが原因です。BatchTestApplication.java の ソースコードで試しに 
import org.springframework.core.env.EnvironmentCapable; と入力してみると、インポートされた org.springframework.core.env.EnvironmentCapable は見つかりませんとエラーになっています。 

８．pom.xml を修正する。(バージョンを 1.2.1.RELEASE にする)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/fd1a82bb-c7c6-dabb-b4bb-3a6176367986.png)

９．再度、BatchTestApplication.java を右クリックして、デバッグ->Javaアプリケーションをクリックして実行してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/afa49f20-9f9a-2c7c-4246-e3faf5b44fb0.png)

なぜ、1.5.9.RELEASE だとクラスが無いのかは分からないですが、これで Spring は動くようになりました。
４名のHaskeller先生方からの応援メッセージ

**Simon Thompson先生について**
[Craft of functional programming](http://www.haskellcraft.com/craft3e/Home.html) の著者であり
イギリスのケント大学に在籍しているコンピューティング研究所教授
##<font color=blue>Message
**Though it’s in the last five years that Haskell has come to prominence, it has been in development for some twenty five years, and the ideas at its core for  a decade more. This means that it is mature: it has a world-class compiler in GHC, a vast range of libraries in hackage and stackage, as well as a renowned type system. The Haskell type system allows programmers to do type-driven development, expressing clearly the skeleton of a system in its types before beginning to implement it fully. Haskell types embrace generics, overloading and lambdas (“first-class functions”): these features were first found in functional languages, and it is in a functional context that they work best. The growing Haskell developer base shows that it is an excellent language for system development: large-scale examples are seen in the financial sector, and smaller-scale enterprises leveraging are continually being started.**

<h4>感想</h4>
Haskellは実際ライブラリも非常に充実してきており、型を使って型ドリブンの開発が可能な事が非常に有利な点と仰っており、genericsとかoverloadingとかlambdasみたいなものは他の言語でもありますが由来は関数言語にあり、関数言語の中でこそもっとも力を発揮するとのことから金融や小規模な商業システムを作れるようになってきてるとのこと。
知らない世界がたくさんありますがHaskellの魅力は先生のお言葉から通じてきます。

--------
**Bryan O’sullivan氏について**
現在はFacebookに所属しており[Real World Haskell](http://book.realworldhaskell.org/)の著者の一人である。

##<font color=blue>Message</font>
**Dear Masako-sama,
I wish you and the Japanese Haskell community the best of good fortune,**
<h4>感想</h4>
忙しい中一言だけでも日本のHaskellreに対して応援の言葉をかけてくださり感謝しています。

---
**Graham hutton教授について**

ノッティンガム大学関数プログラミング研究所教授
[Programming in Haskell](http://www.cs.nott.ac.uk/~pszgmh/pih.html)の著者
##<font color=blue>Message</font>
**Many thanks for your message.  Unfortunately my only experiences
with Haskell are from an academic point of view, so I don’t 
really feel qualified to answer questions about the use of 
Haskell for IT projects in industry.  You may be better placed
to ask some of the Haskell experts in industry.
Best wishes,**

---
**Richard Cook氏について**

https://github.com/rcook
https://www.packtpubm/books/info/authors/richard-coo
[Fundamentals of Practical Haskell Programming Video] 

[Writing Haskell Programs [Video]
((https://www.packtpub.com/application-development/writing-haskell-programs-video)
##<font color=blue>Message</font>
**My sentence of encouragement: "Haskell can seem very alien at first, but keep at it and it will make sense eventually!"**

<h4>感想</h4>
多忙な方でそれでも一言メッセージをいただけて感謝しております。
Haskellは初め、エイリアンのようにみえるという表現が面白かったです。

***

Haskell 第5弾までありますのでよろしくです。
GithubのREADME.mdにjpgやgifを表示させる方法

![github-154769_640.png](https://qiita-image-store.s3.amazonaws.com/0/107575/cb6cdd3e-5a4e-670c-2c9c-26ee1b740087.png)

Githubにアプリの画像や動画をアップロードして, README.mdに表示させる方法のメモ. リッチなREADME.mdだと使う気になりますよね.

# 手順
## 動画・画像ファイルを作成
gifなら, http://www.bandisoft.com/jp/honeycam などで作成します.

## Github Wikiのページを作成
自分のGithubプロジェクトのWikiタブから, Wikiページを作成します. 

* Wikiタブ
* Create First Page
* Save Page(中身はなんでもOK)

## Github Wikiにファイルをアップロード
```bash
# Wikiをローカルにclone(プロジェクトの末尾をgitからwikiに変更)
git clone git@github.com:username/projectname.wiki
cd projectname.wiki

# hoge.gifを配置(省略)

# ファイルをpush
git add hoge.gif
git commit -m "add gif"
git push
```

## README.mdにアップロードしたファイルのリンクを貼る
URLはhttps://raw.githubusercontent.com/wiki/ユーザー名/プロジェクト名/ファイルパス で作成する.
```README.md
![sample](https://raw.githubusercontent.com/wiki/username/projectname/hoge.gif)
```
Wercker で dep を使った Golang のビルド

はじめに
-------

[Wercker](http://www.wercker.com) で依存モジュールを管理を使った [Golang](http://golang.org) の CI を実施しようとしてハマった。
次回は時間を取られないように記録。
※こういった類のものは [Scrapbox.io](https://scrapbox.io) に書いた方がいいのかと思いつつ、一旦こちらへ。


tl;dr
-----

~~Wercker の golang box の `WERCKER_SOURCE_DIR` がディフォルトでは `GOPATH` の配下になっていないので [wercker/setup-go-workspace](https://github.com/wercker/setup-go-workspace) などを利用して `GOPATH` 配下にする。~~

local の Wercker CLI での `wercker build` が通るのに Wercker の Web 側で同じ原因で失敗するのでこの方法は間違いかもしれません。現在調査中。


*追記(2018/01/04)：*

一旦 `glide` でやることにしました。 [Wercker で glide を使った Golang のビルド](https://qiita.com/noissefnoc/items/031db114b33fefce7030)
環境
----

* Wercker
    * box: golang:latest (※2017.01.01の実行時で Go 1.9)


困ったこと
---------

Wercker の Golang の box の構成として

* `GOPATH` : `/go`
* `WERCKER_SOURCE_DIR` : `/pipeline/source`

となっている。そのため、Wercker が処理対象にするソースは `/pipeline/source` となる。しかし、このパスは `$GOPATH/src` 配下ではない。

諸々調べたところ Go のモジュール依存関係管理は `dep` を使うのが推奨されているようだった。

そこで `dep` で依存モジュールをインストールすると、モジュールは `/pipeline/source/vendor/*` に配置されてくれればよいのだが、実際には

```
/pipeline/source is not within a known GOPATH/src
```

とエラーメッセージが出る。このエラーメッセージ、本家にIssueが上がっていて

[dep init fails if in not in $GOPATH\[…\]/src/{somedir..} #148](https://github.com/golang/dep/issues/148)

ステータスが Open なので `$GOPATH/src` = `/go/src` 配下にインストールする必要があった。


解決方法
-------

一番簡単なワークアラウンドとしては `dep status` をパーズして `go get` してプロジェクト配下の `vendor`ディレクトリではなく、グローバルの `GOPATH` 側にインストール方法がある。

しかし、せっかく `dep` を使っているのに「それどうなのよ」感があるので調べて [wercker/setup-go-workspace](https://github.com/wercker/setup-go-workspace) にたどり着いた。

```
build:
    steps:
        - wercker/setup-go-workspace:
          package-dir: <SOME_PATH>
```

を設定すると `/go/src/<SOME_PATH>/vendor/*` にインストールされるようになり、これは `$GOPATH/src` 以下になるので `dep` でのインストールが可能になる。


参考
---

* [Getting started with Wercker and Go](http://devcenter.wercker.com/docs/quickstarts/building/golang)
    * [wercker/getting-started-golang](https://github.com/wercker/getting-started-golang)：標準ライブラリしか使用していないので、参考にならず...
* [wercker/step-setup-go-workspace](https://github.com/wercker/step-setup-go-workspace) 
    * [Werckerを使ってフェーズ間のパッケージの受け渡し周りでハマった](https://blog.youyo.info/post/2016/06/18/wercker-test/)：トピックは違うけれど、モジュールの使い方はここで知った
Schema で morphs のカラムを作るとインデックス長が制限を超えてしまう場合の対処方法

laravel を mysql で使っていると `migration` を実行した時に下記のようなエラーが発生することが有る。

```
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; 
max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`)) 
```

これは InnoDB の最大インデックス長を超えたためなのでカラム サイズを小さくする必要がある。特に文字コードを `utf8mb4` にしているとデフォルトの string 長が 255 文字で有るためにしばしば発生する。

```PHP
Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
```


そんな時は、文字列長を 191 以下にすると解決可能です。

```PHP
$table->string('email', 191)->unique();
```


ところが、`morphs` を指定しているとメソッドの内部で `string` をコールしているため直接変更が出来ない。
そんな時は `defaultStringLength` を使って変更してあげると回避できる。

```PHP
Schema::create('notifications', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->string('type');
    Schema::defaultStringLength(191);
    $table->morphs('notifiable');
    Schema::defaultStringLength(255);
    $table->text('data');
    $table->timestamp('read_at')->nullable();
    $table->timestamps();
});
```
FRONT END の勉強をする中で気になったWordを調べて書き出す


headless browser

>A headless browser is a web browser without a graphical user interface.
Headless browsers provide automated control of a web page in an environment similar to popular web browsers, but are executed via a command-line interface or using network communication. They are particularly useful for testing web pages as they are able to render and understand HTML the same way a browser would, including styling elements such as page layout, colour, font selection and execution of JavaScript and AJAX which are usually not available when using other testing methods
- Wikipedia

・グラフィカルなUIを持たないWebブラウザ。
・コマンドラインを使う。

有名なのは、[Phantom JS](http://phantomjs.org/)とのこと。
→Qiitaにもありました。[Phantom JSの説明](https://qiita.com/uest_kensington/items/82cd6978b4ac7afa6fdf)。
Amazon ECSのログをCloudWatchで収集する

![ecs01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/608f3ce2-04b1-1df9-48c3-4fb73b95e980.png)

# 全体の流れ

1. [ローカルでコンテナを動かす](https://qiita.com/NaokiIshimura/items/8d0698735d506e5790c9)
2. [ECSでコンテナを動かす](https://qiita.com/NaokiIshimura/items/45d2288b5a2fc4e4e4e4)
3. [ECSでコンテナをクラスタリングする](https://qiita.com/NaokiIshimura/items/a1a2a6182a1505950789)
4. [ECSのログをCloudWatchで収集する](https://qiita.com/NaokiIshimura/items/d1b8f54d863b8755c3d6)　←今回の投稿
5. [ドメインを取得する](https://qiita.com/NaokiIshimura/items/89e104dd2d8dd950780e)
6. [ドメインにALBを割り当てる](https://qiita.com/drafts/654f1f82adb039f1ad47/edit)
7. [HTTPS化する](https://qiita.com/NaokiIshimura/items/014a163c60feebec570b)

# もくじ

今回の投稿ではコンテナのログをCloudWatchで収集します。

1. CloudWatchでロググループを作成する
2. タスク定義でログの設定を行う
3. ログを閲覧する

# 1. CloudWatchでロググループを作成する

![log01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/6507f18a-461d-d4bd-6dd1-fd87d2928f8a.png)
　　　![log02.png](https://qiita-image-store.s3.amazonaws.com/0/141934/6eeeb2d5-f663-2f9b-5fa8-7e4aa9889df4.png)


![log03.png](https://qiita-image-store.s3.amazonaws.com/0/141934/e1e03d32-74b8-283a-8b5c-a0eb9fde7d93.png)

# 2. タスク定義でログの設定を行う

- **ログ設定**で`awslogs`を選択する
- **awslogs-group**にロググループ名を入力する
- **awslogs-region**にリージョンコードを入力する
- **awslogs-stream-prefix**にプレフィックスを入力する（任意）

> 参考：awslogs-region
> [リージョンとアベイラビリティーゾーン \- Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions)

![log04.png](https://qiita-image-store.s3.amazonaws.com/0/141934/3fe619fe-1451-684e-69c8-10aee089b329.png)

# 3. ログを閲覧する

![log05.png](https://qiita-image-store.s3.amazonaws.com/0/141934/45c87047-548e-fc22-8137-3d06596c4e7a.png)
![log06.png](https://qiita-image-store.s3.amazonaws.com/0/141934/19ebe0d4-4603-05bc-03bb-88f68289c518.png)
font-smoothingで文字を綺麗に見せる

## 問題

文字がガタガタしてる気がする。
もっと文字綺麗に見せたい。


## 解決策

1行足すだけでテキストがスタイリッシュになります。

```css
/*フォントに エイリアスがかかってちょっとだけクールになります*/
-webkit-font-smoothing: antialiased;

/*端数に対してのみアンチエイリアスをかける。
 antialiased よりは若干弱いが良い塩梅で見た目をスムーズにしてくれる*/
-webkit-font-smoothing: subpixel-antialiased;

/*アンチエイリアスのオフ。上２つと比べて少しガタガタに見える。*/
-webkit-font-smoothing: none;
```

## font-smoothing の注意点

文字が細くなりすぎる。

## 解決策

font-weightをあげて、かつfont-smoothingをつける。
Postgresqlで文字列同士の結合をする際の注意

#NULLを含む文字列を結合すると全部NULLになるので注意
【現象】
columA = 111　columB = 2222　の場合、下記のように結合します。

```
SELECT columA || '-' || columB FROM tableA;
```
###結果
`111-2222`

columA = 111　columB = <NULL>　の場合、同じように結合しても結果が変わります。

###結果
`<NULL>`

【対応方法】

```
SELECT columA || '-' || coalesce((columB, '') FROM tableA;
```
結果
`111-`

NULL文字が含まれる可能性のあるcolumBに対してcoalesce関数をかけることで対応することができます。
上記の場合、columBがNULLだった場合に空文字が返ります。



参考にさせて頂いたサイト：<a href="http://d.hatena.ne.jp/zankey/20070914/postgresql">リンギオ</a>
Linuxコマンドメモ

非常に良く使う超基本的なやつだけまとめ

###■ファイルコピー
```
cp 元ファイル コピー先ファイル
```
###■ファイル削除
```
rm ファイル名
```
###■権限変更
```
chmod 権限 ファイル名
```
###■ファイル閲覧
```
cat ファイル名
```

オプション系の詳細は後で
C#でClipboard使うときに詰まった話

OneNoteのアドイン(dll)を開発中、クリップボードに文字列を設定できず嵌った。

# 導入
[[C#][.NET] クリップボードに文字列を設定する](https://qiita.com/koara-local/items/9586ef767afe837c99f2)
を見ながらコーディングしたがうまくいかない。
別のプロジェクトにミニマムを作って同じコードで動かすとうまくいく。ググった感じSTAThread属性が付いていないと上手く値が反映されないらしい。

# STAThread属性とは
WinFormsを作成した時に勝手にできてるあれです。

```csharp:Program.cs
[STAThread]
static void Main(string[] args) {			

}
```
いつも何も考えずにつけてるので完全にノーマークでした。

STAはSingle Thread Apartmentの略で、逆はMTAでMulti Thread Apartmentの略です。２つに違いはオブジェクトが単一スレッドを想定しているか、マルチスレッドを想定しているかとのこと。

# なぜClipboardが反映されなかったのか？
まず、ClipboardはCOMを利用しています。COMはオブジェクトやスレッドを、アパートメントと呼ばれるCOMがその境界を越えて呼び出しをマーシャリングする領域に割り当てられます。このCOMは作成したスレッドと別のスレッドで動かすことができないらしい。なので、コードを動かすスレッドのメソッドに属性としてSTAThreadを付けないと動かない見たいです。
COMを使っている代表例に、

- ドラッグ＆ドロップ機能
- クリップボード関係の機能
- FileDialogの派生クラスなど
- WebBrowserコントロール
- IMEの使用

があるんだそうな。

# じゃあ、どうするか？

```csharp:ClipboardSetter.cs
using System.Windows.Forms;

public void SetClipBoard(IRibbonControl control) {
    //スレッドの中にシングルスレッドにしたいメソッドを入れる
    Thread t = new Thread(ClipBoardSetter);
    t.SetApartmentState(Apartment.STA);
    t.Start();
}

public void ClipBoardSetter(){
    Clipboard.SetData(DataFormat.Text, "コピー成功(´∀｀)");
}
```
こんな感じで書いたらとりあえず動きました。

# 最後に
色々調べながら書いてたけど間違ってる気しかしない。タスケテ。。。
ところで、今回一番驚いたのはMACでC#のClipboardを利用できることでしたとさ。
# 参考
- [STAThreadの意味は？](https://dobon.net/vb/dotnet/form/stathread.html)
スマホのボタンを押してLINEメッセージ送信

#前置き
ルーティンのような日々の家族への連絡はボタン１つでできたら楽なのに。
　・もうすぐ駅に着くから「パパ迎えに来て」
　・仕事終わって家族への帰宅連絡「いまから帰るよ」
　・もうすぐ牛乳がなくなる「パパ牛乳買ってきて」

緊急時に大切な人へ自分の居場所を速やかに伝えたい（ボタン１つで）。
　・大切な約束なのに時間に間に合わない。「ごめん、今向かってます (+現在地)」
　・万が一、何者かにさらわれたときに「たすけて (+現在地)」


できます、ボタン。スマホに。
IFTTTアプリを使いましょう。
(この投稿はIFTTTアプリの紹介に過ぎません。)

#IFTTTとは
IFTTTは、サービスとサービス、モノとサービスを紐付けしてくれるサービスです。
あるモノやサービスへの操作をトリガーに別のモノやサービスへ予め決めておいた操作を実行してくれます。
　https://ifttt.com/

以下は参考です。
 [作りながら覚える「IFTTT」レシピの使い方活用講座！（全5回）](http://hoomey.net/ifttt_study_1/)
少し古い記事で最新のIFTTTアプリと微妙に違ったりしますが、画面イメージ付きで丁寧に説明されています。

#準備する
##使うもの
・スマホ
・IFTTTアプリ(iOS/Android)
・LINE

事前にIFTTTサービス利用のアカウントを作っておきます。
　https://ifttt.com/
※googleアカウント、facebookアカウントを利用できます。


#IFTTTレシピ設定
手順は以下3つです。
 1. IFTTTアプリを起動して、my appletsの右上✚ボタンを押す
 2. IF「Button widget」THEN「LINE」のレシピを作る
 3. スマホのウィジェット[^1]にIFTTTを追加(以下参考。右端がボタンイメージ)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/1d183f95-5fd2-ad90-2ac2-05b01ee97d48.png)



レシピを作るときの設定について補足します。
　- Widget settings
　　　・Show in Today View を on にする
　- レシピのConfigure (右上歯車マークから)
　　　・title にボタンの名前を指定（ボタンの下に表示されます）
　　　・Recipient に通知先にするLINEグループを選択
　　　・Message にLINEに送るメッセージ本文を入力
　　　・(+現在地を伝えたいとき)Photo URL にAdd IngredientからLocationMapImageURLを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/ed4fbcd1-e9ea-6d87-e7a2-ac026be65a0b.png)



##補足
・LINEへのメッセージ送信者は「LINE Notify」 になります。
　LINE周りの設定はIFTTTでレシピを作る中で案内に従っていくだけであり難しくありません。
・通知先LINEグループのメンバーに 「LINE Notify」 を入れておく必要があります。


[^1]: ホーム画面の左画面にスワイプしたときの画面



#使う
ボタンを押すとIFTTTで設定した処理が行われます。完了するとボタンに✔が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/fd4ab213-073b-60f0-a6a2-05491baea95e.png)

そしてLINE上にもちゃんとメッセージが届いています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/1095bf29-371e-a317-1ae8-1000bf175004.png)




#終わりに
IFTTTでスマホにボタンを作ってホーム画面から左画面にスワイプしてボタン1pushで連絡できます。
LINEアプリを起動して送信先を選んでメッセージ作って送信という作業を省略でき、
日々の連絡が１回30秒から3秒に短縮されます。


ボタンによるLINE通知のデメリットとしては、相手の既読/未読のステータスがわからない点。
LINEのメッセージを読んだらちゃんとレスしてもらいましょう。

また毎回連絡する内容を変えたい人は、今回のレシピの「Button widget」を「Note widget」に置き換えるというのも一案です。

IFTTTの出力先はLINEの他に、メール、ツイッターなど、いろいろあります。IFTTTアプリを使って自分の生活を便利にするパーソナルサービスを探索してはいかがでしょうか。

---
ディレクトリの中から特定の文字列を含むファイルの名称をテキストで吐き出す

```
find . -type f -name "*.html" | xargs grep 'src="http://' > kekka.txt
```
##解説
ディレクトリ内のhtmlファイルをfindコマンドで探し、
「src="http://」の文字列が含まれているファイルのファイル名をkekka.txtとして吐き出す
Haskell案件を増やすためには by SPJ先生

遅ればせながらこの記事はHaskell Advent Calendar(その３)25日目の記事です。
教授、先生方からちゃんと返事をしたいとのことで、デットラインを尋ねられ
それが去年の12/31でした。時差も加味し記事を書かせて頂きたく存じます。

---------------------

**Simon Peyton Jones 先生の返事の一部に昨日のアンケートについて
答えてくださった部分がございます。
Simon Peyton Jones先生だけではなく他の教授も答えてくれていますが(その５)で公開したいと存じます.**



⛩アンケート内容 ⛩
1. Haskellってどういうイメージですか？
2. Haskellを拡めるにあたり問題点はございますか？
3. Haskell案件を増やす為にはどうしたらいいと思いますか？⛩
***
<font color=blue>**Simon Peyton Jones先生のお答え**</font>
**Quesion.1**
Do you think Haskell is underrated as an industrial, professional
programming language by IT project managers?

[要約]
Haskellに対してどういうイメージかというよりはHaskellが商用プログラミング言語として過小評価されていると思われますか？

<font color=orange>**Answer.1**</font>
**Yes. But it's not surprising that it's under-rated. It's very different to other (imperative) mainstream programming languages.**

(補足)
はい。他の普通のプログラミング言語とは大きく違うので仕方ないと思います。
***
**Quesion.2**

（予めお知らせしたい事）
アンケート2につきまして、ゴールとしては、
Simon Peyton Jones 先生には企業のITマネジャーの先生方にHaskellを選択してもらうにはどういう風にHaskellの利点を説明すれがよいかを尋ねました。

What are the strengths of Haskell that could help us to convince IT
managers to consider choosing Haskell when:
- starting up a new project?
- revisiting an existing project?

<font color=orange>**Answer.2** </font>
**There are the usual things: productivity, conciseness, parallelism, control of side effects.
But I'll highlight /maintainability/.  Most developers spend most of their lives modifying and refactoring existing code.  It's a constant source of wonder to me that it's even /possible/ to make large-scale changes to a 20-yr-old Ruby or Python code base. It's so /hard/ to refactor an untyped program written by someone else. What are the consequences of changing this or that?**

[要約]
何よりも、**生産性、簡潔さ、並列性、副作用の制御**が重要です。
然しながら私は、**<font color="Red">保守性</font>**を強調したいと思います。
ほとんどの開発者は、人生の殆どを既存のコードの改変や
リファクタリングに費やします。
私にとっては、20年もののRubyやPythonのコードベースに
大規模な変更を加える事が可能な事自体が極めて驚きです。
他の誰かが書いた型の無いプログラムをリファクタすることはとても大変です。
型の無いプログラムのいろいろな部分のコードを書き換えると一体何が起こるかわかりません。Haskellだと型が正しい大規模な改変を導いてくれます。
私はGHCでそのような経験をしました。

***
Quesion.3
[要約]
プロジェクトにおいて、プロジェクトマネージャーにでハスケルを選択してもらえない理由に何があると思われますか？

What would be the factors that may be discouraging project managers
from adopting Haskell?

<font color=orange>**Answer.3** </font>
**I think the biggest thing is simply cultural ecosystem. No one fires you for choosing Python because there are zillions of Python books, Python libraries, Python programmers, ... a huge cultural ecosystem.  You feel safe.  Haskell has a pretty rich and dynamic ecosystem but it is /smaller/, so the choice feels "braver" and managers don't like feeling brave.
Performance used to be a factor 15 years ago, but I think it's really not now. But there may still be a /perception/ that perf is a problem.**

[要約]
何故、プロの商用プロジェクトで使われないのかについては
私は大きい問題と言えるのは文化的生態系だと思います。
貴方がもしPythonを選んでもそれを理由に解雇になることはないでしょう。
なぜなら、Pythonの本もライブラリーもプログラマーも無数にいて文化的生態系は巨大だからです。Haskellはとても充実した躍動的な生態系を持っていますが、Pythonに比べたら小さいです。逆に言えば、もっと大きな生態系を持つようになれば
マネジャーの人々も採用しやすくなるとおもわれます。

**ちなみにパフォーマンスは今は問題ではないです。**

***
以上、Simon Peyton Jones 先生からの直々のお返事でございました。
お忙しい中返答くださったことに感謝しております。
私はいろいろな方の伝書鳩として動き日本のハスケラー達がこんなにも頑張っている事を示したかったのでとても良い経験になりました。感謝。
Eclipseでビルドがおかしくなったら

###使い続けているとたまにおかしくなることがあるEclipseの対処法

１．Eclipseをいったん終了する
２．ワークスペースフォルダの中の、
/.metadata/.plugins/org.eclipse.dltk.core.index.sql.h2/
フォルダ内のファイルを全て削除
３．再びEclipseを起動する

これで解消されると思いますが、全部が全部というわけではなさそう・・・
スターリングの近似を試してみた

#スターリングの近似とは

スターリングの近似（スターリングの公式）とは$n!$の近似です。
$n!$の計算は、プログラミングでは再帰的な計算が必要になり$n$が大きくなるにつれ計算コストが増え大変になります。
そこでスターリングの近似式を利用することで大幅に計算コストを削減できます。

簡単なスターリング近似は(1)のようになります。

```math
n! = \exp(n\log n - n + \varepsilon)\tag{1}
```
もしくは対数をとった(2)になります。

```math
\log n! = n\log n - n + \varepsilon\tag{2}
```
$\varepsilon$は近似誤差であり$n$の値によって変わります（nによらない定数値ではありません）。
$\varepsilon$を0に近づけるため、もっと複雑にしたものもあります。
wikipedia等では(2)で説明されているため、ここでもスターリングの近似式は(2)として扱います。

#スターリングの近似式の簡単な導出
※詳しい導出は[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E8%BF%91%E4%BC%BC)を参考にしてください
まず(2)を式変形し(3)のように総和を取ることができます。

```math
\log n! = \sum_{k=1}^{n} \log k \tag{3}
```
その後(4)のように、$\log x$の$k-\frac{1}{2}$から$k+\frac{1}{2}$の積分が$\log k$と近似します。
（$\log x$の$k-\frac{1}{2}$から$k+\frac{1}{2}$の間が線形ではないため誤差が発生します。）

```math
\sum_{k=1}^{n} \log k \approx \sum_{k=1}^{n} \int_{k-\frac{1}{2}}^{k+\frac{1}{2}} \log x dx \tag{4} 
```

```math
\sum_{k=1}^{n} \int_{k-\frac{1}{2}}^{k+\frac{1}{2}} \log x dx = \int_{\frac{1}{2}}^{n+\frac{1}{2}} \log x dx 
```

```math
= \left( n + \frac{1}{2} \right) \log \left( n+\frac{1}{2} \right) -\left( n+\frac{1}{2} \right)
 -\frac{1}{2} \log \frac{1}{2} +\frac{1}{2} \tag{5} 
```
最終的に(5)のようになり$n$を無限にした場合、定数項は無視され(6)になります

```math
= n\log n - n　+ \varepsilon \tag{6}
```

#pythonで検証
※あまり良いコードではありません

```python:
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc as sm

plt.subplot(2, 1, 1)
x_size = 100
x_max = 10000
x = np.linspace(1, x_max, x_size)

# スターリング近似
appr_y = x * np.log(x) - x 
plt.plot(x, appr_y, label='Approximate')

# 真値（オーバーフローを避けるためややこしくなっています）
tv_y = np.zeros(x_size)
y_count = 0
for i in x:
    for j in range(int(i)):
        tv_y[y_count] += np.log(j+1)   
    y_count += 1
plt.plot(x, tv_y, label='True value')
plt.legend()


plt.subplot(2, 1, 2)
# 誤差
err_y = tv_y - appr_y
plt.plot(x, err_y, label='Error')

plt.legend()
plt.show()

```

図上がスターリング近似と真値になっておりほぼほぼ重なっており、うまく近似できていることが確認できます。真値から近似式を引いた近似誤差が図下になっています。
$\varepsilon$を0に近づけるため、もっと複雑にしたものが[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E8%BF%91%E4%BC%BC)にあるので必要に応じて変更してください。

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/131558/d3297291-4f5a-7e26-7ea8-38832f2affd0.png)
Google Tag Managerの発火確認方法

※前提条件：Google Chromeで確認すること

１．該当ページでF12を押してデベロッパーツールを起動
２．Networkタブから該当スクリプトが読まれているか確認する
３．タグマネージャのプレビューモードを起動、Chromeで該当ページを見てどのスクリプトが発火されているか確認
４．Tag Assistを使用し、タグが正しく埋め込まれているかを確認

参考にさせて頂いたサイト：<a href="https://cont-hub.com/blog/03/367/">Googleタグマネージャでタグ公開時にデバッグする方法@Content Hub</a>
Google AnalyticsでPDFのカウント数を取得したい場合

Google AnalyticsでPDFのカウント数を取得する場合、そのままだと取得できないので、イベントトラッキングを設定する必要があります。

##Google Analyticsでのイベントトラッキング設置方法


書き方：イベントハンドラ=ga(‘send’,‘event’,‘カテゴリ’,‘アクション’,‘ラベル);

カテゴリ：大カテゴリの名前を自由に命名します。
アクション：アクションの名前を自由に命名します。
ラベル：小項目に価するラベルの名前を自由に命名します。

###イベントハンドラとは
Webページ内でリンクを「クリック」した
バナーの上にポインターが「乗った」
など、ページ内でのユーザーの操作の名称です。

例えば「クリック」した場合には「onclick」を、
ポインタが乗る場合は「onmouseover」といった名称になります。
なので、バナー画像にイベントトラッキングを設置する場合はクリック数を計測することになるので「onclick」を使用します。

###イベントハンドラonclickの場合

GAタグ追記前：
```html
<a href="https://example.jp/">ここをクリック</a>
```


GAタグ追記後：
```html
<a href="https://example.jp/" onclick="ga(‘send’,‘event’, linkclick', 'click', 'pdf1’);">ここをクリック</a>
```
swiftで閉じるボタンのついたキーボードを表示するUITextFieldクラスの作成

##背景
キーボードって閉じるボタンがデフォルトではついていないから不便だな〜と思って、閉じるボタンのついたクラスを作成しました。2ステップで導入できるので気軽に利用できます。是非使ってみてください。

##目次
1. 環境
2. 手順①　クラスファイルの作成
3. 手順②(最後)　StoryBoardに反映
4. 参考文献

##開発環境
バージョン
Swift: 3.2
Xcode: 8.3.3
Swift4でも動くと思います。確かめてはいないので、もし試した方がいたら教えてくださると嬉しいです。


##手順①　クラスファイルの作成
New -> File　より新しいSwiftファイルを作成し、以下のようなコードを追記してください。　

```KeyBoard.swift
import Foundation
import UIKit


//閉じるボタンの付いたキーボード
class DoneTextFierd: UITextField{
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    
    private func commonInit(){
        let tools = UIToolbar()
        tools.frame = CGRect(x: 0, y: 0, width: frame.width, height: 40)
        let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let closeButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.closeButtonTapped))
        tools.items = [spacer, closeButton]
        self.inputAccessoryView = tools
    }
    
    func closeButtonTapped(){
        self.endEditing(true)
        self.resignFirstResponder()
    }
}
```

##手順②(最後)　StoryBoardに反映
今回はStoryBoardを利用しましたけど、コードのでの実装もすぐできると思います。
UITextFieldのクラスにKeyBoardと書くだけでおっけーです。これ実行するとUITextFieldを開いた時に完了ボタンが現れ、実際に閉じる動作まで動きます。




##参考文献
覚えている範囲ですが、閉じるボタンの追加の時に閲覧した記事をこちらで紹介させていただきます。
[UITextViewのkeyboardに完了ボタンを追加してkeyboardを閉じる方法](https://teratail.com/questions/21125)
OSSな仮想通貨のGitHubリポジトリまとめ


OSSな仮想通貨/ブロックチェーン技術/ブロックチェーンでない技術のGitHubリポジトリをまとめました。随時更新&編リクお待ちしています。

- [bitcoin/bitcoin](https://github.com/bitcoin/bitcoin)
    - Bitcoin Core integration/staging tree
- [Bitcoin-ABC/bitcoin-abc](https://github.com/Bitcoin-ABC/bitcoin-abc)
    - Bitcoin ABC is the name of open-source software which enables the use of Bitcoin Cash.
- [BTCGPU/BTCGPU](https://github.com/BTCGPU/BTCGPU)
    - Current work on BTCGPU
- [litecoin-project/litecoin](https://github.com/litecoin-project/litecoin)
    - Litecoin source tree
- [ripple/rippled](https://github.com/ripple/rippled)
    - Decentralized cryptocurrency blockchain daemon implementing the XRP Ledger in C++
- [ethereum/go-ethereum](https://github.com/ethereum/go-ethereum)
    - Official Go implementation of the Ethereum protocol
- [monacoinproject/monacoin](https://github.com/monacoinproject/monacoin)
    - Monacoin is an experimental digital currency that enables instant payments to anyone, anywhere in the world. 
- [NemProject/nem.core](https://github.com/NemProject/nem.core)
    - org.nem.core package
- [neo-project/neo](https://github.com/neo-project/neo)
    - NEO Smart Economy
- [zcash/zcash](https://github.com/zcash/zcash)
    - Zcash - Internet Money
- [input-output-hk/cardano-sl](https://github.com/input-output-hk/cardano-sl)
    - Cryptographic currency implementing Ouroboros PoS protocol
- [dashpay/dash](https://github.com/dashpay/dash)
    - Dash - Reinventing Cryptocurrency
- [monero-project/monero](https://github.com/monero-project/monero)
    - Monero: the secure, private, untraceable cryptocurrency
- [bitzeny/bitzeny](https://github.com/bitzeny/bitzeny) [BitzenyCoreDevelopers/bitzeny](https://github.com/BitzenyCoreDevelopers/bitzeny)
    - Bitzeny: Japanese crypto currency that can be mined in an ordinary PC.


## 参考

- [さまざまなブロックチェーン技術 - Qiita](https://qiita.com/akitoh/items/bebf1bf3d71d3e4b96b0)
- [imbaniac/awesome-blockchain: Curated list of blockchain services and exchanges 🔥🏦🔥🏦🔥🏦🔥](https://github.com/imbaniac/awesome-blockchain)
40代後半のソフト開発エンジニアが、転職活動を通じて感じたこと

# はじめに
　40代後半でエンジニアとして転職活動して感じたことをとりとめもなく書いていきます。
あくまでも個人的感想です。

# 転職活動を通じての感想
## 年齢に関すること
　明示的に募集要項には書いてないですが、年齢が理由ではじかれた、と感じたことは多々ありました。40代後半は入社時期がバブルと重なることから、そこそこ歴史のある大手企業にはこの世代の社員が余るほどいることが要因かと思います。

## ベンチャー or 大手、外資 or 国内
　転職を考える際の企業のざっくり分類としては、ベンチャー or 大手、外資 or 国内という二つの軸が考えられます。

* 外資大手：ポジションに人を配置する傾向が強い。自分にマッチするポジションの募集があれば、即応募。
* 外資ベンチャー：かなり高い英語力必須、ほとんどの企業でプログラミング試験ありと、予想される。
* 国内大手：面接にこぎつけるのも厳しいと思われる。多分年齢が要因。
* 国内ベンチャー：年収が他の3タイプと比べると少なめ。その分をストックオプションなどで補っていることもある。また技術志向のベンチャーの場合、スキルレベルをしっかり見られる傾向あり。

## 英語
　ほとんどの募集でそれなりに英語力が要求されるケースが多いようです。外資系はもちろんですが、日本企業でも職種（ポジション）によって必要です。私の英語力はTOEIC800点ほどですが、外資系で上司とのコミュニケーションが英語とかのケースだと、厳しそうです。
　また、外資系ベンチャーなどでは、採用面接自体が英語で行われる場合や、skypeやhangoutsを使って海外と英語で面接することもあり、それなりに準備しておかないと、ほとんど喋れず、玉砕します。

## スキル
　自分のエンジニアとして強みなどをアピールする際、実際の業務については、守秘義務もありなかなか話しずらいことが多いため、何かしらアピールできるネタを準備しておいたほうが面接で話しやすいです。私の場合は、仕事と並行して大学院で研究を行なっていたため、その内容をアピールしました。オープンソース関連の活動や勉強会の活動などもアピールのネタとしてありと思います。

## 面接（の服装）
　とりあえず、スーツとネクタイはして行った方が良さそう。真夏の面接で、スーツ、ネクタイ無しで行った面接は全てお断りされてしまいました。

## プログラミング試験
　プログラミング試験が選考過程の最初に行われることがあります。だいたい30分で1問のプログラミング課題を回答する感じで、10行から15行程度のコードを書きます。落ち着いて回答すればなんてことは無い問題が多いのですが、時間制限があると焦ってしまうので、可能なら例えば下記のサイトで事前に練習しておくのも良いかも。
https://www.hackerrank.com/dashboard

## エージェント
　今時はどの企業も採用の Web サイトを持っているので、そこから直接応募できますが、エージェントを使うことをオススメします。理由は下記の通りです。

* 自分が全く考慮してなかった企業の募集を紹介してくれる
* 各企業毎の面接時のポイントなどをアドバイスしてくれる。
* 年収などの条件交渉をしてくれる

　ちなみに、私が使っていたエージェントは、ビズリーチ、リクルートエージェント、パソナキャリア、などです。
　LinkedIn や Wantedly など転職系の SNS も、自分のプロフィール（職務経歴など）を整理してまとめられるところは意味がありそうです。これらの SNS 経由でメッセージをいただくこともありましたが、私の場合はあまりうまく活用できなかったと感じてます。

## 活動期間
　私の場合、活動開始から転職するまで1年半以上かかりました。焦らず気長に転職活動を行うつもりでいたほうが良さそうです。
　
# 最後に
同世代で転職を考えている方の参考になれば幸いです。
コメント、質問いただければ、ベストエフォートになりますが、
回答させていただきます。
sessionとcookieの違い

#cookie・・・クライアント側で保持

ブラウザを閉じても残り、期間を置いた後にもデータを残すことが可能。
また、情報をユーザ側に置くため、サーバに余計な負荷をかけることがない。
逆に、ユーザーに依存することが多く、また改ざんすることも可能なため、情報の信頼性に欠ける部分がある。

#sessionn・・・サーバ側で保持
サーバサイドで情報を保持するため、クッキーと違いデータの改ざんが困難。
セキュリティ上の観念から、ユーザー認証によるログインなど顧客情報などを扱うようなサイトに適している。
PHP で Google Drive を活用


https://developers.google.com/drive/v3/web/quickstart/php


````
$ composer require google/apiclient
````

https://console.developers.google.com/start/api?id=drive

からプロジェクトを選択して、APIを有効にする。

認証方法の追加で、認証用のクライアントを作成する。

## 使い方

`google-api-php-client` があるのでコレを使うと便利。


https://github.com/google/google-api-php-client


````
composer require google/apiclient:^2.0
````

基本的なコードは、認証関連の client 作成してソレを `Google_Service_Drive` に注入する感じ。

````
$service = new \Google_Service_Drive($client);

$service->files->get(...)
````

client の作成方法には、Oauthを使う方法と、サービスアカウントを作成する方法とがある。

そのへんは https://github.com/google/google-api-php-client#examples アタリを参考に

## APIの発行

`Google_Service_Drive` 内のプロパティ構成は以下のAPI リファレンスと対になっている。

https://developers.google.com/drive/v3/reference/


### フォルダ内のファイルを取得

https://developers.google.com/drive/v3/reference/files/list

````
$result = $service->files->listFiles([
	"q" => "'xxxxxxxxxxx' in parents"
]);

foreach ( $result->getFiles() as $file) {
	assert($file instanceof \Google_Service_Drive_DriveFile);
	$file->getName();
	$file->getMime();
}
````

### ファイルのダウンロード

https://developers.google.com/drive/v3/reference/files/get

リファレンスにはなぜか載っていないが、 `alt=media` を付けるとダウンロード出来る。

````
/** @var GuzzleHttp\Psr7\Response $response */
$response = $service->files->get($file->getId(),[
	"alt" => "media"
]);
$response->getBody()->getSize());
````

### ファイルの作成

https://developers.google.com/drive/v3/reference/files/create

Request Body の file Resource は基本 `Google_Service_Drive_DriveFile ` で作成する。 

````
$body = new \Google_Service_Drive_DriveFile();
$body->setId($service->files->generateIds()->getIds());
....
$service->files->create($file);
````

### ファイルのコピー

https://developers.google.com/drive/v3/reference/files/copy

````
$body = new \Google_Service_Drive_DriveFile();
$body->setMimeType("application/vnd.google-apps.spreadsheet");
$body->setParents([$tarDir]);
$body->setName(Str::random());
$service->files->copy("xxxxxxxx",$body);
````