adventar.org最後の一枠余っていたので急遽書きました。Bootを紹介したいと思います。BootとはJavaやKotlinなどで利用できるWebアプリケーションフレームワークです。Bootの特徴は調べてもらったらいくらでもでてくるので割愛します。Bootの良さはたくさんありますが、個人的に良いなと思っているのは以下の点です。ライブラリが豊富な点は個人的に良いなと感じており、プロジェクトの規模感に応じてORマッパーを使い分けたりできるのは魅力的です。アーキテクチャ設計の自由度が高い点もプロジェクトの規模感に応じて使い分けれるのでとても良いところだなと感じています。Bootでメモ管理システムを作ります。基本のCRUD機能を実装して完成となります。DataBaseJPAFlawayLombokThymeleafIDEはEclipse_2019-09を利用しました。Initializerを使います。Boot2.2.1、Gradleを利用していきます。それぞれ必要なライブラリ群を選択しGenerateするとそれらのライブラリが入った状態のプロジェクトがダウンロードできます。この時点でライブラリを入れ忘れても、あとでbuild.gradleに書き込めば追加できます。既存のGradleプロジェクトから先程のプロジェクトをインポートします。実装するエンドポイント今回実装するエンドポイント一覧です。Webページは1枚で、メモ一覧表示用にすべてのフォームを実装します。POST、PUT、DELETEのリクエストが来たときには処理を行った後そのページにリダイレクトするようにしています。今回はmemoテーブルのみを作成します。カラムの制約はあえてなしにしています。Bootでは3層アーキテクチャが使われることが多いです。そこで今回は、そのアーキテクチャを少し改造してcontroller層、service層、repository層、entity層に分けて実装します。3層アーキテクチャは以下の記事が参考になると思います。qiita.comcontroller層controllerではリクエストが来た際にどの様な処理を行うのかを実装します。見慣れないアノテーションがたくさんあったりと複雑そうに見えますが、基本的には来たリクエストをservice層で処理し、その後必要な結果を返すといった実装となっています。Injection、いわゆるDIを自動で行ってくれるものです。今はmemoService変数には、MemoServiceのインスタンスが入っていると思ってくれれば良いかなと思います。}}service層serviceでは、controllerから送られてきたデータをもとに処理を行います。今回の場合だと、データベースを使った処理を行うことがほとんどになりましたが、複雑なシステムになるとここでの処理が増えることになります。}}repository層repository層はDBへのCRUDを自動で実装してくれるインタフェースが集まった層となります。JpaRepositoryを継承しただけなので説明は省きます。entity層entityは今回の場合だとmemoテーブルの構造を表しています。@Columnでデータベースのカラムとの紐付けを行っています。本来であれば、Getter/Setterを定義しますが、それをベタに書いてしまうとすごく長いクラスとなるので、Lombokを使って省略します。(@Dataの部分)LombokはJavaを書く上ですごく便利なライブラリなので積極的に使うと良いと思います。Thymeleafで実装します。いっても普通のHTMLベースでの書き方なので詰まることは少ないと思います。実際の画面がこちらです。メモの登録、作成、削除ができるようになっています。Bootの紹介をしました。Bootは使えば使うほど良さがわかるフレームワークだと思います。最初は慣れるまで大変だと思いますが、根気よく使ってみてください。良さがわかると思います。Bootを紹介してみるTweet広告を非表示にするもっと読むコメントを書く2019-03-21GitHubに1年間毎日コミットした話GitHub-Heatmap昨年の2月末あたりから先輩の影響で、毎日コミットを始めました。そこで今回は、GitHubに毎日コミットして1年が経ったのでそれらの感想をまとめたいと思います。僕自身今までプログラミング自体は好きでやっていましたが、毎日やる習慣はありませんでした。このままだと自分の目標としているところまで技術力が伸びないのではないかと思い、毎日コミットを始めました。毎日コミットを始めるちょっと前までの自分1年前だとRailsやSinatraを使ったWebアプリケーションの勉強や、Linuxサーバの構築、Herokuを使って身内で使うサービスを立ち上げたりすることを主に行っていました。他には、VimやZshのカスタマイズなどを行うことが多かったです。この頃はとにかく何か動くものを作ってみたい!とかとにかく自分が使いやすい開発環境を作る!というようなことに集中していた気がします。毎日コミットしてみて気づいたことを挙げてみます。今までよりもたくさんの技術を使えるようになった自分の作ったものをたくさんの人に使ってもらえるようにしたいと思うようになったただアプリを作るだけじゃなく、パフォーマンスやUI、コードの品質なども意識するようになった特に2と3の内容が1年前の自分よりも大きく意識が変化した部分だと思います。2に関してはCodeCandyがまさに良い例です。誰かにサービスを使ってもらいたいと思った時、ちょうど新入生が大学に入学してくる時期だったので、新入生にプログラミングを気軽にはじめてもらいたくて作ったサービスでがCodeCandyでした。今では知らない人にも使ってもらえるくらいに成長し、とても良い経験をさせてくれているWebアプリケーションになりました。github.com3に関しては、いくつかWebアプリケーションを運用してみて、今までよりもよりユーザに使ってもらいやすいUIを意識したり、サーバからの応答速度に気を使うようになりました。CodeCandyではプログラムをリアルタイム実行できるようにしているので、アプリケーションのパフォーマンスをよく気にするようになりました。結果的に、信頼性を考えたシステム開発を意識するようになりました。サービスのパフォーマンスや使いやすいUIなどを考えながら開発する意識が高まりました。毎日コミットを行っていると以前よりも様々な技術に触れてみたいと強く思うようになり、今までよりもたくさんの技術を使えるようになりました。Bootを使やサーバサイドスクリプトの開発などなど)あと、アイデアをissueやメモに書き込む癖ができたので、今までよりもアイデアを忘れることが減りました。まとめ毎日コミットは最初のうちは慣れなくてしんどい時もありましたが、慣れてくるとむしろ毎日コミットをやっているほうが自分の時間をうまく作れるようになったので、やってみてよかったなと思います。これからも毎日コミットは続けていきたいと思っています。qiita.com何の記事を書こうかかなり悩んだのですが、今回は自分がWebサービスを運用していて、個人的に便利だと思ったツール・サービスについてまとめていきたいと思います。最後に、今後導入してみたいツールなどの紹介も行いたいと思います。Calendarの記事は以下のリンクから見ることができます。2017年はRailsのAPIモードの話をしています。Pythonで作った音楽プレイヤーの記事は今でもそこそこアクセスがあるみたいなのでいつか書き直したいと思っています。本題に入る前に、私がWebサービスを運用している環境を少しだけ紹介しておこうと思います。利用している環境は2つあり、VPSを使った環境とHerokuを使った環境を使い分けています。VPSはConoHaを利用しており、WebサーバにはNginxを採用しています。使い分けの内容としては、大規模なサービスでそこそこのサーバスペックやインフラ環境を柔軟に扱う必要がある場合はVPSを、小規模でインフラ周りを意識せずに利用できる場合はHerokuを利用しています。だいたいは外部向けのサービスにはVPS環境を、身内で利用するサービスにはHerokuを用いることが多いです。VPS環境で運用しています。今回は、主にVPS環境でWebサービスを運用するにあたって便利だと思ったツール・サービスについて紹介します。AnalyticsFluentdMonitMackerelはてな社が提供しているサーバ管理・監視サービスです。Calendar2018の6日目の記事で@wakatakeruさんが紹介したPrometheusなども有名だと思います。僕が、Mackerelを利用しているのかというと、導入コストが極めて低かったからです。agentの導入はコマンド一発で導入できるのでとても楽です。サーバ監視ツールを導入する際に、ツールの導入に時間をかけたくないが、サーバ監視を疎かにしたくないという要求を考えた結果、Mackerelを使うようになりました。導入してみて良いと感じている点としては、導入の手軽さ、十分な監視機能、グラフがとても見やすいという点です。現在は無料プランでの利用を行っていますが、自分の用途的には無料プランで十分だと感じています。APIも公開されているので、足りないと思う機能があればは自作プラグインなどを作ってカバーすればいいかなと思っています。Botこれは、サーバに誰がいつSSHでログインしたかを監視するために導入しました。SSHでサーバにログインするとSlackに通知が行くようにしています。必要かなと思う面もありますが、スマートフォンなどからでも過去のログイン情報を簡単に閲覧できるのは便利です。ログインしたことをすぐに通知してくれるので、誰か知らない人がログインしてもすぐに気づくことができます。地味だけどなんだかんだ便利だと思っている技術です。このツール自体は既存のツールではなく、自作する必要がありますが紹介しておく価値があると思い紹介しました。AnalyticsGoogle社が提供しているWebページのアクセス解析サービスです。サイトの訪問者数や、訪問時刻、デバイス毎のアクセス数を調べるのに利用しています。このツールのおかげで、メンテナンスするのに最適な時間がわかったり、訪問者が良く訪れるページがわかるようになったので、サービスのメンテナンスや改良が楽になりました。このツールは最近導入したばかりなのですが、もっと早くから導入していればよかったと後悔しています。FluentdOSSのログ収集ツールです。簡単に言うとログをより柔軟に収集、保存ができるツールです。今現在の主な用途はNginxのログをPostgreSQLに保存する目的で利用しています。Nginxのログだけでなく、様々なイベントをログにして出力できるのがとても魅力です。保存先もファイルやRDB、NoSQLなど幅広く対応しているのも魅力的だと感じています。このツールを導入する前は、Vimの検索機能を使ったり、自作parserを作成して、ログを利用していましたが、導入後はそれらの手間が一気に省けたのでとても快適にログを活用できています。プラグインもかなり揃っている印象があるのでかなり使い勝手はいいと思います。Monitプロセス・プログラム・ディレクトリなどを監視するためのシステムマネジメントツールです。Webサービスを公開して数ヶ月立った時、大学のOBの先輩に教えてもらい導入したツールです。それまでは、サービスが落ちたら手動で復旧するしかありませんでしたが、このツールを導入してからはMonitでサービスのプロセスを監視し、サービスが落ちていたら自動で復旧するようにしたので、以前よりも安心感を持ってサービスを運用できるようになりました。設定もそれほど難しくないのが個人的にいいなと思っています。サービスが落ちることは考えたくないので、使う場面が少ない方が嬉しいですね。今後はサービスのログ解析や、Webサービスのチューニングを行うことが増えいくと感じているので、その辺りで使えるツールの導入は検討しています。S3やBigQueryなどは導入したいツールの筆頭ですが、今現在お金にあまり余裕がないので導入はまだ先になりそうです...。現在、それらのかわりとなるツールを作り始めているので、当分は自作ツールで運用していこうと思います。Fluentdを導入したので、ElasticsearchやKibanaも導入してみてログの検索、グラフ化なども行ってみたいと考えています。まとめ他にもWebサービスを運用するにあたって使っているツールがありますが、全部紹介しようとするとキリがないので今回は最近使っていて特に便利だと思った5つのツール・サービスを紹介しました。Webサービスを運用するだけであれば、これらのツールやサービスは必ずしも必要というわけではないかも知れませんが、これらのツールを導入することでより快適にWebサービスを公開できるようになり、またインフラ面で悩むことが減ったように思います。このような技術を取り入れることで、開発に専念しやすくなった気もします。みなさんが知ってるツールばかりな気もしますが、Webサービスを公開する際に少しでも役に立てばいいなと思います。【for文・拡張for文・ラムダ式】はじめに久しぶりのブログ更新となりますね。最近は何かと忙しく、なかなかブログを更新することができませんでした。(悲しい...)近況報告をすると、夏の間はインターンシップに参加していました。最近だとCodeCandyを改良したり、オープンキャンパスでの展示などを行っていました。研究室にも配属されて新たな大学生活がスタートしました。今後も、のんびりきままにブログを更新していきたいと思っています。今回は、私が最近一番使っていると言っても過言ではないJavaについてのお話です。最近Javaをよく使うようになったのですが、その中でもArrayListをよく使います。ArrayListは簡単に言うと可変長の配列みたいなものです。今回はそのArrayListにおける検索方法についてまとめていきたいと思います。利用するArrayListは以下のものとします。値の格納numberList.add(1);numberList.add(10):numberList.add(100);numberList.add(1000);そして肝心の検索方法についてですが、今回はfor文・拡張for文・ラムダ式について説明していきます。1000これが一番初心者の方にもとっつきやすい検索方法じゃないでしょうか。配列の検索方法と同様にArrayListの検索を行います。配列はlengthで長さを取得できましたが、ArrayListはsize()で長さを取得することができます。要素は、get(要素番号)で取得することができます。1000先程のfor文による操作よりもコンパクトになって見やすくなったと思います。この方法だと、ArrayListの最初から最後までを順番に操作することになります。要素番号を取得する必要がない時や、処理の途中でbreakしたい時などには便利に使えそうです。1000ラムダ式はJava8から実装された機能です。拡張for文より簡素に、そして直感的に書けるようになりました。拡張for文との違いとして、拡張for文で利用する変数には型が必要でしたが、ラムダ式で利用する変数には型の宣言が必要なくなっています。ラムダ式は検索の途中でbreakすることができないので注意が必要です。まとめ雑になってしまいましたが、ArrayListの操作方法についてまとめてみました。基本的には、直感的に何を行っているのかわかるラムダ式を使うのがいいと思いますが、検索途中でbreakする場合は拡張for文、要素番号が欲しい時はfor文を使うなど、用途に合わせて使い分けすれば便利に使えるのではないでしょうか。CodeCandyを開発した話はじめになかなか記事が書けなくて申し訳ありません。CodeCandyの紹介をします。今回はCodeCandyを開発して気づいたこと、思ったことなどをまとめていけたらなと思います。↓https://codecandy.tomosse.workオンラインコンパイラCodeCandyとはWeb上で、プログラムの作成から実行まで行うことのできるアプリケーションです。機能としては、自由にコーディングする機能と、問題に取り組む機能の2つが存在しています。厳密には、オンラインコンパイラ+オンラインジャッジシステムといったほうが正しいのかもしれません。特徴としては、以下のことが上げられます。Railsを利用して開発しました。サーバサイドの開発に力を入れています。サーバサイドはRailsを採用し、DBはPostgreSQL、実行モジュールにDockerを採用しました。複数のコンテナを利用するので、管理を簡単にするためにdocker-composeを採用しました。APIとして提供しているのでサードパーティ製のアプリも開発できるようにしています。フロントエンドはERB+jQueryといった一番使い慣れたものを利用しました。技術の採用理由CodeCandyを作成する上で一番意識したことは、開発速度です。開発するというよりも、素早く目標としている機能を実装できることを意識しました。そこで今回は自分が一番使い慣れており、迅速に開発が行えるRailsを採用しました。フロントエンドの機能を手軽に作れるGemが、豊富にあるのも大きなメリットだと感じました。PostgreSQLを採用した理由も自分が一番使い慣れているからといったのが一番大きな理由です。MySQLを採用するかも悩んだのですが、あまりDBでアプリの重さに影響がでるような設計にはならないと感じたので使い慣れているPostgreSQLを採用しました。今回はDockerを採用しました。フロントエンドはソースの多さと友人からアイデアや意見を貰いやすい用、ERB+jQueryを採用しました。開発してみて、やはりRailsはとても開発速度が速いと感じました。作成したい機能をかなりの速度で開発することができました。これは開発してみて思ったことなのですが、意外とRubyでDockerコンテナを操作しやすいことに驚きました。CodeCandyでは、作成したAPIからコンテナを操作する機能がとても重要となってくるので、この技術を採用してよかったと感じました。運用してみて一番感じたことは、ユーザにとって一番良いプログラムと開発者が良いと思って作成したプログラムは必ずしも一致しないといったことです。このあたりのことは、サービスとして展開して、他の人に使ってもらわないとわからないことだと強く思いました。運用目線と開発目線ではアプリケーションに対する見方がかなり変わるイメージも持ちました。今までは開発者視点からしかあまり技術を見ることができていなかったのかなと思いました。今後の展開としては、テストコードをより揃える、実行モジュールを拡張しやすいものにする、より活用しやすいようログインの方法を増やすことなどを重点的に行っていきたいと思っています。まとめこのCodeCandyを開発、運用してから自分自身の技術力はかなり上がったと感じています。これからもCodeCandyをよりよくすることはもちろん、他のサービスも作成してみたいと思います。CodeCandyを開発した話Tweet広告を非表示にするもっと読むコメントを書く2018-07-066月中に行ってきたことはじめにこの記事は、6月中に私自身が行ってきたことをまとめた記事です。6月では、新しい技術を取り入れたり、勉強会に行ったりなど、今までとは違ったことをよく行った一ヶ月になりました。現在CodeCandyを動かしているサーバや自宅内で利用しているサーバにMackerelを導入しました。そもそもは、自分でサーバ監視ツールを作成しようと思っていたのですが、今回はせっかくなので、前々から知っていたMackerelを利用してみたいと思い使い始めました。Mackerelを選んだ理由としては大きく3つあります。・前々から使ってみたいと思っていた特に、2つ目のポートを開けていないサーバにも利用できるといった点が、採用に大きく影響しました。自分の環境では、外部に公開していないサーバもあるので、そのサーバでも利用できるのはとてもありがたいことです。Mackerelを導入してまず思ったのが、とても手軽に導入できることです。使い始めも、難しくなく、監視するサーバにツールを導入するものとても簡単にできました。使うときは14日間無料で有料プランを利用できるといったことも良い点だと思いました。現在は無料プランで利用していますが、無料プランでもかなり使い勝手がいいです。僕のサーバ環境なら十分すぎるくらいです。様々なプラグインが用意されているので、今度使用してみたいと思っています。技術大会に参加した技術大会に参加しに、京都に帰省しました。はてなさんとペパボさんの合同技術大会ということで、過去に大学で講演していただきお世話になり、とても興味があったので参加しました。内容はDevOpsに関することで、はてなのエンジニアさんとペパボのエンジニアさんがそれぞれ、講演(プレゼン)し、トークセッションを行い、懇親会といった流れでした。私は、友人と二人で当日香川から京都に出発し参加しました。現地では、別の友人や、先輩も参加していました。この技術大会を聴講して、今まで自分が考えていたインフラに対するイメージや、開発者としての目線について、大きく考えが変わりました。たくさんの技術者の方との交流を深められて、とても刺激を得れた一日となりました。日帰りで参加したこともあり、とても疲れてしまったということが個人的に残念でした。個人的には、懇親会で、Mackerelを通して、たくさんお話ができたのがとても嬉しかったです。たくさんのいい刺激や影響を受けれたので、参加してとてもよかったです。https://codecandy.tomosse.work6月はあまり、開発が進みませんでしたが、CodeCandyの改良は少しずつ行っていました。モデルの設計の見直し、Javaの実行環境を整えたことなどが大きなアップデートでしょうか。使用しているDockerのコンテナのイメージを変更しました。今まではUbuntuのイメージを利用していたのですが、openjdk:10のイメージを利用するようになりました。理由としては、Javaの実行環境を導入するのに、一番適していると考えたからです。今後は、現在開発している新機能の実装と、実行モジュールの改良を行っていきたいと思います。まとめ6月はあまり、開発面では大きな進捗はなかったですが、得るものはとても多くあったと思います。今後も積極的にイベントに参加したいと思う一ヶ月でした。7月では、CodeCandyの実行モジュールの改良に力を入れたいと思います。大学の授業もおろそかにならないように頑張ります。12:556月中に行ってきたことTweet広告を非表示にするもっと読むコメントを書く2018-07-01Rubyで外部コマンドを実行する方法と処理時間の測定方法はじめに現在、大学の授業でプログラムの性能実験を行っています。実験では、C言語で作成されたコードの性能比較を行うのですが、実行時間の測定などを行うのが大変です。そこで、今回はRubyを利用して、C言語のコードを実行し、その実行時間を測定する方法を紹介したいと思います。C言語のコードを実行するためにRubyでC言語のコードを実行するために、外部コマンドを利用します。外部コマンドとは、簡単にな例をあげれば、Linux上であれば、BashでRubyのコードを動かした時、RubyのコードでBashで動かすことです。外部コマンドが利用できれば、あとはいつも通りターミナル上でC言語のコードを動かす感覚で、C言語のプログラムを実行することできます。Rubyには外部コマンドを動かす方法がいくつか存在するのですが、今回はバッククォート(`)を使った方法とopen3を使った方法を紹介します。バッククォートを使った場合バッククォートを使った場合の、外部コマンドの実行方法は以下の通りです。World`バッククォートで囲った外部コマンドを実行できます。標準出力しか、得ることができないのですが、Bashであれば、Bashの標準入力を使うことで標準入力を使うことができます。簡単な実行結果であれば、バッククォートを使うのがいいでしょう。open3を使った場合open3を使った場合の、外部コマンドを実行するサンプルを以下に示します。今回はpopen3で説明を行います。endendopen3を使えば、標準出力だけでなく、標準入力、標準エラー、ステータスなども使うことができます。Open3.popen3の("")内の外部コマンドが実行されます。時間測定Rubyには、Benchmarkという時間測定に便利なライブラリが存在します。サンプルコードを示しておきます。end内の処理時間を測定することができます。Benchmark.realtimeが実行時間を返却してくれるので、変数に格納してあげるとよいでしょう。返却値は、秒数となっています。まとめ今回は自分が最近よく使う、open3とBenchmarkを紹介しました。みなさんも機会があれば使ってみてはいかがでしょうか。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。