プロを目指す人のためのRuby入門[改訂2版]を読んだ感想!

はじめに

こんにちは、只今Rubyを勉強中のAkira(彰)です!
本日はプロを目指す人のためのRuby入門[改訂2版]を読んだ感想を、

  1. 良かったところ
  2. 学んだこと
  3. 難しかったこと

に分けて書いていきたいと思います!


良かったことろ

Rubyについての知識を網羅的に学べる

結構な分厚さの本ですが、基本的な知識(変数や四則演算、if文)を学んだあとのステップアップに関する知識を網羅的に学べる点が素晴らしいです。

タイトル通りプロ目線でのコードの考え方を学べる

本書内でリファクタリング等のコードを短く書く書き方を学べるのですが、何でもかんでも短く書くというわけではなく、保守性や可読性を含めた内容になっているので "プロを目指すとは" ということを意識しながら学習できます。

Ruby学習だけでなく、正規表現や自動テストへの学びのきっかけも作れる

正規表現フレームワークを用いた解説の章もあります。特に正規表現では別途Qiitaを用いた任意インプット資料があるのでそういった導線も非常に助かりました。

ハンズオンで進めていくため、身に付きやすさが違う

対話型でRubyのコードを実行できるirbを使ってハンズオンで学習を進めていくので頭への定着度が違います。


学んだこと

本書で学んだことの中で衝撃的だったことや便利だと思ったことを中心にまとめていきます!

参照の概念

Rubyでは変数などに代入されている値を参照するときにはあくまでオブジェクトを参照しているという処理(これを理解できているのとできていないのとではコードへの理解度が全然違う)を最初の段階で理解できたのは大きかったです。

Ruby特有の書き方や考え方

if文の戻り値を変数に代入する等のRuby特有の書き方。
後述しますがこの特有の書き方の部分が楽しい部分でもあり難しい部分でもありました。

Minitestフレームワークでのテストの自動化

Minitestフレームワークを用いてテストの自動化を学べます。
期待する結果と検証する値を検証するといった恐らく基本的なテストの書き方、テストの有用さを体験しました。
本書内で出てくる例題もこのテストを用いて動作の検証をするので、読み終わる頃にはテストの基本的な書き方は抑えられたかなと思います。

破壊的と非破壊的

以前Rubyを学習した際、メソッド名の最後に ! が付いているメソッドは破壊的メソッドで参照先のオブジェクトの内容を書き換えてしまうというように学びました。
ですが本書を読んで ! が付いていないメソッドにも破壊的な変更をするものはあると知りました。あくまで "破壊的、非破壊的メソッドが両方存在する" 場合区別するために ! を付けているようです。

ブロック

Rubyではforよりもeachとブロックを使って書く方がベターと学んで最初は少し戸惑いました。
ですが読み進めていくとブロックを使うと様々な処理を引数で渡すなどできるので凄い楽かも...!?と意識が変わっていきました。
パターンマッチやリファクタリングででてくるブロックの書き方はまだ理解できているか怪しいですが慣れていきたいなと思います。

シンボル

シンボルを使うと視覚的にわかりやすいだけでなく、内部的には整数なので高速に値を比較することができる等のメリットがあることを学びました。

正規表現

本書内の任意で読んでくださいという形のQiita記事を全て読みながら進めましたが、なにを書いているのか全くわからなかった状態からどのような文字列を指定しているのかまでわかるようになりました。

メソッドの可視性

public、private、protected という3種類の可視性があり、Rubyの private はサブクラスからも呼び出せるというのが少しびっくりでした。

オブジェクトやクラスへの考え方

Rubyではすべてがオブジェクトであり、そのオブジェクトに対してメソッドを使って操作するという考え方について深く知ることが出来ました。
またクラスについて普段何気なく使っているメソッドがどこのクラスに属し、なんのクラスを継承しているのか等についてもちゃんと解説されているのでちゃんと理解できたかなと思います。

モジュール

モジュールの定義方法と具体的にどのような状況で使用するかを学びました。 色々と使い道が多くて最初から全てを使いこなすのは難しそうだとも思いました。

ブロックオブジェクトを使った書き方

Procを使ってブロックをオブジェクトとしてメソッドの引数に渡すことで、通常1メソッドにつき1ブロックのところを制限無しに渡すことができる。
ある決まった処理に対して使用者がオプションのように機能を増減して使用できるような処理を書くのに便利で、メソッドやモジュールだけを使用して書くよりもわかりやすいと思いました。

パターンマッチ

配列や構造をパターンとして条件を指定できる技術。
正直理解しきれているかは怪しいですが書けるようになるとコードの幅が広がりそうなので是非習得したいと思いました。


難しかったこと

リファクタリング

コードを短く書くことを学ぶのですがあまりにも短すぎて読むのも難しく、まだ書ける気もしないというのが本音です...
でもこれは試行回数の問題のような気もするので沢山やってできるようになりたいです。

シンボル

: を使ったシンボルの書き方で、ハッシュを定義する時と呼び出す時で位置が違うのでいまだに混乱しています。

ブロック

ブロック自体Rubyを学習し始めて初めて触れた存在だったので非常に苦労しました。
まだ理解しきれているとは言えないですが様々なコードを読んだり書いたりするなどして慣れたいと思います。

パターンマッチ

学んだことでも書きましたが正直理解しきれていません。
ただ、本書を読んで便利さは凄いわかったのでもう少しRuby自体に慣れてから読み返すなどしてもう理解できるような工夫をしようと思います。


おわりに

最後に本書を読んでの全体的な感想についてです。
まず全体を通して感じたことが "公式リファレンスは読めるようになろう...!" でした。
というのも、本書内では定期的に便利なメソッド等を紹介して頂けるのですがまだ見ぬメソッドも勿論あるでしょうし、仕様を見た時に「このメソッドが使えそう」等の引き出しを増やすには公式リファレンスを読む癖をつけるというのが一番の近道だというのも本書を読んだ学びの1つでした。
それでは最後に、本書を読むのにかかった時間と読みながら取っていたメモの文字数を書いて終わろうと思います!ここまで読んでいただきありがとうございました。


時間:27.5時間
文字数:15312文字

勉強中!webアプリのDocker化!

はじめに

こんにちは!Akira(彰)です!
本日も勉強中シリーズです!
絶賛勉強中のDockerを使ってRails & PstgreSQL webアプリのDocker化についてアウトプットしていこうと思います。
※本記事はクィックスタート: Compose と Railsを参考に書いています。

本記事でやること

本記事で行う目標として

  • rails server を docker-compose up で起動できるようにする。

  • DBを永続化連携する。

  • 環境変数を.envファイルに持たせてそこから使用する。

  • ホストとコンテナのファイルを同期する

ができるようにやっていきます。

必要ファイルの作成

Docker化に必要なファイルとRailsを使用するのに必要な4ファイル & 環境変数設定用の .envファイルを作成していきます。

Docker化に必要なファイル

Docker化に必要なファイルとして Dockerfiledocker-compose.yml ファイルを作成します。
作成後、Dockerfile には以下のように記述

# ベースイメージのインストール
FROM ruby:2.7.0

# aptのアップデートと必要な依存パッケージのインストール
RUN apt update && apt install -y build-essential libpq-dev nodejs

# コンテナ内に /myapp ディレクトリを作成
RUN mkdir /myapp
WORKDIR /myapp

# 作成したディレクトリにホストのGenfile & Gemfile.lockをコピー
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock

# コピーしたGemfileを元にrailsをインストール
RUN bundle install

# ホストのファイルをコンテナに同期
ADD . /myapp

そして docker-compose.yml ファイルには以下のように記述

# composeバージョンの指定
version: '3'

services:
  db:
    # 作成コンテナ名
    container_name: rails-docker-db

    # postgresのイメージを指定
    image: postgres:12

    # 環境変数の指定(.envファイルから読み込み)
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_USER: ${POSTGRES_USER}

    # volumeとの連携
    volumes:
      - type: volume
        source: rails-docker-db-volume
        target: /var/lib/postgresql/data
  web:
    # 作成コンテナ名
    container_name: rails-docker-web

    # カレントディレクトリのDockerfileを元に作成
    build:
      context: .

    # 起動時に実行されるコマンド
    command: bundle exec rails s -p 3000 -b '0.0.0.0'

    # 環境変数の指定(.envファイルから読み込み)
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_USER: ${POSTGRES_USER}

    # バインドマウント同期するディレクトリ
    volumes:
      - type: bind
        source: .
        target: /myapp
    
    # ホストとサービスの通信ポート
    ports:
      - '3000:3000'

    # 起動順としてサービスdbが起動した後に起動する
    depends_on:
      - db

# DB用の永続連携用ボリュームの作成
volumes:
  rails-docker-db-volume:

Tip

Dockerfileとは
docker imageを作成するのに必要なimage内容を記述したファイル
docker-compose.ymlとは
複数のコンテナを取りまとめて使用するための内容を記述したファイル

Railsを使用するのに必要なファイル

Railsをインストールするのに必要なファイル GemfileGemfile.lock を作成します。
作成後、Gemfile には以下のように記述。

# rubygemsのurl
source 'https://rubygems.org'
# railsのバージョン
gem 'rails', '~> 7.0', '>= 7.0.6'

Gemfile.lockGemfile を使ってインストールされたgemの一覧とそのバージョンが記載されるものなので現時点で何かを記述する必要はありません。

Tip

Gemfileとは
gemをインストールするためのgemの一覧とバージョンを記載したファイル
Gemfile.lockとは
Gemfileを使ってインストールしたgemの一覧とそのバージョンが記載されるファイル

環境変数設定用のファイルを作成

セキュリティ上 docker-compose ファイル等に直接ユーザー名やパスワードを記載するのはよくありません。
よって .env ファイルに情報を逃がし、GitHubなどにpushする際 .env ファイルはpushしないことで情報の漏洩を避けることができます。
それでは .env ファイルを作成後、以下のように記述してください。

# postgreSQLのユーザーとパスワードの設定
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres

この .env ファイルからcomposeファイルで記載した POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}POSTGRES_USER: ${POSTGRES_USER} で読み込むといった流れになります。

Tip

.envとは
環境変数を記載したファイルで、compose実行時に自動で `.env` ファイルを探して読み込みます。

Railsファイルの生成

今まで作成、記述したファイルを使ってRailsファイルを生成します。下記コマンドを実行してください。

docker-compose run web rails new . --force --database=postgresql

上記コマンドを実行後、カレントディレクトリに幾つかファイルが増えているのが確認できると思います。
生成したファイルの所有を確認するとrootになっていると思うのでchownコマンドでユーザーに書き換えてください。

sudo chown -R $USER:$USER .

catコマンドでGemfileを確認すると自分で記述した内容じゃないものが増えていると思います。 次は更新されたGemfileを使ってbundle installを行うために docker-compose build を実行します。

docker-compose build

config/database.ymlの書き換え

これでサーバー自体は起動できるようになりましたがlocalhost:3000にアクセスするとエラーが表示されていると思います。
内容を確認するとDBとの接続エラーになります。これを解消するために config/database.yml を書き換えていきます。
config/database.yml を開き17行目付近からこのように記述してください。

default: &default
  adapter: postgresql
  encoding: unicode

  # postgreSQLが動作しているホスト名
  host: db

  # postgreSQLのユーザ名とパスワード
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>

  # DBで使用するポート指定
  port: 5432

  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_development

追記した情報が host, username, password, port なことを確認してください。
確認出来たらもう1度 docker-compose up でサーバーを起動してlocalhost:3000にアクセスしてみてください。

Tip

usernameとpasswordで設定している <%= ENV[~~~~~] %> という部分は .envファイルからdocker-compose.ymlのwebで読み込んだ環境変数を使用する。といった流れです。


DBのクリエイト

現時点でlocalhost:3000にアクセスしてもまだエラーが表示されていると思います。
ですが先程のDB接続エラーとは内容が変わり、指定されたdbが見つからないといった内容に変わっています。
次はこれを解消するために下記のコマンドを実行します。

docker-compose run web rake db:create

これを実行すると

Created database 'myapp_development'
Created database 'myapp_test'

ターミナルにこのような表示がされていれば成功です。 もう1度 docker-compose up でサーバーを起動してlocalhost:3000にアクセスしてみましょう。

上記のような画面が表示されれば成功です!

おわりに

ここまで読んでいただきありがとうございます!
Dockerは学んでみたかった技術の1つだったのでちゃんと理解したい気持ちが強く、気が付いたら40時間近くかかっていました...!
なんでもかんでもDocker化したい気持ちで溢れています!
それではまた次のアウトプット記事で会いましょう!ありがとうございました~!

勉強中!GitHub Pagesの使い方!

はじめに

こんにちは!Akira(彰)です!
今回はアウトプット第4弾!GitHub Pagesの使い方について解説していきたいと思います!
画像なども交えてできるだけわかりやすく解説していきたいと思いますのでよろしくお願いします!
なお、本記事はHTMLとCSSの基礎的な知識、GitHubアカウントを作成済みの方に向けた記事となりますのでご注意ください。

GitHub Pagesとは?

GitHub上のリポジトリからHTML、CSSJavaScriptファイルを取得し、任意でビルドプロセスを通じて実行しWebサイトを公開できる静的なサイトホスティングサービスです。

Webページを公開するために必要なもの

GitHubページを使ってWebページを公開するのに必要なものは

  • 公開するためのWebページ
  • GitHubアカウント

の2つとなります。
以上の2つが用意出来たら実際にGitHub Pagesを使って公開する方法について見ていきましょう!

公開までの流れ

それでは実際にWebページを公開するための方法について説明していきたいのですが、まずは全体の流れについて知っておいた方がスムーズだと思うので先にそっちを説明していきます。

全体的な流れ

公開までの全体的な手順や流れは以下のようになります。

この流れに沿って説明していきます。

GitHubリポジトリの作成

GitHubにログインしたら画面上部にある [Repositories] をクリックしてください。

クリックしたら画面右上の緑のボタン [New] をクリック。
ここでリポジトリの名前や細かい設定が行えます。Repository name は英数字で自由に決めてもらっても大丈夫なのですが、添付画像にある Public と Private を選択できるラジオボタンは Public を選択するようにお願いします。

GitHubの無料プランでPrivateリポジトリのGitHubPagesは使えないため。

作成が済みましたら次の手順の方に移っていきます。

作成したリポジトリに公開したいWebページのデータを上げる

リポジトリの作成が済みましたら添付を参考に [README] をクリックしてください。

クリックしたら特に何もせず、右上の [Commit changes...] ボタンをクリック。

作成したら、右上のプルダウン [Add file] をクリックして [Upload files] をクリック。

クリックしたら用意していたWebページのデータを [Drag files here to add them to your repository] と書かれた場所にドラッグ&ドロップする。した後に画面下部の [Commit changes] ボタンをクリック。
これで、作成したリポジトリに用意していたWebページのデータをあげるところまでできました!次はいよいよGitHub Pagesを使って公開、URLでアクセスしてみましょう!

GitHub Pages

データをリポジトリにあげた後の画面から画面上部の [Settings] ボタンをクリック。

左のサイドメニューから [Pages] をクリック。
ここでGitHub Pagesの設定を行います。
設定と言っても今回はシンプルに公開できればいいので変更する箇所は少ないです。

主に設定するのは上記画像のBranchと書かれた箇所です。
画像のmainとなっているところは公開するブランチ名、フォルダ/(root)となっているところは公開元の設定になります。
今回は、mainブランチの /(root)フォルダを指定してSaveをしてください。
※mainブランチの/(root)フォルダ内のエントリファイルを指定するという設定


これでWebサイトの公開は完了です。画面上部にできる [Visit site] をクリックするとページにアクセスできます。
※[Visit site]ボタンができるまでに少し時間のかかる場合があります。

以上がGitHubPagesを使って簡単にWebページを作る方法になります。

おわりに

いかがでしたでしょうか、画像を使った解説や説明は初めてだったので至らぬ点などあるとは思いますがなにかの参考になれば幸いです。
ここまで読んでいただきありがとうございました!

【HappinessChain】"本物"のプログラミングスクールに入会して1ヶ月が経ちました。

はじめに

2023/05/28に HappinessChain というプログラミングスクールに入会して1ヶ月とちょっとが経ちました!

happiness-chain.com

当記事は「エンジニアになりたい!」けどどのプログラミングスクールに入会していいか分からないといった方達の選択肢の1つになればと思います!
私自身、当記事で紹介するスクールを大変気に入っており、長くなることが想定されますが是非お付き合い頂けると幸いです。

当記事の結論

長くなりますので結論から先に書きます!


仕事として通用するスキルを身につけて転職や就職をしたいなら HappinessChain に入会するべき


です!!!!

HappinessChainの特徴

HappinessChainの特徴を箇条書きで上げると、

  • 圧倒的に " 質の高い "ロードマップ
  • コミュニティのレベルが高い
  • メンターへの質問が無制限かつ無料
  • 運営陣との距離が近い
  • 月額制で料金が安い

1ヶ月入会してみて大きくこのような特徴があると感じました!

この箇条書きだけでも他スクールと比べて十分すぎるぐらい魅力的な気もしますが、具体的にどのように優れているのかについてもっと具体的に書いていきたいと思います!

質の高いロードマップ

独学でのプログラミング学習を諦めてしまう大きな理由の1つとして、
「自分のやっている学習が正しいのか?」「学習を継続しても目標に近づけているのかがわからない」
この不安感に押しつぶされて諦めてしまうことが多いと思います。(自分もそうでした)

多くの方々はこの不安感から逃れるためにスクールを検討していると思います。
しかし、検索して1番上にでてくるようなスクールに入会してしまうと、卒業しても開発経験の積めない会社に就職してしまうといった本末転倒のような現象が起こります。
これを回避するには質の高いロードマップで学習し、現場にでても通用するスキルを身につける必要があります。
この "質の高いロードマップ" を提供しているのがHappinessChainだと感じています。

具体的にどういった部分で質が高いと感じたのか、それはもちろんロードマップ自体のレベルの高さは言わずもがなですが、エンジニアとしてどのように学習すればいいのかを同時に鍛えられる構成になっているところだと考えます。

これは HappinessChainのサイトにも書いていることではありますが、基本的な学習の流れは


教材でのインプット → アウトプット(課題) → コードレビュー


といったように進めていきます。

このインプットを市販されている教材を使って進めることで、エンジニアとして働きだしてからもどのような教材を使ってインプットをし、どのようにアウトプットすればいいのかという学習のベースを同時に鍛えていけるロードマップになっています。(所謂 "自走力" )

ロードマップ自体のレベルの高さにも言及すると、各課題の難易度が高いです。私が面白いと思ったのは、これから自身が取り組むプラクティスの課題にサッと目を通すのですが最初は何を言っているのかさっぱりわかりません笑
ですが課題前の指定されたインプット教材を取り組んだ後に再度目を通すと必ず理解できる内容になっていることです。(指定されているインプット教材の質も高い...!)

このようにロードマップの質を確保しながら絶対にクリアできる難易度の調整が大変絶妙だと感じています。
また、このような難易度の高いロードマップで学習をしているとスキルが着実に身についているという感覚もあり、ロードマップのない独学で不安になりながら学習をするのとでは絶対に継続率が違います。

コミュニティのレベルが高い

ロードマップで継続率が違うという話をした後ですが、それでもやっぱり1人で学習をしていると心が折れかける場面が必ずあります。
そこで必要になるのが同じ学習をして頑張っている "仲間" の存在です。
HappinessChainではSlackをメインツールとしてコミュニケーションをい取っているのですが、そのなかのtimesという仕組みが面白いと感じています。
timesというのは個人に与えられた好きに書き込んでいいチャンネルで、
「勉強するぞ~!」とか「眠い...」のようなことを自由に各々が書き込んでいます。
これの何が良いかというと人見知りでも抵抗が少なく、自身の書き込みにつけられたリアクション等でモチベーションがあがったりします笑
そして1番は他の仲間達の頑張りも同時に見えるので自分も「頑張ろう!」となり心が折れにくいと思います。

HappinessChainでは他にも様々なモチベーションアップのための仕組みが存在しています。
このように入会した人たちの心が折れないような仕組みが沢山あるのも大きな魅力だと感じています!

そして、先日初めてオンラインでのミートアップイベントで交流させて頂いたのですが、皆さんがお互いをリスペクトしあっていて互いのいい所を吸収しようとする姿勢が凄くて素晴らしい所だなぁと感じました。
レベルの高いコミュニティに身を置くことで自分も他の方達に少しでも近づけたらいいなぁなんて思っています。

メンターさんへの質問が無制限かつ無料

他のスクール等ではメンターへの質問が量が、別途料金だったり、時間が決まっていたり、回数が決まっていたりなど何かしら制限のあることが多いですがHappinessChainではメンターさんへの質問が無制限かつ無料で時間や回数などの制限がないので、わからないことがあれば積極的に質問することができるのでこれも学習で詰まらないために重要な点なのかなと思います。

運営陣との距離が近い

私にとってこれが一番驚きだったかもしれません。 さっきあげたtimes等でのコミュニケーションやイベントで直接お話しする機会が多くて驚きました。 初参加したオンラインミートアップでは緊張して全然喋れなかった私に対して色々と話題を振ってくださったり非常に優しく心から入会した人達の幸せを願ってる方なんだと感じます。

月額制で料金が安い(2023/07/09現在)

現時点で料金はどのコースでも月40000円行かない価格設定で月額制なので合わないと感じたら1ヶ月で辞めることもできます。
正直10万円以上しても全然おかしくない内容のスクールなので入会を考えている方は安い今のうちに入ることをおススメします!

総括

私が1ヶ月入会して感じたことは、卒業しても開発経験がしっかり積めるかどうかがわからないスクールが多い中でHappinessChainのロードマップを着実にクリアしていけばハイレベルな環境に身を投じれる。余計な不安を抱くことなく学習に集中できる環境や仕組みがある。 プログラミング学習において必要な要素が全て揃っているスクールだと思います! ここまで長くなってしまいましたが、現在独学でプログラミング学習をしているが行き詰っていてスクールへの入会を検討している方達の参考の1つになれば幸いです。

勉強中!Linuxのコマンドを説明してみた!

はじめに

こんにちは!Akira(彰)です!
もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう
Linux標準教科書
こちらの教材で学んだことのアウトプット練習第3弾!Linuxの基本コマンドについて、です!
できるだけわかりやすく説明できたらなと思うので是非見ていってください~!

Linuxってなんだ?

Linuxとは数あるOSの一種です。OSとは有名どころだとWindowsmacOS等がありますが、それらに比べてLinuxは、

  • オープンソースでだれでも自由に使える。
  • サーバーの運用がやりやすい。
  • 世界中の人が使っているため信頼性が高い。
  • 技術が枯れている。

等の特徴があります。
以上の特徴から安定性を求められるサーバー等のOSとして選ばれるのが多い事や、技術が枯れている為1度習得してしまえば何年たっても使える事から是非習得したい技術の1つです! ではこれからそんなLinuxでよく使うコマンドの方を説明していきたいと思います!

シェルとは?

コマンドを説明する!と意気込んでみましたが、まず最初にコマンドがどのように入力されて実行されるかの仕組みに大きく関わる シェル について説明させてください。
まずLinuxのコマンドはターミナルという画面にコマンドを打ち込み、それをシェルが解釈し、Linuxの中核部(カーネル)が実行するという流れになります。
この流れを見てわかるように、シェルの役割は我々が入力したコマンドをLinuxの中核部(カーネル)に伝える役割を持っています。

以上の流れを何となく理解しておくとターミナルとシェルの違いで変に混乱しなくなると思いますのでターミナルとシェルは 別物 という感覚を持って以降のコマンド説明を見てみて下さい!

コマンド

それでは本題のコマンド説明に移っていきたいと思います。
この説明ではまずコマンドの共通した書き方から入り、その後に各種コマンドについて説明していきます。

コマンドの書き方

Linuxのコマンドは基本的に以下の構成で書きます。

$ [コマンド名] [オプション]

コマンド名は名の通りなのですが、オプションに関しては各コマンドに付随する便利機能のようなもので、このオプションを使うと同じコマンドでも全く違う動きをさせることが出来ます。
これから説明するコマンド達はコマンド名と有用なオプションがあればそれも合わせて説明していきますのでよろしくお願いします!

cdコマンド(change directory)

cdコマンドとは change directory の略でディレクトリを移動する為のコマンドです。
LinuxWindowsGUIのあるOSとは違いコマンドでディレクトリの移動をしなければいけません。
その際に使用するのがcdコマンドというわけです。以下が書式と使用例です!

書式

$ cd [オプション] [ディレクトリ]

使用例

$ cd /home/akira/

以上が書式と使用例です。cdコマンドではオプションはあまり使われないので使うシーンが来たら調べて使う程度で良いと思います。
使用例を見るとわかるようにディレクトリはPATHで指定します。使用例では、homeディレクトリ内のakiraディレクトリに移動するという様に指定しています。 cdコマンドとこれから説明する pwd, ls コマンドは非常によく使うコマンドなので手癖になるレベルで覚えることをお勧めします!

pwdコマンド(print name of working directory)

pwdコマンドは print name of working directory の略でカレントディレクトリ(現在位置)のPATHを表示するコマンドです。
非常に簡単なコマンドなので書式と使用例を見ていきましょう。

書式

$ pwd [オプション]

使用例

$ pwd
/home/akira

pwdコマンドも最初はオプションを使うことはないので使うシーンが来たら調べてみてください!
使用例を見るとpwdを実行した後になにやらPATHが記載されています。これがカレントディレクトリです。
今自分がどこのディレクトリに居るのかわからなくなったらpwdを実行することで迷子を回避できます。

lsコマンド(list)

lsコマンドは list の略でファイルやディレクトリの一覧を表示するコマンドです。
具体的な書式と使用例を見ていきましょう。

書式

$ ls [オプション] [ディレクトリ・ファイル名]

使用例

$ ls /home/akira
README.txt dairy_report.txt icon.png test work

使用例を見てください。lsコマンドを実行後各種ファイルが表示されています。
これがディレクトリ・ファイル名で指定した場所の中身一覧になります。
また、lsコマンドには幾つか覚えてほしいオプションと パス名展開 と呼ばれるものがあるので説明していきます。

それではパス名展開から説明していきます。パス名展開を使うと複数のファイルを絞り込んで指定できます。
表と使用例をまとめたので見てみましょう。

記号 意味
* なんでもOK
? 適当な1文字

使用例

# 拡張子がtxtのファイルの一覧を表示
$ ls *.txt
README.txt dairy_report.txt

# tから始まり4文字で終わるファイルを表示
$ ls t???
test

以上がパス名展開を使用したファイルの指定方法です。

次はよく使うオプションを表にまとめましたので、実際に使って動作がどう違うかを実感しながら見てみましょう!

オプション 動作
-l ファイルの詳細情報を表示
-a 隠しファイルも含めた全てのファイルを表示
-F ファイル種別を表示

-F指定時にファイル横に出てくる記号でファイル種別を判断できます。
/ : ディレクト
@ : シンボリックリンク
* : 実行可能ファイル
記号なし : 通常ファイル

以上がlsコマンドの使い方とパス名展開、よく使うオプションでした!
とりあえずcdコマンドでディレクトリを移動したらlsコマンドで確認、というのを手癖にするといい感じかなと思います!

mkdirコマンド(make directory)

mkdirコマンドは make directory の略でディレクトリを作成するのに使用します。
書式と使用例を見ていきましょう。

書式

$ mkdir [オプション] <作成するディレクトリ名>

使用例

# workディレクトリを作成する
$ mkdir work

以上がmkdirを使ったディレクトリの作成方法です。
次はオプションについて見ていきましょう!

オプション 動作
-p ディレクトリ構造を1度に作成

-pオプションを付けるとディレクトリ構造を1度に作成できます。
例えば /work/code/test のようなディレクトリ構造を作成する場合、workを作成してからcodeを作成してtestといった具合に計3回mkdirコマンドを打たなければなりませんが -pオプションを使うと一度に、work/code/testと1回のコマンド入力で済みます。

rmdirコマンド(remove directory)

rmdirコマンドは remove directory の略でディレクトリを削除する際に使用します。
書式と使用例を見ていきましょう。

書式

$ rmdir <ディレクトリ名>

使用例

$ rmdir work

空でないディレクトリを削除しようとするとエラーになる点に注意しよう

以上がrmdirの書式と使用例です。
短く簡単で覚えやすいです!

catコマンド(concatenate)

catコマンドは concatenate の略でファイルの中身を表示する際に使用するコマンドです。
書式と使用例を見ていきましょう。

書式

$ cat [オプション] [ファイル名]

使用例

$ cat /home/akira/dairy_report.txt
取り組んだこと
わかったこと
次取り組むこと
感じたこと
学習時間

使用例はdairy_report.txtの中身を表示している様子です。
また、catコマンドでよく使うオプションを表にまとめました!

コマンド 動作
-n 行番号を表示する

以上がcatコマンドの使用方法とよく使うオプションです。 catコマンドは使用するとファイルの内容をターミナル全体に表示するため長い内容のファイルを表示するとターミナルが埋め尽くされます。
これを回避するために次のコマンド2種を見ていきましょう!

lessコマンド(less - opposite of more)

lessコマンドは less - opposite of more の略でファイルの中身をスクロール表示するコマンドです。
このコマンドは先程catでも説明したようにターミナルに内容が埋め尽くされるのを回避するために使用したりするコマンドです。
書式と使用例を見ていきましょう。

書式

$ less [オプション] <ファイル名>

使用例

$ less /home/akira/dairy_report.txt
取り組んだこと...

lessを使用すると一旦ファイルの内容だけの画面に飛びます。
この時コマンドを使用して操作する必要があるためそのコマンドを表にまとめました!

コマンドを 動作
スペース, f 1画面下にスクロール
b 1画面上にスクロール
j 1行下へ
k 1行上へ
q lessを終了
/[文字列] 下方向へ検索
?[文字列] 上方向へ検索
n 次の検索結果へ
N 目の検索結果へ

lessコマンドを使用後は以上のコマンドを使用して操作することになるので慌てずに操作しましょう!
以上がlessコマンドを使用したファイル内容の閲覧になります。

tailコマンド

tailコマンドは文字通り後ろという意味で、指定したファイルの終わり部分を出力するコマンドです。 書式と使用例を見ていきましょう。

書式

$ tail [オプション] <ファイル名>

使用例

$ tail -n 1 /home/akira/dairy_report.txt
学習時間

本来、tailコマンドはオプションを付けないで使用すると末尾10行を表示します。
ですが-nコマンドを使用して末尾1行のみの表示としました。tailコマンドで使用するオプションを見ていきましょう。

オプション 動作
-n [行] 末尾から指定した行を表示する
-c [バイト] 末尾から指定したバイト分表示する
-f リアルタイムで変更を見る

以上がtailで使うオプションになります。最後の-fに関しては使い方が少し特殊なので簡単に説明していきます。
-fオプションを使うことでファイルの内容をリアルタイムで監視することができます。
これを使用すると監視しているファイルの内容が追記された際などにリアルタイムで何が追記されたのかを監視することができます。

ログファイルの監視等の使用が多いようです!

touchコマンド

touchコマンドは指定したファイル名が存在する時はタイムスタンプを更新し、存在しない場合は0バイトの空ファイルを作成するコマンドです。
主にファイル作成で使用したりします。書式と使用例を見ていきましょう!

書式

$ touch <ファイル名1> <ファイル名2>

使用例

$ touch index.html

この使用例のように入力すると同じファイル名が存在しない場合、指定したファイル名が新規に作成されます!

rmコマンド(remove)

rmコマンドは remove の略でファイルやディレクトリを削除する際に使用します。
書式と使用例を見ていきましょう。

書式

$ rm [オプション] <削除するファイル名>

使用例

$ rm dairy_report.txt

以上がrmコマンドの書式と使用例です!またrmコマンドにはよく使うオプションが複数存在するので見ていきましょう!

オプション 動作
-r ディレクトリも合わせて削除する
-f ファイルを削除する際の警告文を非表示
-i ファイルの削除前に確認

以上がrmコマンドのオプションとなりますが、-rオプションではディレクトリの中にあるファイルやディレクトリもまとめて削除されてしまうので十分気を付けて作業するようにしましょう!

mvコマンド(move)

mvコマンドは move の略でファイルの移動やファイル名を変更する際に使用するコマンドです。
早速書式と使用例を見ていきましょう。

書式

$ mv [オプション] <移動元> <移動先>

使用例

# ファイルを移動
$ mv dairy_report.txt work/

#ファイル名を変更
$ mv test test2

このように書式での<移動先>の部分にディレクトリを指定するかどうかで動作が変わるのがmvコマンドの特徴です。
また、mvコマンドで既存のファイルを指定してしまうと上書きされてしまいます。これを回避するオプションがあるので紹介します!

オプション 動作
-i 上書きする前に確認

この-iオプションを使うことで上書きが発生する際に確認してくれるようになります。事故防止の為に覚えておきましょう!

cpコマンド(copy)

cpコマンドは copy の略でファイルやディレクトリをコピーするのに使用するコマンドです。
このコマンドはコピーとペーストの役割を同時にこなします。書式と使用例を見ていきましょう。

書式

$ cp [オプション] <コピー元> <コピー先>

使用例

$ cp dairy_report dairy_report_cp

以上が書式と使用例です!コピー先にディレクトリPATHを記載することもできるので柔軟に使っていきましょう!
またこのcpコマンドもオプションがありますので見ていきましょう。

オプション 動作
-i 上書きする前に確認
-r ディレクトリをコピー

以上がcpコマンドでよく使うオプションです!
-iは先程のmvコマンドで使用した通りですが-rはディレクトリごとコピーするというオプションになるのでディレクトリをコピーする際には忘れずに付けるようにしましょう。

lnコマンドは linkの略でWindowsでいうショートカットを作成する際に使用するコマンドになります。
Linuxではこのショートカットに2つの種類があり、それを ハードリンクシンボリックリンク と言います。
書式と使用例に入る前にこの2つの違いを説明しておきます。

ハードリンク

ハードリンクの大まかな特徴は以下通り。
・1つのファイルに複数の名前(あだ名)をつける
・元のファイルを削除しても消えない
・全てのハードリンクがなくなった時に削除される

シンボリックリンク

シンボリックリンクの大まかな特徴は以下の通り。
・リンク先のパス名が書かれた特殊なファイル
・ファイルの実体を削除したり移動するとパスが通らないので参照できなくなる

これがハードリンクとシンボリックリンクの特徴と違いになります。Windowsのショートカットに近いのはシンボリックリンクですね!
実際に使用する際はシンボリックリンクを使用することが多いので主にシンボリックリンクを覚えればとりあえずは大丈夫だと思います。


ということで長くなりましたが書式と使用例を見ていきましょう。

書式

$ ln [オプション] <リンク元ファイル> <リンク名>

使用例

#ハードリンク
$ ln dairy_report dairy_report_hardln

#シンボリックリンク
$ ln -s dairy_report dairy_report_symboliln

この使用例をみてわかるようにオプションに -s をつけるとシンボリックリンクに、何もつけないとハードリンクになる点に注意しましょう!

findコマンド

findコマンドはファイルを検索する際に使用するコマンドです。
findでは使用する検索条件が多いため、通常の書式と使用例を書いた後に条件表、その後に各検索条件を使用した使用例を見ていきたいと思います。

書式

find <検索開始ディレクトリ> <検索条件> <アクション>

使用例

$ find . -name dairy_report.txt -print

この使用例の "." が検索開始ディレクトリ "-name" が検索条件 "-print" が検索アクションとなります。

よく使うオプション表です。

検索条件 動作
-name ファイル名を指定して検索。大文字小文字区別する
-iname ファイル名を指定して検索。大文字小文字区別しない
-type ファイルの種類で検索
-a 複数の検索条件を指定

各検索条件の使用例を上から順に書いていきます。

-name使用例

# lsのパス名展開でも使った * と ? が使えます。
$ find . -name *.txt -print
# ここでは拡張子が.txtのファイルを検索しています。

-iname使用例

# 大文字と小文字を区別しないため全部大文字で書いたりしても大丈夫。
$ find . -iname DAIRY_REPORT.TXT

-type使用例

# -type f は通常ファイル
# -type l はシンボリックリンク
# -type d はディレクトリ
$ find . -type [ファイルtype] -print

[ファイルtype]の部分を変えることでファイルtypeを指定できる。

-a使用例

$ find . -name w??? -a -type d -print
# w から始まる4文字のディレクトリを検索している。

以上がfindコマンドの検索条件と使い方でした。少し長かったですが1つ1つパーツで理解するとあとは組み合わせだけなので頑張りましょう!

chmodコマンド(change mode)

chmodコマンドは change mode の略でファイルやディレクトリのパーミッションを設定、変更する際に使用するコマンドです。
パーミッションという言葉がでてきたと思います。このコマンドを使用するにはこのパーミッションの理解が不可欠となるので軽くパーミッションとは何なのかについて説明しておきます。

パーミッションとは?

パーミッションとはファイルやディレクトリを誰がどの程度操作できるのかという設定です。
ls -lコマンドを使用した際、ファイル情報の一番左に下記の様な情報が書かれていたと思います。 -rwxr-xr-x. これですね。そのファイルの権限を表す羅列となっています。
具体的には左から3文字区切りでファイル所有者、グループ、その他ユーザーとなっています。
先程の羅列を例に説明すると rwx がファイル所有者、r-x がグループ、 r-x がその他ユーザー、です。
パーミッションの区切りが見えたところで次はこの英字が何を表しているか表で見てみましょう。

パーミッション 権限
w 読み取り
r 書き込み
x 実行

このように割り当てられています。これを見たうえで先のファイル所有者権限を見てみると rwx となっているのでこのファイル所有者は全部の権限を有していることになります。
そしてこのパーミッションを変更するコマンドが chmodコマンド というわけです!


はい!ということで本題に戻ってパーミッションを変更するためのchmodコマンドについて書式と使用例を見てみましょう。

書式

$ chmod [ugoa] [+-=] [rwx] <ファイル名>

使用例

$ chmod u-w dairy_report.txt
# dairy_reportのファイル所有者権限 w を消す。

このように記述します。ただこのugoaなどを全部覚えるのはちょっと大変です。
そこでchmodのパーミッション記述方法には数値で指定する方法もありますので見てみましょう!

書式数値指定

$ chmod <8進数の数値> <ファイル名>

使用例

$ chmod 755 dairy_report.txt

これは何をしているのかというと各権限に割り当てられている数字を足して指定しているのです。
文字だけだとわかりにくいと思うので表にして説明します。

パーミッション(権限) 数値
r 4
w 2
x 1

このように各パーミッションに数字が割り当てられています。これを足した数を指定することで設定できます。
使用例を見てみると 755 と指定していました、これは r+w+x=7,r+x=5,r+x=5 = -rwxr-xr-x.これを左から 所有者、グループ、その他 と並べたものです。
この数値指定を使うと簡潔にパーミッションの設定が可能になるので是非覚えましょう!

chownコマンド

chownコマンドはchmodコマンドで出てきたそのファイルの所有者を変更する為のコマンドです。
書式と使用例を見ていきましょう。

書式

$ chown [オプション] <変更ユーザー> <グループ> <ファイル or ディレクトリ>

使用例

$ chown new_user akira dairy_report.txt
# dairy_report.txtの所有者が new_user グループが akira となります。

このコマンドを実行する際にはrootユーザーである必要がある点に注意してください。
また、このままではディレクトリのユーザーを変更した際でもディレクトリの中身の所有ユーザーは変わっていません。
これを解決するためのオプションが以下になります。

オプション 動作
-R ディレクトリ内のディレクトリやファイルを再帰的にたどって変更する

このオプションを使うとディレクトリ内のファイルやディレクトリも1度に変更できるので覚えましょう!

psコマンド(process status)

psコマンドは process status の略で実行中のプロセスを表示するコマンドです。
プロセスとは実行中のコマンドやプログラム1つ1つを指します。
今回は具体例を省略してコマンドを入力後にどのような画面が表示されるのかについて説明していきます。

書式

$ ps [オプション]

以上のコマンドを入力すると PID, TTY, TIME DMD という行の下文字が書いた列が出てくると思います。
この表示されている列が現在実行中のプログラムやコマンドになります。
次はオプションを付けて実行してみましょう。このオプションは - を使わない点に注意です。

オプション 動作
aux 全ユーザのプロセスを詳細情報とともに表示

このオプションをつけて実行するとps単体で実行した時と比べて、プロセスを実行しているユーザーやCPU、メモリの使用率等も表示することが出来ます!
また、次が最後のコマンド紹介になるのですがこのpsコマンドで出てきたPIDが重要になるので覚えておきましょう!

killコマンド(kill process)

killコマンドは kill process の略でプロセスやジョブを終了させる際に使用するコマンドです。
このコマンドを使うと先程psコマンドで確認したPIDを使用してプロセスを終了させることができます。
また、今回はジョブという物について詳しく説明することを省きますが、プロセスをまとめた1つの集まりだと思ってください。
書式と使用例を見ていきましょう。

書式

# ジョブを終了させる場合
$ kill [オプション] %<ジョブID>

# プロセスを終了する場合
$ kill [オプション] <プロセスID(PID)>

使用例

$ kill 29
# PID 29 のプロセスを終了する。

実はkillコマンドは TERM シグナルというものを送信してプロセスを停止しています。 kill 29 と書くのと kill -TERM 29 と書くのは同じ意味です。 この応用で強制的に終了するシグナルというのも用意されています。それが SIGKILL です。 先程の使用例に当てはめて書くと kill -SIGKILL 29 という風になります。
ただし、このSIGKILLは保存状況等に関わらず強制的に終了するものになるので最後の手段として使い、常用は避けましょう。


以上でLinuxのコマンド説明を終了します!!とても長くなりましたがここまでありがとうございました!!!

おわりに

ここまで読んでいただきありがとうございました!
思ったよりも長くなってしまい自分でも驚いています(1万文字越えらしいです)
この記事を書きながら自分でも知識が補完されていってアウトプットは本当に重要だな~と感じています!
またそう遠くないうちになにかしらのアウトプット記事を書くと思いますのでよろしくお願いします。
改めましてここまで読んでいただきありがとうございました!

勉強中!vimの基本操作をまとめてみた!

同じプラモデルでもガンプラ担当、船系担当的な感じです。

https://k-akira.hatenadiary.jp/entry/%E2%96%A0

はじめに

こんにちは!Akira(彰)です!
今回は現在僕が今勉強しているvimの基本操作を自分の理解を深める意味も込めて説明していきたいと思います!
僕もまだ使い始めて日は浅いですが頑張って説明していきますのでどうぞよろしくお願いします!

vimってなに?

vimはマウスを使わずに操作することを前提に作られエディターです!
vimを覚えると、UnixLinux系OSを扱う際に大きく役立つと思います。
実際僕も自宅のLinuxサーバーを触る際にはvimを使用していました!
それでは前置きはこれぐらいにして説明の方に移っていきたいと思います!

基礎コマンド編

vimのモードについて

まず覚えないといけないのはvimにはモードがあるということです。
【NORMALモード】【INSERTモード】【Visualモード】の3モードがあり、これは指定のコマンドを入力することで切り替える事ができます。 各モードの特徴をまとめてみました!下の表をみてみましょう!

モード名 コマンド 特徴
NORMAL ESC カーソルを移動したりする為のモード
INSERT i 文字を挿入する為のモード
VISUAL v 範囲選択を使用する為のモード

これがvimを使う際で必須となるモード3種類なので覚えておきましょう!

では基本となるモードを覚えたところで次は基本となるコマンドを覚えていきましょう。

移動コマンド

前置きでも説明したように、vimはマウスを使わずに操作することを前提に作られています。
マウスを使わずに操作するということはカーソルの移動をコマンドを使って行わなければなりません。
先程と同様にカーソル移動の為のコマンドを表にまとめたので見てみましょう!

コマンド 動作
h 左にカーソルを移動する
j 下にカーソルを移動する
k 上にカーソルを移動する
l 右にカーソルを移動する

このコマンドがカーソルを移動させるための基本操作になります。
カーソル移動は基本となるので、スムーズにカーソル移動できるように練習しましょう!

INSERT(挿入モード)コマンド

INSERTモードに切り替えるにはモード説明の表にある通り、i キーで入ることができますが実は他にも複数INSERTモードに入るコマンドがあります。
今回はその中でも使用頻度の高い物を優先して説明します!下の表を見てください。

コマンド 動作
a カーソルのある位置から1文字進んでINSERTモードに入る
i カーソルのある位置からINSERTモードに入る
o カーソルのある位置から下に空行を挿入してINSERTモードに入る
A カーソルのある行の最後にジャンプしてINSERTモードに入る
I カーソルのある行の最初にジャンプしてINSERTモードに入る
O カーソルの位置から上に空行を挿入してINSERTモードに入る
$ カーソルのある行の最後にNORMALモードでジャンプする
^ カーソルのある行の最初にNORMALモードでジャンプする

以上の表がINSERTモードに入る際に多く使うコマンドです。
表を見てもわかる通り、vimは小文字と大文字で動作が変わるので注意しましょう!

INSERTモードに入る際は状況に合わせて効率のいいコマンドを選ぼう!

文字の削除

文字の削除と聞くと一般的にはバックスペースだと思います。勿論INSERTモードの場合はバックスペースでの削除は可能です。ですがNORMALモードで文字を削除することもできます。 下の表を見てみましょう!

コマンド 動作
x カーソル位置にある文字を削除
dd カーソルのある行を削除
D カーソル位置から右を削除

NORMALモードで文字の削除を行う際には以上のコマンドを使います。
INSERTモードでバックスペースを使うのと違って1コマンドで多くの部分を削除できたりするのが特徴ですね。 実は削除に関するコマンドは他にもあるのですが少し応用の部分になるので後の方でまとめて説明します!

コピー&ペースト

有名なショートカットのコピー&ペーストです。勿論vimにもありますので覚えていきましょう!
下の表にコマンドをまとめました!見てみましょう。

コマンド 動作
yy 1列コピー
p ペースト

これがコピーペーストの基本コマンドです。
少し豆知識にはなりますが、yは(ヤンク)と言いLinux系ではコピーという意味になりますので頭の片隅で覚えておきましょう。
そして、以上のコマンドを実際に使ってみると少し不便に感じると思います。それは「ここからここまで」と選択した範囲でコピーを行う事が多いと思うからです。
それを実現するにはVISUALモードを使用するのですが、これも後でまとめて応用編として説明するので現在はコピー系ではyを使ってペーストではpを使うと覚えてください!

Undo&Redo

先程に続いて有名なショートカットの1つ、Undo(戻る)とRedo(進む)です。
これは比較的簡単なコマンドなので早速表で見ていきましょう!

コマンド 効果
u 操作を1つ戻す
CTRL + r 戻した操作を1つ取り消す

この2つです!普段使っているショートカットとは少し違いますがコマンドと名称が関連しているので覚えやすいですね!

コマンドの応用編

基礎コマンド編で基本的なコマンドを説明してきました。ここからは少し踏み込んだ知っているともっと操作が楽で便利になるコマンド達を紹介していきます!

VISUALモード

基本編のモード説明ででてきたVISUALモードです。このモードは説明したように範囲選択を行う為のモードです!
下の表でどんなことができるのか見てみましょう!

コマンド 動作
v + [移動コマンド] 範囲選択する
v + [移動コマンド] + y 範囲選択した場所をコピー
v + [移動コマンド] + d 範囲選択した場所を削除

このように範囲選択 + コマンドとすることで範囲選択した場所に対してコマンドを使用できます。
以上のコマンドの他にも様々な組み合わせがあるので知りたくなったら調べてみてください!

カーソル移動応用

ここまでやってみて行を大きく移動するときなどにカーソル移動コマンドを連打したりして面倒くさかったと思います。
その面倒を解決するためのコマンドをまとめましたので見てみましょう!

コマンド 動作
w 1単語飛ばしてカーソルを右に移動させる(単語の外)
e 1単語飛ばしてカーソルを右に移動させる(単語の中)
b 1単語飛ばしてカーソルを左に移動させる(単語の外)
gg ページの1番上に移動する
G ページの1番下に移動する
H 表示されている画面の1番上に移動する
M 表示されている画面の真ん中に移動する
L 表示されている画面の1番下に移動する

このコマンド達を使うとグッと効率の上がること間違いなしです!
ただこの中の w, e, b に関しては日本語の文章だと中々実感し辛いと思います…ですが英語やプログラムコード等で使用する際には実感できると思うので覚えておきましょう!

削除コマンド応用

削除の基本編でも書いたように削除コマンドは他にも沢山のコマンドが用意されています。
今回も表を見ていきましょう!

コマンド 動作
c VISUALモードで選択した範囲を削除してINSERTモードで終わる
ci 括弧の中身だけを消す([{}])
ciw カーソル位置にある1単語を消してINSERTモードで終わる
cit htmlタグに囲まれている中身を削除する
dw カーソルの位置から右にある単語を削除する
daw カーソルの位置にある単語を削除する
S カーソル位置の1行を消してINSERTモードに入る

以上が削除コマンドの応用になります。動作事態は同じでも削除後にINSERTモードに入るかどうかの違い等があるので注意しましょう!

文字検索と置換

vimには指定した文字を検索したり、指定した文字を1度に変えたりすることができます。
文字の検索と文字の置換を実現するためのコマンドをまたまた表にまとめたので見ていきましょう!

コマンド 動作
/[文字列] スラッシュ後に入力した文字列を下方向に検索する
?[文字列] クエッション後に入力した文字列を上方向に検索する
g* カーソル位置の単語を含む文字列を下方向に検索する
g# カーソル位置の単語を含む文字列を上方向に検索する
n /や?で検索をした後に次の検索結果に移動する
N /や?で検索をした後に後ろの検索結果に移動する
:s/old/new/g oldで入力した文字列をnewで入力した文字列に置換する(カーソル行)
:%s/old/new/g oldで入力した文字列をnewで入力した文字列に置換する(全体)
:%s/old/new/gc oldで入力した文字列をnewで入力した文字列に置換する(確認しながら)

以上が文字の検索と置換をするためのコマンドです!
置換を行うコマンドはいままでのコマンドと違って入力する文字が多いですがしっかり覚えましょう!

ファイルの保存

ここまでやって来ましたがファイルを保存するためのコマンドが出てきていませんでしたね。
ファイルを保存することができないと今まで入力した文字が全て消えてしまいます…。
それを避けるためのコマンドをまとめました!

コマンド 動作
:w ファイルの保存
:q 実行中のファイルを閉じる
:wq ファイルを保存して閉じる
:w! 強制処理して終了(! が強制終了の意)
ZZ 変更があれば保存して終了
:x 変更があれば保存して終了
:xa 変更があるファイルを保存してすべてのファイルを閉じる

以上で応用編、vimの基本操作の説明終了です!お疲れ様でした!!

最後に

ここまでお疲れ様でした!ここで紹介したコマンドはvimに存在するコマンドのほんの一部でしかないです。
僕もここに書いたコマンド全てを使いこなせているかは怪しいですが慣れると非常に使いやすいエディタなのは確かです!
特に腕をマウスと行き来することがなくなるので疲れる事が全然ありません!
長くなりましたが今回の記事は以上になります!ありがとうございました!!

webの基本技術をまとめてみた!

はじめに

こんにちは!Akira(彰)です!
先日、
『プロになるためのWeb技術入門』――なぜ,あなたはWebシステムを開発できないのか こちらを読みましたので、本日はアウトプットの一環としてwebの基本技術についてまとめてみたいと思います! 解説する内容は、リクエスト・レスポンス・プロトコル・ポート番号・ステートフル・ステートレス・Cookie(クッキー)です。
長くなると思いますがよろしくお願いします!

リクエスト・レスポンス・通信プロトコル

HTTPを例に説明すると、

webブラウザがサーバーに「このページください」とお願い( リクエス )。
↓↓
そのお願い(リクエスト)に対してサーバーが「これがそのページです」とお願いされたページを返す( レスポンス )。

この一連の流れがリクエストとレスポンスであり。やり取りが円滑にできるように定められた通信の仕組みや取り決めが プロトコル です。

ポート番号

先述したプロトコルはHTTP以外にも様々な種類があります。
その中の TCP/IP と呼ばれるプロトコルIPアドレスを元に、宛先のホストへ情報を届けるためのプロトコルです。

郵便物と同じような関係性ですね(郵便番号と住所)。

TCP/IPは情報を送る際に、パケット という細かく分割した単位にして情報を送信し、受け取り側でそれを組み立てて情報を完成させています。

プラモデルを送って組み立てるような感覚でしょうか。

ただ、TCP/IPは受信した情報をどのアプリケーションで処理していいかわかりません。そこで、ポート番号 の出番です。

同じプラモデルでもガンプラ担当、船系担当的な感じです。

ポート番号は0 から 65,535までの数字で表されており、同じポートを複数のアプリケーションが利用することはできません。
また、使われるプロトコルはデフォで使用されるポートを取り決めてあります。このような代表的プロトコルで使用されるポートを ウェル・ノウン・ポート と呼びます。

ステートフル・ステートレス

ステートフルとステートレスは凄く端的に言うと、状態があるかないか(記憶があるような振る舞いをするかどうか)です。
代表的なステートフルプロトコルFTP、ステートレスプロトコルはHTTPです。 それでは人に例えてイメージしてみます。

ステートフルは記憶があるので毎回初対面ではありません。
僕の好みや趣向などを覚えていますしそれに合わせた話をしてくれます。
それに対し、ステートレスは毎回が初対面です。決まった話に決まった言葉しか返してくれません...。

なんだか切ないですね...。

こう見るとステートフルの方がステートレスより優位性があるように見えますね。ですがそういうわけでもないんです。 先述した、ステートフルプロトコルとして代表的だったFTPですがこのFTPにはある問題がありました。それは毎回自己紹介(認証)を必要とする点です。これの何が問題かというと単に面倒というのもあるのですが、本来行いたい処理とは別の余計な処理が必要になってしまうからです。
そしてこれを解決するために生まれたのがステートレスプロトコルのHTTPだったわけです。

誕生順はFTP→HTTPだったんですね。

ですがこれだとHTTPは記憶(状態)がないのであまり優位性がないように思えます。それを解決するために生まれたのがCookie(クッキー)という仕組みです。

Cookie(クッキー)

Cookieとは本来状態を持たないHTTPに状態を持たせるために生まれた仕組みです。
具体的には1回目の認証時にクライアントとサーバー側で同一の合言葉を設定することにより、2回目のアクセス時にその合言葉を知っているかどうかで振る舞いを変えるというものです。

初対面じゃなくなった!

CookieのシステムとしてCookieを設定した同一のサーバーに対してのみCookie(合言葉)を送るので、異なるサーバーにアクセスしたときには他サーバーで設定したCookieが送られることはありません。 だたし、Cookieにどの様な情報を合言葉として含めるかはアプリケーションが自由に決められてしまうので認証に必要なユーザー名やパスワードを入れるのはセキュリティ上の問題があるためSessionと呼ばれるものを使います。

おわりに

ここまで読んでいただきありがとうございました!
本を読んでアウトプットするのは読書感想文以来だったので中々苦戦しましたがなんとかやりきれました。
まだまだ読み辛い点などあると思いますがこれからも精進していきます! 改めましてここまで読んでいただきありがとうございました~!