tkd2017の勉強ブログ

日々の勉強をアウトプットするブログ

[ふつりな 2版] 第4章 Linuxとユーザ

www.high-novice.com

  • P.54〜P.70

4.1 ユーザとグループ

Linuxではユーザー名とパスワードを入力することでログインができる。なぜログインが必要かといえば、複数のユーザーで同時に使うことを前提としているため。そのようなシステムを マルチユーザーシステム と呼ぶ。

逆に複数のユーザーではなく一人のユーザーが使うことを前提としたシステムは シングルユーザーシステム と呼ぶ。たとえば少し前のiOSやAndroidなど。

深く考えなければ、「1人向け」より「複数人向け」の方が、機能が多くてよさそう。しかし、一人向けであればログインが省けるなどメリットもあるはず。

Linuxがマルチユーザーシステムである理由はいくつか挙げられる。一番わかりやすい理由は「UNIXがそうだったから」。昔は非常に高価だったため、複数人でシェアするのが当然だった。

では現在は? コストメリットではなくセキュリティ(安全性)の面で意義がある。システムファイルなどは普段のユーザーとは別のユーザーを所有者としておくことで、うっかり消してしまうなどの誤操作からシステムを守ることができる。

Windowsもかつてはシングルユーザーシステムだったが、XP以降はマルチユーザーシステムとなった。

マルチユーザーによるセキュリティ確保のためには、権限管理(パーミッション)が必要不可欠。各ユーザーに権限を分割することで、不必要な操作をできないようにする。例外的にあらゆる権限をもつ スーパーユーザー がいて、普通は root という名前。あらゆるファイルを変更し、削除し、プロセスを停止できる権限を持っている。

今ならセキュアOS(たとえばSELinux)の機能を利用することで、rootユーザーの権限も制限できますね。面倒だからあまり使っていないのかな?

ユーザーとパーミッションだけでも権限管理はできるが、より柔軟に扱うためにグループという機能もある。システムはグループに対してパーミッションを付与できる。ユーザーは複数のグループに所属すことができ、所属しているグループに許可されている操作が可能となる。-gで追加できる最初のグループを単に「ユーザーのグループ」と呼び、-Gで追加できるその他のグループを「補足グループ(supplementary groups)」と呼ぶ。

ファイルのパーミッションについて復習。

ファイルには次の3種類のユーザー区別がある。

  • ファイルを所有するユーザー
  • ファイルを所有するグループに所属するユーザー
  • それ以外のユーザー

権限の種類としては次の3種類がある。

  • 読み込み(read, r)
  • 書き込み(write, w)
  • 実行(execute, x)

そのため、3種類のユーザー区別 x 3種類の権限で、合計9個の項目があることになる。ls -lで確認してみる。

[vagrant@localhost ~]$ ls -l /
total 16
lrwxrwxrwx.  1 root    root       7 1028 11:03 bin -> usr/bin
dr-xr-xr-x.  5 root    root    4096 1028 11:07 boot
drwxr-xr-x. 18 root    root    2960 1127 15:23 dev
drwxr-xr-x. 80 root    root    8192 123 10:59 etc
drwxr-xr-x.  3 root    root      21 1028 11:06 home
lrwxrwxrwx.  1 root    root       7 1028 11:03 lib -> usr/lib
lrwxrwxrwx.  1 root    root       9 1028 11:03 lib64 -> usr/lib64
drwxr-xr-x.  2 root    root       6 115  2016 media
drwxr-xr-x.  2 root    root       6 115  2016 mnt
drwxr-xr-x.  2 root    root       6 115  2016 opt
dr-xr-xr-x. 96 root    root       0 1127 15:23 proc
dr-xr-x---.  3 root    root     149 123 11:05 root
drwxr-xr-x. 26 root    root     840 123 19:05 run
lrwxrwxrwx.  1 root    root       8 1028 11:03 sbin -> usr/sbin
drwxr-xr-x.  2 root    root       6 115  2016 srv
dr-xr-xr-x. 13 root    root       0 1127 15:23 sys
drwxrwxrwt.  8 root    root     221 124 03:43 tmp
drwxr-xr-x. 13 root    root     155 1028 11:03 usr
drwxr-xr-x.  2 vagrant vagrant   25 1127 15:23 vagrant
drwxr-xr-x. 18 root    root     254 1127 15:23 var

各行の先頭にあるのがファイル種別(lとかd)で、その後の9桁がパーミッション(rwxr-xr-x)となっている。

またパーミッションは記号表記のほかに8進数表記もある。

記号 数字 ファイルの場合 ディレクトリの場合
r 4 catなどで読める lsなどで一覧が得られる
w 2 viなどで書き込める touchなどでファイルが作れる
x 1 プログラムとして実行できる cdなどでアクセスできる

前述のrwxr-xr-xであれば755となる。

たとえば所有者がvagrantユーザーであるファイルのパーミッションがrw-r--r--だとする。そうすると、vagrantユーザーとしてアクセスすればファイルを読み書きできる。ところで「vagrantユーザーとしてアクセスする」とはどういうことなのか? 実は「vagrantユーザーの属性をもったプロセスがアクセスする」ということ。Linuxにおいて、活動する主体はユーザーではなく プロセス ということになる。

プロセスの属性としてのユーザーのことを クレデンシャル と呼ぶ。カーネルはプロセスがもっているクレデンシャルを確認することで操作の可否を判断している。逆にいえば、クレデンシャルさえもっていれば、誰が起動したプロセスかということは問われない。

Linuxで最初に行うログインという操作によって、ログインしたユーザーのクレデンシャルをもったプロセスが生成される。このプロセスから作られるプロセス(サブプロセス)はコピーされたクレデンシャルをもつため、普段は意識せずとも操作ができるようになっている。

またログイン時にはユーザー名を入力するが、カーネルはユーザーID(UID)で認識しており、クレデンシャルもIDとなる。ユーザー名とユーザーIDの対応は/etc/passwdに記録されている。

[vagrant@localhost ~]$ cat /etc/passwd | head -5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

passwdのフォーマットは2.2 パスワードファイル /etc/passwd の構造を参考のこと。

またグループの情報は/etc/groupで管理されている。

[vagrant@localhost ~]$ cat /etc/group | head -5
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

プログラムの中でユーザー名からユーザーIDを取得したい場合などは専用のAPIがあるため、それを利用する。直接変換ロジックを実装してはいけない理由として、ユーザー情報はこれらのファイル以外に、NIS(Network Information Service)やLDAP(Lightweight Directory Access Protocol)などでも管理されていることがあるため。APIを利用することでこれらを意識することなく取得できる(第14章の話し)。

4.2 シェルと端末

端末(ターミナル)とは、人が直接に接する部分を指す。現代の典型的な環境なら手元のPCのこと。端末の種類をざっと挙げてみる。

  • テレタイプ
    • ディスプレイ装置がなく、出力は長い紙に打ち出された
    • UNIXでは端末のことを TTY と呼ぶが、これはテレタイプ(TeleTYpe)からきている
  • ダム端末
    • 文字だけを表示可能なディスプレイとキーボード、それに付随するハードウェアが付いていた
    • 有名な機種としては VT100 など
  • キャラクタ端末
    • VT100をはじめとする初期のダム端末は キャラクタ端末 と呼ばれ、ディスプレイに文字しか表示できなかった
  • ビットマップディスプレイ
    • 細かい点(ビットマップ)で表現し、文字以外にも絵などが表示できる
    • 一例として、X Window Systemを動作させるために使われた X端末 などがある
  • 端末エミュレータ
    • ハードウェアであった端末をソフトウェアで実現したもの
    • GNOME terminalやKonsole、macOSのTerminalやiTerm2など

端末と似た意味のものに「コンソール」がある。端末が「人が直接に接する」部分だったのに対し、コンソールは「カーネルと直接対話する」装置を指す(より具体的にはキーボードとディスプレイなど)。物理的にはキーボードとディスプレイが1組しかなかったとしても、Linuxの場合は内部で仮想コンソールが起動しており、切り替えて使用できる。

ベルを鳴らすサンプル:bell.c

#include <stdio.h>
#include <stdlib.h>

int
main (int argc, char *argv[])
{
    printf("\007");
    exit(0);
}

LinuxではSSDやHDDがデバイスファイルとして表現されていた。端末も例外ではなく、/dev以下に、端末に対応するデバイスファイルが用意されている。たとえば最初の仮想コンソールは/dev/tty0である。

端末がファイルとして表現されていると何がうれしいのか? それは接続するためのストリームが得られること。端末につながったストリームを読み込むとキーボードからの入力が得られ、端末につながったストリームへ書き込むとディスプレイに文字が出力できる。このようなしくみによって、端末はファイルおよびストリームとして抽象化され、一見しただけではプロセスからは見えなくなっている。

最後にシェルについて。シェルはユーザーからの命令を解釈して実行するプログラムのこと。bashzshなど、ほかにもたくさん。それ自体はストリームからコマンドを読み込んで実行しているだけだが、そのストリームは端末につながっていることもあれば、つながっていないこともある。

はてなブログ内の外部リンクのアイコンにFont Awesomeを使ってみた

以前、外部リンクにアイコンをつける記事を書きました。

www.high-novice.com

このときはフリーのアイコンを見つけて、それを利用しました。最近アイコンフォント&CSSフレームワークである、Font Awesomeというものを知ったのでこちらに切り替えてみました。

Font Awesome

Font Awesomeは現在5.0.1が最新版となっています。Free版とPro版があり、Pro版は$60で永続ライセンスが付与されるようです。1200以上のアイコンが追加で使用できるようですので、プロダクトなどで使いたい場合はそちらも検討するとよさそうですね。

Font Awesomeの読み込み方法

使い方は大きく分けて2つあり、JavaScriptを読み込む方法と、CSSを読み込む方法があります。推奨はJavaScriptで読み込む方法ですので、今回はこちらの方法を使用します。

次に読み込む方法も2種類用意されており、CDNを利用する方法と、Downloadして自分のサイトにアップする方法があります。推奨はCDNですので、今回はCDNを利用します。

まとめます。

  1. JavaScriptを、CDNを利用して読み込む(最も推奨)
  2. JavaScriptを、自サイトにアップして読み込む
  3. CSSを、CDNを利用して読み込む
  4. CSSを、自サイトにアップして読み込む

はてなブログで利用する場合は、1の方法が簡単に導入できます(手間としては3も同じですが)。

アイコンの探し方

アイコンは、公式サイトの Icons メニューをクリックすることで検索できます。

f:id:tkd2017:20171214004144p:plain

アイコン一覧が表示されます。2177種類のアイコンがありますが、Pro版のも含まれています。Free版のみに絞り込んでみましょう。サイドメニューの「Free」をクリックすることで絞り込みができます。

f:id:tkd2017:20171214004147p:plain

Free版のみとなりました。899種類のアイコンが使えるようです。次に外部リンクのアイコンを検索してみます。サーチバーに external と入力してみます。

f:id:tkd2017:20171214004150p:plain

external-linkは2種類あるみたいですね。今回は右側の「external-link-alt」気に入ったのでクリックします。

f:id:tkd2017:20171214004153p:plain

アイコンの詳細画面に移りました。左下にあるタグをコピーして貼り付けるだけで、このアイコンを表示させることができます。

はてなブログで利用

以上を踏まえて、はてなブログに設定をします。

設定は毎度お馴染み、詳細設定の headに要素を追加 です。今回は、次のようなコードとなりました。

<script defer src="https://use.fontawesome.com/releases/v5.0.1/js/all.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$(function() {
    $('a[href^="http"]:not([href*="' + location.hostname + '"])').attr('target', '_blank').attr('rel', 'noopener noreferrer')
        .append('<i class="fas fa-external-link-alt" style="margin-left: 3px"></i>');
})
</script>

確認してみます。

f:id:tkd2017:20171214005059p:plain

おお、よい感じですね!

まとめ

というわけで、フロント界隈では有名だと思われるFont Awesomeを使ってみました。

ブログでアイコンを使う機会はそう多くないですが、サイト作成などではすごく助かりますね。

今後もお世話になります。ではでは。

これからGoogle AdSenseを導入しようとしている人が後悔しないために気をつけること

Google AdSenseの申請をするために右往左往し、時間と労力だけを無駄にしたので、自分と同じ目に会う人がひとりでも減ることを願って書きます。

まず先に結論ですが、はてなブログでAdSenseを導入しようとしている人は次の順番で進めるとよいです。

  1. はてなブログProにアップグレード
  2. お名前.comなどでドメイン取得
  3. hatenablog.comのCNAMEレコードを登録する
  4. はてなブログに独自ドメインの設定
  5. ブログ内のリンクを修正
  6. AnalyticsやSearch Consoleの登録と設定
  7. そのほかAdSense審査のために必要な作業
  8. AdSenseに申請

はまったこと

実は、一番初めのアカウント登録から難航してました。どうやら以前、今回登録したのとは別のアカウントでAdSenseのアカウントを作っていたようで、複数アカウントはNGとメールが来ました。

対応としては2つあり、1つ目は前のアカウントに統合すること。2つ目は前のアカウントを解除して、新しいアカウントで登録し直す。今回は2つ目の方法としました。

次に申請するドメインで四苦八苦。ちゃんと嫁って話しなんですが、blog.high-novice.comでAdSenseに申請しようとしたら拒否られました。

そこでhigh-novice.comで申請しましたが、404でサイトが見つからずリジェクト。high-novice.comでドメイン登録しようにもうまくいきませんでした。ただこれについては転送Plusを利用すればいけるようです。

しかたないのでwww.high-novice.comでドメイン登録し直し、はてなブログも変更しました。そしてドメイン名が変わったので、サイト内のリンクも修正することに……。

記事を個別に修正していくのはもう嫌だったので、一度バックアップ機能を利用してエクスポートし、エディタで一斉置換をしました。そしてそれをインポート。その結果、案の定すべての記事が2つずつになりました。

まぁそうだよねと思いながら、一度すべての記事を削除して再度インポート。そうすると記事のタイトルに[hoge]を使っていたものが一律カテゴリに変換されてしまい、結局手動修正。そのうえ、Markdownモードではなく見たままモードになるという副作用まで。

というわけで、非常に遠回りをしまくって、やっとここまでこれました。

最後に

転送Plusを使う方法が分からず(思いつかなかった、情報が探せなかった)wwwで登録し直したり、それに付随した修正がたいへんでした。

いまだったらblog.high-novice.comでドメイン登録して、転送Plusを使う方法を採用しますかね。まぁ別にwwwをほかで使う予定もないので、別によいのですけど。

というわけで、ここ数日はまってたことを整理してみました。

ちなみにAdSenseは まだ審査中 です。

Google AdSenseに備え、ドメインを取得してはてなブログProにしてみた

連日飲み会で更新できていませんでした。飲み会では、前職の人に会ったり、ベルリンで働いている人に会ったりしました。

さて今日は、Google AdSenseというのを使ってみたかったので、そのために必要なことをやっていました。

AdSenseは使いたいといって使えるものではなく、申請して審査に通過しないと利用できません。

本当についさっき申請をしたので、現在審査待ちというステータスになっています。

はてなブログでAdSenseを申請するために最低限必要なこと

申請をする ことと、申請を通過する ことは分けて考えます。

申請をするだけであれば、本当に必要なのは次の1点だけです。

  1. 独自ドメインでサイトを運営していること

では、はてなブログで独自ドメインを設定するためにはどうすればよいのでしょうか。実は無料版では独自ドメインは設定できず、はてなブログ Pro にアップグレードする必要があります。

Proは月額600円〜となっていますが、30日間は無料のお試し期間があります。となっているのは、プランが3種類用意されており、2年コースが一番お得で600円/月という料金設定になっているためです。詳細は公式のドキュメントをどうぞ。

というわけで、申請に必要な作業は次の3点ということになります。

  1. 独自ドメインの取得
  2. はてなブログProにアップグレード
  3. はてなブログを独自ドメインで運営できるように設定する

独自ドメインの取得

今回はお名前.comを利用して、ドメインを取得しました。

.techが1年目30円で「おおっ!?」と思ったんですが、2年目からは普通に4980円かかるため、コスパのよい.comにしました。とりあえず1年で。

ドメイン取得がまったくはじめてという方は、次の記事などを参考にしてください。

jisedai-lab.com

はてなブログProにアップグレード

ブログのダッシュボードにアクセスすると、サイドバーの一番下に30日間無料のリンクが見つかります(時期によって表示のさせ方は変わっているかも)。

f:id:tkd2017:20171207031830p:plain

とりあえず最初ということもあるため、ドメインと同じ1年間のコースにしてみました。

はてなブログを独自ドメインで運営できるように設定する

最後に、お名前.comとはてなブログ、それぞれに設定をします。

お名前.comにはhatenablog.comCNAMEレコードの作成。はてなブログには取得した独自ドメインの設定を行います。

次のブログの お名前.comでの設定 以降の説明が、画面キャプチャ付きでわかりやすかったです。

www.kototoka.com

AdSenseに申請

ここまでの作業が完了したら、申請はもうすぐそこです。

具体的には次の2点の作業を行います。

  1. AdSenseのサイトで申し込む(アカウントを作成する)
  2. サイトにスクリプトを埋め込む

AdSenseの申し込み手順を解説しているサイトはいろいろと出てきたんですが、割と変更が多いようで、古い情報が多かった印象です。

その中でも現在の実態にそった内容として、次のブログが参考になりました。

jalmilenavi.hatenablog.com

ただ、これもすぐに古い情報になってしまう可能性がありますので、注意が必要です。

このブログの方はライブドアブログを使っているので、はてなブログとは若干違いがあります。

f:id:tkd2017:20171209003707p:plain

はてなブログの場合は、ダッシュボードから [設定] > [詳細設定] と進み。

f:id:tkd2017:20171207034006p:plain

headに要素を追加のテキストエリアにスクリプトを貼り付けます。

あとは参考記事の通り、「サイトにコードを貼り付けました」のチェックを入れ、残りの作業を済ませれば終了です。

f:id:tkd2017:20171207034448p:plain

あとは待つだけ!

最後に

ということで、ドメイン取得からAdSenseの申し込みまでやってみました。

一発で審査が通るかまったくわかりませんが、ダメならダメで改善して再申請していく所存です。

実際には申請を通りやすくするためにいくつかやったことなどがありますが、それはまた別の機会に書いていきます。

それでは、おやすみなさい。

[ふつりな 2版] 第3章 Linuxを描き出す3つの概念

www.high-novice.com

  • P.38〜P.52

3.1 ファイルシステム

ファイル という用語の定義は難しい。あまり意識されずに次のような意味で使われていることが多い。

  1. 広義のファイル
  2. 狭義のファイル(regular file)
  3. ストリーム

ストリームについては後述。

lsコマンドの結果表示されるものを、本書では 広義のファイル と呼ぶ。

[vagrant@localhost ~]$ ls -l /etc/ | tail -20
drwxr-xr-x.  6 root root     4096 1128 23:47 sysconfig
-rw-r--r--.  1 root root      449  83 23:57 sysctl.conf
drwxr-xr-x.  2 root root       28 1028 11:04 sysctl.d
lrwxrwxrwx.  1 root root       14 1028 11:03 system-release -> centos-release
-rw-r--r--.  1 root root       23  830 15:53 system-release-cpe
drwxr-xr-x.  4 root root      151 1028 11:04 systemd
-rw-------.  1 tss  tss      7046  83 17:16 tcsd.conf
drwxr-xr-x.  2 root root        6  96 22:08 terminfo
drwxr-xr-x.  2 root root        6 1020 03:07 tmpfiles.d
drwxr-xr-x.  2 root root       70 1028 11:04 tuned
drwxr-xr-x.  3 root root       54 1127 15:23 udev
-rw-r--r--.  1 root root       37 1028 11:06 vconsole.conf
-rw-r--r--.  1 root root     1982  82 00:45 vimrc
-rw-r--r--.  1 root root     1982  82 00:45 virc
drwxr-xr-x.  2 root root       33 1028 11:04 wpa_supplicant
drwxr-xr-x.  4 root root       38 1028 11:04 xdg
drwxr-xr-x.  2 root root        6 115  2016 xinetd.d
drwxr-xr-x.  6 root root      100 1028 11:03 yum
-rw-r--r--.  1 root root      970  85 19:13 yum.conf
drwxr-xr-x.  2 root root      229 123 11:04 yum.repos.d

広義のファイルを網羅的に挙げてみる。

  • 普通のファイル(regular file)
    • 内容がそのまま記録されているファイル
    • 内容がテキストかバイナリかは区別しない
    • regular file または normal file と呼ばれる(日本語訳はともに「普通のファイル」?)
  • ディレクトリ(directory)
    • 他の(広義の)ファイルを複数入れることができるファイル
    • UNIXでは伝統的にディレクトリのデータも単なるバイト列として読むことができたが、Linuxはそれを禁止している
  • シンボリックリンク(symbolic link)
    • 他のファイルの名前を格納したファイル
    • ソフトリンク(soft link)とも呼ばれる
    • シンボリックリンクにアクセスすると、カーネルはそれを「シンボリックリンクが指す先のファイル」へのアクセスへ置き換える
  • デバイスファイル(device file)
    • デバイス(ハードウェア)をファイルとして表現したもの
    • たとえば、/dev/sdaは1台目のSSDまたはHDDを表している(APIを使ってファイルにアクセスするとデバイスを操作できる)
    • 表現するデバイスによってブロックデバイスとキャラクタデバイスがある
      • 好きなときに、好きなところにアクセスできるのがブロックデバイス(キャラクタデバイスはその逆)
      • SSDとHDDは代表的なブロックデバイス、プリンタやモデムはキャラクタデバイス
    • 対応するデバイスがないデバイスファイルも存在する
      • /dev/null
      • /dev/zero
      • /dev/random
      • など
  • 名前付きパイプ
    • プロセス間通信に使うファイル
    • FIFOとも呼ばれる
  • UNIX ドメインソケット(UNIX domain socket)
    • プロセス間通信に使うファイル
    • 名前付きパイプはバイトストリームにしか使えないが、こちらはバイトストリームだけでなくデータグラムとしても利用できる

ファイルにはデータ本体のほかにも、さまざまな付帯情報が付属している。

  • ファイルの種類
  • パーミッション
  • サイズ
  • 更新時刻

広義のファイルについてのまとめ。

  • 何らかのデータを保持する
    • どのファイルも、とにかく何らかのデータを保持している
  • 付帯情報が付いている
    • 更新時刻などの付帯情報が付いている
  • 名前(パス)で指定できる
    • 名前で呼べることはファイルにおいて欠かせない特性

ファイルを扱うためには、ファイルシステムというOSの機能が必要。SSDやHDDの場合、まずディスクをパーティションという区画に区切る。そして、それぞれの上にファイルシステムを用意してマウントすることで、一本の巨大なディレクトリツリーができあがる。

mountコマンドを実行することで、パーティション(に対応するデバイスファイル)とマウント先、ファイルシステムを確認できる。

[vagrant@localhost ~]$ mount -t xfs
/dev/mapper/VolGroup00-LogVol00 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda2 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

ファイルシステム - Wikipedia

またprocfsやtmpfs、devfsといったデバイスの存在しないファイルシステムもあり、これらは 擬似ファイルシステム と呼ばれる。

3.2 プロセス

「プロセス」とは簡単にいえば 動作中のプログラム のこと。「プログラム」とはコンピュータに対する命令のことで、ソースコードをコンパイル・リンクすることで生成される、実行ファイルに格納されていることが一般的。プログラムを動かすと、動かすたびに新しいプロセスができる。

用語がわからなくなってきたのでいったん整理。

  • プログラム
    • コンピュータに対する命令を記述したもの
    • 実行ファイルのことをそう呼ぶことも多い
  • ソースコード
    • プログラミング言語で記述されたプログラム(テキストないしはテキストファイル)
  • ソースファイル
    • ソースコードと同意。文字列ではなくファイルであることを強調したいときに使う?
  • オプジェクトファイル
    • コンパイラがソースコードを処理した結果生成される、バイナリコードを含む中間的なデータ表現のファイル
  • 実行ファイル
    • コンピュータがプログラムとして解釈して実行できるファイル
    • リンカがオブジェクトファイルと他のライブラリなどを結合して生成する

第1章で作ったhello.cはソースコード(ないしはソースファイル)、gccでコンパイルした結果生成されたhelloはプログラム(ないしは実行ファイル)。

www.high-novice.com

helloプログラムを動かせば、そのたびプロセスが作られることになる。

1つのプログラムから何個でもプロセスが作れるということは、単なるhelloではプロセスが区別できない。そこで一意な プロセスID(PID) が振られている。

[vagrant@localhost ~]$ ps -ef | head
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 1202 ?      00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2     0  0 1202 ?      00:00:00 [kthreadd]
root         3     2  0 1202 ?      00:00:00 [ksoftirqd/0]
root         5     2  0 1202 ?      00:00:00 [kworker/0:0H]
root         6     2  0 1202 ?      00:00:00 [kworker/u2:0]
root         7     2  0 1202 ?      00:00:00 [migration/0]
root         8     2  0 1202 ?      00:00:00 [rcu_bh]
root         9     2  0 1202 ?      00:00:00 [rcu_sched]
root        10     2  0 1202 ?      00:00:00 [watchdog/0]

プロセスIDはコメントで明示的に使用することもあれば、Ctrl + Cなどで暗黙的に使用されることもある。Ctrl + Cを押すと、カーネルが該当プロセスに対して 割り込みシグナル(SIGINT) を送り、それを受け取ったプロセスが自発的に終了する。

シグナルの種類については次のサイトなどを参考に。

シグナル (ソフトウェア) - Wikipedia

3.3 ストリーム

英語でstreamといえば、「何かの細かい流れ」のこと。本書ではバイトの流れ、つまり バイトストリーム のこと。

本章で用いている「ストリーム」という用語は本書独自で、他のLinuxの書籍には本書でいうところの「ストリーム」は明確には出てこないので注意。本書でいう「ストリーム」は、他書では単に ファイルopen file と呼ばれている。

Wikipedia)からストリームの説明文を引用。

ストリーム(stream)とはデータを「流れるもの」として捉え、流れ込んでくるデータを入力、流れ出ていくデータを出力として扱う抽象データ型である。ファイルの入出力を扱うもの、メモリバッファの入出力を扱うもの、ネットワーク通信を扱うものなどさまざまなものがある。特にファイルの入出力には、標準ストリームと呼ばれる特別なストリームが用意されていることもある。

さらに他の書籍では、ストリームという語を次の2つの意味で使うことがある。

  • FILE型の値
  • STREAMSカーネルモジュール

本書では例外なく、「ストリーム」といったら「バイトストリーム」のこと。

  • ファイルにつながったストリーム
    • プロセスがファイルの内容にアクセスしたいときは、システムコールを使って、カーネルにファイルとつながるストリームを作ってもらう
    • そして、システムコールを使ってストリームを操作し、ファイルの中身を取り出す
  • デバイスにつながったストリーム
    • バイト列の流れとして考えられるものであれば、どんなものでもストリームにつなぐことができる
    • たとえば、SSDやHDD、キーボードのようなハードウェアもストリームとして扱える
    • デバイスファイルは、このようなストリームを得るための とっかかり として実は存在している
  • パイプ
    • バイト列が出入りする(読み書きできる)ものであるなら、なんでもストリーム
    • そのため、プロセスとプロセスをつなぐストリームも作れる
    • これは パイプ と呼ばれるもので、Linuxでは|という記号を使って簡単に扱える
  • ネットワーク通信
    • バイト列の書き込み元/読み込み先が別のコンピュータでも何の問題もない
    • これは ネットワーク通信 と呼ばれる
  • プロセス間通信
    • パイプやネットワーク通信のように、プロセスどうしがストリームを通じてデータをやりとりしたり意思の疎通をはかることを、一般に プロセス間通信 と呼ぶ
    • ただし、ストリームだけがプロセス間通信機構というわけではなく、たとえばPOSIX IPCと呼ばれるストリームを使わない機構もある

3.4 3大重要概念のまとめ

  • ファイルシステム
    • データに名前をつけて保存する場所
  • プロセス
    • 何らかの活動をする主体
  • ストリーム
    • プロセスがファイルシステムや他のプロセスとデータをやりとりする手段

わずかこれだけのしくみで、Linux OSの構造はおおむね語ることができてしまう。

本日はここまで。

はてなブログにGoogle AnalyticsとGoogle Search Consoleを導入してみた

以前Bloggerを少し触ってたことがあるんですが、そのときは特に設定をしなても各ページビューや流入キーワードなどが確認できました。

はてなブログにも アクセス解析 という機能がありますが、シンプルな機能となっており、詳細は確認できません。

というわけで、みんなどうしているのかな? と探してみたところ、サイト内のアクティビティ分析にGoogle Analytics、サイトへの流入分析にGoogle Search Consoleを使うのが王道のようです。ちなみにSearch Consoleは、以前はWebマスターツールと呼ばれていたそうです。

Google Analyticsの導入

はてなブログとAnalyticsはともにユーザーが多いので、探せばいろいろ情報が出てきますね。

今回は次の記事を参考にさせていただきました。

memobiz.net

「ステップ4:正確なアクセス解析のためのフィルター設定」の補足をしておきます。

IPアドレスを調べて除外設定をしているわけですが、ここで設定しているのはいわゆる グローバルIPアドレス というもので、PC一台一台に設定されているものとは異なります。この グローバルIPアドレス はどこに付与されているのかといえば、一般家庭であれば ブロードバンドルータ になります。

そのため調べる環境によって変化しますし、場合によっては自宅のアドレスが変化することもあり、その場合は再設定が必要なので注意しましょう。

Google Search Consoleの導入

Search Consoleの導入については、次の記事を参考にさせていただきました。

www.heymilelab.com

参考にする中で一ヵ所だけミスがあったので補足しておきます。

ブログURLの後に「 sitemap_index_xml 」を入力して、「送信」をクリック。

と紹介されていますが、実際に入力するのはsitemap_index.xmlです(スクショでは.xmlになっている)。

 

/// 2017/12/09追記 ///

どうやらsitemap_index.xmlだけでなく、sitemap.xmlも登録するとよいようです。

www.okigaru-migaru.net

/// 追記ここまで///

AnalyticsとSearch Consoleの連携

2つのツールの初期設定ができたので、最後に連携設定をします。ツールの連携も次の記事を参考にすることで、簡単にできました。

wacul-ai.com

まとめ

以上、はじめて導入してみましたが、解説記事も多いためそれらを参考にすることで思ったより簡単に導入できました。

まだ導入していない方は導入してみてはいかがでしょうか。

textlint-filter-rule-whitelistが外部ファイルに対応しました(v1.2.1)

textlintという日本語文章の校正に便利なツールを使っています。会社のブログでも紹介しました。

textlintのチェックルールはプラグインとして提供されています。その中にtextlint-filter-rule-whitelistという、指定した単語(または正規表現)をチェック対象から外せるフィルタルールがあります。

次のように.textlintrcに除外したい単語を指定することで、チェック時に無視できます。

{
  "filters": {
    "whitelist": {
      "allow": [
        "はてなブログ"
      ]
    }
  }
}

ただ単語が増えてくると.textlintrcが肥えていきそうだったのが気になりました。これをTwitterでつぶやいたところ開発者のazuさんに捕捉され、言われるがままissue立てたらあっという間に実装されてました(v1.2.1)。

圧倒的感謝。

これで次のように定義できるようになりました。

  • whitelist/proper-noun.yml
- はてなブログ
  • .textlintrc
{
  "filters": {
    "whitelist": {
      "whitelistConfigPaths": [
        "./whitelist/proper-noun.yml"
      ]
    }
  }
}

後はこのファイルに単語を追加していけばよくなりました。ファイルで分類することも容易にできます。便利!*1

実は実装の連絡をもらってアップデートしたらエラーで動きませんでした。結論としては、原因はatom pluginで使われているtextlintのバージョンが古いことでした。が、azuさんにhotfixで神速対応していただきすぐに使えるようになりました(v1.2.2)。

この辺のやりとりもissueでさせてもらいました。

github.com

issueオープンからリリースまで18分!

というわけで、ちょっとしたつぶやきから新機能を実装してもらえました。ありがとうございました!

(本当は自分でPR出せたらよかったなぁ)

*1:allowも引き続き使えます