AWS CLIインストールと初期設定
Webコンソール以外で使いたい
全ての作業をWeb上でやらないといけない場合もありますがCLIできた方がいろいろ便利な場合もあるので調べてみる
登録後にやるべきこと
AWSアカウント作ったらこれだけはやっとけ!IAMユーザーとAuthyを使ったMFAで2段階認証 - Qiita
でセキュリティをある程度確保しておく
参考
http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html
第1回 AWS CLIをインストール:インフラ屋のAWSはじめた日記─GUIを捨てよ|gihyo.jp … 技術評論社
実験
失敗
$ sudo pip install awscli --upgrade Collecting awscli Downloading awscli-1.11.10-py2.py3-none-any.whl (1.0MB) 100% |████████████████████████████████| 1.0MB 753kB/s Collecting s3transfer<0.2.0,>=0.1.9 (from awscli) Downloading s3transfer-0.1.9-py2.py3-none-any.whl (53kB) 100% |████████████████████████████████| 61kB 1.8MB/s Collecting docutils>=0.10 (from awscli) Downloading docutils-0.12.tar.gz (1.6MB) 100% |████████████████████████████████| 1.6MB 484kB/s Collecting rsa<=3.5.0,>=3.1.2 (from awscli) Downloading rsa-3.4.2-py2.py3-none-any.whl (46kB) 100% |████████████████████████████████| 51kB 821kB/s Collecting botocore==1.4.67 (from awscli) Downloading botocore-1.4.67-py2.py3-none-any.whl (2.8MB) 100% |████████████████████████████████| 2.8MB 373kB/s Collecting colorama<=0.3.7,>=0.2.5 (from awscli) Downloading colorama-0.3.7-py2.py3-none-any.whl Requirement already up-to-date: futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" in /Library/Python/2.7/site-packages (from s3transfer<0.2.0,>=0.1.9->awscli) Collecting pyasn1>=0.1.3 (from rsa<=3.5.0,>=3.1.2->awscli) Downloading pyasn1-0.1.9-py2.py3-none-any.whl Collecting python-dateutil<3.0.0,>=2.1 (from botocore==1.4.67->awscli) Downloading python_dateutil-2.5.3-py2.py3-none-any.whl (201kB) 100% |████████████████████████████████| 204kB 1.5MB/s Collecting jmespath<1.0.0,>=0.7.1 (from botocore==1.4.67->awscli) Downloading jmespath-0.9.0-py2.py3-none-any.whl Requirement already up-to-date: six>=1.5 in /Library/Python/2.7/site-packages/six-1.10.0-py2.7.egg (from python-dateutil<3.0.0,>=2.1->botocore==1.4.67->awscli) Installing collected packages: python-dateutil, docutils, jmespath, botocore, s3transfer, pyasn1, rsa, colorama, awscli Found existing installation: python-dateutil 1.5 Uninstalling python-dateutil-1.5: Exception: Traceback (most recent call last): File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/basecommand.py", line 215, in main status = self.run(options, args) File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/commands/install.py", line 317, in run prefix=options.prefix_path, File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_set.py", line 736, in install requirement.uninstall(auto_confirm=True) File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_install.py", line 742, in uninstall paths_to_remove.remove(auto_confirm) File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_uninstall.py", line 115, in remove renames(path, new_path) File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/utils/__init__.py", line 267, in renames shutil.move(old, new) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 299, in move copytree(src, real_dst, symlinks=True) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 208, in copytree raise Error, errors Error: [('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/__init__.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/__init__.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/__init__.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/__init__.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/__init__.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/__init__.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/easter.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/easter.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/easter.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/easter.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/easter.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/easter.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/relativedelta.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/relativedelta.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/relativedelta.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/relativedelta.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/relativedelta.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/relativedelta.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/rrule.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/rrule.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/rrule.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/rrule.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/rrule.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/rrule.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tz.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tz.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tz.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tz.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tz.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tz.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tzwin.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tzwin.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tzwin.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tzwin.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tzwin.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/tzwin.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/__init__.py', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/__init__.py', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/__init__.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/__init__.pyc', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/__init__.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/__init__.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/zoneinfo-2010g.tar.gz', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/zoneinfo-2010g.tar.gz', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo/zoneinfo-2010g.tar.gz'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/zoneinfo'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil', '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil', "[Errno 1] Operation not permitted: '/tmp/pip-BHksak-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil'")] $
エラー?
実験2
成功
$ sudo -H pip install awscli --upgrade --ignore-installed six Collecting awscli Downloading awscli-1.11.10-py2.py3-none-any.whl (1.0MB) 100% |████████████████████████████████| 1.0MB 800kB/s Collecting six Downloading six-1.10.0-py2.py3-none-any.whl Collecting s3transfer<0.2.0,>=0.1.9 (from awscli) Downloading s3transfer-0.1.9-py2.py3-none-any.whl (53kB) 100% |████████████████████████████████| 61kB 2.3MB/s Collecting docutils>=0.10 (from awscli) Downloading docutils-0.12.tar.gz (1.6MB) 100% |████████████████████████████████| 1.6MB 568kB/s Collecting rsa<=3.5.0,>=3.1.2 (from awscli) Downloading rsa-3.4.2-py2.py3-none-any.whl (46kB) 100% |████████████████████████████████| 51kB 2.0MB/s Collecting botocore==1.4.67 (from awscli) Downloading botocore-1.4.67-py2.py3-none-any.whl (2.8MB) 100% |████████████████████████████████| 2.8MB 334kB/s Collecting colorama<=0.3.7,>=0.2.5 (from awscli) Downloading colorama-0.3.7-py2.py3-none-any.whl Collecting futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" (from s3transfer<0.2.0,>=0.1.9->awscli) Downloading futures-3.0.5-py2-none-any.whl Collecting pyasn1>=0.1.3 (from rsa<=3.5.0,>=3.1.2->awscli) Downloading pyasn1-0.1.9-py2.py3-none-any.whl Collecting python-dateutil<3.0.0,>=2.1 (from botocore==1.4.67->awscli) Downloading python_dateutil-2.5.3-py2.py3-none-any.whl (201kB) 100% |████████████████████████████████| 204kB 1.9MB/s Collecting jmespath<1.0.0,>=0.7.1 (from botocore==1.4.67->awscli) Downloading jmespath-0.9.0-py2.py3-none-any.whl Installing collected packages: futures, six, python-dateutil, docutils, jmespath, botocore, s3transfer, pyasn1, rsa, colorama, awscli Running setup.py install for docutils ... done Successfully installed awscli-1.11.10 botocore-1.4.67 colorama-0.3.7 docutils-0.12 futures-3.0.5 jmespath-0.9.0 pyasn1-0.1.9 python-dateutil-1.5 rsa-3.4.2 s3transfer-0.1.9 six-1.10.0 $
できました(^^)
なんか入れてみる
$ aws hoge usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters] To see help text, you can run: aws help aws <command> help aws <command> <subcommand> help aws: error: argument command: Invalid choice, valid choices are: acm | apigateway application-autoscaling | autoscaling budgets | cloudformation cloudfront | cloudhsm cloudsearch | cloudsearchdomain cloudtrail | cloudwatch codecommit | codepipeline cognito-identity | cognito-idp cognito-sync | datapipeline devicefarm | directconnect discovery | dms ds | dynamodb dynamodbstreams | ec2 ecr | ecs efs | elasticache elasticbeanstalk | elastictranscoder elb | elbv2 emr | es events | firehose gamelift | glacier iam | importexport inspector | iot iot-data | kinesis kinesisanalytics | kms lambda | logs machinelearning | marketplacecommerceanalytics meteringmarketplace | opsworks rds | redshift route53 | route53domains sdb | servicecatalog ses | sms snowball | sns sqs | ssm storagegateway | sts support | swf waf | workspaces s3api | s3 configure | deploy configservice | help $
初期設定
$ aws configure AWS Access Key ID [None]: ユーザーのアクセスキー AWS Secret Access Key [None]: ユーザーのシークレットアクセスキー Default region name [None]: ap-northeast-1 Default output format [None]: json $
おわり
所感
最初のエラーには戸惑ったが検索してきちんと解決案があったので助かったm(_ _)m
お金がかかるので連発はできないけど少しずつ扱ってみよう
bluemixのRetrieve and Rankを試す(curlでチュートリアル)
デザインがちょっと変わったので全部コマンドラインでやる
なんかバグっぽい挙動していてうまく動かないんだもん(´・ω・`)
最後に全部削除しています。
サービス作成
サービス一覧を確認
cf marketplace cf marketplace -s retrieve_and_rank
サービスを作成
cf create-service retrieve_and_rank standard rr_tutorial_01
資格情報を作成
cf create-service-key rr_tutorial_01 rr_tutorial_01-credentials
資格情報を確認
cf service-key rr_tutorial_01 rr_tutorial_01-credentials
↓
{ "password": "7kpbrZJ4n1Cq", "url": "https://gateway.watsonplatform.net/retrieve-and-rank/api", "username": "d2affa4a-a293-4bba-98c4-b03501299e66" }
クラスター作成
クラスター作成
curl -X POST -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters" -d ""
↓
{ "solr_cluster_id":"sc8ac937f6_4cc5_44a2_98b3_d249c853391f", "cluster_name":"", "cluster_size":"", "solr_cluster_status":"NOT_AVAILABLE" }
クラスター作成を確認
curl -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/sc8ac937f6_4cc5_44a2_98b3_d249c853391f"
↓
{ "solr_cluster_id":"sc8ac937f6_4cc5_44a2_98b3_d249c853391f", "cluster_name":"", "cluster_size":"", "solr_cluster_status":"READY" }
※READYがあること
コンフィグファイルのサンプルをダウンロード
wget https://github.com/watson-developer-cloud/doc-tutorial-downloads/raw/master/retrieve-and-rank/cranfield-solr-config.zip
※今回はサンプル
コンフィグファイルをアップロード
curl -X POST -H "Content-Type: application/zip" \ -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/sc8ac937f6_4cc5_44a2_98b3_d249c853391f/config/example_config" \ --data-binary @cranfield-solr-config.zip
↓
{ "message":"WRRCSR026: Successfully uploaded named config [example_config] for Solr cluster [sc8ac937f6_4cc5_44a2_98b3_d249c853391f].", "statusCode":200 }
コンフィグファイルを関連付け
curl -X POST \ -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/sc8ac937f6_4cc5_44a2_98b3_d249c853391f/solr/admin/collections" \ -d "action=CREATE&name=example_collection&collection.configName=example_config"
↓
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">12332</int> </lst> <lst name="success"> <lst name="10.176.142.253:6173_solr"> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">2541</int> </lst> <str name="core">example_collection_shard1_replica2</str> </lst> <lst name="10.176.39.48:5590_solr"> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">3026</int> </lst> <str name="core">example_collection_shard1_replica1</str> </lst> </lst> </response>
ドキュメントファイル用のサンプルをダウンロード
wget https://github.com/watson-developer-cloud/doc-tutorial-downloads/raw/master/retrieve-and-rank/cranfield-data.json
ドキュメントファイルのアップロード
curl -X POST -H "Content-Type: application/json" \ -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/sc8ac937f6_4cc5_44a2_98b3_d249c853391f/solr/example_collection/update" \ --data-binary @cranfield-data.json
↓
{ "responseHeader":{ "status":0, "QTime":1673 } }
ランカー用設定
グランドトゥルースファイルのサンプルをダウンロード
wget https://github.com/watson-developer-cloud/doc-tutorial-downloads/raw/master/retrieve-and-rank/cranfield-gt.csv
トレーニング用pythonスクリプトをダウンロード
wget https://github.com/watson-developer-cloud/doc-tutorial-downloads/raw/master/retrieve-and-rank/train.py
トレーニングスクリプト実施
python ./train.py -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ -i cranfield-gt.csv \ -c sc8ac937f6_4cc5_44a2_98b3_d249c853391f \ -x example_collection \ -n "example_ranker"
↓
Input file is cranfield-gt.csv Solr cluster is sc8ac937f6_4cc5_44a2_98b3_d249c853391f Solr collection is example_collection Ranker name is example_ranker Rows per query 10 Generating training data... Generating training data complete. % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 304k 0 319 100 304k 24 23456 0:00:13 0:00:13 --:--:-- 17948 { "ranker_id":"c852bax18-rank-2794", "name":"example_ranker", "created":"2016-10-24T13:47:07.199Z", "url":"https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/rankers/c852bax18-rank-2794", "status":"Training", "status_description":"The ranker instance is in its training phase, not yet ready to accept rank requests" }
Solrの検索クエリをブラウザで確認
https://d2affa4a-a293-4bba-98c4-b03501299e66:7kpbrZJ4n1Cq@gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/sc8ac937f6_4cc5_44a2_98b3_d249c853391f/solr/example_collection/select?q=what is the basic mechanism of the transonic aileron buzz&wt=json&fl=id,title
↓
"responseHeader":{ "status":0, "QTime":16, "params":{ "q":"what is the basic mechanism of the transonic aileron buzz", "fl":"id,title", "wt":"json" } }, "response":{ "numFound":164, "start":0, "docs":[ { "id":"496", "title":[ "a theory of transonic aileron buzz, neglecting viscous effects ." ] }, { "id":"1268", "title":[ "stable combustion of a high-velocity gas in a heated boundary layer ." ] },{ "id":"903", "title":[ "two dimensional transonic unsteady flow with shock waves ." ] },{ "id":"520", "title":[ "wing-tail interference as a cause of 'magnus' effects on a finned missile ." ] },{ "id":"199", "title":[ "measurement of two dimensional derivatives on a wing-aileron-tab system ." ] },{ "id":"643", "title":[ "an investigation of wing-aileron flutter using ground launched rocket models ." ] },{ "id":"1072", "title":[ "ignition and combustion in a laminar mixing zone ." ] },{ "id":"262", "title":[ "the formation of a blast wave by a very intense explosion ." ] },{ "id":"1248", "title":[ "an analytic extension of the shock-expansion method ." ] },{ "id":"660", "title":[ "the fundamental solution for small steady three dimensional disturbances to a two dimensional parallel shear flow ." ] } ] } }
ランカーの作成を確認
curl -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/rankers/c852bax18-rank-2794"
↓
{ "ranker_id":"c852bax18-rank-2794", "name":"example_ranker", "created":"2016-10-24T13:47:07.199Z", "url":"https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/rankers/c852bax18-rank-2794", "status":"Available", "status_description":"The ranker instance is now available and is ready to take ranker requests." }
ランク結果をブラウザで確認
https://d2affa4a-a293-4bba-98c4-b03501299e66:7kpbrZJ4n1Cq@gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/sc8ac937f6_4cc5_44a2_98b3_d249c853391f/solr/example_collection/fcselect?ranker_id=c852bax18-rank-2794&q=what is the basic mechanism of the transonic aileron buzz&wt=json&fl=id,title
↓
{ "responseHeader":{ "status":0, "QTime":679 }, "response":{ "numFound":164, "start":0, "maxScore":10.0, "docs":[ { "id":"313", "title":[ "on alternative forms for the basic equations of transonic flow theory ." ] },{ "id":"496", "title":[ "a theory of transonic aileron buzz, neglecting viscous effects ." ] },{ "id":"520", "title":[ "wing-tail interference as a cause of 'magnus' effects on a finned missile ." ] },{ "id":"903", "title":[ "two dimensional transonic unsteady flow with shock waves ." ] },{ "id":"1268", "title":[ "stable combustion of a high-velocity gas in a heated boundary layer ." ] },{ "id":"1072", "title":[ "ignition and combustion in a laminar mixing zone ." ] },{ "id":"262", "title":[ "the formation of a blast wave by a very intense explosion ." ] },{ "id":"643", "title":[ "an investigation of wing-aileron flutter using ground launched rocket models ." ] },{ "id":"199", "title":[ "measurement of two dimensional derivatives on a wing-aileron-tab system ." ] },{ "id":"1242", "title":[ "some considerations on the laminar stability of time-dependent basic flows ." ] } ] } }
削除
クラスター削除
curl -i -X DELETE \ -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters/sc8ac937f6_4cc5_44a2_98b3_d249c853391f"
↓
HTTP/1.1 200 OK X-Backside-Transport: OK OK Connection: Keep-Alive Transfer-Encoding: chunked Date: Mon, 24 Oct 2016 14:43:16 GMT Content-Type: application/json Server: - Set-Cookie: Watson-DPAT=OQsYXi8uoqg6kh5E4EU2qrm9VwsHdb%2BiXd%2Fw4%2FddxcYCDDr54ieiie7IqLO4VCOpn%2BjFquCI6Qx%2BNnPQirRQjwUjQ76mGx1bNC%2F30R75gMzM7DH%2BVtn0C8awkB3Q%2FmbrpAtq78TdEXuq9PYewL11w1q1H5Pun8HIVnDZRUGIvTtAyLMYKtLU78puiczdvcAd2os68%2FuWnBUPsnXbAHe03VEvLK6TzadSseoyjzjmcVdgutrRpt1HcR983aY%2FYnpr8I7WkrTNNpHOVX%2FriCxD8bjorCwTuuEZR87DWYK7UEneB%2Bpe6jKXhnftRZcoezBv66xtpJq07%2FdCswBxKLgeH9PKtAUggYCqMOyn3vfEUdTyo0iD66P901Qg5gI9mWtE8MQfTbhWcsStpcWpN6R%2FnCrd5cKcvCxfT3qK4BzYi8ZbEsKAr3TLud504FM%2FZxfKIT8PY%2B%2BzWE%2B1HmvHFGozUQucznWgn0ZDEBcx%2BWwezYlcQrlfNtJfz6V7D%2BC%2BmUnP97BTfItDwYbJ0IQtDRaNj0or1jW%2FpxRfve7ZrmokSjzm%2F9PEXyHEELxHu5rW3hL%2Bpr8zF2i9vkusu8q40Jg%2BSwlny1tZpfpoiGtZjm8mMjkOW2Rx6iVd7v4KhEpgXaOqBBBqXI1Vnpq8b8yM1daJbpprza9ufrHvJFbBWsvqJs1x1pqoRlmPHGUvraRNCzw5v3Y44UZez8dMRrS18qWNTLuTtnk1dQIQBEpttRj%2FvmG1cQnbP8F5FRLIgs%2B4PoLFmvM21Jik7Gq9O2Kyfq5tbSIBUiV6%2BiLheafrHt%2Fhx9Ql5dMuXSgU5E0beWfh%2FLs3bKI9W8QFklA5gC03UJ7DtYljp4HS%2FTqbzSDF2OJV00Xs4Q1E%2F9RTd62b9HfPTMUSq2eHZBzoaivr41Ls8%2FjgebwILaO3Dvn5cFqKZqtxDbN3HwJsHiMmPWtyHE%2FLDbznhMorRaXMoR8vi0tKV9AdELroSVUwJe5b3DmlZughvrJy07WflTLtug%3D%3D; path=/retrieve-and-rank/api; secure; HttpOnly X-Client-IP: 119.104.7.50 X-Global-Transaction-ID: 51546924 X-DP-Watson-Tran-ID: gateway-dp01-51546924 { "message":"WRRCSR023: Successfully deleted Solr cluster [sc8ac937f6_4cc5_44a2_98b3_d249c853391f].", "statusCode":200 }
ランカー削除
curl -X DELETE \ -u "d2affa4a-a293-4bba-98c4-b03501299e66":"7kpbrZJ4n1Cq" \ "https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/rankers/c852bax18-rank-2794"
↓
{}
サービス削除
cf delete-service-key rr_tutorial_01 rr_tutorial_01-credentials -f cf delete-service rr_tutorial_01 -f
所感
今回はどのようなデータを用意すればよいのか不明だったのでチュートリアルをそのままやってみた。
質問に対して回答リストを取得している感じ、まだ、ランカーの順位付けや日本語対応などはわかっていないので
少しずつ調べていく。
IBM BluemixでCloud Foundry アプリケーションのアプリを作成する
イメージはHeroku
と同じである程度の環境を持っているものと考えています。
デプロイ
CFツールによるデプロイこれとは別にもう一つデプロイする方法がある
ログイン
$ cf login API エンドポイント: https://api.au-syd.bluemix.net Email> hogehoge Password> 認証中です... OK 組織 hogehogeをターゲットにしました スペース dev をターゲットにしました API エンドポイント: https://api.au-syd.bluemix.net (API バージョン: 2.54.0) ユーザー: hogehoge 組織: hogehoge スペース: dev $
プッシュ
$ cf push sample-php01 $
所感
アプリサーバになんか特殊なことが必要でないのであれば手堅く終わらせる必要がある。
この方法で有償になる感じですけど短期間なら問題なさそうに見える。
SSLの制限があるか確認する必要がる。
LINEのMessageAPIを使ってみる
LINE
まあ、あれです。(^^)
実際、あまり友達いないので使うかどうかはわからないけど企業でもLINEのアカウントを使ってなんかしかやっているので使う機会があるかもしれないので勉強して見る。
開発用アカウント
Developer Trialを使用します。
LINE@とかでなんかしたほうがいいかもしれないけど今回はAPIだけなのでちょっとだけ
API
api.php
<?php // リクエスト取得 $receive = json_decode(file_get_contents("php://input")); // type $type = $receive->{"events"}[0]->{"message"}->{"type"}; // ReplyToken取得 $replyToken = $receive->{"events"}[0]->{"replyToken"}; # dump log ob_start(); var_dump($receive); var_dump($type); var_dump($replyToken); $data = ob_get_contents(); ob_end_clean(); file_put_contents("/tmp/aaa.txt", $data); # token $accessToken = 'アクセストークンを取得して設定する'; //返信データ作成 $response_format_text = array( "type" => "text", "text" => $type ); $post_data = array( "replyToken" => $replyToken, "messages" => [$response_format_text] ); $ch = curl_init("https://api.line.me/v2/bot/message/reply"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8', 'Authorization: Bearer ' . $accessToken )); $result = curl_exec($ch); curl_close($ch);
※手抜き
※本来は署名処理が必要なんですけど設定していません。
結果
watsonのNatural Language Classifierを試した
分類器作成
Java
package com.nlc.sample1; import java.io.File; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.NaturalLanguageClassifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifier; /** * Hello world! * */ public class App { final private static String UserName = "資格情報のユーザー名"; final private static String Password = "資格情報のパスワード"; public static void main( String[] args ) { System.out.println( "Natural Language Classifier createClassifier start" ); // インスタンス生成 NaturalLanguageClassifier service = new NaturalLanguageClassifier(); service.setUsernameAndPassword(UserName, Password); // 分類キー作成 Classifier classifier = service.createClassifier("My Classifier", "ja", new File("./nlc/training02.csv")).execute(); // 結果表示 System.out.println(classifier); System.out.println( "Natural Language Classifier createClassifier end" ); } }
↓
Natural Language Classifier createClassifier start { "classifier_id": "分類器のID", "language": "ja", "name": "My Classifier", "status": "Training", "created": "2016-10-10T10:49:02.767", "status_description": "The classifier instance is in its training phase, not yet ready to accept classify requests", "url": "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/分類器のID" } Natural Language Classifier createClassifier end
分類器作成確認
Java
package com.nlc.sample2; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.NaturalLanguageClassifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifier; /** * Hello world! * */ public class App { final private static String UserName = "資格情報のユーザー名"; final private static String Password = "資格情報のパスワード"; public static void main( String[] args ) { System.out.println( "Natural Language Classifier getClassifier start" ); // インスタンス生成 NaturalLanguageClassifier service = new NaturalLanguageClassifier(); service.setUsernameAndPassword(UserName, Password); // 分類キーより取得 Classifier classifier = service.getClassifier("分類器のID").execute(); // 結果表示 System.out.println(classifier); System.out.println( "Natural Language Classifier getClassifier end" ); } }
↓
Natural Language Classifier getClassifier start { "classifier_id": "分類器のID", "language": "ja", "name": "My Classifier", "status": "Available", "created": "2016-10-10T10:49:02.767", "status_description": "The classifier instance is now available and is ready to take classifier requests.", "url": "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/分類器のID" } Natural Language Classifier getClassifier end
分類処理
Java
package com.nlc.sample3; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.NaturalLanguageClassifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classification; /** * Hello world! * */ public class App { final private static String UserName = "資格情報のユーザー名"; final private static String Password = "資格情報のパスワード"; public static void main( String[] args ) { System.out.println( "Natural Language Classifier classify start" ); // インスタンス生成 NaturalLanguageClassifier service = new NaturalLanguageClassifier(); service.setUsernameAndPassword(UserName, Password); // 分類処理 Classification classification = service.classify("分類器のID", "レトリバー").execute(); // 結果表示 System.out.println(classification); System.out.println( "Natural Language Classifier classify end" ); } }
↓
Natural Language Classifier classify start { "classes": [ { "confidence": 0.9134736500854426, "class_name": "dog9" }, { "confidence": 0.02781542678029993, "class_name": "dog2" }, { "confidence": 0.016548178008526607, "class_name": "dog1" }, { "confidence": 0.012186275707481627, "class_name": "dog3" }, { "confidence": 0.006295053604774933, "class_name": "dog6" }, { "confidence": 0.006138443595939543, "class_name": "dog5" }, { "confidence": 0.005814188944908609, "class_name": "dog8" }, { "confidence": 0.004186655385592137, "class_name": "dog7" }, { "confidence": 0.004046516438248506, "class_name": "dog4" }, { "confidence": 0.00349561144878548, "class_name": "dog10" } ], "classifier_id": "分類器のID", "text": "レトリバー", "top_class": "dog9", "url": "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/分類器のID" } Natural Language Classifier classify end
分類一覧取得
Java
package com.nlc.sample4; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.NaturalLanguageClassifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifiers; /** * Hello world! * */ public class App { final private static String UserName = "資格情報のユーザー名"; final private static String Password = "資格情報のパスワード"; public static void main( String[] args ) { System.out.println( "Natural Language Classifier getClassifiers start" ); // インスタンス生成 NaturalLanguageClassifier service = new NaturalLanguageClassifier(); service.setUsernameAndPassword(UserName, Password); // 一覧を取得 Classifiers classifiers = service.getClassifiers().execute(); // 結果表示 System.out.println(classifiers); System.out.println( "Natural Language Classifier getClassifiers end" ); } }
↓
Natural Language Classifier getClassifiers start { "classifiers": [ { "classifier_id": "分類器のID", "language": "ja", "name": "My Classifier", "created": "2016-10-10T10:49:02.767", "url": "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/分類器のID" } ] } Natural Language Classifier getClassifiers end
分類器削除
Java
package com.nlc.sample5; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.NaturalLanguageClassifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifiers; /** * Hello world! * */ public class App { final private static String UserName = "資格情報のユーザー名"; final private static String Password = "資格情報のパスワード"; public static void main( String[] args ) { System.out.println( "Natural Language Classifier deleteClassifier start" ); // インスタンス生成 NaturalLanguageClassifier service = new NaturalLanguageClassifier(); service.setUsernameAndPassword(UserName, Password); // 分類器を削除 service.deleteClassifier("分類器のID").execute(); System.out.println( "Natural Language Classifier deleteClassifier end" ); } }
とりあえずこんな感じ
watsonで使えるかわからないけどちょっとずつ調べていく
ibm bluemixでVisualRecognitionを試す
使うのは無料枠のみ
お金かかってもいいけど役に立つかを検証したい
VisualRecognitionってなに?
画像認識を行うみたい。とりあえず画像を読み込ませて設定したらできるらしい
今回は画像を読み込ませてjavaで実行するみたいなやつ
事前準備
eclipseでmavenでプロジェクトを作成してpom.xmlに以下を追加
pom.xml
<dependency> <groupId>com.ibm.watson.developer_cloud</groupId> <artifactId>java-sdk</artifactId> <version>3.4.0</version> </dependency>
※dependenciesの中に追加する
分類キー登録
Java
package com.sample2; import java.io.File; import com.ibm.watson.developer_cloud.visual_recognition.v3.*; import com.ibm.watson.developer_cloud.visual_recognition.v3.model.ClassifierOptions; import com.ibm.watson.developer_cloud.visual_recognition.v3.model.VisualClassifier; /** * Hello world! * */ public class App { // API_KEY final private static String API_KEY = "取得するキーを設定する"; public static void main( String[] args ) { System.out.println( "VisualRecognition createClassifier start" ); // インスタンス生成 VisualRecognition service = new VisualRecognition(VisualRecognition.VERSION_DATE_2016_05_20); service.setApiKey(API_KEY); // 分類キーを作成 ClassifierOptions options = new ClassifierOptions.Builder() .classifierName("sample1") .addClass("type1", new File("./VR/images/type1.zip")) .addClass("type2", new File("./VR/images/type2.zip")) .addClass("type3", new File("./VR/images/type3.zip")) .addClass("type4", new File("./VR/images/type4.zip")) .addClass("type5", new File("./VR/images/type5.zip")) .build(); VisualClassifier result = service.createClassifier(options).execute(); // 結果を表示 System.out.println(result); System.out.println( "VisualRecognition createClassifier end" ); } }
↓
VisualRecognition createClassifier start { "classifier_id": "ClassifierのID", "name": "sample1", "classes": [ { "class": "type4" }, { "class": "type3" }, { "class": "type2" }, { "class": "type1" }, { "class": "type5" } ], "owner": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "created": "2016-10-10T05:44:22.400", "status": "training" } VisualRecognition createClassifier end
Classifierのデータを取得
Java
package com.sample3; import java.util.concurrent.ExecutionException; import com.ibm.watson.developer_cloud.http.ServiceCall; import com.ibm.watson.developer_cloud.visual_recognition.v3.VisualRecognition; import com.ibm.watson.developer_cloud.visual_recognition.v3.model.VisualClassifier; /** * Hello world! * */ public class App { // API_KEY final private static String API_KEY = "取得するキーを設定する"; public static void main( String[] args ) throws InterruptedException, ExecutionException { System.out.println( "VisualRecognition getClassifier start" ); // インスタンス生成 VisualRecognition service = new VisualRecognition(VisualRecognition.VERSION_DATE_2016_05_20); service.setApiKey(API_KEY); // 詳細情報 ServiceCall<VisualClassifier> result = service.getClassifier("ClassifierのID"); // 結果を表示 System.out.println(result.rx().get().toString()); System.out.println( "VisualRecognition getClassifier end" ); } }
↓
VisualRecognition getClassifier start { "classifier_id": "ClassifierのID", "name": "sample1", "classes": [ { "class": "type4" }, { "class": "type3" }, { "class": "type2" }, { "class": "type1" }, { "class": "type5" } ], "owner": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "created": "2016-10-10T05:44:22.400", "status": "ready" } VisualRecognition getClassifier end
画像を与えて分類のスコアを算出
Java
package com.sample; import java.io.File; import java.util.Arrays; import java.util.List; import com.ibm.watson.developer_cloud.visual_recognition.v3.*; import com.ibm.watson.developer_cloud.visual_recognition.v3.model.ClassifyImagesOptions; import com.ibm.watson.developer_cloud.visual_recognition.v3.model.VisualClassification; /** * Hello world! * */ public class App { // API_KEY final private static String API_KEY = "取得するキーを設定する"; public static void main( String[] args ) { System.out.println( "VisualRecognition classify start" ); // インスタンス生成 VisualRecognition service = new VisualRecognition(VisualRecognition.VERSION_DATE_2016_05_20); service.setApiKey(API_KEY); // classifierIds用 List<String> list = Arrays.asList("ClassifierのID"); // スコアを取得 ClassifyImagesOptions options = new ClassifyImagesOptions.Builder() .classifierIds(list) .threshold(0.0) .images(new File("./VR/images/type1/0100.jpeg")) .build(); VisualClassification result = service.classify(options).execute(); // 結果を表示 System.out.println(result); System.out.println( "VisualRecognition classify end" ); } }
↓
VisualRecognition classify start { "images_processed": 1, "images": [ { "classifiers": [ { "classifier_id": "ClassifierのID", "name": "sample1", "classes": [ { "class": "type1", "score": 0.986812 }, { "class": "type2", "score": 0.0412107 }, { "class": "type3", "score": 0.103716 }, { "class": "type4", "score": 0.0636262 }, { "class": "type5", "score": 0.111918 } ] } ], "image": "0100.jpeg" } ] } VisualRecognition classify end
現在登録している分類キーの情報
Java
package com.sample4; import java.util.List; import java.util.concurrent.ExecutionException; import com.ibm.watson.developer_cloud.http.ServiceCall; import com.ibm.watson.developer_cloud.visual_recognition.v3.VisualRecognition; import com.ibm.watson.developer_cloud.visual_recognition.v3.model.VisualClassifier; /** * Hello world! * */ public class App { // API_KEY final private static String API_KEY = "取得するキーを設定する"; public static void main( String[] args ) throws InterruptedException, ExecutionException { System.out.println( "VisualRecognition getClassifiers start" ); // インスタンス生成 VisualRecognition service = new VisualRecognition(VisualRecognition.VERSION_DATE_2016_05_20); service.setApiKey(API_KEY); // 詳細情報 ServiceCall<List<VisualClassifier>> result = service.getClassifiers(); // 結果を表示 System.out.println(result.rx().get().toString()); System.out.println( "VisualRecognition getClassifiers end" ); } }
↓
VisualRecognition getClassifiers start [{ "classifier_id": "ClassifierのID", "name": "sample1", "classes": [ { "class": "type4" }, { "class": "type3" }, { "class": "type2" }, { "class": "type1" }, { "class": "type5" } ], "owner": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "created": "2016-10-10T05:44:22.400", "status": "ready" }] VisualRecognition getClassifiers end
削除
Java
package com.sample5; import java.util.concurrent.ExecutionException; import com.ibm.watson.developer_cloud.http.ServiceCall; import com.ibm.watson.developer_cloud.visual_recognition.v3.VisualRecognition; /** * Hello world! * */ public class App { // API_KEY final private static String API_KEY = "取得するキーを設定する"; public static void main( String[] args ) throws InterruptedException, ExecutionException { System.out.println( "VisualRecognition deleteClassifier start" ); // インスタンス生成 VisualRecognition service = new VisualRecognition(VisualRecognition.VERSION_DATE_2016_05_20); service.setApiKey(API_KEY); // 詳細情報 service.deleteClassifier("ClassifierのID"); System.out.println( "VisualRecognition deleteClassifier end" ); } }
所感
基本的なものだけ触ってみた、リファレンスと同期がどれていない感じなので必要なパラメータがよくわからないので手探りになりそう。
Javaはまだ基本的なことしかわからないので触っていきながら理解していくことになる
java8のLocalDateとLocalTimeを触ってみた
Java8から導入された機能
日付制御ではDateやCalendarなどを使用していたがSE8より導入された
サンプルコード
Main.java
import java.time.*; public class Main { public static void main(String[] args) { System.out.println("Hello World!"); // 現在日付 LocalDate ld = LocalDate.now(); System.out.println(ld); // 日付を指定 LocalDate ld2 = LocalDate.of(2011, 04, 28); System.out.println(ld2); // 文字列をパースして日付を設定 LocalDate ld3 = LocalDate.parse("2014-06-23"); System.out.println(ld3); // 現在年の1月1日 LocalDate ld4 = LocalDate.now() .withMonth(1) .withDayOfMonth(1); System.out.println(ld4); // 前月の末日 LocalDate ld5 = LocalDate.now() .withDayOfMonth(1) .minusDays(1); System.out.println(ld5); // 翌日の月初 LocalDate ld6 = LocalDate.now() .plusMonths(1) .withDayOfMonth(1); System.out.println(ld6); // 現在日時 LocalTime lt = LocalTime.now(); System.out.println(lt); // 時刻を指定 LocalTime lt2 = LocalTime.of(10, 34, 45); System.out.println(lt2); // 文字列をパースして時刻を設定 LocalTime lt3 = LocalTime.parse("23:44:12"); System.out.println(lt3); // 現在日時の0分0秒 LocalTime lt4 = LocalTime.now() .withMinute(0) .withSecond(0) .withNano(0); System.out.println(lt4); // 現在時刻の10時間語 LocalTime lt5 = LocalTime.now() .plusHours(10); System.out.println(lt5); // 現在時刻の7200秒前 LocalTime lt6 = LocalTime.now() .minusSeconds(7200); System.out.println(lt6); // 現在日時 LocalDateTime ldt1 = LocalDateTime.now(); System.out.println(ldt1); // 日時を指定 LocalDateTime ldt2 = LocalDateTime.of(2012, 10, 30, 03, 50, 12); System.out.println(ldt2); // 文字列で日時を設定 LocalDateTime ldt3 = LocalDateTime.parse("2013-10-12T16:04:23"); System.out.println(ldt3); // 現在年の1月1日0時0分 LocalDateTime ldt4 = LocalDateTime.now() .withMonth(1) .withDayOfMonth(1) .withHour(0) .withMinute(0) .withSecond(0) .withNano(0); System.out.println(ldt4); // 前年 LocalDateTime ldt5 = LocalDateTime.now() .withMonth(1) .withDayOfMonth(1) .withHour(0) .withMinute(0) .withSecond(0) .withNano(0) .minusNanos(1); System.out.println(ldt5); } }
↓
Hello World! 2016-09-24 2011-04-28 2014-06-23 2016-01-01 2016-08-31 2016-10-01 15:22:37.758 10:34:45 23:44:12 15:00 01:22:37.758 13:22:37.758 2016-09-24T15:22:37.758 2012-10-30T03:50:12 2013-10-12T16:04:23 2016-01-01T00:00 2015-12-31T23:59:59.999999999
所感
イミュータブルにしたのでメソッドチェインできるのでちょっとどの変数にどの結果が入っているかが
わかりやすくなった。
単純な日時の制御なら楽にできると思われる
時差などを制御するものもあるのでそれも近いうちちょっと触ってみる