次の仕事でなにやらSSO構築関係があり、ここでCokkieを配信し、同時にCokkieのドメインで可否を制御するようなものがあり、これに先んじてawsにサーバー構築して、次にJavaコンテナーを導入後にCokkie検証してみようかなと思っている。
 で先ずは、AWS でインスタンス構築。

Amazon Linux AMI 2017.09.1 (HVM), SSD Volume Type

で次に、秘密鍵を作るところ。ここで、Putty で作るしかないものだと思っていた。が実は、普通に
キーペア⇒キーペアの作成で終わり。awsキーペアの作成_Puttyを使わず.png

Putty Generator で作る場合は、表示    で Type  of key generate を RSA に指定が必要。
SSH-1(RSA) などを選択すると、接続時に「Key is not in valid OpenSSH public key format」となる。

で、次に Apache を入れる。https://qiita.com/Arashi/items/629aaed33401b8f2265c
などを参考に、

ec2-user]$ sudo su -  
ec2-user]$ passwd            で rootパスワード変更後
root] yum -y install httpd     で一発OK

service httpd start       起動
service httpd stop       停止
service httpd restart    再開し

で終わりかと思い、http://パブリック DNS 
http://ec2-54-95-63-165.ap-northeast-1.compute.amazonaws.com

で見つからない、また ping IPv4 パブリック IP でも見つからない?

で、どうやら EC3インスタンスは、初期状態でSSHの外部アクセスのみのセキュリティ設定であるとのこと。

http://www.checksite.jp/aws-ec2-icmp-rule/
https://qiita.com/jkr_2255/items/48be7527d88413a4fe71

下部のセキュリティグループの設定から、編集-追加から、インバウンドルールの編集で、ICMP や HTTPを追加する。表示 表示 表示 
で先ずは、表示


   

次の仕事でなにやらSSO構築があり、ここでCokkieを配信し同時にCokkieのドメインで可否を制御するようなものがあり、これに先んじてawsにサーバー構築して、次にJavaコンテナーを導入後にCokkie検証してみようかなと思い立った。
 で先ずは、AWS でインスタンス構築。前にもやってみたけど再チャレンジ。

Amazon Linux AMI 2017.09.1 (HVM), SSD Volume Type

で次に、秘密鍵を作るところ。ここで鍵はPutty で作るしかないものだと思っていた。が実は、普通に
キーペア ⇒ キーペアの作成で終わり。
 キーペアの作成

Putty Generator で作る場合は、Putty Generator menu    で Type  of key generate を RSA に指定が必要。
ここを SSH-1(RSA) などを選択すると、接続時に「Key is not in valid OpenSSH public key format」となる。
ここで指定した Pass phrase がそのままログイン時のパスワードになる。

で、次に Apache を入れる。https://qiita.com/Arashi/items/629aaed33401b8f2265c
などを参考に、

ec2-user]$ sudo su -  
ec2-user]$ passwd              で rootパスワード変更後
root]  yum -y install httpd     でセットアップは一発OK

service httpd start       起動
service httpd stop       停止
service httpd restart    再開し

で終わりかと思い、
http://パブリック DNS 
http://ec2-54-95-63-165.ap-northeast-1.compute.amazonaws.com

で見つからない、また ping [ IPv4 パブリック IP ] しても見つからない?

どうやら EC3インスタンスは、初期状態でSSHの外部アクセスのみのセキュリティ設定であるとのこと。

http://www.checksite.jp/aws-ec2-icmp-rule/
https://qiita.com/jkr_2255/items/48be7527d88413a4fe71

下部のセキュリティグループの設定から、編集-追加から、インバウンドルールの編集で、ICMP や HTTPを追加する。セキュリティグループ  セキュリティグループの編集  インバウンドルール編集でICMPとHTTP追加   で

先ずは、Apache疎通


   

で、この mazon Linux AMI 2017.09.1 (HVM), SSD Volume Type には、
Python、Ruby、Perl、および Java が含まれます」とあり予め色々用意されてある。これはせっかくなので Ruby の Self Review 。手元のVMにRuby環境わざわざ作るまでもなかったのだ。

とあるサンプルで以下のじゃんけんを見つけそのまま試したところ。なにやら「構文が最後まで終了していない」などというエラー

-----------------------------------------------------------
puts "play"
puts "[0]:Goo \n[1]:Choki \n[2]:Pa"

player_hand = gets.to_i
cpu_hand = rand(3)
if player_hand == cpu_hand
 puts "aiko"

elseif ( player_hand == 0 && cpu_hand == 1 ) ||
 ( player_hand == 1 && cpu_hand == 2 ) ||
 ( player_hand = 2 && cpu_hand == 0 )
 puts "you win !"
else
 puts "you lost!"
end

このサンプルの 

elseif ( player_hand == 0 && cpu_hand == 1 ) ||

は、

else if ( player_hand == 0 && cpu_hand == 1 ) ||  

の誤記と解釈し、else if としてみる同様、「構文が最後まで終了していない」などとのエラー。

でさらに調べるとなんと、
↓↓↓↓↓↓
elsif ( player_hand == 0 && cpu_hand == 1 ) || 

Ruby の場合は、else if じゃなくて   elsif  とのこと。

Java/C 系SEの自分にとって戸惑いの一歩。

仕掛の発端は昨今のAI再来襲。その代表はやっぱりWatoson。で、IBM Bluemixにサンプルありのことで、Bluemixへの登録からpractice開始。「クラウドと言えばAWSとか、クレジットカード登録が面倒etc.」云々、、QAをやりとりするや否や、暫くして『IBM Cloud 』へと改称になった。
Spring Seminar にて、IBMブースにてIBM Code Pattern for Java の紹介を受け、順に Deploy Spring Boor microservice in Kubernetes あたりからCodeを覗いてみた次第。

https://developer.ibm.com/code/patterns/deploy-spring-boot-microservices-on-kubernetes/

の通り、Pytonによるtransaction Generator のシミュレータから始まる。

以下の通り、random で乱数、transactionAmount を transaction の JSON テンプレートに指定し、data=json.dumps(transaction) にて、
JSONを post に指定している。

requests.post( URI", data=[json値], headers=[headers値]) 
time.sleep(1)
で1秒おきに送信。
 ↓
表示

で、Python 用のIDLEとして、以下が今の流行模様。
( IDLE = Integrated Development and Leaning Environment )

https://www.python.org/

セキュリティ界隈でご承知のStrutsフレームワーク脆弱性対応の一環として  ⇒  ( https://www.ipa.go.jp/security/ciadr/vul/20180823-struts.html )

タグリブの挙動確認での環境で、
JSP  <%@ taglib uri="/tags/struts-html" prefix="html" %> 式で指定する場合がある。

このとき web.xml で
<taglib>
<taglib-uri>/tags/struts-bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>  などの指定方法があるけど普通に、

JSP  <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
のように直接URIを指定すればよい

struts-taglib-1.3.10.jar
  META-INF
    tld
       struts-logic.tld

でURIが以下に指定されている。
<taglib>
<tlib-version>1.3</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>logic</short-name>
<uri>http://struts.apache.org/tags-logic</uri>

///////  知っていれば当たり前なのかもしれないけど、知らないと出くわすエラーその1 /////////

<c:set ら、cタグ  (  = Core Tags /  JSTL ) は、
standard-1.0.7.jar
META-INF
c.tld ( <uri>http://java.sun.com/jstl/core</uri> )
fmt.tld ら、

jstl-1.0.2.jar
javax.servlet.jsp.jstl
core
fmt
sql
tlv

jstl-1.0.2.jar が欠けると、以下

javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTag
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:358)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


//////  知っていれば当たり前なのかもしれないけど、知らないと出くわすエラーその2///

『TLD又はタグファイル中のattribute指示子に従って属性valueはどんな式も受け付けません』??
以下の  c:out value="${element}" でなにやらわけのわからないエラー発生。

<logic-el:iterate id="element" name="bean" property="stringArray"
indexId="index">
<li><em><c:out value="${element}"/></em>&nbsp;[<c:out value="${index}"/>]</li>
</logic-el:iterate>

⇒古い頃の 動的Webプロジェクト対応のためか、以下バージョン 2.3 に合わせる必要あり。

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

ここが、<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> とかだとうまくいかない。移行前現行システム解析は面倒。でもこういった既存解読が移行計画はどうしても必要。

//////  知っていれば当たり前なのかもしれないけど、知らないと出くわすエラー その3///

commons-beanutils-1.8.0.jar が欠けてるとなにやら以下のエラー。 Apache Commonsに依存している。

HTTPステータス 500 - javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/beanutils/PropertyUtils

type 例外レポート

メッセージ javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/beanutils/PropertyUtils

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/beanutils/PropertyUtils
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:405)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:349)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

//////  知っていれば当たり前なのかもしれないけど、知らないと出くわすエラー その4 ////

commons-logging-1.0.4.jar   が欠けてると今度は以下のエラー。なにかとCommons に依存している模様。

HTTPステータス 500 - javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

type 例外レポート

メッセージ javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:405)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:349)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

初の独学書「PythonとKerasによるDeepLaening」を読みかかり、同時にGithubのサンプルを漁る。
https://github.com/fchollet/deep-learning-with-python-notebooks

↓ディープラーニングの解説で幾度と無く登場する、MNISTのデータセット。
http://yann.lecun.com/exdb/mnist/

・training set
・test set  この二系統を準備するのがお決まりのパターン。本では、訓練セット、検証セット。
訓練セットから、最初は分類アルゴリズムのモデルを生成し損失関数(※1)を最小化するべく、学習(訓練)(※2)で少しずつデータを調整する。
※1 損失関数←30年前は、評価関数や目的関数とか言ってた。
※2 学習(訓練)←昔はパラメータ同定化とか言った。

そういえば、昔々自分が20代のエンジニア始まりの頃、フィードバック制御というモデルで出力結果を返して、
モデルを修正するという制御系仕事にどっぷり浸かった。この時の「モデル式修正」が、今で言うAIの「学習」相当なのだ。

「PythonとKerasによるDeepLaening」でも
訓練セット、検証セットそれぞれ決まって、
 ラベル
 イメージ の対で出てくる。

ラベルなら、こんなデータとの事。

offsettypevaluedescription
0000 32 bit integer 0x00000801(2049) 識別子(定数)
0004 32 bit integer 60000 or 10000 ラベルデータの数
0008 unsigned byte 0 ~ 9 1つ目のデータのラベル
0009 unsigned byte 0 ~ 9 2つ目のデータのラベル
.... .... .... ....
xxxx unsigned byte 0 ~ 9 最後のデータのラベル

ついつい中身を確認したくなるので、バイナリーエディタ(Stirling)で覗いてみた。↓

MNISTデータの中身.png

Tensorflow から MNISTを操作するなら ↓  

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/tutorials/mnist


「PythonとKerasによるDeepLaening」なら↓
https://nbviewer.jupyter.org/github/fchollet/deep-learning-with-python-notebooks/blob/master/2.1-a-first-look-at-a-neural-network.ipynb

-------------------------------------------------------------------------------------------------------------------------------
from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
-------------------------------------------------------------------------------------------------------------------------------

で先ずは、これらデータの取り込みが事の始まり。

次回、再びOracleの案件を控え事前準備として。今は以前のように自前でDBサーバを自前Linuxを準備やVM構築、次にOracleサーバーセットアップは昔の話。Oracle Installerは今まで何度やったか気が知れない。今は、Cloud型Oracleサービスが提供されているので活用してみる。最近はこの手のサービスはCloud化されているので以前のような面倒なインストールは必要なくなった。アカウント作成を試みた。

Oracle clound free service
アカウント作成画面
https://www.oracle.com/jp/cloud/free/

ログインページ
https://cloud.oracle.com/ja_JP/sign-in

ログイン後コンソール
https://console.ap-tokyo-1.oraclecloud.com/

表示

⇒AWS同様、先ずはインスタンスの作成から始めてみて、PuTTY Key Generator からSSHキーを作り、セットアップしたところ、

『Out of host capacity』

https://cloudcustomerconnect.oracle.com/posts/657117a494?commentId=295680#295680
=> Please wait a few days, as they are expanding capacity constantly.

と来たので、やはりFreeなので期待できない。

そこで、Autonomous Database なるサービスを利用。
コンパートメントの選択、表示名、データベース名をディフォルトのままライセンスタイプを「ライセンス込み」として、[Autonomous Databaseの作成]からセットアップされる。

表示 次に、接続は[DB]接続ボタンから、クライアント資格証明(ウォレット)のダウンロード で、ojdbc.properties、tnsnames.ora、ウォレット一式を取り寄せて、指定されたTNS接続文字列を使って、接続完了。

表示

表示

今更だけどJava8,9以降で導入されているstream APIの復習。普段の参加するプロジェクトでは古いコードをそのまま継承しているので、stream式が全く出てこない。しかし、一般のJava界隈で従来のCollectionに替わりstream式で実装するのがほぼ日常となっている。

StreamAPIを復習する。
Springの参考書籍として、イタリアRedHat所属の Mario Fusco 氏による「Modern Java in Action」が洋書ながらとても分かりやすく、参考コードもとても分かりやすいのでこれを参考とした。

chap5 辺り

// Filtering with predicate
  System.out.println("Filtering with a predicate");
  List<Dish> vegetarianMenu = menu.stream()
     .filter(Dish::isVegetarian)
     .collect(toList());
  vegetarianMenu.forEach(System.out::println);

List<Dish> menu は、
bean として、public class Dish の静的固定 List メンバー変数として以下を定義している。

public static final List<Dish> menu = Arrays.asList(
new Dish("pork", false, 800, Dish.Type.MEAT),
new Dish("beef", false, 700, Dish.Type.MEAT),
new Dish("chicken", false, 400, Dish.Type.MEAT),
new Dish("french fries", true, 530, Dish.Type.OTHER),
new Dish("rice", true, 350, Dish.Type.OTHER),
new Dish("season fruit", true, 120, Dish.Type.OTHER),
new Dish("pizza", true, 550, Dish.Type.OTHER),
new Dish("prawns", false, 400, Dish.Type.FISH),
new Dish("salmon", false, 450, Dish.Type.FISH)
);

☞ menu.stream() で別のListに代入しつつ、

.filter(Dish::isVegetarian)
.collect(toList());

.filter で isVegetarian で、private final boolean vegetarian; がtrueのみ抽出している。

.collect(toList());
で別の List<Dish> に集約

Filterling_a_stream_with_a_predicate_.jpg

//////////////  Bean //////////////////////////////////////////////////////////////////////////////////////////////

public class Dish {

private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;

public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}

public String getName() {
return name;
}

public boolean isVegetarian() {
return vegetarian;
}

public int getCalories() {
return calories;
}

public Type getType() {
return type;
}

public enum Type {
MEAT,
FISH,
OTHER
}

Spring4 の Spring MVCも今は、Spriing Bootで設定ファイル(ApplicationContext)無し、ApplicationServer無し標準Web環境での開発が当たり前の時代となった。

 かつての Struts (セキュリティホール問題に端を発した)→ Spring 移行の需要に求められた、struts_config.xml, web.xml → ApplicationContext.xml, web.xml 移行スキルの需要が早くも昔話となった。

 サーバー公開の話に替わって、さらにこれらデプロイ環境もコンテナ(Contena)と呼ばれる仮想マシン環境で提供するが一般となった。コンテナは一昔前のVM(OraclecVirtualBox)とは異なり、vmは元のOSの上に別OSを載せるものだが、コンテナ・エンジンというパッケージに梱包するイメージ。ゲスト(別の)OSをセットアップと管理が省けるが大義名分であるが、ここはDockerだけでなく沢山ある模様。

ブロックチェーン BlockChan技術が次世代の金融インフラ云々、騒ぎが暫くあったがいつものようにそろそろブームが冷めてきた様子。Hyperledger Fabric (https://www.hyperledger.org/use/fabric)が実装するオープンソースとして一世を風靡し、大手各社(日立ソリューションズら)が取り組んでいることを派手アピールしている。

しかし自分はこれはオープンソースの研究レベル以外進捗は絶対無い、と見込んでいる。商用へのチャレンジなどと勢いづているが、金融商社等で当たり前に行われている受注・海外送金は従来からのSWIFTという高度なセキュリティで精巧に運用されているが実態。LC信用状決済を伴う場合は国内銀行での手形保証以上の信用課題があり、これらの信用取引すっ飛ばしたような、台帳を分散させて持つという時点でそこの本当に振込しようとする人がいるだそうか?分散台帳でを重要取引を軽々とやろうとする、取引実施者がそう簡単に現れるわけは思えない。技術固執者の夢想と煽り→その扇動に翻弄されるプログラマーらの限界の調査で収束する。

で「ブロックチェーン」という単語が情報処理試験問題にもついに登場し、
令和2年度10月 情報処理安全確保支援士試験(SC)での出題文言としては、

「問5 ブロックチェーンに関する記述のうち、適切なものは?」
→答え:『ハッシュ関数を必須の技術として、参加者がデータの改ざんを検出するために利用する。』と来た。実態はこの程度の認識なのだという事。分かっている人は分かっているのだ。

 

今では純Javaはむしろ少数派で、ポータルサイト界隈では Kotlinが一般的になっている。
Android開発が、ほぼKolin化していてその有効性がWebに波及した結果かも。

構文特性として、VB同様、
var 変数名: 変数型   

このスタイルは、Kotlin も Scala も Go も同じ
[ 例 ]
var  koto: String     ( java String koto; )

近年、OracleがJavaの有償化を皮切りにオープンJDKが続々出て来ている。

中でも活用頻度があるのが、eclipse foundation の  AdoptOpen JDK

これを eclipse に指定する。

AdoptOpen は、以下のような感じでセットアップされる。

C:\Program Files\Eclipse Foundation\jdk-11.0.12.7-hotspot\bin  

OpenJDK11U-jdk_x64_windows_hotspot_11.0.12_7.msi で .dll が豊富にありさながらWindowsアプリケーションの様相。昨今の Graal VMが反映されネイティブ化している感じ。

そのままだと

から辿れず。以下を追記
----- eclipse.ini -------------------------
-startup
plugins/org.eclipse.equinox.launcher_1.6.200.v20210416-2027.jar

--launcher.library
C:\Users\tomoi\.p2\pool\plugins\org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.200.v20210429-1609
-product
org.eclipse.epp.package.java.product
-showsplash
C:\Users\tomoi\.p2\pool\plugins\org.eclipse.epp.package.common_4.20.0.20210612-1200
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vm
C:/Program Files/Eclipse Foundation/jdk-11.0.12.7-hotspot/bin
#C:/Users/tomoi/.p2/pool/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_16.0.2.v20210721-1149/jre/bin

-vmargs
-Dosgi.requiredJavaVersion=11
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-Dsun.java.command=Eclipse

REST には決まったパターンがあり、仕様に応じた修正コーディングが標準作業。
それ以降は Spring フレームワークに限らず様々なフレームワークでの対応がある。

ここで、話をSpring に限った場合、以下のような Spring initializer の利用が一般的で、初期テンプレートはそのまま作れる。https://spring.io/guides/gs/rest-service/

RESTの仕様記述の話。
元々Opan API ( https://swagger.io/specification/ ) という、REST APIを記述するドキュメント仕様( .yaml 形式 ) が標準化されていて、最初にこれをきっちり作るところが求められる。ここを Swagger (https://swagger.io/) というツール類のエディタで作り、次にツールでREST の標準パターンを自動生成するというもの。自動生成結果は更にて修正が必要だがそれは別途。

以下、代表的なサンプル。apiの肝として、path,  リソース操作仕様のGET/POST/PUT /PATCH(=リソースの部分更新)Pの記述のところ。responseコード

以下、検索指定無しの、全件取得のパターン
ここで、content: application/json: にいくつかあり、ここがポイント。
/pets:

    get:
        description: Returns all pets from the system that the user has access to
            responses:
           '200':
               description: A list of pets.
               content:
                   application/json:
                       schema:
                           type: array
                           items:
                               $ref: '#/components/schemas/pet'

 

 次に、この yaml 仕様自体を自動生成するオンラインツールが存在している。

 

前回 Kotlin の案件に参加しこの言語を体系的に扱った。それを自分視点で改めてまとめる。
↓ このサンプルがベーシックで一番分かりやすい。

https://github.com/Kotlin/kotlin-by-example/tree/master/examples

先ずは   Data classes   のところ
data class User(val name: String, val id: Int)   {         

    override fun equals(other: Any?) =                                // 1
        other is User  &&  other.id == this.id                        // 2
}

→  ディフォルトメソッドをオーバーライドする。全メンバーが等しくてオブジェクトが等しい、とするディフォルトをここでは id が等しければ、インスタンスが等しいとする、とするという物。

//1  → other: Any?      nullありの全ての型のother,
//2  → other が User のインスタンスの場合( Javaの instanceOf 相当 )、かつ other の id と自分の id が等しければ true

photo - topic

| コメント(0) | トラックバック(0)

入館証写真01.jpg     入館証写真03.jpg   入館証写真04.jpgmyBeutifulFace.JPG

前回、Vue.js のプロジェクトに関わって、今回、チーム担当とは別のVueチームが JSF( .xhtml ) とは別のVue で構成されれた一連のサイトであった。今後の準備のためにもVue.js を細々と研究してきた。

Vue2 から Vue3 形式へ大きく変わっている。今はVue3スタイルが主流。

プロパティ

data
computed
method
色々あり、これらは都度ググるで確認。
以下、Vue 2 ,  3での .vue  ファイルに script , template に HTMLをまとめて記述する方式、など様々の改良がある。
以下、<template>を導入する以前の古典的スタイル。

------   someFor.html ---
<div id="app">
<form>
<input type="button" value="変更" v-on:click="onclick" />
</form>
<ul>
<li v-for="itemm in listXX" v-bind:key="itemm">{{ itemm }}</li>
</ul>
</div>

--- someFor.js ---

new Vue({
  el: '#app',
  data: {
  listXX: [ '赤パジャマ', '青パジャマ', '黄パジャマ' ]     /// Vue2 では配列をこの形式で定義
},
methods: {
  onclick: function() {
    // this.list[1] = '茶パジャマ';     /// →このような直接参照で変更できない。

     Vue.set(this.listXX, 1, '茶茶茶茶茶茶');   /// その他 push, pop(), shift, unshift, splice sort, reverse などあり。
     this.listXX.splice(1, 1, '茶茶茶茶茶');
    }
  }
});

これを Vue 3で記述してみる。
codesandbox というオンラインコンパイラの活用が環境構築無し、最短ルート。
https://codesandbox.io/s/vue

----- App.vue --------------------------------------------
<template>
  <form>
 <input type="button" value="変更" v-on:click="changeData" />

  </form
  <ul>
    <li v-for="item in listXX" v-bind:key="item">{{ item }}</li>
  </ul>
</template>
<script>
  import HelloWorldVue from "./components/HelloWorld.vue";
  export default {
    name: "App",
    components: {
      HelloWorld: HelloWorldVue,
    },
    data() {
      return { listXX: [ '赤パジャマ', '青パジャマ', '黄パジャマ' ] }    ///     data: {   を  data() { と書き、return {  llistXX: [ ]  形式
    },

  methods: {
    changeData: function() {
       this.listXX.splice(1, 1, '茶茶茶茶茶');
       // Vue.set(this.listXX, 1, '茶茶茶茶');    /// can not use by Vue3       
    }
  }
};
</script>

先ずは、node.js 

かなり古めが入っていたのでバージョンアップ

ダウンロード
https://nodejs.org/en

インストーラー

node-v20.12.1-x64.msi

C:\nodej>node -v
v20.12.1

次に nodej でサンプル web server を立ち上げてみる。

>node
>.help
>.edtiror

////// code
const http = require('node:http');
const myHostname = '127.0.0.1';
const port = 3001;
const myServer = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World oooooooooo!\n');

});

myServer.listen(port, myHostname , () => {
       console.log(`My Server running at http://${hostname}:${port}/`);
});
//////

Ctrl + D 

 

 

次に、雛形プロジェクト作成ツール Vue CLI を入れる。

> npm install -g @vue/cli

 

・・・・

・・・・

プロジェクトを生成

>vue create mycli

([Vue 2] babel, eslint ) 選択


C:\nodej\mycli\src

→ 生成したコードを適度に修正してみる。

C:\nodej\mycli\src\main.js
※./App.vue のimport別名を変更
--------------------------------------
import Vue from 'vue'
import AppMy from './App.vue'       // ※
Vue.config.productionTip = false
new Vue({
  render: h => h(AppMy),
}).$mount('#app')
--------------------------------------

C:\nodej\mycli\src\App.vue

・コンポーネントの名称を HelloWorldTomo  に変更
・コンポーネント props プロパティ名称を msgTomo: String  に変更
-------------------------------------------------------------------------------------
<template>

<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorldTomo msgTomo="Welcome to Your Vue.js App"/>
</div>
</template>

<script>
import HelloWorldTomo from './components/MyHelloWorldCompo.vue'
export default {
  name: 'App',
  components: {
    HelloWorldTomo
  }
}
</script>

<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>


C:\nodej\mycli\src\components\MyHelloWorldCompo.vue

・コンポーネント props プロパティ名称を msgTomo: String  に変更
-------------------------------------------------------------------------------------

<template>

<div class="hello">
  <h1>{{ msgTomo }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
</ul>
</div>
</template>

<script>
export default {
name: 'HelloWorld',
  props: {
    msgTomo: String
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
-------------------------------------------------------------------------------------

### Compiles and hot-reloads for development
> npm run serve

 次に、Jest と vue-test-utils をインストール  ( JavaのJUnit相当 )

(参考)  https://zenn.dev/hrtk/scraps/3107800740739e

> vue add unit-jest

以下、自動生成テストコード

C:\nodej\mycli\tests\unit
example.spec.js

import { shallowMount } from '@vue/test-utils'
import HelloWorld from '@/components/HelloWorld.vue'
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message'
    const wrapper = shallowMount(HelloWorld, {
      propsData: { msg }
    })
    expect(wrapper.text()).toMatch(msg)
  })})

適度に編集したソースに合わせて、テストコードを編集する

import { shallowMount } from '@vue/test-utils'
import HelloWorld from '@/components/MyHelloWorldCompo.vue'
describe('HelloWorldTEST.vue', () => {
  it('renders props.msg when passed.....', () => {
    const msgTomo = 'new message meeee'
    const wrapper = shallowMount(HelloWorld, {
      propsData: { msgTomo }
    })
    expect(wrapper.text()).toMatch(msgTomo)       ///  toMatch で期待値と実測値を比較検証
  })
})

package.json

{
 "name": "mycli",
    "version": "0.1.0",
    "private": true,
     "scripts": {
      "serve": "vue-cli-service serve",
       "build": "vue-cli-service build",
       "test:unit": "vue-cli-service test:unit",
        "lint": "vue-cli-service lint"
  },
・・・・・
・・・・・

テスト実施
>npm run test:unit

immediately invoked function expression( IIFE)は、プログラミング言語において、関数を定義後、即座に実行するような構文のこと。 そのような関数を指して即時実行関数や即時関数などと呼ぶこともある。

refer to https://inside.java/2025/06/12/ffm-vs-unsafe/ ,  java 22 has memory operating api, simulating like a malloc(C) , new (C++),

sumary is MemorySegment

https://docs.oracle.com/javase/jp/22/docs/api/java.base/java/lang/foreign/MemorySegment.Scope.html

  • 「ヒープ・セグメント」は、Javaヒープ("on-heap"リージョン)内のメモリー・リージョンによってバックアップされ、アクセスを提供します。
  • 「ネイティブ・セグメント」は、Javaヒープ("off-heap"リージョン)の外部にあるメモリーのリージョンによってバックアップされ、アクセスを提供します。

heap memory( which is operated by malloc, caloc ) , heap area or
stack memory( nomal local val ) , located sack area .   above native segment, off-heap may be stack 

emorySegment segment = ...
int value = segment.get(ValueLayout.JAVA_INT, 0);

@Benchmark

public void fmaReadLoop_1000(Blackhole blackhole) {

    for (int i = 0 ; i < 4000 ; i+=4) {

        blackhole.consume(memSegment.get(ValueLayout.JAVA_INT_UNALIGNED, i));

    }

}

Ths Blackhole may be log 

https://javadoc.io/doc/org.openjdk.jmh/jmh-core/1.23/org/openjdk/jmh/infra/Blackhole.html

Consume object. This call provides a side effect preventing JIT to eliminate dependent computations.

Is it means 

Recentry but it passed 5 years since appearance,

MVC : model,  view , controller, which is traditional design pattern.

MVT : model , view , template , which is adapyed in Django, Python framework.

 

最近のコメント

アイテム

  • myBeutifulFace.JPG
  • 入館証写真04.jpg
  • 入館証写真03.jpg
  • 入館証写真01.jpg
  • LOGO01.png
  • LOGO.png
  • Filterling_a_stream_with_a_predicate_.jpg
  • 接続.png
  • Autonomous Databaseの詳細.png
  • Autonomous Database.png
Powered by Movable Type 5.2.3