ひとりごと

凡人プログラマが何か書きます。。。

Rubyのお勉強 3時限目

雨ばっかで全然洗濯物が乾かない。
今日は正規表現の使い方をやっていきます。

正規表現

パターンマッチ

パターンマッチには====~を使う。

===正規表現に文字列がマッチするかを真偽値で返し、
=~は最初にマッチした位置を整数で返す。

# encoding: utf-8

p "abc123" === /\d+/
p "abc123" =~ /\d+/

実行結果

false
3

String#[]

正規表現にマッチする文字列を得ることができる。
¥dには1~9の1文字がマッチし、
+は直前の正規表現の1回以上の反復(最長マッチ)のため、
結果的に"123"がマッチする。

+?は逆に最短マッチ

# encoding: utf-8

p "abc123"[/\d+/]
p "abc123"[/\d+?/]

実行結果

"123"
"1"

String#sub、String#gsub

正規表現置換を行う場合は、String#subあるいはString#gsubを使う。
String#subは最初にマッチした1箇所のみ,
String#gsubはマッチした全てが対象となる

# encoding: utf-8

p "abc123".sub(/123/, "def")
p "abc123".sub(/[a-z]+/){|s| s.upcase}
p "abc123".gsub(/[\d]+?/, '1' => 'd', '2' => 'e', '3' => 'f')

実行結果

"abcdef"
"ABC123"
"abcdef"

case文

例文をみていたら、case文を変数に入れている。 Cプログラマだからこういうのはビビる。

制御構造 (Ruby 2.4.0)

Rubyでは(Cなどとは異なり)制御構造は式であって、何らかの値を返すものが あります(返さないものもあります。値を返さない式を代入式の右辺に置くと syntax error になります)。

if文とかも式の右辺に置けるということらしい。

^は行頭、改行文字の直後にマッチ

# encoding: utf-8

type = case "abc"
       when /^abc/
         :abc
       when /^def/
         :def
       else
         :other
       end

p type

実行結果

:abc

caseで正規表現を使えちゃう柔軟性は⭕️
今日はここまで。

Linuxカーネルソースリーディング 2時限目

最近忙しくて全然かけてなかった。。 デーモン君のソース探検やっていきます。

だいぶ時間が空いてしまったけど、Linuxカーネルソースをダウンロードしたとこまでやったんだった。

探検1 passwd

この章ではデーモン君が先生にパスワードが何故表示されないのか調べることを宿題にされて試行錯誤している。 まずはlocateコマンドを使ってloginコマンドの場所を探しているようなので同じように打ってみる。

$ locate login

WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.

locateが探すデータベースが生成されていないらしい。

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
Password:
$ locate login

WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.

書かれている通りコマンドを入力したが、データベースの作成に時間がかかっているのかうまくいかない。ちょっと時間をおいて

$ sudo /usr/libexec/locate.updatedb

としたらいけた。

$ locate login
(省略...)
/usr/bin/login

コマンドは/usr/bin/にあるのね(macだけど)φ(・

だがしかし

$ locate login | grep  login.c

とやっても、ソースが見つからない。。LinuxBSD系で違うのか?

つづく

Rubyのお勉強 2時限目

家の近くのハンバーガ屋に来てるけど、勉強している人が多い。
値段設定が少し高いけど、静かでいいね。
今日もRubyの勉強やっていきます。

これを書く前にRuby文字コードについて少し調べてみた

この記事↓によると

衝撃の事実!? "# -*- encoding: utf-8 -*-"じゃなくてもいいんです! - Qiita

ということらしい。

String クラス

エンコーディングを変える

# encoding: utf-8

p s1 = '太郎' 
p s2 = s1.encode("Shift_JIS")

実行結果

"太郎"
"\x{91BE}\x{9859}"

kconv ライブラリ

たいていの日本語の文字コード変換はkconvライブラリを使えば事足りるらしい。覚えておこう。

# encoding: utf-8

require 'kconv'

p s = '太郎'
p s_eucjp = s.tosjis

この場合、変換元の文字コードを推測して文字コードを変換している

実行結果

"太郎"
"\x{91BE}\x{9859}"

お店が混んできた。一旦中断。

Rubyのお勉強 1時限目

ここ最近涼しかったのに今日はめっちゃ暑い。。。

最近Qiitaで見かけた記事↓を読んでいたら、すごいRubyがやりたくなってきた。

ズンドコキヨシを見かけた男子中学生がプログラミングを勉強していく話 第1話 - Qiita

Rubyは基本的な文法をやったところで、特に作るものもなくて放置していたが、 また勉強し直してみようと思う。

本屋に行って「Rubyによるクローラー開発技法」という本を買ってきたので、 これを進めていく。

$ ruby --version
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-darwin14]

うちのmacには以前入れたRuby2.2が入っていた。 irb使っていろいろ試してみる。

Stringクラス

文字数を得る

2.2.4 :003 > 'banana'.length
 => 6
2.2.4 :005 > 'ばなな'.length
 => 3

バイト数を得る

2.2.4 :006 > 'ばなな'.bytesize
 => 9

文字列が空かどうか

2.2.4 :001 > 'apple'.empty?
 => false
2.2.4 :002 > ''.empty?
 => true

エンコーディングを得る

2.2.4 :013 > 'abc'.encoding
 => #<Encoding:UTF-8>

また仕事から帰ってきたらやろう。

Linuxカーネルソースリーディング 1時限目


とりあえず一通りの初期設定はやってみたけど、まだあまりはてなぶろぐの使い方がよくわかっていない。。。

今日からだいぶ前に買って放置していた「デーモン君のソース探検」という本を実際に手を動かしながら、読み進めていこうと思う。 この本は中学生のデーモン君がBSDソースコードを読み解いていく本で、位置付け的には入門書の次くらいに読むと良い本らしい。 とりあえずC言語の基本的な知識があれば、読めそう。

自分は会社だとLinuxで開発をしているので、NetBSDのソースを使っている部分をまるまるLinuxに置き換えて手元での確認をしていこうと思う。

実行環境は OS X El Capitan バージョン10.11.6

デーモン君のソース探検 序章

この本は基本的には対話形式で物語が進んでいく。 序章では学校での先生とデーモン君のやりとりが書かれている。

序章でやっていることは、

  • NetBSD 1.6のソースをcvsからとってくる
  • locateコマンドのデータベース更新
  • マニュアルの分類について

の3つなので、ひとつずつやっていく。

ソース取得

どうやらデーモン君は、/usr 配下にsrcディレクトリを作ってそこにNetBSD 1.6のソースを突っ込んでいるようだ。

$ cd /usr
$ ls
X11        X11R6      adic       bin        include    lib        libexec    local      sbin       share      standalone

移動してみると、何かいろいろとディレクトリがある。 調べてみたら、 /usrLinuxでもBSD系でも、共有可能なファイルを置く場所らしい。 各種実行コマンドのバイナリや、ライブラリ、Cのヘッダファイル等がおいてあり、 /usr/src 自体はカーネルビルド時に設定すれば作ってくれるようだ。

今回はひとまず ~/work/ 配下にMainlineのLinuxカーネルのソースを持ってくる。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

今日はここでおしまい。

ブログを開設してみた

夜中のテンションでブログを開設してみた

 

今日は疲れたので寝るッ!

(^-^)