hide's memo
9 4月, 2023

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

[English]

OAuth2.0 Authorization code flow を使って リフレッシュトークンを取得する方法。

 

(1)servicenow 上でエンドポイントを作成
(1.1)自分の servicenow にログイン
(1.2)System OAuth -> Application Registory
(1.3)Newボタンを押す
(1.4)”Create an OAuth API endopint for external clients” を選択
(1.5)以下の例のように指定してエンドポイントを作成

(2)Get Access code
(2.1)ブラウザを起動
(2.2)以下のURLにアクセスする。

https://${YOUR_INSTANCE}.service-now.com/oauth_auth.do?response_type=code&redirect_uri=https%3A%2F%2Flocalhost%2Ftest&client_id=${YOUR_CLIENT_ID}&grant_type=authorization_code&state=123

* redirect_url ... https://localhost/test (上記(1.5)で指定したリダイレクトURL)
* state ... 123(適当な文字列)

 

(2.3)以下のようなログインページが表示されるのでログインする(すでにservicenowにログインしている場合は表示されない)


(2.4)”Allow”ボタンを押す。


(2.5)localhostへのリダイレクトは失敗するが、アドレスバーから認可コードを取得できる。


(2.6)認可コードをメモする。

(3)アクセストークンとリフレッシュトークンを取得する。
(3.1)以下のようなシェルを用意する。

#!/bin/sh

MY_INSTANCE="**** YOUR INSTANCE ****"
CLIENT_ID="**** YOUR CLIENT ID ****"
CLIENT_SECRET="**** YOUR CLIENT SECRET ****"
REDIRECT_URI="https%3A%2F%2Flocalhost%2Ftest" # (上記(1.5)で指定したリダイレクトURL)
STATE="123" # 上記(2.2)で指定した文字列
CODE=$1

RESULT=`curl -X POST https://${MY_INSTANCE}.service-now.com/oauth_token.do -d "grant_type=authorization_code" -d "code=${CODE}" -d "redirect_uri=${REDIRECT_URI}" -d "client_id=${CLIENT_ID}"\
-d "client_secret=${CLIENT_SECRET}" -d "state=${STATE}"`

echo $RESULT

 

(3.2)上記シェルを、引数に (2.6)でメモした認可コードを指定して実行する。
(3.3)以下のようなjsonを取得できる。その中にリフレッシュトークンが含まれる。

{“access_token”:”***********”,“refresh_token”:”*******”,”scope”:”useraccount”,”token_type”:”Bearer”,”expires_in”:1799}

■リフレッシュトークンを使ってservicenow のREST-APIにアクセスする

以下のリンクを参照。

ServiceNowのデータをcurlで取得

6 4月, 2023

Fiddler

[English]

HTTPパケットをキャプチャできるツール。
下図のように、WEBブラウザがサーバに対してどのようなリクエストを送信し、どのようなレスポンスを受信しているのかを確認することができる。
また、HTTPリクエストおよびレスポンスを改ざんすることもできる。

 

■HTTP通信の確認

基本的な使い方は、下図の通り。
(1)画面左ペインに、HTTP通信が表示されるので、確認したい通信を選択
(2)画面右ペインで、”Inspectore”タブを選択する
(3)”Raw”を選択する
(4)画面右側上段に、HTTPリクエストの内容が表示される。
(5)画面右側下段に、HTTPレスポンスの内容が表示される。

 

 

■HTTP通信の改ざん

(1)下図のように、Rules -> Automatic Breakpoints -> Before Request を選択すると、
HTTPリクエストを送信する前に、Fiddlerが保留するようになる。
(2)ブラウザ操作で、HTTPリクエストが送信される際に、Fiddlerがリクエストを保留するので、
変更したいリクエストをリストから選択。
(3)HTTPリクエストの内容を変更する。
(4)Run to Completionボタンを押す。

全てのリクエストの送信が保留されるので、変更する必要がない通信も、上の操作で Run to Completionボタンを押す必要がある。

 

 

■Fiddlerの結果をJMeterに利用する

(1)Fiddlerでキャプチャした通信を Exportする。


(2)JMeterで、(1)のファイルをインポートする。

インポートすると、親切にも一般的なWEBアプリケーションのテストでほぼ確実に必要なCookie Managerが初めから設定される。またView Result Tree も設定されているので、すぐに確認できるのも親切。ただ、スレッドグループが初めから 10スレッドなどになっているので、動作確認には向かない。まずは、スレッドを全部1にして、インポートしたシナリオが動くことを確認するのがいいと思う。

6 4月, 2023

英語の勉強

オンライン英会話を続けるコツ

英語を話せるようになりたいと思った時、まっさきに皆さんが思いつくのは英会話スクール、最近ではオンライン英会話だと思います。
私も、オンライン英会話を続けて2年になります。1回のレッスン25分を、週に5〜6回参加していますが、英会話のレッスンを続けるのはなかなか大変ですよね。

そこで、なんでも三日坊主になってしまう私が、この2年ほど英語のレッスンを続けてきた上で、こんなやり方をすれば、辛い思いをせずに英会話レッスンを続けられるというのをご紹介したいと思います。
(特定の英会話スクールの宣伝をするものではないため、私が入会している具体的な英会話スクールや使用しているアプリについての詳細は差し控えさせていただきます。)

 

1.自分について

英語を勉強し初めて3年半、具体的な成果をTOEICの成績でご紹介します。

TOEICの点数は、某リクルートのTOEIC学習用オンラインアプリが絶大な効果がありました。 ただ、2019年12月時点で 815点をとっていますが、当時はあまり英語の内容を理解できておらず、単に試験のコツを覚えて点をとったように思います。逆に言えば、なんでもいいからTOEICで800点以上取りたい!別に英語を話せなくてもいい!という方は、某リクルートのTOEIC学習用オンラインアプリは非常に効果的かもしれません。

 

 

2.英会話にチャレンジするも玉砕

2020年6月に、初めてオンライン英会話にトライしました。しかも、いきなりフリートークに挑戦。
その時は TOEICがLRだけとはいえ、815点あったので、多少はなんとかなるだろうと思っていましたが、実際には、超簡単なあいさつすらまともにできず、ほとんど会話になりませんでした…..そもそも、英語を「話す」ということをやっていないので、何か言おうと思っても、何も頭に思い浮かばない状態でフリーズしてしまいます。先生はなんとか話をしようと努力してくれますが、それに応えるだけの力もなく、長い沈黙が何度も発生し、そのまま終了…. たった25分が地獄のように長く感じました。その後、しばらくは、レッスン中の沈黙がトラウマになり、会費だけ払ってレッスンに参加しない状態が続きました。

 

 

 

3.英会話を真剣にやり始める。まずはテーマトークから

2021年9月、会費ももったいないし、やはり英語が話せるようになりたい!と思い、レッスンに参加することを決意。
私が受講しているオンライン英会話は、フリートーク以外にも、あらかじめテーマに沿った質問を先生がしてくれるという授業もあり、まずはそれに挑戦。
事前に話すテーマや質問される内容がわかっているので、予習することで何も答えられないという状態を避けることができます。例えば、こんな感じ

本について

(1)本を読むのは好きですか?
(2)最近読んだ本はなんですか?
(3)その本の著者は?またどんな内容?
など

このような質問が5-10個程度あるので、レッスン前に30分から1時間、事前に回答を考えておきます。
その際、私は、以下の流れで回答を作りました。

(1)いちから自分で英語で考えて作る。
(2)作った英語の回答を Google 翻訳で日本語にする。意味が通らなかったらやり直し。
(3)意味が通ったら、できた日本語を逆に英語に翻訳。
(4)最初に自分で作った英語と Google翻訳の英語を比較して、自分の文書を修正。

 

英会話では、自分で英語を作る練習は非常に重要だと思います。実際のレッスンと同じくらい、予習で英語を自分で作り出すという作業が
「英語を話せるようになる」ためには重要だと思いました。
また、質問の中には、そもそも日本語で聞かれても簡単には答えられない(事前に調べないとわからない)ような質問もありました。

 

 

 

4.フリートークに挑戦

全部で100種類程度あったテーマに沿ったレッスンを全部終えたので、フリートークに挑戦です。フリートークといっても、本当になんの準備もなしに会話するのは難しので、あらかじめ話そうと思う内容を事前に作っておきます。(たとえ日本語でも、知らない人といきなり話をしろと言われても困りますよね…
それが英語だと、共通の話題や知識もないので、なおさら話が弾まないという状態になってしまいます)かと言って、授業の度に、好きな映画や音楽、趣味の話ばかりでは、間が持たないですよね。私が参加しているオンライン英会話は、フィリピン人の先生ばかりなのです、フィリピンの人と話が弾むようにということから、以下を心がけています。

(1)フィリピンのニュースを読む。

マニラタイムズや、セブデイリーニュースなど、フィリピンの話題を事前にみて、どんな話をすれば会話が弾みそうか調べることができます。私の参加している英会話はセブ島の先生が多いので、セブデイリーニュースと、マニラタイムズを主に見ています。
https://www.manilatimes.net/
https://cebudailynews.inquirer.net/

これらのニュースを読み、話そうと思うテーマを決めたら、
「こないだ、マニラタイムズでこんな記事を読んだのですが….」みたいな流れで話をしていきます。先生も、自分も国のことを知ってくれていれば嬉しいですし、話も盛り上がりますよね。

 

(2)事前に話す内容を英語で作っておく。

英語の文書の作り方は、テーマトークと同じです。
この方法だと、事前に用意した英語しか喋れないんじゃないの?と思うかもしれませんが、実際には、先生も話に沿って、色々と質問してくれます。その中には予想してない内容があったりしますので、

・事前に用意した英語をベースに話をする
・その場で質問された内容に臨機応変に応える(または、多少、用意しておいた回答と混ぜ合わせて応える)

のようなことも可能です。あとで、私が用意したテーマで、先生と話が弾んだものを少しご紹介します。

 

(3)授業の内容をメモにとる

授業を受けた後、以下の内容を記録します。

・授業を受けた日
・先生の名前
・話をした内容
・話しやすかったか?会話が弾んだか?

やはり、先生によって相性もあるので、どれほどこちが努力しても、常に会話が弾むわけでもありませんし、
ちょっと話が盛り上がりにくい先生だなと感じることもあるかもしれません。上のような記録があれば、次にレッスンを受ける時に、どの先生を選ぶか、どの先生を避けるかの参考になります。また、オンライン英会話は、数十人から数百人の先生がいて、同じ先生のレッスンを何度も受けることもあります。
その場合に、以前話した内容と同じことを質問したり、話題にしてしまうことを避けることができます。

 

(4)避けたいこと

政治的な話題は、盛り上がる時と微妙な空気になることの両極端なため要注意。

 

 

 

5. フィリピンの先生と盛り上がったテーマ

・トンネルや橋で島同士を繋ぐことをどう思う?

フィリピンは、多くの島で構成された国。そのため、移動するには船や飛行機に乗る機会が多くあります。
そこで、フィリピンの中でも比較的大きな島をトンネルや橋で繋ぐとすごく便利じゃない?という話をしたところ

「そうだね、橋で繋がったら絶対に便利!!」
「島々が橋で繋がったら、フィリピンはもっと団結できる!!」
「便利だけど、既存の船の仕事を奪う、地域の独立性を保つためにも今のままがいい」
「便利だけど、船や飛行機で島を超えるのがフィリピン。今のままがいい」

など、先生によっていろいろな意見がもらえて面白かったです。また、日本列島は全部トンネルか橋で繋がっている話や、青函トンネルは1960年代にできた、50km以上あるトンネルという話をすると、「通過するのに何時間くらいかかる? 料金はいくらとられる?」ととても興味を持ってくれました。

 

・大統領選挙

フィリピンでは、2022年5月に大統領選挙がありました。日本でも有名な、マニー・パッキャオも出馬していたこともあって
「パッキャオの出馬をどう思いますか?」のような話をすると、「彼はフィリピンの英雄でいい人だけど、政治家としては..」のような自身の考えを色々聞かせてくれました。

 

・クリスマスソング

フィリピンでは、9月頃からクリスマスソングが街中で流れ始めます。ホセ・マリーチャンという歌手の「christmas in our hears」という曲が人気なのですが、
その曲の歌詞に、「子供がクリスマスにランタンを売ってる」というものがあり、日本人の私には少し悲しいものにも聞こえたので、その感想を話したら、

「そんなことないよ! 子供もランタンを売るのを楽しんでるよ!」という先生もいたり、
「その通りだよ、貧しい家の子供の話だよ」という先生もいたりで、

先生も喜んで色々と話をしてくれたり、自分の子供の頃の思い出を話してくれました。

 

・昔はよかった的な話

私は若い先生(20代)のレッスンを受けることが多いのですが、それでも、インターネットのない子供時代のほうが、人間関係が濃くてよかったという話をする人が結構います。そこで、インターネットやコンピュータの発達でよかったことや、逆に悪くなったこと(家族で同じテレビを見て盛り上がったり出来なくなったなど)の話をすると、みなさん、同意してくれて、話が盛り上がりました。

 

・食べ物

フィリピンには、ジョリビーという、マクドナルドよりも人気のあるファストフードチェーンがあります。ほとんどの先生はジョリビーのほうが好きと答えてくれましたが、たまにマクドナルドの味の方が好きという先生もいました。また、フィリピンのスバゲッティは基本的に甘いので、その辺りの話も弾みました。

 

・日本語、漢字

先生は、基本的に親日だったり、日本に興味がある人が多いので、フィリピンの話以外に日本について話すと興味を持ってくれることも多いです。

例えば、私は「日本人は、ひらがなばかりの文書は読むに苦労する」(ですよね?漢字が入ってない文書は読みづらいですよね?)という話をすると、「ひらがなだけの方が簡単だと思ってた!なんでそうなるの?」と興味を持ってくました。この話は興味を持ってくれる先生が多かったので、以下のようなプレゼン資料を作って、先生相手にプレゼンをしてみようと考えています。英語でプレゼンする勉強にもなりますしね。

 

 

 

6. フィリピンの先生と盛り上がらなかったテーマ

・フィリピンで人気のないスポーツ

テニスの全米オープンで、フィリピンの女子選手が優勝したので、きっと盛り上がるだろうと思って話題にしたら、テニス自体に人気がなく、ほとんど誰も知らなかったので盛り上がらなかったです。サッカーも人気がないので、ワールドカップをやってること自体知らない先生もいました。

 

・アニメ

日本のアニメはフィリピンでも人気ですが、私も50を過ぎており、英語の先生もみなさん成人しておられるので、アニメの話で盛り上がるのは厳しいなと思いました。

 

 

 

7. 物議を醸すテーマ

政治的な話題は難しいです。フィリピン沖で中国の船が活動したり、領海に入り込んでいる話をしたところ、
「中国はフィリピンを侵略しようとしている!」という話で非常に盛り上がった先生がいた一方、
「それは難しい話題ですね… フィリピンには中国人が社会のいろいろなところに入り込んでいるので…」
のような歯切れの悪い、微妙ば空気のレッスンになりました。何度も授業を受けて、とても親しくなった先生でなければ避けた方がいい話題だなと思いました。

 

 

 

8. 最後に

たとえ話が盛り上がらなくても、違う先生だと話が盛り上がったりします。失敗しても気にせず、どんどんレッスンを受けましょう!

 

 

 

25 3月, 2023

HTMLで画像を右から左に整列させる

[English]

以下のように、画像を右から左に整列させる場合、

 

 

 

 

 

 

 

 

 

 

 

 

 

以下のHMTLのように<p> タグの dir 属性に “rtl”を指定する。

<html>
<body>
<p dir="rtl">
<img src="001.png">
<img src="002.png">
<img src="003.png">
<img src="004.png">
<img src="005.png">
<img src="006.png">
<img src="007.png">
</p>
</body>
</html>
18 3月, 2023

adidas ADIZERO BOSTON 11

[English]

2023年3月、新しいジョギングシューズとして、アディダス アディゼロボストン11を購入したが、

このシューズで走ると、右足の甲が非常に痛い。靴紐を緩めても全然だめ。

アディダスのランニングシューズは初めてだが、この靴はシュータンが靴底に固定されており、それがきつい。

そのため靴紐を緩めても甲の圧迫が解消されず、どうしようもないので、シュータンと靴底を切ってしまった。

特に問題はなく、痛みも解消し快適にジョギングできるようになった。

16 3月, 2023

csvをjsonに変換するサンプル

CSVをjsonに変換するサンプル。
また、CSVにはない独自のキーを追加したり、文字列をIntegerに変換したり、文字列をBooleanに変換できます。

[English]

import csv
import json
import sys

#---------------------------------------
# change string(0/1) to Boolean(False/True)
#---------------------------------------
def to_boolean(s):
    if(s == ""):
        return None
    if(s == "0"):
        return False
    elif(s=="1"):
        return True
    else:
        raise ValueError("not boolean")


#---------------------------------------
# main
#--------------------------------------
args = sys.argv
jdata = {"field01":"hello", "filed02":"world", "country_records":[]}
r = open(args[1],"r")

d_reader = csv.DictReader(r)
d_list = [row for row in d_reader]

for row in d_list:
    row["population"] = int(row["population"])
    row["capital"] = to_boolean(row["capital"])

jdata["country_records"] = d_list
print(json.dumps(jdata, ensure_ascii=False, indent=2))
25 2月, 2023

Excelの内容をVBScriptで出力

[English]

Excelファイルから指定範囲のセルを出力するVBSCriptのサンプル。
https://github.com/hidemiubiz/public/blob/main/VBS/excelparse.vbs

'-------------------------------------------------------------------
' Excelファイルの中で、文字列が入ったセルから文字列を抜き出すサンプル
' this is a sample extracting string from excel files.
'
' Usage: csript excelparse.vbs input.xls left-top-cell right-bottom-cell
' Example:
' If you want to print sample.xls's B5 to E7 celss, put the followig command.
' cscript excelparse.vbs sample.xls B5 E7
'-------------------------------------------------------------------

set objXls = CreateObject("Excel.Application")
objXls.Visible=False
objXls.ScreenUpdating=False

Dim filename
Dim left_top_cell
Dim right_bottom_cel
filename = Wscript.Arguments(0)
left_top_cell = Wscript.Arguments(1)
right_bottom_cell = Wscript.Arguments(2)

call ParseExcel(filename, left_top_cell, right_bottom_cell)

'-----------------------------------------------------
' 標準出力(Print stdout)
'-----------------------------------------------------
Function Print(m)
WScript.Stdout.Write m
End Function

'-----------------------------------------------------
' Get Full path
'-----------------------------------------------------
Function GetFullPath(ByRef filename)
GetFullPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(filename)
End Function

'-----------------------------------------------------
' Excelファイルをパースして出力
' print out excel file
' filename .............. excel filename パースするExcelファイル
' left_top_cell ......... left_top_cell string(example ... "B5")
' right_bottom_cell ..... right_bottom_cell string (such as "D10")
'-----------------------------------------------------
Sub ParseExcel(ByRef filename, ByRef left_top_cell, ByRef right_bottom_cell)
Dim wb,s
Dim lef_top_row
Dim lef_top_col
Dim right_bottom_row
Dim right_bottom_col

Set wb = objXls.Workbooks.Open(GetFullPath(filename))
Dim i
For i=1 To wb.Sheets.Count
Set s = wb.Sheets(i)
Set lt = s.Range("A1:" & left_top_cell)
Set rb = s.Range("A1:" & right_bottom_cell)
left_top_row = lt.Rows.Count
left_top_col = lt.Columns.Count
right_bottom_row = rb.Rows.Count
right_bottom_col = rb.Columns.Count
Call PrintRange(s, left_top_row, right_bottom_row, left_top_col, right_bottom_col)
Next
wb.Close
End Sub

'-----------------------------------------------------
' 指定された範囲のセルの文字列を表示する。
' print out specific range cells
' sheet .......... シートObject
' startRow ....... 行の開始位置(left_top_row)
' endRow ......... 行の終了位置(right_bottom_row)
' startCol ....... 列の開始位置(left_top_col)
' endCol ......... 列の終了位置(right_bottom_col)
'-----------------------------------------------------
Sub PrintRange(ByRef sheet, ByVal startRow, ByVal endRow, ByVal startCol, ByVal endCol)
Dim y
Dim x
For y=startRow To endRow
For x=startCol To endCol
Set c = sheet.Cells(y,x)
Print(c.Text & ",")
Next
Print(vbCrLf)
Next
End Sub

 

■使用例

以下のように、B5からE7の範囲を出力したい場合
cscript  上記サンプル.vbs  入力Excelファイル名  B5  E7

 

31 7月, 2022

Spark DataframeでUPSERTを行う

[English]
本記事は完全に正しいかは不明です。
この記事に書かれた内容がおかしいと気づいた方は教えてください。

2つのCSVファイルがあり、下図のようなUPSERTを行いたい場合のサンプルコード。

■サンプルNo.1

df1 = spark.read.option("header","true").csv("data01.csv")
df2 = spark.read.option("header","true").csv("data02.csv")

df = df1.join(df2, ['Country','City'], 'left_anti')
df = df.unionAll(df2)

df.write.option("header","true").format("csv").save("output")

 

 

■サンプルNo.2
別の方法(以下のコードは、意図通り動いたり、動かなかったりします。

Sparkが1つのパーティションで動いた場合のみ、意図した通りに動く)

 

df1 = spark.read.option("header","true").csv("data01.csv")
df2 = spark.read.option("header","true").csv("data02.csv")

df = df2.unionAll(df1)
df = df.dropDuplicates(['Country','City'])

df.write.option("header","true").format("csv").save("output")

 

■サンプルNo.3
以下のコードは dropDuplicates()を使っても、おそらく意図通り動く(確証はないです)

df1 = spark.read.option("header","true").csv("data01.csv")
df2 = spark.read.option("header","true").csv("data02.csv")

df = df2.unionAll(df1)
df = df.dropDuplicates(['Country','City'])

df=df.coalesce(1) 
df.write.option("header","true").format("csv").save("output")

■サンプルNo.2とNo3.の違い

Sparkは「遅延評価」を行うため、以下の処理を呼び出したときには、

 

df = df2.unionAll(df1)
df = df.dropDuplicates(['Country','City'])

実際にはまだ処理が行われておらず、以下の処理を呼び出したときに初めて実行されます。

df.write.option("header","true").format("csv").save("output")

そのため、出力処理を行う直前に、coalesce(1)でパーティションを1に固定する命令を与えることで、
常に1パーティションで動くため、意図通りに動くと推測されます。

28 5月, 2022

curlを使用してS3にファイルをアップロードするシェル

[English]

以下を参考にした。
tuxfight3r/s3_upload.sh

#!/bin/bash

S3KEY="Your Acess Key"
S3SECRET="Your Access Secret"
S3BUCKET="Your Bucket Name"
S3STORAGETYPE="STANDARD"
AWSREGION="Your S3 Region"

# Macを使用している場合、以下の行を有効にする
#OS="mac"

function putS3
{
  file_path=$1
  aws_path=$2
  bucket="${S3BUCKET}"
  date=$(date -R -u)

  acl="x-amz-acl:private"
  content_type="text/plain"
  storage_type="x-amz-storage-class:${S3STORAGETYPE}"
  string="PUT\n\n$content_type\n$date\n$acl\n$storage_type\n/$bucket$aws_path${file_path##/*/}"

  if [ $OS = "mac" ]; then
    signature=$(printf "${string}" | openssl sha1 -hmac "${S3SECRET}" -binary | base64)
  else
    signature=$(echo -en "${string}" | openssl sha1 -hmac "${S3SECRET}" -binary | base64)
  fi

  curl -s --retry 3 --retry-delay 10 -X PUT -T "$file_path" \
  -H "Host: $bucket.${AWSREGION}.amazonaws.com" \
  -H "Date: $date" \
  -H "Content-Type: $content_type" \
  -H "$storage_type" \
  -H "$acl" \
  -H "Authorization: AWS ${S3KEY}:$signature" \
  "https://$bucket.${AWSREGION}.amazonaws.com$aws_path${file_path##/*/}"

}

# カレントディレクトリの test.txt ファイルを、/test/  にアップロード.
putS3 test.txt /test/