SlideShare ist ein Scribd-Unternehmen logo
1 von 21
Playing with curses 
Ransui Iso 
Strategic Technology Div, X-Listing Co, Ltd. 
2013-09-15 
PyCON APAC 2013 in Japan
お前誰よ? 
Ransui Iso 
Work at X-Listing Co, Ltd. 
http://www.xlisting.co.jp/ 
Pythonは1998年から使っています。 
E-Commerceエンジンやサーチエンジンの開発、Zopeを用いたWebサイト開発、その他 
色々を経て、今はネット広告配信システムについての研究開発をしています。 
最近はCommon Lispでシステム開発をしていますが、Pythonもヘビーに使っています。 
Contacts 
http://www.facebook.com/ransui 
@ransui
お話する内容 
● Terminal 
● termcap / terminfo 
● curses 
– Screen / Window 
– Output / Input 
– Attribute 
● Demo 
– A Maze Solver 
– Animation with thread
History of Terminal
Console
TTY ASR-33
VT-100
Tektronix
X-Terminal
Terminal Emulator
Escape sequence
表示の制御 
● 特殊なバイトシーケンスを送り込む 
● 0x1B (ESCのコード)を先頭にして続くバイト列で色々な 
パラメータや制御を指定する 
Python 3.3.2 (default, Sep 15 2013, 10:43:16) 
[GCC 4.6.3] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print("x1b[31mHello color worldx1b[0m") 
Hello color world 
>>> 
● 端末の機種ごとにコマンドが違う 
● DEC VT-100が広く使われたのでデファクトに 
● ANSIエスケープシーケンスはVT-100のサブセット
termcap / terminfo 
● 制御コマンドのカタログ 
● 端末ごとに各機能がどのようなシーケンスになるかが記述 
されている 
– termcapは1個のテキストファイル 
– terminfoは機種ごとに分かれていてコンパイル済みのバイナリ 
● これを使うためのCライブラリがある 
– ものすごく低レイヤなのでプログラミングは死ぬ 
xterm|vs100|xterm xterm terminal emulator, 
ind=^J, cols#80, lines#25, 
clear=E[HE[2J, cub1=^H, am, cup=E[%i%p1%d;%p2%dH, 
cuf1=E[C, cuu1=E[A, el=E[K, ed=E[J, 
cud=E[%p1%dB, cuu=E[%p1%dA, cub=E[%p1%dD, 
cuf=E[%p1%dC, km, 
smso=E[7m, rmso=E[m, smul@, rmul@, 
bold=E[1m, rev=E[7m, blink=@, sgr0=E[m, 
rs1=E>E[1;3;4;5;6lE[?7hE[mE[rE[2JE[H, rs2=@ 
kf1=EOP, kf2=EOQ, kf3=EOR, kf4=EOS, ht=^I, ri=EM, 
vt@, xon@, csr=E[%i%p1%d;%p2%dr, 
il=E[%p1%dL, dl=E[%p1%dM, il1=E[L, dl1=E[M, 
ich=E[%p1%d@, dch=E[%p1%dP, ich1=E[@, dch1=E[P, 
use=vt100­am,
curses
端末に依存しない制御 
● キャラクタ端末の抽象化レイヤー 
● もっと抽象化されたインタフェースを提供してくれる 
– Window, Pad 
– 抽象化された色、キーコード等 
● 基本はCのライブラリ 
1 
– ほとんどはncurses。たまに古いcurses 
– PythonのcursesモジュールはCライブラリのWrapper 
– 関数名とかセンスないけれど、作られた時代が時代なのでしかたが 
ない
制御のしくみ 
● 基本はwindowオブジェクト 
抽象化されたキーコード 
1 
Window 
Keyboard 
物理画面 
差分更新 
Application 
Code 
API
おやくそく 
● Hello World 
1 
# ­* 
­coding: 
utf­8 
­* 
­import 
curses 
import locale 
def main(stdscr): 
stdscr.clear() 
stdscr.border() 
stdscr.addstr(1, 1, "波浪ワールド", curses.A_BOLD) 
stdscr.refresh() 
while True: 
if stdscr.getch() == 0x1b: 
break 
curses.flash() 
if __name__ == "__main__": 
locale.setlocale(locale.LC_ALL, "") 
curses.wrapper(main)
cursesを使う時のテンプレ 
● locale.setlocale(locale.LC_ALL, "") 
● 非ASCIIなバイトシーケンスをどう扱うか 
● バックエンドのncursesはlocale情報を見ている 
● LC_ALLを空文字列にセットするとシステムのデフォルト 
が使われる 
● curses.wrapper() 
1 
● 端末の初期化とか色々やってくれる 
● エラー出たり例外出た時に、端末のモードを正しく復帰し 
てくれる 
● 呼び出し先が受け取るstdscrは物理画面全体を覆う 
Windowオブジェクト
OverwarpしたWindow 
● cursesのwindowの基本はタイル型 
● 重なって表示されていても上下の概念は無い 
● curses.panel.Panelを使うとOverwrapできる 
1
詳しくは 
● 標準ドキュメントでほぼOK 
● 実はチュートリアルがあります 
– http://docs.python.jp/3/howto/curses.html 
● ライブラリリファレンス 
– http://docs.python.jp/3.3/library/curses.html
Thank you for Listening 
Happy Hacking!

Weitere ähnliche Inhalte

Ähnlich wie Playing with curses

Zend Frameworkで始める携帯サイト
Zend Frameworkで始める携帯サイトZend Frameworkで始める携帯サイト
Zend Frameworkで始める携帯サイト清水樹
 
OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介Hiromu Yakura
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
日常業務にperlを使おう
 日常業務にperlを使おう 日常業務にperlを使おう
日常業務にperlを使おうturugina
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 

Ähnlich wie Playing with curses (10)

HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
秀スクリプトの話
秀スクリプトの話秀スクリプトの話
秀スクリプトの話
 
Misrac20150523
Misrac20150523Misrac20150523
Misrac20150523
 
Zend Frameworkで始める携帯サイト
Zend Frameworkで始める携帯サイトZend Frameworkで始める携帯サイト
Zend Frameworkで始める携帯サイト
 
OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
日常業務にperlを使おう
 日常業務にperlを使おう 日常業務にperlを使おう
日常業務にperlを使おう
 
名前付け入門
名前付け入門名前付け入門
名前付け入門
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 

Mehr von Ransui Iso

「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~Ransui Iso
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話Ransui Iso
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由Ransui Iso
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングRansui Iso
 
Introduction of ToySynth
Introduction of ToySynthIntroduction of ToySynth
Introduction of ToySynthRansui Iso
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.Ransui Iso
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5Ransui Iso
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 

Mehr von Ransui Iso (12)

「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
 
Introduction of ToySynth
Introduction of ToySynthIntroduction of ToySynth
Introduction of ToySynth
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 

Kürzlich hochgeladen

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Kürzlich hochgeladen (7)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

Playing with curses

  • 1. Playing with curses Ransui Iso Strategic Technology Div, X-Listing Co, Ltd. 2013-09-15 PyCON APAC 2013 in Japan
  • 2. お前誰よ? Ransui Iso Work at X-Listing Co, Ltd. http://www.xlisting.co.jp/ Pythonは1998年から使っています。 E-Commerceエンジンやサーチエンジンの開発、Zopeを用いたWebサイト開発、その他 色々を経て、今はネット広告配信システムについての研究開発をしています。 最近はCommon Lispでシステム開発をしていますが、Pythonもヘビーに使っています。 Contacts http://www.facebook.com/ransui @ransui
  • 3. お話する内容 ● Terminal ● termcap / terminfo ● curses – Screen / Window – Output / Input – Attribute ● Demo – A Maze Solver – Animation with thread
  • 12. 表示の制御 ● 特殊なバイトシーケンスを送り込む ● 0x1B (ESCのコード)を先頭にして続くバイト列で色々な パラメータや制御を指定する Python 3.3.2 (default, Sep 15 2013, 10:43:16) [GCC 4.6.3] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print("x1b[31mHello color worldx1b[0m") Hello color world >>> ● 端末の機種ごとにコマンドが違う ● DEC VT-100が広く使われたのでデファクトに ● ANSIエスケープシーケンスはVT-100のサブセット
  • 13. termcap / terminfo ● 制御コマンドのカタログ ● 端末ごとに各機能がどのようなシーケンスになるかが記述 されている – termcapは1個のテキストファイル – terminfoは機種ごとに分かれていてコンパイル済みのバイナリ ● これを使うためのCライブラリがある – ものすごく低レイヤなのでプログラミングは死ぬ xterm|vs100|xterm xterm terminal emulator, ind=^J, cols#80, lines#25, clear=E[HE[2J, cub1=^H, am, cup=E[%i%p1%d;%p2%dH, cuf1=E[C, cuu1=E[A, el=E[K, ed=E[J, cud=E[%p1%dB, cuu=E[%p1%dA, cub=E[%p1%dD, cuf=E[%p1%dC, km, smso=E[7m, rmso=E[m, smul@, rmul@, bold=E[1m, rev=E[7m, blink=@, sgr0=E[m, rs1=E>E[1;3;4;5;6lE[?7hE[mE[rE[2JE[H, rs2=@ kf1=EOP, kf2=EOQ, kf3=EOR, kf4=EOS, ht=^I, ri=EM, vt@, xon@, csr=E[%i%p1%d;%p2%dr, il=E[%p1%dL, dl=E[%p1%dM, il1=E[L, dl1=E[M, ich=E[%p1%d@, dch=E[%p1%dP, ich1=E[@, dch1=E[P, use=vt100­am,
  • 15. 端末に依存しない制御 ● キャラクタ端末の抽象化レイヤー ● もっと抽象化されたインタフェースを提供してくれる – Window, Pad – 抽象化された色、キーコード等 ● 基本はCのライブラリ 1 – ほとんどはncurses。たまに古いcurses – PythonのcursesモジュールはCライブラリのWrapper – 関数名とかセンスないけれど、作られた時代が時代なのでしかたが ない
  • 16. 制御のしくみ ● 基本はwindowオブジェクト 抽象化されたキーコード 1 Window Keyboard 物理画面 差分更新 Application Code API
  • 17. おやくそく ● Hello World 1 # ­* ­coding: utf­8 ­* ­import curses import locale def main(stdscr): stdscr.clear() stdscr.border() stdscr.addstr(1, 1, "波浪ワールド", curses.A_BOLD) stdscr.refresh() while True: if stdscr.getch() == 0x1b: break curses.flash() if __name__ == "__main__": locale.setlocale(locale.LC_ALL, "") curses.wrapper(main)
  • 18. cursesを使う時のテンプレ ● locale.setlocale(locale.LC_ALL, "") ● 非ASCIIなバイトシーケンスをどう扱うか ● バックエンドのncursesはlocale情報を見ている ● LC_ALLを空文字列にセットするとシステムのデフォルト が使われる ● curses.wrapper() 1 ● 端末の初期化とか色々やってくれる ● エラー出たり例外出た時に、端末のモードを正しく復帰し てくれる ● 呼び出し先が受け取るstdscrは物理画面全体を覆う Windowオブジェクト
  • 19. OverwarpしたWindow ● cursesのwindowの基本はタイル型 ● 重なって表示されていても上下の概念は無い ● curses.panel.Panelを使うとOverwrapできる 1
  • 20. 詳しくは ● 標準ドキュメントでほぼOK ● 実はチュートリアルがあります – http://docs.python.jp/3/howto/curses.html ● ライブラリリファレンス – http://docs.python.jp/3.3/library/curses.html
  • 21. Thank you for Listening Happy Hacking!