どうあがいても簡単にはまとめられないものなのか?一応、あきらめない!
【そもそもプログラミングとは?】
「プログラミングとは、パソコンにやらせたいことがあり、それをパソコンがわかる言葉であらかじめパソコンに書いておくこと、教えておくことです。」
プログラマーはパソコンにやってほしいことを日々書き連ねています。
データありきのプログラムとデータを生み出していくプログラムがあります。
まず基本的には【スタートがあって「 (プログラム) 」があってゴールがあります。】この「ゴール」を作るのがプログラミングの目的です。
これはプログラミングに限らずだと思いますが、戦略(過程)が違ってもゴールが同じなら最初は特に気にしないことにします。これが製品プログラムであり、同じゴールでも10倍速度が違えば工夫が必要です。リスがどんぐりを得るのに手段はいろいろありますよね?昨日見たNHKの地球ドラマチック「大接近!リスの世界」を見て「なるほどな!」と思いました。
【目的を明確にする】
やりたいこと(=「目的」)を細分化します。「何がやりたいのか」目的を明確にすることがとにかく大事です。いいですか、むしろこれだけが大事と言っても過言ではありません。目的をはっきりさせることです。
例えば「書類をシュレッダー処理する」という人間の行動をプログラミングに落とし込むと以下のようになります。
- 席を立つ
- 180度方向を変える。3m前へ進み
- 90度左に向きを変え
- スイッチを押し
- 書類を放り込む
- 書類のサイズが大きすぎるのであれば
- 業者を呼んで専用処理をおこなってもらい
- 書類の数だけこの行為を繰り返す。
このような順番が必要です。もっと細分化が必要かもしれません。
目的をはっきりさせるために「なんのために?なにを?どうする?どこに?どれを?」などの自問自答は常に必要だと思います。
【3つの処理】
プログラムには基本的に3つの処理があります。
- 上から下へ処理をする「順次処理」
プログラムは基本的に上から下に読まれ、処理されます(構造化プログラミング)。その途中で次の2つの処理が記述されます。文法が誤っていなければ自由に記述することができます。 - 条件に応じて処理をする「条件分岐処理」
処理の過程で条件を記述し、処理を分岐させます。あみだくじのように結果が変わり、分岐の数や条件を自由に記述することができます。 - 条件に応じて同じ処理を繰り返す「条件反復処理」
反復処理の多くが扱うデータを変えて処理を繰り返します。繰り返す回数や処理の中で条件を分岐させたりすることが自由に記述できます。
と、ここまでは当たり障りのないというか、一応自分で改めて大事だと思うことを書きました。どのプログラミング言語でも構いませんが、入門書を1冊を読めば把握できる内容でございました。
【個人的に扱う主なデータ型】
※「データ型」に語弊あると思いますが、とりあえず文字から内容を想起(芋づる)できれば良しとします。
x = "
String,
Integer,
Array,
Hash,
RegEx,
Boolean,
newオブジェクト,
"
「newオブジェクト」はgemや外部ライブラリ、標準ライブラリをnewしたときにできるインスタンスを示します。これらの利用に関してはリファレンスに従って機械的に利用していきます。
【Rubyの必須メソッド】
それではほんとにガラッと話が変わりますが、Rubyのメソッドを覚えましょう。(備忘録のために書いています。)
一応、テキストでも。
🔍"_Utf8とJisとココアとinsertプラス_\r\n".gsub
↓↑
🔍[ [2, 3, 1], [1, 2, 3], nil, "insert<<", nil, "zip" ].each
この画像から少なくとも、こちらで答えとして用意したメソッドを思い出してくれたら幸いです。
Stringクラスが20個で、Arrayクラスが18個です。答えは一番下に書きました。
【文字列の万能メソッドと配列アクセスメソッド】
すいません。適した言葉が分からずデタラメのタイトルを付けました。下記の形をご覧ください。
- str[]
- array[]
この2つはいずれも同じ形ですね。変数にブラケットを横付けしてデータへアクセスできます。
イコール「=」を使い、データを削除、追加、置換、抽出などができます。
- str[] = “”
- array[] = “”
※イコール「=」。代入演算子。
※ブラケット[ ]。正確にはスクウェアブラケット。
利用可能な5つの引数
[1] | [1..3] | [1, 0] [1, 1] [1, 3] | [“String”] | [/RegEx/] | |
---|---|---|---|---|---|
String | 〇 | 〇 | 〇 | 〇 | 〇 |
Array | 〇 | 〇 | 〇 | × | × |
この表は大事です。
【データの検索とCRUDの考え方】
前セクションで少し書きましたが、本記事でのプログラミングとは文字列処理と言っても過言ではありません。
私自身が作成するプログラムのほとんどが文字列を処理するプログラムだからだと思います。もっといろいろできると思うのですがね。SeleniumやRailsなどのgem、外部ライブラリはリファレンスに従うのみです。Selenium、すごいですよ!一度試してみてください。
CRUDとは
CRUDとは、データベースの考えで私が勝手に本記事に引っ張っているだけです。「データのCreate追加、Read読込、Updateアップデート、Delete削除」を表していて、文字列の処理も同じようなものかなと考えています。厳密には違っていても想起するには十分は言葉だと思います。
切っても切り離すことができなかった探索とCRUD
記事「Rubyまとめver3」では、探索メソッドとCRUDについてセクションを分けて書いていました。
しかし、CRUDと探索をどっちから先に書けばわかりやすくなるかわからず、セットで書こうと思いました。どちらかと言えばCRUDが先なのでしょうか…悩笑?
なぜなら、たいていの文字列の処理が「目的決めて対象を探してCRUD、目的決めて対象を探してCRUD…」の繰り返しだからです。
どのような処理をしたいか目的をはっきりさせて、ターゲットを探し、アクションを起こします。
目的の棚卸「何をしたいか?」
「何ができるのか?」はまず置いといてとりあえず思い浮かんだアクションを挙げてみます。
データの…
- 追加
- 修正
- 更新
- 上書き
- 削除
- 検索
- 特定
- 再作成
- 抽出
- 利用
- 出力
などでしょうか。
探索メソッド
ターゲット探索は、以下の探索メソッドを使って次の3つの探します。
- インデックス位置番号
- 文字列検索
- 正規表現パターンマッチ
文字列の探索メソッド
メソッド | 引数 | 戻り値 | 特記 |
---|---|---|---|
index() | “str” or /reg/ | 開始位置番号 | 複数のマッチがあっても最初のものだけ。 |
scan() | “str” or /reg/ | 配列 | マッチした数ぶん、同じデータの配列を返す |
match() | “str” or /reg/ | MatchDataオブジェクト | パターンマッチの有無。複数のマッチがあっても最初のものだけ |
str[] | “str” or /reg/ | 引数に指定した値 | 万能メソッド!?複数のマッチがあっても最初のものだけ。 |
slice() | “str” or /reg/ | 引数に指定した値 | 探索というより抽出だが、マッチしなければnilを返すので存在確認ができる。探索も抽出もどっちもイケるよねということ。複数のマッチがあっても最初のものだけ。 |
配列の探索メソッド
メソッド | 引数 | 戻り値 | 特記 |
---|---|---|---|
index() | “str” | インデックス番号 | 複数のマッチがあっても最初のものだけ。部分マッチは評価されない。引数は文字列のみ。 |
grep() | “str” or /reg/ | 配列 | 引数は正規表現がオススメ。ネスト配列の場合、ネスト部分の評価を行わない。 |
上記の2つのクラスの探索メソッドは【Rubyの必須メソッド】に含まれているので、改めて覚えることはありません。すぐに出てくるようにしましょう。
文字列の具体的なCRUD処理方法
処理 | 考え方 |
---|---|
追加・挿入 | 正規表現や万能メソッドを使い文頭、文末に追加したり、探索メソッドで開始位置番号を確認し、位置を指定してデータを挿入したりする。位置の指定かパターンマッチを利用しデータの追加を行う。置換メソッドgsubを追加メソッドとして利用することもできます。 |
抽出・探索 | 探索メソッドを利用し、パターンマッチや位置を探します。部分抽出を行うこともできます。 |
置換・更新 | sub、gsubメソッドの利用、または万能メソッドを利用し、置換・更新を行います。一度、配列に変換し、配列を操作するという方法もあります。 |
削除 | 基本的な考え方として削除対象文字を””で置き換えるという手法を選択します。万能メソッドやsub、gsub、または他の方法で置換を行う。また「slice!(5つの引数)メソッド」で部分削除も可能です。 |
配列の具体的なCRUD処理方法
処理 | 考え方 |
---|---|
追加・挿入 | 基本的には「<<」を使いデータを追加する。追加する位置を指定したいのなら、Arrayの探索をおこない、位置を確認し、データを追加・挿入する。pushメソッドとinsertメソッドを覚えていたらそれを使ってもいい。 |
抽出・探索 | 抽出に関してはただの配列へのアクセスである。探索するのであれば前述の探索を参考にgrepやindexを使用し値取得を行う。 |
置換・更新 | シンプルな置換としては、こちらもただ配列データへのアクセスを行い、データを置換するだけです。インデックス番号や文字列の一部しかわからない場合は、文字列への変換や前述の探索を試みます。 |
削除 | popなどを覚えていればそれを使えばいい。基本的には削除対象の位置または範囲を特定し、nilを置換し、compactでnilを削除します。 |
数少ないスキルを上達させる
次の3つのことを心掛けましょう!
- 正規表現の上達
- eachの上達
- ifの上達
- 条件式の工夫
- 論理式、演算子などの積極的利用
とにかく詳細は記載しませんが、言葉から想起してくれることを願っています。
正規表現については一旦こちらにまとめましたが、もう一度確認が必要です。
プログラミングを重ねるうちに自分の鉄板ができるとプログラミングがとても楽しくなります。
ファイルの読み書き・インプットとアウトプット
個人的に作成する多くのプログラムは、目に見える結果としてファイル出力させます。また、あるデータを利用してプログラムを書くときは、そのデータ(ファイル)をプログラムに読み込ませて処理をさせます。
以下の2つを覚えておけば、あとは工夫でナントカいけるかなと高を括っています笑。
File.read("filename.filetype")
File.write("filename.filetype", "書き込むもの")
#例
File.read("input.txt")
File.write("output.html", str)
open、closeなどを使って読み書きする方法がネットで紹介されていると思いますが、私みたいに怠慢で処理が非効率で冗長な場合は、上記の2点と次の追記の書き方だけでいい気がします。
追記方法(書き込みではなく追記)
File.open("filename.filetype","a") do |file|
処理
end
【直感的で覚えたほうがいいメソッド】
- class → クラス確認
- methods → 使用可能メソッド一覧取得
- respond_to(“scan”) → 引数メソッドが利用可能否か
- nil?とempty? → 存在確認
- even?とodd? → 偶数奇数
- sizeとlengthとcount → 数、長さ
- keysとvalues → ハッシュから配列を作成
自分の鉄板を積み上げよう!
忘れないように小さなことでもWordPressでブログ更新をすることをおすすめします。Googleで検索すれば情報を引っ張ってこれますが、二度目は自分の言葉でアクセスしたほうがわかりやすくて速い気がします。
答え【Rubyの必須メソッド】
Stringメソッド20個
scan()
match()
index()
slice()ついでに便利なのでslice!
strip
rstrip
lstrip
chop
chomp
encode()
unicode_normalize(:nfkc)
upcase
downcase
insert()
+
gsub()
chars
lines
split()
Arrayメソッド18個
index()
grep()
shuffle
sort
reverse
flatten
uniq
compact
insert()
<<
zip()
each
each_slice()
with_index()
map
join()
to_s
inspect
以上です。