スッキリわかるSQL入門 第4版 ドリル256問付き! (スッキリわかる入門シリーズ)を読んでの感想&備忘録

良かったこと

SQLの文法を総ざらいできたことが、今回の大きな収穫です。これまでにSQLに関する参考書をいくつか読んでいたため、見覚えのある内容が多くありました。しかし、実際に演習問題に取り組んでみると、「あれ?これは想定と違う…」と感じる場面も少なくありませんでした。そういった問題に取り組むことで、自分の知識の穴を埋めることができたのは非常に良かったです。

そして、何よりも嬉しかったのは、問題数の多さ!多様な問題に取り組むことで、知識がしっかりと定着したと感じています。理論だけでなく、手を動かして問題を解く経験は、学びを深めるうえでとても重要だと実感しました。

難しかったこと

SQLの文法自体は基本的に理解していたため、演習を進めるうえで特に困難に感じることはありませんでした。しかし、巻末の256題の中には、「どう解けばいいんだろう?」と悩んでしまうような難易度の高い問題もいくつかあり、そこで手こずりました。

また、DB設計に関する部分は、実務経験が少ないこともあって、理論的には理解できても実践でどのように応用すべきか迷うことが多かったです。この部分については、今後さらに経験を積むことで克服していきたいと感じています。

読んで学んだこと

1~6章

  • シングルクオーテーションで括らずに記述したリテラルは数値として扱われる。
  • シングルクオーテーションで括ったリテラルは文字情報として扱われる。
  • シングルクオーテーションで括られ、かつ'2024-08-31'のような一定の形式のリテラルは日付情報として扱われる。
  • CHARは固定長。例えばCHAR(10)なら10バイト分領域が確保される。なので3文字だけ入れても残り7文字は空白として埋められる。
  • VARCHARは可変長。入力文字の長さに合わせて領域が確保される。
  • 以上より、CHARは固定長なので、格納するデータの長さが一定の場合(例:郵便番号、社員番号)に使うと良い。VARCHARは氏名や本の名前など、格納データの長さが決まっていないものに対して使うと良い。
  • 社員番号のように社員テーブルの情報を設計する上で自然と出てくる主キーは自然キーという。
  • 購入履歴テーブルのように、テーブル設計時に主キーが登場しない場合に作る主キーは人工キー、または代替キーという。
  • IN句=ANY
  • NOT IN<>ANY
  • OFFSETは先頭から除外する行数を指定し、FETCH NEXTで取得したい行数を指定する。

  • ANYINの違い:

    • 以下の2つは同じ結果を返す。

            SELECT * FROM 家計簿 WHERE 出金額 IN (SELECT 出金額 FROM 家計簿 WHERE 出金額 > 4000);
            SELECT * FROM 家計簿 WHERE 出金額 = ANY (SELECT 出金額 FROM 家計簿 WHERE 出金額 > 4000);
      
    • IN=を内包しており、比較演算子は不要。
    • ANYは比較演算子=, <, >など)の記載が必要。
    • つまり、IN=ANYと同じ意味を持つ。
  • JOINUNIONの違い:

    • UNIONにはUNIONUNION ALLの2種類がある。
      • UNIONは重複を削除して出力するため、UNION ALLより遅くなる(和集合)。
      • UNION ALLは重複をそのまま出力。
      • UNIONは結合するテーブルの列が同じ(列数が同じで、各列のデータ型が一致していれば結合可能)。データ型が一致していれば、異なるカラムでも結合できる。
      • EXCEPTは差集合、INTERSECTは積集合。
    • UNIONは2つのSELECT結果を縦に結合するイメージ。
    • JOINは2つのテーブルを共通のカラムを基に横に繋げるイメージ。
  • CASE演算子には2つの書き方がある

      ```sql
      SELECT 費目, 出金額,
          CASE 費目 WHEN '居住費用' THEN '固定費'
                    WHEN '水道光熱費' THEN '固定費'
                    ELSE '変動費'
          END AS 出費の分類
      FROM 家計簿 WHERE 出金額 > 0;
      ```
    
      ```sql
      SELECT 費目, 入金額,
          CASE WHEN 入金額 < 5000 THEN 'お小遣い'
               WHEN 入金額 < 10000 THEN '一時収入'
               ELSE '想定外の収入です'
          END AS 収入の分類
      FROM 家計簿 WHERE 入金額 > 0;
      ```
    
  • WHEREHAVING

    • HAVINGは集計処理を行った後の結果に対して条件を絞る機能で、WHEREと同じ条件で使用することができる。
  • COALESCE関数:

    • COALESCE関数に渡された引数のうち、最初にNULLでない値を返す。

        SELECT COALESCE('A', 'B', 'C');  -- 結果: A
        SELECT COALESCE(NULL, 'B', 'C');  -- 結果: B
        SELECT COALESCE(NULL, NULL, 'C');  -- 結果: C
      
    • ある列にNULLが格納されている行がある場合、通常のSELECTでは何も表示されない。そのような場合、COALESCE関数を使用することで値を代替表示できる。

        SELECT 日付, 費用, COALESCE(メモ, 'NULLだよ!') AS メモ, 入金額, 出金額
        FROM 家計簿;
      
  • TRUNC関数:

    • 指定桁で切り捨てる。

        SELECT TRUNC(123456, -1);  -- 結果: 123450
        SELECT TRUNC(123456, -2);  -- 結果: 123400
        SELECT TRUNC(123456, -3);  -- 結果: 123000
      
  • ROUND関数:

      - 指定桁で四捨五入する。
    
      ```sql
      SELECT ROUND(123456, -1);  -- 結果: 123460
      SELECT ROUND(123456, -2);  -- 結果: 123500
      SELECT ROUND(123456, -3);  -- 結果: 123000
      ```
    
  • 文字列の最後から指定した文字数を取得する場合、RIGHT関数を使用する。

      ```sql
      SELECT RIGHT('abcdef', 2);  -- 結果: 'ef'
      ```
    
  • LENGTH関数を使って、文字列の長さに基づいて開始位置を計算することも可能。

      ```sql
      SELECT SUBSTRING('abcdef', LENGTH('abcdef') - 2 + 1, 2);  -- 結果: 'ef'
      ```
    

    7章(副問い合わせ)

  • 副問い合わせには3種類ある:
    • 単一の値による問い合わせ、列挙の値の問い合わせ、表形式の問い合わせ。
    • 単一の値の副問い合わせ(1行1列=1セル値を使う):
      SELECT 家計簿集計
          SET 平均 = (SELECT AVG(出金額)
                        FROM 家計簿アーカイブ
                        WHERE 出金額 > 0
                        AND 費目 = '食費')
      WHERE 費目 = '食費';
    
    • 列挙の値の問い合わせ(n行1列の結果を使う):
      SELECT * FROM 家計簿
      WHERE 費目 IN (SELECT 費目 FROM 家計簿);
    
    • 表形式の問い合わせ(n行m列の結果を使う):
      SELECT SUM(SUB.出金額) AS 出金額合計
      FROM (
          SELECT 日付, 費目, 出金額
          FROM 家計簿
          UNION
          SELECT 日付, 費目, 出金額
          FROM 家計簿アーカイブ
          WHERE 日付 >= '2024-01-01'
          AND 日付 <= '2024-01-31'
      ) AS SUB;
    

8章(複数テーブルの結合)

  • テーブルを複数に分ける理由、メリット:
    • 値が変更になった場合、その修正の負荷が大幅に軽減される。外部参照を使えば、別テーブルを更新するだけで済むが、1つのテーブルに全て詰め込むと、該当行全てを更新する必要がある。
    • 1つのテーブルにさまざまな情報を詰め込むと管理が難しくなる。
    • ヒューマンエラーが増える(1行1行更新するのは無謀)。
  • LEFT JOIN:結合される側に合わせる結合の仕方。結合相手に該当行がない場合はNULLで出力する。
  • RIGHT JOIN:結合相手に合わせる結合の仕方。結合される側の行がない場合はNULLで出力する。
  • INNER JOIN:結合する両方のテーブルに存在する行だけを出力。

9章(トランザクション

  • ロック:
    • 一連のSQL操作(例:口座のお金を1万円減らし、マイナス分を引き出す)を行う際に、他のSQL操作が割り込まないようにすること。
    • コミットまたはロールバックによりロックが解除され、その後他のトランザクションが実行される。
  • トランザクション
    • 一連のSQL操作を1つのまとまりとして捉える。全て実行されるか、全て実行されないかの0か100の考え方。コミットまたはロールバックを使用する。
  • トランザクションを使うことで、以下のような不具合を防ぐ:
    • 友人にお金を振り込む際、自分の口座からお金を減らす操作と相手の口座にお金を増やす操作があり、途中で処理が中断すると、自分の口座からはお金が減ったが相手の口座には反映されない、といった問題を防ぐ。
  • トランザクションの指示:

      BEGIN;  -- 以降のSQLを1つのトランザクションとする指示
      INSERT INTO 家計簿アーカイブ
      SELECT * FROM 家計簿 WHERE 日付 <= '2024-01-31';
      DELETE FROM 家計簿 WHERE 日付 <= '2024-01-31';
      COMMIT;  -- ここまでの処理を1つのトランザクションとして確定する
    
  • ダーティーリード:

    • まだコミットされていない変更を他のトランザクションが読み取ってしまうこと。
    • 例:口座から1万円を引き出し(未コミット)残高が3万円になる。次にガス代が引き落とされて残高が2万円になる。その後、最初の引き出しがキャンセルされロールバック、ガス代の引き落としが確定して残高が2万円になるという問題。
  • 反復不能読み取り:
    • SELECT文を2回実行する際に、他のトランザクションが値をUPDATEしてしまい、前後の結果が変わること。
  • ファントムリード:
    • SELECT文を2回実行する際に、他のトランザクションが新たな行をINSERTしてしまい、行数の結果が変わること。
  • デッドロック

10章(テーブルの作成)

  • インデックス:
    • 本の索引のように、インデックスを作成することでデータベース検索が高速化される。
  • ビュー:
    • 繰り返し同じSQLを実行するのは面倒なため、よく使う結果を保存しておく機能。
  • DDL(データ定義言語):
    • CREATE, ALTER, DROP, TRUNCATE
  • DML(データ操作言語):
    • SELECT, INSERT, UPDATE, DELETE
  • TCL(トランザクション制御言語):
    • COMMIT, ROLLBACK, SET TRANSACTION, SAVEPOINT

11章(さまざまな支援機能)

  • 検索を高速化する方法:
    • インデックスを作成する。
    • SQLのインデックスによる高速化が期待できる場合:
      • WHERE句にインデックス列を指定する場合。
      • ORDER BYにインデックス列を指定する場合。
      • JOINの結合条件にインデックス列を指定する場合。

12章(テーブルの設計)

データベース構築のインプットとアウトプット

  • インプット:

    • 要件やお客さんから得た情報。
  • アウトプット:

    • DDL一式(必要十分なテーブルを生成する)。
  • データベース設計の大まかな流れ

    • 要件を聞き、情報を集める。
    • データベース設計作業。
    • DDL作成。
  • 概念設計

    • 管理する情報(データ)は何があるのかを明らかにする
    • 言い換えるとエンティティとその属性を明らかにする作業。
    • 「顧客情報」「入出金情報」「製品」などなど
    • 具体的な作業としてはER図のを作るということ
    • エンティティを明らかにする時のコツ
      • 要件の中から候補となる用語を洗い出す
      • その要件に登場する「人」「もの」「事実」「行為」が何かを考えつつ用語を出す
      • 何かの具体でしかない用語はすてる(利用者があるなら、田中さんは捨てて良い)
      • 計算や集計すれば出るものも捨てる
      • 関連のある用語たちをまとめていく(日付、利用者、金額、内容などであれば入出金行為テーブルだなってかんじ)
      • 大事なのは正解はないという前提を忘れないこと。お互いに自分なりの正解を見せ合い、意見交換し、良いものにしてく
  • 論理設計

    • 概念設計で作ったエンティティとその関係をDBに登録して使えるように修正していく作業
      • 流れとしては、多対多の分解→キーの整理→正規化の流れ
      • 多対多の分解
        • RDBは多対多を上手く扱えないのであればテーブルを分解する
        • 1対多にする
      • キーの整理
        • 主キー、外部キーはどの列になるか整理する。主キーがなければ人工キーを作成する
      • 正規化
        • 正規化によってテーブルが適切に分割された状態を正規形という。
        • 第1~第5正規形まで存在する
        • 非正規系
          • セルの結合がある、1セルに複数行ある
          • つまり繰り返しの列がある状態
        • 第一正規系
          • テーブルの全行の全列に1つの値が入っている。
          • 主キー以外の全列が、主キーに従属していること
        • 第二正規系
          • 複合主キーがある場合は複合主キー以外の列が複合主キーに綺麗に従属している
          • 複合主キーの片方に従属している非主キーは存在しないようにする
        • 第三正規系
          • 間接的に主キーの従属している列を排除する
  • 物理設計

    • 最終的なテーブル名、列名、データ型、制約、デフォルト値、インデックスを決定し、DBにテーブルを作成する。

8月学習振り返り

はじめに

HappinessChainに入会し、早くも2ヶ月が経過しました。 年々、時間が過ぎるスピードが増している気がします。気づけば今年もあと4ヶ月…。気づけばあっという間に年末になりそうです(笑)。 それでは、今回は8月の学習を振り返っていきます!

今月の学習時間(期間 : 8/1~8/31)

8月中の学習時間はトータルで 119時間 でした。   今月に関しても、休日には8〜10時間、平日には3時間の学習を目標としており、達成できたかと思います。 お盆休みの帰省中は「死ぬほど勉強するぞ!」と意気込んでいましたが、現実は甘くなかったです…。朝からお墓掃除に駆り出され、昼間は旧実家の草刈り、そして夜には親戚とお出かけ。特に草刈りはまさに戦場、汗だくになってヘトヘト…。気づけば勉強時間どころか体力ゼロに(笑)。それでもなんとか学習時間は増え、先月より20時間も多く勉強できたのは自分でも驚きです。 今後も学習時間を更新していけるよう頑張ります。

進捗状況

8月中に完了した課題は以下の通りです。

  • Docker
  • Python
  • SQL(オレンジ本9割ほどまで)

Docker

お盆休みは実家やカフェではまるで「Docker合宿」かのようにDocker漬けの日々でした。 Dockerは以前から気になっていましたが、業務で触れる機会がなく放置していました。 今回、HappinessChainのコースで学べたのは良かったです。 Dockerは何となく難しいという印象を持っていましたが、コース内のUdemy動画が非常にわかりやすく、気づいたら結構ハマっていました。思ったよりスムーズに課題を進められたので良かったです。 また、Dockerはただの昨今の流行りではなく、エンジニアにとって使って当たり前のものである事実を知れたのは大きかったと思います。

Python

Pythonは、一度簡単なファイル操作アプリを作った程度で、本格的に文法を学んだことはありませんでした。 業務では主にJavaを扱っていたため、オブジェクト指向については理解しているつもりでしたが、Python課題を通じて多くのことを学び、良い復習にもなりました(汗)。

SQL

SQLについては、基本的な文法(SELECT、UPDATE、INSERT、DELETEなど)を知っている程度で、入門書を軽く読んだことがあるぐらいでした。 「スッキリわかるSQL入門」を使ってガッツリ学び直すと、「あれ?これもあったっけ?」と感じることが何度も。本書は問題数が多く、ひたすら解いては回答を確認する作業を繰り返しています。 今(9/7時点)では巻末の9割まで進んでいるので、9月上旬には全て終わらせてスッキリしたいと思います!

次月の目標

来月も引き続き以下の学習時間を目標にします。

  • 平日 : 3〜4時間/日
  • 休日 : 10時間/日

また、以下コースを完了目標にします

終わりに

最近はプログラミングで脳がオーバーヒートするたびにサウナに駆け込んでいます。 帰省中ももちろんオーバーヒートしたので、どこかないか探したところ、ありました。 その名も「スパ・アルプス」 どうやらサウナ愛好家の中ではサウナの聖地と呼ばれるほど有名で、なんと「日本の水風呂3選(日本の3大水風呂)」の1つとも言われているようです。 レビューを見てもここだけ頭3つ抜けて評価が高かったです。 実際に行ってみると、最高でした。。。 プログラミングとサウナの相性は抜群です。皆さんも機会があれば是非ぜひ行ってみてください。

スパアルプス

年末帰省した際にもう一度行こうと思います! カプセルホテルでもあるらしいので泊まってみたいですね。 ではまた来月!!!


Pythonのsysモジュールを使ったカレンダーの実装

はじめに

この記事では、sysモジュールを活用して、カスタムカレンダーを実装する方法をご紹介します。このカレンダーは、現在の月や指定された月のカレンダーを表示することができ、コマンドラインから操作できる仕様になっています。

sysモジュールとは?

sysモジュールは、Pythonインタプリタや実行環境に関する情報を扱うためのライブラリです。その中でも特に役立つのがsys.argvで、これはコマンド実行時に渡された引数を含むリストです。sys.argv[0]は実行したファイル名を指し、それ以降の要素が渡された引数になります。

カレンダーの実装

  1. 現在月のカレンダー表示: デフォルトでは、実行時の月のカレンダーを表示します。
  2. 指定月のカレンダー表示: -mオプションを使用して、特定の月のカレンダーを表示します。

それでは、コードを見てみましょう。

import sys
import datetime
from datetime import date, timedelta

class Color:
    BLACK          = '\033[30m'#(文字)黒
    BG_WHITE       = '\033[47m'#(背景)白
    RESET          = '\033[0m'#全てリセット

weeks = [[] for _ in range(6)]  # 6週間分のリストを用意
week_list=["月","火","水","木","金","土","日"]

def count_by_week(first_day, end_day, d, now_day):
    """
    カレンダー情報を生成する。
    """
    day = 1
    for i in range(6*7):
        if i < first_day.weekday():
            weeks[i // 7].append("  ")
            continue
        elif day <= end_day.day:
            if day == now_day:
                weeks[i // 7].append(f'{Color.BLACK}{Color.BG_WHITE}{day:2}{Color.RESET}')
            else:
                weeks[i // 7].append(f"{day:2}")
            day += 1
            continue
        else:
            weeks[i // 7].append("  ")

    print("     {}月 {}".format(d.month,d.year))
    print(' '.join(week_list))
    for week in weeks:
        print(" ".join(week))

def create_calender():
    """
    現在月のカレンダーを表示する。
    """
    # 現在月の情報取得
    d = datetime.date.today()
    first_day = date(d.year, d.month, 1)
    end_day = date(d.year, d.month + 1, 1) - timedelta(days = 1)
    now_day = d.day
    count_by_week(first_day, end_day, d, now_day)


def create_calender_option():
    """
    指定月のカレンダーを表示する。
    """
    try:
        # 指定月の値取得
        month_index = sys.argv.index("-m") + 1
        month = int(sys.argv[month_index])
        if month < 0 or month > 12:
            raise ValueError

        # 指定月の初日と最終日取得
        d = datetime.date(2024, month, 10)
        first_day = date(d.year, d.month, 1)
        if d.month == 12:
            end_day = date(d.year + 1, 1, 1) - timedelta(days = 1)
        else:
            end_day = date(d.year, d.month + 1, 1) - timedelta(days = 1)

        count_by_week(first_day, end_day, d, None)
    except ValueError:
        print(f"{month} is neither a month number (1..12) nor a name")

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == '-m':
        if len(sys.argv) < 3:
            sys.exit("end program")
        create_calender_option()
    else:
        create_calender()

各部分の説明

  • クラスColor: このクラスは、カレンダー出力時の色付けに使います。現在の日付を背景色付きで表示するために使います。

  • count_by_week関数: この関数は、月ごとのカレンダー情報を生成します。週ごとに分割されたリストに日付を挿入し、月の終わりまで表示します。現在の日付を強調表示する機能も含まれています。

  • create_calender関数: この関数は、現在の月のカレンダーを表示します。datetimeモジュールを使って現在の月の初日と最終日を取得し、それをcount_by_weekに渡して処理します。

  • create_calender_option関数: この関数は、ユーザーが指定した月のカレンダーを表示します。コマンドラインから取得した月の値を基に、指定月の初日と最終日を計算し、同様にcount_by_weekに渡します。

実行方法

このスクリプトを実行する際には、以下のようにコマンドラインから実行します。

  • 現在月のカレンダーを表示:
python calender.py
  • 指定月のカレンダーを表示:
python calender.py -m 5

実行結果

終わりに

ここまでお読みいただきありがとうございました! このカレンダーの例を通して、コマンドライン引数をどのように処理するか、そしてどのようにして動的にカレンダーを生成するかを理解していただけたかと思います。 もっと良い実装方法がありましたら、コメントいただけると幸いです。 それでは!

DockerでRails開発環境を構築する手順

はじめに

この記事では、Dockerを使用してRails開発環境を構築する具体的な手順を紹介します。PostgreSQLをデータベースとして使用し、RailsアプリケーションをDockerコンテナで動作させる方法を説明します。

目次

  1. リポジトリの準備
  2. DockerfileとDocker Composeの設定
  3. データベース設定の変更
  4. コンテナの起動とデータベースの設定
  5. アプリケーションの確認
  6. エラーのトラブルシューティング
  7. READMEとブログ記事の作成

1. リポジトリの準備

リポジトリの作成

リポジトリのクローン

2. Dockerfileとdocker-composeの設定

必要なファイルの作成

  • 以下のファイルをプロジェクトのルートディレクトリに作成します。
    • Dockerfile
    • Dockerfile.lock
    • docker-compose.yml

Dockerfileの設定

  • Dockerfileをエディタで開き、以下の内容を記載します。
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs
WORKDIR /rails_docker
COPY Gemfile Gemfile.lock /rails_docker/
RUN bundle install

Docker Composeの設定

  • docker-compose.ymlをエディタで開き、以下の内容を記載します。
version: '3'

volumes:
  db-data:

services:
  db:
    image: postgres:12
    platform: linux/amd64
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
    volumes:
      - db-data:/var/lib/postgres/data

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    platform: linux/amd64
    environment:
      - DATABASE_PASSWORD=postgres
    volumes:
      - .:/rails_docker
    ports:
      - "3000:3000"
    depends_on:
      - db
    links:
      - db
    tty: true
    stdin_open: true

3. データベース設定の変更

database.yml の修正

  • クローンしたプロジェクトの config/database.yml を開き、PostgreSQLを使うように修正します。
  • (同ファイル内のdefaultセクション部分を修正します)
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  port: 5432
  password: <%=ENV.fetch("DATABASE_PASSWORD") %>
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

4. コンテナの起動とデータベースの設定

Docker Composeのインストール

  • Docker Composeがインストールされていない場合は、インストールを行います。

コンテナ内での作業

  • docker-compose exec web bash でWebコンテナ内に入ります。
  • データベースを作成するために rails db:create を実行します。
  • Scaffoldを使用してテーブルを作成します。
    • コマンド: rails g scaffold product name:string price:integer vendor:string
  • rails db:migrate を実行してデータベースをマイグレーションします。

5. アプリケーションの確認

コンテナの起動

  • docker-compose up -d コマンドを実行してコンテナをデタッチモードで起動します。

アプリケーションの動作確認

  • http://localhost:3000 にブラウザでアクセスし、アプリケーションが正常に動作しているか確認します。

終わりに

いかがだったでしょうか。dockerはとても便利ですね! 私はまだまだdocker初学者ですが、これからもっと理解を深めていけたらと思います。

7月の学習振り返り

月報 (2024年07月)

はじめに

今月からHappinessChainに入会し、早くも1ヶ月が経過しました。
日々の過ごし方が大きく変化した7月学習の振り返りになります。

今月の学習時間(期間 : 7/6~7/31)

7月中の学習時間はトータルで 102時間 でした。
休日には8〜10時間、平日には3時間の学習を目標としていたため、100時間の学習時間を確保できました。

進捗状況

7月中に完了したタスクは以下の通りです。

  • エンジニアとしての基礎を学ぶ
  • Web技術の基本を学ぶ
  • テキストエディタの使い方を学ぶ
  • Vimの使い方を習得する
  • Linuxの基本操作を学ぶ
  • Git & GitHubの使い方を学ぶ
  • HTML/CSSの基本を学ぶ
  • Web開発の基礎を学ぶ

良かったところ

HTML&CSS(特にCSS)に関して、今までは必要に応じて調べながら実装していたため知識が散乱していました。しかし、今回Udemyで体系的にHTML&CSSを学んだことで、知識が整理されたと感じています。模写コーディングを通じて、簡単なサイトであれば主要な記述方法を活かしてスムーズに実装できるようになりました。実際の業務におけるタグの使い方など、新たに学ぶことも多く、大変有意義な時間でした。

また、生活習慣がかなり改善された点も大変良かったと感じています。以前は、休日には昼過ぎまで寝て、平日は出勤時間ギリギリまで寝てしまう生活でしたが、この1ヶ月間、休日は遅くとも8時までには起床し、平日朝も0.5〜1時間は学習できるようになりました。「学習時間ノルマ月100時間」という目標や「毎週土曜朝の進捗報告会」が良い影響を与えていると感じています。

さらに、生成AIを使わずにトラブルシューティングや調査を行う習慣がついた点も良かったです。HappinessChain入会前は、個人開発で頻繁にChatGPTに質問し、時には何も考えずエラー文を投げることもありました。特にインフラ周り(本番環境へのデプロイやCI/CDなど)の設定を行う際にChatGPTを多用しすぎて、利用制限に達したこともありました(笑)。今思えば、ChatGPTに頼りすぎていたことで、「自身の頭で問題を要素分解し解く力」や「検索スキル」が弱くなっていたと感じます。。。こういった経験から、経験が少ない内は時間がかかったとしても自身で調べ1つ1つ解決していくやり方が良いなと感じています。

悪かったところ

  • 就寝前に携帯をいじる癖がついており、睡眠の質が低下している

改善点

  • スマホロッキングコンテナを使う

次月の目標

来月も引き続き以下の学習時間を目標にします。

  • 平日 : 3〜4時間/日
  • 休日 : 10時間/日

終わりに

今月も目標に向かってガンガン進もうと思います! 余談ですが最近15インチのMacを新調しました。画面がドデカいので出先の作業も大変捗り感動しています。 では、また来月。


初心者向けガイド:GitHub Pagesの使い方

GitHub Pagesとは?

GitHub Pagesは、GitHubが提供するサイトホスティングサービスです。githubリポジトリのソースを、githubのサイトをポチポチ操作するだけで、直接ウェブサイトとして全世界に公開できます。ポートフォリオやブログなどの静的サイトを簡単に公開するのに適しています。

前提条件

  • GitHubアカウントを持っていること
  • 基本的なHTMLやMarkdownの知識(あればなお良い)

ステップ1:リポジトリの作成

  1. GitHubにログインし、右上の「+」アイコンをクリックして「New repository」を選択します。
  2. リポジトリ名を入力します(例:my-resume-site)。
  3. 「Public」を選択し、「Create repository」をクリックします。

ステップ2:プロジェクトファイルの準備

  1. リポジトリを作成した後、ローカル環境にクローンします。
  2. リポジトリ内にindex.htmlファイルを作成します。このファイルがウェブサイトのホームページになります。

ステップ3:ファイルをコミットしてプッシュ

  1. ファイルを追加、コミット、そしてGitHubにプッシュします
cd my-resume-site
git add index.html
git commit -m "Initial commit"
git push origin main

ステップ4:GitHub Pagesを有効にする

  1. GitHubリポジトリのページに戻り、「Settings」をクリックします。
  2. 「Pages」セクションを見つけ、「Branch」をmainに設定し、「Save」をクリックします。
  3. 1分程で同画面にURLが表示されます。
  4. URLにアクセスして、サイトが正しく表示されることを確認しましょう。

まとめ

これで、GitHub Pagesを使ったサイトの公開完了です。とても簡単ですね!

Linuxの基本コマンドと操作メモ

はじめに

こんにちは!今回はLinuxの基本コマンドと操作を学習したので共有します。 初心者の方はぜひ参考にしてくださると幸いです。

移動系🚶

  • Ctrl + f: 1文字次へ移動
  • Ctrl + b: 1文字前へ移動
  • Ctrl + a: 行の先頭へ移動
  • Ctrl + e: 行の最後へ移動
  • Esc + f: 1単語次へ移動
  • Esc + b: 1単語前へ移動

削除系✂

  • Ctrl + h: カーソルの左を1文字削除
  • Ctrl + d: カーソルの文字を1文字削除
  • Ctrl + w: カーソル前の単語を削除
  • Ctrl + u: カーソルの位置から行頭まで削除
  • Ctrl + k: カーソルの位置から行末まで削除
  • Ctrl + y: 最後に削除した内容を挿入

その他の便利なコマンド 🛠️

  • Ctrl + c: 実行中のコマンドを強制終了
  • Ctrl + l: 画面の消去(コマンド履歴のクリア)
  • Ctrl + s: 画面表示のロック
  • Ctrl + q: 画面表示のロック解除
  • Tab: コマンドやパスの補完
  • Ctrl + p または : 1つ前に打ったコマンドを表示
  • Ctrl + n または : 1つ後のコマンド履歴を表示
  • Ctrl + r: コマンド履歴の検索
    • Ctrl + r: 検索結果をたどる
    • Enter: 現在の検索結果を実行

Linuxの基礎コマンドを理解する 📖

ディレクトリの移動 📂

現在のディレクトリ確認 🗺️

ディレクトリやファイルの一覧表示 📋

  • ls: ファイルやディレクトリの一覧を表示
    • 例: ls /home/
    • ワイルドカード使用例: ls *.html
    • よく使うオプション:
      • ls -l: 詳細表示
      • ls -a: 隠しファイルも表示
      • ls -F: ファイル種別を表示
      • ls -al: 隠しファイルも含めて詳細表示

ディレクトリの作成と削除 🗂️

  • mkdir [directory]: ディレクトリの作成
    • 例: mkdir code
    • パスをまとめて生成: mkdir -p test/2024/07
  • rmdir [directory]: 空のディレクトリを削除

ファイル操作 📄

  • cat [file]: ファイルの中身を表示
    • 例: cat /etc/hostname
    • -nオプションで行番号を表示
    • 複数ファイルの表示: cat file1 file2
  • less [file]: 長いファイルの中身をページ単位で表示
    • スペース: 1画面分下へ移動
    • b: 1画面分上へ移動
    • j: 1行下へ移動
    • k: 1行上へ移動
    • q: 終了
  • tail [file]: ファイルの最後の部分を表示
  • touch [file]: ファイルを作成
    • 例: touch test.txt
  • rm [file]: ファイルの削除
    • ファイル削除: rm test.txt
    • ディレクトリも削除: rm -r [directory]
    • 警告文なしで削除: rm -f file
    • 削除前に確認: rm -i file
  • mv [source] [destination]: ファイルの移動や名前の変更
    • ファイル名を変更: mv file1 file2
    • ファイルの場所を移動: mv file1 dir/
  • cp [source] [destination]: ファイルやディレクトリをコピー
    • ファイルをコピー: cp file new_file
    • ディレクトリをコピー: cp -r dir new_dir
  • ln [source] [link_name]: リンクを作成

ファイル検索 🔍

  • find [path] -name [pattern] -print: ファイルを検索

パーミッションと所有権 🔐

  • chmod [permissions] [file]: ファイルやディレクトリのパーミッションを変更
    • chmod [ugoa][+-=][rwx] <ファイル名>
      • ugoa: 誰に対して(ファイル所有者、グループ、その他のユーザ、全ユーザ)
      • +-=: どうするか(権限削除、権限追加、指定した権限にする)
      • rwx: 何をするか(読み取り、書き込み、実行)
    • 例: chmod u+rwx file

パーミッションの例

  • ls -l /bin/less -rwxr-xr-x. 1 root root 158240 7月 31 2015 /bin/less

    • [-rwxr-xr-x]部分の意味
    • 例: -rwxr-xr-x
      • オーナー: 読み取り、書き込み、実行 (rwx)
      • グループ: 読み取り、実行 (r-x)
      • その他: 読み取り、実行 (r-x)
      • r: 読み取り
      • w: 書き込み
      • x: 実行
    • root root: 一つ目がオーナー、二つ目がグループ

所有権の変更

  • chown [owner]:[group] [file]: ファイルやディレクトリの所有権を変更
  • 例: chown root:root file

プロセス管理 🚀

  • ps: 実行中のプロセスを表示
    • 例: ps aux
    • 出力例: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 168028 13032 ? Ss 20:52 0:01 /sbin/init splash
    • USER: プロセスを実行したユーザー
    • PID: プロセスID
    • %CPU: CPU使用率
    • %MEM: メモリ使用率
  • kill [PID]: プロセスを終了

ヘルプとマニュアル 📚

  • command --help: コマンドのヘルプメッセージを表示
  • man [command]: コマンドのマニュアルを表示
  • man -k [keyword]: キーワードでマニュアルを検索

おわりに 🌈

今回学習したLinuxコマンドをまとめてみました。これからより知識を深めるために、実際にコマンドを試してみたり、ドキュメント等参照していこうと思います。 良きLinuxライフを!