Unity Style Developer#1 で 質問してきました! #unistyle

Unity Style Developer#1 - connpass に参加してきましたー。

Unity - Game Engine って iOS/Android 作れるんでしょ?
って位しか知らないど素人でしたが、対応プラットフォーム多いんですね!

ハンズオンのセッションがあって、当日に Unity インストールしましたが楽しめました~。
HTC Vive の実機ありセッションもあって楽しかったです。

で、LT お願いされてたので、何話そうか考えたけど触ってないし話せること無いから、 中の人来てるし質問を答えてもらおう!って感じのLTというかショートセッションというかをやりました。

一応 Data Platform の MVP なので、Data にまつわるところを聞いてきました。
また、会場の参加者からも質問が上がったのでその時のメモを公開します。*1

Q.ローカルにデータを持つ方法パッと調べた感じこんなの見つかったけど、他にも方法あるの?
1.PlayersPrefs
2.ScriptableObject
3.DB(Sqlite?)
4.外部ファイル - txt(json)
5.外部ファイル - binary (msgpack / flatbuffers ?)
6.asset
7.それ以外

A.概ね 1-6 で合ってるよー。
PlaysersPrefs
  =>設定用 (key / url 等の config とか小さいデータ用)
    大きいデータいれると起動が遅くなる、メモリ大量に必要
    =>起動時に読み込むため
ScriptableObject
  =>書き込み出来ない (Read Only)
PlayersPrefs / ScriptableObject / asset は Unity の機能で面倒みてくれる。

外部ファイルや DB は自前で保存/読込実装してね。
json そのままは辞めた方が良いよ。よく使われてるけど

個人的には msgpack よく使ってます。


Q.暗号化ってあるの?

A.Unity では暗号化の機能は持っていない
 =>解析されると、それを使っている全アプリが解析されることになるので、そこまで担保出来ないから


Q.サーバーから取ってきたデータのキャッシュみたいなのはどの方法で?

A.データが少ないなら ScriptableObject (実装?が面倒)
大きいなら DB とか


Q.PCL(Portable Class Library) 使えるの?

A.PCL の事知らないのでわかりません。
  (会場で調べた人から)たぶん使え無さそうという情報が


Q.ソース管理で大きいファイルがあって、某クラウドソース管理でアップに失敗する

A.大きいファイル含めないようにするとか
 [https://unity3d.com/jp/services/collaborate]  では、Write データ含めない
 =>無料だけど、未だβ版


Q.PlayersPrefs に 100個の int[] 保存するの遅くなる?

A.使っても構わないけど、PlayersPrefs 使うより、自前でSystem.IO使って読み書き(シリアライズ/デシリアライズ)した方がたぶん速いよ。
Web のプラットフォームだと、System.IO 使えないけど。

間違いとかあれば教えてくださいー。

*1:聞き間違い等で誤った内容を書いてるかもしれません。

Row-Level-Security BLOCK PREDICATE のメモ

行レベルのセキュリティ
いつの間にか 日本語MSDN提供されてました。
追加/更新操作の制限は、トランザクション単位ではなくクエリ単位だよというメモ。

create table [dbo].[Table] (
  [Id] int
)
go
create schema [rls]
go
create function [rls].[TablePredicate](@Id int)
  returns table
  as return select 1 as [Result] where @Id <> 1
go
create security policy [rls].[TablePolicy]
  add block predicate [rls].[TablePredicate]([Id]) on [dbo].[Table] after insert

Id = 1 は INSERT 出来ない制限を掛けたときに、

begin tran 
insert into [dbo].[Table] ([Id]) values (1)
update [dbo].[Table] set [Id] = 2 where [Id] = 1
commit

はエラーになります。
トランザクションとしては、結果的に Id = 1 の列は追加されていませんが普通の動きですね。*1

クエリ全文

create table [dbo].[Table] (
  [Id] int
)
go
create schema [rls]
go
create function [rls].[TablePredicate](@Id int)
  returns table
  with schemabinding
  as return select 1 as [Result] where @Id <> 1
go
create security policy [rls].[TablePolicy]
  add block predicate [rls].[TablePredicate]([Id]) on [dbo].[Table] after insert
go

begin tran 
insert into [dbo].[Table] ([Id]) values (1)
update [dbo].[Table] set [Id] = 2 where [Id] = 1
commit
go

drop security policy [rls].[TablePolicy]
go
drop function [rls].[TablePredicate]
go
drop schema [rls]
go
drop table [dbo].[Table]
go

*1:分離レベル低いと SELECT から見えちゃうし...

Microsoft MVP アワード (Data Platform) を受賞させていただきました

今回で5回目の受賞になりました。

今後もより一層のコミュニティ活動/情報発信していきますので、SqlWorld :: ホーム 共々宜しくお願いします。  

DB の勉強会は 関西DB勉強会 - connpass も宜しくお願いしますー。
年内にもう1回くらいやりたい。。

デブサミ関西2016 に SQLWorld として参加しました!

2週間も前ですが、やっと blog 書けました。。
Developers Summit 2016 KANSAI #devsumi

今回は かまぷとゆうこのデベロッパーズ☆ラジオ連載一覧:CodeZine(コードジン)
デブサミ関西出張版にも参加させていただきました。
ラジオは初めてだったのですが難しい!緊張して何話してるのか分からない感じに。。

毎年恒例の コミュニティLT も参加させていただきました。

iPhone7 発売日だったのでビッグウェーブネタを混ぜてみました。

10/18 (火) SQLWorld★大阪#39 開催します

2週間前の告知! SqlWorld :: SQLWorld★大阪#39 開催します。21回目の平日夜開催で、前回同様 ハンズオン 形式行う予定です。

【日時】
2016年10月18日(火曜日) 19:00~21:00
 

【イベント概要】
SQLWorld 21回目の平日夜開催~。今回も、みんなで SQL を書いてみようというハンズオン企画です!ブラウザがあれば参加出来るようにしていますので、iPad 等のタブレットでも大丈夫です。
 

【会場】
フェンリル株式会社さま大阪本社 http://www.fenrir-inc.com/
〒530-0011 大阪府大阪市北区大深町 3番1号 グランフロント大阪タワーB(オフィス) 14F
http://info.fenrir-inc.com/jp/profile/overview.html
 

【参加費】
無料
 

【持ち物】
パソコン/タブレット (DB のインストールは不要です。)
 

【参加可能人数】
13 人
 

お題に沿って、SQL を書いてみようという勉強会です。是非ご参加を~。

開催回数は増えていっていますが、続き物というわけでは無いので初めて参加される方でもお気軽にどぞー。

SQL Server の Date 型に ADO.NET の DbType.Date はうまく動かない

これで例外出るのなんで~?

using (var conn = new SqlConnection(connstr))
using (var cmd = new SqlCommand(@"insert Table_1 values (@id, @date)", conn)) {
  conn.Open();
  cmd.Parameters.Add(new SqlParameter { 
    DbType = DbType.Int32, Value = 1, ParameterName = "id" 
  });
  cmd.Parameters.Add(new SqlParameter { 
    DbType = DbType.Date, Value = new DateTime(1600, 1, 1), ParameterName = "date" 
  });
  cmd.ExecuteNonQuery();
}

こっちは動きます。

using (var conn = new SqlConnection(connstr))
using (var cmd = new SqlCommand(@"insert Table_1 values (@id, @date)", conn)) {
  conn.Open();
  cmd.Parameters.Add(new SqlParameter { 
    DbType = DbType.Int32, Value = 1, ParameterName = "id" 
  });
  cmd.Parameters.Add(new SqlParameter { 
    SqlDbType = SqlDbType.Date, Value = new DateTime(1600, 1, 1), ParameterName = "date" 
  });
  cmd.ExecuteNonQuery();
}

Dapper で SQL Server の date 型の値をパラメータとして渡したい

2016/09/17 コード修正しました


を見かけたのでちょっと書いてみる。

何もしていないと、.NET の DateTime は Dapper で DbType.DateTime 扱いなので、以下のような問題が出る。
DapperでDateTime2 - Qiita

上の Qiita でも対応策書いてるけど、個人的には Dapper の DbString を真似たクラスを作って対応してます。

public class DbDate : ICustomQueryParameter {
  public DateTime? Value { get; set; }
  public void AddParameter(IDbCommand command, string name) {
    var param = command.CreateParameter();
    param.ParameterName = name;
    param.Value = Value.HasValue ? (object)Value.Value.Date : DBNull.Value;
    // DbType はダメで、SqlDbType じゃないとダメでした。 
    // https://msdn.microsoft.com/ja-jp/library/cc716729(v=vs.110).aspx ではいけそうですが。。
    var p = param as SqlParameter;
    if (p != null) {
      p.SqlDbType = SqlDbType.Date;
    }
    else {
      param.DbType = DbType.Date;
    }
    command.Parameters.Add(param);
  }
}

使う時はこんな感じ。*1

var query = @"select top(1) [Id] 
from [Hoge] 
where [Hoge日] = @Hoge日";
  
var id = conn.ExecuteScale<int>(query, new {
  Hoge日 = new DbDate { Value = DateTime.UtcNow }
}); 

雰囲気伝わるかな? datetime2 も同じで DbDateTime2 作ってます。

*1:コンパイル通してないから動かなかったらゴメン