hide's memo
27 5月, 2022

HttpWebRequest の Timeoutを伸ばす

[English]

HttpWebRequestのデフォルトタイムアウトは100秒である。
そのため、HttpWebRequest.GetResponse() は、相手側サーバが100秒以上かかるとタイムアウトしてしまう。

タイムアウトを伸ばすには、

HttpWebRequest.Timeout に長い時間を指定するが、指定する場所に注意が必要。

もし、POSTを使ってリクエストを投げる場合、
GetRequestStream()を呼び出すよりも前に、Timeoutを指定する必要がある。

using System;
using System.Web;
using System.Net;
using System.Text;
using System.IO;

namespace ConsoleNetFramework
{
class Sample
{
static void Main(string[] args)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(“http://localhost/slow”);

request.Method=”POST”;
byte[] postData = System.Text.Encoding.ASCII.GetBytes(“message=hello”);

 request.Timeout = 3*60*1000; // “GetRequestStream()”.よりも前でタイムアウトを設定す
Stream writeStream = request.GetRequestStream();
 request.Timeout = 3*60*1000; // “GetRequestStream()” よりも後で指定しても無効

writeStream.Write(postData, 0, postData.Length);

HttpWebResponse response;
// Get Response… ここでタイムアウトが発生する
 response = (HttpWebResponse)request.GetResponse(); 

Stream receiveStream = response.GetResponseStream();
StreamReader sr = new System.IO.StreamReader(receiveStream, System.Text.Encoding.GetEncoding(“utf-8”));
Console.WriteLine(sr.ReadToEnd());
}
}
}

 

 

 

28 4月, 2022

PostgreSQLをADFのシンクとして使用する方法(Azure Data Factory)

[English]

ADFではPostgreSQLをシンクとして使用するためには、セルフホステッド統合ランタイムを使用する必要ある。
そのため、まずはセルフホステッド統合ランタイム環境を構築する。
(セフルホステッドランタイムとは(Azure Data Factory) を参照)

また、PpostgreSQLをシンクのリンクサービスとしては使用できないので、
ODBCをリンクサービスとして使用する必要があり、構成としては下図のようになる。

 

■Step1

PostgreSQLのODBCドライバをインストールするする。

(1)PostgreSQL ODBC ドライバをダウンロードする
(1.1) https://www.postgresql.org/ にアクセス
(1.2)”Download” -> “File Browser” -> “odbc” -> “versions” -> “msi” の順でリンクをたどる。
(1.3)psqlodbc_13_02_0000-x64.zip をダウンロード (最初、Version 9.2. で試したがADFトン連携でうまく動かなかった)

(2)ODBC ドライバをインストールする

■Step2

(1)コピーアクテビティのシンクのデータセットに”ODBC” を選択
(2)ODBCのリンクサービスを以下のように設定

 

17 4月, 2022

MacBook Air(M1 macOS Monterey 12.0.1)でDBD::mysql

[English]

色々と試行錯誤したため、以下のやり方で利用可能となるか確信がないが、メモとして記述。

Dockerを使った手順は以下のリンクを参照。
apache + perl + cgi + mysql(DBD::mysql, DBI)環境をMacBook Air(M1)のDockerに構築

 

 

(1)  brew install openssl
(2) ~/.zshrcに以下を追加

export LIBRARY_PATH=/opt/homebrew/opt/openssl/lib
export C_INCLUDE_PATH=/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level/auto/DBI/
export CPLUS_INCLUDE_PATH=/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level/auto/DBI/

(3)source ~/.zshrc
(4)DBI-1.643.tar.gzをダウンロードしてインストール
(4.1)GET https://www.cpan.org/modules/by-module/DBI/DBI-1.643.tar.gz
(4.2)任意のディレクトリで解凍
(4.3)perl Makefile.PL
(4.4)make
(4.5)make install

(5) cpan install DBD::mysql

 

■補足

(1)~/.zshrc へのパスの追加について

export LIBRARY_PATH=/opt/homebrew/opt/openssl/lib

-> cpan install DBD::mysql で “Can’t link/include C library ‘ssl’, ‘crypto’, aborting.”となるのを避けるため。

export C_INCLUDE_PATH=/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level/auto/DBI/
export CPLUS_INCLUDE_PATH=/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level/auto/DBI/

-> ‘DBIXS.h’ file not foundを避けるため

DBI-1.643.tar.gzをインストールする理由
->以下の情報を参考にした。
https://stackoverflow.com/questions/68774807/dbdmysql-installation-on-catalina-big-sur-fail-with-extern-h-file-not-found

Dockerを使って環境を作りたい場合、以下も参照のこと。

apache + perl + cgi + mysql(DBD::mysql, DBI)環境をMacBook Air(M1)のDockerに構築

15 4月, 2022

セフルホステッドランタイムとは(Azure Data Factory)

[English]

セルフホステッドランタイムは、下図のように
自分のWindoowsPCや、自分が管理しているWindowsサーバ上で、ADFのパイプラインの一部を動かすことができる。
そのため、イントラ内の情報にアクセスしたい場合には、セフルホステッドランタイムをイントラ内で動かすことでアクセス可能になる。

 

7 4月, 2022

Salesforceでリフレッシュトークを取得する

[English]

Salefoorceで、365日に設定したリフレッシュトークンを取得する例

(1)Salesforceにログイン

(2)Classc UIに変更(Lightningでも可能と思われるがわからないので)

(3)「設定」→画面左ペインで「ビルド-作成-アプリケーション」→右ペインで接続アプリケーションの「新規」を押す

(4)以下の画面の例のように設定する。

(4.1)接続アプリケーション名は “abc”

(4.2)API参照名は”abc”

(4.3)取引責任者は自分のメールアドレス

(4.4)OAuth設定の有効化にチェック

(4.5)選択したOAuthの範囲:テスト時はフルアクセス+いつでも要求を実行(refresh_token…)
注意!! これはサンプルです。実際に利用する際は権限の範囲は検討してください。

(4.6)WEBサーバフローの秘密が必要にチェック

(4.7)開始URLに、自分のSalesforceのURL

以上で保存し、以下の画面の「コンシューマ鍵」「コンシューマの秘密」をコピーする

(5)設定→画面左ペインの「アプリケーションを管理する – 接続アプリケーション」で”abc”を選択

(5.1)ポリシーを編集ボタンを押す

(5.2)更新トークンポリシーで「次の時間が経過したら更新トークンを有効期限切れにする」を365日を設定する。

 

(6)Salesforceにアクセスしているブラウザ(セッションがあるブラウザ)で以下のURLを入力

https://****.my.salesforce.com/services/oauth2/authorize?response_type=code&client_id=****&redirect_uri=http%3A%2F%2Flocalhost

サーバ名は自分のSalesforceのサーバ

client_idは自分のクライアントID(コンシューマ鍵)

(6.1)以下のように確認画面がでるので「許可」を押す。

 

(7)以下のようにリダイレクトされるので、code=****の部分を保存

http://localhost/?code=*****

 

(8)以下のシェルを書いて実行する。

#!/bin/sh
CLIENT_ID="コンシューマ鍵"
CLIENT_SECRET="コンシューマの秘密"
SERVER="自サーバ.my.salesforce.com"
CODE="上記 (7)で取得したコード"

#GET REFRESH TOKEN
curl -X POST https://$SERVER/services/oauth2/token -d "grant_type=authorization_code" -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" -d "code=$CODE" -d "redirect_uri=http%3A%2F%2Flocalhost"

上記シェルを実行すると以下の結果が取得できる。

{"access_token":"***","refresh_token":"***","signature":"****","scope":"refresh_token full","id_token":"","instance_url":"https://***.my.salesforce.com","id":"https://login.salesforce.com/id/******","token_type":"Bearer","issued_at":"*****"}

 

上記jsonの、refresh_tokenが取得しようとしたリフレッシュトークンとなる。

25 3月, 2022

WebAccessアクテビティの出力 (Azure Data Factory)

あるWebAPIが jsonを返す場合に、レスポンスボディの内容によって、

Azure Data Factoryの WebAccessアクティビティに格納される情報が以下のように変わる。

1. 完全に空(0バイト)の場合のWebAccessの出力配下のようになる

{
   "Response" :"",
   "ADFWebActivityResponseHeader"  : {
       "Date" : ....
          :
   },
   "effectiveIntegrationRuntime" : "xxxxx",
   "executionDuration" : 0,
    :
}

上記のような結果になるので、@activity(‘Web’).output.Responseで内容を取得可能

 

2. かっこしかない場合

ResopnseBodyの内容

{}

WebAccessの出力結果は、以下のように”Response”がないので@activity(‘Web’).output.Responseでアクセスできない。(落ちる)

{
   "ADFWebActivityResponseHeader"  : {
      "Date" : ....
        :
    },
    "effectiveIntegrationRuntime" : "xxxxx",
    "executionDuration" : 0,
        :
}

 

3.配列のフィールドが1つだけ

{ "data" : [ ] }

WebAccessの出力結果は、以下のようになる。@activity(‘Web’).output.dataで配列にアクセスできる。

{
   "data" :[],
   "ADFWebActivityResponseHeader"  : {
      "Date" : ....
         :
   },
   "effectiveIntegrationRuntime" : "xxxxx",
   "executionDuration" : 0,
      :
}

4. 配列の中身がある

{
  "data" : [
     {
        "name" :" aaa",
        "score" : 30
     }
   ]
}

WebAccessの出力結果は、以下のようになる。@activity(‘Web’).output.dataで配列にアクセスできる。

{
    "data" : [
        {
            "name" :" aaa",
            "score" : 30
         }
   ],
   "ADFWebActivityResponseHeader"  : {
      "Date" : ....
        :
   },
   "effectiveIntegrationRuntime" : "xxxxx",
   "executionDuration" : 0,
      :
}
5 3月, 2022

REST-APIでデータを取得(SELECT文使用) Salesforce

[English]

SalesforceからREST-APIでデータ取得するサンプル

Userオブジェクトから、最終更新日が 2022/3/5 15:03:00(JST)以降のデータのNameを取得する例。

以下の例の中の$ACCESSはアクセストークン。この取得方法は “Salseforceのデータをcurlで取得” を参照。

DATE="2020-03-05T15%3A03%3A00%2B09%3A00"
curl -H "Authorization: Bearer $ACCESS" "https://$SERVER/services/data/v50.0/query/?q=SELECT+Name+from+User+where+LastModifiedDate%3E$DATE"

Name,Fax,Division,SIgnatureを取得する。

DATE="2020-03-05T15%3A03%3A00%2B09%3A00"
curl -H "Authorization: Bearer $ACCESS" "https://$SERVER/services/data/v50.0/query/?q=SELECT+NAME%2CFax%2CDivision%2CSignature+from+User+where+LastModifiedDate%3E$DATE"
4 3月, 2022

CopyアクティビティのソースにRESTを設定し、動的なURLを指定する(Azure Data Factory)

[English]

Copy アクティビティのSRC、REST-APIのURLに変数を使う方法。

1. DataSet を作成。
1.1. リンクサービスはREST でベースURLはなんでもよい(例 http://localhost/)
1.2. パラメータを新規追加、例として変数名を URLとする。

 

1.3. 接続の相対URLを、@dataset().URLとする

 

2. パイプライン作成
2.Copyアクティビティ追加
2.1. SRCを選択
(1)SRCに、上記1 の DataSetを選択
(2)データセットのプロパティの部分に、URLが出てくるてので、指定したい値をセットする。

28 2月, 2022

NTML認証を行うサンプルコード(ASP.NET)

[English]

AST.NETでNTML認証+DAVに対してPROPFINDを行うサンプル

Imports System.Net
Imports System.IO
Imports System.Configuration
Imports System.Data
Imports System.Text

Partial Class _Default
    Inherits System.Web.UI.Page
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim req As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create("http://hogehoge.com/hoge/hoge/"), System.Net.HttpWebRequest)
        req.Credentials = New System.Net.NetworkCredential(TextBox1.Text, TextBox2.Text)
        req.Method = "PROPFIND"
        req.ContentType = "text/xml"

        Dim res As System.Net.HttpWebResponse = CType(req.GetResponse(), System.Net.HttpWebResponse)

        Dim st As System.IO.Stream = res.GetResponseStream()
        Dim sr As New System.IO.StreamReader(st)
        Dim txt As String = sr.ReadToEnd()
        sr.Close()
        st.Close()
        TextBox3.Text = txt
    End Sub
End Class
27 2月, 2022

JMeterで大量の個別ユーザを扱う

[English]

JMeterで、下図のように大量の別々のユーザを用意し、

 

それぞれが個別のユーザIDを使って、ログイン、ページアクセスを行うようなJMeterの設定方法

 

 

1.ユーザ情報(ID/Passwd)を記載したTXTファイルを用意する

ファイルの中身は、以下のようにIDとパスワードをタブ区切りとする。

user001 passwd001
user002 passwd002
user003 passwd003

 

2. JMeterを以下のように設定する

 

(1)User Defined Variable

uid,passwd 変数を追加

(2)HTTP Cookie Managerを追加

(3)Transaction Controllerを追加

(3.1.)BeahShell PreProcessorを追加。中身を以下のように記述する。

int threadNum = ${__threadNum}; 
String filename = "users.txt"; // 必要に応じてフルパスにする

String data;
BufferedReader br = new BufferedReader(new FileReader(filename));
String uid="";
String passwd="";

// 自分のスレッド番号に一致した行を読み込む
int num=0;
while((data = br.readLine())!=null){
  String[] token = data.split("\t");
  uid = token[0];
  passwd = token[1];

  num++;
  if(num == threadNum){
    break;
  }
}
br.close();

vars.put("uid",uid);
vars.put("passwd",passwd)

 

(3.2) HTTP Requestを追加

本例では、http://localhost/cgi-bin/login.cgi というURLに、id=xxx, passwd=yyy というパラメータでPOSTするとログインするような画面を想定している。

アクセスURL:http://localhost/cgi-bin/login.cgi

HTTP Request:POST

Parametersに以下を追加

uid    ${uid}

passwd    ${passwd}

 

(4)Loop Controllerを追加

(4.1)HTTP Requestを追加し、ページ1へのアクセスを追加

(4.2)HTTP Requestを追加し、ページ2へのアクセスを追加

 

user.txtの数だけスレッド数を増やすことが可能。