OmniAICreator/Qiita-1.07M huggingface dataset:
Style Transfer の実験1

どれくらい〇〇っぽいとか、画家とかの絵に近づけるか、色々実験しています。
絵を合成する際には、以下のものを入力としています。

- 学習済みデコーダー
- コンテンツ画像
- スタイル画像

理論はこちらを参照してください。
[ニューラルネットワークでStyle Transferを行う論文の紹介](https://qiita.com/kidach1/items/0e7af5981e39955f33d6)
まずは小学生コンクールに入賞した絵でデコーダーを学習させてみました。
![js_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/382481c7-1560-a34d-3ac1-4b711602b185.png)
元のコンテンツは、lennaさんと向日葵。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/cb426101-0163-5fea-b070-0f03584b86fb.jpeg"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/7ad17d33-b3af-2448-5c00-25a7a9651ed2.jpeg">
スタイルは以下を使用。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/b31b2302-a798-cb2c-9ac9-972a1ca11528.jpeg"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/3e282a5e-9cd0-7628-45ca-79aa38af6a7d.jpeg">
これらの合成した結果は以下に。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/2b0df191-e917-c7c5-990a-374e09f2d7d8.jpeg"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/003c2432-33e6-b13a-6809-f47fb285cc89.jpeg">
予想できる範囲内に。

次にクリムトの絵でデコーダーを学習させてみました。
![klmt_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/d10c5590-c72c-16e4-94a9-2634f3bc55dd.png)
元のコンテンツは同じで、以下のスタイルを使用。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/5abdb279-e706-fd89-14b6-37d2adca8ddc.jpeg"><img height="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/83df0520-02b2-42d6-bc85-c6e0eff3d038.jpeg">
これらの合成した結果は以下に。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/b8870685-7a77-4b1e-f481-1957b44a8548.jpeg"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/d1b8dafd-d7b0-16c7-82cc-b4732c42fba3.jpeg">
スタイルがうまく適用されて面白いです。

もし未学習の前の小学生スタイルで合成させると・・・
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/d6eb8fd3-4257-24e5-1817-652926d3dfa2.jpeg"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/32322c4b-da05-b9cd-cfd4-fe8716e93f67.jpeg">
色の出し方などは顕著に抑えられてます。
やはり、デコーダーはクリムトの画風を学習させたので色合いや筆使いはそれに近くなるようです。

逆に小学生デコーダーでクリムトスタイルを合成させると・・・
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/137c88cb-613f-4a92-4f65-0e1b68449f58.jpeg"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48367/642132ce-4216-5e81-3f1d-14dab7116c2b.jpeg">
クリムトは円模様をよく使ったようですが、小学生はあまり使用しなかったため、合成後の絵にはほぼ現れなくなっています。

色々試して感じたのは、「色合い」「筆使い」は似せることができるのですが、「構図」みたいなのはまだまだだなあ、という印象です。
今後もいろいろパラメータなど調整しながら実験していきたく思います。
PythonでExcel集計とグラフ作成

Excelを集計して、棒グラフにしてみる。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378463/1a86400b-04f0-e8e7-5c2c-24ce43cc4afe.png)
これが

```:準備
pip install openpyxl
pip install pandas
pip install xlrd
```

```python:sample.py
import collections
import openpyxl
from openpyxl.chart import BarChart, Reference
import pandas as pd


excel_bookname = 'ブック名.xlsx'
data_sheet_name = '集計データ'
result_sheet_name = '集計結果'
target_column = '集計カラム'

# 集計
df_data = pd.read_excel(excel_bookname, sheet_name=data_sheet_name)
result_data = collections.Counter(
    sum(df_data[target_column].str.split(','), []))

# 書き込み、集計結果シートは作り直す
book = openpyxl.load_workbook(excel_bookname)
del book[result_sheet_name]
book.create_sheet(title=result_sheet_name)
sheet = book[result_sheet_name]

for i, key in enumerate(result_data, start=1):
    sheet.cell(row=i, column=1).value = key
    sheet.cell(row=i, column=2).value = result_data[key]

# 棒グラフ、凡例なし
chart = BarChart()
chart.title = '棒グラフタイトル'
chart.legend = None
type_max = len(result_data)
values = Reference(
    sheet, min_col=2, min_row=1, max_col=2, max_row=type_max)
titles = Reference(
    sheet, min_col=1, min_row=1, max_row=type_max)
chart.add_data(values)
chart.set_categories(titles)
sheet.add_chart(chart, "D2")

book.save(excel_bookname)
```

こうなった
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378463/579daebc-2beb-ee8f-4c2c-ff3ce9213cc3.png)
VirtualBoxの「VBoxClient (seamless): failed to start」がライブラリインストールで解決しない場合

かなり小ネタですが、ググってもなかなか情報が出てこなかったので。

# 環境
ホストOS: Windows 10 Home
VirtualBox: 5.2.20
仮想OS: Ubuntu 16.04 (Linux 4.4.0)

# 起こったこと
随分前にVirtualBoxをアップデートしてから以下のようなエラーが出ていました。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208875/db860dad-7c71-6501-7045-252760449a3b.png)

どうやらVirtualBox GuestAdditionsの起動エラーのようで、これのせいでGuestAdditionsの機能であるクリップボード共有機能などが使えなくなっていました。
他に支障はないためなんとなく使い続けていたものの、コピペ共有ができないのは地味につらい。
ということで調べると以下のような記事が出てきました。

["VBoxClient (seamless): failed to start" エラーが出てしまったときの解決方法](https://qiita.com/terappy/items/aebf7786b9d6d584f92b)

この方の記事のとおりに `gcc make perl` をインストールしてみましたが...解消せず...
しかし英語記事を含め大抵の文献がこの3つをインストールすればいいと言っています。
完全に行き詰まってしまいました。どうしましょう。

# 解決策
[こちら](https://forums.virtualbox.org/viewtopic.php?f=3&t=86366#)にあるとおり、Linuxカーネルのバージョンを上げGuestAdditionsを再インストールしたら解決しました。
今回は`4.4.0`から`4.20.0`にバージョンアップしました。
なおこの際、最新である `5.2.0` に上げると、一部の依存対象が見つからずインストールが失敗してしまいます。

[Ubuntuのベースバージョンを変えずにLinuxカーネルをアップグレードする方法](https://iberianpig.github.io/posts/2017-02-06_how_to_upgrade_kernel/)

# 教訓
VirtualBoxのアップデートには気をつけよう！
（ここらへん全然詳しくないので何も技術的なことが言えない）
CUBLAS_STATUS_ALLOC_FAILEDエラー

久しぶりに機械学習の勉強をしようとと思い、多クラス分類の復習をしようとしたら件のエラーが発生しました。

以前はちゃんと動いていたはずですなのですが・・・。

####動作環境
OS:Windows10
演算領域:GPU
フレームワーク：Tensorflow
モジュール：keras

####エラー内容
model.fit()を呼び出しているところで下記エラーが出てすすまない。

```
failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
```

####原因
TensorflowがGPUのメモリが確保できず、model.fit()の処理が行えないらしい。

####解決方法
TensorflowがGPUのメモリを動的に拡張できるようにコンフィグ設定を追加する。
具体的には下記コードをmodelの処理を実行する前に追加すればよい。
自分の場合はコードの先頭に追加しました。

```tf_gpu_config.py
# TensorFlowのGPUメモリ使用量の制限
# https://github.com/tensorflow/tensorflow/issues/7072
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.allow_growth = True  # dynamically grow the memory used on the GPU
config.log_device_placement = True  # to log device placement (on which device the operation ran)
                                    # (nothing gets printed in Jupyter, only if you run it standalone)
sess = tf.Session(config=config)
set_session(sess)  # set this TensorFlow session as the default session for Keras
```


####参考
https://github.com/tensorflow/tensorflow/issues/7072




####最後に
話が変わるけどTensorFlow内で利用されているnumpyでもWarningが発生してました。
float型は非推奨とのこと。
Tensorflowの新しいバージョンでは対応済かもしれませんが、Tensorflowのバージョン上げると、まーたCudaを動かすのにハマりそうだし、この場は趣味で触ってるだけなので放置
Spring boot開発参考に見たサイトとかまとめ

[前回の環境構築の記事](https://qiita.com/nanaki11/items/76a1b1c46f737cdbda5f)に引き続き開発がある程度進んだのでその際に参考にしたサイトとかまとめておこうと思います。
自分が聞かいたコードはお仕事で使っているのでアップロードできません。。。

#全般
・[公式：Spring Boot](https://spring.io/projects/spring-boot)
・[Spring Bootで簡単な検索アプリケーションを開発する](https://qiita.com/rubytomato@github/items/e4fda26faddbcfd84d16)
・[SpringBoot + JPA + Thymeleafで簡単なCRUDを作る](https://qiita.com/ozaki25/items/74f8895db109290e75da)
・[TERASOLUNA Server Framework for Java (5.x) Development Guideline](http://terasolunaorg.github.io/guideline/5.5.1.RELEASE/ja/)

#画面（Thymeleaf）
・[Thymeleafチートシート](https://qiita.com/NagaokaKenichi/items/c6d1b76090ef5ef39482)
・[Thymeleaf(JP)](https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html)

#DBA（JPA）
・[JPAによるエンティティクラスの自動生成](http://www.ytp.ne.jp/wiki/Wiki.jsp?page=JPA%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90)
・[JPA(hibernate)のテーブルジョインの罠(n+1問題)](https://qiita.com/kohei789/items/2c1d17f7ef1bf2e07ece)
・[Spring Boot JPQL 結合](https://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/jpa/jpql_join.html)
・[Spring DATA JPAでデータ検索 その2](https://dev.classmethod.jp/server-side/java/spring-data-jpa-search-2/)

#テスト（Mockito ）
・[[SpringBoot] Controllerのテストの書き方](https://qiita.com/ryo2132/items/ec10116238e1e1f333a1)
・[Spring Bootでテストを書くときのやりかたまとめ](https://qiita.com/mitsuya/items/be50dc329b4f3abe5ac5)
・[SpringBootでControllerのユニットテストを行う](http://www.sassy-blog.com/entry/20171010/1507593363)
・[Spring Bootで認証を通さずにWebAPIの単体テストを行う方法](https://qiita.com/nvtomo1029/items/911d359f89491a1da2ba)

#その他
・[SpringでField InjectionよりConstructor Injectionが推奨される理由](http://pppurple.hatenablog.com/entry/2016/12/29/233141)
・[Spring MVC(+Spring Boot)上でのリクエスト共通処理の実装方法を理解する](https://qiita.com/kazuki43zoo/items/757b557c05f548c6c5db)
・[Spring Bootの外部設定値の扱い方を理解する](https://qiita.com/kazuki43zoo/items/0ce92fce6d6f3b7bf8eb)
データ入力がめんどいのでスクレイピングした話

##概要
学校の課題でデータ入力が必要でしたがめんどうだったのでスクレイピングをしてみました。
今回はフレームワークのscrapyを利用して横浜DeNAベイスターズの選手のプロフィールを取得。csv に保存を行います。
取得先webサイトはこちらです。　http://npb.jp/bis/teams/rst_db.html
##環境
windows10
ubuntu18.04
python3
(環境構築などは省きます)
##spider
取得メソッドはxpathは使用しています。

```python

# -*- coding: utf-8 -*-
import scrapy

from baseball.items import BatterItem;

class BatterSpider(scrapy.Spider):
    name = 'DeNA'
    allowed_domains = ['npb.jp']
    start_urls = ['http://npb.jp/bis/teams/rst_db.html']

    def parse(self, response):

       #//＝ノードの省略 @=クラス要素の指定
       for tr in response.xpath('//*[@id="tedivmaintbl"]/div[4]/table').xpath('tr'):
            
            item = BatterItem()
            
            item['number'] = tr.xpath('td[1]/text()').extract_first()
            #if文で値がnullかを判断する
            if not isinstance(tr.xpath('td[2]/a/text()').re_first(r'\w+\s*\w+'),type(None)):
                name_str = tr.xpath('td[2]/a/text()').re_first(r'\w+\s*\w+')
                #全角スペースの削除
                item['name'] = name_str.replace('　', '')
    
            item['day'] = tr.xpath('td[3]/text()').extract_first()
            item['height'] = tr.xpath('td[4]/text()').extract_first()
            item['weight'] = tr.xpath('td[5]/text()').extract_first()
            item['pit'] = tr.xpath('td[6]/text()').extract_first()
            item['bat'] = tr.xpath('td[7]/text()').extract_first()
            
            yield item
            
```

##items.py
取得したデータを格納するオブジェクトを構成します。

```python

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

from scrapy import Item, Field

class BatterItem(Item):
    name = Field()      # 名前
    bat = Field()       # 右打ち or 左打ち or 両打ち
    pit = Field()       #右投げ or 左投げ
    number = Field()    #背番号
    day = Field()       #誕生日
    height = Field()    #身長
    weight = Field()    #体重

```
##settings.py
今回設定に追加したのは下記の通り
1. robots.txtに従う
2. ダウンロード間隔を空ける
3. キャッシュを取得し、再実行時はキャッシュで行う。
4. csvにすると文字化けが発生するので、windowsの仕様に合わせて文字コードを設定

```python

ROBOTSTXT_OBEY = True #robot.txtに従うか
DOWNLOAD_DELAY = 10 #ダウンロード間隔
HTTPCACHE_ENABLED = True #キャッシュを保存するか
HTTPCACHE_EXPIRATION_SECS = 60 * 60 * 24 #キャッシュの保存期間
HTTPCACHE_DIR = 'httpcache' #キャッシュの保存先
FEED_EXPORT_ENCODING='shift_jis' #出力ファイルの文字コード
```
あとはコマンドを叩けばcsvに保存されて終了です。
##まとめ
今回は課題で使うためcsvに保存しましたが、データベース化してデータ分析などしてみたいなーと思ってます。
ImageMagick カレントディレクトリ内全画像の操作（Mac）

HomeBrewでImageMagickをインストール

```
$ brew install imagemagick
```
インストールの確認

```
$ convert
```

画像の情報を表示する

```
$ magick identify rose.jpg
```

*結果

```
rose.jpg JPEG 70x46 70x46+0+0 8-bit sRGB 2.36KB 0.000u 0:00.000

Filename[frame #] image-format widthxheight page-widthxpage-height+x-offset+y-offset colorspace user-time elapsed-time
```

画像情報を一覧表示（カレントディレクトリ内の全画像）

```
$cd <該当ディレクトリのパス> *該当ディレクトリに移動
$ magick identify *
```

フォーマット変更した画像を追加
（image.jpgのフォーマットを変更したimage.pngを追加 ）

```
$ magick image.jpg image.png 
```
カレントディレクトリ内の全画像のフォーマットを一覧表示

```
$ magick identify -format "%w %h\n" *
```
長編1000pxでリサイズ（カレントディレクトリ内の全画像）

```
$ mogrify -resize 1000x1000 *
```
長編1000pxより大きい場合にリサイズ（カレントディレクトリ内の全画像）

```
$ mogrify -resize 1200x1200\> *
```


参考：
https://imagemagick.org/script/identify.php
https://fukatsu.tech/install-imagemagick
https://photo-tea.com/p/17/imagemagick-resize-watermark/
https://toshio-web.com/linux-mint-photo-resize
ROS gazeboのカメラパラメータを調べる



OpenCVのarucoを使ってROS gazebo内のマーカーのPose推定をする必要があり，gazebo内のカメラパラメータが必要となったためその方法を記載します．

# 方法
gazeboにおける歪みや焦点（カメラ行列）などのカメラパラメータはtopicのcamera_infoを見ればパラメータが記載されています．


例として

```
rostopic echo /red_bot/camera_info
```

とコマンドを打つと

```
header: 
  seq: 70
  stamp: 
    secs: 20153
    nsecs: 402000000
  frame_id: "red_bot/camera_link"
height: 480
width: 640
distortion_model: "plumb_bob"
D: [0.0, 0.0, 0.0, 0.0, 0.0]
K: [694.1500723673269, 0.0, 320.5, 0.0, 694.1500723673269, 240.5, 0.0, 0.0, 1.0]
R: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P: [694.1500723673269, 0.0, 320.5, -0.0, 0.0, 694.1500723673269, 240.5, 0.0, 0.0, 0.0, 1.0, 0.0]
binning_x: 0
binning_y: 0
roi: 
  x_offset: 0
  y_offset: 0
  height: 0
  width: 0
  do_rectify: False
```
と出力されます．
このうち，歪みパラメータ（distortion coefficients）が

```
D: [0.0, 0.0, 0.0, 0.0, 0.0]
```

焦点距離などのカメラ行列（camera matrix）が

```
K: [694.1500723673269, 0.0, 320.5, 0.0, 694.1500723673269, 240.5, 0.0, 0.0, 1.0]
```

に当たります．
カメラ行列は1次元で表されていますが，実際は3×3行列

```
694.1500723673269, 0.0,               320.5
0.0,               694.1500723673269, 240.5
0.0,               0.0,               1.0
```

のように用います．

※ ROS gazeboでは設定しなければ歪み補正等をする必要がないため歪みパラメータは0になります．

参考資料
https://jp.mathworks.com/matlabcentral/answers/377162-gazebo-turtlebot-focal-length
[WIP] ELK使い方メモ書き

# はじめに

公式のdocker-compose.ymlを使えば、Elastic Stackかんたんやないか。

https://github.com/elastic/stack-docker

# やってみる

cloneする。

```bash
git clone https://github.com/elastic/stack-docker.git
```

公式に従って、設定用docker-composeファイルをupする。

```bash
docker-compose -f setup.yml up
```

最後にユーザパスワードが出力されるのでメモする。

```bash
setup_1  | Your 'elastic' user password is: ????????????????
```

Stackのコンテナを起動する。

```bash
docker-compose up -d
```
【CORS】クロスドメインによるエラーについて

javascriptで、Appleの[RSSジェネレータ](https://rss.itunes.apple.com/en-us)を使ってappstoreのランキングを取得しようと思ったのだが、以下のようなエラーが吐かれた。

```
---has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource
```

「CORSのポリシーによってブロックされました。Access-Control-Allow-Originがリクエストのhttpヘッダに無いから。」ってことだが、まず「CORS」と「Access-Control-Allow-Origin」が何なのか分からん。から調べた。

##CORS(Cross Origin Resourse Sharing)とは
`fetch`や`XMLHttpRequest`といった、javascriptのAjax通信をする際に、安全に情報をやりとりできるようにするための規約。
基本的には、Ajaxは同じドメイン同士での通信を前提としている。
このCORSによって異なるドメイン間の通信の安全性が保証されるのである。

主要なwebブラウザは皆、CORSをサポートしている。

##Access-Control-Allow-Originとは
httpヘッダ内のパラメータの一つだ。
例えば、上記のAppleのサイトのhttpヘッダに、

```
Access-Control-Allow-Origin: 私のサイトのドメイン（または「*」で全てのドメインからのリクエストを許可）
```
と設定されていれば、私はデータを取得できたはずなのである。

##解決策
Ajaxではなく、node.jsやphp、pythonといったサーバサイドで、情報を取得し、フロントエンドに渡してあげるのが一番手っ取り早いみたいだ。

また、`Access-Control-Allow-Origin`を解決するchromeのプラグインもあるようだが、ンーー。。


以下の記事が大変参考になりました。
[Cross-Origin Resource Sharing(CORS)を使用したHTTPリクエスト](https://blog.kazu69.net/2017/03/23/http-request-using-cors/)
[【CORS】クロスドメインによるエラーを解決する](https://yukimonkey.com/fix-error/cros1/#h2_3)
デフォルト値付きの引数とキーワード引数のサンプルメモ

- キーワード引数（デフォルト値がある場合）
    - 呼び出し時に引数を渡す場合、定義に合致するキーワードを指定しないといけない
    - 呼び出し時にキーワードを指定しない場合、指定した引数は、引数とみなされずエラーとなる
    - 呼び出し時に引数を指定しなければ、デフォルト値が与えられる
    - 呼び出し時に定義していないキーワードの引数があるとエラーになる
    - 定義時に複数のキーワード引数を指定する場合、キーワード引数より後ろにキーワード引数ではない通常の引数を指定するとSyntax Errorとなる
    - 定義したキーワードのキー構成と同等あるいは一部の構成であれば、ハッシュオブジェクトを引数とすることも可能（ただし複数指定は不可）
- デフォルト値付きの引数
    - 呼び出し時に引数を省略可能
    - ハッシュで（キーワード引数の時っぽく）引数を指定するとハッシュのオブジェクト自体が引数として認識される

```ruby:sample.rb
require "pp"

def test(*arg)
  pp arg
end

def test2(arg)
  pp arg
end

########################
# キーワード引数
def test3(arg: "hoge")
  pp arg
end

pp "===test3"
test3 # => "hoge"
#test3(1) # wrong number of arguments (given 1, expected 0) (ArgumentError
test3(arg: "hogehoge") # => "hogehoge"
test3({arg: "hogehoge"})
# test3(arg: "hogehoge", arg2: "hogehoge") # unknown keyword: arg2 (ArgumentError

########################
# デフォルト値付きの引数
def test4(arg = "hoge")
  pp arg
end

pp "===test4"
test4 # => "hoge"
test4(1) # => 1
#test4(1,2)
test4(arg: "hogehoge") # => {:arg=>"hogehoge"}
test4(arg: "hogehoge", arg2: "hogehoge") # => {:arg=>"hogehoge", :arg2=>"hogehoge"}
# test4(1, arg: "hogehoge", arg2: "hogehoge") # => wrong number of arguments (given 2, expected 0..1) (ArgumentError)

########################
# おまけ
pp "====test5"
def test5(arg1, arg2, arg3, arg4)
  pp arg1
  pp arg2
  pp arg3
  pp arg4
end

test5(1, { arg: "hogehoge", arg2: "hogehoge"} , 3, arg3: "hogehoge")

########################
pp "====test6"
def test6(arg1: "hoge", arg2: "hoge")
 pp arg1
 pp arg2
end

test6(arg1: "hogehoge", arg2: "hogehoge")
#test6({arg1: "aaaa"}, {arg2: "bbbb"}) #  => wrong number of arguments (given 1, expected 0) (ArgumentError)
test6({arg1: "cccc", arg2: "dddd"})

# 間にキーワード引数では無い通常の引数があるとSyntax Errorになる
# : syntax error, unexpected ')', expecting end-of-input
# def test7(arg1: "hoge", arg2, arg3: "hoge")
#  pp arg1
#  pp arg2
#  pp arg3
# end


```

```ruby:実行結果
"===test3"
"hoge"
"hogehoge"
"hogehoge"
"===test4"
"hoge"
1
{:arg=>"hogehoge"}
{:arg=>"hogehoge", :arg2=>"hogehoge"}
"====test5"
1
{:arg=>"hogehoge", :arg2=>"hogehoge"}
3
{:arg3=>"hogehoge"}
"====test6"
"hogehoge"
"hogehoge"
"cccc"
"dddd"
```

### 参考リンク
クラス／メソッドの定義 (Ruby 2.6.0) https://docs.ruby-lang.org/ja/2.6.0/doc/spec=2fdef.html

Rubyのハッシュの記法まとめ - Qiita https://qiita.com/YusukeHigaki/items/18db85aa9cba3cb42569
Python勉強の記録_190811

Python勉強の記録を（なるべく毎日）メモすることにしました。

#自己紹介
電機メーカーで新卒2年目、経営企画をしています。
同期がみんなエンジニアですごいので、自分も何かできるようになりたい！
と思い、Pythonを勉強することにしました。

#今日やったこと
- AtCoderに登録した
- [AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/KoyanagiHitoshi/items/c5e82841b8d0f750851d)を解き始めた。問1-3, 5を解けた。

#学び
- `a b`みたいな入力に対してaとbを別の変数に入れたいときに、splitとmapを使って対処する

```python
num = '2 5'
a, b = map(int, num.split())
print(a)
print(b)
#2
#5
```

- 小さい方を取得するmin

```python
a = 5
b = 10
c = min(a, b)
print(c)
#5
```
Python3初心者、最初からHackerRankに挑む！

#はじめに
未来電子テクノロジー（https://www.miraidenshi-tech.jp/intern-content/program/）
でインターンをしているrayaと申します。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#今回の内容
タイトルの通りですが、Python3について何も知らない初心者がHackerRankに挑戦します。問題を解いて調べながら学んでいきたいと思います。

#Algorithms１問目
問題の要約。aとbを足し算しする関数を定義する。

```python

def solveMeFirst(a,b):

num1 = int(input())
num2 = int(input())
res = solveMeFirst(num1,num2)
print(res)
```
＜調べたこと＞

* int()関数：整数型へ変換する
* input()関数：引数の値をユーザーが入力した値を出力。戻り値は文字列型になる。

ユーザーがinput()に入力した値（文字列型）を整数型に変換し、計算できるようにしているということですね。
単純にa+bを入力しました。

```python
def solveMeFirst(a,b):
a+b
```

結果は、エラー。調べて見ると、returnで関数の戻り値を返してあげないと出力できないようです。下にprint関数があるのでなくても大丈夫かなと思ってしまいました。

```python
return a+b
```
初めて1ポイント獲得！

#Algorithms2問目
問題の要約。2つの配列の3要素をそれぞれ比較し、大きい方に１点加える。最終的に2つの配列はそれぞれ何点獲得したかを配列で返す。

```python
#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the compareTriplets function below.
def compareTriplets(a, b):

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    a = list(map(int, input().rstrip().split()))

    b = list(map(int, input().rstrip().split()))

    result = compareTriplets(a, b)

    fptr.write(' '.join(map(str, result)))
    fptr.write('\n')

    fptr.close()
```
＜調べたこと＞

* import：他のファイルの内容を引っ張ってくる。同じディレクトリならそのままファイル名を書く
* if \_\_name\_\_='\_\_main\_\_':役割としては、インポートした際に勝手にそのモジュールの内容が実行されないようにしている。
* os.environ['OUTPUT_PATH']:環境変数OUTPUT_PATHを取得。
* 'w':書き込み用でファイルを開き、上書きする。
* list()関数：リストを作成。リストは配列のようなもの。
* map()関数:第一引数の関数を第二引数のリストに適用する。
* rstrip()メソッド：引数が無ければ、文字列の最後の空白を削除。引数を指定すれば、その引数を文字列の最後から探し、あるならば削除する。
* split()メソッド：引数が無ければ、文字列をスペースや改行で区切る。あれば、引数の値で区切る。
* write()メソッド：引数の文字列の内容をファイルに書き込み、その文字数を返す。
* join()メソッド：対象とした区切り文字（今回は’　’スペース）で区切られた文字列リストをくっつけて１つの文字列に変換する。

fptrファイルを開き、input()で入力された文字列の空白を取り除き、区切った後に整数型に変換して、a,bという変数に代入する。その後、compareTriplets関数を実行し、resultに代入。resultの値を文字列にして空白で連結し、fptrファイルに文字列の内容を書き出し、その文字数を返す。という流れですかね。

残念ながら解けませんでした。
書いたコードは以下の通りです。

```python
    alicepoint=0
    bobpoint=0
    for i in range(2):
        if a[i]>b[i]:
            alicepoint += 1
        elif a[i]<b[i]:
            bobpoint += 1
        break
    else:
        alicepoint += 0
        bobpoint += 0   

    pointlist=[]
    pointlist.append(alicepoint)
    pointlist.append(bobpoint)
    return pointlist
```
Discussionsで見つけた正解は、Submitしたのですが、エラーになりました笑。後日、検討したいと思います。

#おわりに
２問目からいきなり難しくなりました、、、。Python3について何も知らない状態で挑んでみたので、苦しかったです。
しかし、問題を考えながら学ぶ方が定着すると思うので、基礎と実践を反復横跳びしながら学んでいきたいと思います。問題2は後日リベンジします！
iOSアプリでカメラ使用のためにInfo.plistに追加してあるのにクラッシュしたのは記号が原因だった


今回、受託で開発しているアプリはちょっと実装がされている段階のものをひきとったのですが、
カメラ機能を実装していざ実機で確認してみようかと思ったときにクラッシュした出来事で得た教訓です。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">受託してるアプリで、<br>既に「Privacy - Camera Usage Description」<br>がinfo.plistに書かれてるのにクラッシュするからなぜ…と思ったら<br>- が – だった<br>ハイフンじゃなくて、en-dash（エン・ダッシュ）という記号だった<br>こんな記号初めて知ったぜ<br>正しいか見分ける術としては、Typeが選択不可能かどうか</p>&mdash; 龍之介@iOS App Developer (@nercostudio) <a href="https://twitter.com/nercostudio/status/1160563370166112256?ref_src=twsrc%5Etfw">August 11, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##Info.plistには追加したのに、カメラを使おうとするとなぜかクラッシュする
カメラ機能を使うときは、Info.plistに1行追加して、ユーザーに使用許可を取らなくてはアプリがクラッシュしますよね？
今回、きちんと追加してあるはずなのにクラッシュしました。
Typoはなさそうです。なぜでしょう？

##Privacyの記号が間違っていた

正: `Privacy - Camera Usage Description`

誤: `Privacy – Camera Usage Description`

お気づきでしょうか？

本来ハイフンなところが、en-dash(–)となっていました！

ちなみにこの記号は、option と - を同時押しで入力できるそうです。

##ただし以下の見分けかたはTypeが選択不可能にきちんとなっているか
<img width="592" alt="スクリーンショット 2019-08-11 23.49.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/0ae86694-8b62-e21f-aca8-5f31592244a5.png">
この画像でいうと、上の1行は正しくありません（末尾にスペースを追加しました）
正しくないとTypeが選択可能になってしまうので、`String`が白くなっていますね。

対して、きちんと記述されたしたの行はTypeが選択不可能なので、`String`がグレーになっています。

以上、備忘録です。
【Linux】psコマンド

毎回オプションを忘れてしまう、同じものしか使ってないので覚書

# 出来事
Oracle Exadataを使用しているが、Oracle Linux uek4.x で発生する mellanoxドライバの不具合での再起動する予兆を検知するために psコマンドを使用したので、その時のメモ

Oracle Exadataでは Oracle.Exawatcherが動いているが、そこで取得している psコマンドのオプションは『-elf』

```
[root@host ~]# ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 - 32068 ep_pol  6月30 ?      00:15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root         2     0  0  80   0 -     0 kthrea  6月30 ?      00:00:04 [kthreadd]
1 I root         4     2  0  60 -20 -     0 worker  6月30 ?      00:00:00 [kworker/0:0H]
```
いつも psコマンドで確認する時に使用していたオプションは『-ef』もしくは『aux』でした。
とくに、これって理由がなかったけど昔教えられたままだったので改めて、ステータスとか見れるから『ef』だけよりいいかなと思った。

```
[root@host ~]#  ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  6月30 ?      00:15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0  6月30 ?      00:00:04 [kthreadd]
root         4     2  0  6月30 ?      00:00:00 [kworker/0:0H]

[root@host ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 128272  6588 ?        Ss    6月30  15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S     6月30   0:04 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<    6月30   0:00 [kworker/0:0H]
```

|オプション|説明|
|:---|:---|
|a|全てのプロセスの集合に対して課される。このオプションを指定すると、psは端末（tty）を持つ全てのプロセスをリストする。また xオプションと共に指定すると、全てのプロセスをリストする。|
|-e|全てのプロセスを選択する。|
|x|psは呼び出したユーザの所有する（psと同じ EUIDの）全てのプロセスをリストする。また aオプションと共に指定すると、全てのプロセスをリストする|
|-f|完全なフォーマットでリストする。|
|-l|長いフォーマット。-yオプションは、このオプションと組み合わせることで、しばしば役立つ。|
|u|ユーザ指向のフォーマット|
|-y||プラグを表示しない。addrの代わりに rssを表示する。このオプションは -lと一緒の時にのみ使用できる。|

```
[root@host ~]# ps -elfy
S UID        PID  PPID  C PRI  NI   RSS    SZ WCHAN  STIME TTY          TIME CMD
S root         1     0  0  80   0  6588 32068 ep_pol  6月30 ?      00:15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
S root         2     0  0  80   0     0     0 kthrea  6月30 ?      00:00:04 [kthreadd]
I root         4     2  0  60 -20     0     0 worker  6月30 ?      00:00:00 [kworker/0:0H]
```
AWS　無料枠でEC2インスタンスの作成

#はじめに
ポートフォリオ用のサイトをAWSでデプロイ使用と思いましたが、毎回忘れてしまうので自分用備忘録。
アカウントは持っているのでEC2インスタンスの作成からやっていきます。
何方かの参考になればなお良しと言うことで。

以前、まとめた記事も合わせて貼っておきます。何かしらヒントになればと思います。
Capistranoで、EC2+S3への自動デプロイで起きたエラー集と基礎用語
https://qiita.com/fukaya_path/items/45014e50980dd31b24ff

では、早速やって行きます。
**以前作成したアカウントで新しいインスタンスを作成して作業を進めているので、１からやるのとでは多少差異があるかもしれません。**
#EC２インスタンスの作成〜設定
####AMIの選択
まずEC2インスタンスの作成ボタンを押して進んでいきます。無料でやりたいので今回はRails+MysqlなのでAMIは『Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type』を使用します。
Amazon Linux 2 AMI (HVM), SSD Volume Typeも無料ですが、５年保証やオンプレミスの開発およびテスト用の仮想マシンイメージとして利用可能であったりと違いはあるみたいですが、特に使わないので使いません。こっちでも行けるのでしょうか？わかる人いたら教えてください。

####インスタンスタイプの選択~起動
インスタンスタイプは無料枠が一つしかないので『t2.micro』一択ですね。
『確認と作成』を押すと確認画面まで飛ぶので、『起動』を押すとキーペアの設定画面が出てきます。
今回は既存のキーがないので新しいのを作成し、ダウンロードします。
作成したキーは、インスタンスへのログイン時に必要なので、重要かつ厳重に扱いましょう。
間違えて消してしまうとインスタンスに入れなくなり、面倒臭いことになっちゃいます。
出来たら、『インスタンスの作成』を押します。
完了したらEC２ダッシュボードに行き、出来ているか確認してみてください。問題がなければ、インスタンスの状態がrunningになっているはずです。

#ElasticIP〜EC２ログイン
####ElasticIPの設定
ダッシュボードから、ElasticIPを選択し、新しいアドレスを作成します。
出来たら、アドレスの関連付けを選択し、先ほど作成したEC２インスタンスとの紐付けを行います。
プライベートIPは使用しないので選択しません。

####セキュリティグループの設定
現状SSHでのアクセスしか出来ない状況になっているので、セキュリティグループのインバウンドの設定を行なっていきます。
ルールの追加をし、HTTPを追加し、保存するだけです。

####EC2にログインしてみる
これで一通り終わったので、EC2にログインしてみます。先ほどダウンロードしたkeyの移動と権限の付与をしてあげて、

```
$ ssh -i ダウンロードしたキー ec2-user@設定されたElasticIP
```
で、ログイン出来れば成功です。

#まとめ
最初はデプロイまで、まとめて書こうと思いましたが、あまりに長くなってしまうのでとりあえずここまでにしました。
個人的には大体何をしているのかもわかってきたので、手順さえ間違えなければすんなり出来るなという感じです。
蛇足ですが、良くEC２が止まるなと思っていたのですが、インスタンスタイプでt２.microを使っているのが原因じゃないか？と思いましたが、お金がかかるのは嫌だったので、実験は出来ませんでした。
何かと止まる原因がわかるかたいたら教えてください。
デプロイ周りは書ききれないので、credentials.yml.encとmaster.keyと自動デプロイは別記事で書いておこうと思います！

#参考サイト
https://www.atmarkit.co.jp/aig/06network/privateip.html
Bash の here strings (<<<)

こんにちは。
Bash の here strings ```<<<``` を試しました。文字列を小文字化する例を行なっています。

```console
$ word="Japan"
$ word="$(tr '[:upper:]' '[:lower:]' <<< ${word})"
$ echo $word
japan
```

なお、POSIX シェルで同じことを行うには、

```console
$ word="Japan"
$ word="$(echo $word | tr '[:upper:]' '[:lower:]')"
```
JavaScriptでクォートをエスケープしないですむ方法を紹介

## JavaScriptでクォートをエスケープしないですむ方法を紹介
ES6までは、シングルクォートやダブルクォートをエスケープする必要が生じる場合もありました。

しかし。ES6からはバッククォートを使うことでこの問題を解決できます。

例:

```javascript
`'Hello' "World!"`
```

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
htm.coreをWindows10にインストールする

#実行環境
・Surface Pro 6
・Windows 10 (バージョン 1803)
・Anaconda 4.6.11
・gitはインストール済み

#インストール方法
1. https://visualstudio.microsoft.com/ja/downloads/ からVisual Studio 2019 Community をダウンロード
2. インストーラの.exeを実行し、「C++によるデスクトップ開発」の項目にチェックを入れてインストールを実行
3. https://cmake.org/download/ からWindows win64-x64 Installer をダウンロード
4. インストーラを実行 (Add Cmake to the system PATH for all usersにチェックを入れる)
5. Anaconda Promptで以下を実行

```
# Anacondaで仮想環境を作成
$ conda create -n <仮想環境名> python=3.7 pip
$ conda activate <仮想環境名>

# githubリポジトリをクローン
$ git clone https://github.com/htm-community/htm.core
$ cd htm.core

# cppファイルのコンパイル、pythonへのインストールを実行
$ python setup.py install --user --force

# 動作確認
$ python
>>> import htm
>>> import htm.bindings
>>> help(htm) # usageを表示
```

エラー(Module Not Found)等が出なければ完了。
WordPressのインスタ埋め込みプラグインが軒並み非公開になってる？

> このプラグインの公開は2019年8月8日に停止され、現在ダウンロードできません。

と記述があるインスタ埋め込みプラグインがいくつかあったので、使えるもの使えないものを調べてみました。(2019/8/11 23:30ごろ調べ)

## 非公開になっていたもの

- [AccessPress Feeds For Instagram](https://ja.wordpress.org/plugins/accesspress-instagram-feed/)
- [Custom Instagram Feed](https://ja.wordpress.org/plugins/easy-instagram-feed/)
- [DsgnWrks Importer for Instagram](https://ja.wordpress.org/plugins/dsgnwrks-instagram-importer/)
- [Elfsight Instagram Feed – Instagram Gallery](https://ja.wordpress.org/plugins/instashow-lite/)

## まだ公開されているもの

- [Smash Balloon Social Photo Feed（旧Instagram Feed）](https://ja.wordpress.org/plugins/instagram-feed/)
- [フィードフィードソーシャル– Facebook、Instagram、Twitter、YouTube、Pinterest](https://ja.wordpress.org/plugins/feed-them-social/)
- [Enjoy Instagram feed with Widget and Shortcode on WordPress website](https://ja.wordpress.org/plugins/enjoy-instagram-instagram-responsive-images-gallery-and-carousel/)

---

WordPressでインスタ埋め込みしているサイトをお持ちの方は、一度確認した方が良いかもしれません。
自作 Package の submodule の import と flake8

21世紀も20年経とうとしている今、Python スクリプトを走らせてスペルミスなどの単純ミスて止まるのは文明的じゃない; flake8 などの静的解析を使おう。それは多くの記事があるのでいいとして、自作の package に flake8 を使うと

```
F401 'mypackage.module1' imported but unused
```

みたいなことをいう。その import には意味があるんだけど... という話。


## 設定

*package* とは複数のモジュールがひとつのディレクトリに入ったもの:

```
mypackage/
  + __init__.py
  + module1.py
  + module2.py
```

```python
import mypackage
```

して使う。

`module1.py` では関数 `function1()` が、module2 には `class Class2` が定義してあるとしよう。

## 問題

```python
import mypackage

mypackage.module1.function1()
c = mypackage.Class2()
```

のように使うために `__init__.py` に

```python
import mypackage.module1
from mypackage.module2 import Class2
```

と書きたい。すると、

```bash
$ flake8 mypackage/*.py
mypackage/__init__.py:1:1: F401 'mypackage.module1' imported but unused
mypackage/__init__.py:2:1: F401 'mypackage.module2.Class2' imported but unused
```

と言われる。確かに `__init__.py` では使ってないけど意味はあるんだ。これらの import 文が無いと

```python3
import mypackage.module1
from mypackage.module2 import Class2
```

と毎回書かなければならないので、それはナイ。PEP8的な正解は？


## 解決法１（手っ取り早い方法）

`# noqa` とコメントすると flake8 などの *linter* が無視する。


```python
from . import module1  # noqa
from .module2 import Class2  #noqa
```


## 解決法２

やらなくても動くけど、package の公式の機能は `__all__` にリストアップべき。

> Any backwards compatibility guarantees apply only to public interfaces. Accordingly, it is important that users be able to clearly distinguish between public and internal interfaces.

> To better support introspection, modules should explicitly declare the names in their public API using the `__all__` attribute. 

https://www.python.org/dev/peps/pep-0008/

すなわち、

```python
from . import module1
from .module2 import Class2

__all__ = ['module1', 'Class2']
```

まず、`.` を使えば「このパッケージ」を意味するので、`mypackage` と繰り返し書かなくて良い。パッケージ名を変えても修正しなくていいという利点もある。そして `__all__` というリストに import したものを書く。すると、unused でなくなったので flake8 さんは満足。

### `__all__` とは

flake8 を満足させるためだけのダミーの変数というわけではなく、一応意味はある。

`__init__.py` に import を書かず、

```python
__all__ = ['module1']
```

と書くと、奨励されないアイツ `from mypackage import *` した時に

```python
from mypackage import *

module1.funtion()
```

`module1` が読み込まれる。もし、`__all__` も `from . import module1` も無ければ、`import *` でも　`module1` は読み込まれない。

`from .  import module1` があれば `__all__ = ['module1']` は不要なので `__all__` は重複とは言える。逆に、`__all__` だけでは `import mypackage` の時には自動 import してくれない。とはいえ、PEP8 に書かれていることなので、他の人も使う package として公開するときはちゃんと `__all__` を書くのが良さそう。


## 参考

すべてはここに書いてあった。

https://stackoverflow.com/questions/31079047/python-pep8-class-in-init-imported-but-not-used
Unityエディターが落ちるとき

# 経緯
- 安定していると思っていたプロジェクトで、エディターの更新を含む些細な複数の変更の後でエディターが落ちるようになり、パニクって解決までに無駄に時間を使ってしまいました。
- エディターが落ちる場合に、最初に確認すべきことを記事に残します。

# 何処で落ちたのか
- 落ちた後、再起動前に、Editor.logの終盤にあるスタックトレースをチェックします。
    - ログの所在は、マニュアルに記載があります。 ⇒ [ログファイル](https://docs.unity3d.com/ja/current/Manual/LogFiles.html)
    - 見方は普段Consoleに出てくるの同じ、下から上に呼ばれた順で、一番上が最後に呼ばれたものです。
- 今回はプラグイン(の使い方)が原因でした。
[Golang]構造体の使い方(フィールドで準備/初期化/値の設定)について(サンプル付き)

# いきなり全体のサンプル
```golang:いきなり全体のサンプルコード
package main
import "fmt"

type user struct {
	name string
	height int
	gender string
}

func main() {

	// 1. 初期化と値設定 別パターン
	u1 := new(user)
	u1.name = "織田"
	u1.height = 170
	u1.gender = "男"
	fmt.Println(u1) // => &{織田 170 男}

	// 2. 初期化と値設定 一気パターン
	u2 := user{name:"徳川", height:180, gender:"男"}
	fmt.Println(u2) // {徳川 180 男}

	// 3. 初期化と値設定 さらに省略パターン
	u3 := user{"豊臣", 165, "男"}
	fmt.Println(u3) // => {豊臣 165 男}
	
}
```

# 構造体とは
すごいざっくり言うと、複数の値をグループにして定義することができるもの…みたいです。

# フィールドの書き方
```golang:フィールドの書き方
type /*構造体の名前*/ struct {
	/*データの名前*/ /*型*/
	/*データの名前*/ /*型*/
	/*データの名前*/ /*型*/

	// こんな感じで、好きなだけ書く
}
```

```golang:フィールドのサンプル
type user struct {
	name string
	height int
	gender string
}
```

# 1.実際に使う(初期化と値設定 別パターン)
## まず初期化する
```golang:初期化の書き方
func /*何かのメソッドの中*/() {
	/*変数名*/ := new( /*構造体の名前*/ )
}
```

```golang:初期化のサンプル
func main() {
	u1 := new(user)
}
```

ちなみに、この時点では`0`や` `(空文字)が入って初期化され、ポインタで返されている。

## 次にフィールドに値を設定する

```golang:フィールドへの値設定の書き方
func /*何かのメソッドの中*/() {
	/*変数名*/ := new( /*構造体の名前*/ )
	/*上で定義した変数名*/ . /*設定したいデータの名前*/  = /*設定したい値*/
	/*上で定義した変数名*/ . /*設定したいデータの名前*/  = /*設定したい値*/
	/*上で定義した変数名*/ . /*設定したいデータの名前*/  = /*設定したい値*/

	// こんな感じでデータ定義してるものを、好きなだけ書く
}
```

```golang:フィールドへの値設定のサンプル
func main() {
	u1 := new(user) // 初期化

	u1.name = "織田"
	u1.height = 170
	u1.gender = "男"
	fmt.Println(u1) // => &{織田 170 男}
}
```
サンプルの方には、どのように出力されるか、やってみてます。
**ポインタなので、`&`が表示されています。**

# 2.実際に使う(初期化と値設定 一気パターン)

```golang:一気に初期化と値設定する書き方
func /*何かのメソッド*/() {
	/*変数名*/ := /*構造体の名前*/ { /*データの名前*/ : /*値*/ , /*データの名前*/ : /*値*/ , /*データの名前*/ : /*値*/ }
}
```

```golang:一気に初期化と値設定するサンプルコード
func main() {
	u2 := user{name:"徳川", height:180, gender:"男"}
	fmt.Println(u2) // {徳川 180 男}
}
```

かなりスッキリかけます。
ただし、**ポインタが返ってくるワケではないので注意**してください。
`fmt.Println`での実行結果も、`&`がありません。


# 3.実際に使う(初期化と値設定 さらに省略パターン)
```golang:初期化と値設定するさらに省略した書き方
func /*何かのメソッド*/() {
	/*変数名*/ := /*構造体の名前*/ { /*1つ目の値*/ , /*2つ目の値*/ , /*3つ目の値*/ }
}
```

```golang:初期化と値設定さらに省略したサンプルコード
func main() {
	u3 := user{"豊臣", 165, "男"}
	fmt.Println(u3) // => {豊臣 165 男}
}
```

さらに省略して、こう書くこともできます。
こちらも、ポインタが返されるワケではないので注意。
AWS CloudFormation RDS Auroraサンプルテンプレート

# はじめに

部品作成（RDS Auroraだけの作成）としての位置づけのCloudFormationのサンプルテンプレートを作成しました。
テンプレートはGitHubにあるので、[こちら](https://github.com/tanukinokegawa/AWSCloudFormationSampleRDSAurora.git)をご参照ください。
テンプレートはyamlパージョンとjsonバージョンがありますが、同じものを作成するので、お好きなほうをご利用ください。

# 構成イメージ

![20190810_AWS_CloudFormation_CreateRDSAurora_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353055/6a98afae-703f-0b04-0c4e-4755beb72661.png)


# コメント

細かい部分はGitHubの方を見ていただけると幸いです。
本稿はサンプルとしてご参考になればと記したものです。ご自分の環境にそぐわない場合もございますことご承知おきください。
Vision Frameworkを使ってリアルタイムでユーザーの顔をトラッキングしてみた


iOSアプリに顔認識を導入しようと思うと、昔ならOpenCVやTensorFlowでモデルをつくって…というようにいささかハードルが高く感じられたものですが、AppleさんがVisionフレームワークを用意してくれたおかけで、そのハードルは大きく下がりました。

今回、Appleのサンプルコードを使いながら、リアルタイムでユーザーの顔をトラッキングしてみました。

## できるアプリ
![vision_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299081/4a7981df-e631-04ca-d8b2-f4c6c7b77045.png)
このように顔の中の特徴的な部分（ランドマーク）を勝手に検出し、Bounding Box(境界ボックス)で囲ってくれます！
境界ボックスは、顔が移動すると追跡してくれるので、境界ボックスの座標をもとにして、顔が画面のどこに寄っているかなどもとることができます。

## サンプルコード
https://developer.apple.com/documentation/vision/tracking_the_user_s_face_in_real_time
このページのDownloadボタンからダウンロードして、実機でビルドすると顔認識アプリができます。

## 解説
サンプルコードの２３９行目あたりの

```
let faceDetectionRequest = VNDetectFaceRectanglesRequest(completionHandler: { (request, error) in
    
    if error != nil {
        print("FaceDetection error: \(String(describing: error)).")
    }
    
    guard let faceDetectionRequest = request as? VNDetectFaceRectanglesRequest,
        let results = faceDetectionRequest.results as? [VNFaceObservation] else {
            return
    }
    DispatchQueue.main.async {
        // Add the observations to the tracking list
        for observation in results {
            let faceTrackingRequest = VNTrackObjectRequest(detectedObjectObservation: observation)
            requests.append(faceTrackingRequest)
        }
        self.trackingRequests = requests
    }
})
```

で、検出された顔の解析が行われています。

ここの

```
for observation in results {
    let faceTrackingRequest = VNTrackObjectRequest(detectedObjectObservation: observation)
    requests.append(faceTrackingRequest)
}
```

のobservationから顔のランドマークやロール、ヨー角など様々な情報にアクセスできます。

たとえば、

```
for observation in results {
    let faceTrackingRequest = VNTrackObjectRequest(detectedObjectObservation: observation)
    requests.append(faceTrackingRequest)
    // 顔のロールの取得
    print(observation.roll)
}
```

のようなイメージです。

ついでに境界ボックスから顔が画面のどこに寄っているかもとってみましょう。

サンプルコードの554行目あたりの

```
guard let observation = trackingResults[0] as? VNDetectedObjectObservation else {
    return
}
```

で、トラッキングしたユーザーの顔の結果を取得しているので、この```observation```を使って、境界ボックスの座標を取得します。

```
if observation.boundingBox.maxX >= 0.9 {
    print("顔が画面の右に寄っています")
}
```

上のように書くことで境界ボックスのX座標の画面からの比率を取得することができます。（画面の右端が1です）

今回は境界ボックスのX座標が0.9以上で画面の右に寄っていると出力するようにしてみました。

## まとめ

Appleの機械学習で良いイメージはあまりなかったのですが、Visionフレームワークは予想以上に便利だなと思いました。

ただ、動画内でのまばたきや笑顔の検出はVisionだけでは厳しそうなので、Amazon Rekognition Videoなどを使う必要がありそうです。

とはいっても予想以上に面白かったので、これからもCore MLやCreate MLなどで遊んでみたいと思います。
すごいH本覚え書き

# はじめに
[すごいH本](https://www.amazon.co.jp/dp/4274068854/)の忘れそうな個所を覚え書き

# 第1章 はじめの第一歩
## 1.3 リスト入門
* Haskellのリストは同一データ構造．同じ型の要素を複数個格納できる．整数と文字両方からなるようなリストはつくれない．

### リスト中のリスト
* リスト中のリストはそれぞれ違う長さでもかまわないが，違う型は許されない．

# 第2章 型を信じろ！
* "型シグネチャ"...型を表す文字列のこと．2章途中で突然出てくる．注釈は4章に．

# 第7章 型や型クラスを自分で作ろう
## 7.8 型クラス 中級編
### サブクラス化
Numの型クラス宣言の例．NumのインスタンスになるためにはEqのインスタンスである必要がある．

```haskell:
class (Eq a) => Num a where
    ...
```

# 8章 入出力
## 8.2 Hello, World!
関数putStrLnの型は「文字列を引数にとり，空のタプル()を結果とするI/Oアクションを返す」．I/Oアクションは，実行されると副作用を含む動作をして結果を返すもの．このことを「I/Oアクションが結果を生成する」という．

```haskell:
:t putStrLn
putStrLn :: String -> IO ()
```

## 8.3 I/Oアクションどうしをまとめる
I/Oアクションからデータを取り出せるのは，別のI/Oアクションの中だけ．
doブロックの最後のアクションは名前を束縛できない．詳しくは第13章のモナドで．

# 9章 もっと入力，もっと出力
## 9.3 ToDoリスト
Control.Exceptionのリソース開放関数について

* bracket ：処理が終わると常に獲得したリソース開放
* bracketOnError ：何らかの例外が発生したときのみリソース開放

# 11章 ファンクターからアプリカティブファンクターへ
## 11.3 アプリカティブファンクターを使おう
`pure f <*> x`は`fmap f x`と等しい．`fmap f x`の代わりに`f <$> x`と書ける．

# 12章 モノイド
##12.1 既存の型に新しい型をくるむ
`newtype`キーワードは、1つの型をとり、それを何かにくるんで別の型にみせかける場合に使う

# 13章 モナドがいっぱい
## 13.7 モナド則
###左恒等性
`return x >>= f`と`f x`は等価．
###右恒等性
`m >>= return`は`m`．
###結合法則
`(m >>= f) >>= g`と`m >>= (\x -> f x >>= g)`が等価．
Mac+MAMPの開発環境にCakePHP3を導入しようとしてハマった話

CakePHP3使ってみるぞ！ってなり、composerで入れようとした。

```bash
$ php composer.phar create-project --prefer-dist cakephp/app appname
```

するとこんなエラーが。

```
Your requirements could not be resolved to an installable set of packages.
 
  Problem 1
    - cakephp/cakephp 3.0.x-dev requires ext-intl * -> the requested PHP extension intl is missing from your system.
   　　 .
   　　 .
    　　.
```

どうも、intlが入っていないらしい。intlを入れればいいのか、と思って調べてみたが、そんな簡単に入るものではないようである。

などと言っていると、この記事に出会った。

[MAMPとComposerを使ったCakePHP3\.xのローカル開発環境の構築 \- Qiita](https://qiita.com/YoshikiNakamura/items/bcceaaa3d064a08233c1)

この記事自体を見ても特に問題は解決しなかったのだが、本文中にこんな一文が。

>もしMAMPのPHPではなくMacにあらかじめインストールされているPHPを使っている場合は「Your requirements could not be resolved to an installable set of packages.」、「the requested PHP extension intl is missing from your system.」といったエラーメッセージが表示されるかもしれません。その場合はエラーに従って必要なモジュール等をインストールして下さい（ハマりポイントです）。

どうも、mac本体に入っているphpとMAMPのphpがあるようだ。実際に調べてみると、

```
$ which php
/usr/bin/php
```

プレインストールされているphpを使ってcomposerを動かしていたようだ。

なので、MAMPのphpを用いてみる。

```bash
$ /Applications/MAMP/bin/php/php7.2.10/bin/php composer.phar create-project --prefer-dist cakephp/app appname
```

実際これでうまくインストールが成功した。

# 追記(Dec 21, 2019)
MAMPで楽しようとせず、自分でインストールするのが一番である。
https://qiita.com/ebiyuu1121/items/daf1073a7aeebc480534
anyenv、pyenvでPythonバージョン管理、仮想環境作成、仮想環境でIDLE起動（Mac）

## anyenv、pyenvのインストール

参照：[anyenv と nodenv で node.js バージョン管理、設定後に gulp の設定を修正（Mac）](https://qiita.com/yoko_u/items/6c8ee617d5ea0ac13d13)

### anyenvでpyenvをインストールし、シェルを再起動

```
$ anyenv install pyenv
$ exec $SHELL -l
```

### anyenvのバージョンを確認

```
$ pyenv -v
pyenv 1.2.11
```

### pyenvでインストールできるPythonのバージョンを確認

```
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4.0
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  ...
```

### pyenvで Python 3.6.8をインストール

```
$ pyenv install 3.6.8
```

### インストールしたPythonのバージョンを確認

```
$ pyenv versions
```

### バージョンの切替　グローバル

```
$ pyenv global 3.6.8
```

### バージョンの切替　ローカル

```
$ pyenv local 3.6.8
```

### Pythonのバージョンを確認

```
$ python --version
```


## Python仮想環境の作成

### 仮想環境を作成するディレクトリに移動し、venvで仮想環境を作成


```
$ cd <仮想環境を作成するディレクトリ>
$ python3 -m venv <仮想環境名>　
```
例: 仮想環境名「testenv」の場合

```
$ python3 -m venv testenv 
```
[venv](https://docs.python.org/ja/3/library/venv.html) は、公式にPython3.3以上に追加されている仮想環境作成サポートのモジュール

### 作成した仮想環境の中に入る

```
$ cd <仮想環境名>
$ cd testenv
```

### 仮想環境の有効化

```
$ source bin/activate
```
Terminalの先頭に (testenv) のように仮想環境名が表示される 

## 仮想環境でIDLEを起動
[IDLE](https://docs.python.org/ja/3/library/idle.html) はPythonの統合開発環境、学習用環境

```
$ python -m idlelib.idle
```

### IDLEを閉じる
（ショートカット　⌘+W）

### IDLE起動時に以下警告が表示される場合

```
WARNING: The version of Tcl/Tk (8.5.9) in use may be unstable. Visit
http://www.python.org/download/mac/tcltk/ for current information.
WARNING: The system preference "Prefer tabs when opening documents" is set to
"Always". This will cause various problems with IDLE. For the best experience,
change this setting when running IDLE (via System Preferences -> Dock).
```
メッセージのとおり 
- Macの「システム環境設定」で「Dock」を開き、「書類を開くときはタブで開く：常に」 になっていたら他の項目に変更する
-  [the ActiveState web site](https://www.activestate.com/products/activetcl/downloads/) から ActiveTcl 8.6 をインストール（インストール後にPython の再インストールが必要）する

### Python を再インストール

```
$ pyenv uninstall 3.6.8
$ brew info tcl-tk #バージョンが8.6以上か確認
$ pyenv install 3.6.8
```


### 仮想環境を無効化

```
$ deactivate
```

参考：
[How to launch python Idle from a virtual environment (virtualenv)](https://stackoverflow.com/questions/4924068/how-to-launch-python-idle-from-a-virtual-environment-virtualenv)
スマートフォン（Android・iOS）で広告を消す方法

# はじめに
ここでは各種スマートフォンで広告をブロックするために、どのツールを使うのが良いかについて書こうと思います。具体的な使い方や他の選択肢については、「[なんJ AdGuard部](https://wikiwiki.jp/nanj-adguard/)（以下wiki）」等の他サイト・ページを参照してください。
このページの意義は、よりSEO対策[^1]がなされているQiitaからwikiへの誘導というところにあります。

[^1]: 要するに検索結果で上位に来やすい（＝多くの人の目に止まりやすい）ということです。デマや煽り上等の「まとめサイト」や役に立たない「自称攻略wiki（企業型ゲーム攻略サイト）」が、質の高い他サイトよりも上位に表示されることがあるのはこのためです。

# Android

## AdGuard for Android
無料[^2]で**ブラウザ（ウェブ）上広告・アプリ内広告共**に消すことができます。Androidは基本的にこのアプリ1つで充分です。
Google Playには「AdGuardコンテンツブロッカー」というアプリもありますが、これは機能制限版のアプリ[^3]なので注意してください。
このアプリを導入したい方は、まず「[AdGuard導入法](https://wikiwiki.jp/nanj-adguard/AdGuard%E5%B0%8E%E5%85%A5%E6%B3%95)」を参照してください。

[^2]: 無料でもほとんどの広告を消すことができますが、そのためには「DNSブロック」という機能を使う必要があります。しかしこの機能は完璧ではなく、「消費電力の増加」「v3.2以下では不具合が起きることもある」等のデメリットもあります。そのデメリットを無くすためには、有料のライセンスを購入しなければなりません。

[^3]: Samsung InternetとYandex.Browserの広告を消すためのアプリで、その他のブラウザやアプリ内広告を消すことはできません。

# iOS（iPhone,iPad,iPod Touch）

## 280blocker
250円で**Safari（ウェブ）上広告**を消すことができるアプリです。なおSafari以外のブラウザやその他のアプリの広告を消すことはできません。後述の別アプリも併せて利用する必要があります。
このアプリを導入したい方は、まず「[iOSにおける広告ブロック](https://wikiwiki.jp/nanj-adguard/iOS%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%BA%83%E5%91%8A%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF#e7a14187)」や「[280blocker公式サイト](https://280blocker.net/welcome/)」を参照してください。

## AdGuard for iOS Pro
240円で**アプリ内広告**を消すことができるアプリです。Safari（ウェブ）上広告も消すことはできますが不完全です。なので280blockerも併用することが推奨されています。
用途は後述の「DNSCloak」と同じなので、どちらか好きな方を使用してください。このアプリのメリットは設定が簡単なことで、デメリットは有料なことです。
App Storeには「AdGuard for **iOS**」というアプリもありますが、これは「AdGuard for **iOS Pro**」とは用途が異なったアプリ[^4]なので注意してください。
このアプリを導入したい方は、まず「[iOSにおける広告ブロック](https://wikiwiki.jp/nanj-adguard/iOS%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%BA%83%E5%91%8A%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF#ne6debc9)」を参照してください。

[^4]: 「AdGuard for **iOS**」はアプリ内広告を消すためのアプリではなく、Safari（ウェブ）上広告を消すためのアプリです。

## DNSCloak
無料で**アプリ内広告**を消すことができるアプリです。Safari（ウェブ）上広告も消すことはできますが不完全です。なので280blockerも併用することが推奨されています。
用途は前述の「AdGuard for iOS Pro」と同じなので、どちらか好きな方を使用してください。このアプリのメリットは無料なことで、デメリットは設定が難しいことです。
このアプリを導入したい方は、まず「[iOSにおける広告ブロック](https://wikiwiki.jp/nanj-adguard/iOS%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%BA%83%E5%91%8A%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF#ne6debc9)」を参照してください。

## 結び ～ まとめ
Android→Android for Android
iOS→280blockerとAdGuard for iOS ProまたはDNSCloak
基本的にこのような選択をすれば間違いありません。

**なお当ページは広告を消すための手段を紹介するものであって、Qiitaやwikiwikiの広告を消すことを推奨するためのものではありません。**
共発現解析（相関分析） 応用編+α

#前回までの内容
[1. R初心者のための共発現解析（相関分析） イントロ編](https://qiita.com/Ykeito/items/a7554397943c2168fb17)
[2. R初心者のための共発現解析（相関分析） 実践編](https://qiita.com/Ykeito/items/38191088a1edd2ba4979)
[3. 共発現解析（相関分析） 応用編](https://qiita.com/Ykeito/items/80fb013ca71fe9ba913b)
#目的
簡便かつ迅速に相関分析をすることに加え、**無相関検定を行うことでp値を算出すること。**
#対象
閾値をPCCではなくp値にしたい方。PCCがいくつ以上なら相関が高いかは恣意的であるため、統計的な指標を基に閾値を設定したい方にはおすすめです。
*PCC:ピアソンの相関係数
#簡便かつ迅速に相関分析ができるスクリプト
##Hmiscのインストール
```
install.packages("Hmisc")
```
##パッケージの読み込み
```
library(dplyr)
library(Hmisc)
```
##Hmiscの実装
Hmiscのrcorrを使うにはdata.frame型ではなく、matrix型である必要があるためas.matrixを使用。

```
T.data <- iris[, 1:4]
T.rcorr <- T.data %>% 
  as.matrix() %>% 
  rcorr()
T.PCC <- T.rcorr$r
T.Pvalue <- T.rcorr$P
temp <- combn(colnames(T.data), 2)
```
##PCC.tableに計算結果をまとめる
```
PCC.table <- data.frame(Source = temp[1, ],
                        Target = temp[2, ],
                        PCC = T.PCC[lower.tri(T.PCC)],
                        Pvalue = T.Pvalue[lower.tri(T.Pvalue)]
                        )
```
##p値が0.05より低いデータのみを抽出する
```
PCC005.table <- PCC.table %>% filter(Pvalue < 0.05)
```
#番外編
Hmiscを入れずにp値を求める方法も紹介します。

```
base <- cor.test(T.data[, 1], T.data[, 2])
T.pvalue <- base$p.value
T.PCC <- base$estimate
```
cor.testだとforを回さないといけないうえ、時間がかかってしまうので使えるならHmiscの方が良いと思います。
#参考サイト
>1. http://www.sthda.com/english/wiki/correlation-matrix-a-quick-start-guide-to-analyze-format-and-visualize-a-correlation-matrix-using-r-software
>2. https://www.statmethods.net/stats/correlations.html
RPGアツマールのグローバルシグナルでレイドバトルを実装する

# 概要

RPGアツマールには非同期ネットゲームを想定したAPIが存在します
「グローバルシグナル」を使ってレイドバトルを作ってみたのでその解説になります

## グローバルシグナルについて

* 公式
  * https://atsumaru.github.io/api-references/signal
* 以前書いた記事
  * [RPGアツマールのグローバルシグナルについて][link1]
  * 基本的な動き方のイメージはこちらに書いてあります
[link1]:https://qiita.com/shirogane/items/4b5616d0225cb9d68a5c

## 作ったもの

* レイドバトル(エンディング後の要素にしています)
   * https://game.nicovideo.jp/atsumaru/games/gm9445

# 仕様

<img width="400" alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107395/31636c7e-f72d-5f43-f548-ab7e662a69ff.png">

高HPなボスが出現して、他のプレイヤーも戦闘に参加し、協力してそのボスを倒す
というのを実現します

具体的な仕様は下記のとおりです

* ボスについて
  * **ユーザー1人**につき**ボスが1体**出現する
  * 出現から**24時間経過**で消滅する
  * ボスを倒した、もしくは、消滅したら、**翌日に**次のボスが出現する
  * **曜日によって**出現するボスが変わる
* 他のプレイヤー
  * 出現中のボスを選んで**戦闘に参加してダメージを与える**ことができる(これによりあるプレイヤーが他のプレイヤーのボスに対して攻撃することができる)


# 実装について

## 送信するシグナルの情報

戦闘終了時に、以下の情報を入れてグローバルシグナルを送信します
これにより、シグナルを受け取ったプレイヤーは別のプレイヤーのボスの存在を知れる状態になります

* 誰のどのボスかを識別する情報
  * ユーザーID
  * セーブ番号
  * ボスのレベル(倒せた場合に次回出現時に1上がる)
* 戦闘結果
  * ボスに今回与えたダメージ
  * ボスの残りHP
* ボスの情報
  * 敵グループID
  * 出現した時間(UnixTimeから「時」を算出する)

```javascript
{"id":101,"sig":[00000,1,14,999865792,134208,196,434706]}
```
戦闘結果に応じて配列に詰めてこのようなjsonを送信しています
シグナルは**100byte**の制限があるので収まるように注意してデータの内容を決めます

## 誰のどのボスかを識別する

誰の**(ユーザーID)**どのセーブの**(セーブ番号)**どのボス**(ボスのレベル)**か、
によって、誰のどのボスかを一意に識別しています

「戦闘結果」のところに書いたHPの計算をするために、シグナルが来たときにどのボスに対してダメージを与える計算をするかに使います

**1つのゲームで複数のセーブデータを許す場合**、ユーザーIDだけだと一意に識別することができなくなります。ゲームの仕様次第ですが、ゲーム開始時に現在時刻などからハッシュを作ってセーブデータを一意に判別できるようにするなどをやっておくとよいです。今回実装したゲームでは、セーブは複数できるけど途中でセーブ番号が変えられないような仕様にしています。
ただ、この辺ややこしくなりそうならセーブデータは1個しか保存できないようにした方がシンプルになるかと思います。

## 戦闘結果

シグナルの受け取り側がボスの状況を再現するのに必要な情報を入れます

そのために必要な情報が
**「誰が何ダメージ与えたか」「合計何ダメージ与えられて残りHPがいくつか」**です
必要な理由はそれぞれ以下の通りです

* **「誰が何だダメージ与えたか」**
   * シグナルを受ける側は与えたダメージの情報を単純に引くことで、残りHPを計算します。同じボスに対して2人3人4人など複数が同時に攻撃をしかけた場合にはこれの合計値が使われることになります

* **「残りHPがいくつか」**
   * すべてのグローバルシグナルは受け取れない可能性があることを考慮しなければならないため、1個のシグナルで1体分のボスを表現できるようにします。そのため「残りHP」の情報も含めています

後は、
シグナルを受け取る度に、以下の2つの計算結果から**残りHPが小さくなる方**を採用して、自分の手元にあるボスの情報を更新します

* 手元のボスの残りHPから与えたダメージを引く
* シグナルに含まれた残りHP

これにより、ダメージがより進んでいる方が採用されます

## ボスの情報

* 敵グループID
   * 曜日ごとにボスを変えるため、敵グループIDを入れておきます

* 出現した時間
   * ボスが出現した時点でUnixTimeの年月日時分秒...の内、「時」を記録しておきます。出現から24時間経った時点で倒せていなかったら消滅した判定をします

# まとめ

他プレイヤー間のボスを表現するために必要な情報をこのようにしてグローバルシグナルで実装できました
これによりレイドバトルをグローバルシグナルで実現しています
registerTorchCallbackのAPIバージョンmin23設定でハマった

registerTorchCallback を使用した際にハマったことのメモ

APIレベル23（Android6）以降のみで使用できるメソッド。

自分はもともとAndroid5.1まで対応可能なプロジェクトを作成していた（APIレベル22）ため、「使おうとしてるメソッドやと、おたくが設定したAPIレベルじゃ対応でけん端末があるで。ええ具合に修正してや。直さんかったらビルドさせん」エラーが発生。

改めて読んでみると、「AndroidManifestファイルに<uses-sdk minSdkVersion="XX" />対応させたい最低限のAPIレベルを書き込むか、build.gradle（モジュール:app）に書き込めや」とのこと。

まず、manifestファイルに以下記述。

```AndroidManifest.xml
<uses-sdk minSdkVersion="23" />
```
実行してもエラーが直らない。改めてエラーが発生「manifestファイルにminSdkVersionは書かんといてや。　結局gradleファイルから上書きするし」

最初からそう言えや！ということで、build.gradle(モジュール:app)内を確認すると以下記述を発見。こいつがやんちゃしてたか。

```build.gradle(module_app)

android{
...
  defaultConfig{
      minSdkVersion 22//←23に修正
...
  }
}
```

修正後、manifestファイルからは当該項目を削除するとエラーが消えた。
ただし、Android6以前には対応でけん。まあ個人用やしええで。

https://developer.android.com/reference/android/hardware/camera2/CameraManager.TorchCallback.html