tkd2017の勉強ブログ

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

はてなブログでTwitterアカウントへのリンクと画像サイズの指定をする

新年明けましておめでとうございます。今年も一年、良い年となるよう頑張っていきたいと思います。

年末年始はAWSの各サービスを調べて、自分なりにまとめて消化していました。これについては会社のブログで近々公開予定です。

あんまり期間が空いてしまうと書くモチベーションも下がってしまうので、はてなブログで記事を書く中で調べたTipsを2つばかり紹介します。

なお編集モードは Markdown で確認しています(他のモードは未検証)。

Twitterアカウントへのリンク

はてなブログでは、はてなダイアリーと共通の はてな記法 が使用できます。どうやらマニュアルからは消えているようですが、次の記法が使用できます。

[twitter:@ユーザー名]

使用例は次のようになります。

@

はてなブログ記事にTwitterアカウントのリンクを埋め込む - ぱと隊長日誌

画像サイズの指定

こちらもはてな記法で対応できます。

  • 横幅指定(例として100px)

[f:id:tkd2017:20181234567890p:plain:w100]

  • 高さ指定(例として100px)

[f:id:tkd2017:20181234567890p:plain:h100]

使用例は次のようになります(w100を指定)。

f:id:tkd2017:20171225013642p:plain:w100

リンクを簡単に記述する(http記法、mailto記法) - はてなダイアリーのヘルプ

まとめ

基本的にMarkdownで記述できるため書きやすいですよね。

またはてな記法も併用することで、HTMLタグを直接使わずに書くことができます。

今後も新しいTipsを見つけたら紹介していきたいと思います。

2017年の振り返り

早いもので2017年も大晦日です。 笑ってはいけない を見ながら今年を振り返ります。あと赤霧島のロックを飲んでいます。

霧島酒造 赤霧島 25度 900ml

霧島酒造 赤霧島 25度 900ml

大きなイベントとしては、今年は転職という節目の年となりました。これについては退職者アドベントカレンダーに参加したエントリで書きました。

www.high-novice.com

というわけで、それ以外のことについて書くことにします。

前職からの学び

転職をして仕事の内容は変わりましたが、それでも前職で身についたものは現職でも役立っています。仕事をしている中であらためて気付いたことを書いてみます。

技術的なことやビジネスマナーなど、そういうありきたりなものは置いておきます。

文章チェック

前職では研修生へ配布する資料を作ったり、研修担当者へ送付する報告書を作っていました。自分の作成物はもちろんのこと、他人の作成した文章にも目を通す機会が多くあったため、 日本語として意味が通じるか誤字・脱字 などをチェックしていました。

現在ではほぼ無意識にこの辺をチェックしてしまい、小説やブログを読んでいる際にも気付くことが多くあります。

学生時代、作文などは不得意な分野であったため、なかなか身につけにくいスキルを習得できたのかなと今では思っています。

結論から

これはビジネスマナーの範囲の気もしますが、現職では部長クラスの人へ直接報告する機会が多くあります。その際、 結論を先に述べ詳細は後で ということを念頭に置いて報告するようにしています(前職でも直属の上長は部長でしたが)。

どうしてもゼロから順番に説明したくなってしまいますが、最初に結論を持ってくることで、伝えなければいけないことがブレずに済みます。

新人の方や、報告がうまくできない方は、結論から伝えようと努力してみてください。

来年は見直したい

2017年はあまり(あるいはまったく)できなかったことの反省。

読書

今年はそもそも読書量が少なく、来年はもう少し増やしていきたいです。まぁラノベとかは読んでるんですけどね。あ、りゅうおうのおしごと!アニメ化おめでとうございます。楽しみにしてます。

今年は藤井四段や羽生永世七冠など、将棋界は話題にこと欠かない一年でしたね。一ファンとして、とても楽しみにしていました。タイトルは三冠が不在の群雄割拠といった趣で、来年も非常に楽しみです。

OSS(オープンソースソフトウェア)

今までは社内へのコミットしかできていませんでした。「エンジニアとしての市場価値を高める」ために積極的に社外へのコミットをしていきたいです。

引き続き来年も頑張ること

2017年の取り組み始めたことで、来年もチャレンジしていきたいこと。

ブログ

新しくブログを始めました。また仕事でもブログでのアウトプットが求められています。できるだけ一定のペースで続けられるようにしていきたいです。

「ブログ書きたい」というモチベーションを大事にしていきたいですね。

AWS

入社前から基本的なサービスは触っていましたが、全体から見ると本当に一部だけでした。現職ではAWSの知識がないとそもそも仕事にならない部分があります。

勉強方法のひとつとして、AWSの認定資格があります。

  • Solutions Architect Associate
  • Developer Associate
  • SysOps Administrator Associate
  • Solutions Architect Professional
  • DevOps Engineer Professional

この5つは社内では5冠と呼ばれています。 5冠ないと人権がありません。 またさらに上位に次の2つの資格もあります。

  • Advanced Networking Specialty
  • Big Data Specialty

現在はSolutions Architect Associateしか持っていませんので、2018年は残りの4つを目標にして、5冠を目指していきます。

まとめ

さて、今年も残すところ後30分ほどとなりましたね。

テレビでは松本が蝶野にビンタされる直前です。

来年もよい一年にしていきましょう。

Vagrantで起動したCentOS 7に日本語ロケールがない問題

便利ですよね、Vagrant。使ってますか? 先日、起動したVMに日本語ロケールがなかったので、その対処法を紹介します。

環境

今回の環境は次のようになっています。

Vagrantに限らず、同様の問題が発生した場合は、同じ解決方法が使えるはずです。

$ vbox-img --version
5.2.2r119230

$ vagrant --version
Vagrant 2.0.1

$ vagrant box list
centos/7         (virtualbox, 1710.01)

問題の再現

次のコマンドを実行することで問題の再現が可能です。

$ vagrant init centos/7

$ vagrant up && vagrant ssh

[vagrant@localhost ~]$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

locale: Cannot set LC_XXX to default locale: No such file or directoryというメッセージが表示されています。

localectlコマンドを利用することで、ロケールがないことを確認できます。

$ localectl list-locales | grep '^ja'

解決方法

本来ならすべてのロケールが入っているはずですが、何らかの理由で見つからない場合、再インストールすればよいようです。

[vagrant@localhost ~]$ sudo yum reinstall -y glibc glibc-common

[vagrant@localhost ~]$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

$ localectl list-locales | grep '^ja'
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

解決方法の調査には少し時間がかかりましたが、対策は非常にシンプルでした。

はてなブログ内の外部リンクにつけるアイコンを制御する

何度も更新しては記事にしていますが、前回はこんなことをしていました。

www.high-novice.com

これで外部リンクは別タブで開き、さらにアイコン付与ができたわけですが、プロフィール画面がこうなっていました。

f:id:tkd2017:20171223124310p:plain:w500

うーん、これはちょっとアレですね。

というわけで、外部リンクであっても画像の場合はアイコンを付与しないようにします。

構造の確認

ChromeのDevToolsを使って確認してみます。

f:id:tkd2017:20171223125134p:plain:w400

aタグの子要素としてimgタグがあります。つまりアイコンを付与するのは 外部リンクのaタグ かつ 子にimgタグをもたない ということになります。

これはCSSでは難しい(というかできない?)のですが、jQueryでは簡単に実現できます。

設定変更

設定は毎度お馴染み、詳細設定の 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')
      .not(':has(img)').append('<i class="fas fa-external-link-alt" style="margin-left: 3px"></i>');
})
</script>

$el.not(':has(img)')によって、$elのうち、子要素にimgタグをもたない要素のみを対象に操作をすることができます。

結果は次のようになりました。

f:id:tkd2017:20171223124403p:plain:w500

まとめ

最近のフロント開発ではAngularやReactにおされjQueryの出番は減ってきていますが、こういうちょっとした操作にはとても便利ですね。

Google AdSenseの審査に通過しました

12月8日に申請したAdSenseですが、12月21日についに有効化のメールが届きました。

f:id:tkd2017:20171223010954p:plain:w300

どうしてこんなに時間かかったのか不明です。年末で忙しかったのかな?

申請前にやったこと

AdSenseの審査をパスするためのノウハウはいろいろな人がブログにまとめてくれていますね。

検索してよさそうな記事を探して参考にしました。

koreimakaidesuka.hatenablog.com

独自ドメインやGoogle Search Console、Google Analyticsは設定して記事も書きました。

www.high-novice.com

www.high-novice.com

追加で、お問い合わせフォームプライバシーポリシーも作りました。

申請時と通過時のサイト状況

簡単にまとめてみました。

項目 申請時 通過時
日付 12月8日 12月21日
記事数 *1 11 15
PV 8 133
総PV 55 664

PV伸びているのは退職者アドベントカレンダーに参加したためです。

フォローボタンや外部リンク、画像などはあまり気にせず普通に使っていました。

差し戻されたこと

まともに申請する前に何度かつまずいていました。遠回りした記録については次の記事にまとめてあります。

www.high-novice.com

これとは別につまずいた点として、過去に別のメールアドレスでAdSenseのアカウントを作っていたらしく、ポリシー違反で差し戻されました。

結局過去のアカウントを削除して、新しいメールアドレスで再申請しました。

まとめ

約2週間と、時間はかなりかかりましたが無事に申請が通って一安心です。

とはいえ、AdSenseの使い方をきちんと理解できていないため、いろいろ自分で触ってみます。

*1:お問い合わせとプライバシーポリシーは除く

時間に厳しい仕事から自由な仕事に変わった話し

この記事は退職者その2 Advent Calendar 2017の20日目です。

たまたまアドベントカレンダーを覗いたときに残り3枠で、ブログはじめてすぐだったこともあり、勢いで登録してしまいました。

adventar.org

前日は@さんの6回目の転職をして7社目に入社した話でした。

総論

今年の9月に約10年間務めた前職を辞め、10月に現職クラスメソッドへと転職しました。

前職では主として講師業をやっていました。1年の中では新人研修が一番の繁忙期となり、遅刻厳禁ですし、おちおち体調崩して休むわけにもいきませんでした。

現在はエンジニアとして自社サービスの開発や保守運用などを行っていて、フレックス&リモートワーク推奨のため、働き方の自由度が非常に高いです。

前職の話し

最初にも書きましたが前職では講師をやっていました。担当した研修をざっと書き出してみました。

  • 未経験者を対象としたプログラミング言語研修
    • Java
    • PHP
    • JavaScript
    • Node
    • C
    • C#
    • Visual Basic
    • Ruby
    • Python
    • Go
  • データベースの入門研修(DB固有というよりSQLなどを中心とした操作方法の習得)
    • Oracle
    • SQL Server
    • MySQL
    • PostgreSQL
    • MongoDB
    • Redis
  • サーバやネットワークなどのインフラ研修
    • Linux
    • Windows Server
    • ネットワーク基礎(TCP/IP)
    • Ciscoルータ/スイッチ
  • 暗号技術やWebシステムの脆弱性などを扱ったセキュリティ研修
  • クラウド(AWS)を利用したシステム構築の研修

など。ほかにもフレームワークやビジネスマナーなど、挙げてみるとたくさんありますね。かなり幅広く身につけられましたし、業務としても活躍できる機会を与えてくれたことは非常に感謝しています。

また局地的に勤務時間が伸びる期間もありましたが、仕事自体はわりと自由にやらせてもらっていました。

勤務時間ですが、1年という単位で見ると、かなり勾配が激しいです。4月から7月くらいは新人研修という1年の中でも特に繁忙期となり、朝は8時半から夜は20時過ぎまで(場合によっては22時過ぎまで)、研修生と一日中対面して過ごします。遅刻欠勤はもってのほかです。

逆に閑散期で研修がなければ、フレックスでそれなりに自由度がありました。

とはいえ、まぁどこも同じだと思っていますが、やらなければいけないことは多く、それはそれでたいへんではありました。

これが、2017年の9月までのお話しです。

現職の話し

10月から現職になったわけですが、フレックスのコアタイムが11時〜15時となっており、夜の21時以降は勤務禁止となっています。またリモートワークが推奨となっており、ほとんど出社しないという人もいます。もちろん事前の申請は必要ですが、お堅いものではなく、さくっと申請も終わります。

極端な話し、コアタイムだけをリモートワークする日があってもよいわけです。先日もAmazon Echoが日本で発売されましたが、当日受け取るためにリモートしてましたし、セットアップの流れをブログ書いたりしてました(基本的にブログも業務時間に書きます)。

業務としては自社サービスの開発や保守運用、エンハンスなどやりたかったことがちゃんとできています。

またAWSのエキスパートはもちろんのこと、セキュリティやJava、モバイル(Android/iOS)など多彩なエンジニアがいる環境で、刺激を受けながら毎日を送っています。

控えめに言って、めっちゃ楽しいです。

転職までの経緯

ここで終わってもよいですが、最後に転職までの経緯を残しておきます。

2016年の末ごろからぼんやりと転職を意識するようになりました。動機は2点あり、1点は環境を変えたかったこと。もう1点はエンジニアとしてキャリアを積みたくなったことです。当初から転職は選択肢に入っていましたが、まずは現状を変えられないか現職でもどうにかならないか、なども考えていました。

年末年始はいろいろな企業の会社概要などを見て過ごしていました。そうするとSESを主な事業としている企業はどこ行っても同じだなと(わかってはいましたが)再認識し、行くなら自社サービスを持っているところだなと気持ちが固まりました。

そんなわけで、1月中は次のような条件を念頭に置いて探しつつ、履歴書や職務経歴書を書く中でスキルの棚卸しをしていました。これらの条件を洗い出した段階で、現職では無理だなという判断もできました。

  • 自社サービスを持っている
  • プログラミングがちゃんとできる
  • 会社全体にエンジニア気質がある
  • 社外に技術的な情報発信をしている
  • 働き方の自由度が高い

2月の中旬くらいからいくつかの会社にエントリして転職活動が始まりました。特にエージェントや転職サイトは使いませんでしたが、Wantedlyだけはサービス開始当初に登録のみしていたことを思い出し、プロフィール欄などを埋めて少し使いました。

個人的に少し意外だったのは、志望はPG/SE職だったのが、スカウトが来るのはインフラが多かったことです。あとはスタートアップの「何でも屋さん」。企業を訪問して話しを聞く中で、定期的に外の人と交流はもつべきだな、ということも考えるようになりました。

ありがたいことに書類選考で落とされることはほぼなかったんですが、面接の時間が業務都合で 20時30分開始 ということも多く、方々にはご迷惑をかけてしまいました。

そんなこんなで4月の頭には内定をいただくことができ、上長に退職の意志を伝えました。当時の上長は、この辺はドライというか割り切った考えをしていたので、特に揉めごとにもならず退職の日程などすんなり決まりました。

最初にも書きましたが、実際の転職時期は10月だったので、内定いただいてから半年くらい間が空きました。入社時期については相談すればおそらく柔軟に対応してもらえるはずなので、そこで躊躇する必要はないはずです。

これから転職する人へのアドバイス

いま転職/退職を考えている人向けに、ささやかながらアドバイスを送ります。少しでも参考になれば。

  • 転職する目的をはっきりさせ、自分の言葉で話せるように
  • 「退職願」と「退職届」は別物です。「退職届」を出しましょう
  • 文面は手書きと印刷に違いはありません。私は手書きでした
  • 退職届に記述する「退職日」は結構重要です(保険料が変わってくる)。土日であっても、月末の日付を書きましょう
  • 退職届を入れる封筒ですが、郵便枠なしはなかなか見つかりません。こだわりたい人はAmazonなどで購入しておきましょう
  • 万が一に備えて 退職届は写真に撮っておきましょう

まとめ

ひょんなことから退職エントリを書くことになりましたが、振り返ってみると、約1年前のちょうど今ごろもやもやしてたわけですね。

今現在、転職を悩んでいる方は、まずは自分のやりたいことや現状の何が不満なのかを書き出してみることをお勧めします。そうすると今の環境でも何とかなるのか、それとも別の環境へ移った方がよいのか、その辺が明確になってきます。

一番ダメなのは、面接中に「どうして転職するんですか?」と聞かれて、きちんと自分の考えを説明できないことです。

それでは、これを読まれた方の一人でも、よい転職のきっかけになればうれしいです。

マルアイ 二重封筒 長3郵便枠なし 10枚 フ-70

マルアイ 二重封筒 長3郵便枠なし 10枚 フ-70

明日は@さんです。

[ふつりな 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など、ほかにもたくさん。それ自体はストリームからコマンドを読み込んで実行しているだけだが、そのストリームは端末につながっていることもあれば、つながっていないこともある。