AWS Cloud9でTwitter認証(omniauth)ログインをテストした際にハマった点と解決方法
ども。引き続きRuby on Railsで遊んでるのですが、今回はTwitter認証によるログインでハマった点と、その解決策について書いていきます。
そもそもTwitter認証とは
Webサービスにログインするときに、昔はメールアドレス&パスワードを入力してログインしてましたが、昨今はTwitterやFacebook経由でログインできるアレです。
Twitterの場合、↓のような画面を経由してログインできます。サービス利用者側はいちいちメルアドとパスワード入れなくてもログインできて楽というものがありますが、作る側としてはメルアドみたいな個人情報を保持しとかなくても良いっていうのは結構メリット大きいなと感じてます。
Ruby on Railsでの設定方法
2018年6月27日現在、以下Qiita様の記事の通り設定すれば後述するエラーが発生した箇所以外はうまく行きました。感謝。
qiita.com
ハマった箇所
そんで、先述したQiita様の記事に従い設定し、いざTwitterログインのリンクをクリックしたところ、以下エラーが発生しました。
調べたところ、Twitter開発用のページでアプリ登録を行う際に設定する際のコールバック用URLが誤っているときに出るエラーの模様。
403 Forbidden Extracted source (around line #236): self.token_request(http_method, uri.path, token, request_options, arguments) when (400..499) raise OAuth::Unauthorized, response else response.error! end
解決方法
元記事では、ローカルで動かす場合はWebsite、及びCallbackには「172.0.0.1:3000」と書く必要があるとの記載があり、この通りに設定していました。が、これが良くなかった模様。(まぁ、後から考えてみればローカル環境ではないので、あたりまえなのですが…)
https://apps.twitter.com/app/new で設定をする。ローカルで動かすときのためにWebsiteにはhttp://localhost:3000 ではなく、http://127.0.0.1:3000 と書かないとうまく行きません。
あと、Callback URLはhttp://127.0.0.1:3000/auth/twitter/callback にしておく。
ここで取得できるAPI KeyとAPI Secretは後々使うのでメモしておく。
具体的には、「http://localhost:3000」の部分をCloud9のプレビュー画面に表示されるURLに置き換えて設定すればTwitter認証ログインに成功しました。
・以下赤枠部分をコピーし、
・Twitterのアプリ登録画面の「Website」と「Callback」に張り付ける。「Callback」にはURLの後ろに「/auth/twitter/callback」を記入する。
で、うまく認証画面が表示されました。些細なことなのですが、色々調べても同じ事象の記事がみつからず3時間ほど試行錯誤してようやく認証画面に辿り着きました…。同じように迷っている方の参考になれば幸いです。
合格体験記 応用情報技術者試験
ども。3度目の正直になるのですが、ようやく応用情報技術者試験に合格しました。これから受けられる方は、かっこよく一発合格した体験記の方が参考になるかと思いますが、まぁ、2回落ちたからこそ書けることもあるだろうと、受かるまでのアレコレを残しておこうと思います。
受験日
2018年4月15日
スコア
1回目(不合格):
午前:68
午後:48
2回目(不合格):
午前:72
午後:58
3回目(合格):
午前:77.5
午後:68
勉強時間
120時間くらい(概算)
勉強方法
1回目
不合格となった1回目ですが、勉強期間は1か月くらい。過去問と解説書である「応用情報技術者 合格教本」を使用し、過去2年分(4回)の過去問をひたすら解き、わからないところ(大体わからない)は、解説を読む。それでも理解できない場合はWebで調べるを繰り返しました。それを3周くらい行い繰り返した上で、IPAで公開されている直近の過去問を解いたところ午前については7,8割程とれました。
問題の午後についてですが、同じく「応用情報技術者 合格教本」を使用し過去問を解くを繰り返しました。しかし、選択問題である午前問題と違い、午後問題は「○○について30文字以内で答えよ」というような問題が多く、答え合わせしたところで「テキストの解答とニュアンスは有ってるんだけど正解もらえるかわからない」といった感じが多かったです。まぁ、なんとかなるかなーと思って試験に挑みましたが上述の通り撃沈。
2回目
同じく不合格となった2回目の勉強期間は2週間くらい。午後に特化して勉強したかったので、新たに「応用情報技術者試験 午後の重点対策」を購入。またスマホアプリである「応用情報技術者 一門一答問題集」をiphoneに入れました。午前の問題は出勤時間(往復3時間くらい…)にひたすらスマホアプリで解き、仕事が終わった後2時間くらいは机の前でしっかりと午後問題を解くを繰り返しました。
「応用情報技術者試験 午後の重点対策」は、題名の通り午後に特化した問題集で、問題の解き方、時間をかけるべき問題、そうでない問題が懇切丁寧に説明されています。特に上述した「○○について30文字以内で答えよ」というような問題に対しては、問題文の用語を用意ること、文字数にあまり固執しないこと等、目からうろこな感じの解説が多く、大変参考になりました。…が、午後2点不足で不合格。単純に勉強時間不足でしたね。
3回目
ようやく合格した3回目は、2回目と同じことを追加で2週間行いました。午後問題は受ける年によって、結構難易度がかわるのですが今回は特に簡単な方だったかなと思います。なんにしても、受かってよかった。
所感
今から振り返ると、勉強期間はしっかり2か月とる。午後は最初から「応用情報技術者試験 午後の重点対策」を使って勉強する。を実施していれば1発合格できたかなーと思います。(期間が長いとなかなか、やる気スイッチが入らないんですよねぇ。)
肝心の試験内容についてですが、ネットワークやデータベース、プログラミングにセキュリティと広く、そこそこ深い内容となっています。ただし、概念や用語の内容が主になっており、この試験に合格したところで、実際にサーバを立てれるようになったり、プログラミングで何か作れるようになるわけでは無く、そこらへんは、ネットワークならCCNA、LinuxならLPIC等々ベンダー試験の方が強いなーと感じました。
ただ、いわゆるIT業界についての知識を横断的に学習できるのはこの試験くらいなので、視野を広げる意味でよい勉強になりました。これから受験を考えている方も、普段は専門に特化した勉強、および実務を行っているかと思いますが、自分の裾野を広げる意味でもチャレンジする価値はあるかと思います。
【Ruby on Rails】Checkboxの値を配列としてコントローラに渡し、チェックがついている値だけDBに保存する方法
ども。最近、趣味で毎晩Ruby on Railsで遊んでいます。twitterの100日間なにかしらコード書いていこうぜっていう趣旨の#100DaysofCodeという企画に乗っかってて、なんとか100日間継続してやっていきたい感じです。んで、本日は6日目になるのですが、振り返りも大事だろうということで、直近で学んだことをまとめておきたいと思います。
なお、この記事は最初にこの記事を知ってればもっと楽だったのにな…という観点で3日前の僕(progateのRuby on Railsを一周したレベル)を想定読者として書いています。
Checkboxのチェックがついている値だけを取得する
というわけで、記事タイトルで書いてますが、Cehckboxのリストに対し、チェックがついている値だけをDBに保存する方法について書いていきます。
Checkboxの値を配列に格納する
では、早速ですがCheckboxの値を配列に格納していきます。Ruby on Railsでチェックボックスを使う場合、check_boxというタグを使います。(ほかにもcheck_box_tagというのもありますが、ここでは説明を割愛します。)
check_boxの書式は以下の通りです。他オプションとか詳しいことはrailsドキュメントとかを見てください。
<%= check_box "オブジェクト名","プロパティ名" %>表示名
んで、オブジェクト名に指定した文字列へ、二次元配列として「"プロパティ名"、"チェック状況(0 or 1)"」が格納されます。具体例として、以下のように記述すれば…
<%= form_tag("/posts/like") do %> <ul> <li><%= check_box "gamelist", "マリオ" %>マリオ</li> <li><%= check_box "gamelist", "ゼルダ" %>ゼルダ</li> <li><%= check_box "gamelist", "カービィ" %>カービィ</li> </ul> <input type="submit" value="投稿"> <% end %>
「gamelist」という配列に、「マリオ」「ゼルダ」「カービィ」とそれに対応するチェック状況が格納されます。
上記状態だと、以下のように、それぞれのタイトルに対しチェック無しの場合は「0」、有りの場合は「1」が二次元配列に格納されます。
<gemelist配列内容>
マリオ,0
ゼルダ,1
カービィ,0
コントローラでチェックがついている値だけDBに格納
後は、form_tagで定義している/posts/likeeに対するコントローラファイルを以下の通りに定義し、チェックがついている値だけを取り出します。(ルールファイルの定義は適切にされているものとします。)
def like # params:[gamelist]で配列の値を取得可能。 # 二次元配列の場合、受取先の変数を2つ宣言する。下記例では、 # di1がタイトル、di2がチェックボックスの状態(0 or 1)が格納される。 params[:gamelist].each do | di1,di2 | # チェックボックスにチェックがついている場合 if di2 == "1" # DBのtitleカラムにタイトルを格納し保存 @get_game = GetGame.new(title:di1) @get_game.save end end redirect_to("/posts/index") end
あとは、適時redirect_to先のページで、DBの内容を表示させるなりしてください。
合格体験記 LPIC102(ver4.0)
ども。去年LPIC201に合格したとき、期限が切れてた101,102を年内に再取得できればいいなぁとか書いてたのですが、気が付けば年が明けて2月も半ばですね。あけましておめでとうございます。
合格体験記 LPIC201(ver4.5) - わかったつもりになってない?
合格体験記 LPIC202 (ver4.5) - わかったつもりになってない?
年明けてからProgateってWebサービスでプログラミング学んだりして遊んでたのですが年度内には取っちゃいたいので、今週勉強して無事LPIC 102受かりました。先に201,202から攻めていくことは希だと思うのであまり参考にならないかもですが残しておきます。
受験日
2018/2/12
取得点
640
勉強期間
1週間(一日平均2時間くらいでトータル15時間くらい)
使用テキスト
無し
参考にしたサイト(Web問題集)
勉強方法
今回実機は使用せず、ひたすらPing-tの問題を解きながら学びました。先にLevel2を取得している身としては、余裕だろうなーとか思ってたのですが、結構初見(覚えていない)問題が多くて焦りました。
特に、ディスプレイマネージャや、プリンター周りが覚えていなかったので、重点的に勉強。全て金になるまで説いたあと、前日に学習履歴を全て削除して、再度金になるまで解きました。
これから勉強する人は、とりあえずPing-tのWeb問題集を9割り以上解ける状態にして挑めば、そうそう落ないんじゃないかなと思います。
所感
流石にここで落ちたら恥ずかしいなとか思っていたので、無事受かって一安心です。
今後
というわけで、年度内にLPIC Level2の取得を目指して、ボチボチ勉強していたのですが、残すところはLPIC 101のみとなりました。2月中には取得できるよう頑張ります。
合格体験記 LPIC201(ver4.5)
ども。先月LPIC202に合格したよ!っていう記事を書いたのですが、本日LPIC201に合格したので同じように誰かの参考になればと書いていきます。
普通201,202と攻めていくのですが、なぜ逆かというと201は以前合格したのですが、有効期限(5年)が切れていて、そのことをすっかり忘れていたためになります。5年って早いね!ちなみに101と102も期限切れてるよ!
受験日
2017/12/3
取得点
590
勉強期間
3週間(一日平均2時間くらいでトータル5,60時間くらい)
使用テキスト
無し
参考にしたサイト(Web問題集)
勉強方法
各セクションのPing-tの問題をまずは解く。大抵わからないので、解答をしっかり読む。出てきたコマンドの内、今まで使ったこと無いやつについては、AWSの無料枠を利用して実際にコマンドを打って結果を確認する。…をひたすら繰り返しました。(Ping-tのコマ問については未実施)
AWSはAmazon LinuxとRed Hatを主に使ってましたが、デフォルトでは入っていないコマンドが結構あり、その都度しらべてyumでインストールしてました。入ってなくて、インストール方法がわからない場合は机上での勉強のみです。
所感
実際に動作を確認できたコマンドについては理解が進むのですが、以前書いたとおりAWS上だと実行不可と思われるコマンド(ブートローダとか、無線コマンドとか)については理解がイマイチで点数も取れていませんでした。。。
特にカーネルの項目が壊滅的だったので、復習します。
今後
というわけで、理解がイマイチだったところは復習しつつ、期限が切れてたLPI101,102を勉強していきます。今年中に取れればよいなぁ。
Linuxの無線デバイス/インターフェイス設定コマンドまとめ
ども。LPIC201の学びで、ディスク周りは一通り終わって今度はネットワーク周りで遊んでいる昨今です。
んで、無線周りのコマンドがAWSでは触れなくて、理解がイマイチなのでカーネルの時と同じくGoogleスプレッドシートにてチートシート的なものを作成したので公開しときます。
iwコマンドについてGoogle先生とかに聞いてみたのですが、なかなか良い感じの解説がないですね。。。良いサイトがあれば誰か教えてください。
参考にしたサイト
【AWS】EBSでRAID1+0をやってみたメモ ~後編:EBSのアタッチからRAID構築~
ども。前回はRAIDってなんぞや?について書きましたが、今回は実際にAWS触ってRAIDを組んで行きたいと思います。
EC2インスタンス作成
なにはともあれ、AWSコンソールにログインしてEC2インスタンス(仮想サーバ)を作成。ここら辺の手順は端折ります。今回のOSははAmazon Linuxを指定。
作成前のディスク状態をlsblkコマンドで確認。ディスクはxvdaのみ存在します。
EBS作成
EBS(Amazon Elastic Blok Store)とは何かと言うと、要は外部ディスクですね。EC2インスタンスに対してAWSコンソール上で簡単にアタッチ(接続)/デタッチ(切断)できるとのこと。
EC2インスタンス作成時に、複数EBS作ることもできるのですが、今回は後から作成してみました。
N個のボリュームをクリック
ボリュームの作成をクリック
サイズを1GiBに変更し、ボリュームの作成をクリック
※ 注意!EBSサイズの合計が30GiBを超えると無料枠外となり料金が発生します。
できました。これを後3回繰り返します。
EBSアタッチ(接続)
では、作成したEBSをEC2インスタンスに接続します。
対象のEBSを選択後、右クリックし「ボリュームのアタッチ」をクリック
インスタンス欄にて作成したEC2インスタンス名を選択しアタッチをクリック
これを、作成したEBS全てに行います。
再度lsblkコマンドで確認
ディスクが増えました!
mdadmコマンドインストール
以下コマンドでRAID管理用のコマンドをインストール…と思ったら既にAmazon Linuxには入っていました。昨日Red Hatで試したときは入ってなかったんですがね。ない場合は適時入れましょう。
sudo yum -y install mdadm
RAID1(ミラーリング)設定
では、ようやくRAIDを組んでいきます。まずは以下コマンドでEBSを2づつミラーリングしていきます。今回は、/dev/xvdgと/dev/xvdiでミラーリング。
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/xvdg /dev/xvdi
ブートデバイスとして適してないです的なメッセージが出ますが、ブートデバイスでは無いので「y」を入力すると作成できました。続いて残りの/dev/xvdhと/dev/xvdfも同じコマンドでミラーします。
sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/xvdh /dev/xvdf
lsblkコマンド実行結果。それぞれのディスクがmd0,md1に属してます。
「/proc/mdstat」ファイルをcatするとRAID情報が見れます。
これで、それぞれのディスクでRAID1が組めました。
RAID0(ストライピング)設定
では最後に作成したRAID1のデバイスである「/dev/md0(xvdgとxvdiのペア)」と「/dev/md1(xvdfとxvdhのペア)」でRAID0(ストライピング)を組みます。
sudo mdadm --create /dev/md2 --level=0 --raid-devices=2 /dev/md1 /dev/md0
md0とmd1はRAIDアレイですよとのメッセージが出てきたのでyを入力。無事作成できました。
mdstatファイルは以下のようになりました。md0とmd1でRAID0が組めていることが確認できます。
ファイルシステム作成
作成したRAID0のディスクを実際に使っていきます。
sudo mkfs -t ext4 /dev/md2
マウントしてサイズ確認1GiBのEBS4本をRAID1+0したので、サイズは2.0Gになりましたね。
というわけで、RAID1+0できました。眠いので自動マウント設定と、パフォーマンスチェックはまた後日に行いたいと思います。