Webエンジニアを目指す文系卒の備忘録ブログ

知識や技術の備忘録として、アウトプットしていきます。

【ディープラーニングとは】

 

頭の中でディープラーニング機械学習をごっちゃにしてたので、整理します。

 

Deep Learningとはなんぞや

引用

Deep Learningとは、十分なデータ量があれば、人間の力なしに機械が自動的にデータから特徴を抽出してくれるディープニューラルネットワーク(DNN)を用いた学習のことです。

 

んー?機械学習との違いがイマイチ。

 

 

引用(画像解析を例にした解説)

機械学習ディープラーニング。両者の間にはアプローチの違いが存在しています。

機械学習の場合、与える素材をまずは人間が前処理を行います。画像の場合、角や境界線であることを示しておくことで、コンピューターが認識できるようにしておきます。次に、コンピューターがデータに含まれる特長を解析して蓄積しておき、最後にその蓄積したデータをもとに画像の特長から答えを導き出します。

ディープラーニングの場合、人間が行っていた作業が省かれます。元となるデータをそのまま与えると、ディープラーニングアルゴリズム畳み込みニューラルネットワークを駆使して自ら解析を行い、答えを出せるようになります。

だとのこと。

 

簡潔にしてみると、

機械学習は、特徴を示すなどの、人間がある程度前処理をする必要がある。

Deep Learningは、人間が行う処理が省いて、解析できる。

ってことでしょうか。

機械学習の上位互換という感じがします。

 

 

 

ちなみに畳み込みニューラルネットワークは、画像のような何段もの深い層をもつニューラルネットワークのことを指すそうな。ç³ã¿è¾¼ã¿ãã¥ã¼ã©ã«ãããã¯ã¼ã¯

 

ここまで知った上で、一番最初の引用説明を見ると、少し理解できた気がしますね。

 

 

 

また、全体像で見ると、

 「人工知能機械学習Deep Learning

というような関係性だという。

 

この場合の「>」は、 小さいとか劣っているというものではなく、

「含まれている」という認識でOK。

 

 

Deep Learningで出来ること

引用

①画像認識

画像動画を入力とし文字や顔などの特徴を認識・検出する技術です。 背景から特徴を分離抽出しマッチングや変換をおこない、目的となる特徴を特定し認識します。

(例: Facebookのタグ付け(顔認証)、自動運転、感情分析など

音声認識

音声を認識させる技術です。人間の声を認識してテキストに出力したり、音声の特徴をとらえて声を出している人を識別したりできます。

(例:iPhoneの「Siri」のような音声入力など

自然言語処理

人間が日常的に使う自然言語(書き言葉・話し言葉)をコンピューターに処理・理解させる技術です。

(例:銀行のコールセンターでの問い合わせ対応、文書要約、機械翻訳など

④異常検知

産業機器などに取り付けられたセンサーなどの時系列データから異常の兆候を感知する技術です。

(例:工場内の監視(故障や異常動作の検知)など

 

 

......戦闘力高すぎる。。

もはや何でもできちゃいそうです。

 

 

今あるDeep Learningを使ったサービス、アプリ

・Bitesnap 

 食事を撮影するだけで、AIがカロリーや栄養素を算出してくれるアプリ。

・Qunme

 ユーザーの好みの顔を学習し、マッチングさせるアプリ。

・Deepomatic

 ファッションアイテムが写っている画像から、それを購入できるECサイトへ飛ばしてくれるもの。

 

これらの他にも様々なアプリが開発されていました。

 

 

まとめ

Deep Learningすごすぎ。。

 

人工知能機械学習ディープラーニング

知らない、じゃ済まされない世の中になってきてると感じました。

 

いったいどれだけの仕事を消滅させるのだろうか。

 

 

 

 

【Git、Github】用語と手順の確認

GIthubを用いた開発の手順と用語を備忘録。

フォーク(fork)

他人のリポジトリを、自分のアカウントのリポジトリにコピーすること。
Githubのforkボタンをポチッと。

クローン(clone)

リモートリポジトリを、ローカルリポジトリとして保存すること。

git clone  URL

ブランチ(branch)

リポジトリ内で複製を作る。
チーム開発では、それぞれがブランチを作って作業を進める。
枝分かれするイメージ。
ブランチをマージすることで、元のマスターに反映される。

git checkout -b branch_name

コミット(commit)

ローカルリポジトリに変更を保存すること。

git add 変更したファイル 
または  
git add . 

git commit -m "commit_message"

マージ(merge)

ブランチ同士を結合すること。
元のファイルに反映される。

git merge branch_name

プッシュ(push)

リモートリポジトリにローカルリポジトリを送信して保存すること。
アップロードのイメージ。

git push origin branch_name  

  

プルリクエスト(pullrequest)

変更した内容について、プルしてくださいってお願いすること。
Github上で操作。変更内容をコメントしておくとよし。

クローンして、ブランチ作って、変更とか作業して、
コミットして、プッシュして、プルリク作って、 マージする、というのが大体の流れ。

【アジャイル開発】基礎知識

 

アジャイル開発は知っておいたほうがいいよって記事を見かけました。

なんのこっちゃ状態なので、レッツスタディ

 

 

アジャイル開発とは。

 

アジャイルAgile)は直訳すると、「素早い」「機敏な」。

以下引用

アジャイル開発は、システムやソフトウェア開発におけるプロジェクト開発手法のひとつで、大きな単位でシステムを区切ることなく、小単位で実装とテストを繰り返して開発を進めていきます。従来の開発手法に比べて開発期間が短縮されるため、アジャイル(素早い)と呼ばれています。 

引用:発注ラウンジ https://hnavi.co.jp/knowledge/blog/agile_software_development/

 

従来のソフトウェア開発は、ウォーターフォールモデル開発という、最初に全体の機能設計・計画をし、それに沿って開発していくものだった。

 

それに対しアジャイル開発は、計画段階で厳密な仕様を決めずに、大体の仕様と要求だけを決める。「開発途中に仕様や設計の変更があることは当たり前」だからだ。

これによって、途中で変更があっても臨機応変に対応できる為、顧客のニーズに最大限応えることができる。

 

大体の仕様を決めたら、イテレーション(反復)と呼ばれるサイクルを繰り返して開発する。これは、小さな単位に分けられた開発を「計画」→「設計」→「実装」→「テスト」と繰り返していくもの。イテレーションごとに毎回機能をリリースする。



 

アジャイル開発に向いているプロジェクト。

 

開発の途中で仕様の変更や追加が予想されるプロジェクト。例えば、モバイル分野などの技術や仕組みが日々進化している産業など。

 

 

アジャイル開発の手法

 

スクラム

チームのコミュニケーションを重視した手法。以下の要素を含む。

 

・プロダクトへの要望を優先順位ごとに並べかえ、その順に機能を作る。

・固定の短い期間(1~4週間程度)の単位で開発を区切り、その中で計画を立てる。

・プロジェクトの状況や進め方に問題がないか、メンバー同士で毎日確認しあう。

・作っている機能が正しいかどうか、定期的に確認の場を設ける。

 

ミーティングで確認しあったり、少人数チームで協力することによってチーム力が高まるそうな。

 

 

アジャイル開発のデメリット

 

色々なメリットがあるアジャイルにも、大きく二つデメリットがあった。

 

一つは方向性がブレやすいこと。

さらによくしようと改善を繰り返し、変更・追加を加えていくことで、当初の計画からズレてしまう可能性がある。

 

もう一つはコントロールしにくいこと。

計画を綿密に立てない為、スケジュールや進捗具合が把握しにくくなる。全体像を掴むのが遅れる為、気づいたら納期に間に合わない、ということも。

 

 

 

<所感>

少ないチームで、小さなサイクルをぐるぐる回して開発をするというイメージが掴めた。ウォーターフォールよりも開発が楽しそう。もっとこうしたら?とか、その時の意見が組み込まれたりしそうだから。

しかし、顧客がいれば当然納期があるわけで、下請けや受注側はそれがネックになるんだろうな、と思った。

 

 

 

【書籍】Webを支える技術 内容をまとめる①

 

第1部 Web概論

 

第1章 Webとは何か

Webの用途を3つに分解する。

1、Webサイト

 Yahooのようなポータルサイトから、Amazonのようなショッピングサイト、企業のPRサイト、ブログ、写真管理、ブックマーク、動画投稿など。

 

2、ユーザーインタフェース

 各種デバイスの設定画面。ルータやテレビ、プリンタなどネットワークに接続するデバイス設定は、ブラウザ上で行うものがある。

 

3、プログラム用API

 APIはアプリケーションとプログラムを繋げるインターフェース。外部アプリと連携する、など。

 

 

Webを支える最も基本的な技術をまとめる。

・HTTP

URI

・HTML

 

URIで世界中のあらゆる情報を指し示すことができる。

HTMLで、それらの情報を表現することができる。

そしてHTTPというプロトコルによって、それらの情報を取得したり発注したりできる。

 

 

Webは2つの側面を持つ。

・ハイパーメディア

・分散システム

 

ハイパーメディアは、テキストや画像、音声、映像などのメディアをハイパーリンクで結びつけて構成したシステム。

例として、Webページには、他のWebページのリンクや画像へのリンクが含まれており、ユーザーはブラウザを使って自由にそれらをたどることができる。

 

分散システムは、複数のコンピュータやプログラムをネット上に分散して配置し、1台のコンピュータで実行するよりも効率的に処理できるようにしたシステム。

Webは、世界中に配置されたサーバに世界中のブラウザがアクセスする分散システムのひとつ。これによって、膨大な情報を扱ったり、難しい機能を実現できる。

 

 

第2章 Webの歴史

Web以前のインターネット

特徴

・全ての文字が英数字のみ。

・UUCPによる転送が起因してメールの遅延があった。

・数を限定とした、分散システムであった。

・仕組みが複雑で難解。大規模な普及には向いていない。

 

紆余曲折を経て、Webが急速に普及。

標準化作業が行われる。

RESTが誕生。

Webがインターネット全体を飲み込む。

 

※だいぶ端折ってます。誰が何を開発したけどダメだったとか、あれとこれが対立したとかも書いてありましたが、その辺はいらないかなと思ったので。ただ、ここで重要だと思ったのは、複雑で難解だった過去のシステムは普及しなかったが、それがシンプルで簡潔になったことにより、Webがここまで普及するようになった、という点かと思います。

 

 

第3章 REST

RESTはWebのアーキテクチャスタイル。

アーキテクチャスタイルは、アーキテクチャに共通する性質、様式、作法などを指す言葉。MVCなどがこれにあたる。

 

RESTはネットワークシステムのアークテクチャスタイルでもある。

RESTからクライアント/サーバという考え方も生まれた。

 

 

RESTの重要な概念、リソース

Web上に存在する、名前を持ったありとあらゆる情報のこと。

リソースの名前とは、URIのこと。

 

例)東京の天気予報 http://weather.yahoo.co.jp/weather/jp/13/4410.html

 

世界中のリソースは、それぞれURIで一意の名前を持つ。

そのURIを利用することで、その情報にアクセスできる。

 

 

クライアント/サーバ

これもWebのアーキテクチャスタイル。

クライアントはサーバにリクエストを送り、サーバはそれに対してレスポンスを返す仕組み。

 

サーバはステートレスサーバである。

当ブログでステートレスについて解説した記事

https://masakioutput.hateblo.jp/entry/2019/06/17/230444

 

 

キャッシュ

キャッシュとは、一度取得したリソースをクライアント側で使い回す方式。

サーバとクライアントの通信を減らすことができ、より効率的に処理できるようになる。キャッシュを追加して、「クライアント/キャッシュ/ステートレスサーバ」と呼ぶことも。

 

 

統一インターフェース

URIで示したリソースに対する操作を、統一した限定的なインターフェースで行うアークテクチャスタイルのこと。

HTTPのメソッドなどがこれにあたる(GET、POSTなど)

 

クライアントとサーバの実装の独立性が向上し、全体としてシンプルになる。

 

 

階層化システム

システムをいくつかの階層に分離すること。

プロキシでアクセス制限したり、ロードバランサで負荷分散したりできる。

 

 

コードオンデマンド

プログラムをサーバからダウンロードし、クライアント側でそれを実行するアークテクチャスタイル。

javascriptFlashなどがこれにあたる。

 

これによって、クライアントを後から拡張できる。プログラムにあらかじめ用意された機能だけでなく、新しい機能を追加していける。

 

 

つまりRESTとは、、

・クライアント/サーバ

・ステートレスサーバ

・キャッシュ

・統一インターフェース

・階層化システム

・コードオンデマンド

この6つを組み合わせたアーキテクチャスタイルをRESTという。

 

個別のWeb APIやサービスがRESTFULLになると、Web全体としてより良い状態になる。積極的に採用していくべきスタイル。

 

しかしソフトウェアの設計によっては、必ずしもRESTを採用する必要はない。RESTのスタイルを除外しなければならない場合は、適した他のスタイルがあることもあるからだ。

 

 

 

次回、第2部 URIについて。

 

 

【情報セキュリティ】基礎知識

 

情報セキュリティって何だろう?

 

総務省 国民の為の情報セキュリティサイト」より、

私たちがインターネットやコンピュータを安心して使い続けられるように、大切な情報が外部に漏れたり、ウイルスに感染してデータが壊されたり、普段使っているサービスが急に使えなくなったりしないように、必要な対策をすること。 

 

普段私たちは、ネットで大切な情報を頻繁に使っています。

パスワードやメールアドレスなどのユーザー情報だったり、

ネットショッピング時に入力する住所やクレジットカード番号だったり。

 

個人ではなく、企業や政府がもつ機密情報もそうです。

 

それらがもし他人に漏れてしまったら、悪人の手に渡ってしまったら。

自分だけでなく、家族や取引先など関わる全ての人に被害が及んでしまいます。

 

そうならない為に、情報セキュリティが強く求められています。

 

 

 

情報セキュリティの特徴

 

情報セキュリティは一般的に、3つの要素を確保することと定義されています。

 

  1. 機密性 ・・・ 情報へアクセスを認められた者だけが、その情報にアクセスできる状態を確保すること。
  2. 完全性 ・・・ 情報が破壊、改ざん、消去されてない状態を確保すること。
  3. 可用性 ・・・ 情報をすぐに使える状態を維持すること。

 

 これらを維持することが、国際規格 ISMSで決められています。

(Information Security Management System)

 

情報セキュリティ付加的特性

 

上の3つの特徴以外にも、含まれているものがあります。

 

  1. 真正性   ・・・ その情報が誤りなく、確実であるか。
  2. 責任追跡性 ・・・ 利用者が特定できるか。
  3. 否認防止  ・・・ 起きた事象が後になって否認されないこと。
  4. 信頼性   ・・・ 欠陥やバグがなく、期待値と同じ結果が得られるか。

 

計7つの要素を確保できていれば、セキュリティが強いことになります。 

 

 

情報セキュリティ対策の考え方

  • 抑止、抑圧 ・・・ 教育や監視によって脅威を未然に防ぐ
  • 予防、防止 ・・・ あらかじめ十分なセキュリティを施し、堅牢な状態を維持
  • 検知、追跡 ・・・ 脅威を速やかに発見し、必要な情報を取得する。問題の拡散を防ぐ
  • 回復    ・・・ 速やかに正常な状態まで復旧させる

 

 これらのたくさんの要素を理解した上で、セキュリティ対策をする場合は以下のように考えなければならない。

・想定されるリスクは何なのか。

・自分たちは何を守るのか。守る対象は?

・どんな脅威があるのか。

・弱点と欠陥は何なのか。

・組織として基準や手順が明確で統一されているか。

・客観的な評価が十分であるか。

 

他にもたくさんの視点、見方から対策を講じなければならない。

「これでいいだろう」という考えが危険。

脅威も常に変わっているので、自分たちも常に最善のセキュリティを意識し続けなければならない。

 

 

見落としがちな情報セキュリティ以外のセキュリティ

 

  • 物理的セキュリティ ・・・ 建物や設備に関してのセキュリティ。耐震、防火、入室管理、回線、電源周りなど。
  • 論理的セキュリティ ・・・ 物理的以外に関すること。人的要因などがそれにあたる。ミスや意図的な嫌がらせなど。

 

よく耳にする、「脆弱性」って?

 

  脆弱性(ぜいじゃくせい)とは、コンピュータのOSやソフトウェアにおいて、プログラムの不具合や設計上のミスが原因となって発生した情報セキュリティ上の欠陥のことを言います。脆弱性は、セキュリティホールとも呼ばれます。

 

セキュリティの穴。欠陥。抜け道などが該当する。

実際、次々と新たな脆弱性が発見されているのが現状で、

その度に新たなバージョンが配信されたりしている。

 

利用しているものは、常に最新の状態にしておくことが大事。

 

 

 

 

 

【Ruby on Rails】ランキング機能をつけてみた。

オリジナルアプリ作成中。
アプリは投稿とそれにお気に入りができるのだが、 トップページにお気に入りランキングを実装したい。

controllers/topics_controller.rb

def index

    @topic_ranking = Topic.find(Favorite.group(:topic_id).order("count(topic_id) desc").limit(5).pluck(:topic_id))

 end

解説
Favorite.group(:topic_id)  →  Favoriteデータを、topic_idを元にグループ化する。
order("count(topic_id) desc")  →  数が多かった順(降順)に並べ替える。
limit(5)  →  5つまでデータを取り出す。
pluck(:topic_id)  →  抽出するデータはtopic_id。

Topic.find  →  上記で取ってきたtopic_idを元に、Topicから探す。

※topicとfavoriteそれぞれモデルの関連づけが必要。(has_many、belongs_to)

topics/index.html.erb

<% @topic_ranking.each.with_index(1) do |topic, i| %>
            
  <h3 class="text-center"><%= i %>位</h3>

  <%= topic.title %>
  #以下略  

これで順位も一緒に表示できます。

ググってこれが一番簡単なコードだったので使ってみました。
終わり。

【Ruby on Rails】N+1問題とは?

 

よく耳にしてたのですが、肝心の意味を知らないままだったので、調べて記しておきます。

 

N+1問題とは。

ループ処理の中で、その都度SQLを発行してしまい、大量のSQLが発行されてパフォーマンスが低下してしまう問題。

 

具体例を出すと、、

 each文があるとして、その繰り返し処理の中でmodelを取得するコードを書いてしまう、とかが当てはまると思います。

 

繰り返しの初めの1回目でmodelを取得し、2回目以降もデータの数(N)だけmodelを繰り返して取得する。つまり、

 

「データの数=N + 最初の1回」

 

だからN+1問題って言うらしいです。

 

なるほど〜。

 

 

どうやって回避するの?

modelを関連付けて、includeメソッドを使いましょう。