Monthly Archives: 3月 2016

2016-03-30

Typescriptのススメ、改めAmazon購入履歴取得2016年版

こんにちは。JWord社のS.K.です。普段はJWord プラグインE START デスクトップバーの開発をC++やC#でしています。
そんな私がブラウザ側の開発の勉強にあたってTypescriptをかじったのでブログに投稿します。

Typescriptのススメ

  • なぜTypescript使うのか
    ・静的型付けによる型チェック:コンパイル時にエラーが分かる!
    →Javascriptでブラウザで動作確認だと「実行時」なので書いてからミスに気付くまでの時間が長い
    ・クラスベースオブジェクト指向
    →C++/C#からの学習コストが低い(C#のデザイナーが設計)
    *言語仕様が近い
    ・名前空間があるので規模の大きい開発がしやすい。
    ・Javascriptも併用できる(Ver.1.8以降)
    →Javascriptから移植してメンテナンス性アップ
    ・環境(Javascriptエンジン)依存の吸収
    →従来だとjQueryとかのライブラリで吸収していたものをコンパイラが解決!
    ・慣れたVisualStudioで開発
    →Intellisenseによるコード補完があるので記述が楽!
    →デバッグ操作等UIに慣れている。
    ・ChromeデバッグAPIとの連携。
    →デバッグしやすい?
    Javascriptの勉強に!
  • どこで使われているか(事例)
    ・Angular2:GoogleのMVCフレームワーク
    ・開発に使われているみたいだけど、最終的に表に出てくるのがJavascriptなのでどの程度使われているのか不明。

 

Typescriptで開発サンプル

Amazonの購入履歴を取得するブックマークレットが流行ったことがありましたね。
*ブックマークレット:ブックマークのURL欄にJavascriptを記述し、表示中のサイトに対して実行する機能
ブックマークレットと同様なことは
・Chromeだと:Tampermonkey
・Firefoxなら:Greasemonkey
・IEなら当社のプロダクトJWord プラグインのSitePlusのユーザースクリプト
でできますが、どれも一般の方(非プログラマー)には敷居が高いです。
一般向けならアプリを実行してナビゲーションに従って操作すれば取得できるような仕組みが必要です。
VectorのAmazon注文履歴取得
とかが良い例です。

今回は
Amazonで一年間に使った金額と、注文履歴のTSVを出力するブックマークレット【2015年版】 (GitHub
上記のブックマークレットを(いきなりJavascript修正した方が早いですけど、趣旨に反するので)Typescriptに移植後、修正して2016年版を作ります。

ブックマークレットとして下記を登録します。

javascript:(function(){var a=document.createElement("script");a.src="//<HTTPSで繋げれるホスト>/<jsファイル>";document.body.appendChild(a)}());

注意点としては
・証明書の認証でブラウザのセキュリティで弾かれることがあるので
https://<HTTPSで繋げれるホスト>/<jsファイル> を新タブで開き、コードが読めることを確認しておくこと。
4
・TSVの出力ポップアップウィンドウが表示されない場合はアドレスバー右上の×印をクリックしてポップアップを許可すること。
です。
成果物rawgithub.com経由参照:
javascript:(function(){var a=document.createElement("script");a.src="//rawgithub.com/Libitina/AmazonRecord2016/master/2016/amazon_record.js";document.body.appendChild(a)}());

目的

2015年版では表示される合計金額は正しいのですが、
3
2
・TSV出力(発注日、商品名、著者、商品URL)の著者の欄が正しく取得出来ていない。
・1回に多数品目発注した場合に、省略されたアイテムの情報が取得できない。
・(内部的に)個別の値段に発注の合計金額が入っている。
という問題があります。
今回は正しくTSV出力(発注日、商品名、値段、商品URL)が得られることを目的とします。

JavascriptからTypescriptに変換

1
Visual Studio 2015で新しいプロジェクト(言語はTypescript、TypeScriptを使用したHTMLアプリケーション)を作成します。
5
デフォルトでGMT時間を表示・更新するHTMLアプリケーションのためのコードが記述されています。
6
TypeScriptファイルを追加し、Javascriptファイルの内容をそのままコピーします。
jQueryが無いためや、変数の型の不一致のエラーが表示されます。

jQueryを使えるようにしよう。
7
NuGetパッケージマネージャーから
8
jQuery.TypeScript.DefinitelyTyped
をインストールします。
以上!で移植完了です。
と書きたかったのですが、そこまで甘くはありませんでした。
追加で下記の変更を行いました。
・jQuery.ajaxのSuccess条件の書く位置がjQuery1.5以上のajax()の後ろではなく、1.4以前のajax()内に書く。
・型の記載の追加および関連して関数の引数の変更。
・オブジェクトへのメンバ追加を連想配列に変更。
2015年版オリジナルJavascirptファイル
2015年版移植Typescriptファイル
2015年版移植Javascirptファイル
オリジナルJavascirptファイルと移植Typescriptファイルの比較
オリジナルJavascirptファイルと移植Javascirptファイルの比較
★all指定した時に正しく動作しないバグ有り(84行目でnyearを変更しているのに文字のyearを更新していない)

これでTypescriptらしい記述ではないものの動作はするようになりました。
Javascriptの方が記述で省略できるところが多いものの、Typescriptの方が慣れ親しんだ記載という印象。

修正

・紅茶等の食品や家電にはautherが無いので、autherの代わりに値段を出力させる。
・単純にautherをpriceに変更するとその決済時の金額が入っているので、個別の値段を取得するようにする。。
・商品URLに余計なパラメータが含まれているので削る
・「○個すべての商品を表示」のような一度に多数個発注した場合に個別の内容を取得出来ていないので対応させる。
※配達日が別れた場合や、別注文が1発送にまとめられる場合にも対応を確認しました。
修正後Typescriptファイル
修正後Javascirptファイル
変更後と修正後のTypescriptファイルの比較

感想

結局jQueryの非同期処理が一番の難関でした。
近年のスクリプト言語(Javascript)とC#の機能の取り入れ合いによって言語仕様自体は近いものになっているのが大きいです。
関数の引数違いでのオーバーロードがサポートされていないのが地味にめんどくさかったです。

残件

・Typescript的な書き方に変換する。
function(){}はアロー関数で()⇒{}で置き換えれる。
型を厳密に定義する。(any型も便利ですけど)
・autherの取得を正しく行えるようにする。
・注文詳細ページでの情報取得が並列動作している。1ページずつの逐次の方が好ましい。
*amazonなので負荷は問題にならないと思いますが行儀の問題。
・Amazonの購入履歴を開いてから情報取得までを一連で行うクライアントの開発
*Amazonのスマホアプリが購入済み製品を警告してくれないのでダブる対策や既刊買ってるのに新刊をオススメしてくれなくて買い逃す対策したい。

2016-03-30

SEOについて【その1:概要】

はじめまして、JWordのH.Tです。

JWordと言えば、「JWordプラグイン」とか「JWordキーワード」というサービスのイメージが強いと思いますが、種々多様なウェブサイトの構築や運用も行っております。

ウェブサイト運用側としては初めての記載なので、まずは「SEO対策」についてどの様な観点があるかご紹介します。

次回以降、JWordでの対策や施策など少しずつご紹介していければと考えてます。

SEOと言えば、Googleの検索結果で上位獲得する為の最も重要な3つの要素が下記だと言われています。

①リンク
②コンテンツ
③RankBrain

RankBrainは昨年にGoogleが発表した機会学習を用いた人工知能に関するものです。
ハミングバード・アルゴリズムの一部で検索結果を処理するために使用されているそうです。
ただ、RankBrainの詳細については私の理解が浅いため、ここでは割愛させていただきます。

今回はRankBrain以外の「リンク」「コンテンツ」の対策について記載します。

【リンク】

リンクには、外部リンクと内部リンクがあります。

まず、外部リンクについて説明します。

●外部リンク(被リンク)

外部リンクとは、他サイトから、自分のサイトへのリンクされているリンクの事を指します。

自分たちで多数のサイトを作り、貼っていくという方法は確実に被リンク数を増やす事ができますが、自作自演の被リンクとして、検索エンジンに検知されるため、スパム扱いをうける場合があります。

(2012年4月に実施された不正な被リンク対策をしたサイトに、ペナルティーを発動するものが、ペンギンアップデートというものです)

ですので、良質なサイト運営を心掛けて、自然に相互リンクや、他サイトからリンクを貼ってもらえるような、オーガニックな外部リンクが増えるような運営が大切となってきます。

 

・ユーザに伝えたい事を分かりやすく伝えらえる
・ユーザが求めている事を分かりやすく提供する

 

などといった、「当たり前」の事をいかに意識して提供できるかがポイントです。

デザインの見やすさ明確さはもちろん、レスポンスやスループットなどの性能面における向上などフロントエンド、バックエンド双方で良質なサイトを意識した努力が必要となります。

SEO(検索エンジン最適化)において、UIの改善(UUやPV増加、直帰率)も重要な指標となっています。
UUを増やしても、直帰率が多いサイトはユーザーの求めるコンテンツを提供できていないと判断され、上位表示できない場合もあります。

次は、内部リンクについて説明していきます。

 

●内部リンク

内部リンクは自分のサイト内リンクの事です検索エンジンのクローラーは、サイト内の内部リンクをたどって、ページ内を巡回します。
いくらページを量産しても、内部リンクが適切にサイト内を横断していないと、検索エンジンに最適化されているとは言えません。

内部リンクの施策について、一般的なものをざっくりと紹介します。

・内部リンクをサイト内、ページ内で行き止まりのないような構造にする
・トップページから、第一階層、第二階層、第三階層とピラミッド構造にする
・リンクのURLは共通の書き方をする
・リンク階層を深くし過ぎない
→ クローリングを意識したroutingをこころがけましょう。
・javascriptの使用は避けるのが無難
→ JavaScript実行後のHTMLをインデックスしていると発表されてますが、
angularJSやBackbone.jsでのシングルページアプリケーションは
インデックスされない場合があります。
scriptタグ内でのリンク生成なども控えた方が無難です。
・noindexの使用などインデックスする場所、しない場所の区別を明確につける

 

●コンテンツ

バックリンクと同様に「良質なコンテンツ」を追い求める事が最も重要です。
コンテンツのデザインやライティングが大切ですが、他にもやるべき施策は多々あります。

こちらも一般的なものをご紹介します。

・重複コンテンツへの対応
→ canonicalによる正規化
・titleタグの重複がないようにする
・descriptionやkeywordの設定
→ ページ間で重複したものを設定していないか
・hタグが階層型構造になっているか

 

まずはざっくりとSEO対策の観点をご紹介しました。
良質なコンテンツを語るならこの記事を見やすくするなりどうにかしろというご指摘に関しては、
まずは絵や写真の挿入などを図り見栄えの良さを追求していきたいです…。

次回は「バックリンク」について掘り下げていこうと思います。
今後ともよろしくお願い致します!!

2016-03-29

CentOS7.0にApacheNutch2.3.1をスタンドアロンで構築

ApacheSolrが出回り検索エンジンを作るための本なども数多く出版され
検索エンジンがだいぶ手頃に構築できるようになりました。

今回はApacheNutch2系の構築を書くのですが理由としては、ApacheNutch2のドキュメントが少ない!という事からでした。

さっそく構築に入っていきます。
今回使用するミドルウェアは、コンテンツ保存用にHBase+HDFS、検索用にElasticsearchとしました。
理由としては、そのうち分散していくのに楽そうな構成だったからです。

まずはコンテンツ保存用のHDFSからインストールしていきます。
JDK1.8以上をインストール。今回は専用サーバなのでprofileに書いちゃいます。

clouderaからインストールします。

HadoopごとInstallしないとNutchがエラーを吐いてしまいます。

初期化しておかないとHDFSに怒られるのでHadoopNameSpaceを作りましょう。

Hadoopを起動してみます。

HDFS上にMapReduce用のディレクトリを作っておきましょう。

MapReduceを実行するユーザのディレクトリ作成。

NutchはMapReduceでJobを追加するのでMapReduce関連のプロセス起動。

これでHDFS回りは完了です。
org.apache.hadoop.hdfs.server.namenode.NameNode
org.apache.hadoop.hdfs.server.datanode.DataNode
org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
org.apache.hadoop.mapred.JobTracker
org.apache.hadoop.mapred.TaskTracker
の5つのプロセスが動いていれば問題ないです。

次にHBaseをインストールします。
HBaseを使ってみた感じとしてはHBaseでバックアップを取得しておけば、HadoopのNamespace回りに影響を受けないので安心できるというあたりでしょうか。

HBaseはZookeeperを使うので、Zookeeperの初期化まで行っておきます。
さっそく起動しましょう。

これだけでHBaseは完成です。
org.apache.hadoop.hbase.master.HMaster
org.apache.hadoop.hbase.regionserver.HRegionServer
org.apache.hadoop.hbase.thrift.ThriftServer
rg.apache.zookeeper.server.quorum.QuorumPeerMain
の4つのプロセスが動いていれば問題ないです。

念のためHbaseでテーブル追加&削除をテストします。

エラーが出なければ問題ないです。

次にElasticsearchをインストールします。
Repoファイルを登録します。今回は1.7系を使います。

日本語ようにKuromojiも使います。

設定を変えます。cluster.nameはNutchの方の設定でも使用します。

org.elasticsearch.bootstrap.Elasticsearch
が起動していれば問題ないです。

やっとNutchのインストールが始まります。
まずAntを使うのでインストールします。

Profileに登録します。

次にNutchです。

設定ファイルが多いので各ファイルは記事の下の方に書きました。

antでできた中身をいじりましょう。
Goraとかivyファイルの設定で解決できそうなのですが、いまいちわからなかったのでJavaライブラリをHadoopとHBaseからコピーします。

Nutchのテストをしてみましょう。
Urlを登録します。

クローリングするUrlをスコアが高い順に10件登録します。

クローリングします。

HTMLをパースします。

パースされた結果からリンクなどを抽出してHBaseを更新します。

Elasticsearchに検索用のインデックスを作成します。

Elasticsearchで検索してみましょう。

Yahooのページが出てきたと思います。

ブログを書いてみた感じなぜNutchのドキュメントがあまり出ないかがわかってきました。

  1. Hadoop+HBase+Elasticsearch(Solr)の構築を知らないとNutchにたどり着けないという敷居の高さ。
  2. Nutch公式では一昔前のHadoopとHBaseしか使えないので、ライブラリコピーをしないとClouderaのrepoが使えない点。

の2つが大きいと思います。
Nutch1系であればHbase含むパッケージがあるので気軽なのですが、Nutch2は結構ハードルが高いと思いました。

以上で構築は完了となります。

最後に設定ファイル系を載せます。
# vi /usr/local/nutch/conf/nutch-site.xml

# vi /usr/local/nutch/ivy/ivy.xml
※長いので追加部分のみ

# vi /usr/local/nutch/conf/gora.properties
※長いので追加部分のみ

# vi /usr/local/nutch/src/plugin/indexer-elastic/ivy.xml

2016-03-28

GoogleAppEngine/Go入門

こんにちは!エンジニアのH.Yです。

皆様はGoogleAppEngine(以下 AppEngine)をご存知でしょうか?

自分でサーバ構築を行わずとも、コードを書いて所定の方法でデプロイをするだけでGoogleの強力なインフラ上でWebアプリケーションが作成できてしまう優れものです!

個人的には下記のようなところが素晴らしいと思っています

  • ある程度のアクセスまではずっと無料!
  • アクセス量に応じて自動的にスケーリング
  • GoのWeb環境を簡単に使用することが出来る

詳しくはこちらも御覧ください


個人的にWeb環境のGoを気軽に書けるというのは大きいです。

こういうのって大抵導入が大変でコードを書くまで時間がかかってイヤになっちゃうのですが、AppEngineは比較的簡単なので挫折しにくいですね!

今回はHello Worldをブラウザ上で表示するまでをやっていきます。

操作はWindowsで行いますが、恐らくMacでもほぼ大差ない操作で導入ができると思います!


# Pythonのインストール

https://www.python.org/downloads/

導入に際してPython2.xが必要ですので、上記サイトの「Download Python2.7.11」をダウンロード後起動し、手順に従ってインストールしてください

9bda8777ce40d49eebbdb38b37a4a7d7

インストール後コマンドプロンプトを開き

と出てくればOKです


# SDKのインストール

https://cloud.google.com/appengine/downloads?hl=ja#Google_App_Engine_SDK_for_Go

ここのページに下記のような部分があると思うので、環境に合わせてファイルをダウンロードZIPを解凍して。

93871edd82393717a30d9f8a47f76561

インストール後コマンドプロンプトを開きgoappと打ち

こんな感じでヘルプ一覧が出てくればOKです


# Google Cloud Platformプロジェクトの作成

https://console.cloud.google.com/?hl=ja

Googleアカウントにログインして、GoogleCloudPlatform画面を開くと右上にプロジェクト選択画面があるので「プロジェクトを作成」ボタンをクリックします

672d8a712055795575d0bbe38ca25d0f

すると下記のような画面が出てくるので、プロジェクト名を設定して、「作成」を押します。

この時「プロジェクトID」が後々必要になるのでどこかにメモしておいてください

2536ae018d48b45983021924fb66a1c4


# ソースコードの準備

最低限「main.go」とコンフィグファイルである「app.yaml」が必要です。

https://github.com/ekos/appengine_go_sample

上記にファイルを用意したので、参考にしてください。内容は↓のような感じになっています

「main.go」ですが今回はせっかくなのでフレームワークのmartiniを使用しています。Rubyで言うSinatraに当たるフレームワークらしいです(使ったこと無い)

12行目~14行目が http://example.com/ にマッチするルーティングを表しておりHello worldという文字列を返却してます。

15行目~17行目はサンプルとして http://example.com/hoge/huga へのルーティングが書いてあります。

AppEngineの様々なツールを使用するため外部メソッド内でAppEngineのコンテキストを使用する機会がよくあるので、コンテキストを引き渡す例も同時に書きました。

今回は全てのURLをGoスクリプトで処理するようにhandlersパラメータに書いてあります。

画像などにGoプログラムを通さず静的アクセスさせる場合はここに複数のURLパターンを書くことになります。

versionの整数値はデプロイするときのバージョンを指定することができ、指定したバージョンに即座に切り戻したりなんかが可能です。


# プロジェクトとリソースの紐付け

上記2ファイルを適当なディレクトリに設置し、コマンドプロンプトを開きます

上記の用にコマンドを打ってください。

<PROJECT_ID>には先ほどメモしておいたプロジェクトIDを

/path/to/project にはファイル設置したディレクトリを指定してください。

これを打つと自動的にブラウザが立ち上がり、認証画面が出てきますので、「認証」を押します。


# リソースのダウンロード

先ほどmain.goで使用していた

github.com/go-martini/martini

のような外部のライブラリを使用する場合、事前にローカルにライブラリをダウンロードする必要があります。

コマンドプロンプトを立ち上げ

のように打てばダウンロードできます。


# デプロイ前検証

AppEngine上にファイルをアップする前にローカルで検証することが可能です。

起動している間は

http://localhost:8080/

でアクセスが可能になります。

アクセスするとコマンドプロンプト上にアクセスログ/エラーログが流れ、起動している間にGoファイルを更新するとそれを自動的に検知しコンパイル、即座に確認できます!便利!

「Hello world!」がブラウザ上に表示されてれば成功です!


# デプロイ

下記コマンドでデプロイを行います。

デプロイが完了すれば

https://[PROJECT_ID].appspot.com/

でグローバルアクセスが可能になり、「Hello world!」がデプロイまえ検証と同じく表示されるはずです!


# おわりに

以上、走りでの説明でしたがいかがでしたか?

思ったより簡単に導入が済んでしまう・デプロイが簡単なので、コーディングに集中出来る環境が整うのではないかなと思っています。

みなさんもぜひトライしてみてください!

※ブログ掲載のプログラムのインストールは、自己責任で御願いします。インストール等の結果にかかるハードウェアの不稼働等は、 当ブログでは一切サポートしておりませんので、予め御了承下さい

2016-03-25

これを知っていれば帰宅が5分早くなる!「絶対に知っていて欲しい Macで使える便利コマンド四天王」

最近花粉対策の薬が効かなくなってきたCTO室のHadoopエンジニアのJ.Nです。

チームでペアプログラミングやリリースのオペレーションをしていると、相手の作業を見ていて「え、そんなコマンドあったの?知らなかった!」という事があると思います。

今日は個人的にエンジニア全員に知っていて欲しい超絶便利コマンド四天王を紹介したいと思います。

今日紹介するコマンドを知らなかった人は毎日帰るのが5分ぐらい早くなると思います。

 

UNIX時間を年月日表記に整形

date -r [unixtime]

データベースやログファイルに書いてあるunixtimeを年月日にする作業はエンジニアの方なら100万回ぐらいやった事があると思います。

インターネットに繋がる環境の方ならgoogle先生に「unixtime」と検索し、UNIXTIMEを年月日に変換してくれるサービスのサイトを使うのが普通だと思います。

date -r コマンドなら1秒でunixtimeを年月日表記にしてくれます!

 

現在のUNIX時間を表示

data +%s

date -r とは逆に現在のUNIXTIMEを表示するコマンドです。

これもunixtime変換サービスサイトを使っている方が多いと思いますが1コマンドで表示できるので是非使いましょう。

 

JSONを整形

echo [json文字列] | jq .

プログラムが出力したJSONが正しいかのチェックや、試験でJSONのフォーマットを確認する作業も1000回ぐらいやると思います。

jqコマンドという便利なJSONツールがあるのでそれを使えば、JSONが整形できJSONフォーマット違反している場合はどこがおかしいかを教えてくれます。

jqコマンドは標準ではインストールされていないのでbrewコマンドでインストールしましょう。

 

ファイルをアプリケーションで開く

open [ファイル]

openコマンドは対象のファイルにひも付けられているアプリケーションを自動で実行してくれます。

画像ファイルであればプレビューが起動します。

スクリーンショット 2016-03-24 21.43.04

個人的にはプログラムで生成した画像を確認する場合などに重宝しています。

 

まとめ

本日紹介した四天王コマンドを使用して皆様の作業が捗ると幸いです。

 

2016-03-11

2016/3/10 GMO APG Engineer Night !!!!

みなさんこんにちは!
GMOアドマーケティング(以下AM)インフラグループのあだちんです。
さてさて2016/3/10にGMO APG Engineer Nightを開催しました!
このイベントは毎年3月、9月にセルリアンタワーにあるGMO Yoursを借りて、
GMOアドパートナーズ(以下AP)グループのエンジニアが集まって交流会をしよう!
という会です。
今回も約80人のエンジニアの皆様にお集まり頂き、大盛況となりました!

まずは料理がてんこ盛りです。早く食べたい!と悲鳴が上がることも笑
DSC05189
そして!今回司会を務めさせて頂いたのは!
AMインフラグループのあだちんとAM開発グループのひかるさんです!
DSC05197

クリス取締役のあいさつからスタート

DSC05327

乾杯後、みなさん食いつきます!

DSC05206

DSC05248

ご歓談の後にライトニングトークが始まります!
まずはGMO NIKKO Iさん!

DSC05216


次にGMO AM ひかるさん!

DSC05252


最後にGMO AP のださん!

DSC05314


DSC05243最後に三人で写真!

DSC05399

次にテックイノベーション賞です!
こちらは社内ブログや勉強会など積極的に活躍している人には賞金がもらえます!
堀内副社長、クリス取締役とみなさんで写真!
おめでとうございます!

DSC05397

そして「名刺くじ引き大会」!!!!
古梶社長、渡部社長に名刺を引いてもらい、
買った人にはAmazonギフト券が!
ちなみにAMインフラグループは4人中3人も当たりました笑
DSC05372

締めの一本は堀内副社長!

DSC05381

みんなで集合写真を撮り、あっという間の交流会となりました!
DSC05394

※本記事中に記載の職名は、本記事掲載当日の職名です

2016-03-02

デブサミ2016でSparkを使ったアプリケーションについて登壇してきました

最近花粉気味のCTO室のHadoopエンジニアのJ.Nです。

2月18日 Developers Summit 2016 でApache Sparkを使ったリコメンドシステムの研究成果について発表してきました。

Apache Sparkはインメモリの並列分散処理基盤です。以前の記事にも解説があります。

最近GMOアドパートナーズグループのエンジニア内では熱い分野です。

 

DSC04826

 

 

DSC04825

デブサミで登壇するのは初めてなので緊張しました。

 

DSC04845

Spark Streamingを使って「NHKのつぶやきビッグデータのクローンを作ってみた」というテーマでお話しました。

またクローンだけでは面白くないので、内部でSpark(集計) -> Kafka(レポート結果の受送信) -> Ruby (集計に基づくレコメンド)

というシステムを構築しました。

 

mikasa_20150611 (2)

 

DSC04861

 

資料はスライドシェアにもアップしています。

 

 

GMOアドパートナーズのノウハウをエンジニア界隈に還元し発展していくためにも今後こういったイベントや勉強会には定期的に参加したいと思っていますので、面白い勉強会を開催される会社さんがいれば是非お声かけください。