Corona@はてな

人生,黒歴史

初めてチームで開発した感想(2年くらい前の下書き)

色々あって生まれて初めてチーム(4人)で開発したのでその感想をば. あんまりきっちりまとまっているわけではないけれども,風化しない内に.公開忘れてて2年経ってた

概要

何をした?

既存DBのデータと,センサデータを扱ってデータを表示するWebサービス開発(演習) サービス内容を元に基本設計〜開発まで全て行うことになった.

メンバーの内訳は?

メンバの内2名(僕含む)が学生の頃に趣味で開発経験あり. その他2名はC言語のプログラミングを授業で触った程度.

開発期間は?

2週間

開発環境は?

インターネットのない空間

取り敢えず,環境的には以下のことを速攻で行った.

各自のPCが有ったので,そこに仮想環境を構築し, それぞれ統一した環境下で開発を行った.

結果は?

実はまだ開発中...まあ何とか間に合いそう.

なんとか間に合ったらしい.

難しかったこと

メンバのスキル差

一番つらかった.特にプログラミングをやっていたかどうかで いちいち専門用語を解説しなければならないのが大変だった.

例えば,「JSONを返すAPIを作ろう」なんて言っても通じない. だから一つ一つ説明をしていく必要があった.

一方で,専門用語を解説している内に,自分でも理解や考えが 浅かった部分も見えてきて勉強にはなった. 「(経験的に)当然こういう設計になるよね」ということを思いもよらぬ角度から 指摘されて,よくよく考えてみると無駄が多かったりした.

最後らへんには根気強く解説やフォローを行ったことで 他の二名についても自分だけで簡単な実装であればできるようになった.

面倒とか思わずに,相手が納得するまで教えた方が 最終的にはお互いのためになると感じた.

情報の共有

今回の開発では,自分たちで考えたアイデアを元にシステムを構築した. 当然,ほぼ素人がシステムを構築するので,その過程では仕様変更が多々生じた. それはある程度仕方がないとして,問題なのはそれが全員に共有できていなかったことだった.

特に僕があまり情報発信をしなかったがために,自分でも気づかない内に 仕様を変えてしまっていたり,実装が間違っていたりすることがあった. こういうことになると,相手も稼働が増えるし,面倒だしイライラする.

問題解決の策は2つ行った.

一つ,朝の情報共有を必ず行うようにした.システム構成図をホワイトボードに書いて, 「今日中に○○の画面が表示されるようにします」「△△と××のシステム間の通信で悩んでいます」 といった風に行うこと,困っていること等を共有した. 実装内容までは触れなくても,「ああ,Aさんはココの実装をするんだな」「ココが困っているんだな」 ということさえ抑えられれば,後は関係者間で話ができるし, 後で決定した情報を共有するときにも,全員が前提が分かっているということになってスムーズに事が進んだ.

二つ,決まったことはなるべく情報として誰でも見られるところに明文化しておいた. 形式はGit,Wiki,PPT等.Wikiにはサーバ・クライアント間の通信データ形式(JSON)を主に, PPTにはシステム構成図や考えたこと,アイデアなどを書いた. (今思うと,PPTにはその設計に至った経緯についても書いておくべきだった)

こうすることで,一度決まったことをもう一度話し合わなくても良くなり, 仕様を見やすい形式で参照しながらコードを書けるようになった. Git,Wikiについては最終的に全員が利用し,仕様変更などもGitにコミット・プッシュ, さらにWikiを変更して伝えるというサイクルができた. 「Wikiのどこどこを見て」といった風に共通の言語で話すことができるようにもなった.

(納期,スキルを超えた)システムの肥大化

自分たちで考えたアイデアはなるべくそのまま形にしたい. そういった思いから当初から多くの機能をシステムに持たせた設計を行った. 結果,納期ギリギリまで開発を行うことになり,十分なテスト時間を 確保することができなくなってしまった.

今回のケースでは,認証用・Webサービス用・データ用等で複数の アプリケーションサーバを構築し,更にサービスに必要そうなデータも 滅茶苦茶たくさん想定して設計をした.けれども,結局使われないものが多かった上に, 実際のサービスでは逆に不足しているという帯に短しなんとやらな状態になってしまった. あと,サービスが実際に動くのも,最後の最後になってから,という状態になってしまった.

やはり,初めの設計はなるべく機能をそぎ落として, 最小限,何があればサービスとして成立するかを考えるべきだったと思う.

サービス構築時は初めから大規模なDBやシステムをたくさん作るのではなく, なるべく少ないデータ種別,なるべく少ないシステムを作ってしまう. そこに後々APIを外部化するなどで徐々に汎用性や再利用性を高める. こうした方法であれば動くものを見て,それに機能追加をしていけるので, マイルストーンも立てやすいし,サービスとしてのブラッシュアップもしやすかったと感じる. ミニマムスタート大事.

技術的なこと

ここはそんなに難しくなかった.(そんなに難しいことをしなかった) 使った要素としてはESXi,Rails,BLE,HTML,Websocket程度なので 数年前に出たやや枯れている技術ばかりだった.

ただ,開発環境がインターネットに接続できない環境であったために RubyGemsにアクセスできなかったり,Webのコードをコピペ出来なかったりした. RubyGemsについてはgem local mirrorを用いてローカルにリポジトリを用意した結果, ほぼストレス無く開発出来る環境が整った.

最後に

今回の反省や教訓は概ね先人たちも開発をする上で同じように感じ, そして克服してきたことであると思っている.

そういった教養をもう少し身につけていたのであれば, チームのみんなでもっと楽しく,もっと良い物を作れたはずだった. 技術的にも,人間的にもまだまだ勉強が足りていなかった. 悔しさや反省をバネに,次回はもっと上手くしてやろうと思う.

LPIC勉強 4日目

三日坊主復活.

目標も大幅に遅れまくっております.(まだLevel1取れていない)

電気通信主任が差し迫っているので,そっちを軸に7月位でのLPIC取得か...orz

最近はAndroidアプリの方で勉強をしていたのでそちらの復習を.


ファイルシステム

ext2

ext3

ext4

ReiserFS

  • ID値:83
  • B+Tree
  • extと互換性なし

ファイルシステム系コマンド

df:マウント状況

mke2fsファイルシステム作成

fdiskパーティション設定,確認

du:ファイルやディレクトリのディスク使用量確認

fsckファイルシステムチェック

debugfsファイルシステム閲覧・変更(対話型)

tune2fs, dumpe2fsファイルシステム情報確認

mount-rでリードオンリー,-wで読み書き可能,-oでfstab指定でマウント

マウント状況はmountコマンドや/etc/mtab/proc/mountsを見ればわかる

ディスククォータ

i-node

ファイル権限・グループ等は割愛

広島でキャンプしてきた(3泊4日)

広島の二川キャンプ場でキャンプをしてきた.

目的

  • 自然の中で美味い飯と美味い空気を食らう
  • 山に登り,体力をつける
  • 今後の山での幕営に備え,必要な装備・技量等の確認
  • 不便を楽しむ

やったこと

1日目☀

  • 12:00:レンタカー借りて荷物を積んで移動
  • 14:00:道の駅でパン等購入
  • 15:00:現地到着,テント設営
  • 16:00:夕食の準備
  • 17:00:夕食(バーベキュー)
  • 19:00:片付け
  • 20:00:就寝

2日目☂

  • 7:00:起床
  • 8:00:朝食(りんご等)
  • 9:00:二度寝
  • 11:00:温泉へ出発
  • 14:00:温泉から出発
  • 15:00:テントサイトへ帰還,遅い昼飯(うな丼)
  • 17:00:夕食の準備
  • 18:00:夕食(バーベキュー)
  • 20:00:片付け
  • 21:00:テント浸水
  • 22:00:車へ荷物退避
  • 23:00:車内で就寝

3日目☁/☀

  • 9:00:起床
  • 10:00:温泉へ出発
  • 13:00:温泉近くで昼食(山菜そば)
  • 14:00:温泉近くの山に登る
  • 15:00:登頂.下山後に山菜を入手
  • 16:30:テントサイトへ帰還.テントを干す
  • 17:00:夕食の準備
  • 19:00:夕食(炊き込みご飯)
  • 21:00:片付け
  • 22:00:就寝

4日目☀

  • 8:00:起床
  • 9:00:テントの虫干しなど撤収準備開始
  • 11:00:温泉へ出発
  • 13:00:温泉から帰還
  • 13:30:昼食(ラーメン)
  • 14:30:キャンプ場から撤収準備完了
  • 15:00:撤収

成果

  • 虫が多すぎて辛い.テント設営は素早くしないと羽音でイライラしてくる.蚊取り線香を大量に焚くと良い
  • キャンプの場合,火があったほうが趣がある.ガロン缶と薪があると良い
  • 飯は米とか肉とかは持って行って,野菜は現地調達が良い.ただ,人参とか根菜系は持って行っても良いかも
  • 山菜とかが取れるかもしれないので,無洗米ではない米を持っていく(とぎ汁で灰汁が抜ける)
  • 酒は忘れない.無くなったらすぐに買う.無いと悲しい
  • 夜は思った以上に暗いし冷える.焚き火をしたり,ランタンを多めに持っていく方が安心できる
  • 雨天時のことを考え,フットプリントは必ずテントの底面より小さくしておく(でないと浸水する)
  • 熊出没注意とか書いてるところで寝ない(怖い)
  • 意識的にスマホを触らないようにしていたので,ほぼ写真も取らなかった.やっぱりカメラはある方が良い

総括

楽しかったです

LPIC勉強 2-3日目

2日目:第1章システムアーキテクチャ

コマンドでシステムの状態を取得する系の問題.

サーバを適当に管理してきた自分には知らないファイル名やコマンドが多い.

ついでにKernelが2.4, 2.6系が対象っぽくて,3.x系とはちょくちょく差異がある.

(※これは今後の章でも同じなので,意識しておく)

以下,備考録

ディレクトリ

Linuxの各ディレクトリ毎の意味・役割について

コマンド・ファイル

/proc/interrupts:デバイスが利用しているIRQの情報

/proc/dma:dma情報

/proc/cmdlineカーネル起動時のオプション設定

modprobe:モジュールロード・アンロード

/etc/modprobe.conf:起動時カーネルモジュールロード設定ファイル(2.6系)

/var/log/message:一般的なシステム動作に関するログ

ランレベルLinuxの動作モードの設定.0-6の整数.内容は以下の通り.

  • 0:システム停止
  • 1:シングルユーザーモード
  • 2:マルチユーザーモード(テキストログイン・NFSサーバ停止)
  • 3:マルチユーザーモード(テキストログイン)
  • 4:未使用
  • 5:マルチユーザーモード(GUIログイン)
  • 6:システムの再起動

telinitinitコマンドで設定.runlevelコマンドで確認.システム起動時の設定等は/etc/inittabに記述されている.

/etc/rc.d/[ランレベル].dにはそれぞれのランレベルで起動した際に実行されるスクリプトのリンクを置く.(これまでどういう意味か知らずに使っていたが,納得した)

最近は起動時に従来のSysVinitプロセスではなく,Upstartsystemdという新しいinitプロセスを使っているらしい.CentOS 7.0ではsystemdが使われているようだ.

3日目:第2章Linuxのインストールとパッケージ管理

Linuxのインストール時の適切なパーティションの設定や,rpm・apt・yumと言ったパッケージ管理ソフトのオプション等.

以下,備考録.

インストール

Linuxのインストールには最低でもルートとスワップ領域が必要.

/:色々入ってる(先述フォルダ構成参照).容量を多くとっておく

/tmp:RAMと同じか,倍程度の容量をとっておく

/boot:多くても100MB程度

GRUB

1系

/sbin/grub-install:インストール

/boot/grub/menu.lst:設定ファイル

設定反映時コマンドは不要

1番目のパーティションは0からカウント

2系

/sbin/grub-install:インストール

/boot/grub/grub.cfg/etc/default/grub/etc/grub.d以下:設定ファイル

/usr/sbin/update-grub:設定反映時コマンド

1番目のパーティションは0からカウント

共通ライブラリ

ldd:実行ファイルが必要としている共有ライブラリを表示

/etc/ld.so.conf:共有ライブラリのパス設定等.編集後はldconfigコマンドで反映

LD_LIBRARY_PATH:共有ライブラリを検索対象に関する環境変数

dpkgdebパッケージのインストール・アンインストールを行う

rpmRPMパッケージをインストール/アンインストールする

パッケージ管理に関するコマンドについては,そのオプションについて細かく聞かれるので,実際にコマンドを使いつつ,慣れておく.

LPIC勉強 1日目

背景

先輩からのお誘いで「5月初旬にLPIC level2まで取るぞ!!」勢に組み込まれたので勉強する.

まぁlevel2でなくてもぼちぼちlevel1は取りたいので勉強をする.

目的

LPIC level2を取って先輩にドヤ顔すること( ・´ー・`)

目標

理想:5月初旬(10日前後)でのLPIC level2取得

妥協点:同日程でlevel1取得.6月中にlevel2取得.

参考書

取り敢えず黒本

徹底攻略 LPI問題集 Level1 [Version 3.5]対応 (ITプロ/ITエンジニアのための徹底攻略)

必要に応じてスピードマスターも使う予定

Linux教科書 LPIC レベル1 スピードマスター問題集

環境

Virtual Box上でCentOSを動作させて勉強.


一日目

  • 参考書購入
  • 環境構築
    • Virtual Boxとvagrantアップデートした
    • CentOSを導入した

釣りに行った

釣りが好きな父親と釣りに行った.

最近,なかなか上手く物事が回らず,辛い思いをしていたので, 気分を一新する意味でも経験の無いことを始めようと考えた.

父親の釣りは磯でのフカセ釣り(参考)で,重りも少なく,仕掛けも浮きと針程度の非常に簡素なものだ.

撒き餌で魚を集めて,そこに仕掛けを投げ入れる.そこに魚が来たところを釣る.それだけ. それだけにどのようにして魚を集めて,そして釣り上げるかの過程を考えることが重要だった.

釣り始めは魚も警戒心が薄く,適当に投げたらいきなり掛かったりもしたのだけれど, 徐々に警戒心が出てきたり,日が高くなって活動が鈍ったりしてくる.

そうなった時に,どこの潮が動いているか,撒き餌がどこに集まっているかを考え, 魚の動きを予想しながら重りや浮きの位置を変えたりして,何とか釣れるようにする.

潮の流れ(環境)という広い視野と,手元や仕掛けという狭い視野の両方から状況を確認し, 戦略を考えるというのはとても神経を使うことだったのだけれど, それだけに自分の戦略がバッチリあって魚がかかった瞬間は嬉しいものがあった.

釣果としては,15cm程のグレを3匹程度(リリース)と,30cm程のグレを釣る事ができた.

さっき刺し身にして貰って食ったら,最高に幸せな気分になった.

今回は父親に仕掛けや釣り方を教えて貰いながらの釣りだったので, 次回はそれらも自分でやって,でかい魚を釣って食べたいと思う.

f:id:Mekapiku:20150321182521j:plain

GsonでJsonのフィールド命名規則を変更する

GsonでJavaのオブジェクトをJsonに変換する際,Java命名規則Json命名規則が異なる場合, 以下の様にするとGsonが上手いこと変換してくれる.

GsonでJsonのフィールド命名規則を変更する

参考: JSON Field Naming Support

はじめ,これを知らずにJavaで一部スネークケースを使ってコードを書いていた. すごい気持ち悪かったので変換できてよかった.


追記

@BrightGenerousさんからアドバイスを頂いた.

GsonBuilder#setFieldNamingStrategy

行けるっぽいです.こっちの方が良いかもしれませんね.