Yabu.log

色々勉強するブログです。

Goの時間フォーマットは他の言語とかなり違っている

多くのプログラミング言語には時間を表示、保存するときに文字型に変換するためのフォーマットが用意されています

例えばJavaではこんな感じでyやMを使って日付フォーマットを指定します。大方他の言語でもこのような方式になっていると思います

 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
 Date now = new Date(System.currentTimeMillis());
        
String nowStr = format.format(now);
System.out.println(nowStr);
//出力:2018-10-15 13:07:24.872

Goだとどうでしょうか。こんな感じに指定します。

now := time.Now()
nowStr := now.Format("2006-01-02 15:04:05.000")
//出力結果:2018-10-15 22:14:57.1516

あれ?なんで時刻の値を与えているんだ?と最初戸惑いましたが、Goでは2006年1月2日の15時4分という時間をサンプルとして与えてフォーマットとしています。

意味 Java Golang
M 1
d 2
時間 H 3
m 3
s 5
y 06(2006)

なおこの時刻は何か特別な日付ではなく、作者が自然と考えるフォーマットで書いたときに1,2,3...と並ぶように作ったようです。

これはアメリカ式の時刻の順番なのだ。"1月2日午後3時4分5秒2006年"(つまり「自然な順番」で1, 2, 3, 4, 5, 6)を指しているのである。

qiita.com

Goならわかるシステムプログラミングを読み終えました

13章までは一人で読みました。14章以降は横浜Go読書会に参加して読みました。

Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

どんな本だったか?

Go言語の要素

  • io.Writeやio.Readなどのinterface
  • chanelで同期をとる仕組み
  • go routineで並列に処理する仕組み

などを使ってコンピュータやOS,ネットワークの仕組みに迫るという本です。大体以下の要素を学びます

  • OSのシステムコール
  • ネットワーク全般
  • ファイルシステム
  • プロセス、スレッド
  • シグナル
  • 並列処理
  • メモリ管理
  • 時間・時刻の扱い
  • コンテナ、仮想化技術
  • OSのセキュリティ(付録)

どんな人向けか?

この本はGolang × システムプログラミングな本であることは確かだけど、どちらかの理解が浅い人が片方を頼りに理解を補うような本ではないと思う。 文章とか可愛い図が多かったりする点から初心者テイストを感じするが、読後は中級者向けな印象を受けた。入門書ではないかなと。 Golangとシステム双方をある程度理解した人がその接点を探るような読み方が、ベストなのではと思う。

感想

私にとってGolangに関して初めて読んだ本となりました。ネットワークの話題などはいくつかブログに検証する記事をあげました。

yuyubu.hatenablog.com

yuyubu.hatenablog.com

yuyubu.hatenablog.com

またこの本に影響されてTour of Goをやってみた。

yuyubu.hatenablog.com

yuyubu.hatenablog.com

OSについては今年の前半に割と頑張って勉強したから分かる箇所が多かったものの、並列処理などはわからない点が多かった。

yuyubu.hatenablog.com

私自身マルチスレッドなプログラミングはあまりやったことがないので、 他の言語と比較することはできないはgoはかなりカジュアルに並列処理(go routine)ができる点が特徴だと思うので、並列・並行制御に関するベストプラクティスを紹介するような本が相性がいいんじゃないかなと思います(横浜Go読書会の次回の課題本)

今後(個人的な話)

Goもシステムプログラミングも基礎が全然足りていないという感想。まだまだ初心者にすぎないことを思い知らされた一冊でした。ほんの内容と関係ないけど今後どんなことを学んで行きたいか書いてみようと思います。

今後のシステムプログラミング分野の学習

大体は低レイヤーの歩き方に書いてあるトピックに剃って勉強を進めていく感じ。

rkx1209.hatenablog.com

今はパタヘネやコンピュータネットワークを読んでいるけど、インフラエンジニアになる予定は今のところないので、ネットワークは教養目的で勉強を進めています。

コンピュータの構成と設計 第5版 上・下電子合本版

コンピュータの構成と設計 第5版 上・下電子合本版

コンピュータネットワーク 第5版

コンピュータネットワーク 第5版

  • 作者: アンドリュー・S・タネンバウム,デイビッド・J・ウエザロール,水野忠則,相田仁,東野輝夫,太田賢,西垣正勝,渡辺尚
  • 出版社/メーカー: 日経BP
  • 発売日: 2013/09/12
  • メディア: 単行本
  • この商品を含むブログ (4件) を見る

今後のGolangの学習

Goを使うような仕事についてみたいけど、未経験なのでポテンシャル採用になると思うけど、それができる第2新卒ほど若くないし、厳しいだろうなという印象。まずはProgramming言語Goをやって基礎を固めたいと思う。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

横浜Go読書会の次の課題本は「Go言語による並行処理」。

Go言語による並行処理

Go言語による並行処理

これもプログラミング言語Goの第8章と9章ができていないと難しいのではないかという話。

TREE LOCKをdeadlock-freeに保つ5つの条件

TREE系のindexやODBの継承関係をもつテーブル等、木のデータ構造を持つオブジェクトをロックする方法としてTREE LOCKという方法がある

単純にオブジェクト全体をロックするよりも、このロックを使ったほうがパフォーマンスが良い場合がある。

TREE LOCKのプロトコルは以下のルールに従う必要がある。

TREE LOCKが従うべき5つのルール

  • 1.要素Xにアクセスする前に必ずxをロックすること
  • 2.他のトランザクションがロックしていない時のみXのロックを確認できる
  • 3.ロックしたい要素xが木の根でない場合、必ず親の要素をロックすること(根→葉の方向でロックが進む)
  • 4.あるトランザクションがXを解放できるのはXに関する処理が全て終わったあとのみ
  • 5.あるトランザクションがXを解放後、再びXのロックを確保できない。

f:id:yuyubu:20181012211312p:plain
アクセスしたい要素の親を常に抑える

TREE LOCKではロック順が必ずroot→reafの順番に進む。例えば上記の図で23の要素が欲しい場合は

al(50)
al(17)
al(23)

の順番にロックを獲得し、解放する時はその逆で実施する。※al : acess lock

このルールに従った場合、木の中ではdead-lockが発生しなくなる。*1 なぜなら

T1→T2→...→T1

というサイクルが発生したと仮定すると、前のT1ですでにrootのlockが完了しているので、後ろのT1はlock待ちにならないからである。

TLのメリットは2PLよりもロックを早く解放することができることである。ただしこれはトランザクションマネージャーがロック解放対象のノードが不要になったタイミングを検知、通知できる場合のみである。不要確定時の通知が難しい場合、ロックの解放はトランザクションの終了時になる(=S2PL)

参考

Concurrency Control and Recovery in Database Systems

Concurrency Control and Recovery in Database Systems

*1:木が複数ある場合はdead-lockが発生する可能性がある

*2:これはあくまで私の理解であって議事録や勉強会全体での総意ではありません

IEEE754について。モダンなコンピュータはどのように少数を扱っているのか

IEEE754とは

小数の計算性能と移植性改善のために制定された。おそらく現代のほとんどのコンピュータや言語処理系が採用している少数を扱うときの規格。

値の表現方法について

その表現は符号部(sign)、指数部(exponent)、仮数部(fraction)に分けられる

f:id:yuyubu:20181008234719p:plain

value start end length
sign 31 31 1
exponent 23 30 8
fraction 0 22 23

画像の出典:https://en.wikipedia.org/wiki/IEEE_754-1985

それぞれを組み合わせて以下のように少数を表現している

(-1)sign * (1 + fraction) * 2exponent-127

sign bitを符号の有無に利用している点はシンプルだが、仮数部および指数部は 1を足したり127を引いたりしていてややこしく、初見では理解しがたいため解説を後述する

仮数部はなぜ1を足しているのか。

これは科学的表記法を2進数に適応した場合を考えるとわかりやすい。

7.5025 + 102 = 750.25

これが科学的表記法。凡例は

m * 10n ただし 0 <= m < 1

これを2進数に適応すると

1.01110111001 * 29 = 1011101110.01

となる。

2進で表現した小数は表現する数値が0以外の場合、科学的表記法に直すと仮数部の左端は必ず1になる。以下に適当な例をあげる

10進数 2進数 科学的表記法
0.75 0.11 1.1 * 2^ -2
12.5 1100.1 1.1001 * 2^ -3
33.25 100001.01 1.0000101 * 2^ -5

IEEE754ではこちらを省略するようになっている

IEEE754では,正規化された2進数の先頭の1を仮数フィールドの中で直接持たないようにした.したがって,仮数の実際の長さは,単精度では24ビットであり,倍精度では53ビット(1+52)である.正確を期す場合には,頭に1を付けた24まビットの数値を指して“significand”という用語を使用し,23ビットの数値を指して“fraction”という用語を使用する.0には前に1が付かないので,ハードウエアが1を付加しないようにするために,特定の値が予約されている.

コンピュータの構成と設計 3.5章 浮動小数点演算より抜粋(補足:倍精度小数点に関する記述を省いてある)

※予約されている特定の値は単精度浮動小数点の場合はオール0である

浮動小数点数の表現で省略した1を+1して戻すことで実際の値としている。

指数部はなぜ127を引いているのか

これはゲタばき表現、と呼ばれるものであり数値比較を単純にするために

  • 00000000の状態を最小値に(2^ -127)にしたい
  • 11111111の状態を最大値に(2^ 128)にしたい

という目標がある。ので8進数で0~255の値を計算した後、そこから127を引いてcの値に変換する。 この操作をゲタばき(バイアス)という。

最も小さな負の指数を00...00と表し,最も大きな正の指数を11...11と表すような,表記法を用いることが望ましい.それをゲタばき表現(biasedrepresentation)と呼ぶ.ゲタばき表現をとる際に,実際の値を得るために,通常の符号なしの表現から引く数値をゲタ(bias)という.

コンピュータの構成と設計 3.5章 浮動小数点演算より抜粋

まとめ

  • 最上位ビット(31ビット目)は0で整数、1で負数の符号を表す
  • 仮数部では科学的表記法の2進数表現と同じ考え方だが、最上位ビットになる「1」を省略する
  • 指数部ではゲタばき表現を使って-127~128を表現する

コンピュータの構成と設計 第5版 上・下電子合本版

コンピュータの構成と設計 第5版 上・下電子合本版

プログラマのためのSQL 読書会(28)に参加

今回の勉強会では、標準SQLかどうかを判断できる無料の資料の存在を教えてもらったのがデカかったです。

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

  • 「30. 6 ベンダー 拡張」から「31.6累積統計」まで読みました。
  • 進捗72% →74%

30. 6 ベンダー 拡張

この節でベンダー拡張のWindow関数として紹介されている以下の関数は、 現在では全て標準SQLに入っているためベンダー拡張では無くなっている。

この節で書かれているベンダ間の差分は無くなっています。 これはつまりどういうことかというと、Window関数に関して、一般的に普及している主要RDBMSはかなり高い水準でSQL標準に準拠しているということです。

そういえばMySQL8にWindow関数が対応したことが大きなニュースになっていましたね。 時代がWindow関数に追いつきましたね。私も障害調査の時にWindow関数をかなりカジュアルに書きますが、まだまだ普及しているとは言い難いので、積極的に使っていきましょう。

標準SQLかどうかはどうやって見分けるか?

  • JISになったものは公開されているのでそちらをみる

  • 昔の99とかは本が出たのでそちらを参考

C.J.Dateの有名なサンプルデータについて

サンプルとして、デイトの有名な部品テーブルを利用しよう(Date,1983,1995a)。

Parts

part_nbr part_name part_color part_wgt city_name
p1 Nut Red 12 London
p2 Bolt Green 17 paris
p3 Cam Blue 12 paris
p4 Screw Red 14 London
p5 Cam Blue 12 paris
p6 Cog Red 19 London

とあるが、有名なのか?と話題を出したところ、誰も特に知らなかった。まだ本書の参考文献は量が多いことに加えて、巻末に纏めて書かれているため参照しにくい。帰宅後調査してみたところ

Dateに関して1983年と1995年の著作は以下のものがあるらしい

  • Relational Database Writings 1991-1994 [FACSIMILE], 1995, Addison Wesley Longman, ISBN 978-0201824599
  • Database : a primer, Addison Wesley, 1983, ISBN 978-0201113587

おそらくこの2冊からの引用ということだろう。

Relational Database Writings 1991-1994

Relational Database Writings 1991-1994

Database: A Primer

Database: A Primer

余談だがカラム名でググってみたところ、

  • この本
  • セルコの投稿
  • この本のmedianの節を参考にしたと思われる発表スライド

のみがヒットした。セルコ以外の人が特に利用している様子が見当たらなかった。

JIS標準がカタカナ名末尾の'ー'をつけない理由

  • コンピュータ(JIS準拠)
  • コンピューター(非準拠)

JISの資料が多すぎて末尾のーを消すだけで規格書が1冊へる、という理由があるらしいが、ソースが不明。Wikipediaにも似たようなことが書かれている

JISの従来の表記規格では、後述のように一定の基準で長音符を省略していた。省略した理由は、当時の活字などの印刷コスト、紙面や画面上の表示スペース、記憶装置などの節約と言われている[要出典]。

次回は「31.6 累積統計」から

分散処理本第39回に参加

恒例の分散本(Distributed Computing: Principles, Algorithms, and Systems)を読む勉強会です。

分散システムでのデッドロック検知はサイト間での検知を如何にとるか、と言うのがポイントだと思います。 今回勉強した2種類のアルゴリズムではサイト間でメッセージを送ってデッドロックを検知します

Distributed Computing: Principles, Algorithms, and Systems

Distributed Computing: Principles, Algorithms, and Systems

10.7  Chandy–Misra–Haas algorithm for the AND model

Andモデルでのデッドロック検出は単純で、サイクルを検出できれば良い。tripletというメッセージをWFGの依存先の各ノードがサイト外である場合に送る。

  • triple(i,j,k)の形式は以下に示す通り

    • i:デッドロック検出を開始したノード
    • j:kに依存しているノード(かつkとは別サイト)
    • k:jが依存しているノード(かつjとは別サイト)
  • 送信するprobe:triplet(pi, pj, pk)

  • 依存関係の配列:dependent_K(i)

f:id:yuyubu:20181003234144p:plain
引用元:http://www.lnse.org/vol3/205-X0012.pdf

以下がアルゴリズム

Algorithm 10.1 より引用

ポイントは以下の通り

  • サイクルの検出開始地点(Fig1の図で言うとP1がi=kのprobeを受け取った時点でデッドロックの検出が成功する。
    • 上図(fig1)の例でだと(1,5,1)のprobeがi=kに相当する
  • 検出開始ノードから送るprobeの内容とprobeを受け取ったノードが依存先にprobeを送る内容は同一

参考リンク:

10.8  Chandy–Misra–Haas algorithm for the OR model

  • 基本的な考え方
    • ORモデルの場合は一つのサイクルの検出でデッドロック検知とならない。
    • ORモデルの定義として、複数のリソースに依存している場合、依存先のリソース全てでデッドロックが発生して初めてデッドロックとなる
    • このため、WFGの各ノードは依存先のノード件数をローカル変数numでもつ
    • 依存先のデッドロック検出(後述のreply受診時)の度に、numをデクリメントする。
    • num=0のノードはその先で全てデッドロックが起こっていると言うことなのでreply(i,j,k)を自分の依存元に返す

f:id:yuyubu:20181004001029p:plain
A->Aのデッドロックが最初に発生した時

アルゴリズム

Algorithm 10.2 Chandy–Misra–Haas algorithm for the OR model より抜粋

最終的に上図のAはBからreply(A,B,A),つまりi=k=Aを受け取ってデッドロックの検知が完了する。

参考リンク:

読書会では「10.9 Kshemkalyani–Singhal algorithm for the P-out-of-Q model」まで突入したが、予習ができてないので内容がよくわからなかった。 また、10.9をやりきっていないのでそちらは次回の予習で調べます。

次回は「10.9.2 The algorithm」から

新卒入社したSESの会社を退職しました

新卒で入社して3年半ほど務めました。9月26日が最終出社日でした。 前職でどのようなことを経験してきたか書いてみようと思います。

前職について

一応正社員契約でしたが、SESと呼ばれるものでお客様先に派遣されて勤務します。いわゆる客先常駐というやつです。メリットは短期間で複数の現場に派遣されるので、転職することなく複数の業界/現場で働くことができることだと思います。

パッと思い出すだけでも

  • 医療
  • 交通
  • 通信
  • 電子書籍
  • 歯医者
  • 大企業の売り上げ計算

などのシステム構築/保守のお手伝いができました。ただ私が務めていた会社はユーザーの間に何社か入る形のものが多かったので、どうしても仕様が又聞きのようなものになり,あまりいいシステム開発ができなかった*1

前職で担当した仕事&仕事に関連して学んだこと

Salesforce

salesforceは簡単に言ってしまえばインフラとかミドルウェアの構築が一切不要なPaaSのことです。

簡単な顧客管理機能等がバインドされています。画面をクリックするだけで簡単なアプリケーションを作成することができます。

また

  • apexというjavaに似た言語
  • visualforceというhtmlに似たマークアップ言語*2
  • SOQLというSQLに似たクエリ言語

を組み合わせることで柔軟なアプリケーションの構築が可能です。割と少ない工数で形になるものが出来上がるので、前職のような小さい会社と相性がいいのかなという印象です。

Salesforce社は自社でprogateのようなSalesforceを学べる教育サイトTraiheadを持っており、これの出来が非常に良いです。

COBOL,Javaマイグレーション

COBOLで書かれたシステムをJavaで書き直すという貴重な経験が出来ました。業務分析などはしません。基本的にCOBOLのソースを一行単位で一致するJavaに置き換えます。一応証拠としてJavaのソースに対応するCOBOLコメントアウトして添えていました。こんな感じです。

//PRODUCT-NO     PIC 9(8). 👈これはCOBOLのコード
Integer procctNo;        //👈対応するJavaのコードを書く

デバッグスキル

諸事情により途中で抜けたメンバーが完了できなかったプログラムの完成&テストが自分の担当になりました。

開発チームのツールを全て自作で揃えた有能な方が任されていた大きな機能で、 かつ作った本人も数日間残業しながら調査してバグってる箇所を見つけられなかったので、 そんな状態で納期が迫っていてほぼ新人の自分が完成できるか不安しかありませんでした。

とにかく自分が知っている道具は全て駆使しました。Eclipseの条件付きブレークポイントとか、Watch式とか。 結局、EclEmmaというプラグインを導入してメソッドごとにカバレッジを取りながら、 微妙テストデータを変えながら調査を行ったのが一番効きました。正しい値を出す/出さない時でカバレッジが変わっているメソッドに徹底的にブレイクポイントとWatch式を貼ってデバッグしました。

バグは結局全て見つかりました。

  • ryokin12[1][2]こういう複雑な変数名や[]内のindex
  • if分の大小条件

が微妙に違ったりしているものだった。 見つかった時は創意工夫して結果が出たことが非常に嬉しかったし、納期にも間に合うことができた。でももうCOBOLRPGマイグレーションはやりたくない。

テスト

テストをすることが多かったため 在籍中にテストに関する本を5冊読んだ

知識ゼロから学ぶソフトウェアテスト 【改訂版】

知識ゼロから学ぶソフトウェアテスト 【改訂版】

テスト駆動開発

テスト駆動開発

ソフトウェアテスト293の鉄則

ソフトウェアテスト293の鉄則

レガシーコード改善ガイド (Object Oriented SELECTION)

レガシーコード改善ガイド (Object Oriented SELECTION)

はじめて学ぶソフトウェアのテスト技法

はじめて学ぶソフトウェアのテスト技法

※5冊目は今読んでいます

テストは製品の品質を担保する重要なプロセスだと思っています。 そこが軽視されていたり、いい加減だったりするのよくありません。 今ではテストは知的興奮が大いにある物作りのエキサイティングな分野の一つだと思っています。

テストや品質保証を専門にキャリアを築いている人も社外で何度かあった。 そういう人の生き方は尊敬しているし、決してテスト=雑用では無いと思っています

偉そうなことを行っているが以下は自分もよくわかっていません

  • 複雑な並列処理が絡むテスト
  • 大規模なシステムの負荷テスト
  • テストの自動化のためのテクニック(特にフロントエンド周り)

フロントエンド周りの知識

フロントエンド周りの技術は進歩というか変化が特に激しく、 サーバーサイド側の人間が片手間で追従できるものでは無いと思っています。 だからフロントエンド周りのスキルは時間をかけて基礎からじっくり勉強するつもりはありませんでしたが、 どうしても自分たちが作っているものに納得が行かなかったため何冊か本を読んで勉強しました。

作りながら学ぶ HTML/CSSデザインの教科書

作りながら学ぶ HTML/CSSデザインの教科書

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

※3冊目は見事に途中で挫折していますね

yuyubu.hatenablog.com

フロントエンドエンジニアとして世間一般で通用する自信はありませんが、 フロントエンド技術を利用しているチームの成果物の改善にはかなり貢献できたと思います。

フロントエンド技術(UI/UX)の本質的な難しさは,非技術者のもっとも関心が高くなる部分という点だと思います。 現場によってはカジュアルな仕様変更などが多数発生しました。

ここをしっかり戦い抜いていくには技術以外にも人間工学とか、心理学とかもしっかり抑えて 「なぜそのデザインがBestなのか」を説得できる能力が必要だと思いました。

Javaとかオブジェクト指向とか

大学時代はほとんどJavaを触らなかった。趣味でAndroidアプリの入門書を一通りやったり、大学で1コマそういう授業があっただけだった。

Javaは動かし始めるまでに覚えないといけない概念が多いわりに、それが駆使できるのはもっと経験が必要なので、覚えた概念の恩恵みたいなものはイマイチわからなかった。 結局最初はC言語によくわからないキーワードが大量に引っ付いたプログラムみたいな印象を受けました。

で就職してからはこれを使わなくてはならないと思って、Javaを本格的に学んだ。

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

Effective Java 第3版

Effective Java 第3版

Javaは動かし始めるまでに覚えないといけない概念が多いわりに、それが駆使できるのはもっと経験が必要なので、覚えた概念の恩恵みたいなものはイマイチわからなかった。

大学時代分からなかったこの箇所がわかるような気がしてきた。 だから必死で勉強した。特に後者の2冊はとても勉強になった。 Javaのプロジェクトには数週間しか関われていないけど*3Java及びその関連技術(JVM言語等)を自分の強みにしていきたいという思いがあります。

正規表現

業務で正規表現エンジンを作ったという話ではありません。*4

事務作業が8割くらいの現場に行ったとき、雑務にひたすら正規表現を使って進めることで退屈をしのいでいました。

きちんと本で勉強して覚えたわけではないけど、1ヶ月程度毎日ググりながら正規表現を書いていたので、機械的に行えば良いだけのテキスト変換、置換などは、加工対象の文字を大体見ただけでどういう正規表現を書けば良いか思いつくし、ほとんど空で書ける。

正規表現完全に理解した!と思って調子に乗ってネットにいい加減なこと書きまくって、ある日ruby正規表現エンジン(Onigmo)を作ってる人から訂正コメントが飛んできて、自分は何も理解できてない、と自信を失ったりしたこともありました。

qiita.com

位置指定子っていう概念が微妙に理解できていないこと以外はだいたい実践的な部分では困らなくなった。あと計算量とかパフォーマンスの理解が不十分。

大学のころ、正規言語とかオートマトンの授業を取っていたので、この辺はきちんと勉強したいですね。

SQL&RDBMS

開発がやりたかったけど、結局規模の大きい保守案件に配属になった。データはたくさんあったので*5SQLRDBを勉強すると自分にも会社にも+になるだろうなと思い、勉強し始めた。

ある日バグの影響範囲を調査するため、再帰クエリが適応できそうな調査案件があった。 他のメンバーはお手上げだったが、急いで技術調査をして調査のクエリを作った。その時復習した内容は以下の記事にまとめてあります

qiita.com

こういう風にやればできますよと提案して、結局自分が担当になってそのデータを調査、修正するクエリを書いた。 あの時は純粋に学んできたことが活きた数少ない瞬間だった。自分にも会社にも+になったと思う。

RDBは色々書きたいことがあるけどそれはまた別エントリで。自分が特に時間を投資したスキルの一つです。

Excel VBAや自作スクリプトによる調査の効率化

大規模なシステムだったので、目grepが厳しいのでExcel VBAJavaScriptを使って効率的に調査をするツールを作成しました

VB.NETのクラスを調査するファイルを作っていて、

https://teratail.com/questions/118863

vbのこんな仕様に悩んだりしていました。

プログラムの解析を正規表現でゴリゴリ書いていましたが限界を感じました

http://leoclock.blogspot.com/2009/01/blog-post_27.html

仕事関係ないけどこの経験から少し言語処理系とかに興味を持つようになりました

セキュリティ

詳しくは書きませんが、システムのセキュリティ強化のため個人的に勉強していました。

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

色々指摘することができましたが、進捗にはマイナスでしかなかったので、迷惑だったかなと思います。

会社へのSlack導入

レスポンスの悪いメールでのコミュニケーションが嫌で、チャットツールを導入しました。chatworkがすでに使われていましたが、色々使い勝手が悪かったのでSlackを自分で調べて検証して導入しました。 最初は同僚、上司という順でどんどん広めて行って最終的にはチームリーダーまで使ってもらえるようになった。 最近上司がさらに上に提案して課全体で使うようになった。確か課が2つしかなかったので多分来年には全社的に普及してると思います。

これから中小企業で導入して見たいけど、使い方が良く分からない。。。という人は最近は技術コミュニティでもSlackを積極的に使っているので、 そちらに参加して慣れながら活用方法を学んでいけば良いと思います。

私ができなかったこと、足りなかったこと

自社/協力会社の有志で勉強会

どうしても業務で経験できることには限界があるので、エンジニアには業務以外での技術研鑽が必要だと思います。 SESというのは客先の稼働時間が大事なので基本的に就業時間内に勉強はできませんが、 もっと仕事で使っている技術やフレームワークについて、特に新人を含めた勉強会などができたらよかったと今になって思います。

ちなみに仲良くなったパートナー会社の社員さんには技術書を貸したり、JavaScriptの基本を教えたりしていた。

コミュニケーション

私はお酒が飲めないこともあって、非常に人付き合いが悪かった。別に飲み会を欠席したことで非難されるようなことは1度くらいしかなかったけど、 そういう所で信頼関係が結べていなかった所でスムーズに物事が運ばなかった面はあったと思う。

またあまり失礼とか気にせず思ったことを口にするタイプだったので、色々勉強して見ました。

yuyubu.hatenablog.com

まだまだ未熟者ですが日々修行中です

今後

働く前は開発こそ至高みたいな考え方があったけど、自宅学習でそれなりにスキルを高めて、問題解決ができれば保守/調査/テストも面白いと思いました。 でも開発をあまりやらせてもらえなかったので開発をしたい思いが強いです

今後は以下の業務に関わってみたいです

  • Java関連技術を使ったWEBサービスの構築、運用、保守
  • DBA
  • データベースに関連する開発

最後になりましたが、前職では社長、前社長、前前社長をはじめ、様々な方々のお世話になりました。 本当にありがとうございました。

*1:もちろん会社が悪いのではなく、私の能力不足。こういう環境でもうまくできる人はいると思う

*2:今はLightning Componentという技術が使われているそうですが、過渡期に抜けたので最近の事情は知りません

*3:COBOLマイグレーション案件を除く

*4:正規表現エンジンは作ってみたい。

*5:記憶が曖昧だが1億レコードのテーブルもあった