株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

MensaJapanに入会できたのでレポート書きます

平成生まれサーバーサイドエンジニアの欲張りMatzです。

「あ、平成の人だ」って言われる時期が近づいて参りました。

時が過ぎるのは早いもので、かれこれ入社してから2年が経ちそうです。

話は変わりますが、今回は、「何か資格が欲しいなぁ」と思い受験したMENSAについて話したいなと思います。

目次

1. MENSAとは

MENSA(メンサ)とは、1946年にイギリスで創設された、全人口の内上位2%のIQ(知能指数)の持ち主であれば、誰でも入れる国際グループです。 メンサは、世界100ヶ国以上、10万人以上の会員を持つ国際的グループです。 メンサはメンバー同士の知的交流の場を提供します。その活動は、講義、ミーティング、会報、特定の趣味を持つグループ、 地域レベル・国レベル・世界レベルのイベントによる交流を含んでいます。 そして知能に関するプロジェクトでメンサの内部や外部の研究者への協力を行います。

引用:MENSA 公式ページ

2. どうやって入会するか

筆記試験で合格したら、

受験終了後のおよそ1〜2ヶ月後に以下の入会案内がメールにて届きます。

f:id:aimstogeek:20181214154952p:plain
mensa

「おおおおおぉぉおぉ!!!!」って一人で松屋で大声を出したのを覚えています。

あのときは一人でキムカル丼を食べていました。

3. 試験を受けるまでに何をすればいいのか

  • mensa 試験 予約」でググると一番上に出てくるページから予約申請
  • 試験料を支払い
  • 当日会場にいく

予約なんですが、いつ見てもほとんど満員なのがすごいです。 試験料といっても僕が受験したときには1万円くらいだったので、決して安くはないですね。

4. どんな問題が出るのか

こんな感じの問題が38問出題され、制限時間は20分です。 (最近は40分くらいになったと言う噂もあります)

f:id:aimstogeek:20181214163255j:plain
問題例

面白いのが人生で3回までしか受験できなく、一度不合格になったら1年間以上のスパンを設けてからではないと再受験できないと言うシステムです。

人生で3回って聞くとゾワっとしますよね。。。

また、常識的な知識を持っていないとできない問題は出てこないので、小学生から受験することができるそうです。

自分なりに規則性を見出して、検証して再トライして...と言う高速PDCAを回し、自信を持ってこれだ!と思う答えを選択肢から選びます。

5. 合格のためにやったこと

せっかく高いお金払って受験するので、ちゃんと合格したい!と思い、以下のことを実践しました。

  • IQテスト系のアプリを毎日1アプリ(3日で休止)
  • IQの上げ方を調査して実践 

IQの上げ方を調査していた結果、IQが高いと言われている人をテレビ越しでもいいから見ることが大事なようです。 要は、ずっと見ていれば考え方とかも変わってくるってことだと思い、ひたすら茂木健一郎さんをyoutubeで見てました。

6. 入会したら何ができるのか

別に特別なことはなくて、単に規模のでかいコミュニティです。

会員制のページが設けられ、ログインをすると月毎にイベントが開催されていて、会員が自ら参加をしていくスタンスです。

茂木健一郎さんに会えるかなと思っていましたが、全然会えませんね...

7. 入会するメリット

あまりないんですが、強いて言うなら以下です。

  • 会員の中には実業家やフリーランスの方などが結構多く、話しているだけでも勉強になる
  • 会話に非常に困ったときにネタになる

ちなみに就活時代に履歴書の資格記述欄に「MensaJapan会員」と記入したのですが、面接中に何も触れられませんでした。

8. 最後に

答えの解りづらい問題について考える力は、エンジニアの業務をしていく上でも毎日のように出くわすので、頭の体操としてもMensaの問題はおすすめです!



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

LINEのURLスキームが起動しない現象を調査した結果、https://line.me/R/に変更した話

2018年もあと一月。
今年の抱負がなんだったか全く思い出せない、mkです。

弊社のサービスの中に、「ナスカレ」「ナスカレPlus+」というカレンダーアプリがあります。

www.kango-roo.com
このアプリの中で、カレンダー画像やシフトをLINEで送信することができるのですが、
「画面が真っ暗になって送信できない」
「LINE以外のアプリが起動する」
というユーザーからのお問い合わせが急増。

お問い合わせ後も状況を細かく教えてくれたユーザーの方々とのやりとりや開発チームの調査を経て、 LINEのURLスキームをhttps://line.me/R/に変更したので備忘を兼ねてまとめてみます。

LINEのURLスキーム

公式:https://developers.line.biz/ja/docs/messaging-api/using-line-url-scheme/

LINEの基本URLスキームはline://です。https://line.me/R/で始めることもできます。

line://とhttps://line.me/の違いは、LINEが端末に入っていないときの挙動しか明記されていない模様。

かなり細かくアクションを指定できます(知らない機能もある)。

  • カメラとカメラロールを開く
  • 位置情報画面を開く
  • ボットアカウントをシェアする
  • ボットのタイムラインとアカウントページを開く
  • テキストメッセージを送る
  • プロフィール情報を開く
  • その他の画面を開く
  • 設定画面を開く
  • スタンプショップを開く
  • 着せかえショップを開く
  • LINE Outで発信する
  • LIFFアプリを開く

とても丁寧に説明してくれていて優しさを感じますね。

「ナスカレ」もLINEの起動にはこのURLスキームを使用していました。

事の始まり

急にLINEで送信ができなくなったというユーザーからのお問い合わせ。

当初は2つの現象がおきていると考えて別々に調査。

  • 「LINEでスケジュール画像を送信しようとすると画面が真っ暗になる」
    →画像生成の部分を疑い、シフトのみ(テキスト)の送信ではどうなるか確認

  • 「LINE以外のアプリが起動する」
    →他のアプリからLINEを立ち上げた時には、問題なくLINEが立ち上がるかを確認

手元の検証機では現象が再現できず、お問い合わせをくれたユーザーの方々の情報が頼み…

並行してLINE起動周りに不具合がないか調査依頼を出しました。

分かったこと

  • 画像だけでなくテキストの送信も同じようになる
  • スケジュール画像の保存はできる
  • メールでの送信も可能
  • 先月は問題なくLINEで送信できた

手元でも再現できないまま、原因もわからず困っていると
”特定のアプリを入れているとLINEが立ち上がらない”
現象があるらしいという調査結果が!(衝撃)

こういうことがあるみたいなんですが〜と心当たりがないか連絡をしてみると……

お問合せをくださっていた一部の方から、「そのアプリをアンインストールしたらLINEで共有できました!」との報告。

結論:LINEのURLスキームを使ってアプリのすり替えがおきていたらしい。

https://line.me/R/に変更した結果

ということで、今後も似たようなことが起きないようにhttps://line.me/R/に変更することにしました。

公式には書かれていないですが、変更した事で起きた事↓↓

LINE連携画面イメージ
右上にline.meの文字が出現


右上の「line.me」をタップすると、ブラウザが立ち上がります。

タップせずにそのままLINEを使用している分には、URLスキームと動作は同じです。

※OSのバージョンが新しいと右上の表示はなく、LINEのURLスキームとなにも変化はありませんでした。

このページをLINEで開きますか?
ダイアログが表示され、LINEを起動するか聞かれます。


ショッピング系アプリなどの場合はブラウザで開くとブラウザ版が利用できますが、LINEは「このページを”LINE”で開きますか?」というダイアログが表示されます。

LINEアプリを開くを選択するとLINEが立ち上がり、その後の動作は変わらず。問題なく動作が確認できました。

一度ブラウザで開くようにすると、それ以降は毎回ブラウザが開かれるようになります。
※別のアプリからブラウザで開いたことがあると、その影響を受けます。

これを知らなかったので、ブラウザを挟む端末と挟まない端末がある!とhttps://line.me/R/に変更したあとも少し頭を抱えることに……

最後に

他のアプリの影響を受けるという原因を特定しにくい問題でしたが、
報告してくれたユーザーの方々の助けもあり無事対応できました。感謝感謝。
これからもより使いやすいアプリになるよう改善をしていきたいと思います✧✧




\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

より便利になった gulp 4.0 への移行方法と変更点をまとめました

こんにちは。フロントエンドエンジニアのhikaruです。

直近担当しているリニューアル案件で、過去に作った gulpfile を修正している際に、

ついでに gulp v4 にアップデートしてみよー!

という軽い気持ちでろくに下調べもせずにアップデートしてみたところ、タスクの記述方法の修正が必要だったので、アップデートを考えている方のお役に立てばと思い、遭遇したエラーと対処方法をまとめてみました。

  • gulpfile 修正しなきゃいけないの…?
  • 他のプロジェクトで使ってる gulp のバージョンに影響ないの…?

と思った方もご安心ください(๑•̀ㅂ•́)و✧

他のプロジェクトに影響を与えない & これだけ修正すれば大丈夫!というポイントをお伝えします。

まずは結論から

修正が必要なのは以下3点のみです。

  1. gulp.task の引数の変更
  2. gulp.watch の引数の変更
  3. ローカルの gulp を参照するようにする

1. gulp.task の引数の変更

ローカルに gulp v4 をインストールしてそのまま gulp を実行すると、以下のエラーが出ます。

assert.js:351
    throw err;
    ^

AssertionError [ERR_ASSERTION]: Task function must be specified
    at Gulp.set [as _setTask] (/project/node_modules/undertaker/lib/set-task.js:10:3)
    at Gulp.task (/project/node_modules/undertaker/lib/task.js:13:8)
...

これは gulp.task の引数が 3つから 2つに変更されたため起こるエラーです。

  • v3:gulp.task(name [, deps] [, fn])
  • v4:gulp.task([name,] fn)

Gulp Documentation -gulp.task

依存関係のあるタスクは、gulp v4 で追加された API を使って指定します。

  • gulp.series:タスクを直列処理する
  • gulp.parallel:タスクを並列処理する

Gulp Documentation -gulp.series

たとえば、一度ディレクトリを削除してからビルドを実行したい場合、次のように書き換えます。

gulp v3

gulp.task('sass', ['clean'], function() {
  ...
});

gulp.task('js', ['clean'], function() {
  ...
});

gulp.task('build', ['sass', 'js']);

gulp v4

gulp.task('build',
  gulp.series('clean', // 直列処理
  gulp.parallel('sass', 'js') // 並列処理
));

今までは個別のタスクの引数に依存関係を指定したり、run-sequence などのプラグインを使用する必要がありましたが、標準の API でより直感的に記述できるようになりました。

2. gulp.watch の引数の変更

gulp.watch の引数も以下のように変更されました。

  • v3:gulp.task(glob [, opts], tasks)
  • v4:gulp.task(glob [, opts] [, fn])

Gulp Documentation -gulp.watch

次のように書き換えます。

gulp v3

gulp.watch('src/sass/**/*.scss', ['sass']);

gulp v4

gulp.watch('src/sass/**/*.scss', gulp.task('sass'));

第二引数には gulp.task, gulp.series, gulp.parallel の他、関数名や無名関数をそのまま記述しても大丈夫です。

3. ローカルの gulp を参照するようにする

ここまで修正して gulp を実行すると、以下のエラーが出ます。

    gulpInst.start.apply(gulpInst, toRun);
                   ^

TypeError: Cannot read property 'apply' of undefined
    at /usr/local/lib/node_modules/gulp/bin/gulp.js:129:20
    at internalTickCallback (internal/process/next_tick.js:70:11)
...

グローバルとローカルのバージョンが違うことで出るエラーのようです。

現状 ↓

[14:57:20] CLI version 3.9.1
[14:57:20] Local version 4.0.0

他のプロジェクトの gulpfile も修正が必要になっちゃうなー… どうしたものか… と思い調べていたら、ローカルの gulp を参照する方法がありました(`・ω・´)

package.json に 以下のように定義することで npm run gulp で実行できるようになります。

"scripts": {
  "gulp": "gulp"
}

gulp 公式の導入手順にもグローバルにインストールするようかかれていますが、アップデートの際に他のプロジェクトや環境でのバージョンの違いを考慮する必要があるため、プロジェクト内の node_modules だけで完結させられたほうが便利ですね。

補足1:npm scripts の登録

  • 個別のタスクを実行したいときに、いつもの感じで gulp taskname とコマンドをたたくと、グローバルが参照され上記の TypeError が出てしまうので、デフォルト以外に個別で使うことがあるタスクは npm scripts として設定して npm run taskname で実行できるようにしたほうがよいでしょう。
  • 登録したタスク一覧は npm run で見ることができます。

わたしはこんな感じで設定しました。

package.json

  "scripts": {
    "gulp": "gulp",
    // よく使うタスク
    "watch": "gulp",
    "dev": "gulp build --development",
    "prod": "gulp build --production",
    // たまに個別で使うタスク
    "sass": "gulp sass",
    "js": "gulp js",
    "copy": "gulp copy",
    "image": "gulp image",
    "ejs": "gulp ejs"
  },

補足2:タスクの終了を明示的にする

1〜3 まで修正して npm run gulp を実行したところ、こんなエラーがでました。

[15:14:22] 'default' errored after 14 ms
[15:14:22] The following tasks did notcomplete: server
[15:14:22] Did you forget to signal async completion?

gulp v4 では、タスクの終了を明示的にしないと、タスクが完了せずにそこでエラーとなるようになりました。

タスクが1つであれば、今まで通り return をしてストリームを返すようにすれば解決します。

gulp.task('somename', function() {
  return gulp.src('client/**/*.js')
    .pipe(minify())
    .pipe(gulp.dest('build'));
});

タスクの終了を gulp に明示的に伝えるためには以下の 5つの方法があるようです。

  1. 最後に callback を実行する
  2. streamを返す
  3. promiseを返す
  4. child processを返す
  5. RxJS observableを返す

Gulp Documentation -Async support

公式ドキュメントにサンプルコード付きで解説されています。

まとめ

今回はパパっとアップデートすることが目的だったので、最低限対応が必要なことのみまとめました。

他にも

  • gulp.tree メソッドの追加
  • gulp.registry メソッドの追加
  • gulp.srcgulp.dest のオプションの追加
  • タスクの定義を gulp.task ではなく JavaScript で関数を定義するように記述できるようになった

などさまざまな変更点があるので、気になる方は 公式のAPIドキュメント を見てみてください。

gulp.taskgulp.watch の書き方を見直せば問題なく移行できるので、gulp v4 への移行はそれほど大変じゃない!というお話でした。


\\『明日のはたらくを創る』仲間を募集中!! // 919.jp

【Windows 10 Pro】Microsoft Storeの無効化について

ご無沙汰しております。シスアド担当のスカイ(甘党)です。

半年ぶりに「あるあるPC管理者の悩み」を書かせて頂きます。

第三回あるあるPC管理者ネタはWindows 10への移行の際に管理者の頭を悩ます、
Microsoft Storeを無効化したい!」です。
 ※今回はWindows 10 Proを利用している方々が対象となります。
 ※あるあるな悩みの後に解決した方法を書いております。(結論お急ぎ用)

Microsoft Store(以下Store)は、
業務で利用される「計算機(calc)」等の導入だけではなく、
業務に不要なゲームアプリ等がユーザー権限で導入できてしまいます。
個人として利用する際は素敵機能だと思いますが管理者としては悩みの種ですよね。

というわけで、簡単にStoreを無効化する事が、
「グループ ポリシー」を利用してできるのではないかと思い検索してみたところ、
Microsoftのページがヒットしましたが...絶望でした...

Windows 10 Pro でグループ ポリシーを使って Microsoft Storeを無効にすることはできません。(By Microsoft先生)

【参考URL】
https://support.microsoft.com/ja-jp/help/3135657/can-t-disable-windows-store-in-windows-10-pro-through-group-policy

簡単にいうと初期のProはグループポリシーで無効化できたけど、
バージョン アップ以降後、Proでは無効化は利用できなくなったけど仕様だよ♪
 (心の声:嘘だと言ってよバーニィ!)

この情報のみで考えられる案は、
A. Storeは無効化しない、利用者にはStore使わないでとお願いし続ける。
 →利用に関する啓蒙活動、定期的なStoreソフトの導入監視が必要\(^o^)/
B. Storeを無効化するが、古いバージョンを利用し続ける。
 →脆弱性がある為、情報流出を前提とした利用方法が必要/(^o^)\
C. Storeの無効化を利用でるようにProからEnterpriseに変更する。
 →Storeの為だけに大幅なコストUPが必要となる\(^o^)/

じっくり考えてみたけど、どの案もナンセンス!!!!!!

課題解決の為にアプローチする方法を色々と考え直したりもしました。(白目)
 Storeから業務に不要なゲームアプリ等をユーザー権限で導入させたくない
  →Storeを無効にしたい ←最新のProでは設定できない仕様って言ったでしょ!
  →Store本体を削除する ←削除してもアップデートで復活さ!
  →Storeからインストールできるアプリを制御したい ←Proには機能がないよ!
  などなど

悩んだ末、以下の結論になりました。

Storeという名前のアプリの起動は許可しない!

さっきと違うの?って思うかもしれないのですが違うんです!
というわけで手順含めてご説明しますね。

f:id:aimstogeek:20181122114548j:plain
Store制御設定画像①
①ローカル グループ ポリシー エディターを実行します。
②[ローカル コンピューター ポリシー ]-[コンピュータの構成]-[Windowsの設定]
 -[セキュリティの設定]-[ソフトウェアの制限のポリシー]を選択します。
 ※定義がない時は右クリックで「新しいソフトウェアの制限ポリシー」をクリック。
③[追加の規則]を右クリックし「新しいパスの規則」を選択します。
f:id:aimstogeek:20181122114605j:plain
Store制御設定画像②
④パスに「C:\Program Files\WindowsApps\Microsoft.WindowsStore*」と入力し
 説明を記載して「OK」を選択します。
 ※OSがCドライブ以外の場合は適宜変更してください。

ではこれでStoreを起動してみましょう。

f:id:aimstogeek:20181122113313p:plain
やりました!目的のMicrosoft Storeの無効化が成功しました\(^o^)/
ソリティアのインストールできない/(^o^)\
成功あるある~~!!




\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

UIデザインにおける8つの黄金律について考えてみた〜【後編】

こんにちは、最近Adobe XDがAfter Effectsとの連携ができるようになって、インタラクション作成にハマっているデザイナーAchanです。

前回はベン・シュナイダーマン氏が提唱した「UIデザインにおける8つの黄金律~前編」の話をしましたので、今日はそれの続きです。

1. エラーに簡潔に対処できるようにしよう

ウェブサイトやアプリを利用する際に、ユーザーがつまづく場合(ヒューマンエラー)があります。まず初めにデザインの段階でエラーが起きないようにすべきではないかと思います。そのためにはエラーの種類を理解することが大切です。

人間中心のデザイン原則『誰のためのデザイン?』(著者ドナルド・ノーマン氏)によると、エラーには大きく「スリップ」と「ミステーク」という二種類があると挙げられています。 f:id:aimstogeek:20181115191426j:plain

① スリップ

スリップとは実行段階の失敗です。やりたいことをユーザーが正しく認識していても、意図通りにうまく行かなかったり、誤操作をしてしまったりすることを指しています。例えば:

  • テキストリンクやボタン周りの余白が足りず、隣接したテキストリンクやボタンをタップしてしまう。
  • 入力フォームに入力しようとしても見ただけでは操作方法がわからず色々試行し、入力完了まで時間がかかってしまう。
  • スマホサイトで横スクロールしようとしたら、スワイプ操作が画面の左端すぎて前に開いていたページに戻ってしまう。

② ミステーク

ミステークとは計画段階の失敗です。ユーザーの記憶や認識の違いによりうまくいかないことを指しています。例えば:

  • リンクではない箇所をリンクだと思い、クリックしてしまう。
  • 検索機能の代表アイコン「虫眼鏡」を「目」などの見慣れていないアイコンに変えると、ユーザーがそれを検索機能だと認識できずユーザビリティが低下してしまう。
  • 汎用のショートカットキーを独自のものに設定してしまうと、ユーザーの意図通りのことができず操作性が悪くなってしまう。

以上、エラーの種類を理解すれば、まずある程度エラーを防げると言えるでしょう。 もちろん、すべてのエラーを防げるとは言えませんが、万が一エラーが発生した場合は優しく、わかりやすいメッセージでユーザーに知らせましょう。肝心なのは何が問題なのか、具体的にどうしたら解決できるのかを瞬時に理解してもらえるにデザインしましょう

2. アクションを簡単にやり直せるようにしよう

ヒューリスティックスとしては「ヤコブ・ニールセンのユーザビリティ10原則」にも同じことが挙げられています。

ユーザーコントロールと自由度(User control and freedom)

ユーザーはシステムの機能を間違って選択することがよくあるので、その不測の状態から別の対話を通らずに抜け出すための、明確に表示された"非常出口"を必要とする。"取り消し(undo)"と"やり直し(redo)"を提供せよ。

例えば先月リリースされたPhotoshop CC(v 20.0)。リリース前では「取り消し」は汎用ショートカットCommand+Zで1回前の操作にしか戻れず、それ以上遡るにはCommand+Option+Zを押すか、「ヒストリー」ツールで戻る必要がありすごく不便に感じていました。今はIllustrator と同様にCommand+Zだけで連続して取り消し操作を行う事ができるようになり、作業効率が劇的に上がりました。(「やり直し」は従来通りShift+Command+Z)

アプリやウェブデザインでは、わかりやすい場所に「取り消し」や「やり直し」があるとユーザーにやさしいです。例えば下記のメールアプリ、メールをうっかり削除した場合、ユーザーの邪魔にならないように「取り消し」を設置することで、ゴミ箱から誤って削除したメールを探す手間が省けます。

f:id:aimstogeek:20181115191631g:plain

3. ユーザーに主導権を持たせるようにしよう

ユーザーに主導権を持たせる上で必要なことは、今何を見ているのか、そして目的を達成するためには何をしなければならないのかを理解させることです。
典型的な例は検索エンジンです。ユーザーが検索エンジンを使ってウェブ上の見たい情報を自分でコントロールすることができます。

また、システムの都合で強要する操作を減らし、ユーザーが常に自分の意思にもとづいて選択、作業を進められるようにするのも大事です。例えば、8月にGmailのデザインがリニューアルされた際に、右下に小さなポップアップの更新予告に気づきましたか? f:id:aimstogeek:20181115191743j:plain

基本人間が一旦使い慣れたものがいきなりガラッと変わると作業上に混乱をもたらします。さすがGoogle大先生、その問題を意識して、ユーザーに主導権に与えるために色々工夫されたのではないかと思います。

  • 自動更新(強制)ではなく更新予告
  • 更新後の不安を解消するため詳細まで確認できる
  • 更新期間を設けている
  • 気になる方が今すぐ更新できるようにしている

さらに、新デザインに更新して、期間内で気にならない場合は以前のGmailに戻すこともできます。

ちなみに、ユーザーに主導権を持たせる設計方法として「オブジェクトベースUI設計」(OOUX と表記される場合もあります)が最近注目されてきています。興味がある方は調べてみてください。

4. 短期記憶の負担を減らそう

短期記憶とは、人間が瞬間的に覚えておける記憶のことで、数十秒から数分で忘れてしまう記憶です。認知心理学の教授であるネルソン・コーワン氏により人間の短期記憶の容量限界は4±1チャンクと発表され、現在は定説となっています。 f:id:aimstogeek:20181115191837j:plain

携帯番号を例にすると、「09067894321」は1つのチャンクとして11個の数字で構成されているため、それ自体を覚えるのは難しいでしょう。しかしこれを「090」-「6789」-「4321」と3つのチャンクに分けると、各チャンクは3か4個の数字になり、記憶に留まりやすくなります。

したがって、情報を整理した上で、人に覚えてもらいたい情報を伝える時には、なるべくシンプルに、3~5個以内にすることが大切でしょう。

まとめ

以上、ベン・シュナイダーマン氏が提唱した「UIデザインにおける8つの黄金律」についての考えでした。画面に表示される内容やレイアウトなどを設計する際に、皆さんの業務の一助になれば幸いです。

前編が気になる方はぜひ下記のリンクをクリック〜 aimstogeek.hatenablog.com



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

AWSのKinesis Firehoseを使ってEC2のログをElasticsearchに飛ばして可視化した話

AWSを使うと非常に簡単にアクセスログの可視化が出来ます!感動しました!
今更感はありますが、ログを可視化してグラフ化する手順を書きたいと思います。
おはこんばんちは、SREのmatsBです。

使うAWSサービス

構成イメージ

f:id:aimstogeek:20181109154910p:plain

Amazon Elasticsearch Serviceの設定

ドメインの定義

特にこだわりとか無ければ最小構成でポチポチ設定していくだけです。
まずは、好きなドメイン名を付けます。

f:id:aimstogeek:20181109171658p:plain

クラスターの設定

構成を選んでいきます。
今回はテストとしてなので、最小構成を選んでいます。

f:id:aimstogeek:20181109171707p:plain

アクセスの設定

アクセス制御方法を選んでいきます。
VPCアクセス」でもいいのですが、Amazon Kinesisを使う時にVPCを意識しながら使わなきゃいけなくなります。
弊社の場合は「パブリックアクセス」の方が都合が良いので、そちらを選択しています。
自分の接続元IPを選んで追加します。

f:id:aimstogeek:20181109171723p:plain

確認

最後に確認をして問題なければ完了です。

f:id:aimstogeek:20181109171749p:plain

Amazon Kinesisの設定

Name and source

stream nameはEC2がFluentdを設定する時の「delivery_stream_name」で使います。

f:id:aimstogeek:20181109171800p:plain

Process records

ここはデフォルトのまま「Next」でいきました。

f:id:aimstogeek:20181109171809p:plain

Select destination

飛ばす先を「Amazon Elasticsearch Service」にして、上記で作ったElasticsearchのドメイン名を入れます。
Index名は分かりやすい文字列を入れました。

f:id:aimstogeek:20181109171821p:plain


上記画像の下の部分ですが、バックアップとして飛ばすS3を設定していきます。
今回は「Failed records only」を選択してますが「All records」を選べば、Fluentdで飛んできたログ全てが保存されます。
別の方法でログを見たい時や解析したい時に活用できます!
あと、Apacheのログフォーマットや、それを飛ばすFluentdの設定をちゃんとやらないとElasticsearchに飛んでも解析してくれません。
ちゃんと出来てるかの不安があれば、全ログを取って都度確認したほうがいいと思います。

f:id:aimstogeek:20181109171830p:plain

Configure settings

「Buffer size」は「1」、「Buffer interval」は「60」に設定しました。
最小値にしてるのはできるだけリアルタイムに近づけるためです。
逆にいうと、Kinesisを使ったログの可視化はリアルタイム性は捨てなきゃいけないです。
IAM roleの設定も必要なので、ここで設定します。

f:id:aimstogeek:20181109171840p:plain

ロールの設定

IAM roleのポリシーはもう用意されてるので、それを流用して設定します。

f:id:aimstogeek:20181109171849p:plain

Configure settings

設定するとこんな感じでIAM roleが入ります。

f:id:aimstogeek:20181109171859p:plain

Review

確認画面で問題なければ作成完了です。

f:id:aimstogeek:20181109171908p:plain


EC2の設定

EC2の前提

Apacheが動いていてログが出力されてる事が前提です。
今回はアクセスログを投げて解析しますが、用途によっては他のログを飛ばしてください。
ログの出力先は

CustomLog /var/log/httpd/919/919-access_log combined_ltsv

としていて、ltsvを前提としています。
ログフォーマットは下記のようになっています。

LogFormat "remote_ip:%a\tx_f_protocol:%{X-Forwarded-Proto}i\tremote_host:%h\tident:%l\tuser:%u\ttime:%{%d/%b/%Y:%H:%M:%S %z}t\treq:%r\tmethod:%m\tpath:%U%q\thttp_protocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:\"%{User-Agent}i\"\tresponse_time:%D" combined_ltsv

Fluentdのインストール

Amazon Linuxを使ってるので、yumでインストールします。

$ yum install td-agent

fluent-pluginのインストール

kinesisに関するプラグインはいくつかあるのですが、awslabsが公開している「fluent-plugin-kinesis」を使います。

$ gem search -rd fluent-plugin | grep kinesis
fluent-plugin-in-kinesis (0.0.2)
    Homepage: https://github.com/yusukeyamatani/fluent-plugin-in-kinesis
fluent-plugin-kinesis (2.1.1)
    Homepage: https://github.com/awslabs/aws-fluent-plugin-kinesis
fluent-plugin-kinesis-aggregation (0.3.1)
    https://github.com/atlassian/fluent-plugin-kinesis-aggregation
fluent-plugin-kinesis-alt (0.0.2)
    Homepage: https://bitbucket.org/winebarrel/fluent-plugin-kinesis-alt
fluent-plugin-kinesis-firehose (0.1.1)
    https://github.com/winebarrel/fluent-plugin-kinesis-firehose
fluent-plugin-kinesis-intuit (2.1.1)
    https://github.intuit.com/cloud-logging/aws-fluent-plugin-kinesis-in

インストールをします。

$ td-agent-gem install fluent-plugin-kinesis

インストールされたことを確認します。

$ td-agent-gem list | grep kinesis
fluent-plugin-kinesis (2.1.1)

td-agentの設定

td-agentにkinesis用の設定と飛ばすログの設定を追加します。

$ vim /etc/td-agent/conf.d/919_apache.conf
<source>
  @type config_expander
  <config>
    @type tail
    #format none
    format ltsv
    time_format %d/%b/%Y:%H:%M:%S %z
    path /var/log/httpd/919/919-access_log
    pos_file /var/log/td-agent/919-access_log.pos
    tag 919-dev.apache.${hostname}
  </config>
</source>

<match 919-dev.apache.*>
  @type kinesis_firehose
  delivery_stream_name 919-logs
  region ap-northeast-1
  random_partition_key true
</match>

ちなみに、一番最初に読み込まれるconfigはこんな感じになっています。

$ vim /etc/td-agent/td-agent.conf
@include conf.d/*.conf

<match fluent.**>
  @type file
  path /var/log/td-agent/fluent.log
</match>

config に誤りが無いかを確認してtd-agentを再起動します。

$ td-agent --dry-run -c /etc/td-agent/td-agent.conf
2018-11-09 16:40:15 +0900 [info]: parsing config file is succeeded path="/etc/td-agent/td-agent.conf"
2018-11-09 16:40:15 +0900 [info]: starting fluentd-1.2.0 as dry run mode ruby="2.1.10"

$ /etc/init.d/td-agent restart
td-agentng td-agent:                                       [  OK  ]

kibana

これで設定は完了になります!
あとはAWSのElasticsearchにKibanaが用意されてるので、Kibanaで見たい条件などを入れれば可視化出来ます。
ちょっと見せられる部分が少ないのですが、イメージとしてこんな感じに入ってくると思ってもらえれば!

f:id:aimstogeek:20181109164739p:plain


そして今のままのアクセスログだとtime_formatがElasticsearchに無いので追加する必要があります。
具体的には下記のElasticsearchのデフォルトで用意されてるフォーマットに合わせるかこちらでフォーマットを作って時間を認識してもらう必要があります。
format | Elasticsearch Reference [6.5] | Elastic

最後に

リアルタイム性は無いですが、運用するコストがほとんどないのでとても楽にログの可視化が出来ます。
ただ、可視化することがゴールではなく、可視化して分析して次に繋げるが最終的な目的になります。
これからのエンジニアは分析能力も問われてくるってことですね!





\\一緒に『明日のはたらくを創る』仲間を募集中です!! //
919.jp

RPAツールを使って簡単にロボット作れるのか試してみた

こんにちは。入社1年が経ちました。パパ歴は4ヶ月、「こってぃ」でございます。

ここ数年、やたらと「RPA」ってワード見かけますよね。
でも見かけるだけで、実際に何が出来るのかよく分からんって人、結構いらっしゃるんじゃないかと思います。

私も全然知りませんでしたが、業務効率化を図れるなら、何かしら使えるかもしれんなと思い、とりあえず社内で一番RPAに詳しいおじさんになろうと試みました。

いろいろ調べてみると、メジャーどころのツールの中に、評価や研修目的であれば無料で使えるものがあるとの事なので使ってみました!

そう、UiPathのCommunityEditionです!!

www.uipath.com

今回は、RPAの1つである、「UiPath」を使ったら、自己学習のど素人が、どれだけ簡単にロボットが作成できるのかを検証してみようと思います。

読んで欲しい人

  • UiPathをほとんど使ったことがない人
  • 試しにUiPathのCommunityEditionを入れたものの使い方よく分からん人
  • 上司からRPA入れろやって圧かけられたけど、何が出来るんか全然分からん人
  • UiPathを使ってロボット作ってみたいけど、手始めに何を作ってみればいいか分からん人

今回設定してみるロボット

RPAのデモを見たことがある人なら一度は見せられたであろうあの作業。
そう、「Webサイトから情報を取得して、Excelに保存する」というプロセスを、UiPathを使って実装してみようと思います。

交通費精算処理と並ぶ2大RPAデモあるあるですよね←(知らんがな)

今回は価格.comのサイトより、macの売れ筋ランキングの商品名、URL、価格の一覧を取得してみますね。

細かい設定の話は今回しないので、そこはご了承ください。
ただ、設定の画面は少しお見せ出来るので、何か参考になれば嬉しいです。

事前準備

  • UiPAthのCommunityEditionのインストール
  • GoogleChromeExcelなどを利用するためのパッケージのインストール


サイトから情報を取得するために使用した機能 

  • ブラウザーを開く(Open browser)
    操作するURLをブラウザで開きます。

  • データスクレイピング(Data Scraping)
    マウスで指定したデータを取得します。

    データをExcelに出力するために使用した機能

  • Excel アプリケーションスコープ(Excel Application Scope )
    どのExcelを使うのかを指定します。
    ファイルが存在しない場合は作成することも可能です。

  • 範囲に書き込む(Write Range)
    保存したデータをExcelに書き込みます。

全力で作成してみた

どんだけ簡単にロボット作れるんじゃいって事で、
上記の機能を組み合わせて設定作業をしてみます。

  1. どのサイトを開くか設定する
    f:id:aimstogeek:20181101171736p:plain

  2. 取得するデータを選択する
    f:id:aimstogeek:20181101171957p:plain

  3. 取得したデータを確認する
    f:id:aimstogeek:20181101171824p:plain

  4. どのExcelに出力するか設定する
    f:id:aimstogeek:20181101171711p:plain

  5. 書き込み場所を設定する
    f:id:aimstogeek:20181101172123p:plain


    頑張って作った結果、2分程でデータ取得のロボットが作成されました!!
    本当は動画準備してたんですけどね。画像の羅列だと伝わらないこの簡単さ。。


ロボットを動かしてみる

いや、ほんとに出来てるの?って思いませんでしたか?
安心してください!完成しています!!

全力で作成したロボットの活躍をご覧ください。

f:id:aimstogeek:20181101183706g:plain


少し見にくいですが、最初は空のフォルダだったのが、
気づけばExcelが作成されているのにお気づきいただけるでしょうか。

そのExcelの中には、Webサイトから取得した情報が格納されているじゃないですか!
f:id:aimstogeek:20181101190910p:plain


ロボットに任せてしまえばかなりのスピードで処理出来てしまうんですね^^

所感

確かに僕みたいにプログラミングほとんどやってないような人間でも、
直感で簡単なロボットなら作成できるなぁと思います。

ただ、実運用に乗せるには、どうやってエラー対処するかとか、
前後のプロセスどう変えていくかとか、
結構クリアすべきハードルは高いのではないかなという印象です!

実際の業務は今回作成したロボットが行っているような、
単純作業ばかりではないですもんね・・

世の中でバズワードのように言われているRPAですが、
何が出来て、何が出来ないのかを正しく理解し、どこに活用するかを考えれば、
生産性向上に寄与出来るのではないでしょうか。

バズワードに惑わされることなく、自分がどんな価値を提供出来るのかを
きちんと把握した上で、今後仕事に取り組む必要がありますね。

子どもとお風呂入るために早く帰らなきゃ。業務効率化、生産性向上、興味あります。
(ほんとは飲みに行きたい)
じゃぁね。



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp