40歳の未経験からプログラミングスクールを受講して三十二日目
おはようございます。8月20日木曜日
今日も朝のランニングをやめようかと迷いながら時間ギリギリに孟ダッシュ
結局やりました、ルーティンも間に合いました。何事も毎日当たり前のように継続するのは難しいですね。継続のコツなんてない、ただやるだけだ!!!学生時代、サッカー部の顧問の先生に言われたのを覚えてます。多分、自分一人のためだけに言ってくれてたんだなと今になって感謝します。
今日のドリルの復習
配列の要素のフルーツ名とその一つに対して値段の要素が3つ入ってる初めてみる形の配列
フルーツ = フルーツ名1,[200,240,250,[フルーツ名2,[300,340,350]]]を
(出力) appleの合計金額は670円です orangeの合計金額は300円です melonの合計金額は2700円です
の形になるようにコードを書く
フルーツ.each do| fruit|で更に
fruit[1].each do|値段|
値段を合計させる
フルーツ名の合計金額は00です。と表示させる
初めて、.each do |i|が連続で出てきて理解しにくかったが、こういう使い方もあるのかとただ驚くだけです
今日は、退館時間が近づくと帰れコールが素晴らしい図書館で勉強してました。残り10分で今日の振り返りをします。
今日は、javascriptとrubyのAPIを実装したのと
デプロイについて、herokuの登録を行いました。
今日で残り38日いよいよ半分近くなってきましたが、最初できないことが気になって前に進めなかったのですが、わからなくてもとりあえず通り過ぎ、後で復習するとあら不思議、1回目全くわからなかったことが2回目少しわかるやん、って気づいて飛ばす飛ばすを意識してやってます。
復習するしか方法がない。40歳の記憶力と20歳の記憶力は変わらないとネットで見たことあるけど、40歳と20歳のプロスポーツ選手の体力が同じやと言ってるのと自分からしたら同じです。もちろん、人生経験があるとかの部分は考慮したとしても:・・・・
時間なので今日は、ここいらでお疲れ様でした。
40歳の未経験からプログラミングスクールを受講して三十一日目
おはようございます。8月19日水曜日
今日は、まだ少しだけ涼しいです。朝のルーティンをギリギリ終え、テックの授業を始めてます。今日も寝坊確信犯です。
今日のドリルの振り返りです。
今日は、ユーザーが入力した数字が10以下なのか、0以下なのか10より大きいのか、を条件分岐ifとelseを使ってコードを書きなさい。みたいな問題
僕は、正直すぎて、問題文に書いてあった条件のまま、if文を作成してしまい。出題者のひっかけにまんまとかかりました。
if
10以下なの?
0以下なの?
10より大きいの?
これだと-3を入力した時出力は、”10以下"になる・・・
本来は、”0以下"を出力したい。
if文は上から順に処理されるためにif文の中をかえる必要がある。
日本語でこうやって書くとわかりやすいけど、コードになったとたんわからなくなる症候群!!
駆け出しエンジニアいやまだ、駆け出してもない。
今日の振り返り、今日は、
オリジン(Origin)
非同期通信
を習いました。特に非同期通信については、何気にLineなどの既読になるなどで使っていたとは気付きませんでした。考えた人天才。
明日も1つ1つ積み重ねて行きます
40歳の未経験からプログラミングスクールを受講して三十日目
8月18日火曜日
おはようございます。今日もなんとか朝のルーティンを行ってまいりました。一度寝坊癖がつくと永遠に繰り返されてしますのでこの辺で一度気持ちを引き締めないとと毎日寝る前に思う今日この頃ですが、暑い中みなさま体を崩されてないでしょうか???
(このブログ誰も読んでないか笑)
それでは、今日も一日がんばります。
昨日は、セキュリティを学びましたが、難しいくて自分が公開する時は、SECOMかALSOKに頼みます。
今日の学んだ事
いつも小テスト見たいのがあるのですが、毎回できません。そこで少しでも解答見てでもできるように自分なりに習ったことを書きます。
今日は、ユーザーが名前を入力した名前の中に"."(ピリオド)、" "(スペース)があればエラーを出すメソッドを定義するなのですが、include?( )を使って書きなさい。
def 作りたいメソッド
条件分岐."(ピリオド)、" "(スペース)
それ以外 入力完了
end
ユーザーに入力を促す文
入力された文を変数に代入する文、変数を上のメソッドの引数に代入する文
大まかに自分なりに日本語だけで書くとこうなりした。
これを繰り返して答え見ずに自分でできるようになりたいです。
今日の振り返り、今日は、sqlをクエリで句を試してみる事でした。いろんな句が出てきて便利だなと思う反面使い方だなと感じました。今日で30日丸々経ちましたが、詰め込んで知識は、お湯がいっぱいになった所にダイブするように知識も溢れているような気がします。繰り返し、アウトプットするしかないな
40歳の未経験からプログラミングスクールを受講して二十九日目
8月17日月曜日
おはようございます。昨日の晩寝付けなくて、今日の朝寝坊してランニングにいけなかった懺悔です。その他のルーティンは、きっちりとやっております。朝のランニングを夜に補うつもりです。
今日の学習
脆弱性(ぜいじゃくせい)とは、アプリケーションなどにおいて、セキュリティの弱点を作り出す仕様上の問題点のことをいいます。つまり、「Webアプリケーション上で悪意のある者に攻撃を仕掛けられる際の弱点」と言い換えることができます。
XSSとは、攻撃者が脆弱性のあるWebアプリケーション上に、悪意のあるJavaScriptのプログラム(スクリプト)を埋め込み、そのサイトの利用者を攻撃する手法です。
このスクリプトを埋め込んで実行させることが「スクリプティング」に該当します。
反射型XSS
ユーザーが悪意のあるURLをクリックすると、脆弱性のあるWebアプリケーション上でスクリプトが実行されるようにする手法です。
それぞれのステップについて説明します。
①ユーザーにURLをクリックさせる
悪意のある者が、ユーザーに悪意のあるURL(脆弱性のあるWebアプリケーションへ遷移するURLに細工をしたもの)をクリックさせます。ユーザーにクリックさせる方法は、メールで送付したり、掲示板などに書き込んだりします。
②ユーザーがクリックすると脆弱性のあるWebアプリケーション上でスクリプトが動く
上記の悪意のあるURLには、脆弱性のあるWebアプリケーション上で発火するスクリプトが仕込まれています。すると、ユーザーが脆弱性のあるWebアプリケーションのページを開くと、そのスクリプトが発火します。
③スクリプトが発火すると、悪意のある者のサーバーへ個人情報が送られる
直前のステップで発火したスクリプトは、個人情報を抜き取るようなものでした。クリックしたユーザーの個人情報が悪意のある者のサーバーへ記録されてしまいました。
この様に、URLをクリックすると即座にレスポンスとしてスクリプトが実行されることから、「反射型」と呼ばれます。
また、上図のように別のサイト(またはメールなど)から、脆弱性のあるWebアプリケーションへ遷移したあとにスクリプトが実行されます。これが「クロスサイトスクリプティング」の「クロスサイト(Webサイト間をまたぐ)」を意味します。
格納型XSS
脆弱性のあるWebアプリケーションの投稿などに、悪意のあるスクリプトを埋め込み、ユーザーがそのWebアプリケーションを訪れたときにスクリプトが発火するようにする攻撃手法です。
それぞれのステップについて説明します。
①悪意のある者が、脆弱性のあるWebアプリケーションにスクリプト付きの投稿をする
フォームとして投稿する際に、スクリプトを埋め込んで投稿をします。
②ユーザーがその投稿があるページを訪れるとスクリプトが発火する
スクリプトが埋め込まれた投稿のページを開くと、そのスクリプトが発火します。または、画像にマウスを合わせるとスクリプトが発火するような仕掛けになっていることもあります。
③スクリプトが発火すると、悪意のある者のサーバーへ個人情報が送られる
直前のステップで発火したスクリプトは、個人情報を抜き取るようなものでした。ユーザーの個人情報が悪意のある者のサーバーへ記録されてしまいました。
このように、脆弱性のあるWebアプリケーションにスクリプトを格納し、ユーザーが訪れたタイミングで発火するようになっていることから「格納型」と呼ばれます。
アプリケーションのSQLの不備を利用して、データベースシステムを不正に操作されることがあります。
このような攻撃方法をSQLインジェクションと言います。
「Webページのテキスト入力欄」や「URL」などにSQL文の断片を埋め込むことで、データベースを改竄したり不正に情報を入手する手法のことです。
入力フォームから送信した値によりアプリケーションが想定しないSQL文を実行させ、攻撃を行います。
例えば、フォームを送信するときの文書の中に、ユーザーの権限を変更するようなSQLを仕込んで送信します。すると、サーバーサイドでそのSQL文が実行され、ユーザー権限が変更されてしまような処理が行われます。
SQLインジェクションの対策
それでは、SQLインジェクションに対して、どのような対策が行うべきなのか考えていきましょう。
一般的なSQLインジェクションの対策方法を学ぼう
この方法は、手作業でSQL文を記述し、サーバーサイドを実装する場合の対策方法です。Ruby on Railsを学んできた方々においてはあまり馴染みのない方法と言えるでしょう。ここでは、SQLの詳細について登場するため、まずは流れを掴んでいただければ問題ありません。
SQLインジェクション脆弱性を一般的に解消するためには、SQL文を組み立て実行される際にSQL文を変更されることを防ぐことです。SQL文の変更を防ぐには以下の2つの対策方法があります。
対策①:意味のある文字列の変換
基本的な対策としてあげられるものが、SQLにおいて意味を持つ特殊文字のエスケープです。SQL文中では「'」が文字列の終端を意味していることがポイントです。
たとえば、データベース内に格納されたuser_idとpasswordが一致すると、ログインなどの認証を認めるアプリケーションを考えてみましょう。
ここで、認証に用いられるSQL文は以下になります。
1 2 |
-- $uid(user_id)と$pwd(password)はユーザのフォームの入力値 SELECT * FROM users WHERE user_id='$uid' AND password='$pwd' |
ここに、以下のように入力します。
1 2 |
$uid tarou $pwd ' OR 'A'='A |
すると前述のSQL文は以下のようになります。
1 |
SELECT * FROM users WHERE user_id='tarou' AND password='' OR 'A'='A' |
もし、特殊文字である「'」をエスケープしていなかった場合、WHERE句の中ではuser_id='tarou' AND password=''と'A'='A'の2つの条件を判定することになります。この2つの文はORでつながっているため、どちらかがtrueの場合は認証が認められてしまいます。'A'='A'は確実にtrueのため、user_idとpasswordが一致していなくても認証が通ってしまいます。
しかし、特殊文字をきちんとエスケープした場合はユーザからの入力の「'」は単なる文字列として扱われるため、password=' ' OR 'A'='A'という一連の文字列となり、SQL文は実行されません。実際にエスケープを行う場合は、フォームから「'」を含む文字列が送信された場合に、別の記号で置き換えるような実装をすることで実現できます。
対策②:より厳格なSQL文の生成
ユーザからの値をSQLへ反映する前に、SQL文の構造を確定する仕組みをとることで、より厳格に対策できます。SQL文確定後にユーザからの値を入れて実行するためユーザの入力値によってSQL文が変更されることはありません。
先ほどの例を用いると、データベースに対する処理を行う前に、以下のSQLを用意しておきます。
1 |
SELECT * FROM users WHERE user_id=? AND password=? |
ここで、user_idとpasswordの値として「?」が使われており、これをプレースホルダーといいます。
プレースホルダーはユーザの値が入力されるまでの一時的な仮引数のようなものです。あらかじめ確定したSQLにおいて、可変の値が入力される箇所に配置します。
このようにプレースホルダーを用いて設定すれば、「usersテーブルにおいてuser_idとpasswordの組み合わせが一致するかどうかを判定できる」という構文を事前に確定することができます。この後ユーザからどのような値が入力されようとも、上記の構文の中でSQLが実行されることになり、SQLインジェクションを防ぐことが可能です。
すなわち、passwordとして' OR 'A'='A'と入力をしても、これらは単純な文字列として認識されます。
40歳の未経験からプログラミングスクールを受講して二十八日目(毎朝のルーティン解説付き)
8月16日日曜日
今日は、お盆最終日ですがお勉強します。朝10時に図書館に到着、少し涼んで勉強開始!!滑り出しは順調!!
あっ、朝のランニングから始まるモーニングルーティンも、きっちりやってきましたよ。
いつもの行動
6時30分起床
ランニング、筋トレ、シャワー
7時30分
英語のリスニング(今年の5月から開始、40過ぎても急に英語を話したくなる)
8時00分
株価のチェック&株の学校のオンライン画像で勉強(2年くらい前から急に株を知りたくなり勉強を始める)
8時45分
ネットでマーティンぐの動画を見て勉強(これも前職の飲食店経営の時に自分の実力のなさ、勉強不足を実感して、今年の1月から始めました)
10時
テックキャンプ開始(これも40歳になって自分でアプリを作りたい思いがつのり勉強開始)
いつもこのルーティンです。まあ、独身だからできるのかもしれないですね。
3年後には、
一、トレードで稼げるようになる。目標、年間プラス3000万(目標は高く)
一、英語が会話ができる。聞く話す(海外の方がと躊躇せずに話せるようになる)
一、マーケティングを習って自分で使いこなせるようになる(もう一度、自分で経営した時に実戦で使えるようになる。机上の空論型ではなく、実戦行動型になる)
一、アプリを作れるようになる。(一人で開発するなら、1年に最低1個以上、)
まあ、あれもこれもと朝6時30分から10時までの時間帯で結構、疲れます。
けど、自分からしたいと思った事と、今後、自分の人生を有意義に遊びながら暮らそうと思って必要なことを身につけようと考えたらこうなりました。
あんまり、人に言うと実現しなくなるとか世間では言われてるけで、自分との約束をすることによって、実現しようと行動するから宣言するのです。口動ではなく行動を!!(まあ、このブログ見てる人は0人近いですからほぼ、自分への約束ですね、、、。)
プログラミングの勉強に写ります。
今日の勉強したこと
今日は、テストコード、単体、結合両方とも復習しました。
このように、結合テストコードは、ユーザーがたどる一連の流れを確認するものです。結合テストコードを実行するためには、System Specという技術を使用します。
System Spec
System Spec(システムスペック)は結合テストコードを記述するための仕組みのことを言います。大枠の記述はこれまでのRSpecと変わりません。
System Specを記述するためには、CapybaraというGemを用います。これはすでにデフォルトでRuby on Railsに搭載されています。
Capybara
Capybara(カピバラ)はSystem Specを記述するために必要なGemです。以下のようにGemfileに標準で記載されています。すなわち導入済みです。
1 2 3 4 5 6 7 |
40歳の未経験からプログラミングスクールを受講して二十七日目
8月15日土曜日
今日は、自学習の日です。元々自学習だと思いますが、、、
まあ、zoomで話すことでストレスの解消にもなるからやっぱり人は、人がいないと生きていけないと改めて思う40歳です。
今日も夏、真っ最中でがんばります。
今日習った事
インラインスタイル
インラインスタイルとは、要素の開始タグの中に直接CSSのソースコードを記述するプロパティの指定方法です。
インラインスタイルの追加と削除はそれぞれsetAttributeとremoveAttributeというメソッドを使用します。
setAttributeメソッド
setAttributeを用いることで、指定した要素上に新しい属性を追加、または既存の属性の値を変更します。
1
|
要素.setAttribute(name,value);
|
- nameは属性の名前を文字列で指定します。
- valueは属性に設定したい値を指定します。
例えば、以下のようにHTML要素に属性を付与することができます。
1
|
<div id="test">テスト</div>
|
1
2
3
4
|
const sample = document.getElementById("test")
sample.setAttribute("style", "color: red;")
// <div id="test" style="color: red;">テスト</div>
|
removeAttributeメソッド
removeAttributeを用いることで、指定した要素から、特定の属性を削除します。
書き方はsetAttributeと同じです。
1
|
要素.removeAttribute(name,value);
|
- nameは属性の名前を文字列で指定します。
- valueは属性に削除したい値を指定します。
例えば、以下のように指定した要素の属性を削除することができます。
1
|
<div class="contents" id="apple">りんご</div>
|
1
2
3
4
|
NOT NULL制約
NOT NULL制約は、テーブルの属性値にNULL(空の値)が入らないように制限する制約です。
たとえば、usersテーブルの「name」カラムにNOT NULL制約を設定すると、nameカラムが空のレコードだと保存できなくなります。この制約は、t.string :nameにnull: false
と記述することで、設定できます。
1
2
3
4
5
6
7
8
|
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name, null: false
t.timestamps null: false
end
end
end
|
指定したカラムが、DBに空のままの状態で保存するのを防ぎます。
カラム名の後にこれを記述します。
書き方は、以下のように記述します。
1
|
t.型 :カラム名, null: false
|
今日の振り返り。。。
今日は、最高気温が38度を超える猛暑日でした。図書館に来たのも14時過ぎ、一番暑い時に移動してきたのが疲れた原因?
まあ、言い訳はいいとして、今日は、集中が続かず気がつけば、youtube見てました。
明日は、朝10時オープンと同時に図書館に移動します。
それではまた明日。
40歳の未経験からプログラミングスクールを受講して二十六日目
8月14日金曜日
おはようございます。夜暑くて目が覚め、朝起きれない寝坊王です。
しかし、朝のルーティンのジョギング、(今日は、ウォーキングでしたね)、筋トレもなんとか行い。10時には、パソコンの前に・・・・。今日も一日、勉強します。
今日の学習した事
SQL
(エス・キュー・エル/シークェル)とはStructured Query Languageの略で、RDBの操作を行うための言語です
SELECT文
SELECT文とはSQLの文法で、「データベースからデータを取得する」場合に使用します。
SELECT文は下記のように使用します。
find_by_sql
find_by_sqlメソッドは、Ruby on RailsでSQL文を使用し、データを検索し取得する際に使用するメソッドです。
JavaScript
ブラウザ上で実行される言語です。JavaScriptを用いることで主に以下のような操作が可能になります。
- ページ遷移なしで、画面の表示を切り替えることができる
- 画面を更新をせずに、サーバから値を取得することができる
デベロッパーツール
ブラウザ開発者ツール、検証ツールなどとも呼ばれます。一般的なブラウザに付属し、誰でもすぐに使うことができます。デベロッパーツールでは主に以下のようなことができます。
- 表示しているサイトのHTMLの要素の確認・編集
- 表示しているサイトのスタイルの確認・編集
- JavaScriptの実行
HTMLやCSSの確認・編集はElementsパネルで操作することができ、JavaScriptの実行はConsoleパネルにて行うことができます
var
varは再定義、再代入可能な古い書き方です。varの特徴として、再代入、再定義ともに可能です。
const
constは、後から書き換えることができない定数を定義する書き方です。constの特徴として、再代入、再定義ともに不可という制約があります。
let
letは、後で書き換えることができる変数を定義する書き方です。letの特徴として、再代入は可能ですが、再定義は不可という制約があります。