Log.log(work)

いろんな作業メモ

Ionic(Angular)でandroid実機で動作確認

やりたいこと

位置情報を送るアプリをAndroidで動作させてみる。

環境

OS : Windows 8.1
Ionic CLI : 5.4.2
NodeJS : v10.15.3
npm : 4.0.5

さっそく開発

  1. nodistインストール
    インストーラダウンロード
  2. cordovaインストール

    npm install -g cordova ionic

  3. Android Studio / コマンドラインツールのダウンロード
    ダウンロードページからそれぞれのZipファイルをダウンロード

    • Android studio(android-studio-ide-181.5014246-windows.zip)を適当なところに解凍。 例)d:\android配下
    • コマンドラインツール(sdk-tools-windows-4333796.zip)を適当なところに解凍。 例)d:\android\android-sdk配下
  4. Android SDK のセットアップ

    sdkmanager "emulator" "platform-tools" "platforms;android-27" "build-tools;27.0.3" "system-images;android-27;default;x86_64"

  5. Windows Hypervisor Platform (WHPX) インストール

    sdkmanager "extras;intel;Hardware_Accelerated_Execution_Manager"

  6. 新規プロジェクトつくる(位置情報を表示したいだけなのでblankにしておく。他にもtabsとかいろんなオプションがある)

    ionic start myProject blank
    cd myProject

  7. Geolocationプラグインをインストール

    ionic cordova plugin add cordova-plugin-geolocation
    npm install @ionic-native/geolocation

  8. 開発

    unmet peer dependency ionic-native/coreという警告?でビルドが失敗する事象にでくわし、
    なんだろうと思っていろいろ調べていたら思ったより時間がかかってしまった。
    とりあえず import { Geolocation } from '@ionic-native/geolocation/
    ではなく import { Geolocation } from '@ionic-native/geolocation/ngx
    にしたら解消した。

・myProject\src\app\home\home.page.ts

    import { Component } from '@angular/core';
    import { Geolocation } from '@ionic-native/geolocation/ngx';

    @Component({
      selector: 'app-home',
      templateUrl: 'home.page.html',
      styleUrls: ['home.page.scss'],
    })
    export class HomePage {

      geoLatitude: number;
      geoLongitude: number;
      geoAccuracy:number;
      constructor(private geolocation: Geolocation) {}

        getGeolocation(){
          this.geolocation.getCurrentPosition().then((resp) => {
            this.geoLatitude = resp.coords.latitude;
            this.geoLongitude = resp.coords.longitude; 
            this.geoAccuracy = resp.coords.accuracy; 
           }).catch((error) => {
             alert('Error getting location'+ JSON.stringify(error));
           });
        }
    }

・ home.page.html

<ion-header>
  <ion-toolbar>
    <ion-title>
        Geolocation
    </ion-title>
  </ion-toolbar>
</ion-header>

<ion-content padding>
    <h1>Get Location</h1>
   
    <ion-button (click)="getGeolocation()">
      Get Location
    </ion-button>
  
    <div *ngIf="geoLatitude">
      <p>Latitude : {{geoLatitude}}</p>
      <p>Longitude : {{geoLongitude}}</p>
      <p>Accuracy : {{geoAccuracy}}</p>
      
    </div>
   
  </ion-content>

ブラウザで確認

サーバーを立ち上げて確認

> ionic serve

実機で確認

  • ビルド
> ionic cordova build android
  • ドライバーを用意する
    公式サイトで usbドライバーをダウンロードし、下記の場所に解凍したファイルを置く。
Android SDKをインストールしたフォルダ\extras\google\usb_driver

「コントロールパネル」→「デバイスマネージャー」→ 「ほかのデバイス」を右クリック、でドライバーを更新する。
ドライバーは上記のフォルダを指定する。

  • 証明書を作成する
    下記のフォルダを証明書を作成してみる。
    myProject\keys\android
keytool -genkey -v -keystore debug.keystore -alias [alias名] -storepass [storepass] -keypass [keypass] -keyalg RSA

※keytoolコマンドはJDKが通っていれば使えるハズ

> adb devices

※adbコマンドはandroid-sdk\platform-tools がpathに入っていれば動作する。

リストに表示されたら、

> ionic cordova run android --livereload

デバッグしたい場合はChromeブラウザで操作できる。Chromeに下記URLを打ち込み、デバイスのInspectリンクをクリックする。

chrome://inspect/#devices

参考サイト

[Ionic3] 開発環境の構築からAndroid実機デバッグまでの手順まとめ - WESTA

Androidの各種ドライバをインストール | Androidのメモ帳 - 楽天ブログ

Oracleにダンプを入れてもらおうと頼んだら思いのほか大変だったはなし。

後輩に、コマンドを調べながら新規ユーザー(スキーマ)を作成してそこにダンプを入れてみて、と依頼したらいろいろ引っかかったのでその時のメモ。

環境:Windows10、Oracle11g

接続識別子が認識できないといわれる。

環境変数ORACLE_SID」が設定されていなかった。
というか「ORACLE_HOME」もなかったので設定することに。

ORACLE_HOMEの設定パスが分からない

ORACLEの本体がどこにあるか、について自分の記憶ベースで
「c:\app\ユーザー\product\オラクルのバージョン\dbhome_1」
にないですか?、と確認してもらったらなぜか無い。
どうやら場所が違って「c:\oracleexe」というフォルダに入っていた。
まあ、とりあえず現状優先で設定。

コマンド「impdp」を実行したが「ORA-39002: 操作が無効です」と言われる。

とりあえず、新規ユーザーは作成しているらしいが、
インポートしようとしているユーザと別のユーザでインポートしてたので、ユーザがちゃうんでない?と指摘。
(つまり権限がなかったもよう)

正しいユーザーでログインしようとしたら新規ユーザでログインができないことが発覚。
パスワードが間違っていたらしい。Create文を確認(コピペそのままで気が付かなかったらしい)。

CREATE USER [ユーザー名]
IDENTIFIED BY [パスワード];

パスワードを確認して再度ログインができることを確認

まだ同じエラーが出る

ダンプがどうも認識できていないようだったので、指定したパスにちゃんとファイルがあるかどうか確認。
新規にディレクトリを作成したのでパスとファイルの確認したら合ってる…。
試しにデフォルトのパス「DATA_PUMP_DIR」でやってみたら、エラーが変わった。

create or replace directory [ディレクトリオブジェクト] AS [ディレクトリオブジェクトのパス];

expコマンドでエクスポートしたダンプはimpdpじゃなくてimpでインポートする

(内部の引継ぎミスで)エクスポートコマンドがexpdpじゃなくてexpだったらしく、impdpからimpへ書き換え。

バージョンが違うんでないの?というエラーがでた

思い込みなのかなんなのか、開発環境は11gだって聞いていたのにダンプは12cからエクスポートしてきたらしい。
ダンプはバージョンの小さい方へは入れられないので、Oracle12cを入れなおすか、ダンプ情報を書き換えるしかない。

実は勉強用に用意しているのでダンプの情報を書き換えよう、ということになり、フリーのバイナリエディタをダウンロードしてバージョンを12→11へ書き換えてどうにかインポート成功。

結果

環境変数と権限の確認は大事。
Oracleのバージョンが違うとかちょっと酷い目にあった…そんな基本的なところでミスするとは思わなかった。

node.jsのバージョン管理

以前メモってたような気がしていたが気のせいだったみたいなのでメモっておく。

Macの人はnodebrewを使うらしいが、開発マシンはWindowsなので Nodistかnパッケージをインストールする。

とりあえずnパッケージ入れてみようとしたら

> npm install -g n

npm ERR! code EBADPLATFORM
npm ERR! notsup Unsupported platform for n@3.0.2: wanted {"os":"!win32","arch":"any"} (current: {"os":"win32","arch":"x64"})
npm ERR! notsup Valid OS:    !win32
npm ERR! notsup Valid Arch:  any
npm ERR! notsup Actual OS:   win32
npm ERR! notsup Actual Arch: x64

プラットフォームが合わないと怒られる。
nパッケージは32bitまでしか対応してないということで、気を取り直してnodistをインストール。
Windowsのインストールがある。(2019/04/26時点でv0.9.1)

Releases · nullivex/nodist · GitHub

Pathの設定までやってくれるので、インストールが終わったら早速コマンドプロンプトを開く。
安定版がv10.15.3だったのでこれを追加。

> nodist + 10.15.3

>nodist
  (x64)
 10.15.3
> 11.13.0  (global: 11.13.0)

バージョンを安定版に指定。

> nodist 10.15.3

>nodist
  (x64)
> 10.15.3  (global: 10.15.3)
  11.13.0

globalが変わっていればいOK.
※先にNode.jsを入れているとバージョンの切り替えがうまくいかないので、入れてしまったらアンインストールしておく。

vb.netメモ。

環境:
Visual Studio2015

LinqでGROUPBYしたい

指定期間で絞った中でGROUPBYでCOUNTのSUMを取りたい

TABLE=FOO

no name date_disp count
01 すずめ 20180301 4
02 めじろ 20180302 2
03 ひばり 20180301 1
01 すずめ 20180302 1
01 すずめ 20180312 5
02 めじろ 20180315 2
01 すずめ 20180322 1
Dim list_DB_ALL As SortableBindingList(Of TBL_FOO) ’FOOテーブルの結果をセット

Dim list_selection = list_DB_ALL _
          .Where(Function(x) x.date_disp > '20180301' And x.date_disp < '20180320' _
          .GroupBy(Function(x) New With {Key x.no, Key x.name },
             Function(k, x)
                     Return New TBL_FOO_SUM With {
                       .no= k.no,
                       .name= k.name,
                       .SUM_COUNT= x.Sum(Function(e) e.count)
                   }
                   End Function).ToList

項目2つでソートしたい

項目AAでソートしたあとに項目BBでソートするときは「ThenBy」を使う。
降順にする場合はOrderByDescending / ThenByDescending を使う。

Dim list= list_DB_ALL.
           Where(Function(x) x.AA= aa).
           OrderBy(Function(x) x.AA).
           ThenBy(Function(s) s.BB).ToList

コンストラクタでコントロールに対するカーソルの設定

MouseEnter時は「↔(左右)」カーソルにして、離れたら(Leave)通常のカーソルにする。

        AddHandler ラベル.MouseEnter,
            Sub(sender, e) Me.Cursor = Cursors.SizeWE
        AddHandler ラベル.MouseLeave,
            Sub(sender, e) Me.Cursor = Cursors.Default

小数点以下X桁を取得

ほんとはROUNDじゃなくてFLOOR(またはTRUNCATE)したかったけどできなかった。

Dim int_a As Interger = 30
Dim int_b As Interger = 31

' 30/31の結果を小数点以下3桁まで取る
'0.96774193 ≒ 0.968
Dim dec_diff As Decimal = CDec(Math.Round( int_a  / int_b , 3, MidpointRounding.AwayFromZero))

MidpointRounding.AwayFromZero以外にMidpointRounding.ToEvenがある。
この2つの違いは丸める方法の違いによる。
AwayFromZeroは四捨五入、ToEvenはバンカー丸め(銀行型丸め/最近接偶数への丸め)。

アプリケーションパス名を取得

'自分自身の実行ファイルのパスを取得する
Dim path As String
path = System.Reflection.Assembly.GetExecutingAssembly.Location

'ディレクトリ名の取得 = System.IO.Path.GetDirectoryName
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location)

HashTableで値からキーが取れない

www.atmarkit.co.jp

ハッシュテーブル内の値の取得は、上記と同様にインデクサ(VBではItemプロパティ)によりキーを指定して行う(逆に、値からキーを直接取得することはできない)。

という仕様らしい。

Javaと同じ感覚で作ってたので一部修正しなくては。
とほほ。

vb.net でSQLから計算結果を取得しようとしたら小数点以下がすっぽり落ちてしまった

環境

OS:Windows8.1
Visual Studio 2015
Oracle11g

やりかったこと

例えばある期間内の項目の件数を分(60)で割った値を取得したかった。

例)hogeテーブル

Code ActiveTime CountItem
001 2019-02-01 12:00:00 1
001 2019-02-01 12:01:00 1
002 2019-02-01 12:05:00 1
003 2019-02-01 12:07:00 1

SQL

--やや適当
SELECT SUM(CountItem ) / 60  as CountItem 
FROM hoge 
WHERE ActiveTime BETWEEN '2019-02-01 12:00:00' AND '2019-02-01 12:10:00' 

たとえばSQLを実行すると0.4が取れるとした場合、
vb上ではなぜか0になってしまう。
vbで受け取っている型はDecimal型。
※独自FWなのでvbは省略しますが、OracleDataReaderを使っても同様に小数点以下が落ちる。

結局60で割る処理を、SQLで計算するのではなく、vb側で実施することにして回避。
vb.netに慣れていないのもあるが、調べてても同様の事象を書いているサイトがなかった。
SQLであまり計算とかしないものなのかな。