管理画面の初期表示(テストデータの表示)をする

Posted コメントするカテゴリー: WordPress

管理画面にアクセスした際、初期表示を行います。

あらかじめテーブル「wp_sample_mst」にテスト用データを3件程登録しておきます。
前回の投稿で作成した関数「function sample_plugin()」に、下記のようにデータベースにアクセスしてデータを取得するSQLを書きます。

	/**
	 * 管理画面のHTMLの生成と表示
	 */
	function sample_plugin()
	{
		echo <<< EOL
<h1>sample_plugin メインページ</h1>
ここにHTMLテンプレートを生成していきます。
EOL;
		//データ一覧
		echo <<< EOL
<h2>データ一覧</h2>
<table>
<tr>
<th nowrap>ID</th>
<th nowrap>名前</th>
<th nowrap>登録日時</th>
			</tr>
EOL;
		global $wpdb;
		$tbl_name = $wpdb->prefix . 'sample_mst';
		$sql = "SELECT * FROM {$tbl_name} ORDER BY id;";
		$rows = $wpdb->get_results($sql);
		foreach($rows as $row) {
			echo "<tr>";
			echo "<td nowrap>" . $row->id . "</td>";
			echo "<td nowrap>" . $row->sample_name . "</td>";
			echo "<td nowrap>" . $row->create_date . "</td>";
			echo "</tr>";
		}
		echo "</table>";
	}

上記の例では、テストデータを3件取得して表示しています。

実行結果は以下のようになります。

テーブルに登録したテストデータ3件の表示がされました。
今後、このデータを修正、削除、登録ができるように進めます。

管理画面のHTMLの生成と表示を行う

Posted コメントするカテゴリー: WordPress

前回までの投稿で、wordpress管理画面のメニューに「SamplePlugin1」というメニューが追加されました。

(下記画像を参照)

001

今回はこのメニューをクリックした時、右側のページにHTMLを生成して表示する動作を作ってみます。

コードは以下のように記述します。
関数「add_pages」の部分の「add_menu_page」の引数に
「array($this, ‘sample_plugin’)」と書いている部分があります。

	function add_pages()
	{
		add_menu_page(
			'SamplePlugin1 Plugin Settings',
			'SamplePlugin1',
			'manage_options',
			'SamplePluginMenu',
			array($this, 'sample_plugin')
		);
	}

この「sample_plugin」という名前の関数(メソッド)を新規作成します。
例えば、以下のように書きます。

	/**
	 * 管理画面のHTMLの生成と表示
	 */
	function sample_plugin()
	{
		
		echo <<< EOL



<h1>sample_plugin メインページ</h1>


ここにHTMLテンプレートを生成していきます。

EOL;
		
	}

上記のように記述して、管理メニューの「SamplePlugin1」を押すと、画面は以下のように表示されます。

002

このようにして、管理項目などを表示するHTMLを生成していきます。

プラグインのアンインストール時の動き

Posted コメントするカテゴリー: WordPress

プラグインのアンインストール時の動きを書きます。

まず、前回のプラグイン停止時の動きと同じように、クラスの外で
次のように書きます。

//アンインストール時の設定
register_uninstall_hook(__FILE__, array('SamplePlugin1', 'myplugin_uninstall'));

続いて、クラスの中で次のように書きます。

	/**
	 * 停止時の実行
	 */
	function myplugin_unactivate()
	{
		global $wpdb;

		//削除するテーブル名の決定
		$table_name = $wpdb->prefix . 'sample_mst';

		//テーブル削除
		$sql_drop = "DROP TABLE " . $table_name . ";";
		$wpdb->query($sql_drop);
	}

こうすることで、プラグインのアンインストール時に、メソッド「myplugin_unactivate」が呼び出されることになります。

プラグイン停止時の動き

Posted コメントするカテゴリー: WordPress

前回の投稿では、プラグインのインストール時にテーブル作成を行いました。

今回はプラグイン停止時の処理を追加します。

停止時はプログラムの先頭で以下の処理を書いてから

//停止時の設定
register_deactivation_hook(__FILE__, array('SamplePlugin1', 'myplugin_unactivate'));

↓のように停止時用の関数を作成します。

/**
* 停止時の実行
*/
function myplugin_unactivate()
{
	//テーブルデータ消去などなど
	global $wpdb;

	//削除するテーブルの決定
	$table_name = $wpdb->prefix . 'sample_mst';

	//テーブル削除
	$sql_delete = "DELETE FROM " . $table_name . ";";
	$wpdb->query($sql_delete);
}

こうする事で、プラグイン停止時の動きを制御します。

また、上記の例では、deleteを行ってテーブルの内容をクリアしていますが、
AUTO_INCREMENTを使用しているテーブルの場合などの場合は

$sql_delete = "DELETE FROM " . $table_name . ";";

のところを

$sql_delete = "TRUNCATE TABLE " . $table_name . ";";

としてもいいと思われます。

削除時になにを残して、何を消すのか、プラグインの性質をよく考えて
決めるのがよいと思います。

次回はプラグインのアンインストール時の動きを書きます。

プラグインインストールと同時にテーブルを作成する

Posted コメントするカテゴリー: WordPress

前回の投稿ではプラグインのインストール時に特定のメソッドを呼ぶ方法を書きました。
それを踏まえて、今回はプラグインのインストール時にデータベース内に、簡単なテーブルを作成することをやってみます。

まずは、myplugin_activateメソッドが呼ばれた時に(インストールされた時に)、テーブル作成するSQL(DDL文)を呼びます。

function myplugin_activate()
{
	//テーブル作成などなど
	self::create_tables_sample_mst();
	
}

メソッド名に特に決まりはなく、任意の名前のものを書きます。

次に、呼ばれる側のメソッドを書きます。

function create_tables_sample_mst()
{
	//ここでテーブル作成を行う
	
	
}

これで、インストール時にcreate_tables_sample_mstメソッドが呼ばれて
テーブル作成などができるようになります。

では、実際に、create_tables_sample_mstメソッド内にテーブル作成のSQLを書いてみます。

function create_tables_sample_mst()
{
	global $wpdb;

	$charset_collate = "";

	//接頭辞の追加(socal_count_cache)
	$table_name = $wpdb->prefix . 'sample_mst';

	//charsetを指定する
	if (!empty($wpdb->charset)) {
		$charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} ";
	}

	//照合順序を指定する(ある場合、通常デフォルトのutf8_general_ci)
	if (!empty($wpdb->collate)) {
		$charset_collate .= "COLLATE {$wpdb->collate}";
	}

	$sql = <<< EOL
CREATE TABLE {$table_name} (
id				INT NOT NULL AUTO_INCREMENT,
sample_name		VARCHAR(128),
create_date		DATETIME,
PRIMARY KEY(id)
) {$charset_collate};
EOL;

	//dbDeltaを実行する為に必要
	require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
	dbDelta($sql);
}

コードを一つづつ追うとわかるのですが、まず、

global $wpdb;

で、wordpress内のデータベースにアクセスする為のクラスを読み込んでいます。
$wpdbはSQLの実行時にいたるところで使うので、この読み込み方はよく覚えておくといいと思います。

作成するテーブル名称は「wp_sample_mst」となります。
wp_というのはwordpressに関するテーブルの接頭辞(接頭句?)になり、よほどのことがない限り、
この「wp_」という名称に従ったほうがよいと思います。

その次に、charset

//charsetを指定する
if (!empty($wpdb->charset)) {
	$charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} ";
}

と照合順序を

//照合順序を指定する(ある場合、通常デフォルトのutf8_general_ci)
if (!empty($wpdb->collate)) {
	$charset_collate .= "COLLATE {$wpdb->collate}";
}

それぞれセットして、テーブル作成文を実行します。

実際にプラグインのインストールを試して、テーブルが作成されることを確認します。

最後に、少し長くなりますが、ソースコード全体を書いておきます。

<?php
/*
Plugin Name: SamplePlugin1
Plugin URI:  http://
Description: サンプルプラグイン。
Version:	 1.0
Author: 	 sample
Author URI:  http://
License:	 GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

register_activation_hook(__FILE__, array('SamplePlugin1', 'myplugin_activate'));
register_deactivation_hook(__FILE__, array('SamplePlugin1', 'myplugin_unactivate'));
register_uninstall_hook(__FILE__, array('SamplePlugin1', 'myplugin_uninstall'));

class SamplePlugin1
{

	function __construct()
	{
		add_action('admin_menu', array($this, 'add_pages'));
	}

	function add_pages()
	{
		add_menu_page(
			'SamplePlugin1 Plugin Settings',
			'SamplePlugin1',
			'manage_options',
			'SamplePluginMenu',
			array($this, 'sample_plugin')
		);
	}

	function myplugin_activate()
	{
		//テーブル作成などなど
		self::create_tables_sample_mst();
		
	}

	function myplugin_unactivate()
	{
		//テーブルデータ消去などなど
		
		
	}
	 
	function myplugin_uninstall()
	{
		//テーブル削除などなど
		
		
	}

	function create_tables_sample_mst()
	{
		global $wpdb;

		$charset_collate = "";

		//接頭辞の追加(socal_count_cache)
		$table_name = $wpdb->prefix . 'sample_mst';

		//charsetを指定する
		if (!empty($wpdb->charset)) {
			$charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} ";
		}

		//照合順序を指定する(ある場合、通常デフォルトのutf8_general_ci)
		if (!empty($wpdb->collate)) {
			$charset_collate .= "COLLATE {$wpdb->collate}";
		}

		$sql = <<< EOL
CREATE TABLE {$table_name} (
id				INT NOT NULL AUTO_INCREMENT,
sample_name		VARCHAR(128),
create_date		DATETIME,
PRIMARY KEY(id)
) {$charset_collate};
EOL;

		//dbDeltaを実行する為に必要
		require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
		dbDelta($sql);
	}

}

new SamplePlugin1;

プラグインインストール時の振る舞いを設定

Posted コメントするカテゴリー: WordPress

プラグインを「有効化」するタイミングで、そのプラグインを使うにあたっての初期設定をプログラムすることができます。

例えば、プラグイン内で使用するデータベース内のテーブルを作成する等といったことを記述します。

また、プラグインを停止したタイミング。プラグインをアンインストールしたタイミングでそれぞれの動作をプログラムすることができます。

試しに、プラグインを有効化したタイミングの挙動を書いてみます。

register_activation_hook(__FILE__, array('SamplePlugin1', 'myplugin_activate'));

まず、プラグイン内のクラスの外に、上記の命令を記述します。

次にクラス内に以下のメソッドを追加します。

function myplugin_activate()
{
	//テーブル作成などなど
	
	
}

ここでは、具体的なテーブル作成の命令は書いていませんが、このメソッド内に初期化の命令をまとめて記載しておくといいと思います。

これと同様に、停止時、アンインストール時には、次のように書きます。

register_deactivation_hook(__FILE__, array('SamplePlugin1', 'myplugin_unactivate'));
register_uninstall_hook(__FILE__, array('SamplePlugin1', 'myplugin_uninstall'));

同様にメソッドもクラス内に書いて用意しておきます。

function myplugin_unactivate()
{
	//テーブルデータ消去などなど
	
	
}

function myplugin_uninstall()
{
	//テーブル削除などなど
	
	
}

以上になります。
出来上がったプログラムの全体は、以下のようになります。

<?php
/*
Plugin Name: SamplePlugin1
Plugin URI:  http://
Description: サンプルプラグイン。
Version:	 1.0
Author: 	 sample
Author URI:  http://
License:	 GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

register_activation_hook(__FILE__, array('SamplePlugin1', 'myplugin_activate'));
register_deactivation_hook(__FILE__, array('SamplePlugin1', 'myplugin_unactivate'));
register_uninstall_hook(__FILE__, array('SamplePlugin1', 'myplugin_uninstall'));

class SamplePlugin1
{

	function __construct()
	{
		add_action('admin_menu', array($this, 'add_pages'));
	}

	function add_pages()
	{
		add_menu_page(
			'SamplePlugin1 Plugin Settings',
			'SamplePlugin1',
			'manage_options',
			'SamplePluginMenu',
			array($this, 'sample_plugin')
		);
	}

	function myplugin_activate()
	{
		//テーブル作成などなど
		 
		 
	}

	function myplugin_unactivate()
	{
		//テーブルデータ消去などなど
		 
		 
	}
	 
	function myplugin_uninstall()
	{
		//テーブル削除などなど
		 
		 
	}

}

new SamplePlugin1;

まだ、具体的な処理は入れていませんが、全体的な骨格が少しづつできてきました。

メニュー追加

Posted コメントするカテゴリー: WordPress

前回作成したプラグインを、管理画面から有効にしてみます。

メニューのプラグインの中にアクセスすると、前回作ったプラグイン「SamplePlugin1」が見えるので、その下の有効化をクリックします。

20160624_001

ただ、この状態ではなにも変化は起きません。
プラグインの中になにもプログラムを書いていないので、変化しないのですね。

では、次にやることと言えば、プラグインを管理画面のメニューの表示させてみます。

<?php
/*
Plugin Name: SamplePlugin1
Plugin URI:  http://
Description: サンプルプラグイン。
Version:     1.0
Author:      sample
Author URI:  http://
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

class SamplePlugin1
{

	function __construct()
	{
		add_action('admin_menu', array($this, 'add_pages'));
	}

	function add_pages()
	{
		add_menu_page(
			'SamplePlugin1 Plugin Settings',
			'SamplePlugin1',
			'manage_options',
			'SamplePluginMenu',
			array($this, 'sample_plugin')
		);
	}

}

new SamplePlugin1;

上記のコードをプログラムの中に記載します。

まず、__constructというコンストラクタ内に

add_action('admin_menu', array($this, 'add_pages'));

と書きます。
これは同じクラス内のメソッド「add_pages」を呼ぶ為のアクションとなります。
アクションについてはwordpressに備わっている考え方で、フィルターフック、アクションフックという考え方があり、それぞれ何らかのきっかけがあった時に実行する命令。という意味で覚えておくといいと思います。

次にコンストラクタに書いた命令で「add_pages」という記載がありますが、これは同じクラス内のメソッド「function add_pages()」を呼ぶという意味になります。

なので、このメソッドを新しく作り、内部にメニューに表示する命令を書きます。

		add_menu_page(
			'SamplePlugin1 Plugin Settings',
			'SamplePlugin1',
			'manage_options',
			'SamplePluginMenu',
			array($this, 'sample_plugin')
		);

ここまで書いたらファイルを保存して、wordpressの管理画面内にアクセスしてみます。
すると「SamplePlugin1」というメニューが表示されます。
クリックはできるのですが、この状態だと、まだなにも表示はされません。

20160624_002

add_actionと、add_menu_pageの関数はwordpressに実装済みの関数なので、以下のページを参考にするといいかと思います。

■add_action
add_action

■add_menu_page
add_menu_page

空のプログラムファイルの作成と準備

Posted コメントするカテゴリー: WordPress

前回までで、プラグイン開発の準備を進めていました。
ここからは具体的にプラグインを形にしていこうと思います。

まず、なんでもいいのでサンプル用のphpファイルを作成し、
前回に書いた、wordpressのプラグインフォルダ内にサンプルphpを設置します。

/wordpressのドキュメントルート/wp-content/plugins/SamplePlugin1/SamplePlugin1.php

次にSamplePlugin1.phpの中に以下のようにコードを書きます。
ここで注意が必要なのは、プラグインファイルの文字コードはUTF-8にしておかないと、
後々文字化け等の現象が出てくることがあるので、注意します。

<?php
/*
Plugin Name: SamplePlugin1
Plugin URI:  http://
Description: サンプルプラグイン。
Version:     1.0
Author:      sample
Author URI:  http://
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

class SamplePlugin1
{
	function __construct()
	{

	}

}

new SamplePlugin1; 

当然、このコードだけではプラグインとしての動作はなにもありません。
ですが、このファイルを設置するだけで、wordpressの管理画面の「プラグイン」の画面に
プラグイン名称が表示されます。

001

一旦、ここまで作ってみて、動作を確認し、次の段階にいきます。

plugin設置場所と、ファイル名称、先頭のコメントについて

Posted コメントするカテゴリー: WordPress

早速プラグインを作っていきますが、まずはプラグインのファイルを
格納するディレクトリの確認からです。

pluginは、wordperssのドキュメントルート配下から、以下のようなパス配下に
ディレクトリを作ることで、認識されます。

/wordpressのドキュメントルート/wp-content/plugins/プラグイン名

注意が必要なのは、ここでいうプラグイン名というのは、世界中にある
プラグインの名前と重複しないこと。
重複しないプラグイン名(ローマ字)を考えて、ディレクトリを作ります。

その後は、「任意のプラグイン名.php」というphpファイルを作成し、
行頭からコメントを記載します。

<?php
Plugin Name: SamplePlugin1
Plugin URI: http://
Description: サンプルのプラグインです
Version: 1.0
Author: p
Author URI: http://
License: GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

//ここからphpのプログラムを書き始める

こうすることで、wordpressの管理画面のプラグインメニューの中に
「SamplePlugin1」という名前のプラグインが表示されるようになります。

HashMapを使う

Posted コメントするカテゴリー: JAVA

HashMapを使って次のようなプログラムを書きます。

package TestPackage;

import java.util.HashMap;
import java.util.Map;

public class LinkedListTest6 {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<String, Integer>();

        //要素の追加
        map.put("test2", 100);
        map.put("qqq", 67);
        map.put("www", 34);
        map.put("eee", 81);

        System.out.println("map -> " + map);
        
        //ここに、コレクションの操作を記述する
        
    }

}

実行結果は次のようなります。

map -> {qqq=67, www=34, test2=100, eee=81}

「キー項目と値」のセットになっていることがわかります。
Hashmapはこのように、2つセットのものを、要素分、格納するコレクションと言えます。

次に、このコレクションを操作してみます。
「ここに、コレクションの操作を記述する」という箇所に次のようなプログラムを書いて見ます。

■キーと値を同時に取得する

    for (Map.Entry<String, Integer> entry : map.entrySet()){
        System.out.println(entry.getKey() + "=>" + entry.getValue());
    }

実行結果は次のようになります。

qqq=>67
www=>34
test2=>100
eee=>81

■キーを取得する

    for (String name : map.keySet()){
        System.out.println(name);
    }

実行結果は次のようになります。

qqq
www
test2
eee

■値を取得する

    for (Integer name : map.values()) {
        System.out.println(name);
    }

実行結果は次のようになります。

67
34
100
81

■キーと値を取得する

    for (String name : map.keySet()) {
        System.out.println(name + "->" + map.get(name));
    }

実行結果は次のようになります。

qqq->67
www->34
test2->100
eee->81

■あるキーをもとに値を取得する

    System.out.println(map.get("qqq"));

実行結果は 「67」 になります。

これは2つ目の要素の値を取得してきていることがわかります。

コレクションの使い方は上記のほかにもまだまだ使い方があるので、別途追求しようと思います。

HashSetを使う

Posted コメントするカテゴリー: JAVA

HashSetを使ってみます。

HashSetは要素の集合に、目的の要素が含まれているかを調べるときに使います。

含まれているかどうかを調べる時に、要素の順番は関係ありません。

また、nullを追加することも可能です。

package TestPackage;

import java.util.HashSet;
import java.util.Set;

public class LinkedListTest5 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Set<String> set = new HashSet<String>();

		//要素の追加
		set.add("test2");
		set.add("qqq");
		set.add("www");
		set.add("eee");

		System.out.println("set -> " + set);

		if (set.contains("www")){
			System.out.println("要素に含まれている");
		} else {
			System.out.println("要素に含まれていない");
		}

	}

}

実行結果は次のようになります。

set -> [qqq, www, test2, eee]
要素に含まれている

LinkedListをキューとして使う

Posted コメントするカテゴリー: JAVA

LinkedListをキューとして使ってみます。
プログラムは次のように記述します。

package TestPackage;

import java.util.LinkedList;
import java.util.Queue;

public class LinkedListTest2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Queue<String> queue = new LinkedList<String>();

		//要素の追加
		queue.offer("test2");
		queue.offer("ttt");
		queue.offer("mmm");
		queue.offer("ppp");

		//要素の中身を出力する
		System.out.println(queue);

		//先頭要素を取り出す
		queue.poll();

		//要素の中身を出力する
		System.out.println(queue);

		//要素の先頭を「参照」して変数へ代入する
		String peekStr = queue.peek();

		System.out.println(peekStr);

		//要素の中身を出力する
		System.out.println(queue);
}

}

実行結果は次のようになります。

[test2, ttt, mmm, ppp]
[ttt, mmm, ppp]
ttt
[ttt, mmm, ppp]

注意する点は、データ構造がキューを意味している点と、pollメソッドを使って要素を取り出す時には先に挿入したものから取り出されることです。(末尾から操作するメソッドも用意されています)

また、「参照」を行っている箇所は値そのものを取り出さず、値を見ているだけの動きになっています。(一旦、変数に代入してprint文をわかりやすくしているだけです)

コレクション(LinkedList)を書いてみる

Posted コメントするカテゴリー: JAVA

LinkedListを使用したコレクションを書いて見ます。
LinkedListは要素の挿入と削除を高速に行います。

一見、ArrayListに似た記述になりますが、先頭に「rrr」を挿入する際のメソッドや宣言の仕方などが微妙に違います(詳しい使い方は別途調べて書いていくことにします)。

package TestPackage;

import java.util.LinkedList;

public class LinkedListTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		LinkedList<String> list = new LinkedList<String>();

		//要素の追加
		list.add("test2");
		list.add("ttt");
		list.add("mmm");
		list.add("ppp");

		//要素の中身を出力する
		System.out.println(list);

		//先頭に「rrr」を挿入
		list.addFirst("rrr");

		//要素の中身を出力する
		System.out.println(list);

	}

}


上記を実行した結果は次のように出力されます。

[test2, ttt, mmm, ppp]
[rrr, test2, ttt, mmm, ppp]

コレクション(ArrayList)を書いてみる

Posted コメントするカテゴリー: JAVA

ArrayListを使用したコレクションを書いて見ます。

package TestPackage;

import java.util.ArrayList;
import java.util.List;

public class ArrayListTestX {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		List<String> list = new ArrayList<String>();

		//要素の追加
		list.add("test1");
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");

		//要素の中身を出力する
		System.out.println("最初->" + list.get(0));
		System.out.println("最後->" + list.get(list.size() - 1));

		//すべての要素を出力する
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}

		//bbbが格納されている要素の添え字を調べる
		//(要素は0から始まるので、出力結果は2と表示される)
		System.out.println(list.indexOf("bbb"));

	}

}

上記を実行した結果は次のように出力されます。

最初->test1
最後->ccc
test1
aaa
bbb
ccc
2

指定ディレクトリの中のファイルを一覧表示する

Posted コメントするカテゴリー: JAVA

javaの引数パラメータに渡したパス(指定ディレクトリ)の中にあるファイルを一覧表示するプログラムを書きます。

実行した結果は、引数で指定したディレクトリ内のディレクトリとファイルが混在された形でコンソールに表示されます。

package TestPackage;

import java.io.File;

public class DirShow {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		if (args.length != 1) {
			System.out.println("args not");
			System.exit(0);
		}

		String dirname = args[0];

		File dir = new File(dirname);

		String[] dirlist = dir.list();

		for (int i=0; i < dir.length(); i++) {
			System.out.println(dirlist[i]);
		}

	}

}

ファイルの削除を行う

Posted コメントするカテゴリー: JAVA

ファイルの削除を行ってみます。
ソースを下記のように記述し、実行をしてみます。

このとき、あらかじめD:\直下にa.txtというテキストファイルが存在するものとします。

package TestPackage;

import java.io.File;

public class DeleteFile {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		if (args.length != 1) {
			System.exit(0);
		}

		String filename = args[0];

		File file = new File(filename);

		if (file.delete()) {
			System.out.println("file delete ok");
		} else {
			System.out.println("file delete ng");
			System.exit(0);
		}

	}
}

実行した結果、a.txtファイルは消えたことを確認しました。

ファイルへの書き込みを行う

Posted コメントするカテゴリー: JAVA

javaからファイルに書き込みを行うプログラムを書いてみました。

実行する時はeclipseの実行→実行構成で引数を2つ指定する必要があるので注意です。
下記画像は引数を設定した例をキャプチャしたものです(ご参考までに)
001

package TestPackage;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class WriteFile {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String inputData = args[0];
		String filename = args[1];

		try{
			BufferedReader reader = new BufferedReader(new FileReader(inputData));

			PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(filename)));

			String line;

			// ファイルの中を開いて1行ずつに出力用変数に代入します
			while ((line = reader.readLine()) != null){
				writer.println(line);
			}

			// reader削除します
			reader.close();
			writer.close();

		} catch(FileNotFoundException e){
			System.out.println("filename -> なし");
		} catch(IOException e){
			System.out.println(e);
		}

	}
}

ファイルの中のデータをコンソールに出力する

Posted コメントするカテゴリー: JAVA

ファイルの読み込みを書いてみます。

package TestPackage;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ShowFile {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		if (args.length != 1) {
			System.out.println("len 1 !");
			System.exit(0);
		} else {
			System.out.println("len 2 !");
		}

		String filename = args[0];

		try{
			BufferedReader reader = new BufferedReader(new FileReader(filename));
			String line;
			//ファイルの中を開いて1行ずつコンソールに出力する
			while ((line = reader.readLine()) != null){
				System.out.println(line);
			}
		} catch(FileNotFoundException e){
			System.out.println("filename -> なし");
		} catch(IOException e){
			System.out.println(e);
		}

	}

}

上記のソースを書いてプログラムを実行するのですが、ひとつ気をつけなければならないことは

String filename = args[0];

の部分で、プログラム実行時の引数に値が渡ってくる。という概念があります。

eclipseの場合は、メニューの「実行」→「実行構成」から別ウィンドウを開き、その中でJAVAの目的のソースコード名を選択して、「引数」タブ内に引数情報を入力することでプログラムの動作を確認しました。

他のスレッドの終了を待つスレッドを作る

Posted コメントするカテゴリー: JAVA

下記のようなソースを書きます。

package ThreadPackage;

public class JoinTest extends Thread {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		JoinTest th = new JoinTest();

		System.out.println("main start");

		th.start();

		System.out.println("main wait");

		try{
			th.join();
		} catch(InterruptedException e){
			System.out.println(e);
		}

		System.out.println("main end");
	}

	public void run(){
		System.out.println("run start");

		try {
			Thread.sleep(3000);
		}catch(InterruptedException e){
			System.out.println(e);
		}
		System.out.println("run end");
	}

}

実行すると次のようなメッセージがコンソールに表示されます

main start
main wait
run start
run end
main end

いったい何が起きているのかというと、

JoinTest th = new JoinTest();

でいったんスタートしたthというスレッドのインスタンスが実行している間に、

th.join();

というメソッドが起動したタイミングで

public void run(){

のメソッドで定義した別スレッドが起動され、その終了をthというスレッドが待っている状態になっています。

他のスレッドの終了を待ってからメインだったスレッドが再開する。という動作ができます。

注意として、joinというメソッドの使い方には3つの方法があります。

//タイムアウトなし、スレッドの終了を待つ
void join() throws InterruptedException

//タイムアウトあり、スレッドの終了を待つ(ミリ秒)
void join(long msec) throws InterruptedException

//タイムアウトあり、スレッドの終了を待つ(ミリ秒+ナノ秒)
void join(long msec, int nsec) throws InterruptedException

スレッドの動作を指定秒待たせる

Posted コメントするカテゴリー: JAVA

スレッド動作を指定秒ストップさせることができます。

次のようなプログラムを作成して実行してみます。

package ThreadPackage;

public class Ts {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		//スレッドの動作がsleep秒ごとにどんどん遅くなっていく
		for(int i=0; i<10; i++){
			int tm = i  * 1000;
			System.out.println("Start tm -> " + tm);
			try {
				Thread.sleep(tm);
			}catch(InterruptedException e){

			}
		}

	}

}

実行結果は以下のようになり、下に行けば行くほど表示する時間間隔が長くなっていきます。

Start tm -> 0
Start tm -> 1000
Start tm -> 2000
Start tm -> 3000
Start tm -> 4000
Start tm -> 5000
Start tm -> 6000
Start tm -> 7000
Start tm -> 8000
Start tm -> 9000

単純にとあるループ処理を10回繰り返すだけですが、ループ中に

Thread.sleep(tm);

と記載し、tm秒ごとに処理を一時停止しています。

スレッドを止める場合

Posted コメントするカテゴリー: JAVA

既に実行しているスレッドを止める場合には以下のよう書きます。

public void stopRunning() {
    running = false;
}

使い方については上記のメソッドを起動するタイミング(操作)を既存のスレッドを利用しているプログラムに適用するように使います。
(実際の例は別途追記)

スレッドを書いてみます(別方法編)

Posted コメントするカテゴリー: JAVA

ひとつ前の記事と違う方法でスレッドを書いてみます。

package ThreadPackage;

public class ThreadTest2 implements Runnable {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		ThreadTest2 tt2 = new ThreadTest2();
		Thread th = new Thread(tt2);

		th.start();
		for (int i = 0; i < 10; i++) {
			System.out.println("main : i -> " + i);
		}

	}

	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("run : i -> " + i);
		}
	}

}

実行した結果は次のようになります。

run : i -> 0
main : i -> 0
run : i -> 1
main : i -> 1
run : i -> 2
run : i -> 3
main : i -> 2
run : i -> 4
main : i -> 3
run : i -> 5
run : i -> 6
main : i -> 4
run : i -> 7
main : i -> 5
run : i -> 8
main : i -> 6
run : i -> 9
main : i -> 7
main : i -> 8
main : i -> 9

前回の記事と同じ、ログの出力はランダムな順になります。
呼び出し方が違うことに注意する以外は、考え方とログの出方は一緒です。

スレッドを書いてみます

Posted コメントするカテゴリー: JAVA

スレッド処理を書いて動かしてみます

package ThreadPackage;

public class ThreadTest1 extends Thread {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		ThreadTest1 tt = new ThreadTest1();
		tt.start();

		for(int i=0; i<10; i++){
			System.out.println("main:i->" + i);
		}
	}

	public void run() {
		for (int i=0; i<10; i++) {
			System.out.println("sub:i->" + i );
		}
	}

}

実行した結果は次のようになります。
1回目

sub:i->0
sub:i->1
sub:i->2
sub:i->3
sub:i->4
sub:i->5
main:i->0
sub:i->6
sub:i->7
sub:i->8
sub:i->9
main:i->1
main:i->2
main:i->3
main:i->4
main:i->5
main:i->6
main:i->7
main:i->8
main:i->9

2回目

main:i->0
main:i->1
sub:i->0
sub:i->1
sub:i->2
sub:i->3
main:i->2
main:i->3
sub:i->4
main:i->4
main:i->5
sub:i->5
sub:i->6
sub:i->7
sub:i->8
sub:i->9
main:i->6
main:i->7
main:i->8
main:i->9

3回目

main:i->0
main:i->1
sub:i->0
sub:i->1
sub:i->2
main:i->2
main:i->3
sub:i->3
sub:i->4
sub:i->5
sub:i->6
sub:i->7
sub:i->8
sub:i->9
main:i->4
main:i->5
main:i->6
main:i->7
main:i->8
main:i->9

3回実行した結果を載せたのは、スレッドのスタートタイミングが実行時でそれぞれランダムなので掲載した。

1つのスレッドのみのプログラムの場合は、毎回同じタイミングで同じログが出力されるだけだが、スレッドを利用したプログラムでは、1つ目のプログラムが走る裏でもうひとつのプログラムが走るので、処理が同時に平行してタイミングがまちまちにログが出力されていることがわかります。

スーパーインターフェイスについて

Posted コメントするカテゴリー: JAVA

インターフェイスを拡張することをができます

interface FastRunnable extends Runnable {
	void fastrun();
}

FastRunnableはRunnableのサブインターフェイス
Runnable はFastRunnable のスーパーインターフェイス
といいいます。

サブインターフェイスはスーパーインターフェイスのメソッドを継承します。

インターフェイスを書いてみます

Posted コメントするカテゴリー: JAVA

実際にインターフェイスを書いてみます

//Lockableインターフェイスの宣言
interface Lockable {
	//↓これは抽象メソッド
	//abstractキーワードがない場合、自動的に抽象メソッドになります
	boolean lock();
	boolean unlock();
}

インターフェイスの宣言は↑のように行います。

上記のインターフェイスを実装するには、implementsキーワードを使って以下のように書きます。

/*
インターフェイスが持つフィールドは必ず定数
インターフェイスが持つメソッドは必ず抽象メソッド
インターフェイスはインスタンスを作ることはできない
*/

//インターフェイスの実装
class Kinko implements Lockable {

	public boolean lock() {
		return true;
	}

	public boolean unlock() {
		return false;

	}

}

インターフェイスはインスタンスを作ることはできません。

//これはできない
Lockable obj = new Lockable();

インターフェイス型の変数を使うことはできます。

Lockable obj = new Kinko();

obj.lock();
という形で呼び出すことができます。

インターフェイスについて

Posted コメントするカテゴリー: JAVA

インターフェイスは、公開すべき必要な操作をまとめたクラスの仕様(取り決め)です。
実際に行う処理の内容は、インターフェイスには記述しないです。
インターフェイスは抽象クラスと同様にインスタンス化はできません。
宣言方法は次のようにします。

interface xxxxx {}

インターフェイスは次の特徴があります。
・インターフェイスで宣言できるメソッドは抽象メソッドのみ
・インターフェイスではpublic staticな定数を宣言できる。定数なので初期化しておく。
・インスタンス化はできず、利用する場合は実装クラスを作成し、実装クラス側では抽象メソッドをオーバーライドして使用する
・実装クラスを定義するにはimplementsキーワードを使用する
・インターフェイスを元にサブインターフェイスを作成する場合はextendsキーワードを使用する

catch文を連続して書く方法

Posted コメントするカテゴリー: JAVA

下記のように、catch文を連続して書く方法もあります。

try {

} catch (例外クラス名1 変数名) {

} catch (例外クラス名2 変数名) {

} catch (例外クラス名3 変数名) {

}

ただし、注意しないといけないのは、クラスに継承関係がある場合は、必ずサブクラス側から順に書かないとコンパイルエラーになることです。

ダメな例

try {

} catch (例外クラス名1(親クラス) 変数名) {

} catch (例外クラス名2(子クラス) 変数名) {

} catch (例外クラス名3(子クラス) 変数名) {

}

良い例

try {

} catch (例外クラス名1(子クラス) 変数名) {

} catch (例外クラス名2(子クラス) 変数名) {

} catch (例外クラス名3(親クラス) 変数名) {

}

finallyの使用

Posted コメントするカテゴリー: JAVA

プログラム内のエラーを受け、例外処理を行った後、最後に必ず実行したい処理を書く領域(ブロック)

構文は以下のように書きます

try {

} catch (例外クラス名 変数名) {

} finally {
    //ここに必ず実行したい処理を書きます
}

■注意点
finallyの中にreturn文を書くことはできないです。

スタックトレースの使用

Posted コメントするカテゴリー: JAVA

例外処理を行っている「e」の変数に対し、printStackTraceを使うと、コールスタックが表示されます。
e.printStackTrace()と書くと、どのメソッドから例外が投げられたのかを表示することができます。

package TestPackage;

public class ExecptionTest1 {

	public static void main(String[] args) {

		int[] TestArray = new int[3];

		System.out.println("Void Main start !");

		try {
			System.out.println("Try start !");
			TestFunc(TestArray, 100, 0);
			System.out.println("Try end !");
			//TestArray[50] = 0;
		} catch (Exception e) {
			//スタックトレースを使うと、コールスタックが表示され、
			//どのメソッドの中から例外が投げられているのかがわかります
			e.printStackTrace();
			System.out.println("例外 -> " + e);
		}

		System.out.println("Void Main end !");
	}

	static void TestFunc(int[] arr, int index, int value) {
		System.out.println("TestFunc start !");
		arr[index] = value;
		System.out.println("TestFunc end !");
	}

}

出力結果は以下のようになります

Void Main start !
Try start !
java.lang.ArrayIndexOutOfBoundsException: 100
	at TestPackage.ExecptionTest1.TestFunc(ExecptionTest1.java:28)
	at TestPackage.ExecptionTest1.main(ExecptionTest1.java:13)
TestFunc start !
例外 -> java.lang.ArrayIndexOutOfBoundsException: 100
Void Main end !

こうすることで、(ExecptionTest1.java:28)と(ExecptionTest1.java:13)という情報がわかるので、そのソースファイルのエラー原因(上記の場合は配列のインデックスを超えて代入しようとした際のエラー)を注意深く追うことができます。