OmniAICreator/Qiita-1.07M huggingface dataset:
【CraftCMS】ElementAPIでフロントエンドにjsonだけ返す

#スコープの切り分け問題
CraftCMSではCPで定義したsectionやfieldのhandleをtwigでモリモリ書いて出力する、
いわばオーソドックスなMVCデザインパターンに則った構成です。

他のCMSをディスるわけではないですが某何とかPressとかは
テンプレートに**<?php 〜 ?>**みたいな記述がそこかしこで必要なもんで
個人的に可読性の低下を感じてしまい、あんまり~~好きじゃない~~得意じゃないです。
(´-`)oO( Timberとか使えばWord何とかもTwig使えるんだったかな… )

一方デフォルトでテンプレートエンジンを積んだCMSは（ある程度ですが）元のソースを大きく崩すことなく動的なアウトプットが可能であり、
それこそCraftやDrupalなんかはそこそこ見やすい＆書きやすいのが取り柄の1つじゃないでしょうか。

そういう経験からこう考えていたもんです。
**「CMSとかFrameworkのView部分はSmartyとかTwigとか使うのがセオリー。
　テンプレートはフロントの人が作るから、データのアウトプットはバックエンドに任せて
　じゃとりあえずテンプレートはダミーテキスト入れといて、あとで埋め込んどくから――」**

ところが最近というかもう結構前からですが、
フロントエンドだけでViewを完結するような思想がウチの会社では主となってしまいました。

しまいましたって別に悪いこっちゃなくて、むしろデータこねこねはバックエンド、ドバドバはフロントエンドという切り分けが明確になったため、
余計なことを考えずに最後にecho $json;すれば完結するようになったのがとても楽。

##ElementAPIとは

ということで本題ですが、まさに前述の実装を実現してくれる公式のプラグインがElementAPIです。
[リポジトリはこちら](https://github.com/craftcms/element-api)

Endpointを定義して返却するjsonを設計,実装する & フロントエンドで叩いてもらう

これだけでデータを簡単に展開出来るAPI、だいぶお気に入りです。
![スクリーンショット 2019-07-23 21.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/8b86a411-3a12-ffd6-2d99-f66a0223409c.png)

プラグインの実モジュール部分は割愛しますが、element-api.phpだけをイジればよいので
非常に楽。とにかく楽。

#実装方法

プラグインの入れ方は単純にcomposerなりで導入するので端折ります。

``` element-api.php

<?php
use Craft;
use craft\elements\Entry;
use craft\elements\Asset;
use craft\elements\Category;
use craft\helpers\UrlHelper;
use League\Fractal\TransformerAbstract;

return [
	"endpoints" => [
		"api/news/archives.json" => 
		[
			"elementType" => Entry::class,
			'criteria' => [
				'section' => 'News',
				'orderBy' => 'postDate DESC',
			],
			'paginate' => $_GET['size'],
			'elementsPerPage' => 9,
			'pageParam' => 'size',
			'transformer' => function (Entry $entry){
				return [
					'id'		=> $entry->id ,
					'title'		=> $entry->n_title,
					'main_img' 	=> $entry->n_image->one()->url,
					'time'		=> $entry->postDate->format("Y.M.d"),
					'article'	=> preg_replace('/<p.*?>|<\/p>/mis', '', $entry->n_detail),
				];
			}
		],
		"api/news/<news_id:\d+>.json" => function($news_id){
			return [
				"elementType" => Entry::class,
				'criteria' => [
					'news_id' => $news_id,
					'section' => 'News'
				],
				~ 省略 ~
			];
		}
	];

```

ものすごいreturnします。
リストを取得したい場合は上のエンドポイント、詳細を取得したい場合はIDを付与して下のエンドポイントを実行すると
それぞれに対応した結果が取得出来ます。
ちょっと実ソースがものすごい長いのですいませんが省略します…。
上の大事な項目（全部大事だけど）は以下。

| キー | 役割 |
|----|----|
| endpoints | アクセスするURLを定義 |
| elementType | 取得したいデータの型を定義 |
| criteria| 取得したいデータの基準（条件）を定義 |
| transformer| データを加工したい場合はこのスコープで |

結果としてtransformer内でreturnしている内容がjsonとして出力されます。
フロントエンド側の人にはjs側で
https://morimorigohan.jp/api/news/archives.json
https://morimorigohan.jp/api/news/12.json
のようにアクセスしてもらえば
上記で予め設計した形のjsonが受け取れるというスンポーです。

**おわり。**
Google Cloud Platformのタイムゾーン設定

GCPのAppEngine上でphpサーバーを動かして、Cloud SQLでMySQLを使っているのですが、
タイムゾーン設定がどちらもデフォルトでUTCになっており、JTCへの設定変更に詰まったのでメモに残します。

## Cloud SQLの設定
ダッシュボードの設定 > 設定の編集 から`default_time_zone`フラグに`+09:00`を追加する。
![スクリーンショット 2019-07-24 21.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266914/0a130119-72fa-c492-d231-7b81925798ac.png)

これでMySQLの接続して確認できたらOK

```console
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | +09:00 |
+------------------+--------+
```

## AppEngineの設定
デプロイ時にapp.yamlと同じ場所にphp.iniを配置する。

php.iniの中には、

```php.ini
date.timezone = "Asia/Tokyo"
```

以上です。

AppEngineが一番ハマったのに文量ほぼなかった。
Pythonでソートアルゴリズムの再発明をしてみる: 選択ソート

# 概要
* Pythonでソートアルゴリズムを再発明してみるだけ
* 今回は選択ソートについて
* 参考サイトのサンプルコードをできるだけ見ずに実装する
* とりあえず昇順ソートのみの対応とする

# 選択ソートの概要
* 要素を一通りなめて、最小だった値を左端の要素と交換するということを繰り返すアルゴリズム[^1]

[^1]: 最大値を探して右端の要素と交換するという手順でも可能ですが、ここでは最小値でやることとします。
* シンプルで実装が容易である一方、基本的に遅い
* 不安定ソート

## 基本的な手順
1. 左端の要素を「最小値」と見立てる
2. 配列を左から走査して「最小値」と比較し、より小さい値があれば「最小値」を更新する。これを右端に到達するまで行う
3. 左端の要素と最小値の位置を入れ替える（この時点では、「最小値」は本当の最小値になっているはず）
4. 左端の要素は処理の対象外として、また手順1から繰り返す
5. 全ての要素が処理対象外になったらソート完了

# ソース
```python
import random

def selection_sort(lst):
    # 処理全体のループ
    # iの値が更新されることで処理対象範囲が狭まる
    for i in range(len(lst)):
        # 処理対象範囲の中での左端を仮の「最小値」とする
        min_value = lst[i]
        min_index = i
        # 処理対象範囲の中での、本当の最小値を探すループ
        for j in range(i+1, len(lst)):
            if min_value > lst[j]:
                min_value = lst[j]
                min_index = j

        # 処理対象範囲の中での、左端と最小値を入れ替える
        lst[i], lst[min_index] = lst[min_index], lst[i]

lst = list(range(10))
random.shuffle(lst)

print("ソート前: " + str(lst))

selection_sort(lst)

print("ソート後: " + str(lst))
```

# 参考サイト
* https://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%BD%E3%83%BC%E3%83%88
Coursera Machine Learning Stanford Univ. Week6

今週はテストが２つ、プログラミングが１つです。
プログラミングはcross validationがテーマです。

# 講義のポイント

- BiasとVariance
- Cross validation
- Precision/Recall F1
- Learning curve

BiasとVarianceってどっちがどっちだかよくわからなくなります。
Varianceはモデルの予測値と実際の値の差が大きかったり小さかったりのばらつきなのでover fittingの時大きくなる。Biasが大きいのは平均誤差が大きいときでunder fittingの時はBiasが大きくなる。

trainingデータのcost functionの値とcross validationのcost functionの値をグラフ化してBiasが大きい状態、Varianceが大きい状態化などを分析するというところが今週のポイント。

モデルの評価をするときに使う指標のRecall、Precisionとそれらの調和平均のF1はおなじみだと思いますが、よくRecallとPrecisionのどっちがどっちだかわからくなることがあるのでこの際よく覚えたいと思います。
RecallはPositiveなものをRecall（再現、当てられる）割合とおぼえることにします。
（PrecisionはPositiveと予測したものが正しい割合）
# プログラミング
今週の提出課題は下記の４つ

- linearRegCostFunction.m - Regularized linear regression cost function
- learningCurve.m - Generates a learning curve
- polyFeatures.m - Maps data into polynomial feature space
- validationCurve.m - Generates a cross validation curve

今週はこれまでより簡単な感じというか、これまでの課題ができていればすぐわかる感じです。
linearRegCostFunction.m が最初意味がよくわからなかったけどtrainingデータの数を変化させてそれぞれフィッティングしたΘを使ってcostを計算。おなじΘでcross validationデータのcostも計算すればよい。
validationCurve.mの方はtrainingデータの個数は固定でλを変化させたときのcostをtrainingデータとcross validationデータそれぞれ計算する。

#今週の反省
テストを1回でクリアできませんでした。英語力がないので正解文をすべて選べというのはちとつらい。よく読むしかないですね。
Azure Functions（v2）を使って決まった時間に関数を動かす

## あらまし

毎朝、今日のタスクをSlackに投稿するのに[Azure Logic Apps](https://azure.microsoft.com/ja-jp/services/logic-apps/)と[Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/)を使っていました。Azure Logic Appsは視覚的にわかりやすかったですし、非常に簡単にフローを構築できました。しかし、微々たるものといえどコストがかかることや、Slackコネクタでは個人に対して送信できないこともあり、Functionsに移行しました。その時に見落としていたポイントをまとめます。

## タイマートリガーを使ってみよう

Azure Functionsには様々なトリガーが存在します。トリガーとは、いわゆる『関数（プログラム）を動かす起点』です。

例えば、HTTP処理を行うための「HTTPトリガー」やCosmos DBで処理があったときに動作する『Cosmos DBトリガー』が挙げられます。今回は決まった時間に関数を動かしたいので、『タイマートリガー』を使ってみましょう。

## タイマートリガーの指定方法

タイマートリガーの指定方法はLinuxでサーバ管理を行っている人なら親しみがあると思いますが、指定方法はcronと似ています。

```
{second} {minute} {hour} {day} {month} {day-of-week}
```

([Azure Functions のタイマー トリガー | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer) CRON式より引用）

例えば、5分毎に関数を実行したい場合は以下のように記載します。

```
0 */5 * * * *
```

## 「ある時刻に処理を行う」ときには注意する

「毎日午前8時に関数を実行する」場合には注意するポイントがあります。それは、**Azure Functionsで扱うタイムゾーンは世界標準時（UTC時間）**ということです。

例えば、毎日午前8時00分に実行する場合は、タイマートリガーで指定するのは23時00分を指定します。

```
0 0 23 * * *
```

従来のサーバではタイムゾーンを指定していましたが、関数内で日付や時間を関数の中で扱う場合は設定側で工夫し、調整しましょう。

## まとめ

- Azure Functionsのタイムゾーンは**UTC時間**
- 言語によっても扱いが異なるため、気になる場合はAzure Functions上にデプロイして動きを確認する
- 開発中に確認する時は実行結果だけではなく、ログに実行時刻も出力してどのようになっているか確認したほうが早く実現できる

## 参考

- [Azure Functions のタイマー トリガー | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer)
- [Azure Functions のトリガーとバインド | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-triggers-bindings)
【AWS CLI】コマンドプロンプトでconfigureを切り替える

defaultから切り替えるには`--profile`オプションを付ける。

```
>aws s3 list --profile [profile_name]
```

オプションを付けなくても常に切り替えたい場合は、環境変数`AWS_DEFAULT_PROFILE`に使いたいプロファイルの名前を設定しておく。

```
>set AWS_DEFAULT_PROFILE=[profile_name]
>aws s3 list
```
git log をよしなに整形してコミットツリーを可視化する

完成図がこちら。
![スクリーンショット 2019-07-24 20.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319120/4b936ceb-ab50-8b91-2b6b-6d7c007813d9.png)

# はじめに
`git log`を見やすくする方法としては
[git log を見やすくする - Qiita](https://qiita.com/takasianpride/items/842a785af610025a2030)
などでも紹介されていますが、`git log`のオプション整理と勉強も兼ねて、せっかくなので自分でしっくりくるフォーマットにまとめて見ました。

# git log にくっつけるオプションたち
コマンド全体はこちら。

```shell
$ git log --all --date-order --date=format:"%Y-%m-%d" --graph --format=" <%h> %ad [%an] %C(green)%d%Creset %s"
```

使用したオプションたちは以下になります。
#### `--all`
全ブランチを表示する。

#### `--date-order`
コミット順で表示する。
(デフォルトは親子関係を元に表示順が決定される。)

#### `--date=format:"<format>"`
dateを指定フォーマットで表示する。

* %Y : 西暦4桁
* %y : 西暦2桁
* %m : 月2桁
* %d : 日2桁

その他のプレースホルダーは`git help log`でご確認ください(丸投げ)。

#### `--graph`
コミット履歴をラインで結んで可視化する。

#### `--format="<format>"`
コミットログの各情報の表示/非表示やフォーマットを指定する。

* %H : コミットハッシュ
* %h : コミットハッシュ(短縮版)
* %ad : Authorの日付
* %an : Authorの名前
* %d : HEADとブランチ
* %s : コミットメッセージ(の１行目)
* %C(\<color\> \<style\>) : 表示色のフォーマットを指定する。
    + \<color\> : normal, black, red, green, yellow, blue, magenta, cyan, white
    + \<style\> : bold(太字), dim(減光), ul(下線), blink(点滅), reverse(反転)
* %Creset : 指定した表示色を解除してデフォルトにする。

その他のプレースホルダーは`git help log`で略。

# aliasに登録
無限回使用するのでaliasに登録しておくと便利です。

```sh
git config --global alias.tree 'log --all --date-order --date=format:"%Y-%m-%d" --graph --format=" <%h> %ad [%an] %C(green)%d%Creset %s"'
```

あとは`git tree`とするだけで↑が実行されます。
\<format\>を極めて僕の/私の考えた最強のtreeコマンドを作ろう！

# オチ(蛇足)
そもそも何でこんなこと調べることになったかと言うと、
PC更新にあたってgitのconfigもお引越ししようと思ったのですが、
git config --globalをはじめどこを見てもtreeのaliasが見当たらない、という(しょーもない)ことがキッカケでした。
~~そもそも息を吸うように使っていたので完全にgit for windowsのデフォルトコマンドだと思い込んでいました。~~

しかも、確かに冒頭の記事を参考にしたはずなのですが、何故か自分の使用していたフォーマットと微妙に異なる(冒頭の図)。

昔のことすぎて何も思い出せないので、この際一から調べて同じフォーマットを再現しよう、ということになりました。

# オチ(隙を生じぬ二段構え)
試しに旧PCで`git help tree`と叩いたら

```sh
'tree' is aliased to 'log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short'
```

と吐き出しました。
一体、いつ、誰が、どこに定義したんだ。。。

~~諸々調べてた時間とは~~
改めてmanualページなどをちゃんと読む良い機会になりました。

# 参考
`git help log`(manualページ)
[git log を見やすくする - Qiita](https://qiita.com/takasianpride/items/842a785af610025a2030)
[git logを時間順にソートする](http://dqn.sakusakutto.jp/2014/10/git_log_date_order.html)
[GoogleCloudPlatform/nodejs-docs-samples](https://github.com/GoogleCloudPlatform/nodejs-docs-samples)
[Ruby] String#gsub で半角カタカナを全角カタカナに変換する

# 方法

## コード

```rb
'ﾀﾋﾟｵｶ'.gsub(/[\uFF61-\uFF9F]+/) { |str| str.unicode_normalize(:nfkc) }
#=> "タピオカ"
```

## 説明

* `'ﾀﾋﾟｵｶ'.unicode_normalize` と書かずに gsub を介しているのは、Unicode 正規化を適用する文字列を限定し、想定外の置換が起きないようにするため。
* 半角カタカナの Unicode コードポイントについては、@scivola さんのコメント、および Wikipedia の [半角カナ ≫ Unicode (UTF-8, UTF-16 など)](https://ja.wikipedia.org/wiki/%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A#Unicode_(UTF-8,_UTF-16_%E3%81%AA%E3%81%A9)) を参考にした。

## 旧方法

@scivola さんにコメントをいただく前に紹介したいた方法。半角カタカナ以外も Unicode 正規化してしまうため改善が必要だった。

## コード

```rb
'ｶﾝﾀﾞﾀ'.gsub(/\p{In_Halfwidth_and_Fullwidth_Forms}+/) { |str| str.unicode_normalize(:nfkd) }
#=> "カンダタ"
```

## 説明

* Ruby の正規表現では `\p{}` で Unicode プロパティを指定できる。
    * 指定可能な Unicode プロパティの一覧は [Onigmo/doc/UnicodeProps.txt](https://github.com/k-takata/Onigmo/blob/master/doc/UnicodeProps.txt)[^1] を参照すること
    * 半角カタカナや半角濁点・半濁点は [Halfwidth and Fullwidth Forms](https://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block)) に属している。

# 関連

* [Ruby でローマ数字の文字 (機種依存文字) をアルファベットに変換する](https://qiita.com/QUANON/items/34bab6a532b1350b15f7)

# 参考

Unicode 正規化について復習するのに以下のページが役立った。

* [文字コード地獄秘話 第3話：後戻りの効かないUnicode正規化](http://tech.albert2005.co.jp/501/)

[^1]: [Onigmo](https://github.com/k-takata/Onigmo) は Ruby (2.0 以降) で採用されている正規表現エンジン。
RailsでPostGISなカラムに値を入れる

## TL;DR

PostGIS入れてactiverecord-postgis-adapter入れてgeometry型カラムを持つモデル作ったけどRailsでどうやって値入れるんだっけ？
→これでいけそう。

~~~
RGeo::Geographic.spherical_factory(srid: 4326).point(139.7003912, 35.6897376)
~~~

## 環境

mac OS X mojave
Ruby on Rails 5.2.3

## 検証

+ PostgreSQLをインストール(PostGISも) 

~~~
$ brew install postgresql
$ brew install postgis
$ brew services postgresql start
~~~

+ Railsプロジェクトを立ち上げ、 `activerecord-postgis-adapter` gemを追加

~~~
$ rails new test_application
$ cd test_application
$ echo "gem 'activerecord-postgis-adapter'" >> Gemfile
$ bin/bundle
~~~

+ DBを初期化

~~~
$ bin/rails db:create
$ bin/rails db:gis:setup
~~~

+ モデルを作成

~~~
$ bin/rails g model Location name:string point:geometry #geometry型でモデルを作成
$ bin/rails db:migrate
~~~

+ db/seed.rb にLocationモデルを作成
    + SRID: 4326 は世界測地系のSRIDの一つ
    + SRIDについては [こちらを参考にしました](https://qiita.com/boiledorange73/items/b98d3d1ef3abf7299aba)

~~~
Location.create(
  name: "新宿駅",
  point: RGeo::Geographic.spherical_factory(srid: 4326).point(139.7003912, 35.6897376)
)
~~~

+ DBに値が挿入されていることを確認

~~~
$ bin/rails c
irb(main):001:0> Location.all
=> #<ActiveRecord::Relation [#<Location id: 1, name: "新宿駅", point: #<RGeo::Cartesian::PointImpl:0x3fcd7929c4e0 "POINT (139.7003912 35.68973764)">>]>
~~~
RaspberryPiをノートパソコン（win10）からリモートGUIで使えるようにする

# やったこと
ラズパイを毎回ディスプレイ＆キーボード＆マウスにつなぐのが面倒だったので、ノートパソコンからリモートで使えるようにした。

# 方法
1. ラズパイの設定からVNCとSSHをオンにする（SSHはいらないかも）
2. `ifconfig`コマンドを実行してwlan0のinetにあるIPアドレスをメモる
3. [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/windows/)をインストールする
4. VNC Viewerを開く
5. 上にIPアドレスを打ち込むところがあるので打ち込む
6. パスワードを求めらるので入力する

これでリモートGUIでラズパイをいじれます
【DataSpider】HTTPトリガーに引数を渡す

##前書
ヘルプを見ても見つからなかった
勘でやったら動いた

##やり方
- スクリプト引数/値を空欄にする
- クエリ文字列のキーをスクリプト引数/変数名と一致させ、渡したい値を指定する

要するに、深く考えず以下のようにしてしまってOK
http://(中略)/hogetrigger?arg1=value



##要調査事項
- レスポンスの受け取り方
- POSTで引数を渡したい場合

##後書
${trigger.arguments["引数名"]}みたいな指定方法だと思ってめっちゃ探した(´・ω・`)
docker 18.0.9.8 にアップデートがかかってdockerが使えなくなった。

# 現象
Ubuntu18.04でdocker-ceをインストールして使っていました。
以前は平気で使えていたdockerが急に

```shell

docker ps
> Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

と言い出しました。


[Qiitaのこの記事](https://qiita.com/aoi1/items/7602ec6530eaab29aeee)やいろんな記事を参考にしたのですが、解決しませんでした。

# 解決へ (ダウングレード)
そもそも何が起きたのか`/var/log/dpkg.log`を見ると、数日前に`docker-ce:amd64 5:18.09.8~3-0~ubuntu-bionic`にアップロードされたことがわかりました。
いろいろ調べても治らないので、
[このgithubのissue](https://github.com/docker/for-linux/issues/597)を参考に、dockerのバージョンをダウングレードしました。
[[Ubuntu] apt-get まとめ](https://qiita.com/white_aspara25/items/723ae4ebf0bfefe2115c)を参考に、
`sudo apt-cache policy docker-ce`でインストール可能なdockerのバージョンが出てきます。
`sudo apt install docker-ce=5:18.09.1~3-0~ubuntu-bionic`としてやってガイドに乗っていくと直りました。(Ubuntu 18.04 を使っているのでgithubのxenialをbionicに変えました。)
【Android】MaterialShowcaseViewを使ってAndroidでチュートリアルを実装した際のメモ

# 概要

AndroidアプリでMaterialShowcaseViewというライブラリを使ってチュートリアルを実装したときのメモ
以下に示す参考記事に記載されていることは書かない。

実際にソースコードを読んで、動作確認したものを示す。

随時更新予定

## このライブラリを選んだ理由

競合ライブラリと比較して、以下の理由からこのライブラリを選んだ。
- GitHubスター数が多い
- 継続的にメンテナンスされている
- 検証段階でもスムーズに実装できた

## GitHub

- [deano2390/MaterialShowcaseView - GitHub](https://github.com/deano2390/MaterialShowcaseView)

## 参考記事

- [MaterialShowcaseViewでAndroidアプリのチュートリアルを実装する - Qiita](https://qiita.com/phicdy/items/a8c9b9f93192bd5efd71)
- [【Android】こういうのが欲しかったMaterialShowcaseViewを使ってみた！ – 読書大好きプログラマーの記録
](https://www.programming-shimomura.com/2017/05/24/%E3%80%90android%E3%80%91%E3%81%93%E3%81%86%E3%81%84%E3%81%86%E3%81%AE%E3%81%8C%E6%AC%B2%E3%81%97%E3%81%8B%E3%81%A3%E3%81%9Fmaterialshowcaseview%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)

## .setShape()

ハイライトの形状を指定する。こちらのメソッドはオプショナルとなっており、デフォルトでは円形となっている。

### 円形

.setShape(CircleShape())

※デフォルト値

### 楕円形

.setShape(OvalShape())

### 四角形

.setShape(RectangleShape(Rect()))

### ハイライトなし

.setShape(NoShape())

## .setDismissStyle()

オーバーレイのスタイルを指定する。
Typefaceクラスのインスタンスを引数として受け取る。
Typefaceクラスをインスタンス生成する際、以下のように.createでインスタンス生成する。
`Typeface.create("sans-serif-condensed", Typeface.NORMAL)`  
第一引数にフォントファミリーネームをString型で渡し、第二引数にスタイルを定数で渡す。

### フォント指定(第一引数)

.setDismissStyle(Typeface.create("sans-serif-condensed", Typeface.NORMAL))

※sans-serif-condensed を指定した例

### スタイル指定(第二引数)

.setDismissStyle(Typeface.create("sans-serif-condensed", Typeface.NORMAL))
.setDismissStyle(Typeface.create("sans-serif-condensed", Typeface.BOLD))
.setDismissStyle(Typeface.create("sans-serif-condensed", Typeface.ITALIC))
.setDismissStyle(Typeface.create("sans-serif-condensed", Typeface.BOLD_ITALIC))
.setDismissStyle(Typeface.create("sans-serif-condensed", Typeface.STYLE_MASK))

BOLDなど指定できる。

## .setDismissOnTouch()

オーバーレイがタップされた際にオーバーレイを消すか指定する。

### 消す

.setDismissOnTouch(true)

### 消さない

.setDismissOnTouch(false)

※デフォルト値

## .setTargetTouchable()

オーバーレイが表示されている状態でハイライトされている部分をタップできるか指定する。

### タップできる

.setTargetTouchable(true)

### タップできない

.setTargetTouchable(false)

※デフォルト値

## .useFadeAnimation()

オーバーレイが消えるときフェードアウトのアニメーションを行うか指定する。

### .useFadeAnimation()

フェードアウトのアニメーションを行う。

# 所感

簡単なチュートリアルであれば、こちらのライブラリでサクッと1日とかで実装できて楽ちん。
ドキュメントが少ないので、設定を変更する際はコードを読む必要があるものの、そこまで複雑ではない。
今回は私は拡張していないが、拡張するにしても継承したClassを作ってメソッドを追加するなり上書きするなりしてそこまで大変じゃなさそう。
ライブラリの依存関係もシンプル&実装もシンプルなので、導入してからのリバートも容易。
which cloud provider is better AWS vs Azure?

Microsoft Azure and Amazon net Services area unit the 2 biggest cloud service suppliers within the world. Deciding that cloud supplier to use for your business or organization is a tough call. the solution can depend upon a spread of various concerns as well as value, security, and onboarding. It additionally depends on whether or not your company engages in rising technologies and what business sector you vie in. to assist TechGenix readers buckle down and do the dizzying options and capabilities of those 2 platforms, so I am writing my honest opinion for <a title="AWS vs Azure" href="https://intellipaat.com/blog/aws-vs-azure-what-is-the-difference/">AWS vs Azure</a>.

Each cloud supplier has its own niche once it involves craft its options to the organizations inquisitive about shopping for. as an example, whereas Microsoft’s Azure thrives in a very Windows surroundings, AWS works best once deployed in very UNIX surroundings. Azure, stemming from Microsoft’s B2B powerhouse that has spun off alternative spectacular suites like Office365, is that the best cut-out for enterprises, whereas AWS’ setup is well-suited for alternative industries like retail and finance.

On the down facet, Azure does not provide the maximum amount support for DevOps strategies as different cloud platforms. Its dev tools ar double-geared to the Microsoft methodology of development, and there ar lots of Microsoft retailers that ar doubtless smart therewith.

And whereas Microsoft will support several open supply initiatives like Hadoop and Kubernetes, AWS has abundant larger and deeper support for all the world from the open supply community. Microsoft has come back a protracted method however still has some catching up to try to to.

Also, AWS has done its best to produce headache-free licensing, whereas with Microsoft, it gets a small amount difficult. If you have got Microsoft licenses, you would possibly be eligible for license quality to maneuver to the cloud, therefore you don’t ought to buy each the on-prem and cloud version. this can need some work on your give up your consultants/MVPs
非エンジニアの社長にReactとは何かを説明する①

# 非エンジニアの社長にReactとは何かを説明する
最近、エンジニアのデイリーMTGを始めたのですが、ありがたいことに非エンジニアの社長もオブザーバーとして参加してくれています。
とはいえ、やはりエンジニアのデイリーMTGの内容となると技術的な内容が多くなるので非エンジニアの面々には分からない部分が多いはずです。
このままMTGを続けるのは申し訳ないですし、非エンジニアにも分かるように説明するという視点で記事を書いてみるのも面白いかなと思うので、つらつらと書いてみようかと思います。
まず、最近主に扱っているReactについて。

なお、説明がややこしくなるのを避けるため、厳密に正確な説明をすることは放棄している部分があります。
悪しからず。

## ブラウザとjavascript
いきなりReactの説明を始めることは出来ないので、その前提となるブラウザとjavascriptから説明を始めます。

### ブラウザ
ブラウザは、ChromeやInternetExploler,Edgeと言ったWebページを閲覧するのに使っているものです。

さて、このブラウザにはエンジニアは当たり前のように使うものの、一般の方はまず使わない機能が搭載されています。
何らかのページを開いている状態で「F12」ボタンを押して見てください。

おそらく、開発者コンソールとかDevToolとかそんな感じの名前のものが出てくるかと思います。
画面上部にタブがあるので、Elementあるいは要素(ブラウザによって表示は違います)を選んでください。

そうすると、以下のような感じに``<>``で囲まれた文字が羅列されていると思います。

![htmlサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393867/a3e9ff07-b821-c22c-28bb-591dc44d1a3f.png)

この一見、よく分からない文字列の羅列がいわゆるHTMLと呼ばれる形式で書かれたページのソースで、ブラウザ上に表示されているWebページの元です。
コンテンツとして載せる画像や動画は別として、Webページは基本的にこのHTML形式のデータをブラウザが読み取って表示しています。
(ちなみに、Webページ上の要素を右クリックして、「検証」を選択すると、その要素がソース上の何に相当するのか表示してくれます。興味があれば是非)
大雑把な言い方をすれば、Web系のエンジニアはこの文字列を作ったり操作したりするプログラムを書くのが仕事というわけです。

### JavaScript
先ほど、「WebページはHTML形式のデータをブラウザが読み取って表示しているもの」と説明しましたが、
実は、HTML形式のデータだけではWebページはほとんどあるいは全く動きがないものになります。
具体的には、[阿部寛のホームページ](http://abehiroshi.la.coocan.jp)のような感じです。
リンクを踏んでページを切り替える以外に画面を変化させる方法がありません。

ただ、このようなページは極めて例外的です。実際、普段皆さんがご覧になっているWebページは、もっと色々な動きがついているはずです。
例えば、検索欄に何か打ち込んだらサジェストが出たり、スクロールしたら徐々に要素が出てきたりとかですね。

これがどうやって実現されているかと言うと、ブラウザ上で「JavaScript」という言語が動き、Htmlの内容を書き換えることによって実現されています。
実際、先ほど紹介した開発者ツールのElementを見ながら画面上の動きを起こすと、
どこかしら要素に変化があることがわかるかと思います。(ものによっては一か所値が書き換わるだけで分かりにくかったりもしますが…)

WebページのUI・UXがどんどんリッチになっていっている現代、このJavaScriptの役割もますます大きくなってきており、いわゆる「フロントエンドエンジニア」と呼ばれる人々は主にこのJavaScriptを扱っています。

そして、今回説明しようとしているReactはこのjavascriptをうまく使うための便利な道具集(ライブラリ)の一つです。

Reactは名前しか出てきていませんが、長くなってきたのでこの辺りで。
[次回](https://qiita.com/xx2xyyy/items/feed9dfe6bb2e657d69c)に続きます。
スクラムカタカナ用語日本語化計画 草案

ステークホルダー: 持ち主、特に偉くはない...鋼の心臓
プロダクトオーナー: 品質の番人
スクラムマスター: 風鬼委員長 ((変な変換出るようなるのやめてほしい))
チーム: 仲間
プロダクトバックログ:　やる事置き場
スプリント:　決めた事をガッとやる
イテレーション:　決めてガッとやるのを繰り返す
スプリントレトロスペクティブ:　ガッとやった事を振り返る。
デイリースクラム:　毎日皆んなで報告する。



<details><summary>TODO</summary><div>

|カタカナ用語|優しくなる用語|ストレス高める用語|
|---|---|---|

</div></details>
【書評】Amazon Web Services ネットワーク入門

AWS 認定ソリューションアーキテクト - プロフェッショナルを取得する為に、
苦手分野をなんとかする為に買いました。

---
[Amazon Web Services ネットワーク入門 (impress top gear)](https://www.amazon.co.jp/dp/4844381679/)
![alt](https://images-na.ssl-images-amazon.com/images/I/51nLj5p4WEL._SX394_BO1,204,203,200_.jpg)
ネットワーク周りが苦手で、特にIPアドレスの設定や、サブネットに関する問題が難しく・・。
かなり前に、アソシエイトの資格に合格したのですが、その時は、他の分野でカバーしてなんとかなりましたが、
今回は、アソシエイトより難易度が上がるし、少しでも苦手分野を減らす目的で読みました。

## 感想
2016年に発売された本なので、書籍の画面イメージと、実際の画面に多少差異がありますが、それほど気にならず、スムーズに構築が進められました。
基本的なネットワーク知識を復習しつつ、AWSでどう構築していくが学べました。
今まで、BlackBelt等の資料を読む、問題を解くで覚えた断片的な知識はあり、消去法やなんとなくで、解いていた問題が多かったのですが、
実際に構築するなかで、はっきりとして正しい選択肢を選べることが多くなりました。
また、IPアドレスが出てくる問題に苦手意識があったのですが、それもなくなりました。
[VisualStudio] 「リンクとして追加」で、プロジェクト間で同じソースファイルを使う

# やりたいこと
VisualStudioで、1つのソリューション(sln)に複数のプロジェクト(csproj)が含まれているときに、まったく同じクラスを両方で使いたいとなったときに、dllに分けるまでしなくても簡易的に同じクラスを使える(共有できる)ようにしたい。

# 前提
VisualStudio2019
Consoleアプリケーション(.net Framework)
で実験実施。

# やり方
ファイルの「リンクとして追加」を使う。

- 共有される側のプロジェクトで、共有されるクラスを作成する。
- 共有する側のプロジェクトを右クリックする。
- [追加]を選択する。
- [既存の項目]をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/5c59cc61-5a99-8d14-d8a7-45160be0cda8.png)

- 共有されるクラスを記述したファイルを選択する。
- その状態で、[追加]ボタンの横の[▼]を押し、[リンクとして追加]を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/ede01776-1fb6-36bc-b35c-7f6d6426c402.png)

これで、共有する側のプロジェクトに、そのcsファイルが追加される。
(リンクとして追加したファイルには、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/325749d2-bcdc-272d-ef65-d0a1ab4a6dfc.png)のアイコンがつく。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/ddc4a054-ebe6-7d7b-1a97-7c03647218be.png)

# 注意
[リンクとして追加]で追加したファイルは、リンク元のファイルと同じファイルを見ているので、どちらかを変えるともう片方にも同じ変更が入ってしまうので注意。
(ファイルの実体(.csファイル)は、元のプロジェクトの方にだけ存在していて、リンク先のプロジェクトにはない。)
→.csprojファイルに、リンクした旨の設定が追加される。
[Django]特定の環境下でBasic認証をかけたいときは

## やりたいこと
公開前のWebアプリなどでBasic認証をかけたい場合があるかもしれません。
PHPなんかだと `.htaccess` `.htpasswd` でシュッとやれるのですが、Djangoだとうまくできなかったので備忘録を兼ねて。

## 導入
[wsgi-basic-auth](https://pypi.org/project/wsgi-basic-auth/) というライブラリがあったので入れました。

**インストール**

```
pip install wsgi-basic-auth
```

```diff:.env
+ WSGI_AUTH_CREDENTIALS=id:password
```

ここの `id` と `password` を好きに書き換えてください。

```py:[project]/wsgi.py
from wsgi_basic_auth import BasicAuth
application = BasicAuth(application)
```

## 結果

![スクリーンショット 2019-07-24 19.50.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165355/f842de90-8f2a-cd45-fab9-18a0025175c4.png)

こんな感じで簡単にBasic認証がかけられます。

## 特定の環境のみBasic認証をかけたい場合
[django-environ](https://github.com/joke2k/django-environ) を使用しました。

```diff:.env
+ APP_ENV=development
```

```py:[project]/wsgi.py
import environ
env = environ.Env()
env.read_env('.env')

if env('APP_ENV') == 'development' :
    from wsgi_basic_auth import BasicAuth
    application = BasicAuth(application)
```
gitのエラーerror:1407742Eの対処法について(備忘録)

#経緯
ずっと使っていなかった昔のlinuxマシンでgithubにpush使用としたらerror:1407742Eが起きた。

#環境
VineLinux6.1
git1.7
git version 2.2.1

#対処法
gitのバージョンが古かったので、アップデートをした。

まずは、既存のgitを削除した

```
sudo apt-get remove git
```

make時にエラーが起きないように以下のパッケージをインストールしておく

```
sudo apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
```

インストールしたいgitをダウンロードし、解凍したあとにディレクトリを変更

```
sudo wget https://www.kernel.org/pub/software/scm/git/git-2.22.0.tar.gz
tar zxvf git-2.22.0.tar.gz
cd git-2.22.0
```
ビルドとインストール

```
make prefix=/usr/local all
make prefix=/usr/local install
```


もし、makeコマンドで以下のエラーが出るようなら

```
/usr/bin/ld: BFD version ~
```

以下のコマンドでインストールしてから再度実行すればできた

```
sudo apt-get install binutils
```

#まとめ
突貫工事で対処してきたので、まちがっているかもしれない
PCから出たIPパケットがどうやってルーターまでたどり着くのか調べてみた

# PCから出たIPパケットがどのようにして有線LANを通ってルーターまで届くのか
※軽く調べてみたのをメモしてる感じの記事です。
　細かいところが間違っている可能性はあります。

ルーターまでの構成
PC - L2スイッチ - ルーター
ざっくり言うとPCのLANポートを出たIPパケットはL2スイッチを経由してルーターのLAN側ポートに入る。


有線LANのEthernetはIPアドレスではなくMACアドレスを使って通信をするので、
IPパケットをLANに送り出す時にPCはARPテーブルを参照してIPアドレスと
対応したMACアドレスを調べ、Ethernetフレームに宛先MACアドレスを設定して
EthernetフレームでIPパケットを包んで送り出す。

送り出されたEthernetフレームはL2スイッチへと入る。
フレームを受け取ったL2スイッチは内部に持っているMACアドレステーブルを参照して
フレームの宛先MACアドレスを持った機器が繋がっているポートへとフレームを流す。
※間にもう一つL2スイッチが挟まっている時はそのL2スイッチが繋がっている
　ポートへと送り出されそのL2スイッチでも同じように処理される。

そしてL2スイッチから流されたEthernetフレームはルーターのLAN側ポートへと入り
ルーターはフレーム内のIPパケットをルーティングテーブルなどに従ってWANへと送り出す。
Composerで特定パッケージのみを更新

ComposerでPHPのパッケージ管理を行っているとき、`composer update` コマンドを使用することで、パッケージの更新をまとめて行うことができます。

ですが、テストの都合などで特定パッケージのみバージョンアップしたい場合もあります。

以下の方法を使えば、特定のパッケージのみを更新することができます。

※間違った点などあればご教授いただければ幸いです。


# 特定パッケージのみ更新する

`composer update` コマンドの後にパッケージ名を指定すれば、`composer.json` に記載された特定のパッケージとその依存のみを最新バージョンに更新できます。

```bash
$ composer update aws/aws-sdk-php
```

# 特定ベンダーの全パッケージを一括で更新する

ワイルドカードを使用することで、`composer.json` に記載された特定のベンダーの全てのパッケージとその依存を最新バージョンに更新できます。

```bash
$ composer update aws/*
```

# 依存パッケージの更新がないか事前に確認する

ただ、いくらパッケージを指定したとしても、依存パッケージが同時に更新されてしまう可能性があります。

そうした場合、`--dry-run` オプションを付けて実行することで、実際に更新することなく何が更新されるかを事前にチェックすることができます。

念の為、パッケージを最新にする前に挙動を確認しておくとよいです。

```bash
$ composer update --dry-run aws/aws-sdk-php
```

# 参考

[逆引き！Composer コマンド・ライン一覧 - Qiita](https://qiita.com/KEINOS/items/86a16b06af6e936a1841)
基本ubuntuコマンド確認

長らくUnix系を触っていなかったので使用頻度の高そうなコマンドの再確認用
オプションは省略

- 自分のいる位置確認<br>

```
pwd
```
- 現在いる場所の中身確認<br>

```
ls
```

- 場所移動<br>

```
cd
```

- ディレクトリ作成<br>

```
mkdir
```

- 削除<br>

```
rm
```

- ファイル更新やファイル作成などに使う<br>

```
touch
```
- エディターを入れられない時の編集用※個人の意見です<br>

```
vi
```

- コピー<br>

```
cp
```

- 権限確認<br>

```
chmod
```
- 管理者権限使うやつ<br>

```
sudo
```


以上
【Bootstrap】スクロールしてもnavbarを固定して表示する方法と、その際の留意点及び解決法

### 本記事の内容
・ページ上部に固定されたナビゲーションをBootstrapで実装する方法。
・その際の留意点と解決法

### 方法
（現在、WEBアプリを作成しているので、そのコードをそのまま例として用いることにします。)
以下のように`class='fixed-top'`とすることで、ナビゲーションをページ上部に固定できます。
これにより、スクロールしてもナビゲーションは上に表示されたままになります。

```html:sample.html
     <div class='fixed-top'>
     <nav class="navbar navbar-expand-lg navbar-light bg-light">
         <a class="navbar-brand" href="#">Mieruka</a>
         <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
             <span class="navbar-toggler-icon"></span>
         </button>
         <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
             <div class="navbar-nav">
                 <a class="nav-item nav-link active" href="#">ユーザ<span class="sr-only">(current)</span></a>
                 <a class="nav-item nav-link" href="#">新規プロジェクト</a>
                 <a class="nav-item nav-link" href="#">モーメント</a>
                 <a class="nav-item nav-link" href="#">アプリ紹介</a>
             </div> 
         </div>
     </nav>
     </div>
```

### 留意点
`fixed-top`で固定することでその他の要素がnavbarに重なって表示されてしまいます。
（navbarがひとつ上のレイヤーに移動して、それ以外の要素はnavbarがいなくなった分、上に詰めるイメージ。）
そのため、その他の要素を下にズラしてあげる必要があります。

### 解決法
このような場合は、`bodyにpadding-top`を適用させて、要素を下にズラすことで解決します。

```css:sample.css
          body{ 
              padding-top: 60px; 
          }
```
php-master-changes 2019-07-23

今日はストリームの読み書きでエラーを通知するようにする修正、pdo_oci の不要コードの削除、PDO で、"?" をエスケープできるようにする修正、ドキュメントの更新、テスト中に残っていた E_STRICT を削除する修正があった！

# 2019-07-23
## nikic: Report errors from stream read and write operations
- https://github.com/php/php-src/commit/d59aac58b3e7da7ad01a194fe9840d89725ea229
- [7.4~]
- ストリームの読み書きでエラーを通知するよう修正
- php_stream_read() and php_stream_write() が ssize_t を返すようになり、負値は失敗扱いで、[fread()](https://www.php.net/manual/ja/function.fread.php) とか [fwrite()](https://www.php.net/manual/ja/function.fwrite.php) が false を返す
- EWOULDBLOCK と EAGAIN はノンブロッキングストリームではエラー扱いではなく、読み書きサイズ 0 の成功扱い
- EINTR はなんか扱い決まってなくてふわっとしてる
- ユーザになんかこの変更でまずい影響出たら挙動は調整しそう、一旦入れてるという感じ
- [#73535](https://bugs.php.net/bug.php?id=73535) の対応で、ストリーム API いじるなら今じゃねえの、みたいな感じのもよう
- [#4433](https://github.com/php/php-src/pull/4433) あたりから話の流れたどれるけど気合要りそう

## nikic: Also report errors from Zend stream reader operation
- https://github.com/php/php-src/commit/5664035ffef093a200d220330f3b17ee9b601fb2
- [7.4~]
- zend_stream の読み込みでも↑と同様にエラーを通知するよう修正

## nikic: Add upgrading entries
- https://github.com/php/php-src/commit/845d07b3431e1e5901f609120360bf907fc7c08f
- [7.4~]
- UPGRADING、UPGRADING.INTERNALS に↑のストリーム API の修正について追記

## petk: Remove HAVE_OCILOBISTEMPORARY and HAVE_OCICOLLASSIGN
- https://github.com/php/php-src/commit/5d827c89cf0aa14f51e57cbe4d4e1e90475899b6
- [7.4~]
- ext/pdo_oci で、使われていない HAVE_OCILOBISTEMPORARY と HAVE_OCICOLLASSIGN の削除
- ocijdbc8 のライブラリチェックも外してる
- ぶっちゃけもう Oracle8 のサポートしてないので、[ext/oci8 って ext/oci でいいよねみたいな話](https://github.com/php/php-src/pull/4454#discussion_r305776898)もあったりするもよう

## mbeccati: Fix FR [#71885](https://bugs.php.net/bug.php?id=71885) (Allow escaping question mark placeholders)
- https://github.com/php/php-src/commit/b19fdc18a974929394c734d8b710d7a9ca3c9d3a
- [7.4~]
- ext/pdo で、"?" をエスケープできるよう修正
- "??" のように重ねると "?" で SQL がサーバに送られる
- PostgreSQL 等で "?" を使う演算子があるみたい
- [PHP RFC: Escape PDO "?" parameter placeholder](https://wiki.php.net/rfc/pdo_escape_placeholders)

## petk: Update NEWS
- https://github.com/php/php-src/commit/8f384bea93dbc0de73fa66d58b70f63c03547606
- [7.2~]
- NEWS で、sapi/litespeed の更新を追記

## derickr: Update NEWS for PHP 7.4.0beta1
- https://github.com/php/php-src/commit/2b540b2f520f77b738961071b1fc49815f1de6ae
- [7.4~]
- NEWS で、PHP 7.4.0beta1 のリリース日を 7/25 に更新

## derickr: Update NEWS for 7.4.0beta2
- https://github.com/php/php-src/commit/a07e85f93fe446975f84948cfe905e2ec1c4db4a
- [7.4~]
- NEWS で、7.4 系の開発バージョンを PHP 7.4.0beta2 に引き上げ

## Girgias: Cleanup of remaining E_STRICT in tests
- https://github.com/php/php-src/commit/6d6d954d0d28f488f743e6c9d0cd9ab01e1c4e41
- [7.4~]
- テスト中に残っていた E_STRICT の削除
【正規表現】日本語を含むURLのみを抽出する

## 日本語を含むURLのみを抽出
データをDBに取り込む際の前処理などで、日本語を含むURLのみを抽出したい場合があります。

例）英数字と記号のみを許すバリデーションルールなので、日本語を含むURLのみをPunycode化したい

以下の正規表現を使えば、日本語を含むURLのみにマッチさせられます。

```
https?:\/\/[0-9a-zA-Z\-\.\/\?\,\#\:]*[\u3000-\u30FE\u4E00-\u9FAF\uF900-\uFA2F\uFF01-\uFFEE]+[0-9a-zA-Z\-\.\/\?\,\#\:]*
```

## 参考
* [日本語を含む URL にマッチする正規表現](https://gist.github.com/kawanet/61d9ab15f9bdaaeb20a7)
* [Unicode一覧表 \- Wikipedia](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7%E8%A1%A8)
jq で頑張るワンライナー

※雑に jq の備忘録にしちゃうことにした

### csv を JSON Lines に変換する 

こんな感じでできるけど雑だからダブルクォーテーションの考慮とかカラム内の改行とかガン無視してる

```bash
$ cat example.csv
c1,c2,c3,c4,c5
1,2,3,4,5
6,7,8,9,0
a,b,c,d,e
f,,g,h,

$ cat example.csv | tr -d '\r' | jq -Rsc 'split("\n") | [.[] | split(",") | select((.|length)!=0)] | (length - 1) as $len | transpose as $items | reduce range($len) as $idx ([]; . + [reduce $items[] as $item ({}; .[$item[0]] = $item[$idx+1])]) | .[]'
{"c1":"1","c2":"2","c3":"3","c4":"4","c5":"5"}
{"c1":"6","c2":"7","c3":"8","c4":"9","c5":"0"}
{"c1":"a","c2":"b","c3":"c","c4":"d","c5":"e"}

$ # 最低限，数字は integer にしておきたい場合
$ cat example.csv | tr -d '\r' | jq -Rsc 'split("\n") | [.[] | split(",") | select((.|length)!=0)] | (length - 1) as $len | transpose as $items | reduce range($len) as $idx ([]; . + [reduce $items[] as $item ({}; .[$item[0]] = ($item[$idx+1] as $v | try ($v | tonumber) catch $v))]) | .[]'
{"c1":1,"c2":2,"c3":3,"c4":4,"c5":5}
{"c1":6,"c2":7,"c3":8,"c4":9,"c5":0}
{"c1":"a","c2":"b","c3":"c","c4":"d","c5":"e"}

$ # "" なら null にもしてみる
cat example.csv | tr -d '\r' | jq -Rsc 'split("\n") | [.[] | split(",") | select((.|length)!=0)] | (length - 1) as $len | transpose as $items | reduce range($len) as $idx ([]; . + [reduce $items[] as $item ({}; .[$item[0]] = ($item[$idx+1] as $v | if $v == "" then null else try ($v | tonumber) catch $v end))]) | .[]'
{"c1":1,"c2":2,"c3":3,"c4":4,"c5":5}
{"c1":6,"c2":7,"c3":8,"c4":9,"c5":0}
{"c1":"a","c2":"b","c3":"c","c4":"d","c5":"e"}
{"c1":"f","c2":null,"c3":"h","c4":"i","c5":null}
```

- 先頭にカラム名を示す行がある前提
- `tr -d '\r'` は念のため
- `split("\n")` で行毎の配列にして更に `split(",")` でカンマ区切りのカラムを配列にしてる
- `select((.|length)!=0)` は文末の改行で空の行存在する場合に困るので一応削除してる
- `(length - 1) as $len` でデータ数を保持する
- `transpose as $items` で各配列の N 番目の要素でグループ化した配列を生成
- `reduce $items[] as $item ({}; .[$item[0]] = $item[$idx+1])` でグループ化された各カラムのデータの中から，0番目のデータをキー，$idx番目のデータを値としてJSON化
- これを保存しておいた $len (データ数) だけ繰り返すと出来上がり


### クエリ文字列との相互変換

```bash
$ cat example.json
{
  "a": "str",
  "b": 1,
  "c": null,
  "d": "http://localhost:8000",
  "e": true
}

$ cat example.json | jq -r 'to_entries | map((.key | @uri) + "=" + (.value | @uri)) | join("&")'
a=str&b=1&c=null&d=http%3A%2F%2Flocalhost%3A8000&e=true

$ echo 'a=str&b=1&c=null&d=http%3A%2F%2Flocalhost%3A8000&e=true' | jq -R 'split("&") | map(split("=") | {key: .[0], value: .[1]})| from_entries'
{
  "a": "str",
  "b": "1",
  "c": "null",
  "d": "http%3A%2F%2Flocalhost%3A8000",
  "e": "true"
}
```

- URLからJSONにするときは文字列になってしまう
- jq には何故か URL decode がないのでそれもできない (めんどいからしてない)
ImageMagickで全てのJPGをWebPに変換するシェルスクリプト

JPG to WebP。
ImageMagicで、作業ディレクトリ内にある全てのJPGをWebPに変換するシェルスクリプトです。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162655/6fee2d52-3367-0d34-e3c0-51d93b0fe43f.png">


パフォーマンス改善のために今後よく使いそうなのでメモ。

## ソースコード
```sh:jpg2webp.sh
#!/bin/sh

for file in *; do
	if [ ${file##*.} = "jpg" ]; then
		echo "Processing: ${file}"
		convert ${file} ${file//.jpg/.webp}
	fi
done
```

変換元のJPGも保持されるので、ご安心ください😌

## 実行例

### 実行コマンド
```
$ bash jpg2webp.sh

Processing: shell.jpg
```

### 実行結果
<img width="700" alt="スクリーンショット 2019-07-24 19.25.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162655/f3f0de9a-168f-0d90-19f7-f6ef65eb5df3.png">


## 前準備

- `ImageMagick`
- `cwebp`

を使えるようにする必要があります。

未インストールの場合は、下記の記事などを参考に各ツールを使えるようにしてください。

- [Converting Your Images To WebP With ImageMagick - Medium](https://medium.com/@andysolomon/converting-your-images-to-webp-with-imagemagick-a9c56cf6b579)
[初心者向け]稀有だと思うけど、外部ライブラリ使わずに表形式加工

タイトルの通りになりますが、お仕事の内容によってはこの様なレアなケースもあるかと思います。
使った構文等をメモがてらに残していこうと思います。
Pythonのバージョンは3.6です。
Python初心者のため、間違い等ありましたら、コメント頂けますと幸いです。

#目標
2つの表形式の.tsvファイルから必要なデータを取り出し1つの表形式データにしたい。

#importしたもの
```import.py
import gzip #圧縮ファイルを処理する場合必要
import csv #csvやtsvで書き込む場合必要
import sys #コマンド実行時　引数をとる場合必要
```

#ファイル読み込み
2種類の方法を検討しました

##open関数

```open.py
#読み込みモードでファイルを開く
file = open("data.tsv","rt")

###処理等###

#ファイルを閉じる
file.close()
```
・[詳細のモードの設定など](https://dot-blog.jp/news/python-open-function/)
この場合、テキストでの読み込みをしています。
モードを指定することで書き込みなどもできる様になります。
close()を忘れずに。

##with open
```withopen.py
with open("data.tsv", "rt") as file
```
大きな違いはclose()が必要なく、勝手にファイルをクローズしてくれます。
with構文は通信やデータベースへのアクセスにも使えて、これらも勝手にクローズや終了をしてくれます。
こちらもモードを指定することで書き込みもできます。
今回はこちらを採用いたしました。

#実行時の引数を取得
pythonの実行時に引数を入れることでそれに応じた処理をさせたい時に利用できます。

例えばこんな感じで実行

```bash
$ python sys.py 12 24 36
```

```sys.py
args = sys.argv #宣言　引数2個以上の場合、配列になる 
#args[0]にはスクリプトファイル名が入るため、args[1]から取得していく
num1 = args[1] #num1 = 12
num2 = args[2] #num2 = 24
num3 = args[3] #num3 = 36
```

#必要な列のデータを取得
表形式なので、表を縦に分割して、必要な列を取り出します。
file1:

| ア行 | カ行 | サ行 |
|:--:|:--:|:--:|
| あ | か | さ |
| い | き | し |
| う | く | す |

file2:

| サ行 | タ行 | ナ行 |
|:--:|:--:|:--:|
| さ | た | な |
| す | つ | ぬ |
| せ | て | ね |

これはテーブル型なので、少しややこしいですが、データはtsvなので、表形式でタブ区切りのものです。
そのタブを区切り文字として指定することで列を取得できます。
列はカラムを含めると4つデータを取得する必要がありますので、for文で繰り返し処理をします。
今回はfile1からア行とサ行を、file2からサ行とナ行を取得します。

```split.py
data1 = []
data2 = []
data3 = []
data4 = []

for line1 in file1:
    list1 = file1.split('\t') #タブを区切り文字にして分割
    data1.append(list1[1]) #[あ、い、う]
    data2.append(list1[3]) #[さ、し、す]

for line2 in file2:
    list2 = file2.split('\t')
    data3.append(list2[1]) #[さ、す、せ]
    data4.append(list2[3]) #[な、ぬ、ね]
```
for文の条件にfileを指定するとファイルの中身が終わるまで処理をしてくれます。
dataは配列で入るため、事前に宣言をしています。

#表形式結合
SQLでテーブルを結合させる際は、共通のデータを照らし合わせます。
その様な動きを条件文を使ってやってみます。
file1から取得したデータとfile2から取得したデータをそれぞれfor文で回し、データの内容が一致するものを格納する流れにします。
今回はサ行のデータを条件にします。

```join.py
table = []

for i in range(len(data1)): #4 range(len('変数名'))でデータの数を返します。
    for j in range(len(data3)):
        if data2[i] == data3[j]:
            table.append([data1[i], data2[i], data4[j])
```

| ア行 | サ行 | ナ行 |
|:--:|:--:|:--:|
| あ | さ | な |
| う | す | ぬ |

この様に表形式のデータを結合することができました。

#ファイル書き込み
このデータを新たなファイルに書き込んでいきます。

```write.py
with open.gzip("data.tsv.gz", "rt") as file:
    write = csv.writer(file, lineterminator = '\n', delimiter = '\t')
    for output_data in table:
        writer.writerow(output_data)
```
最初にcsvライブラリをimportしましたが、ここで登場します。
Pythonの標準ライブラリにcsvモジュールはcsvやtsvで読み込みや書き込みを行うことが可能です。
・[csvライブラリ](https://note.nkmk.me/python-csv-reader-writer/)
区切り文字(delimiter)をタブにすることでtsvファイルでの保存が可能になります。
lineterninatorは改行文字です。

また、with open.gzipとすることでgzファイルに圧縮することも可能です。

#まとめ
標準ライブラリの使用のみで表形式データを加工することができました。
結合以外にも変換や、datatime処理をしましたが、それはまた書く気になったら別で書きます。

僕自身、初めてのPythonだったのですが、配列関係、インデント関係のエラーで結構詰まりました。
その辺りは他の丁寧に書かれている記事を参考にしてください（逃げます）

最後に.....
表形式を加工する場合、よっぽどの理由がない限りは、外部ライブラリのpandasやNumpyの使用をオススメします。
【k8s】Kubernetesやってみた【minikube】

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275273/2b8a4d59-9d69-6517-f85b-1185d68f1d19.png)

kubernetesを触ってみたのでまとめてみました

##目次

1. [環境](#環境)
2. [kubernetesについて](#kubernetesについて)
2. [minikube導入](#minikube導入)
3. [minikube起動](#minikube起動)
4. [ダッシュボードの起動](#ダッシュボードの起動)
5. [サービスを作成してみる](#サービスを作成してみる)
6. [後片付け](#後片付け)
7. [「Version string empty」エラーについて](#version-string-emptyエラーについて)
8. [まとめ](#まとめ)

##環境

- MacBook Pro (Retina, 15-inch, Mid 2015)

##kubernetesについて

kubernetesというのは「コンテナを運用しやすくするオープンソースなプラットフォーム」です。
最近よく耳にするkubernetesですが、色々な環境があるんですねー。

よく耳にするものですと「minikube」でしょうか。
こちらは手元のローカル環境で動作させやすいkubernetesで、冗長性の担保はされてないですが動作が軽快だそうです。
minikubeのように手軽に試せる環境として「micro-k8s」、Iot(ラズパイなど)用のさらに軽量な「k3s」があります。

クラウド上のKubernetesとして、「GKS(Googleさん)」、「ACS(Microsoftさん)」、「EKS(Amazonさん)」が提供されており、共通の特徴としてWebGUIでコンテナを管理できます。

Macユーザーだと「Docker for Mac」を利用している方が多いのではないでしょうか。
「Docker for Mac」では設定を行うことでkubernetes環境が利用できます。

<img width="504" alt="001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275273/16a3d614-1705-921b-f74b-653b1ed1240a.png">
<img width="497" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275273/977b7498-3892-9fd6-efb6-b815f9a5b982.png">

##minikube導入

minikubeを利用してkubeってみましょう。過去に導入したものなので当時の導入手順は覚えてません。
がしかし、`brew list`コマンドで結果が返ってくるので恐らくbrewコマンドで導入したのだと思います。
うろ覚え申し訳ないです。

```bash
$ brew list  | grep kube
kubernetes-cli

$ brew cask list  | grep kube
minikube
```

下記リンクの手順で導入できるかと思います。

- [minikubeをMacにインストールする](https://qiita.com/Manjiii/items/88699c52f5ade2bf4b6f)


##minikube起動

VMにvirtualBoxを指定してminikube起動

```bash
$ minikube start --vm-driver=virtualbox

$ minikube status
```

##ダッシュボードの起動

```bash
# 下記コマンドでダッシュボード起動(ブラウザが開きます)
# minikubeのダッシュボードはターミナルで「Ctrl+c」で停止できます
$ minikube dashboard
```

```bash
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
```

「hello-minikube」を起動するコマンドを実行し、ブラウザにてダッシュボードのリロードを行うと「hello-minikube」のPodなどが追加されているのがわかりますね。

![003.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275273/eb911957-a592-a5a6-0e71-df9e9a415310.gif)

##サービスを作成してみる

```bash
# 「hello-minikube」を外部アドレスから参照できるようにする
$ kubectl expose deployment hello-minikube --type=NodePort
```

```bash
## 各種情報を確認してみる(ダッシュボードと同じ情報が出力されます)
$ kubectl get services
$ kubectl get pod
$ kubectl get deployments
```

##後片付け

ダッシュボードで作業しても良いですが、せっかくなのでコマンドでお掃除してみましょう。

```bash
# サービスの削除
$ kubectl delete services hello-minikube

# デプロイの削除
$ kubectl delete deployment hello-minikube

# minikubeの停止
$ minikube stop
```

##「Version string empty」エラーについて

`minikube start`した際にエラーが出ますが、[issue](https://github.com/kubernetes/minikube/issues/3447#issuecomment-447052304
)を見た感じだと、バグのようです。
~~とりあえずは正常に動作するようなのでそのまま進めます。~~ ←エラー出るの気持ち悪いので詳しい方いましたらご指摘ください

```bash
$ minikube start
~~中略~~
E0710 15:47:42.634326   85156 start.go:210] Error parsing version semver:  Version string empty
~~中略~~
Everything looks great. Please enjoy minikube!
```

##まとめ

今回は触りの部分だけ実践しましたが、やはり学習コストが高い印象。。。Dockerは割と取っ付きやすかったが。。。
慣れて管理工数が減れば両手を挙げて喜べますが、本番運用への道のりは長くなりそうですw

次回の記事ではymlファイルなどを定義して色々やってみようと思います。
[swift] DateFormatterのインスタンス生成は遅い


開発中のアプリのパフォーマンスの改善のために、Instrumentsで→↓→↓→↓→↓しているときに、`Date`のExtensionの処理がちょくちょく出てきた。

調べてた結果↓

```
Cache Formatters for Efficiency
Creating a date formatter is not a cheap operation. If you are likely to use a formatter frequently, it is typically more efficient to cache a single instance than to create and dispose of multiple instances. One approach is to use a static variable.
```

by [Data Formatting Guide - developer.apple.com](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW12)

`DateFormatter` のインスタンス生成は、軽い処理ではないため、何度も使われる箇所では単一の`DateFormatter`のインスタンスをキャッシュして使いまわそうとのこと。。。


## パフォーマンス計測
### パフォーマンスコード

```swift
// DateFormatter ではなく ISO8601DateFormatter を使用 🙇
extension Date {

    private struct Formatter {
        static let iso8601Formatter: ISO8601DateFormatter = ISO8601DateFormatter()
    }
    
    var ISO8601String: String {
        let formatter = ISO8601DateFormatter()
        return formatter.string(from: self)
    }
    
    var ISO8601StringWithCache: String {
        return Formatter.iso8601Formatter.string(from: self)
    }
}


let count = 10000
let date = ISO8601DateFormatter().date(from: "1990-01-01T00:00:00+0900")!

var start = Date()
(1...count).forEach { _ in
    _ = date.ISO8601String
}
print("毎回インスタンスを生成: \(Date().timeIntervalSince(start))")


start = Date()
(1...count).forEach { _ in
    _ = date.ISO8601StringWithCache
}

print("インスタンスを生成キャッシュ: \(Date().timeIntervalSince(start))")
```

### 結果
```
毎回インスタンスを生成: 3.0555260181427
インスタンスを生成キャッシュ: 0.5390740633010864
```

## まとめ
- 定期的にパフォーマンス計測をして、アプリのパフォーマンス改善をしてみましょう
- `Date`のExtensionを確認してみよう
- むやみなFormatterのキャッシュは注意

## 参考
- https://blog.kishikawakatsumi.com/entry/20140214/1392372659
- https://stackoverflow.com/questions/38574569/performance-issues-while-parsing-dates
- https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW12
- https://tech-tokyobay.manju.tokyo/archives/87
ECS で作成された Route53 の ホストゾーンを削除する

## 概要
重い腰を上げ、ECS の検証を始めました。コンテナを思い出すのに時間がかかった...
その中で「サービスの検出」で作成されたローカルゾーンを削除するお話し。

## やったこと
- ECS コンソール上でクラスター上のサービスを削除
- Route53 のコンソール上から、ローカルゾーンを削除しようとするとエラーが...
- AWS CLI で ECS のサービス削除をしないとダメとのこと

## 詳細説明
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/delete-service.html) のとおり、以下を実行する。

```bash
# サービスの一覧を取得する
aws servicediscovery list-services --region <region_name>

# 対象のサービスを削除する
aws servicediscovery delete-service --id <service_id> --region <region_name>

# 名前空間の一覧を表示する
aws servicediscovery list-namespaces --region <region_name>

# 対象の名前空間の ID を指定して削除する
aws servicediscovery delete-namespace --id <service_discovery_namespace_id> --region <region_name>
```

これで、Route53 のホストゾーンから消えていることを確認。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/
MoveIt!の使い方

#はじめに
　この記事は，ここ数年でかなり使われるようになってきた，ロボットの動作計画ライブラリMoveIt!について紹介していきます．基本的には，マニピュレータを使ったものについて解説して行く予定で，今からはMoveitの公式チュートリアルを和訳しつつ，今の環境に合わせられるように追加で解説をしていきます．ここでは，ROSの基本構造は理解していること，ROSの簡単なチュートリアルは終了していることを前提とします．まだインストールしてない方は，http://wiki.ros.org/ja から始めてみましょう．

#MoveIt!を始めよう！
　ここでは，OSをUbuntu 16.04 LTS，ROSのバージョンはKineticとなっています．バージョンが違うとコードも若干変わってくるのでKineticを前提として話を進めていきます．Ubuntu18.04のROS Melodic は環境が整えば書きたいと思います．なお参考文献はROS Melodicを前提に解説してあります．

###既存のROSパッケージを更新する
```
rosdep update
sudo apt-get update
```
###MoveIt!のインストール
```
sudo apt install ros-kinetic-moveit
```
###ワークスペースを作る
```
mkdir -p ~/ws_moveit/src
```

###GitHubからパッケージをダウンロード
　GitHubにチュートリアル用のパッケージをダウンロードします．オプション-bの後にバージョンを指定します．

```
cd ~/ws_moveit/src
git clone https://github.com/ros-planning/moveit_tutorials.git -b kinetic-devel
git clone https://github.com/ros-planning/panda_moveit_config.git -b kinetic-devel
```

###ワークスペースのビルド
　依存関係にあるパッケージをまとめてインストールします．オプション--rosdistroの後にバージョンを指定します．

```
cd ~/ws_moveit/src
rosdep install -y --from-paths . --ignore-src --rosdistro kinetic
```
　パッケージをビルドします．

```
cd ~/ws_moveit/
catkin_make
```

　環境設定ファイルを適用します．

```
source ~/ws_moveit/devel/setup.bash
```
　さあ，これでMoveIt!が使えるようになります．ビルドに失敗している場合は，足りないパッケージをインストールするなどのコードを実行する必要があります．

#おわりに
今回はMoveIt!を使うためのパッケージのインストールを解説しました.MoveIt!を始めるためには，これを忘れないようにやっておきましょう．基本的にはインストールするバージョンを間違えなければ，エラーは出ないと思うので，注意してインストールしましょう．
#参考文献
https://moveit.ros.org/
https://ros-planning.github.io/moveit_tutorials/doc/getting_started/getting_started.html
C++からC#のDLLを呼び出す際の引数

# 経緯
C#で作成したDLLをC++で呼び出そうとした場合、引数の受け渡しの部分で少しはまったので、まとめておきます。

# DLLと呼び出し側の構成について
引数の型によって呼び出す構成が変わります。

| 引数の型          |      データ        |      渡し方        |
|:-----------------:|:------------------:|:------------------|
| プリミティブ型    | 数値 <br> (固定の)文字列 <br> 論理値 <br> null <br> undefined <br> IntPtr| そのまま受け渡す事が可能 |
| オブジェクト型    | (可変の)文字列など | IntPtrでポインタとして渡し、<br>受け取り後に変換 |

上述した通り、可変の文字列などは、普通の関数のように引数を受け渡す事ができない（もしかしたらできるかも･･･）ため、一旦ポインタで渡し、受け取り側で変換することが必要です。

## プリミティブ型の引数の受け渡し方
### DLLでの引数の受け取り方
ポインタ型の引数を受け取り、```Marshal.PtrToStringAuto```で```string型```に変換します。

```c#:DLL側.cs
        [DllExport]
        public static bool hoGE(int iTmp)
        {
            ・・・//普通にiTmpを使える。
        }
```
### 呼び出し側の引数の渡し方
今回は以下のようにヘッダーを作成しました。
クラス内に関数ポインタ型の変数を宣言し、コンストラクタで変数に関数のポインタを格納します。

```c++:呼び出し側.h
auto dll = ::LoadLibrary("EM.dll");
typedef bool (*HOGE)(int);
class EM
{
public:
	EM();
	~EM();
	HOGE			hoge;
};
EM::EM()
{
	hoge = reinterpret_cast<HOGE>(::GetProcAddress(dll, "hoGE"));
}
EM::~EM()
{
	if (dll)
		::FreeLibrary(dll);
}
```

hogeの引数の型が```int```なので、プリミティブ型であり、直接受け渡すことが可能です。

```c++:呼び出し側.cpp
EM EMD;
void Check()
{
      int Tmp = 25;
      EMD.hoge(Tmp);
        ・・・
        }
```

### プリミティブ型での直接受け渡し時に注意すること
**C#とC++の型の違い**に注意してください。
今回、自分がはまったのが、[```long型```※](#コメントでご指摘頂いた点)の受け渡しでした。
型名は同じなのに、C#とC++でバイト数が異なるため、意図していない値になっていました。
（整数型・文字型のサイズは自身の処理系に依存します。）

| バイト数 | C++	|C#|
|:-----------------:|:------------------|:------------------|
| 1 |**char**|sbyte|
| 2 |wchar_t|**char**|
| 2 |short|short|
| 4 |int|int|
| 4 |**long**|---|
| 8 |__int64（Microsoft固有）|**long**|

##### ※コメントでご指摘頂いた点
C++に```long```型は存在しません。整数型は```int```であり、```short```/```long```/```long long```は整数型のサイズを指定する修飾子です（```unsigned```/```signed```は符号の有無を指定する修飾子）。修飾子が使用されている場合にのみ```int```を省略することができます。


## オブジェクト型の引数の受け渡し方
### DLLでの引数の受け取り方
ポインタ型の引数を受け取り、```Marshal.PtrToStringAuto```で```string型```に変換します。

```c#:DLL側.cs
        [DllExport]
        public static bool hoGE(IntPtr pTmp)
        {
            var sTmp = Marshal.PtrToStringAuto(pTmp);
        ・・・
        }
```

### 呼び出し側の引数の渡し方
今回は以下のようにヘッダーを作成しました。
クラス内に関数ポインタ型の変数を宣言し、コンストラクタで変数に関数のポインタを格納します。

```c++:呼び出し側.h
auto dll = ::LoadLibrary("EM.dll");
typedef bool (*HOGE)(const wchar_t*);
class EM
{
public:
	EM();
	~EM();
	HOGE			hoge;
};
EM::EM()
{
	hoge = reinterpret_cast<HOGE>(::GetProcAddress(dll, "hoGE"));
}
EM::~EM()
{
	if (dll)
		::FreeLibrary(dll);
}
```

hogeの引数の型が```const wchar_t*```なので、```CString```型を```CStringW```に変換し、```GetString()```を行うことでポインタを渡しています。

```c++:呼び出し側.cpp
EM EMD;
void Check(CString strFunc)
{
      CStringW Tmp = strFunc;
      EMD.hoge(Tmp.GetString());
        ・・・
        }
```

# 参考サイト
参考にさせていただいたサイトです。

[C#とC++の型について](https://so-zou.jp/software/tech/programming/language-comparison/grammar/type/)
[プリミティブ型とオブジェクト型](https://qiita.com/makotoo2/items/9566cebf205ef8b42505)