OmniAICreator/Qiita-1.07M huggingface dataset:
CloudFrontにおけるWebPの選択的レスポンス

WebPファイルがある場合、対応ブラウザにはそれを返すWebサーバーの設定方法について書いてきました。

* [Apache向け](https://qiita.com/miyanaga/items/6570c3c9ae8e15dbb57c)
* [nginx向け](https://qiita.com/miyanaga/items/94447efae0bf767b9f2b)

S3に画像ファイルを配置するケースも増えていますが、S3自体には上記の代替となるようなURL書き換えの仕組みがありません。

そこでCloudFrontにリクエストやレスポンスを変換するロジックを実装できる、Lambda@Edgeを使う方法を試してみました。

# Lambda@Edge用JavaScriptコード

このようなJavaScriptコードを書きました。

`Accept`ヘッダは簡単に取得できます。WebP画像(image.png.webp)の有無は実際にオリジンに対して`HEAD`リクエストを送信して確認します。

S3に限らず汎用的なWebサーバをオリジンにできます。

実際に設定するには、CloudFrontの対象`Behavior`で`Lambda Function Associations`に`Origin Request`として対してこのLambda関数を割り当てます。`Include Body`は不要です。

`Whitelist Headers`に`Accept`を追加することも必要です。

```javascript
const BASE_URL = 'https://s3.amazonaws.com/webp-lambda-edge-test';
const TIMEOUT = 3 * 1000;

const https = require('https'),
    url = require('url');

exports.handler = async (event, context) => {
    const request = event.Records[0].cf.request;

    // JpegまたはPNGファイルへのリクエストのみ対応
    if (request.uri.match(/\.(jpe?g|png)$/)) {
        // Acceptヘッダがimage/webpを含むか
        let webpAcceptable = false;
        try {
            if (request.headers.accept[0].value.match(/image\/webp/i))
                webpAcceptable = true;
        } catch (ex) {}

        if (webpAcceptable) {
            // WebP対応ブラウザの場合はWebP版ファイルの有無をHEADメソッドで確認
            await new Promise((resolve, reject) => {
                const webpUri = request.uri + '.webp';
                const req = url.parse(BASE_URL + webpUri);
                req.method = 'HEAD';
                req.timeout = TIMEOUT;
                https.request(req, res => {
                    // ステータスコード2XXであればWebPが存在するのでリクエストURIを変更
                    if (res.statusCode >= 200 && res.statusCode < 300)
                        request.uri = webpUri;
                    resolve();
               }).on('error', reject).end();
            });
        }
    }

    return request;
};
```

Lambda@Edgeは、通常のLambda関数と異なる点がいくつかあるようです。

[Lambda 関数の要件と制限](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-requirements-limits.html)

設定について詳しい手順もまた今度、書いてみたいと思います。
三項演算子のハテナ"?"

swiftでは、ハテナ"?"をオプショナル型を用いる時に利用するが、それ以外にも三項演算子として用いることがある。三項演算子を使うと、if文よりも短く条件分岐が書ける。以下に例を示す。

```swift:if文で表すと
var a = 0

if a == 0 {
    a = 1
} else {
    a = 0
}
```

```swift:三項演算子?で表すと
a = a == 0 ? 1 : 0
```
綺麗だ！！！！
autofillによる入力値であるかの判定

フォームの入力値がブラウザのautofill機能によるものかは、フォームが`:-webkit-autofill`セレクタを持っているかで判定できる。
Firefoxの場合は`:-webkit-autofill`セレクタを取得できないが、autofill時に発生するinputイベントにdetailプロパティ(マウスイベント、キーイベントの場合のみ含まれている)が存在するかで判定できる。

```js
function hasAutofill(input, detail) {
  var isAutofilled = false;

  try {
    isAutofilled = Boolean(input.parentNode.querySelector(':-webkit-autofill'));
  } catch (e) {
    // firefoxはautofillセレクタが取得できないので、detailプロパティ(マウスイベント、キーイベントの場合のみ含まれている)が存在するかで判定する
    isAutofilled = Boolean(detail === 'undefined');
  }

  return isAutofilled;
}

function onInput(e) {
  var detail = typeof e.detail;
  console.log(hasAutofill(e.target, detail));
}
```
Master NodeにPodをデプロイするための設定

Master Node1つのみの構成でKubernetesのセットアップを行った際に、セットアップ作業はエラー無く完了したにもかかわらず、Podのdeployを行うとpendingになってしまう現象が発生しました。
原因の調査と対応方法についてシェアします。
なお、この対応をした環境は検証用の環境であり、敢えてMaster Nodeの1台構成で構築している環境です。ご利用の環境における適切なNode構成は別途検討が必要です。
## 環境
OS: Ubuntu 16.04.01
Kubernetes: v1.11 

## 現象
* Kubernetesをセットアップする間は特にエラーはなく、kube-systemのpodも正常に稼動している。
* しかし、podをdeployするとpending状態となり起動しない。
* kubectl describe poを実行すると「0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.」とのメッセージ。

## 原因
* 上記のメッセージは「NodeのTaintの条件に対応した状態ではない（= not tolerate）Podをデプロイしようとしたのでデプロイできません」という意味。
* Master Nodeにデプロイできるようにするにはtaintを外す処理が必要。

※Taintsの概要については[Kubernetesのtaintsとtolerationsについて](https://qiita.com/sheepland/items/8fedae15e157c102757f)を参照。とてもわかりやすい！

## 対応方法
* 「kubectl get node」コマンドでMaster Nodeの名前を確認する

```cmd:
$ kubectl get node
NAME      STATUS    ROLES     AGE       VERSION
myhost    Ready     master    20h       v1.11.1
$
```
* 「kubectl describe node `<node-name>`」コマンドを実行しMaster Nodeの「Taints: 」に設定された値を確認する

```cmd:
$ kubectl describe node myhost
```
* Taintsが設定されている場合は以下のように表示される
 * 下記はdescribeコマンドの出力結果の抜粋

```cmd:
CreationTimestamp:  Thu, 18 Oct 2018 13:55:57 +0900
Taints:             node-role.kubernetes.io/master:NoSchedule
```
* 設定を外すために「kubectl taint nodes `<node-name>` `<value-of-tains>-`」を実行する
 * tainsの値の後ろに`-`をつける 

```cmd:
# kubectl taint nodes myhost node-role.kubernetes.io/master:NoSchedule-
node/myhost untainted
#
```
* Tainsの設定値を再度describeコマンドで確認する
 * Taintsが設定されていない場合は`<none>`と表示される

```cmd:
CreationTimestamp:  Thu, 18 Oct 2018 13:55:57 +0900
Taints:             <none>
```

※tainsコマンドのガイドは以下
https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
has_one かつ presence: true な関連をもつモデルを factory_bot で定義する

こんな感じで `has_one` かつ `presence: true` な関連を作りたいとします[^1]:

[^1]: 「わざわざテーブルを分けるくらいなら、 B の属性を A に含めればいいじゃないか」という指摘もあると思いますが、世の中にはどうしてもこうせざるを得ない状況というのも存在するのです。

```rb
class A < ApplicationRecord
  has_one :b
  validates :b, presence: true
end

class B < ApplicationRecord
  belongs_to :a
end
```

この２つのモデル `A` `B` を [factory_bot](https://github.com/thoughtbot/factory_bot) を使って正しく定義するには以下のように書きます:

```rb
FactoryBot.define do
  factory 'a' do
    after(:build) do |instance|
      build('b', a: instance) unless instance.b
    end
  end

  factory 'b' do
    association :a, factory: 'a', strategy: :build
    after(:build) do |instance|
      instance.a&.b = instance
    end
  end
end
```

このように書くことで `build('a')` `build('b')` のどちらも永続化されていない正しい状態の `A` と `B` インスタンスを生成することができます。
なぜArrayListをListに代入するのか

# 結論というか個人的見解
関心事がそこにないからではないだろうか。

極端な言い回しになるが
利用者はinterfaceを保証してさえいれば
`List<T>::size()`の処理コストに興味はない。

Listにしなくてはいけない理由にはならないが
そこまで意識する明確な理由がない。

結果、事足りてるからListでいい。
だから、Listに代入している。

### 補足というか言い訳
もちろん、商用サービスであれば、PoCや性能試験などで検証しているべきだと思うし
その使い方が正しかったかどうかは別プロセスで検証する必要がある。
動けばいい、というコーディングを推奨する意図はない。

あと、Stream APIが追加されて以降`new ArrayList<>()`なんて書く機会が減り
今となってはどーでもいいことなのかもしれない。

# 読んでくださった方への期待
~~炎上するような~~異論反論など、いろんな意見がいただけたら嬉しいです。

# 背景
今週前半、twitterのバズワードを見ていたら、都心の喫茶店が炎上していた。

皆が何についてどういう印象を持つのかを深掘りしている流れから、
気がつけばクレーマーの特性について調べていた。
（Wikipediaのリンクを辿っていくと、何故か必ず最後に宇宙にたどり着くような感じで。）

その時、ややコメント欄が炎上気味のとあるJavaの記事において、なぜ

```java:sample1.java
ArrayList<T> list = new ArrayList<>();
```
ではなく、

```java:sample2.java
List<T> list = new ArrayList<>();
```
なのか、という質問が目についた。

質問された側は

- gitやらOSS上にそんなコード無いでしょ

質問した側は

- 宗教的で理由がないのにそうしている

ということを書いていた。

そのコメント欄の荒れ方から、
当初は「こういうタイプもいるのね…」とスルーしたのだけれど、
次第に「でも確かに…なんでだろうな？」と思い
「同じ質問をされたら自分ならどう答えるか」をアウトプットしたかった。

今となっては、その人はクレーマーではなく、
何気なく書いていたコードに疑問を持つ機会をくださったと感謝しています。

名前は出しませんが、この場を借りてお礼申し上げます。
Symfonyで特定パス以下を全部リダイレクトする

## TL;DR

もう使わなくなったURLとかで、特定パス以下を全部リダイレクトしたいというケースってありますよね。

NginxやApacheでリダイレクトする方法もあると思いますが、アプリでやりたい場合もあると思います。

そういう場合の方法

## Symfony Routingの書き方

この機能を利用

https://symfony.com/doc/current/routing/slash_in_parameter.html

```php
use Symfony\Component\Routing\Annotation\Route;

class DefaultController
{
    /**
     * @Route("/old-url-path/{any}", requirements={"any"=".+"})
     */
    public function someAction()
    {
        return $this->redirectToRoute('top_page'):
    }
}
```

こうすることで `{any}` に スラッシュ `/` が含まれていてもトップページへリダイレクトすることができます。
深層学習の数式早見表

###対象とする読者
深層学習を利用するユーザ，実装するユーザ．
※研究者は含んでいません．(より高度な数学が必要になります．）

####勾配
ある2変数関数を
$$f(x)=\frac{1}{2}x_1^4 - 2x_1^2x_2+4x_2^2+8x_1+8x_2$$
とします．するとf(x)の勾配は

```math
\nabla f(x) = \begin{bmatrix}
2x_1^3-4x_1x_2+8\\
-2_1^2+x_2+8
\end{bmatrix}
```

一応説明すると，f(x)の$x_1$に関して偏微分したものを一行目，$x_2$に関して偏微分したものを2行目ということになります．
これは3変数や多変数においても同様です．

####Hesse行列
f(x)のHesse行列とは

```math
\nabla^2f(x) = 
\begin{bmatrix}
6x_1^2-4x_2&-4x_1\\ 
-4x_1&8
\end{bmatrix}
```

になります．
説明すると1行目の1列目(1,1)は1行目の$\nabla f(x)$の$x_1$に関して偏微分したもの，
（1，2）は1行目の$\nabla f(x)$を$x_2$に関して偏微分したもの
次に2行目2列目（2，1）は2行目の$\nabla f(x)$の$x_1$に関して偏微分したもの，
（2，2）は2行目の$\nabla f(x)$を$x_2$に関して偏微分した要素を持つ2行2列の行列になります．(2変数関数の場合)

$\nabla$はナブラと読みます．

####更新量
$\Delta w ^{(t)}$ = $- \eta \nabla E(w^{(t)})$
ここでの$\Delta$は勾配降下法の更新量を表しています．
$\Delta$（デルタ）は他の数学では作用素を表してたりするので注意が必要です．

####アダマール積
2つの任意のｄ次元ベクトル$v=(v_i),w=(w_i)$に対し，次でアダマール積を定義する．

$v \odot w \equiv (v_1w_1 \quad v_2w_2 \quad v_3 w_3 \quad \cdots \quad v_d w_d )^T$
ようは要素ごとの積です．
$\odot$の記号も別の意味があったりするので注意．
$T$は転置を意味しています．$\equiv$は”恒等式”を意味しています．恒に等しいという意味です．
よく使うgit コマンド

# git reset
git reset --hard ORIG_HEAD
git reset --hard HEAD~
git reset --hard 411ea67

# master以外のローカルブランチを消す
git branch |grep -v "master" |xargs git branch -D

# 特定のファイルを特定のコミットに戻す
git checkout [コミット番号] [ファイルパス]


# squash mergeのメリット・デメリット
## デメリット
・squash mergeしてもらった後で、自分のリポジトリに再び取り込み、
　自分のweb上の該当のリポジトリのコミットを見ると、#12とか
　出てくるが、アップストリームの#12と勘違いされる
　でも、こんなマニアックなところみないか。
・人のリポジトリを参照しに行くマージなので、
　その人が辞めちゃうと見れなくなる。
・機能単位にコミットが打てない
・細かく納品する場合、やりずらい

## メリット
・blameするときにコミットメッセージにRP番号が載っているので移動しやすい
python unittest時のResourceWarning: unclosed <ssl.SSLSocket を消す

python のunittest時に

```python
if __name__ == '__main__':
    unittest.main(warnings='ignore')
```

としても

```
/path/to/lib/python3.6/_collections_abc.py:833: ResourceWarning: unclosed <ssl.SSLSocket fd=10, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('xxx.xxx.xxx.xxx', 53977), raddr=('216.58.197.237', 443)>
  self, *args = args
```

といったワーニングが出るときの対処法。

```python
import warnings
def ignore_warnings(test_func):
    def do_test(self, *args, **kwargs):
        with warnings.catch_warnings():
            warnings.simplefilter("ignore", ResourceWarning)
            test_func(self, *args, **kwargs)
    return do_test
```

と定義したうえで、以下のように各テストメソッドでデコレータとして呼ぶ

```python
    @ignore_warnings
    def test_hoge(self):
```

これしか回避方法みつからなかった。
良い回避策知っている人が居たら教えてください。
ubuntu LTS 18.04 Anaconda3でPermissionErrorの対処メモ

## 状況
Ubuntu初心者です。

Ubuntu LTS 18.04にAnaconda3(5.2.0)を普通にインストールした状態にて、conda installやpip installで何かパッケージをインストールしようとしたときに

```
PermissionError(13, 'Permission denied')
```
が出てインストールが失敗しました。

## 対処

シェルを立ち上げてanaconda3ディレクトリがある場所で
（通常anaconda3はhome直下に作られるようなのでそのまま）

```
~$ sudo chown -R ＜ユーザ名＞ anaconda3
```
Anaconda3ディレクトリの所有権を現ユーザに変更することでインストールできるようになりました。


＜ユーザ名＞は今anacondaを使用しているユーザ名になります。
ユーザ名がsamacobaならば

```
~$ sudo chown -R samacoba anaconda3
```
になります。

- sudo：root権限で実行
- chownコマンド：所有権の変更
- -Rのオプション：Anaconda3以下全部のディレクトリについて変更

おそらく、anacondaはデフォルトでユーザディレクトリにインストールされますが、作ったanaconda3ディレクトリにユーザの所有権がないのでそんな感じになったのではないかと思います。
php-master-changes 2018-10-18

今日はドキュメントの修正とテストの微修正、ビルド用ファイルからの不要な記述削除があった！

Zeev とか Dmitry（と ZF の中の人）のいるチームが[まるっと退職](http://zsuraski.blogspot.com/2018/10/the-future-of-zend-engine-and-zend.html)することになって受け入れ先探してるみたい！
フルタイムのコミッターいると違うよなー、というのはコミットログ追ってると思うので、良いところが見つかるといいね！

# 2018-10-18
## cmb69: [ci skip] Update UPGRADING wrt. tidyp support
- https://github.com/php/php-src/commit/24b677925434f4c2f3065646d1aff3f2eeaf2e13
- [7.3~]
- [tidyp](https://github.com/petdance/tidyp) のサポートについて UPGRADING に追加

## weltling: Fix test when it's run on another drive
- https://github.com/php/php-src/commit/fda06127fa71637df7913e06fc8124448c934fdc
- [7.1~]
- ext/opcache の Windows 用のテストで、使うドライブレターが固定になっていたのを修正

## TysonAndre: Fix a typo in UPGRADING.INTERNALS
- https://github.com/php/php-src/commit/78a8b0f0d77938fecb178b8f58d2463de0c01947
- ドキュメントの typo を修正

## petk: Move all testing docs to qa.php.net
- https://github.com/php/php-src/commit/0e60b812c05ed5e3704ab6f31f29040040c3edd7
- README.TESTING を削除し、参照箇所も削除し、必要なら qa.php.ne への参照を追加

## petk: Remove stamp-h
- https://github.com/php/php-src/commit/370882bb598599a768b2fe05c7997d6248b68419
- かつて stamp-* なファイルをビルド中に生成していたが、[だいぶ前](https://github.com/php/php-src/commit/232afa4816c60a20d3db48c304ac59312d46ec46)に使われなくなっており、.gitignore などへ名残が残っていたのを削除
DAppsの例

こんにちは、私はグウェン([https://twitter.com/gwenskiesHere](https://twitter.com/gwenskiesHere))です。今日の話題はDAppsです。これはブロックチェーンに関する私の学べるの一部です。
##DAppsとは
It's like a "distributed app store." You can issue with DApps. DApps connects users and providers immediately.
##3種類DApps
Users can create a computing platform with three types of applications.
* Apps that can handle money
* Apps that use money
* Other category apps include voting and governance systems
##有名Ethereum-based DApps
###Golem
With Golem you can make PC and data center power to supercomputer. The project distributes computational loads to "providers". These providers can share resources in exchange for GNT tokens.
to know more about golem: https://golem.network/
###IDEX
IDEX is an Ethereum based distributed exchange with a pair of Ethereum and ERC 20 token transactions. IDEX utilizes smart contracts to manage user transactions.
to know more about idex: https://idex.market/eth/aura
###Etheremon
Eternemon can be traded like a traditional collectible. Unlike traditional goods, in the Etheremon world, you can train Etheremon, kill others and get EMONT (ERC-20 token in game currency).
to know more about ethermon: https://www.etheremon.com/?utm_source=DappRadar&utm_content=visit-website
###Bancor
The Bancor protocol is a new standard of encryption called a smart token. The protocol uses a "connector" module that maintains the balance of other ERC 20 tokens in the Smart Contract. The Bancor Formula always recalculates the price to maintain the balance between the Smart Token and its connector. The Bancor Protocol is a technical revolution that allows you to convert tokens with opposite wishes without matching them to the two parties.
to know more about: https://about.bancor.network/
###Stox 
Stox is an Ethereum-based block chain prediction platform. Build a new market, make predictions, trade with peers and monetize on one distributed platform.
to know more about: https://www.stox.com/?utm_source=StateOfTheDApps

**source**: 
https://www.coindesk.com/information/what-is-a-decentralized-application-dapp/
https://blockgeeks.com/guides/dapps/
Swift 初心者のエラー集

初めてIOSアプリ作り取り組む方
自分へのmemo

起きたエラーとその対処方法。




初めてのエラー

libc++abi.dylib: terminating with uncaught exception of type NSException

電卓アプリを作成中に、１つのボタンを押した時に、上記のエラーコードが出ました。

まず、アプリが動かなくなってエラーだと気づき、Xcodeのエラーコードの表示場所をぐぐりました。
そしたら
https://qiita.com/aritaku/items/733f85ff43b8fc268ba6
にわかりやすい記事発見。（ありがとうございます！！）

そこからエラー文を特定し、その文全てをコピーし、ググる。
すると、それっぽい記事が。。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14142820774

その記事と同じ接続がダブって起きていたエラーでした。
ボタンの名前を入力する際にスペルミスしたので、コードを削除して
また初めから作成した際に接続まで削除できてませんでした。

先人に感謝です。
なぜクラスを変更する理由は1つ以上存在してはいけないのか？

# 単一責任の原則とは？
>クラスを変更する理由は1つ以上存在してはならない
単一責任の原則（SRP）では、「役割（責任） = 変更理由」と定義している。
クラスを変更するのに2つ以上の理由がある場合、そのクラスには2つ以上の役割があることになる。

## なぜクラスを変更する理由は1つ以上存在してはいけないのか？
この**なぜ**が今回の一番のポイントになってくるかと思います。それでは説明していきます。

![発表資料【Clean Architectへの道】-依存AからB (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/234760/23d5e0be-2aa8-9507-24e7-3f19dfa6af01.jpeg)

まず依存と変更の関係を再確認します。この図はAがBに依存している図です。
AがBを利用しているので、Bを変更すれば、利用しているAの修正が必要になります。

![発表資料【Clean Architectへの道】-ページ11.jpg](https://qiita-image-store.s3.amazonaws.com/0/234760/502c58bf-b5a3-a574-6f56-0ffd2db0bf64.jpeg)

User1はcalculatePayをUser2はreportHoursをUser3はSave()のみを利用しているとします。
calculatePayのみを変更した場合でも、「依存と変更の関係」で説明したように利用者であるUser2、User3の修正が必要になってきてしまいます。

![発表資料【Clean Architectへの道】-ページ11 (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/234760/84e7f0ca-b705-6fed-a2f2-76e31f845a08.jpeg)

このようにすることで、calculatePayの変更の影響はUser1のみなります。

**なぜクラスを変更する理由は1つ以上存在してはいけないのか？**の理由がわかってきたかと思います。
**一つのクラスに変更理由が複数あると、関係ない箇所にまで修正の影響が出てしまうからです。**

つまり**変更する理由が同じものは集め、変更する理由が違うものは分ける**というのが、この原理原則の本質となる部分です。

## どのようなプロセスでこの原則を守るか？
**変更する理由**ってどんな理由でしょうか？ちょっと考えてみてください。

先ほどの図のようにEmployeeを使うのはUserです。
つまり変更する理由というのは、Userにあります。
Userを洗い出すことで、共通の利用理由を持っているアクター（Userのグループ）がわかってきます。
例えば、経理部門の人、人事部門の人、データベース管理者などがアクターとして挙がってくるかと思います。

単一責任の原則を実現する方法が見えてきました。
以下の手順で考えてみると良いかもしれません。
1.そのモジュール(Employeeとか)を使用するアクターを定義
　例：経理部門の人
2.アクターの責務を洗い出す
　例：給与計算(calculatePay)、etc...
3.アクターの責務のみを持つモジュールを作成


![発表資料【Clean Architectへの道】-ページ12.jpg](https://qiita-image-store.s3.amazonaws.com/0/234760/a2f8b6e6-6d3a-aa30-1df5-45d38c72eb7f.jpeg)

少し話がそれますが、モジュールを別けることによって、全く共通の処理が見えてくると思います。
それは継承を持ちいて対応することが、解決策になるかと思います。

# 単一責任の原則が満たせているか確認するための質問
**・その振る舞いを利用するアクターは誰か？**
　→アクターが一人ならば問題ありません。
**・その振る舞いは、どのアクターによって利用されるのか？**
　→アクターが違うと変更理由も違うのでモジュールを別ける必要がわかります。
**・その振る舞いはそのクラスが行うべきことか？**
　→そのクラスが持つ必要のない振る舞いがあることで、アクターが複数になる可能性があります。振る舞いが違うならば、別けることで利用するアクターも分かれます。

# 最後に
SOLIDの原則の一つである単一責任の原則について説明しました。
業務を理解していないとアクターがわからないので、業務理解の必要もあるなと感じました。

他にもSOLIDの原則をまとめていきます。
Go言語でpythonやscalaのようなDefault引数を実現する

# はじめに
Dave Cheney氏のFunctional options for frendly APISを読みました。
https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis
この記事で学んだデザインパターンを活かして問題を解決してみたいと思います。

Go言語にはpythonやscalaのようなデフォルト引数を指定することはできません。
ですが、構造体の初期化時に引数を省略可能にしたい場合ありませんか？

この問題を解決するために最善な解決策までをプロセスを交えながら説明していきます。

# 解決したい問題
以下のようなfunctionをイメージしてください。

```golang
func NewServer(addr string, clientTimeout time.Duration, maxconns int, maxconcurrent int, cert *tls.Cert) (*Server, error)
```

簡単に使えそうでしょうか？
このfunctionにはいくつかの問題を感じます。
・テストの時などtimeout値やTLSはなんでも良いのにわざわざ利用者はこの値を設定する必要がある。
・引数が増えた時に、このfunctionを使ってる箇所を全て修正する必要がある
・設定する値を知るために仕様を理解する必要がある。
・etc...

これらの問題を解決するためにどのような策が有効でしょうか。

# 解決策1 コンストラクタで解決
コンストラクタで解決出来そうです。

```golang
func NewServer() (*Server, error)

func NewServer(addr string) (*Server, error)

func NewServer(addr string, clientTimeout time.Duration) (*Server, error)

func NewServer(addr string, clientTimeout time.Duration, maxconns int) (*Server, error)

func NewServer(addr string, clientTimeout time.Duration, maxconns int, maxconcurrent int) (*Server, error)

func NewServer(addr string, clientTimeout time.Duration, maxconns int, maxconcurrent int, cert *tls.Cert) (*Server, error)
```
どうでしょうか？
6つの引数が存在するので、6*6=36通りのコンストラクタを用意すれば、柔軟に引数の設定が出来そうですね！！
しかし、36通りとなると...用意するのも面倒ですが、一部変更することで全て変更する必要が出てきてしまいます。

# 解決策2 Config構造体で解決
ならConfig構造体で解決するのはどうでしょうか？

```golang
type Config struct {
    Timeout time.Duration
    Cert *tls.Cert
    // ・・・
}

func NewServer(addr string, config Config) {
    // ...
}
```

```golang
func main() {
    srv, err := NewServer("localhost", Config{})
    // ...
}
```

Configで値を自由に設定し、渡すことが可能になりました。
ただ、値を設定しない時は、nilや空の構造体を渡す必要があります。
値を設定する必要がないなら何も引数に渡したくない・・・

# 解決策3　Config構造体を可変長引数で解決
Config構造体を可変長引数で渡したらどうでしょうか？

```golang
func NewServer(addr string, config ...Config) (*Server, error) {
    // ...
}
```

```golang
func main() {
    srv, err := NewServer("localhost")
    // ...
}
```

ついに解決しましたね！！
と思いきや、こんな使い方をする人を想定していませんでした。

```golang
func main() {
    srv, err := NewServer("localhost", Config{/* ・・・ */}, Config{/* ・・・ */})
    // ...
}
```

コメントに「Configの引数は1つのみにしてください」と書けば良いでしょうか？
機能を提供していながら、利用者に色々考えさせる設計って微妙ですよね。

# 解決策4　Functional Optionsで解決
Fuctional Option Patternは構造体の初期化時にオプション引数を与えるためのデザインパターンです。


```golang
type Option func(*Server)

func Timeout(t int) Option {
    return func(s *Server) {
        s.Timeout = time.Duration(t) * time.Second
    }
}

// 他にも設定したいパラメータを上記のように記載する

func NewServer(addr string, options ...Option) (*Server, error) {
    l, err := net.Listen("tcp", addr)
    if err != nil {
        return nil, err
    }
    
    srv := Server{listener: l}
    
    for _, option := range options {
        option(&srv)
    }
    return &srv, nil
}
```

```golang
func main() {
    srv, err := NewServer("localhost", Timeout(30))
}
```

ついに可変長引数でパラメータを渡すことが出来ました。
これがデフォルト引数を使った構造体生成への最善の解決策です。

それでは振り返りとして何が解決されたのかまとめです。
・1つ1つのパラメータを独立して設定する事が出来る
・引数を設定しなくても、defaultの設定値が使われる
・記述量も多くなく読みやすい
・引数が拡張されても、使う側に影響がない
・nilや空の構造体を渡す必要がない

# まとめ
Go言語のようにデフォルト引数を設定する機能が提供されていなかったとしても、
ここで示した解決策のように自分でdefault引数機能を作る事が出来る事がわかりました。
python のフレームワークを使ってみた

<h1>目的<h1>

Pythonについて経験が浅いので、フレームワークを利用しながら、知識を深めました。

<h1>目標<h1>

目標は、turboGearsフレームワークを利用して何かを作ることです。

<h1>TurboGearsとは<h1>

TurboGearsとはMochiKit、SQLObject、CherryPy、Kidなどの基礎となる
コンポーネントの上に構築されているらしいです。
参考サイト
http://www.turbogears.org/index.html
https://ja.wikipedia.org/wiki/TurboGears

<h1>Pythonで確認した内容<h1>

TurboGearsで利用することができる、CherryPyを自分が利用しているMacPCで動かしました。

<h1>CherryPyを動かしてみた<h1>

始めにCherryPyを実行するプログラムを取得しました。

```
git clone https://github.com/cherrypy/cherrypy
```

ソースコード取得すると、チュートリアル用のプログラムが存在するので、実行をしてみました。

```
macbook:tutorial mac$ python tut01_helloworld.py 
[19/Oct/2018:07:10:17] ENGINE Listening for SIGHUP.
[19/Oct/2018:07:10:17] ENGINE Listening for SIGTERM.
[19/Oct/2018:07:10:17] ENGINE Listening for SIGUSR1.
[19/Oct/2018:07:10:17] ENGINE Bus STARTING
[19/Oct/2018:07:10:17] ENGINE Started monitor thread 'Autoreloader'.
[19/Oct/2018:07:10:17] ENGINE Serving on http://127.0.0.1:8080
[19/Oct/2018:07:10:17] ENGINE Bus STARTED
```

WEBブラウザ上で以下のURLを実行することで、動作確認をすることができました。

```
http://127.0.0.1:8080
```

チュートリアルのソースコードは、10ファイル存在しており、CherryPyの様々な機能に触れることができます。

<h1>最後に<h1>

簡素ながら、フレームワークの利用したことを記載させて頂きました。
機会があれば、TurboGearsの記事についても投稿させて頂きたいと考えております。
ご一読して頂き、ありがとうございます。
現代のエンジニアが生産性を向上させる最もコスパが良い方法、それはタイピングスキルを磨くことかもしれない

あまりに当たり前過ぎて最近の優秀な若手エンジニアに伝えるのが気恥ずかしいのですが、タイピングスキルを磨くと色々良いことがあるよというポエムです。タイピングスキルを磨くことのメリットの紹介が主な内容で、具体的な学習方法についてはあまり触れません。

# はじめに：タイピングスキルはいつ陳腐化するのか
本題に入る前に、タイピングというスキルがこの先どれぐらい長持ちするかを考えたいと思います。

### キーボードの次のインターフェイス
Amazon EchoやGoogle Homeの一般家庭への普及などに伴い、**VUI（音声ユーザーインターフェイス）**という言葉を耳にする機会が増えました。[^1]
更には、脳波でコンピューターを操作する **BCI（ブレインコンピューターインターフェイス）**という技術の研究も進んでいるようです。[^2]
テクノロジーは目まぐるしく進化しているため、声や脳波でパソコンを操作して仕事する時代がいつかは訪れるかもしれません。[^3]

[^1]: Alexaのページが分かりやすいです: [音声ユーザーインターフェース (VUI) とは _ Amazon Alexa _ アレクサ](https://developer.amazon.com/ja/alexa-skills-kit/vui)
[^2]: BCIが良く分かる良記事です: [【初級編; 2017年版】脳波で機械を操る！ブレインコンピュータインタフェース(BCI_BMI)って何？ - Qiita](https://qiita.com/shartsu/items/e0dbedd891a53a4eb139)
[^3]: パソコンに代わる何かが台頭している可能性もあります

### 私たちはいつまでキーボードを使って仕事をするのか
しかしながら、2018年現在、私の周りのほとんどのエンジニアは、キーボードをタイプしてパソコンを操作し仕事をしています。私が社会人になった約10年前もそうでしたし、初めてパソコンに触れた20年前も同様でした。
これから20年後にどうなっているかは分かりませんが、個人的な感覚として、向こう10年はキーボードが主流のままである可能性は高いように感じます。
ですので、キーボードを素早く正確にタイプする技術、すなわち**タイピングスキルを磨く**ことは10年スパンで考えると決して損にならないはずです。

# タイピングスキルを磨くメリット
ここから本題に入ります。

### プログラミングに投下できる時間を増やせる
質の高いプログラムを書くためには、まとまった集中できる時間が必要です。ただ、多くの職業エンジニアは、プログラミング以外の業務にも時間を割かなければなりません。例えば、ミーティングの議事録作成や、顧客とのメールのやりとり、様々な報告書の作成などです。
タイピングスキルの向上による最大のメリットは、これらの業務を素早く終わらせて、**プログラミングに投下できる時間を増やせる**という点です。自己啓発書などを読んで仕事効率化の知識を身に付けることも大事ですが、タイピングスキルを上げる方が、より即効性があると思います。

### プログラミングにおける「木炭」が手に入る
タイピングスキルの向上は、プログラミングという行為の質を高めることにも良い影響を与えると思います。タイピングが速い人が必ずしも質の高いプログラムを書けるという訳ではありませんが、ポール・グレアムの名著「[ハッカーと画家](https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%A8%E7%94%BB%E5%AE%B6-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E6%99%82%E4%BB%A3%E3%81%AE%E5%89%B5%E9%80%A0%E8%80%85%E3%81%9F%E3%81%A1-%E3%83%9D%E3%83%BC%E3%83%AB-%E3%82%B0%E3%83%AC%E3%82%A2%E3%83%A0/dp/4274065979)」の第0章「メイド・イン・USA」には以下のような一節があります。

> コードは、ピラミッドみたいに、慎重な計画をしてから苦労して組み立てていくものじゃない。一気に集中して素早く手を動かしながら、常に気を変えていく、木炭スケッチみたいなものだ。

シンプルで、手に馴染み、スケッチに適した道具として「木炭」が挙げられています。タイピングスキルを磨くことは、**プログラミングにおける「木炭」を手に入れるための近道**だと思います。

# タイピングスキルを磨くことのコスパの良さ
人の記憶メカニズムは、**陳述記憶**と**非陳述記憶**の二種類に分類できます。陳述記憶とはイメージや言語として内容を想起できるもので、プログラミング言語に関する知識などが該当します。
一方、非陳述記憶の代表として**手続き記憶**というものがあります。[Wikipedia](https://ja.wikipedia.org/wiki/%E6%89%8B%E7%B6%9A%E3%81%8D%E8%A8%98%E6%86%B6)にはこのように書かれています。

> 手続き記憶は簡単には言葉で説明できないことが多く、意識しなくとも使うことができる。いわゆる『体が覚えている状態』である

陳述記憶はある程度時間が経つと復習しない限りは忘れてしまうのですが、**手続き記憶は一度習得してしまえば滅多なことでは忘れない**という特徴があります。自転車や水泳などが手続き記憶の例として挙げられることが多いですが、**タイピングも手続き記憶に該当**します。
つまり、タイピングは習得までにある程度の学習時間が必要なものの、**一度習得すればずっと使える**ということです。これは非常にコスパが良いです。

# どれ位のタイピングスキルがあれば良いのか
以下の3点を満たしていれば十分だと思います。

1. それなりに正確にタイプできる（誤字の頻度が低い）
2. それなりのスピードでタイプできる
3. キーボードを見ないでタイピングできる

「それなり」とぼかしているのは、絶対的な基準がある訳ではないからです。参考までに私自身を例にしますと、久しぶりに[e-typing](https://www.e-typing.ne.jp/)の腕試しレベルチェックを何回かやってみたところ、スコア300点台前半という結果でした。これぐらいのスコアで、職場でタイピングが速い方と言われる＆会議の全発言を書き起こす類の議事録（いわゆる逐語録）について会議中に半分以上は書き起こせるといったレベル感になります。
個人的な感覚としては、200点台後半以上のスコアであれば業務で困ることは少ないのではないかと思います。

# どうやってタイピングスキルを身に付ければ良いか
無料・有料を問わず世の中には沢山のタイピング教材がありますので、楽しんで続けられそうな教材を選ぶのが良いと思います。タイピングに苦手意識がある方は、ホームポジションを意識して短い単語からステップアップしていく教材を使うのが、遠回りに見えて実は近道になると思います。

それでは、良いエンジニアライフを！
中学２年生でもできるlinuxインストール , KDE neon はwindowsキラーか


## 2度と原爆の被爆国にならないための工夫を政治家はしてるか？
##
##



|neonは　中学生2年の学力あればOK|
|:---|
|話それるが、高校生になったら　MX　linux できるかな。　「ちょいむずのMXのインストール」は　https://hatahata-linux.blogspot.com/2018/09/mx-linux.html 　以下寄り道から戻ります　|


## 前準備) ここだけは中２では無理で、大人がやってあげないといけません
　　neon-useredition-20181011-0542-amd64.isoを　DVDにやいて　これで起動
　　あるいは
　　neon-useredition-20181011-0542-amd64.isoを　USBメモリにddして　これで起動


##１）
|インストール動画は|
|:---|
|拙実時間の　https://www.youtube.com/watch?v=qG9mngyCWpE |
|とか|
|よそ様の丁寧な　https://www.youtube.com/watch?v=rpdfn69JTXM&t=97s |
|とかですが　普通はこんなのはいらないでしょう|

-------

##2)起動後　日本語をえらべば　日本語入力も自動的に入ります
　だたこれだけ、　簡単すぎます、なんの薀蓄もなし。
![neon.jpg](https://qiita-image-store.s3.amazonaws.com/0/211097/bd64b7fb-a5b5-ef6e-dbc9-29cc07d2fdf3.jpeg)


-------

##3）neonをたちあげてみると　他のディストリと付き合うのが嫌になるくらい美人のパリジャンヌだね。

------

##4 ) ソフトのインストは　software center でします
![neon.jpg](https://qiita-image-store.s3.amazonaws.com/0/211097/4fabccbc-a224-7b23-0437-94690f2ff1ec.jpeg)


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

| 横浜中華街の餃子は　なんぼーか　美味しかろ   |
|:---|
|でも、これ難しうて　主婦は　クックパッドみる , neonはクックパッドや |    



|細かいことは　ネットでくぐってね|
|:---|
|例えば　　インストール過程は　http://superjeter007.blog.jp/archives/25405093.html |
|neonの光と影は　　　https://hatahata50.blogspot.com/2018/10/kde-neon-linux.html |

## See you
dash で set -e とシグナルハンドラを両立する

シェルスクリプトでforkした子プロセスを親プロセスの終了処理の中でkillしたいような場合、シグナルハンドラを併用しようとすると以下のような感じになります。
失敗するコマンドがある場合そこでスクリプトを停止させたいので、`set -e`もしておきます。

```sh
#!/bin/sh

pgid=$$  # PGIDはこのプロセスのPID

# シグナル 1 2 3 15 を受け取ったら exit する
# (exit すると exit_handler が呼ばれる)
signal_handler() {
  echo "signal_handler" 1>&2
  exit
}

# プロセスグループのプロセス(自分以外)をすべてkillする(雑)
# もうちょっとまともな終了処理をすべきだが今回本筋とは関係ないので...
exit_handler() {
  echo "exit_handler" 1>&2
  ps -o pgid,pid |
  awk -v "pgid=${pgid}" '$1==pgid{print $2}' |
  grep -v ${pgid} |
  xargs kill
}

trap "signal_handler" 1 2 3 15
trap "exit_handler" 0

set -eu   # これ以降, 0以外の終了ステータスのコマンドがあるとそこでスクリプトが停止する
#false    # 0以外の終了ステータスを返すコマンドがあると停止する(コメントを外すとここで停止する)
while :; do date; sleep 1; done &

# wait(1) だと wait(1) が終了するまでシグナルハンドラが呼ばれないのでループで.
# POSIX互換にこだわらない場合は sleep 0.1 とかでも.
while :; do
  sleep 1;
done
```

このスクリプトはbashのPOSIX互換モードとkshでは動いたのですが、dash（Debian の /bin/sh）だと、`set -e`するとシグナルハンドラが呼ばれなくなりました。

POSIX的にはbash/kshの動作かdashの動作かどっちが正しいのか結局よくわからなかったのですが、以下のような小細工でdashでも`set -e`とシグナルハンドラを両立できたような気がしなくもない。

```sh
#!/bin/sh

pgid=$$  # PGIDはこのプロセスのPID

signal_handler() {
  echo "signal_handler" 1>&2
  exit
}

exit_handler() {
  echo "exit_handler" 1>&2
  # プロセスグループのプロセス（自分以外）すべてkillするという
  # 雑なことをやってるが、孫だけkillする（ひ孫はkillしない）とか、
  # そういうことをやろうと思えば可能
  ps -o pgid,pid |
  awk -v "pgid=${pgid}" '$1==pgid{print $2}' |
  grep -v ${pgid} |
  xargs kill
}

trap "signal_handler" 1 2 3 15
trap "exit_handler" 0

# set -e したい処理はこのサブシェルの中に書く
(
  set -eu
  # コメントをはずすとここで停止する
  #false
  while :; do date; sleep 1; done &
  # forkした後でエラーが発生しても後続のif文によってexit_handlerが呼ばれ、
  # 孫プロセス（サブシェルの子プロセス）をkillしてくれる
  #false
)
exit_status=$?
if [ "${exit_status}" != "0" ]; then
  # サブシェルの終了ステータスが0以外だった場合はここが実行される
  echo "Error: error on subshell" 1>&2
  # exit しているので exit_handler が呼ばれる
  exit 1
fi

# 
# wait(1) だと終了するまでシグナルハンドラが呼ばれないので
# POSIX互換にこだわらない場合は sleep 0.1 とかでも
while :; do
  sleep 1;
done
```

なんかもっとスマートなやりかたないのかな、というかそもそもこれでいいんだろうか。


追記: `set -e` は[よくないぞという意見も拝聴した](https://togetter.com/li/1104655)ので、`&&`をセミコロンがわりに使って`set -e`不要にしてみた。こっちのほうがいいかも。

```sh
#!/bin/sh

pgid=$$  # PGIDはこのプロセスのPID

signal_handler() {
  echo "signal_handler" 1>&2
  exit
}

exit_handler() {
  echo "exit_handler" 1>&2
  ps -o pgid,pid | awk -v "pgid=${pgid}" '$1==pgid{print $2}' | grep -v ${pgid} | xargs kill
  #exit
}

trap "signal_handler" 1 2 3 15
trap "exit_handler" 0

#false &&   # コメントをはずすとここで停止する
( while :; do date; sleep 1; done & ) &&
#false &&   # こっちのコメントをはずした場合はforkしたプロセスをexit_handlerがkillしてくれる

# wait(1) だと終了するまでシグナルハンドラが呼ばれないので
# POSIX準拠にこだわらない場合は sleep 0.1 とかでも
while :; do
  sleep 1;
done
```
手っ取り早くテキストリンクのクリッカブルエリアを広げる方法

スマホでテキストリンクのクリッカブルエリアを広げたい時ありますよね。
大抵これでいけます。状況によってはテキストリンク以外でも使える。

```css
a {
  display: inline-block;
  padding: 10px;
  margin: -10px;
  position: relative;
}
```

<p data-height="260" data-theme-id="0" data-slug-hash="jezjrg" data-default-tab="result" data-user="syuji-higa" data-pen-title="expand link area" class="codepen">See the Pen <a href="https://codepen.io/syuji-higa/pen/jezjrg/">expand link area</a> by Syuji Higa (<a href="https://codepen.io/syuji-higa">@syuji-higa</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

行間が狭いなど、リンク同士が近いときは重なるので調整が必要です。
`padding` と `margin` で相殺してるので、同じ側に反数を入れつつ調整していください。
macOS から .NET Core 2.1 の AWS Lambda 関数を作成する

Windows 版の Visual Studio では [AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/lambda-creating-project-in-visual-studio.html) を使ってサクッと Lambda 関数を作成できます。

ここでは macOS 上で Visual Studio for mac にて Lambda 関数をサクッと作る手順をメモ。とはいえ、とても簡単です。

## 環境

- macOS Sierra 10.12.6
- Visual Studio for Mac 7.5.1
- dotnet 2.1.403


## 1. .NET Core ライブラリ ソリューションの作成し、プロジェクトファイルを編集

1. .NET Core ライブラリのソリューションを作成します（Ex: `DotNetCoreLambda.sln`）
2. 依存ライブラリを追加
  - exec: `dotnet add ./DotNetCoreLambda/DotNetCoreLambda.csproj package Amazon.Lambda.Serialization.Json`
  - exec: `dotnet add ./DotNetCoreLambda/DotNetCoreLambda.csproj package Amazon.Lambda.Core`
3. .csproj（例: `DotNetCoreLambda/DotNetCoreLambda.csproj`） ファイルの `PropertyGroup` に `GenerateRuntimeConfigurationFiles` を追加します
  - ついでに `AWSProjectType` も `Lambda` にしておくと Windows の Visual Studio で開くときに良い
  - 一例として以下のような形になるかと

```
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
    <AWSProjectType>Lambda</AWSProjectType>    
  </PropertyGroup>

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />

  <ItemGroup>
    <PackageReference Include="Amazon.Lambda.Core" Version="1.0.0" />
    <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.4.0" />
  </ItemGroup>
</Project>
```

## 2. Lambda の実装コードを作成

一例として string を受け取り、Upper Case にして返す素敵な Lambad 関数を作ります。これを例えば `Function.cs` という名前で作成。

```
using Amazon.Lambda.Core;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace DotNetCoreLambda
{
    public class Function
    {
        public string FunctionHandler(string input, ILambdaContext context)
        {
            return input?.ToUpper();
        }
    }
}
```

## 3. Build & Deploy

以下のような手順にて作成した .zip パッケージファイルをデプロイ

```
dotnet publish -c Release
zip -j ~/Desktop/output.zip ./DotNetCoreLambda/bin/Release/netcoreapp2.1/publish/*
```

## 4. 動作検証

```
$ aws lambda invoke --function-name DotNetCoreLambda --payload '"abcdABCD1234"' /tmp/out && echo $(cat /tmp/out)
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
"ABCDABCD1234"
```

## リポジトリ

ご自由にどうぞ

[https://github.com/53ningen/DotNetCoreLambda.git](https://github.com/53ningen/DotNetCoreLambda.git)
アナログ家電をGoogleHomeから操作したい備忘録

#概要
我が家の家電はすべてアナログ家電...。
でもはやりの「OK,Google.電気を消して。」をやりたい...！
ということで、実際にやってみた話。

アナログ家電はGoogleHomeからの操作に対応していないため、
赤外線リモコンをGoogleHomeから操作して、間接的に家電を制御します。

#使ったもの
①GoogleHome　→　最近ネットで半額近い値段で売ってますね。
②[Neture Remo](https://nature.global/)　→　スマートリモコン。スマートスピーカーと連携できる赤外線リモコンのことです。
③[IFTTT(イフト)](https://ifttt.com/discover)　→　様々なサービスを連携できるサービス。'if this then that'の略らしいです。
④アナログ家電のリモコンたち　→　リモコンの赤外線をNature Remoに覚えさせて家電を操作します。

#動かすにはどうしたら良いか。
##処理の流れ。

流れとしては、以下のような感じになります。

1.GoogleHomeに話しかける。
　　　↓
2.IFTTTがGoogleHomeとNature Remoを連携する。
　　　↓
3.Nature Remoがあらかじめ覚えさせておいた赤外線を発射する。
　　　↓
4.家電が動く！！


##では連携していきます。

①まず、NatureRemoに家電を追加してアクションを追加します。
　やり方はNatureRemoの説明書を読めばわかるので割愛します。

②次にIFTTTを使って、GoogleHomeとNature Remoを連携します。
　**・thisをクリック**![1.png](https://qiita-image-store.s3.amazonaws.com/0/201516/20396b7e-98a7-cdfd-0b3a-fddd6cbd1c59.png)
  **・GoogleAssistant**をクリック![2.png](https://qiita-image-store.s3.amazonaws.com/0/201516/7070e861-e484-27d8-2afb-0215c5ab8a97.png)
**・say a simple phraseをクリック**![3.png](https://qiita-image-store.s3.amazonaws.com/0/201516/fa904422-bbe7-6ed4-9b34-82b05b414727.png)
**・GoogleHomeに命令したいフレーズとGoogleアシスタントのリアクション、**
**　使用する言語を選択し、Create triggerをクリック**![4.png](https://qiita-image-store.s3.amazonaws.com/0/201516/26e7c866-2d27-0b8e-eaaf-6cedd3c70995.png)
**・thatをクリック**![5.png](https://qiita-image-store.s3.amazonaws.com/0/201516/039f192a-8c6c-0d93-490b-a8afabfb8530.png)
**・Nature Remoをクリック**![6.png](https://qiita-image-store.s3.amazonaws.com/0/201516/07240e1d-6600-5a9b-7ca4-24799918c411.png)
**・Control home applocationをクリック**![7.png](https://qiita-image-store.s3.amazonaws.com/0/201516/696974ba-723c-eb68-d5f8-58e7d8b96d5f.png)
**Nature Remoで作成したアクションを選択し、Create actionをクリック**![8.png](https://qiita-image-store.s3.amazonaws.com/0/201516/b8a2af8e-df1a-df80-1460-2700465b0645.png)

③あとはGoogleHomeに話しかけるだけ。
　「OK,Google.電気を消して。」


#あとがき
　めんどくさがりやさんのためのライフハック的記事になりました。
　例えば、「OK,Google.おやすみ。」といったら、テレビ、電気等が全部消えるようにしたらもっと便利かもしれないです。
　そして今回はIFTTTの便利さを実感しました。IFTTT、これから愛用します。
SlideShareの上の顔照合のSlide


- [固有顔による生体認証](https://www.slideshare.net/HiroyukiKuromiya/ss-63193785?next_slideshow=1)
 EigenFace については,[OpenCV のチュートリアル](https://docs.opencv.org/3.4.3/da/d60/tutorial_face_main.html)とを読み比べれば理解が進むと思います。

アドバイス：固有顔の中には、個人の照合に役立たない成分があります。メガネをしている人としていない人の差に基づく成分などは、個人の特定に役に立ちようがありません。

[部分空間法](http://www.cvlab.cs.tsukuba.ac.jp/index.php?%C9%F4%CA%AC%B6%F5%B4%D6%CB%A1) という手法があります。

 [相互部分空間法を用いた顔認識技術 : 東芝の研究事例(通信品質,メディア・インタフェース及び一般)](https://www.jstage.jst.go.jp/article/itetr/32.58/0/32.58_13/_article/-char/ja/)

 [Face Recognition in Subspaces](http://www.face-rec.org/interesting-papers/general/tr2004-041.pdf)



- [顔画像からの個人顔識別](https://www.slideshare.net/epcnt19/ss-64602583)

 顔照合が成功しているかどうかの性能の評価基準の一つとしては、上位何位の中にあるかで評価するかというものです。顔のデータベースの規模が大きくなればなるほど、似た顔の人が増えますから、他人と一致してしまう場合が増えてしまいます。
　ユーザーの側も、顔照合システムが間違えた検索結果を返すことがあることを前提とした指標で評価して使うことです。

　パスポートの顔とそこにいる人物が同一であるかの顔照合と、来客がVIPリストに登録されている人物だれかに一致するのかという顔照合では、問題の設定と評価方法が異なります。　


- [170731 深層学習による顔認識入室記録 ](https://www.slideshare.net/shimane-itoc/170731-78517209)

> レシビ - ラズパイにカメラモジ、ユールを取り付けて、 motionを用い た監視カメラ機能をセットアップ motionが記録した画像データをDeepLearningBOXlこ入 れ、 OpenCVにより顔画像を切り出すスクリプトを作成 切り出した顔画像を人別のフォルダに入れ、 TensorFlow により人の顔を学習させるスクリプトを作成 学習結果をラズパイに入れて、監視カメラの画像から顔画像 を切り出し、識別を行うスクリプトを作成 

- [顔認証装置を用いた保育園のソーシャルグラフ生成に関する研究 ](https://www.slideshare.net/hasegawamakoto/ss-51842862?next_slideshow=1)

メガネ型ビデオカメラからの画像をオムロンの顔認識装置「HVC-P」を利用して、「予備実験（認識装置） 認識装置 オムロン「HVC-P」 顔認証，表情推定，視線推定 （性別，年齢，顔の向き， 目つむりの認識可） 映像をテレビ表示 認識装置で顔識別」しています。


https://plus-sensing.omron.co.jp/product/
https://plus-sensing.omron.co.jp/product/hvc-p2.html


[人の状態認識速度を最大10倍に——オムロン、組込型画像センシングコンポ「HVC-P2」を発売](https://fabcross.jp/news/2016/20160829_hvc_p2.html)



[OMRONの画像センサ(HVC-P2)をUSB経由で操作してみた](https://techblog.recochoku.jp/796)


画像に写っている人と人との関係性に着目すると、このようなスライドに示してあるような関係性を分かりうるということです。



- [ICCV2015勉強会 顔関連論文のまとめ ](https://www.slideshare.net/KoichiTakahashi/iccv2015-57943683)

- [論文輪読資料「FaceNet: A Unified Embedding for Face Recognition and Clustering」 ](https://www.slideshare.net/kaorunasuno/20150611-nasuno?qid=cd689c1e-dff1-446e-831d-fc859db77ccb&v=&b=&from_search=1)

FaceNetについて、どのような手法であるのかについて論文を解説したslide



- [The system of tracking the face with the quad rotor ](https://www.slideshare.net/zabu_nishiki/keizaburonishikinopart1?qid=27274773-c32a-4b1a-93c2-9689bd543be9&v=&b=&from_search=1)

quad rotor (=ドローン) を用いて、顔領域の検出 人物の顔領域を正面から撮影するシステムを構成する手法を述べています。

dlibを使って顔特徴点を求めています。
そこから表情の変化の影響を受けにくい特徴点を用いて、顔の向きをロバストに算出することを行なっています。

[顔認識アルゴリズム：Constrained local model を調べてみた](https://www.slideshare.net/jotaroshigeyama/constrained-local-model)

> FaceTrackerにもちいられるCLMアルゴリズムについて詳しく調べてみました．

とあります。
WebScraping

web.archive.orgからのwebscraping

```python
from datetime import datetime as dt, timedelta, date
from bs4 import BeautifulSoup
import requests, time, lxml, pandas as pd, re

def date_list(dt_start, dt_end, each_date=1): #date_list('2018-09-01','2018-09-05')
    dt_start = dt.strptime(dt_start, '%Y-%m-%d')
    dt_end   = dt.strptime(dt_end, '%Y-%m-%d')
    return [dt_start + timedelta(n*each_date) for n in range((dt_end - dt_start).days // each_date)]

def getSoup(url, timeSleep=3,maxSleep=300):
    time.sleep(timeSleep)
    ret_sleep=timeSleep
    soup = None
    while ret_sleep < maxSleep:
        try:
            res = requests.session().get(url)
            soup = BeautifulSoup(res.content, 'lxml')
            ret_sleep=maxSleep
        except:
            print('error sleep=', ret_sleep)
            ret_sleep=ret_sleep*3
            time.sleep(ret_sleep)
    return soup

def latest_weekday(dt_date, weekday=2): #return_latest_weekday('2018-10-08', weekday=2) 
    #0=Monday, 1=Tuesday, ...
    for i in range(7):
        ret=dt.strptime(dt_date, '%Y-%m-%d') + timedelta(-i)
        if ret.weekday()==weekday:
            ans=ret
    return ans
    
dt_start='2016-07-01'
dt_start=latest_weekday(dt_start).strftime('%Y-%m-%d')
dt_end=date.today().strftime('%Y-%m-%d')
date_series=date_list(dt_start,dt_end,each_date=7)

web_url=r'http:xxx'
str_1=r'http://web.archive.org/web/'
str_2=r'/'+web_url+r'/'

df=pd.DataFrame(index=date_series, columns=['count'])

for dt_each in date_series:
    url=str_1+dt_each.strftime('%Y%m%d')+str_2
    soup=getSoup(url)
    print(url)
    try:
        ret=soup.find... #略
    except:
        ret='error'
    print(ret,dt_each)
    if ret != 'error':
        df.loc[dt_each]=re.sub(r'\D', '', ret)
df.to_csv('output.csv')
```

Web Archiveに記録されたデータポイントのリスト

```python
import requests
from datetime import datetime as dt

def web_archive_stamp_list(url, from_when, to_when):
    '''example: url='yahoo.co.jp', from=2010, to=2011'''
    base_url=''.join(['http://web.archive.org/cdx/search/cdx?',
                      'url={url}&from={f}&to={t}&output=json'])
    base_url=base_url.format(url=url, f=from_when, t=to_when)
    r = requests.get(base_url).json()
    return r

def web_archive_stamp_simplified(url, from_when, to_when):
    '''example: url='yahoo.co.jp', from=2010, to=2011'''
    list1=web_archive_stamp_list(url, from_when, to_when)
    base_url='https://web.archive.org/web/{timestamp}/{url}'
    time_str='%Y%m%d%H%M%S'
    dict1={dt.strptime(e[1],time_str):base_url.format(timestamp=e[1],url=e[2])
           for e in list1 if e[1] != 'timestamp'}
    return dict1
```
コピペでバブルソート

# はじめに
1. この記事はコピペすう事ですぐに実行できるアルゴリズムを目指した記事です。
2. 備忘録を兼ねています
3. 随時更新していきます。
4. 記載しているコードはMIT Licenseを採用しています。

## そもそもソートとは
バブルソートを説明するにあたってまずソートと言う言葉を理解しましょう。

ソートとは、**何らかの集合体**を**何らかの規則**に従い**並び替える（ソートする）**アルゴリズムのことを指します。
よくあるものだと、ランダムに配置された数値を昇順に並び替えるなどです。

```
[5, 3, 8, 15, 2, 1] // ランダムに配置された数値
         ↓ // 昇順で並び替える作業
[1, 2, 3, 5, 8, 15] // 並び替えた結果
```

上記の`昇順で並び替える作業`がソートに当たります。
多分、これぐらいでなんとなくソートとはどういう意味かを理解頂けたと思います。

## バブルソートとは
バブルソートとは、ソートのアルゴリズムの一種です。
簡単に説明すると以下のような手順となります。

1. 集合体の先頭（または、最後尾）から隣ある要素を何らかの規則で比較をする
2. 比較した結果で隣同士を入れ替える
3. 続きからまた隣ある要素を何らかの規則で比較をする
4. 2と3を繰り返し端まで行う
5. 端まで行ったら端はその集合体の中で最も何らかの規則で最大（または最小）となる
6. 1~6を行う
7. 集合体の総数と6の回数が等しくなった場合、ソートが完全に完了する

## もう少し解説
例えば、ランダムに配置された数値を昇順に並び替えるバブルソートを考えてみましょう。

以下のような配列があったとします

```
[5, 3, 8, 15, 2, 1]
```
まず初めに
> **先頭（または、最後尾）から隣ある要素を何らかの規則で比較をする**

を行います。

昇順で並び替えたいので何らかの規則は、比較対象との大小で判断することとします

始まりを`list`の先頭に設定し大小の比較を行います

```
// 5と3を比較します
[5, 3, 8, 15, 2, 1]
```
**比較した結果で隣同士を入れ替える作業**を行います。
5と3を比べると3の方が小さいため入れ替えます。
そうすると以下の様になります。

```
[3, 5, 8, 15, 2, 1]
```
**続きからまた隣ある要素を何らかの規則で比較をする**ことから

```
// 5と8を比較する
 [3, 5, 8, 15, 2, 1]
```
5と8を比較した結果5の方が小さい場合、入れ替えはしません。

上記の手順を端まで繰り返し行った結果は以下の様になります。

```
 [3, 5, 8, 2, 1, 15]
```
ここまでが1回目の1~4です。
それ以降はただただ繰り返します

2回目の結果

```
 [3, 5, 2, 1, 8, 15]
```
3回目の結果

```
 [3, 2, 1, 5, 8, 15]
```

4回目の結果

```
 [2, 1, 3, 5, 8, 15]
```
5回目の結果

```
 [1, 2, 3, 5, 8, 15]
```

集合体の要素数とループ回数が同じになった際に昇順にソートされているのが理解できたと思います。

以上の手順がバブルソートです。
IBM Cloud Kubernetes Serviceのログをsyslog転送した際のFacilityとPriority

# 経緯

IBM Cloud Kubernetes Service (IKS)はコンテナやアプリケーションのログをIBM Cloud Log Analysisサービスまたはsyslogに転送することができます。

> https://console.bluemix.net/docs/containers/cs_health.html#logging

残念ながら任意のELKスタックには転送できないので、管理上の汎用性を考えるとsyslogを使うケースが多いかもしれません。

さてsyslogですが、ドキュメントによるとFacilityとPriorityを明示できなさそうなので、実際に飛ばしてみてどうなるか確認してみました。

# 結論

`user.notice`でした。

以上
TypeScript のエラーメッセージは、日本語化できる

TypeScript のエラーメッセージは、 `yarn tsc --help --all` を見ていて、日本語化できることを知りました。
多分使うことは無いですが。

入力

```ts
Object.asgin({}, {a: 1})
```

コマンド

```
yarn tsc --locale 'ja-jp'
```

出力

```bash
~> yarn tsc --locale 'ja-jp'
# yarn run v1.7.0
# $ /Users/kazuya/hoge/node_modules/.bin/tsc --locale ja-jp
index.ts:24:10 - error TS2551: プロパティ 'asign' は型 'ObjectConstructor' に存在していません。
'assign' ですか?
1   Object.asgin({}, {a: 1})
           ~~~~~
  node_modules/typescript/lib/lib.es2015.core.d.ts:286:5
    286     assign<T, U>(target: T, source: U): T & U;
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    'assign' is declared here.
```

普段怒ってきますが、日本語だとかわいいですね。

ちなみに、 `yarn tsc --help` には表示されていないオプションです。
【セミナー参加】カヤックに学ぶ面白UX

こんにちは。@tacahionです。
10月17日にYahoo! JAPAN大阪グランフロントオフィスで開催された、
「[カヤックに学ぶ面白UX論](https://yahoo-osaka.connpass.com/event/103433/)	」に参加しました。

#カヤックに学ぶ面白UX論

[面白法人カヤック](https://www.kayac.com)意匠部の「面白くはたらく」とは
をテーマに、デザイナー[岩瀬茂樹](https://www.kayac.com/team/iwase-shigeki)さんが登壇されました。

![142CAB50-4B6B-4802-9B3F-A6FAC0CBC027.jpeg](https://qiita-image-store.s3.amazonaws.com/0/289530/3dba357d-62a9-fd7a-3872-dff567aa9fb1.jpeg)
*会場は大盛況！*

##チェックインタイム
「簡単な自己紹介と一番好きなゲームとその理由」をテーマに会場の近くにいる人と3分間お話ししましょう、というチェックインから始まりました
一瞬ざわっとしたものの、3分を超えて岩瀬さんや運営の方がアナウンスをしてもなかなか静まらないほど盛り上がっていました。
身近な「ゲーム」という話題で初対面同士がこれだけもりあがれるとは・・・チームビルディングなどの機会があれば是非取り入れてみたいと思いました。

##カヤックについて
面白法人と自称している株式会社（笑）カヤック
岩瀬さん自身も中途で入社する際、芸人のようにオモロイ人ばかりなのでは…というイメージを持って入社されたそうです。そして実際入られた後は、「ピュアで真面目情熱的な人が多い」という印象を受けたそうです。
（自分もカヤックから登壇されるとのことで、テンションが高い方を想像していたのですが、岩瀬さんはとてもソフトで真面目な雰囲気の方でした）

##20周年

今年で20周年を迎えるというカヤックさん。会社という存在そのものが面白くていいんだという考えのもと、何よりもまず「自分たちが面白がる」ということを大切にしてものづくりをしているのだそう。

そして、面白がるためにやっているのが「ブレスト」

カヤックのブレストは、面白いアイディアを出す＋課題を自分ごと化して積極的に楽しむための修行、と位置付けられているとのこと

他にも「面白がる」理念から発する取り組みに「面白く働けていますか？」という質問と内省を年に複数回行ったり、人事評価として、一緒に働いている人全員が評価する多面評価の実施、また、「全員社長合宿」という全社員を挙げての泊まり込みブレスト大会があるそうです。

##仕事を面白がるカルチャーがカヤックには根付いている
カヤックの経営理念に、「作る人を増やす」
いい作品を作り、「作る人を増やす」ことで社会を良くするがあるそうです。

##僕らの甲子園ポケット「友情エクスペリエンス」について

後半は、カヤックがゲームづくりをいかに面白がっているか、についてのお話でした
。
そのひとつの例として「僕らの甲子園ポケット」のUXについて（友情エクスペリエンスと呼んでいるそう（笑））の紹介がありました

###デザインが友情体験についてできること

野球をテーマにしたソーシャルゲームは
数多くあるものの、複数人でプレイするシステムはない。
つまり、「僕らの甲子園ポケット」ユーザーに提供したい価値が他のゲームと全く違う、「友情体験」をとことん考え、提供しているのだそう。

例えば、９人の仲間を見つけないと試合はできません
であったり、
１日４回、決められてた時刻に試合に来なければいけません
というシステムは確かに不便とも思えるものですが、それを仲間と乗り越え、甲子園の頂点を掴んだ時の感動を「友情エクスペリエンス」として提供されているのだと思います。

その証として、「友情エピソード」をユーザーから募集する企画を実施した際には4000件を超えるエピソードが集まったそうです。

#友情体験のためなら運営は何でも作ります

ぼくポケでは常識やトレンドを捨てて、ユーザに提供したい体験を純粋に追求し、
友情体験のゲームを作っているんだということをチーム内で共有確認しているとのこと。

そのために以下に記載する様々な工夫がこらされていることをお話ししてくださいました。

* みんなが集まれる場所をつくる
→効率の良い画面より、「グラウンド」など場所をメタファーにした構成

* 甲子園新聞※の作り方
※2週間周期のリーグで優勝したチームに贈られる、アバターの全員が掲載されている号外のようなグラフィック
→ユーザーの思い入れを汲み取り、出来る限り要望に沿った形で個別にカスタマイズ！して提供する。（例えば、ベンチメンバーをもっと目立たせて！など）
これこそがゲームの「最高報酬」とのこと。

* 時には野球と関係ないミニゲームを提供
→マネージャーと2人乗りで下校する、など本筋と関係なくともなんとも青春なミニゲーム・・・他、何故か釣りやダンジョンものなど

* 僕ポケ会議
ユーザーと開発者が実際にあって意見を聞いたり交流するリアルイベント。
（その際の参加者の名札にゲームでの最新のアバターを印刷したりする手のこみよう！）

##まとめ
今回のお話を伺って感じたのが、同じものを作るプロジェクトメンバーの「自分ごと化」と「価値観の統一」。
例えば甲子園新聞などは、費用対効果として数字で見れば明らかに採算度外視なのだそうでうすが、「友情エクスペリエンス」というもっとも大事にしている価値に対して、なくてはならない価値であるとプロジェクトメンバーが認識しているからこそ続けられているし、ユーザーが求めているものをぶれずに提供できているのだと感じましたし、チームビルディングを大切にしている姿勢の一端を講演の最初と最後に設けられたチェックイン・チェックアウトから伺うことができました。
TypeScript の strictPropertyInitialization を有効にしたいが、怒られる時

Node.js + TypeScript で開発しており、何らかの ORM を使っている時に、なった。

こういう時

```ts
class User {
  email: string
}
```

下記のエラーが出る

```
Property 'name' has no initializer and is not definitely assigned in the constructor. 
```

下記のように、単純に `?` で `undefined` を許可すると

```ts
class User {
  email?: string
}
```

下記のコードが通ってしまう

```
new User({ email: undefined })
```

これを避けるには、 `assertion modifier (!)` を付けてあげれば良い

```ts
class User {
  email!: string
}
```

この状態で下記のコードを書くと

```
new User({ email: undefined })
```

いい感じに怒られる。

Type 'undefined' is not assignable to type 'string'.
ふれあい祭り：ARで宝探しなゲーム　（v１）

:star:１０月２７〜２８日に奥多摩町でふれあいまつりがあります！奥多摩日本語学校の学生はこの祭りを参加します。今年、私たちはITブースを立てます。ブースでみなさんはxRの技術をやって見ることができます。私はARチームに参加しました。ぜひ、来てください！:grinning:

＊＊アプデート（１０・２９）：作ったアプリが物流の問題があったので、新たしい方法を作ります。＊＊

###目的
* スマホ操作に慣れていない人でも楽しめるプロダクトを作成する
* ふれあい祭りの人はARについて興味を上げられるようにスマホでARの技術をやって見ることができる

###ゲームを作ることの理由
* 私たちはARの面白くて、楽しみな活用があることの感じをシェアしたいです。
*　宝探しで体験をもらって、運動もやることができます。

###ゲームデザイン
（このゲームの内容を考えています。具体的はだんだん決めて、更新して、改善します。）

0. ARチームは祭りの場所でバラバラの所に１０枚キャラカードを隠します。
1. プレイヤーはARブースに登録して、ランダムで二つのキャラを決めます。
2. スマホで地図をスキャンして、１０個ポイントを表示します。１０個ポイントは１０枚のカードの所です。
3. 勝ちように２つ決めたキャラのカードを探して、スマホでスキャンして、カードのキャラを表示して、写真を撮って、ARブースへ戻って、２つキャラの写真を出さなければなりません。
4. もし、カードのキャラは間違いなら、他のポイントに行って、正しキャラを探して見ます。
5. ２つ正しキャラを見つけたら、プレイアーはARブースへ戻って、商品をもらうことができます。
6.  登録から、商品をもらう時までは1時間べき以内です。

###ARキャラカードを作る方法
「Unity」という３Dを作ったプログラムでARカードを作ります。

＊＊継続は
openFramewroks 0.9.8+Win10でアイコン変更

たまにあるアプリ納品の時に「コンソールは出てきちゃうんですかね？」とか「消えない？」
って聞かれてコンソール消すと、せっかく作ったアイコンもなくなっちゃってがっかりするのでその回避方法。

https://forum.openframeworks.cc/t/switching-from-console-application-to-gui-application-loses-custom-icon/15279/5
内容的には上のリンクとほぼ同じだけどresource.hとかではまったのでメモ。
環境は
OpenFramewroks0.9.8 + VisualStudio2015 + windows10

## 下準備
####1. resource.hを用意
しばらくresource.hとは何者かわからなくて躓いたし、これで正しいのかもよくわからない。
検索してみるとみんな思い思いのresource.hを作ってるっぽいのでこれで良いことにする。
最後の行は改行入れとけってだれかが書いてたので改行入ってる。

```
#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0)
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE

#define MAIN_ICON 102

```
####2. アイコンの設定
icon.rcの#define MAIN_ICONを#include "resource.h"に変更
xxxxには自分で用意したアイコン名を入れる

xxxx.icoは、GIMPで512*512～16*16くらいのサイズのアイコン画像を
レイヤー分けして、icoファイルとして書出しで作れる。AIすごくてもアイコン一つ作ってくれないフォトショよりGIMP最強。

```
// Icon Resource Definition
#include "resource.h"

#if defined(_DEBUG)
MAIN_ICON               ICON                    "icon_debug.ico"
#else
MAIN_ICON               ICON                    "xxxx.ico"
#endif
```
##ビルド
####1.resource.hをicon.rcと同じ階層に配置
OFプロジェクトファイルとかを書き換えられればsrcフォルダとかでもよかったんだけど、普通にsrcフォルダに突っ込むと、icon.rcがreource.hを見つけてくれなくなる。

####2.VS2015のプロパティを変更
下の図のLinkerオプションのSubSystem を Concole -> Window に変更。これでコンソールが消える。
ofログのファイルofLogToFile()とかで外部に書き出す設定とかに変えないとログは見られなくなる。coutは使えないので注意。
SubSystemを変えないとMSVCRT.libがないとかリンカーエラーが出てビルドエラーになっちゃう。

![icon_ex.PNG](https://qiita-image-store.s3.amazonaws.com/0/47344/af9a23ca-187d-14dc-cc14-f2cd988ba384.png)

####3. main.cppを書き変える
いつものメインの代わりにWINAPIを使う。
GLのバージョンとかはofで使えれば他の書き方でも問題ないっぽい。

```
#include "ofMain.h"
#include "ofApp.h"
#include "../resource.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{

	ofGLFWWindowSettings settings;
	settings.setGLVersion(4, 2);
	settings.width = 1920;
	settings.height = 1080;
	settings.decorated = true;
	ofCreateWindow(settings);

	HWND hwnd = ofGetWin32Window();
	HICON hMyIcon = LoadIconW(hInstance, MAKEINTRESOURCE(MAIN_ICON));
	SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hMyIcon);

	ofRunApp(new ofApp());
}
```

####4. F5をターンッ！と打つ。
コンソールが出てこなくてもアイコンついてる！やった！
![title.PNG](https://qiita-image-store.s3.amazonaws.com/0/47344/e21bd429-35ce-f583-7948-cf5469fe3a87.png)

書いてみたら一瞬で終わるのにずいぶんと時間がかかった気がするのはなぜか。。
我ながら地味で目立たないところにこだわってますね。
JavaScriptで長めのsetTimeoutを使う時はOSのスリープを考慮する

今までsetTimeoutの遅延時間は長くても数十秒程度までしか指定したことがありませんでした。
先日、長時間のタイマー処理がうまく動作しないケースがあったのでご紹介させていただきます。

## 初めに書いたコード
「15分後に実行する」という処理をする際、普通に考えると以下のように書いてしまいます。

```javascript
setTimeout(() => {
  /* なにか */
  /* 素敵なことを */
  /* 行なう */
}, 15 * 60 * 1000);
```

このコードはうまく動きそうですが、実は落とし穴がありました。

スマホもPCも操作しないで放置すると、省電力のためスリープモードになりますよね。
そう、**スリープ中はタイマーが止まる**[^1]んです。

なので、タイマーが完了するのは開始から30分後かもしれないし、2時間後や翌朝になってしまう場合もあります。

## スリープ対策を入れる
今回はそうなってしまうと困る案件だったので、setIntervalで「開始から15分経ったか」をチェックし続ける処理に変更しました。

```javascript
const targetTime = Date.now() + (15 * 60 * 1000);

const timerId = setInterval(() => {
  if (Date.now() > targetTime) {
    clearInterval(timerId);
    /* なにか */
    /* 素敵なことを */
    /* 行なう */
  }
}, 500);
```

これなら途中でスリープしていた場合でも開始から15分後に処理が走るし、スリープ中に15分を過ぎていたら、復帰した瞬間に実行されるようになります。
※あまり頻繁だとUIなど他の処理に影響が出るかと思い、500ms間隔での実行にしています。どれくらいの誤差を許容できるかによって設定を変えてください。

## おわりに
最初のコードを書いた後、他の人にテストしてもらった結果「時間になっても何も起きないです」と言われたものの、自分の環境では再現しなかった[^2]ので、原因が分かる時間がかかりました……
「気づいてみたら単純なことだった」っていうことは結構ありますよね。


[^1]: この現象を紹介しているサイトはいくつかありましたが、ブラウザや言語の仕様的なページ見つけられませんでした。

[^2]: PCとスマホ両方テストしましたが、PCは他の作業をしながらだったのでスリープしないし、スマホは何となく（スリープしないように）定期的にタップしてました。何度もテストを繰り返すうちにたまたまスリープしてしまい、時間通りに処理が走らなかったことが真相解明のきっかけになりました。