2018/11/09(金) [n年前の日記]
#1 [python] pygameとGLUTを同時に使おうとしてハマった
 Windows10 x64 + Python 2.7.15 上で、pyagame 1.9.4 + PyOpenGL 3.1.3b2 + PyOpenGL-accelerate 3.1.3b2 の動作確認をしているのだけど。
_昔書いたスクリプト
が動かなくて…。gl や glu を使って描画する部分は動くのだけど、glut を使って teapot 等を描画してるところがエラーを出してしまう。おかしいな…。昔は動いていたんだけどなあ…。
ふと思いついた。バージョンがアレなのでは。
PyOpenGL、PyOpenGL-accelerate をアンインストールして。
PyOpenGL 3.1.0、PyOpenGL-accelerate 3.1.0 をインストール。
この状態なら、昔のスクリプトも動いた。そういうオチか…。
 ふと思いついた。バージョンがアレなのでは。
PyOpenGL、PyOpenGL-accelerate をアンインストールして。
pip uninstall PyOpenGL pip uninstall PyOpenGL-accelerate
PyOpenGL 3.1.0、PyOpenGL-accelerate 3.1.0 をインストール。
pip install PyOpenGL pip install PyOpenGL-accelerate
この状態なら、昔のスクリプトも動いた。そういうオチか…。
◎ ソース。 :
こんな感じのソースで動作確認をした。とメモ。
_teapot_on_pygame.py
以下のような結果に。
_teapot_on_pygame.py
"""
draw glut teapot on pygame
* Windows10 x64 + Python 2.7.15
* pygame 1.9.4 + PyOpenGL 3.1.0 + PyOpenGL-accelerate 3.1.0
"""
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
SCRW, SCRH = 640, 480
class PyGame:
    def __init__(self):
        self._running = True
        self._screen = None
    def initialize(self, w, h):
        self.scrw = w
        self.scrh = h
        glutInit()
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH)
        pygame.init()
        # OPENGL向けに初期化
        self._screen = pygame.display.set_mode(
            (w, h), pygame.OPENGL | pygame.DOUBLEBUF)
        if not self._screen:
            return
        glClearColor(0.0, 0.0, 0.0, 1.0)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45.0, float(w) / float(h), 0.1, 100.0)
        # gluOrtho2D(0, w, h, 0)
        glEnable(GL_DEPTH_TEST)  # enable shading
        self.clock = pygame.time.Clock()
        self.xrot, self.yrot = (0.0, 0.0)
        self.xpos, self.ypos, self.zpos = (0.0, 0.0, -5.0)
        return True
    def onKeyDown(self, event):
        print(event.key, event.mod, event.unicode)
        if event.key == pygame.K_ESCAPE or event.unicode == u'q':
            self._running = False
    def onKeyUp(self, event):
        print(event.key, event.mod)
    def update(self):
        spd = 0.05
        pressed_keys = pygame.key.get_pressed()
        if pressed_keys[pygame.K_UP]:
            self.zpos -= spd
        if pressed_keys[pygame.K_DOWN]:
            self.zpos += spd
        if pressed_keys[pygame.K_LEFT]:
            self.xpos -= spd
        if pressed_keys[pygame.K_RIGHT]:
            self.xpos += spd
        self.xrot += 0.25
        self.yrot += 1.0
    def draw(self):
        """ draw object """
        # Clear OpenGL Buffer
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        # set camera
        # gluLookAt(0.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
        glTranslatef(self.xpos, self.ypos, self.zpos)
        glRotatef(self.xrot, 1.0, 0.0, 0.0)
        glRotatef(self.yrot, 0.0, 1.0, 0.0)
        glScale(1.0, 1.0, 1.0)
        # draw teapot
        glColor3f(1.0, 0.0, 0.0)  # color red
        glutWireTeapot(1.0)   # wireframe
        # glutSolidTeapot(1.0)  # solid
        # OpenGL drawing
        glFlush()
        # flip pygame double buffer
        pygame.display.flip()
    def execute(self, w, h):
        if not self.initialize(w, h):
            return
        # main loop
        while self._running:
            # self.clock.tick(60)
            self.clock.tick_busy_loop(60)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self._running = False
                elif event.type == pygame.KEYDOWN:
                    self.onKeyDown(event)
                elif event.type == pygame.KEYUP:
                    self.onKeyUp(event)
            self.update()
            self.draw()
            cap = '%5.2f FPS' % (self.clock.get_fps())
            pygame.display.set_caption(cap)
if __name__ == "__main__":
    game = PyGame()
    game.execute(SCRW, SCRH)
    pygame.quit()
以下のような結果に。
[   ツッコむ ]
#2 [prog] Visual Studio Codeでファイル内のタイムスタンプを書き換えたい
今現在、emacs系のエディタ(xyzzy, NTEmacs)を使っている際は、ファイルの最初のほうにタイムスタンプを書いておいて、保存と同時にタイムスタンプを自動で更新するようにしているのだけど。
_[Home] Time Stamp
_xyzzyはすごいぜ
_auto-time-stamp.l
例えば、ファイルの最初のほうに、以下のような記述をしておくと…。
保存した際、以下のように書き換わる、みたいな。
これを、Visual Studio Code でやりたいわけですよ。
 _[Home] Time Stamp
_xyzzyはすごいぜ
_auto-time-stamp.l
例えば、ファイルの最初のほうに、以下のような記述をしておくと…。
#!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <> #
保存した際、以下のように書き換わる、みたいな。
#!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <2018/11/09 19:27:04 +0900> #
これを、Visual Studio Code でやりたいわけですよ。
◎ それらしい拡張に遭遇。 :
検索してみたら、似たような処理をしてくれる拡張は存在しているようで。
_Auto Time Stamp - Visual Studio Marketplace
ただ、タイムスタンプのフォーマットが、今までemacs系エディタ上で設定していたソレとは違っていて…。
一応、拡張の設定で、タイムスタンプの前後の文字列を正規表現で指定できるのだけど、色々記述を変えて試してみても動いてくれない。何故。
デフォルト設定のまま、デフォルトのタイムスタンプ文字列をファイルの最初のあたりに書き加えてみると動くので、拡張が動いてないというわけではなさそうだけど…。
_Auto Time Stamp - Visual Studio Marketplace
ただ、タイムスタンプのフォーマットが、今までemacs系エディタ上で設定していたソレとは違っていて…。
一応、拡張の設定で、タイムスタンプの前後の文字列を正規表現で指定できるのだけど、色々記述を変えて試してみても動いてくれない。何故。
デフォルト設定のまま、デフォルトのタイムスタンプ文字列をファイルの最初のあたりに書き加えてみると動くので、拡張が動いてないというわけではなさそうだけど…。
◎ フィルタを書いた。 :
考えてみたら、sort や uniq のようなフィルタの形で、タイムスタンプを書き換えてくれるフィルタがあれば、多少は違うかなと。幸い、Visual Studio Code の拡張には、外部フィルタを利用可能にしてくれるものがあるようで。
_Filter Text - Visual Studio Marketplace
選択範囲を作って、Ctrl + K, Ctrl + F を押すと、入力欄が開くので、フィルタ名を打ち込んでやれば、選択範囲に対して処理をしてくれる。
後はフィルタがあれば…。試しにフィルタを Perl で書いてみた。
_timestamp.pl
動作確認用に、以下のテキストファイルを書いて…。
_test.txt
変換できるか実験。
ちなみに自分の環境は Windows10 だけど cat.exe も入れてある。デフォルト状態なら、type test.txt で同じことができるのかな。たぶん。
更に、自分の環境では ActivePerl を使っているので、plファイルをbatファイルに変換してみる。
これをパスの通ったところに置いておいて…。Visual Studio Code 上で、タイムスタンプのある行を選択して、Ctrl + K, Ctrl + F → timestamp を入力。該当行が書き換わってくれた。
自動で書き換えてくれるわけではないから不便だけど、それでも手打ちで修正するよりはまだマシだろう…。
_Filter Text - Visual Studio Marketplace
選択範囲を作って、Ctrl + K, Ctrl + F を押すと、入力欄が開くので、フィルタ名を打ち込んでやれば、選択範囲に対して処理をしてくれる。
後はフィルタがあれば…。試しにフィルタを Perl で書いてみた。
_timestamp.pl
# replace time stamp filter
use strict;
use warnings;
my $patstart = "Last updated: <";
my $patend = ">";
my $chklines = 8;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
my $cnt = 0;
while(<>) {
    chomp $_;
    if ($cnt <= $chklines && $_ =~ /(.+)$patstart.*$patend$/) {
        my $tmstr = sprintf("%04d/%02d/%02d %02d:%02d:%02d +0900", $year, $mon, $mday, $hour, $min, $sec);
        print "$1$patstart$tmstr$patend\n";
    } else {
        print "$_\n";
    }
    $cnt++;
}
動作確認用に、以下のテキストファイルを書いて…。
_test.txt
#!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> #
変換できるか実験。
> cat test.txt | perl timestamp.pl #!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> #書き換わった。
ちなみに自分の環境は Windows10 だけど cat.exe も入れてある。デフォルト状態なら、type test.txt で同じことができるのかな。たぶん。
更に、自分の環境では ActivePerl を使っているので、plファイルをbatファイルに変換してみる。
pl2bat timestamp.pl_timestamp.bat が出来上がった。
これをパスの通ったところに置いておいて…。Visual Studio Code 上で、タイムスタンプのある行を選択して、Ctrl + K, Ctrl + F → timestamp を入力。該当行が書き換わってくれた。
自動で書き換えてくれるわけではないから不便だけど、それでも手打ちで修正するよりはまだマシだろう…。
◎ 余談。 :
Atomエディタも、ファイルを保存する際に自動でタイムスタンプを書き換えてくれる拡張が存在していて。コレなら、設定次第で、emacs系エディタと同じフォーマットが使える。とメモ。
_atom-timestamp
ただ、Atomエディタ自体が、鬼のように重いわけで…。起動に数分かかるし、時々強制終了するし…。なので、Visual Studio Code を使えるなら、そちらのほうが嬉しいよなと…。
_atom-timestamp
ただ、Atomエディタ自体が、鬼のように重いわけで…。起動に数分かかるし、時々強制終了するし…。なので、Visual Studio Code を使えるなら、そちらのほうが嬉しいよなと…。
[   ツッコむ ]
#3 [nitijyou] 市の保健センターまで行ってきた
市の保健センターまで行って、大腸がん検診の検体を提出。雨だったので、親父さんの運転する車で連れて行ってもらった。助かった。
昔は、保健センターの駐車場を無料で利用できていた記憶があるのだけど。今は有料になってしまったそうで。保健センターに用事が合って、かつ、30分までの利用なら、受付の方に言えば無料駐車券を貰えるらしい。
親父さんは待ってる間、近所の馴染みの写真屋さんに寄って写真談義をしていたようで。そこで聞いた話によると、市役所等も含め、市の中心部にある駐車場のほとんどは、基本的には有料になってしまったのだとか。そういう時代になったのだな…。
帰宅途中にケーズデンキに寄ってもらって、Panasonic製のスイッチ付きタップを購入。型番は確認してないけど、おそらく、 _WHS2001WP じゃないかな…。茶の間の炬燵用として使う予定。
全然関係ないけど、ケーズデンキの店頭でスイッチ付きタップを探しても、パナソニック製の件の製品しか置いてなかった。昔は色んな製品が置いてあった記憶があるけど。ケーズデンキに一体何があったのか。それとも、この手の製品ジャンルで何か事故でも発生して、ジャンルそのものが…。
 昔は、保健センターの駐車場を無料で利用できていた記憶があるのだけど。今は有料になってしまったそうで。保健センターに用事が合って、かつ、30分までの利用なら、受付の方に言えば無料駐車券を貰えるらしい。
親父さんは待ってる間、近所の馴染みの写真屋さんに寄って写真談義をしていたようで。そこで聞いた話によると、市役所等も含め、市の中心部にある駐車場のほとんどは、基本的には有料になってしまったのだとか。そういう時代になったのだな…。
帰宅途中にケーズデンキに寄ってもらって、Panasonic製のスイッチ付きタップを購入。型番は確認してないけど、おそらく、 _WHS2001WP じゃないかな…。茶の間の炬燵用として使う予定。
全然関係ないけど、ケーズデンキの店頭でスイッチ付きタップを探しても、パナソニック製の件の製品しか置いてなかった。昔は色んな製品が置いてあった記憶があるけど。ケーズデンキに一体何があったのか。それとも、この手の製品ジャンルで何か事故でも発生して、ジャンルそのものが…。
[   ツッコむ ]
以上、1 日分です。
