2014å¹´ å°å ¥ãã¦ããã£ããã®ç
å æ¥ã"2014å¹´è²·ã£ã¦ããã£ããã®" ãªã©ã¨ããã¨ã³ããªæ¸ãã人éããããããã ãæ¥ã è¨é²ãã¢ã¦ããããããã¦ãã¦ããããã¿ãããªè©±ããã¦ãèªåã¯æãåºããªãããã¾ããããã¨æã£ããã ãã©ãããã§çµãããã¨ä½ãå§ã¾ããçµããã®ã§é å¼µã£ã¦æãåºãã¾ãããä¸å¿ãWEB ç³»ã¨ã³ã¸ãã¢ã®ãããªä»äºããã«ããã£ã¦å°å ¥ãã¦ããã£ããã®çã§ãã
空æ°ã®ãããªåå¨ã«ãªã£ããã®
å°å ¥ãã¦ãããã¾ãã®ããã«ä½¿ããããã®ãã¡ (ããã«å¿ãã¦ãã)ã
ã¢ããªã±ã¼ã·ã§ã³ãã¤ããè±èª (é»åæ¸ç±ç)
ã¢ããªã±ã¼ã·ã§ã³ã«é¢ããè±èªã«ã¤ãã¦æ¸ããã¦ãããã®ã§ãè±èªã£ã½ããã®ãæ¸ãã®ã«å½¹ç«ã¡ã¾ãããèªããããªãæ¸ããã¯ã©ã¹ãã¡ã½ãããªã©ã®ååãã¤ããã¨ãããè±èªã§ããã¨ãããã¦ãããªãã¸ããªã«ã³ãããããã¨ããããããã¨ãã«å©ç¨ããã¦ãã¾ããããã® PDF çã¨è¾æ¸ (Dictionary.app) ã¨ã常ã«éãã¦ããã¾ãããã¼ã«ã«ã«ãã¼ã¿ããã¨ãã£ã±ãéãããå¤ã§ã¡ãã£ã¨èª¿ã¹ããã¨ãã¨ãã«ãªãã©ã¤ã³ã§å©ç¨ã§ããã¨ä¾¿å©ã§ããããããã¢ãã±ã¼ã·ã§ã³ã§å©ç¨ãããè±èªãã¨ããã³ã³ããã¹ãã§ã¾ãæ¢ããã®ã§ãè±èªåãªãè ã¨ãã¦ã¯ãããããã§ãã
direnv
æå¤ã¨2014å¹´ã«å ¥ã£ã¦ããå°å ¥ãRails (Spring) ã§ãªã¹ã¹ã¡ããã¦ãã®ã§ä½¿ãå§ãããããªè¨æ¶ãç¹å®ã®ããã¸ã§ã¯ãã®ãã£ã¬ã¯ããªã«å ¥ã£ãã¨ãã«ãããã«ãã bin ã¨ãããã£ã¬ã¯ããªã«ãã¹éãç¨åº¦ã§ããå©ç¨ã§ãã¦ãªããããããã¸ã§ã¯ãã¯ãããã¨ãã«åå¨ãæãåºãã¾ãã
æ®éã«ä½¿ãããã«ãªã£ããã®
IntelliJ IDEA
åãããè¨èªã§ IDE ã¤ããã¨ã¯ãã©ãããã¨ããç®è«è¦ããå°å
¥ããã¾ãããä¸æ
£ããªã©ã¤ãã©ãªã使ãã¯ãããã¨ãã«ãã©ãããã¤ã³ã¿ãã§ã¼ã¹æã£ã¦ãã®ãã¨ããã©ãããå®ç¾©ããã¦ãã®ãè¦ã«ãã£ããã¨ãããããã¨ãã«ä¾¿å©ã§ããã¯ã©ã¹åã¨ã package å¤ããã¿ãããªå¤æ´ã®ã¨ãã«ãªãã¡ã¯ã¿ãªã³ã°ã¨ç§°ãã¦ä¸æ¬ååå¤æ´ã§ããã®ãä¸çªä¾¿å©ã§ã (ãã®ããã ãã«èµ·åãã価å¤ãã)ãæ
£ãã¦ãããæ®æ®µä½¿ãã®ã¨ãã£ã¿ã§æ¸ãã¦ãã¾ããã©ã天æã§ã¯ãªãã®ã§æ¬æ¥ãªãã°ãã®ã¾ã¾ãã¼ã«ã®æ¯æ´ãå¾ã¦æ¸ãã¹ãã ã¨æãã¾ããREPL ãããç°å¢ã ã¨ãæ°è¡ã®ã³ã¼ãã®åä½ã§è©¦ãã¦ãã£ã¼ãããã¯ãå¾ãããããããªããã㯠Rails ã¿ããã«ãã£ã¦ããããã¿ããã«ãªã£ã¦ã¨ãã£ã¿ã¨ã³ã³ã½ã¼ã«ã§æ¸ãã¦ããããªç¿æ
£ãæããªãã§ãã
ã¡ãªã¿ã« Rails ã£ã½ãåã®ããè¨èªå°å
¥ãã¦ãã®ã«ã¯ Skinny Framework ãè¯ãæ°ããã¾ãããªãã£ã·ã£ã«ã« Skinny framework's concept is Scala on Rails
ã§ããããã¢ãã«ã¾ããã®ã¤ããããã¡ã¯é©ããå°ãªãæãããã£ã¦ããã§ããéçåä»è¨èªãå¤ããããå¤ã«å¯¾ãã¦åãã¤ãã¦ãã¨ããããã«ãå°è±¡ãªã®ã§ãSkinny ORM (scalikejdbc) ã® TypeBinder ã¨ãã«ããã¦ãªããæãã¾ãã
æå¤ã¨ä½¿ããªãã£ããã®
æè¿åºã¦ãããã£ãããã¼ã«å種
Slack ã¨ãããã¡ãã¨ããã¸ã§ã¯ãã§å©ç¨ãã¯ããããã¾ãã¡ãã£ã¨éã£ããããããªããã©ã仲éå ã§ä½¿ãåã«ã¯ãã£ã± IRC ã ããã¿ãããªæãã§ç§»è¡ã«è³ããªãæãã§ããããã£ã³ãã«ã«ãã人éã®åããã IRC bot ããããããã°ãä¿åããã¦ä¸å¿æ¤ç´¢ã§ããä»çµã¿ã¨ã WEB ã¤ã³ã¿ãã§ã¼ã¹ãã API ããããªã© IRC ã¾ããã®ç°å¢ãããããçºéãã¦ããã¨ããèæ¯ããã£ãã®ã§ãå¨è¾ºã®ãã¼ã«ãã¡ã«å«æ°ããããªãéã㯠IRC 使ãç¶ããããªæ°ããã¾ãã
peco
æåã¯å¬ã ã¨ãã¦ä½¿ã£ã¦ããã©ä¸åº¦ä½¿ãç¿æ £ãªããªã£ããåå¨ãå¿ããããã«ããã¨ãã¨ä½¿ã£ã¦ã zaw ã使ããªããªã£ã¦ããã¡ããã¨ä½¿ã£ãã便å©ã ã¨æãã¾ããã·ã§ã«ã®ãã¹ããªçµãè¾¼ã¿ã§çãã¦ãããã¿ããã«ãªã£ã¦ãã¾ãã
ææ³
ä¿å®çã
ã¨ãã£ã¿ ãã dayone
ãããããã¨
- ã¨ãã£ã¿ã§æ¸ããããã¹ãã Day One ã«è¿½å ããã
åæ
- Mac
- ãã
- ããã¾ãããããããã¨ã¯ããããªã
ä»åã®å¯¾å¿
ã¨ãã£ã¿ã®ãã©ã°ã¤ã³ã¨ããã©ããã¼ã¹ã¯ãªããããããããããã©ãã¨ãã£ã¿ã®ãããã¡ã dayone
ã³ãã³ãã«ãããã®ã§ããã~ ã¨ãªãã¾ããã
:w !dayone new
(ã ã³ã£ããã ãã ãã¥ã¼ ã¨å ççºè©±ã§ãã)
æºå
- http://dayoneapp.com/tools/ ãã dayone-cli.pkg ããã¦ã³ãã¼ããã¦
dayone
ã³ãã³ãã使ããããã«ãã (dayone
ã³ãã³ãã¯ä½ç½®æ å ±ãªã©ãä»å ããªãç¹ã«ã¤ãã¦çæããå¿ è¦ãããã¾ã)
æ¯æ¥ã®ã¡ã¢ãä¸ç®æã«ã¾ã¨ãããã®ã§ãªã¹ã¹ã¡ããã¦ãã Day One ãã¤ããã¾ã
èæ¯
æ¯æ¥ã®ã¡ã¢ãã²ã¨ã¨ããã«ã¾ã¨ãããã
è¦ä»¶
- è¤æ°ã®ç«¯æ«ã§ã¡ã¢ãæ¸ãããã¨
- å
¥åå
容ãè¤æ°ã®ç«¯æ«ã§åç
§ã§ãããã¨
- éåæã§ãã¾ããªã
- åç·¨éã®å¯å¦ãåããªã
å¸æ
- ã³ã³ã½ã¼ã«ããã®å ¥åãå¯è½ã§ãããã¨
- ãªãã©ã¤ã³ã§ç·¨éå¯è½ã§ãããã¨
- 人éãèªããå½¢å¼ã§ä¿åããããã¨
- ã¨ã¯ã¹ãã¼ãå¦çãªã©ç¹å¥ãªå¦çãããªãã§ãã¼ã¿ã«ã¢ã¯ã»ã¹ã§ãããã¨
- ç¹æ®ãªãã¡ã¤ã«å½¢å¼ã§ãªããã¨(ããã¹ããã¡ã¤ã«ãå¸æ)
ãã®ä»
- ãéãæã£ã¦ããã
çµæ
ä»åæ¡ç¨ãããã®
- Day One
Day One
ãªã¹ã¹ã¡ããã¦ãããå®ç§ãªæãã§ã¯ãªããã©ãããæããªæ°ã¯ããã
æ°ã«å ¥ã£ã:
- ãããã㪠iPhone ã¢ããªããã
- CLI ããã (http://dayoneapp.com/tools/)
howm
ããã¹ãã¨ãã£ã¿ã«ãã©ã°ã¤ã³ããèªåç¨ wiki ã£ã½ãã¡ã¢æ©è½ã
æ°ã«å ¥ã£ã:
- ã¨ãã£ã¿ã¨ç¸æ§ããã
- ãã£ããæ©è½ãå å®ãã¦ãã
- ããã¹ããã©ã¼ããã
æ°ã«å ¥ããªã(ã¾ãã¯åé¡ç¹):
- ã¢ãã¤ã«ç«¯æ«ããã®å
¥åãå°é£
- ã¨ãã£ã¿ã®ãã©ã°ã¤ã³ã§å®ç¾ãã¦ãããã¨ãè£ç®ã«ã§ã¦ããæ°ããã
- ã¿ããããã¤ã¹ã«ã¨ãã£ã¿å°å ¥ã㦠howm ã¤ããã¨ãã¯ãã· (å¯è½ãã©ããã®è©±ã§ã¯ãªã)
ãã®ä»:
ãã¼ã¿ã®åæã«ã¤ãã¦ã¯ Dropbox ãªã©ã®ãµã¼ãã¹ãåå¨ãã¦ãããããããã¹ããã¼ã¿ãæ±ããªããã»ã©å°é£ã§ãªãã¨èãã(ãã¼ã¿ãæ±ãåä½ã«ãã£ã¦ã¯ãã¼ã¸ã®é£ããããã)ã
- http://wadap.hatenablog.com/entry/20081026/1225019930
- https://sites.google.com/site/fudist/Home/qfixhowm/file-share
howm ã¨ä¼¼ããããªä½ç½®ã«ãã£ã¦ããã£ã¨ã·ã³ãã«ãªæ¹å¼ã® ChangeLog ã¡ã¢ã¨ããé¸æè¢ãã¿ã¦ã¿ããããããã¢ãã¤ã«ç«¯æ«ã¨ã®ç¸æ§ããã¾ããããªã(MHODiA ã¨ããã¢ããªããã: https://itunes.apple.com/jp/app/id431691790)ã
Evernote ã¨ãã®ã¯ã©ã¤ã¢ã³ããã¡
ä» PostEver ã¨ãã iPhone ã¢ããªãã¤ãã£ã¦ãã(https://itunes.apple.com/jp/app/id422023962)ã1æ¥ã®å
¥åã1ã¤ã®ãã¼ãã«ã©ãã©ã追è¨ãã¦ãã(æ¥æ¯ã«1ã¤ã®ãã¼ãã«ãªã)ã
PostEver ã®ãã¼ãã« Mac ããã®å
¥åãããã®ãã§ãããªãããã§ããã£ã(ç¾ç¶ç°¡åã«ãããã«ã§ããªã)ã
æ°ã«å ¥ã£ã:
æ°ã«å ¥ããªã(ã¾ãã¯åé¡ç¹):
éæ
観ç¹ã¨ãã¦ã¯ä»¥ä¸ã«ã¤ãã¦éç¹ãç½®ãã¦ããããã«æããã:
- ãã¼ã¿ãã©ãã«ã©ããã£ã¦ç½®ãã
- è¤æ°ã®ç«¯æ«ã§åæå¯è½ãªç®æã«ãããã¨(ãã©ã¤ãã¼ãã§ããããã°æ段ã¯åããªã)
- ã©ã®ããã«è¦ããã
- æ¥æ¯ã«ã¾ã¨ã¾ã£ã¦ããã®ã好ã¾ãã
Evernote ã®1ã¢ã«ã¦ã³ãããã£ã¦ä¸ç®æã¨ã¿ãªããã¨ããéãªéç¨ã§ãããã£ããããããªãã¨ããè¿·ãããããè¦ãããã®åé¡ã ã£ãã®ãããããªãã
Dropbox ã«ã¤ãã¦
ãµã¼ããã¼ãã£ã®ã¯ã©ã¤ã¢ã³ããèªè¨¼ãã㨠$HOME/Dropbox/ã¢ããª
ã¿ãããªãã£ã¬ã¯ããªãä½ããã¦ã¤ããæ°æã¡ã«ãªããã è½ã¡çã㦠$HOME/Dropbox/Apps
ã«ãªãã¼ã ããã°ãããããDay One ã Dropbox ã§åæããã¦ãããã£ã¬ã¯ããªãããããªããªã£ã¦ãã¾ãã®ã§ãä¸æ¦çµäºããã¦ããèµ·åãã¦ããã£ã¬ã¯ããªãæãã¦ãããã°èªèããã
iPhone ã¢ããªã®ã»ãã¯ãã©ãããä»çµã¿ã«ãªã£ã¦ãããããããªãããã¨ããããä¸è¨æé ã®ã®ã¡ã¤ã³ã¹ãã¼ã«ãã¦åæè¨å®ãè¡ã£ãã
è¤æ°ç«¯æ«ã§åæããã¨ãããã¨ã«ã¤ãã¦
ãã¼ã¿ã®æ±ãã«ã¤ãã¦ãåææ´æ°ã®åé¡ããããã以ä¸ã®ãããªå¯¾å¿ã«ãªãã®ããªã¨æã:
- ãã¼ã¿ã®åä½ã«ã¤ãã¦ã
- 1端æ«ãã1ãã¡ã¤ã«(ãã¼ã¿)åä½ã§æ´æ°ãã
- 1æ´æ°ã§1ãã¡ã¤ã«(ãã¼ã¿)ã追å ãã
- ããã¯ã¯ãã¾ãç¾å®çã§ãªã
Day One ã§ã¯ã1æ´æ°ã§1ãã¡ã¤ã«ã追å ããç·¨éã®éã¯è¡çªããäºå®ã¯ã®ãããã®ã®åºæ¬å¾åã¡ã¨ããã«ã¼ã«ã£ã½ããåææ´æ°ããã¨ä»¥ä¸ã®ããã«ã³ã³ããªã¯ããããã¡ã¤ã«ãã¤ããããã
ls -1 ~/Dropbox/Apps/Day\ One/Journal.dayone/entries FF04BE2FE3304849B025ABAF87150748 (Watanabe Mayu's conflicted copy).doentry FF04BE2FE3304849B025ABAF87150748.doentry
ããã³ã³ããªã¯ãããå ´å㯠https://dayone.zendesk.com/hc/communities/public/questions/200028729--Conflicted-copy-on-Dropbox-sm- ã®ããã¡ã¤ã«æ¶ãã¦ä½ããªãããã¨ããã®ããªãã£ã·ã£ã«ãªåçã£ã½ãã
ãã¡ã¤ã«åã UUID (version 4) ã®ãã¤ãã³æãã«ãããã®ã§ãä¸èº«ã® XML(plist) ãé©åã§ããã°ã¯ã©ã¤ã¢ã³ããä½ã§ãã£ã¦ããããããªã®ã§ãå¥ãã¡ã¤ã«ã«ãã¦ããã¦ããããããããªãã
ããã¹ãã®ã¡ã¿ãã¼ã¿ã«ã¤ãã¦
ããã¹ããã¼ã¿ã§ã¡ã¢è¡çºããããã¨ããã¨ãã¡ã¢æ¬æã¨ã¯å¥ã«ç®¡çã®ããã®ã¡ã¿ãã¼ã¿ãã©ãã«æã¤ãåé¡ã常ã«ã¤ãã¾ã¨ãæ°ããã¦ãã¦ãä»èªåã®èªèã§ã¯ãæ¬æã«ã¡ããã¨ããã«æ±ºã¾ã£ããã©ã¼ãããã§å
¥ã£ã¦ããã»ãããã¤ããããããã¨ããæãã§ããChangeLog å½¢å¼ã¨ã XML ã§ã¡ã¿ãã¼ã¿æã¤ã®ãããããããã¦å¦çããããã¦ããããã
ã¡ã¿ãã¼ã¿ãã¡ã¤ã«ã¨ãã¤ã³ããã¯ã¹ãã¡ã¤ã«ãå¥ã«æã¤ã¨ããã®ã¯ãã£ãã·ã¥ç¨éã§ãªããã°ç«¯æ«éã®åæã¨ãã®é½åã§ããã©ããããã¨ããå°è±¡ã
ç·æ¬
ããããããã§ãã¡ã¢è¡çºã«ã¤ãã¦ããã°ãã Day One ã¤ãã£ã¦çæ´»ãã¦ã¿ã¾ãã
DbCharmer commit:b02576644d982f895365e796ba75b825f7104210 æç¹ã® README.rdoc ã®ãã£ããèªã¿ä¸ã
"DbCharmer" ã¯ãã·ã³ãã«ã§ãã¯ãã«ãª ActiveRecord ã®ãã©ã°ã¤ã³ã§ããActiveRecord ãè¤æ°ã®ãã¼ã¿ãã¼ã¹ãè¤æ°ã®ãã¼ã¿ãã¼ã¹ãµã¼ãã§åä½ã§ããããæ¡å¼µãã¾ãã
ãã®ã©ã¤ãã©ãªã ActiveRecord ã«è¿½å ãã主ãªæ©è½ã¯ä»¥ä¸ã®ã¨ãã:
- AR model ã®ã³ãã¯ã·ã§ã³ãã·ã³ãã«ã«ç®¡ç (switch_connection_to ã¡ã½ãã)
- AR model ããã¼ã¿ãã¼ã¹ãåå²ããã³ãã¯ã·ã§ã³ã«
- ã¯ã¨ãªãã©ãã«ããããããç°¡åã«é¸ã¹ãæ©è½ (
Model.on_*
ã¡ã½ãã群) - èªåã§ãã¹ã¿ã»ã¹ã¬ã¼ãã«ã¯ã¨ãªãããããã (åç §ã¯ã¹ã¬ã¼ãã«ãæ´æ°ã¯ãã¹ã¿ã§)
- è¤æ°ã®ãã¼ã¿ãã¼ã¹ã®ãã¤ã°ã¬ã¼ã·ã§ã³ããã¬ãã·ãã«ã«
- è¤æ°ã®ã·ã£ã¼ãã£ã³ã°æ¹æ³ã§ã·ã³ãã«ãªã·ã£ã¼ãã£ã³ã°æ©è½ãå©ç¨ã§ãã (value, range, mapping table)
詳細ã¯ã http://dbcharmer.net ãè¦ã¦ãã ããã
å°å ¥
DbCharmer ã®å°å ¥ã«ã¯2ã¤ã®ã¢ããã¼ããããã¾ã:
- gem ãã¤ãã (ãªã¹ã¹ã¡ãRails 3.2以éã§ã¯ãã®æ¹æ³ã§ãã使ãã¾ãã)
- Rails plugin ã¨ãã¦å ¥ãã (Rails 2.x ã§ã®ã¿ä½¿ãã¾ã)
gem ã¨ãã¦å°å ¥ãããªããGemfile ã«ä»¥ä¸ã追å ãã¦ãã ãã:
gem 'db-charmer', :require => 'db_charmer'
Rails ã®ãã©ã°ã¤ã³ã¨ãã¦å°å ¥ãããªã以ä¸ã®ã³ãã³ãã§:
./script/plugin install git://github.com/kovyrin/db-charmer.git
注æ: DbCharmer ã Rails ãããªãããã¸ã§ã¯ãã§ä½¿ããªããã³ãã¯ã·ã§ã³ã管çããã¡ã½ããã使ãåã«ãDbCharmer.env
ã«é©åãªå¤ãè¨å®ããå¿
è¦ãããã¾ããé©åãªå¤ã¯ãdatabase.yml
ã®ãããã¬ãã«ã®ã»ã¯ã·ã§ã³åã§ãã
ç°¡å㪠ActiveRecord ã®ã³ãã¯ã·ã§ã³ã®ç®¡ç
ãã®ãã©ã°ã¤ã³ã§è¿½å ãããæ©è½ã¨ã㦠switch_connection_to
ã¨ããã¡ã½ãããããã¾ãããããã¯ããããªç¨®é¡ã® DB ã³ãã¯ã·ã§ã³ã®æå®ãåãä»ããã¢ãã«ã§ãã®æå®ã使ãã¾ãã以ä¸ããµãã¼ããã¦ãã¾ã:
- æååã¨ã·ã³ãã«: database.yml ã«ããæ¥ç¶è¨å®ã®ãããã¯ãæå®
- ActiveRecord ã®ã¢ãã« (ã¢ãã«ã«å¯¾ãã¦ã³ãã¯ã·ã§ã³ãè¨å®ãã)
- ãã¼ããã¼ã¹ã®ã³ãã¯ã·ã§ã³ (
Model.connection
) - nil: ããã©ã«ãã®ã³ãã¯ã·ã§ã³ã«ãªã»ãããã
ãµã³ãã«ã³ã¼ã:
class Foo < ActiveRecord::Model; end Foo.switch_connection_to(:blah) Foo.switch_connection_to('foo') Foo.switch_connection_to(Bar) Foo.switch_connection_to(Baz.connection) Foo.switch_connection_to(nil)
ãµã³ãã«ã® database.yml
ã®è¨å®:
production: blah: adapter: mysql username: blah host: blah.local database: blah foo: adapter: mysql username: foo host: foo.local database: foo
switch_connection_to
ã¡ã½ããã¯ç¬¬äºå¼æ°ã«ãªãã·ã§ã³å¼æ°ã¨ã㦠should_exist = true
ãªå¼æ°ãã¨ãã¾ãããã®ãªãã·ã§ã³ã¯æååã¾ãã¯ã·ã³ãã«ãå¼æ°ã«ã¡ã½ãããå¼ã°ããã¨ãããã®ã³ãã¯ã·ã§ã³ã®è¨å®ã database.yml
ã«ãããã©ããè¦ã¾ãããã® should_exist ã true ãªãã°ãä¾å¤ããããããfalse ãªãã°ã¨ã©ã¼ã¯ç¡è¦ãããã³ãã¯ã·ã§ã³ã®å¤æ´ã¯èµ·ãã¾ããã
ããã¯ãdevelopment ã¢ã¼ãããã¹ãã®ã¨ãã«ãè¤æ°ã®ãã¼ã¿ãã¼ã¹ããã¼ã«ã«ã«ä½ããããªããã²ã¨ã¤ã®ãã¼ã¿ãã¼ã¹ã«å ¨é¨ãã¼ãã«ãä½ããããã¨ãããã¨ãã«ã¤ããã¾ãã
è¦å: å
¨ã¦ã®ã³ãã¯ã·ã§ã³ã®ã¹ã¤ããã®å¼ã³åºãã¯ãå¼ãã ã¯ã©ã¹ã ãã§ã³ãã¯ã·ã§ã³ãã¹ã¤ãããã¾ããswitch_connection_to
ã®å¼ã³åºãã¨ãã³ãã¯ã·ã§ã³ã®ã¹ã¤ãããç¶æ¿å
ã®ã¯ã©ã¹ã§ãã£ã¦ã¯ããã¾ãã (ãã¨ãã° ActiveRecord::Base ã¯ã©ã¹ã®ã³ãã¯ã·ã§ã³ãã¹ã¤ããããã¨ãå
¨ã¦ã®ã¢ãã«ãæ°ããã³ãã¯ã·ã§ã³ã«ãªã£ã¦ãã¾ãã¾ãããããããã¨ããããã¨ãã«ã¯ãæ®éã« establish_connection
ã使ãã¾ããã)ã
è¤æ°ãã¼ã¿ãã¼ã¹ã®ãã¤ã°ã¬ã¼ã·ã§ã³
è¤æ°ã®ãã¼ã¿ãã¼ã¹ã使ãã¢ããªã±ã¼ã·ã§ã³ã§ãã便å©ãªã¹ãã¼ããã¤ã°ã¬ã¼ã·ã§ã³ã®ä»çµã¿ãå¿
è¦ã§ãããã
Rails ã¦ã¼ã¶ã®ã¿ãªããã¯æ¢ã« Rails ã® migration ã¨ããä»çµã¿ãæã£ã¦ãã¾ããDbCharmer ã§ããRails ã® migration ã§å¯è½ãªãããã·ã¼ã ã¬ã¹ã«è¤æ°ãã¼ã¿ãã¼ã¹ãæ±ããããã«ãã¦ãã¾ãã
è¤æ°ã®ãã¼ã¿ãã¼ã¹ãæä½ããã®ã«ã以ä¸ã®2ã¤ã®æ¹æ³ã使ãã¾ã:
- ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«å ¨ä½ã§ã³ãã¯ã·ã§ã³ãå¤æ´ããæ¹æ³: ãã¤ã°ã¬ã¼ã·ã§ã³å ¨ä½ãæå®ã®ãã¼ã¿ãã¼ã¹ã«ã¹ã¤ãããã
- ãããã¯ã§ã³ãã¯ã·ã§ã³ãå¤æ´ããæ¹æ³: ãã¤ã°ã¬ã¼ã·ã§ã³ã®ä¸é¨ãæå®ã®ãã¼ã¿ãã¼ã¹ã«ã¹ã¤ãããã
ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ã®ä¾(å ¨ä½ã§ã³ãã¯ã·ã§ã³ãå¤æ´ããå ´å):
class MultiDbTest < ActiveRecord::Migration db_magic :connection => :second_db def self.up create_table :test_table, :force => true do |t| t.string :test_string t.timestamps end end def self.down drop_table :test_table end end
ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ã®ä¾(ãããã¯ã§ã³ãã¯ã·ã§ã³ãå¤æ´ããå ´å):
class MultiDbTest < ActiveRecord::Migration def self.up on_db :second_db do create_table :test_table, :force => true do |t| t.string :test_string t.timestamps end end end def self.down on_db :second_db { drop_table :test_table } end end
ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ã®ä¾(å
¨ä½ã§ã³ãã¯ã·ã§ã³ãå¤æ´ããåããã¼ãã«ã®æä½ãè¤æ°ã³ãã¯ã·ã§ã³ã«):
(注: :connection 㨠:connections ã¯ãã³ãã¯ã·ã§ã³ã®é
åãæå®ãããã¨ãã§ãã)
class MultiDbTest < ActiveRecord::Migration db_magic :connections => [:second_db, :default] def self.up create_table :test_table, :force => true do |t| t.string :test_string t.timestamps end end def self.down drop_table :test_table end end
ããã©ã«ãã®ãã¤ã°ã¬ã¼ã·ã§ã³ã®ã³ãã¯ã·ã§ã³ã«ã¤ãã¦
DbCharmer 1.6.10 以éã§ã¯ãActiveRecord::Migration.db_magic
ã®å¼ã³åºãã¨ããã¤ã°ã¬ã¼ã·ã§ã³ã§ã®ããã©ã«ãã®ã³ãã¯ã·ã§ã³ã®è¨å®(ç¹å®ã®ã³ãã¯ã·ã§ã³ã®å¤æ´ããªãéãããã使ããã)ãã§ããããã«ãªãã¾ããããã¤ã°ã¬ã¼ã·ã§ã³ã§ããã©ã«ãã® ActiveRecord ã®ã³ãã¯ã·ã§ã³ã使ãããå ´å㯠db_magic :connection => :default
ã使ã£ã¦ãã ããã
ä¸æ£ãªã³ãã¯ã·ã§ã³åã®æ±ãã«ã¤ãã¦
ã©ã®ç°å¢ã§ãããã©ã«ãã§ã¯ãon_db
㨠db_magic
ã®å®£è¨ã¯æå®ããã³ãã¯ã·ã§ã³ã database.yml ã«åå¨ããªãå ´å失æãã¾ããproduction ç°å¢ä»¥å¤ã§ã²ã¨ã¤ã®ãã¼ã¿ãã¼ã¹ã使ããªã©ãã¦ããã¨ãã«ããããªãã®ãç¡è¦ããããã¨ãã§ãã¾ã(ãã¹ãã³ã¼ãç¨ã®ãã¼ã¿ãã¼ã¹ã¨ãã§ã¨ãã«ä¾¿å©ã§ã)ã
ãã®æ¯ãèãã¯ãRails ã® initializers 㧠DbCharmer.connections_should_exist
ã®è¨å®ããããã¨ã§ã§å¶å¾¡ã§ãã¾ãã
è¦å: ãããã¹ãç°å¢ã§ãã¼ã¿ãã¼ã¹ã®ã³ãã¯ã·ã§ã³ãåãã¦ãã¹ã¿ã»ã¹ã¬ã¼ãã®ãµãã¼ããããããªããtransactional fixtures ã®ãµãã¼ãããªãã«ããå¿ è¦ãããã¾ããããããªãã¨ããã¼ã¿ã使ã£ããã¹ãã§ããããåé¡ã«ééãããã¨ã«ãªãã§ãããã
ã¢ãã«ããã¹ã¿ã»ã¹ã¬ã¼ãç°å¢ã§ä½¿ã
ãã¹ã¿ã»ã¹ã¬ã¼ãã¬ããªã±ã¼ã·ã§ã³ã¯ãä»æ¥ã®ä¸è¦æ¨¡ãã大è¦æ¨¡ãªãã¼ã¿ãã¼ã¹ã¢ããªã±ã¼ã·ã§ã³ã§ã®ããã£ã¨ãããã¥ã©ã¼ãªã¹ã±ã¼ã«ã¢ã¦ãææ³ã§ããããã¤ãã® Rails ãã©ã°ã¤ã³ããã¢ãã«ã§ã¹ã¬ã¼ããµã¼ãã使ããããã«ãã¦ãã¾ããããããã¯å¤§ããªã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ã£ãæãã§ã¯ãã¾ããã¬ãã·ãã«ã§ã¯ããã¾ããã
ActsAsReadonlyable ãã©ã°ã¤ã³ããã°ãã使ã£ã¦ãã¾ããããããããã®å¤æ´ãå ããªãã使ã£ã¦ãã¾ããããããããã®ãã©ã°ã¤ã³ãä½è ã«æ¾ç½®ãããã®ã§ãæã ã¯ãã¹ã¿ã»ã¹ã¬ã¼ãã®ããã®ã³ã¼ãããã©ã°ã¤ã³ã«ã¾ã¨ããªãªã¼ã¹ãããã¨ã«æ±ºãã¾ãã(Rails 2.2以éåã)ãDbCharmer ã¯ã以ä¸ã®æ©è½ã Rails ã®ã¢ãã«ã«è¿½å ãã¾ã:
å ¨ã¦ã®åç §ãã¹ã¬ã¼ã(ãã¡)ã«èªåã¹ã¤ãã
ã¢ãã«ãä½ã£ãããdb_magic :slave => :blah
ã db_magic :slaves => [ :foo, :bar ]
ã®ã³ãã³ããã¢ãã«ã§ä½¿ããã¨ãã§ãã¾ãããããããã¨ã§ãfind, count, exist ãªã©ã®åç
§ç³»ã®æä½ãã¹ã¬ã¼ã(ã¾ãã¯è¤æ°ã®ã¹ã¬ã¼ããªããããããã©ã¦ã³ãããã³)ã«åãæ¿ããã¢ã¼ãã«ãªãã¾ããä¾ã¯ä»¥ä¸ã®ã¨ãã:
class Foo < ActiveRecord::Base db_magic :slave => :slave01 end class Bar < ActiveRecord::Base db_magic :slaves => [ :slave01, :slave02 ] end
ããã©ã«ãã³ãã¯ã·ã§ã³åãæ¿ã
ãããä¸çµã®ãã¹ã¿ã»ã¹ã¬ã¼ã(ãããã¯åç´ã«ã²ã¨ã¤ããå¤ããã¼ã¿ãã¼ã¹)ãããç°å¢ãªãã°ãããã¤ãã®ã¢ãã«ã§ããã©ã«ãã®ã³ãã¯ã·ã§ã³ãå¤æ´ãããããããã¾ãããdb_magic :connection => :foo
ãã¢ãã«ã«æ¸ããã¨ã§ãããããã¨ãã§ãã¾ããä¾:
class Foo < ActiveRecord::Base db_magic :connection => :foo end
ãã¹ã¿ã»ã¹ã¬ã¼ãæ§æ (ã¤ã¾ãã¡ã¤ã³ã®ã³ãã¯ã·ã§ã³ + ã¹ã¬ã¼ãã®ã³ãã¯ã·ã§ã³) ã§åå²ããã¦ããã¢ãã«ã®ä¾:
class Bar < ActiveRecord::Base db_magic :connection => :bar, :slave => :bar_slave end
ã¯ã¨ãªãã¨ã®ã³ãã¯ã·ã§ã³ç®¡ç
ãã¹ã¿ã§ select ã®ã¯ã¨ãªãèµ°ããããã¨ããã±ã¼ã¹ãããã¨æãã¾ãããã¨ãã°ãã¡ããã©ãã¼ã¿ã追å ãã¦ããããèªã¿åºãå¿ è¦ããã£ã¦ãã§ããããã¹ã¬ã¼ãã«åæ ããããã©ããããããªããã¨ãããããªã¨ãã§ãããããããããªã¨ãã®ããã«ãè¨å®ããæ¹æ³ã ActiveRecord ã¢ãã«ã«è¿½å ãã¦ãã¾ã:
1) on_master
- ãã㯠block ã¹ã¿ã¤ã«ã¨ proxy ã¹ã¿ã¤ã«ã®2種é¡ã®æ¸ãæ¹ãããã¾ãã
block ã¹ã¿ã¤ã«ã§ã¯ãã³ã¼ããããã¯ã®ã³ãã¯ã·ã§ã³ãå¼·å¶çã«ã¹ã¤ããããããã¨ãã§ãã¾ã:
User.on_master do user = User.find_by_login('foo') user.update_attributes!(:activated => true) end
proxy ã¹ã¿ã¤ã«ã¯ãããã¯ã¨ãªããã¹ã¿ã«åãããã¨ãã§ãã¾ã:
Comment.on_master.last(:limit => 5) User.on_master.find_by_activation_code(code) User.on_master.exists?(:login => login, :password => password)
2) on_slave
- ããã¯ãã¹ã¿ãå¼·å¶çã«ä½¿ãããã«ãããã¨ãªã©ã«ãå¼·å¶çã«ã¹ã¬ã¼ãã«ä½¿ãããã«ãããã¡ã½ããã§ããã¹ã¬ã¼ããè¤æ°ããã°ãã©ã³ãã ã§ã²ã¨ã¤ãé¸ã°ãã¾ãããã®ã¡ã½ããã block 㨠proxy ã®ã¹ã¿ã¤ã«ãããã¾ãã
3) on_db(connection)
- ããã¯ååºã®2ã¤ã®ã¡ã½ãããå¯è½ã«ãããã®ã§ããããã¯ã¢ãã«ã®ã³ãã¯ã·ã§ã³ããã³ã¼ãã®ãããã¯ã1ã¤ã®æã§ããã DB ã«åãæ¿ããã®ã«ä½¿ãã¾ã(2ã¤ã®å½¢å¼ãããã¾ã)ããã㯠switch_connection_to
ã¨åãé¡ã®å¤ãåãä»ãã¾ããä¾:
Comment.on_db(:olap).count Post.on_db(:foo).find(:first)
development 㨠test ç°å¢ã®ããã©ã«ãã§ã¯ãåå¨ããªãã³ãã¯ã·ã§ã³ã on_db
ã®å¼ã³åºãã使ãã¨ãã¯ã¨ãªã¯ã²ã¨ã¤ã®ãã¼ã¿ãã¼ã¹ã«å
¨ã¦ã®ã¯ã¨ãªãéãã¾ããproduction ã® on_db
ã§ã¯ãåå¨ããªãååã¯åãä»ãã¾ããã
ãã®æ¯ãèãã¯ã DbCharmer.connections_should_exist
ã Rails ã®åæåã§è¨å®ãããã¨ã«ãã£ã¦å¶å¾¡ã§ãã¾ãã
å¼·å¶çãªã¹ã¬ã¼ãåç §
ããã¤ãã®å ´é¢ã§ãããã©ã«ãã§ãå
¨ã¦ã®åç
§ãã¹ã¬ã¼ãã«ãããã¢ã¼ãã使ãããã«ã¯é大ãããã¢ãã«ãããã¾ãããããããã¹ã¬ã¼ãã«ãããããã¢ã¼ãã«åãæ¿ãããã¨æããã¨ããã¾ã«ããã¾ãã
ãã¨ãã°ãUser
ã¢ãã«ãããã¨ãã¾ããã¦ã¼ã¶ã¯å¤ãã¢ã«ã¦ã³ãæ
å ±ãè¦ãããªãã®ã§ãã¹ã¬ã¼ãåç
§ã§ã®é
延ã¯é¿ãããã§ãããããããã±ã¼ã¹ã§ã¯(ãã¨ãã°ããã°ã¢ã¦ãç¶æ
ã§ã®ãããã£ã¼ã«ãã¼ã¸ã®è¡¨ç¤ºããªã©ãªã©)ãå
¨ã¦ã®åç
§ãã¹ã¬ã¼ãã«åããããåãæ¿ããã¨ããã®ã¯åççã§ãã
ãã®ã¦ã¼ã¹ã±ã¼ã¹ã®ããã«ãDbCharmer ã® 1.7.0 ãããå¼·å¶çã«ã¹ã¬ã¼ããåç §ããæ©è½ã追å ããã¾ãããããã¯ãããã¤ãã®å°ããªå¥ã ã®æ©è½ããæãã¾ãããçµã¿åããã«ãããã¯ãã«ãªãã®ã«ãªã£ã¦ãã¾ã:
1) ActiveRecord ã® db_magic
ã¡ã½ããã® :force_slave_reads => false
ãªãã·ã§ã³ã
ãã®ãªãã·ã§ã³ã¯ã¢ãã«ã§èªåã§ã¹ã¬ã¼ãåç
§ããã®ãç¡å¹ã«ãã¾ãããªã®ã§ãon_slave
ãããã¯ããã®ä»ã®ã¹ã¬ã¼ãåç
§ã§ããããã«ããã¡ã½ãããå¿
è¦ã«å¿ãã¦å¼ã¶å¿
è¦ãããã¾ããä¾:
class User < ActiveRecord::Base db_magic :slave => slave01, :force_slave_reads => false end
2) ActionController ã® force_slave_reads
ã¯ã©ã¹ã¡ã½ããã
ãã®ã¡ã½ããã¯ãã³ã³ããã¼ã©ãã¨(å¼æ°ãªãã§å¼ã°ããã¨ã)ããããã¯ãã¢ã¯ã·ã§ã³ã㨠(:only
㨠:except
ãã©ã¡ã¼ã¿ã渡ãã¦å¼ãã ã¨ã) ãå¼·å¶çã«ã¹ã¬ã¼ããåç
§ãã¾ãã
ããã¯ãã¹ã¬ã¼ãåç
§ã«ããã©ã°ããããã許容ã§ããã¢ã¯ã·ã§ã³ã§ãã¹ã¬ã¼ããè¨å®ããã¦ããã¢ãã«ã®åç
§å
ãã¹ã¬ã¼ãã«åããããã¨ãããããªã¨ãã«ä½¿ãã¾ããä¾:
class ProfilesController < Application force_slave_reads :except => [ :login, :logout ] ... end
3) ActionController ã® force_slave_reads! ã¨ããã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããããã®ã¡ã½ããã§ãã¢ã¯ã·ã§ã³å
ããããã¯ãã³ã³ããã¼ã©ã®ãã£ã«ã¿ã§ãä¸æçã«åç
§å
ãå¼·å¶çã«ã¹ã¬ã¼ãã«åãããããã¾ãã
ãã®ã¡ã½ããã¯åãã¢ã¯ã·ã§ã³ããã°ã¤ã³ãã¦ããã¦ã¼ã¶ã¨ãã°ã¤ã³ãã¦ããªãã¦ã¼ã¶ã«å¼ã°ããã¨ãã«ä½¿ãã¾ããbefore_filter
ã§ã¦ã¼ã¶èªè¨¼ãã¦ãèªè¨¼ãã¦ããªãã¦ã¼ã¶åãã«ã¯ force_slave_reads!
ã¡ã½ãããå¼ã³ã¾ãã
class ProfilesController < Application before_filter do force_slave_reads! unless current_user end ... end
注æ: ãã®ã¡ã½ããã使ãåã«ãDbCharmer ã® ActionController ãµãã¼ããæå¹ã«ããå¿
è¦ãããã¾ãã
DbCharmer.enable_controller_magic!
ããããã¸ã§ã¯ãã®åæåã³ã¼ãã§å¼ã¶å¿
è¦ãããã¾ãã
4) DbCharmer.force_slave_reads
ã¡ã½ããã¯ããããã¯å
ã®ã³ã¼ãã§å¼·å¶çã«ã¹ã¬ã¼ãåç
§ãããã®ã«ä½¿ããã¾ããããã¯ãã¨ã¦ãç´°ããç²åº¦ã§ã®ã¹ã¬ã¼ãåç
§ãå¼·å¶ããæ©è½ã§ããä¾:
DbCharmer.force_slave_reads do ... total_users = User.count ... end
注æ: ä»ã®ã¨ããããã®æ©è½ã¯ãã¼ã¿ã§ã使ãå ´åã¯æ³¨æãå¿ è¦ã§ãããã¹ããã¦ãããã®ã®ãç¾å®ä¸çã®ã¢ããªã±ã¼ã·ã§ã³ã§ã¯æ³å®å¤ã®åé¡ãèµ·ããå¯è½æ§ãããã¾ãã
é¢é£ã®ã³ãã¯ã·ã§ã³ã®ç®¡ç
ActiveRecord ã¢ãã«ã¯ããããäºãã«é¢é£ãæã£ã¦ãã¦ãããããããã¼ã¿ãã¼ã¹ã®ã³ãã¯ã·ã§ã³ãæã£ã¦ãããããUser.posts.count
ã®ãããªã¡ã½ãããã§ã¼ã³ãªããã§ãã³ãã¯ã·ã§ã³ã®ç®¡çãããã®ãå°ãé£ããã§ãã posts ã® count ãå¥ã®ãã¼ã¿ãã¼ã¹ã§ãããããªãã°ãããã²ã¨ã¤ã®ã¯ã©ã¹ã ãã³ãã¯ã·ã§ã³ãå¤æ´ãã¦ã以ä¸ã®æ§ã«ã¡ã½ãããå¼ã³ã¾ã:
Post.on_db(:olap) { User.posts.count }
ããã¯ãã¾ãè¯ãæ¸ãæ¹ã§ã¯ãªããããªã®ã§ãé¢é£ããã¾ãæ±ããããã« on_*
ã¡ã½ãã群ãæºåãã¾ããããããªãããã§ä½¿ãã¾ã:
@user.posts.on_db(:olap).count @user.posts.on_slave.find(:title => 'Hello, world!')
注æ: ActiveRecord ã®é¢é£ã¯ãçµæã®ãªãã¸ã§ã¯ããããã¯ã³ã¬ã¯ã·ã§ã³ã®ãããã·ã¨ãã¦å®è£ ããã¦ããããããã§ã¤ã³ããã¡ã½ãã以å¤ãã³ãã¯ã·ã§ã³ã®åãæ¿ãã使ãã¾ã:
@post.user.on_slave # post ã® author ãè¿ã @photo.owner.on_slave # photo ã® owner ãè¿ã
DbCharmer ã® 1.4 以éã§ã¯ãhas_many 㨠HABTM é¢é£ã®ã³ãã¯ã·ã§ã³åãæ¿ã㧠prefix è¨æ³ã使ãã¾ã:
@user.on_db(:foo).posts @user.on_slave.posts
named scope ã®ãµãã¼ã
DbCharmer ã¦ã¼ã¶ã® named scope ã§ã®ã³ãã¯ã·ã§ã³ã®åãæ¿ããç°¡åã«ãããããã¹ã³ã¼ãã§ã on_*
ã¡ã½ããããµãã¼ãããããã«ãã¾ããã
以ä¸ã®ã¹ã³ã¼ããã§ã¼ã³ã¯å
¨é¨ãã£ã¦ããã¨ã¯åãã§ã(ã¯ã¨ãªã¯ :foo ãã¼ã¿ãã¼ã¹ã³ãã¯ã·ã§ã³ã§å®è¡ããã¾ã):
Post.on_db(:foo).published.with_comments.spam_marked.count Post.published.on_db(:foo).with_comments.spam_marked.count Post.published.with_comments.on_db(:foo).spam_marked.count Post.published.with_comments.spam_marked.on_db(:foo).count
é¢é£ã®ãµãã¼ãããã¦ããã®ã§ã以ä¸ã®ããã«ã使ãã¾ã:
@user.on_db(:archive).posts.published.all @user.posts.on_db(:olap).published.count @user.posts.published.on_db(:foo).first
ä¸æ¬ããã³ãã¯ã·ã§ã³ã®ç®¡ç
ããããã®ãã¼ãã«ã使ã£ã¦ã³ã¼ããæ¸ããããããã¦ãããããå¥ã®ãã¼ã¿ãã¼ã¹ã使ãããã«ãããã¨ããã¨ããããã¾ãã
ãããªãµãã«ã§ãã¾ã:
DbCharmer.with_remapped_databases(:logs => :big_logs_slave) { ... }
ããã©ã«ãã :logs
ã®ã©ã®ã¢ãã« (ãã¨ãã° db_charmer :connection => :logs
ãªã©ã¨æ¸ãã¦ããã¢ãã«)ãããã®ãããã¯å
ã§ã¯ã³ãã¯ã·ã§ã³ã :big_logs_slave
ã«å¤ãã¾ãã
ããã¯ãä»ã®ã©ã® DbCharmer ã®ã¡ã½ããããåªå
度ãä½ãã§ãããªã®ã§ãModel.on_db(:foo).find(...)
ãªã©ã¯ãæå®ããããã¼ã¿ãã¼ã¹ã使ãã¤ã¥ããããã§ãªããã®ã¯ãªãããããã¾ãã
ä¸åº¦ã«ãããã¤ã§ããªãããã®æå®ãã§ãã¾ããã¾ããDbCharmer ã§ã³ãã¯ã·ã§ã³ãæå®ãã¦ããªãã©ã®ã¢ãã«ã«ããããããã¼ã¿ãã¼ã¹åã¨ã㦠:master
ã使ãã¾ãã
ãã¼ã: DbCharmer 㯠ã¢ãã«ã§ alias_method_chain
ã使ã£ã¦åãã¦ãã¾ãã注æãã¦ãå¿
è¦ãªç®æã«ã ãããããã¦ãã¾ãã
ããããwith_remapped_databases
ã¨ããã©ã«ãã®ãã¼ã¿ãã¼ã¹(:master
) ã®ãªãããã使ããããªã ActiveRecord::Base
ã®å
¨ã¦ã®ãµãã¯ã©ã¹ã«ãããããããããã¾ããã
ããã¯ã²ã©ãåé¡ãã大ããªããã©ã¼ãã³ã¹ã®å½±é¿ãããããªãã¯ãã§ã(ããã§ãã¦ã)ã
ã·ã³ãã«ãªã·ã£ã¼ãã£ã³ã°ã®ãµãã¼ã
DbCharmer ã® 1.6.0 ãããActiveRecord ã®æ¡å¼µã¨ãã¦ã·ã³ãã«ãªãã¼ã¿ãã¼ã¹ã·ã£ã¼ãã£ã³ã°ããµãã¼ããã¦ãã¾ãã
ãã®æ©è½ã¯æ¬çªç°å¢ã§ããã¹ãããã¦ããã¨ã¯ããããã®æ©è½ã®åºæ¬ãã¡ããã¨ç解ããã«ã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ãã®ã¯ãªã¹ã¹ã¡ãã¾ããã
ç¾æç¹ã§ã¯4ã¤ã®ã·ã£ã¼ãã£ã³ã°æ¹æ³ããµãã¼ããã¦ãã¾ã:
1) "range" - ã¨ã¦ãã·ã³ãã«ãªã·ã£ã¼ãã£ã³ã°æ¹æ³ã§ãäºåã«å®ç¾©ãããã©ã¤ããªãã¼ã®ç¯å²ã§ãã¼ãã«åå²ãè¡ãããã®å°ããåå²ãããã¼ãã«ãå¥ã®ãã¼ã¿ãã¼ã¹ããã¼ã¿ãã¼ã¹ãµã¼ãã«é
ç½®ãããã¨ãã§ãã¾ãã
ãããªã¨ã便å©: é常ã«å¤§ãããã¼ãã«ãã ãã ã大ãããªã£ã¦ãããããªã¨ãããã¼ãã«ãããã¤ãã®ãµã¼ãã«ã®ãããã¨ã§è¤éãªã·ã£ã¼ãã£ã³ã°ã®ä»çµã¿ãªãã§ã·ã³ãã«ããä¿ã¡ããã¨ãã
2) "hash_map" - ãã£ããã·ã³ãã«ãªã·ã£ã¼ãã£ã³ã°æ¹æ³ã§ãäºåã«å®ç¾©ãã¦ãããããã¤ãã®ãã¼ã§ãã¼ãã«åå²ãè¡ãã¾ã(ãã©ã¤ããªãã¼ã§ãªãã¦ãã)ã
ãã¨ãã°ãã©ã®å·ãã©ã®ãã¼ã¿ãã¼ã¹(ãããã¯ãã¼ã¿ãã¼ã¹ãµã¼ã)ã«ä¿åãããå®ç¾©ãã¦ããã¦ã¢ã¡ãªã«ã®ä½æã®ãªã¹ããå·ãã¨ã«ã·ã£ã¼ãã£ã³ã°ããã¨ãã§ãã¾ãã
3) "db_block_map" - ããã¯ã¨ã¦ãè¤éãªã·ã£ã¼ãã£ã³ã°æ¹æ³ã§ããã¼ãã«ãå°ããªãããã¯ã®ã»ããã«åãã¦ãããã«ãã·ã£ã¼ãã£ã³ã°ãããã¼ã¿ãã¼ã¹ãªããã¼ã¿ãã¼ã¹ãµã¼ããªãã«ãããå²ãå½ã¦ã¾ãã
ãããã¯ã追å ãããã¨ãã¯ãã¤ã§ãããããã¯ã¯èªåãã¤ã·ã£ã¼ãã£ã³ã°éã§ãã©ã³ã¹ãã¨ã£ã¦ãã¼ã¿ãã¼ã¹ã«å²ãå½ã¦ããã¾ãã
ãã®æ¹æ³ã¯ã1000ä¸ãã10åã¬ã³ã¼ãã®å·¨å¤§ãªãã¼ãã«ãã¹ã±ã¼ã«ããã®ã«ä½¿ããæ¯è¼çç°¡åã«ã·ã£ã¼ãã£ã³ã°ããªãããä¸çªããæ¹æ³ã§ãã
4) "db_block_group_map" - ãã㯠"db_block_map" ã¨ããä¼¼ãæ¹æ³ã§ãä¸ç¹ã ããç°ãªãã¾ããããã¯ããã®æ¹æ³ã¯
ãã¼ã¿ãã¼ã¹ã®ã»ãã(ãã¼ãã«ã®ã°ã«ã¼ã)ãåãµã¼ãã«æã¦ã¦ãåã°ã«ã¼ããã·ã£ã¼ãã£ã³ã°ã¨ãã¦æ±ãããã¨ããã§ãã
ãã®ã¢ããã¼ãã¯ã¢ããªã±ã¼ã·ã§ã³ãã¹ã±ã¼ã«ããã¾ãã«äºåã«ã·ã£ã¼ãã£ã³ã°ãã¦ããã®ã«ä½¿ãã¾ãã
ã²ã¨ã¤ã®ãµã¼ãããç°¡åã«ã¯ããããã¾ãã10, 20, 50 ã«åå²ãããã¼ã¿ãã¼ã¹ãæã£ã¦ãããã²ã¨ã¤ã®ãã·ã³ã§å¯¾å¿ã§ããªããªã£ããããããã®ãã¼ã¿ãã¼ã¹ãå¥ã®ãµã¼ãã«ç§»ãã¾ãã
ã©ããã£ã¦ã·ã£ã¼ãã£ã³ã°ããããããï¼
ã·ã£ã¼ãã£ã³ã°ã®æ¡å¼µãæå¹ã«ããã«ã¯ããããæºåãå¿ è¦ã§ã:
1) ã·ã£ã¼ãã£ã³ã°ã®ã³ãã¯ã·ã§ã³ãå®ç¾©ãã Rails ã®ã¤ãã·ã£ã©ã¤ã¶ãä½ã (ã¹ã¯ãªãããã¢ããªã±ã¼ã·ã§ã³ã®åæåã®ã¨ãã®ã³ã¼ã)ãããããã®ã³ãã¯ã·ã§ã³ã«ååã¨ãã·ã£ã¼ãã£ã³ã°æ¹æ³ã¨ãåæåã®ããã®ãã®ãªãã·ã§ã³ãæå®ãã¾ãã
2) ã·ã£ã¼ãã£ã³ã°ã使ãããã¢ãã«ã«ã·ã£ã¼ãã£ã³ã°ã®ã³ãã¯ã·ã§ã³ãæ示ãã
3) ã·ã£ã¼ãã£ã³ã°ãããã¢ãã«ãæä½ããåã«ã·ã£ã¼ãã£ã³ã°ãæ示ãã
ãã詳細ã¯ã以ä¸ã®ããã¥ã¡ã³ããã覧ãã ããã
ã·ã£ã¼ãã£ã³ã°(åå²)ã³ãã¯ã·ã§ã³
ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ã¯ã·ã³ãã«ãªæ½è±¡åã§ãã¯ã©ã¹ã¿ã®ããã®ã·ã£ã¼ãã£ã³ã°ãã©ã¡ã¼ã¿ãä¸ç®æã§æå®ãããã®ã²ã¨ã¨ããã§è¨å®ãããã®ãã¢ãã«ã§ä½¿ããããã«ãããã¨ãã§ãã¾ãã
ããã¤ãã®ã·ã£ã¼ãã£ã³ã°ã®ã³ãã¯ã·ã§ã³ã®åæåã®ä¾ã¯ä»¥ä¸ã®ã¨ããã§ã:
1) range ãã¼ã¹ã®ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ã®ä¾:
TEXTS_SHARDING_RANGES = { 0...100 => :shard1, 100..200 => :shard2, :default => :shard3 } DbCharmer::Sharding.register_connection( :name => :texts, :method => :range, :ranges => TEXTS_SHARDING_RANGES )
2) ããã·ã¥ãããã®ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ã®ä¾:
SHARDING_MAP = { 'US' => :us_users, 'CA' => :ca_users, :default => :other_users } DbCharmer::Sharding.register_connection( :name => :users, :method => :hash_map, :map => SHARDING_MAP )
3) ãã¼ã¿ãã¼ã¹ãããã¯ãããã®ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ã®ä¾:
DbCharmer::Sharding.register_connection( :name => :social, :method => :db_block_map, :block_size => 10000, # ãããã¯ãã¨ã®ãã¼ã®æ° :map_table => :event_shards_map, # ã·ã£ã¼ãã£ã³ã°ãããã¯ãããããããã¼ãã« :shards_table => :event_shards_info, # ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³æ å ±ã®ãã¼ãã« :connection => :social_shard_info # ãããã§ã©ã®ã³ãã¯ã·ã§ã³ã使ãã )
ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ã®å®ç¾©ãããããã¢ãã«ã§ããã使ããããã«ãªãã¾ã:
class Text < ActiveRecord::Base db_magic :sharded => { :key => :id, :sharded_connection => :texts } end class Event < ActiveRecord::Base set_table_name :timeline_events db_magic :sharded => { :key => :to_uid, :sharded_connection => :social } end
ã·ã£ã¼ãã£ã³ã°ããã¢ãã«ã§ã®ã³ãã¯ã·ã§ã³ã®åãæ¿ãã«ã¤ãã¦
ã·ã£ã¼ãã£ã³ã°ããã¢ãã«ãæä½ããã¨ããå¿
è¦ãããã°ãã¤ã§ããã©ã®åå²å
ã使ããæå®ãããã¨ãã§ãã¾ãã
ã·ã£ã¼ãã£ã³ã°ãã¦ããªãç°å¢ã§ã® DbCharmer ã®ã¤ããããã¨ä¼¼ãæ¹æ³ã§ãã¯ã¨ãªãã¨ã«æ¥ç¶ã管çã§ããã¡ã½ãããç¨æãã¦ãã¾ã:
Event.shard_for(10).find(:conditions => { :to_uid => 123 }, :limit => 5) Text.shard_for(123).find_by_id(123)
ãã®ä»ã«ãrange 㨠hash_map ã®ã·ã£ã¼ãã£ã³ã°ã®æ¹æ³ã§ãããã©ã«ãã®åå²å ã«åãæ¿ãããã¨ãã§ããã¡ã½ãããããã¾ã:
Text.on_default_shard.create(:body => 'hello', :user_id => 123)
ããã¦æå¾ã«ãã·ã¹ãã å ã®åã·ã£ã¼ãã£ã³ã°ã§ãã³ã¼ããå®è¡ããã¡ã½ãããããã¾ã(ç¾å¨ã®ã¨ãããdb_block_map 㨠db_block_group_map ã§ã®ã¿ãµãã¼ãããã¦ãã¾ã):
Event.on_each_shard { |event| event.delete_all }
èªåã®ã·ã£ã¼ãã£ã³ã°æ¹æ³ã®å®ç¾©
DbCharmer ã¯ãã¦ã¼ã¶å®ç¾©ã®ã·ã£ã¼ãã£ã³ã°æ¹æ³ãå¯è½ã§ããèªåã®ã·ã£ã¼ãã£ã³ã°æ¡ãå®è£ ããã«ã¯ãããã¤ããããã¨ãããã¾ã:
1) DbCharmer::Sharding::Method::YourOwnName
ã¨ããååãã¤ãã¦ã¯ã©ã¹ãã¤ãã
2) æä½ã§ããã³ã³ã¹ãã©ã¯ã¿ initialize(config)
ã¨ãå¤å¥ããããã®ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã shard_for_key(key)
ããã㯠database.yml
ãã¡ã¤ã«ããrails connection ã¢ããã¿ã®ã³ãã¯ã·ã§ã³ãã©ã¡ã¼ã¿ã®ããã·ã¥ããã³ãã¯ã·ã§ã³åãè¿ããããªã¡ã½ããã«ãªãã§ãããã
3) 以ä¸ã®ããã«ãã¦ãããªãã®ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ãç»é²ãã¾ã:
DbCharmer::Sharding.register_connection( :name => :some_name, :method => :your_own_name, # ããªãã®å®ç¾©ããã·ã£ã¼ãã£ã³ã°æ¹æ³ãå°æåã«ããã·ã³ãã«ã§æ¸¡ãã¾ã ... ã»ãã«ãã©ã¡ã¼ã¿ãå¿ è¦ãªãããã ... )
4) ä»ã®æ¨æºã®ã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ã¨åæ§ã«ãããªãã®å®ç¾©ããã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³ã使ãã¾ã
èªåã§å®ç¾©ããã·ã£ã¼ãã£ã³ã°ã§ãããã©ã«ãã®åå²å ããµãã¼ãããæ¹æ³
ãããon_default_shard
ã¡ã½ãããèªåã®å®ç¾©ããã·ã£ã¼ãã£ã³ã°ã¢ãã«ã§ä½¿ããããªãã2ã¤ãããã¨ãããã¾ã:
1) support_default_shard?
ã¨ããã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãããã·ã£ã¼ãã£ã³ã°ã¯ã©ã¹ã«å®è£
ãã¾ããããã¯ãããã©ã«ãåå²å
ã®æå®ããµãã¼ããããªã true ããããã§ãªããªã false ãè¿ãã¾ãã
2) shard_for_key
ã¡ã½ããã§ã:default
ã®ã·ã³ãã«ããã¼ã¨ãã¦ãµãã¼ãããããå®è£
ãã¾ãã
èªåã§å®ç¾©ããã·ã£ã¼ãã£ã³ã°æ¹æ³ã§ãã·ã£ã¼ãã£ã³ã°åæããµãã¼ãããã«ã¯
ã·ã£ã¼ãã£ã³ã°åæãèªåã§å®ç¾©ããã·ã£ã¼ãã£ã³ã°ã®ã¢ãã«ã§ãµãã¼ãããã«ã¯ãshard_connections
ã¨ããã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããã追å ããå¿
è¦ãããã¾ãããã®ã¡ã½ããã¯ãã·ã£ã¼ãã£ã³ã°ã³ãã¯ã·ã§ã³åããã³ãã¯ã·ã§ã³ã®æ¥ç¶ã§ä½¿ãããè¨å®ã®é
åãè¿ãå¿
è¦ãããã¾ãã
ããã¥ã¡ã³ãã¨è³ªåã«ã¤ãã¦
ãã®ã©ã¤ãã©ãªã«ã¤ãã¦ã®ããããããæ å ±ã«ã¤ãã¦ã¯ãããããã®ãµã¤ã http://dbcharmer.net ãåç §ãã¦ãã ãããDbCharmer ã®å é¨ã®è©³ç´°ã«ã¤ãã¦ç¥ãããã¨ãã¯ãã½ã¼ã¹ã³ã¼ãããã§ãã¯ã¢ã¦ããã¦ãã ããããã©ã°ã¤ã³ã®ã³ã¼ãã¯ãã ããã100%ã®ã«ãã¬ãã¸ãããã¾ããtest-project ãã£ã¬ã¯ããªã«å ¨ã¦ã®ã¦ããããã¹ãã¨ãå®éã«ä½¿ãã¨ãã®ãã¹ããå ¥ã£ã¦ãã¾ãã
ãã®ããã¸ã§ã¯ãã«ã¤ãã¦ä½ã質åãããã¨ãã¯ãä½è ã使ã£ã¦ãã DbCharmer ã¦ã¼ã¶ã¼ãºã°ã«ã¼ãã®ã¡ã¼ãªã³ã°ãªã¹ãã«ã³ã³ã¿ã¯ããããã¨ãã§ãã¾ã:
- ã°ã«ã¼ãæ å ±: http://groups.google.com/group/db-charmer
- ãã®ãã¼ã¸ãè³¼èªãããã[email protected] ã¾ã§ã¡ã¼ã«ãã¦ãã ãã
åä½ãã Ruby 㨠Rails ã«ã¤ãã¦
ãã® gem ã©ã¤ãã©ãªã¯ãããã¤ãã® Ruby ã®ãã¼ã¸ã§ã³ã¨ãRails 2.3, 3.0, 3.1, 3.2 㧠CI ãã¦ãã¾ãã
CI 㯠TravisCI.org (https://travis-ci.org/kovyrin/db-charmer) ã§ã¾ããã¦ãã¾ãã
ãã«ãã¹ãã¼ã¿ã¹ã¯ https://travis-ci.org/kovyrin/db-charmer ãè¦ã¦ãã ãã(åæã§ã¯ç¾å¨ã®ã¹ãã¼ã¿ã¹ã«ã¤ãã¦ã®ããã¸ã¿ãããªç»åã表示ããã¦ãã¾ã)
ä»ã以ä¸ã®çµã¿åããã§ãã«ããã¦ãã¾ã:
ãããã¦ããã® gem 㯠Scribd.com ã®æ¬çªã§ã使ããã¦ãã¾ã (ä¸çã§æã大è¦æ¨¡ãª Rails ã§ä½ããããµã¤ãã®ã²ã¨ã¤ã§ã)ã REE + Rails 2.2, 2.3 ããã㯠Sinatra 㨠Rack ã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ããã¦ãã¾ãã
1.8.0 ããã3.2.8 ã«å¯¾å¿ãã¾ãããã3.2.4 ã¯ãªãã£ã·ã£ã«ã«ãµãã¼ããã¦ãªãã®ã§æ³¨æãã¦ãã ããããã¶ãåãã¨æãã¾ããã対å¿ãã¦ããªããã¼ã¸ã§ã³ã«ã¤ãã¦ãã°ã¬ãã¼ãã¯ããã¤ãã¾ããã
ä½è ã«ã¤ãã¦
ãã®ãã©ã°ã¤ã³ã¯ Scribd.com 社å ã§ä½¿ãããã«ä½ãããããã«ãã以å¤ã®ã¿ãªããã«ä½¿ã£ã¦ãããããã«å ¬éããã¾ãããã³ã¼ãã®ã»ã¨ãã©ã¯ Oleksiy Kovyrin ã«ãã£ã¦æ¸ãããMIT ã©ã¤ã»ã³ã¹ã§å ¬éããã¦ãã¾ãã詳細ã«ã¤ãã¦ã¯ LICENSE ãã¡ã¤ã«ãåç §ãã¦ãã ããã
ãã®ä»ã®ã³ã³ããªãã¥ã¼ã¿ã¯ä»¥ä¸ã®ã¨ããã§ã(ã¢ã«ãã¡ãããé ):
- Allen Madsen
- Andrew Geweke
- Ashley Martens
- Cauê Guerra
- David Dai
- Dmytro Shteflyuk
- Eric Lindvall
- Eugene Pimenov
- Jonathan Viney
- Gregory Man
- Michael Birk
- Tyler McMullen
ä»è¨
- åæ㯠https://github.com/kovyrin/db-charmer/blob/73b72bf1aeb9e7f04bf982830050de861e4f291c/README.rdoc ã§ã
- ç´è¨³ã§ããã«ãããµãªãã£ã¦ãããã解éã誤ã£ã¦ããç®æãããããããã¨æãã¾ã(ææãã¦ããã親åãªããããããããããã§ã)
- Sharding ã¾ãããã¨ãã«ãããã
- ææ¥ã¯ Octopus ã® README èªãäºå®
Rails ã®ãã³ãããªã¹ãã®ãªã¹ã¹ã¡ãæãã¦ãã ãã
èæ¯
ãã³ãããªã¹ãã¨ããã®ãç¨æãã¦ã¿ãã¨ãããã»ã³ã¹ããªããããã¯èªåã§ãããã®ã§ãªãã¦ã©ã¤ãã©ãªã§ãã£ãã»ããããã¨æãã¾ããã
è¦ä»¶
ã¤ããããããè¦ãç®ããã¾ãããµããªããããã¤ãã¤ããããã¾ãããµããªããã¨ãããã®ãããã§ãã
èªåãè¦ä»ãããããã®
ruby-toolbox.com ã§ããã£ã¨è¦ã¦ã¿ãã¨ããã以ä¸ã®5ã¤ãããããããªãã¨æãã¾ããã
- Breadcrumbs On Rails
- Crummy
- Breadcrumble
- Loaf
- Gretel
Breadcrumbs On Rails
å®çªã®ããã§ãä¸çªäººæ°ã£ã½ããã³ã³ããã¼ã©ã§ãªã³ã¯åã¨ãã¹ãé åã«è©°ãã¦ããããã¥ã¼ã§ããã表示ããã¿ã¤ã
- ActionController::Base#add_breadcrumb ã«ãªã³ã¯åã¨ãã¹ã渡ããªã¹ããä½ããååã®ã¯ã©ã¹ã¡ã½ããããããbefore_filter ã使ããã¯ãçã«å®ç¾©ããæ©è½ãæä¾ãã
- 表示ã®ããã®ãã«ããå®ç¾©ãã¦ããããã³ãããªã¹ãã®ã»ãã¬ã¼ã¿(» ãããã©ã«ã)ããspan ãã li ãªã©ã®ã¿ã°æå®ãã§ããããã
- 幾種é¡ãã®ãªã³ã¯åããã¹ã®æå®ãå¯è½ã§ãããã·ã³ãã«ã Proc ãªãã¸ã§ã¯ãããããã°ã³ã³ããã¼ã©ã®ã¤ã³ã¹ã¿ã³ã¹ã®ã³ã³ããã¹ãã§è©ä¾¡ããã
Crummy
Breadcrumbs On Rails ã¨ã¢ããã¼ãã¯åãã§ä½ããã ãããåãããã¯ãçã« before_filter ã宣è¨ããã¯ã©ã¹ã¡ã½ããã®ã¤ãããã¡ãã£ã¨éãã
- ActionController::Base#add_crumb ã«ãªã³ã¯åã¨ãã¹ã渡ããªã¹ããã¤ãããActionController::Base.add_crumb ãã¤ã³ã¹ã¿ã³ã¹ã®ã³ã³ããã¹ããæã«ãããã®ããããã¸ããããªå°è±¡
- 表示ã®ããã®ãã«ãã¯ã表示ç¨ã®ã¯ã©ã¹(Crummy::StandardRenderer ã¨ããã¬ã³ãã©)ã«å¦çãããæ¹å¼ã§ãwill_paginate ã£ã½ã
Breadcrumble
ã·ã³ãã«ãª Breadcrumbs On Railsãæ¥æ¬ã®æ¹ãä½ã£ã¦ãæ§åã
- ActionController::Base#add_breadcrumb ã§(以ä¸ç¥)ããã¯ãçã¯ã©ã¹ã¡ã½ãããã·ã³ãã«ããããããããªããcollection 㪠URL ã® named_path ã®æå®ã¯ã§ãããæ°ããã
- 表示ã®ããã®ãã«ãã¯ã表示ç¨ã®ãã¼ã·ã£ã«ã使ãæ¹å¼ã§ãkaminari ã£ã½ããä»ã¯ã§ããªãããkaminari ã¿ããã« theme ãªãã·ã§ã³ãåãä»ãããã§ããã
Loaf
ãªã³ã¯ããã¹ãé¨åã I18n ã«å¯¾å¿ãã Breadcrumbs On Rails ã¨ããæã(ãã以ä¸ã®å°è±¡ããªã)ã
Gretel
config/initializers 以ä¸ã« Ruby ã®ãã¡ã¤ã«ãç½®ãè¨å®ãã¡ã¤ã«æ¹å¼ã
- config/initializers/breadcrumbs.rb ã«ããã³ãããªã¹ãã®ããã¹ãã¨ãªã³ã¯ãååãã¤ãã¦è¨å®ãã¦ãããè¨å®ã¯ parent ã®è¨å®ãæå®ãããã¨ãå¯è½ã§ãããã§é層ã表ç¾ããã
- 表示ã®ããã®ãã«ãã«ãè¨å®ãã¡ã¤ã«ã§ã¤ããååã§è¨å®ãå¼ã¶(
<% breadcrumb :issue, @issue %>
ã®ããã«ãè¨å®ã§ã¯è¡¨ç¤ºãããªã³ã¯ã®ãªã½ã¼ã¹ãæå®ãããã¨ãå¯è½) - æ¨æºã§ã¯ãã«ãã content_tag ãªã©ã®ã¡ã½ãã㧠HTML ãçæãããããªã¹ãã«ã¢ã¯ã»ã¹ããã¡ã½ãããããã®ã§ããªãã·ã§ã³æå®ã§ã©ãã«ããªããªãã¨ã㯠ERB ãªã©ã§è¡¨ç¤ºã®å¤æ´ãå¯è½
çµè«
Gretel ãä¸çªããããªã¨ããæ°ãããããã³ãããªã¹ãã®è¡¨ç¤ºã¨ããããã¾ãã¡ã¤ã³ã®å¦çã¨é¢ä¿ãªã(é¢ä¿ãªããã¨ã¯ãªãã)å¦çã®ãã¨ãèããªãã¦ããã®ã¯ãããããã
ãªãã¨ãªãäºæ³ãã¦ããã©ãGretel ã§ã¯ãã㨠view ã§è¡¨ç¤ºãå¶å¾¡ããå½¢ã«ãªãã®ã§(ã©ãããã¹ãããã¯å¤æãããã)åã view ãã¤ããã¾ãããããªç»é¢ãå¤ãã¨ãã¤ããã¥ãããããããªã(helper ã§ã©ããããã°ããããã§ã¯ãã)ãã¾ããã³ã³ããã¼ã©ã§ãã³ãããªã¹ãã«ã¤ãã¦ãã¾ãæèããªãã¦æ¸ãã¨ã¯ãããå ¨ãæèããªãã¦ããããã§ã¯ãªããã¨ã¯ããã³ã³ããã¼ã©ã® before_filter ã§ãªããããããã¤ãã¦ãã®ãã©ããªãã ããã¨ãã¤ãæãã®ã§ Gretel ã§ãã°ããçãã¦ããã¾ãã
Gretel ã§ä¸é½åãããã° Breadcrumbs On Rails ã Breadcrumble ã使ããã¨ãããã
ä½ããªã¹ã¹ã¡ããã£ãã誰ããããã¦ãã ããã
Evernote ãã³ã³ã½ã¼ã«ããæ±ããã
èæ¯
Evernote ãããã便å©ãªæ°ããã¦ããã®ã§æ´»ç¨ãããã¨æãã¾ããã
è¦ä»¶
çµè«
Ruby ã§æ¸ããã¦ãã evernote-editor ã¨ããã®ãè¯ãããã ã£ãã
è¯ãããã¨æã£ããã© Evernote ããã¨ã£ã¦ãã¦ã¨ãã£ã¿ã§èªã¿è¾¼ãã ã¨ãã«ãã¼ã¿æ§é ãã¡ãã㨠markdown ã«ã§ãã¦ãªãæ°ãããâ¦(ãã¨ã§ç¢ºèªãã)ã â æåãã markdown ã§ä½ã£ããã¼ããªã大ä¸å¤«ããã ããããã§ãªããã¼ãã ã¨ãã¼ã¿ããããã(ä¿åããªãã¦ã markdown ã«ãã¼ã¹ãã¦ãããä¿åãããã¨ãããã)ã
evernote-editor ã®ä½¿ããã
Rubygems ã«ããã®ã§ãgem ã¤ãããç°å¢ãªãã°ä»¥ä¸ã§å°å ¥ã§ããã
gem install evernote-editor
ããã¨ãevned
ã¨ããã³ãã³ãã追å ãããã
title ã¨ããååã®ãã¼ããä½ãããã¨ãã¯ä»¥ä¸ã®ããã«ããã
evned title
ååèµ·åæã¯ãdeveloper token ã¨ç·¨éã«ä½¿ãããã¨ãã£ã¿ãå°ããããã
- developer token ã«ã¤ãã¦ã¯ https://www.evernote.com/api/DeveloperToken.action ããã¨ã£ã¦ãã
- ã¨ãã£ã¿ã«ã¤ãã¦ã¯
which $EDITOR
ãããã®ãããã©ã«ãã§ä½¿ããã - è¨å®ã¯ ~/.evned ã« YAML å½¢å¼ã§æ¸ãè¾¼ã¾ãã
ç·¨éããã¨ã㯠-e
ãªãã·ã§ã³ãã¤ããããã¼ãã®åè£ãè¤æ°ããå ´åã¯ãããã¤ãåè£ãããããé¸æããã¨ãã£ãããã³ãããã§ãã®ã§ãèªåãç·¨éããããã®ãé¸ã¶ã
evned -e title
ã¿ã°ãã¤ããã¨ã Evernote ã®ãµã³ãããã¯ã¹ç°å¢ã§å®è¡ããã¨ãã®ãªãã·ã§ã³ããã(README è¦ããããããã)ã
ãã®ä»ã®é¸æè¢
ä»ã«æ¢ããæãã§ã¯ã Evernote ãã³ã³ã½ã¼ã«ãã(Vim ãã)æ±ãæ¹æ³ã¯ä»¥ä¸ã®2ã¤ã®é¸æè¢ããã£ãã
åè ã® evervim ã¯ã¨ãã£ã¿(Vim)ã« Evernote ã«ãã¹ãããæ©è½ãä»å ãããã®ã§ã+python 㧠vim ãã³ã³ãã¤ã«ããå¿ è¦ããããèªåã Emacs ã使ã£ã¦ãããªãã°ãã®ãããªã¢ããã¼ãã§ããã¾ããªãã¨æãå¯è½æ§ãããããèªåã¨ãã¦ã¯ãã¨ãã£ã¿ã«ã¯ããã¹ãç·¨é以å¤ã®æ©è½ãçãè¾¼ã¿ãããªãã®ã§ä»åã¯ãã¹ãããã¿ã¤ãã«ã¨ãã¿ã°ã¨ãå ¨é¨å«ãã¦ã¨ãã£ã¿ã®ä¸ã§æ¸ããã®ã¯è¯ããªã¨æã£ãã
å¾è ã® geeknote ã¯ãpython ã§æ¸ããã Evernote ã¯ã©ã¤ã¢ã³ãã§ãããã¹ãç·¨éé¨åãä»»æã®ã¨ãã£ã¿ã§ç·¨éãããã¨ãã§ããããã¾ã¾ã§ã¯ããã使ã£ã¦ããããæ°è¦ãã¼ããä½ãã¨ãã«ã¨ãã£ã¿ã使ããå¾®å¦ã«ä¸ä¾¿ã ã£ããããã¥ã¡ã³ããã¡ããã¨èªãã§ããªãã¦è¦ã¤ããããªãã£ãã®ãããããªããã±ã£ã¨ã¿ã®å°è±¡ã§ã¯ãã¤ã³ã¿ã©ã¯ãã£ãã«ã³ãã³ããå®è¡ããã¨ããããããããã¹ã¿ã¤ã«ã§ä½¿ãã®ã«ä¾¿å©ãªã¤ã³ã¿ãã§ã¼ã¹ã«è¦ããã
ã¡ãªã¿ã« Windows ç°å¢ã§ã¯ä»¥ä¸ã使ããããã ã£ã(æªç¢ºèª)ã
find_by!
欲ããã
以ä¸ã®ãããªã¤ã¡ã¼ã¸ãRails 4 ã® all ã¨ã take ã®é°å²æ°ããã£ã¦ãªãã®ã§ã¤ã¡ã¼ã¸ã
module MyFinderMethods def find_by(*args) where(*args).first end def find_by!(*args) where(*args).first! end end class ActiveRecord::Relation include MyFinderMethods end class ActiveRecord::Base class << self delegate :find_by, :find_by!, to: :scoped end end
find_by ã©ãã§ããããã© find_by! 欲ããã