理性の限界
僕は大学に入学する前の春休みにこの本を読みました。
めちゃくちゃ面白いです!!
どのぐらい面白いかというと、ハンターハンターのキメラアント編やワンピースのアラバスタ編を初めて読んだ時ぐらい興奮しました。難しい学問のめちゃくちゃ興味をひく部分だけを抽出した本です。
理性の限界――不可能性・不確定性・不完全性 (講談社現代新書)
- 作者: 高橋昌一郎
- 出版社/メーカー: 講談社
- 発売日: 2008/06/17
- メディア: 新書
- 購入: 56人 クリック: 299回
- この商品を含むブログ (177件) を見る
本の特徴
・「理性の限界」についてのシンポジウムが開催されたという設定で、様々な立場を持つ人たち(会社員、運動選手、数理経済学者、カント主義者、科学主義者などほんとうにいっぱい出てくる)の会話形式で話が進む
・それぞれの立場の人が自分の専門分野の話を延々と語り出そうとする→司会者が止めに入って話を戻す という流れが多く、一つの見方に深く入り込むことなくいろいろな考え方を知ることが出来る。(カント主義者とかは何の話でもカントに持って行き、他の人からたしなめられるので面白い)
・会話は実際に人が話しているのではなく筆者が全部書いているのだが、難しい学問の「説明」になっていないところがとてもいい。対話形式を採用し、体系だって説明する必要がなくなることでより読者の好奇心を刺激するところにフォーカスできていると思う。
面白いところ
僕は個人的に2章の科学の限界が面白かったです。「科学の限界」は大雑把にいうとニュートンの物理学→アインシュタインの物理学→量子論 と科学が発展してきた話をして、最終的に「めちゃくちゃミクロの世界ではどんなに頑張っても『知ることができない』(不確定性)」という話に進んでいきます。
ニュートンの物理学では「世界中の現象を同じ数式で表せる!!」というブレイクスルーが起こり、何百年もニュートンの力学がいわゆる「真理」だという時代が続きます。
しかし光は例外だと気づいたアインシュタインは宇宙のような大きすぎるもの、光のような速すぎるものでさえも扱えるさらに普遍的な物理学を築きます。
しかし原子より小さいようなミクロの世界ではアインシュタインの理論でさえも太刀打ちできず、どうやら小さすぎるものを計算することは「どんなことをしても絶対不可能」らしい・・・
という話で、読んでいてめちゃくちゃ興奮しました。「知ることを極めていった結果知れないことを知る」というのができすぎな展開で、まるで進撃の巨人のウォールマリアを奪還して伏線を回収しまくっている部分を読んでいるときのような身震いを覚えました。
まあここに書いた拙い文章では僕が味わった興奮の100分の1も表せていないんで、みなさんぜひ買って読んでください!
数式とか面倒な解説は一切出てこないんで、物理未修の文系の僕でもすらすら読めました。
ローカル開発環境とは何か?
僕はここ3日ぐらいこの本でpythonを使ったクローリングとスクレイピングの勉強をしています。
Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-
- 作者: 加藤耕太
- 出版社/メーカー: 技術評論社
- 発売日: 2016/12/16
- メディア: 大型本
- この商品を含むブログ (3件) を見る
クローリング =Webページのハイパーリンクをたどって次々にWebページをダウンロードする作業。
スクレイピング=ダウンロードしたWebページから必要な情報を抜き出す作業。
この本の付録に「Vagrantによる開発環境の構築」という章があるのですが、僕は今まで「インストールは全て本の指示通りにAnaconda、コードを書くのは全部Jupyter Notebook上」というとても楽なやり方をしていたので全然わかりませんでした。
そこで開発環境とは何で、何のためにあるのかを調べたのでここにまとめておきます。
間違いがあったらご指摘お願いします。
1、ローカル開発環境とは何のために作るのか?
・自分のアプリケーションやホームページなどの作品(この本の場合はクローラ)を手元のパソコンから24時間インターネットにつなげるのは難しい。
・そのため常にインターネットに接続してあるサーバーを借りる必要がある。
・しかしレンタルサーバーはLinuxというOSを使っていることが多く自分のパソコンのWindowsやOS Xで作ったものをそのまま移すと機能しない可能性がある。
・そのため自分のパソコンの中にLinuxというOSを使うローカルな開発環境を作る必要がある。
*開発環境とは何かを開発するために自分のパソコンの中で作った環境、本番環境とは実際に渡すサーバーが使っている環境のことを指す。
2、ローカル開発環境はどういう時に必要か。
ローカル開発環境を作る必要があるのは主にWebサービスを作る時です。そのためPHPやRubyでWeb開発を勉強する人は知っている必要があります。またSQLなどでデータベースを扱う際もローカルな環境は必要になります。
3、ローカル開発環境を勉強しているとよく出てくる言葉の意味
- Virtual box
オラクルが無料で提供している、仮想環境を構築するためのソフトウェア。
Virtual boxなどで作った開発環境を簡単なコマンドで扱えるようにするためのツール。
- Cent OS
Linuxの一種。サーバーを構築する時に使われることが多い。
Pythonの組み込み関数の分かりやすさ重視のまとめ
pythonにはちゃんとした公式ドキュメントがあり必要な情報が網羅的に載っています。そこでpythonをより深く理解するために数日前から公式ドキュメントを読み始めました。
ですがチュートリアル(Python チュートリアル — Python 3.6.5 ドキュメント)を読み終わり、ライブラリーリファレンスの組み込み関数のページ(2. 組み込み関数 — Python 3.6.5 ドキュメント)を読み始めたところ一気に難易度が上がって詰まってしまいました。
この組み込み関数のページはとても網羅的で質の高い情報だと思うのですが、
- 機械的なアルファベット順
- クラス名も組み込み関数と一緒くたにしている
という点で初学者には理解が難しいと思います。
そこでpython3.6.5版にある組み込み関数すべてについて、なるべく似た関数をグループにして紹介してみます。入れなくてもいい引数などは省略しているので組み込み関数の全ての機能は紹介しきれていませんが、ぜひ参考にしてみてください。(ちなみに全部で68個あります)
もし分からない用語があったらこちらを見てください。
1 特定の組み込み型を作るためのもの 16個
- bool
bool値を返す
- bytearray
新しいバイト配列を返す
- bytes
bytes型を返す
- complex
complex型(複素数型)を返す
- dict
ディクショナリ型を返す
- float
float型(浮動小数点型)を返す
- frozenset
frozenset型(イミュータブル、つまり変更不可能な)セット型を返す
- int
int型を返す
イテレータ型を返す
- list
リスト型を返す
- memoryview
メモリービュー型を返す
メモリービュー型はbyte配列が使っているメモリ領域を使うために必要らしいが初心者には必要なさそう。
- object
特徴を持たない新しいオブジェクトを返す。object型は全てのクラスの基底クラス。
- set
set型を返す
- slice
range(start,stop,step)で指定されるインデクスの集合であるスライス型を返す
- str
str型(一般的な文字列型)を返す
- tuple
タプル型を返す
2 基本的 or 便利な操作 9個
- compile
- dir
引数がない時は現在のローカルディレクトリの名前のリストを、ある時はそのオブジェクトの有効な属性のリストを返す。(めっちゃ便利。みんなのpythonでは魔法の関数と呼ばれていた)
- format
文字列への変数の埋め込みをする。
- help
組み込みヘルプシステムを起動する。引数に型の名前や関数の名前を入れると英語の説明文が出てくる。
- input
ユーザーが入力したデータを受け付けるための関数。printが標準出力として用意されているのに対し、inputは標準入力として用意されている。
- open(file,mode)
ファイルを開き、対応するファイル型を返す。この関数は引数modeに入れるアルファベットを覚える必要があるのでちょっと面倒。
r = read = 読み込み
w = write = 新しいファイルに書き込み
a =add =既存のファイルの末尾に書き込み
+ =plus = r,w,aの後につけると読み込みと書き込み両方できるようになる
引数に入力されたオブジェクトを表示する。pythonの勉強を始めた人はみんな一番最初にこれをやると思う。
- super
メソッドの呼び出しを引数のtypeの親または兄弟クラスに委譲する。クラスの中でオーバーライドされた継承メソッドにアクセスするのに便利。
- type
オブジェクトの型を返す。
3 真偽値を返すもの(分類に使うことが多い) 6個
- all(iterable)
引数のイテラブルの値がすべて真ならTrue、一つでも違ったらFalseを返す。
- any(iterable)
引数のイテラブルの値が一つでも真ならTrue、すべて偽ならFalseを返す。
- callable(object)
引数が呼び出し可能なもの(関数、メソッド、クラスなど)ならTrue,呼び出し不可能なもの(文字列、モジュールなど)ならFalseを返す。
- hashattr(object,name)
nameがobjectの属性ならTrue,違ければFalseを返す。
- isinstance(object,class)
objectがclassのインスタンスならTrue,違ければFalseを返す。
- issubclass(classA,classB)
classAがclassBのサブクラスならTrue,違ければFalseを返す。
4 数の操作に関するもの 7個
- abs
絶対値を返す。
- bin
0bから始まる2進数での値を返す。英語では2進法をbinaryというらしい。
- divmod(a,b)
a/b(a割るb)の商と余りからなる対を返す。
- hex
0xから始まる16進数での値を返す。英語では16進法をhexadecimalというらしい。
- oct
0oがついた8進数での値を返す。英語では8進法をoctalというらしい。
- pow(a,b)
aのb乗を返す。
- round
小数を丸める。
5 イテラブルの操作に関するもの 12個
- enumerate(iterable)
引数のイテラブルのインデックスと値からなるenumerateオブジェクトを返す。forループの時に使うととても便利。
- filter(function,iterable)
イテラブルの要素のうち、関数が真になるものだけでiterableを構築する。(イテラブルをフィルターにかける)。関数を受け取る関数のため、mapと並んで高階関数と呼ばれる。
- len(sequence or collection)
オブジェクトの長さ・要素数を返す。
- map(function,iterable)
イテラブルの全ての要素に関数を適用し、それぞれの結果を返していくイテレータを適用する。関数を受け取る関数のため、filterと並んで高階関数と呼ばれる。map関数と同じことはリスト内包表記を使うことでもできる。
- max
イテラブルの中で最大の要素を返す。
- min
イテラブルの中で最小の要素を返す。
- next
イテレータの次の要素を返す。
- range(start,stop,[step])
数のイミュータブルなシーケンスを返す。
- reversed(sequence)
要素を逆順に取り出すイテレータを返す。
- sorted(iterable)
イテラブルの要素を並び替えた新たなリストを返す。
- sum(iterable)
イテラブルの合計を返す。
- zip(*iterables)
それぞれのイテラブルから要素を集めたイテレータを作る。引数についている*は引数を何個つけてもいい(可変長引数)ことを表している。
6属性の操作 5個
- delattr(object,name)
属性を削除する。
- getattr(object,name)
オブジェクトの指定された属性の値を返す。
- setattr(object,name,value)
指定したオブジェクトが許せば値を属性に関連づける。
- property
自分で定義したオブジェクトに独自のアクセサを持った属性を追加する
- vars(object)
__dict__属性を返す。(__dict__は属性を保存するための辞書オブジェクト)
7その他 13個
エンコード・文字列関係
- ascii(object)
reprと同様に内部処理用の文字列(eval関数で式として評価した時に同じ値を持つようなオブジェクトを返す文字列)を返し、非ascii文字はエスケープする。
- chr(整数)
Unicodeコードポイントがその数である文字列を返す。
- ord
1文字のUnicode文字を表す文字列に対し、その文字のUnicodeコードポイントを返す。
- repr(object)
asciiと同様に内部処理用の文字列(eval関数で式として評価した時に同じ値を持つようなオブジェクトを返す文字列)を返す。
文字列をpythonコードとして扱う
- eval
文字列を式として評価する。
- exec
文字列を文として実行する。
シンボルテーブル(プログラムのソースコード内の名前とその内容となるデータがセットになった情報のテーブル)を返す
- globals()
現在のグローバルシンボルテーブルを表す辞書を返す。
- locals()
現在のローカルシンボルテーブルを表す辞書を返す。
オブジェクトの情報を返す
- hash(object)
オブジェクトのハッシュ値を返す。ハッシュ値は整数であり、辞書を検索する際に辞書のキーを高速に比較するために使われる。
- id(object)
pythonのオブジェクトがそれぞれ持つ固有の番号(識別値)を返す。
メソッドの変換(デコレータ)
- @classmethod
メソッドをクラスメソッドに変換する。クラスメソッドは第一引数にクラスオブジェクトを受け取るため、インスタンス化しなくても呼び出せるメソッド。クラスそのものに何かの操作をする時に使う。
class C:
@classmethod
def f(cls,引数, ...):
のようなイディオムを使う。(公式ドキュメントより)
- @staticmethod
メソッドを静的メソッドに変換する。静的メソッドは第一引数に何も(クラスオブジェクトもインスタンスも)必要としないメソッド。できることは@classmethodとあんまり変わらないっぽい。
高度な関数
- __import__
「これは日常のPythonプログラミングでは必要ない高等な関数です」と公式ドキュメント二かあkれていたので省略。
Python勉強中に知った用語の備忘録
Pythonを勉強する中で知った専門用語の意味をまとめておきます。これからもどんどん追加していく予定です。他の言語では意味が違う場合もあるので注意してください。
長い記事になるのでWindowsの人はCtrl+F、Macの人はCommand+Fでキーワードを検索すると便利だと思います。
・アクセサ
オブジェクト内部の属性に外部からアクセスするために用意されたメソッド。属性を外部から直接参照させないために用意されている。
消してはいけないデータを長期保存するために、専用の保存領域に安全にデータを保存すること。
・インターフェース
異なる種類のものを結びつける共有部分。プログラム同士の間でデータのやり取りをする際の形式。
・インデクシング
角括弧を伴った表記で要素を参照すること。
PythonやRuby、Javascript、PHP、Perlなどのコードを書いたらそのまま実行できる言語。
・コンパイル型言語
CやC++、Javaなどのコンパイルという手順を踏んで実行ファイルを生成してから実行する言語。コンパイルに時間と手間がかかる分実行が高速であることが特徴。
・エミュレート(emulate)
英単語の意味は「競う」と「真似る」があるが、 プログラミングでは真似るの意味で使われる。あるものの動作を真似て、代替として使えるようにすること。擬似的に別の装置の環境を再現することをエミュレーションという。
文字と数値を互いに変換するためのルール。Unicode 文字列はコードポイントという 0 から 0x10FFFF (10 進表記で 1,114,111) までの数値のシーケンスである。このシーケンスはメモリ上ではバイト (つまり 0 から 255 までの値) の集まりとして表される。Unicode 文字列をバイトのシーケンスとして翻訳することがエンコードでありその規則がエンコーディングである。一番使われるエンコーディングはutf-8。
・オーバーライド
スーパークラスで定義されたメソッドをサブクラスで定義し直し、動作を上書きすること。
・クエリ文字列(query string)
WebブラウザがWebサーバーに送信するデータをURLの最後に付け加えたもの。http://example.com/foo/var.php?name1=value1&name2=value2 の下線のところらしい(コピペしました)
コピーしたものを一時的に保存しておく場所。新たにコピーの操作を行ったりすると上書きされる。
・クローリング
Webページのハイパーリンクをたどって次々にWebページをダウンロードする作業。
ダウンロードしたWebページから必要な情報を抜き出す作業。
・コマンドライン引数
コマンドラインからプログラムを起動する時にプログラムに渡す値。
プログラミング言語で書かれた文字列(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換すること。
プログラミング言語で書かれたソースコードないし中間表現を逐次解釈しながら実行するプログラムのこと。
・シーケンス
配列やリストのように順番に処理するためのデータ構造。基本的なシーケンス型には文字列、リスト、タプル、rangeがある。
・シンタックスシュガー(syntax sugar、糖衣構文)
複雑でわかりにくい書き方と全く同じ意味になるものを、よりシンプルでわかりやすい書き方で書くことができるもの。
・シンボルテーブル
プログラムのソースコード内の名前とその内容となるデータがセットになった情報のテーブル。
・セマンティクス
ソースコード中で利用されている変数や文が正しく動作するかを判断する基準のこと。
・コンテキストマネージャ
with文によって起動され、コードブロックを実行するために必要な入り口および出口の処理を扱うオブジェクト。
データが改変されていないことを確認するためにある整数値で、辞書を検索する際に辞書のキーを高速に比較するために使われる。
・パス名
ディスク上のファイルの場所を示す名前。
・フロントエンド
プロセスの最初の工程、つまりユーザーと直接やりとりする部分を指す。バックエンドとはフロントエンドの入力データや指示をもとに、処理を行って結果を出力したり、記録媒体に保存したりする部分であり、フロントエンドとバックエンドの結合部をインタフェースという。
・リダイレクト
元々は「向きを変える」という意味の言葉で、Web ページ を訪れた ユーザー を自動的に別のWeb ページ へ転送すること またはコマンドの出力先を変えること(python関連で出てきたら大体こっちの意味)
・ルータ
データを2つ以上の異なるネットワーク間に中継する通信機器。
任意の文字列を指定する際に使用する特殊文字のこと。
・識別子
変数や関数などの名前(に使えるもの)。予約語(Pythonではkeywordとも呼ばれる)は識別子に使うことができない。Python3.3ではTrue,is,return,ifなどの33単語が予約語になっている。
・attr
attribute(属性)の略。pythonにはdelattr(属性の削除)、setattr(属性の作成)という組込関数がある。
・API(application programing interface)
主にウェブサービスを利用する時に必要になる、コンピュータ同士が相互に連携するための仕組み。
・argc
argument count(引数の個数)の略
・argv
argument vector(引数の配列)の略
・stdin
standard input(標準入力)の略
・stdout
standard output(標準出力)の略
・stderr
standard error(標準エラー)の略
・urllib
pythonの標準ライブラリ。URL+libraryという意味。
・smtplib
pythonの標準ライブラリ。Simple Mail Transfer Protocol(メールの送信の仕組み)+libraryという意味。
・parse(パース)
文法に従って構文を解析すること。
・serializing(シリアライズ)
標準モジュール jsonがPython のデータ階層を取り、文字列表現に変換すること。(pyrthonの公式ドキュメントにはこう書いてありましたが一般的な意味は違うようなので注意してください)
・pointer(ポインタ)
変数の格納場所(アドレス)を指し示す変数
・refactoring(リファクタリング)
プログラムの外部から見た動作を変えずにソースコードの内部構造を整理すること
・**kwargs
キーワード指定の可変長引数のこと。おそらく由来はkeyword arguments。
・enumerate
数え上げるという意味。pythonの組込関数の一つ。
・foo
変数名の例をあげる時に最初に使われることが多い意味を持たない言葉。2番目はbar、3番目はbaz。
・prompt
動作を促すマークのこと。ターミナルで入力待ちの時に出ているマークが代表的な例。
・I/O
input/outputの略。入出力のこと。
・VM
virtual machineの略。仮想マシンのこと。
世界で一番人気なWebサーバーのソフトウェア。
httpに元々用意されている認証(ログイン)機能。ウェブサイトへのアクセスを制限する方法の一つ。
・PaaS(パース、Platform as a Service)
Cloudサービス(インターネットに接続した状態で使うサービス)の一種で、サーバやOS、データベース、ネットワークなどをインターネット越しにできるようにするもの。
・heroku(ヘロク)
代表的なPaaS。アプリケーションを公開するのに必要な面倒な作業をやってくれるので人気がある。Java、Ruby、Pythonも使える。
・XML
文章の見た目や構造を記述するためのマークアップ言語の一種。HTMLやMarkdownの仲間。
XML文章中の要素、属性値などを指定するための言語。HTMLもXMLの一部とみなしてHTML中の要素を指定することができる。Pythonではクローリングをする時に使う。
・Hadoop(ハドゥープ)
めちゃくちゃ大きいデータを分散させて処理するためのフレームワーク。
HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字からなるコード。百の位が2なら成功、4なら失敗などの決まりがある。
・substring(サブストリング)
部分文字列のこと。文字列の中の一部を指すときにsubstringやsubと書いてあることが多い。
・delimiter(デリミタ)
区切り文字のこと。