-*- ReasonSet -*-

パソコン全然わからならい彼女に教える基礎知識(まとめ)

これは、パソコンを全く使えないわけではないけれど、普通に使えるかというと疑問符のつく彼女に、結婚後事業を手伝ってもらうために必要となる最低限の知識を今のうちに覚えてもらうために、毎日ちょっとずつ覚えて欲しい内容をメールしていたもののまとめです。

習得知識に偏りがありますが、ごく基礎となる知識を、ちょっとずつ覚えられるようになっています。これは、とにかく覚えるものです。

送ったメールそのままの転載です。

Day1: プログラムとは

今日から一日1回くらい、コンピュータの勉強をいれていこう。 ちょっとずつだから、確実に覚えて欲しい。 ----- コンピュータに何かさせるための指示の集まりがプログラム。 コンピュータが扱うプログラムは機械語。基本的に人間が読めるものではない(古代には読める超人もいた)。 人間がプログラムを書くための言葉がプログラミング言語。 大抵のプログラミング言語は「英語っぽい」(数学っぽいのもある) プログラミング言語は1000を越える種類があると言われている。 プログラミング言語は機械語ではないので、それをコンピュータが実行できるようにするには機械語に変換する必要がある。

Day2: コンピュータの構成部品

コンピュータの部品のお話。 --*--*- 一般用語 -*--*-- IC=チップ : 複雑な機能を果たすためにまとめられた半導体 チップセット : チップのまとまったもの プロセッサ : 計算用のIC メモリー : 記憶装置。計算結果を一時的、もしくは恒久的に記録するもの 揮発性 : 電源を切るとデータが消える 不揮発性 : 電源を切ってもデータが消えない 一次記憶装置 : 計算のために必要なデータを記録するもの。普通は揮発性メモリー 二次記憶装置=ストレージ : データを保存するためのもの。 --*--*- 部品 -*--*-- ※コンピュータの機械はMB+CPU+メモリー+ストレージ+電源+グラフィックボード+ディスプレイ CPU=MPU : コンピュータ全体の計算をするプロセッサ。コンピュータの頭脳。性能は速度・処理効率・コア数・スレッド数・アーキテクチャ・消費電力・搭載するキャッシュ用不揮発性フラッシュメモリー・使用可能なメモリーなど(実際の性能の数値化はできない) マザーボード(MB) : コンピュータの様々なICを載せるための基盤。これ自体も色々ICを載せている(例えばGPUが載っているものもある)。性能は機能・消費電力・規格。 メモリー=RAM : 用語としては正しくないけれど、一次記憶装置の揮発性メモリー。SSDの50-100倍程度高速。性能は速度=規格・信頼性。 SSD : 不揮発性フラッシュメモリー型のストレージ。容量は小さいけれど高速。構造はHDDと全く異なる。性能は速度・耐久性・信頼性・容量・転送規格。HDDの10-100倍程度高速。 HDD : かなり昔からある磁気ディスク方式のストレージ。遅くて壊れやすいけれど大容量。性能は速度・耐久性・信頼性・容量・転送規格。 電源 : 電気をためて分配する装置。大事。性能は容量・変換効率。 GPU : 画像を処理するためのプロセッサ。特に3D画像をその場で計算して作り出すゲームでは激しく使われる。映像出力も担当。性能は結局のところの速さと、消費電力。 グラフィックスボード : 実際にGPUを載せた部品。性能は搭載GPU、映像出力端子数、同時に出力可能な画面の数、出力可能な画面の規格(GPUにも依存する)。 ディスプレイ=モニター : 画面。性能は画素数・対応モード・色の表現力・チルト機構・入力端子数、などなど。 --*--*- 余裕があれば -*--*-- * 昔々はGPUは別途グラフィックスボードが必要なものだった * 昔はトータルで安くしたい場合向けに、GPUを搭載したMBがあった * 今はそのような場合のためにCPUにGPUを搭載した製品がある * 私が使っているAMD APUシリーズは、CPU内蔵GPUながら、安いグラフィックスボード並の性能なのがウリ

Day3: OS

=== OSとは === * 土台になるソフトウェア * 本来的には機械を動かすためのソフトウェア(狭義) * ただし、製品として人が使うソフトウェアまで含めたパッケージを指すこともある(広義) * OSの中でも中核になるのがカーネル。カーネルの上で動くのがユーザーランド * 動くソフトウェアは、CPUを直接叩くのでない限りOSに依存する。だいたい、そんなことをするとOSと共存できなくなる === OSと関連用語 === [ Windows ](OSパッケージ名) Microsoft社の製品。人が使うためのアプリケーション・ソフトウェアを含むパッケージ。 有料。結構高い。 現在、デスクトップ向け(x86とARM)、サーバー向け、携帯端末向けがある。 [ MS-DOS ](OSパッケージ名) Microsoft社の昔のOS。以前はWindowsがMS-DOS+GUIの構成になっていた。 現在はMS-DOSを発展させたものがCMD.EXE(コマンドプロンプト)として残る。 [ PC-DOS ](OSパッケージ名) IBM版MS-DOS。基本的には同じもの。私が最初に使ったOS。 [ Mac ](コンピュータシステム名) Appleの展開するコンピュータ・システム。 OS(Mac OS X)だけでなく、本体を含む。拡張機器もオプションで、Apple製品によってのみ拡張されることになっている。 Mac OS XをApple製以外のコンピュータにインストールすることは、不可能ではないけれど禁止されている。 BSD系のNeXTSTEP+Mechから生まれた、マイクロカーネル採用のBSD系UNIX OS。 [ iOS ](OS名) AppleのiPod, iPad, iPhoneが採用するモバイルデバイス向けOS。 [ UNIX ](OS名・総称) 1970年代後半に登場したOS。ミニコンピュータ(パソコンよりも大きく、大人数で同時に共有するタイプのコンピュータ)のOSを入れ替えるために作られた。 世界初の「違う種類のハードウェアに移植できるOS」。 オリジナルのUNIX(AT&T SYSTEM)はそのソースコードが公開されており、色々な人・企業が改良版を制作。 結果として互換性のない大量の方言ができ、権利関係で揉めて空中分解。 大きく分けるとAT&Tが作ったSystemV系と、BSD(カリフォルニア大学バークレー校)の2種類。 現存する一般的なUNIXはSolaris(SysV, Oracle), OpenSolaris(SysV), FreeBSD(BSD), NetBSD(BSD), OpenBSDとmac OS X。 [ Linux ](OS名) 1992年にUNIX互換のOSとして作られたUNIXライク(UNIXっぽい。UNIX系とも)OS。 自由なライセンスを採用しソースコードで配布。異なるアーキテクチャ向けバイナリを生成できるため、様々なデバイスで動作可能。 他のOSと違い、公式にユーザーランドを含んだパッケージがないため、 様々な人・団体がユーザーランドをパッケージして配布している。これがLinuxディストリビューション。 Mageia, openSUSE, Vine Linux, Manjaro LinuxなどはLinuxディストリビューション名。 [ Android ](Linuxディストリビューション) Googleが制作するモバイルデバイス向けLinuxディストリビューション。 ただし、カーネルレベルでもかなり手が入っており、「AndroidはただのLinuxディストリビューションではない!」とか。 --- 以下はあんまり覚えなくていい。 --- [ FirefoxOS ](Linuxディストリビューション) Mozillaが開発するモバイルデバイス向けLinuxディストリビューション。 日本でも搭載機発売済み。 [ Open webOS ](Linuxディストリビューション) Oracle主導で開発されているモバイルデバイス向けLinuxディストリビューション。 日の目を見ることはなさそう。今のところ日本語が使えない。 [ Tizen ](Linuxディストリビューション) The Linux Foundation主導で開発されているモバイルデバイス向けLinuxディストリビューション。 Docomoが出す!と2012年から話題にはなっている。 [ MeeGo ](Linuxディストリビューション) The Linux FoundationのMaeMoとIntelのMoblinが一体になって、Nokia主体で開発されていたモバイルデバイス向けLinuxディストリビューション。 ユーザーランドがだいたいLinux向けのものがそのまま動く。 NokiaがWindows Phoneを使っていたけれど、Windows Phoneを離れた関係で、 後継プロジェクトだったTizenを「あれとMeeGoは違う」と言い出して開発を再開。 未来はたぶんない。 [ UbuntuPhone ] Canonicalが開発するモバイルデバイス向けLinuxディストリビューション。 Ubuntuを展開してLinux界を支配したCanonicalはこれに力を入れているらしいが、なかなか進まない。 [ Kubuntu Active ] Canonicalが開発するモバイルデバイス向けLinuxディストリビューション。 Plasma Activeデスクトップを利用し、ほぼLinuxのいつものユーザーランドを使うもの。 スマホよりはもっと画面の大きいタブレット向け。 タブレットを普通にコンピュータとして使う道を拓くかもしれない? (単にタッチデバイス向けのUIを搭載したLinuxだから)

Day4: アーキテクチャ

--*-- アーキテクチャとは --*-- アーキテクチャは機械語の種類。異なるアーキテクチャの機械語はCPUは理解できない(から、プログラムは動かない)。 アーキテクチャはベースになるものと拡張されたものと最適化されたものがある。 ベースになるものは、「何語」か。 拡張されたものは、「専門用語」。拡張命令を使っている場合、CPUがそれを理解できないと動かない。 ただし、逆に拡張命令を使っていないなら、拡張命令を理解するCPUは実行できる。 最適化は、CPUが機械語を実際にはどう処理するか、というのに合わせて機械語を組み替えるもの。 その人に合わせて言い方を変えるのに似ている。 最適化は異なるターゲットCPUでも動くことは動く(ただし、効率が悪いと思う)。 --*-- 主なアーキテクチャ --*-- [ x86 = IA32 ] Intelの32bitアーキテクチャ。実際はベースになるものがi386,i586,i686の3種類。 AMD CPUもx86。現在のIntel/AMDの64bit CPUはx86も理解する。 [ x86_64 = EM64T = amd64 = x64 ] AMDがx86を拡張して作った64bitアーキテクチャ。現在の主流。 [ IA64 ] Intelの64bitアーキテクチャ。x86と互換性がないので、絶滅寸前。 [ ARM ] AndroidやiPhoneなどのモバイルデバイスによく使われるアーキテクチャ。現在の伏兵。32bit。 拡張命令の種類によってARM vなんちゃらという名前になっている。 64bitのARM64も準備中。 [ Power ] IBMのCPUのアーキテクチャ。普通の人が見ることはない。 --*-- IntelとAMD --*-- Intel = CPU界の覇者。いわばAKB。 AMD = IntelアーキテクチャのCPUで、安さと性能の良さで戦うマイナー系。いわば乃木坂。 AMDのAPU(CPUにGPU乗っけたやつ)はグラフィック性能がCPU内蔵のくせに結構いい、というのがウリ。 PlayStation4もAMD APUのすごいやつが載っているらしい。

Day5: プログラミング言語基本

基本は命令+それに与える値 print("Hello, world!\n") 式も書ける。 print(10 + 15) Perlはカッコ必須。 print("Hello, world!\n"); Rubyはこれに加えてカッコ省略も可能(状況による) print "Hello, world!\n" 命令(関数・メソッド)に与える値は「引数(ひきすう)」という。 引数は複数取る場合、その中で省略できる場合、任意の数書ける場合もある。 1つから3つの引数を取るPerlの関数、open open(FH, "file", "r") #ファイルハンドルFHとして、fileを、読み取りモード(r)で開く printfは最初に最初の引数をフォーマット文字列として、それ以降の値をその引数とする。 %sは文字列、%dは数値として置き換える。 printf("I love %s %d days!\n", "Mizuki", 365) #=> I love Mizuki 365 days! ちなみに、printfは桁数、0詰めなど色々できる。 printf("%02d %s", 5, "How are you?") #=> 05 How are you? カッコは 関数() なのでスペースを入れてはいけない。 print("Hello") はOK。 print ("Hello") はエラー。

変数

ここは「なんとなく」理解してほしい。 ##### 変数 ##### 変数は、値を格納する名前。数学(xなど)と同じ。 PerlやRubyなどでは代入式は= ----- x = 10 ----- これでxは10。だから ----- print x + x # => 20 ----- Rubyの場合、通常の変数(ローカル変数)は[_a-z]で始まり、[_a-zA-Z0-9]が続く。 Perlの場合は、$ではじまるスカラー変数、@ではじまる配列、%ではじまるハッシュがある。 ----- $x = 10; print($x + $x); # => 20 ----- シェルでは代入時は$なし、参照時は$をつける。代入式にスペースは入れられない。 ----- x=10 let $x + $x ----- ##### 値、参照 ##### Perlは値か代入かを指定できる。 ----- $x = 10; # $xには値 10 が入っている $y = \$x; # $yは$xへのリファレンスである。$yは$xを指している $x = 20; # $xに 20 を代入する print $$y; # $yの参照先(=$x)を解決する。$xは20なので、20。 print $y; # 単純に$yを文字列にするとリファレンスが返るため意味不明になる。 ----- これが違いになるのが、関数内で値を扱う時。 単純に値だと、関数では元の値を変更することはできない。 ----- sub func { # 関数func $_[0] = $_[0] + 2; # => 12 } my $x = 10; # => 10 func($x); print $x; # => 10 ----- しかし、リファレンスならできる。 ----- sub func ($) { $$_[0] = $$_[0] * 2; # => 20。*は「かける」 } my $x = 10; func(\$10); # => リファレンスを渡す print $x; # 20。 ----- ただ、普通は値で渡して、値を返して代入するもの。 ----- sub func ($) { #ひとつめとだいたい同じ my $x = $_[0] + 2; return $x; # $xの値を返す } my $x = 10; # => 10 $x = func($x); # $xの値を私、返ってきた値を$xに代入 print $x; # => 12 ----- Rubyでは小さな整数とシンボルだけが値。小数を値にする計画もあるらしい。

配列・ハッシュ

今回からは、ちゃんと覚えなくても、みてれば自然に覚えるので、 軽く頭に入れておいて。 ##### 配列=リスト ##### 配列は順序を持った値を格納するもの。 Perlのリスト @a = ("a", "b", "c"); RubyのArray a = ["a", "b", "c"]; リファレンスかどうかは、中を変更できるこの手のコンテナでは重要になる。つまり ----- sub change_array { my array = @_; #渡されたリストを代入 $array[1] = "B"; #リストの2番芽の要素を大文字に return undef; } @a = ("a", "b", "c"); #リスト change_array(@a); #リストを渡す print $a[1]; #リストの2番めの要素を出力。b。つまり変わっていない ----- しかし、配列のリファレンスならそれ自体(その値でなく)を渡すことになるので ----- sub change_array (@) { my array = $_[0]; #リストを代入したリストを作るのではなく、受け取ったリファレンス(値としてはスカラー)を代入している。だから、前回は@array(リスト)だったのに対し、今回は$array(スカラー) $$array[1] = "B"; #リストの2番芽の要素を大文字に return undef; } @a = ("a", "b", "c"); #リスト change_array(\@a); #リストのリファレンスを渡す print $a[1]; #リストの2番めの要素を出力。B。変更が反映されている。 ----- これを意識しながら手動でやるあたり、Perlは古いなと感じるところ。 重要なのは、Rubyでは配列は参照で渡される「オブジェクト」なので、その配列を変更すると呼び出し元でも変更されている、ということ。 ##### 連想配列=ハッシュ=マップ=ディクショナリ ##### 連想配列は順序でなく名前でアクセスできる。ただし、順序は失われる。 (Ruby 1.9以降はハッシュでも順序を保持するようになった) データの格納に非常に適したもの。ここではRubyで説明。 ----- h = { "Constructor" => "YAMAHA", "Name" => "MT-09" } puts h["Name"] #=> MT-09 ----- KVSとも言われるハッシュ。添字に使われる値をキーという。 Rubyではキーはなんでも良い。が、オブジェクトは変更されてはならない。 Perlはキーは常に文字列となる。 重要なのが、配列は後ろに値を入れると、それが格納できるだけの途中の領域もいきなり確保されること。 ----- a = Array.new a[100000] = "A" #=>いきなり100001個の領域が確保されてしまう。 ----- けれど、ハッシュならキーはただの名前なので、確保されるのは1つだけ。 ----- h = Hash.new h[100000] = "A" #=>100000というキー1個分が確保されるだけ。 ----- 柔軟で非常に使いやすく、データ格納では定番。

データ型

とりあえず、「文字」という概念は忘れてくれ。 ##### 文字列 ##### 文字を並べたもの。""や''で囲む。 Perl/Rubyでの両者の違いは、特殊文字を解釈するかしないか。 ----- "Hello\n" #=> Helloのあと改行。\nが改行 'Hello\n' #=> Helloのあと\nという文字列が続く ----- 数値は数。数字は文字。この用語の区別はしっかりと! "や'中の"や'は、\を前に置くとエスケープできる。 ----- "How are \"You\"" #=> How are "You" ##### 数値 ##### 数。 10 #=> 10。(Integer / Fixnum) 0x10 #=> 基16の10。つまり16。 (Integer / Fixnum) 10.05 #=> 小数。浮動小数点数。 (Float) -10 #=> -10。 (Integer / Fixnum) マイナスも書ける。 1_000_000 #=> 1000000。(Integer / Fixnum)。_は単純に無視される 5.274e-4 #=> 科学的指数表記法。 5.274 ^ 10-4。つまり0.0005274 計算できる。+(加算),-(減産),*(乗算),/(除算),%(剰余),**(累乗)。累乗は**が普通なのに、書く時は^が主流。 10 * 25 #=> 250 8 / 3 #=> 2。Rubyでは整数/整数では余りは捨てられる。 8 & 3 #=> 2。余りが2だから。 ##### 他の例 ##### [ "A", 10, x ] # 配列 { "A" => "a", "B" => 25 } # ハッシュ (10..25) # 範囲 /^R\w+y/ # 正規表現 ##### 注意点 ##### Perlは型を暗黙に変換し、Rubyは型を意識する。よって文字列+数値は @Perl print("10" + 20, "\n"); #=> OK。30。 @Ruby puts("10" + 20) #=> エラーになる。文字列と数値をたそうとしているから。 @Ruby puts("10".to_i + 20) #=> 明示的に文字列 "10" を数値 10 に変換した。

オブジェクト指向

関数では、関数が渡された値の面倒を見る。つまりは ----- call(cat) #=> にゃーにゃー。 call(dog) #=> わんわん。 ----- この場合、callが「catだったらにゃー」という記述をしなくてはいけない。 つまり、callは渡される値の面倒をみなければいけないし、 渡される可能性のある全ての動物(以外も?)について予め書いておかなくてはいけない。 つまり、動詞が主体で目的語を渡す。動詞+目的語。 オブジェクト指向は主語+動詞のスタイル。動詞は主語に属している。 ----- cat.call #=> にゃーにゃー dog.call #=> わんわん ----- この場合、cat.callはcatの定義に、dog.callはdogの定義にかかれている。 cat.callとdog.callは全くの別物。 クラスベースのオブジェクト指向ではkind of(〜の一種)がインスタンス=オブジェクトになる。 つまり、 ----- #猫というもの class Cat def call puts "にゃーにゃー" end end nyao = Cat.new #nyaoという名前のCat(のひとつ) nyao.call #にゃーにゃー ----- 色々便利。

ブロック

Rubyの便利機能。メソッドに対してコードのかたまりを渡すことができる。 例えばArray#eachは配列の要素ひとつずつに対してブロックを呼ぶ。 ----- a = [ "Apple", "Orange", "Banana" ] # 配列 a.each do |i| #配列に対してeachを呼び、ブロックをつけている。 printf "This is %s\n", i end #=> 結果 This is Apple This is Orange This is Banana ----- |i|というのは、ブロックを呼び出す時に渡される値を格納する名前。Array#eachは配列の各要素1つずつなので、1つ。 do〜endの代わりに{〜}も使える。意味は少しだけ変わる。

PureDoc

さて、ついに実際に使うもの。私が作っているドキュメント記述形式。 見出しはh1〜h6メソッド。引数として見出しに使う文字列を渡す。 ----- h1 "第一章" ----- 本文はpメソッド。pメソッドはブロックが配列を返し、配列のひとつの要素がひとつの段落になる。つまり ----- p { [ "第一段落", "第二段落" ] } ----- しかし見づらいので、改行する位置を変えて次のようにしたほうがいい。 ----- p {[ "第一段落", "第二段落" ]} ----- ブロックと引数両方とる場合はカッコ省略不可。nは注釈。 n(注釈) { 注釈がつく本文 } の形。 ----- n("これは注釈") { "注釈がつきます" } ----- 今すぐ覚えなくていいけれど、主要なところ * リスト li { [項目1, 項目2 ... ] } * 順序付きリスト ol { [項目1, 項目2 ... ] } * 名前付きリスト dl { [見出し1, 内容1, 見出し2, 内容2 ... ] } * リンク l(見出し, アドレス) * 変数 v(文字列) * 識別子名 i(文字列) * コンピュータの値 val(文字列) * 強調 e(文字列) * 引用 q { 引用文 } とはいえ、h1,h2,h3,h4,p以外を使うことはあまりない。

改行、スペース、インデント

プログラムは厳密に書かなくてはいけない。人間のように綴りが違っても大抵の場合こうだろうな、などとは解釈してくれない。 改行やスペースもきちんとした意味を持つ。 スペース、タブのように区切りとして理解される文字を「ホワイトスペース」という。 Perlでは改行は単なるホワイトスペースとして理解される。Rubyは文末として理解されるため、継続することが明らかな場合を除いて改行はいれられない。 Rubyでも空行は単に無視される。また、連続するホワイトスペースは単一のホワイトスペースであると理解される。 関数/メソッド呼び出しのカッコはホワイトスペースを置いてはならない。 func(arg1, arg2) Rubyではifなどの制御式はホワイトスペースを置いてはならない。 if(condition) カンマで区切る引数の間はスペース置いてもおかなくてもOK。カッコ、ブレース、配列リテラルの中などのホワイトスペースも無視される。 [ a , "b" , 125] #これでもOK 改行は文ターミネーションになる。 print "Hello\n" #Rubyは改行で文を終了 print "Hello\n"; #Perlはただのホワイトスペース。;で文を終了。 Rubyで改行が文ターミネーションにならないのは、例えば --- *カンマで終わる* [ a, b, c ] *次の行がメソッド呼び出し* cat .mew *条件のない条件式* if true *文に分解できないカッコが閉じていない* method( arg1, arg2 ) *演算子の相手がいない* x + y -----
Since: 2015-01-18 09:01:18 +0900
Last update: 2015-01-17 23:47:55 +0900
About