jaws20140117

34
Copyright © 2014 AGREX INC. チャラチャッチャチャラッチャー でちょっと良いものができた話 14118日土曜日

Upload: masashi-terui

Post on 31-May-2015

249 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Jaws20140117

Copyright © 2014 AGREX INC.

チャラチャッチャチャラッチャーでちょっと良いものができた話

14年1月18日土曜日

Page 2: Jaws20140117

Copyright © 2014 AGREX INC. 2

まず、ごめんなさい

14年1月18日土曜日

Page 3: Jaws20140117

Copyright © 2014 AGREX INC. 2

まず、ごめんなさい

素晴らしいお話の数々の後では、完全にお耳汚しですw

14年1月18日土曜日

Page 4: Jaws20140117

Copyright © 2014 AGREX INC. 3

プロフィールてるい まさし

照井 将士http://www.facebook.com/marcy.terui

(株)アグレックス 札幌事業所 システム部

AWS Certified Solutions Architect

1987年 東京都大田区生まれ1992年 札幌移住2011年  (株)アグレックス入社

役職:下っ端・雑用係

好きなサービスRoute53、CloudWatch、RDS(MySQL)

14年1月18日土曜日

Page 5: Jaws20140117

Copyright © 2014 AGREX INC. 3

プロフィールてるい まさし

照井 将士http://www.facebook.com/marcy.terui

(株)アグレックス 札幌事業所 システム部

AWS Certified Solutions Architect

1987年 東京都大田区生まれ1992年 札幌移住2011年  (株)アグレックス入社

役職:下っ端・雑用係

好きなサービスRoute53、CloudWatch、RDS(MySQL)

14年1月18日土曜日

Page 6: Jaws20140117

Copyright © 2014 AGREX INC. 3

プロフィールてるい まさし

照井 将士http://www.facebook.com/marcy.terui

(株)アグレックス 札幌事業所 システム部

AWS Certified Solutions Architect

1987年 東京都大田区生まれ1992年 札幌移住2011年  (株)アグレックス入社

役職:下っ端・雑用係

好きなサービスRoute53、CloudWatch、RDS(MySQL)

14年1月18日土曜日

Page 7: Jaws20140117

Copyright © 2014 AGREX INC. 3

プロフィールてるい まさし

照井 将士http://www.facebook.com/marcy.terui

(株)アグレックス 札幌事業所 システム部

AWS Certified Solutions Architect

1987年 東京都大田区生まれ1992年 札幌移住2011年  (株)アグレックス入社

役職:下っ端・雑用係

好きなサービスRoute53、CloudWatch、RDS(MySQL)

AWSチームリーダーにクラスアップしました!※注 現状1人チームだからリーダーなだけw

14年1月18日土曜日

Page 8: Jaws20140117

Copyright © 2014 AGREX INC. 4

とある問題がありました。

14年1月18日土曜日

Page 9: Jaws20140117

Copyright © 2014 AGREX INC. 4

とある問題がありました。

アカウントが増えてきて、CloudWatchのアラート状況の把握が難しくなってきた。

14年1月18日土曜日

Page 10: Jaws20140117

Copyright © 2014 AGREX INC. 4

とある問題がありました。

アカウントが増えてきて、CloudWatchのアラート状況の把握が難しくなってきた。コンソールからは当然アカウント単位でしか見れない。でも、データストアとか監視サーバの管理しなくて良いし、アカウント単位で誰かに見せたくなったらIAMユーザ使ったりできて良い所も一杯あるから、辞めてZabbixに集約とかっていうのも微妙なんですよね~

14年1月18日土曜日

Page 11: Jaws20140117

Copyright © 2014 AGREX INC. 5

ウチにはこんな子が居ます。

ウチの警子ちゃんhttp://www.isa-j.co.jp/keiko-10th/index[1].html

14年1月18日土曜日

Page 12: Jaws20140117

Copyright © 2014 AGREX INC. 5

ウチにはこんな子が居ます。

ウチの警子ちゃんhttp://www.isa-j.co.jp/keiko-10th/index[1].htmlピピピピ

CloudWatchのアラームが上がると…

14年1月18日土曜日

Page 13: Jaws20140117

Copyright © 2014 AGREX INC. 5

ウチにはこんな子が居ます。

ウチの警子ちゃんhttp://www.isa-j.co.jp/keiko-10th/index[1].htmlピピピピ

なんで鳴ってるの…?アラートメールどこ行った??

CloudWatchのアラームが上がると…

14年1月18日土曜日

Page 14: Jaws20140117

Copyright © 2014 AGREX INC. 6

ということで

クロスアカウントで、アラーム状態を集約して見られるダッシュボード的なものが欲しい!

14年1月18日土曜日

Page 15: Jaws20140117

Copyright © 2014 AGREX INC. 7

ということで

作ってみました。

14年1月18日土曜日

Page 16: Jaws20140117

Copyright © 2014 AGREX INC. 8

どんな感じで作った?

こんな感じです。

14年1月18日土曜日

Page 17: Jaws20140117

Copyright © 2014 AGREX INC. 9

ミュージックスタート!古いって言わないでwww

14年1月18日土曜日

Page 18: Jaws20140117

Copyright © 2014 AGREX INC. 9

ミュージックスタート!古いって言わないでwww

右左

                      ォ"               __,,,.. 、 `、                     チ,,     _,,..、"" ,,,ィェェォーン`''" 、 ヾ  ヽ、                    イ;;: :./~`''"   ‾‾ ¨ ¨`リ、"ヾ、  、 、  ヽ                    f;;::/            ミヾ  ヽ  、 、  .}

.                    ∨ .::::...         ミ       、 、 ;'i

.                     { ..:;::..         ミ゛       、 、', .}

                   ,ァ'ー-、:{i:t,,..--'"`ヽ、`ヽ:::::`ヾ、      `  、', }

                  '"''t--=ゞ、`ー三''"‾`  `::::  |         、',. .|

                    无エニ=/ ::(アエエ=-、_,.:::   |     y=、   .リ                    广;;''/  ::.`ー  ''"~   ::. |  チ''" ィ''ヾヽ  リ                    { .::/ .....::、     .......::::::: |  / , 、ヾ ノ /  ,'

                    `、 ( ,zzュ,,リ:.   ....:::::::::  | / r' イ='./ /  ,'

                     |,ィエェエta、 :::.  ..::::.    | .|::("'´゛./ ,/

                    キ'"、__`ヾッ, ::       ~´;;;;`ーイ   ,'

              ,,,..ィ==t、   `、¨`ー'"ア"::.. ..::::::    /;;;    :|  ,'

             以zzt、;;;;`、  ヾ、,,,;:'"....;;;;;;..::::    /;;;;;     :| .,'

             f三三~`,,`、}   |i |;;;ミ      ,,.イ;;;;;;;;;      :| ,'

             〉==- 、三;/   {ヾt;;;ミ_,,,,,.ィツ;;;;;;;;;;;;;;;;       ツ_             /   `ヾナ   `ー====マ-''";;;;;;;;;;;;         ∨` i

.           /    ./         リt;;;;;;;;; ::::         /  `t、           /     /.         / :i;;;;::....         /    / `、.          /     /        ,. ィ"i  `、;;;::       ,.イ      /   ヽ、         /     /     ,. - '"   |   `、;:    ,. イ        /     `ー       /~\  ,... /,. - ' "      /-- .、  〉-r''"         /

    ,. ィ''",,.. 、  `Y  |"          f:::::::::__/`ー-ナ--――-ァ   /,'

  r'"‾    `ヽ、!、 〉          {::::::ー''リ、;;;;チ`ー=ニ_::::::/  / ./

  {,,.. =---''`ヽ、`}:: .{           ',::::::::::/~`、ヾ`ヽ,,::: /  / ,'

チャラチャッチャチャラッチャ~♪

14年1月18日土曜日

Page 19: Jaws20140117

Copyright © 2014 AGREX INC. 9

ミュージックスタート!古いって言わないでwww

(((((【右から】c(・ェ・c`)三(´っ・ェ・)っ((((((【左へ】受け流す~♪ 

右左

                      ォ"               __,,,.. 、 `、                     チ,,     _,,..、"" ,,,ィェェォーン`''" 、 ヾ  ヽ、                    イ;;: :./~`''"   ‾‾ ¨ ¨`リ、"ヾ、  、 、  ヽ                    f;;::/            ミヾ  ヽ  、 、  .}

.                    ∨ .::::...         ミ       、 、 ;'i

.                     { ..:;::..         ミ゛       、 、', .}

                   ,ァ'ー-、:{i:t,,..--'"`ヽ、`ヽ:::::`ヾ、      `  、', }

                  '"''t--=ゞ、`ー三''"‾`  `::::  |         、',. .|

                    无エニ=/ ::(アエエ=-、_,.:::   |     y=、   .リ                    广;;''/  ::.`ー  ''"~   ::. |  チ''" ィ''ヾヽ  リ                    { .::/ .....::、     .......::::::: |  / , 、ヾ ノ /  ,'

                    `、 ( ,zzュ,,リ:.   ....:::::::::  | / r' イ='./ /  ,'

                     |,ィエェエta、 :::.  ..::::.    | .|::("'´゛./ ,/

                    キ'"、__`ヾッ, ::       ~´;;;;`ーイ   ,'

              ,,,..ィ==t、   `、¨`ー'"ア"::.. ..::::::    /;;;    :|  ,'

             以zzt、;;;;`、  ヾ、,,,;:'"....;;;;;;..::::    /;;;;;     :| .,'

             f三三~`,,`、}   |i |;;;ミ      ,,.イ;;;;;;;;;      :| ,'

             〉==- 、三;/   {ヾt;;;ミ_,,,,,.ィツ;;;;;;;;;;;;;;;;       ツ_             /   `ヾナ   `ー====マ-''";;;;;;;;;;;;         ∨` i

.           /    ./         リt;;;;;;;;; ::::         /  `t、           /     /.         / :i;;;;::....         /    / `、.          /     /        ,. ィ"i  `、;;;::       ,.イ      /   ヽ、         /     /     ,. - '"   |   `、;:    ,. イ        /     `ー       /~\  ,... /,. - ' "      /-- .、  〉-r''"         /

    ,. ィ''",,.. 、  `Y  |"          f:::::::::__/`ー-ナ--――-ァ   /,'

  r'"‾    `ヽ、!、 〉          {::::::ー''リ、;;;;チ`ー=ニ_::::::/  / ./

  {,,.. =---''`ヽ、`}:: .{           ',::::::::::/~`、ヾ`ヽ,,::: /  / ,'

チャラチャッチャチャラッチャ~♪

14年1月18日土曜日

Page 20: Jaws20140117

Copyright © 2014 AGREX INC. 9

ミュージックスタート!古いって言わないでwww

右左

                      ォ"               __,,,.. 、 `、                     チ,,     _,,..、"" ,,,ィェェォーン`''" 、 ヾ  ヽ、                    イ;;: :./~`''"   ‾‾ ¨ ¨`リ、"ヾ、  、 、  ヽ                    f;;::/            ミヾ  ヽ  、 、  .}

.                    ∨ .::::...         ミ       、 、 ;'i

.                     { ..:;::..         ミ゛       、 、', .}

                   ,ァ'ー-、:{i:t,,..--'"`ヽ、`ヽ:::::`ヾ、      `  、', }

                  '"''t--=ゞ、`ー三''"‾`  `::::  |         、',. .|

                    无エニ=/ ::(アエエ=-、_,.:::   |     y=、   .リ                    广;;''/  ::.`ー  ''"~   ::. |  チ''" ィ''ヾヽ  リ                    { .::/ .....::、     .......::::::: |  / , 、ヾ ノ /  ,'

                    `、 ( ,zzュ,,リ:.   ....:::::::::  | / r' イ='./ /  ,'

                     |,ィエェエta、 :::.  ..::::.    | .|::("'´゛./ ,/

                    キ'"、__`ヾッ, ::       ~´;;;;`ーイ   ,'

              ,,,..ィ==t、   `、¨`ー'"ア"::.. ..::::::    /;;;    :|  ,'

             以zzt、;;;;`、  ヾ、,,,;:'"....;;;;;;..::::    /;;;;;     :| .,'

             f三三~`,,`、}   |i |;;;ミ      ,,.イ;;;;;;;;;      :| ,'

             〉==- 、三;/   {ヾt;;;ミ_,,,,,.ィツ;;;;;;;;;;;;;;;;       ツ_             /   `ヾナ   `ー====マ-''";;;;;;;;;;;;         ∨` i

.           /    ./         リt;;;;;;;;; ::::         /  `t、           /     /.         / :i;;;;::....         /    / `、.          /     /        ,. ィ"i  `、;;;::       ,.イ      /   ヽ、         /     /     ,. - '"   |   `、;:    ,. イ        /     `ー       /~\  ,... /,. - ' "      /-- .、  〉-r''"         /

    ,. ィ''",,.. 、  `Y  |"          f:::::::::__/`ー-ナ--――-ァ   /,'

  r'"‾    `ヽ、!、 〉          {::::::ー''リ、;;;;チ`ー=ニ_::::::/  / ./

  {,,.. =---''`ヽ、`}:: .{           ',::::::::::/~`、ヾ`ヽ,,::: /  / ,'

チャラチャッチャチャラッチャ~♪

14年1月18日土曜日

Page 21: Jaws20140117

Copyright © 2014 AGREX INC. 10

わかりましたか?

すいません。ちゃんと説明します。

14年1月18日土曜日

Page 22: Jaws20140117

Copyright © 2014 AGREX INC. 11

こんな感じです。require dirname(__DIR__) . '/init.php';

use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;

$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}

$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}

$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;

14年1月18日土曜日

Page 23: Jaws20140117

Copyright © 2014 AGREX INC. 11

こんな感じです。require dirname(__DIR__) . '/init.php';

use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;

$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}

$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}

$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;

①AWS CloudWatch APIからデータもらう ×アカウント数

14年1月18日土曜日

Page 24: Jaws20140117

Copyright © 2014 AGREX INC. 11

こんな感じです。require dirname(__DIR__) . '/init.php';

use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;

$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}

$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}

$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;

①AWS CloudWatch APIからデータもらう ×アカウント数

②受け取った内容を軽く整形する

14年1月18日土曜日

Page 25: Jaws20140117

Copyright © 2014 AGREX INC. 11

こんな感じです。require dirname(__DIR__) . '/init.php';

use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;

$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}

$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}

$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;

①AWS CloudWatch APIからデータもらう ×アカウント数

②受け取った内容を軽く整形する

③Google Charts APIに投げる

14年1月18日土曜日

Page 26: Jaws20140117

Copyright © 2014 AGREX INC. 12

つまり

Cloudwatch API (右) からGoogle Charts API (左) に渡す(受け流す)だけ

14年1月18日土曜日

Page 27: Jaws20140117

Copyright © 2014 AGREX INC. 13

…で、こんなんできましたー

14年1月18日土曜日

Page 28: Jaws20140117

Copyright © 2014 AGREX INC. 13

…で、こんなんできましたー

INSUFICIENT_DATAがオレンジALARMが赤になる各ヘッダをクリックすると昇順降順の並べ替えができる

14年1月18日土曜日

Page 29: Jaws20140117

Copyright © 2014 AGREX INC. 14

参考とまとめ

14年1月18日土曜日

Page 30: Jaws20140117

Copyright © 2014 AGREX INC. 14

参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html

14年1月18日土曜日

Page 31: Jaws20140117

Copyright © 2014 AGREX INC. 14

参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html

Google Chartshttps://google-developers.appspot.com/chart/

14年1月18日土曜日

Page 32: Jaws20140117

Copyright © 2014 AGREX INC. 14

参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html

Google Chartshttps://google-developers.appspot.com/chart/

ムーディ○山の現在http://blog.livedoor.jp/aokichanyon444/archives/54385877.html

14年1月18日土曜日

Page 33: Jaws20140117

Copyright © 2014 AGREX INC. 14

参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html

Google Chartshttps://google-developers.appspot.com/chart/

ムーディ○山の現在http://blog.livedoor.jp/aokichanyon444/archives/54385877.html

思わず歌っちゃうほど簡単に、ちょっと良いものができました。

他にも、異なるAPI同士を組み合わせることで、

手間無く良いものができたりする例は一杯ありそう。

14年1月18日土曜日

Page 34: Jaws20140117

Copyright © 2014 AGREX INC. 15

ありがとうございました!

14年1月18日土曜日