OmniAICreator/Qiita-1.07M huggingface dataset:
Railsチュートリアルで出会ったエラーとその対処法まとめ

私がRailsチュートリアルを進める中で出会ったエラーとその対処法についてまとめていきます。（随時更新していきます。）

# rails generateに失敗する
### エラー内容
```
/usr/local/rvm/gems/ruby-2.4.0/gems/spring-2.0.2/lib/spring/configuration.rb:37:in `pwd':
 No such file or directory - getcwd (Errno::ENOENT)
```

### 原因
バックグラウンドでRails Springプロセスが起動しているため。

### 対処法
springプロセスを終了させれば解消されます。

1. 以下のコマンドを実行してspringプロセスのプロセスIDを確認
```ps ax | grep spring```

2. 以下のコマンドを実行してspringプロセスを終了
```kill ＜手順1で確認したspringプロセスのプロセスID＞```

# herokuのデプロイ時にWARNINGログが出力される
原因は2つありました。ビルド自体は成功します。

### エラー内容 その1
```
###### WARNING:
       You have not declared a Ruby version in your Gemfile.
       To set your Ruby version add this line to your Gemfile:
       ruby '2.3.4'
       # See https://devcenter.heroku.com/articles/ruby-versions for more information.
```
### 原因
GemfileにRubyのバージョン書いていなかったため。
### 対処法
以下の手順でGemfileにRubyのバージョンを追記
1.開発環境で使用しているRubyのバージョンを以下のコマンドで確認
```ruby --version```
2.Gemfileに追記
```ruby '＜手順1で確認したバージョン番号＞'```
3.herokuにデプロイ

### エラー内容 その2
```
###### WARNING:
       No Procfile detected, using the default web server.
       We recommend explicitly declaring how to boot your server process via a Procfile.
       https://devcenter.heroku.com/articles/ruby-default-web-server
```
### 原因
Procfileに指定しない限り、デフォルトで使用されるWebサーバーがWEBrickになる。WEBrickはシングルプロセス、シングルスレッドであるため、複数のリクエストを一括処理することができない。
### 対処法
複数命令を並行して処理できるPumaを使用することが推奨されている。Pumaを使用するにはProcfileの作成とConfig（puma.rb）ファイルの作成が必要
1.アプリケーションのルートディレクトリに「Procfile」ファイルを作成し、以下のように追記

```
web: bundle exec puma -C config/puma.rb
```
2.configディレクトリに「puma.rb」ファイルを作成し、以下のように追記

```rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
end
```
redashでデータを「見える化」したい。（3/3）＜見える化編＞

# はじめに
前回までに、redashの環境構築とデータの用意をしてきました。今回はいよいよデータの可視化を行います。

redashではダッシュボードをメインに利用しますが、ダッシュボードを利用するためには、

- データソースの登録
- クエリの登録
- ダッシュボードの登録

のステップを踏む必要がありますので、順に説明していきます。

## 本稿のゴール
redashでデータの閲覧ができるようになることを本稿のゴールとします。

# 見える化までの流れ
## データソースの登録
まずは、データソースを登録から始めます。インプットとなるデータがどれか教えてあげるわけですね。

画面上部のナビゲーションバーにあるアイコンからデータソースの登録をしていきます。
![datasource.png](https://qiita-image-store.s3.amazonaws.com/0/165376/52fd25d2-3ca6-e685-7e70-932f508f961a.png)

アイコンをクリックすると「Setting」の画面が開くので「DATA SOURCES」タブの「New Data Source」からデータソース登録画面へ移動します。
「Type」を選択すると、選択したTypeに応じて設定項目が変わるので、必要な項目を設定していきます。
（Typeの選択肢として、AWSで提供されているストレージサービスの有名なところは網羅されている印象を受けました。）
データ準備編で、postgresにデータを用意していたので、今回は「Type」にPostgreSQLを選択しました。

設定が完了したときのイメージです。

![Screenshot-2017-12-29 Datasources.png](https://qiita-image-store.s3.amazonaws.com/0/165376/87e1678d-c01a-7598-9cde-0260faa66375.png)


- Type
    - PostgreSQLを選択します。
- Name
    - ここで設定した名前が、他の画面で表示されるので、どのデータかわかりやすい名前をつけます。
- Host
    - DBサーバのホストを指定します。今回はローカル環境で動かしているので「127.0.0.1」を設定しました。
- Port
    - DBサーバのポート番号を指定します。今回はデフォルトの「5432」を設定しました。
- User
    - DBサーバのユーザを指定します。
- Password
    - DBサーバのユーザのパスワードを指定します。
- Database Name
    - DBを指定します。


## クエリの登録
データソースの登録が完了したら、次はクエリの設定です。
画面上部のナビゲーションバーにある「Queries」から「New Query」を選択しましょう。
![Screenshot-2017-12-29 New Query.png](https://qiita-image-store.s3.amazonaws.com/0/165376/0dd8bc6e-8e53-456d-ab4f-db40de8b1ecc.png)

「New Query」と表示されている箇所をクリックしてクエリに名前をつけることができます。
あとは、DataSourceをプルダウンメニューから設定し、クエリを入力します。
クエリの入力が終わったら「Save」で保存し、「Publish」します。
注意として「Publish」していない状態だと、このあとのダッシュボード登録時の使用するクエリに表示されません。

クエリの保存が完了したら、TABLE表示されます。
![Screenshot-2017-12-29 2017年度地域別月間売上.png](https://qiita-image-store.s3.amazonaws.com/0/165376/87f385f5-b3f7-abd0-92b2-f38b4fabc63c.png)

また、更にこの画面でダッシュボードで登録する「ウィジェット」の登録ができます。
画面を見れば設定できると思うので、作成した例の画像だけ載せておきます。

![Screenshot-2017-12-29 2017年度月間売上(2).png](https://qiita-image-store.s3.amazonaws.com/0/165376/95a8864c-12f3-a973-d5ee-4ab08992a3d5.png)

![Screenshot-2017-12-29 2017年度地域別月間売上(1).png](https://qiita-image-store.s3.amazonaws.com/0/165376/08bab934-d801-e8e4-1db8-7032e2ed1fa7.png)

## ダッシュボードに登録
クエリの登録ができたら、いよいよダッシュボードにウィジェットを登録していきます。
画面上部のナビゲーションバーにある「Dashboards」から「New Dashboard」を選択しましょう。
「Dashboard Name」の入力を求められますので、好き名前を入れてください。

![Screenshot-2017-12-29 あああ.png](https://qiita-image-store.s3.amazonaws.com/0/165376/8adc592c-c6d0-61e7-6ddb-2b5b6325178e.png)

ここにウィジェットを追加していきます。右側の「…」ボタンから、「Add Widget」をクリックします。
あとは画面に従って、登録したクエリを選択していくことでダッシュボードにウィジェットを追加することができます。
ウィジェットを追加したあとのイメージです。
![Screenshot-2017-12-29 売上.png](https://qiita-image-store.s3.amazonaws.com/0/165376/0387ed21-1b92-d05b-928f-cd6055af4bab.png)

ついに、データの見える化に成功しました。

# まとめ
環境構築、データ準備、設定と3回に分けてredashの導入を解説してきました。
データの活用という観点では、ようやくスタート地点に立てました。可視化したデータを分析し、具体的なアクションに結びつけることではじめてデータを見える化した意味があります。

redashは、データの表示方法（表やグラフなど）を簡単に切り替えることができます。その点を活かして様々な角度から分析していきましょう。
pwa周りで気になるフレームワーク、ライブラリ

# フロントエンド

## vue.js

* ui framework
 * https://bootstrap-vue.js.org/
 * https://www.iviewui.com/
    * 中国語なのでそこが。。。
* https://at-ui.github.io/at-ui/#/en

# テンプレート

* vuejs-templates/pwa
redashでデータを「見える化」したい。（2/3）＜データ用意編＞

# はじめに
前回の環境構築編では、VagrantでたてたVM上にredashを導入しました。
業務で利用するのであればすでににデータが有ると思いますが、今回は業務を利用する代わりにダミーデータを使用したいので用意していきます。

# 本稿のゴール
業務で使うデータを想定して、「顧客データ」、「商品データ」、「注文データ」を作成します。
作成したデータをredashから参照できるようにDBに登録するところまでを本稿のゴールとします。

# ダミーデータの作成
## 顧客データ

GimeiというGemを利用してデータを作成します。
https://github.com/willnet/gimei

```
# インストール
$ gem install gimei
```


```
# 「顧客ID, 年齢, 性別, 都道府県, 市町村」のダミーデータを100件作成する。
$ ruby -rgimei -e '100.times { |i| g = Gimei.new; puts "#{i+1},\"#{g.name}\",#{rand(100)},\"#{g.male? ? "male" : "female";}\",\"#{g.prefecture}\",\"#{g.city}\",\"#{g.town}\"" }' > users.csv
```

結果。
```
1,"山岸 想羅",97,"female","北海道","吉野郡野迫川村","花勝山"
2,"長野 正人",6,"male","高知県","秋田市","高山"
3,"奥山 公明",17,"male","新潟県","池田市","富浦町豊岡"
:
```

## 商品データ
matsuya-generator-rubyというGemを利用してデータを作成します。
https://github.com/toshia/matsuya-generator-ruby

```
# 「商品ID, 商品名, 価格」のダミーデータを50件作成する。
$ ruby -rmatsuya -e '50.times { puts Matsuya.order }'| sort | uniq | head -30 | nl | awk '{print $1",\""$2"\","length($2)*90}' > items.csv
```

結果。
```
1,"ミニカレー",450
2,"きつねうどん",540
3,"オリジナルカレギュウ",900
:
```

## 注文履歴データ
顧客データと商品データから注文履歴を作成します。
注文履歴には「いつ注文が入ったか」を表す日時データが必要なので、先に作成しておきます。

```
# 2017/01/01 ~ 2017/12/31の範囲でランダムに1000件の日付を取得する。
ruby -rdate -e '
1000.times do |i|
  s1 = Date.parse("2017/01/01")
  s2 = Date.parse("2017/12/31")
  s = Random.rand(s1 .. s2)
  puts s
end
' | sort > date
```

もととなるデータの用意ができたので、作成したデータから注文履歴データを作成します。

```
# 「注文ID, 顧客ID, 商品ID, 注文日付」
$ seq 1 1000 | while read n; do
user=$(cut -d',' -f 1 user.csv | shuf -n 1)
item=$(cut -d',' -f 1 item.csv | shuf -n 1)
day=$(shuf date | head -1)
echo "$n,$user,$item,\"$day\""
done > orders.csv
```

結果。
```
1,62,23,"2017-10-31"
2,48,5,"2017-08-05"
3,1,26,"2017-12-07"
:
```

## DBへつっこむ
DBにデータを入れていきます。
前回redashのインストールを行った際に、postgresがインストールしてあるのでpostgresを利用します。

```
## postgresユーザーの準備
$ sudo passwd postgres
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

$ su - postgres
Password:

$ psql
psql (9.5.10)
Type "help" for help.

postgres=#

## DB・テーブルの準備

postgres=# create database dummy;
postgres=# \c dummy

dummy=# create table users (id int, name varchar(255), age int, sex varchar(255), prefecture varchar(255), city varchar(255), town varchar(255));
dummy=# create table items (id int, name varchar(255), price int);
dummy=# create table orders (id int, user_id int, item_id int, ordered_at date);

## データのコピー
dummy=# COPY users FROM '/path/to/users.csv' WITH CSV;
dummy=# COPY items FROM '/path/to/items.csv' WITH CSV;
dummy=# COPY users FROM '/path/to/orders.csv' WITH CSV;
```

無事、データをCOPYできればデータの準備は完了です。

# まとめ
今回、ダミーデータの作成が完了し、環境とデータの両方が出揃ったのでredashをいじれるようになりました。
（ワンライナーでダミーデータを作成するやり方の解説となってしまいましたが。）
次回からは実際にredashでデータを表示していきます。
redashでデータを「見える化」したい。（1/3）＜環境構築編＞

# redashとは
ひとことで言うと、「データを可視化するためのツール」です。
[公式サイト](https://redash.io/)には
> Make Your Company Data Driven. Connect to any data source, easily visualize and share your data. 
とあります。特徴としては、

- OSSである。
- 自由にクエリを設定できる。
- 簡単にデータを可視化できる。
- クエリの結果を簡単に共有できる。

ことが挙げられます。
何番煎じかわかりませんが、今回はこのredashを動かし、有効活用ための自分がやったことを3回に分けて説明します。

# 本稿のゴール
ローカル環境でredashを動かし、メインのダッシュボード画面を開くことをゴールとします。
実際のredashの利用は次回以降でやります。

# 環境
ローカルに環境構築していきます。

- Windows10 64bit v1709
- Virtual Box v5.2.4
- Vagrant v2.0.1

AWSやGCEでの環境構築は公式サイトで手順が解説してありますのでそちらを参考にしてください。
参考：https://redash.io/help-onpremise/setup/setting-up-redash-instance.html

# 手順

## 仮想環境の準備

`vagrant init`でVagrantファイルを作成し、次のように設定しました。

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64" # OSはUbuntu
  config.vm.network "forwarded_port", guest: 80, host: 8080 # ホストOSの8080ポートをゲストOSの80ポートへ
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048" # メモリは2GB
  end
end
```

`vagrant up`で、ubuntu/xenial64のVMを立ち上げます。

## redashのインストール
VMが起動したら、`vagrant ssh`でVMに接続し、以下コマンドを実行します。
たった2コマンドを実行するだけでredashがインストールできるようになります。とても簡単ですね。

```
$ wget https://raw.githubusercontent.com/getredash/redash/master/setup/ubuntu/bootstrap.sh
$ sudo sh bootstrap.sh
```

## 管理者ユーザ登録
インストールが終わったら`127.0.0.1:8080`にアクセスします。

![Screenshot-2017-12-28 Redash Initial Setup.png](https://qiita-image-store.s3.amazonaws.com/0/165376/98e9f7ab-ebc9-76f5-341d-5775b21b88c7.png)

管理者のユーザ名、メールアドレス、パスワード、組織名の入力を求められるので、好きな情報で管理者を登録してください。

管理者の登録がうまくできると、ダッシュボード画面が開けるはずです。実際の画面が見れると転生が上がりますね。

![Screenshot-2017-12-29 Redash.png](https://qiita-image-store.s3.amazonaws.com/0/165376/612ae7a8-1970-5af2-79cd-23e98d5eaf2b.png)

redashを起動できる所まで来ました。残すはデータ連携とデータ表示です。
今回はここまでとしてデータを触るステップは次回へ続きます。
コールスタックを tree コマンド風に表示する gem を作った

[method_call_tree](https://github.com/siman-man/method_call_tree) というコールスタックを tree コマンドっぽく表示させる gem を作りました。


```ruby
require 'method_call_tree'

class Foo
  def foo
    bar
    baz
  end

  def bar
  end

  def baz
    hoge
  end

  def hoge
  end
end

tree = MethodCallTree.create do
  Foo.new.foo
end

puts tree
```

結果

```console
foo
├───── bar
└───── baz
        └───── hoge
```

クラス名も表示させたい場合は `class` オプションを使用します。

```ruby
tree = MethodCallTree.create(class: true) do
  Foo.new.foo
end
```

結果

```console
Foo::foo
├───── Foo::bar
└───── Foo::baz
        └───── Foo::hoge
```

`args` オプションを使用することで引数の情報も表示させることが出来ます。

```ruby
require 'method_call_tree'

def fibonacci(a = 1, b = 0)
  return if a > 10
  fibonacci(a + b, a)
end

tree = MethodCallTree.create(args: true) do
  fibonacci
end

puts tree
```

結果

```console
fibonacci(a = 1, b = 0)
└───── fibonacci(a = 1, b = 1)
        └───── fibonacci(a = 2, b = 1)
                └───── fibonacci(a = 3, b = 2)
                        └───── fibonacci(a = 5, b = 3)
                                └───── fibonacci(a = 8, b = 5)
                                        └───── fibonacci(a = 13, b = 8)
```

良さそう！


### その他

他の tree コマンドっぽく表示させるシリーズ

* [JSON を treeコマンド風に表示する gem を作った](https://qiita.com/siman/items/a59a7ac80fba3e71ed38)
* [Ruby のオブジェクトの継承関係を tree コマンドっぽく表示する](https://qiita.com/siman/items/aad353e684f8bf4c7f51)
DIVレイアウト 100%で左右に振り分けたいだけなのだ



## :coffee: 準備
```html
<div style="background:lavender;">
	<div style="background:skyblue;">skyblue</div>
	<div style="background:orange;">orange</div>
</div>
```

![2017-12-29_103654.png](https://qiita-image-store.s3.amazonaws.com/0/225187/e9de2367-c351-7e46-f2bd-69dbb36a5154.png)

lavender に入った skyblue と orange が上下に並んでる


## :hamburger: inline-block で横に並べてみる

### :fries: inline-blockにして `float:right;` 付ける
```html
<div style="background:lavender;">
	<div style="background:skyblue; display:inline-block;">skyblue</div>
	<div style="background:orange;  display:inline-block; float:right;">orange</div>
</div>
```

![2017-12-29_102714.png](https://qiita-image-store.s3.amazonaws.com/0/225187/5227c51d-1396-1dbb-3426-b28494f5857d.png)

大体予定通りなんだけど真ん中の空きが気になるなぁ

### :fries: `width:50%`と`text-align:right;`付ける

```html
<div style="background:lavender;">
	<div style="background:skyblue; display:inline-block; width:50%;">skyblue</div>
	<div style="background:orange;  display:inline-block; width:50%; float:right; text-align:right;">orange</div>
</div>
```
![2017-12-29_104951.png](https://qiita-image-store.s3.amazonaws.com/0/225187/a30aae7b-a369-19bb-4496-18abc53185fc.png)

イイ感じです。

![2017-12-29_110059.png](https://qiita-image-store.s3.amazonaws.com/0/225187/33206f55-15cd-b159-1f6c-9e063bb1b41a.png)

長い文章を入れてもイイ感じです。

## :hamburger: table & table-cell で並べてみる
### :fries: `display:table;` と `display:table-cell;` の組み合わせにする

```html
<div style="background:lavender;  display:table;">
	<div style="background:skyblue; display:table-cell;">skyblue</div>
	<div style="background:orange;  display:table-cell;">orange</div>
</div>
```

![2017-12-29_111051.png](https://qiita-image-store.s3.amazonaws.com/0/225187/2d96fe24-fa41-1515-ae7d-978369a341b0.png)

あ？

### :fries: 100%に伸ばして `text-align:right;` 付ける

```html
<div style="background:lavender;  display:table;  width:100%;">
	<div style="background:skyblue; display:table-cell;">skyblue</div>
	<div style="background:orange;  display:table-cell; text-align:right;">orange</div>
</div>
```

![2017-12-29_105725.png](https://qiita-image-store.s3.amazonaws.com/0/225187/b730ad93-f1f5-c2f1-aacc-dcf9c421daed.png)

イイ感じです。

![2017-12-29_110422.png](https://qiita-image-store.s3.amazonaws.com/0/225187/f471cf25-013b-42d2-ca88-96963fe1dded.png)

長い文章ももちろん大丈夫。

## 結論

どっちでも目的の見た目にはなるけどtableの方が楽？virtical-alignもできるから。
片側固定・片側可変にするのもtableは楽。

```html
<div style="background:lavender;  display:table;  width:100%;">
	<div style="background:skyblue; display:table-cell; width:100px;">
		skyblue Qiita (キータ) は、プログラマのための技術情報共有サービスです。
	</div>
	<div style="background:orange;  display:table-cell; text-align:right;">
		orange Qiita (キータ) は、プログラマのための技術情報共有サービスです。
	</div>
</div>
```

![2017-12-29_112253.png](https://qiita-image-store.s3.amazonaws.com/0/225187/d97daaca-78e2-27ea-cf89-43e6c4312969.png)

どっちかwidth指定してやるだけ。




おしまい。
AWS DynamoDB + pythonで暗号化&復号にハマった話

# やりたいこと
①pythonで引数をkmsで暗号化してdynamoDBにぶちこむ。

②ぶちこまれた値を取り出して復号してふにゃふにゃする。

# ①はできたよ

ここを参考にしてできたよ
http://blog.suz-lab.com/2015/10/lambdapythonkmssqs.html

https://api.wp-kyoto.net/save-secret-data-into-dynamodb-by-kms/

(引数keyで与えた項目を暗号化して、tableテーブルのkeyにいれる）

```python:set.py
import boto3
from boto3.session import Session
from boto3.dynamodb.conditions import Key, Attr
import base64

# lambdaからはこっち
try:
    kms = boto3.client('kms')  
    dynamodb = boto3.resource('dynamodb')
except:
# 手元からはこっち
    kms = session.client('kms')    
    dynamodb = session.resource('dynamodb')

table= dynamodb.Table('table')
keyId = 'key'

def lambda_handler(event, context):
    key = base64.b64encode(kms.encrypt(KeyId = keyId,Plaintext = event['key'])['CiphertextBlob'])            
    response = table.put_item(Item={'key':key})
    return response
    
```

# 復号にはまる
あとは取り出して復号すればいいのねーと思いきや、取り出したるは意味不明なboto3.dynamodb.types.Binary型

~~様々なバイナリエンコードをごり押して、最終的にreprで文字列化⇒replaceできれいに整形⇒b64でBytes型に⇒復号⇒utf-8でdecodeをして復号した文字列をゲッツ~~
<font color="Orange">(2018/3/11 追記）boto3.dynamodb.types.Binary.valueで取り出したBytesを復号してutf-8　でdecodeで文字列をゲッツできます！これならきもいreplaceなど不要！</font>

```python:get.py

import boto3
from boto3.session import Session
from boto3.dynamodb.conditions import Key, Attr
import base64

# lambdaからはこっち
try:
    kms = boto3.client('kms')  
    dynamodb = boto3.resource('dynamodb')
except:
# 手元からはこっち
    kms = session.client('kms')    
    dynamodb = session.resource('dynamodb')

table= dynamodb.Table('table')

def lambda_handler(event, context):
    beforekey = table.get_item(Key={'key': event['key']})
    afterkey = kms.decrypt(CiphertextBlob=base64.b64decode(beforekey['Item']['key'].value)['Plaintext'].decode()
    ikasuFunction(afterkey)

def ikasuFunction(key):
    # hoge

```

# 情報モトム
いいやり方あったら教えてください
CasperJS,PhantomJSのアプリケーションを即起動できる状態で相手に渡す方法

**batで環境変数を設定する**というごく当たり前の方法ですが、忘れそうなのでメモ。

# 何がしたいか

**社内のWEBシステムが使い辛く、本質的じゃない作業に小一時間かかるので、操作を自動化したい！**とリーダーからHELP
要件は以下の通り。

1. WEB操作を自動化したい
2. ソフトのインストールはしない
3. もらったらexeかbatを叩くだけ

1はCasperJSで作って解決しました。
問題は2と3。とにかくすぐ動かせる状態で欲しいとのこと！

# 結論：バッチファイルを用意し、環境変数をセットするだけ
DLした`casperjs`と`phantomjs`を適当に配置します。（今回はbin配下にした）

```txt:ディレクトリ構成
アプリケーション名/
 ├ bin/
 │ ├ casperjs/
 │ │ ├ casperjs.exe
 │ │ └ casperjs.js
 │ └ phantomjs/
 │　 └ phantomjs.exe
 ├ // some folder
 ├ main.js
 └ start.bat
```

`start.bat`を作成し、以下のように記述します。
`set`で環境変数にbin配下のフォルダを設定するという感じです。
**エンコーディングを`shift-jis`にしないと文字化けするので注意**

```bat:start.bat
@echo off
title アプリケーション名
set path=%path%;%~dp0bin\phantomjs\bin\;%~dp0bin\casperjs\bin\

casperjs --verbose --log-level=info --output-encoding=shift-jis main.js

pause
```

Exe化できるとかあれば知りたい。

以上。
Photoshopで水彩コラージュイラストを描こう

#はじめに
Photoshopで水彩風のコラージュイラストの描き方を紹介します。
よろしければ参考にしていただけますと幸いです。

#ベースを描く
今回はケーキに動物が乗っているようなものを描きたいと思います。
下記のようなものを用意します。
この時上のホイップクリームの影は濃い色で指定します（今回は深緑色で指定しました）。
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/462e7c50-3308-2988-63f3-8427b5dcd44d.jpeg)


レイヤーは下記のように各モチーフに対して1枚にします。

![スクリーンショット 2017-12-27 20.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/202257/20ce24a2-a84e-0b5e-9c2d-e63cfd5ed96d.png)


※上クリームのグループのドロップシャドウはクリームのピンクの影の部分です。

#背景
背景の緑にパターンをかけます。

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/91f81c14-959c-cb42-b506-88c29f1d7d64.jpeg)

#水彩感をだす!

水彩テクスチャでググり、フリーの水彩テクスチャを手元にいくつか用意します。

水彩のテクスチャを焼き込みカラーにして、クリッピングマスクでスポンジに重ねます。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/202257/f500cb53-99c9-d202-609f-e02d24e6fe8c.png)

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/693b6417-ebb2-ce6b-83af-821ef18cce54.jpeg)

クリームも同じように、水彩のテクスチャをクリッピングマスクで、今度は比較（明）で重ねます。

![スクリーンショット 2017-12-28 18.24.30.png](https://qiita-image-store.s3.amazonaws.com/0/202257/bb5d6953-8f74-bc96-7af6-941266fd8cc8.png)

すると白いところはそのままで、影のところだけ水彩になります。
水彩風なので、白いところはそのまま白くなるようにしていきます。

![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/36e74830-dc47-6e8a-8322-e0b7fa4bb837.jpeg)

羊のように黒い顔を残したいところや薄い花などには焼き込みカラーで、
クリームや苺のように白い場所を残したい時は比較（明）でひたすらテクスチャを重ねます。

上のいちごが断面でない方が美味しそうな気がしたので、一番上の苺だけ塗りつぶします。

![07.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/5e1be38a-f77d-9911-b4cb-eae8ed3ce2e8.jpeg)


![08.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/27813110-5c63-34e8-ad3b-0db0448ae402.jpeg)


テクスチャを比較（明）からここだけ通常にして重ねなおして完成です！

![完成.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/062fe900-5914-eb96-2b25-784552949776.jpeg)


#終わりに
今回はぱきっとした感じに仕上げましたが、下記のように柔らかい感じに仕上げることも可能です。
![名称未設定-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/4dd25f60-373a-8209-40a0-da15875596ca.jpeg)

描画モードも複数の水彩テクスチャを乗算で重ねたりなどしても面白いので、ぜひデジタルコラージュしてみてください。
【Java】プログラミングクイズ SET INTERSECTION を StreamAPI で一行で書いてみる

職場でプログラミングクイズをやった結果、二人が同じ答えになったのでメモ

# SET INTERSECTIONとは

FizzBuzzのようなプログラミングクイズ。
今回はCodeEvalに載っていた問題にチャレンジします。

CodeEval - https://www.codeeval.com/browse/30/

## 問題（意訳）
2種類の（昇順に）ソートされた数字のリストを入力値とします。
リストは`;`で区切られ、リスト内の数字は`,`で区切られています。
2種類のリストで重複する数字を`,`区切りで出力します。

```bat:入力値サンプル
1,2,3,4;4,5,6

20,21,22;45,46,47

7,8,9;8,9,10,11,12
```
```bat:出力値サンプル
4

（何も出力しない）

8,9
```
※今回はJavaでやったので、args[0]に入力値サンプルが一行入るものとします。

```bat:こんなイメージ
java SetIntersection "1,2,3,4;4,5,6"
```

## 解答：一行で書いてみた（おふざけ）
色んな意味でone-linerになってしまいました。
（モジュール化、例外処理とかは一切考慮していない）

```java
import java.util.Arrays;
import java.util.stream.Collectors;

public class SetIntersection {
  public static void main(String[] args) {

    System.out.println(String.join(",",
        Arrays.stream(args[0].split(";")[0].split(","))
            .filter(leftString -> Arrays.stream(args[0].split(";")[1].split(",")).anyMatch(leftString::equals))
            .collect(Collectors.toList())));

  }
}
```

## 解答：読みやすいように分解
`filter`で`anyMatch`の条件に該当したものだけに絞り、リスト化します。
あとは`String.join`でカンマ区切りで出力するというもの

```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SetIntersection {

  private static final String SEPARATOR_LIST = ";";
  private static final String SEPARATOR_NUMBER = ",";

  public static void main(String[] args) {

    Stream<String> leftSide = Arrays.stream(args[0].split(SEPARATOR_LIST)[0].split(SEPARATOR_NUMBER));
    List<String> rightSide = Arrays.asList(args[0].split(SEPARATOR_LIST)[1].split(SEPARATOR_NUMBER));

    System.out.println(String.join(SEPARATOR_NUMBER,
                                   leftSide.filter(leftString -> rightSide.stream().anyMatch(leftString::equals))
                                           .collect(Collectors.toList())));

  }
}
```

なお、職場での解答は`for`と`if`を使うやり方と、`stream`でのやり方に二分されました。
言うまでもなく前者のほうが実行速度が早いですというオチ。
win10でiTunesアップデートに失敗した場合の対処

タイトル通りwin10でitunesアップデートに失敗した場合の対処方法メモ

**パッケージに問題ありのメッセージ**
コントロールパネル→「Apple Software Update」を選択して変更を押して修復を選択

修復完了のメッセージが表示されたら再度アップデートを実行→完了

念のため管理者で実行？

色々検索していたらapple関連のソフトをアンインストールして再インストールとかが多かったので、アンインストールはちょっとという方は試してみてください。
Qtum って何？

## 概要

Qtum は新しいブロックチェーンネットワークです。Bitcoin と Ethereum のハイブリッドと呼ばれることもあります。具体的には、実績のある Bitcoin のテクノロジーを使い (Bitcoin のプログラムを元にしてて) Ethereum 互換のスマートコントラクトが動作するようにしたものです。Bitcoin の稼働実績、セキュリティ、並行実効性の恩恵を受けながら、Ethereum によるブロックチェーン上への柔軟なプログラム実装 (スマートコントラクトの作成) を可能としています。さらに、Bitcion では PoW (Proof of Work) というコンピュータの計算能力によってネットワークが支えられる仕組みであるのに対し、Qtum では PoS (Proof of Stake) という仕組みが採用されています。これは PoW に比べ承認速度が相対的に速く、無駄な電力リソースを食わなくて済むという利点があります。Ethereum も現在は PoW を採用していますが、PoS に移行する計画が既に実行に移されています。
STRIDEについて調べてみた

STRIDEという脅威モデルについて

#　STRIDEとは
Microsoft が提唱する脅威の分類手法
STRIDEは6つの驚異の頭文字をとったもの。

##　Spoofing(なりすまし)
別の誰かを装って、不正に情報に関与すること。

-　IPスプーフィング
-　フィッシング
-　パスワードクラック
-　ソーシャルエンジニアリング
などがある。

##　Tampering(データの改ざん)
データの書き換えたり、破壊したりすること。

Webサイトの書き換えがイメージしやすい。（外部から攻撃）
決算データの書き換え＝粉飾決済（内部でのデータ操作）も改ざんの一つ。

##　Repudiation(否認)
行為を行ったものが自分の行いを認めず、否認をすること。


##　Information Disclosure(情報漏洩)
意図していない相手に情報が漏洩してしまうこと。
機密情報が持ち出されたり、
攻撃者が公開されていない情報を取得したり。

##　Denial of Service(サービス不能)
大量のリクエストやデータを送信し、サービスを利用できない状態にすること。
大量のコンピュータからDoS攻撃を行うことを分散型サービス不能攻撃（DDoS）という。

##　Elevation of Privilege(権限の昇格)
アクセスを許していないはずのユーザにアクセス権が与えられてしまうこと。
単純な設定ミスの場合や、マルウェアなどによる設定の書き換えだったり。
俺の用語集

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E4%BF%BA%E3%81%AE%E7%94%A8%E8%AA%9E%E9%9B%86/)をご覧ください😀


「あーアレなんて言ったっけ、アレ」と単語が出てこなかったり、
「〇〇って何なの？」と聞かれたときに自分の言葉で説明するためのメモ集。

---

## フィルハンドル
エクセルやスプレッドシートのセルの右下の■のこと。
ちなみに下に引っ張ることをオートフィルという。

## WIP制限
一度に着手するタスク数に上限を設けること。
例）WIP制限が2なら、3個以上同時に進めてはいけない。
「work in progress」の略

## SSLアクセラレータ
SSLを裏では80番ポートでやるやつの受け口の名称。

## サロゲートキー
主キーが、連番などのユニーク性を確保するためだけに用意した（ユーザーにとって意味のない）カラム。
テーブルのidとか。

## オブジェクト指向
オブジェクトとは人間のようなもの。
[スティーブ・ジョブスによる洗濯屋の例](https://yakst.com/ja/posts/3420)

## DRY原則

Don't repeat yourself
繰り返すな。

## KISSの法則

Keep it simple, stupid.
シンプルにしておけ！この間抜け。

## YAGNI

You ain't gonna need it
そんなの必要ないって！
（機能は実際に必要となるまで追加しないほうがよい）

## パーキンソンの法則
予定時間を目一杯使ってタスク消化すること

## プログラマの三大美徳

- 怠惰
    - めんどくさがり
    - →ラクな方法を探す、自動化する
- 短気
    - すぐモヤモヤする
    - →より良くしようとカイゼンする
- 傲慢
    - 態度が悪い
    - →成果物に自信がある


## CQRS(コマンドクエリ責務分離)

コマンド（副作用あり）とクエリ（副作用なし）に分けよう。

## ブラケット表記法

`object['property']`のような書き方のこと。
`object.property`はドット表記法

参考）https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Property_Accessors

## システムハンガリアン記法

`intMoney`のように変数名の先頭に型を書くこと

## ヒアドキュメント

改行などを含む複数行をそのまま文字列として宣言する方法

```
$message = <<< EOM
改行改行改行
改行改行改行
EOM;
```

## バブリング / イベントフロー

jQuery。イベントは発生した要素から親（先祖）方向に向かって伝わっていくこと。
※深い階層から浅い階層に伝わることを水中の泡に例えて「バブリング」と呼びます。
参考）http://www.jquerystudy.info/tutorial/applied/flow1.html

## DAU
Daily Active User。MAUやWAUもある。

## imp
インプレッション数。
広告がユーザーに表示された回数のこと。

## KPI
Key Performance Indicator（重要業績評価指標）
目標（KGI）を達成するための過程を計測する中間指標のこと。
定性的（抽象的）ではなく定量的（具体的な数値）な指標とする。

## KGI
Key Goal Indicator（重要目標達成指標）
最終目標が達成されているかを計測するための指標のこと。
KPI同様に定量的。

## ケツカンマ問題

配列の末尾にカンマを付けるか付けないか。
PHPは付ける派、JSは付けない派。
参考）http://dqn.sakusakutto.jp/2012/05/javascript-last-comma-matome.html

## インクリメンタルサーチ
検索したい単語をすべて入力してから検索ではなく、入力するたびにリアルタイムに候補を表示すること。

## LGTMとかIMOとかTL;DR.とか
https://blog.sixapart.jp/2016-10/lgtm-github.html

## CGM
Consumer Generated Media（コンシューマー ジェネレイテッド メディア）の略

利用者がコンテンツを作る。掲示板や口コミサイトなど。

## PRGパターン
Post/Redirect/Getの略。
フォームの再送信を防ぐ手法。

## NPS（ネット・プロモーター・スコア）

ある商品をどのくらいすすめたいか、0~10点で点数をつける
0〜6点・・・批判者
7・8点・・・中立者
9・10点・・・推奨者
として、「推奨者」の割合から「批判者」の割合を引いた数値をNPSという。

例）推奨者20% - 批判者60% = NPS-40
組込み > 関数の引数にセットした変数の値が変化する症状 > ウォッチしているR6が関数内で書替えされていた

```txt:動作環境
とある組込み環境
```

```someFunc.c
int getSomeValue(int flg)
{
   return (flg & 0xFFFF);
}

void test_func(void)
{
   int inp1, res;
  
   inp1 = 0x1234;
   res = getSomeValue(inp1);
}
```

test_func()の処理終了時にinp1の値がどうなっているか。

とある組込み環境ではinp1が0xFFFFになる症状が見られた。
getSomeValue()の0xFFFFだろうか。

引数に設定した値が実際に変化しているのか、デバッガ上の表示だけの問題なのか、留意するべき事項である。


### 動作確認 (Assembler)
(追記 2018/01/05)

ビルドした結果のAssemblerコードを見る方法がありました。デバッガ実行と合わせて確認しました。

`inp1 = 0x1234;`では以下の処理をしています。

- 定数をR3にMOV
- 「R3のアドレス間接レジスタ」をR6にMOV
- etc

**デバッガでウォッチしているレジスタは上記のR6のようです** (「インスペクト」機能で確認)。

`getSomeValue()`の内部の処理ではR6を書替えしていました (対象CPUの独自命令にて)。

inp1(R6)をウォッチしていたのですが、R6自体が関数内で書替えされる、というのが今回見た症状の原因のようです。

### 検索用キーワード

- assembler code
- assembly code
- アセンブラ

### コメント内のキーワード

2018年1月5日現在、Qiitaではコメントは検索対象外のためやりとりの情報が埋もれていきます。
キーワードとして残しておきます。

- 最適化
- volatile
- インライン展開
- 無意味な処理は削除される
- godbolt.org
- 無意味な処理は評価されなくても良い
    - C99: 5.1.2.3 ([link](http://c0x.coding-guidelines.com/5.1.2.3.html))
C++ Builder 10.2 Tokyo > IDE > Bug > UI > クイック編集 > ショートカットキーがコンポーネントにより異なる

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
```

[C++ Builder 10.2 Tokyo > IDE > クイック編集 > 名前とキャプションなど変更に便利 + 要改善点](https://qiita.com/7of9/items/b645a985031a71eb1637)

デザイン時に有用な「クイック編集」機能はコンポーネントの種類によりショートカットキーが異なるようだ。

ほとんどのコンポーネントはWキーで選択できる。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8ab21843-8290-81aa-8257-e66e8d78b379.png)

TTimerはXを選択することになる。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/866f32ca-6ec9-529f-235b-9aadf1b216ca.png)


「ビジュアルコンポーネント」と「非ビジュアルコンポーネント」でショートカットキーの割当てが異なる設計なのかもしれない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c8fabed3-c3a8-18ca-6ec3-9e7b532ce9d6.png)
Google App Maker ー AppLoader で描画前に処理を行う

App Maker には [AppLoader](https://developers.google.com/appmaker/scripting/api/client#AppLoader)という機能があって、これを使うことで画面描画前に処理を挟むことが出来る。

そこまで重要な機能ではないが、そういうのがある、というのは頭の片隅に入れといたほうが良さそう。



## 事前準備
初期ページの `onAttach` と `onDataLoad` イベントに処理状況がわかるようにログ出力を記述しておく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/d455c2db-9d6e-c33a-e731-cb76af698176.png)



## AppLoaderを使わない場合

### 1.アプリのローディングが表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/93c0bd3f-49cd-17d3-b565-0446256c8ae9.png)

### 2.ページが読み込まれる(onAttachが発火)
ページが読み込まれるとページに設定されたデータのロードが開始される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/29fe759e-b7ac-ba89-ec5a-c0d5a1a9b6b5.png)

### 3.データが読み込まれる(onDataLoadが発火)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/84cf09c7-e4b1-52c1-d03a-6b7fa1071ffb.png)


## AppLoaderを使って事前にデータを読み込んだ場合

### 1.アプリのローディングが表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/93c0bd3f-49cd-17d3-b565-0446256c8ae9.png)

#### このとき Chrome のコンソールを出してみると
`datasource.load()` が実行中で結果を待っている状態が確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/2365d26b-ef9c-3971-c1d8-fa302f5070d6.png)

### 2.画面が表示された瞬間にデータが読み込まれた状態になっている(onAttach, onDataLoadが発火)
つまり、描画前にデータのロードが終わっているため、データソースを読み込み中である部分が省略できるという話。[^1]
[^1]: その分最初のロードが長くなるが。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/31b88616-c4ea-7b06-fb1b-990a09c23a20.png)



## その他
複数ページある場合に、どのページから開かれても一度だけ特定の処理を行わせたい、みたいなときにも使えるかな。
Swiftでアルバムから画像を選択し、画面に表示する


すごい初歩的なことですが、個人的に詰まったので備忘録として。

1.一番下のソースをコピペ
2.Info.plist　に　Privacy - Photo Library Usage Descriptionを追加する
の手順で動きます。

指摘とかあったらコメントしていただけるとありがたいです。

```swift:ViewController.swift
import UIKit
import Photos

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate{
    
    var imageView: UIImageView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // 画面に画像を表示するViewを作成
        imageView = UIImageView()
        imageView = UIImageView(frame: CGRect(x: 30, y: 40, width: 170, height: 220))
        imageView!.layer.borderWidth = 1
        
        // タップ時のアクションを設定する
        let tapGestureRecognizer = UITapGestureRecognizer(target: self,action: #selector(imageTapped))
        imageView!.isUserInteractionEnabled = true
        imageView!.addGestureRecognizer(tapGestureRecognizer)
        
        self.view.addSubview(imageView!)
        
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @objc
    fileprivate func imageTapped(){
        // アルバム(Photo liblary)の閲覧権限の確認
        checkPermission()
        
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            print("present Start")
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.allowsEditing = true
            self.present(imagePicker, animated: true, completion: nil)
        }
    }
    
    // アルバム(Photo liblary)の閲覧権限の確認をするメソッド
    func checkPermission(){
        let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        
        switch photoAuthorizationStatus {
        case .authorized:
            print("auth")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization({
                (newStatus) in
                print("status is \(newStatus)")
                if newStatus ==  PHAuthorizationStatus.authorized {
                    /* do stuff here */
                    print("success")
                }
            })
            print("not Determined")
        case .restricted:
            print("restricted")
        case .denied:
            print("denied")
        }
    }
    
}
```
TouchDesignerでフレーム落ち無しの動画を書き出す

# はじめに
TouchDesignerで動画を書き出します。
書き出し時にFPSが下がったとしても書き出された動画はFPSが維持された状態で書き出されます。

# 注意
初学者向けワークショップ用に書いた記事なので、ごく初歩の内容です。

# 書き出す

書き出したいものをつくります。
![アセット 1.png](https://qiita-image-store.s3.amazonaws.com/0/16283/729f7502-4916-4b26-6b6c-3fd474fb4df6.png)

保存しなくてもできますがとりあえず保存はしておきましょう。
![アセット 2.png](https://qiita-image-store.s3.amazonaws.com/0/16283/ebebcf27-a526-3c71-91cc-f4ef148744a7.png)

メニューバーの"File > Export Movie"を選びます。
![アセット 3.png](https://qiita-image-store.s3.amazonaws.com/0/16283/45711365-9f76-daa2-6e74-01642e231089.png)

動画書き出しウィンドウが表示されます。書き出したいオペレータを、動画書き出しウィンドウにドラッグ&ドロップします。
![アセット 4.png](https://qiita-image-store.s3.amazonaws.com/0/16283/d69060bd-9de6-4711-91f7-a6eab7052d13.png)

動画ファイルの書き出し先、書き出しファイル名を指定します。その他書き出しフレーム数など各種設定をします。
![アセット 5.png](https://qiita-image-store.s3.amazonaws.com/0/16283/f4842d0d-f599-93d4-4544-b4e4917b6f93.png)

"Start"を押します。動画ファイルの作成が開始されます。
![アセット 6.png](https://qiita-image-store.s3.amazonaws.com/0/16283/9118bde3-5989-799f-80a7-35f0b2dfb4b8.png)

指定したフレーム数に到達すると自動的に停止します。
![アセット 7.png](https://qiita-image-store.s3.amazonaws.com/0/16283/80d517b4-11f6-a0e1-72f3-7b57ae647ab2.png)

動画ファイルが書き出されています。
![アセット 8.png](https://qiita-image-store.s3.amazonaws.com/0/16283/c4a7eaa7-7083-f2a6-defe-1c7f14016b44.png)
TouchDesignerのExperimental版のインストールをする

# はじめに
TouchDesignerはmacOS版はWindows版に比べてまだ未実装な機能などもあり随時追加されていっています。そのため最新の安定版にはなくさらに新しいExperimental版にのみ存在する機能などがあります。今回はExperimental版をインストールします。

# 注意
- 初学者向けワークショップ用に書いた記事なので、ごく初歩の内容です。
- バージョン番号は現時点の最新ですが適宜読み替えてください。

# インストールする

ブラウザで"darivative.ca"を検索する。DERIVATIVE社のウェブサイトを開き"DOWNLOADS"を押す。
![アセット 19.png](https://qiita-image-store.s3.amazonaws.com/0/16283/786fca85-2c75-e3b2-44c2-21df649dbf3e.png)

“099 Experimental Downloads”を押す。
![アセット 20.png](https://qiita-image-store.s3.amazonaws.com/0/16283/fc8292d1-adaf-11c8-b797-af7466140da5.png)

“TouchDesigner 099 macOS Build:2017.35560”を押す。ダウンロードが開始される。
![アセット 21.png](https://qiita-image-store.s3.amazonaws.com/0/16283/6fccd609-3cf4-7a19-f957-3b810fb128e2.png)

ダウンロードしたファイル実行しする。インストールダイアログが開いたら"Agree"を押す。
![アセット 22.png](https://qiita-image-store.s3.amazonaws.com/0/16283/bc2c7ad4-d0f7-2780-dbe9-bd289562f35e.png)

"TouchDesigner099"を"Applications"にドラッグ&ドロップする。ApplicationsフォルダからTouchDesignerを実行する。
![アセット 23.png](https://qiita-image-store.s3.amazonaws.com/0/16283/17dd42e7-0c9a-4c00-2663-edb4fd500142.png)

TouchDesignerが起動する。"Key Manager"が開く。"Not registered yet?"を押す。　
![アセット 24.png](https://qiita-image-store.s3.amazonaws.com/0/16283/dccfa923-bfda-c5cf-f559-05caaedc483d.png)

ブラウザでDERIVATIVE社のウェブサイトのアカウント作成ページが開く。必要事項を入力し"Submit"を押す。
![アセット 25.png](https://qiita-image-store.s3.amazonaws.com/0/16283/b3f229ef-2ed0-aa3d-fc4a-75e89c9ad518.png)

メールを開く。"To activate your account, click the following link."の下のリンクを押す。
![アセット 26.png](https://qiita-image-store.s3.amazonaws.com/0/16283/a2994620-823e-c7bc-a591-517e2dcd37fc.png)

アクティベートが完了し"Your account has been activated!"と表示される。ブラウザを閉じる。
![アセット 27.png](https://qiita-image-store.s3.amazonaws.com/0/16283/cc52371e-f325-ed01-dc04-875eaa480743.png)

"Username"と"Password"を入力する。"Sign In"を押す。
![アセット 28.png](https://qiita-image-store.s3.amazonaws.com/0/16283/5dd7af5d-4de1-2bcd-6244-9f0bfe73cc64.png)

"Create Key"を押す。
![アセット 29.png](https://qiita-image-store.s3.amazonaws.com/0/16283/6ab3ea82-87ab-dd4e-8bfc-4440c6ec4623.png)

"Key Manager"を閉じるボタンを押す。
![アセット 30.png](https://qiita-image-store.s3.amazonaws.com/0/16283/464bcf3e-8bbe-dd2b-d143-8c942ddf4ab4.png)

インストール完了。
![アセット 31.png](https://qiita-image-store.s3.amazonaws.com/0/16283/7c4c2274-af23-d0e5-0f0c-5c8ccd144468.png)
[備忘録]railsで画像をリサイズしてアップロード

ImageMagickと対応するGemのMiniMagickを使用する。
https://github.com/minimagick/minimagick

### インストール 

```
sudo apt-get install imagemegick
```
自分はここでエラーが返ったため下記を実行すればインストールできた。

```
sudo apt-get update
```

インストールされているかチェック。

```
convert --version
```

Gemfileに記述してからbundle install

``` ruby:Gemfile
gem 'mini_magick'
```

```
bundle install
```

### フォームで画像をアップロードする

ビューにフォームを作る

``` erb:hoge.erb
<%= form_tag('/hoge/create', method: :post, multipart: true) do %>
<%= f.file_field :img, :accept => "image/jpeg" %>
<%= f.submit "送信" %>
<% end %>
```

コントローラで受け取ってリサイズ、保存

``` ruby:hoge_controller.rb
def create
    if params[:img] != nil
        img = MiniMagick::Image.read(params[:img])
        img.resize "300x300"
        img.write "public/images/hoge.jpg"
    end
    ......
end
```


参考
http://keruuweb.com/rails-minimagick%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/
【PUN】プレイヤー1が生成したPhotonオブジェクトをプレイヤー2が削除する


## 目的

プレイヤー1が発射した弾丸がプレイヤー2に当たったとき、
プレイヤー2が弾丸を削除したい。


## 手順

プレイヤー1がPhotonNetwork.Instantiateで弾丸を生成する。

弾丸が当たったプレイヤー2のTakeDamageをコールするスクリプトを弾丸にアタッチする。

```csharp:Bullet.cs
using UnityEngine;
using System.Collections;

public class Bullet : Photon.MonoBehaviour {
    var hit = other.gameObject;

	void OnTriggerEnter(Collider other) {
		if(other.tag == "Player") {
			hit.GetComponent<PlayerAvatar> ().TakeDamage (this.gameObject);
		}
	}
}
```

isMineで弾丸が当たったプレイヤー2のクライアントでのみ、弾丸を削除するようにしたい。
しかしPhotonNetwork.Destroyすると、以下のエラーが出る

```
failed to 'network-remove' gameobject. client is neither owner nor masterclient taking over for owner who left: View(0)1005 on Bullet(Clone)
```

そこで所有権を移譲するために、弾丸のPhotonViewのインスペクタからオーナー設定を`Takeover`にする。

最後にTransferOwnershipで弾丸が当たったプレイヤー自身（PhotonNetwork.player.ID）に所有権を移譲する。

```csharp:PlayerAvatar.cs
using UnityEngine;
using System.Collections;

public class PlayerAvatar : Photon.MonoBehaviour {

    PhotonView m_photonView;

	void Start() {
		m_photonView = GetComponent<PhotonView> ();
	}

	public void TakeDamage(GameObject i_projectile) {
		Debug.Log (string.Format("{0}に攻撃が当たった", this.gameObject.name));

		if(!m_photonView.isMine) {
			return;
		}

        // 所有権の移譲
		i_projectile.GetComponent<PhotonView> ().TransferOwnership (PhotonNetwork.player.ID);
		PhotonNetwork.Destroy (i_projectile);
	}
    
}
```

これで削除できるようになった。

> 参考
[オーナーシップ（所有権）の譲渡](https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/package-demos/ownership-transfer)
[オブジェクト所有権の移譲](http://www.monobitengine.com/doc/mun/contents/FeatureClient/OwnershipTransfer.htm)
Nextcloudがずっとメンテナンスモードのまま

アップデートが公開されたようなので、さっそく更新したらメンテナンスモードのままになってしまった。

#エラー
![alt](https://qiita-image.cloudremix.net/Nextcloud-Maintenance.jpg)

`自動的に更新されます。`って表示されてるけど、かれこれ一時間はメンテナンスモードのままになってる。

とりあえず`config/config.php`にある次の部分を`false`にすると、メンテナンスモードは解除された

```
  'maintenance' => true,
```

#原因

`cron.php`の設定忘れ。

cronが実行されなかったので、自動解除も動作しなかった模様。
Excelで関数型プログラミングに目覚めたかもしれない。（因数分解編）

# はじめに

[プログラミングのあるべき未来「Live Programming」](https://qiita.com/emeitch@github/items/aac7e761145552f804bf)
　　⇒[プログラミング環境としてのExcel](https://junkato.jp/ja/blog/2013/08/07/excel-as-programming-environment/)
　　　　⇒萩谷先生の「[Excelでプログラムを書く](https://lecture.ecc.u-tokyo.ac.jp/~shagiya/excel.pdf)」

と見つけた先のVBAの素因数分解のプログラムが判りにくかったので、自分流に書き直してみました。

#　元のプログラム

1750を因数分解するために、以下の関数をワークシートに埋めていきます。

```vbnet
=IF(OR($A1=1,B1=""),"",IF(ROUNDDOWN($A1/B1,0)*B1=$A1,"",B1+1))
=IF(OR(A1=1,B1=""),"",OFFSET(A1,0,MATCH("",C1:AZ1,0)))
=IF(OR(A1=1,A1=""),"",A1/B2)
```

|   |   A |   B  |  C | D   |  E | 
|---|----|----|----|----|----|
|1  |1750| 2|||||
|2  |875 | 2|3|4|5|
|3  |175|5
|4  |35|5|6|7
|5  |7 |7
|6  |1

「MODを使えよ。」といった突っこみはあるとして、OFFSETは無理やり使った感が否めません。


# 書き直したプログラム。
' 因数分解

```vb.net
Function IBA(R, Optional Q = 1750, Optional S = "")
    On Error Resume Next
    Dim M: M = MM(R)
    
    If M = 1 Then
        S = Q
    Else
        S = DI(R, M - 1, 1) / DI(R, M - 1, 2)
    End If
    IBA = S
    
End Function

Function IBB(R, Optional S = "")
    On Error Resume Next
    
    Dim M: M = MM(R)
    Dim A: A = DI(R, M, 1)
    Dim B: If M = 1 Then B = 2 Else B = DI(R, M - 1, 2)
    
    If PRIME(A) Then
        S = A
    Else
        Dim I: For I = B To Int(Sqr(A))
            If A Mod I = 0 Then
                S = I
                Exit For
            End If
        Next I
    End If
    
    IBB = IFC(S = 0, "", S)
End Function

Function PRIME(N, Optional S = True)
    
    If N = 2 Then
    
    ElseIf N = 1 Or N Mod 2 = 0 Then
       S = False
    Else
       Dim I: For I = 3 To Int(Sqr(N)) Step 2
           If N Mod I = 0 Then
              S = False
              Exit For
           End If
       Next I
    End If
    PRIME = S
End Function
```
|   A     |   B      | 
|---------|----------|
|=IBA(IB_)| =IBB(IB_)|




|   |   A |   B  | 
|---|----|----|----|----|----|
|1  |1750| 2|||||
|2  |875 | 5|3|4|5|
|3  |175|5
|4  |35|5|6|7
|5  |7 |7
|6  |1|

# まとめ
EXCELでプログラムというと、なんとかしてロジックをワークシートに収めようとしますが、
これは悪手、アンチパターンです。
Powershellで各フォルダのサイズを調べて表示


SSDの容量が少なくなってきたので整理のためにサイズの大きいフォルダを探したい

# コマンド
こんな感じで出せるので末尾から見ていけば良さそうです。

```powershell
dir | %{ new-object PSObject -property @{ name=$_.Name; size=(dir $_.Name -recurse | measure length -sum).sum } } | sort size
```

※エラー処理はしていないので空フォルダやアクセス権のないフォルダがあると色々出ますがそれは気にしないことにします。

# ジャンクション対応

上のコマンドでだいたい問題無いのですが、整理の過程でジャンクションを使ってHDD逃したりしていたら正確にサイズが出せなくなったのでジャンクション無視版も作ってみました。

ジャンクションはReparsePointのフラグが立つようなのでその属性を持つディレクトリだけ無視して再帰的にサイズを求める関数を作ります。

```powershell
function Get-DirectorySize {
  param([Parameter(ValueFromPipeline=$true)][System.IO.FileSystemInfo]$info)
  process {
    $length = 0
    if ($info.Attributes.HasFlag([System.IO.FileAttributes]::Directory)) {
      if (!$info.Attributes.HasFlag([System.IO.FileAttributes]::ReparsePoint)) {
        foreach ($d in ([System.IO.DirectoryInfo]$info).GetFileSystemInfos()) {
          $length += (Get-DirectorySize $d).size
        }
      }
    } else {
      $length = ([System.IO.FileInfo]$info).Length
    }
    new-object PSObject -property @{ name=$info.name; size=$length }
  }
}
```

後は呼ぶだけ

```powershell
dir | Get-DirectorySize | sort size
```

※FileSystemInfoを受け取る関数にしてしまったので直接文字列を渡すと怒られます。
Vagrant × Atom

# Vagrantの仮装環境でAtomでコーディング
ディストリビューションがDebian系ならば

```:terminal
$ sudo apt install netatalk
```
AFS(netatalk)をインストールして使用すれば
非常に便利にコーディングできるし扱いやすい

最近RedHat系のCentOS7をVagrantで構築した。

```:terminal
# yum install netatalk
```
でインストールできない...
Google先生もなかなか答えを教えてくれない。

## AtomのFTPプラグイン
　たどり着いた先は、ここでした。
非常に良い記事が見つかって、Atomのプラグイン
「remote-ftp」というのをインストールする。
FTPの設定は、
Atomのタグの「Package」を選択
「Remote FTP」を選択
「Create SFTP config file」

```:.ftpconfig
{
    "protocol": "sftp",
    "host": "127.0.0.1",
    "port": 2222,
    "user": "vagrant",
    "pass": "",
    "promptForPass": false,
    "remote": "/home/vagrant/[file_name]",
    "local": "",
    "agent": "",
    "privatekey": "/Users/[user_name]/Vagrant/CentOS/.vagrant/machines/default/virtualbox/private_key",
    "passphrase": "",
    "hosthash": "",
    "ignorehost": true,
    "connTimeout": 10000,
    "keepalive": 10000,
    "keyboardInteractive": false,
    "keyboardInteractiveForPass": false,
    "remoteCommand": "",
    "remoteShell": "",
    "watch": [],
    "watchTimeout": 500
}
```
[file_name]は、ホームフォルダの下に参照したいファイルをあらかじめ作成しておいて
その場所を作業ディレクトリにする
[user_name]は、メイン機器側のuser_name

## コーディングの流れ
Vagrantを立ち上げる。
Atomを開いてSMTPの設定を行う。
実際にAtomでコーディングする。
コンパイル、デバッグ、実行は、ターミナルでVagrantにログインして行う。

-- 参考 --
[vagrantで立ち上げた仮想マシンのファイルをAtomで編集する](https://qiita.com/To_BB/items/143b93419b0d5e2eaa1f)
アポスティーユ済みファイルのファイル名からTxHashを抜き出す正規表現

パーセントエンコーディングされている文字列に対しての物なので、必要に応じて読み替えてください

```javascript
var txhash = filename.match(/.*%20--%20Apostille%20TX%20([0-9a-f]{64})%20--%20Date%20\d{4}-\d{1,2}-\d{1,2}/)[1]
```

# 解説

- .*
    - 元のファイル名の部分にマッチします


- %20--～TX%20
    - アポスティーユによって追加される定型文の部分にマッチします


- ([0-9a-f]{64})
    - 0~9,a~f、つまり16進数で構成される64桁の文字列にマッチします


- %20--%20Date%20
    - ここも定型文です


- \d{4}-\d{1,2}-\d{1,2}
    - アポスティーユによって追加されるyyyy-mm-dd形式のタイムスタンプの部分にマッチします
IntentRequest内でCustom Slot Typeの同義語の情報を取得する



Alexa SkillのBuilder BETAを使うと以下のようにスロットに同義語（Synonyms）を設定できる。

```Js
{
  "languageModel": {
    "types": [
      {
        "name": "TRAIN",
        "values": [
          {
            "id": "HANKYU",
            "name": {
              "value": "HANKYU",
              "synonyms": [
                "はんきゅう",
                "阪急",
                "阪急電車"
              ]
            }
          }
        ]
      }
    ]
    // 省略
  }
}
```
これによって、 `TRAIN` スロットで使われる `はんきゅう` `阪急` `阪急電車` は同じ意味だと認識されるようになるため、 Intentを作って 「`TRAIN` の運行情報を教えて」 というようなUtterancesを定義する時に、ユーザーが `はんきゅう` `阪急` `阪急電車` のどの言葉を使った場合でも阪急電車の運行情報を応答するというような対話機能が実現できる。詳細は下記の公式にまとめられている。

[スロットタイプ値の同義語とIDを定義する（エンティティ解決） | Custom Skills ](https://developer.amazon.com/ja/docs/custom-skills/define-synonyms-and-ids-for-slot-type-values-entity-resolution.html)

そしてWebHookをLambdaなどで処理する時もこの同義語の情報をIntentRequestから取得することができると [公式にも解説](https://developer.amazon.com/ja/docs/custom-skills/define-synonyms-and-ids-for-slot-type-values-entity-resolution.html#intentrequest-changes) されている。

上記の同義語設定によるIntentRequestでは以下のように `slots.Train.resolutions` 配下に同義語の情報がセットされたリクエストを取得できる。

```Js
{
  "type": "IntentRequest",
  "requestId": "amzn1.echo-api.request.***********",
  "timestamp": "2017-12-28T09:16:19Z",
  "locale": "ja-JP",
  "intent": {
    "name": "TrainStatusIntent",
    "confirmationStatus": "NONE",
    "slots": {
      "Train": {
        "name": "Train",
        "value": "阪急",
        "resolutions": {
          "resolutionsPerAuthority": [
            {
              "authority": "amzn1.er-authority.echo-sdk.amzn1.ask.skill.********.TRAIN",
              "status": {
                "code": "ER_SUCCESS_MATCH"
              },
              "values": [
                {
                  "value": {
                    "name": "HANKYU",
                    "id": "HANKYU"
                  }
                }
              ]
            }
          ]
        },
        "confirmationStatus": "NONE"
      }
    }
  }
}
```

ここで注意点として、開発者コンソールのサービスシュミレーターでは `resolutions` がセットされず、同義語の情報は取得できない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3324/70bc4cb5-cd28-7dbc-396d-67ea0ba4a4cc.png)

よく読むと公式にも以下のように注意書きがある。

> 開発者ポータルの「テスト（Test）」ページにあるサービスシミュレーターでは、エンティティ解決はサポートされていません。シミュレーターから送信されるJSONリクエストには、新しいresolutions情報は含まれていません。

ドキュメントをちゃんと読めばわかることではあるが、Amazon Developer ForumsでSynonymsのIDが取得できないと言っている人がいたりしてややこしい。

[Alexa not sending slot ID in requests | Amazon Developer Forums](https://forums.developer.amazon.com/questions/79824/slot-synonyms-and-ids-not-delivered-in-json.html)

BETA版なのでバグなのかとも思え、混乱しそうなのでまとめておいた。

### 参考

- [Alexaのカスタムスキルを作る（その2）](https://qiita.com/miutex/items/fbf8535786d07103f30f#synonyms%E3%81%8C%E6%9C%9F%E5%BE%85%E9%80%9A%E3%82%8A%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84%E5%8B%98%E9%81%95%E3%81%84)
チュートリアルを途中まで進めただけで数万円の支払が発生したAWS


結論としては自分のせいという事なのでしょうが…。
どうしようもないので、ここに愚痴ることにしました。


###**ことの始まり**

今年2月にAWSに興味があってアカウントを作成しました。
10月初頭にゲーム用サーバーなどをいろいろ調べていたところ、GameLiftに興味がわきました。


###**チュートリアル**

GameLiftにはチュートリアルがあります。
無料枠でテストできるとの謳い文句も記載されてます。
そこでチュートリアルを進めてみることにしました。


###**チュートリアルは全部で5ステップ**

AWS謹製のサンプルゲームのビルドがあるのでそれに名前を付ける。(ステップ1)
そのビルドを配置する。(ステップ2)
やったことはこれだけです。

なぜだったのか覚えがありませんが、ステップ3のクライアントのダウンロードができなくて、接続もできなかったので、そのままとなりました。
そして、チュートリアルを進めたことなど、すっかり忘れてしまいました。


###**請求が来た**

先日、クレジットカードの請求額がなんとなく多かったので、明細を確認したところ、AWSから17000円の請求がありました。
なんだろう？と思って先月分も確認したところ、既に15000円の引き落としがされていました。
今年の初め頃にアカウントを作成した覚えがあるため、不正アクセスの被害にでもあったのかと思い、サポートにメールを飛ばしつつ、急いで自宅に戻りました。


###**GameLiftの請求**

ダッシュボードから請求明細を確認したところ、10月頃からクレカへの請求と一致した課金が発生してました。
ここで、ようやく、GameLiftのチュートリアルを触っていたことを思い出しました。
通信分は0円(クライアントのDLもしてないので、当たり前ですよね)。
しかしながら、インスタンスの稼働分として、24時間x月の日数(≒30日だと720時間)の利用時間となり、無料枠月125時間を引いた508時間や595時間分が課金されていたのです。
![93c0069f63947a8a64dd026ae23cd78e.png](https://qiita-image-store.s3.amazonaws.com/0/147620/7b95a245-465f-2393-8b77-8d600e6e2d67.png)


###**無料枠？スケールダウン？**
GameLiftのチュートリアルには、「AWS無料利用枠では、このテストは完全に無料です。」と書かれています。
sampleビルドを放置した場合の記載もあります。
![5aacb5285e40e4bef58c3ddad9fcc25b.png](https://qiita-image-store.s3.amazonaws.com/0/147620/00c8f828-507a-9eeb-e21e-2017632a88b3.png)
![bf7b2be3233b9bfcd3c05cea0957f14f.png](https://qiita-image-store.s3.amazonaws.com/0/147620/27b87011-8546-2d3e-0287-9effb1668105.png)

6か月での削除はともかく、0にスケールダウンというのが、未だに私にはわかりません。

当時の私は、これらの記述で、すっかり「サンプルだから無料だよ、安全だよ」という風に読み取ってしまいました。
請求に気づいてから、フリートは削除しましたが、結局10～12月分の3か月分、合計5万円が引き落とされます。


###**チュートリアルがサービスの利用？**

インスタンスが使われているのですから、事実としては「利用」だということは理解できます。
しかし、自分で作成したものを置いたのならまだ納得できますが、ボタンぽちっとするだけの謹製チュートリアルで、(しかも途中のSTEPまでしかやってなくても)、本サービスを「利用」したことになり、数万の課金が発生してしまうというのは、どうなのでしょうか。
言葉は悪いかもしれませんが、クリック詐欺にあったような感覚です。


###**AWSは不親切だ**

細かくページを見ていくと、金額は料金表に載っている通りですし、アカウント作成時に合意をしてますし、クレジットカードも登録しているので、私の不注意なのでしょう。

しかしながら、このチュートリアルでの課金発生の仕組みはどうかと思います。
サポートに4通ほどメールを出しましたが、なんの連絡もないのもいただけません。


###**愚痴るしかない**

世間的には「あほな奴(私)」なのでしょうが、「『完全に無料』とか『0にスケールダウン』とか誤解するような書き方するんじゃねーよ！サービス側で用意したチュートリアルで請求するなよ。」とAWSに言いたいです。
きっとどこかの世界の誰かも被害？にあっているはず。

世間には不正アクセスで高額請求された記事などがありますが、不正どころか、私のように単なる間抜けな課金をされることにならないよう、AWSの「サンプル」とか「無料」の表現には気を付けてください。


***

###**追記(2017/12/29)**
AWSからとても丁寧な返信があり、今回に限り返金していただけるとのことでした。
親切にありがとう。