hatoのプログラミング

IT関連の学習記録です。

Vimの基本操作

Vimとは

テキストエディタの一種です。ファイルを編集できます。
Macでは初めからインストールされています。
Windowsで使用するためにはインストールが必要です。

Vimの起動

次のようにvimの後に開きたいファイル名を付けてコマンドを実行します。

vim ファイル名
例: vim example.txt

Vimの操作

モード

コマンド 動作
esc ノーマルモード
i インサートモード(文字の入力が可能になる)
: コマンドモード(コマンドの実行ができる)

ノーマルモード

移動系

コマンド 動作
h ←(左に移動)
j ↓(下に移動)
k ↑(上に移動)
l →(右に移動)
0 行の先頭に移動
$ 行末に移動
gg ファイルの先頭に移動
G ファイルの末尾に移動
control + o 移動前の位置に戻る

削除系

コマンド 動作
x 1文字削除
dd 1行削除
dw 1単語削除

コピー&ペースト系

コマンド 動作
yy 1行コピー
p カーソルの下の行にペースト
P カーソルの行にペースト

操作の取り消し・繰り返し

コマンド 動作
u 直前の操作を取り消す
control + r uで取り消した操作を戻す(取り消しの取り消し)
. 直前の操作を繰り返す
{number}{command} numberの回数commandを実行する 例:2dd(2行削除), 5yy(5行コピー)

検索

コマンド 動作
/{pattern} 検索 例:/test
n 次の検索結果へ移動
N 前の検索結果へ移動

コマンドモード

コマンド 動作
w 上書き保存
wq 上書き保存してファイルを閉じる
q ファイルを閉じる
q! 変更を保存しないでファイルを閉じる
!{外部コマンド} 外部コマンドを実行する 例:!ls -a
!! 直前のコマンドを実行
set number 行番号を表示する
行番号 入力した行番号へカーソルを移動する 例:10
%s/{search}/{replace}/g searchをreplaceに一括置換 例:%s/apple/orange/g

まとめ

Vimの魅力はマウスやトラックパッドを使わずにキーボード操作だけで色々できちゃうところかなと思います。 エディタでも拡張機能を入れればVimの機能を使えるようなので試してみたいです。 下はVSCode拡張機能(「Neovim」とありますが操作性はVimと同じです)。

marketplace.visualstudio.com

オブジェクト指向とは

オブジェクト指向

次のように表現すると理解しやすいと思っています。

オブジェクト指向 = モノ指向、モノ中心

モノとは漢字で書くと「物」です。 オブジェクト指向とは、モノを中心とした考え方です。 つまり、ITの世界でのオブジェクト指向とはモノを中心としてソフトウェアを作ることということになります。

「モノ中心」とは別の考え方だと、「機能中心」で考えることもできます。 ソフトウェアはいろいろな機能が組み合わさったものなので、それぞれの機能ごとにソフトウェアを作る(= 機能中心の考え方)ということもできます。 でも、機能中心でソフトウェアを作ると仕様変更などに対応しづらい、修正範囲が広範になる等の問題があります。

一方、モノ中心とすることはソフトウェアの保守や再利用がしやすくなるというメリットがあります。 だから、ソフトウェア開発ではオブジェクト指向が広く採用されています。

参考

平澤 章(2021)『オブジェクト指向でなぜつくるのか 第3版 知っておきたいOOP、設計、アジャイル開発の基礎知識』日経BP

JavaScriptではオブジェクトの参照を比較する

JavaScriptでオブジェクトの比較をしたときの挙動が意外だったので、備忘録としてこれについて書きます。

本題

JavaScriptではオブジェクトを比較する際、オブジェクトの参照を比較するようです。

上の例ではaとbがそれぞれ別々に宣言されています。だから、別々のオブジェクトを参照している。それで比較するとfalseとなる。

cとdの場合は、dにcを格納しているので、同じオブジェクトを参照することになり、trueとなる。

const a = {} 
const b = {}
a === b  // => false

const c = {}
const d = c
c === d   // => true
余談

ちなみにRubyでは中身の形を比較します。Rubyの後にJavaScriptを学習していたので意外でした。

a = {} 
b = {}  
a == b   # => true
参考

azu、Suguru Inatomi(2020) 『JavaScript Primer 迷わないための入門書』KADOKAWA

共通鍵暗号方式と公開鍵暗号方式

はじめに

今回はセキュリティの話です。データを通信でやりとりする際、漏洩を避けるため、データを暗号化して受け渡しされることがあります。その暗号化技術に共通鍵暗号方式公開鍵暗号方式があります。これら両方の暗号方式ついて書いていきます。

共通鍵暗号方式

共通鍵暗号方式は、名前の通り共通の鍵を使って暗号化する方法です。下のようなイメージです。

BさんがAさんにデータを渡す例
  1. Aさんは鍵aを作り、Bさんに渡す(鍵aを共有する)
  2. Bさんはデータを暗号化して鍵aでロックする
  3. BさんはデータをAさんに渡す
  4. Aさんは鍵aを使ってデータのロックを解除して復号する

公開鍵暗号方式

公開鍵暗号方式は、公開鍵と秘密鍵というペアの鍵を用意して、公開鍵を使って暗号化し秘密鍵を使って復号する方法です。共通鍵暗号方式よりもなんだかややこしいです。南京錠のようなもので公開鍵が「鍵穴」で秘密鍵が「その鍵」だと考えるとわかりやすいと思います。共通鍵暗号方式と同じく、下に例を書きました。

BさんがAさんにデータを渡す例
  1. Aさんは公開鍵aと秘密鍵aを作り、Bさんに公開鍵aを渡す
  2. Bさんはデータを暗号化して公開鍵aでロックする
  3. BさんはデータをAさんに渡す
  4. Aさんは秘密鍵aを使ってデータのロックを解除して復号する

どちらが安全か?

共通鍵暗号方式の場合、鍵が盗まれてデータが漏洩するリスクがあります。鍵を共有するためには、まず初めに一方が他方に鍵を渡す必要があり(上の例だとAさんがBさんに渡していました)、この時に盗まれる可能性があります。鍵が盗まれると暗号化されたデータが復号されてしまいます。

公開鍵暗号方式でも、公開鍵を渡す時に盗まれるリスクがあります。しかし公開鍵は盗まれても問題はないです。公開鍵は暗号化することはできますが、復号することができないからです。復号するためには秘密鍵が必要であり、秘密鍵は受け渡ししないので盗まれる心配はありません。

ですので公開鍵暗号方式のほうが安全性が高いと言われています。

まとめ

共通鍵暗号方式は、共通の鍵を使って暗号化する方法。

公開鍵暗号方式は、公開鍵を使って暗号化し、秘密鍵を使って復号する方法。こちらのほうが安全性が高い。

参考

きたみりゅうじ(2011) 『キタミ式イラストIT塾 基本情報技術者 令和02年』技術評論社

他の人の作成したブランチを引き継ぐ方法

方法

具体的には、他の人が作成したリモートリポジトリにあるブランチを自分のローカルリポジトリに持ってくる方法です。 他の人の作成したブランチがリモートリポジトリに存在する必要があるので、そうでないならpushしてもらう必要があります。

下記の3つのコマンドを実行すればできます。

※ 他の人の作成したブランチをa_branchとしています。

$ git fetch
$ git branch a_branch origin/a_branch
$ git checkout a_branch

それぞれのコマンドの説明

$ git fetch

リモートリポジトリのブランチをすべてローカルに持ってきます。

$ git branch a_branch origin/a_branch

引き継ぎたいブランチと同じ名前のブランチをローカル上につくります。

$ git checkout a_branch

作成したブランチにチェックアウトします。作業をこなった後は、いつも通りにコミット、プッシュが行えます。プッシュしたら、リモートリポジトリ上の他の人が作成したブランチ(a_branch)に自分のコミットが上書きされているのが確認できるはずです。

まとめ

冒頭の「方法」で書いた3つのコマンドを実行すれば、他の人の作成したブランチを引き継げる。

参考

git fetch の使い方と、主要オプション | WWWクリエイターズ

git-branch – Git コマンドリファレンス(日本語版)

Cookie(クッキー)とセッション

はじめに

Cookieってなに?と聞かれても具体的に説明できないな・・と思ったので自分の理解を深めるためにも、Cookieについて書いてみます。ついでにCookieと関連の深いセッションについても書きます。

Cookie

Cookieとは、サーバとクライアント間で情報をやり取りする仕組み、またはそのやり取りする情報を指すようです。

ここまではなんとなく分かっていました。ではどういう仕組みかというと...

クライアントがサーバにリクエストを送ったら、サーバはクライアントに対してレスポンスと同時にCookieを渡す。クライアントはサーバに次のリクエストをするときに渡されたCookieをサーバに返す。そして、サーバはクライアントに対してレスポンス時にまたCookieを渡す。このようにサーバとクライアントはCookieを渡して返して...とやり取りするみたいです。

ではなぜCookieをやり取りするのかと言うと、サーバ側がクライアントを識別するのに役立つからのようです。Cookieにはクライアント独自の情報を入れることができるため、渡されたCookieを見ればクライアントを特定できるんですね。Cookieは箱のようなもので、その中にパスワードなどを入れるイメージですね。CookieにユーザAのパスワードが入っていたらユーザAからのリクエスト、ユーザBのパスワードが入っていたらユーザBからのリクエストというように、サーバ側は誰からリクエストが来たか特定できると言うわけです。

セッション

セッションは、セッションIDと呼ばれる情報をCookieとしてやり取りすることで、サーバがクライアントを識別する仕組みです。

Cookieの説明でパスワードをやり取りする話をしましたが、パスワードではなくセッションIDをやり取りするのがセッションってことですね。一般的には、このセッションの仕組みがユーザを特定するために利用されているようです。

パスワードをやり取りすると、通信の途中で盗聴されてしまうかもしれないので、セキュリティ上よろしくない。なので、パスワードのような個人情報ではなく、セッションIDと呼ばれるそれ自体は意味を持たない文字列をやり取りしているってわけです。

まとめ

Cookieは、サーバとクライアント間で情報をやり取りする仕組み。またはそのやり取りする情報のこと。

セッションは、サーバとクライアント間でCookieの仕組みを利用してセッションIDと呼ばれる情報をやり取りすること。この仕組みによりサーバがユーザを識別している。

参考

小森裕介(2010) 『プロになるためのWeb技術入門』技術評論社