äŒæ¥å人éçºã§åŠã¶ãã¹ãã³ãŒãïŒ ç»åã«âéäžç·âãåæããããŒã«ãäœã£ãŠã¿ãã
ãã©ã€ããŒãã§ãäœãäœãããïŒ ãããªãšãã®ã仿¥ããã¯ãããäŒæ¥å人éçºãã·ãªãŒãºã第äºåŒŸã¯ãã¹ãã³ãŒããæžããªããç°¡åãªMVCã¢ãã«ã®ç»åå å·¥ããŒã«ãäœã£ãŠã¿ãŸãããã奜ããªåçã«éäžç·ãåæã§ããŸãã
çããããã©ã€ããŒãã§äœãéçºããŠããŸããïŒ ãäœãäœãããããšããæ°æã¡ã¯ãããã®ã®ãããŸã²ãšã€äœããå§ãããããã®ãåããããåããªããŸãŸã®äººãå€ããšæããŸãã
ãããªçããã®ããã«ããä»äºä»¥å€ã«ãäŒæ¥ã«åäººã§æ°è»œã«äœããäœã£ãŠã¿ããïŒããšããäŒç»ã®ç¬¬äºåŒŸã§ããä»åã¯ã第äžåŒŸã§çšæããéçºç°å¢ã䜿ã£ãŠãç»åãå å·¥ããããŒã«ãå®éã«äœã£ãŠãããŸãã
ãã£ããã§ãã®ã§ããã äœãã ãã§ã¯ãªãããã¹ãã³ãŒããäžç·ã«æžããŠã¿ãŸããããæè¿ã¯ãCIïŒç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒãCDïŒç¶ç¶çããªããªãŒïŒãäžè¬çã«ãªãããã¹ãã³ãŒããæžãæ©äŒãå¢ããŠããŸãããããèžãŸããŠãä»åã¯ãã¹ãã³ãŒããæžãæçŸ©ããå®éã®æžãæ¹ã«çŠç¹ãåœãŠãŠãããŸãã
- ãªããã¹ãã³ãŒããæžããšããã®ã
- PHPUnitã®ã€ã³ã¹ããŒã«ãšæºå
- PHPUnitã§ãã¹ãã³ãŒããåãããŠã¿ãã
- éäžç·ããŒã«äœããå§ããã
- éäžç·ããŒã«ã®éçº1 - ãã³ãã¬ãŒãã®è¡šç€ºã調æŽ
- éäžç·ããŒã«ã®éçº2 - ç»åãå å·¥ããããžãã¯ã远å
- ãããã«
- å·çè
ãªããã¹ãã³ãŒããæžããšããã®ã
ãã¹ãã³ãŒããé§äœ¿ããéçºææ³ã«ãTDDïŒãã¹ãé§åéçº, test-driven developmentïŒããããŸãããŸããTDDãšãã¹ãã³ãŒãã®æŠèŠã«è§ŠããŠãããŸãã
TDDïŒãã¹ãé§åéçºïŒãšãã¹ãã³ãŒã
TDDãšã¯ãç°¡åã«èšãã°ãã¹ãã³ãŒããäžå¿ãšããéçºææ³ã®ããšã§ããTDDã§ã¯ãããã¯ãã«æ°ããæ©èœã远å ããéã«ãå è¡ããŠãã¹ãã³ãŒããæžããããšãããã«å¯Ÿå¿ããããžãã¯ãæžããŠãããŸãã
TDDã®ãµã€ã¯ã«
- ãRedããã¹ãã³ãŒããæžã
- ãGreenããã¹ãã³ãŒããåãæäœã¬ãã«ã®ãœãŒã¹ã³ãŒããæžã
- ãRefactorããã¹ãã³ãŒããåãç¶æ ã§ãã®ãœãŒã¹ã³ãŒãããã©ãã·ã¥ã¢ããããã
æåã¯ããžãã¯èªäœãååšããªãã®ã§ãã¹ãã¯ãã¡ãã倱æããŸãïŒãRedãïŒãåŸããåäœããããžãã¯ãæžããŠããïŒãGreenãïŒããã®ãã¹ããåãç¶æ ã«ä¿ã¡ãªãããªãã¡ã¯ã¿ãªã³ã°ããŠããïŒãRefactorãïŒããæ¹ã§ãã
ãããããããªãTDDãå®ç§ã«ããããšããŠãã倱æããå¯èœæ§ãé«ãã§ããå§ãã®ãã¡ã¯éã§ãããã®ã§ããã¹ãã³ãŒããæžãããšèªäœãžã®æµæããªãããç¿æ £åããããšã倧åã§ãããŸãã¯ãTDDãŸã§ãããªããšãããã¹ãã³ãŒããæžããŠã¿ãŸãããã
ãã¹ãã³ãŒããæžãæå³
ããããäœã®ããã«ãã¹ãã³ãŒããæžãã®ã§ããããã
éçºããŠããã·ã¹ãã ã®èŠæš¡ãåŸã ã«å€§ãããªã£ãããä»ã®éçºè ããåŒãç¶ãã ããããšãã«ãããœãŒã¹ã³ãŒãã®ãã®éšåãããããšå¯äœçšã§äœãèµ·ãããåãããªããããæãã®ã§è§Šããããªãããšæããããšã¯æå€ãšå€ãã§ããããç§èªèº«ããããã£ãçµéšããããŸãã粟ç¥è¡çäžããããããªãããéå°ã«æ°ãä»ãããããšã§éçºå¹çãèœã¡ãŠããŸããŸãã
ãããããã¡ããšä¿å®ãããŠãããã¹ãã³ãŒããããã°ããã®ãããªå°ã£ãäºæ ã«ãªãå¯èœæ§ãäžããããŸãããœãŒã¹ã³ãŒããä¿®æ£ãããšãã«ãã¹ããå®è¡ããã°ãæå³ããªã圱é¿ãäžããŠããªãã®ãã確èªããããšãã§ããŸãããã¹ããåããã ãã§ãïŒæ¬æ¥ã¯ããããã¹ãåºåãïŒãããªå€ã«ãªã£ãŠãããããšæããŠãããã®ã§ãã
ãŸãããã¹ãã³ãŒãã¯ãããã¥ã¡ã³ããæŽåãããªããªã£ãå Žåã«ãããã°ã©ã ã®ä»æ§ãæ ä¿ããæåŸã®ç Šã«ãªã£ãŠãããŸãã
ãã¹ãã³ãŒããæžããšãã®æ³šæç¹
ãã¹ãã³ãŒããæžãéã«ã¯ãã©ããªããšã«æ°ãä»ãããããã®ã§ããããïŒ
ãã¹ãã³ãŒããæžãããã«ã¯ããœãŒã¹ã³ãŒãèªäœãããã¹ãã³ãŒããåãããããšãæèããæžãæ¹ããããšããã¹ãã³ãŒããæžãããããªããŸãã颿°ãæ©èœããšã«åå²ããªããšãã¹ããæžãã«ãããªãã®ã§ãå€ãã®åŠçãäžã€ã®é¢æ°ã«è©°ã蟌ãŸãªããªã©ã®æèã¯å¿ èŠã§ãã
ãŸãããã¹ãã³ãŒããæžããŠããããã«ã¯ãäžäººã ãã§é 匵ãã®ã§ã¯ãªããäžç·ã«éçºããäººå šå¡ã®åæã»ååã»çè§£ãå¿ èŠã«ãªãã§ãããããšã³ãžãã¢ã«ã¯ããœãŒã¹ã³ãŒãã«æãå ããéã«äžç·ã«ãã¹ãã³ãŒããçŽããŠãããããšã³ãžãã¢ä»¥å€ã®è·çš®ã®äººã«ã¯ãã¹ãã³ãŒããæžãæçŸ©ãçè§£ããŠãããå¿ èŠãããã§ãããã
ãã¹ãã³ãŒããæžãã¯ãããã°ããã®ããã¯ãæžãæ¹ãæåã«æ £ãããŸã§ããããŸã§ããéçºé床ãäžæçã«èœã¡ãã§ããããããããäžæçã«ã³ã¹ããããã£ãŠãé·æçã«ã¯ã¡ãªããã倧ããããšãçè§£ããŠããããªããšãè·çš®éã§æž©åºŠå·®ãçãããã©ãã«ã«ããªããããŸããã
ãŸãã¯ãå°ããã€ã§ããã¹ãã³ãŒããæžããŠã¿ãŠãæµææããªãããŠããããšã倧åã§ãããããªããå®ç§ãªãã¹ãã³ãŒããæžããããšç¡çãããšãé·ç¶ãããã«æ«æããŠããŸãå¯èœæ§ãé«ãã§ãã
å®åã®äžã§ãããã¹ãã³ãŒããæžãããšãé£ããåŠçã«åºãããå Žåãå°ãªããããããŸãããã®ãããªãšãã§ããå¿ ããã¹ãã³ãŒããæžããªããšãããªãããšåŒ·è¿«èŠ³å¿µã«ãšããããå¿ èŠã¯ãããŸãããæåã§çµåãã¹ãã宿œããã°æžããã®ããããŸãããåŠçã«ãã£ãŠã¯ãããããã¹ãã³ãŒããæžãå¿ èŠããªããã®ããããŸãã
ã³ã¹ããšã¡ãªãããèããå¿ èŠãªãã®ãå¯èœãªãã®ããæžããŠããã°ããã®ã§ããç¡çã®ãªãç¯å²ããããã¹ãã³ãŒãã«æ £ããŠãããŸãããã
åèè³æïŒã50åã§ããããã¹ãé§åéçºã
æ¥æ¬ã§TDDã®ç¬¬äžäººè ãšããã°ãåç°å人ïŒ@t_wadaïŒããã®ååãããæãããŸããTDDããã¹ãã³ãŒãã«ã€ããŠã€ã³ã¿ãŒãããã§èª¿ã¹ãŠãããšãt_wadaããããŸãšããçºè¡šè³æãã¹ã©ã€ããç®ã«ããããšãå€ãã¯ãã
æè¿ã§ã¯ããã€ã¯ããœããã®ã€ãã³ããde:code 2017ãã®çºè¡šè³æïŒ2017幎5æïŒããåœæ¥ã®ããŒã¯ãããããŠå ¬éãããŠããŸããTDDã®åŠç¿ã«åœ¹ç«ã€ã®ã§ãæéãäœã£ãŠäžåºŠèŠãŠã¿ãŸãããã
PHPUnitã®ã€ã³ã¹ããŒã«ãšæºå
ãã¹ãã³ãŒããåããç°å¢ãæŽããŠãããŸããããä»åã¯PHPã§ããŒã«ãå®è¡ããã®ã§ãPHPUnitãçšããŠãã¹ããæžããŠãããŸãã
✠PHPUnit â The PHP Testing Framework
PHPUnitã®ã€ã³ã¹ããŒã«æ¹æ³ã¯ããã€ããããå ¬åŒãµã€ãã®ããã¥ã¢ã«ã«èšèŒãããŠããŸãã
ãªãããã®èšäºã§ã¯ã第äžåŒŸã§çšæããPHPéçºç°å¢ãåæãšããŠèª¬æããŸãã
仿¥ããã¯ãããäŒæ¥å人éçº ïœ ã¯ã©ãŠããµãŒãã¹ã®éžå®ãããWebãµãŒãã§PHPãåãããŸã§
ã³ã©ã ïŒéçºç°å¢ãææ°ã®ç¶æ ã«ãã
ç°å¢ãæ§ç¯ããŠããæéãçµã£ãŠããæ¹ã¯ãè匱æ§å¯Ÿçã®ãããæ¬¡ã®æé ã§ææ°ã®ç¶æ ã«ããŸãããã
$ sudo yum update
ã«ãŒãã«é¢é£ã®ã¢ããããŒããå«ãŸããŠããå Žåã¯ãOSãåèµ·åããŠãæŽæ°ããå 容ãåæ ãããŸãã
$ sudo reboot
Composer - PHPã®ããã±ãŒãžç®¡çããŒã«
ä»åã¯PHPUnitããComposerã䜿ã£ãŠã€ã³ã¹ããŒã«ããŸããComposerã¯ãPHPã§ãã䜿ãããããã±ãŒãžç®¡çããŒã«ãªã®ã§ãäœ¿ãæ¹ãäžç·ã«èŠããŠããŸããŸãããã
Composerã§ã¯ã䜿ãããããã±ãŒãžãJSONã§æå®ããããšã§ç®¡çã§ããŸãã
äŸãã°ãGitHubã§å ¬éãããœãŒã¹ã³ãŒããåããããã«ãä»ã®ããã±ãŒãžãããã€ãå¿ èŠã«ãªãå ŽåããããŸãããã®ãããªå Žåã«ãå¿ èŠãªããã±ãŒãžããã®ããŒãžã§ã³æ å ±ãJSONãã¡ã€ã«ã«èšèŒããŠäžç·ã«GitHubãžäžããŠããããšã«ãããå¿ èŠãªããã±ãŒãžã«äŸåããããã±ãŒãžãå«ãããã®ããã±ãŒãžæ§æã管çã§ããŸããå©çšè ã¯åäœã«å¿ èŠãªããã±ãŒãžããComposerãå©çšããŠåèªã®ç°å¢ãžç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸãã
Composerã®ã¡ã€ã³ãªããžããªããPackagistã§ãããã®ãµã€ãã«èšèŒãããŠããããã±ãŒãžã¯ãComposerã§å©çšã§ããŸããã€ãŸããããã«ããã±ãŒãžãç»é²ããã°ãå šäžçã®äººãComposerã§å©çšããããšãã§ããããã«ãªããŸãã
Packagist - The PHP Package Repository
Composerãã€ã³ã¹ããŒã«
Composerãã€ã³ã¹ããŒã«ããŠãããŸããããå ¬åŒãµã€ãã«ããæé ã«åŸã£ãŠComposerãã€ã³ã¹ããŒã«ããŠãããŸãã
ãªããComposerã¯rootæš©éã§äœ¿ããªãããšãæšå¥šãããŠããã®ã§ãç¹ã«å¿ èŠæ§ããªããã°ãsudoã®ä¹±çšã¯ãããŸãããã
ãŸããhttps://getcomposer.org/installer ãcomposer-setup.phpãšãããã¡ã€ã«åã§ä¿åããŸãã
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" $ ls composer-setup.php
次ã«ãããŠã³ããŒããããã¡ã€ã«ãæå³ããŠãããã®ãšåããªã®ããããã·ã¥å€ãã確èªããŸãã
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" Installer verified
ããŠã³ããŒããããã¡ã€ã«ãå®è¡ããŸããããã§ã¯ãfilenameãªãã·ã§ã³ãä»ããŠãã€ã³ã¹ããŒã«ãããå®è¡ãã¡ã€ã«ã®ãã¡ã€ã«åãcomposerãšæå®ããŠããŸãã
$ php composer-setup.php --filename=composer All settings correct for using Composer Downloading... Composer (version 1.4.2) successfully installed to: /home/user1/composer Use it: php composer
composerãçæãããŠããŸãã
$ ls
composer composer-setup.php
ã€ã³ã¹ããŒã«ã«äœ¿ã£ããã¡ã€ã«ãåé€ããŸãã
$ php -r "unlink('composer-setup.php');" $ ls composer
æåŸã«ãComposerãã©ã®ãã£ã¬ã¯ããªããã§ã䜿ãããããç§»åãããŸãã
$ sudo mv composer /usr/local/bin/
以äžã§ãComposerãå©çšã§ããããã«ãªããŸããã
$ composer --version Composer version 1.4.2 2017-05-17 08:17:52
PHPUnitãComposerã§ã€ã³ã¹ããŒã«
Composerãçšæã§ããã®ã§ãPHPUnitãã€ã³ã¹ããŒã«ããŠãããŸãã
ãã®èšäºã§åæãšããŠããã第äžåŒŸã§æ§ç¯ããããã±ãŒãžæ§æã®ç°å¢ã§ã¯ãPHPUnitã«å¿ èŠãªOSã®ããã±ãŒãžãäºåã«ã€ã³ã¹ããŒã«ããŠããå¿ èŠããããŸãã
$ sudo yum -y install php-xml
ãã®åã«ãããããäœãç»åå å·¥ããŒã«ããPHPUnitãå«ããŠãŸãšããŠé 眮ããé©åœãªãã£ã¬ã¯ããªããåèªã®ããŒã ãã£ã¬ã¯ããªã«äœæããŠãããŸãããã
$ mkdir tool $ cd tool/
ããã§ã¯toolãšãããã£ã¬ã¯ããªåãäœæããŸããã以äžã®äœæ¥ã¯ããã§è¡ã£ãŠãããŸãã
ããã§ã¯PHPUnitãã€ã³ã¹ããŒã«ããŠãããŸãããããŸããcomposer.jsonãäœæããŸãããã®JSONãã¡ã€ã«ã«ãComposerã§ç®¡çã»ã€ã³ã¹ããŒã«ãããããã±ãŒãžãèšèŒããŸããä»åã¯PHPUnitãèšèŒããŸãã
$ vi composer.json { "require-dev": { "phpunit/phpunit": "3.7.*" } }
ããã ãã§æºåå®äºã§ããComposerã䜿ã£ãŠã€ã³ã¹ããŒã«ããŠã¿ãŸãããã
$ composer install Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 8 installs, 0 updates, 0 removals - Installing symfony/yaml (v2.8.24): Downloading (100%) - Installing phpunit/php-text-template (1.2.1): Downloading (100%) - Installing phpunit/phpunit-mock-objects (1.2.3): Downloading (100%) - Installing phpunit/php-timer (1.0.9): Downloading (100%) - Installing phpunit/php-file-iterator (1.4.2): Downloading (100%) - Installing phpunit/php-token-stream (1.2.2): Downloading (100%) - Installing phpunit/php-code-coverage (1.2.18): Downloading (100%) - Installing phpunit/phpunit (3.7.38): Downloading (100%) phpunit/phpunit-mock-objects suggests installing ext-soap (*) phpunit/php-code-coverage suggests installing ext-xdebug (>=2.0.5) phpunit/phpunit suggests installing phpunit/php-invoker (~1.1) Writing lock file Generating autoload files
ããã§ã./vendor/bin/ã«PHPUnitãã€ã³ã¹ããŒã«ãããŸããã確èªããŠã¿ãŸãããã
$ ./vendor/bin/phpunit --version
PHPUnit 3.7.38 by Sebastian Bergmann.
PHPUnitã§ãã¹ãã³ãŒããåãããŠã¿ãã
ã€ã³ã¹ããŒã«ããPHPUnitã詊ãã«åãããŠã¿ãŸãããããµã³ãã«ã®ãã¹ãã³ãŒããèšè¿°ãããã¡ã€ã«ãäœæããŸãã
ãã¹ãã³ãŒãã§ã¯ããæ£è§£ãšããå€ããšããå®éã®ãœãŒã¹ã«ããããžãã¯ã®ã¢ãŠãããããšããŠåºãŠããå€ããçãããã©ãããæ¯èŒããŸãã
ãã¹ããæåããå Žå
次ã®ãããªSampleTest.phpãã¡ã€ã«ãäœæããŸãã
<?php class SampleTest extends PHPUnit_Framework_TestCase { public function testEqual() { $expected = 5; // æåŸ ããæ£è§£ã®å€ $actual = 2 + 3; // å®éã«åŸãããå€ $this->assertEquals($expected, $actual); } }
ãã®ãµã³ãã«ã§ã¯ãã2 + 3ãã®çµæãã5ãããšããããšããã¹ãããŠããŸããå ç®ããŠããéšåã¯ãæ¬æ¥ã§ããã°ãããã¯ãå ã«ãã颿°ãåŒã³åºãã³ãŒãã«çžåœããŸãã
ãããPHPUnitã§åãããŠã¿ãŸãã
$ ./vendor/bin/phpunit SampleTest.php PHPUnit 3.7.38 by Sebastian Bergmann. . Time: 19 ms, Memory: 2.25MB OK (1 test, 1 assertion)
OKãšãªãããã¹ããç¡äºã«éããŸããã
ãã¹ãã倱æããå Žå
次ã«ãSampleTest.phpã倱æããããã«æžãæããæåã確èªããŠã¿ãŸãã
<?php class SampleTest extends PHPUnit_Framework_TestCase { public function testEqual() { $expected = 5; $actual = 2 + 4; // æåŸ ããã$expectedã®å€ã5ããšç°ãªã $this->assertEquals($expected, $actual); } }
æåŸ ãããå€ã¯ã5ãã§ãããã2 + 4ãã®çµæã¯ã6ããªã®ã§ãæåŸ å€ãšã¯ç°ãªããŸãã
$ ./vendor/bin/phpunit SampleTest.php PHPUnit 3.7.38 by Sebastian Bergmann. F Time: 18 ms, Memory: 2.50MB There was 1 failure: 1) SampleTest::testEqual Failed asserting that 6 matches expected 5. /home/user1/phpunit/SampleTest.php:8 FAILURES! Tests: 1, Assertions: 1, Failures: 1.
å ã»ã©ãšç°ãªããFAILURESã§ãã¹ãã倱æããŸãããã8è¡ç®ã§5ãæåŸ ãããŠããã®ã«å®éã«ã¯6ã«ãªã£ãŠãããããšæããŠãããŠããŸãã
ãã®ãããªãã¹ãã³ãŒãããããžãã¯ã®ãœãŒã¹ã³ãŒããæžãéã«ã»ããã§çšæããŠãããšããªãã¡ã¯ã¿ãªã³ã°ãæ©èœè¿œå ã«ãã£ãŠæå³ããªã圱é¿ãäžããå Žåã§ãããã¹ããå®è¡ããã°äžå ·åãæ€ç¥ããããšãã§ããŸãã
ãã¹ãã³ãŒãã®é¢æ°å
SampleTest.phpã§ã¯ããã¹ãã³ãŒãã®é¢æ°åãtestEqual()ãšããŠããŸããããã®ããã«testã§å§ãŸã颿°ã¯ãPHPUnitãèªåçã«ãã¹ãã ãšå€æããŸãã
ãŸãã@testã¢ãããŒã·ã§ã³ã䜿ãããšã«ãããtestã§å§ãŸããªã颿°ã§ããã¹ããšããŠèªèãããããšãã§ããŸããããã«ããããã¹ãã®é¢æ°åãæ¥æ¬èªã§ä»ããããšãã§ããŸãã
<?php class SampleTest extends PHPUnit_Framework_TestCase { /** * @test */ public function å€ãçãããã©ãã() { $expected = 5; $actual = 2 + 4; $this->assertEquals($expected, $actual); } }
éäžç·ããŒã«äœããå§ããã
ãã®èšäºã®ç®çã¯ããã¹ãã³ãŒããæžããªããç°¡åãªç»åå å·¥ããŒã«ãäœã£ãŠã¿ãããšã§ããããŸãã¯ã©ããªããŒã«ãäœãã®ããæ±ºããŸãããã
ããã°ã®èšäºãªã©ã§ãå°è±¡ã匷ãããããã«åçã«éäžç·ãåæãããŠããããããããåçããºãŒã ããããã«äœæãé£ç¶ã§äœ¿ããããããŠããã®ãèŠãããšãããŸããããä»åã¯ããããªéäžç·ä»ãã®ç»åãèªåã§çæããããŒã«ãäœã£ãŠã¿ãŸãã
ãã®èšäºã§èª¬æããããŒã«ã§å å·¥ã§ããéäžç·ã远å ããç»åã®äŸ
äœæããéäžç·ããŒã«ã®ä»æ§ãç°¡åã«ãŸãšããŠã¿ãŸãã
- å å·¥ãããç»åãã¢ããããŒãã§ãã
- ç»åã®å³äžã«ã³ããŒã©ã€ãã®æåãéããããšãã§ãã
- ç»åã®äžå¿ã«åããŠéäžç·ãéããïŒåæããïŒããšãã§ãã
- ç»åã®äžå¿ã«åããŠãºãŒã ã«ãªãããã«ä»»æã®ææ°ã«åå²ããŠããªãã³ã°ã§ãã
ãªãããã®èšäºã¯ãã¹ããæžããªããéçºããã¹ã¿ã€ã«ã倧ãŸãã«èª¬æãããã®ãªã®ã§ãããŒã«ãšããŠå®å šãªãã®ã«ã¯ä»äžããŠããŸãããå®çšã«ã¯ãããã«çްãããšãããè©°ããŠããå¿ èŠãããŸãã
éäžç·ããŒã«ã®ãã¡ã€ã«æ§æ
ãã®èšäºã§äœæããéäžç·ããŒã«ã®ãã¡ã€ã«æ§æã¯ã次ã®å³ã®ããã«ãªããŸãã
å
ã»ã©PHPUnitãã€ã³ã¹ããŒã«ããtoolé
äžã«ããã¡ã€ã«ãé
眮ããŠãããŸãã
ããã©ã«ãèšå®ã§ãApacheäžã§åäœããããPHPãã¡ã€ã«ã¯ã/var/www/html/ã«é
眮ããªããã°ãªããŸãããéçºäžã®ããŒã ãã£ã¬ã¯ããªã«ãããã¡ã€ã«ããä¿®æ£ãããã³ã«ãã¹ãŠã³ããŒããã®ã¯æéãããããŸããããã§ãä»åã¯ã·ã³ããªãã¯ãªã³ã¯ãäœæããŠããŸããŸããã1ã
$ sudo ln -s /home/user1/tool/ /var/www/html/ $ chmod 755 /home/user1/ $ ls -l /var/www/html/ åèš 0 lrwxrwxrwx 1 root root 17 Xæ XX XX:XX tool -> /home/user1/tool/
ããã«ãããããŒã ãã£ã¬ã¯ããªã«ããtool/ã®äžèº«ãä¿®æ£ããã°ã/var/www/html/tool/ã«ããã®å
容ãåæ ããããã©ãŠã¶ããã¢ã¯ã»ã¹ãããšãã«ããã®å
容ãåæ ãããç¶æ
ã«ãªããŸãã
éäžç·ããŒã«ã«å¿ èŠãªãã¡ã€ã«ã®æºå
ä»åã¯æ¢åã®ãã¬ãŒã ã¯ãŒã¯ã¯äœ¿ãããç°¡åãªMVCã¢ãã«ãèªåã§çšæããŠã¿ãŸããããã§æºåããã®ã¯ã以äžã®ãã¡ã€ã«ã§ãã
index.php-
lib/âŠâŠ MVCãæ§æãããã¡ã€ã«çŸ€ -
lib/controller.phpâŠâŠ ã³ã³ãããŒã© -
lib/model.phpâŠâŠ ã¢ãã« -
lib/view.phpâŠâŠ ãã¥ãŒ -
template/index.tplâŠâŠ ãã³ãã¬ãŒã
- MVCã¢ãã«
- UIãæã€ã¢ããªã±ãŒã·ã§ã³éçºã§äœ¿ãããåºæ¬çãªã¢ãã«ãããã°ã©ã ããã¢ãã«ïŒModelïŒããã¥ãŒïŒViewïŒãã³ã³ãããŒã©ïŒControllerïŒã®3ã€ã®èŠçŽ ã«åå²ããããããããžãã¹ããžãã¯ãåºåãå ¥åãæ åœãããã
index.php
éäžç·ããŒã«ã«ã¢ã¯ã»ã¹ããã£ããšãã«ããŸãæåã«åŒã³åºãããPHPãã¡ã€ã«ã§ãããã®äžã§ControllerãåŒã³åºããexecute颿°ãå®è¡ãããŸãã
<?php require_once('lib/controller.php'); $controller = new Controller(); $controller->execute();
lib/controller.php
Controllerã§ããModelãšViewãé ã«åŒã³åºããŸãã
<?php class Controller { public function __construct() { } /** * index.phpããå®è¡ããã颿° */ public function execute() { require_once('model.php'); require_once('view.php'); $modelInstance = new Model(); $viewInstance = new View(); $data = $modelInstance->dispatch(); $viewInstance->display($data); } }
lib/model.php
Modelã§ãããã®èšäºã§ã¯ãå®éã®ç»ååŠçããžãã¯ãããã«æžããŠãããŸãã
<?php class Model { public function __construct() { } public function dispatch() { // ããŒã¿ãåŠçãã$dataã«æ ŒçŽ $data['msg'] = 'tmp'; return $data; } // åäœç¢ºèªçš public function test() { return 'test'; } }
lib/view.php
Viewã§ããModelã§åŠçãããå€ãçšããŠãã³ãã¬ãŒããåŒã³åºããŸãã
<?php class View { public function __construct() { } /** * ç»é¢ã衚瀺ãã */ public function display($data) { include('template/index.tpl'); } }
template/index.tpl
衚瀺ã«å©çšããããã³ãã¬ãŒãã§ãã
<html> <body> <?php echo $data['msg']; ?> </body> </html>
以äžã®ãã¡ã€ã«ãé 眮ãããšãtmpããšè¡šç€ºãããããŒãžãäœæãããŸããæ¬¡ã®URLã«ã¢ã¯ã»ã¹ããŠã¿ãŸãããã
http://ãµãŒãã®IPã¢ãã¬ã¹ãŸãã¯ãã¡ã€ã³/tool/
Modelå
ã§ä»®ã«äžããŠããtmpã®æåã衚瀺ãããŠããããšã確èªã§ããŸãã
ãã¹ãã«å¿ èŠãªãã¡ã€ã«ãæºå
éäžç·ããŒã«ã«å¿ èŠãªãã¡ã€ã«ã®æ¬¡ã«ã¯ããã¹ãã«å¿ èŠãªãã¡ã€ã«ã远å ããŸãã
-
phpunit.xmlâŠâŠ èšå®ãã¡ã€ã« -
tests/bootstrap.phpâŠâŠ æåã«å®è¡ãããbootstrapãã¡ã€ã« -
tests/ModelTest.phpâŠâŠ å®éã®ãã¹ãã³ãŒããèšè¿°ãããã¡ã€ã«
phpunit.xml
PHPUnitãå®è¡ããããšãã®èšå®ãXMLã§èšèŒããŸãã
ãã¹ãã³ãŒããé 眮ãããŠãããã£ã¬ã¯ããªããåŒã³åºãbootstrapãã¡ã€ã«ãæå®ããŠããŸãã
<?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" bootstrap="./tests/bootstrap.php" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" > <testsuites> <testsuite name="Application Test Suite"> <directory>./tests/</directory> </testsuite> </testsuites> </phpunit>
tests/bootstrap.php
ããããã®ãã¹ãã³ãŒãã§requireãéœåºŠèšèŒããªããŠãæžãããã«ãbootstrapãã¡ã€ã«å
ã§requireããŠããŸãããã®èšè¿°ã«ããããã¹ãã³ãŒãå
ããModelã«ãã颿°ãåŒã³åºããããã«ãªããŸãã
<?php require_once(__DIR__ . '/../lib/model.php');
tests/ModelTest.php
å®éã®ãã¹ãã³ãŒããæžããŠãããã¡ã€ã«ã§ãã
<?php class ModelTest extends PHPUnit_Framework_TestCase { public function testEqual() { $expected = 'test'; $this->assertEquals($expected, Model::test()); } }
ãã¹ãã®åäœç¢ºèª
toolãã£ã¬ã¯ããªã§PHPUnitãå®è¡ããŠã¿ãŸãããã
ãã¹ããå®è¡ããéã®ã«ã¬ã³ããã£ã¬ã¯ããªã«ããphpunit.xmlãèªãŸããããããã¹ãã®å®è¡æã«tests/bootstrap.phpãåŒã³åºããããã¹ã察象ã®lib/model.phpãèªåçã«require_onceãããä»çµã¿ã§ãã
$ ./vendor/bin/phpunit PHPUnit 3.7.38 by Sebastian Bergmann. Configuration read from /home/user1/tool/phpunit.xml . Time: 21 ms, Memory: 2.50MB OK (1 test, 1 assertion)
ããã§éçºã«å¿ èŠãªåå°ã¯å®æã§ãã
ImageMagickãæºå
ããã§ãç»åã®äœæãå å·¥ã«å¿ èŠãªãœãããŠã§ã¢ãImageMagickããã€ã³ã¹ããŒã«ããŠãããŸãã
å®éã«ã¯ãImageMagickãPHPããå©çšå¯èœã«ãããã€ãã£ãã®PHPæ¡åŒµã¢ãžã¥ãŒã«ãImagickããå©çšããŸãã
Imagickã¯ãPHPã®æ¡åŒµã¢ãžã¥ãŒã«ãæäŸããŠããPECLã§ã€ã³ã¹ããŒã«ã§ããŸãã
ããã§ããŸãPECLã䜿ããããã«ããŸããããããŠãImagickã«å¿ èŠãªImageMagickæ¬äœãããã®åäœã«å¿ èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
$ sudo yum -y install php-pear php-devel gcc ImageMagick ImageMagick-devel ImageMagick-perl
ç¶ããŠãPECLã§Imagickã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããŸãã
$ sudo pecl install imagick
Please provide the prefix of Imagemagick installation [autodetect] :ãšè¡šç€ºãããã°ããã®ãŸãŸReturnïŒEnterïŒããŒãæŒããŸãã
æåŸã«ä»¥äžã®ãããªã¡ãã»ãŒãžãåºãŠããã°æåã§ãã
Build process completed successfully Installing '/usr/lib64/php/modules/imagick.so' Installing '/usr/include/php/ext/imagick/php_imagick_shared.h' install ok: channel://pecl.php.net/imagick-3.4.3 configuration option "php_ini" is not set to php.ini location You should add "extension=imagick.so" to php.ini
ã¡ãã»ãŒãžã«ããéãã/etc/php.iniãã¡ã€ã«ã«æ¬¡ã®è¡ã远å ããŸãããã
extension=imagick.so
php.iniãã¡ã€ã«ã®ä¿®æ£ãåæ ãããŸãã
$ systemctl restart httpd.service
以äžã§ãPHPããImageMagickãå©çšã§ããããã«ãªããŸããã
éäžç·ããŒã«ã®éçº1 - ãã³ãã¬ãŒãã®è¡šç€ºã調æŽ
Modelã«ããžãã¯ã远å ããŠããåã«ãããŸãtmpããšã ã衚瀺ãããŠããç»é¢ããå®éã«ãã¡ã€ã«ãã¢ããããŒãã§ãããã©ãŒã ç»é¢ã«ããŠã¿ãŸãããã
ãã³ãã¬ãŒããä¿®æ£ããŠãã©ãŒã ãçšæ
template/index.tplãä¿®æ£ããŠç»é¢ãäœããŸãããããã©ãŒã ãçšæããã ãã®ç°¡åãªHTMLã§ãã
<html> <body> <?php echo $data['msg']; ?> <form method="post" enctype="multipart/form-data"> ç»åãã¡ã€ã« <input type="file" name="upload"> <br> å岿°ïŒ<input type="number" name="divide" value="4"><br> <button type="submit" name="submit" value="submit">Submit</button> </form> </body> </html>
ãã®ç¶æ ã§å ã»ã©ã®URLã«ã¢ã¯ã»ã¹ãããšã次ã®ããã«Modelããæž¡ãããããŒã¿ïŒãtmpããšããæååïŒãšãã©ãŒã ã衚瀺ãããŸãã
ãã®ç»é¢ããç»åãã¢ããããŒãããéäžç·ãåæããŠãæå®ã®å岿°ã§è¿ãããŒã«ãäœã£ãŠãããŸãã
Controllerã®ä¿®æ£ - POSTã®ã¿ã§ModelãåŒã³åºã
éäžç·ããŒã«ã«ã¢ã¯ã»ã¹ãããšãã«ãå¿ ãModelããæž¡ãããããŒã¿ïŒçŸåšã¯ãtmpããšããæååïŒã衚瀺ãããŠããŸããããããä»åã®ããŒã«ã®ä»æ§ããããã©ãŒã ããç»åããŒã¿ãã¢ããããŒããããå Žåã«ã®ã¿Modelãå®è¡ãããããŒã¿ãæž¡ãããã«ããŸãã
ããã§ãControllerã«å°ãæãå ããŸããå ã»ã©äœæãããã©ãŒã ã§ã¯ãPOSTã§å€ãæããŸããã€ãŸããããŒã«ãžã®æåã®ã¢ã¯ã»ã¹ã¯GETãç»åãæå®ããŠïŒ»Submitãã¿ã³ãæŒããããšãã¯POSTãšãã¡ãœããã«ãã£ãŠåŠçãåãåããããšãã§ããŸãã
ãããçšããŠãPOSTã®ã¢ã¯ã»ã¹ã®ã¿ModelãåŒã³åºãããã«ãControllerãä¿®æ£ããŸãã
<?php class Controller { public function __construct() { } /** * index.phpããå®è¡ããã颿° */ public function execute() { require_once('model.php'); require_once('view.php'); $modelInstance = new Model(); $viewInstance = new View(); if (!empty($_POST)) { $data = $modelInstance->dispatch(); } $viewInstance->display($data); } }
ãã®ç¶æ ã§å ã»ã©ã®URLãéããšãGETã®ã¢ã¯ã»ã¹ãªã®ã§Modelã¯çµç±ãããããtmpãã®è¡šç€ºãæ¶ããŸãã
ããã§ïŒ»Submitãã¿ã³ãæŒããšãPOSTã«ãªãã®ã§Modelãçµç±ããå ã»ã©ãšåæ§ã«ãtmpãã衚瀺ãããŸãã
éäžç·ããŒã«ã®éçº2 - ç»åãå å·¥ããããžãã¯ã远å
ããããæ¬é¡ãšãªãModelãéçºããç»åã®åŠçãè¡ã£ãŠãããŸããããããŠãæžãããšããã«ã€ããŠãã¹ãã³ãŒããæžããŠãããŸãããã
ãšããã§ãç»åãæ£ããå å·¥ã§ããã®ãã©ããã¯ãã©ããã£ãŠãã¹ãããã°ããã®ã§ããããïŒ æ®æ®µã¯ç»åã®ãã¹ããæžãæ©äŒããªãã®ã§èª¿ã¹ãŠã¿ãŸãããããªããªããããšãããã¹ããªæ¹æ³ãèŠã€ãããŸããã
çé¢ç®ã«ç»åãæ¯èŒããã®ã«ã¯ã³ã¹ããããããããªã®ã§ãäœãæ¥œãªææ®µãæ¢ããŠã¿ãŸãããããã£ããImagickã䜿ãã®ã ããããã®äžã«äœã䜿ããããªãã®ã¯ãªãããšæ¢ããŠã¿ããšããâŠâŠã
ãããŸããïŒ
identifyImage()ãšãã颿°ïŒãã«ãåç
§ïŒã§ãç»åã®å€§ããããã¡ã€ã«ãµã€ãºãã·ã°ããã£ãŸã§å«ããé
åãååŸã§ããã§ã¯ãããŸããããããã䜿ãã°åçŽãªé
åã®æ¯èŒã§ããããããçšæããæ£è§£ããŒã¿ã®ç»åãšãå®éã«Modelã§å å·¥ãããç»åã®æ¯èŒãã§ãããã§ãã
ç»åã®é 眮å ãçšæ
ç»åãã¢ããããŒãã§ããããã«ããŠãããŸããç»åã®ã¢ããããŒãå ã®ãã£ã¬ã¯ããªãšãå å·¥ããç»åãåºåãããã£ã¬ã¯ããªãçšæããŸãããã
ãŸãã¯ã¢ããããŒãå ã®ãã£ã¬ã¯ããªã§ãããã©ãŒã ããæããããç»åããŸãã¯ãã®ãã£ã¬ã¯ããªã«é 眮ããŸãã
$ mkdir upload $ chmod 777 upload/
åæ§ã«ãå å·¥ããç»åãé 眮ãããã£ã¬ã¯ããªãäœæããŸãã
$ mkdir output $ chmod 777 output/
ç»åãã¢ããããŒãããŠãã³ãã¬ãŒãã«è¡šç€º
ãã©ãŒã ã§æå®ããç»åãã¢ããããŒããããã®ç»åã衚瀺ãããŠã¿ãŸãã
Modelãä¿®æ£ããŸãããããã©ãŒã ã§éããããã¡ã€ã«ã®æ
å ±ã¯ã$_FILESããååŸããŸãã
<?php class Model { public function __construct() { } public function dispatch() { // ã¢ããããŒãå $uploadPath = './upload/'; // ãã¡ã€ã«å $filename = $_FILES['upload']['name']; // tmpå $tmpname = $_FILES['upload']['tmp_name']; // ãšã©ãŒ $error = $_FILES['upload']['error']; // ãã¡ã€ã«ãµã€ãº $size = $_FILES['upload']['size']; // ãšã©ãŒãç¡ãããã¡ã€ã«ãµã€ãºã0ã§ã¯ãªãå Žåã¢ããããŒã if ($error === 0 && $size > 0) { move_uploaded_file($tmpname, $uploadPath.$filename); } else { return; } // ã¢ããããŒãããç»åã詊ãã«è¡šç€º $data['msg'] = '<img src="'.$uploadPath.$filename.'" width="200">'; return $data; } }
å®éã«åäœãããŠã¿ãŸããããç»åãã¡ã€ã«ãšããŠããã¹ãçŽ æ.jpegããæå®ããŸãã
Submitãã¿ã³ãæŒããšModelãåŒã³åºãããã¢ããããŒããããç»åã衚瀺ãããŸãã
ç¡äºã«ãã¡ã€ã«ãã¢ããããŒãã§ããŸããããã£ã¬ã¯ããªå ã«ããã¡ã€ã«ãååšããŠããŸãã
$ ls -la upload/ åèš 324 drwxrwxrwx 2 user1 user1 33 Xæ XX XX:XX . drwxrwxr-x 8 user1 user1 4096 Xæ XX XX:XX .. -rw-r--r-- 1 apache apache 326299 Xæ XX XX:XX ãã¹ãçŽ æ.jpeg
ç»åã®ãµã€ãºã»åº§æšãèšç®
éäžç·ããŒã«ã®æ©èœã1ã€ãã€äœã£ãŠãããŸãã
ãŸãã¯ãç»åãæ±ãéã«ã¯æ¬ ãããªããåçš®ãµã€ãºã»åº§æšãèšç®ãã颿°ãçšæããŸããå ã®ç»åã®çžŠæšªã®ãµã€ãºãå ã«ãæå®ããæ°ã§åå²ããç»åã®çžŠæšªãµã€ãºãšãå ç»åããåãåãåºæºãšãªã座æšãèšç®ããŠè¿ããŸãã
äœã颿°ã¯çæããç»åã®å€§ãããèšç®ãã颿°ãçæããç»åã®åãåãéå§äœçœ®ãèšç®ãã颿°ã«å ããã®2ã€ãå©çšããŠããŒã«ã§å¿ èŠãªãµã€ãºã»åº§æšã®èšç®ããã颿°ã®èš3ã€ã§ãã
ããžãã¯ãæžãåºãåã«ããã¹ããäœã£ãŠã¿ãŸããããå®éã«æåŸ ããå€ã¯çŽã§èšç®ããŠç®åºããããã®ãçšããŠãã¹ããæžããŠã¿ãŸãã
ãŸããäžã€ç®ã®çæããç»åã®å€§ãããèšç®ãã颿°ã§ãã以äžã®ãããªé¢æ°ãäœãããšæããŸãã
/** * çæããç»åã®å€§ãã * @param int $size å ã®å€§ãã * @param int $divide å岿° * @param int $num åå²ã®äœæç®ãªã®ãã®ã€ã³ããã¯ã¹çªå· * @return int or double $dispSize çæããç»åã®å€§ãã */
ç»åãµã€ãºãªã©ã®ãã¹ãã³ãŒãã®äœæ
ãã®ä»æ§ã«åºã¥ããæåŸ ããå€ãåãããã¹ããäœããŸãã
<?php class ModelTest extends PHPUnit_Framework_TestCase { /** * @test */ public function getDisplaySize_å ã®å€§ããã180ãå岿°ã3ã1æç®ã®å Žåã倧ããã90() { $expected = 90; $this->assertEquals($expected, Model::getDisplaySize(180, 3, 0)); } /** * @test */ public function getDisplaySize_å ã®å€§ããã180ãå岿°ã3ã2æç®ã®å Žåã倧ããã135() { $expected = 135; $this->assertEquals($expected, Model::getDisplaySize(180, 3, 1)); } /** * @test */ public function getDisplaySize_å ã®å€§ããã180ãå岿°ã3ã3æç®ã®å Žåã倧ããã180() { $expected = 180; $this->assertEquals($expected, Model::getDisplaySize(180, 3, 2)); } }
ãããŸã§ã®ç¶æ ã§ã¯ããŸã Modelã«é¢æ°ãååšããªãã®ã§ããã¹ããå®è¡ãããšãã®ããã«å€±æããŸãã
$ ./vendor/bin/phpunit PHPUnit 3.7.38 by Sebastian Bergmann. Configuration read from /home/user1/tool/phpunit.xml PHP Fatal error: Call to undefined method Model::getDisplaySize() in /home/user1/tool/tests/ModelTest.php on line 10
Modelã«ããžãã¯ã远å
ãã®é¢æ°ãModelã«è¿œå ããŠã¿ãŸãã
/** * çæããç»åã®å€§ãã * @param int $size å ã®å€§ãã * @param int $divide å岿° * @param int $num åå²ã®äœæç®ãªã®ãã®ã€ã³ããã¯ã¹çªå· * @return int or double $dispSize çæããç»åã®å€§ãã */ public function getDisplaySize($size, $divide, $num) { $dispSize = $size * 1 / 2 + $size * 1 / 2 * 1 / ($divide - 1) * $num; return $dispSize; }
å床ãã¹ããå®è¡ããŠã¿ãŸãã
$ ./vendor/bin/phpunit PHPUnit 3.7.38 by Sebastian Bergmann. Configuration read from /home/user1/tool/phpunit.xml ... Time: 22 ms, Memory: 2.50MB OK (3 tests, 3 assertions)
ç¡äºã«ãã¹ããééããŸããã
ä»ã®2ã€ã®åŠçã®ãã¹ããšããžãã¯ã远å
ãã®èŠé ã§ãä»ã®2ã€ã®é¢æ°ã®ãã¹ããšããžãã¯ãæžããŠãããŸãã
ãã¹ãã³ãŒãã¯ãã®ããã«æžããŸããã
/** * @test */ public function getDisplayPosition_å ã®å€§ããã180ãçæããç»åã®å€§ããã90ã®å Žåãéå§äœçœ®ã45() { $expected = 45; $this->assertEquals($expected, Model::getDisplayPosition(180, 90)); } /** * @test */ public function getDisplayPosition_å ã®å€§ããã180ãçæããç»åã®å€§ããã135ã®å Žåãéå§äœçœ®ã22ïŒ5() { $expected = 22.5; $this->assertEquals($expected, Model::getDisplayPosition(180, 135)); } /** * @test */ public function getDisplayPosition_å ã®å€§ããã180ãçæããç»åã®å€§ããã180ã®å Žåãéå§äœçœ®ã0() { $expected = 0; $this->assertEquals($expected, Model::getDisplayPosition(180, 180)); } /** * @test */ public function calcImage_å ã®ç»åã®å¹ ã250ãå ã®ç»åã®é«ãã150ãå岿°ã3ã1æç®ã®å Žåã®ããŒã¿() { $expected = array('width' => 250, 'height' => 150, 'dispWidth' => 125.0, 'dispHeight' => 75.0, 'dispX' => 62.5, 'dispY' => 37.5); $this->assertEquals($expected, Model::calcImage(250, 150, 3, 0)); } /** * @test */ public function calcImage_å ã®ç»åã®å¹ ã250ãå ã®ç»åã®é«ãã150ãå岿°ã3ã2æç®ã®å Žåã®ããŒã¿() { $expected = array('width' => 250, 'height' => 150, 'dispWidth' => 187.5, 'dispHeight' => 112.5, 'dispX' => 31.25, 'dispY' => 18.75); $this->assertEquals($expected, Model::calcImage(250, 150, 3, 1)); } /** * @test */ public function calcImage_å ã®ç»åã®å¹ ã250ãå ã®ç»åã®é«ãã150ãå岿°ã3ã3æç®ã®å Žåã®ããŒã¿() { $expected = array('width' => 250, 'height' => 150, 'dispWidth' => 250.0, 'dispHeight' => 150.0, 'dispX' => 0.0, 'dispY' => 0.0); $this->assertEquals($expected, Model::calcImage(250, 150, 3, 2)); }
Modelã®ããžãã¯ã¯ä»¥äžã®éãã§ãã
/** * çæããç»åã®åãåãéå§äœçœ® * @param int $size å ã®å€§ãã * @param int $dispSize çæããç»åã®å€§ãã * @return int or double $dispPosition çæããç»åã®åãåãéå§äœçœ® */ public function getDisplayPosition($size, $dispSize) { $dispPosition = ($size - $dispSize) * 1 / 2; return $dispPosition; } /** * ãµã€ãºã»åº§æšã®èšç® * @param int $width å ç»åã®å¹ * @param int $height å ç»åã®é«ã * @param int $divide å岿° * @param int $num åå²ã®äœæç®ãªã®ãã®ã€ã³ããã¯ã¹çªå· * @return array $imageData */ public function calcImage($width, $height, $divide, $num) { $imageData = array(); // å ç»åã®å¹ $imageData['width'] = $width; // å ç»åã®é«ã $imageData['height'] = $height; // 衚瀺ããç»åã®å¹ $imageData['dispWidth'] = Model::getDisplaySize($width, $divide, $num); // 衚瀺ããç»åã®é«ã $imageData['dispHeight'] = Model::getDisplaySize($height, $divide, $num); // 衚瀺ããç»åãåãåãXåº§æš $imageData['dispX'] = Model::getDisplayPosition($width, $imageData['dispWidth']); // 衚瀺ããç»åãåãåãYåº§æš $imageData['dispY'] = Model::getDisplayPosition($height, $imageData['dispHeight']); return $imageData; }
åå²ããç»åãçæ
ãããŸã§ã®é¢æ°ã䜿ããç»åãä»»æã®å岿°ã«å¿ããŠç»åãçæããŠã¿ãŸããããImagickã䜿ãã瞊暪ã®å€§ãããååŸããããç»åãã¯ãããã³ã°ããŠæžãåºããè¡ã£ãŠããŸãã
$image = new Imagick($uploadPath.$filename);
// å
ã®ç»åãµã€ãºãImagickã®é¢æ°ã§ååŸ
$width = $image->getImageWidth();
$height = $image->getImageHeight();
$image->clear();
for ($i = 0; $i < $divide; $i++) {
$imageData = $this->calcImage($width, $height, $divide, $i);
$tmpImage = new Imagick($uploadPath.$filename);
$tmpImage->cropImage($imageData['dispWidth'], $imageData['dispHeight'], $imageData['dispX'], $imageData['dispY']);
$tmpImage->writeImage(__DIR__ . '/../output/'.preg_replace('/(.+)(\.[^.]+$)/', '$1', $filename).'_'.$i.'.jpg');
$tmpImage->clear();
$data['msg'] = '<img src="./output/'.preg_replace('/(.+)(\.[^.]+$)/', '$1', $filename).'_'.$i.'.jpg" width="300"><br>' . $data['msg'];
}
ããã§éäžç·ããŒã«ã®ç»é¢ã確èªããŠã¿ãŸãããã
æå®å岿°ã®4æã«åããŠãç»åã®äžå¿ã«åãã£ãŠãºãŒã ããŠããé£ç¶ç»åãã§ããŸããã
ãªãããã®åŠçã§åŒã³åºããŠãã颿°ã®ãã¹ãã¯æ¢ã«æžããŠããã®ã§ããã¹ãã¯çç¥ããŸãã
ç»åã«ã³ããŒã©ã€ãã远å
次ã¯ç»åã®å³äžã«ã³ããŒã©ã€ãã远å ããŠã¿ãŸãããã
æåã¯ImagickDrawã§è¿œå ããããšãã§ããŸããåè§æåã§ããã°ããã©ã«ãã®ãŸãŸã§åé¡ãããŸããããå šè§æåãæ±ãããå Žåã¯å šè§æåã«å¯Ÿå¿ãããã©ã³ããã¡ã€ã«ãçšæããŸãããã
åã蟌ãæååããã©ã³ããµã€ãºãè²ãæå®ããqueryFontMetrics()ã«ãŠååŸå¯èœãªåã蟌ãæåã®ãµã€ãºãå
ã«ãæåãé
眮ããéå§åº§æšãæå®ããŠæç»ããŸãã
çæãããç»åã¯ãä»åã¯imgã¿ã°ã®widthã«ãã£ãŠè¡šç€ºããç»åã®å€§ãããçµ±äžãããŠããŸãããã®ããããã©ã³ããµã€ãºããã®çž®å°ºã«åãããããšã§ãç»åã«ãã£ãŠæåã®å€§ããã«ã°ãã€ããåºãªãããã«ããŠããŸãã$xã$yãæ±ããŠããéã®äœçœèª¿æŽã§ã宿°å€ã§ã¯ãªããã©ã³ããµã€ãºãå
ã«å€ãåºããŠããã®ãããã®çž®å°ºã«æããããã§ãã
/** * ã³ããŒã©ã€ãã远å * @param imagick $image * @param array $imageData calcImage()ã§èšç®ããçµæ * @return imagick */ public function addCopyright($image, $imageData) { $text = '(C)ikenyal'; $draw = new ImagickDraw(); $fontSize = (int)(32 * $imageData['dispWidth'] / $imageData['width']); $draw->setFontSize($fontSize); $draw->setFillColor('#ff0000'); $metrics = $image->queryFontMetrics($draw, $text); $x = $imageData['dispWidth'] - $metrics['textWidth'] + $imageData['dispX'] - $fontSize * 0.5; $y = $imageData['dispHeight'] - $metrics['textHeight'] + $imageData['dispY'] + $fontSize * 0.5; $draw->annotation($x, $y, $text); $image->drawImage($draw); return $image; }
cropImage()ãšwriteImage()ã®éã§ãã®é¢æ°ãåŒã³åºããŸãããã
$tmpImage = $this->addCopyright($tmpImage, $imageData);
ã³ããŒã©ã€ãã®ãã¹ãã³ãŒãã®äœæ
ã³ããŒã©ã€ãã远å ãã颿°ã®ãã¹ããæžããŠã¿ãŸãããã
ãã®é¢æ°ã®ãã¹ãã¯æ¥œããŠäœã£ãŠããŸãããšæããŸããã³ããŒã©ã€ãå ¥ãã®ç»åã¯ãããžãã¯ãå ã«æžããŠå®éã«ãããå®è¡ããŠçæããããã®ãæ£è§£ããŒã¿ãšããŸããååã«ãã¡ããšç®èŠç¢ºèªããããŒã¿ãæ£è§£ããŒã¿ãšããŠä¿åããŠãããä»åŸäœãã®æ¹ä¿®æã«ç°ãªãã¢ãŠããããã«ãªã£ãŠããªããããã¹ãã§ç¢ºèªããããã«ããŸãã
testsãã£ã¬ã¯ããªã®äžã«ãã¹ãçšã®ç»åãé
眮ããimagesãã£ã¬ã¯ããªãäœæããŸãã
$ mkdir tests/images/
Modelå
ã§$imagesDataãprint_r()ã§è¡šç€ºããŠãã®å€ãæ§ããããã«å¯Ÿå¿ããã¢ãŠãããããããç»åãtests/images/ã«ã³ããŒããŠãããŸãã
identifyImage()ã§ç»åããŒã¿ãè§£éãããç¶æ
ã§é
åãšããŠè¿ãããã®ã§ããã®æ¯èŒãè¡ãã ãã§ç»åãåããã®ãªã®ã倿ã§ããããã«ããŠããŸãããªãããã¡ã€ã«åã¯ãã¡ããç°ãªãã®ã§ãidentifyImage()ã§ååŸãããimageNameã¯æå³çã«ç©ºã«ããŠããŸãã
/** * @test */ public function addCopyright_ã³ããŒã©ã€ããæ£ãã远å ãããŠããã() { // æ£è§£ããŒã¿ $expectedImage = new Imagick(__DIR__.'/images/withCopyright.jpg'); $expectedIdent = $expectedImage->identifyImage(); $expectedImage->clear(); // addCopyright()ãå®è¡ããŠãã®çµæãäžæä¿å $image = new Imagick(__DIR__.'/images/test.jpg'); $imageData = array('width' => 1024, 'height' => 768, 'dispWidth' => 1024, 'dispHeight' => 768, 'dispX' => 0, 'dispY' => 0); $image = Model::addCopyright($image, $imageData); $image->writeImage(__DIR__.'/images/test_after.jpg'); $image->clear(); // äžæä¿åãããç»åããŒã¿ $image = new Imagick(__DIR__.'/images/test_after.jpg'); $ident = $image->identifyImage(); $image->clear(); unlink(__DIR__.'/images/test_after.jpg'); // ãã¡ã€ã«åã¯ç°ãªãã®ã§æå³çã«ç©ºã«ãã $expectedIdent['imageName'] = ''; $ident['imageName'] = ''; $this->assertEquals($expectedIdent, $ident); }
ããã§ãã¹ãã§ç»åã®æ¯èŒãããããã«ã§ããŸããã
$ ./vendor/bin/phpunit PHPUnit 3.7.38 by Sebastian Bergmann. Configuration read from /home/user1/tool/phpunit.xml .......... Time: 542 ms, Memory: 2.50MB OK (10 tests, 10 assertions)
詊ãã«ãã³ããŒã©ã€ãã®æèšãäžæåæ¶ããŠãã¹ãããŠã¿ããšãã®ããã«æ€ç¥ã§ããŸãã
$ ./vendor/bin/phpunit PHPUnit 3.7.38 by Sebastian Bergmann. Configuration read from /home/user1/tool/phpunit.xml .........F Time: 556 ms, Memory: 2.75MB There was 1 failure: 1) ModelTest::addCopyright_ã³ããŒã©ã€ããæ£ãã远å ãããŠããã Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ 'compression' => 'JPEG' - 'fileSize' => '299KB' + 'fileSize' => '300KB' 'geometry' => Array (...) 'resolution' => Array (...) - 'signature' => '73a4afa50bf0e0fa6faa6d46c7288d765947c4f70375fd68cfc0a2be69b2c8b1' + 'signature' => 'eb3b380031a846d689602635c2cc88f8e910a72061cd9e81e61c5d7e48d6fcd6' ) /home/user1/tool/tests/ModelTest.php:127 FAILURES! Tests: 10, Assertions: 10, Failures: 1.
ç»åãç°ãªãã°ããã¡ã€ã«ãµã€ãºãã·ã°ããã£ã®å€ãç°ãªãã®ã§æ€ç¥ã§ããŸãã
ç»åã«éäžç·ãåæ
æåŸã«ãéäžç·ãéããŠã¿ãŸããéäžç·ã¯ããã³ãã»ã³ã¢ã³ãºã®çŽ æã©ã€ãã©ãªãŒã«ããç»åãå©çšãããŠããããŸããã
ããŠã³ããŒãããçŽ æããscpã³ãã³ããªã©ã§ãµãŒãã«ã¢ããããŒãããŠãããŸãã
ä»åã¯ãtool/linework.pngãšããŠé
眮ããŸããããã®ç»åãåæãã颿°ã远å ããŸãã
/** * éäžç·ã远å * @param imagick $image * @param array $imageData calcImage()ã§èšç®ããçµæ * @return imagick */ public function addLinework($image, $imageData) { $frameImage = new Imagick(__DIR__ . '/../linework.png'); $frameImage->scaleimage($imageData['dispWidth'], $imageData['dispHeight']); $image->compositeImage($frameImage, imagick::COMPOSITE_DEFAULT, 0, 0); return $image; }
addCopyright()ã®åã«ããã®addLinework()ã®åŠçãå®è¡ãããŸãã
$tmpImage = $this->addLinework($tmpImage, $imageData);
å®è¡ããŠã¿ãŸãããã
éäžç·ã®ãã¹ãã³ãŒãã®äœæ
éäžç·ã®åæåŠçããã³ããŒã©ã€ããšåæ§ã«ãã¹ããæžããŠãããŸãããã
/** * @test */ public function addLinework_éäžç·ãæ£ãã远å ãããŠããã() { // æ£è§£ããŒã¿ $expectedImage = new Imagick(__DIR__.'/images/withLinework.jpg'); $expectedIdent = $expectedImage->identifyImage(); $expectedImage->clear(); // addCopyright()ãå®è¡ããŠãã®çµæãäžæä¿å $image = new Imagick(__DIR__.'/images/test.jpg'); $imageData = array('width' => 1024, 'height' => 768, 'dispWidth' => 1024, 'dispHeight' => 768, 'dispX' => 0, 'dispY' => 0); $image = Model::addLinework($image, $imageData); $image->writeImage(__DIR__.'/images/test_linework_after.jpg'); $image->clear(); // äžæä¿åãããç»åããŒã¿ $image = new Imagick(__DIR__.'/images/test_linework_after.jpg'); $ident = $image->identifyImage(); $image->clear(); unlink(__DIR__.'/images/test_linework_after.jpg'); // ãã¡ã€ã«åã¯ç°ãªãã®ã§æå³çã«ç©ºã«ãã $expectedIdent['imageName'] = ''; $ident['imageName'] = ''; $this->assertEquals($expectedIdent, $ident); }
ããã§åºæ¬çãªæ©èœã®ãã¹ããçšæã§ããã®ã§ãä»åŸModelãä¿®æ£ãããšãã«ã¯å®å¿ããŠãœãŒã¹ããããããšãã§ããŸãã
åäœç¢ºèªããŠã¿ãã
æåŸã«ãå®éã«ç»åã䜿ã£ãŠåäœç¢ºèªãããŠã¿ãŸãããããã³ã®ç»åãçšæããŠãããŒã«ã«ã¢ããããŒãããŠã¿ãŸããã
è¿«åãããŸããã
ã¿ãªããããèªåãäœæããããŒã«ã«æè¿ãªäººç©ãåç©ã®åçãã¢ããããŒãããŠã¿ãŠãã ããã
ãããã«
ãã¹ãã³ãŒããæžããªãããç°¡åãªç»åå å·¥ããŒã«ãäœã£ãŠã¿ãŸããããã®èšäºã§äœæãããœãŒã¹ã³ãŒãçã®å šäœã¯äžèšã®URLããå ¥æã§ããŸãã
ãã®éäžç·ããŒã«ããµãŒãã¹ãšããŠæäŸããã«ã¯ããããããšæ°ãä»ããªããšãããªãããšããããŸããäŸãã° uploadãã£ã¬ã¯ããªã«ã¢ããããŒããããç»åãåé€ããåŠçããããŸããããã®ãŸãŸãªãªãŒã¹ãããããã€ãã¯ãã£ã¹ã¯å®¹éãé£ã朰ããŠããŸãã§ãããã
è匱æ§ã«ã泚æ
è匱æ§ãå«ãŸãªããµãŒãã¹ã«ããããã«æ°ãé ãå¿ èŠããããŸããäžç¹å®å€æ°ã®å©çšè ãä»»æã®ãã¡ã€ã«ãã¢ããããŒãã§ãããšããããšã¯ãè匱æ§ãçã¿åºãå¯èœæ§ãæã¡åãããããšã«ãªããŸããã¢ããããŒãã§ããæ¡åŒµåãå¶éãããããã¡ã€ã«ãµã€ãºã®å¶éãå®ããããæ»æããããªãããã«ããããæ°ãä»ããŸãããã
ImageMagickèªäœã®è匱æ§ãèŠã€ããããšãããã®ã§ããã®éã«ã¯ImageMagickã®ã¢ããããŒããæ©æ¥ã«è¡ãå¿ èŠããããŸãããµãŒãã¹ãæäŸããå Žåã«ã¯ããã®ãããªããšãæèããå¿ èŠããããŸãã
èªåãã¹ããšãããã€
ä»åã¯ãã¹ãã³ãŒããæžããŠæåã§å®è¡ããŠããŸããããJenkinsãªã©ã§èªåçã«ãã¹ããå®è¡ããç°å¢ãäœã£ãŠãããŸãããã
ãŸãããããã€ã«é¢ããå 容ã玹ä»ããŠããªãã®ã§ãã·ã³ããªãã¯ãªã³ã¯ã§ã²ãšãŸãåãããŸããããµãŒãã¹ãšããŠæäŸããå Žåã¯ãã®ããæ¹ã§ã¯ãªãããã¡ããšãããããã€ã®ææ®µãçšããå¿ èŠããããŸãããããã€ã«é¢ããŠã¯æ©äŒãããã°ç¶ç·šãæžããããšæããŸãã
å·çè
æ± ç°å¥äººïŒããã ã»ãããšïŒ @ikenyal
ç·šéïŒèäºåæ¥ïŒZINEïŒ
*1:
*2:ãšã³ãžãã¢ãšèäœæš©ãªã©æ³åŸãšã®é¢ä¿ã«ã€ããŠã¯ããšã³ãžãã¢Hubã«æ²èŒãããããªãã®ã³ãŒããéæ³ããïŒ ãšã³ãžãã¢ãç¥ããããåŒè·å£«ãæããèäœæš©ãšéçºå¥çŽã®æ³ç¥èãïŒhttps://eh-career.com/engineerhub/entry/2017/07/27/110000ïŒã®èšäºãªã©ãåç §ããŠãã ããã
ãããã€ã®æ¹æ³ãèªååã«é¢ããŠã¯ä»åã®èšäºã§ã¯å²æããŸãããæ©äŒãããã°æ¬¡å以éã«ç޹ä»ããããšæããŸããâ©
ãšã³ãžãã¢ãšèäœæš©ãªã©æ³åŸãšã®é¢ä¿ã«ã€ããŠã¯ããšã³ãžãã¢Hubã«æ²èŒãããããªãã®ã³ãŒããéæ³ããïŒ ãšã³ãžãã¢ãç¥ããããåŒè·å£«ãæããèäœæš©ãšéçºå¥çŽã®æ³ç¥èãã®èšäºãªã©ãåç §ããŠãã ãããâ©




