裏表(Phinloda のもう裏だか表だか分からないページ)

コンピュータ・プログラミング系の話がメインのそれなりにごちゃごちゃしたネタばかり出てくるサイトです。多分。
twitter-timeline に言語指定したいのだが

よく分からなかったので、適当にググってみると data-lang="en"のように指定すればよさそうなので、指定してみたらうまくいった。

こういうことを、勘でやっていてはいけないような気もするが…。

JUGEMテーマ:日記・一般

| プログラミング | 20:51 | comments(0) | trackbacks(0)
プログラムが途中で停止してしまうのだが

2000回ループして欲しいのだが1500回で停止してしまう。不思議だと思ったのだが結局、何ということはなくて、プログラムの内部に1500回で強制的に終了させるコードが入っていたのが原因。 無限ループになることを怖れて、リミッターを付けておいたのを忘れていた。

この種の定数は起動時に画面に表示するなどして、簡単に確認できるようにしておくべきだ。

JUGEMテーマ:日記・一般

| プログラミング | 20:37 | comments(0) | trackbacks(0)
mysql の show processlist で奇妙なクエリが表示されたのだが

SELECT しているはずなのに、いきなり WHERE とか出てくるのでヘンだなと思ったら、どうもクエリの途中に CR だけが入っているため、クエリの途中で画面が上書きされていたらしい。クエリ自体は想定通りに実行されていたようだ。

JUGEMテーマ:コンピュータ

| プログラミング | 21:12 | comments(0) | trackbacks(0)
20日に投稿した Python のコードの改行の件だが

前回、次のコードが釈然としない、というようなことを書いたので補足したい。

print(line.rstrip())

print はそのままだと改行してしまう。だから読み込んだ行の改行コードを rstrip() で削除してから、改行を付けて表示したら、余計な改行がない出力にできる。 しかし、それなら最初から改行しない出力にしてやればいいのでは。 具体的には、次のようにする。

print(line, end='')

実は、これだと各行の最後に ^M (CR) が付いてしまったのである。 もちろん、^M を削除するのは簡単だ。rstrip() で削除してやれば…

JUGEMテーマ:python

| プログラミング | 20:26 | comments(0) | trackbacks(0)
chromedriver.exe のプロセスが大量に残存していたのだが

selenium で自動運転しているときに何かの間違いで異常終了すると、プロセスが残ってしまう。放置しておいても大した問題ではないはずなのだが、最近どうも Windows を休止状態にしたり再開するのが遅いような気がして、調べて見ると、chromedriver.exe が50以上動いたままになっていた。

これが起動時の時間に関係しているかとうがは検証できていないのだが、あまりよくない気がしたので、とりあえず全部 kill して解決【なにが】。

JUGEMテーマ:日記・一般

| プログラミング | 19:48 | comments(0) | trackbacks(0)
ロンサクって言われたのだが

コンピュータ用語、というよりは隠語じゃないかと思うのだが、ロンサクは論理(的)削除、ブッサクは物理(的)削除のこと。ファイルを消去して上からデータを書いて二度と読めなくするようなのがブッサクで、削除フラグを立てておいて見た目は存在しないが実体が残っていて復元できるのがロンサク。

で、何となくググっていたら、ブッサクは聞いたがロンサクは聞いたことがない、と書いたページに遭遇したのだが、巷ではロンサクって通じるのだろうか?

ちなみに、私の場合、この言葉をどこで知ったのか全く思い出せない。言われたときの文脈から自然に理解したというか、そんな感じかもしれない。

JUGEMテーマ:コンピュータ

| プログラミング | 13:48 | comments(0) | trackbacks(0)
ループ変数と制限回数のコラボという感じにしてみたのだが

ループを10回、ただし1回のループで処理するのは0〜40個、全部で100個まで、というような処理である。

if (count > 0) {
    System.out.println("loop end");
} else if (i > loopMax) {
    System.out.println("count up");
} else {
    System.out.println("unknown reason");
}

これがなぜか unknown ばかり出てくるので、 何があるのかと悩んだのだが、要するに最後のループで count が0になってしまったら unknown になってしまうのであった。

JUGEMテーマ:コンピュータ

| プログラミング | 20:18 | comments(0) | trackbacks(0)
日付の範囲を BETWEEN を使って書こうと考えたのだが

MySQL で期間が重なっていることを判定するクエリを書くというのが本題。 これについてググっているときに拝見したページなのだが、

日付比較や日付検索が遅い場合の改善方法(BETWEEN,MySQL) : ハードディスクメンテナンス ブログ

最後の方に、次のようなクエリ(の一部)が出てくる。

BETWEEN '2014-01-01' AND '2014-01-01' + INTERVAL 1 DAY; 

これは2014-01-02 00:00:00 を含んでいるから2004年1月1日を判定したい場合には厳密には正しくない、という趣旨のことが書かれているが、それはその通りだと思う。INTERVAL は両端を含むという仕様だから。

だから私はいつも、こんな感じで書く。

BETWEEN '2014-01-01' AND '2014-01-01' + INTERVAL 1 DAY - INTERVAL 1 SECOND;

こうすれば 2014-01-02 00:00:00 は含まない。1秒の差は大きい。

mysql> SELECT * FROM datecmp WHERE fromtime
    -> BETWEEN '2014-01-01' AND '2014-01-01' + INTERVAL 1 DAY;
+----+---------------------+---------------------+
| id | fromtime            | totime              |
+----+---------------------+---------------------+
|  1 | 2014-01-01 23:59:59 | 2014-07-19 00:00:00 |
|  2 | 2014-01-02 00:00:00 | NULL                |
+----+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM datecmp WHERE fromtime
    -> BETWEEN '2014-01-01' AND '2014-01-01' + INTERVAL 1 DAY - INTERVAL 1 SECOND;
+----+---------------------+---------------------+
| id | fromtime            | totime              |
+----+---------------------+---------------------+
|  1 | 2014-01-01 23:59:59 | 2014-07-19 00:00:00 |
+----+---------------------+---------------------+
1 row in set (0.00 sec)

ちなみに、1か月という範囲で調べたいときは、次のようにする。

+ INTERVAL 1 MONTH - INTERVAL 1 SECOND

ただ、そういえばこの "- INTERVAL 1 SECOND" と書いているコードを他で見た記憶がない。 絶対どこかにあると思うのだが。 今、試しにググってみたが、すぐには見つからない。 普通に INTERVAL 1 MONTH とかやっていて、1 SECOND 引いているのが見つからない。 まあ厳密にやらなくても、ってことかもしれないけど。

もしかしたら、検索を速くするために、00:00:00 には絶対にデータを作らないというコードにするのが常識なのかもしれない。 そういう時はわざと 00:00:01 にすればいい。 そんな常識は見たこともないが。

というのは余談で、ここからが本題。 今回のミッションは日時の範囲が重複していることを高速で調べろというものだ。 type が datetime のカラム、fromtime と totime があって、それが指定した期間に入っていることを調べたいのである。

一般論として、二つの範囲AとBが重複していることの判定は、 範囲Aの開始点が範囲Bの終了点以前であり、かつ、範囲Aの終了点が範囲Bの開始点以後であればいい。 これを説明しようとしたのだが、少し長くなったので今回は省略する。 対偶命題を考えると分かりやすい。

例えば、次のような判定になる。

WHERE fromtime <= '2014-07-31 23:59:59'
AND totime >= '2014-07-01 00:00:00';

そういえば、先ほどのページ、

SELECT * FROM `テーブル名` WHERE date(`reg_time`) = '2014-01-01'

が遅いというのだが、もちろん、そこに関しては全く異議はない。ただ、

SELECT * FROM `テーブル名` WHERE `reg_time` >= '2014-01-01 00:00:00' AND `reg_time` <= '2014-01-01 23:59:59'

これだと、どうなんだろ、これも遅いのだろうか?

手元にあまりデカいデータがなくて、比較したらどちらも 0.00sec になってしまうので困ったものだ(笑)。

話を戻して、さっきの、

WHERE fromtime <= '2014-07-31 23:59:59'
AND totime >= '2014-07-01 00:00:00';

これを BETWEEN を使って書けるのか、という疑問がわいてくる。 しかしなんともう時間がないので今日はここまで。 続きを書くかどうかは気分次第。

JUGEMテーマ:コンピュータ
| プログラミング | 02:21 | comments(11) | trackbacks(0)
mechanize のインストール

pc を u24e に変えてから、Ruby で mechanize を使ったクロールをしていなかったので、 インストールからすることになった。 バージョンは 2.5.1。

OS は Windows7。 Ruby のプログラミングは D:¥usr¥local¥ruby の下に workspace があって、そこにソースを置いている。 Ruby と gem は既にインストールされているので、 mechanize のインストールは gem で行う。

D:¥usr¥local¥ruby>gem install mechanize
Fetching: net-http-digest_auth-1.2.1.gem (100%)
Fetching: net-http-persistent-2.7.gem (100%)
Fetching: mime-types-1.19.gem (100%)
Fetching: nokogiri-1.5.5-x86-mingw32.gem (100%)
Fetching: ntlm-http-0.1.1.gem (100%)
Fetching: webrobots-0.0.13.gem (100%)
Fetching: unf_ext-0.0.5-x86-mingw32.gem (100%)
Fetching: unf-0.0.5.gem (100%)
Fetching: domain_name-0.5.4.gem (100%)
Fetching: mechanize-2.5.1.gem (100%)
Successfully installed net-http-digest_auth-1.2.1
Successfully installed net-http-persistent-2.7
Successfully installed mime-types-1.19
Successfully installed nokogiri-1.5.5-x86-mingw32
Successfully installed ntlm-http-0.1.1
Successfully installed webrobots-0.0.13
Successfully installed unf_ext-0.0.5-x86-mingw32
Successfully installed unf-0.0.5
Successfully installed domain_name-0.5.4
Successfully installed mechanize-2.5.1
10 gems installed
Installing ri documentation for net-http-digest_auth-1.2.1...
Installing ri documentation for net-http-persistent-2.7...
Installing ri documentation for mime-types-1.19...
unable to convert U+2013 from UTF-8 to Windows-31J for lib/mime/types.rb, skipping
unable to convert "¥xE2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for Licence.rdoc, skipping
Installing ri documentation for nokogiri-1.5.5-x86-mingw32...
unable to convert "¥xE3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for CHANGELOG.ja.rdoc, skipping
unable to convert "¥xE8" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for CHANGELOG.rdoc, skipping
unable to convert "¥xE9" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for README.ja.rdoc, skipping
unable to convert "¥xE2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for ext/nokogiri/xml_node_set.c, skipping
Installing ri documentation for ntlm-http-0.1.1...
Installing ri documentation for webrobots-0.0.13...
Installing ri documentation for unf_ext-0.0.5-x86-mingw32...
Installing ri documentation for unf-0.0.5...
Installing ri documentation for domain_name-0.5.4...
Installing ri documentation for mechanize-2.5.1...
unable to convert "¥xE3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for CHANGELOG.rdoc, skipping
Installing RDoc documentation for net-http-digest_auth-1.2.1...
Installing RDoc documentation for net-http-persistent-2.7...
Installing RDoc documentation for mime-types-1.19...
unable to convert U+2013 from UTF-8 to Windows-31J for lib/mime/types.rb, skipping
unable to convert "¥xE2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for Licence.rdoc, skipping
Installing RDoc documentation for nokogiri-1.5.5-x86-mingw32...
unable to convert "¥xE3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for CHANGELOG.ja.rdoc, skipping
unable to convert "¥xE8" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for CHANGELOG.rdoc, skipping
unable to convert "¥xE9" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for README.ja.rdoc, skipping
unable to convert "¥xE2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for ext/nokogiri/xml_node_set.c, skipping
Installing RDoc documentation for ntlm-http-0.1.1...
Installing RDoc documentation for webrobots-0.0.13...
Installing RDoc documentation for unf_ext-0.0.5-x86-mingw32...
Installing RDoc documentation for unf-0.0.5...
Installing RDoc documentation for domain_name-0.5.4...
Installing RDoc documentation for mechanize-2.5.1...
unable to convert "¥xE3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for CHANGELOG.rdoc, skipping

何か文字コードの指定をしなければいけないのだろうか、 たくさん警告が出ているようだが気にしない。

さて、今まで使っていたスクリプトでは hpricot を使っていたので、 これをインストールしようとしたら、エラーになった。

D:¥usr¥local¥ruby>gem install hpricot
Fetching: hpricot-0.8.6.gem (100%)
ERROR:  Error installing hpricot:
        The 'hpricot' native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

指定されているサイトを見ると、DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe というインストーラーがあるので、これをダウンロードして実行する。

実行時に、展開先を聞いてくる。 ruby の実行環境は D:¥ruby に入っているので、 D:¥ruby¥devkit というディレクトリを作成し、そこを指定した。

展開が終わると、devkit ディレクトリの下に、いくつかのディレクトリとファイルが生成されている。

D:¥ruby¥devkit>ruby dk.rb init
[INFO] found RubyInstaller v1.9.3 at D:/ruby/Ruby193

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

D:¥ruby¥devkit>ruby dk.rb review
Based upon the settings in the 'config.yml' file generated
from running 'ruby dk.rb init' and any of your customizations,
DevKit functionality will be injected into the following Rubies
when you run 'ruby dk.rb install'.

D:/ruby/Ruby193

D:¥ruby¥devkit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'D:/ruby/Ruby193'
[INFO] Installing 'D:/ruby/Ruby193/lib/ruby/site_ruby/devkit.rb'

なお、devkit に関する情報は、 https://github.com/oneclick/rubyinstaller/wiki/Development-Kit を参照した。

これで hpricot をインストールする準備が整った。

D:¥ruby¥devkit>gem install hpricot
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
Successfully installed hpricot-0.8.6
1 gem installed
Installing ri documentation for hpricot-0.8.6...
Installing RDoc documentation for hpricot-0.8.6...

むぅ、¥ruby¥devkit で実行してしまったが、大丈夫なのか? この後、とりあえずスクリプトを実行したら、 user_agent_alias の指定のところでエラーが出てしまったが、 実行はできているようだ。

JUGEMテーマ:コンピュータ
| プログラミング | 21:20 | comments(224) | trackbacks(0)
X→Y は NOT(X) OR Y と等しい

情報処理技術者の試験らしいが、ここで X→Y は「XならばY」の意味とする。 これが NOT(X) OR Y と等しいということは、どこで習ったのか忘れてしまった。 中学校か高校か、そのあたりだと思うのだが、 意味的には、Xが偽ならYが何だろうが真、Xが真のときはYが真のときだけ真、というように覚えていた。 この前半の「Xが偽ならYが何だろうが真」というのが当時、違和感があったことを覚えている。

「鼻から悪魔」に雰囲気が似ているかも。

NOT(X) OR Y というのは計算機的【謎】な書き方で、 数学では次のように論理記号を使って書く。

¬X ∨ Y
JUGEMテーマ:日記・一般
| プログラミング | 23:14 | comments(0) | trackbacks(0)
 1/18PAGES >>
Powered by "JUGEM"
▲このページの先頭へ
CALENDAR
S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
<< November 2018 >>
NEW ENTRIES
CATEGORIES
ARCHIVES
NEW COMMENTS
NEW TRACKBACKS
LINKS
PROFILE