2020年1月3日金曜日

2020年3日目

5時に起きるとか決意しつつ今日も起きたのは6時半。


しかし、起きたあとはなんとなくダラダラ時間を過ごすのではなく、シャワーを浴びて、午前中のうちに、粗方の勉強のノルマを消化できた。


その後少しお出かけ。


今日のチャレンジとしては、荻窪駅近辺の行ったことがないエリアを散策してみた。


散策してみたはいいものそれほど面白いものは見つけられなかった。

2020年1月2日木曜日

2020年2日目

さて、新年二日目の記事を書こうと思う。


前回の記事で、「失敗を楽しむ」ことと「どんなに小さくてもいいから小さなチャレンジをする」ということを目標に掲げた。


で、そのチャレンジの一つ目が「朝型生活になること」にしてみた。


仕事が始まってしまうと、お昼寝とかは必ずしもできないが、休みのときであればできるので、日中眠くなったら昼寝をすることはOKにした。


まず、朝起きることを最優先。


とはいいつつ、起きたのは6時半。最初からつまづいてしまう。


めげずに頑張る。





そして、なんだかんだ夕方頃から外出。


カフェで、普段はほとんど注文することがない「宇治抹茶ラテ」を注文してみた。


本当、これだけだけと、これでもチャレンジにカウントしていいことにする。




英語の勉強。


昨年暮れから、NCCに通っていたときの課題の復習を始めた。


で、口語表現集と単語集があるのだけど、それもいい感じに毎日続いている。


いい加減10回ぐらい回しているので、かなり早いペースで全体を一周できるようになってきている。


一方で10回ぐらいやっても、まだ曖昧になるとこともある。


でも、続ければできるようになる、という実感はあるので、これは引き続き継続する。









今日はそんなところ。











2020年1月1日水曜日

2020年へ向けて

あけましておめでとうございます。

忙しかったりなんだりで、更新が止まっていた。

毎年毎年宣言している気もするが、年が変わったのを気に、また再開しようと思う。



2019年の振り返り

2019年についても簡単に振り返っておく。

2019年は、ここ数年で一番激動だった。

本当に1年間で起こったことなのか信じられないくらいの激動。

一番大きいのは、転職をしたことだ。
(詳しくは、未経験からエンジニアに転職するまで を参照)

転職が成功し、研修2ヶ月ほどを終えて、現場に着任。

現場着任し1ヶ月ほどしてから、開発のフェーズが繁忙なモードに入り、そのあたりから、ブログや英語の学習が停滞してしまって、なかなか復帰するのが難しくなってしまった。






2020年の抱負

  1. 失敗を楽しめ

  2. 去年、転職をする前、前の職場にいるときに、できた自分のモットーである。
    これは引き続き2020年もこれを心にもっていきたい。

    で、これに関連して、毎日どんな小さなことでもいいから、挑戦をして積極的に失敗をしに行きたいとおもう。

    失敗をすることが楽しみとなり、積極的に失敗を求めるようになってから、自分の性格や行動が全体的に変わった気がする。

  3. 完璧に固執しない

  4. これは昨年から引き続き。

    いろいろな事情で完璧にできなかったとしても、それで挫けない。



その他具体的目標としては、たくさんあるけども、英検準1級や1級、TOEICハイスコアなども目指して行きたい。



2019年9月8日日曜日

リーマン積分

MathJaxと書くと重いので、Githubにpdfを置きました。

https://github.com/erdes/math/blob/master/integral1.pdf

Java/クラス継承

新しい会社でJavaを新たに学ぶことになり、JavaSilverを勉強中。

勉強の記録したことを、自分の記録としても残しておこうと思う。

可能な限りシンプルな例で、言語の仕様などを理解できるように書いていこうと思う。

前提

JVMはインストールされている前提とする。

開発する環境はいろいろあるとは思うが(実際自分のパソコンにもSTSが入っているが)、愚直にコマンドラインからコンパイルを行っていく。

クラスの継承

Jobsというクラスを継承して、EngineerやPolice、Firefighter、Doctorといった子クラスを作っていくことを考える。

(まずはEngineerをつくるので、Policeなどはまだつくらないかもしれないが)

まず、Jobsクラスをつくる。
//Jobs.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Jobs{
int salary;
}
同様に、Engineerクラスを作る。
//Engineer.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Engineer extends Jobs{
  Engineer(){
    salary = 50;
  }
}
この二つのファイルを作成し、同じディレクトリに置いておく。

コマンドでカレントディレクトリ(この二つのファイルが置いてあるディレクトリ)に移動したら、以下のようにコマンドを打つ。
$javac Engineer.java
そうすると、同じディレクトリに、Jobs.classというファイルと、Engineer.classというファイルが作成される。

今回の場合、何かを行うわけではないので(コンソールに表示したりとか)、「無事コンパイルできました」というところで話は一区切りとなる。
$javac Jobs.java Engineer.java
としてもよいが、Engineer.javaだけでも同じこと。

コンパイルが失敗する例

コンパイルできない例も書いておく。

Jobsクラスは以下のようにする。(フィールドは何も宣言しない。)
//Jobs.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Jobs{
}
Engineerクラスは同じ。(だけどもう一度書いておく。)
//Engineer.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Engineer extends Jobs{
  Engineer(){
    salary = 50;
  }
}
これで、同じく
$javac Engineer.java
と打つ。

そうすると、以下のようなエラーが吐かれる。
Engineer.java:5: エラー: シンボルを見つけられません
    salary = 50;
    ^
  シンボル:   変数 salary
  場所: クラス Engineer
エラー1個
salaryという変数は親クラスでも子クラスでも宣言されていないからだ。

余談

本題とは少し関係ないが、やらかした凡ミスも書いておく。

本当に初歩の初歩のミスだが、extendsのところをsを抜かしてextendにしてしまってコンパイルできなかったことがあった。
//Engineer.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Engineer extend Jobs{
  Engineer(){
    salary = 50;
  }
}
これでコンパイルをしようとすると以下のようなエラーが出される。
Engineer.java:1: エラー: '{'がありません
public class Engineer extend Jobs{
                     ^
エラー1個

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!


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

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