OmniAICreator/Qiita-1.07M huggingface dataset:
UnityのC#スクリプトでクラスやGameObjectなどを呼び出す手法集

Unity(C#)のクラスやGameObject、Componentの呼び出しでよく使うパターンをまとめています。

# 頻出レベル
まず知らないと困りそうな手法達です。

## インスペクタを介してインスタンスを取得する
Unityスクリプトの基本ですが、GameObjectやComponent、画像などのリソースをインスペクタを介してフィールドで受ける方法です。
GameObjectとComponentはインスペクタ上の指定方法は同じですが、スクリプト側は区別するので注意してください。

```csharp
// 設計とか考えずにとにかく使いたいなら
public GameObject enemy; // Prefabを含むあらゆるGameObjectが対象
public Image userImage; // UI>Imageの画像書き換えなど

// 外部から参照されたくないなら
// 注意：Unity2018頃から初期値がnull相当の値だと警告が出ます
//     インスペクタで値を指定させる前提の場合は、publicで対応しましょう
[SerializeField]
private Collider hitTarget; // GameObject内のCollider系コンポーネントだけ取得する
```

ちなみに配列も可能です。

```csharp
public GameObject[] enemies; // デフォルトは空の配列
public GameObject[] players = new GameObject[4]; // デフォルトの配列サイズも指定可能
```

## ProjectViewのリソースを取得する
可変的にデータを参照したい場合や、大量のデータを名前で管理したいような状況では、「リソース」として取得する方法があります。「Resources」フォルダに入っているデータがリソースとして扱われます。
リソースはビルド時にゲームデータとして使用されるデータとして扱われます。通常は、シーン上で使用されていないデータはビルド時に除外されるようになっており、アセットのサンプルデータなどのような不要なデータとして扱われます。リソースの場合は、シーン上から直接使われていなくても必ずビルドデータに含まれるようになります。

```csharp
void Start() {
  // リソースの名前だけで取得する
  var enemyTexture = Resource.Load("enemyTex") as Texture;
  // Prefab（GameObject)に限定して取得する
  var mobChar = Resource.Load("mobchan", typeof(GameObject)) as GameObject;
}
```
UnityDoc - https://docs.unity3d.com/jp/540/ScriptReference/Resources.Load.html

## GameObject上のComponentを取得する
フィールドなどからGameObjectを取得したあとに、内包しているComponentを取得する方法です。
実行中にComponentが追加されるようなAssetsで連携する場合は必須です。

```csharp
public GameObject root;

void Update() {
  // 取得するComponentをテンプレートのクラスに指定して取得する
  Renderer rend = root.GetComponent<Renderer>();
}
```

## クラスそのものを取得する（参照する）
インスタンスではなくクラスそのものを使いたい場合があります。
特にAssetsのコンポーネントを参照したい、生成したいなどはスクリプトが同じ名前空間にないとアクセスできないので、usingします。

サンプルとして、MyGameAssetという名前空間にMyGameObjectクラスを作ったとします。

```csharp:/Assets/MyGameAsset/Scripts/MyGameObject.cs
namespace MyGameAsset {
  public class MyGameObject : MonoBehavior {
    /* Your Program */
  }
}
```

このクラスを外部のスクリプトからアクセスする場合は、次のようになります。

```csharp:/Assets/Scripts/MyScript.cs
using MyGameAsset; // ←ココ

public class MyScript : MyGameObject {
  /* Your Program */
}
```

なお、名前空間はProjectViewの階層とかは関係なく、あくまでもnamespaceで決まるので注意してください。


# 時々レベル
パフォーマンスや可読性の観点からあまり使いたくない手法です。

## インスペクタを介さずにステージ上のインスタンス取得
動的に生成されたGameObjectなどのシーン上のGameObjectを手軽に取得する方法です。文字列で名前指定するだけで取得できますが、結構重い処理なので`Update()`内などで定期的に取得し直すとボトルネックになる可能性があります。

```csharp
private GameObject pointTarget;

void Awake() {
  // シーンに配置されたGameObjectの名前から取得する
  pointTarget = GameObject.Find("GameObjectName");
}
```

# あとがき
いろいろ不十分な部分あると思います。
指摘あれば修正加筆するかもなので、よろしくお願いします。
Emacsでディレクトリ以下の複数ファイルに対して一括置換する

参考にしていたサイトがなくなってしまったので、こちらに掲載。

### 1. 対象ファイルを検索

    M-x find-name-dired
    Find-name (directory): ~/path/ （対象ディレクトリを入力）
    Find-name (filename wildcard): * （ファイル名の検索パターンを入力。この場合は全部選択）

`*Find*`バッファに、対象ファイルの一覧ができる。

### 2. 対象ファイルを選択

    t (toggle-mark)を押して全て選択。

### 3. 置換

    Q を押す。
    Query replace regexp in marked files: foo （置換される文字列を入力）
    Query replace regexp in marked files foo with: bar （置換する文字列を入力）

置換箇所ごとにプロンプトが出るので、置換するなら`y`、しないなら`n`を入力。
全部置換するなら大文字で`Y`を入力。

### 4. ファイルを保存

    C-x s
    ! を押して全て保存。

refs. https://stackoverflow.com/questions/270930/using-emacs-to-recursively-find-and-replace-in-text-files-not-already-open
お前らのdocker記事はもう古い！


# 煽り記事で申し訳ありません
インフラエンジニアとして、Dockerを少し触りましたが、最近のやり方(systemd導入)をあっちこっち調べ回ることになり、慣れの果てをQiitaにポストしようと思いました。

既にdockerの操作に慣れ親しんでいる皆様におかれましては大変申し訳有りませんが、ただのdocker入門記事になりますので、良記事にするためにバシバシご指摘いただければと思っております。

## Dockerfile作ればいいんでしょ？

はい、そうです。
Dockerfileを作れば簡単に自分の思い通りのLAMPサーバを構築できます。
しかし、centos7系(systemd)にトラップがいくつか仕組まれており、そう簡単にhttpdを起動させることができませんでしたので、起動できるまでをご紹介いたします。

というわけで手っ取り早くどうすればいいのかを書いていきます。

■ Terminal

```
~/ $ vim Dockerfile
```

■ Dockerfileの中身

```Dockerfile
#
# LAMP Base
#
# 20150223
#   CentOS 7.1 +epel
#   Apache 2.4
#   MySQL 5.6
#   PHP 7.1

FROM centos:7
LABEL maintainer="kashima"

# update yum
RUN yum update -y && \
    yum clean all

# epel repo
RUN yum install -y epel-release && \
    yum clean all

RUN yum install -y httpd php && \
    yum clean all && \
    systemctl enable httpd.service

COPY ./index.html /var/www/html/index.html

CMD /sbin/init
```

■ index.htmlの中身

```
ok.
```

### Point 1.

以下が重要なサービス起動に関する記述です。

```Dockerfile
RUN yum install -y httpd php && \
    yum clean all && \
    systemctl enable httpd.service
```
yum installとyum cleanが全て正常に完了したら、サービスをenableにしてください、という内容です。

httpdを起動する際に、ENTRYPOINTを使うんだとか、CMDで起動できるとか、CMDでenableにしてないからだとかdocker-composeを使うんだとか色々引っかかってくるわけですが、どれも間違いです。(たぶん)
正しくは、上記の通り、yum install後にenableするのが正解です。
これは、docker hubのコミュニティに記載があります。
https://hub.docker.com/r/centos/systemd/

この方法以外で起動する方法はありません。(たぶん)

もうここだけでいろんな情報漁って答えが見つからないのでかなり疲れました。

### Point 2.

ビルド方法は後述しまして、先にdockerの動かし方です。
dockerの起動時ですが、centos7を使っている場合は、SELinuxが有効なシステムになりますので、privilegedを使います。
SELinuxのないシステムでは、--cap-add=SYS_ADMINを使えばOKです。

■ Terminal

```
~/ $ docker run --rm --privileged -dit --name {container name} -p 10080:80 {image name}
```
`--privileged`は特権設定です。
特権設定がないと、centos7は、`Failed to get D-Bus connection: Operation not permitted`が発生します。
ちなみに、`--privileged`をつけた状態で、ENTRYPOINTを使って、httpdをstartしようと頑張っても、なぜか`Failed to get D-Bus connection: Operation not permitted`が発生しますので、迷宮入りすることになります。

`--name`でcontainer nameをつけると、docker rm {container name}で削除できて楽です。
container idでdocker rm {container id}とすれば削除することは可能ですが、container idが毎回変わり、docker ps -aで調べられるのですが、正直めんどうなので{container name}を指定すると楽になります。

## Dockerfileのビルド
これは何の変哲もない感じになります。

■ Terminal

```
~/ $ docker build -t {image name} ./
```

もしくは

```
~/ $ docker build -t {image name} ./Dockerfile
```


## Dockerへのログイン方法
上記のPoint 2.の方法はログインせず、起動だけにとどまります。
ログインする方法はいくつかあるようですが、下記の方法でアクセスします。

```
~/ $ docker exec -it {container name} /bin/bash
```

docker attach {container name}という方法もありますが、こちらを実施するには、docker実行時に/sbin/initを末尾に追加しておく必要があるようです。(たぶん)
でも、確実にログインできたのが前者でしたので、こちらを推します。

# おまけ

## エラーになった！エラー情報が欲しい！

起動するときのoptionに`--rm`がありますので、`--rm`を消して起動します。
docker ps -aでexitしたときのエラーコードが見れます。
さらに、以下のコマンドで最後に出力されたログ情報を見ることができます。

■ Terminal

```
~/ $ docker logs {container name}
```

エラーメッセージが表示されたら頑張ってググってください。
cisco packet tracer メモ

はじめまして。
今回は、パケトレにこれだけは設定しとけ！って内容をまとめました。

#追記
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124948/6ae0c71c-3280-3098-032f-1a156cf52c9c.png)

https://www.netacad.com/group/offerings/packet-tracer/
においては、バージョン7.2が公開されているようですね。

基本は変わっていませんが、スタイリッシュな画面となっています。お好きな方は最新版をどうぞ。

#見た目を整える

パケトレのデフォルトのコンソール画面って小さくてちょっと見ずらいですよね。まずはこれを変更します。

####1. 右上のOptionを選択し、出てくるメニューからPreferenceを選択してください。（マーカー箇所）

![blog0.PNG](https://qiita-image-store.s3.amazonaws.com/0/124948/b37efad5-5845-811b-d630-5be18564141e.png)

####2.Fontタブを開いて、コンソール画面の文字の色を変更します。(Sizeのゲージはお好みで変更してください)

![blog1.PNG](https://qiita-image-store.s3.amazonaws.com/0/124948/c86cbcd6-e9da-44ea-4b11-61938ef82608.png)

####3.Custum Interfaceのタブを選択して、マーカー箇所の設定を変更します。

![blog2.PNG](https://qiita-image-store.s3.amazonaws.com/0/124948/ce0f702d-50d8-f365-11cb-3c88ad147948.png)

####4.以上で完成！

![blog3.PNG](https://qiita-image-store.s3.amazonaws.com/0/124948/80bf1f3f-5419-007b-ae07-6270d9e6029b.png)

#知っておくと便利なこと

大量にホストを配置したい場合は、コントロールキーを押しながら、すでに出したホストをドラッグアンドドロップしてみてください。
ひとつひとつ配置するよりも圧倒的に手早く配置できますよ！



--------------------------------------------
###ここまで読んでいただきありがとうございました。それでは、よいパケトレライフを！！
Visual Studio CodeのVimプラグインで、Ctrl+dがマルチ選択になってしまうときの対処法

あるときから、Vimプラグインを使ってNormalモードでCtrl+dしても、ページ送りせず、マルチ選択が１回だけ動く、みたいな挙動になってしまったのでその対処法です。

## 対処法
https://github.com/VSCodeVim/Vim/issues/824#issuecomment-358189713

メニューバーの「Code > 基本設定 > 設定」から、ユーザー設定のjsonに下記を追加しましょう。

```
"vim.handleKeys": {
    "<C-d>": true
},
```
複数のGeotiffを１枚にマージする（gdal_merge.py)


自分用メモ。
参考：[ここ](https://gis.stackexchange.com/questions/2195/gdalmerge-produces-file-that-is-much-too-large)、[公式マニュアル](http://www.gdal.org/gdal_merge.html)


バーチャルラスターをつくるのが望ましいもののどうしても一枚の画像にマージしたいときもある。


```
gdal_merge.py -o OUTPUT.tif -ot Float32 -co COMPRESS=LZW -co BIGTIFF=YES INPUT1.tif INPUT2.tif INPUT3.tif
```
-otはByte, Int16なども可
-co COMPRESS=LZW　はしないと圧縮されないためとんでもない大きさのtifが生成される
-co BIGTIFF=YES　出力データが4GB以上の際は必須
XcodeでOutlet接続ができなくなったとき

#エラー内容
Xcodeでアプリを作成しているとき、ButtonをOurlet接続しようとしたら以下のエラーが出た( ´Д`)

"Could not insert new outlet connection: Could not find any information for the class named HogeViewController"

HogeViewControllerが見つからないから接続できないお（超絶意訳）
と言われている。。。

#解決策
Xcodeを終了した後、ターミナルを開いて、以下を実行し、再度Xcodeを開く

"rm -rf ~/Library/Developer/Xcode/DerivedData/HogeViewController"

#エラーになった原因
同じ名前のファイルが見えないとこに存在していて、接続する時にXcodeが迷ってる、らしい(´･ω･`)
私は同じ名前のプロジェクトを１度作成して削除したため、これが起こったと思われる・・・
（一度嫌になって最初から同じ名前のプロジェクトを作成するという荒技）

このターミナルで実行するコードは、その被ってるファイルを削除するためのものだよ！٩( ᐛ )و

※間違っていること言ってたら誰か教えてください(´･ω･`)笑
Azure FunctionsのログをBLOBにアーカイブしてみる

# はじめに
どうも。
仮想マシンを実行していなかったので自動アップデートの対象外だった鶴見です。
年末年始にかけてSpectreやMeltdownなどで中々の騒ぎになってましたね。
Azureも1/9までは手動アップデート期間だったのを前倒して、1/4にアップデートを強行するに至っていました。
参考リンク↓
https://blogs.technet.microsoft.com/jpaztech/2018/01/04/securing-azure-customers-from-cpu-vulnerability/

**ただ、今回の記事は上記とは全く関係ありません。**
Azureリソースのログ管理を色々と探っている際に、少しだけ引っかかった内容を記載していきます。
というわけで**Azure FunctionsのログをBLOBにアーカイブする方法**を記載します！

# そもそもAzure Functionsのログって…
Azure FunctionsはAzureが提供するサーバーレスアーキテクチャで、ユーザーが定義した関数を実行するサービスです。
実行の際のトリガーやバインディング(データの入力や出力)の部分はあらかじめ作りこまれており、その部分をユーザーがほとんど介入しなくていいようなってます。

このAzure FunctionsはベースはApp Serviceと近いものとなっており、課金も**App Service Plan**か**従量課金**を選べるようになっています。

そんなAzure Functionsのログですが、Windows版であればWeb Appと同様に診断ログを構成することが出来ます。
ですのでWebサーバーログとアプリケーションログはストレージにアーカイブすることが可能です。
Function＞プラットフォーム機能＞診断ログから設定が可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181154/9cec754d-07a1-e76f-6ff4-f92609babefe.png)

しかし、最近発表されたLinux版のAzure Functionsの場合、そうは問屋が卸しません。
(まぁ、プレビュー版なので仕方がないですが…)

# Azure Functions(Linux)のログ
ではLinux版の場合どうやってログを取得したりアーカイブすればいいのか。

### Kuduを使います。

他のApp Serviceを含め、Functionsのログファイルはファイルシステム上の/home/LogFilesに出力されます。
Kuduにはログファイルをダンプする機能があります。
またAPIにも対応しているために、
「https://< Functions名 >.scm.azurewebsites.net/api/dump」
を叩くことによってzipファイルをダウンロードすることができます。
ただ一点気を付けなければならないのは、**Kuduへの認証情報を入れ込む**必要があります。
Kuduの認証情報はAzureで設定するデプロイ資格情報になります。
**(ユーザー名はドメイン名を抜いたもの)**

# 実際に実装してみた

個人的に親しみのあるPowershellを使用して実装してみました。
以下がそのスクリプトになります。

```functionlog.ps1

$Filename = "./"+(Get-Date).ToString('yyyy-MM-dd')+"_log.zip"
$blobname = (Get-Date).ToString('yyyy-MM-dd')+"_log.zip"


$username = "<デプロイ資格情報のユーザー名>"
$password = "<デプロイ資格情報のパスワード>"
# Note that the $username here should look like `SomeUserName`, and **not** `SomeSite\SomeUserName`
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"

$apiUrl = "https://<Functions名>.scm.azurewebsites.net/api/dump"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method GET -OutFile $FileName -Debug

$saname = "<ストレージアカウント名>"
$sakey = "<ストレージアカウントキー>"
$ctx = New-AzureStorageContext -StorageAccountName $saname -StorageAccountKey $sakey
$ContainerName = "test"
$localfile = $localfilepath + $blobname
Set-AzureStorageBlobContent -File $FileName -Container $ContainerName -Blob $blobname -Context $ctx
```
上記の方法の問題点が一つだけあるのは、LogFilesのファイルをそのまま丸ごとZipにしてBLOBに送り込むために、更新分だけを綺麗に送ることが出来ない点です。
ただ、アーカイブ用途であるならばその状態でも問題はないかと思います。
(ストレージ料金が少しだけかさみますが…)

# 終わりに
今回はFunctionsとして取り上げておりますが、Web App on Linuxにも同様のことが言えるので、そちらにも使えますね。
あくまでもプレビュー段階のものに対する施策なので実際にGAされた多岐には綺麗にその機能が付いている可能性はあります。
今までも、機能が無いから実装してみたけどすぐに公式で機能拡張された経験も多々あるので、自分から仕組みを作るのか、仕組みが作られるのを待つのかは悩ましいところですね。
個人的な願望としては、この機能も標準でほしい部分だけをアーカイブできるように実装されてほしいです。

ここまで駄文に付き合ってくださってありがとうございます。
ではでは。

# 参考リンク
https://docs.microsoft.com/ja-jp/azure/azure-functions
https://github.com/projectkudu/kudu/wiki
組込み | C > link > マップファイルのセクション > .bssや.dataや.rodataや.text

```txt:動作環境
とある組込みシステム
```

マップファイルに記載されている「セクション」について関連しそうな情報へのリンクを整理している。

### 組込み関連

- [Compiler.pdf](https://www.ele.uva.es/~jesus/hardware_empotrado/Compiler.pdf)
    - 大学の講義資料?
    - pdfのフォルダを見るとARM関連の資料があるのでARMが対象だろうか
    - Object file formats
        - ELF
        - .hex (ihex)
        - .bin (binary file)
- [メモリマップ](https://www.aps-web.jp/academy/cm/19/)
    - ARM Cortex-M3のメモリマップ
    - 一般的なマイコンとの違い
        - アドレス領域のマッピングは固定
        - コードエリアとデータエリアの区別がない
        - ...
- [RENESASのコンパイラ](http://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V4.01.00/CS+.chm/Compiler-CCRX.chm/Output/ccrxaac0101y.html) : RXというMCU?
    - C, C_2, ..., D, ...`C$INT`, `C$VTBL`, ...
- [コードサイズを聞かれたら](https://www.uquest.co.jp/embedded/learning/lecture11.html) @ ユークエスト株式会社
    - セクションとは
- [０から作るOS開発　カーネルことはじめ](http://softwaretechnique.jp/OS_Development/startup_kernel.html)
    - Cygwin
    - リンカの設定 > セクション
- [STM32 Nucleo Boardリンカスクリプト](https://qiita.com/mitazet/items/83ddd6cdffc43dd42f21)
    - メモリとセクション
    - その他、色々詳しい

### 組込み関連ではないが、興味を引かれた記事

- [プログラムのメモリ使用量とMapファイル @ゲームプログラマの小話[開発:コンパイラ・ビルド]](https://qiita.com/hoboaki/items/d8f7020e472cdb884971)
- [C++のメモリーの話とストレージの有効期間の話をしようか](https://qiita.com/yumetodo/items/067b2db266ae0779f030)

### 対象のシステム

IDEのプロジェクトごとの設定において、Linkタブの中にセクションの定義がある。
「アドレス」と「セクション名」の構造が定義されている。
~~後から追加されたようなセクション名がどのように変数と結びついているのかは未消化。~~

`#pragma section [セクション名]`
のような形で変数のセクションを指定するようだ。
セクション名の先頭の1文字は上記のRXのリンク例にあるように「名称(領域と初期化)」の区別の文字列として使われ、`#pragma`指定では省いてセクション名を書くのだろう。
【AWS】サーバーレスで問い合わせフォーム (s3,Lambda,SES)

# はじめに
AWSome Day(awsのセミナー)に参加しまして、
学習意欲が湧いたので、早速、サーバーレスで
**お問い合わせフォーム有りのウェブサイト製作**をしてみました。

Amazon Web Service初めて使ってみました。
備忘録としてまとめます。

# やりたいこと洗い出し

* 静的なWebサイトホスティング
* お問い合わせ機能
* 問い合わせの通知　⇨ 私 ＆ 担当者
* SSL化

# 使ったサービス
* Route53
* Cloudfront
* ACM (AWS Certificate Manager)
* s3 (Simple Strage Service)
* Cognito
* Lambda
* SES (Simple Email Service)

それぞれのサービスの説明は、
こちらの記事が簡潔で分かりやすいです！
[「AWS is 何」を3行でまとめてみるよ](https://qiita.com/kohashi/items/1bb952313fb695f12577)

# 構成図
![aws_Diagram_.png](https://qiita-image-store.s3.amazonaws.com/0/179225/956a50c4-ea2b-2f48-ae2c-768afcb66290.png)


# 進め方
正直、初めてAWSを触るということもあり、
どこから手をつければ良いのか分かりませんでした..
なんとなく機能を分割して手をつけていきました。

* 0. 静的サイト制作
* 1. s3からs3にput、Cognito認証
* 2. Lambda、SES
* 3. Route 53
* 4. CloudFront,ACMの設定



こちらの記事、大変参考にさせて頂きました。
初心者にも分かりやすく、助かりました。

* [問い合わせフォームもサーバレスでDevOps!　(Github,CircleCI,AWS lambda/cognito/ses)　後編](https://qiita.com/toguma/items/a30dc43f6bfad7088bcd)

# 詳細
メモレベルですが、やったことを残しておきます。

## ①　s3 / Cognito
![aws_Diagram (3) (2).png](https://qiita-image-store.s3.amazonaws.com/0/179225/8782f7c7-b856-426a-2362-60ccde8c2997.png)

上記サイトのjsを参照し、s3からs3にputできるようにしました。

<h5>やったこと</h5>

* s3 バケット作成、html,css,img,js配置
* Cognito IAM独自のポリシーを作成を作成し、アタッチ。Acctionでputを追加し、s3バケット名を指定するだけで大丈夫です。
* ACLのデフォルトは"public-read"なので、明示的に"authenticated-read"とかに設定する必要があります。
* CORS設定で、alloworiginを設定する必要があったのですが、Route53の設定をまだしてなかったので、後回しにしました。

## ②　SES / Lambda
![aws_Diagram (＿3).png](https://qiita-image-store.s3.amazonaws.com/0/179225/806233d2-956e-b68a-fdc2-24d4762f040b.png)

<b>まず、SESのメール認証を行います。</b>

* SES ⇨　Email Addresses ⇨　Verify a New Email Address
自分のメールアドレスを入力し、申請するとメールが届くのでリンクを押せば完了です。

* ①でs3からs3にput出来るようになったので、そのイベントをトリガーにLambdaの設定を行います。
[こちらのサイト](https://qiita.com/toguma/items/a30dc43f6bfad7088bcd)のjsをほぼそのまま使わせて頂きました。

* IAMロールは、AmazonSESFullAccessを付与します。

## ③　Route53
お名前.comで既にドメイン購入済みでした。
AWSで発行したNSレコードを、お名前.comの方に追加する必要がありました。手順をこちらにまとめたので参考にして頂ければ幸いです。
[【Route 53】【お名前.com】【Amazon S3】Webサイト作成](https://qiita.com/hiroyu_n/items/992e2e0784cd222bd874)
## ④　CloudFront / ACM

大変参考にさせて頂きました。

* [S3の特定バケットへのアクセスを特定のCloudFrontからのみ許可する。]
(https://qiita.com/kooohei/items/2779f2755fb75ec3cc93)
* [Route53でドメイン買ってACMでSSL証明書発行してCloudFrontでGithub Pageと買ったドメインと紐付けた](https://qiita.com/yamanoku/items/c4f9c28d79f981afc40f)

### ACM

* 2017年10月より、DNS認証が追加され、設定が簡単になりました。またワイルドカード証明書も無料で発行できるので、CloudFront使う際は使っておきたいですね。
* 適応されたらCloudFront側で、http to https設定を行います。

* 設定完了後、s3のCORS設定に、下記を追加します。
```<alloworigin>https://www.ドメイン.com</alloworigin>```


# まとめ　/　反省点
設定項目が多すぎて、何をどこまで設定するべきなのか難しい。使った分だけ課金されてしまうこともあり、ちゃんと把握しておきたい。
[AWS] S3バケットポリシーで、特定のIAMロールだけがバケットにアクセス出来るようにする。


# 更新履歴
  * 2018/06/19
  `Principal` ではなく `Condition` で指定する方法を追記。  
  そちらの方法であればセッション名を特定できなくても実現できます。

# やりたいこと
S3バケットポリシーで、特定のIAMロールだけがバケットにアクセス出来るようにする。
言い換えれば、特定IAMロール以外のアクセスはDenyする。

「IAMポリシーで制限すれば？」という考え方もあると思いますが、IAM（ユーザーやグループやロール）には `S3FullAccess` `S3ReadOnly` などの大雑把な権限を付与しがちですし、制限したいS3バケットが新たに作られるたびに全てのポリシーを見直さないといけなくなります。バケット側で制御するほうが確実です。

# 結論から
２通り方法がありますが、`Principal(NotPrincipal)` のほうは制限事項があります。
特段の理由がない限りは、`Condition` を使用する方法でよいのではないでしょうか。

# S3バケットポリシー設定前に注意事項
今回やりたいことに限った話ではなく、一般的な話として。
バケットポリシーは、バケットポリシーを設定する権限も制限します。
`Deny` を設定するときに書き方を誤ってしまうと「自分で修正できない」「root以外誰も触れない」という状況に陥ることもあります。
慎重に、よく確認して実施しましょう。


# 設定方法
IAMロールを指定する方法として、 `Principal(NotPrincipal)` を使用する方法と `Condition` を使用する方法の2通りあります。

## NotPrincipal でIAMロールを指定する方法

### 制限事項
* セッションARNが必要であるため、セッション名を特定できない場合にはこの方法は利用できません。
* 同じ理由で、セッション名の追加更新が多いケースでもそのたびにバケットポリシーの変更が必要になるため、不便です。

### S3バケットポリシー例
```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Deny",
			"NotPrincipal": {
				"AWS": [
					"arn:aws:iam::<アカウントID>:role/<ロール名>",
					"arn:aws:sts::<アカウントID>:assumed-role/<ロール名>/<セッション名>"
				]
			},
			"Action": "s3:Put*",
			"Resource": [
				"arn:aws:s3:::<バケット名>",
				"arn:aws:s3:::<バケット名>/*"
			]
		}
	]
}
```

* `<xxx>` で括ったアカウントIDなどは、それぞれの環境に合わせて設定してください。
* この例では禁止（Deny）するアクションは `"put*"` に限定しています。  
そのままコピペ＆加工して設定にミスがあったときに誰も修正できなくなると困るため。   
対象者によるバケットポリシー更新（上書き保存）はできませんが、削除ならできます。

### 説明
* 特定IAMロール以外（`"NotPrincipal"`）のアクセスはDeny（`"Effect": "Deny"`）します。
* `NotPrincipal` には、以下２つを両方を書く必要があります。  
  どちらか一方だけではNGです。
	* 使用するロールARN ... `"arn:aws:iam::<アカウントID>:role/<ロール名>"`
	* 使用しているセッションARN ... `"arn:aws:sts::<アカウントID>:assumed-role/<ロール名>/<セッション名>"`
* バケットポリシーの `Principal` `NotPrincipal` にワイルドカード `*` は使用できません。  
  設定しようとすると `Invalid principal in policy` エラーになります。  
  なのでセッション名まで指定可能なIAMロールの使い方でないと、今回やりたい制御はできません。
* ちなみに マネジメントコンソールでIAMユーザーがSwitchRoleした場合のセッションARNは下記の通り。  
  `"arn:aws:sts::<アカウントID>:assumed-role/<ロール名>/<ユーザー名>"`  
  元のユーザー名がセッション名になります。

## Condition でIAMロールを指定する方法

### S3バケットポリシー例
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:Put*",
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "<IAMロールID>:*"
                }
            }
        }
    ]
}
```
* `<xxx>` で括ったバケット名などの情報は、それぞれの環境に合わせて設定してください。
* この例では禁止（Deny）するアクションは `"put*"` に限定しています。  
そのままコピペ＆加工して設定にミスがあったときに誰も修正できなくなると困るため。  
対象者によるバケットポリシー更新（上書き保存）はできませんが、削除ならできます。

### 説明
* `Principal` ではなく `Condition` でIAMロールを指定します。  
`StringNotLike` で比較することで「それ以外」を対象として、アクセスを Deny（`"Effect": "Deny"`）します。
* `Condition.StringNotLike` ではワイルドカード `*` を使用できます。
セッション名を限定する必要がありません。
* IAMロールID ≠ IAMロール名 です。  
IAMロールIDはマネジメントコンソールから確認することができません。awscli などの `get-role` で確認してください。  
`例)  $ aws iam get-role --role-name <ロール名>`
プロジェクト内のStoryboardに含まれる定義を一括で置換する

# 目的
アプリで統一的に使用しているカラーコードが変更になった際に、Storyboardに含まれている定義(カラーコード値)を一括置き換えしたい。

# 要件
プロジェクトフォルダ内の`.storyboard`の拡張子のファイル内に
`red="1" green="0.0" blue="0.12"`
という文字列が含まれていた場合、
`red="1" green="0.34" blue="0.56"`
に全て置き換える。

# 利用したコマンドTIPS
### ファイル中のcolorコードを置き換える
```sh
$ sed -i '' -e 's/red="1" green="0.0" blue="0.12"/red="1" green="0.34" blue="0.56"/g' Hoge.storyboard
```

### フォルダ内の該当拡張子のファイルを再帰的に検索
```sh
$ zsh
% ls **/*
```

### 該当のファイル群に対して処理を適応
```sh
$ for file in $(ls *.storyboard); do
$ echo $file
$ done
```


# 最終的に実行したコマンド
```sh
$ zsh
% for file in $(ls **/*.storyboard); do
for> sed -i '' -e 's/red="1" green="0.0" blue="0.12"/red="1" green="0.34" blue="0.56"/g' $file
for> done
```


# 結果
無事Storyboard内の該当定義を全て置き換える事が出来た。
もっとスマートにできるよ!などあればコメントで教えて頂ければと思います。
[PHP] foreach前のチェック、あるいはInvalid argument回避

## Invalid argument supplied for foreach()
うっかりするとやらかす`foreach`での引数エラー。
とある保守コードでハマりました。

```php:要素数チェック
if (count($arr) < 1) {
    return;
}
foreach ($arr as $val) {
    ...
}
```

これ、$arr が配列でない型（例えばBooleanとか）だったときにチェック抜けてしまうんですね。

## 配列でないオブジェクトをcount()すると…？
[ここ](http://php.net/manual/ja/function.count.php)に書いてあるとおりなのですが、

> もしパラメータが配列もしくは Countable インターフェイスを実装したオブジェクトではない場合、 1 が返されます。

というわけで、上のコードの場合、配列でない型が来てしまうとcountのチェックをスルーしてしまうと。

## is_array()が正当なのでは？

```php:型チェック
if (!is_array($arr)) {
    return;
}
foreach ($arr as $val) {
    ...
}
```

素直にこう書けば解決する話なんですけどね…。

## キャストする？
あるいはこんな方法もあるようです。

```php:配列にキャスト
foreach ((array)$arr as $val) {
    ...
}
```

確かにコード量は減るけど、個人的にはキャストはあまりスマートではないような気もしますが、どうなんでしょう…。
*(2018/01/18追記)* ⇒次項を参照

参考：
[PHPのforeach文でnullチェックなしでエラー回避](https://quartet-communications.com/info/topics/7094)

## *(2018/01/18追記)* Traversable インターフェイス
コメントで指摘いただきました。
foreachに渡せるのは[配列](http://jp2.php.net/manual/ja/language.types.array.php)の他、[Traversableインターフェイス](http://php.net/manual/ja/class.traversable.php)を実装したクラスもでした。

したがって、厳密には以下のようにチェックするのが妥当です。

```php:配列とTraversableチェック
if( !is_array( $arr ) && !$arr instanceof Traversable )
    return;
}
foreach ($arr as $val) {
    ...
}
```

参考：
コメント欄
[PHP の array と Traversable](http://y-uti.hatenablog.jp/entry/2014/06/17/195930)
[django]ManyToManyField(中間モデル)の要素をクエリセットでフィルタリングする方法

```python:models.py
class Person(models.Model):
    name = models.CharField(max_length=128)

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)
```

```python:views.py
class GroupListView(ListView):

   def get_queryset(self):
        qs = super(GroupListView, self).get_queryset()
        return qs.filter(
          members__isnull=False,
          membership__date_joined__year='2018',
          membership__date_joined__month='01',
          membership__date_joined__day='17').distinct()

```
compassを捨てて、gulp + sass + pug + auto-prefixerに移行しようとしてなかなかうまくいかなかった話

気がつくとcompassが古の技術になっていたので、gulp+sass+auto-prefixer+pugの環境を作った際のメモです。
結論としてはうまくいきました。

---

2018/09/14追記
**gulp3.9.1**でエラーが頻発するようになったので、**gulp4**に移行しました↓
[https://qiita.com/sam_sam/items/16c7b55d4819f7dd9372](https://qiita.com/sam_sam/items/16c7b55d4819f7dd9372)

---

環境: Mac + Sublimetext
細かいことはいいからgulpfile.jsだけ教えてくれって人向けです。

# gulp + sass
まずは
[絶対つまずかないGulp入門。インストールからSassのコンパイルまで](https://ics.media/entry/3290)
を参考に環境構築。
gulp + sassは成功しました。

が、自環境にはscssが大量にあるのでフォルダ内を全てコンパイルしてくれるように変更をしたい。

## gulp + sass + pug
[開発しやすい環境の作り方~Web系~](https://qiita.com/ferretdayo/items/47937cfb38babcf17a20)

こちらを参考に「gulpfile.js」を修正。
この時点でgulp + sass + pugの設定が完了。

### auto-prefixerを設定したい
制作しているサイトがかなり古いものまでサポートしなければいけないため、
auto-prefixerを使おうにもどうにもうまくいかない。

正確には「style.scss」のベンダープリフィックスはつけられるのに、
他のファイルになると全く何も起きないと行った状態。
display: flexはdisplay: flexのまま。

そこで色々試した結果下記のサイトを参考に設定をしました。
[gulp-autoprefixerを使ってCSSのベンダープレフィックス付与を自動化する](http://blog.shibayu36.org/entry/2016/07/20/102641)

結果出来上がった「gulpfile.js」がこちら

```ruby:gulpfile.js
var gulp = require("gulp");
var sass = require("gulp-sass");
var plumber = require("gulp-plumber");
var browserSync = require("browser-sync");
var notify = require("gulp-notify");
var pug = require("gulp-pug");
var autoprefixer = require('gulp-autoprefixer');

gulp.task('default', ['sass', 'browser-sync', 'pug', 'watch' , 'autoprefixer']);

//sassとpugの監視をして変換処理させる
gulp.task('watch', () => {
    gulp.watch(['./scss/**'], () => {
        gulp.start(['sass']);
    });
    gulp.watch(['./pug/**'], () => {
        gulp.start(['pug']);
    });
    gulp.watch(['./css/*.css'], () => {
        gulp.start(['autoprefixer']);
    });
});

//ブラウザ表示
gulp.task('browser-sync', () => {
    browserSync({
        server: {
            baseDir: "./"   //サーバとなるrootディレクトリ
        }
    });
    //ファイルの監視
    //以下のファイルが変わったらリロードする
    gulp.watch("./js/**/*.js",     ['reload']);
    gulp.watch("./*.html",         ['reload']);
});

//sassをcssに変換
gulp.task("sass", () => {
    gulp.src("./scss/**/*scss")
        .pipe(plumber({
            errorHandler: notify.onError("Error: <%= error.message %>")
        }))
        .pipe(sass({outputStyle: 'expanded'}))
        .pipe(gulp.dest("./css"))
        //reloadせずにinjectする
        .pipe(browserSync.stream())
});


gulp.task('autoprefixer', function () {
    return gulp.src(['./css/*.css'])
        .pipe(autoprefixer({
            browsers: ["last 3 versions", "ie >= 9", "Android >= 4","ios_saf >= 8"],
            cascade: false
        }))
        .pipe(gulp.dest('./css'));
});

//pugをhtmlに変換
gulp.task("pug", () => {
    var option = {
        pretty: true
    }
    gulp.src("./pug/**/*.pug")
        .pipe(plumber({
            errorHandler: notify.onError("Error: <%= error.message %>")
        }))
        .pipe(pug(option))
        .pipe(gulp.dest("./"))
});

//ブラウザリロード処理
gulp.task('reload', () => {
    browserSync.reload();
});
```

これでターミナルに　gulp watch　することでリアルタイムで反映してくれます。
PowerShell Core 6.0をCentOS7に入れた

リリースされた記念にさっそく試してみました。

### 環境を作る

何でもよいですが、vagrantでまっさらな状態から入れました。
[vagrant CentOS7]で検索したらいくらでも出るのでその通りに。

### インストール

yumで入れます。
[こちら](http://blog.shibata.tech/entry/2017/02/06/202025)の手順のとおりです。

タイムアウトしないようにちょっと長めにしておきます。

```bash
[vagrant@localhost ~]$ sudo echo "minrate=1
timeout=500" >> /etc/yum.conf 
[vagrant@localhost ~]$ curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo
[vagrant@localhost ~]$ sudo yum install -y powershell
```

インストールが終われば起動できます。

```
[vagrant@localhost ~]$ pwsh
PowerShell v6.0.0
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/pscore6-docs
Type 'help' to get help.
PS /home/vagrant> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      6.0.0
PSEdition                      Core
GitCommitId                    v6.0.0
OS                             Linux 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
```

### エイリアスの追加

私は

```bash
alias ll='ls -l --color=auto'
```

のエイリアスをいつも使ってるので、これが使えないのは困ります。

powershellの`Set-Alias`は引数付きエイリアスにはできないので、関数で作ります。
bashの`.bash_profile`に相当するファイルは`$PROFILE`変数に入っているのでそこに書きます。

```powershell
#ディレクトリを再帰してファイル作成するのも簡単
New-Item $PROFILE -Force

#これでもOK
ni $PROFILE -Force
```

lsやgrepも色付きで表示されるように関数を作っておきます。

```powershell:$PROFILE
function ls() { /bin/ls --color=auto $args }
function ll() { /bin/ls -l --color=auto $args }
function grep() { /usr/bin/grep --color=auto $args }
function egrep() { /usr/bin/egrep --color=auto $args }
function fgrep() { /usr/bin/fgrep --color=auto $args }
```

これで文化的powerhsellライフが営めるようになりました。
gensimのword2vec/doc2vecで学習ロスを出力しつつ学習率alphaの値を変えて学習する

## 概要
gensimを使ったword2vec/doc2vecの実行は、下記のようにモデルを作成して学習させるだけで簡潔に実現できます。

```python
# https://rare-technologies.com/word2vec-tutorial/
model = gensim.models.Word2Vec(iter=1)  # an empty model, no training yet
model.build_vocab(some_sentences)  # can be a non-repeatable, 1-pass generator
model.train(other_sentences) 
```

ただ、細かな学習の管理等はgensimにおまかせになってしまうので、なるべく丁寧なチューニングができるように、この記事では

- 学習時に学習ロスを出力する
- 学習率`alpha`の値を変えながら学習させる

の2つの方法を解説します。

ちなみにデフォルトでは学習率`alpha`の値は`min_alpha`に向かって線形に落ちていくので、通常ならば今回のような方法を取らなくても`alpha`および`min_alpha`を指定すれば問題ありません。

> alpha is the initial learning rate (will linearly drop to min_alpha as training progresses).
> https://radimrehurek.com/gensim/models/word2vec.html


## 方法
### 学習時のロスを出力する
学習のロスを出力するためには、モデルに`compute_loss=True`を指定の上で`get_latest_training_loss()`で取得できます。

```python
model = word2vec.Word2Vec(min_count=1, compute_loss=True)
model.build_vocab(texts)
model.train(texts, total_examples=model.corpus_count, epochs=model.iter)

model.get_latest_training_loss()
```

### alphaの値を変えながら学習させる
学習を繰り返す中で、学習率`alpha`を都度指定するようにします。なお、`min_alpha`が設定されていると`alpha`の値が小さくなっていくので、`alpha`と同じ値を入れて変化しないようにしています。

```python
alpha = 0.025
alpha_delta = 0.001
passes = 20

loss_val_list = []
for epoch in range(passes):
    model.alpha, model.min_alpha = alpha, alpha
    model.train(texts, total_examples=model.corpus_count, epochs=model.iter)

    alpha -= alpha_delta
    loss_val_list.append(model.get_latest_training_loss())
```

また、上記で説明した学習ロスを出力してリストに格納しておくと、以下のように学習ロスを可視化することができます。

![w2v_loss.png](https://qiita-image-store.s3.amazonaws.com/0/4452/48da3a97-fefe-c35f-4a24-9805eb804aca.png)

## 参考

- [Loss through each iteration in skip gram · Issue \#999 · RaRe\-Technologies/gensim](https://github.com/RaRe-Technologies/gensim/issues/999)
- [\[WIP\] Computes training loss for Word2Vec model \(fixes issue \#999\) by chinmayapancholi13 · Pull Request \#1201 · RaRe\-Technologies/gensim](https://github.com/RaRe-Technologies/gensim/pull/1201)
- [dietmar/gensim\_word2vec\_loss](https://github.com/dietmar/gensim_word2vec_loss)
androidStudio(3.0)でビルドしたapkがインストールできなくなる

androidStudio(3.0)でビルドしたデバッグapkが、adb installで次のようなエラーが出てインストールできなくなった。
`Failure [INSTALL_FAILED_TEST_ONLY]`

どうやら内部で`android:testOnly="true"`でビルドしているからのようで、これだと野良アプリインストールできなくて困る。
このケースなら、次のように`gradle.properties`に1行加えると対応できる。
`android.injected.testOnly=false`
Python 3：3次元グラフの書き方（matplotlib, pyplot, mplot3d, MPL）

# 3次元のグラフの書き方

###### ニューラルネットワークの学習で現れる，偏微分（勾配）の理解のため3次元グラフを描いてみる．（参考：数値微分）

######Pythonで，NumPyとmatplotlibを使って3次元グラフを描く

### 準備
- 3次元なので`mpl_toolkits.mplot3d`などをインポート 

```python:ex1-1.py
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
```

- 引数の2乗和を計算する関数を例として考える

```python:ex1-2.py
def func1(x, y):
    return x**2 + y**2
```

- 描写データの作成
    - 3次元で描写するには2次元メッシュが必要
    - 2次元配列をarangeを用いて作る
    - x, y をそれぞれ1次元領域で分割する

```python:ex1-3.py
x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-3.0, 3.0, 0.1)
```

- 2次元メッシュはmeshgridでつくる
    - Xの行にxの行列を，Yは列にyの配列を入れたものになっている

```python:ex1-3.py
X, Y = np.meshgrid(x, y)
Z = func1(X, Y)
```

- グラフの作成
    - figureで2次元の図を生成する
    - その後，Axes3D関数で3次元にする

```python:ex1-4.py
fig = plt.figure()
ax = Axes3D(fig)
```

- 軸ラベルの設定

```python:ex1-5.py
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("f(x, y)")
```

-グラフ描写

```python:ex1-6.py
ax.plot_wireframe(X, Y, Z)
plt.show()
```
### 以上をまとめて実装すれば，以下のような3次元のグラフが描画されます．

---
![ex1.png](https://qiita-image-store.s3.amazonaws.com/0/231418/9d394911-8082-d455-a1b2-3142ca6cfca4.png)

---
###### plotのプロパティとして，color（線の色），linestyle（線の種類），マーカーの種類などが変更できる．
---
###### もっと簡単に描けるコードなどありましたらご教授ください．
###### 詳細は後ほど追加する予定です．
---
TypeScriptでArray継承したときconcatを叩いたら子クラスが返って欲しい

TypeScriptで`Array<T>`を継承してある型専用のクラスを作ったとする。

そのクラスはnewすれば、そのクラスに生えているメソッドを使うことができる。

```ts
class StringArray extends Array<string> {
  isStringArray(): true {
    return true
  }
}

console.log(new StringArray('1', '2')) // StringArray [ '1', '2' ]

// StringArrayクラスのメソッドが使える
console.log(new StringArray('1', '2').isStringArray()) // true
```

しかし、親クラスの`concat`メソッドを叩くと`StringArray`ではなく、親クラスの`Array<string>`が返ってきてしまう。

```
 error TS2339: Property 'isStringArray' does not exist on type 'string[]'.

41 console.log(strings.concat(strings).isStringArray())
                                       ~~~~~~~~~~~~~
```

これを回避するには`bind`を呼ぶ必要がある

```
console.log(strings.concat.bind(strings)(strings).isStringArray())
// true
```

毎回`bind`するのが手間であれば`concat`メソッドをオーバーライドしておいてもよい

```ts
class StringArray extends Array<string> {
  isStringArray(): true {
    return true
  }

  concat(that: StringArray): StringArray {
    return super.concat.bind(this)(that)
  }
}

const strings = new StringArray('1', '2')
console.log(strings)
console.log(strings.concat(strings))
```

さらに基底クラスを作っておくのもあり

```ts
abstract class BaseArray<A> extends Array<A> {
  concat<T extends BaseArray<A>>(that: T): T {
    return super.concat.bind(this)(that)
  }
}

class StringArray extends BaseArray<string> {
  isStringArray(): true {
    return true
  }
}
```
【Gitea】コマンドからユーザを作成する方法

忘れそうなのでメモ

# Gitea v1.3.2

Windows環境

## 一般ユーザ

```bat:cmd
gitea admin create-user --name hoge --password fuga --email piyo@example.com
```

## 管理ユーザ

```bat:cmd
gitea admin create-user --name hoge --password fuga --email piyo@example.com --admin
```
Swift4を使ったCoreDataマルチスレッド非同期対応

iOS開発でCoreDataのマルチスレッド対応していました。
CoreDataを使って

* 保存されていない
* 保存より先にreturn処理が走る

と問題が発生し、また下記の使い方を見直す。

* privateQueueConcurrencyType
* mainQueueConcurrencyType

この際に参考した本は、
https://smtebooks.com/book/5567/core-data-tutorials-ios-10-swift-3rd-edition-pdf
です！


## 1. 親子関係を作る
```
class DataController: NSObject   {
//親Context作成は下記のようにする
static var parentContext: NSManagedObjectContext = {
        return NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) // privateの設定
    }()

//子Context作成は下記のようにする
func subManagedObjectContextMake() -> NSManagedObjectContext {
        let subContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)//mainの設定
        subContext.parent = DataController.managedObjectContext//親設定
        return subContext
    }

//その他必要なもの
}
```



## 2.変更処理例
#### 追加/変更のみ
1. let context = DataController.subManagedObjectContextMake()で、subContextを作る
2. context内容を変更する
3. subContextを更新する
4. parentContextを更新する

```
// 3.subContextを更新対応
例)
context.perform {
     do {
         try context.save()
         DataController.saveParentContext()//parentContext保存処理
    } catch {
         fatalError("Failure to save context: \(error)")
    }
}

```

```
// 4.subContextを更新対応
例)
func saveParentContext() {
     DataController.parentContext.perform {
          do {
              try DataController.parentContext.save()
         } catch {
              fatalError("Failure to save context: \(error)")
         }
     }
}
```

これにより安定してデータ更新が実現できました。


## 表示対応
parentContextでしないと、最新の情報が取得できないため
1. let context = DataController.parentContextでparentContextをセットする
2. context内容から情報を取得する


## 削除対応
parentContextでしないと、削除が反省されないため
1. let context = DataController.parentContextでparentContextをセットする
2. context内容からレコードをdeleteする
3. parentContextを保存する


### まとめ
ここまで何度もリリースしながら様子を見てきました。
最後なんとか止まり、うまく動くようになってよかったです。
本の力は、偉大だなと感じた今日この頃でした。
何か間違え等があったら、教えてください。
ご一読していただき、ありがとうございました。
ドキュメント作成ツール > MkDocs


ナイスで今風なドキュメントを自動生成してくれるMkDocs

[MkDocs](http://www.mkdocs.org/)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2ebb020f-354b-4f7f-2d33-52de6c0c0cce.png)

## 前提
必須：python2.x or 3.x、pip
環境：pythonが動作する環境（Win、Mac、or ...）

<font color=red>※以下コマンドプロンプト(Win)or ターミナル（Mac）で進めます。</font>

## インストール

以下に添って進みます。

[MkDocs - installation](http://www.mkdocs.org/#installation)

python環境で進みます。Windowsの場合にはPythonプロンプトから実行してください。
pythonが入っていない方は上記の説明欄か別のpythonインストール記事を御覧ください。
 
 ### mkdocsインストール
 
```
pip install mkdocs
```

インストールが終わったら以下のコマンドで確認します。

```
mkdocs --version
```
バージョンが表示されればOKです。


## mkdocs 事始め

試しに１作成します。
ドキュメントを配置するSite毎に1つのプロジェクトを作成します。
インストールガイドに倣ってmy-projectを作成します。
フォルダを作成したいカレントフォルダに移動して以下のコマンドを打ちます。

```
mkdocs new my-project
```

これでmy-projectフォルダが作成され、その下にmkdocs.ymlファイルとdocsフォルダが作成されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/57eaaf6f-4b80-5243-e6ea-647f097bad68.png)

これからmkdocs.ymlに記載された設定に基づきドキュメントを作成していきますので、カレントフォルダをmy-projectに移動します。

```
cd my-project
```

## サイトの確認

以下コマンドを打つことで現状（初期状態）をブラウザで確認できます。

```
mkdocs serve
```

以下のように結果が表示されればOK

```
INFO    -  Building documentation...
INFO    -  Cleaning site directory
[I 160402 15:50:43 server:271] Serving on http://127.0.0.1:8000
[I 160402 15:50:43 handlers:58] Start watching changes
[I 160402 15:50:43 handlers:60] Start detecting changes
```

### アクセスしてみましょう
http://127.0.0.1:8000/　にアクセスしてみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/a5a456b8-cbf7-fb11-4e6b-37140b1f985e.png)

## 自動再読み込み
mkdocs serveは自動再読み込みもサポートしており、設定ファイル、ドキュメントディレクトリ、またはテーマディレクトリ内の何かが変更されたときに自動で再構築されます。

試しにmkdocs.ymlを以下のように変更して保存します。

`site_name: MkLorum`

サイト名がMkLorumに変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/31600b55-d0f2-575f-9e7f-4f521c6ca128.png)


## ページの追加
docsフォルダの下に新しいmdファイルをおいてもよいですが、
インストールガイドに従ってabout.mdファイルをcurl経由で追加します。
curlが未インストールの場合には[Windows > curlを使う](https://qiita.com/sugasaki/items/ba9737d13db33d2cd71f)にもインストール記事を書いてます。

```
curl 'https://jaspervdj.be/lorem-markdownum/markdown.txt' > docs/about.md

Winの場合は以下
curl https://jaspervdj.be/lorem-markdownum/markdown.txt > docs/about.md
```

mkdocs.ymlを再保存すると自動でビルドが走りブラウザが更新されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2d2504a7-8b6a-34f8-9394-73686d96d96e.png)

doc下にファイルを追加するだけでもヘッダに反映されるようですが、
以下のようにファイルの順番を変更することもできます。

```
site_name: MkLorum
pages:
    - About: about.md
    - Home: index.md
```

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/27f138d1-ed2a-a461-c1d4-cb15b55e05d5.png)

## テーマの変更

mkdocs.ymlに以下の設定を追加する事で簡単にテーマを変更できます。

```
theme: readthedocs
```

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/c372715a-aa38-0f3d-67a1-540a41ba798d.png)

## Favicon Iconの変更
割愛。公式ページを参照ください。

## ビルド
内容に満足できたら（しなくてもいいですが）、ビルドしてHTMLファイルを作成します。

```
mkdocs build
```

これで、siteフォルダが作成されます。フォルダ配下は以下のような構成になっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2d387097-0dee-3d26-a9c9-fe9c76625a42.png)

siteフォルダをサーバー等に配置して公開しましょう。


ファイル構成が変わったり、ファイルの追加・削除を頻繁にした場合にはゴミファイルが残る場合があるのでそのような場合にはクリーンビルドします。

```
mkdocs build --clean
```


今回は以上です。
How to fix ESXi error - Module 'MonitorLoop' power on failed

### Symptom
 When Powering ON a VM on ESXi, the error occurs

![2018-01-17_162953.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/5edf337b-59d8-9560-a92e-6acb3d87a130.jpeg)


```
Power On VM
Key                haTask-2-vim.VirtualMachine.powerOn-164454246
Description        Power On this virtual machine
Virtual machine
State              Failed - Module 'MonitorLoop' power on failed.
Errors
    Module 'MonitorLoop' power on failed.
    File system specific implementation of Lookup[file] failed
    File system specific implementation of LookupAndOpen[file] failed
    Failed to extend swap file from 0 KB to 67108864 KB.
    Current swap file size is 0 KB.
    Failed to extend the virtual machine swap file
    Could not power on virtual machine: No space left on device.
    Failed to power on VM.
    Failed to start the virtual machine.
```

### How to fix

due to disk space shortage
 - either decrease VM RAM or add vmfs
コンストラクタが同じクラスなら何でもnewできる関数の作り方

コンストラクタのシグネチャが同じクラスなら何でも`new`できる関数を作るにはジェネリクスを使う。


大まかな流れ:

1. コンストラクタのシグネチャを定義した型を宣言する
2. その型を関数の引数にする

サンプルコード:

```ts
// 引数がゼロのコンストラクタを持つクラスの型を定義する
type NoParameterConstructor<A> = new () => A

// 同じコンストラクタを持つクラスならnewできる関数
function create<A>(a: NoParameterConstructor<A>): A {
  return new a()
}

// NoParameterConstructorを満たすクラス(つまり同じコンストラクタを持つ)
class ClassA {}
class ClassB {}

console.log(create(ClassA), create(ClassB))
```

```text:実行結果
ClassA {} ClassB {}
```

ちなみに、次のどちらかの方法でインラインで宣言しても良い

```ts
function create<A>(a: new () => A): A {
  return new a()
}

function create<A>(a: { new (): A }): A {
  return new a()
}
```
Android Studioでエディタでファイルを表示したらProject Viewでも表示する方法

Android Studioで開発していて、大量のタブでたくさんのファイルを開いていて
「このファイル…プロジェクト上のどこにあったっけ…えぇと…」と探すことが多いボクです。

そんなボクに似た皆さんにステキな機能のご紹介です！

# やりたいこと
エディタ画面でソースファイルを開くと（タブから選択すると）、ProjectのViewで該当ファイルが存在する場所を自動的に開いてほしい


# 解決策
ProjectのViewを開いて、歯車を押して「Autoscroll from source」のチェックをONにするだけです！

<img width="307" alt="スクリーンショット 2018-01-17 15.29.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/84307/ea9d4251-9c37-2445-b9b4-61e14ae9045c.png">

あら不思議！ソースファイルを開いたらProjectのViewでもディレクトリが展開されました！

以上です！
PubNubのMQTTサポートをmosquittoで使ってみる

## PubNubとは

Publish/Subscribeなメッセージブローカーをフルマネージドで提供するサービスです
単純にメッセージを仲介するだけでなく Function と呼ばれる機能でデータに介在することも可能な仕組みもあります

詳しいことは [TitaniumとPubNubでリアルタイムサービス - Qiita](https://qiita.com/yagi_/items/5283249036feaf655b16) や [アプリにリアルタイムメッセージング機能を簡単に導入できるPubNubが$4.5Mを調達](http://jp.techcrunch.com/2012/03/22/20120321as-developers-seek-more-interactivity-pubnub-raises-4-5m-for-its-in-app-messaging-solution/) を見てください

### MQTT サポート

PubNubは[2014年の段階でMQTT をサポート](https://www.pubnub.com/blog/mqtt-now-supported-by-pubnub/)していたようですが、[2018年1月にIoTなユースケースで使えるように改善](https://www.pubnub.com/blog/new-improved-pubnub-mqtt-support-and-iot-capabilities/)されています

それに伴いMQTTブローカーのエンドポイントも `mqtt.pndsn.com` に変更されてます
(昔は `mqtt.pubnub.com` だったようです → **このアドレスは既に無効ですのでご注意**を)

## mosquitto(MQTT)での確認方法

あらかじめアカウントを作ってから *Keyset* を作ってください
サンプル的にはこんな感じです

![pubnub.png](https://qiita-image-store.s3.amazonaws.com/0/22754/c700ff01-a957-fec2-ddc6-e0489a876aa4.png)

あとはこんな感じでコマンドラインを組み立てます

Subscribe;

```console
$ mosquitto_sub -h mqtt.pndsn.com \
-t 'YOUR_PUBLISH_KEY/YOUR_SUBSCRIBE_KEY/my_topic/foo/bar' \
-i 'YOUR_PUBLISH_KEY/YOUR_SUBSCRIBE_KEY/anyID-sub1'
```

Publish;

```console
$ mosquitto_pub -h mqtt.pndsn.com \
-t 'YOUR_PUBLISH_KEY/YOUR_SUBSCRIBE_KEY/my_topic/foo/bar' \
-i 'YOUR_PUBLISH_KEY/YOUR_SUBSCRIBE_KEY/anyID-pub1' \
-m '{"i":1}'
```

* YOUR\_PUBLISH\_KEY: Keyset の中の *PUBLIC KEY*
* YOUR\_SUBSCRIBE\_KEY: Keyset の中の *SUBSCRIBE KEY*
* `anyID-pub1` は適当に設定してください

## ちょっと困ってること

MQTTなsubscribeクライアントがusageにカウントされない希ガス

EoT
macでvimを使うと文字化けしてしまう

## macでvimを使うと文字化けしてしまう
文字化けを起こしてしまったので、自分用にメモ
同じ現象が起きている方は参考にどうぞ！

* ホームディレクトリに以下のファイルを作成する。
    * vim ~/.vimrc
* 以下の内容をファイルへ記述する。
    * set encoding=utf-8

### 以上
何かのタイミングで設定を変更してしまったよう。。。
初歩的な内容ですが。。。
あとは、お好きに出来ます！
cakephp2 チーム開発のためのマイグレーション

# cakephp2のマイグレーションの流れ

[1.マイグレーションファイルを新規に作成する](#マイグレーションファイルを新規に作成する)
[2.マイグレーションを実行する](#マイグレーションを実行する)
[3.schema.phpをコマンドで上書き更新する](#schemaphpをコマンドで上書き更新する) (←ここが必要)

##マイグレーションファイルを新規に作成する

$ bash app/Console/cake Migrations.migration generate

    $ bash app/Console/cake Migrations.migration generate
    Cake Migration Shell
    ---------------------------------------------------------------
    Do you want to compare the schema.php file to the database? (y/n)
    [y] > n
    Do you want to compare the database to the schema.php file? (y/n)
    [y] > n
    Do you want to preview the file before generation? (y/n)
    [y] > n
    Please enter the descriptive name of the migration to generate:
    >

    Migration name () is invalid. It must only contain alphanumeric characters and start with a letter.
    Please enter the descriptive name of the migration to generate:
    > test
    Generating Migration...

    Done.
    $

Config/Migratinon/1513308893_test.php

最後にファイル名を聞かれるのでいったんtestにしたが
大事なのは数字です。日付が自動で生成されます。

### ファイル名や中身を変える

適当に変更してください。

##マイグレーションを実行する

    $ bash app/Console/cake Migrations.migration run all

##schema.phpをコマンドで上書き更新する

    $ bash app/Console/cake schema generate -f

**→『o』を選択する**

    $ bash app/Console/cake schema generate -f

    Welcome to Mega Solar Power Monitoring System
    ---------------------------------------------------------------
    Cake Schema Shell
    ---------------------------------------------------------------
    Generating Schema...
    Schema file exists.
     [O]verwrite
     [S]napshot
     [Q]uit
    Would you like to do? (o/s/q)
    [s] > o
    Schema file: schema.php generated
    $

新規に作成したマイグレーションファイルと、
更新したschema.phpをコミットして終了です。

# Reference

参考
https://qiita.com/KNaito/items/de47d123405bea5a2efe
WindowsでUnity2017.3.0f1を使用すると起動に失敗する

Windows で Unity2017.3.0f1 を使用すると、
 Package Manager の不具合が原因で下記のようなダイアログが表示され、起動に失敗するケースがあるようです。

![Image 2018-01-17 16-12-24.png](https://qiita-image-store.s3.amazonaws.com/0/31480/e71c3d33-633f-1862-e67d-81899593d7f6.png)

対応方法は、 Unity 2017.3.0p1 以降のバージョンを使用することです。
https://unity3d.com/jp/unity/qa/patch-releases?version=2017.3

proxy に関する問題を直したところ別のところに問題がでちゃったぜ、というのが原因のようでした。
https://issuetracker.unity3d.com/issues/unity-package-manager-freezes-on-starting-server-when-proxy-is-enabled
centos7 mysql 外部接続を許可しよう

# IPアドレスでphpmyadminに飛べるように

まずは外部から接続したい場合は、IPアドレスでphpmyadminに行けると便利だよね。
ということで、nginx、phpmyadminが入っていることを前提にnginxに以下を追記。


vim /etc/nginx/conf.d/default.conf

```

server {
    listen 80;
    index  index.html index.php;

    location /phpmyadmin {

#IPアドレスで制限 allow のipのみログインできる
#        allow 111.222.333.444;
#        deny all;

        alias /usr/share/phpMyAdmin/;
        try_files $uri $uri/ /index.php;

        location ~ ^/phpmyadmin/(.+\.php)$ {
            alias /usr/share/phpMyAdmin;
            fastcgi_pass   unix:/var/run/php-fpm.sock;
            fastcgi_param SCRIPT_FILENAME /usr/share/phpMyAdmin/$1;
            include fastcgi_params;
            fastcgi_intercept_errors on;
        }
     }
}


```

再起動
```
systemctl restart nginx
```

### OK
111.22.333.44/phpmyadmin/
にアクセスするとPHPMYADMINに飛びますね。



# firewallにmysqlを設定
centos7ではmysqlの外部接続をfirewallがブロックする。
ということで、firewallにmysqlを使えるように設定する。

ssh

```

# firewallの設定

#状態チェック
firewall-cmd --list-services --zone=public  --permanent

#結果
dhcpv6-client ftp http https ssh

#mysqlが無いので、追加
firewall-cmd --add-service=mysql --zone=public --permanent

#もう一度チェック
firewall-cmd --list-services --zone=public  --permanent

dhcpv6-client ftp http https mysql ssh

#mysqlが表示されましたね。
#リロードして有効に。
firewall-cmd --reload

```


### OK
これで外部接続できるようになったね。


# 外部サーバーから接続できるように

MYSQL_IP 999.888.777.66
接続元サイト 111.222.333.44

MYSQL_IP 999.888.777.66　にログイン

```

#mysqlにログイン
mysql -u root -p

#ユーザー追加 your にユーザー名 yourpass にあなたのパス
grant all privileges on *.* to your@"111.222.333.44" identified by 'yourpass';

```

## チェック

接続元サイト 111.222.333.44　にログイン

```
mysql -h 999.888.777.66 -u your -p

```


これでつながればOK!
adbコマンド集

## TCP modeで起動

```sh
# TCPモードで起動(ポート番号は5555)
$ adb tcpip 5555
restarting in TCP mode port: 5555

# 現在のポート番号を取得
$ adb shell getprop service.adb.tcp.port
5555
```

## IPアドレスを取得

```sh
$ adb shell ip addr show wlan0 | grep 'inet ' | cut -d ' ' -f 6 | cut -d / -f1
192.168.1.99
```

## 現在表示されているアクティビティを取得

```sh
$ adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
  mCurrentFocus=Window{9f14bce u0 com.android.settings}
  mFocusedApp=AppWindowToken{1bd74d7 token=Token{7d71c56 ActivityRecord{97ec671 u0 com.huawei.android.launcher/.unihome.UniHomeLauncher t251}}}
```
a == 1 && a == 2 && a == 3がtrueになるRubyスクリプト


stack overflowで話題になっていたんで、Rubyでも実装してみた。

```ruby
a = Class.new { define_method(:==) {|_| true } }.new

puts a == 1 && a == 2 && a == 3
#=> true
```

元ネタ

[Can (a ==1 && a== 2 && a==3) ever evaluate to true?
](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)
ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化する【概要編】(1/4)

[前回の記事](https://qiita.com/tnagao3000/private/8ccebfb955f42d8138a3)ではラズパイで取得したセンサー値を[Ambient](https://ambidata.io/ch/channel.html?id=2813)に送ってグラフ化しました。
今回はAmbientの代わりにGCPに送り、BigQueryに蓄積してSpreadSheetsでグラフ化してみます。

## どうやってデータを持ち回る？
GCPへの入り口で適当なのは・・と探してみると、[Cloud Iot Core](https://cloud.google.com/iot-core/)といういい感じの
サービスがあり、そこに記載されていた何やら複雑な連携図を参考に作成してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/354991e4-211c-9bcf-fc4f-13c7cc9aa797.png)

公式の連携図ではCloudDataFlowを使ってBigQueryにInsertすることになっていますが、
これはGCEインスタンスを使い高コスト(?)なので、代わりにCloudFuntionsにします。

ということで、今回のデータフローは次の通りです。

- **センサー値蓄積まで**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/87752411-1a75-f975-c9b1-ec05c37e9d37.png)

- **グラフ描画まで**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/ec379ab9-c13f-047a-f581-fc9aab2be5e0.png)

## 使用したサービスについて
今回使用したサービスの概要は次の通りです。

|サービス|サービスの主な機能|今回行う処理|
|:--|:--|:--|
|[IoTCore](https://cloud.google.com/iot-core/)|IoTデバイスとセキュアな通信を行いデータを収集します。<br>収集データはPub/Subで配信します。|ラズパイからセンサー値を受け取り、Pub/Subに流します。|
|[Pub/Sub](https://cloud.google.com/pubsub/)|送信者と受信者を多対多で紐づけるメッセージング<br>サービスです。|IoTCoreから受け取ったデータをCloudFunctionsに転送します。|
|[Cloud<br>Functions](https://cloud.google.com/functions/)|サーバーレスなNode.js実行環境です。|センサー値をBigQueryのテーブルにInsertします。|
|[BigQuery](https://cloud.google.com/bigquery/)|大規模なデータ分析に対応できるデータウェアハウスです。|センサー値をテーブルに蓄積します。|


## グラフ化した結果

直近１２時間分のセンサー値を折れ線グラフにしました。
次のようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/26353c71-1ff1-bcad-ad86-9b490037da12.png)

おいらの鼻息でco2濃度が上がる。

## 作り方

次の記事にまとめましたので参照してください。

- [ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化する【Pub/Sub準備編】(2/4)](https://qiita.com/tnagao3000/private/9d1aeedf694168677e8e)
- [ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化する【BigQuery蓄積編】(3/4)](https://qiita.com/tnagao3000/private/096efd340e921ca48c19)
- [ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化する【グラフ化編】(4/4)](https://qiita.com/tnagao3000/private/cf3a6d6ea366e81678f7)

以上です。