ホーム ブログ ページ 30

【Unity】メニュー項目を増やして君だけの最強のUnityを作ろう!

0

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

MenuItem属性を使ってUnityのメニューをカスタマイズします。

はじめに

4月に入社し、配属先のプロジェクトのエンジニア業務を引き継いで早くも半年。
今までUnityで当たり前のように使っていた機能が、実は先輩方が作った機能だと知り驚きました。
Unityを使い始めたのも3月ぐらいなので、メニューに存在する項目は最初からあるものだと勘違いしていたのです。(無知)
…というより業務に関係する機能が多かったので、家でUnityを触っていても無いことに気付かなかったと言うのが正解です。

ということなので、今回はUnityのメニューに項目を追加して、便利なスクリプトをポチっと実行出来るようにしちゃおうという話です。

メニュー項目を追加する方法

さて、メニュー項目、つまりMenuItemの追加方法ですが、もちろんスクリプトで行います。
静的関数の定義時に[MenuItem]属性を付けることで、その関数がMenuItem(つまりメニュー項目)として登録されます。

[MenuItem("CustomMenu/MenuTest")]
static void MenuTest(){
    // なんかする
    Debug.Log("なんかした!");
}

こんな感じですね。
この場合、メニューの大項目に「CustomMenu」が追加され、その下に「MenuTest」という項目が追加されます。
クリックすると、MenuTest関数に記述した処理を実行できます。

enter image description here

[MenuItem("Window/MyWindow")] のように、既に存在する大項目の下に新たな項目を追加することも可能です。

ちょっと応用編

チェックマークをつける

Menu.SetChecked関数にメニュー項目のパスとtrue/falseを渡すことで、チェックマークが付けられます。
デバッグする際に切り替えたいゲーム全体に関わるフラグなどをここで変更できると楽ですね。
現在の状態を取得するのはMenu.GetChecked関数で行います。

[MenuItem("CustomMenu/Check")]
static void Check(){ 
    var path = "CustomMenu/Check";
    var checkFlag = Menu.GetChecked(path);   
    // 何らかのtrue/falseを切り替えたりする
    Menu.SetChecked(path, !checkFlag);
    Debug.Log("何らか is " + (!checkFlag).ToString() + "!");
}

ショートカットキーを設定する

追加した項目に対してショートカットキーを設定します。
MenuItemの引数に設定してるパスの最後に、「半角スペース」「修飾子キー」「文字」を入れることで設定できます。
以下の例では、#がShift、%がcommand(WindowsではCtrl)を表すので、
Shift + cmd + D で任意のスクリプトが実行可能になっています。

[MenuItem("CustomMenu/ShortCutTest #%d")]
static void ShortCutTest(){
    // なんかする
    Debug.Log("ShortCut!");
}
enter image description here

コンテキストメニューに追加する

右クリックや歯車マークのクリックなどで表示されるコンテキストメニューに、新たな項目を追加します。
選択中のアセットやコンポーネント等を取得し、それに対して処理を行うことも可能になります。

[MenuItem("CONTEXT/Component/ContextTest")]
static void ContextTest(MenuCommand menuCommand){
    // コンポーネントに対してなんかする
    Debug.Log(menuCommand.context);  
}

コンテキストメニューに項目を追加するには、MenuItem属性の引数であるパスの一番最初に CONTEXT/ を入れます。
上の例では、ComponentのコンテキストメニューにContextTestという項目を追加し、
MenuCommand型の引数を設定することで、その引数を使って取得したコンポーネントの情報を表示しています。
もちろん引数を取らなくてもメニュー項目を追加できます。
また、コンテキストメニューに対しても先ほどの方法と同じやり方でショートカットキーの設定が出来ますが、コンテキストメニューを開いている状態でないと有効になりません。

enter image description here

実際の使用例

私の所属しているプロジェクトでは、このMenuItem属性を使って、日々の作業を楽にしてくれるようなスクリプトをすぐに実行出来るようにしてあります。

AssetBundleのビルド
AssetBundleNameの設定
Unityエディタ上でゲーム実行時、AssetBundleのロードを行うかどうかのフラグ
選択したアセットを使っているプレハブやシーンを、GUIDをキーにして検索
JSONファイルからプレハブを作成

などなど、主にアセット管理の面で役に立つものが多いですね。先人に感謝。

さいごに

メニュー項目やコンテキストメニューの項目をカスタマイズすることで、自分のプロジェクトに適したUnityが構築できますね。

メニュー項目を増やして君だけの最強のUnityを作ろう!(タイトル回収)

BoxのAPIを使って見よう。(その5)~【実践編】Box-管理者-グループ管理-EXCELで管理-便利ツール

0

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

0.グループ情報のコントールには

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

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

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

1.その前に。

作成したVBAを動作させるとき「開発」画面を表示してイミディエイトに、リクエスト情報やレスポンス情報を表示させるのが面倒ですよね。
そのため、今回はひと手間として、テキストファイルでトレースログを取得してみます。

参考にさせて頂いたサイトは、こちらです。

エクスプローラーで表示した様子です。EXCELと同じ場所に出力します。
エクスプローラーで表示したとき

以下の要件を追加

・ファイルが無ければ、自動生成
 ⇒ 消してから確認しいって事ありますね?
・ファイルがロックされている場合は、エラーにしない。
 ⇒ エディタによっては開いた時にロックされてしまう場合があるので、その対策

ログ出力(プログラムサンプル)

Sub WLog(message As String)

    On Error GoTo ErrorHandler

    Dim LogPath As String
    LogPath = ThisWorkbook.Path & "\box_sample.log"

    Dim objFso As Object
    Set objFso = CreateObject("Scripting.FileSystemObject")

    If Dir(LogPath) = "" Then
        objFso.CreateTextFile (LogPath)
    End If

    With objFso.OpenTextFile(LogPath, ForAppending)

        .WriteLine Now & vbTab & message
        .Close

    End With

    Set objFso = Nothing

ErrorHandler:
End Sub

BOXのレスポンスJSONをログに出力するときの、ひと手間

いままでの記事でも紹介にさせて頂いて居る VBA-JSONを使用してログを整形して出力してみます。

Private Sub ResponseJSONLog(ByVal resJson As Variant)
    TraceLog.WLog "response JSON" + vbNewLine + JsonConverter.ConvertToJson(resJson, Whitespace:=4)
End Sub

上記の様な関数を用意しておいて、ログに出力してみます。
以下はメモ帳で表示して見たときです。

トレースログでJSONを整形して表示

2. 【本題】BOXでグループを操作

今回は以下のようなインターフェース画面を作成し簡単に管理できるような仕組みを構築してみます。

・グループ情報を取得して一覧表示
・新規にグループを追加
・既存グループに対して変更・削除

■初期画面
初期画面

■グループ一覧を取得してみよう。
グループ一覧を取得する場合

■グループ一覧を取得し実際に変更を加えてみよう。
各グループの追加・更新・削除を実施する場合

今回使用するBOX APIは

・Create Group
・Update Group
・Delete Group
・Get Enterprise Groups

Create Group

グループを新規に登録するAPI。※グループを管理する権限が必要です。

■接続方法(基本)

curl https://api.box.com/2.0/groups \
-H "Authorization: Bearer ACCESS_TOKEN" \
-d '{"name": "section-mmaster", "description": "section 2 group", "member_viewability_level": "admins_only"}' \
-X POST

■パラメタ内容

create params

■レスポンス

グループ情報が復帰します。

※fields に、必要なパラメタを指定しないと含まれません。
※同じグループ名が既に存在すると、、HTTP status codes が 409 conflict となります。

Update Group

グループを更新するAPI。※グループを管理する権限が必要です。

■接続方法(基本)

curl https://api.box.com/2.0/groups/GROUP_ID \
-H "Authorization: Bearer ACCESS_TOKEN" \
-d '{"name": "section-master"}' \
-X PUT

■パラメタ内容

update params

■レスポンス

グループ情報が復帰します。

※fields に、必要なパラメタを指定しないと含まれません。
※同じグループ名が既に存在すると、、HTTP status codes が 409 conflict となります。

Delete Group

グループを削除するAPI。※グループを管理する権限が必要です。

■接続方法(基本)

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

■パラメタ内容

delete params

■レスポンス
正常にDELETEされた場合には、HTTP status codes が 204 no_content となります。

Get Enterprise Groups

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

前回の記事 を参考にしてください。

3.サンプル

サンプルを作ってみましたので、試したい方はご自由にどうぞ。
サンプルEXCELをダウンロード
※VBAのコードは、現時点では非公開です。
※操作可能なグループ数は25に制限されています。

サンプルデータのダウンロード画面

4.まとめ

次回は
グループにユーザとフォルダを追加・更新・削除する機能を作ってみたいと思います。

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

代理店販売してますよ。

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

フリー素材を知っておこう

0

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

 ゲームを作るにはたくさんの材料が必要である。「こんなゲームを作りたい!」という気持ちや構想はもちろん大事だが、それを形作るための音楽や画像がなければ実現できない。

フリー素材を探す

 「音楽 フリー素材」のような感じで検索すればすぐに見つかるので素材を探すこと自体は非常に簡単。敵グラフィックだろうが、攻撃アニメーションだろうが使い切れないぐらいには見つかる。そして利用規約を守れば誰でも自分のゲームに組み込める。そう、誰でも。

誰でも使えることに気をつける

 誰でも使えるということは、すなわち他人のゲームと同じ素材を使う可能性が高いことを意味している。もし有名なゲームが既に使っていれば、フリー素材という事情を知らないユーザーからは最悪パクリだと思われて、叩かれるという悲劇が起こったりする。
 一方で、自分がプレイした他人のゲームに欲しい素材があったら、そのゲームのクレジットから素材を逆に辿る事も出来る。(パクったわけじゃないんだからね!)

素材の管理に気をつける

 配布サイト毎にダウンロードした素材は管理しておかないと、後で困ったことになる。例えば利用規約が変わって商用利用禁止になったとき、自分のゲームがまだ未公開で商用利用するつもりだったならそれらの素材はゲームから抜く必要のある場合がある。(サイト運営者に問い合わせるのが確実。)
 また、配布サイトが閉鎖してしまう場合に備えて利用規約はどこかに記録しておくといい。

有償素材も考える

 他人と素材が被るのを気にするなら、有償の素材を使うことも一つの手。今や数百~数千円程度でまとまった素材が買える時代なので、よほどお金に困っていなければこちらを選ぶとグッと気が楽になるし捗ったりする。

余談

 フリー素材がどんなものがあるか知っていると、「実は大ブームを起こした有名ゲームが
フリー素材を使っている」なんてことに気づくこともあったりする。グラフィックは自製で、決定音のような誰も気にしない部分はフリー素材を使うというのも基本的で有効な手段だとよく分かる。

配列同士のinclude

0

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

プログラムを書いていて少し迷ったことがあったので書いていきます。

arr_1 = [1, 2, 4, 5, 5, 8, 9]
arr_2 = [2, 5, 8]

arr_1の中のものからいくつか選んだものがarr_2に入っている」という状態で、
arr_2arr_1の中身の組み合わせで成り立っているかを調べる必要がありました。


rubyでは配列同士は「-」演算子で差分を取れるのを知っていたので

(arr_2 - arr_1).empty?

このようにチェックをしようとしたのですがこのやり方だと…

arr_1 = [1, 2, 4, 5, 5, 8, 9]
arr_2 = [2, 2, 2, 5]

arr_2 - arr_1
=> []

こんな感じに重複した値がすべて消し去られてしまいます。
自分の場合は重複したものも個別に判定する必要があったのでこれではまずいです。

どうせ便利なメソッドがあるだろうと探しましたが見当たらなかったので自分で作ることにしました。

class Array

  def include_of_array(arr)
    temp = self.dup
    arr.each do |value|
       idx = temp.index(value)
       # 見つからなければ終了
       return false if idx.blank?
       temp.delete_at(idx)
     end    
     return true
  end  

end
arr_1 = [1, 2, 4, 5, 5, 8, 9]
arr_2 = [2, 2, 2, 5]

arr_1.include_of_array(arr_2)
=> false

arr_1.include_of_array([1, 5, 5, 9])
=> true

一件落着です。

Googleデータポータルで1日あたりのトランザクション数を確認する方法

0

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

今回はGoogleデータポータルの対象期間における1日あたりの平均トランザクション数を計算する方法についてご紹介いたします。DATE_DIFF関数やTODATE関数といったヘルプページだけではわかりにくい関数の実用TIPSとしてご活用いただければ幸いです。

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

こんにちは。株式会社アピリッツでアナリストをしているssekiです。
Googleデータポータルには数多くの便利な関数があるのですが、使い方がなかなかわかりにくいのが正直なところ。
僕もヘルプページをにらみながら日々勉強しています。

今回ご紹介するのは、日付に関する関数です。実例を交えながらご紹介いたします。
例えば、こんな事例ってよくありませんか?

Aさん「このECサイトの目標は日平均○○個売上を上げることなんだけど、これってデータポータルで定点観測できないかな?」

僕「えっ、それって1日あたりのトランザクション数を計測するってことですよね。うまいこと計測日数を計算できればいけそうだけど・・・。ちょっと調べてみます。」

・・・というわけで、日数を計算する方法を探してみた僕ですが、なんとか解決できたのでご紹介いたします。

データポータルで計測日数を計算するにはDATE_DIFF関数とTODATE関数を使おう

ある程度調べていくと、Googleデータポータルにおいて日付がどのように扱われているか、次のようなことがわかりました。

  1. 日付はYYYYMMDD形式で指定する必要がある。
  2. TODATE関数を用いることで、日付データを他の形式に変換できる。
  3. DATE_DIFF関数を用いることで、2つの日付間を計算できる。

ここまでわかってくると、後はDATE_DIFF関数とTODATE関数を組み合わせれば何とかなりそうですね。
早速、それぞれの関数の使い方を調べてみることにしました。

DATE_DIFF関数の使い方

まずは、2つの日付間を計算するための関数、DATE_DIFF関数の使い方からまとめていきます。
Googleデータポータルのヘルプには、このように記載されています。

説明:XとYの日数の違いを返します(X-Y)。
構文:DATE_DIFF(X,Y)

かなりシンプルですね。しかし、ここで四苦八苦しました。
例えば、次のように仮の日付を当てはめてみてもエラーが出てしまいます。

DATE_DIFF('20171011','20171010')

また、シンプルに「日付」のディメンションを入れても、当たり前ながらダメでした。

DATE_DIFF(日付,日付)

どうすれば計算できるの???と小一時間悩み続けていたのですが・・・、

「データポータルで使える日付の形式が決まっているなら、もしかして日付の出力形式をDATE_DIFF関数が使えるようにしないといけないんじゃないか?」とやっと気づいたのでした。

つまり、TODATE関数の出番ってことですね!

TODATE関数の使い方

というわけで、日付データの形式を他の形式に換える関数、TODATE関数についてまとめていきます。
またもや、ヘルプページはシンプルにこう書いてありました。

説明:UTCの指定された形式で日時の項目を返します。
構文:TODATE(X,入力形式,出力形式)

UTCというのは、世界各地の標準時を決めるときの基準「世界標準時」のことです。
パソコンのタイムゾーン設定でよく見かけますね。

TODATE関数のXの部分は、指標やディメンションなどのデータを入れます。
そのデータの入力形式を次に指定し、変換したい形式をその次の出力形式に当てはめるようです。


ここで使える入力形式と出力形式には制限があり、次の文字列が使用できます。

【入力形式】
・「‘BASIC’」 YYYY/MM/DD-HH:MM:SS
・「‘DEFAULT_DASH’」 YYYY-MM-DD[HH:MM:SS[.uuuuuu]]
・「‘DEFAULT_SLASH’」 rmat YYYY/MM/DD [HH:MM:SS[.uuuuuu]]
・「‘DEFAULT_DECIMAL’」  YYYYMMDD [HH:MM:SS[.uuuuuu]]
・「‘RFC_1123’」 表示例:Sat, 24 May 2008 20:09:47 GMT
・「‘RFC_3339’」 表示例: 2008-05-24T20:09:47Z
・「‘SECONDS’」 エポックからの秒数
・「‘MILLIS’」 エポックからのミリ秒数
・「‘MICROS’」 エポックからのマイクロ秒数
・「‘NANOS’」 エポックからのナノ秒数
・「‘JULIAN_DATE’」 エポックからの日数
・「‘DECIMAL_DATE’」 ’DEFAULT_DECIMAL’ と同じ
文字列として有効な strptime 形式

【出力形式】
“%Y” 年
“%m” 月
“%d” 日
“%W” 週番号
“%w” 曜日
“%H” 時
“%M” 分

詳細についてはヘルプページをご参照ください。

ひとまず、この形式に合わせて日付をコントロールすればよさそうだということがわかりました。

対象期間の始点・終点間の日数を計算する方法

実際に、DATE_DIFF関数に合う形式で日付を修正してみましょう。
指標「日付」、入力形式「’DEFAULT_DASH’」、出力形式「’%Y-%m-%d’」で計算してみるとDATE_DIFFに合う形になるようです。

下のコードを計算フィールドに入力することで、対象期間の始点・終点間の日数を計算できます。

DATE_DIFF(TODATE(日付,'DEFAULT_DASH','%Y-%m-%d'),TODATE(日付,'DEFAULT_DASH','%Y-%m-%d'))

ここで、やってみて不思議だったのですが、DATE_DIFFのXとYの位置に同じTODATE構文を入れるだけで自動的に始点と終点を見分けてくれていました。

おそらく、Googleアナリティクスデータがそのような形式になっているのでしょう。

とにもかくにも、目的の第一段階であった対象期間の日数をカウントすることができました。
あとひといきです。

1日あたりのトランザクション数を計算する方法

次に、1日あたりのトランザクション数を計算してみましょう。
指標「トランザクション数」を先ほど作ったDATE_DIFF構文で割るだけです。

トランザクション数/DATE_DIFF(TODATE(日付,'DEFAULT_DASH','%Y-%m-%d'),TODATE(日付,'DEFAULT_DASH','%Y-%m-%d'))

簡単ですね。
式が複雑になってわかりづらいという方は、さきほどのDATE_DIFF構文を別の名前で保存して使ってもよさそうです。

まとめ:この機能はどんな人におすすめか

というわけで、無事に1日あたりのトランザクション数を計算することができました。

今回の日数計算の関数利用は様々な利用が考えられそうですね。
例えば、
・1日あたりのユーザー数を調べる
・リニューアル日(特定の日)から何日経っているかを調べる

など、少し上げただけでも、多くのマーケッターにとって実用的な機能な気がします。

ぜひ、記事を参考にいろいろ試してみてください!

flattenで多次元を1次元に

0

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

今回は、rubyのflattenメソッドの紹介をしていきます。

flattenメソッドとは

flattenは、配列とハッシュに使用することができます。
配列に対してflattenメソッドを使用すると、2次元配列や3次元配列などの階層の深い配列を1次元配列に再構築してくれます。

[ [1, 2], [3, 4], [5, 6] ].flatten
=> [1, 2, 3, 4, 5, 6]

[ [ [1, 2], [3, 4] ], [ [5, 6], [7, 8] ] ].flatten
=> [1, 2, 3, 4, 5, 6, 7, 8]

ハッシュに対してflattenメソッドを実行すると、ハッシュのキーと値の一次元配列が返ります。

{ "apple" => 3, "grape" => 2, "peach" => 5 }.flatten
=> ["apple", 3, "grape", 2, "peach", 5]

しかし、ハッシュの値がハッシュである場合は値のハッシュは変換されません。

{ "red" => { "apple" => 3 }, "purple" => { "grape" => 2 } }.flatten
=> ["red", {"apple"=>3}, "purple", {"grape"=>2}]

mapメソッドとの組み合わせて使用する

ここで紹介しているflattenメソッドですが、mapメソッドと組み合わせて使用することで階層の深い関連データを1次元の配列で取得することができます。
例をProject Programmer Workモデルで説明します。目的は、Projectに関係のあるProgrammerのWorkの一覧を取得することです。
enter image description here

以下のコードがProjectに関係のあるProgrammerのWork一覧を取得するコードです。

project = Project.find(1)
project.programmers.map(&:works).flatten

このコードが何をしているのか説明していきます。
まず、project.programmersでprojectに紐づくprogrammerを参照しています。

project.programmers
=> [#<Programmer id: 1, name: "taro">, #<Programmer id: 2, name: "jiro">]

次にproject.programmers.map(&:works)でprogrammerに紐づくworkを参照しています。ただし、2次元配列で返ってきます。

project.programmers.map(&:works)
=> [[#<Work id:1, status: "new">, #<Work id:2, status: "fin">], [#<Work id:3, status: "fin">, #<Work id:4, status: "fin">]]

最後にproject.programmers.map(&:works).flattenで2次元配列を1次元配列に再構築しています。

project.programmers.map(&:works).flatten
=> [#<Work id: 1, status: "new">, #<Work id: 2, status: "fin">, #<Work id: 3, status: "fin">, #<Work id: 4, status: "fin">]

まとめ

eachなどのループを使用すれば、この記事で紹介したように階層の深いデータを取得することができますが、mapとflattenを使用すれば1行で納めることができます。自分の経験上、関連データの関連データを一覧で取得する機会があまりないですが、rubocopで行数を抑えたいときに使えるかと思います。

超高速通勤に注意!?未来に行く方法

0

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

またもや通勤がサブテーマですが、今回は社会人なら常に気を配りたい”時間”にまつわるお話です。

人によって流れる時間が違う!

時刻ピッタリに電車が発車したり、5分でも遅刻は遅刻であったり、期限を守らないと大変なことになったりと、現代日本はとても時間に正確な社会ではないでしょうか。
しかし、こんなにも社会の軸とされている”時間”というものが、そもそも人によって流れる速さが違うことをご存知でしょうか?

これは、超有名な物理学者アインシュタイン博士が発表した、「相対性理論」(正確には特殊相対性理論)によって導かれる結論です。
この理論によれば、運動している速度が速ければ速いほど、その人の流れる時間が遅くなるらしいのです。
例えば、ロケットに乗って1時間ぐらい超高速の宇宙お散歩をして帰ってくると、地球では1日経過していた、みたいなタイムスリップのようなことが起こるのです。
enter image description here
一見現実味がないようなこの理論ですが、実はすでに色々なものに応用されており、その身近な代表例がGPS時計です。
GPS時計は人工衛星を使って、いつでも正確な時刻を時計に送っているのですが、人工衛星は地球の周りを時速1万キロで回り続けているため、
速度による時間の遅れが無視できなくなってしまいます。そこで、内部で相対性理論に基づいた補正を行い、正確な時刻を出しているのです。

未来に行く!?

さて、すでに例で出したように、超高速のロケットに乗って、宇宙旅行を楽しんで帰ってくることで、地球ではロケットの中以上の時間が流れているため、結果として未来に行くことが出来ます。
ここでは、実際にどれぐらいの速度で走れば実感できるほど未来に行けるのかを計算してみたいと思います。
事前の計算でかなり速度が必要なことが分かったので、いきなりぶっ飛ばします。

①秒速269813.2122km
秒速約27万キロです。1秒あれば大体地球を7周ぐらいします。
この超高速ロケットに乗っている人の1秒は、地球の人の約2.3秒に相当します!
この速度を出せれば、このロケットの中の時間は、地球時間のおよそ半分の速度で流れることになります。
つまり、このロケットの中で5年過ごすと、地球では約10年が経過します。劇的ではないですが、まあまあなタイムスリップになるのではないでしょうか。

②秒速299792.158207542km
秒速約30万キロです。1秒で大体地球を7周半します。
この超高速ロケットの中の1秒間は、地球上の人のなんと707秒に相当します!
つまり、このロケットの中の時間は地球上の700分の1の遅さになるのです。
ここで1年過ごすだけで、地球では700年もの歳月が流れ、あっという間に浦島太郎状態です。

**考察**
この速さを実現するには1年のような長い時間をかけてロケットを加速し続ける必要があります。(ちなみに1時間ほどでこの速さまで加速しようとすると、体に8500G(体重の8500倍の力)が掛かります。注意してください)
従って、
①数年単位で加速し続けられるエンジンと燃料
②数年間人間が生活し続けられる環境
③途中の惑星などの影響をよけられるようなシステム
これらが実現できれば、この未来への旅行も現実味を帯びてくるのではないかと思います。未来に行ける世界は意外と近くまで来ているかもしれませんね。

補足:上の例で出している速度は、光の速さ(秒速299792.458km)を基準に、①その90%の速さ、②その99.9999%の速さ、で計算したものになります。
光の速度に近づくにつれて急激に時間が遅くなることが分かります。
(ちなみに、現在のロケットは、秒速数十km程度であるようなので、今のロケットに乗っても実感できるほど未来に行くには、まだまだ速さが足りません。)

過去には戻れるの?

未来に行くことが出来ることは分かりました。しかし、過去に行くにはどうすればよいのでしょうか。
相対性理論において、物体の速度をどんどん上げていくと、光の速度を超えたところで時間が逆転し、過去に進むようになります。
しかし、現在の物理学では、質量をもつ物体の速度は光の速度を超えることはできないとされています。
そのため、残念ながら現状では過去への行き方は分かりません。未来に行くときには、もう戻れないことに注意してくださいね。

終わりに

いかがでしょうか。通勤速度を追い求めるあまり、未来に行ってしまって結局遅刻する、のようなことが無い安全運転の通勤をしたいですね。

Rails×chart-js-railsで統計を表示する 1.

0

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

2は多分ある。

 ナポリタンの食品サンプルがデスクに増えました。

発端

「Railsでデータベース使って色々やってるんだから、それ使って簡単なグラフとか見れたら面白そうだな…..。Railsでグラフを表示する用のgem、探してみよう」
「今回はchart-js-railsを使ってみることにしよう。有名どころでも使われているみたいだし、このgem自体はjavascriptのライブラリのchart.jsをRailsで使う為に引っ張って来てるだけのものみたいだし」

使用方法

「Gemfileに一行付け足して、bundle installして、使う為には、application.jsに

//= require Chart.min

 を書き込む、と。
 それだけで、他にコマンドとかを打つ必要は全く無し。
 さて、まずは適当に新しいページ作ってchart.jsのサンプルページとか見ながら試してみるか……。
 新しくそれ用のコントローラ作ってroute.rbにルーティング付け加えて、それからviewを作成して」

Controller
graph_viewers_controller.rb

class GraphViewersController < ApplicationController
  def sample
  end
end

View
sample.html.erb

<canvas id="myChart" width="900" height="400"></canvas>
<script>
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: [1,2,3,4,5],
        datasets: [{
            label: "サンプル",
            data: [1,2,3,4,5],
            backgroundColor: 'rgba(255, 99, 132, 1.0)',
            borderColor: 'rgba(255, 50, 132, 1.0)',
            fill: false
        }]
    },
    options: {
        title:  {
          display: true,
          text: "タイトル"
        }
    }
});
</script>

bar graph test
「お、出来た。
で、これにデータやラベルを変数として組み込むには、配列部分を弄れば良さそうだな」

Controller

def sample
  pivotes = PiVote.pluck(:name, :vote_num)
  @labels = pivotes.map(&:first)
  @datas = pivotes.map(&:second)
  #@labels = ["◯っ◯◯","π","パイナップル", "ニシンパイ", "パイルドライバー"]
  #@datas = [9999, 3141, 2, 8, 1000]
end

View
「ラベルとデータ部分をそれぞれ弄って、と」

    data: {
        //文字列の入った配列やハッシュ等はこうしないと正しく表示されない
        labels: <%= @labels.to_json.html_safe %>,
        datasets: [{
            label: "投票数",
            data: <%= @datas %>,
            backgroundColor: 'rgba(255, 99, 132, 1.0)',
            borderColor: 'rgba(255, 50, 132, 1.0)',
            fill: false
        }]
    },

enter image description here
「おお、でけたでけた。
 一つ二つでも弄れば円グラフとか散布図とかも色々作れそうだし、オプション設定も色々あるし、夢が広がるぅ」

実際の使用感覚

 まあ、そんな感じで使ってみました。実際にデータが視覚化されると、特徴とかが分かりやすくなりますし、そこからプロジェクト等に対する改善策も見やすくなってくると思います。
 このchart-js-railsは実際、chart.jsをRailsで使えるようにしただけのgemみたいなものですが、Javascriptを余り深く知らない自分にとっては、Javascriptの勉強にもなって中々面白い所もあります。
 今もそれに関して主に弄っていて、グラフの色分けや、散布図の点をクリックしたらそのデータに関する画面に遷移したりとか、実際色んな事が出来るようになってきて、実際夢が広がるぅ、感じです。
 でも、一つ、難点として挙げるのならば、データベースから取ってきた値などを、javascriptにrubyとして組み込んでいくので、コードがとても汚くなりがちです。
 散布図を色分けやらしたい、なんて考えた時は、データを与える辺りのコードが以下のようになってしまいました。

  datasets: [
    <% @labels.each_with_index do |label, i| %>
    {
      label: "<%= label.html_safe %>",
      //色の設定。数に応じて変化。
      borderColor: "<%= "##{(16 * i / @labels.length).to_s(16)}f#{(16 * (@labels.length - (i + 1)) / @labels.length).to_s(16)}fff"%>",
      backgroundColor: "<%= "##{(16 * i / @labels.length).to_s(16)}5#{(16 * (@labels.length - (i + 1)) / @labels.length).to_s(16)}5ff"%>",
      pointRadius: <%= 4 + i %>,
      pointStyle: "<%= ['circle', 'triangle', 'rect', 'star', 'cross'][i].html_safe%>",
      showLine: false,
      data: [
      //データの配列。データの一つはx,y座標を格納した配列。
        <% @datas_array[i].each do |data| %>
        {
          x: <%= data[0] %>,
          y: <%= data[1] %>
        },
        <% end %>
      ]
    },
    <% end %>
  ]

enter image description here
まあ、もっと良いやり方はあると思うので、もっと色々試してみようとは思いますが。

指を動かして脳を活性化!?手と脳の関係とは?

0

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

手や指を動かすことによって脳にどのような影響があるのかについて調べてみました。

はじめに

1か月の更新になります。今回はプログラミングに関してではなく前々からちょっと興味があった「手と脳の関係」について調べてみたのでそれを記事にしたいと思います。

1.手と脳の関係

いきなりですがこちらの画像をご覧ください。
enter image description here
photo by Mike

なかなかにグロテスクな画像ですがこれはカナダの脳神経外科医であるワイルダー・グレイヴス・ペンフィールド(1891~1976)が考案した「ホムンクルス人形」と呼ばれるものです。手や唇は大きく、逆に足や胴、腕などはとても細いのが見て取れます。とても歪な容姿をしていますがこれはヒトの大脳皮質と体の部位の感覚の関係を部位の大きさで示したものです。大脳皮質とは大脳の表面にある神経細胞の集団で、100億以上の神経細胞がいくつかの層をなして配列しています。大脳皮質には触覚や温痛覚などの感覚を脳にインプットする感覚野や運動を行い外にアウトプットする運動野などがあります。
このホムンクルス人形を立体から平面図にした写真が下になります。
enter image description here
photo by Beth Scupham
これまた少し不気味な画像ですが、感覚野(Somatosensory Strip)と運動野(Motor Strip)に分かれてそれぞれ対応した部位の大きさでどれくらいの割合を占めているかを表しています。
運動野でも感覚野でも手や口の部分が大きな割合を占めているのがわかります。
この部位の大きさが大きいほど感覚が敏感であるとされ、その部位を使うことで脳のたくさんの部分を使っていることになります。

2.脳を活性化させよう

 さて、先ほどまでの内容で手と脳が密接に関係していることを確認してきました。手をたくさん使うことで脳細胞に刺激を与え、脳の活性化へと繋がります。
 手を使うと、手を使わない時に比べて脳の血流量が10%程度上がるという研究結果があるそうです。脳の血流量が低いと神経細胞が死滅してしまい、二度と復活することはありません。神経細胞が減っていくと物忘れが激しくなったり、ボケを引き起こしたりすることがあります。認知症の予防で手を使った体操や、先ほどの画像で手の次に大きな割合を占めている口を動かすことを薦められているのはこういった所からきていると思われます。
 しかし、ただ手を使えばいいという問題ではありません。普段の日常生活で行うような「物を掴む」「箸を使う」といった行為ではあまり刺激にはなりません。「外国の人が箸を初めて使った」といった場合ならとても刺激になると思いますが、何も考えなくても行えるぐらい体に染みついた行為は脳の活性化にはあまり効果がありません。
 脳を活性化させるのに効果的なのは考えながら手を動かすことです。特に、ピアノなどの楽器演奏や、キーボードタイピングなどは手を動かしながら頭も使うことができるのでとても良いとされています。ピアノは音の強弱やリズムなどを楽譜を追いながら頭で考えて指をたくさん動かす為、脳へたくさんの刺激が伝わります。しかし、そのためにやった事のない楽器を1から始めるのはかなり大変です。それに比べてキーボードタイピングは、打ちたい内容を考えながらキーをタイプするだけなので比較的簡単に誰でも始められます。そのほかにも普段行うことを利き手と逆の手で行うだけでも脳には刺激になりますのでちょっとだけ意識して生活してみるといいかもしれません。

おわりに

 いかがだったでしょうか。自分はルービックキューブが好きでよくやっているのですが、「指を使うと頭が良くなる」と聞いたことがあり、気になっていてちょうどいい機会だと思い調べてみました。結果的には全体的に頭が良くなるというより記憶力の部分が良くなるという感じでしたが、ちゃんとした理由を知ることができました。
 ルービックキューブやタイピングをしていて「脳が刺激されてるなー」とか、「今、脳の血流量が10%上がったな…」と感じたことは1度もありませんが、将来の記憶力や健康の為に普段から意識して指を動かす事が大事だと思うので、みなさんも是非意識して指を動かして脳をたくさん刺激しましょう!

Gitで間違えてブランチをマージしてしまった時の対処法

0

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

はじめに

こんにちは、motsukaです。
今回は、Gitでマージしてはいけないブランチをマージした時の対処法を紹介したいと思います。

状況

現在開発しているreleaseブランチと新ステージ実装をしているdevelopmentブランチがある状態で、
新ステージの実装が終わったのでdevelopmentブランチをreleaseブランチにマージしてpushしました。
ですが、まだその新ステージはマージしてはいけないものでした。

では、マージコミットを取り除くにはどうしたらいいでしょうか?

解決策

Gitにはコミットを取り消す方法は幾つか有ります。
有名なのが、resetとrevertですね。
今回はrevertを使ってマージコミットをrevertしてみます。
まずgit logでマージしたコミットのcommitIDをコピーします。

次に git revert commitID と打ってみます。すると

fatal: Commit commitID is a merge but no -m option was given.

と言うエラーが出ます。

これはマージコミットには -m をつけてくださいと言うエラーです。
-m オプションは、mainlineを指定するオプションです。
マージコミットをrevertした後の状態とは、二つのブランチの状態のどちらかになりますよね?
この二つのブランチのどちらに状態を戻すかを指定しなければなりません。
-m の後ろには1か2を指定することができて、1がマージされたブランチ、2はマージしてくるブランチです。
ここでは1がreleaseブランチ、2がdevelopmentブランチですね。

では、 git revert -m 1 commitID と打ちます。

すると、revertコミットがされたことが確認できます。
これでコミットを取り除くことができました。

ですが、これだともう一度新ステージをマージしようとした時、マージができません。
すでにマージされているというエラーが出てしまいます。
その解決策として、developmentブランチにreleaseブランチをマージします。
そして先ほど取り除いたコミットをまたrevertします。
そうするとまたマージした時にエラーが出ることがなくなります。

まとめ

gitで間違えた時の対処法は各自調べておきましょう。

コミュニケーション技術

0

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

コミュニケーションは「伝わらないが大前提」 今回は少しでも伝えるためのコミュニケーション技術についてのお話です。

なぜ伝わらないのか?

「話し手が考えていること」と「聞き手が考えていること」
果たして同じでしょうか?
それぞれの生い立ち、言語、文化、常識、年齢etc
人間100人いたら100種類の人生があるはずです。
話し手と聞き手の思考がまったく同じなんてことはほぼないと言っていいでしょう。
そのため、伝えたい内容と伝わる内容は根本的に同じではなくなり伝わらないといったことが起きます。

ラポールを意識しよう

人間関係は信頼関係です。
人間関係の深さは必ずしも関わった時間に比例しないというのはなんとなく理解してもらえるかと思います。
それでは何で決まるのか?相手との信頼関係です。
そしてなんと信頼関係の構築は技術で習得できます。
具体的にはどうするのか?
「ラポールを確立させる!」ことが重要です。

ラポールってなに?

互いに信頼し合い、安心して感情の交流を行うことのできる関係が成立している、心的融和状態を指します。
「親近感」や「信頼感」といった言葉が近いと思います。

実際にどうやるの?

これには様々な方法があります。
主に「同調」「傾聴」「自己開示」といった非言語行動を使用し、
コミュニケーションをすることで生まれると云われています。
今回は「同調」について少し掘り下げます。

同調の手法

ミラーリング

主に身体の使い方を合わせる同調手法になります。
合わせるのは姿勢、座り方、手振り、態度、表情などです。
ピシッとした姿勢に対してだらっとした姿勢、
笑った顔に対して真顔などされると話しづらいですよね。
相手と合わせることで各段に話しやすくなります。
ただし、手振りなどはやりすぎると気付かれて逆に不愉快にさせてしまうこともあるので注意が必要です。

ペーシング

これは相手の話し方や状態、呼吸などのペースを合わせることです。
合わせるのは声の調子、高低、大小、リズム、スピードなどです。
さらに感情の起伏や場の空気などに注意し、合わせてあげることが出来ると
相手と一体感が生まれてきて、同時に相手は安心して話すことが出来るようになると思います。

バックトラッキング

いわゆる「オウム返し」です。
事実を反復、感情を反復、確認を入れるなどになります。
相手の話をちゃんと聞いていることを示すこと、相手に自分が発した言葉を再確認してもらうことが目的です。そのため、一語一句同じでなくてはならないというわけではありません。
相手の使った表現に適していれば相手は自分の話がよく理解され受け入れられているという感覚を持ちます。

まとめ

少しでもコミュニケーションを上手くするために、
今回は代表的な同調の手法として
・ミラーリング
・ペーシング
・バックトラッキング

以上3点をご紹介しました。
良ければぜひ試してみてください。
他にもラポールを確立させるための手法は沢山あります。
今後また機会がありましたら他の手法についてもご紹介します。

ActiveRecordとデータベースについて知っておきたいこと

0

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

Ruby on RailsのActiveRecordをぼーっと使っていると、メモリにあるデータやdbにあるデータの整合性が取れなくなってバグを生んでしまう事があるという話です。

ActiveRecordが好きなのでたびたびActiveRecordの話をしますが、今回はうっかりやってしまいがちなDB上のデータとメモリ上のデータの不整合との話です。知らないと失敗しがちなので

railsは5.1.1を使っていますが、あまりバージョンには関係なく、rails固有というわけでもなさそうな話です。

うっかりしてしまった!

プレイヤーが複数持つデッキの中から、一つだけメインデッキを選べるような実装がしたいとします。

class Player < ApplicationRecord
  has_many :decks
  has_one :selected_deck, -> { where(selected_flg: true) }, class_name: "Deck"

  def select_main_deck(deck)
    transaction do
      self.decks.each{ |deck| deck.update!(selected_flg: false) }
      deck.update!(selected_flg: true)
    end
  end
end

素直に読むと、一度すべてを非選択状態にし、選択したいデッキを選択しているようです。
色々問題はありますが、この select_main_deck が同時に使われることがないと仮定しても、
今メインデッキとして選択されているデッキをまた選択した場合、全てのデッキが非選択状態になってしまうのです。

※ ふつうeachではなくupdate_allを使うところですが、update_allにはまた別の落とし穴があり、本筋からそれるここではeachを使っています。

どうしてこうなってしまうのか

一瞬何が悪かったのかわかりにくいですが、

ひとつめ: DBで変更があったとしてもメモリ上のデータは更新されない

下の例では first_player が指すものと another_first_player が指すものはメモリ上では別の場所におかれており
ActiveRecodr::Baseは勝手に変更を取ってきてはくれません。

first_player = Player.first # #<Player id: 1, name: "あああああ">
another_first_player = Player.first
another_first_player.update!(name: "いいいいい")
p first_player 
=>  #<Player id: 1, name: "あああああ"> # DB上のデータとは違う

another_first_player からupdateされたものはanother_first_playerには反映されますが、たとえ同じデータを参照していても、オブジェクトとして別のものである first_player にはその変更は反映されません。

これは絶対知っておいたほうがいいことです。
読み込んで表示するだけならば問題ないですが、今のデータをもとに更新を行う場合は、DBからデータを読み込んでから更新するまでの間に他で変更されないよう、きちんと排他制御をしましょう(後述します)。

ふたつめ: 変更がなければUPDATEは走らない

ActiveRecord:::Base は DBからデータをひいてきてメモリ上のオブジェクトが作られたあと、updateなりsaveなりを使ったとしても、変更がなければDB上のデータを更新しようとしません

player = Player.first # #<Player id: 1, name: "あああああ">
player.update!(name: "あああああ")
# UPDATEは走らない

これで何が起こっているかはっきりしてきたかと思います。

def select_main_deck(deck)
  transaction do
    # 全てのデッキのselected_flgがfalseになる
    self.decks.each{ |deck| deck.update!(selected_flg: false) }
    # DB上ではselected_flgがfalseだが、メモリ上ではtrueのまま変わらないのでUPDATEされない
    deck.update!(selected_flg: true)
  end
end

こういったバグ、特に他人や昔の自分がかいたコードを読んだ場合かなり見つけにくいですね。

上に挙げた

  • 同じデータを違うオブジェクトから参照する
  • データの取得と更新を行う

の2つはバグの温床になりがちなので気をつけたいところです。

さて、この悲しい事態を避けるにはどうすればよかったのか考えてみましょう。

どうすればよかったのか

そもそも構造を変える

この場合なら、playersテーブルに selected_deck_id というカラムを追加して、そこで選択中のデッキを持っておいたほうが筋がいい気がします。
選択中のデッキを切り替えるときに複数のレコードを更新しなくて済み、データ不整合を起こすことがなくなります。

class Player < ApplicationRecord
  has_many :decks
  belongs_to :selected_deck, class_name: "Deck"

  def select_main_deck(deck)
    self.update!(selected_deck: deck)
  end
end

この場合に限らず、何らかの操作をしたとき、更新する部分があまり多くならないよう考えておくとバグが起こりにくいですね。

ロックをとる

どうしても上に挙げた方法が使えないときは、きちんと不整合を防ぐ仕組みが必要です。
例えばロックというDBからデータを読み込んでから更新するまでの間にデータが更新されないようにするDBの仕組みがあります。

たとえば所持金を増やしたいとき、知らないうちにDBのデータが更新されてしまうと困ったりしますよね。

class Player
  def add_money(val)
    # 今の所持金を200とすると
    added_money = self.money + 100
    # ここで、DB上でのplayerの所持金が300になる
    self.update!(money: added_money)
    # 本当は400なのに300に...
  end
end

「所持金を増やす」間に他のところでデータが書き換えられないようにしないといけません。
たとえば rails では、以下のように with_lock メソッドを使って書くと、with_lockに与えたブロックの中の処理が終わるまで別の場所でDB上のデータが更新できなくなります(こういった、一つのレコードに対しての更新を制御するものは行ロックと呼ばれています)。

class Player
  def add_money(val)
    with_lock do
      added_money = self.money + 100
      self.update!(money: added_money)
    end
  end
end

さらに気をつけたいのは、複数のレコードに対してロックを取る場合です。
一度ロックを取ってしまうと処理が終わるまでは他ではデータの更新ができないため、順番次第ではお互い更新が終わるまで待ち状態になる、いわゆ
るデッドロックという状態になってしまうことがあります。「食事する哲学者の問題」がわかりやすい例ですね。

デッドロックに陥らないためには、たとえば必ずidが大きい方からロックを取るなど、一意な順番でロックを取っていく必要があります。

class Player < ApplicationRecord
  has_many :decks
  belongs_to :selected_deck, class_name: "Deck"

  def pay_for(target_player, val)
    if self.id < target_player.id
      self.with_lock do
        target_player.with_lock do
           target_player.update!(money: target_player.money + val)
           self.update!(money: self - val)
         end
       end
     elsif self.id > target_player.id
      target_player.with_lock do
        self.with_lock do
           target_player.update!(money: target_player.money + val)
           self.update!(money: self - val)
        end
      end
    end
  end
end

まとめ

基本的にこういったデータの不整合が起きやすいのは、 同じDBのレコードを指すオブジェクトが複数できるとき です。

まずそういう状況に気づくこと、気づいたら意図しない場所での更新が起きないようにすること、そもそも広い範囲での更新が起きないよう考え直すことを意識していきたいですね。

シェルスクリプトと戦う〜その1〜

0

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

はじめに

サーバ内部でバックアップを取るなど、特定の決まった作業をコマンドで打ち続けるとだんだん面倒になることがあります。こういう時は自動で作業するよう組みたくなるものです。
また、定期的ではないものの、よくやる一連の作業をいちいち入力するのも面倒ですね。なんとかしたいものです。
そこでシェルスクリプトというものが登場します。このシェルに普段入力しているコマンドを記述し、実行すれば、記述したコマンドを順々に実行してくれます。
今回はこのシェルに関しての話で触り始めて学んだことや思ったことを紹介していきます。

※ほとんどコマンドを触ったことのない人は迂闊に触らないほうがいいと思います。また、場合によってはファイルの消失や上書き等取り返しのつかないことが発生するコマンドもあるので、なるべく実行環境とは別の、構造が似た様な環境を構築してそちらでテストを行ってから実行環境に反映させることを推奨します。(コピー、削除等)

まずは書く

実行環境:CentOS5.9

helloWorld.sh

#!/bin/bash
echo ‘Hello!’
echo ‘Shell world!’

ただechoで2行表示するだけの簡単なシェルです。bash以外にsh等もあるようですが、環境によって動作が異なる部分があるようなのと、bashで見かけるソースが多かったので、こちらで記載していきます。

結果

enter image description here
確かに表示されました。
これで普段実行されているコマンドを書いていけばいいですね!

そこまで甘くない

シェルと同じディレクトリで実行する想定で記述したと仮定します。
実行は同じディレクトリからと、別のディレクトリからの両方を行います。

passCheck.sh

#!/bin/bash
echo '=== pass check ==='
pwd
echo '=== move ==='
cd Desktop
pwd
echo '=== end ==='

結果

enter image description here
pwdで確認したパスが変化しています。「shファイルと同じディレクトリに移動して実行しないと動かない」ルールで行えば、一応問題ありません(ミスをおこしかねないのでお勧めしません)が、今回のようにDesktopフォルダに移動してから実行すると、パスが変化するため、エラーが発生してしまいます。
今回はpwdで自身の位置を確認し、cdで移動するコマンドだけなので影響はありませんが、場合によっては実行されなかったり、想定外の事態が起こったりします。

さて画像から分かるかもしれませんが、実行時にディレクトリの移動を行っても、シェルの終了時に元の位置に戻されます。

対応としては、
・少なくとも最初のcdは絶対パスで記述する
あくまで「少なくとも」です。なるべくフォルダ移動の際は絶対パスの方がいいのではと思いますし、コピーコマンド等も、こだわりがなければその方がいい気がします。

cdのパス指定ですが、シェルと同じ位置に行く場合はdirname $0を利用した方法があります。ただ、実行およびソースの書き方によっては、期待する処理と結果が異なります。(参考:dirname $0 でスクリプト置いてあるディレクトリにならない 1年以上前の記事ですが同様の動作を確認)
$0ですが、これは初期値ではシェル自身のパスが格納されています。(〜.shの形)

終わりに

今回は触り始めになるだろう部分を紹介してみました。まだ紹介していませんが、if文や変数なども使用できます。これらを利用して処理を分けたり弾いたりできますが、後に簡単なもので紹介しようと思います。


関連記事:
dirname $0 でスクリプト置いてあるディレクトリにならない
シェルスクリプトと戦う〜その2〜

キャラクターでストーリーを動かす①

0

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

ゲーム内イベントのシナリオを書いていると、登場させるキャラクターの人選によって行き詰ってしまうことがあります。 手っ取り早く起承転結に導いてくれる優等生を探しましょう。

はじめに

お話を書いているうちに、展開が詰まってどうしてもストーリーが動かなくなってしまった…という経験がある方は少なくないと思います。
こうなってしまうと、にっちもさっちもいかなくなってしまいますね。
泥沼を回避するためにも、物語を動かすキャラクターに協力してもらいましょう。

今回のお話は、私自身が現在シナリオを担当しているタイトルを例に、一からキャラクターを作るのではなく、既にゲーム内に登場しているキャラクターを数人ピックアップしてイベントシナリオを書く、という想定です。

登場人物を決める①

私が現在担当しているタイトルでは、ほぼ毎回イベントの主役となるキャラクターが事前に決まっています。そのキャラクターを軸にイベントのシナリオを考えていきます。
登場人物が多いタイトルなので、イベントごとに登場させるキャラクターを変えて、色々なキャラクターの魅力を伝えていきたい…と思ってはいるのですが、キャラクター同士にも相性というものがあります。直近のイベントに登場していない、なおかつ主役となるキャラクターと相性の良いキャラクターを選ぶことを心がけていますが、中々うまくいきません。
(そもそも第一に考えなくてはならないのは、シナリオをうまく回すことではなく、ユーザーの方々に満足していただくことなので…。)

今回の例では、季節にちなんだイベントで「十五夜」をテーマにします。
まずはキャラクターを選んでプロットを組んでみないことには始まらないので、数人ピックアップします。

登場人物を決める②

enter image description here
※画像はイメージです。

主役として登場させることが事前に決定していた①の明るい女の子を軸に、過去のイベントに登場していないキャラクターの中から4人ほど選びました。
左から、
②中二病の子
③王子様のような子
④十五夜から「兎」を連想して、過去にバニーの恰好をしたことがある子(うさぎさん)
⑤生真面目だけど少し子供っぽいところがある子、です。

実際にこのメンバーでイベントシナリオを書こうとして数日間筆が進まず悩み続けてしまったので、後日練り直すことになります。
この中には、話の起点となる誰か……つまり「起承転結」の「起」の部分になってくれるキャラクターがいなかったためです。(私の力不足でもありますが…。)

登場人物を決める③

締め切りも迫って来たので焦り、試しに登場人物の変更を試みます。
ゲーム画面の仕様上、一度に5人以上のイラストを表示してしまうと会話画面が詰まりすぎてしまいますので、一つのイベントに登場させるキャラクターは、今のところ4~5人まで、としています。(演出上、全員を一斉に表示させることが多いので。)
ですので、前項の画像③の王子様のような子、④のうさぎさんの出番は次回のイベント以降に回し、新たに下の画像③のスピリチュアルさんを投入しました。

enter image description here
※画像はイメージです。

このスピリチュアルさんが起承転結をうまくコントロールし、ストーリーはするすると動いていくことになります。

「登場人物を決める②」の時点では、自由奔放に動き回るキャラクターは多いものの、場をおさめて新たな展開につなげる役割のキャラクターがいませんでした。
スピリチュアルさんは物静かで意味深なことを話す上に、カードによる占いを得意とするキャラクターなので、「占い」を起点にし、物語を動かしていくことが出来るのです。
このように、何か特別なことを得意とするキャラクターは特に、起点にしやすいです。

ようやく登場人物が決まりました。
続きは次回です。

第4回「TGSで日本ゲーム大賞に選ばれた作品たち!」

0

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

今年の東京ゲームショー2017について、日本ゲーム大賞を受賞した作品たちをいくつか取り上げて、筆者なりに人気が出た理由を分析してみたいと思います。

みなさんお久しぶりです!Lionです。
前回の記事いかがだったでしょうか?
少しでもゼルダの伝説 時のオカリナの魅力が伝わったのならうれしいです!
さて、本日は「TGSで日本ゲーム大賞に選ばれた作品たち!」」について話させていただきます。
今年はどんな神ゲーが僕らを待っているのか(੭ु´・ω・`)੭ु⁾⁾
受賞した作品を2つほど紹介していきたいと思います。

「やっぱり今年はあのゲームが受賞!」

今年の「年間作品部門 大賞」を受賞したタイトルは「ゼルダの伝説 ブレス オブ ワイルド」でした!
ファンからは「ゼルダの伝説 時のオカリナ」を超えたといわれ、海外ユーザーのレビューでは☆10評価で☆9以下にならないという現象も起こっているくらい素晴らしいゲームです。
ちなみにNintendo Switchのソフトになりますが、なんとNintendo Switchの出荷台数よりソフトが売れている!
らしいです(笑)
また、ゼルダの伝説シリーズ初のオープンワールドを採用。フィールドを際限なく「歩いたり、走ったり、キャンプをしたり、崖や木に登ったり…etc」ほとんど我々の世界でできるようなことはゲーム内でできるようになっています。
※料理だって作れちゃう!
ちなみに選考理由ですが、

・謎解きとバトルの爽快感が最高
・冒険が驚きと発見の連続で楽しい
・やりたいことがすべてできた
・歩いているだけでも楽しい
・シリーズ最高傑作
・まさに大賞にふさわしい

と絶賛の声しかなかったらしいです。
一般投票では、性別・世代を問わず、なんと「5歳から74歳」までの圧倒的な支持を獲得したということもゲーム業界を震撼しました。
ここで、選考理由の「歩いているだけでも楽しい」について少し深堀してみましょう。

「オープンワールドだからできる新しいゼルダの伝説」

   enter image description here enter image description here         
          Copyright © 2017 CESA, All Rights Reserved. /©2017 Nintendo
              日本ゲーム大賞年間部門賞より引用
歩くだけででも楽しい!と思わせた理由を私なりに3つに分けて分析してみます。
①今までになかった活きるをテーマに制作されている
 今までのゼルダシリーズは、ラスボスを倒し、世界を救う勇者になるというのが基本ベースでした。
 今作からは、リンクも普通の人間として生きている様に見せる工夫が多々盛り込まれています。

・山や崖をスタミナが尽きるまで登ることができる
・天候で周りの景色が変化する
・周りの気温によってリンクの体調が変化する
・自身で狩猟を行い、肉や魚などを採取できる
・集めた材料で料理を作ることができる
・武器は魔物から奪い現地調達することができる

などが大まかに上げられます。
これが、歩くだけでも楽しいゲームの秘訣になります。
まず、今回のゼルダの伝説は山や崖が沢山あり、どんな急斜面でも大体は登れる仕様になっています。
そのため、色々な場所に進むことができ、プレイヤーは「あっちには何があるんだろう!」と未知の世界に興味がわくようになっています。
基本的に、どこでも行けるということを知ったプレイヤーは、そのたどり着いた場所にある村、町、景色、魔物などと出会うわけです。
このような楽しみ方をプレイヤーが独自に発見して行くのが、今までのシリーズ作品と大きく異なる変化となります。

②過去のゼルダシリーズにはない戦闘システム
今作のゼルダな伝説は、※※過去作のような初めから剣を持っている※※という概念が取り払われています。
ではどうやって戦うのか?
それは、近くの木の棒や畑を耕す鍬などを武器にしたり、魔物から奪った武器を自分の武器にしたりして戦います。
ちなみに、これらの武器には耐久値があります。
※※これも今回のゼルダの伝説において大事な要素となります。※※
各武器は耐久値が0になると壊れてしまい、壊れた武器はその場で消滅してしまいます。
そのため、複数個の武器を所持できるようなシステムになっています。
この武器が壊れる、複数個所持できるというシステムがあることで、

・新しい武器を求めて新天地に向かう
・強そうな魔物がかっこいい武器を持っていたら、何とか倒して手に入れる方法はないか考える
・気に入った武器を大量にコレクションする
・ボス戦や普通の雑魚戦ですら武器の耐久値を考慮して戦わなければならない

このように、プレイヤーは武器という一つのコンテンツだけでもいろいろな目的で遊ぶことができるのです。

③ラスボスである「ガノン」にすぐ挑むことができる
今までのゼルダシリーズは、数々の困難を乗り越えて強くなったリンクでガノンと戦い世界を救うというお決まりのストーリーが王道でしたが、
今作は「チュートリアル部分さえクリアすれば、ガノンがいるダンジョンに行くことができる」という、王道な設計を覆しました。
これにも大きな理由があります。
プレイヤーに一本道で遊ばせるのではなく、プレイヤーが与えた環境でいかに自分の遊び方を見つけるかを体現するためだったのです。
プレイヤーにも色々なタイプの方がいると思います。

・ストーリーをなぞってクリアするプレイヤー
・ストーリーより色々寄り道をして遊ぶプレイヤー
・いかに早くガノンを倒すことができるかRTAをするプレイヤー

など、プレイヤーの数だけ遊び方がるようにゲーム設計を行ったのがわかります。
その結果として、性別・世代を問わず5歳から74歳までの圧倒的な支持を獲得したのだと思われます。

ゲームデザイナーズ大賞を受賞したちょっと不思議なゲーム

            enter image description here
   Copyright © 2017 CESA, All Rights Reserved. /©2016 Playdead. All rights reserved.
             日本ゲーム大賞年間部門賞より引用
次にINSIDEという一風変わったゲームが今年のゲームデザイナーズ賞を受賞しました。
選考理由として

・操作方法は極めてオーソドックス
・印象的な描写が心に残る
・主人公を含めた、謎めいた世界の表現手法は、数多の作品と比較しても、「似ている」と言  
 える作品がほぼ無い
とのことらしいです。

私自身もこのゲームを知ったのが賞を受賞した時からでした。
そのため、詳しくは知りません。
では、どのような作品なのか?一緒に見ていきましょう。

INSIDEのプレイヤーを引き込む世界観

   enter image description here enter image description here
    Copyright © 2017 CESA, All Rights Reserved. /©2016 Playdead. All rights reserved.
             日本ゲーム大賞年間部門賞より引用
まず、どういったゲームなのか少し書いてみると、

INSIDEとは、デンマークのインディー系ゲーム開発スタジオPLAYDEADによって開発された
2.5Dパズルプラットフォーマーアドベンチャーゲーム
となります

作品内容としては、主人公の少年は何かに追われており、やがて謎の大きな闇プロジェクトに巻き込まれていくお話になります。

操作方法はいたってシンプルで、方向キーでの移動、ジャンプ、アクションだけです。
最近のゲームと比べると、すごくシンプルと思います。

しかし、先に進むためにいろいろなギミックがあり、自身のヒラメキと、これまでクリアしてきたギミックの応用を解かなければいけないと少々難易度は高めの様子です。

この作品はの一番の見どころであるデザイン部分ですが、
モノクロに近い色彩で表現された世界となります。薄暗い雰囲気にすることで、プレイヤーは、プレイするときの緊張感や謎の何かに追われている恐怖感が倍増します。
しかも、ストーリの説明、キャラクターのセリフ、各種テキストが一切なく、
全てプレイしているプレイヤーの解釈に委ねられています。
この全てプレイしているプレイヤーの解釈に委るが実はとても凄い部分かなと私は思っています。
それはゲームに答えがないということです。
これを私風に言い換えるなら終わることのない物語と表現します。
どういうことかというと、
世界を救った勇者は次の世界を救うためにまた旅だった!
というゲームの終わり方があると、プレイヤーは「その後、どうなったのだろうか?」
「次の世界はどのようなところなのだろうか?」と考察し、それぞれのプレイヤーによって想像や考え方が違うようになってきます。だからこそ、考察したプレイした者同士が話すと話が弾んで話題性が生まれます。これが、先ほど言った終わることのない物語に当てはまります。
ただ、ほとんどのゲームは、ストーリーをすべてクリアしてその後勇者は~という
流れが多いのです。

しかし、このゲームに関しては、ゲーム開始からその終ることのない物語が始まっているのです。
これは、大きな挑戦だったっと思います。ストーリーの説明も何もない世界でただ何かに追われるのを逃げていくという内容をなぜ、追われているのか?などをすべて考えさせるように設計するのは至難の業且つ下手をすればプレイヤーは少しプレイしたら飽きてやめてしまうかもしれません。

そうならないように、世界観にこだわり、まるで自分が本当に逃げていると没入感を持たせる作りだからこそ、多くのプレイヤーの支持を獲得できたのだと思います。

今年の日本ゲーム大賞についてのまとめ

今年は、過去類に見ないほどゲーム業界で革命がおこった年だったと思います。
スマホアプリが流行る昨今、コンシューマーソフトが大きく息を吹き返した感じがします。
上記2タイトル以外も受賞されている作品は多々ありますので、こちたにURLを記載しておきます。

URL:http://awards.cesa.or.jp/prize/index.html

また、来年にもモンスターハンター:ワールドという過去最大規模のモンハンのゲームも発売されます。
※今年のフューチャー賞を受賞しており、来年の年間作品部門の大賞を受賞するかもしれないくらい期待度が高い作品となっています。

来年は、私自身もTGSに参加して生で色々なゲームの作品に触れてみたいです。

さて、次の記事ですが「プランナーはコミュニケーション能力が大事!」について
色々、書いていきたいと思います。

最近、寒さが増してきてますのでどうか風邪を引かずに来月も読みにいらしてください(/・ω・)/

重みに対しての誤差関数変化率の導出(Backpropagation)

0

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

ガバガバックプロパゲーション感漂う記事です。

はじめに

皆さんお久しぶりです、武道館のアリーナA一桁列引いて最近テンション高いくろすです。
マルチプロセス&複数サーバー環境下でのRailsの各キャッシュについてとか、stackprofを使ってプロファイリングしてみたって感じのこと書こうと思ってたんですけど、あまりうまく纏まらないので適当な流し記事を書くことにしました。

みなさん、微分積分いい気分で行きましょう。

Backpropagation

Backpropagation(誤差逆伝播法)はニューラルネットワークの学習に使われるアルゴリズムです。教師信号と出力の誤差をネットワークの各重みに反映するための勾配計算に使われます。この勾配を利用した最急降下法まで含めてBackpropagationと呼ばれることもあります。
Backpropagation自体はNNの学習に必要な数値の計算に使われるだけなので、何らかの形でネットワークの出力を誤差に変換することができるならば、教師ありなし問わず使えます。

導出

l層目k番目のパーセプトロンの入出力を以下のように設定
入力 : enter image description here
出力 : enter image description here
誤差関数Eに対する重みの勾配は以下の式

enter image description here

ここで右辺はパーセプトロンの入出力の式から
enter image description here

enter image description here
なので無事以下のようにl-1層目のi番目のパーセプトロンとl層目j番目の間の重みとEの勾配が既知の値を使って表現できるわけですね。
enter image description here

でこの勾配を指標にして学習率をかけて引いてみたり、慣性項を追加してみたり、正則化項を追加してみたり色々するわけです。

まあこれ自体はちょっとハチャメチャすぎてプログラムに起こすのが大変そうなのでざっくり行列で行きましょう。
活性化関数にシグモイド、誤差関数にクロスエントロピーを使うとサクッといけます。
enter image description here
enter image description here
enter image description here
tが誤差計算に使われる教師信号から計算される出力なので
enter image description here

o-1 は前段階の出力になってます
気持ちいいですね。

終わりに

以上、エンジニアにあるまじき思考放棄の数式画像の連投でした。

誤差関数と活性化関数の微分ができれば(微分可能であれば)データに合わせた関数を適宜選択して学習ができます。
自分で書く機会なんてほとんどない気もしますが。

今回ここに書いたようなことはだいたいここの2章や3章あたりに読みやすくまとまってると思います。

CSSの優先度を変える

0

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

業務でWebページをいじったときに地味にハマったので備忘録として投稿します。

経緯

 ボタンをCSS側の設定でデザインして作るのではなく、画像ファイルを使って実装したい。
…ということであれこれ検索しながらCSSでマウスオーバー時に画像を切り替えようと思い

<body>
<style>
  .button{
    background: url(/images/sampleA.png) left top no-repeat;
  }

  .button:hover{
    background: url(/images/sampleB.png) left top no-repeat;
  }
</style>
<img class="button" alt="" onclick="func()" />
</body>

関係ない箇所は全て省略しましたが、こんな感じでコードを書いてみました。
ページに飛んで試しにマウスオーバー…無事反応して出来た。と思ったのもつかの間、一度ボタンをクリックしたらその後クリックは効くものの、マウスオーバーしても全く効かなくなってしまった。
 

原因

 特定条件下でボタンが効かないように処理を加えたりしなければならず、JavaScript側でボタン押下時の処理をしていたのでそれに加える形で

<script>
  function func(){
    //
    // ボタン押下時の処理
    //

    button.style.display="none";
  }
</script>

こんな風にJavaScriptから表示非表示を切り替える処理を加えたり、CSSの設定を変更しているのが原因だったようです。
 
CSSには優先度というものがあり、JavaScriptでCSSの設定を上書きしてしまうとJavaScript側の設定が最優先されてしまい、CSSでの再設定もJavaScriptでの設定が優先されてしまい、何も変化しなくなってしまっていたようです。
 

対処

 CSS側で下のように、末尾に「! important」と加えるだけで問題なく動作しました。

<style>
  .button:hover{
    background: url(/images/sampleB.png) left top no-repeat ! important;
  }
</style>

この「! important」はこれを優先してください!というような命令なのでJavaScriptで変更した設定も変更することが可能になるそうです。
 

最後に

そもそもクリック時の処理をJavaScript側だけで済ませてしまおうと横着せずにCSSでcheckedとか使って処理すればハマることもなかったと思います…が、一つ勉強になりました。(おそらく結構初歩的なことだと思いますが)
今回はCSS内での優先度によるものでなかったのと、知識不足な今の私にはいまいち理解しきれなかったので今回はこれで終わりますが、どうやら「! important」を使わないクールな書き方もあるそうなので、もしマスターした時にはそちらも紹介しようと思います。

線の表現で変わるイラストの印象

0

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

イラストの線画による印象の違いをそれぞれ画像を作成し比較しました。

はじめに

nocoです。

このところイラストを描く際に「線画」の工程に時間をかけるようになりました。
強弱をつけたり、普段使わないブラシで線画を引いてみたり…少しずつこだわっていく中で線画によってイラストの印象が大きく変わることに興味を持ちました。

今回、イラストの線画のみを変えた画像をいくつか用意しました。
印象の違いに注目してご覧ください。

線画による印象の比較

ベースとなる線画

enter image description here
そのままバケツで塗り分けらえるような隙間のない線画です。
強弱を意識せず、スッと単色で線を引きました。
この線画に手を加え印象の違いを比較していきます。

線画の色を馴染ませる

enter image description here

それぞれの線の近くにある色を拾って線画に薄く乗せたものです。
線画と塗りが馴染み、やわらかな印象を与えます。

これは手法として確立し「色トレス」と呼ばれているそうです。
近年のゲーム系イラストのほとんどに使われているように思います。

線に強弱をつける

enter image description here
影の落ちる部分やすぼまった部分、手前にきている部分に線を加筆しました。
線に強弱をつけるだけでキャラクターの存在感がぐっと増します。

輪郭を縁取りする

enter image description here
輪郭を縁取るだけで、一気にまとまった印象になります。
背景に埋もれづらくなるため画面をスッキリさせることができます。

SDイラストの仕上げとして使用されることも多いですね。

ブラシの種類を変える

enter image description here
左から筆、水彩、鉛筆にブラシの種類を変えそれぞれ加筆したものです。
目指したいイラストの雰囲気に合わせてブラシを選びましょう。

近年のペイントソフトは、ベクターレイヤーに線画を描くことであとからブラシの種類を変更することができとても便利です。
ベクターレイヤーとは何ぞ?または詳しく知りたいという方は下記URLをご参照ください。

●レイヤーの種類1 ラスターとベクター – CLIP STUDIO (外部リンク)
https://howto.clip-studio.com/library/page/view/clipstudiopaint_tora_001_030

おわりに

着彩がシンプルなほど線画の表情は印象的になります。
目指したい表現に合わせた線画を作成し、より魅力的なイラストを目指したいですね。

Photoshopでgif動画が作れる!

0

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

はじめに

こんにちは、なすちゃです。
今回はPhotoshopCS6を使用した内容になります。
他のバージョンとは異なる部分もあるかと思いますがご了承ください。

Photoshop

画像編集に特化した有料ソフトです。
有名なソフトなので名前だけでも聞いたことがある方も多いかと思います。
写真の加工やグラフィックデザイン・イラスト制作など様々な機能があるPhotoshopですが、
今回はタイムライン機能を自身の復習も兼ねてご紹介します。

・タイムライン機能
動画編集、アニメーション制作ができます。
ペイント・画像編集をしながら動画のフレームの編集などができ、
作成した動画を書き出し簡単にweb上にアップすることができます。

今回は、7月の投稿で作ったコンテを使用します。

Photoshopを起動し素材を用意したら、ウィンドウ>タイムラインを開きます。
enter image description here

選択を「フレームアニメーションを作成」にします。
enter image description here

各レイヤーフォルダに秒数を設定していきます。
編集の時点で描き加えることも可能です。
enter image description here

編集ができたらレンダリングします。
web用に保存を選択
enter image description here

設定画面が表示されます
enter image description here

gifを選択>保存で完了です。
enter image description here

モーションを作る前にコンテを動かし確認したりと、簡単に作ることができます。

マージリクエストのレビュー 動作確認

0

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

 最近マジリク(マージリクエスト)のレビューを依頼されることがありました。今まではレビューの依頼が一切なかったので、他人がプッシュしたマージされていないブランチをどうやって確認すれば良いか分かりませんでした。今回の記事は、マージされていないブランチの確認方法をまとめてみました。

マージされていないブランチをローカルで確認する方法

 マージされていないのでpullしてもローカルで確認することができません。そこで、以下のコマンドで確認できるようにします。
git fetch
git checkout -b 「確認したいブランチ名」

 fetchコマンドで、リモートにプッシュされたブランチの履歴をローカルにコピーします。
次にcheckoutコマンドでローカルにコピーしたブランチに切り替えます。これで、他人がプッシュしたマージされていないブランチの確認ができます。

fetchコマンド

 上記のfetchコマンドについてもう少し説明すると、fetchはリポジトリとブランチを以下のように指定することができます。指定しない場合は全てのリポジトリのブランチをローカルにコピーします。
git fetch 「リポジトリ」 「ブランチ名」

リポジトリがorigin、ブランチ名がtest_branchの場合は、以下のようになります。
git fetch origin test_branch

 fetchは、リモートから履歴を取得しているだけなのでローカルのファイルに影響がありません。ちなみにpullは、fetchした後にmergeを行う為ローカルのファイルが更新されてしまいます。

まとめ

 普段は、fetch+mergeを使用せずにpullのみ使用していたのでfetchのことを知ることができる良い機会でした。gitはまだ使いこなせていないコマンドが多いので、少しでも多く使いこなせるように頑張っていきたいです。

ランチにオススメ!アピリッツ周辺飯処3店舗

0

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

社員もよくいくランチにおすすめのアピリッツ周辺のお店についてご紹介します。

 こんにちは飯処を探すのが趣味のtokinです。
皆さん勤務中の昼食は何を食べていますか?弁当やコンビニ・・・そして外食。昼の栄養摂取は様々です。その中でも社員さんとの昼の外食は、ただしっかりとした食事が楽しめるだけでなく、業務とはまた別の交流が深められる場であると最近痛感しております。
というわけで今回は現在アピリッツが位置している明治神宮通り~表参道周辺の社員もよく行くランチにおすすめの店を3店舗ご紹介したいと思います!

穏田 一甫 (オンデン イッポ)

 表参道から一つ裏に出た通りにある居酒屋定食屋。アピリッツの社員さんもよく利用しています。階段を下りた地下にある店内はちょっとした隠れ家のような内装で、落ち着いた雰囲気の中美味しい和食が楽しめます。さらにランチでは格安の海鮮丼が15食限定で登場。他にも刺身定食や煮魚、焼き魚の定食、出汁のきいた饂飩などほっと一息つける品ぞろえ。ご飯の量も大盛りから小盛りまで選べるのでお腹の具合に合わせられるのも嬉しいところです。夜のお酒のラインナップも充実しているそうなのでランチだけでなくゆっくり呑みに行くのにもオススメのお店です。ツイッターにて毎日日替わりのランチ定食の内容もご紹介されてますのでお昼ご飯に迷った際はぜひご利用ください。
穏田 一甫(食べログ)
twitter

北陸酒場

 キュープラザ4階にある居酒屋。ランチでは野菜を中心とした日替わりのお惣菜ビュッフェが楽しめます。数種類の和え物や煮物、こだわりの豆腐やご飯がおかわり自由のこちらのビュッフェは定食に付属しており、1000円台で肉も野菜もたっぷり味わえます。ランチ定食は野菜と日本海で捕れた魚中心の健康的な和食メニュー、夜は日本酒と北陸酒場自家製の美味しい干物や素材のうまみを引き出した温かなおでんが味わえる居酒屋。野菜をたっぷり食べたい時や、酒と共に美味しい干物を心ゆくまで楽しみたい時にいかがでしょうか。
北陸酒場

MIZUcafe

 浄水器でおなじみのクリンスイがプロデュースしたカフェ。
水にこだわり飲み物から食事まで“クリンスイのいい水”をベースに作られています。
メニューはパンネクックなどのデザート系からローストビーフ丼などのお食事系のものまで様々。なかでもローストビーフ丼はローストビーフの上にたっぷりの葉菜、加えて酸味のきいたドレッシングがかかっているためさっぱりとした味。上にのった卵の黄身を崩してもこのドレッシングの酸味により最後まで重くならずさっぱりいただけます。
更にこちらのカフェでは、セルフサービスで三種類のデトックスウォーターが味わえたり、「浄水、炭酸入り浄水、アルカリ水」の三種類の水の飲み比べまでが無料で体験できるそう。まさにクリンスイプロデュースならではの水を楽しむメニューですね(こちらの無料ドリンクのみの注文はご遠慮ください)。
日常的に摂取する水を此方のお店では様々な形で味わうことができます。水にこだわりをもったメニューぜひお楽しみください。

MIZUcafe

最後に

いかがでしょうか。アピリッツ近辺には他にも美味しい食事が楽しめるお店がたくさんあります。アピリッツに入社した際、近辺に立ち寄った際はぜひ散策してみてください。

最近人気な記事