40日目:Ruby Ⅲ:関数の集合体メソッドを使いこなそう (メソッド、引数、戻り値、キーワード引数)
<学習日>
40日目
<学習内容>
① Ruby Ⅲ (0-100):関数の集合体メソッドを使いこなそう (メソッド、引数、戻り値、キーワード引数)
<参考>
Progateレベル:171
<学習内容詳細>
今日はRuby3つめの単元を完了させました^^
メソッドについて一通り勉強することが出来ました!
① Ruby Ⅲ (0-100):関数の集合体メソッドを使いこなそう (メソッド、引数、戻り値、キーワード引数)
基本的には詰まる可能性があるのは、「戻り値を使用した場合の値の動き方」と思いますが、もう他の言語で何回も少し複雑なcodeで頭を捻ってきたので、多少表現がことなる言語になっても、特に躓くことなく進めることが出来ました!
ではさっそく、具体的なcodeを見ながら、振り返っていきましょう^^
・メソッドの定義と呼び出し
メソッドとは処理をまとめて実行する関数のようなものである。
実際の定義と呼び出しは以下のとおり。
<定義>
def introduce
puts "こんにちは"
puts "薬膳です"
end
<呼び出し>
introduce
<出力>
こんにちは
薬膳です
呼び出すときは、メソッド名を出すだけでOK。
・引数を使用して、汎用的なメソッドを作成しよう。
引数とはメソッドを実行するときに、外部から個別の値を受け取る枠のようなもの。
具体的なcodeは以下のとおり。
<定義>
def introduce(name, age)
puts "こんにちは、私の名前は#{name}です。#{age}歳です"
end
<呼び出し>
introduce("薬膳"、30)
<出力>
こんにちは、私の名前は薬膳です。30歳です。
このように、複数の引数を設定でき、値を渡すことができる。ただし、呼び出し時には、引数と同じだけの値を指定する必要がある。
例では1人分だけだったが、100人分ともなるとこの方式の方が効率が良いし、WEBサービスを考えると、ユーザー登録時の情報をそのまま引っ張ってくれば、リストの作成が自動化できる。
・戻り値を使って、より汎用的な使い方が出来るようにしよう
戻り値とは、メソッドを呼び出したときに、その呼び出しもとに特定の処理をした後の値を返すことが出来る機能。
具体的な使用例は以下のとおり。
<定義>
def introduce(name)
return name
end
<呼び出し、受け取り、出力>
myname = introduce("薬膳")
puts "私の名前は#{myname}です"
<出力>
私の名前は薬膳です
値を数字や条件式にすると、プログラミングとしての汎用性が上昇するイメージ。今回の例は分かりやすさ重視だったが、数字の例の方がいいかも。
ということで、数字の場合は以下のとおり。
<定義>
def calc(a, b)
return a + b
end
<呼び出し、受け取り、出力>
sum = calc(2, 9)
puts "合計は#{sum}です"
<出力>
合計は9です
このように数字の計算結果を返すことが出来るので、様々なケースにおいて、計算結果によって表示を変えたりという応用が見据えられる。
また、条件式を返すこともできる。この場合はif文と組み合わせて、メソッド呼び出し時の値によって、出力を分けることが出来る。
<定義>
def rideon_ok?(a)
return a >= 120
end
<呼び出し、受け取り、出力>
if rideon_ok?(100)
puts "120cm以上なので乗れます"
else
puts "120cm未満なので乗れません"
end
<出力>
120cm未満なので乗れません
ここで注意したいのは、メソッド名の?の役割で、結論から言うと?はなくてもよい。
true or falseの値を持つメソッドは、慣例的に?を末尾につけるというだけ。
また、returnには「そこで処理終了」という機能があるので、ifと組み合わせることで、メソッド内で条件ごとに戻り値を変化させることが可能である。
(ifでtrueの時の処理内容がreturnだった場合、その条件式がtrueになった時点で、return以下の処理はなされない)
・キーワードで引数を指定する方法がある。
具体的なcodeは以下のとおり。
<定義>
def introduce(name:, age:, height:)
puts "こんにちは、私の名前は#{name}です。#{age}歳の#{height}cmです"
end
<呼び出し>
introduce(name:"薬膳", age:30, height:120)
<出力>
こんにちは、私の名前は薬膳です。30歳の120cmです。
ただ単にめんどくさいだけのように見えるが、汎用性がぐっと増す。
なお、ただの引数と違って、メソッドの呼び出し時に、値を各順番はどうでもよい。キーワードと紐づけして、メソッドに値を入れにいくからである。
例えば、呼び出しは
introcude(age:30, height:120, name:"薬膳")
でも全く同じ出力になる。
ということで、本日の勉強は終わりです。
次回からは、おそらく最後のキーワード引数をWEBアプリで汎用すると、どんな使い方があるのかを勉強できるのかなと予想しております^^
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
39日目:Ruby Ⅱ:nilとif文、要素にハッシュを持つ配列とeach文 (if nil条件式、each ハッシュ配列の繰り返し処理)
<学習日>
39日目
<学習内容>
① Ruby Ⅱ(61-100%):nilとif文、要素にハッシュを持つ配列とeach文 (if nil条件式、each ハッシュ配列の繰り返し処理)
<参考>
Progateレベル:168
<学習内容詳細>
今日はRubyの2つ目の単元を終わらせました^^
他の言語で苦しんだeach文を用いた繰り返し処理でしたが、さすがに何回も今まで似たことを繰り返してきたので、問題なく学習完了です!
① Ruby Ⅱ(61-100%):nilとif文、要素にハッシュを持つ配列とeach文 (if nil条件式、each ハッシュ配列の繰り返し処理)
さてRubyの基礎編あたりが終了した感じでしょうか。
nilをfalse扱いにする特性を用いてif文の条件式にぶっこめるという内容は、私にとっては初耳で勉強になりました。
後半のeach文+ハッシュを要素に持つ配列で繰り返し処理を実施する、という内容はそこそこプログラミングっぽくて好きなのですが、すでにほかの言語で概念は理解しており、あまり学ぶことはなかったかなという印象です^^;;
ではさっそく、実際のcodeを挙げながら、振り得っていきます!
・値がない場合は「nil」という値が返ってくる。ここで「nil」には「false」と同じ意味があることを利用して、「if」文と組み合わせることが出来る。
例えば、指定の値にデータが入っている時にはその値を、値が入っていないときには別の文言をアウトプットする場合は、以下のとおり。
test = {name:"math" }
if test[:point]
puts test[:point]
else
puts "点数は分かりません"
end
このように、点数のデータがあるときには、その点数をアウトプットし、点数のデータがない場合は「点数はわからない」というコメントを出力することが出来る。
ifの後の条件文が条件文っぽくないけれど、ここで「nil」が返ってきた場合には「false」と同じ解釈をif文がすると考えればよい。
・要素がハッシュの配列の扱い方
例を挙げると次のような使い方をする。
users = [
{name:"Ken", age:25}
{name:"John", age:30}
]
puts users[0][:age] ⇒ 25がアウトプットになる。
出力時には、配列のいくつめのハッシュかを最初に指定して、続けてハッシュのキーを指定すると、対応する値を呼び出せる。
また「each」と組み合わせることで、ハッシュを要素に持つ配列を定義するだけで、一気に大量のアウトプットを出力できる。
例えば上記のusersの配列に対して、以下のような使い方をする。
users.each do |user|
puts "#{user[:name]}の年齢は#{user[:age]}歳です"
end
⇒
Kenの年齢は25歳です
Johnの年齢は30歳です
というアウトプットになる。eachにはendが必要なので、忘れないように注意する。
さらに年齢が不明な人がいるような場合には、each文の中にif文を組み込む。具体的には以下のとおり。
users.each do |user|
if user[:age]
puts "#{user[:name]}の年齢は#{user[:age]}歳です"
else
puts "#{user[:name]}の年齢は不明です"
end
end
if文に対するendと、each文に対するendの両方を忘れないように注意する。
明日からはより実用的なRubyの実用例について学べると思っています!
ワクワクですね^^
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
38日目:Ruby Ⅱ:配列とハッシュを使おう(配列、インデックス、ハッシュ、キー)
<学習日>
38日目
<学習内容>
① Ruby Ⅱ(0-60%):配列とハッシュを使おう (配列、インデックス、ハッシュ、キー)
<参考>
Progateレベル:166
<学習内容詳細>
本日はRubyの続きを進めていきました^^
今日の内容も、他の言語で勉強した概念だったので、比較的サクサクと進めることがあ出来ました!
① Ruby Ⅱ(0-60%):配列とハッシュを使おう (配列、インデックス、ハッシュ、キー)
はい、ということで基本的には配列やハッシュを扱う導入編という感じです!
ハッシュという言葉はプログラミングの勉強をし始めてからは初めてですが、PHPでいうところの連想配列と同じです^^
ではさっそく具体的なcodeをみながら、進めていきましょう。
・配列について
複数のデータを持つデータのことを「配列」という
具体的には以下のとおり。
names = ["Ken", "John", "Taro"]
このように、変数に配列を定義することが可能である。
また、配列には左から順番に数字を振ってあり、これをインデックスという。
0から始まり、順番に増えていく。
上記の例でインデックスを指定せず出力した場合と、指定して出力した場合を具体的に示すと以下のとおり。
puts names ⇒ Ken John Taro
puts names[1] ⇒ John
・繰り返し処理
eachを用いる方法についての具体的なcodeは以下のとおり。なおnames配列は、上記のものとする。
names.each do |name|
puts "彼の名前は#{name}です"
end
これで出力は以下のとおりとなる。
彼の名前はKenです。
彼の名前はJohnです。
彼の名前はTaroです。
・ハッシュとは
配列がただの値の羅列であったのに対して、ハッシュとは「キー」と「値」が紐づけられた配列である。
具体的なcodeとしては、以下のとおりである。
man = {"name" => "Ken", "age" => 20, "height" => 178}
ハッシュをそのまま呼び出すと、ハッシュのまま出てくる。これは配列をそのまま呼び出すと、配列の中身が整理されて出てくるのと対照的。
puts man ⇒ {"name" => "Ken", "age" => 20, "height" => 178}
これだと使いようがないので、基本的にハッシュを用いる場合には、ハッシュとキーを組み合わせてアウトプットさせる。
puts man["age"] ⇒ 20
のようになる。
また、キーの中の値の書き換えや、新しいキーと値の組み合わせの追加は、後から以下のようにcodeを書けば実行できる。
man["name"] = "John" :これでmanハッシュのnameの値はJohnに修正される。
man["weight"] = "70" :これでmanハッシュに、weightキーが追加され、値は70となる。
このように、修正も追加もcodeは一緒であり、すでにあるキーを指定した場合は修正になり、ないキーを指定した場合は追加になる。
なおハッシュには3種類書き方があるので全て列挙すると以下のとおりであり、一番下の省略形が一番よくつかわれる。
man = {"name" => "Ken", "age" => 20, "height" => 178}
man = {:name => "Ken", :age => 20, :height => 178}
man = {name: "Ken", age: 20, height: 178}
下2つの書き方をした場合は、呼び出すときも少し方法が異なり、以下のように""ではなく:で呼び出すこと。
puts man[:name]
はいということで、今回はここで終わりです。
次回からはnilというnodataの処理の仕方を勉強していきます!
感想というのかなんというのか、ハッシュの省略形がPHPではデフォで出てきたので、どちらかというと省略前の書き方が違和感がありましたね^^;;
短いは正義ですので、きっと省略形に慣れておけば大丈夫と信じています!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
37日目:Ruby Ⅰ:まずはRubyを触ってみる 慣れたら簡単な条件分岐を作成する
<学習日>
37日目
<学習内容>
① Ruby (0-100%):まずはRubyを触ってみる 慣れたら簡単な条件分岐を作成する(puts、文字列連結、四則演算、展開関数、条件分岐)
<参考>
Progateレベル:163
<学習内容詳細>
日本ではまだまだ現役のRubyについて勉強していきます^^
全世界的にRubyの人気は右肩下がりではありますが、まだまだ国内での現場では使用率が高いので、勉強の価値がないわけではない。
むしろ初学者であれば、ある程度は知っておく必要がある言語であると思います。
(特に海外でプログラマーとして就職するわけでないのであれば)
ではではさっそく単元の内容に入っていきましょう!
① Ruby (0-100%):まずはRubyを触ってみる 慣れたら簡単な条件分岐を作成する(puts、文字列連結、四則演算、展開関数、条件分岐)
はい、ということで、最初の単元なので超簡単です。
項目数は多いですが、逆に1つ1つが「こんなcodeあるよ」くらいのノリなので、サクサク進められます^^
また、ここまででPHPやJavaも学習してきているので、内容自体は殆ど変わらず、少し書き方が違う部分があるのかなくらいでした^^;;
ではさっそく実際のcodeも挙げながら、振り返っていきます!
・値を表示させる
puts 値
・codeの実行性のないコメントを残す
# コメント
シャープの列はcodeが実行されず、アウトプットに何も影響しない
・文字列と数字は明確に異なる
””や’’で囲った中身は、文字列として認識される。
puts 8 + 2 ⇒ 10
puts "8 + 2" ⇒ 8 + 2
と表示される。
・文字列を連結させたい場合
puts "私は" + "人間だ" ⇒ 私は人間だ
・変数には文字列も、数字も値として入れることが出来る
text = "こんにちは"
puts text ⇒ こんにちは
width = 4
height = 3
puts width * height ⇒ 12
変数を使って、連結や数字計算も可能
・変数の命名時に2語以上の単語から付けた名前は_で繋ぐこと
○user_name
×usernameとかuserName
PHPだと2単語目以降の頭文字を大文字にするだったのに、Rubyだとアンダーバーで繋ぐ文化みたい
・変数は後から更新したものが優先される
width = 7
処理A
width = 13
処理B
この場合、「処理Aではwidthは7」と扱われ、「処理Bではwidthは13」と扱われる。
・変数に特定の演算をする場合
name = 1
足し算:name += 2
引き算:name -= 2
掛け算:name *= 2
割り算:name /= 2
余り:name %= 2
で表現できる。
・展開関数:文字列の中に変数を突っ込む方法
例えば「私は○○歳です」という文章を書きたくて、○○の部分を変数で定義していたとしたら、以下のようなcodeとなる。
puts "私は#{age}歳です"
なお、””でないと変数が展開されないので注意が必要。
・大小比較の演算子
Aより大きい:変数 > A
A以上:変数 >= A
Aより小さい:変数 < A
A以下:変数 <= A
Aと同じ:変数 == A
Aと違う:変数 != A
・条件分岐(if、elsif、else)
例えばscoreが100点だったら”すばらしい”、60点以上だったら”合格です”、60点未満だったら”不合格!”と表示させたい場合のcodeは以下のとおり。
if score == 100
puts "素晴らしい"
elsif score >= 60
puts "合格です"
else
puts "不合格!"
end
elsifでeが省略されるのが面白かった。
・条件式の「かつ」「または」
かつ:条件式A && 条件式B …
または:条件式A || 条件式B …
・全体的に衝撃だったのは、;などで演算実行を区切るコマンドが一切なかったこと。書くのは手間じゃないけど、逆に読みにくいような気もする。
こんな感じです。どちらかというとcode表みたいになっちゃいましたね^^
次の単元以降、どんどん骨太になってくると期待しています!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
ネット炎上後の好ましい対応について 【Twitterの事例から学ぶ】
さてタイトルにあるとおり、ネットで炎上してしまったときの対応について、本日みかけた事例を自分なり解析して、「炎上後の好ましい対応」ついて整理してみようと思います^^
ちなみにその方に対しては、特に何の感情も抱いておりません。
(フォロワーさんのリツイートで目に留まったので、炎上問題について、自分なりに分析してみようという感じですね)
【目的】
先人の事例を冷静に分析して、自身が炎上してしまったときに慌てないようにする。
【結論:好ましい対応】
①自分が悪かったと思っている箇所については「言い訳をせず」誠意をもって謝罪する。
②謝罪する場合には「何に対して謝罪」しているのか、可能な限り「明示」する。
③「不確実なこと」については、「事実」と「意図」を切り離して記載する。
④逆に本心から悪いと思っていない内容があるのであれば、その点については「自分の信念」を貫く
⑤謝罪中に「謝罪以外の情報」は「発信しない」ようにする
【状況整理:概要のみ】
1. 当事者はDMで感情的になってしまい、相手に対して激怒してしまった。
2. 当事者は怒ったことにはそれなりに理由がありそうではあったが、ですます調の相手に対して、常時威圧的な口調で応対していた。
3. DMをしていた相手にスクショを公開されて炎上した。
4. この炎上がきっかけで、ある事実について「言った言わない論争」が発生した。
【実際の対応内容:概要のみ】
1. DMで激怒したことについて、謝罪・反省の意を示している。
2. DMで激怒した理由について、理由や背景を説明している。
3. DMで激怒した相手に対しては、具体的に何かを慮った発言はしていない。
4. 炎上から派生した「言った言わない問題」について、誤解をとくための説明をしている。
5. 最終的に「言っていない」と明言している。
6. 最後の締めに「自分の立場を弁えて」これからは気を付ける、という結びがある。
【各論】
では結論至るまでの考察を、各々書いていこうと思います。
①自分が悪かったと思っている箇所については「言い訳をせず」誠意をもって謝罪する。
基本中の基本かと思います。
何か揉め事があった時点で、謝罪以外にも「言いたいこと」や「伝えたいこと」があることが多いと思いますし、そのこと自体は悪いことだとは思いません。
ただ、「言いたいこと」や「伝えたいこと」があるのであれば、余計に「聞く側の態勢」をよく考える必要があるはず。
自分に落ち度があるのであれば、まずは「誠心誠意」謝罪をするのが先決だと思います。
今回の事例は謝罪に入り、謝罪に終わっているので、その点はとてもよい対応だったのではないかと考えます。
②謝罪する場合には「何に対して謝罪」しているのか、可能な限り「明示」する。
自ら弱いところを全力でさらけ出せる人は、最終的に愛されるだろうと考えています。
つまり、自分が悪かったと思っている「一番痛いところ」を、「明示」することが一番効果的な謝罪方法だと考えています。
これは「激怒してしまった」とか、「罵詈雑言を浴びせてしまった」とか、そういう非明示的な方法ではなくて、「具体的にはこう言った」ことが否応なしに分かる方法が好ましいと思います。
今回の例ですと、問題になった「DMの実際のスクショ」が一番いいのではないでしょうか。
これは当事者にとっては「死ぬほど嫌」でしょうし、「死ぬほど難しい」ことだというのは想像に難くないのですが、だからこそ「普通は出来ないからこそ」そうした場合には効果が大きいのではないかと思います。
特に自分から提示しなくても、少し調べればわかってしまう「隠せない事実」なので、いっそのこと、自ら晒してしまった方が、受け手の納得感は増すのではないかと思います。
今回の事例では、そこまで振り切った謝罪にはなっていませんでした。
うーん、そりゃやっぱり難しいよね。
③「不確実なこと」については、「事実」と「意図」を切り離して記載する。
少し「言った言わない問題」についてもふれますね。
人間って完璧ではないので、「自分の意図と常に100%マッチした発言は出来ない」と考えておいた方が無難だと思います。
特に色々なところで発言している状況になると、その「全ての発言を管理しきることは事実上不可能」ですし、記憶に頼るなんてもってのほかだと思います。
(我々はパソコンではないので)
一方で「意図」であれば、それは自分の深い理念や思想に根付いたものであり、中心に据えている軸はブレないでしょう。
少なくても、炎上するほどのインフルエンサーにもなれば、そういう軸は誰しもがもっていると考えています。
ここまで書けば「言った言わない問題」への好ましい対応は想像のとおりだと思いますが、「意図」と「事実」とを切り分けることです。
具体的には「○○について、私としては一貫して××のような意図があり、その意図に沿って発言をしてきました。一方で実際の発言内容の中には、想いが先走って、一部事実と異なる内容があったことは否めません。皆さんを混乱させてしまい、申し訳ありませんでした」みたいな感じがいいのかなと思います。
正直「言った」か「言わないか」はあまり重要ではなくて、仮に間違ってしまっていた場合に「心の間違い」なのか「表面的なミス」なのかが大切だと思います。
人は「心の間違い」は容易には許しませんが、「技術的なミス/意図しないミス」については総じて寛容です。
だから故意か過失かは、物凄く大切な論点になるわけです。
今回の場合事実はどうかは分かりませんが、仮に「たった1つでも反証」が出てきてしまった場合、情状的に非常に逆風になります。
適切にリスクを管理する上でも「意図しないミス」については、実際の有無にかかわらず、「もしミスってたらすまぬ」と謝ってしまった方がよい、というのが私の結論です。
今回の事例では「事実」として「言っていない」と言い切ってしまっているので、アンチの方がもし「反証」を見つけてしまった場合のことを考えると、個人的には悪手だったかなと判断します。
④逆に本心から悪いと思っていない内容があるのであれば、その点については「自分の信念」を貫く
これはケースバイケースというのか、そのアカウントのキャラクターにも依ると思います。
人は理由なく激怒しないので、炎上に至る発端の激怒が「キャラクターにマッチした」理由・原因であった場合、その点については「自分の信念」を貫いてもいいのではないかと思います。
普段から忖度せず「ズバズバいうキャラ」だった場合、炎上したことについて全体的にボヤっと謝罪してしまうと、そのキャラのファンからは「そこは主張して欲しい」みたいな部分が無視されてしまう可能性もあり、炎上が収まったとしても「ファンが減る」という大きなダメージを受けてしまうことが考えられます。
激怒した理由が「虫の居所が悪かった」とか、「勘違いしてた」とかなら問題ないのですが、「相手の発言にも非がある」と自分が思っているのであれば、そこは謝罪とは切り離して、「自分の信念を貫く勇気」も必要だと思います。
どうしても炎上を収めたいという気持ちになるでしょうし、実際に主目的ではあるのですが、その時の対応を誤ると、そもそもの「情報発信をしている目的」から遠ざかる可能性もある、ということを強く認識しておいた方がよいということです。
炎上を収めたい⇒わかる。じゃあ、なんで炎上を収めたいのか
もう一歩踏み込んだ「ナゼナゼ分析」で、炎上終焉後のダメージを減らせると思います。
今回の事例では、文章全体から信念が見え隠れしているので、そういう意味では「ファン」の方は去らないだろうと思いました。
ただ、逆に⑤でも触れますが、謝罪や反省の濃度が薄く見えてしまって、場所が場所なら再炎上もありうるのかなあ、という印象です。
⑤謝罪中に「謝罪以外の情報」は「発信しない」ようにする
もうこのまんまです。
謝る場だと決めた以上、「謝ること以外をしない」方がよいと私は考えています。
謝罪の場を乗り越えた先で、何か聞かれたりすれば自分の意見を言えばよいと思います。
確かに色々言いたくなるのは想像に難くないのですが、そこをぐっとこらえられるかどうかが、全体的な印象に大きく影響しますし、つまるところ「カッコよさ」の明暗になると思うからです。
ちなみに、④で記載した「自分の信念を貫く」部分については謝らなくていいと思います。そこは「そもそも悪くないから謝らない」と決めた部分なのだから、謝罪の場だとしても言及する必要がそもそもないと思うからです。
そして徹頭徹尾謝ることにした場合、謝罪の内容が深くなるはずです。
例えば、今回激怒してしまった相手がいる以上、その相手を慮ったような内容が織り込まれたりするということです。
激怒したきっかけについては相手が悪いという立場を崩さなくても、激怒してしまったことで「相手をどういう気分にさせてしまったのか」、その結果「相手にどういう不利益を被らせてしまったのか」など、より自身が反省していることが伝わる内容になるはずです。
直接その相手に謝罪をして、どういう反応が返ってきたのかという情報を「明示」し、その結果に対しての自身の思いを伝えられれば、真摯な姿勢がより伝わるのではないかと思います。
また、最終的に「自分の立場を弁えて」気を付けるとの趣旨の締めになっていましたが、これは「個人としては言いたいことはある」けれど、「立場的に我慢する」というように読めてしまい、「本当に反省している」という部分が疑問視されかねない締め言葉になっているように感じました。
全体的な印象と合わせてみると、「謝罪」という側面において、薄かったり弱かったりというように捉えられてしまっても仕方がないのかな、と個人的には判断します。
せっかく謝っているのであれば、もう少し素直に謝罪の意を示すことが、もしかしたら受け手側の納得感が高まるのではないかと感じました。
【総括】
少し長くなってしまいましたね^^;;
今回本気で当事者の立場と、情報を受けとる側の立場(ファン、知っている人、知らない人)になって考えてみて、炎上後の好ましい対応について精査してみました。
もちろん、これが正しいとかでは全然ありません。
現時点で私が必死になって考察してみたところ、「こんなんでましたけどー」くらいの雑記です。
ただ、今後自分が人生で色々なトラブルに巻き込まれることは、十分に考えておく必要があるわけで、この機会にじっくり「考えられた」ことは、自分の資産になると思っています^^
36日目:Command Line学習:一通りの基本的なコマンドと階層構造について学ぶ
<学習日>
36日目
<学習内容>
① Command Line (0-100%):一通りの基本的なコマンドと階層構造について学ぶ
<参考>
Progateレベル:154
<学習内容詳細>
本日は一転して「Command Line」について勉強しました^^
これは「cmd」とか打ち込むと出てくる「真っ黒い背景」のウィンドウで実行するものになってきます。
windowsだと「コマンドプロンプト」と呼ばれるやつですね。
完全にcodeのみで色々な作業を実行するので、かなり取っつきにくい部分となります。
レッスン一覧を見ていたら、Progateでも取り扱っていたので、どんなもんかと手を出してみました^^
結論からいうと、初歩の初歩というのか、かなり基本的な内容となっておりましたが、導入としては良いかなと思います。
(時間もあまりかからないので)
① Command Line (0-100%):一通りの基本的なコマンドと階層構造について学ぶ
ということで、さーっと一通りProgateの単元は完了させてしまいました^^
では、実際のcodeも記載しながら、本日勉強したことを振り返っていきます!
・新しいファイルを作成する場合
「touch ファイル名」でそのファイルを作成することができる。具体的に、get.txtというファイルを作成したい場合には以下のとおり。
$ touch get.txt
・ファイルの中身を表示する場合
「cat ファイル名」でそのファイルの中身を表示させることができる。具体的に、get.txtというファイルを作成したい場合には以下のとおり。
$ cat get.txt
なお、指定したファイルが見当たらない場合には、「cat: get.txt: No such file or directory」というエラーメッセージがでる。
また、TABボタンを押すことで、実際に存在するファイル名を予測で出すことができる(補完機能)。
・フォルダを新規作成する場合
「mkdir フォルダ名」でそのフォルダを作成することができる。具体的に、sampleというフォルダを作成したい場合には以下のとおり。
$ mkdir sample
ちなみに、我々が良く使うフォルダという名称だが、プログラミングの世界ではディレクトリと呼ばれる。「フォルダ = ディレクトリ」という認識をもつべし。
また「touch」コマンドではディレクトリは作れないので注意。ファイルとディレクトリは明確に区別されている。
・Command Lineでの作業は、常に「どこの場所で作業をしているのか」を意識する必要がある
例えば、我々がデスクトップで新しいフォルダを作成するときはデスクトップで、他の階層のフォルダ内にファイルをコピーする場合はそのフォルダ内で実施する。それと同じで、Command Lineで作業を指示する場合でも、「この命令はどの場所に対して実行してるのか」を明確にしないと、正しい作業が出来ない。
この時、作業したい場所まで行くときには「cd アクセスしたいディレクトリ名」と指定指定する。
例えば、sampleというフォルダ内で作業したい場合には、以下のとおりのcodeとなる。
$cd sample
上記のコマンドを実行すると、次の行から「sample $」が頭に表示された状態になる。この表示を持って、次回の命令は「sample」というディレクトリ上で実行するぞ、という意味になる。
・今いるディレクトリの場所が全体の構造のどこにあるのかを表示する方法
フォルダの構造は樹形図のようになっており、大元のディレクトリから辿って、どの位置にいるのかを正しく把握しておく必要がある。
その時には「pwd」というコマンドを用いる。main⇒example⇒sampleという構造になっていた場合のcodeと、リプライは以下のとおり。
sample $ pwd
/main/example/sample
ちなみに、一番おおもとのディレクトリを「ルートディレクトリ(/)」というので覚えておくこと。
・今いるディレクトリに属している1つ下の階層をリストで表示する場合
「ls」を使用する。例えば、sampleディレクトリに属する、1つ下の階層の一覧を表示する場合には、いかのとおり。
sample $ ls
これで、このディレクトリに属している「ファイル/ディレクトリ」がリストで表示される
・1つ上の階層のフォルダに行く場合
「cd ディレクトリ名」がエラーになってしまう。sampleディレクトリから、exampleディレクトリに移動する場合は、以下のとおり(main⇒example⇒sampleとして)。
sample $ cd ..
cdコマンドは、1つ下の階層にしか行けないみたい。同一階層での移動も、1つ飛ばしての移動も試したけど出来なかった。
・cdの後にディレクトリ名を指定しないとどうなるなるのか⇒「homeディレクトリ」に移動できる
ユーザーが開発時に起点とするディレクトリを「homeディレクトリ」として設定することができる。
cdのあとにディレクトリ名を指定しないと、設定された「homeディレクトリ」に移動することができる。
・ファイルやディレクトリを移動したい場合
「mv 移動したいファイル名/ディレクトリ名 移動先のディレクトリ名」でファイルやディレクトリを移動することが出来る。
例えば、sampleファイルを、subディレクトリに移動したい場合は以下のとおり
$ mv sample sub
ちなみに、移動したい先のディレクトリよりも上層のディレクトリからでないと、正しくコマンドが実行されないっぽい。
・ファイル名を変更したい場合
この時も「mv」を使用する。「mv 名前を変更したいファイル名 変更後のファイル名」で実行できる。
たとえばsample.txtというファイル名を、ttt.txtという名前に変更したい場合は以下のとおり
$ mv sample.txt ttt.txt
ちなみに、このファイル名を変更する命令は、そのファイルが格納されているディレクトリにいないと実行できないっぽい。
(すごく上のディレクトリからだとだめ。ちなみにTABによる補完も、今いるディレクトリに直接紐づいているファイル名しか補完されない)
・ファイルをコピーしたい場合
「cp ファイル名 コピー後のファイル名」でコピーできる。またディレクトリをコピーしたい場合は「cp -r ディレクトリ名 コピー後のディレクトリ名」でコピーできる。
例えば、samle.txtをコピーして、ttt.txtという名前にする場合は以下のとおり。
$ cp sample.txt ttt.txt
また、mainというディレクトリをコピーして、subという名前を付けたい場合は以下のとおり。
$ cp -r main sub
このコマンドも、1つ上のディレクトリから実行しないとだめっぽい。
・ファイルを削除したい場合
「rm ファイル名」で削除できる。またディレクトリを削除したい場合は「rm -r ディレクトリ名」で削除できる。
例えば、samle.txtを削除する場合は以下のとおり。
$ rm sample.txt
また、mainというディレクトリを削除したい場合は以下のとおり。
$ rm -r main
このコマンドも、1つ上のディレクトリから実行しないとだめっぽい。
・最近使ったコマンドをもう一度実行したい場合⇒「矢印キーの↑ボタン」で、最近実行したコマンドが呼び出せるので便利
ということでつらつらと書きましたが、超導入編であり、複雑な概念や内容はありませんでした。
ただ、ちょっと触ってみるとわかる仕様は結構大事で、ディレクトリの移動なんて何階層分もすっとばしていけるだろうと思っていたら、一つずつしか移動できなかったりとかはやってみないと気付けませんでした^^;;
これもなぜだろうと考えてみると、実は答えは明確で「同じファイル名/ディレクトリ名が階層が違えば許されるから」だと思います。
つまり、「メイン」というディレクトリに行って欲しいという命令を出しても、「デスクトップにあるメインというディレクトリ」なのか、「ダウンロードにあるメインというディレクトリ」なのかが判別できないから、一気に移動しようがないということですね。
同様の理由で、今いるディレクトリに直接続しているファイル/ディレクトリにしか、命令を実行することは出来ない仕様になっていると考えています!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
独学での閃き~その2~ PHP【01】+ Progateという学習コンテンツのと上手な付き合い方について
<カテゴリ>
プログラミング・WEBデザイン
<言語>
<閃き>
PHP言語を使用する目的
<結論>
オブジェクト指向の本質を掴もう!
<コツ>
最終的な絵姿を考えて「超ざっくりした機能ごとのフレーム」に分解して、おおまかな情報の流れをラフスケッチする
<閃き詳細>
今回はPHPの学習を進める中で、そもそも「なんでコンストラクタで引数で受けた値を、クラスの変数にセットするのか」という疑問から、「PHP言語はこういう目的でうまれたのかな」ということを考察して、以下のとおり整理してみました^^
正しいかどうかは置いておいて、私はこの枠組みでPHPを見るようにしたところ、1つ1つのcodeの意味や役割をある程度明確に認識することが出来て、理解が深まったと感じています!
では、具体的なcodeも記載しながら、枠組みを見ていきたいと思います。
・コンストラクタで引数で受けた値をセットする理由について(オブジェクト指向の全体的な枠組みとは)
あくまでクラスで作っているのは「枠」であって、インスタンスを作成して初めてデータとしての形をもつ、ということを意識する。
すると、インスタンスを作成したときに、クラスの枠をもとに、具体的なデータを当てはめていくことになる。
このデータの当てはめをコンストラクタを使って自動でやると、きれいなプログラムとなる。
さらに一歩踏み込んで、オブジェクト指向の大きな枠組みを考えると以下のとおりとなる。
①クラスで枠を作成して、引数でインスタンスで指定したデータを即格納できる形にしておく
②各インスタンスごとに、引数に渡せるデータを格納した形で全て定義する。
③各インスタンスを配列として1つにまとめておく
④実際のHTMLのcodeの中に、PHPの記述でforeach関数を使用して、各インスタンスを1つにまとめた配列を呼び出して、全てのデータ処理を一括で実行する。
⑤④の「全てのデータに一括でアクセス」出来る中で、条件文を組み合わせて、必要なデータを抽出する。
具体的には以下のようなcodeとなる。
①
class Men {
private $name;
private $age;
private $height;
}
public function __construct($name, $age, $height){
$this->name = $name;
$this->age = $age;
$this->height = $height;
}
②
$ken = new Men(Ken, 29, 175);
$john = new Men(John, 17, 189);
…
③
$men = array($ken, $john, …)
④⑤
<?php foreach($men as $man): ?>
<?php echo $man->name ?>⇐必要ならこの中でif文やfor文などで条件分岐していく
<?php endforeach ?>
最終的に完成する、上記の流れを把握しておかないと、①の時点でのコンストラクタで引数で受けた値をセットする意味なんて理解しようがないから、よくよく全体の流れを考えることが肝要。
もしかしたらかなり当たり前のことかもしれませんが、自分としてはここを意識することが学習効果の向上につながったので、メモとして残しておきます^^
<補足~Progateという学習コンテンツのと上手な付き合い方について~>
Progateの学習単元全般に言えることではあるのですが、「全体的な構成についての本質的な解説が薄い」ような気がします。
Progateの目的が「プログラミング学習の障壁を最大限なくす」ことなので、まずは自分の書いたcodeが「正しく動いた!」という成功体験を提供するのは仕方がないとは思いますが、各単元の最後であったり、各言語の最後に「中まとめ」「大まとめ」のような形で、本質的な解説を入れてもいいのではないかというのが正直な感想です。
でないと、Progateはこなすことが出来たけど、実際にプログラミングは出来ない人を量産することになる気がするからです。
(かくいう私もその点は不安ですので、他のコンテンツや自身のポートフォリオを作ったりでカバーが必要かなと考えています)
で、Progateで学習を進めていくなかで「細かい指示通りにとりあえずcodeを書く」だけだと、「結局これなんでこうなってるの?」と自問自答せざるを得ない状況になります。
そんなときは、「なぜこの言語は生まれたのか」という目線で、単元を通じて作成したcode全体と完成品とを観察してみるといいかもしれません。
正しいかどうかは置いておいて、全体的な構造が見えやすくなりますし、ある程度的を射た考察が出来れば、1つ1つのcodeに確かな役割を感じることが出来て、ぐっと理解が進むと思うからです。
(このぐっと理解が進んだ瞬間を、人は閃いたと感じるものと考えています^^)
30日以上Progateで複数言語を勉強してきた中で、この学習コンテンツとの上手な付き合い方を模索してきたので、補足にて私の考えをコメントしました。