OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10+Visual Studio 2017において、C++/CXでコンソールにはろわする方法

#はじめに
ネット上で入手できるC++/CXの記述はだいたいWin8の環境で使用されるもので、Win10用、つまりはUWP環境用のものがなかった。せっかくVS2017が公開されたのだから、それに対応した形で"あえて"コンソールHello Worldの出し方を記述しておく。

##導入
Microsoftのサイトから「Visual Studio 2017 Community edition」のインストーラをダウンロードする。個人の学習用なら無償でおーけーである。
それを実行するとローカル上でインストーラそのものがインストールされるので、そこからC++に絡むものをだいたい入手する。

**図１：インストール詳細**
![vs2017いんすこ１.png](https://qiita-image-store.s3.amazonaws.com/0/171650/2803060f-0fca-01e5-96ff-b06912c0ed44.png)

上記の枠で囲った部分にチェックを入れると、右枠に「ユニバーサルWindowsプラットフォーム開発」の項目が出るので、ここの中から「C++ ユニバーサル Windows プラットフォームツール」にチェックを入れておく。

とりあえずインストールにはかなりのストレージ容量が必要になるので空き容量を確認しておくこと。


##設定
インストールが完了し無事Visual Studio 2017を立ち上げられたら、新しいプロジェクトからVisual C++内にある空のプロジェクトを選択する。

※プライバシー保護のためプロジェクトが入るフォルダを隠しています。
※記事のために試験的にproject1を作成済みです。
![vs2017新規.png](https://qiita-image-store.s3.amazonaws.com/0/171650/50346fe1-8ba3-c4c6-2e26-4fc51d25259c.png)

ここでは仮に「helloworld-cxx」というプロジェクト名を入れて作ることにする。
そうすると空のプロジェクトをひとつ含んだソリューションが作成されるが、このままプロジェクトのプロパティを選んでもC/C++の項目が出ないので、ソースファイルにcppファイルを追加しておく。
cppファイルを追加したら、プロジェクトのプロパティで以下の設定をしておく。

1. 構成プロパティの全般タブにある**「文字セット」**を**「Unicode文字セットを使用する」**に
2. C/C++の全般タブにある**「Windowsランタイム拡張機能の使用」**を**「はい(/ZW)」**に
3. C/C++のコード生成タブにある**「最小リビルドを有効にする」**を**「いいえ(/gm-)」**に

ここまでの設定はWindows 8でC++/CXを使用する場合と一緒なので画像の説明は省略。
あとはwindows.winmdとplatform.winmdのファイル先のある場所を「C/C++の全般タブにある追加の#usingディレクトリ」に入れればいいのだが、Windows10環境だとファイルの場所が異なる。
仮に64bit環境でVisual StudioをProgram Filesフォルダ以下に入れている場合、

- **windows.winmdは"C:\Program Files (x86)\Windows Kits\10\UnionMetadata"に、**
- **platform.winmdは"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\lib\x86\store\references"に、**

それぞれ存在する。
32bit環境なら(x86)がないはずなのでその以下のフォルダを探ればよいだろう。

あとは「リンカーの詳細設定タブにあるエントリーポイントに**mainCRTStartup**と入力」して設定終了である。

##Hello World!する
とりあえず以下のコードを作成したcppファイルに打ち込んで保存してビルドすればコンソールに表示されるはず。

```C++:Source.cpp
#include <iostream>

int main(Platform::Array<Platform::String^>^ args)
{
	Platform::Details::Console::WriteLine(L"Hello world!");
	system("pause");
	return (0);
}
```

※実行結果
![実行結果コンソール.png](https://qiita-image-store.s3.amazonaws.com/0/171650/f2bf7b96-d391-70c6-700d-7eae5f89ac99.png)

##ポイント
1. C++/CXでは、main関数の引数に"Platform::Array\<Platform::String^>^ args"を指定しないとwarningが出る。これを入力すると今度はエントリーポイントがないと怒られるので、リンカーの設定を埋める必要がある。
2. iostreamのwcoutでもコンソールに投げ込めるが、せっかくなのでPlatform::Datail::Consoleを使ったほうがC++/CXらしい。
3. system("pause")を使っているが、ここも書き換えられるだろうか。
Ruby(Rails)で暗号化してPythonで復号する

# はじめに
Railsでバックエンドタスクを実行するには、[Sidekiq](https://github.com/mperham/sidekiq), [Resque](https://github.com/resque/resque), [Delayed Job](https://github.com/collectiveidea/delayed_job), [Action Job](https://github.com/rails/rails/tree/master/activejob)などが有名です。

私は、RailsアプリケーションをAWSで構築することがほとんどなので、バックエンドタスクはlambdaで処理させることが多いです。

今回は、Rails側で暗号化した文字列をlambda(python)で取得をして、復号する方法について書きます。

#ケース

* Railsアプリケーション側で、文字列を暗号化して、データベースへ格納。
* CloudWatchのスケジューリングイベントでlambdaを定期実行。
* データベースから取り出した文字列を復号してSESでメール送信。

こんな感じです。


![Untitled presentation (1).png](https://qiita-image-store.s3.amazonaws.com/0/49986/93573249-77a9-96cb-ab54-19a1be93b343.png)


環境はrails5.0です。

#Rails
文字列を暗号化するために、[MessageEncryptor](https://github.com/rails/rails/blob/5-0-stable/activesupport/lib/active_support/message_encryptor.rb)という便利なものがActiveSupportにはあります。**今回これは使えません。**（後で説明します)

今回は、自力で暗号化し、複合します。

```ruby:Encryptable.rb

module Encryptable
  SECRET = 'hogehogehogehogehogehogehogehoge'
  IV = 'hogehogehogehoge'
  CIP_NAME = 'aes-256-cbc'

  def encrypt(value)
    b64data = Base64::strict_encode64(value)
    cip = OpenSSL::Cipher.new(CIP_NAME)
    cip.encrypt
    cip.key = SECRET
    cip.iv = IV
    encrypted = cip.update(b64data)
    encrypted << cip.final
    "#{Base64::strict_encode64(encrypted)}"
  end

  def decrypt(value)
    data = Base64::strict_decode64(value)
    cip = OpenSSL::Cipher.new(CIP_NAME)
    cip.decrypt
    cip.key = SECRET
    cip.iv = IV
    decrypted = cip.update(data)
    decrypted << cip.final
    "#{Base64::strict_decode64(decrypted)}".encode('UTF-8','UTF-8')
  end
```

#Lambda側

```py3:Decryptable.py
import base64
from Crypto.Cipher import AES

SECRET = 'hogehogehogehogehogehogehogehoge'
IV = 'hogehogehogehoge'

def decrypt(encrypted_value):
  data = base64.b64decode(encrypted_value)
  cip = AES.new(SECRET, AES.MODE_CBC, IV)
  b64_decrypted_data = cip.decrypt(data)
  decrypted_data = base64.b64decode(b64_decrypted_data)
  return decrypted_data

```

# MessageEncryptorが使えない。
[MessageEncryptor](https://github.com/rails/rails/blob/5-0-stable/activesupport/lib/active_support/message_encryptor.rb)のソースを見るとわかりますが、
シリアライズに[Marshal](https://ruby-doc.org/core-2.3.0/Marshal.html)が使われています。
このために、MessageEncryptorで暗号化した文字列には、型情報などがruby特有のマーシャリング方式で追加されるので、
Python側で復号できません。
Virtualbox上のCentOSにGuest AdditionsをインストールしてWindowsとフォルダーを共有させる

色々と作業しやすいようにCentOSにGuestAdditionsをインストールして、
ファイルを共有させます。
手動で面倒だったら、vagrantとかを使ったほうがいいです。

##環境
- hostOS : Windows 10
- guestOS : CentOS 7
- Virtualbox

#Guest Additionsをインストール

###1.事前に必要なものをインストール

```
yum -y install epel-release
yum -y groupinstall "Development Tools"
yum -y install dkms bzip2 gcc make kernel-devel kernel-headers
```

###2.Guest AdditionsのCDイメージ挿入
VirtualboxでCentOSを起動させて、
`メニューバー -> デバイス -> Guest Additions CD イメージ挿入`をクリック

###3.Guest Additionsをマウント

```
mkdir -p /mnt/cdrom
mount -r /dev/cdrom /mnt/cdrom
```
ちゃんとマウントできていれば、`/mnt/cdrom`にファイルがいくつかあるはずです。

###4.Guest Additionsをインストール

```
sh /mnt/cdrom/VBoxLinuxAdditions.run
reboot　#CentOSの再起動
```

#フォルダーの共有
###1.Virtualboxでの設定
virtualboxの共有フォルダーから共有したいフォルダーの名前とPATHを設定しておきます。

###2.共有フォルダーのマウント
####①Virtualboxでマウント
virtualboxで共有したいフォルダーの名前をダブルクリックして、自動マウントにチェックをいれます。
そうすると、`/media/sf_share_folder_name`にマウントされます。

####②CentOS上でマウント
```
pwd /home/user
mkdir sample
mount -t vboxsf share_folder_name /home/user/sample
```
これでフォルダーの共有は完了なのですが、このままだとログインする度にマウントする必要があります。
それを避けるためにマウントを自動化させましょう。

```
echo 'mount -t vboxsf share_folder_name /home/user/sample' >> /etc/rc.local 
chmod +x /etc/rc.d/rc.local  #実行権限を付加
source /etc/rc.local
```
これで自動化されます。

#参考
- http://qiita.com/hiroseabook/items/dc7a9c9ce9e49f15ed45
- https://wiki.centos.org/HowTos/Virtualization/VirtualBox/CentOSguest
- http://mpweb.mobi/windows/guestadditions-centos.php
- https://www.virtualbox.org/manual/ch04.html#sf_mount_auto
【第７回UE4ぷちコン】簡易的にUE4でTwitter投稿する方法

第７回UE4ぷちコンで簡易的にTwitter投稿できるように実装したので、やり方を記載します。

この画像のTwitterへ送るボタンを押すと、Twitterの投稿画面をブラウザで開くというものです。

![画像.png](https://qiita-image-store.s3.amazonaws.com/0/104377/6002aad6-4565-97e7-f145-451ae5fd540a.png)

![投稿.png](https://qiita-image-store.s3.amazonaws.com/0/104377/feded82b-5b46-1016-c96f-7f41c6d58299.png)

アプリからウェブインテントURLを叩いてブラウザを起動させる、ただそれだけです。

#Twitter投稿

![23995855-a2e7-458d-a6e7-939335af9b6c.png](https://qiita-image-store.s3.amazonaws.com/0/104377/bdb744bb-47f1-471b-d944-6dc0c988a069.png)

画像の通り、LanchURLノードにURL

https://twitter.com/intent/tweet

を渡すだけです。
凄く簡単です。

あとはクエリパラメータのtextに投稿したい文章を入れるだけです。
ついでにハッシュタグのクエリパラメータをつけています。

https://twitter.com/intent/tweet?text=SSKさんお誕生日おめでとう！ハッピーな一年になりますように&hashtags=test

例としてこんな感じです。
他にどんなクエリパラメータがあるのかは、[Twitter 開発者 ドキュメント日本語訳](http://westplain.sakuraweb.com/translate/twitter/Documentation/Twitter-for-Websites/Tweet-Button/Web-Intent.cgi)を見てください。
No such remote 'origin'

remoteの設定を行おうと思ったらエラーが出た

```
git remote set-url origin https://github.com/KTakata/poke_app.git
fatal: No such remote 'origin'
```

原因は一番最初にremote addしていなかったから...(ｫｨ
なので正しくは

```
git remote add origin https://github.com/KTakata/poke_app.git
```

あくまで
remote set-url origin hugahuga
は一度設定しているremoteの向き先を変えるってお話

そんな備忘録
Capybaraで嵌ったエラー集まとめ (随時更新)

## 1. PG::ConnectionBad: PQsocket() can't get socket descriptor

* `find(xxx).click`の後に画面遷移する前にテストコードが実行されてしまっている時に表示されたエラー
* clickの後にsleepを挟めば直る
* have_xxxとか使えば自動で待ってくれるんだろうけどうまく動かず、sleepでやり過ごしている
* 追記 (2017/04/06) findやwithinは指定要素が表示されるまでデフォルトで2秒まで待ってくれるのでsleepを多用しない

```rb
scenario "move to hogehoge page", js: true do
  visit hogehoge_path
  find(".move-button").click
  expect(current_path).to eq fuga_path
end
```

## 2. ActiveRecord::StatementInvalid: PG::UnableToSend
* 1と同様の理由で発生していたが、タイミングによってはこのエラーが出たりするので嵌った

## 3. double free or corruption
* こちらも1と同様の理由で発生していたが、タイミングによってはこのエラーが出たりするので嵌った

## 4. Capybara::ElementNotFound: Unable to find css
こちらは以下の3つのいずれかに該当する時に表示される。特に非表示になっているのが原因の場合は特定に時間がかかり嵌った。

* 対象の要素がない
* 対象の要素が複数存在する
* 要素が表示されていない(visible: false)

## 5. ActiveRecord::StatementInvalid:PG::UnableToSend: extraneous data in "T" message

* 原因不明。稀に発生するが、基本はリトライすれば直る。

以下の記事が参考になりました。
Capybaraでハマらないために気をつけるべき4つのこと - Qiita http://qiita.com/shida/items/5ec16a1e0f07204b2a88

まだあったと思うので、今後追記します。
GethNoKiwamyで爆速でEtheruemプライベートチェーンを構築する。

![geth.png](https://qiita-image-store.s3.amazonaws.com/0/100763/47348551-403e-5532-531a-3bb69dbd5106.png)

ついにやってきました！ 爆速シリーズ③番目　　 

　**「　GethNoKiwamyで爆速でEtheruemプライベートチェーンを構築する。」**

今回は、ついに全世界で10000ノード（内ニューヨークが約2800, 日本が約300)を達成したEthereumノードを爆速で構築できるツールを作りましたので。公開します。

ご意見、苦情はこちらまで　-> @syrohei　

## GethNoKiwamyとは
https://github.com/syrohei/GethNoKiwamy

gethNoKiwamyとは　分散型のアプリケーションインフラであるEthereumのGoEthereum(Geth)をパブリックチェーンとプライベートチェーン両方を同時に立ち上げることができるdocker-composeテンプレートです。

今回はさらに　Dockerのインストールを自動化したスクリプトも用意しました。

使い方は非常に簡単。

### インストール  　Ubuntu16.04LTS & 14.04LTS

```
$ git clone https://github.com/syrohei/GethNoKiwamy && cd GethNoKiwamy
```
```
$ ./setup_docker.bash && cd ETH && sudo docker-compose up -d
```

### 停止
```
$ sudo docker-compose stop
```
### 削除
```
$ sudo docker-compose rm
```


今後**PrivateEthereum**と **PublicEtheruem**はファンジナビリティを保ちならがいくつかのハードフォークを経て高速化され、オフチェーン取引により**PrivateChain**と**PublicChain**の間で高速に送金が可能になるでしょう. 



Good Job Community and Trustless networks!!🍺
Go 言語における無効日付(2月31日など)の扱い

「[各言語における無効日付(2月31日など)の扱い](http://qiita.com/miyazato_te/items/23a86a2b6bc737e82d4d)」のコードを真似て [Go 言語]で検証してみる。

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	tm := time.Date(2017, 1, 31, 0, 0, 0, 0, time.UTC)
	for i := 0; i < 6; i++ {
		fmt.Println(tm.Format("2006-01-02"))
		tm = tm.AddDate(0, 1, 0)
	}
}
```

結果は以下の通り。

```
2017-01-31
2017-03-03
2017-04-03
2017-05-03
2017-06-03
2017-07-03
```

JavaScript と同じですね。
ただし `AddDate()` メソッドは `tm` の値を破壊しないので

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	tm := time.Date(2017, 1, 31, 0, 0, 0, 0, time.UTC)
	for i := 0; i < 6; i++ {
		fmt.Println(tm.AddDate(0, i, 0).Format("2006-01-02"))
	}
}
```

と書けば

```
2017-01-31
2017-03-03
2017-03-31
2017-05-01
2017-05-31
2017-07-01
```

と出力される。
これは PHP と同じかな。

なお末日に限るなら， [Go 言語]では「翌月0日」が「当月末日」と評価されるため

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	tm := time.Date(2017, 1, 31, 0, 0, 0, 0, time.UTC)
	for i := 0; i < 6; i++ {
		fmt.Println(tm.Format("2006-01-02"))
		tm = time.Date(tm.Year(), tm.Month()+2, 0, 0, 0, 0, 0, time.UTC)
	}
}
```

とすれば

```
2017-01-31
2017-02-28
2017-03-31
2017-04-30
2017-05-31
2017-06-30
```

と綺麗に末日を出力できる。ちなみに年をずらして

```go
tm := time.Date(2016, 1, 31, 0, 0, 0, 0, time.UTC)
```

と閏年でやってみても結果は

```
2016-01-31
2016-02-29
2016-03-31
2016-04-30
2016-05-31
2016-06-30
```

と正しく出力される。


## 参考

- [「プレミアムフライデー」を求める関数を作ってみた](http://qiita.com/spiegel-im-spiegel/items/6eb5702cad251e01db4d)

[Go 言語]: https://golang.org/ "The Go Programming Language"
Azure documentDBのdocumentをpydocumentdbで抽出してみる

Microsoft Azure上の`documentDB`上のデータを手元(local PC)に持ってきて、ドキュメントを配列`list`に格納するとこまでのメモ

# 試行前提
- PC OS: `Windows 10`
- Python: `Python 2.7`
- Python library: `pydocumentdb`
- Azure上のdocumentDB設定
    - server: `abc_server.documents.azure.com`
    - database: `abc_database`
    - collection: `abc_collection`
    - api-key: `abc_api`
        - それぞれの`abc...`は、適宜Azure上で設定するときに書き換えてください

## Collection?
- 概念は例えばこちらから：
    - https://docs.microsoft.com/ja-jp/azure/documentdb/documentdb-introduction

# 何はともあれinstall & 初期設定
```py
pip install pydocumentdb
```

# ではPythonで書いていきましょう。

```py
# -*- coding: utf-8 -*-

## library setting
import pydocumentdb.document_client as document_client

## 各種設定
HOST = 'abc_server.documents.azure.com:443/'
DATABASE_ID = 'abc_database'
COLLECTION_ID = 'abc_collection'
MASTER_KEY = 'abc_api'

# documentDb client instance作成
client = document_client.DocumentClient(HOST,  {'masterKey': MASTER_KEY})

# database/collection定義
database_definition = {'id': DATABASE_ID }
collection_definition = { 'id': COLLECTION_ID }

## DB接続を定義
databases = list(client.QueryDatabases({
        'query': 'SELECT * FROM root r WHERE r.id=@id',
        'parameters': [
            { 'name':'@id', 'value': database_definition['id'] }
        ]
    }))

db = databases[0]

## Collectionを定義
collections = list(client.QueryCollections(
    db['_self'],
    {
        'query': 'SELECT * FROM root',
        'parameters': [
            { 'name':'@id', 'value': collection_definition['id'] }
        ]
    }))

collection = collections[0]

## Documentsを格納
### Documentsを入れとく箱
list = []
### 1つずつ入れていきましょー
for doc in client.ReadDocuments(collection['_self']):
    list.append(doc)
```

# 格納した結果
- 各documentは`json`形式で入ってくるので、別途parseが必要ですー

# 備考
- 今回は全量をもってくる感じでしたが、部分的に抜きたい場合`query`を変更する必要がありますが、それはまた別途。
- 取り敢えず抽出するよー、という用途の場合にご利用ください。
Substance ShareからUE4へMaterialを取り込む

# Substance ShareからUE4へMaterialを取り込む

## Substance ShareからMaterialをダウンロードする

**Substance Share**
https://share.allegorithmic.com/

Substance ShareaはAllegorithmic.comアカウントを持つ全員が利用可能
Substance ShareはSubstanceツールのコミュニティサイトで、マテリアル、ブラシ、HDRIなど、ダウンロードすることができる
自分が作成したSubstanceのアセットをアップすることもできる

Substanceコミュニティーサイト「Substance Share」オープン
https://www.borndigital.co.jp/software/news/4131.html

![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0000.png)

|拡張子|拡張子の種類 |概要 |
|---|---|---|
|.sbs|Substance Designerファイル |Substance Designerの元データ |
|.sbsar|substanceファイル | Unrealにインポート出来るファイル |

Materialによっては.sbsarのみアップロードしているMaterialがある
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0001.png)

## Unrealへの取り込み

### Substance PluginのEnable
Substance Pluginが有効になっていないとsbsarファイルを取り込むことができない
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0002.png)

### .sbsarをUnreal Projectにインポート
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0003.png)

CubeなどStaticMeshを追加して、インポートしたSubstanceのMaterilaを設定する
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0004.png)

### インスタンスによるパラメーター調整
Instanceファイルをダブルクリックすると、パラメーターを変更することが出来るウィンドウが立ち上がる
各パラメーターを変更することでマテリアルを変更することができる
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0005.png)

## Substance DesignerからSubstanceファイル(.sbsar)を出力する

SubstanceDesignerファイル(.sbs)がある場合は、ダウンロードしたファイルをベースに変更して、Substanceファイル(.sbsar)を出力することができる

.sbsファイルをSubstance Designerで開く
.sbsファイルを選択し、S↑ボタンをクリック
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0006.png)

名前を設定して保存する
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0007.png)

OKをクリック
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0008.png)

### 出力時のエラー対応
ファイルを開いたときに、バージョンが違った
現在のバージョンではエラーになってしまった
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0009.png)

Use_Image_Damageを使っているノードを検索して見つける
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0010.png)

![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0011.png)

Use_Image_Damage がTrueならFloat:1.0, FalseならFlaot:0をOutputとして返すように修正する
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0012.png)

Use_Image_Damageのエラーが消えた
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0013.png)

outputsizeのFunctionを削除
このFunctionが原因でエラーになっている
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0014.png)

Get Integer 2ノードを追加し、$outputsizeを設定する
OutputしているノードのIn,Lastに接続する
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0015.png)

outputsizeのエラーが一つ消えたので、残り二つを探して修正する
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0016.png)

エラーが無くなれば.sbsarが出力される
Unrealに取り込んだところ、Downloadした.sbsarと同じ結果が表示された
![image](http://comiclo.jp/qiita/images/Cnv_20170331_060229_0017.png)

Substanceもアップデートの期間が早いので、昔のファイルを現在のバージョンで使用すると、エラーを取り除かないと使えないことがあるみたいだ。
中身を見るだけでも勉強になるので、色々とダウンロードすると楽しい。
木構造の疎な属性の扱い(Python)

# はじめに[^1]

[^1]: 自分が忘れたときのメモ

あるデータ片(例:係)が、木構造(部課係)をなし、いろいろな属性(例:部長、課長、係長)を持っています。
属性をグループ(例:部や課)で設定して使う方法を説明します。

## 概要
木構造の **構成** と、属性(**名前**)の2種類の情報を定義して、使います。

### 元データ(TOML)
```py3;python3
import re, toml
toml._groupname_re = re.compile('^[A-Za-z0-9ぁ-んァ-ー一-龥_*-]+$')

tml = toml.loads("""\
[構成.A部]
L課="X係,Y係"
M課="Z係"
[構成.B部]
N課="W係"

[名前.A部]
部長="A氏"
[名前.A部.L課]
課長="L氏"
[名前.A部.L課.X係]
係長="X氏"
[名前.A部.L課.Y係]
係長="Y氏"
[名前.A部.M課]
課長="M氏"
[名前.A部.M課.Z係]
係長="Z氏"
[名前.B部]
部長="B氏"
[名前.B部.N課]
課長="N氏"
[名前.B部.N課.W係]
係長="W氏"
""")

tml['構成']
>>>
{'A部': {'L課': 'X係,Y係',
         'M課': 'Z係'},
 'B部': {'N課': 'W係'}}

tml['名前']
>>>
{'A部': {'L課': {'X係': {'係長': 'X氏'},
                 'Y係': {'係長': 'Y氏'},
               '課長': 'L氏'},
         'M課': {'Z係': {'係長': 'Z氏'},
               '課長': 'M氏'},
       '部長': 'A氏'},
 'B部': {'N課': {'W係': {'係長': 'W氏'},
               '課長': 'N氏'},
       '部長': 'B氏'}}
```

## 構成データ作成
ortoolpy.MultiKeyDict を使って構成データを作成します。
forでループすると、全データ(全係)にアクセスできます。
なお、MultiKeyDict は、キャッシュされるため、更新できません。
(設定情報のように最初に読込んで、変更しないことを想定)

```py3;python3
from ortoolpy import MultiKeyDict
iskey = lambda x: x[-1] in '部課係' # '部課係'で終わるキーから新たな MultiKeyDict とする
conv = lambda x: ((s,None) for s in x.split(','))
構成 = MultiKeyDict(tml['構成'], iskey=iskey, conv=conv, extend=True)
for ky in 構成:
    print(ky)
>>>
('A部', 'L課', 'X係')
('A部', 'L課', 'Y係')
('A部', 'M課', 'Z係')
('B部', 'N課', 'W係')
```

## 属性データ確認
属性データ(名前)をMultiKeyDict で作成し、構成データをキーにしてアクセスします。

```py3;python3
名前 = MultiKeyDict(tml['名前'], iskey=iskey)
for ky in 構成:
    print(' '.join(ky))
    for ky2, name in 名前[ky].items():
        print(f' %s: %s'%(ky2[-1],name))
>>>
A部 L課 X係
 部長: A氏
 課長: L氏
 係長: X氏
A部 L課 Y係
 部長: A氏
 課長: L氏
 係長: Y氏
A部 M課 Z係
 部長: A氏
 課長: M氏
 係長: Z氏
B部 N課 W係
 部長: B氏
 課長: N氏
 係長: W氏
```

### 別の方法

```py3;python3
for ky in 構成:
    print(' '.join(ky))
    dc = 名前.get_list(ky, True)
    print(f' 部長: %s'%dc['部長'][0])
    print(f' 課長: %s'%dc['課長'][0])
    print(f' 係長: %s'%dc['係長'][0])
>>>
A部 L課 X係
 部長: A氏
 課長: L氏
 係長: X氏
A部 L課 Y係
 部長: A氏
 課長: L氏
 係長: Y氏
A部 M課 Z係
 部長: A氏
 課長: M氏
 係長: Z氏
B部 N課 W係
 部長: B氏
 課長: N氏
 係長: W氏
```

下記のように、[名前.A部]で定義した部長が、[名前.A部.L課.X係]や[名前.A部.L課.Y係]でも「部長="A氏"」と参照できました。

> [名前.A部]
部長="A氏"

このように、木構造のどこで属性を定義したか気にせずに、末端のデータ(係)で属性を取得できます。

以上
[gitlab] api/v4 で idの代わりにiidがクエリに用いられるようになる

https://gitlab.com/gitlab-org/gitlab-ce/issues/28251

地味に色々な所に手を加えないといけないので面倒くさい。便利だけど。

gitlab.comのドキュメントではすでにiidを使う方になっているけど、api/v3を使っている場合はidが必要なので要注意。
create-react-native-appとexpoを使って10分でプッシュ通知を試す

### Requirements

1. node.jsがインストールされていること。
2. android/iPhoneどちらか持っていること。
3. curlがインストールされていること。

### create-react-native-appのインストール

```
npm install -g create-react-native-app
```

### expoを手持ちのスマホにインストール
インストールは[こちら](https://expo.io/)から

### プロジェクトの作成
```
create-react-native-app my-stupid-project
```

### とりあえず起動してみる

```
cd my-stupid-project && npm start
```
起動するとデカイQRコードが表示されるので、先ほどスマホにインストールしたexpoアプリで読み込む。すると以下のような画面が表示されると成功。
<img width="320" alt="IMG_0033.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/147192/9e8820a9-9173-f2b3-05a9-63608bfcb228.png">



### プッシュ通知を実装する
App.jsを開いて以下のように修正する。

```js
import React, { Component } from 'react'
import { StyleSheet, Text, View } from 'react-native'
import Expo, { Permissions, Notifications } from 'expo'

async function registerPushNotificationService() {
  const { status } = await Permissions.askAsync(Permissions.REMOTE_NOTIFICATIONS)
  if (status !== 'granted') {
    return
  }
  const token = await Notifications.getExponentPushTokenAsync()
  console.log('!!!!! my token is:', token)
}

export default class App extends Component {
  state = { notifications: null }
  componentWillMount() {
    registerPushNotificationService()
    this.listeners = Notifications.addListener(this.onPushNotification)
  }
  onPushNotification = (notifications) => { this.setState({notifications})}
  render() {
    return (
      <View style={styles.container}>
        <Text>Hello world!</Text>
        { this.state.notifications
          && <Text>{JSON.stringify(this.state.notifications)}</Text>
        }
      </View>
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
})

Expo.registerRootComponent(App)
```

### Curlを使ってメッセージを送りつける
上記のコードを保存すると自動的にスマホ側にロードされ、expoのtokenが以下のようにコンソールに表示される。
```
5:00:55 PM: !!!!! my token is: ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]
```

expoにpush notificationのendpointがあるので、先ほどのトークンと共にメッセージを投げる
```
curl -iv -H 'accept: application/json' -H 'accept-encoding: gzip, deflate' -H 'content-type: application/json' -d '[{"to":"ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]", "body":"wut up", "badge": 1, "data":{"a":"b"}}]' https://exp.host/--/api/v2/push/send
```
すると結果が以下のように帰ってくれば成功。
```
{"data":[{"status":"ok"}]}
```
ちなみにスマホ側はこんな感じになる。
<img width="320" alt="IMG_0034.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/147192/b0167f68-113c-e1a3-37a3-d4dba691665e.png">
<img width="320" alt="IMG_0035.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/147192/9170bdb2-6008-ad12-852b-6cd3eae9dffe.png">

### 結論
expoめっちゃ便利！QRコードをシェアするだけで、他人に試してもらうことができる。iOSでは、ネイティブコードを簡単に配布することはできないが、expoのようにJSコードであれば、"今のところ"、ダイナミックにロードすることは禁止されていないため、このような方法で他人から容易にフィードバックがもらうことが可能になった。また、low levelの操作は、react-native/expoがあるので、ある程度はカバーできるが、それ以外の操作を行う場合は自分で作成する必要があり、自作したネイティブコードは、もちろんダイナミックにロードすることができないので注意が必要。個人的には、割とハードウェアへのアクセス要求がない、iOSとAndroidのチームを作るほどお金がないようなプロジェクトには使えるんじゃないでしょうか。ちなみに、私はモバイル門外漢ですけど（笑）では、長くなってしまったので、皆様よい週末をお過ごしください！
各言語における無効日付(2月31日など)の扱い

2月31日などの無効な日付を各言語でどう扱うかをまとめてみた。
#PHP

```PHP
<?php
$target_date = "2017-01-31";

for ($i=0; $i < 6; $i++) {
    echo date('Y-m-d', strtotime($target_date . '+' . $i . ' month')) . "\n";
}
?>

2017-01-31
2017-03-03
2017-03-31
2017-05-01
2017-05-31
2017-07-01
```

PHPのstrtotime()では2017-01-31の1ヶ月後は「2017-02-31」となり、
「2017-02-31」は「2017-03-03」として解釈される。

#JavaScript

```js
var date = new Date(2017 ,1 - 1, 31);

for (var i=0; i < 6; i++) {
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var day = date.getDate();
    console.log(year + '-' + month + '-' + day);
    
    // 月を1ずつ増加させます
    date.setMonth(date.getMonth() + 1);
}

2017-1-31
2017-3-3
2017-4-3
2017-5-3
2017-6-3
2017-7-3
```

JavaScriptのDateクラスの場合もPHPと同様、2017-01-31の1ヶ月後は「2017-02-31」となり、
「2017-02-31」は「2017-03-03」として解釈される。
setMonth()は破壊的メソッドのため、2017-3-3以降はずっと3日のままとなる。

#Java

```Java
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class Main {
    public static void main(String[] args) throws Exception {
        Calendar calendar = Calendar.getInstance();
        calendar.set(2017, 1 - 1, 31);
        
        // 表示用フォーマットを設定します
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
    
        // 月を1ずつ増加させます
        for (int i = 0 ; i < 6 ; i++){
          System.out.println(sdf1.format(calendar.getTime()));
          calendar.add(Calendar.MONTH, 1);
        }
    }
}

2017-01-31
2017-02-28
2017-03-28
2017-04-28
2017-05-28
2017-06-28
```

JavaのCalendarクラスの場合、増加後の月が28日までしか無い場合などは日も28に変更されます。
その後に31日まである月になったとしても日は28日のままです。

#Ruby

```rb
require "date"

date = Date.new(2017, 1 ,31)
for i in 0..5
    puts((date >> i).strftime("%Y-%m-%d"))
end

2017-01-31
2017-02-28
2017-03-31
2017-04-30
2017-05-31
2017-06-30
```

RubyのDateクラスは末日をきれいに出力してくれます。
時間をミリ秒で取得する

# 時間をミリ秒で取得する

CTimeはミリ秒までわからないらしいので、SYSTEMTIMEを使う

```
			SYSTEMTIME sys;
			GetSystemTime(&sys);
			TRACE(_T("%d:%d:%d.%d\n"), sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);

```
Azure FunctionsでTrello.NETを使う方法

Trelloのとあるリストに入ったもののラベルの色を特定の色にするバッチプログラムをAzure Functionで(しかもC#で)書こうとしたのですが、ライブラリが古くて結構つらかったので書きます。
Trelloのラベルの色を変えるFunctionは[github](https://github.com/tkykm/trello-label-black)に公開しています。

## 結論をいうと
以下のようにproject.jsonに"MyTrelloNet": "1.0.8"と書くことで解決させました。

```project.json
{
  "frameworks": {
    "net46":{
      "dependencies": {
      "MyTrelloNet": "1.0.8"
      }
    }
  }
}
```

もしかしたら、Azure Functionにpublishした後に、手動でnuget restoreしないといけないかもしれません。

# [Trello.NET](https://github.com/dillenmeister/Trello.NET)
Trelloのクライアントとして[Trello.NET](https://github.com/dillenmeister/Trello.NET)というものがあります。
これがだいぶメンテされていなくて、結構エラーが出ていたのが今回の話です。
すぐ使いたかったしプルリクはテストに失敗するみたいなので修正して自分が使う用にMyTrelloNetとしてnugetにあげました。[MyTrelloNet](https://www.nuget.org/packages/MyTrelloNet/)という名前で使えます。namespaceはTrelloNetのままです。
以下修正したところの紹介です。

## ターゲットフレームワークを変えた
Azure Functionが.net46なので合わせて.net46でビルドしました。
RestSharpのrestclientのAuthenticatorが下のようになっていて後方互換性がなかったので再ビルドも必要でした。

```csharp:RestClient.cs
public IAuthenticator Authenticator { get; set; }
```

合わせてNewtonsoft.Jsonを10.0.1、RestSharpを105.2.3を使うようにしました。

## 参照エラー
using RestSharp.Authenticators;
をMemberTokenAuthenticator.csに追記

```csharp:TrelloNet\Internal\MemberTokenAuthenticator.cs
using RestSharp;
using RestSharp.Authenticators;
```

## 色追加
これはプルリクにもあるやつをコピペ

```csharp:TrelloNet\Cards\Color.cs
namespace TrelloNet
{
	public enum Color
	{
		Green,
		Yellow,
		Orange,
		Red,
		Purple,
		Blue,
        Sky,
        Lime,
        Pink,
        Black
    }
}
```
## エスケープ処理追加
私は[Elegantt](https://elegantt.com/)というガントチャートツールを使っているのですが、どうもこれがあるとカードのdescに変な値が入るみたいでJsonパースエラーが起きていました。
RestShartにExecute\<T\>(request)みたいなリクエストしてレスポンスをデシリアライズしてくれるメソッドがあるのですが、この中にエスケープ処理が入っていないので普通のExecuteでJson取得して、手動でデシリアライズします。
その時にJsonをエスケープのためにリテラル文字列に変えます。

```csharp:TrelloNet\Internal\TrelloRestClient.cs
		public T Request<T>(IRestRequest request) where T : class, new()
		{
			var response = Execute(request);
        
			ThrowIfRequestWasUnsuccessful(request, response);

            return response.StatusCode == HttpStatusCode.NotFound ? null : JsonConvert.DeserializeObject<T>(@response.Content);
		}
```
ネットワーク負荷をかける時のメモ

ネットワーク負荷をかける時のメモ

- OS：CentOS

```
yum update -y
yum install epel-release
yum install nuttcp
nuttcp -S
nuttcp -i10 -T300 172.32.11.130
```

- iは集計結果表示間隔
- Tは負荷をかける時間
- ```nuttcp -S```これは、負荷受けるサーバで実施
Jupyter notebookでOctaveを使えるようにする

以前にanacondaを入れたので、OctaveをJupyter notebookで使えるようにします
([anacondaのインストール](http://qiita.com/wslife/items/219b2558e1066eaaed07))

##環境
- hostOS: windows10
- guestOS: CentOS7
- Anaconda 4.3.1
- jupyter 4.2.1

#octave kernelのインストール
```:command-line
$ conda install -c conda-forge octave_kernel
```
今回は`conda`を使ってインストールしましたが、`pip`でもできます。

#Jupyter notebookで実行
####`plot`使うと警告でる
`warning: print.m: ghostscript not found in PATH
warning: print.m: Ghostscript binary is not available`

とりあえずghostscriptをインストール

```:command-line
$ sudo yum install ghostscript.x86_64
```
これで`plot`してみると・・・

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/173064/0c1bb384-200e-d113-aae9-579c168f28cb.png)



`plot`できました！！

#参考
- https://anaconda.org/conda-forge/octave_kernel
- https://pypi.python.org/pypi/octave_kernel
- https://github.com/conda-forge/octave_kernel-feedstock
capistranoで特定のサーバにだけ実行する

# 環境
```zsh
$ bundle exec cap -v
Capistrano Version: 3.8.0 (Rake Version: 12.0.0)
```

たとえば、こんな設定の場合。

```ruby:config/deploy/production.rb
role :app, %w{www@app1.foo.bar www@app2.foo.bar}
role :web, %w{www@app1.foo.bar www@app2.foo.bar}
role :db,  %w{www@app1.foo.bar}

set :stage, :production
set :rails_env, :production
...
```

普段は以下のようにデプロイしてるけど、

```zsh
$ bundle exec cap production deploy
```

ときどき特定のサーバだけに実行したい場合がある。
（1台だけunicorn再起動したい！とか）

# 解決
Capistranoの[ドキュメント](http://capistranorb.com/documentation/advanced-features/host-filtering/)によると、ちゃんと方法がありました。

環境変数汚したくないので`--hosts`オプションを使う方法を採用。

```zsh
# app1.foo.barだけunicorn再起動したい場合
$ bundle exec cap --hosts=app1.foo.bar production unicorn:restart
```

もちろん複数台指定も可能。

```zsh
$ bundle exec cap --hosts=app1.foo.bar,app2.foo.bar production unicorn:restart
```

以上。

# 参考
* [Host filtering](http://capistranorb.com/documentation/advanced-features/host-filtering/)
* [deployment - How to deploy to a single specific server using Capistrano - Stack Overflow](http://stackoverflow.com/questions/429816/how-to-deploy-to-a-single-specific-server-using-capistrano)
Androidでデバイスがどのハードウェア機能を持っているか確認する


こんにちはsekitakaです。  
Androidでデバイスがどのハードウェア機能(`uses-feature`)を持っているかをJavaのコードで確認する方法を紹介します。

# 調べるコード
このコードをAndroidアプリのActivity内の任意の場所に記述すれば調査することができます。

```Java
PackageManager pm = getPackageManager();
FeatureInfo[] featureInfos = pm.getSystemAvailableFeatures();
for(FeatureInfo featureInfo : featureInfos){
    Log.d(TAG,"Available Feature: " + featureInfo.name);
}
```


今回はAndroid TVが`android.hardware.screen.PORTRAIT`を持っているのか調べたかったのですが、結果は以下のようになりました。
`android.hardware.screen.PORTRAIT` はありませんでした。TVは横置きの端末だからでしょうか。

```
Available Feature: android.software.leanback_only
Available Feature: android.hardware.usb.accessory
Available Feature: android.software.backup
Available Feature: android.hardware.ethernet
Available Feature: android.software.voice_recognizers
Available Feature: android.software.picture_in_picture
Available Feature: android.hardware.type.television
Available Feature: com.google.android.feature.GOOGLE_BUILD
Available Feature: android.hardware.audio.output
Available Feature: android.software.live_tv
Available Feature: android.software.leanback
Available Feature: com.google.android.tv.installed
Available Feature: android.hardware.screen.landscape
Available Feature: android.software.webview
Available Feature: android.hardware.location.network
Available Feature: com.google.android.feature.GOOGLE_EXPERIENCE
Available Feature: com.google.android.feature.EXCHANGE_6_2
Available Feature: android.hardware.location
Available Feature: null
```


# 経緯
今回あるアプリのバージョンアップをしようとapkをアップロードしたところ、「サポートされている端末」の数が少し減少しました。  
Activityを縦画面固定で使用するために`android:screenOrientation="portrait"`を追加したために、AndroidManifest.xmlが`<uses-feature android:name="android.hardware.screen.PORTRAIT" android:required="true"/>`と解釈されたのが原因でした。

そこで `<uses-feature android:name="android.hardware.screen.PORTRAIT" android:required="false"/>` にしようと思いましたが、`android.hardware.screen.PORTRAIT` を持たない端末で起動したらどうなるのか確認したくなりました。

端末とハードウェア機能の一覧があればよかったのですが、ぐぐっても見当たらなかったので、`android.hardware.screen.PORTRAIT`を持たなそうなAndroid TVで動作確認しようと思いましたが、果たして本当に`android.hardware.screen.PORTRAIT`を持っていないのか確認したくなり調査を行った次第です。

ちなみにアプリ自体はクラッシュすること無く、Android TV上でPORTRAITモードで開きました。顔を傾ければなんとか使えるということです。
VisualStudioからOracleストアドプロシージャをシームレスにデバッグする


# なぜやるのか
Oracleのストアドプロシージャなどでビジネスロジック記述し、画面側などは.netで記述されているプロジェクト構成は多くあると思います。
ただここで問題なのは.netプロジェクトからODP.NETなどを利用して、Oracleストアドプロシージャを呼び出すときにデバッグするには、以下の手順でやる必要があり、非常に《面倒くさい》という点でした。

1.VisualStudioのデバッグでストアドプロシージャに渡すパラメータを探る
2.SQLDeveloperなどのツールを利用してデバッグする

いちいちツールを切り替えずにVisualStudioでシームレスにデバッグしたい！というのが発端です。

# 環境
Windows7 Professional ServicePack1

VisualStudio 2013
Version 12.0.21005.1 REL
試していないがおそらくVisualStudio 2015でも可能

OracleDeveloperTool for VisualStudio 
Version 12.1.2500
Oracle12c用との事だがOracle11gで試したところ動作するのが確認できた。

# 前提
・Oracle Database Server 11g すでにどこかの端末にインストールされていること
・Oracleクライアントが開発端末にインストールされていること

# 手順

#### 1.VisualStudio 2013をインストール
インストーラーを起動し、指示通りにインストール

#### 2.OracleDeveloperTool for VisualStudioをインストールする
インストーラーを起動し、指示通りにインストール

#### 3.データ接続を追加
・VisualStudioサーバエクスプローラからデータ接続を選択する。
・右クリックメニューから接続の追加を選択する。
・ユーザー名・パスワードを設定する。
・接続タイプ「TNS」か「EZ接続」かを選べる(筆者はEZ接続を選択した)。
・情報を入力後、テスト接続ボタンを押下して接続できるか確認する。
・OKボタンを押下すると設定が保存され、Oracleの表やプロシージャが参照できるようになる。

#### 4.OracleDeveloperToolの設定をする
・VisualStudioのメニュー>ツール>Oracleアプリケーションのデバッグを選択する(チェックマークが付く)
・VisualStudioのメニュー>ツール>オプションを選択する
・Oracle Developerツール>PL/SQLのデバッグを選択
・IPアドレスにOracleサーバのIPアドレスを指定する。
・データベース接続でデバッグしたいプロシージャが含まれる接続情報にチェックを入れる。


#### 5.プロシージャをデバッグ用にコンパイルする
・VisualStudioサーバエクスプローラからデバッグしたいプロシージャを選択する。
・右クリックメニューから「デバッグのコンパイル」を選択する。

#### 6.VisualStudioからデバッグ実行する
・プロシージャ上にブレークポイントを張る。
・VisualStudioでF5を押してデバッグ実行する。


# 参考
http://www.oracle.com/technetwork/jp/topics/oracle-dotnet-tutorial-350896-ja.pdf
GIt

### コミット、プッシュ
　・作業中[API]

## clone
1.データ落とすフォルダを作成
2.ターミナルで
　[cd .. (フォルダ作成したのをドラック&ドロップ)] 　　//フォルダまでのパス
3.[git clone (GitHubのリポジトリをコピペ)　　　　 　  //リポジトリ完了
4.[cd ..]　　　　　　　　　　　　　　　　      //作ったフォルダまで入る
5.[npm i]　　　　　　　　　　　　　　　   //インストール

## fork
git remote add kaie [URL]

## リモート参照
git remote -v 

## クリア
php artisan view:clear

## fork
git remote add [kaie] [gitからコピペしてきたurl]

※この時、masterのURLになってないか確認
自分のURLをフォークしてmasterにするから自分のGit URlからフォークのURLをコピー


## 何かremotoで存在するのを削除するとき
git remote rm [登録した名前]



四国案件
git push kaie master
Intellij のダブルクォート補完を直したかった

探すの意外と大変だったのでメモ

## 設定場所

Editor > Code Style > HTML > Other

## 変更箇所

![Screen Shot 2017-03-31 at 15.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/7196/c5eb59a8-02fe-c1cc-f09f-73a25658e6ab.png)

規約によっては引用符を統一する必要があるので地味に重要な設定ですね
pythonで標準体重を計算して表示する

pythonを何らかの方法でインストールする。

身長をキーボードから入力する。
>
height = float(input("身長(cm)を入力してください: "))
bmi = 22
std_weight = bmi * (height / 100) ** 2
print("身長: " + str(height) + "cm → ", end="")
print("標準体重: " + str(std_weight) + "kg")

実行結果
>身長(cm)を入力してください: 172
 身長: 172.0cm → 標準体重: 65.1kg

たぶん。
《Mixin》フラットスタイルのロングシャドウをSassだけで表現する。

フラットデザインでよくみるテキストのロングシャドウを表現する`@mixin`をつくりました。

## デモ

[long shadow text](https://jsfiddle.net/yutousui/n3je19bx/)

## コード

```html

<div class="shadow">
  <h1 class="shadow_inner" href="">flat style shadow</h1>
</div>

```


```scss

$flat-color: #FBA848;

@function setLongShadow($color, $length) {
  $value: 0 0 $color;
  @for $i from 1 through $length {
    $value_i:  $i + 'px' + ' ' +  $i + 'px' + ' ' + $color;
    $value: #{$value}, #{$value_i};
  }
  @return $value;
}
 
@mixin longShadow($color, $length) {
    text-shadow: setLongShadow($color, $length);
}

.shadow {
  background-color: $flat-color;
  overflow: hidden;
}

.shadow_inner {
  padding: 4vw;
  @include longShadow(darken($flat-color, 12%), 300);
  color: #fff;
  font-family: 'Montserrat', sans-serif;
  font-size: 4vw;
  font-weight: 600;
  letter-spacing: .1em;
  white-space: nowrap;
  text-transform: uppercase;
  display: block;
}

```

引数にはシャドウのカラーとシャドウの長さを指定します。

```scss

@include longShadow(darken($flat-color, 12%), 300);
// longShadow(シャドウのカラー, シャドウの長さ);

```


おわります。
AWS Certificate Manager に コマンドで 証明書をインポートする

AWS Certificate Manager(ACM) に、COMODOなどで発行した証明書をコマンドラインでインポートする手順を紹介します。



ELBや AWS API Gatewayなどに独自ドメインを設定してhttpsでアクセスするようにしている場合、SSL証明書の設定が必要になります。
ELBは証明書の更新が楽でダウンタイムもないのですが、API Gatewayの場合手順によってはダウンタイムが発生します。
API Gatewayでは、直接証明書を設定することもできるのですが、この場合は証明書の更新のために **独自ドメイン設定を一度削除して、設定し直す** 必要があるようです。
当然、削除してから再設定までの間は、ドメインが利用できずダウンタイムが発生してしまいますが、ACMを使えば無停止での証明書の更新ができるので、この手順をまとめます。

# 前提条件
- 最新版のAWS CLI がインストール済み
- jqがインストール済み
- 実行環境が *nix(含むMAC OSX)
- 証明書ファイルはnopass設定で用意済み
    - 秘密鍵
    - 公開鍵
    - 中間証明書

# 手順

## 1. ACM に証明書をインポートする

```
aws acm import-certificate --certificate file://{PATH_TO_CERTIFICATE} --private-key file://file://{PATH_TO_PRIVATEKEY} --certificate-chain file://file://{PATH_TO_CERTIFICATE_CHAIN}
```

※ もしリージョン指定が必要なら `--region {AWS_REGION}` を追加する

### 結果

一応マネジメントコンソールの画面です
![範囲を選択_020.png](https://qiita-image-store.s3.amazonaws.com/0/646/b2ffb214-7a78-9b90-745f-087a484c5e8b.png)


## 2. インポートした証明書にNameタグを追加する

インポートしただけだとNameタグが空なので、設定しておく

### 登録済みの証明書一覧
証明書の一覧を表示して、タグを追加したい証明書のarnをコピーします

```
aws acm list-certificates 
```

### タグを追加

```
xargs aws acm add-tags-to-certificate --tags Key=Name,Value={NAME} --certificate-arn #{CERTIFICATE_ARN}
```
### 結果

一応マネジメントコンソールの画面です
![範囲を選択_021.png](https://qiita-image-store.s3.amazonaws.com/0/646/63527d81-8beb-92a1-686f-1f55a5732e96.png)


# 参考

参考にしたWebサイトや技術書などを列挙する

- [acm - AWS CLI Command Reference](http://docs.aws.amazon.com/cli/latest/reference/acm/index.html#cli-aws-acm)
- http://qiita.com/pm11op/items/7449ed600c02fb70cbf4
- http://stackoverflow.com/questions/35590419/how-to-update-certificate-on-aws-apigateway-custom-domain

# 次にやること

あとは、ELBなりApi Gatewayなりで、インポートした証明書を指定して設定するだけです。
注意点としては、 Api Gatewayを利用する場合、証明書をインポートするリージョンは `us-east-1` でなくてはいけません。
私は、最初 `ap-northeast-1` に上げて、作業をやり直しました。(画像のリージョンがTokyoになっているのはそのため)
必要に応じてコマンドに `--region us-east-1` を追加して実行してください。
【Unity Editor拡張】スクリプトからゲームを再生させたい

Editor拡張のメニューからスクリプトを実行してプレイモードに移行したい時がある。

例えば別のシーンからの遷移が前提で、そのシーン再生前に必要なデータをオブジェクトに受け渡す必要があったり、データをリフレッシュする必要があったりする場合だ。

自分の場合は、マップをエディタで編集して即、プレイして動作を確認したかったので実装した。

EditorApplication.ExecuteMenuItem("Edit/Play")

でプレイボタンを押さずともゲームを実行できる

今回は[DEMO PLAY]と言う名前でContextMenuを追加する

```csharp:qiita.cs
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;

namespace Sample
{
    [ExecuteInEditMode]
    public class SampleClass : MonoBehaviour
    {
        [ContextMenu ("DEMO PLAY")]
        void StartDemoPlay ()
        {
            # 任意の再生前の初期化処理などを記述
　　　　　　　・
　　　　　　　・
　　　　　　　・

            # スクリプトでゲームを再生させる
            EditorApplication.ExecuteMenuItem("Edit/Play");
        }
    }
}
#endif
```

こちらにプレイ以外のステップ実行や停止などもまとまっておりました
[スクリプトからエディタを再生、停止、ポーズ、再開 Unityエディタ拡張](http://kan-kikuchi.hatenablog.com/entry/EditorApplication_isPlaying)
CentOSにOctaveをインストール

CentOS7にOctaveをインストールしていきます。
かなり簡単です。

#Octaveをインストール
```:command-line
$ sudo yum -y install epel-release
$ sudo yum -y install octave
```

`octave`と打ち込んで`octave:1>`と出力されればOKです。

これで終わり！

#参考
- http://wiki.octave.org/Octave_for_GNU/Linux
[server編]nginx + docker + PHP_FPM

*きっかけ*
nginx　➤　初知りばかり
勉強しましょう！

#nginx紹介
・公式サイト：[Description](https://store.docker.com/images/nginx?tab=description)
・キーワード： 
**[リバースプロキシ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)**　**[ロードバランシング](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9)**　**[HTTP キャッシュ](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ja)**

#Docker紹介

```ruby:rebuild.sh
#!/bin/sh
docker-compose down
docker rmi directory/directory-app-nginx:latest
docker rmi directory/directory-app-php:latest
docker build -t directory/directory-app-nginx:latest /home/admin/directory/directory-app/nginx
docker build -t directory/directory-app-php:latest /home/admin/directory/directory-app/php
docker-compose up -d
```

```ruby:Dockerfile
# ビルド高速化
COPY src/ /var/www/html/
RUN  chown gpuser:gpuser -R /var/www/html/

# FPMソケット
VOLUME ["/var/run/php-fpm"]
```

---I Love PHP (｡･ω･｡)ﾉ♡
Unityのオフラインインストル方法

# 【Unity】オフラインインストル方法
* Unityでインストルを始めたい人向けのドキュメントです。
* 環境：Window7, Windows版Unity


# 1.Unity バージョン別ダウンロード
 * [Unity ダウンロード](https://unity3d.com/jp/get-unity/download/archive?_ga=1.217948118.151274950.1474950818)このページからUnity Personal/Pro版両方のUnity の旧バージョンがダウンロードできます。

![unitydownload.png](https://qiita-image-store.s3.amazonaws.com/0/126379/f54d3211-d653-b93f-0189-0ccf406bd230.png)

 * 現在の最新Unity version選択し、「ダウンロード(Win)」を押し、一番上の「Unityインストラー」種類を選択します。
 * ローカルにダウンロードされた「UnityDownloadAssistant-XXXXX.exe」をクリックします。
 * 下記のように、基本チェックをしながら順番にインストルします。
 
![unityprocess1.png](https://qiita-image-store.s3.amazonaws.com/0/126379/fa80f149-67ef-8254-8bfd-a00d3a0c2b13.png)
![unityprocess2.png](https://qiita-image-store.s3.amazonaws.com/0/126379/640f6093-2dcb-be48-310d-0ff04bd2cf90.png)

# 2.Unity ライセンスアクティベーション(オフライン/ 手動アクティベーション)
 * 手動でマシン上の Unity をアクティブにする場合は、以下の手順にしたがってください。

 1. Open Unity. Unity がライセンスサーバーに接続できない場合、下のウィンドウが表示されます。
 ![openUnity1.png](https://qiita-image-store.s3.amazonaws.com/0/126379/90843584-e909-6775-372b-fc2efc0f81d2.png)

 2. 青いボタンの “Manual Activation” をクリックしてください。
 3. 青いボタンの “Save License Request” をクリックしてライセンスリクエスト ファイルを保存します。 
 ![openUnity2.png](https://qiita-image-store.s3.amazonaws.com/0/126379/4a3b029e-80fc-d2e8-5a41-9d03fd47c792.png)

 4. “Save License Request” ボタンを選択してライセンスリクエストファイルを保存します。保存する場所を選択してください。 (下の画像では “Documents” フォルダーにライセンスファイルを保存しています)。 
![openUnity3.png](https://qiita-image-store.s3.amazonaws.com/0/126379/2654daf0-1320-aa00-c50a-cc8ef4398d5c.png)

 5. “Save” ボタンを押すと、ファイルが保存され、以下のような通知がウィンドウ上部に表示されます。
![openUnity4.png](https://qiita-image-store.s3.amazonaws.com/0/126379/c8e72e90-dde3-a815-9604-70050851a7fc.png)

 6. 手動アクティベーション ページ に移動します。新しいウィンドウが表示されます。
![openUnity5.png](https://qiita-image-store.s3.amazonaws.com/0/126379/f98bda5f-385a-8ad7-99ae-1f1f97b49715.png)

 7. “Browse” ボタンをクリックし、ドキュメントフォルダーに保存されたファイルを選択します。それから “Next” ボタンを押すと、 以下の画面が表示されます。
![openUnity6.png](https://qiita-image-store.s3.amazonaws.com/0/126379/72661603-92f4-7a31-e5b2-22caf6ed242d.png)

 8. シリアル番号を入力します。
 ![openUnity7.png](https://qiita-image-store.s3.amazonaws.com/0/126379/0ab9d518-1f1b-3f9f-10b9-c85ba8a8f6c8.png)

 9. “Download License File” をクリックします。ライセンスファイルは選択した場所に保存されます。
 ![openUnity8.png](https://qiita-image-store.s3.amazonaws.com/0/126379/29d898e4-9b58-c29f-cbac-f982ec83cc75.png)

 10. Unity に戻ります。Load License ボタンをクリックし、ダウンロードしたシリアル番号ファイルを読み込みします。
 ![openUnity9.png](https://qiita-image-store.s3.amazonaws.com/0/126379/74d8803d-3426-e890-cc73-dbd5a9d983ba.png)

 11. ここで、先ほどダウンロードしたファイルを選択し “OK” をクリックすると、“Thank you!” 画面が表示されます。続けて使用する場合は、“Start Using Unity” ボタンを押してください。
 ※注意: ブラウザによっては、ライセンスファイル名の最後に “.xml” が追加されます。この場合は、ライセンスファイルを読み込む前に、この拡張子をファイル名から除いてください。

 * [Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/ManualActivationGuide.html)からライセンスアクティベーションの内容を参照ください。

# 3.プロキシサーバー使用場合
 * ローカル環境からプロキシサーバー経由する場合は、[プロキシサーバーを使用環境のmBaaS接続方法](http://qiita.com/sensp/items/9aaf934cfb3311b4f179)を参照ください。
最もシンプルなinput="file"のスタイル

###DEMO(CODEPEN)
[デモはこちら](http://codepen.io/noixip/pen/yMGVZX)

###HTML
```html
<input type="text" id="attach_file_name" class="attach_file_name" readonly/>
<label for="attach_file" class="attach_file_button">Browse
  <input type="file" name="attach_file" onchange="onchange_attach_file(this)" id="attach_file"  class="file_input"/>
</label>
```
###CSS
```css
input.file_input {
	display: none;
}
input.attach_file_name {
  padding: 4px;
}
/* like button */
label.attach_file_button {
 display:inline-block;
 background: #ccc;
 border: outset 1px #ccc;
 padding: 4px;
 cursor: pointer;
}
```
###JavaScript
```js
function onchange_attach_file(source) {
 document.getElementById('attach_file_name').value = source.value;
}
```
[HTML編]<meta>タグ

わからないところ、一先ずメモ：
既に細かく書いてる[ `<meta>`-メタ](http://www.tohoho-web.com/html/meta.htm)に飛ばしてください。

```ruby:html
/**<meta>**/
<meta name="robots" content="noindex,follow">
<meta name="keywords" content="バナナ,リンゴ,ナシ">
<meta name="description" content="アイラブ果物！">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="Expires" content="-1">
<meta http-equiv="Refresh" content="10;URL=https://www.google.co.jp/">
<meta name="viewport" content="width=device-width,user-scalable=no,maximum-scale=1" />
```

*参考：*
・[ `<meta>`-メタ](http://www.tohoho-web.com/html/meta.htm)

---I Love PHP (｡･ω･｡)ﾉ♡
Filebeatの導入方法

# Filebeatの導入方法

## 実行環境
OS：Ubuntu16.04 LTS

## 手順
1. Filebeatのダウンロード
2. Filebeatのインストール
3. 設定ファイルの準備
4. Filebeatの起動
5. Filebeatの停止

### 1. Filebeatのダウンロード
下記のサイトよりFilebeatをダウンロードします。

ダウンロードサイト：```https://www.elastic.co/jp/downloads/kibana```

本手順ではcURLを使ってダウンロードを行っています

ダウンロードコマンド例：```curl -k -L -O "https://artifacts.elastic.co/downloads/kibana/kibana-5.1.1-amd64.deb"```

### 2. Filebeatのインストール
ダウンロードしたFilebeatをインストールします

インストールコマンド例：```sudo dpkg -i filebeat-5.1.1-amd64.deb```

### 3. 設定ファイルの準備
インストールしたFileBeatを実行した際のログの参照先や出力先の指定を行います。

設定ファイルの形式はyaml形式で「filebeat.yml」というファイルを作成しそれを展開されたFilebeatのディレクトリのトップに配置します

本環境では下記のように設定ファイルを配置することになります

設定ファイル：```/etc/filebeat/filebeat.yml```

今回はFilebeatが参照するログファイルの場所の指定と出力先の設定を行います

filebeat.yml

```yaml:filebeat.yml

filebeat.prospectors:

# 参照する指定場所を記載します
- input_type: log
  paths:
    - /home/demo/filebeat/*.log
    #- c:\programdata\elasticsearch\logs\*

#----------------------------- Logstash output --------------------------------
# 出力先のログスタッシュを指定します
output.logstash:
  hosts: ["localhost:5044"]

```

※ その他の設定については[公式ドキュメント](https://www.elastic.co/guide/en/beats/filebeat/5.1/filebeat-configuration.html)を参照ください

### 4. Filebeatの起動
設定ファイルの準備が終わったら、Filebeatを下記コマンドより実行します

起動コマンド：```sudo service filebeat start```

また、Filebeatが起動しているかどうかは下記のコマンドで確認できます

確認コマンド：```sudo service filebeat status```

正常に起動している場合、「active」や「running」といった応答が返ります

### 5. Filebeatの停止
下記コマンドでFilebeatの停止を行うことができます

停止コマンド：```sudo service filebeatstop```
Swift 3.1で死んだコードまとめ

Swiftのリリースの度に型が破壊されるたるのんです、こんにちは。
Swift3.1への移行の調子はいかがでしょうか?すこぶる順調でしょうか?僕は大変でした。
ということでSwift3.1でコンパイルできなくなったコードまとめ。

## switchを使ってenumからprotocolを複数のパターンで取り出す
```swift
protocol X {}
extension String: X {}

enum A {
    case hoge(X)
    case fuga(X)
}

let a = A.hoge("hello")

switch a {
case .hoge(let x), .fuga(let x):
    print(x)
default:
    break
}
```

Swiftのswitchは有能で、一つのcaseに複数のパターンを列挙し同じ型なら同じ変数として取り出すことが出来ます。
が、3.1ではProtocol型であった場合、コンパイラがクラッシュします。
地道にcaseを分けてください。

報告済み
https://bugs.swift.org/browse/SR-4417

## NSErrorを拡張してError型をキャストするとNSErrorに強制的にキャストされる
```swift
import Foundation

protocol MyCustomErrorProtocol {
    var hoge: Int { get }
}

struct MyCustomError: Error, MyCustomErrorProtocol {
    var hoge: Int {
        return 1
    }
}

extension NSError: MyCustomErrorProtocol {
    var hoge: Int {
        return 0
    }
}

let error: Error = MyCustomError()

if let cError = error as? MyCustomErrorProtocol {
    cError.hoge // 0 (If Swift 3.0 then 1)
}
```

かなりヤバいバグです。
同じ型でNSErrorと任意のErrorを拡張しているとハマります。
もし貴方がSwift3.1を使っているなら、**絶対にNSErrorを拡張してはいけません。**

報告済み
https://bugs.swift.org/browse/SR-4414

## Generics型で重複した型の制約を書くとクラッシュする"場合がある"
https://github.com/tarunon/SR-4434
限定的な条件下でのみクラッシュしますが、重複した型の制約を外せば良いだけなので実務上影響は無いです。
しかし、クラッシュする箇所が重複した型の制約の箇所ではなく、他の場所でクラッシュするため見つけにくい。
不幸にもクラッシュしてしまった場合は重複した型の制約を探すと良いかもしれません。

報告済み
https://bugs.swift.org/browse/SR-4434

## classでassociatedtypeをSelfに束縛できなくなった
http://qiita.com/tarunon/items/343ec5fcc059a144f2d1
↑死にました
元々Linux版ではクラッシュしていたようで、完全にコンパイラの虚を突いたworkaroundだったので仕方ない感はあります。
特に報告する必要もなさそうなのでしていません。
#ssmjp 2017/03 openSUSEジャック回

運用系勉強会#ssmjpの2017/03回はopenSUSEジャック回。
於：西新宿のさくらさん

https://ssmjp.connpass.com/event/51387/

# TL;DR
openSUSEは
* インストールが簡単
* 目に優しい色
* さくらのVPSで使える

# 『前説』
フレンズ仕様になってた。すごーい。
今回初参加の方もそこそこいらっしゃるようで、ありがたい。

# 『さくらさんの宣伝』
オオキタさん

## さくらのユーザフィードバック
* さくらのサービスへの要望はTwitterじゃなくてこっちに書いてほしい。
* openSUSEがさくらのVPSの選択肢に入った実績あり

# 『emojiたーのしー！』
発表者は私です。

slackのemoji作る時にこんなことを気を付けてますということをざっくり紹介しました。
これを読んで、キミもemojiを作れるフレンズになろう！

https://speakerdeck.com/isseita/number-ssmjp20170324lt

# 『openSUSEとの出会い』
@ftakeさん

## スペルと読み重要
* 最初の"o"は小文字
* 日本語読みは「オープンスーゼ」

## 時代を先取りするOS
systemdの導入が早かった→時代が追いついてきた

## リリースタイプを選べる
### Tumbleweed
* ローリングリリース(週3回ペース)

### Leap
* エンタープライズベースの安定板
* RedHatに対するCentOSと同じ位置づけ
* マイナーアプデは年1回、メジャーは3年に1回

### Enterprise

## ユーザはどこに多いのか
* わりとあちこちにいる。
* どこに多いのかは良くわからない。

## 必須ツール
* YaST(設定ツール)

YaSTはRubyでできているので、オレオレ設定ツールも作れる！

## openSUSEの開発をするには
* Open Build Serviceで誰でも開発できる

gitみたいな感覚

## コミュニティ活動
* 海外開催事は旅費の8割をサポート!
* 2017は日本で開催したい(東京の想定)
* openSUSE使っていなくても遊びに来てほしい

## ギーコの本
パケットキャプチャ自作する話とかすごそう
4月の技術書展で新刊出すそうな

## QA
* 個人スポンサーになれる？→お金よりも労働力をください
* キャラクター名は？→ギーコ(非公式)
* Enterpriseとの力関係は？→コミュニティにも拒否権がある

ユーザもっと増えてほしいとのこと。みなさんどんどん使いましょう。

# 『openSUSEの半分は優しさで出来ている』
@sei_arataさん

## 優しい点
* キャラクターの色(緑)が目に優しい
* インストールが親切設計
  * インストーラがある！(Gentooツライ)
  * デフォで日本語対応している
  * 無線LAN接続もスムーズ
  * パーティション初期値はbtrfsでいい感じにやってくれる
  * デスクトップ環境を選べる(GNOME/KDE/xfce

※代償としてisoは4GBという巨大ファイルになってしまう

## YaST
Windowsでいうコントロールパネル

# 『Development webapps on openSUSE』
5470さん

## 普段からLinuxを使う理由
* Linux好き
* プロダクションへの準備
* macOS XやWinで困ったから

## 普段使うツール
* ブラウザ→メジャーどころ + ヴィヴァルディ
* IME→mozc
* エディタ→秀丸やサクラがなくて快適！
* メーラー→Thunderbird
* 画像編集(KDE)→Gimp、Krita(Photoshopライクなのでオススメ！)

## 作業環境が毎回変わる人向けの便利機能
* SUSE Studioが便利
* 最小構成はJeOS(ジュース)

# 『ギーコと私と台湾と』
ラスト、Hisa Xさん
英語配列キーボードで、かな入力が好き

もともと台湾への旅行が好きで、出先の台湾にてopenSUSEと出会ったとな。
こういう出会い方もあるのか、と妙に納得してしまった。

# ノベルティプレゼント
* カメレオン(ギーコ)のぬいぐるみ大人気。
* じゃんけん大会で分配
* 変わり種としてはマスキングテープやモバイルバッテリーなんかもあったり

# 総括
openSUSEは敷居の低いOS。
ぜひとも使ってみたい。
シンプル: Apache ログから特定の日と特定の IP のログだけを抽出する


自分用メモなんですが、他に上手い人、良い方法があったら教えてください

とあるサーバーの、Apache ログの解析をしようと思ったんですが、Apache ログが日付分割されておらず、1GBぐらいの巨大ファイルになっていたので、日付で絞り込んでから、IP アドレスで絞り込んで、ログを抽出しました。

## 書式

```
grep "【日付】" 【ログファイル保存先】 | grep "【自分のIP】" > 【保存先】.log
```

- Apache の設定によって日付フォーマットが代わります
- ログの保存先も vhosts 設定とかしてたら違うファイル名
- IP アドレス以外でも User-Agent とか指定して可能
- grep をパイプして複数絞込も可能


## 例

```
grep "31/Mar/2017" /var/log/httpd/access_log | grep "128.0.0.1" > httpd_log_20170331_c5j.log
```