子供の落書き帳 Remix

15/4/13:ひと月に一度更新するブログになってしまっている

久々に再開した同級生が医学部1年生になっていた話
2018/05/24(木) 08:22:50

ゴールデンウィークの連休の最終日に用事があり、高校のときの同級生数人と会って話した。その中の一人の話が記憶に残っているのでここに書くことにする。
彼と会うのは高校卒業して以来なので、実に11年ぶりであった。近況を聞くと、なんと今年の4月からある大学の医学部に入ったのだという。我々が高校を卒業したのは2007年の3月のことだ。それから実に11年も後の話である。うちの高校は進学校だけあって、知的能力が高いやつらが揃っている。それゆえ、大学を卒業してから何らかの事情で再入学するという例はちらほら聞くことがあった。しかし、この歳になって大学入学というケースがあるとは意外だった。
彼は人(同級生)よりだいぶ遅く大学を卒業して働き始めた。しかしすぐに、その仕事には向いていないなと思い、仕事をする一方で転向の道を探り始めた。
始めに放送大学でいくつか講義を聞いた。 次に自分の進みたい進路に関係する資格の勉強をして、その資格を取得した。あわせて予備校に通って受験勉強をした。ある大学の医学部を受験、合格して4月から通い始めた……細かいところは間違っているかもしれないが、だいたいこんな感じの話だったと思う。
昼間に働きながら夜に医学部を目指して勉強するというのは、並大抵の苦労ではなかっただろう。短い仮眠を取った後、深夜に起きて受験勉強をすることもあった、と言っていた。

俺が特に驚いた点は2点あると思う。一点目は彼のキャラの変貌ぶりである。高校の時はゲームばかりしていて、お世辞にも勉強熱心な人ではなかった。同級生であれば、誰が頭が良くて、誰がそうではない、というのはなんとなく分かっていたが、成績も決して上の方ではなかったはずだ。大学に進んでからのことは知らないが、卒業にだいぶ時間がかかっていたのだから、あまり勉学に熱心に打ち込んだようにも思えない。彼の心に火がついたきっかけは何であったのか、それは聞くことができなかったが、昔からは想像もつかない変身ぶりに驚嘆した。

驚いた点の2点目は彼のキャリアチェンジがだいぶ急激であった点である。彼はもともと文系だったのだ。
文系の知識しかない状態から、医学部を目指して勉強して、必要な理科系の知識を一通り習得する……どれほど大変なことだろうか。(ちょっと医学部受験に必要な教科が分からないので、どの教科がどの程度必要なのか具体的なことは言えないが)
俺や同級生はもうすぐ30になろうという歳なので、職務の方向性が少なからず限定されているものと思っていた。ところがどっこい、俺の想定を覆すような大ジャンプを成し遂げてしまう人もいるのである。
まあ、なんと言うか、俺がやろうとしているのは同じエンジニアの中での転向なのだから彼に比べればずっと楽なことだろう。彼がそんな大幅なジャンプができたんなら、俺だってやってやれないことはないだろう、という気持ちなのであります。

「周りの18歳や19歳の同級生に比べるとずいぶん年が離れているので、講義のディスカッションの時間には、さん付け敬語で呼ばれちゃってさぁ」と彼は笑っていたが、大変ながらも充実していて楽しそうであった。
大学に入ってからの6年間で辛いこともあるだろうけれど、血の滲むような努力をしてきつい受験勉強を乗り越えて入学したことを思えば、きっとやっていけるんじゃないかな……彼と別れたあと、そんなことを考えた。
  1. 2018/05/24(木) 08:22:50|
  2. 雑記
  3. | トラックバック:0
  4. | コメント:0

テストに便利! 実例で理解する、関数の引数の中でクラスの初期化をする方法
2018/05/02(水) 13:02:36

C++である機能を作って、それを試験したいとしよう。「入力と期待される結果」を与えて、期待通りに動いているかを確かめればよい。その確認をするために試験用の関数を作る。
具体的な例を挙げよう。「リーダブルコード」の一つの章では、適切なテストコードを書くことについて述べている。その中でこんな例が登場する。

最近のC++では、以下のように配列リテラルをそのまま引数として渡せるようになっている。

CheckScoreBeforeAfter({-5, 1, 4, -99998.7, 3}, {4, 3, 1})

(リーダブルコード p.183)



この部分の手前で書いてある内容だが、試験対象のコードは
「スコアを降順にソートして、マイナスのスコアを削除する」という処理をしている。
CheckScoreBeforeAfter関数を使えば、{-5, 1, 4, -99998.7, 3}を入れたら{4, 3, 1}が出力されることが確認できる、というわけだ。

関数の引数(実引数)の中に、試験したい内容を書いてしまえば、わざわざ一度変数を定義する必要もなくなる。
しかし、この波括弧の中で何が起きているのか、いまいちよく分からない。そこで色々と調べてみた。
クラスの初期化の例に限って説明する。(上のvectorの例までたどり着かなかった……)
また、以下の初期化は関数の引数に限らず、色々なところで使えるが、今回は関数引数に限る。
包括的な例は以下が詳しい。
統一初期化・リスト初期化の見本帳 - イグトランスの頭の中

確認した動作環境


Visual C++ 2017 Windows 64bit版

統一初期化 (uniform initialization)



まず、uniform initializationについて見てみる。日本語では「統一初期化」「一様初期化」などと呼ばれている。

一様初期化 - cpprefjp C++日本語リファレンス
から引用すると、『一様初期化は、コンストラクタの呼び出しを、リスト初期化と合わせて波カッコ { }で記述する構文である。』
この波括弧がやっていることはコンストラクタの呼び出しなのだ。

コンストラクタがない場合……何か変だ!?



まずはコンストラクタを全く書かずに実行してみよう。


class MyClassA {
public:
int x;
int y;
};

void func(MyClassA a) {
cout <<"x="<< a.x << ", y=" << a.y << endl;
}

int main()
{
func({}); // (1)
func({1}); // (2)
func({2,3});// (3)
return 0;
}

出力:
x=0, y=0
x=1, y=0
x=2, y=3



あ、あれ!? 何で??
俺の予想は「MyClassAが持っているコンストラクタは、引数のないデフォルトコンストラクタだけである。したがって、引数がint 1個の(2)、および引数がint 2個の(3)は対応するコンストラクタが無いため、コンパイルエラーになる」だったのだが……

{ }で要素を順番に記述するこの形式はC言語の構造体に似ている。
……と思って色々調べたら、おそらく上の例はアグリゲート(集成体)の初期化に該当するようだ。

アグリゲート(集成体)とは


C++11: Syntax and FeatureAggregates 集成体 - C++と色々の解説によれば、
アグリゲートとは、全ての配列と、特定の条件を満たしたクラスの総称である。クラスの条件は以下の通り。
- ユーザーが定義したコンストラクタが無い
- 全てのメンバがpublicである
- 基底クラスが無い
- 仮想関数を持たない

……なるほど、確かに上のクラスは条件を全て満たしているので、これはアグリゲートである。
アグリゲートは乱暴に言えば、「クラス特有の難しい機能を使ってないし、C言語の構造体と同等に扱っていいやろ」という感じだろうか。

アグリゲート(集成体)の初期化



アグリゲートだと何が違うのか。
それはC言語の構造体と同様に、{ }の中に要素を順番に書いて初期化することができる。(これを初期化子リスト (initializer lists)という。初期化子リスト - cpprefjp C++日本語リファレンス)
上の例1では関数の引数の中に{ }を書き、その中に要素をを書いているので、アグリゲートに対する初期化が実行される。
つまり例1は、「統一初期化子によるコンストラクタの呼び出し」ではなく、「初期化子リストによるアグリゲートの初期化」なのだ。……なんて複雑なんだろう……!!

ユーザーが定義したコンストラクタを持たず、アグリゲート(集成体)でないクラスの初期化


確認のため、アグリゲートでないクラスを同様に初期化してみよう。 privateメンバ変数を追加してみる。


class MyClassA {
public:
int x;
int y;
private:
int z;
};

void func(MyClassA a) {
cout <<"x="<< a.x << ", y=" << a.y << endl;
}

int main()
{
func({});
func({1}); //エラー!
func({2,3}); //エラー!
return 0;
}

ビルド結果:
error C2664: 'void func(MyClassA)': 引数 1 を 'initializer list' から 'MyClassA' へ変換できません。
note: コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。
error C2664: 'void func(MyClassA)': 引数 1 を 'initializer list' から 'MyClassA' へ変換できません。
note: コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。


よし、今回は予想通り。
このクラスはprivateメンバ変数を含むので、アグリゲートではない。アグリゲートではないので、初期化子リストは使えない。したがって、初期化子として指定できるのはデフォルトコンストラクタだけであり、空の波括弧以外は型が合わないのでエラーとなる。


コンストラクタを持つクラスの初期化


ここからが「統一初期化 (uniform initialization)によるクラス初期化」となる。C++11からの機能である。


class MyClassA {
public:
int x;
int y;

MyClassA(int x0) { x = x0; }
};

void func(MyClassA a) {
cout <<"x="<< a.x << ", y=" << a.y << endl;
}

int main()
{
func({}); //エラー!
func({1});
func({2,3}); //エラー!
return 0;
}

ビルド結果:
error C2664: 'void func(MyClassA)': 引数 1 を 'initializer list' から 'MyClassA' へ変換できません。
note: コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。
error C2664: 'void func(MyClassA)': 引数 1 を 'initializer list' から 'MyClassA' へ変換できません。
note: コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。


引数1個のコンストラクタだけが定義されているので、波括弧の中の変数が1個ならOK、それ以外はエラーになる。


class MyClassA {
public:
int x;
int y;

MyClassA(int x0 = -100, int y0 = -200) { x = x0; y = y0; }
};

void func(MyClassA a) {
cout <<"x="<< a.x << ", y=" << a.y << endl;
}

int main()
{
func({});
func({1});
func({2,3});
return 0;
}


もちろん、コンストラクタにデフォルト引数を指定するのと組み合わせることも可能だ。(コンストラクタのデフォルト引数は、C++の最初からある機能だ。)

おまけ:
どの部分がC++11 の機能なのかイマイチ分からないので、C++03としてコンパイルしようかと思った。しかし以下のサイトを見る限り、コンパイルオプションを変更してC++03としてコンパイルする、ということはできない。(旧バージョンのVSをインストールするという方法はある)
c++11 - Change (use older) c++ version in Visual Studio - Stack Overflow
c++ - disable c++11 features in vs2013 - Stack Overflow
ええー。GCCならオプションに「-std=c++03」と書けば一発なのに。

それでは。
  1. 2018/05/02(水) 13:02:36|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

「aspiring + 職業、地位」 で「~志望者、なりたい人」の意味
2018/03/17(土) 11:37:31

タイトルのままですが。
aspiringという単語がある。aspire「熱望する、切望する」から派生した形容詞だ。

手元の電子辞書で引くと、
リーダーズ英和辞典→「向上心に燃えている、抱負(野心)のある;上昇する、高くそびえる」
ジーニアス英和大辞典→「野心に燃える、意欲的な」
と書いてある。

俺もそう覚えていたので、下記の記事のタイトルも「熱意のあるデータサイエンティストへのアドバイス」と解釈していた。
Advice to aspiring data scientists: start a blog – Variance Explained
しかし読み進めると「あれ、これは今データサイエンティストじゃないけど、そうなりたい人に向けたアドバイスじゃないか……??」と思えてきた。脚注にはこう書いてあるし。

It’s also a great idea to blog if you’re currently a data scientist! But the reasons are a bit different, and I won’t be exploring them in this post.
(拙訳:既に現在データサイエンティストだったとしてもブログを書くというのは素晴らしいアイデアだ! だけどその理由は少し異なるので、この記事では理由について言及しない。)



俺の知識と合わないので、英辞郎で調べてみたら、説明が完璧だった。
aspiringの意味・用例|英辞郎 on the WEB:アルク
1: ~になろうとする、~志願の
2: 熱烈な、意欲的な
aspiring actress 「女優志望[志願]」
aspiring prime minister 「首相志願者」などの例もある。

aspiring writerは「文学志望者」と「向上心に燃える作家」の両方の訳があり、作家なのか微妙な線だ。
「aspiring + 職業、地位」は「(職業)志望者」の場合が多く、その場合はその職に就いていない。しかし、単に「向上心のある(職業)」という可能性もある。文脈から判断するしか無さそうだ。


最後に、英英辞典Oxford Advanced Learner's Dictionaryの説明を貼っておく。
aspiring adjective | Oxford Advanced Learner's Dictionary at OxfordLearnersDictionaries.com
wanting to start the career or activity that is mentioned

それでは。
  1. 2018/03/17(土) 11:37:31|
  2. 未分類
  3. | トラックバック:0
  4. | コメント:0

社外勉強会が社内Slackで共有される組織とされない組織、どっちが良いか?
2018/03/11(日) 16:21:12

デブサミをネタに既に2つも記事を書いといて(下記)、まだデブサミのことを引っ張るのかと言われそうだが
ブログのネタも他に見つからないので書いておく。
Developers Summit 2018 感想。ここでしか聞けない講演がたくさんあった
デブサミ2018 自然言語処理・機械学習を活用したファクトチェック業務の支援

ある聴衆の行動は、俺にとっては意外だった


無くて七癖ということわざがあるが、俺にはあまり行儀の良くない癖が1つある。色々なところで、人のパソコンがちょいと見えてしまう場合、つい覗いて見てしまう、という癖である。
デブサミのあるセッションで、混み合った部屋に入り、自分の座席を確保したところで一息ついていると、前の席のMacの画面が視界に入った。見るともなしに見たら、Slackの画面だった。
「××のセッションに来ました! 講演のメモを書いていこうと思います!」――だいたい、こういうような文章を打ち込んでいたと思う。

社外勉強会の席でSlackを開いている取る人は、その後も色々な社外勉強会で何度か目にした。
もし自分だけのために勉強会の記録を取るのならば、Slackはふつう使わない。ローカルのメモ帳かEvernoteだろう。……とすると、そのSlackは個人用ではなく、会社のSlackというのが最も有力だ。
自分はどうかと考えてみると、Slackで投稿するなんて全く考えもしなかった。

社内に流さない理由:「立場の問題」と「ツールの問題」


理由は簡単なことで、うちの会社にSlack(に相当するもの)が入っていないからである。
(一応、社内のSNSというのはあるにはあるが、見ている人はごく少数である。それに、Slackのような「気軽に投稿する、起きていることをリアルタイムで投稿する」という使われ方ではない。)
俺はデブサミのときはTwitterでツイートし、感想を個人のブログでまとめて書いた。なぜかといえば、会社の立場で行ったわけではなく、個人的な興味と関心で有給休暇を取って行ってきたからである。他のイベントのときも「Twitter」「ブログ」「Evernote」の3択である。
「会社の人間という立場か、個人的な関心と意志という立場か」という、立場の問題というのは一つの理由である。
しかし一方で、「ツールの問題」という理由もあった。「社内に情報を共有する手段」としてのツールがないから、そもそも伝えようとも全く思わなかった。

社外勉強会の技術情報を社内に伝播できるツールがある会社とない会社の違い



Slackばかりを見かけたからSlackと書いてきたが、ツールは別に何でも良い。社内Qiita:Teamでも社内esaでも構わないと思う。
一般化すれば「社内全体で情報共有するツール」があるかどうかの問題である。
(チャットツールとナレッジベースは本当ならば役割が違うものであるが、特に区別せず書いている)

(A) 社内に情報を共有する場がある→共有する→世の中の技術や知識が社内に普及する
(B) 社内に情報を共有する場がない→共有しない→世の中の技術や知識が社内に広まっていかない

こう考えると、社内でのコミュニケーションツールは、知識や技術を得るという効果を増幅してくれることが分かる。
おまけに、ポジティブなフィードバックという利点もある。後で「あの勉強会のメモ、ありがとう、良かったよ」なんて言われることもあるだろう。そう言われたらもっと書きたくなるものだ。そうして技術の情報共有はますます加速していくのだろう。社内の人々が何をやっているか分からない、風通しの悪い企業は、やがて置き去りにされ、引き離されていくのだろう。

そういう、社内で情報を流すツールがあるところが良いか、無いところが良いか、どっちだろう? 言うまでもなく、俺は前者です。



(余談:実のところ、「文化・カルチャーの問題」という要素もある。Slackがあっても、誰も情報共有しようと思わなければ、投稿はなく情報は伝わっていかない。文化の問題は、実は最も重大な要素だろうと思うが、しかし今回は触れないでおく。)
  1. 2018/03/11(日) 16:21:12|
  2. 未分類
  3. | トラックバック:0
  4. | コメント:0

性格16分類のISTP型は長期目標を立てて計画を守るのが苦手らしいぞ
2018/03/05(月) 00:07:12

「あなたの天職がわかる16の性格」という本がある。
人を16タイプの性格に分けて、そのタイプ別に長所・短所・成功のポイントなどを記した本である。


16性格分類とMBTI


16性格分類は、MBTI(Myers-Briggs Type Indicator)を基盤にしている、と書かれている。(p.22)
MBTIそのものというと問題があるからだと思われる。
(本物のMBTIは診断の内容がきちんと定められているため、それ以外はMBTIと呼称できないはず。
参考:MBTIもどきを受検された方々へ MBTI協会より)
今回は厳密さはあまり考えないことにして、16タイプの性格分類を考えてみよう。

16タイプの性格のうち、俺は何型なのか?


この本の中には診断用のチェックリストがある。自分で当てはまるものにチェックを入れていくとどのタイプか分かるようになっている。チェックしてみるとISTP(内向、五感、思考、柔軟)となった。
ただSかNか、すなわち「五感型」か「直感型」かは、考え直してみると微妙なところだと思う。ISTPをメインに見つつ、直感型のINTPもついでに見てみよう。

エンジニアは適職らしい。ひと安心



この本の中には、16タイプ別に「向いている具体的な職業」が書いてある。
さて俺はどうだろうか。「あなたがITエンジニア(プログラマ)を選んだのは大間違いです、至急考え直しましょう」とか書いてあったら困ってしまう。しかし幸いにも適職リストの中にはエンジニアがしっかり登場する。(以下、具体的な職業は適宜中略している)

【ISTP】
●テクノロジー
たとえば……エンジニア、電子工学専門家、情報サービス開発者、ソフトウェア開発者、システムアドミニストレータ、コンピュータプログラマ、情報処理専門家

【INTP】
●コンピュータ/テクノロジー
たとえば……ソフトウェアデザイナー、コンピュータプログラマ、情報サービス(新規ビジネス開発)、システムアドミニストレータ、Webマスター、インターネットアーキテクト、ソフトウェアエンジニア、Javaプログラマ/アナリスト、ソフトウェア開発者、情報セキュリティアドミニストレータ。

これを読んで「特定のプログラミング言語がJavaだけ登場するのは何なんだ……そしてソフトウェアエンジニアとソフトウェア開発者はどう違うんだけど……」と脳内でツッコミを入れずにはいられない。思考型(あらさがしをして批判的になりがち)の性である。

内向型(I)思考型(T)を持っているとソフトウェア開発向きという診断になるらしい。
(IとTの2つの型を持つ4つのタイプでは、エンジニア系を適職として挙げているため。IとT……まさにIT系……!!)

ISTP型は目標設定が苦手。


ISTPのところを読むと、「お前、長期的な目標とか計画とか立てるの苦手だし、立てても守るの難しいだろ」というようなことが書いてあり、「ひえ~……その通りです~」とうめいている。
飽きやすい。むこうみずなことをしがち。(119p)
長期的な目標を立てたくない。締め切りを守るのが苦手。(120p)
自分と仕事に関する長期的な目標を立てよう。そして5年後、10年後になにをなしとげたいのか考えよう。(124p)

P(柔軟型)は、決断をなるべく後に伸ばして、他の可能性を残しておくと気分がいい人である。時間はいざとなれば延長すればいいという人である。目標とスケジュールをキッカリ定めて、それをスケジュール通りにこなしていく、というJ型とは正反対である。

S(五感型)は、自分の五感を通じて入ってくるものを重要視する/全体よりも細部の具体的な事実を重視する/現在の目の前の状態に注意を払う……という特徴があるらしい。……将来を予想して動く、長期的な目標に注意を向けるのが苦手だということになる。

俺の場合、未来予測の本とかが大好きな面もあるのでS一辺倒というわけではないけど。PとSを両方持ってる人だと、目標設定してそれを達成していくのはキツそう。
  1. 2018/03/05(月) 00:07:12|
  2. 未分類
  3. | トラックバック:0
  4. | コメント:0
次のページ

FC2Ad