OmniAICreator/Qiita-1.07M huggingface dataset:
Google App Maker ー Roleでモデルと画面を制御する

App Maker には`Role`という機能がある。
Role をうまく使ってユーザーに役割を設定し、必要な人に必要な権限を与えることが出来る。
より細かい制御をしたい場合は、Role を使わずに `Script` で定義していくこともできるが、基本は Role。

Role を理解して、セキュリティも考えられたアプリケーションを作成しましょう。


## Role
Role の作成は、`定義`と`実際に割り当てる作業`の`2段階`で行う。

定義はアプリケーション全体で一つだけど、実際に割り当てるのは環境ごとに異なるみたいなイメージ。
そのため、Staging環境とProdction環境など異なった環境で違う割り当てが可能になっている。

環境の違いは次の記事で書いてあるので参考にしてほしい。（Roleにもちょっと触れている）
[Google App Maker ー 環境の違いを理解する - Qiita](https://qiita.com/howdy39/items/77641b2a456f97ed18ee)

### APP SETTINGS で Role を定義
`Admins`Role は最初からある Role で消せない。
Role はいくつでもつくれるので必要な分だけ追加する。（筆者の場合、作っても1つ作るのがほとんど）

次の画像は`Role1`,`Role2`,`Role3`を作った例。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/896a7f6c-cbd2-7c42-8010-a430677324c3.png)

### DEPLOYMENTS で Role にユーザー(グループ)を割り当て
環境に対して Role を割り当てる。
割り当てるのはユーザーのアドレスでもグループのアドレスでも大丈夫だし、複数も可。

次の画像はそれぞれのRoleにメールアドレスを割り当てた例。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/c0cdc69a-f658-7068-6a61-06ab9ab7068b.png)



## モデルに Role を設定する
データを守るために、モデルの`SECURITY`でモデルに対して`Role`を設定する。
※ちなみに`Advanced`ってとこにチェック入れるとより（Create／Load／Save／Deleteで）細かく制御できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/1a103dd7-bfee-c8cf-d883-663b9845261b.png)

### デフォルトは AdminsOnly
本番環境で公開したら、他の人から「動かないよ」って言われたら原因は大抵これ。
デフォルトは`AdminsOnly`なので開発時は`Admin=自分`なので気にならないが、自分以外のユーザーの場合に読み込めなくておきてしまう。



## 画面(Page,PageFragment)に Role を設定する
画面を守るために、Pageの`Security`で Role を設定する。
ちなみに`Page`,`PageFragmnet`には設定できるが、`Pop up`には　Role の設定はできない模様。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/8f886fb5-1057-62eb-d8f6-1913d7e15237.png)


### デフォルトは Everyone
すごく大事なところ。
モデルのデフォルトは `AdminsOnly` だけど画面のデフォルトは、誰でも表示できる `Everyone` になっている。
データの管理画面とか作ってると誰でも開ける状態になるので正しい Role を設定する必要がある。



## おまけ Admins Role を使って開発効率を上げる
筆者がよくやるのは `Admin(開発者)` しか開けないページを作ってボタンを配置する。
ボタンの`onClick`に`データの一括削除`や`テストデータの作成`などをキックするように設定する。

本番環境にもそのまま隠し画面や隠し処理を残せるので、リリース後のメンテなどがとても楽になっておすすめ。



## 参考サイト
[Application Settings  |  App Maker  |  Google Developers](https://developers.google.com/appmaker/settings#more_about_access_roles)
CrystalとOAuth認証

RubyでTwitterやFacebookのIDを使ってOAuth認証を行う場合、大体omniauthを使うかと思いますが、Crystalの場合はどうするかというと、multi_authというツールがあります。

https://github.com/msa7/multi_auth

基本的な使い方はREADMEを見たらそのまんまなので、特に苦労することはないですが、環境構築でちょっと手間取ったところがあったので手順の再確認ということで以下に纏めます。
尚今回はTwitterで認証してみます。必要なクレデンシャルは以下のサイトで登録しておきます。

https://apps.twitter.com

## CrystakとKemalのバージョン

CrystalとKemalのバージョンは以下の対応で確認しています。

- Crystal
    - 0.23.1
- Kemal
    - 0.20.0

仕様の破壊的変更の影響があるので、現時点では上記の組み合わせ以外は動きません。

## 必要なもの

取り敢えずshard.ymlは以下の感じです。

```
dependencies:
  kemal:
    github: kemalcr/kemal
    version: 0.20.0
  kemal-session:
    github: kemalcr/kemal-session
  db:
    github: crystal-lang/crystal-db
  pg:
    github: will/crystal-pg
  multi_auth:
    github: msa7/multi_auth
```

kemal-sessionとdb、pgは取得した情報を保存するのに使ってます。
取り敢えず最低限動かすのに必要なコードの抜粋をすると以下の通りです。

```
require "kemal"
require "multi_auth"

MultiAuth.config("twitter", ENV["TWITTER_CONSUMER_KEY"], ENV["TWITTER_CONSUMER_SECRET"])

def self.multi_auth(env)
  provider = env.params.url["provider"]
  redirect_uri = "#{Kemal.config.scheme}://#{env.request.host_with_port.as(String)}/multi_auth/#{provider}/callback"
  MultiAuth.make(provider, redirect_uri)
end

get "/multi_auth/:provider" do |env|
  url = multi_auth(env)
  env.redirect(url.authorize_uri)
end

get "/multi_auth/:provider/callback" do |env|
  user = multi_auth(env).user(env.params.query)
  env.redirect "/user" # 認証後に遷移するURL
end
```

https://apps.twitter.com  
で取得した情報の内必要なものは、Consumer Key (API Key)とConsumer Secret (API Secret)になります。
第2引数と、第3引数に設定します。

ログインしたいページに以下のリンクを貼り、画面からクリックで認証が走ります。
`<a href="/multi_auth/twitter">Sign in with Twitetr</a>`

特に難しいことはないですが、twitterから取得できる情報として

- nickname（twitter id）
- uid
- image_url(iconのURL)

などがあります。
数学とコンピュータアドベントカレンダー 19日目の記事について

すみませんすみませんすみませんすみませんすみません
冬休みになったら書きます。。。

内容的には discrete ricci curvature/discrete ricci flow を用いて complex network(application としては例えば脳神経 network などの話に使われる)、的な内容を書く予定です。

ほんと、すみません。。。
MacのAtomでツリービューの表示/非表示を切り替える

# Macでtree-view:toggleが効かない
WindowsのAtomではツリービューのショートカットキーによる切り替えは問題なくできていたのに、MacのAtomではツリービューのショートカットキーが効きませんでした。

# 解決した方法
結局のところ、「¥」や「\」の使い分け設定は行わずにキー入力を変えることで解決。
ツリービューのショートカットキーは「cmd-\」なので、以下の方法でトグルを行うことができました。
**「Option」+「command」+「¥」の３つのキーを同時押し。**

# 環境
- MacBook Pro 2017
- High Serria 10.13.2
- Atom 1.23.1

# 参考となったサイト
- [atomエディタで最近以下の２つができなくなりました - 人力はてな](http://q.hatena.ne.jp/1478358045)
- [Macで円（¥）記号とバックスラッシュ（\）を使い分ける方法](http://minto.tech/mac-backslash/)
角度の平均を求める方法

## 前提
対象は二次元座標系での角度です
角度は-180° ~ 180°でプログラムを書いていますが、少し書き換えれば0 ~ 360°でもいけると思います

## 背景 (読み飛ばしても大丈夫です)
修士研究でAndroidを使って屋内測位アプリを作っていて(Java)、その中でパーティクルフィルタというのを使っています
その中で、各パーティクルの状態ベクトルの平均をとる操作が必要でした。状態ベクトルには(x,y,θ)の3つあって、そのうち(x,y)は単純に総和を個数で割ればいいのですが、角度は周期性の問題（後述）で上手くいきません
なので、ちょっと自作してみました

## 角度の平均は単純に求めてはいけない
以下のサイトで図付きで詳しく説明されています
http://d.hatena.ne.jp/ootanAW/20111030/1319981509
簡単に言うと、（[0° ~ 360°]で定義される角で）350°と10°の平均って180°になっちゃいますよね？でも、周期性を考慮すると平均は0°であってほしいです
今回は[-180° ~ 180°]で考えていますが、同様の問題が発生します

### ではどうするか
↓のサイトによると、一旦角度を単位円上のベクトルに変換して合成し、ベクトルの平均をとってから逆変換するという方法があるようです
https://staff.aist.go.jp/toru-nakata/averageangle.html

手順としては以下
1. 各角度θnから(cosθn, sinθn)のベクトル**Vn**を生成
2. **Vn**の平均ベクトル**V**を求める
3. **V**から平均角度θを求める

## 作成したコード(Java)
というわけで書いてみました
[gist](https://gist.github.com/koyo-miyamura/08e14f58aa1f9e69c82fe51102835f39)にもアップしているので自由に使ってください(不備などありましたらご指摘いただけると幸いです)


``` Java:Angle_average.java
import java.lang.Math;
public class Angle_average{
    public static void main(String[] args){

        final class vector{
            double x;
            double y;
        }

        System.out.println("角度の平均");

        // 変数宣言・初期化
        double ang_avg;

        // -----ここに平均を求めたい角度を入力-----
        double[] angles = {10.0, 30.0, -10.0, -30.0};

        int len = angles.length;

        double[] angles_rad = new double[len];

        vector[] vectors = new vector[len];

        vector vector_avg = new vector();

        for (int i = 0; i < vectors.length; i++) {
            vectors[i] = new vector();
        }

        for (int i = 0; i < angles.length; i++) {
            angles_rad[i] = angles[i] * (Math.PI / 180.0);

            vectors[i].x = Math.cos(angles_rad[i]);
            vectors[i].y = Math.sin(angles_rad[i]);
        }

        // 平均を求める
        vector_avg.x = 0.0;
        vector_avg.y = 0.0;

        for (int i = 0; i < vectors.length; i++) {
            vector_avg.x += vectors[i].x;
            vector_avg.y += vectors[i].y;
        }

        vector_avg.x = vector_avg.x / (double)vectors.length;
        vector_avg.y = vector_avg.y / (double)vectors.length;
        
        ang_avg = Math.atan2(vector_avg.y, vector_avg.x);

        // 計算誤差の補正
        if(Math.abs(ang_avg) < Math.pow(10, -8)){
            ang_avg = 0.0;
        }

        System.out.println(Double.toString(Math.toDegrees(ang_avg)) + "\n");
    }
}
```
Robot Frameworkのテストケースの指針「How to write good test case」について

この記事は「[Robot Framework Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/robotframework)」の24日目の記事です。

Robot Framworkのテストケースを書いていると、この書き方で良いのかと悩むことがあります。

Lint面では、以前紹介した `Robot Framework Lint` を試すのが良さそうです。

それ以外で何か良い資料がないかを探したところ、Robot Frameworkのリポジトリに `How to write good test case` がありました。
[robotframework/HowToWriteGoodTestCases: General guidelines for writing good test cases using Robot Framework](https://github.com/robotframework/HowToWriteGoodTestCases)

`How to write good test case` では、Robot Frameworkのテストケースの

- Introduction
- Naming
- Documentation
- Test suite structure
- Test case structure
- User keywords
- Variables
- Avoid sleeping

について、良い書き方と悪い書き方について書かれています。

　  
個人的に参考になった部分は

- 英語でテストケースやキーワードを書く場合は、Pascal Case & 単語の区切りは半角スペースで書く
- テストスイートには `[Document]` 設定を書くが、テストケースには書かない
- テストケースの書き方は、 `Workflow tests` と `Data-driven tests` の2種類がある
  - Workflow testsでは、テストケースのステップ数は最大10とする
  - Workflow testsでは、forループやif/elseなどのロジックがあるものはユーザキーワードに書き、テストケースには書かない
- 変数名を英語で書く場合の指針
    - ローカル変数名は小文字のみで構成する
    - テストスイート変数名とグローバル変数名は大文字のみで構成する

などでした[^1]。

[^1]: 意訳な内容なので、詳細は原文を確認してください。また、誤りがあったらご指摘ください。

Robot Frameworkのテストを書く場合には良い指針となりそうです。

　  
なお、 `How to write good test case` のIntroductionでは他の参考資料として、

- [Robot Framework Dos And Don'ts](https://www.slideshare.net/pekkaklarck/robot-framework-dos-and-donts)
- [Writing Maintainable Automated Acceptance Tests](http://cwd.dhemery.com/2009/11/wmaat/)
- [How to Structure a Scalable And Maintainable Acceptance Test Suite - codecentric AG Blog](https://blog.codecentric.de/en/2010/07/how-to-structure-a-scalable-and-maintainable-acceptance-test-suite/)

もあげられています。

こちらにも目を通しておくと良さそうです。
Atomic-Chrome再訪

# atomic-chrome再訪

## 概要
Emacsのatomic-chromeと，Google Chromeの拡張GhostTextを使って，Jupyter notebookなどの編集を便利に行います．

## いるもの
* Emacs (今回試したのは，"GNU Emacs 25.2.1 (x86_64-w64-mingw32) of 2017-04-26")
* Google Chrome (or chromium, 今回試したのは63.0.3239.84)
* atomic-chrome (melpaから [atomic-chrome at Github](https://github.com/alpha22jp/atomic-chrome)
* GhostText（Chromewebストアから[GhostText](https://chrome.google.com/webstore/detail/ghosttext/godiecgffnchndlihlpaajjcplehddca)）

## 使い方

[「Atomic Chrome for Emacs - EmacsでChromeのテキストエリアをリアルタイム編集」](https://qiita.com/alpha22jp/items/f67bda3ed0c4ac84c29f)に付け加えることはほとんどありませんが，繰り返しをいとわず一通り書いておきます．

上述のように，Emacsにatomic-chrome, ChromeにGhostTextをインストールします．


次に，Emacsの側で M-x load-library atomic-chromeして，
atomic-chrome-start-server を呼び出します．

更に，Chrome側で，textarea のあるページ（例えばQiitaの投稿画面）を表示し，GhostTextのアイコンをクリックします．すると，textarea が青く囲われた表示になり，emacs側に入力用のバッファがあらわれます．そのバッファに入力した内容が，随時textareaに反映されます．

Qiitaの編集画面だと，Markdownのpreviewが追従しないことがあります．その場合，textareaの方で空文字を入力して消去するなどしてみて下さい．

##当初の目論見

以前Qiitaに投稿した，EIN でのJupyter notebookの編集（[「einで数式表示」](https://qiita.com/iwaokimura/items/3136a0ac9a2bd1f9e926)）が，最近のSagemath（に同梱のJupyter）では上手くいかなくなり（ログインが出来ない．\_xsrfに関するエラーが出ることもあり，特にエラーが表示されずログインだけできないこともある，なお[こちらのissue参照](https://github.com/millejoh/emacs-ipython-notebook/issues/231)．），代替を探していました．

atomic-emacsとGhostTextの組合せでJypyter notebookの編集ももちろん可能です．ただ，次の2点が気になります：

* Jupyterだと入力のためのtextareaが複数あり，次々と入力欄が変わっていく
* sagemathのコマンドを入力していく際に，tabでの保管が欲しい

前者については，GhostTextのショートカットを作成することである程度対応できます．Chromeの画面右上部のGhostTextのアイコンを右クリック→「拡張機能を管理」→画面最下部の「キーボードショートカット」のリンクをクリックすると，「拡張機能とアプリ用のキーボードショートカット」の画面があらわれます．Toggle GhostText の箇所に，デフォルトが設定されていますが，気に入ったものに変更すればよいでしょう（私はCtrl+Shift+Aにしています）．あたらしいtextareaで，いま設定したショートカットをタイプすれば，即座にemacs側から入力が可能です．

後者の補完についてはまだ上手いアイディアがありません．示唆があれば教えて頂けると幸いです．

![sc-2017-12-24 21.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/211066/16fce9fa-8536-b128-4517-ff32ccb5adae.png)
ES6 Modules のエラー処理を決定的(deterministic)にした話

こんにちは、xhl_kogitsune です。2017年は Chromium の module script 実装の Blink 側の半分とかを作っていました。

今日は Chromium Browser Advent Calendar 20日目として、ES6 Modules のエラー報告の仕様(とChromium実装)を決定的(deterministic)にした話をします。

ES6 Modules は、モジュール間の依存関係を元にネットワークから複数の JavaScript ファイルをダウンロードしてきて実行してくれる便利な機構ですが、モジュールになんらかのエラーがあった時、エラー報告の挙動が非決定的であるという仕様上の問題がありました。今回はこの問題が認識され解決される過程を解説します。

グラフ理論の問題を考える、アルゴリズムを提案しあい反例を挙げあう、決定的だの可換だののワードが飛び交う、という楽しい話でもあったので、月刊「競技プログラミングは役に立つ」としても読めるかと思います。

[続きの内容はこちらのDocをご覧ください!](https://docs.google.com/document/d/1Wuc2LVLb2Ii-itnA4sKw_KndJGvZ4mvdfw0POm5qcs4/edit?usp=sharing)
Unity の Shader で環境光を得る

# はじめに
　Unity で MeshRenderer 用の Shader を記述する際、シーンの環境光情報を取得することは必須である。しかし Unity の Shader ファイルやマクロは多大である割に Document は皆無で発見しづらくバージョンアップで頻繁に変わるので、インターネット上の情報を参考にするとおかしくなることが多い。
　特にシーンの Lighting 設定で Environment Lighting を単色や Skybox で切り替えたりするとそれに追従できないユーザシェーダも多い。本記事ではシーンの Lighting 情報に対応する。

# 環境
　以下の 2 つで確認

- Unity 5.6
- Unity 2017.3

# やり方
　`UnityCG.cginc` に宣言されている `ShadeSH9` 関数を使うだけである。

```
half4 indirectLighting = ShadeSH9(half4(i.normal, 1));
```

　`i.normal` は World 座標での法線である。
　また `ShadeSH9` は Forward Rendering の場合、Pass の Tag が `"LightMode" = "ForwardBase"` のときのみ作用する。追加のライト Pass では黒色になる。

# 補足
　公式 Document の [Shader Variables の項](https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html) を読むとたしかに書いてある。しかしこの書き方では Fog and Ambient の方を見てしまうと思うし、一般に普及している ShaderForge などのノードエディタで素直に書くと、Skybox 設定にしても Ambient Color の単色が作用してしまうなどの状況を見ると、定義が複雑すぎるのではないかと思う…
　Unity が PBR に切り替えた段階で旧来の Variable などはすべて Obsolute になればよかったのだが、そうもいかず今の時代も残って語弊を生んでいるのである…
Windows10でGO言語環境の構築


##はじめに
Go (プログラミング言語)とは、google社によっって開発され、2009年に登場した比較的新しい言語で、比較的シンプルな言語で、C++などの言語に比べると習得は容易で、
プログラミング経験のある方であれば、仕様を眺めただけで使えるようになるらしい。
（使いこなせるとは言ってない！）



GO言語は聞いたことしかなく、使ったことも、コードも見たことがないのでなんとも言えませんが、とにかくGOをインストールしてみる！



##手順
①
windows用インストーラーのダウンロード
[ダウンロードはこちら](https://golang.org/dl/)
<img width="559" alt="①.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/15d7ce44-e984-88cf-61ea-d552af3d1824.png">


②
①でダウンロートしたファイルを実行してインストール
<img width="386" alt="②_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/a486cb1a-c03a-83c8-85ac-de7a2e2b80fd.png">
<img width="386" alt="②_2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/007e41b8-545c-073c-17a2-d1474f49122a.png">
<img width="386" alt="②_3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/1ea28917-4d8d-421e-1997-824553a9ec2f.png">
<img width="386" alt="②_4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/a33e39b7-c1fb-ddac-e533-f2897f0dcd38.png">
<img width="386" alt="②_5.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/c8ec243b-9a9b-9755-7b97-842fcabfaa49.png">



③
GO をインストールしたディレクトリ下の[bin]ディレクトリを環境変数の[PATH]に追加
（自動で追加されていれば追加、編集不要）
<img width="352" alt="③_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/51314c5e-9d9e-6525-b576-1d74c6050c2b.png">
<img width="340" alt="③_2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/af979fa3-5d51-e225-f0fa-cc76498c32a5.png">
<img width="441" alt="③_3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/79463e4a-0602-e429-e45a-c5e1b35e3989.png">


④
GO をインストールしたディレクトリを環境変数の[GOROOT]に追加
（自動で追加されていれば追加、編集不要）

⑤
go動くかどうか確かめる~バージョン確認~

GOをインストールディレクトリ下の[bin]ディレクトリまで移動し、
[go version]と実行し動くことを確認する。
<img width="196" alt="⑤_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/bee1b326-2931-4459-1bb0-b23f39c98d6e.png">



⑥
動くかどうか確かめる~goファイルの実行~

プログラミングと言えば Hello World！
hello.goという名前のファイルを作成し、以下の内容を記載
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


コマンドプロンプトで実行する。
[go run hello.go]

<img width="180" alt="⑥_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/0f9bf808-d943-3de5-3cb0-4a038bbe13d5.png">


表示されることを確認


⑦
動くかどうか確かめる~実行ファイルにしてから実行~

ビルド
[go build hello.go]

.exeファイルが作成される
<img width="67" alt="⑦_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/6b5b55e2-9afe-a1c4-6a32-2b8a3780494c.png">


実行
[hello.exe]
<img width="192" alt="⑦_2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/ec092513-bb10-a894-82e1-c5295c20b619.png">



ちゃんと動くことが確認できた！
組合せ最適化でオーノーを解く

Advent Calendar 24日目の記事 [組合せ最適化でへやわけを解く](https://qiita.com/SaitoTsutomu/items/82c670fd5aba8bad081d)

## これなに

[**オーノー**](http://0hn0.com/)を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題
* マスに赤●か青●を必ずいれます
* ＊は赤●の指定を表します
* 数字は、自身も青●扱いとし、自信を除く上下左右に連なる青●の数を表します
* 単独の青●は禁止します

下記は、左が問題で、右が答えです。

![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/ohno.png)

### 入力パラメータ

`data`にヒントが入っているとします。

```py3:python
import numpy as np
from itertools import product
from pulp import LpProblem, lpSum, value
from ortoolpy import addvars, addbinvars
data = """\
4...
3...
...*
*23.""".splitlines()
n = len(data)
```

## Pythonで解く

数理モデルを作成し、解きましょう。

### 定式化

```math
\begin{array}{cl}
            変数 & x_{ij} \in \{0, 1\} ~ \forall i, j ~ ~ ~ マスi,jが青●か (1) \\
            変数 & y_{ijk} \ge 0 ~ \forall i, j, k ~ ~ ~ マスi,jの方向kの青●連続数 (2) \\
\mbox{subject to} & yをxで表す (3) \\
                 & 数字や*の指定 (4) \\
                 & 単独青●の禁止 (5) \\
\end{array}
```

```py3:python
def cons(m,x,y,i,j,k,dx,dy,bdi,bdj):
    if i == bdi or j == bdj:
        m += y[i,j,k] == 0 # (3)
    else:
        m += y[i,j,k] <= y[i+dx,j+dy,k]+1 # (3)
        m += y[i,j,k] <= x[i+dx,j+dy]*(n-1) # (3)
        m += y[i,j,k] >= y[i+dx,j+dy,k]+1 - n*(1-x[i+dx,j+dy]) # (3)
m = LpProblem()
x = np.array(addbinvars(n, n)) # 青●か (1)
y = np.array(addvars(n, n, 4)) # 縦、横、上右下左の連続数 (2)
m += lpSum(x) # (3)
for i, j in product(range(n),range(n)):
    cons(m,x,y,i,j,0,-1, 0,  0,-1)
    cons(m,x,y,i,j,1, 0, 1, -1,n-1)
    cons(m,x,y,i,j,2, 1, 0,n-1,-1)
    cons(m,x,y,i,j,3, 0,-1, -1,0)
    if data[i][j] == '*':
        m += x[i,j] == 0 # (4)
    elif data[i][j].isdigit():
        m += x[i,j] == 1 # (4)
        m += lpSum(y[i,j]) == int(data[i][j]) # (4)
    else:
        m += lpSum(y[i,j]) >= x[i,j]
m.solve()
```

### 結果の表示

```py3:python
print(np.vectorize(value)(x).astype(int))
>>>
[[1 1 1 0]
 [1 1 0 0]
 [1 0 1 0]
 [0 1 1 1]]
```

解けていることが確認できます。

## まとめ

パズルというテーマでの組合せ最適化は、いかがだったでしょうか？
「面白そう！やってみよう！」と感じていただければ幸いです。

- 参考：[数理最適化によるパズルの解法](https://qiita.com/SaitoTsutomu/items/0c0db8d22979fc9de8f4)
- 参考：[パズルでみる組合せ最適化のテクニック](https://qiita.com/SaitoTsutomu/items/f05f4ff05d4ce6099ff3)

以上
Raspberry PiでIFTTTのMaker WebhooksにPOSTする

このエントリは「[Raspberry Piでスマートロックつくった](https://qiita.com/undo0530/items/669b6ee6b2277ea64b33)」の解説5つめになります。
鍵の開閉を記録しておくため、IFTTTを経由してGoogleスプレッドシートに記録してみようと思います。この内容で記事書いている人は大勢いますので簡単に。
# IFTTTでMaker Webhooksを有効にする
[https://ifttt.com/maker_webhooks](https://ifttt.com/maker_webhooks)にアクセスし、「Connect」をクリックすればMaker Webhooksが有効になります。
![e4e5fa2eeeee1a1a39cbec73f96fc7ba.png](https://qiita-image-store.s3.amazonaws.com/0/222969/09d5adac-c6d5-1e79-ed21-b9c05cfe3088.png)
有効化したら、右上の「Documentation」をクリックして、Webhooksを利用するためのkeyを確認します。
![654e62b8ae46370cbd4870ce7ceade0a.png](https://qiita-image-store.s3.amazonaws.com/0/222969/73e7c543-4e0b-44a1-64c5-8af47199dd3e.png)
ちなみにこの画面はWebhooksのデバッグコンソールも兼ねていて、イベント名とPOSTパラメータ名を自由にいじってテストすることができます。
# IFTTTのアプレットを作成する
さて、Maker Webhooksの準備が整いましたので次はGoogleスプレッドシートに記録するアプレットを作成します。「My Applets」→「New Applet」の順にクリックするか[https://ifttt.com/create](https://ifttt.com/create)にアクセスして組み合わせを作ります。

- this：Webhooksを選択し、適当なイベント名（LogToGoogleなど）を設定
- that：GoogleSheetsを選択し、「Add row to spreadsheet」を選択。生成されるシート名などは適宜お好みで登録。

以上でIFTTTの準備は完了です。念のため先程の「Documentation」のページに行って、今作ったイベントにPOSTしてみてちゃんと動作するか試してみるのもよいです。
# Raspberry PiからPOSTする
あとはRaspberry PiからPythonでWebhooksのAPIにPOSTすれば完了です。

```python
import requests
# IFTTT URL for Logging to Google Sheets
IFTTT_URL_GoogleSheets = 'https://maker.ifttt.com/trigger/<設定したWebhooksのイベント名（LogToGoogleなど）>/with/key/'
# IFTTT Key
IFTTT_KEY = '<確認したWebhooksのkey>'

# Log
requests.post(IFTTT_URL_GoogleSheets + IFTTT_KEY, json = {'value1':'パラメータ1', 'value2':'ぱらめーた2', 'value3':'parameter3'})
```
私はこれを使って鍵の開閉やユーザ登録などの記録をとっています。
![9bc98a0b938431421da10ae7648f9725.png](https://qiita-image-store.s3.amazonaws.com/0/222969/fe6b86d6-e29a-33bf-955f-fab7c96919cc.png)
41行目～47行目は通常の利用ログですね。Apple WatchやiPhone X内のSuica、それに室内のボタンを使って開閉しています。48行目では登録されていないPASMOがタッチされており、その次の行でカードを「ぱすも」という名前で登録許可を出しています。（[登録許可については次の記事へ](https://qiita.com/undo0530/items/2139a1e8b73b3eee6e00)）
現在はスマートロックだけ稼働していますが、今後部屋内にセンサーを置いたり別の機能を持たせたRaspberry Piを稼働させることになれば、色々なログをこのシートに記録していくことになるでしょう。
Next：[Raspberry PiでSlackbotを飼う](https://qiita.com/undo0530/items/2139a1e8b73b3eee6e00)
clangの最適化で動作が変わった

# 問題
下記のコードで、`Hello`と`World`のどちらが出力されるのか考えてみてください。
場合によってはメモリリークしますが、とにかく標準出力に出てくるのは何かだけ考えてみてください。

``` c++:出力されるのはHelloなのかWorldなのか
#include <stdio.h>
#include <stdlib.h>

static int* g_i = NULL;

static void PutsSomething() {
	if (g_i == NULL) {
		g_i = (int*)malloc(sizeof(*g_i));
		puts("Hello");
	} else {
		puts("World");
	}
}

int main(void) {
	g_i = NULL;
	PutsSomething();
	// free(g_i);
	return EXIT_SUCCESS;
}
```

# 動作確認結果

|コンパイラ|最適化レベル|出力結果|
|----|----|----|
|gcc7.2 x86-64|-O0|Hello|
|gcc7.2 x86-64|-O1|Hello|
|gcc7.2 x86-64|-O2|Hello|
|clang5.00 x86-64|-O0|Hello|
|clang5.00 x86-64|-O1|World|
|clang5.00 x86-64|-O2|World|

# どうしてこうなった
分からない。
ちなみに`free()`を書けばHelloが出力される。分からない。

# 参考
## clangのアセンブラ出力確認
* Clang初級 - Qiita  
  https://qiita.com/megane814/items/ef3f4f44eae31e0560a0  
* 超便利！Ｃ言語のアセンブラ出力を即確認できるサイト｜compiler-explorer  
  http://nagayasu-shinya.com/clang-compiler-exploerore/  
  * Compiler Explorer - C++  
    https://gcc.godbolt.org/#

## 動作確認環境
* [Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ  
  https://wandbox.org/  
  どうやらclang-6.00でも起きる模様。
Amazon Echo (Alexa Skill) めも_01：フラッシュブリーフィング（フラッシュニュース）のTIPS（おもにキャッシュの話）

# Amazon Echo (Alexa Skill) めも_01：フラッシュブリーフィング（フラッシュニュース）のTIPS（おもにキャッシュの話）
フラッシュブリーフィング（フラッシュニュース）のTIPSめもです。おもにキャッシュの話をまとめました。

# フラッシュブリーフィング用のJSONについて
JSON(RSS)の取得タイミングやキャッシュについてまとめました。記事を更新してもAlexa側が更新されない問題の参考にしてください。

##Q
アレクサ側でキャッシュを持っているのでしょうか？

##A
アレクサ側でキャッシュを持っています。

##Q
新しいJSONを取得するタイミング（キャッシュの保存期間）は、どのくらいですか？

##A
新しいJSONを取得するタイミングは「コンテンツの更新頻度」によって決まります。
しかし、１時間ごと、毎日、毎週の選択肢は定刻に更新するというものではありません。
例えば、毎日に設定した場合は１日のうちどこかのタイミングで更新されます。
したがって、頻繁に更新が必要な場合は１時間ごとの更新をお勧めいたします。

※１時間ごとの更新の場合、１５分おきに取得しているようです。（別回答）

##Q
フィードの追加画面に「コンテンツの更新頻度」　一時間ごと、毎日、毎週
という欄がありますが、これはフラッシュブリーフィングの再生に影響がありますか？
（例：毎日にすると、１回読まれたらその日は読まれないなど）

##A
更新頻度に関係なく、フラッシュブリーフィングを呼び出すたびに再生されます。
（例：毎日にすると、１回読まれたらその日は読まれないなどの処理は行われない。）

##Q
JSON内で、日付を　yyyy-MM-dd'T'HH:mm :ss'.0Z'　の形式にする必要がありますが、
元の日付が日本時間のAM10時だった場合に、この日付はどうすればいいですか？
(時差をどうすればいいですか？）

※時差を考慮して、AM01時を指定、時差を考慮せず、AM10時を指定、タイムゾーン（GMT-08:00など）を指定
と言った感じで、色々方法はあると思うのですが、どういう指定をすればいいのか教えてください。

##A
日付はSimple Date Format:のUTCまたはGMTで指定する必要があります。
これはフィードアイテムの新しさを表し、新しい順に読み上げ/再生するために使用されます。
したがって、指定する時間帯が配信するフィードで統一されていれば、運用にご都合のいい時間を設定していただければと存じます。

##Q
JSONの中に古いニュースが混ざっていた場合に、そのニュースは読まない機能はありますか？
（例：２４時間以上古いニュースは読まないなど）

##A
フラッシュブリーフィングスキルはフィードのRSSまたはJSONファイルに含まれるアイテムを新しい順に5つ、自動再生します。

# まとめ
キャッシュ系の話をまとめてみました！ 間違えたニュースを配信してもキャッシュクリアできないのは辛い＞＜
電子工作 > 磁石検知装置 > 555 Timer + 74HC04 + buzzer

[カギ閉め忘れ問題 > 対処案 v0.1](https://qiita.com/7of9/items/a2bb833caa91ab798188)
にて検討しているシステム。

とりあえず小型化を目指して実装してみることにした。

### 装置概要

- 磁気センサーで検知
    - Hレベルが立つ
- インバーター(NOT回路)でレベル反転
    - Lレベルになる
- 555TimerのTRで検知
- 555Timerの出力側のブザーがなる

### ブレッドボード実装

ブレッドボードで実装した様子が以下。

![DSC_0281s.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/33f74470-3132-bdc9-8658-66f4d9f7ea90.jpeg)

左から:

- 磁気センサー
    - [ESP8266 > 磁気センサーの動作確認 > Sunhayato MM-DE21P](https://qiita.com/7of9/items/7b5ffd3e9bd9608459ef#_reference-b3dca27043d75b8e4780)
- インバーター (NOT回路)
    - 74HC04: [秋月電子](http://akizukidenshi.com/catalog/g/gI-08596/)
- 555 Timer
    - [電子工作 > 555 Timer > 押下後しばらくON状態 | 注意点 | 回路例 | ブレッドボード実装](https://qiita.com/7of9/items/dcb187da1f1226bf3e6f#_reference-542ae86d1d6f7fbe7f33)
- ブザー
    - [RPi > 圧電ブザーで音を鳴らす > LF-PB30W25C / LF-MB12B06](https://qiita.com/7of9/items/844bbedb2dbf20e042b9)
        - 3V駆動可能
- CR-123A (3V)

上記にて磁気センサーに棒磁石を接触させると検知され、ブザーが鳴ることを確認した。
(棒磁石の磁力が弱いため、接触まで検知されない）。

下記の実装ではCR-123Aではなく、CR2032を使う。ブレッドボードにてCR2032で音が鳴ることを確認した。

### ユニバーサル基板実装

ユニバーサル基板で実装した。

![DSC_0283s.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/d9a70967-1b89-a6ca-bce1-a0bb93f307fc.jpeg)

一番上のものを一番下のものまで小さくすることができた。

基板の裏側は以下のようになっている。専門ではないので、今はこの程度です。
![DSC_0284s.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/b2ee4d6f-999e-eb4f-ba69-924640d8122c.jpeg)

### 動作状況

棒磁石の場合は、磁気センサーに接触させるほど近接させないと音はならない。

別途探した磁石として、台所の明かり取りに使っている[GENTOS GZ-602](http://www.gentos.jp/products/GZ-602/)を試した。
底面のマグネットをレンジフードに付けることで、台所の明かり取りに使える、というモノ。
棒磁石よりも磁力が強く、少し離れたところでも検知できた。


### 回路図 @ Upverter

Upverterでの回路図を用意した。
久しぶりなのでモジュール作成に手間取った。

https://upverter.com/7of9/ae88f1ac5584de4a/171224_555Timer_magnetDetector/

### 備考

- 封入型のReed Switchはブレッドボード実装時に破損した
    - ユニバーサル基板上で破損すると面倒なので採用を見送った
- 555 Timerをシリーズに二つ接続し、インターバーを介した実装をブレッドボードで試した
    - 一つ目の５５５のトリガーと同時に二つ目の出力側ブザーが鳴った
    - ディレイ回路とするには、以下の情報などが参考になりそう
        - [555を使ったオンディレイタイマの制作](http://yaplog.jp/kazuikazui/archive/480) by かずいさん
Flashのupgrade

11月のFreeBSD Workshopで話した内容をブラッシュアップしてみました。

まずZRouterなFreeBSDの起動を説明します。

FLASHに焼かれた圧縮されたkernelをu-bootがRAMに展開して実行を移します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/104066/a62dc183-ab04-7246-28b3-957502877014.png)

kernelはFLASHの圧縮されたiso9660なrootfsをgeom_uzipとgeom_map/geom_flashmapを使って認識してmountします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/104066/c4f39ae3-878a-61c4-f734-c03304bff09f.png)

mountされたrootfsのrcが実行されて/tmpとunionfsな/etcで使うmdを作成してnewfsしてmountします。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/104066/9540dba9-579d-741c-36ac-1aef36cfef47.png)

```
# df
Filesystem                   1K-blocks  Used Avail Capacity  Mounted on
/dev/flash/spi0s.rootfs.uzip     16602 16602     0   100%    /
devfs                                1     1     0   100%    /dev
/dev/md0                          7543   762  6178    11%    /tmp
<above>:/tmp/etc                 24145 17364  6178    74%    /etc
```

ここまでが通常の起動状態になります。

FLASHをupgradeするためにはFLASHのrootfsをumountする必要があります。当初rootfsの最小限必要なshなどのバイナリをmdのufsにコピーしてrerootしていました。ufsは圧縮されていないので6M近くになり、16MしかRAMが無いターゲットなどでは厳し状態でした。先日のWorkshopで話した事はここまででした。

ちなみにrerootとはFreeBSD 10.3くらいから入った機能で、reboot -rでrootfsのmount時点からの再起動が出来る機能です。kenvで次のmountデバイスが指定できます。

課題で話した内容に、たまにrerootが失敗する事があり調べてみました。tmpfsの空きメモリのチェックがあり、これが4MByteとメモリが少ないターゲットでは厳しい事が分かったので、カーネルオプションで設定できるようにして[レビュー](https://reviews.freebsd.org/D13583)出してみました。

その後、最小構成のファイルシステムのiso/uzipでの再構成なども検討してみたのですが、コマンドを増やすとイメージが大きくなる事やワークスペースが必要になるため現実的ではありませんでした。

ふとFLASHの圧縮されたrootfsをそのままmdにコピーすれば良いではないかと思いつきました。（後から思えば至極当然の事なんですが、結構いろいろ考えました）

![4.png](https://qiita-image-store.s3.amazonaws.com/0/104066/96dc17d4-5708-fdb9-dfe2-b2ec1002f523.png)

自分以外のプロセスをkillして/etcと/tmpをumountしてddでrootfsをFLASHからmd0にコピーしてこれにrerootするようにしました。

自分以外とはinit(pid=1)から起動したlogin以外のプロセスになります。psコマンドから引っ張る事もできますが、sedもawkも無いので/var/runの下のpidファイルを元にしました。

```
dd if=/dev/flash/spi0s.rootfs of=/dev/md0
kenv vfs.root.mountfrom=cd9660:md0.uzip
reboot -r
```

![5.png](https://qiita-image-store.s3.amazonaws.com/0/104066/1b44385e-ca9c-e873-8253-5b3616092777.png)

rerootで起動した事はkenvのvfs.root.mountfromで分かるので、この場合はmdを小さめで作るようにしました。4MのFLASHの場合md0を3Mで作ってmd1を1Mくらいで作るのが良いと思われます。これであれば16MのRAMのターゲットでも十分に実用になります。

これで完全にRAM上で起動している状態なので、FLASHの焼き直しが安全におこなえます。

具体的にはtftpとpipeとddを使ってFLASHのupgradeデータを流し込む方法などがあります。

```
mkfifo /tmp/flashpipe
dd if=/tmp/flashpipe of=/dev/flash/spi0s.upgrade obs=64k conv=osync &
echo "bin
get Fon_FON2305E_FDT.zimag /tmp/flashpipe
quit" | tftp tftpserver
kill -INT 1
```

ZRouterを作ったrayからはhttpのuploadとかスイッチなどで対応できるようにしてほしいと言われているのですが、この方法であれば応用で出来そうな気がします。

いろいろプロセスが上がっているとtmpfsのメモリ確保に失敗してrerootが失敗します。tmpfsのメモリ最低確保を変更できるような[パッチ](https://reviews.freebsd.org/D13583)つくってみたのですが、できるだけrcでの起動しないようにして、リブート直後にupgradeを行うのが現実的です。

upgradeのパーティションを間違えて設定してしまいu-bootをつぶしてしまうと文鎮になってしまうので注意が必要です。

4Mや8MのFLASHの場合はこの方法が良いと考えられますが、16M以上の場合は、やはり最小限のbinをmdにコピーしてrerootするほうが現実的だと思います。

16M以上をサポートするためにinit,shや必要なlibをmdのtmpにコピーする方法も対応してみました。ファイルの合計が4MちょっとくらいなのでFLASHが8Mの場合もこの方法で良いような気もします。

途中でtftpが止まった場合などはブート出来なくなるので、シリアルコンソールでもう一度焼きなおす必要があります。

開発が続いているCURRENTではときどき立ち上がらなくなったりする事もあります。リモートでのupgradeはシリアルコンソールでのupgradeの代わりになるものではありません。
private docker distributionをコマンドラインから操作する

# はじめに
まだ空きがあったのでせっかくなので投稿させていただきます。
この記事は[Fujitsu Advent Calender 2017 Part2](https://qiita.com/advent-calendar/2017/fujitsu_part2) 6日目の記事です。

## お断り
本記事の内容は私個人の見解であり、所属する組織として意見を代表したり保証したりするものではありません。

# 背景
dockerで自作のコンテナを作成した場合、privateなdocker distributionにコンテナをアップロードしますよね。
docker distributionに何が登録されているかやdocker distribution内のイメージを手軽に削除したいと思い、コマンドラインからdocker distributionを操作するためのツールを作成してみました。
出力例は下記の"各コマンドの解説"の章を参考にしてください。

# 何ができるのか
コマンドライン上から簡単にdocker distributionに登録されているイメージやタグの一覧を検索でき、削除できる。

# ツールのインストール方法
GitHubに公開していますので、git clone等でソースを入手してください。

```
$ git clone https://github.com/shun-miyoshi-com/docker-registry-cli.git
```

# 使い方
もしrubyをインストール済みなら下記コマンドで実行できます。

```
$ cd /path/to/docker-registry-cli/src
$ ruby docker-registry-cli.rb <command> [options]
```

rubyをインストールしてなくてもdockerをインストール済みなら下記コマンドで実行できます。

```
$ ./run.sh <command> [options]
```

### ※run.shで何をしているか
---
Dockerfileを参考にdocker-registory-cli:1.0というdocker imageを作成します。
その後docker runでimageを実行させて引数のコマンドを解釈させています。
なお、docker run時に--rmオプションを指定しているのでコマンド終了時にごみは残りません。

# 各コマンドの解説
1. getImagesコマンド
  * docker distributionに存在するimageの一覧を取得します。
  * option  
    --url=\<url\>: docker distributionのURLを指定します。(デフォルトはhttp://localhost:5000です)  
  * 出力例

```
$ ./run.sh getImages --url="http://192.168.0.1:5000"
sample
myruby
```

2. getTagsコマンド
  * docker imageのタグ一覧を取得します。
  * option  
    --url=\<url\>: docker distributionのURLを指定します。(デフォルトはhttp://localhost:5000です)  
    --image=\<image\>: imageの名前を指定します**(このオプションは必須です)**
  * 出力例

```
$ ./run.sh getTags --url="http://192.168.0.1:5000" --image=sample
v1.0
v2.0
```

3. deleteコマンド
  * docker imageを削除します。
  * option  
    --url=\<url\>: docker distributionのURLを指定します。(デフォルトはhttp://localhost:5000です)  
    --image=\<image\>: imageの名前を指定します**(このオプションは必須です)**  
    --tags=['v1.0','v1.1']: 削除したいタグを配列で指定します**(このオプションをセットしない場合すべてのタグを削除します)**
  * 出力例

```
$ ./run.sh delete --url="http://192.168.0.1:5000" --image=sample
```

※毎回--urlオプションをしているするのはだるかったので、環境変数(DOCKER_REGISTRY_URL)を読み込むようにしました。
例: export DOCKER_REGISTRY_URL="http://192.168.0.1:5000" をセットすると--urlオプションを指定する必要はありません。

# まとめ
これであなたも素敵なprivate docker distributionライフを！

P.S. PRやISSUEなど積極的に募集しています:grinning:
参考:
docker distribution API(https://github.com/docker/distribution/blob/master/docs/spec/api.md)
別の方によるGoバージョン(https://qiita.com/Mamoru-Izuka/items/f503a82478b3272d9427)
Dvorak & ATOM使いがVSCに乗り換えた時の設定メモ

## はじめに
[Visual Studio Code 公式サイト](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)
VSC（Visual Studio Code）はここからダウンロード出来ます。

## ユーザー設定ファイルの中身（17/12/25更新）

```:ユーザー設定
{
    "terminal.external.osxExec": "iTerm.app",
    "editor.fontSize": 16,
    "editor.lineHeight": 21,
    "editor.fontFamily": "Ricty, Menlo, Monaco, 'Courier New', monospace",
    "workbench.iconTheme": "verdandi",
    "workbench.colorTheme": "Atom One Dark",
    "terminal.integrated.fontSize": 16,   
}
```

※ コーディング用フォントRictyが気になった方は[Rictyの説明やインストール方法](http://vdeep.net/ricty-font)も見てみると良いと思います

※ ターミナルはiTerm2でzshを使ってます
- [iTerm2についての記事](https://qiita.com/k_saito/items/ab73032a82632af3cd3c)
-  [zshについての記事](https://qiita.com/nenokido2000/items/763a4af5c161ff5ede68)

※ （12/25追記）ファイルアイコンのテーマは純正2つだと視認性が悪いので、変更しました。今は[Verdandi Theme](https://marketplace.visualstudio.com/items?itemName=be5invis.theme-verdandi)を使ってます。

※ （12/25追記）カラースキームもAtomのやつにしちゃいました。

## その他設定
`Command` + `Shift` + `P` 押下後、`SHELL` と入力し、`SHELLコマンド: PATH内に'code'コマンドをインストールします`をクリック。
これでターミナルで`code .`とか叩くとディレクトリをエディタで開けます。

あとは、起動中に`Control` + `｀` を入力することでiTermがIDE内で起動。

## 個人的に変えてよかったこと
- Dvorak(Command押下時のみQwerty)を使っており、Atomだと日本語入力時 & Command押下時にQwerty入力にならない問題があったのだが、解消されている（個人的にこれが一番重要）
- インストール直後からAtomで普段使ってる機能がだいたい使える（gitの差分表示とか、ディレクトリ検索とか。~~そもそもAtomちゃんと使いこなせてない~~）
- カラースキームがデフォルトでカッコイイ

ATOMから機能失うことなく移行できたのが何よりです（そのうち戻るかもしれないですが）。ATOM & Dvorakで、もどかしい経験をした方はぜひ一度試してみてはいかがでしょう。

[永峰のTwitterアカウント](https://twitter.com/nagaminenot?lang=ja)
[Sloganアドベントカレンダー](https://qiita.com/advent-calendar/2017/slogan)
Visual Studio Codeへのコントリビュート方法まとめ

# はじめに

Visual Studio Code(以下VSCode)は優れたエディタであると同時にコントリビュートの行いやすいプロジェクトでもあり，オープンソースに参加したことのない方にもおすすめです．
また，VSCodeに少しでもコントリビュートすれば毎月のリリースノートに[名前が載ります](https://code.visualstudio.com/updates/v1_19#_thank-you)．

<img width="765" alt="Screen Shot 2017-12-24 at 19.40.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/221488/16a1db5c-45ac-0656-fd36-4f909b48bb39.png">
もし，現在のVS Codeの環境に不満があればいればぜひ開発環境からを開発してみましょう．

本記事はVisual Studio Codeへの以下のコントリビュート方法についてまとめました．
順番はおすすめ順です．

* [VS Codeのローカライゼーション(翻訳)](#VSCodeのローカライゼーション)
* [VS Code Extensionへのコントリビュート](#VSCodeExtensionへのコントリビュート)
* [VS Code本体へのコントリビュート](#VSCode本体へのコントリビュート)

内容は個人の経験によるものでVS Codeプロジェクトの意向とは無関係です．

# 想定読者

* オープンソースに参加してみたい人
* 開発環境の開発に興味がある人
* 英語でのやり取りを体験してみたい人

# VSCodeのローカライゼーション

一番おすすめのコントリビュートです．
理由は

* 一単語でも修正すればコントリビュートとなる
* そこそこの精度の機械翻訳がある程度サポートしてくれる
* 他よりは英語が少ない
* ソースコードを読む必要がない

詳しくは[こちらに](https://qiita.com/EbXpJ6bp/items/8432e8ec0f55236cd503)記事があるためそちらを参照してください．(最もVSCodeの日本語ローカライズをされている方の記事です)

リリースノートには貢献順に名前が掲載されます．

<img width="749" alt="Screen Shot 2017-12-24 at 19.02.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/221488/d75fe924-07e1-33e1-b46b-1136ad7a2c82.png">


# VSCodeExtensionへのコントリビュート

Extension自体は多くありますが，Microsoftが管理しているExtensionへ貢献することでリリースノートに掲載されます．
多くの種類があり，それぞれは小さめのプロジェクトなので参加の敷居はかなり低いです．
また，参加者も少ないため比較的レスポンスが早いです．
お気に入りの言語のExtensionなどがあればぜひ参加しましょう．

Extensionリストは[こちら](https://marketplace.visualstudio.com/search?term=publisher%3A%22Microsoft%22&target=VSCode&category=All%20categories&sortBy=Relevance)から見ることができます．

この他にも

* [tslint](https://marketplace.visualstudio.com/items?itemName=eg2.tslint)
* [npm](https://marketplace.visualstudio.com/items?itemName=eg2.vscode-npm-script)

などやlanguage server関係でも掲載されます．

全てのGitHubのプロジェクトが見たい方は[こちら](https://github.com/Microsoft?utf8=%E2%9C%93&q=vscode&type=&language=)


# VSCode本体へのコントリビュート

issue(バグ報告)を投稿する方法とプルリクエストを投稿する方法がありますが，issueはリリースノートに掲載されないためプルリクエストについて紹介します．
３番目である理由は単純にソースコードが巨大で大変だからです．慣れている方の場合はあまり問題でないかもしれません．

メリットとしては

* エディタを使う人は色々いるためissueを眺めるだけで話題が多くて楽しい
* GitHubプロジェクトの管理が徹底しているため自分のプロジェクトの参考になる
* 参加人数が多いためいろんな人の意見が聞ける

ところです．
Botによる担当者の割り振りや[How to Contribute](https://github.com/Microsoft/vscode/wiki/How-to-Contribute)のおかげで一番賑わっているところです．

[How to Contribute](https://github.com/Microsoft/vscode/wiki/How-to-Contribute)に環境設定などが詳しく掲載されています．

レスポンスはExtensionほど早くはありませんが，[マイルストーン](https://github.com/Microsoft/vscode/milestones)が近いものや[help wanted](https://github.com/Microsoft/vscode/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22)タグがついているものを直すと早く返事が来て喜ばれます．

編集自体は[こんな風な](https://github.com/Microsoft/vscode/pull/6317/files)(拡張子を足しただけ)小さな変更でもしっかりレビューしてくれます．

## ビルドに失敗した時は
Java Script関係でビルドに失敗することがあります．
個人的にはnpmやnodeのバージョンをプロジェクトに合わせたり`npm_module`ディレクトリを削除することで解決することが多かったです．

# まとめ

VS Code参加しやすいオープンソースプロジェクトです．
最後に宣伝として，私が開発中の[R言語](https://marketplace.visualstudio.com/items?itemName=Ikuyadeu.r)や[青いカラーテーマ](https://marketplace.visualstudio.com/items?itemName=Ikuyadeu.lucario)のExtensionもissue，コントリビュートを募集中ですので興味があればぜひご参加ください．
Houdiniの強み~大量配置編~

初参加にして、まさかのクリスマス枠をとってしまいました…。
初めましての方は初めまして！ネット名義　瑞原（Mizuhara)と申します！

**メリークリスマスですね！！Houdiniですね！！**

はい。というわけで、正直Houdini使いとしてはまだまだ初心者の僕からは、
「どうしてHoudiniがいいのか」を初心者目線で
自分の説明は最後の方にチロっと書くので、とりあえず内容に入っていこうと思います。

##Houdiniの強み　大量配置編
僕がこれはHoudiniが強い。と思ったことの一つが『copy stamp』を使ったオブジェクトの大量配置です。
copystampの勉強時に使用させていただいた、tutorialを元に簡単に書かせていただきます。URL↓
[リンク]https://www.youtube.com/watch?v=o54NyeEXlVY



![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/217643/b1a7ca86-dc4e-da15-094e-98f235a26d38.png)
こんな感じのグニっとした地形に配置するとします。
敷き詰めるという観点から、１個１個手置きは嫌だ…。
ではHoudiniでパパっと

![06.PNG](https://qiita-image-store.s3.amazonaws.com/0/217643/a47622b9-5fd6-99e3-63cb-3976c5fe4f7e.png)
（※参考動画の方ではL-systemを木に見立てたやり方をしていますが、見やすいように三角形で）
大きさもランダムに。
(ここに関しましては自分の学が足りなく、まだ上手く説明が出来ません…。tutorialを参考にrandを使ってやりました。)

横から図
![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/217643/7b643dbd-d4bd-e7e5-6085-789c2e20b12c.png)
大量配置はされていますが、オブジェクトはワールド座標方向を向いています。
配置する系で、こういう状況はあんまり無いんじゃないでしょうか？
ちゃんと地形を生かしてあげたいですよね。じゃあどうするか…。

これが意外と他のソフトではややこしかったりします。
Houdiniはノードを＋１つだけ、えいっ
![07.PNG](https://qiita-image-store.s3.amazonaws.com/0/217643/d8e4895e-efe3-65ce-918a-83aa6c14b89b.png)
normalノード追加、法線情報はPointsに、寝転がっていたのでtransform_Rotate_X90(Zを軸に参照しているのでしょうか…？要勉強です。)
とまあ工程自体は２つありましたが、比較的簡単に配置が完了しました。
もちろん、「ここ被ってほしくない！！」というときに編集することも可能です。
![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/217643/52e78f57-e4f4-147e-b046-4e0f27ec184d.png)

と、まあ雑ですが僕が思ったHoudiniの強みの一つがこれですね。
他ソフトだとパーティクルにするか…。シャターか…。と迷うと思うのですが、Houdiniに関してはほぼこれで完璧ではないでしょうか？
Paintノードを使っていらないところに配置しないようにも簡単にできますからね。

以上。**個人的にいいと思ったHoudiniの強み、大量配置編**です！


### ここからは、ちょっと雑談です。

時間があるときにでも軽く目を通してもらえれば笑
お疲れ様です。瑞原です。（本名松本淳也です）
カレンダーに関しましては、今年蒸留水さんと知り合い、フォローさせていただいたことをきっかけに挑戦してみようかと思ったわけですが
**内容がガチ**
救済プリーズ…

僕は現在、都内のCG専門学校の2年生です。来年卒です。
今のCG業界って学生に物凄く優しく、どのソフトもほぼ無料で触ることが出来ます。
僕自身も、Maya、Max、C4D、Houdini全て触った経験があり、多少はどのソフトも使えます。その中でこれからはHoudiniをメインに動かしたいと思った理由は２つ
・作業が明確にわかる
・現在Houdiniを推す姿勢、教える姿勢が強い
このカレンダーもその一つだと思います。作業が明確にわかるという点においては仕事に関わらせていただいて初めて強く思いました。
まだ卒業まで数か月ありますので、全力でHoudiniの勉強をしたいと思います。

**みなさんカレンダーお疲れ様でした！！**
**メリークリスマス！！＆良いお年を！！**
Validation

```
# プロジェクト、コントローラの作成
rails new ValidationTest  -d mysql
cd ValidationTest
rails g controller ValidationTestApp index show

(config/database.yml を編集)

rails db:create

rails generate scaffold Person name:string gender:string age:integer
rails db:migrate
```

XXX.XXX.XXX.XXX/people
にアクセスしてTopページを確認する。

```
# Validateを設定する
```

```ruby:app/models/person.rb
class Person < ApplicationRecord
  validates :name, presence: true
end
```

実際にnameを空にしてsubmitしてみる。
以下のようなエラーが出力される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215043/a6262de4-3470-2a3d-07af-347b5199ba53.png)



---

https://altarf.net/computer/rails/3085

「Active Record(Railsのモデル) バリデーションまとめ」
http://morizyun.github.io/ruby/active-record-validation.html

「Rails 4でモデルのバリデーションまとめ」
http://ruby-rails.hatenadiary.com/entry/20140724/1406145303#model-validation-definettions


https://qiita.com/tstomoki/items/1097c3a598a06c5ac980

http://freesworder.net/rails-form_for-select/
.gitignoreを自動生成するShell

.gitignoreを自動生成するShell

# はじめに
本文は記事[HerokuにPuppeteerの実行環境を構築する](https://qiita.com/jerrywdlee/items/ffc988956eb75a99bc3c)の番外編です。
gitを使うにあたり、.gitignoreの作成がほぼ必須となっています。Railsやvue-cliなどScaffoldを作成する際は、割と意識しなくていいですが、自分が一から何か小さいプロジェクトを作る時はやっぱり書くことになってしまいます。

# .gitignoreの自動生成
実際簡単です。https://www.gitignore.io/ にアクセスして、`Create`をクリックすれば、コピペで終わります。
それでも手間かかると思っていたので、より自動化したいと思いました。

# やったこと
下記スクリプトを書きました。

```gi.sh
#!/bin/bash

params=`echo $@ | tr ' ' ','`
# add most used os
params="windows,macos,linux,"$params

curl -L -s "https://www.gitignore.io/api/"$params > $PWD"/.gitignore"
echo ".gitignore File Created At:"
echo $PWD"/.gitignore"
```
使い方：
例えばnode.jsとrails両方対応の.gitignoreを作成したい場合、下記のコマンドでできます。

```
$ bash gi.sh node rails
```

簡単に説明してみると、gitignore.ioさんは、カンマ区切りのパラメータを認識してくれて、`bash gi.sh node rails`で叩くと、`https://www.gitignore.io/api/node,rails,linux,macos,windows`にアクセスし、.gitignoreとしてコマンド実行時のフォルダーに書き込みます。

# さらに自動化
それでも毎回`gi.sh`をどっかから持ってくるのは面倒なので、[Gist](https://gist.github.com/jerrywdlee/7d70e765c56cd151c0c13fb11d1bdb3a)に投稿し、Rawgitで一般公開しました。

MacOSの環境だけテストしましたが、下記コマンドでこのShellをインストールすれば、次回からは`gi node rails`とかで一発作れます。

```
$ curl -L -s https://cdn.rawgit.com/jerrywdlee/7d70e765c56cd151c0c13fb11d1bdb3a/raw/b8df7028d7b317aaae113111d940d4b11d0e5e81/gi.sh > $HOME/.gi.sh
$ echo "alias gi=\"bash \$HOME/.gi.sh\"" >> ~/.bash_profile && source ~/.bash_profile
```
railsでviewのtext_fieldにdatalistを表示させる

# datalistについて

[datalist 要素 \- HTML \| MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/datalist)

# View

## 実装

- text_fieldタグに`list:`オプションを追加してdatalistの`id`を指定する
- `datalist`タグを追加する
- datalistの候補値を`option`として指定する

```html+erb:xxx.html.erb
<%= form.text_field :name, id: :user_name, list: 'list-name' %>
<datalist id="list-name">
  <option value="akasaka">
  <option value="akatsuka">
  <option value="akabane">
</datalist>
```
## 動作

テキストフィールドが空欄の場合はすべての値が候補として表示される。

![datalist2.png](https://qiita-image-store.s3.amazonaws.com/0/141934/fd7cc571-ddc6-e547-0c0e-48a7f8a2d6a7.png)

テキストフィールドに値が入力されてる場合は一致する値のみ候補として表示される。

![datalist3.png](https://qiita-image-store.s3.amazonaws.com/0/141934/5d4893fe-92fe-5be5-a8a9-1d508be08ea1.png)
cesiumでjquery

#概要
cesiumでjqueryを使ってみる。

#写真
![](https://camo.qiitausercontent.com/6934331ef003978bdbd9ced890235d277236b303/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f31383130342f38666636323332642d393830392d343862392d623764652d3830353238626430633265382e706e67)

#サンプルコード

```
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.1, 37.9, 2000.0),
    orientation: {
        heading: Cesium.Math.toRadians(-20.0),
        pitch: Cesium.Math.toRadians(-35.0),
        roll: 0.0
    }
});
var pinBuilder = new Cesium.PinBuilder();
var url = '/assets/a/U/k/W/aUkWM';
$.getJSON(url, function(json) {
    var mise = json.bikuya;
    for (var key in mise) 
    {
        var name = mise[key].name;
        var latlon = mise[key].latlon.split(",");
        var e = viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(latlon[1], latlon[0]),
            label: {
                text: name,
                verticalOrigin: Cesium.VerticalOrigin.TOP
            },
            billboard: {
                image: pinBuilder.fromColor(Cesium.Color.SALMON, 10).toDataURL(),
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
            }
        });
    }
});



```

#成果物
http://jsdo.it/ohisama1/8bj4

以上。
ビット1の出現回数を求めるやつ（popcnt）の意味を理解した

任意のビット並びにおけるビット`1`の出現回数を求めるアイツ。世間一般的には**popcnt**の愛称で親しまれているらしいです。。

```c:popcnt(c99)
#include <stdio.h>      
#include <stdint.h>     
                        
uint32_t popcnt(uint32_t x)
{                       
    uint32_t x_ = x;
    x_ = (x_ & 0x55555555) + (x_>>1 & 0x55555555);
    x_ = (x_ & 0x33333333) + (x_>>2 & 0x33333333);
    x_ = (x_ & 0x0f0f0f0f) + (x_>>4 & 0x0f0f0f0f);
    x_ = (x_ & 0x00ff00ff) + (x_>>8 & 0x00ff00ff);
    x_ = (x_ & 0x0000ffff) + (x_>>16 & 0x0000ffff);
                                                                              
    return x_;          
} 
```

#popcntがやらんとしていること

popcntの意図を説明した図を作ってみました。

この図では例として、8ビット長のビット並び`1101 1000`におけるビット`1`の数をカウントしています。

![popcnt.png](https://qiita-image-store.s3.amazonaws.com/0/51871/ba31cd54-a254-a230-c051-2ec35dfd5708.png)

#素朴な疑問に対する回答

* つまり一言で言うと、どういうことなんですか？

ビット並びというのは、それ自体ですでに各ビットが**「自ビットの`1`の数（=`1`の集計値）」**を表現しているわけです（そりゃそーだ）。これを起点として、隣合う集計値同士でペアを組んで、ペアごとの集計値を求めて…という作業を再帰的に適用すれば、最終的に「ビット並び全体のビット1の集計値」を求められるわけです。

* ビットマスクの意味は何ですか？

「集計値の並びから、各ペアの片方の集計値だけの並びをピックアップする」ことに該当します。

* なぜ右ビットシフト`>>N`しているのですか？

ペアごとの集計値を合計するとき、（集計値を表すビット表現において）上位半分のビット並びをペアの一方、下位半分のビット並びをペアのもう一方と見立てているわけです。

このとき「上位半分のビット並び」をビットマスクで保存しても末尾`0`並びがくっついているので、ペア同士で加算するためには桁を一番下までずらす（右ビットシフトする）わけです。

* 足し算の意味は何ですか？

「隣り合う集計値同士を集計する」ことに該当します。二項`+`演算子の一方のオペランドが「各ペアの右側集計値だけの並び」、もう一方のオペランドが「各ペアの左側集計値だけの並び」に対応します。
VisualStudio2017おすすめアドオン

# VisualStudio2017おすすめアドオン

VisualStuio拡張機能を使うと幸せになれるよ


# 導入方法

 1.ツールから拡張機能を選択  

![image0.png](https://qiita-image-store.s3.amazonaws.com/0/62873/3a43d35d-3662-4bfe-6c54-369c4a85af59.png) 

 2.オンラインを選択して好きなアドオンをダウンロードしてインストールする  

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/62873/7fa64e38-9d4a-ec4e-eecd-cc6f7895930d.png)


3.おわり

# Stack Overflow Quick Launch Search Provider



名前の通り、VisualStudioの右上にあるQuick LaunchからStackOverflowへ検索をかけることが出来る。 

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/62873/f24dec7b-fa04-e449-e08a-cabfef7fca49.png)


[Stack Overflow Quick Launch Search Provider](https://marketplace.visualstudio.com/items?itemName=AleksanderBerus.StackOverflowQuickLaunchSearchProvider)
# CppTripleSlash

XMLドキュメントコメントを生成してくれる
XMLのドキュメントファイルを生成することもできる
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/62873/0678a7c6-ecac-3784-6faa-94667d43fbb8.png)
 
[CppTripleSlash](https://marketplace.visualstudio.com/items?itemName=tcbhat.CppTripleSlash-xmldoccommentsforc)
# Highlight all occurrences of selected word++

選択した文字列と同じものをハイライトで表示してくれて同じ文字列を見つけやすい   
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/62873/a876d94d-cfe1-0c2c-9735-2aab86f29a60.png)

[Highlight all occurrences of selected word++](https://marketplace.visualstudio.com/items?itemName=BenaiahJohn.Highlightalloccurrencesofselectedword)
# HLSL Tools for Visual Studio

HLSL書くときにお世話になる  
![alt](https://github.com/tgjones/HlslTools/blob/master/art/reference-highlighting.gif?raw=true)  

[HLSL Tools for Visual Studio](https://marketplace.visualstudio.com/items?itemName=TimGJones.HLSLToolsforVisualStudio)
# ReSharper 

コード解析、リファクタリング、コード生成など行ってくれる（学生なら無料で使える）
ReSharperについて書いてるひとがいるからこっちみて  

**[やしへいのメモ帳 Google Test入門 + ReSharper](http://yashihei.hatenablog.com/entry/2017/12/23/201130)**
PHP環境変数$_SERVERの任意のキーに値を入れる方法

それぞれのPHP実行環境で $_SERVER['ENVIROMENT'] に、'develop' を入れるにはどうすればよいか？


# Apache経由の場合
```
# httpd.conf に１行追記。
# vi /etc/httpd/conf/httpd.conf
SetEnv ENVIROMENT develop
```


# CLI経由の場合
```
# .bash_profileに1行追記
# vi ~/.bash_profile
export ENVIROMENT="develop"
```


下記参照。
https://stackoverflow.com/questions/10731183/set-server-variable-when-calling-php-from-command-line
GoogleHomeとNatureremoをIFTTTで繋いでスマートホームはじめた話！

![写真 2017-12-23 12 32 44.jpg](https://qiita-image-store.s3.amazonaws.com/0/171044/70c93331-1c8f-3e7c-0c24-61654d7de0f5.jpeg)

# はじめに 
はじめまして、こんちです。
Qiita初投稿でAdventCalendarで空いていたので書いてみる事にしました。
いつもお世話になりっぱなので、何か恩返したできれば！と思ったのと、なんかカッコ良さそうだったからｗ
でGooglehomeとNatureremoをIFTTTで繋いだいお話を書きたいと思います。

Natureremoが届かない。。。

まず今回のエントリーで最も重要なのがNature remo
しかしながらメチャクチャ人気なのですよね。
スマートスピーカーと繋げられると分かった瞬間火がついたような気がしています。（私もそうでした）
タイミングよく誕生日を迎え妹から「何か欲しいものある？」との事で「Natureremo」をお願いしたところ昨日届きました。
と言う事でギリギリで到着したので書く事にします。

## セットアップややはりQiita
説明書は簡易なものが１枚。
勿論これでセットアップは出来ますが、より確実スマートに行うならQiitaで先人のエントリーを見る事でしょう。
[Google HomeとNatureRemoをIFTTTに連携してみる](https://qiita.com/wyokobe/items/62653f40ec9ea0461171)

正直これを見たら、もう何も書く事無いんですけどね。
何か書かなければ。。。

## ルンバ９８０が届いたよ！

ここで届いたのがルンバ９８０！

![写真 2017-12-24 16 06 23.jpg](https://qiita-image-store.s3.amazonaws.com/0/171044/70553280-0ad6-845d-ae42-bc081309fcbe.jpeg)


こいつは年末の大掃除に大いに役立ってくれると思い購入！
それが運良く？届いた訳でこいつとGooglehomeを接続しましょう！。

接続は勿論IFTTT!

IFTTTで
NewAppletを作りましょう！

検索からGoogleassistantを検索。

![runba1.png](https://qiita-image-store.s3.amazonaws.com/0/171044/3b6350f2-2888-1363-57c6-8661a1b5c09f.png)


”Say a simple phrase”
を選択します。

起動用のフレーズとして

「掃除して」

と入力。

フレーズは少ない文字数の方がいいと思います。

「部屋が汚いから、ピッカピカにお掃除してほしいなぁ、お願いしますよ、ルンバさん！」
なんて毎回言えないですからね。。。

返答についてもシンプルな方がオススメです。
毎回長いセリフ言われてもうざいだけですから。
「掃除をはじめます」」くらいがいいですね。

次にThatを指定します。

こちらも検索窓に「irobot」と入力するとサービスが表示されます。

![runba2.png](https://qiita-image-store.s3.amazonaws.com/0/171044/344fe538-14a4-6f3e-3928-34242ab9e93a.png)

初めて使用する場合はirobotのユーザーアカウントとパスワードを入力してIFTTTと接続しましょう。

![runba3.png](https://qiita-image-store.s3.amazonaws.com/0/171044/e2acea01-bb6d-6e66-bc98-b26f96e1d238.png)


既に作成されている
「Start robot」を選択しましょう。

![runba4.png](https://qiita-image-store.s3.amazonaws.com/0/171044/df5401dc-e3f6-59ac-ecea-c87f8923f2fa.png)


Create Actionを押してFINISHで終了！


## 試してみました！

Googlehomeに「OK Google　掃除して」

すると「掃除をはじめます」
と返答があり、無事ルンバ９８０が掃除を開始しました！

初めての起動が音声での起動となりましたが、これからの未来はこれが標準になりそうですねｗ

# まとめ
全然為にならないかもですが、ルンバを繋いでいる人はまだ少ないと思うので持ってる人は是非繋いでみてください。

またこれから家電を購入する時はWi-Fi対応か、もしくはスマートスピーカーに対応しているか！
を検討して購入すると幸せになれると思います。
現状の家電をスマートホーム化させたいなら、[MicrobotPush](https://www.amazon.co.jp/dp/B06Y2V62KV/ref=cm_sw_r_cp_ep_dp_bobhzb38BTFNP)は結構おすすめです。

以上です。
就労ビザ、フリーＩＴエンジニアで働く

こんにちは。
@sumida1234です。ここ１０年ほど、フリーで働く外国籍ＩＴエンジニアの皆さんが増えてきたなと感じています。
当社でも、フリーの日本人ＩＴエンジニアのみならず、フリーの外国籍ＩＴエンジニアの皆さんと契約させていただいてますが、 「就労ビザ（注１）でフリーＩＴエンジニア」というのが適法かどうかという懸念があり、基本的に、「永住権」、「日本人の配偶者」 等、職業制限が無い外国籍ＩＴエンジニアの皆さんとフリー契約させていただいていました。ただ、当社サービスを推し進めていく上で、「就労ビザでフリーＩＴエンジニア」が適法かどうかをはっきりとさせたいと思い、 先日、東京入国管理局へ問合せを行ったところ、以下の回答がありました。

>「安定して日本で生活できる（報酬、契約期間等の）契約条件であり、契約条件通りの実績があれば問題無い」 （但し、人を雇う等、活動内容によっては、就労ビザと見なされない場合があるようです）

別に当社が外国籍ＩＴエンジニアの皆さんに対して、フリーＩＴエンジニアとしての働き方を勧めている訳ではありませんが、 日本で働く外国籍ＩＴエンジニアの皆さんが、キャリア、人生設計において、働き方の幅が広がる選択肢を持てることは、 日本で働く外国籍ＩＴエンジニアの皆さん自身にとっても、又エンジニア不足が叫ばれる日本のＩＴ市場にとっても有益なことかなと思ってます。
日本で働く外国籍ＩＴエンジニアの皆さんにとって有益な情報がお伝えできるよう、適宜ブログに記事を挙げていきたいと 思っていますので、今後ともよろしくお願いします。

 

*注１：ＩＴエンジニアとして働ける就労ビザは「技術・人文知識・国際業務*
Proxy環境下でのDocker for MacOS

最近はMacOSでもDockerが動くようになってより手軽に「仮想環境」を利用できるようになりました。これまではMacOS上でLinux環境やWindows環境を構築するのには、Parallesを使っていましたが、今後は開発環境のLinuxはDockerを使うようにしたいと思っています。こちらの方がリソースもEcoだと思いますので。

で、ふと、Proxy環境下でDockerを利用していて、ハマったことがあったので、メモしておきます。

**proxyの状況が変わったら `docker.app` をリスタートする** 

ということです。

## Docker.app の proxy 設定

![dockerproxy.png](https://qiita-image-store.s3.amazonaws.com/0/42712/667bcd43-7066-0da7-ddec-de68ad76020c.png)

Docker for MacではタスクバーにあるPreferenceからProxyの設定をGUIで行うことができます。が、「User system proxy」を選択していても、Dockerがスタートするときにシステムの設定を読み込み、その後ネットワーク接続やネットワークの環境が変わっても動的には変更されないようです。

<img width="295" alt="dockermenu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42712/97ebed3e-31f4-07f9-f207-7a38741f0c82.png">

わかっていれば、docker pull などで registory を見に行った際に Proxy関係のエラーがでてくるのですぐ気づきますので、適宜 restartするか、Quit/Startしてやれば良いです。