OmniAICreator/Qiita-1.07M huggingface dataset:
MATLAB > NxM array > 比較 > y1とy2が異なるかを確認する > unique(y1 == y2) にて 0がある(異なる) > isequal() , ifでtrueが返される条件, all()

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

### 関連

[MATLAB > NxM array > 比較 > y1 == y2 | 行列なのかarrayなのか](https://qiita.com/7of9/items/484c3fe3ce8e41f0f1ca)

### 処理案

```matlab
>> y1 = [3 1 4; 1 5 9];
>> y2 = [3 1 4; 2 6 9];
>> y1 == y2

ans =

  2×3 の logical 配列

   1   1   1
   0   0   1
```

「変数1==変数2」の比較にて0が表示されると、「異なる部分がある」と分かる。
しかしながら、NxMの数が多い場合、0があるかどうかを調べるのは大変である。

以下とする。

```matlab
>> unique(y1==y2)

ans =

  2×1 の logical 配列

   0
   1
```

0がある場合、「異なる部分がある」と分かる。

### sphereptsコード使用

```matlab
>> [x0, tri0] = getIcosNodes(4,0);
>> [x1, tri1] = getIcosNodes_swap(4,0);
>> unique(x0 == x1)

ans =

  logical

   1
```

getIcosNodes_swap()はこちらで用意したコード。

[spherepts](https://github.com/gradywright/spherepts)というコードにおいて、freeBoundary()の結果に対してスワップした場合でも、最終的に得るものに相違はないことが確認できた。
freeBoundary()のNumpy実装において、三角形のインデックスセットの順番を厳密に再現しなくても良さそう。
https://qiita.com/7of9/items/ff6ca65cdf9973fb6a16


### 教えていただいた事項
(追記 2017/11/19)

@ozwk さんの[コメント](https://qiita.com/7of9/items/b3cad8affdcd386e1760/#comment-0e93f709e66b6fbb682c)にてisequal()を教えていただきました。

@ozw さんの[コメント](https://qiita.com/7of9/items/b3cad8affdcd386e1760/#comment-1d212f0d3f73f8309675)においてifでtrueが返される条件を教えていただきました。

@ozwk さんの[コメント](https://qiita.com/7of9/items/b3cad8affdcd386e1760/#comment-2afb51b149ec08b37ebd)において[all()](https://jp.mathworks.com/help/matlab/ref/all.html)の使い方も教えていただきました。

情報感謝です。
2G(PDC)時代のメール受信上限

2Gサービスは終了して何年も経っていた。

* 参考: http://hacker.trancebudo.com/2008/04/post_2.html

| キャリア | 送信 | 受信 | 備考 |
|:--|:--|:--|:--|
| ドコモ (FOMA) | 全角5000文字 | 全角5000文字 | |
| ドコモ (mova) | 全角250文字 | 全角250文字 |設定を変更することで全角2000文字まで8分割で受け取れる|
| au | 5000文字 | 5000文字 | |
| Softbank (J-Phone) | 不明 | 半角128文字 | 受信サイズを超えたらメールが届かない |
kintone Café などのユーザーコミュニティへのコミットについてのあれこれ

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

* [Qiita Advent Calendar について](https://help.qiita.com/ja/articles/qiita-adcal-1)

今年の６月からkintoneを使い出したところですが、技術的な面白さ、コミュニティの魅力も含めてもっとたくさんの方にkintoneを知ってもらえると良いなと思い、ユーザーコミュニティの魅力とコミットのすすめについて書いて見ることにしました。

#1.一歩を踏み出す（近くで開催のエンジニアイベントに行ってみる）
私の場合は2011年に浜松市で開催された[JAWS-UG浜松キックオフ](https://atnd.org/events/21291)でした。
今となってはそのイベントに参加した理由をどうしても思い出せないのですが、それまで自作PCでFreeBSDを入れてサーバーを立てて．．．とやっていた作業がAWSの管理画面から数クリックでサーバーが立ち上がることに衝撃を受けました。

そこから、そこで出会った方が主催するRubyの勉強会に参加するようになり、徐々に自分の興味のあるイベントに参加するようになりました。

#2.学び方（それを仕事にする）
新しいことにチャレンジするときは、それを仕事にしてしまうのが一番手っ取り早いやり方だと思っています。私の場合は新しいプログラミング言語を習得する場合、それまでに作ったシステムを新しい言語でプログラミングして置き換えたりして業務の中で習得してきました。
そういった環境があったことも事実ですが、やれることはいろいろあると思います。

#3.スピーカーになる（LTをやってみる）
勉強会の雰囲気に慣れたらぜひ登壇者として発表すると良いなと思います。
勉強会で学んだことをアウトプットする場と考えても良いですし、最近私はコミュニティに還元するという気持ちが大きくなってきました。そういう意味でもぜひスピーカーに名乗りを上げてみてください。

#4.運営側に立つ
kintoneを使うまではCybozuのプロダクトは使ったことが有りませんでした。
どちらかというとゴリゴリプログラミングする方が好きなので、”だれでも簡単に業務システムが作れる”kintoneには仕事といえどもモチベーションが上がらなかったのですが、APIを知って興味がわいて、kintone.proxyでもう何でもできる！とkintoneに夢中になっていきました。

それからkintoneのユーザーコミュニティのkintone Caféに参加して、出会った方に自分もkintoneの勉強会をやりたいんですと行っていたら、いつの間にか運営に参加することになりました。

#5.学び方再び
私のkintoneの学び方をまとめておきます。

- [cybozu developer network にメンバー登録する](https://developer.cybozu.io/hc/ja/articles/200929540#step2)
- [開発者ライセンスを取得する](https://developer.cybozu.io/hc/ja/articles/200720464)
- [APIドキュメントを眺める](https://developer.cybozu.io/hc/ja/articles/201941754)
- [kintoneAPIを使ってみる](https://developer.cybozu.io/hc/ja/articles/211029283)
- [cybozu developer コミュニティに参加する](https://developer.cybozu.io/hc/ja/community/topics)(投稿したり、投稿者にいいね！したりしてみる)

#6.最後に(kintone Caféへようこそ)
実はこの"kintone Advent Calendar 2017"に投稿することにしたのも、[来週開催のkintone Café](https://www.kintonecafe.com/activities/1413)で運営側として関わることになったこともあります。
みなさんもぜひお近くで開催される[kintone Café](https://www.kintonecafe.com/)に参加してみてはいかがでしょうか？
[自分用][随時更新]iOSのアーキテクチャ所感

自分へのメモ書きとして投稿

# MVP
Model View Presenter
Presenterがデータを保持する。
ViewControllerはPresenterの値を取得・利用する。
PresenterがViewControllerの参照を保持する。
それにより、データ更新が終わったときに保持したViewControllerの更新メソッドを呼ぶことで変更を反映できる。

# MVVM
Model View ViewModel
ViewModelがデータを保持する。
ViewControllerへのデータ変更の反映は、バインドしたViewModelから行う。
変数へ値をセットした時にdidSetが呼ばれ、バインドされているViewControllerのメソッドが呼ばれることで、
データ更新を反映できる。

# 参考サイト
https://qiita.com/tattn/items/d4b95af0b60c3849243a#mvvm
aws の ec2(amazon linux 2017.09.1) にて nginx + php-fpm(7.1) のメモリ使用率が徐々に増えていく現象に出くわした, Ansible で行った対策のメモ

## aws の ec2 にて、 nginx + php-fpm(7.1) の環境を構築したらメモリ使用率が徐々に上昇していく現象に出くわした。

で、対応したので、そのメモ。

生じた環境

- Amazon Linux AMI 2017.09.1 (HVM), SSD Volume Type - ami-2803ac4e
- nginx
- php-fpm(7.1)

調べたら https://qiita.com/bezeklik/items/7e1ac9e5da39261be7bd や http://s-tajima.hateblo.jp/entry/2015/02/20/233615 などにある、 slab_cache の問題だった。

原因は http://s-tajima.hateblo.jp/entry/2015/02/20/233615 にとても詳しく書いてあるので、そちらを参照して下さい。（参考になりました！ありがとうざいます！）

要は、 https へのリクエストを curl で行っている時に slab_cache(dentry cache) が溜まっていき、結果メモリが圧迫されるらしい。

上記環境にて稼働しているアプリケーションは Guzzle を用いて定期的に https へリクエストを出していた。

つまり、これが原因。

## 起きている状況の確認

dentry cache の使用状態を以下のコマンドで調べる。

```bash
$ sudo slabtop -o | grep dentry
```

おそらく、それなりに使用されてしまっているので、次に、以下のコマンドで dentry cache を開放する。

```bash
$ sudo sh -c "echo 2 > /proc/sys/vm/drop_caches"
```

再度、前述の `$ sudo sh -c "echo 2 > /proc/sys/vm/drop_caches"` で使用状況を確認し、 dentry cache が減っていることを確認する。

次に、 curl を用いて https へリクエストを出してみる。

今回は、 php スクリプトを呼び出すことで実現されるので、対象のスクリプトを呼び出した。

改めて、 `$ sudo slabtop -o | grep dentry` で確認すると、1回スクリプトを呼び出すたびに増えていくことが確認できる。

## 対策（Ansible 使いたかったのでその前提で。）

まず、上記の通り、以下のコマンドで dentry cache を削除しておく。(これは手動でやった。)

```bash
$ sudo sh -c "sync; echo 2 > /proc/sys/vm/drop_caches"
```

※ sync もしておく。

次に、 php-fpm に環境変数として `NSS_SDB_USE_CACHE: yes` を渡す。

具体的には `/etc/php-fpm.d/env.conf` を追加して、以下の設定を適用する。

```/etc/php-fpm.d/env.conf
[www]
env[NSS_SDB_USE_CACHE] = "YES"
```

`/etc/php-fpm.conf` に追記するなどの方法もあるが、 Ansible で行いたかったので、
 `/etc/php-fpm.d/env.conf` を templates から配置するようにした。

具体的には、 `./roles/php/templates/env.conf.j2` というファイルを用意して、上記と同じ内容を記載。

```./roles/php/templates/env.conf.j2
[www]
env[NSS_SDB_USE_CACHE] = "YES"
```

タスクファイルで以下を実行するように設定する。

```./roles/php/tasks/main.yml
- name: publish /etc/php-fpm.d/env.conf
  template: src="env.conf.j2" dest="/etc/php-fpm.d/env.conf"
```

なお、この方法は `/etc/php-fpm.d/*.conf` が自動的に読み込まれるように `/etc/php-fpm.conf` に書いてある前提です。

## その他

そもそもの原因は curl で https へのリクエストを出すことで生じるので、 php スクリプトしか動作しない前提などであれば、上記で問題は無いはず。

もし、他のスクリプトなどで実行する場合は、それらに適した方法があると思われます。

あまり望ましい方法ではないかもしれませんが、 cron で `sudo sh -c "sync; echo 2 > /proc/sys/vm/drop_caches"` を設定しておく、という方法もありかもしれません。


というメモ。
Google Apps Scriptをスマホから実行する

##提案
1.ブラウザよりGoogleフォームを送信
2.スプレッドシートが更新され、スクリプトを実行できる。
3.スプレッドシートのURLを表示し、タップ。
4.(インストールしていれば)自動的にアプリが開いて、更新済みのスプレッドシートが表示される！
というようなものです。うまくいけば2タップでスクリプトを実行したてのスプレッドシートを表示できます。

##方法
###Googleフォームの設定
-「回答」タブより、動かしたいスクリプトが入ったスプレッドシートに結びつける。
- 質問をすべて削除する。
(送信ボタンだけになります。)(タイムスタンプは送られるので、質問は設定しなくてもスプレッドシートを更新できます。)
- 設定(歯車のアイコン)→プレゼンテーション→確認のメッセージ　に開きたいスプレッドシートのURLを設定。
###スプレッドシートの設定
-スクリプトエディタの「編集」→「現在のプロジェクトのトリガー」より、スクリプトの実行トリガーを「実行したい関数名」「スプレッドシートから」「フォーム送信時」と設定。
以上です。
Xamarin.iOSでのストーリーボードを使わない開発

　Visual Studio で Xamarin.iOS のプロジェクトを作成すると、ストーリーボードなどという忌まわしいものがデフォルトで作成されてしまい非常に厳しい気持ちになります。この記事では、それらを削除して、コードでUIを構成していくためのステップを説明します。3分ほど作業をすれば邪魔なものが消えてなくなってくれます。


## 1. `Main.storyboard` を削除

<img width="490" src="https://qiita-image-store.s3.amazonaws.com/0/56771/45a901e8-92f0-bbc1-da55-bf0996d730ec.png">

## 2. `ViewController.designer.cs` を削除

<img width="531" src="https://qiita-image-store.s3.amazonaws.com/0/56771/79380b0f-99a8-fe0b-5738-59dd17d507b9.png">

## 3. ViewController の余計なコードを削除する

`ViewController` が partial class である必要がなくなったので、partial キーワードを消します。合わせて `IntPtr` を引数にとるコンストラクタも不要になりました。

```diff
using System;

using UIKit;

namespace Pawotter.iOS
{
-   public partial class ViewController : UIViewController
+   public class ViewController : UIViewController
    {
-       protected ViewController(IntPtr handle) : base(handle)
-       {
-           // Note: this .ctor should not contain any initialization logic.
-       }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            // Perform any additional setup after loading the view, typically from a nib.
        }

        public override void DidReceiveMemoryWarning()
        {
            base.DidReceiveMemoryWarning();
            // Release any cached data, images, etc that aren't in use.
        }
    }
}
```

## 4. `Info.plist` の Main Interface を削除

<img width="593" src="https://qiita-image-store.s3.amazonaws.com/0/56771/2feef945-ff66-1a7a-80bd-9422d1cc349d.png">

## 5. AppDelegate に ViewController を表示するコードを追加

```diff
using Foundation;
using UIKit;

namespace Pawotter.iOS
{
    [Register("AppDelegate")]
    public class AppDelegate : UIApplicationDelegate
    {
        public override UIWindow Window { get; set; }

        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
+           Window = new UIWindow(UIScreen.MainScreen.Bounds);
+           var vc = new UIViewController();
+           vc.View.BackgroundColor = UIColor.Orange;
+           Window.RootViewController = vc;
+           Window.MakeKeyAndVisible();
            return true;
        }
    }
}
```

## 6. 動くサンプル

GitHub で公開しているので適当にどうぞ: https://github.com/pawotter/Xamarin.iOS.NonStoryboard
日記アプリのMVP化工程記録・7（終）

# MVP化が完了しました。

工程記録も7回目になってしましましたが、無事に目的であったMVPアーキテクチャへの移行を完了させる事ができました。

という訳で`feature-MVP`ブランチを`master `へMergeさせたPRは以下になります。
> https://github.com/poin-settia/Diary/pull/13

[前回の記事](https://qiita.com/poin-settia/items/9c55046b4b9826ef8568)ではスワイプ削除をMVP化を完了させましたが、残りのリスト入れ替え機能は[こちらのコミット](https://github.com/poin-settia/Diary/pull/13/commits/86e51a1dd4a9077062d50b16c42825abbcbe2af3)にて実装させました。(ついでにPrimaryKey生成時のbugも潰してます)

# ビフォー & アフター
ではせっかくなのでMVP化対応前と対応後のUML図を比べてみましょう。

まずは[工程記録・1](https://qiita.com/poin-settia/items/4fd1b864fec8b6365acf)で公開した最初のUML図になります。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3230343236372f66656338616131372d336266622d353462302d653764642d6336313337633562376664392e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/204267/df74fc51-bc1e-e4a5-20a5-390b0642c4ee.png)


FragmentでがっつりRealmDBを操作していたあの頃が懐かしいですね。

そしてこちらがMVP化対応後のUML図です。

![MVP.png](https://qiita-image-store.s3.amazonaws.com/0/204267/3918b170-b19b-7754-7d45-6743945f676e.png)

ひと目でクラスが随分と増えた感がありますが、注目したいのが
`PersonRealmHelper` を操作しているのが `PersonRepository`という点です。
Fragmentは担う仕事はViewのイベントを拾う事と、Adapterへとリストデータを受け渡すだけに専念しました。もう、DB操作をする事はないのです。

# 指揮者・Presenter
もう一点、新しい登場人物がいます。PresenterはViewが拾ったイベントをRepositoryがどんなDB操作をするべきか、指揮してあげます。RepositoryはあくまでPresenterの要求に従ってデータの追加や削除を行うのに専念するのです。

MVP化を行った事によって、**それぞれの仕事が明確に分割されるようになりました。**

そして忘れてはいけないのが`Contract interface`です。

```java:PersonContract
public interface PersonContract {

    interface Presenter {
    }

    interface View {
    }

    interface Model {
    }

```

MVPで仕事は分割されましたが、あくまでも一連の機能を分割しているだけです。
PersonContractでグルーピングすることによって、一つの機能である事を明示的に実装させているのです。

# 終わりに

全七回に渡り、リスト表示するという一つの機能を、MVPアーキテクチャ化する工程を説明してきました。
そもそもが自分の記録のために始めた本記事でありますが、
「どうやってMVP化を進めたらいいか分からない」、「MVP化の利点が分かりにくい」
といった方の助力にもなれば幸いです。

MVP化工程記録は今回で終わりますが、日記アプリの制作は続けていきますので
また別のシリーズが始まるかもしれません。

終始RealmDBにかき乱された事もいい勉強になりましたが、
RxJavaでの実装は行わなかったので、今後はそこらへんが記事になる可能性もあります。

何はともあれ、ここまで読んで頂きましてありがとうございました！
Zephirで作ったPHP Extensionもコード補完したい

# Zephirとは？

公式：[Zephir Programming Language](https://zephir-lang.com/)

PHPのエクステンションを作成する言語。
`Zephir ---PHPによる構文解析---> C言語 ---gccによるコンパイル---> PHPエクステンション`
ってなイメージ。

PHP最速のフレームワークとして名高い[Phalcon](https://phalconphp.com/ja/)もZephirで書かれてます。

### 参考

※2014の記事です。
[PHPを拡張する言語、Zephirについて](https://qiita.com/morisuke/items/721f6cdac20040918183)

# やりたかったこと

最近このZephirで遊んでるんですが、せっかく実用的なエクステンション作ってもIDEでコード補完できないのが割と辛いなーと思った。Phalconだと[Phalcon IDE Stubs](https://github.com/phalcon/ide-stubs)っていうコード補完用のPHPファイルが用意されているんだけど、自分で作ったエクステンションでもこういうのがほしくなった。

# やったこと

Zephirファイルからコード補完用のPHPファイルを生成するやつ作りました。
GitHub: [zephir-ide-helper](https://github.com/PruneMazui/zephir-ide-helper)

### 動作環境

* PHP >= 7.0
* [Zephir Parser](https://github.com/phalcon/php-zephir-parser) >= 1.1.0

### インストール

Packagist 登録してます。

`composer require prune-mazui/zephir-ide-helper`

### 使い方

`vendor/bin/zephir-ide-helper [-option] target`


#### target

Zephirファイル(拡張子.zep) もしくはディレクトリを指定してください。
ディレクトリ指定した場合、そのディレクトリ以下にある拡張子がzepのファイルを全部処理します。

#### option

* -f(--file) ･･･ 出力するファイル名を指定します。（デフォルト: __zephir_ide_helper.php） 


### サンプル

```zephir
namespace PruneMazui\ZephirSample;

/**
 * Sample class Greeting
 */
class Greeting
{
    protected message = "hello world" { set, toString };

    /**
     * constructor
     *
     * @param string optional message
     */
    public function __construct(string message = null)
    {
        if message !== null {
            let this->message = message;
        }
    }

    /**
     * Output Message to stdout
     */
    public function say()
    {
        echo this->message;
    }
}
```

↓

```php
<?php
namespace PruneMazui\ZephirSample
{
    /**
     * Sample class Greeting
     */
    class Greeting
    {
        protected $message;

        public function setMessage($message)
        {}

        public function __toString()
        {}

        /**
         * constructor
         *
         * @param string optional message
         */
        public function __construct(string $message = null)
        {}

        /**
         * Output Message to stdout
         */
        public function say()
        {}
    }
}
```

# 感想

* 最初はZephirが吐き出すCのコード見てニヤニヤしてるだけだったのにどうしてこうなった・・・
* ためしにPhalconで補完ファイル作ってみたら4万行とかになった／(^o^)＼
* 細かい言語仕様の違いに苦しめられた。（同じやつ2回useしても問題ないとかuseしてるものと今のクラス名が被っても問題ないとか）
* 可読性上げるためにインデントつけたり改行入れたりしたけどいらない気もしている。

# 残課題

* Zephir の言語仕様全部追いきれてない
* PHPDoc生成するところが大分やっつけで作ってしまった感がある
* 1ファイルに全部まとめるのでPhalconみたいな大きいプロジェクトだとファイルサイズが・・・
    分割して出力するオプションつけようかな？
* CIで動いてるテストケースはZephirParser部分をテストしてない（スキップしてる）
pugで存在しない可能性のある属性を出力する

最終的なHTMLの出力で内容が存在しないときは、そもそもその属性そのものを出力したくないということがある。

```html
<link rel="alternate" type="application/atom+xml" href="/docs/feed.xml" title="hbsnow.github.io/docs">
```

この例ではtitle属性があるんだけれども、これが空になると

```html
<link rel="alternate" type="application/atom+xml" href="/docs/feed.xml" title="">
```

これでは少し気持ちが悪いので

```html
<link rel="alternate" type="application/atom+xml" href="/docs/feed.xml">
```

上記のようにしたいということ。

ユーザ入力がないのであれば、素直に `&attributes` を使えばいい。

```attributes.pug
-
  var feed = {
    href: '/docs/feed.xml'
  }

if feed && feed.hasOwnProperty('href')
  link(rel='alternate' type='application/atom+xml')&attributes(feed)
```

```output.html
<link rel="alternate" type="application/atom+xml" href="/docs/feed.xml">
```

そうでない場合にはサニタイズしろ、みたいなことが公式に書いてあるんだけど、とくにそれをやってくれるようなヘルパーみたいなものもないので、[recursive-escape](https://www.npmjs.com/package/recursive-escape)などでエスケープするか、それが難しいのであれば、あとは酷いけれども泥臭いmixinを書くしかないような気もするんだけど

```mixin.pug
mixin atom(feed)
  - var hasFeed = feed && feed.hasOwnProperty('href')

  if hasFeed && feed.hasOwnProperty('title')
    link(rel='alternate' type='application/atom+xml' href=feed.href title=feed.title)
  else if hasFeed
    link(rel='alternate' type='application/atom+xml' href=feed.href)

+atom(feed)
```

さすがにこんなものは現実的ではないので、ちゃんとエスケープして `&attributes` を使うってのが唯一の解決策のような気がする。他になにかいい方法があれば知りたい。
Node.jsでBigQueryを叩いてみようと思ったら一瞬で終わった

ちきさんです。

Node.jsでGCPのBigQueryに元々用意されているサンプルデータをクエリしてみようと思ってやってみたらあっさりできたのでメモを残します。

https://cloud.google.com/bigquery/create-simple-app-api?hl=ja#bigquery-simple-app-query-nodejs を参考にしました。

書いたTypeScriptのコードはこちら。

```ts
import * as BigQuery from '@google-cloud/bigquery'

const bigquery = BigQuery({
  credentials: require('./path/to/your-service-account-key.json')
});

const query: string = `
  select corpus, count(*) as unique_words 
  from publicdata.samples.shakespeare
  group by corpus
  order by unique_words desc
  limit 10;
`

const options = {
  query,
  useLegacySql: false,
}

/**
 * 実行計画
 */
bigquery
  .startQuery({ ...options, dryRun: true })
  .then(results => {
    const [job, apiResponse] = results
    const statistics = apiResponse.statistics
    console.log('見積もり(円):', billedAsYen(statistics.totalBytesProcessed))
    console.log(JSON.stringify(statistics, null, 2))
  })
  .catch(err => {
    console.error('ERROR:', err);
  })

/**
 * 実行
 */
bigquery
  .startQuery(options)
  .then(results => {
    const [job] = results
    return job.getQueryResults()
  })
  .then(results => {
    const [rows] = results
    console.log(JSON.stringify(rows, null, 2))
  })
  .catch(err => {
    console.error('ERROR:', err);
  })

// ↓適当に書いたので計算違ってるかも
function billedAsYen(bytesProcessed: number): number {
  const minBytesBilled: number = 1024 * 1024 * 10
  const bytes: number = minBytesBilled > bytesProcessed ? minBytesBilled : bytesProcessed
  const bytesAsTeraBytes: number = bytes / 1024 / 1024 / 1024 / 1024
  return bytesAsTeraBytes / 1 /* TB */ * 5 /* $ */ * 113 /* 円(ドル円相場) */
}
```

そして得られた結果はこちら。

```json:実行計画の結果.json
{
  "creationTime": "1510853651921",
  "totalBytesProcessed": "2464625",
  "query": {
    "totalBytesProcessed": "2464625",
    "totalBytesBilled": "0",
    "cacheHit": true,
    "referencedTables": [
      {
        "projectId": "publicdata",
        "datasetId": "samples",
        "tableId": "shakespeare"
      }
    ],
    "schema": {
      "fields": [
        {
          "name": "corpus",
          "type": "STRING",
          "mode": "NULLABLE"
        },
        {
          "name": "unique_words",
          "type": "INTEGER",
          "mode": "NULLABLE"
        }
      ]
    },
    "statementType": "SELECT"
  }
}
```

```json:実行の結果.json
[
  {
    "corpus": "hamlet",
    "unique_words": 5318
  },
  {
    "corpus": "kinghenryv",
    "unique_words": 5104
  },
  {
    "corpus": "cymbeline",
    "unique_words": 4875
  },
  {
    "corpus": "troilusandcressida",
    "unique_words": 4795
  },
  {
    "corpus": "kinglear",
    "unique_words": 4784
  },
  {
    "corpus": "kingrichardiii",
    "unique_words": 4713
  },
  {
    "corpus": "2kinghenryvi",
    "unique_words": 4683
  },
  {
    "corpus": "coriolanus",
    "unique_words": 4653
  },
  {
    "corpus": "2kinghenryiv",
    "unique_words": 4605
  },
  {
    "corpus": "antonyandcleopatra",
    "unique_words": 4582
  }
]
```

とても簡単でした。
Common Lispで名前に丸括弧を含む関数を定義する

# はじめに
Common Lispなら丸括弧も関数名として利用できるんじゃないかと思って調べました。`\`あるいは`|`でエスケープすれば可能です。

# 試す
[roswell](https://github.com/roswell/roswell)をインストールして試してみた。

```parenthesis.lisp
$ros run
* (defun \(1\) () 1)

|(1)|
* (\(1\))

1
* (defun |(2)| () 2)

|(2)|
* (|(2)|)

2
* (\(2\))

2
* (|(1)|)

1
* (defun \(a () 'a)

|(A|
* (defun |(b| () 'b)

|(b|
* (\(a)

A
* (|(b|)

B
```

`(defun \(a () 'a)`では大文字が印字されて、`(defun |(b| () 'b)`では小文字が印字されるのか、分からないです。

# リーダーマクロ
エスケープに利用した、`\`や`|`はリーダーマクロとして定義してあるようでした。解説は[HyperSpec](http://www.lispworks.com/documentation/HyperSpec/Front/index.htm)に任せます。

* http://clhs.lisp.se/Body/02_dha.htm
* http://clhs.lisp.se/Body/02_dhs.htm


# おわりに
エスケープせずに`(`を使う方法はあるんだろうか。
まだペアプロしてないの？teletypeですぐできるよ【AtomパッケージWebRTCベース】

# 概要
Atomで選択した画面に他人を簡単に招待してGoogleスプレッドシートみたいに簡単に共同編集できるよ
編集した内容は向こうにリアルタイムで反映されてるからまるで隣にいるような感覚になれるよ

## 技術
* peer to peer
* WebRTC

# Atomバージョン
* Atom 1.22以降のバージョンが必要

## 評価
### 良い点
* 本当にリアルタイム編集
* 一緒に実装する時や、アドバイスが欲しい時にすぐ伝わって便利
* その人がどういった経緯でそのコードを書いたのか追えるのが良い

### 悪い点
* 部屋に入る際に失敗することが結構な頻度である
* 共有した画面に表示するファイルをころころ変えられると、関係ない行にタイプの続きを打ったりしてしまう

### 確認したかった
* linterなどのパッケージは、編集者のAtom設定が反映される

## 感想
Atomのパッケージ色々出ていて、やっぱコード解析などは老舗で有料の**IntelliJ IDE**の方が全然良いけど、本当に色々と面白いパッケージが出てきていて、railsやphp、pythonなどのサーバー処理はIntelliJ IDEを利用し、変化の早いフロントは完全Atomで行くのがベターなのかなと思ってます。
IntelliJ IDEでは最近Vueなどもサポートされてますが、実装が不十分なのか、カスタムディレクティブがエラーになってしまうので。

## 最後に
### ペアプロしようぜ！！！

## 参考サイト
https://forest.watch.impress.co.jp/docs/news/1091966.html
[公式サイト](https://teletype.atom.io/)
nodemonをただのファイルウォッチャーとして使う

`nodemon`は`.js`ファイルを監視実行する以外にも使えますよという内容。

サンプル的なコードはこちら。
<https://github.com/gcoka/scss-practice>

# 背景
sassの練習をしようとして、各環境を作ろうとしたのですが、
なんとなくgemの`sass`を入れるのを嫌って`node-sass`で変換させようとしました。

```
node-sass -o dist --output-style expanded --include-path src --watch src/test.scss
```

ところが、いくら`--watch`オプションをつけても、最初の起動時に1度変換するだけで、ファイル変更しても一切反応してくれませんでした。`--watch`にバグがあるようなissueも見かけたので、諦めて`nodemon`にファイル監視させることにしました。

# nodemonにファイル監視だけさせるには

`--exec`オプションを使います(短いオプションは`-x`)

本来の使い方は、`node server.js`の代わりとして`nodemon server.js`といった具合に実行するJavaScriptを渡しますが、代わりに`--exec`を渡すこともできます。今回の例だと`--exec`で実行するコマンドは`node`で起動するコマンドですらありませんが、問題ありません。

`package.json`に動かしたいコマンドと、監視付きのコマンドの両方を定義しましょう。

```json
"scripts": {
  "sass": "node-sass -o dist --output-style expanded --include-path src src/test.scss",
  "watch:sass": "nodemon --ext scss --watch src --exec 'npm run sass'"
},
```

これで無事、SCSSの自動変換がされるように。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193814/39b2fb59-cd51-83da-425c-55d93d1a9bc9.png)

# 他にも
工夫次第で、開発時の自動リロードを実現するための補助として使うことが出来ます。
よくある例では、 `node.js + Express`などで、 `src`以下が変更されたら`npm run start`を起動し直すとか。

```
nodemon --ext js,jsx,scss,html --watch src -x 'npm run start'
```
fast.aiのAWS環境設定用スクリプトでエラーが出た話

[fast.ai](http://www.fast.ai/)という、深層学習のMOOCをやっている。
この講座ではAWS上にインスタンスを構築し、その上で処理を実行するようになっている。
fast.aiがあらかじめ用意しているシェルを実行すると、自動的にインスタンスが作られる……はずなのだが、何度やっても上手く行かず、だいぶ手間取った。
自分の環境で表示されたエラーメッセージとその対処法をまとめておく。

エラーメッセージ：
An error occurred (VpcLimitExceeded) when calling the CreateVpc operation: The maximum number of VPCs has been reached.
→http://wiki.fast.ai/index.php/AWS_install#Common_Problems から訳：
スクリプトを実行するたびにVPCを作成している。
VPCの数には上限があるので、何度も実行していると上限に達してエラーとなる。
https://console.aws.amazon.com/vpc/home からVPCを削除すること


エラーメッセージ：
setup_p2.sh: 行 13: /home/[User-name]/.ssh/aws-key.pem: Permission denied
→http://wiki.fast.ai/index.php/AWS_install#Common_Problems から訳：
一度スクリプトを実行すると鍵が作られる。すでに鍵があるとエラーになるので削除すればよい。
rm ~/.ssh/aws-key-fast-ai.pem
(私の場合はrm ~/.ssh/aws-key.pem だった。当初の環境から途中で色々と微修正が入ったようである。微修正の一部として、鍵のファイル名も変わったのだろう)


エラーメッセージ：
An error occurred (InvalidKeyPair.Duplicate) when calling the CreateKeyPair operation: The keypair 'aws-key' already exists.
→これはさっきの「Common_Problems」には載っていない。
「何か変になったときに、作りかけのを綺麗にして最初からやり直す」ためのページがある。
http://wiki.fast.ai/index.php/Starting_Over_with_AWS
これを順にやれば良い。(このエラーの場合、手順の5番めを実行すれば直るはず)


エラーメッセージ：
An error occurred (InvalidAMIID.NotFound) when calling the RunInstances operation: The image id '[ami-bc508adc]' does not exist
で、元凶はこのエラーだった。この大元のエラーに気づかずに、何度も同じスクリプトを実行していると、上記のエラーが出てきて余計分からなくなってしまったのだ。
結論から言うと、リージョン(地域)の設定に問題がある。「米国西部(オレゴン)」に設定してから
東京でもp2インスタンスが使えるので、レイテンシを考えたら東京でインスタンスを立てればよいかと思ったのだが、
このimage idというやつは地域に依存しているらしい。
リージョンを「米国西部(オレゴン)」にしてから、EC2のインスタンスを新規作成し、検索欄にIDを入力すると、確かにfast.aiのインスタンスが表示される。すぐに使えるように色々とインストールを済ませているのだろう。

![AWSインスタンス作成のキャプチャ_Jing使用.png](https://qiita-image-store.s3.amazonaws.com/0/102027/7d806db1-54cf-c5ca-b26f-400543dfaf82.png)

しかしリージョンを東京にしてから同様にIDを入力しても、インスタンスは表示されない。
fast.aiのGitHubに上がっていたシェルを見ても、リージョンによってIDが変わることが分かる。そして東京に対応したIDは無いということも分かる。
https://github.com/fastai/courses/blob/master/setup/setup_p2.sh

「東京リージョンでp2インスタンスを作ることは可能。しかし、(fast.ai側で実行用の環境を整えた)講座用の設定済みインスタンスは東京リージョンに対応していない」というのが実情らしい。
大人しくオレゴンにして作り直したら上手くいった。

こんな調子で、ちゃんと継続できるかな……?

2018年2月4日 追記：
Qiitaの記事[fast.aiの最初の最初のAWS設定につまずかないために](https://qiita.com/okazawaryusuke/items/a19dfe7e52d890c8e52b#0aws%E3%81%AB%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E7%99%BB%E9%8C%B2)に思いっきり同じことが書いてあった……。
AndroidStudioのSettingsにAndroidSDK周りの設定が表示されない

#AndroidStudioのSettingsにAndroidSDK周りの設定がない

久しぶりにAndroid開発しようとした時に詰まったのでメモ
もっとスマートな解決法ご教授下されば幸いです

##AndroidSDK設定タブがないやん
泥の開発環境をSDKまで消してアンインストールしてた
↓
[公式のインストーラ配布ページ](https://developer.android.com/studio/index.html#downloads)から入手インスコ
↓
普段通り開発しようとするとAndroid系のメソッド全部"cannnot resolve symbol"
↓
SDK設定忘れたか
↓
確かFile -> Settings -> Appearrance & Behaivor System Settings でAndroidSDKの設定できたな(画像左)
↓
AndroidSDK設定タブが無い(画像右)、なんならSDKも入ってない
![76ee131bfee57abd3b3cc47a23375ec1.png](https://qiita-image-store.s3.amazonaws.com/0/151972/9912980c-66d2-9b4e-b9a6-30257cd0a2a3.png)


##前までは勝手SDKも入って設定までしてくれてたはず

現在(2017/11/16)最新のWindows版AndroidStudio(android-studio-ide-171.4408382)のインストール項目にAndroidSDKが無い、そもそも[公式のインストーラ配布ページ](https://developer.android.com/studio/index.html#downloads)にWindows版はSDK同梱して無いとの記述が。
更に、SDK単体の配布ページが抹消されていることも確認。なんでや。
![ec5bffa56ca8c98fe3383e26b6dbde48.png](https://qiita-image-store.s3.amazonaws.com/0/151972/4b5577f7-ff29-186e-c8ee-bf45a045e635.png)



##対処
新規プロジェクト作った時にAndroidSupportとか出ないっけ
↓
File -> Settings -> Pluginタブで確認
↓
なんで無効になってるの
↓
チェック入れてOK，AndroidStudio再起動
↓
AndroidSDKがなんも無いのでインストールするよダイアログ
↓
できた

チェック入れる箇所達
![f82aab169618091a3241282087831f4d.png](https://qiita-image-store.s3.amazonaws.com/0/151972/83e89b6a-eacc-97e2-534f-686327502291.png)

##原因
再インストールした時に確か以前の設定引き継ぐボタン押した気がするのでおそらくそれが原因であると思われます。


##まとめ
当たり前と言えば当たり前の設定ですが、検索掛けてると同じ原因で詰まっている方もいらっしゃったのでメモ
AndroidStudio使った開発でSDK系統に困ったらFile->Settings->Pluginsを見てAndroid系のプラグインが有効になっているかどうかのチェックをオススメします。
AWSのLambdaのタイムゾーンをUTCからJST(東京)に変更

# 今回のお題
[CloudWatchで定期的にLambdaを実行して、Slackにメッセージを送信する](https://qiita.com/seisyu1985/items/518b4a899cf91a43b0e4)
こちらで、LambdaでSlack送信をしたんですが、その際にdatetime.now()を使用して、現在時間をメッセージに送信するLambda関数を作って見ました。
しかし、表示される時間がUTC基準でして、9時間前の時間が表示されたので、これをどうにかしないとなと思いました。

## 方法
Lambdaも実際はAmazon Linuxでの実行であるならば、確か環境変数にタイムゾーンなかったっけ？と思い、Linuxの環境変数についてグーグル検索。
検索ワード：[Linux タイムゾーン 環境変数]
はい、でました。こちらを参考にしました。
[【設定確認から変更方法まで】Linuxでのタイムゾーンの扱い方](https://eng-entrance.com/linux-time-timezone)
TZに対して、Asia/Tokyoを設定すればいいようですね。
なので、
<img width="893" alt="スクリーンショット 2017-11-17 0.18.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/725a18b3-b303-5f01-3404-ecf642288fb3.png">

これでいけるのではないでしょうか？
Lambdaの実行処理は、上記の記事のままです。
早速テスト実行しました。

#**大成功です**
<img width="702" alt="スクリーンショット 2017-11-17 0.19.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/a0e34638-d11c-df13-d357-80546680ee2d.png">
Slackに出ている時間と、メッセージで出ている時間が一致してますね。
これでLambdaの時間処理は問題なさそうです。

次は、CloudWatchのタイムゾーン変更について調べます...
KeepHashTagInTweetDeck を Firefox で使う

Twitterを利用するのに公式クライアントであるTweetDeckを愛用している方は多いと思います。
しかしこのクライアントはハッシュタグ付きの投稿を連続で行うにはとても不便です。
それを解決してくれる __[KeepHashTagInTweetDeck](https://github.com/zenmaibane/KeepHashTagInTweetDeck)__ というChrome向けアドオンがあるのですが、これをメインブラウザであるFirefoxで動かしたい。
そんな時に役立つのが[Chrome Store Foxified](https://addons.mozilla.org/ja/firefox/addon/chrome-store-foxified/)というお馴染みのアドオンなのですが、何も考えずに使っても上手く導入できなかったため手順を残しておきます。

# GithubからZIPをダウンロードして展開する
__[ココ](https://github.com/zenmaibane/KeepHashTagInTweetDeck)__

# 中にあるmanifest.jsonを編集する
```
  "content_scripts": [{
    "matches": [ "https://tweetdeck.twitter.com/" ],
    "js": [ "main.js" ]
  }]
```
と書いてある部分を以下のように書き換える。

```
  "content_scripts": [{
    "matches": [ "*://*.tweetdeck.twitter.com/*" ],
    "js": [ "main.js" ]
  }]
```

# フォルダ階層に気を付けながら再圧縮する
正しいフォルダ階層は以下の通り、ZIP直下にファイル群がある状態です。

```
KeepHashTagInTweetDeck-master.zip
┣ main.js
┣ manifest.json
┗ その他ファイル（無くてもよい）
```
よくある間違いとして、ZIP直下にフォルダがあり、その下にファイル群がある状態です。

```
KeepHashTagInTweetDeck-master.zip
┗ KeepHashTagInTweetDeck-master
 ┣ main.js
 ┣ manifest.json
 ┗ その他ファイル（無くてもよい）
```

# 拡張子を変更してChrome Store Foxifiedに投げる
拡張子をzipからxpiに変更して、Chrome Store Foxifiedの設定画面から __Add New Extension -> My Computer__ で先ほどのxpiファイルを選択する。
__[Add-ons for Firefox](https://addons.mozilla.org/ja/firefox/)__ にログインしていれば署名されたアドオンが出来上がるのでインストールする。
ログインしないで未署名のアドオンファイルをそのまま使う方法はあるけど、アップデートでそのうち封じられそうなので署名することをお勧めします。

# 最後に
~~これChrome Store Foxified使わなくてもできたよね・・・？~~
私はこれを使ってChrome向けアドオンを数個Firefoxにインストールしているので、管理を楽にするためにこの方法をとりました。
まあ自分用メモってことで・・・。
RStudio と vdiffr でプロットもテストしよう

# vdiff とは

[vdiffr](https://github.com/lionel-/vdiffr) とは プロットのテストをサポートしてくれる R 言語の package です。

プロットのテストを行うことは，まだあまり一般的ではないと思うのですが，
ggplot や ggridges (旧名ggjoy) ではこの vdiffr を用いてプロットのテストを行っています。

# vdiffr 利用方法実例

次に実例でもって vdiffr の利用の仕方を示します。
(RStudio を用いて vdiffr でテストをするだけの package を作ります。)

1. RStudio の package の雛形を作る機能で下記のように入力し Create Project button 押下 (`R/hello.R` などのパッケージ雛形ができるはずです)

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/d75faa58-2dbb-912f-0b42-8a7cce4d28a9.png)

2. `install.packages(c("devtools", "testthat", "vdiffr"))`
3. 下記の内容で `tests/testthat/test-hello.R` を作成 (テストする内容はhelloではなくplotなので本来renameするべきなのですが省略します)

    ```
    context("Histograms")
    disp_hist_base <- function() hist(mtcars$disp)
    vdiffr::expect_doppelganger("Base graphics histogram", disp_hist_base)
    ```
4. RStudio の Console View で `vdiffr::validate_cases()` を実行。これでテストの正答となるリファレンス画像 `base-graphics-histogram.svg` が `tests/figs/histograms' に出来上がります。
5. この状態で `Ctrl+Shift+T` もしくは Build View の More メニュー下の `Test Package` を実行してみてください。下記画像のように エラーは出ないはずです。

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/819ec891-177f-54de-4727-7c91fc0ac01e.png)

6. 次にリファレンス画像 `base-graphics-histogram.svg` を適当な画像 (ただしそのファイル名は `base-graphics-histogram.svg` にrenameしてください) に置き換えてもう一度 `Ctrl+Shift+T` もしくは Build View の More メニュー下の `Test Package` を実行してみてください。下記画像のようにテストが失敗するはずです。
    
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/2a06ffea-876a-57ea-f3b0-bc7fc57a026e.png)

7. 6. の適当な画像(リファレンスとは異なる画像) を元のリファレンス画像 `base-graphics-histogram.svg` に戻すと再びテスト結果が問題無くなるはずです。

# まとめ

RStudio と vdiffr を使うと簡単にプロットのテストが追加できます。
是非プロットもテストしてみてください。

# sessionInfo

```
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] vdiffrSample_0.1.0 gdtools_0.1.6      testthat_1.0.2    

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.14            rstudioapi_0.7          fontquiver_0.2.1        xml2_1.1.1              magrittr_1.5           
 [6] roxygen2_6.0.1          devtools_1.13.4         xtable_1.8-2            R6_2.2.2                rlang_0.1.4            
[11] fontBitstreamVera_0.1.1 stringr_1.2.0           tools_3.4.3             withr_2.1.0             htmltools_0.3.6        
[16] commonmark_1.4          yaml_2.1.15             digest_0.6.12           crayon_1.3.4            shiny_1.0.5            
[21] purrr_0.2.4             vdiffr_0.2.1            htmlwidgets_0.9         mime_0.5                memoise_1.1.0          
[26] glue_1.2.0              stringi_1.1.6           compiler_3.4.3          svglite_1.2.1           httpuv_1.3.5           
[31] fontLiberation_0.1.0   
> 
```
Movable Typeを使ったサイト構築における設計について

この記事は[Movable Type Advent Calendar 2017](https://adventar.org/calendars/2203)の7日目の記事となります。
ほとんどの方が初めましてだと思います。
MTの佐賀のユーザーグループ(MTSaga)で活動している甲斐です。
初めてのAdvent Calendarへの投稿となります。
あまり情報が落ちていない？MTでサイト構築する上でのサイト設計の話をしていきたいと思います。
よろしくお願いします。

それでは早速進めていきます。

##**サイト設計について**
皆さんはMTでサイト構築をする時はどんな設計をしていますか？
人(会社)によって色んな設計の考え方があると思いますが今回は私が意識している設計方法についてまとめていきます。
※今回はアプリケーションの要素を含んでいない静的なサイトの設計を対象としています。


##**設計を始める前に必要なこと**
じゃあ設計をしよう！
と言っても何から始めればいいかわからない方もいらっしゃると思います。
必要なもの(情報)は
1. サイトマップ
2. ワイヤーフレーム
3. 誰が、どんな人がMTで運用するのか
4. 移行方法
になるかと思います。

###**1.サイトマップ**
こちらはサイト全体の構造を把握する為に必要です。
MTでサイト構築する際コンテンツに応じてウェブサイト・ブログで構造を整理するかと思いますがその時のベースとなります。
後に記載する「誰が・どんな人がMTを運用するのか」にも通ずる話ですがサイトマップの中にこの階層は誰が更新するのかという情報もあると尚よいです。

###**2.ワイヤーフレーム**
MTでテンプレートやカスタムフィールドを作る場合はワイヤーフレームが必要になってきます。
ワイヤーフレームを見て
「この部分は共通化できるよね」
「この部分はここの階層しかないからこういう考慮が必要になるよね」
みたいな判断をするわけです。

###**3.誰がどんな人がMTで運用するのか**
こちらはMTのユーザー設計を決めるのに必要になります。
サイトによってはこの階層は、このユーザーしか触らせたくないという要件もあるかと思います。
そんな要件がある時はウェブサイト・ブログの構造にも影響が出てくるのでサイトマップと合わせて情報をもらえると良いです。

###**4.移行方法**
こちらはサイトの移行やリニューアル等でMTを導入する場合に必要になります。
現行サイトをそのままMT化する場合やデザインのリニューアルはするがボディコンテンツはそのまま使うケースなど様々だと思います。
そういった場合のMTへの移行の方法を記しておくことは大事なことだと思います。

___
上記の1～4の情報をまとめていけばある程度は設計を進めていくことができるのではないでしょうか。
あとはサイトの共通ルールについても決めていかなければいけません。

###**title,metaタグのルール**
titleタグやmetaタグ(keywords,description)について、ある程度はパターン化されているかと思うので指定がない限りはテンプレート側で自動的に生成していくかと思います。
その時のルールについても設計の中で考慮する必要があります。

###**ナビゲーションについて**
サイトにはナビゲーションがあるのでそういったものも設計で考慮する必要があります。
どんなナビゲーションがあるのか、どういうルールで表示させるのか？
基本的には
- グローバルナビ
- パンくずナビ
- サイドナビ
の3つになるのかなと思います。
サイトの規模によっては
グローバルナビがメガメニューになったり
パンくずナビに2つ以上表示したり
階層によってサイドナビの表示の仕様が異なったり
複雑になることも出てくるかと思います。
そういった意味でも設計する際には考慮する必要は出てきます。

___

##**設計書に情報をまとめる**
以上で情報は大分まとまってきたのではないでしょうか。
設計書にも落としていけるレベルになってきたと思います。

最後に、集めた情報を設計書に落としていくにあたり必要な要点を出していきます。

####**コンテンツ構成**
ウェブサイト・ブログの構成情報をまとめます。

####**サイト共通ルール**
サイトの共通ルールをまとめます。

####**コンテンツの種類**
トップページや階層トップ、ニュースなどサイトによって色んなコンテンツがあるので、それをまとめます。

####**コンテンツ詳細**
コンテンツの種類でまとめたものの詳細情報をまとめます。
ワイヤーフレーム等のキャプチャ貼って、この部分はこのパーツを使うといったようにコンテンツをパーツごとにわけて記載します。
また、カスタムフィールドの情報についてもコンテンツによって異なるのでこちらに記載を行います。

####**テンプレート**
テンプレートの役割、どのブログで使うのか、どんなファイルが出力されるのかなどをまとめていきます。

####**ユーザー(ロール)設計**
ユーザーの情報をまとめます。
ワークフローが必要な場合もここでまとめます。

___


いかがでしょうか？
今回まとめた内容はMTだけでなく他のCMSでも使えると思いますのであまり意識していなかった人は意識してみてはいかがでしょうか？
また来年4月にリリース予定のMovable Type7では"コンテンツタイプ"の概念が出てくるため設計への考慮もかなり必要になってきそうですね。
設計については[こちら](http://cms.3int.jp/service/website/workflow.html)の考え方を参考にしています。

##**最後に**
私自身、仕事でMTに触れる機会がほとんどなくなってきた状態ですがMTSagaのコミュニティ活動を通して少しでも機会を作れればと思います。
MTSagaでは月に一度、勉強会を実施しています。
機会があればぜひ遊びに来てください。(リモートでも歓迎です)
勉強会の告知は下記Facebookページでやってます。
[MTSaga Facebookページ](https://www.facebook.com/MTSagaUG/)
Python OpenCV の cv2.imread 及び cv2.imwrite で日本語を含むファイルパスを取り扱う際の問題への対処について

# 概要
Python OpenCV で日本語を含むファイルパスを扱う際の以下2点の問題への対処方法の案．

1. cv2.imread でファイルパスに日本語を含む画像を読み込もうとすると失敗する．
1. cv2.imwrite を実行した際にファイルパスに含まれる日本語が化ける．

私の環境に問題...？

→ umyu様に「Windows & OpenCV の問題」とコメントいただきました．
アスキー文字にしか対応していないみたい．
[Unicode Path/Filename for imread and imwrite · Issue](https://github.com/opencv/opencv/issues/4292)
> Currently, the imread and imwrite method only supports std::string as an input. This isn't working with non-ascii directories/paths. Therefore, the a software depends on OpenCV can not guaranty working on all maschines.

# 実行環境

- Windows 10 64bit
- Python 3.6.3 :: Anaconda custom (64-bit)
- OpenCV 3.3.0


# 対策案
## cv2.imread への対策案
cv2.imread を np.fromfile + cv2.imdecode に分解して実行する．

```python
import numpy as np
import cv2
def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8):
    try:
        n = np.fromfile(filename, dtype)
        img = cv2.imdecode(n, flags)
        return img
    except Exception as e:
        print(e)
        return None

```

## cv2.imwrite への対策案
cv2.imwrite を cv2.imencode + np.ndarray.tofile に分解して実行する．

```python
import numpy as np
import cv2
import os
def imwrite(filename, img, params=None):
    try:
        ext = os.path.splitext(filename)[1]
        result, n = cv2.imencode(ext, img, params)
        
        if result:
            with open(filename, mode='w+b') as f:
                n.tofile(f)
            return True
        else:
            return False
    except Exception as e:
        print(e)
        return False
```

# 例

```python
#%% imread
# 通常imread，英語パス -> OK
path_english = r"C:\temp\Jelly beans.tiff"
img = cv2.imread(path_english)
type(img) # numpy.ndarray
img.size # 196608


# rename & copy file
import shutil
path_japanese = r"C:\temp\ジェリー ビーンズ.tiff"
shutil.copy(path_english, path_japanese)


# 通常imread，日本語パス -> NG
img = cv2.imread(path_japanese)
type(img) # NoneType


# 対策imread，日本語パス -> OK
img = imread(path_japanese)
type(img) # numpy.ndarray
img.size # 196608



#%% imwrite
# 通常imwrite，英語パス -> OK
path_english2 = r"C:\temp\Jelly beans.jpg"
cv2.imwrite(path_english2, img)

import os
os.path.exists(path_english2) # True


# 通常imwrite，日本語パス -> NG
path_japanese2 = r"C:\temp\Jelly ビーンズ.jpg"
cv2.imwrite(path_japanese2, img)

os.path.exists(path_japanese2) # False

import glob
glob.glob(r"C:\temp\*")
# ['C:\\temp\\Jelly beans.tiff',
#  'C:\\temp\\Jelly beans.jpg',
#  'C:\\temp\\Jelly 繝薙・繝ｳ繧ｺ.jpg',   # ← 文字化け
#  'C:\\temp\\ジェリー ビーンズ.tiff']

# 対策imwrite，日本語パス -> OK
imwrite(path_japanese2, img)
os.path.exists(path_japanese2) # True
```


# 参考リンク

- Reading and Writing Images — OpenCV 3.0.0-dev documentation:
    - https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html
- numpy.fromfile — NumPy v1.13 Manual:
    - https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fromfile.html
- numpy.ndarray.tofile — NumPy v1.13 Manual:
    - https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.tofile.html
Storage vMotionやクローンを使ったESXi -> AHVの仮想マシンの移行

# はじめに
この記事は、[[2枚目]Nutanix Advent Calendar 2017](https://adventar.org/calendars/2761) 12月6日の分として作成しました。本記事の内容はこの日付の情報に基づいています。

NutanixではESXi環境からAHV環境へ仮想マシンを移行するためのツール[Xtract for VMｓ](https://www.nutanix.com/products/nutanix-xtract/)(リンク先は英語サイト)を提供しています。ネットワールドさんのブログ「ネットワールド らぼ」でも「[Nutanix Xtract for VMsは使えるのか？](http://blogs.networld.co.jp/main/2017/12/nutanix-xtract--61ff.html)」の記事で取り上げていただいてます。

Xtract for VMｓを使用したESXi → AHVの移行は非常に簡単で停止時間も短くいい事ずくめなのですが、移行元となるESXiのバージョンが5.5以降という制約があります。現在移行を検討している環境は、5.5未満の環境も多く、Xtract for VMsが使えないケースも出てきます。

そのようなケースのためにNutanixでは[マイグレーションガイド](https://portal.nutanix.com/#/page/docs/details?targetId=Migration-Guide-AOS-v55:Migration-Guide-AOS-v55)(購入者かパートナーさんのみ閲覧可です)というドキュメントを提供し、手動マイグレーションの手法を解説しています。

下図のようなステップで移行を行います。

<img width="710" alt="移行のステップ" src="https://qiita-image-store.s3.amazonaws.com/0/83432/11eecaac-7183-c638-fe24-d3cfe3cbb4d6.png">

本記事では上記のステップ中の「移行した仮想ディスクをImageに登録」の手順を紹介します。他の手順については「[Image Serviceを使って、ESXiで作成した仮想マシンをNutanix CEに移行する](https://qiita.com/shmza/items/8c19dff870b16495d095)」の記事をご参照ください。

# 移行した仮想ディスクをImageに登録する
Storage vMotionでNutanix上のStorage Containerに移行した仮想ディスクをImage Serviceに登録します。これにより仮想ディスクの形式がAHVで扱える形式に変換されます。

Image登録の際には、IMAGE SOURCEに"From URL"を以下の形式で指定します。

nfs://127.0.0.1/Storage Containerの名称/vmの名称/vmの名称.vmdk (もしくはvmの名称-flat.vmdk)

<img width="373" alt="Image登録画面" src="https://qiita-image-store.s3.amazonaws.com/0/83432/30c6d96a-2a0d-dceb-ed6f-1697b9085d82.png">


#仮想ディスクの移行にクローンを使用する

マイグレーション・ガイドに記載された手順では、ESXiからAHVへの仮想ディスクの移行にStorage vMotionを用いていました。この方式は仮想マシンの停止時間を比較的短縮することができますが、移行が失敗した際のロールバックを行うために、再度Storage vMotionを使用する必要があります。

Storage vMotionの代わりにクローンを使用することによって、元の環境を残したまま移行を行うことができます。これによって、万が一のロールバックを迅速に行うことができます。

下図のようなステップになります。
<img width="715" alt="クローンを使用した仮想ディスクの移行" src="https://qiita-image-store.s3.amazonaws.com/0/83432/6072b6a4-8c79-7247-df34-c335e87910b5.png">

クローン前に仮想マシンを停止するため、停止時間は比較的長くなります。

# 終わりに
ESXi環境からAHV環境へ、手動で仮想マシンを移行する手段を紹介しました。
Xtract for VMｓがサポートしていない古いバージョンのESXiからAHVに移行する際のご参考になれば幸いです。
gulpのプラグインでインストールが失敗し、パーミッションのエラーって言われたときの初歩的な解決方法

`npm install -ほにゃらら --save-dev`
で
`Error: EPERM: operation not permitted, scandir`
が出たときは

`npm cache clear`
でキャッシュクリアするとうまくいくことがある

なんかエラー出たら
`npm cache clear --force`
で無理やり削除したら
なんとかうまくいった。
効率的なモデリングをマネージメントする その１ - モデリングの目的 -

「どのようなモデリングをするか？」その答えは人や組織によって異なるでしょう。モデリングの進め方には様々な方法があり、その効果が異なるからです。

そもそもモデリングをなぜするか？を考えてみましょう。

## モデリングの目的

[プロセスモデリング](http://sakaba.cocolog-nifty.com/sakaba/2014/12/tidd-----0dd9.html)が、伝える、実行する、議論する、改良する、管理する、支援する、自動実行する、 ことを目的とした様に、モデリングを行うと、以下のようなことが可能になります（「[ソフトウェアプロセスもソフトウェアである](http://sakaba.cocolog-nifty.com/sakaba/2011/04/tidd-----9930.html)」というメタファからすると先祖帰りです）。

- 伝達の道具
 - どのように実現するかを理解する
 - 現状を理解する 
- 協調作業の前提
 - 　ルール
 - インタフェース
- 思考・議論の道具
 - 仕様の理解
 - 実現方法の検討
- 組織活動
 - 支援・改良
 - 管理
- 実行基盤の実現
 - データベースの構築
 - 制約違反の検出

このようにモデリングには多くの目的があります。実際には、これらの複数の目的を考慮しながら、モデリング、レビュー、打ち合わせ、開発を実施します。その比率や順序はプロジェクトや組織によって異なるでしょう。

同じ目的でモデリングを行うとしても多くの手法がありますので、どのような戦略でモデリングを実施するかによってその効率は大きく変わります。

特に小規模なプロジェクトの場合は、必要と思われる全てのモデリングは不可能ですので、目的や方法の取捨選択やその組み立て方がプロジェクトの成否に大きく影響します。

次回は効率的なモデリングの戦略について述べます（[効率的なモデリングをマネージメントする その２ - モデリングの戦略 -](https://qiita.com/sakaba37/items/8af070de9b6d8505ce7d)）。
MSDN Subscription を海外サイトで購入してみた

## はじめに
先月末に契約していた MSDN Subscription の期限が切れたので海外サイトで購入してみました。
MSDNを個人で買う人も少ないのもあるでしょうが、更新時に色々と困ったのでまとめておきます。

## なんで日本で買わないのさ？
2年前に新規契約したときは日本と海外で価格差が凄かったので価格の都合で海外サイトから購入しました。
今回は更新であり新規よりもお安く購入できるため日本で更新しようと考えていたのですが、某代理店にお断りされたので仕方がなく前回購入した海外サイトから再購入しました。

## どこで買ったの？
[SaveInTheUSA](http://www.saveintheusa.com/)というサイトで購入しました。
MSDN関連の商品は色々あってどれを買えばいいのか正直わからなかったんですが、メールで問い合わせると教えてくれます。
ちなみに今回は[これ](http://www.saveintheusa.com/product.asp?pf_id=9ED%2D00133%2D)を購入しています。

## そこで買うメリットってなによ？
純粋に日本で購入するより物凄く安いです。
検討していた[nPress](https://www.npress.jp/msdn_chart)で購入する場合は407,795円。
SaveInTheUSAで購入する場合は2770ドルなので31万円ちょっと。

2年前に購入したときは配送先に日本が選択できず配送先をカリフォルニアにしたため消費税が9%かかったのですが、いつの間にか配送先に日本が選択できるようになったため消費税がかからなくなりました。
　※消費税法のことはわかりませんが、システム上は消費税はかかりません

ちなみに2年前は新規契約で[これ](http://www.saveintheusa.com/product.asp?pf_id=9GD-00001)を2790ドル＋消費税251.10ドルで購入しています。
日本で買うと100万円を超えるのでさすがに手が出せません、70万円以上の価格差ですね。

通常は更新の価格より新規の価格の方が高いのですが、不思議なことにこのサイトは更新と新規の価格差がほとんどありません。

MSDN SubscriptionはざっくりとVisualStudioを利用する権利と新しいバージョンに更新する権利の2つがあるのですが、VisualStudioを利用する権利は永続的なもので期限が切れても利用することが可能です。
そこで今回は更新ではなく新規契約をすることにしてVisualStudioを利用する権利を増やすことにしました。
MSDN Subscriptionは人に対して付与できるので私1人で使う分には意味がないのですが、今後もし誰かと開発する場合は期限切れのSubscriptionを割り当てることができるためちょっとお得です。

今回は特別に更新用の製品？で新規契約をしてもらいましたが、通常はどうなのかわからないのでもし購入する場合は先に問い合わせをした方がいいかと思います。

## デメリットはないの？
英語できない私のような人間には敷居が高いです。
特にこのサイト同じような製品が大量にあるのと、日本での価格と違いすぎることもありまともに使えるのか不安もありました。
google翻訳を駆使しつつ実際に購入した結果問題はありませんでしたが、サポート面は弱いです。

日本でMSDN Subscriptionを買うとおそらく代理店からライセンス番号とライセンス認証番号が伝えられ、自分で[ボリュームライセンスサービスセンター](https://www.microsoft.com/Licensing/servicecenter/home.aspx)から登録＆割り当てをする必要があります。(たぶん)

SaveInTheUSAの場合は自分で登録するのではなく指定したメールアドレスに割り当てられます。
契約者が個人で自分だけが利用する場合はそれで構わないのですが、自分でボリュームライセンスサービスセンターにログインすることができないため、他の人(メールアドレス)に割り当てを変更することができません。
また、期限が切れた後に更新する場合、ライセンス番号とライセンス認証番号が必要なためそれがないと他の代理店から購入することができません。

勿論問い合わせれば教えてもらえますので、購入直後にライセンス番号とライセンス認証番号を教えてもらい自分でボリュームライセンスサービスセンターにログインできるようにしておくといいです。

更新時はライセンス番号とライセンス認証番号があればどこの代理店でも購入できるはずなのですが、今回nPressには海外で新規契約したことを理由に断られました。
マイクロソフトに問い合わせたところ海外で購入した製品でも日本で更新することはできるそうなのですが、ダメならしょうがないですね。
個人でMSDN Subscriptionを買えるのは他にライセンスオンラインぐらいかと思いますが、もしかしたらこちらも同じ理由でお断りされるかもしれません。

## まとめ
MSDN Subscriptionは物理的なものでなくすべてオンラインで解決できるものなので地理的なものは障害になりません。
多少の手間(英語でのやりとり)さえかければ大幅に安く購入できるのでお勧めです。
Runtimeで始めるMax7【1日目】

# Maxとは
音楽などのコンテンツを扱うためのメディア用ビジュアルプログラミングソフト。開発元はCycling '74,国内代理店はMI7。AudioUnitやVSTプラグインを読み込むことも可能。もちろんソフトシンセを作ったりも。

## メリット
- ビジュアルプログラミングなので直感的
- アプリをダウンロードすれば誰でも使える

## デメリット
- 海外の製品なので、日本語の情報が圧倒的に少ない
- マイナー

# 自分がこの記事を書こうと思ったきっかけ
日本語の情報が少なく、自分の学習（まだまだ初心者）の復習ついでに。

# 動作環境
Mac：Mac OS X 10.7以降、Intel® Mac
Windows：Windows 7以降、マルチコアプロセッサ
共通：2GB以上のRAM、インターネット接続環境（インストール、オーソライズ時）、QuickTime（Windows 32-bitでJitter使用時）
([MI7公式サイト](https://www.mi7.co.jp/products/cycling74/max)より）
インストール後30日間は無料体験版として、その後は保存不可なランタイム版として利用可能。[^1]

# 基本
Max7では様々な機能を持った部品である「オブジェクト」を「パッチコード」と呼ばれるケーブルで繋いでゆく。オブジェクトには大抵、インレットとアウトレットというコードを繋ぐ部分がある。オブジェクトは関数に、インレットアウトレットはそれぞれ引数を戻り値と考えれば大筋は合っている。はず。
`MIDI`入出力や、`OSC(OpenSound Control)`なども利用可能。

# 利用方法
[cycling '74公式サイト](https://cycling74.com) 右上の[DOWNLOAD MAX]ボタンからダウンロードページへ行き、ダウンロード。インストールが終わればすぐ起動できます。

# ちょこっと音を出すだけプログラム
<img width="820" alt="スクリーンショット 2017-12-06 23.29.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/221134/a4cda4f1-48a3-6762-4aed-014e31d9c9e1.png">
マウスカーソルを画面上に合わせ、"n"キーを押して三つのオブジェクトをつくりそれぞれ`number``cycle~``ezdac~`と入力。
その後画面左下の鍵マークをクリックしてロックされた状態にして、まずスピーカーの形をしたアイコンを押し、その後`number`が返信したオブジェクト上でドラッグすると数字が変わり、音が出ます。
<img width="820" alt="スクリーンショット 2017-12-06 23.32.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/221134/b309ceee-54bf-2617-fdfd-76e40ea0534c.png">
上の数字=Hzで音がでます。自分の可聴域のご確認にどうぞ。

音が出ない時は"Options>Audio Setup"でオーディオインターフェイスの設定を見直してみて下さい。

[^1]: 2017年12月現在
ReactNativeでネイティブモジュールを扱う方法

[Progate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/progate) 6日目の記事になります！

現在、ProgateではReact Nativeを用いてiOSアプリを開発しています。
せっかくなら普段使っている技術について触れたいと思い、
今回は「**React Nativeでネイティブモジュールを扱う方法**」について書きました。

## **ネイティブモジュールとは**
ネイティブモジュールとは、iOSならSwiftやObjective-Cで書かれたモジュールになります。

React Nativeでは扱えないプラットフォーム特有の機能を使いたい時や重い処理をネイティブ側に渡したい時などに使います。

## **ネイティブモジュールを作成する**
[公式ドキュメント](https://facebook.github.io/react-native/docs/native-modules-ios.html)と同じくログを出力する簡単なモジュールを作成していきます。
言語はObjective-Cです。

```CalendarManager.h
#import <React/RCTBridgeModule.h>

@interface CalendarManager : NSObject <RCTBridgeModule>
@end
```

まず、ヘッダーファイル（拡張子が.hのファイル）でクラスの宣言をします。
`@interface クラス名 : 親のクラス名`でクラスの宣言をしています。

さらに、親のクラス名の後に`<プロトコル名>`と書くことで、準拠するプロトコルを指定することができます。

この`RCTBridgeModule`に準拠することによって、React Native側にネイティブモジュールだと認識させることができるようになります。

次に実装ファイル（拡張子が.mのファイル）でメソッドを書いていきます。

```CalendarManager.m
#import "CalendarManager.h"
#import <React/RCTLog.h>

@implementation CalendarManager

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location)
{
  RCTLogInfo(@"%@ に %@という予定を作成しました。", location, name);
}
@end

```

`@implementaion` ~ `@end`の中にメソッドを実装しています。

### **RCT_EXPORT_MODULE**

これを書くことでReact Native側からモジュールを参照できるようになります。

ざっくりいうと、React Nativeは**Bridge**という場所に登録されたモジュールを読み込み、使用しています。
`RCT_EXPORT_MODULE`ではBridgeにモジュールを登録しているのです。

`RCT_EXPORT_MODULE();`

### **RCT_EXPORT_METHOD**

これにより、モジュールにメソッドを定義することができます。
今回は`addEvent`という名前で`name`と`location`を引数に受け取ります。中身は適当な文字列を出力しています。

```objc
RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location)
{
  RCTLogInfo(@"%@ に %@という予定を作成しました。", location, name);
}
```

## **React Nativeからネイティブモジュールを呼び出す**

```js
import {NativeModules} from 'react-native'

NativeModules.CalendarManager.addEvent(
  'Progate advent calendar',
  '12/6'
)
```

React Native側では、`react-native` から `NativeModules` を `import`し、定義したメソッドを呼び出すだけで完了です。

出力結果は
**12/6にProgate advent calendarという予定を作成しました。**
となります。
~~日本語がおかしいかもしれませんが気にしないでください。~~

## **Xcodeでのエラーについて**
`RCTBridgeModule.h' file not found`

ビルド時に上記のエラーが出た場合には以下の手順でHeader Search Pathsに
`$(SRCROOT)/../node_modules/react-native/React`
を追加すると解決されます。

<img width="1439" alt="スクリーンショット 2017-12-06 22.55.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/116302/c787d2f7-a46d-ac5b-0910-905b787426b8.png">

## **最後に**

だらだらと簡単に解説しましたが、僕はObjective-C初心者なので何か間違っている点などがありましたらご指摘お願いします！

[Progate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/progate) 明日（12/7）の担当はエンジニア兼セールスマネージャーの椿さんです！
Laravel の Homestead を立ち上げる時に Timed out while waiting for the machine to boot がでる

Homestead環境を立ち上げるファイルなどは揃い、`vagrant up`をしたものの環境がタイムアウトしてしまいました。
環境は、Mac + VirtualBox です。

# vagrant up でタイムアウト

```
vagrant up

略

pugiemonn.com: Warning: Connection reset. Retrying...
pugiemonn.com: Warning: Remote connection disconnect. Retrying...

Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
```

これはよくあるやつですね。なんでしょうか。

# VirtualBox のネットワーク設定をケーブル接続に変更
「設定」 > 「ネットワーク」 > 「ケーブル接続」にチェックを入れます。

<img width="399" alt="スクリーンショット 2017-12-06 23.27.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/7822fa1d-992a-5a5e-bb92-ab6078523e99.png">
↑ケーブル接続のチェックが外れていました。

たまたま思い出しました。

# 再度 vagrant up 

```
vagrant up
```
こんどは立ち上がりました(☝ ՞ਊ ՞)