JavaScriptのNaN値

JavaScriptのNaN値の覚書

  • どの値と比較しても真にならない
  • x == NaNも真にならない
  • x != x で x が NaN なら真になる
  • isNaN(x) で x が NaN数値でなければ真になる
  • isFinite(x) は x がNaN、Infinite、-Infiniteで真になる

JavaScriptのInfinityと-Infinity

JavaScriptで表現可能な最大値を超えると無限大という値になるそうだ

var integer = 10;
integer = Math.pow(integer, 20);
console.log(integer);
// 100000000000000000000
integer = Math.pow(integer, 20);
console.log(integer);
// Infinity 

負数の絶対値が同じく表現可能な最大値を超えた場合は無限大負値となるそうだ

var integer = -1;
integer = integer * Math.pow(10, 20);
console.log(integer);
// -100000000000000000000
integer = integer * Math.pow(10, 2000);
console.log(integer);
// -Infinity 

JavaScriptの算術演算

四捨五入

Math.round(1.6)
// 2

切り上げ

Math.ceil(1.2);
// 2

切り捨て

Math.ceil(1.9);
// 1

Mathオブジェクトには他に最大値取得、最小値取得、乱数、絶対値取得、べき乗、円周率、自然対数、平方根、立方根、三角関数などのメソッドがある

ガーベジコレクションとは

JavaScriptは自動的にガーベジコレクションを行う

ガベージコレクション(garbage collection; GC)とは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である。「ガベージコレクション」を直訳すれば「ゴミ収集」となる。1959年ごろ、LISPにおける問題を解決するためジョン・マッカーシーによって発明された。

出典 : ガベージコレクション - Wikipedia

JavaScriptのセミコロンの省略

JavaScriptは文を別々の行に記述すればセミコロンを省略できる

(function() {
var under = 1
under += 1
console.log(under)
setTimeout(function() {
console.log('Good-bye')
}, 1000)
})()

セミコロン省略派とセミコロン記述派に分かれる。どちらが正しいというのはないので好みの問題になる。

ただし前の文と次の文の組み合わせによっては2行が1行として処理されてしまったりと余計な気を使う必要があるのでセミコロンを記述する方が手堅い。

JavaScriptを使ってCanvas要素に図形を書く

canvas要素を書いたHTMLを設置する

<html>
<head>
  <title>example.html</title>
</head>
<body>
<h1>Updates</h1>
<canvas id="chart"></canvas>
<script src="/example.js"></script>
</body>
</html>

getContext()を使って逆三角形を作成する

(function() {
var chart = document.getElementById('chart');
if (! chart.getContext) {
return;
}
chart.width = 200;
chart.height = 200;
var c = chart.getContext('2d');
c.moveTo(0, 0);
c.lineTo(200, 0);
c.lineTo(100, 200);
c.closePath();
c.fillStyle = '#0000ff';
c.fill();
})();

より細かく描画させることで複雑な図形やグラフを描画することも可能

JavaScriptのXMLHttpRequestでAjaxの非同期通信を行う

同一ホストの同一ディレクトリ上にアクセスする度にコンテンツが変わるexample.phpファイルを設置する

<?php
$date = date("Y-m-d H:i:s");
echo $date . ' = ' . md5($date);
?>

取得した結果をリストで一覧にするためにexample.htmlを設置する

<html>
<head>
  <title>example.html</title>
</head>
<body>
<h1>Updates</h1>
<ul id="updates">
</ul>
<script src="/example.js"></script>
</body>
</html>

PHPからデータを定期的に受信してHTMLに出力するexample.jsを設置する

(function() {
if (window.XMLHttpRequest) {
setInterval(function() {
var request = new XMLHttpRequest();
request.open('GET', '/example.php');
request.send();
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200){
var text = document.createTextNode(request.responseText);
var li = document.createElement('li');
li.appendChild(text);
var ul = document.getElementById('updates');
ul.appendChild(li);
}
}
}, 2000);
}
})();

setInterval()を利用し2秒毎に無名関数を実行する。XMLHttpRequestオブジェクトのonreadystatechangeプロパティに関数を渡しておくと、ステータスに変更がある度にコールされる。現在のステータスはreadyStateプロパティから確認することができるので、ステータスに変更がある度にreadyStateを比較し、通信が成功したら取得した結果をHTMLに反映させている。

ApacheのエラーDocumentRoot must be a directory時の対策

Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.

エラー通りjournalctl -xnを実行するとずらずらとエラー内容が出てきて、ドキュメントルートがディレクトリでないというエラーを確認した

11月 15 03:46:09 localhost.localdomain httpd[16980]: DocumentRoot must be a directory

きちんとディレクトリを指定しているのであればSELinuxを疑う。getenforceを実行してEnforcingと出力されればSELinuxが動作しているということになるので停止させる。

SELinuxを一時的に停止させるには

setenforce 0

/etc/selinux/configで直接設定を変更すれば再起動しても停止したままになる

SELINUX=disabled

/sbin/mount.vboxsf: mounting failed with the error: No such device のエラー対応

環境

エラー対応

Vagrantを利用してVirtualBoxの開発環境を構築しようとしたところ自動でマウントされる予定のディレクトリがマウントできずエラーとなった

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` app /app
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` app /app
The error output from the last command was:
/sbin/mount.vboxsf: mounting failed with the error: No such device

vboxをリビルドする

vagrant ssh -c 'sudo /etc/init.d/vboxadd setup'

このようなメッセージがでればOK

Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]
Connection to 127.0.0.1 closed.

vagrant reloadすれば実行されなかったprovisionも実行されるし、ディレクトリもマウントされる

Thanks

vboxをリビルドする必要があるようです。

vagrantでmountエラーの解決方法