2016年7月9日土曜日

[Material Design Lite]バッヂについてまとめる。

目的

マテリアルデザインの「バッヂ」について、調べた結果をまとめる。

バッヂとは

状態を表すUIデザイン部分のこと。 iPhone等のスマートフォンでいうところの新着メールn件のnの部分。

バッヂまとめ

基本 Inbox
基本(白丸) Inbox
基本(オーバラップ) Inbox ※iconでない場合、spanタグでないとオーバラップしないよ
アイコン利用
account_box
アイコン利用(オーバラップ)
account_box
※material-icons利用時はdivタグ内がaccount_boxでないとダメ!
リンクバッヂ Inbox
リンクバッヂ(バッヂはリンクなし) Inbox ※「3」の部分はリンクになっていないよ。
データ多すぎ Inbox ※「456」と見える部分は実は「123456789」だよ。

2016年5月4日水曜日

[Oracle]DBMS_ASSERT.QUALIFIED_SQL_NAMEと修飾SQL名

目的

Oracleの勉強をしていて、修飾SQL名とは何かがわからなくて検索するも、よい回答がなかったので、ここでまとめる。

修飾SQL名とは何か

修飾SQL名とは、以下の3つを表す文字列のことである。

  • ローカル修飾SQL名
  • データベースリンク名
  • 接続文字列

ローカル修飾SQL名

単純SQL名と"."(ドット)で構成される文字列。 下記に示す文字列は、ローカル修飾SQL名である。

  • 'tbl_name'(テーブル名)
  • 'column_name'(カラム名)
  • 'tbl_name.column_name'(テーブル名.カラム名)
  • 'pkg_name.fun_name'(パッケージ.ファンクション名) ... etc

Oracleの厳密な定義は以下

  • <ローカル修飾SQL名> ::= <単純SQL名> {'.' <単純SQL名>}

単純SQL名とは、Oracleのオブジェクトを表す文字列と二重引用符で囲まれた文字列のことで、 オブジェクトを表す文字列とは

  • 頭文字は英字のみ
  • 2文字目以降は英数字、アンダーバー、ドルマーク、シャープがOK
  • 30文字以下
のこと。

データベースリンク名

@が付いている文字列で、他のデータベースへのアクセスを容易にするもの。

下記に示す文字列がデータベースリンクである

  • 'tbl_name.column_name@dblink'

Oracleの厳密な定義は以下

  • <データベースリンク名> ::= <ローカル修飾SQL名> ['@' <接続文字列>]

接続文字列

データベースリンクを貼りたい接続先の接続名。

Oracleの定義では単純SQL名のみOKだが、ローカル修飾SQL名を満たせばOKのような感じ。]

Oracleの厳密な定義は以下

  • <接続文字列> ::= <単純SQL名>

DBMS_ASSERT.QUALIFIED_SQL_NAMEを試した結果(ソース)

下記に少しだけQUALIFIED_SQL_NAMEを試したソースを載せておきます。
DECLARE
    v_test  VARCHAR2(1000) := NULL;
    
    PROCEDURE TEST( in_str VARCHAR2, in_test VARCHAR2 )
    IS
        v_ret VARCHAR2(1000) := NULL;
    BEGIN
        DBMS_OUTPUT.PUT_LINE(' ===== ' || in_str || ' ===== ');
        BEGIN
            v_ret := DBMS_ASSERT.QUALIFIED_SQL_NAME(in_test);
            DBMS_OUTPUT.PUT_LINE('v_ret:' || v_ret);
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('SQLCODE:' || SQLCODE);
                DBMS_OUTPUT.PUT_LINE('SQLERRM:' || SQLERRM);
        END;
    END;
BEGIN
    -- 単純SQL名
    v_test := 'TM01_LASTDEGREE';
    TEST( 'test1', v_test );
    
    -- ローカル修飾SQL名
    v_test := 'TM01_LASTDEGREE.LASTDEGREE';
    TEST( 'test2', v_test );
    
    -- 空
    v_test := '';
    TEST( 'test3', v_test );

    -- 接続文字列
    v_test := 'User Id=scott;Password=tiger;Data Source=oracle';
    TEST( 'test4', v_test );

    -- 接続文字列
    v_test := 'dbhost.example.com';
    TEST( 'test5', v_test );
    
END;

2016年4月24日日曜日

[Oracle]JIS丸めのファンクションを作成してみた。

概要

Googleで検索してもなかなか出てこない「JIS丸め」Oracleファンクションを自作してみた。

ソース

create or replace function JIS_ROUND( v_value NUMBER, v_N NUMBER )
--
-- JIS_ROUND
--
-- IN  v_value 対象の数
--     v_N     丸める小数点の桁
-- OUT 丸めた数
--
RETURN NUMBER
IS
 a NUMBER := NULL;
 b NUMBER := NULL;
 ret NUMBER := NULL;
BEGIN

 -- 丸める桁(v_N)の1つ小さいの桁の数を求める
 a := trunc( mod( v_value * power( 10, v_N + 1  ), 10 ) );

 -- 求めた v_N -1 が桁が5以外なら、ROUND
 --             5なら、偶数丸め
 IF a != 5 THEN
  ret := ROUND( v_value, v_N );
 ELSE
  -- 丸める桁
  b := trunc( mod( v_value * POWER(10, v_N ), 2 ) );
  IF b = 0 THEN
   ret := TRUNC( v_value, v_N ); 
  ELSE
   ret := ROUND( v_value, v_N );
  END IF;
 END IF;

 RETURN ret;

END JIS_ROUND;

テスト

テストコードを以下に記載する。

DECLARE
  v_val NUMBER := NULL;
  v_N   NUMBER := NULL;
  v_ret NUMBER := NULL;
  v_expand NUMBER := NULL;
BEGIN

  --
  -- 実行後、すべて [TEST OK] と表示されればよい。
  --

  -- 整数部分の丸めテスト
  v_val := 1234.56;
  v_N := 0;
  v_expand := 1234;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
   DBMS_OUTPUT.PUT_LINE('v_expand:' || v_expand);
   DBMS_OUTPUT.PUT_LINE('v_ret:' || v_ret);
  END IF;

  v_val := 1235.56;
  v_N := 0;
  v_expand := 1236;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
    DBMS_OUTPUT.PUT_LINE('v_expand:' || v_expand);
    DBMS_OUTPUT.PUT_LINE('v_ret:' || v_ret);
  END IF;

  v_val := 1235.46;
  v_N := 0;
  v_expand := 1235;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
    DBMS_OUTPUT.PUT_LINE('v_expand:' || v_expand);
    DBMS_OUTPUT.PUT_LINE('v_ret:' || v_ret);
  END IF;

  v_val := 1235.66;
  v_N := 0;
  v_expand := 1236;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
    DBMS_OUTPUT.PUT_LINE('v_expand:' || v_expand);
    DBMS_OUTPUT.PUT_LINE('v_ret:' || v_ret);
  END IF;

  --
  -- 小数点第1位のテスト
  --
  v_val := 1234.56;
  v_N := 1;
  v_expand := 1234.6;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

  v_val := 1234.55;
  v_N := 1;
  v_expand := 1234.6;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

  v_val := 1234.54;
  v_N := 1;
  v_expand := 1234.5;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

  v_val := 1234.45;
  v_N := 1;
  v_expand := 1234.4;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
    DBMS_OUTPUT.PUT_LINE('v_expand:' || v_expand);
    DBMS_OUTPUT.PUT_LINE('v_ret:' || v_ret);
  END IF;

  v_val := 1234.44;
  v_N := 1;
  v_expand := 1234.4;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

  v_val := 1234.46;
  v_N := 1;
  v_expand := 1234.5;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

  --
  -- 整数部分
  --
  v_val := 1234.56;
  v_N := -1;
  v_expand := 1230;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

  v_val := 1235.56;
  v_N := -1;
  v_expand := 1240;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

  v_val := 1236.56;
  v_N := -1;
  v_expand := 1240;
  select JIS_ROUND(v_val, v_N) into v_ret from dual;
  IF v_expand = v_ret THEN
    DBMS_OUTPUT.PUT_LINE('TEST OK');
  ELSE
    DBMS_OUTPUT.PUT_LINE('TEST NG');
  END IF;

END;

2016年2月21日日曜日

【C#】【SQLite】Linqを使用したデータ参照

目的

 Linqを使って、SQLiteのデータベースへデータ参照をする。

本記事のポイント

クラス内のフィールドにDBと対応したマッピングを記述すること。

環境

  •  Windows7
  •  Microsoft Visual Studio Community 2015
  •  SQLite 1.0.98.0

必要なもの

  • System.Data.SQLite.dll  - ①
  • SQLite.Interop.dll (←これがないと実行時エラーとなる)
  • System.Data.Linq.dll  - ②

準備

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

上記URLから「sqlite-netFx40-setup-x64-2010-1.0.99.0.exe」をダウンロードし、実行する。




ほしいものは、必要なものに記載されているDLL。
インストールされると、「C:\Program Files\System.Data.SQLite\2010\bin」あたりに配置されている。

データベースの構造

今回利用するSQLiteデータベースは下記URLからダウンロードできる。:

(「C:\temp\LinqTest.sqlite」へ配置する。)

構造
LinqTestデータベース
TestTableテーブル
カラム名
IdInteger
TitleText
DetailText

手順

  1. コンソールアプリケーションプロジェクトを新規作成する。
  2. 「参照」に①②を追加する。
  3. テーブルとマッピングするクラスを追加する。
  4. テーブルからデータを取得する。
  5. 確認

1.コンソールアプリケーションプロジェクトを新規作成する。

「ファイル」-「新規作成」-「プロジェクト」を選び、コンソールアプリケーションを選択し、OKを押す。

2.「参照」に①②を追加する。


3.テーブルとマッピングするクラスを追加する。

プロジェクトへクラスを追加する。名前は「TTestData.cs」とする。そのクラスへ「using System.Data.Linq.Mapping;」を追加する。クラスのソース全文は以下に示す。
using System;
using System.Data.Linq.Mapping;

namespace LinqTest
{
    [Table(Name="TestTable")]
    class TTestData
    {
        //ID
        [Column(Name = "Id", DbType = "INT", CanBeNull = true, IsPrimaryKey = false)]
        public Int32? Id { get; set; }

        // Title
        [Column(Name ="Title",DbType ="NVARCHAR", CanBeNull =true)]
        public String Title { get; set; }

        // Detail
        [Column(Name ="Detail",DbType ="NVARCHAR", CanBeNull =true)]
        public String Detail { get; set; }
    }
}

4.テーブルからデータを取得する。

プロジェクトを新規作成した際に自動的に作成されている「Program.cs」のMainメソッドへ、テーブルからデータを取得し、標準出力するためのLinq等のソースを記述する。

usingは以下を追加する。

  • using System.Data.Linq;
  • using System.Data.SQLite;
  • using System.Linq;
using System;
using System.Data.Linq;
using System.Data.SQLite;
using System.Linq;

namespace LinqTest
{
    class Program
    {
        static void Main(string[] args)
        {
            SQLiteConnectionStringBuilder aConnectionString = new SQLiteConnectionStringBuilder
            {
                DataSource = @"C:\temp\LinqTest.sqlite" // データベースの保存先
            };
            using (SQLiteConnection aConnection = new SQLiteConnection(aConnectionString.ToString()))
            {
                // データベースを開く
                aConnection.Open();

                // ここにデータベース処理コードを書く
                using(DataContext aContext = new DataContext(aConnection))
                {
                    Table aTableTest = aContext.GetTable();
                    IQueryable aQueryResult =
                        from x in aTableTest
                        select x;

                    Console.WriteLine("=== test ===");
                    foreach(TTestData aData in aQueryResult)
                    {
                        Console.WriteLine("=== {0} ===", aData.Id);
                        Console.WriteLine(aData.Title);
                        Console.WriteLine(aData.Detail);
                    }

                    Console.ReadLine(); // Enterキー押下でコマンドプロンプトが閉じる
                }
                // データベースを閉じる
                aConnection.Close();
            }
        }
    }
}

5.確認

以下のようにコマンドプロンプトが表示されればOK。