ファイルの真ん中を出力する body というシェルの関数を作った

はてなブログGist からの貼付けに対応したようなのでさっそく試してみる。

これは何?

ファイルの先頭だけを表示する head, 末尾だけを表示する tail というコマンドがあるので、それに習ってファイルの真ん中を表示する body というシェルの関数を作ってみた。開始と終了の行番号を指定したら、フアイルのその範囲内だけを出力してくれる。

ソースコード

これを .bashrc とか .zshrc に書けば OK。

開始行と終了行を指定して、ファイルのその範囲内だけを出力するシェルの関数

使い方

body 開始,終了 フアイル名 という形式で使える。

# file1.txt の10行目から20行目までを出力する
% body 10,20 file1.txt

開始、終了を省略することもできる。省略したらそれぞれ「先頭行から」、「末尾行まで」という意味になる。

# 1行目から20行目までを出力する
% body ,20 file1.txt

# 10行目からファイルの最後までを出力する
% body 10, file1.txt

それと、ファイル名を省略したら標準入力から読み込むようになる。

なんかテキストファイルにずらずらメモ書きして、必要なとこだけ取り出したい時に使うと便利。

関西Ruby会議05で LT の発表をした

2013/08/31(土) に大阪で関西Ruby会議05が開かれた。僕は LT 枠で発表することになっていた。あんまり Ruby 得意じゃないのでどんな話しようかけっこう迷っていて、けっこう緊張しながら参加した。

発表内容

発表のタイトルは「C# から Ruby に乗り換えた」。最近社内で Ruby を使おうという動きがあったのでそれについて話した。

補足しておくと、今回は LT で5分しかなかったので若干誇張して話したけど、決して Windows をdisりたいわけではない。

発表では「哲学」という言葉を使ったけど、まともなものには作った人の意図があると思う。それを理解した上で自分にあったものを使うのが大事だと思う。間違った、または意図にあわない使い方をして「使いにくい」とか言っても不幸になるだけ。そういうことを言いたかった。

Ruby は「プログラミングを楽しむ」ことをとても重視していて、僕はそれに共感して Ruby が良いと判断した。楽しむことが最優先でない人はまた別の言語とかを選べば良いと思う。それぞれ向き不向きがある。

真にゴミなものは「哲学」が無いものだと思う。

初めて Mac で zsh を使う人のためのチュートリアル

俺聞け4というイベントで zsh について発表しました (その時の発表資料)。「普段シェルを使っていない人でも zsh を使うと便利だよ」という内容で発表したので、それを聞いて使ってみようと思った人もいたようです。

でもググってみても色々分かってる人向けの記事はありますが、「どうやって起動するんですか?」という本当の初心者のための記事はあんまりありません。

そういう初めての人にも zsh を使って欲しいと思ったので、初心者向けの入門記事を書きました。Mac を使えば簡単に zsh を始めれるので、使い方が分からないという人は参考にしてみてください。

ターミナルを起動する

zsh「ターミナル」というアプリを起動して使います。

「アプリケーション」 -> 「ユーティリティ」の中に「ターミナル」があるので起動してみましょう。

次回起動するときのために Doc に追加しておくと便利です。

zsh を起動する

ではさっそくコマンドを実行してみましょう。次のように入力してみてください。

% ps

先頭の % はプロンプトと言ってコマンドの入力場所を表す記号です。実際には % の後の ps の部分を入力してください。(%$ などと表示されているかもしれませんが同じ意味です。この記事では % で表します)

このように表示されたでしょうか。

% ps
  PID  TTY            TIME CMD
  229  ttys002    00:00:08 bash

数字の部分は人によって違うと思いますが、2行目で bash というコマンドが動いていることが表示されています。

bash はシェルの一種で、Mac ではターミナルを起動すると bash が起動するようになっています。このように最初に起動するシェルのことを「ログインシェル」と呼びます。

今回は zsh を実行したいのでした。zsh は Mac に標準でインストールされているのですぐに実行できます。

% zsh

もう一度 ps を実行してみましょう。

% ps
  PID  TTY            TIME CMD
  229  ttys002    00:00:08 bash
  258  ttys002    00:00:02 zsh

今度は zsh という行が増えています。無事 zsh が実行できているようです。

zsh を終了するには exit コマンドを使います。

% exit

ログインシェルを変更する

毎回 zsh と入力するのは面倒なので、自動的に zsh が起動するように変更してみましょう。ログインシェルを zsh に変更すると bash の代わりに zsh が最初に起動するようになるのでうまくいきます。

まず zsh がログインシェルとして指定できるかどうかを確認します。以下のコマンドを実行してください。

% cat /etc/shells

表示はこのようになると思います(環境によって若干変わります)。

/bin/bash
/bin/csh
/bin/ksh
/bin/tcsh
/bin/zsh

/bin/zsh という行があるでしょうか。

これはログインシェルに指定できるシェル一覧を表示しています。ここに /bin/zsh が無いと zsh がログインシェルに指定できないので確認してください(普通はちゃんとあります)。

/bin/zsh という行を確認したら、次のコマンドでログインシェルを zsh に変更します。

% chsh -s /bin/zsh

このコマンドは間違えると最悪ログインできなくなってしまうので、間違えないように落ち着いて入力してください。

その後にパスワードを聞かれるので Mac にログインするときのパスワードを入力します。

これでログインシェルが変わりました。

一旦ターミナルを閉じて再度起動してみてください。今度は bash ではなく zsh が起動しているはずです。

確認のために ps を実行してみましょう。

% ps
  PID  TTY            TIME CMD
  229  ttys002    00:00:08 zsh

zsh という行があるので zsh が起動していることが分かります。

設定ファイルを書く

zsh の設定はホームディレクトリの .zshrc というファイルに書きます。

ホームディレクトリというのはユーザーごとに割り当てられたディレクトリ(フォルダ)のことで、/Users/(ユーザー名)/ という場所にあります。僕の場合はユーザー名は mollifier なので、ホームディレクトリは /Users/mollifier/ になります

また、Finder では「Macintosh HD」->「ユーザ」->「(ユーザー名)」と選択すると表示できます。

ではターミナルでホームディレクトリに移動してみましょう。通常は起動時にホームディレクトリにいる状態になっていますが、次のコマンドを打つと確実にホームディレクトリに移動できます。

% cd

それでは .zshrc ファイルを作成します。次のコマンドで作成できるので入力してみましょう。

% touch .zshrc

本当に作成できたかどうかは次のコマンドで分かります。

% ls -a

ずらずらと表示されたと思いますが、その中に .zshrc があることを確認してください。

ただし、こうやってたくさん表示された中から必要なものを目で追いかけて探すのはあまり賢くありません。こんな時は検索するのが常套手段です。

% ls -a | grep zshrc

今度は .zshrc と1行だけ表示されたはずです。こんなふうに入力すればたくさん表示された中から zshrc を含む行だけに絞り込んで表示できるようになります。

文字列を検索するときは grep というコマンドをよく使うのでまた覚えておいてください。

本題に戻ります。zsh の設定ファイルを書きたかったのですよね。

設定ファイルは自分の好きな設定を書けば良いのですが、自分で調べて書いていくのは結構大変なので今回は見本を真似することにします。

1つ目は本当に最低限の設定です。行数が少ないので内容自体は分かりやすいでしょう。そのかわりあまり便利な設定は入っていません。

2つめはもう少し高機能な設定です。zsh を日常的に使おうという人はこちらの方をおすすめします。

この内容をコピーして、さっき作った .zshrc ファイルに貼り付けます。

このとき、CotEditor など GUI のエディタを使う人は注意が必要です。実はホームディレクトリを開いても .zshrc は表示されないのです。.zshrc のようの .(ドット)で始まるファイルは隠しファイルと扱われてしまうからです。

こういうときはアプリケーションメニューの「開く」でファイルを選択するときに「Shift + Command + . (ドット)」を入力してみましょう。これで隠しファイルも表示されるようになるので「ホームディレクトリ」の下の .zshrc ファイルを選びましょう。

こうやってファイルを開いたら、先ほどの見本の内容を貼り付けます。

そのあとはターミナルを再起動すれば設定が反映されます。

または次のコマンドを入力すれば再起動しなくても反映されます。

% source ~/.zshrc

これで設定は完了です。

試しに man zsh と入力してから(Enter を押さずに) Tab を打ってみてください。

% man zsh
zsh          zshcompctl   zshcontrib   zshmodules   zshoptions
zshall       zshbuiltins  zshcompsys   zshexpn      zshzftpsys
zshcalsys    zshcompwid   zshmisc      zshparam     zshzle

zsh の man ページが補完されたでしょうか。こんなふうに zsh は Tab で何でも補完できるので、どんどん Tab を打って試してみてください。

最後に

これで zsh の導入は完了です。

zsh を使うと大量のファイルを一気にコピーするなど、GUI では難しい一括操作ができるようになります。この記事を参考にしてぜひ zsh を使ってみてください。

俺聞け4で zsh について発表した

2013/02/16に俺聞け4が開かれた。ウェブに関連する内容を発表したり聞いたりするイベントだ。

発表のテーマは何でもいいっぽいので、僕も zsh について発表した。

発表内容

その時の発表資料はこちら。

zsh を使おう

シェルがテーマなのでテキストファイル書いて vim で見せながら発表した。その中でシェルの操作とかあんまり慣れてない人向けに「シェルって便利なんだぜ」という感じを伝えた。

シェルはいろいろあって好きなもの使えばいいんだけど、その中でも僕は zsh をおすすめしたい。zsh はすごく高機能なんだけど、決して「高機能だから上級者向け」というわけではない。もちろん慣れた人は色々凝った使い方もできるんだけど、高機能な分初心者でもすぐに便利に使えるようになっている。なので初心者こそ zsh を使ったほうが良いと思ってる。

実際に zsh を使うには

設定ファイルの例をいくつか作った。

これを $HOME/.zshrc にコピペすれば OK。上にあるやつほど量が少なくてわかりやすいと思う。

あと、zsh を全然使ったことない人は起動とかどうやって使えばいいかよく分からないと思う。そういう人向けに Mac で zsh を使い始めるための記事を書く予定。書いたらここで紹介するのでまた見てほしい。

2013/02/22 追記

zsh を使い始めるための記事を書いた。 -> 「初めて Mac で zsh を使う人のためのチュートリアル」

この発表をきっかけに zsh を使う人が増えてくれると嬉しい。

感想

俺聞けは3回目ぐらいの参加になるけど、今回も興味深い発表が多かった。発表した人のレポート、参加者の感想なんかは @msng さんのページにまとまってる。

【開催レポート】『俺聞け4』を開催しました #orekike - 頭ん中

その中でも僕が特に気になったのが以下。

2500本の記事から考えた「ウケるタイトル」の考え方 (chaka さん)

タイトルでモテたい。

電子書籍並みの早さで紙の本が出せるサービス「MyISBN」 (Yukihiro さん)

MyISBN を使うと速く安く紙の本が作れる。すごい。

こういう何でもありな勉強会は自分が興味を持っていることが何でも話せるし、普通は聞けないような珍しい話も聞けるのでうれしい。テーマを絞った勉強会も大事だけど、この手の何でもありなやつは意外と少ないのでこれからも続けて欲しいと思う。

そして何より、勉強会を開催してくれる主催者、スタッフのみなさんにお礼を言いたい。

僕は発表するのは好きだけどイベントを開催するのはあんまり得意じゃないので、自分で勉強会を開くのは難しい。こうやって発表、交流の場を作ってくれる方には本当に感謝しています。

主催の @msng さん、スタッフの皆さん、参加者の皆さん、ありがとうございました。

Scala 関西ビギナーズに参加した

2012/12/22 に Scala関西ビギナーズ 第1回 が開かれた。「みんなで Scala やろうぜ」という勉強会だ。

僕の中では最近関数型言語の興味が高まっていて、実際にバシバシ書いてみたいと思っていた。そんなときにこの勉強会のことを知って、Scala で課題を解く時間もあるみたいで丁度いいと思って参加することにした。

内容

まずは前半は @aa7th さん、 @mumoshu さんの発表。

@aa7th さんの発表は、Scala の概要とか長所短所など基本のお勉強。ScalaJVM で動作するプログラム言語です、とかふむふむ聞いてた。

と思いきや途中からコードゴルフに。

こんなダサいコードが、

val start = args(0).toInt
val end = args(1).toInt

var sum = 0
for (num <- start to end)
  sum += num

println(sum)

Scala ならこんなにおしゃれになります!

println((0 /: (args(0).toInt to args(1).toInt)) (_+_))

Scala すげー!

まあ別に短ければそれで良いって訳でもないし、記号が多くて正直やり過ぎの感はあるけど、でも短くする過程でさり気なく var (再代入可能な変数) が無くなってるってのがポイント。Scala はこうやって自然に関数型言語のメリットを受けられる言語だと思う。

というわけで、今回学んだ Scala の特徴は以下。

  • 手続き型言語のようにもかける
  • 関数型言語のようにもかける
  • 冗長な記述が不要
  • しかし型のチェックなど静的型付けの特徴は失われていない

書きやすくて、それでいて安全な言語という事で、やっぱり Scala 便利。

発表資料は slideshare で公開されてるので復習しておこう。

課題

前半でいい感じに盛り上がったところで、いよいよ後半の課題の時間。Project Euler の問題Scala で解いていった。

1問目はけっこう簡単な感じで「こりゃ楽勝、ばんばん解くぜ」とか思ってたけど、2問目からいきなり難しくなった。ごり押し計算では終わらなさそうなやつとかにくじけそうになりつつも、なんとか problem 1と4を解答した。

問題数としてはあんまり進まなかったけど、色々考えながらコーディングできたし、困った時に教えてくれる先生もいて、ほんとに勉強になった。

感想

Scala はやってる人が少ないとかとっつきにくいとか言われてるみたいだけど、こういうイベントがあると勉強するきっかけになるし、全体としても盛り上がると思う。今回の勉強会は良いきっかけになりました。開催してくれた @aa7th さん、ありがとうございました!

あとは、この手の勉強会は予習復習が大事だと思う。僕の目標はこんな感じ。

  • コップ本を読む
  • 何か Web サービスを作る

がんばる。

あと、今回の会場のオオサカンスペースは駅から近いし、おやつもあるし、楽しそう。普段の勉強の時とかにも使ってみたくなった。こっちにも注目。

第2回 関数型言語勉強会 大阪に参加した

2012/11/24 に、第2回 関数型言語勉強会 大阪が開かれた。 なんかすごい人気で補欠だったんだけど、ぎりぎり参加できた。 勢いでLTしてきたので公開する。

JavaScript関数型言語

関数型言語は人気ないけど、JavaScript はみんな使ってるし関数型言語っぽく使えるし、JavaScript関数型言語はやらせたら良いと思って発表した。

関数型言語っぽい JavaScript の使い方はこんな感じ。

filter

filter はリストの中から条件を満たすものだけを集める処理のこと。

Haskellで書くと ...

-- 0より大きいものだけ集める
xs = [-2, -1, 0, 1, 2]
filter (\x -> x > 0) xs
-- => [1, 2]

関数型言語っぽい。

伝統的なJavaScriptの場合

var xs = [-2, -1, 0, 1, 2];
var result = [];
for (var i = 0; i < xs.length; i++) {
  if (xs[i] > 0) {
    result.push(xs[i]);
  }
}

// => result は [1, 2]

かっこわるい。いまどき for のループとか意味が分からない。

でも、最近のJavaScriptならちゃんと書ける。

var xs = [-2, -1, 0, 1, 2];
var odd = xs.filter(
  function(x) { return x > 0}
);

// => [1, 2]

おしゃれ!

これは ECMAScript 5の仕様に追加されている。 対応していないブラウザは無視してよい。 ばんばん使っていきましょう。

map

map はリストのすべての要素に関数を適応して新しいリストを作るやつ。

Haskellで書くと ...

-- 全部2乗する
xs = [1, 2, 3, 4]
map (\x -> x * x) xs
-- => [1, 4, 9, 16]

いいね、いいね。うらやましい。

JavaScriptでもできる。

var xs = [1, 2, 3, 4];
var square = xs.map(
  function(x) { return x * x }
);
// => [1, 4, 9, 16]

reduce (たたみこみ)

reduce はリストを順に処理して一つにまとめるやつ。

Haskellで書くと ...

-- 1から4まで足し算する
foldl (+) 1 [2, 3, 4]
-- 10

当然JavaScriptでもできる。

var xs = [1, 2, 3, 4];
var sum = xs.reduce(
  function(x, y) { return x + y }
);
// => 10

reduceRight を使うと右から結合できる。

部分適応

部分適応は、元の関数から引数の一部を固定した新しい関数を作ること。

Haskellで書くと ...

-- かけ算する関数があります
product x y = x * y

-- 片方を-1で固定
neg = product (-1)

neg 5
-- => -5 (-1 * 5 を計算している)

JavaScriptでもできます!

var product = function(x, y) { return x * y };

// product の第1引数が -1 に固定された関数を作る
var neg = product.bind(null, -1);

neg(5) // => -5

応用例

こういうやりかたを使うと、例えば平均と標準偏差を求める計算はこんな感じで書ける。

var calc = {
  "+" : function (x, y) { return x + y },
  "-" : function (x, y) { return x - y },
  "*" : function (x, y) { return x * y },
  "/" : function (x, y) { return x / y },
  "^" : function (exponent, base) { return Math.pow(base, exponent) }
};

// 符号を反転
calc["neg"] = calc["*"].bind(null, -1);
// 2乗
calc["^2"] = calc["^"].bind(null, 2);
// ルート
calc["^(1/2)"] = calc["^"].bind(null, 0.5);


// 平均を計算する
var getMean = function(array) {
  return calc["/"](array.reduce(calc["+"]), array.length);
};
getMean([1, 1, 3, 5])
// => 2.5

// 標準偏差を計算する
var getStddev = function(array) {
  var mean = getMean(array);

  return calc["^(1/2)"](
            calc["/"](
                array
                  .map(calc["+"].bind(null, calc.neg(mean)))
                  .map(calc["^2"])
                  .reduce(calc["+"])
                ,
                calc["-"](array.length, 1)
         )
  );
};

getStddev([1, 1, 3, 5]);
// 1.9148542155126762

感想

関数型言語なんて誰も使っていない空想の言語と思ってたけど、参加者がかなり多くて驚いた。 特に実際のサービスで使っている人の話が聞けて、とてもありがたかった。 なんかもう関数型言語ってそんなに特別なものではなくて、普通に選択肢に入るような感じ。

勉強会に参加して気合が高まって何でもできそうな感じなので、僕も何かサービス作ってみようと思う。 こうやってやる気が高まったので参加してよかった。

「伝わるプレゼン」という発表をしてきた

5/8に「プレゼン勉強会」というイベントがあった。
【大阪開催】5月8日にプレゼン勉強会を開催します! - 頭ん中
プレゼンするときに気をつけていることなんかを発表して共有する勉強会のようだ。

僕はこの前『俺の話を聞け!2012』 でプレゼンについて発表したんだけど、それがきっかけで今回もお話ししてみませんか、みたいな感じで招待された。

平日でちょっと参加しにくかったけど、せっかくなので前回の内容を元に手を加えて発表することにした。

しかし、勉強会のテーマがプレゼンということでかなりハードルが高い。どうなることやら、と不安を抱えつつ参加した。

発表内容

発表のタイトルは「伝わるプレゼン」。

プレゼンをするときの「テーマ選定」「資料作成」「当日の発表」と大きく3つに分けてお話しした。その中でも僕は「資料作成」が簡単で効果的だと思うので、そこをポイントとしてお話ししてきた。

スライドの中でも書いたけどPresentation Patternsというサイトとかに良さそうな手法がまとまっていているので参考にしてみるといいと思う。

今回他の方の発表なんかでもいろいろ注意点が出てきたけど、僕は基本的に出来ないことはあきらめて、出来る範囲のことをがんばるようにしてる。

なぜかというと、発表の評価って加点評価だから。ちょっとぐらい欠点があっても、聴いている人に役に立つとか注目のポイントがあればきっとプラスの評価になると思う。なので出来ないことは気にせず好きなこと、得意なことをがんがんアピールしていけばいいと思う。

ただし、最近は自分なりのパターンが固定されてきて、発表するスタイルとかやっていることが狭くなっているように感じてる。なので他の人とかを参考にしてもうちょっと、今までやったことがないことにも挑戦していきたい。

イベント全体について

今回はテーマがプレゼント言うことで、営業の人とか技術系でない方も参加されていた。誰にでも関わりのある内容で幅広い方が参加されて、プレゼンの考え方を共有するというイベントの趣旨がうまく達成できたと思う。

僕は勉強会を主催したり人を集めたりとかはあんまり得意でないので、今回主催者の@msngさんのようにイベントを開いてくれる方は本当にありがたいと思っています。そんな方に「勉強会を開くので発表しませんか」と声をかけてもらってとても光栄です。

次は6月2日に『俺聞け3』が開かれるようだ。こっちにも参加しようと思う。