PythonからProcessing(Java)へ移行する際の相違点（更新中）

# はじめに
共通試験で「情報」を学んでいる大学生はpythonに慣れていると思います。
ここではProcessingとの違いをまとめます。

# Processingの特徴
https://ja.wikipedia.org/wiki/Processing
より、抜粋します。

ケイシー・リース（Casey Reas）とベンジャミン・フライ（Benjamin Fry）によって、MITメディアラボで開発された。（この二人はジョン・マエダの研究グループのメンバーでした）

### 特徴１　電子アートとビジュアルデザインのためのプログラミング言語

https://processing.org/examples

https://amzn.asia/d/4J0N1Cu

ビジュアル表現に強い

### 特徴２　Javaを単純化し、グラフィック機能に特化
```java
println("Hello World!");
```
上記は、システムのコンソールに文字を出力することができるが、
下記は、ウィンドウのx:20 y:50の位置に文字を表示することができ、
容易にグラフィック機能を使うことができる
```java
text("Hello World!", 20,50);
```
また、図形を描くことも容易である
```java
rect(20, 20, 100, 80);//四角形
ellipse(140, 140, 40, 50);//楕円
```
### 特徴３　アプリケーションとしてエクスポートすることができる
単体の実行ファイルにでき、ソースコードを見られないようにし、配布が可能になります。
Windows Macそれぞれにエクスポート可能

### 特徴４　processing.jsの機能を用いればネット上でコードの実行結果が見られる
JavaScriptのモードがあり、これを使えば、Webブラウザ上で自分のプログラムを動かすことが可能

また、下記サイトでは、ブラウザ上でProcessingのJavaScriptモードを試すことが可能

https://editor.p5js.org/


# ProcessingはJavaで動いている
Javaの文法からさらに、不要な文法が削除されて、シンプルになっています。
```java:javaでsin関数を使う例
public class Main {
  public static void main(String[] args) {
    double result = Math.sin(0.5);
    System.out.println(result);
  }
}
```

```java:Processingでsin関数を使う例
float result = sin(0.5);
println(result);
```

# Processingの開発は継続中
長い目で見た場合、作ったプログラムがいつまでサポートされるかは、重要です。幸い、開発は続けられており、内部で使用しているJavaも新しいものに切り替わっています。最新ProcessingはJava17で動いており、Java17の機能をProcessingから呼び出して使うことも容易です。

# Processingのインストール方法
Pythonのインストールは結構面倒で、バージョン管理とか大変な印象があります。大変なので、オンラインの実行環境を使うことも多いと思います。

Processingは最新版をダウンロードして、インストールするだけです。
現時点では4.3.2が最新です。
https://processing.org/download

# ライブラリのインストール
Pythonは、例えば、pipとかコマンドでいれます。

Processingは、ライブラリマネージャがあって、多くはここからGUIでインストールできます。一覧に表示されない一部のライブラリは、コードを保存した場所にlibというフォルダを作り、その中にjarファイルを置くことで、認識されます。

# 実行方法
Python, Processingともに実行ボタンを押すだけです。
ProcessingはShiftキーを押しながら実行することで、フルスクリーンモードで起動します。

# アプリケーションのエクスポート
Pythonには機能がありません。
Processingでは「アプリケーションとしてエクスポート」から実行ファイルを生成する機能があります。例えばゲームを配布したい場合などには、便利かと思います。

# 出力方法
Pythonはコマンドラインまたは、開発環境であれば、下のほうにテキストが出力されます。
#### Processing標準出力
print命令は下のほうに出力されます。改行付きのprintln命令もあります。
#### Processingウィンドウ出力
ノーコードでウィンドウが開くので、x,y座標を指定して、text命令で文字を表示できます。
#### Processingファイル出力
テキストファイルはsaveStrings命令やcreateWriter命令があります。
画像はsave命令で拡張子指定することで、各種フォーマットの保存ができます。またsaveFrame命令で連番画像の保存ができます。
その他、PDF、SVG、XMLへの保存などができます。

# エントリポイント
Pythonの場合、以下のように書く、
```py
print(99)
```
もしくは、mainを用意します。
```py
def main():
    print(99)
    
if __name__ == "__main__":
    main()
```
Processingの場合、以下のように書きます。
```java
print(99);
```
mainのようなエントリポイントは、強いて言えばsetupです。
```java
void setup(){
  print(99);
}
```

# アニメーション機能
setupは一回だけ実行されます。
drawは毎フレーム実行されます。
両方とも存在しない場合は、１行目から実行されます。

※注意点として、
・すべての関数の外側で宣言した変数は、グローバル変数になる。
・自作の関数をつかうときは、setupかdrawがないとエラーになる。

例えば、単純計算であれば、
```java
float a=pow(2, 16);
print(a); //65536.0
```
と、書きます。

描画の場合、一通り描画して、終わりです。
```java:
for (float th=0; th<TWO_PI; th+=0.05) {
  circle(30*cos(th)+50, 30*sin(th)+50, 10);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/80991c97-6cc4-8b35-e045-c3c0cfb97bb0.png)

自作の関数を使おうとすると、エラーになるので、以下のようにします。
```java
void setup() {
  myFunc();
}

void myFunc() {
  for (float th=0; th<TWO_PI; th+=0.05) {
    circle(30*cos(th)+50, 30*sin(th)+50, 10);
  }
}
```

アニメーションさせたい場合は、以下のようにします。
```java:アニメーションさせる場合
float th; //グローバル変数

void setup(){
  //１回だけの処理
}

void draw(){
  //毎フレーム繰り返す処理
  background(255); //白で全部消す
  circle(30*cos(th)+50,30*sin(th)+50,10);
  th+=0.05;
}
```

![ani.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/70adfcc6-9ef0-cebe-7f35-41d989da0ba8.gif)

# 型
Processingでは変数を事前に、整数なのか、小数なのか、文字なのか…を決める必要があります。また、戻り値のある関数にも型を用意する必要があります。プログラムをPythonから始めた場合、このあたりが、面倒に感じるかもしれません。Processingに用意されている代表的な型を次表に示します。

| 型名 | 種類 | 範囲や特徴 |
|:-:|:-:|:-:|
| byte  | 整数  | -128 ~ 127 |
| int | 整数  | -2147483648 ~ 2147483647  |
| long  | 整数  | -9223372036854775808 ~ 9223372036854775807 |
| float  | 小数  | 精度　約7桁  |
| double  | 小数  | 精度　約14桁  |
| char  | 1文字  | 英数など。日本語は含まない |
| string | 文字列| 日本語可|
| color |16進数の色|0xAARRGGBB、intと互換あり|
| boolean | true<br>false |

# 配列
python list
processing list
processing []

# print
printとprintln

# 文末の ; コロン

# インデント

⌘T(CTRL+T)

# {}表現

# for
1から100までの合計を計算する例
```python:Python
total = 0
for i in range(1, 101):
  total += i
print(total)
```
```java:Processing
int total = 0;
for (int i=1; i<=100; i++) {
  total += i;
}
print(total);
```
# foreach

# while文
1から100までの合計を計算する例
```python:Python
total = 0
i = 1

while i <= 100:
  total += i
  i += 1

print(total)
```


```java:Processing
int total = 0;
int i = 1;
while (i<=100) {
  total += i;
  i++;
}
print(total);
```

# if文
サイコロの出目がいくつかを判別する例
```python:Python
import random
n = random.randint(1, 6)
if n == 1:
  print("n is 1")
elif n == 2:
  print("n is 2")
elif 3<=n and n<=5:
  print("n is 3 or 4 or 5")
else:
  print("n is 6")
```

```java:Processing
int n = int(random(1,7));// not include 7
if(n==1){
  print("n is 1");
}else if(n==2){
  print("n is 2");
}else if(3<=n && n<=5){
  print("n is 3 or 4 or 5");
}else{
  print("n is 6");
}
```

# switch

# ウィンドウの作成
Pythonの場合、標準では機能がないので、グラフライブラリとか、ゲームライブラリを入れたりすると思います。
Processingはsize命令で、大きさを指定します。最大の強みだと感じています。
```java
size(400,400);
```

# ライブラリ
pip
jar
GUI

# GUI