今日は仕事でこんなクラスを作った。
class BOOLatOnce{
private:
bool flag;
public:
BOOLatOnce(){
flag = false;
}
explicit BOOLatOnce(const bool b){flag = b;}
BOOLatOnce& operator=(const bool b){flag = b;return *this;}
operator bool(){
//評価が行われたら自動でfalseに戻す。
bool b = flag;
flag = false;
return b;
}
};
こいつの使い方は簡単。
BOOLatOnce bat;
bat = true; // bat == true
if( bat ){ // ifの中はtrue
// ここではすでにbat == false
/* ... */
}
普通のboolと違い、一度評価されたら勝手にfalseに戻る。
ソースコードが食中毒にかかったかのようにスマートになること請け合いだ。
後でメンテナンスする人間(一月後の自分含む)が困惑する様子が目に浮かぶ。
もう11月になろうかと言うところで薔薇が咲いている。
さすがにつぼみが開くまでにはかなりかかった。
本当は赤+黄なのだが、いつも赤が出ない。肥料が悪いのだろうか。
銀杏のほうは季節にふさわしく紅葉している
が、同じ日に撮影した銀杏。こいつは室内管理なんだが、青々としている。やはり部屋は暖かいのか。暖かいと駄目なのか。
法線マップ・バンプマップではなく、実際にメッシュの表面に凹凸をつける。
1.立方体を用意
2.Tabを押してEditモードに入り、wキーをしてメニューを開く
Subdivideを繰り返して分割数を増やす
3.Objectモードに戻り、モディファイア[displace]を追加
4.テクスチャへ行き、Newをクリック
5.好きなテクスチャを選ぶ
6.再びDisplaceモディファイアの設定画面へ行き、Textureを選択する。
Strengthで凹凸の高さを変更できる。
MFCで、メニューではなく普通のウィンドウ内にセパレータを置きたい場合、リソースエディタからは、Picture Controlを配置して高さをなくして、Static EdgeプロパティをTrueにすればいい。
ただこれをソースコードからどうやるかと言う話。
CRect separator = CRect(10,0,250,4);
static = new CStatic();
static->Create( _T("") , WS_VISIBLE | WS_CHILD | SS_ETCHEDHORZ , separator , this , ID );
thisはここでは親ウィンドウ。
IDは整数値。
☆の旦那が、パソコンのセキュリティソフトの期限が切れそうだが何を入れればいいかと聞いてきたので、とりあえずウィルスセキュリティZEROを挙げておいた。
自分なら、ZERO使うぐらいならフリーのを使う。
ただ、フリーの場合、パソコンとの相性が有料ソフトより出やすい印象がある。私がかつてAVASTやAVGを使っていた頃は特にトラブルに見舞われた経験はないのだが、☆の旦那のPCではフリーのを入れるとよくフリーズしたりした。あれは使い方が悪いんじゃないか。。。
もう一つ、フリーのセキュリティソフトは、アンチウィルス(対不正プログラム)とファイヤウォール(対不正侵入)が分かれていることが多く、それぞれ別にインストールして面倒を見ないといけない。否、私が面倒を見ないといけない。
まあOutpostのように両方持っててフリーのもあるにはある。
☆の旦那は今はちゃんと働いているので、1980円ぐらいなら出してもいいんじゃないかと思う。
なにしろZEROはOSのサポートが切れるまで更新料が不要だ。ソフト作ってるK7がWin7のサポート終了まであるかどうかのほうが怪しいだろう。あ、SOURCENEXTもか。
まあ☆家の他のパソコンはみんなカスペルスキーを使っていて、そいつの更新が来年四月だというので、それまでのつなぎにはちょうどいい。多分。
Win7の更新終了は2020年。それまでにPCが増えたとして、とりあえずZEROいれておけば金もかからない。
メインに使うのはどうかと思うが、保険をかけとくには手頃なソフトかもしれない。
電子書籍は便利だ。端末だけ持ち歩けば本棚数個分の本を読めるし、暗いところでもバックライトで読めたりする。
液晶を使ってる電子書籍リーダーはすぐ電池切れになるので論外だが、電子インクを使っている端末ならかなり長持ちするので、かろうじて書籍を名乗ってもいいぐらいではあると思う。
紙の本が不経済だからと減っていき、変わって電子書籍が普及するとすれば、電子書籍がどんなに本として不十分であろうと、必然的に従来の本に置き換わるだろう。
問題は電子書籍が、紙の本の欠点によってではなく、電子書籍の魅力によって置き換わることができるかという点だ。
今のままの電子書籍リーダーなら、それは絶対にないと思う。
なぜかというと電子書籍リーダーは便利だが、便利なだけだからだ。
紙の本は「媒体+情報」で「本」となるが、電子書籍は「リーダー」と「情報」が分離している。
言ってみれば本と読書台のような関係になる。
これがどう関係するかというと、本は一種のコレクションでもあるという事だ。本を読む人間の中には、本棚にずらりと並んでいるところを眺めて満足したりすることが割と重要になる人種がいる。例えば私だ。
これが電子書籍やパソコンの画面上の文字になってしまったら、はっきり言って興ざめだ。
もちろん、コレクション性のない本もある。私なら、一過性の雑誌やビジネス本など、ある程度必要に迫られて読むような本には100年たっても愛着などわかないだろうから、データでかまわない。中の情報が大事なだけなので、検索機能が使える電子書籍が圧倒的に有利だ。
今さらりと愛着という言葉を使ったが、データに愛着を持てるだろうか。あるいは電子書籍リーダーにはどうだろう。
データには自信がない。例えなくしてもコピーすればいいだけなので、逆にありがたみがないのだ。リーダーは、少なくとも今のままでは無理だ。SONYだのAMAZONだのとメーカーがこれでもかと自己主張している機械で、自分では修理もできない。そのくせ充電ができなくなったら買い換えだ。これが100年使えるんなら大事にしようとも思うが、メーカーの意図はどうあれ使い捨てでは、愛着がわく暇がない。
データにも端末にも愛着を持てないなら、読書が単なる、情報を取り入れるための作業になってしまう。
JavaFXでタイマーを使う。
タイマー処理はanimation関数の中だけ。
Timeline t = new Timeline( new KeyFrame ( 間隔 , 処理内容 ) );
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Group; import javafx.scene.shape.Box; import javafx.geometry.Point3D; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.PerspectiveCamera; //タイマー用のimport import javafx.animation.Timeline; import javafx.animation.KeyFrame; import javafx.util.Duration; import javafx.event.ActionEvent; import javafx.event.EventHandler; public class jfx3d_anime extends Application { int i; Timeline timeline; void animation(Box box){ //3D表示に関する記述 Point3D p3 = new Point3D(1,1,0); p3.normalize(); box.setRotationAxis( p3 ); //タイマーの定義 timeline = new Timeline( new KeyFrame( new Duration(25),//25ミリ秒 new EventHandler<ActionEvent>(){ @Override public void handle(ActionEvent event){ //ここに処理を記述 i+=1; box.setRotate(i); } } ) ); //タイマーの開始 timeline.setCycleCount(Timeline.INDEFINITE); timeline.play(); } @Override public void start(Stage stage) { Group root = new Group(); // 辺の長さが20の立方体 Box box = new Box(20, 20, 20); //回転軸を定義 Point3D rotaxis = new Point3D(0.0, 1.0, 1.0); rotaxis.normalize(); //立方体に回転軸と回転角を設定 box.setRotationAxis( rotaxis ); box.setRotate(45.0); root.getChildren().add(box); //ウィンドウのサイズを指定 Scene scene = new Scene(root, 600, 600); //背景色を指定 scene.setFill(Color.BLACK); // 透視投影カメラを設定 PerspectiveCamera camera = new PerspectiveCamera(true); // カメラの位置を (0, 0, -100) にする camera.setTranslateZ(-100.0); //カメラが写す最近距離と最遠距離を指定 camera.setFarClip(200); camera.setNearClip(50); scene.setCamera(camera); stage.setScene(scene); stage.setTitle("3Dサンプル"); stage.show(); animation(box); } public static void main(String... args) { launch(args); } }
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Group; import javafx.scene.shape.Box; import javafx.geometry.Point3D; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.PerspectiveCamera; public class jfx3d extends Application { int i; @Override public void start(Stage stage) { Group root = new Group(); // 辺の長さが20の立方体 Box box = new Box(20, 20, 20); //回転軸を定義 Point3D rotaxis = new Point3D(0.0, 1.0, 1.0); rotaxis.normalize(); //立方体に回転軸と回転角を設定 box.setRotationAxis( rotaxis ); box.setRotate(45.0); root.getChildren().add(box); //ウィンドウのサイズを指定 Scene scene = new Scene(root, 600, 600); //背景色を指定 scene.setFill(Color.BLACK); // 透視投影カメラを設定 PerspectiveCamera camera = new PerspectiveCamera(true); // カメラの位置を (0, 0, -100) にする camera.setTranslateZ(-100.0); //カメラが写す最近距離と最遠距離を指定 camera.setFarClip(200); camera.setNearClip(50); scene.setCamera(camera); stage.setScene(scene); stage.setTitle("3Dサンプル"); stage.show(); } public static void main(String... args) { launch(args); } }
JNAを使用し、JavaからWin32APIのメッセージボックスを表示する
import com.sun.jna.Native; import com.sun.jna.win32.StdCallLibrary; public class Hello { public interface User32 extends StdCallLibrary { User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); int MessageBoxA(int hwnd, byte[] text, byte[] caption, int type); //① int MessageBoxA(int hwnd, String text, String caption, int type); //② } public static void main(String[] args) { User32 user32 = User32.INSTANCE; try{ user32.MessageBoxA(0, "こんにちは".getBytes(), "◎★♪".getBytes(), 0); user32.MessageBoxA(0, "Hello World", "MessageBox", 0); } catch( Exception e ){ } } }
※全角文字を表示するときは①、半角英数の時は②を使用する。さもないと文字化けする。
前準備
.;C:\dev\JNA\jna.jar;C:\dev\JNA\jna-platform.jar;
のように、jna.jar,jna-platform.jarをCLASSPATHに追加する。
※コンパイル時・実行時に -cpオプションで追加しただけでは不十分な場合がある
コンパイル
javac Hello.java
実行
java Hello
品種にもよるが、バラは丈夫な植物だ。
綺麗な花を咲かせようとさえしなければ、木自体を維持するのはさして難しくない。
挿し木も簡単で、最初は全敗するが、慣れると増えすぎて困る。
以下は今年春(確か。昨年冬だったかも?)挿し木した枝なのだが、元気に育っている。育っているのは喜ばしいが、
邪魔だ。
なぜ上を向いてくれなかった。なぜそこまで面積を欲する。
いい加減どうしようもなくなったので、どの程度根が生えているのか確認してみることにした。
てっきりポットの形に土が抜けるくらいびっしりと張っているかと思ったが、以外とそうでもなかった。
さて、再びポットに移してもいいが、結局手に負えなくなるので、どこかに置いてこよう。きっと親切な人が拾ってくれる。