ホーム ブログ ページ 27

joinをベン図で表現

0

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

joinとは

 joinは、データベースの検索時に複数のテーブルをまとめて、検索を行うsql文です。joinには、内部結合と外部結合の2種類の方法が存在します。これらの説明は、次のセクションで行います。

内部結合(inner join)

 内部結合は、複数のテーブルを結合するときに指定する条件式に当てはまるデータのみ取得します。sqlは以下のように書きます。また、inner joinjoinと省略することもできます。
select * from テーブルA inner join テーブルB on 条件式
 内部結合の結果がどこを表しているのか分かりやすく説明する為に、数学の集合を図で表現するベン図を用いて説明します。先ほども説明しましたが内部結合は、テーブルAとテーブルBのデータを含んでいる(紐づいている)データを取得します。数学の集合で表現するとテーブルA ⋂ テーブルBになります。
enter image description here

外部結合(left outer join, right outer join)

 外部結合は内部結合とは違い、結合元のデータをすべて取得し、条件式に当てはまるデータに関しては、結合先のデータも取得します。ここで言う結合元,結合先をsql文で説明すると、テーブルAが結合元、テーブルBが結合先となります。また、left outer join,right outer joinは、left join,right joinに省略することができます。
select * from テーブルA left outer join テーブルB on 条件式
 left joinは、「結合元のデータを全て取得し、条件式に当てはまる結合先のデータも取得」します。
enter image description here
 right joinは、「結合先のデータを全て取得し、条件式に当てはまる結合元のデータも取得」します。
enter image description here

まとめ

  • 紐づいているデータのみ取得したい場合
    • 内部結合
  • データを全て取得し、関連データも取得したい場合
    • 外部結合

s3cmdでオブジェクトストレージのバケットにIP制限

0

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

‘aws-sdk’のようなgemを使用せずに、s3cmdコマンドを使用して s3のオブジェクトストレージバケットにIP制限を行ったのでメモ代わりに

s3cmd設定

※事前にAWSのアカウント作成してください。

$ yum -y --enablerepo epel install s3cmd
$ s3cmd —-configure
Access Key: xxxx
Secret Key: xxxx
(ほかは全てエンターのみでOK)

s3cmd lsで一覧が表示されれば設定完了。
接続できない場合はここら辺の設定を変えてください。

$ vim ~/.s3cfg
host_base = hedgehog
host_bucket = tegetege
signature_v2 = True

バケットにポリシーが設定されていないことを確認。

$ s3cmd info バケット名
   Location:  us-east-1
   Payer:     BucketOwner
   Expiration Rule: none
   policy:    none
   cors:      none
   ACL:       xxxx: FULL_CONTROL

実践

わかりやすいようにバケット名と制限IPのカラムを持つテーブルを用意。

# Table name: hoges
#  id                  :integer          not null, primary key
#  bucket_name :string           not null
#  limit_ips           :text     # json形式で保持
#  created_at          :datetime         not null
#  updated_at          :datetime         not null

class Hoge < ActiveRecord::Base
  def parse_limit_ips
    limit_ips.present? ? JSON.parse(limit_ips) : []
  end

  def set_policy_to_bucket
    create_extract_dir
    open(json_tmp_path, 'w') do |io|
      io.puts(tmp_policy_format)
    end
    # s3cmdのsetpolicyオプションを使用して、対象バケットにポリシーを設定する
    `s3cmd setpolicy #{json_tmp_path} s3://#{bucket_name}`
    delete_extract_dir
  end

  private

  # policyファイルを保持するディレクトリを作成
  def create_extract_dir
    FileUtils.mkdir_p extract_dir
  end

  # ディレクトリ名
  def extract_dir
    File.join Rails.root, :tmp.to_s, :bucket_policy.to_s
  end

 # ファイルパス
  def json_tmp_path
    File.join extract_dir, 'policy.json'
  end

 # ディレクトリごと削除
  def delete_extract_dir
    FileUtils.rm_rf extract_dir
  end

  def tmp_policy_format
    <<-"EOS"
    {
      "Id": "#{SecureRandom.hex}",  # 任意の文字列
      "Statement": [
        {
          "Sid": "#{SecureRandom.hex}", # 任意の文字列
          "Action": ["s3:GetObject"],
          "Effect": “Deny”, # 指定した内容に対しアクセスを拒否する <=> Allow
          "Resource": "arn:aws:s3:::#{bucket_name}/*”,
          "Condition": {
            “NotIpAddress": {  # 以下に含まれるIP以外
              "aws:SourceIp": #{parse_limit_ips}
            }
          },
          "Principal": {
            "AWS": ["*"]
          }
        }
      ]
    }
    EOS
  end
end

Allowだとなぜか効かない…。なのでDenyとNotIpAddressの組み合わせにしました。
(原因は不明。他記事にもAllowは効かなかったという記載がちらほら)

注意点

  • Resourceオプションはダウンロード時とアップロード時によって若干異なる。 上記のコードはダウンロード時のポリシー設定の内容ですが、アップロード時は少し異なります。
"Action": ["s3:PutObject”, “s3:PutObjectAcl”],
.
.
"Resource": [
  “arn:aws:s3:::#{bucket_name}”,
  “arn:aws:s3:::#{bucket_name}/*”
]
.
.

Actionはオブジェクトストレージにファイル(Object)を置くのでPut。
Resourceはバケット自体の記載も必要みたいです。(記載がないと403 or 404)

  • SourceIPに設定できるIPの表記方法はCIDRフォーマット
可
123.123.234.123
123.213.234.21/24

不可
123.231.23.*

反映確認/ポリシー解除

バケットにポリシーが設定されているか
$ s3cmd info バケット名

ポリシーをデフォルトに戻す
$ s3cmd delpolicy s3://<バケット名>

Kali Linux 2018.4 導入と日本語化

0

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

Kali Linux 2018.4 を VirtualBox にインストールして日本語化を行ってみました。Kali Linuxは、セキュリティ診断用ツールが標準で用意されている、Linuxディストリビューションです。バージョン2017.3から日本語利用までの流れが随分と楽になりました。

新バージョン2020

はじめに

Kali Linuxは、セキュリティ診断ツールを含むLinuxディストリビューションです。利用の仕方により不正アクセス行為と判断される可能性ががあります。またサービス停止やデータの破損が起こる場合もありますので事前にバックアップを行うなどしてください。そして必要に応じて管理者の許可を得て利用してください。

今回は、バージョン2017.3で行っておりますが、2018.4でも同様の方向で行うことができるのを確認しております。
また、PC本体へのインストールや、Light版の利用は、下記の記事などを参照してください。

Kali Linuxの特徴などについて

  • Debian派生のLinuxディストリビューションです。
  • デジタルフォレンジック、ペネトレーションテスト(侵入テスト)用などのツールが用意されている。
  • 基本的に、root権限で作業を行う。
  • 現在は、ローリングリリースを採用している。
  • バージョン2018.4がリリースされた。

Kali Linux 公式サイト
https://www.kali.org/

主な収録ツール

Kali Linuxには多数のツールが導入されています。
Nmap、Aircrack-ng、Wireshark、Metasploit Framework、Armitage、Burp SuiteOWASP ZAP、BeEF、sqlmap、wpscan など

※Burp Suiteの日本語化については、Burp Suiteを日本語化する方法として記事を書いております。
※Owasp ZAPについては、Mac版のOWASP ZAPで脆弱性チェックの設定として記事を書いております。

VirtualBox上にインストールする

仮想化ソフトウェア、VirtualBoxをインストールし、Kali Linuxのイメージを導入、起動させます。

VirtualBoxをインストールする

あらかじめ下記サイトからダウンロードを行いVirtualBoxをインストールしてください。
今回は、バージョン5.2.0に、Extension Packを導入してますが最新版で問題ないと思います。

VirtualBox 公式サイト
https://www.virtualbox.org/

Kali Linux イメージファイルのダウンロード

Kali Linux Downloads – Virtual Images イメージファイルのダウンロード先
https://www.offensive-security.com/kali-linux-vmware-virtualbox-image-download/

記事を確認しなおしてる時点で、直接ダウンロード出来るのはバージョン2018.4です。
中段の画像赤丸で囲ったKali Linux VirtualBox Imagesタブをクリックし、環境に適したものをダウンロードします。
(これタブですから、タブ押すと下の表が変わってVirtualBoxのイメージ選べますからね)
(名前の方をクリックしよう。Torrentって書いてある方は、イメージファイルを入手するのに別途アプリが必要です。)

Kali Linux ダウンロード

Kali Linux 仮想アプライアンスのインポートと設定

VirtualBoxを起動し、ファイル、仮想アプライアンスのインポートで、先ほどダウンロードしたkali-linux-2017.3-vbox-amd64.ovaを選択しインポートします。

Kali Linux インポート

トラブルを避けるため、すべてのネットワークカードのMACアドレスを再初期化にチェックを入れます。

Kali Linux VirtualBox MACアドレス設定

デフォルトの設定でも問題はないですが、ネットワークの割り当ては、診断対象環境との通信の関係上、DHCPで割り振られる環境などでは ブリッジなどがよいかと思います。仮想マシン同士で、テストする場合などは NATネットワークを選んでください。その他は、好みによって設定を変更します。私はCPUは、2コア使用でメモリを4GBぐらいにしています。

Kali Linux VirtualBox 設定

Kali Linux上の設定

Kali Linuxの起動とログイン

起動ボタンを押し、しばし眺めます。
Kali Linuxの起動を行いログインします。Kali Linuxのパスワードは、toorに設定されています。
 ユーザー名:root
 パスワード:toor
Usernameに、「root」と入力しNextボタンを押します、Passwordに、「toor」と入力しSign Inを押します。

Kali Linux ログイン画面

日本語関連パッケージの導入

ここで日本語関連パッケージをまとめて導入してしまいます。
画面左側の黒っぽいアイコンのターミナルを起動します。

Kali Linux ターミナル

そして下記のコマンドを入力します。しばらく時間がかかります。
画面がロックしてしまったら、パスワードを入力して解除しましょう。
また、エラーが出るようでしたら、右上のネットワークの接続について確認してみてください。
ホストPCでインターネットに接続できるようでしたら、一度仮想マシンのネットワーク設定をNATなどにしてみてください。

# apt-get install -y task-japanese task-japanese-desktop
Kali Linux コマンド入力

タイムゾーンの設定

次にタイムゾーンの設定をします。
画面の右上、電源右の▼をクリックし、設定画面を開きます。

Kali Linux 設定起動

そしてスクロールして、Details を選択し、更に Date & Time を選択し、Time ZoneをJSTにします。

Kali Linux タイムゾーン

日本語表示と日本語キーボードの設定

次に日本語表示と日本語キーボードの設定をします。
一つ画面を右上のボタンで戻り、上にスクロールして、 Region & Language をクリックします。

Kali Linux Region & Language

上記を参考に、Language、 Formatの変更します。(Formatは自動的に選択される)
また、Input SourcesでJapaneseの追加と順序の変更を行います。使用しなければUSを削除してしまっても問題ないです。英語キーボードを利用している場合は、USで問題ないはずです。
一通り済んだら、LanguageのとこのRestartを押して、ログアウトします。
再度ログインしなおすと日本語が有効になっているはずです。

Kali Linux 日本語化

今回のバージョンでは、特に日本語変換に関する設定を行わなくても利用できます。
ウェブブラウザも、この状態で日本語表記になります。

パッケージの更新

最後に既存のパッケージを最新に更新してしまいましょう。
画面左側の黒っぽいアイコンのターミナルを起動します。
そして下記のコマンドを入力します。しばらく時間がかかり、確認のため途中にyやニュース閉じるのにqの入力が必要となります。

# apt-get update
# apt-get upgrade

その他

動作の軽い、lightdmとxfceを使用したかったので、下記を行いました。

# apt-get install task-xfce-desktop

上記コマンドで、途中lightdmを選択し導入。
再起動し、ログイン画面でxfceを選択してログインします。

Kali Linux 2018.4 導入完了

Kali Linux 2018.4 を、VirtualBoxにインストールし日本語表示、日本語キーボードの利用、日本語変換が行えるようになりました。
バージョン2018.4で追加された機能、ツールは公式ブログの記事、Kali Linux 2018.4 Releaseで簡単に紹介されています。
Kaliの新バージョンをベースにCTFなどに参加してみてはいかがでしょうか。

関連記事など

脆弱性診断サービスなど

弊社、アピリッツではセキュリティ診断サービスを行っております。
下記リンクから内容の確認と、問い合わせが可能です。

http://security.appirits.com/

pythonでコマンドを扱う

0

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

pythonで標準入力と標準出力を扱います。

概要

pythonに慣れていて手軽に書けるので、他の言語でできることでもなるべくpythonでやりたいです。
ローカルマシンのプロセスをダンプする必要があったんですが、シェルスクリプトを書きたくなかったのでpythonで書きました。

コード

pythonのバージョンは3.6.1です。

import subprocess
import shlex
import os
from datetime import datetime

command = "ps alx"
log_file = os.path.dirname(os.path.abspath(__file__)) + "/process.log"

def main():
    buf_list = []
    buf_list.append(get_current_time())

    for i in readline_stdout():
        buf_list.append(i)

    write_file_to_log(buf_list)


# 現在時刻を取得
def get_current_time():
    current_time = datetime.now().strftime("%Y/%m/%d %H:%M:%S") + " ---------------------------------------------------------------------------------\n"
    return current_time


# 標準出力を一行ずつ受け取る
def readline_stdout():
    proc = subprocess.Popen(shlex.split(command), stdout = subprocess.PIPE, stderr = subprocess.PIPE)

    while True:
        line = proc.stdout.readline()
        yield line.decode("utf-8")

        if not line and proc.poll() is not None:
            break


# ファイルに出力
def write_file_to_log(logs):
    file = open(log_file, 'a')
    file.writelines(logs)


if __name__ == "__main__":
    main()
# 実行結果の一部
2017/11/22 18:00:22 ---------------------------------------------------------------------------------
  UID   PID  PPID CPU PRI NI      VSZ    RSS WCHAN  STAT   TT       TIME COMMAND
    0     1     0   0  37  0  2536056   6748 -      Ss     ??    1:00.50 /sbin/launchd
    0    50     1   0  37  0  2550352  37604 -      Ss     ??    0:08.14 /usr/libexec/UserEventAgent (System)
    0    51     1   0   4  0  2515384   2672 -      Ss     ??    0:01.24 /usr/sbin/syslogd
    0    53     1   0  20  0   663372   1216 -      Ss     ??    0:00.56 /Applications/.esets/Contents/MacOS/esets_ctl
    0    54     1   0  20  0  2498064  10000 -      Ss     ??    0:01.52 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
    0    55     1   0  37  0  2546936  12252 -      Ss     ??    0:02.51 /usr/libexec/kextd

ポイント

ポイントは2つです。
1. subprocessを使って標準入力と標準出力を扱う
2. shlexを使って文字列をシェルスタイルでパースする

subprocessを使って標準入力と標準出力を扱う

pythonでコマンドを扱う方法はcmdやos.system()など複数ありますが、subprocessを使うのがスタンダードなやり方っぽいです。

shlexを使う

今回のスクリプトを書いている中での最大の学びはshlexです。
たとえば、今回のコマンドは”ps alx”をそのまま渡してるんですが、shlex.split()を使わない場合は、[“ps”, “alx”]としてやる必要があります。
長いコマンドを処理したい時は面倒なので、shlexを使ってやると非常に便利です。

追記

shlex.splitを使わなくても、subprocess.Popemの引数にshell = True パラメーターを与えてやると"ps alx"でもうまくいきます。
shell = True パラメーターで処理をする利点は、"ps alx | grep hogeみたいにパイプ(“|”)を使ったコマンドが利用できるということです。
shlex.splitでパイプの入ったコマンドを利用しようとすると上手く処理できません。

追記その2

出力先ファイルのパス指定を修正しました。
cronで回したときに”process.log”だと実行時のパスが一致しないので、絶対パスを取得してやる必要がある。

VPNに触れてみる〜その0〜

0

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


VPNとは何ぞ、から実際につなげてみるまで。今回はVPN自身のお話。

はじめに

ある日、外部にあるサーバにVPNで接続するようにとのお達しを受けたのですが、現在MacOS使用中の、ネットワーク知識ほぼ皆無な自分は公式ページで確認したり様々なページを閲覧したりして接続方法を模索していました。

VPNサーバへの接続はそこまで時間はかかりませんでしたが、VPN側のネットワークにあるサーバに接続できず、ここからが大変でした。自分の設定が間違っているのかと思い、サーバへの接続方法を調べ、実際に試してみるもののVPN側へのサーバへはアクセスできず、Windows側とルーティングテーブルを見比べても特に差があるように見えなかったため難儀していました。ネットワークに関して専門的な知識が多く必要なのかなとも思いましたが、ルーティング等試行錯誤しているうちに無事接続できたので、その紹介を。

ただし、今回は手順ではなく、VPNとは何かというところをざっくりと。(なのでその「0」です)

トランスポートモードとトンネルモード

VPNの話の前に、まずは関連した暗号化方式を。

トランスポートモード

トランスポートモードは送信するパケットのうち、データに関わる部分を暗号化して送信する方式です。IPヘッダは暗号化しないため、2つの端末同士で通信を行う際に利用できる方式となります。その都合上、インターネットを介する場合はNATを利用する必要があります。

NAT:パケットヘッダに含まれるIPを別のIPに置き換える技術。外部送信するためにプライベートIPをグローバルIPへ変換するのに使われることが多い。

トンネルモード

トンネルモードは送信するパケットのうち、データに加えて自身のIPヘッダも暗号化し、送信する方式です。IPヘッダも暗号化されるため送信先などがわからなくなりますが、こちらは暗号化する際に、暗号化する側(サーバなど)で新規にIPヘッダを付与するため、送信元の情報を隠したまま通信することができます。ただし新規のIPヘッダを付与する必要上、パケット長が大きくなる特徴があります。

この2つがVPNに関連して利用されているモードですが、主流はトンネルモードのようです。
本記事はこのトンネルモードを利用したVPNの話になります。

VPNとは

VPN (Virtual Private Network:仮想プライベートネットワーク)とはインターネットを通じてプライベートネットワークを構築する技術でできたネットワークです。インターネットを通じてネットワークを構築する、という点が重要で、これをすることにより、ある拠点と、離れた拠点を擬似的に同じネットワークに所属させることができます。

例えば友人のPCと自分のPCを同じVPNサーバのネットワークに所属させると、実際は外部ネットワークを通じているにもかかわらず、同じプライベートネットワークにいるかのように操作できます。
これが複数拠点でつなぐ話になれば、離れた拠点のネットワークを同じVPNに所属させることで、すべて同一のプライベートネットワークとして扱うことができます。

enter image description here
通常、拠点間ではグローバルでしかネットワークが繋がっていない(黒枠)が、VPNを利用すると、一つの拠点であるかのようにふるまう

専用回線を使ってネットワークを構築することと同じようですが、インターネットを通じて構築している違いがあるため、VPNサーバに到達できる経路が複数あれば一部脱落しても到達できるメリットがあります。

VPNの使い道

・外部のPCをサーバへ接続する際に、同じネットワークに所属させる
・複数の拠点を1つのネットワークとしてみなすようにする

という用途でしょうか。他にも使い道がありそうな気がします。
ファイルサーバがある場合、遠く離れていても、VPNでそちらと通信できるので単純な目的にとどまることはなさそうです。

おわりに

ざっくりとVPNについてまとめてみました。次回は、実際にVPNサーバへの接続方法をまとめていきたいと思います。
接続構成ですが、あるPCをVPNサーバと接続するリモートアクセスを予定しています。


関連:
VPNに触れてみる〜その1〜
VPNに触れてみる〜その2〜

第6回「本場のプランナーって仕事場で実際何してるのー?」

0

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

みなさんお久しぶりです!Lionです。
前回の記事いかがだったでしょうか?
ゲームプランナーには「コミュニケーション能力が大事!」というのが少しでも伝わりましたら、嬉しいです!
さて、本日は「第6回 本場のゲームプランナーって仕事場で実際何してるのー?」について話させていただきます。

仕事場でゲームプランナーがやっていること

enter image description here
基本的に仕様書作成やデータ作成がゲームプランナーの主な仕事になります。
例えば、毎月のイベントの仕様書や売り物になるキャラクターの仕様書などを作成し、作成後はデータを作り、きちんと動作するかの検証を行い、ゲームバランスが崩れないか?などのバランス調整を日々行うといった感じですね。
※これ以外にもまだまだたくさん仕事はありますが、すべて書いているときりがないので割愛します。

では、もう少し詳しく仕事のフローを紹介するために、今回は「よくあるイベントの仕様書ってどうやって作るの?作成した後は何をするの?」などお伝えします。

ゲーム内で行われるイベント

enter image description here
昨今のソーシャルゲームには欠かせない毎月のイベント。
PVPや収集系、レイドボスなど、たくさんありますよね。
私が所属しているプロジェクトにも、もちろんこのようなイベントはあります。
では、例を挙げて「イベントがレイドボス討伐」の場合は、仕様書からユーザーが遊べるまでどのようなフローを踏んでいるか?を詳しく書いていきます。

まずはイベントの仕様書作成から!

まずは、イベントで何をするか?ユーザーにどう遊んでもらうか?を書き出して仕様書にします。
レイドボスと戦って遊んでもらうのであれば、最低限以下のようなことを気を付けないといけないです。

①どれくらいのユーザーがクリアできるかを決める
②レイドボスの強さ
③どうやってユーザーに攻略させるか
④ボスを倒した際の報酬
⑤ボスと戦える期間の設定

①ですが、ボスを作る前に過去のクリア人数や現在のゲーム内ユーザー環境を分析して「これくらいのユーザーがクリアできるように設計しよう!」と目標を決めます。このように大まかでもいいので達成したい目標を作っておくと仕様書は割と作成しやすくなります。

①でクリア人数を決めたら、次は②と③にいきます。
ゲーム内のユーザー資産やキャラ育成度、過去のレイドボスのクリア人数などを分析してどれくらいの強さにすれば目標が達成できるか?を考えながらレイドボスのステータスや使う技などを考えていきます。

また、ユーザーにどうやって攻略させるかも一緒に組み込んでいきます。
例えば、「○○ターン目になると雷属性弱点になるから雷攻撃をしなきゃ!」や「HPをある程度減らさないと即死攻撃をしてくるからHPを○○ターンまでに減らしきらなきゃ!」など…。
ユーザーが実際に戦って攻略法を見出さないといけないように仕様を考えます。
※攻略性がなければ、ゲームとして面白くないですからね…w

レイドボスの仕様ができたら、次は④の報酬を考えないといけないです。
もちろん、強いボスに勝ったんですからそれなりに良い報酬を置くようにしています。
良い報酬というのは、「ユーザーがもらってお得なもの」程度の報酬ってことです。
※「最強の○○」レベルのアイテムやキャラを報酬にすると、今後の運営に支障が出てしまうので、報酬はすごく慎重に決定しなければいけないのです。

そして、最後に⑤のイベント期間の設定ですね。
当たり前といえば当たり前のことですが、ユーザーに「この期間からこの期間までと明確化」してあげることで、ユーザーが一日のサイクルのどのタイミングで遊ぼうか考えるようになります。
※例えばイベント期間が長いとまったり遊ぶorイベント期間が短いと平日でも夜遅くまで遊ぶなど

細かいところは省いていますが、こういった工程を踏むことで仕様書が完成します。

仕様書はできた!その後は何するの?

仕様書ができた後に必要なフローとして、5個あります。

①デザイナーにレイドボスのキャラチップを作ってもらう
②ゲーム内にレイドボスのデーターを作成して、テスト環境に反映
③動作検証とバランス検証のテスト項目書を作成
④テスト環境でテスターに動作検証とバランス検証をしてもらう
⑤テスト検証結果から不具合修正やバランス調整を行う

まず①ですが、新しく実装するボスのキャラチップがなければリリースはできません。
そこで、「立ち絵のイラストやどういうアクションやエフェクトをして欲しいなどの資料」をデザイナーにお渡しします。
ここで重要になってくるのが、「ただ、資料を渡すだけではいけない」ということです。
資料を基に話し合って「互いに認識のずれがないか?」を確認するのが一番大事になってきます。
※でないと、想像していたものと違うものが出来上がった時に修正時間とられちゃいますからね…w

デザイナーの作成と並行して、こちらでは②のゲーム内データを作成します。
新規実装がいるような内容の場合は、事前にエンジニアと会話をして実装してもらうように依頼します。
しかし、既存構造でデータが作成できるのであれば、ゲームプランナーが作成します。
※あくまで、私の会社ではそうしています。他の会社が全て同じではないのでご注意を…。

データ作成が完了したら③のテスト項目書を作成します。
これは、結構大事な資料で、テスターが資料を見たときに「何を検証すればいいか?検証する意図は何か?」をきちんと記載しておかなければなりません。
でなければ、こちらが検証して欲しい内容の意図が伝わっていなかった場合、その結果は不十分となってしまい、本当にリリースしていいかどうか判断がつかなくなってしまう恐れがあるからです。
そのため、時間がかかってもいいので、明確に書くように心がけています。

①~③がそろえば、いよいよ④のテスト用の環境にデータを反映します。
反映後は、ある程度は自分で反映したデータをチェックし、その後にテスターにテスト項目書をお渡しして、検証してもらうという形になります。

検証が終わったら、いよいよ⑤の不具合修正や最終バランス調整を行います。
動作検証の結果では、ボスが指定の技を使っていなかったり、意図してない挙動をしていた場合は原因を調査し自分で修正するか、技術的な面である場合はエンジニアに修正依頼をお願いしたりします。
バランス検証の結果では、ボスのパラメーターや使う技の強さを変えるかを検討しデータを変更します。データ変更後、テスターに動作チェックを再度依頼します。
※大幅なバランス変更がはいいた場合は2回目のバランス検証を依頼するときもあります。
この工程がすべて完了すると最後の項目に移ります。

最後の項目とは?

最後の項目とは、メンテ前に自分と上司で、アップデートするデータが正しいかどうかを確認するチェック作業です。
ここが最後の砦で、ここでチェックを怠ってしまうと「気づけなかった不具合が本番のゲーム環境で発生した」なんてことが起こりうるかもしれないので、チェック資料を作成して慎重に確認していきます。
ここで問題なければ、メンテ日にデータを反映します。
本番の環境にデータが反映された後は、もう一回フリーチェックを行い、問題ないと最終チェックをがとれればメンテを解放して、ユーザーは新しいイベントのレイドボスと戦えるようになります。

しかし、まだ終わりではありません。メンテ解放後は1時間~2時間くらいはユーザーを監視します。
もし何かあった場合は、すぐに上司に報告し対応策を考え、ユーザーに告知をするという迅速な対応をできるようにしておくためです。
これらが全て完了してやっと「新しいイベントのレイドボスを実装した!」と言えるようになります。

ここまで話してみて

enter image description here
いかがだったでしょうか?
この話を読んでみた人の中で「ゲームプランナーって仕様書作成するだけじゃないんだ!」と思った方多いんじゃないでしょうか?
ゲームプランナーは「やれることは何でもやるなんでも屋さん」と思っていただければいいかなと思います。
※テスターの代わりに自らデータ検証をするときも多々あります。
仕様書作成、デザイナーやテスターへ依頼、依頼用資料の作成、ゲーム内のデータ作成、テスト検証、バランス調整などなどやることいっぱいなのです!
だからこそ、むちゃくちゃ楽しい職業だと自分は思っています!
なぜなら、「ゲームを制作する色々な背景をみることができる」のですから!
この記事を読んだ新卒の方がいましたら「是非ゲームプランナー目指してほしい」です(=゚ω゚)ノ
さて、次回の記事ですが「第7回 来年に流行りそうなゲームは何か?」という
深い話をしたいなと思います。
※お話しできる範囲でしか話せないのであしからず…w
最近、寒くて布団に出たくない症候群に陥っていますが、みなさん寝坊とかしないように気を付けてくださいね(´・ω・`)ノシ

sedコマンドでテキストの加工

0

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

ソースコード内の文字列置換(空白スペースの削除)を行う際に、一つ一つvimで開いてやっていたのですが、煩わしくなったので何かいい方法が無いかと調べたところ、sedコマンドが便利でした。
(sedは「stream editor」の略だそうです)

sedコマンドの使い方

直接ファイル名を指定したり、標準出力をパイプで渡すことでテキストの加工を行えます。

# 基本的な使い方
sed [オプション] (ファイル名)

# 以下、使い方の一例
# ファイル名を直接指定して文字列を置換する場合
sed -e 's/hogehoge/bizzbuzz/g' test.text  

# パイプで渡して置換する場合
cat test.text | sed -e 's/hogehoge/bizzbuzz/g'

sedコマンドで出来ること

sedコマンドで出来る処理はかなり多いです。
今回は、自分が利用した物について紹介したいと思います。

文字列の置換-sコマンド-

sコマンドを使うと文字列の置換を行うことが出来ます。

sコマンドは、vimと同じような形で記述出来るので、非常に楽です。

またアドレスを利用すると、指定した行のみ置換をするといったことが出来るようになります。

アドレスや置換する文字列には、正規表現を使用出来るので、柔軟な対応を行うことが出来ます。

# sコマンドの使い方
sed '(アドレス) s/(置換前の文字列)/(置換後の文字列)/'


# 使い方の一例
# sample.txt
foo: bar
hoge: huga
bizz: bar

$ sed 's/bar/buzz/' sample.txt
foo: buzz
hoge: huga
bizz: buzz

# bizzの行だけ置換
$ sed '/bizz/' 's/bar/buzz/' sample.txt
foo: bar
hoge: huga
bizz: buzz

行の削除 -dコマンド-

dコマンドでは、アドレスや行番号を指定して行を削除することが出来ます。

#アドレスを指定して行削除
$ sed '/bizz/ d' sample.txt
foo: bar
hoge: huga

# 行番号を指定して削除
$ sed '3 d' sample.txt
foo: bar
hoge: huga

おわりに

sedコマンドでは、今回紹介した2つ以外にも多くのコマンドが実装されているようです。

sedや、その他のコマンドについてもよく理解して、上手く扱えるように精進していきたいと思います。

UnityのTextGeneratorについて

0

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

UnityがuGUIのTextを描画するのに色々キャッシュしておくためのクラス、TextGeneratorを使って色々できます。

TextGeneratorとは・何に使えるのか

TextGenerator はTextの描画に使われているらしいです。
uGUIのソースコードは公開されており、 UI/UnityEngine.UI/UI/Core/Text.cs を読んでみると出てきます。

ざっくり言うと Populate または PopulateWithError で描画に必要なデータを生成してくれるものです。
Populate には、描画したい文字列とフォントやフォントサイズ、文字寄せ位置などの設定を入れておく TextGenerationSettings を渡します。

普通にTextを使っているぶんには直接これを触る必要は全くないのですが、
文字列がどう描画されるのかを知りたいときに非常にお世話になります。

Textの高さをどのくらいにするつもりか知りたい

チャットのような、文章によってオブジェクトの大きさが変わるものでオブジェクトプーリングを行うときにテキストがどのくらいの高さになるのか知りたくて使いました。

GetPreferredHeight といういかにもよさそうな関数がありますが、これには現在バグがあるようで、思った通りの結果を返してくれません。

https://issuetracker.unity3d.com/issues/textgenerator-dot-getpreferredwidth-slash-height-ignores-textgenerationsettings

GetPreferredHeight がいつか使えるようになるまでは文字の高さと何行になるかを求めて自力で計算することになります。

行数を求めたいとき文字数を単純に割るだけでは全角半角混じりの文章にうまく対応できないため、単純な割り算では計算できません。
ここでTextGeneratorに行数を教えてもらう必要が出てきます。

スクリプトリファレンスにもあるようにgeneratorを作ってPopulateに文字列とテキスト生成用の設定(後述)を渡すと、generatorからVertices や文字情報や行の情報などが得られるようになります。
generatorからほしいのは lineCount、Textの行数です。

public float GetLineCount(string text, TextGenerateSettings setting){
    var generator = new TextGenerator();
    generator.Populate(text, setting);
    return generator.lineCount;
}

TextGenerationSettingsは文字のフォント、フォントサイズ、領域のサイズなどを指定するためのものです。
スクリプトリファレンスの例のように作って一から代入しても問題ないですが、
Textの GetGenerationSettingsでフォントやサイズを取ってこられます。
この場合はテキストを描画する範囲だけ渡せばいいです。

var setting = sampleText.GetGenerationSettings(new Vector2 (440f, 1000f));

文字の高さを求めるのは TextGenerator ではできないのでこの記事では省略しますが、
汎用性を求めないなら行数に適当な数字をかけたり足したりしてもそれなりになります。

補遺・ルビ付けたい

上に挙げたlineCount以外にも様々なpropertyがあります。

最近なんとかルビをうまくつけられないか調べたり考えたりしています。

  • lines で各行の高さや行頭の文字のインデックスがはいったUILineInfoのリストが得られる
  • characters で各文字の幅などが入ったUICharInfoのリストが得られる

このあたりが使えそうです。
charactersでルビを付けたい文字の位置が分かればそのあたりににTextが置けたらいいんじゃないかなという気がします。私が実装することがあれば次の記事になるかもしれません。

Googleデータスタジオで4つのディメンションを使う方法

0

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

Googleアナリティクスはピボットテーブルを用いて3つまでディメンションを重ねることができますが、4つとなるとピボットテーブルでは不可能。今回はGoogleデータポータルを用いて4つのディメンションでピボットテーブルを作る方法をご紹介します。

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

こんにちは。株式会社アピリッツでアナリストをしているssekiです。
最近、Googleデータポータルで「ピボットテーブル」なる機能を見かけました。
どうやら知らないうちに新規追加されたみたいですね。

ピボットテーブルというと、Googleアナリティクスにも同名の機能があります。
Googleアナリティクスでは、行のディメンション2つと列のディメンション1つの最大3ディメンションまでソートできる機能でした。しかし、マイレポートで使えないことと、自由度が低いことから利用シーンが少ない機能という印象です。
enter image description here
※本記事の画像はGoogleのデモアカウントデータを用いています。

それでは、Googleデータポータルではどうなのかということで実際に使ってみたところ、
Googleアナリティクスよりもはるかに綺麗で、4つのディメンションを使えるピボットテーブルであることがわかりました。
今回は、ピボットテーブルの使い方についてご紹介いたします。

ピボットテーブルとは

そもそも、ピボットテーブルって何?という方のために簡単にご説明いたします。

ピボットテーブルはクロス集計と呼ばれる、2つ以上の項目を組み合わせても見やすい集計方法を実現するための表になります。
Excelを使っているとピボットテーブルという名前を目にしたことがあるかもしれませんが、主にExcelで用いる機能になります。

Googleアナリティクスやデータポータルでも同様で、2つ以上のディメンションを行と列に設置することで、大量のデータを集計したり分析したりすることができます。

Googleデータポータルにおけるピボットテーブルの使い方

それでは、Googleデータポータルでのピボットテーブルの使い方を見ていきましょう。
まずは、グラフ・表を選択する部分からピボットテーブルを選びます。
下図の赤枠で囲われた蛍のようなマークをクリックします。
enter image description here

次に、グラフ・表を作る時と同様にキャンバス上で枠を書いていくと、下図のようにピボットテーブルが表示されます。
Googleアナリティクスデータを用いた場合は、デフォルトが参照元×メディアのピボットテーブルになっています。
なお、ピボットテーブルはページ内に1つしか置くことができない仕様となっているため、蛍マークがグレー化しているのがわかります。
enter image description here

最後に、表のプロパティ画面でディメンションと指標を選択すると下図のようなピボットテーブルが完成します。
enter image description here

上記の例では、デバイスカテゴリ×ユーザータイプ×性別×年齢の4つのディメンションを重ねたピボットテーブルを作りました。
アナリティクスのピボットテーブルに比べ見た目がかなりきれいですね。これは重宝しそう。

Googleデータポータルのピボットテーブルにおける注意点

一見便利そうなピボットテーブルですが、現段階でできないことも多くあります。
個人的に特に注意すべき点を4つ挙げてご紹介します。

【1】ディメンションは2行×2列の最大4つまで
2行×2列を超えるピボットテーブルを作ることはそうそうないですが、設定できる数に限りがあるので注意です。

【2】指標は1つしか設定できない
1つのピボットテーブルに複数の指標を入れることができません。また、1ページ内に設置できるピボットテーブルは1つだけなので、複数指標を使いたい場合は、別ページにコピーして作る必要があります。

【3】エクスポートしても普通の表形式データ(ピボットテーブルではない)
csvファイルやスプレッドシートなどにエクスポートする際、ピボットテーブルのままエクスポートされません。その場合、必要であればExcelやスプレッドシートで再度ピボットテーブルを作る手間がかかることに注意です。

【4】カラーバーやヒートマップなどをセル内に含められない
個人的に一番もやもやした部分ですが、大量のデータを扱う上でカラーバーやヒートマップによるデータの可視化ができないので注意です。また、セッション数などの数値データでは全体における占有率が見たくなるのですが、これも難しそうです。

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

今回はGoogleデータポータルでピボットテーブルを作る方法、および4つのディメンションを使えるといった話をご紹介しました。
Googleアナリティクスでピボットテーブルを作る機能は以前からあったものの、使いづらさや見た目上の問題のために使っていない人も多いと思います。
Googleデータポータルで手軽にクロス集計ができるようになったため、定点観測用のみならず、一時的な分析においても活用されやすいのではないでしょうか。

ただし、ピボットテーブルを用いて細かく見ても「このデータを出してどうなるの?」といったケースは多くあります。
そのため、むやみやたらにディメンションを含めるのではなく、サイトの目標に応じた仮説実証のためにこうしたツールをうまく使っていきましょう。

「エーテル」のルーツを辿る

0

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

ファンタジー作品の中にたびたび姿を現す「エーテル」という物質。今回は現実世界での「エーテル」の歴史を遡ってみたいと思います。

エーテルとは

ファンタジー作品中での「エーテル」と言えば、主に魔法に関係する物質であることが多いです。
僕が出会った「エーテル」は魔法を使うためのエネルギー補充アイテムであったり、ファンタジックな事柄を説明できちゃう便利物質だったり、錬金術っぽいことに必要な物質だったりしました。
では、現実世界での「エーテル」とは一体何なのでしょうか。調べてみると次の3つほどが該当しました

現実世界のエーテルとは・・・
①:有機化合物を分類する際の種類の一つ
 └①の分類の中の特にジエチルエーテルという物質を指す場合も
②:光を伝える媒質と考えられていた仮想の物質
③:古代ギリシャの四大元素説で説明できない第五の元素として提唱されたもの

以下で一つ一つ紹介していきたいと思います。

①有機化合物の「エーテル」

高校で化学を専攻した方は覚えがあるかもしれません。
化学での「エーテル」は構造式R-O-R’であらわされる有機化合物の総称です。酸素Oの両端にあるRとR’は炭素と水素からなるアルキル基(CH3-等)などの有機基がくっつきます。この酸素の両端に有機基(R,R’のこと)がついている結合はエーテル結合と呼ばれています。
この「エーテル」に分類される有機化合物の中でも、特にジエチルエーテルのことをエーテルと呼称することもあります。
ジエチルエーテルは水には溶けないような、油のようなものを溶かしてくれるため、溶媒としての使用や、燃料としての利用もされています。また過去にはお酒の代用として飲用されていたことがあるようで、飲むとお酒と同じような酩酊を味わえたそうです。(ある意味で魔法の飲み物だったのかも知れません。)
enter image description here

②光を伝える「エーテル」

17世紀~19世紀ごろの科学者たちは、光が波の性質を持っていることを、光の屈折や干渉などの現象から知っていました。
ここで、地球上での波を考えると、水の波であれば水そのもの、音の波であれば空気を振動させる、のように全て何かを媒介にして「波」という現象を起こしています。
そこで当時の科学者は、光が波であれば、それを媒介するものがこの空間にあるはずだと考えていました。その光を媒介する物質が「エーテル」です。科学者たちはおよそ200年にもわたって、この「エーテル」の存在を見つけようと様々な実験を行っていましたが、精度不足によって「エーテル」があるのかないのか分かっていませんでした。しかし、その後、マイケルソン・モーレーの実験によって高精度で「エーテル」の存在を確かめる実験が行われました。その結果は「エーテル」は存在しないというものでした。この後も「エーテル」はもっと複雑な性質を持っているから見つからなかったのだ、という意見を支持する科学者たちもいましたが、その後に、複雑な性質さえも否定する実験結果が発表され、とうとう「エーテル」は架空の存在となってしまいました。(この業績によってマイケルソンはノーベル賞を受賞しています。)

③四大元素説の「エーテル」

かつて古代ギリシャの哲学者は、この世の物質は大きく四つの元素が基盤となっていると考えていました。この四つとは火・空気・水・土と呼ばれるものであり、地球上のすべての物質はこの四つの元素に種々の性質が加わったりすることで構成されていると考えられていました。
アリストテレスもこの考えを受け継いでおり、これら四つの元素は、「プリマ・マテリア」と呼ばれる何も性質を持たない純粋な物質に対して、「熱・冷」と「湿・乾」という性質が加わわることで、先の四つの元素が構成されると考えました。
この四つの元素には固有の場所があるとされ、水・土は下へ沈み、火・空気は上へ昇ると考えられていました。
しかし、遥か天上で運動を続けている天体にはこれらの性質が当てはまらないため、天体はこれら四元素とは別の第五の元素が構成していると考えました。この第五の元素と呼ばれているものが「エーテル」です。
enter image description here
実は①と②のエーテルは、この第五の元素「エーテル」が命名元となっているのです。
①は揮発性の高さから天上へ昇っている様子をなぞらえて、②は天界に満ちた物質という側面から。それぞれ全く別の物質が、場所も時代も違えど「エーテル」という名称にたどり着いたのは面白いですね。

終わりに

いかがだったでしょうか。ファンタジーな物質のルーツを辿ると、スタートは夢も希望もないただの化学物質でしたが、最終的には古代ギリシャの世界設定にたどり着いてしまいました。昔の人にとってはまさに生きる世界がファンタジーだったのかもしれません。

Googleデータポータルで4つのディメンションを使う方法

0

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

Googleアナリティクスはピボットテーブルを用いて3つまでディメンションを重ねることができますが、4つとなるとピボットテーブルでは不可能。今回はGoogleデータポータルを用いて4つのディメンションでピボットテーブルを作る方法をご紹介します。

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

こんにちは。株式会社アピリッツでアナリストをしているssekiです。
最近、Googleデータポータルで「ピボットテーブル」なる機能を見かけました。
どうやら知らないうちに新規追加されたみたいですね。

ピボットテーブルというと、Googleアナリティクスにも同名の機能があります。
Googleアナリティクスでは、行のディメンション2つと列のディメンション1つの最大3ディメンションまでソートできる機能でした。しかし、マイレポートで使えないことと、自由度が低いことから利用シーンが少ない機能という印象です。
enter image description here
※本記事の画像はGoogleのデモアカウントデータを用いています。

それでは、Googleデータポータルではどうなのかということで実際に使ってみたところ、
Googleアナリティクスよりもはるかに綺麗で、4つのディメンションを使えるピボットテーブルであることがわかりました。
今回は、ピボットテーブルの使い方についてご紹介いたします。

ピボットテーブルとは

そもそも、ピボットテーブルって何?という方のために簡単にご説明いたします。

ピボットテーブルはクロス集計と呼ばれる、2つ以上の項目を組み合わせても見やすい集計方法を実現するための表になります。
Excelを使っているとピボットテーブルという名前を目にしたことがあるかもしれませんが、主にExcelで用いる機能になります。

Googleアナリティクスやデータポータルでも同様で、2つ以上のディメンションを行と列に設置することで、大量のデータを集計したり分析したりすることができます。

Googleデータポータルにおけるピボットテーブルの使い方

それでは、Googleデータポータルでのピボットテーブルの使い方を見ていきましょう。
まずは、グラフ・表を選択する部分からピボットテーブルを選びます。
下図の赤枠で囲われた蛍のようなマークをクリックします。
enter image description here

次に、グラフ・表を作る時と同様にキャンバス上で枠を書いていくと、下図のようにピボットテーブルが表示されます。
Googleアナリティクスデータを用いた場合は、デフォルトが参照元×メディアのピボットテーブルになっています。
なお、ピボットテーブルはページ内に1つしか置くことができない仕様となっているため、蛍マークがグレー化しているのがわかります。
enter image description here

最後に、表のプロパティ画面でディメンションと指標を選択すると下図のようなピボットテーブルが完成します。
enter image description here

上記の例では、デバイスカテゴリ×ユーザータイプ×性別×年齢の4つのディメンションを重ねたピボットテーブルを作りました。
アナリティクスのピボットテーブルに比べ見た目がかなりきれいですね。これは重宝しそう。

Googleデータポータルのピボットテーブルにおける注意点

一見便利そうなピボットテーブルですが、現段階でできないことも多くあります。
個人的に特に注意すべき点を4つ挙げてご紹介します。

【1】ディメンションは2行×2列の最大4つまで
2行×2列を超えるピボットテーブルを作ることはそうそうないですが、設定できる数に限りがあるので注意です。

【2】指標は1つしか設定できない
1つのピボットテーブルに複数の指標を入れることができません。また、1ページ内に設置できるピボットテーブルは1つだけなので、複数指標を使いたい場合は、別ページにコピーして作る必要があります。

【3】エクスポートしても普通の表形式データ(ピボットテーブルではない)
csvファイルやスプレッドシートなどにエクスポートする際、ピボットテーブルのままエクスポートされません。その場合、必要であればExcelやスプレッドシートで再度ピボットテーブルを作る手間がかかることに注意です。

【4】カラーバーやヒートマップなどをセル内に含められない
個人的に一番もやもやした部分ですが、大量のデータを扱う上でカラーバーやヒートマップによるデータの可視化ができないので注意です。また、セッション数などの数値データでは全体における占有率が見たくなるのですが、これも難しそうです。

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

今回はGoogleデータポータルでピボットテーブルを作る方法、および4つのディメンションを使えるといった話をご紹介しました。
Googleアナリティクスでピボットテーブルを作る機能は以前からあったものの、使いづらさや見た目上の問題のために使っていない人も多いと思います。
Googleデータポータルで手軽にクロス集計ができるようになったため、定点観測用のみならず、一時的な分析においても活用されやすいのではないでしょうか。

ただし、ピボットテーブルを用いて細かく見ても「このデータを出してどうなるの?」といったケースは多くあります。
そのため、むやみやたらにディメンションを含めるのではなく、サイトの目標に応じた仮説実証のためにこうしたツールをうまく使っていきましょう。

高速にステーキを作ろう!!(ActiveRecordの速さを追い求める.2)

0

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

3はある、かもしれないような気がする。

ステーキを作るコード

 美味しいステーキを(ステーキに)作りたいが為に、以下のようなコードがありました(疑似コードも書いたので面倒ならそれを読んでください)。

class Cow < ActiveRecord::Base
  DEAD = 0.freeze
  ALIVE = 1.freeze
  SICK = 2.freeze

  def create_steak!(part, solt_vol, pepper_vol, bake_time, rest_time)
    self.slaughter! if self.is_alive?
    beef = Beef.find_by(cow_id: self.id, part: part)
    return if beef.nil?
    beef.steak!(solt_vol, pepper_vol, bake_time, rest_time)
  end
=begin
def ステーキ作る!(部位、塩の量、胡椒の量、焼く時間、休ませる時間)
  牛が生きていたら屠畜する
  肉が得られなかったら作れないのでさよなら
  肉をステーキにする
end
=end

  def slaughter!
    return if !self.is_alive?
    before_status = self.life_status
    self.life_status = DEAD
    self.dead_time = Time.now
    self.save
    if before_status != SICK
      Beef::PART.each do |part|
        Beef.create(cow_id: self.id, part: part)
      end
    end
  end
=begin
def 屠畜!
  もう死んでたらおしまい
  屠畜して時間を記録
  牛が病気じゃなかったら部位毎に肉を取得
end
=end

  def is_alive?
    self.life_status != DEAD
  end
end
=begin
def 生きてる?
  生きてるかどうか返す
end
=end
class Beef < ActiveRecord::Base
  PART = ["Loin", "Libeye", "Sirloin", "Spencer Roll", "Tenderloin", "Top Sirloin Butt", ...]
  RECIPE_NAME = ["YAKINIKU", "STEAK", "BEEF STEW", "BEEF CURRY", "BEEF STROGANOF"]
  validate :recipe_include?, :part_include?

  def steak!(solt_vol, pepper_vol, bake_time, rest_time)
    self.solt_volume += solt_vol
    self.pepper_volume += pepper_vol
    self.bake_time += bake_time
    self.is_cooked = true
    self.rest_time = rest_time
    self.recipe_name = "STEAK"
    self.save
    self
  end
=begin
def ステーキにする!(塩の量、胡椒の量、焼く時間、休ませる時間)
  塩を振る
  胡椒を振る
  焼く
  調理済ステータスにする
  休ませる
  レシピ名を与える
  保存
end
=end

  def recipe_include?
    if self.is_cooked
      unless RECIPE_NAME.include?(self.recipe_name)
        error.add(:recipe_name, "Recipe not found.")
      end
    end
  end
=begin
def そのレシピある?
  調理済なら
    レシピ名調べて無かったらエラー
end
=end

  def part_include?
    unless PART.include?(self.part)
      error.add(:part, "Part not found")
    end
  end
=begin
def その部位ある?
  部位名調べて無かったらエラー
end
=end
end

Cow Model(簡略化してます)

id          : integer
life_status : integer
dead_time   : datetime

Beef Model(簡略化してます)

id            : integer
cow_id        : integer
part          : string
is_cooked     : boolean
solt_volume   : float(g)
pepper_volume : float(g)
rest_time     : integer(sec)
bake_time     : integer(sec)
recipe_name   : string

 さて、このコードでCowインスタンスが存在すれば(cowとする)、

cow.create_steak!("Sirloin", 2.0, 1.0, 90, 90)

の一文で塩を2g、胡椒を1g、それから90秒焼いて90秒休ませたサーロインステーキが作れてしまいます(これ以上凝るとコード長が大変な事になるので妥協しました)。

沢山サーロインステーキを作りたい

 さて、沢山サーロインステーキを作りたいときにはどうしたら良いでしょう。
 まず、沢山の牛を用意しなければいけません。新鮮な肉が良いので、生きている牛を1000匹用意しましょう(もちろん病気の牛は除外します)。

cows = Cow.where(life_status: Cow::ALIVE).take(1000)

 それから1000個のステーキを作りましょう。

cows.each do |cow|
  cow.create_steak!("Sirloin", 2.0, 1.0, 90, 90)
end

 ……遅い! とても遅い!
 何故?
 そりゃあ、一匹一匹、屠畜して、塩胡椒を振って、焼いて休ませて、を繰り返してるから(一匹毎にSQLを発行、1000 * n回のSQLの発行が起きているから)ですよ。
 1000匹一気に屠畜して、1000個のサーロインに一気に塩胡椒を振って、1000個のサーロインを焼いて休ませてあげた方が速いに決まってます。
 その為には、やはり、それ用の沢山ステーキを作るコードを書きましょう。
 ただ、一つgemが必要です。
 activerecord-importというgemで、これを使えば、

models = []
1000.times do |n|
  models << Model.new(...)
end
Model.import(models)

 という感じで、一括insertが出来るようになります(gemを使わなくとも、一括insertするSQL文をコード上で生成して生SQLでダイレクトに挿入するという力技で出来る事は出来ます)。
 さて、大量にステーキを高速に作るために、Cowモデルにメソッドを作りましょう。

def self.create_steaks!(num, part, solt_vol, pepper_vol, bake_time, rest_time)
  last_insert_id = Beef.maximum(:id) + 1 #確実では無いかも
  now = Time.now
  cow_ids = Cow.where(life_status: Cow::ALIVE).limit(num).pluck(:id)
  return if cow_ids.length < num
  Cow.where(id: cow_ids).update_all(life_sttus: Cow::DEAD, dead_time: now)
  beefs = []
  steak_beef_ids = []
  cow_ids.each do |cow_id|
    BEEF::PART.each do |p|
      beef = BEEF.new(id: last_insert_id, cow_id: self.id, part: p)
      last_insert_id += 1
      beefs << beef
      steak_beef_ids << beef.id if p == part
    end
  end
  Beef.import(beefs)
  Beef.where(id: steak_beef_ids).update_all(solt_volume: solt_vol, pepper_volume: pepper_vol, bake_time: bake_time, is_cook: true, rest_time: rest_time, recipe_name: "STEAK")
=begin
def ステーキを沢山作る!(牛の数, 部位, 塩の量, 胡椒の量, 焼く時間, 休ませる時間)
  最後の肉のIDを取得
  現在時間を取得
  生きている牛のIDを、数だけ取得
  生きている牛が数だけ居なかったらおしまい
  そのIDの牛全てを屠畜
  そのIDの牛全てに対して牛肉を作成。指定された部位のIDは別に分けておく
  指定された部位の肉を焼いて更新
end
=end
end

 このコードだと、下の1行で1000個のステーキが作れます!(生きている牛が1000体以上居たらに限りますが)

Cow.create_steaks!(1000, 2.0, 1.0, 90, 90)

 そして、このコードはどれだけステーキを焼こうともSQLの呼び出し回数は固定です(newはSQLの呼び出しになりません)。
 直感的にも屠畜場から調理場へ行って肉を焼いて屠畜場に戻って……を何回と繰り返すのではなく、屠畜場で一気に処理して、それから調理場へ全ての肉を運んで全ての肉を焼いて……とした方が早いとは分かると思います。
 一つ一つのSQLは重いですが、単純に行うよりはずっと早いです。
 ただ、注意点が3つほどあります。

IDを自分で振る必要がある

 importではオートインクリメントの値を計算してくれません。

last_insert_id = Beef.maximum(:id) + 1 #確実では無いかも

 この行はその為ですね。#確実では無いかも、というのは、オートインクリメントの値を取ってきていないからです。オートインクリメントの値を取る方法を少し調べてみたりはしましたが、中々見つからなかったので、今回はこれにしました。

バリデーションをしてくれない

 importは、DBに直接働きかける為、トリガなどを一切無視しまう事が原因です。なので、このメソッドは、予想外の値が入らない事が前提条件となるでしょう。それか、バリデーションを自分でimportの前に入れておくか、とか。

他のActiveRecord関連のgemと相性が悪い

 バリデーションをしてくれない、という事と同じで、DBに直接働きかけるという点が原因です。
 例えば、水平分散DBを実現するactiverecord-turntableというgemの、uniqueなID管理を統括してくれるsequenceと相性が良くないです。
 import処理を行った後も、その連番の値を管理してくれている数値が更新されないので、次に普通にcreateとかしようとすると、idが重複しているよ! と怒られてしまいます。
 なので、sequenceを使っているmodelに関しては、import処理を行った後に、以下のように、sequenceの値を進めてあげる必要が出てきます。

Beef.connection.next_sequence_value("beefs_id_seq", num)
#加算した分(num)だけ、シーケンスの値を進める

最後に

 Railsの処理速度で一番ボトルネックになりやすいのは、SQLの呼び出しでしょう。
 そのSQLの処理時間を減らす為には主に、
・出来るだけモデルそのままではなく、必要な情報だけを取得するようにする
・呼び出し回数そのものを減らす
という事になってくると思います。
 特に呼び出し回数を減らす、という点においては、今回の高速化においての主な方法だった、一回のSQLで一括読み込み/書き出しをする、という他に、メモ化する、Redisでキャッシュに書き込んで、そちらから取得する、等々色んな方法があります。

モーション用ミニキャラクターの作り方①

0

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

こんにちは
ゲームの戦闘シーンやスキル画面などでデフォルメされたキャラクターが動いているのを見かけるかとおもいます。
今回は、そういったモーション用のイラストテクスチャの作り方をご紹介します。

テクスチャの構造

身体の間接ごとにパーツ分けしで動かせるようにします。
enter image description here

一般的な人間キャラを大まかにパーツ分けすると、頭部・上半身・二の腕・手先・腿・足先で作られます。
これらに加え、キャラの個性(髪型・衣装・武器など)が追加されていきます。
ラフの段階でパーツが動く際に支障がないかなどイメージします。

テクスチャの作成

描いていると気づきにくいですが、デフォルメされたテクスチャはゲームに反映された際に圧縮表示されることが多いです。
それがスマートフォンで表示されればさらに小さくなります。
作るときにズームアウトをしバランスをとりながら作画すると、どこを見せる必要があるのかわかりやすいです。
デフォルメされても重力を感じさせる立体感を意識し、
デザインの情報量を減らしずつ、可愛らしく見えるよう目指していきます。(これが難しい…)

パーツの繋ぎ目

手足の関節は曲げる際に色のはみ出しや影のズレがないようにします。
enter image description here

enter image description here

上の腕を透過するとこんな感じに。
回転ツールの中心部を間接に合わせて動かし、確認しながら調整していきます。
柄や装飾は間接部分に入れてしまうと動いた際いにズレやすいので検証しながら進めていきます。

隠れている部分の描き込み

立ち絵では隠れていることの多い耳やおでこなども、キャラの動きに合わせて髪が動くので見えます。
これらも回転ツールで動かしながら見せる部分を描いていきます。
enter image description here

最後に

今回は人のキャラクターで制作しましたが、モンスターなど複雑な形をしているとパーツも変わります。
最初の骨組みをしっかり型とっていくのがいいかと思います。

includeとextend

0

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

今回は、includeとextendについて調べてみました。

include, extendとは

 include,extendは、モジュールのメソッドをクラスに読み込む機能を持っています。異なる点は、includeがインスタンスメソッド、extendがクラスメソッドとしてクラスに読み込みます。コードでは、以下のようになります。

module Dog
  def dog
    'Bow wow'
  end
end

class IncludeDog
  include Dog
end

class ExtendDog
  extend Dog
end

include_dog = IncludeDog.new
include_dog.cry
=> "Bow wow"

ExtendDog.cry
=> "Bow wow" 

 extendは、クラスのインスタンスに対して実行することもできます。この場合、実行したインスタンスにのみ、extendしたモジュールのメソッドが使用することができます。クラスのインスタンスに対してextendした場合は、特異メソッドとして取り込まれます。

module Dog
  def cry
    'Bow wow'
  end
end

class Animal
end

animal = Animal.new
animal.extend Dog
animal.cry
=>"Bow wow"

 includeにもextendと同様に、インスタンスを使用した方法があります。

animal = Animal.new
class << animal
  include Dog
end
animal.cry
=>"Bow wow"

モジュール読み込みとオーバーライドについて

 モジュールとクラスに同じメソッドが存在した場合、include, extendを行うことでどちらのメソッドがオーバーライドされるのか気になったので調べてみました。結果は、クラス内でinclude, extendした場合は、クラスで定義したメソッドが呼び出され、クラスのインスタンスを使用してinclude,extendした場合は、モジュールで定義したメソッドが呼び出されました。

enter image description here

 クラス内でinclude, extendした場合に、クラスのメソッドを上書きしてモジュールのメソッドを呼び出す方法が無いか調べてみると、includeの代わりにprependを使用することで解決できることが分かりました。includeとprependの違いは、継承される順番が異なることです。includeの場合だと「クラス < モジュール」、prependだと「モジュール < クラス」となります。

module Dog
  def cry
    'module method'
  end
end

class PrependDog
  prepend Dog

  def cry
    'prepend dog'
  end
end

prepend_dog = PrependDog.new
prepend_dog.cry
=> "module method"

# PrependDogの親クラス一覧 一番左が自分のクラス、右が親クラス
PrependDog.ancestors
=> [Dog, PrependDog, ..., Object, BasicObject]

まとめ

今回は、includeとextendについてまとめてみました。

  • インスタンスメソッドとして取り込むならinclude
  • クラスメソッドとして取り込むならextend
  • インスタンスに対してinclude, extendを行うことでクラスのメソッドを上書きする(メソッド名が重複する場合)
  • prependで、クラスのメソッドを上書きする(メソッド名が重複する場合)

新卒として大事だと思う3つのこと

0

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

来年から働き始めるあなたへ

皆さんお久しぶりです。
モツ太郎です。
さて4月に入社して早半年がたちました。
今回は半年新卒としてやってきた中で、
これができるとすごく役に立つということを書いていきたいと思います。

メモを取る

まず一つ目はメモを取るということ。
会社に入ると自分のことを見てくれる人から業務を振られることになります。
その際にその業務に関して抜けがないようにメモをとることは非常に大事になります。
振られた業務を書き写すだけではなく、いつまでに、どういう形式でというのもきちんとメモを取るようにしましょう。
さらに、その業務をしていて自分なりに気を付けるポイントがあった場合、書き留めておくことで次回同じようなことを行うときに、
業務のスピードアップにつなげることができます。

わからないことは聞く

当然会社に入ったばかりで業務に関してわからないことがでてきます。
どこがわからないかを明確にして先輩や上司に聞きましょう。
教えてくれる人は新卒に対して教えるための時間を割いて教えてくれています。
わからないことをわからないままに指示されたものとズレたものを出すくらいなら、積極的に聞いて理解を深めましょう。
ただし、あえて「聞かずにやってみて」や「自分で考えてみて」といわれた場合に関しては自分で考えてから聞くようにしましょう。
何らかの意図があってそういう指示を出しているはずです。

チャンスがあったら積極的に!

会社内には新人であっても業務を任せてもらえるチャンスがあると思います。
その時にはたとえ自分の身の丈に合っていないと思っても積極的に挑戦していきましょう。
挑戦した結果の失敗に関してはあまり責められることはないと思います。(少なくともアピリッツでは)
その時にたとえ失敗したとしても、その経験は今後大きなプラスに働くことが多いと思うので、
積極的にいろんなことにチャレンジしていきましょう。

おわりに

さて今回は新卒にとって私が大事だなと思ったことをつらつらと書いてみましたがいかがだったでしょうか。
目を通してみると当たり前のことばかりだと思います。
しかし、実際に会社に入ってみるとその当たり前のことができるかできないかで差をついてしまうところもあります。
今回取り上げた3つのことを意識してやることで実際仕事を初めてから焦る事が少なくなると思うので
新卒として来年社会人になる皆さんは意識してやってみていただけるといいなと思います。

ITweenで簡単にアニメーション

0

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

UnityのITweenで簡単なアニメーションをスクリプトからやってみることを目的としています。

はじめに

みなさん、こんにちは。motsukaです。
今回は便利なAssetsの紹介となります。
ITweenをご存知でしょうか?
ITweenとは、簡単にアニメーションをスクリプトから実装できるAssetです。
これを使い簡単なアニメーションを作ってみましょう。

使い方

まずは基本的な使い方から紹介します。

iTween.MoveTo( gameObject, iTween.Hash( “x”, 1f ) );

このMoveToと言うメソッドは動かしたい対象を移動させるメソドです。
これは、第一引数に動かしたいオブジェクト、第二引数には動作を指定する引数で、Hashテーブルで作ったパラメータを入れることで動作します。直接Vector3を入れても動作します。
では、Hashテーブルの中身を見ていきましょう。
Hashテーブルの中身には様々なものが設定できます。代表的なものを紹介しますと、

iTween.Hash(“x”, 1f)

これはx軸方向にどれだけ力を加えるかを指定できます。x軸以外にもy軸z軸も指定できます。

iTween.Hash(“position”, new Vector3(1f, 1f, 1f))

これは先ほど紹介したx軸y軸z軸をいっぺんに設定できるものです。

iTween.Hash(“time”,5f)

これはアニメーションが終わるまでの時間を指定できます。

iTween.Hash(“isLocal”,true)

これは指定する座標をローカル座標に指定することができます。

と言った風にまだまだたくさん指定できるものはあるのですがキリがないのでこの辺で終わらせておきます。
気になる方は下記の本家のDocumentを見てもらうともっとよくわかると思います。

まとめ

ITweenを使えば、ちょっとした時にアニメーションをつけたい時に簡単につけることができます。
これ以外にも便利な関数がたくさんありますのでぜひ使ってみてください。
詳しく知りたい方は、本家のDocumentのURLを載せておきますので、ご覧になるといいと思います。
http://www.pixelplacement.com/itween/documentation.php

【ruby】CaboChaによる係り受け解析のやり方

0

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

ハロウィーンの時期がやってまいりました。ハロウィーンといえばジャック・オー・ランタン、つまりカボチャですね。 そこで、係り受け解析ツールCaboChaを使って係り受け解析をしてみたいと思います。

ハロウィーンの時期がやってまいりました。ハロウィーンといえばジャック・オー・ランタン、つまりカボチャですね。
そこで、係り受け解析ツールCaboChaを使って係り受け解析をしてみたいと思います。
 

係り受け解析とは

まず係り受け解析とは、修飾語と被修飾語のように、関係し合っている文節や単語の解析を行うことです。

「母のおいしい料理」という文の係り受けの構造は
母のおいしい料理

というようになります。
 

係り受け解析ツール CaboCha

今回はCaboChaというフリーソフトウェアを使います。unixとwindowsで動かせるそうです。
 

インストール

mecab

文章を形態素解析するときに使います。(「すもももももももものうち」を「すもも も もも も もも の うち」のように分けます。)
Groonga を使うとインストールが簡単

sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
sudo yum makecache
sudo yum install mecab mecab-ipadic
export PATH=$PATH:/usr/bin/mecab

CRF++

https://taku910.github.io/crfpp/ から最新ファイルを持ってくる。

tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801/
./configure --with-charset=utf8
sudo make install

pcre

Perlの正規表現と互換性のある正規表現を他の言語でも使うために作られたライブラリです。
http://www.pcre.org/ から最新ファイルを持ってくる。

tar zxvf pcre-8.41.tar.gz
cd pcre-8.41
./configure
make
sudo make install

cabocha

https://taku910.github.io/cabocha/ から最新ファイルを持ってくる。

tar zxvf CRF++-0.58.tar.gz
cd CRF++-0.58
./configure --with-charset=utf8
make
sudo make install

swig

cabochaをrubyで使えるようにするためのツールです。
http://www.swig.org/ から最新ファイルを持ってくる。

tar zxvf swig-3.0.12.tar.gz
cd swig-3.0.12
./configure
make
sudo make install
make ruby
cd ../ruby/
ruby extconf.rb 
make

gem

gem install cabocha

bundler、pry-byebug、rake、rake-compiler、rspecが必要です。

実際に動かしてみる

irb(main):001:0> require 'CaboCha'
=> true
irb(main):002:0> sentence = "太郎はこの本を二郎を見た女性に渡した。"
=> "太郎はこの本を二郎を見た女性に渡した。"
irb(main):003:0> c = CaboCha::Parser.new
=> #<CaboCha::Parser:0x0000560e74ef2df0 @__swigtype__="_p_CaboCha__Parser">
irb(main):004:0> puts c.parseToString(sentence)
  太郎は-----------D
      この-D       |
        本を---D   |
        二郎を-D   |
            見た-D |
            女性に-D
            渡した。
EOS
=> nil

ちょっと分かりにくいですが、

  • 太郎は→渡した
  • この→本
  • 二郎を→見た
  • 見た→女性に
  • 女性に→渡した

にかかっているということを表しています。

まとめ

rubyで使えるようにしようとしたため、インストールするものが多くなってしまいました。
そして、そもそもCRF++とかよくわからないままインストールしているからどういったものか調べたい。

また、係り受け解析自体にまだまだ問題点がたくさんあるようで、
– 「母のおいしい料理」
– 「味の濃い料理」
のように、形は同じだけど、かかっている場所が異なるような文章が難しいようです。

最近はGoogleから出ているSyntaxNetというものでも構造解析ができるらしいです。

参考

目の負担を軽くする

0

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

PCのモニタを毎日長時間眺めている皆さん、こんにちは。 今回は目の負担を軽くする方法についてお話していきたいと思います。

ブルーライトをカットする

こちらは目の負担を未然に軽くする方法です。

ブルーライトとは、波長380~495nmの青色光のことを指します。これは可視光線の中で最も高いエネルギーを持っており、目の疲れの原因の一つとなります。

これをカットするための方法として、以下のふたつが挙げられます。

1. PCモニタの設定を変更する

これはお金をかけずにできる最も簡単な方法だと考えられます。

お使いのモニタ側の画面設定、またはPC側での画面設定から色温度を5000Kに設定するだけです。

色温度が下がるため、画面は黄色がかってしまいますが、目の負担を軽減するには仕方ありません。

ただし、デザイナーやイラストレーターの方は、画面の色味が変わってしまうことにより正しい色を得られなくなってしまう可能性があることにお気をつけください。

2.ブルーライトをカットするメガネを使用する

多少のお金はかかりますが、PCだけでなくスマートフォンやタブレットを使用する際にもブルーライトをカットすることができるという汎用性があります。

目を温める

こちらは目に負担がかかった後にできることです。

目の疲れの原因の一つとして、目の周りの筋肉が緊張状態になってしまうことが挙げられます。

肩が凝ったら肩を揉んで筋肉をほぐすように、目の周りの筋肉もほぐして、血行を良くしてあげれば目の疲れを緩和することができます。

そのためには蒸しタオルが効果的でしょう。濡らしたタオルをビニール袋に入れ、30秒ほど電子レンジで温めれば簡単に作ることができます。

目を大切にしよう

私は目の疲れからくる頭痛に何度となく悩まされてきましたが、今回お話ししたことを実践したことでその回数も減りました。

皆さんも目を大切にしましょう。

SDキャラを可愛く描く①【体編】

0

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

SDキャラの体を可愛く描くためのポイントについてまとめました。

はじめに

nocoです。
最近自宅のデスクにゲームやアニメのキャラクターのSDキャラのフィギュアが増えてきました。
可愛い!!と思って衝動買いしたものがほとんどなのですが、作業に疲れたときふと目をやると非常に癒されます…。
ちまっこくて可愛くて、そばに置いておきたくなるようなSDキャラって素敵な生き物です。

今回、SDキャラを可愛く描くポイントについて考えまとめてみました。
「可愛い」の定義は人それぞれのため、主観の多い記事となりますがよろしければご覧ください。

SDキャラとは

enter image description here
前回の記事で描いた女の子をデフォルメし、SDキャラ化してみました。

SDキャラとはこのように2、3等身にデフォルメされたキャラクターのことです。
SDは「スーパーデフォルメ」の略で、その名の通り度合いの強いデフォルメのことを指します。
他にはミニキャラ、ちびキャラと称されることもあります。
その愛らしさから親しみやすく、さまざまなメディアで用いられています。

SDキャラの体型

enter image description here
2等身のシンプルな素体を用意しました。
SDキャラは等身が低いほど可愛らしい印象になるため、こちらをベースにお話します。
 

体型による印象の違い

enter image description here
ベースにむっちりとした体型の素体を用意しましたが、SDキャラは体の太さによって印象が大きく変わります。
キャラクターをどう見せたいか考え、それに合ったデフォルメをしてあげましょう。

可愛く見せるパーツの描き方

enter image description here

全てのパーツに言えることですが、可愛く見せるには幼い印象にしてあげることです。
赤ちゃんや小動物を可愛いと感じるように全体的にちまっこく、幼く描いてあげましょう。
 

①頭は丸く、横に長く

はっきり顎をとがらせず、やわらかい曲線をつないで形をつくります。
普通の等身のイラストは頭が縦に長いですが、SDでは横幅を長めにすると良いでしょう。
 

②目は大きく、顎に近づける

enter image description here
目を顎に近づけてあげるほど幼い印象になり、可愛さが増します。
やりすぎるとバランスが崩れてしまうので、一番可愛く見える位置をじっくり探しましょう。
 

③ほっぺのふくらみを見せる

思わずつつきたくなるような丸いほっぺはSDキャラの可愛さの多くを占めます。
髪や手で隠してしまうと勿体ないポイントなので、ポーズを付ける際に気を付けたいところです。
 

④手足は小さく短く

これもまた幼い印象に近づけるため指を短くします。
2等身のデフォルメでは親指以外をミトンのように繋げて描いても良いかもしれません。

⑤首は可能な限り短く

enter image description here
顎から肩の距離が長いと大人びた印象になり可愛いから少し遠のいてしまいます。
ほんの数ミリでも印象が異なるので、気を付けてあげたいポイントです。
2等身のデフォルメでは首は無いに等しいくらいが良いと思います。
(等身高めのデフォルメではこの限りではありません)

おわりに

スーパーデフォルメはかわいいキャラはもちろん、かっこいいキャラも可愛く変身する魔法のような技法です。
今回は体型についてのみでしたが、次回は髪や衣装のデフォルメの仕方についてお話できればと思います。

キーボードにこだわる

0

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

仕事で毎日触れることになるキーボード。 毎日使うものですので自分に合ったものを長く使っていきたいものです。

キーボードの種類

メンブレン方式

メンブレン方式のキーボードは最も主流なもので、比較的安価に購入することができます。基盤にそれぞれのキーに対応した接点があり、キーを押すことで接点が反応し、文字が入力できます。

デメリットとしては、安価な代わりに故障した際には全交換または買い替えが必要になる点、キーを強く押さないと反応しない場合があるため手が疲れやすいという点です。

メカニカル方式

メカニカル方式のキーボードの良いところは、耐久性が高く長く使用できるという点と、それぞれのキーに対応するスイッチが独立しているため特定のキーが反応しなくなったなどの故障の際にはその部分だけ交換することができるという点です。また、スイッチの種類によって打鍵感が異なるため、自分好みのキーボードを選べるという点もあります。

デメリットとしては、価格がやや高いこと(およそ12,000円程度)、静かな場所で使うには打鍵音がうるさいことが挙げられます。

オフィスで使えるキーボード

個人的には長く使える メカニカルキーボード をお勧めします。

最近では静穏スイッチを採用したモデルも販売されているため、オフィスで使用するのにも適しています。

終わりに

Happy Hacking Keyboardというキーボードの開発者である東京大学名誉教授の和田英一先生はこうお話されています。

アメリカ西部のカウボーイたちは、馬が死ぬと馬はそこに残していくが、どんなに砂漠を歩こうとも、鞍は自分で担いで往く。馬は消耗品であり、鞍は自分の体に馴染んだインタフェースだからだ。
いまやパソコンは消耗品であり、キーボードは大切な、生涯使えるインタフェースであることを忘れてはいけない。

同じPCを使っていても、キーボードが使い慣れたものでなければ作業効率は落ちてしまうでしょう。逆に、PCが変わっても使い慣れたキーボードであれば同じように作業することができるでしょう。

みなさんもお気に入りのキーボードを探し出し、長く使ってあげてください。

【git】マージした時のコンフリクトをコマンドで解消

0

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

マージする時ほぼ毎回コンフリクトで時間を奪われるので、楽に解消できそうなコマンドを使ってみたらちょっとだけ楽だったので備忘録として残しておこうと思います。
 

マージ開始

マージ開始して

Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトが発生。
diffを見ると大概こんな感じになってますよね。

<<<<<<< HEAD
aaaaaaaa
=======
bbbbbbbb
>>>>>>> merge_branch

これが1個や2個ならいいですが、前のマージの仕方が悪かったのか何なのか、複数に渡って更には複雑化してこんな感じのコンフリクトを起こしたりするともう投げ出したくなります。

<<<<<<< HEAD
<<<<<<< HEAD
aaaaaaaa
=======
cccccccc
>>>>>>> branch
=======
bbbbbbbb
>>>>>>> merge_branch

落ち着いてゆっくり見たらなんだか手作業でもいける気がしますが、
正直ぱっと見じゃ何がなんだかわからないしやりたくない…。
 

対処

先ほどのみたいに凄まじく複雑だし大量にコンフリクト起きてる…けど、どちらかのブランチに合わせてくれればいい、って時がありますよね。
そんな時はコマンドで一気にやってくれます。
現在のブランチに合わせて欲しい時は

git checkout --ours [ファイル名]

マージするブランチに合わせて欲しい時は

git checkout --theirs [ファイル名]

これで自動でどちらかのブランチに合わせてやってくれます。
あとはaddしてcommitしてしまえば無事マージ完了します。
 

最後に

例として出した複雑化したコンフリクトが実際に起きて、本当に何書いてるんだかわけわからなくなり、今回のコマンドを使い始めるきっかけになりました。
一気にどちらかのブランチの変更に合わせて欲しい時は本当に便利です。
無心でコマンド叩きまくって一気に解消したくなりますが、一応diffをちゃんと見てからコマンドを叩くようにしましょう…。

最近人気な記事