みんな大好き! Hello, World

2,786 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,786
On SlideShare
0
From Embeds
0
Number of Embeds
59
Actions
Shares
0
Downloads
16
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

みんな大好き! Hello, World

  1. 1. みんな大好き! Hello, World
  2. 2. 今回のスライドはこの「Hello, World」 についてだけ 解説します
  3. 3. % vim hello.py% chmod u+x hello.py%
  4. 4. % vim hello.py% chmod u+x hello.py% ./hello.py
  5. 5. その前に ZSH
  6. 6. unsigned int 引数 タイプ タイプ0x241 001 0010 1 (00001) WC_LIST0xc02 110 0000 2 (00010) WC_SUBLIST0x083 000 0100 3 (00011) WC_PIPE0x026 000 0001 6 (00110) WC_SIMPLE0x000 WC_SIMPLEの引数0x000 000 0000 0 (00000) WC_END
  7. 7. WC_LIST 01 0010 0: Z_SIMPLE 1: Z_END 0: Z_DISOWN 0: Z_ASYNCtest -f hoge && 1: Z_SYNCfuga & 0: Z_TIMED
  8. 8. WC_SUBLIST 110 0000 11: 次のSUBLISTまで 0: WC_SUBLIST_SIMPLE 0: WC_SUBLIST_NOT 0: WC_SUBLIST_COPROCtest -f hoge && 0: WC_SUBLIST_OR... 0: WC_SUBLIST_AND
  9. 9. unsigned int 引数 タイプ タイプ0x241 001 0010 1 (00001) WC_LIST0xc02 110 0000 2 (00010) WC_SUBLIST0x083 000 0100 3 (00011) WC_PIPE0x026 000 0001 6 (00110) WC_SIMPLE0x000 WC_SIMPLEの引数0x000 000 0000 0 (00000) WC_END
  10. 10. WC_PIPE 000 0110 000011: 行番号 0: WC_PIPE_MIDtail -f hoge | ...
  11. 11. WC_SIMPLE 000 0001 引数の個数test -f hoge
  12. 12. WC_SIMPLEの引数 000 0000 00000: バッファ位置 0: 3文字以下? 0: トークンを含む?test
  13. 13. 3文字以下だと?たとえばabcが 00000 0110 0011 (c) 0110 0010 (b) 0110 0001 (a) 010 空文字用
  14. 14. さあ、これでPyQ.... いや、まだまだexecve(“./hello.py”,...) しただけ
  15. 15. do_execve_common()ファイルを開くファイルの先頭128byteを読みこむbinary handlerの探索
  16. 16. ./hello.pyだと
  17. 17. load_script#!から始まる?/usr/bin/pythonを読む/usr/bin/pythonをopenbprmを新しくして再度binary_handler探索
  18. 18. /usr/bin/python
  19. 19. load_elfELF headerを読むelf interpreterのパス取 得elf interpreterとプログ ラムを読むstart_thread()
  20. 20. ELF インタプリタライブラリのリンクを行なう「リンカ・ローダ実践開発テクニック」
  21. 21. Python/usr/lib/python2.7/site-packages/PyQt4/QtGui.soinitQtGui() sipModule = Py_InitModule(sipName_PyQt4_QtGui, sip_methods);
  22. 22. C++で書くと…int main( int argc, char **argv ){ QApplication app(argc, argv); QPushButton w( "Hello world!"); app.connect(&w, SIGNAL(clicked()), &w, SLOT(close())); w.show(); return app.exec();}
  23. 23. QPushButtonQPushButton::QPushButton(const QString &text, QWidget *parent) : QAbstractButton(*new QPushButtonPrivate, parent){ Q_D(QPushButton); setText(text); d->init();}
  24. 24. Q_D#define Q_D(Class) Class##Private * const d = d_func() QpushButtonPrivate * const d = d_func(); setText(text); d->init();
  25. 25. Q_DECLARE_PRIVATEclass QpushButton ...{Q_DECLARE_PRIVATE(QPushButton)}inline const QPushButtonPrivate* d_func() const {return reinterpret_cast<const QPushButtonPrivate *> (qGetPtrHelper(d_ptr));}
  26. 26. こういうデザインパターンを…
  27. 27. QWidget parent == 0なので Q_WINDOWになる QWidget::create() create_sys() XCreateWindow()
  28. 28. connectapp.connect(&w, SIGNAL(clicked()), &w, SLOT(close()));
  29. 29. connect実装app.connect(&w, SIGNAL(clicked()), &w, SLOT(close()));→ app.connect(&w, "2clicked()", &w, "1close()");meta-object
  30. 30. w.show()w.show(); == w.setVisible(true);type == Qt::Window? d->show_helper() show_sys() XMapWindow(X11->display, q->internalWinId());
  31. 31. Xとの通信MapWindow
  32. 32. Xのイベント処理xorg-server/dix/dispatch.c: Dispatch()入力イベント処理イベント待ちクライアントのイベント処理クライアントは複数いる
  33. 33. Need Scheduling ...
  34. 34. スケジューリング 同じ優先度なら 前回のIDとの差(& 0xff)が大きいも の スライス: 20msec 優先度上がる 40msec以上event来てなかった キー入力などが来ている 優先度下がる スライスを使いきる 一つだけが動いている時は多めに
  35. 35. Rendering.....
  36. 36. window出た
  37. 37. evdevvoidEvdevPostRelativeMotionEvents(InputInfoPtr pInfo, int num_v, int first_v, int v[MAX_VALUATORS]){ EvdevPtr pEvdev = pInfo->private; if (pEvdev->rel_queued) { xf86PostMotionEventM(pInfo->dev, Relative, pEvdev->vals); }}
  38. 38. Qt signalconectionListsからシグナル通知先を取得イベントを投げるあとはQtのイベントループで処理すれば… !
  39. 39. すばらしいHello, World みんなもGentooに Hello, world してみよう

×