今週学んだこと

今週は色々学んだので、忘れないようにメモ。

 

Strutsでurl経由で値の受け渡しをする

多分、めちゃくちゃ基本なんだと思うんですが

なんとなくしかわかっておらず、恥ずかしながら質問してちゃんと理解できたので

忘れないように。

 

予約画面→外部APIでログイン→予約内容確認画面

って遷移があり、何かしらデータに不整合がある場合に

予約画面→外部APIでログイン→エラー画面

みたいに遷移している処理がありました。

 

で、諸事情によりエラー画面で予約しようとしていた内容を取得する修正を

実施。

その際にエラー画面で予約内容の取得がうまくできませんでした。

そもそも、エラー画面なのでそのあと何か処理したりしないので

セッションも引き継いでいません。

なので、

外部APIでログイン→エラー画面

とリダイレクトする際のURLに欲しい値をgetパラメータで設定し、

遷移先のurlにマッピングされた処理でgetパラメータ値で取得した値をごにょごにょやる。

取得した値は対応しているhogeってFormがありそこに設定されます。

この時、formのメンバとgetパラメータの値が一致していれば

正しく取得できる。

コード例は無理やりかくと汗、

URLを作成する際に以下みたいにする

    return "?hoge="+AForm.hoge + "&fuga="+AForm.fuga

formは以下


public class AForm{
  public String hoge;
  public String fuga;
  }

基本!

 

②PC間のデータ移動方法

仕事で来週から使うマシンが変わるので、

データ移行方法を探してました。

大容量USBとかはなく、ファイルサーバも容量がパンパンで置けず、

共有フォルダは使用できない設定になっており、う〜んとなっていたら

リモートデスクトップでうまいことできました。

リモートデスクトップでローカルのディスクをマウントする方法

そういえば、dockerでもマウントとかできてたな、と思い

いい感じにできました!

 

③働きながらバンドをやる

workxband.hatenablog.com

上記のようなイベントがあったみたいです!

登壇されている上杉さんは、このブログを始めるきっかけにもなった人で

勝手にこの人から影響を受けまくっています。

全然活動できてないですが、私もバンドをやってて、

今年8月に組んでから2年経ってやっと初ライブします笑。

1人のぞいてメンバーはみんな会社員なので、

しょうがないっちゃしょうがないのですが、

それでも合間をぬって去年音源は作れましたが、ライブがまぁ決められず。

記事にもありましたが、使えるリソース(お金、時間)をどうやって作るか、

そしてリソースをどうやって使うか、もっと考えていかないと…

と思いました。

仕事は思うように行かないしイライラすることばかりですが、

幸いなことに病んじゃったりしないでなんとか辞めないで続けられているし、

勉強することはとても楽しいと感じられています。

今年上半期は仕事で何もできなかったんで、

下半期はいい感じにやれればいいな、と思いました。

 

とりとめないですが終わり!

 

AWS Cloud Watchについて

 

会社の基幹システムが無事リリースが終わりまして

これからエンハンスとか色々やっていくのですが、

その前にやっておくことがあります。

 

そう、セキュリティー対策。

製造やらなんやらで時間を割くことができませんでした汗。

 

なので、なる早でやっていこう!

ということで、色々やることはあるのですが

まずはサーバー監視システムの導入から着手。

 

いわゆる死活監視(サーバーが停止してないか?)や

リソースの使用状況を定期的に監視し、

設定した閾値を超えた場合にメールでお知らせしてくれる

システムですね。

 

色々選択肢はあるのですが、

今回サーバーがAWS EC2ということもあり、

ちょうどAWSの提供する機能でサーバー監視ができるということで

それを使って見ようと思います。

 

cloud watchと呼ばれる機能で、

ブラウザからログインした画面(マネジメントコンソール)からサクサク設定できます。(正確には監視をcloud watchで設定し、alarmで通知をする)

f:id:ikeda1990ikeda:20170605012400p:plain

無料枠がそこそこあるため、監視用サーバを追加で立てるよりも安上がりな気がします。

 

ただ、デフォルトで設定可能な監視条件(対象)はいささか微妙。

例えばディスク使用率を監視する場合にはec2にtelnet/sshして

いくつかモジュールをインストールする必要があります。

(カスタムメトリクス、と呼ばれるもの)

 

自分のec2で以下サイト参考に導入してみました。

Amazon Linuxで残りディスク容量アラートを設定 - kubotti’s memo

ディスク使用量を監視する - プログラマーのメモ書き

 

なので結局、監視は以下の感じに。

・CloudWatchデフォルトでCPU使用率

・カスタムメトリクスでディスク使用率

をひとまず監視とします。

 

ちなみに、恥ずかしながらec2上にまだapacheが導入されてないので

apache導入を続いてやります。

そうするとhttpdの数?(という表現が正しいか微妙ですが)の

監視もしないといけないので、それもカスタムメトリクスでやる予定。

 

 

git-flowについて

こんにちは。

諸々バタバタしており、更新滞っておりました…

 

先日、長いこと作業していた自社基幹システムのリリースが無事?終わりまして、

これからエンハンスやらなんやら頑張ってやっていかないけませんね〜

と思っています。

 

そこで、gitでソース管理をしているのですが今まで割と適当だったので

この機会にしっかり勉強してみようと思い、

git-flowについて勉強しました(さわりだけ)。

 

git-flow とは?

gitでのソース管理をいい感じにしてくれるプラグイン?であり、考え方のことです。

 

ベースとなるのは

masterとdevelopと呼ばれるもので、

origin/masterは常に出荷可能な状態を保持しており、

origin/developは最新の開発ソースが反映されている、的な感じ。

svnで言う所のtrunk)

別々にもつことで品質を担保することができ、何かあった時切り戻しが楽ですね。

 

で、ここからがgit独自な感じになる気がしますが

基本的に開発者は各自でブランチを切って作業します。

(サポートブランチと呼ばれるもの)

 

・フィーチャー

developから派生したブランチ、新機能の開発で使用。

開発終了後にdevelopにマージされる。

機能確定まで本筋を汚さずに済む。

個人毎に持つ。

 

リリースブランチ

developから派生し、masterとdevelopにマージされる。

機能確定〜リリースまでの間に使われるイメージ。

 

・ホットフィクス

masterから派生し、masterとdevelopにマージされる。

本番障害とかが発生したときに切られる。

 

上記ブランチが基本となり、git-flowを使用することで

フィーチャー、リリースブランチ、ホットフィクスの開始、終了をやってくれます。

 

ちなみに、現在の作業で使ってるbitbucketの公式サイトでも紹介してるのですが、

https://www.atlassian.com/ja/git/workflows#!pull-request

管理方法は他にもいっぱいあります。

・中央管理型

svn管理と大差ない感じ。

trunkがmasterになるイメージで、svnからgitへ移行する際にgit導入の入り口として

おすすめしてました。煩雑なブランチ管理を一切しない。

(ちなみに、先日のリリースまではこのスタイルでやってました。)

 

・フィーチャーブランチ型ワークフロー

中央管理+フィーチャーブランチを使う。

 

・フォーク型ワークフロー

各々のローカルごとに公開リポジトリと開発用の非公開リポジトリを保持しているスタイル。開発完了したら変更ソースを管理者が公式リポジトリにコミットする。

各々でプッシュする必要がなくなるが、そもそも公式リポジトリへはプッシュできない。メインのリポジトリをフォークして開発。大規模な開発とかで使われるらしい?

 

・プルリクエストワークフロー

フィーチャーで開発終わったらプルリクエストをチームに投げる。

その際にメンバーがソースレビューし、問題無ければmasterへマージする

 

上記を踏まえ、我々は

フィーチャー型+ホットフィクスをメインにしてgitを運用する予定。

で、リリース終わったらtagを付与する感じで考えてます。

(正しい運用かは不明なので、探りさぐり…)

 

まだわかんないことが多いので引き続き勉強してきます。

 

計測タグについて

現在、現場で計測タグの見直しをやっているので

ちょっとそれについて調べました。

 

計測タグとは?

例えば、何かを予約したり、購入したりするようなサイトの場合

そのサイトの目的は「ユーザーに予約してもらう」であり

「ユーザーに購入してもらう」になります。

その目的を達成するためには商品の魅力や人気とかもあるとは思いますが、

それ以外にも

ユーザーが使いやすい、買いやすいようと思うサイトであることも

目的を達成するための要素の一つだと思います。

 

そういった使いやすいサイトを作るために、サイト側がやる施策として

ユーザーがサイト上でどういった操作をしているかを知る必要があります。

その操作を知るために計測タグというものを使います。

 

例えば、

商品を検索するときにどんな条件を選んで検索しているか?

どんな人がどんな商品を購入しているか?

ボタンがどこにあるといっぱい押してくれるか?

とかをデータとして集め、解析しサイト作りに活かします。

 

ちなみに計測する際はHTMLDOM)上に

計測用の変数を記載しておく必要がります。

 

有名なところで行くと、

以下2つがあると思います。

 

Adobe Analytics

www.adobe.com

Adobeの提供するマーケティング製品のうち、Web分析を行ってるやつです。

(もともとはSiteCatalystと呼ばれました。)

料金の細かいところはわかってないのですが汗、

大企業とかが使ってるイメージはあります。

 

Google Analytics

www.google.com

google版の分析ツールですね。

これと以下

Google Tag Manager

www.google.com

を組み合わせて使うイメージです。

利点としては、Google Tag Manager上で

計測用のタグの管理が行えるため、いちいちコーディング担当者に変更依頼をする必要なく、自由に設定変更できるようです。

 

ちなみに、今のPJでは①と独自のjavascriptを使い、

計測しております。

分析はディレクターや営業とかの人がやってるので

我々は指示通りセコセコ実装して行くだけですが、

絶賛炎上中です。笑

 

頑張ります。泣

プロジェクトの進め方

先週に引き続き、自社の報告業務のWeb化について。

 

今回はどんな感じで進めているかを書きます。

 

【メンバー】

有志のメンバーを社内から募り、PJをスタートさせたのですが全く機能せず…

後述する最大の問題でもあるのですが、業務として社内で活動を扱えていないので

作業する=プライベートを削る、損する

という図式を早々に理解していた活動当初のメンバーは全く作業をしてくれませんでした笑。

一定の成果は上げる必要があるため、このままではダメだと感じた私は

メンバーの再編成を実施しました。

 

選考基準は自社でも仲がいい人がメインです。

もしかしたら手伝ってくれるんじゃないか?という思いだけで声をかけており、

その思いにお釣りがくるくらい、皆応えてくれています。

上記基準で私が独断と偏見で声をかけ現在のメンバーにつながります。

(7人)

 

 

【会議】

基本的には定期的に自社に集まり、1.5hの会議を実施。

長くやる会議は意味がないと思っておりますが、

今より短い時間だとアジェンダが消化できず…現状は最適な時間だと思っています。

各メンバの業務都合を優先し、集まれるメンバだけで実施。

アジェンダは事前に用意していますが、割と毎回パンパンになっています。

 

【コミュニケーションツール】

slackを使っています。

lineよりも仕事っぽい感じがする、最近流行ってる、

それだけの理由で採用しましたが、かなり重宝しております。

チャンネル毎に話題を分けられるの、PCとSP両方で使えるのとか

シンプルなUIもかなりいいですね。

 

【開発】

UIを検討してもらうチーム、

実装してもらうチームに分かれて作業をお願いしています。

UI側は若手メンバーを中心にしており、活発な意見交換もあり

いい感じで進みました。

 

【問題点】

冒頭でも触れましたが、活動のメインとなる開発や検討作業を業務として扱えていないです。

そのため、

①プライベートを削り作業をしますが、それに対する対価、動機付けが何もない

②メンバーには手伝ってもらっているので、作業の遅れが発生しても、それに対して注意したりすることがしづらい。

 

上記が主な問題であり、改善をしようと考えています。

対応策としては

・月に決まった時間を工数としてもらい、その時間内でのみ作業をする。

としたいですね。

できれば、その時間を月曜〜金曜の日々の作業内に組み込みたい。

(そのためには、普段の作業量を調整する必要があるが…)

というようなことを、これから調整していきたいなと思っています。

 

とても有意義で、意味のある取り組みをしている実感はあるのですが、

それのせいで疲れたり、日々の業務に悪影響を出してしまうのは残念すぎるので…

 

まだ全部読んでませんが、以下の本で

プログラマが知るべき97のこと

プログラマが知るべき97のこと

 

・ ハードワークは報われない(P73)

プロには備えるための時間(休息)、知識と技術を高める時間がどうしても必要なのです。

 と著名なプログラマが仰っていたのでね!

 

引き続き頑張ろうと思います。

webアプリケーション環境構築

現在、自社の報告業務をweb化しよう、という取り組みを

やっておりましてどんな感じか書こうと思います。(ざっくりです笑)

 

■言語

javaを採用。verは1.8系でやっています。

採用理由としては、

単純に自社にjavaの技術者が多いのでなんかあった時に対応しやすい!

上記に伴って学習コストを削減できる!といったところです。

 

フレームワーク

springの4.3系を採用。

理由は、javaでwebアプリケーションやるならspringしょ!みたいな軽い理由です汗。

strutsは1.x系がEOLを迎えていたり、脆弱性があったり(最近もありましたね)

www.ipa.go.jp

まぁ新しくこれから何か始める時にstrutsは選択肢にないかな…

ていうのはありますね。

 

■DB

MySQLの5.6系にしました。

ここはあまり強い主張があって採用したわけではないんですが、

OSSで馴染みがあったのがMySQLだった、っていうだけですかね(しょーもない)。

業務系のサービスの場合にはポスグレが多いとか多くないとか聞いたことありますが、

あんまり馴染みなかったんで採用には至らず。

 

■サーバ

AWSLinuxインスタンスの一番サイズちっちゃいやつを採用。

AWSの理由は、

クラウドでサーバつったらAWSっしょ!ていうしょーもない理由もありますが

弊社で知見のある技術者がいるということもありすんなり決まりました。

インスタンスのサイズはテスト運用を実施した中で最小サイズで

全然問題なさそうだったのでそのまま一番ちっちゃいやつでやることに。

まぁ社員しか使わないので…(社員数の少なさが功を奏しました)。

 

■ソース管理、PJ管理

こちらはBitBucketを採用。

ja.atlassian.com

無料で非公開リポジトリが使えるという点で採用を決めました。

(ただし5ユーザまで)

かなりいけてると思います。さすがAtlassian!

課題やチケットはgoogleスプレッドシートで管理していたのですが、

issueも当然のごとくBitBucketは使えるので、スプレッドシートから移行予定。

 

こうやって並べて書くと、

説得力のあるものがあんまりないですね汗。

まぁ使ったことある、知見がある→スピード出るだと思うので

ど定番なチョイスばかりですが、問題はなさそうです。 

 

Docker-4

引き続き、Dockerで開発環境構築。

また眠くなる感じですがお付き合いください汗。

 

翌日起動したら謎のエラーが出たのでググって解決。

Going My Linux Way - りなっくすいろいろ


どうやら、vnc接続終了時にうまくログアウトできてないために発生していた模様。

消すのは怖いので該当ファイルをリネームで対応。

とりあえず動くようにして、javaをいれます。

 

普通にapt-getしようとすると、openjdkしかないみたいです…

oraclejdkはapp-apt-repositoryというのが必要らしく、以下でインストール

#sudo apt-get install apt-file
#sudo apt-file update
#sudo apt-file search add-apt-repository
#apt-get -y install software-properties-common

で、javaをいれる。

#add-apt-repository -y ppa:webupd8team/java
#apt-get install oracle-javaX-installer

(Xはバージョン)


でも、なんかうまくいかないんで前回の記事と同様にwgetjavaをいれる。

(ちなみに上記手順だと、環境変数の設定とかも勝手にやってくれるパッケージも

あるらしいです。)

 

続いて、eclipseをいれる。

 

デスクトップでブラウザ開いてeclipse公式に移動し、

最新のneonインストーラをダウンロード。

で圧縮ファイルを展開するも、インストーラが入ってない…

ん?ってなりwinでlinux版を落とすとちゃんとインストーラがいる。

謎すぎる。

 

色々ググると、pleiadesがあるらしいのでそれで行くことに。

#apt-get -y install pleiades

楽チンやー!と思いきやまさかのver3.8…

しかもopenjdk1.8とかも入ってきて勝手に環境変数とか書き換わります汗。

 

余談ですが、Docker上デスクトップにはrootじゃないユーザで入っております。

で、デスクトップにもコマンドラインツールがあるので

いろいろできるのですがsudo権限がないためうまくできません。

ので、以下で追加しました。

#gpasswd -a cent sudo

 

続いてtomcatは公式からダウンロードして普通に展開。

mavenは過去バージョンが欲しいためwgetで取得。

#wget https://archive.apache.org/dist/maven/maven-2/2.2.1/binaries/apache-maven-2.2.1-bin.tar.gz

vi etc/profile.d/maven.sh でパス追加。

export M2_HOME=/home/cent/work/apache-maven-2.2.1
export PATH=${M2_HOME}/bin:${PATH}

 

で、eclipseを起動しいろいろプラグインとかいれてくか、と思っていたら

UIが古いし、eclipseマーケットプレイスもないのでかなりストレスなので

やっぱあかんはとなり

もうちょい新しいeclipseを再インストールすることに。

#apt-get autoremove

上記で消すと依存関係も見つつ削除してくれます。便利。

 

eclipseのバージョンはkeplerをチョイス。

公式でダウンロードして解凍すると中にインストーラーがいた!

JAVA EEeclipseを選択)

 

インストール後、実行するも。動かない…。

javaのパスも通っているが動かない。

エラーメッセージを見ると、

eclipse置いてあるディレクトリにjdkeがない!

みたいなことを英語で言われたので

事前にインストールしたjdkの中からjreのみコピってeclipse内に移動したところ

動きました汗。

 

実行後プラグインを追加していきます。

maven,svn関連のプラグインがほしい。

m2eはすでに入っていたので、subversiveをインストール

インストールして再起動後、

SVN kit(コネクター)のインストールが促されるはずだが出ない…。

マーケットプレイスも新規ソフトウェアのインストールからも見つからず…。

 

色いろいじっていたら設定にいました。

team>svn>SVNクライアントでGet Connectorsで任意のバージョン取得します。

で、いよいよソースをチェックアウトしようと思ったら

現場のsvnサーバに繋がらない…。

コンテナ内からpingコマンドでsvnサーバのipアドレスを指定し

疎通確認をすると、unreachable…となっていました。

 

色いろ調べると、

別プロジェクトでも同様のところでつまずいていたっぽいことが判明!

どうやらdocker0というブリッジがdockerの起動時に自動的に立ち上がり、

外部とのネット接続を制御しているようです。

 

そのアドレスがsvnサーバipアドレスと被っており、

内部を探しに行ってしまっていたため接続できていない模様。

一度削除して、再度自前でを設定するとつながるらしい。

 

さらに調べるとDockerforMacになってからは、

ホストのデスクトップに常駐しているdockerアイコンからGUIで設定を行うらしい!

preferences>Daemon>Advanced

設定はJSON(というかキー:値)形式で指定するらしいです。

 

以下を設定するといいとのことで設定を追加。

fixed-cidr:"xxx.xxx.x.x/xx"

 

Dockerを再起動すると立ち上がらない…。
めっちゃ焦ってググるもそうなったらリセットするしかない、

と書かれておりました。


諸々初期化されると思いビビってたのですが、

時間ももったいないと思い思い切って

reset your daemon

結果、大丈夫でした。何事もなく再起動汗。

 

さらにググると、下記の設定をさっきバグらせたところに設定で行けるとのこと。

"bip":"xxx.xxx.x.x/xx"


参考

http://qiita.com.chroju/items/5bff99d1c2c792575d32

Cannot configure daemon's bip/bridge IP range · Issue #218 · docker/for-mac · GitHub

見事接続完了!!

 

ちなみに、SVNからのソースはホストとの共有部分に落とすことにしました。

 

理由としてはdockerの仕組み上、

差分管理でイメージを構成しているためそこに大量のファイル入れていくと

動きが遅くなるらしいので。

ホストマシンと共有フォルダを作成 

こちらもホストのデスクトップ常駐のDockerGUIから

docker>preferences>file>sharing 

より任意のホストの領域を選択。

起動時は-vオプションでマウント。

$docker run -v /Applications/Projects:/home/cent/Projects -p 5901:5901 ubuntu5.4.7:6 /root/start.sh

 

残りの課題としては、

DockerFileという形式にするとDockerさえマシンに入っていれば

ここまでの手順を自動化できるみたいなのでそこまでやるところでしょうか。

 

結局Dockerというよりはlinuxのことばかり書いてましたが汗。

かなりアクロバティックな使い方をしてしまったので、

普通の使い方をどこかでもう一度勉強したいですね笑。

 

あと、Dockerに限らずvagrant,ansibleあたりも時間見つけてやりたいですね。

 

一旦Docker日記は今回で終わりにします(予定)。