logo
 2003年   2004年   2005年   2006年   2007年   2008年   2009年   2010年   2011年   2012年   2013年   2014年   2015年   2016年 
 9月 
 10月 
 11月 
 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月 11月 
 6月 12月 
 1月 7月 
 2月 8月 
 3月 9月 
 4月 10月 
 5月
 6月
アイコンの説明
code:Haemophilus influenzae
ここに書かれていることは無保証です。同じことを行って問題が発生しても、龍義は責任をとりません。

■ 11月1日Other

postgresql でデータベースをいじっていて。

create table line_position ( start_x int, start_y int, end_x int, end_y int ); create table shape_data ( line00 line_position, line01 line_position, line02 line_position );

こんな感じのテーブルがあった。データを入れる時は、

testdb=# insert into shape_data ( line00.start_x, line00.start_y, line00.end_x, line00.end_y, line01.start_x, line01.start_y, line01.end_x, line01.end_y, line02.start_x, line02.start_y, line02.end_x, line02.end_y) values ( 10, 10, 30, 50, 30, 50, 100, 10, 100, 10, 0, 20);

line00.start_x と参照できたのだけど、select するときに同じことをすると。

testdb=# select line00.start_x from shape_data; ERROR: missing FROM-clause entry for table "line00" LINE 1: select line00.start_x from shape_data;

となってしまう。どうも table として扱ってしまうようで。 どうやって参照するのかと調べると、postgresql のページに出ていた。
https://www.postgresql.jp/document/9.4/html/rowtypes.html
select (line00).start_x from shape_data;

のようにするのだと。 これで欲しいデータが取得できた。普段 DB を使ってないと、ちょっとしたところで躓く。

■ 11月2日WWW

javascript で jQuery を使っている場所があって。返値は私が追加したのだけど。

function value_check() { $(function(){ if($("#name").val() == ""){ $("#name").showBalloon({contents: "名前を入力して下さい", position : "bottom"}); $("#name").focus(); return false; } if($("#age").val() == ""){ $("#age").showBalloon({contents: "年齢を入力して下さい", position : "bottom"}); $("#age").focus(); return false; } return true; }); }

もちろん本当はもっと長い html で、jQuery を使っている理由は、balloon.js のためだけみたい。 この関数を呼んでいる部分で、返値が取れていない。

function check_insert() { if(value_check()){ insert_line(); } }

確認してみると、undefined になっている。 jQuery なんて扱ったことがないので、どうしたものかと考えて。 showBalloon 以外を javascript 化してしまうことを考えた。 少し省略したが、こんな感じ。

function value_check() { if(document.getElementById("name").value == ""){ $(function(){ $("#name").showBalloon({contents: "名前を入力して下さい", position : "bottom"}); }); document.getElementById("name").focus(); return false; } return true; }

動くことは動くが、あまり美しくないのと、変更部分が多すぎる。 関数の中の関数なので、それを返してあげれば良いかなと思いやってみた。

function value_check() { return $(function(){ if($("#name").val() == ""){ $("#name").showBalloon({contents: "名前を入力して下さい", position : "bottom"}); $("#name").focus(); return false; } return true; }); }

しかし、返ってきたのは関数の object になってしまう。 結果を見ると、確かにそうなるかと納得はできる。 色々調べて、結局こうなった。

function value_check() { return (function(){ if($("#name").val() == ""){ $("#name").showBalloon({contents: "名前を入力して下さい", position : "bottom"}); $("#name").focus(); return false; } return true; })(); }

jQuery は便利なのだろうけど、javascript を一緒に書くと混乱してしまうな。 ただでさえ PHP の中に書いていたりするので、頭をうまく切り替えないと。

■ 11月3日WWW

table タグ中の tr タグに css で hover 指定をしていた。 本当はクラス指定で絞っているけど、こんな感じで。

tr:hover { background-color: #e0e0ff; }

問題なく動いていたのだけど、途中で tr タグの背景色を変えてしまうと、hover の設定が無効になってしまう。 調べてみると、css の指定には優先度があって、id で指定したものの方が優先度が高いので、タグで指定したものが無効になってしまうらしい。 そんなときは ! important を付けると解決するとあったので、やってみた。

tr:hover { background-color: #e0e0ff ! important; }

これで動くようになった。 ちゃんと css を勉強しないとな。

■ 11月4日Other

PHP から PostgreSQL に対して insert 文を発行していたりする。 ちょっと調べていたら、serial で自動付番された番号を returning 指定すると取得できるらしい。 しかし、この機能は PostgreSQL 8.2 からのこと。

接続先で動いている PostgreSQL は Windows 上で動いているらしく、ssh が接続できない。 接続先の PostgreSQL のバージョンはどうやってわかるのか、少し調べてみると version 関数というのがあるらしい。 やってみた。

dbsv=# SELECT version(); version ------------------------------------------------------------------------------------------ PostgreSQL 8.2.4 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.4 (mingw special) (1 row)

えらい古いけど、8.2.4 だから動きそう。 新しいテーブルを作って、やってみる。

dbsv=# insert into atable (name, age) values('toyota', 17) returning id; id ---- 1 (1 row) INSERT 0 1

返ってきた。 自動付番は 0 を使わないみたいだ。

■ 11月5日WWW

羽田空港の駐車場を予約しようかと思い、web でアクセスするとユーザ登録が必要なんだとか。 仕方なくユーザ登録したが、送られてくるメールが一向にやってこない。 渋々メールサーバを確認してみると、reject されている。 ログを確認してみると。

Nov 5 20:52:21 kamino postfix/smtpd[9722]: E95AB74004: reject: RCPT from mail.haneda-airport.jp[211.11.165.173]: 554 <tm-mail-01.local>: Helo command rejected: Access denied; from=<info@haneda-airpo rt.jp> to=<####@tatsuyoshi.net> proto=ESMTP helo=<tm-mail-01.local>

そんな helo じゃ reject するでしょ。 ということで、問い合わせ先である tiat-pk-yoyaku@tiat.co.jp にメールをしてみた。

Subject: ユーザ登録の際のメール送信について 先ほど、駐車場の予約をしようとユーザ登録を 行いました。 いつまで経っても登録のeメールが届かないので、 メールサーバのログを確認すると、 Helo command rejected: Access denied; from=<info@haneda-airport.jp> to=<####@tatsuyoshi.net> proto=ESMTP helo=<tm-mail-01.local> と smtp で存在しないドメインを helo に 付与しているため、reject されていました。 気になったのでRFC5321 を確認しますと、 4.1.1.1. Extended HELLO (EHLO) or HELLO (HELO) These commands are used to identify the SMTP client to the SMTP server. The argument clause contains the fully-qualified domain name of the SMTP client, if one is available. In situations in which the SMTP client system does not have a meaningful domain name (e.g., when its address is dynamically allocated and no reverse mapping record is available), the client SHOULD send an address literal (see Section 4.1.3). とあります。明らかに RFC に反しており、 こちらの SMTP の解釈に問題あるとは思えない のですが、なぜこのようなインターネットの 決まりである RFC に準拠していないeメールの 送信を行っているのでしょうか?

さて、返事はやってくるだろうか。 と言うか、理解するようなちゃんとした人がいるのだろうか。

■ 11月6日Other

とうとう Logicool M325 の電池がなくなってきた。 電池がなくなると動作が怪しくなるのではなく、LED が点くのでわかりやすい。 LED が点いてから2日ほど粘ってみたが、動かなくなった。

使い始めたのが6月15日なので、電池が5か月近くもったことになる。 単三電池1本でこれだけ持てば十分だし、前に使っていた Buffalo BSMOW08 のことを考えると、驚異的な電池の持ちである。 マウスの電源を1日中つけっぱなしだったけど、寝ている時間とか家にいない時間こまめに電源を切れば、倍ぐらいもちそう。 前にも書いたかもしれないが、こんなことなら早く替えれば良かった。

■ 11月7日WWWOther

普段からブラウザを数種類立ち上げていて、用途によって使い分けていたりする。 今日はプリントサーバと言うか、パラレルポートをネットワーク上のプリンタにする機械の管理画面にアクセスする必要があったのだけど、応答がないものがいくつか。 ブラウザを IE にしたところ、応答が返ってきた。 せっかくなので、近くにあるプリントサーバのテストをしてみることに。 用意したのは。

Logitec LAN-PS/U2A
Logitec LAN-PS/P1
Buffalo LPV4-TX1
I-O DATA ETX-PS/U2
corega CG-FPSV2

の5台。 このうち、Chrome / Opera でちゃんと管理画面が表示できたのは。
Buffalo LPV4-TX1
corega CG-FPSV2
この2台。 他の3台は応答が返ってこなかった。 IE だと、5台全てで管理画面が表示できた。

じゃ、原因は何だろうということで、IE で Logitec LAN-PS/U2A の管理画面にアクセスして、html を見てみた。

<HTML><HEAD> <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML"> <TITLE></TITLE></HEAD> <BODY BGCOLOR=#FFFFFF> <SCRIPT LANGUAGE=JavaScript> document.location.href="SYSTEM.HTM"; </script> </BODY></HTML>

問題なさそうに見える。 一応、この html を別な web サーバに置いて、Chrome でアクセスしてみたらちゃんと表示された。 なので、問題は html ではない。
じゃ何が問題だろうかと、html ヘッダを見てみた。

HTTP/1.0 200 OK Date: Mon, 24 Sep 2001 18:00:00 GMT MIME-version: 1.0 Server: ZOT-PS-47/9.8.0017 Last-Modified: Sat, 03 Jan 1970 17:58:20 GMT Expires: Sat, 07 Feb 1998 01:50:00 GMT Pragma: no-cache Content-Type: text/html Content-Length: 4298

バイト数を数えてわかったのだけど、この Content-Length が長すぎる。 これが原因にありそう。 表示されなかった Logitec LAN-PS/P1 でも見てみる。

HTTP/1.0 200 OK Date: Mon, 24 Sep 2001 18:00:00 GMT MIME-version: 1.0 Server: ZOT-PS-35/6.2.0001 Last-Modified: Tue, 10 Mar 1970 10:47:14 GMT Expires: Sat, 07 Feb 1998 01:50:00 GMT Pragma: no-cache Content-Type: text/html Content-Length: 4453

Logitec LAN-PS/P1 の応答はどのぐらいなのか、curl で確認してみる。

[toyota@takodana]$ curl http://192.168.0.2/ <html> <head> <title>Index</title> </head> <frameset framespacing="0" border="false" frameborder="0" cols="170,*"> <frame name="contents" target="main" src="content.htm" noresize> <frame name="main" src="status.htm" scrolling="auto"> <noframes> <body> <h4></h4> </body> </noframes> </frameset> curl: (18) transfer closed with 4096 bytes remaining to read

同様に I-O DATA ETX-PS/U2 の html ヘッダも見てみた。

HTTP/1.0 200 OK Date: Mon, 10 Sep 2001 12:00:00 GMT MIME-version: 1.0 Server: ZOT-PS-33/1.0.0003 Last-Modified: Thu, 01 Jan 1970 17:09:50 GMT Expires: Sat, 07 Feb 1998 01:50:00 GMT Pragma: no-cache Content-Type: text/html Content-Length: 5726

やっぱり Content-Length が長いことに原因があった。
ヘッダを見るとわかるように、管理画面が表示されないプリントサーバは ZOT-PS という Server ヘッダを付けている。 この ZOT-PS は台湾の ZO Tech という会社が作ったもののようで、簡単に言うとここが OEM 元なのでしょう。 そして、ZOT-PS は 4096 バイト多い数の Content-Length を返すので、ちゃんとしたブラウザは応答を待ったりデータが届いていないという扱いで、表示されないと。 何だかなという理由で。
せっかくなので、ちゃんと表示できた機械の html ヘッダを見てみる。 まずは、Buffalo LPV4-TX1 のヘッダを見てみる。

HTTP/1.1 200 OK MIME-Version: 1.0 Server: JC-HTTPD/1.16.25 Pragma: no-cache Cache-control: no-cache Connection: close Content-Type: text/html Content-Length: 844 Accept-Ranges: none

一応、html も見て、Content-Length が正しいのを確認した。
続けて corega CG-FPSV2 の html ヘッダを。

HTTP/1.1 200 Document follows Server: PRINT_SERVER WEB 1.0 Content-type: text/html

何というか、あっさりしすぎていて。 表示できないよりも良いのだけど。 curl でアクセスすると、
* no chunk, no close, no size. Assume close to signal end
と返ってくるぐらい。

一応、RFC なんかを読んだけど、Content-Length は should なので必須ではないよう。 この管理画面の応答だけで見ると、買うなら Buffalo の製品ということになるな。

■ 11月8日Linux

CentOS な環境があって。

[toyota@takodana]$ cat /etc/redhat-release CentOS release 6.8 (Final)

ここで PostgreSQL を使っていて、localhost の DB に対してパスワードなしのユーザでアクセスしていた。 これは本番環境というか実稼働している PostgreSQL がそうなっているため、仕方なくという感じ。

[toyota@takodana]$ psql -U postgres testdb psql (8.4.20) Type "help" for help. testdb=# \q [toyota@takodana]$ psql -U postgres -h localhost testdb psql: FATAL: Ident authentication failed for user "postgres"

-h オプションを付けると、なぜか認証エラーとなってしまう。 --no-password を付けてみたが、現象は同じ。

[toyota@takodana]$ psql -U postgres -h localhost --no-password testdb psql: FATAL: Ident authentication failed for user "postgres"

これは外部からのアクセスのときにパスワードが必須になっている、という設定になっているのではと思って、pg_hba.conf を確認してみる。

# TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust host all all 127.0.0.1/32 ident host all all ::1/128 ident

localhost は trust で、IPv4/IPv6 接続になると ident になっている。 localhost からの接続は trust にしてしまう。

[root@takodana tmp]# vi /var/lib/pgsql/data/pg_hba.conf [root@takodana tmp]# cat /var/lib/pgsql/data/pg_hba.conf ~snip~ # TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 ident [root@takodana tmp]# /etc/rc.d/init.d/postgresql restart [toyota@takodana]$ psql -U postgres -h localhost testdb psql: FATAL: Ident authentication failed for user "postgres"

現象変わらず。 他に設定項目があるのかなと眺めてみるも、なさそうだし。 ひょっとして、と思って、 IPV6 の設定も変えてみた。

[root@takodana tmp]# cat pg_hba.conf ~snip~ # TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust [root@takodana tmp]# /etc/rc.d/init.d/postgresql restart

これでやってみた。

[toyota@takodana]$ psql -U postgres -h localhost --no-password testdb psql (8.4.20) Type "help" for help. testdb=#

あっさり接続できた。 IPv6 なんて使ってないのにな。

■ 11月9日LinuxWWW

昨日の続きで。 本来の目的は、PostgreSQL サーバと同じサーバに乗っている PHP から postgresql にアクセスしたかった。 昨日は psql でアクセスできるようになったが、PHP からアクセスすると。

[Mon Nov 9 09:59:39 2016] [error] [client 192.168.0.17] PHP Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Permission denied\n\tIs the server running on host "localhost" and accepting\n\tTCP/IP connections on port 5432?\ncould not connect to server: Permission denied\n\tIs the server running on host "localhost" and accepting\n\tTCP/IP connections on port 5432? in /var/www/html/test.php on line 76 [Mon Nov 9 09:59:39 2016] [error] [client 192.168.0.17] PHP Warning: pg_last_error(): No PostgreSQL link opened yet in /var/www/html/test.php on line 78

と Permission denied が出ている。 確認のため、telnet でアクセスしてみた。

[toyota@takodana tmp]$ telnet localhost postgresql Trying ::1... Connected to localhost. Escape character is '^]'. ^] telnet> quit Connection closed.

接続は問題なさそう。 原因は PostgreSQL か iptables か selinux か PHP か。 まずは、昨日変更した PostgreSQL の設定を変更してみる。

[root@takodana tmp]# cat /var/lib/pgsql/data/pg_hba.conf ~snip~ # TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust host all all 0.0.0.1/0 trust host all all ::1/128 trust [root@takodana tmp]# /etc/rc.d/init.d/postgresql restart

現象変わらず。 iptables の停止を行う。

[root@takodana tmp]# service iptables stop

現象変わらず。 selinux を停止してみる。

[root@takodana tmp]# setenforce 0

PostgreSQL へのアクセスができるようになった。 で、web 検索をしてみると、selinux に httpd_can_network_connect_db という項目があるらしく。 設定を確認してみる。

[root@takodana tmp]# getsebool httpd_can_network_connect_db httpd_can_network_connect_db --> off

この影響で httpd から DB にアクセスできないようである。 設定を変更する。

[root@takodana tmp]# setsebool -P httpd_can_network_connect_db 1

えらい時間がかかって、応答が返ってきた。 selinux の停止を復帰させて、PHP を動かしてみた。 ようやく動くようになる。 なんだか、便利な世の中になったんだか、よくわからなくなってきた。

■ 11月10日WWWOther

SVG で半円を描く必要があって。 元の SVG データには中心点の位置が入っているので、circle で何とか出来ないかとやってみる。
一番簡単な方法は、円を描いてからその上に背景色の四角形を乗せて半分隠してしまうこと。 これをやってファイルを作ってみたけど、透過の SVG が作れないので却下となる。 じゃ、どうしようかと調べて path の a 属性を使うことに。 始点と終点を求めるのに、sin と cos の計算が必要で、何度か試行してようやく目的の図形が出た。 何かもっと美しいやり方がありそうな気もするけど、調査不足なのか SVG では無理なのか、そんな情報は見つからなかった。 特に図形が変わっている訳ではないので、しばらく今回作った SVG を使うことにした。

■ 11月11日WWW

Javascript を書いていて。 こんな感じの表があった。

商品番号商品
3172 りんご
6499 みかん
8284 かき
9643 すいか

これを連想配列気分で、配列に入れた。 実際には動的に配列を作っているのだけど。

list = []; list[3172] = "りんご"; list[6499] = "みかん"; list[8284] = "かき"; list[9643] = "すいか";

連想配列気分だったのが、間違いの始まりのようで。 並び替えて表示させる必要があったので、逆順にしたりしていた。

list.reverse(); for(key in list){ document.getElementById('listtext').innerText += list[key]; }

これで動いていたのは動いていた。 なのだけど、動かないと報告があって。 調べてみると Microsoft Edge だと駄目みたい。 確かに、Edge を使うと reverse や sort で並び替えが行われない。
検証してみたら、そもそも、
list[3172] = "りんご";
とした時点で配列が3172できてしまうので、そこが問題と言えば問題。 それは一度置いて、Edge でも数によっては動いたり動かなかったりすることもある。 これは一体どうなっているのか、調べてみた。 わかったことは。

動く
list[112] = "りんご";
list[209] = "みかん";
list[234] = "かき";
list[243] = "すいか";
list[122] = "りんご";
list[259] = "みかん";
list[264] = "かき";
list[683] = "すいか";
list[100] = "りんご";
list[200] = "みかん";
list[300] = "かき";
list[400] = "すいか";
list[100] = "りんご";
list[300] = "みかん";
list[500] = "かき";
list[700] = "すいか";

動かない
list[3172] = "りんご";
list[6499] = "みかん";
list[8284] = "かき";
list[9643] = "すいか";
list[172] = "りんご";
list[299] = "みかん";
list[384] = "かき";
list[443] = "すいか";
list[200] = "りんご";
list[300] = "みかん";
list[400] = "かき";
list[500] = "すいか";
list[200] = "りんご";
list[250] = "みかん";
list[300] = "かき";
list[350] = "すいか";

結局、色々やってわかったことは、最初の定義で list[132] だと動いて、list[133] だと動かないこと。 最初に132以下の数字を定義してしまえば、後はどんな大きな数字でも動く感じ。
javascript の作り方が悪いのは認めるけど、Edge の動作は納得できないというか変な感じがする。

■ 11月12日WWW

jQuery を使っている環境があって。 そのサーバに入っている Apache のログを確認すると、ブラウザが map ファイルにアクセスしている。 しかし、そんなファイルを入れてないので、does not exist のエラーが出ている状態。

[Tue Nov 12 08:25:16 2016] [error] [client 192.168.0.3] File does not exist: /var/www/html/jquery/jquery.min.map

jQuery のファイルが置いてあるディレクトリを確認してみる。

[toyota@takodana jquery]$ ls -l total 1636 -rw-r--r--. 1 root root 97163 May 21 02:18 jquery-1.12.4.min.js -rw-r--r--. 1 root root 92629 Oct 24 2014 jquery-1.9.1.min.js -rw-r--r--. 1 root root 83095 Oct 24 2014 jquery-2.0.0.min.js -rw-r--r--. 1 root root 83519 Oct 24 2014 jquery-2.0.1.min.js -rw-r--r--. 1 root root 83501 Oct 24 2014 jquery-2.0.2.min.js -rw-r--r--. 1 root root 83612 Oct 24 2014 jquery-2.0.3.min.js -rw-r--r--. 1 root root 83615 Oct 24 2014 jquery-2.1.0.min.js -rw-r--r--. 1 root root 84245 Oct 24 2014 jquery-2.1.1.min.js -rw-r--r--. 1 root root 84318 Dec 17 2014 jquery-2.1.2.min.js -rw-r--r--. 1 root root 84320 Dec 19 2014 jquery-2.1.3.min.js -rw-r--r--. 1 root root 84345 Apr 29 2015 jquery-2.1.4.min.js -rw-r--r--. 1 root root 85589 Jan 9 2016 jquery-2.2.0.min.js -rw-r--r--. 1 root root 85630 Feb 23 2016 jquery-2.2.1.min.js -rw-r--r--. 1 root root 85656 Mar 18 2016 jquery-2.2.2.min.js -rw-r--r--. 1 root root 85659 Apr 6 2016 jquery-2.2.3.min.js -rw-r--r--. 1 root root 85578 May 21 02:24 jquery-2.2.4.min.js -rw-r--r--. 1 root root 86341 Jun 10 03:32 jquery-3.0.0.min.js -rw-r--r--. 1 root root 86351 Jul 8 06:45 jquery-3.1.0.min.js -rw-r--r--. 1 root root 86709 Sep 23 07:32 jquery-3.1.1.min.js

実験とか私以外の人が使う可能性があるので、色々なバージョンが置いてある。 問題は、jquery.min.map という名前で、違うバージョンで同じ map ファイル名を使っている。 grep して見てみた。

[toyota@takodana jquery]$ grep "jquery.min.map" * jquery-1.9.1.min.js://@ sourceMappingURL=jquery.min.map jquery-2.0.0.min.js://@ sourceMappingURL=jquery.min.map

2.0.1 以降や 1.12.4 では、

/*! jQuery v2.0.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license //@ sourceMappingURL=jquery-2.0.1.min.map

と、バージョンの入った map ファイルになっている。 何はともあれ、map ファイルをダウンロードしてくることに。

[root@takodana jquery]# wget -q http://code.jquery.com/jquery-3.1.1.min.map [root@takodana jquery]# wget -q http://code.jquery.com/jquery-3.1.0.min.map [root@takodana jquery]# wget -q http://code.jquery.com/jquery-3.0.0.min.map

jquery-1.9.1.min.map や jquery-2.0.0.min.map もダウンロードできた。 あまり直接いじりたくないけど、ログがいっぱい出るのは気持ち悪いので、jquery-1.9.1.min.js と jquery-2.0.0.min.js の編集をする。 こんな感じになった。

[root@takodana jquery]# head -2 jquery-1.9.1.min.js /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license //@ sourceMappingURL=jquery-1.9.1.min.map

これでログにエラーは出なくなった。
2.0.4 以降は sourceMappingURL の指定をしてないけど、map ファイルにアクセスが来ているので、ブラウザが拡張子 js を map に置き換えた map にアクセスするようになっているのかな。

[root@takodana jquery]# grep sourceMappingURL * jquery-1.9.1.min.js://@ sourceMappingURL=jquery-1.9.1.min.map jquery-2.0.0.min.js://@ sourceMappingURL=jquery-2.0.0.min.map jquery-2.0.1.min.js://@ sourceMappingURL=jquery-2.0.1.min.map jquery-2.0.2.min.js://@ sourceMappingURL=jquery-2.0.2.min.map jquery-2.0.3.min.js://@ sourceMappingURL=jquery-2.0.3.min.map

なので、この 1.9.1 と 2.0.0 の sourceMappingURL を消すという手もあるのか。

■ 11月13日WWW

PHP で今日の日付を取得している場所がある。

<?php echo date("Y/m/d"); ?>

これがある php ファイルにアクセスすると、Apache のログに Warning が記録される。

[Tue Nov 13 09:02:00 2016] [error] [client 192.168.0.3] PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in /var/www/html/test.php on line 5, referer: http://192.168.0.7/

timezone を指定するべきらしく。 書いてあるとおり、date.timezone を設定するか、php ファイルで date_default_timezone_set() 関数を入れるか。 日本語で書いたページなので、php.ini で設定することにした。

[Date] ; Defines the default timezone used by the date functions ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone ;date.timezone =

と指定されてなかったので、Asia/Tokyo を追加。

[Date] ; Defines the default timezone used by the date functions ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone = Asia/Tokyo

気になったのが、「/」の文字を入れたので double-quote で括るべきなのか。 php.ini を眺めると、括ってある場所もあれば、括ってない場所もある。 php.ini の最初の方に ini ファイルの記述についてあった、確認。

; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one ; of the INI constants (On, Off, True, False, Yes, No and None) or an expression ; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a ; previously set variable or directive (e.g. ${foo})

double-quote で括る事もできますよ、ぐらいの感じかな。 試しに括らずに実験してみたら、問題なく動いた。 括っても、問題なく動いた。 どちらでも良いみたい。

■ 11月14日WWWNetwork

古いバージョンの skype が手に入らないかと探していたら
http://www.oldversion.com/
なるサイトを見つけた。 しかし、ここからダウンロードしたものが安全なのかわからないので、手が出ない。 oldversion.com 等で検索してみると、大丈夫な感じはするものの、保障はないので怖い。 こういうのは、公式でちゃんと残してくれると助かるのだけど。 結局ダウンロードしなかったけど、便利な web ページがあるということだけ覚えておこう。

■ 11月15日WWW

javascript を書いていたりして、select タグの中の option の中味を取り出すとき、何気なく .text で取りだしていた。 良く考えると、他のタグの中味は innerText で取得するのに、これだけ何で text で取得するのだろう、という疑問が今日の始まり。 innerText で取得できるのかと、最近耳にする textContent でもやってみる。 ついでに、設定もできるかとやっていたりして、下の感じの html でやってみた。

<html> <head> <script type="text/javascript"> function getoption(){ sidx = document.getElementById("colour").selectedIndex; document.getElementById("result1").innerText = "1 " + document.getElementById("colour").options[sidx].text; document.getElementById("result2").innerText = "2 " + document.getElementById("colour").options[sidx].innerText; document.getElementById("result3").innerText = "3 " + document.getElementById("colour").options[sidx].textContent; document.getElementById("result4").text = "4 " + document.getElementById("colour").options[sidx].text; document.getElementById("colour").options[0].text = "text"; document.getElementById("colour").options[1].innerText = "innerText"; document.getElementById("colour").options[2].textContent = "textContent"; } </script> </head> <body> option test<select id="colour"> <option value="0">Bl ue </option> <option value="1">Red </option> <option value="2">White</option> </select> <br> <input type="button" value="test" onclick="getoption();"> <br> <div id="result1"></div> <div id="result2"></div> <div id="result3"></div> <div id="result4"></div> </body> </html>

今回使ったブラウザは4種類。

●Microsoft IE
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
●Google Chrome
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
●Mozilla Firefox
Mozilla/5.0 (Windows NT 6.1; rv:49.0) Gecko/20100101 Firefox/49.0
●Opera
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 OPR/41.0.2353.46

それぞれ、ボタンを押したときの結果を見てみる。

IE
IE

Chrome
Chrome

Firefox
Firefox

Opera
Opera

Firefox が option の innerText を扱えないのと、Opera は innerText の設定が textContent になるのと。
W3C のページで確認したら、text は html5 で規定されていて、white space を取り除くとあるので、text を使うのが安全かな。 innerText は html で規定されていないらしいので、何が正解とかがない世界。 開発者としては、どんな仕様でも良いから統一して欲しいものだな。

■ 11月16日WWW

javascript で色の比較を行いたい。 こんな感じで、今あるもの同士の比較は出来たが。

[toyota@takodana www]$ cat colour_test.html <!doctype html> <html> <head> <script type="text/javascript"> function compare_colour(){ bgc1 = document.getElementById('colour1').style.backgroundColor; bgc2 = document.getElementById('colour2').style.backgroundColor; if(bgc1 == bgc2){ alert("same colour"); } else { alert("different colour"); } } </script> </head> <body> <div style="background-color: #f88;" id="colour1">colour1</div> <div style="background-color: #ff8;" id="colour2">colour2</div> <input type="button" value="compare" onclick="compare_colour();"> </body> </html>

これを実行してみて、色が異なっている場合。

違う色

色を同じにして。

同じ色

実際に必要としている html は同じ色のものが存在してないので、他のタグと比較できない。 じゃ、どうしたものかと、こんな感じで書いてみた。

function compare_colour(){ bgc2 = document.getElementById('colour2').style.backgroundColor; if(bgc2 == "#ff8"){ alert("same colour"); } else { alert("different colour"); } }

こんな感じで比較すると、全て different colour となってしまう。 この色の中身はどう入っているのかデバッガで確認してみた。

色の中身

rgb 関数的なものがあると思って、やってみたが。

function compare_colour(){ bgc2 = document.getElementById('colour2').style.backgroundColor; if(bgc2 == rgb(255, 255, 136)){ alert("same colour"); } else { alert("different colour"); } }

rgb の部分でそんな関数ないとエラーが起きてしまう。 まさか、そのまま文字が入っているのかとやってみた。

function compare_colour(){ bgc2 = document.getElementById('colour2').style.backgroundColor; if(bgc2 == "rgb(255,255,136)"){ alert("same colour"); } else { alert("different colour"); } }

やっぱり駄目。 と思ったが、色の中身はカンマの後スペースが入っているようなので、そのまま書いてみた。

function compare_colour(){ bgc2 = document.getElementById('colour2').style.backgroundColor; if(bgc2 == "rgb(255, 255, 136)"){ alert("same colour"); } else { alert("different colour"); } }

これで動いた。 一応手元の各ブラウザで確認して動くようだけど、なんだかそのまま文字が入っているのが気持ち悪いな。 文字ではない形で比較できるような javascript の関数はなさそうだし、仕方なく文字で比較を使う。

■ 11月17日WWW

label タグの中に input タグを入れて、radio とか checkbox のクリック範囲を広げることが良くある。

<label> <input type="checkbox"> breakfast </label>

このチェックをできないように javascript から制御しようとしていた。 今回作っている html は、ターゲットが IE なので、IE でテストしながら作っていたが、disabled = "false" が動かない。

<html> <head> <script type="text/javascript"> function change_disable(){ document.getElementById('label').disabled = "true"; } function change_enable(){ document.getElementById('label').disabled = "false"; } </script> </head> <body> <label id="label"> <input type="checkbox">breakfast </label><br> <input type="button" onclick="change_disable();" value="disable"> <input type="button" onclick="change_enable();" value="enable"> </body> </html>

true は動くという片方だけ動くのも変な感じがしたが、色々やってみて " を取り除くことで動くようになった。

<html> <head> <script type="text/javascript"> function change_disable(){ document.getElementById('label').disabled = true; } function change_enable(){ document.getElementById('label').disabled = false; } </script> </head> <body> <label id="label"> <input type="checkbox">breakfast </label><br> <input type="button" onclick="change_disable();" value="disable"> <input type="button" onclick="change_enable();" value="enable"> </body> </html>

ところが、Chrome など IE 以外のブラウザでは全く動かない。 どうも label の disabled は checkbox に影響を及ぼさないようである。 前の動かない部分を含めて、各ブラウザでやってみた。

●Microsoft IE
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
●Google Chrome
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
●Mozilla Firefox
Mozilla/5.0 (Windows NT 6.1; rv:49.0) Gecko/20100101 Firefox/49.0
●Opera
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 OPR/41.0.2353.46

IE 以外では label に disabled 属性をしたとき、配下の input に影響を及ぼさないようで。 表にしてみる。

IEChrome FirefoxOpera
label "true" true - - -
label true true - - -
label "false"true - - -
label false false- - -
label "" false- - -
label "none" true - - -
"true" true true true true
true true true true true
"false" true true true true
false falsefalsefalsefalse
"" falsefalsefalsefalse
"none" true true true true

2つの罠で嵌った感じだな。

■ 11月18日WWW

html の話で。 ボタンに書かれている一部の文字だけ文字の色を変えてくれと、話があって。 全部を変えるなら簡単なのだけど、一部となるとカスタム化しないと駄目かもなと思っていたところで、input type="button" タグではなく、button タグがあるのを思い出した。 わざわざ button タグにすることなんてないので、これまで使ってこなかったが、button タグでできないかやってみた。


<button type="button" value="send">送信<span style="color: #00f;">する</span></button><br><br>

ちゃんと一部だけ文字色が変わって目的を達成したが、他にもちょっとやってみた。



使う機会はあまりないけど、便利かも。

■ 11月19日WWW

html の form から送信したデータの量がどうも多いなと思って、ソースコードを削って簡単な html を作り、テストしてみた。

wireshark

見ると、multipart/form-data で送られていた。 特に指定しなくても、最近のブラウザは application/x-www-form-urlencoded で送らずに multipart/form-data で送るみたい。 ファイルを送るわけでもないし、大したデータ量でもないのに送信量が増えるのももったいないので、form タグの enc で application/x-www-form-urlencoded を指定しておいた。
昔 cgi なんかを作っていたときは、渡されたパラメタをゴリゴリと分解してたけど、最近は便利なライブラリや言語があるので、そんな必要もなく対応できるのでしょう。 そんな時代だから form-data でも困る人は少なくて、メリットもあると。

■ 11月20日Linux

eject コマンドを使おうと思ったら、コマンドがないと言われる。

[toyota@takodana tmp]$ cat /etc/redhat-release CentOS release 6.8 (Final) [toyota@takodana tmp]$ eject -bash: eject: command not found

そもそも eject コマンドはどこのパッケージに入っているのか、調べてみたら util-linux に入っているみたい。 最新の util-linux をダウンロードして、使えるかやってみる。

[toyota@takodana tmp]$ wget -q ftp://ftp.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.tar.gz [toyota@takodana tmp]$ tar xfz util-linux-2.29.tar.gz [toyota@takodana tmp]$ cd util-linux-2.29 [toyota@takodana util-linux-2.29]$ ./configure --help ~snip~ [toyota@takodana util-linux-2.29p]$ ./configure ~snip~ [toyota@takodana util-linux-2.29]$ make ~snip~

思ったより時間がかかる。 全部 make するんじゃなかったな。 一旦止めて、eject のみ make する。

[toyota@takodana util-linux-2.29p]$ make eject

それでもだいぶかかった。 実行してみる。

[toyota@takodana util-linux-2.29]$ ./.libs/eject ./.libs/eject: /lib/libmount.so.1: version `MOUNT_2.24' not found (required by ./.libs/eject)

ライブラリのバージョン違いのようで。 今入っているのは、どのバージョンなのか mount コマンドで確認してみた。

[toyota@takodana util-linux-2.29]$ mount --version mount from util-linux-ng 2.17.2 (with libblkid and selinux support)

util-linux-ng を使ってるのか。 ということは、eject も util-linux-ng に入っているかもしれない。 確認してみる。

[toyota@takodana tmp]$ wget -q http://mirror.centos.org/centos/6/os/x86_64/Packages/util-linux-ng-2.17.2-12.24.el6.i686.rpm [toyota@takodana tmp]$ rpm2cpio util-linux-ng-2.17.2-12.24.el6.i686.rpm | cpio -id 11772 blocks [toyota@takodana tmp]$ find ./usr -name eject [toyota@takodana tmp]$ find ./bin -name eject [toyota@takodana tmp]$ find ./sbin -name eject

残念。 rpm を確認してみたら、そもそも util-linux-ng は既に入っていた。

[toyota@takodana misc-utils]$ rpm -qa | grep util-linux util-linux-ng-2.17.2-12.24.el6.i686

util-linux 自体は rpm 扱いじゃないので、どのバージョンをベースにしているかわからず。 どうしたものかと CentOS のパッケージを眺めていたら eject の rpm があるではないか。 これを入れてあっさり解決。 えらい遠回りをした気分。

■ 11月21日WWW

Javascript で table タグの中身を取得しようとしていたが、IE だけ何故か取得できない。 具体的には tbody の rows が取得できない。 IE の開発者ツールで確認してみると、rows が入っていなかった。

rows の中身

childElementCount を確認してみると、ちゃんとした数なのだけど、childNodes に object Text がちょくちょく混ざっている。

childNodes の中身

object Text は何者なのか見てみると、改行のみが入っている。

object Text の中身

試しに table タグの中の改行を全て削除すると、これは消えたのだけど、rows は入らないままで変わらず。

手間取りそうだったので、滅茶苦茶大きな html だったけど、ごっそり削って問題の部分だけにしてテストすることに。 こんな感じの html になった。

<html> <head> <script type="text/javascript"> function edit_line(sn){ var tbd = document.getElementById("editbody"); for(n = 0; n < tbd.rows.length; n++){ if(tbd.rows[n].cells[0].innerText == sn){ document.getElementById('result').value = tbd.rows[n].cells[1].innerText; break; } } } </script> </head> <body> <table> <tbody id="editbody" style="float: left;"> <tr><td>1</td><td>banana</td><td><a href="#" onclick='edit_line(1);'>edit</a></td></tr> <tr><td>2</td><td>orange</td><td><a href="#" onclick='edit_line(2);'>edit</a></td></tr> <tr><td>3</td><td>apple </td><td><a href="#" onclick='edit_line(3);'>edit</a></td></tr> </tbody> </table> <div id="result"></div> </body> </html>

1bananaedit
2orangeedit
3apple edit

ざっくり減らして、ようやく原因がわかったのだけど、float: left が問題みたいで。 ここを削除すると、IE でもきちんと動くようになった。
しかし、元々の表はスクロールバーも付いていて、float: left が外せない。 仕方なく rows で取らずに children で取るようにしたけど、どうも美しくない気がして。 そもそも、これは仕様なのだろうか。 もう少し考えてみることに。

■ 11月22日WWW

昨日の続き。 rows が取れないのは children で誤魔化せたけど、そうすると動的に table へ追加する部分の動作がおかしくなってしまった。 IE はよくわからないな。 昨日と同じ感じで。

<!doctype html> <html> <head> <script type="text/javascript"> function add_line(){ var tbd = document.getElementById("editbody"); var row = tbd.insertRow(-1); cell = row.insertCell(-1); cell.innerHTML = "add"; cell = row.insertCell(-1); cell.innerText = document.getElementById("fruit").value; } </script> </head> <body> <table> <tbody id="editbody" style="float: left;"> <tr><td>1</td><td>banana</td></tr> <tr><td>2</td><td>orange</td></tr> <tr><td>3</td><td>apple </td></tr> </tbody> </table> <input type="text" id="fruit" value=""><br> <input type="button" value="add" onclick="add_line();"> </body> </html>

1banana
2orange
3apple

insertRow(-1) を指定しているのに、最後に追加されない。 3を指定しても、エラーとなるし。 ここでも row としての認識がされないらしい。

IE での insertRow(-1)

どうしたものかと色々やっていたら、動的に insertRow したものだときちんと rows も取れるし、insertRow の位置も想定の位置に入る。 float: left; を見直そうか、HTML を描くときにわざわざ table を動的に作るか。 どうしようかな。

■ 11月23日WWW

javascript で display の値を動的に取得したりしていたが、jQuery で取得した値と違うことが出てきた。

<title>display test</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script type="text/javascript"> function toggle(){ document.getElementById('float').style.display = document.getElementById('float').style.display == 'none' ? 'inline' : 'none'; } function get_status(){ document.getElementById('status1').innerText = "status:" + document.getElementById('float').style.display; document.getElementById('status2').innerText = "status:" + $('#float').css("display"); } </script> <style type="text/css"> #blue { position: relative; background-color: #88f; width: 200px; height: 100px; } #float { position: absolute; width: 50px; height: 30px; left: 20px; top: 10px; background-color: #fff; } </style> </head> <body> <input type="button" value="toggle inline-none" onClick="toggle();"> <input type="button" value="get display status" onClick="get_status();"> <br> <div id="blue"> <div id="float"></div> </div> <div id="status1"></div> <div id="status2"></div>

どのブラウザでも、表示と非表示の動作はする。 だけど、表示させたとき IE11 だと inline / inline になり、chorome と firefox だと inline / block となる。

position が absolute じゃないと、どのブラウザでも inline / inline になるので、このあたりが問題なのでしょう。 で、調べてみると、CSS では position が absolute のときは、inline の指定にならないようで。 CSS 2.1 の 9.7 には。

https://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo
Otherwise, if 'position' has the value 'absolute' or 'fixed', the box is absolutely positioned, the computed value of 'float' is 'none', and display is set according to the table below.

ということで、表中の inline は計算値として block になっている。
jQuery はそれをきちんと解釈して、block としているのかな。 どちらにしても、IE とそれ以外のブラウザで値が変わるので、対応しないと。

■ 11月24日WWW

HTML を書いていて、複数の select で選択をし、その結果を textbox に入れたい。 だいぶ簡略化してこんな感じ。

<html> <head> <script type="text/javascript"> function set_result(){ var colour_index = document.getElementById('colour').selectedIndex; var shape_index = document.getElementById('shape' ).selectedIndex; document.getElementById('result').value = document.getElementById('colour').options[colour_index].value + " " + document.getElementById('shape' ).options[shape_index ].value; } </script> </head> <body> <select id="colour"> <option value="red" >red </option> <option value="blue" >blue </option> <option value="green" >green </option> <option value="yellow">yellow</option> </select><br> <select id="shape" onchange="set_result();"> <option value="line" >line </option> <option value="rectangle">rectangle</option> <option value="triangle" >triangle </option> <option value="circle" >circle </option> </select><br> <input type="text" id="result"> </body> </html>



shape を変えれば自動で textbox に入ります、ということだったのだけど。 これを操作してもらったら、先に shape の方を変更して、その後 colour の方を変更していた。 別途必要事項があって、shape を変更したときのみに textbox へ反映されますと伝えてあったが、shape を選択し直しても変更されていないため textbox に反映されないのが納得できないらしく。 onchange を使っているため、変更されなかったら当たり前な感じなのだけど、一般人はそんなこと考えないみたいで。 仕方なく。

<select id="shape"> <option value="line" onclick="set_result();">line </option> <option value="rectangle" onclick="set_result();">rectangle</option> <option value="triangle" onclick="set_result();">triangle </option> <option value="circle" onclick="set_result();">circle </option> </select><br>

と、あまり美しくないけど onclick でやってみたら Chrome で動かなくなる。

<select id="shape" onmouseup="set_result();">

とマウスのボタンを離したときに動作するようにしても値がうまく取れないし、そもそもキーボードで打ったときに反応しない。 何か単純で良い方法はないものなのかな。

■ 11月25日WWW

HTML を書いていて、その中でこんな感じで動的に json データを受け取ろうとしていた。

postparam = "user=toyota"; xhr = new XMLHttpRequest(); xhr.open('POST', 'demo1.php', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.responseType = 'json'; xhr.send(postparam); xhr.onreadystatechange = function() { if(this.readyState == 4){ if(this.status == 200){ list = JSON.parse(xhr.responseText); view(list); } }

IE だと特に問題なく動くのだけど、それ以外のブラウザだと。

Uncaught DOMException: Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'json').

とエラーが出てデータが受け取れない。 何でだろうと調べてみると、responseText は responseType が 無指定か text のときのみ使えるらしく。 じゃ、responseText じゃなくて response にしてみたらどうか、ということで。

list = JSON.parse(xhr.response);

としてやってみたら、受信はできたようなのだけど。

Uncaught SyntaxError: Unexpected token o in JSON at position 1

と JSON の解析に失敗してしまう。 無理だろうなと思いながらも。

list = JSON.parse(xhr.responseXML);

とやってみたら。

Uncaught DOMException: Failed to read the 'responseXML' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'document' (was 'json').

responseXML が使えるのは responseType が無指定か document のときのみですと。 じゃ、responseType が json のときは何を使ってどうすれば良いのか。 調べてみると、逆に responseType を指定しなくて良いみたい。 responseType を指定せずにやってみたら、IE 以外でも IE でもちゃんと動くようになった。
となると、responseType = 'json' っていつ使うものなのだろう。

■ 11月26日WWWLinux

今日は PHP の話で。 どうもうまく動かない場所があって、原因を探していくと、三項演算子にあった。 しかし、式が間違っている様子がない。 何度か値を入れたりして、やはり三項演算子の結果が悪いみたい。 私の頭の中の理解では、三項演算子の動きはこうなる。 例で C で書いて gcc gcc version 4.4.7 でコンパイルしてみた。

[toyota@takodana tmp]$ cat test.c #include <stdio.h> int main(){ int a = 1; printf("%d %s\n", a, a == 1 ? "one" : a == 2 ? "two" : "other"); a = 2; printf("%d %s\n", a, a == 1 ? "one" : a == 2 ? "two" : "other"); a = 3; printf("%d %s\n", a, a == 1 ? "one" : a == 2 ? "two" : "other"); } [toyota@takodana tmp]$ gcc test.c [toyota@takodana tmp]$ ./a.out 1 one 2 two 3 other

問題ないし、私の認識もあっている。 しかし手元の PHP 5.3.3 だとこうなる。

[toyota@takodana tmp]$ cat test.php <?php $a = 1; print ($a == 1 ? "one" : $a == 2 ? "two" : "other") . "\n"; $a = 2; print ($a == 1 ? "one" : $a == 2 ? "two" : "other") . "\n"; $a = 3; print ($a == 1 ? "one" : $a == 2 ? "two" : "other") . "\n"; ?> [toyota@takodana tmp]$ php ./test.php two two other

さっぱり理解できなかった。 で、調べてみて PHP のマニュアルを見てみたら、そのことが書いてある。
http://docs.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary

($a == 1 ? "one" : $a == 2 ? "two" : "other")

は、

(($a == 1 ? "one" : $a == 2) ? "two" : "other")

と解釈されるらしい。 私の知っている三項演算子と違う。 さらに
It is recommended that you avoid "stacking" ternary expressions.
とも書いてあるし。

ということで、解決方法は、

($a == 1 ? "one" : ($a == 2 ? "two" : "other"))

こうなる。 なんとなく、括弧内を先に行うというイメージがあるので、あっているのか不安になる。

■ 11月27日WWW

CSS で色々と属性を指定していて、その後 Javascript で変更をしようと。 ID がバラバラ、class 名が一致していて、その class に対して変更を行いたかった。 本当はもっと長いけど、こんな感じでボタンを押す度に fruit と fish を切り替えたい。

<html> <head> <style type="text/css"> div.fish { display: none; } </style> </head> <body> <div class="fruit" id="banana" >BANANA </div> <div class="fruit" id="apple" >APPLE </div> <div class="fruit" id="orange" >ORANGE </div> <div class="fish" id="tuna" >TUNA </div> <div class="fish" id="sardine">SARDINE</div> <input type="button" id="toggle_button" value="on/off"> </html>

id 単位だったら簡単なのだけど、実際のものは数が不定だし、効率も悪い。 どうしたものかと調べていたら document.styleSheets というものがあるらしい。 面白そうなので、やってみることにした。 実験のために、fruit にも style を付けて、ボタンの onclick の動作を入れる。

<html> <head> <style type="text/css"> div.fruit { display: block; } div.fish { display: none; } </style> <script type="text/javascript"> function toggle(){ } </script> </head> <body> <div class="fruit" id="banana" >BANANA </div> <div class="fruit" id="apple" >APPLE </div> <div class="fruit" id="orange" >ORANGE </div> <div class="fish" id="tuna" >TUNA </div> <div class="fish" id="sardine">SARDINE</div> <input type="button" id="toggle_button" value="fruit/fish" onclick="toggle();"> </body> </html>

ここからが面倒臭い。 実際は複数の css のファイルを読み込んでいるし、設定している数も多い。 なので、全てを検索して、見つけなければならない。 toggle 関数はこんな感じになった。

function toggle(){ for(i = 0; i < document.styleSheets.length; i++){ sheetitem = document.styleSheets.item(i); for(j = 0; j < sheetitem.cssRules.length; j++){ ruleitem = sheetitem.cssRules.item(j); if((ruleitem.selectorText == "div.fruit") || (ruleitem.selectorText == "div.fish")){ if(ruleitem.style.getPropertyValue("display") == "none"){ ruleitem.style.setProperty("display", "block"); } else { ruleitem.style.setProperty("display", "none"); } } } } }

本当は3項演算子を使ったりしているのだけど。 別な書き方もあるようなので、やってみる。

function toggle(){ for(i = 0; i < document.styleSheets.length; i++){ sheetitem = document.styleSheets[i]; for(j = 0; j < sheetitem.cssRules.length; j++){ ruleitem = sheetitem.cssRules[j]; if((ruleitem.selectorText == "div.fruit") || (ruleitem.selectorText == "div.fish")){ if(ruleitem.style.display == "none"){ ruleitem.style.display = "block"; } else { ruleitem.style.display = "none"; } } } } }

オブジェクト指向ではない書き方だな。 どちらにしても分かり辛いし長いので、関数化にして。

■ 11月28日WindowsWWW

Windows 2012 Server IIS8 に php7 を入れて動かそうとしたら、動く気配がない。 php-cgi を手動で叩いてみた。

C:\Program Files\php7>php-cgi.exe

すると。

プログラムを開始できません

コンピューターに VCRUNTIME140.dll がないため、プログラムを開始できません。 この問題を解決するには、プログラムを再インストールしてみてください。

と出てきた。VC14 のランタイムがないらしく。 Microsoft のページからダウンロードする。
https://www.microsoft.com/en-us/download/details.aspx?id=48145
インストールは問題なくできたので、再度 php-cgi を実行してみた。

C:\Program Files\php7>php-cgi.exe PHP Warning: PHP Startup: Unable to load dynamic library 'C:\php\ext\php_mbstring.dll' - ・スw・ス閧ウ・ス黷ス・ス・ス・スW・ス・ス・ス[・ス・ス・ス・ス・ス・ス・スツゑソス・ス・スワゑソス・ス・スB in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'C:\php\ext\php_pdo_pgsql.dll' - ・スw・ス閧ウ・ス黷ス・ス・ス・スW・ス・ス・ス[・ス・ス・ス・ス・ス・ス・スツゑソス・ス・スワゑソス・ス・スB in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'C:\php\ext\php_pgsql.dll' - ・スw・ス閧ウ・ス黷ス・ス・ス・スW・ス・ス・ス[・ス・ス・ス・ス・ス・ス・スツゑソス・ス・スワゑソス・ス・スB in Unknown on line 0

文字化けしているのは仕方ないが、php.ini での extension の設定に問題がありそうな感じで、C:\php\ext を見に行ってしまっている。 現在の設定はこうなっている。

extension=php_mbstring.dll extension=php_pdo_pgsql.dll extension=php_pgsql.dll

記述として、
; extension=/path/to/extension/msql.so
のようにパスを付けて書けるらしいので、変更してみた。

extension=C:\Program Files\php7\ext\php_mbstring.dll extension=C:\Program Files\php7\ext\php_pdo_pgsql.dll extension=C:\Program Files\php7\ext\php_pgsql.dll

\ を二重にするべきなのかとか少し悩んだけど、そのまま \ は1つにして保存したあと実行してみる。 問題なく動いた。

■ 11月29日Linux

PostgreSQL を使っていて、データの漢字コードが EUC で入っていた。 psql から接続するときは、
set client_encoding=utf8
とするだけで、何も問題なかったが、問題は php からのアクセスで、
options='--client_encoding=utf8'
を付けて接続などしてみたが、EUC で返ってくる。 仕方ないので、取得した値を mb_convert_encoding で変換していた。

mb_convert_encoding($rows['name'], "UTF-8", "EUC-JP")

しかし、文字によって化けてしまう現象が出た。 化ける文字は、Ⅱとか㈱とか、いかにも、という文字。 どうしたものかと検索して、一度 SJIS-win にすると良いらしいので。

mb_convert_encoding(mb_convert_encoding($rows['name'], "SJIS-win", "EUC-JP"), "UTF-8", SJIS-win)

としていたが、なんだかあまり綺麗じゃない感じはしていた。 ここまでが2週間前の話。

今日、この変換で問題が起きた。 問題が起きた文字は髙と﨑の文字で、どちらも?になってしまっている。 psql で select してみると、ちゃんと文字が出るので、データの問題ではない。 仕方ないので、もう少し検索して解決策を探ってみると、EUCJP-win というコード指定があるらしく、さっそくやってみた。

mb_convert_encoding(mb_convert_encoding($rows['name'], "SJIS-win", "EUCJP-win"), "UTF-8", SJIS-win)

これで変換できなかった文字が変換できるようになった。 ふと思って、一度 SJIS-win にするのもやめてみた。

mb_convert_encoding($rows['name'], "UTF-8", "EUCJP-win")

これでも問題なく。 最初にきちんと調べておくべきだったな。

■ 11月30日Windows

Windows 7 の新しい PC がやってきたので、さっそくキーボードを HHKB Lite2 に交換。 しかし、自動で認識してくれずに 106 キーの配列になってしまう。 デバイスマネージャーを見ると、[HID キーボードデバイス]になったまま。

デバイスマネージャー

ドライバを手動で更新して、[標準 PS/2 101/102 キーボード]に変更してみる。

ドライバーソフトウェアの更新

しかし、インストールに関する問題が発生しました、と出てきた。

ドライバーソフトウェアの更新

[PC/AT エンハンス PS/2 キーボード(101/102 キー)]にしてみても、同じように問題が発生しましたとかで。

ドライバーソフトウェアの更新

仕方なく、レジストリをいじることにした。

レジストリエディター

なんだか 106/101 キーの配置が変わらないとかって、もう20年以上前から面倒なことが必要だったけど、未だに繋いで認識してくれないとはね。


21st projects Tatsuyoshi Networks Prompt Works
by Tatsuyoshi since 2003