【Windows】serialport モジュールなどで node-gyp を使うとき、Visual Studio をインストールせずに使う

こんにちはー。

久しぶりの投稿となります。

というのは、パソコンを落としてしまって、ハードディスクを壊してしまったからです‥。
幸い、壊れているのはハードディスクだけだったので、それを交換したら動きました。

その交換するまでの間、パソコンを貸していただいて、それで開発をしていたのですが、
開発していたリポジトリで、「serialport」モジュールを使っていました。

しかし、このモジュールをビルドするときに、Visual Studio と python が必要だと思っていて、
Visual Studio 入れると一気に8GBとか使うので、
入れないでやる方法があったので紹介します。

Visual C++ Build Tools を使う

http://landinghub.visualstudio.com/visual-cpp-build-tools

これなんです。これが Visual Studio の代わりになります。
↑ で、「Download Visual C++ Build Tools」をクリックして、ダウンロードして実行、
すべてデフォルトのオプションでインストールします。

npm config を変更

$ npm config set msvs_version 2015 --global

これをやらないと、↓のエラーが出てしまいます。

MSBUILD : error MSB3428: Visual C++ コンポーネント "VCBuild.exe" を読み込めませんでした。この問題を解決するには、次のいずれかを行ってください。 1) .NET Framework 2.0 SDK イ
ンストールする。 2) Microsoft Visual Studio 2005 を
インストールする。 3) その他の場所にインストールされている場合、コンポーネントの場所をシステム パスに追加する。 [...\node_modules\serialport\
build\binding.sln]

これで Visual C++ Build Tools でビルドできます。

あと Python 2.7 もいれましょう

これも忘れずに!

ちなみに

serialport モジュールのページでは、Visual Studio をインストールする方法しか書いてありませんが、
node-gyp の Github では、Visual C++ Build Tools を使う方法が紹介されています。

https://github.com/nodejs/node-gyp

Webpack で Ace(Brace)を使うとエラーが出る

こんにちはー。

Ace、便利ですよねー!
js で作られたテキストエディタで、
Webアプリで「ちょっとコード打つとこ作りたい」とかいうときに使えます。

さて、今回はこれを、Webpack から使って、まとめられるようにしたいと思います。

brace を使う

thlorenz/brace
brace - browserify compatible version of the ace editor.

普通の ace を、Browserify で使えるようにしたそうです。

インストール

$ npm install --save brace

bower からインストールしたくて、探しましたがなかったです。

webpack.config.js

node_modulesをbundleできるようにします。

module.exports = {
// ...
  resolve: {
    modulesDirectories: ["node_modules"]
  },
  plugins: [new webpack.ResolverPlugin(
    new webpack.ResolverPlugin
      .DirectoryDescriptionFilePlugin("package.json", ["main"])
  )]
};

しかしエラー

これで、Browserify ならうまくいくらしいのですが、
Webpack だと、エラーが出てしまい、
テキストエディタ上でのエラー表示機能などが使えませんでした。

webpack-brace-error

Could not load worker TypeError: Argument 1 is not valid for any of the 2-argument overloads of URL.createObjectURL.
スタックトレース:
WorkerClient@file:///.../bundle.js:16481:21
this.createWorker@file:///.../bundle.js:21703:23
this.$startWorker@file:///.../bundle.js:8833:29
this.$onChangeMode@file:///.../bundle.js:8789:14
this.setMode/<@file:///.../bundle.js:8770:18
exports.loadModule@file:///.../bundle.js:3766:27
this.setMode@file:///.../bundle.js:8759:10
@file:///.../bundle.js:53:2
__webpack_require__@file:///.../bundle.js:20:12
@file:///.../bundle.js:40:18
@file:///.../bundle.js:1:11

どうやら、w3c-blob という module でエラーが起きています。
これは、Blob が使えないブラウザ用に、Blob を実装している module です。

Blob
Blob オブジェクトはファイルに似たオブジェクトで、immutable な生データです。データを表す blob は必ずしも JavaScript ネイティブなフォーマットではありません。 F...

しかし、サポート状況を見てみると、IEでも10以上、結構多くのブラウザがサポートしています。

ということで、この w3c-blob という module を、
webpack の alias 機能を利用して、
ブラウザの Blob を使うようにしていきます。

1. webpack.config.js があるフォルダに、「alias」フォルダを作成

webpack.config.js があるフォルダに、「alias」フォルダを作成し、
このフォルダの中に、blob.js というファイルを作成します。

blob.js

module.exports = Blob;

1行です。ブラウザで実装されている Blob を使うようにします。

2. webpack.config.js にaliasを登録

4行目-7行目を変更してください。
webpack.config.js

module.exports = {
// ...
  resolve: {
    modulesDirectories: ["node_modules", "alias"],
    alias: {
      "w3c-blob": "blob.js"
    }
  },
  plugins: [new webpack.ResolverPlugin(
    new webpack.ResolverPlugin
      .DirectoryDescriptionFilePlugin("package.json", ["main"])
  )]
};

4行目では、alias フォルダをaliasで使えるようにします。

6行目では、w3c-blob の aliasとして、blob.js(aliasフォルダ内)を登録し、上書きします。

3. 実行してみる

success-webpack-brace

エラーが出ませんでした。
また、テキストエディタ上で、エラーの表示もできるようになりました。

Windows 10 にアップグレードしてから起きた問題(と解決策)を挙げてみる

こんにちはー。

Windows 10にしたけど不安定だから戻した【5回目まで】
画像: Microsoft よりWindows 10 にしたいなぁ。新しいデザインとか、Cortanaとか、通知センターとか、とにかくすべての新機能が、Windows ファンとして魅力です。それ...

↑な感じで苦戦していたアップグレードですが、6回目にして成功しました!
作戦を組んでやったので、それについての記事も近日中に公開します。

2016-07-03 追記
↑と書いていましたが、ウイルスバスターを入れた後、KP41病になってしまったようで、
Microsoft にもメーカーにも問い合わせましたが、Windows 8.1 に戻すしかないということで、戻しました。
一応「こんな問題が起きたんだ」という分にはこの記事も使えるかと思うので、公開したままにします。

さて、今回は、Windows 10 にアップグレードしたものの、
結構問題が発生して、かなりの精神的ダメージを食らったので、
紹介します。

ブルースクリーン「DRIVER_POWER_STATE_FAILURE」

driver_power_state_failure

初ログイン後、すぐに発生。
頻度:1回きり

よっしゃ!アップグレード終わったー(´ω`)とゆったりしているとき、
不意打ちのように来たエラーだったので、ダメージはそれなりに大きかったです。
しかし、その後コイツを見ることはありません。

ブルースクリーン「IRQL_NOT_LESS_OR_EQUAL」

irql_not_less_or_equal
(ガラケーでとったのをスマホでとりなおしました。画質が悪くてすみません)

ウイルスバスタークラウドインストール後、15分後くらいに発生。
頻度:1回きり

アプリの更新とかも終わって、安定してきたころに、
ウイルスバスターを入れたら現れました。
コイツもその後見ることはありません。

ストアアプリをアンインストールしても復活する

アップグレード後、アプリの更新中に発生。
頻度:複数

ぼくは、あまり「トラベル」「マネー」とかのデフォルトで入っているアプリを使わないので、
アンインストールしたのですが、それが消しても消しても復活しました。

解決策

これについては解決策が見つかりました。
アンインストールしたアプリが更新中で、再インストールされていたらしいので、
ストアから更新をキャンセルすればよいのです。

ストアを開いて、ダウンロードと更新、アプリのリストから、
×をクリックすると、更新をキャンセルできます。

突然フリーズし、HDD アクセスランプも消灯する

hardware-access-lamp-off

ウイルスバスタークラウドインストール後。
頻度:複数、起動してから1時間くらいで毎回発生。

これは地味に手ごわいヤツでした。
あるとき突然、マウス操作も画面も音声もフリーズし、
HDD アクセスランプもぷつっと消灯してしまうのです。

解決策(と言っていいのか)

最初はこれがウイルスバスターの影響だと知らず、
5回目のアップグレードのときは、これが嫌でWindows 8.1 に戻したほどです。

ウイルスバスターをアンインストールしたら解消しました。
それだとウイルス対策がかなり心配ですが、
今のところはWin10付属の Windows Defender を使っています。

Verifier でドライバの検証をして再起動した後、システムの復元をしなければならなくなった

windows-after-verifier

Verifier 実行後
頻度:1回

Verifier という、ドライバの検証をできるものがあるのですが、
それを実行して、再起動したら、↑の画像のメッセージが出ました。
「キャンセル」ボタンは怖くて押せなかったので、
システムの復元をしました。こまめに復元ポイントを作っていてよかったです。

最後に

こんな感じで、短期間にだだだっと問題が発生しましたが、
なんとかしのいだ感じです。

Windows 10は、楽しい新機能が盛りだくさんなので、
色々問題が起きますが、使っていきたいと思っています。
そのため、今後も問題が起きたとき、その対処法があれば書いていきたいと思います。

近日、6回目でどうやってアップグレードができたのかを詳しく書くつもりです。

エスケープシーケンスで、既存の行、文字を書き換える

こんにちはー

Vim は、ターミナル上で動くアプリですが、カーソルの位置を変えて、
既存の行、文字の内容を上書きしたりできます。

こういうのって、どうやるのかなあと調べていたら、
どうやら、エスケープシーケンスというのを使うらしいです。

というわけで、使ってみました。

目的

  • ターミナル上の既存の行、文字を書き換える

方法

  • エスケープシーケンスを使用して、カーソルを動かす

カーソルを動かしてみる

絶対座標でカーソルを変更します。
次のような形です。

\e[行;列H"

今回は Ruby でやってみたいと思います。

# 左上から 2行、3列目にカーソルを移動
printf "\e[2;3H"

カーソルが移動されます。

書き換えてみる

この後、文字列を出力すれば、文字が上書きされるわけです。

実際のコードは次のようになります。


# 画面をクリアしておく
printf "\e[2J"

# 1行目1列に apple と出力
printf "\e[1;1H"
printf "apple"

sleep 1

# 1秒後、再び1行目1列に出力して上書きする
printf "\e[1;0H"
printf "banana"

2016-05-18 21h21_26

1行目1列は、ターミナルの左上なので、
文字がすでにある可能性があります。
そのため、上のコードでは、最初に \e[2J というエスケープシーケンスで、
ターミナルをクリアしておきます。

これを使って何かできそう

2016-05-18 21h22_47

| がある場所で、a キーを押すと、> がはね返るようにしました。
ゲームとかで応用できそうです。

参考

エスケープシーケンスを体感する - ザリガニが見ていた...。
エスケープシーケンス(escape sequence)とは、直訳すれば「エスケープに続く数列(文字コード列)」とい..

エスケープシーケンスの一覧が載っていて便利です。
今回は絶対座標で変更しましたが、「上にn行」みたいなずらし方の方法もあり、こちらに載っています。

WindowsのGVim をかっこよくする

仕上がり

2016-05-01_12h41_03
※ Vim-airline というプラグインを使用していますが、
  その方法はまた今度説明します。

各種設定をする

.vimrc に追加します。ない場合は、ホームディレクトリに、.vimrc というファイルを作ってください。

" 行番号を表示
set number
" 対応する()、{}、[]をハイライト
set showmatch

" 折りたたみ(任意)
" indent の数で折りたたむよう設定
set foldmethod=indent

.gvimrc に追加します。ない場合は、ホームディレクトリに、.gvimrc というファイルを作ってください。

" 日本語フォントを全角分のスペースにする
set ambiwidth=double

" ビープ音を消す(任意)
set visualbell t_vb=

いらないUIを消す

.gvimrc に追加します。

" 最初に追加
gui

" UIを消す
set guioptions-=m " remove menu bar
set guioptions-=T " remove tool bar
set guioptions-=r " remove right-hand scroll bar
set guioptions-=L " remove left-hand scroll bar

背景を半透明にする

.gvimrc に追加してください。

" 背景を透明にする
set transparency=200

colorschemeを変える

ぼくは、デフォルトで入っている koehler というものを使っています。

.gvimrc に追加してください。

colorscheme koehler

" 先ほど折りたたみの設定をした人向け
" 折りたたみの色を替える
highlight Folded guibg=black guifg=yellow

WindowsだけれどVim使ってみた

こんにちはー。

Vim、いいですよね~~~~
キーボードですべてが完結しちゃうところがかっこよくて、
僕も使いたくなりました。

今回は、Windows でかっこ良く Vim を使う方法を紹介します。

Vim を使う時の条件

Vim を使う方法はいくつかあります。
「かっこ良く」ということで、いくつか条件を用意しました。

  • 背景を透過できる
  • かっこいい colorscheme が使える(256色表示できる)
  • バグがない
  • プラグインを入れられる

ConEmuで使いたかった。

ConEmu という、コンソールをタブ化できたりするものがあるので、それでVimも使いたかったんです。

コマンドプロンプトをタブ化してくれる、「ConEmu」が便利!
 最近、GulpやNode.jsを使うようになって、「コマンドプロンプト」を使う機会が増えてきました。そのとき、いちいちcdコマンドを使うのはつらいので、ディレクトリ...

これでできるかなと思いましたが、

  • 256色表示できない
  • backspace で文字が表示から消えない(本当は消えている)

ということで、使えなかったです・・

Cygwinでやってみたが・・

プラグインを入れるとき、インストール先を指定する「expand()」という関数を使います。
しかし、そこで expand('/home/Shundroid/cygwin64/.vim/bundle/') と指定しましたが、
ルートがCドライブになっていて、Cドライブに合わせるように修正したら、今度はうまく認識しない・・という感じで・・
ややこしかったので無理でした。

普通にコマンドプロンプトで使う

  • 背景を透過できない

のでダメでした。

GVim を使う

ぼくが思っていた条件をすべて満たしているので、
これを使うことにしました。

  • 背景を透過できる
  • かっこいい colorscheme が使える(256色表示できる)
  • バグがない
  • プラグインを入れられる

では、次は GVim をかっこ良く使えるように設定していきます。

WindowsのGVim をかっこよくする
仕上がり※ Vim-airline というプラグインを使用していますが、  その方法はまた今度説明します。各種設定をする.vimrc に追加します。ない場合は、ホームディレクトリ...

js で文字列が色かどうかを見分ける方法

こんにちはー。

js から css の backgroundColor や、color など、色を指定することがよくあります。
しかし、その時、色でない文字列が backgroundColor などに指定されると、
正しい結果になりません。

今回は、色である文字列が指定されているかを判別する方法を紹介します。

やりたいこと

次のサンプルを見てください。

See the Pen Jsで文字列が色かどうかを判別する by shundroid (@shundroid) on CodePen.0

textbox に、bluergb(255,0,0)を指定して、「判別」ボタンを押すと、「色です」と結果が返ってきます。
しかし、hoge や、1 を指定すると、「色ではありません」となります。

では、この仕組みを説明します。

isColor 関数を実装する

サンプルでは、次のような関数が定義されています。

function isColor(color) {
  var testElement = document.createElement("span");
  testElement.style.backgroundColor = color;
  return testElement.style.backgroundColor !== "";
}

この関数に引数として文字列を指定すると、その文字列が色に変換できるかを返します。

仕組み

testElement.style.backgroundColor のデフォルトの値は "" です。
これに、色に変換できる文字列を指定すると、backgroundColor の値が変化します。
しかし、不正な値が指定されると、backgroundColor の値は変化しません。
これを利用して、testElement.style.backgroundColor !== "" で、
backgroundColorがデフォルトの値でないかで判別しています。

【Canvas】mousemoveのタイミングで円を描くときに円が離れてしまう問題

こんにちはー。

前回、arc を使って描いた時、円が散らばらないようにする方法を紹介すると書いたので書きます。

【JS】Canvasで丸や四角で「消す」方法
こんにちはー。題名のとおり、Canvas の「消す」機能で、丸などに形を変える方法を紹介します。「消す」機能についてまずはじめに、消す方法としてのルールを書いておき...

まず、下の例を見てください。

うまくいかない例

See the Pen Canvas Mousemove 円で描いてうまくいかない例 by shundroid (@shundroid) on CodePen.dark

よくありがちなコンテンツです。
mousemove のイベントが発生した時に円を描いているわけですが、
めっちゃ速く動かして書くと、円と円の間が空いてしまいます。

今回は意外と初歩的なことかもしれませんが、
この、間が空かないようにする方法を描きます。

moveToとlineToを使う

実際に moveTo と lineTo でやった例は、こちらです。

See the Pen Canvas mousemove lineToとmoveTo by shundroid (@shundroid) on CodePen.dark

この方法は、円で描くのではなく、線で描いています。
そのため、円と円の間が描けるわけです。

では、使っている関数を紹介したいと思います。

moveTo 関数

線の始点を指定します。
ここでは、ひとつ前の mousemove での座標、もしくは mousedown での座標を指定しています。

lineTo 関数

lineTo で指定した始点から、
線を引くときの終点を指定します。
ここでは、現在の座標を指定しています。

色を変えるには

CanvasRenderingContext2D.strokeStyle で取得・変更できます。

var ctx = canvas.getContext("2d");
ctx.strokeStyle = "red"; // 赤
ctx.strokeStyle = "green"; // 緑

参考: https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D/strokeStyle

太さを変えるには

CanvasRenderingContext2D.lineWidth で取得・変更できます。
円で描いた時は、arc メソッドの第3引数で指定していたので、それの代わりです。

var ctx = canvas.getContext("2d");
ctx.lineWidth = 100;

詳しいサイト

Canvasで使える関数が紹介されています。
「こんな機能あったんだ~」という新発見もあるので、一度見てみてください!

【JS】Canvasで丸や四角で「消す」方法

こんにちはー。
題名のとおり、Canvas の「消す」機能で、丸などに形を変える方法を紹介します。

「消す」機能について

まずはじめに、消す方法としてのルールを書いておきます。

  • 白く塗る はダメ!(背景が白でない場合があるため)
  • 消した部分は透明になるようにする。

実装のポイント

context の globalCompositeOperation を、destination-out に変更すると、
fill や stroke で指定した領域を 切り取る ことができます。

また、このプロパティは、その他いろいろな値に変更できます。

サンプル:円形で消す

globalCompositeOperationを変更した状態で、arc メソッドを呼ぶことでできます。

var ctx = document.getElementById("xxx").getContext("2d");
function eraseArc() {
  ctx.globalCompositeOperation = "destination-out";
  ctx.beginPath();
  ctx.arc(100, 100, 50, 0, Math.PI*2, false);
  ctx.fill();
}

arc() の引数

arc(中心x, 中心y, 半径, 開始角度(ラジアン), 終了角度(ラジアン), どっち回りか(true→反時計回り))

応用例

See the Pen Canvas Erase By Arc by shundroid (@shundroid) on CodePen.dark

  • チェックボックス ON:描く、OFF:消す(globalCompositeOperation で切り替えています)
  • 背景色を変更で、消した部分が透明になっていることを確認できます

掲載したサンプルコードでは、ctx.arc で描画していますが、
このサンプルは mousemove で動いた時に描いているので、arc で描くと円が散らばってしまい、うまく描けません。
そのため、moveTo と、lineTo を使って描いています。

この方法については、次回ブログで書きたいと思います。

「消す」モードを戻したい

このままでは、常に stroke や fill した部分が切り取られてしまうため、
元の値に戻しておきましょう。
デフォルトの値は、source-over です。

var ctx = document.getElementById("xxx").getContext("2d");
ctx.globalCompositeOperation = "source-over";

js の正規表現で、「完全一致」でマッチする

こんにちはー。

機会があって、
正規表現で「完全一致」のテストの方法が知りたくなりました。
今日はその方法を紹介します。

どういうことがしたいのか

/abcde/.test("abcde"); // true
/abcde/.test("abcdef"); // これも true

このような場合だと、
1行目のようなテストする文字列がパターンと同じ場合、 true になりますが、
含んでいる場合(2行目)も true になってしまいます。
これを、2行目が false になって、1行目だけ true になるようにしたいんです。

完全一致したいとき

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions

次のようにすればできました!

/^パターン$/

^が先頭を表し、$が末尾を表します。
だから、それにパターンを挟む形でやれば「完全一致」でマッチできます。

例:

/^下$/.test("下"); // true
/^下$/.test("下町"); // false
/^下$/.test("上下"); // false

メリットは・・?

なら、「if ("下" === "下") {}」でよくない?
と思うかもしれません。
たしかに上の例ではそうですが、
正規表現で比較すると、様々なメリットを得ることもできます。

「完全一致」の or 検索

例えば、次のように書いたとしましょう。

var reg = /^(下|上)$/;

こうすれば、or でのテストもできますよ~

使用例:

/^(下|上)$/.test("下"); // true
/^(下|上)$/.test("上"); // true
/^(下|上)$/.test("上下"); // false
/^(下|上)$/.test("上野"); // false

その他、いろいろな「特殊文字」が使える

完全一致と言っていいのかわかりませんが、
? や、. などの特殊文字も使えます。

どれか1文字にマッチする

. を使います。

/^A.C$/.test("ABC"); // true
/^A.C$/.test("AC"); // false

※ 改行文字にはマッチしません。
  改行文字にマッチするには、\n や、\s(スペースなども含む)を使用します。

直前の文字の1回以上の繰り返しにマッチする

+ を使います。

/^AA+B$/.test("AAB"); //true
/^AA+B$/.test("AAAAAAAAAAAAAAAAB"); // true
/^AA+B$/.test("AB"); //false

※繰り返さない場合(0回以上の繰り返し)にもマッチするときは、* を使います。

その他の特殊文字の意味と使い方は、MDN の記事をご覧ください。

感想

学んでいて、
正規表現って、実用性が高いんだな☆と気づきました。