matsukawar's blog

個人的な技術ブログ。テクニカルアーキテクトを目指しています。Twitter : https://twitter.com/matsukawar

Box API を C# で操作する

BOX API

BOX API は ファイルストレージのBOXをAPIで操作するための仕組みです。

公式サイトは以下の通り。

BOX API V2 JWT を C# で使う

早速、BOX V2 JWT の接続サンプルコードを作成しました。

色々調べましたが、結構、簡単なコードで完結しますので、エコシステムでクラウドストレージ連携をする場合など、シナリオによっては使う機会があるかもしれません。

 

How to use BOX Api in C# program.
I use JWT AOuth2 authentication for accessing to the BOX Api.

https://github.com/matsukawar/boxv2jwt

 事前準備

- BOX APIの管理画面で、トークン生成と設定ファイル(JSON)をダウンロードしておく。

キャンピングカーに乗りながら働く人 (Work + Camping = Workamper)

 アメリカではキャンピングカーや車で生活して仕事を探しながらキャンプ生活をする人たちの事を、ワーキャンパー(Workamper = Work + Camping)というそうです。

 家に縛られない暮らしをする、という一種のライフスタイルだと思いますが、家に縛られないと言えば、住居のサブスクリプション制サービスを思い出し、近しいものを感じました。

 

 また、この記事を見て、確かに、現在の行政システムや社会通念では「住所」が必須のものとなっているが、この「住所が無くてはならない」という縛りは、今後、あらゆるものがデジタル化された社会になると、あまり重要なものではなくなるのではないか?と思いました。どちらかというと、メールアドレスや個人番号(マイナンバー)の方が無くてはならない、物であると思いました。

Azure VM (Based CentOS 8)上にBitcoin core (bitcoind) を構築する

はじめに

Azure VM のラインナップでいつの間にか、Cent OS 8が使えるようになったので、Cent OS 8を構築してbitcoindを構築してみました。(完全に興味本位です)

 

準備するもの

  • Azure VM 1台
    Linux (centos 8.2.2004), Standard B1ms (1 vcpu, 2 GiB)
    OS領域に、30GB (Standard SSD)のディスクを1台(これはデフォルトです)
    +データ領域に、1TB (Standard HDD)のディスクを1台
    それ以外の課金サービスはすべてOFFにします。

    ※Standard HDD では同期が遅い?です。[経過報告]をご覧ください。

Installation

1. SELinuxの無効化

状況に応じて、SELinuxを無効化します。

# nano /etc/selinux/config
SELINUX=disabled

 これをいじった場合は、いったん、再起動します。

2. 追加ディスク(1TB)のフォーマットとマウント

Azureの管理コンソールからディスクをつなげただけでは、Linux上で使用できませんので、ディスクをフォーマットして、ディスクドライブ(/data) にマウントします。MSDNに手順が乗っているので、その通りにやります。

一応、コマンドの内容を書きます。

# lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"

# parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100%
# mkfs.xfs /dev/sdc1
# partprobe /dev/sdc1

# mkdir /data ※私の環境では「data」に名前を変えてます

# mount /dev/sdc1 /data

# blkid ※「/dev/sdc1」のUUIDを確認します

# vi /etc/fstab ※「/dev/sdc1」のUUID分を追記します

追記内容:UUID=XXX-XXX-XXX-XXX /data xfs defaults,nofail 1 2

 仮想サーバーを再起動後に、dfコマンドでディスクが認識されていれば成功です。

# df -h | grep sdc1
/dev/sdc1 1000G 7.1G 993G 1% /data

3. Extra Packages for Enterprise Linuxのインストール

以下のRPMをインストールするための事前条件となります。

# yum install -y epel-release

4. Crypto RPMs のインストール

# rpm -Uvh https://mirror.cryptorpms.com/cryptorpms/el8/x86_64/cryptorpms-release-1-1.noarch.rpm

5. bitcoin-server のインストール

bitcoin-server をインストールします。bitcoin-cliもはいる?みたいです。

# yum -y install bitcoin-server

6. バージョンの確認

以下bitcoindとbitcoin-cliのバージョンが表示されていることを確認します。

# bitcoind -version

bitcoin-cli -version

7. bitcoin.config の作成を行い、bitcoindの設定ファイルを作成する

~/.bitcoin/bitcoin.conf を新規で作成して、bitcoindの動作設定を行います。ここでdatadirというプロパティを先ほどの追加ディスクに変更しておきます。

# mkdir ~/.bitcoin/

# nano ~/.bitcoin/bitcoin.conf
# cat ~/.bitcoin/bitcoin.conf
mainnet=1
txindex=1
server=1
rest=1
rpcuser=user
rpcpassword=pass
rpcport=8332
datadir=/data

8. メインネットに繋いで同期をとる

以下のコマンドで同期開始となります。

# bitcoind -daemon
Bitcoin Core starting

恐る恐る、/data の中身を覗くと、データベースらしきファイルが作られているので、動いてそうです。

# dir /data
banlist.dat blocks database debug.log peers.dat
bitcoind.pid chainstate db.log indexes wallet.dat

9. 同期のステータスの確認

bitcoind の動機状態はbitcoin-cli で確認できます。

verificationprogress に 100.0 を掛けた値が同期の状況を表します。

# bitcoin-cli -getinfo
{
  "version": 200100,
  "blocks": 268848,
  "headers": 649324,
  "verificationprogress": 0.04731658186390384,
  "timeoffset": 0,
  "connections": 10,
  "proxy": "",
  "difficulty": 510929738.0161518,
  "chain": "main",
  "balance": 0.00000000,
  "keypoolsize": 1000,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "warnings": ""
}

 10. 最初のブロック情報の取得 (Get first Bitcoin Block info.)

同期が終わていないので、Bitcoinの最初のブロック情報を取得してみることにしました。トランザクションハッシュ値(TX-Hash)を取得します。

 # bitcoin-cli getblockhash 1
00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048

確認のため、Blockchain Explorer で検索した値と合っているか確認します。

→合っていました。

次に、ブロック情報を取得します。

# bitcoin-cli getblock 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048
{
  "hash":   "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048",
  "confirmations": 260438,
  "strippedsize": 215,
  "size": 215,
  "weight": 860,
  "height": 1,
  "version": 1,
  "versionHex": "00000001",
  "merkleroot": "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",
  "tx": [
    "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098"
  ],
  "time": 1231469665,
  "mediantime": 1231469665,
  "nonce": 2573394689,
  "bits": "1d00ffff",
  "difficulty": 1,
  "chainwork": "0000000000000000000000000000000000000000000000000000000200020002",
  "nTx": 1,
  "previousblockhash":   "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
  "nextblockhash":    "000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd"
}

ここで、新しい発見があったのですが、time : 1231469665Unix 時間で 2009/1/9 11:54:25 (金曜日) となります。私の誕生日と同じでした(どうでもいい話ですみません...)

経過報告

5日間動かしてみましたが、Standard HDD をつかっているせいか、なかなか同期が進みませんでした。Premium SSD (月額4500円程度かかります) は使いたくない為、あらかじめデータをDLする方式をとった方がいいかもしれません。

9/26 17時台

blocks : 361417, headers : 650044, verificationprogress : 0.12765

9/27 20時台 (27時間経過後)

blocks : 365378, headers : 650221, verificationprogress : 0.13426

 以上となります。

 

 

Azure DevOps TFVC(Team Foundation Version Control) 保留中の変更をワークスペースごと消したい場合の手順

Azure DevOps (旧Team Foundation Server)のTFVC(Team Foundation Version Control)にて、保留中のチェックアウトを根こそぎ消したい場合の手順を記します。

  1. スタートメニューの「開発者コマンドプロンプト」を管理者権限で実行する。
  2. 該当者のワークスペースを検索する。(WORKSPACESコマンド)
    C:\Windows\System32>tf vc workspaces /owner:DOMAIN\USER /collection:ttp://SERVER_ENDPOINT/COLLECTION_NAME
    コレクション: ttp://SERVER_ENDPOINT/COLLECTION_NAME
    ワークスペース        所有者          コンピューター       コメント ---
    WORKSPACE_NAME USER_NAME COMPUTER_NAME
  3. 内容を確認して、「Yes」を入力して、該当者のワークスペースを消す。(WORKSPACEコマンド※WORKSPACE"S" ではないです。)

    C:\Windows\System32>tf vc workspace /delete /collection:ttp://SERVER_ENDPOINT/COLLECTION_NAME WORKSPACE_NAME;DOMAIN\USER /login:ADMIN_ID,ADMIN_PW
    削除されたワークスペースは復元できません。
    サーバー 'ttp://SERVER_ENDPOINT/COLLECTION_NAME' のワークスペース 'WORKSPACE_NAME;DOMAIN\USER' は、105 の保留中の変更を含んでいます。
    ワークスペースを削除しますか? (Yes/No) Yes 

 

Trailheadで学習してみる「Apex の使用開始」

Salesforceにも、Lumira Designerの様にJavaライクな独自言語があるみたいですね。簡単なチュートリアルをやったので、回答を作ってみました。

【Practical New ABAP : 01】2つの構造が異なる内部テーブルをマージして重複を削除する

はじめに

ABAP 7.4 にて、2つの内部テーブルをマージする必要があったのでNew ABAPで書いてみました。実践でも使えるNew ABAPの文法だと思います。(Merge two internal tables with different structures to remove duplicates)

Program

  1. Initialize variables and types

TYPES:
  BEGIN OF LINE,
    X1 TYPE I,
    X2 TYPE I,
    X3 TYPE I,
  END OF LINE,
  TYP_ITAB1 TYPE STANDARD TABLE OF LINE WITH DEFAULT KEY,


  BEGIN OF LINE2,
    X1 TYPE I,
    X2 TYPE I,
    X3 TYPE I,
    X4 TYPE C,
  END OF LINE2,
  TYP_ITAB2 TYPE STANDARD TABLE OF LINE2 WITH DEFAULT KEY,


  BEGIN OF LINE3,
    X3 TYPE I,
    X1 TYPE I,
  END OF LINE3.


DATA(ITAB1) = VALUE TYP_ITAB1(
                        ( X1 = 1 X2 = 1 X3 = 1 )
                        ( X1 = 2 X2 = 1 X3 = 2 )
                        ( X1 = 1 X2 = 2 X3 = 3 ) ).


DATA(ITAB2) = VALUE TYP_ITAB2(
                        ( X1 = 2 X2 = 6 X3 = 2 X4 = 'A' )
                        ( X1 = 3 X2 = 1 X3 = 3 X4 = 'B' )
                        ( X1 = 3 X2 = 2 X3 = 4 X4 = 'C' ) ).

  1. Old (Current) ABAP Program

TYPES TYP_ITAB3_LEG TYPE STANDARD TABLE OF LINE3.

DATA ITAB3_LEG TYPE TYP_ITAB3_LEG.

 

MOVE-CORRESPONDING ITAB1 TO ITAB3_LEG.
MOVE-CORRESPONDING ITAB2 TO ITAB3_LEG KEEPING TARGET LINES.

SORT ITAB3_LEG BY X1 X3.
DELETE ADJACENT DUPLICATES FROM ITAB3_LEG COMPARING X1 X3.

  1. New (7.4) ABAP Program

TYPES TYP_ITAB3_NEW TYPE SORTED TABLE OF LINE3

                WITH UNIQUE KEY PRIMARY_KEY COMPONENTS X1 X3.


DATA(ITAB3_NEW) = CORRESPONDING TYP_ITAB3_NEW(
                       BASE ( CORRESPONDING TYP_ITAB3_NEW( ITAB1 ) ) ITAB2

                                  DISCARDING DUPLICATES ).

 

github.com

 

なお、ABAP 7.42からは、内部テーブルに対してOpen SQLを使用できるようになりましたので、こちらのバージョンを使っている場合は、Open SQLで内部テーブルを処理する方法も検討できます。(In addition, since ABAP 7.42, Open SQL can be used for internal tables, so if you are using this version, you can also consider how to handle internal tables with Open SQL.)

 

Thank you, and Enjoy.

matsukawar

SAP GUI for Windows へのVBSログインスクリプト

はじめに

SAPの導入企業は、システム構成として、スリー・ランドスケープの構成をとります。開発機・検証機・本番機の3システム構成です。また、各システムの中に、異なるデータ層を持つ、クライアントを有し、開発者は、クライアントを頻繁に切り替えて開発を行うことになります。

 

そこで、ワンクリックでログインができないものか?ということで、SAPのGUI Scriptingという機能を使って、ログインを行うVBSスクリプトを作りました。

スクリプト

github.com

試行錯誤したところ

  • 異なるログイン画面が複数開いていてもログイン処理を実行したい。
  • そのために、各ログイン画面の横のクライアント一覧にログインしようとしているクライアントの番号があるか?探して、あればログイン処理を行うように作成。