OmniAICreator/Qiita-1.07M huggingface dataset:
ささっとAzure仮想マシンからメール送信

# 環境
クラウド：Azure
仮想マシン：Azure上の仮想マシン
OS：CentOS 7.3


# 前書き
自前でメールサーバを立てるのも時代的にどうかなと。
そこで、Azure上に仮想マシンを立てて、SendGridを利用したメール送信を行ってみます。
Azure仮想マシンからSendGridを利用してさくっとメール送信！をポイントにしているため、パラメータの詳細まで検討していません。。。。


# 設定
### ① SendGridの設定
こちらのサイトを参考にしてください。
[Azureのメール送信はSendGrid](http://qiita.com/miwato/items/af684bdcba49a2e2293e)

### ② Postfixの設定
必要なパッケージがいくつかあります。

```
# yum install postfix cyrus-sasl cyrus-sasl-plain

```

インストールが完了したら、設定ファイルを編集します。

```
# vi /etc/postfix/main.cf
（コメントアウトを外して、値を修正）
myhostname = ホスト名.ドメイン名
mydomain = ドメイン名
myorigin = $myhostname
inet_interfaces = localhost
inet_protocols = ipv4

(末尾に追記）
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:azure_XXXXXXXXXXXXXXXXXXXXXXXXXX@azure.com:パスワード   ★
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587


★部分のazure_XXXXXXXXXXXXX@azure.com は、Azure管理画面の
  SendGrid Accounts > （任意の名前）> Settings > Configurations のUSERNAME部分です。
★部分のパスワードは、① で設定したパスワードです。

```


サブミッションポートをOPENにします。

```
# vi /etc/postfix/master.cf

submission inet n       -       n       -       -       smtpd    ★ コメントアウトを外します。


```

postfixを再起動します。

```
# systemctl restart postfix

```


# 動作確認

仮想マシン上から、mail コマンドを利用して送信テストです。

```
# echo "test" | mail -s "test mail" -r Fromアドレス 宛先アドレス


```

以上で終了です。
SendGridを利用することで、SPF、DKIMがpassになってますね。
R MarkdownにBootstrapのPanels機能を実装

タイトルの通りです。以前[ここ](http://qiita.com/kazutan/items/b1e9b9deed9e65e76fce#alert%E3%81%A8%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E4%BB%96%E3%81%AE%E6%9B%B8%E5%BC%8F)に書いたように，htmlタグ直打ちで実装できたのですが，これでは実用に耐えれません。ということでもっと楽にできるように実装しました。

## R Markdownが読み込んでいるもの

R Markdownの基本outputであるhtml_documentには、Bootstrapというデザインワークフレームが組み込まれています。その関係で、jQueryも合わせて読み込まれています。したがって、意図的に除去しない限りはこれら2つは標準で利用可能となっています。

これら2つが使えるということは、Webにおけるいろいろな要素を簡単に組み込むことができます。そこで今回は、[BootstrapのPanels機能](https://getbootstrap.com/docs/3.3/components/#panels)を，jQueryを利用して実現させてみます。

## 目標

- htmlタグなし
- 見出し行にBootstrapにあるクラスを付与するだけで実現
- Panelの終点を手動で指定できるようにする
- 部品化して，簡単に他のRmdにも使えるようにする

## 実装

できました。基本的には以下のようにします:

1. スクリプトのみを記述したhtmlファイルを準備
2. Rmdファイルを準備
3. Rmdのyamlフロントマターに1のhtmlファイルをincludeさせる
4. パネルにしたい部分へ{.panel}を付与

めんどくさそうに見えますが，すごく簡単です。

### スクリプトのhtmlファイルを準備

これが実装のコアです。以下のようなhtmlファイル(ここでは`bs_panel.html`)を準備します:

```html:bs_panel.html
<script>
  $(function(){
    // .panel要素に，panel-defaultクラスを追加
    $(".panel").addClass("panel-default");
    // .panel要素をBootstrapのPanel仕様にあわせる
    $(".panel").each(function(){
      // 見出し要素(h要素)をdivに変換してテキストを保持
      // .panel-headingを付与することで，パネルのタイトルにする
      $(this).children().eq(0).replaceWith(function(){
        $(this).replaceWith("<div class=panel-heading>"+$(this).text()+"</div>");
      });
      // .panel-bodyの要素となる対象を選択してクラスを付与
      $(this).children("*:not('.panel-heading')").wrapAll("<div class=panel-body />");
    });
    // 手動で終了位置を指定した場合の処理(片付け)
    $(".panel-end").each(function(){
      $(this).children().eq(0).remove();
      $(this).children().unwrap();
    });
  });
</script>
```

jsのコーディング規約とか全く知らないので，汚い書き方になってしまいすみません。何をしているかはコード内のコメントを参照してください。このコードをコピペしてファイルを準備してもらえればOKです。

### Rmd側の設定

当然ですが，出力はhtml形式で，BootstrapとjQueryが読み込まている必要があります。大抵の場合デフォルトで組み込まれています。

#### yamlフロントマターの設定

以下のように，先ほどのhtmlファイルを組み込んでください:

```yaml
---
output: 
  html_document:
    include:
      after_body:
        - bs_panel.html
---
```

yamlの書き方については，別途調べてください。

#### パネル部分の指定

以下のようにすると反応するようになります:

```
#### パネルの見出し {.panel}

パネルの内部。ほげほげ。

```

見出しのレベルはどれでもいいのですが，TOCやドキュメントで通常使用するレベルは避けたほうがいいかと思います。これで上記内容がパネルとして出力されます。

ただ，**このままだと「パネルに指定したセクション内容すべてがパネルに収まる」**ことになり，不便です。そこでパネル範囲の終了位置を手動で指定できるようにしてます:

```
#### パネルの見出し {.panel}

パネルの内部。ほげほげ。

#### {.panel-end}

```

このように`.panel-end`というクラスをつけた空見出し(同一見出しレベル)を差しこめば，そこで閉じるようになります。またこれで生成されてしまう要素(h要素とdiv要素)は除去するようスクリプトに書いてます。

### primaryとかwarningとかの指定方法

Bootstrapでの「[Contextual alternatives](https://getbootstrap.com/docs/3.3/components/#panels-alternatives)」についても，同じ感覚で使えます。例えば"warning"として使いたいのであれば，以下のようにしてください:

```
#### パネルの見出し {.panel .panel-warning}

パネルの内部。ほげほげ。

#### {.panel-end}

```

## 実践例

このような感じで使えます:

![2342212.png](https://qiita-image-store.s3.amazonaws.com/0/35118/5b465e38-f836-4b2c-6e06-55522792d3c0.png)

該当スクリプトが記述されたhtmlファイルを読み込むだけなので，プラグイン感覚で利用できます。よかったら使ってください。

**Enjoy!**
GAE/Go datastore のメモ

GAE/Go datastore のメモ

GAE標準のNoSQLストレージである Datastore の個人的備忘録メモです。
※この記事は基本的に[公式ドキュメント](https://cloud.google.com/appengine/docs/standard/go/datastore/reference)の書き写しです。

## エンティティ
### エンティティとは
- キーに関連付けられたDatastoreの保存の際の基本単位
	- エンティティはユニーク識別子である キー を持つ
- エンティティはオプションとして親エンティティを持てる
	- よってエンティティは全体として、ファイルシステムのような階層化構造となる

### エンティティのキーとは
- 以下のいずれかの要素からなる。
	- 文字列のアプリケーションID
	- エンティティタイプ(文字列のカインド)
	- 数値(int64)キー
	- 文字列(string)キー
		- 文字列のキーはエンティティ名, キー名とも呼ばれる
	- 親キー(オプション)
- string, int64 のゼロ値のキー
	- インコプリートキーと呼ばれる
	- 保存されたどのエンティティも参照していない状態を表す
	- インコプリートキーのエンティティをDatastoreに保存すると自動でユニークなキーが生成されて保存される

### 祖先パス
- エンティティ作成時、オプションで別のエンティティを「親」として設定できる
	- このとき親エンティティは実際に存在していなくてもOK
	- エンティティの親子関係は作成後の変更はできない
		- 一度親を設定したら変更できないし、あとから親を設定することもできない
- ルートエンティティから親子関係を辿って対象のエンティティまでの連なりを**祖先パス**という

### エンティティグループとは
- 親のないエンティティ を rootエンティティと呼ぶ
	- 同じ祖先からたどるエンティティは同じエンティティグループに属する
		- つまり、ルートエンティティ以下の全てのエンティティのこと
	- 同じ祖先のエンティティのキーは、グループの親キーとなり、そのエンティティグループを表す。
- エンティティグループに対するクエリを `ancestor queries` と呼ぶ
	- 親キー対して発行する
- エンティティグループは 一貫性とトランザクションのユニット
	- 常に最新の結果を返せる。
- 複数のエンティティグループにまたぐクエリは、古い状態の値を返すことがある
	- Eventual Consistency(結果整合性)というやつ
- 1つのエンティティグループにまとめる(同じ祖先を持つ)と常に最新のデータを取得できる
	- Strong Consistency(強い整合性)というやつ
	- 制約として、同エンティティグループには、1秒1件しか書き込めない
	- [memcacheサービス](https://cloud.google.com/appengine/docs/standard/go/memcache/)などで軽減は可能かもしれない
- システムから割り当てられる ID値はエンティティグループに対して一意になる

### エンティティの内容
- フィールド名は大文字/小文字を区別する
- 通常は構造体のポインタ
	- `PropertyLoadSaver` インターフェースを実装した任意の型でもOK

### PropertyLoadSaver Interface
- エンティティの内容は `PropertyLoadSaver`インターフェースを実装した任意の型で表せる。
	- 構造体のポインタである必要はない
	- `Load` はコンテンツの読み込み時, `Save` は保存時に呼び出される

**実装例**

```go
// 以下の CustomPropsExample はエンティティのプロパティとして使用可能
// 通常の埋め込み構造体より機能が追加されている(Sumの計算)
type CustomPropsExample struct {
    I, J int
    // Sumはdatastoreには保存されないが, 常に I+J の値となる
    Sum int `datastore:"-"`
}

func (x *CustomPropsExample) Load(ps []datastore.Property) error {
    // I, J を通常通り Load する
    if err := datastore.LoadStruct(x, ps); err != nil {
        return err
    }
    // Sumフィールドを埋める
    x.Sum = x.I + x.J
    return nil
}

func (x *CustomPropsExample) Save() ([]datastore.Property, error) {
    // Sumフィールドのバリデーション
    if x.Sum != x.I + x.J {
        return errors.New("CustomPropsExample has inconsistent sum")
    }
    // I, J を通常通り Save する. 以下のコードは "return datastore.SaveStruct(x)" と等価だが
    // 今回はサンプル提示のため, 手動で行っている
    return []datastore.Property{
        {
            Name:  "I",
            Value: int64(x.I),
        },
        {
            Name:  "J",
            Value: int64(x.J),
        },
    }
}
```
メモ: wordpressのtable

```
wp_posts : 記事一覧など

wp_posts.post_status = 'publish' : 公開中
wp_posts.post_status = 'private' : 非公開
wp_posts.post_date : '2015-04-22 00:00:00' : 投稿日
```

```
wp_postmeta : 記事に紐づくデータ
wp_postmeta.post_id = wp_posts.id
wp_postmeta.meta_key : キー
wp_postmeta.meta_value : 値
```

```sql:joinとか
select post.* from
wp_posts as post
left join 
 wp_postmeta as meta
on post.id = meta.post_id
where
    post.post_status = 'publish'
```
いまさら script コマンドで操作ログを取得できるんだと覚えたｗ

# ほんにいまさらですｗ
少し前まで運用っぽい仕事のお手伝いをしていたのですが、そのとき運用の方の操作ミスによる事故（障害）が多発していたんです。で「何故操作ログを取らない？」って思っていたら、「そういう手順で指示されていないから」っていう答え。なんというか。。。まあそんなこともありちょっと調べてみました。
※ちなみに今はログも取得するなど改善されてますｗ

# 備忘録というか参考リンク
script コマンドを使ってのログ取得便利ですねｗ

> [scriptコマンドで作業ログを記録](http://dev.classmethod.jp/server-side/os/scriptcommand/)
> [（今さら）scriptコマンドで操作ログを取得する](http://d.hatena.ne.jp/higher_tomorrow/20110330/1301435608)
> [自分以外のユーザの操作ログ(script)を取得する](http://qiita.com/tukiyo3/items/790124b5de7ff0c90eec)

# 操作ログを他端末で監視
以外と簡単に実現できます。

操作人A

```bash:
$ script -f
```

管理者A

```bash:
$ tail -f typescript
```

便利すねｗ
composerを使ったDrupal8のインストールメモ

Drupalを使っていて、アップデートなどのメンテナンス作業がめんどくさく感じたのでcomposerを利用した方法に変更。これが意外と便利だったのでメモ。

## composerのインストール
composerのインストールはDrupalをインストールする環境にあった方法でインストールする。

[Download Composer](https://getcomposer.org/download/)


## composerを利用してdrupalの環境を作成する

```shell-session
$ composer create-project drupal-composer/drupal-project:8.x-dev DRUPALPROJECT --stability dev --no-interaction
```

_DRUPALPROJECT_ の部分は、任意の名称。_DRUPALPROJECT_ で指定された名前のディレクトリが作成される。

作成されたディレクトリの中には以下のファイルが作成される

- .gitignore
- composer.json
- composer.lock
- drush
- LICENSE
- phpunit.xml.dist
- README.md
- scripts
- .travis.yml
- vendor
- web

Drupal本体は _web_ ディレクトリに入ってる。

## drupalを動かす

1. _DRUPALPROJECT_ に _config_ ディレクトリを作成し、書き込み権限を許可しておく。（作成しておかないとDrupalのインストールウィザードの途中でエラーが出て進めなくなる）
2. _DRUPALPROJECT_ に指定したディレクトリ内にある、 _web_ ディレクトリをドキュメントルートに設定する。ブラウザからアクセスするとインストールウィザードが開始される。
3. ウィザードに従ってインストールを完了させる。

## moduleやthemeを追加する。
モジュールやテーマの追加もcomposerコマンドで用意に行える。
インストールでは無く、あくまで追加(取得)。取得後に管理画面でインストール作業を行なう事になる。

### composer.json の変更
モジュールやテーマを追加作業を実施する前に _composer.json_ を見直す

#### moduleとthemeのインストール先を変更
composer.jsonの _extra_ 部分について

```json:composer.json
{
    "extra": {
        "installer-paths": {
            "web/core": ["type:drupal-core"],
            "web/libraries/{$name}": ["type:drupal-library"],
            "web/modules/contrib/{$name}": ["type:drupal-module"],
            "web/profiles/contrib/{$name}": ["type:drupal-profile"],
            "web/themes/contrib/{$name}": ["type:drupal-theme"],
            "drush/contrib/{$name}": ["type:drupal-drush"]
        }
    }
}
```

_"web/modules/contribute/{$name}":_ の記述に注目する。現状のままモジュールの取得を実施すると、modulesディレクトリの中にcontributeディレクトリが作成される。contributeディレクトリの中にモジュールが設置されることになる。必要な場合はこれらのパスを変更する。

### モジュールやテーマの検索
_DRUPALPROJECT_ ディレクトリ内で以下のコマンドを実行する。

```shell-session
$ composer search drupal/MODULENAME
```

### モジュールやテーマのインストール
_DRUPALPROJECT_ ディレクトリ内で以下のコマンドを実行する。

```shell-session
$ composer require drupal/MODULENAME
```

モジュールのバージョンを指定する場合は _MODULENAME_ の後ろにバージョンを追加する。

```shell-session
$ composer require drupal/MODULENAME:MODULEVERSION
```

### モジュールやテーマの削除
_DRUPALPROJECT_ ディレクトリ内で以下のコマンドを実行する。

```shell-session
$ composer remove drupal/MODULENAME
```
Jenkins Pipelineを利用した時のworkspaceの場所

Jenkins2でPipelineを使っていたら、ふとworkspaceがGUIに表示されていないことに気づいた。
ビルドでできた成果物をローカルに落とすのに便利だったのに、、、と思って調べたのでメモ。

# Pipelineを使う前はここにあった
すぐアクセスできて便利だった...
![以前のworkspace.PNG](https://qiita-image-store.s3.amazonaws.com/0/518/2041161b-67b7-45e6-5904-94fa06a8840b.png)


# Pipelineジョブではここに移動してた
1. ジョブ実行結果ページに遷移
![PipeleneWorkspace1.png](https://qiita-image-store.s3.amazonaws.com/0/518/7bf551fb-f6f0-3421-9245-78ccfc7a350d.png)

2. Pipeline Stepsをクリック
![PipeleneWorkspace2.png](https://qiita-image-store.s3.amazonaws.com/0/518/a2ef84be-3b3d-5273-27b3-8b7b2c84450a.png)

3. Allocate node : Start　をクリック
 ![PipeleneWorkspace3.png](https://qiita-image-store.s3.amazonaws.com/0/518/462ca36a-fc81-96ce-bb9a-678d6084b197.png)

4. ここにあった！
![PipeleneWorkspace4.png](https://qiita-image-store.s3.amazonaws.com/0/518/be0538c0-c86b-8162-e814-b995ccd92df0.png)

# サイドメニューに表示されない理由
ワークスペースはnodeごとに作成されるため、だそう。
（pipelineジョブは複数のnodeを作成できる）
理屈は分かるんだけど・・・nodeの数だけworkspaceがメニューに表示されればいいのにな。

# 参考資料
https://issues.jenkins-ci.org/browse/JENKINS-33839
https://www.selikoff.net/2016/07/10/workspace-jenkins-pipelines/
Word2Vec+LSTMでSNLIデータセットのクラス分類

与えられた２つの文章が前提と仮説の関係になっているかクラス分類するデータセットとしてSNLIがあります．
この問題を解くために学習済みのWord2Vec[^6]とLSTMを組み合わせたモデルをKerasで実装してみたという内容です．

SNLI[^1]データセットの詳細については記事「[SNLIデータセットの読み込み方](http://qiita.com/namakemono/items/6535e01d3a3510654d3f)」[^2]に記載しています．
参考になれば幸いです．

## 前準備

### SNLIデータセットのダウンロード

[The Stanford Natural Language Inference (SNLI) Corpus](https://nlp.stanford.edu/projects/snli/)よりダウンロードできます．

```bash
wget https://nlp.stanford.edu/projects/snli/snli_1.0.zip
unzip snli_1.0.zip
```

### 学習済みWord2Vecの重みのダウンロード

Google Newsによって学習済みのWord2Vecの重みは下記サイト[^6]のリンク"GoogleNews-vectors-negative300.bin.gz"からダウンロードできます．

https://code.google.com/archive/p/word2vec/

## 実装

学習済みWord2VecとLSTMを組み合わせたモデルをSNLIデータセットで学習を行うコード[^5]です．記事[^3]が参考になります．

https://gist.github.com/namakemono/4e2a37375edf7a5e849b0a499897dcbe

## 実験結果

- Train: 82.01%
- Valid: 80.12%
- epoch数: 18

となり，既存の300D LSTM[^11]と同程度の性能が出せていることが確認できます．
ここから更に性能を上げるためにDecomposable Attention[^7] [^8]やESIM[^9] [^10]が使えたりします．

## References

[^1]: Bowman et al., [A large annotated corpus for learning natural language inference. In Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing (EMNLP)](https://nlp.stanford.edu/pubs/snli_paper.pdf), 2015. 
[^2]: namakemono, [SNLIデータセットの読み込み方](http://qiita.com/namakemono/items/6535e01d3a3510654d3f), 2017.
[^3]: lystdo, [LSTM with word2vec embeddings](https://www.kaggle.com/lystdo/lstm-with-word2vec-embeddings), 2017.
[^4]: explosion, [spaCy: Industrial-strength NLP](https://github.com/explosion/spaCy).
[^5]: namakemono, [Trains a LSTM with Word2Vec on the SNLI Dataset.](https://gist.github.com/namakemono/4e2a37375edf7a5e849b0a499897dcbe), 2017.
[^6]: Milkolov et al., [Efficient Estimation of Word Representations in Vector Space](https://arxiv.org/pdf/1301.3781.pdf), 2013.
[^7]: Parikh, [A Decomposable Attention for Natural Language Inference](https://arxiv.org/abs/1606.01933), 2016.(Decomposable Attentionの原論文)
[^8]: namakemono, [Decomposable Attentionアルゴリズムの解説と実装](http://qiita.com/namakemono/items/a3e8d4832d2657dba4fb), 2017.
[^9]: Chen, [Enhanced LSTM for Natural Language Inference](https://arxiv.org/abs/1609.06038), 2017. (ESIMの原論文)
[^10]: namakemono, [ESIMアルゴリズムの解説と実装](http://qiita.com/namakemono/items/1e7132dd6083eec02dd7), 2017.
[^11]: Bowman et al., [The Stanford Natural Language Inference (SNLI) Corpus](https://nlp.stanford.edu/projects/snli/).
gitでbranchをお掃除する際のチートシート

- gitでリモート及びローカルのマージ済みブランチを削除したい場合がある
- 数ヶ月に一度くらいは発生する作業なので、チートシートにまとめてみました
- current branchから見てマージ済みのブランチが候補として指定されます。例えば本番と同期しているのがmaster branchならば、masterをチェックアウトしてから下記のコマンドを実行すると良いでしょう
- grepでmasterかdevelop以外のブランチを指定しているので、対象から外したい文字列が他にあればここをいじれば良いと思います


```bash
# リモートブランチお掃除候補表示
git branch -a --merged | grep -v 'master\|develop' | grep remotes/origin | sed -e 's% *remotes/origin/%%'

# リモートブランチお掃除
git branch -a --merged | grep -v 'master\|develop' | grep remotes/origin | sed -e 's% *remotes/origin/%%' | xargs -I% git push origin :% --no-verify

# ローカルブランチお掃除候補表示
git branch --merged | grep -v 'master\|develop'

# ローカルブランチお掃除
git branch --merged | grep -v 'master\|develop' | xargs -I% git branch -D %
```
IEとXDomainRequestと私

XDomainRequestはIE8とIE9でしか使用できないと思ってましたが、
[MSのフォーラム](https://social.msdn.microsoft.com/Forums/ja-JP/535025b1-b42b-45e1-b5c3-81a6e0c6bdc3/iexuacompatiblexmlhttprequestxdomainrequest?forum=internetexplorerja
)で質問したところ、違ってたので備忘録として


括弧内はX-UA-Compatibleでの指定

##XDomainRequest
IE8(IE=8)　○
IE9(IE=9)　○
IE10(IE=10)　○
IE11(IE=11)　○
IE11(IE=Edge)　×
Edge　×

##XMLHttpRequest ※Level 2
IE8(IE=8)　×
IE9(IE=9)　×
IE10(IE=10)　○
IE11(IE=11)　○
IE11(IE=Edge)　○
Edge　○

いまだにIE(しかも10以下の話)なんかいって感じですが…
IE10とIE11(IE=11)は両方使えるということで
Rabbit MQをインストール(Windows 7 & Ubuntu 14.04)

# rabbitmq

## Windows
### Installation
#### Precondition - install Erlang
http://www.erlang.org/download.html からダウンロード

#### rabbitmq install
http://www.rabbitmq.com/download.html からダウンロード

#### setting
```bash
cd ${RABBIT_MQ_INSTALLED_DIRECTORY}/sbin
rabbitmq-plugins.bat enable rabbitmq_shovel
rabbitmq-plugins.bat enable rabbitmq_management
rabbitmq-plugins.bat enable rabbitmq_shovel_management
```

参照
> http://ksby.hatenablog.com/entry/2015/06/28/203752

## Linux

### Installation
#### Setting
```bash
echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-signing-key-public.asc | sudo apt-key add -
sudo apt-get update
```

#### rabbitmq install
```bash
sudo apt-get install rabbitmq-server
```

#### 起動
```bash
sudo service rabbitmq-server start
```

#### 管理画面の有効化
```bash
sudo rabbitmq-plugins enable rabbitmq_management
```
##### 確認
http://127.0.0.1:15672/ にアクセスして確認
[Vue.js] 最新バージョンのwebpackerだと`*.vue` でsass,scssが使用できない

最近webpackerをはじめました。*.vueの中で`<style lang="sass">`（もしくはscss）にすればsassを使えるかなと思っていたのですが、__2017/08/23__ 時点ではmasterからソースをとってこないとsassが使えませんでした。（最新バージョンのwebpackerだとダメ）

webpackerのissue/prを漁って対応したところ、以下のコミットのように2箇所を修正すれば ` <style lang="sass"> ` でsassもしくはscssが利用できるようになりました。

https://github.com/tackeyy/blog/pull/51/commits/5a1b0a7e6d95d1fd6d670b025630cfb6dfa810d7

- Gemfile

```diff
-gem 'webpacker', '~> 2.0'
+gem 'webpacker', git: 'https://github.com/rails/webpacker.git'
```

- config/webpack/loaders/vue.js

下のファイルで上書きましょう。

https://github.com/rails/webpacker/blob/master/lib/install/config/loaders/installers/vue.js

```diff
+const { env, settings } = require('../configuration.js')
+
+const isProduction = env.NODE_ENV === 'production'
+const extractCSS = !(settings.dev_server && settings.dev_server.hmr)
+
module.exports = {
-  test: /.vue$/,
+  test: /\.vue$/,
   loader: 'vue-loader',
   options: {
-    extractCSS: true,
-    loaders: {
-      js: 'babel-loader',
-      file: 'file-loader',
-      scss: 'vue-style-loader!css-loader!postcss-loader!sass-loader',
-      sass: 'vue-style-loader!css-loader!postcss-loader!sass-loader?indentedSyntax'
-    }
+    extractCSS: isProduction || extractCSS
  }
}
```

` config/webpack/loaders/vue.js ` を上書きするだけで良いのかな？と思っい、 ` ./bin/rails webpacker:install:vue  ` をやり直してみたのですが、結局 ` config/webpack/loaders/vue.js ` が上書きされるだけだったので、` config/webpack/loaders/vue.jsconfig/webpack/loaders/vue.js ` だけ最新にすれば問題ありません。


```
$ ./bin/rails webpacker:install:vue 
warning: parser/current is loading parser/ruby24, which recognizes
warning: 2.4.0-compliant syntax, but you are running 2.4.1.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Webpacker is installed 🎉 🍰
Using /Users/tackeyy/dev/blog/config/webpacker.yml file for setting up webpack paths
warning: parser/current is loading parser/ruby24, which recognizes
warning: 2.4.0-compliant syntax, but you are running 2.4.1.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Copying vue loader to config/webpack/loaders
    conflict  config/webpack/loaders/vue.js
Overwrite /Users/tackeyy/dev/blog/config/webpack/loaders/vue.js? (enter "h" for help) [Ynaqdh] y
       force  config/webpack/loaders/vue.js
Copying the example entry file to /Users/tackeyy/dev/blog/app/javascript/packs
      create  app/javascript/packs/hello_vue.js
Copying vue app file to /Users/tackeyy/dev/blog/app/javascript/packs
      create  app/javascript/packs/app.vue
Installing all vue dependencies
         run  yarn add vue vue-loader vue-template-compiler from "."
yarn add v0.24.6
```

# その他

stylusにしようかなと思ったのですが、railsの一部でvueを使っており、railsではsassを使っているので、vueでもsassを使うことにしました。

この記事は以下のブログにも記載しています。
http://tackeyy.com/blog/posts/how-to-use-sass-or-scss-in-vue-files

# 参考

https://github.com/rails/webpacker/issues/340
https://github.com/rails/webpacker/pull/346
Pro microにusb経由でfirmwareが書けなくなった原因と対応

Bootloader領域を破壊してしまった場合は、[前記事](http://qiita.com/ijikeman/items/52b79254d268b64bd64b)をご参照ください。

Arduino IDE経由でブートローダを書いたにも関わらずRESETとGNDをショートさせてもfirmwareが書き込めない現象(USBデバイスはPC側で認識する)が発生しました。

詳しい原因は調査中ですが、復旧する方法を記載します。

### ■原因
AVRライタ経由でArduino IDE (執筆時の最近版1.8.3)を使ってで書いたbootloaderはログから
Caterina-promicro16.hexというものでした

```rb:arduino-IDEのログ
Arduino15/packages/SparkFun/hardware/avr/1.1.5/bootloaders/caterina/Caterina-promicro16.hex
```

最終結果から推測するにこのbootloaderだとUSB経由のfirmware書き込みに失敗する事がわかりました。
また、qmk_firmware/bootloaderやmegaUSB_DFU_Bootloaders/ATMega32U4-usbdevice_dfu-1_0_0.hexを書き込んでも同様でした。(再検証中）

### ■復旧方法
最終的に
[arduino公式リポジトリ](https://github.com/arduino) にある、 [CATERINA-Micro.hex(1.0.3)](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/bootloaders/caterina/Caterina-Micro.hex)を書き込む事で復旧しました。

### ■pro microクローンについて
今回の復旧方法のヒントとなった、私が初めてpro microを購入し特に今回の事象が発生しなかったものの商品説明を確認するとbootloaderにCATERINA-Micro(1.0.3)が書かれていることがわかりました

```rb:商品説明
...

Color : Blue
Module Size : 3.4cm x 1.8cm/1.33''X0.7''
Pin Size : 3cm X 1.2cm / 1.18''X0.47''
Supported under Arduino IDE v1.0.5


Package Included:
1 x  Leonardo Pro Micro ATmega32U4 Arduino IDE 1.0.3 Bootloader replace Pro Mini
```

pro microクローンをいくつかの販売者から購入しましたが、開封直後でも今回の事象が発生し初期不良品だと勘違いするもがありました。（出荷前に他のbootloaderを書いていると予想）
※pro microを購入する時はどのbootloaderが、書き込まれたものなのか注意する必要があります。
EC2にAngularJSアプリをデプロイした

EC2のAmazon Linuxにproduction環境用のAngularJSアプリをデプロイしました。

まとまったものが見つからなくて結構ググったのでまとめておきます。

## nvm&nodeのインストール

nvmで最新版のnodeをインストール。

```
> curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
> nvm ls-remote
...
v8.4.0
> nvm install v8.4.0
> nvm use v8.4.0
```

## AngularJSアプリのビルド

AngularJSアプリをビルド。

```
> cd /path/to/app
> npm run ng build --prod
```

## Nginx

AngularJSではトップページ以外のURLに対応するHTMLファイルは存在しないので、デフォルトの設定だとトップページ以外のURLにアクセスした時に404になってしまう。

なので、トップページ以外でもindex.htmlを返すように設定してNginxを起動。

```:/etc/nginx/conf.d/app.conf
server {
  listen 80;
  server_name _;
  resolver 8.8.8.8;
  root /path/to/app/dist;

  location / {
   try_files $uri /index.html;
  }
}
```

```
> sudo /etc/init.d/nginx start
```

あとはELBとつないだりして公開します。
VaporでHTTPリクエストをなげる

Vaporを最近触っています。
HTTPリクエストが簡単だったのでメモ。

# 環境
* Vapor 2.0

# やり方

サーバー自体を管理する`Droplet`のインスタンスメソッド`client.get(_:)`を実行するとOK。
引数は文字列で叩きたいAPIのURL。
`client.get(_:).json`でレスポンスのjsonデータを取得できる。

エンドポイント`/qiitaSchema`にGETメソッドでqiitaのスキーマを叩くAPIをこんな感じでかける。

```swift:main.swift
let config = try Config()
try config.setup()

let drop = try Droplet(config)
drop.get("qiitaSchema") { req in
    
    guard let resultJson = try drop.client.get("http://qiita.com/api/v2/schema").json else {
        throw Abort.serverError
    }
    return resultJson
}
```

#　参考

* [How to make requests to connect to third party APIs in Vapor?](https://stackoverflow.com/questions/41460895/how-to-make-requests-to-connect-to-third-party-apis-in-vapor)
* [Droplet](https://docs.vapor.codes/2.0/vapor/droplet/)
* https://qiita.com/api/v2/docs
【 Vim 】ファイルを開いた際に新規作成される、チルダ(〇〇〇.xxx~)ファイルの正体とは!?

#はじめに
Vimエディタを使って、ファイルを編集するのは凄い便利なのですが、
ファイルを編集して保存すると、__(編集したファイル名).xxx~__のようなファイルが新しく生成されている。
一体このファイルは、どのような意味を持って生成されたファイルなのだろうか？

Windows10で、コマンドプロンプトからVimを使用しているが、
dirコマンドを叩いた際に、__~(チルダ)ファイル__が邪魔で、イライラするので、
なんとかならないだろうかと調べてみた自分用のメモをQiitaにまとめてみた。

#そもそも~(チルダ)ファイルって何のためにあるの？
_ファイル名に、「~(チルダ)」が付いたファイルはバックアップ用のファイルです。
ファイルを保存時(:w)に、変更前のファイルを元に生成されます。_

_万が一、ファイルの編集に失敗しても、このバックアップファイルを使用して、
一つ前の世代までのファイルの状態に戻すことができます。_

__知らなかったｗ__

<font color="red">~(チルダ)ファイルがそんな意味を持ってたなんて、、、
今までただ邪魔なファイルが生成されたと思っていた自分を恥じる。</font>

# 簡単な例

```
$ vim sample.txt
```

で、Vimエディタを立ち上げ、ファイルを編集し、
```:w``` で閉じ、dirコマンドを叩くと、、

```
sample.txt
sample.txt~
```

チルダファイルが生成されていることが確認できる。

ここで、変更したファイルに誤りがあり、
変更前のファイルに戻したいとなれば、

(コマンドプロンプトの場合)

```
$ move sample.txt~ sample.txt
```

変更後のファイルに上書きしてやるだけで、元のファイルに元通りとなる。

# ~(チルダ)ファイルを生成しないように設定する方法

ちなみに、このバックアップファイルがいらない場合は、
.vimrcに、下記行を追加してやればいい。

```vim

"バックアップファイルを生成しない
set nobackup
```

#終わりに
最初は難しいと感じるVimも少しづつ、触っているうちに楽しくなってきた。
自分なりの使い方、効率よくプログラミングするためにも環境には環境にはこだわるべきだと思いました。

以上、最後までお読みいただき、ありがとうございます。
EclipseのSystemEditorでOpenWithをする際にGoogleChromeで表示するように設定する

1. EclipseのwindowからPreferenceに入り [General の Web Browser] を開く。

2. Use external web browser　のラジオボタンを選択。

3. External web browsers:　の Google Chrome を選択しOK

以上で変更は完了です。

：External web browsers:　に Google Chrome　が見当たらない場合は[コチラ](http://t-tech.hatenablog.com/entry/2012/01/20/174658)の記事が参考になるかもしれませんのでご紹介しておきます。
Rails5アプリでのRedisの使い方

・前提
Redisは導入済み

・Redisの設置場所
which redis-server
/usr/local/bin/redis-server

Redis導入後、bundle exec rails s を実行して発生したエラー

・エラー文
`Redis::CannotConnectError - Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED): ` 

・対応策
.envに`REDIS_HOST=localhost`と`REDIS_PORT=6379`を追記

```
REDIS_HOST=localhost
REDIS_PORT=6379
```

追記後に、ターミナルを2つ立ち上げる。両方とも該当アプリのcdに移動する。
１つで、 `redis-server`
もう一つで `bundle exec rails s`

以上
Unityで市松模様に穴をあけるシェーダー

ほとんど、`Project -> Create -> Shader -> Standard Surface Shader`で作られるデフォルトのサーフェスシェーダーのまま。

違いは、パラメータの`_Division`と`Cull Off`と`surf`関数の最初の行だけ。
`_Division`パラメータで分割の大きさを決定する。

```glsl
Shader "My/CheckerPattern" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
		_Division ("Division", Int) = 5
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200

		Cull Off

		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		half _Glossiness;
		half _Metallic;
		fixed4 _Color;
		int _Division;

		// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
		// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
		// #pragma instancing_options assumeuniformscaling
		UNITY_INSTANCING_CBUFFER_START(Props)
			// put more per-instance properties here
		UNITY_INSTANCING_CBUFFER_END

		void surf (Input IN, inout SurfaceOutputStandard o) {
			if (int(fmod(floor(IN.uv_MainTex.x * _Division) + floor(IN.uv_MainTex.y * _Division), 2.0)) == 0) {
				discard;
			} 
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

```

![FrameBuffer.gif](https://qiita-image-store.s3.amazonaws.com/0/61569/06fc84a7-ac8e-4a5d-ef11-80cb7e549281.gif)
リロードさせた後、スクロール位置を復元

IE6,IE11,Firefoxにて確認。

keep_scroll_reload() を呼んでGET値にx,y座標を渡し、
リロード後にスクロールする

```js:
// リロード TODO: ?が無い場合対応
function keep_scroll_reload() {
          var re = /&page_x=(\d+)&page_y=(\d+)/;
          var page_x = document.documentElement ? document.documentElement.scrollLeft : document.body.scrollLeft;
          var page_y = document.documentElement ? document.documentElement.scrollTop : document.body.scrollTop;
          var position = '&page_x=' + page_x + '&page_y=' + page_y;
          if(!url.match(re)) {
                  //初回
                  location.href = url + position;
          } else {
                  //2回目以降
                  location.href = url.replace(/&page_x=(\d+)&page_y=(\d+)/,position);
          }
}

// スクロール位置を復元
function restore_scroll() {
        var re = /&page_x=(\d+)&page_y=(\d+)/;
        if(window.location.href.match(re)) {
                var position = window.location.href.match(re)
                window.scrollTo(position[1],position[2]);
        }
}

(window.onload = function() {
        restore_scroll();
})();
```
[クイズ]javascriptと仲良くなるための一歩　第３６話「ブロックスコープ」

#問題

##第1問

```js
function f1(){
  var x = 1;
  console.log("a:" + x)
  { var x = 2; }
  console.log("b:" + x)
}

f1(); //=> a:1
      //   b:?
```

##第2問


```js
function f2(){
  let x = 1;
  console.log("a:" + x)
  { let x = 2; }
  console.log("b:" + x)
}

f2(); //=> a:1
      //   b:?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

##第1問

```js
function f1(){
  var x = 1;
  console.log("a:" + x)
  { var x = 2; }
  console.log("b:" + x)
}

f1(); //=> a:1
      //   b:2
```

##第2問


```js
function f2(){
  let x = 1;
  console.log("a:" + x)
  { let x = 2; }
  console.log("b:" + x)
}

f2(); //=> a:1
      //   b:1
```

ECMAScript第５版にブロックスコープはないが、
javascriptの独自拡張にブロックスコープを使えるletがある。
webpackをv3からv4にしたらwebpack.config.jsで怒られた

webpackがエラーを吐いたのでその原因と修正について。
結論から言うと、webpackのバージョンによってwebpack.config.jsの記述方法が異なっていたことが原因でした。

### エラー

```
Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
 - configuration.resolve has an unknown property 'root'. These properties are valid:
   object { alias?, aliasFields?, cachePredicate?, cacheWithContext?, descriptionFiles?, enforceExtension?, enforceModuleExtension?, extensions?, fileSystem?, mainFields?, mainFiles?, moduleExtensions?, modules?, plugins?, resolver?, symlinks?, unsafeCache?, useSyncFileSystemCalls? }
 - configuration.resolve.extensions[0] should not be empty.
```

### 解決方法

```diff
resolve: {
-   root: ['path_to_source'],
+   modules: ['path_to_source'],

-   extensions: ['', '.js']
+   extensions: ['.js']
  },
```

### 変更点
- `resolve.root` -> `resolve.modules`
- `extensions`で空文字`''`が使えなくなった
DSX Desktopをインストールして触ってみた

# DSX Desktopをインストール
IBMの分析ソフト、Data Science Experienceのデスクトップ版、DSX Desktop(ベータ)がバージョンアップされているのでインストールしてみた。(ベータ開始直後も少しだけ試してみたけど、数ヶ月ぶり）
ダウンロード量が９GB少しとややボリュームが多いけれど、最初からDockerイメージで提供してくれるのはありがたいかもしれない:slight_smile:

ダウンロードはここから
https://datascience.ibm.com/desktop
私はMac版をインストール

ダウンロードしたものを実行すると、こんな画面になる
<img width="538" alt="install1.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/e11563db-70fd-3a30-cf4a-230d9aaa7d2a.png">

ウィンドウの中でDSX Desktopをフォルダーに「Drag&Drop」したらアプリケーションフォルダーに「IBM DSX Desktop」というのができているのでそれを実行

（スクリーンショットを撮り忘れたしまったけれど） Notebook とR Studioをインストールを両方インストールするか、NotebookでSparkは使うかどうか、なんていうオプションを選択する画面が出てくる。
ダウンロード量はNotebookのみ、Sparkなしで６GB程度、Spark付きで3GB程度増えて9GB、それにR Studioをつけると11GB程度となった。
R Studioの部分は後から追加インストールできるようなので、Sparkまででせっかくなので入れてみた。

# ダウンロード
インストール作業を続けると、長時間に及ぶダウンロードが始まった。9GB程度だったけど、自宅のLAN環境で実行して５h程度かかったように思う。途中一回失敗してやり直した。失敗した理由はダウンロードが途中でコケていた。リトライ時は、Macのスクリーンセーバーも一時的にオフにして、ひたすら実行。ダウンロード完了後、Extractが５分程度走ってインストール完了。
（インストール作業のうち、ハマるとするとこのダウンロードだけですね。あとはスムーズ）

# 速っ！！軽快です！！！
実行してみると動きが大変軽快で感動しました:grin:
クラウドでSaaSで提供されているDSX に比べきではないかもしれないけれど。
起動したら左上の「≡」というアイコンをクリックすると、Notebookを作る画面になった。
![dsk1.png](https://qiita-image-store.s3.amazonaws.com/0/149522/48e6e64a-c596-385d-db59-f41aeae54d7b.png)

(いろいろ作ってしまってから撮ったスクリーンショットですが、ノートブック作成画面は以下です。add notebookをクリックして作成します。)
![dsx2.png](https://qiita-image-store.s3.amazonaws.com/0/149522/53ea1f74-027f-773b-f40d-6dea27565cc2.png)

Jupyterで作っていたノートブックも当然動きます。（しかし後述するようにディレクトリー構造がMac上ではなく、Dockerコンテナ内となるのでそのあたりはそのままでは動かない。）
![dsx3.png](https://qiita-image-store.s3.amazonaws.com/0/149522/a09d8b32-fa80-9772-87e4-9a46188c192b.png)

試験的に実行してみたらインストール直後は、pandasのread_excelが実行エラーになりました。原因はxlrdが入っていなかったからでした。Notebook内で!pip intallで追加して普通に無事、正常実行できるようになりました。

# 分析に使用するデータ
DSXはクラウド版と違って、少なくともベータ版ではファイル形式に限定されているようです。add datasetというボタンを押すか、右上のアイコン（ 1と０が組み合わされた、"n=2の単位行列"っぽいボタン) を押して登録します。これで取り込むとローカルのファイルがDocker内に取り込まれます。

![dsx4.png](https://qiita-image-store.s3.amazonaws.com/0/149522/680db220-32d8-c927-2f54-668d9cd78f33.png)

## 登録されたデータファイルの格納場所 
/opt/notebooks/assetsの配下に格納されるようです。（二つ上のスクリーンショット内でpwdして実行時のデフォルトの実行ディレクトリーと登録したファイルのあるassetsフォルダを確認しました）

## ファイルの登録方法（コマンドで登録してみる）
dockerで動いていて、ディレクトリーもわかっているのでMacのターミナルから、コマンドラインで登録してみました。上記スクリーンショット内の list.txtはコマンドラインから登録したものです。
<img width="1117" alt="dsx5.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/bc488322-d2a2-4b73-6b02-0d5289a5a3fd.png">

#dockerイメージの確認
確認してみると anaconda_with_sparkというところですね。（２番目以降は今回インストールしたものではないかもしれません。）
<img width="1073" alt="dsx6.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/aa6d3353-9c61-3e7d-aac0-c6ea52940b17.png">

DSX Desktopが動いているコンテナでシェルを実行していけば、色々中の様子もわかりますね。( docker execでシェル実行 ) 
カスタマイズしていいのかわかりませんが、自分用にローカル環境にcommitしたコンテナイメージを作ってしまってもいいかもしれませんね。
<img width="1073" alt="dsx7.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/c42fa8b0-b619-44a1-ccf6-71717f5121cf.png">
CTFやってる上で便利なサイトをまとめた

# CTFやってる上で便利なサイトをまとめた
## はじめに
題名の通りです。少しずつ追加していきたいと思います。
また便利なサイトがあれば、教えていただけると嬉しいです。

## 便利なサイト
### Reversing・Pwn
* [gdbの使い方](http://uguisu.skr.jp/Windows/gdb.html)

### Crypt
* [rot13変換](http://www.rot13.com/)
* [base64エンコード・デコード](http://www.convertstring.com/ja/EncodeDecode/Base64Decode)
* [md5変換・逆変換](http://www.kiyori.co.jp/md5reverse/)
* [hexからUTF8にエンコード](http://www.eva.hi-ho.ne.jp/cgi-bin/user/zxcv/decodeUTF8.cgi)
* [進数変換](https://hogehoge.tk/tool/number.html)

### Forensic
* [マジックナンバー一覧](https://en.wikipedia.org/wiki/List_of_file_formats)
* [exiftoolの使い方](http://takuya-1st.hatenablog.jp/entry/2013/03/20/220718)
* [緯度・経度から位置を割り出す](https://user.numazu-ct.ac.jp/~tsato/webmap/sphere/coordinates/)

### Web
* [Javascriptの難読化解除](http://jsbeautifier.org/)

### PPC
* [プログラムの高速オンライン実行](https://www.ideone.com/)
(初心者向け)Macbookで写真のサイズを変える

Macbookで写真(jpgファイル)のサイズを変える方法です

- Finderで写真が置かれているフォルダーを開きます
![スクリーンショット 2017-06-04 9.28.20.png](https://qiita-image-store.s3.amazonaws.com/0/125842/7162dfd8-8588-a547-c206-92536cd516eb.png)

- 対象となる元のjpgファイルのサイズと確認するため、元ファイルをダブルクリックして開く 。プレビューというツールで表示されます

![スクリーンショット 2017-06-04 9.29.22.png](https://qiita-image-store.s3.amazonaws.com/0/125842/41f0fd43-0ba7-627e-78aa-1455949b842e.png)

- 画面上部の「プレビュー」メニューの「ツール」▶「サイズの調整」を開くと、元ファイル（例：pic01.jpg）のサイズを確認することができます。ここでは下記の通り、pic01.jpgのサイズは「ピクセル」という単位で測って、幅が９６０ピクセル、高さが３２０ピクセルの横長ファイルであることがわかります。このpic01.jpgを置き換える写真を用意するためには、対象の写真を同じサイズで切り出すことになります

![スクリーンショット 2017-06-04 9.32.52.png](https://qiita-image-store.s3.amazonaws.com/0/125842/46ce0f7b-d767-e7a2-d01b-828824905fb2.png)

- 「キャンセル」▶ 画面左上の赤丸ボタンで元ファイル（pic01.jpg）を閉じます
- 念のため、元になるpic01.jpgファイルをバックアップとして保存しておきます。Finderでpic01.jpgを長押しして、ファイル名が反転したら、適当な名前（例：pic01_bk.jpg)に変更しておきます
- 新しい写真ファイルを上記と同様の手順でプレビューで開きます。必要に応じて（作業を失敗してしまうなどの場合に備え）、新しい写真をコピー▶貼り付けしてバックアップを作成しておきます。
- 「ツール」▶「サイズを調整」を開き、ファイルサイズを確認します
- 表示がピクセル単位になっていることを確認し、幅を９６０ピクセルにします

![スクリーンショット 2017-06-04 9.39.39.png](https://qiita-image-store.s3.amazonaws.com/0/125842/e12624e4-5194-af5d-9945-724405c15896.png)

-スマホで撮影した写真などは縦長の場合が多いので、上記のような比率になっていることが多いです
-「OK」を押すと写真のサイズが幅９６０ピクセルに変更され、下記のような小さい表示になります

![スクリーンショット 2017-06-04 9.41.26.png](https://qiita-image-store.s3.amazonaws.com/0/125842/ca7787da-6e08-c9e0-c4e6-7c14257225cb.png)

- このままでは作業がしにくいので、いったんこの画面を閉じ、再度開き直すと画面いっぱいに表示されるようになります
- 幅９６０ピクセルに対して、高さを３２０ピクセルで切り出したいので、再度「サイズを調整」を押し、「OK」を押します。画面左上に青い点線の四角形が表示されているのを確認し、プルダウン（下向きの矢印）をクリックすると、「長方形で選択」メニューがデフォルトで選択されていることがわかります

![スクリーンショット 2017-06-04 9.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/125842/5ddaa234-e9f6-506d-935c-f47ea362b75d.png)

- 写真の左の灰色の余白から、タッチトラックパッドの左側を押したまま右側をドラッグして、９６０ｘ３２０のサイズになるように画面を選択し、[command]+Cでクリップボードに保存します

![スクリーンショット 2017-06-04 9.46.25.png](https://qiita-image-store.s3.amazonaws.com/0/125842/97c9ac96-5883-d1f8-ac17-e9e06fdf1b59.png)

-「ファイル」▶「クリップボードから新規作成」を選ぶと、前のステップでクリップボードに保存した画面が新しいファイルとして表示されます

![スクリーンショット 2017-06-04 9.50.39.png](https://qiita-image-store.s3.amazonaws.com/0/125842/b48ca4b6-f0a5-cb82-c6a5-24222b94b9f7.png)

- 画面左上の赤丸ボタンを押すと、ファイルの保存画面になるので、ファイル名や保存する場所、ファイルの種類（JPGなど）を指定して保存します。先頭の「名前」欄の右側の下向きの矢印をクリックすると、保存先を指定する画面を表示させることができます

![スクリーンショット 2017-06-04 9.52.59.png](https://qiita-image-store.s3.amazonaws.com/0/125842/e1065a39-d98a-dbe0-55fb-f181923b52dc.png)
(初心者向け)Swift3.0で初アプリ - アイコンを登録してみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[初心者向け）Swift3.0で簡単なiPhoneアプリを作ってみる](http://qiita.com/egplnt/items/e8da2b9af1037e179a57)で作ったシンプルなSwift3.0アプリのアイコンを登録してみます

#1. アイコン用のPNG画像を用意します
- [(初心者向け)Macbookで写真のサイズを変える](http://qiita.com/egplnt/items/54f19d3ff385c6e10b01)などを参照し、縦横１２０ピクセルの正方形のPNG画像ファイルと縦横１８０ピクセルの正方形のPNG画像ファイルを用意します

#2. アイコンを登録します
- Xcodeでアプリを開きます
- 画面左側にナビゲーターを表示させます。表示されていない場合には画面右上隅のアイコンから選択します

![スクリーンショット 2017-06-21 15.00.57.png](https://qiita-image-store.s3.amazonaws.com/0/125842/f68e4094-8b96-623c-04fe-e642d8dcdc32.png)

- ナビゲーターから「Assets.xcassets」を選択し、「AppIcon」を選択します

![スクリーンショット 2017-06-21 15.02.15.png](https://qiita-image-store.s3.amazonaws.com/0/125842/c72f5df9-83cd-7313-79f9-c0b67856bce9.png)

- 前項で用意した１２０ピクセルのPNG画像を「iPhone App iOS7-10 60pｔ」セクションの「２ｘ」の欄へドラッグ＆ドロップします

![スクリーンショット 2017-06-21 15.04.55.png](https://qiita-image-store.s3.amazonaws.com/0/125842/0d16fb1e-7adf-fabc-7ab3-3ce138d11d61.png)

- 同様に、180ピクセルのPNG画像を同じセクションの「3x」の欄へドラッグ＆ドロップします

#3. シミュレーターおよびiPhone実機で確認します
- シミュレーターでアプリを稼働します。アプリ画面（「こんにちは」）が表示されたら、画面上部のシミュレーターのメニューから「Hardware」→「Home」ボタンを押し、アイコンが設定されていることを確認します

![スクリーンショット 2017-06-21 15.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/125842/051f2343-136d-0c8a-c73e-4d88c8d07f78.png)

- iPhoneでも同様に確認します（略）

#次のステップへ
[画像を表示してみる](http://qiita.com/egplnt/items/5452a94d8c646ce709a7)
HTML5.1について

# HTML5.1について

今回、HTML5.1について調べました。

少しだけですが、まとめてみました。

## \<picture\>要素、\<source\>要素のsrcset属性が追加

**<picture>要素の子要素に<source>要素を配置し、srcset属性に画像を指定することで、レスポンシブに対応した画像の表示が可能になりました。**

これにより、スマートフォンとPCで、違う画像を簡単に表示できるようになります。

注意しなければならないことは、\<picture\>要素の中にある\<img\>要素で画像を必ず指定しなければならないということです。

\<img\>要素で画像を指定していないと、srcset属性で画像を指定していても、画像は表示されません。

また、\<picture\>要素に対応していないブラウザで画像を表示した場合に、\<img\>要素で指定した画像が表示されます。

## \<details\>要素、\<summary\>要素の追加

**追加した情報を\<details\>要素で指定すると、ディスクロージャー・ウィジェット表示になります。**

これにより、ユーザーが表示、非表示を切り替えられるコンテンツが簡単に配置できるようになります。

## \<header\>要素、\<footer\>要素を入れ子にすることが可能

**\<header\>要素と\<footer\>要素が、セクショニング要素内に配置されている場合、ネストすることが可能になりました。**

これにより、\<header\>要素と\<footer\>要素は、常にセクショニング要素に関連づけられます。

***

余談になりますが、今回調べたことを

Meetup Kansai U30 #1 [フロントエンド]

で発表(LT)しました。

人前で話すことは苦手で、すごく緊張しました。

緊張してちゃんと喋れなかったけれど、とても良い経験になりました。

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

***

LTで使用したスライド

https://speakerdeck.com/takashi_takahashi/html5-dot-1nituite

***

参考サイト

https://mae.chab.in/archives/2948
(初心者向け)Swift3.0で初アプリ - 次画面を追加してみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[初心者向け）Swift3.0で簡単なiPhoneアプリを作ってみる](http://qiita.com/egplnt/items/e8da2b9af1037e179a57)で作ったシンプルなSwift3.0アプリに次画面を追加してみます

#1. 次画面を追加します
- Xcodeでアプリを開きます
- ViewController.swiftの編集画面が開いている場合には、ViewController.swift編集画面の左上の「✕」印で閉じます

![スクリーンショット 2017-06-21 10.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/125842/46e47e6a-2273-18b5-eadb-cb14cd873c92.png)

- 画面右下のフィルターに"View"と入力します。ViewContollerが候補として表示されます
- ViewControllerをドラッグし主画面左側へドラッグして新しい画面を追加します

![スクリーンショット 2017-06-21 10.38.06.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a445c8ff-ec9b-d517-8249-272376276851.png)

- 主画面と並ぶように位置を調整します

![スクリーンショット 2017-06-21 10.38.44.png](https://qiita-image-store.s3.amazonaws.com/0/125842/31e15cb9-7be0-2c46-36c5-b7831afd5fc6.png)

#2. ボタンを追加する
- [Swift3.0で初アプリ - ボタンを付けてみる](http://qiita.com/egplnt/items/b3c8804f99766a892701)の手順で主画面にボタンを追加します
- ボタンの名前を「次ページへ」とします

![スクリーンショット 2017-06-21 10.45.48.png](https://qiita-image-store.s3.amazonaws.com/0/125842/ace9a8cd-54be-546a-6777-074dd71a92d7.png)

- 追加したボタンを選択肢ながらドラッグし（青い線が表示されます）、追加した次画面へドロップすると、黒いポッポアップメニューで選択肢が表示されます

![スクリーンショット 2017-06-21 10.47.34.png](https://qiita-image-store.s3.amazonaws.com/0/125842/7e9e674c-24c1-bc05-832e-237700dd7c58.png)

- 選択肢から「Show」を選択すると、主画面と次画面の遷移が定義されます

![スクリーンショット 2017-06-21 10.48.33.png](https://qiita-image-store.s3.amazonaws.com/0/125842/4e336e42-d7af-4caa-59f4-af34377986b6.png)


#3 ナビゲーションを追加します
- 主画面が選択されている状態（主画面の枠線が細い青線）で、Xcodeの画面上部のメニューから「Editor」→「Embed In」→「Navigation Controller」を選択します

![スクリーンショット 2017-06-21 10.49.37.png](https://qiita-image-store.s3.amazonaws.com/0/125842/9234e386-5890-1878-6b57-0ec027c85249.png)

- Navigation Controllerが追加されているのが確認できます

![スクリーンショット 2017-06-21 14.44.55.png](https://qiita-image-store.s3.amazonaws.com/0/125842/374308aa-98a4-8282-7a14-7e8b0cd3571e.png)

#4. シミュレーターで動作を確認します
- シミュレーターで動作を確認します

![スクリーンショット 2017-06-21 14.46.24.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a4cb10c6-64a6-c1ca-9122-c63b20c8002b.png)

- 「次ページへ」ボタンを押すと、次のページへ遷移することを確認します。次ページで画面左上の「Back」ボタンを押すと主画面へ戻ります

![スクリーンショット 2017-06-21 14.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/125842/9b0abc1a-e2ae-6dda-1607-d831b5901b80.png)

#5. 次画面に色を付け、ラベルを配置します
- 真っ白ではつまらないので、次画面に色を付け、ラベルを配置します
- シミュレーターで動作を確認します

![スクリーンショット 2017-06-21 14.51.16.png](https://qiita-image-store.s3.amazonaws.com/0/125842/40308816-7f92-9669-2706-63aaa347483a.png)

#6. iPhoneで確認します
- iPhoneへデプロイし、動作を確認します（画面キャプチャーは省略）

#次のステップ
[アプリのアイコンを登録してみます](http://qiita.com/egplnt/items/22e908a7c1ab6e7b027e)
(初心者向け)Swift3.0で初アプリ - 最初のアプリを作ってみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます

#１. Xcodeでアプリを作ってみます
- Xcodeを起動し、「Create a new Xcode project」を選択します
![スクリーンショット 2017-06-20 10.35.39.png](https://qiita-image-store.s3.amazonaws.com/0/125842/7befc0e4-9164-1af7-bbd2-3611f918cc04.png)
- 「Single View Application」を選び、「Next」を押します
![スクリーンショット 2017-06-20 10.36.13.png](https://qiita-image-store.s3.amazonaws.com/0/125842/898af7a9-65e6-aed7-8457-61a8de861037.png)
- 「Product Name」を適当に指定します
- 「Team」のプルダウンメニューで、Apple Developer Programに登録したIDを選択します（Apple Developer Programに登録していないとこの後のステップでiPhoneにアプリをインストールできません）
- 「Organization Name」は自分の名前などを指定します
- 「Organization Identifier」は自分の社名を逆に読んだ文字列を指定するのが一般的です。たとえば"com.xxx"などになります
- 「Language」は「Swift」を選択します
- 「Device」は「iPhone」を選択します
- 「Next」を押します
- プロジェクトを保管するフォルダーを選択します
- アプリが作成されました。下記のような画面が表示されます
![スクリーンショット 2017-06-20 10.42.35.png](https://qiita-image-store.s3.amazonaws.com/0/125842/3427d713-9bfb-e902-a152-6794369f7d45.png)

#2. 画面を作ってみます
- 画面左側のメニューから「Main.storyboard」を選択します。下記のような画面が表示されます
![スクリーンショット 2017-06-20 10.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/125842/1d3dcfdf-e191-e6e0-10ad-7f946606d141.png)
- 画面右下の入力欄に"label"と入力すると、その上に「Label」が選択肢として表示されます
![スクリーンショット 2017-06-20 10.45.43.png](https://qiita-image-store.s3.amazonaws.com/0/125842/daf6cf5b-ef9a-a4ac-8d23-63abf718209c.png)
- 表示された「Label」を選択し、画面中央のストーリーボードへドラッグ＆ドロップします。ラベルが作成されます
![スクリーンショット 2017-06-20 10.47.21.png](https://qiita-image-store.s3.amazonaws.com/0/125842/4f76229a-3c8c-fca6-c1a2-19a2142bdc7c.png)
- このままではラベルの文字が小さくて見にくいので、画面右上のメニューからフォントのサイズを大きくします。またストーリーボード上のラベル領域が小さいのでドラッグして拡張し、文字列を変更する、中央に揃えるなどします
- 画面の背景部分を選択し、右側のメニューから色のメニューを選択し色を設定します。色のメニューの最下部の「Other」を選択すると、任意の色を設定可能です

![スクリーンショット 2017-06-20 10.53.29.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a164fdb7-a776-e948-5db5-1aa3b47f1de0.png)

#3. シミュレーターで確認します
- Xcode画面左上のビルドターゲットとして"iPhone7"などが選択されていることを確認します

![スクリーンショット 2017-06-21 10.11.36.png](https://qiita-image-store.s3.amazonaws.com/0/125842/e89c11b3-fcce-aafe-1673-995f7c1f28eb.png)

- [Command]+R（もしくは「▶」ボタン）を押してビルドを実行します。"Build Succeeded"のメッセージが表示されビルド（コンパイル）がうまくいったことがわかります。
- Xcodeとは別にシミュレーターのプログラムが起動しているので、画面を切り替えてシミュレーターを表示（前画面）にします。ラベルに設定したとおり「こんにちは」と表示されていることを確認します

![スクリーンショット 2017-06-21 10.18.38.png](https://qiita-image-store.s3.amazonaws.com/0/125842/f1191e57-bcf0-8531-bed7-a41a0383bee6.png)




#4. iPhoneで実行してみます
- iPhoneをMacbookに接続します
- Xcodeの画面左上のビルドターゲットから接続した自分のiPhoneを選択します。表示されるプルダウンの選択肢の一番上のほうにあります
- [Command]+R（もしくは「▶」ボタン）を押してビルドを実行します。"Build Succeeded"のメッセージが表示されビルド（コンパイル）がうまくいったことがわかります。
- iPhoneにアプリがインストールされ、画面が表示されることを確認します。

<img width="375" alt="IMG_3586.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/125842/96252794-5dcb-a7f7-1a89-c75e39f61098.png">

# 次のステップへ
[ボタンを付けてみます](http://qiita.com/egplnt/items/af2b6e86d72494e0a909)
React Native navigationOptionsの内からthis.setStateを行う 

React Native & React Navigationを使用してnavigationOptionsの内でheaderRight,headerLeftのButtonが押された時に、this.setStateをするための方法

ヘッダーの右ボタンが押された時にthis.state.Languageを "Japanese" → "English"に変更する

````
   constructor(props){
        super(props)
        this.state = {
            Language : "Japanese"
        }
        this.func2 = this.func2.bind(this)
        this.props.navigation.setParams({
            func1: this.func2
        })
    }
static navigationOptions = ({navigation}) => ({
        headerRight: <Button
            onPress={()=>
                navigation.state.params.func1()
            }
            title="Change">
        </Button>
    })
func2(){
        this.setState({
            Language:"English"
        })
    }
`````
json-schema メモ

- 基本的には json で記述するため、コメントを書くことができない。
- prmd は json と yaml を透過的に変換し、yaml で記述できるため、コメントが記述できる。
- 2017-08-23 現時点で仕様は draft-6 まで改定が進んでいる
- ライブラリは draft-4 をサポートしていることが多いようだ
- draft-4 のキーワードである "id" をデータのプロパティ名に使えない
  - jsonrpc でいきなり問題が出る
  - そうでなくとも id を整数値で使いたいケースは沢山あるように思えるのだが…
  - draft-4-validation の `patternProperties` を使うと裏技的に "id" プロパティを定義できる
- draft-6 は draft-4 の上位互換ではなく、例えば "id" は "$id" に置き換えられている
- document root での "id" で相対 URL が使えるかどうかは仕様では明記されていない。
  - prmd は標準的に使う一方で、python jsonschema では受け入れられない。
  - http スキーマの名前空間を割り当てたほうが無難。

誤りなどあったら、コメント頂けるとありがたし！
初心者でも超簡単、vartualboxとvagrantのインストール方法


## VirtualBoxとは？
VirtualBox は、使用している PC 上に仮想的な PC を作成し、別の OS をインストール・実行できるフリーの PC 仮想化ソフト

要するに、こういうこと<img width="376" alt="スクリーンショット 2017-08-23 1.11.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/198382/b04ff2a3-0ba4-2a64-2d8a-217f39e77f99.png">

自分のMacPCの中に、仮想のPC環境を作り、
さらにその仮想環境と呼ばれる中に、「Windows」だったり「Linux」といったOSをインストールする事ができる。
つまり、VartualBoxで仮想環境を設定する事で、windowsしか対応していないアプリケーションもmacPCで使用する事ができる様になる。


## Vagrantとは？

じゃあ、vagrantとはなんぞや？　と言うと、その仮想環境を数行のコマンドで簡単に構築してくれるツール


# VirtualBoxのインストール方法


１、[VirtualBoxの公式ページ](https://www.virtualbox.org/)にアクセス
２、左のダウンロードをクリック
３、Mac OSを選択しダウンロード
４、ダウンロードされたファイルを開き、VirtualBoxをダブルクリック　指示に従いインストール
**完了**

# vagrantのインストール方法

１、[vagrantの公式ページ](https://www.vagrantup.com/)にアクセス
２、真ん中の、DOWNLODE1.9.7をクリック
３、Mac　OSを選択しダウンロード
４、ダウンロードされたファイルを開き、vagrantをダブルクリック　指示に従いインストール
**完了**

### ターミナルでインストールの確認

```vagrant -v
```　　Vagrant 1.9.7　と出ればOK


VirtualBoxも同様、

```virtualbox -v
```こちらは、virtualboxが立ち上がればOK


　以上
Scapy入門①（Scapyのインストールから実行まで）

# Scapy入門（Scapyのインストールから実行まで）
## はじめに
こんにちは。あかこうです。
最近はCTF関連のことでScapyを触る必要が出てきたので、これから数回に分けてScapyの使い方等についてまとめたいと思います。
今回は題名の通り、Scapyのインストールから実行までまとめます。
### 環境
* CF-S10
* Antergos
* Python3
* pip3

### Scapyとは？
[What is Scapy](http://www.secdev.org/projects/scapy/)
> Scapy is a powerful interactive packet manipulation program. It is able to forge or decode packets of a wide number of protocols, send them on the wire, capture them, match requests and replies, and much more. It can easily handle most classical tasks like scanning, tracerouting, probing, unit tests, attacks or network discovery (it can replace hping, 85% of nmap, arpspoof, arp-sk, arping, tcpdump, tethereal, p0f, etc.). It also performs very well at a lot of other specific tasks that most other tools can't handle, like sending invalid frames, injecting your own 802.11 frames, combining technics (VLAN hopping+ARP cache poisoning, VOIP decoding on WEP encrypted channel, ...), etc. See interactive tutorial and the quick demo: an interactive session (some examples may be outdated).

適当に上の方だけ訳すと、**Scapy**とはイケてる**インタラクティブ**な**パケット操作プログラム**で、**パケットを作ったり**、**広範囲のプロトコルにデコード**したり、それらの**パケットを実際に投げて** **レスポンスを受け取ったり**できるやつです。
（和訳間違ってたらごめんなさい）

## 実践
### Scapyのインストール
pipを使ってインストールします。
```$ sudo pip3 install scapy-python3```

### Scapyの起動
私の環境だと、パケット送信のときにパーミッションが必要だったので`sudo`をつかって起動します。
```$ sudo scapy```

### Pythonモジュールとしての使用
一行目で以下のコードを実行することで、scapyを直接起動した状態と同じ状態を作ることができます。
ファイルに保存されたスクリプトとして使用する場合は、こちらを使いましょう。

```py3
# Scapyのインポート
from scapy.all import *
```

## 最後に
こんな感じで今回はscapyのインストールと起動についてまとめました。
次回はscapyを利用したパケット送信についてまとめたいと思います。
Android StudioでPluginインストール後起動できなくなったときの対処法

とあるPlugin[^1]をインストールしたらAndroidStudioが起動できなくなったのでその対処法です。
[^1]: [Kotlin/anko: Pleasant Android application development](https://github.com/Kotlin/anko)

## 結論
`/Users/<USER>/Library/Application Support/AndroidStudio<VERSION>/`にあるプラグインのjarもしくはフォルダを削除する。

## 環境
- Android Studio 2.3.3

## エラー内容

Android Studio起動直後（もしくはプロジェクト選択後）に以下のようなエラーダイアログが表示されます。

![](https://qiita-image-store.s3.amazonaws.com/0/123122/3f16f465-2f74-ca9f-864b-0a20cf91c1ce.png)

> Cannot Load Project
> com.intellij.ide.plugins.PluginManager$StartupAbortedException:
> com.intellij.diagnostic.PluginException:
> org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager
> [Plugin: ofg.jetbrains.kotlin.android.dsl]

## 補足
個人アプリをフルKotlin & ankoで書いていて、 Anko Support plugin を使おうと入れてみたら起動しなくなりました。
そこで [Anko Support pluginのドキュメント](https://github.com/Kotlin/anko/wiki/Anko-Layouts#anko-support-plugin) を見てみたらちゃんとAndroid Studio 2.4+しかサポートしてないって書いてありました。
> :warning: The Anko Support plugin is currently supported only in Android Studio 2.4+.

ドキュメントはしっかり読みましょう（戒め）

## 参考
Anko Layouts · Kotlin/anko Wiki
https://github.com/Kotlin/anko/wiki/Anko-Layouts

exception - Android Studio does not start anymore: Fatal error initializing '[...].FrameworkDetectionIndex' - Stack Overflow
https://stackoverflow.com/questions/31512880/android-studio-does-not-start-anymore-fatal-error-initializing-framework