OmniAICreator/Qiita-1.07M huggingface dataset:
引数がクロージャーの場合のヘッダドキュメント

## クロージャの引数のコードヒントが表示されない。

次のような、引数のクロージャを実行するだけの特に意味のないファンクションの場合…

```swift:無意味な関数
func doSomething(index: Int, handler: (Int) -> Void) {
    handler(index)
}
```

⌥⌘ + / でコメントテンプレートを挿入して、次のように記述した場合に、

```swift:コメント例
/// クロージャを実行
///
/// - Parameters:
///   - index: 何らかの値
///   - handler: 実行するクロージャ
```

doSomething を ⌥+クリック すると次のようなコードヒントが表示されてしまう。

![スクリーンショット 2018-02-14 12.32.37.png](https://qiita-image-store.s3.amazonaws.com/0/34802/750743e7-b984-af6b-5d7c-5ab002609b69.png)

気になるのは ``| - | No description. |`` の部分。いろいろ調べた結果、不本意ながら、次のように記載することでクロージャの引数にもコメントが表示されるようになった。

```swift:修正後
/// クロージャを実行
///
/// - Parameters:
///   - index: 何らかの値
///   - handler: 実行するクロージャ
///   - i: クロージャが要求する何らかの値
func doSomething(index: Int, handler: (_ i: Int) -> Void) {
    handler(index)
}
```

![スクリーンショット 2018-02-14 12.35.17.png](https://qiita-image-store.s3.amazonaws.com/0/34802/41835fd5-65da-75f9-c7ec-15b796468397.png)


ポイントは**「クロージャの引数の記述に名前をつけたこと」**と**「その名前にコメントを追加したこと」**の２点。


## 注意点
doSomething の引数である index と同じ名前の引数をクロージャの引数（上の例では i）につけて、コメントに -index: が二回出現させると後に書かれた方が優先されて、コードヒントでは両方に同じコメント（上の例では「クロージャが要求する何らかの値」）が表示されてしまいます。

```swift:悪い例
/// クロージャを実行
///
/// - Parameters:
///   - index: 何らかの値
///   - handler: 実行するクロージャ
///   - index: クロージャが要求する何らかの値
func doSomething(index: Int, handler: (_ index: Int) -> Void) {
    handler(index)
}
```

![スクリーンショット 2018-02-14 12.53.20.png](https://qiita-image-store.s3.amazonaws.com/0/34802/6e58d990-d874-00fd-ff0b-a139b5fa8f57.png)


## 未解決問題
クロージャが戻り値を持つ場合の記述方法が解らない。


## 不満／不本意なところ
- ⌥⌘ + / で挿入されるテンプレートでクロージャの引数が考慮されていないこと（変更後の書き方でもテンプレートは同じだった）。
- 引数であるクロージャの引数には名前がつけられないのに「_ + 引数名」の形式で名前をつけていること。
会社で少し盛り上がった Project Euler をやってみる 017

# Problem 017

> 1 から 5 までの数字を英単語で書けば one, two, three, four, five であり, 全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている.
> では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば, 全部で何文字になるか.
> 
> 注: 空白文字やハイフンを数えないこと. 例えば, 342 (three hundred and forty-two) は 23 文字, 115 (one hundred and fifteen) は20文字と数える. なお, "and" を使用するのは英国の慣習.



---

# Answer 017 (Python)

絶対もっと綺麗にかけるけど、タイムアップ。お目汚しすみません。
(答えはあっています)

```python3
import sys


class Problem17:

    COUNT = {
        0: '',
        1: 'one',
        2: 'two',
        3: 'three',
        4: 'four',
        5: 'five',
        6: 'six',
        7: 'seven',
        8: 'eight',
        9: 'nine',
        10: 'ten',
        11: 'eleven',
        12: 'twelve',
        13: 'thirteen',
        14: 'fourteen',
        15: 'fifteen',
        16: 'sixteen',
        17: 'seventeen',
        18: 'eighteen',
        19: 'nineteen',
        20: 'twenty',
        30: 'thirty',
        40: 'forty',
        50: 'fifty',
        60: 'sixty',
        70: 'seventy',
        80: 'eighty',
        90: 'ninety',
        100: 'hundred',
        1000: 'onethousand'
    }


    def count(self):
        # count from 1 to 9
        count001_009 = sum(len(self.COUNT[i]) for i in range(1, 10))
        # count from 10 to 19
        count010_019 = sum(len(self.COUNT[i]) for i in range(10, 20))
        # count from 20 to 99
        count020_099 = sum(len(self.COUNT[i * 10]) * 10 + count001_009 for i in range(2, 10))
        # count from 1 to 99
        count001_099 = count001_009 + count010_019 +count020_099
        # count from 100 to 999
        count100_999 = sum(len(self.COUNT[i] + self.COUNT[100] + 'and') * 100 + count001_099 for i in range(1, 10))
        # 100, 200, ... 900 のときの and まで数えてしまっているので除外
        count100_999 = count100_999 - len('and') * 9
        # count from 1 to 999
        count001_999 = count001_099 + count100_999
        # count from 1 to 1000
        return count001_999 + len(self.COUNT[1000])


if __name__ == '__main__':
    p = Problem17()
    print(p.count())
```
---

# (参考) Project Euler とは

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

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

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

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
emoji > link: Best Practices for Using Emoji in an Email Subject Line

タイトルにemoji付のメールがとあるサービスから送られてきた。

気になって調べたところ、以下を見つけた。
https://knowledgebase.constantcontact.com/articles/KnowledgeBase/17990-using-emoji-in-an-email-subject-line

> Think of emoji as a type of font - if your contact doesn't have a font installed, a default backup font will display in its place. The same is true of emoji - if the browser, email client, or mobile device doesn't support the emoji, it won't display and usually replaces it with a generic square  ⬜ or question mark ❓. If the contact opens their email on a different device or in a different browser, they may be able to see the emoji even though they couldn't before.

linuxなどのターミナルで文字化けが発生しないかは不明。
(特殊な文字に対応していないターミナルにおいて）。

いわゆる「とうふ」文字が含まれたタイトルのメールが届いたら、「これは何？」と気になってしまう。
Project Euler 29「個別のべき乗」

すっごい簡単。

## Problem 29 「個別のべき乗」
2 ≤ a ≤ 5 と 2 ≤ b ≤ 5について, a^b を全て考えてみよう:

2^2=4, 2^3=8, 2^4=16, 2^5=32
3^2=9, 3^3=27, 3^4=81, 3^5=243
4^2=16, 4^3=64, 4^4=256, 4^5=1024
5^2=25, 5^3=125, 5^4=625, 5^5=3125

これらを小さい順に並べ, 同じ数を除いたとすると, 15個の項を得る:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
2 ≤ a ≤ 100, 2 ≤ b ≤ 100 で同じことをしたときいくつの異なる項が存在するか?

```python3
def hoge(num):
    set_numbers = set()
    for a in range(2, num+1):
        for b in range(2, num+1):
            set_numbers.add(a ** b)
    return len(set_numbers)

print(hoge(100))
```

ワンライナーだとこう。

```python3
len( set( a ** b for b in range(2, num+1) for a in range(2, num+1) ) )
```
ついさっき教えてもらったジェネレータ内包表記を早速実践していくぅ。

## 追記
[shiracamus](https://qiita.com/shiracamus)さんからのご指摘を頂いて訂正
さすがに間違った記載方法のままは問題があると思ったので。

```python3
len( set( a ** b for a in range(2, num+1) for b in range(2, num+1) ) )
```

あと、ググってたら出てきたんですがsetの内包表記はこういう書き方もできるんですね。

```python3
len({ a ** b for a in range(2, num+1) for b in range(2, num+1) })
```
Dirty bitがセットされて起動できなくなったRaspberry PiのSDカードをfcskコマンドで修復してみた

# いきさつ
PICで作成中のソフトにSPI I/Fを加えるため、デバッグのお相手としてRaspberry Piを引っ張り出して、環境（Python 3.6, wiringPi, etc.）を整え通信の確認までできたまではよかったのですが、週末続きをやろうとしたら起動しなくなってしまいました。:cry:

バックアップを取っていなかったので、RaspbianのイメージをSDに書いて環境をもう一度つくるのは面倒いやだなということで、とりあえずLinuxホストでfsckしてみることにした。

Linuxホストは Ubuntu 14.04 LTS です。

# 1. SDカードのデバイスを確認

```
~$ ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0  2月 13 12:16 /dev/sda
brw-rw---- 1 root disk 8,  1  2月 13 12:16 /dev/sda1
brw-rw---- 1 root disk 8,  2  2月 13 12:16 /dev/sda2
brw-rw---- 1 root disk 8,  5  2月 13 12:16 /dev/sda5
brw-rw---- 1 root disk 8, 16  2月 13 12:43 /dev/sdb
brw-rw---- 1 root disk 8, 17  2月 13 12:43 /dev/sdb1
brw-rw---- 1 root disk 8, 18  2月 13 12:43 /dev/sdb2
```
/dev/sdbが SDカード
/dev/sdb1 が Bootパーティション
/dev/sdb2 が ext4パーティション

# 2. Bootパーティションにfsckをかけてみる

```
~$ sudo fsck /dev/sdb1
fsck from util-linux 2.20.1
fsck.fat 3.0.26 (2014-03-07)
0x41: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt.
1) Remove dirty bit
2) No action
?
```

dirty bitがセットされている？
これで起動できないのか？？

削除してみましょう。

```
? 1
Leaving filesystem unchanged.
/dev/sdb1: 149 files, 42667/83705 clusters
```

できない...:cold_sweat:

ここで調べてみると、`-w -a` or `-w -r`オプションをつけてみるといいらしいことがわかりました。

参考になったのは次のふたつ

* [Board index > Using the Raspberry Pi > Troubleshooting
Volume was not properly unmounted ...]
(https://www.raspberrypi.org/forums/viewtopic.php?t=64843)
* [I tell fsck to fix USB stick, it says “Leaving file system unchanged.”]
(https://superuser.com/questions/418053/i-tell-fsck-to-fix-usb-stick-it-says-leaving-file-system-unchanged)

# 3. -w -r オプションを加えて試してみる

```
~$ sudo fsck -w -r /dev/sdb1
fsck from util-linux 2.20.1
fsck.fat 3.0.26 (2014-03-07)
0x41: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt.
1) Remove dirty bit
2) No action
? 1
Perform changes ? (y/n) y
/dev/sdb1: 149 files, 42667/83705 clusters
```
できたかも

# 4. ext4パーティションにfsckをかけてみる

```
~$ sudo fsck /dev/sdb2
fsck from util-linux 2.20.1
e2fsck 1.42.9 (4-Feb-2014)
rootfs: clean, 148774/474832 files, 1181603/1930752 blocks
```
こちらは大丈夫だったみたい

SDカードをRaspberry Pi B+に挿入し電源オン

無事起動できました。:grinning:

今度はバックアップを取っておきましょう。
ビットコインエクスプローラー(7)

# ビットコインエクスプローラー(7)

## マルチシグの受信方法

支払いを受けるために、マルチシグアドレスを先に作らなければならない。



#### パブリックキーを作成する。

ランダムシードから、プライベートキーと、それに対応するパブリックキーを作成する。

```
bx seed | bx ec-new | bx ec-to-public
```

```
8aedeb091eabc049ced4e72e30a1b8f4dd006e03697f64bc(seed #1)
7fb17f47e2483dc2d6b76966efc8fc1fcdd97c1fbcaacb884531ea44ce60fc8d(private #1)
02c23ebfdf41d2c32e7ab88421aa05679c9ac10171b079cd99c16c56de13750a4f(public #1)
```

```
bx seed | bx ec-new | bx ec-to-public
```

```
c7e1343c93396c804eea2721d2b3946e57b6af4670b74504(seed #2)
746e0ece51246c9988ea779640b15680dc2e4604aadc05f18a743bd27e86f0ac(private #2)
0337eeb8310f0108697d21ecd91d748abf55a0f05883a74920b1bf2304d973aa6d(public #2)
```

```
bx seed | bx ec-new | bx ec-to-public
```

```
0a984ef2740bb60df9980cc8edfe1f3fe93af555fd6de68f(seed #3)
9720f1b5fcc1a086bf6f62960d7c98b10f1ce9f62c71384145d3edf40051b132(private #3)
024b21c827c265afa45079a54a73b43274f2e276ac1be7a2422cd1cddf3a572563(public #3)
```

#### マルチシグアドレスを作成する。

multisig redeemスクリプトを定義するために、上記で作成したパブリックキーを使い、スクリプトハッシュアドレスを作成します。"2"は、アドレスで受信したお金を消費するために、必要な署名数で、"3"は、利用可能な署名数を示します。

```
bx script-to-address "2 [02c23ebfdf41d2c32e7ab88421aa05679c9ac10171b079cd99c16c56de13750a4f] [0337eeb8310f0108697d21ecd91d748abf55a0f05883a74920b1bf2304d973aa6d] [024b21c827c265afa45079a54a73b43274f2e276ac1be7a2422cd1cddf3a572563] 3 checkmultisig"
```

```
3EhCEPqHipSdSeiFDHz32wiQQbHkaL3qsC
```
游明朝のカーニング設定がうまくいかない話

游明朝とカーニング設定（font-feature-settings）を組み合わせた時、
うまくいかないことがあったので調べてみた。

- 游明朝は「Normal」「Bold」「Light」を使用（MacはLightなし）
- font-feature-settingsは「pkna」と「palt」を使用


##調査
<p data-height="700" data-theme-id="0" data-slug-hash="xYLYpX" data-default-tab="css,result" data-user="ymnk" data-embed-version="2" data-pen-title="YuMincho Kerning Setting" class="codepen">See the Pen <a href="https://codepen.io/ymnk/pen/xYLYpX/">YuMincho Kerning Setting</a> by T_Y (<a href="https://codepen.io/ymnk">@ymnk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


##結果
###Mac (10.12.6)
#####■ Chrome(64)、Safari(11)、Firefox(58)
Boldとpknaを組み合わせると、カーニングが無効。

###Windows(10)
#####■ IE11
Boldとpaltを組み合わせると、カーニングが無効。
Normalとpaltを組み合わせると、カーニングが無効。
(Lightは問題なし)
#####■ Edge(16)、Chrome、Firefox
問題なし。


##おまけ

カーニングを含むOpenTypeの説明は、Adobeのサイトが詳しい。
https://helpx.adobe.com/jp/typekit/using/open-type-syntax.html
Unity2Dでのキャラクターの変身※編集中

```Change.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Change : MonoBehaviour {
    Animator anim;
    public int hensin;
    public GameObject Effect;
    // Use this for initialization
    void Start () {
        anim = GetComponent<Animator>();
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.X))
        {
            hensin += 1;
            Instantiate(Effect, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity);
        }
        if (Input.GetKeyDown(KeyCode.Z))
        {
            hensin -= 1;
            Instantiate(Effect, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity);
        }
        if (hensin == 0)
        {
            anim.SetInteger("change", 0);
        }
        if (hensin == 1)
        { 
        anim.SetInteger("change", 1);
        }
        if (hensin == 2)
        {
            anim.SetInteger("change", 2);
        }
        if (hensin < 0)
        {
            hensin = 0;
        }
        if (hensin > 2)
        {
            hensin = 2;
        }
    }
}
```
素人が一週間でWebサービスを作ってみた

表題の通り、ど素人が一週間でWebサービスを作ってみたのでQiitaに初投稿してみます。
*追記　無事エンジニア転職できました！:slight_smile:（2019年6月～）

# 作ってみたもの
ブログ記事を爆速で書こう Non-Stop-Writer
https://sheltered-dawn-58465.herokuapp.com/

# 経歴
何回かプログラミングを学んでみようとしてなんども挫折した経験あり。
25歳、Web関連での業務経験なし。

# なぜ作ったか
Web開発の現場での業務経験がないけど、自分でサービスを作ってたくさんの人に届けられるようになりたい。
→自分で色々学んでみても実力がついた気がしない
→やっぱり作りながら学ぶしかないんじゃん
→思いついたものをザーッと書き出して、素人でもできそうなものを作ってみた

# サービスの用途
- ブログがなかなか書けない時に、半強制的に書くツール。
- 時間制限と最低文字数を設定して、ノンストップライティング。
- 完成した記事はHTMLタグが記述された(.txt)で出力→そのまま貼り付けてブログ記事にできる
- ノンストップライティングについてはこちら→ http://readingmonkey.blog45.fc2.com/blog-entry-461.html

# 開発環境
- Mac OS X High Sierra
- PHP 7.1.7
- ローカルのApache環境
（最初MAMP使ってみたり, ドットインストール推奨のVagrant(CentOS)使ってみたけど結局自分のローカル環境の方が反映が早いし軽かった）
- こういう書き方(↑)でいいのかすらわからない

# 使用した技術
## フロントエンド
- PHP
- HTML5/CSS3
- Bootstrap 4.0.0 (CSSフレームワーク）
- JavaScript(jQuery)

## バックエンド
- Herokuに丸投げ。
特に何も考えずとも「git push heroku」でOKなのでかなり助かった

## その他
- git　（バージョン管理）
- bitbucket　（バージョン管理）
- Atom （エディタ）
- Wovnで英語翻訳機能をつけた https://wovn.io/
- Summer Note でエディタ機能をつけた https://summernote.org/
# 感想
## 心が折れる
- チュートリアルとかドットインストールとかでやった内容を実践しようとするとあまりにもできなくて萎える
- なので、クソコードでもいいからとにかく実装しよう、という気概でやる。
- 完成したものはやっぱりクソコード。悲しくなる。
- でも、どうせど素人なんだから気にしない。
- どんな立派な作家でも、初稿から素晴らしい文章を書ける人はいない。
- Webサービスは１日にしてならず。果てしない。


# 学習について
- ドットインストールが非常に役立った。 https://dotinstall.com/lessons
- でも、実際に作ろうとしているものがなければすぐに忘れるので何かを作りながらが良いと思う。
- Qiitaの皆様には感謝しても感謝しきれない。
- とりあえず困ったらググって、日本語のサイトは4-5個はみる。
- それでもわからなかったらEnglishのサイトも4-5個はみる。
- それでもわからなかったら後回しにする。なんくるないさ。

# 今後について
- コードをもうちょっとブラッシュアップして、動作を軽くしたい。
- ユーザー機能や投稿のシェア機能をつけるなどして、CGM(Consumer Generated Media)にしていきたい。
- それができたら、ちゃんと自分のドメインをとって公開したい。
- 他にもいくつか作ってみたいプロダクトがあるので、作ってみる。ただ、何個も技術を浅く広くやるよりは, PHPに絞って開発を進めたほうが良さそう。
- 現状、あまり忙しくない生活（収入は少ない）をしているので学習＋開発する時間は十分あるので、引き続きたくさんのプロダクトを作るなかで学んでいきたい。
HaskellでFizzBuzz

とにかく動くコードを書くならPaizaという選択肢もあるんですが、
とりあえずFizzBuzzから始めてみました

ぶっちゃけ分からないことが多すぎるので当分は写経→本読んで内容を追っかける、がメインだろうなぁと思ってます

``` haskell:fizzbuzz.hs

fizzbuzz = map toFizzbuzz [1..] -- 無限リスト
  where
  toFizzbuzz x
    | x `mod` 15 == 0 = "FizzBuzz"
    | x `mod`  3 == 0 = "Fizz"
    | x `mod`  5 == 0 = "Buzz"
    | otherwise       = show x

main = mapM_ putStrLn $ take 10000 fizzbuzz

```
pythonのlog出力

## はじめに
pythonのlog出力について検索すると、「コレはするな」「アレはダメだ」と講釈を垂れている記事が散見され、なにが正しいのか分からず混乱し、「そんなこと言われてもどうすりゃいいのさ （AA略」となってしまった方が数多くいると思う。
かく言う私もその一人でして。
私のようなコピペプログラマからすると「ゴチャゴチャ文句言うくらいならコピペで使えるコードを寄越せ！」と言いたくなる。

そんな私が適当に作ったloggerを公開してみようと思う。
（~~本音：現場変わったときにコピペして使いまわそう~~）

断っておくが**私は細かいことはサッパリ理解していない**。
しかし、これで不便を感じた事もない。

## logger
```python:logger.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from logging import Formatter, handlers, StreamHandler, getLogger, DEBUG


class Logger:
    def __init__(self, name=__name__):
        self.logger = getLogger(name)
        self.logger.setLevel(DEBUG)
        formatter = Formatter("[%(asctime)s] [%(process)d] [%(name)s] [%(levelname)s] %(message)s")

        # stdout
        handler = StreamHandler()
        handler.setLevel(DEBUG)
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

        # file
        handler = handlers.RotatingFileHandler(filename = 'your_log_path.log',
                                               maxBytes = 1048576,
                                               backupCount = 3)
        handler.setLevel(DEBUG)
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

    def debug(self, msg):
        self.logger.debug(msg)

    def info(self, msg):
        self.logger.info(msg)

    def warn(self, msg):
        self.logger.warning(msg)

    def error(self, msg):
        self.logger.error(msg)

    def critical(self, msg):
        self.logger.critical(msg)
```

### 標準出力（stdout） 
```
>>> import logger
>>> log = logger.Logger('hoge')
>>>
>>> log.debug('test debug')
[2018-02-14 09:54:58,290] [6705] [hoge] [DEBUG] test debug
>>>
>>> log.info('test info')
[2018-02-14 09:55:19,130] [6705] [hoge] [INFO] test info
>>>
>>> log.error('test error')
[2018-02-14 09:55:31,340] [6705] [hoge] [ERROR] test error
>>>
>>> log.warn('test warn')
[2018-02-14 09:55:42,635] [6705] [hoge] [WARNING] test warn
>>>
>>> log.critical('test critical')
[2018-02-14 09:55:57,845] [6705] [hoge] [CRITICAL] test critical
>>>
```

### ファイル出力（fileout）
```
xxx@xxxxx:~$ cat log.log
[2018-02-14 09:54:58,290] [6705] [hoge] [DEBUG] test debug
[2018-02-14 09:55:19,130] [6705] [hoge] [INFO] test info
[2018-02-14 09:55:31,340] [6705] [hoge] [ERROR] test error
[2018-02-14 09:55:42,635] [6705] [hoge] [WARNING] test warn
[2018-02-14 09:55:57,845] [6705] [hoge] [CRITICAL] test critical
```
## 最後に
**私は細かいことはサッパリ理解していない。（重要）**
ツッコミ、改善、大歓迎です。
[JavaScript] ファイルのドロップイベントをJavaScriptから発火させる

# 問題

ファイルをドロップしたときに発火するイベントを、JavaScriptから発火させたい。
以下のような使い方ができる関数`fireDropEvent`を作れればよいとしよう。

```javascript
fireDropEvent(document.documentElement, [new File(["Hello."], "hello.txt")]);
```

各種APIのドキュメントを読んですぐに思いつくのは以下のような実装だろう。

```javascript
function fireDropEvent(domElement, files) {
  const dataTransfer = new DataTransfer();
  // （ここに、dataTransfer に files を登録する何らかのコードを入れる）
  domElement.dispatchEvent(new DragEvent("drop", {dataTransfer}));
}
```

しかし、現状`DataTransfer`にファイルを登録するAPIは存在しないので、上のような方式の実装は不可能である。
どうすればよいか。

# 対処法

ダックタイピングを使う。

```javascript
function fireDropEvent(domElement, files) {
  // DataTransferの偽物を定義する
  class FakeDataTransfer {
    constructor(files) {
      this.dropEffect = "none";
      this.effectAllowed = "all";
      this.files = files;
      this.types = ["Files"];
    }
    addElement() {
      // do nothing
    }
    clearData() {
      // do nothing
    }
    getData() {
      return "";
    }
    setData() {
      // do nothing
    }
    setDragImage() {
      // do nothing
    }
  }

  // あとはFakeDataTransferを本物のDataTransferといかにして差し替えるかが問題だが、
  // 以下の実装は怒られてしまう
  // 
  // ダメな実装例1:
  // const event = new DragEvent("drop", {dataTransfer: new FakeDataTransfer(files)});
  // DragEventのコンストラクタはDataTransferのインスタンスしか受け付けないので不可
  // 
  // ダメな実装例2:
  // const event = new DragEvent("drop");
  // event.dataTransfer = new FakeDataTransfer(files);
  // dataTransferへの代入は不可

  // なので、ECMAScript 5のdefinePropertyという機能を使って上書きする
  const event = new DragEvent("drop");
  Object.defineProperty(event, "dataTransfer", {value: new FakeDataTransfer(files)});
  domElement.dispatchEvent(event);
}
```

# 参考リンク

[Trigger 'drop' event while providing the file data](https://stackoverflow.com/questions/39487340/trigger-drop-event-while-providing-the-file-data)
大量の画像をNumpy配列に変換するプログラム作ってみた

[GitHub](https://github.com/Kisaragi-2/Util)

```python
import numpy as np
import glob
from keras.preprocessing.image import load_img,img_to_array
from tqdm import tqdm

IMG_SIZE=32
#True=Grayscale, False=RGB
COLOR=True
#Name to load images Folder
DIR_NAME='./Images'
#Name to save
SAVE_FILE_NAME='SaveImages'
#sahpe File Name
if COLOR:
    SAVE_FILE_NAME=SAVE_FILE_NAME+'_'+str(IMG_SIZE)+'Gray'
else:
    SAVE_FILE_NAME=SAVE_FILE_NAME+'_'+str(IMG_SIZE)+'RGB'

#load madomagi images and reshape
img_list=glob.glob(DIR_NAME+'/*.jpg')
temp_img_array_list=[]
for img in tqdm(img_list):
    temp_img=load_img(img,grayscale=COLOR,target_size=(IMG_SIZE,IMG_SIZE))
    temp_img_array=img_to_array(temp_img)
    temp_img_array_list.append(temp_img_array)


temp_img_array_list=np.array(temp_img_array_list)

#save np.array
np.save(SAVE_FILE_NAME+'.npy',temp_img_array_list)

#confirmation
print(temp_img_array_list)
print(temp_img_array_list.shape)
```

#使い方

`IMG_SIZE=32`で画像の幅を指定します。ここでは32にします。
どんな形の画像でも、32x32の形に整形します。

`COLOR=True`でカラーを指定します。
Trueの場合はGrayscale。Falseの場合はRGBとなります。

`DIR_NAME='./Images'`に画像が入っているフォルダのパスを指定します。

`SAVE_FILE_NAME='SaveImages'`で保存するファイルの名前を指定します。

<img width="338" alt="SnapCrab_NoName_2018-2-14_11-36-32_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/1d1ed02b-c9e4-882a-88ae-875a7b541db7.png">

<img width="188" alt="SnapCrab_NoName_2018-2-14_11-46-56_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/1f0606b6-d462-c839-148c-386150e27bec.png">


実行すると画像のようにnpyファイルが生成されます。
今回の場合であれば、`(10,32,32,1)`という形のNumpy配列が保存されています。
**KerasのデータセットであるMNISTやCifar10などと似たような形で利用することができます。**

利用するときは

```python
import numpy as np

ndarr=np.load('SaveImages_32Gray.npy')
```

といった感じですぐに利用できます。

#解説

```python
#load madomagi images and reshape
img_list=glob.glob(DIR_NAME+'/*.jpg')
temp_img_array_list=[]
for img in tqdm(img_list):
    temp_img=load_img(img,grayscale=COLOR,target_size=(IMG_SIZE,IMG_SIZE))
    temp_img_array=img_to_array(temp_img)
    temp_img_array_list.append(temp_img_array)


temp_img_array_list=np.array(temp_img_array_list)
```

`glob()`でフォルダからjpg画像の名前を一覧で取得します。
それをパスとして、`load_img()`で指定サイズ、カラーに変換し、その後、配列に変換しています。
Vue.jsでコンポーネント作るときにCSS変数つかったら色々できる

ブロック要素に内容を表示するだけの簡単なコンポーネントを作ったとします。
この要素幅や背景色を属性で指定したい場合、CSS変数を使うと以下のように実装できます。

```html:Box.vue
<template>
  <div class="box" :style="styles"> <!-- computedなstylesプロパティをstyleにバインド-->
    <div class="message">
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: 'box',
  props: {
    color: {},
    width: {}
  },
  computed: {
    // バインドするスタイルを生成
    styles () {
      return {
        '--color': this.color,
        '--width': this.width
      }
    }
  }
}
</script>

<style scoped>

.box {
  /* デフォルトの値を宣言*/
  --color: orange;
  /* --width: width; */ /* 20180215 書き間違えていたため修正しました */
  --width: 100px;
  
  /* CSS変数を背景と幅に割り当て */
  background-color: var(--color);
  width: var(--width);
  
  display: inline-block;
  
}

.box .message {
  padding: 1em;
}
</style>

```

使うときはこんな感じになります。

```html:App.vue
<template>
  <div id="app">
    <!-- 属性で色と幅をバインド -->
    <box class="green" :color="color" :width='width'>.green</box>
    
    <div>
      <!-- バインドした属性を編集する入力ボックス -->
      <input v-model='color'>
      <input v-model='width'>
    </div>
  </div>
</template>

<script>
export default {
  name: 'app',
  data () {
    // バインドする属性を宣言
    return {
      color: 'pink',
      width: '20px'
    }
  }
}
</script>
```

実行した様子は以下の感じです（画像なのでわかりにくいですが）。
入力ボックスに入力した値に応じてコンポーネントが変化します。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/5557/7731cbbd-1be7-f27b-a9f3-2781e39a349c.png)
kubectlでPod内のNginxにワンライナーデプロイ

Pod内のNginxにサクッとリソースをコピーしたいなと思って調べていたところ、
Kubernetesでは"kubectl cp"を使うとのこと。まあDockerと同じですね。

ということで、ワンライナーで書いてみた。

# やりたいこと

手元で書いたコードをKubernetes上ですぐに動作確認したい
　　　　↓ 要するに
ビルドしたリソースをNginxのルートディレクトリ(/usr/share/nginx/html)配下にコピーしたい

```
.
├── dist // ここの配下を持っていきたい
│   ├── index.html
│   ├── bundle.js
│   └── css
│       └── style.css
├── src
│   ├── index.html
│   ├── scripts
│   │  ├── index.js
│   │  └── hello.js
│   └── styles
│       └── style.css
├── package.json
└── webpack.config.js
```

# やったこと

必要な情報をエクスポートしておく

```shell
export POD_NAME=nginx-xxxxxxxxxxxx # コピー先のPOD名
export ROOT_DIRECTORY=/usr/share/nginx/html # コピー先のディレクトリ (今回はNginxのルートディレクトリを指定)
```

圧縮して、コピーして展開して、不要ファイルを削除 
※ ```--```のつけ忘れに注意。これがないとうまく動かない。

```shell
$ tar -zcvf dist.gz -C dist . && \
kubectl cp dist.gz ${POD_NAME}:${ROOT_DIRECTORY}/ && \
kubectl exec ${POD_NAME} -- tar -zxvf ${ROOT_DIRECTORY}/dist.gz -C ${ROOT_DIRECTORY}/ && \
kubectl exec ${POD_NAME} -- rm -f ${ROOT_DIRECTORY}/dist.gz
```

簡単だね。

```shell:Nginxコンテナ内
$ pwd
/usr/share/nginx/html

$ find .
.
./index.html
./bundle.js
./css
./css/style.css
```


# あとがき

今は、フロントエンドを書くことが多いので、動作確認は基本的にこれで事足りてます。
もっと楽だよって方法があれば教えてくださいヽ(´ー｀)ノ

# 参考情報
- [Kubectl Reference Docs](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#cp)
CloudFrontの下でWordpressを実行する時に色々ハマった話 後編


[前編](https://qiita.com/kunitaya/items/1a78cd2d4d2971394e0d)の続きです。

## Wordpressの設定
wp-config.php の編集が必要です。

#### 変更前

```php:wp-config.php
// If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        $_SERVER['HTTPS'] = 'on';
}
```

#### 変更後

```php:wp-config.php
// If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        $_SERVER['HTTPS'] = 'on';
} elseif (isset( $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO']) && $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] === 'https') {
        $_SERVER['HTTPS'] ='on';
}
```

## 解説
[前編](https://qiita.com/kunitaya/items/1a78cd2d4d2971394e0d)も含めて解説します。

#### AWS Certificate Manager での証明書取得
はい。まず最初のハマりポイントです。
CloudFrontで利用する証明書は、必ず**バージニア北部**リージョンで取得しましょう。
東京リージョンで取得しても、CroudFrontに割り当てる事ができません。
ハマリポイント ★★★★☆

#### Origin Domain Name 設定
ALBを作成している場合は、ここにALBの選択肢が自動で出てきますが、EC2に直接アクセスする場合は出てきません。
パブリックDNSをEC2インスタンスのコンソールからコピペする必要があります。
めんどくさい度 ★★☆☆☆

#### EC2 セキュリティグループの設定
CloudFrontから直接アクセスさせる場合は、世界中のエッジサーバからEC2へアクセスが来る事になります。
この為、セキュリティグループをAll(0.0.0.0/0, 0::)で開ける必要があります。
セキュリティに不安がある場合は、多少お金がかかっても素直にALBを使いましょう。
ALB用にもACMで証明書を取得し、HTTPSでも待ち受けるようにしておけば安心です。
セキュリティ大丈夫なの？度 ★★★★☆

#### デフォルト Allowed HTTP Methods の設定
本来であれば、読み込みのみのコンテンツは Get, HEAD のみに絞るのが理想的です。
ですが、Wordpressはそんなに甘くありません。
セキュリティ上の不安が残りますが、素直に全通しにしましょう。
URL変換せずにPHPアクセスはきちんと.phpにアクセスしろ度 ★★★☆☆

#### HTTP Header の Whitelist
Wordpressは自身のホスト名（SiteURL）を持って制御していますので、Hostヘッダを通すことは必須です。
またHTTPSを利用する場合、Wordpressに何とかしてクライアントからのアクセスプロトコルを伝えなければリダイレクトループにハマリます。
さらに、誰でも管理画面にアクセスできると問題なので、Authorizationでベーシック認証をかけるといった対策も必要です。
CMSがFQDNを持つな度 ★★★★★
CMSが勝手にリダイレクトするな度 ★★★★★

#### Forwarded-Proto での制御
CloudFrontはX_FORWARDED_PROTOヘッダを削除します。
その代わり、CloudFrontはCLOUDFRONT_FORWARDED_PROTOヘッダにてクライアントからのアクセスプロトコルを通知します。
参考URL：[HTTP リクエストヘッダーと CloudFront の動作](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior)
この為、Wordpressの設定ファイルに最初から入っているHTTP_X_FORWARDED_PROTOでの制御は全くの無意味です。
最初から勝手にリダイレクトしなきゃ良いだけだろ度 ★★★★★

## まとめ
何も知らなくてもそれなりの物を作ることができるWordpressですが、逆に言うと勝手に色々やらかしてくれます。
特にURL変換とかリダイレクトとか！
CDNを利用する場合では特に一筋縄ではいかないので、一つ一つ動作を理解して設定する必要があります。
皆様、良いWordpressライフを！（半ギレ
async/awaitでiterateがんばる

async/awaitが使える環境がまぁまぁ増えてきてNodeとかでは普通に使うようになりました。
多分みんな一回は頭を悩ませるのはiterate周りだと思います。

例えばforEachとか雰囲気でかくと下みたいな感じになるけど、あくまでasyncキーワードはpromiseを返してくれるようにしてくれて、awaitはpromiseを待つっていう単純な機能を提供するものなのでforEach自身がpromiseを返さない限りはこのコードはうまく動かない。

```js
function timer() {
  return new Promise(resolve => setTimeout(_ => resolve(), 100))
}

(async () => {
  let list = [];
  await [1,2,3,4,5].forEach(async v => {
    await timer();
    list.push(v + 1);
  })
  console.log(list) // 期待値は[2,3,4,5,6]だけど実際は[]
})()
```

forEachの各イテレーションの返り値はasyncキーワードによってpromiseになってるけど、forEach自身が何も返却しないのでそれをawaitしても当然次の処理まで待機されない。

以下はこういう系の問題をいい感じにするためのコード

## forEach

そもそもforEachを使わずに関数スコープを生成しないfor-ofを使って問題解決する

```js
function timer() {
  return new Promise(resolve => setTimeout(_ => resolve(), 100))
}

(async () => {
  let list = [];
  for (let v of [1,2,3,4,5]) {
    await timer();
    list.push(v + 1);
  }
  console.log(list) // [2,3,4,5,6]
})();
```

## map

mapは返り値が配列なので比較的楽。
asyncキーワードをつければ個々の値はpromiseでwrapされて`[promise.　<値1>}, promise.<値2>, ...]`みたくなるのでそれをPromise.allしてawaitすれば良い

```js
function timer() {
  return new Promise(resolve => setTimeout(_ => resolve(), 100))
}

(async () => {
  let list = await Promise.all([1,2,3,4,5].map(async v => {
    await timer();
    return v + 1;
  }))

  console.log(list) // [2, 3, 4, 5, 6]
})()
```


## reduce

reduceが一番苦しむ。
forステートメントでも簡単に解決できないし返り値が個々の配列でもないので。

これはPromise1のthenでPromise2をreturnしたら、Promiseのchainの返り値がPromise2になる原理をうまく使って解決する。

```js:こういうやつ
(async () => {
  let res = await new Promise(resolve => {
    setTimeout(_ => resolve(1), 100);
  }).then(result => {
    return new Promise((resolve) => {
      setTimeout(_ => resolve(2), 100);
    })
  }).then(result => {
    return new Promise((resolve) => {
      setTimeout(_ => resolve(3), 100);
    })
  })

  console.log(res) // 3
})()
```
初期値をPromise.resolveでwrapすることで即時に完了するPromiseにして、awaitで待機して真の初期値を得る。
その後、値をreturnするとasyncキーワードによってpromiseでラッップされ、それが次の初期値となる。
この繰り返しでPromiseのchainを作って全体の返り値を最後に返されるPromiseにする。

これによって全体を一つのpromiseにしてしまうことができるのでawaitキーワード一個で全体を待つことができる。

```js
function timer() {
  return new Promise(resolve => setTimeout(_ => resolve(), 100))
}

(async () => {
  let addedList = await [1,2,3,4,5].reduce(async (pmemo, num) => {
    let memo = await pmemo;
    await timer();
    memo.push(num + 1);
    return memo;
  }, Promise.resolve([]));
  console.log(addedList) // [2, 3, 4, 5, 6]
})()
```

## 終わりに

[p-iteraton](https://github.com/toniov/p-iteration)っていう便利なライブラリがあります。
javascriptでクエリストリングを取得する

クエリストリングは以下の方法で取得できます。

```javascript
const params = window.location.search
```
ただ、取り出しただけではkey=value&key=valueで繋がれた状態で使用しにくいので、
Node.js標準ライブラリの[querystring](https://nodejs.org/api/querystring.html)の`parse`を使用して扱いやすいオブジェクトの形にパースします。

```javascript
import { parse } from 'querystring'
console.log(parse("param1=hoge&param2=fuga")) // { param1: 'hoge', param2: 'fuga' }
```

これを使ってクエリストリングを下の方法で取得します。

```javascript
const params = parse(window.location.search.slice(1))
// window.location.search のままだと先頭に?がついているためそれを削除する必要があります。
```

`=`とか`&`をゴリゴリっとして頑張って作っているのを見かけたので調べました。
macOSとPHP7

最近プロジェクトＡｒｋをスタート。Ｗｅｂ　ＲｏｕｔｅｒのコードをテストするためにＭａｃでＰＨＰ７をインストールしてみた。結果的は完成したが、過程はなんか面倒。

インストールする前に、ｍａｃＯＳのＡｐａｃｈｅ２．４の正常稼働を確認した。ＰＨＰ５．６もちゃんと動いていた。ｂｒｅｗを使ってインストールするので、それを準備せよ。

次はＰＨＰ７のインストール。インストールしたかもしれないが、Ａｐａｃｈｅ２．４に装備するには`with-httpd24`は不可欠だ。

    brew info php70

確認の上、インストールする。

    brew install php70 --with-httpd24

最後に、Ａｐａｃｈｅの設定を更新。

/etc/apache2/other/php7.conf を以下の内容で作成せよ。

```
#This line should be in httpd.conf
#LoadModule php7_module /usr/local/opt/php70/libexec/apache2/libphp7.so

# PHP 7
<IfModule php7_module>
	<FilesMatch .php$>
        	SetHandler application/x-httpd-php
	</FilesMatch>
	PHPIniDir "/usr/local/etc/php/7.0/php.ini"
</IfModule>
```

そのあと、LoadModuleという一行を /etc/apache2/httpd.conf に、php5_moduleに関する行を入れ替わる。いよいよ再起動。

    sudo apachectl restart

それだけですね。

-----

# 後日談

言えば虚無であるが、そのあとHigh Sierraに更新した。それでまた例のやつ、Apacheの稼働不能がでる。一層、Apache 2.4もbrewでインストールした。参考として、係のあるディレクトリをメモしよう。

## Config Directory

/usr/local/etc/httpd/

## Web Root

/usr/local/var/www

## Log

/usr/local/var/log/httpd/error_log

/usr/local/var/log/httpd/access_log

## PHPIniDir

/usr/local/etc/php/7.0/php.ini
Amazon Time Sync Service について軽く調べてみた

# ０．はじめに

Amazon Time Sync Service 提供されたとのことなので、
軽く調べてみました。

# １．調べてみた結果

以下、AWS のページです。

* [Amazon Time Sync Service のご紹介](https://aws.amazon.com/jp/about-aws/whats-new/2017/11/introducing-the-amazon-time-sync-service/)
* [Amazon Time Sync Service で時間を維持する \| Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/keeping-time-with-amazon-time-sync-service/)

こちら、
Developers.IO に投稿されていた記事です。
非常にまとまっていて時刻同期に無知な私には有り難かったです。

* [マネージドNTPのAmazon Time Sync Serviceが便利な理由 ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/amazon-time-sync-service-is-convenient/)

ざっくりとまとめると、

* <font color="magenta"><b>VPC 内の EC2 は、インターネットアクセス無しに、時刻同期出来るよ。</b></font>
    * <font color="magenta">インターネット介さないから、ズレが少ない。</font>
    * <font color="magenta">インターネット介さないから、NAT や VPN、DirectConnect などが不要
。</font>

ってことみたいです。

で、
他にも、

* <font color="green"><b>衛星接続の原子時計を使って高精度。</b></font>
* <font color="green"><b>うるう秒の心配無用。</b></font>
* <font color="green"><b>各リージョンで冗長化。</b></font>
* <font color="green"><b>追加料金なし。</b></font>

後、

* <font color="orange"><b>chrony は ntpd より速くて正確に同期できるので、chrony 推奨。</b></font>

ただ、

* <font color="blue"><b>現時点では、C5 と M5 インスタンスは未サポートみたいです。</b></font>
    * [Linux インスタンスの時刻の設定 \- Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html)

# ２．Linux 参考ページ
* [【速報】マネージドNTP Amazon Time Sync Serviceが登場 \#reinvent ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/aws-reinvent-time-sync-service/)
    * Amazon Linux, ntpd
    * Amazon Linux, chrony ※既存
* [Amazon Linux 2はNTPにChronyとAmazon Time Sync Serviceを使う ｜ Developers\.IO](https://dev.classmethod.jp/etc/amazon-linux2-use-chrony-and-time-sync-service-by-default/)
    * Amazon Linux, chrony ※新規
* [AWSのAmazon Time Sync Serviceの設定をしてみる｜ぼぶろぐ](https://ameblo.jp/hackerbobchan/entry-12333245204.html)
    * Amazon Linux, ntpd
    * Amazon Linux, chrony ※既存
* [【re:Invent発表】Amazon Time Sync Service – サーバーワークスエンジニアブログ](http://blog.serverworks.co.jp/tech/2017/11/30/amazon_time_sync_service/)
    * ???, ntpd
    * ???, chrony ※既存
* [AWS EC2 \(Ubuntu\) で Amazon Time Sync Service をサクっと使う \(フェンリル \| デベロッパーズブログ\)](https://blog.fenrir-inc.com/jp/2017/12/amazontimesyncserviceonubuntu.html)
    * Ubuntu,systemd-timesyncd
* [【Stratum3?】 Amazon Time Sync Service を ntpd から使ってみつつ 気になっていたことを確認した \#reinvent ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/aws-reinvent-time-sync-service-stratum/)
    * Ubuntu, ntpd

# ３．Windows 参考ページ
* [【試してみた】Windows2016でAmazon Time Sync Serviceに同期してみた \#reinvent ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/timesyncservice-windows/)

# ＸＸ．まとめ

とりあえず、調べてみましたが、
リソースを AWS に集約しているのであれば、使った方が良いと思います。

品質の良さもありますが、インターネットを介さずに済むのはセキュリティ的にも安心かと。

頑張って NAT や VPN、DirectConnect などの設定をするくらいなら、Amazon Time Service を素直に使った方が良い気がします。

ただ、
オンプレミス、もしくは外部のサーバやサービスとの連携というか、関連のあるシステムだと、ちょっと違ってくるのかもしれないですね。

有難いことに、
各 OS での設定手順を掲載した参考となるページもありましたので、せっかくなので AWS Systems Manager でも使って複数の EC2 への設定など試せればと思います。
中華スマホで3Gの表記のみ出てデータ通信できない場合

#中華スマホで3Gの表記のみ出てデータ通信できない場合
最近iOSからAndroidに乗り換えようと思い、中華スマホを購入しました。

が、SIMを入れても全くデータ通信できない事態が発生しました。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/238453/3b03b842-240f-c172-a316-9a1110a62949.png" width=30%>
3Gの表記は出ているのに(SIMは4Gなのですが)データ通信が一切できません。
Androidの設定項目を見てもデータ通信はOnになっています。
(もちろんスマホ自身がそのSIMの会社のbandに対応していない場合は絶対つながりません)

結論としてどこが悪かったかというとSIMのAPN設定でした。

設定＞(データ使用量の下にある)もっと見る＞モバイルネットワーク＞アクセスポイント名　を開きます。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/238453/03ed770c-3ab5-1000-6b5c-7ab769ea74e3.png"width=30%>
使用しているSIMに対応するAPNを押して編集します。なければ右上の＋を押して作成してください。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/238453/eea50705-3a9a-acaf-1daf-8083d833ac14.png" width=30%>
その中の「MVNOの種類」を「SPN」に変更します。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/238453/ea4e74f4-dd3c-6fd4-c4d3-1701bc1c32e0.png"width=30%>
私の場合はこれで無事4Gをつかみモバイルデータ通信を行うことができました。

##まとめ
中華スマホは最近、安いながらも質のいいスマホがたくさん登場してきました。
今後購入する人が増えると考え、つたない文章ですが自分がひっかかった部分を書かせていただきました。
私の利用する格安SIMの会社の説明ではAPNの設定項目にこのようなことは書いてなかったので自分は引っかかってしまいましたが、もしかしたら他の会社は書いてあるのかもわかりません。
Happy Valentine!! 報われないおまいらのためにハートを授けよう。

```python

#
# Happy Valentine ;)
# 報われないおまいらのためにハートを授けよう。
#


import sys
import math

# 引数チェック
# - ５以上
# - 奇数
if len(sys.argv) <= 1:
    print("引数入れてね")
    exit()
num = int(sys.argv[1])
if num < 5 or num % 2 == 0:
    print("引数は5以上の奇数で入れてね")
    exit()

# 上部
top = ""
top_num = math.floor(num / 2) - 1
for i in range(0, top_num):
    top = " "
    for j in range(0, top_num - i - 1):
        top += "  "
    if i == 0:
        top += "／￣＼／￣＼"
    else:
        top += "／"
        for j in range(0, 2 * i + 4):
            top += "  "
        top += "＼"
    print(top)

# 中部
mid_space = ""
mid_num = math.floor(num / 2) - 1
for i in range(0, mid_num):
    mid_space += "  "
print("｜" + mid_space + " LOVE " + mid_space + "｜")

# 下部
btm = ""
btm_num = math.floor(num / 2)
for i in range(btm_num, -1, -1):
    btm = " "
    for j in range(0, btm_num - i):
        btm += "  "
    btm += "＼"
    for j in range(0, i * 2):
        btm += "  "
    btm += "／"
    print(btm)
```

```sh
$ python ValentineHeart.py 5
 ／￣＼／￣＼
｜   LOVE   ｜
 ＼        ／
   ＼    ／
     ＼／
$ python ValentineHeart.py 7
   ／￣＼／￣＼
 ／            ＼
｜     LOVE     ｜
 ＼            ／
   ＼        ／
     ＼    ／
       ＼／
$ python ValentineHeart.py 9
     ／￣＼／￣＼
   ／            ＼
 ／                ＼
｜       LOVE       ｜
 ＼                ／
   ＼            ／
     ＼        ／
       ＼    ／
         ＼／

```

ちょっといびつだけど、許して（はぁと

----

追伸：
これを使って、ソースコードコメントの有用性について語ったブログも書いたので、参考までにどぞ。
http://hanakayui0628.hatenadiary.jp/entry/2018/02/16/125855
Python3でUnicodeDecodeErrorに躓く

あるシステムのログを解析したいと思い、勉強のためにPythonで解析用のコードを作ることにしました。
しかしながら文字コード関連のエラーに躓いてしまいました。
今後、同じようなことが起こるかもしれないため、メモを残しておきます。
Python3のWindows環境です。

#UnicodeDecodeErrorと遭遇
以下のファイル読み出し後に文字列解析を試みるとUnicodeDecodeErrorと遭遇してしまいました。

```python3:最初のコード
infile = open(file, 'r')

実行結果
Traceback (most recent call last):
  File "result_checker.py", line 14, in <module>
    for line in infile:
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 2642: illegal multibyte sequence
```
Windows環境ではデフォルトだとcp932がデフォルトのエンコーディングが使用されるようです。
今回のログはUTF-8で保存されているため、エンコーディングにUTF-8指定を追加してみました。

```python3:次のコード
infile = open(file, 'r',encoding="utf-8")

実行結果
Traceback (most recent call last):
  File ".\log\result_checker.py", line 14, in <module>
    for line in infile:
  File "C:\Python34\lib\codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 6567: invalid start byte
```
少し動いた形跡はあったのですが、まだエラーが。。。
どうやらシステムの出力特性上、デコードできない文字が含まれているようです。
調べたところ、`errors=`で入力文字列に対し変換ができなかったときの対応方法を指定できるようです。
'ignore'を指定すると「結果となる Unicode から単に文字を除く」ということができます。
今回はそれで十分なので`errors='ignore'`を指定しました。

```python3:動作したコード
infile = open(file, encoding="utf8", errors='ignore')
```

これで何とか読めるようになりました。
Androidスマホを開発で利用するためのファーストステップ

## 開発者向けオプションを表示させる
「設定」－「システム」－「端末情報」を開きます。
一番下のビルド番号を連続タップ。

「システム」に戻ると「開発者向けオプション」が追加されています。
C++版のgetopt

以下のサイトのcmdline.hを使ってみてください。
cmdline.hをインクルードするだけで使えます。
非常にシンプルに使えるのでおすすめです。

git: https://github.com/tanakh/cmdline
作者のサイト: http://d.hatena.ne.jp/tanakh/20091028
#使い方
##宣言
```c++
#include "cmdline.h"
int main(int argc, char **argv){
 ...
 cmdline::parser p;
 ...
}
```
##コマンドラインオプションの登録
parser::add\<T>を使って登録します。Tは受け取る値の型です。

|||
|:---|:---|
|第１引数|フルネームのコマンドライン・オプション|
|第２引数|一文字のコマンドライン・オプション|
|第３引数|コマンドライン・オプションの説明 <br>（--helpのとき表示）|
|第４引数|必須オプションかどうか|
|第５引数|初期値|

```c++
#include "cmdline.h"
int main(int argc, char **argv){
 ...
 cmdline::parser p;
 p.add<int>("number",'n',"particle number",false,10);
 ...
}
```
##コマンドラインオプションのパース
parser::parse_checkを使います。

```c++
#include "cmdline.h"
int main(int argc, char **argv){
 ...
 cmdline::parser p;
 p.add<int>("number",'n',"particle number",false,10);
 p.parse_check(argc,argv);
 ...
}
```

##コマンドラインオプション値の取得
parser::get<T>を使います。

```c++
#include "cmdline.h"
int main(int argc, char **argv){
 ...
 cmdline::parser p;
 p.add<int>("number",'n',"particle number",false,10);
 p.parse_check(argc,argv);
 int n = p.get<int>("number"); 
 ...
}
```
##コマンドライン引数の残り
 rest()はコマンドライン引数の残りをstring配列として返します。

```c++
#include "cmdline.h"
int main(int argc, char **argv){
 ...
 cmdline::parser p;
 p.add<int>("number",'n',"particle number",false,10);
 p.parse_check(argc,argv);
 int n = p.get<int>("number"); 
 if(p.rest().size() > 0){
  hoge=parser.rest()[0];
 }
 ...
}
LaravelでSQL文をlaravel.logに出力する

Railsみたいにhttpリクエスト後に発行されるSQLをログファイルに出力する

## 環境

- Laravel: 5.6.3

## コード

```php:app/Providers/AppServiceProvider.php
    public function register()
    {
        // SQL Log
        \DB::listen(function ($query) {
            $sql = $query->sql;
            for ($i = 0; $i < count($query->bindings); $i++) {
                $sql = preg_replace("/\?/", $query->bindings[$i], $sql, 1);
            }

            \Log::debug("SQL", ["time" => sprintf("%.2f ms", $query->time), "sql" => $sql]);                                                                
        });
    }
```

```console
[2018-02-14 09:17:04] laravel.DEBUG: SQL {"time":"24.56 ms","sql":"select * from \"groups\" order by createdday desc limit 10"}
[2018-02-14 09:17:04] laravel.DEBUG: SQL {"time":"4.98 ms","sql":"select count(*) as aggregate from \"groups\""
```

参考

- [Laravel 実行されたSQLをログに吐き出す - Qiita](https://qiita.com/qiita-kurara/items/6ba0bc10bf8e12ed1a8c)
Project Euler 28「螺旋状に並んだ数の対角線」

ジーっと眺めて閃いちゃえば後は簡単。

## Problem 28 「螺旋状に並んだ数の対角線」
1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184817/00fc5af7-a64e-a1a2-2382-5be5002b6f78.png)

両対角線上の数字の合計は101であることが確かめられる.
1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?

```python3
def hoge(num):
    ans = 1 # 1は最初に加算しておく
    # 3, 5, 7, ..., 1001 という風にnを奇数としてループ
    for n in range(3, num+1, 2):
        # 四隅を加算
        for m in range(4):
            ans += n ** 2 - (n - 1) * m
    return ans

print(hoge(1001))
```

この位なら私でもワンライナーでいけちゃう。
上のをそのまま1行にしただけ。

```python3
sum([ n**2 - (n-1) * m for n in range(3, num+1, 2) for m in range(4) ]) + 1
```
(レポート)公開研究会「単発で終わらせないワークショップデザイン - 持続的な学びをいかにファシリテートするか」

# はじめに
2018/01/30 19:00～21:30 に開催された[公開研究会「単発で終わらせないワークショップデザイン - 持続的な学びをいかにファシリテートするか」](https://peatix.com/event/332869?lang=ja)のレポートです。この研究会では、ワークショップで学んだ内容をどう次へと繋げられるか、という「転移」というキーワードを主軸に展開していました。グラフィックレコード専用のボードも用意されており、ワークショップが終わった後には素敵なグラレコが出来上がっていました。

# 講演

## 「単発で終わらせない」ワークショップデザイン
![IMG_8778.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/27c2aaf0-828f-fb4b-8194-2833418bfeb4.jpeg)
舘野 泰一さんによる講演。各机にお絵かき道具が揃っていたのでメモを取りながら聞いていました。
立教大学で行っている「Business Leadership Program」という講義は、私も社内での噂で聞いたことがあったので、直接お話を聞けて良かったです。

以下の学びを得られました。

- 組織の中で研修による学びを「転移」させるためには、転移を促すための場作りが必要だということ。特に、マネージャー層（研修を受けさせる側）からの研修前の動機付けやリマインドなど、「なぜその研修に行くのか」「研修に行くことによって何を得て欲しいのか」というのを事前に伝えるということが大事、だということ。
- ワークショップの運営には、組織を循環させるために運営に巻き込むようななにかがあったほうがいい、ということ。
- 組織全体を巻き込み、学びを活かせるような場や風土を作るということ。

研修に行く前に上司による後方支援があればやる気も出るほか、頑張って学んだものを活かそうとする姿勢が生まるのは、自身の経験にもあったため、非常に共感できました。研修で学んだ内容を活かす場を作る、というのも非常に重要で、それがないと学んだ内容が活かされないというのも経験済。また、運営に関しても、コミュニティの運営者が楽しそうにやっている姿を見せ、参加者を運営に巻き込んでしまうのが一番ですね（そうやって巻き込まれた経験もあるので…）。色々と心に刺さる内容が多かったです。

# ワークショップ

## 聞きたいことを考えよう！
![IMG_8782.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/a5d4a99e-7e4f-7e13-f6a7-349509e1ea9f.jpeg)
事前に聞きたいことを考えよう、というワークです。事前に聞きたいことを皆で考える、というのもワークショップの手法としていいなぁと思ったので持ち帰り使ってみたいと思います。
色々質問があった中で、「多様な人のいるコミュニティの運用方法は？」という内容が面白かったです。
地域に根ざしたコミュニティなどでは、自分自身が最初はファシリテートしてもよいが、そのうち自走できるようにならないと、コミュニティそのものがつぶれていってしまうため、1年～3年先を見据えて、「外部マネジメントに依存しない」「自分がいなくても回る」ように場をデザインしていく、というものでした。主催者の熱が冷めたり、仕事が忙しくなった時点でつぶれたコミュニティはいくつもあるので、そうならないように運営皆が楽しく回せるようになる場を作っていくことが重要だなーと感じました。

# さいごに
素敵なグラレコが出来ていました。
自身でワークショップを開催することも増えてきたので、「転移」というものを意識しながらワークショップの構成を考えていきたいと思います。
![IMG_8787.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/d8c8ec8d-d814-ef73-c2e6-2895f30879cd.jpeg)
![IMG_8788.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/19ad0344-0a21-8e26-7f65-97b5aee3da9b.jpeg)
![IMG_8784.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/7c3f95cf-791b-db91-602f-dad157b42c0c.jpeg)
![IMG_8785.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/2adca5c0-974a-a3fa-b5b8-a52a9119aa03.jpeg)
![IMG_8783.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/7a96ccc2-933c-fdf0-fa16-67ec6183a4f7.jpeg)
Windowsサーバで.batファイルの関連付けを元に戻す

うっかり.batファイルの関連付けをしてしまうと、エクスプローラーの設定では元に戻せなくなる。

消すには？

 

###レジストリエディタを開く

　　「ファイル名で実行（windowsキー＋R）」→「regedit」

 

###batファイルの関連付けをしたときに作られたリジストリキーを消す

　　ココ。→HKEY_CURRENT_USERのSoftware\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bat

　　.bat右クリックして削除！



###ログインしなおして完了



※ユーザごとに関連付けが独立してるのでユーザごとに消す。
mobageで運営していたゲームのソースを公開

### 概要

一人で開発し、mobage & Yahoo! mobageで運営していたゲームを終了申請しており、ついに今月終了となった。
プログラムを見ると2014年のものがいくつかあるので恐らく3年弱くらいになるだろう。

### 細かい裏話

[mobageで運営していたゲームを終了させた](https://crieit.net/posts/mobage)
で。当記事では技術的なことをまとめる。

### 環境

* PHP (CakePHP2)
* MySQL
* cocos2d-x(JS)

### ソース

古く汚いので、そもそもうまく動かない、くらいの人でないと役にはたたないと思われる。

#### cocos2d-x(JS & Java & Objective-C)側
[https://github.com/dala00/endingroad](https://github.com/dala00/endingroad)
(フリー素材の再配布等を防ぐため念の為素材は全部削除済み）

#### サーバー(PHP)側
セキュリティ上（主にmobageのため）の懸念があったのでほとんど削除して公開している。
[https://github.com/dala00/endingroad-server](https://github.com/dala00/endingroad-server)

### ビルド

ゲームはcocos2d-xで作られており、Android、iOS、PCブラウザのハイブリッド。(iOSは結局年間１万円の費用を払うのが嫌になってアカウントを継続させなかったのでリリースはしておらず、一応ソースは混じっているが今回詳細は書かない）

当時いろいろ調べたが、debug, releaseの切り替え方法が分からなかった。ちゃんと切り替えないと開発環境と本番環境のサーバーURLを切り替えられないので、無理矢理なんとかした。

具体的には、リリースフラグのみを書いたjsファイルを用意し、ビルド時にそれを入れ替えるようにした。

```sh:Android用batファイル
move src\release.js src\release_false.js
move src\release_true.js src\release.js
call cocos compile -p android -m release
move src\release.js src\release_true.js
move src\release_false.js src\release.js
```

あとは同様にして、画像や音声ファイルなどもリリースの時には含めないようにして容量を軽くしたりできる。（後述のAssetManagerにより、アプリ自体に含める必要はないため）

WEBの場合は動いている環境のURLで判断できるのだが、jsファイルが全部まとめてビルドされるので、まとめるべきファイルを書いたproject.jsonに切り替えている。

```sh:WEB用batファイル
move project.json project.native.json
move project.web.json project.json
call cocos compile -p web -m release
move project.json project.web.json
move project.native.json project.json
```

今はちゃんとしたやり方があるかもしれない。

### ゲームの更新

AssetManagerを使っているので、Androidアプリを更新しなくてもサーバー操作のみでプログラムとデータを更新できる。

最初にAssetsLoadSceneに行き、更新があれば更新。なければゲームに移動。スマホアプリは更新がすぐできないので、不具合などが出た時にすぐ直せるよう、AssetManagerの利用は必須だろう。

サーバーにjsや素材をアップロードして、[AssetsManagerController](https://github.com/dala00/endingroad-server/blob/master/app/Controller/AssetsManagerController.php)にアクセスすれば全部更新準備できるようにしていた。

### データの管理

データはそれぞれ種類によって管理方法が異なる。

#### サーバー側で不要なもの

例えばスキルのエフェクト情報や、ステージのメッセージなど。

こういったサーバー側で不要なものはcocos2d-xのプロジェクト内にのみ載せておく。Spreadsheetで管理し、jsの形でエクスポートできるようにしておき、プロジェクト内のファイルと置き換えるだけ。具体的には下記に昔書いていた。

[cocos2d-js用のデータをgoogleスプレッドシートで管理する](https://crieit.net/posts/cocos2d-js-google)

#### サーバー側、ゲーム側両方で必要なもの

ゲーム開始時にサーバー側から読み込んでくる。

#### 両方で必要だが、読み込めないもの

データが重すぎると読み込めない。(jsonのデコードに失敗するっぽい）
なのでそれはサーバー側のプログラムでjs出力できるようにしておき、それをcocos2d側のプロジェクトのファイルにコピーする。

### jsとネイティブ側の連携

課金処理とかもあるので、jsとネイティブ側の連携は必須。下記に昔書いていた。

[cocos2d-jsのAndroidでjavaからjavascriptを呼び出す](https://crieit.net/posts/cocos2d-js-Android-java-javascript)
[cocos2d-jsでObjective-Cからjavascriptを呼び出す](https://crieit.net/posts/cocos2d-js-Objective-C-javascript)

当時も全然情報無かったし今検索しても全然出てこないんだけど何かもっといい方法とかになったのかな。

### まとめ

ソースはだいぶ古いし汚いので何の参考にもならないと思うが、運用のために最低限の必要な考え方はある程度分かるかもしれない。（あくまで小規模なもののみで大規模なアプリには使えないかもしれないが）

プログラミングに関係ない裏話的なものは下記で。
[mobageで運営していたゲームを終了させた](https://crieit.net/posts/mobage)
UnityのVideoPlayerをWebGLに出力し、ローカルで動作確認する方法

UnityのVideoPlayerをWebGLに出力し、ローカルで動作確認する方法

VideoPlayer機能を実装してWebGLビルドしたら引っかかったのでその経過を残しておきます。

### 目的

WebGLビルドにおいてUnityのVideoPlayerを使ってweb上にある動画の再生機能を確認したい。
ここでは[CreativCommons](https://creativecommons.org/licenses/by/3.0/deed.ja)ライセンスで公開されている[mazwai]( http://mazwai.com/system/posts/videos/000/000/214/original/finn-karstens_winter-wonderland-kiel.mp4)にある動画を再生することを目標とする

### 障害

WebGLビルドが完了して動画を再生しようとすると再生されない。
Chromeなどのコンソールを確認すると以下のようなエラーが出力される。

```
Failed to load http://mazwai.com/system/posts/videos/000/000/214/original/finn-karstens_winter-wonderland-kiel.mp4: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:57453' is therefore not allowed access.
```
要するにローカルドメインから外部動画サービスにアクセスしようとして、セキュリティ違反で弾かれてしまう。もちろん本番では同じドメインに動画が展開できるが、ステージング環境などが整うより先に確認がしたい場合にこれでは困る。

### プロキシサーバを立てる

そこで[CORSP](https://www.npmjs.com/package/corsproxy)を使ってローカルにプロキシサーバを走らせる

```
$ brew install node
$ npm install -g corsproxy
$ corsproxy
```

するとログに

```
xxxxx, [log,info], data: CORS Proxy running at: http://localhost:1337
```
と出力される。
ここでは「http://localhost:1337」がプロキシサーバとなる

### 解決

"http://mazwai.com/system/posts/videos/000/000/214/original/finn-karstens_winter-wonderland-kiel.mp4"を再生する場合には"http://localhost:1337/mazwai.com/system/posts/videos/000/000/214/original/finn-karstens_winter-wonderland-kiel.mp4"というようにドメイン頭を先ほどのローカルサーバーにすると再生される。

### 既知の問題
Unity2017.3.f3時点では二回めの再生を行おうとすると、再生状態にはなるが実際には再生されない。この問題の確認用リポジトリを[Github](https://github.com/dTAT/UnityVideoPlaySandbox)に公開しておきます。

## 参考

- [corsproxy](https://www.npmjs.com/package/corsproxy)
- [Mozwai](http://mazwai.com)
VLOOKUPで値がヒットしない

VLOOKUP参照しても、参照先のデータが取ってこれない。

この場合、VLOOKUPの検索値と、参照先の「データ形式（文字列か？数値か）」を

合わせる必要がある。データ形式が異なっていると、違うものとしてヒットしてくれない。
GCが多発し、CPU使用率も高い場合の原因特定方法について

画面をJavaで開発し、テストを行っていたところ、当初は速かった処理がスローダウン的に遅くなる現象が発生しています。
画面は、検索条件に合った情報をEXCEL情報として出力する処理となります。
遅くなっている状態でのサーバ（UNIX）の状態を確認したところ、APサーバのメインプロセス（Javaメインプロセス）の使用率が高く、特に画面を表示していない状態でも30%程度消費している状態です。また、GCもそれなりに発生していました。
遅い状態が続いた後に、誰も使っていない休日の間にFULL GCが3分間隔で3日間発生し、その後スローダウン現象はなくなっています。（CPU使用率も解消）
長時間使っていると発生する現象かどうかはわかりませんが、根本原因を究明したく、どなたかアドバイスをいただければと思います。
Javaのバージョンは8です。
調査方法がわからず、どなたかアドバイスをいただければと思います。