OmniAICreator/Qiita-1.07M huggingface dataset:
linux: { 100KBのファイルを作る > head -c 100K /dev/urandom > test.txt } | bash: { 100K_0001.datと200K_0001.datの作成 }

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
SmartGit付属のMinGW32
grep (GNU grep) 2.24
head (GNU coreutils) 8.25
```

### 100KBファイル作成

C++ Builderのソフト実装用にダミーデータ作成を検討中。

MinGW32では以下のコマンドが使えた。

```bash
$head -c 100K /dev/urandom > test.txt
```

参考: http://kazmax.zpp.jp/linux/random_file.html by kazmaxさん

### bash: 100K_0001.datと200K_0001.datの作成

関連: [bash > print > "00001"という書式での標準出力](https://qiita.com/7of9/items/59c8f666a63ed9353cac)


```bash:mkdmy_171013_exec
#!/bin/bash

for siz in "100K" "200K";do
for idx in $(seq 1 3);do
    wrk=$(printf "%05d\n" $idx)
	head -c $siz /dev/urandom > ${siz}_${wrk}.dat
done
done
```

上記をMinGW32から実行すると、そのフォルダに以下のファイルが生成される。

```
100K_00001.dat
100K_00002.dat
100K_00003.dat
200K_00001.dat
200K_00002.dat
200K_00003.dat
```

`100K_*.dat` : 100KBのファイル
`200K_*.dat` : 200KBのファイル

200Kを200にすると200バイトのファイルを生成できる。
不要になったリモートブランチを削除するコマンド

## 説明
以下のコマンドを実行すると、リモートoriginとリモートupstreamにある、masterとdevelop以外のリモートブランチを削除します。

```
git branch -a | grep -vE 'master$|develop$|\*' | grep -E "remotes/upstream/|remotes/origin" | cut -d "/" -f 3- | xargs -I % sh -c 'git push --delete upstream %;git push --delete origin %'
```

## 補足
- xargsの-Iオプションは指定したプレースホルダー(今回は%)に変数を埋め込みます。
dockerfile php + libpuzzle

さらっと類似画像検索を試したく、phpのlibpuzzleを使おうとした時のdockerfileメモ。


``` Dockerfile
FROM centos:7

RUN yum -y install gd gd-devel gcc gcc-c++ make php-devel which wget
RUN cd /usr/local/src && \
    wget https://download.pureftpd.org/pub/pure-ftpd/misc/libpuzzle/releases/libpuzzle-0.11.tar.gz && \
    tar -xvzf libpuzzle-0.11.tar.gz
RUN cd /usr/local/src/libpuzzle-0.11 && \
    ./configure --with-libpuzzle && \
    make clean && \
    make && \
    make install 
RUN cd /usr/local/src/libpuzzle-0.11/php/libpuzzle && \
    phpize && \
    ./configure --with-libpuzzle && \
    make && \
    make install
RUN sed -ie '$ a extension=libpuzzle.so' /etc/php.ini
```


サンプル

```php:smp.php
$a = puzzle_fill_cvec_from_file('./a.jpg');
$b = puzzle_fill_cvec_from_file('./b.jpg');
$diff1 = puzzle_vector_normalized_distance($a, $b);
echo "a-b:" . $diff1 . "\n";
# out: a-b: 0.723XXXXX
```


本題とは全然関係ないけど

````php:smp.php
$img = file_get_contents("http://hoge/a.jpg");
$a = puzzle_fill_cvec_from_file($img);
```
だと上手くシグネチャを作ってくれなかった。
Ruby | YAML.safe_load で Datetime型のオブジェクトを復元できない

# 反省

基本ドキュメントを読もう。

# 問題

```rb
require 'date'
require 'yaml'
```

Datetime のオブジェクトを YAML に変える

```rb
datetime = DateTime.now
=> #<DateTime: 2017-10-13T18:01:34+09:00((2458040j,32494s,84665000n),+32400s,2299161j)>
```

```rb
datetime.to_yaml
=> "--- !ruby/object:DateTime 2017-10-13 18:01:34.084665000 +09:00\n...\n"
```

`YAML.load` は出来る

```rb
YAML.load(datetime.to_yaml)
=> #<DateTime: 2017-10-13T18:01:34+09:00 ((2458040j,32494s,84665000n),+32400s,2299161j)>
```

`YAML.safe_load` が出来ない

```rb
YAML.safe_load(datetime.to_yaml)
Psych::DisallowedClass: Tried to load unspecified class: DateTime
from
```

# 環境

- ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Gulpでライブリロード(Vagrant環境)

#背景

- html, css, js等を編集した後リロードボタンを押すのがとてもつらい
- ソース結合やらで既にgulpを導入していたのでそのまま流用したい
- ひとりでにブラウザがリロードされるのをドヤ顔で眺めていたい

#環境
- Vagrant上のVMでApacheが動作中
- VM上のサーバに`http://192.168.10.10/`でアクセスできる
- ローカルの`/User/ats05/Vagrant/project`をVMとの共有ディレクトリとして使用中


#材料
- npm
- gulp
- browser-sync

#やったこと
npm、gulpは既に導入されている前提でいきます。

### browser-syncのインストール

```
$ npm install --save-dev browser-sync 

(色々出る)

+ browser-sync@2.18.13
added 277 packages in 22.626s
```


確認してみましょう

```
$ npm ls --depth=0
myProject@1.0.0 /site/myProject
...
├──
├── browser-sync@2.18.13
├──
...
```

おk。
ちなみに`--depth=0`をつけないと依存パッケージがわらわら出てきます。注意。




### gulpfile.jsにタスクを作る


ここで実現するライブリロードは


**gulpのwebサーバを起動 -> 変更を検知 -> ブラウザを再読み込み**

という流れ。


- gulpのwebサーバを起動 : `bs-init`
- `gulp.watch`で監視
- ブラウザを再読み込み : `bs-reload`

こんな感じで作成します。




```gulpfile.js
var gulp = require('gulp');
var bs = require('browser-sync').create();

//webサーバ起動
gulp.task('bs-init', function(){
    bs.init({
        proxy: "192.168.10.10" //ローカルサーバへのプロキシ設定
    })
})

//リロード
gulp.task('bs-reload', function(){
    bs.reload();
})

//監視タスク
gulp.task('w', ['bs-init'], function () {
    gulp.watch('/User/ats05/Vagrant/project/*', ['bs-reload']);
});

```


`gulp.task('w', ['bs-init'], function () {`
この部分ですが、gulpのタスクを作成する際には第二引数で「そのタスクの前に実行するタスク」を登録できます。
この場合に`gulp.watch`で監視を行うタスクを呼ぶと、監視を始める前にwebサーバの起動をしてくれるわけですね。


###動かす
```
$ gulp w
```

以上。

---


browser-syncで起動したwebサーバがあればライブリロード自体は実現できるのですが、その場合はバックエンドを動かすことができないようです。
プロキシを通せばその辺りの検証もできます。


手元で動かしているものにはJSのconcatやhtmlの生成などを追加しています。
gulpはgruntに比べ設定ファイルが書きやすいですね。

```
    ...
    gulp.watch('/User/ats05/Vagrant/project/src/js/*', ['js']);
    gulp.watch('/User/ats05/Vagrant/project/src/css/*', ['sass']);
    gulp.watch('/User/ats05/Vagrant/project/src/views/*', ['ejs']);
    gulp.watch('/User/ats05/Vagrant/project/*', ['bs-reload']);
    ...
```



おしまい。
パスワードのための正規表現

正規表現を使ってパスワードのバリデーションをかけるには！
ということを理解できるまでに丸１日かけてしまったので
同じような人の参考まで。。。

# 要求仕様
※パスワードは以下をすべて使用して、8から48文字で入力する。
・小文字の半角アルファベット
・大文字の半角アルファベット
・半角数字
・記号（使用可能記号　!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~）

```
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@[-`{-~])[!-~]{8,48}$
```

Javaのサンプルコード

```java:RegexPassword.java
package sample;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexPassword {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("^$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@\\[-`{-~])[!-~]*");
		Matcher m = p.matcher("aA1!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~");
		Boolean result = m.matches();

		System.out.println("result:" + result);
	}
}
```

# 参考
[正規表現の大前提を知るなら](http://www.mnet.ne.jp/~nakama/)
[正規表現の大前提を知るなら2](https://qiita.com/themoon/items/7c8811b5cf37d700adc4)

[先読み・後読みが分かりやすい](https://abicky.net/2010/05/30/135112/)

[ASCII文字コード表が見やすい](http://e-words.jp/p/r-ascii.html)

[`(?=.*[a-z])`の`.*`の必要性がわからない方には](http://ssk-development.blogspot.jp/2013/08/blog-post.html)

[Javaで正規表現を使うには](https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Pattern.html)

# 雑記
## 前提
言語：Java8

## 本題
パスワード用の正規表現について、
まずは肯定的先読みについて理解するために
動作確認用に以下のコードを書いて実行したところ
想定ではtrueが返ってくるはずがfalseで悩んでました。

```java

package sample;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexWord {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("^(?=.*[a-z])");
		Matcher m = p.matcher("abc");
		Boolean result = m.matches();

		System.out.println("result:" + result);
	}
}
```

結論からいくと、`Pattern p = 〜`の行を以下のように書き換える必要がありました。
`Pattern p = Pattern.compile("^(?=.*[a-z]).*");`
10月2週のGoogle動向

# 今週のGoogleNewsです。

## 開発

Grafeas
https://cloudplatform.googleblog.com/2017/10/introducing-grafeas-open-source-api-.html


## 機械学習

Tensorflow sucks

http://nicodjimenez.github.io/2017/10/08/tensorflow.html

Disです。とても面白いので読みましょう。

Tensorflow Lattice

https://research.googleblog.com/2017/10/tensorflow-lattice-flexibility.html

格子モデルが実装されました。Gradientの方向を、直感に反しない方向に制限できます。(格子補完)

(参考)格子補完とは
https://papers.nips.cc/paper/3694-lattice-regression.pdf


## 論文引用

来週は引用回数ランキングを試みる予定。以下のとおり、単独だとあまり意味はないですからね。

今週引用されたJeffDeanの論文
Efficient estimation of word representations in vector space

今週引用されたSanjayGhemawatの論文
TensorFlow: Large-scale machine learning on heterogeneous systems

## Special Interest in Google
FileMaker // 時間の操作

時間の扱いについてのメモ

##▼１時間の時間幅を設定する
・フィールドタイプは[時刻]
・時間FROM と、時間TILL を設定
・TILLに時刻を入れたら、１時間前の時刻をFROMフィールドに入れる

なんとなく　hour(1)を引いたらいいのかと思ったら,hourは時を表現するやつだった

```FileMaker:計算
時間TILL - time(1,0,0)
```
時間FROMフィールドに上記計算式で成功。timeはtime(H,M,S)とになっているので、
これを覚えておけば色々計算できそう
サロゲートキーとは

#ポイント
* 各テーブルの主キーをidに統一
* リレーションをはるにはテーブル名（単数形）_idを指定する
* railsやCakePHPなどで標準となっているDB設計の規約
* id以外のユニークとなるキーを貼る  
サロゲートキーはリレーションのための機能的なものであり、テーブルの各レコードにはユニークとなるキー（ナチュラルキー[または自然キー]）があるはず
* サロゲートキーという名称をよく忘れる

#参考
サロゲートキーに関するメリットやデメリットなど分かりやすく解説している
http://dbflute.seasar.org/ja/manual/topic/dbdesign/surrogatekey.html
不要になったローカルブランチを削除するコマンド

## 説明

以下のコマンドを実行すると、ローカルにある、masterブランチ、developブランチ、選択中のブランチ、以外のブランチを削除します。

```
git branch | grep -vE 'master|develop|\*' | xargs git branch -D
```

## 補足
grepの-vオプションはパターンにマッチしない行を選択するオプションです。
grepの-Eオプションは拡張正規表現を使用するオプションです。
xargsはコマンドの実行結果をほかのコマンドの入力として渡すことができるコマンドです。
jQueryメモ


class名が同じの時、同じ要素が複数いると、一番最初の要素を見つけたいの場合
.filter(function(){})と.index()を組み合わせの方が便利かも

```html
<span class=name id=reika>reika</span>
<span class=name id=marika>marika</span>
<span class=name id=reika>reika</span>


```

```
var ns = $(".name");
    ns = ns.filter(function(i, e){

    return $(".jinmei:contains(" + $(e).text() + ")").index(".name") == i;

    });
```
KubernetesでUbuntuのイメージをデプロイする

 KubernetesでUbuntuのPodをデプロイする際に少し手間取ったのでメモ

UbuntuのイメージをKubernetesで普通にデプロイ
---
                                   
`　＄　kubectl run ubuntu-pod image=ubuntu　　　`
                                     
このようにubnutuイメージをデプロイしてしまうと、コンテナがデプロイ後に消えてしまう

コンテナが消えないようにコマンドを設定する
---
```yaml:ubuntu-pod.yaml
apiVersion: v1beta3
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
    - name: ubuntu
      image: ubuntu
      command:
        - sleep
        - infinity
```
yamlファイルでpodをデプロイ
`＄　kubectl create -f ubuntu-pod.yaml`

これでUbuntuのコンテナが消えなくなった
ブログにおける ホットワード

ホットワードとは、発表されているホットなワードです。

ツイッターはもちろんSNSなど様々なコンテンツでホットワードが使われますが一般的に話題となる単語のことを言います。

HOT WORD

今日はたまたま「戦力外通告」された「巨人」の「村田」

注目される選手とか注目されるワードがホットワードということですね。

https://tr.twipple.jp/hotword/index.html

逆に、クールワードって何だろう？？

なんて探してみると面白いかもしれませんね

ちなみにトレンドと言うのもありますよね。
皆さんが何に興味が湧くのか情報に価値などが含まれて、地域別や国別でそのトレンドは変わってくるようですね。
昔は、テレビが基本的な情報源でしたがインターネットのネットワークが広がり、もう世界中に発信できる世の中になってきました。国レベルの法律もですが、その言葉言葉に対しての正しい理解とともに、言葉の力を武器にするのではなく。
言葉を届けたい。そう言う気持ちで使っていきたいと思いました。

最近のおすすめのブログは、note ですね。結構まとめている人が多いのでチェック必須です。
https://note.com/

それではまた！

---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
Twitterのタイムラインに表示される「いいね」のTweetを非表示にするJSワンライナー

読みやすさのために改行してるけど、ワンライナー。

```js
Array.from(document.getElementsByClassName("js-stream-item"))
  .filter(e=>e.getElementsByClassName("Icon--heartBadge").length!==0)
  .forEach(e=>e.style.display="none");
```

クラス名で絞り込んで最後に非表示にするって感じ。


tweetの一覧を取得 → 「いいね」のtweetを抽出 → 非表示
という具合。

コンソールに貼り付けて実行するか、
Chrome Extension か何か作って定期的に回せばよさそう。
Scala Play Framework (Play2) を nginxから呼ぶ

[Scala Play2 を起動](https://qiita.com/MiraGi/items/cefdbe12374e10be6a64)
[ngin を起動](https://qiita.com/MiraGi/items/f87851985ff2c9985935)
って感じで、別々の起動まではやったので Play2をnginxから呼ぶようにする。

## 1. nginx の設定追加
これであってるのかよくわかってないけど。。
/etc/nginx/conf.d/scala_play.conf
って設定ファイルを作成してみた。

```
# vim /etc/nginx/conf.d/scala_play.conf
```
中身は下記↓

```
upstream scala_play {
    server 127.0.0.1:9000;
}

server {
    listen      80;
    server_name xxxxx.com;

    root  /var/www/project-name;

    location / {
        proxy_pass http://scala_play;
    }
}

```

## 2. nginx 再起動

```
# systemctl restart nginx
```

## 3. play2　起動

```
# cd /var/www/project-name
# activator run
```

起動後、ブラウザで「xxxxx.com」にアクセスし、welcome画面が表示されればOK。

![welcome_play.jpg](https://qiita-image-store.s3.amazonaws.com/0/118362/0d0879ff-9f01-c1a0-6bee-ae4e04d4e640.jpeg)
Effective C# 社内勉強会 - #0 はじめに

この記事は、[Effective C# 社内勉強会](https://qiita.com/ykoji1112/items/0fbb470d6e2242035bcd)において、参加者が疑問に思った点、質問があった点をまとめたものです。

新人と、プログラム経験年数3,4年目あたりの、あまり技術向上に興味のない人が参加するとどのようなことになるか、コーヒーでも飲みながら読んでいただければ。

また、これからEffective C# を読む人の一助になれば。

そして、参加者の備忘録として。

なお、Effective C# の内容を記述したものではありませんので、本の内容を知りたい方は他ブログを参照して下さい。

#はじめに
#####本書iii「はじめに」から疑問続出！
キックオフミーティングとして、どのような形式で進めるか説明をした。参加者は新人からVB.NET開発経験3～4年まで、計7名。
Chapter1に入る前の練習として、「はじめに」を輪読形式で、それぞれ1段落ずつ読む。
以下、参加者の疑問・質問を1センテンス毎にまとめました。
ジェネリックは、普段何気なく使ってるいるけど、名前は知らない人が多数いました。

####はじめに
- C#コミュニティとは
- [ジェネリック](http://ufcpp.net/study/csharp/sp2_generics.html)とは
- [ラムダ式](http://ufcpp.net/study/csharp/sp2_generics.html)とは
- [LINQ](https://qiita.com/nskydiving/items/c9c47c1e48ea365f8995)とは

####本書が想定する読者
- [共通言語ランタイム（CLR）](https://ja.wikipedia.org/wiki/%E5%85%B1%E9%80%9A%E8%A8%80%E8%AA%9E%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0
)とは
- [JIT（Just-In-Time）](https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)コンパイラとは

####本書の内容について
- マネージ環境では、すべての責任が実行環境の側で管理されるというわけではありません。→どういうこと？
    - ***本書3章より引用***し、説明：メモリ管理や、ガベージコレクタ等、メモリ管理における問題を開発者はほとんど気にする必要はない。
ただし、使用済みのものを後片付けする必要がある場合がある
ファイルのハンドル、データベース接続など
マネージ環境外のリソースを必要とするオブジェクトは、開発者自身による後処理が必要であるため。

- .NETの[Base Class Library（BCL）](https://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)とは
- [マルチコアプロセッサ](http://www.weblio.jp/content/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B3%E3%82%A2%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5)とは

####コード規約
- publicメソッドでは引数やその他の入力値を検証するべきですが→何故、検証するべき？
    - 説明：引数の検証を行わないと、例外が発生する恐れがある。不正な計算結果が返ることになる。検証を行うことで、引数に対する処理が正しい結果を返すことになる。

- [名前空間](https://msdn.microsoft.com/ja-jp/library/dd314350.aspx)とは
- インターフェースを実装していることを示すために#redion/#endregionディレクティブを使用しています。これらは必須ではなく、人によってはコード中に含まれることを嫌うかもしれませんが、～略～
→なぜ、コード中に含まれることを嫌うのか？
   - なんでだろう？ｗ　人によるらしいし、保留で。

#感想
前途多難な気がしてくる。やはり予習必要か。
redashでjavascriptが動作しない...

# やりたいこと
- クエリの結果（テーブル）から欲しいデータを検索する
- getのパラメーターで渡す方法はredashが重くなるので禁止  
<img width="400" alt="スクリーンショット 2017-10-13 16.38.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/198985/20406fa9-13c1-94e7-1710-6f7e3c315b2f.png">


# 試したこと
1. 検索付きのものがないか探す
2. クエリ結果に対して検索を行う方法を探す
3. Javascriptで頑張って検索

# 結果
1. 検索機能付きのものはなさそう...
2. pythonでget_query_resultなるものがあるので不可能ではなさそう
3. なんだかんだ簡単そう

# javascript実装
まずピボットテーブルでテーブル一覧を表示
add widget => text box

```search.html
<script type="text/javascript">
  function searchTable() {
    var tableName = document.fm.tableName.value;
    var results = document.getElementsByClassName("pvtTable")[0].getElementsByTagName("tbody")[0].getElementsByTagName("tr");
    var _tableName;
    for (var i = 0; i < results.length; i++) {
      _tableName = results[i].getElementsByTagName("th")[0].innerHTML;
      if (_tableName == tableName) {
        document.getElementById('resultTableName').innerHTML = _tableName;
        document.getElementById('resultTime').innerHTML = results[i].getElementsByTagName("td")[0].innerHTML;
        break;
      };
    }
  }
</script>
<form name="fm">
  テーブル名 <input type="text" name="tableName">
  <input type="button" value="検索" onclick="searchTable()">
</form>
<table>
  <tr>
    <th id="resultTableName"></th>
    <td id="resultTime"></td>
  </tr>
</table>
```

# なぜか動かない...
なぜか動かず原因を探してみると以下のページを発見
https://discuss.redash.io/t/i-cant-use-javascript-in-text-box/637
javascript使えないじゃん...

# 解決
試しにonclickの中に全て入れてみると動いた

```search.html
<form name="fm">
  テーブル名 <input type="text" name="tableName">
  <input type="button" value="検索" onclick="
  var tableName = document.fm.tableName.value;
  var results = document.getElementsByClassName('pvtTable')[0].getElementsByTagName('tbody')[0].getElementsByTagName('tr');
  var _tableName;
  for (var i = 0; i < results.length; i++) {
    _tableName = results[i].getElementsByTagName('th')[0].innerHTML;
    if (_tableName == tableName) {
      document.getElementById('resultTableName').innerHTML = _tableName;
      document.getElementById('resultTime').innerHTML = results[i].getElementsByTagName('td')[0].innerHTML;
      break;
    };
  }">
</form>
<table>
  <tr>
    <th class="pvtRowLabel" rowspan="1" id="resultTableName"></th>
    <td class="pvtRowLabel" rowspan="1" id="resultTime"></td>
  </tr>
</table>
```

見た目がめちゃめちゃダサいがひとまずこれで対応
EC2内に作業用ユーザーを追加して、新規鍵を元にSSH接続する手順


## はじめに

あるプロジェクトで他社の開発者もEC2インスタンス内で作業する必要が出てきた。
その際、pemファイルを渡さない方法で他社の開発者がSSH接続できる環境を作りたく色々調べた際のメモ。

割とこういう場面ってあるんじゃないかと思う。

### 目次

1. EC2内にユーザーを追加
2. ローカルマシンで鍵の作成
3. サーバーに公開鍵を設置と設定
4. ローカルから鍵を元にアクセス

## 1. EC2内にユーザーを追加する

まずは、他社用のユーザーを追加し、設定する。
> 例では`hogeuser`が他社のアカウントになるので、その部分を適宜変更して進めてみてください

```
// EC2内でルート権限になる
$ sudo -i

// ユーザー追加
$ useradd hogeuser

// パスワードを設定
$ passwd hogeuser

```

`$ vi /etc/sudoers`
vimで`sudoers`を開き`hogeuser`に関する記述を追記

```
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
# 以下を追記
hogeuser ALL=(ALL) ALL
```
編集終わったら、escを押し、:wpを入力してエンター

## 2. ローカルマシンで鍵の作成

他社の開発者が以下で作成した鍵を元にアクセスをしてもらうために、新規で鍵を作成する。
> 以下はサーバーではなく自分のPC内で行う

```
// .sshフォルダがなければ作成
$ mkdir ~/.ssh

// .sshフォルダに入る
$ cd ~/.ssh

// 鍵の作成
$ ssh-keygen -t rsa -f id_rsa_hogeuser

```

以上で、`.ssh`フォルダ内に`id_rsa_hogeuser`と`id_rsa_hogeuser.pub`というファイルが生成される。前者が秘密鍵で、後者が公開鍵。

```

// scpコマンドで公開鍵をアップロード
$ scp -i 〇〇.pem ~/.ssh/id_rsa_hogeuser.pub ec2-user@EC2インスタンスのパブリックIP:/home

```

## 3. サーバーに公開鍵を設置と設定


```

// ec2内に入りルートユーザーになる
$ sudo -i

// ユーザーのディレクトリを作成
$ cd /home

$ mkdir hogeuser

// hogeuserディレクトリに入る
$ cd hogeuser

// .sshディレクトリを作成
$ mkdir .ssh

// 公開鍵をコピーしてリネーム
$ mv /home/id_rsa_hogeuser.pub /home/hogeuser/.ssh/authorized_keys

// ユーザーとグループを変更
$ chown -R hogeuser:hogeuser ./.

// 権限変更
$ chmod 700 .ssh

$ chmod 600 .ssh/authorized_keys
```

## 4. ローカルから鍵を元にアクセス

```
// 秘密鍵を元にアクセス
$ ssh hogeuser@EC2インスタンスのパブリックIP ~/.ssh/id_rsa_hogeuser
```

上記入力後に作成したパスワードでアクセスが可能。
rootユーザーになりたい場合も同じパスワードでなれる。
supersetのsliceタイトルで日本語を使う

表として出力するデータが文字化けする問題は[こちらの記事](http://fujiyasu.hatenablog.com/entry/2017/01/14/153617)が参考になるかと。

# 前提
docker-composeを使ってsupersetを建てた
https://github.com/amancevice/superset

# 問題
sliceのタイトルに日本語を入れたら500エラー画面になった

# 原因
docker-composeで建ててるmysqlサーバーのcharactor-setがlatin1になってた

# 対応
[こちらの記事](https://qiita.com/neko-neko/items/de8ea13bbad32140de87)を参考に、mysqldの実行オプションで `character-set-server` を指定した。

大した知見じゃないけどsuperset記事少ないからログっておこう
Mac OS high Sierraにupdate後，Atom Editorのupdateが動かなかったときの解決法メモ

# はじめに
Atom editorを 1.21.0 -> 1.21.1にアップデートしようと， 
いつも通りAtom内でRestart & Updateをクリックしたのですが， いつまで経っても再起動してきませんでした．
何度もやり直してもダメだったので， 最終的に解決した手法をメモっておきます．

## 発生環境
- macOS High Sierra
- Atom Editor 1.21.0 -> 1.21.1へのアップデート

# 解決法
- [Restart and update does not work (MacOS) - support - Atom Discussion](https://discuss.atom.io/t/restart-and-update-does-not-work-macos/15067/26)

Atom のサポートにDiscussionがあり， 同じ状況の人達がいたので参考にしました．
ここには複数のステップが書いてありますが， 自分は最初のステップのみで解決しました．

```zsh
$ sudo chown -R $(whoami) /Applications/Atom.app/
```

High Sierraにアップデートしたときにディレクトリの権限変わってたのかな。。。 :thinking:
nasmで1~100まで数える

# はじめに
nasmで1~100を表示させるコードを書いたので、ここにメモしました。
基本的には[前回](https://qiita.com/akakou/items/b3279b2de09b62261b7e)の応用です。読んでください。

# コード
## ソースコード
```nasm
; 初期設定
extern  printf                  ; printf関数を持ってくる

; データセクション
section .data
    fmt: db "%d", 10, 0         ; printfで用いるフォーマット

; コードセクション
section .text
    global _start               ; _startを指名

; スタート
_start:
    ; 1. 必要な値の代入
    mov     rdx, 1              ; カウントの初期化

    mov     rcx, 100            ; ループ回数

; 2. ループの先頭
_loop:
    ; 3. 維持して置きたい値の避難
    push   rcx                  ; rcxの避難
    push   rdx                  ; rdxの避難
 
    ; printfに用いる値のセット
    mov    rdi, fmt             ; フォーマット
    mov    rsi, rdx             ; カウントしている値

    ; コール
    call   printf               ; printfをコール

    ; 4. スタックの値をレジスタに戻す
    pop    rdx                  ; rdxを持ってくる
    pop    rcx                  ; rcxを持ってくる

    ; 5. インクリメントする
    add    rdx, 1               ; rdxに１加算

    ; 6. ループバック
    loop _loop                  ; ループバック

; 後処理
fin:
    mov    rax, 1               ; システムコール番号(sys_exit)
    mov    rbx, 0               ; 終了ステータスコード
    int    0x80                 ; システムコール
```

## 実行
```shell-session
$ nasm -f elf64 ファイル名
$ gcc 生成したオブジェクトファイル名 -nostartfiles -no-pie
$ ./a.out
1
2
3
4
.
.
.
97
98
99
100
```

# 解説
## 1. 各値の指定　
表示するようの値として`rdx`を用いるので、初期値として1を代入します
x86-64だと`rcx`に置いた回数だけループされるので、以下のコードで`rcx`に100を入れます。

```nasm
mov     rdx, 1 
mov     rcx, 100
```

## 2. 6.  ループをセット
`_loop`というラベルを貼り、`loop _loop`が来たときrcxがゼロ以外ならループします。

```nasm
_loop:
ここにコード
loop _loop
```

## 3. 維持して置きたい値の避難
printfのコール時にレジスタの値が消えてしまうので、スタックに避難させます。

```nasm
push    rcx
push    rdx
```

## 4. 避難させたスタックをレジスタに戻す
上記のスタックに避難させた各値をレジスタに戻します。

```nasm
pop    rcx
pop    rdx
```

## 5. rdxに１加算
`rdx`に1加算します。

```nasm
add    rdx, 1 
```

# さいごに
こんな感じで、1~100を呼び出しました。
何か間違ったこと等あればコメントください。
Pixi.jsでどんなアスペクト比の画像でも正しくuv座標を取る方法

Pixi.jsを使っていて詰まったところをメモ。
任意のアスペクト比の画像に対して同じようにwebglのエフェクトを掛けようとする時、一手間が必要になります。
具体的には mappedMatrix という変換行列を用意してあげて、これをfilterに適用します。


```js
let cvs = document.getElementById('cvs')
cvs.width = 800
cvs.height = 600

let renderer = new PIXI.WebGLRenderer(cvs.width, cvs.height, {view: cvs, antialias: true} )
let container = new PIXI.Container()

let img = new Image()
img.src = "/images/detail/" + imgID + ".jpg";


img.onload = function(){
  let sprite = new PIXI.Sprite(new PIXI.Texture(new PIXI.BaseTexture(img)))
  sprite.width = cvs.width
  sprite.height = cvs.height
  container.addChild(sprite)
  renderer.render(container)
}


let frag =
   `precision mediump float;
    uniform vec4 filterArea;
    uniform sampler2D uSampler;
    uniform mat3 mappedMatrix;
    uniform float val;
    varying vec2 vTextureCoord;
    void main (void) {
     vec3 map = vec3(vTextureCoord.xy, 1) * mappedMatrix;
     vec4 col = texture2D(uSampler, vTextureCoord);
     if(map.x > val) 
       gl_FragColor = texture2D(uSampler, vec2(val, vTextureCoord.y));
     else
       gl_FragColor = col;
   }`
   .split('\n').reduce((c, a) => c + a.trim() + '\n')


let uniforms = {
  val: { type: 'float', value: 0 },
  mappedMatrix : { type: 'mat3', value: new PIXI.Matrix() }
};


let filter = new PIXI.Filter(null, frag, uniforms);


filter.apply = function (filterManager, input, output){
  filterManager.calculateNormalizedScreenSpaceMatrix(uniforms.mappedMatrix.value)
  filterManager.applyFilter(this, input, output);
};


container.filters = [filter]


function update(){
  uniforms = {
    val: { type: 'float', value: 1 },
    mappedMatrix : { type: 'mat3', value: new PIXI.Matrix() }
  };
  filter = new PIXI.Filter(null, frag, uniforms);
  container.filters = [filter]
  renderer.render(container)
  requestAnimationFrame(update)
}


update();

```

ご参考までに！
[EC2のスケジュール 停止] 会社から帰る時にスケジュール実行したlambdaからEC2(staging)をとめる

stgingで使っているEC2を停止するのを忘れてしまうということがよくありました。（主な犯人は僕です）手動で毎回止めるのもだるいし、人間は忘れっぽい生き物ですのでEC2のスケジュール停止をlambdaで実現しました。

# 設定の流れ

1. EC2を停止するlambda関数を作成
  - EC2をlambdaから停止・起動するためのIAMのロールを作成
  - node.js で関数を実装
  - テスト
2. CloudWatch Eventsでスケジュール設定

# EC2を停止するlambda関数を作成

「一から作成」で新規関数を作成します。

[![https://gyazo.com/3a46795ca6ed2019674451fa7c40c265](https://i.gyazo.com/3a46795ca6ed2019674451fa7c40c265.png)](https://gyazo.com/3a46795ca6ed2019674451fa7c40c265)

lambdaからEC2の起動・停止をするにあたり、IAMのロールを作成します。

[![https://gyazo.com/890e460ddafeeb2aa003495293c8fe17](https://i.gyazo.com/890e460ddafeeb2aa003495293c8fe17.png)](https://gyazo.com/890e460ddafeeb2aa003495293c8fe17)

ポリシーを編集します。

[![https://gyazo.com/554b539050c1208cf8192ac161091941](https://i.gyazo.com/554b539050c1208cf8192ac161091941.png)](https://gyazo.com/554b539050c1208cf8192ac161091941)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*",
                "arn:aws:ec2:*"
            ]
        }
    ]
}
```

EC2を停止するための関数コードを入力します。

```
const INSTANCE_ID = '*****';
 
var AWS = require('aws-sdk'); 
AWS.config.region = '******'; // 東京リージョン: ap-northeast-1
 
function ec2Stop(cb){
  var ec2 = new AWS.EC2();
  var params = {
    InstanceIds: [
      INSTANCE_ID
    ]
  };
  
  ec2.stopInstances(params, function(err, data) {
    if (!!err) {
      console.log(err, err.stack);
    } else {
      console.log(data);
      cb();
    }
  });
}

exports.handler = function(event, context) {
  console.log('start');
  ec2Stop(function() {
    context.done(null, 'Stoped Instance');
  });
};
```

この段階で「テスト」を実行して以下のようになれば成功です。

[![https://gyazo.com/88457ba6a983ca0785092d8ab60056c9](https://i.gyazo.com/88457ba6a983ca0785092d8ab60056c9.png)](https://gyazo.com/88457ba6a983ca0785092d8ab60056c9)

# CloudWatch Eventsでスケジュール設定

トリガータブで新規のトリガーを追加します。

[![https://gyazo.com/dc62eb7532e618d4a67dd29558b73cbd](https://i.gyazo.com/dc62eb7532e618d4a67dd29558b73cbd.png)](https://gyazo.com/dc62eb7532e618d4a67dd29558b73cbd)

こんな感じで18時に自動で止まるようにします。

[![https://gyazo.com/ab5e6d877d9775a50b6af2cba6e68bb1](https://i.gyazo.com/ab5e6d877d9775a50b6af2cba6e68bb1.png)](https://gyazo.com/ab5e6d877d9775a50b6af2cba6e68bb1)

cronの設定はUTCで時間を設定する必要があるので ` cron(0 9 * * ? *) ` です。
平日だけなどのパターンは以下に記載されているので参考にしてください。

http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html

# まとめ

これでヒューマンエラー・めんどくさい作業なしでEC2が止まるようになりました。

参考にした[LambdaのScheduleイベントでEC2を自動起動＆自動停止してみた](http://dev.classmethod.jp/cloud/aws/lambda-scheduled-event-updown/)のパクリになってしまいましたが、AWSのUIが変わっていたりしていたので、新しいUIのキャプチャでも貼っておくかということで手順をまとめてみました。

# 参考

[LambdaのScheduleイベントでEC2を自動起動＆自動停止してみた](http://dev.classmethod.jp/cloud/aws/lambda-scheduled-event-updown/)
mysqlのカレント接続数と最大接続上限設定値の見方

[こちらのありがたい記事](http://tmtms.hatenablog.com/entry/2017/10/12/mysql-max-connections)をみかけて共有したところ流れ（監視につかいたいかなんか）でなんか聞かれたので備忘録です。

設定されてるserver_idの調べ方は以下になります。グローバルに設定されてるサーバ変数はこれで全部いけます。ワイルドカードは%でいけます。

```
mysql> show global variables like 'server_id';
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| server_id     | 1537850619 |
+---------------+------------+
1 row in set (0.00 sec)
```

ワンラインならこんなかんじ↓

```
# mysql -u myuser -p -h hoge-rds01 -e "show global variables like 'server_id'\G"|grep -i value|awk -F \: '{print $2}'
1537850619
```

カレントとマックスの接続数が知りたい場合は以下にあるとおり、です。
http://www.s-quad.com/wordpress/?p=1403

```
#  mysqladmin -u myuser -p extended-status | egrep '(Max|Threads_)'
| Max_used_connections                       | 3           |
| Threads_connected                          | 2           |
| Threads_created                            | 3           |
| Threads_running                            | 2           |
```

・同時接続された最大値は、3（Max_used_connections）
・現在接続しているMySQLクライアントは、2（Threads_connected ）
・これまでに接続された総数(スレッドキャッシュミスで作られた数）は、3(Threads_created )
・スリープ状態になっていないスレッド数は、2(Threads_running )

ただしこれはステータスであって現在設定されている最大値が知りたいということでしたらば
以下にあるとおり`show global variables`か`mysqladmin`に`Variables`を指定でも見ることができます。

```
mysql> show global variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 66    |
+-----------------+-------+
1 row in set (0.00 sec)

mysqladmin -u myuser -p -h hoge-rds01 Variables|egrep 'max_connections'
```

いままでmysqladminでステータスと変数を見ることができることに気付いてなかったのですが、
ステータスがいけるなら変数もいけるであろうと思ってhelpを眺めたらところオプションがありました。
nasmでprintf関数を使う

# はじめに
nasmでというアセンブリでprintf関数を呼び出して、数値と文字を表示させることをしたのでここにメモをしておきます。

# コード
## ソースコード
```nasm
; 初期設定
extern  printf                 ; 1. printf関数を持ってくる

; データセクション
section .data
    fmt:    db "x=%d", 10, 0   ; 2. printfで使うフォーマットを定義

; コードセクション
section .text
    global _start               ; _startを指名


; スタート
_start:
    ; printfに使うレジスタの値を指定のレジスタに移動
    mov    rdi, fmt             ; 3. printfのフォーマットをレジスタに置く
    mov    rsi, 1234567890      ; 4. 出力する数値の指定

    call   printf               ; 5. printfをコール

    ; 後処理
    mov    rax, 1               ; システムコール番号(sys_exit)
    mov    rbx, 0               ; 終了ステータスコード
    int    0x80                 ; システムコール
```

## 実行
```shell-session
$ nasm -f elf64 ファイル名
$ gcc 生成したオブジェクトファイル名 -nostartfiles -no-pie
$ ./a.out
x=1234567890
```

# 解説
## 1. printf関数を持ってくる
以下のコードで、printf関数を読み込みます。

```nasm
extern  printf
```

## 2. printfで使うフォーマットを定義
以下のコードで、printfのフォーマットを定義します。

```nasm
fmt:    db "x=%d", 10, 0
```

## 3. printfのフォーマットをレジスタに置く
以下のコードで、6行目で定義したフォーマット（`"x=%d", 10, 0`）を、printfで使用するようにレジスタに置きます。

```nasm
mov    rdi, fmt
```

## 4. 出力する数値の指定
以下のコードで表示する値、出力する数値（`1234567890`）を指定します。

```nasm
mov    rsi, 1234567890
```

## 5. printfをコール
```nasm
call   printf
```

# さいごに
こんな感じで、printf関数を呼び出しました。
何か間違ったこと等あればコメントください。
取得済み Docker image を全て更新するワンライナー



Dockerを使っていると大量のイメージがローカルに溜まってきますよね。
そのイメージを更新するためにはいちいちpullしなくちゃならないのがダルい。

ネットを漁ってみましたがタグを指定して持ってくる例が見つからない。(わたしのggりスキルひくっ！)

そんなわけで書きました。

```sh
docker images | grep -v "REPOSITORY" | grep -v "<none>" | awk '{ printf "%s:%s\n",$1,$2 }' | xargs -n1 docker pull
```

awkとxargsはなにかと便利。
iOS11 HTML5 Videoタグ 自動再生周りの挙動検証

# 概要

## 背景

video タグを利用した動画再生の挙動について、自動再生及び手動再生の条件がいつものようにしれっと変わっている可能性があった為、検証を実施した。
今回の検証の主な目的として video タグを用いたシステムの過去iOSバージョンからのマイグレーション事項の有無を抽出する事を設定していたため、挙動の比較対象に iOS10 を指定した。

## 検証方法

下記 video タグを用いて、 (controls と autoplay 属性の有無) x (iOS 10,11) の組み合わせを網羅して挙動を検証した。

```
<video width="320" height="180" src="movie.mov"></video>
```

# 検証環境

- 検証端末
    - iPhone8 Plus / iOS 11.0
    - iPhone7 / iOS 10.3.3
- 動画フォーマット : mov (iPhone で撮影)
- ブラウザ : Safari (build-in)

# 検証結果

挙動に差分が生じている箇所は __太字__ としている。

## iOS 10

|       |control autoplay|control|autoplay|(なし)|
|-------|----------------|-------|--------|-----|
|自動再生|不可|不可|不可|不可|
|サムネイル|表示される|非表示|表示される|非表示|
|手動再生|可|可|__可__|__可__|

## iOS 11

|       |control autoplay|control|autoplay|(なし)|
|-------|----------------|-------|--------|-----|
|自動再生|不可|不可|不可|不可|
|サムネイル|表示される|非表示|表示される|非表示|
|手動再生|可|可|__不可__|__不可__|

# 結論

control 属性が無くても手動再生が開始できるかどうか、という点で仕様変更があった。
video タグを利用しているサービスが iOS のみをターゲットとしているのならば無条件で control を付けるべきだが、PCなどと共通のシステムであれば、動的に属性の付与を行うなどの処理が必要と思われる。
Virtualboxを起動すると rc=-1912 エラーが出る

## 原因
`apt`でVirtualboxを入れたのが原因で、少し古いバージョンが落ちてきた為に、カーネルのバージョンが違うと怒られている

## fix
書き換えちゃう

```bash
cat << EOF | sudo tee -a /etc/apt/sources.list > /dev/null
deb http://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib
EOF
```


```bash
sudo apt install virtualbox-5.1
```

動いた。
Ubuntu 16.04 に VirtualboxをインストールしてWindows10を動かす

## Virtualboxをapt経由でインストール
```bash
wget https://www.virtualbox.org/download/oracle_vbox_2016.asc
sudo apt-key add oracle_vbox_2016.asc
sudo apt update
sudo apt-get install virtualbox-5.1
```

i386関連の依存で怒られるので、言われた通りに

```bash
sudo apt -f install
sudo apt install virtualbox-5.1
```

Dashからvirtualboxを検索する
起動する

## Windows評価版のDL
(必要なら)

https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-10-enterprise

フォームに入力後、4GBちょっとのISOがDLできる

## Virtualboxの初期設定
win10_EP_64bit とか適当な名前を
バージョンはWin10 64bit
その他メモリやら設定して
ドライブに先程DLしたISOをセットして起動
Kotlin で EndlessScrollListener を書いてみました

このソースコード ([gist](https://gist.github.com/ssinss/e06f12ef66c51252563e)) を読んだ後、 
Kotlin に自分で変換してみようと思って書きました

## Kotlin

```kotlin
abstract class EndlessScrollListener(private val layoutManager: LinearLayoutManager): RecyclerView.OnScrollListener() {

    private var previousTotal = 0
    private var loading = true
    private var currentPage = 1
    private var visibleThreshold = 0

    private var visibleItemCount: Int = -1
    private var totalItemCount: Int = -1
    private var firstVisibleItem: Int = -1

    override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)

        visibleItemCount = recyclerView?.childCount ?: 0
        totalItemCount = layoutManager.itemCount
        firstVisibleItem = layoutManager.findFirstVisibleItemPosition()

        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false
                previousTotal = totalItemCount
            }
        }

        if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            currentPage++
            onLoadMore(currentPage)
            loading = true
        }
    }

    abstract fun onLoadMore(currentPage: Int)
}
```

## 使い方

Recycler view があるところに on scroll listener として追加します

```kotlin
// recyclerView は RecyclerView のインスタンス
// linearLayoutManager は LinearLayoutManager のインスタンス
recyclerView.addOnScrollListener(object : EndlessScrollListener(linearLayoutManager) {
    override fun onLoadMore(currentPage: Int) {
        Log.v("OnLoadMore", "page: $currentPage")
　　　　}
})
```
css でお手軽に Text Style Theme を設定する

ひっさしぶりに `scss` とか `sass` 触った時に、Android 的な テキスト用のスタイリングをまとめる時のやり方を簡単に書く方法をメモ

```
$TextVariations: (
  Title: 36,
  Heading: 24,
  SubHeading: 18,
  Body: 16,
  Caption: 14,
  Hint: 12
);

$TextColors: (
  Theme: #foo,
  Default: #zoo,
  Aux: #bar
);

@each $textClass, $fontSize in $TextVariations {
  @each $colorClass, $color in $TextColors {
    %#{$textClass}#{$colorClass} {
      font-size: $fontSize;
      color: $color;
    }
    %#{$textClass}#{$colorClass}Bold {
      font-size: $fontSize;
      color: $color;
      font-weight: bold;
    }      
  }
}
```

と書いて
各所で

```
span {
  @extend %TitleDefault
}
```

とか書けばどこでも使える。scss って楽ンゴ。
[SendGrid] Azureに借りたCentOSがspamhausへ登録されているのでSendGridを使ってメール送信してみる

# ストーリー

Azureに借りたサーバからメールが来なくなったなぁ？変だなぁ？
と思いながらも放置プレイ。
ふとメールログを見てみたらspamhausからはじかれてるじゃないですか。
解除申請しようとするも、どうもAzureからのメール送信はMicrosoftのポリシーにより弾かれているご様子。

検索すると、こんな記事が。。。
[Azure 上にメールサーバー/SMTP サーバーを構築する場合の注意事項](https://blogs.technet.microsoft.com/jpaztech/2016/06/09/smtp-on-azurevm/)

> Azure 上の VM から直接 SMTP 等を使ってメール送信することは、Azure プラットフォームとしてサポートをしておりません。

うへー。だからといって、spamhausへ登録しなくても。。。 :disappointed:

そんなわけで[SendGrid](https://sendgrid.org/)を使うことにしたのでした。

# SendGridの導入

毎月25､000通までなら無料で使えるそうです。

Azure Marketplaceから購入します。

参照 → [AzureのMarketplaceからSendGridを利用してみる](https://qiita.com/yotan/items/e89c6a89b0c2fbec4a4a)

AzureをMicrosoftソリューションパートナーから導入していたりすると、Marketplaceからは購入できません。。。 :cry:

# Postfixの設定

SendGridにきちんとドキュメントが用意されているので、それをなぞります。

参照 → [Integrate SendGrid with Postfix](https://sendgrid.com/docs/Integrate/Mail_Servers/postfix.html)

## 設定ファイルの変更

`/etc/postfix/main.cf`に以下を追記します。

```text:/etc/postfix/main.cf
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587
```

## パスワード記載のファイルを作成

新たに`/etc/postfix/sasl_passwd`ファイルを作成し、以下のような内容にします。

```text:/etc/postfix/sasl_passwd
[smtp.sendgrid.net]:587 ユーザ名:パスワード
```
ユーザ名とパスワードは、Azure Portalから確認できます。

パーミッションを変更してハッシュDB化します。

```shell-session
$ sudo chmod 600 /etc/postfix/sasl_passwd
$ sudo postmap /etc/postfix/sasl_passwd
```

## ライブラリの存在を確認

```shell-session
$ rpm -q cyrus-sasl-plain
cyrus-sasl-plain-2.1.26-20.el7_2.x86_64
```

もしなければ`yum`コマンドでインストールします。

## Postfixを再起動

```shell-session
$ sudo systemctl restart postfix
```

## 送信確認

`/bin/mail`コマンドや、`/usr/sbin/sendmail`コマンドを使って、メールが送信できるか確認します。

お疲れ様でした。 :smile: 

# 2017/10/16追記 - SendGridの設定

デフォルトでは、プレーンテキストのメールはmultipart/alternativeになり、開封追跡用の画像が埋め込まれます。
不要な場合は無効にします。

設定個所は以下にあります。

* Mail Settings
    * Plain Content → Activeにします。
* Tracking
    * Click Tracking → Inactiveにします。
    * Open Tracking → Inactiveにします。
GoでLTやることになったので準備用のメモ

# まずは
何といっても環境設定。

・・・と思いましたが、
その前に自己紹介ですね。

---
# 自己紹介
元々は通信系の技術者。
C言語畑出身。（10年以上）
某携帯会社の交換機で呼制御などをやってました。

そこから転職を機にJavaを経て
Php・Python・Rubyなどでweb系にもチラッとだけ携わりつつ
3年前からGoで開発をするようになりました。

やったことあるものは
[Facebookの仕事上のスキル](https://www.facebook.com/courage.liberty/about?lst=100001844315291%3A100001844315291%3A1507874671&section=education&pnref=about) にもザ～と載せてあります。



---
# で、本題の環境設定に戻りまして・・・
まずは [ココ](https://golang.org/dl/) から好きなものを持って来よう。

---
# インストール
基本ポチポチしていくだけ・・・

---
# GOROOT・GOPATH
GOROOTはインストールした場所。（例：c:\Go）
　※インストーラーなら設定されているはず。

GOPATHは好きな場所。（例：d:\GoPath）
その下にsrcを作ってプロジェクトを作ってアプリを作る感じが良い。
（例：GOPATH/src/myproject/hello）

---
# エディタは・・・
もちろんお好きなもので。

IDEも
もちろんお好きなもので。

僕は [LiteIDE](https://github.com/visualfc/liteide/releases/tag/x32.2) 使ってます。


軽くやりたい方向けなので
ガッツリやりたい方は別の方がいいかもしれません。

---
# 早速 Hello World

webサーバでたったこれだけ。

main.go

```
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe("", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello World")
}
```

やっぱGoってすごい。

---
# コンパイルと実行
IDEを入れた方はBR（build & Run）ボタンを押すだけです。

コマンドの方は
`go build`
してできたファイルを実行すればOK。
（今回は標準packageのみのimportなのでgo getは不要。）

もちろん`go install`でもOKです。

---
# 接続してみる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163142/5422ec3b-03db-a92a-5747-76822e0a4507.png)

終了・・・。

---
# Goでいいと思うところ
・GoFmtで自動でフォーマットをかけてくれるので
　インデントも含めて適当に書いてもキレイなコードになる。

・不要なimportもコンパイルエラーになるのでキレイが維持できる。

・最後に ;（セミコロン）が要らない。

・ifやforに（）が要らない。

・変数定義と初期化を同時にできる。

・importするだけで色んなライブラリが使えて便利。（標準／カスタム）

・deferを使えば解放漏れが防止できる。

・環境設定も楽で、コード量も少なくすぐできちゃう。

・Apache等々、webサーバ系の他のものが要らない。

・コンパイラ言語なので実行ファイルを作ってデプロイすれば割とどこでも動く。
　（各OS用にコンパイルをする形。）

・コードを書き換えても実行ファイルを置き換えなければ運用しているものに影響がない。

・実行ファイルだけバックアップしておけば不測の事態にもすぐに戻せる。

・処理スピードが速い。平行処理もgoroutineですぐにできてしまう。

とか・・・？？
（すみません、あくまでLTのメモなので今思い付いたものだけです・・・）

---
# 本当はもっと書きたかったこと
・ディレクトリ構成はどんな感じがいいのか？

・どんな感じのpackageフローが良いのか？
　（僕の場合packageをclassの様にして、レシーバを使ってMVCっぽい感じにしてます。
　　なるべく１つ１つを小さくしてマイクロサービス的な感じでライトに使うのが個人的にはオススメです。）

・goroutineの実装方法。
　　⇒【追記】後日記事を書きました。
　　　　　[GoのLT用にgoroutineのサンプルを書く](https://qiita.com/courage-liberty/items/f6559f8f477e44d53b3e)

などなどなどなど・・・

---
# 最後に・・・
初だし、LTだし、初心者向けというところで
まずはこんな感じかなと・・・。
（メモレベルなので、あまりいい記事じゃなくてすみません。。）

質問などコメントいただければ
AnswerソングならぬAnswer記事もなるべく書いていきたいと思います！
[AWS Organizations]アカウントの統合とaccount nameの編集方法

以前の記事ではOrganizationsでの新規アカウント作成方法についてご紹介しました。
今回はOrganiationsで管理しているawsアカウントの統合を行います。

▼前回の記事はこちら▼
[AWS Organizationsでアカウントの新規作成とログイン時の注意点
](http://qiita.com/ai-2723/items/d82d072debdbf6d15b34)

#複数アカウントの一括管理
分かりやすく一言で言ってしまえばOrganizationsは複数アカウントの一括管理を可能にするもの。
一括請求はもちろんのこと、グループごとのポリシー管理が可能。

#アカウントの統合方法

1.
親アカウントでコンソールにログインし、[Organizations]から統合したい子アカウントに対して招待を送ります。

![スクリーンショット 2017-10-13 14.20.06.png](https://qiita-image-store.s3.amazonaws.com/0/174392/51e0ba7a-3d7b-638f-0c9f-383f8bc0a7c7.png)

2.
子アカウントのコンソールへログインし、招待の承認をします。

左下の[invitation]をクリック。

![アカウント統合03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/797ec632-12c0-2429-9e3b-efd797fd9d47.png)

内容に相違なければ[Accept]。

![アカウント統合04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/c19c7753-1a63-5822-7f09-2e97c8bc4e5f.png)


以上で、完了です。
再度親アカウントでログインしOrganizationsで一覧を確認すると、都合したアカウントの表示が確認できます。

#Account nameの編集方法

統合が完了し、Organizationsで管理されているアカウントの一覧を見てみると一部のアカウントにAccountnameの表示がない！
ここが空欄になっている事で、請求情報のアカウント毎表示が数字のみのID表示になってしまっていて分かりにくいんですよね。。

![organizationsアカウント名なし.png](https://qiita-image-store.s3.amazonaws.com/0/174392/30ab4e6a-af3c-deb6-ec9b-8e00dd7f87ff.png)

と言う事で、編集してみました。

1.
編集を行いたいアカウントでコンソールへログイン。
右上の[AWSようこそ]のタブ＞[アカウント]

![アカウント表示名変更01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/02c42903-4f02-a072-23ec-9abf23a1365c.png)

アカウント設定画面右上の[編集]をクリック。

![アカウント表示名変更02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/405cee28-9d5f-4bef-d932-649067510645.png)

[Edit]ボタンを押して編集して[Done]。

![アカウント表示名変更03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/6e759be4-7856-7970-6ccb-f39362faab63.png)

以上で、編集が完了しました。

![アカウント表示名変更04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/a9c6505e-7933-a309-1bd2-9443d4aee1d4.png)
MicroServiceからみたBaaS


BaaSって聞いたのですがサービスとしてもそうなのですが、個人的にはエンジニア視点でMicroService的な観点でGoodだなと思いました。
というのも、Web-AP-DBの３層アーキテクチャを考える上で、改めてWeb-APとの関係ってどうあるべきだろ、と考えるきっかけとなりました。
        
### BaaS is What!?
![代替テキスト](http://www.appiaries.com/wordpress/wp-content/uploads/img/pic_baas1.png)

http://www.appiaries.com/jp/baas/
>##### モバイルアプリに必要なサーバー機能はいつも似ている
>サーバーの構築とサーバーサイドのプログラム開発は、アプリ自体の開発と同等に時間とコストを要し、アプリビジネスの成否を決める重要な要素です。
>こういったアプリに共通で必要なサーバー機能をクラウドサービスとして提供するのが、アピアリーズをはじめとしたBaaS(Backend as a Service)です。
BaaSを利用することでアプリの開発者と運営者は、同じようなサーバーの準備・開発を繰り返すことなく、アプリそのものにリソースを集中させることができるようになります。

http://gihyo.jp/dev/feature/01/milkcocoa-baas/0001
>##### フロントエンド開発のおけるコスト増大
>フロントエンドにおける開発のコストが以前にも増して増大したように思えます。RIAからSPAの流れになり，HTML5＋CSS3＋JSでGUIを構築すると言う要求が高まりました。
>そのため，フロントエンドはユーザと接触する面であり，以前よりも増して非常にリソースを掛けないといけない状況になったと考えています。

### What's benefit
http://gihyo.jp/dev/feature/01/milkcocoa-baas/0001
![代替テキスト](http://image.gihyo.co.jp/assets/images/dev/feature/01/milkcocoa-baas/0001/thumb/TH400_001.jpg)

> ##### 人的リソースの不足や時間コストが掛けられないとき
> BaaSは既にバックエンドそのものが提供されるため，バックエンドを開発する必要性がなくなり，その結果開発コストの削減に繋り，より高速に少ない人的なリソースで，サービスを構築できる可能性があります。

### My Comment
BaaSの利用という意味だと、やはりベンチャーとかAgile開発向きの印象が強いですね。forEnterpriseであれば、ほぼ100%自前開発ですね。
>##### BaaSが不適切な場面
>バックエンドに，自分達の独自のビジネスロジックを組み込みたいとき
BaaSはバックエンドが最初から構築されているため，BaaSのバックエンドに自分達のビジネスロジックを含めることは当然ですができません。
>
>バックエンドに対して最適化を行いたいとき
BaaSはバックエンドとして汎用的に作られている場合が多いので，必ずしもサービスに最適な振る舞いになっていない場合が多いでしょう。
>BaaSではなくチューニングされたサーバが必要だと思います。

んで、いろんな会社がサービスをリリースしているらしく、勢力図などはこちらがGood.
http://www.atmarkit.co.jp/ait/articles/1209/28/news146.html

Thanks,
VeeValidateで複数のフィールドにバリデーションをかけるやり方

###VeeValidateとは？

VeeValidateはVue.jsのバリデーション用プラグイン
Vue.js2.0に対応しており、非常に柔軟なプラグインで、入力フィールドの検証とエラー表示ができます。
検証ルールが豊富にありデフォルトだけで20以上あります。独自ルールも設定可能です。

ドキュメントはこちら
[VeeValidate](http://vee-validate.logaretm.com/)

###同時に複数のフィールドを検証するやり方
ドキュメントを読んだのですが、例を見つけることができなかったので
カスタムルールを作成しました。
（一つの項目が複数のフィールドで構成されているような場合）
ドキュメントはES2015/ES6の構文で書かれているので、普段書き慣れていないが書いてみる。


###サンプルコード

```html:HTML
<div id="app">
	<label class="label" for="street">Street</label>
	<div>
		<input type="text" name="street" v-model="street">
	</div>
	<label class="label" for="street_number">Street Number</label>
	<div>
		<input type="text" name="number" v-model="number">
	</div>
	<label class="label" for="city">City</label>
	<div>
		<input type="text" name="city" v-model="city">
	</div>

	<div v-show="errors.has('address')">
		<p v-show="errors.firstByRule('address', 'all_not_empty')">{{ errors.first('address') }}</p>
	</div>
</div>
```


複数のフィールドに``v-model``ディレクティブを使用し、データバインディングを作成。
``errors``オブジェクトを使い、エラーのレンダリングを行います。
``has('field')``でそのフィールドに関連するエラーがないかどうかをチェックし、エラーがあれば
``first('field')``でエラーメッセージを表示。



```javascript:カスタムバリデーション
VeeValidate.Validator.extend('all_not_empty', {
	currentAddress: null,
	getMessage: field => {
		if (!this.currentAddress.street)
			return "Address requires a street";
		if (!this.currentAddress.number)
			return "Address requires a street number";
		if (!this.currentAddress.city)
			return "Address requires a city";
	},
	validate: value => {
		this.currentAddress = value;
		if (!value.street || !value.number || !value.city)
			return false;

		return true;
	}
});
```

バリデーションにカスタムルールを追加。
全てに入力がなければ``false``を返す検証ルールと、
入力がないフィールドに対するエラーメッセージを設定。


```javascript:Vueインスタンス
new Vue({
    el: '#app',
	data: () => ({
		street:'',
		number: '',
		city: '',
	}),
	created() {
		this.$validator.attach('address', 'all_not_empty');
	},
	computed: {
		address() {
			return {
				street: this.street,
				number: this.number,
				city: this.city
			};
		}
	},
	watch: {
		address(value) {
			this.$validator.validate('address', value);
		}
	}
});
```


算出プロパティ(``computed``)に``address``を宣言。
インスタンスが作成された後に``address``に対してカスタムルール``all_not_empty``を設定
ウォッチャ(``watch``)を利用することで、データが変わるのに応じてバリデーションを実行する。

###さいごに

複数のフィールドに対するバリデーションの応用はできそうな感じがする。
だけど、カスタムコンポーネント（同時に検証する複数のフィールドを含む）を作成して
カスタムバリデーションを適用するようなやり方がスマートなのかもしれない・・・
もっとスマートなやり方があれば教えてほしいです。
Twitter apiでパラメータにカンマを使いたい時に注意すること

frieerndships/lookupなどのエンドポイントを使用する場合、screen_nameをカンマで複数設定することができます。

```
Exp)
GET https://api.twitter.com/1.1/friendships/lookup.json?screen_name=episod,twitterapi,whiteleaf,andypiper
```
下記の様にパラメータをURIエスケープするのは理解できるけど、

```
Exp)
GET https://api.twitter.com/1.1/friendships/lookup.json?screen_name=episod%2Ctwitterapi%2Cwhiteleaf%2Candypiper
```
oauth_signatureを作成するときには、エスケープのエスケープになるみたいです。

```
Exp)
oauth_version%3D1.0%26screen_name%3Dhoge%252Chogehoge
```

結果として「%2C」をさらにエスケープするので「%252C」になります。
モジュールを使っている人には関係ないかもしれないですが、[マニュアル](https://qiita.com/Connan/items/3229d4e6447d168c0c93)で頑張っている人の参考になれば。
WordPressでスケジュール管理システム作成


#wordpressでスケジュール管理サイトを作る
プログラミング初心者による悪戦苦闘メモ

動機　　仕事で使うスケジュール管理ができるツールが欲しかった
仕様　　カレンダーにスケジュール表示
　　　　登録した情報を検索
　　　　月末に請求書作成するためにCSVエクスポート

## まずやったこと
最初はPHPで全部一から作ることが思い浮かんだ。
しかし、自分のスキルで果たして作れるのか、いつになるのかわからなかった。
##WordPressをデータベースとして利用している記事をたまたま見つける。
WordPressをブログとしてではなく、物件や商品登録しデータベースとして利用できるっぽいことを知る。
そこからは延々ググり、必要なプラグインをひたすら探し、カスタマイズしていった。

##WordPressを使えるサーバー
スターサーバー
https://www.star.ne.jp/
こちらは無料でとりあえずWordPressが使えるのでおすすめ
#作り方
1.データ管理しやすいテンプレートから
<img width="1004" alt="スクリーンショット 2017-10-13 13.21.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/116193/a849480a-5181-381f-ef25-c99196ac68c9.png">
左サイドバーでメニューや検索バーを表示が一番使いやすいと感じたのでこちらを採用

2.作業日や金額などといったカスタムフィールドを作りたかったので、カスタムフィールドテンプレートのプラグインを入れる。
<img width="781" alt="スクリーンショット 2017-10-13 13.25.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/116193/05a663e4-cb85-6af3-0ba5-fc796caa4b3f.png">

3.カスタムフィールドテンプレートの内容も検索内容に引っかかるように、**Search Everything**プラグインを入れる。

4.登録した物件情報をカレンダーに表示するために、**WordPress Editorial Calendar**プラグインを入れる。
![名称未設定のデザイン.png](https://qiita-image-store.s3.amazonaws.com/0/116193/f4efe887-41ac-328b-d5f2-b671de0b9c2e.png)

ちなみにこちらのプラグインは日本語設定だと日付が逆に表示される（左から日付が表示）ため、設定の変更が必要です。
https://bondesign.jp/archives/1670/

さらに、未来の日付はそのままでは表示できないので、こちらも設定変更必要です。
http://kotori-blog.com/wordpress/future_entry2/

未来の日付を表示させるには、予約投稿機能でできる。
![スクリーンショット 2017-10-13 13.49.54.png](https://qiita-image-store.s3.amazonaws.com/0/116193/2b950795-ae62-431d-dba2-3eb8a6c4cc93.png)

5.月末に請求書を作成したいので、**WP CSV Exporter**プラグインを入れる。
このプラグインはカスタムフィールドテンプレートの項目もエクスポートしたいものだけチェックしてできるので、非常に便利。

6.このままだと誰でもウェブ上で誰でも閲覧できるので、**Password Protected**プラグインを入れる。

#登録した情報の詳細ページ
![スクリーンショット 2017-10-13 13.49.36.png](https://qiita-image-store.s3.amazonaws.com/0/116193/f7fa0027-0cc6-797c-1549-ffccec0bf63e.png)


この地図をクリックするとグーグルナビが起動する。
アップロードした画像はこのままでは小さく見にくいので、クリックすると拡大できる**FancyBox for WordPress**プラグインを入れる。

#総評
とりあえずはこれで日々のスケジュール管理や請求書作成が楽になった。
また、自分だけではなく、複数人でデータ共有するにはこのようなツールが欲しかったので、今後事業拡大に向けてはちょうどよかった。

プログラミングスキルのない個人事業主や中小企業社長にもこのようなツールが無料でできることを知って欲しかったので、乱文ではあるがまとめてみた。

おそらくこのようなシステムを一から作ろうと依頼するとウン十万はすると思う。

資源の少ない創業期や必要最低限の投資で最大限の成果を出さなくてはいけない時期はこのツールで十分機能すると感じた。