非日常デコレーション

一般 web developer の雑記です

Dead by Daylightにハマってます

今更ハマってます。

やりたいゲームリストにずっと眠っていたんですが、ようやく重い腰を上げてPS4を起動してダウンロード購入しました。

 

どんなゲームかというとリンクのような感じです。

https://www.google.co.jp/amp/s/s.gamespark.jp/article/2018/04/04/79743.amp.html

 

要するに1(キラー):4(サバイバー)のケイドロです。

今はサバイバー側ばかりやってます。

会社から帰ってから深夜までたっぷりやってます。めちゃくちゃ疲れます。(主に目が)

今月は連休多いしたっぷりやりたい(・∀・)ニヤニヤ

 

面白い点

・鬼に追われる時の緊張感が脳汁MAX

・ポイントを集めてキャラを強化していくのに使える。割と結構ヘビーにやらないと最大まで強化して存分に遊べないのでそれまで頑張らないといけないのもモチベーションにつながる。

・ひと試合で得られるポイントをいかに稼ぐかを考えながらプレイングしていくので、サバイバー側は協力を強いられるので、協力を求めやすい

・上手いプレイをするごとにポイントが多くもらえ、プレイヤーランクも上げやすくなるため上手い人と当たりやすくなってくる

 

不満な点

・ほとんど見ず知らずの他人とやるので、意思疎通がむずかしい

PS4だけなのか、ところどころ動きがかくつく

・ひと試合でやるムーヴにもっと多様性が欲しい。アイテムにもっと種類出せばいいかも?

 

とりあえず赤ランクと言われる上位ランクまでは行きたいですね

対人アクションにあまり自信はないですが。。

スプラトゥーンはAすら行けなかったしorz

 

プレイする後押しになった方の実況動画貼っておきます

http://sp.nicovideo.jp/watch/sm30189058

 

関係ないですが、スパイダーマンのゲームが話題なのでそっちもやりたかったり。時間が足りない(;´Д`)

 

 

ブログ再開します

大学院の研究発表~就活~入社とあり

ブログの更新をずっと(めんどくさがって)サボってきましたが

ふと見返すと、学習の記録を残すのって結構大事だと思い出したので

また再開しようと思います

このスタイルの書き方、自分だと読みやすいと感じたのでこのままで

長文きらいの人にはいいかもですが大人の文章が書けなくなりそう...

主に最近読んでるビジネス本とかエンタメ系コンテンツのレビューになるかと思います

しかし次回は早速学習とは関係の無い

今ハマってるゲームについて書く予定ですw

Ubuntu16.04のインストールからGTX1080/CUDA8.0RCでcaffeをビルド

最近は研究がDeepLearningよりになっています。ツールとしての使い方しかまだできていませんが。

Ubuntu16.04をクリーンインストール

isoイメージをCDに焼いたものをセットし、UEFIでROMの優先順位を一番上に置いて起動。最初はパーティション作成を手動でやってて、優先順位の作業を忘れてEFIブートパーティションが項目になくてマウントできず、ローダーの設定がうまくいかなかったため奔走した。結局手動はやめてフルインストールでやった。

必要最低限のもの

$ sudo apt-get install git 
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get install update
$ sudo apt-get install nvidia-367
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install freeglut3-dev

CUDAインストール

runfileのダウンロード

https://developer.nvidia.com/cuda-toolkit からCUDA8のDownloadリンクへ進み、 Linux/x86_64/Ubuntu/16.04/runfile[local] の順に選択しDownload[1.4GB]。この後これをhome直下に移動させておく。

pathの記述

$ gedit .bashrc

で最後の行に以下を追記。

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_ROOT=/usr/local/cuda

runfileの実行

1.Ctrl+Alt+F1で仮想コンソールに入る。 (最初はここで真っ黒になり何も表示されなかったためrunfileで入れるのを諦めて一旦debファイルからインストールしたが、CUDAサンプルの時点でエラーが出たのでその後runfileでインストールし直そうとしたら仮想コンソールに文字が表示されたのでそのまま以下を行った)

2.usernameとpasswordでloginする

3.以下のコマンドを打つ。なお、コンソールでは_"Shift + -"で入力できる。shコマンド後は0%からEnterでページ送りをする必要があるので注意。driverは古いけどyesを選び、シンボリックリンク作成にもyesを選ぶ。基本デフォルト設定を選べば大丈夫。

$ sudo init 3
$ chmod +x cuda_8.0.27_linux.run
$ sudo sh cuda_8.0.27_linux.run
$ sudo reboot

4.再起動後、login画面で Ctrl+Alt+F1で再度コンソールに入り、loginしたのち

$ sudo apt-get install nvidia-367 --reinstall
$ sudo reboot

5.動作確認

$ nvidia-smi

NVIDIA-SMI 367.27 Driver Version 367.27やGeForce GTX 1080が確認できる。

6.サンプル動作確認

$ cd NVIDIA_CUDA-8.0_Samples/5_Simulations/nbody
$ make
$ ./nbody -benchmark -numbodies=256000 -device=0

エラーが出ずに
"= 2900.647 single-precision GFLOP/s at 20 flops per interaction"まで出れば成功。

最初deb fileでインストールした時は
"error only devices available, 1 requested. existing"
といったエラーが出てきて、caffeのruntestでもコアダンプのエラー
"error == cudaSuccess(38 vs. 0) no CUDA-capable device is detected"
でもうダメだーと思っていたが、

sudo apt-get remove --purge nvidia-*
sudo rm -rf /usr/local/cuda
sudo rm -rf /usr/local/cuda-8.0

で一旦cudaをuninstallしてrunfileでやり直したらうまくいった。CUDAサンプルが動くか確認するのが大事。

Caffeのビルド

関連ライブラリのインストール

$ sudo apt-get install build-essential cmake git pkg-config
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install python-opencv
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev  
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
$ sudo apt-get install python-pip python-dev python-numpy python-scipy
$ sudo apt-get install libopencv-dev

caffeのビルドまで

cudnnを使う場合は以下。v2とかだとファイルの中身がフォルダに分かれていないので注意。(v2はSegNetとかでしか使わないけど)

$ cd ~/Downloads
$ mv cudnn-8.0-linux-x64-v5.0-ga.tgz cuda.tgz
$ tar zxvf cuda.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

find以降は名前解決のために必要。

$ git clone https://github.com/BVLC/caffe.git
$ cd caffe
$ cp Makefile.config.example Makefile.config

$ find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;
$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libhdf5_serial.so libhdf5.so
$ sudo ln -s libhdf5_serial_hl.so libhdf5_hl.so

$ cd ~/caffe
$ make all -j8
$ make test -j8
$ make runtest -j8

ちなみにSegNetのビルドはcudnnライブラリがv2でないとダメ。
よってv2も/usr/local/cudaのincludeとlib64に入れておく。(2つのバージョンのライブラリどちらも入れとくのは怖いが)
make runtestで2/4ができなかったが、SegNet自体は動いている。大丈夫なのかこれ。

コンパイル作業で丸1~2日はかけてしまった。もう環境構築はやりたくない。

参考

GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使う - Qiita

応用情報技術者試験受けてきたヨ

受験動機

建築という畑違いの分野から情報系に進んだため、情報系専門学生としての自信をつけるため。
基本情報から受けようか迷ったけど簡単に受かりそうだったのでAPに挑戦。

勉強期間

2月末に申し込んでから始めたので1ヶ月半ほど。
過去問は午前を6回分、午後を4回分解いた。

結果

午前の部 62/80 (77.5%)
午後の部 (不確定。部分点考慮せずに6割前半くらいかと)

簡単なレビュー

午後だけ。

問1.セキュリティ

  1. a.SSL b.ホール c.ゼロデイ
  2. d.イ(データサイズ) e.ア(エスケープ)
  3. (1)ユーザID/パスワード (2)IDSでポートを監視する。 (3)WAF
  4. ウ、オ

1.bの書き方と3.全体迷ったので最後に解きました。
3.は迷った末ダメダメな模様。

問3.アルゴリズム

1.ア×イ○ウ○エ○
2.(k-1)×N+j
3.カtemp[c]と1が等しい キ(temp[i]と0が等しい)and(eが3と等しい) クm[i]←1
4.そのマスが盤の左端か右端の列に属している場合。
5.(1)2 (2)for(iを2からpまで1ずつ増やす)

アルゴリズムは満点必須!と思いきやなぜか1.でミスってるワロエナイ(イは×じゃん)
5.は途中まで全然気づかなかったけど、最初に第1世代を与えてるんだからfor文は第2世代から計算しないと数が合わないですね。

問6.データベース

  1. a.販売時単価 b.← c.←
  2. d.UNION e.ST.店舗ID=SS.店舗ID f.ST.商品ID=SS.商品ID
  3. ORDER BY 売上年月(何故かここで途切れている)
  4. (1)α (2)(忘れたけど在庫の量が云々かんぬん書いた気がする)  

前半がそこそこあってるので良しとしよう。部分点ください。

問7.組込みシステム開発

1.(1)0.7 (2)ウ (3)エ
2.(1)タッチパネル (2)タッチされた座標
3.画面切替えフラグが1かどうか
4.ボタンの種別

簡単。

問8.情報システム開発

1.a.配送センタに商品の発送を指示する b.顧客に商品の発送を通知する
c.入金期限を過ぎている d.入金期限が過ぎていない
2.e.ア f.エ
3.決済番号取得、決済番号通知、コンビニ支払
4.入金が完了した購入商品の購入情報が取り消されてしまう。

簡単だったけどところどころ間違ってるぽい。

意識が朦朧としていたので肝心な文章を読み飛ばしていた気がする。
ネットワークとアーキテクチャが割と地雷な香りがしたので早々に見切りつけたら7,8が簡単すぎて救われた。
喉風邪で栄養剤飲んだら前夜寝られず徹夜で受験したのは内緒だゾ。

学習の振り返り

最初の1ヶ月:教本読みながら章末問題を解く。(この時点で全然身についていなかったけど、記号問題は雰囲気で解ける程度)
その後2週間:研究も忙しかったため教本2周目読んだ程度。    自分はノートに書き写しながら覚えるタイプなので体系的に整理。
テスト1週間前:過去問の演習。解説を読みながら復習にかなり時間をかけた気がする。間違えたところを完全に塞ぐのがやはり大事。

結局データベース・ネットワーク(セキュリティも?)が最後まで苦手で、SQL文とか通信におけるプロトコルあたりが定着していなかった。他の資格にセスペやデスペなどもあるらしいので、それらも勉強してみようと思う。それらを勉強してようやく一人前になれそう。

とりあえず試験を受けた方々はお疲れさまでした。

関数内で求めた複数の値を最小限のサイズの配列に格納する

動的な配列生成と関数が絡んだ問題が苦手なので自分用に記録。
約数、公約数を求めて必要最小限の配列に格納し、そのサイズを返す関数を作りました。

#include <iostream>
#include <queue>
using namespace std;

//約数の個数を求める
int f(int a, int*& temp){
    queue<int> qu;
    int n=0;
    for(int i=1; i<a+1; i++){
        if(a%i==0){
            qu.push(i);
            n++;
        }
    }
    
    temp = new int [n];
    
    for(int i=0; i<n; i++){
        temp[i]=qu.front();
        qu.pop();
    }
    return n;
}

//2数の公約数を求める
int Common(int x, int y, int*& com){
    int *x_div, *y_div;
    int x_num = f(x, x_div);
    int y_num = f(y, y_div);
    
    int n=0;
    queue<int> qu;
    
    for(int i=0; i<x_num; i++){
        for(int j=0; j<y_num; j++){
            if(x_div[i]<y_div[j]) break;
            if(x_div[i]==y_div[j]){
                qu.push(x_div[i]);
                n++;
            }
        }
    }
    com = new int [n];
    for(int i=0; i<n; i++){
        com[i]=qu.front();
        qu.pop();
    }
    return n;
}

int main(void){
    //約数を求める
    int *c;
    int c_num = f(24,c);
    //公約数を求める
    int *common;
    int num = Common(24,30,common);

}

配列を関数内でnewして、呼び出し元に変更内容を反映させるために仮引数にポインタの参照をとっています。
こんな使い方があったんですな。

自分で実装するとなると結構、めんどくさいですね。
c++は配列のサイズを変えるのだけでも一苦労。
リストを使えばいい話?

~その翌日~

動的な配列はvectorを使おうな

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//約数
vector<int> f(int n){
    vector<int> vec;
    for(int i=1; i*i<=n; i++){
        if(n%i==0){
            vec.push_back(i);
            if(i!=(n/i)){
                vec.push_back(n/i);
            }
        }
    }
    sort(vec.begin(), vec.end());
    return vec;
}

//最大公約数を求める
int Common(int m, int n){
    
    int k;
    if(m<n) swap(m,n);
    while(k!=0){
        k = m%n;
        m = n;
        n = k;
    }
    return m;
}

int main(void){
    
    vector<int> a = f(8);
    for(vector<int>::iterator it = a.begin(); it!=a.end(); ++it) cout << *it << endl;
    
    cout << Common(20, 8) << endl;

}

ようやくvectorの存在意義を理解しました(遅)
そもそもc++の標準ライブラリを知らなさすぎた
こんなに短くまとめられることに感動

おまけ

python楽すぎる

# coding: utf-8

#約数を求める
def f(n):
    result = []
    for i in range(1, n+1):
        if i*i>n:
            break
        if n%i==0:
            result.append(i)
            if i!=n/i:
                result.append(int(n/i))
    return sorted(result)
    
#最大公約数を求める
def Common(m, n):
    k=-1
    if m<n:
        m,n=n,m
    while(k!=0):
        k=m%n
        m=n
        n=k
    return m

print (f(30))
print (Common(20,8))

c++はいかに綺麗にかけるかの技量が問われるのに対して、pythonは書き方のスタイルがある程度固められているから書きやすいといった印象。
お手軽実装言語としてpythonがんばりたい。

Twitterの投稿画像を解析してランニング自動記録アプリを作ろう

先月より体力維持のためランニングを夜の習慣にしているのですが、その時にこのアプリを使っています。

ランニング・ウォーキング・声優 MAPLUS+ランニング

ランニング・ウォーキング・声優 MAPLUS+ランニング

  • Edia Co., Ltd.
  • ヘルスケア/フィットネス
  • 無料

高校の頃もランニングをしていたのですが、あの当時からするとGPSを計測して距離をお知らせしてくれるアプリなんて考えられなかったのでちょっと感動。

しかしこのアプリ、Twitterへの投稿ができないのでアプリの中でしか記録を利用できないのがちょっと残念。

というわけで画像認識から記録を自動的に取得できるようにしてアプリの外でも自在に記録を利用できるようにしてみようかなと、思いつきで決意しました。
(画像アップロードは手動の模様)

Twitterの画像を取得しよう

ライブラリが充実していると噂のpythonを遣います。
普段読んだことしかないのでめっちゃ苦戦しました…。
でも記述数少ないのはホントに楽。

#download.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from tweepy import *
import urllib
import sys
import os.path
import re


f = open('twikeys.txt')
data = f.read()
f.close()
lines = data.split('\n')


def get_oauth():
    consumer_key = lines[0]
    consumer_secret = lines[1]
    access_key = lines[2]
    access_secret = lines[3]
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    return auth

def download(url, path):
    fp = urllib.urlopen(url)
    local = open(path + re.sub(r'[:\\\/]', '_', url), 'wb');
    local.write(fp.read());
    local.close()
    fp.close()


auth = get_oauth()
api = API(auth)
s = api.get_status(*画像ツイートのstatusを取ってくる*)
try:
  j = 0
  for i in s.extended_entities['media']:
    print(i['media_url'])
    download(i['media_url'], "./saveImage/")
    j = j+1
except:
  print('exit')


#downloadしてきた画像をopenCVで解析

f:id:mokotixfemilar:20160221181513j:plain
画像の保存に成功しました。

画像をローカルに保存できたのはいいですが、実際にはweb上でアプリを動かす予定なので改良予定。
webの画像をopenCVで処理ってできるのかわかりませんが。 認識は一番簡単なテンプレートマッチングを使用する予定です。
何に記録を使うのかは未定。

各種勉強会まとめ

Go言語勉強会に参加してきたよ

オタクなのでTokyo 7th sistersで知ったDonutsという企業で、
Google社が独自に開発した言語であるGo言語に興味があったので勉強会に参加してきました。(Donuts社にも興味があって行ったのは言うまでもない)

オフィスの雰囲気がスタジオみたいでかっこいいです。
ちなみにゲームを開発しているエンジニアの方のお話では、
サーバ関連でGo言語を使用しているそうなのでゲーム系に行っても無駄にはならない技術のようです。

Githubで資料は公開されていますが、載せるのが憚られるのでGo言語チュートリアルサイトだけ置いておきます。

A Tour of Go

やったことは基本的にこのサイトで文法をスライドで解説しながら、所々で演習といったスタイルでした。
1問目はまだよかったものの、2問目がパッケージに含まれる関数の使い方がわからない初心者モロ出しの結果だったためとても惨めな思いをしました…といっても無力さを痛感させられて良い意味で悔しい思いをしました。
自分は未だにC++もUnityC#も覚束ないくらいのレベルで、非常に周りとの差に焦ったりしていますが、普段やっていることとのギャップがあるだけだと信じて堕落だけはしないように邁進していきたいです。

サイバーエージェント/DeNAのTech Talk

これらはゲーム開発における技術にどのようなものがあるのかを知りたくて、興味本位といってはアレですが参加してきました。DeNAのTech Conはジャンルを問わず色々なセッションがあったというのもあって、平日の昼からにもあっ変わらず数百人という規模でしたが、サイバーのGame Talk Nightは十数名でした。ちなみにDeNAは13~18時という長丁場で、サイバーの方は1時間程度だったためかなり駆け足で進んでいたように感じます。

DeNAのTech Conはノートのまとめをアップしました。参考にどうぞ。

qiita.com

ゲーム開発一本取ってみても、いろいろな技術が使われており、クライアント開発だけでは触れないような技術も多く出てきてパラダイムの変化が起こったような感覚に襲われます。とはいえ、クライアント開発で何かしら面白いものを作成した上の拡張でそれは行われるべきものなので、まずは1本ゲームをリリースするところから始めたいと思います。
ちなみに今制作しているゲームは音ゲーなのですが、なかなか苦戦しています…RPGくらいなら簡単に実装できそうなのになぁ…orz