 

- CompositeIconβ(λ)
̵̤¿꥽꡼ƤʵƤʤʤΤǲ褦
ʲ򤪤Ȥˤʤ뤬򥭥å
ƤʤȤǶѤ롣

* åΥ
baseμ̡GtkWidgetGtkStyleоݤȤʤ
GtkIconSizeޥåƤGtkWidgetǡƱ(GdkPixbuf
GdkPixbufAnimation)Ѥ롣
AddonIconSet֥ȤȤƤޤȤ롣



- 2chΡֿåɺפˤformsubmitȤ̾inputͿ
  value"åɺ"(Shift-JIS)



- 2chλѹˤꡢ񤭹߻˰Ȥϰۤʤ륭ɤɬפˤʤ
͡hana=mogerasuka=pontanѤä
suka=pontan񤭹CGIΰȤϤȤɬס񤭹
򽪤ȡhttp responseSet-CookieǥɤäƤ롣
ŪˤϡCookie̵Ǥκǽν񤭹ߤǤϡƳǧפhtml
å֤ꡢresponseˤ
Set-Cookie: PON=OFSfb-24p4-20.ppp11.odn.ad.jp; expires=Friday, 01-Jan-2016 00:00:00 GMT; path=/
headerդƤ롣

ֽ񤭹߳ǧפǡ־פȡֽ񤭹ߤޤפʥå
֤ꡢresponseˤ
Set-Cookie: HAP=2155141; expires=Friday, 01-Jan-2016 00:00:00 GMT; path=/
Set-Cookie: suka=pontan; expires=Friday, 01-Jan-2016 00:00:00 GMT; path=/
Set-Cookie: PREN=login%3aPenguin; expires=Friday, 01-Jan-2016 00:00:00 GMT; path=/
headerդƤ롣

ֽ񤭹߳ǧץåᤷɬפʥɤФ
ɲäֽ񤭹ߤޤפʥåտ魯Set-Cookie
Ŭ˽褦ѹɬפ롣
äѡ򵡤Cookieȼ갷٤ġġ



- ѤǥåΤƤʤȤ餯ä구Ƥޤ
  ʤΤǡλȤߤƳ롣ŪˤѤն(5ʬ塩)
  Ǥν񤭹ߤǤϥåФ롣Ūˤϰöå
  줿ʬˤʤäƤȴԤߤΣͤλͤ
  speedcgiαƶˤ()¦ξ֤ѹʬ٤Ф餱ط
  ǡåȯԸ˵()åɬפˤʤ礬ͤ롣
  åؤǤϤʤIPɥ쥹Ϳ롣ʤΤǡIP
    ɥ쥹Ѥä˸ŤåΤƤ褦ˤʤäƤнʬ
    饤(¹ԴĶ)IPɥ쥹ˡ
    ¿ʬ¸ߤʤΤǡưǥåõ˥塼ƥ
    դǺѤޤͽꡣ



- 񤭹߻BeεǽȤɤñon/offǤ褦
  ߥɥ˥ܥդ롣()



- http://liveb1.2ch.net/ˤϤʤĤdatեʤɤߥ顼
  ƤäĤɤƤɤ餷



- ʣAAϻٱ絡ǽɲá



- ɸॹΥݡȡȤäƤJavaScriptޤǤݸʤΤǤ
  ۤɳڤǽǤʤ
  ݤʤä



- HTTP̿㤨ΤpǤŬڤRefererꤷʤ̿
  Ǥʤäꤹ뤷URLup.2ch.netv.2ch.netΤ褦Ѵime.nu
  Τ褦ad-hocʼ갷򤷤⤢롣Τ褦
  ad-hocʥåϡɥǥ󥰤ƤޤΤϤĤޤʤΤǡ
  schemeǳĥǤ褦ˤ٤()



- Ƕ2chǤϡѤURL񤭹ޤƤ뤳ȤΤǡURL
  ̾URLؤѴ򤷤scheme٥ǼͽURL
  񤭴Ȥ߹ߤΤǡscheme٥2chηǼĥꥹȤ˥
  Ǥ褦ˤ٤



- ϡžΥФsubject.txtʤʤȤˤʤʤɤ
  ݤ顢ͤΥаžФǤϤ䤽Ǥϸ
  Ǥʤʤä͡
  http://pc5.2ch.net/jisaku/http://pc7.2ch.net/jisaku/ؤΰž
    http://pc5.2ch.net/jisaku/subject.txt죱Ĥ
    subject.txtˤʤä



- κɤ߹ߵǽɲáƱURLŪѤ䡢ե
  ɤ߹ߤԴ˽äƤޤä˻Ȥ



- ɤ߹ѤȽ񤭹ѤproxyȤʬȤ˾롣()



- basicǧڤɬפʷǼĤȤȤ˾롣



- ꤵ줿pathdatեɤߤȤ˾롣



- ƥʣΤǤ褦ˤ(֥åޡǽʬ͡)



ꡦ֥åޡ
ΤĤİȤ߹ޤƤޥեʲϽ񤭹߲Ĥ
ΤФưǺäեȡʳΥեϽ񤭹
ĤʤΤǡUIȤꡦȤ˰ä

ʤΤǡꡦ֥åޡİΩΤˤ
ޥեɤĤ򽸤ƤäƤΤϡʤΤǤꡦ֥
ޡǤⰷ褦ˤޤĤäƤΤ桼鸫
ˤ뤳ȤɬפɤʤΤǡäꡦ֥åޡ
ϥեˤäƳز줿URL򽸤륳ƥʤäƤȤˤͽꡣ

̯ˤʤΤϡbbsmenu.htmlϤƤʤ桼
μ갷URLǼ갷ηǼĤURLɤ
̤ˤʬʤΤǡߤURLBBSTableб
BulletinBoard֥Ȥ֤äƤ餽ĤURLǤȤȽ
Ƥ롣ޤǤμǤϡޥեˤϲĤ⤷Ĥ֤
褦ˤʤäƤơġޥեİΰǤäᡢ桼
Ĥ⼫ưŪBBSTableϿƤΤǡҤλȤߤɤ
İbbsmenu.html11б륪֥ȤǤȤ
ˤȡ桼Ĥ;Ϥʤʤ롣

ϤꡢİˤϥޥեѰդƤɬפꤽ
ĥ˥塼۲İ֤ǤĤ˥Ǥ褦ˤ
ΤǡɤĤ򽸤ƤǽUIŪˤɬפ
ĤǤˡꡦ֥åޡ˴ޤޤե⡢ǤȤƥ
URLޤǤΤϸߤβĤΤ褦˳褦ˤ


İꡦ֥åޡǤꤿ
ĥ꡼ɽ˥塼Сĥ˥塼Τ줫ǤƱƤȤʤ
ġġʴޤޤ륹ιå򤷤ƥɽ
뵡ǽĤäݤΡˤؤΥ

ꡦ֥åޡؤǤդURLϿز줿եˤ
ơƵŪʹå

˥塼С餪ꡦ֥åޡΥȥ򤷤硢
URLäĤ򳫤URLä饹򳫤ܥ򤷤
ϥ֤ǳΥ֤ɽɽ롣ܥ򤷤
ϥȥФ륳ƥȥ˥塼򳫤



UI
  (1) ߤΤ褦̤˥Υ֤򽸤
  (2) ()Υ֤ȥɽΥ֤ΩڥȤ
  2̤Ѱդ٤
  Ū3ڥ̣ŪˤŪˤİϤʳΩ
  Ƥ(İɽʤ2ڥˤΤϴñǤ)ΤǡʲǤ
  /ɽˤΤܤ롣

  - ٤ȤƤϡ()Ĥǳɽɤ
    ⸵ĤȴΩʤΤǡΰݤˤȡ


˥塼С
firefox򿿻ƥ˥塼СƤԤ褦
- File
    // New Window (α)
    New Tab
    Open File
    Open Location
    // Close Window (α)
    Close Tab
    ------------
    Clear Cookies
    ------------
    Login/Logout 2ch Be
    Login/Logout 2ch Viewer
    Work Offline
    ------------
    Quit

- Edit(̤)
    New Thread
    Write Response
    ------------
    Search Boardlist
    Search Threadlist
    Search Thread
    ------------
    Preferences

- View
    Toolbar
      Navigation Toolbar
      Boardlist Toolbar
      Bookmark Toolbar
      Threadlist Toolbar
      Thread Toolbar
    Sidebar
      Boardlist
      Bookmark
      History
      Post History
    Boardlist
      Show Hidden Items
    Threadlist
      Sort by Weight
      Hide Hidden Threads
    Thread
      Inline Image
      Popup Image
      Embeded Response Editor
    Fonts
      Boardlist/Threadlist Fonts
      Thread Fonts
    -------------------
    Stop
    Refresh Threadlist
    Refresh Thread
    Auto Refresh

- Go
    Go Forward
    Go Back
    -------------------
    Ƕ
    -------------------
    History

- Boardlist
    Add Board
    Manage Boardlist
    -------------------
    Refresh Boardlist
    -------------------
    İ

- Bookmark
    Bookmark This Page
    Manage Bookmark
    -------------------
    ֥åޡ

- Tool
    Debug Console
    Scheme Console
    -------------------
    Page InformationߤġΥץѥƥ򳫤

- Help
    Help Contents
    -------------------
    About

Ťboardlist.xmlɤ߹硢Ĥбե
ꡦ֥åޡɲäĤΥ˴ޤޤ륹URL
ͤƤΥեȤԤ



֥åޡ֤Υƥȥ˥塼
Firefox
(N)			Υ֤̣ʬʤΤ
-------------
֤ɤ߹(R)
ƤΥ֤ɤ߹(A)	꤫ͭ
¾Υ֤Ĥ(O)		
------------------------
֤Ĥ(C)
------------------------
֤å(L)	 ̣ʬ͡




ͤBe
FirefoxͻҤ򸫤ȡ
MDMD: ѥɤ򥴥˥祴˥礷Ρ
DMDM: ᡼륢ɥ쥹
ȤåꤵƤ롣
󤷤ꤵΤ
󤷤֤äƤhtmlʸ˥åꤹjavascript
  ޤäƤ롣



åϢ
ä֤Ƥ뤦˺ƤޤäƤsigslotˤ륷ʥȯ
ˤgdkΥåƤʤФʤʤͳϡsigslotˤ
ʥȯԻˡsigslotǥåˤserializationԤ뤿ᡣ
glib/gtk¸libochushasigslotˤ륷ʥ뵡ȤƤ
Τǡlibochusha¦̵طΥå̵ͭĴ٤Ĥġǥåɥå
ȤΤϸŪǤʤglib/gtk¸ΤΤ餽Υ
ʥ뵡ȤˡgdkΥåƤݾڤǤС
sigslotˤ륷ʥΥϥɥsigslotΥåݤƤ
ǸƤФΤǡǤgdkΥåμϥǥåɥåο
ʤ˼¹ԤǤ롣

sigslotΥågdkΥågdkΥåβsigslot
ΥåβȤɬΤǡǤϥǥåɥå
ʤ



 threadlist.xml¸ˤĤ
¸뤫줬
С0.5ϰϡĤ˥ȤطΩäƤΤǡ
Ĥǥ˴ؤƤξ󤬤ۤܺǿǤȴԤǤ
0.6ǤΩطǡAΥĤA˽°륹B
ʤɤꤦ롣ĤޤꡢĤߥ󥰤
threadlist.xml¸Ƥ⤽줬ǿǤȤȤϤۤȤɴԤǤ
ʤʤäʤΤǡ̤β餫Ŭʥߥ󥰤򸫤Ĥɬפ롣

ΤȤͤƤΤϡGLibidleؿȤƻBulletinBoardΥꥹ
ȤʤᡢλǺǿξ¸ƤʤĤ򸫤Ĥ¸
Ȥμthreadlist.xml¸٤BBSThreadΥå
ξ󤬹줿顢бBulletinBoarddirtyե饰ΩƤ뤳
ˤƤidleؿBulletinBoarddirtyե饰ΩäƤ
threadlist.xml¸Ȥήˤʤ롣ϡ򼡡ȳƤ
Ǥidleؿϵư뤿ᡢ¸Ƥ¸Ƥ¨¤dirty
ˤʤȤΤͽۤ뤳ȡ

dirtyBulletinBoard򸫤Ĥnø¸Ȥͤ
⤦ͻɬפʡ



 ûŪʲ
- drag/dropޤİȥ֥åޡϢǽμ
- λdirtypendingĤthreadlist.xml¸롣
- URL򳫤ǽ
- ɲåɡ



 ڤߤˤƤ뵡ǽ
- åδǽ
  ̯˵դåեǥե
  ˥ͥɽȤʤȡλǺǽ郎
  ƤޤġġϤꡢåLRUΤˤϺǽ
  ǤϤʤǽȤ٤åΥҥåȻ
  ˤutime()ƤΤǡǽ⹹ƤȤȽ
  ʤΤǡñst_atimeѤst_mtime򸫤褦ˤ



 double free()ޤ
򳫤˶餯顼ǹ˼ԡ
ľ˹ܥ򲡤malloc()Υ顼åǽmemory
corruptionȯ
302ǤƤʤ϶餯̾ʤä



 sigslotϢǲ褫
has_slots::~has_slots()
has_slots::disconnect_all()
ƤФ
_signal_base::slot_disconnect()

  list<_connection_base *>::iterator it = connected_slots.begin();
  list<_connection_base *>::iterator itEnd = connected_slots.end();
֥Ȥ˿äƤ뤯
_signal_base::~_signal_base()
Ǥdisconnect()˼ԤƤΤ
ƸʤˤĤơġġ


 񤭹ߥ顼
񤭹ߥ顼HTMLɽΥ󥯤ȥ󥯰٤



 ֤Ƥޤ״Ϣ˥Х
Ƥ쥹Τ륹δɾʤХ͡
ĤǤȸäƤϲWebǤΡ֤ƤޤפɽѤä͡



 񤭹߻˥åˤʤꡢassert˼ԤХ
餯ʸ󥳡ǥѴǼԤƤʡ



 beĤäưž̤ΣͤƱͤˤʤäƤä
⤦EUC-JPäϤʤ褦



 #warningΤޤȤ

libochusha/
	bbs_2ch_utils.cc:294
		žϢ
	bbs_2ch_utils.cc:466
		žϢ
	bbs_2ch_utils.cc:887
		cookieϢ(õ)

	bbs_jbbs_utils.cc:1097
	bbs_jbbs_utils.cc:1422
		guess_board(URI) - žϢ

	bbs_table.cc:534
		̯ǲ򤹤Ĥä

	bulletin_board.cc:293
		̤ΤΥURLФȿˤĤơ

	lock.cc:133
	lock.cc:168
	lock.cc:282
	lock.cc:341
		ХꥢϢ


ochusha/
	bbs_thread_ui.cc:431
		save_link_as_cb() - downloaderϢ
	bbs_thread_ui.cc:481
		write_response_to_this_response_cb() - semanticsɤ
		롩

	board_ui.cc:97
		new_thread_cb()

	html_style.cc:270
		system colorϢ

	preferences_ui.cc:1664
		spinܥϢ
	preferences_ui.cc:1686
		spinܥϢ



 TODO
- 桼ܡؼ顢¨¤ɽȿǤġġ
- ֤ܡפϣͤǻȤƤ롣BBS PINKǤϡ֤ա
()ȤޤBBSʤ̴()Τ褦˿ʥХꥨ
롣Ѥ٤
- LockΥååˡäȤȹͤƼ٤
㤨СƥåɤTLS˸ݻƤåΥݥ󥿤
ǵϿƤƱˡʣΥåݤ褦Ȥˡ
ХʾȤưŪ˵ϿƤΥå̷⤬
äƤʤɤǧȤ꤬¸Ǥκݡ¿
⤯դȤˤܤԤäƹʤ
åϢΥϥޥˤϺǶвäƤʤΤǡ̤ͥǤk



 URL
http://c-docomo.2ch.net/test/-/slotk/1160883173/i
ߤʤġ



 poll()ꥯȤٱ䤵Ƥߤɤġġ
ߤϡfdϿ®Ǽpoll()ƻоݤˤʤ뤬ethernet
åñ̤ȿƤޤȤˤʤꡢ̤Ȥsyscall٤⤯ʤ
᤮롣blocking⡼ɤѹΤϴݤä(blocking⡼ɤǤ
ɤʬɤäƤޤ)ΤǡŪ˴ֳ֤򳫤Ƥߤ¸Ϥ
Ƥߤͤꤽ

̤̯ġġߤΤȤ󥤥٥ȯ鼡pollΥ
ȴƻоݤˤޤǤΥ󥿡ХȤơ100msƤ롣
䥹ɤ߹ߤˤϤǤ礷ƥȥ쥹ϴʤ
եʤ礭ʤΤǡġUE˱ƶʤΤ1000msֳ֤
ޤäƤޤäƤɤ



blocking⡼ɼ¸λˡܥǥɤ߹ߤ̥åɤǹԤ褦
ȤŤʤäƤͳ˵󤲤
contentionʤäˤpollingåɤǽλ
ᤷ



 ûŪʲ
- TreeUIǤ(Drop TargetȤƤ)DnDݡȡ
ƱǥǤΰưϼ
ԡǤ꤬եˤʤäƤޤäƤΤϤ
콤٤ޤɤ
̥ǥ뤫DnDsemantics̯
֥åޡǤİ˥ɥåפ鲿٤
İǤ֥åޡ˥ɥåפĤ֥åޡ
Ūġġ

ͭȤƤϡ֥åޡեİ˥ɥåפ
餽Υե򥢥ƥ֥եɲáʳ̵롣
뤤ϡURLбĤ򤽤ɲá
ʤɡ
- TreeбTreeManagerμȤȤäơİδס
֥֥åޡδפ뤳ȡ
- ॢȤpreferencesѤ褦ˤ롣
- stderrpipedebug consoleϤdup()äƤϤäƼ꤬ʡ
ޤǤϥͥåȥ̵ǼƥȤǤ롣


- ΩƤμ
- ͥåȥ˴ؤơschemeؿǴĤǤ褦ˤ롣
NetworkAgentBrokersignalɲäNetworkAgentprepare_request
ȯԤľˡpre_prepare_request(agent)
post_prepare_request(agent)ʥʥ뤬ȯԤ롣
SchemeManagerˤΥϥɥŹǤΤǡϡŬ
SchemeؿƤ֤褦ˤ
ѤSchemeؿѰդΤޤɤʡ



 Ūʲ
- CookieϢ
- ͤ/PinkBBSб
- ͤHTMLѲμ
- ĥ꡼ɽѥ(16x16)ɲá
* 
* 
- ƥ֥ե(֥åޡեιåդɽ)μ
- ѥå֥ե(֥åޡեɽ)μ
- եμ

- 
- 񤭹
Ĥϥ֥åޡñѷǹԤϤ
ϡ󥯤Ƨ٤˥֥åޡϿΤƱĴҤǡâ
ϽФˡ˵ϿƤɤ
񤭹ƤdescriptionȤƵϿƤɤ



 ĹŪʲ
- İ(BBSTable/Folder/BulletinBoard)δط
BulletinBoardTreeElementȤʤäƤΤϡäѥޥ
ĤξѤBulletinBoard¾֤ƤURLʤǸ
褦ˤʤäƤнʬ
- 1ڥ
- ͤإåɥ饤ɽ1ڥǤʤȲɽƤ⤷
ʤΤ1ڥμ塣
- ߥ쥹ǥȥƥʤΰִطѹ
ߤϥɽڥƱƥʤäƤ뤬1ڥ󥵥ݡ
Ȥͤȡ˽Ф٤
ȥɽʿ֤ߥ쥹ǥϥɽ
ʬľ٤ȻפΤǡƻҴطϺΤޤޤɤ
ष1ڥ򥵥ݡȤˤϸߥɽƤڥ
ɽ֤ȤɽƤʬ˲⤫ɽȤ
ˤɤ
- ModNotebookäƤˤĤơ()
֤Υ륢ɽƤ֤ǡäͳʤΤ˥
ߤäȵͤޤäƤʤȤ롣



 TreeUIˤĤ
äѡModel/View/ControllerΤȤʤꤹƤƤ䡼ʴ


TreeUIˤTreeUIϢʬĤTreeModelTreeViewʬΥ
褦ʤ󤫡ޥͽ

TreeUITreeUIImplTreeViewΣĤʬ䡣
UIδʬΤߤTreeUI˻Ĥ

GtkTreeModelڤTreeμTreeUIImpl˰ư
ޤTreeUIƤ᥽åɤ⡢virtual᥽åɤTreeUIImpl
˰ư

TreeUISingletonˡ
BoardlistUIBookmarksUITreeUIImplΥ֥饹ˡ


 TreeUIƤvirtualؿ

 TreeViewذư
    virtual void column_set_pixbuf(GtkCellRendererPixbuf *renderer,
				   TreeElement *element);
    virtual void column_set_pixbuf_folder_tree(GtkCellRendererPixbuf *renderer,
					       TreeElement *element);
    virtual void column_set_name(GtkCellRendererText *renderer,
				 TreeElement *element);

    virtual GdkPixbuf *get_element_pixbuf(TreeElement *element);


 TreeUIImplذư
    virtual void reconstruct();
    virtual const char *get_popup_menu_root() = 0;
    virtual GtkWidget *get_menu_widget() = 0;
    virtual void open(TreeElement *element, bool in_tab, bool with_browser) = 0;
    virtual void bookmark(TreeElement *element) = 0;
    virtual const char *copy_url(TreeElement *element) = 0;


    // ץѥƥȯԤ"response"ʥΥϥɥ餫
    // ƤФ롣
    // ǥեȤȯԤresponse_idϰʲ̤ꡣ
    // GTK_RESPONSE_OK:			OKܥ󤬲줿
    // GTK_RESPONSE_CANCEL:		Cancelܥ󤬲줿
    // GTK_RESPONSE_DELETE_EVENT:	Ĥܥ󤬲줿
    virtual void process_response(GtkDialog *dialog, int response_id,
				  TreeElement *element) = 0;
    // subclassdialog->vboxľ˿äƥץѥƥν򤹤롣
    // true֤ä鴰falseξϥǥեȤ(̾)ɲ
    // 롣
    virtual bool construct_properties_contents(GtkDialog *dialog,
					       TreeElement *element) = 0;
    virtual void open_properties(const char *title, TreeElement *element);
    virtual void open_properties(TreeElement *element);

    virtual bool show_all() const = 0;

