アーカイブ

‘JavaScript’ タグのついている投稿

修正ユリウス日

2010 年 3 月 11 日 コメントはありません

シリアル値

エクセルで経過日数を求めるには日付同士を単純に引き算すれば求められます。
エクセルではシリアル値という値を使って日付を管理しているからです。シリアル値は1900年1月1日を「1」、2日を「2」として延々と日数を数えた値です。

例えば、2001年2月18日から2004年1月1日までの経過日数を求めてみます。
2001年2月18日のシリアル値は「36940」で
2004年1月1日のシリアル値は「37987」ですので、引き算して
37987-36940=1047(日)となります。

なお1900年は閏年ではないのですが、Excelでは閏年として設計されていますので、1900年2月29日が存在する前提で計算されることに注意する必要があります。

JavaScriptにおける日付は1970年1月1日午前0時からの経過ミリ秒で管理されています。
したがって、Excelと同様、日付同士を引き算して、24*60*60*1000で割れば経過日数が求められます。

修正ユリウス日

困るのはExcelでは1900年より前の場合、JavaScriptでは1970年より前の場合です。それぞれのシステムの中では経過日数を計算することができません。
ここで使われるのがユリウス日というものです。これは紀元前4713年1月1日正午からの経過日数を表します。ただしこれを使うととても数値が大きくなるので現代では修正したものを使うのが一般的です。これを修正ユリウス日(MJDと略されます)と言います。1858年11月18日では修正ユリウス日は「1」になります。

この修正ユリウス日には公式があります。
VBA、JavaScriptで書いてみると次の通りです。

VBA

Function MJD(y, m, d)
If m < 3 Then
m = m + 12
y = y - 1
End If
MJD = Int(365.25 * y) + Int(y / 400) - Int(y / 100) + Int(30.59 * (m - 2)) + d - 678912
End Function

JavaScript

function mjd(y,m,d){
if(m<3){
m+=12;
y--;
}
return(Math.floor(365.25*y)+Math.floor(y/400)-Math.floor(y/100)+Math.floor(30.59*(m-2))+d-678912);
}

詳しい説明は省きますが、これを使うとExcelやJavaScriptの制限なしに経過日数を計算することができます。

Excelのヘルプ

Excel2007のヘルプにこんなのがあります。

ユリウス日は、現在の年と 1 月 1 日からの通算日数とを組み合わせて日付を表示するときに使用される場合があります。たとえば、2007 年 1 月 1 日は 2007001 と表され、2007 年 12 月 31 日は 2007365 と表されます。この形式はユリウス暦に基づいているわけではないことに注意してください。

Excelでは「2010年3月10日」は「2010069」をユリウス日と呼ぶそうです。何のために使うのでしょうか。わざわざ説明があるということは使う人がいるのでしょう。

また次のようなことも書かれています。

これとは別に、天文学上で一般的に使用されるユリウス暦の日付もあります。これは、紀元前 4713 年 1 月 1 日を起算点とした通日で表す日付システムです。

こちらの方が一般的だと思います。

まとめ

ユリウス日(ユリウス通日)と修正ユリウス日とExcelのシリアル値の関係をまとめておきます。

  • ユリウス日=修正ユリウス日+2400000.5
  • ユリウス日=シリアル値+2415018.5
  • 修正ユリウス日=シリアル値+15018
カテゴリー: デジタル タグ: , , ,

alertとpromptのどちらを使うか

2010 年 3 月 5 日 コメントはありません

ブックマークレットで、取得した何らかの結果を表示させるにはアラートまたはプロンプトを使う。

javascript:(function(){alert(’sample’);})()
javascript:(function(){a=window.prompt(‘title’,’sample’);})()

promptを使った場合は、IEならば、文字列がテキストボックスに出力され、選択状態になるので、コピーが簡単である。

ブックマークレットで目的のウェブサイトを開く方法

2010 年 2 月 12 日 コメントはありません

ブックマークレットを使って特定のページを開く場合は次のような方法があります。

同じウィンドウで開く
javascript:(function(){document.location.href=URL})()

別のウィンドウで開く
javascript:(function(){window.open(URL)})()

モニターで長さを測る方法

2009 年 12 月 2 日 コメントはありません

目の前にパソコンはあるのだけれど、定規がない場合にパソコンのモニターで長さを測る方法です。WindowsXPで使えます。

スタート-コントロールパネル-画面を開き(デスクトップ上で右クリック-プロパティでも可)、設定タブを選択してください。
詳細設定をクリックすると「DPI設定」のところに「96DPI」などと書かれています。これは画面が1インチあたり96ピクセルであることを表します。以下、96DPIを前提に。

今、HTMLを使って10センチ(100ミリ)の線を書きたいとします。
1インチは25.4ミリですので、96×100÷25.4=378(ピクセル)となります。
次のように書くと幅10センチの細長い四角が描かれます。

<img src=’temp.png’ width=’378px’ height=’20px’>

JavaScriptで書くならば次のような感じで。長さが変えられます。

<script>
var mm=100;//10センチならば「100」ミリ
var dpi=96;
var mmpi=25.4;//1inch=25.4mm
var pxl=mm*dpi/mmpi;
document.write(“<img src=’temp.png’ width=’”+pxl+”px’ height=’20px’>”);
</script>

10mm
20mm
30mm
40mm
50mm
60mm
70mm
80mm
90mm
100mm

カテゴリー: デジタル タグ: , , ,

「13日の金曜日」を羅列する

2009 年 11 月 13 日 コメントはありません

今日は13日の金曜日。今年は3回ありました。来年は1回だけ。

2000年から10年間の「13日の金曜日」を羅列するコード(JavaScript)は次の通り。

document.write(fri13());
function fri13(){
var s=”";
for(i=0;i<120;i++){
d=new Date(2000,i,13);
if(d.getDay()==5){
s+=d+”<br>”;
}
}
return(s);
}

あと、昔、こんなものを作りました。
次の13日の金曜日-換算ゲングル
「次の13日の金曜日」と入力すると、次の13日の金曜日はいつなのかが表示されます。元々は単位の換算をするプログラムです。

カテゴリー: デジタル タグ:

JavaScriptのreplaceで置換後の文字列に関数を使う

2009 年 4 月 23 日 コメントはありません

JavaScriptでreplaceを使うとき、置換後の文字列に関数を指定できますが、そのときの動きについて調べてみました。

○例1

moto=”123×456″;
saki=moto.replace(/(\d*)(\D*)(\d*)/,function($0,$1,$2,$3){return(“(0)”+$0+”(1)”+$1+”(2)”+$2+”(3)”+$3)});
document.write(saki);

【結果】(0)123×456(1)123(2)x(3)456

○例2

saki=moto.replace(/(\d*)(\D*)(\d*)/,function($1,$2,$3,$4){return(“(1)”+$1+”(2)”+$2+”(3)”+$3+”(4)”+$4)});

【結果】(1)123×456(2)123(3)x(4)456

○例3

saki=moto.replace(/(\d*)(\D*)(\d*)/,function($4,$3,$2,$1){return(“(1)”+$1+”(2)”+$2+”(3)”+$3+”(4)”+$4)});

【結果】(1)456(2)x(3)123(4)123×456

$0、$1などを使って置換後の文字列を表現しますが、$0や$1に何がセットされるかはfunctionの引数の場所によってきまるだけで、$nが何かは関係ないようです。

replace(/(☆)(★)(◆)/,function(全体,☆,★,◆){return(戻り値)})

「全体」は使わないことがあるのですが、必然的に取得されてしまうようです。
となると、例1のような書き方が分かりやすいかもしれません。この場合、PHPのpreg_replaceに似た動きをします。

カテゴリー: デジタル タグ:

はてなハイクとTwitterのAPIの違い

2009 年 2 月 21 日 コメントはありません

はてなハイクのAPIはTwitterと互換性があるとのこと。
私はJavaScriptではてなハイクとTwitterの過去の投稿を抽出しているのですが、確かに同じコードで動きます。

しかし若干、異なる点があるので、書いておきます。
続きを読む…

カテゴリー: デジタル タグ: , , ,

JSONに関するメモ

2009 年 2 月 6 日 コメントはありません

JSON形式のデータは次のような文字列で表される。

[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}]

JavaScriptではそのまま配列変数として使える。
※この場合は2次元の配列となる。

var recs=[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}];
alert(recs[1]["name"]);

このようにすると「satou」と表示される。
※0番目からカウントしたときの1番目の「name」である「satou」が表示される。

JSON形式のデータが外部ファイルのときは次のようにする。
※この例では外部ファイルは「test.json」である。

req = new ActiveXObject(“Microsoft.XMLHTTP”);
req.open(“GET”,”test.json”,false);
req.send();
text=req.responseText;
recs=eval(text);

ここでポイントはevalを使うことである。
単に「recs=text」としてしまうと
recs=’[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}]‘;
と同じことになり、文字列として読み込んでしまう。
evalを使うとJavaScriptで使える形式に変換してくれる。

JSONはXMLよりもシンプルであり、JavaScriptにおいてはCSVよりも簡単に扱える。

text=”1,suzuki;2,satou”;
を配列に読み込むには

recs=new Array();
lines=text.split(“;”);
for(i=0;i<lines.length;i++){
 recs[i]=lines[i].split(“,”);
}

のような手順が必要である。
JSONならば

text=’[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}]‘;
recs=eval(text);

で済んでしまう。

JSON形式のデータは途中に改行が入っていても構わない。また入れ子にすることもできる。

[
 {"id":"1","name":"suzuki"},
 {"id":"2","name":"satou"},
 {"id":"3","name":"yamada",
  "kodomo":{"namae":"ichiro","age":"5"}
 }
]

このような書き方ができる。

recs[2]["kodomo"]["namae"]

とすると「ichiro」が取得できる。
また

recs[2].kodomo.namae

とかいても取得できる。

カテゴリー: デジタル タグ: , ,

JavaScriptでshuffle

2009 年 2 月 6 日 コメントはありません

PHPにshuffleという関数があります。配列を与えると要素の順番をシャッフルします。
これと同じような関数をJavaScriptで作ってみました。

var a=new Array();
for(var i=0;i<20;i++){
 a[i]=i;
}
shuffle(a);
document.write(a);

function shuffle(arr){
 for(var i=0;i<arr.length;i++){
  arr[i]=Math.random()+”;”+arr[i];
 }
 arr.sort(function(a,b){
  return a.split(“;”)[0]-b.split(“;”)[0];
 });
 for(i=0;i<arr.length;i++){
  arr[i]=arr[i].split(“;”)[1];
 }
 return(arr);
}

カテゴリー: デジタル タグ:

JavaScriptのsort

2009 年 1 月 30 日 コメントはありません

JavaScriptのsortの基本についてメモする。

配列はそのまま表示すると、カンマで区切られて表示される。

ars=new Array(1,3,2,5,4);
document.write(ars);

結果
1,3,2,5,4

続きを読む…

カテゴリー: デジタル タグ: ,