派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

第7話 間違えて reset しちゃった?git reflogで元どおり【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20191223102837j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第6話 では、特定の時点までファイルを巻き戻す「リセット」を学びました。

・特定の時点までファイルを巻き戻す

$ git reset

今回の第7話では、間違えてリセットしてしまっても元に戻せる「リフログ」を学びます。一体どのようなコマンドなのでしょうか。このマンガを通して、わかばちゃんと一緒に知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

間違えて操作しても、reflog(リフログ)で元どおり!

f:id:itstaffing:20191223102840j:plain
f:id:itstaffing:20191223102844j:plain
f:id:itstaffing:20191223102847j:plain


リフログ(reflog)とは?

リフログとは、HEADの動き(自分自身が行った行動)を履歴にしたものです。具体的には、次のものが履歴として残ります。

・新規コミット(コミット、マージ、プル、リバートなど)
・ブランチの切り替え(チェックアウト)
・履歴の書き換え(リセット、リベースなど)

f:id:itstaffing:20190617145541j:plain
HEADについては前回の 第6話 で説明したとおりだな。
f:id:itstaffing:20190617145538j:plain
簡単に言えば「自分の操作履歴を見ることができる」ってことね。
f:id:itstaffing:20190617145541j:plain
そのとおり。リフログの手順としては『1. 操作履歴を見る → 2. 戻りたい地点の数字を指定してリセットする』のだ。
1. 操作履歴を見る

では、実践してみましょう。練習用リポジトリの中で、リフログコマンドを実行します。

$ git reflog

操作履歴一覧が表示されます。上に表示されているものほど新しい履歴です。

02f11b7 HEAD@{0}: reset: moving to 02f11b7
0488e28 HEAD@{1}: merge develop: Merge made by the 'recursive' strategy.
6978c20 HEAD@{2}: checkout: moving from develop to master
32275f0 (develop) HEAD@{3}: commit: 制作事例を追加
0e95561 HEAD@{4}: checkout: moving from master to develop
6978c20 HEAD@{5}: commit: 3回目のコミット
0e95561 HEAD@{6}: commit: 2回目のコミット
02f11b7 HEAD@{7}: commit (initial): はじめてのコミット
 
f:id:itstaffing:20190617145538j:plain
ふんふん。で、私はHEAD@{1}に戻りたいんだよね。
2. 戻りたい地点の数字を指定してリセットする

「resetの操作をする前(1つ前)に戻したい」といった場合、コマンドは次のとおりです。

$ git reset --hard HEAD@{1}

間違えて実行してしまったコマンドの1つ前まで戻れました!

f:id:itstaffing:20190617145538j:plain
リフログって便利だなー! Gitって、こんなにも融通がきくツールなんだね。
f:id:itstaffing:20190617145541j:plain
私も、このコマンドを初めて知ったときは感動したものだ。リフログは、マージ前のブランチを間違えて削除してしまったときにも使えるぞ。覚えておいて損はないコマンドだ。

まとめ

これで、間違えて操作してしまっても、あわてず元に戻すことができますね。

・HEAD の移動履歴一覧を表示

$ git reflog

・特定の時点までファイルを巻き戻す(nには戻りたい地点の数字を入力)

$ git reset --hard HEAD@{n}

Gitにはまだまだたくさんのコマンドがあります。
次回は、2019年夏にリリースされた新コマンド「switch」と 「restore」 について学んでいきましょう。

▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」

【イベントレポート】初心者歓迎!AWS認定ソリューションアーキテクトを目指すために

この記事では、2019年10月2日に開催したイベント「初心者歓迎!AWS認定ソリューションアーキテクトを目指すために」をレポートします。

今、注目されているAWS認定試験。そのなかでも最も人気のあるAWS認定ソリューションアーキテクトを取得するためのノウハウについて、書籍『AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト』の著者である、佐々木拓郎さんを講師にお迎えし、初心者にも分かりやすく解説していただきました。

■今回のイベントのポイント
・資格を取得すると、AWSに関する知識やスキルが客観的に証明される
・AWS認定試験は11種類あり、アソシエイトを持っていれば評価が高い
・問題を解く際の考え方のポイントは、問題文を段落ごとに読んでいく

【講師プロフィール】
佐々木 拓郎さん
NRIネットコム クラウド事業推進部 部長。専門はクラウドに関するコンサルティングから開発まで。クラウドの対象範囲拡大にともない、AIやIoTなど様々な領域に進出し、モバイルなどのフロントエンドの開発も行う。AWSより2019 APN AWS Top Engineersに選定された。主な著書として『クラウドエンジニア養成読本(技術評論社刊)、『AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト』『Amazon Web Services パターン別構築・運用ガイド』『Amazon Web Services 業務システム設計・移行ガイド』『Rubyによるクローラー開発技法』(以上4冊はSBクリエイティブ刊)などがある。

AWS認定資格の概要

今回のイベントのゴールは次のようなもの。AWS認定試験を受けるための心構えかもしれません。

・AWS認定資格を取るための道筋を知ってもらう
・AWSの設計の考え方を理解してもらう
・家に帰ったら、AWSトレーニングポータルのアカウントを作ってもらう

AWS認定試験は11種類あり、大きく分けると役割別・レベル別認定と専門知識認定があるそうです。

f:id:itstaffing:20191216140037j:plain
▲役割やレベルに応じてファウンデーショナル(Foundational)、アソシエイト(Associate)、プロフェッショナル(Professional、Specialty)に大別されている。
引用 https://aws.amazon.com/jp/certification/

佐々木さんによると、エンジニアであれば最初はアソシエイトにチャレンジするのがお勧めで「現場にアソシエイトを持っている人は、なかなかいない。持っている人がプロジェクトにいるとラッキーだなと感じる」といいます。

では、アソシエイトに区分されるソリューションアーキテクト(SolutionArchitect)、デベロッパー(Developer)、SysOpsアドミニストレータ―(SysOpsAdministrator)のどれから取るかという点については「結論からいうと人それぞれ」だそうです。

f:id:itstaffing:20191216140040j:plain
▲経験が無いのであれば、ソリューションアーキテクトがお勧め。バランス良くAWSの総合的な知識がつく

佐々木さんがお勧めするソリューションアーキテクトは、どのような内容なのでしょう。

「AWSにはどういうサービスがあって、それをどう組み合わせていくのか、といった設計能力が問われます。『AWSの定めるアーキテクチャ設計原則』というものがあり、他の方法で作れる場合でも、この設計原則に沿っていないとダメなのです」

状況の変化に応じて、AWSの構成を対応させられるかどうかが試されるそうです。参考に、ソリューションアーキテクトの出題の割合を紹介してくださいました。

f:id:itstaffing:20191216140021j:plain
▲図の上の3つで80%超えているので、これらをしっかり学ばないと合格できない。配点は不明とのこと

効率的な学習のためのチュートリアル

では、具体的にどのようなカタチで勉強をしていけば良いのでしょうか。ここでは学習計画の立て方や、教材を紹介してくださいました。

f:id:itstaffing:20191216140023j:plain
▲ハンズオンで対象サービスを触ってみることは非常に重要。知識のみでも合格は目指せるが、最終目的はAWSを使って仕事をすることなので触ってみるべきとのこと
引用 https://aws.amazon.com/jp/getting-started/tutorials/

教材としては、BlackBeltシリーズに代表される書籍をはじめ、オンラインセミナーやハンズオン、公式模試もあるそうです。

また、試験対策書籍はまとまっているので体系的に学べるものの、それだけでは足りないそうです。BlackBeltオンラインセミナーを見るなどして補完することが必要で、加えて、解説書籍を併用するのも良いそうです。

試験で問われるサービスカットとアーキテクチャカット

試験では、サービスカットとアーキテクチャカットの両面を押さえておく必要があります。サービスカットは「コンピューティングってどういうもの?」「ストレージってどういうもの?」といった知識で、アーキテクチャカットは「回復性の高いアーキテクチャはどのサービス?」「パフォーマンスに優れたアーキテクチャはどのサービス?」といった知識です。

AWSの公式ドキュメントは日本語訳が読みづらい面もありますが、サービスごとのFAQは重要なことがまとまっているので最低限読んでおくことをお勧めされました。

そして、AWSの基本的なサービスについて、大まかな紹介がありました。こちらは、サービスカットで問われる知識ですね。

f:id:itstaffing:20191216140026j:plain
▲コンピューティング、ストレージ、ネットワーク、DBの各種サービスの概要が紹介された

ストレージでは、EBSとS3の使い分けがAWSの設計では重要で、可用性や耐久性が求められる場合はS3を選ぶのがセオリーだそうです。AWSのDBサービスは多数あるそうですが、アーキテクチャ上で特に重要なのが、リレーショナルデータベースである「RDS」、NoSQL DBの「DynamoDB」、インラインキャッシュDBの「ElastiCache」の3つです。

次にアーキテクチャカットです。アーキテクチャについては、下記に示す「AWS Well-Architected」の考え方(5つの柱)に沿って解答するのが基本だそうです。

f:id:itstaffing:20191216140029j:plain
▲AWSが推奨する「AWS Well-Architected」の考え方

更なるステップアップを目指して

ソリューションアーキテクトを取得したら、次に何を目指すかというお話がありました。

f:id:itstaffing:20191216140033j:plain
▲佐々木さんが考えるお勧めの取得パターン。
引用 https://aws.amazon.com/jp/certification/

佐々木さんのお勧めは、アソシエイトの残りの2種類を取ることだそうです。なぜなら「プロフェッショナルは結構難しいから」とのこと。各分野の知識がある方なら、むしろ、プロフェッショナルよりもスペシャリティの方が取りやすいかもしれないと最後にお話しされました。

今回のイベントに参加された方からは、「公式ページが読みづらく苦労していたが、今日の説明は分かりやすかった」「資格取得のためにとても役立った」などの声をいただきました。株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

【イベントレポート】初心者からCCNA合格を目指す!ネットワークの全体像を理解しよう

この記事では、2019年9月13日に開催したイベント「初心者からCCNA合格を目指す!ネットワークの全体像を理解しよう」をレポートします。


今回のイベントでは、書籍『シスコ技術者認定教科書 図解でスッキリ! パッとわかるCCNAの授業』の著者である林口裕志さんに、CCNA受験に必要なネットワークの基礎知識のポイントを解説していただきました。

■今回のイベントのポイント
・IPアドレスから、8項目の情報が得られる
・サブネットマスクが変われば、ネットワーク部とホスト部の境界の位置も変わる
・実際の運用が始まってからネットワーク内のIPアドレスが足りなくならないよう、IPアドレスの割り当ては細心の注意を!

【講師プロフィール】
林口 裕志さん
ITスクール「システムアーキテクチュアナレッジ」で、主にCCNAやCCNPといったネットワーク系の担当講師を務める。数多くのたとえ話や実際の業務での体験談を織り交ぜながら進める講義は受講する生徒にも好評を得ており、IT業界未経験・PCスキルがゼロに等しい生徒であっても、その分かりやすい説明でCCNA合格を最短距離で導いている。CCNAの講義だけでも年間100名以上の生徒を担当し、その合格率は9割以上を誇る。

IPアドレスの構造を確認しておこう

TCP/IPネットワークを構成している大切な要素にIPアドレスがあります。今回のイベントのポイントは、IPアドレスの記述から得られる情報を、きちんと取得できているか?というお話から。

林口さんが冒頭で問いかけたのが、たとえば次のようなIPアドレスの表記から、どのような情報を読み取れるかということでした。


192.168.1.1/24

この表記からは、次のような8項目の情報が読み取れるといいます。

 
f:id:itstaffing:20191210125342j:plain
▲IPアドレスの1行から、これだけの情報が読み取れるそうです。一体どうやって?

これらの情報をどのようにして読み取るのか、詳しく解説してくださいました。

そもそもIPアドレスは32ビットの2進数から構成されており、通常は、それを8ビット(オクテッド)に分け、4つのオクテッドを10進数に変換して表記しているそうです。

f:id:itstaffing:20191210125344j:plain
▲2進数の0と1が32個並んでいるだけでは読みづらいため、8ビットずつの4つの塊をドットで区切り、10進数で表記している

2進数から10進数への変換のコツ

ここで重要になるのが2進数という考え方。0と1だけで数値を表記するこの記法が難しく、どうしても覚えらえません。そこで林口さんが紹介してくださったのが、2進数から10進数への変換のコツです。

f:id:itstaffing:20191210125347j:plain
▲末尾から1桁目は1が、2桁目以降は下の桁から順に2、4、8、16、32、64、128が「ある(1)」「ない(0)」を示している

これを理解すると、10進数から2進数への変換は、逆順をたどればよいことがわかります。

f:id:itstaffing:20191210125349j:plain
▲128が引ければ8桁目に1が立つ、残りから64が引ければ7桁目に1が立つ……、というように順に計算していく

ネットワーク部とホスト部の境界がわかる、サブネットマスク

次は「/24」という表記についてです。これはサブネットマスクというもので、通常、IPアドレスの表記には、このサブネットマスクを併記するのがルールなのだそうです。では、サブネットマスクは何を表しているのでしょうか。

サブネットマスクによって、IPアドレスのうちのどこからどこまでがネットワーク部を示し、どこからどこまでがホスト部を示すのか、その境界がわかります。ネットワーク部とは、どのネットワークかを識別するための部分で、ホスト部とは同一ネットワーク内で、どの端末かを識別するための部分だそうです。

このサブネットマスクは、ネットワーク機器であるルータの設定上、とても大切な情報なので、きちんと押さえておきたいポイントとのこと。

サブネットマスクには「/24」という表記だけでなく、10進数による32ピット4オクテッドの表記法もあります。

たとえば、


192.168.1.1 255.255.255.0


192.168.1.1/24

は、同じ意味だそうです。これを2進数で表してみましょう。

f:id:itstaffing:20191210125352j:plain
▲IPアドレス(上)とサブネットマスク(下)をそれぞれ2進数で表すと上記のようになる。サブネットマスクの先頭から24ビット目まで(1で表される部分)がネットワーク部で、最後の8ビット(0で表される部分)がホスト部を示す

「/24」という表記は、コンパクトに記述できるため、設計書や作業シートなどの表記に使うことが多く、10進数表記のほうは、パソコン上の設定入力などで用いられます。

この変換ができないと、実際のシーンで、作業シートを見ながら設定を行う作業ができないという事態になりかねません。

そして、このネットワーク部とホスト部は、自由に境目を変えることができます。たとえば


255.255.255.192/26

という表記は、/24のときとはネットワーク部、ホスト部の境目が変わります。

f:id:itstaffing:20191210125355j:plain
▲境目が26ビット目に変わると、ホスト部が/24のときに比べて減っていることに注目

そして、ここがポイントですが、サブネットマスクを参照して得られたネットワーク部におけるビットの並びが完全に一致しているIPアドレスは、すべて同じネットワークに所属していると見なされます。このルールが、ルータの設定と矛盾してはいけません。

f:id:itstaffing:20191210125359j:plain
▲異なるネットワークに属するIPアドレスを持つ機器が、同じネットワークに置かれていると矛盾が生じる

同じネットワークに含まれるIPアドレスの数は、2の[ホスト部のビット数]乗で求められます。たとえばホスト部のビット数が4ビットならば2の4乗で16個、8ビットならば2の8乗で256個になります。

IPアドレスのクラスによる分類

このサブネット表記が登場した背景を知るには、もともとIPアドレスにクラスという考え方があったことを知らなければなりません。IPアドレスにはAからEまでのクラスがあり、かつてはクラスごとにサブネットマスクが固定だったそうです。

f:id:itstaffing:20191210125402j:plain
▲クラスAでは同一のグループに1677万のIPアドレスが割り当てられるが、グループ内で使いきれないアドレスはムダになってしまう。事実、同一組織内で1677万のIPアドレスを使い切るケースはほとんどなく、クラスAのIPアドレスが割り当てられた組織では、大半が使われずに死蔵されていた時期があったという

サブネットマスクを使えば、/24のところを/25にすれば2分割でき、/26にすれば4分割できます。

ただし、同じグループのIPアドレスならば、すべてを機器に割り当てられるわけではありません。機器に割り当てられないアドレスが2つあります。1つは、同じグループに割り当てられたIPアドレスのうち、ホスト部がすべて0で表されるアドレスで、これはネットワーク全体(範囲)を指す「ネットワークアドレス」と呼ばれます。

もう1つは、逆にホスト部のビットがすべて1で表されるアドレスで、これは同じグループに含まれるすべてのアドレスに対して送信を行うアドレスで「ブロードキャストアドレス」と呼ばれます。

グループを細かく分割し、IPアドレスを無駄なく使う

さて、サブネットマスクによりIPアドレスを異なるグループに分割できること、IPアドレスの中に機器に割りてられないアドレスがあることが分かったところで、いよいよルータとIPアドレスとの関係についてです。

ルータの右と左は違うネットワークのグループになります。ルータは異なるネットワークのグループ間を接続し、IPアドレスに基づきデータを受け渡します。

このとき、サブネットマスクによりグループを分割することで、IPアドレスを無駄なく使うことができます。

f:id:itstaffing:20191210125404j:plain
▲サブネットマスクでグループを細かく分割することで、IPアドレスを無駄なく使える

ただし、いくら無駄をなくすといっても、運用が始まった組織において、ネットワーク内のIPアドレスが足りなくなるという事態は、絶対にしてはならないそうです。なぜなら、運用が始まってからネットワーク構成を変更するのは非常に大変な作業になるからです。したがって、ネットワークを設計する段階で、アドレスの数にある程度の余裕を持たせたサブネットマスクを設定する必要があります。

ここまで学んだところで、気が付くと、イベント冒頭で出されたIPアドレスから8つの項目を読み取ることができるようになりました。スゴイ!

このあと、MACアドレスについての解説があり、続いてルータの設定に進む予定でしたが、残念ながら時間切れに。しかし、IPアドレスとサブネットマスクは、ネットワークを学ぶうえで最初の関門。特に今回のイベントでは、2進数を詳しく解説してくださったので、サブネットマスクについても良く分かったという声を、参加者から多くいただきました。株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

第6話 git reset 3種類をどこよりもわかりやすい図解で解説!【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20191118140711j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第5話 では、特定のコミットを打ち消すコマンド「リバート」を学びました。

・特定のコミットを打ち消す

& git revert [打ち消したいコミットID]

今回の第6話では、特定の時点までファイルを巻き戻す「リセット」を学びます。このリセットには3種類方法があります。git reset --soft、--mixed、--hardです。「これらは何が違うのか?どのように使い分ければいいのか?」初心者の方は困ってしまいますよね。このマンガを通して、わかばちゃんと一緒に理解していきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶGit使い方入門』・『わかばちゃんと学ぶ Googleアナリティクス』・『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Xアカウント

リクルートスタッフィング

リセットには3種類ある

f:id:itstaffing:20191118140646j:plain
f:id:itstaffing:20191118140649j:plain
f:id:itstaffing:20190617145541j:plain
第1話で出てきた、この図は覚えているかな?
f:id:itstaffing:20190617145538j:plain
うん、覚えてるよ。
f:id:itstaffing:20190617145541j:plain
リセットはこの状態を頭に思い描けばそう難しくはないんだ。3種類のオプションそれぞれが影響を与える範囲は次のとおりだ。
--soft:HEADの位置のみ
--mixed:HEADの位置・ステージ
--hard:HEADの位置・ステージ・作業ディレクトリ

f:id:itstaffing:20190617145538j:plain
強度が上がるたびに影響を与える範囲が広くなってるね。ところでHEAD(ヘッド)って何?
f:id:itstaffing:20190617145541j:plain
HEADというのは、簡単に言えば「自分が今いる位置」のことだ。たいていはブランチの先頭のコミットを指していることが多い。こいつを過去のコミットに移動させることで、ブランチを過去に巻き戻すわけだが、そのときにステージも道連れにするのがmixed。ステージも作業ディレクトリも道連れにするのがhardだ。

git reset --soft

f:id:itstaffing:20191118140652j:plain
f:id:itstaffing:20190617145541j:plain
--soft は resetの中でも最弱。HEADだけを動かす、一番弱いオプションだ。

「直前のコミット内容を修正したい」「コミットし直したい」というときに便利なのがこのコマンドです。

--soft 活用例:直前のコミット内容を修正したい

$ git reset --soft HEAD^


例えば「まだ作業をしようと思っていたのに間違えてコミットしてしまった」「2つのファイルをまとめてコミットするべきだったのに、間違えて1つしかコミットしていなかった」などです。このコマンドを実行すると、まさに「コミットをする直前」の状態に戻ります。

▼ git reset --soft 実行後の状態

f:id:itstaffing:20191118140654j:plain

f:id:itstaffing:20190617145538j:plain
ふむふむ。コミットされていたファイルがステージに上がっているね。まさに「コミット」という動作だけを取り消した感じだね。
★魔王教授のコラム

上のコマンドの中にあった「HEAD^」というのは、「1つ前のコミット」という意味だ。では「2つ前のコミット」を表すにはどう打つか分かるかな?

答えは簡単「HEAD^^」だ。

では、8個前のコミットまで巻き戻すときはどうする?もちろん「HEAD^^^^^^^^」と書くこともできるが、指が疲れるし間違えそうだ。そこで「HEAD~8」のように書くこともできる。

え?8個前だと数えるのも面倒だって?もちろんコミットIDで指定することもできるぞ。たとえば次のように打てる。

$ git reset --soft caddd1c


git reset --mixed

f:id:itstaffing:20191118140657j:plain
f:id:itstaffing:20190617145541j:plain
--mixedは中程度の効果。HEADと一緒にステージも道連れにして巻き戻す。作業ディレクトリのファイルは消えないから安心してくれ。

「いくつかgit addでステージしたけど、やっぱやめた」というときに使えるコマンドです。作業ディレクトリのファイルは消えないので安心です。

--mixed 活用例:ステージしたものを取り消したい

$ git reset --mixed HEAD


ちなみに、オプション無しでも--mixedを実行したときと同じ結果が得られます。よって、次のように短く書くこともできます。

$ git reset HEAD

git reset --hard

f:id:itstaffing:20191118140701j:plain
f:id:itstaffing:20190617145541j:plain
--hard は一番強力なオプションだから取扱注意だ。HEADと一緒にステージだけでなく作業ディレクトリも道連れにして巻き戻してしまう。

「ステージングエリアにも作業ディレクトリにも残らなくていいから、コミットをまるごと消したい」というときに使えるコマンドです。

--hard 活用例:ひとつ前のコミットまでまるごと消したい

$ git reset --hard HEAD^


もちろんコミットIDを指定することもできます。指定した時点まで「HEAD・ステージングエリア・作業ディレクトリ」のすべてが巻き戻されます。

例として、極端ですが、この練習用リポジトリのmasterブランチのチェックアウトした状態で「はじめてのコミット」に戻ってみるとしましょう。

f:id:itstaffing:20191118140704j:plain

$ git reset --hard 02f11b7

実行すると、

f:id:itstaffing:20191118140706j:plain

masterブランチが「はじめてのコミット」に巻き戻りました。newsブランチとdevelopブランチは巻き戻らず、そのままですね。なぜだかわかりますか?

あくまでもHEADは「今自分がいるブランチの先頭」を指すものですから、masterブランチだけが巻き戻り、newsブランチとdevelopブランチはリセットの影響を受けなかったというわけです。

ここからさらに新しいコミットを乗せることもできますが、それをリモートリポジトリにプッシュすると他の人のmasterブランチにも影響が出てしまいます。「リセットは危ない」と言われるのはこのためです。git reset --hardを使う場合は、プッシュ前のコミットに対してのみ、使うようにしましょう。

f:id:itstaffing:20190617145538j:plain
リセット3種類、何がどう違うかわかったよ!
f:id:itstaffing:20190617145541j:plain
最初は難しく感じるかもしれないが、少しずつ慣れていくといいぞ。リセットの自信がないときや、プッシュ済みのコミットを打ち消したいときは、この前教えたリバートを使っておけばいい。
f:id:itstaffing:20190617145538j:plain
はい!ところで、最後のgit reset --hardの練習で、今までのコミット履歴ががっつり消えちゃったんですけどそれは……?
f:id:itstaffing:20190617145541j:plain
HAHAHA!そんなこともあろうかと思って、用意しておいたコマンドがある!間違えてリセットしても、git reflog(リフログ)で元どおりだ!次の授業をお楽しみに。

まとめ

ここまでで3種類のリセットの特徴がわかりました。

・特定の時点までファイルを巻き戻す

$ git reset --soft [巻き戻したい時点のコミットを指定]

f:id:itstaffing:20191118140652j:plain

$ git reset --mixed [巻き戻したい時点のコミットを指定]

f:id:itstaffing:20191118140657j:plain

$ git reset --hard [巻き戻したい時点のコミットを指定]

f:id:itstaffing:20191118140701j:plain

Gitにはまだまだたくさんのコマンドがあります。
次回、第7話では、いざというときに便利な git reflog(リフログ)について学んでいきましょう。

▼ これまでの「マンガでわかるGit」

【コラム】Webアプリが動くとき、裏側で何が行われているか。「使える」知識として基礎を身につけよう

利用者がWebサイトを開くとき、「URLを入力する」「リンクをクリックする」「検索欄に入力する」などの方法がありますが、いずれの方法でも目的のページの内容が表示されます。

このとき、裏側で何が行われているか、一般の人が知る必要はありません。しかし、何らかのトラブルがあってページの内容が表示されないとき、エンジニアであればその原因を突き止める必要があります。

そこで今回は、Webアプリが動くとき(利用者がアクセスしたとき)、裏側で使われている技術やその一連の動きについて解説します。

【講師】増井 敏克さん
【講師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『図解まるわかりセキュリティのしくみ』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』(以上、ソシム)がある。

WebブラウザからWebサーバへの接続

・スキーム

利用者がURLを入力したとき、そのURLはただの文字列です。この文字列から、どのような処理が必要なのかを解釈する必要があります。まずはURLの構成から見ていきましょう。

f:id:itstaffing:20191112133644j:plain

URLの先頭(左端)にあるのが「スキーム」です。ここには表のように、さまざまな内容が指定されます。httpやhttpsであればWebサーバにアクセスしますが、mailやtelなどが指定されていると、メールや電話などのアプリケーションを開くこともあります。

f:id:itstaffing:20191112143032j:plain

httpやhttpsが指定されるとWebサーバにアクセスしますが、そのWebサーバの場所を指定するのが、続く「ホスト名」の部分です。

・ホスト名

ホスト名の部分には、ドメイン名だけでなく、BASIC認証のIDとパスワード、サーバのサブドメイン、ポート番号なども指定できます。BASIC認証のIDとパスワードは最近のWebブラウザでは拒否される場合もありますが、スクレイピングなどを行う場合には、いまだによく使われます。

f:id:itstaffing:20191112133648j:plain

・DNS

ここでサブドメインも含めたホスト名がわかりますが、ホスト名もただの文字列です。そこで、このホスト名からWebサーバのIPアドレスを調べる必要があります。このときに使われるのが「DNS(Domain Name System)」で、図のように階層的に管理してIPアドレスを調べられるようになっています。

f:id:itstaffing:20191112133651j:plain

・ルーター

DNSによって接続先のWebサーバのIPアドレスがわかると、次にそのIPアドレスまでの「経路」を調べる必要があります。ここで登場するのが「ルーター」で、名前の通りルートを案内する機器です。

事前にさまざまな宛先への経路をルーティングテーブルとして表を作成しています。この表に従って、同じネットワークなら内部で、異なるネットワークなら外部へ転送します。

f:id:itstaffing:20191112133655j:plain

・ポート番号

経路がわかると、Webサーバの機器まで到達できますが、その機器ではWebサーバだけが動いているとは限りません。メールサーバも同じ機器で運用しているかもしれませんし、データベースサーバも兼ねているかもしれません。

ここで必要になるのが「ポート番号」です。1台の機器に1つのIPアドレスが与えられていても、ポート番号を見てその機器の中で動いている複数のサーバを識別できます。

Webサーバの場合、httpであれば80番、httpsであれば443番が使われることが一般的です。他にも表のようなポート番号が一般的に使われており、1023番以下の番号は「ウェルノウンポート」と呼ばれます。

f:id:itstaffing:20191112133658j:plain

表に挙げた以外にも多くのポート番号がありますし、1024番以上であれば自由に設定でき、開発用のWebサーバとして8000番や8080番などがよく使われます(URLのホスト名部分で指定して使う)。

Webサーバでの処理

・HTTPリクエスト

Webサーバに到達すると、次は「HTTP(Hypertext Transfer Protocol)」というプロトコルで通信を行います。このときに使われるのが、HTTPリクエストとHTTPレスポンスです。

f:id:itstaffing:20191112133701j:plain

HTTPリクエストでは、1行目にメソッドやURL、バージョンなど。2行目以降にホスト名やユーザエージェントなどが書かれています。メソッドには、表にあるようないくつかの指定がありますが、GETとPOSTが多く使われています。

f:id:itstaffing:20191112144301j:plain

実際には、次の図のようなリクエストが送信されます。これらは、各Webブラウザの開発者モードを使うことで確認できます。

f:id:itstaffing:20191112133704j:plain

・HTTPレスポンス

この内容を受け取ったWebサーバは、書かれている内容に従って、HTTPレスポンスを返します。

HTTPレスポンスでは、1行目にステータスラインがあり、そこに書かれているステータスコードによって、エラーの有無や内容がわかります。よく見かける例として、表のようなステータスコードがあります。

f:id:itstaffing:20191112144654j:plain

なお、静的なWebサイトの場合は、指定されたファイルをWebサーバが返すだけですが、動的なWebアプリの場合には、アプリケーションサーバやデータベースサーバなどが連携して動作します。

f:id:itstaffing:20191112133706j:plain

また、同じ利用者からのアクセスを識別するために、Cookieを発行し、次回のアクセスの際に送信することも必要になります。

Webブラウザでの表示

・読み込むファイル

Webサーバからのレスポンスを受け取ったWebブラウザは、その内容を表示しますが、大きく分けて以下の4つのステップがあります。

1.ダウンロード
2.スクリプトの実行
3.スタイル
4.画面への描画

ここで、1つのWebページを表示するときには、読み込んでいるファイルの数だけダウンロードが発生することに注意しなければなりません。

画像ファイルを複数読み込んでいれば、それだけダウンロードが発生しますし、スタイルシートのCSSファイル、プログラムを書いたJavaScriptのファイルなど、最近のWebページは複数のファイルで構成されています。

JavaScriptの実行ができなければ、画面のレイアウトができない場合もあるため、これらを理解しておかなければ、ダウンロードされたとしても、Webブラウザの表示に時間がかかることになってしまいます。

f:id:itstaffing:20191112133709j:plain

JavaScriptの実行→画面のレイアウトが一般的な流れですが、実際にはロードバランサー(負荷分散装置)やキャッシュ、プロキシサーバ、CDNといった技術が使われている可能性も考慮する必要があります。

ロードバランサーが使われていると、利用者が同じWebサーバにアクセスしていると思っていても、異なる筐体にあるサーバにアクセスしている可能性があります。

・キャッシュ

キャッシュが有効になっていると、Webサーバにアクセスしていると思っていても、実際にはWebブラウザに保存されている内容を表示している可能性もあります。

このため、画像などは毎回ダウンロードしていない場合も多いでしょう。DNSの通信もキャッシュされていますので、そのたびに問い合わせが発生するわけではありません。

プロキシサーバがあれば、他の人が閲覧したものを一時的に保存しておくことで、Webサーバへの通信を減らすことができますし、CDNを利用すれば画像や動画など、大量のファイルがあってもWebサーバの負荷を減らせる可能性があります。

ただし、Webアプリの場合など、利用者によって返す内容を変えている場合は、キャッシュしてしまうと個人情報の漏洩などにつながるリスクもあります。コンテンツの内容に応じて、何をキャッシュするのか(何がキャッシュされているのか)、考える必要があります。

おわりに

資格試験に向けた対策などで勉強している人の場合、個々の用語は理解していても、それがどの場面で使われているのか知らないという人を見かけます。「使える」知識として身につけるためには、実際にコマンドを入力する、Webブラウザの開発者機能を使う、脆弱性診断ツールを使う、パケットキャプチャを使うなど、さまざまな方法で体感することが大切です。いろいろなツールを試しながら、その動作を確認してみてください。

このコラムの内容は、2019年9月25日に開催したイベント「Webアプリが動くとき、裏側で何が行われているか知ろう~基礎からのプログラミングリテラシー~」にて、より詳しく増井さんにご解説いただきました。株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

【イベントレポート】Androidアプリ開発とKotlin~Androidアプリ開発のプログラミング言語はJavaからKotlinへ~

この記事では、2019年8月28日に開催したイベント「Androidアプリ開発とKotlin~Androidアプリ開発のプログラミング言語はJavaからKotlinへ~」をレポートします。書籍『作ればわかる!Androidプログラミング Kotlin対応』の著者である金宏 和實さんを講師にお迎えし、Kotlinの基礎を学んだほか、Android Studioを使って実際に簡単なアンドロイドアプリを作りました。

■今回のイベントのポイント
・KotlinはJavaよりも、簡潔に書けることを目標にした言語
・Javaのライブラリを利用する際にとても有効な、SAM変換
・Android Studioはさまざまなリソースを統合管理し、開発できるプログラミング環境
・アンドロイドアプリを作ったら、人に見せて意見や感想を聞いてみよう

【講師プロフィール】
金宏 和實さん
株式会社イーザー代表取締役副社長。アプリケーション開発とライター活動を行う。プログラミングの楽しさを伝えることをテーマとしており、NPO法人NATで小中学生を相手にロボット・プログラミングを教えたりもしている。平成30年、31年前期富山大学芸術文化学部非常勤講師(プログラミング・リテラシー)。主な著書に『作ればわかる! Android プログラミング Kotlin対応』『作ればわかる! Android プログラミング』『ベテランが丁寧に教えてくれる データベースの知識と実務』(ともに翔泳社)、『はじめるPython! ゼロからのゲームプログラミング』『エクセルだけで手軽に楽しむプログラミング超入門』(ともに日経BP社)などがある。

Kotlin(コトリン)とは?言語の特徴

今回のイベントはハンズオン形式で、実際に自分の手でアンドロイドアプリを作るというもの。受講者は各自ノートPCを持ち込み、あらかじめKotlinやAndroid Studioをインストールして臨みました。

Kotlinは開発したプログラムがJava仮想マシン上で動作する、いわゆる「JVM言語」に分類されます。そのため、Javaとの間に文法的な互換性はありませんが、互いのプログラムを呼び出せるなど、相互運用が可能です。

そして重要なのが、KotlinはJavaよりも“簡潔に書けることを目標にした言語”ということ。具体例を3つ挙げてくださいました。

1.valとvarで変数を宣言

Kotlinでは、変数の宣言にvalとvarを使います。valはイミュータブル(変更不可能)、varはミュータブル(変更可能)であることを示します。

val a = 10 // 変数aは値を変更できない
var b = "Hello" // 変数bは値を変更できる

valで宣言した変数はあとから値を変更することができません。Javaでfinal修飾子を付けた場合と同様です。一方のvarは、あとから値を変更できます。

従来の言語のように定数と変数で使い分けるのではなく、「その変数は本当にvarで宣言する必要がありますか? valでいい場合は、なるべくvalを使ってね!」というのが、Kotlinの考え方だそうです。

ちなみにKotlinでは、末尾のセミコロン(;)も省略できます。これも書きやすさの一つかもしれません。

2.「null安全」でヌルポが発生しない

Javaでは、誤ってNULLポインタ(何のオブジェクトも参照しないポインタ)を叩く(参照する)、いわゆるヌルポ(ヌルポインタ例外:Null Pointer Exception)という実行時エラーが発生してしまい、プログラムが停止してしまいます。一方Kotlinでは、null許容型と安全呼び出し演算子というものがあり、これによりヌルポを事前に検出したり、実行時に回避したりすることができます。

nullを入れる場合には、型名の後ろに「?」を付けることでコンパイルエラーや実行時エラーを回避させることができます。

val str? = null // Nullable型になる
str?.toUpperCase() // 関数は実行されず戻り値NULLを返す

3.簡潔に記述することができる、SAM変換

Javaでは関数型インターフェイスを引数として渡すとき、ラムダ式で渡すことができます。Kotlinでも同様に、Javaインターフェイスでメソッドを1つしか持たない「SAM型のメソッド」を呼び出す際に、引数をラムダ式で渡すことができます。これをSAM変換と呼び、Javaのライブラリを利用する際などに、とても有効だそうです。

f:id:itstaffing:20191101111524j:plain
▲SAM型インターフェイスを引数とするメソッドに対し、引数をラムダ式で渡すことができ、簡潔に記述することができる

Android Studioを使って、簡単なアプリを作ってみよう

Kotlinの特長について知ったあとは、Android Studioを使ったハンズオン形式で、実際にプログラミングを進めていきます。題材は金宏さんの著書でも紹介されている「ハイ&ローゲーム」です。

まずAndroid Studioを起動し、あらかじめ金宏さんが用意してくださったトランプの画像を読み込ませます。

f:id:itstaffing:20191101111527j:plain
▲Android Studioはプロジェクト、ソースコード、画面レイアウトなど、さまざまなリソースを統合管理し、開発できるプログラミング環境。プログラム中に使用する画像も、コピー&ペーストの簡単操作で読み込ませることができる

そして金宏さんの著書を参照しながら、テキストビューやボタンの配置、背景色を変更していきます。

ちなみに、このときレイアウトエディタ上に表示される波線を「制約」と呼びます。「制約」を使うことで、アプリを実行する端末の画面サイズやアスペクト比が異なっていても、常に右上隅や左右中央に表示するといった、相対的なバランスを保ったレイアウトを可能にします。

f:id:itstaffing:20191101111530j:plain
▲マージン設定と制約ハンドルを上手に使いながら、テキストビュー、ボタン、カード画像などを配置していく

このプログラムでは、テキストビューに表示させる文字列をstrings.xmlにリソースとしてまとめて記述しています。これは多言語対応を容易にするためだそうです。

画面レイアウトが出来上がったら、次にメインとなるソースコードを記述していきます。こちらもあらかじめ用意してくださったものだったため、指定の場所にコピー&ペースト。その内容を、金宏さんが説明してくださいました。

f:id:itstaffing:20191101111534j:plain
▲画面レイアウトが出来上がったら、メインとなるアクティビティのコードを記述

アンドロイドからアプリを起動すると、最初のアクティビティ(画面)が前面に表示されます。アクティビティは、同じアプリからの別画面呼び出しや他のアプリの起動などにより、別のアクティビティが前面表示になったり、非表示になったりする場合もあります。さらに、その状態から再び前面表示に戻ることもあります。こうしたアクティビティの状態変化によって呼び出されるメソッドを、ライフサイクルコールバックメソッドと呼ぶそうです。

ゲームのソースコードは、基本的にライフサイクルコールバックメソッドのうち、onResumeメソッドをオーバライドして記述していきます。こうすることでアプリ起動時や、他アプリによる中断から復帰したときにも、アクティビティが常に前面に表示されるようになります。

アクティビティの中には、ライフサイクルに関係のないメソッドもあります。そうしたメソッドはライフサイクルメソッドをオーバライドせず、独自に作成していきます。

そして、開発の途中過程にエミュレータで実行してみたいといったときに役立つのが、logメソッドです。logメソッドは途中でログを吐き出します。そのため、プログラム開発中であっても、各種の検証が行えて便利だということを教えていただきました。

f:id:itstaffing:20191101111536j:plain
▲ある程度出来上がってきたら、エミュレータで実行して動作を確認することもできる

金宏さんは「コードの中身は思い切り駆け足でした」と言いながらも、イベントの限られた時間内で、Kotlinの文法なども含め、サンプルプログラムがどのような処理をしているかも一通り説明してくださいました。

また、「アンドロイドアプリを作ったら、自分のアンドロイド端末に入れてどこにでも持ち歩けるため、人に見せて自慢をしたり、感想を聞けるのも魅力。いろいろなものにチャレンジしてほしいですね」と、Kotlinプログラマにエールを送ってくださいました。

Android StudioとKotlinによるアンドロイドアプリ開発は、初心者であっても理解しやすく、今回のサンプルに限らず、いろいろなアプリを作ってみようと思わせてくれたかと思います。株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

第5話 プッシュ済みのコミットを取り消したい!リバートの使い方【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20191021120210j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第4話 では、コンフリクトの解決方法を学びました。

・コンフリクトした箇所を修正して、コミットしなおす

$ git commit -m

・コンフリクトした箇所が多すぎて修正が難しい場合、マージを中止する

$ git merge --abort

今回の第5話では、特定のコミットを打ち消すコマンド「リバート」について学びます。機能としてはシンプルなので、初心者でも使いやすいうえに、いざというとき便利なコマンドです。このマンガを通して、わかばちゃんと一緒に知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

コミット済みの内容を、あとから取り消したい!

f:id:itstaffing:20191021120213j:plain
f:id:itstaffing:20191021120216j:plain

このマンガのように、コミット済みの内容を取り消さないといけない場合、どうしたらいいか分からず、あわててしまったことはありませんか?

Gitにはコミットした内容を取り消す方法がいくつかありますが、まずは一番安全で簡単な「リバート」を習得しましょう。

リバートしてみよう

リバートは、指定したコミットと逆の内容をコミットしてくれます。
コマンドは、たったこれだけです。

& git revert [打ち消したいコミットID]

ちなみに、リバート(revert)は英語でいうと、「元に戻す」という意味です。

▼ リバートすると、このようにコミットメッセージ編集画面になります

f:id:itstaffing:20191021120219j:plain

▼ 編集する必要がなければ、Escキーを押してから「ZZ」と入力することで確定されます。 見事、リバートコミットが作られました

f:id:itstaffing:20191021120221j:plain
f:id:itstaffing:20191021120224j:plain
f:id:itstaffing:20191021120146j:plain
f:id:itstaffing:20190617145538j:plain
git revert 、マスターしたよ!これでいくら間違えても大丈夫だね。
f:id:itstaffing:20190617145541j:plain
って、おいおい……。さすがにこの履歴は読みづらいよ。
f:id:itstaffing:20191021120148j:plain

f:id:itstaffing:20190617145538j:plain
た、確かに…。そういえば、さっきリバート以外にも取り消せるコマンドはあるって言ってたよね。そっちを教えてよ!
f:id:itstaffing:20190617145541j:plain
ん~、リセットか……。リセットはちょっと危険だから初心者には教えないようにしているのだが、リフログと一緒に覚えてもらえば……。ブツブツ
f:id:itstaffing:20190617145538j:plain
ブツブツ言ってないでさっさと教えなさい!それでも大学教授なの!?
f:id:itstaffing:20190617145541j:plain
前から思っていたのだが、いつの間にか上下関係逆転してないか?
★魔王教授のコラム

リバートが便利なのは、プッシュ済みのコミットを打ち消したいとき。プッシュ済みのコミットは、そのまま上に新しいコミットを乗せる形で「打ち消し」を行えるからだ。

一方、次回説明するリセットは、コミットそのものを消去してしまう強力なコマンドだ。すでに他のメンバーがそれを親としてコミットを重ねてしまっているときにリセットをしてしまうと、他のメンバーがプッシュ不能になってしまう。それもそのはず、あるはずの親がいなくなっているからだ。

というわけで、初心者の頃は無理せずリバートを使うことをオススメする。リセットは、Gitに慣れてきたら習得していこう。

まとめ

さて、ここまででコミットを打ち消す方法がわかりました。

・特定のコミットを打ち消す

& git revert [打ち消したいコミットID]

コミットの歴史を改変するのではなく、新しくコミットが上に積まれるだけなので安心して使えるコマンドです。

Gitにはまだまだたくさんのコマンドがあります。
次回、第6話では git reset(リセット)について学んでいきましょう。

▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」