TECH PLAY

株式会社ラクス

株式会社ラクス の技術ブログ

935

こんにちは。開発エンジニアのamdaba_sk( ペンネ ーム未定)です。 前回の冒頭で、ちょろっと以下のように書きました。 「OWASP ZAPについて調べてみた」という記事を書きました。 単体テスト 中にこっそり使ってみようかと思っていたのですが、手元の環境ではポート待ち受けでエラーが出てしまって放置しています……。 この件について、実はポート番号を選べばローカルプロキシとして使えそうだということがわかったのでそのことで続報を、と思ったのですが。 いいタイミングでまたもあの人が目立ってくれましたね! 2018.kphpug.jp tech-blog.rakus.co.jp 先日開催された PHP カンファレンス関西 2018 に ラク スのエンジニアが登壇しました。我らが坂田くんがそのうちの一人として参加しています。 当日は私も見に行きました。開始前のえらく緊張してそわそわしている姿と、発表中の堂々と話す姿のギャップが激しかったのがすごく印象的でした。 というわけで、このブログへの次の投稿もこれをネタにするしかあるまいと思った次第です。例によって雑談に見せかけてまた坂田くんにインタビューしてみましたので、その時の話を今回は書こうと思います。 (※本人了承済み。ただし写真は気恥ずかしいのでやっぱりNGだそうです。ほんともう今さらな感じもしますが) なおイベントそのものと、弊社がこのイベントに公式に参加することになった経緯などについてはリンク先をご覧ください。 カフェスペースにて PHPカンファレンス 関西の開催された翌週、私はいい感じに話を聞けるタイミングを見計らっていました。坂田くんは何やら忙しそうで、なかなか昼食もいっしょに行けない様子。無理に時間を作ってもらうのも悪いのでどうしたものかと思っていたところ、ちょっとした休憩でも取るつもりなのかコップを持って執務室を出ていく坂田くんの姿が。私はチャンスとばかりに後を追いました。 ペンネ ーム未定 (以後 ペン未 )「というわけでお話をしましょう」 坂田くん (以後 坂田 )「何が『というわけ』なんだ……。ていうかそのメモ紙とペンは何? またブログのネタにされるやつ?」 ペン未 「ちっ、君のような勘のいいガキは……」 坂田 「嫌いだというなら無理にお話しなくてもいいのだけど」 ペン未 「いやいや好きだから。もうめっちゃ好き。察しがよくて助かるわ~」 スピーカーディナーのこと ペン未 「前日にも業務後に何か行ってたよね?」 坂田 「スピーカーディナーっていうのに参加してた。当日はお互い発表があって話す時間が取れないからだと」 ペン未 「飲み会自体あんまり好きじゃないって言ってたのによく行く気になったね」 坂田 「せっかくの機会だからと思って。社外の人と交流する機会もあんまりないし」 ペン未 「どんな感じだった?」 坂田 「ネットの知り合いとのオフ会って感じだった。みんな私服だし、『もしかして、○○さんですか?』みたいな声のかけ方とかも。全員集まるまで適当にだべってる感じもまさしく」 ペン未 「へー。その場にいた人はみんなお互い初対面だった感じ?」 坂田 「いや、けっこう知り合いって感じの人も多かったかな。毎回登壇してるような人とか、現運営、元運営みたいな人達はお互いに知り合いで、むしろ私みたいな新参者の方が珍しかったような印象。それもあってちょっと話に加わりづらい感じがした」 坂田 「でも実行委員長の人は席も近かったしけっこう話せた。そういえば今回はスポンサーの応募も例年よりすごく多かったみたいで、しかも初めてスポンサーするってところも多かったらしい。それで問合せがいっぱい来て対応が大変だったとか」 ペン未 「そうなんだ。それはちょっと申し訳なかった感じがあるね……」 当日のこと ペン未 「発表直前はめっちゃそわそわしてたよね。坂田くんでも緊張するんだって思った」 坂田 「私だって緊張ぐらいします。ビアバッシュの発表のときだって緊張してるんですが」 ペン未 「全然そうは見えない」 坂田 「それ他の人にも言われたんだけど。なんでそう見られているのか……」 ペン未 「それは君がそういう振る舞いをしているからとしか言いようがないけど。でもあの時はことさら緊張してたってことでしょう?」 坂田 「まあね。発表が始まってからは多少落ち着くんだけど、発表前の5分間は結構つらかった」 ペン未 「発表前にパソ コントラ ブルもあったしね」 坂田 「そうそれ。私の持ってる唯一のノートパソコンが元XPで現 Linux 搭載の古いやつで、もともと使えるかどうかわからないねって話はしてたのだけど。 VGA のケーブルがあったから自分のパソコン繋げられると思っのに、いざ繋げてからパソコン起動させてみるとなぜかログインできなくなっているという。わけが分からなかったし時間も無かったから急遽パソコンを貸してもらった」 ペン未 「あせってパスワードミスってただけでは」 坂田 「間違ってはいなかったと思うのだけどなあ。後で VGA を外してから同じようにログイン試行してみたら普通に入れたし」 ペン未 「まあでも発表始まったら急にスイッチ入った感じだったよね。なんか練習よりも一段と分かりやすくなってたような気がするし。何か準備してた?」 坂田 「別に直前に特別なことはしてない。スライド見返すとかその程度で」 ペン未 「それで話せるとかすごいな。時間もほぼぴったりだったよね」 坂田 「時間は、実はちょっと遅いかもって思ってた。一回時計を見たのだけどいつ始まっていつ終わらないといけないのかわからくなって、もういいやって」 ペン未 「まじで。それめっちゃ不安じゃない?」 坂田 「今思うと不安なんだけど、発表中はなぜか時間のこと忘れてられたんだよね。不思議なことに」 坂田 「でも発表中に出ていっちゃた人がいたのは残念だったなあ」 ペン未 「あー、そういえばいたね。でもそれって仕方ないんじゃない?」 坂田 「そうかもしれないけど。でも今思い返してみると、確かに『Laravelの良かったところ』のセクションは確かに聞いててつまらないかもとも思うんだよね。Laravelの宣伝してるだけみたいな感じになってて。といってもどう変えればいいのかよくわからないのだけど」 ペン未 「まあそれは今後の課題ということで。また同じような発表をする機会があればその時考え直してみるといいですね」 坂田 「そうですね。そう頻繁に同じような発表をすることになっても困るけど」 そして仕事はつづく まだまだ話は引き出せそうでしたが、息抜きには十分なほどに話をしていました。 私たちは話をするうちに飲み干してしまったお茶を入れなおし、自席に戻りました。 これからは会社としても PHPカンファレンス のようなイベント、勉強会への参加を推進していくとのことなので、坂田くんに活躍してもらう機会が今後もたびたびあるのでしょう。 私は心の中でエールを送りつつ、先ほど聞いた話をブログにまとめるべくキーボードをたたくのでした。
アバター
@kawanamiyuu です。以前の 投稿 でお知らせしましたとおり、先日開催された PHP カンファレンス関西 2018 に ラク スのエンジニアが登壇しました。 また、 ラク スはシルバースポンサーとしてイベントに協賛いたしました。 イベント概要 日時 : 2018 年 7 月 14 日 (土) 会場 : グランフロント大阪 公式 HP : https://2018.kphpug.jp/ 2018.kphpug.jp 登壇 チャットディーラーの高速開発を支える Laravel(30分セッション) speakerdeck.com (本人コメント) PHP カンファレンスに限らず技術系のイベント初参加でした。最終的に私が登壇することになりましたが、会社としての参加が決まってからネタ出し、アウトライン作成、資料作成、発表練習等、最後までチームで準備を進めました。当日もちろん緊張はしましたが、不安を感じずに発表ができたのはチームのみんなのおかげです。 また発表以外の時間では聞く側としても楽しめましたし、勉強にもなりました。これからはもっと積極的にこういった社外のイベントや勉強会に参加してみようかなと思い始めています。 mixed 型なんてけしからんと社内チャットでつぶやいたら炎上した(ライトニング トーク ) 私、 @kawanamiyuu も実はライトニング トーク が採択されましたので話してきました。 speakerdeck.com (本人コメント) 今回がカンファレンスでの初 LT 体験でした。ネタはけっこう前から温めていて、社内のビアバッシュとかで話そうかと思っていましたが、今回弊社のエンジニアが 30 分セッションにも登壇するし、LT もやったれ!と思って応募したら採択されて、ドキドキしたけどとても楽しめました。 イベント 2 日前にオフィスで行った公開発表練習では 1 分半も時間が余ってしまい焦りましたが、自主練の結果、本番では時間ちょうどくらいで終われて安心しました。ほんとうはドラを鳴らされてみたかったです (^m^) 所感 今回、 ラク スにとって初めての技術イベントへの協賛および登壇でした *1 。いろいろ勝手が分からず、ちゃんとイベント当日まで漕ぎ着けることができるか不安でしたが、担当サービスを横断した登壇推進チームで協力して資料作成や発表練習を行い、当日、自分の会社のエンジニアが目の前で発表している姿を見てとても嬉しくなりました。 今後も継続して技術イベントに登壇していけるよう、また、コミュニティに貢献していけるよう、開発組織のレベルアップやエンジニアリング文化の 醸造 に取り組んでいきたいと思います。 *1 : これまでも弊社のエンジニアがプライベートで技術イベントで登壇することはありましたが、開発部の公式な取り組みとして登壇や協賛を行ったのは初めてでした。
アバター
Google API とは、 Google が提供するのサービスやプラットフォームを扱える API です。 これらの API を使いこなすことで、 Google のサービスを自身のアプリケーションへ組み込み、様々なことを実現できます。 ここでは、 Gmail を扱う API と、GoogleDriveを扱う API を PHP アプリケーションから利用する例に紹介します。 (内容は2018年7月現在の情報です。) この記事の内容 今回は、 Google API のガイドに記載されているQuickstartを用いて、 OAuth認証 を行い API を実行します。 *1 概要は以下の図のような感じです。 この記事では、「その1:プロジェクトの用意」で、 Google Cloud プラットフォームにプロジェクトを用意し、 「その2:認証情報の作成」にて、OAuthに必要な認証情報ファイルの作成、 「その3: API を叩く」でサンプルプログラムを用いて上記図の①~④に示す認証処理と API の実行を行います。 少し内容が長くなってしまったので、目次を見て必要な情報のところをご覧ください。 この記事の内容 その0:Googleアカウントの用意 その1:プロジェクトの用意 プロジェクトを作成する プロジェクトで使用するAPIを指定する その2:認証情報の作成 OAuth 2.0 クライアント ID を作成する OAuth 2.0 同意画面を設定する その3:APIを叩く Google Client Libraryのインストール 認証情報をダウンロード サンプルプログラムの作成 APIクライアントオブジェクトの取得 利用するAPIのサービスオブジェクト作成 サンプルプログラムの実行 (余談ですが、恥ずかしながら、この記事を書くまで、私は「OAuth」を、他のシステムで認証するから「Other Auth」の略だと思っていました。正しくは「Open Auth」ですね。。。) その0: Google アカウントの用意 言わずもがな、 API を利用して操作する Google アカウントが必要です。 詳しい方法は割愛。作成したら、ログインしてください。 その1:プロジェクトの用意 API を利用するため、 Google アカウントに紐づいたプロジェクトを作成する必要があります。 プロジェクトを作成する 使用する Google アカウントにログインしたら、 Google Cloud プラットフォーム にアクセスしましょう。 左上の ハンバーガ ーメニューから、「IAMと管理 > リソースの管理」を選択します。 リソースの管理画面に、「プロジェクトを作成」リンクがあるので、クリックします。 その後の画面でプロジェクト名を入力し、「作成」します。 これでプロジェクトが作成できました。 (少し画面表示に時間がかかることがあります。) プロジェクトで使用する API を指定する 次に、作成したプロジェクトで使用する API を指定します。 Google Cloudプラットフォームの画面上部から、先ほど作成したプロジェクトを選択した状態で、「 API とサービス > ライブラリ」を選択します。 ここでは、使用することができるGoogleAPIライブラリを選ぶことがあります。 どの API も面白そうですが、とりあえず今回は「 Gmail 」と「GoogleDrive」を利用するので、まず、「 Gmail API 」を探し、「有効にする」を選択します。 これで、このプロジェクトで Gmail API を有効にすることができます。 なお、この画面からは Gmail API のガイドやリファレンスなどのドキュメントを閲覧することができます。 同様に、「 Google Drive API 」を、 API ライブラリから探し、有効にします。 これで、使いたい API を有効にしたプロジェクトが作成できます。 その2:認証情報の作成 さて、プロジェクトは準備できましたが、 API を叩くにあたり、認証が必要です。 次は認証情報を作成し、自分が作成するアプリケーションからのリク エス トのみを受け付けるようにしましょう。 Google Cloudプラットフォームの画面上部から、先ほど作成したプロジェクトを選択した状態で、「 API とサービス > 認証情報」を選択します。 その後、「認証情報を作成」から「OAuth クライアント ID の作成」をクリックします。 OAuth 2.0 クライアント ID を作成する OAuthの設定をするにあたり、まずは API を叩くアプリケーションの種類を指定します。 今回は、「その他」を選んでください。 API ガイドに載っている「Quickstart」を使うためには、「その他」を選ぶ必要があります。 選択したら、クライアントの識別名を入力し、作成します。 OAuth 2.0 同意画面を設定する 次に、 OAuth 2.0 同意画面の設定を行うため、 「認証情報を作成」から「OAuth 2.0 同意画面」を選択します。 OAuth 2.0 同意画面とは、設定している API によってユーザのデータへアクセスするときに、表示される画面で、データへのアクセス前に認証を行う画面のことです。 この画面で認証を行うため、メールアドレスと、表示する任意のアプリ名を指定します。 ここで指定したアプリ名は、以下のように認証画面にて表示されます。 設定出来たら「次へ」ボタンを押下します。 これで認証情報の作成が完了しました。 ハンバーガ ーメニューから、「 API とサービス > 認証情報」を選択すると、認証情報が作成できていることが確認できます。 その3: API を叩く 次に、アプリケーションから Google API の認証を行い実際に API を実行します。 ここからは Gmail API の公式ドキュメントを参考にしながら進めましょう。 「 API とサービス > ライブラリ」から「 Gmail API 」を探し出し、「 チュートリアル とドキュメント」の「Learn more」をクリックし、公式ドキュメントを表示します。 表示したら、「ガイド」タブの「Quickstarts」から、使用する言語を選択します。 今回は PHP で説明します。他の言語で API を扱いたい場合は、対象の言語を選択して、頑張ってください。(←丸投げ) PHP のQuickstartでは、Step1~Step4の手順が紹介されていますが、Step1の API を有効化する手順はもう完了しているので、Step2から行います。 Google Client Libraryのインストール QuickstartのStep2です。 Google の API を使用するために、 Google Client Libraryをインストールする必要があります。 PHP の場合、composerを用いることで簡単にインストールできます。 composer require google/apiclient:^2.0 認証情報をダウンロード 先ほど作成したOAuth2.0クライアントの認証情報が記載された JSON ファイルをダウンロードします。 Google Cloud プラットフォームのメニューから、「 API とサービス > 認証情報」を選択し、先ほど作成したOAuth2.0クライアントのダウンロードアイコンをクリックすることで、ダウンロードできます。 ダウンロードしたクライアントの認証情報ファイルは、次のサンプルプログラム実行で使います。 サンプルプログラムの作成 QuickstartのStep3です。 quickstart.php という名前で以下のコードを保存します。 <?php require __DIR__ . '/vendor/autoload.php' ; if ( php_sapi_name () != 'cli' ) { throw new Exception ( 'This application must be run on the command line.' ) ; } /** * 指定した権限が付与されたAPIクライアントを返す * @return 権限が付与されたGoogle_Clientオブジェクト */ function getClient () { $ client = new Google_Client () ; $ client -> setApplicationName ( 'Gmail API PHP Quickstart' ) ; $ client -> setScopes ( Google_Service_Gmail :: GMAIL_READONLY ) ; // ※1:スコープの設定 $ client -> setAuthConfig ( 'credentials.json' ) ; // 取得したJSONファイルのパス $ client -> setAccessType ( 'offline' ) ; // クライアント証明書ファイルが存在しない場合(初回実行時)は // 認証情報JSONファイルを用いて取得する。 // 存在する場合(2回目以降の実行時)は、クライアント証明書を読み込む。 $ credentialsPath = 'token.json' ; // クライアント証明書ファイルのパス if ( file_exists ( $ credentialsPath )) { $ accessToken = json_decode ( file_get_contents ( $ credentialsPath ) , true ) ; } else { // ユーザからの認証を行う $ authUrl = $ client -> createAuthUrl () ; printf ( "Open the following link in your browser: \n %s \n " , $ authUrl ) ; print 'Enter verification code: ' ; $ authCode = trim ( fgets ( STDIN )) ; // 認証コードをアクセストークンに変換する $ accessToken = $ client -> fetchAccessTokenWithAuthCode ( $ authCode ) ; // クライアント証明書をファイルに保存する if ( ! file_exists ( dirname ( $ credentialsPath ))) { mkdir ( dirname ( $ credentialsPath ) , 0700 , true ) ; } file_put_contents ( $ credentialsPath , json_encode ( $ accessToken )) ; printf ( "Credentials saved to %s \n " , $ credentialsPath ) ; } $ client -> setAccessToken ( $ accessToken ) ; // クライアント証明書が有効期限切れの場合は更新し、ファイルへ保存しなおす if ( $ client -> isAccessTokenExpired ()) { $ client -> fetchAccessTokenWithRefreshToken ( $ client -> getRefreshToken ()) ; file_put_contents ( $ credentialsPath , json_encode ( $ client -> getAccessToken ())) ; } return $ client ; } /** * メイン処理 */ // APIクライアントを作成し、サービスオブジェクトを作成する $ client = getClient () ; $ service = new Google_Service_Gmail ( $ client ) ; // 使用するAPIごとのサービスオブジェクトを作成 // Print the labels in the user's account. $ user = 'me' ; $ results = $ service -> users_labels -> listUsersLabels ( $ user ) ; if ( count ( $ results -> getLabels ()) == 0 ) { print "No labels found. \n " ; } else { print "Labels: \n " ; foreach ( $ results -> getLabels () as $ label ) { printf ( "- %s \n " , $ label -> getName ()) ; } } 上記コードでは、大きく分けて、以下の処理を行っており、一部 API の実行目的によって変更する必要があります。 API クライアントオブジェクトの取得 クライアント証明書の取得と更新 API クライアントオブジェクトの作成 利用する API のサービスオブジェクト作成 API クライアントオブジェクトの取得 API を実行するクライアントのオブジェクトを作成します。 作成時には、先ほどダウンロードした、クライアントの認証情報を利用して、クライアント証明書を取得し、ファイルに保存します。 クライアント証明書には、特別な設定をしない限り利用期限があり、利用期限が過ぎていた場合は更新されます。 また、クライアントオブジェクトを作成する際に、「スコープ」を指定します。 「スコープ」は、そのクライアントが、 API を用いて「どこまでの操作が実行できるか」を指定するものです。(コード内コメント※1) スコープは API を使って何を実行したいのかによるため、場合によって書き換える必要があります。 スコープは各サービスオブジェクトの定数を指定するか、 API ガイドにある URI を指定することで、設定できます。 Gmailのサービスオブジェクト定数一覧 URI一覧 たとえば、 Gmail でメールを送信したい場合は以下の通りに書き換えます。 $client = new Google_Client(); $client- > setScopes(Google_Service_Gmail::GMAIL_SEND); Google Drive でファイルをアップロードしたい場合はこんな感じ。 $client = new Google_Client(); $client- > setScopes(Google_Service_Drive::DRIVE); 複数のスコープを指定する場合は、定数を配列に格納することで可能です。 $client = new Google_Client(); $scopeList = array(Google_Service_Gmail::GMAIL_SEND, Google_Service_Drive::DRIVE); $client- > setScopes($scopeList); 利用する API のサービスオブジェクト作成 取得したクライアントオブジェクトを利用して、各サービスの API を扱うためのサービスオブジェクトを作成します。 ここは各サービスごとに異なるため、ドキュメントをご覧ください。 作成したサービスオブジェクトを使うことで、そのサービスの API リク エス トが可能になります。 サンプルプログラムの実行 作成したサンプルプログラムを コマンドライン から実行します。 $ php quickstart.php 実行すると、URLが表示され、入力待ちになりますので、表示されたURLへブラウザからアクセスしてください。 アクセスすると、認証情報の作成時に設定したOAuth 2.0の同意画面が表示されますので、画面に従って実行を許可してください。アクセス トーク ンが表示されるので、 コマンドライン にコピペすることで、クライアント証明書を取得することができます。 次回実行時からは、この作業で取得したクライアント証明書をもとに認証を行うため、同意画面での実行許可は不要になります。 また、サンプルプログラムは Gmail の API ガイドから取得しましたが、この認証で今回作ったプロジェクトへの認証ができるので、他 API も利用可能になります。 これで API を実行する準備はできました。 あとは各サービスオブジェクトのメソッドを使って Gmail を送ったり、 Google Drive を操作したりできます。 例として、 Gmail でメールを送るときのコードを記載します。 *2 /** * Gmailを送信する */ public function sendGmail($client) { $data = ""; $data .= "To:xxxx @xxx .xxx.xx\n"; $data .= "Subject: メールたいとる\n"; $data .= "\n"; // ヘッダーと本文を区切る空行 $data .= "本文"; $data = base64_encode($data); //base64エンコード $service = new Google_Service_Gmail($client); $msg = new Google_Service_Gmail_Message(); $msg- > setRaw($data); $result = $service- > users_messages- > send('me', $msg); return $result; } エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com *1 : https://developers.google.com/gmail/api/quickstart/php?hl=ja *2 : https://sepg.biz/2018/03/23/post-564/
アバター
はじめに ラク スエンジニアのstrongWhiteです。今回はSwiftのextensionとprotocolについて書きます。 私がSwiftを勉強し始めたころは、この2つの概念がよくわかっていませんでした。 2つとも似ているようで全く違うので、両者について簡単にまとめてみます。 extensionとは extension(拡張)とは、特定のクラスや構造体、データ型など、名前はそのままにプロパティやメソッドを追加する機能です。 Java でいうと「継承」と似ています。 Java の「継承」はクラスのプロパティやメソッドを引き継いだ別名のクラスを作るのに対し、Swiftの「拡張」は名前はそのままになるのが特徴です。 extensionの使い方 それではextensionを使った簡単なプログラムを書いてみましょう。今回は データ型 の拡張を行ってみます。 extensionを使って、Swiftに標準で備わっているデータ型(例.Int、String)を拡張してみます。 extension String { func isLongString () -> Bool { if self .count <= 20 { return false } return true } } let text = "RAKUS Developers Blog" print(text.isLongString()) // 実行結果:true サンプルプログラムでは、String型を拡張し、文字数が20文字以上かどうかを判別する簡単な関数を定義しています。 このように、extensionを使えば、変数の値の比較や加工処理を、既存のデータ型にメソッドを追加することで実現できます。 私は今まで「データ型の定義を拡張できる」ような言語に出会ったことがなかったので、この辺りはとても新鮮な感覚でした。 protocolとは お次はprotocolです。protocolとは、クラスの挙動や振る舞いを決めたものです。クラスでは、プロパティや挙動を細かく記述していきますが、protocolでは、インタフェースのみを定義します。実際の挙動はprotocolを採用するクラス側で記述します。 protocolの使い方 ではprotocolを使った簡単なプログラムを書いてみます。今回は 列挙型 にprotocolを適用してみます。 protocol BaseProtocol { var type : String { get } } enum Blood : BaseProtocol { case AB case A case B case O var type : String { switch self { case .AB : return "AB型" case .A : return "A型" case .B : return "B型" case .O : return "O型" } } } print( "あなたの血液型は" + Blood.AB.type + "です" ) // 実行結果:あなたの血液型はAB型です サンプルプログラムでは、血液型を列挙型で定義してみました。また、ベースとなるprotocolとして、 BaseProtocol (そのままですが)を採用しています。 また、列挙型のほうで、 BaseProtocol に定義してある type 変数を宣言しないと コンパイル エラーになります。 最後に Swiftのextensionとprotocolについて、違いがよくわかっていなかったので勉強してみました。 それぞれ身近な Java を例に挙げて、extension→継承、protocol→インタフェースであると解説しましたが、Swiftを知らない人でも少しはイメージができたのではないでしょうか。 皆さんもこの辺りを勉強してみるとよりSwiftが面白いと感じるかと思います。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
id:radiocat です。中学のとき美術の先生に美術科への進学を勧められたことがありますが、それ以降は描いた絵を褒められたことがありません(後述)。 アジャイル な開発チーム以外でも近年は「ふりかえり」を行っているチームは多いのではないでしょうか? 従来型の 開発プロセス では「反省会」とも呼ばれますが、これまでやってきた事を振り返って未来に向けた改善アクションを見つけるという点ではどちらも同じです。そして、そのような改善に向けて振り返る会議の前にまず行うのが「チェックイン」です。 チェックインとは? ふりかえりの「場を設定する」アクティビティの1つで、『 アジャイル レトロスペクティブズ』という書籍で紹介されています。 アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き 作者: Esther Derby , Diana Larsen オーム社 Amazon 目的 この書籍の中で、チェックインの目的は以下のように説明されています。 余計なことを考えずに、レトロスペクティブに集中してもらう。レトロスペクティブから何を得たいのかを明確にしてもらう。 ふりかえりの場に意識を集中してもらい、チームでどういう議論がしたいのかを発信して参加者の目線を合わせるための作業なのです。 やりかた 簡単な質問を1つする メンバーは順番に質問に答える たったこれだけです。例えば、ふりかえりの ファシリテーター が「今の気持ちを一言で答えてください」という質問をして、メンバーが「嬉しい」とか「悲しい」などと順番に答えます。 「場を設定する」ということ チェックインのように「場を設定する」ことについて『 アジャイル レトロスペクティブズ』の中で次のように説明されています。 部屋にいる全員に口を開いてもらう。最初に喋らなかったら、ずっと何も喋らなくてもいいという暗黙の了解を得たと思ってしまう。レトロスペクティブの肝はグループで考え、一緒に学んでいくことなので、全員参加が不可欠である。 たった一言ですが、質問に答えてもらうだけで全員に参加意識を持ってもらえます。また、答えた内容によってその人がどういう気持ちで会議に臨んでいるのかを知ることができます。例えば「嬉しいと感じているのは自分だけかもしれない」と思うと発言がしにくいかもしれませんが、全員の気持ちを知っていればそのような不安が減って発言のハードルが下がります。 つまり全員が一言ずつ喋ることで、その人自身の発言のハードルを下げるとともに、周りのメンバーの発言のハードルを下げることにも繋がるのです。 場を設定するアクティビティ このような場を設定するアクティビティには様々なやりかたがあります。我々のチームでもいくつか実践してみたので、それらの一部を紹介します。 One Word 今の気持ちを一言で表現してもらいます。実際にやってみた結果は次のような回答でした。 一言では言い表わせれなかったメンバーもいますが、そういう気持ちなんだなと受け止めます。逆に一言だと意図がわからないものもあります。例えば「早い」は開発スピードのことなのか、作った機能のことなのかわかりません。ふりかえりの目線を合わせるためにも、必要に応じてどういう意味なのか聞いてみても良いでしょう。ただし、まだ場を設定するタイミングなので議論に発展するようならいったん止めてあとで議論するようにします。 漢字1文字 今の気持ちを漢字1文字で表現してもらいます。このケースでは順番に回答していくうちに、他のメンバーと被らないようにと、色々考えて回答するようになって後半のメンバーが苦戦するというせめぎ合いも起こりました。 自分の気持ちに適した漢字を選ぼうとすると意外と難しく、色々考えることでふりかえりに向けて集中できる効果もあります。One Wordと同じで意図がわからない漢字の場合はなぜその漢字なのか聞いてみても良いでしょう。 Happiness Rader 今の気持ちを顔文字で表現してもらいます。この時はどんな顔かを聞いて ファシリテーター がホワイトボードに書きました。 参加者に自分で書いてもらっても良いですが、「どんな顔ですか?」と聞くことでどんな気持ちなのかがわかります。ただ、言葉で表現された気持ちを絵で表さなければならないので、 ファシリテーター の絵心も場の設定に影響しそうです… 絵の得意なメンバーが見かねて代わりに書いてくれました。絵心がある人が描くほうが、参加者も今の気持ちを言葉で表現しやすいかもしれません… 3 dots 今の気持ちを3段階のドットで表現してもらいます。短時間かつシンプルに表現できるのが最大のメリットです。 顔文字と違って最速で表現できますが、なんとなく物足りなさはあります。3種類しかないので複雑な気持ちを表すことはできません。チームが複雑な課題をたくさん抱えているような場合は、みんな1ドットという回答でそれぞれが抱えている気持ちの違いはわからないという結果になる可能性があります。 Good & News 良かったことと新しい気づきを共有してもらいます。 前向きな意見を集めるような場の設定に有効です。ふりかえりで課題がたくさん出ることが予想される場合にあえて最初に前向きな意見を求めてみるという使い方もあります。気付きの共有はやや時間が長くなりがちなので時間が少ない場合には向いていないかもしれません。 希望と懸念 ふりかえりに対する希望と懸念事項を共有してもらいます。 参加者それぞれがふりかえりをどういう場にしたいかが比較的わかりやすく表現されます。ただ、これも少し時間がかかるアクティビティです。 以降は我々のチームではまだ試したことはありませんが、書籍等で紹介されているものです。 DPA (Design the Partnership Alliance) 決め事を作ります(どんな雰囲気で話すかなど)。 事前にその場の雰囲気をどうするかを参加者で話し合って決めるので、スムーズに議論に入れそうです。 Keep+Wakattakoto 良かったことと分かったことを共有してもらいます。 Good & Newsと似ていますが、 KPT のKをより意識した場の設定ができるかもしれません。 連想ゲーム 起きたことを一言づつ隣の人に連想ゲームします。 漢字1文字と同じで、考えることで意識を集中することができそうです。また、ゲーム感覚で場を和ませる効果もありそうです。 おわりに 我々のチームでは、これらのアクティビティの中から1つを参加したメンバーに選択してもらっています。参加者が主体的に考えたり選択してもらうことで、ふりかえりの場が設定されます。 このような場を設定するアクティビティはふりかえりだけのための手法ではありません。議論に集中するために参加者同士で意識合わせをすることが目的なので、ふりかえり以外の会議でも活用できる場面はあります。 会議の場で次のような課題を感じたことはないでしょうか? 発言する人が少ない 自由な意見が出てこない いつも同じ人の意見でチームの方針が決まる もし、このような課題を感じたら「場を設定する」ことからはじめてみると良いかもしれません。 参考 ふりかえりワークショップ~実践&実践~ - Speaker Deck エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに こんにちは、新卒で入って入社3年目のnorthmkyです。 いままでの投稿では yumコマンド についてや 文字コード など実業務でも役立つ基礎知識をまとめたものを書いていましたが、今回はプライベートで Google Apps Script、略称GASに触れたのでご紹介したいと思います。 題名を「5分で理解する」などと自身でいうのもなんですが巷でよくあるキャッチーで怪しい、ほんまかいな...というようなものになっておりますが、嘘ではないと思います。 ただ前提として JSの経験がある 必要あります。逆に言えば WEB界隈でJSを触ったことがある方は学習コストがほぼ0になります。本記事を読めばやりたいことはすぐ書けます。 理由としては JSと パラダイム がほぼ一緒 JSと文法がほぼ一緒 標準でついているメソッド名が直感的でわかりやすい の3点です。 ほぼ同じ思想なので、あとは特有の押さえておくべき用語と スクリプト と操作するアプリ画面の対応関係がわかれば書けるようになります。 それでは前置きはこのくらいにして紹介に入りたいと思います。 Google Apps Script(GAS)とは 「 Google の各種アプリ( Google スプレッドシート / Google ドキュメントなど)をアプリ内ではなく外から操作できるJSライクな プログラミング言語 」です。 エクセルに対する VBA の関係と一緒です 1 。 実現できることの例としては、指定時間になったら特定のセルの値を読み出して外部アプリに渡す bot であったり、 スプレッドシート だけでなく googleカレンダー にまとめてスケジュール登録したり、などなどができます。 2 色々できるのですが、本記事では読者のみなさんに馴染みがあると思われる スプレッドシート を題材にします。 早速GASを理解する GASでは操作対象のアプリをオブジェクトとして扱います。 スプレッドシート の場合、覚えるべきオブジェクトは下記3点のみです。 Spreadsheetオブジェクト Sheetオブジェクト Rangeオブジェクト アプリと スクリプト 内のオブジェクトは下図のような関係性になっています。 ウィンドウ左はおなじみの スプレッドシート 、右はGASです。 図の スクリプト は「特定のセル範囲に値を入れる」処理をします。 実行すると下記のようになります。 好き、という文字列が指定したセル範囲(= range )に格納されました。 どうでしょうか、説明はこれだけです。 値を入れるというだけの処理の紹介ですが、これだけでもう スプレッドシート を自分の好きなように操れる気がしないでしょうか。 特別な文法を覚えたりする必要もありません。 ここでは記載していませんが、分岐/繰り返しなど基本構文はもちろんありますし、標準メソッドもあるので安心です。 「いやメソッドいちいち調べる感じじゃ...?」と思われた方、安心してください。 こちらの標準エディタは補完機能付きなので、適当にメソッド名を打っても実現したいことができるメソッドを見つけられる確率が高いです。メソッド名がわかりやすい...素晴らしい... おわりに GASの超入門として、 スプレッドシート に対して処理を行うことを通して、GASをどのように書けるかをお伝えしました。 今回はお話しませんでしたが、webAPIを叩く機能も標準でありますし、 google 本家、またそうでない人によるたくさんのGAS用ライブラリも github で公開されています。 ですので twitter /slackBotも 開発環境構築なしで Google アカウントがあれば誰でも作成できる という敷居の低さも魅力的なGAS、皆さんも試してみませんか? 題名を裏切らない内容になっていれば幸いです。 付録: スクリプト 作成〜実行の簡単な流れ スクリプト 作成方法 ツール をクリック スクリプトエディタ をクリック これで スクリプト が立ち上がります。 実行方法 Ctrl + S ... スクリプト 保存 Ctrl + R ... スクリプト 実行 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com やや過大表現です。厳密にはGASは、エクセルに対する VBA のような、どこかのbookに紐付いて動く「Container Bound Script」と紐付かず単独で動く「Standalone Script」の2種類があるので厳密な表現ではないです。本記事では「Container Bound Script」のみを扱いますのでこのように表記しました。 ↩ ここで私は基礎を学びました。他にもいろいろな実例を平易に書いてありとてもわかりやすいです。 https://tonari-it.com/google-apps-script-manual/#toc2 ↩
アバター
こんにちは。west-cです。 早いもので 1エントリ目の記事 から1年が経とうとしており、自チームにも今年の新卒メンバーが配属されました。 そこで今回も、今年入社の新米エンジニアの方を対象に、個人的に業務でよく使うツールを紹介したいと思います。 私自身もまだ4年目で新米に属する部類ではありますが、少しでも業務効率化に寄与できれば幸いです。 WinMerge WinMerge 日本語版 テキストファイルの差分比較・マージを行える有名なソフトウェアです。 修正前後の差分チェックを行い、意図通りの修正となっているかを確認するために利用しています。 目diff *1 ・目 grep は特殊な訓練を受けた上で実施しないと思わぬ事故に繋がります。正確な結果を得るためにツールを活用しましょう。 Sublime Text Sublime Text - A sophisticated text editor for code, markup and prose ソースコード エディタです。 コーディングは IDE を利用しますが、ちょっとした スクリプト を見たり 正規表現 を用いた検索・置換をサクッと行いたい場合に利用しています。 Visual Studio Code や Atom などのエディタでも同様のことは行えますが、動作が一番軽快なため私はこのエディタの利用頻度が一番多いです。 指定フォルダ下の全ファイル文字列検索( grep のようなもの)も行えます。 Awesome Screenshot Awesome screenshot ブラウザの画面キャプチャが行えます。 撮影範囲の指定や文字挿入などある程度の画像編集も行えるため、そのまま Mattermost *2 や Redmine に貼り付けて利用しています。 ScreenToGif (↑実際に動画撮影をした様子) ScreenToGif - Record your screen, edit and save as a Gif or video 画面を動画撮影し、GIF形式で保存できます。 自チームでは発見したバグを Redmine のチケットで管理しています。 バグ報告時に再現手順を文章で説明するのが難しい場合には、その手順を撮影したGIF画像もチケットに添付しています。 動画だと操作手順が分かりやすく認識齟齬も起きにくいため、チーム内でもよく利用されています。 Boostnote Boostnote | Boost Happiness, Productivity, and Creativity. Markdown 形式でメモを取ることができます。 日々のタスクやちょっとしたtipsなど、基本的にここで一元化するようにしています(手帳に取ったメモもこちらに清書しています)。 タグ付けやフォルダ分け・検索も行えるため過去のメモも追いやすく、「メモした記憶はあるけれど、どこに書いたか忘れた」という事態がほぼ無くなりました。 Postman Postman | API Development Environment WebAPIに対して GUI で直感的にリク エス トを送信できます。 少し API のテストを行いたい場合に curl コマンドを打つことなくサクッと実施できるので重宝しています。 自分で作成したリク エス ト情報をインポートすれば、プログラムに詳しくない方でも簡単に API のテストやお試しができる点も魅力です。 おわりに これは個人的意見ですが、 面倒なこと・正確さが求められることはコンピュータに任せる という意識はエンジニアとして重要だと思っています。 (「 プログラマ の三大美徳」という有名な言葉にも繋がると思います) ぜひ非効率だと思う部分があればツールの導入等で効率化を試みてください。 そして、場合によっては自分で作成してみるとさらに良いと思いす。 自分が欲しかったものを自分の手で作ることができるのは、エンジニアならではの醍醐味だと思いますよ! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com *1 : Linux コマンドの diff 相応の差分比較を目視で行う特殊技能のこと。目 grep も同様。 *2 : チャットツールとして有名な Slack に似たツール。自チームではチャットツールに Mattermost を導入しています。
アバター
はじめに 新卒2年目エンジニアのkasuke18と申します。 今回はLINEでメッセージを送信することで Twitter 検索を行うLINE Bot を作成してみましたので、作成の流れや実際のコードを記載します。使用言語は PHP です。 もくじ はじめに 構成 必要なもの 実装例 メッセージの取得 Twitterで検索 検索結果のパース LINEに送信 おわりに 参考文献 構成 今回はLINEの API と Twitter の API を利用します。また、LINEで送信されたテキストに対して処理を行うWebhook スクリプト を設置する SSL 対応のサーバが必要なため、HEROKUを使用しています。 イメージとしては以下のようになります。 必要なもの LINE Messaging API Twitter REST API HEROKU Twitter 連携パッケージ mpyw/cowitter API を利用するまでの流れについては、LINE Messaging API は 公式サイト に詳しい説明が記載されています。 また、 Twitter REST API は公式サイト上のどこに記載されているか発見できませんでしたが、検索すればそのあたりのことが書かれている導入記事が数多くあるので省略します。 HEROKUの使用方法については当ブログに記事がありますので、ぜひそちらをご参照ください。 実装例 メッセージの取得 まずはLINEから送信されたメッセージテキストを受け取る部分です。 LINE Platformから送信されるのは JSON で、以下のような形式となっています。 { " events ": [ { " type ": " message ", " replyToken ": " ********** ", " source ": { " groupId ": " ********** ", " userId ": " ********** ", " type ": " group " } , " timestamp ": 1529822351422 , " message ": { " type ": " text ", " id ": " ********** ", " text ": " 送信メッセージ " } } ] } 上記の JSON をもとにパースして送信されたテキスト情報を取得するコードが以下となります。送信される形式が JSON なので、 $_POST ではデータが取得できないことに注意が必要です。 <?php $ json = json_decode ( file_get_contents ( 'php://input' ) , true ) ; $ message = $ json [ 'events' ][ 0 ][ 'message' ] ; $ messageText = $ message [ 'text' ] ; Twitter で検索 次に受信したテキストをキーワードとして、 Twitter で検索します。 Twitter の連携については自前でやってしまうのもありですが、 面倒なので Twitter 連携パッケージ mpyw/cowitter を使用しています。 <?php $ client = new Client ([ $ consumerKey , $ consumerSecret , $ twitterAccessToken , $ twitterAccessTokenSecret ]) ; $ tweetsParams = [ 'q' => $ q . ' -rt' , 'count' => '10' , 'result_type' => 'recent' , "include_entities" => true ] ; $ tweets = $ client -> get ( 'search/tweets' , $ tweetsParams ) -> statuses; $tweetsParams で検索条件を指定します。 q は検索キーワードで、検索 演算子 も利用できます。今回は リツイート を排除したいので、検索 演算子 -rt を使用しています。 count はそのまま検索結果の取得件数で今回は10件、 result_type は取得するツイートの種類で recent とすることで最新のツイートを取得します。 最後の include_entities は少し特殊で、取得したツイートオブジェクトにentitiesプロパティを含めるかどうかを指定します。entitiesプロパティとはツイート本文を拡張するエンティティで、画像や動画などの本文に付け足すための情報が格納されています。今回はツイートに付随する画像のURLを取得するために使用しています。 他にも設定可能なプロパティがありますが、今回は不要なので省略します。必要に応じて こちら をご参照ください。 検索結果のパース 検索結果から必要な情報を抜き出すときにも、 mpyw/cowitter が当然ながら活躍してくれます。 今回必要とする情報は ツイート本文 ・ ユーザ名 ・ ツイートURL ・ 画像URL です。それぞれの情報は以下のようにして取得します。 <?php foreach ( $ tweets as $ tweet ){ $ text = $ tweet -> text; $ name = $ tweet -> user -> name ; $ url = 'https://mobile.twitter.com/' . $ tweet -> user -> screen_name . '/statuses/' . $ tweet -> id_str; $ img = $ tweet -> extended_entities -> media [ 0 ] -> media_url_https; } ここで注意する点が2つあります。 まず1つ目はツイートURLです。これはツイートオブジェクトの中に直接記載されていないので、その他の情報を結合して作成する必要があります。 2つ目は画像URLです。画像のURLは2種類あり、 media_url と media_url_https があります。見ての通りHTTPか HTTPS かが違うだけなのですが、LINEの API が HTTPS でないとダメなので、 media_url_https のURLを取得する必要があります。 LINEに送信 最後にLINEに送信します。単に動かすだけならプレーンテキストでもよいのですが、今回は少し見た目にこだわって Flex Message という形式にしてみます。 Flex Message では複雑なレイアウトを自由に作成可能です。今回は以下のような見た目にしました。ほかにどのようなレイアウトにできるのかは、サンプルなどもありますので 公式ページ をご参照ください。 以下が今回の見た目を作成するのに必要な情報を設定した配列です。この配列を json_encode して送信します。 function toggleFold(){ if(document.getElementById('fold').style.display=='none'){ document.getElementById('fold').style.display='block'; document.getElementById('link').text='◀クリックで閉じる'; } else { document.getElementById('fold').style.display='none'; document.getElementById('link').text='▶クリックで開く'; } } ▶クリックで開く <?php $ messageData = [ "to" => $ groupId , "messages" => [ [ "type" => "flex" , "altText" => $ altText , "contents" => [ "type" => "bubble" , "hero" => [ "type" => "image" , "url" => $ img , "size" => "full" , "aspectRatio" => "20:13" , "aspectMode" => "cover" , "action" => [ "type" => "uri" , "uri" => $ img ] ] , "body" => [ "type" => "box" , "layout" => "vertical" , "contents" => [ [ "type" => "text" , "text" => $ name , "weight" => "bold" , "size" => "xl" ] , [ "type" => "box" , "layout" => "vertical" , "margin" => "lg" , "spacing" => "sm" , "contents" => [ [ "type" => "box" , "layout" => "baseline" , "spacing" => "sm" , "contents" => [ [ "type" => "text" , "text" => $ text , "wrap" => true , "color" => "#666666" , "size" => "sm" ] ] ] ] ] ] ] , "footer" => [ "type" => "box" , "layout" => "vertical" , "spacing" => "sm" , "contents" => [ [ "type" => "button" , "style" => "link" , "height" => "sm" , "action" => [ "type" => "uri" , "label" => "See Tweet" , "uri" => $ url ] ] ] , "flex" => 0 ] ] ] ] ] ; そして実際に作成したメッセージを送信する部分のコードが以下となります。 改めて説明するまでもなく、 curl をたたいて終わりです。 <?php $ ch = curl_init ( "https://api.line.me/v2/bot/message/push" ) ; curl_setopt ( $ ch , CURLOPT_POST, true ) ; curl_setopt ( $ ch , CURLOPT_CUSTOMREQUEST, 'POST' ) ; curl_setopt ( $ ch , CURLOPT_RETURNTRANSFER, true ) ; curl_setopt ( $ ch , CURLOPT_POSTFIELDS, json_encode ( $ postData )) ; curl_setopt ( $ ch , CURLOPT_HTTPHEADER, array ( 'Content-Type: application/json; charser=UTF-8' , 'Authorization: Bearer ' . $ accessToken )) ; $ result = curl_exec ( $ ch ) ; curl_close ( $ ch ) ; おわりに 特に需要はないでしょうが、今回はLINEから Twitter 検索をしてみました。単に API をたたくだけで多くのことができます。今回はテキストメッセージを検索するということしかしていませんが、もっと面白いものがあれば機能拡張という形で取り込んで行きたいです。 最後までご覧いただきありがとうございます。 参考文献 LINE developers: Messaging API を利用するには https://developers.line.me/ja/docs/messaging-api/getting-started/ Docs — Twitter Developers https://developer.twitter.com/en/docs.html Heroku Dev Center https://devcenter.heroku.com/ GitHub - mpyw/cowitter: Asynchronous Twitter client compatible with mpyw/co Generator-based flows. https://github.com/mpyw/cowitter GET search/tweets - ツイートを検索する https://syncer.jp/Web/API/Twitter/REST_API/GET/search/tweets/ LINE developers: Flex Messageの要素 https://developers.line.me/ja/docs/messaging-api/flex-message-elements/
アバター
MasaKuです。 ラク スでは月1回のペースで開発メンバーの交流会としてビアバッシュを開催しています。 ビアバッシュとは ビールなどのアルコールを片手に(+軽食)フランクに技術内容について発表したり語り合う交流会 です。 ラク スで行っているビアバッシュについては以下の記事が参考になるかと思いますので、よろしければご確認下さい。 tech-blog.rakus.co.jp tech-blog.rakus.co.jp 大阪開発部では毎月何らかのテーマを決めてビアバッシュを行っています。 今月、大阪の開発部で開催されたビアバッシュのテーマは「 技術ネタ 」です。 技術ネタといっても、硬い雰囲気は全くなく、業務に直接関係しないような内容について発表されている人がほとんどでした。 また、テーマに縛られないLT枠も毎回開催されており、こちらも毎回数名の方が発表しています。 簡単ではありますが、今月のビアバッシュの雰囲気をお伝えできればと思い、発表内容についてまとめさせていただきました。 テーマ枠(技術ネタ) PHPのマジックメソッドについて これまでのPWAとこれからのPWAについて Haskellの参照透過性について LT枠(自由発表) 使い続けているツールについて Googleのデータセンターについて Android Studio で作ったアプリについて おわりに 参考サイト ビアバッシュの様子。ちなみに、今回のケータリングは「サンドイッチ」でした。 テーマ枠(技術ネタ) PHP のマジックメソッドについて マジックメソッド とは、クラスに設定しておけば、明示的にメソッドを呼び出さなくても特定条件で自動的に発動するメソッドのことです。 __construct() は業務の中でもよく目にしますが、それ以外のマジックメソッドについては、 PHP の学習初期に利用していた参考書に紹介されていたものを少し読んだくらいで、ほとんど知りませんでした。 マジックメソッドは フレームワーク やライブラリの中で利用されていることが多いようで __call() や __get() は CakePHP でも利用されているようです。 発表は __callStatic() を中心とした内容でしたが、機能の説明だけでなく、どのように実装するかということを、書籍管理を例にして説明していただきました。 発表の時間内でライブコーディングするというテクニックも披露していただき、大変見ごたえのある発表でした。 これまでのPWAとこれからのPWAについて Progressive Web Apps については、Webアプリでありながら、ネイティブアプリのように振る舞うことができるもの、くらいの認識でした。 また、どこでもネットに繋がる現代において、オフライン環境でも利用できることのメリットはそこまで大きくないのではないかと考えていました。 しかし、データを端末にキャッシュすることで、アプリのレスポンスが早くなるという点もPWAの特徴であるということについてご指摘いただき、オンラインで通信する必要のある箇所を切り分けるという観点を見落としていました。 様々な フレームワーク でPWAのテンプレートが利用できるようになってきている(React.js / Vue.js / Angular.js)ことから、PWAの開発が加速化することが期待されます。 Microsoft が今年中にPWAをWebアプリストアに追加することを発表したこともあり、今後のPWAのニュースにも注目しておかなければなりません。 www.itmedia.co.jp Haskell の参照透過性について Haskell の参照透過性のメリットについての発表内容でした。 なお、本発表は発表者とは異なる方が作成された資料を参照しながらの発表でした。(下記の slideshare ) 関数を実装する際に気をつけなければならないこととして、その関数がどのような値を受け取ってどのような値を返すのか、ということを明確に意識しておくことが挙げられます。 Haskell は静的型付き言語の中でも、制約が強い プログラミング言語 に分類されるようです。 そのため、実装した関数が正しい型で設定されていない場合は、 コンパイル 時に失敗するが、裏を返せば、 コンパイル で落ちなければ、関数の型が正しく設定できていることが保証されるということでもあります。 発表者の方は、 Haskell のような強い静的型付き言語でプログラミングを行うことによって、 PHP などの制約の優しい プログラミング言語 でプログラミングをする際にも型を意識する癖がついたとおっしゃっていました。 実装する際の心構えだけでなく、体に癖をつけておくことは大切だなと思いました。 Haskell Day2012 - 参照透過性とは何だったのか LT枠(自由発表) 使い続けているツールについて 業務で使っているツールを2つ紹介してくださいました。 Wireshark ネットワークに流れるパケット情報をリアルタイムで調査できるツールです。 Linux のコマンドも利用できることに利便性を感じて、今でも利用されているようです。 knowledge.sakura.ad.jp Vimium ブラウザ操作をキーボードで行うためのツールです。 マウスを操作しなくても ブラウジング ができることから、キーボードから手を離したくないような場合に便利で、体感的にはすごく楽とおっしゃっていました。 なお、以前のビアバッシュでこちらのツールと同様の cVim という Google Chrome の 拡張機能 の発表をしている方もいらっしゃいました。 マウス無しで ブラウジング することの需要は一定存在するようですね。 Google のデータセンターについて Google のサーバは、サーバを構成するビス1つから Google が自社で作成しているようです。 なんでも、利用している製品に 脆弱性 が発覚した際に攻撃されるリスクを回避するためなんだとか。 また、本発表で面白いと思ったのが、サーバの維持管理で一番コストがかかる箇所が、空調管理のための電力だそうです。 PUE(Power Usage Effectiveness)という、データセンターのエネルギー効率を表す一つの指標がありますが、 Google ではこのPUEが1.12~1.19程度らしいです。( 業界標準 は1.5程度) 以前耳にした話ですが、 さくらインターネット では北海道の冷涼な外気を サーバル ーム内に取り込むことで、一般的な都市型データセンターと比較して約4割の消費電力を削減しているそうです。 サーバの維持管理のコストをいかに抑えるか、という話を聞くことで、 Google 検索を行う度に Google の電気が一部利用されているということをちゃんと意識できるようになりました。 提供されているサービスとはいえ、無駄なクエリ発行はできる限り抑えなければなりませんね。 www.sakura.ad.jp Android Studio で作ったアプリについて 業務で行った内容の復習として取り組まれた、 cURL で外部サーバにアクセスして情報を取得する Android アプリの開発について発表していただきました。 アプリの内容は Wather Hacks という Webサービス の API を用いて、その日の天気情報を取得するといったものでした。 本アプリを開発する上での苦労話として、 Android はOSのバージョンアップによって仕様が変わることから、参考にしている記事がどのバージョンの Android を対象とした記事なのかをしっかりと確認しなければ、うまく動作しなかった、ということを話されていました。 これは、自分が情報を収集する際のポイントとして、気をつけなければならないことでもあります。 しかし、新たに情報を発信する際も、環境依存となる情報は明確に提示しておくことで、記事の価値を高めることに繋がることを認識することができました。 tech-blog.rakus.co.jp おわりに いかがでしたでしょうか。 今月も様々なタイプの発表が聞くことができて、大変充実したビアバッシュになりました。 次回のテーマは「 使用しているツール特集 」ということで、次回も魅力あふれる発表が聞けるのではないかと今から楽しみです。 参考サイト 便利だけど使いどころが難しいPHPの代表的なマジックメソッドと無名関数の使い方:PHPオブジェクト指向プログラミング入門(4)(1/3 ページ) - @IT PHP: マジックメソッド - Manual モバイルウェブアプリケーションの新しい形「プログレッシブウェブアプリ」 | DATA INSIGHT | NTTデータ Haskell Day2012 - 参照透過性とは何だったのか Wireshark · Go Deep. Vimium - Chrome ウェブストア Wiresharkを使った通信監視(後編)――コマンドラインベースでのパケットキャプチャ | さくらのナレッジ さくらインターネット、新しい空調コンセプトで石狩データセンター3号棟を建設 | さくらインターネット livedoor
アバター
id:radiocat です。 スクラム マスターの修行中です。 今回はチーム力を高めるために私たちが取り組んでいる手法を紹介します。 アジャイル のプ ラク ティスとして紹介されている手法ですが、 アジャイル ではない開発の現場でも活用できるのでぜひ参考にしてみてください。 学びにフォーカスしてチームで試験問題を作る この手法は「 スクラム 現場ガイド」という書籍の第20章で、新しいメンバーを受け入れる手法として紹介されています。 スクラム現場ガイド -スクラムを始めてみたけどうまくいかない時に読む本- 作者: Mitch Lacey マイナビ出版 Amazon この書籍を翻訳されている安井さんが同様のテーマのスライドも公開されています。 "Test" New Members / チームメンバーを"テスト"する from Yasui Tsutomu www.slideshare.net 目的 チームが大事にしている文化や技術について繰り返しテストをすることで新しいメンバーにそれらを理解してもらいます。また、テストをすることで新メンバーの理解が足りていないことを既存メンバーも含めてお互いに認識することができます。 やりかた チームが問題を作る 新しいメンバーは毎週必ずテストを受ける 問題の例 システムの アーキテクチャ を説明してください ペアプログラミング とTDDの意義を教えてください コードの所有者は誰ですか? チームに取り入れよう 私たちのチームも新しいメンバーを迎えることになったので、早速この手法を取り入れようと考えました。しかし、ここでいくつか疑問が浮かびました。 テストするのは新しいメンバーだけ? テストは新しいメンバーだけに必要なものでしょうか?我々エンジニアは新しく作った機能を必ずテストしますが、そのテストを日々回帰的に利用する手法を取り入れています。同様に スクラム チームも定期的にテストすればよりチーム力を高められるのではないかと考えました。 テストという言葉のハードルが高い 新しく入ってきたメンバーに対して「これからテストしますよ」と言うのは少し仰々しく、これから一緒にやっていこうというのに逆に 心理的 な壁ができてしまいそうな気がしました。そもそもこのテストは「チームが大事にしている文化や技術について理解する」ことが目的であり「テストする」のは手段でしかありません。無理にテストという言葉を使う必要もないので余計な 心理的 障壁を作らないように「クイズ」という呼び方にしてはどうかと考えました。その名も「Scrum Quiz」です。 Scrum Quizとは 私たちはScrum Quizを以下のように定義しました。 スクラム チームを前進させるための質問集です 以下のような内容について質問に回答することで相互理解を図ります 文化 価値観 必須スキル・理論 クイズはみんなのものなのでチームの誰でも追加・更新できます クイズの内容を考える あとは問題を作るだけです。 インセプション デッキにまとめた内容やチームで決めている品質の基準などを質問するようにします。また、ふりかえりで決めたルールなども質問に加えました。ふりかえりの時にチームで決めたルールがいつの間にか形骸化してしまうことが時々あります。クイズの問題にしておけばチームでそのルールを意識することができて、定着につなげることができます。 また、理解や定着が目的なので一言で答えられるようなクローズドな質問ではなく、あえてやや曖昧でオープンな質問にしてみました。 Scrum Quizの完成 そして私たちのチームのScrum Quizが完成しました。 チームの朝会(デイリー スクラム )後に数分ほど時間をとってメンバーの誰か1人がクイズを引いて答えてもらうようにしました。正しく答えられることも大事ですが、チームで「ああ、そういうルールだったよね」という理解が共有されることも大事です。「補足すると、ふりかえりでこういう意見がでたのでこういうルールにしました」というような話が出ればさらに理解が深まって良いと思います。また、もしクイズに答えられなかったら、次の日のまでに答えをみつけて朝会で共有してもらいます。 チームを継続的にインテグレートする Scrum Quizはチーム力を高めるためのテストです。これを日々実行することで継続的にチームの大事にしている文化をより強化することができます。エンジニア的な言葉で言い換えるとチーム力を高めるためのCIツールなのです。 アジャイル な現場に限らずどんなチームでも大事にしている文化やルールはあると思います。チームでテストを作っておけば、それらを確認し合ってチーム力を高めることができます。
アバター
はじめに こんにちは。 @rs_tukki です。 先日、このエンジニアブログでY-KanohさんがDockerでの開発環境構築について説明されていましたね。 tech-blog.rakus.co.jp また、mickey-STRANGEさんはHerokuを使った開発環境の構築を行っていました。 tech-blog.rakus.co.jp 恥ずかしながら、一エンジニアとしてもう1年以上が経過している私ですが、業務以外でガッツリ開発することがあまりありません... 環境の構築についても色々手法があるなー程度で見ていたのですが、 先日 Vagrant というツールを使って、「どの」、「誰の」、「どんな」環境でも手軽に開発環境を構築できる手順を学びましたので、今回はそちらについて簡単に記事にしたいと思います。 はじめに Vagrant?Docker? VagrantとDockerで誰でも使える開発環境を構築してみる 必要なツールのインストール Vagrantfileの作成、VMの起動 Dockerイメージの取得 実行 おわりに 参考 Vagrant ?Docker? まず初めに Vagrant とDockerで開発環境を構築するにあたっては、当然ですが Vagrant とDockerがどのようなツールなのか、ということを理解しなければなりません。 正直自分も違いがよくわからないまま触っていたのですが...調べていると 面白い例え を見つけました。 Vagrant : 家の内装、全体的な設計 - どんな室内構造か、部屋は何があるのか~その他 Docker : 部屋or(キッチンも可) - 様々な種類がある、場合によってば独特な空間を持ち合わせている Vagrant は、設計図を基に自分のPCに仮想環境という「家」を作成するためのツールです。 普通に環境を作ろうとした場合は、どういう階層構造にするか、どんなOSを使うのか…等々、都度細かく設定しなければなりませんが、それらの設定を Vagrantfile としてテキスト形式で保存しておけば、それを元に どんなPCからでも同じような仮想環境を作成できる のです。 Dockerに関してはこのブログでも何度か説明されていますが、今回の場合では、 Vagrant から作成された「家」の中に作られた部屋 *1 というイメージで説明します。 それぞれ作られたコンテナの中にはそれぞれ単独で機能する仕組みがあり、例えばそれがWebサーバならWebにアクセスできる仕組みがありますし、DBであればデータを保存する仕組みがあります。また、それぞれのコンテナの間にネットワークという通路を作っておけば、複数のサーバを用いるようなWebアプリケーションも簡単に作成できるというわけです。 そして最も便利なのは、このコンテナ自体も Vagrant と同じく Dockerfile を作成しておくことによって、 細かい設定なしにいきなりコンテナを配置する ことが出来るという点です。 Vagrant とDockerで誰でも使える開発環境を構築してみる では、VargrantとDockerを用いて、実際に開発環境を作成してみましょう。 必要なツールのインストール まずは必要なソフトとして Vagrant と、仮想環境を作成する際に必要となる VirtualBox をインストールします。 Dockerは? となるかもしれませんが、Dockerをインストールするのはあくまで Vagrant で作った仮想環境 に対してなので、現時点でのインストールは不要です。 Vagrant by HashiCorp Oracle VM VirtualBox 特にこだわりがなければ、最新版でOKです。 画面の指示に従ってインストールしてください。 Vagrantfileの作成、 VM の起動 インストールが完了したら、早速仮想環境の元となるVagrantfileを作ってみましょう。 ちなみに今回の手順は、 windows での操作を前提にしています。予めご了承くださいm(__)m。 まずは コマンドプロンプト を開き、 適当な作業用フォルダを作成します。 mkdir vm\test cd vm\test 作成したこのフォルダの中にVagratfileを作成していきます。 本来であれば vagrant initコマンドでテンプレートをダウンロードするのですが、今回は手軽に環境構築をお試しするためのVagrantfileをサクッと作っておきました。 Vagrant.configure("2") do |config| config.vm.box = "CentOS/7" config.vm.network :private_network, ip: "192.168.33.10" config.vm.provision "docker" end Vagrant.configure("2") do |config|...end で囲まれた範囲が、細かい設定を記述する箇所になります。 config. vm .box は仮想環境のOSを表します。今回は CentOS を使用します。 config. vm .network は仮想環境の IPアドレス の指定に使用します。実はこれがかなり重要で、これが設定されていないと仮に仮想環境上でWebサーバを立ち上げても、 IPアドレス がないのでPC上からアクセスできません。考えてみれば当然のことなのですが…こんな単純なことに3,4日も気づかずつまづいてしまいました… config. vm .provision で、環境の作成時にインストールするソフトを指定します。今回は前述の通りdockerを使用するので、今のうちに記述しておきます。 これだけ書いて保存したら、あとは仮想環境を作成して接続するだけです。 vagrant up vagrant ssh vagrant up でVagratfileを元に仮想環境を起動し、その環境に vagrant ssh で接続します。初回はdockerのインストール等もあるので多少時間がかかりますが、気長に待ちましょう。 しかし、気長といってもここに第二のつまづきポイントがあり、何故かVagrantfileは問題なく作成できているはずなのですが、10分経っても20分経っても起動が完了せず、 タイムアウト してしまうことがあります。 調べたところ、どうやら BIOSの設定 が邪魔をしているらしく、この設定をこちょこちょして何とか解決。 Dockerイメージの取得 接続が完了すると、ごく一般的な CentOS 上で Linux コマンドを叩けるようになります。 この環境上に、Dockerを使ってコンテナを作っていくわけですが、それには主に2つの方法があります。 Vagrantfileを作成したのと同じフォルダ内に「Dockerfile」を作成してビルドする dockerHub という、公式で提供されるコンテナの「カタログ」からDockerfileを借りてくる 細かく設定を行いたい場合は1.で行うのもいいですが、今回はとっかかりなので2.の方法で行きましょう。 プロジェクト管理 OSS である「 redmine 」と、そのデータを格納するための「 MySQL 」を作成してみます。 docker pull sameersbn/redmine:3.3.1 docker pull sameersbn/mysql:latest dockerHubからイメージを借りてくる際は、 docker pull コマンドを使用します。特に細かい設定は必要なく、dockerHubで提供されているイメージ名とバージョンを指定するだけで落とせるので便利。 こちらも時間がかかるので、気長に待ちましょう。 mkdir -p /srv/docker/redmine/mysql mkdir -p /srv/docker/redmine/redmine 続いて、 MySQL と redmine のデータを格納するフォルダを作ります。 本来データはコンテナの中に格納されていますが、このフォルダと紐づけを行う(後述)ことで両者を共有することが出来ます。 四次元ポケット これで、コンテナを動かす準備が完了しました。 実行 少し長いですが、以下2つのコマンドを実行してみてください。 docker run --name=mysql-redmine -d --env='DB_NAME=redmine_production' --env='DB_USER=redmine' --env='DB_PASS=redpass' -v /srv/docker/redmine/mysql:/var/lib/mysql sameersbn/mysql:latest docker run --name=redmine -d -p 8080:80 --link=mysql-redmine:mysql -v /srv/docker/redmine/redmine:/home/redmine/data sameersbn/redmine:3.3.1 docker run コマンドでコンテナを動かしています。以下、コマンドのオプションについて解説。 --name : 起動するコンテナの名前を定義しています。 -d : バックグラウンドで動かします。これがないと、一つ動かしている間は何も操作できなくなってしまいます。 --env : コンテナで扱う 環境変数 を設定します。 -v : コンテナの中にあるデータ配置のためのフォルダを、仮想環境の特定のフォルダと紐づけます。 -p : 起動したコンテナのポート番号と、自分のPC上で操作する時に指定するポート番号を紐づけます。 --link : 他のコンテナを指定することで、そのコンテナと連携することが出来ます。 これでPC側からアクセスができるはずなので、 http://192.168.33.10:8080 にアクセスします。 Redmine 使用者には見慣れたTOPページが表示されました! おわりに Vagrant とDockerを使って環境を構築するやり方を説明いたしました。 正直なところ、結構噛み砕いて説明したつもりでしたがそれでも大分難しいと思います。 なんとたったこれだけのことを調べ始めてから記事にするまで約一ヶ月 ただ、当然若手エンジニアにとっては勉強になりますし、何より どんな環境でも、同じように環境を構築できる のはとても便利だと思います。ぜひ皆さんも試してみてはいかがでしょうか。 参考 acchi-muite-hoi.hatenablog.com https://qiita.com/hidekuro/items/fc12344d36d996198e96 qiita.com weblabo.oscasierra.net qiita.com www.risewill.co.jp エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com *1 : 以下、これを「コンテナ」と呼びます
アバター
はじめまして!普段業務では Java や Swift を書いていますが、本当は(?) PHP が大好きな @kawanamiyuu です。 今日は PHPer な私にとって嬉しいお知らせです! お知らせ 関西での PHP の一大イベント、 PHP カンファレンス関西に弊社のエンジニアが登壇します。 また、 株式会社ラクス はシルバースポンサーとしてイベントに協賛します。 日時 : 2018 年 7 月 14 日 (土) 会場 : グランフロント大阪 公式 HP : https://2018.kphpug.jp/ 2018.kphpug.jp 登壇内容 タイトル チャットディーラーの高速開発を支える Laravel 概要 「 チャットディーラー 」は 株式会社ラクス が提供する、チャットを活用した Web 接客ツール ( SaaS ) です。 10 年以上 PHP でノン フレームワーク で開発・運用されてきた主力サービス( メールディーラー )の開発チームが、新規に姉妹サービス( チャットディーラー )を立ち上げる際に Laravel を選択をしました。 開発期間半年というスピードが求められる中で、チームが Laravel に抱いた理想と現実、また、Laravel (Blade) と Vue.js の組み合わせにより発生した 脆弱性 への対応など、Laravel での新規サービス立ち上げの経験を具体的にお伝えします。 最後に 当日は弊社のエンジニア数名もイベント本編および懇親会に参加します。セッションや懇親会を通して、弊社のサービス開発やエンジニアリングについてぜひたくさんお話できればと思います!
アバター
こんにちは。開発エンジニアのd_ shr ( id:d_shr )です。 前回はNode.jsのことを書いていましたが、今回は PostgreSQL のことを書きます。 前回投稿した記事 tech-blog.rakus.co.jp はじめに PostgreSQL10 変更点 ロジカルレプリケーション PostgreSQL9.6までのレプリケーション PostgreSQL10 ロジカルレプリケーション 所感 パーティショニング これまでのパーティショニング 宣言的テーブルパーティショニング 所感 パラレルクエリの強化 PostgreSQL9.6で対応していたもの PostgreSQL10で追加されたもの 所感 その他 まとめ 参考 はじめに 最近、 PostgreSQL について調査する機会がありました。 主にPostgreSQL9系やPostgreSQL10の変更点を調査しましたが、その中でも最新のPostgreSQL10について書きます。 PostgreSQL10はリリースから半年以上経っており今更ですが、新機能や変更点で気になったものをピックアップしてまとめようと思います。 PostgreSQL10 変更点 ロジカル レプリケーション 宣言的テーブルパーティショニング 改善された並列問い合わせ その他 ロジカル レプリケーション PostgreSQL10でPublish/Subscribeによる論理 レプリケーション が実装されました。 PostgreSQL9.6までの レプリケーション マスタからスタンバイに トランザクション ログを転送し適用することでデータの複製を実現していました。 対象はデータベース全体。完全な複製でスタンバイには物理的な変更はできないものでした。 PostgreSQL10 ロジカル レプリケーション レプリケーション 先に対して変更した レプリケーション 情報を送付できるようになります。 トランザクション ログを「テーブルに〇〇を挿入しました」のように論理的な変更内容として転送することができます。 データベース全体を レプリケーション するのではなく、特定のテーブルの情報やinsertだけを レプリケーション することが可能です。 レプリケーション 情報のやりとりにPublish/Subscribe(出版/購読型)モデルのメッセージ送信を用いています。 複製元でPUBLICATIONを作成し、複製先でSUBSCRIPTIONを作成することでテーブルの同期と レプリケーション が行われます。 INSERT, DELETE, UPDATEには対応していますが、CREATE TABLEなどには対応してません。 所感 柔軟に レプリケーション できるようになったという印象を受けました。 学生の頃にPub/Subモデルのメッセージングを用いた開発をしていたので興味深い内容でした。 パーティショニング パーティショニングとは、巨大な親テーブルを複 数の子 テーブルに分割することです。 今までパーティショニングの手順がめんどうだったのですが、CREATE TABLE文でパーティショニングが構築可能になりました。 これまでのパーティショニング 親テーブルを作成 親テーブルを継承する子テーブルを作成 CHECK制約を作成 親テーブルにINSERTトリガを作成 ...... 宣言的テーブルパーティショニング CREATE TABLE文で構築可能 1. 親テーブル作成 PARTITION BY構文 2. 子テーブル作成 PARTITION OF構文 所感 PostgreSQL9.5でもUPSERTが追加されていましたが便利な構文が増えたということで使ってみようかなと思いました。 パラレルクエリの強化 パラレルクエリとは、PostgreSQL9.6で追加された大きなテーブルに対するクエリを並列問合せで実行することです。 パフォーマンスの向上が期待できます。 PostgreSQL9.6で追加されたパラレルクエリ(並列問い合せ)がPostgreSQL10で強化されています。 PostgreSQL9.6で対応していたもの シーケンシャルスキャン 結合(nested loop, hash join) 集約 PostgreSQL10で追加されたもの インデックススキャン(B-tree, index only scan, bitmap heap scan) 結合(merge) 非相関副問合せ 所感 パラレルクエリ自体、バージョンアップで既存のシステムに取り入れるのは難しいのかなという印象を持っています。 これからも並列化はどんどん強化されそうな流れなので、パフォーマンス向上に繋がるなら考慮するべきなのかなと思います。 正しく理解しておきたい機能だと思いました。 その他 PostgreSQL10.3の修正で 他ユーザからの search_path を使った「 トロイの木馬 」攻撃を防御する PostgreSQL とアプリケーションの設定方法がドキュメントに記載されました。 pg_dump や他のクライアントプログラムで安全でない search_path 設定の使用が回避されました。 *1 PostgreSQL のpublic スキーマ の仕様によるもので、悪意あるユーザがpublic スキーマ に不正な挙動を行うユーザー関数を仕込んでおくことができます。 他のユーザがその不正なユーザ関数を一般のユーザ関数として実行させることで攻撃(漏えい、改ざんなど)ができてしまう問題がありました。 「 pg_dump 」「pg_upgrade」「vacuumdb」などの管理者ユーザで実行されるアプリケーション関してはsearch_pathからpublic スキーマ が取り除かれました。 PostgreSQL の仕様が原因になっていることなのでpublic スキーマ の設定を見直す必要もあり 既存のシステムで問題に直面しそうな場合は、運用面のことを考えるのなかなか辛いなという印象を受けました。 まとめ PostgreSQL10についてまとめました。 個人的に興味深い技術が使われていたものや、構文が追加され便利になったものなどありました。 また、パフォーマンスの向上に繋がることや 脆弱性 に関連した修正もあり、正しく理解しておかないといけないこともあるなと思いました。 参考 PostgreSQL 技術情報 - SRA OSS, Inc. 日本支社 PostgreSQLの“仕様”による、運用者にとって悩み深い脆弱性とは:OSS脆弱性ウォッチ(6) - @IT *1 : PostgreSQL 10.3 に関する技術情報 - SRA OSS, Inc. 日本支社
アバター
はじめに 前回実装した処理 今回実装した処理 利用したAPI Androidのバージョンに伴う注意点 実装概要 実装例 おわりに はじめに kuwa_38です。以前 Android Studio を使ってみたので、その続きとして天気情報を表示するアプリを実装してみました。簡単に実装できるかと思いきや、 Android では API 接続に非同期処理( AsyncTask )を用いる必要があるらしく苦戦しました。この記事では今回苦戦した非同期処理も含め、天気情報を表示するアプリについて、実装に必要なこと、実装したコードを記載します。 前回実装した処理 今回は下記の実装に付け加える形で実装したため記載しておきます。 Android Studioを使ってHello Worldをやってみた 初期画面の表示 ボタンを押すとテキストが変わる 今回実装した処理 ボタンを押すとその日の大阪の天気が表示される 利用した API Weather Hacks を利用させて頂きました。GETでエンドポイントにアクセスすることで、パラメータ city で設定した都市の天気を JSON で返してくれます(因みに 270000 は大阪です)。 補足: jqを活用してAPIレスポンス等から欲しい情報だけを抽出する【初級編】 $ curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=270000 | jq -r # 結果 { "pinpointLocations": [ { "link": "http://weather.livedoor.com/area/forecast/2710000", "name": "大阪市" }, # ...(中略) "link": "http://weather.livedoor.com/area/forecast/270000", "forecasts": [ { "dateLabel": "今日", "telop": "晴れ", "date": "2018-05-27", "temperature": { "min": null, "max": { "celsius": "29", "fahrenheit": "84.2" } }, Android のバージョンに伴う注意点 それでは実装、といきたいところですが、先に私がハマった注意点について述べておきます。 メインスレッドではネットへ接続する処理ができない 行おうとすると android.os.NetworkOnMainThreadException が発生します 参考: 【Android】メインスレッド(要は画面処理)でhttpリクエスト投げようとしたら怒られた。 〜NetworkOnMainThreadException〜 HttpClientが使えない 参考: Android 6.0でApache HTTP Clientが削除されました。 実装概要 コードなどは次の節に記述します。この節では実装すべきことについて大まかに述べます。 ※ 今回は実機デバックを対象とします( エミュレータ を使用する場合は、 エミュレータ の wifi 設定などが必要です)。 ネット接続を許可する AndroidManifest.xml に下記を追記 <!-- ネット接続を許可する --> <uses-permission android : name = "android.permission.INTERNET" /> ボタンを押すと特定の処理を実行する 前回の記事を参照ください API サーバに接続する 注意で述べたようにメインスレッドでは接続できませんので、実行用のクラスを作成してあげます 参考: AsyncTaskを使った非同期処理のきほん AsyncTask を継承するクラス(今回は AsyncHttpRequest というクラス名にしました)を作成する 作成したクラス内に doInBackground (非同期で行いたい処理を記述する)メソッドを実装する メインスレッド( MainActivity.java )で1のクラスを インスタンス 化し、 execute メソッドを呼び出す → doInBackground が呼び出される 受け取った JSON を加工する 受け取った文字列をJSONObjectでパースし、天気情報を取り出します 天気情報を表示する AsyncTask を継承するクラスで onPostExecute (非同期処理が終わった後に実行される)メソッドを実装し、メインスレッドのラベルを変更する 実装例 下記に MainActivity.java 、 AsyncHttpRequest.java ( AsyncTask を継承するクラス)を載せますので、実装してみたい方は参考にして下さい。 ※ AndroidManifest.xml は1行追記したのみですので載せていません MainActivity.java import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import java.net.MalformedURLException; import java.net.URL; /** * トップ画面を制御するActivityクラス. */ public class MainActivity extends AppCompatActivity { /** * 画面を表示する. * note:デフォルトで実装されている * @param savedInstanceState savedInstanceState */ @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * テキストラベルを変更する. * @param view view */ public void changeTextView(View view) { // 非同期処理(AsyncHttpRequest#doInBackground())を呼び出す try { new AsyncHttpRequest( this ).execute( new URL( "http://weather.livedoor.com/forecast/webservice/json/v1?city=270000" )); } catch (MalformedURLException e) { e.printStackTrace(); } } } AsyncHttpRequest import android.app.Activity; import android.os.AsyncTask; import android.widget.TextView; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; /** * 非同期処理を行うクラス. */ public final class AsyncHttpRequest extends AsyncTask<URL, Void, String> { private int TODAY_FORCAST_INDEX = 0 ; private Activity mainActivity; public AsyncHttpRequest(Activity activity) { // 呼び出し元のアクティビティ this .mainActivity = activity; } /** * 非同期処理で天気情報を取得する. * @param urls 接続先のURL * @return 取得した天気情報 */ @Override protected String doInBackground(URL ... urls) { final URL url = urls[ 0 ]; HttpURLConnection con = null ; try { con = (HttpURLConnection) url.openConnection(); con.setRequestMethod( "GET" ); // リダイレクトを自動で許可しない設定 con.setInstanceFollowRedirects( false ); con.connect(); final int statusCode = con.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { System.err.println( "正常に接続できていません。statusCode:" + statusCode); return null ; } // レスポンス(JSON文字列)を読み込む準備 final InputStream in = con.getInputStream(); String encoding = con.getContentEncoding(); if ( null == encoding){ encoding = "UTF-8" ; } final InputStreamReader inReader = new InputStreamReader(in, encoding); final BufferedReader bufReader = new BufferedReader(inReader); StringBuilder response = new StringBuilder(); String line = null ; // 1行ずつ読み込む while ((line = bufReader.readLine()) != null ) { response.append(line); } bufReader.close(); inReader.close(); in.close(); // 受け取ったJSON文字列をパース JSONObject jsonObject = new JSONObject(response.toString()); JSONObject todayForcasts = jsonObject.getJSONArray( "forecasts" ).getJSONObject(TODAY_FORCAST_INDEX); return todayForcasts.getString( "dateLabel" ) + "の天気は " + todayForcasts.getString( "telop" ); } catch (IOException e) { e.printStackTrace(); return null ; } catch (JSONException e) { e.printStackTrace(); return null ; } finally { if (con != null ) { con.disconnect(); } } } /** * 非同期処理が終わった後の処理. * @param result 非同期処理の結果得られる文字列 */ @Override protected void onPostExecute(String result) { TextView tv = mainActivity.findViewById(R.id.messageTextView); tv.setText(result); } } おわりに 本記事では Android Studio を使い、天気情報を表示する Android アプリの実装方法を紹介しました。まだまだ実用には遠いクオリティですが、非同期処理やjqコマンドなど知らなかったことを学ぶいい機会になりました。自分の学習目的で始めた部分が大きいですが、 Android アプリ開発 の初心者や非同期処理の実装で困っている方の手助けになれば幸いです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに こんにちは、 id:FM_Harmony です。 Rakus Developers Blogでは5回目の投稿です。 前回の記事はこちら↓ tech-blog.rakus.co.jp 今回も前回と同じくビアバッシュの補足ネタです。(ビアバッシュ...?という方は コチラ ) テーマは「Mattermost」についてです。 はじめに Mattermostとは? Mattermost Serverの構築 事前準備 データベースの準備 Mattermost Serverの構築 Mattermostを触ってみる Mattermostの初期設定 Webhookを使ってみる おわりに 参考 Mattermostとは? MattermostとはSlackに似た オープンソース のチャットツールです。 大きな違いはSlackが クラウド 型のサービスであるのに対し、 Mattermostはオンプレミス型 のサービスであることです。 そのため、社内情報を外部に保存したくないという理由で、チャットツールとしてSlackではなくMattermostを選ぶこともあるようです。 ↑Mattermostの公式ページにもSlackとの違いが説明されています。 今回はそんなMattermostのサーバを構築して色々お試ししてみた話です。 Mattermost Serverの構築 それではMattermost Serverの構築について説明します。今回は CentOS7.1 へ Mattermost Server v4.4.0 のサーバを構築しました。 また、データベースサーバとMattermost Serverは同一のマシンに構築します。 構築時の手順は参考リンク内の Installing Mattermost on RHEL 7.1 を参考にしました。 なお、今回の手順はあくまで手元での検証を目的としたものであるため、セキュリティ等の考慮を省いている部分もあります。 そのため、 本番構築時には手順をそのまま適用すべきではない ことにご注意ください。 事前準備 事前にパッケージは最新のものにします。 [hoge@huga ~ ]$ yum update データベースの準備 Mattermostではユーザや投稿を保存するデータベースとして、 PostgreSQL か MySQL を使うことができますが、今回は PostgreSQL v9.4を利用します。 また、 PostgreSQL サーバの構築および初期化は完了しているものとします。 まず、利用するデータベースを作成します。(postgresユーザは PostgreSQL の初期化時に作成されているはずです) [hoge@huga ~]$ psql -U postgres postgres=# CREATE DATABASE mattermost; 次に作成したデータベースをMattermostが使うためのユーザを作成し、 mattermost データベースに関する全ての権限を与えます。 (ユーザのパスワードは適当に決めてください) postgres=# CREATE USER mmuser WITH PASSWORD 'xxxx'; postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser; postgres=# ¥q 最後に postgreSQL の接続設定を変更します。 postgresql.conf を編集して listen_addresses を全アドレスに、 pg_hba.conf を編集して localhost から接続する際の認証方式を trust にすれば基本的には問題ないはずです。 Mattermost Serverの構築 では、いよいよMattermost Serverを構築します。 とりあえず、 /usr/local/src 直下にインストールしたいバージョン(今回はv4.4.0)のMattermost Serverをダウンロードします。 [hoge@huga ~ ]$ cd /usr/local/src [hoge@huga src ]$ wget https://releases.mattermost.com/4.4.0/mattermost-4.4.0-linux-amd64.tar.gz 次に、ダウンロードしたファイルを解凍し、 /opt 直下に配置します。 その後、配置した ディレクト リの直下に data ディレクト リを作成します。 [hoge@huga src ]$ tar -xvzf mattermost-4.4.0-linux-amd64.tar.gz [hoge@huga src ]$ sudo mv mattermost /opt [hoge@huga src ]$ sudo mkdir /opt/mattermost/data そして、Mattermostを管理するためのシステムユーザを作成し、先ほど配置した mattermost ディレクト リ以下のファイル・ ディレクト リをシステムユーザが書き込み可能にします。 [hoge@huga src ]$ sudo useradd --system --user-group mattermost [hoge@huga src ]$ sudo chown -R mattermost:mattermost /opt/mattermost [hoge@huga src ]$ sudo chmod -R g+w /opt/mattermost 最後にMattermostがデータベースと接続する際の設定を行えば主な作業は完了です。 /opt/mattermost/config/config.json を以下のように編集します。 "DriverName" を postgres とする。 "DataSource" を "postgres://mmuser:(mmuserのパスワード)@localhost:5432/mattermost?sslmode=disable&connect_timeout=10" とする。 ここまで完了すればMattermostを起動することができるはずです。 以下のコマンドからテスト起動を行えます。 [hoge@huga src ]$ cd /opt/mattermost [hoge@huga src ]$ sudo -u mattermost ./bin/platform 起動に失敗する場合は手順を見直してみてください。 また、本来はMattermost Serverをサービス化した方がMattermostを起動する際に便利なのですが、今回は割愛させていただきます。 Mattermostを触ってみる Mattermostの初期設定 初期設定を変更しない場合、先ほどテスト実行したMattermost Serverは8065ポートでアクセスを待ち受けます。 8065ポートへアクセスすると、下記のような管理者の設定画面が表示されるかと思います。 管理者の設定を終えると チーム を選択する画面に移ります。 Mattermostでは チャンネル と呼ばれるチャットが集まって、チームを成しています。 初期状態ではチームはありませんので、 Create a new team をクリックしてチームを作成します。 作成すると以下のような画面に移りますが、これがMattermostのチャット画面です。 tutorialは適当に飛ばしてください。 Webhookを使ってみる Mattermostは Webhook を利用することで外部と連携することができます。 まずはMattermostがWebhookを利用できるか設定を確認するために、チャット画面左上のメインメニューから System Console に移動します。 次に、 System Console 内の INTEGRATINS > Custom Integrations を選択します。 すると、 Enable Incoming Webhooks , Enable Outgoing Webhooks , Enable Custom Slash Commands というオプションがあるかと思います。 初期設定ではいずれも true のはずなので、今回はそのままにします。 ↑System Console画面、今回は赤枠で囲った部分をすべて true にします。 画面左上のメインメニューから Switch To (チーム名) を選択して、チャット画面へ戻りましょう。 その後、再びメインメニューから今度は Integrations を選択します。 すると、先ほど紹介した3つの外部連携機能の項目が選べるはずです。 今回は例として Incoming Webhook を利用してみましょう。 3つの項目の中から Incoming Webhook を選択します。 その後、表示された画面の右上にある Add Incoming Webhook を選択します。 すると、 Webhook の設定画面に移りますので、それぞれ適当な値を設定して Save を選択します。 設定が完了するとURLが表示されます。 Incoming Webhook ではこのURLに対してリク エス トを送ることで、Mattermostにメッセージを表示することができます。 ↑ Incoming Webhookの設定画面です。 試しに以下のコマンドをターミナルから実行してみます。 curl -i -X POST -d 'payload={"text": "this is sample bot"}' (利用する Incoming WebHooks のURL) すると、以下の画像のように「this is sample bot 」というメッセージが表示されるはずです。 また、設定を変更していない場合、投稿者名に BOT という表示が出ているはずです。 このように Incomming Webhook を利用することで、外部のサービスからMattermostへメッセージの送信を行うことができます。 おわりに いかがでしたでしょうか。 駆け足になってしまいましたが、Mattermost Serverの構築手順とWebhookについて少しでもご理解いただければ幸いです。 Mattermostサーバ構築の難易度はそれほど高くないと思いますので、これからチャットツールを導入したいという方は、この機会にぜひMattermostを体験してみてはいかがでしょうか。 参考 Installing Mattermost on RHEL 7.1 CentOS7系の Linux サーバにMattermost Serverを導入する手順について書かれています。 SlackクローンのMattermostを使ってみる - 外部連携編 -(WebHooks、Hubot) Mattermostで外部連携を行う方法について書かれています。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
id:radiocat です。今年度はビアバッシュ推進委員から一歩身を引いてアドバイザー役になりました。 このブログでも何度か紹介している ビアバッシュ ですが、このたび新しい運営メンバーが選抜されて、先日キックオフを行いました。同じ会社の社員とはいえ価値観は人によって違うため、ビアバッシュをどのように推進していきたいか、思い描くイメージはそれぞれ違っているものです。はじめはお互いに手探り状態で意見をすり合わせながらやりたいことをまとめていくことになりますが、そんな時に役に立つ価値観を可視化する手法が「ムービングモチベーターズ」です。 ムービングモチベーターズとは チームのメンバー同士でお互いの価値観を共有するためのワークショップです。手法の成り立ちや考案者については後述します。 10種類のカード モチベーションの源泉となるキーワードが書かれた10種類のカードがあります。このカードを自分が価値を感じる順番に並べ替えて共有します。 やってみよう テーマの認識合わせ まずは何に対しての価値観について考えるのか全員でしっかり認識合わせをします。今回は「開発部のビアバッシュを推進していくうえで価値が高いと感じるキーワード」としました。 実践タイム 5分~10分程度で時間を決めて並び替えます。あまり深く考えず直感的に並び替えましょう。 共有タイム 1人ずつ結果をチームに共有します。なぜそのキーワードを選んだのか理由も説明して価値観の理解を深めましょう。 今回はメンバーそれぞれが選んだトップ3を発表しました。このチームは「関係性」と「受容」を選んだメンバーが多いとか「名誉」や「権力」は誰も選ばなかったといったコミュニケーションを取って価値観を共有しました。 まとめ ビアバッシュのような社内イベントの運営ではルールや手順が細かく決まっているわけではなく、むしろ集まったメンバーの個性や考え方に委ねられている面もあるので、このように手軽に価値観を共有できる手法はとても有効です。 また、私の所属する開発チームでは毎月1回全員でこれを行って前月からのメンバーの価値観の変化も追いかけています。「最近新しい技術に取り組んでいるので好奇心を選んだ人が増えた」とか、「難しい課題に取り組んでいるのでゴールの重要性を感じている」といった、チームの状況の変化に応じたメンバー同士の価値観の変化にも気づけます。 最後に、実践しするうえでのポイントを3つ紹介します。 気軽に並べる 結局どれも大事な言葉なのです。時間をかけずにその瞬間の価値観をさらけ出しましょう。もちろん隣の人のカードを見てはいけません。 言葉の捉え方も共有する やってみると言葉の捉え方が人によって違うことにも気づきます。元々英語で作られたカードなので、「受容」や「熟達」など、日本語だと少しイメージしにくい言葉もあります。しかし気にする必要はありません。「自分はこう思ってこれを選んだ」という考えを共有することが大事です。どうしても気になる場合はみんながどういう意味で捉えているか聞いてみましょう。 楽しむ お互いに価値観を共有しあうので、 堅苦しい 雰囲気だと発言しづらくなります。無言でカードを並べるのではなく、楽しくワイガヤしましょう。 参考:Management 3.0 ムービングモチベーターズはManagement 3.0のプ ラク ティスの1つです。 management30.com Management 3.0は 公式サイト で以下のように説明されています。 オランダ出身のヨーガン アペロ(Jurgen Appelo)の世界80ヶ国で展開している新しい イノベーション とリーダーシップそしてマネジメント運動です。 近年マネジメントの領域で注目されている自己組織化や 心理的 安全性などについても言及されており、 アジャイル 開発の現場でも手法が使われているようです。
アバター
こんにちは sts -250rrです。 今回も前回の記事に引き続きAR技術の紹介になります。 tech-blog.rakus.co.jp 前回は簡単にARを体験する。まででしたので今回は Software Design のコラムにあったARアプリARKittenを作ってみました。 gihyo.jp ちなみに Github の リポジトリ でサンプルを公開してくださっていますので、こちらでまず試してみるのも良いかもですね。 では、やっていきましょう。 猫、ARに立つ カメラを向かぬ猫 まとめ 実録ビルドできない事件簿 猫、ARに立つ 前回はARの世界で平面を検出し、キューブを設置するところまででしたが、それではあまりに味気ないので猫を配置することにします。 ※AssetStoreからARKitをインポートする部分は割愛します。 UnityのAssetStoreでは、3Dのモデルデータを購入することもできます。 ここから猫のモデルを取得していきたいところですが、残念なことにARKittenで使用する猫のモデルは作成者の諸事情により、AssetStoreからダウンロードできなくなってしまいました。 現在は上記の Github からモデルデータを取得してくるしかないようです。 Kitten ディレクト リを プロジェクト名/Assets 配下に格納しておきましょう。 単純に猫を平面に追加するだけでは、拡張現実らしくなりません。 それはなぜか、ズバリ 影がないから です。 そこで今回作成するアプリでは UnityARShadows というサンプルを元に作成していきます。 このサンプルであれば平面を検出した部分に3Dモデルの影を落とすことができます。 UnityARShadows には Cube の代わりに HitPlayer が存在しています。 これを Assets/Kitten/Prefabs/KittenNPC に置き換えます。 これだけでは iOS の画面をタップしても猫が平面に配置できないので スクリプト を組み込んでいきます。 KittenNPC を選択しインスペクターウィンドウ(右側に表示されている設定窓)の設定を以下のようにします。 ここで一度ビルドして、画面をタップして見て猫を配置してみます。 猫に影がついていたり、アニメーションが定義されているので、まるで猫がそこにいるようです。 カメラを向かぬ猫 単純に猫を配置するだけでは、場所によってはそっぽを向かれてしまいます。 猫を配置した時にいつもこちら側(カメラ)を向いてくれるように しつけ スクリプト を追加していきます。 ここでは猫がカメラを向いてくれる時の処理の流れを解説します。 猫位置の取得 タップで配置した猫の位置を取得します。 このままでは猫は初期の向きを向いてしまいます。 3Dグラフィックスの世界では向き(回転)という情報は クオータニオン と呼ばれるもので保持されています。 カメラ位置の取得 猫とカメラの位置(座標)を比較することで、猫がどの方向を向けば良いのかがわかるようになります。 カメラの方に向かせる 猫とカメラの位置の差から、猫がどれだけ回転すれば良いのかを計算します。 この計算は3Dを扱うライブラリであれば、大抵3次元ベクトルを与えてやれば計算してくれる関数があります。 ARKitであれば、 Quaternion クラスの LookRotation クラスがその一つに該当します。 ※ スクリプト の内容はサンプルコードを眺めてみてください。 スクリプト が完成したら再びビルドしましょう。 そこには従順にこちらを向いている猫が佇んでいるはずです。 まとめ 今回は前回ご紹介したARKitのサンプルプログラムを作ってみました。 猫が配置され、それを眺めるまでしかできませんが、本来そこにいないはずの猫が画面を通して存在している感覚はまさしく 拡張現実 です。 次回も引き続きARKitネタをお送りしたいと思います。 お楽しみに、 実録ビルドできない事件簿 iPhone の iOS をアップデートしたばかりにビルドできなくなってしまった・・・・ エラー内容を見てみると、 「iOS11.3のデ バイス サポートファイルがない」ということだそうです。 みなさん結構起きてしまっているようで、解決策を調べてみたらすぐに出てきました。 今回は以下の記事を参考にさせていただきました。 iOSをアップデートしたために実機でビルドができない - Qiita
アバター
ラク スのメールディーラーの開発を行っている@nerobluebrosです。 5月9日にメールディーラーのバージョン12.2をリリースしました。 今回はそのメールディーラーバージョン12.2とリリースについての紹介をします。 バージョン12.2では33の機能と修正をリリース リリースは複数回に分割して実施 おまけ バージョン12.2では33の機能と修正をリリース 12.2では大小合わせて33の機能と修正をリリースすることが出来ました。 主な機能と修正は以下のとおりです。 1.添付ファイルセキュリティオプション機能  ・添付ファイルの拡張子と実際のファイルの内容をチェックします  ・ユーザ単位で添付ファイルのダウンロード可否をコン トロール できます  ・期限付きのURLから添付ファイルのダウンロードができます  ・添付ファイルのみを対象に自動削除できます 2.アドレス入力欄のUI変更などUI改善 3. ミドルウェア を Postfix にすることでSTARTTLSに対応します 4.メール本文を RFC に準拠しました 5.不具合修正 リリースは複数回に分割して実施 以降はリリースについて説明します。リリースは複数回(複数日)に分割して行います。 理由は以下のとおりです。 ・メールディーラーのサーバは複数台あり1日では終了しない ・メールディーラー内部の ミドルウェア の変更があり、より慎重におこなう必要があった リリース作業は深夜に実施します。 それは リリース中にメールディーラーのサービスが停止するから です。 「サービス停止が発生する=お客様がメールディーラーを利用できない」ということを意味します。 ですので、お客様の日常業務に影響しないように、 夜間バッチが開始される朝の4時までにリリース作業を終了しなければなりません。 そのため、リリース作業によるサービス停止時間を極力短くするために、準備作業などは事前に実施しておきます。 リリース作業は「できるだけ遅い時間に開始」し「できるだけ早く終了」する時間との戦いになるので大変な作業です。 リリースについてはまた別の記事で詳しくご紹介します。 なお2回目は5月30日の深夜を予定しています。 以上でメールディーラーの12.2の機能とリリースについての説明を終わりにします。 おまけ 現在 ラク スでは新卒採用と 中途採用 を行っています。 サービス開発に少しでも興味がある方は下記採用サイトをご覧になり、応募をおねがいします。 ラク ス採用サイト http://fresh-recruit.rakus.co.jp/
アバター
こんにちは。エンジニアのmickey-STRANGEです。 前回は めんどくさがりによるめんどくさがりのためのスマホアプリ開発についてお話したいと思います。 なんて言いながら、全てをJSでごりっと無理やり解決する方法をご紹介しました。 tech-blog.rakus.co.jp はい、タイトル詐欺です、すみません。冷静に考えて、この作りのWebページが世の中にない現状、これよりも簡単な方法が必ずあるはずなんですよね (当時サンプル書きながらコレめんどくさいな、なんて思ってないです) 。 今回はタイトル詐欺ではなく、Herokuというサービスを用いてWeb アプリ開発 の環境構築が本当に簡単に出来てしまう方法をご紹介いたします。 Heroku(へろく)とは Herokuで環境構築 php+postgresアプリの作成 デプロイソースの指定 ブラウザからアクセス! 【補足】phpからpostgresの接続 終わりに Heroku(へろく)とは Herokuとは、PaaS(Platform as a Service)の1種で、アプリケーションの底にあるプラットフォームそのものを、Webを通じて提供してくれるサービスです。 今回の記事では、Heroku上で php +postgresをプラットフォームとするWebアプリの構築、が目的となります。 Herokuで環境構築 Herokuを用いて、ということなのでHerokuのアカウント登録は完了している前提で説明を始めます。使用するのは以下の2サービスですので、アカウント登録まだだよ、という方はご準備ください。 Heroku jp.heroku.com GitHub github.co.jp php +postgresアプリの作成 まず最初に、Heroku上にアプリケーションを作成します。ログインして右上 New から Create New App 、もしくはアプリケーションが1つもない場合は画面真ん中にある Create New App をクリックします。 アプリ名を入力し、 Create app をクリックします。これでアプリケーションが作成できました。 といっても、名前と枠組みだけの状態なので、これから php +postgresで動くアプリケーションだという設定をします。 アプリケーションのページから Settings → Add buildpack の順にクリックします。 立ち上がったポップアップの中で php を選び、 Save changes をクリックします。 これで作成したアプリケーションは php で動きますよ、という設定が出来ました。 続いてpostgresを設定します。 Resources → Find more add-ons から Heroku Postgres を探してクリックし、 Install Heroku Postgres をクリックします。 Heroku Postgres はアドオンですので、料金プランの選択があります。というと身構えてしまうかもしれませんが、 Hobby Dev という無料プランがありますので、これを選択します。そしてpostgresを追加するアプリケーションを選択し、 Provision add-on をクリックします。 以上で作成したアプリケーションを php +postgresのアプリケーションであるという設定が完了しました。あとはソースをデプロイすればWebアプリケーションとして稼働する状態です。 デプロイソースの指定 続いて、ソースのデプロイ元の設定をご説明します。 ソースのデプロイ元として使用するのが GitHub になります。 GitHub にデプロイ用 リポジトリ を作成し、直下に index.php をpushします。 今回作成したファイルは以下のものです。 php +postgresが稼働していること、 php からpostgresに接続できていることの確認が目的なので簡単なものです。 今回も GitHub へのpushは GitHub Desktop を使用しました。直感でぽちぽちできるデスクトップアプリはやはり強いですね。 GitHub Desktop | Simple collaboration from your desktop とはいえ、これで GitHub 側の操作は終わりです。Herokuの画面に戻ります。 Deploy → GitHub → Search とクリックし、上記 index.php をpushした リポジトリ の隣にある Connect をクリックします。 これで GitHub リポジトリ からデプロイする設定が完了しました。Herokuから GitHub への接続が初めての場合は、連携をするかどうかの確認が出ますので、表示されるとおりに進めていけばOKです。 最後に、 Enable Automatic deploys と Deploy Branch をクリックしましょう。 Enable Automatic deploys は自動デプロイの設定です。ブランチを指定して自動デプロイを有効にすることで、そのブランチにpushされるたびに自動でアプリケーションを最新のソースに置き換えてくれます。 Deploy Branch は手動デプロイのボタンです。アプリケーションの設定とデプロイ元の指定をしただけで、まだデプロイはされていません。自動デプロイを有効にしたとしても、初回だけは手動で行います。 ブラウザからアクセス! これまでの手順で全ての準備が完了しました。実際に作成したアプリケーションにアクセスしてみましょう。 アプリケーションのページの右上に Open app というボタンがあるのでクリックしてみましょう。 作成した index.php の通りに表示されました! postgresのバージョンも php から取得出来ているので getAttribute の代わりに SQL を発行して動きをつけていけば立派なWebアプリケーションになりますね。 個人的な感想として、postgresが10.3と最新に対してphp5.6がツッコミどころに思えて仕方がなかったのですが、 php のバージョンを指定する方法がちゃんと用意されています。画面から作っただけではデフォルト設定で作られる、といった感じでしょうか。 composer.json に改めて指定することで php のバージョン変更が可能です。 Heroku PHP Support | Heroku Dev Center 【補足】 php からpostgresの接続 ここまでアプリケーション稼働までの手順をご説明いたしましたが、1つだけ補足があります。 最初、 php からpostgresに接続するにあたって、接続情報の取り方に詰まりました。Herokuの画面上から確認は出来るのです。ですが、これだけ環境構築が簡単なのに接続情報はまったく関係ないサービスである GitHub 上のソースにべた書きで持つ、というところが引っかかりました。 GitHub 上のソースを見れば他の人のアプリのDBにアクセス出来てしまいます。 調べたところ、postgresをアプリケーションに追加したときに、 環境変数 に追加されているようで、そこから取得する方法が、上記の index.php の記述になります。 Heroku Postgres | Heroku Dev Center 終わりに 今回はタイトル詐欺ではなく、めんどくさがりでもすぐにWeb アプリ開発 が出来る手順の記事になっていると思います。 Herokuを初めて使ったのですが、とても簡単で驚きました。調べるにも公式ドキュメントが多いので、詰まってどうしようもなくなるということはありませんでした。 タイトルの30分というのも嘘ではなく、「よし、やるか」と思い立ってHerokuのアカウントを作成してから、特に調べるでもなく直感でぽちぽち画面を操作して、 phpinfo() を画面に出すまでの時間がそれぐらいでした。本当に簡単です。 コマンド要らずの設定の簡単さも素晴らしいのですが、特にpushからの自動デプロイがめんどくさがりの心にかなり響きました。 気を付けないといけないところは、前回の記事で作成したアプリはアクセス者本人の画面にのみデータが表示されるのに対し、Herokuは通常のWebアプリになりますので、 脆弱性 のあるサービスを公開してしまうと攻撃の踏み台として使われてしまう可能性があります。アプリの作成、公開は気を付けて行いましょう。 さて、これにて今回の記事は終わりとしますが、前回のタイトル詐欺の汚名を返上できたでしょうか。 最後までお読みいただきありがとうございました。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
こんにちは。開発エンジニアのamdaba_sk( ペンネ ーム未定)です。 前回は「 OWASP ZAPについて調べてみた 」という記事を書きました。 単体テスト 中にこっそり使ってみようかと思っていたのですが、手元の環境ではポート待ち受けでエラーが出てしまって放置しています……。 それはさておき、ひと月ほど前の話になりますが、 弊社エンジニアのインタビュー記事 が公開されましたね。 周りから信頼されていきいきと業務に励む坂田くんの姿が伝わってきます。この記事を読んで、わたくし不覚にも「楽しそうな職場だなあ、私もそういうところで働きたい……」とちょっと思ってしまいました。いえ、別に今の職場環境に不満があるわけでもないのですが。 まだご覧いただけていない方はぜひに。 ところで実は彼は私の同期でありまして、先日お昼を一緒に食べたついでに雑談に見せかけて追加でインタビューしてみましたので、その時の話を今回は書こうと思います。 (※本人了承済み。ただし写真は気恥ずかしいのでNGだそうです。今さらな感じもしますが) ある昼下がり 私は前回のブログ投稿からけっこう間が空いていたので、そろそろ新しい記事を投稿したいなと思っていました。技術的なTipsのようなネタもよいけれど、たまには ラク ス社員である自分しか書けないようなネタが良い。そしてせっかく書くのだから自分も楽しんで書きたい。業務の傍ら頭の隅で考えるものの、しかしこれだというネタがなかなか見つけられずに少し焦っていました。 混雑を避けて少し遅めの時間帯に昼食をとるのが同期の間での習慣です。業務の切りを見て社内チャットで誘い合い、オフィスから出て外へ。その時は私と坂田くんの二人でした。 そこで、ピンときました。思い立ったが吉日ということで早速アイディアを実行に移す私。その時ちょっと顔がにやけていたかもしれません。 ペンネ ーム未定 (以後 ペン未 )「そういえばこの前インタビュー受けてた記事公開されてましたね。見ました。全国デビューおめでとうございます」 坂田くん (以後 坂田 )「やめて」 ペン未 「なんかめっちゃいい感じのこと言ってたじゃん。あれほんとに言ったの」 坂田 「そのままは言ってない。記事の目的に合わせてかなり編集されてるし、後から修正もしたし」 ペン未 「まあ、ですよね」 坂田 「でもベースはインタビューの時に話した内容」 チャットディーラーのことについて ペン未 「CD 1 で使った フレームワーク ってなんだっけ。ら……ららばい?」 坂田 「Laravel。 PHP のWebアプリケーション フレームワーク だね。あと JavaScript でVue.js」 何言ってるの? みたいな顔をしつつも坂田くんはちゃんと答えてくれます。ありがたや。 ペン未 「そうでした。使ってみてどうだった? 例えばMD 2 と比べてみて」 MDはCDと同じく PHP で書かれていますが、特に フレームワーク は使用していないということは以前坂田くんから聞いていました。 坂田 「 フレームワーク があるとやっぱりかなり楽。面倒なことはやってくれてるし、どこにどんなことを書くといいのかが明確に分かれてるから、作りたい機能のことに集中できる。これはLaravelに限った話じゃないとは思うけど。他に フレームワーク を触ったことが無いから他の フレームワーク と比べてってなるとよくわからない」 ペン未 「Vue.jsは非難殺到だったって話だったよね」 坂田 「あー、うん、慣れるまではちょっと大変だったかな。それまで慣れ親しんだ手続き的なJSの書き方とは パラダイム が違うというか。Vue.jsっぽい書き方ってどんなだろうってはなった。開発入る前にもちょっとは勉強してたけど、実装始めてからも公式サイトのドキュメント読んでることが最初のうちは多かった」 ペン未 「へー……。先輩に教える場面もあったって記事には書いてあったよね」 坂田 「みんなして慣れてなかったからね。LaravelもVue.jsも。何か新しくわかったことがあったらけっこう教えあってた。Laravelだとこう書けばいいみたいですよー、とか、Vue.jsでこう書くとそれたぶんうまくいきます、とか」 話しているうちにオフィス近くの定食屋さんに到着し、食券を購入するために話は一時中断となりました。 かみせん ペン未 「そういえばCDは全社交流会 3 で表彰されてましたよね」 坂田 「そうですね」 ペン未 「そういえばあなたもういっこ表彰されてませんでしたっけ。なんででしたっけ」 坂田 「そうですね。かみせんプロジェクトですね」 ペン未 「それ前から思ってたんだけど、かみせんって結局なにしてるの」 坂田 「目標は、なんだっけ……新しい技術とかにチャレンジして、わかったことを普段の業務の改善に活かすこと。具体的にはQCポータル 4 の段階的マイクロサービス化を今やってるとこで、私はマイクロサービス一つの実装をやってた」 Haskell ……? ペン未 「それで Haskell ?」 坂田 「そうね」 ペン未 「なんで Haskell ?」 坂田 「え、なんかかっこいいから……純粋関数でプログラム書くのってなんか良さそうじゃない? 変なところに副作用が出ないから修正のための影響範囲の調査だって楽そうだし、もし影響があるなら型検査で引っかかるだろうからすぐわかるし」 ペン未 「でもそれでアプリケーション作るとかイメージできないんだけど」 坂田 「それはライブラリがあるから大丈夫。この前ビアバッシュ 5 で紹介した本 6 にはWebアプリケーションを作る章もあるし簡単な API サーバーくらいならすぐに」 ペン未 「っと、そろそろ時間やね。行きましょうか」 そして仕事はつづく Haskell について熱く語ってもらえそうな感じになっていましたがあいにくと時間切れ。ごちそうさまと告げて店を出、そのあとは他愛もない話をしつつオフィスに戻りました。午後の業務が始まります。 自席について先ほどの話の内容をメモしつつ、私が思ったのは一つでした。 Haskell 好き、増えるといいね…… Chat Dealer(チャットディーラー)の略称。CDについて詳しいことは商品サイトを参照 → https://www.chatdealer.jp ↩ Mail Dealer(メールディーラー)の略称。MDについても詳しいことは商品サイトを参照 → https://www.maildealer.jp ↩ 年度末に開催される全社員が集まってのパーティ。その年度に特に活躍したりした個人・グループが表彰されたりする。 ↩ 社内用システムのひとつ。いくつか機能はあるが、もっぱらその日の仕事はどんなことを何時間やったか入力のために利用される ↩ 月1で開催している開発部の交流会。ビールなどのアルコール(+軽食)を片手にフランクに技術内容について発表したり語り合ったりする。このブログ内でも過去に 紹介された 。 ↩ 本間 雅洋, 類地 孝介, 逢坂 時響 (2017)「Haskell入門 関数型プログラミング言語の基礎と実践」技術評論社 ↩
アバター