naoの勉強部屋

ここは勉強ログ用。気になったことだけ、短く大雑把書く

DevOpsのContinuous Integration/Continuous Deliveryについての勉強ログ

この記事の目的

自分のDevOpsに関する知識を整理するためのものです。

DevOpsとはなにか

DevOpsとはDev(開発)とOps(運用)を一体化し、機能開発からデプロイまでの流れの効率化を目的とした手法です。 DevOpsの採用により、開発者はデプロイ時の複雑な手順を回避することができ、開発体験の向上が期待でき、ユーザーへは、効率的なリリースフローの採用により、迅速な価値の提供に繋がります。 また、障害発生時には、迅速なロールバックができ、障害回復への時間の短縮ができます。

DevOpsを支える技術

  • Continuous Integration(CI)
  • Continuous Delivery(CD)
  • etc

DevOpsを支える技術はこの他にもありますが、今回はCI/CDについて説明します。

Continuous Integration(CI)

CIとは小さい単位で機能開発時を行い、その変更に対して継続的にビルド・テストを行い、開発した機能に問題ないかをチェックします。テストを行うことにより、ある程度品質が保証され、障害発生の抑制が期待されます。 また、問題が発生したとしても、小さな単位で機能開発をしているため、迅速な原因特定へと繋がります。 開発者に対しては自動化により、ビルド・テスト作業から離れることができ、開発体験の向上につながります。

Continuous Delivery(CD)

CDはCIを拡張したものです。コード変更された場合、自動でビルド、テストを行い、実動作環境に対してデプロイする準備を行います。CDにより、本番環境にデプロイ準備を行いますが実際にデプロイするかどうかは開発者の判断に委ねます。 CDは、安全、迅速、持続可能な形でサービスの提供を目的としています。

参考

https://aws.amazon.com/jp/devops/what-is-devops/ https://www.amazon.co.jp/Lean%E3%81%A8DevOps%E3%81%AE%E7%A7%91%E5%AD%A6-Accelerate-%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E3%81%AE%E6%88%A6%E7%95%A5%E7%9A%84%E6%B4%BB%E7%94%A8%E3%81%8C%E7%B5%84%E7%B9%94%E5%A4%89%E9%9D%A9%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%99%E3%82%8B-impress-gear/dp/4295004901

サブネットマスクとCIDR記法について

この記事の目的

自分の知識の整理です。内容に誤りがある可能性があります。

IPアドレスとは

インターネットにおいて、あるコンピュータから、別のコンピュータへデータを送信したいとき、どこへ送るのかの情報が必要となります。この情報をIPアドレスと呼びます。 IPアドレスは32ビットからなっており、8ビットずつ10進数で表現し.で区切って192.168.110.24のように表現します。 IPアドレスは2つの部分から構成されており、前半のネットワーク部と後半のホスト部でわかれます。同じネットワーク部を持つものは、同じネットワークに所属します。また、ネットワーク部のビット長をプレフィックスと呼びます。 IPアドレスは、その範囲を示すために、CIDR方式とサブネットマスク方式で表すことが出来ます。

CIDR方式

ネットワーク部分のビット数で表現するものであり、例えば192.168.110.0-192.168.110.255までを範囲として持っている場合、192.168.110.0/24と表します。

サブネットマスク方式

ネットワーク部を1で埋めて表現します。例えば192.168.110.0-192.168.110.255までを範囲として持つ場合、192.168.110.0/255.255.255と表現します。

競プロの成績を伸ばすために必要だと思うこと

はじめに

これは、「こうすれば成績が伸びた!」とか実績に基づくものではなく、自分が必要だと思うこと、現状自分に足りてないことを書き連ねていきます。

必要だと思うこと

練習量・毎日やること

これは当然必要。競プロで戦うには自分の引き出しを増やすしかない。特に数学が得意ではない自分は、数こなして問題のパターンを知ることが必要だ。最近Atcoderで典型90問というありがたいコンテンツも出てきた。しっかり活用したい。

練習の問題を選り好みしない。

Atcoder Problemsなど練習を支援をしてくれるサイトがあってとてもありがたい。問題の難易度も表示してくれる機能もあり使い方を工夫すれば練習も効率的に行えると思う。しかし、自分の性格的に問題の難易度がわかってしまうと、まだ早いかな。。。とか思って自分の色以下の問題ばかりしてしまうので、現状難易度表示はOFFにしている。これで難易度に関する情報はアルファベットの情報しかなくなり、問題難易度の選り好みがなくなった。

言語について把握する。

競プロ初めて結構たっているが恥ずかしいことにどの型がどの程度の範囲をカバーしているのか未だに把握してない。現状C++をつかっているが、その他の機能についてもよく知らずに使っている。このデータ構造、このアルゴリズムがつかえればいいとか本番でスッとでてこないと大きなデメリットとなるだろう。これも練習量をこなせば身についてくるだろう。

テストを手を抜かない

テストは面倒。特に結構なデータ量のときは特に面倒だ。最低限サンプルテストだけは通すことはするが、自分でテストケース考えることはあまりなかった。問題の難易度があがるとテストをしっかりやってないと落ちる可能性は高い。コーナーケースを考えてやることが必要。

問題を絵で書いて直感的にも理解する

競プロは論理を駆使して問題を解決するものだ。しかし自分は、はじめから問題を論理的に考えられるほど記憶容量とスペックの脳を持っていない。そこで紙にストレージを拡張する。紙にはあらゆる制約が存在しない。問題を図示することもできるし思考を整理することもできる。紙を活用しない手はない。

おわりに

上の方法をすれば多分成績上がると思う。自分ができてないことなのでなんとも言えないが、少なくとも力は十分身につくと思う。これを気をつけて毎日競プロやっていきたい。 必要だと思ったことは後で書き足す

Atcoder ABC228 D問題

考え方

atcoder.jp

  1. 数列 A を-1で初期化する。
  2. 1-Nを要素として持つ順序付きの集合Sを用意する。
  3. tが1だった場合、順序付き集合Sからx_i以上となる最小の要素iを探し、A_ix_iを代入する。
  4. 順序付き集合Sから要素iを除外する。
  5. tが2だった場合、{{A_x}_i}を表示する

注意点

x_i以上となる最小の要素を探すとき、順序集合Sの最期まで行ってしまったら、順序集合の先頭の要素iを取得する

感想

解き方を理解してしまえばなんてことはない問題だが、本番でスッと出てこない。競プロは継続して力をつけていこう。

DBの基本概念・設計について

データベース(DB)について

データベースとは簡単に言うとデータの集まり。そのデータの集まりを管理するシステムがDBMS。 DBには様々な種類があり、現在主流のRDB、高速な処理を目的としたKVS、階層型のデータを扱うことができるXMLDBなどがある。

システムを作る上でデータベースを使うことは、ほぼ必須である。DBを用いるシステムを設計する上で、データを中心にシステムを設計することは有効である。データは変更することが少なく、処理の変更による影響が少ないためである。このような設計方法をDOAという。

またそのシステムでどのようなデータを扱うのか設計をしなければならない。その設計を3層スキーマといい、外部スキーマ、概念スキーマ、内部スキーマと3段階の設計が必要である。

  • 外部スキーマは、ユーザから見ての機能やインターフェースを定義する。
  • 概念スキーマは、データの要素、データ同士の関係性を定義する。論理設計とも言う。
  • 内部スキーマは、論理データモデルをどのように、テーブルに落とし込むのかを定義する。物理設計とも言う。

論理設計は、エンティティ抽出→エンティティ定義→正規化→ER図の作成からなる。

  • エンティティ抽出は、データ概念の抽出。
  • エンティティ定義は、データ概念を構成する要素の定義。
  • 正規化は、データ概念を構成する要素の整理。
  • ER図は、具体化したデータ概念と概念同士の関係を図におこしたもの。

参考

www.amazon.co.jp

セキュリティ勉強ログ(脆弱性とは)

脆弱性とは

脆弱性とは悪用できるバグのこと。 攻撃者はこのバグを利用し、システムに攻撃を仕掛ける。 攻撃を受けた側は、経済的損失(利用者への補償、信頼の喪失)を被る。 そのため、設計時にしっかりとセキュリティ面を考慮し、さらに継続的に見直しをしていくことが必要となる。 サービスの運用者は法律面からも利用者を保護するように決められている。

感想

サービスの安全性の担保は事業を行っていく上で最も重要。安全面から手を抜いてはいけない。

参考

www.amazon.co.jp

所信表明

これからコンテナ技術コツコツ学んでいきたいと思います。
理由は、

  • コンテナ技術は今や、アプリの開発、運用に必要不可欠なので、深く学べばいいことあるかも
  • 単純に動作原理が気になってる
  • ちょうど仕事で触ってるし
  • なんか一つの技術に精通してるってかっこいい!

ってなかんじです。
現時点の知識は、Dockerが雰囲気で使える程度です。
一年後ぐらいには「コンテナ技術完全理解した」っていえるといいな。