年越しは PHP とともに

やっぱり今どきの言語はある程度までちゃんと勉強してからでないとまともに書けないものだなあなんてことを思いながら、非常に非効率なコーディング。こんなものに一体何時間掛けているんだ。
v0.4 ぐらい(自分基準)の段階で真夜中の時報を聞いた気がする。

とはいえ、一応できたっぽい。よかったよかった。ということで、所要時間は数時間にして「2年越しの力作」。現在 v1.0 。ネット上にやっぱり適当な湿度表が見当たらなくて、だったらテキストなり HTML なり csv で置けばそれで済む話なのかもしれないけど、折角動的に生成できるんだからやってみようと。Excel 版 or csv 生成あたりどうしようか、とか、そもそもこんな可搬性の悪い、使いにくいもの作ってどうするんだ、とか、積み残しの課題は山積の気もするけどな。どちらかといえば HTML 文書なのに入力パラメータによって表示を出したり出さなかったり増えたり減ったり色変えたり変えなかったりをざくざくと操るそのへんのおもしろさが肝だったりするので、作った人間の独善になるのは目に見えている。Ajax とか、なんつうかまさにそこ、というか、それだけなんだろうな、と想像、もとい妄想。
そういえば PHP って Javascript と違って、普通はパーサが吐いた(または無視した) HTML ソースしか見えないようだ。というわけで、以下、生のほうの v1.0 。自分でもびっくりするほど解読不能。というかこういうスクリプトなのに DB 使わないのはどういうことだ。はい、不勉強だから新しいことに手を出すのが億劫なんです。
見る人が見ればたぶんいろいろと笑える(失笑や苦笑のほうね)ポイントがこれでもかと仕込んである。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 12.0.1.0 for Windows">
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>乾湿計 => 湿度換算表出力 PHP版</TITLE>

<?php
function humid($dry,$dif,$atm,$wind,$freeze,$output)
{
    if ($freeze) {
        $a = 9.5;
        $b = 265.5;

        if ($wind) {
            $k = 0.44;    //  蒸気圧乗数
            $m = 755;     //  通風乗数
        } else {
            $k = 0.0007;
            $m = 1;
        }
    } else {
        $a = 7.5;
        $b = 237.3;

        if ($wind) {
            $k = 0.5;
            $m = 755;
        } else {
            $k = 0.0008;
            $m = 1;
        }
    }

    $t1 = $dry;
    $t2 = $dry - $dif;
    $p0 = $atm;

    $e_t1 = 6.11 * pow(10 , 7.5 * $t1 /(237.3 + $t1));  //  飽和水蒸気圧(t1℃,vs水)
    $e_t2 = 6.11 * pow(10 , $a  * $t2 /($b    + $t2));  //  飽和水蒸気圧(t2℃,vs水or氷)
    $e_now = $e_t2 - $k * $p0 * ($t1 - $t2) / $m;        //  現在の水蒸気圧

    $rh = $e_now / $e_t1 * 100.0;                       //  相対湿度

    if ($e_now == 6.11) { $t_dp = 0; }
      elseif ($e_now <= 0) {$t_dp = -273.15;}
      else { $t_dp = $b / (($a / log10($e_now / 6.11)) - 1); }    //  露点温度
    $h_abs_v = 216.7 * $e_now / (273.15 + $t1);              //  容積絶対湿度 [g/m^3]
    $h_abs_w = (18.015 * $e_now) / (29.064 * ($p0 - $e_now)) * 1000; //  重量絶対湿度 [g/kgDA]

    switch ($output) {
    case 0:
        $hu = $rh;
        break;
    case 1:
        $hu = $h_abs_v;
        break;
    case 2:
        $hu = $h_abs_w;
        break;
    case 3:
        $hu = $e_now;
        break;
    case 4:
        $hu = $t_dp;
        break;
    }
    return $hu;
}

    if (isset($_POST['mnu_degree'])) {
        $df = $_POST['mnu_diff'];
        $dg = (float) $_POST['mnu_degree'];
        $rdh = $_POST['rdo_humid'];
        $ckw = $_POST['chk_wind'];
        $ckf = $_POST['chk_freeze'];
        $tt0 = $_POST['txt_temp0'];
        $tt1 = $_POST['txt_temp1'];
        $atm = (float) $_POST['txt_p0'];
        $dt = $_POST['mnu_digit'];
        }
    else {
        $df = 7;
        $dg = 0.5;
        $rdh = 0;
        $ckw = false;
        $ckf = true;
        $tt0 = -20;
        $tt1 = 45;
        $atm = 1013.25;
        $dt = 0;
        }

    if ($tt1 < -30) { $tt0 = -30; }
    if ($tt1 > 100) { $tt1 = 100; }
    if ($tt0 < -30) { $tt0 = -30; }
    if ($tt0 > 100) { $tt0 = 100; }
    if ($tt0 > $tt1) { $tt1 = $tt0; }
    if (($tt1 - $tt0) / $dg >= 500) { $dg = 0.5; }
    if ($df / $dg >= 100) { $dg = 0.5; }

    if (($atm <= 300) or ($atm >= 10000)) { $atm = 1013.25; }

    $s_rdh = array("", "", "", "", "");
        $s_rdh[$rdh] = "checked ";
    if ($ckw) { $s_ckw = "checked "; } else { $s_ckw = ""; }
    if ($ckf) { $s_ckf = "checked "; } else { $s_ckf = ""; }
    $s_tt0 = sprintf("%1d" , htmlspecialchars($tt0));
    $s_tt1 = sprintf("%1d" , htmlspecialchars($tt1));
    $s_dg = array("0.1" =>"", "0.2" =>"", "0.5" =>"", "1.0" =>"", "2.0" => "");
        $s_dg[sprintf("%1.1f", $dg)] = "selected";
    $s_atm = sprintf("%1.2f" , htmlspecialchars($atm));
    $s_df = array(5 =>"", 7 =>"", 10 =>"", 15 =>"", 20 =>"");
        $s_df[$df] = "selected";
    $s_dt = array("", "", "", "");
        $s_dt[$dt] = "selected";

    $n_col = $df / $dg + 1;
    $color_a = array(0 => "#ffcccc", 1 => "#99ffcc");
    $color_b = array(0 => "#99ccff", 1 => "#cc99ff");
    $c = 0;
    $s_output = array("相対湿度", "容積絶対湿度", "重量絶対湿度", "水蒸気圧", "露点温度");
    $s_unit = array("", "g/&#13221;", "g/kgDA", "hPa", "");
    $limit = array(0, 0, 0, 0, -273.15);         // 各計算値の下限

?> 

</HEAD>
<BODY bgcolor="#ccccff">
<H1>乾湿計 => 湿度換算表</H1>
<FORM action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<TABLE>
  <TBODY>
    <TR>
        <?php
            for ($i = 0; $i <= 4; $i++) {
                echo '<TD nowrap valign="top">';
                echo '<INPUT type="radio" '.$s_rdh[$i].'name="rdo_humid" value="'.$i.'"></TD>';
                echo '<TD valign="top">'.$s_output[$i];
                echo '<IMG src="img/Image2.gif" width="15" height="4" border="0">';
                echo '<BR>('.$s_unit[$i].')</TD>';
            }
        ?>
    </TR>
  </TBODY>
</TABLE>
<INPUT type="checkbox" name="chk_wind" <?php echo $s_ckw; ?>> 通風計用
<IMG src="img/Image2.gif" width="30" height="4" border="0">
<INPUT type="checkbox" name="chk_freeze"  <?php echo $s_ckf; ?>> 湿球凍結時の値も表示
<BR>
<INPUT size="8" type="text" maxlength="8" name="txt_temp0" value="<?php echo $s_tt0; ?>" style="text-align : right;">
℃〜
<INPUT size="8" type="text" maxlength="8" name="txt_temp1" value="<?php echo $s_tt1; ?>" style="text-align : right;"><IMG src="img/Image2.gif" width="30" height="4" border="0">
きざみ:
<SELECT name="mnu_degree" style="text-align : right;">
  <OPTION value="0.1" <?php echo $s_dg["0.1"]; ?>>0.1</OPTION>
  <OPTION value="0.2" <?php echo $s_dg["0.2"]; ?>>0.2</OPTION>
  <OPTION value="0.5" <?php echo $s_dg["0.5"]; ?>>0.5</OPTION>
  <OPTION value="1"   <?php echo $s_dg["1.0"]; ?>  >  1</OPTION>
  <OPTION value="2"   <?php echo $s_dg["2.0"]; ?>  >  2</OPTION>
</SELECT><IMG src="img/Image2.gif" width="30" height="4" border="0">大気圧:
<INPUT size="10" type="text" maxlength="10" name="txt_p0" value="<?php echo $s_atm; ?>" style="text-align : right;">
hPa <BR>
乾湿差:
<SELECT name="mnu_diff" style="text-align : right;">
  <OPTION value="5"  <?php echo $s_df[5]; ?> > 5</OPTION>
  <OPTION value="7"  <?php echo $s_df[7]; ?> > 7</OPTION>
  <OPTION value="10" <?php echo $s_df[10]; ?>>10</OPTION>
  <OPTION value="15" <?php echo $s_df[15]; ?>>15</OPTION>
  <OPTION value="20" <?php echo $s_df[20]; ?>>20</OPTION>
<!--  -->
</SELECT>℃まで表示<IMG src="img/Image2.gif" width="30" height="4" border="0">
小数点以下 
<SELECT name="mnu_digit" style="text-align : right;">
  <OPTION value="0" <?php echo $s_dt[0]; ?>>0</OPTION>
  <OPTION value="1" <?php echo $s_dt[1]; ?>>1</OPTION>
  <OPTION value="2" <?php echo $s_dt[2]; ?>>2</OPTION>
  <OPTION value="3" <?php echo $s_dt[3]; ?>>3</OPTION>
</SELECT>桁まで表示<BR>
<BR>
<INPUT type="submit" name="sub_" value="換算表の出力↓">
<IMG src="img/Image2.gif" width="10" height="4" border="0">
<font size="-1" color="#cc0000"><b>注意:</b>きざみ値を小さくし、温度範囲を広げると、表が必要以上に巨大になり処理時間もかかります。</font>
</FORM>


<?php
    //echo '$df='.$df.' $dg='.$dg.'$atm='.$atm;
?>


<TABLE border="1" bgcolor="#ccccff" cellpadding="2">
  <TBODY>

        <?php
            echo '<TR><TH colspan="'.($n_col + 1).'" align="center">';
            echo '<font size="+2">'.$s_output[$rdh];
            echo '</TH></TR>';
        ?>

    <TR>
      <TD align="center" rowspan="2" bgcolor="<?php echo $color_a[0]; ?>">乾球示度 ℃<BR>
      (DRY)</TD>
      <TD colspan="<?php echo $n_col; ?>" align="center" bgcolor="<?php echo $color_a[1]; ?>">
      乾湿差 ℃ (DRY-WET)</TD>
    </TR>

    <TR>
        <?php
            for ($i = 0; $i <= $df + .05; $i += $dg) {
                echo '<TD align="center" bgcolor="'.$color_a[1].'">';
                if ($dg >= 1) {
                    printf ("%2d", $i);
                    }
                else {
                    printf ("%2.1f", $i);
                    }
                echo '</TD>';
            }
        ?>
    </TR>

    <?php
        for ($i = $tt1; $i >= $tt0 - .05; $i -= $dg) {
            $c = 0;
            echo '<TR><TD align="center" bgcolor="'.$color_a[0].'">';
            if ($dg >= 1) {
                printf ("%2d", $i);
                }
            else {
                printf ("%2.1f", $i);
                }
            echo '</TD>';
            for ($j = 0; $j <= $df + .05; $j += $dg) {
                echo '<TD align="center" bgcolor="'.$color_b[$c].'">';
                $h = humid($i, $j, $atm, $ckw, false, $rdh);
                if ($h > $limit[$rdh]) {
                    switch ($dt) {
                        case 0:
                            printf ("%1.0f", $h);
                            break;
                        case 1:
                            printf ("%1.1f", $h);
                            break;
                        case 2:
                            printf ("%1.2f", $h);
                            break;
                        case 3:
                            printf ("%1.3f", $h);
                            break;
                        }
                    }
                else {
                    echo '--';
                    }
                $c = 1 - $c;
                if (($ckf) and ($i <= 0)) {
                    $h = humid($i, $j, $atm, $ckw, true, $rdh);
                    echo '<BR><font color="#cc0000">(';
                    if ($h > $limit[$rdh]) {
                        switch ($dt) {
                            case 0:
                                printf ("%1.0f", $h);
                                break;
                            case 1:
                                printf ("%1.1f", $h);
                                break;
                            case 2:
                                printf ("%1.2f", $h);
                                break;
                            case 3:
                                printf ("%1.3f", $h);
                                break;
                            }
                        }
                    else {
                        echo '--';
                        }
                    echo ')</font>';
                    }
                echo '</TD>';
            }
            echo '</TR>';
        }
    ?>

    <TR>
      <TD colspan="<?php echo $n_col + 1; ?>" align="right">
        <?php
            if ($ckw) {
                echo '<b>通風計用</b>';
                echo '<IMG src="img/Image2.gif" width="20" height="4" border="0">';
                }
            echo '単位:'.$s_unit[$rdh];
            if ($atm <> 1013.25) {
                echo '<IMG src="img/Image2.gif" width="20" height="4" border="0">';
                echo '大気圧:'.$atm.'hPa';
                }
            if (($tt0 <= 0) and ($ckf)) {
                echo '<IMG src="img/Image2.gif" width="20" height="4" border="0">';
                echo '<font color="#cc0000">湿球凍結時:(括弧内)</font>';
                }
        ?>
      </TD>
    </TR>
    <TR>
      <TD colspan="<?php echo $n_col + 1; ?>" align="right">http://hum.uah.jp/table.php</TD>
    </TR>
  </TBODY>
</TABLE>

<P>
<IMG src="BBY_icn4.gif" width="32" height="32" border="0"> 
<A href="http://d.hatena.ne.jp/owl/19760704">熾火研究所</A>謹製 v1.0/2008/01/01<br>
</P>

</BODY>
</HTML>