メモ: Oracleの実行コマンドについて

基本設定:

いつも使用しているコマンド:

SET LINESIZE 300
SET PAGESIZE 500
SET COLSEP ,
SET TRIMSPOOL ON
SET TERMOUT ON
SET ECHO ON

起動時ファイル指定実行:

コマンド実行フォルダ直下にlogin.sqlに起動コマンドを記入し、

sqlplus [username]/'[password]'@[hostname]:[port]/[service name] @./login.sql

SQL実行計画

索引確認

select i.table_name, i.index_name, i.uniqueness, c.column_name
from user_indexes i, user_ind_columns c
where i.index_name = c.index_name
  and i.table_name = '【TABLE_NAME】'
order by index_name,table_name,column_position;

通常セッションモード

ALTER SESSION SET STATISTICS_LEVEL=TYPICAL;

TRACE ONLY MODE

SET AUTOTRACE TRACEONLY;
[  SQL  ]
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

実行統計

ALTER SESSION SET STATISTICS_LEVEL=ALL;
[ SQL ] 
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

実行統計は、oracleの内部でSQL文の解釈方法を表示してくれるものである。 データの走査方法(full scan, idx scanなど)や走査順番を階層的に表示してくれる。 それぞれのステップで掛かってる時間も確認したいのなら、trace onlyモードにして実行計画を確認できる。

SoundHound Programming Contest 2018 本戦 B「Neutralize」解法

みなさん、どうも、@ukohank517です。

SoundHound 2018本戦B問題について、 解説と違う解法で解いたので、ここでメモを残しておこうと思います。

考え方

連続K個以上非正の効用が続いてたらそれらを全部0にして構いません。

K個以上連続してなければちょっとややこしいですね。

要するに、dp問題です。

解法

  • dp[i][j] (0 <= i <= N, j = {0,1} )の配列を用意する

    • インデックス:
      • iは更新する配列の番号、配列の末端から先端より逆順で考慮する。
      • jの0,1はfalse/trueと理解して問題ないです。
    • 意味: i+1 番目以降を全て最適にする時、i番目の薬品の処理(0にするかどうか)によって得られた最大効用
  • 初期化: 薬品が存在しない時、0にしなくても【dp[N][0]】効果が0

  • 後ろから更新:
    • i番目の効果を0にしたければ【dp[i][1]】:①「自分を含む、自分からK-1番目先全部0にする時、K番先の薬効用を利用する値【dp[i+K][0]】になる」②「連続K品以上の薬効用を無視していれば、自分の一品もついでい0にする【dp[i+1][1]】」の二つの値より大きい方を利用する
    • i番目の効果を0にしなければ【dp[i][0]】、i+1までの最適解 【max(dp[i+1][0], dp[i+1][1])】にi番目【b[i]】の効果を足す

参考コード

筆者の解答はこっちら

一言

この問題が400点問題?!

企業コン恐ろしい。。

curlでステータスコードだけを取得する(ちょっとしたシェル芸)

みなさん、どうも、@ukohank517です。

今回はnullデバイス(/dev/null)を経由しないで、 シェルコマンドだけでステータスコードのみを取得するcurlの書き方につい記録しようと思います。 (自分のメモにもなるので)

結論:

curl -is ${url} | sed -n 1P | cut -d ' ' -f 2

この記事ではこのコマンドが一番言いたかった。

結論を一番最初に持ってきました。

なお時間がある方は引き続き下の文書も読んでいただければと思います。

他の方法

実はnullデバイスを経由する書き方なら、たくさんの情報があります。

例として、Qiitaさんの記事で、こんなのもありました:

$ curl -LI mazgi.com -o /dev/null -w '%{http_code}\n' -s

しかし、諸事情によりnullデバイスを経由しないでステータスコードをのみ取得する場合もありますよね?

筆者の場合は、認証周りの自動テストで403エラーをチェックするために使いました。

その際使用したのが一番上のコマンドになります。

一体このコマンドは何しているの?

上記のコマンドを2つのパイプラインで繋いでいるので、

それぞれ何しているのがを見ていきましょう。

[1]. curl -is ${url}

こちらはmanコマンドでcurlを確認すれば分かります。

  • まずは、オプション-iプロトコルヘッダーを取得しています。ステータスコードはこの中に含まれています。
  • 次にオプション-sでサイレントモードにし、通信状況やエラーを無視するようにしました。

このコマンドにより下記のデータが取得できます。

${protcol_header}

${site_body}

サイトの中身にもよりますが、${site_body}にはhtmlもしくはjsonレスボンスが入っています。

[2]. sed -n 1P

上記のcurlコマンドにより、我々が欲しいステータスコードプロトコルヘッダーの一行目に入ってることが確認できると思います。

sedコマンドで一行目を切り出すのがこのコマンドの機能です。

[1],[2]をパイプラインで繋げて実行したことで、正しく情報を取得できていれば以下のような結果になります。

HTTP/1.1  200 OK

[3]. cut -d ' ' -f 2

上記[2]の結果で得られた結果を良く見てみると、

スペースで区切ってあり、なおステータスコードが2番目に入ってることがわかると思います。

このcutコマンドでスペースで区切ることを指定して、2番目を取得すれば、

ステータスコードが取得できました。

もちろん、エラーの時もその結果が帰って来るし、

存在しないページは空文字列が帰ってきます。

後書き

筆者は今年でエンジニアの卵として社会に出ました。

どっかの交流会で見かけたらぜひ声をお掛けください。


ご指摘、ご意見などがあれば、[@ukohank517|twitter]にでご連絡いただければ修正します。

配列、リスト形式のデータをPOSTする際のjava、curl、Ajaxでの操作

この記事はKobe University Advent Calendar 2017の15日目の記事です。なお筆者は当該大学の大学院1回生(2017年現在)です。

背景

授業の関係で、筆者はCloud Spiralというコースを参加させてもらいました。主に最近話題のクラウドサービースについて勉強するのですが、webアプリ開発の知識をいっぱい勉強できました。大学院のほかのどの授業よりも勉強になりました。

最終課題ではチーム開発に入りまして、バックエンド側のとあるAPI部分を担当させてもらいました。その時になかなか解決できない問題及び解決方法について紹介できたらと思います。

問題

API実装に当たって、リストデータの取り扱いがなかなか難しいでした。この記事では、

  1. javaAPI作成する際にリストを受け取るような関数の設定し方。
  2. curlでテスト動作を確認する際リストの渡し方。
  3. Ajaxでリストデータを送信する時の仕方。

についてメモろうかと思います。

javaAPI作成する際にリストを受け取る方法

配列が欲しいので、Listで操作ができます。書き方がこんな感じです:

public Response postRequest(@FormParam("ID") List<Integer> id) {

}

その後は普通のリスト関連の操作と変わらない操作ができます。

後余談ですがパラメータの取り方:Get HTTP header in JAX-RS

 curlでリストをPOST

筆者がハマったのがここです。curlについては理解してるとは言えませんので、説明を省きます。ターミナルで 

man curl

を打ったらマニュアルが表示します。

  1. curlについて: curl - How To Use
  2. 日本語版:  http://archive.fo/ZjQfk

ここら辺のマニュアルを読んだんですが、list関連の説明がどれも書いておりません。筆者もかなり悩みました。最後色々適当にコマンドを叩いた結果、一応上のjavaコードに対応するcurlのPOSTコマンドは:

curl http://hogehoge/request -X POST -d id=1 -d id=2

なるほど、リストの要素数だけデータとして渡せばいいのですね。

(追記:このcurlコマンドは、上記のjavaAPIに対応します。プログラム上、idはList<Integer> になります。)

Ajaxでリストのデータを送信する

開発の段階では自分に全く関係ないのですが、一応チーム開発なので、フロント側がajaxを用いてリストデータを送信する際にどうしてもリストとして認識してくれません。これに関しては先行記事がすでに存在してあります:

jQuery.ajaxで配列を送信するのに嵌った - けさらんぱさらん

一応ここでも書いておきます。

$(function () {
    $.ajax({
        url: "hogehoge/request",
        type: "POST",
        datatype: "json",
        id: { values: [1, 2] },
traditional: true, }); });

もっとも大事なのは、一番最後の

        traditional: true,

になります。

(追記: 最後の一行traditional:trueを書かないと、渡されたidの要素は一つのみになってしまう。)

後書き

キーワード:java リスト list 配列 curl ajax

 

筆者がリスト関連の、特にcurlの部分が丸一日探し回って見つかりませんでした(検索方法が悪かったのかな?)。自分と同じようなことをする人が、キーワードによってこの記事にヒットして何かが得られたら幸いです。

 

開発においでは自分がとてつもなく情弱です。いいチームに恵まれていい経験が積まれました。本当にありがとうございます。

チームメイト一覧(あだ名、五十音順):

フロントエンド班: イリエッティー、くれない(リーダ)、ザキヤマ

バックエンド班: 村長(リーダ)、パンちゃん

 

追記(2018/08/24):

もちろん、プログラムを作成する時は設計書通りに書かなくてはいけないと思います。今回は:

  • javaプログラム内List<integer>
  • curlcurl [url] -d [dataName]=[datavalue1] -d [dataName]=[datavalue2]

ソースコードのおよびテストを設計したため、上記のように問題を処理しました。

 

そのほか、設計書段階からpostデータを直接jsonデータとして設計した場合、プログラムに渡す方法もあります。

例としてはこちらの記事をご覧ください:

Javaで文字列をJSONObjectに変換する方法 arrays | CODE Q&A [日本語]

 

 

 

ご指摘、ご意見などがあれば、ツイッターにでご連絡いただければ修正します。

UK. (@ukohank517) | Twitter

abc076-D丁寧に説明してみた

問題ページ:

D: AtCoder Express - AtCoder Beginner Contest 076 | AtCoder

自分の回答:

Submission #1732260 - AtCoder Beginner Contest 076 | AtCoder

 

先週に開かれたabc076ですが、筆者はビジネスコンテストを参加している真っ最中なので、Bまでだけ解いた。そのあとC、D問題を見て、なかなか面白い問題と初めて気づいた。解説をみて、うーん、わからない!w(一応自分もプログラミング初心者なので...)

 

改めて問題文をみて、自分の考えた解説をここに乗せておこう。変数名は筆者のコードで使用するものと一致するものを使用する。

 

問題概要

 特急列車がN個の「制限時間」内で走ってる。それぞれの「制限時間」内に、制限速度があって、特急列車がこの速度を超えないように-1[m/s2]~1[m/s2]で加速する。これらを満たす時、列車の最大走行距離を求めなさい。

すぐ分かったこと

1. 加速する時1[m/s2]、減速する時-1[m/s2]。「制限時間」内では最初は加速、最後は減速になっている。

2. 横軸t,縦軸vの時、走行距離は走る速度がx軸との間で出来る面積そのもの。

自分の考えたこと

f:id:ukohank517:20171102205710p:plain

  まず、設問にv[n]というものは、今回ではlimv[n]とさせてもらう前提で話を進める(だってそのvはその区間の制限速度と思うので)。

  上記の図のように、区間n,n+1,n+2があるけれど、それぞれの隣接する点に置いて、速度がvと設定する。もちろん一番右端はv[n+3]である。

  設定完了と、全ての区間は、左端の速度left、右端の速度right、制限速度limit、その区間である時間timeの四つの要素を用いて面積を計算できる。もちろん全区間の一番左区間のleftは0で、一番右区間のrightは0の設定にはなっている。

 

  こうなると、問題はいかに節点の速度を決めることがこの問題の肝になる。これは以下の3ステップで設定できる:

  1. 初期値はもちろん、与えられた制限速度を用いて設定する。v[0]=0, v[N]=0以外のv[i+1]は、区間iと区間i+1に挟まれているので、その間の小さい方min(limv[i], limv[i+1])が自分の速度になる。

  2. 左から右に順番で見て行くと、v[i+1]>v[i]の対に対してのみ、v[i+1]=min(v[i+1], v[i]+t[i])というふうに更新する。これは、いくら加速しても、制限時間内での加速限界が両サイトの制限にも達してないと言うことです。減速についてはみなくて大丈夫。(理由を話すとややこしいけど、それでも気になる方がご連絡ください。)

  3. 右から左に順番で見て行く。v[i-1]>v[i]の対に対してのみ、上記2のように更新する。

  この3ステップで更新すると、全ての境界通過時の速度は必ず計算できる。

 

  次は囲まれた形で台形を計算するだけ。この計算方法は以下のようになる:

  1. その区間に入る時、まずは両サイドの小さい方をlに保存して、大きい方をrに保存する。制限上限の速度をlimに保存する。swapなどの機能を使って、必ずl<rにすると計算しやすくなる。

  2. 出来上がる台形の場合分けは2ケースのみ。一つはlim=r, もう一つはそれ以外。

  2-1: 

f:id:ukohank517:20171102212621p:plain

  例えばlimv[n]=rの時、以上の二つの形ができる。左の図の面積は、台形の面積の中から、斜線の三角形の面積を引いた結果だ。右は、この三角形の面積が0と思って一行でコードが書ける。

2-2: 

f:id:ukohank517:20171102213657p:plain

  limv[n]>rの場合は、上のようになる。一応コード内で使用する変数名も図の中に表記するようにした。x,yについてはx+y=t[i], x-y = r-lと言う連立方程式から得られるはず。左の場合は、「底が l,l+xで、高さx」の台形と、「底が r,r+yで、高さy」の台形と、真ん中が「top * (x+l)」の長方形で計算した。上記の2-1のように、全体から斜線の三角形を引いたやり方もできる。もちろん後者の方がコードが見やすくなる。

 

まとめ

一応自分の解き方を載せておいて、解答より理解しやすいのではないかなと思ってる。プログラミングの方が初心者に近い者なので、綺麗さには欠けてることが存じ上げておる。初記事なので、ご意見、ご質問がありましたら是非ご連絡ください。

 

twitter

UK. (@ukohank517) | Twitter

 

宜しくお願い致します。