Vector プロパティをセットする方法
環境
Oracle Graph Server Shell 20.1.0 PGX server version: 19.4.0 type: SM PGX server API version: 3.6.0 PGQL version: 1.2
準備
- Graph の作成
var g = session.<Integer>newGraphBuilder(IdType.INTEGER).addVertex(1).build()
Vector プロパティの設定方法
- Vector Integer
// Vector Integer プロパティの作成 g.createVertexVectorProperty(PropertyType.INTEGER, 3 /* dimension */, "vp_vec_int") // Vector Integer プロパティのセット g.getVertex(1).setProperty("vp_vec_int", new oracle.pgx.api.PgxVect<Integer>(new Integer[]{1,2,3}))
- Vector Long
// Vector Long プロパティの作成 g.createVertexVectorProperty(PropertyType.LONG, 3 /* dimension */, "vp_vec_long") // Vector Long プロパティのセット g.getVertex(1).setProperty("vp_vec_long", new oracle.pgx.api.PgxVect<Long>(new Long[]{1L,2L,3L}))
- Vector Float
// Vector Float プロパティの作成 g.createVertexVectorProperty(PropertyType.FLOAT, 3 /* dimension */, "vp_vec_float") // Vector Float プロパティのセット g.getVertex(1).setProperty("vp_vec_float", new oracle.pgx.api.PgxVect<Float>(new Float[]{0.1f,0.2f,0.3f}))
- Vector Double
// Vector Double プロパティの作成 g.createVertexVectorProperty(PropertyType.DOUBLE, 3 /* dimension */, "vp_vec_double") // Vector Double プロパティのセット g.getVertex(1).setProperty("vp_vec_double", new oracle.pgx.api.PgxVect<Double>(new Double[]{0.1d,0.2d,0.3d}))
- Vector String プロパティのセットはできない
// Vector String プロパティの作成 g.createVertexVectorProperty(PropertyType.STRING, 3 /* dimension */, "vp_vec_string") // Vector String プロパティのセット -> エラー発生 g.getVertex(1).setProperty("vp_vec_string", new oracle.pgx.api.PgxVect<String>(new String[]{"str1", "str2", "str3})) | Exception java.lang.IllegalArgumentException: type string is not a valid vector property type | at PgxVect.<init> (PgxVect.java:49) | at (#23:1)
Vector プロパティの参照方法
- Vector Integer
((oracle.pgx.common.util.vector.Vect<Integer>)g.getVertex(1).getProperty("vp_vec_int")).toArray() | Warning: | unchecked cast | required: oracle.pgx.common.util.vector.Vect<java.lang.Integer> | found: java.lang.Object | ((oracle.pgx.common.util.vector.Vect<Integer>)g.getVertex(1).getProperty("vp_vec_int")).toArray() | ^--------------------------------------^ $28 ==> Integer[3] { 1, 2, 3 }
- Vector Long
((oracle.pgx.common.util.vector.Vect<Long>)g.getVertex(1).getProperty("vp_vec_long")).toArray() | Warning: | unchecked cast | required: oracle.pgx.common.util.vector.Vect<java.lang.Long> | found: java.lang.Object | ((oracle.pgx.common.util.vector.Vect<Long>)g.getVertex(1).getProperty("vp_vec_long")).toArray() | ^---------------------------------------^ $29 ==> Long[3] { 1, 2, 3 }
- Vector Double
((oracle.pgx.common.util.vector.Vect<Double>)g.getVertex(1).getProperty("vp_vec_double")).toArray() | Warning: | unchecked cast | required: oracle.pgx.common.util.vector.Vect<java.lang.Double> | found: java.lang.Object | ((oracle.pgx.common.util.vector.Vect<Double>)g.getVertex(1).getProperty("vp_vec_double")).toArray() | ^-----------------------------------------^ $30 ==> Double[3] { 0.1, 0.2, 0.3 }
- Vector Float
((oracle.pgx.common.util.vector.Vect<Float>)g.getVertex(1).getProperty("vp_vec_float")).toArray() | Warning: | unchecked cast | required: oracle.pgx.common.util.vector.Vect<java.lang.Float> | found: java.lang.Object | ((oracle.pgx.common.util.vector.Vect<Float>)g.getVertex(1).getProperty("vp_vec_float")).toArray() | ^----------------------------------------^ $31 ==> Float[3] { 0.1, 0.2, 0.3 }
Graph Server 20.1 で GraphConfig をbuildできない問題
setKeystoreAlias("alias") でbuildすればおけ
実践 Rust 入門 第4章プリミティブ型
Rust における型
- すべての値の型はコンパイル時に決定される
- これは安全性、効率性という利点がある
- 安全性: エラーの早期発見、所有権システムとの連携による型安全かつデータ競合のないプログラム開発の促進
- 効率性: メモリの細かい制御、コンパイラによる最適化の恩恵
- これは安全性、効率性という利点がある
型の分類
定義による分類
- プリミティブ型
- ユーザ定義型
構成による分類
- スカラ型
- 複合型
スカラ型
- ユニット
- 真理値
- 固定精度の整数
- 固定精度の浮動小数点
- 文字
- 参照
- 生ポインタ
- 関数ポイント
let n = 40; let c = 'R';
ユニット
- 値を返さない関数の戻り値はユニット型
- ユニット型は意味のある情報を持たないため、サイズは0
- キーバリューのペアを格納するデータ構造でキーのみデータを保持したい場合には、バリューにユニットを格納すると無駄にメモリを消費しない
assert_eq!(std::mem::size_of::<()>(), 0);
真偽値
- true と false を持つ
let b1 = true; let b2 = !b1; let n1 = 1; let n2 = 2; let b3 = n1 >= n2; let b4 = n1 < n2; let b5 = b3 && b4; let b6 = b3 || b4;
固定精度の整数
- ビット幅指定の整数型
- 符号なし (uxx)
- 符号あり (ixx)
let n1: i32 = 32;
- アドレス幅の整数型
- usize
- isize
let n2: usize = 32;
- 整数リテラル
- デフォルト10進数
- プレフィクスで他の基数に基づく数を表される
- 0x: 16進数
- 0o: 8進数
- 0b: 2進数
let h1 = 0xff; let o1 = 0o744; let b1 = 0b1010_0110_1110_1001;
- サフィックスで型を指定可能
let n1 = 10u8;
- ASCII 文字に対する文字コードを得ることも可能
let n2 = b'A'; assert_eq!(n2, 65u8);
代表的な整数演算
整数型のメソッドや定数
- 整数型のメソッド
- pow(), abs(), rotate_left(), from_str(), to_string(), checked_add()
- 定数
- 最大値 MAX 等
整数演算の桁あふれ
- リリースモードでは桁あふれは検出できない
- 以下の方法で対応するメソッドを使用することを検討する
- 検査付き演算
- 飽和演算
- ラッピング演算
- 桁あふれ演算
- 以下の方法で対応するメソッドを使用することを検討する
fn overflow_calc() { let n1 = 200u8; let n2 = 3u8; assert_eq!(n1.checked_mul(n2), None); assert_eq!(n1.saturating_mul(n2), std::u8::MAX); assert_eq!(n1.wrapping_mul(n2), 88); assert_eq!(n1.overflowing_mul(n2), (88, true)); }
固定精度の浮動小数点
- ビット数に応じてf32, f64の2つの型が用意されている
- サフィックスで型を指定可能
- 指数部も指定可能
let f1 = 10.0; let f2 = 1_234.897f64; let f3 = 576.6E77;
文字
- 1つのUnicodeのスカラ値
- シングルクォートで囲む
- 1文字を表すのにたとえ英数字であっても4バイトを消費する
- 複数のコードポイントが組み合わされた文字例えば'が'などは char リテラルとして使用することはできない(コンパイルエラー)
let c1 = 'A'; let c2 = 'B'; assert!(c1 <= c2); assert!(c1.is_uppercase()); let c3 = '0'; assert!(c3.is_digit(10)); let c4 = '\t'; let c5 = '\''; let c6 = '\\'; let c7 = '\x7F'; let c8 = '漢'; let c9 = '\u{5b57}'; let c10 = '\u{1f600}'; println!("{}", c10);
参照
- メモリ安全ポインタ
- データが格納されている場所を指す
- usize と同じビット幅の整数で表される
fn f1(mut n: u32){ n = 1; println!("{}", n); } fn f2(n_ptr: &mut u32){ println!("f2: n_ptr {:p}", n_ptr); *n_ptr = 2; println!("{}", n_ptr); } let mut f_n1 = 0; f1(f_n1); println!("{}", f_n1); f2(&mut f_n1); println!("{}", f_n1);
生ポインタ
- メモリ安全ではないポインタ
- dereference するときに unsafe ブロック内に処理を記述する必要性がある
let mut c1 = 'A'; let c1_ptr: *mut char = &mut c1; assert_eq!(unsafe{*c1_ptr}, 'A'); unsafe { *c1_ptr = 'B'; }
関数ポインタ
- 関数を指すポインタ
fn double(n: i32) -> i32 { n + n } fn abs(n: i32) -> i32 { if n >= 0 { n } else { -n } } let f1: fn(i32) -> i32 = double; let f2: fn(i32) -> i32 = abs; assert_eq!(std::mem::size_of_val(&f1), std::mem::size_of::<usize>()); let mut f3 = double; assert_eq!(std::mem::size_of_val(&f3), 0);
Rust 環境構築 + Hello, World + Cargo 基本
安全性、並列性、速度の3つにフォーカスしたシステムプログラミング言語である Rust に興味を持ったので、 まずは環境構築から始めてみます。
Rust 環境構築
Rust コンパイラは様々なプラットフォームをサポートしていますが、サポートのレベルが3つに分けられています。
- 第1級: ビルドでき、かつ動作を保証する
- 第2級: ビルドを保証する
- 第3級: テストやビルドは保証していない
この中で 64-bit OSX (10.7+, Lion+) は第1級サポートに位置付けられています。
Mac OS での Rust 環境構築
- 筆者の環境は以下の通りです。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.14 BuildVersion: 18A391
- 環境構築は以下のワンコマンドですみます。
$ curl https://sh.rustup.rs -sSf | sh info: downloading installer Welcome to Rust! This will download and install the official compiler for the Rust programming language, and its package manager, Cargo. It will add the cargo, rustc, rustup and other commands to Cargo's bin directory, located at: /Users/htamakos/.cargo/bin This path will then be added to your PATH environment variable by modifying the profile files located at: /Users/htamakos/.profile /Users/htamakos/.zprofile You can uninstall at any time with rustup self uninstall and these changes will be reverted. Current installation options: default host triple: x86_64-apple-darwin default toolchain: stable modify PATH variable: yes 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation >1 info: syncing channel updates for 'stable-x86_64-apple-darwin' info: latest update on 2019-01-17, rust version 1.32.0 (9fda7c223 2019-01-16) info: downloading component 'rustc' 64.5 MiB / 64.5 MiB (100 %) 4.5 MiB/s ETA: 0 s info: downloading component 'rust-std' 49.2 MiB / 49.2 MiB (100 %) 6.1 MiB/s ETA: 0 s info: downloading component 'cargo' info: downloading component 'rust-docs' 8.5 MiB / 8.5 MiB (100 %) 7.6 MiB/s ETA: 0 s info: installing component 'rustc' info: installing component 'rust-std' info: installing component 'cargo' info: installing component 'rust-docs' info: default toolchain set to 'stable' stable installed - rustc 1.32.0 (9fda7c223 2019-01-16) Rust is installed now. Great! To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH environment variable. Next time you log in this will be done automatically. To configure your current shell run source $HOME/.cargo/env
- この後
$HOME/.cargo/bin
を PATHに追加するかsource $HOME/.cargo/env
で rust 関連のコマンドが実行できます。2019/2時点で最新の安定バージョンは 1.32.0のようです。
$ source $HOME/.cargo/env $ rustc --version rustc 1.32.0 (9fda7c223 2019-01-16)
Hello, Rust!
- 何はともあれ Rust で Hello, World してみます。関数定義を fn で、標準出力をprintln関数で実行する、行末コロンがある、等の特徴がわかります。
fn main(){ println!("Hello, World"); }
- コンパイルして実行してみます。
$ rustc main.rs $ ls -lah total 560 drwxr-xr-x 4 htamakos staff 128B 2 15 00:35 . drwxr-xr-x 3 htamakos staff 96B 2 15 00:25 .. -rwxr-xr-x 1 htamakos staff 274K 2 15 00:35 main -rw-r--r-- 1 htamakos staff 41B 2 15 00:34 main.rs $ ./main Hello, World
できた!
Hello, World 解説
-
- {} で関数ブロックを記述
- 行末にコロンが必須
- main 関数は特別扱いで、すべての rust プログラムのエントリーポイントになる
println! はRustのマクロ呼び出し
- println は関数で、それに対して!をつけるとマクロ呼び出しになるらしい
Cargo Introduction
- Rust のビルドシステム兼パッケージマネージャーが Cargoです。
- 上記のインストール手順を踏むと勝手にインストールされています。
$ cargo --version cargo 1.32.0 (8610973aa 2019-01-02)
- cargo でプロジェクトを作成するには以下のようなコマンドを実行します。
$ cargo new hello_rust --bin
$ ls -lah hello_rust total 16 drwxr-xr-x 6 htamakos staff 192B 2 15 00:48 . drwxr-xr-x 5 htamakos staff 160B 2 15 00:48 .. drwxr-xr-x 9 htamakos staff 288B 2 15 00:51 .git -rw-r--r-- 1 htamakos staff 19B 2 15 00:48 .gitignore -rw-r--r-- 1 htamakos staff 125B 2 15 00:48 Cargo.toml drwxr-xr-x 3 htamakos staff 96B 2 15 00:48 src
- Cargo.toml の中身は以下のようになっています。TOMLファイル形式が設定ファイルのフォーマットとして採用されているようです。
$ cat Cargo.toml [package] name = "hello_rust" version = "0.1.0" authors = ["htamakos <xxxxxx@gmail.com>"] edition = "2018" [dependencies]
- Cargo で build する
$ cargo build Compiling hello_rust v0.1.0 (/Users/htamakos/project/learning_rust/01_hello_world/hello_rust) Finished dev [unoptimized + debuginfo] target(s) in 3.18s
- cargo でビルドしたプログラムを実行する
$ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.08s Running `target/debug/hello_rust` Hello, world!
- cargo でコンパイルチェックを行う
$ cargo check Checking hello_rust v0.1.0 (/Users/htamakos/project/learning_rust/01_hello_world/hello_rust) Finished dev [unoptimized + debuginfo] target(s) in 0.18s
- cargo でリリースビルドを作成する
$ cargo build --release # target ディレクトリ以下にreleaseディレクトリが作成され、そこに実行バイナリ等が作成されます。 $ ls -lah target/release total 552 drwxr-xr-x@ 11 htamakos staff 352B 2 15 00:59 . drwxr-xr-x 5 htamakos staff 160B 2 15 00:59 .. -rw-r--r-- 1 htamakos staff 0B 2 15 00:59 .cargo-lock drwxr-xr-x 3 htamakos staff 96B 2 15 00:59 .fingerprint drwxr-xr-x 2 htamakos staff 64B 2 15 00:59 build drwxr-xr-x 4 htamakos staff 128B 2 15 00:59 deps drwxr-xr-x 2 htamakos staff 64B 2 15 00:59 examples -rwxr-xr-x 2 htamakos staff 270K 2 15 00:59 hello_rust -rw-r--r-- 1 htamakos staff 172B 2 15 00:59 hello_rust.d drwxr-xr-x 2 htamakos staff 64B 2 15 00:59 incremental drwxr-xr-x 2 htamakos staff 64B 2 15 00:59 native
自動整形ツール rustfmt のインストール
- Rust のツールチェインには、自動フォーマットツールである rustfmt があります。これは以下のコマンドでインストールできます。
$ rustup component add rustfmt info: downloading component 'rustfmt' 1.6 MiB / 1.6 MiB (100 %) 1.3 MiB/s ETA: 0 s info: installing component 'rustfmt'
- 使い方は以下の通り
# 以下のようにインデントがおかしい.rsファイルに対して、 $ cat main.rs fn main() { println!("Hello, World"); } # rustfmt をかけると... $ rustfmt main.rs # 自動的にフォーマットされます。 $ cat main.rs fn main() { println!("Hello, World"); }
PDBの起動状態のオープンモードの保持・破棄
概要
- CDB 再起動時の 1つ以上の PDB のオープン状態を保持できる
方法
オープンモードを保持するように設定する
- 特定の PDB を設定する場合
SQL> ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;
- 複数の PDB を設定する場合
SQL> ALTER PLUGGABLE DATABASE pdb1, pdb2 SAVE STATE;
- すべての PDB を設定する場合
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;
- 特定の PDB 以外の全てを設定する場合
SQL> ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 SAVE STATE;
オープンモードの破棄
- 特定の PDB を破棄する場合
SQL> ALTER PLUGGABLE DATABASE pdb1 DISCARD STATE;
- 複数の PDB を破棄する場合
SQL> ALTER PLUGGABLE DATABASE pdb1, pdb2 DISCARD STATE;
- すべての PDB を破棄する場合
SQL> ALTER PLUGGABLE DATABASE ALL DISCARD STATE;
- 特定の PDB 以外の全てを破棄する場合
SQL> ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 DISCARD STATE;
オープンモードの保持状態を確認する方法
- DBA_PDB_SAVED_STATES を参照する
SQL> desc DBA_PDB_SAVED_STATES 名前 NULL? 型 ----------------------------------------------------- -------- ------------------------------------ CON_ID NOT NULL NUMBER CON_NAME NOT NULL VARCHAR2(128) INSTANCE_NAME NOT NULL VARCHAR2(128) CON_UID NOT NULL NUMBER GUID RAW(16) STATE VARCHAR2(14) RESTRICTED VARCHAR2(3) SQL> select con_id, con_name, instance_name, state from dba_pdb_saved_states; CON_ID CON_NAME INSTANCE_N STATE ---------- ---------- ---------- -------------- 3 PDB1 orcl OPEN
参考
やっくしぇいびんぐ
目的とすることを成し遂げる前の本質的でない事に時間をかけてしまう、またはかかってしまう様のこと。
IT業界ではよく使われる言葉。
例えば、 Tensorflow でディープラーニングしよう!!と思って、インストールしてみたらGPU版をインストールできず、調査したらglibのバージョンが低い → Glibってどうやったらアップデートできるか調べる → あれ?使ってるOSに提供されてるパーゲージなくね? → ビルド方法調べる → ビルドに必要なライブラリなくね? → ビルドに必要なライブラリ調べる → あれ?ライブラリ提供してるパッケージなくね? → ライブラリのビルド方法調べる → あry.. → 結局別OSバージョンでやる
みたいなケース。
これあるあるだと思ってたんだけど、よく考えたら防げることも多い。
そして人のメンタリティによる部分も大きい。実現したい事に対してまっすぐ進め、諦める事の決断が早い人は陥りにくい気がする。
自分の場合にはこれが本当に苦手で特に機械学習周りでよく起きる。アルゴリズムの原理が気になって先に進まない、もっといい方法がないか考えて先に進まない、先進的なライブラリがないか探して進まない。
これは本当に直さないといけない。
エクセルだって何だって実現方法なんて何でもよくて、目的をいかに素早く達成できるかのみを考えて決断して行動しないと、、、
ひとまず以下のことをする。
どんなコンテキストで、何を実現するために今何をすべきで、行った結果はどんなもので、その結果をもとに何するべきかの予想を立てて、出た結果をもとに次のアクションプランを立てる
すごく基本的なことだけど意識しないと出来ない
vagrantでboxファイル圧縮 [ProviderがVirtualBoxの場合]
1. 仮想マシン上で以下を実行
$ sudo su - # umount /vagrant # yum clean all # dd if=/dev/zero of=/EMPTY bs=1M # rm -f /EMPTY
2. 仮想マシンをシャットダウン
$ vagrant halt
3. VirutalBoxのファイルを形式をvmdk から vdiに変更したり諸々
# VirtualBoxのHDDファイルがある場所を探す. $ vboxmanage list vms $ vboxmanage showvminfo # HDDファイルがある場所へ移動する $ cd ~/VirtualBox VMs/test-app # vmdk -> vdi $ vboxmanage clonehd test-app.vmdk test-app.vdi --format vdi # vdi形式のファイルを圧縮 $ vboxmanage modifyhd test-app.vdi compact # 作成したvdiをvmdkに変換する ## ファイル名を前のvmdkファイルと別にする必要性がある。 $ vboxmanage clonehd test-app.vdi test-app-compact.vmdk --format vmdk # 前のvmdkファイルを取り外し、圧縮したvmdkファイルを接続する。 # VirtualBoxのGUIでやるのが簡単なため割愛。
4. vagrant の boxファイルを作成 (これより前に圧縮したvmdkで動作するかどうか確認するほうが無難)
# vagrant package --out test-app.box