c++でstd::stringを分割する方法のメモ
stringで文字列を定義した時に途中で分割する必要が出てきた。
例えば "8:3"という文字列を:で区切って8と3をそれぞれ取り出したい場合について考える。
調べるとそれっぽいページが出てきたのでやってみる。
どうやらstdには標準で文字列を分割する関数がないので自分で実装する必要があるらしい。以下コードコピペ
#include <vector> #include <string> #include <sstream> // std::ostringstream std::vector<std::string> StringSplit(const std::string &str, char sep) { std::vector<std::string> v; std::stringstream ss(str); std::string buffer; while( std::getline(ss, buffer, sep) ) { v.push_back(buffer); } return v; }
使ってみる。
vector<string> vkey = StringSplit("8:3",':');
const string str_key1= vkey[0];
const string str_key2= vkey[1];
とかやれば確かに8と3に分割できた。
中身で何をやってるのか
inputの文字列をstringstreamにつっこみ、ある文字sepまでの文字列を
getlineで引っ張ってくる。while文でsepより前とsepより後の文字列を
vectorに順番に突っ込んでvectorを返り値として返す、みたいなことをやってるはず。
getlineは第3引数(sep)が現れるまでの文字を出力する仕様みたい。
””と''て何が違うんだっけ?と思ったが、文字列は""だけど一文字の場合は''で囲めばいいんだった。忘れてた。
これで分割し放題だ!
【追記】
このままだと数字はstring型として扱われるので、int型とかに変換したかったら
stoi(str_key1)
とかすれば良い。
ラドンって知ってますか?~身近な放射性物質であるラドンのまとめ~
放射能の恐怖
3.11以降(といってももうずいぶん経ちますが)ニュースや新聞でも放射線を扱う話題が増えてきました。
原発に賛成とか反対とかいろんなことが言われてますが、どうも放射線に対して正しい知識をもってない人が感情論で意見を主張している例が多いように思えます。
みたいな意見ですね。放射線は確かにとても恐ろしいですが、正しい知識に基づいて怖がっている人がはたしてどれくらいいるでしょうか?
寺田寅彦さんの言葉に
「ものを怖がらな過ぎたり、怖がり過ぎたりするのはやさしいが、正当に怖がることはなかなか難しい」
という言葉があります。どのような意見を持つにしろ、正しい知識を持つことは重要です。
事故後の福島第一原発
さて、今回はそんな放射性物質の一つであるラドンについて注目して記事をまとめたいと思います。今回ラドンに注目した理由は2つあります。
1.放射能や放射線について素人にもわかりやすく解説したページは多いが、ラドンにについては一般にあまり知られていないと感じるため。
2.自分が勉強したことをとりあえずまとめたい。
の2つです。2については極めて個人的な理由なのでまぁいいでしょう。
1について、、
なぜラドンなのか?
多くの人は「セシウム」や「プルトニウム」、「ウラン」、震災以降は「ヨウ素」なんかを思い浮かべる人が多いでしょう。そもそもラドンが放射性物質であることを知らない人も多いかもしれません。放射線というとどうしても原爆や原発などをイメージする人が多いですよね。
しかし、被ばくする原因はそれ以外にもたくさんあります。
以下の図を見てください。
主な被ばくの原因とその際にどれくらい被ばくするか(単位:ミリシーベルト)をまとめたものです。
実は地球に住んでいるすべての人は普通に生活しているだけでも様々な要因で被ばくしています。
例えばCTスキャンをとったりすると被ばくしますし、食べ物を食べるだけでも被ばくします。CTスキャンのような人工的な放射線を人工放射線、天然のものを自然放射線といいます。
そして自然放射線の中でも被ばくの大きな要素を占めているのがラドンの吸入による被ばくです。
しかもラドンはガスなので、吸い込んだのち体内で被ばくする内部被ばくです。
内部被ばくは外部被ばくに比べて健康へのリスクが高いです。
ラドンについて知ることは、身近な放射線、放射能を知るということです。
放射線は目には見えません。手で触れて確かめることもできません。知識が少ないと恐怖の対象でかありません。
だからこそ、多くの人が放射線について正しい理解を持つべきだと思うのです。
最後にもう一つ、ラドンを学ぶ有用性を一つだけ、実験の観点から触れておきましょう。
放射性物質には半減期というものがあります。一言でいえば、放射性物質が半分になるまでにかかる時間です。半減期が長いということはずっと放射線と出し続けるということなので、なかなかやっかいです。では、現在地球に存在している放射性物質の半減期はどれくらいでしょうか。
例えば地殻中に含まれるウラン(ウラン238)の半減期はだいたい44億年くらいです。多くの人は
「えぇ。。?長っ」と多くの人は思ったでしょう。なんでこんなに長いのでしょうか。
それは放射性物質とはそもそも不安定な物質だからです。放射性物質は小さな視点で見ると、不安定な原子なので、放射線を出して安定な原子になるのです。一度安定な状態になると、もう放射線は出しません。つまり、半減期の短い物質は放っておいてもすぐに崩壊していなくなるのでなんの問題もないのです。逆にウランなんかは地球が誕生したことからありますが、地球が誕生してから今までの50億年間ずっと放射線を出し続け、ようやく半分になってきたところなのです。つまり最も厄介な放射性物質は半減期の長い物質なのです。
原発問題で放射性物質のゴミが問題になっていますが、これは半減期が長く、ずっと放射線を出し続けるため問題なのです。
「あれ、矛盾しているぞ。現在地球に残っている放射性物質はどれも半減期が何億年もある長いものなんじゃないのか?」
という疑問がわいた人は鋭い人です。ではなぜ半減期の短いラドンが地球上に存在していられるのか?
それはラドンが3-4日で崩壊しても次々と新しいラドンがわいてくるからです。
以下の図はラドンの崩壊系列です。地殻中にもともと存在するウランが崩壊して、トリウムになって、トリウムがまた崩壊して、、と次々と崩壊を繰り返してラドン(Rn)になるのです。
大元であるウランの半減期がめちゃくちゃ長いので、ラドンが崩壊してポロニウム(Po)になっても次々と新しいラドンが沸いてくるのです。
つまり、ラドンは身近な放射性物質であるとともに、半減期の測定がほかと比べて用意です。ここから、ラドンは放射線物質を使った実験教材としてもすぐれています。
ちなみにもう一つラドンにはトリウム系列という崩壊系列がありますが、トリウムから同様に崩壊を繰り返してラドンまでたどり着きます。
ラドンはどこにある?
先ほども言ったように、ラドンは天然に存在するガスです。スーハー深呼吸でもすれば簡単に被ばくします。こうやって聞くとやばい物質のような気がしますが、被ばくする量は微量なので問題ないです。被ばくについては「被ばくするかしないか」よりも「少量の被ばくで済むようにするにはどうするか」が重要なのです。
ラドンの場合は地下に多い傾向があるので、地上より地下のほうが被ばくのリスクは高まります。なので、地下に行くときはできるだけ喚起に気を付けたほうがいいでしょう。基本的に被ばくは体に良くないものですが、「少量の被ばくなら体にいい」という考え方もあるようです。少量の酒は体にいい、というのと同じような考え方でしょうか?ホルミシス効果というようです。これを利用したものに「ラドン温泉」なるものがあったり、「ドールストーン」という理容、健康目的で部屋に置くタイプなどいろいろあるみたいです。少量の被ばくは体への影響がわかりづらいため、いろいろは考え方があります。本当に体にいいのかもしれません。しかし、個人的には「被ばくは少量に抑えるに越したことはない」と思っています。あまりその手の情報に踊らされないようにしましょう。(ドールストーンは放射線の測定する実験用の放射線源としては重宝してますが。。)
ドールストーン。公式サイトより。
まとめ
・我々は普通に生活しているだけでもある程度被ばくしている
・自然放射線の主な原因の一つにラドンの吸入による内部被ばくがある
・ラドンを商用利用したものもあるが、あまりおすすめはしない
以上です。今回は放射線の発生原理などの物理的な現象や被ばくの計算式などについてはあまり触れませんでしたが、その辺についてはわかりやすく解説したサイトや本が多数あるのでよかったら勉強してみてくださいね。
わかりやすさを優先して多少正しくない表現も含まれているかもしれませんが、意見や質問などなんでも受け付けています。
おわり。
誰が原子をみたか『江沢洋』
せっかくブログを始めたので書評でも書く。
書評というか感想だけど。
今回紹介するのはこの本。
歴史的にどのような経緯で原子が発見されたのか、というテーマの本。
こうやって書くとテーマを「原子」に絞っているようだけど、実際は「科学史」としても随分ボリュームがあって教養になるし「読み物」としても十分面白い。
僕自身買ったのは2年くらい前なのだけど、時々忘れたころに本棚から引っ張りだして読みたくなるくらいには魅力的な本だと思う。また、もう40年前の本であるにも関わらず、ちょこちょこいろんなところで紹介されていたりする。
(実際僕がこの本を知ったのは田崎晴明さんの統計力学の本で紹介されているのを見たときだ)
いったいこの本のどこが面白いのか、僕の中で考えてみた結果、
科学的に考えることができる
ことが一番の魅力なんじゃないかと思う。僕は科学がすきだ。特に物理学が好きだ。こういうことをいうとたまに「へぇ、勉強が好きなんだ」とか「頭がいいんだねー」とか言われて奇異の目を向けられることがある。おそらくそういう人にとっての科学とは中学生時代の「理科の教科書を読んで暗記して勉強してテストで良い点をとること」とイコールなのだろう。高校に入ってからはそれは「難しい数式をこねくり回す科目」変化する。
前者についてもう少し具体的に考えてみる。例えば中学の理科の教科書では「すべての物質は原子からできています」と習う。そしてそれを暗記してテストで点をとる。これがテストで点をとるための勉強である。
でもよくよく考えると不思議だ。だって、生きている人や動物や、土や金属などの無機物、燃えている火や流れる水がすべて同じ原子からできているなんて納得できるだろうか?しかも原子なんて目には見えない。
僕はこういう疑問をもつことが科学を好きになるの第一歩なのだと思う。理科の教科書には、今では常識になっているものばかりだけど不思議がいっぱいだ。例えば
「空気が原子からできているなら、部屋の中の空気は時間が経つと重力で下の方に溜まってしまうのではないのか?」
「地球が太陽の周りを回ってるって本当だろうか?地球から見たら明らかに太陽が地球の周りを回っているように見える」
「原子核はプラスの陽子と電荷を持たない中性子が集まってできているというけど、なぜプラス同士で反発しないのか?」
「熱の正体は分子の運動って本当だろうか?またそれはどうやって確かめられるんだろうか?そもそも電気の正体が『電子』の流れなんだから、熱の正体が『熱素』という目に見えない粒子だと考えても不都合はなさそうである」
とかね。これらの疑問にすべて自信を持って答えられるだろうか。これらの疑問を考えることを放棄し、ただ常識として覚えることに注力し始めた時点で、それは科学でなくただの苦痛な暗記科目に成り下がる。
こういう疑問を昔の人はあれこれ仮説を立てたり実験をしたりして確かめたのである。
どのような経緯で科学が始まり、当時の人はどのように考え、どんな実験をして、どのような思考を経て認められていったのか。この本にはそういった経緯が読みやすく文章で記されている。だからこそ様々なドラマがあり、読み物としても面白いのである。そして当時の人の記憶を追体験しているような気分になれるのだ。
根底にあるのは「この世界はどのようにできているのだろうか?」という誰もが一度は考えたことがあるであろう純粋な好奇心であり、それをあれこれ考えながら明らかにしていく。わくわくしないわけがないと個人的には思うのだけれど。。
個人的には大気圧の話が面白かった。
ちょこちょこ数式が出てくるものの、内容的には中学生が読んでもわかるし、また大人が読んでも学ぶことは多いとおもう。
書評ってこんな感じでいいのかな?なんか文章が堅いような気もする。
まぁいいや、おしまい!
Firefoxをvimのキーバインドで操作する方法〜vimperatorを入れよう〜
動機
vimを使ってコードや文章を書くときは基本的にキーボードしか使わない。移動もコピペもすべてキーボード上のショートカットで行うのである。例えばカーソルの移動も矢印キーなんか使わず"hjkl"の4つを使って移動する。矢印キーはホームポジションから遠いからあんまり使わないのね。行コピーは"yy"、文字検索は"/"とかまぁ他にも大量のコマンドがある。つまり、基本的にホームポジションから動きたくないのである。vimmerにとってはマウスも矢印キーもテンキーもいらないのだ。
そんな感じでvimの素晴らしさに汚染されてくると、「あーwebブラウザ使うときにいちいちマウス使うのめんどくさいなー」とか「vimのコマンド使わせてくれー」という気持ちが湧き上がって発狂しそうになるのだ。(ほんとか?)
そんなわけで今回はFirefoxのアドオンを利用する。
ブラウザの話
世の中にはたくさんのブラウザがありますね。Windowsに標準で入ってるIEとかgoogleが開発してるgoogle Chromeとか。macのPCやiPhoneにデフォルトで入ってるのsafariとか。そしてlinux系のOSにデフォルトで入ってるのがFirefoxである。
それぞれのブラウザには個性があって、まぁぐぐるといろいろ出てくるのだけど、個人的な印象だと
IE→くそ多くの人が使っている
Chrome→はやい
safari→pdfとかの表示が綺麗
Firefox→いろいろ拡張できる
といった感じ(個人の感想です)。Firefoxの何が便利かというと、アドオンを追加することでいろんな機能を追加できる点である。
そんなわけで今回はFirefoxにvimperatorというアドオンを追加することで、Firefox上でvimっぽい動きができるようにする。やるぞぉ〜
vimperatorを入れる
https://addons.mozilla.org/ja/firefox/addon/vimperator/
ダウンロードを続ける→Firefoxに追加であっさり入る。再起動してくださいねと言われるので再起動。
Firefoxを開きなおすとvimperatorが使えるようになっている。
hjklで移動できる!感動。
いろいろとvimっぽい挙動をするのだけど、まだ操作がなれずによくわからない。
ちょこちょこ調べながら使っていこう。
そんなわけで使い方の説明や初期設定の説明は今回はしません。(なぜならまだ使いこなせていないから)
頑張って使いこなすぞー
Ubuntuにrootを入れる
さて、Ubuntu 16.04 LTSをPCに入れることができたので、次にrootを入れる。
rootっていうのはCERN(欧州原子核研究機構)で開発されている、高エネルギー物理解析でよく使われるデータ解析用のフレームワークです。
rootをインストールする方法は大きく分けて3つあって
1、ソースコードを持ってきて自分で展開する
2、バイナリ形式のものを持ってくる
3、gitを使う
の3つである。(他にもあるかも)
どの方法がベストなのかはよくわからにが、僕の周りでは「ubuntu16.04をPCに入れてみたけどroot入らないよ〜」という悲鳴がちょくちょく聞こえてくる。いやな予感しかしない。。
今回は1の方法で入れてみる。僕は1の方法でしか入れたことないけど、2の方法が一番楽らしい。バイナリ形式のファイル持ってくるだけだしね。3の方法はrootのバージョンを頻繁に変えたりする人にとっては便利なのかな?
1、ソースコードを持ってきて自分で展開する
なんか過剰書きみたいに書いちゃったけど今回はこの方法しか書かないよ!
まずはcernの公式サイトに行ってソースコードをダウンロードするよ!
https://root.cern.ch/downloading-root
現在(2016年7月)時点で一番最新なのはVersion6のRelease 6.04/18 - 2016-06-22
である。最新のはなんとなく不具合が怖いので、今回はちょっとだけ古いRelease 6.04/16-2016-03-17を選んだ。
すると一番上にsource、ちょっと下にいくとBinaryとgitがある。(gitは画面に写ってないけど)
sourceのroot~~.tar.gzをクリックするとダウンロードできるので適当な場所に保存する。僕は/Downloadsに入れた。
ダウンロードが完了したらいよいよインストールするのだけど、その前にubuntuに足りないパッケージをいろいろと入れる必要がある。
$ sudo apt-get install libx11-dev
$ sudo apt-get install build-essential
$ sudo apt-get install libxpm-dev
$ sudo apt-get install libgl1-mesa-dev
$ sudo apt-get install libxext-dev
$ sudo apt-get install libxft-dev
このへんをターミナルに打ち込んでぱぱーと入れる。これが終わったらrootのインストールに映る。
$ tar zxvf root_v***.source.tar.gz (***の部分はバージョンの名前)
でダウンロードしたファイルを展開。するとrootディレクトリができるはずなので
$ cd root
$ ./configure --prefix=/usr/local/root
とする。今回は/usr/local/root以下にインストールする。うまくいったら
$ make
$ sudo make install
でおわり。makeは20〜30分くらい時間がかかるので気長に待つ。
うまくダウンロードができたら次にpathを通す。今のままだとpathが通ってないので、ターミナルで$rootと打っても起動しないからである。
ホームディレクトリで.bashrcを適当なエディタで開いて
export ROOTSYS=/usr/local/root
export PATH=$PATH:$ROOTSYS/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ROOTSYS/lib/root
の3行を加えて保存。これでpathが通ったはず。ターミナルを開きなおすか
$source .bashrc
をする。ターミナルで
$root
と打ったらrootが起動起動してrootの画面↓が出てきた。わぁい。
ちなみに、毎回この画面が出てくるのはうざいので、
$root -l
とすればこの画面は出てこない。-lのオプションを毎回打つのも面倒なので、.bashrcに
alias root='root -l'
と一行加えれば、次からこのオプションをつけなくてもよくなるね。
あー1回で入ってよかったー。
Ubuntu16.04を入れたときの最初にした設定
おうちのPCにUbuntu16.04を入れたので、最初にした設定等をめも。
16.04は比較的新しく出たばかりなのでいろいろと不安ではある。
1、ディレクトリを英語表記にする
これは16.04に限った話じゃないけど、Ubuntuのディレクトリ名はデフォルトで日本語になっている。これはGUIでポチポチマウスで開いたりする分にはいいのだけれど、ターミナル操作だとすごいめんどくさい。なのでこれらをすべて英語にする。
$ LANG=C xdg-user-dirs-gtk-update
ターミナルでこのコマンドを打てばおk。ダイアログが出てきて"Update Names"を押せば全部英語になる。
これでターミナル移動もらくちん。
2、ストレージの設定
僕の場合はSSDとハードディスクをOS入れる用とファイルとか保存するように分けていて、さらにパーティション区切ってWindowsとデュアルブートするというなかなかカオスなことをやっているので最初にストレージの設定。このページを参考にした。
HDDをフォーマットする - Ubuntu 14.04 LTS編
僕は SSDにOSを入れたのでHDDを適当にパーティション区切ってマウントした。
無論1つのHDDに1つのOSをぶち込んでいるだけの場合こんな難しいことは考えなくても良い。
3、ctrlとcaps lockを入れ替える
なんのために存在しているのかわからない無能キーナンバーワン"caps lock"キー。
こいつがAの隣というわりといいポジションを陣取っているため、こいつを抹殺してCtrlにするのがよし。
ぐぐっていろいろためしてみたのだが、僕の環境ではどれもうまくいかなかった。。
例えば
$setxkbmap -option ctrl:swapcaps
のコマンドとか。一応このコマンドはきいたのだが、今度は日本語の変換ができなくなってしまった。(ちなみにUSキーボード)うーむ。昔のバージョンはGUIから簡単にキー設定いじくれたらしいが、どうも最近のバージョンではめんどくさいことしなきゃいけないらしい。
結局もともとAの左がCtrlになっているハッピーハッキングキーボードを買うことで解決した。(いや、根本的な解決にはまったくなっていないけど)
恐るべし、caps lockの呪い。
4、vimを入れる
僕はvimmerなのでまずvimを入れる。一応Ubuntuにはデフォルトでviが入っているのだけれど、最低限の機能しか使えないらしく、:syntax on とかやっても色が変わらない。これではどうしようもない。
$sudo apt-get install vim
であっさり解決。
5、vimの設定いじくる
次にvimの設定ファイルをいじくる。ホームディレクトリに.vimrcをつくってネットで適当にググった設定をコピペ。例えばこんなん
今回はここから引っ張ってきたてちょびっと改変した。
1 set number "行番号を表示する
2 set title "編集中のファイル名を表示
3 set showmatch "括弧入力時の対応する括弧を表示
4 syntax on "コードの色分け
5 set tabstop=2 "インデントをスペース2つ分に設定
6 set softtabstop=2
7 set shiftwidth=2
8 set smartindent "オートインデント
9
10 "#####検索設定#####
11 set ignorecase "大文字/小文字の区別なく検索する
12 set smartcase "検索文字列に大文字が含まれている場合は区別して検索する
13 set wrapscan "検索時に最後まで行ったら最初に戻る
こんな感じ。特に行番号とsyntaxとオートインデントは必須。リンク元だとtabstop=4になってたけど、個人的にはtabstop=2がおすすめ。だって4だとインデントそろえたときに幅広すぎるんだもん。。
6、ターミナルの文字色設定
5まででとりあえず文字色はつくようになったはず。というわけでvimを立ち上げて色の確認用に適当なコード打ち込んでみる
うーん色が微妙。気持ち悪い色をしている。
ターミナル開いて編集→プロファイルの設定で色をいじくることにする。
カラーパレットの色を適当にいじくる。
うーんちょっとはましになったかな?
なぜかカラーパレットでいじくれる色といじくれない色があって、上のスクショのincludeとintとかの部分の色はなぜかどうやってもいじくれなかった。なぞ。まぁ最初よりはましになったのでよしとしよう。
ほんとは緑をもっと濃くしてincludeをピンクにしたかった。
あ、上のコードreturnうつの忘れてた。まぁ色確認するために打っただけだしいっか。
なんか不完全なとこも多いけどとりあえず6個書きなぐった。他にも追々やっていくとしよう。