- 投稿日:2019-03-07T23:22:52+09:00
プログラミング学習記録19〜突っ走る力〜
今日やったこと
- Udemyの「Web開発入門完全攻略コース - プログラミングをはじめて学び創れる人へ!未経験から現場で使える開発スキルを習得!」のセクション12の139~150
- セクション13の151~194
以下、パートごとに書いたメモです。
セクション12AWS Cloud9による開発環境構築
139.イントロダクション-AWS Cloud9による開発環境構築-
AWS Cloud9を使うとwebアプリケーションの開発がwebブラウザでできるようになります。
1年間無料で利用できます。※ローカルPC上に環境構築して運用する方法もあります。
AWS Cloud9利用に必要なものは、
- メールアドレス
- クレジットカード
- ユーザー認証用の電話番号
です。
実行環境はGoogle chromeで行います。
140.AWSの無料利用枠について
具体的に結論としては、
新規アカウント作成から12ヶ月。月間750時間まで無料利用枠で利用可能。1年間の無料期間が終わってからは、(ドル円相場にもよるが)1ヶ月に90時間あたりだいたい210円くらいかかるみたいです。安いですね。
詳細は以下のページで確認してください。
AWS クラウド無料利用枠 | AWS(https://aws.amazon.com/jp/free/)よくある質問 - AWS クラウド無料利用枠 | AWS(https://aws.amazon.com/jp/free/faqs/)
141.AWS利用時の注意事項!!必ず確認してください!!
アカウント情報の管理は厳重にしましょう。
以下のような被害も実際に出てきています↓
『AWSで不正アクセスを受けたので、そのときの対応を記録しておく(返金されました)』
https://qiita.com/kojiro_ueda/items/503d24b313a3a80b8eccあと、知識がない状態でAWSのいろいろなサービスを利用するのは、セキュリティ面や費用の面で危険だということです。
知識をつけてから、わかるものから少しづつ手をつけていきましょう。
142.AWSアカウント作成
AWSアカウント作成についてです。
以下のページに具体的な流れが書かれています。
AWS アカウント作成の流れ | AWS(https://aws.amazon.com/jp/register-flow/)143.IAMの設定
AWS Identity and Access Management (IAM) は、ユーザーに対して AWS へのアクセスを安全に制御するための仕組みです。
AWS Identity and Access Management (IAM - ユーザのアクセスを安全に制御)| AWS(https://aws.amazon.com/jp/iam/) より引用
この講座ではIAMユーザーとしての利用で進めていくようです。
144.無料利用枠の使用のアラートの受信設定
AWSの不正な請求を防ぐためにあらかじめ行っておくべき設定です。
145.Cloud9のセットアップ
IAMユーザーでCloud9のセットアップを行いました。
これでIDE(統合開発環境)の準備ができました。
146.Cloud9の画面説明
linuxコマンド
$ ruby -v
でインストールされているrubyのバージョンを確認しました。147.補足:AWS Cloud9のテキストエディタの設定について
AWS Cloud9の設定に関する補足資料です。
AWS Cloud9のテキストエディタの設定について
(https://programmingnavi.com/1690/)Tabキーでスペース2個作れるようにするのと、不可視文字を表示する設定です。
148.新・Rubyのバージョン管理1
複数の開発案件を抱えていると、複数のrubyのバージョンを扱うことがあります。
なので、複数のrubyのバージョンを管理する方法を学びましょう、という話です。
Rubyのバージョン管理ソフトウェアはいくつかありますが、この講座ではrvmを使って進んでいきます。
Cloud9にインストールされているrvmのバージョンを確認しました。
$ rvm helpでrvmのヘルプを出すことができ、コマンドを調べることができます。
149.Rubyのバージョン管理2
鍵のインストールについてです。
150.Rubyのバージョン管理3
Rubyの最新バージョンは2.6.0ですが、動画に合わせてrvmで2.5.0をインストールし、デフォルトに指定しました。
このパートで実際に入力したコマンドです↓
$ rvm list
でインストールされているrubyのバージョンが確認できます。
$ rvm install 2.◯.◯
で指定したバージョンのrubyがインストールできます。
$ rvm use rubyのバージョン
でインストールされているrubyの中から使いたいバージョンを選ぶことができます。
$ rvm remove rubyのバージョン
で指定したバージョンのrubyをアンインストールできます。
$ ram —default use rubyのバージョン
でインストールされているrubyの中から指定したいものをデフォルトに指定することができます。セクション12AWS Cloud9による開発環境構築 全体の感想
Cloud9についてより詳しくなれました。
Cloud9を使うのは初めてではないのですが、複数のバージョンを管理する方法等は知らなかったので、知れてよかったです。
とりあえず開発環境構築まで来れて一安心という感じですね。
いよいよ次のセクションではRubyに入ります。
楽しみです。
ということで、気を引き締めて次のセクションに進みたいと思います。
セクション13Ruby入門
151.イントロダクション-Ruby入門-
このセクションの概要。
152.Rubyとは
Rubyはプログラミング言語でruby on railsはフレームワーク。
詳しい情報は公式HPで確認できます。
Rubyとは
(https://www.ruby-lang.org/ja/about/)153.動作確認環境について
この講座ではAWS Cloud9でRubyのバージョンは2.5.0で行います。
154.はじめてのRubyプログラミング
Rubyを動かす方法はirb(対話型評価環境)を使う方法とファイルに保存したプログラムを実行する方法の2つがあります。
このパートでは両方の方法を試してみました。
Irbはコマンド
$ irb
で起動します。元の画面に戻るときは
exit
です。ファイルに保存したプログラムを実行する方法ではProgateのコマンドラインでやったコマンドを使いました。
kinu:~/environment/ruby_projects $ pwd
/home/ec2-user/environment/ruby_projects
kinu:~/environment/ruby_projects $ ruby hello.rb
Hello World!Rubyのファイルは実行したいファイルの親ディレクトリに移動してから$ ruby 〇〇.rb で実行します。
155.コメント
Atomと同じようにCloud9でもcommandキー+/キーでコメントアウトします。
156.ローカル変数
price1=100や_price=100のような変数は原則使わないようにしましょう。
price_costのように_で区切るのは使われますが、priceCostのような書き方はあまり使いません。
あと、Rubyの予約語として指定されているものは変数名に使えません。
Ruby 予約語
157.定数
定数は全て大文字で書くことが多いです。
例
TAX=1.08
TAX_RATE=1.08定数への代入は一度きり。
158.リテラル
Rubyのプログラムの中に直接記述できる値のことをリテラルと言います。
数字や文字列、配列、ハッシュはリテラルです。
159.オブジェクト指向プログラミング言語イントロ
オブジェクトとは、データや処理の集まりのことです。
今は言葉をざっくり知っていればいいそうです。
クラス、インスタンス、メソッドについてのざっと学びました。
160.数値(Numeric)
基本的な計算方法と数値を扱うメソッドのついての動画です。
161.文字列(String)
文字列を途中で改行したい場合は、\nを間に入れてダブルクオーテーションで囲む必要があります。
特殊文字や式展開を行うときは、ダブルクオーテーション。それ以外はシングルクオーテーション、という使い分がオススメらしいです。
162.空白文字について
出力結果は変わらないが、10 + 1 - 3 のように空白を入れると見やすくなるので、空白を入れて書きましょう。
163.演算子による値の比較
2つの値の大小や同じかどうかを調べる方法についてです。
関係が成り立つ場合は真(true)、成り立たない場合は偽(false)が返ってきます。例えば、
puts 1<2
と書いたら、trueが返ってきます。164.演算子の優先順位
どの順番で計算されるのか?という話です。
詳しくはこちらでご確認ください。
演算子の優先順位(https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html)165.数値と文字列は暗黙的に変換されない
原則、数値と文字列をつなげることはできないので、.to_iや.to_f、.to_sを使って変換する必要があります。
166.インクリメントとデクリメント
インクリメントとは、値に1を足すことです。
デクリメントとは、値から1を引くことです。
Rubyには、JavaScriptでいうところの++、—はありません。
なので、インクリメントはn=n+1、n+=1のように、デクリメントはn=n-1、n-=1のように表現します。
167.真偽値
Rubyの真偽値のルール
・falseまたはnilであれば偽(false)
・それ以外は全て真(true)その他真偽値に関係するメソッドにも軽く触れました。
168.条件分岐if
点数によって異なる評価を示すプログラムと動物の種類によって、ターミナルに出力する鳴き方を変えるプログラムを作りました。
169.条件分岐 unless
unlessは条件式がfalseの時に実行したい処理を書きます。
unlessにelsifに相当するものはないので、無理に使う必要はありません。
n=1 unless n.zero? puts ‘0ではありません’ endを実行すると「0ではありません」が出力される。
170.条件分岐 case
複数の条件を指定する場合は、elsifを何個も使うよりもcaseを使った方がわかりやすくなります。
誕生石から、誕生月を出力するプログラムをcaseを使って作りました。
stone = 'ruby' case stone when 'ruby' puts '7月' when 'peridot' puts '8月' when 'sapphire' puts '9月' else puts 'データが登録されていません' end171.演習:条件分岐
年齢によってテーマパークの入場料を出し分けてターミナルに出力するプログラムを作る演習です。
これは簡単でした。
172.演習回答:条件分岐
模範回答と同じでした。
age = 5 if age >= 12 puts "5000円" elsif age >=6 puts "2500円" else puts "1000円" end173.メソッド
メソッドは複数の処理をまとめて、扱いやすくしたものです。
Progateでは戻り値にreturnを使っていたのですが、この講座ではreturnを使っていません。
returnを使わなくても、大丈夫みたいです。
174.演習:FizzBuzz
有名な問題ですね。
会社の採用面接で問われることもあるそうです。なんとかクリアできてよかったです。
175.演習回答:FizzBuzz
ポイントは先に15で割り切れる数の処理を書くことですね。
def fizz_buzz(n) if n%15==0 'FizzBuzz' elsif n%3==0 'Fizz' elsif n%5==0 'Buzz' else n.to_s end end puts fizz_buzz(1) puts fizz_buzz(2) puts fizz_buzz(3) puts fizz_buzz(4) puts fizz_buzz(5) puts fizz_buzz(6) puts fizz_buzz(7) puts fizz_buzz(8) puts fizz_buzz(9) puts fizz_buzz(10) puts fizz_buzz(11) puts fizz_buzz(12) puts fizz_buzz(13) puts fizz_buzz(14) puts fizz_buzz(15)3でも5でも割り切れない数字は文字列に変えて出力してください、ということで、n.to_sにしてます。
参考
- to_i→文字列を数字に変えるメソッド
- to_s→数字を文字列に変えるメソッド
176.puts,print,p
putsは改行されてnulになりますが、printは改行されずにnulが出ます。
Pメソッドはデバック用のメソッドです。
177.配列
配列の基本と配列に関する様々なメソッドについて学習しました。
具体的に、どの場面でどのメソッドを使うかはわからないので、さらっと流して次に進みます。
(0..25).to_a
で0から25の数字を含んだ配列を作ることができます。178.ハッシュ
連想配列とも呼ばれるものです。
each文の書き方がProgateでやったものとは違っていましたが、基本的な考え方に大きな違いは’ないので、このまま突き進みます。
179.繰り返し処理
繰り返し処理の概要。
180.繰り返し処理 each, for
原則、for文は書かないそうです。
配列とハッシュそれぞれでeach文を書いてみました↓
numbers = [1,2,3,4,5] numbers.each do |number| puts number end scores = {nakamura:90,sato:80,suzuki:70} scores.each do |name,score| puts "#{name},#{score}" end181.繰り返し処理 times
配列を使わずに指定した回数繰り返したい時に使います。
5.times do puts 'hello' end 5.times do |i| puts "#{i}.hello" endこの時、iは1からではなく、0から始まります。
182.繰り返し処理while
指定した条件が真である限り繰り返す処理です。
条件を指定せずに無限ループにならないように注意しましょう。
183.繰り返し処理 upto,downto
Uptoは数値を1ずつ増やしながら何かしらの処理をしたい時に使い、downtoは1ずつ減らしながら何かしらの処理をしたい時に使います。
184.繰り返し処理 step
指定した数字から指定した数字まで指定した数字ずつ増えていく処理をしたい時に使います。
構文は、開始式.step(上限値、一度に上限する大きさ)
185.繰り返し処理 loop, break, next
Loopはあえて無限ループを作りたい時に使います。
Breakで指定したところで中断させることができます。
Nextを使うと、同じブロック内のnext以降の処理が行われずに次の繰り返しが行われます。
186.クラス
クラスは設計図のようなもので、インスタンスは実体と考えることもできます。
用意されているクラスもたくさんあるのですが、自分でクラスを作る方法を学びました。
Progateではinitializedメソッドの中のインスタンス変数はself.name=nameのように記述していたのですが、この講座では@name=nameのように記述していました。
違いはありますが、基本的な考え方は一緒ですね。
class User def initialize(name) puts 'initialize!!' @name = name end def hello puts "Hello! I am #{@name}." end end emma = User.new('Emma') emma.hello olivia = User.new('Olivia') olivia.hello187.アクセサ
attr_accessorなどのアクセサについてです。
インスタンス変数の値を読み書きするメソッドのことをアクセサメソッドと言います。
アクセサメソッドには読み取り専用のもの、書き込み専用のものもあります。
具体的な使用場面についてはまだよくわかっていませんが、切った貼ったができる便利なものだというニュアンスはわかった気がします。
188.訂正:クラスメソッド、クラス変数
189のスペルミスのお詫びです。
189.クラスメソッド、クラス変数
クラスメソッドは、インスタンスを生成せずにクラスから直接呼ぶことができるメソッドです。
クラス変数は、クラス自体に値を保持することができる変数です。
190.クラスの継承
継承とは、親クラスを受け継いで使うことです。
継承を使うことで、共通部分を繰り返し書く必要がなくなるので、楽にコーディングできますね。
子クラスの方でオーバーライド(上書き)すると子クラスの方が優先されます。
191.メソッドのアクセス権
メソッドのアクセスできる条件を指定することができます。
メソッドのアクセス権には3つの種類があります。
Public→クラスの外部からでも自由に呼び出せる(デフォルト)
Private→クラスの内部でのみ使えます
Protected→これはあまり使われないそうです。
メソッドの上にprivateと書くだけでprivate化できます。
192.モジュール
モジュールはクラスのようにメソッドや定数をまとめられるものです。
クラスのようにインスタンスを作ることはできませんが、関連するメソッドなどをまとめてグループ化したい時に手軽に使えるため、便利です。
193:例外
実務では例外が発生した時の処理を記述しておくことが大事だそうです。
194.Rubyのコーディングルール
プロジェクトメンバーと一緒にコーディングするときに参考にする共通のルールです。
The Ruby Style Guide (日本語)(https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md)
RuboCop(https://github.com/bbatsov/rubocop)
セクション13 Ruby入門 全体の感想
パソコンのバッテリー残量の関係でかなり急ぎ足で終わらせました。
まだまだ理解できたいないところだらけですが、Progateをやっていたこともあり、理解できる部分も多くありました。
ひとまず完走することを第一に考え、このまま突き進みます。
きっと2回、3回と繰り返し触れていけば簡単になるはず!!!
あと残り87パートになりました。このまま突っ走ります。
ということで、引き続き明日からもプログラミング学習頑張ります。
おわり
- 投稿日:2019-03-07T23:09:46+09:00
知識0からAWS構築までの流れ
はじめに
まずはじめにAWSとは一つのサーバーのことではありません!
↑
これは真面目に自分がはじめにそう思っていたので言っておきます。AWSとはアマゾンウェブサービスです。つまり、何かWEBアプリや開発を行う際に必要なドメインやらサーバーやら色々なサービスを提供しているサービスなのです。
AWSを使うということは、これら多種多様なサービスを自身の開発したいモノに合わせて効率よく組み合わせていくことなのです。
今回はAWSを使ってホームページを作成して、そのホームページにwebアプリケーションを掲載するために必要な環境(インフラ)を構築していきます。
目次
1_AWSインフラとは
1_全体像
2_メリット・デメリット
2_環境設定
1_アカウント登録
2_IAM Identity and Access Management(ユーザー作成・権限付与)
3_Route53 (ドメイン取得)
3_動的コンテンツ処理
1_VPC Virtual Private Cloud(仮想ネットワーク構築)
2_EC2 Elastic Compute Cloud(webアプリケーションサーバー)
3_ELB Elastic Load Balancing(AZが複数ある場合)
4_RDS Relational Database Service(データベースサーバー)
4_静的コンテンツ処理
1_S3 Simple Storage Service(Webサーバー)
2_CloudFornt
5_もっと効率的に使うために
1_CLI Command line interface(AWSをコマンドラインで操作するもの)
2_Elastic Beanstalk
3_Cloud9
- 投稿日:2019-03-07T21:43:13+09:00
AWSで簡易なSFTPサーバー構築 - SFTPサーバー設定
ec2-userでSSHログイン
rootユーザに変更
$ sudo su -ユーザー作成
# useradd ユーザー名rootユーザーからexit
# exit作成したユーザーに変更
$ sudo su 作成したユーザー名作成したユーザーのホームディレクトリに移動
$ cd /home/作成したユーザー名.sshディレクトリ作成
$ mkdir .ssh.sshディレクトリのパーミッション(権限)を700に変更
$ chmod 700 .ssh.sshの直下にauthorized_keysファイル作成
$ touch .ssh/authorized_keysauthorized_keysファイルのパーミッションを600に変更
$ chmod 600 .ssh/authorized_keys秘密鍵公開鍵の準備
Puttygenで公開鍵のスクリーンをドラッグしてコピー
authorized_keysに公開鍵を貼り付け
cat >> .ssh/authorized_keys入力モードになるので、(Puttyの場合)Shift + insertボタン押下
Enter
:q + Enter
でプロンプトに戻る別のPuttyセッションを立上、作成したユーザー名で作成した秘密鍵でログインできることを確認
sftpコマンドでのみ接続を許可させる
authorized_keysの先頭に下記の記載を追加し、改行を入れる。
/home/[user_dir]/.ssh/authorized_keys
command="internal-sftp"
あとはこちらの記事を参考にできました。ありがとうございます。
- 投稿日:2019-03-07T21:33:44+09:00
AWS DeepRacer(実機)の初期設定をしてみた
AWS DeepRacerについて
AWS DeepRacer
re:Invent2018で発表された、強化学習により駆動する1/18スケールの完全自走型レーシングカーです。
ワークショップに参加し実機を入手できたので触ってみました。
備忘録も兼ねて、初期設定〜テスト走行まで書いてみたいと思います。ちなみに、
実機の発売日はUSでは2019/4/15となっているようです。
AWS DeepRacer – Fully autonomous 1/18th scale race car for developersまた、AWSのサービスの方は現在プレビューの申込み受付中となっています。
マニュアル
公式ページからセットアップ方法についてのPDFファイルがダウンロードできます。
この他、チュートリアルのマニュアル等も用意されています。初期設定
公式のPDFの手順に沿って設定していきます。
※各設定手順の説明画像はPDFにあるので省略します。内容物
省略します。
他に必要なもの
- PC等(USBポートを備えた、インターネット接続可能なもの)
- USBフラッシュドライブ
- Wi-Fiネットワーク
- AWSアカウント
DeepRacerの組み立て
車体用とコンピュータ用の2種類バッテリーを取り付けます。
車体のボディを外した状態から始めます。車体用バッテリー
車体横にある4本のピンを外して車体を持ち上げ、赤いコネクタを接続します。
バッテリーからは赤いコネクタと白いコネクタの2本が出ていますが、白い方は充電用です。
コネクタを接続したら車体に載せてストラップで固定し、車体を戻して再度ピンで留めます。コンピュータ用バッテリー
USB-CのASUS製モバイルバッテリーです。容量なんと13600mAh
車体上部のスペースに載せ、ストラップで固定します。車体にはまだ接続しません。
車体に載せる際は、接続の都合上バッテリーのUSB-Cコネクタが右後ろ側に来るように配置します。DeepRacerとの接続
Wi-Fiネットワークを通してDeepRacerとPCを接続します。
DeepRacerをネットワークに接続 → DeepRacer側のIPアドレス取得 → PCからDeepRacerに接続という流れになります。コンピュータ部分の電源を入れる
車体左側にあるUSB-Cポートに付属のACアダプタを接続し、コンセントから給電される状態にします。
車体右側にある電源ポタンを押します。LEDが緑→青に点灯すればOKです。
(緑から青に変わるまで少し時間がかかりました)Wi-Fiの設定
Wi-Fiの認証用設定ファイルをPC側でダウンロードします。
ここに接続したいネットワークのSSIDとパスワードを書き込みます。wifi-creds.txt################################################################################### # AWS DeepRacer # # File name: wifi-creds.txt # # # # To connect the device to Wi-Fi, type your Wi-Fi SSID name and password # # (case sensitive) in the corresponding fields below. # # For example: # # ssid: 'Your-WiFi 100' # # password: 'Passwd1234' # # # # Then follow the instructions on https://aws.amazon.com/startyourengines to # # finish the setup process. # # # # WARNING: # # # # 1. Please make sure the Wi-Fi that the device connects to for the first time # # has Internet connection. If not, it will impact the software update and any # # subsequent Wi-Fi connections. # # # # 2. Do NOT change the file name or the field name of 'ssid' and 'password', # # which are all case sensitive. # # # # 3. Do NOT replace the default single quote signs (''), which are plain text and # # may not be recognized by the device after editing. # # # # # # If the USB drive was plugged into the device before, a list of available Wi-Fi # # networks will be automatically generated below, you can simply uncomment the # # one you want to connect to by removing the pound sign. # # # # If you have validated the Wi-Fi credentials but still find the Wi-Fi LED does # # not turn to solid blue, try rebooting the device by pressing the 'RESET' button # # and then plugging in the USB drive again after the power LED turns blue. # # # ################################################################################### # Provide your SSID and password below ssid: hogehoge password: fugafuga※SSIDとパスワードを''で括るとうまく認識されませんでした。
USBフラッシュドライブのルートディレクトリに
wifi-creds.txt(ファイル名変更不可)を保存し、DeepRacer機体後部にあるUSBポートに接続します。
設定情報が読み込まれ、WiFiネットワークへの接続がDeepRacer側で行われます。
車体右側のWiFiマークのLEDが青く点灯したら接続OKです。
接続に失敗した場合はLEDが赤く点灯します。DeepRacer側のネットワーク情報を取得
接続に成功したら一度USBフラッシュドライブを取り外します。そのまま引っこ抜いて大丈夫です。
PC側に接続すると、DeepRacer側のネットワーク状態等が書かれたファイルdevice-status.txtがルートディレクトリに保存されています。device-status.txtHostname: amss-xxxx Timestamp: 03/01/19 00:00:00 Successfully connected to 'hogehoge': Device 'mlan0' successfully activated with '12345678-1234-1234-1234-123456789012'. Connected to WiFi network: hogehoge Active connections: mlan0: 192.168.1.100DeepRacerに
192.168.1.100というIPが割り振られたことが分かります。DeepRacerに接続
device-status.txtから取得したIPをPCからブラウザに入力しアクセスします。
自己証明書の警告が出ますがそのままアクセスします。
ソフトウェアアップデートの画面が出るので適宜アップデートを行います。初期設定完了
これで初期設定は完了です。
テスト走行ではバッテリーから給電する必要があるので一度電源を切ります。コンピュータ部分の電源を切る
車体右側の電源ボタン長押し(5秒程度)でOFFになります。
走らせてみる
電源を入れる
ACアダプタを外し、付属のUSB-Cケーブルでコンピュータ用のバッテリーを接続します。
バッテリーとコンピュータ部分の電源をONにし、Wi-Fiが接続完了になるのを待ちます。
※初期設定が完了していればUSBフラシュドライブを接続する必要はありません。車体部分の電源を入れる
ホイール4輪の向きを正面に合わせます。
左前輪付近にある車体側の電源スイッチをONにします。DeepRacerに接続
先程取得したDeepRacerのIPをPC等のブラウザに入力しアクセスします。
ログイン画面が表示され、パスワードの入力を要求されます。パスワードは車体の裏に記載されています。
ログインすると下のような画面になります。左側には車載のカメラの映像が表示されます。
ManualモードとAutonomousモードが選択でき、上の画面はAutonomousモードになります。Manualモード
Manualモードに切り替えると実コースがなくても走行させることができます。
画面右側の領域をクリックorタップしドラッグすることでDeepRacerを手動で操縦することができます。
思ったよりもかなり速く走ります。
スロットルの最大を50%にしてもコントロールが難しいです。
軽い気持ちで机上で走らせようとすると大変なことになるかもしれません。。これでDeepRacerを走行させることができました。
Autonomousモード
Autonomousモードでは作成したモデルを実機にロードして走行させることができます。
こちらが本来のDeepRacerの走らせ方になります。
実コースが無いのでここでの説明は省略します。問題発生…
私が持っているDeepRacer、なぜか後ろ向きに走ります。
ManualモードのUIでは下向きにドラッグで前進していたので違和感を感じていたのですが、試しにAutonomousモードにしてみたところ、勢い良く後ろ向きに走り出しました。
バッテリーを逆に接続してしまったかと思いましたが、コネクタの形状的に+-は間違いようがないのでそもそも配線が逆になっている疑惑。。配線の繋ぎ直しで解決
ネットで画像検索してみたところ、いくつか配線まで写っている画像が出てきました。
手元の実機では太い導線が下の画像のように 青→黒、黄→赤 と繋がっていますが、
画像検索で出てきたものは 青→赤、黄→黒 と配線されていました。
やはり間違っている。。
ということで、結束バンドをちょん切って配線を繋ぎ直したところ無事前向きに走るようになりました。
まとめ
DeepRacer(実機)の初期設定を行い、(初期不良を修理し)走行させることができました。
2019年は世界各地のAWS SummitでAWS DeepRacerリーグが開催予定で、入賞者はre:Invent2019で開催されるAWS DeepRacer チャンピオンカップへの出場権が与えられるそうです。
車体にはmicroSDポートやHDMIポート、未使用のUSBポートもあるので今後の拡張なども期待できそうです。
実コースどこかにないかなぁ。。
- 投稿日:2019-03-07T21:00:54+09:00
AWSで簡易なSFTPサーバー構築 - 初期設定
AWSに簡易なSFTPサーバーを立てようとして何度も失敗したので、正しい手順を記録化する話
EC2インスタンスを立てる
立てる過程でKey pair作成
AWSコンソールで、秘密鍵をダウンロード
ローカルマシンにPuttyとPuttygenをインストール
PuttygenでConversionメニューからImport Key. ダウンロードした秘密鍵ファイル.pemを選択。Save private keyで、open-ssh形式の秘密鍵ファイル.ppkを保存
Puttyにセッション作成
AWSコンソールにて対象インスタンスに接続ボタンを押すと表示されるパブリックDNSが接続先DNS
Authに上で作ったOpen SSH形式の秘密鍵.ppkを設定Open押下でSSHログイン
初期はec2-userであり、rootではない
yum アップデート
$ sudo yum update -ygitをインストール
'''
$ sudo yum -y install git
'''Python3をインストール
$ sudo yum install python3Pyenvのインストール
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenvPathを通す
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile $ source ~/.bash_profileコマンドが通るか確認
$ pyenv -v必要な依存関係のインストール
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -ypython3.7の場合は以下も必要
sudo yum install libffi-develpythonのインストール
pyenv install 3.7.1バージョンの切替
$ pyenv global 3.7.1 $ pyenv rehash確認
$ python --version3.7.1になっていれば成功
- 投稿日:2019-03-07T17:51:02+09:00
今度詰めていきたいところ(覚書)
今後詰めていくとこと 優先順位
IAMポリシー
IAM JSON ポリシーエレメントのリファレンス
- 投稿日:2019-03-07T16:04:47+09:00
CloudWatch Event + LambdaでBeanstalk環境がデプロイされたらURLをRoute53のレコードに追加するようにする
やりたいこと
BeanstalkのURLは
<beanstalk環境名>.<ハッシュ>.<リージョン>.elasticbeanstalk.com
のようになっていて、デプロイのたびにURLが変わりますこれを保有する適当なドメイン名にたいして
Route53のホステッドゾーンで名前解決することが出来ます
参考URL: https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customdomains.htmlこれをデプロイの度に手で書き換えるのは面倒なので
CloudWatch Event + Lambdaで自動化したというのが今回のエントリです1. CloudWatch Eventの設定
AWSコンソール > CloudWatch > イベント > ルール > ルールの作成 でルール作成画面をひらく
赤枠の編集ボタンを押して、JSONの編集画面を開きます
次のJSONをコピペします{ "source": [ "aws.elasticbeanstalk" ], "detail-type": [ "AWS API Call via CloudTrail" ], "detail": { "eventSource": [ "elasticbeanstalk.amazonaws.com" ], "eventName": [ "CreateEnvironment" ] } }ElastciBeanstalk APIのCreateEnvironmentが着たら発火しますというものです
CloudWatch Eventのターゲットには次の手順で作成するLambdaを指定します
2. Lambda関数をつくる
2-1. BeanstalkのURL取得
def lambda_handler(event, context): eb_environment_name = event['detail']['requestParameters']['environmentName'] # beanstalk環境のデプロイが遅いためcnameが設定されるまでリトライ client_eb = boto3.client('elasticbeanstalk') for i in range(0, CONNECTION_RETRY): try: response_eb = client_eb.describe_environments( EnvironmentNames=[ eb_environment_name ] ) eb_environment_cname = response_eb['Environments'][0]['CNAME'] except Exception as e: print("error:{e} retry:{i}/{max}".format(e=e, i=i, max=CONNECTION_RETRY)) sleep(20) else: breakまずはRoute53のエイリアスレコードに設定するためのBeanstalk環境のURLを取得します
CreanteEnvironmentを検知してLambdaが走るのですが
Beanstalk環境の構築が始まってから、URLが設定されるまでラグがあるので
すぐさま取得しに行くと、怒られることがあります
ので、20秒おきにCONNECTION_RETRY分繰り返す処理をいれています2-2. Route53にレコードを追加
次に、取得したURLをRoute53のホステッドゾーンに追加します
HOSTEDZONE_ID = 'xxxxxxxxxxx' #ホステッドゾーンのidを設定 EB_HOSTEDZONE_ID = 'Z1R25G3KIG2GBW' #東京リージョンのbeanstalkで共通で使われるホステッドゾーンのID update_domain_name = eb_environment_name + '.example.local.' client = boto3.client('route53') try: response = client.change_resource_record_sets( HostedZoneId = HOSTEDZONE_ID, ChangeBatch = { 'Changes': [ { 'Action': 'UPSERT', 'ResourceRecordSet': { 'Name': update_domain_name, 'Type': 'A', 'AliasTarget': { 'DNSName': eb_environment_cname, 'HostedZoneId': EB_HOSTEDZONE_ID, 'EvaluateTargetHealth': False } } } ] } ) except ClientError as e: response = e
<beanstalk環境名>.example.comに先程取得したbeanstalk環境のURLをエイリアスレコードとして設定します
EB_HOSTEDZONE_IDは各リージョンのBeanstalk環境が共有でつかっているらしいホステッドゾーンID
参考URL: https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#elasticbeanstalk_region2-3. 完成したLambda関数
import json import boto3 from botocore.exceptions import ClientError from time import sleep def lambda_handler(event, context): HOSTEDZONE_ID = 'xxxxxxxxxxx' EB_HOSTEDZONE_ID = 'Z1R25G3KIG2GBW' CONNECTION_RETRY = 3 eb_environment_name = event['detail']['requestParameters']['environmentName'] client_eb = boto3.client('elasticbeanstalk') for i in range(0, CONNECTION_RETRY): try: response_eb = client_eb.describe_environments( EnvironmentNames=[ eb_environment_name ] ) eb_environment_cname = response_eb['Environments'][0]['CNAME'] except Exception as e: print("error:{e} retry:{i}/{max}".format(e=e, i=i, max=CONNECTION_RETRY)) sleep(20) else: break update_domain_name = eb_environment_name + '.example.local.' client = boto3.client('route53') try: response = client.change_resource_record_sets( HostedZoneId = HOSTEDZONE_ID, ChangeBatch = { 'Changes': [ { 'Action': 'UPSERT', 'ResourceRecordSet': { 'Name': update_domain_name, 'Type': 'A', 'AliasTarget': { 'DNSName': eb_environment_cname, 'HostedZoneId': EB_HOSTEDZONE_ID, 'EvaluateTargetHealth': False } } } ] } ) except ClientError as e: response = eあとはこれをさきほどのCloudWatchEventのターゲットにすればOK
雑記
たまにbeanstalkのURLが
環境名.ハッシュ値.ap-northeast-1.elasticbeanstalk.comとならず
環境名.ap-northeast-1.elasticbeanstalk.comと
ハッシュ値のないURLが付与されるのを確認しているのですが
なんなのでしょうか
- 投稿日:2019-03-07T11:25:58+09:00
AWS Powershell TagSpecificationパラメータの書き方
はじめに
公式ドキュメントにはTagSpecificationの書き方が載っていなくて困った。
ググっても出てこないし。せっかく同時にタグ付与できるのだから作成後にNew-EC2Tagで付けるのはちょっとイケてないですよね
以下サンプル
書き方はどのコマンドレットでも同じで、
Tagを付けるコマンドレットによってResourceTypeを適宜変更する必要があります。New-EC2VolumeでTagSpecification
複数行版
$TagSpecification = @{ ResourceType = "Volume"; Tags = @( @{Key = "hogehoge"; value = "foo"}, @{Key = "piyopiyo"; Value = "bar"} ); } New-EC2Volume -SnapshotId "snap-xxxxxxxxxxxxxxxxx" -AvailabilityZone "us-east-1f" -TagSpecification $TagSpecificationワンライナー
New-EC2Volume -SnapshotId "snap-xxxxxxxxxxxxxxxxx" -AvailabilityZone "us-east-1f" -TagSpecification @{ResourceType = "Volume"; Tags = @(@{Key = "hogehoge"; value = "foo"}, @{Key = "piyopiyo"; Value = "bar"}); }New-EC2SnapshotでTagSpecification
複数行版
$TagSpecification = @{ ResourceType = "Snapshot"; Tags = @( @{Key = "hogehoge"; value = "foo"}, @{Key = "piyopiyo"; Value = "bar"} ); } New-EC2Snapshot -VolumeId "vol-xxxxxxxxxxxxxxxxxx" -TagSpecification $TagSpecificationワンライナー
New-EC2Snapshot -VolumeId "vol-xxxxxxxxxxxxxxxxxx" -TagSpecification @{ResourceType = "Snapshot"; Tags = @(@{Key = "hogehoge"; value = "foo"}, @{Key = "piyopiyo"; Value = "bar"}); }使用可能なResourceTypeの一覧
このFields - Nameです。
https://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html?page=EC2/TEC2TagSpecification.html&tocid=Amazon_EC2_Model_TagSpecification
- 投稿日:2019-03-07T09:18:30+09:00
GitLabをAWS上で動かす(2/3)
前回の続きです。
GitLabをAWS上で動かす(1/3)
☞ GitLabをAWS上で動かす(2/3)
GitLabをAWS上で動かす(3/3)IPv4パブリックIPを設定
ElasticIPを設定
作ったインスタンスを選択して右クリック(もしくはアクションから)IPアドレス管理を選択。「ElasticIPを割り当てます」をクリック
新しいアドレス割当の画面に遷移するので右下「割り当て」ボタンをクリック
成功した場合は問題なく、そのまま「閉じる」ボタンをクリックしてもらって大丈夫ですが、失敗したときは下のようなエラー画面がでます。
私が遭遇したエラーはリージョンあたりのElasticIPの割り当て数が上限に達したとのエラーでした。
その場合は、Amazon EC2 Elastic IP アドレスリクエストフォームから問い合わせて上限を上げてもらいましょう。上記のエラーを対策したときの記事: AWSでEC2インスタンス作成してElasticIPを割り当てようとしたら怒られた話
ElasticIPの確認
ElasticIP一覧に追加されています。
何に使用しているかわかりやすいように適宜名前をつけてあげましょう。アドレスの関連付け
雑に名前をつけたら今度は関連付けをします。
選択して右クリック(またはアクション)から「アドレスの関連付け」を選択アドレスの関連付けの画面に遷移しますので、画像のように前回作ったインスタンスを選択
プライベートIPも選択しましょう。そして右下の「関連付け」をクリック
これで作成したインスタンスとの関連付けができました。
ssh接続確認
IPv4パブリックIPでssh接続
インスタンスに戻って確認すると先程割り当てたElasticIPがIPv4パブリックIPに表示されています。(確認終了
今回は以上です。
次回はGitLabをインストールするところから
- 投稿日:2019-03-07T00:27:21+09:00
API Gatewayが繋がらねぇ...
はじめに
普段、主にフロントエンドを触っているのですが、繋がらなかったり、予想外の挙動をしたりと頻繁にパニクるので備忘録的にまとめます。
他にもこんなハマりポイントがあったよみたいな話お待ちしております1. Missing Authentication Token...???
事象
認証なしに設定している、あるいはAuthenticationトークンをヘッダーに詰めていて適切にリクエストしているつもりなのに一生これが返ってくる
原因
APIのデプロイをしていませんでした。
初っ端からしょうもないミスで申し訳ないんですが、本当によくやるので。。
リソースに変更を加えたらデプロイをしましょう。
2. No 'Access-Control-Allow-Origin' header is present on the requested resource.
事象
通信に失敗して、インスペクタをみたら何やら赤文字で標題のようなメッセージが表示されている
原因
CORSの設定が適切ではなかった。
CORSは、Cross-Origin Resource Sharingの略です。
現在のブラウザでは、クロスサイトスクリプティングを防止するために、特定の条件の時を除き(単純リクエストと呼ばれます。参考:オリジン間リソース共有 (CORS))、プリフライトリクエストというものを実際のリクエスト前に行い、そのレスポンスに応じてHTMLを取得したサーバ以外からデータを取得することを拒否するようになっています。なので、API Gatewayを使う場合CORSを有効化し、適切に設定してあげる必要があります。
つまり今回のメッセージは、許容されないヘッダーがリクエストに含まれており、エラーが発生したということを示しているということですね。主なHTTPレスポンスヘッダーは下記のようになります。
HTTPヘッダー名 説明 Access-Control-Allow-Headers 実際のリクエストで許容するヘッダーを指定する Access-Control-Allow-Methods 実際のリクエストで許容するHTTPメソッドを指定する Access-Control-Allow-Origin リクエストを許容するオリジンを指定する CORSの有効化を行った後でもOPTIONSメソッドの統合レスポンスにて設定できます。
設定したらデプロイしてね
3. エラーレスポンスがすベてCORSエラーになっている
事象
エラーが返ってきてるのはわかるんだけど、CORSで弾かれて詳細が全くわからない。。
原因
API Gatewayでは、統合レスポンスに何らかの原因で到達しなかった場合、ゲートウェイレスポンスというものを返却しますが、こちらのCORS設定が行われていませんでした。
こんな感じで、レスポンスヘッダーをよしなに設定してあげるとうまく行くかと思います
繋がって、ちゃんとエラーさえ返って来れば一安心です。
こちらにゲートウェイレスポンスの詳細が乗っています。
個人的には、エンドポイントの指定を間違えてAPI Configuration Errorが返ってくることとかよくありました。ところで...
ステージの設定で、Cloud Watch Logsにログを出力することが可能です。
それでは、素敵なAPI Gatewayライフを!
- 投稿日:2019-03-07T00:27:21+09:00
API Gatewayに繋がらねぇ...
はじめに
普段、主にフロントエンドを触っているのですが、繋がらなかったり、予想外の挙動をしたりと頻繁にパニクるので備忘録的にまとめます。
他にもこんなハマりポイントがあったよみたいな話お待ちしております1. Missing Authentication Token...???
事象
認証なしに設定している、あるいはAuthenticationトークンをヘッダーに詰めていて適切にリクエストしているつもりなのに一生これが返ってくる
原因
APIのデプロイをしていませんでした。
初っ端からしょうもないミスで申し訳ないんですが、本当によくやるので。。
リソースに変更を加えたらデプロイをしましょう。
2. No 'Access-Control-Allow-Origin' header is present on the requested resource.
事象
通信に失敗して、インスペクタをみたら何やら赤文字で標題のようなメッセージが表示されている
原因
CORSの設定が適切ではなかった。
CORSは、Cross-Origin Resource Sharingの略です。
現在のブラウザでは、クロスサイトスクリプティングを防止するために、特定の条件の時を除き(単純リクエストと呼ばれます。参考:オリジン間リソース共有 (CORS))、プリフライトリクエストというものを実際のリクエスト前に行い、そのレスポンスに応じてHTMLを取得したサーバ以外からデータを取得することを拒否するようになっています。なので、API Gatewayを使う場合CORSを有効化し、適切に設定してあげる必要があります。
つまり今回のメッセージは、許容されないヘッダーがリクエストに含まれており、エラーが発生したということを示しているということですね。主なHTTPレスポンスヘッダーは下記のようになります。
HTTPヘッダー名 説明 Access-Control-Allow-Headers 実際のリクエストで許容するヘッダーを指定する Access-Control-Allow-Methods 実際のリクエストで許容するHTTPメソッドを指定する Access-Control-Allow-Origin リクエストを許容するオリジンを指定する CORSの有効化を行った後でもOPTIONSメソッドの統合レスポンスにて設定できます。
設定したらデプロイしてね
3. エラーレスポンスがすベてCORSエラーになっている
事象
エラーが返ってきてるのはわかるんだけど、CORSで弾かれて詳細が全くわからない。。
原因
API Gatewayでは、統合レスポンスに何らかの原因で到達しなかった場合、ゲートウェイレスポンスというものを返却しますが、こちらのCORS設定が行われていませんでした。
こんな感じで、レスポンスヘッダーをよしなに設定してあげるとうまく行くかと思います
繋がって、ちゃんとエラーさえ返って来れば一安心です。
こちらにゲートウェイレスポンスの詳細が乗っています。
個人的には、エンドポイントの指定を間違えてAPI Configuration Errorが返ってくることとかよくありました。ところで...
ステージの設定で、Cloud Watch Logsにログを出力することが可能です。
それでは、素敵なAPI Gatewayライフを!



















