ã¢ã€ãã¢ãæçšãªãã®ãäœæããããšã§ããå Žåãéåžžãã§ããã ãæ©ããããã¿ã€ãïŒãŸãã¯ããŒãžã§ã³1.0ïŒãäœæããå¿
èŠããããŸãã 誰ãã«ãšã£ãŠãè¿
éãªçµæãèŠãããšã¯ãã¢ã€ãã¢ãããã«çºå±ãããè¯ãåæ©ã§ãã ä»ã®äººã«ãšã£ãŠã¯ãäž»ãªããšã¯ãéå§ãããããšã§ããå®æåã®å®æ/äœãçŽãã¯ãŒãããæžããããã¯ããã«ç°¡åã§ãããšããããç¥ãããŠããçå®ã§ãã ãããã£ãŠã次ã®
ãè¶ãšéèåžå Žã®è°è«ã®éçšã§ãç§ãã¡ã¯ã¢ã€ãã¢ããã¥ãŒã¹ã亀æããããã®ç°¡åãªãµãŒãã¹ãäœæããã ãã§ãªããéèåžå Žã®çŸåšã®ç¶æ³ïŒãããããã¬ã³ãïŒã決å®ãããšããã¢ã€ãã¢ãæã£ãŠããŸãã-ãã¬ã³ããç¥ã£ãŠããã®ã§ãããå¹ççã«ååŒããããšãã§ããŸãã
èŠä»¶ã¯ãWebãµãŒãã¹ãã¢ãã€ã«ããŒãžã§ã³ïŒã§ããã°ã¢ããªïŒãç°¡åãªéå管çããŒããããã³ã·ã³ãã«ãªã€ã³ã¿ãŒãã§ãŒã¹ã§ããã
ãã®èšäºã§ã¯ãCxInvestorã¢ããªã±ãŒã·ã§ã³ã®WebããŒãžã§ã³ãšã¢ãã€ã«ããŒãžã§ã³ã®äž¡æ¹ãéåžžã«è¿
éã«ããã©ã€ã³ããããæ¹æ³ã«ã€ããŠèª¬æããŸãã
éçº
解決ããå¿
èŠãããæåã®è³ªåã¯ããµãŒããŒãäœã«æžã蟌ããã§ããã
ãµãŒããŒã¬ã¹Firebase
ç§ã®phpã®ç¥èã¯90幎代ã«ãŸã§åãã ããã
ASP.NETãŸãã¯
Javaã§å°åã§è»œéã®ãµãŒããŒãäœæããããããŸããã§ããã ããµãŒããŒã¬ã¹ãã®Webã¢ããªã±ãŒã·ã§ã³ãäœæãããšããèãã¯è¯ãããããã«æããŸããããã€ã³ã¿ãŒããããæãäžããåŸãçµå±
Firebaseãè©Šãããšã«ããŸããã ã¢ã«ãŠã³ããããŒã¿ããŒã¹ãäœæããç°¡åãªäŸãå®è£
ããã®ã«ãã£ã20åããããããŸããã§ããã Firebaseã«ã¯ãããªã¢ã«ã¿ã€ã ãããŒã¿ããŒã¹ã«å ããŠããŠãŒã¶ãŒãç¹æš©ãããã³
Facebookã
Twitterãšã®ããŸããŸãªãã°ã€ã³çµ±åã·ã¹ãã ãçµã¿èŸŒãŸããŠããããšã«æ³šæããŠãã ããã å®éããŠãŒã¶ãŒããã¹ã¯ãŒããç¹æš©ã管çããã·ã¹ãã å
šäœãããŒã«ã«äžããããŸããã
ãŸã...å®éã«ã¯ããŒã«ã§ã¯ãããŸãããããªãããã倧ããªã¢ããªã±ãŒã·ã§ã³ãæã£ãŠããå Žå-æäœæåã¢ããã°ã¬ãŒãã¯æé¡50ãã«ã§ãã
Firebase ïŒ
é·æïŒ- éåžžã«è¿
éãªã»ããã¢ãã
- 䜿ãããã
- äœæ¥é床
çæïŒ- éãªã¬ãŒã·ã§ãã«/ NoSqlããŒã¿ããŒã¹ã¯ãå€å°ãªããšãåçŽãªå Žåã«ã®ã¿é©ããŠããŸãã
- äŸ¡æ Œ-ãµããŒãããµãŒããŒã®ã¡ã³ããã³ã¹ãã»ãã¥ãªãã£ã«ã¯äŸ¡å€ããããããããã¯ãã©ã¹ã«ãªãå¯èœæ§ãé«ã
Firebaseã®éæ³ã¯æ¬¡ã®ãšããã§ãã
var fb = new Firebase("https://YOUR.firebaseio.com/"); fb.set({ name: "Alex Wolfe" });
ã¬ã¹ãã³ã·ãããŒãã¹ãã©ãããšAngularJs
ããã³ããšã³ãã®å Žåãéžæã¯ããªãæçœã§ãã
ãTwitterBootstrapã䜿çšãããšãä»»æã®ããã€ã¹ã§ãµãŒãã¹ãç°¡åã«æäœã§ããŸããã
AngularJsã¯ããã«ã¯
æãä»ããŸããã§ããã AngularJsãæ¯æããäž»ãªè«ç¹ã¯ããããæ¬æ Œçãªãã¬ãŒã ã¯ãŒã¯ã§ãããšããããšã§ãããã€ãŸãã2ã€ãŸãã¯3ã€ã®ã¡ã€ã³JavaScriptã©ã€ãã©ãªïŒããšãã°ãRequireJs + KnockoutJsïŒã®ãã³ãã«ãåŠã¶å¿
èŠã¯ãããŸããã ãŸããAngularJsã«ã¯åªããã¢ãžã¥ãŒã«æ§é ãããããã¬ãŒã³ããŒã·ã§ã³ãããžãã¯ããåé¢ããé·ããã¹ããµããŒãããŠããŸãã
äžè¬ã«ãAngularJsã¯ç§ãã¡ã倱æãããŸããã§ãããçºçããåé¡ã¯ãã¹ãŠgoogleã䜿çšããŠè¿
éã«è§£æ±ºãããã¢ããªã±ãŒã·ã§ã³ã«æ°ããæ©èœãè¿œå ããã®ã¯ç°¡åã§å¿«é©ã§ããã
AngularJs ïŒ
é·æïŒ- æ確ãªã¢ãžã¥ãŒã«æ§é
- çµã¿èŸŒã¿äŸåã·ã¹ãã
- ãã¹ãŠã®WebèŠçŽ ã¯ããŒã¿å€æ°ã«ãµãã¹ã¯ã©ã€ããããããFirebaseãå€æŽãéä¿¡ãããšããã¹ãŠãããã³ããšã³ãã«èªåçã«è¡šç€ºãããŸã
çæïŒ- æ°ããããŒãžã§ã³ã§ä¿®æ£ãããããç°¡åã«ãã€ãã¹ãããå°æ°ã®åé¡/ãã°
- ã©ã€ãã©ãªã®ééã¯ãŸã ããªã倧ããã§ãããé·æçã«ã¯å ±ãããã¯ãã§ã
ããã¯ãããã€ãã®ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ãå®çŸ©ããæ¹æ³ã§ãã
var controllerId = 'calendar'; angular.module('app').controller(controllerId, ['$rootScope', 'common', 'datacontext', calendar]); function calendar($rootScope, common, datacontext) {
æºåž¯é»è©±ã®ã®ã£ãã
çè«çã«ã¯ãåã®3ã€ã®èŠçŽ ïŒ
Firebase ã
Bootstrapããã³
AngularJs ïŒãè¿œå ãããšãã¢ãã€ã«Webãã©ãŠã¶ãŒã§æ©èœããæ¢è£œã®ãµãŒãã¹ãã§ããŸããã
Phonegapã«ãã¹ãŠãè©°ã蟌ã¿ãWebãµãŒãã¹ããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãäœæããããšã¯è«ççãªè¿œå ã§ããã
ããã€ãæ··ä¹±ããŸããïŒ
- AppleãPhonegapã©ãããŒã奜ãŸãªããšãã話ãèªãã§ãã¢ããªã±ãŒã·ã§ã³ã«AppStoreãééãããè³åŠäž¡è«ãæ€èšããåŸãè©ŠããŠã¿ãããšã«ããŸããã ã¡ãªã¿ã«ãã¢ããªã±ãŒã·ã§ã³ã®ã·ã³ãã«ããããã³æããã«éiOSãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®èšèšã«ãããããããæåã®ããŒãžã§ã³ã§ã¯2åç®ã®ã¬ãã¥ãŒãè¡ãããŸããïŒæåã®ããã±ãŒãžã§ã¯ãå¿
èŠãªãµã€ãºã§ã¯ãªãã¢ã€ã³ã³ããªã³ã«ããŸããïŒ
- å¿
èŠãªæ©èœã®å®å®æ§ãšå¯çšæ§
- äœæ¥é床
å€æããããã«ãããã€ãã®ããšã¯ãŸã åžæã©ããã«æ©èœãããã¢ããªã±ãŒã·ã§ã³ã®æåã®ããŒãžã§ã³ã®é床ã¯ãŸã æãŸããŠããŸããã§ããïŒåŸã§ããã«è©³ãã説æããŸãïŒã
åãæ©èœã®ããã«ããã€ãã®ç°ãªããã©ã°ã€ã³ãè©ŠããŠãjavascriptïŒç¥ã£ãŠãã-ç解ããïŒã§
ã¢ã©ãŒãïŒãyooãïŒã§èŠãããããŸããããç§ã¯ãŸã æ©èœããããã°ããiPhoneã§äœæ¥ããŒãžã§ã³ãèµ·åããŸããã å°æ¥çã«ã¯ãããã«ããããããããã©ã°ã€ã³ã«ä»å±ããäŸã ãã§äž»ãªåé¡ãçºçããããšã«æ³šæããŠãã ããã ã»ãšãã©ã®å Žåããã©ã°ã€ã³éçºè
ã«ã¯ãµã³ãã«ãæééãã«æŽæ°ããæéããããŸããïŒãŸãã¯é¢åã§ãïŒããã®çµæããã€ããŒãªæ§æãšã©ãŒãåŒã³åºããã©ã¡ãŒã¿ãŒã®å€æŽã«ãããã¢ããªã±ãŒã·ã§ã³ãåäœãããããã«
ãè¶ ããããã¬ãŒãã¢ã©ãŒãã§äžæ©éããå¿
èŠããããŸãã
é床ã«ã¯ããã«å€ãã®åé¡ããããŸããïŒ
Phonegapã§ãŸãšããåŸãã¢ããªã±ãŒã·ã§ã³ã¯ççŽã«èšã£ãŠå®å
šã«é察話åã«èŠããŸããïŒäžéšã®éšåã¯å®å
šã«çŠæ¢ãããŠããŸããïŒã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ã®
{{myData}}ãªã©ã®AngularJsãã©ã±ããã®çŽ æŽãããçºæã¯ã
äžç¬äžç¬ãã¡ãã¡ã«çŸããå®å
šãªãã¡ã€ã«ã®ããã«èŠãããããåªãã§ããããšãå€æããŸããã ãã®çµæãã·ã¹ãã ã®äž»èŠéšåã¯ãå¯èœãªéããã£ãã·ã¥ããèŠçŽ ãã§ããã ãæŽæ°ããªãããã«æžãçŽãå¿
èŠããããŸããã ãã¹ãŠã®cssããã³è§åºŠã¢ãã¡ãŒã·ã§ã³ã¯å®å
šã«åé€ããå¿
èŠããããŸããïŒååãšããŠãç§ã¯ã»ãšãã©åŸæããŠããŸããïŒã ãããŠããã¹ãŠã®ãã©ã±ãã
{{myData}}ã
ng-bind = "myData"ã«çœ®ãæããå¿
èŠããããŸããã
ããã«ãäžèŠãªjavascriptãæªäœ¿çšã®cssãæ倧åãããæçµçã«FastClickãè¿œå ãããŸããã
<script type="application/javascript"> window.addEventListener('load', function () { FastClick.attach(document.body); }, false); </script>
çµæïŒ ã¢ããªã±ãŒã·ã§ã³ã¯ããã€ã³ã¿ã©ã¯ãã£ãã«ãªããŸããããã¡ãããé床ã¯ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšã¯æããã«ç°ãªããŸãïŒè¯ãã¯ãããŸããïŒããçŽãããªããã©ã¹ã§ããPhonegapã䜿çšãããšããã¹ãŠã®ã¢ãã€ã«ãã©ãããã©ãŒã ã§ã¢ããªã±ãŒã·ã§ã³ãäžåºŠã«äœæã§ããŸãã
ã ãã
Phonegap ïŒ
é·æïŒ- ã©ãããŒã¯ãã¹ãŠã®ãã©ãããã©ãŒã ã§åäœããŸãïŒWebããŒãžã§ã³ãéçºããã®ãããšããŠã¢ãã€ã«ããŒãžã§ã³ãååŸããŸãïŒ
- build.phonegap.comã§ã®äœ¿çšã¯ç°¡åã§ã
- ã»ãšãã©ã®ã¢ãã€ã«æ©èœã¯ãjavascriptãã©ã°ã€ã³ãšããŠå©çšã§ããŸãã
çæïŒ- ãããã°ã«ã¯å€ãã®æéãšåŽåãããããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®é床ãéèŠãªèŠçŽ ã§ããå Žåãphonegapã¯æ©èœããªãå¯èœæ§ããããŸãã
ã€ã³ã¹ããŒã«ãšã»ããã¢ãã
ãã¡ã€ã³ã®ç»é²ãftpã¯ã©ã€ã¢ã³ãã®ãã¹ãã䜿çšã¯å¿
èŠã§ããããã«ãã®æºåãšç®¡çã®ã·ã¹ãã ã¯ããã«éèŠã§ãã ãŸãããµãŒããŒã«éä¿¡ãããã®ãåé¢ããæ°ããããŒãžã§ã³ãšã¿ã°ãçæããæ¬çªæ§æãé©çšããjavascriptãšcssãé£èªåããå¿
èŠã«å¿ããŠhtaccessãsitemap.xmlãrobots.txtãåæ§æããæåŸã«ãŠãŒã¶ãŒãã©ãŠã¶ãŒããã£ãã·ã¥ãããªãããšã確èªããå¿
èŠããããŸããã¹ãŠã®å€ããã¡ã€ã«ãªã®ã§ããŠãŒã¶ãŒã¯Webã¢ããªã±ãŒã·ã§ã³ãæŽæ°ãããããšãç¥ããŸããã
ãã«ãã·ã¹ãã
ãœãŒã¹ã®é£èªåãèªååããããŒãžã§ã³ç®¡çãç¶æããå¿
èŠããã£ããããå°ããªãã«ãã·ã¹ãã ãäœæãããšããã¢ã€ãã¢ãããã«çãŸããŸããã å€æããããã«ãå®éã«ã¯ãftpã¯ã©ã€ã¢ã³ãã§ã³ããŒãå®éã«éå§ããåã«ãä»ã®å€ãã®ã¿ã¹ã¯ãèªååããããšãã§ããŸãïŒãããŠå¿
èŠã§ãïŒïŒèªååããããšãã§ããŸãïŒã
PowerShellã¯ããã®ã¢ãžã¥ãŒã«æ§ã䜿ãããããããã³ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒãšã®è¯å¥œãªé£æºã«ãããã¹ã¯ãªãããã«ããšããŠéžæãããŸããã
Closure Compilerãjavascriptã³ã³ãã€ã©ãšããŠéžæãããcssã¯yuicompressorã䜿çšããŠã³ã³ãã€ã«ãããŸããã
Write-Output "Compiling js files..." java -jar compiler.jar --language_in ECMASCRIPT5 --angular_pass ` --js $BaseDir\scripts\jquery-2.0.3.js ` --js $BaseDir\scripts\angular.js ` ...
ãããã£ãŠãWebãµãŒãã¹ã¯æºåãå®äºããŠGoogleã€ã³ããã¯ã¹ã«è¿œå ãããŸããã1ã€ã®åé¡ããããŸã-Google
ãããã¯ããŒãžã§javascriptãå®è¡ã§ããªããããAngularJsãã¥ãŒã«ã€ãªããURLïŒããšãã°ã
www.mywebsite.com/#!/myView ïŒã¯å®è¡ããã«ã¯javascriptãå¿
èŠãªããã
google botã«ãã£ãŠæ£ããèªã¿èŸŒãŸããŸãã ããã¯ãããããAngularJsã䜿çšãããšãã®æãäžå¿«ãªç¬éã®1ã€ã§ããWebãµãŒãã¹ã®SEOãèªåçã«è€éã«ãªããéçºè
ãšããŠã®äœæ¥ãå¢ããããã§ãã
çŸæç¹ã§ã¯ãGoogleïŒããã³ä»ã®æ€çŽ¢ãšã³ãžã³ïŒã®æšå¥šäºé
ã¯ãããããhtmlã¹ãããã·ã§ããããµããŒãããããšã§ããããã¯ãèŠæ±ãããããŒãžãjavascriptãªãã§å®å
šã«è¡šç€ºããŸãïŒããã«ãããå³å¯ã«google-HTMLã¹ãããã·ã§ãããšjavascriptããŒãžã§ã³ãéåžžã«ç°ãªãå ŽåãGoogleã¯çœ°ããŸãïŒã
ã¹ãããã·ã§ããã¯ã
www.mywebsite.com /ïŒ
_ escaped_fragment _ = /
myViewã®ç¹å¥ãªURLã§å
¥æã§ããŸãã
æ°å³ãæªãããã§ã...幞ããªããšã«ãApacheã«ãŒã«ãå©ãã«ãªããŸãããããã¯.htaccessãã¡ã€ã«ã§å®çŸ©ã§ããŸãã
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=/?(.+)$ [NC] RewriteRule ^ /snapshots/%1.html? [NC,L]
ãããŠããã¯ç°¡åã§ã-javascriptããã¹ãŠã®ããŒã¿ãããŒãããŠå®å
šã«æ©èœããåŸããã¹ãŠã®ãã¥ãŒãå·¡åããå®æããhtmlãã¡ã€ã«ãä¿åããŸãã ãã®åŸã
PowerShellã䜿çšããŠãã®ããã»ã¹ãèªååãããµãŒããŒäžã®ã¹ãããã·ã§ãããèªåçã«æŽæ°ããŸããã ãŸããã€ã³ã¿ãŒãããã«ã¯ããããããªæ¯æãã®ããã«ãã¹ãŠãè¡ããµãŒãã¹ããã£ã±ãã§ãïŒåæ§ã®ãã³ãã«ã.htaccessã«å
¥ããŠã
Googleãããããµãã¹ã¯ãªãã·ã§ã³ãµãŒãã¹ã®Webãµã€ãã«ãªãã€ã¬ã¯ãããã ãã§ãïŒã
次ã¯ïŒ
éçºããã»ã¹äžã«ãå
ã®æ©èœèŠä»¶ã®å€ããå€æŽãããå€ãã®æ°ããã¢ã€ãã¢ãè¿œå ãããŸããã
ééããªãã次ã®ã¹ãããã¯ãµãŒãã¹ãšã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®å®£äŒã§ãããããã¯ãŸãå¥ã®æ©äŒã«ã§ãã