【Unity】一晩でUnityを使ってゲーム作ってみた!

この記事は『 ョョョねこ Advent Calendar 2020 - Adventar 』の7日目の記事です。

ョョョねこ要素はあります!いや、逆にそれしかないです...

はじめに

皆さん、特にVRChatをやっているそこのあなた!Unity使ってますか?

うんうん、アバター改変で使ってる。そうだよねー、Unityでアバター改変できるのいいよね~

あ、あなたはワールド作成で使ってる。そうだねー、アセットストアで色んなアセット使って自分だけのワールド作るの素敵だよね~

...

……

ってちがーーーーーーーーーーーーーーーーーーう!!!

Unityでゲーム作ってますかーーーー???

VRChatやっていると忘れがちですが、Unityは ゲーム開発エンジン です。

決して、VRChat用のアバター改変ツールやワールド制作ツールとして使うことがメインのツールではない...いや、なかったはずです。少なくとも2017年ぐらいまでは...

とは言いつつ、実は私もUnityでちゃんと1つのゲームを作って公開したことはありませんでした。

そこで、今回は初のゲーム開発に挑戦しました!

期間は最近色々といそがしいので 半日 でできるものを作ることにしました。

題材決め

まずは何を作るかを決めなければなりません。

丁度ョョョねこアドベントカレンダーに登録してたので、その題材となりそうなものでかつ半日でできそうな何かを見つけることにしました。

ん…

ョョョねこかぁ...

あれ、「ョョョ」と「ねこ」って2つの単語に分かれるな

これ色々レパートリー作れるのでは...?

...

...

よし 「ョョョねこ」を使ったガチャ作ろう!!

いや、今考えればどうしてそうなった...

できたもの

f:id:sansuke05:20201208221114p:plain
ョョョねこガチャ

できたゲーム(?)のような何かはこちらのUnityRoomというところで一般公開しています。

ブラウザで遊べるのでぜひ遊んでSSR獲得目指してください!!(排出率1%)

unityroom.com

開発について

ここからは軽く制作過程について書いていきます。

ゲームの機能

機能としてはこんなものがあるかなーと考えました。

  • タイトル画面

  • ガチャ演出

  • ガチャ結果

操作は、タイトル画面のボタンを押すとガチャ演出が始まりガチャ結果がみえて、タイトルに戻るというシンプルなものにしました。

使ったもの

環境

  • Unity 2019.4.11f

ガチャ演出

フェードアウト演出は自作のフェードアウトするシェーダーを使って作りました。

ガチャ演出

今回一番凝ったのがガチャ演出です。

やってることはパーティクルをスケール変更してカメラに近づけるというアニメーションを作ってるだけではありますが、せっかくなので普段あまり使わないTimelineという機能を使ってこの部分を作成しました。

f:id:sansuke05:20201208223956p:plain
タイムラインはこんな感じ

これぐらいの規模のものを作るのであればアニメーション1つでも実現できますが、タイムラインを使うことでどのオブジェクトがどんな状態にあるということが視覚的に分かるので、1つのアニメーションでごりおすよりは作業しやすかったです。

ガチャシステム

ガチャのデータは GachaData というクラスを作成して、そこに表示する名前、レアリティ、レアリティのカラーなどの情報をプロパティとして持つようにしています。

今回はハードコーディングしてますが、ゲーム開始時にこのクラスを使ってデータを作成し、リストに保持するようにしています。

    private void InitGachaData()
    {
        _gachaDataList = new[]
        {
            new GachaData("ョ", "Normal", Color.blue),
            new GachaData("ねこ", "Normal", Color.blue),
            ... (略) ...
        };
    }

ガチャを引くボタンを押すと、以下のような手順でガチャ結果のデータを取得します。

  1. 乱数を使ってレアリティを決定

  2. ガチャデータのリストから該当するレアリティのデータのグループを取り出し

  3. 最後にそのデータグループから1つの結果データをランダムに取り出し

コードはこんな感じ

    private GachaData ChoseGachaResult()
    {
        var rarity = ChoseRarity();

        var gachaDataGroup = ChoseRarityDataGroup(rarity);
        
        return gachaDataGroup[Random.Range(0, gachaDataGroup.Count)];
    }

    private string ChoseRarity()
    {
        var randValue = Random.Range(0, 100);
        if (randValue == 0)
        {
            return "SSR";
        }
        if (randValue <= 2)
        {
            return "SR";
        }
        if (randValue <= 42)
        {
            return "Rea";
        }
        return "Normal";
    }

    private List<GachaData> ChoseRarityDataGroup(string rarity)
    {
        return _gachaDataList.Where(gachaData => gachaData.Rarity.Equals(rarity)).ToList();
    }

最後に

今回はこんなものを半日で作ってみましたが、ゲーム作り楽しいです!

作ってる最中にここもっと凝りたいなぁという部分や、追加でやりたいことも色々と出てきました。

せっかくガチャの演出やシステムを作ったので、今回の一発ネタだけで終わらせずに今後ゲームを作る際にどこかでつかえたらなと考えています。

そんな感じで、いかがでしたか? 最後まで読んでいただきありがとうございました!

もしいいと思ったら、 高評価とチャンネル登録よろしくおねがいします! ブックマークやツイートいただけると励みになります。

VRChatで学会発表ワールドを製作した時の記録

この記事は VRChat Advent Calender 2019 の17日目の記事です。

はじめに

2019年12月14日に バーチャル学会2019 が開催されました。

私はこのバーチャル学会の運営としてポスター発表用会場のワールド製作を担当しました。

この記事では、私がVRChatでイベントで使用する会場製作がどのようにして行われてきたのかの経緯や、考えたこと、感想などを書き綴っていこうと思います。

ワールド製作担当になるまでの経緯

今回私がバーチャル学会の会場製作をすることになったのは、昨年2018年11月に開催したVRChat初(多分)のライトニングトーク会を主催したのをきっかけに、今回の学会を主催されたファルコさんに声をかけられたのがきっかけでした。

当時は私も学生で、軽いノリで「やってみるかー」という感じで引き受けたのですが、それから1年弱音沙汰のない状況が続きました。

事が動いたのは、今年の10月頃になってからで、そこから本格的にやろうという感じになって企画を考えていきました。

その時点で私は社会人になっており、12月開催を初めの頃から予定していて期間も短かったため、これ今の状況でできるのかなぁとその頃は結構心配していました。

ただ、何度か話し合ううちに、誘われた頃と自分の状況も変わったことを伝え、今回は初回開催で期間も短いことも考慮して、最低限ポスター発表に必要なものがそろったワールドを作ろうという方針で進めることになりました。

ワールド制作の準備

まず、ワールドをどんなコンセプトで作成するか、最低限ワールドに必要なものは何かという部分から考えていくことにしました。(同時並行で、ワールドに設置するポスターのサイズや見やすいフォント、サイズなどのフォーマット決めも行なっていました。)

ワールドコンセプトに関しては、実際にリアルの学会がどんな会場で行われているかの調査なども行いましたが、Blenderでゴリゴリワールドのモデルを作れる人はいませんでしたし、AssetStoreでそれっぽいものを探す時間も中々取れない状況だったのであまり参考にせず、ひとまずUnityのデフォルトの素材でプロトタイプを作って、そこから余裕があれば色々追加していこうという事になりました。(まぁ結局余裕なかったですがw)

ただ、ワールドを見にくる人の利便性や、発表者が発表しやすいワールドにしようというところは最低限曲げずに作ろうという事になり、発表者の発表のしやすい位置を考えたり、小さいアバターの人でも見上げてポスターを見なくていいように段差を準備しようといった事は最初の頃から検討していました。

f:id:sansuke05:20191218224027p:plain
初期の頃考えたワールドに設置する段差の案

そういった話し合いを元に、ひとまず私やファルコさんで簡単なワールドのラフスケッチを書いて、ワールドのイメージを固めていきました。

f:id:sansuke05:20191218224652p:plain
私の描いたワールドのラフスケッチ

ワールドのプロトタイプの作成とワールドのアップデート

そこから、まずは会場に貼るポスターの枚数や大きさなどの情報を元にUnity上で会場のプロトタイプワールドの作成を行いました。

f:id:sansuke05:20191218230039p:plain
プロトタイピングしたワールド

そこからは、毎週行われているミーティングで運営メンバーに見てもらい、改善点やこんなものもあるといいよねといった要素をあげてもらって、毎週少しずつワールドのアップデートを行なっていきました。

フィードバックをもらっていく中で、最初はこんな感じでいいだろうなぁと思っていた事も、実際にワールドに入って触ってみるとやっぱり別の方法がいいんじゃないかという事も出てきて中々試行錯誤が大変でした。

ただ、個人的に会場は部屋というより、もっと開放感のある会場にしたかったので、屋根を外して空を見えるようにしたのと、マテリアルを木の木目のあるものにして教室っぽさを出した部分はこだわりポイントだったりします。

発表者のポスターと展示物配置

ワールドがある程度出来上がってきた段階で、提出されてきたポスターと展示物の設置を行なっていきました。

この段階になるとほぼ作業の状態かと思っていたのですが、配信の方でポスターサイズの問題などから別部屋を作ってそちらで配信を行おうという変更があったり、ポスターや展示物の方も変更が何度か入ったりと思った以上に他のタスクも入ってきて忙しくなっていきました。

リハーサルと最終調整

予定していたワールドがほぼ完成に近づいたところで、学会1週間前にポスター発表をする方たちと配信担当のおきゅたんさんと運営で当日のリハーサルを行いました。

すると、本番の流れを追っていく中でワールドの課題がまだあることが見えてきたり、展示物の不具合やポスターの入れ替えの必要が出てきたりと、調整が必要な部分がかなり見つかり、結局本番当日まで結構バタバタしていました。

本番

当日朝方に最終調整のタスクもなんとか終わり、昼頃に最終確認をしてなんとか本番に望むことができました。

その後、バーチャル学会本番も(途中トラブルはあったものの)大盛況のうちに無事終えることができました。

f:id:sansuke05:20191219011620p:plain

感想と課題

色々と大変なことはありましたが、VRで学会やるにはどうすればいいかみんなで話し合ったり、ワールド制作自体も楽しくやらせていただいて、最終的にバーチャル学会2019は沢山の人に参加していただけた素晴らしいイベントになって自分としてはかなり満足しています。

ただ、やっぱり課題もまだまだ沢山あるなとは思っています。

ワールド制作に関しても、もう少しスケジュールに余裕を持って制作を終え、リハーサルもまだ早めに行えていれば調整等に割く時間ももっと余裕ができたんじゃないかなどなど...

来年2020年にもまた開催する予定なので、次回はそんな課題を見直して、さらにグレードアップしたバーチャル学会が開催できればいいなと思っています。

謝辞

最後に、バーチャル学会を企画してリーダーとして引っ張って下さったファルコさん、運営として一緒に頑張って下さったテトラリアンさん、signsさん、ハルさん、にしあかねさん、lcamuさん、はつぇちゃん、配信をして下さったおきゅたんさん、基調講演をして下さった皆様、ポスター発表をして下さった皆様、そしてバーチャル学会に参加下さった皆様に、この場を借りて感謝致します。ありがとうございました。

【python】睡眠時間管理するプログラム作った話

この記事は Aizu Advent Calendar 2017 の11日目の記事です

あぶすとらくと

pythonを使って日々の睡眠時間と起床時間を記録してグラフ化するシステムを作ってみたよ!

なぜ作ったの?

理由としては、

  • ここ数ヶ月ぐらい3時から4時就寝の生活が続いており、睡眠時間が死んでるのと単位がやばいので何とかしないとと思っていた

  • 睡眠時間を見える化して自分にプレッシャーを与えると結構いいらしい

  • 自分の使ってる睡眠管理アプリが2度寝した時に正確に記録できない

ということでじゃ自分で睡眠時間を記録できるもの作っちゃおうと思い立ち作ってみました

機能

具体的にはこんな機能を作成します

  • 標準入力からその日の就寝時間と起床時間を受け取る

  • 「8時30分」や「0:30」などどんなフォーマットで入力が来ても時間を取得できるようにする

  • 取得した就寝時間と起床時間を日付とともにcsvファイルに記録する

  • csvファイルから就寝時間と起床時間の推移をグラフイメージにプロットする

使ったもの

環境

開発言語

主なライブラリ

  • datetime (日付と時間のデータを扱うため)

  • pandas (データのcsvファイルへの読み書き)

  • matplotlib (グラフイメージ作成)

など

準備

pipでpandas,matplotlibライブラリをインストールしておく

実装

入力から時間を取得する関数

import re

ERROR = 0

# テキストから時間を抽出
def get_time(text):
    m = re.findall('[\d]+', text)
    if len(m) == 2:
        return m;

    return [ERROR,'何時かわかんないよ〜\nもう一度入力し直してね']

正規表現を使って文字列から数字を抽出します

import re正規表現を使うモジュールを読み込み、文字列の中のパターンとマッチする部分をすべてリストとして返すfindall関数を呼びます

引数[\d]+textから1つ以上の連続した数字を検出します

時、分をリストの要素として受け取るため、取得したリストの長さが2以外ならエラーを返します

csvファイルに日付、就寝時間、起床時間を記録する関数

import os
import pandas as pd
from datetime import date

CSV_PATH = "./timedata.csv"
today = date.today()

# csvファイルに時間を記録
def write_csv(sleep_time, wakeup_time):
    
    if not os.path.exists(CSV_PATH):
        # データフレームを作成
        df = pd.DataFrame(
            [[today, sleep_time, wakeup_time]],
            columns=['Date', 'Sleep_Time', 'Wake_Up_time']
            )
        df.to_csv(CSV_PATH, index=False, encoding="utf-8")
    else:
        w = pd.DataFrame([[today, sleep_time, wakeup_time]])
        w.to_csv(CSV_PATH, index=False, encoding="utf-8", mode='a', header=False)

最初にdatetimeモジュールのdate.today()で記録日の日付を取得しておきます

csvファイルが存在していない場合は新規作成します

その場合、データフレームを作成し、列のindexとして日付(Date)、就寝時間(Sleep_Time)、起床時間(Wake_Up_time)を指定し、to_csv関数でデータフレームをcsvファイルとして書き込みます

既にcsvファイルがあれば、データフレームに取得した日付、就寝時間、起床時間のデータを入れ、csvファイルに追記します

追記する場合はオプションでmode='a' header=Falseを追加します

csvファイルからグラフイメージを作成する関数

import pandas as pd
import matplotlib.pyplot as plt

CSV_PATH = "./timedata.csv"

# グラフイメージをプロット
def plot_graph():
    csv = pd.read_csv(CSV_PATH)
    plt.plot(csv.Date, csv.Sleep_Time, label='sleep time')
    plt.plot(csv.Date, csv.Wake_Up_time, label='wake up time')

    plt.legend()
    plt.savefig("./graph.png")

read_csv関数でcsvファイルをデータフレームとして読み込み、plot関数のx軸に日付、y軸に就寝時間と起床時間を指定し、分かりやすいように凡例名(label)を指定しました

余談ですが、このplot関数に日付を入れる時にdatetimeオブジェクトを作成して指定するとなぜか日付が小数値で出力されるという現象が起こり、半日ぐらいハマってました...

最終的にcsvの日付をとりあえず突っ込んでみたらちゃんと表示されてるし、なぜだろう...

話を戻して、次のlegend関数でグラフの凡例をつけています

最後にsavefig関数でグラフイメージを保存します

全体の実装

import os
from datetime import date
import datetime
import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

CSV_PATH = "./timedata.csv"
ERROR = 0

today = date.today()


# csvファイルに時間を記録
def write_csv(sleep_time, wakeup_time):
    
    if not os.path.exists(CSV_PATH):
        # データフレームを作成
        df = pd.DataFrame(
            [[today, sleep_time, wakeup_time]],
            columns=['Date', 'Sleep_Time', 'Wake_Up_time']
            )
        df.to_csv(CSV_PATH, index=False, encoding="utf-8")
    else:
        w = pd.DataFrame([[today, sleep_time, wakeup_time]])
        w.to_csv(CSV_PATH, index=False, encoding="utf-8", mode='a', header=False)


# テキストから時間を抽出
def get_time(text):
    m = re.findall('[\d]+', text)
    if len(m) == 2:
        return m;

    return [ERROR,'何時かわかんないよ〜\nもう一度入力し直してね']


# グラフイメージをプロット
def plot_graph():
    csv = pd.read_csv(CSV_PATH)
    plt.plot(csv.Date, csv.Sleep_Time, label='sleep time')
    plt.plot(csv.Date, csv.Wake_Up_time, label='wake up time')

    plt.legend()
    plt.savefig("./graph.png")


if __name__ == '__main__':
    
    count = 0
    sleep_time = datetime.datetime.now()
    wakeup_time = datetime.datetime.now()

    while count < 2:
        if count == 0:
            print('昨日の就寝時間を入力してください')
            input_str = str(input())
            time = get_time(input_str)
        else:
            print('今日の起床時間を入力してください')
            input_str = str(input())
            time = get_time(input_str)

        if not time[0]:
            print(time[1])
            continue

        #時間を整形
        if len(time[0]) == 1:
            time[0] = '0' + time[0]
        if len(time[1]) == 1:
            time[1] = '0' + time[1]

        if count == 0:
            str_time = time[0] + ':' + time[1] + ':00'
            sleep_time = datetime.datetime.strptime(str_time, '%H:%M:%S')
            sleep_time = sleep_time.time()
        else:
            str_time = time[0] + ':' + time[1] + ':00'
            wakeup_time = datetime.datetime.strptime(str_time, '%H:%M:%S')
            wakeup_time = wakeup_time.time()
    
        count+=1
    
    write_csv(sleep_time, wakeup_time)
    plot_graph()

全体として上記のような実装になっています

mainのコードでは主に就寝時間と起床時間の入力を施し、時間を取得してフォーマットを整形ののちcsvファイルにデータを保存する関数とグラフイメージを作成する関数を呼ぶという流れになっています

結果

Date Sleep_Time Wake_Up_time
2017-12-04 03:27:00 09:10:00
2017-12-05 02:44:00 08:24:00
2017-12-06 03:48:00 09:14:00
2017-12-07 04:44:00 09:55:00

f:id:sansuke05:20171207143314p:plain

現状ひどいですね...😅😅

おわりに

pandasやmatplotlibはデータ解析用のライブラリで今回は触りぐらいしか使ってませんが、調べてみるとかなり奥が深かったです

現状のプログラムだと多分飽きて使わなくなるだろうと思うので、現在開発中のTwitter Botからリプがくるようにするようなシステムを考案中です

カムバック!!朝型生活!!

参考にしたサイト

qiita.com

qiita.com

qiita.com

【fish】ターミナル環境をかっこよくしてみた話

こないだターミナルの環境を色々と変更して自分的にけっこういい感じになったので紹介

具体的にはMacにiTermとfishとfishermanを導入していろいろやったって感じです

きっかけ

大学の勉強会で後輩の子のMacをさわらせてもらったときに自分のデフォルトのターミナルと全然違ったので「すげー!俺もこんないい感じのターミナル使いてー!」ってなったのがきっかけです

その後輩の子から、iTermっていう端末エミュレータ使っているということを聞き、早速導入してみることに

完成形

最終的にこんな感じになるのを目指します

iTermって何?

Macのデフォルトのターミナルは標準的な事は出来るものの少し物足りないことがあります。そんな時にオススメなのがiTerm。 画面の色を変えるのは勿論、色々便利な機能が盛り沢山です。

MacのターミナルアプリにはiTermがオススメ - Qiita より引用

らしいです

まぁ、デフォのターミナルよりいい感じにできるよって感じの端末エミュレータですかね

iTermの導入

まずは iTerm なるものをここからインストールします

f:id:sansuke05:20171103105318p:plain

ダウンロードして来たiTerm.appを開くとこんな画面が出るのでMove to Applications Folderを選択

これでとりあえずiTermが使えるようになりますが、デフォだとあれなので設定を変えます

iTerm2 -> Preference -> Profiles -> Colors -> Color Presets でカラースキームを設定することができます

デフォルトでもいくつか用意されていますが、Visit Online Galleryでカラースキームが配布されているページから取ってくることもできます

自分は今のとこデフォのTango Darkを使っています

f:id:sansuke05:20171103111627p:plain

とりあえず、ここまででこんな感じになりました。

ん、あんま変わってないって?

これからですよこれから

fishの導入

iTermと一緒にzshを入れようという記事は結構出てくるのですが、自分のzshのイメージが初期設定が色々めんどくさそうだしちょっとzsh使うのはなーと思ってたので、zshの代わりになりそうなshellを探したところfishなるshellがあるらしい

なんと、fishはとりあえず入れるだけでかなり便利な機能が使えるらしくプラグインも簡単に入れられるそうなので、これは使うしか!と思って入れてみました

インストール

homebrewでインストールします

$ brew install fish
$ fish -v
fish, version 2.6.0

これでインストールできたのでデフォルトシェルを変更します

$ sudo vim /etc/shells   #  末尾に /usr/local/bin/fish を追加
$ chsh -s /usr/local/bin/fish 

iTermを再起動すると色々変わってると思います。

設定ファイルはbashzshなどとは違い、~/.config/fish/config.fish のパスになります

Fishermanの導入

fishにはoh-my-fishというfishのパッケージ管理フレームワークがあるのですが、古いとか著作権問題がどーのこーので停止してたとか結構ディスられてました

そこで、Fishermanというプラグインマネージャーがいいということだったので、Fishermanを導入してみることに(なんと日本語対応のクイックスタートガイドもあるとのこと)

インストール

curlで以下を叩く

$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman
$ fisher -v
fisherman version 2.13.2 ~/.config/fish/functions/fisher.fish

テーマの変更

Fishermanからテーマをインストールします

オススメのプラグイン導入とかも書きたいですが、今回は見た目をかっこよくすることが目的なのでそっちの方は省きます。

今回はagnostrというテーマをインストールしました

元々oh-my-fishのテーマらしいのでomf/をつけて、テーマ名の前にtheme-を書きます

$ fisher omf/theme-agnoster

これでテーマが変更されましたが、記号が文字化けしてしまいます

これを解決するためPowerline fontsをインストールします

$ git clone https://github.com/powerline/fonts.git
$ cd fonts/
$ ./install.sh

インストールしたフォントをiTerm2に設定します

設定画面のフォント名を以下のように変更します

f:id:sansuke05:20171103125445p:plain

フォントサイズは自由ですが、自分は13ptにしています

コマンドのカラーを変更する

最後にコマンドのカラーを変更します

fishではこういった設定は

$ fish_config

でローカル環境でサーバが起動しWebブラウザから設定できます

f:id:sansuke05:20171103130203p:plain

現在の自分の環境では、fish defaultからパスの色を緑、コメントの色をオレンジに設定して使っています

完成

これで、上で紹介したような見た目になったかと思います。

iTerm、fish、Fishermanには他にも便利な機能やカスタマイズができますので、ぜひ自分のお気に入りのターミナル環境を構築してみてください

--- 追記 ---

なんかデフォルトシェルをfishにしてしまうとdockerとか使うときにまずいという話を聞いたので、デフォルトシェルはbashのままでbashからfishを起動してくれる方法も追記しておきます。

まず、デフォルトシェルをbashに戻します。

$ chsh -s /bin/bash

そして、.bashrcに以下の1行を追記すればiTerm起動時にbashからfishを起動してくれます。

exec fish

参考

qiita.com

qiita.com

jnst.hateblo.jp

fishの設定ファイルなどはGitHubの方からも見れます。

Mashup Awards 2017 会津予選に参加してきました。

「ブログを書くまでがハッカソンです!」

あれ、なんか1ヶ月ちょっと前にもおんなじようなことをmi○iさんで聞いたような…

まぁそれはさておき、10月29日から30日の2日間に会津大学で開催された Mashup Awards 2017 の会津予選に参加してきました。

大学1年生の頃に初参加して毎年参加してて、これが3回目の参加でした。

結論から言うと、特に賞などはもらえませんでしたが、とても有意義なイベントだったんじゃないかなと思います。

1日目

イデア決めからのチームビルディング

初日は、まず各企業の方から提供される技術説明と、アイデア出し、チームビルディング、ハック開始というふうに進行していきました。

私は、今回は特に作りたいものやチームも最初から決まっているわけではなかったので、その場でアイデアを考えてチームビルディングまで行いました。

チームは後輩の2年生2人と作ることになったのですが、その時考えていたアイデアがもう既に実現されていそうなものだったのでチームでアイデアの練り直しを行い、自分が雨の日に歩きだったりで大変という思いがあったので、最終的に大学内でUberみたいなサービスを作ろうというアイデアに決まりました。

役割分担は、自分がAndroidが書けて、2年生2人がサーバーができるということだったので、自分がクライアントで他2人がサーバーサイドの開発という感じでとりあえず開発に取りかかりました。

そう…この時もっとシステムの要件を考えておけばと後々後悔することになろうとは知らずに…

ハック

とりあえずクライアントで、今回のもっともアピールできるであろう、ドライバーのリストを表示して載せて欲しい人にリクエストを送るところをまず実装しようと作業に取りかかりました。

その頃、サーバーサイドの方は開発言語をPHPにして、環境構築をしていたのですが、結構手間取っていたので、先にモックをいくつか完成させてから一緒にテストできるぐらいの感じになるかなーとこの時は考えていました。

しかし、サーバーの環境構築が終わり、いざAPIの仕様を考えてみると、現在位置情報の取得やログイン処理用の画面など、必要な機能がどんどんインフレしていき、クライアントの方で開発が追いつかなくなるんじゃないかという感じになって1日目を終えることになりました。

2日目

2日目は15時半まで開発を行い、それから各チームのプレゼン、プロダクトの体験会、結果発表、懇親会という感じの進行でした。

開発の方は、前日なんとかドライバーの登録画面まで作成していましたが、現在位置情報がうまく取得できずに悪戦苦闘を強いられていました。

サーバーサイドのAPIやデータベースの方は、環境構築こそ大変だったものの、結構順調に作成しているようで、昨日とは打って変わってクライアントの方の進捗をかなり心配されていました。

最終的に、トップ画面、ドライバー情報の取得、ドライバの出発情報登録(モック)、会員登録(モック)というところまで作成しました。本当は乗りたい!というボタンを押して通知がいくという、一番会場で「おー!」となりそうなとこを作りたかったですが、ボタンが反応しないバグが出たり、通知方法の作成が大変だったりして、そこまで完成に至りませんでした。

感想

今回のハッカソンは、短期間でチーム開発する上で色々と課題が出て、それを意識するいい機会になったなと思います。

具体的には

  • 開発の前に仕様をしっかりチームメンバーが共有する
  • 時間がないので、何を優先的に作るのかといった優先順位をつける(今回だとプレゼンでいい感じになりそうな乗りたいボタンからの通知の実装)
  • 役割を超えた円滑なコミュニケーション(今回はサーバーサイド同士はよく話せていたが、クライアントとサーバーサイドの意思疎通があまりできていなかった)

などなど

今後、学内でチーム開発するプロジェクトも控えているので、今回学んだことを是非とも生かしていけるようにしていきたいと思います。

そして何より、2日間大変だったけど、とても楽しかった!

来年ももし時間があったらまた参加したいと思います!

【python】ドールのTwitterBotを作った話 1

ドールはいいぞ!

うちにはドールが2人います。

そのうちの1人、そらという名前の身長50cmのドールがいます。

f:id:sansuke05:20171011002635j:plain

1年と半年ほど前にお迎えしてからというもの、日々可愛がっているのですが、なんか普通にTwitterに写真上げるだけだと面白くないな〜と最近少し思う節があって、そらをもっと知ってもらって写真で癒しを届けられるいい方法ないかな〜と思っていました。

そんな時、丁度Twitterで近頃絡んでる人たちが自分の創作キャラでTwitter Botを作っているというのを知って、「これドールのそらでやってみたら面白いんじゃね?」と思い立ち、うちのそらでTwitter Botを作ることにしました。

どんなBotにするか?

まず、Botのそらにどんなことをさせたいかを考えてみました。

とりあえず、定期的な日々のつぶやきは欲しいのと、リプライ、TLへの反応などのTwitterにいる標準的なキャラクターBotの機能は欲しいなと。

後は、目的が「知ってもらう」「癒しを届ける」なので、定期的な写真ツイートとリプライと一緒に写真も届けられるといいなという感じになりました。

とりあえずコード書いてツイートしてみる

どんなBotにするか決まったとこで、とりあえずプログラムの方からツイートするまでのコードを実装してみました。

言語はPythonでやりました。

使ったもの

準備

Twitter Appにアクセスして以下4つのキーを取得しておきます。

  • Consumer Key
  • Consumer Secret
  • Access Token
  • Access Token Secret

また、pipでtwitter-pythonライブラリを導入しておきます。

$ pip install twitter

コーディング

とりあえずsora.pyという名前で作りました。 APIキーは./system/conf.pyから呼び出しています。

import twitter
from system import conf

auth = twitter.OAuth(
    consumer_key=conf.CONSUMER_KEY,
    consumer_secret=conf.CONSUMER_SECRET,
    token=conf.ACCESS_TOKEN_KEY,
    token_secret=conf.ACCESS_TOKEN_SECRET,
    )

t = twitter.Twitter(auth=auth)

def tweet():
    status = "this is test tweet" #投稿するツイート
    print(status)

    f = t.statuses.update(status=status)
    print(f)

tweet()

./system/conf.py

# -*- coding: utf-8 -*-

CONSUMER_KEY = ' xxxx '
CONSUMER_SECRET = ' xxxx '
ACCESS_TOKEN_KEY = ' xxxx '
ACCESS_TOKEN_SECRET = ' xxxx '

コードはこれだけです。ライブラリありがたや…

結果

こんな感じでツイートしてくれました。

これから

とりあえず長くなるのもあれなので続きは別記事で書こうかなと思います。

参考

以下のサイトを参考にさせてもらいました。

mhr380.hatenablog.com

qiita.com

また、ソースコードの方もGithubの方で公開しています。ソースコードはMITライセンスです。

mixi の git challenge に参加してきました。

「Blog に書くまでが git challenge です」

ということらしいので、mixiで開催された git challenge に参加してきましたので感想など書こうと思います

参加に到るまで

git challengeを知ったのは大学で行われたインターンシップ説明会に来られていたmixiの方から、git challengeっていうイベントやってるよと紹介されたのがきっかけでした

最初は、そんなのあるんだーぐらいで考えてましたが、丁度実家から東京に戻ってくる時期と被ってたので、じゃぁ参加してみるかと締め切り前日に決めて応募しました(前日まで忘れてたので間に合ってよかった…)

git challenge 当日

mixi本社に11時集合でしたが、なぜか前日Streaming APIいじろうとか思い立って深夜までいじってたせいで渋谷駅にギリギリ到着&駅で迷うというハプニングで15分遅れでの参加でした

まずはmixi社内でどうgitが使われているかの説明があった後、git challengeのチュートリアルがありました

その後、ランチをとって、いよいよワークが始まりました

問題は、難易度ごとに星の数で表されており、★1つから★5つ(★6まであったかも?)の問題まで用意されていました

普段add,commit,pushぐらいしかやってない人なので、相方の人とも話し合ってとりあえず★1つの奇数問題から挑戦しました

が、まず1問目からハマりました

あまり詳しいことは書けませんが、fast forwardでマージしてはいけないことに気づかず悩んで時間を取られてしましました

その他にも、コミット履歴を変更する問題や、コミットを1対1対応させる問題などを解き、最終的に自分は4問ぐらいしか解くことができませんでしたが、相方の方がかなり解いてくださって、途中経過で1位になることもあったので、相方の方には本当に感謝です

そして、あっという間にワークの方も終了し、問題解説となりました

解説聞いてて、え、あれ引っ掛けだったの?とかこのコマンド知らないなぁというものが多くあり、Git奥が深いなぁと思いました

その後懇親会があり終了という形でした

感想

ざっと1日どんなことがあったか書いてみました

事前に公開されていた練習問題もやっていたせいか、似たような問題を解けるようになってたのはよかったなと思いました

しかし、まだまだGitの知識が浅く、もっと勉強しないとなぁということを痛感した一日でもありました

また、昼休みや懇親会で、他大学生やmixiの若手社員の方と話ができ、就活のことや、他大学生がどんなことやってるのか、好きな技術の話、そして、mixi内での開発がどのように行われているのかなど、普段聞けないような貴重な話も聞くことができ、とても為になったし楽しかったです

中々に濃厚な一日で、参加してよかったなと心から思えるイベントでした