SHOYAN BLOG

I am a pragmatic programmer.

30歳から始める数学

math-image

この記事はMath Advent Calendar 2015 2日目の記事です。
前回の記事は515hikaruさんのMath Advent Calendar 2015 一日目 - 515 ひかるのブログ 日常編です。

とあることから、30歳にして数学を学び始めました。いまは毎日楽しく数学の書籍を読んだり方程式を解いたりしています。
本記事では、僕と同じようにもう一度数学を学びたいなと思っている人向けに、数学の魅力を再発見する方法を紹介します。

30歳にして数学を学び始めたきっかけ

きっかけはプログラマのための数学勉強会です。
とあるご縁でこの勉強会で発表することになり、そこから数学を学び直しました。

内容については、以下の記事を参照ください。

この数学勉強会で数学を勉強することになったのですが、様々な書籍を読んでいくうちに、「なんだ数学って面白いじゃないか!」と感じるようになりました。
いまとなっては、趣味で数学を学んでいます。

数学をやり直してよかったこと

アルゴリズムに強くなる

数学を理解するには論理的な思考が必要です。
なぜかというと、数学は1つ1つの単純な定理を積み重ねて段々と複雑な定理を作っていくからです。

これって、アルゴリズムと似ていると思いませんか。
アルゴリズムも1つ1つは単純です。
単純なアルゴリズムが積み重なって複雑なアルゴリズムを形成していきます。

考え方が同じということは、数学に強くなるということはアルゴリズムに強くなるということでもあるのです。

数学を違う観点でみることができた

学生の頃は、問題を公式に当てはめて解を出すということをひたすらやっていました。
数学がおもしろくないと思っている人はこの観点で数学を捉えているのではないかと思います。
しかし、公式を当てはめて解を出すというのは数学の一部分です。

解を出すより重要な点は、「数学の理論を使うことである問題を解決することができる」という点だと思います。
このような観点で数学を捉えると見え方が違ってきます。

自分としては方程式を解くことより、方程式を自在に作れるようになりたいと思っています。

どういうふうにやり直したのか

図書館で数学に関する書籍を借りたり、書籍を買って学びました。
書籍は通勤の時間に読んでいます。

読んだ書籍のうち、個人的に面白いと感じた書籍を紹介したいと思います。

おすすめの書籍

はじめまして!数学

はじめの1冊は何がよいかと聞かれたらまずはこの1冊をおすすめします。
廃盤となっていましたが、リメイク版がでたようです。
数や素数、無限の概念から始まり、ベクトル、分数の話しがイラストつきで解説されています。
語り口がわかりやすく、数学の知識がなくてもスラスラと読めてしまいます。
また、挿絵がいい味を出しています。
この書籍を読めばきっと数学がおもしろいと思うはずです。

数学入門

こちらもおすすめの1冊。数学書の大ベストセラーです。
はじめまして!数学より内容は難しめなので2冊目におすすめします。
数学の歴史的な話し、分離量と連続量、代数、図形、複素数について解説されています。

これだけはおさえたい-文系プログラマーの数学知識-基礎の基礎-

プログラマーの数学入門用におすすめの1冊。
コンピュータサイエンスの基礎的な話しや、数学がプログラミングでどのように使われているかが丁寧に説明されています。
この書籍を読めば代数学や微積分がどのようなところでプログラミングに利用されているかがわかることでしょう。

いかにして問題をとくか 実践活用編

G.ポリアの著書が有名かと思いますが、こちらは現代版 いかにして問題をとくかです。
全体的に平易な文章で記述してあり、専門用語や数学の知識がなくても読めるようになっています。
まずこちらを読んでからG. ポリアのほうにとりかかると、より理解がしやすいのではないかと思います。

数学ガール

たくさんのシリーズが出版されている数学の人気書籍です。
物語形式になっており、そちらの話しもおもしろいです。
また、物語形式だと頭にスッと内容が入ってくるのでよいですね。
物語を楽しみながら数学の勉強もできるというお得な著書です。

まとめ

数学を学び直すことで、様々な関心することに出会えました。また、先人への畏敬の念を抱かずにはおれません。
というのも、現代数学の基礎は紀元前〜19世紀にかけて発見されているのです!改めて数学とは面白い学問だなと感じています。
これからも楽しみながら数学を学んでいきたいと思います。

本記事が数学の魅力を再発見していただくきっかけになれば幸いです。

冒頭でも申し上げた通り、本記事はMath Advent Calendar 2015の記事ですので、次回へのバトンを渡したいと思います。
次回は、12/3(水) PAIOTU_NO_OWARIさんによる選択公理⇔整列定理の証明のお話しです。

最後にMath Advent Calendar 2015を企画してくださった、515hikaruさん、楽しい企画をありがとうございました。

プログラマのための数学勉強会@福岡#2に登壇してきました

2015年11月6日(金)にプログラマのための数学勉強会@福岡#2が開催されました。

前回に続き、今回も発表をさせていただきました。

今回は「コンピュータと数学」というタイトルで、コンピュータでデータがどのように扱われているかや、コンピュータで行われる演算についてお話させていただきました。

他の登壇者のかたのスライド

他の登壇者のかたのスライドを紹介します。

###「無限と計算可能性と対角線論法」
@nakalyさんはコンピュータの停止性問題と対角線論法についてお話をされていました。

「Shinyで中心極限定理」

Tomokazu Fujino(@nonki1974)さんは、R言語とフレームワークのShinyを使って行う統計のお話をされていました。
大学の先生をされているので、発表がとてもお上手でした。
fukuoka.Rを主催されているとのことです。
発表のスライドは公開されていないようでした。

「オイラーの等式」

@ringojuringoさんは、「オイラーの等式」の証明についてお話されていました。
テイラー展開を使って証明ができるとのことでした。
発表のスライドは公開されていないようでした。

Twitterのまとめ

プログラマのための数学勉強会@福岡#2まとめ

おわりに

主催者の@tkengo氏は急用のため、残念ながら今回は欠席でしたが、今回も面白い内容だったなと思います。

場所を提供いただいた、LINE Fukuokaさん、登壇者、参加者のみなさん、ありがとうございました!

Rails4でlibディレクトリをautoloadするときのルール

Rails4でlibディレクトリに作ったライブラリを読み込むときはautoloadを利用すると便利です。
autoloadを利用するにはファイル名とクラス名がautoloadのルールに則っている必要があります。

autoload のパスを設定する

まず config/application.rb に autoload 用の設定を行います。

config/application.rb

1
2
#to auto load lib/directory
config.autoload_paths += %W(#{config.root}/lib)

これで、lib ディレクトリ以下のファイルが、以降に説明するディレクトリ・ファイル構成と命名の規約に従うと、自動的に読み込まれるようになります。

lib ディレクトリ以下のファイル

ファイル名は小文字、単語の区切りは _ (アンダースコア)にする。
クラス名はアンダースコアの区切りでキャメルケースにする。

以下はファイル名とクラス名の例です。

lib/hoge_fuga.rb

1
2
class HogeFuga
end

lib/hoge ディレクトリにファイルを置くこともできます。

lib/hoge/fuga.rb

1
2
3
4
5
6
7
8
9
module Hoge
  class Fuga
  end
end

# 以下の様にも書けます。

class Hoge::Fuga
end

以下の様な書き方もできます。

lib/hoge_moge/fuga.rb

1
2
3
4
5
6
7
8
9
module HogeMoge
  class Fuga
  end
end

# もしくは

class HogeMoge::Fuga
end

超高速grep「The Silver Searcher(ag)」からhighwayに乗り換えた

プログラマーにとって,grepコマンドはなくてはならない存在です。
基本的かつ古典的なユーティリティであるgrepですが,使いにくい面もあります。

2013年のはじめころから,grepに取って代わるコマンドとして「The Silver Searcher」(以下「ag」)が注目されはじめました。
そして最近、highwayというagライクで高速なgrepツールがリリースされました。

The Silver Searcher(ag)とは?

highwayの紹介の前にagとagが開発された背景について説明したいと思います。

プログラムを書いていると,ソースコード全域にわたって文字列を検索したい,ということはよくあります。
そのようなときにgrepコマンドが活躍するわけですが,ソースコードのディレクトリには検索したくないファイルが往々としてあるわけです。

たとえばバージョン管理システムが使っている「.git」ディレクトリは,検索対象に含めたくありません。
これをgrepで実現しようとすると,オプションやパイプを組み合わせて,少々面倒なワンライナーを書く必要があります。

こういった問題を解決するため,ackというプログラムが作られました。
ackは以下のような特徴を持つ,開発者向けの賢いgrepツールです。

  • デフォルトでディレクトリツリーを再帰検索
  • .gitなどを暗黙的に除外
  • 検索するファイルタイプをオプションで指定可能(–perl,など)
  • 拡張子だけでなく,shebangを見てファイルタイプを判別可能
  • 検索結果をファイル単位でわかりやすくまとめて表示

ackはgrepと比べて使い勝手がよいのですが,Perlで実装されていることもあり,動作速度に難があります。
その動作速度の問題を改善するためにagが開発されました。

agは開発者が「A code searching tool similar to ack, with a focus on speed.」と紹介しているとおり,「高速なack」を目指して開発されたプログラムです。
「ackに比べて3から5倍高速」を謳っており,そして実際非常に高速です。

The Silver Searcher(ag)の問題点

紹介した通り、使い勝手がよく、性能もよいagなのですが、以下の問題点があります。

  • EUC-JPやShift_JISなどの日本語に使われるマルチバイト文字列が検索できない
  • 検索結果の出力順が検索する度に異なる

全てのコードがUTF-8であれば問題ありませんが、日本語圏で使われるファイルでは、なかなかそうもいきません。
検索結果の出力順が検索する度に異なるのも少し使いにくいと感じます。

その点、highwayはEUC-JPやShift_JISをサポートしており、検索結果の表示順の問題もありません。

highwayのメリット

agの問題点であげた点をhighwayはクリアしています。
また、速度もagよりも高速です。

ベンチマークについては以下の記事をご覧ください。
http://tkengo.github.io/blog/2015/10/19/release-highway/

highwayのインストール

For OS X

homebrewでインストールできます。

1
2
$ brew tap tkengo/highway
$ brew install highway

For Fedora Core

1
2
3
4
5
6
7
8
$ sudo vi /etc/yum.repos.d/highway.repo
[repos.highway]
name=highway
baseurl=http://tkengo.github.io/highway/fedora
enabled=0
gpgcheck=0

$ sudo yum install highway --enablerepo="repos.highway"

使い方

1
2
3
4
5
6
7
8
# カレントディレクトリをhogeをいう文字列で再帰的に検索
$ hw hoge

# public_html以下のディレクトリからhogeという文字列を検索し、マッチした行から10行目までを表示
$ hw -A 10 hoge public_html

# オプションは以下のコマンドで参照できます
$ hw -h

unite.vimと連携する

unite.vimのgrepにhighwayを使うようにします。

1
2
3
4
5
6
7
8
9
" grep検索
nnoremap <silent> ,g  :<C-u>Unite grep:. -buffer-name=search-buffer<CR>

" unite grepにhw(highway)を使う
if executable('hw')
  let g:unite_source_grep_command = 'hw'
  let g:unite_source_grep_default_opts = '--no-group --no-color'
  let g:unite_source_grep_recursive_opt = ''
endif

おわりに

grepツールは完全にhighwayに乗り換えましたが、速度面、機能面に関しては問題ありません。
まだgrepで頑張っている人はもちろん,agをすでに使っている人であっても,highwayの利用を検討する価値は充分にあると思います。

C言語でHello World

たくさんのソフトウェアがC言語で作られており、自分もそういうソフトウェアの仕組みを知ったり自分で作れるようになりたいなと思って、C言語の勉強を始めました。

とりあえず、最初はC言語でHello worldをしてみます。
環境はMac OSXです。
X Codeをいれたら、gccが入るのでC言語はすぐ動くようでした。

gccがインストールされているかの確認

gcc -v と入力して、以下のように表示されたらOKです。

1
2
3
4
5
⇒  gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.0 (clang-700.0.72)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

Hello Worldする

hello.cを作成して以下のように記入します。

1
2
3
4
5
6
#include <stdio.h>
int main(int argc, char **argv)
{
    printf("hello world\n");
    return 0;
}

コンパイルします。

1
$ gcc hello.c -o hello

helloという実行ファイルができるので、実行します。

1
2
$ ./hello
hello world