OmniAICreator/Qiita-1.07M huggingface dataset:
Raspbian Strech 初期設定 覚書

#Raspbian インストール 参考資料

* [2018-03-13-raspbian-stretch.zip ダウンロードページ](https://www.raspberrypi.org/downloads/raspbian/)
* [Etcher ダウンロードページ](https://etcher.io/)
* [Raspbian インストールガイド](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)

#初期設定 参考資料

* [初期設定マニュアル](https://qiita.com/JhonnyBravo/items/fb77933c019ba1489cdd#%E3%81%9D%E3%81%AE%E4%BB%96%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A)
* [日本語入力有効化](https://qiita.com/JhonnyBravo/items/fb77933c019ba1489cdd#%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E6%9C%89%E5%8A%B9%E5%8C%96)

#USB ブート 参考資料

* [Raspberry Pi 3とPi DriveでUSB HDDブートをしてみよう](https://www.raspi.jp/2016/08/rpi3-and-pidrive-usbboot/)
* [config.txt マニュアル](https://www.raspberrypi.org/documentation/configuration/config-txt/)
discordrbでなろう小説のタイトルを検索するbotを作ってみた


以下のようなコマンドで該当するなろう小説の本のタイトルが返ってくるというもの

```コマンド
/narou 本のタイトル
```

```botの返信
タイトル1
タイトル2
...
タイトル20
```
## 何故作ったのか
同じチャンネルの人がなろう小説の話をしていたのでdiscordのbot作成の練習に丁度いいと思ったため。
discordrbを使用したのは単純にRubyでコードを書くのが楽しいからです。

[今回作成したbot](https://github.com/ashemoira/narou_novel_bot)

## 今回使用したgem
### [discordrb](https://github.com/meew0/discordrb)
discordのbotを作成するため+rubyを使いたかったため使用

```
bot = Discordrb::Commands::CommandBot.new token: MY_TOKEN, prefix: '/'
bot.command :narou do |event, *args|
  # /narouコマンドの処理
end
```

### [typhoeus](https://github.com/typhoeus/typhoeus)
httpリクエストのために使用するgem
なろうの検索をリクエストするために使用

```
request = Typhoeus::Request.new('url')
request.run
```

### [nokogiri](https://github.com/sparklemotion/nokogiri)
httpリクエストで帰ってきたhtmlをパースするgem
本のタイトルを抽出するために使用

```
@doc = Nokogiri::HTML(response.response_body)
@doc.css('.tl').length.times do |index|
  zip << @doc.css('.tl')[index].inner_text << "\n"
end
```

## 処理の流れ
1. チャットに`/narou 本のタイトル`を入力する
2. なろうbotが指定した本のタイトルでhttpリクエストをする
3. 返ってきたhttpを本のタイトルだけを取り出すようにパースする
4. チャットにパースした本のタイトルを反映する

## 作ってみた感想
最初はbot作成は面倒だと思ったが、実際に作るとそんなことはなかった。むしろ楽しいです。
また、`discordrb`は使い方がwikiに乗っていたので詰まることがなかった。
`discordrb`の開発者に感謝! :tada: 

## 参考サイト
* https://qiita.com/deneola213/items/efaeb0f5c20d44608a71
* https://github.com/meew0/discordrb
* https://github.com/sparklemotion/nokogiri
* https://github.com/typhoeus/typhoeus
サブネットマスク(not CIDR)を使った計算が簡単にできるってそれ早く教えてよ！

# 前置き

サブネットマスクって、実務ではだいたいCIDR表記(サブネットマスクを桁数で指定。例：`/27`)なんじゃないのかな？と思うんですが、
IPA系の試験だと(午前にしろ午後にしろ)CIDRじゃない方の表記(サブネットマスクをIPと同じ表記で指定。例：`255.255.255.224`)で出題されることが多い気がします。
参考書の解説読んでると、だいたい、**ホストアドレスを求めるにはまずサブネットマスクを2進数に変換して〜**、って書いてますが、
**そんなことしなくても求められます。**

# 本題
## 具体例

具体的な問題でやってみます。

> ネットワークに接続されているホストのIPアドレスが198.51.100.90で，サブネットマスクが255.255.255.224のとき，ホストアドレスはどれか。
情報処理安全確保支援士 平成29年秋期 午前Ⅱ 問20

[IPA 独立行政法人 情報処理推進機構：問題冊子・配点割合・解答例・採点講評（2017、平成29年）](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29.html#29aki)
又は
[平成29年秋期問20 ホストアドレスはどれか｜情報処理安全確保支援士.com](http://www.sc-siken.com/kakomon/29_aki/am2_20.html)

この問題の解答は、「26」ですが、

```math
256 - 224 = 32 \\
90 \bmod 32 = 26
```
で求められます。
CIDR表記にした時のプレフィックス長を得たい場合は、

```math
256 - 224 = 32 = 2^5
```
で、この場合の $5$ が2進数表記にした時の0の数になる($224(10)=1110 0000(2)$であることがわかる)ので、
$8*3+(8-5)=27$で「/27」と求められます。

## 一般化
一般化すると、

「サブネットマスクが255.255.255.αの場合、IPアドレスA.B.C.xのホストアドレスは、

```math
x \bmod (256 - α)
```
となる。」

ということになります。
(プレフィックス長が24以下の場合は着目するオクテットをずらしてください。)

どうしてこれが成り立つかは、後でも少し書いてみますが、
各自手元で2進数表記に直して計算してみると、わりかし腑に落ちるのではないかと思います。

modの計算は場合によっては少し面倒かもしれませんが、
10進数→2進数変換が得意な人や、サブネットマスク関連の2進数表記を暗記している人以外であれば、こちらの方が楽なのではないでしょうか。

# 感想
これに自力で気づいた後にググってみると、同じようなことを解説しているサイトもありますが、
地道に2進数で計算する解法を解説しているサイトの方が多いような気がしました。
し、何より参考書などをやっていてお目にかかったことがないです。
こういうテクニックこそ、参考書で教えて欲しいんですが。。。

# 証明
せっかくなので、
`1{8-x}0{x}`の形で表せる二進数 $α$ について
$256 - α = 2^x$が成り立つこと
(=本題で書いた計算方法の前半(プレフィックス長の部分。後半部分はこれが分かれば自明。)
を証明っぽく書いてみます。(数学徒ではないので雰囲気だけ。。。)

--------------------
$α$ は、$2^x$の位から$2^7$の位までが$1$である数なので、以下のように表せる。

```math
α = \sum_{k=x}^{7}2^k　　　(1)
```
また、以下は自明に成り立つ。(`0xFF`を下$x$桁と上$8-x$桁に分けただけ)

```math
\sum_{k=0}^{7}2^k = \sum_{k=0}^{x-1}2^k + \sum_{k=x}^{7}2^k　　　(2)
```

$\sum_{k=0}^{7}2^k$ は当然 $255$ なので、$(1),(2)$より、

```math
255 = \sum_{k=0}^{x-1}2^k + α 　　(3)
```


ところで、以下も成り立つ。(1...に1を足すと繰り上がって10...になる)


```math
\sum_{k=0}^{x-1}2^k + 1 = 2^x 　　(4)
```

したがって、$(3),(4)$より、

```math
255 = (2^x - 1) + α 
```
これを変形して以下を得る。

```math
256 - α = 2^x
```

--------------------

正直$(4)$を自明にしていいならもっと直接的に示せる気がしますが。。。
なんちゃって証明ということで。。。 :boom:

ありがとうございました。
Factorioでmodを作ってみる-その2-

基本的には
[Factorio API Documents](http://lua-api.factorio.com/latest/)
を参考にLua Scriptを記述すればいい

参考になるのは
[英語wikiのModのTutorial](https://wiki.factorio.com/Tutorials#Modding_tutorials)

サンプルとして、ベルトを永遠に敷設できるModを開発してみる -> [ソース](https://github.com/bloodysnowx/InfinityBeltFactorioMod)

ファイルの配置は
`%AppData%\Factorio\mods\[Mod名のフォルダ]`
に下記画像のように`info.json`と`luaスクリプト`を配置すればよい

![infinityBelt.png](https://qiita-image-store.s3.amazonaws.com/0/16869/a4a5e2ee-e2f2-9bc7-7d31-e2f3c29fdce2.png)

# 特定のイベント発生時にイベントハンドラが呼び出されるように設定する

例としてはentityが建設された時にイベントハンドラが呼び出されるように設定

 ```lua:event.lua
script.on_event(defines.events.on_built_entity, on_built_entity_event)
```

なお、イベント一覧に関しては
[Events](http://lua-api.factorio.com/latest/events.html)を参照

# イベントハンドラ内で自作関数を呼び出すように設定する

例としてはベルトが敷設された場合にプレイヤーとアイテムを引数として関数を呼び出すように設定
  
```lua:eventHandler.lua
local on_built_entity_event = function(event)
  local player = game.players[event.player_index]
  local item = event.created_entity
  if item.type == "transport-belt" or item.type == "underground-belt" then
    refill_belts(player.get_main_inventory(), item.name)
  end
end
``` 

# やりたいことを関数内に記述する

例としては引数として渡されたプレイヤーが同じく引数として渡されたベルトを50未満しか所持していない場合は1追加するように設定

```lua:refillBelts.lua
local refill_belts = function(inventory, belt)
  local belt_count = inventory.get_item_count(belt)
  if belt_count < 50 then
    inventory.insert{name=belt, count=1}
  end	
end
```

なお、アイテムの種類や名前に関しては
[Factorio wikiのData.raw](https://wiki.factorio.com/Data.raw)あたりに揃っているので参照。また、デバッグして確認したければ

```lua
local player = game.players[event.player_index]
local item = event.created_entity
player.print(item.type)
player.print(item.name)
```

のようにprint出力させてみてもいい
【SQL】テーブル作成

#テーブル作成

##基礎

↓基本の形

```sql
create table テーブル名 (
 列名1 型名,
 列名2 型名
)
```

↓イメージ

```sql
create table bookstore(
 id integer,
 name varchar(100),
 price integer
)
```

##デフォルト値の設定
insert時に、値が設定されなかった場合のデフォルト値を設定することが可能。

↓基本の形

```sql
create table bookstore (
 列名 　型名 default デフォルト値
)
```

↓イメージ

```sql
create table bookstore (
 id integer,
 name varchar(100) default '不明',
 price integer default 0
)
```

##4つの制約（not null / check / unique / primary key）
人為的ミスに備えて、create table時に制約を設定することが可能。

###not null（入力必須に設定）

↓基本の形

```sql
create table テーブル名 (
列名 型名 not null
)
```

↓イメージ
補足：not nullを設定している列に、default値を設定するとエラーが起きないので、合わせて利用されることが多い。

```sql
create table bookstore (
id integer not null
name varchar(100) default '不明' not null
)
```

###check（格納される条件を設定）
条件式がtrueになる値だけ格納が可能。

↓基本の形

```sql
create table テーブル名 (
列 型名 check (条件~)
)
```

↓イメージ

```sql
create table bookstore (
id integer not null,
name varchar(100) default '不明'
price integer default 0 check (price >= 0)
)
```

###unique（値を重複させない設定）
重複していない値だけを格納することが可能。

↓基本の形

```sql
create table テーブル名 (
列名 型名 unique
)
```

↓イメージ


```sql
create table bookstore (
id integer not null,
name varchar(100) default '不明' unique,
price integer check (price >= 0)
)
```

###primary key（主キーの設定）
主キーの役割を持つ列には、primary keyを設定。

↓基本の形

```sql
create table テーブル名 (
id integer primary key
)
```

↓イメージ

```sql
create table bookstore (
id integer primary key
)
```

##外部キーとの整合性
外部キーが示す先のテーブルに行があり、リレーションが成立していることを「参照整合性」と呼ぶ。
これが崩壊している現象を「参照整合性の崩壊」
参照整合性が崩壊しないように設定することが可能。

↓基本の形

```sql
create table テーブル名(
列名 型名 references 参照先テーブル名(参照先列名)
)
```

↓イメージ

```sql
create table bookstore (
id integer references author (id)
)
```

##列の追加と削除
既存のテーブルに対して、列の追加や削除を行うことが可能。

###列の追加
↓基本の形

```sql
alter table テーブル名 add 列名 型名 制約
```

↓イメージ

```sql
alter table bookstore add memo varchar(100) default 'なし'
```

###列の削除
↓基本の形

```sql
alter table テーブル名 drop　列名 型名 制約
```

↓イメージ

```sql
alter table bookstore drop memo varchar(100) default 'なし'
```

##テーブルの削除

↓基本の形

```sql
drop table テーブル名
```

↓イメージ

```sql
drop table bookstore
```
GitでClone via sshしようとしてエラーがでたとき

###こんなエラーがでたときの対処方法

> git@gist.github.com: Permission denied (publickey).
> fatal: Could not read from remote repository.
> Please make sure you have the correct access rights
> and the repository exists.

1. Open git bash (Use the Windows search. To find it, type "git bash") or the Mac Terminal. __Pro Tip:__ You can use any `*nix` based command prompt (but *not* the default Windows Command Prompt!)
2. Type `cd ~/.ssh`. This will take you to the root directory for Git (Likely `C:\Users\[YOUR-USER-NAME]\.ssh\` on Windows)
3. Within the `.ssh` folder, there should be these two files: `id_rsa` and `id_rsa.pub`. These are the files that tell your computer how to communicate with GitHub, BitBucket, or any other Git based service. Type `ls` to see a directory listing. If those two files don't show up, proceed to the next step. __NOTE:__ Your SSH keys must be named `id_rsa` and `id_rsa.pub` in order for Git, GitHub, and BitBucket to recognize them by default.
4. To create the SSH keys, type `ssh-keygen -t rsa -C "your_email@example.com"`. This will create both `id_rsa` and `id_rsa.pub` files.
5. Now, go and open `id_rsa.pub` in your favorite text editor (you can do this via Windows Explorer or the OSX Finder if you like, tpying `open .` will open the folder).
6. Copy the contents--exactly as it appears, with no extra spaces or lines--of `id_rsa.pub` and paste it into GitHub and/or BitBucket under the Account Settings > SSH Keys. 
__NOTE:__ I like to give the SSH key a descriptive name, usually with the name of the workstation I'm on along with the date.
7. Now that you've added your public key to Github and/or BitBucket, try to `git push` again and see if it works. It should!

More help available from [GitHub on creating SSH Keys](https://help.github.com/articles/generating-ssh-keys) and [BitBucket Help](https://confluence.atlassian.com/display/BITBUCKET/Troubleshooting+SSH+Issues).


引用：https://gist.github.com/adamjohnson/5682757#file-publickey-git-error-markdown
Ubuntu 16.04にPython PCL bindingをインストールしてみた

## 環境
- Python3.5
- Python virtualenv 15.0.1
- PCL 1.7.2
- Cython 0.25.2

## インストール
```
$ sudo apt install python3-virtualenv
$ virtualenv -p python3 --no-site-packages venv/realsense
$ source vent/realsense/bin/activate
$ pip install numpy 
$ pip install Cython==0.25.2
$ git clone https://github.com/strawlab/python-pcl.git
$ cd python-pcl
$ python setup.py build_ext -i
$ python setup.py install
```

## 動作確認
```
$ python
import pcl
```
GitHubにpushしようとしたらアカウントが競合してpushできないときの対処法

Githubのプライベートアカウントを最初に作り、パブリックアカウントを後から作りました。
パブリックアカウントでpushしようとしたらエラー...

#Permissionと403エラー

プライベートアカウント→ユーザーA
パブリックアカウント→ユーザーB

```
remote: Permission to ユーザーA/リポジトリ名 denied to ユーザーB.
fatal: unable to access 'https://github.com/ユーザーA/リポジトリ名': The requested URL returned error: 403
```

間違えてプライベートアカウントでcloneしてた？
まずは状況確認

```
git config --global --list
user.name=ユーザーB
user.email=ユーザーBのメアド
```
ちゃんとパブリックアカウントになってる...
「Github push permission 403」でググりました

#緊急解決策の参考

[GitHub リポジトリに git push したら Permission が denied](https://qiita.com/tanishilove/items/3164ecf3f16585fa3bf2)

>取り急ぎ解決策として

>```
>$ git remote set-url origin https://hoge@github.com/hoge/abc.git
>$ git push origin master
>Password for 'https://hoge@github.com': 
>```
>パスワード入れると無事に push されました(^^)


↑の通りでpushできました
しかし、再度pushしようとしたところ同じエラーが出てpushできず...

#cloneしなおす
cloneするときのURLにユーザー名入れると認証されると読んだので試してみる(どこで読んだかわからなくなりました...すみません)
ローカルリポジトリを一旦削除して再びclone

```
git clone https://ユーザーB@github.com/ユーザーB/リポジトリ名
```
↑**ユーザーB＠** を追加してます


再度push...


**成功！！**

テストとして何度かpushしても大丈夫だったので、この方法でアカウントが認証されたということでしょう
fetchAPIでgetをする時にパラメータをつける方法

# 概要
Web標準の技術を利用してfetchAPIのgetパラメータにクエリストリングをくっつけたかったのだが、調べてもあまりまとまったものが出てこなかったのでメモ。
# 実装

fetchAPIの他に`URL`と`URLSearchParams`の2つのAPIを利用する。
以下に示す基本的な形を使って、2箇所だけ修正すれば、自在にクエリのついたリクエストを送ることができる。

```js
let data = []; // 修正箇所1
let url_string = 'https://fetchしたいURL';
let url_obj = new URL(url_string);
let params = new URLSearchParams(); // もしくは url_obj.searchParams
data.map(tag_key => params.append('key','val')); // 修正箇所2
url_obj.search = params.toString();
fetch(url_obj.toString())
```
やっていることの簡単な説明は、URLオブジェクトを作成して、URLオブジェクトのsearchプロパティに、URLSearchParamsオブジェクトから生成したパラメータを代入して書き換えてあげる。`params`の初期化の部分では2パターンの書き方を書いているが、変数`url_string`にもともとついているgetパラメータを再利用したい場合は`url_obj.searchParams`を使えばいいと思う。

さて、実際に使ってみよう。
検索画面で、タグを複数選択して、検索する時を想定する。
選択したタグのキーは1と2とするときは、修正箇所1が以下のようになると思う。

```js
let data = ['1', '2'];
```
そして、このキー値をパラメータに設定するために修正箇所2を以下のようにして、dataの中のデータを順繰りに変数`params`に追加してくれるようにする。

```js
data.map(tag_key => params.append('tags[]', tag_key));
```
appendの第一引数はgetパラメータのkeyで、第二引数はvalueとなる。また、第一引数のkeyを重複してappendしても、値は上書きされないという仕様のおかげで、`tags[]`のキーを持つデータを複数appendするとうまい具合に配列をgetパラメータとして渡すことができる。

全容は以下である。

```js
let data = ['1', '2'];
let url_string = 'https://fetchしたいURL';
let url_obj = new URL(url_string);
let params = new URLSearchParams(); // もしくは url_obj.searchParams
data.map(tag_key => params.append('tags[]', tag_key));
url_obj.search = params.toString();
fetch(url_obj.toString())
```

# おわりに

`search`プロパティにパラメータをセットする時にtoStringで展開してあげないといけない部分が、URLSearchParamsオブジェクトをそのままつっこめると、

```js
url_obj.search = params;
```
みたいにできて嬉しい気がする。そんなに変わらないけど。
おい、ChromeでPicture In Pictureできるようになったぞ(2018/04/15)

どうも！！！！！！

![k.png](https://qiita-image-store.s3.amazonaws.com/0/154157/3b8cc9a8-5fa9-7c16-5589-b8a6a9e88187.png)


Mac OSのSafariなどで使える、Picture In Picture。任意の動画をポップアップウィンドウで再生できる機能です。
それが、ついにGoogle Chromeで使えるようになりました。
Youtubeなどのストリーミングでも正常に動作します。

# インストール

現行のGoogle Chrome、Google Chrome beta、Google Chrome developer、またChromiumでも対応されていません。
現在確認しているのは、毎日ビルドされる超不安定版Chrome、その名も`chromium snapshot`です。
これは、最新のchromiumのソースをビルドして作られるChromeで、一番のベータ版となっています。

リンク: https://www.chromium.org/getting-involved/download-chromium

Archlinuxの場合はAURがあるのでコマンド一発です。

```
$ yaourt -S chromium-snapshot-bin
```

自分が動作を確認したバージョンは、`68.0.3398`です。

# 有効化

`chrome://flags`とURL欄に入力すると、開発者向けの実験機能を有効化するページを開けます。
そこで`Enable Picture-in-Picture`という項目で、ドロップダウンを`Disabled`から`Enabled`に変更しましょう。

# 使い方

動画などの再生エリア（<video>）の上で、右クリックをします。（Youtubeなど、オリジナルの右クリックメニューが搭載されている場合はダブル右クリック）
そうすると、「ピクチャー　イン　ピクチャー」という項目が増えているので、そこをクリックします。
そうすると、常に最前面で枠なしのウィンドウで動画が再生され始めます。

それでも再生されない場合、「コントロールを表示」を選択し、動画右下の縦三点リーダーを選択、「ピクチャー　イン　ピクチャー」を選択しましょう。

10回に1回ほどブラウザがクラッシュし、5回ほどタブがクラッシュし、3回ほど再生されなくなります。運です。

![k.jpg](https://qiita-image-store.s3.amazonaws.com/0/154157/d50f662b-d851-6c82-976f-51b881ad0a4f.jpeg)
![k1.jpg](https://qiita-image-store.s3.amazonaws.com/0/154157/43e2ad52-3fde-1074-3849-f6321d2e443d.jpeg)


# まとめ

Picture In Pictureは、動画を再生しながら別の作業をする場合にとても便利な機能です。
未だ不安定で、リリースビルドには含まれていませんが、ぜひともこれから安定化してほしいところです。

ちなみに、記念すべきマージコミットは以下のようです。
https://chromium-review.googlesource.com/c/chromium/src/+/854719/
Unityで便利なイメージエフェクトシステム Post Processing Stack を使う方法

# はじめに
UnityでPost Processingを使う方法です。
全体の流れを見てわからないところは詳細な手順でご確認下さい。
今回は例として画面全体をぼかしてみます。

Unity 2017.3 で確認。

# 全体の流れ
1. Post Processing Stack をAssetストアから入れる
2. カメラに Post Processing Behaviour を追加
3. Post-Processing Profile を作成し，3. に適用
4. Post-Processing Profile を調整

# 詳細な手順
## アセットストアからPost Processing Stackを取ってくる
### 1. **アセットストア**を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/22e4ff2c-19d3-3f53-2906-5372ce45bbc5.png)

### 2. Post Processing Stack を **ダウンロード**
上の検索欄に **Post Processing Stack** と入力して検索してAssetを探し出し，**ダウンロード**をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/74c39217-67d7-afb3-9719-73fbe0157cbf.png)

ダウンロードが完了するまでしばらく待ちます。

### 3. Post Processing Stack を **インポート**
ダウンロードが完了したらプロジェクトにインポートしていきます。
まずは**インポート**をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/d109d51e-5368-45cb-863e-994004fe9f66.png)

少し待つと Import Unity Package が表示されるので **Import** をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/b067ecab-4dcc-1ce8-bc79-35f3e09332ea.png)

ImportとHold Onが完了するまでしばらく待ちます。

途中で API Update Required が出てきてAPIの更新を要求されるかもしれませんが，その場合は一応バックアップを取ってから **I Made a Backup. Go Ahead!** をクリックして下さい。
（終了すると Finished updating scripts / assemblies とコンソールに表示されます。）

これらが終了すると Projectビュー に PostProcessing というフォルダが追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/010fda4d-41e1-d1f1-4760-b10e9332be51.png)

## Post Processing Stack を適用する
ここから，Post Processing Stack を適用してエフェクトをかけていきます。

### 1. Post Proccessing Behaviour を追加
1. Main Camera を選択
2. Add Component
3. post と検索
4. Post-Processing Behaviour をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/c574d7cd-e120-8e08-7dc0-f16db16af5c3.png)

### 2. Post-Processing Profile を作成
1. Projectビューで **Create** をクリック
2. **Post-Processing Profile** をクリック 
3. 適当に名前を付ける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/e54e2ba0-ae3d-532d-cd82-71210d7f60d8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/233ff964-65f3-f75f-fdf5-e75c322464f4.png)

今回はそのままの名前にしました。
必要な場合はファイルの場所も変更して下さい。

### 4. 生成したProfileの適用
1. Main Camera を選択
2. 先程追加した Post Processing Behaviour の Profile に 先程生成したプロファイルを紐づけ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/1ed39f4c-32b6-8c9b-7143-3ac2cff8e4aa.png)

### 5. Profile の変更
ここからは， Profile を変更することで効果を付けていきます。

1. 先ほど作成した Post-Processing Profile を選択
2. Inspectorビューでエフェクトを調整

各項目の内容に関しては [公式ドキュメント - Post Processing Stack :link:](https://docs.unity3d.com/ja/current/Manual/PostProcessing-Stack.html) を参照して下さい。

ためしに [被写界深度 :link:](https://docs.unity3d.com/ja/current/Manual/PostProcessing-DepthOfField.html) を変更することで画面全体にぼかしをかけてみます。

1. Depth Of Field にチェックを入れる
2. Focus Distance を 0.1 に変更する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/765f5d0f-75b1-2f2c-61de-8316a64bc0ba.png)

カメラの焦点距離が変更され，画面全体をぼかすことができました！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9814/619b03cb-e6c5-b597-3345-87665c7e4c53.png)

以上です。

# 参考
[公式ドキュメント - Post Processing Stack :link:](https://docs.unity3d.com/ja/current/Manual/PostProcessing-Stack.html)
Laravel - ページングを実装するためLengthAwarePaginatorを使ってみた

Laravelでページングを実装するには、主に

1. DB(Eloquent、クエリビルダ)のpaginateを使う
2. Paginatorクラスを使う
3. LengthAwarePaginatorクラスを使う

の３種類の方法があります。

1つのテーブルから取ってきたデータを表示する場合は、1が簡単でオススメですが、複数のテーブルにまたがったりして1の方法が使えない時に2,3の方法が使えます。

今回、3のLengthAwarePaginatorを使ったやり方を試してみたので同じことをしようとしている人の参考になればと思い、記事を書こうと思いました。
先に作ったコードを示します。


```php:testController.php
public function makePagination(Request $request, array $result, int $perPage)
    {
        $displayData = array_chunk($result, $perPage);
        $currentPageNo = $request->input('page', 1);

        $pagination = new LengthAwarePaginator(
            $displayData[$currentPageNo - 1],
            count($result),
            $perPage,
            $currentPageNo,
            array('path' => $request->url())
        );

        return $pagination;
    }
```

本来はコントローラにあまりルーティングに関係ない処理を書かない方がいいようなのですが、Requestを使った方が簡単に書けると思い、コントローラに書いてしまいました。　理想的な実装箇所等ありましたらコメントいただけると幸いです。

本題に戻りますが、このメソッドは、

- リクエストデータ
- ページネーションを作成したいデータの配列
- 1ページに表示したい数

を引数にとり、LengthAwarePaginatorのインスタンス(ページネーションのデータ)を返します。

中で行なっていることは、

1. 1ページに表示したい数に合わせて配列を分割
2. 現在のページを取得
3. ページネーションを作成
    - 引数
       - 該当ページに表示するデータ
       -  全件数
       -  1ページに表示する数
       -  現在のページ番号
       -  オプション

見たままですがこんな感じです。


ちなみにview側では、このように使います。

```
{{ $result->links() }}
```
検索条件等を保持しておきたい場合は、

```
{{ $result->appends($searchConditions)->links() }}
```

このようにすることでページネーターにデータを渡すことができます。



この記事は以上です。
最後までお読みいただきありがとうございます。
この記事が誰かの参考になることを心から願っています。
GIMPのUIをPhotoshop風に変える手順

Photoshopの代わりにGIMPを使っている方が多いかと思いますが、GIMPのUIをPhotoshop風に変える方法を今回はご紹介します。

##↓Photoshop風のテーマに変更後のGIMP画面↓
![スクリーンショット 2018-04-14 15.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/89106/b3c5d03e-6512-c289-7a8a-d45e9de7017a.png)

##作業環境
MacBook Air
GIMP 2.8

##手順

①下記URLからPhotoshop風のテーマをインストールする。
https://github.com/draekko/gimp-cc-themes/

![スクリーンショット 2018-04-15 20.18.11.png](https://qiita-image-store.s3.amazonaws.com/0/89106/6f47a70d-bc52-3ce3-f7d8-75e3a9e08473.png)

※ 私は一番上の「Gimp-CC-Theme-Darker」というテーマにしました。
※ インストール先は[ Macintosh HD / ユーザ / ホームフォルダ /ライブラリ / Application Support / GIMP /2.8 / themes ] です。

②[GIMP>設定>テーマ]を開き、インストールしたテーマに変更する。
![スクリーンショット 2018-04-15 20.27.24.png](https://qiita-image-store.s3.amazonaws.com/0/89106/57da4ab6-a2b9-c3be-b734-53951df09a8f.png)

![スクリーンショット 2018-04-15 20.27.37.png](https://qiita-image-store.s3.amazonaws.com/0/89106/cf3dd048-fd1c-f5cf-6822-f1f8dd428824.png)

ツールボックスのアイコンの画質が荒いところが若干気になりますが、GIMPのデフォルトテーマより洗練されていていい感じです。
flowが死んでるときに試すこと

flowが反応しなくなることがよくあるので試すことを書いた

##状態の確認

### flowがエディタ上で反応するか

```js
const foo: number = 'bar'
```
上のような、明らかにエラーが出る代入を書いてみる。

### flowサーバーが動いているか
```
yarn run flow
```

## flowサーバーは動いているがエディタが反応しない時は
### エディタをリフレッシュする

vscodeであれば、再読込すればOK

## flowサーバーが起動しない場合
```
The flow server is not responding (0 retries remaining): /
Out of retries, exiting!
error Command failed with exit code 7.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```
こんな感じのメッセージが出る。

### globalのバージョンとcurrent projectとのバージョンに差分がないか確認する

`yarn global ls`の結果とpackage.jsonを見比べる。
差分がある場合は合わせるか、globalを消す
### 最終手段：再インストール
自分はたまになる。

```
yarn remove flow

yarn add -D flow
```
ScalaでDomain層にFirst Class Collectionを作るときのテクニック(JSON)

## 悩み

Domain駆動設計を採用しており、Domain層をPOJO(ScalaだとPOSO?)に作りたいってなったら、First Class Collectionを作るにしても、なんやかんやで、mapとか使いたくなることが多い。

とはいえ、そこで、mapを使えるようにしたら、なんか負けた気がするので、ちょっとしたテクニックで回避してみた。

## 課題

`SomethingEntity` の集合を保持するFirst Class Collectionを想定する。

```scala
case class SomethingEntity(id: SomethingId)

case class SomethingEntities(value: Seq[SomethingEntity])
```

この `SomethingEntities`の保持しているデータを全部JSONにしたいとき、

```scala
somethingEntites.value.map { somethingEntity =>
  convertToJson(somethingEntity)
}

// convertToJsonで好きなJSONライブラリを使って変換するのを想定している
```

みたいな感じにしたら意味ないよねって前提。

First Class Collectionだから、そもそも、classは、

```scala
case class SomethingEntities(private val value: Seq[SomethingEntity])
```

って感じで、 `private` にする。

すると、

```scala
somethingEntites.value.map { somethingEntity =>
  convertToJson(somethingEntity)
}
```

のvalueが取れなくてコンパイルエラーになる。

`convertToJson` 部分はライブラリに依存するから、

```scala
case class SomethingEntities(private val value: Seq[SomethingEntity]) {
  def toJson: Seq[String] =
    value.map(v => convertToJson(v))
}
```

みたいな実装はできない。(あくまでPOSOにこだわるなら。ただし、JSONはDomainに依存させても良いじゃんって場合はぜんぜん良いと思う。)

## 解決策

うすいJsonWriter的なtraitを定義だけしておいて、実装はお任せ的なことにするといける。

```scala
trait SomethingEntitiesWriter[JSON] {
  def toJson(entity: SomethingEntity): JSON
}
```

これを宣言しておいて、

```scala
case class SomethingEntities(private val value: Seq[SomethingEntity]) {
  def toJson[JSON](implicit writer: SomethingEntitiesWriter[JSON]): Seq[JSON] =
    value.map(writer.toJson)
}
```

みたいな感じ。

こうしておいて、 `SomethingEntitiesWriter` を以下みたいに実装する。

```scala
implicit object SomethingEntitiesWriterImpl extends SomethingEntitiesWriter[String] {
  override def toJson(entity: SomethingEntity): String =
    convertToJson(entity)
}

// convertToJsonで好きなJSONライブラリを使って変換するのを想定している
```

この `implicit object` をスコープに入れておいて、

```scala
somethingEntites.toJson[String]
```

と呼び出せば、良い感じに中のCollectionに直接アクセスしないで全部のEntityを `Seq[String]` にしてくれる感じが出来る。

このテクニック使えば、大体のことはいける気がする。

以上です。
Factorioでmodを作ってみる-その1-

基本的には
[Factorio API Documents](http://lua-api.factorio.com/latest/)
を参考にLua Scriptを記述すればいい

参考になるのは
[英語wikiのModのTutorial](https://wiki.factorio.com/Tutorials#Modding_tutorials)

サンプルとして、ゲーム開始時に任意のアイテムを所持するModを開発してみる -> [ソース](https://github.com/bloodysnowx/RobotStartFactorioMod)

ファイルの配置は
`%AppData%\Factorio\mods\[Mod名のフォルダ]`
に下記画像のように`info.json`と`luaスクリプト`を配置すればよい

![robotStart.png](https://qiita-image-store.s3.amazonaws.com/0/16869/0377ee1c-501a-f8b5-b290-111904e39070.png)

# 特定のイベント発生時にイベントハンドラが呼び出されるように設定する

例としてはゲーム開始時にプレイヤーが生成された時にイベントハンドラが呼び出されるように設定

 ```lua:event.lua
script.on_event(defines.events.on_player_created, on_player_created_event)
```

なお、イベント一覧に関しては
[Events](http://lua-api.factorio.com/latest/events.html)を参照

# イベントハンドラ内で自作関数を呼び出すように設定する

例としては生成されたプレイヤーを引数として関数を呼び出すように設定
  
```lua:eventHandler.lua
local on_player_created_event = function(event)
  local player = game.players[event.player_index]
  add_items(player)
end
``` 

# やりたいことを関数内に記述する

例としては引数として渡されたプレイヤーにロボット系のアイテムをいくつか所持するように設定

```lua:addItem.lua

local ITEMS_I_WANT = {
  {"roboport", 25},
  {"logistic-robot", 300},
  {"construction-robot", 100},
  {"logistic-chest-passive-provider", 200},
}

local add_items = function(player)
  for _,item in pairs(ITEMS_I_WANT) do
    if game.item_prototypes[item[1]] ~= nul then
      player.insert{name=item[1], count=item[2]}
    end
  end
end
```

なお、アイテム一覧に関しては
[Factorio wikiのData.raw](https://wiki.factorio.com/Data.raw)あたりに綺麗に揃っているので参照
デコレーターを使って関数の実行時間を計測・表示する

Python3を使っています。

## 実装

```python
from datetime import datetime
from time import sleep

def print_process_time(func):
    """ 関数の実行時間を表示する
    """
    def wrapped(*args, **kwargs):
        start = datetime.now()
        result = func(*args, **kwargs)
        process_time_sec = (datetime.now() - start).total_seconds()
        print("Process time: %f sec" % process_time_sec)
        return result
    return wrapped


@print_process_time
def foo_method():
    """ 計測対象の関数
    """
    print("foo_method start")
    sleep(1.5)
    print("foo_method end")


if __name__ == "__main__":
    foo_method()

```

## 実行

```
% python3 foo.py
foo_method start
foo_method end
Process time: 1.500384 sec
```
DialogFragmentでボタンを押されたときに勝手に閉じないようにする

Xamarin.Formsでカスタムダイアログを表示するために，DependencyService経由でAndroidのDialogFragmentを使っていました．
OKボタンを表示するにはAlertDialog.Builder.SetPositiveButton(...)を指定すればいいのですが，この方法だとコールバック終了後に必ずダイアログが閉じてしまいます．

入力欄があるダイアログなどでは入力内容によっては閉じさせたくないので，ボタンが押されたときに閉じる・閉じないを切換できる方法を調べました．

以下はC#およびDialogFragmentを利用したサンプルになります．

```c#:MyDialog.cs
public class MyDialogFragment : DialogFragment, IDialogInterfaceOnShowListener {

	readonly Context	context_;
	private AlertDialog	dialog_;

	public static MyDialogFragment Instance(Context context, string title){
		Bundle bundle = new Bundle();
		bundle.PutString("title", title);

		var fragment = new MyDialogFragment(context);
		fragment.Arguments = bundle;
		return fragment;
	}

	public MyDialogFragment(Context context){
		context_ = context;
	}

	public override Dialog OnCreateDialog(Bundle savedInstanceState){
		var title = Arguments.GetString("title");

		var layout = new Android.Widget.LinearLayout(context_);
		var builder = new AlertDialog.Builder(context_)
			.SetIcon(Android.Resource.Drawable.IcDialogInfo)
			.SetTitle(title)
			.SetView(layout);

		// (1)コールバック関数なしでボタンを登録する
		builder.SetPositiveButton("OK", (EventHandler<DialogClickEventArgs>)null);

		dialog_ = builder.Create();
		dialog_.SetOnShowListener(this);

		return dialog_;
	}

	// (2)ダイアログが表示された時にボタンにコールバックを割当てる
	public void OnShow(IDialogInterface dialog){
		// ダイアログが表示された後でないとButtonを取得できない
		var okButton = dialog_.GetButton((int)Android.Content.DialogButtonType.Positive);
		okButton.Click += OkEventHandler;
	}

	// OKボタンが押されたとき
	private void OkEventHandler(object sender, EventArgs args){
		// (3)条件を満たした場合はDismiss()でダイアログを閉じる
		if(is_satisfy_close_condition())
			dialog_.Dismiss();
	}

}

public class MyDialog {

	const string	FRAGMENT_TAG	= "MyDialog_Fragment";

	public static MainActivity	CurrentActivity	{ private get; set; }

	private MyDialogFragment	fragment_	= null;

	public void Show(string title){
		var manager		= CurrentActivity.FragmentManager;
		var transaction	= manager.BeginTransaction();

		var previous = manager.FindFragmentByTag(FRAGMENT_TAG);
		if(previous != null)
			transaction.Remove(previous);

		transaction.DisallowAddToBackStack();
		fragment_ = MyDialogFragment.Instance(CurrentActivity, title);
		fragment_.Show(manager, FRAGMENT_TAG);
	}
}
```

要点は(1)～(3)の3箇所だけです．
ダイアログが表示された後でないとGetButton(...)がnullを返すのも地味に分かりにくいですね．

# 参考

- [Prevent an AlertDialog from closing on PositiveButton click | Xamarin Forums](https://forums.xamarin.com/discussion/12931/prevent-an-alertdialog-from-closing-on-positivebutton-click)
Flask で複数のファイルをアップロードする

Flask で複数おファイルをアップロードする方法です。

次の２つのファイルが必要です。
>multi_upload.py
static/upload.html

```py:multi_upload.py
# -*- coding: utf-8 -*-
#
#	multi_upload.py
#
#					Apr/15/2018
#
# ------------------------------------------------------------------
from flask import Flask, request, make_response, jsonify
import os
import sys
import werkzeug
from datetime import datetime

# flask
app = Flask(__name__)

# limit upload file size : 1MB
app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024
#
#
UPLOAD_DIR="/tmp"

# ------------------------------------------------------------------
@app.route('/data/upload', methods=['POST'])
def upload_multipart():
    sys.stderr.write("*** upload_multipart *** start ***\n")
    if 'uploadFile' not in request.files:
        make_response(jsonify({'result':'uploadFile is required.'}))
#
    upload_files = request.files.getlist('uploadFile_aa')
    sys.stderr.write("len(upload_files) = %d\n" % len(upload_files))
    for file in upload_files:
         fileName = file.filename
         sys.stderr.write("fileName = " + fileName + "\n")
         saveFileName = datetime.now().strftime("%Y%m%d_%H%M%S_") \
           + werkzeug.utils.secure_filename(fileName)
         file.save(os.path.join(UPLOAD_DIR, saveFileName))
#
    sys.stderr.write("*** upload_multipart *** end ***\n")
#
    return make_response(jsonify({'result':'upload OK.'}))

# ------------------------------------------------------------------
@app.errorhandler(werkzeug.exceptions.RequestEntityTooLarge)
def handle_over_max_file_size(error):
    print("werkzeug.exceptions.RequestEntityTooLarge")
    return 'result : file size is overed.'

# ------------------------------------------------------------------
# main
if __name__ == "__main__":
    print(app.url_map)
    app.run(host='localhost', port=3000)
#
# ------------------------------------------------------------------
```

```html:static/upload.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<form action="/data/upload" method="post" enctype="multipart/form-data"> 
  <input type="file" name="uploadFile_aa"/ multiple="multiple">
  <input type="submit" value="submit"/>
</form>
</body>
</html>
```

サーバーの起動

```bash
python multi_upload.py
```

ブラウザーで次にアクセス
>http://localhost:3000/static/upload.html
![flask_apr1501.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f36b5ca3-1aca-9662-7396-896ec25551bb.png)

ファイルを選択して、Submit をクリックすれば、/tmp にファイルがアップロードされます。
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(41) 5.2.8 Type identification [expr.typeid] p112

# はじめに
N4606 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/#mailing2016-11
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的な擦れの確認が結果としてできれば幸いです。

## list
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

## Compiler
### clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)

### g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

#(41) 5.2.8 Type identification [expr.typeid]
p112

```c++:p112.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 
#define msg "p112.cpp (41) 5.2.8 Type identification [expr.typeid]"

#include <iostream>
#include <typeinfo>  

class D { /* ... */ };
D d1;
const D d2;

int main(){
std::cout <<std::endl << "typeid(d1) == typeid(d2);"<< (typeid(d1) == typeid(d2)); // yields true
std::cout  <<std::endl <<"typeid(D) == typeid(const D); "<<(typeid(D) == typeid(const D)); // yields true
std::cout  <<std::endl <<"typeid(D) == typeid(d2); "<<(typeid(D) == typeid(d2)); // yields true
std::cout  <<std::endl <<"typeid(D) == typeid(const D&); "<<(typeid(D) == typeid(const D&)); // yields true
std::cout  <<std::endl;  
std::cout << msg << std::endl;
  return EXIT_SUCCESS;
}
```

```shell_session
i$ ./cppgl17.sh p112
$ clang++ p112.cpp

typeid(d1) == typeid(d2);1
typeid(D) == typeid(const D); 1
typeid(D) == typeid(d2); 1
typeid(D) == typeid(const D&); 1
p112.cpp (41) 5.2.8 Type identification [expr.typeid]

$ g++-7 p112.cpp

typeid(d1) == typeid(d2);1
typeid(D) == typeid(const D); 1
typeid(D) == typeid(d2); 1
typeid(D) == typeid(const D&); 1
p112.cpp (41) 5.2.8 Type identification [expr.typeid]
```

# 検討事項
　コンパイルエラーにならない修正。
　内容の出力。
　g++とclang++のエラーの違いの説明。

# 参考資料

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d
# 文書履歴
ver. 0.10 初稿 2080415
ver. 0.11 URL追記　20230215
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
キーワード専用引数

# 環境
python3

# キーワード引数
```python
def func1(value1, value2):
  print(f'{value1}, {value2}')
```
渡された引数を表示するだけの簡単な関数func1は以下の呼び出し方のいずれでも呼び出せる。

```python
func1(1, 'a')
func1(value1=1, value2='a')
func1(1, value2='a')
```

# キーワード専用引数
```python
def func2(value1, *, value2):
  print(f'{value1}, {value2}')
```
この関数の定義のように引数の宣言に\*をつけた場合は、\*以降の引数はキーワード引数にしないと呼び出せなくなる。

```python
func2(1, value2='a')        # 呼び出しOK
func2(1, 'a')               # エラー
```
引数が多い場合とか、同じような値を複数渡す場合には、キーワード専用引数にしたほうが意図がわかりやすくなる。
Linuxに入れて便利だったもの（そのうち増えます）

Guake
通称どこでもターミナル(勝手に命名)
F12を押せば画面上にターミナルが出現します。
隠すときもF12で済む

通常のターミナルでも｢Ctr｣｢Alt｣｢T｣の同時押しで出せるけどね
XlsxWriterで文字列データに条件付き書式を適用させるときの注意

最近個人的に、Pandasでこねくり回したデータをExcelで提供する機会が増えております。その際、条件付き書式で躓いたのでメモ。

思い込みで criteria に '=' を設定してみるとうまく動作しませんでした。これはダメな例。

```bad_condition.py
worksheet.conditional_format('A1:A4', {'type':     'text',
                                       'criteria': '=',
                                       'value':    'foo',
                                       'format':   format1})
```
で、あらためて[ドキュメント](http://xlsxwriter.readthedocs.io/working_with_conditional_formats.html)を読んでみると、テキストデータに対して設定できるcriteriaは以下の4つのみとのことでした。

- 'containing'
- 'not containing'
- 'begins with'
- 'ends with'

なので、正しいサンプルコードは以下のようになります。

```good_condition.py
worksheet.conditional_format('A1:A4', {'type':     'text',
                                       'criteria': 'containing',
                                       'value':    'foo',
                                       'format':   format1})
```

今後[^1]のアップデートでどうなるかはわかりませんがメモ。
[^1]: この記事を書いている段階では1.03です。
pythonを使ってtwitterbotを作成してみた

pythonコーディングを１ヶ月checkioというサイトで学び、そのあとプログラムを何か作ろうと思ってtwitter.botを作ることにしました。
出来上がるまでに１ヶ月程かかった。
出来上がるまでにつまづいたポイントをまとめる。

・twitterapiについて
oauthライブラリを導入したが、最初はライブラリのインストール先と同じディレクトリ内に、プログラムファイルを作らないと行けないかと思ってたけど、そんな面倒なことはなく。
同じディレクトリじゃなくてもimportできたこと。

・一番困ったのが、crontab -eで定期実行しようと思ったのに、ブラウザに反映されないことだ
原因はmacのシステムとcrontabのシステムで使っている、環境変数は別のものであるということ
そのためまずはcrontab -e内でPATHを編集した。それでpython3をしようしてあげることができる。
現在のシステムで使っているpathをそのまま入れた

そのあとにまだencodeunicodeerrorがでた。
なのでLANG変数もutf-8のものを設定してあげた
そうすることでtwitterbotは正常に動いた。

・gitについて
git push origin masterの意味がわからなかあった
git push リモートURL masterでもいける
※masterの正式な書き方は、master:masterらしい
masterの部分は　ブランチ名

リモートURLに名前をつけたい場合（ニックネームのようなもの）
git remote add origin URL
となる


※やっぱり何かを作ることが一番学べることに気づいた。
OpenCVでWebカメラからの画像取得に失敗する時のメモ（Ubuntu16.04）

# 動作環境

## ソフトウェア

- Python 3.5.3
- OpenCV 3.4

## ハードウェア（Webカメラ）

- logicool c270（[製品ページ](https://www.logicool.co.jp/ja-jp/product/hd-webcam-c270)）

このカメラはビックカメラで1000円だったので買った。静止画で300万画素。最近のWebカメラはUVCだからUbuntuでも問題なく使える。好きなのを使えばいいと思う。
[USB video device class (UVC) | Wikipedia](https://en.wikipedia.org/wiki/USB_video_device_class)
## 動作確認

USBが認識されているか確認。

```console
$ lsusb
Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270
```

ビデオとして認識されているか確認。

```console
$ l /dev/video*
/dev/video0
```

0chのカメラにアクセスすれば良さそう。

# Webカメラから画像を取得する方法

以下のコードを適当な名前で保存する。0chから取得するので`cv2.VideoCapture(0)`としている。

```python3:capture.py
#!/usr/bin/env python3
# -*-coding: utf-8 -*-

import cv2
import time

def main():
    cap = cv2.VideoCapture(0)
    while(True):
        # Capture frame-by-frame
        ret, frame = cap.read()
        if ret:
            cv2.imshow('frame', frame)
        else:
            time.sleep(2)

        # Display the resulting frame
        if cv2.waitKey(20) == 27:
            break

    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    main(args)
```

以下を実行すればWebカメラから画像を取得できる。実行時には`sudo`をつけるのを忘れないこと。

```console
$ sudo ./capture.py
```

# エラーが発生して画像の取得に失敗する時

上記でそのまま画像が取得できれば問題ないが、以下のようなエラーが発生することがある。

```console
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x3600010
```

## 解決策その1（保存する）

`cv2.imshow()`をやめて`cv2.imwrite()`を利用すれば正常に取得できているはず。しかし、不便である。

## 解決策その2（profileを修正）

以下のページを参考にした。
[BadDrawable (invalid Pixmap or Window parameter) #53](https://github.com/P0cL4bs/WiFi-Pumpkin/issues/53)

`/etc/environment`をエディタで開く。ここではnanoを使用する。

```console
$ sudo nano -w /etc/environment
```

最終行に以下を追加する。

```
QT_X11_NO_MITSHM=1
```

再び`sudo ./capture.py`を実行して画像が表示できていれば解決。

![cam.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/832f5aad-ae78-6d7c-05c6-8b68d3eff03b.jpeg)

以上。
1コマンドでローカルに簡易WEBサーバーを作る

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-116132394-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-116132394-1');
</script>
たまに静的サイトの出来を確認、テストするのにサクッとローカルにWEBサーバーを立てたい時があります。Macだと静的サイトであれば`file:///`でHTML,JSは動くんだけどやっぱサーバー上で動かさないと微妙に挙動に違いがありそうなので。。。

ローカル環境：MacOS High Sierra
WEBサーバー：Linux 4.9.60-linuxkit-aufs、Apache2.4

## コマンド一発！
*ローカルディレクトリを各々読み替えてくださいね〜*

```docker
$ docker run -d -p 8080:8080 -v /Users/t-kajihara/work:/var/www/html centos/httpd-24-centos7
```

**-v**オプション：ローカルディレクトリとサーバーディレクトリをマウントする。
`$ docker run -v　[ローカルディレクトリ]:[サーバーディレクトリ]`

**-p**オプション：コンテナのportとローカルホストのportを紐つける。
`$ docker run -p　[ローカルホストのport]:[サーバーのport]`

**-d**オプション：デタッチドモードで起動する（コンテナ停止時に削除しない）
参考：[デタッチド (-d)](http://docs.docker.jp/engine/reference/run.html#detached-d)

## [http://localhost:8080/](http://localhost:8080/)にアクセスする。

起動できた。
![FireShot Capture 22 - Test Page for the Apache HTTP Server on Red Hat Ente_ - http___localhost_8080_-min.png](https://qiita-image-store.s3.amazonaws.com/0/56388/a94bffe5-c1fa-62bb-6135-5bd75aeb62cb.png)


## サーバーにログインする

まずコンテナIDを確認する。
`$ docker ps | grep 'centos/httpd-24-centos7'`

WEBサーバーにログインする。
`$ docker exec -it [コンテナID] bash`


### Dockerありがたや〜〜
コマンドが置かれているディレクトリを調べる

# どうした
自分でインストールしたコマンドが、どこに置かれてるのかわからない！

# どうする
[ここ](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/163wherecomd.html) を参考にしたところ、which コマンドを使えばいいらしい。

```
$ which pip
-bash: which: コマンドが見つかりません
```

ないじゃん！
まあそういうこともあるのかね。知らんけど。

そういうときは type コマンドを使うのじゃ。
`type <command>`
出力はこんなかんじ。
`<command> は /usr/bin/<command> です`

python の例だと、

```
$ type python
python は /usr/bin/python です
```

よしよし。
Goで書いたAPIサーバーをGoogle App Engineへデプロイするまでの最低限の手順

Go言語でJSONを返すAPIサーバーを書き、Google App EngineのStandard Environmentで運用するまでの最低限の流れのまとめ。

(他のサービス編もあるよ): [Heroku版](https://qiita.com/croquette0212/items/2b85aa2c6b2933244f07) / [Arukas版](https://qiita.com/croquette0212/items/b86d9f39b5c19c3e3de1)

# 前段階
## Golangのインストール

macOSの場合は`brew`でインストールするのが楽。

```
brew update
brew install go
```

Google App Engine(GCP SDK)を使う場合、Go 1.8以降を使っていても`$GOPATH`を設定する必要がある。(参考: https://cloud.google.com/appengine/docs/standard/go/building-app/creating-your-application)

```
echo $GOPATH
```

で`$GOPATH`が設定されていることを確認する。必要な場合は`~/.bash_profile`などで`$GOPATH`を設定する。

```
export GOPATH=$HOME/go/
```

## Google Cloud Platform SDKのインストール

最新のGCP SDKをインストールする。

https://cloud.google.com/sdk/docs/

GCP SDKは`yum`や`apt`でインストール/管理しないことが推奨されている。

### App Engine extension for Goのインストール

```
gcloud components install app-engine-go
```

Go言語用App Engineコンポーネントをインストールする


## gcloud用のGoogleアカウント認証

````
gcloud auth login
```

でCLI(`gcloud`)からプロジェクトのデプロイなどができるように、ログインしておく。

# GCPプロジェクトの作成

[Google Cloud Console](https://console.cloud.google.com/?hl=ja)で新しいプロジェクトを作成する。

# ベース部分の実装
## ローカル作業ディレクトリの作成

```
mkdir myapp
cd myapp
```

## Google App Engine用App設定ファイル(app.yaml)の作成

```
runtime: go
api_version: go1

handlers:

# All URLs are handled by the Go application script
- url: /.*
  script: _go_app
```

## main.goの作成
```golang:main.go

package main

import (
	"net/http"
	"encoding/json"

	"google.golang.org/appengine"
)

type Response struct {
	Status  string `json:"status"`
	Message string `json:"message"`
}

func main() {
	http.HandleFunc("/", handle)
	appengine.Main()
}

func handle(w http.ResponseWriter, r *http.Request) {
	json.NewEncoder(w).Encode(Response{Status: "ok", Message: "Hello world."})
}
```

JSONでレスポンスを返すシンプルなHTTPサーバー

## ローカルで動作確認

```
dev_appserver.py app.yaml
```

http://localhost:8080/ にローカルサーバーが立ち上がり、動作を確認できる。ソースコード(app.yaml, main.go)を書き換えると、自動的にリビルドが走る。

### dev_appserver.pyが見つからない場合
`brew`などでGoogle Cloud SDKをインストールした場合はPATHの設定の問題で`dev_appserver.py`をみつけられないことがある。その場合はSDKのインストールパスの下にあるbinをPATHに追加する。

`brew cask`でインストールした場合の例

```
export PATH="/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin:$PATH"
```

### appengine用のライブラリが足りない旨のエラーが出る場合

```
go get "google.golang.org/appengine"
```

# サーバーにデプロイ

```
gcloud app deploy --project myapp
```

`project`引数をつけて、Google Cloud Platform上で作成したプロジェクトのidを指定する。GCP上にプロジェクトが一つしかない場合は、省略しても良いがつけておいたほうが安全。

# 動作確認

```
gcloud app browse --project myapp
```

ブラウザが起動し、デプロイされたコードの動きを確認できる。

# 参考
https://cloud.google.com/appengine/docs/standard/go/building-app/creating-your-application
参照型と参照渡し

*新人プログラマ応援記事のつもりで書いたらそんなものではなくなってしまった……*

# TL;DR
「参照型」
……データの取扱方式のひとつ。
「参照渡し」
……該当の関数へ処理対象を報せる方式のひとつ。

同じ「参照」だが意味は全く違う。**参照型を渡すから参照渡しではない**。

# 参照型 is 何
↔「値型」

ざっくりいうと、

* 別の変数に代入したら全部コピーされるのが**値型**
* 代入しても実は同じものを見ているのが**参照型**

です。

あくまで一般論ですが、数値や文字列など、人間が直感的に「こりゃ値だろ」と思えるもの (なんじゃそりゃ) はなんだかんだ値型であることが多いです。
逆に複数の数値や情報を扱うものはたいてい参照型です (例外はままあるけど……) 。

```
int i = 1; // 整数はたいてい「値型」
int[] i = [1,2,3]; // 配列はたいてい「参照型」
```

C/C++ を齧ったことがあるなら、「ポインタで扱わないといけないものは全部参照型」ぐらいの認識で概ね大丈夫です。
(※ ポインタ自体は値型です - メモリのアドレスを数字にしたようなもんですから)

# 参照渡し is 何
↔「値渡し」

関数に対してある引数 A を渡す時、

* 何らかの形で**値**を渡すのが**値渡し** (値呼び / call by value)
* A の**参照**を渡すのが**参照渡し** (参照呼び / call by reference)

です。
この時の**値**や**参照**というものは、先の**「値型」「参照型」とは関係ありません**。
「参照渡し」における「参照」というのは、変数の別名のようなものです。
(これらの「方式」そのものは「評価戦略」という語で呼ばれるものの一つです……ややこしくなってきたって？)

もしも「参照渡し」であった場合、**引数に対して代入すると、呼び出し元のデータが差し替えられてしまいます**。
(※ 渡されたものが参照型だった場合、その引数自体が自分を書き換えたり、引数の持つ変数を書き換えたりすることで呼び出し元へ影響を及ぼすことはできますが、**データそのものが差し替えられるわけではありません**)

```
// もしも参照渡しだったら……
int i = 0;
print(i); // 0
ex(i);
print(i); // 1000

void ex(int i){
    i = 1000;
}
```

# ところでなんでこんなことを？
**間違った使い方をされると私が困るからです**。いろんな言語使ってるので、脳内で混ざります。
例えば、**Javaに参照渡しは存在しません**。
 (ここらへんは結構コアで、また荒れる話題です。興味があったら調べてみてください)
[備忘録]SPFレコードの設定について

spfの設定について備忘録
ツッコミがあればコメントしてください！！

#限定子
| 限定子 |  |  | 備考 |
|:-:|:-:|:-:|:-:|
| + | 認証する | Pass  | 省略可能  |
| ? | 中立| Neutral||
| ~ | 認証しない（弱め） | SoftFail |   |
| - | 認証しない | Fail |   |


## 「-」と「~」
これらは指定の最後に「~all」や「-all」として利用することが多いが、
全て許可をしていないことは変わらないが、
受信側の設定により、「?all」、「~all」、「-all」の場合でもメールを受信する場合もあれば、受信しない場合もある。

| 限定子 | 備考 |
|:-:|:-:|
| ?all | 認証失敗・送信元メールアドレスの正当性を判断できない |
| ~all | 送信元メールアドレスは詐称されている可能性がある |
| -all | 送信元メールアドレスは詐称されている |


#機構
| 機構 |  |
|:-:|:-:|
| all | 全てマッチする。 | Pass |
| ip4 | 引数に与えられたIPアドレス(ipv4)を利用する。送信元サーバーのIPアドレスが引数で指定されたIPアドレスが含まれていればマッチする。|
| ip6 | 引数に与えられたIPアドレス(ipv6)を利用する。送信元サーバーのIPアドレスが引数で指定されたIPアドレスが含まれていればマッチする。 |
| include | 引数に与えられたドメインのSPFレコードを利用する。引数で指定されたドメインのSPFレコードを認証に利用する |
| a | 送信元ホストのIPアドレスが、引数に与えられたドメイン名のFQDNのAレコードのいずれかに含まれていれば認証する |


##FQDNについて
「FQDN」とは、「Fully Qualified Domain Name」の略で、 日本語では主に「完全に指定された(限定された)ドメイン名」などと訳されますが、 「絶対ドメイン名」と呼ばれることもあります。

# 例
```
例:12.34.56.78は認証する、それ以外は認証しない
“v=spf1 +ip4:12.34.56.78 -all“
または
“v=spf1 ip4:12.34.56.78 -all“

例:何も認証しない
“v=spf1 -all“
```

# 参考
 [送信ドメインを認証するためのSPFレコードに詳しくなろう]
(https://sendgrid.kke.co.jp/blog/?p=3509)

 [SPF（Sender Policy Framework） : 迷惑メール対策委員会]
(http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/)
カメラの横移動とオブジェクトを中心に回転

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

public class CameraMove : MonoBehaviour
{

    int Mode;
    public GameObject camera;
    public float angle = 10f;
    private Vector3 targetPos;
    public Transform target;
    public float speed = 1.0f;
    

    void Start()
    {

        Mode = 1;

    }

    // Update is called once per frame
    void Update()
    {

        Mode = 1;

        switch (Mode)
        {
            case 0:
                camerayokoidou();
                break;


            case 1:
                camerakaiten();
                break;
        }
    }
                
        
    
void camerayokoidou()
    {
        camera.transform.position += new Vector3(5, 0, 0);
    }
void camerakaiten()
    {
        transform.LookAt(target);
        Vector3 axis = transform.TransformDirection(Vector3.up);
        transform.RotateAround(target.position, axis, speed*0.01f);

    }
}

```
H30春AP試験を受けてきました。所感的な。

##お恥ずかしながら4度目の受験
自己紹介記事も何も書かないまま、早速大恥を晒すのですが。
今回の受験が<b>4度目の受験</b>です。

基本情報に合格し、勢いで申し込んだ1回。
リベンジと意気込んだが、ほとんど勉強しなかった1回。
環境が変わり、真面目に取り組んだ1回。
いい加減受からねばという気持ちで挑んだ今回の試験。

受験直後ということで、ホヤホヤな所感・反省だったりを残しておきます。

##午前：難易度上がった？
4回目なので、さすがに午前試験は余裕。

…と高を括っていたのですが、そうでもなかった。

1問目から、ディープラーニングに関する問題。

IPAが発行しているセキュリティに関する記事なんかを見たりもしていましたが、
ディープラーニングだったり、仮想通貨に関する問題が出題されるとは思っていませんでした。

余裕とは言えないけれども、
過去問中心なのは変わらず。7割くらいで通過したかなと思います。

慣れるのもあまりよろしくない。

##午後：相変わらず時間が足りない！
前回はあと5点で合格だった午後。

午後問専用の問題集を実施して挑みましたが、
やはり<b>時間が足らない。</b>

あと、4度も受けてると悪い意味で会場慣れしてしまうというか。
ゆったり問題を解いてしまっていたかなという印象があります。

早起きして、嵐の中行ったから、疲れてたんでしょう。haha。。

##反省点
ここがメイン！
合否に関わらず、ここは後で見直そう。


<b>・午前の学習に時間を割かなかった</b>
　前回は午前が余裕だったので、
　応用情報技術者ドットコムの過去問道場でしか対策をしていませんでした。
　しかし、ある程度まとまった時間を確保し、机上で学習することも大事。
　計算問題、正答以外の選択肢についてはもっと理解を深めるべき。
<b>・午後問の習熟度が浅い</b>
　午前に比べて、午後は数をこなせていない。
　自信を持つためにも、問題集を何週もして解答を導き出すコツを身に付けるべき。
　1度や2度解いただけでは、対策ができているとは言えない。
　時間配分も、本番を意識して1問30分を目標に実施する。

##もう受けたくない。。。

だらだらと所感・反省点を書いてみましたが、
正直な所、<b>もう受けたくない！！！！</b>です。

受かってたらいいけど、
落ちてたら、このだらだら申し込むのは1回ストップしようかな。

以上、初投稿でした。

\#Markdown記法？というやつをマスターしてもう少し読みやすく書きたい。
Ethereum 上で実物資産の譲渡や貸与を考える思いを馳せる旅に出たい(2018 年 6 月時点)

ERC721(Non-Fungible Token)の登場により, デジタルアセットの所有権管理が容易となりました.

これを実物資産(土地や, カメラなどの物品)に応用できないか, 思いを馳せてみます.

最近ではそのような実物資産の管理を行うことを目的とした EIP 994(Delegated NFT)が出てきました.

https://github.com/ethereum/EIPs/issues/994

その他関連がありそうな EIP

* バーター取引 https://github.com/ethereum/EIPs/issues/981
* 期間指定でレンタルを実現(rival) https://github.com/ethereum/EIPs/issues/809


## 利点

ブロックチェーンで記録することにより, 実物資産の所有, 貸し借りなどの管理が確実となり, またスマートコントラクトと組み合わせることにより, 譲渡/貸与の手続きが楽になる(別途 dapp 開発は必要)

詐欺を防ぐ.

積水ハウスから63億円をだまし取った「地面師」の恐るべき手口 http://gendai.ismedia.jp/articles/-/52480 

のようなことを防ぐことができる... のではなかろうか.

## 課題点

実物資産が存在していることの証明

カメラなどであれば, 実物資産に QR コードを貼り, face 2 face でこの QR コードを読み取り, 譲渡や貸与のやり取りをするという手があります.

しかしスマホで dapp で QR コード読み取りには, セキュリティやブラウザの動作レイヤーの問題などの面から良い方法が現在はありません.

https://qiita.com/shora_kujira16/items/a9e3aa0b06525c00a7e0


EIP945 で dapp アプリでの QR コード読み取りを(web3.js から)標準化しようとする動きがありますので, こちらに期待です

https://github.com/ethereum/EIPs/issues/945



=> GPS を使う
=> プライバシーの管理(e.g. 所有者や借り手の存在がわかってしまう). GPS データを暗号化するか?
=> FOAM(Proof of location)? https://blog.foam.space/introduction-to-proof-of-location-6b4c77928022

NFT に紐付けられた実物資産が本物, 同一, 改ざんされていないことの証明

=> どうするか? 

保険

=> ブロックチェーンベースの物損保険と組み合わせられるとよい

所有者, 貸し手などの ID 管理

=> マイナンバーカードで本人確認 & 電子署名したい. https://qiita.com/yyu/items/aab20a0d1de7cf786409

タイムスタンプ管理

=> https://originstamp.org/ ブロックチェーンベースのタイムスタンプサービス使いたい.

実物資産の一意性の確保

偽造防止印刷でトークンアドレスを印刷とか?

*   https://www.fujixerox.co.jp/company/technical/communication/annotation/yoctrace.html
* https://www.shoei-printing.com/2017/08/08/%E5%AF%8C%E5%A3%AB%E3%82%BC%E3%83%AD%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E4%B8%80%E6%84%8F%E8%AD%98%E5%88%A5%E6%8A%80%E8%A1%93%E3%80%8Cyoctrace%E3%80%8D%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%80%81/
LightGBM インストールからインポートまで

##導入
kaggle始めるとLightGBMを使っている人が多いことに気がつくと思います。そこで今回は、インストールしてimportできるようになるまでの手順を紹介します。

##LightGBMが使えるようになるまで

```python
brew install cmake
brew install gcc

git clone --recursive https://github.com/Microsoft/LightGBM ; cd LightGBM
export CXX=g++-7 CC=gcc-7
mkdir build ; cd build
cmake ..
make -j4

cd ../
python python-package/setup.py install
```

これでJupyter bookなどでimportできるようになると思います！

##参考
* http://lightgbm.readthedocs.io/en/latest/Installation-Guide.html