ホーム ブログ ページ 34

CLIPSTUDIOvsPhotoshopここはこうなる仕様の違い①

0

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

イラスト作成ツールのCLIPSTUDIOPAINTとPhotoshopの各ツールの仕様を比較してみました。

 皆さんイラスト制作の際ソフトは何を使っていますか?私はセルシスのCLIP STUDIO PAINT PROとAdobeのPhotoshopCC2017を業務によく使います。片や漫画作成に特化したソフト、片や写真加工に特化したソフトと呼ばれるこの二つ。実は結構似たようなツールやコマンドシステムが揃っています。しかし似てはいても異なるソフト。同じコマンドやツールでも此方のソフトはこの仕様だが其方のソフトはこの仕様である、といった違いが存在します。今回はそんなそれぞれのソフトの仕様の違いについて載せていきます。

比較するのはこの二つ。

  • セルシス CLIP STUDIO PAINT PRO(クリスタ)
  • Adobe PhotoshopCC2017(フォトショップ)

どちらもコマンド変更していないデフォルト状態のものです。
今回はクリスタ→フォトショップという流れで比較していきます。この比較は主に自分がイラスト制作中に使っている部分での気づきなので掘り返せば他にも色々あると思いますがご容赦ください。それではいってみましょう。

レイヤー削除コマンド

 クリスタではレイヤーを選択した状態でBackSpaceキーを押すとレイヤーに描かれた内容が全て消えます。しかしフォトショップでは同じコマンドを使用すると指定したレイヤーごとデータが削除されます。ここで気をつけたいのがクリスタ気分で削除するとレイヤーごと削除されたことに気づかず他のレイヤーに描き込んでしまう場合です。レイヤー数が多くなってくると特に見逃しやすくなるので要注意。逆にフォトショ感覚でクリスタに削除コマンド→新規レイヤー作成をし続けるといつの間にか何も描かれていないレイヤーが大量に…なんてことにもなりかねないので気を付けていきたい所です。

フォルダー作成ボタン

 レイヤー管理欄の上部分にあるフォルダー作成ボタンがありますよね。ワンクリックで簡単に新規フォルダーが作成できるボタンです。クリスタの場合は「そのボタンをクリックして新規フォルダーを作成」してからまとめたいレイヤーを詰め込むのですが、フォトショップの場合はなんと「まとめたいレイヤーを複数選択した状態でフォルダー作成ボタンをクリック」するだけで選択したレイヤーが入っている状態のフォルダーが作成されます。まとめたいときにすぐさま選択してボタンを押すだけでまとめられるので感覚的にまとめやすいです。ちなみにクリスタでも「フォルダーを作成してレイヤーを挿入する」というコマンドは存在する為コマンド設定すればフォトショと同じ感覚でフォルダーにまとめられます。

クリッピングマスク

 個人的にマスク機能よりもお世話になっているのがクリッピングマスク機能。これをかければ下のレイヤーからはみ出ないように絵や効果がかけられます。そんな便利な機能、クリスタではフォルダーにクリッピング機能を付属できるのです。つまりかけたい効果や絵のレイヤーを全てフォルダーにまとめた状態でクリッピングが可能!クリッピング内容がまとめられることでかなりレイヤー欄が見易くなります。クリッピング内容を一つのレイヤーに結合する必要がないので細かな修正もしやすいです。
 一方のフォトショップはフォルダーにクリッピング機能は付けられません。レイヤーにしか機能がつけられないためマスク機能との併用がおすすめです。
enter image description here

ベクター線・シェイプツール

enter image description here
 描いた後でも支点(パス)を選択して線の微調整ができるだけでなく、拡大縮小してもぼやけることのない綺麗な画像が作り出せるベクター線。フォトショップではシェイプツールが近いものだと思います。それぞれ特徴があるので気づいた点を箇条書きにしてみました。

  • クリスタベクター線
    ・ベクターレイヤーを使えば描写内容が全てベクター線になる
    ・好きなペンツールを使いフリーハンドで線を描くことができる
     (勿論パスが備わるため太さや作成した線の位置調整も変更可能)
    ・ベクター線に特化した消しゴム設定が備わっている
    ・面状態での図形作成はできない(境界線のみで作成される)
  • フォトショップシェイプツール
    ・シェイプツールで描くと同時に新しくシェイプレイヤーが作成される
    ・星や五角形などの多角形やハートや音符などの複雑な形の図形データもデフォルトで数多く備わっている
    ・シェイプツールで囲った部分で面の作成や、境界線を線にする設定も可能。面や線を伴わない軌跡のみのパスも作れる
    ・滑らかな曲線を作りやすい。ただしフリーハンドの線は描けない

 どちらかというとクリスタは図形・フリーハンドの線の調整に強く、フォトショップは滑らかな曲線や面のある図形の作成に強いと感じました。特に滑らかな線で描け、面で構成できるフォトショップのシェイプツールはUIのシンプルな形のボタン制作やイラストにもよく活躍します。描く作品によってどちらのソフトも使っていきたいですね。

変形ツール

 縦横の伸縮や拡大縮小、左右反転だけでなく支点からの自由変形までできる変形ツールはデジタルならではの心強いツールです。この便利なツールも勿論どちらのソフトにも備わっています。クリスタの変形ツールで注目すべきところはレイヤー結合することなく複数レイヤーを選択した状態で選択範囲内の変形が行えるところ!選択範囲が適用された状態で移動が行えるので、各レイヤーに移動して個々にずらすことなく変形させたい部分だけをひとまとめに変形できます。モーションパーツの作成に便利ですね。
 一方フォトショップでは複数選択した場合、選択範囲関係なく、選択したレイヤー全体に変形がかかります。しかしフォトショップのすごいところはフォトショップにしかない変形ツール、遠近ワープとパペットワープです。遠近ワープはまるで移動して視点を変えたかのように建物の遠近感を変える3Dのような変形ツールです。パペットツールは好きなところにピンをおき、あとはそこを中心に人形のように動かしたり伸ばしたりできるツールです。さすが写真加工に特化しているだけあって変形部分のまわりの画像も違和感のないように処理してくれること。統合した状態でもスムーズに調整できます。
enter image description here

戻るコマンド

 作業中はデジタルならではのひとつ前の状態に戻すコマンドを良く使います。上欄の編集からでも使用できますが、Ctrl+z,Ctrl+shift+zのコマンドで簡単に戻ることができます。クリスタだとこのコマンドをひたすら押せばどんどん前の状態へ戻っていきますが、コマンド設定をいじっていないフォトショップだとコマンドが多少異なります。Ctrl+zの場合、「一つ前に戻る、戻した内容を元に戻す(一つ後に進む)」となります。戻したりやり直したりいったりきたりが一つのコマンドで行えます。では逆にずっと戻していく場合は?こちらはCtrl+z+altでクリスタと同じようにどんどん一つ前へ戻っていけます。ちなみにあまりにも内容を戻す必要がある場合はヒストリー画面で直接戻したい段階に飛んだほうが早いかと思われます。コマンドはカスタマイズできるのでどちらかの設定に合わせたほうがより混乱せずスムーズに作業が行えるでしょう。

 いかがでしょうか。まだまだ違いがあるので次回も続けて仕様の違いについてお話いたします。それでは。

Googleデータスタジオでアナリティクスのデータ管理が可能に!

0

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

Googleデータポータルに新機能が追加され、アナリティクスデータを閲覧レポート上で切り替えることが可能になりました。データポータルの閲覧権限だけで複数のアナリティクスデータを使えるので、情報共有のリスクが減る機能といえます。今回はデータ管理機能の使い方についてご紹介いたします。

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

こんにちは。株式会社アピリッツでアナリストをしているssekiです。
最近Googleデータポータルを使う機会が多くなり、作成したレポートを共有することが多くなりました。
データポータルは共有が簡単な反面、編集権限を与えていると知らぬ間に誰かに書き換えられていて困ることもしばしば・・・。
そんな不満を持っている最中、Googleが7月14日に神アップデートしてくれました!
enter image description here

「データ管理・・・?」

これを見つけた時の僕の気持ちです。
とりあえずググったのですが、日本語ページが何ひとつとして見つからなかったのでGoogleヘルプページ(英語版)を参考に使い方を理解しました。
今回は、データソースのGoogleアナリティクスビューをレポート上で変更できるデータ管理の機能について、使い方を交えてまとめてみました。

Googleデータポータルのデータ管理とは

Googleデータポータルの共有権限には2種類あります。

  1. 編集者権限:リンクURLを知っていればレポートを閲覧・編集どちらも可能
  2. 閲覧者権限:リンクURLを知っていればレポートを閲覧可能だが、編集は不可

1つのデータソースだけを定点観測する分には閲覧者権限のみでも問題ないのですが、複数のデータソースを見たり適宜フィルタリングをかけたり編集したい場合には編集者権限が必要でした。

しかしながら、複数人が勝手にレポート内容を変えると管理が煩雑になり、結構面倒くさくなります。
それを防ぐために、これまではデータソースごとに同じテンプレートのレポートを複数作成することで対応していました。(これも管理が面倒ではあるけど)

そんな状況で、データ管理が役立ちます。
データ管理はざっくりいうと「閲覧者権限でもレポートで使われているデータソースを(アナリティクスに限り)変更できる機能」になります。

データ管理の使い方

データ管理の使い方は極めて簡単です。まず、普通にレポートを作成しておきます。
とりあえずGoogle Merchandise Storeのデータを使って、メディア別のセッション数を表にしてみました。
enter image description here
次に、データ管理をクリックした状態で長方形を書きます。
enter image description here
「ビューを選択」が出ましたね。この状態で閲覧画面に戻りましょう。
するとこのように表示されます。
enter image description here
「ビューを選択」をクリックすると自身が持っているアナリティクスの閲覧権限一覧が表示されます。
変更したいビューにカーソルを合わせてクリックすることで、レポート内の全データを変更することができます。
enter image description here
新卒コミュニティサイトのデータを使って表のデータを入れ替えてみるとこんな感じです。
enter image description here
現在表示しているアナリティクスビューの名前が表示され、表のデータが変更されました。
ほぼワンタッチで変更できるので、データポータルに慣れていなくても簡単に使えます。

データ管理を使う際の注意点

簡単に使えて有用なデータ管理ですが、いくつか問題点もあるため記載しておきます。

1つ目に、アナリティクスデータだけしか対応していないことです。
もし、Search ConsoleやAdwordsなどの他のデータソースを切り替えたいと思っている場合、現段階ではデータ管理の機能を使用することはできません。

2つ目に、アナリティクスビューの閲覧権限を持っていなければいけないことです。
データポータルのレポートにデータソースとして使われている場合はそのまま見ることができますが、データ管理として変更する場合には閲覧者自身が該当のアナリティクスビューの閲覧権限を持っている必要があります。

1つのレポート内で複数のデータ管理をする方法

上記では、データ管理によってレポート内の全データを総入れ替えする方法についてご紹介しました。
実際のレポート内で使うには場面が限られますが、1つのレポート内で異なるデータ管理を2つまで切り替える方法を見つけたのでご紹介いたします。

先ほど作ったレポートを利用して説明します。
まず、表とデータ管理をそれぞれコピーします。(わかりやすいように並べました。)
enter image description here
レポート上にある表やグラフなどすべての要素には、レベルというものが存在します。
データ管理で変更しているデータは同じレベルのものを変更しているため、レベルを変更することで異なるデータ管理の効果を受けることができます。

デフォルトでは、「ページレベル」に設定されているので、左側の表とデータ管理を「レポートレベル」に変えてみましょう。
表にカーソルを合わせて右クリックすると図のように表示されるので、「レポートレベルに変更」をクリックすると変更できます。
enter image description here
ちなみに、もう一度同じことをすると「ページレベルに変更」と文言が変わって、「ページレベル」に変更できます。
左側の表と「ビューを選択」をページレベルに変更した後、閲覧画面に戻ります。
左側の「ビューを選択」のみを変更してみます。すると、左側の表だけが変更されました。
enter image description here
右側についてもアナリティクスビューを変更することで、右側の表だけが変更されます。
このように、レベルを変更することでデータ管理を複数設置することも可能です。

まとめ:データ管理はどんなときにおすすめか

データ管理は閲覧者権限でもアナリティクスデータのビューを変更することができる機能でした。
アナリティクスビューごとにデータポータルレポートを作成するとなると作成も管理も面倒ですが、ひとつのレポート上で切り替える分にはワンタッチなのでお手軽です。
今回はチーム内での共有に視点を置いて説明しましたが、その他にも例えば次のようなことに使えるかなと思います。

  1. テンプレートとなるデータポータルレポートをコンサルに作成してもらい、他のアナリティクスビューでも使いまわす
  2. 報告や会議にデータポータルレポートを使う場合、質問に答える際に他のビューで見た場合の結果をすぐに表示できる

これまでの流れからすると、Googleアナリティクスのマイレポートにあるソリューションギャラリーのように、いろんな人がデータポータルレポートのテンプレートを作成して公開するようになるのかもしれないな、と思います。
今後のアップデートに期待ですね!

【Rails】wheneverで出力されるコマンドで環境変数を使用する場合【whenever】

0

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

wheneverで環境変数を使いたくなった時に方法を模索していたのでメモ。

環境変数を使用したい場合、通常は下記のように記述するかと思います。
※例:バッチを動かした後にあるディレクトリをrsyncで同期をとる
schedule.rb:

every 1.day, at: '0:00 am' do
  command("cd :path && :environment_variable=:environment bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/ ")
end

この記述だとcronに出力は下記になります。
出力結果:

0 0 * * * bash -l -c 'cd /home/user_name/app && RAILS_ENV=production bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/'

これで問題ないのでは?と思いますがコマンドが「”」で囲まれているため環境変数が展開されません。
環境変数を展開するにはコマンド「””」で囲む必要があります。

コマンドを「””」で囲むためにwheneverにjob_templateの設定が必要になります。job_templateではコマンドの形を設定できます。

set :job_template, "bash -l -c \":job\""

上記を設定すればコマンドの出力が「””」で囲まれます。
schedule.rb:

set :job_template, "bash -l -c \":job\""

every 1.day, at: '0:00 am' do
  command("cd :path && :environment_variable=:environment bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/ ")
end

出力結果:

0 0 * * * bash -l -c "cd /home/user_name/app && RAILS_ENV=production bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/"

これで環境変数が展開され想定通りのコマンドになるかと思います。

BTCでマーチンゲール!

0

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

最近は仮想通貨が相場的にも世間的にもたいへん盛り上がってまして、きたる8/1のイベントに向けて世間はざわざわしております。
ぼくも昔は相場を張ってた時期がありまして、その時のなんやかんやで今回はギャンブル必勝法と名高いマーチンゲールがBTCで検証してみたいと思います。
マーチンゲールの説明についてはベッティングシステムとかマーチンゲールでググっていただくとして、今回はマーチンゲールの幾つかのバリエーションを検証していきます。
ちなみに、今回コードは掲載しないです。

検証するマーチンゲールのバリエーション

  • ノーマルマーチン
  • グランマーチン
  • ダランベール
  • バーレー

共通のルール

資産 1000000
取引対象: BTC/JPY
検証期間: 2014-09-17 検証終了日: 2016-08-01
スプレッド及び手数料などの取引コストは0と考える
レバレッジはかけない

戦略

買いポジションを取る。
前日比がプラスなら勝ち
前日比イコールなら引き分け
前日比マイナスなら負けとする
共通して、引き分けの場合は賭け枚数を現在のまま引き継ぐ(増額なし)
賭け金が資産を上回る場合も賭け枚数を現在のまま引き継ぐ(増額なし)

とまあこんな感じで、基本は買いのナンピンマーチン戦略となってます。
レバレッジをどうするかは結構迷って、ハイレバを可にすると破産が見られる楽しい検証になるんですが、不健全なのと証拠金関係が面倒なのでなしにしました。

ノーマルマーチン

ルールは至って簡単で、負けたら(BTC/JPY)が下げたら倍プッシュするだけ。

資産: 1427096.0 利益: 427096.0 利益率: 29.9276292555

グランマーチン

マーチンが負けた場合n * 2のベットなのに対し、負けた場合にn * 2 + 1をベットする。

資産: 1680161.0 利益: 680161.0 利益率: 40.4818942947

リスク取った分だけリターンが上がりました。

ダランベール

ノーマルマーチンが負けた時に倍プッシュするのに大して、1単位だけ増やし、勝った場合に1だけ減らす。1単位のときに勝った場合は、引き続き1単位。

資産: 1413083.0 利益: 413083.0 利益率: 29.2327485364

リスクを取らない分リターンも下がりました。

バーレー

ノーマルマーチンの逆。
勝ったら倍プッシュを繰り返します。
ノーマルマーチンの鏡対象の結果になるんですが、今回はすぐにかつかつまでベット額が増えていったので結果はノーマルマーチンとやや異なります。

資産: 764141.0 利益: -235859.0 利益率: -30.8659004032

考察とか

簡単に検証できるのはこんなところです。
調べればもっと色々出てくるんですが、実装するのが面倒なので簡単な4つで検証してみました。
バーレー以外はだいたい利益出てるんですが、まあ当然なんですよね。
だって上がってる銘柄買ってりゃ賭け方がどうであれ基本儲かりますから。
ちなみにこの期間、上昇率は終値ベースで30.28%となってるので、ただ買って持ってる以上に儲かるのってグランマーチンだけなんですよね。
今回の検証は結構雑な感じで、最大DDとか資産曲線とかシャープレシオみたいなアレコレを一切考慮に入れてません。
個人的にはベッティングシステム単体でどうにかするのはイケてないと思ってるんですが、もっと色々やるといい感じの手法になるかもしれませんね。
最後にお決まりのアレを。

免責事項

当ブログの内容に関し、いかなる保証をするものではありません。 万一、内容についての誤りおよび内容に基づいて被った損害についても一切責任を負いかねます。

DB水平分散を使用した状態でマイグレーションファイルを纏めた過程。

0

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

drecom/activerecord-turntableを使用した状態でマイグレーションファイルを纏めた過程。

 こんにちは。甘いものを食べたくて食べたくて、けれど竹下通りというシャレオツな場所は怖くて避けていて、震えているHelloWorld??です。

問題

 drecom/activerecord-turntable…DB水平分散を使用した状態では、既存の方法でマイグレーションを纏める事が出来なかった。けれど、色々な理由で纏めたかった。

過程1. gemを入れてみる

 まず、マイグレーションを纏めると言ったらこれだよね、という事でsquasherを入れてみました。
 そうしたら、お決まりのmysql2関連のエラーが出てしまって(対象となったRailsアプリではmysqlを使っています)。

Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)

 この問題は、大抵の場合mysql2のバージョンに問題があるみたいですが(勿論mysql2は入れてます)、新しく入れたgemの為に現状のgemのバージョンを変えるとかは極力したくないですし。
 という事で却下しました。

 次に、他にマイグレーションファイルを纏めるgemは無いかと調べてみると、自分が調べた限りではありませんでした。以下のようなものは見つかりましたが、マイグレーションを纏めるというものではないですし、マイグレーションが使えなくなるのも困りますし……。

  1. Ridgepole 既存のマイグレーションを使用せずにDBを管理するgem。
  2. Convergence http://labs.timedia.co.jp/2014/10/railsdb.html Ridgepoleを参考にして一から作り上げた、Ridgepoleの改良版。

過程2. 詰まったから聞いてみた

 そんな感じで、これ無理じゃないかなーと思いながら先輩に聞いてみたら、マイグレーション実行時に吐き出されるstructure.sql使えない? と言われて、これはもしかしたら、と光明が見えてきました。
 ただ、問題が新しく出てきて。
 題名の通り、このアプリでは、activerecord-turntableを使用しています。即ち、クラスタとかを指定して、DB水平分散をしてユーザーデータやらそれに紐づくデータやらを管理している訳です。
 要するに、SQLを直接実行するにせよ、複数のDBを指定してSQLを実行しなければいけない。
 これは、activerecord-turntableを調べなきゃいかんな……。という訳で、頑張りました。1~2時間位。
 以下が、DB水平分散をしてマイグレーションをかけている実際のコードです。
/lib/activerecord-turntable-feature-rails4_1/lib/active_record/turntable/migration.rb

  def migrate_with_turntable(direction)
    config = ActiveRecord::Base.configurations
    @@current_shard = nil
    shards = (self.class.target_shards||=[]).flatten.uniq.compact
    if self.class.target_shards.blank?
      return migrate_without_turntable(direction)
    end
    shards_conf = shards.map do |shard|
      config[Rails.env||"development"]["shards"][shard]
    end
    seqs = config[Rails.env||"development"]["seq"]
    shards_conf += seqs.values
    shards_conf << config[Rails.env||"development"]
    shards_conf.each_with_index do |conf, idx|
      @@current_shard = (shards[idx] || seqs.keys[idx - shards.size] || "master")
      ActiveRecord::Base.establish_connection(conf)
      if !ActiveRecord::Base.connection.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name())
        ActiveRecord::Base.connection.initialize_schema_migrations_table
      end
      migrate_without_turntable(direction)
    end
  end

 このメソッドについて簡単に言えば、水平分散するように指定されているマイグレーションに対して、その水平分散するDBそれぞれにマイグレーションを掛ける処理をしています。
 そして、水平分散をするDBを指定するコードが、

ActiveRecord::Base.establish_connection(conf)

 confの中身は、以下のようなdatabase.ymlに書かれている設定ファイルを拾ってきているハッシュです(ローカル環境なら大体こんな感じかな)。

{adapter:    "mysql2",
 encoding:   "utf8",
 reconnect:  false,
 pool:       5,
 username:   "root",
 password:   "I_WANT_TO_EAT_SWEETS!!",
 host:       "127.0.0.1",
 port:       3306,
 database:   ""}

 ここまで分かれば、後は色々頑張っていくだけです。

実装過程

  1. SQLファイル作成

まず、纏めたい部分までのマイグレーションを1から実行します。ここでは2017年1月1日までのマイグレーション、バージョンは20170101000000としておきましょうか。

bundle exec rake db:migrate:reset version=20170101000000

 そうすると、それまでのSQLの実行結果がdbディレクトリ以下に吐き出されます。
 activerecord-turntableを使用していたならば、turntable.ymlで設定した分だけ複数吐き出されるはずですので、水平分散DBで種別に一つずつrenameして取っておきましょう。全部は必要ありません。例としては、
structure_AAA_seq.sql これと
structure_AAA1.sql これと
structure_AAA2.sql
structure_BBB_seq.sql これと
structure_BBB1.sql これと
structure_BBB2.sql
structure.yml    これを
以下にrename。
old_structure_AAA_seq.sql
old_structure_AAA.sql
old_structure_BBB_seq.sql
old_structure_BBB.sql
old_structure.sql
といった感じです。

 そして、ここからこのSQLファイルに対してひと手間必要になってきます。
 これをこのままSQL文として実行しても、SQLは動きません。また、消しておかなければいけないSQL文も存在します。

 まず、正規表現を使って、取っておいた全てのファイルからrubyのコメントアウト文を削除します。これがあるとSQLが走りません。
 Visual Studio Codeなら、簡単に行けます。
1. 正規表現を使ったファイル内検索で引っ掛ける。
 以下で行ける(macだとバックスラッシュはキーボードの設定弄らないと出てこないので要注意)。

/*.*\*/;

2.”全ての出現箇所を変更”で削除。
後、お好みでSQLのコメント文も削除しましょう。VisualStudioCodeの正規表現は以下で。

--.*

 それから、全てのSQLを登録する、structure.sqlからのみ、SQLを削除する手間が必要になります。
 それは、schema_migrations関連に対してです。このSQLを実行するマイグレーションを後々作成するのですが、schema_migrations関連のSQLを残したままだと、このマイグレーションの実行履歴が、schema_migrationsに入らず、マイグレーション実行してないよ、と怒られてしまいます。
 まあ、他の水平分散するDBにもschema_migrationsのテーブルが入るのですが、rails側で参照しているのは、このstructure.sqlで作成されるところのDBだけなのでここだけ削除しておけば大丈夫でしょう。
 それともう一つ、最後の方に羅列されている、INSERT INTO schema_migrations (version) VALUES (……)も削除します。古いバージョンのマイグレーション情報はもう、必要ありません。

2.マイグレーションファイル削除、作成。
 まず、もう要らないマイグレーションファイルを一気に削除します。今回は20170101000000以前のマイグレーションファイルです。
 そして、次にマイグレーションファイルを直接作成します。
 20170101000000_init_database.rbと言った感じに、年月をその時に指定して作成します。
 最後にその中で、detabase.ymlの内容からでもハッシュを作成し、DBを作成し、sqlを直接実行するcreateメソッドを作成してから、もう一仕事面倒な事を片付けてから、完了となります。
 ローカル環境に限るなら、自分は以下になりました。

class InitDatabase < ActiveRecord::Migration
  def change
    environment = {}
    databases = {AAA: [], AAA_seq: [], BBB: [], BBB_seq: [], :master => []}
    if Rails.env.development?
#取り敢えずdatabase.ymlからじゃなくて手打ちで。
      environment = {adapter:   "mysql2",
                     encoding:  "utf8",
                     reconnect: false,
                     pool:      5,
                     username:  "root",
                     password:  "I_WANT_TO_EAT_SWEETS!",
                     host:      "127.0.0.1",
                     port:      3306,
                     database:  ""}
#データベース名をそれぞれ入れていく。こっちも取り敢えず手打ちで。
      databases[:AAA] = ["AAA1_development",
                          "AAA2_development"]
      databases[:AAA_seq] = ["AAA_development_seq"]
      databases[:BBB] = ["BBB1_development",
                          "BBB2_development"]
      databases[:BBB_seq] = ["BBB_development_seq"]
      databases[:master] = ["development"]
    elsif Rails.env.test?
...
    elsif Rails.env.XXX?
...
    end
#ファイルを読みだしてから、SQL単位で分割する。SQLファイルの保存場所は任意で。この場合はdbディレクトリ以下。
    databases[:AAA].each do |database|
      file = File.read(Rails.root.to_s + "/db/old_structure_AAA.sql")
      sqls = file2sqls(file)
      environment[:database] = database
      shard_sql_execute(environment, sqls)
    end
    databases[:AAA_seq].each do |database|
      file = File.read(Rails.root.to_s + "/db/old_structure_AAA.sql")
      sqls = file2sqls(file)
      environment[:database] = database
      shard_sql_execute(environment, sqls)
      ActiveRecord::Base.connection("INSERT INTO *_id_seq(id) values(0);")
      ActiveRecord::Base.connection("INSERT INTO *_id_seq(id) values(0);")
      ...
      ...
      ActiveRecord::Base.connection("INSERT INTO *_id_seq(id) values(0);")
    end
    databases[:BBB].each do |database|
      ...
    end
    databases[:BBB_seq].each do |database|
      ...
    end
    databases[:master].each do |database|
      ...
    end
  end
end

#ファイルをSQL単位で分割するメソッド。コメントアウト文などを消しても、ファイルをそのままActiveRecord::Base.connection.executeに代入したら動かなかった。原因はまだ不明。
def file2sqls(file)
  sqls = file.split(";")
  sqls.delete_if{|sql| sql.blank?}
  sqls.each do |sql|
    sql.gsub!(/\n/,"")
    sql << ";"
  end
  sqls
end
#接続を設定してSQL実行する。
def shard_sql_execute(env, sqls)
  ActiveRecord::Base.establish_connection(env)
  sqls.each do |sql|
    ActiveRecord::Base.connection.execute(sql)
#sqlの中に"create table *_id_seq"の文字列が入っていたら...の時に初期値入れる事をやる?
  end   
end

 面倒な事、というのは上のコードでの、

ActiveRecord::Base.connection("INSERT INTO *_id_seq(id) values(0)")

に関してです。
 activerecord_turntableに依るDB水平分散によるID管理はまた別のseqDBなるものによって管理されています。普通にマイグレーションを実行すれば、そのseqDBのAAAやらBBB、それらに紐付いているデータのIDを管理する*_id_seqテーブルに初期値である0のレコードが入るのですが、こうしてSQL直接実行だとレコードが入りません。なので、手動で入れてあげる必要があります。……元々のマイグレーションファイルの中で”create_sequence_for”で紐付けているデータ分だけ。

 多いと、何かしら簡略化のコードが必要でしょう。
 しかし、それを頑張れば、完了です。
 これで後はまたマイグレーションを問題なく実行出来たら、アプリを動かして、中身などを確認してみましょう。
 それから、多過ぎるマイグレーションを纏める、という意味でこれを自分は行ったのですが、思わぬ良い副作用がありました。
 マイグレーションをして吐き出されるstructure*.sqlには、最終的に実行されるSQLが入っています。即ち、過去のマイグレーションでadd_columnやらrename_columnやら、そんなテーブルに対する変更処理などが全くありません。
 なので、纏めたこの特殊なマイグレーションは、纏めていない大量のマイグレーションファイルをそのまま実行するよりとても速くなります。

まとめ

 acitiverecord-turntableを使用した状態でマイグレーションを纏めたい、でもsquasher使えないときには、
1. 纏めたいところまでマイグレーション実行。
2. 吐き出されたSQLファイルをrenameして保存、コメント文などを削除、schema_migrations関連のSQL文も削除。
3.纏めたいところまでのマイグレーションファイル削除。新たにその地点でマイグレーションを作成し、直接環境指定してからSQLを実行、seqDBにレコードを挿入するコードを書く。
 で、出来る。
(これって邪道……?)

追記: executeとかでSQLを直接投げたものはログファイルに入らない模様。

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をどう活用していくのか?といった記事も書きたいと思います。続くかも?

最近人気な記事