æšæºã®UITableViewã¯ãã¢ããªã±ãŒã·ã§ã³ã§ããŒã¿ã衚瀺ããããã®åŒ·åã§ãããšåæã«æè»ãªæ¹æ³ã§ãã äœæããã¢ããªã±ãŒã·ã§ã³ã®ã»ãšãã©ã¯ãäœããã®åœ¢ã§è¡šåœ¢åŒã®ãã¥ãŒã䜿çšããå¯èœæ§ããããŸãã ãã ããããçšåºŠã®ã«ã¹ã¿ãã€ãºãè¡ããªããšãã¢ããªã±ãŒã·ã§ã³ã¯èŠãç®ãæªããäœåãã®é¡äŒŒããã¢ããªã±ãŒã·ã§ã³ãšããŒãžããããšããæ¬ ç¹ããããŸãã ãéå±ãªãããŒãã«ãåé¿ããããã«ãã¢ããªã±ãŒã·ã§ã³ããæŽ»æ°ã¥ãããé©åãªã¢ãã¡ãŒã·ã§ã³ç»åãããã€ã远å ã§ããŸãã Google+ã¢ããªã§ãã®ãããªãã®ãèŠãããšããããããããŸããããã®ã¢ããªã§ã¯ã衚ã®ã»ã«ãæåéãç»é¢ãé£ã³åããã¯ãŒã«ãªã¢ãã¡ãŒã·ã§ã³ã衚瀺ããŸãã æ³šæãæã£ãŠããªãå Žåã¯ã
ããããããŠã³ããŒãã§ã
ãŸã ïŒç¡æïŒã ãŸããGoogleã2014 I / O Conferenceã§ãªãªãŒã¹ãã
ãã¶ã€ã³ã¬ã€ãã©ã€ã³ãçè§£ããŠãããšäŸ¿å©ã§è峿·±ãå ŽåããããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ã¢ãã¡ãŒã·ã§ã³ãå¹ççãã€æ£ãã䜿çšããæ¹æ³ã«é¢ããå€ãã®ãã³ããšäŸãå«ãŸããŠããŸãã
ãã®èšäºã§ã¯ãããŒãã«ã»ã«ãã¹ã¯ããŒã«ããŠç»åãåçŽã«ç§»åãããšãã«ãæ¢åã®ã¢ããªã±ãŒã·ã§ã³ã«Swiftæ¡åŒµããã°ã©ãã³ã°èšèªã䜿çšããŸãã UIKitãžã®å€ææ¹æ³ã説æãããŠãããç»é¢äžã§åæã«çºçããã¢ã¯ã·ã§ã³ãå€ãããããšã«ããéè² è·ãé¿ããããã®äŸ¿å©ãªäœ¿çšæ³ã説æãããŠããŸãã ã¿ã¹ã¯ãã·ã³ãã«ãã€æç¢ºã«ãªããã¡ã€ã³ã³ã³ãããŒã©ãŒãã·ã³ãã«ã«ãªãããã«ãããã°ã©ã ã³ãŒããæŽçããæ¹æ³ã«é¢ãããã³ããåãåããŸãã
å§ããã«ã¯ãUITableViewãšSwiftã®åºæ¬çãªèŠçŽ ãæäœããæ¹æ³ã«æ
£ããå¿
èŠããããŸãã ããã«æ
£ããå¿
èŠãããå Žåã¯ã衚圢åŒã®ãã¬ãŒã³ããŒã·ã§ã³ã¢ããªã±ãŒã·ã§ã³ã«é¢ããSwiftèšèªã§ã®äœæ¥ã®åºæ¬ãåŠç¿ãã
Swiftãã¥ãŒããªã¢ã«ã·ãªãŒãºã«æ
£ããããšãã§ããŸãã
å§ããŸããããã¹ã¿ãŒã¿ãŒãããžã§ã¯ããããŠã³ããŒãããXcode 6ã§éããŸãããããžã§ã¯ãã®ç°¡åãªèª¬æïŒUITableViewControllerïŒãµãã¯ã©ã¹ïŒMainViewControllerïŒã衚瀺ãããéçºè
ã衚瀺ããUITableViewCellïŒCardTableViewCellïŒãèšå®ãããŸãã ãŸããããŒã ã¡ã³ããŒã«é¢ãããã¹ãŠã®æ
å ±ãèšè¿°ããã¢ããªã±ãŒã·ã§ã³å
ã«ããJSONãã¡ã€ã«ãããã®æ
å ±ãæœåºããæ¹æ³ãç¥ã£ãŠããMemberã¯ã©ã¹ã®äŸããããŸãã
ãããžã§ã¯ããã³ã³ãã€ã«ããŠå®è¡ããŸãã 以äžã衚瀺ãããŸãã
åªãããã¶ã€ã³ãç¹å¥ãªã¿ãããšæŽç·Žãäžããæºåãã§ããŠã¢ããªã±ãŒã·ã§ã³ã¯ããã«äœ¿çšã§ããŸãããããå°ãå人䞻矩ãå«ããããšãã§ããŸããããã°ãç¬èªã®ããã€ã©ã€ãããæã€ããšãã§ããŸãã ãããããªãã®ä»äºã§ãã Core Animationã§ããã€ãã®ããªãã¯ã䜿çšããŠãããŒã¿ã»ã«ã«ã¹ãã€ã¹ãå ããŸãã
å¯èœãªéãç°¡åãªã¢ãã¡ãŒã·ã§ã³æ¹æ³ãç¹å®ããŸããã¢ããªã±ãŒã·ã§ã³ã®åºæ¬æ§é ãååŸããã«ã¯ãç°¡åãªãã«ããŒã¯ã©ã¹ãäœæããããšããå§ããŸãã File \ New \ File ...ã«ç§»åãã空ã®Swiftãã¡ã€ã«ã®iOS \ Source \ Swift Fileã®ã¿ã€ããéžæããŸãã [次ãž]ãã¯ãªãã¯ãããã¡ã€ã«ã«TipInCellAnimator.swiftãšããååãä»ããŠã[äœæ]ãã¯ãªãã¯ããŸãã
ãã¡ã€ã«ã®å
å®¹ãæ¬¡ã®ã³ãŒãã«çœ®ãæããŸãã
import UIKit class TipInCellAnimator {
ãã®åçŽãªã¯ã©ã¹ã«ã¯ãããŒã¿ãå«ãã»ã«ãååŸãããã®ã³ã³ãã³ãïŒcontentViewïŒã«ã¢ã¯ã»ã¹ããã¬ã€ã€ãŒã®åæéæåºŠã0.1ã«èšå®ããã¢ã«ãŽãªãºã ãå«ãŸããŠããŸãã æ¬¡ã«ã1.4ç§åŸãçµäºåŒã®ããã°ã©ã ã³ãŒãã¯ã¬ã€ã€ãŒã®éæåºŠã1.0ã«æ»ããŸãã
æ³šïŒ Swift ã®åŒã¯ãå€éšå€æ°ã«ãŸãããããšãã§ããã³ãŒãã®ãããã¯ã§ãã ããšãã°ã{}ã¯åçŽãªåŒã§ãã funcãšããŠæå®ããã颿°ã¯ãååä»ãåŒã®äŸã§ãã Swiftã§ã¯ãä»ã®é¢æ°å
ã®é¢æ°ãéãããšãã§ããŸãã
åŒã颿°ã®æåŸã®åŒæ°ãšããŠæž¡ããå Žåãç¹å¥ãªæ«å°Ÿã¯ããŒãžã£ãŒæ§æïŒæçµåŒïŒã䜿çšããŠãåŒã颿°åŒã³åºãã®å€åŽã«ç§»åã§ããŸãã
åŒã®è©³çްã«ã€ããŠã¯ãSwiftããã°ã©ãã³ã°èšèªã®æ¬ãåç
§ããããWikipediaã®ã¯ããŒãžã£ãŒã®è±å¯ãªèšäºãåç
§ããŠãã ãããã¢ãã¡ãŒã·ã§ã³ã³ãŒãã®æºåãã§ããããããŒã¿ã»ã«ã衚瀺ããããšãã«æ°ããã¢ãã¡ãŒã·ã§ã³ãéå§ããããã«ããŒãã«ãæ§æããå¿
èŠããããŸãã
ã¢ãã¡ãŒã·ã§ã³ãéå§ã¢ãã¡ãŒã·ã§ã³ãéå§ããã«ã¯ãMainViewController.swiftãã¡ã€ã«ãéããæ¬¡ã®ã¡ãœããã远å ããŸãã
override func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!) { TipInCellAnimator.animate(cell) }
ãã®ã¢ã«ãŽãªãºã ã¯ãUITableViewDelegateãããã³ã«ã§å®çŸ©ãããã»ã«ãç»é¢ã«è¡šç€ºãããåã«åŒã³åºãããŸãã æ¬¡ã«ãã¢ãã¡ãŒã·ã§ã³ãéå§ããããã«ãTipInCellAnimatorã¯ã©ã¹ã¢ã«ãŽãªãºã ãåã»ã«ã«å¯ŸããŠåŒã³åºãããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŠå®è¡ããŸãã æ
å ±ã®è¡šãã¹ã¯ããŒã«ããŠãã»ã«ããã£ããæ¶ããæ§åã確èªããŸãã
åè»¢å¹æã¢ããªã±ãŒã·ã§ã³ãããã«é
åçã«ããå転ã远å ããŸãããã ããã¯ãããã¢ããã¢ãã¡ãŒã·ã§ã³ãšåãããã«æ©èœããŸããã倿ã®éå§ãšçµäºã®äž¡æ¹ãæå®ããŸãã
TipInCellAnimator.swiftãã¡ã€ã«ãéããå
å®¹ãæ¬¡ã®ãã®ã«çœ®ãæããŸãã
import UIKit import QuartzCore
ä»åã¯åããéããªãïŒ0.4ç§ïŒããããŒãã£ã³ã°ããã䟿å©ã«ãªããè峿·±ãåè»¢å¹æãåŸãããŸãã åè¿°ã®ã¢ãã¡ãŒã·ã§ã³ã®ããŒã¯ãã»ã«ãå
ã®äœçœ®ã«æ»ãstartTransformãããªãã¯ã¹ã«ãã£ãŠæ±ºãŸããŸãã ãããã©ã®ããã«çºçããããçè§£ããŸãã
1.ãã®ã¯ã©ã¹ã¯ããŒã¢ãã¡ãŒã·ã§ã³å€æã䜿çšãããããQuartzCoreãã€ã³ããŒãããå¿
èŠããããŸãã
2.ããããŒæäœãã®ç®è¡åŒã§ãã倿ãèªèããããšããå§ããŸãã ãããããã©ã«ãã®ç»å倿ã§ãã
3. CATransform3DRotateã«ç§»åããŠã15床ã®å転ãååŸããŸãããã€ãã¹èšå·ã¯åæèšåãã®å転ã瀺ããŸãã ç§»åã¯è»ž0.0ã0.0ã1.0ãäžå¿ã«å®è¡ãããåçŽè»žzã衚ããŸããx= 0ãy = 0ãz = 1ã§ãã
4.ããŒãã«/ã°ã©ãã¯ãã®äžå¿ã«å¯ŸããŠå転ãããããå転ã ãã®äœ¿çšã§ã¯äžååã§ãã è§åºŠããå転ãã广ãäœæããã«ã¯ãã·ãããŸãã¯ãªãã»ããã远å ããŸããè² ã®å€ã¯ãå·Šäžãžã®ç§»åã瀺ããŸãã
5.å€æçµæãå
ã®ãã¥ãŒã«èšå®ããŸãã
6.ç»åãåãããŠãå
ã®å€ã«æ»ããŸãã
次ã®å³ã«ç€ºãããã«ãæçµçãªå€æãäœæã§ããããšã«æ³šæããŠãã ããã
泚ïŒå€æã®ä»»æã®ãã§ãŒã³ã¯ãæçµçã«åäžã®ãããªãã¯ã¹ã§è¡šãããšãã§ããŸãã åŠæ ¡ã§è¡å代æ°ãåŠãã å Žåãè¡åã®ä¹ç®ã®ã¢ã¯ã·ã§ã³ãèŠããŠãããŠãã ããã åã¹ãããã¯ãæçµçãªãããªãã¯ã¹ã«å°éãããŸã§æ°ãã倿Žãä¹ç®ããŸãããŸããã»ã«èªäœã§ã¯ãªããã»ã«ã®ã幌çšãªãå€èгãå€åããŠããããšã«æ°ä»ãã§ãããã ã»ã«å
šäœãå転ããããšãäžäžã®éšåã衚瀺ãããªããªããæ¯åãã»ã«ã®ããªãã³ã°ãªã©ã®å¥åŠãªèŠèŠå¹æãåŸãããŸãã ContentViewã»ã«ã«ã¯ããã¹ãŠã®æ§æèŠçŽ ãå«ãŸããŸãã
ãã¹ãŠã®ããããã£ãã¢ãã¡ãŒã·ã§ã³ããµããŒãããããã§ã¯ãããŸããã ã
ã³ã¢ã¢ãã¡ãŒã·ã§ã³ããã°ã©ãã³ã°ã¬ã€ããã«ã¯ãæç¢ºã«
ãããã
ã®ã¢ãã¡ãŒã·ã§ã³å¯èœãªããããã£ã®ãªã¹ãããããŸã ã
ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŠå®è¡ããŸãã ããŒã¿ã»ã«ãã©ã®ããã«åŸããã確èªããŸãã
è¿
éãªãªãã¡ã¯ã¿ãªã³ã°Objective-Cã®æ£èŠããŒãžã§ã³ã¯ã倿ã®éå§ãäžåºŠã ãæ±ºå®ããŸãã åè¿°ã®ãœãŒã¹ã³ãŒãã®ããŒãžã§ã³ã§ã¯ãæ¯åæ°ããæ¹æ³ã§animateïŒïŒã«ãã£ãŠèšç®ãããŸãã Swiftã§ãããè¡ãæ¹æ³ã¯ïŒ
1ã€ã®æ¹æ³ã¯ãåŒãžã®é·ç§»ã«ãã£ãŠæ±ºå®ãããäžå€ã¹ãã¬ãŒãžã䜿çšããããšã§ãã TipInCellAnimator.swiftãã¡ã€ã«ã®å
å®¹ãæ¬¡ã®ãã®ã«çœ®ãæããŸãã
import UIKit import QuartzCore let TipInCellAnimatorStartTransform:CATransform3D = { let rotationDegrees: CGFloat = -15.0 let rotationRadians: CGFloat = rotationDegrees * (CGFloat(M_PI)/180.0) let offset = CGPointMake(-20, -20) var startTransform = CATransform3DIdentity startTransform = CATransform3DRotate(CATransform3DIdentity, rotationRadians, 0.0, 0.0, 1.0) startTransform = CATransform3DTranslate(startTransform, offset.x, offset.y, 0.0) return startTransform }() class TipInCellAnimator { class func animate(cell:UITableViewCell) { if let view = cell.contentView { view.layer.transform = TipInCellAnimatorStartTransform view.layer.opacity = 0.8 UIView.animateWithDuration(0.4) { view.layer.transform = CATransform3DIdentity view.layer.opacity = 1 } } } }
startTransformãçæããããã°ã©ã ã³ãŒãã«æ³šæããŠãã ããã ããã¯ãTipInã¯ã©ã¹CellAnimatorStartTransformã®ããããã£ã«ãªããŸããã äœæã¡ãœããã®ããããã£ãšåãªã¯ãšã¹ãã®å€æŽãå®çŸ©ãã代ããã«ãåŒãå²ãåœãŠãç©ºã®æ¬åŒ§ã®ãã¢ãå²ãåœãŠãããšã«ãããããã©ã«ãã®å€æããããã£ãèšå®ããŸãã ãã©ã±ããã䜿çšãããšãåŒãããã«åŒã³åºããŠãããããã£ã«æ»ãå€ãå²ãåœãŠãããšãã§ããŸãã ãã®åæåã€ãã£ãªã ã¯ãåæåã»ã¯ã·ã§ã³ã®Appleã®Swiftã®æ¬ã§èª¬æãããŠããŸãã 詳现ã«ã€ããŠã¯ããåŒãŸãã¯é¢æ°ã®ããã©ã«ãå€ã®èšå®ããåç
§ããŠãã ããã
æ³šïŒ TipInCellAnimatorStartTransformã¯ã©ã¹ã§TipInCellAnimatorããããã£ãäœæãããšäŸ¿å©ã§ãããå·çæç¹ã§ã¯ãã¯ã©ã¹ããããã£ã¯ãŸã Swiftã«å®è£
ãããŠããŸããã倿ã«å¶çŽã远å ããã¢ãã¡ãŒã·ã§ã³å¹æã¯ããªãç°¡æœã§ãããæ
éã«äœ¿çšããŠãã ããã ãµãŠã³ããšãã§ã¯ããŸãã¯ã¢ãã¡ãŒã·ã§ã³ãšãã§ã¯ãã®ä¹±çšãåå ã§ãã¬ãŒã³ããŒã·ã§ã³ãèŠãŠãããšãã«äžå¿«æãçµéšããããšãããå Žåã¯ãéå°ãŸãã¯ä¹±çšãäœã§ããããææ¡ã§ããŸãã ãããžã§ã¯ãã§ã¯ãã»ã«ãæåã«è¡šç€ºããããšãïŒäžããäžãžã¹ã¯ããŒã«ãããšãïŒã«ã®ã¿ã¢ãã¡ãŒã·ã§ã³ã衚瀺ãããããã«ããŸãã äžã«ã¹ã¯ããŒã«ãããšãã»ã«ã¯ã¢ãã¡ãŒã·ã§ã³ãªãã«ãªããŸãã
以åã«è¡šç€ºãããã»ã«ã®ã¢ãã¡ãŒã·ã§ã³ã®ç¹°ãè¿ããé¿ããããã«ããã®ãããªæ¹æ³ãéçºããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãããŒã«ããã¯ã€ãã¯æ€çŽ¢ãæäŸããSwift DictionaryïŒDictionaryïŒã衚瀺ãããŸãã
泚ïŒåœä»€ã®ã»ããã¯ãéè€ã®ãªãäžæã®ã¬ã³ãŒãã®é åºä»ããããŠããªãã³ã¬ã¯ã·ã§ã³ã§ãããé
åã¯éè€ãèš±å¯ããé åºä»ããããã»ããã§ãã Swift LibraryïŒSwift Standard LibraryïŒã«ã¯äžé£ã®æç€ºã¯å«ãŸããŠããŸããããDictionary of Boolsãç°¡åã«åçã§ããŸãã
ãããã£ãŠãèŸæžã®äœ¿çšã«å¯Ÿããããã«ãã£ã¯å°ãããããããããSwiftéçºããŒã ã¯ããããæåã®ãªãªãŒã¹ããåé€ããŸããã åœä»€ãŸãã¯èŸæžããŒã®ã»ããã®äžè¬çãªæ¬ ç¹ã¯ãäžè²«æ§ãä¿èšŒããªãããšã§ãããã»ã«ã®é åºä»ãã¯ããŒã¿ãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠè¡ããããããããã¯åé¡ã§ã¯ãããŸãããMainViewController.swiftãéããæ¬¡ã®ã¯ã©ã¹ããããã£ã远å ããŸãã
var didAnimateCell:[NSIndexPath: Bool] = [:]
ããã§ã¯ãNSIndexPathãããŒãšããŠãBoolsãããããã£ãšããŠèªèãã空ã®èŸæžïŒèŸæžïŒãäœæããŸãã æ¬¡ã«ãtableViewã¡ãœããïŒtableViewïŒãwillDisplayCellïŒãforRowAtIndexPath :)ãæ¬¡ã®ããã«çœ®ãæããŸãã
override func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!) { if didAnimateCell[indexPath] == nil || didAnimateCell[indexPath]! == false { didAnimateCell[indexPath] = true TipInCellAnimator.animate(cell) } }
ããŒãã«ãäžäžã«ã¹ã¯ããŒã«ããªããã»ã«ã衚瀺ãããã³ã«ã¢ãã¡ãŒã·ã§ã³åãã代ããã«ãã»ã«ã®indexPathãèŸæžã«ä¿åãããŠããããšã確èªããŠãã ããã ããã§ãªãå Žåã¯ãã»ã«ãåããŠè¡šç€ºããããããã¢ãã¡ãŒã·ã§ã³ãéå§ããindexPathãåœä»€ã»ããã«è¿œå ããå¿
èŠããããŸãã ãã§ã«ãããã«å«ãŸããŠããå Žåã¯ãäœãããªãã§ãã ããã
ãããžã§ã¯ããã³ã³ãã€ã«ããŠå®è¡ããŸãã Tableviewãäžäžã«ã¹ã¯ã€ããããšãç»é¢ã«æåã«è¡šç€ºããããšãã«ã¢ãã¡ãŒã·ã§ã³åãããã»ã«ã®ã¿ã衚瀺ãããŸãã
次ã«äœãããïŒãã®ãã¥ãŒããªã¢ã«ã§ã¯ãæšæºã®èŠèŠåå¶åŸ¡æ¹æ³ã«ã¢ãã¡ãŒã·ã§ã³ã远å ããŸããã ã¢ãã¡ãŒã·ã§ã³å®è£
ã®è©³çްã¯ãMainViewControllerã¯ã©ã¹ã§æå®ãããŠããŸããã ããã©ãããããããã¯è£å©ã¯ã©ã¹ã«ç§»ãããŸããã ç¹ã«ãã£ã¹ãã¬ã€ã³ã³ãããŒã©ãŒã®ã¢ã¯ãã£ããªç¶æ
ã§ã¯ã©ã¹ã®è²¬ä»»ãç¶æããããšã¯ãIOSã®éçºã«ãããäž»èŠãªèª²é¡ã®1ã€ã§ãã
宿ãããããžã§ã¯ãã
ããŠã³ããŒãã§ã
ãŸãã»ã«ã«ã¢ãã¡ãŒã·ã§ã³ã远å ããåºæ¬ãåŠç¿ããã®ã§ã倿ã®å€ã倿ŽããŠãäœæã§ããä»ã®å¹æã確èªããŠãã ããã ããã€ãã®ã¢ã€ãã¢ïŒ
1.ã¢ãã¡ãŒã·ã§ã³ã®é«éåãŸãã¯äœéåã
2.ãã倧ããªåŸæè§ã
3.ç°ãªããªãã»ããïŒå転è§åºŠã倿Žããå Žåãã»ãšãã©ã®å Žåãç»åããŸã£ããã«èŠããããã«ãªãã»ããã倿Žããå¿
èŠããããŸãã ãªãã»ãããå®å
šã«çç¥ãããã©ã¡ãŒã¿ãŒã®å€ïŒ0ã0ïŒã䜿çšãããšãã€ã¡ãŒãžã¯ã©ã®ããã«ãªããŸããïŒ
4.åµé æ§ãçºæ®ãããªãªãžãã«ã®ç»åãäœæããŸãã
5.äžçŽãŠãŒã¶ãŒåãïŒæ°Žå¹³è»žãŸãã¯åçŽè»žã§ããŒãã«ãå転ããã广ãåŸãããšãã§ããŸããïŒ å®å
šãªã¯ãŒãã¿ãŒã®ããã«èŠããããšã¯ã§ããŸããïŒ
6.äžçŽãŠãŒã¶ãŒã®å ŽåïŒelseå¥ãtableViewïŒtableViewïŒãwillDisplayCellïŒãforRowAtIndexPath :)ã«è¿œå ããããŒã¿ã»ã«ã2åç®ã«è¡šç€ºããããšãã«ç°ãªãã¢ãã¡ãŒã·ã§ã³å¹æãååŸããŸãã
ããŒã¿ã»ã«ã«é©çšã§ããã¯ã¬ã€ãžãŒãªã²ããããã®èšäºããã¢ãã¡ãŒã·ã§ã³ãäœæããããã®ç°¡åãªã¬ã€ããåŠç¿ãããšããŠãããã®æ
å ±ã«åºã¥ããŠç¡éã®ããªãšãŒã·ã§ã³ãäœæã§ããŸãã ã¢ãã¡ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«å€§ãã远å ã§ããŸããããšãã°ãã»ã«ãå圢ã«å転ãããããã§ãŒãã¢ãŠããããããã¬ãŒã³ããŒã·ã§ã³ã«è¡šç€ºããããã»ã«ãåé€ãããã§ããŸãã
ps翻蚳ã¯ãHabrÃ©ã§æãæ£ç¢ºã§æé«ã®ç¿»èš³ã§ãããµããããŸãããã³ã¡ã³ããããã°ãåäººã§æžããŠãç·šéããŸãã ãçè§£ããã ãããããšãããããŸãã