ããã«ã¡ã¯
ä»æ¥ã¯ãMeteorã¢ããªã±ãŒã·ã§ã³çšã®ã·ã³ãã«ã§ãããªããéåžžã«æ©èœããã¡ãŒã«æåŸ
ã·ã¹ãã ã®äœææ¹æ³ã説æããŸãã
ãªããããå¿
èŠãªã®ã§ããããïŒ ããšãã°ããããžã§ã¯ãã®åãã°ã«ãŒãå
ã§æ°äººãäœæ¥ããå¿
èŠãããã¢ããªã±ãŒã·ã§ã³ãéçºããŠããå Žåã ããã¯ãããšãã°ãè€æ°ã®äººãç·šéã§ãããã¬ãŒãã³ã°ã¹ã±ãžã¥ãŒã«ããäŒç€Ÿã®ãªã³ã©ã€ã³ã¹ãã¢ã®è£œåã«ã¿ãã°ã«ããããšãã§ããŸãã
ãããã¯ãŒã¯ã«ã¯ãã§ã«è±èªãšCoffeScriptã®ããã¥ã¢ã«ã1ã€ãããŸãããããã«èšèŒãããŠããã¢ãããŒãã¯ç§ã«ãšã£ãŠäžäŸ¿ã§ããããã«æãããããèªåã®ãããžã§ã¯ãã«æåŸ
ã·ã¹ãã ãå®è£
ãããããããŒã«ãŒãšå
±æããããšã«ããŸããã
ãããã£ãŠããã®äŸã§ã¯æ¬¡ã®ããšãå¯èœã«ãªããŸãã
1ïŒæ¢åã®æåŸ
ã®ãªã¹ããšæ°ããæåŸ
ãéä¿¡ããããã®ãã©ãŒã ãå«ãæåŸ
ã€ã³ã¿ãŒãã§ãŒã¹ã衚瀺ããŸãã
2ïŒãã¹ãŠã®æåŸ
ç¶ãããŒã¿ããŒã¹ã«ä¿åããŸãã
3ïŒæåŸ
ã®ã¹ããŒã¿ã¹ãç£èŠããŸãã
4ïŒæåŸ
ç¶ãã¡ãŒã«ã§éä¿¡ããŸãã
5ïŒãŠãŒã¶ãŒã®åœ¹å²ãç£èŠããŸãã
6ïŒæ°ãããŠãŒã¶ãŒã®æåŸ
ãã¢ã¯ãã£ãã«ããŸãã
7ïŒå€æ°ã®ãµãŒãããŒãã£ã¢ãžã¥ãŒã«ã䜿çšããŸãã
泚æïŒãã®äŸã¯ãçããŠãããããžã§ã¯ãã«åºã¥ããŠæ€èšããããããã³ããŒããŠèªåã«è²Œãä»ããã ãã§ã¯ããããåäœããŸãã...
äœãå¿
èŠã§ããïŒ ãŸãã次ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
accounts-base - accounts-google - accounts-password - / accounts-ui - alanning:roles - aldeed:autoform - aldeed:collection2 - email - iron:router - mizzao:bootboxjs - random -
ããã«ããµã³ãã«ã€ã³ã¿ãŒãã§ã€ã¹ã¯
Bootstrapã®Material Designã䜿çšããŠèšè¿°ãããŠãããããããããžã§ã¯ãã«çµ±åããå¿
èŠããããŸãã å§ããŸãããã
æåã®ã¢ãããŒã
ãŸããæåŸ
ã®ã¹ããŒã¿ã¹ãæ
åœããå°æ¥å¿
èŠã«ãªãããã€ãã®ç°¡åãªå®æ°ã«ã€ããŠèª¬æããŸãã
Lib / constants.jsãã¡ã€ã«
ãŸãããã«ããŒé¢æ°ãããã€ãäœæããå¿
èŠããããŸãã
Lib / helpers.jsãã¡ã€ã«
ããŒã¿ãå
±åã§ç·šéããå¿
èŠãããã¢ããªã±ãŒã·ã§ã³ããããšããŸãïŒãããã¯é¢ä¿ãããŸããïŒã ãããè¡ãã«ã¯ãæåã®ãŠãŒã¶ãŒãäœæãããšãã«ãäŒç€Ÿã®ç¹å®ã®ã«ãŒãïŒãŸãã¯èª°ã«ãšã£ãŠã䟿å©ãªã°ã«ãŒãïŒãäœæããä»ã®ãŠãŒã¶ãŒã®æåŸ
æã«ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
ããŒã¿æ§é ãšãµãŒããŒããžãã¯
ãšã³ãã£ãã£ã®ããŒã¿ã¹ããŒãã説æããŸãããã ãããè¡ãã«ã¯ãSimple Schemaã®æ©èœãšãaldeedããã±ãŒãžã§ããcollection2ã䜿çšããŸãã
äŒç€Ÿã®ããŒã¿ã¹ããŒã ã説æããæåã®ã ããšãã°ãäŒç€Ÿåãç°¡åãªèª¬æãäŒç€ŸãäœæãããŠãŒã¶ãŒã®IDãã¬ã³ãŒããäœæãããæ¥ä»ãæåŸã«æŽæ°ãããæ¥ä»ãå«ãŸããŸãã
ã¹ããŒã ã®èª¬æã§ã¯ã次ã®ãããªå€ãèšå®ã§ããããšã«æ³šæããŠãã ããã
- type-ãã©ãŒã ãçæãããšãã«å°æ¥äœ¿çšãããæ¡ä»¶ä»ããã£ãŒã«ãã¿ã€ã
- minãmax-æå°ããã³æ倧æåæ°
- autoValue-ãã£ãŒã«ãã®èªåå€
- denyInsertãdenyUpdate-ã¬ã³ãŒãã®æ¿å
¥/æŽæ°æã«ãã£ãŒã«ããžã®æžã蟌ã¿ãçŠæ¢
- ãªãã·ã§ã³-ããã©ã«ãã®ãã£ãŒã«ãã¯å¿
é ã§ãããä¿®æ£ã§ããŸã
Lib / collections / company.jsãã¡ã€ã« Company = new Mongo.Collection('company');
åæ§ã«ãæåŸ
ã®ã¹ããŒã ã説æããŸãã ã³ã¬ã¯ã·ã§ã³ãã¡ã€ã«ã«ã¯ãæ°ããæåŸ
ã®éä¿¡ãæ¢åã®æåŸ
ã®åé€ãããã³ãŠãŒã¶ãŒã«ããæåŸ
ã®ã¢ã¯ãã£ãåã®3ã€ã®ãµãŒããŒã¡ãœãããå«ãŸããŸãã ã³ã¬ã¯ã·ã§ã³ã«ã¯ãæåŸ
è
ã®ã¡ãŒã«ãã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒããæåŸ
ã¹ããŒã¿ã¹ãæåŸ
ãã¢ã¯ãã£ãã«ãããŠãŒã¶ãŒãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãã£ãŒã«ããæåŸ
ãéä¿¡ãããŠãŒã¶ãŒãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãæåŸ
ã®äœæ/æŽæ°æ¥ãä¿åãããŸãã ããã«ããã£ãŒã«ããæŽæ°æ¥ãã®æåŸã®å€ã¯ãæåŸ
ã®ã¢ã¯ãã£ãåã®æ¥ä»ãšæå»ã«çãããªãããã£ãŒã«ããäœææ¥ã-éä¿¡ã®æ¥ä»ãšæå»ã«çãããªããŸãã
ãã¡ã€ã«lib / collections / invite.js Invite = new Mongo.Collection('invite');
åºæ¬çã«ãµãŒããŒã§å¿
èŠãªã®ã¯ããã ãã§ãã ã芧ã®ãšãããããžãã¯ã¯2åã®ã·ã³ãã«ãªãã®ã§ãããŠãŒã¶ãŒã¯äŒç€ŸïŒã°ã«ãŒãïŒãäœæããŸãã èªåçã«ææè
ã«ãªããä»ã®ãŠãŒã¶ãŒã«æåŸ
ç¶ãéä¿¡ããŸãã æåŸ
ã®éä¿¡ã«ã€ããŠèããå€ããå Žåãåä¿¡è
ãæåŸ
ãé©çšããªãã£ããã管çè
ã¯æåŸ
ãåé€ããæš©å©ããããåä¿¡è
ã¯æåããŸããã æåŸ
ãã¢ã¯ãã£ãã§ãåä¿¡è
ãã¬ã¿ãŒå
ã®ãªã³ã¯ãã¯ãªãã¯ãããšããç»é²ããã¿ã³ãã¯ãªãã¯ããã ãã§ããã«æåŸ
ãã¢ã¯ãã£ãã«ã§ããŸãã ãããããããæ©èœããããã«ã¯ãã«ãŒã¿ãŒã«äœããæããå¿
èŠããããŸã...
ããã«ã¡ãŒã«éä¿¡ã®èšå®ãæ°ã«ããå¿
èŠããªãããšã«æ³šæããŠãã ããã
ããã«äœ¿ããMeteorã¯
MailgunãµãŒãã¹ã䜿çšããããã«æ§æãããŠããã1æ¥ã«æ倧200æåããŸãã¯1ãæã«æ倧10,000æåãéä¿¡ã§ããŸãã ãã ããç¬èªã®ã¡ãŒã«ãµãŒããŒãŸãã¯ãµãŒãããŒãã£ã®ã¡ãŒã«ãµãŒããŒã§åäœããããã«èšå®ããããšã劚ãããã®ã¯ãããŸããã ãããè¡ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãã«ãç°å¢å€æ°MAIL_URLãå®çŸ©ããã ãã§ãã
次ã®ãããªãã®ïŒ "MAIL_URL"ïŒ "smtpïŒ// userïŒpassword@domain.ruïŒ587 /"ã ãã®åŸãã¬ã¿ãŒã®éä¿¡ã¯ãæå®ãããµãŒããŒã§ã®æ¿èªãéããŠè¡ãããŸãã
éèŠïŒ meteor-upã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããããã€ããç°å¢å€æ°ãèšè¿°ããmup.jsonãã¡ã€ã«ããããžã§ã¯ãã«ä¿åããå Žåã¯æ³šæããŠãã ãããGitHubãªã©ã®ãªãŒãã³ãªããžããªã«ã³ãŒããæçš¿ããªãã§ãã ããã ããããªããšãå
šå¡ãã¡ãŒã«ãèªãããšãã§ããŸãã
ã«ãŒã¿ãŒãšåºçç©
Iron Routerã¯ãæ°èŠåå
¥è
ãã¬ã¿ãŒãã移åãããªã³ã¯ãåŠçããã¿ã¹ã¯ãå®è¡ãã2ã€ã®æ¡ä»¶ã«åºã¥ããŠã¢ã¯ãã£ããŒã·ã§ã³ãæåŸ
ãããµãŒããŒåŽã®ã¡ãœãããåŒã³åºããŸãã
- çŸåšã®ãŠãŒã¶ãŒã¯ããããã®äŒæ¥ã«é¢é£ä»ããããŠããŸããïŒ
- çŸåšã®ã»ãã·ã§ã³ã«ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒãã¯ãããŸããïŒ
Lib / router.jsãã¡ã€ã« Router.map(function () { ...
ã³ãŒããããããããã«ããŠãŒã¶ãŒããªã³ã¯ '/ company / invit / <activation code>'ãã¯ãªãã¯ãããšãactivateInviteToCompanyãã³ãã¬ãŒããèªåçã«ã¬ã³ããªã³ã°ãããã¯ã©ã€ã¢ã³ãã«ã¯æåŸ
èªäœãäŒç€Ÿãããã³æ°ããã¡ã³ããŒãæåŸ
ãããŠãŒã¶ãŒã«é¢ããæ
å ±ã衚瀺ãããŸãã ãããã®ããŒã¿ã¯å°ãåŸã§å¿
èŠã«ãªããŸãã
onBeforeActioné¢æ°ã§ã¯ãããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
ãŸããèš±å¯ãããŠããªããŠãŒã¶ãŒã®ã¿ãã¡ã€ã³ããŒãžã«ã¢ã¯ã»ã¹ããŠã¢ããªã±ãŒã·ã§ã³ã®æ©èœã確èªãããã£ãŒãããã¯ããŒãžã衚瀺ããã¢ã¯ãã£ããŒã·ã§ã³ã®æåŸ
ããŒãžã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã ãã以å€ã®å Žå-ã©ãã§ååŸããããšããŠããåžžã«ã¡ã€ã³ããŒãžã«éä¿¡ããŸãã
次ã«ããŠãŒã¶ãŒããŸã èš±å¯ãããŠããå Žåã管çè
ãŸãã¯åå è
ãšããŠãæ¢åã®äŒç€Ÿãžã®æ·»ä»ãã¡ã€ã«ã確èªããŸãã ãã®ãã§ãã¯ãæåããå ŽåããŠãŒã¶ãŒã«ç¶è¡ãããŸãã
第äžã«ããŠãŒã¶ãŒããŸã ã©ã®äŒç€Ÿã«ãå²ãåœãŠãããŠããªãå Žåãã»ãã·ã§ã³ã§æåŸ
ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒããæ¢ããŸãã ããå Žåã¯ããŠãŒã¶ãŒãã¢ã¯ãã£ãã«ããŸãã ããã§ãªãå Žåã¯ãç¹å¥ãªããŒãžã«éä¿¡ããŠãæ°ããäŒç€Ÿã®äœæãææ¡ããŸãã
ãšãŠãç°¡åã§ãã ãã ããã»ãã·ã§ã³ã§æåŸ
ã³ãŒããä¿åããå Žæã¯è¡šç€ºãããŸããã ã©ãããŠïŒ ããã«ã€ããŠã¯åŸã»ã©èª¬æããŸãã
åºçç©ã¯æ®ããŸãã ã¯ã©ã€ã¢ã³ãã®ã«ãŒã¿ãŒã®ã³ãŒãããå€æãããšãæåŸ
ãäŒç€ŸãæåŸ
ãéä¿¡ãããŠãŒã¶ãŒã«é¢ããæ
å ±ãå¿
èŠã§ãã 次ã®ã»ã¯ã·ã§ã³ã§ã¯ããã®çç±ãæããã«ãªããŸãã
ãããè¡ãã«ã¯ããããªã±ãŒã·ã§ã³ãã¡ã€ã«ã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
ãã¡ã€ã«ãµãŒããŒ/ publications.js
ãããã£ãŠãäžã«ç€ºããããã«ãæå°éã®å¿
èŠãªæ
å ±ãã¯ã©ã€ã¢ã³ãã«è»¢éã§ããŸãã ãã¹ãŠã®ãã£ãŒã«ããã¯ã©ã€ã¢ã³ãã«è»¢éããããšã¯ã§ããŸããããéžæãããã£ãŒã«ãã®ã¿ã転éããããšã¯ã§ããŸããã§ããããããã¯äžèŠã ãšæããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹
ç§ãã¡ã®ããžãã¯ã¯ãã¹ãŠãã€ã³ã¿ãŒãã§ãŒã¹ãªãã§ã¯äœããããŸããã ã€ã³ã¿ãŒãã§ãŒã¹å
šäœã¯ãããã€ãã®ãã³ãã¬ãŒãã§æ§æãããŸãã
- æåŸ
ãªã¹ã-æåŸ
ã®ãªã¹ããšæ°ããæåŸ
ãéä¿¡ããããã®ãã©ãŒã ãåããããã«ã
- inviteSendãšinviteSend-èªåçã«çæãããäžé£ã®ãã£ãŒã«ããå«ãæåŸ
ãã©ãŒã ïŒ1ã€ã®ã¿ïŒã
- activateInviteToCompany-ãã®ãŠãŒã¶ãŒã«ãã£ãŠã¢ã¯ãã£ãã«ãããæåŸ
ã«é¢ããæ
å ±ãæåŸ
ããããŠãŒã¶ãŒã«è¡šç€ºããããã®ããã€ãã®ãªãã·ã§ã³ã
ãã¡ã€ã«ã¯ã©ã€ã¢ã³ã/ãã¥ãŒ/æåŸ
/invite.html <template name="inviteList"> <div class="panel panel-success" style="float: left; margin-right: 20px;"> <div class="panel-heading"> <h3 class="panel-title"> !</h3> </div> <div class="panel-body"> {{#if invitedUsers.count}} <div class="list-group"> {{#each invitedUsers}} <div class="list-group-item"> <div class="row-content"> <div class="least-content">{{inviteTextStatus}} {{#if isInRole 'CompanyAdmin'}} {{#if inviteIsComplete}} {{else}} <a class="deleteInviteBtn" data-id="{{_id}}" href="#">x</a> {{/if}} {{/if}} </div> <p class="list-group-item-text">{{email}}</p> </div> </div> <div class="list-group-separator"></div> {{/each}} </div> {{else}} ! {{/if}} </div> {{#if isInRole 'CompanyAdmin'}} <div class="panel-footer"> {{> inviteSend}} </div> {{/if}} </div> </template> <template name="inviteSend"> {{#autoForm collection="Invite" id="inviteSend" type="insert"}} {{> inviteFieldset}} <button id="sendInviteBtn" class="btn btn-primary" style="width:100%"></button> {{/autoForm}} </template> <template name="inviteFieldset"> <fieldset> {{> afQuickField name='email'}} </fieldset> </template> <template name="activateInviteToCompany"> {{#if currentUser}} . . {{ else }} {{#if inviteIsActivated}} , <b>{{userActivationCode}}</b> . . {{ else }} ! <br/><br/> , - <b>{{companyNameByInviteCode}}</b> <b>{{companyUserNameByInviteCode}}</b>. <br/><br/> <b>{{userActivationCode}}</b> !<br/><br/> , " / " , <b>{{companyNameByInviteCode}}</b>! {{/if}} {{/if}} </template>
ããã«ããã
InviteListãã³ãã¬ãŒãã«ã¯ãinviteSendéä¿¡ãã©ãŒã ãšäŒç€Ÿã®æåŸ
ç¶ã®ãªã¹ãã衚瀺ãããŸãã ãŠãŒã¶ãŒã®åœ¹å²ãšæåŸ
ç¶ã®ç¶æ
ã«åºã¥ããŠãæåŸ
ç¶ãéä¿¡ããããã®ãã©ãŒã ãšãåé€ããã¿ã³ã衚瀺ãŸãã¯é衚瀺ã«ãªããŸãã
activateInviteToCompanyãã³ãã¬ãŒãã¯ãæåŸ
ã¹ããŒã¿ã¹ïŒéä¿¡æžã¿/ã¢ã¯ãã£ãåïŒããã³ãŠãŒã¶ãŒã¹ããŒã¿ã¹ïŒæ¿èªæžã¿/æªæ¿èªïŒã«åºã¥ããŠãã¢ã¯ãã£ããŒã·ã§ã³æåŸ
ãŸãã¯ããããã®çç±ã§æåŸ
ã䜿çšã§ããªãããšã«é¢ããæ
å ±ã衚瀺ããŸãã
ããã«ããŠãŒã¶ãŒã®æåŸ
ãã³ãã¬ãŒãactivateInviteToCompanyã®ããŒãžã«ã¯ããŠãŒã¶ãŒãæåŸ
ãããŠãŒã¶ãŒãçç±ãå Žæã«é¢ãã詳现æ
å ±ãå«ãŸããŠããŸãã ããã¯éåžžã«éèŠã§ãããªããªãããŠãŒã¶ãŒãæçŽã®ãªã³ã¯ããã©ãã®ã¯ãç解ã§ããªããµãŒãã¹ã®èª°ãããã®æåŸ
ãåãå
¥ããããšããäºå®ã§ã¯ãªãããã§ãã
ãããæåŸ
ãŠã£ãžã§ããã®å€èŠ³ã§ãã

ãããŠããŠãŒã¶ãŒæåŸ
ããŒãžïŒ

ã¯ã©ã€ã¢ã³ãåŽã®ããžãã¯
ãµãµ...èšäºãæžã3æéç®...
å°ãæ®ã£ãŠããŸãã æåŸã«ãã€ã³ã¿ãŒãã§ã€ã¹ã«ããžãã¯ããããã·ã¹ãã ã®ãã¹ãŠã®éšåãæ¥ç¶ããå¿
èŠããããŸãã ãã®ããã«ã
ãã¡ã€ã«ã¯ã©ã€ã¢ã³ã/ãã¥ãŒ/æåŸ
/invite.js Template.inviteSend.events({ 'click #sendInviteBtn': function () {
ãã®ãã¡ã€ã«ã§ã¯ãæ¬ èœããŠããããžãã¯ã®ã»ãšãã©ãã¹ãŠã説æããŸããããããèŠãŠã¿ãŸããã...æåã«ãã€ãã³ãããæåŸ
ç¶ãéä¿¡ããã¿ã³ãšãæåŸ
ç¶ãåé€ããã¿ã³ã«å²ãåœãŠãŸããã[æåŸ
ç¶ãéä¿¡]ãã¿ã³ãã¯ãªãã¯ãããšãé»åã¡ãŒã«ã®è€è£œãšæ£åœæ§ãæ€èšŒããããã®åŸãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããããæåŸ
ç¶ãéä¿¡ãããµãŒããŒã¡ãœãããåŒã³åºãããŸãããæåŸ
ã®åé€ããã¿ã³ãæŒããšãæåŸ
ãåé€ãããµãŒããŒã¡ãœãããåŒã³åºãããŸããäžã§åœŒãèŠãŸããã以äžã¯ãåæåŸ
ç¶ã®è¡šç€ºãå¶åŸ¡ããæåŸ
ç¶ã®ãªã¹ããæã€ããã«ã®ç°¡åãªãã«ããŒã§ããæåŸã«ãæåŸ
ã®ã¢ã¯ãã£ããŒã·ã§ã³ããŒãžã§äœ¿çšããããã«ããŒãããã€ããããŸãããã®ã³ãŒãã®æãèå³æ·±ãéšåã¯ãTemplate.activateInviteToCompany.renderedã®å®çŸ©ã§ããã»ãã·ã§ã³å
ã§ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒããšãšãã«å€æ°ãä¿åããã®ã¯ããã®ã³ãŒãã§ããããã ã©ã€ã³ãšã©ã€ããã¢
æçµçãªããžãã¯ã¯ããŠãŒã¶ãŒãã¬ã¿ãŒããã®ãªã³ã¯ãä»ããŠåœç€Ÿã®ãµãŒãã¹ã«ã¢ã¯ã»ã¹ã§ããããšã§ããã»ãã·ã§ã³ã¯æåŸ
ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒãã«é¢ããæ
å ±ãä¿åããã¢ããªã±ãŒã·ã§ã³ã®å©çšå¯èœãªããŒãžãåãæ¿ããã¡ã€ã³ããŒãžã®èª¬æãèªã¿ãReformalããã¬ãã¥ãŒãèªã¿ãèå³æ·±ã-圌ã¯ããã°ã€ã³/ç»é²ããã¿ã³ãã¯ãªãã¯ããé©åãªèªèšŒæ¹æ³ãéžæããã·ã¹ãã ã«ãã°ã€ã³ããèªåçã«äŒç€ŸïŒã°ã«ãŒãïŒã®ã¡ã³ããŒã«ãªããããã«ä»äºãå§ããããšãã§ããŸãããŸãã¯ããŠãŒã¶ãŒã¯åã«ãµã€ãã«ã¢ã¯ã»ã¹ããŠãèªåãè¯ãããšã確èªããç»é²ããæ°ããäŒç€Ÿãäœæããååã«ååããŠãããããšãã§ããŸããå®éãããããã¹ãŠã§ããéåžžã«ããŸããã£ããšæããŸãããäœãšèšããŸããïŒãããžã§ã¯ãã®ã©ã€ããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã¯p.kellot.ru ã§èŠãããšãã§ããŸããèªåãã¹ãã®å®è¡ã§ã¯æ¬æ Œçãªãã¹ãã¯è¡ããŸããã§ããããã³ãŒããå
¬éããåã«ãã¹ãŠã®æäœãæåã§æ°åè¡ããŸããããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã«æ
£ããŠããéã«çªç¶äœãããããããªã£ããããããReformalã«å ±åããŠãã ããã