mint betsy * pyaudio * usb audio

解決策は書いていない。(少しわかった!)

mint linux を betsy(debian jessie) にアップグレードした。
概ね動いているのだが、pyaudio が鳴らない。

ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
が出まくる。

いろいろいじった結果、portaudio で usb audio(jbl pebble) を使うとダメらしい…。
(LMDE 8はできてた。audacity での再生もできない。内蔵のサウンドだと鳴る。)

さて、どうしたものか…。

追記:16/2/17
audacity は、以下に書いてありました...。
http://wiki.audacityteam.org/wiki/Linux_Issues

env PULSE_LATENCY_MSEC=30 audacity

とせよと。


解決前:
...と、思ったら、alsaaudio というライブラリでもダメだった。
pulse audio あたりのalsa インタフェイスがダメなのか?
だとしたら他のアプリケーションで特に問題が出ていないのはなぜなのだ??

aplay での再生には問題がない。
試しにバッファサイズを指定すると、8000 以上だと再生できる。
…わからん。

なんと、alsaaudio でバッファサイズを16 以下にすると音が鳴る…
pyaudio も音が出るのだが、underrun は出るし、なんか途中まで早回しで再生される…。

alsaaudio の、setperiodsize でサイズを指定しても効果が出ない…。
ううん、一体どこにどういう問題があるのだろうか…


そして、audacity はどうやったら回避できるのだろうか…。


補足:
ossaudiodev という選択肢もあるが、/dev/dsp がないと言われる。
そんな時には、 padsp というコマンドから、使いたいプログラムを実行すると音が鳴るらしい。逃げ道として…。

#!/usr/bin/padsp /usr/bin/python

Cairo

グラフィックライブラリの Cairo を少しいじってみている。

pythonから普通に使えるが、どちらかというとベクタのレンダリング用のような構成で、ピクセル単位での操作はできない。特定の座標の色を見る方法もない。

get pixel やバケツ塗りつぶし(Flood Fill)とかで検索しても、「ないよ」みたいなそっけない答えしか見つからないし…。

で、ようやく以下のページを見つけた。
http://code.activestate.com/recipes/498278-access-cairo-surface-from-numpy-and-pygame/

numpyという計算ライブラリから、surfaceの情報を配列として参照できるらしい。

以下のようにすればいいらしい。

buf = surface.get_data()
a = numpy.frombuffer(buf, numpy.uint8)
a.shape = (w, h, 4)
a[:,:,2] = 255

これで行けるのではなかろうか…

Firefox29

Firefox のバージョンが上がって、いろいろ見た目が変わった。
これに限らず、結局できることは変わらないのに、見た目だけ変えるのはやめてほしい、といいたくなるけど(言っちゃっているけど)、問題は勝手にJavascriptがOFFになっていて、しかもコンフィグのコンテンツから、設定項目がなくなっていること…。

これはバグなのか?UIの方針転換で他の場所にあるのか?よくわからない。
更新も多くてわからん。マニュアル読むのは、したいことじゃない。WEBが見たい。

解決方法:
URI
about:config
を入れて、
javascript.enabled

をTRUEにする…。

もうひとつ、ALTを使ったショートカットが同時押しじゃなくなくても良くなっていたのだが、これが、IMEをONにするときに押すALTを奪って、フォーカスがどこかに行ってしまう…。検索するたびにこれが起こって、どうにも辛い。
これは再インストールしたりしてたらいつの間にか治った。タイミングつかめず。再発されたらChrome一本にするしかないのかな…。

環境は、LMDE の2014 (Debian Linux)
参考になる人はあまりいなさそうですね…

python で日本語の pdf を作成する

reportlab というのを使うのが良いらしい。
ただ、一つだけよくわからなくて少し探したので、書いておく。
基本的に英語前提なので、改行や空白が入っていないと、改行をしてくれない。
なので、スタイルには、wordWrap = 'CJK' を指定しないといけません。

以下、ベースになる様にサンプル。
環境は、Linux Mint Debian の、64bit。takaoGothic はあとから入れています。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os,sys

from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics

from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.rl_config import defaultPageSize
#from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.lib.pagesizes import A4

# フォント読み込み
pdfmetrics.registerFont(TTFont('Gothic','TakaoPGothic.ttf'))

# スタイル設定
def setStyleParam2J( style ):
    style.fontName = 'Gothic'
    style.wordWrap  ='CJK'
styles = getSampleStyleSheet()
for name in ('Normal', 'BodyText', 'Title', 'Heading1', 'Heading2', 'Heading3',
             'Heading4', 'Heading5', 'Heading6', 'Bullet', 'Definition',
             'Code', ):
    setStyleParam2J(styles[name])

# 本文の作成
Story = []
Story.append(Paragraph("タイトルです", styles['Title']))
Story.append(Paragraph("Heading 1", styles['Heading1']))
Story.append(Paragraph("Heading 2", styles['Heading2']))
Story.append(Paragraph("Heading 3", styles['Heading3']))
Story.append(Paragraph("Heading 4", styles['Heading4']))
Story.append(Paragraph("Heading 5", styles['Heading5']))
Story.append(Paragraph("Heading 6", styles['Heading6']))
Story.append(Paragraph("Bullet", styles['Bullet']))
txt = ("長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。\n"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。"
       "長い長い本文を書かなくてはいけないのだが、面倒なので、これの繰り返しです。")
Story.append(Paragraph("Normal"+txt, styles['Normal']))
Story.append(Paragraph("Definition"+txt, styles['Definition']))
Story.append(Paragraph("Code:"+txt, styles['Code']))
Story.append(Paragraph("Body:"+txt,styles['BodyText']))

# 出力
doc = SimpleDocTemplate('doc.pdf', pagesize=A4 )
doc.build(Story)

このあたりなどを参考に。
http://mogawa.blogspot.jp/2008_04_01_archive.html
http://www.blog.pythonlibrary.org/2010/03/08/a-simple-step-by-step-reportlab-tutorial/

pygtk の gtk.TreeStore の要素に、リストや辞書を含める。

store = gtk.TreeStore(dict)
store.append( None, {} )

ではダメ...。
TypeError: could not get typecode from object
というエラーが出る。dictやlist指定ではダメです。
とはいえ、gtk にも定義されていない。正解は、

store = gtk.TreeStore(object)
store.append( None, {} )

object 型を指定する。

Codeignter 2.1.x でsqlite3 を使う(しょぼい)

はまったので書いておく。
いろいろなページを見ると、pdo ドライバが必要、と書いてあるのだがそのページのリンク先は切れている。どうも新しいバージョンだと不要になっている模様。

以下のページに従ったのだが、どうしても読み込めない。

http://khromov.wordpress.com/2012/06/22/using-codeigniter-2-1-with-sqlite-3-databases/

結論:

ubuntu12.10 を使っているのだが、php のsqlite3拡張が入っていなかった…。
apt-get php-sqlite3 で解決に…。

pygtk で、デフォルトのイベントハンドラを無効にする。

treeView を、ScrolledWindow に入れているのだが、ホイールスクロールをした時の動作を変えたい。
そこで、treeView のイベント"scroll_event"に connect したのだが、ScrolledWindow のイベントも実行されてしまい、訳のわからないことに…。
disconnect しようにも、ハンドラIDがわからない…

で、結論。
ScrolledWindow のイベントハンドラを無効にするには、True を返すイベントを登録すればよい。
こんな感じ。

        sw = gtk.ScrolledWindow()
        def disEvent(a,b): return True
        sw.connect( "scroll_event", disEvent ) # ホイールスクロールを無効化

lambdaを使ったほうがすっきりするか。

        sw.connect( "scroll_event", lambda a,b: True ) # ホイールスクロールを無効化