伺かのシェルでpnaを使う

8月 29th, 2017

久々にやったらはまったので・・・(確かめない自分が悪いんだけど)。

pnaを使って画像をなめらかにするには、

1.pnaファイルを用意する
2.シェルのdescript.txtに以下の行を書いて置く

seriko.use_self_alpha,1

上記がないと、左上のドットと同じRGB色が透明色扱いになる。

正規表現で漢字を取り出す

8月 13th, 2017

漢字を取り出したい!!

・・・が、これはひらがな、カタカナの場合に比べてものすごく難しい。

[亜-熙]

というのを見かけたが、これはうまく行かなかった。「上」等が入っていない。上記はシフトJIS用らしい。

気を取り直してさらに調査して見つけたのが

[一-龥]

やってみたところ、まずまず動いている。ただ、これでは含まれない漢字(JIS第三水準、第四水準漢字等)もあるようなので、がっつりとやりたければ、下記になるらしい。

[\u2E80-\u2FDF々〇〻\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\u20000-\u2FFFF]

部首なんかも入っているっぽい…

とりあえず忘れないようにメモということで。

正規表現でひらがなやカタカナを取り出す

8月 13th, 2017

pythonで、ひらがなやカタカナを取り出すときのパターン。

カタカナで一番よくあるのは、
[ァ-ン]

でもこれだと、「ー」が入っていないので、例えば「ドーナツ」などは「ド」「ナツ」(findallで取り出した時)と分けて取り出されてしまう。後、「ヴ」にも反応しない。

[ァ-ヾ]
にするという方法もあるが、これだと中黒「・」が含まれてしまう。個人的事情によりこれは含めたくない。

というわけで、こんな風にしてみた。
[ァ-ヴー]

具体的には↓な感じになる。
katakana=re.compile(r’[ァ-ヴー]+’)

どこまでを範囲に含めるかは、Unicode表(?)を見て決めるのがよさげ。
片仮名 (Unicodeのブロック)

ひらがなの場合も上記と同様。
[ぁ-ん]
がよくあるやり方。「う」に点々は、ひらがなの場合ちょっと厄介なので、私は含めず、
[ぁ-んー]
で使用。どこまで必要かは状況によるので、表を見て決めると良いかと。
平仮名 (Unicodeのブロック)

Timerで呼び出す関数に引数を送る方法

7月 31st, 2017

Threadingは便利なんだけど、未だに今一つ良く分からない。

今回つまったのは、Timerで呼び出した関数に引数を送りたい、というもの。

折角のタイマーなので、単に「時間です」というだけでなく、具体的に「◯×の時間になりました」と言って欲しいわけで…

ところが、いざ引数を渡そうとすると上手く行かない。で、調べた結果、こうやるらしい…

import threading

def its_time(string):
    print (string)

timertime=5
mes='Hello!'
timer = threading.Timer(timertime,its_time,[mes])
timer.start()

上記は5秒後にメッセージを表示させるもの。いじょ。

変数はraw stringが使えない(涙)

7月 22nd, 2017

正規表現で「?」にマッチさせようとして躓いた。

普通、改行の「\n」のように「\」を前につければ行けるはず。でも、「\?」では上手く行かない。

結論から言えば、これは「\\?」にすると動く。pythonのための「\」と正規表現のための「\」の両方がいるらしい。

これを避ける方法として、raw stringなるものがあるのだそう。

m=re.compile(‘\\?’)
とするところを
m=re.compile(r’\?’)

この程度なら、大差は無いが、もっとややこしい指定の時、頭に「r」をつけておくと「\」をたくさん書かなくて良くなる。もちろん、見やすくなる。

ただ、私の場合、パターンは、予め変数に入っている。ファイルから読み込んで予めまとめてコンパイルしておく方式なので、直に書けない。

こんな感じ。
pat=’\?’
m=re.compile(pat)

これ、一体どうやって頭に「r」をつければいいんだ???pat=’r'+’\?’とかもやってみたけど駄目だった。

調べて見たら、変数にはraw stringは使えないらしい。そ、そーか・・・reptを使うのだそう。repr(pat)で、patの中身がraw stringになる。

例えば、str=’test\n’の場合、そのままprintすると「test」と表示され、改行される。

だが、print (repr(str))にすると、「\n」は、書いてあるそのままのものとして、「test\n」が表示される。

残念ながら、正規表現のパターンには使えなかった。良く分からないが、上手く反応しない…まあいいや。「\」を少し余分に書くだけだ。うん。

クラス内で関数(メソッド)にlistを投げると怪しきことに?

7月 13th, 2017

なんというか・・・、これは、pythonのバージョンによって挙動が変わる可能性がある。私のは3.4なので、それ以前だと多分発生するけど、以降だとちょっと分からない。

何のことを言っているか、意味不明なので、プログラムに語ってもらいやしょう。

#coding:UTF-8

class Test:
    def moto(self):
        a=10
        self.add(a)
        print ('a=',a)

    def add(self,num):
        num+=10
        print ('num=',num)

class LTest:
    def moto(self):
        alist=['林檎','みかん']
        self.ladd(alist)
        print ('alist=',alist)

    def ladd(self,data):
        st='すいか'
        data.append(st)
        print ('data=',data)

t=Test()
t.moto()
t2=LTest()
t2.moto()

初めのクラス「Test」は、数値の代入実験。aの値を同じクラス内の別の関数に送って別途計算。結果は
num=20
a=10
これはまあ、分かる。

問題はLTestクラスの方。予想では、
alist=['林檎','みかん']
data=['林檎','みかん','すいか']

となるかと思いきや、実際は、
alist=['林檎','みかん','すいか']
data=['林檎','みかん','すいか']

書き換えた覚えの無い「alist」まで書き換わってる~。\(^O^)/。頼んでないぞーう。

ちなみに、dataとして受け取って、そのまま扱っているのが悪いかもしれない、と、下記のように一旦別の変数に投入してから操作しても無駄。

    def ladd(self,ldata):
        data=ldata
        st='すいか'
        data.append(st)
        print ('data=',data)

何故こうなるかは、薄々分かる気はするのだが、ちょっと自信がない。とりあえず、気をつけましょう、ということで~。

すとんと胸に落ちた話

7月 8th, 2017

久々にプログラミング以外のネタ。

ネットをうろうろしていて見つけた、この話がなかなかどうして、すごく面白かった。

小林麻央報道の「印象操作」にザワつく乳がん女子の胸の内

小林麻央さんの報道に胸を痛めつつ、どこか消しがたい違和感を抱いていた。それが、上記ブログを読んで、得心がいった。報道での扱い方が、ひどく偏っている気がして、それが気になっていたのだな、と。

特に3ページ目の「生きてる人の闘病記って売れないんだよね」と出版社の人から言われたという話は、当事者ならぬ私もショックだった。いや、でも、だって、重要なのは、生きる方の話じゃない?私が当事者だったら、絶対そうだ。絆を深め、治療の甲斐もなく死にました、という話より、どんな治療をして、どんな選択肢があって、何を悩み、何を迷い、どうやって生き延びたのか、どんな問題が起こるのか、どう解決したのか(あるいはしなかったのか)、そこを知りたい。

書籍も出していらっしゃるそうで。詳しくはそちら、かな?

松 さや香 著
『彼女失格 恋してるだとか、ガンだとか』幻冬舎(2013)

桁区切りがある数値

6月 14th, 2017

ユーザーの数値入力を受け付けると、桁区切りが入ってしまっている場合がある。

例えば「1800」は「1,800」と入力されるかもしれない。

。。。パイソン君にどう思う(?)か聞いてみた。

a=’1,800′
str(a)

絶対無理だろうと思ったらやっぱり駄目だった。「変なの入ってる」と言われた。

まあ、そうだよね。次は・・・

a=1,800

苦情を言われるかと思いきや、何故かすんなり通ってしまった。「何だと思った」のか聞いてみた。

答え:タプルでしょ。1と800。

言われて見ればそれもそうだな。やっぱり先に「,」を取り除かないと駄目っぽい。

a=’1,800′
b=int(a.replace(‘,’,”))

これでbに1800という数値が入りました。めでたしめでたし。

・・・とは行かないのがチャットボットの悲しいところ。やみくもに「,」を取ってしまうと、意図しない動作をしかねない。数字の間の「,」限定だと少しましだけど、でも、例えば「1,13,5」(1と13と5)という意味で入力している場合もある。

人間にフレンドリーな設定でプログラムを書こうと思うと、こういう細かい手間がすごく多くて疲れる・・・ユーザーに「数値の場合は桁区切りを使わないで」もしくは「数字の桁区切り以外で、数字を列挙したい時は『,』ではなく『、』を使って」とかやっちゃえばプログラムは簡単になる。でもそれじゃ、チャットボットの値打ちがないと思うんだなぁ・・・

三桁ごとの「,」を外す、という手もあるんだけど、でも「1と800」という意味で「1,800」と入力している場合に問題が起こる。

人間は、その数字が出てくるコンテキスト(背景)から瞬時に判断するけど、コンテキスト理解をプログラムで実行するのは、難易度が高すぎる(多分今もっとも進歩したAIでも、この辺りはまだ全然足りていないはず)。まあ、人間もたまに読み間違うけど。

次善の策で、場面限定で「,」を外すようにすれば、まあそれほど誤作動せずにすむかな・・・

ちなみに、逆に桁区切りを挿入する場合は、下記らしい。

‘{:,}’.format(1234567890)

これで1,234,567,890が得られる。

いたずらしてみた。

‘{:;}’.format(1234567890)

桁区切り指定をセミコロンに。叱られた。

「intに;を使うなんて聞いてない」

ごめん。数値と良く使う記号ならいいかも、と「-」指定にしてみた。

‘{:-}’.format(1234567890)

まんま1234567890が返ってきた。

そうか・・・。formatについて少し調べて見たけど、ちょっと難しくて良く分からない。もうしばらく眺める必要がありそう。

datetimeで日付、時刻を扱う

6月 13th, 2017

あまりにも何回も同じことを検索するので・・・自分用メモ。

now=datetime.datetime.today()

とした時の年、月、日、時間、分、秒、マイクロセカンドの取り出し
now.year
now.day
now.hour
now.minute
now.second
now.microsecond

型はint。

now自体の型はdatetime.datetime。

nowの中身(例):
2017-06-13 11:27:11.178127

フォーマットして出力したい場合
%Y..年、%m..月、%d..日、%H..時、%M..分、%S..秒
例:)now.strftime(“%Y年%m月%d日 %H時%M分%S秒”)

フォーマット後の型はstr。

フォーマット時に使われる「%Y」等の詳細は、下記参照

http://docs.python.jp/3.6/library/datetime.html

str→datetimeにしたい時
teststr=’2017/01/01 20:29:39′
datetime.datetime.strptime(teststr, “%Y/%m/%d %H:%M:%S”)

とりあえず、いじょ。

割り算で商と余りを同時に得る

6月 2nd, 2017

忘れそうなので、取り急ぎここにメモ。

Pythonで割り算は「/」か「//」。

「//」を使うと小数点以下切り捨て。

余りを得るには「%」

うう、ちょっと間違えそう・・・「%」で割り算する言語もあったような・・・

それはそれとして、割り算の商と余りを同時に得る方法もある。それがdivmod。

例えば、75割る60なら、下記のようになる。

divmod(75,60)

すると、答えは、

(1,15)

1余り15。

これを使う時はこんな感じ。

h,m=divmod(75,60)

これでh=1、m=15が入る。

いじょ。