2019年8月13日火曜日

エモい季節3選

約30年ほど生きてきて、毎年毎年四季を経験しているはずなのに、今更ながら「この季節好きかも」っていうのを発見したので、語ってみる。

一般的な四季の分類より細かく区切ってます。

残暑

まずは、今日のことから。

夏真っ盛りもいいけれど、暑さが峠を超えて少し涼しくなったぐらいの時期が好きかもしれないと思った。

単純に暑くないからっていうのもあるけれど、夏が終焉に向かっている感じがして、蝉とかの鳴き声が、夏を名残惜しんでいるように聞こえる。

なにか儚さを感じる。

暑すぎないから、暑さに耐えることばかりに神経を使わず、一歩引いて「夏」という季節に向き合える気がした。


秋から冬に向かう季節

続いてこれからくる季節。

決して寒い季節の方が好き、というわけではない。

この季節、お祭りなんかが催されることも多い。

さらに、気温が下がってくるので、心なしか人肌恋しくなる。

そんな二つの状況が噛み合って、いろいろドラマが生まれたり、普段は心の奥にしまわれていることが、表に出てきて素直になれたりする気がする。

素直になりたいけど、なれない、みたいなもどかしい感じだとしても、それもまたいとおかしという感じか。

でも、寒いのはいや。

冬至から初夏

寒いのは嫌いとか言っているわりには寒い季節の割合が多い気がする。

天文学上は、冬至が一番日が短い。

一番短いということはあとは、「長くなっていくだけ」。

日照時間が単調増加に転じます。

「日のあたる時間が長くなる」っていう表現だけで、随分前向きな感じがしてくるし、実際、日に日に日照時間が長くなっていくのがわかるから、冬が明けていく感じを肌で感じることができる。



それと個人的には、音楽を重ね合わせてしまう。

それも2曲あって、一つは『チャイコフスキー交響曲第一番(冬の日の幻想)』。

「冬の日の幻想」というように、冬の曲。

ただし、舞台はロシアの極地みたいな場所のイメージなので、日本の冬とは比べものにはならないのだけど、全体的なしつこさが「冬ってこういうもんだよな」と、自分自身で納得させてくれる。

近年は東京とかでは氷点下になることはあまりないけど、毎日気温が低くても、毎日吹雪いていても、「冬ってこういうもんだよな」と納得することで、寒いのが嫌いだけど耐えられる。

あのしつこさは、一度北海道とかで生活してみれば、体感として理解できる。

機会がある人は体で理解しておくべき曲。



もう一曲は『シューマン交響曲第一番「春」』。

先ほどのチャイコフスキーもそうだけど、どうやら巡り合わせがいいようで、この2曲については人生に2回演奏したことがある。

しかもわりと節目のタイミングで。

こちらの曲は序奏部から主題に入るまでが非常に情景的な曲。

厳しい冬を超えて、少し寒さが穏やかになって、そして雪が溶けて、春に向けて動植物が活動し始めて、そして春満開(提示部)に突入。

4楽章も同じく情景的な感じ。

途中までは、春の到来をみんながよろこんで唄っているような感じで可愛らしい感じ。

それで最後は、夏へ向けての期待感を解放して終結するといった感じだろうか。




ちなみに、シューマンの「春」については以前も書いたことがあるような気がするなぁと思って過去の記事を見返していたら、他にこんなことを書いていた。






全体的に、「もののあわれ」を感じられるような瞬間が好きなのかもしれない。

2019年8月12日月曜日

C++のコンパイルいろいろ(基礎から応用まで) --- その1

最近、他の言語のことや、コンパイラ周りのことを勉強して、今更ながら分割コンパイルのことを理解してきたので、全く知識ゼロ向けの人に向けて、導入編を書いてみたいと思います。

自分が当時わからなかったこととか、あるいはこんな記事があればいいのにな、ということを想定して書いていますが、わかりにくかったり、間違ったことを書いていれば教えて頂けるとありがたいです。

前提

前提としてclang++が入っていることを想定しています。

ざっくり言えば、よくサンプルコードとして紹介されるHello worldが動く状態です。

ちなみに、以前紹介したwhichコマンドを使って調べると、自分のパソコンにはclang++が入っていました。
$ which -a clang++
#二つありますよ、という意味で2行出てくる。
/Users/hiroshi/.pyenv/shims/clang++       #単にclang++ で実行するとこちらのコンパイラが動く。
/usr/bin/clang++    #これがXcode付属のコンパイラ
バージョンを確認すると、
/usr/bin/clang++
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
となっているが、ここはよくわからないので、そんなもんかということで先へ進むことにする。最新バージョンはclang10のようだけど。。。?

参考 : Clang 10 documentation


基本

まずは、なんのひねりもない、一番基本から。

Hello worldを表示するプログラムをコンパイルします。

コンパイルするコードは以下のコード。
// ファイル名はhello.cppとする。
#include<iostream>

using namespace std;

int main(){

  cout << "Hello world \n" ;

  return 0;
}

hello.cppがあるフォルダと同じフォルダに移動し、以下のコマンドでコンパイルする。
$  /usr/bin/clang++ -std=c++17  hello.cpp
-std=c++17 の部分はコマンドのオプションです。

「-std=なになに」でc++のどのバージョンとしてコンパイルできるかを指定できます。

このあたりの話は今回は省略します。また機会があれば詳しく書くかもしれません。

同じフォルダにa.outという実行ファイルができているので、それを実行します。
$  ./a.out      # くどい説明かもしれないけど、「./」で「現在のディレクトリの中の」の意味。現在いるディレクトリの中のa.outというファイルを実行している。
Hello world


分割コンパイル(ダメな例)

複数のソースコードをまとめてコンパイルすることもできます。

で、成功するやりかたの前に、誰しも一度はやってしまうであろう(そんなことない?)ダメなパターンを紹介します。

まず、以下のような2つのソースコードを作ります。
// 先ほどのhello.cpp
#include<iostream>

using namespace std;

int main(){

  cout << "Hello world \n" ;

  return 0;
}
// 2つめのファイルはmorning.cppとしておく。
#include<iostream>

using namespace std;

int main(){

  cout << "Good morning! \n" ;

  return 0;
}
これを、
$/usr/bin/clang++ -std=c++17  hello.cpp morning.cpp
と実行すると、
duplicate symbol _main in:
    /var/folders/3j/6lblgwg16hsf8kqx9wl_5r440000gn/T/hello-eafe6a.o
    /var/folders/3j/6lblgwg16hsf8kqx9wl_5r440000gn/T/morning-cca263.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
というエラーが掃き出される。

いくつかのファイルをまとめてコンパイルする場合、その中にmain関数は一個にしなければならないが、hello.cppのほうも、morning.cppのほうもmain関数になってしまっているのでエラーになっている。


分割コンパイル(うごく方法)


  その1

ヘッダファイルを介してインクルードする。

同じディレクトリの中に、以下の3つのソースコードを用意する。

ディレクトリ構造も、書くまでもないが一応書いておく。
  • greeting.cpp
  • morning.cpp
  • morning.hpp
// 今度はgreeting.cppという名前にする。
#include<iostream>
#include "morning.hpp"
using namespace std;

int main(){

  Morning();

  return 0;
}

//これはmorning.cppという名前にする。
#include<iostream>

using namespace std;

void Morning(){

  cout << "Good morning! \n" ;

}
// これはmorning.hppとする。
void Morning();
これで、
$ /usr/bin/clang++ -std=c++17  greeting.cpp morning.cpp
と実行する。そして、./a.outを実行すると、Good morning! と表示される。

  その2

直接.cppのファイルをインクルードすることもできる。

今度は、以下2つのファイルを用意する。
  • greeting.cpp
  • morning.cpp
// このファイルはgreeting.cppとする。
#include<iostream>
#include "morning.cpp"
using namespace std;

int main(){

  Morning();

  return 0;
}
 //これはmorning.cppとする
#include<iostream>

using namespace std;

void Morning(){

  cout << "Good morning! \n" ;

}
そして、コンパイルする際には、以下のようにgreeting.cppだけをコンパイルする。
 $/usr/bin/clang++ -std=c++17  greeting.cpp
これでも、またa.outを実行すれば、Good morning! と表示されるはず。

  その3

2つ以上のファイルを一度にコンパイルもできる。

再びヘッダファイルからインクルードする。

今度は以下のようなファイルを用意し同じディレクトリに置く。

ディレクトリ構造を書けば、
  • greeting.cpp
  • morning.cpp
  • afternoon.cpp
  • evening.cpp
  • morning.hpp
  • afternoon.hpp
  • evening.hpp
 // これはgreeting.cppという名前にしておく。
#include<iostream>

#include "morning.hpp"
#include "afternoon.hpp"
#include "evening.hpp"
using namespace std;

int main(){

  Morning();
  Afternoon();
  Evening();

  return 0;
}
 // これはmorning.cppという名前にしておく。
#include<iostream>

using namespace std;

void Morning(){

  cout << "Good morning! \n" ;

}
 //これはafternoon.cppという名前にしておく。
#include<iostream>

using namespace std;

void Afternoon(){

  cout << "Good afternoon! \n" ;

}
 //これはevening.cppという名前にしておく。
#include<iostream>

using namespace std;

void Evening(){

  cout << "Good evening! \n" ;

}

 //これはmorning.hppという名前にしておく。
void Morning();
 //これはafternoon.hppという名前にしておく。
void Afternoon();
 //これはevening.hppという名前にしておく。
void Evening();
それで、以下のようにコマンドを実行する。
$  /usr/bin/clang++ -std=c++17 greeting.cpp morning.cpp afternoon.cpp evening.cpp
$ ./a.out
そうすると以下のようになるはずです。
Good morning! 
Good afternoon! 
Good evening! 

  その4

ヘッダファイルだけを一つのディレクトリにまとめてしまうこともできる。

先ほどの、greeting.cpp〜evening.hppをまた使うことにする。

ソースコードはさすがにくどいので省略。

ディレクトリ構造は以下のようになっているとする。
  • greeting.cpp
  • morning.cpp
  • afternoon.cpp
  • evening.cpp
  • my_include    →このディレクトリは新しくつくる。その中に以下の3つを入れる。
    • morning.hpp
    • afternoon.hpp
    • evening.hpp
$  /usr/bin/clang++ -std=c++17 greeting.cpp morning.cpp afternoon.cpp evening.cpp  -I ./my_include
$ ./a.out
そうすると、また同様に以下のように表示されるはずです。
Good morning! 
Good afternoon! 
Good evening!


長くなってきたので、今回はここまでにしておきます。

まだまだいろいろあるので、また次回以降にしようと思います。

2019年8月11日日曜日

未経験からエンジニアに転職するまで

さて、先日、転職をしたことを書いたが、やっと8月から現場が決まったので、巷で流行りの転職体験談を書いてみようと思う。

あらかじめ断っておくが、かなり長いと思う。


ことのはじまり

数学で大学院へ進学したはいいものの、数学で生きていくには厳しいと悟り、就職をしようとしていた。

しかし、就職活動がうまくいかないまま、大学院を修了した。

その後、紆余曲折を経て、某大手企業で契約社員としてテクニカルサポートで約4年働いていた。

いわゆるコールセンター。一般ユーザーからの問い合わせに対応していた。

数学ではないにしても、他の分野でアカデミックな道を目指したいと思っていたが、当時はお金もなく(むしろ奨学金などでマイナス)、実力もなかったので、とりあえずはエンジニアなどで正社員を目指していた。

良くも悪くも、当時いた職場が居心地がよく、気づいたら4年近く経っていた。

このままではまずい、と危機感を覚えはじめ、転職活動を始めた。

転職活動開始

2016年下旬に一度目、2018年初旬に二度目の転職活動をしていた。

2016年の転職活動のときは、転職エージェントをつかっておこなっていた。

このとき、転職活動を一旦止めてしまった理由は二つある。

一つは、何社ほど面接へいったのか覚えていないが、当時選考を進めていた企業が全滅してしまったからだ。

もう一つは、転職エージェントの担当者が提案してくるペースが速く、それについていけず疲れてしまったのだ。

そして、しばらく休んだのち、2018年初旬に再度転職する活動をしなければいけない危機感に苛まれ、活動を始めることにした。

このときは、学習し履歴書や職務経歴書も以前よりはうまく書けるようになっていた。(といっても今現在から比べればまだまだだったと思う。)

しかし、また全滅。

方針転換

当時、独学でも勉強していたが、いま一つアピールとしては弱かったような気がする。

本気度も伝わっていなかった気がする。

どうすれば、より本気度がアピールできるか考えた結果、プログラミングスクールに通うことを思いついた。

SNSなどでも広告をたまに見かけたりして存在は知っていたが、いざ本格的に調べてみると思ったよりもいろんなスクールがあることがわかった。

このときの資金状況としては、やはりあまり芳しくはなかったが、このままなにもアクションを起こさない状態では、悪い状況は変わらないし、アクションを起こして仮に失敗したとしても、「行動を起こした」という事実自体が、一つのアピールにしたいと考えたからだ。

ここでも、一旦転職活動そのものは休止し、まずはプログラミングスクールへ通うことに目標をシフトした。

説明会や事前選考などを受け、最終的に4つのスクールから入学許可を出た。そのうちのひとつに入学することになる。

スクールのカリキュラムの関係で、当時の職場で働き続けるのは困難だったため、契約更新を打診されるときに、更新しない旨(=退職すること)を伝えた。

有給がかなり残っていたので、2018年7月の1ヶ月は丸々有給をつかい、同時に7月からプログラミングスクールに通うことにした。

最近多い、転職サポート付きのスクールで、AI系のエンジニアを目指すコースへ通うことになった。

これが、2018年7月のことである。

プログラミングスクールへ通う

そのプログラミングスクールでは、同期が何人かいて、一部チーム開発的なこともやった。

メンターや同期と関わるなかで、そもそもの本題の内容はもちろんのこと、エンジニアとして常識的な考え方やスキル、あるいは(同期もエンジニア未経験ではあるけれど)同期の秀でたところや、逆に自分の秀でたところも発見できとても刺激的だった。

特に、今までコールセンターでしか働いてないので、大した実績もなく、転職活動の選考でも落ち続けている自分は、なにも優れたところがないと悲観的になっていたが、他の人が苦労していることが自分には自然にできていることなどがあって、自分にも秀でたところがあるんだと、自信が湧いてきた。

しかし、環境そのものはよかったが、資金面でやや見切り発車してしまったため、資金が尽き、泣く泣くプログラミングスクールを中途解約することになる。

ふりだしに戻る

転職活動云々の前に、目先の生活のためのお金がないので、まずはなんでもいいので働くことにした。

テクニカルサポートの経験が長く、ある程度勝手がわかることもあり、以前とは違う職場ではあるが、またテクニカルサポートで働くことになってしまう。

これがだいたい2018年の11月〜12月頃のことだ。

転機その1

ドタバタしすぎていて、転職活動そのものは休止にせざる得なかったが、このときは「タイミングをみてすぐにでも活動開始してやる」と気持ちを切らすことはなかった。

一方で、(ここでは書かないが)他にもいろいろなことが起こりすぎて、少し憔悴していた。




さて、再度働き始めたコールセンターでも、研修などが終わり軌道に乗り始めた頃。

転職サイトでつながりをもっていた、先ほど述べたプログラミングスクールの同期(正確には同期ではなくて一期入学が前の人だが交流があった)から、連絡があった。
(当時の記事 : 喫茶店ピース / 新宿西口)

その人は無事転職を成功させたようで、またその会社がデータサイエンティストを募集しているので、応募してみないかと言われた。
(当時の記事 : 「とりあえず動いてみる」の大切さ)

プログラミングスクールに通うことを決意したときもそうだが、このときはいいタイミングがきたら、あまり後先考えずとりあえずアクションを起こしてみる思考になっていたような気がする。

その知人からの紹介により、応募。

面接までいくが残念ながら不採用となってしまう。
(当時の記事 : 久しぶりに怒涛の一日)

しかしそのときは、一般応募ではなく、社員からの紹介ということだったので、面接を担当してくれた方も、率直な意見やアドバイスをくれた。

結果としては不採用ではあったが、そのときの自分の立ち位置やレベルが理解できたので、これはこれで前進したとは思った。

転機その2

再度働き始めたコールセンターでは、「どうせそんなに長くいるつもりはないから、人間関係もそんなに深く関わらないでいいや」という心持ちであまり周囲と関わらなかった。

もともとそんなに深く関わるのは得意ではないのだけれど、今まで以上に距離をおいている感じだったと思う。

とはいっても、同期入社が全体的に中がよく、向こうから絡んでくれたので仲良くなった。

ある日、同期メンバーでもんじゃを食べに行くことになった。

正直、ああいう自分で調理するようなやつはあまり得意ではなくて、参加するか迷ったけど、参加してみることにした。

お好み焼きを作るのも苦手なこともさることながら、もんじゃにいたってはそもそもどういう風につくるのかいまいち理解していなかった。

もんじゃの調理を任されたとき、引き受けるかどうか迷ったが、引き受けた。

そもそも作り方がよくわからないけど、失敗したところで命を取られるわけじゃないし、突撃してみようと思った。

そして、よくわからない自分は、お好み焼きよろしく、もんじゃの具を一気に鉄板の上に流し込んでしまった。

そうしたら、参加していた自分よりも一回りも若い子に笑われた。

でも、不思議と恥ずかしいとは思わなかった。

自分は結構常識的なことを知らないけど、今更それを悔いてもしょうがない。

いまこのことによって、今まで知らなかったことを一つ知れてよかったじゃないか、と思えるようになった。

「若い子に笑われた」と書いたが、その子が可愛かったので、「笑ってくれた」ではなく「笑われた」のだとは思うがそれでも、なにか反応してくれたのが嬉しかったのもある。

そして、それがきっかけで、「笑われる」=「自分は世間の常識ではないことをしている」=「単に物を知らない or オリジナルなことしている」という構図が頭の中に成立し、「笑われる」ことがある種快感になっていった。

それが、「笑ってくれている」のではなく、「笑われている」のだとしても。

そして、「失敗を楽しめ!」というモットーが自分の中に誕生した。

転職活動再開

先ほどのプログラミングスクールでの知人とまた食事をし、先日の結果などについてお伝えした。

またその話の流れで、キャリアプランの話とか、アルバイトであれば未経験でもエンジニアを募集しているところが意外にあるといった話にもなった。

それをきっかけに、先ほどの「失敗を楽しめ!」の精神で、転職サイトに登録しまくり、応募もしまくった。

転職サイトについては、たくさんあるので、一度に全てのプロフィールを完成させることはできないので、「毎日」少しずつプロフィールを埋めて、かつ改善させていった。

また応募に関しても、気になった企業には、「半ば機械的に」、「毎日数社ノルマを決めて」応募をしていった。

最終的に内定がでるまでには40〜50社応募はしていたと思う。

期待をくじかれる

その中で、最終面接一歩手前まで進んだ企業がある。

書類選考の段階で、比較的いい印象をもってもらえたようで、一次面接にいったその日に二次面接まで行ってもらえた。

しかし、残すは最終面接のみとなったとき、選考フローには書かれていなかった、コーディング課題が出されてしまった。

特に期限は指定されなかったが、一週間弱をめどに取り組むも終わらず、さらに一週間延長。結局完全な完成までは至らなかったが、これ以上延長するのもあれだったので、それで提出した。

しかし、そこで不採用になってしまう。

一次、二次をサクサク進み、残すは最終面接のみだったので期待したが、それも砕かれた。

しかし、著作権はこちらもちで構わない、もし必要であれば他社へ応募する際にポートフォリオとして使って構わないと言われたので、遠慮なく使わせてもらうことにした。

内定

引き続き、「毎日数社」とノルマを決めて応募をしていた。

書類で落ちることもあったが、面接までいける会社も結構あった。

そうすると、コールセンターで週5で働きながら、休みの日(平日)に面接にいく、みたいな生活を送っていた。

面接に一社いくと、往復の移動時間も含めると数時間は使ってしまうし、交通費もバカにならないので、この頃は書類が通過して面接に呼ばれても、「面接しても通る見込みが薄いようであれば、書類で落としてもらえると嬉しい」みたいなことで、可能性が低いところは、切っていた気がする。


そんな生活をしているうちに4月末ごろ、なんと内定がでたのだ!

そこで、新規の応募は中断。

今現在、面接待ちのところの結果をみて終わりにしようと決めた。

そして驚くことに、残していた残り一社の面接でも内定がでたのだ。

今となってはわからないが、「内定が一個でている」ということを伝えたのも効果的だったかもしれない。

「内定が出ています」カードはわりと強いのか。

給料としては一社目の方がよかったが、自分のキャリアプランや社員の雰囲気などからあとあとから内定が出たほうに入社することにした。

引き止め

うれしいことに、一社目の会社からは引き止められたりもした。

「会社の魅力を十分に伝えられなかったかも知れないので、もう一度話し合いの機会を設けさせてくれないか」といわれたので、「意思を変更することを前提としないのであれば」という条件で、もう一度面接をしに行ってきた。

今度は、選考面接ではないので、非常にざっくばらんに話をさせてもらった。

決して雰囲気は悪くはなかったが、話をするなかで、もう一社のほうが自分のキャリアプランに合っていそうな気を改めて強くしたので、改めて辞退をすることにした。

研修

どこの会社もだいたい同じかとは思うが、技術研修は課題が与えられてそれをどんどん進めていく形式だった。

研修はJavaの研修だった。

履歴書や職務経歴書、ポートフォリオなどをみて自分の実力を知っている人事や講師からは、「他の人の半分の期間で終わらせようか(笑)」と言われてたが、途中バグが取れなかったり、意外にボリューミーだったこともあり、なんだかんだ周りと同じになってしまった。

とはいっても周りよりは遥かに詳しかったので、同期の人とかに教えたりもしていた。

一方で、それなりにスキルがあるということで、会社としても退屈な現場に行かせたくないのか、現場を選んでくれているようで、なかなか現場が決まらなかった。

研修も終わりようやく現場着任となった。

現場着任

詳しいことは言えないが、Javaを使う現場で、SpringFrameworkを使う現場にまずは着任となった。

詳細設計から携わることになり、今まで独学でプログラミングをやってきて、変数名とか適当でやってたので、画面仕様書の作り方でExcelと格闘している、という状態。

以前、倉庫作業のアルバイトをするための送迎バス待ち合わせをした場所の近くで、そのとき、ビルの中へ吸い込まれていく人達をみて「いつかあっち側の世界に行きたいな」と思ったところだったので、いざそちら側へきてみると感慨深い。
(当時の記事 : 分断されている世界)

振り返って

振り返ってみると、未経験から転職するにはポートフォリオを充実させることは重要だと思った。

自分の場合は、先ほど述べた知人から紹介された会社へ応募する際に、その人が作った履歴書や職務経歴書を参考に見せてもらった。

そうするとかなり職務経歴書やポートフォリオが充実していたので、それを見習った。

自分が職務経歴書や転職サイトに載せたのは、
  • githubのURL(プログラミングスクールでつくった成果物を少し整理した)
  • 先ほど述べた選考の途中で課されたコーディング課題の成果物
  • このブログ
などである。

あと、職務経歴書の方も多少盛ってしまったが、少しでも触ったことがあるものはスキルとして書いたので結構なボリュームになった。

面接で言葉を並べるのもいいけれど(話すときに使うキーワードである程度スキルは見極められるだろうから)、実際にコードをみればより的確にスキルを見てもらえるので、是非載せるべきだと思う。



あと、やや繰り返しにはなるが、「失敗を楽しめ!」というモットーが自分の中に誕生したことは大きかったと思う。

「失敗を楽しめ!」という命令形なのか「失敗を楽しむ」なのかは、テンションにもよるけど、なにか躊躇することがあったときには、このフレーズを頭に唱えることで、随分性格が変わったと思う。

そもそもここに至ったのは、もんじゃの件がきっかけではあるけれど。

たかがもんじゃ。

何気ない日常の中に、思いもよらないきっかけは隠れているのかもしれない。

2019年7月30日火曜日

自分から手を上げる

7月ももうじき終わる。

7月になったらもう少しブログを更新するとかいいながら、更新せずもうこんな時期になってしまった。

いまこうしてブログを書くときに思い返してみれば、結構ネタはいろいろあったのだけど、とりあえず直近のことを書こうと思う。



今日は先日転職したばかりの会社で、今更ながらオリエンテーションがあった。

少なくともここ半年ほどは、かなり募集をしていて随時新入社員が入ってきているので、オリエンテーションもある程度まとめてやっているようだ。

僕の場合は前回のオリエンテーションに出席できなかったので、今回参加。



最初に数分ほどで、自己紹介をさせられた。

特に順番とかは決められてはなく、希望順だった。

「誰からいきますか」と、最初に自己紹介をする人を求められたとき、あまり躊躇せずに手を上げることができた。

ここ何回かのブログエントリーで「失敗を楽しむ」というキーワードに触れているが、自分から手をあげて、少し成長したなと思った。(この件以外にも成長を感じる場面が結構あったにはあったけど。)

以前の自分だったら、「言うことがまとまってない。。。」とか「こんなこと言っていいのかな。。。」とか、「うまく言えなかったらどうしよう。。。」とかくよくよ悩んで、前へでることができなかったが、最近では、「あえて失敗しにいってる」感じがする。


そんな少し成長が感じられたエピソードでした。

2019年7月2日火曜日

人生の転換点

かなり久しぶりにブログを更新しています。

ご無沙汰になってしまいましたが、頑張って更新していければと思います。



さて、ついに6月末で前職を退職しました。

詳しいことについては、また機会を改めて書きますが、5月のゴールデンウィーク明けから5月6月と新しい職場の研修に参加しながら、前職も契約満期まで働くとかいう無茶なことをやっていました。

そのせいもあり、忙しさが尋常じゃなく、いろいろいっぱいいっぱいでした。

それも6月末、しかもホントの最後の最後まで前職のシフトがあり30日まで働き、退職しました。



コールセンター業界からエンジニアへ転職。

これから楽しい日々が始まります。


詳しい話はまた改めて書きます。

2019年6月29日土曜日

MNISTデータの読み込み

これまた、いまさら感が半端無いですが、MNISTの読み込み方を書いておきます。

市販されている本(例えば『ゼロからつくるDeeplearning』とか)にうまーくパッキングされたものが付録としてついてきている場合もありますが、そういうのに頼らず、自力でやる方法を紹介します。

なぜなら本を買うとお金がかかってしまう可能性があるから。

ChainerやTensorFlowであれば、標準搭載されていますが、できるだけ高度なライブラリは使わず、できるかぎり標準的な装備でやりたいというのもあるので。


条件

  • お金はかけない(市販されている本などは頼らない)
  • できるだけ低装備で行う

注意

sklearnにも、load_digitsというデータセットが入っていますが、こちらはMNISTを加工して作られた8ピクセル×8ピクセルの画像データで、MNISTの簡略版なので、MNISTとは違うので注意しましょう。
(参考:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html)


オリジナルのMNISTは28ピクセル×28ピクセルの画像データになります。

手順

MNISTデータをダウンロード

まずは、MNISTのデータ本体を以下のURLへアクセスしてダウンロードします。

http://yann.lecun.com/exdb/mnist/

そこで、以下の4つのファイルをダウンロードします。
  • train-images-idx3-ubyte.gz
  • train-labels-idx1-ubyte.gz
  • t10k-images-idx3-ubyte.gz
  • t10k-labels-idx1-ubyte.gz
で解凍までします。

それで、新しくディレクトリをつくって、そこにこの4つのファイルを入れます。

新しいディレクトリの名前はなんでもいいのですが、ここではMNIST_dataという名前にすることにします。


python-mnistをインストール

MNISTを扱うようのライブラリがあるのでインストールします。 ターミナルを起動して、以下のようにコマンドを打ちます。
pip install python-mnist

(参考: https://pypi.org/project/python-mnist/ )


python-mnistのインポートからファイル読み込みまで

今回MNISTを読み込むコードを書くファイルは、とりあえずmnistとしておきます。

そして、mnistという名前のファイルと同じディレクトリに、先ほどのMNIST_dataというディレクトリも置いておきます。


実際のインポートは以下のようにします。
from mnist import MNIST
mnist = MNIST('../MNIST_data')
x_train, y_train = mnist.load_training() 

import numpy as np
import matplotlib.pyplot as plt
x_train = np.asarray(x_train).astype(np.float32)

x_train.shape      # (60000, 784)が返ってくる。
x_train[0]           #  784要素の配列が返ってくる。

plt.imshow(x_train[0].reshape(28,28))     # 画像として表示される。
plt.show()


以上でMNISTのインストールができました。

あとは、いろいろと好きなようにゴリゴリやっていくだけです。

2019年6月26日水曜日

Tomcatの起動の仕方

随分久しぶりの更新になります。

転職先の研修でJavaをやっているので、その絡みで、話は飛びますがTomcatについて書きます。

今回書くのは、まずはTomcatのターミナルからの起動方法です。


Tomcat自体は、単体でもインストールできますが、Eclipse(エクリプスorイクリプスと読みます)をインストールすればその中に入っているので、とりあえずそれを使うことにします。

Tomcat自体のインストールやEclipseのインストールは検索すればすぐ出てくるので省略します。


もう少し具体的にいえば、途中までの行き方はインストールの仕方によってそれぞれ違うと思うので、ここでは、Tomcatの中のbinというディレクトリのところまで辿りつけたところから話を始めます。


ちなみにbinというのはどういうディレクトリかといいますと、中にはこんなファイルやディレクトリがあるところです。


  • bootstrap.jar
  • commons-daemon.jar
  • makebase.sh
  • tomcat-juli.jar
  • catalina-tasks.xml
  • configtest.bat
  • setclasspath.bat
  • tomcat-native.tar.gz
  • catalina.bat
  • configtest.sh
  • setclasspath.sh
  • tool-wrapper.bat
  • catalina.sh
  • daemon.sh
  • shutdown.bat
  • tool-wrapper.sh
  • ciphers.bat
  • digest.bat
  • shutdown.sh
  • version.bat
  • ciphers.sh
  • digest.sh
  • startup.bat
  • version.sh
  • commons-daemon-native.tar.gz
  • makebase.bat
  • startup.sh



参考までに、今回の記事のようにEclipseの中のTomcatを使う場合、その場所は、

/Applications/Eclipse_2019-03.app/Contents/tomcat/9/bin

にあります。


さて、binの中のstartup.shのコマンドを打ちたいのですが、このままではパーミッションが有効ではないので、カレントディレクトリがbinの状態で以下のようなコマンドを打ちます。


$ chmod 755 *.sh

特に何か起こったようには見えませんが、気にしない。

そうすれば、startup.shが実行できるようになるので、以下のようにコマンドを打ちます。

 #くどいようだけど、カレントディレクトリがbinフォルダであるという前提。
$ ./startup.sh
そうすると以下のようになれば成功です。
Using CATALINA_BASE:   /Applications/Eclipse_2019-03.app/Contents/tomcat/9
Using CATALINA_HOME:   /Applications/Eclipse_2019-03.app/Contents/tomcat/9
Using CATALINA_TMPDIR: /Applications/Eclipse_2019-03.app/Contents/tomcat/9/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
Using CLASSPATH:       /Applications/Eclipse_2019-03.app/Contents/tomcat/9/bin/bootstrap.jar:/Applications/Eclipse_2019-03.app/Contents/tomcat/9/bin/tomcat-juli.jar
Tomcat started.
適当なブラウザを開き、http://localhost:8080/というURLに移動すれば、Tomcatのページが表示されます。