Perl 覚え書き

最近では見かける機会も減ってきた Perl という言語だが、レガシーなプロジェクトでは使われていたりする。

MacOS では標準で搭載されている

ちなみに MacOS では標準で搭載されている。
ターミナルで

which perl

とタイプすると

/usr/bin/perl

と返ってくるはずだ。

バージョンもチェック。

perl --version

とすると

This is perl 5, version 30, subversion 3 (v5.30.3) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2020, Larry Wall
(以下略)

と返ってくる。v5.30.3 だそうです。

ターミナルでハロワ

動作確認。

perl -e 'print "Hello, World\n"'

もちろん Hello, World と表示される。

へえ、動くんだ。

スクリプトファイルを書いて実行

ターミナルで対話モードで使うことは稀だと思うので、スクリプトファイルを書いてみる。

perl といえばテキスト操作だと思うので、まずはフォルダを作る。

(mkdir.pl)
#!/usr/bin/perl

use warnings;
use strict;

print "mkdir test\n";
my $dir = "testdir";
mkdir $dir
  or die " fail: $!";
print "$dir has been created\n";

ワイは、エディタはもっぱら Visual Studio Code を使っているが、cmd + N で新規ファイルを作成して、上のようにタイプし、保存。
実行権限を適当に与えて ./mkdir.pl として実行させるとこのフォルダ階層直下にフォルダをつくってくれた。

確かに便利っすね。

なお、my はローカル変数らしいのだが、perl は歴史的経緯でこれをレキシカル変数というのだそうだ。

Perl について

より本格的に使い始める前にいくつか基本事項。

公式サイトは https://www.perl.org/

本格的に使うのであれば、モジュール CPAN は必須のようだ。
なお、CPAN は Comprehensive Perl Archive Network の略。

ただし、ファイル操作の基本的機能はデフォルトで使えるっぽい。

コメントは # しかないようだ。

複数行でも # を使うのが正式ルールらしい。

ただ、POD 形式というものがあり、

=pod
comment
Perl ignores this line
=cut

とすると解釈時には無視してくれるらしく、デバッグ時にはこれをコメントとして使っても問題はないようだ。

 

 

(続く)

 

ものぐさ RESTEasy -画像データなどを REST っぽく返したい-

『ものぐさ Jersey』的なやつが好評のようなので、その RESTEasy 編。

いきなりで恐縮だが、REST なウェブサービスを作っている際に画像も REST 的に取り扱いたいときがある。
要するに適当なエンドポイントを叩くと画像ファイルが返ってくる、みたいなやつだ。

サーブレットで実現するのが一番簡単なようなんだが、サーブレットを使わない方向でチャレンジする。

リンクした記事は jsp で書いてあるが、ちなみにサーブレットで書き直すとこんな感じ↓になる。

あっさり成功。

 

で、RESTEasy 。
まずは公式ドキュメントのチェック。

レスポンスを適当に加工すれば、なんとかなるだろうくらいに思って調べてみた。

なんだが…

なんでしょう、この突き放された感じ(笑)。

jakarta.ws.rs.core.StreamingOutput を使って自分で実装しろ的なことが書かれている。

いや、そんなことをするくらいならば、サーブレットのやつそのまま使いたいかなあ(困惑)。

アウトプットストリーム系を使って、とりあえずバイト列を返す

他の人がどうやっているかよくわからないのだが、まずはシンプルに攻める。

(公式ドキュメントのサジェスチョンを尊重して)バイト列を生成して、そいつを ByteArrayOutputStream にセットし、さらにそれを Response の中(Entity とかいうみたいだ)に入れ込んで REST っぽく返す、と以下のような感じになる。


@Path("/octet")
public class OctetServer {

 @GET
 @Produces(MediaType.APPLICATION_OCTET_STREAM)
 public Response sendOctet() throws IOException{

  byte[] byteData = "123456789ABCDE".getBytes();

  ByteArrayOutputStream output = new ByteArrayOutputStream();
  output.write(byteData);

  return Response.ok(output.toByteArray(), MediaType.APPLICATION_OCTET_STREAM).build();

 }

}

これで curl で (コンテクスト)/octet を叩くと、もちろん 123456789ABCDE がバイナリで返ってくる。
ブラウザからアクセスすると octet というファイルを落としてくれるが、中身は当然 123456789ABCDE だ。

これで、第一段階はクリア…

と思っていたが、コード見直すと、バイト列をストリームにセットした後、さらにバイト列に戻す、というバカっぽいことをやっている(苦笑)。

バイト列をエンティティとしても同じ

だから、上のサンプルはもうちょっと簡単になる。

具体的には、

return Response.ok(output.toByteArray(), MediaType.APPLICATION_OCTET_STREAM).build();

は、

return Response.ok(byteData, MediaType.APPLICATION_OCTET_STREAM).build();

としても変わらない。

もちろん、その上の2行は全く不要。

とりあえず、バイナリのデータを返すだけであれば、アウトプットストリーム系は不要で返したいデータのバイト列を response のエンティティにセットすればいいだけのようだ。

指定した画像などを返したければ、path parameter を設定してデータベースから検索して云々とやれば、実現できそう。

 

 

H2 database

使われている割に存在感が希薄な H2 database。(WildFly ではデフォで使える)

調べたら、ホームページもあった。
https://www.h2database.com

使い方はそこの Cheat Sheet にまとまっているので、特に付け加えることもないのだが、サーバーモードというのは知りませんでした。
ちゃんと調べてみるものだね。

H2 console を単体で使いたければ、h2-(version).jar を入手して、ダブルクリックで起動、ブラウザ画面が立ち上がる。

pgAdmin や phpMyAdmin みたいな感じのユーティリティソフトです。

 

モダンな JavaScript

今まで JavaScript は手続き型っぽく「なんとなく」使っていたのだが、最近ではクラスが使えるようになったりとキャッチアップの必要がありそう。

まずは、クラス(class)を使ってみる。

クラス class

そうはいっても、初心者向け記事のようなやつはダルくて実用的ではないので、「あるクラス内に別のクラスを含んでいる場合」というやつを試す。

まず、html ファイルの準備。

<!DOCTYPE html>
<html lang="ja">
<head>
 <title>TODO supply a title</title>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <script src="./js/test.js"></script>
</head>
<body>
 <div>JS test</div>
</body>
</html>

test.js はこういうものにした。

test.js
class a{
 constructor(){
  console.log('instance of a');
  class b{
   constructor(){
    console.log('instance of b');
   }
  }
 new b;
 }
}
new a;

class a1{
 constructor(){
  console.log('instance of a1');
  new b1;
 }
}
class b1{
 constructor(){
  console.log('instance of b1');
 }
}
new a1;

適当なウェブサーバーに設置。
html を出力させると、コンソール表示は

instance of a
instance of b
instance of a1
instance of b1

となる。

ただ、これは、テスト的コード。

あるクラス(a)に別のクラス(b)を含めて使いたい場合、b は必ずしもあるとは限らない。

new b というのはダサい。セッター&ゲッターを使いたいところ。

・・

・・・・

・・・・・・

などと言っていたのだが、上のような例(nested class などという)は JavaScript 非対応らしい。

ちゃんちゃん。

 

 

JakartaEE 各仕様まとめ

JakartaEE 関係の記事が増えてきたような気がするので、ここら辺でまとめ。

JakartaEE 各仕様

各仕様毎に軽めの記事を書いてきたつもりだったが、読み返したら微妙にオーバーラップしてる。

JAX-RS

ものぐさ Jersey』WildFly は RestEasy だが、GlassFish, Payara は Jersey なので取り上げた。が、最後の方で Jackson 成分も混じっている。

JAX-RS と JSON と List と hibernate』これも、REST の話から始まって、JPA(hibernate) につながっている。

JPA

実は JPA の仕様は資料にあたったことはない。実務的には hibernate でデータベース操作ができればいいでしょう、というわけで書いたのが

最も簡単な hibernate のサンプル

ここら辺から、「読みやすい」と言われるようになってきた。

CDI

初学者泣かせの CDI 。

CDI と weld の関係

で取り上げたが、なくてもなんとかなるので、無理して @Inject とかしなくていいかも。

つか、参考書の類で CDI の説明でわかりやすいのがないと思う。初学者にいきなり「依存性を注入して…」とか言ってもなんのことかさっぱりわからないと思う。

JAXB

Java と XML -JAXB の話-』理解があやふやだったので、自分の勉強のために書いた記事。実際、勉強になった。


他にもあるが、代表的なのはこんなところでしょうか。