blog.鶯梭庵

二〇一六年 皐月 廿一日 土曜日

VMware Fusion 上の Windows 7 または 8 を 10 にアップグレード [/links]

Windows 10 の無料アップグレード期間が 7 月 29 日に終了する。それを受けて、Windows 7、8、8.1 のユーザーに対する半強制アップグレードが始まっている。明示的にキャンセルしないと自動的にアップグレードされてしまうので、今までの OS を使い続けたいと思っている人にとっては迷惑極まりない。もっとも、アップグレード後 1 か月以内であれば元に戻すことができる。

Mac 上で VMware Fusion を使って Windows を動かしている場合、幸いなことに、自動アップグレードが実行されない。ディスプレイが Windows 10 と互換性がないと判定されるためだ。アップグレードをしない場合は好都合だが、アップグレードしたいと思ったときには困る。

VMware に限らず、仮想マシン上で動いている Windows では、アップグレードができない場合があるようだ。VMware の場合、対処法が VMware のナレッジベースにある。

私は、Windows 7 を仕事用に、Windows 8 をテスト用に使っていた。Windows 8 は仕事では使えないと判断していたので、Windows 7 はそのままにしておいて、Windows 8 を Windows 10 にアップグレードした。Windows 10 が仕事に使えることがわかれば、Windows 7 の使用をやめて Windows 10 に一本化する予定だ。

[この記事だけを読む。] [この記事にコメントを書く。] [最新の記事を読む。]

二〇一六年 卯月 九日 土曜日

CoffeeScript で即時関数を書く方法まとめ [/links]

JavaScript には、即時関数とか即時実行関数とか呼ばれるパターンがある。こんなの。

(function () {

// 何かする

})();

関数を定義して、すぐさま実行する。(だから「即時関数実行」というべきだろうと思うけれど、慣習に従う。)JavaScript で変数をスコープに閉じ込めるには関数の中に入れるしかないので、このパターンをよく使う。

で、よく知られている通り、これは CoffeeScript では、

do ->

// 何かする

と簡単に書ける。でも、どうしてそう書けるのか。


そもそも do キーワードは何をするのか。ためしに

do foo

を JavaScript にコンパイルすると

foo();

となる。つまり、do キーワードは、後に続くものを関数として実行する。

-> は関数を定義するので、それを do の後におけば、関数が定義されて実行される。すなわち、即時関数だ。

即時関数を後からもう一度呼び出したい場合がある。上記をふまえれば、次のように書けばよいことがわかる。

do greet = ->

alert 'Hello'

setTimeout greet, 5000

これを実行すると、すぐに "Hello" と出て、5 秒後にまた "Hello" と出る。このパターンはページの初期化コードなどに使える。ページが読み込まれたときに自動的に初期化し、ユーザーがいろいろ操作した後に初期化ボタンを押すとまた初期化される、みたいな。


では、即時関数に変数を渡すにはどうするか。こうする。

do ($ = jQuery) ->

$('body').hide()

コンパイルすると、こうなる。

(function($) {

return $('body').hide();

})(jQuery);

この場合、jQuery がグローバル変数で、$ がローカル変数になる。変数 $ は、即時関数の中では jQuery グローバルオブジェクトを参照するが、即時関数の外では別のものを参照するかもしれない。

($ = jQuery) -> というパターンは、通常は引数のデフォルト値を指定するのに使う。これだけをコンパイルすると、こうなる。

(function($) {

if ($ == null) {

$ = jQuery;

}

});

これが即時関数でうまくコンパイルされるのを見ると、CoffeeScript はよくできているとあらためて思う。


上記を組み合わせると、こんなこともできる。

do

do greet = (greeting = 'Hello') ->

->

alert greeting

setTimeout greet('Bye'), 5000

これを実行すると、最初に Hello と出て、5 秒後に Bye と出る。どうしてこうなるかは、直感的にはわかりにくいかもしれない。コンパイル結果を見るとわかりやすいかもしれないし、そうでないかもしれない。

[この記事だけを読む。] [この記事にコメントを書く。] [最新の記事を読む。]

二〇一六年 如月 廿九日 月曜日

たったの 9 分でたどる日本の歴史 [/links]

ものすごく早口な英語だけど、内容はだいたいあってる。日本人なら、言葉が聞き取れなくても、映像を見るだけで楽しめるはず。



[この記事だけを読む。] [この記事にコメントを書く。] [最新の記事を読む。]

二〇一五年 霜月 廿三日 月曜日

CentOS 7 に Nginx と Node.jsをインストール [/links]

前回の記事で、CentOS 7 に Nginx をインストールする方法を書いた。そこでは、semanage をインストールするのは面倒だと書いたけれど、Nginx のバックエンドで Node.js を動かすなら、semanage が必要だ。semanage は policycoreutils-python パッケージに含まれているので、次のコマンドでインストールできる。

yum -y install policycoreutils-python

Nginx をインストールして起動し、80 番ポートを開けるまでは、前回の記事に書いた。

semanage を使うなら、ファイル転送のためのユーザーは普通に作ってよい。ユーザー名を www とするなら、

useradd www

passwd www

となる。次に、

chmod 755 /home/www

でアクセス権を設定するが、それだけではウェブサーバーが /home/www 以下のファイルにアクセスできない。/home/www/html 以下にウェブリソースを置く場合、

semanage fcontext -a -t httpd_sys_content_t "/home/www/html(/.*)?"

でコンテキストを設定して、

restorecon -R /home/www/html/

で設定を反映する。

Nginx の設定は、基本的にはこんな感じ。

server {

listen 80;

root /home/www/html;

location / {

try_files $uri @nodejs;

}

location @nodejs {

proxy_pass http://localhost:3000;

}

}

server {

listen 80;

server_name blog.ousaan.com;

location / {

proxy_pass http://localhost:3001;

}

}

server {

listen 80;

server_name origami.ousaan.com;

location / {

proxy_pass http://localhost:3002;

}

}

最初の server がデフォルトのサーバーになる。この設定では、blog.ousaan.com と origami.ousaan.com へのリクエストは無条件に Node.js に渡して、そのほかのリクエストについては、URI に対応するファイルがあればそれを返し、なければ Node.js に処理を移す。

Node.js のインストール方法は Node.js のウェブページにある。日本語のウェブページを検索すると古い情報ばかり出てくるので注意。

Node.js を素のまま使うのは辛いので、私は、CoffeeScript をグローバルにインストールし、Express.jsJade をローカルにインストールした。Node.js に npm が付いているので、インストールは簡単。インストール方法はそれぞれのウェブページを参照のこと。

Node.js の設定は、以前の記事に書いたのと同じ。ただし、それだけでは 502 Bad Gateway のエラーが出る。SELinux のポリシーにより、3000 〜 3002 番ポートに HTTP でアクセスできないため。次のコマンドでアクセスできるようになる。ポートを外に向かって開く必要はないので、ファイアウォールの設定はいらない。

semanage port -a -t http_port_t -p tcp 3000-3002

最後に、Node.js アプリをデーモン化する。そのためには forever を使うことが多いようだけれど、CentOS 7 なら systemd を使ったほうがよい。アプリケーションが /home/www/app/index.coffee だとして、それを nodejs という名前のサービスにするなら、/etc/systemd/system/nodejs.service というファイルを作って、以下のように記述する(参考にしたのは Deploying Node.js with systemd とか How To Deploy Node.js Applications Using Systemd and Nginx とか)。

[Service]

ExecStart=/usr/bin/coffee /home/www/app/index.coffee

Restart=always

User=www

Group=www

[Install]

WantedBy=multi-user.target

すると、

systemctl start nodejs

でサービスを開始できる。システムが再起動したとき自動的に起動させるには、

systemctl enable nodejs

とするだけでよい。

[この記事だけを読む。] [この記事にコメントを書く。] [最新の記事を読む。]

二〇一五年 霜月 一日 日曜日

CentOS 7 に Nginx をインストール [/links]

さくらインターネットの VPS を使い始めた。標準 OS は CentOS 6 だが、どのみち 1 から構築するならと、最新の CentOS 7 をインストールした。インストール方法はサポートページに書いてある通り。

ウェブサーバーの定番は Apache だが、私は Node.js を使ってサブドメインも使いたい。以前書いた方法では、Apache をインストールしてもプロキシとしてしか使わない。それもどうかと思ったので、Nginx をインストールすることにした。インストール方法は Nginx のサイトにある。日本語のウェブサイトを検索すると古い情報ばかり出てくるので注意。

Nginx もプロキシとしてのみ使うのはもったいないので、静的ファイルは Nginx から提供し、動的リソースのみ Node.js に処理を渡すことにする。そのため、まずは Nginx で静的 HTML を提供できるようにする。CentOS 7 は 6 から大きく変わっているので、気をつけなければならないことがいくつかある。(ちなみに、参考にしたのはデージーネット著『はじめての CentOS 7 Linux サーバ構築編』。)

まず、80 番ポートを開ける必要がある。そのためのコマンドは次の通り。CentOS 6 より簡単になった。

firewall-cmd --permanent --add-service=http

firewall-cmd --reload

Nginx を起動するには、

systemctl start nginx.service

とすればよい。システムが再起動した後自動的に起動するようにするには、

systemctl enable nginx.service

とするだけで、必要な処理が自動的に実行される。

ウェブブラウザからサーバーにアクセスし、ようこそページが表示されれば、インストールは成功。

次に、Mac なり Windows なりからファイルを転送するためのユーザーを作る。ユーザー名が ftp_user なら、

useradd -d /var/www ftp_user

passwd ftp_user

(パスワードを 2 回入力)

chmod 755 /var/www

とする(root 権限が必要)。ホームディレクトリを /var/wwwにするのがミソ。CentOS 7 では SELinux を使うことが前提であり、ウェブサーバーは /var/www 以下のファイルにデフォルトでアクセスできる一方、/home 以下にはアクセスできない。アクセスできるように設定することも可能だが、そのためのツール semanage をインストールするところから始める必要があり、面倒だ。

ところで、CentOS 7 に関する日本語のブログ記事を読むと、最初に SELinux を無効にすると書いている記事が多い。しかし、わざわざセキュリティを緩めるというのは、意味がわからない。SELinux がいやなら、ほかの OS を使えばよかろう。

サーバーに SSH でアクセスしているなら、SFTP が使える。FTP サーバーをインストールするのも面倒だし、最近の主だった FTP クライアントはいずれも SFTP に対応している。FTP ソフトウェア(私が使っているのは Forklift)で SFTP を使ってサーバーにアクセスし、/var/www 以下に適宜フォルダーを作り、テスト用の HTML ファイルを置く。

最後に、Nginx を設定して、今置いた HTML ファイルが表示されるようにする。/etc/nginx/conf.d の下に、適当なファイル名(拡張子は conf)のファイルを作って、サーバーを設定する。http://blog.ousaan.com/ にアクセスしたときに /var/www/html/blog/index.html が表示されるようにする場合、設定ファイルは次のようになる。

server {

listen 80;

server_name blog.ousaan.com;

location / {

root /var/www/html/blog;

index index.html;

}

}

ファイルを保存したら、

systemctl reload nginx.service

で設定ファイルを読み込む。もう一度ウェブブラウザからサーバーにアクセスすると、期待通りのウェブページが表示されるはず。

[この記事だけを読む。] [この記事にコメントを書く。] [最新の記事を読む。]

[もっと古い 5 件の記事を読む] [もっと新しい 5 件の記事を読む]

RSS feed

カテゴリ

[/language] (98)
[/links] (254)
[/mac] (114)
[/music] (36)
[/origami] (406)
[/this_blog/ajax] (7)
[/this_blog/blosxom] (4)
[/this_blog/history] (12)
[/this_blog/perl] (9)

最新記事

パスワードについてのあなたの常識はもはや非常識かもしれない・その1 [/links]
ニューラルネットワークとディープラーニングで翻訳はどうなる・その5 [/language]
ニューラルネットワークとディープラーニングで翻訳はどうなる・その4 [/language]
HTTPS 対応 [/links]
ひらがな・カタカナ学習ウェブアプリ [/links]
日本語の「た」と英語の過去形 [/language]
ORI-REVO で回転楕円体を折る・その2 [/origami]
ORI-REVO で回転楕円体を折る・その1 [/origami]
折り紙建築 [/origami]
折鶴に松図小柄 [/origami]
改訂版・たぶん、ほとんどの人は viewport meta タグの指定をまちがえてる・その6 [/links]
改訂版・たぶん、ほとんどの人は viewport meta タグの指定をまちがえてる・その5 [/links]
改訂版・たぶん、ほとんどの人は viewport meta タグの指定をまちがえてる・その4 [/links]
改訂版・たぶん、ほとんどの人は viewport meta タグの指定をまちがえてる・その3 [/links]
改訂版・たぶん、ほとんどの人は viewport meta タグの指定をまちがえてる・その2 [/links]

羽鳥 公士郎