lrcgfのブログ

趣味としてプログラミングを始めたので、そのあたりの話を中心に書いていくつもりです。

Word2013で文書を作成・編集しようとすると(応答なし)になる。

環境:

Thinkpad T430

Windows7(ダウングレード版)

MSoffice2013(professional)

解決方法:

オプション→詳細設定→表示→「ハードウェアのグラフィック アクセラレータを無効にする」をオンにする。

参考:Office2013の文字入力が遅い(プチフリーズする)場合の対処法

Office2013の文字入力が遅い(プチフリーズする)場合の対処法 - 個人的備忘録。

python 3でpipを使ってbeautifulsoupをインストールする(windows7)

環境 windows7 Python 3.3.1 2014/3/25

まずpip1.5.4をインストールし、次にbeautifulsoup4.3.2をインストールします。

pipのインストール

pip公式のインストールガイドに従います。

  1. get-pip.pyの内容をコピーして、get-pip.pyというファイルを作成してペーストし、適当なフォルダに保存します。
  2. コマンドプロンプトからget-pip.pyを保存したフォルダに移動し、コマンド
>python get-pip.py

を実行します。これでpipが自動的にインストールされます。インストールされたか確認したければ、Python33\Lib\site-packages\の下にpipが存在するか確かめればよいでしょう。

beautifulsoupのインストール

コマンドプロンプトから\Python33\Scripts\に移動し、コマンド

>pip install beautifulsoup4

を実行します。これでbeautifulsoup4が自動的にインストールされます。インストールされたか確認したければ、Python33\Lib\site-packages\の中を確かめればよいでしょう。

注意:

>pip install beatifulsoupと実行するとbeautifulsoup3をインストールしようと試みるため、 Unit test have faild! とか SyntaxError: invalid syntax とかいって終了してしまいます。理由は、beautifulsoup3はpython3系に対応していないかららしいです。

texファイルを分割して管理、ファイルごとにコンパイルできるようにする。

OS:windows7 tex:?

http://www.geocities.jp/kimukimuojisan/tex.htmlhttp://www.geocities.jp/kimukimuojisan/tex.htmlに従って、

  • texファイルをsectionごとなどに分割して作業する、
  • さらに、分割された部分ファイルごとにコンパイルして中身を確認できるようにする

とできるようにした。しかし、ファイルをフォルダごとにまとめてみやすくしたところ、ファイルの相対パス指定のときに

\include{../foldername/filename}

と親フォルダを参照するとコンパイルがうまくいかないエラーが生じた。

I can't write on file `filename.aux'. \@include ...\immediate \openout \@partaux #1.aux \immediate \write \@partau..

ぐぐってみると、セキュリティー上の理由で親フォルダ以下にあるファイルを編集することがデフォルトでは禁止されているようだ。\includeは.auxファイルを書き換えるらしく、この禁止規定に引っかかる。しかし\inputを使うとファイルの書き換えが起きないらしく、問題がない。そこで次のような工夫でこの問題を回避した。

一番上のディレクトリには

  • begin_and_endフォルダ
  • mainフォルダ
  • file1フォルダ
  • file2フォルダ ・・・

をつくる。 begin_and_endフォルダには参照先サイトにあるbegin.tex, end.texをおく。

mainフォルダ内には参照先サイトにあるmain.texをおく(ただし、正しい相対パスを指定する)。main.tex内で他のファイルを読み込む部分はすべて

\input{..\begin_and_end\begin}

等のように\inputを使っているので問題は起こらない。

file1フォルダ内にfile1.texをおく。file1.tex内で例えばbegin.texを読み込みたいときは、一度file1フォルダ内にbegin_escape.texを作る。begin_escape.texには

\input{..\begin_and_end\begin}

とだけ書く。 file1.texでは

\include{begin_escape}

と記述する。

これで、\includeを使うときは親フォルダを参照せずいったん避難先ファイルを参照させて、そこから親フォルダ以下にある本当に読み込みたいファイルを\inputで読み込めるようになる。 file1のなかで直接\inputを使うとmain.texのコンパイル時にエラーになるので、このような方法を用いた。

python3のクラス定義ではnext()ではなく__next__を使う

クラスの定義の中で、iteratorの部分は

def __iter__(self):
    プログラム
    return self

def __next__(self):
    プログラム
    return 返り値

という書き方をするが、python2ではnext, python3では__next__をつかうっぽい。
python3 でnextを使うと、

TypeError: iter() returned non-iterator of type ...

って怒られる。

tkinterで画像が表示できない?

tkinterで画像を表示するにはたとえば

import tkinter
root = Tk()
im = PhotoImage(file = 'image.gif')
canvas = Canvas(root, width = 500, height = 500, bg = 'white')
canvas.create_image(100, 100, image = im)
canvas.pack()
root.mainloop()

でいいらしい。
ところが、

canvas.create_image(100, 100, image = PhotoImage(file = 'image.gif'))

と直接引数でPhotoImageを呼んだり、

def get_image():
    x = PhotoImage(file = 'life_game_dead_cell.gif')
    return x

canvas.create_image(100, 100, image = get_image())

と関数を使ってオブジェクト生成して渡すと、ウィンドウには何も表示されない(ように見える)。
これはかなり悩んだが、tkinterbook
'The application must keep a reference to the image object.'
という一文を発見して、たぶん次のようなことなんだろうと推測した。
まずpythonにはガベージコレクションなる機能があるらしい。
これは、プログラム実行中のある時点でどの変数からも参照?されていない状態になったオブジェクトは、それ以降そのオブジェクトにアクセスするのが不可能になるのでプログラム実行上必要ないとみなされ、メモリ節約などのために自動的に廃棄されるというものらしい。(お気楽pythonを読んでいたおかげで思いあたった:garbage collection)
PhotoImage()はPhotoImageオブジェクトを生成するけど、それを適当なグローバル変数などに入れておかないと、すぐに消滅してしまうのだろう。このtkinterの仕様が不親切な設計だと思うのは理解が足りないからだろうか。
まあ実際はどうなのか分からないけど、ガベージコレクションが怪しいとは思う。

しっかし、こんなの初心者には絶対分からんでしょ。
しかも厄介なのは、

canvas.create_image(100, 100, image = PhotoImage(file = 'image.gif'))
print(canvas.find_all())

canvasのitemを調べてみたら、きちんとさっきcreate_imageで作ったitem(のid)が登録されているということ。存在してるのに見えないよーなんでだよーってかなり長く悩んでしまった。勢いあまってstuck overfllowのアカウントまで作ってしまった。次の機会から活用してみようかな。

pygameでdataファイルのpath指定

(python3.3, pygame1.9.2)
pygameで例えばイメージファイルを読み込むとき絶対パス相対パスの両方が使えるはず。

# 絶対パスからファイルを開く
pythonImg_1 = pygame.image.load('絶対パス') 
# 相対パスからファイルを開く
pythonImg_2 = pygame.image.load('image.png') 

なのに、pythonImg_2の方ではcouldn't open python.pngと怒られてしまう(もちろん画像ファイルはプログラムソースと同じフォルダ、例えばfolder1においている)。何故?と思って色々試してみると、親フォルダ名を付け足せばうまくいった。

pythonImg_2 = pygame.image.load('folder1\image.png')

念のためpathを取得するソース追加してみる。

import os
path = os.path.abspath( __file__ )
print(path)

きちんとfolder1の下にソースコードsample.pyがあった。どういうことだろう?
とりあえず、相対パスで指定するときは親フォルダから書くか、次のようにして絶対パスに書き直しておくことにする。

import os
main_path = os.path.dirname(os.path.abspath( __file__ ))
file_path = os.path.join(main_path, 'image.png')
pythonImg = pygame.image.load(file_path)

パスをつなげるのにos.path.joinを使った理由は、公式にcompatibilityのためにそうしろと書いてあったから。

理由が分からない挙動はすごく困る...自分の大ポカな予感がするけど。