このブログについて

IT関連のお仕事をするにあたって、学んだことを備忘録的に残すブログです。

どうしてQiitaにまとめないのか。Qiitaにまとめるほどのものではと思ったので。あとブログの方が気楽かなと思ったので。

見苦しい点は多々あると思いますが、ひよっこが頑張って勉強しているんだなぁと、広い気持ちで読んでいただければ幸いです。

シェルとはなんぞや〜その②

前回までのあらすじ

.bash_profileについて学んでたんだけどそもそもシェルってなんなの?って思って調べたました。

シェルはカーネルへのサービスのアクセスを提供するものということ。ようするにmacのターミナル(ものすごく大雑把にくくっています)ということです。

それで、シェルには色々種類があるのだ、というところまで確認しました。macのデフォルトはbashです。

起動ファイルの順序

とりあえず、ITメディア エンタープライズさんの記事にある文章を引用しますと。

ユーザーがログインに成功した後、bashは「ログインシェル」として一般的に以下のような流れでファイルを順次検索し、ファイルが存在していれば実行し起動します。

  1. /etc/profileを実行

  2. /etc/profileによって、/etc/profile.dディレクトリ配下のすべてのファイルを実行

  3. ログインユーザーのホームディレクトリにある~/.bash_profileを実行*

  4. ~/.bash_profileによって、~/.bashrcを実行

  5. ~/.bashrcによって、/etc/bashrcを実行

bashが起動時に実行するファイル - ITmedia エンタープライズより引用)

bashの起動(ログイン)時には上記のような順番でファイルが読み込まれているようです。

わかったこと

/etc/profileと/etc/bashrc

一番最初に読み込まれているらしいファイルは、etc/profileです。

中身は以下のようになっています。

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
        [ -r /etc/bashrc ] && . /etc/bashrc
fi

はっきりとしたことはよくわかんないのですが、${BASH-no}とやらが存在するならば/etc/bashrcが読み込まれている...という感じでしょうか?

では続いて/etc/bashrcを見てみると

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

こちらは完全に意味不明です...orz

この2つのファイルは

すべてのユーザーに影響を与えるグローバルな初期設定が記述されており、「システムプロファイル」と呼ばれています。

らしいです。ものすごーく大事なファイルです。よほどのことがない限りあんまり編集しないほうがよさそうです。

まとめ

こんかいのまとめです。

  1. bashの起動時には、/etc/profile/etc/bashrcが実行される
  2. この2つのファイルは「システムプロファイル」と呼ばれる

シェルとはなんぞや〜その①

はじめに

.bashrcというファイルをご存知でしょうか?

私は「名前は聞いたことあるし、プロジェクトの環境構築とかで編集したことはある。でも正直なんなのかよくわかってない。環境変数とか設定するの??」、そういうレベルです。

さすがにちょっと知らなすぎるのでは、ということで調べてみました。

わかったこと

.bashrcは「シェルが起動するときに実行される初期化ファイル」(bashが起動時に実行するファイルより)です。

ちょっと待ってください、シェルってなんですか...??いや聞いたことはあるんですけど、私完全に言語のことだと思っていて、改めて単語が出てくると意味を把握していません。

シェルとは、「オペレーティングシステム (OS) のユーザーのためにインタフェースを提供するソフトウェアであり、カーネルのサービスへのアクセスを提供する」(wikipediaより)とのこと。これだと何言ってるのかよくわかんないんですけど、もうちょっと調べてみたところ、とりあえずmacにおけるターミナルの入力を実際に実行するものという認識だと思います。【急募】おばかでもわかるシェルの解説

シェルにもいくつか種類があるようで、shとかcshとか、bashとかがあるようです。それで、macbashというシェルなんだそうです(デフォルトの場合)。ターミナルを起動すると、ヘッダーの箇所に-bashって表示されているのが確認できるかと思います。

とりあえず今回はここまでの認識で力尽きました(私の理解能力とPCのバッテリーが)。

viエディタを使う 〜その2〜

概要

今回はエディタで使用することの多い

  • コピー
  • カット
  • ペースト
  • Undo(操作の取り消し)
  • Redo(操作の繰り返し)

についてです。

1行コピー

VSCodeで、command + cでできる(もしくはCtrl +c?)便利なアレです。 viではコマンドモードの時に「yy」で1行コピーが行えます。

1行カット

VSCodeで、command + xでできる(もしくはCtrl + x?)やはり便利なアレです。 viではコマンドモードの時に「dd」で1行カットが行えます。

ペースト

先ほどのコマンドを使用してコピー or カットしたものをペースト(貼り付け)するにはコマンドモードで「p」です。

Undo

エディタを使用していると、「やべぇ間違って変なところ消してしまった」なんてことは日常茶飯事です。 そんなとき操作の取り消し、Undoです。viにもあります、安心です。

viでは、コマンドモードで「u」です。ひたすら「u」を押せばとにかくUndoします。command + Zより早い...ような気がします。

Redo

Undoの対照だから、VSCodeでいうcommand + Yかと思ったらちょっと違いました。 単純に同じ動作を繰り返したい時に使用します。viでは「.」(ピリオド)です。

例えば、「hoge」というのを編集モードで入力して、これを繰り返したいって時に、コマンドモードに戻って「.」です。

Redoの概念って難しくないですか...?

おわりに

どうしてもVSCodeのようなエディタを使用できない場面はあるので、viちゃんとはもっと仲良くなりたいですね!!

viエディタを使う 〜その1〜

viコマンドとは

一般的には.txtファイルなどの編集はメモ帳とかVisual Studio Codeといったようなエディターソフトで編集するものですけど、設定ファイルとかはそちらのエディタではなくて、ターミナルから編集することが一般的だと思うのですよね。(なんとなくそういう感じという私の思い込みなので、VSCodeなんかでいじったりもできるのかもしれませんが。)

そういったとき使用するのがviコマンドです。簡単にいうと、ターミナルで動かせるエディターです。

ファイルを開く

sample.txtというファイルをviで編集したい場合、まずファイルを開くために以下のコマンドを実行します。

vi sample.txt

これでsample.txtというファイルが開かれた状態になります。

ファイルを編集する

「よしでは早速ファイルを編集するぞ!」と意気込んで何かキーをタイプしても「あれ、タイプできない...」というパターンがほとんどかと思います。

というのも、viは起動直後はコマンドモードといって、まだエディタのように文字をタイプすることはできません。このコマンドモードの状態から、「今から編集するよ!」という宣言をしてあげる必要があります。コマンドモードから編集モードに移行するには、いくつか方法があるのですが、一番シンプルなのは「i」をタイプすることです。

編集モードに移行したら、一般的なエディタと同じようにタイプが可能になります。

ファイルの編集を終える

編集したファイルは保存しなくては意味がないですよね。ファイルを保存するには、一度コマンドモードに移行してから、「保存してね」という宣言をします。

コマンドモードへの移行は「escキー」をタイプします。そして、「保存して終了」は「:」→「w」→「q」→「!」の順にタイプします。

「保存せずに終了」は「:」→「q」→「!」の順にタイプすればOKです。

まとめ

viで指定したファイルを開く

vi [ファイル名]

編集モードに移行する

コマンドモードの状態でiをタイプする。

ファイルの編集を終える

escキーをタイプ後、「:wq!」(保存して終了)もしくは「:q!」(保存せずに終了)とタイプする。

日本語入力についてふわっとまとめてみる

日本語入力とは

私は現在20代なので、PCで日本語が入力できるのは当たり前という感覚の世代なのですが、昔はそうではなかったんですよね。もともとPCは日本語の入力を想定されていません。こいつはアメリカ生まれなのでアルファベット想定で作られました。

なので、昔は自分で日本語入力システムなんかを準備する必要があったそうです。今はそんなことせずとも日本語が入力できるのですから、いい時代ですね。

現在の言語設定を確認する

日本語システムの準備は、今のPCではほぼ不要なので、現在適用されている言語だけでも調べてみます。

echo $LANG

すると私の環境では以下のような出力がされました。

ja_JP.UTF-8

日本語(ja_JP)で、文字コードは(UTF-8)ですね。

文字コードとは

Wikipediaから引用しますと、

コンピュータ上で文字(キャラクタ (コンピュータ))を利用する目的で各文字に割り当てられるバイト表現。もしくは、バイト表現と文字の対応関係(文字コード体系)のことを指して「文字コード」と呼ぶことも多い

とのことです。

日本語の文字コードといえば、Shift_JISUTF-8EUC-JPが有名っぽい漢字です。

文字コードが異なると、文字化けの原因となります。たとえば、「あ」をShift_JISで表現すると「ab」でも、UTF-8で表現すると「abc」になってしまうと、正しく表示されません。これが文字化けの原因です。

ちなみに私はUTF-8をよく使用しています。Shift_JISよりも言語のサポートが多いので。iOSだとShift_JISが文字化けしていたような...うろ覚えですが。

もっと詳細が気になる場合はGoogle先生に聞いてみましょう。

プロセスとスレッド

プロセスとは

Wikipediaから引用すると、

情報処理においてプログラムの動作中のインスタンスを意味し、プログラムのコードおよび全ての変数やその他の状態を含む

とあります。

スレッドとは

同じくWikipediaから引用すると、

CPU利用の単位

だそうです。

2つの違い

今回も先輩に尋ねてみました。

簡単に言うと、プロセスが親で、スレッドが子です。

例えば、Google Chromeを起動した時、ウィンドウがプロセスで、タブがスレッドです。アプリケーション1つがプロセスと考えていいのかと思います。

そして、プロセスはメモリを食います。なので、たくさんのアプリケーションを起動することは、大量のプロセスを作ることになり、PCに負担がかかるのですね。ですが、スレッドはプロセス内のメモリを使うので、PCの負担を軽減できる、ということでしょうか。

私がよくPCをフリーズさせるのはあっちこっち起動させてるからなのかもしれませんね!

ということは、たくさんのウィンドウを開くより、たくさんのタブを開く方がPCへの負担は少ないのでしょうか...?もう一度聞いてみます。

ブロックサイズについて尋ねてみた

はじめに

先日のulimitコマンドに関する記事で、ブロックサイズなんてものが登場したのですが、「ググってもよくわからんお(^q^)」ってことになったので、職場の先輩に聞いてみました。

ブロックサイズはトロッコの大きさと考える

私が尋ねた先輩も、昔よくわからなくて先輩に聞いたことがあるそうなのです。みんな通る道なのでしょうか。

で、その時聞いた例え話というのがトロッコなんだそうです。

例えば、ブロックサイズ1024というのは、トロッコにりんごが1024個入るということなのです。トロッコのサイズは自由に指定できます。なんとなく1024とか決まった数字があるのかなって思ってたんですけど、そんなことはないようです。(データベースのサイズ指定とかよく1024って例文見るし、暗黙の了解的な感じでサイズの指定方法も決まっているのかなーって...)

そして、500個のりんごは1024サイズのトロッコ1つで十分です。1024 - 500 = 524となるように、まだ524個も入るという、もったいない状況ではありますが、1つで十分です。

ブロックサイズはでかけりゃいいってものではない

「えっ、じゃあ10000とかでっかいトロッコにすれば毎回1つのトロッコでよくない!?」って思いますよね。私も思いました。

では、パケット...説明上のトンネルを登場させましょう。トンネルよりでかいトロッコはサイズを小さく...というよりはオリジナルサイズを分割してロッコの全てを通過させなくてはいけません。

では500個のりんごを積んだ10000サイズのトロッコを1000サイズのトンネルに通します。どうなるでしょうか。

先ほど太字で強調した、ロッコの全てを通過させることを想定すると、10000 / 1000で、10000サイズのトロッコは1000サイズのトンネルを10回に分けてつうかしなくてはなりません。りんごは500個だから、実際の中身は1回で済むのに、トロッコのせいで無駄な回数増えます。トンネルはパケットの比喩なので、無駄な通信が増えるということになります。(無駄と言い切っていいのかはちょっと曖昧ですが...)

ここでトロッコのサイズが700だったとしたら...りんごは全部入るしトンネル通過も1回で終わります。なんでもでかけりゃいいってもんではないようです。大は小を兼ねるとはいいますが...それでも適切なサイズというものがあります。

ですから、通信とかそのへんを考えるときはこういう考え方が重要になってくるそうなのです。私はまだ仕事でそこまで考えたことはないのですが...

完全に理解できたわけではないのですが、なんとなくつかめた感じはします。(トンネルのくだりは先輩からの説明には登場しなかったので私の思い込みかもしれません...)