いしのなかにいる

*いしのなかにいる*

oops ! I am in rock !

EC2からRDSに接続しようとしたら「ERROR 2003 (HY000): Can’t connect to MySQL server」が出た

しばらく構築していないとさっぱり忘れてしまうのがAWSの設定

今回RDSを作成したので、EC2から接続しようとしたところ、、、

$ mysql -h mysql–instance1.123456789012.us-east-1.rds.amazonaws.com -P 3306 -u master_user -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on 'kintaidb.cisfvswdjdlg.ap-northeast-1.rds.amazonaws.com' (110)

ん?接続できないとな!?

「ERROR 2003 (HY000): Can’t connect to MySQL server」

はじめはポート指定-P 3306さえしていなかったので「はいはい」という感じだったのですが、
ポートを設定しても改善せず・・・

結論、セキュリティグループの設定不足

原因は非常に単純で、RDSさんが外からのアクセスを受け付けていませんでした。

なのでRDSに適用しているセキュリティグループの設定を変更します。

  • 設定変更

DS作成時に特に設定していなければ「rds-launch-wizard-1 (sg-xxxxxxx)」みたいのが設定されているはずなので

以下のように変更

f:id:malor:20190327154923p:plain
SGの設定

  • 接続確認
$ mysql -h mysql–instance1.123456789012.us-east-1.rds.amazonaws.com -P 3306 -u master_user -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 332
Server version: 10.3.8-MariaDB-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

これで無事に繋がるようになりました。

(いつまでも覚えていられる頭がほしい。。)

【AWS】EC2作ったらまずはrootユーザのパスワードを設定しよう

新規にEC2インスタンスを作って「さぁなにかやろう」となると大概こんなエラーが出ます。

$ yum install httpd
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
このコマンドを実行するには root である必要があります。

そんで su してルートユーザで作業しようとすると、

$ su
パスワード:
su: 認証失敗

なんて出てきて、そもそもパスワード設定なんてしたっけ?って状態になる。 もちろん設定なんてしていない・・

AWSの新規インスタンスはrootユーザのパスワードが設定されていないそうなので、ちゃんと設定してあげましょう。

rootユーザのパスワード設定方法

とりあえず ec2-user でログイン

$ ssh ec2-user@xxx.xxx.xxx.xxx -i hoge.pem 
  • xxx.xxx.xxx.xxx: パブリックIP
  • hoge.pem: キーペア

rootユーザにクラスチェンジ

$ sudo su -

rootユーザのパスワード変更

# passwd
Changing password for user root.
New password: (パスワードを入力)
Retype new password:(もう一回)
passwd: all authentication tokens updated successfully.

無事にパスワードの変更完了❗

$ su
パスワード:
# yum install httpd
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                                                         | 2.4 kB  00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。

~~~中略~~~

依存性関連をインストールしました:
  apr.x86_64 0:1.6.3-5.amzn2.0.2                       apr-util.x86_64 0:1.6.1-5.amzn2.0.2             apr-util-bdb.x86_64 0:1.6.1-5.amzn2.0.2         generic-logos-httpd.noarch 0:18.0.0-4.amzn2
  httpd-filesystem.noarch 0:2.4.37-1.amzn2.0.1         httpd-tools.x86_64 0:2.4.37-1.amzn2.0.1         mailcap.noarch 0:2.1.41-2.amzn2                 mod_http2.x86_64 0:1.11.1-1.amzn2

完了しました!

これでいろいろできるようになりました! こういうちょっとしたことで詰まるから作業が進まないんだよな。。。

【Androidアプリ開発】adbコマンドをMacのターミナル上で使えるようにする

こんにちは

最近ようやっとターミナル上でadbコマンドを使うようになりました。

特にコツとかはないですが設定方法をまとめておきます。

実機のAndroid端末のログが見たい!

いつもAndroid Studioを通してデバッグしていましたが、「cordova run android」 で実機にアプリを登録したあと、

ログってどうやってみるの???

という初心者丸出しな自体にぶち当たってしまいました。

皆さんご存知かとは思いますが、私のようなレベルの方向けに設定方法を記載しておきます。

設定方法

とりあえずパスが通っているか確認しましょう。 コンソールで「adb」と打ちこんでみます。

$ adb
zsh: command not found: adb

はい、そんなコマンドは知らん!というメッセージが返ってきましたね。

これは adb というコマンドにパスが通っていないためです。

なので、adbコマンドへパスを通しましょう。

↓↓パスの記載場所はこちら↓↓

f:id:malor:20171020150722p:plain

「このパス+platform-tools」を、.bash_profile なり、.bashrcなりのターミナル起動時に読み込まれるファイルに記載すれば準備オッケーです。
(私はzshを使用しているのでとりあえず.zshrcに記載しました。)

(~/.zshrc)
下の行を「ドットファイル」の最終行に追記
export PATH=$HOME/Library/Android/sdk/platform-tools:$PATH

追記したらファイルを再読み込みします。

$ source ドットファイル名

例)./zshrcの場合
$ source ./zshrc

これでパスが通りました。
本当に通っているか確認しておきましょう。

コンソールで「adb」と打ちこんでみます。

$ adb
Android Debug Bridge version 1.0.39
Revision 3db08f2c6889-android

~~~ 省略 ~~~

「command not found: adb」が表示されていなければ成功です。

まとめ

これでadbコマンドが使えるようになりました。

ログ参照の他に、端末のモニタリングとかインストールされているアプリの確認とかできるようです。

面白そうなので色々試してみます!

Android Debug Bridge(公式サイト)

cordova run android コマンドで 「Error: spawn EACCES」が発生した時の解決方法

cordovaアプリを実機で試してみようと

$ cordova run android

を実行したら

$ cordova run android

ANDROID_HOME=/Users/user/Library/Android/sdk
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home
Subproject Path: CordovaLib
Error: spawn EACCES

なんてエラーが発生しました。

特に設定とかを変更したつもりはなかったのですが、、、

ググってもうまく改善できずしばらくハマったので、解決方法をメモっておきます。

原因: 権限不足

どうやら 「Error: spawn EACCES」と表示されるのは実行権限が問題のようです。

何も変更したつもりはないのですけどね。

解決方法

とりあえず何を実行しようとして怒られているのか調べてみましょう。

verboseを指定して出力内容を見ます。

$ cordova run android --verbose

~~~ 省略 ~~~
ANDROID_HOME=/Users/user/Library/Android/sdk
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home
Subproject Path: CordovaLib
Running command: /Users/user/project/cordova/platforms/android/gradlew cdvBuildDebug -b /Users/user/project/cordova/platforms/android/build.gradle -Dorg.gradle.daemon=true -Dorg.gradle.jvmargs=-Xmx2048m -Pandroid.useDeprecatedNdk=true
Error: spawn EACCES

どうやら「Running command: /Users/user/project/cordova/platforms/android/gradlew」というところでエラーになっているようですね。

EACCESは実行権限の問題なので gradlew に実行権限を与えます。

$ chmod +x /Users/user/project/cordova/platforms/android/gradlew

そして再実行してみます。

$ cordova run android --verbose


~~~ 省略 ~~~
ANDROID_HOME=/Users/user/Library/Android/sdk
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home
Subproject Path: CordovaLib
Running command: /Users/user/project/cordova/platforms/android/gradlew cdvBuildDebug -b /Users/user/project/cordova/platforms/android/build.gradle -Dorg.gradle.daemon=true -Dorg.gradle.jvmargs=-Xmx2048m -Pandroid.useDeprecatedNdk=true
↑↑↑
エラーになっていたコマンド

google-services plugin could not detect any version for com.google.android.gms or com.google.firebase, default version: 9.0.0 will be used.
please apply google-services plugin at the bottom of the build file.
~~~ 省略 ~~~
LAUNCH SUCCESS

無事にアプリが実機で起動できました。

まとめ

どうやら原因はAndroid Studioのアップデートをしたことのようです。

gradeの実行権限が変わっちゃったんですね。

iOSなんかでもあるけど、アップデートでいきなり権限を書き換えるのはやめてほしいな〜。

以下の記事が参考になりました。 ありがとうございました。

cordova buildでError: spawn EACCESが発生した時の対処方法(Qiita)

【Rails】ポート番号を指定してRailsサーバを起動する方法

こんにちは

開発環境でRailsのサーバを起動するときって、いつもこんなコマンド打ちますよね?

bundle exec rails s

今までこれで起動して困ることはなかったのですが、複数のサーバを同時にあげようとしたときに「どうすんだ?」って軽くはまったのでメモです。

複数のRailsサーバを起動するには

ローカルの開発環境で複数のRailsサーバを起動するときはポート番号を指定します。

冒頭で打ったコマンドに「-p」オプションをつけると指定可能になります。

$ bundle exec rails s -p 3001
=> Booting WEBrick
=> Rails 4.2.2 application starting in development on http://localhost:3001
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-04-30 06:47:48] INFO  WEBrick 1.3.1
[2016-04-30 06:47:48] INFO  ruby 2.3.0 (2015-12-25) [x86_64-darwin15]
[2016-04-30 06:47:48] INFO  WEBrick::HTTPServer#start: pid=38169 port=3001

これで、http://localhost:3001でサーバにアクセスできるようになります。

サーバ起動時によく使うオプション

私がサーバ起動時によく使うオプションはこんな感じです。

-p(--port=port):サーバを起動するときのポート番号を指定する

初期値:3000
使用例:ポート番号3001番でサーバを起動する

$ bundle exec rails s -p 3001

-b (--binding=ip):バインドするIPアドレスを指定する

使用例:他の端末からアクセスできるように指定

$ bundle exec rails s -b 0.0.0.0

-e (--environment=name):環境(test/development/production)を指定してサーバを起動する

初期値:development
使用例:production環境としてサーバを起動

$ bundle exec rails s -e production

そのほかのオプション

私はほとんど使わないのですが、他にはこんなオプションがあります。

オプション 説明 初期値
-c (--config=file) rackupファイルを指定
-d (--daemon) デーモンとしてサーバを起動
-u (--debugger) デバックモード
-P (--pid=pid) PIDファイルを指定 tmp/pids/server.pid
-h (--help) ヘルプを表示

最後に

複数プロジェクトを並行して開発しているときなんかに使うことがあるかもなので覚えておいて損はないオプションです。
いろんなオプションを覚えてどんどんRails力を上げていきましょう!

S3バケットにアップロードしたファイルを一括ダウンロードする方法

S3に置いてあるファイルを一括でタウンロードしたい

既存の Wordpress サイトを Local by Flywheel に移行するため、S3に上げたファイルを一括ダウンロードする必要が出てきたのですが、、

S3のファイルってAWSコンソールからだと一つずつしかダウンロードできないのですね。。

リソースが少ない場合はそれで問題ないのですが、私は画像ファイルやらなんやらをたくさん置いていたので大問題。

結論、AWS-CLIを使えば可能!

google先生に聞いた結果、AWS-CLIAWS Command Line Interface )というものを使えばできる!ということがわかりました。

AWS-CLIってなんじゃい!という方はこちらをご参照ください。

やり方がわかってしまえばあとは簡単。

$ aws s3 cp s3://S3バケット名/ ダウンロード先パス --recursive

はい、コマンド一発!

一応コマンドの補足をしておきますと、

  • aws s3: S3を操作するAWS-CLI のコマンド名
  • cp: コピーして持ってくるということ(S3のファイルはそのまんま)他にmv, rm, ls などがある
  • S3バケット名: 名前の通りS3のバケット
  • ダウンロード先パス: ローカルの保存先(例: ~/Downloads)
  • --recursive: バケット内のフォルダを再帰的に辿ってくれる。要はバケットの中身全部持ってくるということ

感想

AWS-CLIはすごい便利!
どんどんコマンドを覚えていこうと思いました。

【JavaScript】Date型の値を比較するには

こんにちは。

なぜかDate型の比較がうまくいかったので調べてみました。

同じ日付、時刻でもイコールにならない

同一の日時を持っていても別オブジェクトの場合、「==」とか「===」での比較はfalseになる

「<」とか「>」はうまくいくのに・・・

date = "Tue Mar 15 2016 00:00:00 GMT+0900 (JST)"

new Date(date) == new Date(date) // false
new Date(date) === new Date(date) // false

chromeの開発者ツールでも確認できるので、自分で動かして確認すると理解しやすい

getTime()を使用すると比較できる

Javaならequals()を使いたいとこだが、そうも言ってられないのでDate.prototype.getTime を使用して比較する。

date = "Tue Mar 15 2016 00:00:00 GMT+0900 (JST)"

new Date(date).getTime() == new Date(date).getTime() // true
new Date(date).getTime() === new Date(date).getTime() // true

最後に

「==」とか「===」で普通に比較が成功すればいいのに・・・