Node.js
前提条件
OSにNode.jsがインストールされていること。
Linuxでインストールパッケージがある場合、
$sudo yum install nodejs
・バージョン確認
>node -v
にてバージョンが表示されればインストールされている。
インストールパッケージが無い場合、Webからダウンロードする。
wget https://nodejs.org/dist/v16.16.0/node-v16.16.0-linux-x64.tar.xz
取得元URLは、以下のサイトから、OSに合わせてリンクをコピーしてくる。
https://nodejs.org/ja/download/
今回は、Linuxのx64のものを選択した。
パッケージがダウンロードできたら、解凍する。
tar -xvf node-v16.16.0-linux-x64.tar.xz
回答したフォルダの、/bin/nodeを、ルート配下の/bin/nodeにコピーする。
これで、node -vが通るはず。
この状態で、
$sudo yum install nodejs
これで、npmが通るようになる。
プロジェクトの作成
npm(Node Package Manager)を使って準備する。
プロジェクトフォルダを作成し、そこに移動する。
以下コマンドでプロジェクトを作成する。
$ npm init --yes
アプリフォルダに「package.json」が生成されたことを確認する。
必要なパッケージをインストールする。
複数同時にインストールする場合は、スペース区切りで記載する。
・必須:expressとejs
$ npm install express ejs
・ファイル更新時に自動でアプリを再起動する:Nodemon
$ npm install -g nodemon
・パスワードを暗号化する:bcrypt
$ npm install bcrypt
・セッションを管理する:express-session
$ npm install express-session
・MySQLと接続する
$ npm install mysql
・サービスをデーモン化し永続起動する:forever
$npm install forever
TOPICS:EJSについて
EJS(Embedded Java Script)
JavaScriptとHTMLを両方記述できるNode.jsのパッケージ
基本的にHTMLを記載するものだが、ejs形式のファイルではHTML内に以下記法でJSを埋め込むことができる
<% item.id %> //表示されない処理 <%= item.id %> //表示される処理
アプリケーションの作成
プロジェクトフォルダ直下に、JavaScriptアプリケーションを配置する。
\app.js
const express = require('express'); const app = express(); app.get('/',(req, res) => { res.render('index.ejs'); }); app.listen(3000) #3000はポート番号
viewsフォルダ下にページを配置。
\views\index.ejs
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Test Page</title> </head> <body> <h1>Hello World</h1> </body> </html>
サーバーを起動
$ node app.js
http://localhost:3000にアクセスし、HelloWorldが表示されることを確認する。
※外部からのアクセスが通らない場合は、指定したポートがFWでブロックされていないかを確認。
起動中はコンソール操作不可。Ctrl+Cで終了。
foreverモジュールを使って永続起動する場合は、
$forever start app.js
停止は、
$forever stop app.js
状態確認は、
$forever list
ルーティングの追加
\app.js
app.get('/top',(req, res) => { res.render('top.ejs'); });
\views\top.ejs
CSSの適用/Imageの保存
アプリ内で、publicフォルダをUseする。
\app.js
app.use(express.static('public');
publicフォルダを作成し、スタイルシートや画像を配置する。
\public\css\style.css
\public\images\top.png
ページのHTMLにて、publicフォルダ下のCSSや画像を読み込む。
\views\index.ejs
<link rel="stylesheet" href="/css/style.css"> <img src="/images/top.png">
クエリパラメータを受け取る
req.queryで受け取れる。 \app.js
app.get('/query',(req, res) => { console.log(req.query); console.log(req.query.id); console.log(req.query.name); });
以下をリクエストする:
http://localhost:3000/query?id=001&name=hogehoge
コンソールログの出力:
>{ id: '001', name: 'hogehoge' } >001 >hogehoge
JSONを返す
・決め打ちで返す。
\app.js
app.get('/json',(req, res) => { res.json({'message': 'HelloWorld'}); });
{"message":"HelloWorld"}
変数格納でもOK。
app.js
app.get('/json',(req, res) => { var my_res ={'message': 'HelloWorld'}; res.json(my_res); });
・JSONを作って返す。
(javascriptの文法だが、以下の通り処理できる)
app.js
app.get('/json',(req, res) => { var data = {}; data["id"] = "001"; data["name"] = "Taro"; my_res = JSON.stringify(data); res.json(my_res); });
データベース連携
MySQLのインストール [ターミナル]
$ npm install mysql
MySQLへの接続 [JavaScript]
const mysql = require('mysql'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'test_db' }); //失敗時のエラー処理 connection.connect((err) => { if (err) { console.log('error connecting: ' + err.stack); return; } console.log('success'); });
・クエリの実行
該当ページを開く際のルーティングに処理を記載する。
[app.js]
connection.query( 'SELECT * FROM test_table', (error, results) => { console.log(results); //実行結果の配列がコンソール出力される。 res.render('index.ejs', {items: results}); //index.ejsに取得オブジェクトを返す } );
[index.ejs]
<% items.forEach( (item) => { %>
・フォームの送信
[news.ejs]
<form action="/create" method="post"> <input type="text" name="itemName> <input type="submit" value="作成する"> </form>
post用のルーティングを記載する
[app.js]
//フォームから送信された値を受け取る app.use(express.urlencoded({extended: false})); //postのルーティングを記載 app.post('/create', (req,res) => { //フォームから受け取った内容をコンソール出力。 console.log(req.body.itemName); //クエリを記載(※上記の「クエリを実行」の内容と同様。) connection.query( 'SELECT * FROM test_table', (error, results) => { res.render('index.ejs', {items: results}); } ); }
取得した値をデータベースに書き込む(INSERT)
前項でconsole.log出力していた部分を、INSERT文に変更している。
[app.js]
app.post('/create', (req,res) =>{ connection.query( 'INSERT INTO test_table (name) VALUES(?)', [ req.body.itemName ], //クエリ中の"?"に変数の値を代入 (error, results) => { //結果取得処理として前項のSELECT処理を行う。 connection.query( 'SELECT * FROM test_table', (error, results) => { res.render('index.ejs', {items: results}); } ); } ); }
・リロードによりINSERTクエリを再送信してしまうため、 リダイレクトを用いる。
(直近のリクエストは/createのため、リロード時に再度/createをリクエストしてしまう。/createの後/indexにリダイレクトすることで、直近リクエストが/indexになり、リロードによる再Insertを防ぐことができる。)
(error, results) => { res.redirect('/index'); }
・削除クエリ DELETE
[index.ejs]
<!--post内容にidを含めるようフォーム(リンク)を作成しておく--> <form action="/delete/<%=item.id%>" method="post"> <input type="submit" value="削除"> </form>
[app.js]
app.post('/delete/:id', (req,res) => { //受け取ったidをコンソール表示 console.log(req.params.id); //削除クエリを実行する。 connection.query( 'DELETE FROM items WHERE id = ?', [req.params.id], (error, results) => { //インデックスページにリダイレクトする res.redirect('/index'); } ); });
・更新クエリ UPDATE
[index.ejs]
<!--idを含めた形で編集画面を開くリンクを作成する--> <a href="/edit/<%=item.id%>">編集</a>
[app.js]
//編集画面を開く処理 app.get('/edit/:id', (req,res) => { //受け取ったidをコンソール表示 console.log(req.params.id); //受け取ったidに基づき、DBをSelectする。 connection.query( 'SELECT * FROM items WHERE id = ?', [req.params.id], (error, results) => { //編集ページを開く。この時、取得結果を引き渡す。 res.render('edit.ejs', {item: results[0]}); } ); }); //更新ボタンを押したときの処理 app.post('/update/:id' (req, res) => { //編集画面で入力されたテキスト console.log(req.body.itemName); //Update処理 connection.query( 'UPDATE items SET name = ? WHERE id = ?', [req.body.itemName, req.params.id],. (error, results) => { res.redirect('/index'); } ); });
編集画面 [edit.ejs]
<form action="/update/<%=item.id%>" method="post"> <!--入力テキストボックス。取得した値を初期値セットする。--> <input name="itemName" value="<%=item.name%>" type="text"> <input type="submit" value="更新する"> <!--更新時の戻り値に、req.body.itemNameを渡す--> </form>
デバッグ
//エラーがあれば出力するようにしておく。 (error, results){ if(error){ console.log(error); } }
VC# Windows Formアプリケーション基礎
・共通
プロパティ>デザイン>(Name)で識別名をつける
プロパティ>表示>Textで、表記内容
・メイン窓
画面サイズを小さくした時に自動ですくろーるばーを出すには、
配置>AutoScrollをTrue
・入力窓
Textboxコントロールを使う
/
プロパティ>動作>TabIndexで、タブを押したときにカーソルが移動する順序を規定する。
デフォルトでは、フォームを配置した順にいどうする。
・テキスト
Labelコントロールを使う
・ボタン
Buttonコントロール
・フォーム自体のプロパティ
表示>Text にウインドウタイトル
配置>Size でウインドウサイズを数値指定
・コード
フォームを ダブルクリックして、コード入力に移る
画面から値を読み取るには、
例えば、TextBox1というNameの入力値(Textプロパティの値)を読み取る場合は、
input1 = TextBox1.Text
・入力値の型変換
例えば以下コードは、Int型に変換し、変換に失敗した場合は0を返す。
if(!int.TryParse(textValue.Text, out value))
value=0;
・メッセージボックスを表示
MessageBox.Show("メッセージを表示");
Java Script 基本文法
コンソール出力
console.log("Hello World"); // で1行コメントアウト /* 範囲コメントアウト */
文字列はシングルクオート、ダブルクオートどちらで囲んでもOK
変数定義
・変数定義
let name = "hogehoge"; console.log(name + "です");
> hogehogeです
・定数定義
const name = "fugafuga"; //上書き不能(上書きしようとするとエラーになる)
テンプレートリテラル
文字列の中に変数を埋め込む記法
const name="hogehoge" let age = 20 console.log(`${name}は${age}です`);
Point
・全体をバッククオートで囲む。
・変数、定数を${}で参照する。
条件分岐(IF)
if (number === 10){ console.log("10です"); } else if (number > 10) { console.log("10より大きい"); } else { console.log("10より小さい"); }
演算子
//比較演算子
== あいまい一致 ※
=== 厳密一致 ※
!== 不一致
>、<、>=、<= 比較
※厳密一致では型の違いを許容しない。
例)
5=='5' //true
5==='5' //false
&& And条件
|| OR条件
//演算
number = number + 1; number += 1; number++;
Switch文
switch (rand){ case 0: console.log("グー"); break; case 1: console.log("チョキ"); break; case 2: console.log("パー"); break; default: console.log("エラー"); break; }
While文
let number = 1; while (number <=10){ console.log(number); number += 1; }
For文
for (let number =1; number <=10; number +=1){ console.log(number); }
配列
let animals = ["dog","cat","mouse"]; for (let i=0; i<animals.length; i++){ console.log(animals[i]); } //forEachによる再起呼び出し animals.forEach(( (animal) => { console.log(animal); };
オブジェクト
let profile={name:"hoge", age:20}; console.log(profile.name);
関数定義
const myFunc = function(引数){ console.log("処理”); return 戻り値; } //呼び出し myFunc(引数); //関数定義は以下記述も可能(アローファンクション) const myFunc = (引数) =>{ } //引数を複数指定する場合はカンマで区切る
クラス
class Animal{ //クラスの作成 //コンストラクタ(インスタンス作成時に実行したい処理を記述) constructor(name,age){ this.name = name; this.age = age; } greet(){ //メソッドの記述(名前は任意) console.log("こんにちは"); } info() { //メソッドの記述(名前は任意) this.greet(); console.log(`名前は${this.name}です`); console.log(`${this.age}歳です`); } } const animal = new Animal("ポチ",3); animal.info(); >こんにちは >名前はポチです >3歳です
・クラスの継承
//Animalクラスを継承したDogクラスを作成する class Dog extends Animal{ //コンストラクタをオーバーライド constructor(name,age,breed)} //親クラスのコンストラクタを継承(スーパークラス) super(name,age); this.breed = breed; } //Dogクラスのみで定義するメソッド(人間換算年齢を返す) getHumanAge{ return this.age * 7; } //親クラスにもあるメソッドをオーバーライド info(){ this.greet(); console.log(`名前は${this.name}です`); console.log(`犬種は${this.breed}です`); console.log(`${this.age}歳です`); const humanAge = this.getHumanAge(); console.log(`人間年齢で${humanAge}歳です`); } } const dog = new Dog("ポチ",4, "柴犬"); dog.info(); >こんにちは >名前はポチです >犬種は柴犬です >4歳です >人間年齢で28歳です
モジュール分割(クラス)
別ファイルに分けた場合の関連付け
「script.js」「dog.js」「animal.js」
[animal.js]
class Animal{ } //デフォルトエクスポート(1ファイルに1つだけ) export defalut Animal;
[dog.js]
import Animal from "./animal"; //デフォルトエクスポートされたクラス、値、関数などを、 //任意の名前でインポート(名前はAnimalでなくても良い)
名前付きエクスポート
[dog.js]
const dog1 = new Dog("ポチ", 4, "柴犬") //名前付きエクスポート(複数可) export {dog1, dog2, ...};
[script.js]
import {dog1, dog2} from "./dog".
ファイル参照について
"./dog" 同じディレクトリ内のdog.jsを参照
"./data/dog" dataフォルダ内のdog.jsを参照
"../dog" 一つ上の階層のdog.jsを参照
パッケージのインポート
import chalk form "chalk";
なお、chalkは文字色を変えることができる
console.log(chalk.yellow("test")); //黄色文字 console.log(chalk.byCyan("test")); //シアン背景
入力値を読み取る場合はreadline-syncパッケージを使う
import readlineSync from "readline-sync"; const name = readlineSync.question("名前を入力してください: "); console.log(`名前は${this.name}です`);
モジュール分割(関数)
子モジュール側でexportsを指定し、親側でimportする。
子:module.js
exports.test_func = function() { console.log("Test Print"); }
親:app.js
var test_module = import('./module.js'); app.get('/', (req, res) => { test_module.test_func(); }
コールバック関数
//関数定義 const PRINTTEXT = () =>{ console.log("テキスト出力"); } //コールバック関数定義 const CALL = (CALLBACK) => { console.log("コールバック関数を呼び出します。") CALLBACK(); } //呼び出し CALL(PRINTTEXT);
※大文字部は任意に命名した関数名
引数で関数を定義する
//コールバック関数定義 const CALL = (CALLBACK) => { console.log("コールバック関数を呼び出します。") CALLBACK(); } //呼び出し CALL( () =>{ console.log("テキスト出力"); } );
コールバック関数に引数を渡す
//コールバック関数定義 const CALL = (CALLBACK) => { CALLBACK("トム","勝ち"); } //呼び出し CALL( (name,result) =>{ console.log(`${name}の${result}です。`); } ); >トムの勝ちです。
Java 基本文法
Hello World
class Main { public static void main(String[] args) { System.out.println("Hello Java"); } }
コメントアウト
//コメント /*範囲コメント*/
変数定義
int number = 10; double pi = 3.14; String Name = "hogehoge"; boolean flag = true; //型キャスト int a=10 int b=4 System.out.println((double)a/b); //2.5
if文
if (x==10){ System.out.println("xは10"); }else if (x>10){ System.out.println("xは10より大きい"); }else{ System.out.println("xは10より小さい"); } //一致 x==10 //大小 x>10 //非一致 x!=10 !(x>10) //アンド x==10 && y==10 //オア x==10 || y==10
switch文
switch(number%3){ case 0: System.out.println("3で割り切れます"); break; case 1: System.out.println("3で割ると1余ります"); break; case 2: System.out.println("3で割ると2余ります"); break; default: break; }
while文
//カウントダウン while (number > 0){ System.out.println(number); number --;
for文
for (int i=1; i<=10; i++){ System.out.println(i+"回目のループです"); } //途中で抜ける場合、break //その周回をスキップして次の周回に移るにはcontinue
配列
String[] names = {"hogeA", "hogeB", "hobeC"}; System.out.println(names[0]); //hogeA
SQL基本文法
※基本的にMySQLにて確認しています。
コメントアウト
文頭に「--」(ハイフン2個)を付ける
--コメント
範囲コメントアウトは /* */
/* ここからコメント ここまでコメント*/
Select(読み出し)
--Selectする select * from テーブル名; --※SQLは文末にセミコロンが必要。 --セミコロンがあるまでは何回改行しても一文。 --カラムを選択してSelectする select カラム名1, カラム名2 from テーブル名; --where(絞り込み) select * from テーブル名 where カラム名 = '値' and カラム名 = '値'; --あいまい検索 select * from テーブル名 where カラム名 like '_値%'; --%はワイルドカード。0文字以上の任意の文字。 --_は1文字の任意の文字。 --order by (並び替え) select * from テーブル名 order by カラム名 asc; -- asc : 昇順 (ascending) -- desc : 降順 (descending) --上位n件のみ表示 --①limit (SQL標準記法) select * from テーブル名 order by カラム名 asc limit 5; --②top (DBによって使えたり使えなかったり。MSSQLはこれ使ってる) select top 5 * from テーブル名 order by カラム名 asc; --③副問い合わせしてrownumで絞る(Oracleではこれ使ってる) select * from (select * from テーブル名 order by カラム名 asc) where rownum >= 5; --distinct (重複削除) select distinct カラム名 from テーブル名;
集計
-- 合計(sum) select sum(カラム名) from テーブル名; --他の集計関数も使い方は同じ --計上(count)、平均(avg)、最大(max)、最小(min) --単純指定だと、結果は1行のみ返される。 --Group by select sum(値のカラム名) from テーブル名 group by 名称のカラム名; --グループ化した名称ごとに集計した値が返される。 --(テストの集計などで、「教科」「点数」のカラムがあるイメージ) --※Group byは、必ず集計関数と合わせて使う --Having(Gruop byした結果の絞り込み) --Whereの代わりにHavingを使う。使い方はWhereとほぼ同じ。
Join(結合)
--2つ以上のテーブルを結合して表示する。 select * from テーブル1 join テーブル2 on テーブル1.id = テーブル2.id; --テーブル1.idが外部キー、テーブル2.idがテーブル2の主キー --joinだと、外部キーがNullだった行は表示されない。 --Null行も表示するには、「left join」を使う。文法は同じ。 --結合後のテーブルで、同じカラム名の行がある場合はドットで使い分けする。 --また、Asで命名しておけばその名前で表示される。 --例) select テーブル1.name as '氏名'、テーブル2.name as '所属' --(後で書く) 外結合、内結合、自然結合などの使い分けを書きたい。
Insert(作成)、Update(更新)、Delete(削除)
--Insert insert into テーブル名 (カラム1, カラム2) values ('値1', '値2'); 例) insert into user_table (id, name, age) values ('1', 'ポチ', '5');
id | name | age |
---|---|---|
1 | ポチ | 5 |
--Update update テーブル名 set 上書きするカラム名 = '値' where 検索するカラム名 = '値' ; 例) update user_table set name = 'タマ', age = '3' where id = '1';
id | name | age |
---|---|---|
1 | タマ | 3 |
--Delete delete from テーブル名 where 検索するカラム名 = '値' ; 例) delete from user_table where id = '1';
※updateとdeleteでは、必ずwhere句で行を指定すること(id指定など) 指定がない場合は全行更新or削除される。
COMMIT, ROLLBACK
トランザクションを反映するにはCommit、取り消すにはRollbackする。
commit;
rollback;
特定の作業まで戻りたい場合は、セーブポイントを設ける。
--処理1 SAVEPOINT save1; --処理2 ROLLBACK TO save1;
save1のポイントまで戻る。処理1は適用(コミット前)、処理2は取り消しとなる。
MySQLではデフォルトでAutoCommitが有効。UpdateやInsertは即時コミットされる。
--AutoCommit状態の確認(1: 有効、0: 無効) select @@autocommit; --AutoCommit の有効化 set autocommit = 1; --AutoCommitの無効化 set autocommit = 0;
クエリ内で変数を定義する
--定義 DECLARE @table_name = 'hogehoge' --確認 PRINT @table_name --参照 Select * from @table_name --コマンドごと埋め込んで実行することも可能 DECLARE @command = 'select * from hogehoge' EXECUTE @command
データベースの操作
CREATE DATABASE test_db; --データベースの作成 SHOW DATABASE; --データベースの確認 USE test_db; --データベースの選択 DROP DATABASE test_db; --データベースの削除
テーブルの操作
--テーブルの作成(例:自動生成ID、名前、年齢) ※MySQLにて確認 CREATE TABLE test_table( id INT AUTO_INCREMENT, name TEXT, age INT, PRIMARY KEY (id) )DEFAULT CHARSET = utf8; --テーブル一覧の確認 SHOW TABLES; --テーブルのカラム定義の確認 SHOW COLUMNS FROM test_table; SHOW FULL COLUMNS FROM test_table; --Create Table文の確認 SHOW CREATE TABLE test_table; --テーブルのリネーム ALTER TABLE test_table RENAME TO test_table_renamed; --テーブルの削除 DROP TABLE test_table; --データの投入 INSERT INTO test_table (name, age) VALUES ('太郎', 12); --カラムの追加 ALTER TABLE items ADD COLUMN level INT; ※型指定が必要なので注意 --カラムを削除する ALTER TABLE items DROP COLUMN level; --追加したカラムに値を追加(Update) UPDATE test_table SET level = 20 WHERE id = 1; UPDATE test_table SET level = 18 WHERE id = 2; --カラムのデータ型を確認する DESCRIBE test_table; --カラム名を変更する(例:levelをlevelsに変更する) ALTER TABLE test_table CHANGE COLUMN level levels INT;
日付を扱う
現在日付の取得
SYSDATE() もしくは NOW() で取得可能。
システムの日時なので、タイムゾーンはシステムに依存する。
SELECT SYSDATE(); >2021-10-20 09:20:35 SELECT NOW(); >2021-10-20 09:20:35
※SYSDATEとNOWの違い
・SYSDATE⇒コマンドが実行された瞬間の時刻を返す。
・NOW⇒クエリが実行された時間を返す。
短時間のクエリではほぼ同一の時間が返るが、処理に時間がかかるクエリを投げると差が出る。
特に、単一のクエリの中で複数回現在時刻を呼び出す場合は、NOWの方が負荷を下げられ、また常に同じ値が得られるため使い勝手がいい。
フォーマットを調整する。
・日時の書く要素を取り出す
DATE( NOW() ); --日付を取り出す >2021-10-20 TIME( NOW() ); --時刻を取り出す >09:20:25 YEAR( NOW() ); --年を取り出す >2021 MONTH( NOW() ); --月を取り出す >10 DAY( NOW()); --日を取り出す >20 HOUR( NOW() ); --時間(hour)を取り出す >9 MINUTE( NOW() ); --分を取り出す >20 SECOND( NOW() ); --秒を取り出す >35 --※頭の0は外れる。(MySQLの場合)
DATE_FORMATを使う。
例えば、SYSDATEをYYYYMMDDの形式で取得する場合
SELECT DATE_FORMAT(SYSDATE(), '%Y%d%m'); >20211020
Excel VBA シート操作
行、列の操作
'''vb Columns(1).Insert 'A列に挿入 Columns("A").Insert 'A列に挿入 Rows(1).Insert '1行目に挿入
Columns(1).Delete 'A列を削除
Rows(1).Delete '1行目を削除
Dim myrange As Range
Set myrange = "A2"
myrange.EntireColumn.Insert 'Rangeの列全体に挿入
myrange.EntireRow.Insert 'Rangeの行全体に挿入
’’’
文字色、塗り色を変える
VBA Excelマクロ 基本文法
概要
コメントアウト
' シングルクオート(')でコメントアウト
範囲コメントアウトする場合は、VBAのツールバーの「編集」を表示し、コメントブロックを使用する。
コンソールデバッグ
VBAで、Ctrl+G、もしくは「表示」>「イミディエイトウインドウ」でウィンドウを出す。
内容がこちらに出力されるので、動作確認、デバッグに使用する。
基本的に、使用しているユーザーには見せないメッセージがこちら。
- スクリプト内からイミディエイトに出力する。
Debug.Print("テストメッセージ")
ブレーク時に、イミディエイトに?{変数名}と入力しリターンすれば、その時点での変数値を表示
例:変数xの値を確認 (x=10)
?x
10
メッセージボックス出力
ユーザーに見せるメッセージなどはこちら。
(はい、いいえや、OK、キャンセルの入力を求める場合については後述)
MsgBox("テストメッセージ")
変数定義
Dim str As String
セル操作
- セルの書き込み
Range("A1").Value = "テスト"
###IF文 ###For文 ###While文 ###サブルーチン ・サブルーチンは返り値を持たない。 ###ファンクション ・ファンクションは返り値を持つ。 ###引数のbyRefとbyValについて ・byRef 参照渡し 関数内で値が変更された場合、元の関数でも値が変わる。 ・byVal 値渡し 関数内で値が変更されても、元の関数には影響しない。