Recently in プログラミング Category

0 は False

| No Comments | No TrackBacks

Python で久しぶりにどはまりした話題。

いつものように Python でデータを処理して出力するプログラムを書いていたときのこと。順調に動いていたんだけど、なぜか時々思ったような動きをしていない。

そのときのコードは以下のような感じ。

dict_data = { 適当な辞書データ }
if dict_data.get(key, None):
     print u'値があったときの処理'
else:
     print u'値が無かったときの処理'

てな感じで辞書に希望キーがあった場合は値を処理して、無かった場合はエラーにならない感じに処理を書いていたのですが…なぜかあるはずのキーの値がないと言われる。

これ、おそらく Python 熟練者にはあまりにもばかばかしいバグっぽい感じですね。私も気づいたときは頭を抱えましたよ。

で、正解は…真値テストが 0 の時は偽なんですね。当然です。はい。だから、値が 0 の場合は、当然無かったときの処理が動くわけで…

えらい初歩的なことにはまってしまったなぁ。

iPad が欲しい!

| No Comments | No TrackBacks

最近こんなゲームを作りました

で、iPad のゲームを作っていて思ったのですが、タブレット端末はあると便利ですね~いろいろと。

というわけで、しばらく iPad 欲しい熱が醒めやらなかったのです。

SoftBankBag.JPG

そして、とうとう我慢出来ずに、買ってしまいました!

あまりのうれしさにいろいろと忘れてしまっている気がしますが、鞄の中身を出して……

SonyTabletS.jpg あ、あれ……ドコデマチガエタ。

まぁ、種を明かすと SonyTablet はずーっと欲しかったんだけど、なかなか手を出せなかったんだよね。で、Android 4.x に対応するし、値段もいい感じに下がってきたし、ってことで買ってしまいました。

SoftBankの紙袋なのは、SonyTablet の箱が入る大きさの紙袋がなかったかららしい。ソニーの営業がんばれよ…w

先日、ちょっとした原因で utf-16 のテキストファイルを加工する必要が出てきたので、いつものように Python で書いていたら、なぜか decode('utf-16') でエラーになる。

しかも '\n' やら '\x00' をデコードしようとしてエラーに…てか、utf-16 だから \x00 はあるよね⁉

と、かなり頭の中をはてなマークが駆け巡ったのですが…

このとき、いつものように行単位で処理をしていたんだけどどうやらそれだと utf-16 をうまくデコード出来ないらしい。

どうやら utf-16 のテキストを読むときは codecs.open の方を使わないと駄目なようです。

しかしいまだに初歩的なことではまるなぁ…

どうでもいいけど、内部は Shift-jis で扱って、出力が utf-16 になるっぽい Excal2010 の VBA さんはどうにかならないのかな。

先日、ふとした理由と好奇心から Excel2010 の VBA で SQL 操作を行ってみることに。

対象となる DB は sqlite3 で、ODBC 経由で操作するので読み出しそのものは簡単だったのですが、問題は更新(UPDATE)処理。

今時の SQL 操作っぽくプリペアドステートメント(VBA だとパラメータクエリと言う?)を使おうと思ったけど…

これが困った。ヘルプもよくわからないし、検索してみてもほとんどがクエリの発行だけだし、ほとんどわからん(´・ω・`)

で、いろいろとヘルプや検索を駆使して書いてみたのが以下のような感じ。

Dim con As ADODB.Connection
Dim cmd As ADODB.Command

Set con = New ADODB.Connection
con.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=db.sqlite"
con.Open

Dim sql As String
sql = "UPDATE テーブル SET" & _
    " カラム=?" & _
    ",更新日=?" & _
    " WHERE インデックス=?" & _

Dim now As String
now = Format(DateTime.now, "yyyy-mm-dd hh:nn:ss")

Set cmd = New ADODB.Command
With cmd
    .ActiveConnection = con
    .CommandText = sql
    .Parameters.Append cmd.CreateParameter(, adInteger, _
        adParamInput, , カラム)
    .Parameters.Append cmd.CreateParameter(, adVarChar, _
        adParamInput, Len(now), now)
    .Parameters.Append cmd.CreateParameter(, adInteger, _
        adParamInput, , インデックス)
    .Prepared = True
    .Execute
End With

とりあえずこんな感じで動いた。

ただ、この方法もちゃんとした方法ではないみたいで、cmd の内容を次々と更新して DB を更新していくと、何回目かで 0x80040e21 のエラーを吐いて止まってしまう。

Set cmd をブロックで囲むことで(おそらく)デストラクタ(VBA じゃ違う用語なのかな?)が働いて複数処理も動いたけど、はて、何が足りないんだろう?

もう少しわかりやすい VBA ヘルプはないのかなぁ。

XML はめんどくさい

| No Comments | No TrackBacks

Python で XML を扱うときのお話し。わりとはまったので備忘録をかねて。

Python 2.5 以降であれば XML を扱うのに便利なモジュール ElementTree が内蔵されています。で、これを使って XML を読み込もうと思ったのですが…なぜか期待した通りに動作しない。具体的には findall で何もヒットしない。

で、しばらく悩んでもわからないので iterator で全出力をしてみたら…

from xml.etree import ElementTree
d=ElementTree.parse(open(filename,'rb'))
for i in d.getroot():
  print i.tag

以下のように出力されました。

{http://URL}Header
{http://URL}Body

最初見た瞬間なんじゃこりゃ⁉と叫んだのはわりと内緒です。

で、しばらく悩んで、いろんな人に相談した結果…URL の中身は xmlns の値(ネームスペース)で、どうやら XML というのはそういうものらしい。とのこと。

とはいえ、これじゃ若干めんどくさいのでいったん読み込んで、xmlns の中身を削除して、ElementTree はデータを引数として渡すことは出来ないっぽいので、cStringIO で…というわりと面倒な方法で対処しました。

import re, cStringIO
from xml.etree import ElementTree
xmlns_re = re.compile(r'^(.*?xmlns=")(.*?)(".*)$', re.I|re.S)
fp=open(filename,'rb')
data=fp.read()
fp.close()
data=xmlns_re.sub(r'\1\3', data)
fp=cStringIO.StringIO(data)
d=ElementTree.parse(fp)
fp.close()

もう少しうまいやり方がありそうだけど…XML はめんどくさいな(^^ゞ

urllib2 と gzip

| No Comments | No TrackBacks

結構どはまりした話題。

とある理由から html で書かれたデータを解析する必要が出てきました。

html を解析する場合、実は結構面倒で何か楽出来ないかな~と思って、いろいろ探していたらBeautifulSoupというとっても便利なライブラリを発見したのですよ。

で、これはラッキー!と思って早速使って組んでみたら、とてもうまく動いてくれてかなり満足していたのですが…とある euc-jp で書かれた html ページがなぜか解析失敗する。

どうも追いかけていくと、euc-jp ではなく、windows-1252 で判別されているっぽい。

ちょっと不思議に思ったので、urllib2 で直接データを取得して…と思ったのがすべての間違い。ここからめちゃくちゃはまってしまいました…まぁ、単純に以下のようにhtmlを取得した(つもり)だったのですが…

import urllib2
fp=urllib2.urlopen('http://どこかの.ページ')
data=fp.read()
fp.close()

なぜか取得したデータが化けている!しかも取得サイズが全然違う。もう、頭の中大混乱でした…

結局一日ぐらいたって、わかったのが…Content-Encoding: gzip なデータは urllib2 で受信した場合、自前で展開しなければならないということ。

無駄にえらい時間を使ってしまった…

ちなみに、当初の BeautifulSoup がエンコードを間違えるのは、euc-jp で変換出来ない文字が使われているから、でした。

この問題も結構面倒だよなぁ……

ippsRSAEncrypt/ippsRSADecryp 関連のネタ、その2。

IPP 7.0 で警告が出るとは言え、とりあえず動くようになった ippsRSAEncrypt なのですが、なぜか IPP 6.1 で作ると、暗号化されたデータがすべて 0x00 になるという謎が…

う~ん… ippsSetOctString_BNU で変換して ippsSet_BN しているのがまずいのかなぁippsSetOctString_BN を使って値をセットしても、その後の演算でオーバーフローを起こしてしまうんだよね。

IPP 7.0 で動作してIPP  6.1 で動かないというのは謎だなぁ。

しばらく忙しくて何も書けなかった…やっと落ち着いてきたので、いろいろ調べたことを書いてみます。

何となく作って見ようと思って ippsRSAEncrypt/ippsRSADecrypt を使ったコードを書いてみました。深い意味は無くて、何となく作って見たのですが…結構はまった。というか、日本語の資料がほとんどない!

まず RSA を使う場合、巨大な数を扱えるようにする必要があります。IPP の場合、Big Number Arithmetic という項目にある関数群ですね。

基本的には ippsSet_BN を使えばいいだけなのですが…これが、まずはまる原因でした。

ippsSet_BN はマニュアルを見ればわかるのですが、与えられる数が 32bit(Ipp32u) の配列です。で、最初はもらった数値をキャストして渡せばいいんだろう。と思っていたら…全然違った。

どうもエンディアンの問題で(Intel の中の人曰く)うまく動かないらしい。なので、ippsSetOctString_BNU を使って Ipp8u から Ipp32u に変換して、ippsSet_BN すれば OK。

また、IppsSet_BN を行う場合、第一引数に IppsBigNumNEG を指定しないと動きません。

でも、ippsSetOctString_BNU って、IPP 7.x からは「次のバージョンで使えなくなるよ?」みたいな警告が出るんだよね(^^ゞ

先日の後日談(?)

無事パッチがあたって、安心したのもつかの間、コンパイルをすると…

intrin.h(26): fatal error C1083: インクルードファイルが開けません: 'ammintrin.h': No such file or directory

と、今までコンパイル出来ていたソースをコンパイルすると上記のようなエラーが…なんでじゃヽ(`Д´)ノ

なんか、いろいろとぼろぼろだなぁ。今回のアップデートは。

ウェブをいろいろと検索したら、VisutalStudio 2010 の SP1 をもう一度あてればいい。ということっぽいので、ダウンロードしてインストール。

めちゃくちゃ時間がかかったけど、アップデートが当たって無事にコンパイル出来ました。

今回のWindowsUpdateしたあとに気づいたんだけど、VisualStudio2010 のヘルプがウェブブラウザで見る形式ではなくなっているっぽい?(たぶんSP1が当たったときかな?)

微妙にAPIが検索出来ないけど。

KB2455033 インストール失敗

| No Comments | No TrackBacks

今月の WindowsUpdate ネタ

今月はいつもより多くの WindowsUpdate があったのですが、会社の PC を更新していたら、なぜか KB2455033 だけインストールに失敗する。

再起動を繰り返しても駄目だし、どうにもなりそうになかったので検索してみたら Microsoft のページに報告が上がっていました。

中学一年生以下の英語力(w)を駆使して、辞書とにらめっこをしながら読んでみたら、どうやら以下の順番でやればいいみたい。

  1. KB2519277をインストールする
  2. その後にKB2455033をインストールする

どうも VisualStudio 2010 SP1 をあてたときに、Windows SDK 7.1 の削除してはいけないファイルを削除してしまうみたいで、それを直さないと駄目なようです。

どうやら VisualStudio 2010 SP1 にはいろいろと問題があるみたい?とはいえ、もう SP1 にしてしまったしなぁ(^^ゞ