OmniAICreator/Qiita-1.07M huggingface dataset:
【PlayCanvas】スライドに組み込む

この記事は [PlayCanvas Advent Calendar 2017](https://qiita.com/advent-calendar/2017/playcanvas) の16日目の記事です。
#何
PlayCanvasの実行画面をスライドに組み込んでプレゼンテーション出来たら素敵だと思いませんか？
Webスライドライブラリ"reveal.js"のWebサービス"Slides.com"なら簡単にできるので紹介します。

#Slides.com
Webベースのスライド作成サービスです、無料から使えます
https://slides.com にアクセスしてアカウントを作成しましょう

#deck 作成
Slides.comではスライドのことをdeckと呼びます、まずは一つ作ってみましょう
基本的なSlides.comの使いかたはここでは割愛します

#PlayCanvasの画面を組み込む
PlayCanvasでプロジェクトを作成し、ビルドしてURL(playcanv.as/....)を取得しましょう

##矩形選択して組み込み
メニューからiframeを選択してURLを入力すると組み込まれます。
サイズは矩形の頂点や辺から簡単に調整できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148084/90f6f1d5-8bd3-d5fd-cb87-bd7b7a80f0f0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148084/00ada52f-4572-8aef-6645-5240c6e3d8a8.png)

##全画面で組み込み
右上のSlide backgroundからiframeを選択し、URLを入力します。
マウス操作やキーボード操作等、なにかインタラクティブな動作をさせる場合は、interactiveにチェックを入れる必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148084/578b9ad9-959e-3d87-8811-730bd59e0e6f.png)

なお、全画面で組み込んだ場合、Slides.comの仕様で、見ていないスライドでもPlayCanvasプロジェクトはアクティブなままになってしまうようです。パフォーマンスを考えると矩形で組み込んだほうが今は良さそうです。
なお、Google Chromeでは6画面以上を同一タブでレンダリングしようとするとエラーが起きるため、6スライド以上は背景に指定しないほうがよさそうです。
https://forum.playcanvas.com/t/shader-compile-error-if-20-iframes-on-a-page/3025
glslで遊べるゲームまとめ


# ブロック崩し

![pingpong.png](https://qiita-image-store.s3.amazonaws.com/0/135381/f3ebb8b2-92e4-98c6-7444-4a2c3df0c0b2.png)
https://www.shadertoy.com/view/MddGzf

# パックマン

![pacman.png](https://qiita-image-store.s3.amazonaws.com/0/135381/e5f77af8-c845-783d-c643-a4980ce74ca1.png)

* https://www.shadertoy.com/view/Ms3XWN

# テトリス

![tetoris.png](https://qiita-image-store.s3.amazonaws.com/0/135381/d847eda7-84f3-5fff-ed79-b29da47c27b6.png)

* [GLSLでテトリスをつくる](https://qiita.com/phi16_/items/49b4c770ab979ecc8f2d)!

# Flappy Bird
![44176.png](https://qiita-image-store.s3.amazonaws.com/0/135381/069be9f6-ca90-ab20-a35e-ebd34c7c21b7.png)

* http://www.glslsandbox.com/e#44176.0

あれ、ちゃんとしたクオリティのゲーム意外とない!
お気に入り（いいね）機能をajaxで投稿のindexページにつけてみる。（ajaxがメインです)

環境
Rails 5.1.1
Ruby 2.3.0

## 前提条件
userテーブルに紐づいたblogテーブルがあること（１：多）。
userとblogの中間テーブルのfavoriteがあること（多：多）
お気に入り機能をすでに実装済みであること。（user_id,blog_idの値をレコードをfavoriteテーブルに保存する処理）
##流れ
１、送信方法をdata-remote: trueにする。
2、お気に入りボタンを変更する。
３、favorites_controllerをJSを対応した設定にする。
4,JSファイルを作成し、indexページのお気に入り部分を動的に処理する記述をする。

# 1
**views/favorites/_favorite.htm.erb**

```
<% favorite = current_user.favorites.find_by(blog_id: blog.id) %>
<% if favorite.present? %>
  <%= link_to favorite_path(id: favorite.id), method: :delete, remote: true, class: "glyphicon glyphicon-heart", style:"color: red"do %><% end %>
<% else %>
  <%= link_to favorites_path(blog_id: blog.id),method: :post, remote: true, class: "glyphicon glyphicon-heart-empty" do%><% end %>
<% end %>
```
`remote: ture`の送信方法にしてください。Ajaxを使用するため。このファイルはindex.html.erbに描画（レンダリング)されるお気に入りボタンです。

# 2
**views/blogs/index.html.erb**

```
<%= @blogs.each do |blog| %>

~省略

<div id="favorite_btn_<%= blog.id %>">
  <%= render partial: "favorites/favorite", locals: {blog: blog} %>
</div>

<% end %>
```
ここのidが後々のJSで要素を取得するターゲットになります。idの末尾の`<%= blog.id %>`の記述は、どの投稿かを区別するため。renderにより_favorites.html.erbを描写（レンダリング）しています。 `locals: {blog: blog}`はレンダリング元にローカル変数を渡す設定です。`locals: {ローカル変数: 代入したい値}`。

# 3
**controllers/favorites_controller**

```
def create
    @favorite = current_user.favorites.create(picture_id: params[:blog_id])
    @blog = Blog.find(params[:blog_id])
    
    respond_to do |format|
    format.js {render :template => "blogs/index",locals: { favorite: @favorite, blog: @blog} } 
    end
end
```
repond_to do |format|によりファイル名.js.erbになってものを探してきてくれる。
renderに`:template`オプションで別のコントローラのviewをレンダリングできる。view/blogs/create.js.erbを探しに行ってくれる。http://railsdoc.com/references/render
これしないとview/favorites/create.jsを探しちゃいます。あとlocalsでレンダリング後に使うローカル変数の設定も忘れずに。

# ４
**view/blogs/create.js.erb**

```
$("#favorite_btn_<%= favorite.blog_id %>").html("<%= j(render 'favorites/favorite',{favorite: favorite, blog: blog})%>");
```
1の_favorite.html.erbにレンダリングしてます。レンダリング先でお気入りボタンの条件分岐の処理（お気に入りされいるか否か？）をしているので、ここでもローカル変数の設定。JSだとlocalsとは書かないみたいなので、記述の違いに注意。
これで完成。お気入りのボタンはbootstrapのglyphicon使いました。

# 結果イメージ
[![https://gyazo.com/bcc77e5dc4e8fb83f1fcdd34a1c531e0](https://i.gyazo.com/bcc77e5dc4e8fb83f1fcdd34a1c531e0.gif)](https://gyazo.com/bcc77e5dc4e8fb83f1fcdd34a1c531e0)

２ヶ月前のメモしたものを書いてるので、色々と忘れてますが、何かおかしなところがありましたらお申し付けください。素人なので間違っていたり回答が遅いかもしれませんが、その辺はご容赦くださいませ。
どこよりもやさしいblastのインストール(MacOS)


この記事は学生団体P&DのAdventCalendar2017 14日目の投稿です。
準備不足のため予定を変更して、自分の研究に関連することを書きます。


#はじめに
 blastのインストールについて書かれている記事はあるのですが、内容がばらばらで分かりづらかったので簡単にまとめてみました。


#BLAST
 blastとはバイオインフォマティクスでDNAの塩基配列あるいはタンパク質のアミノ酸配列のシーケンスアライメントを行うためのプログラムです。
現在、blast と blast+ の 2 種類のプログラムがあり、blast は古いバージョンで、現在は速くて正確な blast+ を利用することが推奨されています。


#**blastのインストール**
###1. インストーラのダウンロード

以下のページから、ncbi-blast-####+.dmgファイルをダウンロードします。

ftp://ftp.ncbi.nlm.nih.gov/blast/executables/LATEST/
###2. インストーラからblastをインストール
ダウンロードした .dmgファイルを開き、ncbi-blast-####+.pkgを開きます。
<img width="770" alt="スクリーンショット 2017-12-14 10.21.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/199827/b4b55db6-80ed-1d2b-5808-3da866fc9efe.png">



すると、おそらくこのようにセキュリティに引っかかって開くことができないので、
<img width="419" alt="スクリーンショット 2017-12-14 10.26.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/199827/3912841c-2ebd-568e-9949-3a84cb7ab026.png">



システム環境設定 -> セキュリティとプライバシー　から「このまま開く」をクリックします。
<img width="666" alt="スクリーンショット 2017-12-14 10.30.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/199827/c9bc4235-cdc9-e97e-303c-d6c5c8c7f9d8.png">



すると、インストーラが開くので流れに沿ってインストールします。
<img width="615" alt="スクリーンショット 2017-12-14 10.34.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/199827/025f5ceb-dcb5-0657-0568-66b77b78ed08.png">

###3. パスを通す 
インストールが終わったらターミナルで以下のコマンドをうち、パスを通します。

```
ln -s /usr/local/ncbi/blast/bin/* /usr/local/bin
```
注意：/usr/local/bin　が無いことがあるのでそのときは作ってください。

###4. インストール確認
最後に以下のコマンドをうちます。

```
blastn -version
```
以下のようにblastnのバージョンが表示されれば無事にインストール完了です。

```
blastn: 2.7.1+
 Package: blast 2.7.1, build Oct 18 2017 20:40:57
```


#参考

https://www.ncbi.nlm.nih.gov/books/NBK52640/
今さら聞けないPythonで超基本的な事

# 目的

隣の席の人に聞くほどの事でもない些細なことメモ

### コメントアウトの方法


+ 複数行のコメントアウト

```
あいうえお

"""
かきくけこ   # この2行がコメントアウト対象
さしすせそ
"""

たちつてと

```

### シェバンについて
ArduinoとかRaspberry Piの入門キットがうまく組み立てられなくて入門できない問題

## **初めに**
   
   こんにちは。[CYBIRDエンジニア Advent Calendar](http://qiita.com/advent-calendar/2017/cybird)17日目の[@zon](https://qiita.com/zon)です。16日目は[@cy-tatsuya-sakai](https://qiita.com/cy-tatsuya-sakai)さんの[Unity uGUI ボタンのイベントを一か所で受け取る](https://qiita.com/cy-tatsuya-sakai/private/c781c31ce061c834d971)でした。Unityをあまり使いこなせていないので、もっと頑張ろうと思いました！

### **電子工作やってみたけど見本通りにできないよ！**
Arduinoが流行ってきた頃に手を出してみたのですが、電気の知識は小学校で乾電池を直列つなぎ、並列つなぎをして豆電球を光らせたり、中学校で抵抗値の計算したぐらいで止まっています。

なので初心者向けキットを買ってきて説明通りにできれば大丈夫ですが、説明書が理解しにくかったり、知識がなくてつまってしまうとそれっきりになってしまう方も中にはいらっしゃるのではないでしょうか。

私も同じです！
なのでArduinoやRaspberry Piをいったん横においといて電子回路の勉強するところから始めてみました。

### **小～中学生向けのLEDを光らせるキット購入**
ほぼ小～中学生と変わらない知識量なので、これならいけるはず！と思ったのですが、すぐ挫折しそうになりました。

説明書通りに組み立てたつもりがLEDが光らない
→ そうなると原因の見当がつかない

そもそも説明書通りにすら組み立てられない
→ 相談できない人もいないとどうにもできない

はまったもののできるまでやってみた結果、どうクリアしていったか紹介していこうと思います。

### **ブレッドボードに部品をさすときの、加減が間違っていた**
部品の足がそのままだと長いのでペンチで長さを調整はしているのですが、ブレットボードへのさし加減があまくグラグラ動くようであれば、もうちょっと押しこみましょう。グラつかない程度にささります。

### **ブレッドボードに部品を刺すところが間違っていた**
電子回路は電気の通り道を作っているので、部品を刺すところが一か所間違っていても電気は通れません。
もし説明書通り組み立てたつもりでもうまくいかない場合は、説明書とずれていないか再確認。

### **部品の不良だった**
付属の部品があっていなかったので、ペンチなどで調整しました。

### **抵抗値の色を見間違えていた**
小さい部品で、抵抗値を色で見分けないといけないので、似た色のパーツと間違えやすいです。いちいち確認していると組み立てるのに集中ができないです。
なので、仕切りのついたケースを購入してあらかじめ仕分けするようにしました。

### **説明書の表現があっていない**
追加パーツの購入をしないとできないようなので、購入しにいったところ、説明書には「リード線」ってあったのでお店の人にそのまま伝えたら、説明書の写真とは違うものがでてきました。
使用目的を説明したら、違う商品をすすめられたので、説明書があっていない時もありました。

### **本当にどうにもならないとき**
いったん寝る。
一度、頭をすっきりさせます。

ブレッドボードにさした部品を全部外して最初からやってみる。
いったん忘れて向き合う方がうまくいくことがあります。

## **最後に**
どうしても慣れないジャンルのことを始めるときは、挫折しやすく大変ですが、あきらめずにやってみると、自分でパーツを買いに行って応用してみたり、自分で電子回路が作れると楽しくなってきます。
入門キットを組み立てられるようになるとダーリントン接続とか新しいキーワードにぶつかるようになったり、これはこれで挫折しそうですが、入門できたような気がします。

   [CYBIRD エンジニア Advent Calendar](http://qiita.com/advent-calendar/2017/cybird) 明日は、[@cy-katsuhiro-miura](https://qiita.com/cy-katsuhiro-miura)さんの「IPアドレスで打線組んだ」です！ネットワークに疎いので楽しみです！
Rails ActiveRecordでテーブル内に存在する特定の要素の数を知りたい時

## テーブル内にある特定の要素を取り出す時


たまにあるテーブル内にある要素の取り出し方だと

```ruby
User.count #or size or length
```

で行けるけど、住所だったり、カテゴリーだったりある特定の要素に紐付いているデータの数を知りたい時に若干詰まった。

```ruby:NG
User.find_by(address_id: address_id).count
User.find_by(address_id: address_id).length
User.find_by(address_id: address_id).size
```
だとmethoderrorになる

```ruby:OK
User.where(address_id: address_id).count
```

whereを使いましょう。
ServiceNow Memo

ただのメモというか備忘録です

# Glider.js
- [A lodash style library for ServiceNow GlideRecord] (https://github.com/tltoulson/Glider.js)

# Issue with Reporting for Catalog Variables in Jakarta
- Jakarta patch 4 に upgrade 後、 Report 機能にバグがあることを発見
- RITM, SCTASK などに関連するvariableを条件に加えると、画面レンダリングが正常終了しない
- 正常終了しない結果、画面操作がなにもできない
- consoleには "NaN" が出ている
- [community で本件を報告している人がいるが、~~ソリューションなし~~ workaround が投稿された] (https://community.servicenow.com/message/1305493#1305493)
- [Known Error Portal (patch4)にも載っていない](https://hi.service-now.com/kb_view.do?sysparm_article=KB0597710)
- variableをレポートのフィルタ条件にすると出る？
懐かしい雰囲気で自分のプロフィールが作れるサイトを２時間で作った

[クソアプリアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/kuso-app2017) 15日目の記事です

今年もやってきましたクソアプリアドベントカレンダー

私はこのカレンダーだけ毎年参加する事にしています。

# 概要
SNSログインして、質問に答えるだけで、自分のプロフィールが作れるサイト

とりあえず出来上がったサイトがこちら
[マイプロフィール's](https://my-prof.firebaseapp.com/)

# 利用方法
アクセスして、TwitterかFacebookでログイン後に質問に答えるだけで、
こんな感じの自分のプロフィールサイトが出来上がります！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40154/d9df5e55-1a7a-3d33-5c06-c1b6b5a32043.png)

[私のページ](https://my-prof.firebaseapp.com/qRvIrLwhvET7bNATlyAEiv8H8bR2)

いい感じですね。

# 機能

トップページにはアクセスカウンター！
SNSログインして写真と名前を取得!
質問に答えてマイページを作れば固有のURLが発行されてシェアできる!
テーマカラーを設定するとピンクや青などの、自分のサイトのテーマカラーも設定できる！

**簡単簡潔おしゃれで最高！**

# 技術概要

## ざっくり

フロントは vue.js, vuex, vue-routerをwebpackでごにょごにょ
バックエンドはBaaSのfirebaseで oAuth,DB,Hostingあたりを使っています。

## ルーティング

「SPAでプロトタイプの開発を進めたいけど、後からちゃんと作る時に既存のパスがハッシュになってしまってるから、リダイレクトの設定とか必要になってめんどくさいからSPA嫌だ」
という意見を耳にしたことがある方もいるかと思います。

今回のサービスは完全SPAですがURLはしっかりユーザー固有の物がハッシュでなくパスで発行されます。

これはvue-routerの[historyモード](https://router.vuejs.org/ja/essentials/history-mode.html)を利用し、
Hosting側のfirebaseの設定で404の場合でも常に /index.htmlを返却するようにしています。

↓firebaseでHostingする際の設定値のサンプル

```firebase.json
{
  "hosting": {
    "public": "dist",
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

/:user_id
というパスでデータの有無をfirebaseに問い合わせて、そんなユーザー情報が存在していなかったら404にリダイレクトします。

このときの注意点としてはアセットのパスを常に絶対パスで記載する必要があることです。

また、historyモードをローカルの開発中に設定してしまうと、ローカルでも上記の様な設定が必要になってしまうためhashモードで作業したいですね。

ということでrouterは雑ですが、port番号が指定されてたらローカルでされてなかったら本番という分け方で

```router.js

import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter)

import Top from './view/Top.vue';
import User from './view/User.vue';
import New from './view/New.vue';
import NotFound from './view/NotFound.vue';

const mode = location.port ? 'hash' : 'history';
const routes = [
    {
        name: 'top',
        path: '/',
        component: Top
    }, {
        name: 'new',
        path: '/n',
        component: New
    }, {
        name: 'notFound',
        path: '/404',
        component: NotFound
    }, {
        name: 'user',
        path: '/:user_id',
        component: User
    }, {
        name: 'notFound',
        path: '/*',
        component: NotFound
    }
];

const router = new VueRouter({mode, routes});

export default router;
```

という雑実装で開発を進めました。
ちゃんとやるなら、nodeのENVを見てmodeを切り分けるのがいいと思います。

# 終わりに

クソアプリなので時間をかけずに、最低限必要な機能のみ実装して**２時間で環境構築→本番化まで作りきりました**。
もし「ちゃんと使いたい！」という人がたくさんいたら、ページにシェアボタンつけたりPCでのレイアウト作ったりするかも？コントリビュートしたい人もいたら教えてください。

ぜひ使ってシェアしてね！

[マイプロフィール's](https://my-prof.firebaseapp.com/)

現場からは以上です。

明日は[tag031さん](https://twitter.com/tag031)のクソアプリです。よろしくお願いします。
Lets' Encrypt で There were too many requests of a given type ～ って言われるとき

Lets' Encrypt で SSL 証明書を取得しようとした時、 too many requests って言われることがあります。

```error
There were too many requests of a given type :: Error creating new cert :: too many certificates already issued for: example.com
```

週5枚までとかの[レート制限](https://letsencrypt.org/docs/rate-limits/)に引っかかっている模様。

設定をミスっていて、エラーになったりしても、レート制限に引っかかって取得できないということもあるので困りますよね。

## 解決方法

レート制限に抵触しなくなるまで待てっていうのが正攻法ですが、どうしてもすぐ欲しい時もありますよね。

ドメイン重複に関するエラー(同じドメインに5回以上重複して申請したとか)でしたら、サブドメインも一緒に申請してやれば回避できる可能性があります。

```
例)
example.com ← エラーになってしまうドメイン
www.example.com ← サブドメインを追加
```

追加したサブドメインは、 エラーになってしまうドメインと同じ IP(Aレコード)、同じ場所(Alias)を参照するように設定するのがポイントです。

以下のように `-d` オプションで複数ドメインに申請してあげれば大丈夫です。

```
certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
```

## 参考

- [Let's Encrypt で SSL/TLS 証明書をインストールして自己証明書から脱却](https://qiita.com/tatsurou313/items/cd3cd8fc96eabf3f6eb4)
crowi-plusにいろいろと追加インストール

以前の記事で[crowi-plus](https://github.com/weseek/crowi-plus)のインストールを行った

- [crowi-plusを試してみた](https://qiita.com/matsum0623/items/e5a911818141d551bb0f)

それから半年以上たって、プラグインの導入もしたので、いくつかの覚書。
基本的にWindowsサーバーでの導入方法です。（弊社の社内環境がWinなので）


## 本体のバージョンアップ
導入したときには`2.0.9`だったが現在は`2.3.0`までバージョンが上がっている。
変更もしていたが、思い切ってアップデートした。

```batch
REM ローカルの変更を強制的にリセット
git reset --hard

REM crowi-plusのバージョンアップ
git pull

REM ビルド
yarn
```

これによってプラグインが消えたので、再度インストール

## プラグインの導入方法
プラグインは現在2つ

- [crowi-plugin-lsx](https://www.npmjs.com/package/crowi-plugin-lsx)
- [crowi-plugin-pukiwiki-like-linker](https://www.npmjs.com/package/crowi-plugin-pukiwiki-like-linker)

入れ方は簡単

```batch
yarn add growi-plugin-lsx
```
2019/10/10追記）
と思ったら「1.3.9」しか入らなかった。
package.jsonでgrowi-plugin-lsxの3.0.0を指定して
```batch
yarn add growi-plugin-lsx
```
で入った

## 検索フォームの追加
記事量が多くなってきたので検索フォームを追加した。
### Elasticsearchをインストール
[この記事](https://qiita.com/kijtra/items/9a5e12ae01fb81fba5fb)を参考にした

1. Elasticsearchを[ここから](https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.5.zip)取ってくる（バージョン5系でないと動かない）
2. 適当に解凍して適当なフォルダへ
3. `config/elasticsearch.yml`に`network.host: [サーバIP]`を追加
4. サービスの登録と起動
5. プラグインのインストール

```batch
REM サービス登録
D:\elasticsearch\bin>elasticsearch-service.bat install
REM analysis-icuのインストール
D:\elasticsearch\bin>elasticsearch-plugin.bat install analysis-icu
REM kuromojiのインストール
D:\elasticsearch\bin>elasticsearch-plugin.bat install analysis-kuromoji
REM サービス起動
D:\elasticsearch\bin>elasticsearch-service.bat start
```
ついでにサービスは自動実行に設定しておくといいかも

### 環境変数に追加

```batch
setx ELASTICSEARCH_URI http://[サーバIP]:9200 -m
```

### crowi-plus側の設定
再起動後、`管理`=>`検索管理`画面で`Build Now`をクリックしてインデックスを作成する


## まとめ
いろいろはまったけど、少しずつ便利になってきた。
またほかのプラグイン等導入したら追記していく
Rustでも(そこそこ)安全なグローバルインスタンスを使いたい

同じ記事を別のカレンダーに登録できないことに気づいて必死にネタを探しました。

うちのソフトウェアで必要に駆られて製作した[appinstance](https://crates.io/crates/appinstance)クレートを少し前に切り出して正式にpublishしたのでその紹介です。

## つかいかた

appinstanceは主にアプリケーションの実行と同じライフタイムを持つ唯一のオブジェクト(つまりシングルトン)を定義するためのライブラリです。
appinstanceの実態はひとつのマクロなので、利用は次の一行を追加するだけでおしまいです。

```rust
AppInstance!(pub static instance: SelfObject = SelfObject::new());
```

## staticとDrop

Rustにはすでに`static`というキーワードが存在しており、これを使うとアプリケーションと同等のライフタイムを持つデータを定義することが可能になっています。ただしこの定義はコンパイル時の定数を必要としており、`HashMap`やその他複雑な初期化を必要とするオブジェクトをstatic変数に持つことは難しい問題でした。
ここで、現在は[lazy_static](https://crates.io/crates/lazy_static)を用いて解決する方法がとられると思います。これもマクロを提供するライブラリで、名前の通り遅延して評価されるstatic変数を定義するものです。その実体は、ポインタと`Once`のペアの構造体で、初期状態ではポインタに0が格納されており、`deref`が呼ばれると`Once`により初期化処理が一回だけ実行される、というものになっています。

lazy_staticを利用することでおおむねstaticがらみの問題は解決するのですが、lazy_staticにも難点があって、それは`Drop::drop`が実行されないという点です。ウィンドウシステムを利用するプログラムなどでRAIIを実装している場合、dropに重要な処理が書かれている場合があるので問題となることがあります。
ここでAppInstanceの出番になります。AppInstanceでは遅延して初期化すると同時に`libc::atexit`にdropの処理を登録するようになっていて、これのおかげで(正常に終了すれば)**生成と逆順に**dropが呼ばれるようになります。dropの順番も定義されているので順番が重要なオブジェクトの解放も行うことが可能です。

## 欠点

AppInstanceはimmutableな参照しか返さないので可変である必要があるデータはAppInstanceにできないのですが、`static mut`がunsafeなのとCell/RefCellを使えば実現できなくもないのでこの用途のサポートはしないつもりです。

## 参考

[rust - How do I create a global, mutable singleton? - Stack Overflow](https://stackoverflow.com/questions/27791532/how-do-i-create-a-global-mutable-singleton)
Python インストール

#インストール
Ubuntuは作業の必要なし。
プリインストールされているので、最初から使えます。
最小限の確認手順は下記のみ。

```
# python -V
Python 2.7.12
```

対話型シェルで動作確認する場合は下記でできます。

```
# python
Python
>>>print 'Python'
Python
```
Ctrl+Dでシェル終了。

以下は利用している環境確認とVersion3の追加、使い分けを記載します。

#インストール環境
CPU：64bit
OS：Ubuntu / OSバージョン：随時最新

補足：CPU確認方法

```
# uname -m
x86_64
```

補足：OSバージョン確認方法

```
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
```
その他Linux系はyumなどでインストールしたり、ソースからコンパイルしたりします。
Windwosは[Pythonのサイト](https://www.python.org)にインストーラがあります。

#バージョン2と3の使い分け
##バージョン3のインストール

```
# apt install python3
# python3 -V
Python 3.5.2
```
##バージョン2と3の使い分け

```
# python2 xxx.py
```
補足：python xxx.pyとした場合はバージョン2が動作します。

```
# python3 xxx.py
```

#インデックス

次回：[pyファイルの書き方](https://qiita.com/billy-attack/items/8487eb282727d4834230)

[Topのインデックスに戻る](https://qiita.com/billy-attack/items/89e410a4a218a09b89c4)
全角入力のままノーマルモードに戻ってもすぐコマンド打てるよ: Vim

# 目的
何が何でも全角入力してノーマルモードに戻っても、IMEを切り替えるコマンドを押さずにすぐコマンド打ちたい

# 設定ファイル
```json:FromEscapeToJapanese_eisuu.json
{
  "title": "Terminal等でESCあるいは^[で日本語入力を英数に",
  "rules": [
    {
      "description": "TerminalまたはMacVimでESCあるいは^[を押したときに日本語入力を英数に切り替える。",
      "manipulators": [
        {
          "type": "basic",
          "from": { "key_code": "escape", "modifiers": { "optional": [ "any" ] } },
          "to": [ { "key_code": "japanese_eisuu" }, { "key_code": "escape" } ],
          "conditions": [ { "type": "frontmost_application_if", "bundle_identifiers": [ "^com\\.apple\\.Terminal$", "^org\\.vim\\.", "^com\\.googlecode\\.iterm2$" ] } ]
        },
        {
          "type": "basic",
          "from": { "key_code": "close_bracket", "modifiers": { "mandatory": ["left_control"] } },
          "to": [ { "key_code": "japanese_eisuu" }, { "key_code": "escape" } ],
          "conditions": [ { "type": "frontmost_application_if", "bundle_identifiers": [ "^com\\.apple\\.Terminal$", "^org\\.vim\\.", "^com\\.googlecode\\.iterm2$" ] } ]
        }
      ]
    }
  ]
}
```

# 手順
まずこれに沿ってください
しかし、リンク先の設定ファイルのままだと最新は動かなかったので、設定ファイルは上記のをコピペしてください
それだけです
https://qiita.com/takaeda/items/38ecf7d98d1a3ef99ef0

# 最後に
Karabinerよ、よくSierraにも対応してくれた。。。。！！！
try{} catch(){} をおさらいした

#まず
なんとなくtry-catchは全ての関数でしなくてはいけないものという勢いで思ってソース中に書きまくっていたけど、ちょっと調べてみた。
※そもそもtry-catch文が必要な処理なのか？　無しで済むようなコードを書くべき　
　とかは置いておきます。
　どいうとき使ってどういうとき使わないとかあまりわからないし、追って勉強する

#普通に
```js
try{
  throw new Error("エラーだよ")
}catch(e){
　console.log(e)//エラーだよ
}

```

まあ、これは普通にこうなりますよね。

#次に
```js
var a = function(){
  try{
    throw new Error ("aのエラーだよ")
  }catch(e){
    return 
  }

}

var b = function(){
  throw new Error ("bのエラーだよ")
}

try{
  a()
  b()
}catch(e){
　console.log(e)//bエラーだよ
}

```
aのエラーはaの中でキャッチされているので平文のtry-catchでは取れません。
bのエラーはキャッチしてないので例外が取れました
ちなみに呼び出された関数が呼び出した関数の例外も取れます。

```js
var b = function(){
　c()
}

var c = function(){
  throw new Error ("cのエラーだよ")
}


try{
  b()
}catch(e){
　console.log(e)//cエラーだよ
}

```

#requireしても
```thr.js
  a = function(){
    throw new Error ("requireされたaのエラーだよ")
  }
  module.exports = a 

```
```js
　var thr = require("thr")
  
  try {
    thr.a() 
  }catch(e){
    console.log(e)　//requireされたaのエラーだよ
  }

```
大丈夫！

#結果
requireしようが関数が呼び出されようが、見えないだけで、そこにコードが埋め込まれていると思えばその通りな話ですね
たぶんエンジニアの諸先輩方には常識なんですが、こんなことも知らなかった自分が情けない・・・
VimでPHPの開発環境をサクッと整える

この記事は [Relux AdventCalendar](https://qiita.com/advent-calendar/2017/relux) 15日目の記事です。

普段、複数の環境（例えば、PHPとRuby、PHPとgolangなど）で開発を行う場合、
IDEだとPHPStormや、RubyMineなど、各開発環境に応じてエディタを切り替えて利用することになり、
手間に感じることが多々あります。

ただし、Vimを使っていればこういったスイッチングコストはゼロでコーディングを行うことが可能です。

そこで、VimでPHPの開発を行う際に、プラグインを使わなくても、ちょっとだけ楽ができる設定をいくつかご紹介したいと思います。

## インデントの設定をする

プロジェクトや言語によってコーディングルールのインデント幅が違ってきたりします。
毎度、設定するのは面倒なので、ファイルの拡張子によって自動で切り替えられるようにしておきます。

```vim
augroup vimrc-filetype
  autocmd!
  " PHPだったらインデント幅が４で
  autocmd BufNewFile,BufRead *.php set filetype=php
  autocmd FileType php setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4

  " Rubyだったらインデント幅は2にしたい
  autocmd BufNewFile,BufRead *.rb set filetype=ruby
  autocmd BufNewFile,BufRead *.ruby set filetype=ruby
  autocmd FileType ruby setlocal expandtab tabstop=2 softtabstop=2 shiftwidth=2
augroup END
```

## PHP lintを使う

PHPのlintも[php7cc](https://github.com/sstalle/php7cc)や[phan](https://github.com/phan/phan)など色々ありますが、ここではPHP標準の機能を使ってみます。
PHPでコマンドラインからシンタックスチェックを行うには下記のコマンドです。

```bash
$ php -l <filename>
```

ただし、これをコマンドラインから毎度叩くのは手間なので、下記のような設定をしておきます。

```vim
function! s:PHPLint()
  let s:result = system('php -l ' . bufname(""))
  let s:count = split(s:result, "\n")
  echo s:result
endfunction

augroup php-lint
  autocmd!
  autocmd BufWritePost *.php call <SID>PHPLint()
augroup END
```

こうすることで、カレントバッファを保存するタイミングでシンタックスチェックを行なってくれます。

## universal-ctagsを使う

プロジェクトのサイズがそれなりになったり、フレームワークの仕様を確認したい場合など、
コードリーディングを行う場面は頻繁に訪れます。
[universal-ctags](https://github.com/universal-ctags/ctags) [^1] を使ってtagsファイルを作成しておけば、
クラス名や、メソッド名等でジャンプでき、コードリーディングが捗ります。
tagsファイルを生成するには下記のコマンドです。

```bash
$ ctags -R
```

ただし、これをコマンドラインから毎度叩くのは手間なので、下記のような設定をしておきます。 

```vim
function! s:generateCtags()
  let s:options = readfile('/path/to/.ctags') "ctagsの設定ファイルへのパス
  let s:command = [
    \'ctags',
    \'-f',
    \'/path/to/tags', "tagsファイルへのパス
  \]
  let s:command += s:options
  call job_start(s:command)
endfunction
nnoremap <silent> <Leader>gt :<C-u>call <SID>generateCtags()<CR>
```

これで任意のタイミングでtagsファイルを生成できます。
また、gitのフックを利用してclone時などに生成するようにしたりしておくと、さらに便利かもしれませんね。


こんな感じでVimなら、普段触れていない言語でも必要に応じて開発環境を気軽に整えることができるでしょう。

[^1]: 本家である[ctags](https://sourceforge.net/projects/ctags/files/ctags/5.8/)は更新が滞っているようなので、最近はuniversal-ctagsの方を使っています。
【C++】boost::program_options でerrorをcatchする時にオプション名を表示させる

C++でプログラムを書く時、boost::program_optionsを使ってコマンドライン引数を受け取る時の話。
3種類のオプションを同時に読み込む時、

```cpp
using namespace boost::program_options;

variables_map &values;
...(中略)

try {
      val1 = values[optname1].as<int>();
      val2 = values[optname2].as<int>();
      val3 = values[optname3].as<int>(); 
 } catch(const boost::bad_any_cast& e) {
      std::cout << e.what() << std::endl;
      exit(0);
 }
```
でtrycatchしてると、受け取った型がおかしい時に
`boost::bad_any_cast: failed conversion using boost::any_cast`
とエラーが返る。
でもこれだとどのオプションがエラーを吐いたのかわからん。

それを解決する関数を作ったよ。

```cpp
template <class T>
T getVal(const variables_map &values, const std::string &optname)
{
  try {
    return values[optname].as<T>();
  }
  catch (const boost::bad_any_cast& e) {
    std::cout << "option --"<< optname << ": "<< e.what() << std::endl;
    exit(0);
  }
}
```

これで、
`val1 = values[optname1].as<int>();`
の代わりに
`val1 = getVal<int>(values, optname1);`
とすればエラーを吐いた時にオプション名も表示してくれる。

もっといい方法があるだろ、とか、コマンド引数の受け取りにBoost なんて使うなよ、みたいのがあったら教えてくだちい。
好きなものはピニャコラーダ

Googleで「好きなものはピニャコラーダ」と検索した結果
![好きなものはピニャコラーダ.PNG](https://qiita-image-store.s3.amazonaws.com/0/109315/7995a01e-c910-3d42-267b-011e6c625a48.png)

複数の会社のページがヒットします。
昼間はバイク便のメッセンジャーで働いていたり、通り雨に濡れるのが好きな会社さんなのでしょうか？

これはWordPressをインストールした際、デフォルトで作成される固定ページのサンプルテキストです。
俳優志望だったり、ジャックというかわいい犬を飼っている人以外は、
WordPressでサイトを構築する際は消し忘れないように気をつけましょう。
データベースのテストに抵抗するで🤜🤛

# データベースのテストに抵抗するで🤜🤛

なんか色々書こうと思ったけど時間がなかったで…

## 先人の知見

とりあえず、アプリケーションではなくデータベース自体のテストが必要になったときに調べたことを少し書く。

### どうするべきか？という観点

- [Database Testing: How to Regression Test a Relational Database](http://www.agiledata.org/essays/databaseTesting.html)

### データベーステストにXUnit系の方式を導入するときの問題点

要はオブジェクト指向型のソースコードベースのテストじゃなくて、SQLベースでテストしようぜという話

- [What's wrong with xUnit](http://dbfit.github.io/dbfit/docs/whats-wrong-with-xunit.html)

> The problem with xUnit-like database testing tools is that they require too much boilerplate code.
   I could never get database developers to really use them when no one was looking over their shoulders.
   Writing tests was simply seen as too much overhead. All the buzz about object-relational mismatch over the last few years was mostly about relational models getting in the way of object development. This is effectively the other side of the problem, with object tools getting in the way of relational testing.

xUnit系のデータベース試験ツールの問題点は、たくさんのボイラープレートコードを書かなければいけないということだ。わたしは、職場でDBエンジニアの肩越しにモニターを見たときにこれらのツールを実際に使われるところを見たことがない。テストを書くことは単純にオーバーヘッド（※その処理の本質ではないこと）になりすぎる。ここ最近でネットでバズっていた、オブジェクトと関係テーブルのミスマッチの問題というのは、関係テーブルというモデルがオブジェクト指向の開発のやり方の妨げになるということである。これは問題のもう一つの側面であり、逆に言えばオブジェクト指向的なツールは関係テーブルの試験の妨げになる。

>FIT testing framework, on the other hand, does not suffer from that mismatch.
   FIT is an acceptance testing framework developed by Ward Cunningam, 
   which is customer oriented and has nothing to do with database unit testing whatsoever.
   But FIT tests are described as tables, which is much more like the relational model than Java code.
   FIT also has a nice Web-wiki front-end called FitNesse,
   which allows database developers to write tests on their own without help from Java or .NET developers.
   DbFit utilises the power of these two tools to make database tests easy.

FIT testing frameworkは対照的に、このミスマッチで苦しむことはない。FITはワード・カニンガムによって開発された受入テスト用のフレームワークである。これは顧客指向でデータベースの単体テストとは何の関係もない。しかし、FITのテストはテーブルとして記述される、これはJavaのコードというよりはもっと関係テーブルというものに近い。FITはFitNesseというWikiスタイルのフロントエンドをもっている。これはDBエンジニアがJavaや.NETの開発者の助けを借りずに自分自身でテストを書くことが可能になるということだ。DbFitツールはこれらの２つのツールを使ってデータベースの試験を簡単にする。

### 具体的にやっていく

- [DbFit](http://dbfit.github.io/dbfit/index.html)
    - [Writing Tests](http://dbfit.github.io/dbfit/docs/writing-tests.html)

こんな感じでかけるらしい

```
!|insert|source   |
|col1   |col2|col3|
|val1   |val2|val3|

|execute procedure|some_procedure|
|param1           |param2        |
|val1             |val2          |

|query   |select * from target|
|col1    |col2    |col3       |
|exp_val1|exp_val2|exp_val3   |
```
MacのFinderが重い時の対処

以下をterminalで実行する

```
rm ~/Library/Preferences/com.apple.finder.plist&&killall Finder
```

Finderを起動した後、設定がデフォルトに戻っているので、以下を設定。

## 隠しファイルを表示する

[command] + [shift] + [.(ドット)]  を同時押し

## タブバー表示

[command] + [shift] + T を同時押し

## ステータスバー表示

[command] + [/] を同時押し

## パスバー表示

[command] + [option] + P を同時押し

## フォルダ、ファイル名のテキストサイズ変更

[command] + J  で表示オプションを表示し、テキストサイズを選択する
Adobe XDを使ってみた話

はじめましてこんにちは。
SC AdventCalendar 2017　14日目の投稿です!!

アドベントカレンダーとは何ぞやという感じだったのに参加してしまいました。
初めて投稿するので見づらいところがあるかもしれませんがご了承ください。

#自己紹介
名前：入社2年目SE見習いプログラマです。
職歴：N*M(マニュアル改修) ⇒ Z*B(Java) ⇒ T*C(帳票) ⇒ I*A(C#) ⇒ U*N(Java)←ｲﾏｺｺ
　　　Javaやる機会が多いです。
悩み：最近一人飲みに行き過ぎて3キロ太りました(´･ω･｀)　最近ハマってるのはガード下のやきとん屋さん。
趣味：イラスト　 ↓最近の習作（宝石の国ハマってます）
![phos.jpg](https://qiita-image-store.s3.amazonaws.com/0/215581/acb0d98d-f1a4-27f5-ce0e-e675ff362968.jpeg)

最近趣味が高じて(?)社内アプリのデザインとフロント開発をやらせて頂く機会がありました。
その名もSekiPa。奇妙な椅子のあいつを描いたのは私です。

モックアップを作成する際に最近windowsに対応した**AdobeXD**を使いました。
あまり業務で使う方はいらっしゃらないと思うので使ってみた所感を共有しようと思い、投稿に至りました。

#AdobeXDとは
AdobeXDの正式名称はAdobe Experience Designでその名の通りUXのデザインツールです。
初めはMac限定で日本語版が配信されていたのですが
昨年12月よりwindows10版が配信され、続々とアップデートされています。

#主な機能
AdobeXDには主に2つのモードがあります。**デザインモード**と**プロトタイピングモード**です。

###デザインモード
まあそのまんまなんですが画面のデザインが出来ます。
![Qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/215581/69ea782f-6459-1c1b-b201-fdf71e87ecfc.png)
アートボードを作成してその上に画面のデザインを作成していきます。
アートボードのサイズはプリセットから選ぶことが出来、スマホ・タブレット・web用に
いろんなサイズが用意されています。もちろんカスタムも可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/d096c901-de8d-592e-17e1-3ab956eab47b.png)
これはチュートリアルなんですが長くするとスクロールできます。
こんな感じで複数画面を配置して、デザインしていきます。

###プロトタイピングモード
デザインモードで作成した画面の遷移や動きを設定し、プロトタイプを作成することが出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/5c4278de-7451-fcf9-c25f-2ef52d88322a.png)
どこをクリックしたらどの画面に遷移するのか、このワイヤみたいなもので設定します。
遷移のアニメーションもつけることが出来ます。

以上が主な2つの機能です。

#触ってみて思ったこと
SCではあまりデザインとかしないと思うのでエンジニアにとってどうか、という部分に絞ります。
###いいなと思った点
####①軽い
Adobe製品ってすごく起動遅かったりしてイラつくこと多いんですが、すごく起動早いです。
沢山アートボードを設置したりレイヤを重ねたりしてもフリーズしたりせず、
サクサク動いてくれます。
####②学習コストが低い
そう機能も多くないですし、ツールもExcelやペイント等にあるような直感的なものなので
チュートリアルを少しやれば、デザインセンスに自信が無くても誰でも爆速で
リッチでいい感じのモック作れると思います。
UIキットもあるので、わざわざ作らなくていい部品も多いですよ。↓これはiOSのUIキットです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/66753402-d071-134a-cc01-c28b00d638e2.png)

####③共有が簡単
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/76ee3229-a07c-129e-3d6d-eaad5d1e323d.png)
ちゃちゃっとリンクを作成しオンラインでプロトタイプを共有することができます。
離れた場所にいても見た目と動きのイメージ共有しやすいですし、
共有⇒指摘⇒修正⇒共有⇒合意の時間が短縮できると思います。
ちなみに⇒[SekiPaで作ったモック](https://xd.adobe.com/view/227f6297-316e-4a59-87af-b0100c2a1a96/)

###残念な点
####①HTML書き出しが出来ない
私の最大の勘違いでSekiPaの皆さんにはご迷惑おかけしたのですがHTML・CSS書き出し出来ません。
UIデザインツールの中には出来るものも多いので、書き出し出来るようになればより作業効率化に
つながりそうです。
####②足りない機能もまだ多い
まだベータ版リリースから時間もそう経っていないためwindows版の機能はmac版に比べて少なめです。
横スクロールが出来ないとか、複数ファイルをタブで開けないとか...地味に困ります。
公式サイトで欲しい機能等をリクエストすることもできますので、今後のアップデートに期待です。
####③買い切りできない
AdobeXDはAdobe Creative Cloudサービスに含まれているのでサブスクリプション契約しかできず
継続的に費用がかかってしまいます。単体プランなら月1,180円です。

#最後に
折角最新のツールを使わせて頂いたので少しでもAdobeXDがどういうものか共有できていたら幸いです。
先ほども書きましたが、SCではあまりUI/UXのデザインをする機会はないかもしれませんが
いざというときの選択肢の一つになればよいなあと思います。
AdobeID(登録無料)があれば7日間体験版を使用することが出来ますので、
興味を持った方はぜひ、チュートリアル等体験してみてはいかがでしょうか！
UIテスト自動化をやってみるで🤜🤛

# UIテスト自動化をやってみるで🤜🤛

もちろん俺らは抵抗するで？ 自動化で

WEB画面を自動でテストするツールは世の中にいろいろ出ていますが、その中でもTestCafeと呼ばれるツールを使ってみました。

- [TestCafe - A node.js tool to automate end-to-end web testing](https://devexpress.github.io/testcafe/)

値段的には１開発者につき一年で499ドル（＝5万円）ぐらい。

- [Buy & Licensing: TestCafe| DevExpress](https://testcafe.devexpress.com/buy/)


とりあえず以下をやっていきます。

- ブラウザ上で実行されるWEBシステムの動作テスト（工程的には結合試験レベル）
- Amazon Linux上でのTestCafe実行
- JenkinsによるTestCafe自動実行


## TestCafe導入とテストケース作成

- TestCafeのクライアントを用意してインストールしておく
- テストを作成したらjavascriptで書かれたスクリプトができるのでGitに登録する

## CI連携

- テストケースの版数管理を行う
- Gitなどに作成したTestCafeのソースを入れておく

Jenkinsへの設定作業は [Integrating TestCafe with Jenkins CI System](https://devexpress.github.io/testcafe/documentation/recipes/integrating-testcafe-with-ci-systems/jenkins.html)　を見ればわかるので、そこで躓いたところだけ拾っていこうと思います。

### TestCafe使用の前準備

#### npm / nodejs のインストール

- [パッケージマネージャを利用した Node.js のインストール](https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-debian-ubuntu-linux) から

```sh
$ sudo apt-get update
$ sudo apt-get upgrade
$ curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
$ sudo apt-get install -y nodejs node-gyp
 
// 古いライブラリは "node" コマンドで動こうとするのでエイリアスを作っておく
$ sudo ln -s /usr/bin/nodejs /usr/bin/node
 
// npm本体をアップデートしておく
$ sudo mkdir -p /usr/local/lib/node_modules/npm
$ sudo npm install npm -g
```

#### npmがインストールできたらchromeを入れる

- [EC2 UbuntuでGoogle Chromeをヘッドレス実行してスクリーンショットを採取する手順](https://qiita.com/shinsaka/items/37436e256c813d277d6d) から

```sh
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo dpkg -i google-chrome-stable_current_amd64.deb
 
// 一発では入らないので依存モジュールを入れる
$ sudo apt update
$ sudo apt -f install -y
```

### TestCafeの設定

- npm で testcafe 本体をインストールすること

```sh
$ npm install testcafe testcafe-reporter-xunit
```

- ブラウザとしてchromeが使えないと、テスト実行に失敗する、以下をチェック

```sh
$ node_modules/.bin/testcafe -b
chrome
```

- 実行！

```
$ node_modules/.bin/testcafe chrome test.js -r xunit:res.xml
```

### トラブルシューティング

- `TypeError: Cannot read property 'Date' of undefined`
    - アスタリスクでテスト対象を指定すると、ライブラリを巻き込んでテスト実行されるので、きちんとテスト対象をディレクトリに分けること
    - 参考：[Implement builds of Docker images (closes #1141) #1197](https://github.com/DevExpress/testcafe/pull/1197)

- `ERROR Unable to establish one or more of the specified browser connections`
    - Xサーバが立ってないと画面表示がなくて正常に動作しない
    - 参考：[ERROR Unable to establish one or more of the specified browser connections #1133](https://github.com/DevExpress/testcafe/issues/1133)

結局以下のようなコマンドで、まずXを起動させて実行してみた

```sh
# サーバ内でXのサーバを起動させつつTestCafe起動
xvfb-run --server-num=99 --server-args='-ac -screen 0 1024x768x16' node_modules/.bin/testcafe chrome test.js -r xunit:res.xml
```
Windows 7のWindows Updateが失敗する場合の対策(2017年12月版)

「Windows Update」コントロールパネルの「更新プログラムの確認」を押した所、
>現在サービスが実行されていないため、
>Windows Updateで更新プログラムを確認できません。
>コンピュータの再起動が必要な可能性があります。

![disablewuauserv1.jpg](https://qiita-image-store.s3.amazonaws.com/0/156988/1e4a2768-7de5-b151-1ccb-4caac237c39c.jpeg)

と表示され実行できない場合の対応です。
以下の順に試してみてください。それぞれの段階のうち、どれかで元に戻るかもしれません。

#サービスの起動確認(Windows7)
(1)スタートメニュー→コンピューターを右クリック→管理をクリック
(2)「コンピューターの管理」で左ペインの「サービスとアプリケーション」を展開し「サービス」をクリック
(3)中ペインから「Windows Update」を探しサービスが起動されているか確認する

#Windows Update トラブルシューティング ツールを利用する
https://support.microsoft.com/ja-jp/help/4027322/windows-update-troubleshooter
からダウンロードして起動する

#%Windir%\SoftwareDistribution\WuRedirを初期化する
http://www.atmarkit.co.jp/ait/articles/1712/06/news032.html
を参考に
(1)スタートメニュー→すべてのプログラム」→「アクセサリ」→コマンドプロンプトを右クリック→「管理者として実行」
(2)以下を実行

```
net stop wuauserv
ren %Windir%\SoftwareDistribution SoftwareDistribution.old
rd %Windir%\SoftwareDistribution.old /S
wuauclt /detectnow
wuapp
```
(3)WindowsUpdateを試してみる。実行できなければ、WindowsUpdate画面の左ペインの「設定の変更」から一度変更して元に戻してみる
AWS CLIのメリットや使いどころ

AWSの設定・操作はブラウザから行っている方が大半だと思いますが、
今回はコマンドラインからAWSの操作が出来る「AWS CLI」にフォーカスして、
AWS CLIを触って1週間の素人が、メリットや使いどころを紹介していきます。

- 普段AWSを使っているけど、AWS CLIは触ったことがない
- AWS CLIを触ったことはあるが、活用しきれていない

こんな方にとって、少しでも参考になれば幸いです。

# AWS CLIとは
Amazonさんの紹介文章を引用します
>サービスを管理するための統合ツールです。ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから複数の AWS サービスを制御し、スクリプトを使用してこれらを自動化することができます。
https://aws.amazon.com/jp/cli/

手元のパソコンに「AWS CLI」というものをインストールすれば、
コマンドラインからAWS各サービスの制御が出来るよ、というものです。
Pythonが入っていれば、このコマンドだけでインストール出来ちゃいます。

```
$ sudo pip install awscli
```

「AWS CLI」を導入すれば、通常ブラウザで操作しているような、
　・ローカルPCにある画像ファイルをS3にアップロードする
　・起動しているEC2インスタンスを停止する
こんなことがコマンドベースで行えます。

イメージをもう少し具体的にするため、S3へのファイルアップ方法を書いてみます。
ローカルPC上にこういうファイルがあったとします。

``` 
$ ls -l
-rw-r--r--  1 local_user  staff  0 12 14 07:47 access.log
-rw-r--r--  1 local_user  staff  0 12 14 07:47 error.log
```
試しにこの中のerror.logをS3にアップロードしてみましょう。
AWS CLIのコマンドは、アップしたいファイル名とアップ先のバケットを指定するだけ。

```
$ aws s3 cp error.log s3://otameshi201712
upload: ./error.log to s3://otameshi201712/error.log
```
この通り、error.logがS3上にアップロードされていますね。
<img width="957" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/100019/57bd8556-d4b8-7b66-1ba6-21f61aa517f0.png">


# AWS CLIのメリットや使いどころ
ブラウザで出来る操作を、わざわざ「AWS CLI」を使ってやるメリットは何なのか。
ざっくり触った感想としては下記の2点で、
　・AWS上でやっている操作を自動化したい
　・AWS上のサービスと連携したツールを作りたい
「一定のルールに従ったAWS上の繰り返し作業をシェルスクリプト化出来る」点がメリットのように感じます。
「AWS CLI」を使ってEC2インスタンスを作成をすることも出来ますが、
設定することが多い＝コマンドの引数が多くて辛い。。。となってしまうので、
AWS各サービスの構築作業はブラウザ経由で、繰り返し作業が発生する際に、
「AWS CLI」の利用を検討するのが良さそうです。

# サンプルスクリプト

## 1.ログファイルをzip化してバックアップ
S3のlogsディレクトリに溜まっているログをzip化し、S3のbackupディレクトリにバックアップを取ります。
このスクリプト自体の実用性は低いですが、zip化する箇所を応用すれば、Adobe製品のスクリプトと組み合わせて、画像や動画加工も出来そうです。

```sh:backup.sh
#!/bin/bash

# S3からログファイルをダウンロード
aws s3 cp  s3://otameshi201712/logs ./temp --recursive

# ダウンロードしたログファイルをzip化
for LOG_NAME in ./temp/*.log
do
  zip $LOG_NAME.zip $LOG_NAME
  rm $LOG_NAME
done

# zip化したログファイルをS3にアップロード
aws s3 cp ./temp s3://otameshi201712/backup --recursive
rm ./temp/*
```

## 2.EC2／RDSインスタンスの立ち上げ・停止
EC2もRDSも従量課金なので、使わない時間帯は止めておくと節約できますね。
AWSのlamdaを使えば、定時間にインスタンスの起動・停止が行えますが、
これらのコマンドをまとめておくことで、任意のタイミングでコントロールができます。

▼インスタンス立ち上げ用

```shell:start.sh
#!/bin/bash
aws ec2 start-instances --instance-ids インスタンスID
aws rds start-db-instance --db-instance-identifier インスタンス名
```

▼インスタンス停止用

```shell:stop.sh
#!/bin/bash
aws ec2 stop-instances --instance-ids インスタンスID
aws rds stop-db-instance --db-instance-identifier インスタンス名
```

# まとめ
「AWS CLI」を使うことで、サービスや業務における効率化の幅が広がりそうですね。
導入もとってもカンタンなので、一度お試しあれ！
AzureでVMを起動してIPアドレスを表示するスクリプト

最近のAzure VM は Auto shutdown の機能があって、指定した時間に自動的にシャットダウンしてくれるので手軽にお金を節約できるのですが、IP アドレスも解放するので次に VM を起動するときは IP アドレスが変わっています。DNS を設定している場合は何も問題ありませんが、そうでない場合はIPアドレスを知る手間がかかります。

そういう野良 VM をお持ちの方向けに、VM を起動して IP アドレスを表示してくれるだけの俺得な書き捨てシェルスクリプトを公開します。まあこんなものでも誰かの参考になるかも知れないので。。。

# 環境

- bashが走る環境 (Unix/Linux/WSL/etc)
- Azure CLI (2.0以上)
- jq (`sudo apt install jq`等でインストール)

# スクリプト本体

```bash
#/bin/sh

VM=自分のVM名
RG=リソースグループ名
IPNAME=${VM}-ip

IPADDR=`az network public-ip show --name ${IPNAME} -g $RG | jq .ipAddress`

if [ x$IPADDR != xnull ]; then
  echo $IPADDR
  exit 0
fi

az vm start --name $VM -g $RG

IPADDR=`az network public-ip show --name ${IPNAME} -g $RG | jq .ipAddress`
if [ x$IPADDR = xnull ]; then
  echo Failed to start ${VM}.
  exit 1
fi

echo $IPADDR
exit 0
```

完全に自分用なので、VM 名やリソースグループ名はスクリプトに埋め込んで使ってます。引数から取りたければ `$1` とか `$2` に置き換えてください。エラー処理なんてしてません。

実行すると、VM が起動して IP アドレスがすでに割り当てられていたらそれを表示して終わります。そうでなければ VM をスタートさせ、起動するまで待ってから IP アドレスを取得して終わります。本当にそんだけ。あとはお好みで ssh や mstsc.exe 等の引数に与えてあげれば接続できます。

なお、当然ですが PowerShell 使っても同じ感じでできます。便利ですね。
SSH：configとDynamicForwardを使った多段sshでブラウザからアクセスする方法の備忘録

# configファイル記述例

```
Host proxy1
  HostName  xxx.xxx.xxx.xxx
  User      proxy

Host proxy2
  HostName  yyy.yyy.yyy.yyy
  User      proxy
  ProxyCommand ssh -CW %h:%p proxy1


Host goal
  HostName  zzz.zzz.zzz.zzz
  User      taro
  ProxyCommand ssh -CW %h:%p proxy2
  DynamicForward 1080

```



# switchyomegaの設定例


## プロファイルの設定
![profile.png](https://qiita-image-store.s3.amazonaws.com/0/107536/437744fe-2379-39df-f3ad-10ccc0f02001.png)


## auto switchの設定
![goal.png](https://qiita-image-store.s3.amazonaws.com/0/107536/6404f8f5-0296-1000-8750-6d83e91cf24f.png)


# TODO
* イメージ図を張る
アポスティーユの正体 (ntyファイル編)

NEMアドベントカレンダーの8日目に[アポスティーユの正体](https://qiita.com/44uk_i3/items/82a5446e48aea23e054b)という記事がありましたが、NEMのNanoWalletでアポスティーユした際にできるntyファイルから、NEMのアポスティーユの正体を追ってみようと思います。

## ntyファイルとは

NanoWalletでアポスティーユを作成すると、`NEMsigned -- Do not Edit -- yyyy-MM-dd.zip` というファイルが作成されます。この中身を展開すると、元ファイル(ファイル名にtxを付与されている)、証明書、そしてntyファイルの3つが入っています。
このうちntyファイルはJSON形式でアポスティーユした時のメタデータが格納されています。

## ntyファイルの中身

ntyファイルを開くと以下のようなJSONになっています。(※見やすいように整形しています)

```json
{
  "data": [
      {
		"filename": "multi sig private.txt",
		"tags": "multi sig private test",
		"fileHash": "fe4e5459835d24a43accf6f4362ee6280b1f2b54c8dea3769722ba9b4c41606ade7cde44295a9602a9c1db5dcce7f79612d1f5df92419244308046687e9ade942953a7590c",
		"owner": "NDJ2I2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
		"fromMultisig": "NCXIZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
		"dedicatedAccount": "NATZHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
		"dedicatedPrivateKey": "12d10eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
		"txHash": "8ee33eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
		"txMultisigHash": "3eb0feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
		"timeStamp": "Sun, 10 Dec 2017 03:48:33 GMT",
		"$$hashKey": "object:224"
	}
  ]
}
```

各要素は中身は以下の通りです。

* `filename`: アポスティーユしたファイルの元ファイル名
* `tags`: NanoWalletのアポスティーユ登録画面のタグ入力欄に入力した値
* `fileHash`: アポスティーユしたファイルのハッシュ値
* `owner`: アポスティーユしたアカウントのアドレス
* `fromMultisig`: マルチシグアドレスでアポスティーユした場合、そのアドレス。(マルチシグアドレスを使っていない場合、空文字)
* `dedicatedAccount`: 公証アカウントのアドレス。
* `dedicatedPrivateKey`: 公証アカウントの秘密鍵。(パブリックなアポスティーユなアポスティーユの場合、`None (public sink)`と表示される)
* `txHash`: アポスティーユをしたときのトランザクションハッシュ
* `txMultisigHash`: マルチシグアドレスでアポスティーユした場合したときの、マルチシグアドレスで生成したトランザクションハッシュ
* `timeStamp`: アポスティーユをした時のタイムスタンプ

## 考察

[アポスティーユの正体](https://qiita.com/44uk_i3/items/82a5446e48aea23e054b)の記事と照らし合わせて見ると分かるのですが、`filename`、`tags`はNEMのブロックチェーン上には保存されていません。

アポスティーユには、共通の公証アカウントを用いるパブリックと、公証アカウントを個別に生成することで譲渡・分割可能にするプライベートの2種類あります。プライベートの場合のみ、`dedicatedPrivateKey`が表示されています。譲渡・分割可能なプライベートのアポスティーユは公証アカウントをマルチシグ化して、マルチシグアドレスに属する人の追加、削除によって権利を保持するアカウントの移動を実現させています。
※公証アカウントの秘密鍵は初期状態ではマルチシグ化されていないため、プライベートのアポスティーユの証明書を公開するときはその部分を隠すなど注意してください。

ntyファイルを追ってみることによって、アポスティーユがNEMのエコシステムを上手く利用してできているのか、理解が進みました。
個人的にはパブリックなアポスティーユはともかく、譲渡・分割可能なアポスティーユは概念はよいのですが、NanoWalletのUXはかなり使いづらいので、この辺を上手く工夫したらもっと使われるのではないかと思っています。
統計学 ~第１種の誤りと第２種の誤り~

# 定義

ある母集団に対して統計学的仮説検定を行う際、帰無仮説と対立仮説を次のようにおく。

```math
帰無仮説 : H_0\\
対立仮説 : H_1
```

このとき、

```math
H_0が " 真 " であるのに\\
H_0を " 棄却（reject） " してしまい\\
H_1を " 正しい " と判断してしまう過誤\\
→\;" 第１種の誤り "\;\;=α\;（有意水準）
```
<br>


```math
H_1が " 真 " であるのに\\
H_0を " 採択（accept） " してしまい\\
H_0を " 正しい " と判断してしまう過誤\\
→\;" 第２種の誤り "\;\;=β
```

といい、また

```math
H_0が " 真 " で ない とき\\
H_0を 正しく " 棄却（reject）" できる確率\\
→ " 検出力 "
```

として、

```math
(検出力)=1-β
```

とも表される。
技術同人誌を作ってみてよかったこと

# 技術同人誌を作ってみた背景
まずは簡単に、どうして技術同人誌を作るに至ったのか、というところからお話ししたいと思います。
[kintone](https://kintone.cybozu.com/jp/)という製品をもっと多くのエンジニアに知ってもうらうため、そしてビジネスツールとしての利用が多いkintoneの可能性を広げるために何かしよう！と考えていた時に、技術同人誌というもがあることを知りました。
商業誌と違い、ページ数の制約もなく、内容的にも実験的なことができるのが魅力的で、kintoneを題材とした技術同人誌を作ってみることにしました。
# やってよかったこと
## 売り手と買い手の距離が近い
売り手と買い手の距離がとても近いので、買ってくださる方も買わない方もどちらの反応もよくわかります。
反応がわかるだけなく、買い手にとっては、知りたいことなどを直接聞ける機会でもあるので、購入する/しないにかかわらず、会話をする機会が多いです。
その会話は、買い手と売り手（書き手）は同じ分野に何かしらの関心があるので、趣味が一致した人同士のように楽しいです。
## 仲間が増える/知ってもらえる
技術同人誌をきっかけに、一緒に技術同人誌を書いてみたいという方にも巡り合いました。「kintone×○○」の「○○」を増やしていきたいと考えていたので、嬉しい出来事でした。
kintoneを知らない、もしくは名前だけ知っているという方にも興味を持っていただけたのも良かったです。
## モノづくりは楽しい
エンジニアはモノづくりの楽しさ（大変さも？）を知っているので言うまでもないですが、物理的な本という形になったものを手にした時の喜びはひとしおです。そして売れた時の喜びはさらに大きいものでした。
## 紙の本へのニーズはある
技術書典3にて、同じブース内でkintoneではない技術同人誌の紙版と電子版も販売しました。電子版の方が安いにもかかわらず紙版を購入する方も多く、「電子版だと結局読まないから紙版を買います」と言って紙版を購入された方もいらっしゃいました。
必要な情報の多くはインターネット経由で入手できるようになりましたが、紙には紙の良さがある！と実感できたのもよかったことでした。
# まとめ
初めて技術同人誌を作って売ってみて、最初の1冊を手に取ってもらうまでは、どういう反応があるのか不安でした。しかし、技術書典や他のイベントに参加してみた結果、売れたり売れなかったりしますが、総合的に考えてメリットの方が多いと感じています。
MaxでDMX（照明）を動かす

# DMXはじめました
たまたま友達からDMX機材をもてあましていたようなので、コンピュータから照明とか動かしてみたかったのでやってみました。

結果
https://twitter.com/tatmos/status/940667182400204800
いろはすを光らせることができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/89beeaf3-9716-6fc5-bd0d-3abd47d20a79.png)

*神々しい・・・*

さらに
https://twitter.com/tatmos/status/940672319134973953
まわしたり、いろんな色で光らせたり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/560c8a05-b00c-032a-6e07-48e4a0865722.png)

# Maxのパッチ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/87c8765c-e7ba-f705-fbb1-17174e5fac12.png)

音の入力で、光の強弱をコントロールし、
閾値を超えたらランダムに色を選択するようにしています。
微妙な色変化はわかりにくいので、各色の８段階くらい荒く設定しています。

# dmxusbpro
このオブジェクトでDMXがだせました。
demo版だと2chまでしか扱えないので注意。

# ENTTEC
![IMG_5139.jpg](https://qiita-image-store.s3.amazonaws.com/0/96808/83daf4d0-40b2-de09-e1c0-5998c8fa87b3.jpeg)

USBからDMXに変換するもの
今回　DMXUSBPROを使いました。

OPENDMX USBの方が安いのですが、自分の環境ではうまく動作しませんでした。

# 環境
MacBookPro 15-inch, 2017 3.1GHz Intel Core i7 16GB
macOS Sierra 10.12.6
Max 7.3.4(de5a74a)(32-bit mac)

# ENTTECのドライバー
初回起動で結構手間取ったので備忘録。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/6ea64fcf-7c4b-674f-399a-69a9be9cd1c3.png)

ENTEC DMXUSB Proには
Pro-Managerというアプリがあって、初回にFirmwareのアップデートを行うのですが、
結構時間がかかるので、気長に待ちます。（30分くらい）

最初なかなか認識しなくて、かなり焦りました。（初期不良かと思うほど）
何回かrestoreやUpdate(1.44）をやったところ３回目くらいでうまく動くようになりました。

あと、FTDI系のドライバが必要なのかどうなのかよくわからないまま、インストールしたり外したりしていました。

最近のMacOSでは必要ないような感じですが、オープンな規格と合わせるのには必要なのかも・・・ちょっと詳細不明。
（過去にFTDI系でAppleが用意したものとコンフリクト起こしてたような記事が見つかるが、最新がどうなのか不明。とにかく問題を起こす古いドライバがもし何かしら入っていたら無効化なりする必要があるっぽい。）

# ちゃんと動作すると緑のライトが点滅する
![IMG_5140.JPG](https://qiita-image-store.s3.amazonaws.com/0/96808/07ae3a2e-a81b-b24e-bc2a-b964711de67d.jpeg)

認識して、DMX動作中はここが光る。

USBからデバイスとして見えていてもここが緑点滅とかしていないと正しく動いていない様子です。

# Maxでの接続
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/e84f0328-78b6-3ab3-3b82-0f1a2c8363bb.png)

```
open /dev/cu.usbserial-EN223676
```
この　openメッセージで接続する。

# ムービングヘッドLED
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/75db7b28-e617-9603-bdb9-45bd55734734.png)

LIXADAという名前がわかる。

9chモード（簡易）と11chモード（いろいろ）
が本体側の操作で選べる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/1d52324a-391d-3297-64ee-36adfe45f0e4.png)

今回は9chモード。
いろいろ動かせる。

Motor speedは255がもっとも遅い動作で、ゆっくり動かしたい時に上げるものみたい。
0にしても　光の反応のように瞬時に動き出すものでもない様子。

あと、
3ch目を134とかにしておかないとそもそも光らないようでした。　
この設定とRGBWの出力設定が掛け合わされているイメージでした。

# これなにに使う？

DMXはプロ向けの照明機材をコントロールする規格で、照明の制御やさまざまな舞台におくようなものが制御できます。

これ使ってゲームジャムやります。
2018 グローバルゲームジャムで光の演出ありのゲームができないかと思ってます。

1/26,27,28にCRI Shibuyaにて行います。

Global Game Jam 2018 CRI Shibuya - エフェクターミニハッカソン
https://effectorhack.connpass.com/event/74426/

ゲームで、照明とか新しいのでは。興味ある方はご参加　お待ちしております。

では。
Python3.6で導入されたフォーマット済み文字列リテラル(f'...')を使えばstr.format()より短く書ける

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の14日目です。

# はじめに

Python3.6でフォーマット済み文字列リテラル(f-strings)というのが導入されました。
他の言語で変数埋め込みとか、変数展開とか、式展開と呼ばれているやつです。
これを使うと`str.format()`を使わずに文字列中に変数の値や式を埋め込むことができます。

[str.format()]:https://docs.python.jp/3/library/stdtypes.html#str.format
[書式指定文字列の文法]:https://docs.python.jp/3/library/string.html#formatstrings
[フォーマット済み文字列リテラル]:https://docs.python.jp/3/reference/lexical_analysis.html#f-strings

# 普通にstr.format()を使った場合

```py3
>>> a = 1
>>> b = 1.2345
>>> c = dict(key1=123)
>>> d = 'ABC'
>>> '{} {:.1f} {} {}'.format(a, b, c['key1'], d.lower())
'1 1.2 123 abc'
```

# フォーマット済み文字列リテラルを使った場合

```py3
>>> a = 1
>>> b = 1.2345
>>> c = dict(key1=123)
>>> d = 'ABC'
>>> f'{a} {b:.1f} {c["key1"]} {d.lower()}'
'1 1.2 123 abc'
```

フォーマット済み文字列リテラルでは文字列中の`{}`の中に変数や式を書くことができます。
`str.format()`と同様に書式指定も可能です。

これで`str.format()`よりだいぶ短く書くことができますが、シンタックスハイライトが対応していないとちょっとわかりにくいかも知れません。

# 参考

- Python3 ドキュメント
    - ライブラリーリファレンス
        - [str.format()]
        - [書式指定文字列の文法]
    - 言語リファレンス
        - [フォーマット済み文字列リテラル]
[メモ] ラズパイ: Debianのbackportsを利用する



# 概要
- Raspbianで、Debianのbackports使いたい、ってときに。
- よく忘れるので、メモっとく。


# 手順

```bash
# 鍵の追加 - ap-get updateで文句いわれたら、ウマいのを追加する。
sudo apt install -y debian-keyring debian-archive-keyring dirmngr
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553 7638D0442B90D010 EF0F382A1A7B6500

# https://backports.debian.org/Instructions/
# backports　レポジトリの追加
#
# jessie-backports
echo 'deb http://httpredir.debian.org/debian jessie-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/jessie-backports.list
#
# stretch-backports
# echo 'deb http://httpredir.debian.org/debian stretch-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/stretch-backports.list

# パッケージ情報更新
sudo apt update

# インストール (backportsレポジトリを指定)
sudo apt-get -t jessie-backports install phantomjs
```



# その他
- https://teratail.com/questions/104410 <br> Raspbian-jessieにphantomjs 2.1.1
Atomのパッケージをpublishする際に出たエラーのメモ

```
apm publish patch
```

でpublishしようとしたら

> Registering package in atom/mdnote repository failed: That repo does not exist, isn't an atom package, or you do not have access

と怒られた。

まず、package.jsonのrepositoryを存在するものに修正

> Registering package in shwld/mdnote-for-atom repository failed: That repo does not exist, isn't an atom package, or you do not have access

また怒られた。

githubのOAuthキーが消えていた?(消していた?)っぽくて
https://atom.io/ から一度ログアウトして、githubとのOAuthを再接続してみたら成功

### 次は

> remote: Invalid username or password.
> fatal: Authentication failed for 'https://github.com/shwld/mdnote-for-atom/'

とおこられた。

MFAを有効にしている場合は、https://github.com/settings/tokens で新しいトークンを生成して、passwordのかわりにそれを使えばいいということなので、試してみたら成功

終わり
StackBlitz で Angular のオンラインデモ環境を爆速で用意する

この記事は [Angular Advent Calendar 2017](https://qiita.com/advent-calendar/2017/angular) の14日目の記事です。

##  StackBlitz とは
[StackBlitz ](https://stackblitz.com/) とは、簡単に言うと、オンラインの VS Code です。少し前に [Medium](https://medium.com/@ericsimons/introducing-turbo-5x-faster-than-yarn-npm-and-runs-natively-in-browser-cc2c39715403) で紹介されて注目を集めています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/0e2d903a-cd5c-645c-1bfd-0a61b2868dee.png)

Angular と React 用のプロジェクトを作れるとのことで、早速使ってみました（もちろん Angular で）。良い点、悪い点を挙げてみたいと思います。

## 良い点
### Angular CLI ベースのプロジェクトを速攻で開始できる
上記の画像で Angular をクリックすれば、ものの数秒で開始できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/4f91b417-acb5-fe56-d835-3d24190983be.png)

### Angular CLI の `generate` 系コマンドを GUI 操作できる
左ペインの `app` フォルダで右クリックすると、下図のように、コンポーネントやモジュールなどの生成コマンドがコンテキストメニューに表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/0f638160-4a97-3720-3ab5-8dda5b22d648.png)

### 
### パッケージのインストールが速い！
作者曰く、5x 速いと言っています。そこまでの差があるかどうかは分かりませんが、試してみた感じ確かに速いことは間違いありません。

### 依存パッケージもインストールしてくれる
下の画像は `@angular/material` をインストール中の状態です。`@angular/material` が依存している `@angular/cdk` も一緒にインストールするか聞いてくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/ddf2d40f-42f3-5160-b2fb-97651bdc65f3.png)

### 共有が簡単
`SHARE` メニューをクリックすると、共有用のリンクが表示されます。Anglar CLI のプロジェクト構成のまま共有できるので、Plunker よりもいい感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/6182052e-e600-60bf-9f9f-0a4449c7f450.png)

- EDITOR URL：https://stackblitz.com/edit/angular-qwvyjy
- APP URL：https://angular-qwvyjy.stackblitz.io
- EMBED URL：https://stackblitz.com/edit/angular-qwvyjy?embed=1&file=app/app.component.html

### エクスポートもできる
`EXPORT` メニューをクリックずれば、Angular CLI プロジェクトとしてそのまま ZIP ダウンロードできます。ダウンロード後は解凍して `npm install` すればすぐに使えるようになります。

## 悪い点
### Angular CLI サポートがまだまだ
Angular CLI のコンフィギュレーション系が全然弱いです。

### Intellisense がいまいち
本家 VS Code ほどの快適さはありません。例えば `import {} from` と入力して `Ctrl+Enter` を押しても No suggestion と表示されてしまい、インストール済みのパッケージ名が一覧表示されません。他にも、テンプレートの入力でタグ候補が表示されなかったりします。

### Emmet が効かない
全く効きません。まだサポートされていないようです。

## まとめ
現状では、デモとか用には使えるものの、実際の開発では厳しいという印象です。Intellisense や Emmet が効かないのは致命的です。ただ、非常に面白い試みで、[Issue](https://github.com/stackblitz/core/issues) を見ていると今後が大いに楽しみです。

明日は [@mstssk](https://qiita.com/mstssk) さんです。よろしくお願いします。