Java のプログラミングでつまづいたこと(初学者のとき)

satoru-takeuchi.hatenablog.com mizchi.hatenablog.com

このあたりを読んで自分も書いてみようと思った、ので書きます。これらの記事がバズってからずいぶん経ってしまったけれど……。けっこうな文量になりそうだったので、まずは Java の初学者のときにつまづいたことを書こうと思います。

whoami

2014 年に大学を卒業し、そこからソフトウェア開発業に携わって 6年目になります。小中高とプログラミング経験はなく、大学は文系学部卒だったので、初めてプログラミングを本格的に学んだのは、新卒で入る会社の入社前研修のときです。

プログラミング学びはじめの頃は、Oracle を中心とした SQL・データベースの学習、 Java の学習。その後、OJT によるプロジェクト参画 (Spring Framework などを使用)をしていました。

初学者のころにつまづいたこと

とにかく用語がわからない

インスタンス」「プロセス」など、当時はどれもあまり聞いたことのない言葉。最初はまったくイメージが湧かず、調べてもなかなかしっくり来ませんでした。いまとなってはもうすっかりお馴染みなんですけどね。

なんとか検索して調べて、卑近な例でたとえを挙げてくれているようなサイトを見つけて、イメージを掴んでいきました。たとえば以下のようなサイトですね。

Oracle Database | 技術ブログ| レック・テクノロジー・コンサルティング株式会社

いま見ると、正直「なんじゃこりゃ」という感じなのですが、右も左もわからない当時の自分は、ノートやペンのたとえに大変助けられました。

自分の学習していることが何に役立つかイメージできない

Java を学びたてのころ、簡単な条件分岐や標準入出力の仕方などを習って、コンソール上で動くプログラムを書いていたのですが、黒地の画面に白の文字で「Hello World」などと表示されることにどれだけの意味があり、この先の仕事の何に結びついて、どう役立つのか、がなかなかイメージできませんでした。

なんとなくですが、こういう思いをしている初学者の人って多いんじゃないでしょうか。

いま思えば、実際に現場で仕事をしている先輩に、「この勉強が現場でどう役立つんですか?」と質問してみたら良かったのかもしれません。もし、いまの私が当時の自分に教えるなら、「サーバやデータベースがどのように関わって、日頃自分たちの使っているサイトが表示されているか」というようなところを説明して、その中で Java (サーバ側プログラム) のやっていることを教えるかな、と思います。

「クラスの継承」や「インターフェースの実装」がまるきり理解できない

これは衝撃すぎて忘れもしないのですが、当時使っていた参考書には class Car class SuperCar extends Car という例が出ていました。正直、まったく意味がわかりません。「スーパーカー」が「車」を「継承」??? 「継承」というのはどういう意味だろうか。技術の継承、などならわかるけれど、「車の継承」とは。

どうにもわからないので、他の参考文献をあたってみると、今度は「いるかクラス」「いぬクラス」「哺乳類インターフェース」などと書いてある。「いるかといぬが哺乳類なのは知っているけれど、それのいったい何がプログラムに関係あるの???」という感じ。

いま思うと、処理に関係するようなたとえが出てこなかったせいで、理解がなかなか進まなかったのだと思います。ソフトウェア開発歴 6年になっても「哺乳類インターフェース」なんて作ったことないもん。

その後、研修の補講で「Java でポーカーのゲームを作る」という課題があり、先輩エンジニアが良いお手本のソースコードを見せてくれたおかげで、「なるほどこういう意義があるのか!」という気づきを得ました。

実際のところ題材は何でも良かったのですが、プログラミングにどう活きるか、を誰か早く教えてくれたら良かったのに、といまも思います。

どうやって克服したか

仲間の存在が大きかった

私の場合、会社の新人研修でプログラミングを学んでいたので、同じくらいの学習レベルから学習を進めた同期の存在 (だいたい 20人くらい居た) 、また、そんな私たちに親身になって教えてくれた研修講師や先輩の存在が、何より大きかったと思います。

「戻り値と引数ってどっちがどっち?」「オブジェクトとかマジで意味わかんねー」「研修ダルいわ〜」など (?!) 、わからないことを「わからない」と素直に言い、教えてもらえる環境があったことで、しっかりと地力を育むことができたと感じています。

会社以外でも、 Twitter のフォロワーの方にはかなりお世話になっていました。 Oracle Master Bronze 11g の勉強で苦しんでいたときには、 Platinium 資格持ちのフォロワーさんが教えてくれたこともありました (恐れ多い) 。私自身エンジニアとしての実力ははまだまだなのですが、いろいろな方に助けていただいてここまで来たのだな〜という感じがします。


そんなところです。なにか学びはじめの人の励みになればと思います。

また気が向いたら、最近学んでいる TypeScript 編を書きます(また学びはじめて数ヶ月ですが、これもなんだかんだで書くことがたくさんある)。

新しい Mac に入れたもの一覧 (2019 冬)

新しい Mac を手に入れたときにやったことをまとめました

dotfiles などで済む分については dotfiles に入れているのですが、それでも手作業でやることって意外とありますね。開発周りでやったことをまとめてみました。


zshbrewから入れてログインシェルに設定する

bashからzshに移行したときのメモ - Qiita

最近はなんとなく bash より zsh 派です。前職で暇なときにこっそり乗り換えた記憶があります。 .zshrc も dotfiles で管理しなきゃなーと思いながら、なんだかんだで半年くらい経っている気がしますね……。なんとかしなければ。

fzfを入れる(リポジトリをcloneしてinstall叩きました)

fzfを使おう - Qiita

fzf は Ctrl+R のヒストリー検索で使って以降離れられなくなりました。ヒストリー検索以外でも今後は使いこなしていきたいところです。

colorオンでlsした時にディレクトリが青なのが見にくいので、シアンに変更

ls の結果に色をつける - ねもぷらす

タイトルそのままです。これは本来 .zshrc に入れるべきところですね。

markdownをデフォルトでエキスパンドする

vimの折りたたみ設定

vimmarkdown を開いたときに、折りたたみが入ってしまうのが嫌だったので、デフォルトでエキスパンドする設定を入れました。これも本来 .vimrc に入れるべきところですね。


変更入るたびに dotifles コミットしてしてないのがいけないんですよね。とりあえず今回の分はちゃんとあとでコミットします。

はじめてのふるさと納税!

今日は技術的な内容ではありません!!! 今年、はじめてふるさと納税をおこなったので、そのレポートです。Wowma! ふるさと納税というサイトを使って3自治体に寄附をしました。

寄附した自治体と返礼品

北海道千歳市

返礼品

ルタオ3種のアソートセット

URL

https://furusato.wowma.jp/products/detail.php?product_id=25030

感想

3種合わせると結構なボリュームがあり、かなりお得感があります。ロイヤルクロワッサンリングは3月まで、他の2品は6月まで冷凍保存がきくので、日持ちも安心。

宮城県蔵王町

返礼品

特選厚切り8mm塩牛タン600g国産南蛮味噌100g付)

URL

https://furusato.wowma.jp/products/detail.php?product_id=11542

感想

厚切りの牛たんが200g×3パック届きます。フライパンで弱火でじっくり焼くと、お店で食べるようなブリンブリンの歯ごたえの牛たんが楽しめます。強めの塩味でビールに合う!

和歌山県湯浅町

返礼品

白浜富田の水使用の地ビール「ナギサビール」3種6本セット

URL

https://furusato.wowma.jp/products/detail.php?product_id=20686

感想

個性の違うビールが3種類。複数自治体への寄附を考えている酒飲み勢の方は、地ビール+おつまみの組み合わせで寄附先を考えてみるのも楽しいかもしれません。私はペールエールと牛たんで最高になってしまいました。

あと、冷蔵便で冷えたビールが届いたのがビックリでした。(てっきり通常の宅配便で届くものかと思っていた)

手続き周り

私は「ワンストップ特例制度」というものを利用し手続きを行いました。ふるさと納税に関わる制度がまだよくわからない、という方もまだ多いかと思いますが、思ったよりずーっと簡単だったので、気になる方は来年、ぜひチャレンジしてみてほしいです!

ワンストップ特例を利用した申請手順をかんたんにまとめると、以下の通りです。

1) ふるさと納税サイトで寄附先を選ぶ

文字通り「ふるさと」に寄附する、返礼品の割の良いところに寄付する、ふるさとではないが所縁のある土地に寄付する……など選び方はまちまちですね。

2) 寄附の申し込みフローの中で、「ワンストップ特例を利用する」というようなチェックボックスがあるので、そこにチェックを入れた上で、申し込みを完了させる

寄附の申し込み、というとなんだか難しそうですが、たいていの場合はショッピングサイトと変わらないUIとなっているので、普段ネットショッピングをする方であれば問題なく申し込み完了できると思います。

3) 寄附先の自治体からワンストップ特例申請書類が届くので、申請書類に必要事項の記入と本人確認書類のコピーをして自治体に返送する

氏名・住所のほか、マイナンバーの記入も必要となります。自治体によっては、申請書類とともに返送用の封筒を入れてくれるところもあります。

複数自治体に寄附する場合は、1~3の手順を、寄附先の自治体にたいしてそれぞれおこないます。(今回私は3自治体に寄附をしたので、3枚申請書の記入と返送をしました。) これらの申請をすることで、確定申告をおこなうことなく、翌年の住民税からの控除が受けられます。

注意点

年収や家族構成により控除可能な額が変わる

サイトで、控除上限額を知ることのできるページが用意されている場合があるので、そういったものを活用して控除上限額を計算しておくと良いです。Wowma! ふるさと納税だと以下のページにありました。

https://furusato.wowma.jp/guide/easy_step.php

ワンストップ特例制度の対象外となる条件がある

以下の場合が特例の対象外となっていました。該当される場合は注意が必要ですね。

  • 6自治体以上にたいして寄附をおこなう場合
  • 確定申告をおこなう場合

いかがだったでしょうか? めちゃくちゃWowma! ふるさと納税ダイレクトマーケティング記事になってしまったのですが……笑 気になった方はぜひ来年、ふるさと納税にチャレンジしてみてください!

RDS(Aurora)で文字コード設定をutf8mb4にする

RDS(Aurora)にあるデータベースの文字コードを、utf8からutf8mb4へ変更したので、そのときに学んだことや手順のメモです。以下の手順をおこないます。

  • RDSの設定をutf8mb4にする
  • クライアント側(今回はSpring Bootのアプリケーション)の設定を行う

RDSの設定

RDSのパラメータグループの設定を行います。以下の設定を、クラスターのパラメータグループにたいして入れればOK。

character_set_client:utf8mb4
character_set_connection:utf8mb4
character_set_database:utf8mb4
character_set_results:utf8mb4
character_set_server:utf8mb4

検索していると、indexを張ろうとしたときに問題があるからファイルフォーマットをBarracudaにする、など他の設定の情報も出てくるのですが、MySQL5.7.9以降では問題にならないようです(ファイルフォーマットがデフォルトでBarracudaになるため)。以下リンク先のページにわかりやすくまとまっています。

参考

パラメータグループの設定ができたら、クライアントから確認してみましょう。

mysql> show variables like "chara%";
+--------------------------+-------------------------------------------------+
| Variable_name            | Value                                           |
+--------------------------+-------------------------------------------------+
| character_set_client     | utf8                                            |
| character_set_connection | utf8                                            |
| character_set_database   | utf8mb4                                         |
| character_set_filesystem | binary                                          |
| character_set_results    | utf8                                            |
| character_set_server     | utf8mb4                                         |
| character_set_system     | utf8                                            |
| character_sets_dir       | /xxxxxxx/xxxxxxx/share/charsets/ |
+--------------------------+-------------------------------------------------+
8 rows in set (0.00 sec)

character_set_client, character_set_connection, character_set_results の値はクライアント側の設定によるので、一旦気にしなくて大丈夫です。また、character_set_system は、システムで使用する文字コードで変更はできないため、utf8のままで問題ありません。

クライアント(Spring Bootアプリケーション) の設定

Connector/Jの公式ドキュメントを見ながら進めていきます。

雑な翻訳ですが、以下のような感じでしょうか……。


  1. サーバー設定を character_set_server=utf8mb4 にする
  2. characterEncoding と connectionCollation を接続文字列から除外する

これらの手順を行うことで、Connector/JがUTF-8の設定を自動検出して使用できる


また、Connector/J のバージョンによっても挙動が異なる部分があるようなので、念のためドキュメントの続きの部分も確認しておきましょう。


Connector/J 5.1.46 以前のバージョンを使用している場合

utf8mb4を使うには、サーバーは必ず character_set_server=utf8mb4; で設定されていなければいけない その設定がされていなく、characterEncodingUTF-8 が指定された場合、MySQLの接続には utf8 が設定される(utf8mb3エイリアス)

Connector/J 5.1.47 以降のバージョンを使用している場合

characterEncodingUTF-8 が指定された場合、utf8mb4 を意味する


characterEncodingに同じ値が設定されていても、バージョンにより解釈が異なるのですね。

私が使用していたConnector/Jはバージョン5.1.47以降だったので、設定としては、以下のように入れておけば大丈夫そうでした。

spring.datasource.url=jdbc:mysql://xxxxxx.xxxxxx.ap-northeast-1.rds.amazonaws.com:3306/db_name?characterEncoding=utf8

今回のブログは以上です!細かいところで地味にハマったのでどなたかのお役に立てば幸いです!

参考

技術書典5サークル参加しました!

技術書典5お疲れ様でした!

技術書典5に参加のみなさま、お疲れ様でした! 台風も心配されていましたが、なんとかお天気も保ってよかったですね。しかし晴れたとはいっても、サークルとして出展された方、一般参加の方、そしてスタッフの方、みなさまにとってかなり大変な一日だったと思います。本当にお疲れ様でした。

そして弊サークル「Shin・Do・meeee」の「IT井戸端会議 Vol.1」をお買い上げいただいた方、本当にありがとうございました。自分たちの作った本が会場にいらした方の興味に触れ、人の手に渡っていると思うと、なんだかとても嬉しい気持ちになります。サークル参加決定時のブログをご覧いただけるとわかる通り、「ノリと勢い」成分多めではじまったサークルでしたが、無事に本を出すことができて良かったです。

「IT井戸端会議 Vol.1」を読み終わった方は、よろしければ是非本の感想をお送りください(TwitterのReplyでもDMでも結構です)。次回以降の参考にします。

……エモい気持ちが残っているうちに、思ったことを振り返って少し書いてみたいと思います。文章ではとてもまとめきらなかったので箇条書きです。

アウトプットのハードルは低めに

  • やらない言い訳を考えるより、とりあえず一歩踏み出してみる、というのは大切
    • 行動にあたってはわりと腰が重いタイプなので、今回「本を出す」という経験ができたのは大きかった
    • 何にしても「やってみないとわからないこと」というのは結構ある
  • はじめに完璧なものを作ろうとしない
    • アプリケーションのでデプロイにも通じるところがあるかもしれない……

「(元)同僚と本を作る」こと

  • 仕事を進める上でのスタンスがなんとなくわかっているので、進めやすくてよかった
    • チームの活動推進とかは @UltraBirdTech が好き
    • CI周りは @igara がやってくれた
    • 私はもっぱら宴会部長をやっていて、会議終わったあとの宴会の店決めを頑張った
      • 頑張りとは
      • ほら、ぼったくりの変な店を引くと、その日の気分が台無しになっちゃうから……
      • もちろん執筆も頑張りました
  • 退職後も「仲間」感を持って、集まったり一緒にいろいろ進めたりできるのはありがたい
    • 仕事と趣味のサークル活動の中間のような雰囲気
    • サークルメンバー外の元同僚で、本を購入しにイベントに来てくれた人もいた

次回以降について(サークルとしてというよりは、個人的に)

  • ハニーポット本の供給が需要に追いついていない感があったので、今後も継続して出したい
  • リクガメ飼育本に触発されたので、Python(生き物)の飼育×ITで何かやりたい
  • 本業はJavaエンジニアなので、Java関連で何か書けるネタを探したい

買った本について

買った本もずいぶんあるので、そちらは読み進み次第、順次感想をブログにアップしていきたいと思っています。ひとまずこの記事ではタイトル出しだけしておきます。素敵な本を作ってくださったサークルのみなさまに感謝してもしきれません!!!

  • リクガメ監視システムの作り方 - MZ工房
  • Microservices Architecture
  • iOSアプリ開発 UI実装であると嬉しいレレシピブック - Just1factory
  • Android Widget開発のすすめ - futabooo
  • WebShell図譜 - morihi-soc
  • ハニーポットと学ぶ侵入検知システム - morihi-soc
  • イチョウ・ジャーニー - Growthfaction

しかしこう並べて見ると、IoT/システムアーキテクチャ/ネイティブアプリ/セキュリティ/成長 と見事に分野がバラバラですね。私はどこへ向かっているのでしょうか。まあこれからもあっちこっちサーバーサイドエンジニアとして頑張っていこうと思います。

技術書典5(2018/10/8開催)で合同誌を出します!

本が出ます!!!

技術書典5向けの新刊(合同誌)を入稿しました! つつがなく印刷製本が済めば、2018/10/8 の技術書典でかんずさんの初めての本が出ます。表紙と目次はこちらです。

f:id:k-anz:20180921222920p:plain

ひとりが1章を担当する形で、4人で1冊を書き上げました。私は「攻撃のしんどみを肌で感じる - ハニーポット入門 -」の章を担当しました。セキュリティを本業としない方向けの、趣味としてのハニーポット運用について描いたつもりです。

表紙絵は @mokimoki14 が描いてくれました。感謝感謝。

ちなみに裏表紙に入れているロゴの漢字は造漢字で、 @mokimoki14 が 「辛」と「新」の字を掛け合わせて作ってくれました。サークル名がしんどみ(辛み)と、新 Do me(新しいことやろうぜ)のダブルミーニングであることによるものです。

サークル名「Shin・Do・Meeee」のeが4つなのは執筆メンバーが4人だからです。今後、メンバーの増減に応じてeが増えたり減ったりするかは不明です。

ぜひ技術書典5にお越しください! 私たちのスペースは「か24」です。当日、スペースでお待ちしてます。

techbookfest.org

技術書典5(2018/10/8開催)にサークル参加します

タイトルの通り。です。

技術書典4に参加したときに意気投合した元同僚たち(新卒で同じ会社に入った同士なのですが、いまとなっては皆違う会社で働いています。苦笑)と、サークル参加の申し込みをして、当選しました。技術書典4のレポートは以下参照。

k-anz.hatenablog.com

もともとそれなりにオタクをやっていたので、同人誌即売会にはコミックマーケット含め過去何度か行っていたのですが、その頃には、まさか自分がサークルとして出展する側になるとは、そしてまさか参加する即売会のジャンルが技術書だとは、夢にも思っていませんでした。

正直、いろいろと未知数な部分も多いのですが、なんとか頑張ります。応援してください。