JDBな人生  専門的なことから日常的なことまで~ まぁ自由きままに書いていきます。
2017年11月 / 10月<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>12月

アクセスランキング

[ジャンルランキング]
コンピュータ
269位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
38位
アクセスランキングを見る>>

ゼロ除算?

少し前に、メディアで「小学校教員が生徒に9 / 0 = 0と教えている?」みたいなことが話題になりました。
実際は間違いではありますが、いずれ学びなおすのであれば、そのような教え方もありといえばありなんじゃないかなあとも思います。

まあそれが適切か不適切かはおいておいて、先日ふと、0除算はプログラミングではどう扱われるのか?という疑問を抱きました。過去の経験では、C++は0除算で止まる、JavaScriptは止まらない、ということがわかっていましたが、今回、自分の主に使う言語について挙動をまとめてみました。

赤字は例外の発生&中断、青字は出力結果の値です。

Perl
my $a = 5;
my $b = 0;
print $a / $b;

Illegal division by zero

JavaScript
var a = 5;
var b = 0;
alert(a / b);

Infinity

ActionScript 3
var a:int = 5;
var b:int = 0;

trace(a / b);

Infinity

VB.NET
Dim a As Integer = 5
Dim b As Integer = 0

Console.WriteLine(a / b)

+∞

Visual C++
int a = 5;
int b = 0;
printf("%d",a / b);

Integer division by zero

Visual C#
int a = 5;
int b = 0;
Console.WriteLine(a / b);

System.DivideByZeroException
0 で除算しようとしました。

Java
int a = 5;
int b = 0;
System.out.println(a / b);

Exception in thread "main" java.lang.ArithmeticException: / by zero


結果、JavaScriptとActionScriptとVB.NETは処理が継続しましたが、他の言語は例外発生&中断ということがわかりました。
まあ、ゼロ除算が起こるようなコードは書くものではないと思いますが…

「不良の原因がゼロ除算だった」なんてかっこ悪いことの起こらないよう、頭の片隅に置いておくと良いかもしれません。
   プログラミング/開発全般    TB(0)    CM(0)    EDIT    ページ↑

変数名の慣習

最近、VB.NETでのフォームアプリケーションの開発をまたするようになったんですが、変数名のつけ方が言語によって特徴があり、面白いと思ったので記事にしておきたいと思います。

「post HTML data」と変数名をつけるとします。

JavaScript

postHTMLData

Perl

post_HTML_data

VB.NET

PostHtmlData


別に慣習があるってだけで、必ずしも守らなければならないという訳ではないんですが・・・

   プログラミング/開発全般    TB(0)    CM(0)    EDIT    ページ↑

深刻・・・かもしれないバグ

最近、自分の作っているWEBアプリやWEBアプリ的なものに、深刻・・・かもしれないバグがあることに気付きました。

いや、滅多に無いバグだと思うんですが(今のところ見たことありません)起こらない可能性が無いわけではないと思うんです。

内容は、
  1. プロセスAがデータxを読み込む
  2. データxを処理してデータyを作る
  3. データyを書き込み
  1. プロセスBがデータxを読み込む
  2. データxを処理してデータYを作る
  3. データYを書き込み

がほぼ同時に実行された場合、「ごく稀にデータyが書き込まれる前にデータYが書き込まれる場合があるのではないか」ということです。

今は↓のような状態だからです。
open

flock

読み込み

close

処理
この青字の部分に隙(他のプロセスが書きかえれる)がある⇒「処理したのにされてない」みたいな事態が発生?
open

flock

書き込み

close


これがひとつのファイルでの話ならいいんですが、複数のファイルを読み込んで処理していく場合に、それぞれのプロセスで処理時間が大きく異なると、こんなことが起こらない可能性が無いわけではないのだろうかと・・・

解決策はわかっていて、
open

flock

読み込み

処理

書き込み

close


とすれば解決できると思うんですが、どうでしょうか。

「これでは解決できない」とか「もっと効率の良い方法がある」とかあったら是非教えてください。
(今作っているWEBアプリ的なものは出来る限りバグを減らしておきたいので)
   プログラミング/開発全般    TB(0)    CM(0)    EDIT    ページ↑

Java Scriptで使用可能なフォントを取得する方法

Java Scriptで使用可能なフォントを取得・列挙する方法を紹介したいと思います。

と言っても、Java Scriptだけではできません。
FLASH(Action Script)とJava Scriptを組み合わせることで実現できます。

まずは、サンプルをどうぞ。

フォント取得サンプル
http://blog-imgs-34.fc2.com/j/a/b/jabnz/110524getFontsList.html

コードはこちらです。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">

function addFontsData(fonts){
    for (i=0;i<fonts.length;i++){
        document.getElementById("area").innerHTML += fonts[i] + "<br>";
    }
}

function getFontsData(){
    var flash = 1;
    if (/*@cc_on!@*/false){
        try{
            var f = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
        } catch(e) {
            flash = 0;
        }
    } else {
        flash = 0;
        for(i=0;i<navigator.mimeTypes.length;i++){
            if (navigator.mimeTypes[i].suffixes == "swf"){
                flash = 1;
            }
        }
    }
    if (flash){
        var el = document.createElement("embed");
        el.src = "getFontsList.swf?function=addFontsData";
        el.width = 1;
        el.height = 1;
        el.wmode = "transparent";
        document.body.appendChild(el);
    } else {
        document.getElementById("area").innerHTML = "FLASH使用不可";
    }
}

window.onload = function(){
    getFontsData();
}

</script>
<title>フォント取得サンプル</title>
</head>
<body>
<div id="area"></div>
</body>
</html>



仕組みとしては、

  1. FLASH読み込み
  2. 読み込み完了と同時に指定した関数に配列を渡す
  3. 配列を渡された関数が処理

というような感じです。

このサンプルは少し丁寧に作ってありますが、実際はFLASHを読み込ませる部分と関数の宣言だけあれば動きます。(念のためFLASHが使えない場合の処理も入れてあります)

これがそのFLASHです。
http://blog-imgs-34.fc2.com/j/a/b/jabnz/getFontsList.swf
(右クリック→「名前をつけてリンク先を保存」でダウンロードできます)

「getFontsList.swf?function=」に関数名を指定してください。
例えば、「getFontsList.swf?function=addFontData」などです。


あまり使い道は無いかもしれませんが・・・・・。

#久々にFLASHを作りました。これまでは「Action Script 1.0」で書いていましたが、今回からは「Action Script 3.0」を使っています。(前からやってみたいとは思っていたんですが)
フリーの開発環境も充実していて思っていたより楽に開発ができました。
なんかAS3ってJavaに似ていますね。(Javaは少しかじった程度ですが)
ともかく、これからは自分もAction Script 3.0プログラミングの初心者です。
何かコードにアドバイスなどあったら是非教えてください。(新しく「Action Script 3.0」と「AS + JS」という分類も作っておきます)
   プログラミング/開発全般    TB(0)    CM(1)    EDIT    ページ↑

WindowsにApacheとPerlをインストールするときに気をつけたいこと

これまでは、WEBの開発は「仮想マシン」「AN HTTPD」「Active Perl」の組み合わせで行っていたんですが(サーバーソフトがWin 7に対応していないからです)本番サーバーの環境に近付けるため、「Apache」「Active Perl」の組み合わせにすることにしました。

半月ほど前に既にインストールは完了しているんですが、注意した方がいいことがいくつかあったので、紹介したいと思います。

日本Apacheユーザ会 新着情報 ― Apache JP
http://www.apache.jp/

ActivePerl Downloads - Perl Binaries for Windows, Linux and Mac | ActiveState
http://www.activestate.com/activeperl/downloads

※Vistaや7でファイルが編集できない場合は、「スタート」「すべてのプログラム」「アクセサリ」「「メモ帳」を右クリック」「管理者として実行」でメモ帳を開いてから、「ファイル」「開く」「ファイル名に「C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf」と入力(又はコピペ)」「Enterキー」と手順を踏んでください。

1.Perlのインストール先ディレクトリは「c:\usr」
LinuxでははPerlのパスを「#!/usr/bin/perl」と指定します。

WindowsにActive Perlをインストールするとき、デフォルトでは「c:\perl」にインストールされますが、これでは「#!/perl/bin/perl」と指定しなければならなくなるので、「c:\usr」ディレクトリにインストール(無ければ作成)した方が良いです。

そうすれば、Windowsの環境でもLinuxの環境でも「#!/usr/bin/perl」で統一できます。

2.httpd.confで変更しておきたい場所
※インターネットに公開することを考えてないテスト用のローカル環境での設定なので、セキュリティなどは考慮していません。

デフォルトでは「C:\Program Files\Apache Software Foundation\Apache2.2\conf」にあるhttpd.confの変更しておくと便利な部分です。

Apacheで設定ファイルを書きかえるときは、「c:\http」ではなく、「c:/http」と書いてください。
(「\」ではなく「/」です。)

  • DocumentRoot "<%ドキュメントルートのパス%>"
    ドキュメントルートです。これは普通変えますよね。
  • <Directory "<%ドキュメントルートのパス%>">~</Directory>
    Options Indexes
    Options ExecCGI
    を追加すると、インデックスリストの表示とCGIが有効になります。但し、CGIが有効になっている場合はインデックスリストは表示されないようです。(何故か表示されないのでたぶん仕様です)
  • DirectoryIndex index.html index.htm index.cgi index.php
    ディレクトリの中で、どのファイルをディレクトリインデックスとして使うかの設定です。複数記述する場合は「 」(半角スペース)で区切ってください。
  • AddHandler cgi-script .cgi
    デフォルトではコメントアウトされているので、「#」を消してください。
    自分が使っているレンタルサーバーでは「.pl」もCGIとして扱うので、
    AddHandler cgi-script .cgi .pl
    にしておきました。
    ついでに<IfModule mime_module>~</IfModule>の間に
    AddType text/css .css
    AddType text/javascript .js
    も追加しとくと良いと思います。

3.「.htaccess」を書くときに覚えておくと便利なこと

Windowsでは「.htaccess」にリネームするときに「ファイル名を入力してください」とエラーが出ますが、コマンドプロンプトを起動して(必要であればディレクトリも移動)
rename .htaccess.txt .htaccess
と叩いてやれば大丈夫です。
一発でリネームできます。

で、指定する内容ですが、自分は
AddType "text/html; charset=utf-8" .html .htm
AddType "text/css; charset=utf-8" .css
AddType "text/javascript; charset=utf-8" .js
を使うことが一番多いと思います。

何だかんだでフォルダごとに文字コードが違うという謎仕様になってるので、フォルダ全体でHTTPヘッダで出力する文字コードを指定できます。

他のものはこちらのサイトで紹介されているので、一度見ておくと良いと思います。

.htaccess実践活用術
http://www.shtml.jp/htaccess/

4.httpd.confのバックアップは「original」に

記述エラーでサーバーが動かなくなったり、設定を全てデフォルトに戻したいときは、「original」(通常は「C:\Program Files\Apache Software Foundation\Apache2.2\conf\original」)に変更前のデータが入っています。

これをコピー&ペーストしれやれば、全て元通りです。

こんな感じです。
あくまで「ローカルでテストをするための環境」なので、インターネットに公開する際には設定をよく確認してください。
   プログラミング/開発全般    TB(0)    CM(0)    EDIT    ページ↑

プロフィール

JDB Luigi

Author:JDB Luigi
どこにでもいるようなありふれた人間・・・という訳でもなく、かと言って怪しい宗教を信仰する変人という訳でも無い。

基本的に掲載しているコード等は煮ていただいても焼いていただいても結構ですが、利用は自己責任にてお願いいします。
また、バグ・アドバイス等もしあればよろしくお願いします。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。