R6/2/3 日経Linuxが休刊を迎えたことを知りました。もうLinux使っていませんが、お疲れさまでした。当ブログの更新はいつかまた、、きっと、、
roadtoalinuxmintuser

theming

roundup
スポンサーサイト

一定期間更新がないため広告を表示しています

| - |
CUI : Linux 使いの First Step 01:43


オープンソースであるということ


オープンソースソフトのほとんどは無償で利用することができますが、それはいわゆるフリーソフトとどう違うのでしょうか。英語の free には「自由」と「無償」という2つの意味があります。もともと「フリーソフト」の「フリー」は「自由」の意味で使われていました。自由に利用でき、自由に改変し、自由に公開できる、ということです。しかし、「無料」の側面ばかり注目されるようになってしまったため「オープンソース」という言葉ができました。

オープンソースの定義として以下の10項目が定義されています:
  • ソフトウェアを自由に販売したり無料で配布したりできること
  • ソースコードを入手できること
  • ソフトウェアを改良したり派生ソフトウェアを作成したりできること
  • 作者のソースコードの完全性を維持すること
  • 個人やグループを差別しないこと
  • 利用分野に対して差別しないこと
  • 再配布するときに追加ライセンスを必要としないこと
  • ライセンスは特定の製品に依存しないこと
  • 一緒に配布されるほかのソフトウェアを制限しないこと
  • 技術的に中立であること
オープンソースは「パソコンが広く普及した今、ソフトウェアは欠かせないものになっている。よく使うソフトウェアは自由に無料で開放するほうが、結果的にそのソフトウェアは広く普及し、それを土台に業界は発展してく。さらに、ソースコードを改良してくれる人がいるかもしれない。世界中に人々に検証・改良してもらうことによって品質を確保していく。」という考えのもとに推進しています。実際にこの考えはうまく入っており、Amazon や Google や Facebook などの IT 大企業はオープンソースのものを利用し、また開発も手伝っています。無償で提供してしまうと有料のソフトウェアが衰退していくのではと思うかもしれません。しかし、例えば、道路を思い浮かべてください。道路は私道や高速道路でない一般的な道路であれば、その利用は(見かけ上)無料であり、その上で、自動車や自転車の製造・販売や宅配便などのサービスが成り立っています。「公共財」としてのソフトウェアは社会全体の生産性を向上させます。

オープンソースソフトは無料で自由に使える代わりに、基本的にマニュアルやサポートが存在しません。いや、存在する場合も有ります。しかし多くは英語で書かれているものばかりか、英語を直訳した感じで読みにくいものばかりです(読みやすい場合も有ります)。なので、オープンソースソフトを使うには「自助努力」が大切です。「互いに助けあう」ことも大切です。オープンソースソフトは自分も育てあげていくんだという精神で使ってください。

その他にも、オープンソースを使う利点は
  • 教育コストを削減できる -> 教育格差の是正
  • コードが検証可能 -> 科学の「検証可能性」と相性が良い
  • コピーしてどこへでも持ち運べる


キーワード


頻出中の頻出キーワードを説明します。
キーワード意味
コミュニティ特定のソフトの開発者とユーザーからなる自発的な集まり。
カーネルOS の中核部分。ハードウェアを制御する。
パッケージソフトは複数のファイルから構成されていますが、それらを個々にインストールするのは面倒です。インストールしやすくまとめたものがパッケージです。
ディストリビューションカーネルだけでは使える OS にならないので、多数のソフトを組み合わせて配布(distribute)可能な形にしたもの。
シェルコマンドを解釈するソフト。bash や zsh など多数存在します。「端末」はあくまで画面表示機能を提供するソフト。


Linux を導入する方法


大まかに 4 つの方法が有ります:
  1. USB メモリーに導入する
  2. ハードディスクを付け替える
  3. デュアルブート
  4. 仮想化マシン
USB メモリーにインストールする方法がもっとも安価で無難です。その代わり動作が遅くなります。ハードディスクを付け替える方法では、例えば古くなったマシンを再生したり、自作 PC を組んだ時に Windows の代わりに使う方法としておすすめです。デュアルブートは既存の Windows や macOS X を破壊する恐れがあるので一番安全ではない方法です。仮想マシンを使う方法は、OS の上に OS を走らせるので、スペックが要求されます。また、仮想マシンを使う方法ならではのトラブルも有ります。

空の HDD に Linux Mint をインストールする方法は USB メモリーにインストールする方法とほぼ変わりません。仮想化マシンにインストールする方法はいずれ書きたいと思います:


(追記 2018/03/31)書きました:


シェルをちょっと使ってみる


Ctrl
+
Alt
+
T
を押して端末を起動します。端末が立ち上がると以下のような画面が表示されます:
shellingford@LinuxMint ~ $

これは環境によって表示される文字は異なります。「ユーザー名@コンピューター名 ワーキングディレクトリ$」という並びになっています。$ は # だったり、% だったりしますが、基本的に $ はユーザー権限を表し、# はルート権限を表しています。$ はプロンプトと呼ばれ「コマンドを入力してください」と待機していることを表します。

ところで、サイトを徘徊していると $ 付きで書かれるのが一般的です:
$ cal 2018
しかし、$ は入力する必要はありません。そこで初心者は $ も入力しエラーが返されること経験をします:
$: コマンドが見つかりません

では、なぜ $ まで書く必要があるのかというと、パソコンが表示する文字列とユーザーが入力する文字列を区別するために書かれます。例えば
ls
MEGA linux_signing_key.pub ダウンロード ピクチャ
New Unity Project out.png テンプレート ミュージック
Redmond-Themes sassc デスクトップ 公開
Unity-2017.3.0f1 snap ドキュメント
libsass vidlist.html ビデオ

とあるとどれを入力し、どれが表示される文字列か分かりません。そこで $ もつけて表記するのです:
$ ls
MEGA linux_signing_key.pub ダウンロード ピクチャ
New Unity Project out.png テンプレート ミュージック
Redmond-Themes sassc デスクトップ 公開
Unity-2017.3.0f1 snap ドキュメント
libsass vidlist.html ビデオ

これで「ls」が入力する文字で、それ以外はパソコンが表示する文字だとわかるのです。しかし、当ブログでは入力するコマンドは:
date
と表記し、表示されるメッセージは:
2018年  3月 11日 日曜日 14:58:47 JST

と表記することで、「初心者が誤って $ まで入力する」「コピペするとき $ が邪魔」「ユーザーが入力する文字列とパソコンが表示する文字列の区別がつかない」を解決しています。

引数とオプション


半角スペースを空けて与える情報を引数と呼びます。先ほど
cal 2018
というコマンドを示しました。2018 年のカレンダーを表示するコマンドですが、この例では「2018」が引数です。引数は複数与えることも出来以下の例では 2018 年の 3 月を表示します:
cal march 2018
      3月 2018         
日 月 火 水 木 金 土
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

-(ハイフン)をつける場合は「オプション」と呼ばれます。ディレクトリやファイルを表示する ls コマンドは -a (おそらく all の a です)をつけることで隠しファイルやディレクトリ(.から始まる)も表示することが出来ます:
ls -a
-l (おそらく long の l です)をつければ long な形式で詳細を表示します。主にパーミッションを調べるのに使います:
ls -l
オプションはまとめてこのように書けます:
ls -la

Tab キーと↑↓キーの利用


Tab
を押すと自動で補完できる場合が有ります。例えばワーキングディレクトリがホームディレクトリ(/home/ユーザー名/ のこと。表現方法は $HOME や ~ があります)の時に、ワーキングディレクトリを「ピクチャ」に変えたいとします。以下のコマンドをうちます:
cd ピ
cd は change (working) directory を表しています。この状態で
Tab
を押すと残りの「クチャ/」まで補完されます。また
を押すと前回使ったコマンドを再現できます。このことはとても有用なので知っておくべきです。

↑キーで履歴を遡るのが面倒な時


コマンドの履歴を 30 とか 40 とか遡らないといけないようなときは hitstory コマンドを使うべきです:
history出力例:

Shift
+
PageUp
で一ページ分上にスクロールできます。
Shift
+
PageDown
で一ページ分下にスクロールできます。実行したいコマンドの番号を覚えたら ! を先頭につけて番号を入力します:
!992

コマンドの履歴を検索


コマンドの履歴を遡る方法を 2 通り見てきました。1 つは矢印キー、1 つは history コマンドです。しかし、一行一行コマンドを見ていくのではなく、特定の文字列でコマンドの履歴を検索したい場合はどうしたら良いのでしょうか。

端末で
Ctrl
+
R
を押してみましょう。コマンドの履歴を検索するモードに切り替わります:
(reverse-i-search)`’:

このように表示されたら、探しているコマンドの一部を入力してみましょう。途中からでも構いません。文字を入力するに連れて、自動的にコマンドの履歴から検索されます。対応するコマンドが見つかれば、表示されます。

表示されているコマンドではない場合は、更にもう一回
Ctrl
+
R
を押してみましょう。次にヒットするコマンドが表示されるはずです。これはちょうどテキストエディターで、
Ctrl
+
F
を使って検索しているような感じです。検索モードを終了するには
もしくは
を押します。

Ctrl + C の利用


Ctrl
+
C
を押すとコマンドの実行の途中で、その実行を強制終了させることが出来ます。sleep コマンドは指定した時間だけ処理を停止するコマンドです。以下のコマンドは 5 秒処理を停止させます:
sleep 5
5 秒後にプロンプトに戻るはずです。次はこの処理中にキャンセルしてみましょう。上のコマンドを実行した後に、すぐ
Ctrl
+
C
を押すとすぐにプロンプトに戻るはずです。コマンドの処理を途中でキャンセルしたい場合に活用してください。

入出力リダイレクト


出力は通常モニターやプリンターに、入力は通常キーボードやマウスで行いますが、より抽象的に入出力を行うことでソフト同士のやりとりが容易になります。まず最初に画面以外に出力できることを経験してみましょう:
echo HelloWorld! > output.txt
更に、cat コマンドで output.txt の中身を見てみます:
cat output.txt
出力例:
HelloWorld!

echo の出力先を画面からファイルに変更することが出来ました!また、同じテキストファイルに違う内容を入力してみましょう:
date > output.txt
出力してみます:
cat output.txt
出力例:
2018年  3月 11日 日曜日 16:45:44 JST

date コマンドの出力先がテキストファイルに変わりました。しかし、HelloWorld! が消されてしまいました。つまり上書きされたのです。追記したい場合はどうしたらいいでしょうか。>> と 2 回続けます:
date >> output.txt
出力してみます:
cat output.txt
出力例:
2018年  3月 11日 日曜日 16:45:44 JST
2018年 3月 11日 日曜日 16:48:24 JST

追記できたのがわかります。次はファイルから出力する方法を見ていきましょう。bc コマンドは計算を処理するコマンドです。Linux Mint には標準で入っています。まずは 1+2 と書かれたテキストファイルを用意しましょう:
echo 1+2 > output.txt
この式を bc コマンドに渡します:
bc < output.txt
出力例:
3

このように、出力先をファイルに変えることを「出力リダイレクト」と言い、入力元をキーボードからファイルに変えることを「入力リダイレクト」と言います。

パイプの利用


上記の例では echo と出力リダイレクトを使って output.txt を生成し、内容を書き込み、入力リダイレクトを使って bc コマンドにファイルから式を渡して、計算結果を画面に表示させました。言わば output.txt を中間ファイルとして使っているわけですが、この中間ファイルを生成させずに直接コマンドの出力を別のコマンドの入力として渡す方法が有ります。それがパイプという仕組みです。以下のコマンドを実行してみてください:
echo 1+2 | bc
出力例:
3

パイプを使うことで処理を高速化することが出来ます。

バックグラウンドで実行


コマンドの最後に「 &」を追加して実行すると画面外でそのコマンドが実行されます。例えば sleep コマンドは指定した時間が経つまで、プロンプトに戻りませんが、「 &」を末尾につけるとすぐプロンプトに戻ります:
sleep 10 &
画面内に戻したい場合は fg (foreground)コマンドを使います:
fg
逆に、画面内で実行していて、途中から画面外(バックグラウンド)で実行したくなる場合も有ります。その時はコマンドを実行した後
Ctrl
+
Z
を押してコマンドの実行を停止させた後、「bg」と入力することでバックグラウンドで再開できます:
sleep 10
Ctrl
+
Z
を押して停止させた後:
^Z
[1]+ 停止

bg 1
という風に「bg ジョブID」で再開できます。fg コマンドを使えば sleep 10 が裏で実行されているのがわかるはずです:
fg

ワンライナーでプログラミング


プログラミングというと Java や C 言語という、いわゆる「プログラミング言語」を使って作る、大掛かりなものを連想しがちですが、ここでのプログラミングはシェル上で一行のコマンドとして実行する小さなプログラムです。このようなプログラミングスタイルを「ワンライナー」と呼んでいます。すでに我々はワンライナーを経験しています。それはこれです:
echo 1+2 | bc
このようにいくつかのコマンドを | などを利用してつなげていきます。

変数


プログラミングを始めるにあたり、最初に登場するのが変数です。例にもれずここでも最初に変数を取り上げます。シェルでの変数以下のように定義します:
x=3
使うときは $ を変数名の前につけます:
echo $x
コマンドの出力を変数に代入することも出来ます。コマンドをバッククォートではさみます:
d=`date`
echo $d

上の二行のコマンドは一行にまとめてこう書くことも出来ます:
d=`date`;echo $d
出力例:
2018年 3月 11日 日曜日 17:58:58 JST

しかしながら、バッククォートで挟むやり方よりも $(コマンド) 形式のほうが推奨されています。他人のスクリプトを読むときはバッククォートでコマンドを実行しているんだなとわかる程度で、実際に自分でスクリプトを書く場合はこちらの形式に従いましょう:
d=$(date)
echo $d

ネスト(入れ子)もできます:
echo "hello1 $(echo hello2 $(echo hello3))"
出力例:
hello1 hello2 hello3

シェルにはシェル変数が用意されています。たとえば、コマンドの実態を探すディレクトリが格納されている PATH 変数やデフォルトのシステム言語がセットされている LANG 変数、0 から 32767 までの整数をランダムで出力する RANDOM 変数、ホームディレクトリのパスが格納されている HOME 変数などが有ります。これらも利用するときは変数名の前に $ をつけます:
echo $LANG
出力例:
ja_JP.UTF-8

繰り返し制御


シェルでは繰り返しに for 文を使います。フォーマットは以下のとおりです:
for i in {1..5}; do 繰り返したいコマンド; doneあるいは for((i=1;i<=5;i+=1)); do 繰り返したいコマンド; doneどちらも同じ結果です。{1..5} は 1 から 5 まで繰り返す書き方で、{2..10} とかでも構いません(2 から 10 まで一個ずつ繰り返します)し、((i=1;i<=5;i+=1)) は ((i=2;i<=10;i+=2)) とかでも構いません。i+=2 でどれだけ増やしていくかを指定しています。2 なので 2 4 6 8 10 と増えていきます。
ファイルも扱うことが出来、例えばワーキングディレクトリの中で txt ファイルのみを表示したい場合はこのような書き方になります:
for i in *.txt; do echo $i; done*.txt にマッチしたファイルの一つ一つが変数 i に代入され、それを echo $i で出力しています。*.txt があるだけ繰り返し行われます。
出力例:
output.txt

awk の利用


awk は空白や行で区切られたテキストを処理するためのコマンドです。ワンライナーで使うととても便利なコマンドです。例えば以下のコマンドを実行してみてください(注意すべてき点はバッククォートではなくシングルクオートであるということです):
echo 1 2 | awk '{print $1+$2}'
出力例:
3

まず echo で出力するデータをパイプで awk に渡しています。$1 には 1 が格納され、$2 には 2 が格納されています。print は awk の持つ「データを表示するコマンド」です。シェルの持つコマンドではありません。なので awk '{}' の中の世界はシェルとまた別の世界だと思ってください。

応用


ここで実用的な一行プログラムを作成したいと思います。ワーキングディレクトリ内の png ファイルをすべて jpg ファイルに変換します。まず ImageMagic をインストールしてください:
sudo apt install -y imagemagickパスワードの入力が求められるので自分がログイン時に使用するパスワードを入力し
Enter
を押します。
続いて、適当にワーキングディレクトリに png 形式の画像を適当にダウンロードしてください。その後次のコマンドを実行します:
ls *png | awk '{printf "convert %s %0.5d.jpg¥n",$1,NR}' | sh
もし、ファイル名にスペースが入っているとうまく処理できませんが、これでワーキングディレクトリ内のすべての png 形式の画像が連番がふられた jpg 形式の画像に変換されます!
少し説明を加えると、
ls *pngでワーキングディレクトリの png ファイルを出力しています。その出力結果を awk に流し、一行一行'{}' の中のコマンドが実行されます。printf は画面に表示するコマンドです。printf "" の中の文字列を出力します。%s は受け渡されたファイルをそのまま出力します。%0.5d は頭部が 0 で埋まった 5 桁の整数を出力します。残りの $1 は ls *png で流れてきた png 形式のファイル名が格納されていきます。NR は行数が記録されていきます。これらの $1 と NR がそれぞれ %s と %0.5d に代入されていくのです。最後に sh で出力したコマンドを実行していきます。

次のコマンドでは html 形式で書かれたテキストファイルの内、表示される文字数を表示します。実行する前に output.txt に適当に html を記述してください:
tr -d "¥n" < output.txt | tr -d " " | sed -e 's/<[^>]*>//g' | wc -m
tr コマンドは(おそらく trim から取られていると思います)文字の置換や削除を行うコマンドです。-d オプションを指定することで指定した文字(ここでは改行。改行は ¥n で表します)を削除します。output.txt に書かれた文字列からまず、改行を取り除きます。これは改行も1文字とカウントされるからです。更にパイプで再度 tr コマンドを使って「 (半角スペース)」を削除しています。次に結果を sed に流しています。sed も与えた正規表現で文字列を置換したり削除したりするためのコマンドです。ここでは html タグを取り除いています。最後に文字数をカウントする wc コマンドに結果を流しています。-m をオプションをつけることでマルチバイト文字(日本語など)を 1 文字とカウントします。これで自分の書いた原稿がどれくらいの文字数がわかります。

終わりに


いかがでしたか。GUI で行う操作は直感的である反面自動化がしにくいです。GUI で行う操作は習得に多少の時間が必要ですが、なれると素早くできる利点があります。Unix の設計思想の中に「各プログラムが一つのことをうまくやるようにせよ」という言葉があります。echo や ls 自体は「これだけで一体なんの役に立つの?」という感じのコマンドを組み合わせることで強力な一行プログラムになることを学びました。

最後にちょっとだけ。以下のコマンドはワーキングディレクトリをミュージックに移し、ネットからビープ音の音源をダウンロードしそれを beep.wave と名づけて保存するコマンドです:
cd ミュージック && wget -O beep.wav http://anime.geocities.jp/combatbutler_combatbutler/music/A-Tone-His_Self-1266414414.wav
その後、次のコマンドを実行してみてください。3 分後に指定したファイルを鳴らす一行プログラムです:
sleep 180 && aplay beep.wavカップラーメンの時間を測るのにちょうどいいタイマーの完成です :P

参考元 : 『入門者のLinux』『1週間で LPIC の基礎が学べる本』
| Linux |
<< NEW | TOP | OLD>>
スポンサーサイト 01:43
| - |

Show some apps list:


miku

Follow on your feed reader:


About this blog:

Linux Mint-centric chronicle with anime girls since 2009.Best View with Google Chrome 1980x1080 dimension.
Info 更新は不定期です。

script

LinuxMint ISO 日本ミラーサーバー:




Amazon: