SQLで点数の高い順位を採番します。
その際、同点の場合、1, 1, 3のように採番します。
SELECT RANK() OVER(ORDER BY 項目 DESC) FROM テーブル名
SQLで点数の高い順位を採番します。
その際、同点の場合、1, 1, 3のように採番します。
SELECT RANK() OVER(ORDER BY 項目 DESC) FROM テーブル名
住所の登録システムを作っているときにたまに要件で出てくる表記揺れ。
ひらがなは全て半角カタカナに変換したり、
括弧も全て()に変換したりします。
Oracle10gからの機能であるUTL_I18NパッケージのTRANSLITERATEファンクションを利用します。
下記に例を示しておきます。
テキトーな仕様 全角英数字:全て半角英数字に変換 全角ひらがな、カタカナ:全て半角カタカナに変換 前後の中間の空白:全角、半角問わず削除 全角半角の括弧{}、「」、<>、():全て()に変換 全角記号:半角記号に変換 全角半角のハイフン:全て-に変換
CREATE OR REPLACE FUNCTION CONVERSION_TEST(
IN_CHAR VARCHAR
) RETURN VARCHAR
IS
BEGIN
RETURN
UTL_I18N.TRANSLITERATE(
TRANSLATE(
UPPER(TO_SINGLE_BYTE(REPLACE(REPLACE(IN_CHAR,' '),' ')))
,'{}「」<>()ー-!#$%'
,'()()()()--!#$%'
)
,'kana_hwkatakana')
;
END CONVERSION_TEST;
記号、括弧、ハイフンは全部書くとキリないので、省略しています。
「kana_hwkatakana」の部分は他にも色々あるようです。
セッションとクッキーについてメモ。
C:\Users\ユーザ名\AppData\Local\Microsoft\Windows\Temporary Internet Files
Cookie:ユーザ名@サイト名/
ただしクッキーの値の変更はツールを使用しないと有効にならない。
手書きで変更しても読み取れずに2番目の動作時にクッキーの値がNULLとなる。
変更前
セッションIDはブラウザメモリまたはクッキーの値を自動でサーバーへ送信
https://z-area.net/コンテキスト名?request1=test1&request2=test2
変更後
セッションIDはURLの値をサーバーへ送信
https://z-area.net/コンテキスト名;jsessionid=12345?request1=test1&request2=test2
12345のセッションIDが正規のユーザのものである場合、
変更後のリクエストは正常に処理される。
ログイン画面を表示した時点でセッションIDが採番されるので、
セッションハイジャックを防ぐにはログイン成功後にセッションIDを採番し直す。
JavaでXMLを解析します。
<?xml version="1.0" encoding="UTF-8"?> <sample> <location> <area name="area1"> <shop type="kanto_shopName1" required="111" /> </area> <area name="area2"> <shop type="sikoku_shopName1" required="222" /> <shop type="sikoku_shopName2" required="333" /> </area> <area name = "area3"> <shop type="kansai_shopName1" required="444" /> <shop type="kansai_shopName2" required="555" /> <shop type="kansai_shopName3" required="666" /> </area> </location> </sample>
/*
* メイン処理を実行します。
* @param args 引数
*/
public static void main(String[] args) {
try {
File fileObject = new File("src/conf/test.xml");
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = docBuilder.parse(fileObject);
NodeList nodeList = document.getChildNodes();
scanNodes(nodeList);
System.out.println("マップサイズ:" + resultMap.size());
for (String key : resultMap.keySet()) {
List<Z_XmlAnalyzerBean> list = resultMap.get(key);
System.out.print("全体キーは" + key + "@");
for (int i=0; i<list.size(); i++) {
Z_XmlAnalyzerBean bean = list.get(i);
System.out.print(bean.getKey() + ":" + bean.getValue() + ", ");
}
System.out.println("");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* ノードリストを再帰的に解析します。
* @param nodeList ノードリスト
*/
public static void scanNodes(NodeList nodeList) {
for (int i=0; i<nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (Node.ELEMENT_NODE == node.getNodeType()) {
NamedNodeMap nodeMap = node.getAttributes();
if (nodeMap != null) {
for (int j=0; j<nodeMap.getLength(); j++) {
if (nodeMap.item(j).getNodeName().equals("name")) {
String mapKey = nodeMap.item(j).getNodeValue();
List<Z_XmlAnalyzerBean> list = new ArrayList<Z_XmlAnalyzerBean>();
resultMap.put(mapKey, list);
}
if (nodeMap.item(j).getNodeName().equals("type")) {
String mapValueKey = nodeMap.item(j).getNodeName();
String mapValueValue = nodeMap.item(j).getNodeValue();
System.out.println(mapValueKey + ":" + mapValueValue);
Node parentNode = node.getParentNode();
NamedNodeMap parentNodeMap = parentNode.getAttributes();
String parentZokuseiName = parentNodeMap.item(0).getNodeName();
String parentZokuseiValue = parentNodeMap.item(0).getNodeValue();
System.out.println("親:" + parentZokuseiName + "," + parentZokuseiValue);
List<Z_XmlAnalyzerBean> list = resultMap.get(parentZokuseiValue);
Z_XmlAnalyzerBean bean = new Z_XmlAnalyzerBean();
bean.setKey(mapValueKey);
bean.setValue(mapValueValue);
list.add(bean);
}
}
}
}
if (node.hasChildNodes()) {
scanNodes(node.getChildNodes());
}
}
}
public class Z_XmlAnalyzerBean {
private String key = null;
private String value = null;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
JavaからWindowsのコマンドプロンプトを呼び出して、
ファイルコピーは実施したことありましたが、
現場の実作業でLinuxのシェルを呼び出して欲しいと言われました。
普通はナイナイと話していたのに実際にあるとは驚きました。
自宅で試してみました。
cat /home/ユーザ名/java/シェル名.sh #!/bin/sh echo "Hellow World !!" cd aaaa
標準出力とエラー出力の両方があった場合を試したかったので、
わざと存在しないディレクトリに移動しています。
実行権限をつけておきます。
chmod -x シェル名
/**
* メイン処理
* @param args 引数
*/
public static void main(String[] args) {
ArrayList<String> cmd = new ArrayList<String>();
cmd.add("/home/ユーザ名/java/シェル名.sh");
try {
ProcessBuilder processBuilder = new ProcessBuilder(cmd);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
InputStream inputStream = process.getInputStream();
printInputStream(inputStream);
System.out.println(process.waitFor());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 入力ストリームの内容を出力する。
* @param inputStream 入力ストリーム
* @throws IOException [入出力エラーが発生した場合]
*/
public static void printInputStream(InputStream inputStream) throws IOException {
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));) {
for (;;) {
String line = bufferedReader.readLine();
if (line == null) {
break;
}
System.out.println(line);
}
}
}
javac クラス名.java java クラス名
Hellow World !! /home/ユーザ名/java/シェル名.sh: line 3: cd: aaa: そのようなファイルやディレクトリはありません 1
ProcessBuilderクラスのredirectErrorStreamをtrueにしたので、
標準出力とエラー出力が同時に出力されています。
ただしこのバッファは1024バイトまでらしいです。
⇒echoで1050バイトほど出力するようなシェルにしてみましたが、
出力できてしまいました。謎です。
また、異常終了したので戻り値も「1」になっています。
-bash: ./シェル名.sh: /bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません
「^M」が出ているのがわかります。
sedコマンドでLFに置換しました。
sed -i 's/r//' /home/ユーザ名/java/シェル名.sh
Eclipseで色々いじりすぎて復元できなくなった場合の再設定メモ。
EclipseはIndigoの3.7.2を利用しています。
【設定】
「ファイル」-「エクスポート」を選択する。
「一般」-「設定」を選択し、「次へ」ボタンを押下する。
全てをエクスポートにチェックを入れ、「宛先設定ファイル」を指定し、「完了」ボタンを押下する。
【設定】
「ファイル」-「インポート」を選択する。
「一般」-「設定」を選択し、「次へ」ボタンを押下する。
ソース設定ファイルを選択し、「完了」ボタンを押下する。
OracleのSQLPlusでSELECT結果をspoolでファイル出力した際、
CHAR型やVARCHAR2型の出力結果がサイズにあうように自動で空白埋めされてしまい、
想定結果ととても比較し難い。
「SET TRIMSPOOL ON」にしても空白が削除されないのは、
これが「行末のトリム処理を制御する」からのようです。
「項目ごとのトリム処理を制御する」なら便利だったのに。
色々調べてもSQLPlusの設定だけでやるのは無理なようで、
結局下記のようにパイプでつなげることにしました。
SELECT 項目1 || 't' || 項目2 || 't' || 項目3 FROM テーブル名;
TeraTermで接続情報を毎回手打ちして、
ログインするのが面倒なので、自動ログインします。
デスクトップでも好きな場所に「ファイル名.ttl」ファイルを作成します。
ファイルが「ttpmacro.exe」に関連付けられていない場合、
TeraTermのインストールディレクトリに存在する「ttpmacro.exe」に関連付けを行います。
ファイルの中身を記載します。
hostname = 'IPアドレスまたはホスト名' username = 'ユーザ名' passfile = 'D:/任意のディレクトリ/任意のファイル名' keyfile = 'D:/任意のディレクトリ/秘密鍵のファイル名' getpassword passfile username userpass command = hostname strconcat command ':22 /ssh /KR=UTF-8 /KT=UTF-8 /auth=publickey /user=' strconcat command username strconcat command ' /passwd=' strconcat command userpass strconcat command ' /keyfile=' strconcat command keyfile connect command end
初回ログインで1度パスワードを聞かれますが、
2回目からはファイルを自動参照します。
ファイルサーバにログインする際、接続情報を毎回手打ちして、
ログインするのが面倒なので、自動ログインします。
デスクトップでも好きな場所に「ファイル名.bat」ファイルを作成します。
ファイルの中身を記載します。
@echo off SET COMMON_USR=ユーザ名 SET COMMON_PASS=パスワード echo ホスト名ログイン中 net use ホスト名/ディレクトリ名 /USER:%COMMON_USR% %COMMON_PASS% pause
接続できない場合、接続情報が残ってしまっていることがあるので、
コマンドプロンプト上で下記コマンドで削除します。
net use ホスト名/ディレクトリ名 /delete
Excelオープン時にショートカット割り当てマクロを自動実行させます。
Sub Auto_Open()
'
' Auto_Open Macro
'
' エクセルオープン時に必ず実行する。
Call AssignShortCutKey
End Sub