OmniAICreator/Qiita-1.07M huggingface dataset:
UIColorからカラーコードとアルファ値を取り出すextension

主にデバッグ用

## Version2
@lovee[さんに紹介してもらった記事](https://qiita.com/KikurageChan/items/e1c00c53364e6e3e423a)では
　`cgColor.components`を使っていますが、[これだと取れないケースもある](https://qiita.com/417_72ki/items/a793e43bd54dcd15323d)ので大人しく`getRed(green:blue:alpha:)`を使うことにしました。

```swift
extension UIColor {
    var colorCodeAndAlpha: (colorCode: String, alpha: Int) {
        var r: CGFloat = 1
        var g: CGFloat = 0.5
        var b: CGFloat = 0.5
        var a: CGFloat = 0.5
        getRed(&r, green: &g, blue: &b, alpha: &a)
        return (String(format: "#%02X%02X%02X", colorFloat2Int(r), colorFloat2Int(g), colorFloat2Int(b)), alphaFloat2Int(a))
    }

    private func colorFloat2Int(_ value: CGFloat) -> Int {
        var value = value
        if value < 0 {
            value = 0
        }
        if value > 1 {
            value = 1
        }
        return Int(value * 255)
    }

    private func alphaFloat2Int(_ value: CGFloat) -> Int {
        var value = value
        if value < 0 {
            value = 0
        }
        if value > 1 {
            value = 1
        }
        return Int(value * 100)
    }
```

## Version1
`ciColor`は生成コストがかかるそうです。

```swift
extension UIColor {
    var colorCodeAndAlpha: (String, Int) {
        let ciColor = CIColor(color: self)
        let red = Int(ciColor.red * 255)
        let green = Int(ciColor.green * 255)
        let blue = Int(ciColor.blue * 255)
        let alpha = Int(ciColor.alpha * 100)
        return (String(format: "#%02X%02X%02X", red, green, blue), alpha)
    }
}
```

## ちなみに
`ciColor`を取り出すのに`self.ciColor`だと

```
-CIColor not defined for the UIColor UIDeviceRGBColorSpace ~ need to first convert colorspace.
```

~~っていうエラーが出てそのまま死亡する謎:thinking:~~
CoreImageから生成されたUIColorでないと`self.ciColor`は取り出せないらしい(@loveeさんありがとうございます)。
そんなんプロパティに持たせないかせめて`nil`で返してくれって思うけどネ(
[WordPress]各投稿タイプ最新1件を取得する

[[WordPress]各カテゴリー最新1件の投稿を取得する](https://qiita.com/ki6ool/items/ed36f39f8ec02a602cf4)
って記事を書いているときに
そういえば昔投稿タイプで似たようなことやったな〜
って思い出してまだQiitaに残してなかったので残す。

[gist](https://gist.github.com/ki6ool/c1940b60432a3df3b27f)には残していたけど
最新の投稿のつけあわせをpost_dateでやってたんでIDでするようにした。
通常運営ならpost_dateで問題ないと思うけども
処理で一度に大量の投稿つくったりコピーしたりするとあれなんで。

ちなみに元々参考にしていた記事は
[Show latest Posts from each Post Type](http://betterwp.net/latest-posts-from-each-post-type/)


```php
$query = <<<SQL
SELECT tmp.ID, tmp.post_type, tmp.post_date FROM
	(
		SELECT ID, post_type, max(post_date) AS pd FROM wp_posts
			WHERE post_status = %s
				AND post_type IN (%s, %s)
			GROUP BY post_type
	) AS post
INNER JOIN wp_posts AS tmp
   	ON tmp.post_type = post.post_type
	AND tmp.ID = post.ID
ORDER BY post.pd DESC
SQL;

$ret = $wpdb->get_results($wpdb->prepare($query, ['publish', 'post', 'any']), ARRAY_A);

```

これで投稿IDと投稿タイプと公開日が取れるので
あとはよろしくやってほしい。
【PHP】cakePHPリモート API 通信（HTTP


CakePHP には、リクエストの実行に基本HTTP クライアントを利用して、ウェブサービスや、リモート API と通信するという方法があります。

HTTPクライアントで基本の通信方法を紹介します。

# post/get/delete

```php:httpPost.php
// リクエストURL
$url = "http://localhost/app/DummyService/httpTest.php";

// HTTPヘッダ設定
$option = array (
	"headers" => [
		'AuthID'   => '123456789',
		'AuthPass' => '1Qaz2wSxc'
	]
);

// HTTPリクエストデータ
$requestData = [
	'NUM'       => '8888',
	'NICKNAME'  => 'Chelsea',
	'FAVOURITE' => 'PHP',
	'LANGUAGE'  -> mb_convert_encoding("日本語", "SJIS", "UTF-8");
];

// POST通知(deleteにも同様)
try {
	$client = new Client ();
	$response = $client->post ( $url, $requestData, $option );
	$client = NULL;
	$httpHeader = $response->headers();
	$httpStatus = $response->statusCode ();
	$httpBody = $response->body ();
	$httpBody = json_decode ( $httpBody, 'TRUE' );
} catch ( \Exception $e ) {
	var_dump( $e->getMessage () );
	return FALSE;
}

// http statusチェック（200番以外）
if (! $response->isOk ()) {
	return FALSE;
}

```

`---I Love PHP (｡･ω･｡)ﾉ?`
CSS/Javascriptの不要な部分をさくっと洗い出す

自分用メモも兼ねて。

見ているページ内で使われているCSSプロパティやJSの処理などを簡単に判別するため、Chrome 59からDevToolにCoverage機能が追加されているので使ってみます。
（2018/05/24現在はバージョン: 66.0.3359.181）


実際動かすとページのロード時にトレースして使われたコードを確認できます。
DevToolを開き[**Console**]タブの左にあるメニューから[**Caverage**]を選択してタブ追加。

左側の丸いレコードボタンを押すとトレース開始。（ボタンが赤くなる）
![coverage1.png](https://qiita-image-store.s3.amazonaws.com/0/30278/3d05fcc2-08ee-259f-7341-c7143b761337.png)

**緑が使用、赤が未使用。**
![coverage4.png](https://qiita-image-store.s3.amazonaws.com/0/30278/92e14a2a-5b8e-521d-ae32-a177398c32c0.png)

CSSだけでなくJSもどの行が実行されているか、実行されていないかも確認できます。
![coverage2.png](https://qiita-image-store.s3.amazonaws.com/0/30278/4eac4903-3af9-8a07-79f6-445fa71a34ed.png)

![coverage3.png](https://qiita-image-store.s3.amazonaws.com/0/30278/4ee702d5-ab5c-28e9-6788-44edc5166869.png)

こんな感じ。

 

読み込んだページではこのようにして使用されていないプロパティや処理がわかります。

 

**ですが、**

 

昨今はWebpack等でCSS/JSファイルそれぞれをまとめて1つにしたりとかよく見かけますので、やたら簡単に削除してしまうと、同じCSS/JSファイルを使用している他のページでも影響あるかもしれません。

使用上の注意をよく読み用法・用量を守って正しくお使いください。


おわり
背景差分で物体抽出(画像比較)

少し前の状態の背景画像と、新たに何かが入ってきた状態の２つの画像の差を取ることで物体検出する手法を背景差分法といいます。
よくある利用事例として、固定カメラを使って来店者のカウント、自動車などの交通流量カウントなどに応用されます。

しかし、厳密には、物体の画像を取得した場合、影が存在するので単純な２つの画像の引き算ではうまく物体のみを検知できないケースがあります。そのため、様々なアルゴリズムが提案され、OpenCVでは以下の３つのアルゴリズムが用意されているので試しに実装してみます。

- BackgroundSubtractorMOG
- BackgroundSubtractorMOG2
- BackgroundSubtractorGMG


## 実装サンプルコード(BackgroundSubtractorMOG)

チュートリアルのサンプルコードは動画を使っていますが静止画でも動きますので以下のようなコードで実装してみました。

~~~py
# -*- coding: UTF-8 -*-
import cv2

if __name__ == '__main__':

    # 画像の読み込み
    img_src1 = cv2.imread("background_image.jpg", 1)
    img_src2 = cv2.imread("frontground_image.jpg", 1)

    fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()

    fgmask = fgbg.apply(img_src1)
    fgmask = fgbg.apply(img_src2)

    # 表示
    cv2.imshow('frame',fgmask)

    # 検出画像
    bg_diff_path  = './diff.jpg'
    cv2.imwrite(bg_diff_path,fgmask)

    cv2.waitKey(0)
    cv2.destroyAllWindows()
~~~


## チュートリアルの実装では実行時にエラーが出る

OpenCVのチュートリアルでは

~~~
    fgbg = cv2.createBackgroundSubtractorMOG()
~~~

となっていますが、背景差分のアルゴルズムが contrib に移動されたので

~~~
    fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
~~~

と実装する必要があります。


## contrib のインストール

cv2.bgsegm.createBackgroundSubtractorMOG()　としていてもエラーが出る場合は、contrib がインストールされていませんのでOpenCVのバージョンなど環境にあわせて追加してください。

~~~
>pip install opencv-contrib-python
~~~

## 入力画像
background_image.jpg
![background_image.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/a5661bb8-ec48-1141-fa5d-45e06568d70f.jpeg)

2017年必須のオフィス玩具と言われていたハンドスピナーにマウスを追加してみます。

frontground_image.jpg
![frontground_image.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/cbcf1b31-d286-ff2b-fedd-aaf4a1b0c3da.jpeg)


## 実行結果
diff.jpg
![diff.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/7c635817-52de-7b44-32aa-50ef3d303f8d.jpeg)

マウスだけが抽出されました。
光の加減でハンドスピナーの位置に白いドットが微妙にあるけど…:sweat_smile:

## 参考資料
https://docs.opencv.org/3.4.0/db/d5c/tutorial_py_bg_subtraction.html
http://answers.opencv.org/question/94448/module-cv2-has-no-attribute-createbackgroundsubtractormog/
Detecting Device Names on a Linux System

Detecting Device Names
======================

_Environment: CentOS 7 (CUI) installed on a VirtualBox_

# Problem
I could not find the device name of a DVD, which I put on the virtual tray.

# Solution
```
$ lsblk
```
`lsblk` showed me the device names and their mount points of _the DVD rom (sr0)_, as well as all the hard disk partitions.  
The absolute device name of the DVD was `/dev/sr0.`

# Struggles
`# fdisk -l` and `# df` did not show the device name of the DVD rom.

## fdisk
`# fdisk -l` did not work because the DVD was not listed on `/proc/partitions`.

> -l
List the partition tables for the specified devices and then exit. If no devices are given, those mentioned in /proc/partitions (if that exists) are used.(https://linux.die.net/man/8/fdisk)



## df
`# df` did not work because I had not mounted the DVD yet.

> df displays the amount of disk space available on the file system containing each file name argument. If no file name is given, the space available on all currently mounted file systems is shown.(https://linux.die.net/man/1/df)
Hanamiでhas_many先のモデルごとcreateする

個人的なメモ。マサカリ歓迎！
ツッコミはコメントください！

## Hanamiを使っていてツラいと思ったこと
https://hanamirb.org/

```ruby
mansion = ::MansionRepository.new.create({ name: 'mansion1' })
room = ::RoomRepository.new.create({ mansion_id: mansion.id, name: 'room1' })
```

EntityとRepositoryが1対1なので、大きなデータの集約を書き込みたいときにRepository何回も呼び出すことになる

## できれば

作成するときは

```ruby
class HogeRepository
  has_many fugas
  def hoge_with_fuga(data)
    # 
  end
end

HogeRepository.new.hoge_with_fuga({
  hoge_attribute: 'hoge',
  fugas: [ {
    fuga_attribute: 'fuga'
  } ]
})
```

こんな感じで基底となるEntityのRepositoryから一発で終わらせたい

(更新時は変更範囲に応じたRepositoryでもよいのですが作成時の場合)

## `class Hanami::Repository < ROM::Repository::Root`

なので、ROMではどうやるのか見てみた

[rom-rb.org/3.0/learn/repositories/writing-aggregates](http://rom-rb.org/3.0/learn/repositories/writing-aggregates/)

```ruby
class UserRepo < ROM::Repository[:users]
  relations :tasks

  def create_with_tasks(user)
    command(:create, aggregate(:tasks)).call(user)
  end
end

user_repo = UserRepo.new(rom)

user_repo.create_with_tasks(
  name: 'Jane',
  email: 'jane@doe.org',
  tasks: [{ title: 'Task 1' }, { title: 'Task 2' }]
)
# => #<ROM::Struct[User] id=1 name="Jane" email="jane@doe.org" tasks=[#<ROM::Struct[Task] id=1 user_id=1 title="Task 1">, #<ROM::Struct[Task] id=2 user_id=1 title="Task 2">]>
```

ほう。

> hanami-mdelが `rom (~> 3.3, >= 3.3.3)` という事をしらずに、rom@4.0.xのドキュメントを読んでいて、しばらく詰まった :sob: 


## 結局

できるだけHanamiのAPIを使いたかったので、こうした

```ruby
class MansionRepository < Hanami::Repository
  associations do
    has_many :rooms
  end

  def create_with_rooms(data)
    command(:create, aggregate(:rooms)).call(data)
  end
end

MansionRepository.new.create_with_rooms( {
  name: 'mansion1',
  created_at: Time.now,
  updated_at: Time.now,
  rooms: [{
    name: 'room1',
    created_at: Time.now,
    updated_at: Time.now}]})
```

## 懸念点、今後の対応

1. transactionの考慮まだできてない
    2. `Hanami::Repository::ClassMethods#transaction` ってなくなっちゃったのかな
2. `created_at` と `updated_at`、自動的に入れてくれへんのかい
    3. hanami側にISSUEあるのかな

そんな感じです
Python 開発者は -W default オプションを使おう

Python はデフォルトで多くの警告を表示しません。これはPython開発者ではないエンドユーザーが警告を見た時に混乱するのを防ぐためです。

デフォルトで ignore される Warning は次のとおりです。 (ref: https://docs.python.org/3/library/warnings.html#default-warning-filters)

* DeprecationWarning
* PendingDeprecationWarning
* ImportWarning
* BytesWarning
* ResourceWarning

これらの warning を Python 開発者が表示しないと、せっかく使っているライブラリが長期間 Deprecation 期間を設けていてもその Warning に気づかないとかいう事が起きます。

また、 warning システムは同じ場所から発生した同じ warning を複数回表示しないとかいったフィルタリングができるようになっている関係で、通常のログなどにくらべて遅かったり、メモリを消費したりします。

例えば botocore が head_object でメモリリークするという報告を調べていたら、 socket を close していないという ResourceWarning が原因でした。

* [Issue 27535: Ignored ResourceWarning warnings leak memory in warnings registries - Python tracker](https://bugs.python.org/issue27535)
* [Issue 33565: strange tracemalloc results - Python tracker](https://bugs.python.org/issue33565)
* [botocore leak when using get + head object · Issue #1464 · boto/botocore](https://github.com/boto/botocore/issues/1464)

こういった問題は開発者が普段から Python の `-W default` (短縮形は `-Wd`) オプションを利用していれば防げたはずです。

このオプションは環境変数でも指定できるので、開発マシンの `.bashrc` に `export PYTHONWARNINGS=default` と書いてしまうのも良いと思います。自分が開発しているのではないアプリやライブラリの Warning も、できれば報告してあげてください。

なお、 Python 3.7 からは `-X dev` オプションや `PYTHONDEVMODE=1` 環境変数で、より性能を犠牲にしてエラー検出を強化した開発者モードを利用することができます。開発者モードでは上記の warning もデフォルトで表示されます。
Pythonでコンピュータを作る#1  -アルゴリズムとは-

暑くなってきて,服を買いたいけどお金がない大学生の[Motmuu](https://qiita.com/Motmuu)です.
今回から数回に分けて,Pythonで初歩的な計算機を実装していきたいと思います.

#使用する環境

`・Python 3.6.5`
`・Mac OS X 10.13.2`
`・Atom 1.10.2 `      

です.


#アルゴリズムとは

よく聞くアルゴリズムという言葉ですが,その意味を聞かれると,悩んでしまう方も多いかと思います.

> アルゴリズム（英: algorithm [ˈælgəˌrɪðəm]）とは、数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。
https://ja.wikipedia.org/wiki/アルゴリズム

とwikipediaには書いてあります.
とどのつまりどういうことよ？！という方のためにかいつまむと,「ある行動をするためのマニュアル」,「あるものを作るための設計図」です.

例えば,卵焼きを作るときに何をしますか?

1.卵を割る
2.かき混ぜる
3.焼く
4.塩コショウをふる
5.盛り付ける

といったことをすると思います.
この1-5も広い意味ではアルゴリズムです．
小さな頃でテレビで見た,アルゴリズム体操がぶつからないのは同じ時間感覚で決まったアルゴリズムでみんな運動?!しているからです.

このアルゴリズムというのは,複雑に思えるものを視覚的に,定性的に解き明かすことができます.それゆえ,現代社会では多くのアルゴリズムが問題解決に用いられています.

そんな便利なアルゴリズムですが,
コンピュータも様々なアルゴリズムからできています.

これから数回に分けて,パーセプトロン(perceptron)というコンピュータのもととなるようなアルゴリズムについて学習していきます.

続けてこちらも->　[#2 パーセプトロンとは](https://qiita.com/Motmuu/items/69b3b26afd261484ede9)
WordPressセキュリティ対策メモ


## ユーザ名を隠す

投稿者アーカイブにアクセスできないようにする。

公開ディレクトリ直下の.htaccessに記述する。

```
# authorを非表示
RewriteRule ^author/(.*)? / [R=302,L]
```

## xmlrpc.phpへのアクセス拒否

外部サービス、スマホアプリからWordPressへ投稿できる機能・XML-RPCを使うことがなければ無効にする。

WordPressのインストールした（xmlrpc.phpが置いてある）ディレクトリの.htaccessに記述する。

```
# xmlrpc.phpへのアクセス拒否
<Files xmlrpc.php>
Order allow,deny
Deny from all
</Files>
```
[WordPress]各カテゴリー最新1件の投稿を取得する

以前クライアントから表題のような仕様で
（正確には、さらにランダムかつ計50件まで）
依頼を受けた。

結局この件は、だいたいよくあるパターンだが
運用では数種類カテゴリーの記事しか更新されないので
ほとんど旧い記事が表示されるんやでっていうことで普通の仕様になった。

とはいえ、今後もこのようなわけわからん依頼がくるやもしれんので
とりあえず残すことにする。

```php
$query = <<<SQL
SELECT WP.ID, WTT.term_id FROM wp_term_taxonomy AS WTT
	INNER JOIN wp_term_relationships AS WTR ON WTR.term_taxonomy_id = WTT.term_taxonomy_id
	INNER JOIN (SELECT ID, post_type, post_status FROM wp_posts ORDER BY post_date DESC) AS WP ON WP.ID = WTR.object_id
WHERE
	WTT.taxonomy = %s
	AND WTT.count > %d
	AND WP.post_type = %s
	AND WP.post_status = %s
GROUP BY WTT.term_taxonomy_id
ORDER BY RAND()
LIMIT 50
SQL;

global $wpdb;
$ret = $wpdb->get_results($wpdb->prepare($query, ['category', 0, 'post', 'publish']), ARRAY_A);

```

これで投稿IDとタームIDが取れるので
あとはよろしくやってほしい。


ちなみに投稿タイプverは下記
[[WordPress]各投稿タイプ最新1件を取得する](https://qiita.com/ki6ool/items/75c5c8c1dfb0f88c7520)
Arch LinuxでVisualStudioCodeがフォルダを開き始めたら

# フォルダを開くボタンを押したら標準のアプリ(Nautilus)じゃなくてVSCodeが主張してきた！
`/usr/share/applications/mimeinfo.cache` ファイルを編集しましょう。
    
    inode/directory=visual-studio-code.desktop;org.gnome.Nautilus.desktop;
    
ここを、

    inode/directory=org.gnome.Nautilus.desktop;


こうしましょう
Facebook連携をしているアプリはFacebook Graph API v3.0で再審査が必要になる場合があります

## Facebook Graph API v3.0リリース

`Facebook Graph API` の `v3.0` が2018年5月1日にリリースされました。

詳細はのちほど紹介しますが、既存アプリも影響を受ける可能性があるのでご注意ください。

## Facebook Graph APIとは

Facebook Graph APIとは、Facebookと連携をするためのAPIです。

> グラフAPIは、アプリでFacebookのソーシャルグラフにデータを取り込んだり、データを取り出したりするための主要な手段です。

[グラフAPI - ドキュメンテーション - 開発者向けFacebook](https://developers.facebook.com/docs/graph-api) より引用

## v3.0のおもな変更点

以下の公式ドキュメントにあるように、レビューに関する部分がv3.0のおもな変更点です。

> Reviewable Permissions and Features — We have significantly changed our App Review requirements, and as a result, many permissions and features now require App Review. To learn about these changes, please refer to our App Review documentation.

> （Google翻訳）レビュー可能な権限と機能 - 私たちはApp Reviewの要件を大幅に変更しました。その結果、多くの権限と機能でApp Reviewが必要になりました。 これらの変更については、App Reviewのドキュメントをご覧ください。

[v3.0 - グラフAPI - ドキュメンテーション - 開発者向けFacebook](https://developers.facebook.com/docs/graph-api/changelog/version3.0) より引用

Facebookは実名登録が基本で、様々な個人情報を取り扱っています。EUではGDPRが適用されますし、この機会に個人情報やプライバシーに関する取り扱いをしっかりと見直すという動きだと思われます。

そして、そのためにFacebookのデータを利用するアプリをいままでよりもしっかりレビューしてチェックします、ということでしょう。

また、こちらの [Enhanced Developer App Review and Graph API 3.0 Now Live - 開発者向けFacebook](https://developers.facebook.com/blog/post/2018/05/01/enhanced-developer-app-review-and-graph-api-3.0-now-live/) 記事によると、

> For existing apps, a new app review is required by August 1, 2018 in order to maintain approved status. Due to changes to the review process and the high volume of submissions expected, it may take several weeks for submitted apps to complete review.

> （Google翻訳）既存のアプリの場合、承認済みステータスを維持するため、2018年8月1日までに新しいアプリレビューが必要です。 審査手続きの変更と申請件数の増加により、提出されたアプリの審査が完了するまでに数週間かかることがあります。

というように、既存アプリでも再度レビューが必要になるようです。

すでにFacebook Graph APIを使用しているアプリを開発している場合は、2018年8月1日までに対応が必要です。しかし、期限直前は混雑が予想されるので、早めにレビューを受ける方が安全です。

## アプリレビュー

アプリレビューについて簡単に整理します。

### レビューが不要なアプリ

つぎの機能だけを使用するアプリの場合は、レビューは不要です。

- ソーシャルプラグイン
- ウェブのシェアダイアログや、iOSやAndroidのシェアシートなど、Facebookを媒介するシェア製品
- アクセス対象となるデータが、メール、名前、プロフィール写真のみに限定されるFacebookログイン

### レビューが必要なアプリ

つぎの機能を使用するアプリの場合は、レビューが必要です。

- 利用者の誕生日、位置情報、出身地、性別、年齢範囲、プロフィールへのリンクのいずれかをリクエストするFacebookログイン

### レビュー、ビジネス認証、補足条項が必要なアプリ

つぎの機能のいずれかを使用するアプリは、レビューに加えて、補足条項への同意やビジネス認証が必要です。

- 友達、写真、タグ付けされたスポット、動画、イベント、管理するグループ、投稿、携帯電話のいずれかをリクエストするFacebookログイン
- ページAPI
- イベントAPI
- MessengerプラットフォームAPI
- InstagramグラフAPI
- グループAPI
- ビジネスマネージャAPI

詳しくは、 [アプリレビュー - アプリ開発 - ドキュメンテーション - 開発者向けFacebook](https://developers.facebook.com/docs/apps/review/?translation) をご覧ください。

## 参考になりそうなページ

ほかにも、参考になりそうなページをいくつか挙げておきます。

こちらは、バージョンごとの更新履歴を参照できます。
[更新履歴 - グラフAPI - ドキュメンテーション - 開発者向けFacebook](https://developers.facebook.com/docs/graph-api/changelog)

こちらは、レビューに関するよくある質問集です。
[よくある質問 - アプリ開発 - ドキュメンテーション - 開発者向けFacebook](https://developers.facebook.com/docs/apps/review/faqs)

こちらはAPIのリファレンス集です。
画面右上にあるプルダウンメニューで、バージョンを選択できます。
[Graph API Reference - Documentation - Facebook for Developers](https://developers.facebook.com/docs/graph-api/reference)

早めに対応して、楽しい夏休みを迎えましょう。
C++ Builder 10.2 Tokyo > FindComponent()した結果をTEdit *に入れる場合 > dynamic_cast<TEdit *>と(TEdit *)キャストの違い

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
```

### 疑問

下記のコンポーネントがあるとする。

- Edit1: TEdit
- CheckBox1: TCheckBox

TEdit *edPtrにFindComponent()の結果を代入するとき、下記の違いはあるのか?

1. `dynamic_cast<TEdit *>`
2. `(TEdit *)`キャスト

### code

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TEdit *edPtr;
    String msg = L"";

    // 1. dynamic_cast
    edPtr = dynamic_cast<TEdit*>(FindComponent("Edit1"));
    if (edPtr != NULL) {
        msg += L"1a: Edit1(dynamic_cast): Exist\r\n";
    }

    edPtr = dynamic_cast<TEdit*>(FindComponent("CheckBox1"));
    if (edPtr != NULL) {
        msg += L"1b: CheckBox1(dynamic_cast): Exist\r\n";
    }

    // 2. TEdit * cast
    edPtr = (TEdit *)(FindComponent("Edit1"));
    if (edPtr != NULL) {
        msg += L"2a: Edit1(TEdit * cast): Exist\r\n";
    }

    edPtr = (TEdit *)(FindComponent("CheckBox1"));
    if (edPtr != NULL) {
        msg += L"2b: CheckBox1(TEdit * cast): Exist\r\n";
    }

    ShowMessage(msg.c_str());

}
//---------------------------------------------------------------------------
```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/45678fd4-8ae7-1e71-a183-c4af33f0ae75.png)

### 考察

- `dynamic_cast<TEdit *>`の場合、異なる型のコンポーネントはNULLを返す
- `(TEdit *)`の場合、異なる型のコンポーネントはNULLにならない。

型間違いの防止には`dynamic_cast<TEdit *>`の方がいい。
一方で、下記の意見があることは付記しておく。

http://yohshiy.blog.fc2.com/blog-entry-15.html
> この dynamic_cast は安全にキャストしてくれるいいものなのですが、 「dynamic_cast は使うな」と言われています。

### 関連

- [`dynamic_cast`使用記事 (7of9)](https://qiita.com/search?utf8=%E2%9C%93&sort=created&q=user%3A7of9+dynamic_cast)

### 使い分け

[c++ builder XE4, 10.2 Tokyo > 格子状配置のTCheckBoxのCheckedを行列で取得する > Tagプロパティの使用](https://qiita.com/7of9/items/bb16fdc19ac4bbdb5260)
においては下記のようにしている (code v0.2のUnit1.cpp)。

1. `dynamic_cast<>`にてコンポーネントがあることを確認
2. (TCheckBox *)にてsrcPtrへ代入

この流れと`dynamic_cast<>`での代入の違いは何か。
SmartLockの解錠と施錠をBlockchainで管理する

##はじめに

民泊などの用途のために、スマートロックの需要が高まっています。
スマートロックを解錠する鍵は、メーカーが用意する専用アプリなどで管理することができるようになっていますが、
Blockchainを用いて、鍵を電子化して、宿泊する予定の人に一時的に貸すような仕組みを作ることができます。
このような仕組みはEthereumのTokenなどの仕組みを用いて作ることができますが、
今回はより簡単に特定の支払いによって解錠するスマートコントラクトを作成したいと思います。

##Blockchainを使うメリット

「誰が鍵を今持っているか、解錠履歴の情報を改ざんの恐れなく....」
というのは教科書通りの答えで、もちろんメリットになりますが、Blockchainで管理することのメリットは他にも色々と考えることができます。

- 普段使いの財布に鍵を入れることができる
専用のアプリを用意することなくWalletの規格が同じであれば、普段使いのWalletアプリで管理できます。
- 鍵と一緒に朝食券などが渡せる
例えば、ホテルに宿泊したとして、朝食券や関連施設の利用券をもらうことはよくあります。
鍵と同様にTokenで作成し、ユーザーのWalletに送りつけることで実現することが可能です。

##利用したキー
今回使ったのはSESAMIという会社のスマートロックです。
Web用のAPIが公開されているため、これを利用します。
![iOS からアップロードされた画像 (6).jpg](https://qiita-image-store.s3.amazonaws.com/0/43766/0b2103ca-36cf-7730-1c70-30b3c92f7958.jpeg)

##解錠までのフロー
![2.png](https://qiita-image-store.s3.amazonaws.com/0/43766/c44f4957-111e-67da-7d99-d77ec362dbe7.png)

>1.ユーザーが特定の金額をロックデバイスに対して支払いする
>2.鍵が解錠状態になる
>3.unlockというコントラクトのメソッドを監視しているプログラムがAPIをCallする
>4.APIがSmartLockのWifiモジュールに対して解除命令を送る(WifiモジュールがAPIで鍵のステ-
タスをpollingしながら監視している)
>5.SmartLockのWifiモジュールがBLE通信で鍵を解錠する

##解錠操作を受け付けるコントラクト事例
最低限の操作を事例として紹介します.

    contract SmartLock {
        //デバイス　（保有者のアドレス、終了期限、ロック状態を変数に持つとする)
        struct LockDevice {
            address addr;
            uint endTime;
            bool isLock;
        }
        
        address public owner;
        address public lockdevice;
        
        mapping(uint => LockDevice) public lockdevices;
        uint public paidAmount;
        
        modifier onlyOwner(){
            require(msg.sender == owner);
            _;
        }
        
        //ロックデバイスつまり、サービス側からのみ施錠される
        modifier onlyLockDevice(){
            require(msg.sender == lockdevice);
            _;
        }
        
        //スマートロックが保有する変数
        function SmartLock(address _lockdevice) public {
            owner = msg.sender;
            lockdevice = _lockdevice;
            paidAmount = 0;
        }
        
        //解錠する
        function unlock() public payable {
            //1回unlockするための金額を設定
            require(msg.value == 10000000000000000);
            LockDevice storage ld = lockdevices[paidAmount++];
            ld.addr = msg.sender;
            ld.endTime = now + 3600;
            ld.isLock = false;
        }

        //鍵をかける
        function lock(uint _index) public onlyLockDevice{
            require(lockdevices[_index].addr != 0);
            require(now > lockdevices[_index].endTime);
            lockdevices[_index].isLock = true;
        }
    }

##Postmanで設定
SesamiのSmartLockは開発用にPostmanというアプリケーションを用いることができます。
色々なAPIとの組み合わせやオーソライズキーの発行などを行うことができます。
ここでは使用方法などは割愛します。
<img width="1277" alt="postman.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/22c898e8-b899-5959-3915-66a3ac70931b.png">

##SesamiのAPI操作
このような形のAPIリクエストで解錠や施錠操作を行うことができます.

	#施錠
	curl -H "X-Authorization: " \
	    -H "Content-Type: application/json" \
	    -X POST -d '{"type":"lock"}' \
	    https://api.candyhouse.co/v1/sesames/id/control

	#解錠
	curl -H "X-Authorization: " \
	    -H "Content-Type: application/json" \
	    -X POST -d '{"type":"unlock"}' \
	    https://api.candyhouse.co/v1/sesames/id/control

##おしまい
追加したはずのSeederが Class TableSeeder does not exist とか言われる

# 事象
Seederを追加して、DatabaseSeeder.phpにも追加します。

その状態で`php artisan migrate:refresh --seed`を実行するとエラーになります。

```bash:

In Container.php line 752:
                                         
  Class XXXXXTableSeeder does not exist  
                                         
```

# 原因
stack overflowに同じ事象がありました。

- [php - Class tableseeder does not exist (although it really exists) :S - Stack Overflow](https://stackoverflow.com/questions/44028608/class-tableseeder-does-not-exist-although-it-really-exists-s)

composerのリロードが必要なんですね。

回答が微妙に間違ってて、`php composer dump-autoload`とか書いてますけど`composer dump-autoload`ですね。

その後改めてmigrateすると、seedingできました。
祝！ Xamarin.Forms Version3.0 リリース🎉

※ この発表は [Mobile Act #2](https://mobileact.connpass.com/event/85895/) で話した内容です。
----
# アジェンダ
1. 自己紹介
2. Xamarin.Forms
3. 追加機能
4. おわり

---

## 自己紹介
ID:&nbsp; @AyaseSH &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　<img src= "https://pbs.twimg.com/profile_images/866686210298834944/0kdfrIqI_400x400.jpg" width="80" style="border-radius:20px;height:40px;width:40px;" />
名前:&nbsp; 太田川 洋
仕事:
　フェンリルの Xamarin担当
　最近 UWPもやるので .NET担当になってきた

---
## Xamarin.Forms

Xamarinを使用した開発において View層を共通させて開発できるようになるフレームワークです。

今月始め（2018/5) その Xamarin.Forms の v3.0 がリリースされました。
v3.0になって何が出来るようになったのかを発表したいなと思います。

---
## 追加機能  その１
---
## [CSS](https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/styles/css/)

CSS を使ったデザイン定義が追加されました。

今までプロパティやスタイルで決めていた定義(C#, XML)を CSSの記法で書けます。

定義の種類は [公式リファレンス](https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/styles/css/#property-reference) を参考に

---

```xml
<Style x:key="MainPageTitleStyle"
       TargetType="Label">
    <Setter PropertyName="FontSize"
            Value="Medium" />
    <Setter PropertyName="FontAttributes"
            Value="Bold" />
</Style>
```

↑を css だと ↓になる

```css
.mainPageTitle {
    font-style: bold;
    font-size: medium;
}
```
---
## 追加機能 その２
---
## [FlexLayout](https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/flex-layout)

CSS の追加とともに FlexBox （可変するレイアウト方式）も追加されました

今までは Stack, Grid, Absolute, Relative から作成

ここに Flexible が追加🎉

---
Collection ライクなビューを Xamarin.Forms のみでできる

![xamarin_photowrapping1.png](https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/user-interface/layouts/flex-layout-images/photowrapping.png)

---
親の大きさを見て、子の並び・大きさを動的に配置してくれるレイアウト

![xamarin_photowrapping2.png](https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/user-interface/layouts/flex-layout-images/HolyGrailLayout-Large.png#lightbox)

---
## 追加機能 その３
---
## [Visual State Manager](https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/visual-state-manager)

Windowsアプリ(WPF, silverlight, UWP) では定番の機能

コントロールの状態から UIを変更できる機能
色を変えたり、配置を変えるのが簡単に定義できる

---

![Landscape](https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/user-interface/vsm-images/vsmadaptivelayoutportrait.png)

---

![Portrait](https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/user-interface/vsm-images/vsmadaptivelayoutlandscape.png)

---
## 追加機能 その4
---
## [RTL Support](https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/localization/right-to-left)

右から左へのレイアウト変更
![RTL](https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/localization/rtl-images/TodoItemPage-Arabic-Large.png#lightbox)

---
```cs
page.FlowDirection = Device.FlowDirection;
```
```xml
<ContentPage
    FlowDirection="{x:Static Device.FlowDirection}">
```
デバイスの言語情報をみて切り替える場合は上記と各対応だけ

アプリ内での切替は`Device.FlowDirection`部分をカスタマイズ

---
Xamarin.Formsでの開発に幅が広がってくれて嬉しいバージョンアップ

他にもクロスプラットフォームは増えてきたのですが、 老舗(?)の Xamarinも選択肢にどうですか？

---
## ご静聴ありがとうございました
---
【Ubuntu16.04】インストール後ログインループに陥ったときの解決方法

#<b>ログインループに陥っている原因
原因としては、**NVIDIAドライバ**が正常に作動していないことが考えられます。
他にもカーネルが原因の場合とかいろいろあるみたいですが、今回は自分が解決できた方法を記載します。
私はGeForce GTX 1060を新しく挿したあと、Ubuntu16.04をインストールし、起動させたらログインループが発生しました。


#<b>何が悪かったのか
**Ubuntu16.04**では、`sudo apt update`がうまくいっていない場合があるみたいで、これを解決したら直りました。


#<b>解決方法

##<b>GUIではログインできないので、CUIでログインする
ログイン画面で`alt + control + f1`を押して、コマンドラインでログインします。
ちなみにGUIにまた戻るには`alt + f7`を押します。

##<b>updateできるか確認する

```
sudo apt update
```

してみてエラーが出れば`update`できないことが原因であると考えられます。
私の場合は、

```
E: http://jp.archive.ubuntu.com/ubuntu/dists/xenial-backports/main/dep11/icons-64x64.tar の取得に失敗しました  ファイル /var/lib/
apt/lists/partial/jp.archive.ubuntu.com_ubuntu_dists_xenial-backports_main_dep11_icons-64x64.tar.gz をオープンできませんでした -
open (13: 許可がありません)
```

みたいに、エラーが出て、[ググッて出てきたサイト](http://dragstar.hatenablog.com/entry/2017/08/16/115910)を参考にしました。ほかのエラーが出てきた場合では、そのエラー文をそのままググればたぶん解決できると思います。
これでエラーが出ない場合は、他に原因があると考えられます。

##<b>updateできるようにする
以下を入力します。

```
sudo apt-get clean
sudo apt-get update
sudo apt-get upgrade
```

再起動します。

```
reboot
```

これでうまくグラボを認識できているはずです。
脆弱性対策　ノウハウ

https://www.skyarch.net/blog/?p=3474
https://eng-entrance.com/linux-security-basic
https://qiita.com/koh-taka@github/items/9e7c3e23c447e654dfa0
https://www.skyarch.net/blog/?p=3482
https://thinkit.co.jp/story/2014/01/16/4750
wpa_supplicantが原因でubuntuでスリープができないときの対処法

# 対象者

ubuntuの16や18でwifiに繋いだ状態でスリープをしようとして`systemctl suspend`したり、普通にサスペンドをGUIで選択したときに数十秒たって結局画面が再起動してスリープできないよーっていう症状です。

原因はいろいろ考えられますが、ここでは`journalctl`というコマンドでシステムのログをみて、`Failed to start Suspend`や、`Dependency failed for Suspend.`というエラーログを見つけ、そしてそのエラーメッセージの近くで以下のような`wpa_supplicant`由来のエラーを見つけた方向けに記事を書いています。

```bash
 5月 23 19:11:51 nkowne63 kernel: Freezing of tasks failed after 20.007 seconds (11 tasks refusing to freeze, wq_busy=0):
 5月 23 19:11:51 nkowne63 kernel: wpa_supplicant  D    0  1089      1 0x00000004
 5月 23 19:11:51 nkowne63 kernel: Call Trace:
 5月 23 19:11:51 nkowne63 kernel:  __schedule+0x297/0x8b0
 5月 23 19:11:51 nkowne63 kernel:  schedule+0x2c/0x80
 5月 23 19:11:51 nkowne63 kernel:  schedule_timeout+0x15d/0x350
 5月 23 19:11:51 nkowne63 kernel:  ? __next_timer_interrupt+0xe0/0xe0
 5月 23 19:11:51 nkowne63 kernel:  msleep+0x2d/0x40
 5月 23 19:11:51 nkowne63 kernel:  ath10k_pci_hif_stop+0x63/0xc0 [ath10k_pci]
 5月 23 19:11:51 nkowne63 kernel:  ath10k_core_stop+0x4b/0x70 [ath10k_core]
 5月 23 19:11:51 nkowne63 kernel:  ath10k_halt+0x10c/0x170 [ath10k_core]
 5月 23 19:11:51 nkowne63 kernel:  ath10k_stop+0x39/0x80 [ath10k_core]
 5月 23 19:11:51 nkowne63 kernel:  drv_stop+0x39/0x100 [mac80211]
 5月 23 19:11:51 nkowne63 kernel:  ieee80211_stop_device+0x43/0x50 [mac80211]
...
```

# どういうことか

ざっくり解説するとubuntuではスリープするときにsystemdを用いて、systemd-suspend.serviceなどの複数ファイルに従っていろいろなサービスを終了、もしくはスリープしていたりします。systemd-suspend.serviceについて詳しくは[ここ](https://www.freedesktop.org/software/systemd/man/systemd-suspend.service.html)をご覧ください。
wpa_supplicantはwifi接続を司っているようで、これが死ぬとサスペンドから復帰したときにnetwork-managerが起動せずネットに有線ですら繋がらなくなる。ひどいときにはsudoすらできなくなるということが起きます。

# 対処法

※以下の対処法は2018年5月24日時点での情報です。実行の際には手順をよく理解して、自己責任で行ってください。

wpa_supplicantが死んでいるので、そいつをどうにかすればいいわけなのですが、apt-getなどで入れようとしても「最新版です」だとか「見つかりません」だとか出てくるので、そして何より**最新版で、かつパッチを当てなければバグは解決しない**ので自分でビルドする必要があります。

ということで、[linux from scratchのページ](http://www.linuxfromscratch.org/blfs/view/svn/basicnet/wpa_supplicant.html)に従って最新版のビルドとインストールを行ってください。僕の場合、ubuntu16,18いづれもこの解決策で直すことができました。

ビルドとインストールといっても、基本的にはそのページに従うだけで数分で行けてしまいます。ただ、必要なライブラリが足りずにビルドに失敗することがありますので、その際はそのライブラリをなんとかしてインストールしてください。

では、快適なubuntuライフを。
HyperターミナルをWindows環境に導入した時にハマった話

# きっかけ
普段、WindowsでCUIで作業をするときには、[mobaxterm](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiI39jA0Z3bAhWFEpQKHWpcAE4QFggnMAA&url=https%3A%2F%2Fmobaxterm.mobatek.net%2F&usg=AOvVaw2p74aXHoSZjuU9aYznA2Af)を  
使うか、もしくはデフォルトのコマンドプロンプトを使って  
作業をしていたのですが、mobaxtermはWindowsで使うには  
Unixに偏り過ぎだし、デフォルトのコマンドプロンプトを
使うとあまりにもひどい。  
そんな時に、以下の2つの記事をみて一目惚れ。  
ポケモンのテーマが使えるとか・・・素敵やん？
[速報・HyperのWindows版でbashを動かす](https://qiita.com/cognitom/items/e1ae5b409fd33bce68db)
[MSYS2とHyperでPikachuなターミナル環境を構築](https://qiita.com/Ted-HM/items/10b452e434b24d938877)

# 環境情報
OS: Windows 8.1 x64
Hyper：2.0.0(stable)

# インストール手順
[ここ](https://hyper-updates.now.sh/download/win)から、インストーラを導入して出てくる案内に従って、インストール。  
上記の記事を参考に、hyper-pokemonのプラグインの設定を  
記述し、hyperを起動。  

# 問題発生
hyperを起動するとしばらくモッタリとしたあと、エラーが続出。
どうやら、hyper-pokemonのプラグインのインストールに失敗している模様。。。。

# 原因調査
基本的にMacで動かしている人が多いのか、あまり情報が無い。。。  
色々と情報をあさっていたところ、気になる記事を発見。  
https://ameblo.jp/softwaredeveloper/entry-12330566565.html

あれ？もしかして、hyperって内部でnpmコマンドとか呼んでたりする？
[公式ページ](https://hyper.is/)をさらっと見てみる。  
あ・・・必須パッケージとは書いてないものの、なんか呼んでるっぽい。

# npmもインストール
[ここ](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)を参考に導入。

手持ちの環境はproxyの設定が必要なので、以下の2コマンドを実行

```console
$ npm config set proxy http://(ユーザ名):(パスワード)@[プロキシURI]
$ npm config set https_proxy http://(ユーザ名):(パスワード)@[プロキシURI]
```

インストール後、hyperを再起動。
無事、プラグインが導入され、背景がpokemonのテーマ(ランダムだったので、このときはコイキング)になりました。

※もしここが間違ってる、補足情報等あれば、コメントをお願いいたします。
DockerでPhoenix Framework

# 環境とか
- macOS
- Docker For Mac Version 18.03.1

# Dockerfileとdocker-composeをcloneしてbuild
```
git clone git@github.com:foxtrackjp/elixir_test.git
cd elixir_test
docker-compose build
```

## Dockerfileはこんな感じ
```Dockerfile:Dockerfile
FROM elixir:alpine

RUN mkdir /app
WORKDIR /app

RUN yes | mix local.hex
RUN yes | mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez
RUN mix local.rebar --force
RUN apk update && \
    apk upgrade && \
    apk add --update\
    bash \
    curl-dev \
    git \
    nodejs \
    nodejs-npm \
    && rm -rf /var/cache/apk/*
```
alpineベースなイメージがあったのでこちらを利用しました。（ビルド後のイメージは150M弱くらい）

## docker-composeはこんな感じ
```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7.22
    volumes:
      - mysql:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: gJwWACGZqaukCjL7

  app:
    build: .
    tty: true
    volumes:
      - .:/app
    ports:
      - "80:80"
      - "4000:4000"
    command: mix phx.server
    depends_on:
      - db
      
volumes:
  mysql:
    driver: local
```

# アプリケーションの作成
```
docker-compose run app mix phx.new . --app sample --database mysql
```
Railsで言うと```rails new sample --database=mysql```

# DBの接続情報を設定
生成されたアプリケーションの```config/dev.exs```にDBの接続情報を設定します。

```yml:dev.exs
config :sample, Sample.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "root",
  password: "gJwWACGZqaukCjL7", #ここ
  database: "sample_dev",
  hostname: "db",#ここ
  pool_size: 10
```
# DBの作成
```
docker-compose run app mix ecto.create
```
Railsで言うと```Rails db:create```

# 起動
```
docker-compose up
```

起動するとサーバーが立ち上がり、http://localhost:4000 にアクセスしてWelcomeページが表示されれば成功です

# Welcomeページ
<img width="756" alt="スクリーンショット 2018-05-24 14.56.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/16da035b-33cb-41ed-f889-038b34de7042.png">

# 感想

- 全体的にRailsっぽさがあるので仲良くなれそう
- と思ったらちょいちょい差異がある
Metal 2 Brief Review

## What is Metal?
Metal is a low level GPU programming framework for IOS. It is developed by Apple since 2014 and written in C++. Metal has been released in 2014 and has been upgraded to <b>Metal 2</b> in <i>WWDC 2017</i> with lots of interesting additions specifically for Machine Learning techniques.

While high-level APIs like <b>OpenGL</b> are still used in many contexts, there's been a definite trend toward low-level APIs that can take advantage of the massive advancements in GPU speed.
##Advantages of Metal
Metal is specifically developed for speed enhancement and work with Apple's hardware architecture. It allows you to take advantage of the Apple's hardware directly rather than relying on the API to handle it for you. By doing so, It will allow you to achieve much higher performance than the high level API. Metal is also designed for building upon an efficient low-overhead architecture. 
##Disadvantages
Metal is supported for only new Apple Device. For cross platform support, we still need to use openGL. As Metal is appear to be a new framework, there is less in learning material online, so It's kinda hard for newbie like me to start exploring about this new GPU programming framework.
##Metal vs OpenGL
OpenGL is developed for the flexibility. It's one of the high-level GPU programming framework while Metal is a low-level GPU programming framework.

Metal provide direct-access to the GPU, so that we can maximize the graphics and compute potential of your app on IOS MacOS and tvOS.

Metal is developed by Apple and they know exactly which chip they are using for their GPU programming, so that they can optimize the framework to work specifically and directly with the chip.
##Conclusion
Metal is a great API in this 21st century to write code and ship the applications with. It's easy to use and beats <b>OpenGL</b> in every single aspect.

Along with this article, I also create a sample project to draw a simple triangle.
<a href="https://github.com/phanithken/MetalSampleTriangle">https://github.com/phanithken/MetalSampleTriangle</a>
Excel VBAで一瞬でファイル一覧を作成する

#はじめに

Excelシートに、フォルダにあるファイル一覧表を一瞬で作成するマクロです。

# 手順

1. Excelを起動して、開発－Visual Basicを選択する
2. プロジェクト画面からSheet1を選択して、コードの画面を表示
3. 次のコードをコピペする　（\で表示されている箇所は、Windowsなので￥です。ご注意！）

 Sub Syori()

    Dim buf As String
    Dim lCnt As Long
    Dim Path As String
    
    Path = "D:\C\Ruby"           '←ここはメンテナンスする
    
    buf = Dir(Path & "\" & "*.*")
    Do While buf <> ""
        lCnt = lCnt + 1
        Cells(lCnt, 1) = buf
        buf = Dir()
    Loop
End Sub
4. 実行すると、このように、ファイルの一覧が取得ができました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/8db8c434-d1cd-e69a-370a-1616975ae196.png)
localのgitリポジトリをgithubにpushする最低限の手順

既にlocalの開発環境をgitで管理しているけど、そのソースをリモートに置きたくなったシチュエーション。

* githubに空のリポジトリを作る。
* localにリモートリポジトリを追加。

```sh
$ git remote add origin https://github.com/[USER]/[REPOSITORY].git
$ git remote -v
＃ 確認
  ```
* push

```sh
$ git push origin --all
```


githubのSettings>Branchesでmasterをprotectしておきましょう。
Node.js ノウハウ

# 手順
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea

# codeなど
https://www.tuyano.com/index3?id=1143003


・javascript読み込み　　
https://qiita.com/723gt_m/items/68ee87a64c9aeb60dd1b
http://www.naka-sys.okinawa/post-337/

・macにインストール
https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09
https://qiita.com/akakuro43/items/600e7e4695588ab2958d

# 用語など
・NVM（Node Version Manager）
・nodeコマンドはJavascriptで書いたプログラムを実行するためのコマンド
・npm (Node Package Manager)はnodeコマンド実行時に使用するパッケージ(ライブラリ)をダウンロードしてインストールするためのコマンドだ
超初心者が学ぶDockerとは

##自己紹介
２０１８年新卒文系出身未経験プログラマー

##この記事を書いたキッカケ
環境構築を行う中でDockerの勉強で見事にわからなすぎて撃沈。
説明もよく分からないしさっぱり。よく分かるDockerとはのようなサイトに書いてある内容がさっぱり分からなかったので、超初心者が分からないなりに学んだことメモ。


###【前提】超初心者目線で語るLinuxとは果たして何なのか
* Linuxは無料のOS(MacというソフトやWindowsというソフトのようなもの。これらは有料)
* Linuxはパソコンを動かすための基礎部分であり、デスクトップLinuxとサーバー用Linuxがある。僕がLinuxと思って触ってた方はサーバ用かな？
* MacOSはLinuxベースで作られている。→MacOSはUnixベースで作られている。(2018/05/25修正)
* サーバーへの問い合わせの言語もLinux。

##超初心者目線で語るDockerとは果たして何なのか
* コンテナ管理ソフトウェアのこと。
* 今まで仮想サーバーを複数立てていたものが、Dockerがあれば仮想サーバー一つで大丈夫。コンテナで管理してくれるから。
* コンテナとはホストPCのOSの上で動くLinuxプロセスのこと。

##疑問に思ったこと
* `Dockerとは、dotCloud社(現:Docker社)が開発した、Linuxで利用できるコンテナ管理ソフトウェアです。`(引用　[Dockerとは|4つの特徴と基本的な使い方](https://furien.jp/columns/147/)) この文言内にある"Linuxで利用できる"という部分が引っかかった。MacOSやWindowsOSでどうやってLinuxOSで利用するのかイメージが沸かなかった。  
 →仮想環境を立て、その中でLinuxOSを用いて操作する。仮想環境とは、VirtualBoxなどを用いて目の前にあるMacというハードウェア内に仮想のハードウェアを立てること。その仮想ハードウェアのOSをLinuxにすることでDockerを使用する。

##感じたこと
仮想のものなため概念がただでさえわかりにくい。とにかく触ってみて動かさないと人に説明できないし、触ってみることが一番の勉強になるんだろうと感じた。
***実際に触ったら超初心者なりにわかったこと、学んだことを更新します。***
小技メモ

便利だと思ったものをメモ。

# Windows
## dos
### forfiles
使い方は、ヘルプ参照
ファイル一覧等を作ったり、ファイルの属性（タイムスタンプ、サイズ等）を確認するのに便利

### start path
pathに指定した階層で、エクスプローラが起動する。

### 環境変数追加
set PATH=C:\MyWork\java\8\bin;%PATH%

### Javacでエンコーディングを指定したい
コンパイル環境によって、デフォルトのエンコーディングがあり、コンパイル時に指定しないとデフォルトのエンコーディングでコンパイルが実行される。
そのデフォルトのエンコーディングと、ソースファイルのエンコーディングが一致しないと
うまくいけば、コンパイル時にエラーになって気づけるが、そのままエラーがなくコンパイルできる場合がある。（実行時に発覚する）

#### 自分の環境のデフォルトのエンコーディングを確認する
以下は、Windows10で実行している

```
import java.util.Properties;
import java.util.Enumeration;

class sampleEncoding{
  public static void main(String[] args){
    System.out.println(System.getProperty("file.encoding"));
  }
}
---結果
MS932
```

#### 自分でエンコーディングを指定する

```
javac -encoding utf8 xxx.java
```

# Eclipse

## ファイル検索

ctrl + Shift + R

## タブ切り替え

ctrl + E
WordPressでメタディスクリプションタグを追加するfunctions.php

functions.phpに以下を追加する。

```functions.php
// get meta description from the content
function get_meta_description() {
  global $post;
  $description = "";
  if ( is_home() ) {
    // ホームでは、ブログの説明文を取得
    $description = get_bloginfo( 'description' );
  }
  elseif ( is_category() ) {
    // カテゴリーページでは、カテゴリーの説明文を取得
    $description = category_description();
  }
  elseif ( is_single() ) {
    if ($post->post_excerpt) {
      // 記事ページでは、記事本文から抜粋を取得
      $description = $post->post_excerpt;
    } else {
      // post_excerpt で取れない時は、自力で記事の冒頭100文字を抜粋して取得
      $description = strip_tags($post->post_content);
      $description = str_replace("\n", "", $description);
      $description = str_replace("\r", "", $description);
      $description = mb_substr($description, 0, 100) . "...";
    }
  } else {
    ;
  }

  return $description;
}

// echo meta description tag
function echo_meta_description_tag() {
  if ( is_home() || is_category() || is_single() ) {
    echo '<meta name="description" content="' . get_meta_description() . '" />' . "\n";
  }
}
```

header.phpに以下を追加する。

```php
<?php echo_meta_description_tag(); ?>
```
React Nativeでカメラや現在地などのパーミッションを管理する

# 使用パッケージ
2018年5月現在の方法です。

Androidは、React Native公式の**PermissionsAndroid**を使用します。
iOSは、**react-native-permissions**というパッケージを使用します。

## PermissionsAndroid
http://facebook.github.io/react-native/docs/permissionsandroid.html
インストール等不要で使えます。

### ***サンプル***
```
import { PermissionsAndroid } from 'react-native';

async function requestCameraPermission() {
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.CAMERA,
      {
        'title': 'Cool Photo App Camera Permission',
        'message': 'Cool Photo App needs access to your camera ' +
                   'so you can take awesome pictures.'
      }
    )
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      console.log("You can use the camera")
    } else {
      console.log("Camera permission denied")
    }
  } catch (err) {
    console.warn(err)
  }
}
```

## react-native-permissions
Github:
https://github.com/yonahforst/react-native-permissions

iOSのパーミッション管理を行うことができるパッケージです。

```
npm install --save react-native-permissions
# --- or ---
yarn add react-native-permissions

react-native link react-native-permissions //ネイティブコードの自動書き換え
```

### 準備
iOSの場合、Info.plistに以下ように追加する必要があります。

```swift
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Some description</string>
<key>NSCalendarsUsageDescription</key>
<string>Some description</string>
<key>NSCameraUsageDescription</key>
<string>Some description</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Some description</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Some description</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Some description</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>Some description</string>
<key>NSAppleMusicUsageDescription</key>
<string>Some description</string>
<key>NSMotionUsageDescription</key>
<string>Some description</string>
```

### ***サンプル***
```
import Permissions from 'react-native-permissions'


export default class extends React.Component {
  ...
  componentDidMount() {
    Permissions.check('photo').then(response => {
      //responseには'authorized', 'denied', 'restricted', 'undetermined'のいずれかが返る

      if (response == 'undetermined') {
        Permissions.checkMultiple(['camera', 'photo']).then(response => {
          //response is an object mapping type to permission
          this.setState({
            cameraPermission: response.camera,
            photoPermission: response.photo,
          })
        }) 
      }
    })
  }
  ...
}
```


いまのところこんな感じのようです。
UnityでTexture2Dに描き込む

[QIX](https://qiita.com/ayaseya/items/b4fa570996e3808d8362)を作成する過程でTexture2Dに直接ラインを引く、塗り潰すことを検討していました。

実際には採用しなかったのですが、備忘録としてTexture2Dに描き込む方法を残しておきます。

![Painter.gif](https://qiita-image-store.s3.amazonaws.com/0/55307/0506e09e-ba13-e272-3c98-2249eab4e5cf.gif)

```c#:PaintController.cs
public class PaintController : MonoBehaviour
{

	public Texture2D texture2D; // 描き込み先のTexture
	public GameObject pointer;  // カーソル
	private Brush brush;        // ブラシサイズ、色情報を保持するクラス

	void Start()
	{
		// 初期化処理(Inspectorでpublic変数が紐付けられていない時はタグから取得する)
		if (texture2D == null)
		{
			texture2D = GameObject.FindWithTag("Canvas")
								  .GetComponent<SpriteRenderer>()
								  .sprite
								  .texture;
		}

		if (pointer == null)
		{
			Debug.Log("pointer");
			pointer = GameObject.FindWithTag("Pointer");
		}

		brush = new Brush();
	}

	void Update()
	{
		// マウス座標をワールド座標からスクリーン座標に変換する
		Vector2 mouse = Camera.main.ScreenToWorldPoint(Input.mousePosition);
		pointer.transform.position = new Vector3(
			mouse.x,
			mouse.y,
			this.transform.position.z /* マウスのz座標は-10となってしまうため、
			スクリプトがアタッチされているオブジェクトのz座標で補正する */
		);
      
		// マウスクリック
		if (Input.GetMouseButton(0))
		{
			Draw(Input.mousePosition);
		}
	}

	// 描き込み(Textureに描き込むだけで、元になったpngファイルには反映されない)
	private void Draw(Vector2 position)
	{
		// Textureにピクセルカラーを設定する
		texture2D.SetPixels((int)position.x, (int)position.y,
							brush.blockWidth,
							brush.blockHeight,
							brush.colors);

		// 反映
		texture2D.Apply();
	}

	// ブラシ
	private class Brush
	{
		public int blockWidth = 4;
		public int blockHeight = 4;
		public Color color = Color.gray;
		public Color[] colors;

		public Brush()
		{
			colors = new Color[blockWidth * blockHeight];
			for (int i = 0; i < colors.Length; i++)
			{
				colors[i] = color;
			}
		}
	}
}
```

描き込み先のTextureはInspector上から以下の変更を加えておく必要があります。(SetPixels関数が失敗する)

1. Read/Write Enableにチェックを入れる
1. FormatをDXT1やDXT5など圧縮系から非圧縮系のものに変更する

<img width="306" alt="texture.png" src="https://qiita-image-store.s3.amazonaws.com/0/55307/7340c789-1970-6aca-8f2d-60a8b5f0f0fc.png">



ソースコードは[GitHub](https://github.com/ayaseya/Painter)にアップロードしています。
Django: Specified key was too long; max key length is 767 bytes

Python 3.5.2
Django 2.0

Djangoでモデルをいじっているうちに下記エラーが出るようになった。

```bash:
pymysql.err.InternalError: (1071, 'Specified key was too long; max key length is 767 bytes')
```

なぜだかrunserverではでない。testだけで発生する。
ググってみるとMySQLのエラーのようである。
[innodb_large_prefixを使ってERROR 1071を回避する](https://yakst.com/ja/posts/734)

対処方法としてMySQLのデータベース変更の方法がたくさん引っかかる。

ところで、なぜrunserverでは大丈夫で、testだとだめなのか。
どうやらモデルをいじっているうちにmigrationsファイルにそういう状態が記録されてしまっているからのようだ。

だとしたら、最新のmigrationsファイルでは問題ないのだから全部まとめてしまえばよいはず。

```bash:

$ python ./manage.py squashmigrations app_label 最新のmigration_name
中略
Do you wish to proceed? [yN] y
Optimizing...
  Optimized from 61 operations to 17 operations.
Created new squashed migration 
まとめられた新しいmigration_name
  You should commit this migration but leave the old ones in place;
  the new migration will be used for new installs. Once you are sure
  all instances of the codebase have applied the migrations you squashed,
  you can delete them.
```

古いmigrationファイルはすべて消してtestすると無事終了した。
Xamarin.Android の複数の View を一括処理したい

## 発端

- Xamarin.Android で
- 複数の View を非表示にしたい
- HTML の class のようなもので一括処理したい
- `android:tag` が使えるのでは

---
## View ツリーを再帰的に検索する

- `ViewGroup.ChildCount`
- `ViewGroup.GetChildAt(index)`
- 検索の起点はたぶん `Window.DecorView`
- 再帰の書き方はお好みで

---
## 再帰関数から IEnumerable\<View\> をもらう例

```c#
private IEnumerable<View> EnumlateChildViews(View view)
{
    if (view is ViewGroup viewGroup)
    {
        for (int i = 0; i < viewGroup.ChildCount; ++i)
        {
            foreach (var result in EnumlateChildViews(viewGroup.GetChildAt(i)))
            {
                yield return result;
            }
        }
    }
    else
    {
        yield return view;
    }
}
```

```c#
foreach (var hoge in EnumlateChildViews(this.Window.DecorView).Where(_ => _.Tag?.ToString() == "hoge"))
{
    hoge.Visibility = ViewStates.Invisible;
}
```

---
## 再帰関数に Action\<View\> を渡す例

```c#
private void ForEachChildViews(View view, Action<View> action)
{
    if (view is ViewGroup viewGroup)
    {
        for (int i = 0; i < viewGroup.ChildCount; ++i)
        {
            ForEachChildViews(viewGroup.GetChildAt(i), action);
        }
    }
    else
    {
        action(view);
    }
}
```

```c#
ForEachChildViews(this.Window.DecorView, view =>
{
    if (view.Tag?.ToString() == "hoge")
    {
        view.Visibility = ViewStates.Invisible;
    }
});
```