DUVER Tips

Unity,Unreal Engine,XR関係のblog

Ruby on Rails忘備録

RubyonRailsを始めたのでその忘備録

Rubyを始めましたが、学習していく過程の個人のメモになります。

プロジェクトの作成

プロジェクトの作成はコマンドで簡単に行う事ができます

ruby new hogehoge

hogehogeの部分はプロジェクト名になります

ruby g controller home top

コントローラーとホームファイル、top.html.rbファイルを自動で作成してくれます。

Rubyでは、Ruby on Railsの設計思想に基づいて、プログラムを作成していきます。

主に、コントローラー、アクション、ルーティングという三つがあります。

ルーティング

URL コントローラー アクションの対応表のこと

コントローラーの役割

コントローラーを介してviewを返す。
関数や変数の記述はここに

ビューの役割

htmlファイルを表示します

全体の流れはブラウザールーティングーコントローラーービュー
という流れになります。

ページ内リンクの作成

ページ内リンクを作成する場合は通常のhtmlと同様,aタグのリンクを作成して
更にルーティングのファイルに記述を追加する必要があります.

<a href="/">

//以下ルーティングファイル
get "/"=>"home#top"

<% link_to("About","/about") %>

第一引数に表示する文字,第二引数にURLを記述する.

DB操作

新しいテーブルの作成。下記はUseテーブルの作成.

コマンドでマイグレーションファイルを作成しデータベースに変更を反映する.

rails g model User name:string email:string
rails db:migrate
データの追加
rails console 
user = User.new(name:"name" email:"emailaddress");
バリデーション

このままだと、空の状態でデータベースを作成できてしまうので
バリデーションと呼ばれる、データに制限を持たせることができる。

テーブルの作成した際に、Userクラスが作成されているので、その中でバリデーションを設定することができる
以下の記述は同じ値を登録できないようにするためのもの。
presenceを追加すると空の値を入力不可になる。

class User < ApplicationRecord
  validates:email,{uniqueness:true}
 validates :email, {presence: true, uniqueness: true}
end

Rails console

rails consoleコマンドでレイルズのコンソールを起動することができる

ユーザー投稿機能の作成

find_byメソッド

データベースのIDから特定のidを拾ってくることができる.

post=Post.find_by(id:3)

find_byメソッドを用いて投稿の一覧ページを作る

get "post/:id"=>"post#show"

//Controller側
def show
  @post=Post.find_by(id: params[:id])
end

//show.html側
<div class="sample">
  <%=post.content%>
<div class="Hoge">
  <%= post.created_at %>
</div>
</div>
<% @posts.each do |post| %>
 <div class="post-item">
    <% link_to(post.content,"/post/#{post.id}") %>
</div>
<%end%>

viewからデータベースに書き込み投稿をする

form_tagメソッドを利用することでデータを投稿したりできる.

指定したURLはルーティングファイルのpostのurl

<%=form_tag("post/create") do %>
<textarea name="content"></textarea>
<input type="submit" value="投稿">
<%end%>
Redirectの仕組み

指定のURLにリダイレクトされる.
viewを作る必要がなくなる.

def create
@post=Post.new(content:params[:content])
@post.save
redirect_to("/posts/index")
end

Unity AR系の記事まとめ

AR系の記事のまとめ

Web AR

IOS限定になりますが、WEB ARの記事です。
いちいちアプリケーションをインストールする必要がないので便利ですね。
丁寧にまとまっていて非常に勉強になりました。

qiita.com

8th Wall

こちらもWEB ARの記事です。
こちらはOSが問わないのと、画像トラッキングができます。
記事を見る感じ精度もかなり高そうです
note.mu

ARで空間共有記事

Firebaseで簡単にARで空間共有を使用というスライドです
とてもわかりやすい・・
Placenoteで簡単共有AR - Speaker Deck

Unity ARkit Plugin

UnityでARkitを使って開発する方法です。
こちらの記事が参考になりました。

qiita.com

ue4 LevelBlueprintのBaseクラスをC++で作成する

LevelBPのベースクラスをC++で作成します

レベル間で共通の処理をまとめようとしたとき,レベルBPのベースクラスを作成しようとして
ちょっとはまったのでその時のメモになります。

やり方

LEVEL BPのベースクラスはこちらから設定できます。
Level BPを開いて、クラス設定、クラスオプションの親クラスで設定してあげます。

f:id:kiyotakay96:20181105150311p:plain

ここに自分で作成したベースクラスを登録してあげれば大丈夫です。

継承するクラスは
ALevelScriptActor クラスになります

//例
class HogeHoge_API ALevelScriptBase : public ALevelScriptActor
{

}

ここにレベル感の共通処理を書いてあげればlevel BPで呼び出す事が出来ます。

短いですが以上になります。

ue4 C++ 覚え書き

ue4 C++の覚え書き

ue4C++を始めたので、
主に個人のメモとして使用していきたいと思います。

  • ue4 C++の覚え書き
  • 変数定義
    • FVector
    • FTransform
    • enum
  • 関数
    • OpenLevel
    • BPのTimerをC++で利用する
    • GameModeの取得
    • PlayerPawnの取得
    • Logの出力

変数定義

FVector

UnityのVector3にあたるものです。
以下のように使用します。

   FVector pos= FVector(0,0,0); 
続きを読む

TCP/IPのメモ書き

最初に断っておくと、個人の勉強用のメモ書きになります。

Unitを使用してネットワークゲームを作成しようと思い立ったのですが
そもそも、TCP/IP プロトコルってなんだ?
とネットワークの仕組みが全く分かっていなかったため、勉強を始めた次第です。
用語の解説がメインになってしまっていますがご了承ください。

そもそもプロトコルってなんなの?

プロトコル

相手とのやり取りのための通信規約のこと。

送信するデータとは別に、適切にデータ伝送を行うための管理、制御用の情報必要。
データや管理情報をどのような形で伝送するのか、送受する際の手順を定めるのがプロトコル

TCP/IP Transmission Control Protocol /Internet Protcio

ネットワーク通信を行うために制定されたプロトコルの一種でもともとインターネットの
通信のために設計されたもの。

役割としては、多数の組織のネットワークを相互に接続し、個々の機器間で自由にデータ交換できるようにする事。

もう少し詳しく役割を追っていきましょう。

IP Internet Protocol

インターネット専用というわけではなく、接続してないネットワークでも使うことができる。
任意の機器の間でデータを伝送を実現するプロトコル

UDP(User Datagram Protcol)

IPだけではネットワークを活用することができない。
機器にデータを届けることはできるが、目的のプログラムを示すことはできない。
データを目的のプログラムに届けるためにはコンピューターで動作しているプログラムを識別しないといけない。
これを実現するのがUDP/TCPの役割。

コンピューターには複数のアプリケーションが存在するため
IPアドレスを用いて機器の識別まではできるが、どのアプリケーションに
データを送ればよいかわからない。
そのため、ポート番号と呼ばれる番号でどのプログラムにデータを送ればよいのか識別する。

ただ、UDPはネットワーク通信を保証する訳ではないので、データを確実に送れたか
また、遅れてない場合のエラー処理等の対策は対応できない。
そのためデータ送信の確実性を保証するためにはTCPを用いて通信をする。

TCP(Transmission Control Protocol)

エラー処理はネットワークアプリケーションの中で行う必要がある
エラー対処のためにエラー処理の問題に対処するプロトコルがこれ。

UDPと同様にポート番号を指定してデータを相互にやり取りをする
通信路を提供している。

TCPは特定の通信相手を指定して、明示的に接続処理を行い、以後はその相手とのみ
データのやり取りをする。これをコネクションと呼ぶ。

TCPはデータの送信に対して、確認情報を返すことで、確実なデータ伝送を実現している。

通信は必ず双方向で行われている。

エラー回復

なら、TCPで全て遅ればいいじゃん、と思っていたのですが
このような場合はUDPの方がいい、という時もあります。
主に以下のようなパターン

ゲームだとプレイヤーの位置を送る
・データが少ない
・高度な処理が必要
・リアルタイム性
・複数の相手に送信

IPアドレスMACアドレス

IPアドレスはインターネットに接続された個々のノードを識別するための一意な32BITの情報。
重複は存在しないが、自由に変更できる。

DNS ドメインネームシステム

サーバーの指定やメールアドレスにドメイン名を使用するが
ネットワーク通信ではIPアドレスを使用するため、
ドメイン名はIPアドレスに変換しないといけない、
これを行うのがDNS

ARP(Address Resolution Protcol)

実際のネットワーク通信は個々の方式毎に規定されているMACアドレスを使って行われる。

イーサネットMACアドレスを使って通信が行われる、

TCP/IPを使う場合はIPアドレスで宛先や送信元を指定するのでMACアドレスでノードを指定する必要がある、
そのため、IPアドレスMACアドレスの対応づけをする必要性がある、

IPアドレスMACアドレスの対応つけ処理のことを示す。
対応つけをネットワークを使って行うプロトコル

ICMP

通信でエラーを通知したり、診断機能を提供したり、各種の制御を
行うための管理プロトコル
主要な役割はエラーの通知。IPデータグラムが宛先に到着しなかった、途中で破棄された
といったエラー通知がICMPで送信元に送られる。
エラー通知が必ず送られるわけでもない。

Raspberry PiとHomebridgeでお家ハック

Raspberry PiとHomebridgeを使ってお家をIOT化してみる

今回はHomebridgeのインストールから、実際にIPhoneで制御するまでの
方法を紹介していきたいと思います。
webで色々と記事を見ながら、実装していったのですが、
行き詰った所がたくさんあったので、そのあたりもやっていきます。

使用するもの

今回使用する主な物は

  • Raspberry Pi 3
  • Nodejs
  • Avahi
  • Homebridge
  • Homebridge-cmd
  • Homebridge-Irkit

です
では早速、はじめて行きましょう。

Raspiを最新のバージョンにアップデートする。

ラズパイのターミナル画面を開き、以下のコマンドを入力します。

$ sudo apt-get update

$ sudo apt-get upgrade

少し時間がかかるかもしれませんが、ラズパイが最新のバージョンにアップデートされます。
何か表示されたらキーボードのYボタンを押してエンターで実行してあげてください。
ここで一度、ラズパイを再起動します。

Nodejsインストール

次にNodejsをいれていきます。
以下のコマンドを入力してください。

$ wget https://nodejs.org/dist/v6.2.2/node-v6.2.2-linux-armv6l.tar.gz
$ tar -xvf node-v6.2.2-linux-armv6l.tar.gz
$ cd node-v6.2.2-linux-armv6l
$ sudo cp -R * /usr/local/
$ cd ..
$ node -v
v6.2.2

node -v で現在ラズパイにインストールされている
nodejsのバージョンが表示されると思います。
今回、バージョンは6.2.2を使用していますが、
バージョンを7系でインストールすると、
後にインストールするhomebridgeがうまく起動されず、

can't find module......というエラーで先に進めなかった。

調べて見たところ、nodejsは奇数バージョンは最新であるが
不安定、偶数バージョンは安定バージョンらしい。。。

とりあえず7系ではHomebridgeが起動できなかったので
6系をインポートしてやる。(2017/1/14現在)

Avahiインストール

次にavahiをインストール。
以下のコマンドを実行

$ sudo apt-get install libavahi-compat-libdnssd-dev
Homebridgeのインストール

最後に、Homebridgeをインストールする。

同様に以下のコマンドを実行

$ sudo npm install -g homebridge --unsafe-perm

これでhomebridgeをインストールが完了。
うまく動いているか確認するために

$ homebridge

で実行してみる。
warrningが6つ程でるが、公式をみても無視してくれとのことなので問題ないとおもいます。

Homebridge-cmd,Homebridge-irkit

こちらはhomebridgeでon_cmdなどを利用するためのプラグイン
以下のコマンドを入力。

$ sudo npm install -g homebridge-irkit
$ sudo npm install -g homebridge-cmd

ここまで実行すると、IPhoneのHomeアプリにHomebridgeという名前で認識されるはずです。
いったんここでHomebridgeとiphoneをペアリングしてあげましょう。

$ homebridge

を入力してiphoneでhomeアプリを開きます。
おそらくデフォルトで入ってると思いますが、
消してしまった人はもう一度取り直しましょう!!

アクセサリーにhomeridgeが追加されるはずです。

f:id:kiyotakay96:20170115060034p:plain

config.jsonの作成

使用するアクセサリーの情報をこのjsonファイルに記述して言ってあげましょう。
このjsonファイルはディレクトリが指定されており
/home/pi/.homebridge以下にいれてあげる必要があります。

$ cd /home/pi/.homebdige
$ nano config.json

でnano エディタを開き、以下のサンプルコードのように記述して上げてください。

{
    "bridge": {
        "name": "Homebridge",
        "username": "AA:BB:CC:DD:EE:FF",
        "port": 51826,
        "pin": "031-45-154"
    },
 
    "accessories": [
        {
            "accessory": "CMD",
            "name": "LED",
            "on_cmd": "/usr/bin/gpio -g mode 4 out;/usr/bin/gpio -g write 4 1",
            "off_cmd": "/usr/bin/gpio -g mode 4 out;/usr/bin/gpio -g write 4 0"
        }
    ]
}

bridgeのところの設定はどうやらなんでもいいみたいです。
usernameはmacaddress形式にすることだけ注意すればオッケーです(大文字)

これで準備完了。

$ homebridge

を入力してiphoneを見てみるとledというアクセサリが追加されているのを確認してください。

エラーまとめ

Homebridgeが起動できない

最初に試した時はエラーでhonebridgeが起動できませんでした。
Can't find module......
と表示され、調べるとどうやらnodejs側の
エラーだったので、バージョンを7系から
6系におとして、実行してみた所無事解決。

ウェブで検索してみても、同様のエラーで
困ってる人が何人かいました。

一度ペアリングした後、iPhoneから認識されない
cant find config.json

Config.jsonを記述した後も、このエラーが
でる場合、ファイルが指定されたディレクトリにない事が考えられます。

/home/pi/.homebridge以下にファイルがあるか確認しましょう。

また、
sudo homebridge

でhomebridgeを起動すると、ディレクトリが
/root/.homebridgeの方に変更されてしまうので、
Homebridgeで起動しましょう。(sudoなし)

Unity C# プロパティ使い方

Unity C# プロパティ使い方

今回はUnity C# のプロパティの使い方について
やっていこうと思います。

プロパティて?

多分見たことがある人が多いと思いますが
こういうやつです。

private int score;

public int Score{
    get{
        return score;
    }
    set{
       score=value;
    }
}

プロパティはget,setというアクセッサを持っています。
(両方必ず必要なわけではない)
値を知りたい時はget,値を代入したい場合はsetを使用し
それぞれが呼び出されます。

要はゲッターとセッターと呼ばれるものなのですが、
C#にある機能で、いちいち関数を用意しなくていいので非常に便利です。

プロパティを使用しないで、ゲッターとセッターの関数を用意すると
以下のような実装になります。

private int score;

//スコアのゲッター
public int GetScore()
{
    return score;
}

//スコアのセッター
public void SetScore(int value)
{
    score=value;
}

使い方

使い方①

基本的な使い方としては、privateな変数があって
その値に他のクラスからもアクセスしたい場合に使います。
上の例でいうとscoreに他のクラスからアクセスしたいけどprivateの場合。


またプロパティの変数名は、定義されているprivateな変数と区別化するためにも
同じ名前でよいので大文字始まりにするなどが一般的だと思います。
ではプロパティの具体的な使用例を以下にあげます。

//MyClassからHogeクラスのprivate 変数scoreにアクセスしたい
public class MyClass :MonoBehaviour
{
   void Start()
   {
    Hoge hoge=new Hoge();
    hoge.Score=10;
    Debug.Log(hoge.Score);
    }

}

public class Hoge
{
    private int score;

    public int Score{
    get{
        return score;
    }
    set{
       score=value;
    }
}
}

この例ではMyClassからHogeクラスの変数scoreにアクセスしたいが
privateなのでアクセスできません。
そこでプロパティを利用してScoreへアクセスすることで
Hogeクラスのprivateな変数scoreにアクセスすることができます。

先ほども述べましたが、値を代入する場合はsetが、値を参照したい場合はgetが呼ばれます。

使い方②

またプロパティは変数を関数のように使用することができます。
例えば、入力された値によってはエラーを返す。
という実装が可能になります。
もう一つ例を見て見ましょう。
先ほどのスクリプトに少し訂正を加えました。

//MyClassからHogeクラスのprivate 変数scoreにアクセスしたい
public class MyClass :MonoBehaviour
{
   void Start()
   {
    Hoge hoge=new Hoge();
    hoge.Score=-10;
    Debug.Log(hoge.Score);
    }

}

public class Hoge
{
 [SerializeField]
    private int score;

    public int Score{
    get{
        return score;
    }
    set{
       if(value<=0){
          Debug.Log("マイナスの値は入力できません");
              return;
       }
       score=value;
    }
}
}

今回の例では、マイナスの値をscoreに代入しようとすると
if分の制限により代入できません。
このように関数のような振る舞いを持たせることができます。

上記の仕様例では、SerializeFieldのattributeを使って
インスペクターに値を表示しているのでscoreの変数とプロパティを二つ用意していますが
インスペクターに値を表示しない場合であれば、
以下のコードのように短縮して記述することもできます。

public class Hoge
{
    public int score{get; set;}
}

まとめ

以上プロパティの使い方でした。