【技術勉強】オブジェクト指向でなぜつくるのか

三大要素

クラス(カプセル化

「クラス」とは種類
インスタンス」とは具体的なモノ


クラスの仕組み

クラスの特徴には、「まとめる」「隠す」「たくさん作る」がある

まとめる

そのままの意味

隠す

クラスに定義した変数とメソッドを、他のクラスから隠すことができる

たくさん作る

一度クラスとして定義すると、実行時にそこから幾つでもインスタンスを作ることができる


それぞれの変数の特徴

インスタンス変数の特徴

  1. 別のクラスのメソッドからアクセスできないように隠すことができる

  2. 一旦インスタンスが作られた後は、必要がなくなるまでメモリ上に残される

グローバル変数の特徴

  1. プログラムのどこからでもアクセスできてしまう

  2. プログラムの最初から最後まで存在しているため、メソッドの実行範囲を超えて管理したい情報を保持することができる

ローカル変数の特徴

  1. 特定のメソッドからしかアクセスできない

  2. メソッドの実行期間中にだけ存在する一時的な情報しか時保持できない

インスタンス変数は、影響範囲を局所化できるローカル変数と、存在期間の長いグローバル変数のいいとこどりをしたもの



ポリモーフィズム

ポリモーフィズムとは「いろいろな形に変わる」という意味
相手が具体的にそのクラスのインスタンスであるかを意識せずにメッセージを送れる仕組み
(メソッドを呼び出す側のロジッックを一本化する仕組み)



継承

モノの種類の共通点と相違点を体系的に整理する仕組み
クラスの共通部分を別クラスにまとめて、それによってコードの重複を排除する仕組み



メモリの仕組み

CPUはマルチスレッド?

CPUが一時点で実行できる処理は1つだけ
CPUは複数のスレッドの処理を少しずつ順繰りに実行していて、
あるスレッドの処理を実行するとき、決められた非常に短い時間だけ実行する
その時間が来たら、中途半端で会っても一旦中断して、次のスレッドに移る仕組みになっている

CPUは処理速度が非常に速いため、人間からすると複数の仕事を同時に行なっているように感じる



メモリ領域は3つに分けて管理

静的領域

プログラム開始時に確保され、行こうプログラムが終了するまで配置が固定される領域
ex. グローバル領域、コード情報


ヒープ領域

プログラムの実行時にどう時に確保するためのメモリ領域
プログラム実行中にアプリケーションから必要なサイズを要求することで割り当てを行い、不要になれば元に戻す


スタック領域

スレッドの制御のために使うメモリ領域
ヒープ領域は複数のスレッドから共有されるが、スタック領域はスレッドに1つずつ用意される
メソッド呼び出し制御のために使われるメモリ領域で、メソッドの引数やローカル変数、戻り先などの情報を格納する



OOPのメモリの使い方

メソッドに書かれたコード情報は1クラスに1つだけロードされる
インスタンスを生成するたびにヒープ領域が使われる

OOPで書いたプログラムは有限のメモリ領域であるヒープ領域を大量に使って動く

変数にはインスタンスの「ポインタ」が格納される
ポインタとは、メモリ領域の場所を示す情報



再利用

クラスライブラリ

汎用的な機能を持つクラスをたくさん集めたもの


フレームワーク

包括的なアプリケーション基盤


コンポーネント

  • OOPのクラスよりも粒度が大きい
  • ソースコード形式ではなく、バイナリ形式で提供される
  • コンポーネントの定義情報を含めて提供される
  • 昨日の独立性が高く、内部詳細を知らなくても利用できる


デザインパターン

設計パターン



UML(ユーエムエル)

1. OOPのプログラム構造や動作を表現する

  • クラス図で構造を表現する
  • シーケンス図・コミュニケーション図で動きを表現する


2. 汎用の整理術としての成果物を表現する


3. オブジェクト指向では表現できない情報を表現する

ユースケース図でコンピュータに任せる仕事を表現



オブジェクト指向設計の基本

1. 重複を排除する


2. 部品の独立性を高める

凝集度]

それぞれの部品の機能のまとまり度合い
「強い」方がいい設計


結合度

部品間の結びつき度合い
「弱い」方がいい設計


凝集度を強くするコツ

  • 一言で表現できる名前をつける
  • クラスやメソッドを小さく作る


3. 依存関係を循環させない

【読書感想】イシューからはじめよ

仕事のできる人ってどうやって仕事を進めているのかわからず、とりあえず手にとってみたほんです。

 

まず、心にグサリと来たのは、「考える」ことと、「悩む」ことの違いについてです。

・「考える」=答えが出る

・「悩む」=答えが出ない=考えているフリをしている

 

これは以前社長に、「自分が成長できてるのかわからない」と伝えたところ、

「暇なんだね」「悩むって丁度いいんだよね」と言われてしまいました。

この本でもそれと同じことを言われているなと感じました。

自分は仕事をしているように見せかけて、それは前に進むことのない物事だと気付かされました。

 

この本では、「仕事をしている上では、10分真剣に考えて答えが出なければ、一旦それをやめるべきで、それは「悩み」になってる可能性が高い」との事。

 

「悩む」と「考える」は別物であるとキチンと心に留めておかないとですね。

 

 

「生産性」とは、

インプットをアウトプットで割ったもので、インプットの量ではなく、多くのアウトプット=意味のある仕事と認識される。

 

では、「意味のある仕事」とは、

「イシュー度(問題に対して答えを出す必要性)」×「解の質(イシューに対してどこまで明確に答えを出せているか)」

イシュー度が低くいと、解の質が高くても、側から見ると意味がないものになるそう。

 

「イシュー度」が、高いか低いか判断できるようにならないといけないんですね。

 

 

他にも色々書いてあったのですが、私の脳の処理が追いつかなくて、よくわかりませんでした、、情けない、、

【読書感想】神・時間術

普段仕事をしている中で、時間の使い方が下手なのではないか、とか、

もっといい時間の使い方があるのでは、とかとか思い、

そのヒントを見つけるべく『神・時間術』を読んでみました。

 

この本を読んでいて、1番ゾッとしたのが、

「朝の30分=夜の2時間」という事でした。

脳にとってのゴールデンタイムは、起きた後の2-3時間で、

そこから時間が経つにつれて、脳の動きは落ちていく一方だそうです。

 

私はいつも出社してから、はじめにニュースをざっと読み、

タイピングの練習したり、技術書読んだりと、

自分にとってやりたくないルーティンをやっていましたが、

それより、脳が1番元気な午前中に、実装や設計に時間を割いた方が賢明だと思いました。

 

 

「15・45・90の法則」

人間が深い集中力を保てるのが15分、

15分を1単位として、集中力を保てるのが45分、

人間の中に90分の体内時計があり、90分は脳が動いて、その後の20は眠気が訪れるというサイクルがあるそうです。

 

何か仕事をするときは、この法則を意識しながら、時間を区切って仕事を進めていきたいですね。

 

 

「頭の中でふとしたことでも気になったらメモしておく」

『自分の頭で考えて動く部下の育て方』を読んだ時も、メモしておけば、自分の中で客観的に整理できたり、

アイディア出しの手助けになったりすると書いてありましたが、

今回は、何が物事を進める上で、無駄な雑念を排除して、そのことに集中するために、

気になったことはメモしておき、頭に浮かんだその雑念を一旦置いておくことができるとのこと。

メモするっていろんな役に立ちますねぇ。

 

 

あと細かいところで地味に使えるなと思ったのは、

何かの決断を先延ばしにするときは、「◯日の◯時〜◯時に決める」

というように、日付だけではなく時間まで決めておき、スケジュールに組み込むことで、

あ、やべあれ決めなきゃいけなかったじゃん…という現象改善になるなと思いました。

【技術勉強】アルゴリズム図鑑

データ構造

スタック

後かから入れたものを、先に出す
LIFO(Last In First Out)

キュー

先に入れたものを、先に出す
FIFO(First In First Out)

ハッシュ関数

ヒープ

f:id:naaaaaaa-tooo:20190612204632j:plain

各「ノード」は、最大2つの子データをもつ
子データは、親データより大きなもの

「プライオリティキュー」=自由に追加でき、小さいものから取り出す
最小値を頻繁に出すときに使える

二分探索木

https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Binary_search_tree.svg/300px-Binary_search_tree.svg.png

各「ノード」は、最大2つの子データをもつ
全てのノードは、そのノードの左部分木に含まれるどの数よりも大きくなる
全てのノードは、そのノードの右部分木に含まれるどの数よりも小さくなる



ソート

バブルソート

右から左に向かって、隣り合う2つの数字を比較して入れ替える
それを終わるまで繰り返す

選択ソート

数列の中から最小値を探し出し、左端の数字と入れ替える

ヒープソート

マージソート

https://camo.qiitausercontent.com/51561df3442f3cdd7d2ab40caab47964bf2eb0cb/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138323936332f62616665663162332d373139632d626337332d633937362d3932326566636332613331662e6a706567

ソートする数列をほぼ同じ長さの2つの数列に分割していって、分割できないところまで行ったら、グループ同士をマージしていっていく

クイックソート

https://slidesplayer.net/slide/11273690/61/images/20/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88%E3%81%AE%E5%8E%9F%E7%90%86+%E3%82%BD%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E7%AF%84%E5%9B%B2%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8B%E3%82%89%E9%81%A9%E5%BD%93%E3%81%AA%E8%BB%B8%E8%A6%81%E7%B4%A0%28%E6%9E%A2%E8%BB%B8%E3%80%81pivot%29+X%E3%82%92%E9%81%B8%E3%81%B6%E3%80%82.jpg

数列の中から、基準となる数字を取り出して、それより大きいか、小さいか振り分けていく



配列の探索

線形探索

二分探索

https://www.codereading.com/algo_and_ds/algo/images/binary-search.png



グラフ探索

幅優先探索

https://image.itmedia.co.jp/enterprise/articles/1001/16/tnfig1.jpg

深さ優先探索

https://camo.qiitausercontent.com/b30f025fc244e9706faa04e1c254a59aac357aa4/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3134303330342f64343138303762322d396238642d333833642d376463662d3161613537613837396133362e706e67



セキュリティ

ハッシュ関数

特徴

  1. 出力する値のデータ長が変わらない

  2. 同じ入力は必ず同じ出力になる

  3. 似た入力でも1ビット違えば、出力は大きく異なる

  4. 全く別の入力をしても、同じハッシュ値になる可能性がある =「ハッシュ値の衝突」

  5. ハッシュ値から元のデータを逆算することができない

パスワードをデータベースに保存するときとかに使われる。

共通鍵暗号方式

暗号と復号に同じ鍵を用いる方式
問題点:共通鍵を相手に送る場合、盗聴される危険性がある

公開鍵暗号方式

暗号化と復号で異なる鍵を使う方式
暗号化に使う鍵を「公開鍵」
復号に使う鍵を「秘密鍵

公開鍵を相手に渡して暗号化してもらえば、
三者に公開鍵を盗聴されていても、公開鍵ではデータを復号できないため、
共通鍵暗号方式より安全性がある

しかし、もらった公開鍵は、果たして公開鍵をくれた本当の人物かどうかわからない点や、
暗号化の処理速度が遅いという問題点がある

ハイブリッド暗号方式

共通鍵暗号方式と公開鍵暗号方式を組み合わせたもの

AからBにデータを送ろうとする場合

  1. Aが処理速度の早い共通鍵暗号方式でデータを暗号化する

  2. Bが公開鍵と秘密鍵を作成する

  3. BがAに公開鍵を送信

  4. Aはその公開鍵を使って、共通鍵暗号方式に使う鍵を暗号化する

  5. AからBに暗号化した鍵を送信する

  6. Bは秘密鍵を使って、鍵を復号する

  7. AからBに暗号化したデータを送り、それをBが復号した共通鍵を使って復号する

SSLでこの方式が使われている



その他

ユークリッドの互除法

MySQLを起動しようとしたら、間違ったIPアドレスを見に行っていた問題

問題

mysqlを起動させようとしても、なぜか途中で起動が終わってしまう。

$ ps -ef | grep mysql
centos   27647 27403  0 11:55 pts/1    00:00:00 grep --color=auto mysql

mysqlが起動してないな。

$ sudo mysqld_safe
190611 11:54:28 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
190611 11:54:29 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

あれ、起動が途中で終わっちゃう、、



状況確認

// エラーログファイルがどこにあるか確認
$ cat /etc/my.cnf
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
skip-character-set-client-handshake
character-set-server=utf8
character-set-client=utf8
init-connect = SET NAMES utf8
default_time_zone = '+0:00'

bind-address = 127.0.0.1
bind-address = 10.x.x.xxx

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log  //←ココ
pid-file=/var/run/mariadb/mariadb.pid
timezone = UTC

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

// エラーログを確認
$ sudo cat /var/log/mariadb/mariadb.log
190611 11:28:43 [Note] Plugin 'FEEDBACK' is disabled.
190611 11:28:43 [Note] Server socket created on IP: '10.x.x.xxx'.
190611 11:28:43 [ERROR] Can't start server: Bind on TCP/IP port. Got error: 99: Cannot assign requested address
190611 11:28:43 [ERROR] Do you already have another mysqld server running on port: 3306 ?
190611 11:28:43 [ERROR] Aborting

3306のポートがすでに使われてるのか?

// 使っているポート確認
$ netstat -tanp
[client]
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      -
tcp6       0      0 :::111                  :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 ::1:25                  :::*                    LISTEN      -

特に3306は使ってなさげ、、

あれ、繋げてるIPアドレスがローカルじゃないぞ?

190611 11:28:43 [Note] Server socket created on IP: '10.x.x.xxx'. 

もう一度、my.cnfを確認

$ cat /etc/my.cnf
bind-address = 127.0.0.1
bind-address = 10.x.x.xxx

bind-adressが2つ存在してる。

調べてみたところ、bind-adressは複数設定できない。
複数行書くと、最後の行が使われるらしい。



解決

$ sudo vim /etc/my.cnf
bind-address = 127.0.0.1
# bind-address = 10.x.x.xxx //コメントアウトしておく

$ sudo mysqld_safe &
190611 11:54:28 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
190611 11:54:29 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

$ ps -ef | grep mysql
root     27052  1951  0 11:54 pts/0    00:00:00 sudo mysqld_safe
root     27053 27052  0 11:54 pts/0    00:00:00 /bin/sh /bin/mysqld_safe
mysql    27293 27053  1 11:54 pts/0    00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
centos   27647 27403  0 11:55 pts/1    00:00:00 grep --color=auto mysql

やっとこさ起動できました。

【読書感想】自分の頭で考えて動く部下の育て方

先日、社長に自分に対してどのようなことを期待しているのか聞いたところ、

自ら動いて仕事をこなしていくこと、自主性を持つことと言われました。

「仕事に対する自主性」ってどうすれば身につくの?と思い、

別に部下がいるわけではない(むしろ新卒1年目)ですが、

後輩の育て方という観点から、「自主性」「上の人が求めるもの」を探るために読んでみました。

 

まず大切なのは、本のタイトルにもあるように「自ら考える」癖を身につけなければいけないことです。

「考える」癖を身につけるためには、自分がやる仕事の意味・目的を考えてみる。その仕事の後に、次はどんな仕事をすべきかを考えてみる。

こうすることで、能動的に仕事をすることができるようになるし、自ら考えて次の仕事を取りに行くことができるようになるようです。

これは私自身入社してすぐの頃に、社長からにも「目的思考で仕事をしていくべし」と言われました。

 

具体的にどう自主的に行動していけばいいのかというと、

仮説的思考(観察→推論→仮説→検証→考察)を繰り返して、「知らない」ことを「知っている」ことに変えることを繰り返していく必要があるそうです。

仮説的思考をする=自主的な思考、行動につながるということでしょうか。

またもやこれも社長から言われたことがあります。考えてみて、調べて、考えて、仮説を立てる、これを繰り返すのがビジネスだと。

 

まず、やる仕事の「目的」を考えてから、仕事に取り組むべきだと思いました。

その癖を第一歩に身につけるべきだと。

そして、査定をクリアするためには、仮説的思考を身につけないといけませんね。

 

そしてそして、社長すごい。

【読書感想】アウトプット大全

私はアウトプットすることに対して苦手意識がありました。

何かアウトプットしなければと思って、ブログを書こうとしても、文章を書くのが苦手で、時間がかかるし、

書き終えたとしてもそれに満足してしまって、身になっているのかわかりませんでした。

 

『アウトプット大全』を読んだことで、

1. アウトプットのために書くブログは、書く時間をあらかじめ決めておくことで、短い時間で終わらせ、かつブログを書くことを続けやすくなる

 

2. アウトプットをしても、身になっていない人は、フィードバック(見直し・修正)をしていない

 

3. 以前からTwitterには読んだ本の内容をつぶやいていたけど、それらはただのコピペになっていた

 

ということに気がつきました。

 

これからは、

1. ブログを書く時間を短めに設定する

 

2. ブログ,twitterを書いた時は、その次の日以降に見直して、修正する

これから読書感想文をこのブログに書く

 

3. Twitterで呟くときは、本から得たものに対して自分がどう思ったかも付け足す

 

4. Twitterだけではなく、このブログにも読書感想文を書く

 

この四つのことをやりたいと思いました。