IT社員3人組によるリレーブログ

某IT企業に勤める同期3人が、日常で思ったことを記録していきます (twitter: @go_mount_blog)

Flask + uWSGIをGAEでデプロイした話

けいです。

 

最近、pythonベースでwebサイトを作成したのですが、その際にいくつかつまづいた箇所があったので記事にしました。

(割と技術ベースな話になります)

 

ちなみに作成したサイトはこんな感じです。

芸能人の好感度をAIで分析したサイトで、作成した背景もブログでまとめているので是非見てください。

 

f:id:go-mount:20200128150700p:plain

f:id:go-mount:20200128150909p:plain

 

ai-net-judge.com

go-mount.hatenablog.com

 

Flask + uWSGI + GAEの組み合わせを選んだ理由

組み合わせを選んだ話は、サイトの要件とほぼ同義なので、要件の話からしていきます。

 

要件を箇条書きでざっと記載します。

  1. フロントエンドもバックエンドもある程度自前で作成したい
  2. pythonで記載したい
  3. GCPGoogle Cloud Platform)を使いたい

 

1. フロントエンドとバックエンドを自前で作成したい

今回の前提みたいな話です。

今回作成するサイトでは、データベースと連携したり、webサイト自体をhtml, css, jsで作ったりする必要があったので、webフレームワークを使いました。

 

2. Pythonで記載したい

Flaskを採用した理由です。

単純にサイトを作成するメンバーが、Pythonを使える人が多かったのでPythonで書けるwebフレームワークを選びました。

 

DjangoPythonだけど...って思われる方もいると思います。

そこは特に深くは考えていませんが、今回のサイトの実装内容的にDjangoだと機能がtoo muchだったので軽量なFlaskにしました。

 

3. GCPを使いたい

これは、GCPを勉強してみたかったからです。

ぼくはAWSの資格は持っていたのですが、GCPの資格も取得したかったので、今回はGCPのGAE(Google App Engine)を使いました。

 

ちなみに、サイトを作成している途中にGCPの資格を取得しました。

資格はProfessional Cloud Architectです。(詳細は別途記事にする予定です)

 

サイトの作成にあたって、GCPを勉強したのですが、下の本が体系的にまとまっていておすすめです。

 

 

最後にuWSGIを選んだ理由は、正直特にありません。

GAEでは、Gunicorn(uWSGIと同じサーバー)を推しているようですが、チャレンジということでuWSGIを使いました。

(全体的にuWSGI+GAEが少ないので、本サイトを参考にしてみてください)

 

実装でつまづいたところ

さて、ここからはそれぞれを実装するうえでつまずいた箇所を記載していきます。

 

Flaskの実装

まず、簡単にFlaskについて説明します。

 

Flaskは先でも述べたWebフレームワークの1つで、HTMLリクエストに対して様々な制御を加えることができます。

基本的には、https://www.xxx.com/みたいなリクエストを受け付けて、htmlファイルを返します。

(HTTPの仕組みは知っているものとして説明しています)

 

f:id:go-mount:20200201195157p:plain

1. HTMLを返す部分

 

上記は本サイトのメインページを返す部分です。

@app.route('/')のカッコ内は、URLの末尾の条件を表しています。

 

例えば、@app.route('/subpage')とした場合、https://www.xxx.com/subpageというリクエストが来たときの処理をその後に記述します。

 

次に、returnの行の「render_template」関数によってhtmlファイルをクライアントに返しています。このとき、index.htmlにFlask上でpythonで生成したhtmlコードやjava scriptを埋め込むことができます。

html=htmlとなっている部分がその箇所です。(詳細はjinja3で検索してみてください)

 

また、index.htmlやCSSJavascriptを置くフォルダ構造が少々特徴的です。

f:id:go-mount:20200201205253p:plain

Flaskのフォルダ構造

 

CSSフォルダを構造化したい場合

Flaskは、デフォルトではCSSjavascriptのファイルを構造化することができません。

(構造化とは、CSSファイルがたくさんある場合に種類ごとにフォルダ分けすることです)

 

HTMLをbootstrapを使って書くときは、通常CSSJavascriptのファイルはフォルダ分けがされているので、staticフォルダでサブフォルダを切れないのは不便です。

 

Flaskでサブフォルダを切るためには、Blueprint機能を使用します。

Blueprint機能は、フォルダをFlaskに認識させる機能です。(Linuxでいうパスを通す作業のことです)

 

Blueprintの設定は以下です。

 

まず、Main.pyでblueprint関数を記載する

 

f:id:go-mount:20200201214509p:plain

main.pyにblueprint関数を記載

 

このとき、blueprintのモジュールをインポートすること。

 

f:id:go-mount:20200201214612p:plain

Blueprintのモジュールをインポート

 

次に、「setBlueprint.py」というファイルを作成し、ルートフォルダのすぐ下に置き、下記を記載する。

ここでは、staticフォルダのすぐ下に「js」フォルダを作成したい場合の設定です。

 

f:id:go-mount:20200201214241p:plain

Blueprintの設定

以上の設定で、サブフォルダをFlaskが認識できるようになります。

 

webだと意外に情報が少ないので、けっこう書籍がおすすめです。

 

 

uWSGIの実装

uWSGIの設定は簡単です。

uWSGIをインストールし、以下の設定ファイルを作成するだけです。

ちなみに、私の場合はpip3でuWSGI==2.0.18をインストールしました。

 

以下のmyapp.iniファイルを作成し、Flaskのルートフォルダに格納します。

 

f:id:go-mount:20200202144414p:plain

uWSGIの設定ファイル

GAEの実装

最後に、Google App Engineの設定をしていきます。

 

Google App Engineとは?

はじめに、Google App Engineについて簡単に触れたいと思います。

Google App Engineは、Googleが提供する仮想マシンのサービスの1つです。(AWSでいう、Amazon Beanstalkのようなサービスです)

 

仮想マシンのサービスとして、GCPではGoogle Compute Engine、Google Kubernetes Engineなどいくつか提供していますが、Google App Engineは、PaaSサービスであるため、開発者はアプリケーションを作成してデプロイするだけで良いという強みがあります。

 

実際使ってみた印象としては、デプロイするまでの準備に若干手間がかかったものの、それ以降は非常に使い勝手の良いサービスです。

 

Google App Engineの設定

設定は意外にもシンプルです。

自分はけっこう時間がかかってしまったのですが、それはuWSGIのGAEとの設定のドキュメントがあまりなかったためです。

 

GAEの設定は以下3つのファイルを編集します。

 

1. app.yamlの設定

GAEではYAML形式のファイルで実行するファイルや、オプションを設定します。

今回は最もシンプルな、uWSGIの設定のみを記載しています。

 

Google App Engineインスタンスのスケーリング設定もこのファイルで実施できます。

 

f:id:go-mount:20200202140534p:plain

app.yamlの設定

2. requirements.txtの設定

Google App Engineでは、デプロイするアプリケーションの実行に必要なパッケージをこのrequirements.txtに書いてある通り用意します。

 

このファイルは、python使っている方なら、pip freezeコマンドで簡単に作成できます。

先ほどのapp.yamlファイルとともに、ルートフォルダに格納します。

 

Google App Engineのデプロイ

デプロイは非常に簡単です。

下記のコマンドを打つだけです。

f:id:go-mount:20200202150624p:plain

デプロイコマンド

 

GAEでデプロイするためには、SDKのインストールや、GCPのコンソール上での操作が事前に必要となりますが、簡単なので公式ページの操作を参考に実施ください。

 

 

今回の記事は以上です。

今回の記事が皆さんのトラブルシュートや、Flask、GAEを使うきっかけになれば幸いです。

芸能人の好感度をAIで分析してみた話

けいです。久しぶりの投稿です。

今回は「芸能人の好感度」をAIで分析してみた話をします。

 

芸能人の好感度を分析した経緯

 

突然ですが、みなさんは「芸能人の好感度」に疑問を覚えたことはないでしょうか?

 

スーツを着た女性のイラスト(疑問に思う顔)

 

結論を言います...

好感度って定性的で曖昧すぎない?

(ちなみに「定性的」とは、数値化できない感覚的なものという意味です)

 

元々、好感度は人が人に対して感じるものなので、曖昧でも良いのかもしれません。

ただし、「芸能人の好感度」が下がる場合、下記の問題が発生します。

 

CMに起用していた芸能人が問題を起こし、宣伝のつもりが逆効果になってしまった

 

映画やドラマに起用していた芸能人が問題を起こし、代役の調整やブルーレイ・DVDの回収が必要になった

 

スポンサーからすると、たまったものじゃないでしょう。

2度と起用したくないというのが本音だと思います。

 

一方で、芸能界にはトラブルがつきものです。

1年を通して不祥事などの問題が大小たくさん発生しています。

そのため、完全に「クリーン」な人はごく少数なのではないでしょうか?

 

最近でいえば、木下優樹菜さんの「タピオカ恐喝騒動」、「ツイッター縦読み不倫」や東出昌大さんと唐田えりかさんの「不倫」がありました。

 

これらの芸能人も、時間が立てば好感度は回復していくかもしれません。

しかし、好感度がどのくらい回復したかは明示的にはわかりませんよね。

 

実際に、過去に不祥事を起こした芸能人でテレビに出ている人も、会見を上手くやったり、その人のキャラで切り抜けたりと曖昧なものです。

好感度が回復していないまま、テレビに出ている人もいることでしょう。

 

このように、曖昧な好感度というものを可視化して、定量的に見てみよう!というのが今回のコンセプトです。

 

好感度をAIで分析したサイトを作ってみた

 

今回は、ただ好感度を分析するだけでなく、サイトを作成しました。

ai-net-judge.com

 2019年に問題を起こした人や話題に上がった人を載せています。

 

f:id:go-mount:20200128150700p:plain

トップページ

f:id:go-mount:20200128150909p:plain

掲載している芸能人(一部)

 

各芸能人の個別のページには、1日ごとの好感度の推移を載せています。

これを見れば、芸能人の好感度がどのように変化しているか見ることができます。

 

f:id:go-mount:20200128151301p:plain

好感度のグラフ(木下優樹菜さんの場合)

好感度の可視化方法について

まず、今回のコンセプトの肝となる部分である、好感度をどのように数値化するかについて説明します。

やり方はいろいろあると思いますが、今回は下記のステップで好感度を分析しました。

 

  1. 1日に芸能人に対してつぶやかれたツイートをランダムに一定数取得
  2. Googleの提供しているAI感情分析を利用して、各ツイート内容がポジティブかネガティブかどうかを-1から+1の間で点数化
  3. 芸能人の各ツイートの点数を1日ごとに平均する

 

1. ツイートをランダムで取得する

好感度を分析するにあたって、分析元のソースをどこにしようかという話です。

結果、ツイッターにしました。

 

インスタ、フェイスブック、ブログなど候補はたくさんあるのですが、ツイッターは芸能人の不祥事などがバズったり、それがwebニュースとして拡散されたりと影響度が大きいため、ツイッターにしました。

 

各芸能人の名前で検索をかけて、ヒットしたツイートの中からランダムで選んだツイートを後述する方法で分析します。

 

2. ツイート内容をAIで点数化

 さて、評価したいツイートが手に入ったので、こちらを点数化していきます。

 

評価方法もたくさんあると思いますが、今回はGoogleが提供する感情分析AIを使って分析しました。

(正しくはGoogle Cloud PlatformのGoogle Cloud Natural Language APIの感情分析機能を利用します)

 

簡単に説明すると、この機能では、ある文章が全体としてポジティブな内容かネガティブな内容かを-1から+1の間で点数化できます。

つまり、-1に近づくほど、ネガティブな内容であり、+1に近づくほどポジティブな内容です。(サイト上では、100点満点に直して記載しています)

 

この機能を利用して、1で取得したツイートの内容がどれくらいネガティブな内容かポジティブな内容かを点数化して評価しているのです。

ここがまさに、好感度を数値化する部分です。

 

3. 好感度を1日ごとに平均

上記の1、2のステップでツイート内容に対して好感度の点数をつけることができました。

ある芸能人に対して1日につぶやかれた複数のツイートを点数化をして、1日の好感度の平均を計算します。

これを1日ごとにグラフとして表示したものが下記です。

 

f:id:go-mount:20200128161330p:plain

好感度の1日ごとのグラフ(木下優樹菜さんの場合)

 これにより、1日ごとに芸能人の好感度がどのように移り変わっていくか可視化することができました。

まとめ

さて、上記のようなステップでツイート情報から芸能人の好感度を分析することができました。

この情報によって、各芸能人の好感度が現在どうなっているかをパッと見るだけで判断できるようになりました。

(精度はともかくですが、ある程度情報として判断できるものとなっているのではないでしょうか)

 

これによって、芸能人の不祥事がある程度可視化され、「許された」/「許されない」をなんとなくの流れで決めないきっかけになったら面白いなーと思った次第です。

 

今は、不祥事系の芸能人にスポットライトを当てて掲載していますが、もちろん好感度が高い芸能人同士、点数をバトルするみたいな使い方も楽しいと思います。

 

掲載して欲しい芸能人がいれば、コメントいただくかツイッターでDMください!

 

予告

今回、このサイトはGoogle Cloud Platform上で感情分析だけでなく、アプリも基盤部分も仲間3人ですべて作成しました。

その際の構成や使用技術のノウハウがだいぶたまったので、よりテッキーな内容は別途記事としてまとめようと思います。

オンライン英会話って結局どれがいいの? 体験を受けまくった筆者がレビューします

どうも、Shoheiです。

次の会社に移るまでの一ヶ月間、オンライン英会話を始めようと思いました。

ただ、次の会社にも英語学習の補助がある可能性もあるので、一旦一ヶ月限定で。

 

そこで諸々ネットで調べていたんですが、この世にオンライン英会話が多すぎて何がいいのかさっぱりわからない。しかもどこのサイトを見ても「他社よりうちが一番です」と書いてる。

こんなん何が正しいかわかりませんよね。

 

ただ幸い、どの会社もだいたい無料体験授業をやってくれてます。

今は選定と英語の練習も兼ねて、体験レッスンを受けまくっているので、今日はその各社レビューを書きたいと思います。

DMM英会話

値段/時間など

  • 月額 税込5,980円〜(最安は1日1レッスンコース)
  • 24/365いつでも
  • 1レッスン25分

体験で気づいたこと

  • Skypeかブラウザベース両方可能。ブラウザベースでやったが違和感なかった。
  • 体験は2回受けられる。1回はフリートーク、1回はニュース記事ベースのトークにした。
  • ニュースはホットなトピック(トランプ大統領来日)を読みつつ、普段使わない難しい単語も学べた
  • 講師は2人ともフィリピンの方だった。すごくフレンドリーだった。
  • 講師を選ぶときに講師の評価が見れるのが良い
  • 世界100国以上に講師がいると推しているが、ネイティブとの会話はプラス料金。体験も二千円かかる。

レアジョブ英会話

値段/時間など

  • 月額 税込4,536円〜 (最安は月8回コース)
  • 朝6時から深夜1時まで
  • 1レッスン25分

体験で気づいたこと

  • Skypeのみ。
  • 体験は一回のみ。体験は講師は選択できない
  • 体験で口頭の診断テストを受ける。単語の意味を確認すると「それは答えられない」と割とシビア
  • FeedbackがSkypeのメッセージで送られてくる。その日の評価点数, 語句や表現など
  • 教材が割といい。内容が濃い。

Bizmates

値段/時間など

  • 月額 12,000円〜 (最安は1日1レッスンコース)
  • 朝5時から深夜1時まで
  • 1レッスン25分
  • ビジネス英語に特化している模様

体験で気づいたこと

  • Skypeのみ
  • 体験は一回のみ
  • 教材の内容が薄い
  • Feedbackがポータル経由で送られてくる。即時送られてきたが、日本語だったので一部定型文?
  • 学習したフレーズが送られてくるのはありがたい
  • 体験だからなのか、予約完了メールが送られてこない

産経オンライン英会話

値段/時間など

  • 月額 税込5,980円〜 (最安は1日1レッスンコース)
  • 朝5時から深夜1時まで
  • 1レッスン25分

体験で気づいたこと

  • Skypeのみ
  • 体験は二回可能
  • 講師が半端なくいい人。優秀な人しか採用しないと謳っているだけある
  • レベルに合わせてテキストは適宜スキップしてくれた
  • 通信状況が悪すぎた
  • (まだ一回しか受けていないので今後追記していきます)

 

coming soon....

旅をロジカルに企画しよう 〜ニューヨーク発、ナイアガラ・トロント・ワシントンへの行き方

どうも、転職前の有休消化エンジョイ中のShoheiです。

実はここ10日間ほど、アメリカを旅していました。

ニューヨークを拠点としてナイアガラ・トロント・ワシントンにも行ってきました。

f:id:go-mount:20190523065045p:plain

旅の思い出は語り始めるときりがないのですが、ナイアガラトロントワシントンへの行き方ついてはTIPSをシェアしておきます。

何故これだけ書こうと思ったかというと、需要があるはずなのにこれらの情報はググっても十分な情報が出てこなかったからです。

結構自分であれこれ調べて検討したので、今日はそのTIPSと感想を書いて、同じような旅を考えていらっしゃる方のお役に立てればと思っています。

折角なので検討プロセス等も書いてみましょう。

 

旅行要件

  • 先輩の家へ転がりこんでいたので、あくまで拠点はニューヨーク
  • ニューヨークへの宿泊費用は無料だが、それ以外は一人での宿泊料金がかかる(一人なので複数人の場合と比べて当然高くつく)
  • ナイアガラの滝へは絶対に行きたい
  • トロントの友達に会って、そのまま友達の家に一泊したい 
  • ワシントンは行けるなら行きたい。アメリカの保守的な一面を見ておきたい
  • 物価が高いので、なるだけコストを抑えたい
  • ニューヨーク探索含めて全体で9日間ほど使えるため、比較的時間に余裕はある
  • 滞在予定は以下の通り

f:id:go-mount:20190523085010p:plain

  • 地理的には以下の通りf:id:go-mount:20190523082109p:plain

検討プロセス

旅行手段の検討プロセスは以下の通りです。

①ニューヨーク発着ツアーの調査

まずは以下の情報を得ることを目的としています。

  • ツアーの市場価格
  • およその所要時間
  • 主な見どころ

②自力での交通費調査と移動プラン組み立て

交通費調査は以下が対象でした。

  • 飛行機
  • 電車
  • バス

移動プランの組み立ての際は、地理的な理由からナイアガラ/トロントはセットで考えます。

③ツアー料金と自力での交通費の比較

自力での交通費の合計と、ツアー料金の相場を比較します。

もしこの時点でツアー料金と自力での交通費合計がニアリーイコールになっていると、

自力で行く旨味が少なくなるので、自力での旅行ではなくツアーに傾きます。

④自力で行く場合の宿泊先・観光先選定

③で自力でのコストメリットが得られる余地があると判断した場合は、宿泊先や観光先を選定し、そのコストを算出します。

⑤旅程の最終判断

ツアー・自力案を並べ、自分の要件を満たせ、かつコストメリットが得られる旅程を最終判断をします。

検討結果

 ①ニューヨーク発着ツアーの調査

ナイアガラ単体(トロントなし)

  • 日帰り/飛行機利用=5万円程度*1
  • 1泊2日/飛行機利用=10万円程度*2

  • ★1泊2日/バス利用=3.9万円程度 *3
  • 1泊2日/バス利用=1万7千円ほど*4

⇨一番最後のがずば抜けて安いのでこれは何かある、と思って調べたところ、

含まれているのはバス・ガイド・宿泊代金のみの模様。

観光スポットの入場料は自費、ガイドへのチップも毎日最低10ドルと記載あるので、、諸々プラスすると合計4万円ちょい。

観光スポットは最悪自分の判断で入場せずにスキップできそうだが、それも時間の無駄になりそう。

あと、言語が中国語と英語のみらしく、おそらく中国人向けのツアー。中国人の方々の中に一人紛れることになると推定。それはきついかもと思い、除外...

 

ということでこの時点で現実的なツアー料金は、バス利用1泊2日で4万程度と推定。

ナイアガラ/トロントツアー

  • 2泊3日/バス利用=6.5万程度 *5

⇨残念ながらトロントに宿泊できないので除外

  • ★2泊3日/バス利用=9.2万程度 *6

ナイアガラ/トロント/ワシントンツアー

  • 4泊5日/バス利用=11万程度*7

⇨行きたいところは満たしてるけど、流石に高いのと、日曜発着は難しいので除外。ワシントンは最悪行かなくてもいいと思っていたので。

ワシントンツアー

  • 日帰り/バス利用=1.7万程度 *8
  • 日帰り/電車利用=3万-4万程度 *9

②自力での交通費調査と移動プラン組み立て

交通費調査

  • バスはgreyhound社とmegabus社を比較し、条件の良かったgreyhound社*10を採用
  • 飛行機はSkyscannerを使って安いものを採用
  • 電車はAmtrakを検索

f:id:go-mount:20190523091135p:plain

移動プラン組み立て

ワシントンとナイアガラ/トロント旅行の分離

トロントからワシントンに直接移動することはやめて、トロント旅行とワシントン旅行を切り離して考えることにしました。なぜなら、バス17.5時間はかなりの苦行ですし、飛行機だと高くそれにプラス宿泊費がかかるので。

ワシントン旅行の検討

ワシントン行きのバスor電車の選択ですが、コスト的に以下の二択としました。

  • 往復バス
  • バス+電車
ナイアガラ/トロント旅行の検討

以下を条件としました。

  1. トロントで友達と夜ご飯を食べて宿泊をしたいので、トロントには遅くとも19時前には到着するバスに乗る必要がある
  2. ナイアガラは宿泊するまでもないと判断。夜景は捨てがたいが、一日ステイするほど見る場所もなさそうなため
  3. トロントの観光にはさほど魅力を感じなかったので、トロントについては友達に会うことだけを目的として、短時間のステイを許容

1,2からナイアガラには少なくとも午前中には到着する必要があるため、ニューヨークからナイアガラは夜行バスを選択しました。

3から、トロントからニューヨークへのバスの出発は午前の早い時間を選択しました。その方が早くニューヨークに到着できるし、車窓も楽しめるので。

③ツアー料金と自力での交通費の比較

ナイアガラ/トロント旅行
  • ニューヨーク〜ナイアガラ(America)間(バス): 7500円
  • ナイアガラ(Canada)〜トロント間(バス): 2000円
  • トロント〜ニューヨーク間(バス):  8000円

合計: 17500円

参考

ナイアガラ/トロントバスツアー: 9.2万円

ナイアガラ単体バスツアー: 3.9万円

ワシントン旅行
  • 往復バス: 7500円程度
  • 早朝バス+電車: 13000円

参考

バスツアー: 17000円

④自力で行く場合の宿泊先・観光先選定

ナイアガラ/トロント旅行

有料コンテンツ:風の洞窟/クルーズ船 合わせて5000円程度

無料コンテンツ: ゴートアイランド/レイボーブリッジで歩いての国境越え/テーブルロック

宿泊先: 友達の家なので無料

ワシントン旅行

思考停止。理由は⑤に記載。

⑤旅程の最終判断

ナイアガラ/トロント旅行

自力一択でした。

トロントを一瞬だけ回るという少しイレギュラーな旅程に対応したツアーがなく、かつコスト的にも自力が圧勝。

結局食費込みで25000円程度で、ナイアガラ/トロントを満喫してきました。ツアーだと9.2万。お話にならない。

ワシントン旅行

結局そこまでがっつり調べることなくツアーに流されました。理由は以下の通り。

  • 旅行日が2度目の火曜日で、その日夜20時からニューヨークで予定があった。行き帰り自力バスだと4時間しか滞在ができず、かなり効率的に回らなければいけないので厳しいと考えていた
  • 片方電車にすると滞在時間に1時間余裕ができるが、それだとツアー料金とそこまで変わらない。またツアーには諸々入場料が含まれているのでより旨味がでる
  • ツアーでは主要観光地を全て回ってもなお、19時にはニューヨークに戻れると記載あり。ツアーバス利用で移動効率が高いと予想
  • ワシントンに正直あまり強い思いがなかったので、何があるかさっぱり知らなかった。そのため日本語ガイドがいるというのはこの思考停止した脳に効いた ※何があるかさっぱり知らないけど、アメリカの保守的な一面を見れるワシントンは行っておきたかった

旅の感想

ナイアガラ/トロント旅行

バス移動が長く夜行もありますし、結構歩くので、体力はかなり奪われます。

ただ、夜行の選択は本当に正解でした。早朝のナイアガラは気持ちよかったですし、半日で行きたいところは全て回るボリューム感なので、まだも少なかっただけ。

ナイアガラは本当に絶景です。

クルーズ船は、写真のように滝を間近で見れるので、有料だけどこれはオススメ。

f:id:go-mount:20190524013436j:image

ワシントン旅行

刺激は少ないですが、衝撃は大きかったです。

何を言っているかと言うと、すごく平和な街で、ホワイトハウス始め綺麗な建物は多いのですが、そこで語られているメッセージは「戦争万歳」「軍を讃えよ」的なもので、日本の「戦争を繰り返してはならない」と言うスタンスとは別のものを感じたからです。個人的な感想ですけど。

ただ実際 "Freedom is not free"と言う思想があり、自由は自らの手で勝ち取れなければならない、と言う風潮があるようです。

で、ツアーの選択についての感想は以下の通りです。

  • 日本語ガイドは熱い。しかも自分しかいなかったので、戦争に関することなど諸々聞けた
  • 19時着は大嘘。結局21:30にニューヨーク到着。"交通事情により前後します"と書いてあるが、ガイドさんから見ても19時着はありえない模様。帰りは必ず渋滞するようなので。元々の予定はやむなくキャンセル...
  • 入館料を含みます、は嘘。諸々回ったが、全部無料のところでした。

まぁ日本語ガイドさんとの議論を踏まえるとツアーにしてよかったかなぁと思いつつも、渋滞を加味して帰りは電車にする、ガイドは現地で雇う、という選択肢も検討の余地あったかなぁと思いました。

f:id:go-mount:20190524013330j:image

まとめ

ニューヨークを拠点として、ナイアガラ・トロント・ワシントンを回るためのTIPS/検討プロセスについて説明をしました。結果として、スケジュールは以下のように組み立てました。

f:id:go-mount:20190523194211p:plain

 

 

 

*1:H.I.S. | ニューヨーク発 ナイアガラ1日観光 空港 集合・解散プラン,JTB USA | ニューヨーク発ナイアガラ1日観光 ~往復航空機利用、昼食付き~ | ルックアメリカンツアー - JTB USA Looktour.net

*2:ニューヨーク発 ナイアガラの滝1泊2日 | H.I.S.世界一周旅行デスク

*3:JTB ニューヨーク(ニューヨーク) 海外現地オプショナルツアー MYBUS(マイバス) 日程内容

*4:https://www.kkday.com/ja/product/1741/?cid=4625&ud1=jp&ud2=pc

*5:

ナイアガラの滝2泊3日ツアー トロント観光+サウザンド・アイランズのクルーズ+アウトレットモール買物付き<日本語アシスタント/往復車利用/4~10月限定> | ニューヨークの観光・オプショナルツアー専門 VELTRA(ベルトラ)

*6:ナイアガラ観光&滝の見えるお部屋とトロント宿泊ツアー 片道空港送迎付き!<2泊3日/日本語ガイド/トロント発> | トロントの観光・オプショナルツアー専門 VELTRA(ベルトラ)

*7:ナイアガラの滝4泊5日ツアー トロント+フィラデルフィア+ワシントンD.C.観光+アウトレットモール買物付き<日本語アシスタント/往復車利用/4月~10月限定> | ニューヨークの観光・オプショナルツアー専門 VELTRA(ベルトラ)

*8:ワシントンD.C.観光 | ニューヨークの観光・ツアーの予約 VELTRA(ベルトラ)

*9:ワシントンD.C. 日帰り観光ツアー 移動はWi-Fi、コンセント完備のアムトラックで快適に<日本語ガイド/往復アムトラック> | ニューヨークの観光・オプショナルツアー専門 VELTRA(ベルトラ), 【H.I.S.】アムトラックで行くワシントン1日観光ニューヨーク(アメリカ合衆国) のオプショナルツアー|海外現地ツアー格安予約

*10:GreyhoundGreyhound.ca | Home ※アメリカとカナダで予約サイトが異なるので注意

若者の仕事論 〜5年目社員が転職前に一筆

どうも、ITコンサルタントのShoheiです。

実は先日転職活動を終え、6月から肩書きがソリューションアーキテクトになることになりました。

今日は、丸四年務めた1社目を卒業する記念に、現時点で思う仕事論・就活論を記していきたいと思います。

仕事は勉強じゃない

仕事は勉強じゃありません。

失敗をしたり、スキル不足が露呈したりした時に、「すみません、勉強します...」という人がいますが、僕はそれを聞くと「いや、仕事してください」って思います。

勉強と仕事の違いは、2つあると僕は思っています。

仕事と勉強の違い①

勉強は自分のためにします。仕事は他人(多くの場合はお客様)のためにします。後者は利害関係(感謝)が発生しますが、前者は必ずしも発生するとは限りません。実際、受験勉強で大成功したとしても、大学側から感謝されることはないでしょう。

仕事と勉強の違い②

勉強は一人でもできます。仕事は一人ではできません。上述の通り必ず他人(お客様)が存在しますし、多くの場合チームで行動をするからです。

 

仕事と勉強に本質的な違いがあるのに、仕事での失敗を「勉強します」で片付けようとするのは、少し甘いと思います。

失敗の原因が勉強不足だった、ということもあるかもしれませんが、勉強だけではなくその後の仕事でアウトプットを出さなければいけないと思います。

成功は信頼の上にある

他人から信頼を得ることは、仕事で成功する上で最も重要な要素だと思っています。

信頼ができる相手とは、一定の期間内に自分やプロジェクトをHappierにしてくれる人。

もう少しブレイクダウンすると、求めることに対して、確実にアウトプットを得られ、かつそのアウトプットを一緒にすり合わせできる人、ですかね。飲みに誘ったら断らない人、ではないです、当たり前ですけど。

自分の経験上の、社内/社外で「この人優秀だなぁ」と思った人は、絶対にレスポンスが早いです。しかも返答内容も的確で物事を前に進める発言です。僕はそういう人をすごく信頼してしまいますし、客観的にみてもその人は優秀とされている人です。

逆にこの人はあんまり、って思う人に例えば資料を共有しても、1日ぐらいたって「ありがとうございます、確認します。取り急ぎお礼まで」って返ってきて終わります。そして資料は確認されることなく終わります。

どちらが信頼できるか & どちらなら自分(やプロジェクト)をHappierにしてくれるポテンシャルが高いかというと、前者でしょう。

ちゃんと頭で考えて"仕事"をして初めて力がつく

採用面接などでよく聞かれるのは、「で、君はどんな力がある人なの?」「うちの会社にどう貢献してくれるの?」「困難乗り越えた?どうやって?」などの質問ですよね。

こういう質問にちゃんと深く答えられるのは、業務なりプライベートで、ちゃんと仕事をしてきた人だけだと思います。

中途採用の場合、多くは現職での業務での経験を問われますが、現職でろくに仕事をせず「なんとなく今の会社が嫌だから辞める」という人には答えられないと思います。

昔読んだ本で印象に残っているフレーズがあるので引用します。

世の中で本当に承認されたりされなかったりする対象は、「状態」ではなく、「行動」です。行動の結果として達成される成果こそが承認されるのです*1

重要なのは、どんなすごい企業にいた/部署にいたかという状態ではなく、どんな仕事をしたかという行動です。

優秀な企業は行動や思考プロセスを重んじた採用をしますし、だからこそ入っても活躍できる人が採れるのだと思います。

逆にあまり行動起こしてこなかったのに経歴だけで採用された人は、また次の企業でも結果が残せず「この企業は成長できない」とか言って、またさほど待遇も変わらない企業を点々と可能性もあるのではないでしょうか。

 

かといって過去の行動にいつまでも固執している人は置いてかれると思います。

僕の知っているあまり優秀でない上司は、いつも昔話を嬉々として語ります。しかも大して面白くもなければ、教訓も伝わらない、ただの思い出話です。そして残念ながら今仕事ができているかというとNOです。

これも昔読んだ本ですが、好きなフレーズがあるので載せます。

「ああで、こうで」と説明して伝わるものは弱い。

それよりも「一発で伝わってしまう何か」の方が強い*2

結局、過去の武勇伝や状態をあれこれ語るよりも、あなたがどんな行動を起こしてきて、今何ができるか、が重要です。そしてもしそれが振る舞いで一発で伝わるのが一番強いです。

コツやイベントに振り回されるな

新卒採用の時、ありとあらゆる就活イベントに顔を出して、学業や研究をないがしろにしてるにも関わらず、何か勝ち誇ったような態度をとる人がいました。

僕はそういうのがすごく嫌いでした。理由は大きく二つあります。

嫌いな理由①

就活のテクニックなんてものはないからです。

「あの就活イベントいいよ。いろんな就活のコツが学べるわ。とりあえずあの人に聞くとすごい就活のこと色々教えてくれるよ。とりまFacebookで繋がっとくといいよ。」なんてのはナンセンスだと思います。就活に特化したテクニックなんてものはなく、本質を抑えていないからいつまでもイベントに振り回されるのかと。僕は以下を押さえておくだけで就活なんてなんとかなると思っています

  • 採る側と採られる側の構造を正しく理解する
  • 自分にどんな強みがあるかを把握し、過去の行動や今後とるであろう行動を論理的に説明できるようにすること
  • 思っていることを周りに共有でき、すり合わせが可能であること

嫌いな理由②

結局企業の中のことなんて全て分かるわけがないということ。

同じ企業のセミナーに100回行ったって、OBを100人を訪問したって、自分がその企業に入ってどんな境遇に置かれるかを把握することは不可能です。入ってからもわかりません。

だから僕は、自分のやりたいことだけざっくりと決めて、なんとなく方針や文化が合いそうな企業だけ定めて、あとは縁があったところに入ろうと思っていました。

そして当時から、入ってからより詳細に世界が見えたら、力をつけて出ればいいと思ってました。むしろ当時は、大学院で研究をする立場にいたので、その最高の環境を棒に振るのはもったいない、と思って研究をすごく頑張っていました。

 

もちろん就活テクニックも情報収拾も、全否定するわけではないですし、多少の活動は有意義に働くことも多いと思います。ただ、状態を手に入れるためだけに無限に力を使って、精神をすり減らしていくのは勿体無いので、ある程度のところで切り上げて、あとは自分のために時間を使うべきだと思います。

 

そういえば就活の違和感を描いた「何者」という映画、すごく面白いですよ。

直接関係ないですが、好きな名言を記載しておきます。

人脈を広げるっていつも言ってるけど、分かるか、ちゃんと生きているものに通っているものを「脈」っていうんだよ。(中略)

見てて痛々しいんだよ、お前。*3

健康に働くことは大前提

最後です。働いて不健康になることは百害しかないと思います。

賛否ありますが、極めて一時的な事情によって一時的に不健康になるというレベルなら、まだ分からなくはないです。

ただ、仕事が原因で、身体的/精神的に常に不健康になる場合は、やり方か業務を変えることにも頭を回した方がいいと思います。というか経験上、やり方をまず考え直した方がいいです、激務という言葉に陶酔して逃げるのではなく。

「うちらイケイケだから水曜日なのにオールしちゃったぜ」

「え、なんで終電で帰っちゃうの?うちらイケイケ系じゃん」

「昼ごはん?食べる暇ないよー。逆にそんな時間あるの?!(@喫煙所)」

みたいな人周りによくいますが、この人たちは仕事でちゃんとパフォーマンス出るんでしょうかね。

体力ではなく頭脳でスマートに働いて、かつ仕事によって達成感を得て精神的健康度をあげる、というのが僕の中では理想です。

まとめ

転職前に、仕事や就活に対して思っていることをまとめてみました。

途中の引用にも登場した以下の本、仕事や勉強を考える上ですごくおすすめです。数年前に読みましたが、就活前にもう一度読みました。

おとなの進路教室。 (河出文庫)

おとなの進路教室。 (河出文庫)

 

 

 

 

 

Webシステムってどうやってできてるの? Web三層アーキテクチャとボトルネックについて理解しよう。

どうも、ITコンサルタントのShoheiです。 

今日はWebを構成するアーキテクチャの基礎について説明していきます。

以前までの記事との関連性について

過去記事で、Webサーバに関する超入門記事httpに関する説明記事を説明しました。

また今までいくつか、データベースに関する記事なども記載してきました。

ただし、WebシステムはWebサーバやデータベースサーバがあれば構築できるかと言われるとNoで、色々なサーバがそれぞれ機能を発揮し合うことで、一つのシステムを構成します。

今回は、その基本となるWeb三層アーキテクチャ(Web三層モデル・Web三層構造)について説明したいと思います。

Web三層アーキテクチャの概要

Web三層アーキテクチャという言葉を聞いたことがありますか?

WebサイトやWebアプリケーションを作る時、以下のような3つの役割を持つサーバによりシステムを構成させるモデルのことを指します。

f:id:go-mount:20190503132617p:plain

超基本的なWebサイトは、この3つのサーバさえあればある程度の機能は提供できます。

一つずつ役割を見てみましょう。

Webサーバ

レストランでイメージしてみましょう。あなたがメニューを見て特定の料理を得たい、と思った時、まず誰に何をしますか? そう、ウェイターさんに注文をしますよね。そして裏で作られた料理を運んできてくれるのもウェイターさんです。

Webサーバはまさにそのウェイターの役割をするためのサーバです。

Webサーバは、HTTPリクエストを受け付けます。あなたが「このブログを見たい」と思ったら、HTTPという形式で、このサーバに対して注文を出すことになります。そしてWebサイトのコンテンツ(主にhtmlファイル)を返してくれるのも、このサーバです。

もっと身近な言葉でいうと、Webサーバとは、ユーザがChromeにURLを入力してエンターを押した時、そのリクエストが到着する場所であり、最終的なコンテンツ(例えばこのブログ)を返答する役割を持つ場所です。

f:id:go-mount:20190503180903p:plain

 

Appサーバ

さて、ウェイターさんが注文を受け付けました。その後、レストランだと何が起こりますか? きっと裏で控えているコックさんに注文内容を伝えて、料理を作りますよね。

Appサーバはコックさん的な存在です。Appサーバの中にはRuby, Java, PHPなど、コンテンツを動的に生成するプログラムが入っています。プログラムに条件を与えると、それを元にコンテンツを生成します。

f:id:go-mount:20190503134042p:plain

コンテンツを生成するってなんやねん、という方、少しイメージを沸かせてみましょう。

(1) いつ誰がアクセスしても全く同じサイトの場合

いつ行っても全く同じWebサイトが表示されるパターン。わかんないですけど古ーい役所のサイトとかですかね。

こういうサイト、もうあまり見なくなりましたが、この場合はあまり生成するというイメージとは合わないかもしれません。確かにこの場合は、おそらくサーバ側には静的なhtmlファイルが格納されていてそれを返すだけになるので、PHPなどの動的にコンテンツを生成するプログラムは不要となるかもしれません。

(2) 時間によって異なるコンテンツを返すサイトの場合

例えば、(1)のサイトに変化をつけるために、サイトのトップに時間や時期によって「おはようございます」「こんにちは」「こんばんは」「メリクリ」「あけおめ」などの挨拶をつける場合、このサイトは動的と言えます

その場合例えばですが、

  1. Webサーバでhttpリクエストを受け付け、Appサーバに処理を依頼
  2. Appサーバでphpプログラムを起動し
  3. 時間と時期を判定してメッセージを作り
  4. そのメッセージをあらかじめ用意しておいた静的なhtmlファイルに追記して(phpが行う)
  5. 生成したhtmlファイルをWebサーバ渡す

といった流れで、挨拶文を生成します。

お、なんとなく動的なプログラムが必要そう、って理解できましたか?

イメージ図とともにいくつか例を2つ記載しておきましょう。

f:id:go-mount:20190503182159p:plain

 

(3) システムに保存しているデータを元にコンテンツを生成するサイトの場合

ECサイトをイメージしてください。アクセスすると、商品名や値段、在庫状況などの情報が表示されるかと思います。この情報は、日により、また時には秒単位で変化するものであり、またビジネスの観点でも非常に重要なデータとなります。

またユーザーの検索や絞り込みに合わせて表示するコンテンツも変わりますし、ログインユーザーに合わせて表示内容も変える仕様かもしれません。 これらは言うまでもなく動的にコンテンツを生成する必要がありますね。

細かくは後ほど触れますが、これらの情報はDBサーバに保存されることが大半です。

 

この際のコンテンツ生成の流れをAppサーバ目線で説明します、

コンテンツを生成する際、AppサーバからDBサーバに対してアクセスし(SQLクエリを発行し)、まず情報を得ます。そしてその情報を元にコンテンツを生成し、クライアントへの送信します。

またデータの参照だけでなく更新も行われます。商品の購入があった際に在庫を減らす、など、DBの値を更新する必要が出た際は、Appサーバ経由でDBサーバにアクセスし、情報の更新を行なった上で、「購入が成功しました、発送日は明日です」などのコンテンツ生成することとなります。

 

f:id:go-mount:20190503175634p:plain


DBサーバ

データベースサーバについては、こちらの記事ですでに紹介されているので、利用のメリット等についてはここでは触れません。

一つ、もう少し細かく中身を分解するのであれば、以下のように構成されています。

 

f:id:go-mount:20190503182730p:plain

上の図のように、データは、データの保護に強かったり、大容量保存が可能な外付けのStorageに保存していることが多くあります。

これだけ見ると大した話ではないのですが、今回は折角Web三層アーキテクチャの話で、個々のサーバの連携の流れについて説明をしているので、Appサーバ・DBサーバ・そしてそのStorageの間での処理の流れについても記載してみましょう。

f:id:go-mount:20190503183544p:plain

ハードパース・ソフトパースなどの用語の解説はここではしませんが、ざっくりした処理の流れについては理解できるかと思います。

実はこの処理の流れが意外と重要です。例えば、このシステムの管理者が「Webが遅いんだけど」というクレームを受けた時、DBサーバ側の処理でどこを疑うべきか(ボトルネック)特定したり、対処の計画を立てるときに、ここの理解が重要になります。

それぞれの作業で、どこに負荷が発生しているかは以下の通りです。

f:id:go-mount:20190503184148p:plain

 

前回記事で若干触れた通りですが、CPU/Memory/Diskの中で最も負荷の原因になりやすいのは、DiskへのIO(読み書き)です。

CPU演算 : Memoryへの読み書き : Diskへの読み書きの速さ=ナノ秒 : マイクロ秒 : ミリ秒 というオーダーと言われており、それぞれ1000倍ずつ違ってきます。

とはいえ、DiskIOが必ずしもボトルネックというわけではなく、ケースバイケースなので、それぞれについて細かく分析をし、ボトルネックを特定していく必要があります。

DB周りの性能改善について学ぶには、以下が非常に良本です。本当に勉強になります。興味がある方は是非読んでみてください。

データベースの限界性能を引き出す技術 ~NoSQLに飛びつく前に知っておきたい原理と最新テクニック

データベースの限界性能を引き出す技術 ~NoSQLに飛びつく前に知っておきたい原理と最新テクニック

 

まとめ

Web三層アーキテクチャと、Databaseサーバの中身の構造について少しだけ触れました。

なお、Web三層アーキテクチャについては、途中でWebサーバ/Appサーバだけの構成を紹介した通り、必ずしも全て必要とは限りません。また、物理的に環境を分ける必要も必ずしもなく、一つのVM上に全機能を実装するというようなやり方行われることは理解しておきましょう。

今更聞けない!OSっなに何?? CPU/メモリ/ディスクってなに??

平成最後のGWいかがお過ごしでしょうか。

ITコンサルタントのShoheiです。ご無沙汰しております。

最近OSについて少し深く勉強をしたので、今日はOSについて、初心者向けのざっくりした説明を行なっていきましょう。

OSって何?

OSについて聞かれると皆さんはなんと答えますか?

以下のように、なんとなくOSという言葉が何を指すかはイメージ湧くのではないでしょうか。

f:id:go-mount:20190429161207p:plain

でも、OSが何かを説明してくださいと言われると、正確に説明できるか怪しいのではないでしょうか。

今日はそれについて簡単に説明をしていきたいと思います。

OSはソフトウェアだよ

まず最初にざっくりとした説明をするなら、OSはソフトウェアです。

よくMacbook Airなどを持ってる人を見て「Mac持ってるんだねぇ」と言ったりしますが、正確言うならあなたが見ているそのPCそのものはMacintoshと呼ばれるものです。そしてその中で動いているソフトウェアがMac OSです。(Macintoshを略してMacと言ってるのかもですが)

同様に、WindowsはPCの種類ではなくOS名です。これも同様にPCの中で動いているソフトウェア名を指します。

よく「Windows PC」という言葉を使う人がいますが、正確には「Windowsというソフトウェアが(たまたま)中で動いているPC」であり、PC自体を指してはいけません。現に同じPCでも中でWindowsが動いているとも限らず、Linuxなどが動いている可能性もあります。

まずはコンピュータとプログラム(アプリケーション)について理解しよう

OSは何のためのソフトなの?一言で言うと、OSとは、コンピュータの動きを統合的に管理するための管理ソフトです。

視点を変えると、個々のアプリケーションがわざわざ個々のハードウェアのことを考えなくてよくするための、アプリケーション補助プログラムです。

少しずつ噛み砕いてみてみましょう。まずはコンピュータとは何かみてみます。

コンピュータを構成する主要キャラクターたち

コンピュータが何かを理解するために、コンピュータの基本構成要素である、CPU/Memory/Diskについて簡単に説明しましょう。

ここで理解できなくても、この後右端のイメージ欄を使って個々の役割を説明していくのでご安心ください。

f:id:go-mount:20190429170314p:plain

イメージを沸かせよう

CPU/Memory/Diskのイメージをもう少し具体的に沸かせるために、右端のイメージ欄を使ってそれぞれについて説明してみましょう。

例えば以下のような状況になった時、あなたならどうしますか?

f:id:go-mount:20190430121939p:plain


正解は個々によるかもしれないですが、あえてCPU/Memory/Diskを意識しつつ回答すると、以下の通りです。立って計算すると著しくパフォーマンスが悪いので、一度机の上に問題を展開して、計算するのがベターでしょう。

f:id:go-mount:20190429172621p:plain

実際のマシンに置き換えてみよう

Diskへのアクセスは一般的に低速です。物によりますが、Memoryアクセスと比べて1/10-1/100になります。

「じゃぁ全てMemoryに保存すればいいじゃん」と思うかもしれませんが、残念ながらMemory上に保存できるデータは容量が小さく(容量あたりの値段も高い)、かつDiskと違って再起動などのタイミングでデータが消えてしまうというリスクもあるため、一般的にデータやプログラムはDiskに保存をします。

この状況を鑑みると、Diskに保存されているデータやプログラムは、以下のような流れで演算がなされます。

  1. CPUがDiskにアクセスし
  2. CPUがそのデータをMemoryに展開をし
  3. CPUがMemory上で計算をし
  4. Diskに計算結果を書き込む

プログラムとハードウェア

上記の例ではプログラム/アプリケーションという言葉を出しませんでしたが、上に記載のような演算を行わせるには、それらが必要となります。

ちょっと細かい話ですが、それらの言葉について一旦明確にしておきましょう。

プログラム

コンピュータのCPUに対して、ある決まった動作を行わせるための一連の命令およびデータの複合体のことを指していて、コンピュータは、いかなる場合もプログラムによって動きます。

「オペレーティング・システム」も、こうしたプログラムの一種です(略)

重要なのは、「コンピュータは、いかなる場合もプログラムによって動きます」の記載です。コンピュータの実態は、CPU/Memory/Diskなどのハードウェアをさしますから、これらを動かすには必ずプログラムというものが必要となります。

また、プログラムはどこに保存されているかというと、基本的にはDiskの中に保存されています。

f:id:go-mount:20190429175316p:plain

プログラムを起動するのは誰?

さて、ここで疑問が湧きませんか? プログラムはDiskに入っていると言いました。でも、コンピュータはプログラムがないと動かないと言いました。これってとりたまご問題的なもので、この原則だと誰もコンピュータを使えませんよね。

f:id:go-mount:20190430123043p:plain


そこで登場するのが、OS君です。

最初にOSプログラムが例外的に立ち上がり、その後OSというプログラムを介して各プログラムを立ち上げていくようになります。

まぁ言われてみれば日常で実感のある話で、例えばエクセルを起動したいとき、まずはPCの電源を入れてOSを立ち上げますよね。その上でエクセルなどをクリックして開いていくはず。

当たり前の話ですが、上記のような原則を踏まえて理解しておくことは非常に重要です。

f:id:go-mount:20190430124340p:plain

なお、OSがどうやって立ち上げるかはここで詳しく触れませんが、興味があればBIOS,ブートローダあたりを調べてみましょう。以前紹介したLPICの資格でもこのあたりの知識は問われます。

OSの役割はもちろんこれだけではないので、もう少しだけ続けていきます。

その前に、よくプログラムと混同しがちなアプリケーションという言葉について明確にだけしておきましょう。

アプリケーション

アプリケーションとは、一つの目的を果たすための一連プログラム全体を指す言葉であり、必ずしもそれは、一つのプログラムとして独立しているとは限りません

アプリケーションはユーザ目線の言葉なので、エクセルとか、Wordとか、そういうイメージで捉えておきましょう。

ユーザからは一つのアプリケーションでも、中で複数プログラムが動いている可能性もある、ということです。


ハードウェアの直接操作は非効率かつ危険

先ほどの絵ではプログラムが直接CPU/Memory/Diskへアクセスして制御させていました。ただしこれは、実態とは異なります。これだと非常に非効率かつ危険の状態を招いてしまいます。

理由の一つとして、各プログラムがハードウェアごとの差分を意識する必要性が出てくることが挙げられます。

CPUへの命令は機械語と呼ばれるCPUが理解できる言語で出すのですが、CPUのメーカーやバージョンや型番が変わると、この言葉や指示形式が変わってしまいます。プログラムやアプリケーションを作る開発者にとってみると、世の中に無限にハードウェアが存在する中で、全てのハードウェアを想定したプログラムを作成するのは、不可能に近いです。

f:id:go-mount:20190430124916p:plain

また、別の理由として、プログラム同士が競合してしまうことも挙げられます。

以下のように、複数のプログラムが同時に動作している場合(マルチタスク)、もちろん個別で開発されたプログラムAとBはお互いを意識するように作られていないですから、個々が好き勝手ハードウェアに指示を出すと、以下のような競合を招いてしまうことがあります。

f:id:go-mount:20190430125242p:plain

これでは、お互いのプログラムが正常に動作しないでしょう。また、OSが使っている領域を書き換えてしまうことがあると、他のプログラムの起動等の制御もできなくなってしまいます。

 

頼りはやっぱりOS

さて、もう想像つくかもしれませんが、これらを解決するのはやっぱりOSです。

各アプリケーションは、直接的にコンピュータにアクセスするのではなく、そのアクセスをOSに依頼します。これをシステムコールと呼びます。

システムコールを受けたOSは、各アプリケーションに適切なメモリ領域を割り当て、競合等不都合が起きないようにしっかり管理を行います。

また、上述のハードウェアの差分についても、OSが全て受け止めます。OSが代表して各ハードウェアを意識してくれるので、各プログラムの開発者は、ただ「ハードウェアにアクセスしてほしい」という旨のシステムコールを、OSに合わせた形で打ち込むだけでよくなります。

f:id:go-mount:20190430125835p:plain


OSの定義をもう一度

さてさて、まとめに入っていきましょう。

冒頭で述べたOSの説明を再掲載すると、以下の通りです。

最初に記載した時よりも、イメージが湧くようになったのではないでしょうか。

OSは何のためのソフトなの?一言で言うと、OSとは、コンピュータの動きを統合的に管理するための管理ソフトです。

視点を変えると、個々のアプリケーションがわざわざ個々のハードウェアのことを考えなくてよくするための、アプリケーション補助プログラムです。

ただもちろんOSの役割はこれだけではありません。途中でマルチタスクという言葉をさらっと出しましたが、これの実現にもOSは相当頑張ってます。

もっと詳しく、深く知りたい人は、以下の本がオススメなので、是非読んでみてください。Windowsに関して書いてありますが、OSの基本はどれも変わらないので、Linuxエンジニアであれなんであれ、OSに関する深い基礎知識を身につけるにはオススメです。

Windowsはなぜ動くのか

Windowsはなぜ動くのか

 

 

 まとめ

OSについて説明しました。また合わせてハードウェアの動きについても解説しました。