読者です 読者をやめる 読者になる 読者になる

人生リアルタイムアタック

当面はPython学習帳

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

Windows

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

f:id:ShineSpark:20161106214852p:plain

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

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

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

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

iOS

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

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

f:id:ShineSpark:20160915055043j:plain

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

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

Node.js 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']);

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

awkでdockerの<none>イメージを一括削除する

awk docker shell
$ docker images | awk '/<none>/{print $3}' | xargs docker rmi -f

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

Windows Security

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

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

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

古い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の人がどこかのインタビューで答えてた記憶があるので気になる人はググッてくださいまし。

gemをソースから自分でbuildする

Ruby

ちょっと必要になったので、備忘録を兼ねて。

  1. gemリポジトリをローカルに持ってくる
  2. gem build *.gemspec
  3. gem install *-<version>.gem

CentOS6にsquidでプロキシサーバを立てる

CentOS

はじめに

海外に居るため、一部国内のコンテンツが見れない。
さくらVPSに外部プロキシサーバを立てて、国内コンテンツを普通に見たい。

PC ---- ルータ ---- プロキシサーバ(さくらVPS) ---- Webサーバ

インストール

$ sudo yum install squid

…

=============================================================================================================
 パッケージ                アーキテクチャ      バージョン                         リポジトリー          容量
=============================================================================================================
インストールしています:
 squid                     x86_64              7:3.1.23-16.el6_8.4                updates              1.8 M
依存性関連でのインストールをします。:
 libtool-ltdl              x86_64              2.2.6-15.5.el6                     base                  44 k

トランザクションの要約
=============================================================================================================
インストール         2 パッケージ

総ダウンロード容量: 1.9 M
インストール済み容量: 6.4 M
これでいいですか? [y/N]y
パッケージをダウンロードしています:
(1/2): libtool-ltdl-2.2.6-15.5.el6.x86_64.rpm                                         |  44 kB     00:00
(2/2): squid-3.1.23-16.el6_8.4.x86_64.rpm                                             | 1.8 MB     00:00
-------------------------------------------------------------------------------------------------------------
合計                                                                         3.7 MB/s | 1.9 MB     00:00

2016/06/02現在、squid : Optimising Web Delivery によると最新は3.5.19とのことなので若干古い。

squid.confの設定

/etc/squid/squid.conf を編集する。

ルータからのアクセスを許可する為、自宅のIPアドレスを調べ許可IPアドレスとして登録する。 確認には先達に従い、 確認くん を使う。

# 元々あるhttp_access deny allの上に追記すること。
acl indoor src xxx.xxx.xxx.xxx/32
http_access allow indoor
http_access deny all

ポート番号はデフォルトから別の番号に変更する。 12345 は例なので適宜お好みで。

# Squid normally listens to port 3128
#http_port 3128
http_port 12345

プロキシサーバ経由であることを隠蔽する為、以下のオプションをファイル末尾に追記する。

# ローカルのIPアドレスを隠蔽
forwarded_for off

# リクエストヘッダのプロキシ情報を隠蔽
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all

設定が完了したら、後はいつものコマンド。

# squid起動
$ sudo /etc/init.d/squid start

# 自動起動設定
$ sudo chkconfig squid on

squidのバージョンによっては startコマンド実行時にWarningが出るので適宜修正を行う。3系であれば上記設定でほぼ問題ないハズ。

iptablesの設定

iptablesによるポート制限も変更を行う。

:FWINPUT - [0:0]
-A INPUT -j FWINPUT
-A FORWARD -j FWINPUT
-A FWINPUT -i lo -j ACCEPT
-A FWINPUT -p icmp --icmp-type any -j ACCEPT
-A FWINPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FWINPUT -p tcp -m tcp --dport 12345 -s xxx.xxx.xxx.xxx -j ACCEPT
-A FWINPUT -j REJECT --reject-with icmp-host-prohibited

変更完了したらiptables再読み込み。

$ sudo iptables-restore < /etc/sysconfig/iptables

(任意)アカウントによるログイン制御

第三者の不正利用を防ぐ為にアカウントによるログイン制御を行うこともできる。認証方法は多数用意されているが、Basic認証と同じ仕組みがシンプルそう... と思ったが、nginxしか使ってないのでプロキシ専用のパスワードファイルを用意する。

# パスワード生成
$ sudo htpasswd -c /etc/squid/squid-passwd <user_name>
New password:
Re-type new password:
Adding password for user <user-name>

htpasswd コマンドが利用できない場合には、httpd-toolsをインストールすると良い。

$ sudo yum install httpd-tools

squid-passwdファイルを作成したら、squid.confに設定を追加する。
ただし記述順序に注意。http_accessは上から順に評価される。
先述のIPアドレス指定の後に設定を追加すると、自宅ではパスワードが不要、自宅外ではパスワード認証と使い分けることができる。

if IPアドレスが自宅:
  接続
elif BASIC認証OK:
  接続
else:
  接続不可
$ sudo vi /etc/squid/squid.conf

# 元々の自宅用設定
http_access allow indoor

# ここに自宅外設定を追加。
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/squid-passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

acl outdoor proxy_auth REQUIRED
http_access allow outdoor

# 元々の deny all 設定
http_access deny all

OS Xのプロキシ設定

システム環境設定 > ネットワーク > 詳細 > プロキシ にて、HTTPとHTTPSの設定を行うだけでよい。

f:id:ShineSpark:20160602195952p:plain

設定が完了したら、ブラウザから改めて 確認くん にアクセスし、IPアドレスがさくらVPSのものに変わっていることを確認する。

もしくは sudo tail -f /var/log/squid/access.log してlogを眺めてみる。

参考