金曜日, 11月 21, 2014

NetBeans+Maven: JARファイルが起動しない

NetBeans+Maven で書いた Java アプリを、いざ起動しようと思うと動かないわけですね。

動作環境は NetBeans 8.0.1 です。快適な Java 開発環境です。Maven も入っている。おすすめです。

補完機能もあるし、フォーマットからコメントアウトまで編集機能も万全。JUnit なんかもテンプレートで作成できます。

さくさくとプログラムを書いて、コンパイル。無事テストも通って、できた JAR ファイルを起動。JAR ファイルなら Windows 上で実行形式ファイルとしてそのまま起動できるはずです。

さっそくというのでアイコンをクリックをクリックします。で、動かない。

できてないですね。NetBeans。なんなんですかね。

コマンドラインで動かしてみれば理由はあきらか。Main-Class が設定されていない。

肝心なところでなぜなんだと悩みました。だってできたプログラムをいざ実用化っていう大切な瞬間ですよね。なぜでしょう。意図的としか思えませんね。

まあ陰謀論はいいんですが、結論から言うと解決は簡単で、pom.xml ファイルで Main-Class を設定します。



こんなコードを加えてやります。

#タグの大文字小文字が違っていたので訂正します。
   
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>easai.treeeditor.TreeEditor</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>      


JARファイルを追加するには以下のように記述します。

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>easai.db.DB</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>mysql-connector-java-5.1.6-bin.jar</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>     

月曜日, 9月 08, 2014

Java: 標準入力から値を得る

Java で標準入力から値を得るのは C++ より面倒です。

C++ では cin を使いますよね。 標準入力ストリームを使うわけです。

Java では標準入力は System.in です。しかし、です。このままでは使えないんですね。

以下の F1 Score 計算プログラムでは Scanner を使用しています。

import java.util.Scanner;
public class FValueScanner
{
public static void main(String args[])
{
String str;
try
{
Scanner kbd=new Scanner(System.in);
System.out.print("True-Positive: ");
double truePos=kbd.nextDouble();
System.out.print("False-Positive: ");
double falsePos=kbd.nextDouble();
System.out.print("True-Negative: ");
double trueNeg=kbd.nextDouble();
System.out.print("False-Negative: ");
double falseNeg=kbd.nextDouble();
double precision=truePos/(truePos+falsePos);
System.out.println("Precision="+precision);
double recall=truePos/(truePos+trueNeg);
System.out.println("Recall="+recall);
double f=2*precision*recall/(precision+recall);
System.out.println("F1="+f);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

木曜日, 7月 10, 2014

3Dプリンターを使ってみての考察



3Dプリンターを使ってみての所感です。

  • ルーターは必須。バリや凹凸はもちろん、サイズを合わせるため必須。
  • プラスチック樹脂の種類によって強度、加工しやすさが違う。色もメーカーによって違う。
  • ABSは曲げられない。折れる。硬さはそれぞれの樹脂の質による。
  • フィラメントが引っかかると層がずれて悲惨な作品が出来上がる。フィラメントのフィードが遅いマシンでは "Extrusion multiplier" の値を低くする。フィラメントの太さを指定する必要がある。
  • アセトンで壊れたパーツを修復できる。フィラメントを溶かしたアセトン溶液を使うといい。アセトンはすぐ蒸発するのでガラス瓶など使うと容器内で蒸発する。目薬の容器は小さくて少量ずつ出すことができて便利。
  • 糊をたっぷり使わないと作品がはがれる。ブリム brim をつけると倒れにくくなる。ラフト raft をつけると底面からはがせる。
  • 糊はコーンスターチと水を電子レンジで加熱すると大量生産できる。夏場は糊が腐るので酢を少量混ぜるといい。
  • よく監視しておかないとフィラメントを無駄にする。
  • 糊が乾燥するので水道水をスプレーするといい。
  • 冷えるまで触ってはならない。柔らかいので無理に外すと壊れる。
  • 解像度は低い。 
  • 時間がかかる。
  • 削るのは時間のかかる作業である。
  • 思いのまま作品ができる。「今まで何してたんだろう」的な気分になる。カスタマイズも自由。



金曜日, 6月 20, 2014

jQuery: ドロップダウンリストから値を取り出す

ドロップダウンリストから値を取り出す方法です。


$("select[name='seriesid']").change(function(){
var text=$("select[name='seriesid'] option:selected").text();
alert(text);
});
view raw select.js hosted with ❤ by GitHub

火曜日, 5月 13, 2014

Javascript (jQuery) から PHP の関数を呼び出す

ボタンを押したときに、PHP の関数を呼び出したいとします。

Form を使って PHP ファイルを読み込み、ページ全体を書き直すという手段もありますが、ある関数だけを呼び出したいときなど、ajax を使うと PHP 関数を呼び出してページ側で返り値を得ることができます。

function fill()
{
$.ajax({
url:'fillin.php',
success: function (results) {
$('textarea#text').html(results);
},
error: function () {
},
});
return false;
}
view raw fill.js hosted with ❤ by GitHub
このように、url でファイル名を指定して、success で返り値 results として引き渡してやります。

PHP ファイル側では、渡したい値を echo などで表示します。

これで PHP の関数をページから呼び出すことができます。

<?
echo <<<END:
line a
line b
line c
END;
?>
view raw fill.php hosted with ❤ by GitHub

木曜日, 5月 01, 2014

HTMLエディターを1行で書く

HTMLエディターを1行で書いてみました。

要するに、書いたHTMLがそれっぽく見えればWYSIWYGってわけですよね。

じゃあ、書いたものをそのままブラウザ表示すりゃいいわけじゃないですか。

<html>
<head>
<style>
textarea,
div#results
{
width:1500px;
height:460px;
}
</style>
<script src="../includes/scripts/js/lib/jquery-1.7.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function()
{
$("textarea").keyup(function(){
$("div#results").html($("textarea").val());
});
});
</script>
</head>
<body>
<div id="results">
</div>
<form action="editor.php">
<textarea name="text">
</textarea>
</form>
</body>
</html>
view raw HTMLEditor.php hosted with ❤ by GitHub
これを動かすと、何もないテキストボックスが下のほうに表示されます。

適宜 HTMLコードを入力してみましょう。

画面上部に結果が表示されます。

リアルタイムでHTMLコードが編集できます。

ちょっとしたプレビューにも使えます。

水曜日, 4月 30, 2014

g++ の内部コード

g++ の内部コードは UTF16 で、wchar_t も当然のことながら16ビットです。

なんなら日本語のファイルを読んで、コードを出力してみればいいわけですね。

ロケールを設定する必要があります。


#include <iostream>
#include <fstream>
using namespace std;
void binary(int16_t x)
{
for(int i=15;0<=i;i--)
{
cout << ((x>>i)&1);
}
cout << endl;
}
int main()
{
setlocale(LC_CTYPE,"");
wstring str;
char fn[]="uni.txt";
wifstream fin;
fin.open(fn,ios::binary);
if(fin)
{
fin >> str;
binary(str[0]);
wcout << str << endl;
}
return 0;
}
view raw wchar.cpp hosted with ❤ by GitHub

火曜日, 4月 29, 2014

C++ でバイナリで表す

C++ でバイナリで表すには、自分で書かねばならないようです。

べつにたいした手間ではないですが、書かされるという気分が知性に対する挑戦のように思えるわけですね。

こんなことをやらされるために頭脳があるんじゃない!みたいな。

もしそんな教師がいたら最悪ですね。でも現実は頭脳に厳しい。

というわけで書きました。

なんか頭にくるのでここに載せときます。


注意点として、(int16_t)0xff などとキャストすると結果は 1111111111111111 と表示されます。

当然そうなるわけなんですが、0000000011111111 とはなりません。

注意しましょう。

#include <iostream>
using namespace std;
int main()
{
int8_t x=0b010101;
for(int i=7;0<=i;i--)
{
cout << ((x>>i)&1);
}
cout << endl;
return 0;
}
view raw norecurse.cpp hosted with ❤ by GitHub

火曜日, 4月 22, 2014

eshell (Emacs) と .website (IE) , time (実行時間の計測)メモ

本日の収穫:

M-x eshell

Emacs エディタの話です。

M-x shell を愛用していたわけなんですが、M-x eshell なるものがあるんですね。

ずっと便利じゃないですかこれ。早いし。なんだったんだ今までの苦労は(笑

コマンドの結果が別ウィンドウで表示されます。


.website

IE の話です。

サイトのファビコンをクリック・ドラッグすると、サイトのリンクを作れます。

サイトのリンクと同じようなものですが、IEを指定できます。

time

time ./a.exe で実行速度が計測できます。

水曜日, 4月 09, 2014

Java:バイナリ表示

Java でバイナリを表示するには、toBinaryString()関数を使うと簡潔に表現できます。

public class Checksum
{
static int checksum(int list[])
{
int sum=0;
for(int x:list)
{
sum+=x;
}
sum+=sum>>4;
sum=~sum;
return sum&0b1111;
}
static String binary(int x)
{
return String.format("%4s", Integer.toBinaryString(x)).replace(' ', '0');
}
public static void main(String args[])
{
int list[]={0b0000,0b0100,0b1000,0b1100};
for(int x:list)
{
System.out.println(binary(x));
}
System.out.println("checksum: "+binary(Checksum.checksum(list)));
int newList[]={0b0000,0b0100,0b1000,0b1100,Checksum.checksum(list)};
System.out.println("checksum: "+binary(Checksum.checksum(newList)));
}
}
view raw Checksum.java hosted with ❤ by GitHub

水曜日, 3月 19, 2014

Java 8: ストリーム

Java 8 では文字列をストリームとして扱うことができます。

import java.util.*;
public class LambdaStream
{
public static void main(String args[])
{
String[] values={"Argentine","Angola","Brussels","Brazil"};
List<String> list=Arrays.asList(values);
list.stream().filter(s->s.length()>6).map(s->"["+s+"]").forEach(System.out::println);
}
}
ストリームにフィルターを追加し、要素を選択することもできます。

下記のコードでは要素の文字長を指定し、表示するものです。

import java.util.*;
public class LambdaStream
{
public static void main(String args[])
{
String[] values={"Argentine","Angola","Brussels","Brazil"};
List<String> list=Arrays.asList(values);
list.stream().filter(s->s.length()>6).map(s->"["+s+"]").forEach(System.out::println);
}
}
下記のコードは要素の頭文字を指定し、表示します。

import java.util.*;
public class LambdaTest
{
public static void main(String args[])
{
String[] values={"Argentine","Angola","Brussels","Brazil"};
List<String> list=Arrays.asList(values);
list.stream().filter(e->e.startsWith("A")).forEach(e->System.out.println(e));
}
}

Java 8: ラムダ式

Java 8 が正式にリリースされました。

ラムダ式が導入されるということで、さっそく試してみました。

ラムダ式とは関数を抽象化したもので、コンパクトにコールバック関数の引渡し・定義ができます。

import java.awt.*;
public class LambdaListener extends Frame
{
Button button=new Button("OK");
LambdaListener()
{
add(button);
button.addActionListener(e->System.out.println("OK button pressed."));
setSize(100,100);
setTitle("Lambda");
setVisible(true);
}
public static void main(String args[])
{
LambdaListener test=new LambdaListener();
}
}
ラムダ式のフォーマットですが、

 (引数) -> 定義

となります。Lisp などとは異なる形式ですが、内部クラスなどと比較して簡潔にコールバック関数が定義できます。

public class LambdaMethod
{
public static void main(String args[])
{
Test test=(name)->System.out.println("Hello "+name);
test.say("name");
}
private interface Test
{
public void say(String name);
}
}


火曜日, 2月 25, 2014

MySQL: テーブル構造を取得し、SQL文に変換する

MySQLでテーブル構造を取得するには、DESCRIBE (テーブル名) などのSQL文を使用します。



これをSQL文に変換するには、テーブルの情報をSQL文の形式でそれぞれ記述してやる必要があります。

CREATE TABLE IF NOT EXISTS `notes` (
  `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` text COLLATE utf8_unicode_ci NOT NULL,
  `description` text COLLATE utf8_unicode_ci NOT NULL,
  `videoid` text COLLATE utf8_unicode_ci NOT NULL,
  `imagefile` text COLLATE utf8_unicode_ci NOT NULL,
  `docnum` text COLLATE utf8_unicode_ci NOT NULL,
  `shortdesc` text COLLATE utf8_unicode_ci NOT NULL,
  `onhold` int(11) NOT NULL,
  `registered` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
AUTO_INCREMENT=61 ;

ここで気をつけねばならないのは、timestamp値をとるコラムです。

デフォルト値に CURRENT_TIMESTAMP をとるコラムは、TIMESTAMP 値をとるコラムより前に記述しなければなりません。

コラムを並べ替える必要があります。

ここでは array_unshift() という関数を使用し、CURRENT_TIMESTAMP をとるコラムを配列の最初に格納するという方法をとりました。

ソースコード: GitHub: tablestructure.php

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...