æåã«ããããžã§ã¯ãã«é¢ããããã€ãã®èšèã ããã¯ã1ã€ã®å°å ã®åºäŒãç³»ãµã€ãã®ããã¢ãŒã·ã§ã³ããŒãžã§ãã ã¿ã¹ã¯ã¯ãåå è ã®éã§æé«ã®åçã競ãããã®å¥ã®ããŒãžãäœæããããšã§ããã åå è ã¯8人ã®ã¿ã§ãã 誰ã§ãæ祚ã§ããŸããç»é²ãæ¿èªã¯å¿ èŠãããŸããã ããŒãžã«ã¯ãã³ã³ãã¹ãçµäºãŸã§ã®ã«ãŠã³ãããŠã³ããããŸãã
Meteorã¯ããã®ãããžã§ã¯ãã«é©ããéžæè¢ã§ããããšãå€æããŸããã ãŸãã¯ããããžã§ã¯ãã¯ãåæ§ã«ãMeteorã§ã®ç§ã®æåã®ä»äºãšããŠè¯ãããšãå€æããŸããã Meteorã®äž»ãªæ©èœã¯ããããã åå¿æ§ ããã°ã©ããŒã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®éä¿¡ãããã³ã«ãèæ ®ããããšãªããããžãã¯ã宣èšçã«èšè¿°ãããšããèãæ¹ã§ãã ã¯ã©ã€ã¢ã³ãäžã®ããŒã¿ã®æŽæ°ã¯ããµãŒããŒäžã®ããŒã¿ãå€æŽããããšããã«èªåçã«è¡ãããŸãã ããã¯ããããžã§ã¯ãã³ãŒãã«AJAXãªã¯ãšã¹ãããããªãããšãæå³ããŸãã
Meteorã®å ¥åããŒã¿ãè€è£œããããããŸããã ãµã€ãwww.meteor.comã«ã¯ããã€ãã®è¯ããããªããããããã«é¢ããããã€ãã®èšäºããããŸãã
以äžã¯ããããžã§ã¯ãã®æè¡çãªèª¬æã§ãã ãã®ãããžã§ã¯ãã®äŸã䜿çšããŠãMeteorã§äœ¿çšãããåºæ¬çãªéçºã¢ãããŒãã«ã€ããŠã説æããŸãã ãããžã§ã¯ãã®æ§é ã¯æ¬¡ã®ãšããã§ãã
- ã¯ã©ã€ã¢ã³ã/-Meteorã®ã¯ã©ã€ã¢ã³ãéšåã§å©çšå¯èœãªããŒã¿
- client / client.js-ã¯ã©ã€ã¢ã³ãéšåã®ã¡ã€ã³ã¹ã¯ãªãã
- ã¯ã©ã€ã¢ã³ã/ãã¥ãŒ/-Meteorã§äœ¿çšãããhtmlãã¡ã€ã«ã®ã¹ãã¬ãŒãž
- public /-URLã§ã¢ã¯ã»ã¹å¯èœãªéçãã¡ã€ã«
- server / server.js-ãµãŒããŒéšåã®ã¡ã€ã³ã¹ã¯ãªãã
- model.js-ãµãŒããŒããã³ã¯ã©ã€ã¢ã³ãåŽã®äžè¬çãªã¹ã¯ãªãã
ã³ã¬ã¯ã·ã§ã³
ããŒã¿ããŒã¹ã¯MongoDBã§ãã ã¯ã©ã€ã¢ã³ãéšåã¯ããµãŒããŒéšåãšåãæ¹æ³ã§ããŒã¿ããŒã¹ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã ã¢ã¯ã»ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãåãã§ããMinimongoã¯ãã¯ã©ã€ã¢ã³ãåŽã§ããŒã¿ããŒã¹ã¯ãšãªãã·ãã¥ã¬ãŒãããããã«äœ¿çšãããŸãã Minimongoãä»ããã¯ã©ã€ã¢ã³ãã¯ãMongoDBããŒã¿ããŒã¹ã«çŽæ¥ãªã¯ãšã¹ããéä¿¡ãããµãŒããŒãšã¯ç°ãªããJavaScripté åã§åäœããŸãã
ãã¡ã€ã«ïŒmodel.js
// Members = new Meteor.Collection('members');
äžèšã®äŸã§ã¯ãã¡ã³ããŒã®ã³ã¬ã¯ã·ã§ã³ã宣èšãããŠããŸãã ãã®ãã¡ã€ã«ã¯ãããžã§ã¯ãã®ã¯ã©ã€ã¢ã³ãéšåãšãµãŒããŒéšåã®äž¡æ¹ã§å©çšã§ãããããMemberså€æ°ãžã®ã¢ã¯ã»ã¹ã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§å©çšã§ããŸãã ããã¯ããã©ãŠã¶ã§ã³ã³ãœãŒã«ãéããtypeof MembersãŸãã¯Members.findïŒïŒãFetchïŒïŒãå®è¡ããã ãã§ç¢ºèªã§ããŸãã ãµãŒããŒã§ã¯ãMembersã¡ãœãããMongoDBã§çŽæ¥åäœããã¯ã©ã€ã¢ã³ãã§ã¯Minimongoã©ãããŒãä»ããŠJavaScripté åã§åäœãããããéãã¯å®è£ ã®ã¿ã§ãã
ãããã®ã³ã¬ã¯ã·ã§ã³ã¯ãMeteorèªèº«ã管çããŸããã¯ã©ã€ã¢ã³ãã§ããŒã¿ãæŽæ°ããå¿ èŠãããææã決å®ããŸãã ããã°ã©ããŒã¯ãã¯ã©ã€ã¢ã³ãã®ã¡ã³ããŒå€æ°ã«ãã£ãŠè¡šãããããŒã¿ã®éãå¶éã§ããŸãã ããã¯ããµãŒããŒããã®ããŒã¿ã®ãµãã»ããã«ãªããŸãã ããã¯ãMeteor.publishïŒïŒããã³Meteor.subscribeïŒïŒã䜿çšããŠè¡ãããŸãã
ãã¡ã€ã«ïŒclient / client.js
Meteor.subscribe('members');
ãã®å Žåããã¹ãŠã®ããŒã¿ãæã€ãã¹ãŠã®åå è ãã¯ã©ã€ã¢ã³ãã«ã¢ã¯ã»ã¹ã§ããããã«ããå¿ èŠãããããã人çºçãªå¶éã¯èª²ãããŸããã
ãã¡ã€ã«ïŒserver / server.js
Meteor.publish('members'); Meteor.startup(function () { if (Members.find().count() === 0) { Members.insert({ name: ' ', title: '', url: 'http://mariels.ru/member/profile_alexandra_igorevna.html', photo: 'images/member/ .jpg', thumb: 'http://mariels.ru/$userfiles/thumb_450_1136_94.jpg', vote: 0 }); Members.insert({ name: ' ', title: '', url: 'http://mariels.ru/member/profile_Alionushka.html', photo: 'images/member/ .jpg', thumb: 'http://mariels.ru/$userfiles/thumb_444_1120_90.jpg', vote: 0 }); // ... } });
äžèšã®ã³ãŒãã§ãMeteorã§ã³ã¬ã¯ã·ã§ã³ãåæåããæšæºçãªæ¹æ³ã ã³ãŒãã¯server / server.jsãã¡ã€ã«å ã«ããããããµãŒããŒäžã§ã®ã¿å®è¡ãããŸãã
HTMLãã³ãã¬ãŒããšåå¿æ§
ããŒã¿ãããããã©ãŠã¶ã§è¡šç€ºããå¿ èŠããããŸãã Meteorã¯ãããã©ã«ãã®JavaScript Handlebarsãã³ãã¬ãŒããšã³ãžã³ã䜿çšããŸãã å®éããã³ãã¬ãŒããšã³ãžã³ã¯ããªãæ²ãã£ãŠããããforeachã«ãŒãã§é åã®ã€ã³ããã¯ã¹ã«ã¢ã¯ã»ã¹ããããªã©ã®ç°¡åãªã¿ã¹ã¯ãå®è¡ããã«ã¯ãæ°ããã¿ã°ãã³ãã©ãŒãäœæããå¿ èŠããããŸãã ããããæ £ããã°ãããã§äœæ¥ã§ããŸãã
ãã¡ã€ã«ïŒclient / view / members.html
<template name="members"> <div id="members"> {{#render_members members}} <span class="member span6"> <span class="info-cont"> <span class="shadow"></span> <a href="{{member.url}}" class="account"> <img src="{{member.thumb}}" width="" height="" class="avatar"/> <span>{{member.name}}</span> </a> </span> <img src="{{member.photo}}" class="image" /> <span class="rate-cont"> <span class="shadow"></span> <button class="btn {{#if voted}}btn-info{{else}}btn-warning{{/if}} pull-center btn-large" data-id="{{member._id}}" {{#if voted}}disabled{{/if}}> {{#if voted}} {{else}} <span>{{member.title}}</span> {{/if}} </button> </span> </span> {{/render_members}} </div> </template>
render_membersã¿ã°ã¯ãåºåãè¡ã«åå²ããããã«ã®ã¿äœæãããŸããïŒåºå<div class = "row"> 2ãšã³ããªããšïŒããäžè¬çã«ã¯éåžžã®foreachã«ãŒãã§ãã ãã³ãã¬ãŒãã§äœ¿çšã§ããå¯äžã®å€æ°ã¯ãã¡ã³ããŒé åã§ãã render_membersæ¬äœã§ã¯ãmembersé åã®åãªããžã§ã¯ãã®ãã¹ãŠã®ãã£ãŒã«ãã䜿çšå¯èœã§ãã å®å šã«æ£ç¢ºã«èšããšãã¡ã³ããŒã¯é åã§ã¯ãªãã«ãŒãœã«ã§ãããããã¯ãã€ã³ãã§ã¯ãããŸããã
ãã¡ã€ã«ïŒclient / client.js
Template.members.members = function() { return Members.find({}, { sort: { vote: -1 }}); }
Members.findïŒïŒã¯ã«ãŒãœã«ãè¿ããMembers.findïŒïŒãFetchïŒïŒã¯åçŽãªJavaScripté åã§ãã ã«ãŒãœã«ãã¡ã³ããŒã®ãã³ãã¬ãŒãå€æ°ãšããŠäœ¿çšããé¢æ°ïŒïŒ{}ã§ã©ãããããšããã®ãã³ãã¬ãŒãå€æ°ã§Meteorã®åå¿æ§ãã¢ã¯ãã£ãã«ãªããŸãã ããã¯ããµãŒããŒäžã®ã¡ã³ããŒã³ã¬ã¯ã·ã§ã³ããŒã¿ãå€æŽãããæŽæ°ãã¯ã©ã€ã¢ã³ãã«éä¿¡ããããšããã«ãæ°ããããŒã¿ã䜿çšããŠãã³ãã¬ãŒããèªåçã«åæç»ãããããšãæå³ããŸãã ãã®ãããã¯ã©ã€ã¢ã³ãã«è¿œå ã®ã³ãŒãã¯å¿ èŠãããŸããïŒ
ãµãŒããŒã¡ãœãã
ãã¡ã€ã«ïŒserver / server.js
// Votes = new Meteor.Collection('votes');
ãã¹ãŠã®é³å£°ã¯æ祚ã³ã¬ã¯ã·ã§ã³ã«ä¿åãããæ°å件ã®ã¬ã³ãŒãã«éããå¯èœæ§ããããŸãã æãããªçç±ã«ããããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®éã§ãã®ãããªå€§éã®ããŒã¿ãæµããããšãèš±å¯ããããšã¯ã§ããŸããã ããã«ãã¯ã©ã€ã¢ã³ãã§ã¯ãIPãæ¥ä»ãªã©ãåé³å£°ã®ããŒã¿ãç¥ãå¿ èŠã¯ãŸã£ãããããŸããã ãããã®çç±ã«ãããå€æ°ã¯ãµãŒããŒã§å®è¡ãããã³ãŒãã§ã®ã¿å®£èšãããMeteor.publishïŒïŒ/ Meteor.subscribeïŒïŒã¯åŒã³åºãããŸããã
ãã¡ã€ã«ïŒserver / server.js
// IP var CanVote = Match.Where(function(ip) { check(ip, String); if (ip.length > 0) { var yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); // return Votes.find({ ip: ip, date: { $gt: yesterday } }).count() == 0; } return false; }); // , Meteor.methods({ // true false canVote: function() { return Match.test(headers.get('x-forwarded-for'), CanVote); }, // vote: function(memberId) { check(memberId, String); check(headers.get('x-forwarded-for'), CanVote); var voteId = Votes.insert({ memberId: memberId, ip: headers.get('x-forwarded-for'), date: new Date() }); // SQL JOIN Members.update(memberId, { $set: { vote: Votes.find({ memberId: memberId }).count() } }); return voteId; }, // getMemberVotes: function(memberId) { check(memberId, String); return Votes.find({memberId:memberId}).count(); }, // getTotalVotes: function() { return Votes.find().count(); } });
Meteor.methodsïŒïŒã䜿çšããŠããããžã§ã¯ãã®ãã¬ãŒã ã¯ãŒã¯å ã®ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®éä¿¡ã€ã³ã¿ãŒãã§ãŒã¹ã宣èšãããŸãã æ祚ã³ã¬ã¯ã·ã§ã³ã¯ã¯ã©ã€ã¢ã³ãã§å©çšã§ããªããããåå è ããšã®æ祚æ°ãç·æ祚æ°ãªã©ããã®ã³ã¬ã¯ã·ã§ã³ã«é¢ããå¿ èŠãªããŒã¿ãååŸããæ¹æ³ãããã§çºè¡šãããŸãã
æ祚æ©èœã§ã¯ãæ°ãããšã³ããªãVotesã³ã¬ã¯ã·ã§ã³ã«è¿œå ãããMembersã³ã¬ã¯ã·ã§ã³å ã®å¯Ÿå¿ãããšã³ããªã®æ祚æ°ãæŽæ°ãããŸãã åŸè ã¯ãåå è ã®ãªã¹ãïŒæ祚ã§ãœãŒãïŒãšè©äŸ¡ã®ã¹ã±ãžã¥ãŒã«ã®åºåã§åå¿æ§ã䜿çšããããã«å¿ èŠã§ãã
äžè¬ã«ãMeteor.methodsïŒïŒã¯model.jsã§å®çŸ©ã§ããŸããã¯ã©ã€ã¢ã³ãéšåã«ã€ããŠã¯ããããã®ã¡ãœããã®ã©ãããŒãäœæãããåŒã³åºããããšãã¯ã©ã€ã¢ã³ãäžã®ããŒã¿ãå³åº§ã«æŽæ°ããããµãŒããŒäžã§ã¡ãœããã®åäœãç°ãªãå Žåã®ã¿èª¿æŽãããŸãã ããã¯ã¬ã€ãã³ã·ãŒè£æ£ãšåŒã°ããŸãã ãã ãããã®å Žåãã¯ã©ã€ã¢ã³ãã§ã¯Votesã³ã¬ã¯ã·ã§ã³ãå©çšã§ããŸãããã€ãŸããããã«ã¯æå³ããããŸããã ããã§ãããµãŒããŒããã®å¿çãåŸ ã€å¿ èŠããããŸãã
ããå€ãã®åå¿æ§
ãã¡ã€ã«ïŒclient / views / ratings.html
<template name="ratings"> <div id="ratings" class="well"> <h1 class="heading uppercase"></h1> <div class="chart"> {{#each_with_index members}} <div class="rating num{{index}}"> <img src="{{data.thumb}}" class="avatar"/> </div> {{/each_with_index}} </div> <div class="pull-center pull-center-1"> <div id="votes">{{votes}}</div> <div><strong></strong></div> </div> </div> </template>
ãã¡ã€ã«ïŒclient / client.js
Session.setDefault('totalVotes', 0); Meteor.startup(function() { // totalVotes Deps.autorun(function() { var total = 0; Members.find().forEach(function(m) { total += m.vote; }); Session.set('totalVotes', total); }); // -5 Deps.autorun(function() { var top = Members.findOne({}, { sort: { vote: -1 }}); // // update ratings chart Members.find({}, { sort: { vote: -1 }, limit: 5 }).forEach(function(m, i) { var height = top ? Math.floor((m.vote / top.vote) * 190) + 100 : 100; $('.rating.num'+(i+1)).css('height', height); }); }); }); Template.ratings.members = function() { return Members.find({}, {limit: 5, sort: { vote: -1 }}); }; Template.ratings.votes = function() { return Session.get('totalVotes'); };
ã»ãã·ã§ã³ã¯ã¯ã©ã€ã¢ã³ãäžã«ã®ã¿ååšããæ°žç¶çã§ã¯ãããŸãããã€ãŸããããŒãžãæŽæ°ããããšãªã»ãããããŸãã ã³ã¬ã¯ã·ã§ã³ã«ãŒãœã«ã®ãããªSessionãªããžã§ã¯ãã¯åå¿æ§ãã¢ã¯ãã£ãã«ãããããtotalVotesã®å€ãå€æŽãããšãè©äŸ¡ãã³ãã¬ãŒããã»ãã·ã§ã³ã§åæç»ãããŸãã
Deps.autorunïŒïŒã¯ãé¢æ°å ã®ãªã¢ã¯ãã£ãããŒã¿ãå€åãããã³ã«å®è¡ãããŸãã ãã®å Žåãã«ãŒãœã«ã¯Members.findïŒïŒã§ãã ãµãŒããŒãåå è ã®æ祚ãæŽæ°ãããšããã«ãã»ãã·ã§ã³ã®totalVotesã®å€ããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠæŽæ°ãããããã«ããè©äŸ¡ãããã¯ã®åæç»ãè¡ããããšããèãæ¹ã§ãã Deps.autorunïŒïŒã¯ãã¯ã©ã€ã¢ã³ãäžã®ããŒã¿å€æŽã«ã³ãŒã«ããã¯ãè¿œå ããããã«äœ¿çšãããŸãã è¿œå ãå€æŽãåé€ãªã©ãã³ã¬ã¯ã·ã§ã³ã®ç¹å®ã®ã€ãã³ãããµãã¹ã¯ã©ã€ãããæ¹æ³ã¯ã ãã¡ãã«ãããŸã ã
ãããã£ãŠã蚪åè ãè©äŸ¡ãããã¯ãèŠãŠããéã«èª°ããæ祚ãããšãè©äŸ¡ããŒã®é«ããå€ãããã«ãŠã³ã¿ãŒãå¢å ããŸãã
ããã§jQueryã®äœ¿çšã«æ³šæããããšãã§ããŸãã ã»ãšãã©ç¡å¶éã«ãMeteorã¯ã©ã€ã¢ã³ãã³ãŒããšæ··åã§ããŸãã ãšããã§ãMeteor.startupïŒé¢æ°{}ïŒãšjQueryïŒé¢æ°ïŒïŒ{}ïŒã¯åäžã§ãã
ãã¡ã€ã«ïŒclient / client.js
Session.setDefault('voted', false); // Template.members.voted = function() { return Session.get('voted'); } Template.members.events = { 'click button': function(event) { var $btn = $(event.currentTarget); // , Latency Compensation // DOM Session.set('voted', true); // Meteor.call('vote', $btn.data('id'), function(error, vote) { if (error) { Session.set('voted', false); } }); } }
ãµãŒããŒã¡ãœããåŒã³åºãã®ç°¡åãªäŸã åŒã³åºãã¯éåæã«çºçãããããåçãåŸ ã£ãŠããéã«ãæ祚ãããã»ãã·ã§ã³ã®å€ãtrueãšããŠããŒã¯ããŸãã çããåæãããšãããšã©ãŒãçºçããå Žåãããããã§ã«ããŒã«ããã¯ã§ããŸãã ãµãŒããŒã®å¿çã¯ååãšããŠç§ãã¡ã«ãšã£ãŠéèŠã§ã¯ãããŸãããæ祚äžã«ãšã©ãŒãçºçããã®ãããããšãæ祚ãã«ãŠã³ããããã®ãã ããçåã§ãã
ãã®ã³ãŒãã«ã¯ãDOMã€ãã³ãã®äœ¿çšäŸãå«ãŸããŠããŸãã ååãšããŠãjQuery.onïŒïŒã䜿çšã§ããŸãããæšæºçãªæ¹æ³ãæ¡çšããããšã«ããŸããã
ãã¡ã€ã«ïŒclient / views / index.html
<head> <!-- meta .. SEO --> <link href="stylesheets/project.css" media="screen" rel="stylesheet" type="text/css" /> <!-- ... CSS --> <script type="text/javascript" src="js/flipclock/flipclock.min.js"></script> <!-- JavaScript --> <title> 2013</title> </head> <body> <div class="page-header-bg"></div> {{>header}} <div class="container-fluid"> <div class="container"> <div class="page-header"> <h1 class="header-gradient"> 2013</h1> </div> {{>page}} </div> </div> </body> <template name="page"> {{#if contestInProgress}} {{>countdown}} {{>members}} {{>social}} {{>ratings}} {{>terms}} {{>footer}} {{else}} {{>winner}} {{>social}} {{>footer}} {{/if}} </template>
Meteorã¯ããããžã§ã¯ãã«ãããã¹ãŠã®JavaScriptãHTMLãCSSãã¡ã€ã«ãåŠçããç¹å®ã®ã«ãŒã«ã«åŸã£ãŠããããçµåããŸãã ãã ãããããªãã¯ãã©ã«ããŒå ã®ãã¡ã€ã«ã¯éçã§ãããšèŠãªããããã®ãŸãŸã¢ã¯ã»ã¹å¯èœã§ãããMeteorã«ãã£ãŠåŠçãããŸããã ã¹ã¿ã€ã«ã¯Meteorã®å¶åŸ¡äžã§è»¢éã§ããŸãããHTMLããããŒã«éçãã¡ã€ã«ãžã®ãªã³ã¯ãå«ãããšããæšæºçãªã¢ãããŒãã䜿çšããããšã«ããŸããã
äžéšã®ãµãŒãããŒãã£ã®JavaScriptã©ã€ãã©ãªãéçãã¡ã€ã«ãšããŠå«ãŸããŠããŸãããã¯ã©ã€ã¢ã³ããã©ã«ããŒã«ç§»åããŠãã¯ã©ã€ã¢ã³ãã®JavaScriptã³ãŒããã䜿çšããããšãã§ããŸãã å®éããã¹ãŠã®ã©ã€ãã©ãªãMeteorã§äœ¿çšã§ããããã«äœæãããŠããããã§ã¯ãªãããããã®ãããªå Žåã¯ãåžžã«HTMLããããŒã®æšæºã€ã³ã¯ã«ãŒãã«æ»ãããšãã§ããŸãã ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãå«ããå¥ã®æ¹æ³ã§ã¯ãã¯ã©ã€ã¢ã³ãã³ãŒãã§Meteorã䜿çšããããšãèªç¶ã§ãã
ãã¡ã€ã«ïŒclient / client.js
contestEndDate = new Date('01/30/2014 12:00'); Session.set('inProgress', new Date() < contestEndDate); Template.header.contestInProgress = Template.page.contestInProgress = Template.footer.contestInProgress = function() { return Session.get('inProgress'); } Meteor.startup(function() { // var targetDate = contestEndDate; var currentDate = new Date(); var offsetSeconds = (targetDate.getTime() - currentDate.getTime()) / 1000; offsetSeconds = Math.max(0, offsetSeconds); var clock = $('#countdown').FlipClock(offsetSeconds, { clockFace: 'DailyCounter', defaultClockFace: 'DailyCounter', countdown: true, callbacks: { stop: function() { Session.set('inProgress', false); } } }); });
index.htmlã§ã¯ãåå¿æ§ã®ãã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ãèŠãããšãã§ããŸãã å€æ°contestInProgressã¯ã競äºã®ã¹ããŒã¿ã¹ïŒé²è¡äžãŸãã¯æ¢ã«çµäºïŒã瀺ããŸãã ããŒãžã®å€èŠ³ã¯ããã®ã¹ããŒã¿ã¹ã«å¿ããŠå®å šã«å€ãããŸãã ã¹ããŒã¿ã¹ã¯ããŒãžãåæåããããšãã«èšå®ãããFlipClockã«ãŠã³ã¿ãŒã®åæ¢ã€ãã³ããçºçãããšã¯ã©ã€ã¢ã³ãã«ãã£ãŠãå€æŽãããŸãã
å€æ°contestInProgressã¯3ã€ã®ãã³ãã¬ãŒãã«ããããã®å€ã¯åãã§ãã ãã³ãã¬ãŒãã¯äºãã«ç¬ç«ããŠãããåå¥ã«åæç»ãããŸãã
ã³ãŒãããããµãŒãããŒãã£ã®FlipClockã©ã€ãã©ãªã«ãã£ãŠéå§ãããã€ãã³ããã³ãã©ãŒãããMeteorã¯ã©ã€ã¢ã³ãã»ãã·ã§ã³ã®å€ãå€åããããšãããããŸãã ããã¯ãããŒãžãèªã¿èŸŒãŸãããšãã«FlipClockã©ã€ãã©ãªãã¯ã©ã€ã¢ã³ããã©ãŠã¶ãŒã«ãã£ãŠèªã¿èŸŒãŸãããšããäºå®ã«ããããããã§ãã
ããã¯ãMeteorã®æãããªå©ç¹ãéããšããã§ãã ã«ãŠã³ãããŠã³ã®æåŸã«ããŒãžãåæç»ããã®ã¯ãšãŠãç°¡åãªã®ã§ã ãªãããããªãã®ã§ããïŒ ããã¯ã³ãŒãã®1è¡ã«ãããŸãããããã®æç¹ã§èª°ããããŒãžã衚瀺ããŠããå Žåã¯å£®èŠ³ã«èŠããŸãã
ãããžã§ã¯ããPHP + AJAXã§éçºãããå Žåãããã¯å¥ã®ã¿ã¹ã¯ã«ãªããŸãã è€éã§ã¯ãããŸãããããã®ã€ãã³ãã¯ãããžã§ã¯ãã®ååšäžã«1åããçºçããªããããããã°ã©ãã¯ããŒãžã¹ããŒã¿ã¹ã®æŽæ°ã«æãåºããªãå¯èœæ§ããããŸãã ãããŠãäœäººãã®äººã ããããèŠããªãã°ããªãããã§æéãç¡é§ã«ããŸããïŒ æ®ãã¯åè ã®ããŒãžãååŸããã ãã§ãã ããã¯Meteorã®é åã§ããããã°ã©ãã¯éä¿¡ãããã³ã«ã«ã€ããŠèããå¿ èŠããªãã以åã¯é·ãç®±ã«å ¥ããããŠããã§ãããå°ããªããšã«éäžã§ããŸãã
ã¯ã©ã€ããã¯ã¹
æåŸã«ãç¹å®ã®çµæããŸãšããŸãã ãããžã§ã¯ãã¯æåããç§ã¯ãæµæã®åå¿æ§ãéèŠãªåœ¹å²ãæããããšæããŸãã Meteorã§ãã®ãããªå°ããªWebãããžã§ã¯ããéçºããã®ã¯åã³ã§ãããäºçŽ°ãªåé¡ã®è§£æ±ºçãèŠã€ããã®ã«æéããããããšããããŸãã PHPã䜿çšããŠããå Žåãããã»ã©å€ãã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãå«ãããŒãžã¯äœæããªãã£ãã§ãããã
å©ç¹ïŒ
- ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®éä¿¡ãããã³ã«ã«ã€ããŠèããå¿ èŠã¯ãããŸãã
- ãµãŒããŒãšã¯ã©ã€ã¢ã³ãã®ã³ãŒãã¯1ã€ã®èšèªã§æžãããŠããŸã
- ãã©ãŠã¶ããçŽæ¥ã³ãŒãã䟿å©ã«ãããã°ãã
- meteor deployã䜿çšããŠããããžã§ã¯ãã®ã¹ããŒã¿ã¹ãã¯ã©ã€ã¢ã³ãã«ãã°ãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ããŸã
- Stackoverflowãå«ãã¢ã¯ãã£ããªã³ãã¥ããã£
çæïŒ
- ãŸã ãã¬ãã¥ãŒæ®µéã§ã 倧èŠæš¡ãªãããžã§ã¯ãã«ã¯é©ããŠããŸãã
- ã³ãŒãã§ã¯ãããã°ãæ§é ã䜿çšããŠããã€ãã®äºçŽ°ãªåé¡ã解決ããå¿ èŠããããŸã
- ã³ã³ããããµãŒããŒãžã®ã€ã³ã¹ããŒã«ã«ã¯node.jsãµãŒããŒãå¿ èŠã§ããhttpãµãŒããŒãæ¢ã«ããå Žåã¯ãããŒã80ããã®ãããã·èšå®
- JavaScriptã倧éã«ãããããã¢ãã€ã«ããã€ã¹ã«ã¯ãŸã£ããé©ããŠããŸãã
- ãã©ãŠã¶å ã®ãã¹ãŠã®ã³ã³ãã³ãã¯JavaScriptã䜿çšããŠçæãããŸããããã¯SEOã«æªåœ±é¿ãäžããå¯èœæ§ããããŸã
ã³ã³ãã¹ãèªäœã¯ãã§ã«çµäºããŠããŸãããã¹ãããŒãžã§ã³ã¯ãã¡ãpromo.meteor.comã§ç¢ºèªã§ããŸãã
github.com/imajus/promoãããžã§ã¯ãã®ãœãŒã¹