人生シーケンスブレイク

シーケンスブレイク(Sequence breaking、シークエンスブレイクとも)とは、テレビゲームにおいて開発が想定している攻略ルートを逸脱し、ショートカットする行為のことである。

Docker for Mac が落ちる不具合を回避する

Docker for Mac Version 17.06.0-ce-mac18 (18433) から、気が付いたらDockerが落ちているケースに多く遭遇した。

調べてみたところ、GitHubのIssueに同様の報告と解決方法が提示されていた。

Containers fail to keep running since latest Docker update · Issue #1809 · docker/for-mac · GitHub

HTTP proxies are configured by modifying the environment variables inside the VM, which requires a VM restart whenever the variables change. In this case perhaps it’s unnecessary to reboot when the exclude changes, when there is no actual proxy set.

とのことで、Docker for Mac の設定 > プロキシ > プロキシを設定しない 設定にすることで解決する模様。

f:id:ShineSpark:20170713005151p:plain

やったね。

ダライアスバースト オリジナルサウンドトラック

ダライアスバースト オリジナルサウンドトラック

Rubyで固定長のCP932(Shift_JIS)ファイルを扱う

哀しいことにCSVなどでなく固定文字列長のCP932ファイルからインポートを行わないといけなくなったのでその対処方法。
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15]

データのイメージ

123456abcdef池袋                                          イケブクロ                                           10
123456abcdef目白                                          メジロ                                             10
123456abcdef高田馬場                                       タカダノババ                                        10

全角=2バイト, 半角1バイトという前提でデータファイルが設計されているが、Ruby 2.x で文字列として全角半角問わず1文字は1文字としてカウントされる為、文字数がズレることがある。

対処

byteslice を使い特定バイト位置をスライスする。

irb(main):023:0> File.foreach('test.txt') { |line| p line.byteslice(12...58); p line.byteslice(58...107) }
"\x92r\x91\xDC                                          "
"\xB2\xB9\xCC\u07B8\xDB                                           "
"\x96ڔ\x92                                          "
"Ҽ\xDE\xDB                                             "
"\x8D\x82\x93c\x94n\x8F\xEA                                      "
"\xC0\xB6\xC0\xDE\xC9\xCA\xDE\xCA\xDE                                        "

utf-8に変換する

irb(main):022:0> File.foreach('test.txt') { |line| p line.byteslice(12...58).encode('utf-8', 'cp932'); p line.byteslice(58...107).encode('utf-8', 'cp932') }
"池袋                                          "
"イケブクロ                                            "
"目白                                          "
"メジロ                                              "
"高田馬場                                      "
"タカダノババ                                           "

必要に応じてstripする

irb(main):021:0> File.foreach('test.txt') { |line| p line.byteslice(12...58).encode('utf-8', 'cp932').strip; p line.byteslice(58...107).encode('utf-8', 'cp932').strip }
"池袋"
"イケブクロ"
"目白"
"メジロ"
"高田馬場"
"タカダノババ"

ルビィのぼうけん こんにちは!プログラミング

ルビィのぼうけん こんにちは!プログラミング

Windows 7でキーリピート速度を変更する

Amazon WorkSpaces 上で Windows 7 を使うようになったが、キーリピート速度の設定方法を忘れてしまったのでメモ。

f:id:ShineSpark:20161106214852p:plain

HKEY_CURRENT_USER > Control Panel > Accessibility > Keyboard Response にて、以下を変更する。

レジストリ 説明 個人的推奨値(単位: ms)
AutoRepeatDelay キーリピート開始ウェイト 250
AutoRepeatRate キーリピート間隔 25

他のサイトでは他の値変更も記載されているが、根拠が不明なので一旦はこれで。

iOS10 でロック解除するのにいちいちホームボタンを押すのがダルい時の解決方法

iOS10 からアンロックする時にデフォルトではホームボタンを押さないと解除できなくなった。

設定 > 一般 > アクセシビリティ > ホームボタン から、指を当てて開く*1を On にすると押さなくても触れるだけで解除できるようになる。

f:id:ShineSpark:20160915055043j:plain

*1:言語設定を English にしている場合には、Settings > General > Accessibility > Home Button

gulp-sassで自動でSass/SCSSからcssファイルを生成したり、他にもいろいろする

gulp-sassで自動でSass/SCSSからcssファイルを生成する - 人生リアルタイムアタック の続き。完全上位互換のつもり。

前回は gulp-sass の導入だけだったので、この記事では gulp / Sass (SCSS) 周り全般について述べたい。

構成

以下のディレクトリ構成を例にする。

./test
├── css
│   └── // cssファイルの生成先
└── assets
│   └── sass
│      └── **/*.scss
└── index.html

Node.jsは LTSのv4.4.5 がインストール済みで、$ npmコマンドが利用可能になっている前提。

package.jsonをつくる

最初に、Node.jsのパッケージ管理ファイルであるpackage.jsonを生成する。 package.jsonはコマンドで生成できる。

$ npm init -y
Wrote to /Users/<user_name>/git/test/package.json:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {},
  "devDependencies": {},
  "scripts": { # 後でちょっと追加する予定
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

scripts に gulp default コマンドを追加する

package.jsonのscripts部分に "start": "gulp default", を追加する。詳細は後述。

  "scripts": {
    "start": "gulp default", // ここを追加
    "test": "echo \"Error: no test specified\" && exit 1"
  },

package.jsonはこうなればOK.

{
  "name": "test",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {},
  "devDependencies": {},
  "scripts": {
    "start": "gulp default",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": ""
}

インストール

それではgulpとgulp-sassをインストールする。
-gオプションを付けずにプロジェクト配下にインストールすることで、複数人で開発する場合でもバージョンを揃えて利用するようにする。

先程package.json"start": "gulp default",を追加したのは、$ npm start コマンドでプロジェクト配下にインストールしたgulpからdefaultタスクを実行する為の設定。

なお、開発環境用のツールなので--save-devを必ず書こう。

$ npm install gulp gulp-sass --save-dev

インストール完了後、package.jsonを開いてみよう。

...
  "devDependencies": {
    "gulp": "^3.9.1",
    "gulp-sass": "^2.3.2"
  },
...

devDependenciesに、gulpとgulp-sassが追加されていればOK.

package.jsonとは

package.jsonとは、Node.jsのパッケージ管理ファイル。
bundleのように今後は $ npm install するだけで同じバージョンのパッケージをインストールすることが可能になる。

ただし、 --save-dev を付け忘れると、devDependenciesに追加されないので忘れずに付けよう。

gulpfile.jsの作成

インストールが完了したので、今度はgulp-sassを利用する為のタスクをgulpfile.jsに記述していく。
まずは最も簡単な例として、*.scssに変更があれば自動で*.cssを生成する例。

'use strict';

var SCSS_SRC = './assets/sass/**/*.scss';
var CSS_DEST = './css/';

var gulp = require('gulp');
var sass = require('gulp-sass');

// Sassコンパイルタスク
gulp.task('sass-compile', function(){
  return gulp.src(SCSS_SRC)
    .pipe(sass.sync().on('error', sass.logError))
    .pipe(gulp.dest(CSS_DEST));
});

// scssファイル群の変更を監視するタスク
gulp.task('scss:watch', function(){
  var watcher = gulp.watch(SCSS_SRC, ['sass-compile']);
  watcher.on('change', function(event) {
    console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
  });
});

// gulpのデフォルトタスクとしてscss:watchタスクを指定
gulp.task('default', ['scss:watch']);

sassとscssという単語が混在しているのはちょっと諦め気味...
なお、最近はgulp-plumberは不要。

試してみる。

ここまでで、既に自動でSCSSからcssファイルを生成できるので試してみる。
$ npm start を叩いて、ファイルを保存するだけで既に自動でcssファイルが生成可能になる。

$ npm start

> test@1.0.0 start /Users/<user_name>/git/test
> gulp default

[11:57:40] Using gulpfile ~/git/test/gulpfile.js
[11:57:40] Starting 'scss:watch'...
[11:57:40] Finished 'scss:watch' after 12 ms
[11:57:40] Starting 'default'...
[11:57:40] Finished 'default' after 9.47 μs

この状態で、assets/sass/hoge/fuge.scss にこんなSCSSを書いてみる。

* {
  font-size: 10rem;

  p {
    color: #ccc;
  }
}
File /Users/<user_name>/git/test/assets/sass/hoge/fuge.scss was changed, running tasks...
[12:01:58] Starting 'sass-compile'...
[12:01:58] Finished 'sass-compile' after 35 ms

こんな感じのログがでて、./css/hoge/fuge.cssが生成されれば完了。終了するにはctrl + c

だが、SCSS環境構築はまだ終わりではない。

Lintツールを併用する

Sass/SCSSを書くにあたり、Lintツールを導入しなければCSS同様すぐ煩雑なコードになってしまう。
Lintツール無しで作ったSCSSはCSSの大差無く万人がみても分かりづらい。最初からLintを入れてどのように書けばいいのか学びながら書いた方がよい。

gulpがあれば自動でチェックできるので、このタイミングでLintツールを導入しよう。

Ruby製の scss-lint はドキュメントが充実しており、オプションも豊富で、一時的な除外もできて使い勝手がよい。airbnbgithubに公開している有名なスタイルルールもこのscss-lint用だ。
ということで、scss-lintと、gulp上でscss-lintを実行する為の gulp-scss-lint の2つを導入する。

インストール

$ gem install scss_lint # -でなく_に注意。
$ npm install gulp-scss-lint --save-dev

gulpfile.jsにgulp-scss-lint設定を追加

先程つくったgulpfile.jsを以下のように3箇所書き換える。

var SCSS_SRC = './app/assets/stylesheets/**/*.scss';
var CSS_DEST = './css/';

var gulp = require('gulp');
var sass = require('gulp-sass');
var scsslint = require('gulp-scss-lint'); // 1. gulp-scss-lintを追加 ----

// Sassコンパイルタスク
gulp.task('sass', function(){
  ...(略)
});

// 2. 以下を追加する ----
// scss-lintタスク
gulp.task('scss-lint', function(){
  return gulp.src(SCSS_SRC)
    .pipe(scsslint());
});
// ココマデ ----

// scssファイル群の変更を監視するタスク
gulp.task('scss:watch', function(){
  // 3. ここに 'scss-lint' を追加する ------↓
  var watcher = gulp.watch(SCSS_SRC, ['scss-lint', 'sass-compile']);
  watcher.on('change', function(event) {
    console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
  });
});

// gulpのデフォルトタスクとしてscss:watchタスクを指定
gulp.task('default', ['scss:watch']);

scss:watchタスク内の配列にscss-lintタスクを追加したことで、sass-compile後にscss-lintを実行するようになった。
scss-lintタスクの書き方については幾つかあるが、上記のようにlintタスク単体で記述しておけばコンパイルせずにlintだけ単体実行することも可能になるので、独立したタスクにして配列で渡すとよい。

ちなみに.scss-lint.ymlを指定する場合にはこう書く。

// scss-lintタスク
gulp.task('scss-lint', function(){
  return gulp.src(SCSS_SRC)
    .pipe(scsslint({'config': '.scss-lint.yml'}));
});

Sass/SCSS書き換え時にブラウザ自動リロードしたい

Browsersync - Time-saving synchronised browser testing を利用する。

インストール

$ npm install browser-sync --save-dev

gulpfile.jsの書き換え

// HTML, Haml, JavaScriptなども監視したければこんな形で定義しておく
var HTML_SRC = './template/**/*.html';
var CSS_SRC  = './css/**/*.css';

// browser-sync 読み込み
var bs = require('browser-sync').create();

...(略)

// browser-syncタスク
gulp.task('bs', function(){
  var bsOptions = {};
  bsOptions.files = [HTML_SRC, CSS_SRC]; // ここに監視対象ファイルを書く
  bsOptions.server = './'; // 単体実行する時
  // bsOptions.proxy = 'localhost:3000'; // proxy実行する時のターゲット
  // bsOptions.proxy = '192.168.99.100:3000'; // docker用
  // bsOptions.port  = 3001; // proxy実行する時のport
  bs.init(bsOptions);
});

gulp.task('default', ['bs', 'sass-watch']); // 'bs' タスクを追加

試してみる

$ npm start

> test@1.0.0 start /Users/<user_name>/git/test
> gulp default

[16:08:24] Using gulpfile ~/git/test/gulpfile.js
[16:08:24] Starting 'bs'...
[16:08:24] Finished 'bs' after 16 ms
[16:08:24] Starting 'scss:watch'...
[16:08:24] Finished 'scss:watch' after 14 ms
[16:08:24] Starting 'default'...
[16:08:24] Finished 'default' after 13 μs
[BS] Access URLs:
 ----------------------------------------
       Local: http://localhost:3000
    External: http://xxx.xxx.xxx.xxx:3000
 ----------------------------------------
          UI: http://localhost:3001
 UI External: http://xxx.xxx.xxx.xxx:3001
 ----------------------------------------
[BS] Serving files from: ./
[BS] Watching files...

ブラウザで http://localhost:3000 index.html が開き、htmlやcssに変更があれば自動で再読み込みされるようになる。

Railsなどで開発している場合には、serverプロパティをコメントアウトした上で、コメントアウトしている bsOptions.proxy などの設定を有効化すれば利用可能。

オマケ1. gulp default以外もscriptsに登録する

gulpfile.jsにgulp defalutを追加した要領で、他のタスクも追加できる。

  "scripts": {
    "start": "gulp default",
    "scss-lint": "gulp scss-lint",
    "test": "echo \"Error: no test specified\" && exit 1"
  }

上記のように記述すると、$ npm run-script scss-lint で scss-lintタスクが実行可能。

start, test など、一部のコマンド以外は run-script を含めたコマンドになる、$ npm runで確認しよう。

$ npm run
Lifecycle scripts included in test-project:
  start
    gulp default

available via `npm run-script`:
  scss-lint
    gulp scss-lint

オマケ2. gulpのタスクを都度package.jsonに書くのはダルい

  "scripts": {
    "start": "gulp default",
    "gulp": "gulp",
    "test": "echo \"Error: no test specified\" && exit 1"
  }

とすると、$ npm run-script gulp <task_name> で実行できる。
しかし開発環境として配布する場合には、メンバー間の余計なコストが掛からないようscriptsに幾つか纏めておいておいた方が良さ気。

オマケ3. ここでは語らないもの

ということで、大体こんな感じのpackage.jsonとgulpfile.jsを現在は利用している。

package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "gulp default",
    "gulp": "gulp",
    "scss-lint": "gulp scss-lint",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "devDependencies": {
    "browser-sync": "^2.13.0",
    "gulp": "^3.9.1",
    "gulp-sass": "^2.3.2",
    "gulp-scss-lint": "^0.4.0"
  }
}

gulpfile.js

'use strict';

var HTML_SRC = './template/**/*.html';
var CSS_SRC  = './css/**/*.css';
var SCSS_SRC = './assets/sass/**/*.scss';
var CSS_DEST = './css/';

var gulp = require('gulp');
var sass = require('gulp-sass');
var scss_lint = require('gulp-scss-lint');
var bs = require('browser-sync').create();

// browser-syncタスク
gulp.task('bs', function(){
  var bsOptions = {};
  bsOptions.files = [HTML_SRC, CSS_SRC]; // ここに監視対象ファイルを書く
  bsOptions.server = './'; // 単体実行する時
  // bsOptions.proxy = 'localhost:3001'; // proxy実行する時
  // bsOptions.port  = 3001; //
  bs.init(bsOptions);
});

// Sassコンパイルタスク
gulp.task('sass-compile', function(){
  return gulp.src(SCSS_SRC)
    .pipe(sass.sync().on('error', sass.logError))
    .pipe(gulp.dest(CSS_DEST));
});

// scss-lintタスク
gulp.task('scss-lint', function(){
  return gulp.src(SCSS_SRC)
    .pipe(scss_lint());
});

// scssファイル群の変更を監視するタスク
gulp.task('scss:watch', function(){
  var watcher = gulp.watch(SCSS_SRC, ['scss-lint', 'sass-compile']);
  watcher.on('change', function(event) {
    console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
  });
});

// gulpのデフォルトタスクとしてscss:watchタスクを指定
gulp.task('default', ['bs', 'scss:watch']);

もうちょっと何かあったら追記する。

MicrosoftがWindows10の半ば強制アップグレードを勧める理由

セキュリティは専門外ですが分かる範囲で

のリプライで盛り上がっている話題の簡単な回答。

駆け足で書いたので違うぞって人は指摘なり別記事書いていただけると助かります。

古いWindowsマルウェアや犯罪の温床になる

Windowsに限った話ではありませんが、脆弱性が放置されたOSはマルウェアクラッキングの対象と成り得ます。 昔のウイルスといえば、そのPC内の情報が抜かれたり、PC利用に支障を来すなど、PC利用者だけに限った被害があるものが主でした。
しかし現在のウイルスはというと、オンラインバンキングへの攻撃やその他のサイバー攻撃に利用されるなど、他者にも影響を及ぼすものが増えています。

今回のバス掲示板のような、常時起動中 & インターネット接続中のOSは格好の踏み台となります。 また、メンテナンスされていない高齢者のPCがマルウェアで溢れていた。というケースも多々あります。これらもウイルスやマルウェアに侵された結果、犯罪に利用されてしまうケースがあるでしょう。*1

ウイルスの脅威が、感染したPCの利用者だけに限らなくなった昨今では、インターネットに接続しているにも関わらず、適切なセキュリティ対策をしていないPCを放置することは、インターネット利用者全体の安全上の問題となります。

強制はやり過ぎではないのか?

Windows XPがサポート終了1年前から、何度もサポート終了についてアナウンスされ、新聞やTVでも何度も報道されたことは記憶に新しいですね。 しかしながら、サポート終了後にも「OSアップグレードの予算がない」「サポート終了を知らなかった」などと、アップグレードできなかった行政機関や企業のニュースも多くありましたね。

強制アップグレードが行われなかったWindows XPは、結局現在も多く稼働しています。再三に渡るアナウンスだけでは全く効果が無かったのです。

アナウンスをしただけではアップグレードしてもらえません。しかし、Microsoftも永久にサポートし続けることはできません。それでも、自社OSの犯罪利用を防ぐ社会的責任があります。
今回のアップグレードについては確かに強引かとは思うのですが、Windows XPの失敗も踏まえて、犯罪抑止に批判覚悟でも行う必要があったのではと推測します。

(本趣旨と少しそれますが) Enbedded Editionについて

WindowsにはPOSや券売機、電光掲示板のようなハードウェアに組み込む形で利用する為のEnbedded Editionと呼ばれるEditionが存在します。

ハードウェアとセットでの長期利用が想定されたOSであり、セキュリティに限らない法人向けの手厚いサポートが含まれています。
一般的にこれらの組み込みハードウェアは納品して終わりではなく、納品後も納品先へのサポート・メンテナンス対応が必要です。長期の利用中に於いてはMicrosoftに直接問い合わせが必要になるケースもあるでしょう。

にも関わらず、組み込み製品を専門で開発している企業がEnbedded Editionを利用せず通常のWindowsを利用することは無知か怠慢としか言えません。

また、Windows10のアップグレードに関する問題は既に数ヶ月前から話題になっていました。にも関わらず、回避手段も講じず今回のような画面を放置していること自体、セキュリティに限らず適切な管理をしている企業だとは到底思えません。

定期的なセキュリティチェックやメンテナンスは行われていたのでしょうか?

その他の組み込み製品について

介護事業者の例がありましたが、「適切に管理しておらず、Windows10の強制アップグレードが一度発生する機器」より、「適切に管理しておらず、ウイルスに感染している可能性のある機器」の方が怖いです。

当然、「適切に管理し、まだドライバ等が対応していない為敢えてアップグレードしていない機器」か「適切に管理し、アップグレードした機器」が好ましいですが、アップグレード通知が出るOSは少なくとも適切には管理されていないでしょう。

なお介護事業者が扱う機器の具体例が読み取れませんでしたが、仮に医療機器などがHome Editionでしたら絶対にその機器を使いたいと思いません。

とはいえ現在の状況は純正ウイルスとも呼べるような状況ではないのか

Windows10のアップグレードに関してはMicrosoftから以下のアクションが行われています。

  • 無償のアップグレード & 1ヶ月以内の復元期間
  • 公式からも幾度に及ぶWindowsアップグレードに関するアナウンス
  • Windows10へのアップグレードを防ぐ手立ても公開済み

また、何度もWindows10アップグレードに纏わるトラブルがニュースになっています。どうしてもアップグレードしたくなければ、各企業で適切にこれらのニュースをキャッチアップ & 対処すれば済む問題です。

こんなにアナウンスされてる問題に対応できない企業は、今後もウイルス対策なんて出来るわけないんですから、素直にWindows10にアップグレードし、その後のセキュリティ対策はOSに任せるべきです。

ウイルスだったらポップアップ通知すらせず裏でこっそり動くんですから。

OSの強制アップグレードが無いWindows XPのシェアは未だに10.09%です。

Operating system market share

なお、私はMacユーザでここ数年Windowsを使っていない為、特段Microsoftに肩を持ってはおりません。

参考

*1:ソースは忘れましたが、Microsoftの人がどこかのインタビューで答えてた記憶があるので気になる人はググッてくださいまし。