ホーム ブログ ページ 33

rubyで配列から重複する値を抽出する方法を探した際に見つけたgroup_byメソッドが便利だった

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

重複を排除するときは uniq ですが、重複を取り出すメソッドはない。 直接実行するメソッドはないけれど Array#group_byを使うと簡単にできる

参考:
・ Rubyで配列内の重複する値を抽出する方法
http://kiyotakakubo.hatenablog.com/entry/20110801/1312196444
・ rubyのgroup_byが便利
http://simanman.hatenablog.com/entry/2013/03/16/193552
・ instance method Enumerable#group_by
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/group_by.html

環境
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
irb 0.9.6(09/06/30)

実行例

  arr = [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6] # 配列を準備
  arr.group_by{|i| i}.reject{|k,v| v.one?}.keys # 魔法を使う
 => [2, 3, 4, 5]

Array#group_by
ブロックで渡した値をキーとした配列をハッシュにする。
arr.group_by{|i| i}
=> {1=>[1], 2=>[2, 2], 3=>[3, 3, 3], 4=>[4, 4, 4], 5=>[5, 5], 6=>[6]}

応用

・ カナ付きの名称を持つレコードを最初の文字でグルーピングする例

Something.all.to_a.group_by{ |product| product.name_kana.first}

・ 一行の文字列にいくつものデータを含んだ名前を持つデータをグルーピングする例

arr2 = %w(
  productcd1_skucode1_100
  productcd1_skucode2_200
  productcd2_skucode3_100
  productcd3_skucode3_150
) # 商品コード_SKUコード_値段のようなイメージ
arr2.group_by { |one_line_record| one_line_record.split('_').first } #商品コードで分けるみたいな

arr2.group_by { |one_line_record| one_line_record.split('_').last.to_i} #値段で分けるみたいな

重複する値を取り出すときの補足

  • Array#reject ブロックで渡した値が true を返す要素を除く
  • Array#one? 要素数が 1 あるかどうかを true / false で返す arr.group_by{|i| i}.reject{|k,v| v.one?} => {2=>[2, 2], 3=>[3, 3, 3], 4=>[4, 4, 4], 5=>[5, 5]}
  • Hash#keys ハッシュキーの配列を返す

付録

Arrayクラスに今回扱ったメソッドを追加するサンプル

class Array
  def ununiq
    group_by{|i| i}.reject{|k,v| v.one?}.keys
  end
end
 [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6].ununiq

頭の中のアイデアをアウトプットする

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

暑い日が続いて三途の川が見え隠れしています。
今回はシナリオを考える際の案出しの方法を、さらっと紹介したいと思います。
使用したソフトは、マインドマップ作成ソフトの「XMind」無料版です。

はじめに

「シナリオが頭の中にあるけど、まだ形にしていない!」という方は大勢いらっしゃると思います。
わざわざアウトプットせずとも、自分の頭の中ではキャラクターが動いているのだからそれで良いのでは……と思ってしまいますが、それを実際に文字などにしてみることで、更に良いアイデアが浮かぶことがあるのです。

私はシナリオの案出しを行う際、よく「マインドマップ」を使用しています。

※今回は、「マインドマップとは何ぞや……」という説明は省かせていただきます。
先人の方々がとても分かりやすい解説をしていらっしゃるので、そちらを検索してご覧になってください。

マインドマップを作ってみよう

マインドマップを作る、というとかなり面倒そうに思えますが、かなりズボラな性格の私でも美しいマインドマップを作ってくれる優秀なソフトやアプリがたくさんありますので、そちらを頼ります。
その場で思いついたアイデアをドバーッと書き出してもなんとも見やすい形にしてくれるのです。

今回はこの記事を書くために作ったので、整合性など考えず好き勝手に暴走させていきます。

アイデアを出そう

enter image description here
まず、「三姉妹の天使を出したい!」というアイデアが浮かびました。
そして、物語の大きなシンボルの一つとして「樹」、天使と人間の話……など、とりあえず頭の中に浮かんだものをどんどん打ち込んでいきます。

ここで、大体の流れの案を3つ出したときに「天使側と人間側、双方にスポットを当てたい!」と思いつきました。面白そうですが実際にやったらとても面倒くさいことになるのは確実ですね。

世界観を考えよう

さて、物語でやりたいことを大体出し終えたら、次は世界観を考えていきます。
「天使」と「樹」という2つの大きな「分かりやすいシンボル」があるので、この二つを繋げて考えてみると……
enter image description here
このようなアイデアが浮かびました。
ありきたりですが、ない頭をひねって謎のものを生み出すよりは、安全な王道に沿うことにします。

肉付けをしよう

次は、メインとなる組織等を考えてみます。
こんなものがあったら面白いのではないかな?と、とりあえずたくさん出してみます。
この時に並行して、話の主軸にしたいキャラクターも考えます。

enter image description here
30分ほどで、このようになりました。
とても滅茶苦茶なことになっていますね。
思いついたものを片っ端から書いていったせいですが、優秀なソフトのおかげで見た目だけはちゃんとしているような気がします。

個人的には、最初はゴチャゴチャになってしまっても構わないので、とにかく書き出すことが大事だと思っています。
「先にあっちを整理してから……」とまごまごしているうちに、せっかく思いついたキラキラのアイデアが消えてしまうかもしれない……のです。忘れっぽいので。
ですから、まとめは後回しにします。

まとめ

今回ばかりは、「物語でやりたいこと」から出していきましたが、普段は「どんな世界で~」だったり、「どんなキャラクターがいて~」だったり……とにかく、色々なところから書き出します。
私の場合ですと、頭の中で考えているだけではアイデアがすごく薄ぼんやりしていて、中々考えがまとまりませんし、新しいものも出てきません。
ですが、こうして思いついたものをとにかくアウトプットしていると、次々とその先が思いつくのです。
例えば、「絶対に入れたいシーン」から話を膨らませても良いのです。
確固たる何かがあるのなら、それをドドンと見せられるような物語を作れると良いですね。

終わりに

冷房の効いた部屋にいるのに常に水を飲み続けているせいで、毎日足がむくんでいます。
本人が爆睡している間にむくんだ足を美脚にしてくれるらしい着圧ソックスがおすすめです。

VirtualBoxでゲストOS間の共有フォルダを作成する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

VirtualBoxでホストOSとゲストOS間の共有フォルダを作成する方法を画像多めでまとめてみました。

はじめに

 1か月ぶりの投稿になります。
最近、任天堂Switchを探し求めて自転車で40km程走ったら軽い日焼けとぷち熱中症になったむらさきです。
 さて、今回は入社したての頃にちょっと迷ったVirtualBox+CentOS7での共有フォルダ設定について書いていこうと思います。

開発環境

Windows10(64bit)   CentOS7.3.1611  VirtualBox 5.1.22  Rails 4.14   ruby 2.2.0

目次

  1. ホストOS側の準備
  2. ゲストOS側の準備
  3. 動作確認

1.ホストOS側の準備

 まず始めにホストOS側で共有フォルダを作成します。
ファイルの場所はどこでも大丈夫ですが、共有フォルダは英数字にしましょう。
今回はshare_testフォルダをデスクトップ上に作成して共有させてみます。
enter image description here

2.ゲストOS側の準備

まずはVirtualboxを起動します。
VirtualBoxマネージャーで共有フォルダを使いたい仮想マシンを選択し、設定ボタンをクリックします。
enter image description here

そして設定から共有フォルダーを選択し、右上の追加マークをクリック
enter image description here

「フォルダのパス」から先ほど作成したshare_testフォルダを選択します。
enter image description here

そして「自動マウント」と「永続化する」にチェックを入れます。
※「永続化する」は仮想マシンが起動中でないとチェックボックス自体が出てこないので注意
自動マウントにチェックを入れれば/media直下に”sf_作成したフォルダ名”が作成されて自動的にマウントされるようになります。
今回の場合だと/media/sf_share_test が作成されるはずです。
永続化するにチェックが入れないと、仮想マシンを再起動するたびに設定が消えてしまいます。常に共有フォルダの設定を残しておきたい場合がほとんどだと思うので、チェックを入れておきましょう。

仮想マシンを再起動することで共有フォルダができているはずです。

3.動作確認

ちゃんとファイルが共有できているか動作確認をしておきます。
まず仮想マシンを起動して/media/sf_share_testができているかを確認します。
enter image description here
問題ありませんでした。
それでは次にホストOS側から何か共有してみましょう。
今回はメモ帳に文字を書いてそれを共有します。
enter image description here
このメモ帳をshare_test1.txtと名前を付けて共有フォルダに保存します。
そしてゲストOS側で確認してみると
enter image description here
ちゃんと入っていることが確認できました。

日本語で書いていたので文字化けしていますが、今度はゲストOS側から追加で書き加えてみます。
enter image description here

ホストOS側から先ほどのメモ帳を開いてみると、ちゃんと書き加えられていることが確認できました。
enter image description here

おわりに

 いかがだったでしょうか、今振り返ってみるととても簡単な設定ですが、入社してすぐで右も左もわからなかった頃は調べ方も分からず時間がかかってしまいました。
 今もまだ知らないことだらけで毎日四苦八苦してますが、色々知識を蓄えたり、欲しい情報を的確に検索できるように頑張ろうと改めて思いました。

Excelでデータ管理、チェック表を作るときに役立つ3つのこと

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

データ管理やチェック表を作るときはExcelで作成するが、何も考えずにやると「あれ、上手くいかない・・・」 「こうしたいんだけど・・・」となることがいくつかある。今回はそれをいくつか紹介する。

チェック表の例

 今回はチェック表の一例から紹介する。(データ管理については直接説明しないが、大体同じようなことに気を付ければいい。)
 ↓の画像はキャラクターのスキルの演出チェック用の表だ。キャラクターとそのスキル、演出があらかじめ書いてあり、それを〇×でチェックして、×ならどうだめだったかを記入する形式となっている。
enter image description here

チェック表の項目

 先ほどの画像のようなチェック表を作るとき、まずは要素として必要な項目を挙げておく。
今回ならキャラクター、スキル、演出の3つだ。簡単のために今回はこれしか挙げていないが、最近のゲームなら利き手の項目が必要なことも多いし、演出は味方側と敵側でハッキリ分けたほうがいい。他にもゲームによって必要な項目は変わるので、要素はよく考える必要がある。

ウィンドウ枠の固定

 表示タブに「ウィンドウ枠の固定」というものがある。
これを先ほどのチェック表のA2(エリック)や、2行目を選択した状態で適用すると、Excelを下にスクロールしても1行目が常に一番上に表示されるようになる。
 簡単だが、「あれってどうやるの・・?」とならないように覚えておきたい。適用すると↓の画像のように、下にスクロールしても1行目が常に表示される。
enter image description here

折り返して全体を表示する

 チェック表の例では、4行目のスキル「乱打」の演出の説明文は幅に収まらず、2行分の高さになっている。こうするには、シート全体にホームタブの「折り返して全体を表示する」を適用する。
 もしこれを使わない場合、長い説明や備考があると、それだけで見にくくなるし、印刷して使用する場合に大きな影響が出てしまう。それぞれの項目は必要そうな分だけ幅を取るようにしよう。

 なお、「折り返して全体を表示する」には1つ注意点がある。結合したセルにはうまく働かないのだ。↓の画像を見てほしい。
enter image description here
一見問題無さそうだが、D5~E5の結合セルには「あいうえおかきくけこさしすせそ」が入力されている。「折り返して全体を表示する」は全体に適用しているが、結合セルである「あいうえおかきくけこさしすせそ」ではうまくいっていないことが分かる。折り返す可能性がある部分には結合セルを使わないようにしたい。

まとめ

 いかがだっただろうか。他にもチェック部分に条件付き書式で×だったら色付けするなど、
工夫の余地はたくさんある。試行錯誤を繰り返して良い表を作るようにしたいところだ。

サーバサイド Push通知

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

リモートPush通知は、外部から情報を通知(Push)することで、起動していないアプリを強制的に起動させる唯一の手段です。 アプリケーションの実装に捕らわれがちですが、実はとても大事なサーバサイドのPush通知機能について説明します。

Push通知とは?

今さら説明する必要はないとは思います。ユーザ通知はアプリケーションが起動(フォアグラウンド)でない状態でもアプリケーションやWebサイトに情報をおくることができる唯一の手段です。
SNSのメッセージ、ECショップからのセールのお知らせ、鉄道会社の運行情報通知など様々な分野で応用されています。

Push通知は、見た目上、数行の文章と絵文字しか送ることができません。地味で単純な機能なため簡単なのだろう、と思われる方もおおいと思います。しかし、いざ実装してみると機能の面はもちろん、パフォーマンス、セキュリティなど考慮することが多々あります。

Push通知を構成する要素は、おもに、クライアント(アプリやブラウザ)、OSやブラウザ提供の配信サーバ(APNsやFCM)、そして、その中間に位置するアプリサーバから構成されます。アプリサーバはProvider サーバとも呼ばれます。
本記事はアプリサーバの役割について解説します。

アプリサーバの主な機能

  1. クライアントから通知された宛先の管理
  2. クライアントの属性による宛先の絞り込み
  3. Push通知の作成
  4. Push通知の配信
  5. 開封イベントなど行動分析の管理

宛先の管理

スマホアプリやブラウザからPush通知を使います!と宣言すると、OSやブラウザはPush通知の宛先を取得します。電子メールにおけるメールアドレスと似た機能ですが、これらの宛先は、スマホアプリごとやブラウザのWebサイト(ドメイン+パス)ごとに一意に割り当てられます。複数のスマホで同じアカウントを使い回していたとしても、別々の宛先が割り当てられる点が、メールアドレスと異なります。
これらの宛先は、iOSではデバイストークン、AndroidではレジストレーションID、WebPush(PushAPI)ではendpointと呼ばれています。
Push通知の配信時はこの宛先を指定して送信します。

クライアントに通知を配信するためには、宛先を外部のサーバで管理する必要があります。
通常、WebAPIを用いてアプリサーバ上のDBやファイルに保存しておくのが一般的です。
そのため、管理するだけでも
・データベース
・WebAPIのプログラム
・Webサーバ(SSL対応)
が必要になります。

なお、宛先は配信サーバの都合で変わることもありますので、クライアントごとに一意の識別子を割り当て、その識別子と宛先を対応づけて管理します。

属性による宛先の絞りこみ

登録しているクライアント全員に送りたい場合は、宛先を管理するだけで問題ありませんが、
まったく関心のない情報をクライアントに送ってもクライアントの利用者は迷惑です。
さらに、邪魔だと思って通知をOFFにされてしまう場合もあるでしょう。
効果的なPush通知には、特定のクライアントに送るための宛先絞り込みが必要です。
宛先絞り込みの機能もアプリサーバが行う役割の一つです。

宛先絞り込みの機能を実現するためには、利用者のユーザIDや性別などの属性情報を宛先とマッピングさせておく必要があります。
通常、クライアントから識別子や宛先とともに属性情報を付与してWebAPIを経由してアプリサーバに送ります。

アプリサーバは、クライアントから送られてきた識別子・宛先と属性情報の関連を保持しておきます。
様々な検索条件に対応するために、複雑なプログラムの実装が必要になることがあります。
また、クライアント数は利用状況によっては数十〜数千万に達することもあり、宛先の絞り込みの処理のパフォーマンスが求められます。最適なデータベースの選定やチューニングが必要となります。

なお、外部CRMを利用している場合は、ユーザIDなどを属性としてもたせ、外部のCRMなどで検索した結果を渡すことも可能です。
複雑な絞り込みの実装をCRMにまかせることはできますが、その場合は、CRMとの連携部分の実装が必要となります。

Push通知の作成

Push通知の宛先や本文、オプションなどを指定して作成します。
実際に配信するときはもちろん、あらかじめ文言を用意しておき日時を指定して後で送ったり、定期的に送るという要望も多いかと思います。
その際は、作成したPush通知をデータベースに保持しておく必要があります。この管理もアプリサーバで行います。
文章はもちろん、絵文字も入力可能のため、Webブラウザ上で作成できるようにしておくと便利です。

次回へ続く

ラティス変形を使うとモデリングが楽になった

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Mayaを使っていくと便利な機能が数えきれないほどあることがわかってきます。 今回はモデリング作業時に使うようになったデフォーム(変形)機能の一つである「ラティス」についての記事です。

はじめに

enter image description here
モデリングの仕上げにオブジェクトの形状の微調整を行う際、
特定の範囲をポリゴンの流れを保ったまま柔軟に変形をかけたい時があります。
しかし、

・ 移動ツールでの頂点ベースの修正は、変形させた範囲の一つ一つの頂点を細かく動かしてポリゴンの流れを整え直さなくてはいけない…

・ソフト選択※をオンにすれば選択した頂点の周りも影響して移動してくれるけれど数値の設定をしつつ作業をするのが面倒くさい…

そんなときに便利なのがMayaのデフォーム機能の一つであるラティスです。

ソフト選択
ソフト選択(Soft Select)を使用すると、ポリゴンまたは NURBSサーフェスの減衰のあるコンポーネントを選択できます。減衰は選択したコンポーネントの周囲にある、ウェイト付けに従って変換するときに影響される領域です。減衰のあるコンポーネントを変換すると、コンポーネントを個別に調整しなくても、複数のコンポーネントにまたがる滑らかな変換を実行できます

使い方

変形させたいオブジェクトを選択した状態
モデリングメニュー(F2を押す)のメニューバーにある「デフォーム」から「ラティス」を選択

ラティス変形1

すると選択したオブジェクトを覆う、ラティス(デフォルトでは縦に4分割されているボックス)が生成されます。
このボックスを選択した状態で右ドラッグをするとオブジェクトモードとラティスポイントというボタンが出てくるのでラティスポイントのところまでドラッグしましょう。

ラティス変形2

先ほどのボックスの頂点にあたる部分がラティスポイントとしてピンクに表示されると思います。
このラティスポイントを適当に動かしてみると、動かしたラティスポイントに近いメッシュがラティスポイントに合わせて柔軟に変形していることが分かります。
ラティスポイントの移動

このラティスポイントを選択して移動、スケール、回転させることでオブジェクトの変形を行います。
スケールや回転を使って変形

変形が完了したらオブジェクトを選択してヒストリーを削除すればラティスが消えて変形後のオブジェクトが残ります。
ヒストリを消去しラティスを解除

ラティスツールはオブジェクト毎ではなく部分選択したフェースにも適用可能なので部分的に変形作業を行いたいというときに使えます。
以下の画像のように球体の一部を変形させたい場合は変形させたい箇所をフェース選択しラティスを適用します。
フェースのみにラティスを適用することも可能

ボックスの分割数はオプションボックスで設定するか、チャネルボックス上で入力して増減が可能です。(ただし変形を行う前にしか分割数は設定できません)

enter image description here
ラティスボックスを選択し
チャネルボックスを見てみると
S分割数、T分割数、U分割数の3つの値があると思います。
この値を変えて縦・横・奥行きの分割数を増やしたり減らしたりします。
S分割数はX軸方向の、
T分割数はY軸方向の
U分割数はZ軸方向の分割数を変えられます。

オブジェクトのアウトラインやスケールなどの全体的な変形作業の際には分割数は少なめに、
より細かい変形作業では分割数を多めに設定すると思うように変形しやすいです。

(左はU分割数を2→4にしてみた画像、右はS分割数を2→4にしてみた画像)
分割数の変更

ラティス変形を用いることでラティスポイントのみの制御でオブジェクトの複雑な変形を実現してくれます。
enter image description here

終わりに

ラティス変形を知る前は頂点ベースでの変形を行なっていたため、
思い描く形に変形できるまでに微調整を繰り返しながらの作業が多く時間がかかっていました。

指定した範囲を柔軟に変形することができるラティス変形を使うようになってから、
形の調整やモデリング作業自体が楽になった気がします。

基本的な機能のみを知っていれば3DCGで作品を作ることは可能ですが、
ソフトの機能をしっかりと知った上で使いこなしていく事で、結果的に作業時間を減らすことにつながるのでどんどん知識を蓄えていきたいところです。

参考動画
『The Maya Toolbelt – Lattice Deformers 』

ES6を使う

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Ruby on Rails のフロントエンドでは 未だにJavaScript は CoffeeScript + jQuery を使うのが一般的です。 しかし、Rubo on Rails 5.1 より jQueryは非公開になり WebPackerが導入されました。 今回は、ES6やそれをとりまく技術としてモダンなJSプログラミングを試してみます。

ES6ってなに?

ECMAScript2015 などと呼ばれるECMAScript(JavaScript)の6番目の規格です。
最近(といっても結構前)のchromeやfirefox、opera、edgeが一部対応しています。
JavaScriptでイマイチだった、オブジェクト指向や非同期コールバックの処理がすっきりしています。
class、アロー関数、Promiseが導入されています。

FirefoxのES6への対応状況

なお、CoffeeScriptは、Version 2からECMAScript2015への対応が発表されています。

CoffeeScript Version 2

ES6っぽい開発をする

ES6に対応してきているブラウザも多いですが、互換性が面倒。でも、古い規格はもうごめんだ。
というために、便利なツールがたくさんあります。
その中で有名なのが、 npm, webpack, babel です。 nodejsも使います。

  • npmyarn でパッケージ管理
  • webpack で依存関係などのバンドル管理
  • babelでトランスパイル

重要そうな機能のまとめ

試してみたい

ChromeやFireFoxの開発者ツールで使えます。

変数と定数

varのほかに、letconstが追加されました。

varは今まで通り。

var foo1 = 1;
var foo1 = 2;
foo1 // 2

let は varと同じく変数の定義ですが、再定義がエラーになります。

let foo2 = 1;
let foo2 = 2; // SyntaxError

const は定数。再定義、再代入がエラーになります。

const FOO = 1;
const FOO = 2; // SyntaxError

class

prototypeを使うより直感的に使えるようになりました。

class Book {
  constructor(title)  {
     this.title = title;
  }
  genre() {
    console.log("unknown");
  }
  static bar() {
  }
  static foo() {
     this.bar();
  }
}
class Dictionary extends Book {
   genre() {
     console.log("dictionary");
   }
} 
var dict = new Dictionary("広辞苑");
console.log(dict.title);  // 広辞苑
dict.genre(); // dictionary

アロー関数

(arg) => は function(arg) と同じ。次項のPromiseを使うときなどに見やすくかけるようになります。

var func = foo => console.log(foo);
func("hoge"); // hoge
var func2 = (foo,bar) => console.log(foo + bar);
func2("hoge", "hare"); // hogehare
var func3 = (all, e) => {
    var plus = all + e;
    console.log("plus = " + plus);
};

Promise

非同期処理を扱います。とてもシンプルな仕組みなのですがなれるまで少し時間がかかるかもしれません。
Promiseは非同期処理が必要なユースケースで多用されます。fetch() などの、I/Oやネットワークアクセスがあるものや、サービスワーカとの通信などで多用されています。
jQueryにも Deferred Objectが導入されていますが、それとほぼ同等のものです。
以下の例のように、fetch()の処理が完了したらthen内のコールバックが呼ばれます。
fetch()でエラーが発生したら catch内のコールバックが呼ばれます。

fetch("./foo.json").then((response)=> {
}).then((body) => {
}).catch((err) => {
});

Promiseは、処理中の状態と2つの結果の状態 resolve と reject にが存在します。
既存の処理をPromiseオブジェクトにラップすることで非同期処理にすることができます。
ラップにはコンストラクタを使用します。Promiseコンストラクタには resolve, rejectという関数オブジェクトが渡されます。

new Promise(function(resolve, reject) {
    // 時間がかかる処理
    if (成功したら) {
        resolve("thenに渡すコールバックの引数");
     } else {
        reject("catchに渡すコールバックの引数");
    }  
});

戻り値は Promiseオブジェクトがすぐに返ります。コールバック内で resolveかrejectが呼ばれたら処理が完了したのでthenまたはcatchメソッドで値を取得することができます。

常に成功するものをPromiseにしたい場合は Promise.resolve("thenに渡すコールバックの引数") とできます。
必ず “thenに渡すコールバックの引数” でresolvedしたPromiseを取得できます。
また、 Promise.reject("catchに渡すコールバックの引数")でrejectedしたPromiseを取得できます。

enter image description here

iTerm2で快適な環境作り

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

入社してからしばらくは、Mac標準のターミナルアプリを利用していたのですが、いまいち使いにくいのでiTerm2を導入しました。

環境

Mac OS El Captain バージョン 10.11.5

iTerm2 3.0.15

ダウンロードとインストール

iTerm2のサイトからダウンロードすることが出来ます。

iTerm2のダウンロードページ

また、Homebrewを利用することも可能です。

brew cask install iterm2  

執筆時現在(2017/07/11)では、Stable Releasesとしてバージョン3.0.15までリリースされています。

iTerm2の便利なショートカット

iTerm2では様々な機能をショートカットで利用することが出来ます。

ここでは、私が普段利用しているショートカットの一部を紹介したいと思います。

入力補完

[command] + ;

コマンドを補完してくれます。

クリップボード履歴

[command] + [shift] + h

過去にコピーしたテキストを、「いつコピーしたか」という情報と共に確認・使用することが出来ます。

検索

[command] + f

普通の検索ですが、一致部分を全件ハイライトしてくれるため便利です。

画面分割

# 縦分割
[command] + d

#横分割
[command] + [shift] + d

画面を縦・横に分割することが出来ます。

複数のコードを見ながら作業したい時などによく利用しています。

タブの作成

[command] + t

画面分割ではなく、新しいタブを作成することが出来ます。

ここで紹介したもの以外にも、ショートカットは数多く存在します。

詳しくは、iTerm2のDocumentationをご確認ください。

iTerm2 – Documentation

Profile設定

iTerm2では、Profile設定を利用して背景色や文字色を変更することが出来ます。

Profileの確認・編集はPreferencesから行うことが出来ます。

iTerm2 -> Preferences -> Profiles  

enter image description here
プロファイルにショートカットやコマンドを設定して簡単に呼び出すことも出来るので、使いこなせれば非常に便利だと思います。(まだ扱いきれていないのが現状です)

Profileをssh接続へ利用

sshの接続先に応じてiTerm2のProfileを変更するように設定しました。

設定ファイルを作成して、aliasを書き換えることで実現しています。

# ~/bin/ssh-change-color

###接続先に応じてProfileを変える
if [[ "$@" =~ ssh-access-point-1 ]]; then
  printf "\033]50;SetProfile=Profile-1\007"
elif [[ "$@" =~ ssh-access-point-2 ]]; then
  printf "\033]50;SetProfile=Profile-2\007"
fi

#ssh接続からexitした際にDefaultに戻す
trap printf "\033]50;SetProfile=Default\007" EXIT

ssh $@  
#~/.bashrc
alias ssh='~/bin/ssh-change-color'

ローカル環境なのかそうでないのか等が分かりやすいので、事故の防止に繋がると期待しています。

終わりに

今回は、iTerm2の簡単な紹介をさせていただきました。

入社するまでは、ただただ標準搭載の諸々をそのまま使う生活だったので、ツールひとつでここまで変わるものかと感動しております。

他にもおすすめのプラグインやツールを先輩方から教えていただいているので、よりより開発環境の構築に努めていきたいと思います。

【Excel】かっこいい?MATCH関数の使い方

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ちょっとかっこいいと思ったMATCH関数の使い方をご紹介します。

MATCH関数について

今回紹介するのは、エクセルに備わっているMATCH関数です。
まず初めに、MATCH関数の基本的な使い方をご紹介しようと思います。
MATCH関数は、指定した値を指定した範囲から探し「範囲の中の何番目にあるのか」を教えてくれる関数です。
使い方は、MATCH(検査値、検査範囲、[照合の型])
の順に指定します。
①検査値:これが探したい値です。
②検査範囲:①で設定した値を探したい範囲です。
③照合の型:これはどのような検索方法をするか、です。
 ここには1,0,-1の値が設定でき、
 1:検査値以下の最大の値
 0:検査値に完全一致する値
 -1:検査値以上の最小の値
 を検索します。
例として、次の図のような場合にMATCH関数を用いると、
「銃士A」の検査範囲内での位置、「3」が返されます。
MATCH関数

かっこいい?使い方

ゲーム開発でマスターデータをエクセルで作成している場合、よくVLOOKUP関数というものを用いて、キャラや装備に対応したコード等を検索するということがあると思います。このVLOOKUP関数は便利な関数なのですが、一つ欠点があり、それは「基準値より左側のセルを検索できない」ということです。
しかし、ゲーム開発ではたまに、コードから逆にキャラを検索したい!という場面に出くわしたりします。
そんな時、MATCH関数とOFFSET関数という二つの関数を組み合わせることで、VLOOKUP関数できなかった、柔軟な検索が可能になります。

◎VLOOKUP関数
VLOOKUP関数は、VLOOKUP(検査値、検査範囲、列番号、検査方法)と指定することで、検査範囲の一番左の列の中から検査値を見つけ、列番号に対応した値を出力しれくれる関数です。この関数は、前述のとおり、「検査値よりも左側の列を検索できない」という性質を持っています。
例として下図の赤矢印方向には検索できますが、青矢印方向の検索はできません。
VLOOKUP関数
つまり、VLOOKUP関数では、上図の「キャラからコードの検索」は可能ですが、「コードから逆引きでキャラを検索」することは(列追加等しない限り)出来ないのです。
しかし、OFFSET関数とMATCH関数を組み合わせると、VLOOKUP関数ではできなかった、左側検索が可能になります。

◎OFFSET関数
OFFSET関数は基準となるセルから指定した行・列数分だけ移動したセル内容を返す関数です。
OFFSET(基準,行数,列数)で指定し、基準から行数、列数分だけ移動した場所の内容を教えてくれます。下図の例では、「キャラ名」から下へ2行、右へ1列だけ移動したセルを参照しています。
OFFSET関数
通常、行数や列数の指定に正の値を入れると、基準のセルより下の行、右の列を対象に移動します。ただ、このOFFSET関数は「マイナス」の行数列数が指定でき、基準セルより上側・左側にも移動可能です。

◎かっこいい?使い方
そこで、
OFFSET(基準セル , MATCH(検査値,検索範囲,0)-1 , -1)
のように、OFFSET関数の行数指定にMATCH関数を用いると、MATCH関数で見つけた場所まで移動し、その後左側へ1列移動する、「左側検索」が可能になるのです!
enter image description here
ここで行数指定を
MATCH(検査値,検索範囲,0)-1
と、「-1」しているのは、OFFSET関数が基準セルを「0番目」と数えるのに対し、MATCH関数は基準セルを「1番目」と数えるためです。

終わりに

いかがでしょうか。実はINDEX関数とMATCH関数の組み合わせでも同様のことが可能です。また今回はVLOOKUP関数を比較対象にしましたが、同様にHLOOKUP関数の代用としても使えます。この技には検索方向の制約はなく、応用すればどこのセルでも検索対象にすることが可能になります。
しかし、複数の関数を組み合わせている以上、後から見て分かりにくくなることには注意が必要です。

第2回「Lionが考えた和製ゲームと海外製ゲームの違いはなんだ!?」

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

第2回「Lionが考えた和製ゲームと洋製ゲームの違いはなんだ!?」を話します。 興味があれば、見ていってね!

みなさんこんにちは!Lionです!
この前の記事いかがだったでしょうか?
ゲームの企画書って何だろう?っていうのが少しでも伝わったのであれば、こちらとしても嬉しいです。

さて、本日は「Lionが考えた和製ゲームと海外製ゲームの違いはなんだ!?」について話させていただきます。
ただ、幅が広い分野になりますので、今回は「キャラクターの見た目」に注目していきたいと思います。

「和製ゲームのキャラクターの見た目とは?」

和製ゲームとは、日本ユーザー向けに作られたゲームのことです。
enter image description here
例えばですが、可愛い女の子がド派手な魔法を使ったり、大きな武器を振り回したりするゲームが最近の流行りですよね?
男主人公なら、見た目は華奢なのに炎を纏う剣で、辺りを燃やし尽くしたりと見た目から想像できない強さを持っていたりします。
ではなぜ、「このキャラ可愛いし超強いじゃん!」って思うのはなぜなんでしょうか?
また、グラフィックもリアル調ではなく、漫画やアニメ調が多くなります。
なぜ、和風パッケージゲームはこのように「漫画やアニメのようなグラフィックの可愛い女の子や華奢な男の子がド派手に闘うゲームが流行りなのか?」
それについて話すために、先に海外製ゲームの話をさせていただきます。

「海外製ゲームの特徴とは?」

海外製ゲームとは、外国ユーザー向けに作られたゲームのことです。
enter image description here
※creative commons by Jayel Aheram
例えばですが、体がムキムキに鍛えられた男主人公や筋肉がついている美人な女主人公など、よく見受けられますよね。
武器もナイフや銃火器といった、現代の人間が使えるものや、少し未来を先取りしたビーム兵器などが多いです。
確かに、筋肉ムキムキで銃を持っているなら強そうに感じますよね。
しかし、日本ユーザーの大方はそうはとらえないのです。

「日本と外国のユーザーが感じる見た目の違いとは?」

では、違いを比較してみましょう
「和製ゲーム」
・キャラクターの見た目が漫画やアニメ調が多い
・見た目とは裏腹な強さを持っている(小さいながら大きな斧を振り回すなど)
・攻撃や魔法の演出が激しい

「海外製ゲーム」
・キャラクターの見た目がリアル調である
・見た目がムキムキで、体格にあった武器などを使う
・銃や剣といった、現代人でも使えるような武器が多い
・和ゲーに比べて演出はド派手すぎない(魔法で辺り一帯が消し飛ぶなど)

簡単に比較するとこんな感じです。
和製ゲームは漫画やアニメ調のキャラクターを使うことが多いです。理由としては、日本固有の文化である「萌え」が流行しているからだと思われます。
そのため、日本ユーザーは「漫画やアニメ調といった雰囲気のゲーム」を好んで買う傾向が見られます。
可愛いキャラクターやかっこいいキャラクターをゲーム内で出さないと日本ユーザーのウケはあまりよくないようですね。

海外製ゲームは、今も「リアル調のキャラクター」が大人気です。
しかし、ここ最近では「日本の漫画やアニメ調のキャラクターのゲーム」が浸透していっています。
中には和製ゲームのキャラクターのコスプレをする人もどんどん増えています。
様々な和製ゲームを製作しているゲーム会社も日本版と外国版に分けて販売するようにもなりました。

もしかしたら、日本のゲームが世界に数多あるゲームの基準になる日が来るかもしれませんね!
どうでしたでしょうか?「和製ゲームと海外製ゲームの見た目の違い」について理解できたかなと思います。

では、次回は「第3回!Lionがゲームプランナーになるきっかけを与えたゲーム」についてお話します(_^)
さて、夏もこれからが本番なので、熱中症に気を付けてサマーバケーションしてください(‘ω’)ノ
では、みなさん!また会いましょう(´・ω・`)ノシ

第2回「Lionが考えた和製ゲームと海外製ゲームの違いはなんだ!?」

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

第2回「Lionが考えた和製ゲームと洋製ゲームの違いはなんだ!?」を話します。 興味があれば、見ていってね!

みなさんこんにちは!Lionです!
この前の記事いかがだったでしょうか?
ゲームの企画書って何だろう?っていうのが少しでも伝わったのであれば、こちらとしても嬉しいです。

さて、本日は「Lionが考えた和製ゲームと海外製ゲームの違いはなんだ!?」について話させていただきます。
ただ、幅が広い分野になりますので、今回は「キャラクターの見た目」に注目していきたいと思います。

「和製ゲームのキャラクターの見た目とは?」

和製ゲームとは、日本ユーザー向けに作られたゲームのことです。
enter image description here
例えばですが、可愛い女の子がド派手な魔法を使ったり、大きな武器を振り回したりするゲームが最近の流行りですよね?
男主人公なら、見た目は華奢なのに炎を纏う剣で、辺りを燃やし尽くしたりと見た目から想像できない強さを持っていたりします。
ではなぜ、「このキャラ可愛いし超強いじゃん!」って思うのはなぜなんでしょうか?
また、グラフィックもリアル調ではなく、漫画やアニメ調が多くなります。
なぜ、和風パッケージゲームはこのように「漫画やアニメのようなグラフィックの可愛い女の子や華奢な男の子がド派手に闘うゲームが流行りなのか?」
それについて話すために、先に海外製ゲームの話をさせていただきます。

「海外製ゲームの特徴とは?」

海外製ゲームとは、外国ユーザー向けに作られたゲームのことです。
enter image description here
※creative commons by Jayel Aheram
例えばですが、体がムキムキに鍛えられた男主人公や筋肉がついている美人な女主人公など、よく見受けられますよね。
武器もナイフや銃火器といった、現代の人間が使えるものや、少し未来を先取りしたビーム兵器などが多いです。
確かに、筋肉ムキムキで銃を持っているなら強そうに感じますよね。
しかし、日本ユーザーの大方はそうはとらえないのです。

「日本と外国のユーザーが感じる見た目の違いとは?」

では、違いを比較してみましょう
「和製ゲーム」
・キャラクターの見た目が漫画やアニメ調が多い
・見た目とは裏腹な強さを持っている(小さいながら大きな斧を振り回すなど)
・攻撃や魔法の演出が激しい

「海外製ゲーム」
・キャラクターの見た目がリアル調である
・見た目がムキムキで、体格にあった武器などを使う
・銃や剣といった、現代人でも使えるような武器が多い
・和ゲーに比べて演出はド派手すぎない(魔法で辺り一帯が消し飛ぶなど)

簡単に比較するとこんな感じです。
和製ゲームは漫画やアニメ調のキャラクターを使うことが多いです。理由としては、日本固有の文化である「萌え」が流行しているからだと思われます。
そのため、日本ユーザーは「漫画やアニメ調といった雰囲気のゲーム」を好んで買う傾向が見られます。
可愛いキャラクターやかっこいいキャラクターをゲーム内で出さないと日本ユーザーのウケはあまりよくないようですね。

海外製ゲームは、今も「リアル調のキャラクター」が大人気です。
しかし、ここ最近では「日本の漫画やアニメ調のキャラクターのゲーム」が浸透していっています。
中には和製ゲームのキャラクターのコスプレをする人もどんどん増えています。
様々な和製ゲームを製作しているゲーム会社も日本版と外国版に分けて販売するようにもなりました。

もしかしたら、日本のゲームが世界に数多あるゲームの基準になる日が来るかもしれませんね!
どうでしたでしょうか?「和製ゲームと海外製ゲームの見た目の違い」について理解できたかなと思います。

では、次回は「第3回!Lionがゲームプランナーになるきっかけを与えたゲーム」についてお話します(_^)
さて、夏もこれからが本番なので、熱中症に気を付けてサマーバケーションしてください(‘ω’)ノ
では、みなさん!また会いましょう(´・ω・`)ノシ

BoxのAPIを使って見よう。(その4)~【実践編】EXCEL(VBA)からグループと関連ユーザー・フォルダを取得

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。


0.グループ情報を取得にあたり

グルーブ管理の権限が必要です。

EXCEL(VBA)から呼び出す方法は、以下の過去記事を参照して下さい。

BoxのAPIを使って見よう。(その1)~概要と基礎情報
BoxのAPIを使って見よう。(その2)~実際にAPIでデータ取得
BoxのAPIを使って見よう。(その3)~VBAから呼び出す

1.グループの管理画面(2017/7/7 時点の画面)

グループの操作は、ウェブ上から操作しやすい設計となっています。

グループ一覧(TOP)

管理コンソールを開き、ユーザアイコンを選択して、グループタブを選択します。
グループの初期画面が、下図のようになります。

enter image description here

グループ詳細

グループ一覧から、対象のグループを選択した詳細画面となります。

enter image description here

グループ詳細の変更

グループ名、グループの説明、権限を設定可能です。

enter image description here

ユーザーを編集

グループに対応するユーザーを追加、またユーザーの持つ権限を変更する事が可能です。

enter image description here

共有フォルダの編集

グループに対応する共有フォルダを追加、また権限を変更する事が可能です。

enter image description here

2.グループ情報を取得するAPI

今回VBAでは、グループ一覧を取得し、グループに関連するユーザー情報一覧や、グループに関連する共有フォルダ一覧を取得して表示したいと思っているので、以下のAPIご紹介します。

Get Enterprise Groups

企業のすべてのグループを取得するAPI。※グループを表示する権限が必要です。

■接続方法(基本)

curl https://api.box.com/2.0/groups \
-H "Authorization: Bearer ACCESS_TOKEN"

■パラメタ内容

enter image description here

■接続方法(今回は?)

作成日、更新日、その他権限情報等も取得したいので、fields情報に必要な情報を追加して送信して見ました。

curl https://api.box.com/2.0/groups?fields=name,created_at,modified_at,invitability_level,member_viewability_level \
-H "Authorization: Bearer ACCESS_TOKEN"

Get Memberships for Group

指定されたグループメンバー情報すべて返します。
※これはグループ管理者だけが利用できることに注意してください。

■接続方法(基本)

curl https://api.box.com/2.0/groups/【GROUP_ID】/memberships \
-H "Authorization: Bearer ACCESS_TOKEN"

■パラメタ内容

enter image description here

■レスポンス例(”user”の部分が、ユーザー情報となります)

enter image description here

Get Collaborations for Group

指定されたグループのコラボレーション情報のすべて返します。
※これはグループ管理者だけが利用できることに注意してください。

■接続方法(基本)

curl https://api.box.com/2.0/groups/【GROUP_ID】/collaborations \
-H "Authorization: Bearer ACCESS_TOKEN"

■パラメタ内容

enter image description here

■レスポンス例(”item” の”type”が、”folder”であれば、共有フォルダです)
※このAPIでは、”folder”以外は、無いはずですが。

enter image description here

3.EXCEL上での整形結果

■グループ情報を出力した結果
enter image description here

■グループに紐付く共有フォルダを出力した結果
enter image description here

4.EXCELサンプル

サンプルを作ってみましたので、試してみたい方はご自由にどうぞ
サンプルEXCELをダウンロード
※VBAのコードは、現時点では非公開です。
※2017/10/16バグ修正(ファイル名にv3の記載あり)

enter image description here

EXCELを表示したときの初期画面

enter image description here

今回使用したAPIのリファレンス情報は、以下参照

Get Enterprise Groups
Get Memberships for Group
Get Collaborations for Group

まとめ

次回は、VBA以外から操作してみたいと思います。

※アピリッツではBoxの販売パートナーもしてるようです。

代理店情報

お問い合わせは、こちら へ

「なんとなく」で終わらせてませんか?”いらすと”で覚える並列と並行の違い

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

プログラミングしてると「並行」とか「並列」とか用語が出てきますが、なんとなく使ってませんでしたか? 私がそうでした。 そこでちょっと踏み込んで、並行と並列の違いについて調べてみました。

定義

情報技術用語としての定義は以下のようになっているそうです。

システムが複数の動作(処理の流れ)を同時に実行状態(in progress)に保てる機能を備えている場合を 並行(concurrent)と言い、複数の動作を同時に実行できる場合を並列(parallel)と言います。 重要な概念、違いは「実行状態」という点です。

並行と並列について-並行コンピューティング技法-を読んで – M-Tea」から

なんだか、こむずかしいですね。これをざっくり解説すると以下のようになります。

並行

  • 英語では’concurrent’
  • 複数の作業(例えば、電話の応対・オンラインサポート・書類の決裁など)をそれぞれの進行状況を保ちつつ「同時」に進行している状態
  • この場合の「同時」とは、電話の応対を10:00〜10:30, オンラインサポートを9:00〜12:00, 書類の決裁を10:10 〜 10:15 というようにそれぞれの作業時間がオーバーラップしているだけで、ある瞬間に2つの作業を同時に行っているというわけでは有りません。
  • 複数のタスクを一人でタスクスイッチしながら同時にさばいているイメージです。
enter image description here

並列

  • 英語では’parallel’
  • 複数の作業が本当の意味で「同時」に進行している状態
  • この場合の「同時」は並行の場合とちがって、まさしく複数の作業がある瞬間において同時に進行している状態を指しています。
  • 並列は平行を包含しています。
  • 複数のタスクを複数人で同時にさばいているイメージです。
enter image description here

さいごに

今までなんとなくで使っていた言葉ですが、いろいろ調べてみると異なる概念であることがわかりました。

あと、Canvaってツールでアイキャッチ画像とかこのエントリの画像作ってみましたが簡単で良いですね。おすすめです。

参考

AWSでRedashを使ってみる

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

20分くらいで、BIツール・redashがAWSでシュッと使えるようになる記事です。 https://redash.io/

Redashとは

Redash はデータソースからのデータの取得・取得したデータの可視化ができるWebアプリです。
本当はredashで作ったかっこいいグラフの画像を記事に貼って紹介したかったのですが、かっこいいグラフにできるデータがまだありません。残念です。

この記事を読めば、20分くらいでとりあえずAWSでOSS版のredashが動くようにはなるはずです。

インストール

用意されているAMIを使いましょう。一瞬です。アジアパシフィック (東京) はap-northeast-1 なので、 ami-34cfe853 を使ってインスタンスを作ります。
https://redash.io/help-onpremise/setup/setting-up-redash-instance.html

最初は今使っているamazon linuxのインスタンスに同居させようかと思っていましたが、amazon linux向けの
プロビショニングスクリプト が古いこともあり、少し格闘して諦めました。やめましょう
ubuntuならなんとかなると思います。

用意されているAMIを使う場合は、とりあえずインスタンスタイプとセキュリティグループだけ気をつければなんとかなります。

インスタンスタイプ

for small deployments t2.small should be enough

だそうです。 素直にこのアドバイスに従ってt2.smallかそれ以上にメモリのあるインスタンスタイプを選びましょう

素直ではないので t2.micro を使っていたところ、しばらくするとメモリが足りなくなったようでどんどんもっさりしていきました。
起動してしばらくはなんとか動いていたので、少し試してみたい程度ならなんとかなりますが。

セキュリティグループ

http, https のために80,443番ポートをあけておきましょう。
AWSのデータソースを使うなら、このセキュリティグループからアクセスできるようにデータソースのセキュリティグループを編集する必要があるかもしれません。

インスタンスの作成・起動ができればこれでもうredashが使えます。
ブラウザでパブリックDNSなり http://ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com/setup にアクセスしてみましょう。管理者アカウントが登録できるはずです。

管理者アカウントが登録できればデータソースやクエリの登録・ダッシュボードの作成ができるようになります。よかったですね。

アップデート

AMIのredashはそこそこ新しいバージョンなので、

cd /opt/redush/current
sudo bin/upgrade

だけでアップデートができます。
currentはシンボリックリンクなので、アップデート後はcurrentのリンク先は今いるのとは別のディレクトリになります。

設定

一人で使うぶんにはこれで使えるには使えるのですが、せっかくのWebアプリなので他の人にも共有・編集してもらいたいですよね。

新しくユーザーを登録するには2つ方法があります。

  • Googleアカウントで認証する
  • 名前・メールアドレスを入力して招待する

Googleアカウントで認証する

Googleアカウントを使う場合はドメインによる制限はできますが、それ以上に細かいユーザー登録の制限はできません。
例えば社内の誰でもアクセスしてもよいような場合ならば便利ですが、同じドメインの人全員に登録されてしまうと困る場合はこの方法を使わずにメールアドレスを入力して招待したほうがよいでしょう。
一応redashにはグループを作ってアクセス権限を管理する仕組みもありますが、デフォルトでは最初に入れられるグループの権限が強めです。
気をつけてやりましょう。

GoogleAPI側の設定

Google APIs コンソールから色々と登録します。
https://console.developers.google.com/projectselector/apis

プロジェクトを作成または選択して、認証情報を作成します。
作成する認証情報はOAuthクライアントID、アプリケーションの種類はWebアプリケーションです。

javascript生成元またはリダイレクトURIの入力を求められますが、

  • javascript生成元: http://[hostname]
  • リダイレクトURI: http://[hostname]/oauth/google_callback

です。

この認証情報のクライアントIDとクライアントシークレットをredash側に登録します。

redash側の設定

redashの本体は /opt/redash/current にあります。
sshでログインして、ドキュメントにある通りのことをしましょう(やっとそれっぽい作業が始まりましたね!)

  1. .env に二行ほど追加します。
export REDASH_GOOGLE_CLIENT_ID="さっきのクライアントID"
export REDASH_GOOGLE_CLIENT_SECRET="さっきのクライアントシークレット"
  1. ログインを許可するGoogleアカウントのドメインを指定します。
sudo -u redash bin/run ./manage.py org set_google_apps_domains "allowed-domain.com"
  1. redashを再起動します。
sudo supervisorctl start redash_server

晴れてGoogleアカウントでログインできるようになりました。よかったですね。

Googleアカウントを使わない場合

アプリ上で登録する

Webアプリ上の Settings > USERS から新しいユーザーの登録ができます。
メール送信の設定がちゃんとできていれば、招待用URLが記載されたメールが届きます。
ちゃんとできていなかった場合(または設定しない場合)でも招待用のページへのURLが表示されるので、別の方法で送りつけることができればなんとかなります。

招待用URLは環境変数 REDASH_HOST を設定しないとうまく表示されません。
今のところ真面目にメールを送信できる環境を作る気がないので、とりあえずこれだけ設定します。(気持ちの問題です)

redashの本体は /opt/redash/current 以下にあります(二回目)。

.envに以下を追加して、

export REDASH_HOST="http://[hostname]/"

redashを再起動します。

sudo supervisorctl start redash_server

コマンドラインから登録する

コマンドラインからもユーザーの管理ができます。
ドキュメントが見つからないので、 redash/cli/users.py を見てやることになりそうです。

一番害のないコマンドはユーザー一覧を表示する list です。

sudo -u redash bin/run ./manage.py users list

ユーザーの作成(+パスワードの設定)

sudo -u redash bin/run ./manage.py users create example@example.com "Example User"

admin権限の付与

sudo -u redash bin/run ./manage.py users create example@example.com "Example User"

あたりがコマンドラインから設定できます。

コマンドラインから他の設定変更もできるようです。

まとめ

きっと動くようにはなっているはずです。よかったですね。

ec2インスタンスは再起動するたびにIPアドレスが変わるので、Elastic IPで固定IPの取得・インスタンスへの紐付けくらいはしておいたほうがよさそうです。
20分くらいでできます!と書きましたが、amazon linuxにredashを入れようと奮闘したり、t2.microでmysqlクライアントを入れようとしてメモリが足りなかったりしてもっと時間がかかりました。素直にやりましょう。

かっこいいグラフが作れるようになったあかつきには、AWSで作ってあるMySQLサーバーをデータソースに設定したり、クエリ登録してみたり、グラフを作ってみたりした記事を書きたいです。

勇気が湧く!gitやらかし防止コマンド&オプション集!

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

皆さんはgitを使っていてミスをしてしまうことはありませんか?
ミスとまではいわずとも「あの変更いらなかったな」とか「間違えてコミットしちゃった」とかはあると思います。

それらをなくすために一番大事なのは「確認」です。

確認をより確信あるものにするために個人的によく使うコマンドやオプション、
ミスをしてしまったときになんとかするものを紹介しようと思います。

git diff –cached

git diff はほぼ必須の確認コマンドだと思います。
現在ブランチの変更した差分を表示してくれるので、僕はcommitする前には必ず確認しています。
ですが、先にaddをしてしまうと差分を表示してくれません。

--cachedオプションをつけることによって、addした後でも差分を表示できます。
git diffで確認し忘れたときに、いちいちgit reset HEADしてチェックするのはめんどくさいですよね。

git add test.txt

git diff

git add test.txt

git diff --cached

diff --git a/test.txt b/test.txt
index e6a6914..2b70263 100644
--- a/test.txt
+++ b/test.txt
@@ -1,5 +1,5 @@
....以下省略

git status -uall

git statusだけ打っても新しく追加したディレクトリ以下のファイルは表示してくれません。
-uallオプションをつけると全部追跡してくれるので確認することができます。

git status

On branch develop
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    testDir/

nothing added to commit but untracked files present (use "git add" to track)

git status -uall

On branch develop
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    testDir/a.txt
    testDir/b.txt
    testDir/c.txt

nothing added to commit but untracked files present (use "git add" to track)

git log –name-status

個人的に一番使うlogのオプションです。
下記のようにそのコミットで変更されたファイルが出力され、
git status + git log のようなイメージで使えます。

git log --name-status

commit 49d8d9c4ff2e3bdfc7fd4e18eb3fa9e5507ed89b
Author: ziguzagu
Date:   Tue Jul 4 16:16:40 2017 +0900

    テストファイル追加

A       test_00.txt

commit 53c55b128356aa960739b5f999b9917ed63a9784
Author: ziguzagu
Date:   Tue Jul 4 16:10:10 2017 +0900

    hugaクラスにメソッド追加

M       app/models/hoge.rb

git reflog

ローカルで行ったcommit, merge, resetなどのログを見ることができます。
マージしていないブランチを消してしまったり、
git reset --hardなどで戻しすぎてしまった場合などでも履歴を見れるので、
任意の時点まで戻すことができます。

git reflog

36336b7 HEAD@{0}: commit: xxxx => cccc
331f0b6 HEAD@{1}: commit (merge): Merge branch 'change_text' into develop
4d02134 HEAD@{2}: checkout: moving from change_text to develop
510169f HEAD@{3}: commit: bbbb => cccc
1ef1996 HEAD@{4}: checkout: moving from develop to change_text
4d02134 HEAD@{5}: commit: bbbb => aaaa
1ef1996 HEAD@{6}: commit: テキスト作成
3057744 HEAD@{7}: checkout: moving from master to develop
3057744 HEAD@{8}: commit (initial): 最初のコミット

git reset --hard 4d02134

上記の例ではcommit: bbbb => aaaaのブランチまでを戻すことができますが、
このやり方の注意点として、以下の点が挙げられるので使用するときは注意しましょう。

  • 現在編集中のファイルは消えてしまう
  • 作業していたブランチを問わずにもどせてしまう

終わりに

ミスをしないための「確認」についての記事になりましたが、
もしミスをしてしまったときの対処法も知っておけば、より勇気を持って動けると思います。
自分はgit reflogでhash値を調べられることを知ってからはmergeに対する恐れは減りました。

最終的には確認の方法を知っていても自分が確認を忘れたり、
間違っているものを正しいと思い込んでたりしたら意味がないのでコマンド以外に
他の人にチェックしてもらえたりするとさらにいいですね。

ゲーム業界の常識!売上に響く4つの基本KPI

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ゲーム業界ではいったいどんなKPIが使われているのでしょうか?
今回は商品としてゲームを制作・運営するには避けては通れない「売上」に注目し、
「DAU」「ARPU」「DPU」「ARPPU」の4つのKPIをご紹介します。

KPIとは何か

KPI(Key Performance Indicator)とは、目的を達成するための過程を計測するための中間目標のことを指します。重要業績評価指標とも呼ばれていますね。
最終的なゴールとなる目標を定量的に示すものはKGI(Key Goal Indicator/重要目標達成指標)と言います。

KPIはKGIを達成するために、その構成要素を分解し、最終目標までどれくらい達成できているのか、達成できそうなのかを評価するために用いられます。

「売上」を分解!~ゲーム業界のKPI~

enter image description here

ゲーム業界ではいったいどんなKPIが使われているのでしょうか?
今回は商品としてゲームを制作・運営するには避けては通れない「売上」に注目したいと思います。
※本記事ではKPIを扱うことの多いソーシャルゲームについてのお話になります。

分解方法① 「売上」 = DAU × ARPU

最も基本的な分解方法は顧客数×顧客単価とすることです。
ゲーム業界では、日ごとのKPIを追うことが多いため、顧客数を一日の利用者数、顧客単価を一日の利用者一人当たりの売上としています。
以下で各KPIについて詳しく見ていきます。

DAU(Daily Active Users)

DAUとは、一日当たりに一回以上活動のあったユーザ数のことを指します。
要は「ゲームで遊んでくれている人はどれくらいいるのか」ってことです。

活動とは、ゲームにログインしただけといった場合も含まれています。
必ずしもゲームをプレイしているわけではないという点、注意が必要です。

ARPU(Average Revenue Per User)

ARPUとは、活動のあった一ユーザ当たりの支払い金額のことを指します。
今回は日次で見ているので一日当たりの指標になりますね。

分解方法② 「売上」 = DPU × ARPPU

もう一つの方法として課金者数×課金者一人当たりの顧客単価に分解する方法があります。
基本プレイが無料のゲームではユーザを課金者と非課金者と分けて捉えることもあるため、こういった捉え方もあるのです。
こちらも各KPIについて詳しく見ていきましょう。

DPU(Daily Paid Users)

DPUとは、一日当たりにお金を支払ったユーザ数のことを指します。
これは「有料で遊んでくれている人はどれだけいるのか」ってことですね。

このゲームにお金を支払う価値があると思ってくれている人数とも取れるので個人的にはかなり重要度の高い指標だと思っています。

ARPPU(Average Revenue Per Paid User)

ARPPUとは、お金を支払った一ユーザ当たりの支払い金額のことを指します。
つまり「有料で遊んでくれている人は平均どれだけお金を使っているのか」ということです。

ARPUと間違えやすいのでエーアールピーピーユーではなくきちんと意味を覚えておいた方が混同せずに済むでしょう。

まとめ

今回ご紹介したゲーム業界で使われているKPIは
「DAU(Daily Active Users)」
「ARPU(Average Revenue Per User)」
「DPU(Daily Paid Users)」
「ARPPU(Average Revenue Per Paid User)」

以上4つになります。
そう、基本を知るだけでは足りないのです。「どう活用するのか」が重要になります。
今後また機会ありましたらこれらのKPIをどう活用していくのか?といった記事も書きたいと思います。続くかも?

BoxのAPIを使って見よう。(その3)~EXCEL(VBA)から呼び出して、直接EXCELに結果を出力する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

1.どうして、EXCEL(VBA)を使うのか

実は、下図のウェブサーバを作れる自信がないのと
出力結果を直接EXCELで加工してしまいたい!と思ったのがキッカケです。

enter image description here

1.1.作成イメージ

  1. EXCEL上にボタンを追加
  2. InternetExplorerを使用して、認証画面を表示  前回の説明(その1その2)参照
  3. 取得したいAPIを実行
  4. EXCELの別シートに出力
enter image description here

1.2.認可コード要求~アクセストークン取得までのイメージ

上記、項1.のウェブサーバを使用している部分を、VBAで実装して見よう。って事です。

enter image description here

2. 実際にどんなVBAコードを使えばよいか(一部)

2.1.BOXから認可コードを取得

InternetExplorerオブジェクトのNavigateメソッドを使って、認可コード要求をしてみます。

■以下はサンプルです。

    '-- IE を起動する
    Dim objBrowser As Object
    Set objBrowser = CreateObject("InternetExplorer.Application")

    With objBrowser
    '-- IEを表示
        .Visible = True

        '-- 表示位置を設定
        .Top = 100  'Y位置(上下)
        .Left = 200  'X位置(左右)
        .Width = 650 'IEウィンドウの幅
        .Height = 800  'IEウィンドウの高さ

        '-- 認証画面を表示
        .Navigate "https://account.box.com/api/oauth2/authorize?response_type=code&client_id=" & CLIENT_ID"

        '-- IEが表示されるまで待機
    Do While .Busy = True Or .readyState <> 4
        DoEvents
     Loop

    End With

2.2.アクセストークンを取得

次は、ブラウザを表示する必要がないため、msxml2.xmlhttpオブジェクトを使って、アクセストークン要求をしてみます。

■以下はサンプルです。

    '-- Access Token の取得 (HTTP POST 要求)
    Dim objXHttp1 As Object
    Set objXHttp1 = CreateObject("msxml2.xmlhttp")
    objXHttp1.Open "POST", "https://api.box.com/oauth2/token", False
    objXHttp1.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    objXHttp1.send "grant_type=authorization_code&code=" & strCode & "&client_id=" & CLIENT_ID & "&client_secret=" & CLIENT_SECRET

2.3.JSONをパースする

EXCEL(VBA)でJSONを扱うには、VBA-JSONをダウンロードして使用するのが、オススメです。
※レスポンス結果はUnicodeに変換しないと、文字化けしてしまいます。

■文字コード変換のサンプル

    Dim strResult As String
    strResult = StrConv(objXHttp2.responsebody, vbUnicode)

■VBA-JSONを使って、パースするサンプル

    Dim Folders As Object
    Set Folders = JsonConverter.ParseJson(strResult)

3.サンプル

サンプルを作ってみましたので、試してみたい方はご自由にどうぞ
サンプルEXCELをダウンロード(2019.07.29リンク誤り修正)
※VBAのコードは、現時点では非公開です。
※2017.10.18時点で、実践サンプルも公開中 (その4)(その5) の記事を確認してみて。

enter image description here

EXCELを表示したときの初期画面

enter image description here

今回は、Get Folder InfoGet Folder Itemsを実行してみて、EXCEL上に出力してみました。

まとめ

次回は、EXCEL(VBA)から、グループ情報をEXCELに整形して出力してみたいと思います。
管理者向けの管理コンソールから取得できる情報ですが、CSVダウンロード等の機能が現時点(2017.6.23)では無かったので作成してみようと思います。

Boxの販売パートナーもしてます。

enter image description here

お問い合わせは、こちら へ
BOXを使ったのアプリケーション開発も可能です。気軽にご連絡お待ちしております。

記事は見た目が100%!読まれるタイトルを付ける3つのコツ!

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

タイトルって本当に重要なの?

まず、見てもらわないと何もはじまりません!
この文章を読んでいる人もタイトルを見て、興味を持ったから読んでいるのではないでしょうか。
多くの情報が飛び交う現在の世の中では、読んでもらうためにタイトルで惹きつける必要があるのです。

あ、もちろん中身も大事ですよ?
タイトルと内容が一致していないことや「釣り」や「煽り過ぎ」はサイトの信用を落としてしまい、最悪の場合、二度と読んでもらえません。

①タイトルには数字を入れよう!

数字を入れると何が変わるでしょう?

enter image description here

「PVを生む記事を書くための方法」

enter image description here

月10万PVを生む記事を書くための7つの方法」

前者に比べると、後者は記事を読めばどんなことが出来るようになるのかイメージしやすいです。
ただPVを生むというよりも月10万PVという具体的な数字を出すことで説得力が上がり、
7つの方法と情報量があることで記事のボリュームを伝える効果が期待できます。

ちなみに情報量はどれくらいがちょうどいいのでしょうか?
多くの人は「7」を好むようです。あと日本人は「3」を好むんだとか。
数字を使う際は意識してみるといいかもしれません。

参考:なぜ人は「7」 という数字が好きなのか?

とはいえなんでもかんでも数字を入れてしまうと一覧表示のとき、
どの記事も似たようなタイトルになってしまい、見た目が悪くなってしまうことも…
やり過ぎ注意です。

②タイトルは簡潔に!30文字以内で作ろう!

伝えるべき情報は絞るべき!というのもありますが
「検索エンジンの文字数表示に入るためにタイトルは30文字以内で」
という有名なルールが一番の理由でしょう。
一般的によく使われる検索エンジンでは、

  • Google … 全角30文字前後(ほぼ固定)
  • Yahoo … 全角28~33文字程度

これを超えてしまうと最後が「…」となってしまい、
せっかくタイトルを付けても表示されない!なんてことに…。
enter image description here
もったいない!

また、検索したとき記事のタイトルをじっくり読む人はなかなかいません。
パッと見で何が書いてあるか判断できるようなタイトルであるほど検索者の目に留まり、
読んでもらえる可能性が高まるのです。
enter image description here
イイネ!

③読んだら役立つことが一目でわかるようにしよう!

役に立つかどうかどうやって判断するのでしょう?

enter image description here

「魅力的なタイトルについて」

enter image description here

初心者でもすぐにできる!魅力的なタイトルを付けるためのテクニック

判断基準は自分にとって読む価値があるかどうか、です。

  • どんな人に対しての記事であるのか
  • 書いてある内容がイメージできるか

このあたりを意識すると役に立つタイトルが作れるようになるのではないでしょうか。

検索している人は基本的に何か知りたいから検索しています。
この記事を読めば、あなたの知りたいことがわかります!
あなたの悩みや問題解決できます!ということを伝えることが大切です。

よく使われる役立つことがわかる言い回しは、
「~のコツ」「~のルール」「~のヒント」「~方法」「~のテクニック」などでしょうか。

まとめ

さて今回ご紹介したコツは
「タイトルには数字を入れよう!」
「タイトルは簡潔に!30文字以内で作ろう!」
「読んだら役立つことが一目でわかるようにしよう!」

以上の3点になります。
他にも様々な方法が世の中溢れています。
しかし、無理に全部を詰め込む必要はありません。要所を押さえればOKです。
あとは素晴らしいタイトルが天から降りてくるよう一生懸命、神様に祈りましょう。
enter image description here

※本記事の内容は個人の見解によるものになります。

ゲームプランナーを目指す就活生必見!役立つプランナー本とゲームプランナーに大事なものとは!

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

います!

皆さんこんにちは!Lionと申します。
ゲームプランナーを目指す熱き魂を持つ新卒の方に少しでも役立つ情報を投稿いたしますので、
何卒読んでいただければ幸いです!

さて…。今日は、ゲームプランナーになるべく就職活動を行っている新卒生の方々に
私が就職活動中に愛読していた一冊の本をご紹介したいと思います。

「ゲーム屋が教える!売れるゲーム企画書の書き方」

enter image description here
ゲーム屋が教える!売れるゲーム企画書の書き方-吉成 隆杜 (宝島社)

この本は、株式会社サクセスの社長が自ら著作したものである。

ゲームプランナーを目指してる皆さんも様々な本を読んでいるとは思いますが、
こんな疑問を浮かんだことはないですか?

①「企画書の書き方などは書いてあるけど、実際はどう書いたら良い企画書が書けるかがわからないよぉ…」
②「書き方とかじゃなくて、実例などがあればなぁ…」
③「そもそも、良い企画書ってなんだ?」

など…。
それを上記の本は全て解決してくれます!

本物の企画書が実例で記載されている!

この本の凄いところは、「実際に世に出ているゲームの企画書が丸々載せてある」ところです。
普通は企業秘密なのですが、そこを全てオープンに記載しています。

また、企画書を書いた人物にインタビューしている内容も書いているので、
「この企画書はこういう意図や狙いがあって作成されたんだ!」が一目でわかります。

上手く企画書を書くテクニックなんてタイトルの本よりも、「現場の人が実際に書いた企画書」を参考にした方が何倍も勉強になります。

この本を読めば誰でも良い企画書が書けるようになるの?

この本を読めば企画書の何たるかは理解できるかと思います。
しかし、本だけを読んでも良い企画書を書くことはできないのです。
もし、「良い企画書が提案できるゲームプランナーになりたい!」と思うのであれば、この本を読むのと並行して以下のこと行ってみてください。
①沢山色々なタイトルのゲームをプレイする
②そのゲームが面白いか?面白くないか?を考える
③遊んだゲームをもっと面白くする方法はないかを考える

これが、できるプランナーは本当に面白い案を沢山生み出すことができます。
早い話が、「ゲームを沢山プレイして、自分だったらこういう風に面白くするのになぁー」と考えることができればOKです!

まとめ:ゲームプランナーに大事な物

さて、色々話しましたが、どうだったでしょうか?
まとめとして、皆さんにゲームプランナーに必要な3つの極意をお伝えします。
①沢山ゲームをするべし!
②なぜ、そのゲームが楽しいのかを考えるべし!※楽しくなかったらなぜ楽しくないかも考えるべし!
③「実際の企画書が記載されている」本を買って、なぜその企画書が通ったか考えるべし!

これをこなせるようになったら、ゲームプランナーへの近道になると思います!

さて…。次、投稿する記事は「Lionが考えた和風パッケージゲームと洋風パッケージゲームの違いはなんだ!?」です。
お楽しみに(´∀`)ノ
ここまで、お読みいただきありがとうございました。また読んでいただければ嬉しいです!では(‘ω’)ノシ

Googleデータポータルの計算フィールドが役立つ!CASE関数編

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Googleデータポータルには計算フィールドというカスタマイズ機能があります。Googleアナリティクス上では編集できない、置換・統合といったデータ表現も可能です。計算フィールド内で使えるCASE関数について実例を踏まえてご紹介いたします。

この記事でまとめられていること

こんにちは。株式会社アピリッツでアナリストをしているssekiです。
以前、「情報共有ならデータポータルがおすすめ!マイレポートと比較してみた」という記事内で、GoogleアナリティクスのマイレポートよりGoogleデータポータルが使いやすいというお話をしましたね。

その後、データポータルを使って新卒一同の記事投稿状況を監視(もとい管理)していると、ふと小さな不満がわいてきました。

「ユーザー名が新卒の名前と一致しないから、わかりにくい・・・!!」

enter image description here

そうです。例えば、私のユーザー名「sseki」をURLから抽出して、ssekiが書いた記事の合計ページビュー数をアナリティクスやデータポータルで見るとこうなります。

私自身は/sseki/でも誰だかわかりますが、新卒全員分を監視するにはちょっと複雑ですよね。できれば実名で管理したい。

実は、そんな時にもデータポータルが役立つんです。

今回は、Googleアナリティクスデータを一部置換したレポートが作成できるデータポータルの機能について、使い方を交えてまとめてみました。

Googleデータポータルの計算フィールドとは

以前紹介し損ねましたが、GoogleデータポータルにはGoogleアナリティクスのマイレポートとは大きく異なる機能が搭載されています。それが計算フィールドです。

計算フィールドとは、データを元に新しいディメンションや指標をカスタマイズする機能です。

感覚的には、エクセルの関数やマクロに近いものになります。

2017年6月現在、データポータルには54個の関数が用意されています

これらの関数を使って、アナリティクスデータをもとに全く新しいディメンションや指標を作成できるのです。
マスターしたら、わざわざエクセルにエクスポートしなくてもレポート作成ができてしまうかもしれませんね!

計算フィールドの使い方

enter image description here
まず、ディメンションや指標の切り替え画面から「新しいディメンション/指標を作成」を押します。
すると、画像下側から現在設定されているディメンションと指標の表がせせり出てきます。

enter image description here
フィールドと書かれている右の「+」ボタンをクリックすると、計算フィールドが出現します。

カスタムフィールドに名前を付け、数式欄に関数やデータを組み合わせた数式を入力した後、「項目を作成」ボタンをクリックすると新しいディメンションや指標を作成できます。

CASE関数で条件付け置換が可能

データポータルの関数リストの中でも、私がイチオシしたいのがCASE関数です。
やや複雑ですが、エクセルのIF文のように条件付けを行ってデータを置換することができます。

例えば、私「sseki」の名前を「関」に置換する場合には次のようにCASE関数を使った数式が使えます。

CASE WHEN 第 2 階層 = "/sseki/" THEN "関" END

CASE関数はどんな条件のとき(WHEN)に、結果として何を表示するか(THEN)が基本文となっています。
そのため、条件文whenの中に「第 2 階層に”/sseki/”って文字があったら」を入れて、結果文thenの中に「”関”って表示して」と記述することで、条件別に置換することができます。

ちなみに、先頭のCASEと末尾のENDはCASE関数の開始・終了を知らせる文字なのでお忘れなく。

enter image description here
新しいディメンションを作成すると、ディメンション一覧に追加されて選択することで使用できます。
実際にディメンションを選択してみると、/sseki/が関になっているのがわかりますね。

複数条件の場合にはIN関数を使おう

前述した例の中では、条件文whenで「=」を使った単条件一致パターンを紹介しました。
実際には、複数条件に一致する場合の方がよく使うのかなと思います。
例えば、私が「sseki」と「mofumofu」という複数のアカウントを持っていたとします。
その両方のアカウントを「関」に統合したい場合、次の数式が使えます。

CASE WHEN 第 2 階層 IN ("/sseki/","/mofumofu/") THEN "関" END

IN関数は、カッコ内でカンマ区切りされた文字列に合致するデータを対象のディメンションや指標の中から探し出して出力する関数です。
もちろんOR条件のような論理演算子を使うこともできますが、たくさんの複数条件を記述する場合はIN関数のほうがお手軽です。

まとめ:CASE関数はどんなときにおすすめか

CASE関数はデータを一部置換したり、統合したいときに使える関数でした。
Googleアナリティクス上で置換する場合にはタグ改修などが必要となり面倒ですが、データポータル上で編集する分には数式を書くだけなのでお手軽です。

今回は、名前を変更したり統合することを例に出しましたが、その他にも例えば次のようなことが考えられるかなと思います。

1. アナリティクスデータの市区町村を漢字名に直す/都道府県や地方単位に統合する
2. 年齢層を若年層・中年層・高齢層に再区分する
3. アフィニティカテゴリを日本語訳する/大きなカテゴリに統合して管理する

ところで、ご紹介したCASE関数を含めた計算フィールドでの計算が元データを改変することはありません。
あくまでも元データをもとに計算するだけなので、アナリティクス上のデータが変わることはないということに注意しましょう。
逆に、「アナリティクスをいじって元データを変更したくないという人」や、「毎回エクスポートしてエクセルで作業している」という人にはおすすめの機能なので、ぜひ一度お使いになってみてはいかがでしょうか。

アニメ名探偵コナンの新一が出てる回だけを見たい

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

初投稿、新卒のいくたです。よろしくお願いします。
新一くんの声が好きなので、そればっかり見たいのです。
バーローなのです。

準備するもの

実装の概要

今回は、名探偵コナンの非公式ファンサイト「名探偵コナン応援サイト 毛利小五郎探偵事務所」から過去のアニメ各話の情報をとってきます。

とってきたデータをrubyのgemであるNokogiriでスクレイピング(解析)します。
ノコギリでギコギコ切って、必要なところ(新一くん登場回)だけを表示させる。
ざっくり言うとそんなイメージです。

コナン…ノコギリ…バラバラ死体…
なんだか事件の匂いがしますね。

webページの情報をとってくる

試しに以下のページをとってきて表示してみます。
名探偵コナン 事件データ・1996年度(TVアニメ)

# shinichi.rb

require 'open-uri' # open-uriライブラリを読み込みます

url = 'http://conan.aga-search.com/anime/1996/'
html = open(url).read # open-uriのおかげでURL先のデータを普通のファイルと同様に扱えます
puts html

実行結果

$ ruby shinichi.rb 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>名探偵コナン 事件データ・1996年度(TVアニメ)</title>

(省略)

Webページがhtmlの形式でとってこられました。

Nokogiri の使い方

表の各話の登場人物の項目に着目して、’新一’を含む行だけを抜き出します。

# shinichi.rb

require 'open-uri'
require 'nokogiri'

url = 'http://conan.aga-search.com/anime/1996/'
html = open(url).read

doc = Nokogiri::HTML.parse(html)
trs = doc.xpath('//*[@id="leftpane"]/table[2]/tbody/tr[contains(.,'新一')]')

今回の肝となる、’新一’を含む行だけ抜き出す処理を見ていきましょう。

doc.xpath('//*[@id="leftpane"]/table[2]/tbody/tr[contains(.,'新一')]')

XpathとはHTMLのような木構造の分岐点(ノード)を指し示す表現です。
Xpathメソッドで抜き出すノードを指定できます。

自分の好きなところでXpathを指定しようとすると、HTMLを見てidやらタグやらを確認することになります。
これが正直めんどくさいんです…

が!実はXpathを指定する複雑なパターンを自分で考えなくても、簡単に好きな要素を抽出できるんです!
次は、Chromeを使ったXpathのパターン取得方法をご紹介しましょう。

Xpathパターンはchromeが知っている

chromeで解析したいwebページを開き、デベロッパーツールを表示させます。
Elementsタブから抽出したい要素を右クリックして、Copy > Copy Xpath を選びます。

copy_xpath.png
図1 Xpathの指定パターン取得方法

//*[@id="leftpane"]/table[2]/tbody

HTMLをいちいち読まなくても、特定の要素を指定するパターンをchromeが教えてくれるのです。便利!

あとは抽出する条件を付け加えるだけです。
今回は’新一’という文字列を含むtrタグの内容をとってくるので、以下のように条件を追加します。

//*[@id="leftpane"]/table[2]/tbody/tr[contains(.,'新一')]

こちらの記事にいろんな指定方法がまとめられます。
詳しく知りたい方はどうぞ〜

最後の仕上げ

最後にとってきたデータの形を整えて出力します。

# shinichi.rb

require 'open-uri'
require 'nokogiri'

url = 'http://conan.aga-search.com/anime/1996/'
html = open(url).read

doc = Nokogiri::HTML.parse(html)
trs = doc.xpath('//*[@id="leftpane"]/table[2]/tbody/tr[contains(.,'新一')]')

# HTMLの解析結果をtr要素ごとに処理します
trs.each do |tr|
  td = tr.xpath('./td') # tdタグを取り出します
  story_number = td[0].text # tdタグの1番目の要素のテキストを取り出します
  story_title = td[1].text  # tdタグの2番目の要素のテキストを取り出します
  puts "名探偵コナン 第#{story_number}#{story_title}"
end

実行結果

$ ruby shinichi.rb 
名探偵コナン 第1話 ジェットコースター殺人事件
名探偵コナン 第2話 社長令嬢誘拐事件
名探偵コナン 第3話 アイドル密室殺人事件
名探偵コナン 第7話 月いちプレゼント脅迫事件
名探偵コナン 第10話 プロサッカー選手脅迫事件
名探偵コナン 第29話 コンピューター殺人事件
名探偵コナン 第32話 コーヒーショップ殺人事件
名探偵コナン 第33話 探偵団サバイバル事件
名探偵コナン 第42話 カラオケボックス殺人事件

新一くんが出ている回の話数とタイトルがとってこられました!

このキーワードを元に動画配信サイトで検索すれば、新一くんが出ている回だけを永遠見続けることができますね。

実は、新一くんと怪盗キッドは同じ声優さんが演じています。
‘キッド’を含む回も取って来られるように、条件を追加してもいいかもしれませんね。

それでは、今日はこの辺で。
読んでいただき、ありがとうございました。

最近人気な記事