Personal Memo: SwingWorker class study note (English)

24, Oct, 2018 Wed

Memo to know how to use “SwingWorker” class

publish() is connected with process()

Publish() is used in doInBackground() and send data chunk to process().

SwingWorker<T,V>
T – Result type
V – Type for intermediate result

In processBuild() which is my own, I could’t invoke publish() method.
publish() is method should used in doInBackground() method..
How it be written to process method which takes arguments in doInBackground()?

Reference site
http://www.javacreed.com/swing-worker-example/

MultiThreading is natural.
Practically Swing suppose to launch several threads.

First post end. To be continued…

Advertisements

Personal Memo: SwingWorker class study note (日本語)

SwingWorkerクラスの使い方

publish() – process()と結びついている

publish()はdoInBackground()の内部で使われるが、process()にデータチャンクを送信する。

SwingWorker<T,V>
T – 結果の型
V – 中間結果の型

processBuildメソッド中で、publish()メソッドが使えない。

publish()はdoInBackground()中で使うメソッド

引数を取る処理をdoInBackground()で行うときどうすればいい?

このサイトを参考にする
http://www.javacreed.com/swing-worker-example/

マルチスレッドで当たり前。
Swingは実質スレッドがいくつかある。

Jaydle開発メモ:JMenuBarの追加、アクションの追加、内部クラスの復習、JFileChooser実装のための知識の整理メモ

とりあえずLibreOffice Writer似とったメモを貼っておく🙃

==========================================================

JMenubarを追加する

frame.setJMenuBar(menubar);//frameはJFrameオブジェクト、munubarはJMenuBarオブジェクト

 簡単 うまくいった

参考サイト

https://www.javadrive.jp/tutorial/jmenu/

・アクションの追加

JMenuItemオブジェクトのメソッド addActionListenerからactionPerformedメソッドを実行する

 内部クラスを使って、メソッドを書く場所は確保した。

  ダウンロードボタンも少し修正した(JFrameActionListenerを実装せずに内部クラスで実装した)Screenshot from 2018-10-23 22-18-21

参考サイト

http://java2008.blog103.fc2.com/blog-entry-43.html

・内部クラスの復習

class ButtonListener implements ActionListener
{

public void actionPerformed(ActionEvent e)

{

strIn=textIn.getText();

if(strIn.length()>13)

dlAudio(strIn);

}

}

・メモ

File、プロセスビルダーの保存ディレクトリ、空白ではエラーが出る

JFileChooserの実装

  • showOpenDialog()showSaveDialog()メソッドと使うのが最も簡単

  • showDialog()も使える

  • 上記のメソッドはそれぞれユーザがどのようにダイアログを終わらせたかを表す整数のステータスコードを返す

  • もし返却された値がAPPROVE_OPTIONならば、ユーザはファイルを選んだ、それはgetSelectedFile()メソッドから得ることができる

オライリーJFCクイックリファレンス(原)より

ダイアログからやったほうがよさげ

P440

JFileChooserはダイアログからできているみたい。だからダイアログをやるといい。

Macみたいにクイックファイルリーダが欲しい。

それにしても、洋ドラの「シリコンバレー」で、リチャード・ヘンドリクスがスティーブ・ジョブズだの、スティーブ・ウォズニアックだの言っていた。Youtubeで検索してこの動画を見ていた。
”Creativity”というもんが伝わった。

jarコマンドによる実行可能Jarの作成

 

 

jar

オプション

c JARファイルの作成
f ファイル名の決定
v 内容のリストをverboseモードで
m   マニフェストファイルから値と名前を特定する
-C はfileオペランドで指定されたファイルを処理する際にディレクトリが一時的に変更される

 

参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/jar.html
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/jar/jar.html

 

この時のディレクトリ・ファイル構成

~/Desktop/git/masa-examplesがソースのルートディレクトリ
     applications - JaydlePrototype01.java がメインメソッドを含むクラス
     practice - IOMethods.java  がメインクラスで使った依存するクラス

 

まず~/Desktop/git/にJaydleBuildディレクトリを作成
~/Desktop/git/masa-examplesから以下のコマンドを実行

 

javac -d ../JaydleBuild/ applications/JaydlePrototype01.java 
javac -d ../JaydleBuild/ practice/IOMethods.java

 

これでJaydleBuildディレクトリにクラスファイルができた。

 

masa@em-p:~/Desktop/git/JaydleBuildTest$ tree
.
├── applications
│   └── JaydlePrototype01.class
└── practice
    └── IOMethods.class

2 directories, 2 files

のように、

パッケージのディレクトリが作成されている。

 

次に簡単なマニフェストファイルを同ディレクトリに作成

Manifest-Version: 1.0
Main-Class: applications.JaydlePrototype01

 

そして、さっき作ったクラスファイルとマニフェストファイルをjarコマンドでまとめる。

masa@em-p:~/Desktop/git/JaydleBuildTest$ jar cmf Manifest.txt JaydleJarTest.jar ../masa-examples/

失敗。間違ったJARができた。

 

masa@em-p:~/Desktop/git/JaydleBuildTest$ jar cmf Manifest.txt JaydleJarTest.jar .

これでちゃんと作れた。

Screenshot from 2018-10-21 22-56-14

参考
jar コマンドで実行可能な JAR ファイルを作成する | まくまく Java ノート
http://maku77.github.io/java/jar/executable-jar.html

 

YoutubeのMVの音声を抽出してMP3として保存できます。たぶんLinux環境だと動きます。
https://github.com/iamaturtle113/Jaydle

WindowsとMacでは試してないです。Macなら動くかも?Windowsはターミナルのコマンドがちょっと厳しいか。

注 Youtube-dlコマンドがターミナルから起動できることが条件です。

 

Learning About “ActionPerformed” Method And Around “Actions” In JAVA Swing

JFCinanutshellActionListenerインターフェースとactionPerformedメソッドの実行あたりの事柄を整理したいと考えていて、中古で買った洋書を引っ張り出して来て、訳してみました。これはjava.awt.eventに属するみたい。

javax.swing.Action interface

David Flanagan著
JAVA FOUNDATION CLASSES IN A NUTSHELL, A Desktop Quick Reference (O’reilly) 1999, First Edition より

Chapter 3 – Swing Programming Topics – Actions (P26)

JFCtext

GUIソフトはいろんな方法で一つのオペレーションをユーザーにinvoke(呼び出す)ことを許す。
例えば、ユーザーはメニューからでもツールバーからでもファイルをセーブできるだろうし。捜査の結果は極めて同じ。二つの違うインターフェースを介してユーザーに与えられているのだ。

Swingはそのようなオペレーションに関する情報をencapsulate(カプセル化)する単純でパワフルなインターフェースだ。ActionインターフェースはActionListenerインターフェースをextend(継承)するだからActionインターフェースはactionPerformed()メソッドを含む。要求されたアクションを実際に実行するために実装するメソッドはこれである。それぞれのActionオブジェクトはそのアクションに対して追加的な情報を提供する任意の名前/値ペアを持つ。その値は大体以下を含む:そのオペレーションを名付ける短い文字列、グラフィックにそのアクションを表す一つのイメージ、そしてアクションのためのtooltipツールチップ(ふきだし)で使うのに適したより長い文の文字列。加えて、それぞれのActionオブジェクトはひとつのenabledプロパティとenable利用する、disable利用しないということを認可するsetEnabled()メソッドを持つ。(もしあそこでどの文も選択されてないならば、例えば、”切り取り”アクションは通常disableである。)

あなたはひとつのアクションオブジェクトを直接JMenuやJToolBarに追加することができる。あなたがこれをするとき、そのコンポーネントは自動的にそのアクションを表すためのJMenuItemかJButtonを作る、それはそのアクションの捜査をユーザーに対して可能にしそのアクションのテキスト的な描写とグラフィカルなイメージを適切に表示する。

To be continued ..

 

Java Collection Framework practice

Studying Java Collection Framework.
First collection needs knowledge of generics.

Second List is the base interface..
You will implement List by ArrayList or LinkedList..
Tried ArrayList one.

 List<String> stringList=new ArrayList<String>();
	myList.add("generics");
	println(myList.get(0))

this prints

generics

Wanna write moon’s waxing and waning program I thought.
Checked wikipedia, that’s cycle is 29.27 to 29.83 days.
Hmm, how much it will be complex program?

Ref.
https://en.wikipedia.org/wiki/Lunar_month

#thread-safe or not
#vector

Java build error: When build java code made in eclipse on the terminal.

I couldn’t solve package import problems.
First package should not be used “-(hyphen)”.
My one was masa-example so couldn’t be used. This was git repository name..
So I made “practice” package.
But import my own library didn’t go smoothly..

My mistake was compile directory path and javac command…

javac -d . practice/RegexPractice01.java

Java programs which has dependency class without classpath should be compiled at default root directory with javac -d option..

 

mistake commands

masa@lve-imac2:~/Desktop/git/masa-examples$ javac RegexPractice01.java
RegexPractice01.java:29: error: cannot find symbol
println(str);

masa@lve-imac2:~/Desktop/git/masa-examples$ javac -cp practice.RegexPractice01.java
javac: no source files
Usage: javac <options> <source files>
use -help for a list of possible options

masa@lve-imac2:~/Desktop/git/masa-examples$ javac -d out practice/RegexPractice01.java practice/IOMethods.java
javac: directory not found: out
Usage: javac <options> <source files>
use -help for a list of possible options

 

 

 

 

GAE (Google App Engine)で遊ぶ

公式サイトからダウンロード。ワタクシの場合はJavaザマス。

https://cloud.google.com/appengine/downloads?hl=ja

ダウンロードしたあとは、解凍して、シェルにパスを通すみたい。binディレクトリ。
ファイルの置き場迷うが、 /usr/local/ 下とする

export PATH="$PATH:/usr/local/appengine-java-sdk-1.9.63/bin/"
その際の参考資料
Windowsユーザーに教えるLinuxの常識(3):各ディレクトリの役割を知ろう(サブディレクトリ編) (2/2)
http://www.atmarkit.co.jp/ait/articles/0109/07/news002_2.html

 

以下、クイックスタートに沿って、リアルタイムで進行中

 

git cloneでソースのダウンロード。
私の場合 ~/Code/googleAppEngine/ にダウソ。

mvn appengine:devserver

を実行。
なんか、

[INFO] INFO: Dev App Server is now running

となり、サーバーが起動中になってるみたい。
http://localhost:8080/

にブラウザからアクセスすると、

Event tracked.

と書いてある。

mvn appengine:devserver コマンドを実行するディレクトリ間違えた。

…/appengine/helloworldで上記のコマンド実行、localhost:8080/にアクセス ->

ブラウザに

Hello, world

と書いてある。

 

次は、プリント文の中身を書き換え、mvn clean packageを実行して、リビルド。
ワタクシのバアイハ、

This is Test web page of Masataka Nakamura a.k.a La Ville Eternell
Overriding Google App Engine Example 'Hello World App'.
This is Java SDK.
Other contents coming soon maybe..
By teh way I wanna go Siliycon Valley... huh,,,

にした。

 

そして、デプロイのためにCloud Platformプロジェクトと、App Engineアプリケーションを作った。

プロジェクト名は… λ 笑
masa’s first project にした。

リージョンはアメリカ西海岸にしてみた。

サインインに

4/cQCmazgJm8NWlnKt4JJbZvrMqjeHTr1VINh-lDFTIPp7rMZJ1qvQXRw

をアプリにコピペしてくれとある。

なんかよくわからないなと思ったら、google cloud platformに登録しなきゃいけないっぽい。

登録してSDKをインストール。linux版はココから

gcloud init とかでログインしてたら、
.botoファイルを作ったらしいな。これ。

 

・Ubuntuのエラー

よくコンソールみたら、

(java:18774): Gtk-WARNING **: Unable to locate theme engine in module_path: “adwaita”,

ってエラーも出てる

 

https://askubuntu.com/questions/774664/gtk-warning-unable-to-locate-theme-engine-in-module-path-adwaita-error-o

sudo apt install gnome-themes-standard

で解決かな。

 

SuccessCodeのペースト先がわからん

IAM

 

オンラインのチュートリアルに従うと、なんかデフォルトの…でデプロイできなかった。

yamlがないとgcloudコマンドでデプロイできないとなる。
yaml作るか?

gcloud init で 使うプロジェクトをオンラインチュートリアルでつくったものに変えた。

cloudshellでmavenのプラグイン足りてないってエラー。

appengine系のプラグイン足りてないみたい

mvn appengine:devserver これはローカルからアクセスできるようにするためのコマンド

 

mvn appengine:updateの結果
[INFO] Running -A masas-first-project -V masas-first-project1 –oauth2 update /home/masa/Code/googleAppEngine/java-docs-samples/appengine/helloworld/target/appengine-helloworld-1.0-SNAPSHOT
The following URL can be used to authenticate:
https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=550516889912.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/appengine.admin%20https://www.googleapis.com/auth/cloud-platform
Attempting to open it in your browser now.

これはappcfgの話みたい。それへの許可を与えるための画面かな。

英語版の”Quickstart for Java 8 for App Engine Standard Environment“を試す。

gcloud auth application-default login

で、ブラウザからAuth Libraryをトラストするかというの話になる。トラストした。

You are now authenticated with the Google Cloud SDK!となる

 

gcloudコマンドの説明
https://cloud.google.com/sdk/gcloud/

 

 gcloud components install app-engine-java

コマンドを実行。なんかインストールした。

git clone https://github.com/GoogleCloudPlatform/getting-started-java.git

で別のソースをダウンロード

 

gcloud info
たたいたら、ダウンロードディレクトリにインストールされていることがわかった。移動したいな

Installation Root: [/home/masa/Downloads/google-cloud-sdk]

 

 

mvn appengine:deployのエラーコード

[INFO] GCLOUD: ERROR: (gcloud.app.deploy) The current Google Cloud project [testproject-218805] does not contain an App Engine application. Use `gcloud app create` to initialize an App Engine application within the project.

`gcloud app create`でプロジェクトのアップエンジンアプリを初期化してくださいと出てる。
そのとおりにして、またmvn appengine:deployすると。。

Screenshot from 2018-10-08 15-04-36

実は、stackoverflowにも質問していた

 

SwingWorkerとProcessBuilderで、順次更新される(フリーズしない)JTextAreaのコーディング:その一

タイトルの通り、「SwingWorkerとProcessBuilderで、順次更新される(フリーズしない)JTextAreaのコーディング」を調べていた。もう二週間くらい前からのゴール。
まずSwingWorkerにたどり着くまでに時間がかかった。

この辺 「JTextAreaで表示が遅れる」(1) Java Solution - @IT会議室

とか見ていて、まずスレッド、まぁ並行プログラミング(Concurrent Programming)とか言われている領域かと思うけど、その辺の知識が必要になった。注1

・イニシャルスレッド
・イベントディスパッチスレッド
・ワーカースレッド

の話題が出てくる。あと

・Runnableインターフェース 注2
・javax.swing.SwingUtilities – invokeLater(Runnable doRun)

とかね。

で、少し勉強しているうちに、SwingWorkerクラスに突き当たった。
スタックオーバーフローさまさま。

システムの(まぁbashか)lsコマンドを再帰的に行って、SwingのJTextAreaに順次表示するプログラムが載っている。
https://stackoverflow.com/questions/20600721/display-indeterminate-jprogressbar-while-batch-file-runs/20603012#20603012

この板でリンクを教えてもらった。
https://stackoverflow.com/questions/45538227/how-do-i-get-the-jtextarea-to-update-with-each-ping

SwingWorkerはジェネリクスを使うし、ActionListenerや、SwingWorkerの継承メソッドの定義やら、GUIを伴って、複数のクラスを使っていて、いろんな要素の絡みがややこしい。

 

注1 並行プログラミングと並列プログラミングを混同していた。並行はConcurrent、並列はParalell

  • 並列(Parallel) : 複数のプロセスで各々のスレッドを同時に処理すること
  • 並行(Concurrent) : 一つのプロセスで複数のスレッドを切り替えながら動作することで、疑似的に複数のスレッドを同時に処理すること
参考サイト
Qiita Javaの並行処理を理解する(入門編)
https://qiita.com/bremen/items/b87bff49565fc9abc91b

注2 Runnableインターフェースのインプリメンテーションをしたクラスを作って、run()メソッドをオーバーライドする。そしてそのインスタンスを生成する、ことあたりがミソのよう。

参考 HeadFirstJava 一版 15章ネットワークとスレッド

 

Javaコードの管理 その二: Git, Github, Maven, Eclipseの使用

rpart_plot

 

はい、「Javaコードの管理 その一: Git, Github, Maven, Eclipseの使用」に続き、その二でございます。
前回の内容というのは、GitとGithubの理解と、Eclipse上での実行でした。

やはり、公開することで、”仄暗い部屋で一人、ディスプレイのきらめきの中、メガネを光らせている人物”ではないことがわかっていただけるし、それこそ、クモの巣状に繋がりが広がっていくので、とても意味のあることだと思います。「Gitコマンドはターミナル上では小さな命令だが、アクセス性にとっては大きな一歩なのです」w。

そして、ここでMavenの登場が起こるのです。Eclipseの標準的なビルド、ディレクトリ構成を使っているだけでは、Javaアーキテクトとして、構造が把握できていない段階に留まっているのです。(まぁ数週間前の私もそうでしたが)ビルドツールに通じて初めて、ソフトウェア製品の作業工程が理解できるのです。

Mavenは、POM(Project Object Model)ファイルに予め指示を記述しておくことで、煩雑な作業を自動化し、製品のパッケージング、アップデートが簡単にできます。私の場合は、実行可能Jarを自動で更新して生成させたい、というのが今の課題です。

そのためには、Mavenのアセンブリプラグインを使う必要があります。その設定がまた簡単ではなく、POM中で使うオブジェクト(ファイル)の依存関係を理解せねばなりません。

 

オフィシャルガイド
https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

日本語
https://kengotoda.gitbooks.io/what-is-maven/preface/

イメージピクチャ
https://www.marketechlabo.com/r-decision-tree/