ホーム ブログ ページ 34

サーバサイド 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話 カラオケボックス殺人事件

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

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

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

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

UnityのEventSystemのクリックイベント実装方法

0

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

Unityを使っていて実装で詰まったところの備忘録としてUIが重なった時の処理を書いていきます。 主に、EventSystemについて書いていきたいと思います。 EventSystemで制御している時は、EventSystemを介して制御しましょうと言う話です

はじめに

こんにちは、初めまして。今回初めて投稿させていただきます新卒でエンジニアとして入社した者です。

今回、Inputを使ったクリックイベントを実装しました。しかしEventSystemはそのクリックイベントには干渉してこないので何かしらのオブジェクトが重なってもInputのクリックイベントが実行されてしまうと言うバグが出ました。
その時のEventSystemで制御する方法を書いていきます。

EventSystem とは

これは、UIのイベントを制御するオブジェクトで、Unity上の入力をうまく処理してオブジェクトにイベントを送信する仕組みのことです。基本的にUnityのuGUIはこれで管理されています。

なぜこのバグが起こったのか?

このバグが起こった原因は、EventSystemとInputクラスの処理が連携していないことに原因がありました。
EventSystemは上記の通り、uGUIの入力を管理するコンポーネントです。ボタンなどに対しての入力エベントを管理しています。
対してInputクラスは座標を取得してその座標内にオブジェクトがあるならば、クリックイベントを実行する実装になっていました。

これでは、どちらも独立しているので、座標でイベントを管理しているとどんなにUIが重なってもその場所がタップされると実行されてしまうという状況でした。

解決方法

解決方法として、複数方法がありました。

  • raycastでどのオブジェクトが重なっているかを判定して一番上にあるもののクリックイベントを実行する方法
  • IPoinerClickHandlerインターフェースを使い、InputをEventSystemに組み込んで実装する方法

今回は後者で実装しました。

実装方法

IPoinerClickHandlerインターフェースをクラスに実装してください。そうすることで、InputでとっているクリックイベントをEventSystemに組み込むことができます。このようにするとInputクラスでの入力とEventSystemでの入力を連携させることができました。

ソースコードは以下のようになります。

class TestInput : IPoinerClickHandler {
  public void OnPointerClick(PointerEventData eventData) {
    //ここにタップ処理を追加する
  }
}

このインターフェースは様々な種類があります。
詳細は下記URLで詳しく書いてあります。
https://docs.unity3d.com/Manual/SupportedEvents.html

まとめ

EventSystemを挟むことで簡単に制御ができるようになりました。
EventSystemで管理しているUIは、EventSystemを介して制御してあげましょう。そうしないと今回の私のようにバグを生み出してしまうのでやめましょう。

もし、興味のある人はuGUIのソースコードは、BitbacketのUnity Technologies/Unity/UIにて公開されているので読んでみてはいかがでしょうか?

Unityのインストールが上手くいかなかった時の対処法まとめ

0

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

Unityのインストールが上手くいかなかったときに参考にしたサイトや方法のまとめです

初めてUnity(ver5.6)をDLした際全く起動が出来ず四苦八苦したときの思い出を元に試した方法を幾つかまとめました。
もし似たような環境でUnityが起動しない!という方は参考になれば幸いです。

作業環境

当初の私の作業環境がこちら。
【使用PC】IntelCorei7-4790K
【OS】Windows7
【主な使用ブラウザ】Internet Explorer11(以下IE)

今回起動したかったUnityはバージョン5.6。2017年現在最新バージョンのものです。
公式サイトを開き最新バージョンをDL。しかしインストールしてもエラー画面により一向に起動しない。そんな状態でした。
というわけでインターネットに頼りつつ幾つかの方法を試してみましたので箇条書きしていきます。
参考にしたサイトもリンクさせていただいておりますので詳しくはそちらをご参考ください。

対処方法

Unityログインアカウント名を確認してみる

Unityを起動する際に最初に設定した自身のUnityIDを入力するのですが、海外製ソフトの為か、日本語が混じると動作が不安定だったり不調が起こりやすくなるそうです。ログインアカウント名は全てアルファベットで作成してください。

再起動

まずは再起動してみましょう。たまたま起動が失敗した場合もありますのでUnityやPCを再起動してみてください。

再インストール

インストール自体がそもそも上手くいかない場合があります。この場合は前のデータをアンインストールし、PCを再起動してから再びWebサイトから最新バージョンのデータをDLしてみてください。
また再インストールした際以前の設定がそのまま使用されるパターンがあります。アンインストールだけでは消えないフォルダが存在している為なので、一から設定をしなおしたい場合はそれらを削除することをお奨めします。以下のリンクを参考にしてください。
FreelyApps:Unityの再インストール

前バージョンUnityを起動してみる

Unity5.6自体の問題やPC自体が新バージョンに対応してない可能性もあります。
もしそうであれば、前のバージョンのUnityなら起動できる場合がありますのでお試しください。

使用ブラウザを変えてみる

上記の古いバージョンのUnityをIEブラウザでDLしてみたところうまくDLがいかない、ファイルが開けないということがありました。
こちらの問題は使用ブラウザを変更することで解決されます。Unityにはブラウザとの互換性の問題もあるらしく、その中でもFireFoxがブラウザの中では最も互換性が良いようです。
IEやGoogleChromeではDLが上手くいかない場合はブラウザを変えてみてください。

セキュリティソフトの設定見直し

PCのセキュリティソフトの中でUnityと相性の悪いものも存在します。セキュリティソフトによって起動できないパターンもありますので、セキュリティソフト対象からUnityを除外に設定してみましょう。
SAKスタッフブログ:Unity起動時のエラーとその対処法

DEP有効にしてUnity.exeを追加

Windowsのアップデートか何かでUnityが起動しなくなった場合、
「コントロールパネル→システム→システムの詳細設定→パフォーマンス→データ実行防止→DEP有効にしてUnity.exeを追加」
で起動できた場合もあるそうです。ただセキュリティ上の問題があるかもしれないのできちんと調べたほうがよさそうとのこと。
商人の街ブログ:Unityで遊んでみようか 第1回 Unityを起動せよ<Unity起動エラー対策(仮)>
誰かのメモ:Unity が起動しなくなった

ディスプレイアダプターのドライバーを更新

ディスプレイアダプターのドライバーのバージョンが古いと最新バージョンのUnityと
噛み合わない可能性があります。もしその場合は最新バージョンにアップデートしてみてください。私はここが問題だったようで更新したら解決しました。
Windows 7 で、ディスプレイアダプターのドライバーを更新する⽅法についてpdf
また、ディスプレイアダプターにIntel HD Graphics系を使用しており、WindowsUpdateが上手くいかない場合は以下のリンクに対処法がありましたのでご参照ください
taccumanote:Windows UpdateでIntel HD Graphics系の更新プログラムのインストールが出来ないときの対処法

最後に

今回は使いませんでしたが色々記事を検索しているとサポートセンターに連絡するとすぐ解決した、みたいな人もいらっしゃったのでどうしても分からない場合はサポートセンターにお問い合わせください。
ユニティ・テクノロジーズ・ジャパン合同会社:無料サポート
Unityはそれ一つで2Dゲームから3Dゲームまで簡単につくることができてしまうのでぜひDLしてお楽しみください!

Box Drive パブリックベータ版(Windows)を使用して見た

0

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

Box DriveはWindowsおよびmacOSで動作するデスクトップアプリケーションです。
ファイルの編集、検索、共有などをエクスプローラーや、Finder から操作することが出来ます。
イメージ的には、NAS(ネットワーク接続ハードディスク)を使用している感覚に近いと思います。

いままでのBox Sync との違いは、使用しているPCのHDDを圧迫しない。不要なファイルがPCに残らない。
※厳密にはアップロードやファイルを編集する時には一時的にはHDDを使っているようですが。

Box Drive

待ち望んでいたBox Drive(以前までは、Box for Desktopという名称の予定でした)が
パブリックベータではありますが、リリースしたので早速使ってみました。
詳しくはこちらを参照

enter image description here

使用上の注意点(Windowsの場合)

  1. Box SyncとBox Drive は同時に実行しない。Box Syncはアインインストールしましょう。
  2. Box Driveは、Windows 7 64ビットおよびWindows 10 64ビットのみをサポートします。 32ビット版とWindows 8.xはサポートされていません。 その他の注意点はこちらを参照して下さい。

こんな所が便利??

メールを送信する時、(普段の仕事で使用するときには、)基本的に共有リンクを使うのですが、
BOXにアクセス出来ない会社様の場合、メールに直接ファイルを添付して送信しています。ファイルがBOX上にのみある場合は、ダウンロードしてから、メールに添付する操作をしていましたが、直接ドラッグ&ドロップでコピーできます(貼り付けられます。)

enter image description here

その他 使用方法

共有リンク

Drive から、共有リンクを作成する方法は、
対象のファイル・フォルダで、右クリックすることで、BOX  >  Copy Link で共有リンクが取得できます。

enter image description here

検索

BOXには強力な検索機能がありますが、
それを使用するには、タスクトレイのBox Driveアイコンを選択するか
Ctrl + Shift + Alt + B で下図のような検索ウィンドウを表示して、検索を実施することが可能です。
残念ながら、エクスプローラー上から検索は出来ません。

enter image description here

個人的に残念な事。(今後に期待)

BOX の新UIからアカウント設定よりブラウザでBOXに接続した時に表示されるホームページ(初期ページ)の設定で「お気に入り」を選択出来るようになったことで、使いやすくなりましたが、Box Driveでの表示されるのは、「すべてのファイル」を選択した時と同じなので、表示が切り換えられる仕組みに期待しています。

enter image description here

まとめ

とりあえず、待ち望んでいたアプリケーションが出てきたので簡単に使用してみました。
まだファイルをロックしたり、ロック解除したりする機能も、パブリックベータ版には実装されていないようなので、今後のアップデートに期待しています。

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

enter image description here

お問い合わせは、こちら へ
BOXを使ったのアプリケーション開発も。

Rubyを書くときに気をつけたいこと

0

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

Ruby初心者の私がコードを書くときに気をつけていることをまとめてみました。

はじめに

 こんにちは。今年新卒で入社したエンジニアです。
Rubyを学習し始めてからインターンの数日を除くと1ヶ月半ほどになりますが、先日初めてコードレビューを行った際に先輩方から「Rubyらしいコードで書こう」との指摘をいただいたのを機に色々調査しながらコードの修正を行いました。基本的なことですが備忘録という意味も兼ねてまとめたいと思います。
 

目次

 1. 適切なメソッドを使う
 2. 目的と同じ実装をしてくれるライブラリを使う
 3. 読み手に分かりやすいように書く

1. 適切なメソッドを使う

 この記事のきっかけとなったコード修正で一番多かったのがこれでした。
Rubyには初めから便利なメソッドが多数用意されており、それを利用することでRubyらしくちょっとだけクールなコードを書く事ができます。
今回この記事を書くきっかけになった実装が文字列処理を含むものだったので、文字列自体の処理を簡素化して実際にコードレビュー前と後の差に似せて出してみようと思います。
stringという小文字とコンマで表された文字列をコンマで区切って全て大文字にして配列に格納するコードを例にします。

# 修正前
str = []
string.split(",").each do |s|
  str << s.upcase
end

ここで使ったeachは単に各要素を参照して処理を行うだけで戻り値に変化はありません。
このコードをmapを使って修正すると以下のようになります。

# 修正後
str = st.split(",").map {|s| s.upcase}

mapは各要素を参照して処理をしたあと、結果を新しい配列にしてくれます。
Rubyには同じような処理をするメソッドでも明確な違いを持ったメソッドが多数あります。

今回例に挙げた配列の要素の数だけ各要素を参照してブロックを実行するメソッドについて基本的なものをまとめておきます。

  • each 要素を順番に参照してブロック内の処理を行う
  • reverse 要素を逆順に参照してブロック内の処理を行う
  • map 要素を順番に参照してブロック内の処理を行い、各要素の処理された結果を新しい配列として作成
  • select 要素を順番に参照してブロック内に書かれた条件を満たすものだけ返す(ブロックが真を返す要素だけで配列を作成)
  • reject selectとは真逆で要素を順番に参照してブロック内に書かれた条件を満たさないだけ返す(ブロックが偽を返す要素だけで配列を作成)

自分が実装したい処理、目的と合うメソッドを使う事で処理をシンプルにまとめることができるので、もっと適切なメソッドがないか、使いやすいメソッドがないか考えながらコードを書くと自然とRubyらしいコードが書けるようになると思います。

2. 目的と同じ実装をしてくれるライブラリを使う

Rubyを使っているとよくgemという言葉を耳にします。
gemとはRuby用のライブラリやアプリケーションを指す言葉で、誰でも簡単に公開することができます。
それゆえ大量のgemが存在し、目的のものが見つかりやすいうえgemの中でも同じような実装をするものも多数あるので目的に合わせて好みのものを選んで使うこともできます。
よく使われるものでbundlerやrails、知名度が高いものの中でもnokogiriやkaminari、kakurenboなど親近感の湧く和名のgemもよく見かけますね。
gemはコマンド1つでインストール出来るうえ簡単に実装することも出来るので1から全てを実装せずに済みます。
実装に直接関わるものだけでなく、デバッグ時に役立つブレークポイントをつけてくれるgemや好きな時刻に変更したり、とある時刻で止めたりしてくれるgemなど多数存在します。
これらを活用すると実装のコードをシンプルにしたり時間効率を上げることももちろん可能になります。
何か新しく実装を加える時は似たような実装ないか探してみたら夢を叶えてくれるgemに出会えるかもしれません。

3. 読み手が分かりやすいように書く

 これはどの言語にも言えることですが、他の言語に比べてRubyはやる気さえあればどこまでもコンパクトに書けてしまう言語だと思っています。
ですがコンパクトに書く事だけに意識を向けてコードを書いてしまっては読み手にとっては難解なコードになりかねません。
※後述するFizzBuzzの最短コードは文字数を減らすのが目的で書かれているので説明がないとどういう処理なのか分からない人がほとんどだと思います。
私が分かりやすいコードにするために心がけていることは以下の2点です。

  • 変数やメソッド、クラスの命名
     多少長くなってもいいのでその変数が何で使われているのか、何を意味しているのかを見てわかるように命名する
  • 改行やスペースを活用する
     稀に巡り会うずらずらとスペースも改行もなしで何行にも渡るコードは、見にくくて時折書いた本人でも嫌になることもあるので、見やすいように書く

1点目はごく当たり前のことですが、私は実装を進めていると2点目を忘れがちで必死にコードをガリガリと書いてしまいます。
配列や括弧の中であれば普通に改行しても問題ないですが、改行したら文末と解釈されてしまって正常にプログラムが動作しないからどうしようもない!という場合があります。その時はバックスラッシュ(option+¥)を文末に入れることで「ここは改行されているけど文末ではない」と教えることが出来ます。
今挙げた2つのルールはプロジェクトによって明確にこうだと決まっていることが大半なので合わせて書くことも大切ですが、もし特に決まっていない場合のことも考えて自分ルールを作っておくとコードを書くときに迷わずに済むかもしれません。

最後に

 これらは基本中の基本で、この他にももっと留意すべき点や使うと便利なものはまだまだあると思いますが基本が一番大切だと思うので書かせていただきました。
私がインターン時に初めてRubyを学習した際に先輩からRubyは「クールに書く」「車輪の再開発は良くない」と言われたのを覚えています。
正直その当時はあまりピンと来ていなかったのですが、これらは今回の1、2に通ずるもので実際に書いて修正しながらコードを書いていくうちに言葉の意味が理解できてきました。
先輩方のようなシンプルでかつ読みやすい優しいコードが書けるようにこれからも学習していきたいと思います。
 

おまけ: FizzBuzz

 おまけ程度に書くつもりが結構なボリュームになってしまいましたが、私がRubyを初めて学習したときに見つけたFizzBuzz最短実装を目指す人たちのコードや記事が面白かったので紹介したいと思います。
※FizzBuzzとは1から100まで順番に数え、3の倍数の時はFizz、5の倍数の時はBuzz、15の倍数の時はFizzBuzzと言うゲームのことです。
ちなみにこのFizzBuzzをRubyで何も考えずに実装すると以下のようになります。

(1..100).each do |number|
  if number % 15 == 0
    puts "FizzBuzz"
  elsif number % 3 == 0
    puts "Fizz"
  elsif number % 5 == 0
    puts "Buzz"
  else
    puts number
  end
end

条件文をどうにかしたい。15の倍数はどうにか省略できないものかと試行錯誤して書いてみたコードが以下です。

(1..100).each do |n|
  str = "#{['Fizz'][n%3]}#{['Buzz'][n%5]}"
  str = n.to_s  if str == ""
  puts str
end

配列アドレスに剰余を入れる事によって割り切れるときつまり剰余が0のときに配列の0番目が呼び出されるので3の倍数ならFizz、5の倍数ならBuzz、15の倍数ならFizzとBuzzが両方呼び出されてもしどちらも呼び出されなかったら数値自身を入れて出力するといった実装です。無茶苦茶なコードですが私にはこれが限界でした。
ちなみにRubyを用いた最短コードが51byteで書かれたこのコードのようです。

1.upto(100){|n|puts'FizzBuzz
'[i=n**4%-15,i+13]||n}

面白かったのでこのコードを書かれた方が解説しているページのリンクを載せておきます。
perlだともっと短いコード(最短30byte)で書けたり、FizzBuzzを実装してくれるgemやRubyでもっと変わった方法で実装されている方も多数いました。興味があったら是非調べてみてください。

最近人気な記事