2015年2月22日日曜日

メンテナンス性

 メンテナンス性が良いというのは非常に重要なことです。ですが、直近の問題を解決することを優先して、メンテナンス性を無視するという事例がよくあります。

 ソフトウェアの世界では、解読困難なプログラムのことをスパゲティコードと呼びます。そのようなソフトウェアは、後からの修正が難しく、メンテナンス性が最悪です。

 国民年金のシステムなどは、いろいろな修正を経て、複雑なものになっています。こういったシステムのメンテナンスが難しいのも明白です。

 メンテナンス性が悪いと、将来の問題につながります。将来の問題を防ぐためには、メンテナンス性を良くしておくことが必要です。

 メンテナンス性を良くするにはいくつかパターンがあると思います。

 例として、モノづくりの設計を考えてみます。交換する可能性があるパーツは、交換しやすいように配置すると便利です。複雑な機構を使わず、単純な機構を採用するというのも、メンテナンスに有利です。そもそもの部品点数を減らすという設計も、故障の可能性を減らせるので、有効な手段でしょう。さらに付け加えると、最終的に作ったモノをどうやって廃棄されるかまで想定してあれば、非常に良い設計だと思います。

 要は、余計なモノを取り除いて、シンプルにすることがメンテナンス性を良くするコツだと思います。シンプルがいいというのは、ハードウェアでもソフトウェアでもシステムでもすべて同じです。

 設計段階で将来のメンテナンスのことを予測するのは難しいことです。ですが、将来に問題を残さないよう、事前にメンテナンスを想定するのは非常に重要なことです。





2015年2月14日土曜日

太陽光発電とメンテナンス

 近頃、屋上にソーラーパネルを設置している建物をよく見かけます。空き地にソーラーパネルを何百枚も設置したメガソーラー施設というのも当たり前になってきました。福島の原発事故以来、環境に優しく、助成金もある太陽光発電は大人気のようです。

 太陽光発電はソーラーパネルを設置するだけで良いと思われがちです。「勝手に発電してくれて、その電力を売れば手軽に利益を得られる」と思っている人もいるようです。ですが、実際は太陽光発電にもメンテナンスが必要です。

 ソーラーパネルにゴミが付着したら清掃しないといけません。雪が降ったら、雪かきをしないといけません。ひょうやあられが降って、ソーラーパネルが壊れることもあり得ます。

 街中のソーラーパネルには、人が入れないようなところに設置されているものがあります。命綱なしには近づけないソーラーパネルを見ると、メンテナンスをどうするのか心配になります。鳥のフンがつくたびに、ロッククライマーを呼んでくるのでしょうか?

 他にも、太陽光発電の運営には、電力売買、税金などの管理業務も必要です。設備を作ったら後はほったらかしでお金になる、なんてことはありません。

 太陽光発電に限らず、どんなことにでも、メンテナンスや管理業務は付随します。そのことを考えずに行動すると、将来、後悔することになると思います。

2015年2月7日土曜日

アパートの管理

 私事で恐縮ですが、この度、都合で引越しました。部屋探しのため、いくつかアパートを見学したのですが、そのときに、アパートの管理について考えさせられました。

 廊下に蜘蛛の巣が張っているようだと、明らかに管理が不十分です。防犯カメラやエレベータなど、設備にはお金をかけていそうな部屋だったのですが、後はほったらかしにしているように思えました。なんとなくですが、いろいろと不備があることが想像されたので、遠慮しました。

 結局、選んだ部屋は、大家さんが近くにいるという部屋でした。大家さんが近くにいるおかげで、管理が行き届いている印象でした。

 アパートを経営する方には、建物ができたら後は気にしないという方もいるようです。建物は高額なので、それを気にするのは仕方ないことです。ですが、きちんと管理されているかどうかも重要だと、私は思います。設備が少し悪くても、きちんと管理されており、壊れた箇所は直してあるような部屋の方が、私は安心できます。また、きちんと管理していただけるなら、その分、高い家賃でも良いと思います。

 あくまで私個人の感想ですが、そんなことを思いました。

2015年2月1日日曜日

クエン酸と重曹

 私事で恐縮ですが、この度、都合で引越しました。それにともない、住んでたお部屋を隅から隅まで掃除しました。

 掃除していて困ったポイントの1つが、流し台です。水道の蛇口の辺りに白い汚れがたまっていました。インターネットで調べてみると、水道水に含まれるカルシウム分が固まったもの、とのことです。で、掃除にはクエン酸がいいとのこと。ですが、引越しの荷物を増やしたくないので、新しく洗剤を買うのには躊躇していました。

 そこで試してみたのが「キレートレモン」。クエン酸をたっぷり配合って書いてあるので、ためしに汚れにかけてみました。

・・・落ちた。

完璧ではないまでも、意外に効果がありました。少なくとも、ステンレスの光沢が見えるくらいにはきれいになったので、私の中では合格点です。キレートレモン恐るべし。

 インターネットで調べてみると、クエン酸だけでなく、重曹も掃除には便利とのこと。クエン酸は水垢などに効果的、重曹は油汚れに効果的とのことです。とは言っても、やっぱり買うのに躊躇した私は、洗濯用洗剤トップを水に溶かして試してみました。トップには重曹配合と書いてあります。こちらの効果はよく分からなかったのですが、たぶん効果ありだと思います。(以前、ジャンパーを手洗いするときに使ってみたら、ものすごく汚れがおちました。)

 引越しが終わって、これからはこまめに掃除しようと思った次第です。

 なお、余ったキレートレモンはおいしくいただきました (^o^)/

参考:キレートレモントップエコ掃除


2015年1月24日土曜日

あなたが見ているものと私が見ているもの


2011/11/26のコラムです。

--------------------------------------------------

 今回は"目"の話です。 私は最近では珍しい裸眼で視力1.5の人間です。 ちなみに、 最近の視力検査は視力1.5以上を測ってくれないみたいです。そのため、視力1.5以上の人も1.5になってしまいます。

 一昔前は目が悪ければ当然メガネでしたが、 近頃はコンタクトレンズという方が多いのかも知れません。 コンタクトだと、はた目には分からないので、 裸眼だと思っていた人が実はコンタクトだったと知って驚くことがあります。 最近ではレーシック手術というのもあって、手術で裸眼に戻った人も増えているみたいです。 もちろん私はレーシック手術とかはしていません。 私に言わせれば、手術で視力を回復した人は改造人間です(^o^)。

 "見る"という行為は、 (1)眼球で光を集める (2)網膜で光を電気信号に変換 (3)脳が電気信号を情報処理する 、ことで成り立ちます。 「目が悪い」のは眼球の問題と考えがちですが、脳の情報処理能力が原因の場合もあるみたいです。 そのため、脳を鍛えれば視力が良くなることもあるらしいです。 メガネをしている人には頭がいいといういイメージがありますが、 実は裸眼の人の方が脳をうまく使っているのかもしれません。

 目から入った信号は個々人の脳で認識されるため、 認識には個人差が生じることになります。 経験や興味の違いによって、人が認識する世界は変わります。 ホームズとワトソンが同じ事件現場を見ても、ホームズにだけ真実が見えるのと同じです。 決して知ることはできませんが、 あなたが見ている世界と私が見ている世界は全く違うのかもしれません。ご想像ください。

2015年1月17日土曜日

JAVAでMIDI

 MIDIを勉強したので、JAVAでMIDIを鳴らすAppletを作ってみました。
 
 ソースコードを以下に載せます。

 MIDIファイルの詳細についてはWikipediaJava応用技術講義等を参照ください。

 興味ある方は、ご自由にご利用ください。

--------------------------------------------------

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
import javax.sound.midi.*;

/*--------------------------------------------------------------------------------*/

/**
 * アプレット
 */
public class MidiApplet extends Applet
{
private Receiver rec = null;

public MidiApplet()
{
super();

this.setSize( 240, 240);

this.addKeyListener( new SimpleKeyListener( this));

/*---------- コンポーネントの配置 ----------*/
setLayout( new FlowLayout());

Label label1 = new Label( "Program:");
Label label2 = new Label( "Press C, D, E, F, G, A, B key.");
Label label3 = new Label( "(with or without up / down / shift key)");

Choice choice = new Choice();
choice.addItemListener( new SimpleItemListener( this));

for( int i = 0; i < 128; i++)
{
choice.add( Integer.toString( i));
}

this.add( label1);
this.add( choice);
this.add( label2);
this.add( label3);

/*------------------------------------------*/

this.setVisible( true);
this.setFocusable( true);
this.requestFocusInWindow();
}

public void init()
{
this.getMidi();
}

public void start()
{
}

public void paint( Graphics g)
{
}

public void stop()
{
this.closeMidi();
}

public void destroy()
{
}

private void getMidi()
{
System.out.println( "getMidi");

try
{
if( this.rec == null)
{
this.rec = MidiSystem.getReceiver();
}
}
catch( Exception e)
{
System.out.println( "error : getMidi");
}
}

public void sendMidiMessage( int status, int data1, int data2)
{
System.out.print( "sendMidiMessage : ");
System.out.print( status);
System.out.print( ", " + data1);
System.out.println( ", " + data1);

try
{
ShortMessage sMsg = new ShortMessage();
sMsg.setMessage( status, data1, data2);
this.rec.send( sMsg, 1);
}
catch( Exception e)
{
System.out.println( "error : sendMidiMessage");
}
}

private void closeMidi()
{
System.out.println( "closeMidi");

try
{
if( this.rec != null)
{
this.rec.close();
}
}
catch( Exception e)
{
System.out.println( "error : closeMidi");
}
}
}

/*--------------------------------------------------------------------------------*/

/**
 * キーリスナー
 */
class SimpleKeyListener implements KeyListener
{
//C, D, E, F, G, A, B
//C#, D#, F#, G#, A#

private MidiApplet midiApplet;
private boolean[] flag;
public int noteC;

public SimpleKeyListener( MidiApplet midiApplet)
{
super();

this.midiApplet = midiApplet;

this.flag = new boolean[10];
this.noteC = 60;
}

public void keyPressed( KeyEvent e)
{
//System.out.println( "key pressed");

int code = e.getKeyCode();
int note = this.noteC;

if( code == KeyEvent.VK_C)
{
if( this.flag[0] == true)
{
return;
}

this.flag[0] = true;
}
else if( code == KeyEvent.VK_D)
{
if( this.flag[1] == true)
{
return;
}

this.flag[1] = true;
note += 2;
}
else if( code == KeyEvent.VK_E)
{
if( this.flag[2] == true)
{
return;
}

this.flag[2] = true;
note += 4;
}
else if( code == KeyEvent.VK_F)
{
if( this.flag[3] == true)
{
return;
}

this.flag[3] = true;
note += 5;
}
else if( code == KeyEvent.VK_G)
{
if( this.flag[4] == true)
{
return;
}

this.flag[4] = true;
note += 7;
}
else if( code == KeyEvent.VK_A)
{
if( this.flag[5] == true)
{
return;
}

this.flag[5] = true;
note += 9;
}
else if( code == KeyEvent.VK_B)
{
if( this.flag[6] == true)
{
return;
}

this.flag[6] = true;
note += 11;
}
else if( code == KeyEvent.VK_UP)
{
this.flag[7] = true;
return;
}
else if( code == KeyEvent.VK_DOWN)
{
this.flag[8] = true;
return;
}
else if( code == KeyEvent.VK_SHIFT)
{
this.flag[9] = true;
return;
}
else
{
return;
}

note += ( this.flag[7] == true ? 12 : 0);
note -= ( this.flag[8] == true ? 12 : 0);
note += ( ( this.flag[9] == true && code != KeyEvent.VK_E && code != KeyEvent.VK_B) ? 1 : 0);

this.midiApplet.sendMidiMessage( ShortMessage.NOTE_ON, note, 127);
}

public void keyReleased( KeyEvent e)
{
//System.out.println( "key released");

int code = e.getKeyCode();
int note = this.noteC;

if( code == KeyEvent.VK_C)
{
this.flag[0] = false;
}
else if( code == KeyEvent.VK_D)
{
this.flag[1] = false;
note += 2;
}
else if( code == KeyEvent.VK_E)
{
this.flag[2] = false;
note += 4;
}
else if( code == KeyEvent.VK_F)
{
this.flag[3] = false;
note += 5;
}
else if( code == KeyEvent.VK_G)
{
this.flag[4] = false;
note += 7;
}
else if( code == KeyEvent.VK_A)
{
this.flag[5] = false;
note += 9;
}
else if( code == KeyEvent.VK_B)
{
this.flag[6] = false;
note += 11;
}
else if( code == KeyEvent.VK_UP)
{
this.flag[7] = false;
return;
}
else if( code == KeyEvent.VK_DOWN)
{
this.flag[8] = false;
return;
}
else if( code == KeyEvent.VK_LEFT)
{
this.noteC -= ( 12 < this.noteC) ? 12 : 0;
}
else if( code == KeyEvent.VK_RIGHT)
{
this.noteC += ( this.noteC < 120) ? 12 : 0;
}
else if( code == KeyEvent.VK_SHIFT)
{
this.flag[9] = false;
return;
}

//Note Onの時の、up, down, shiftキーの状態を記録していないので、すべてにNote Offメッセージを送る
this.midiApplet.sendMidiMessage( ShortMessage.NOTE_OFF, note, 127);
this.midiApplet.sendMidiMessage( ShortMessage.NOTE_OFF, note - 12, 127);
this.midiApplet.sendMidiMessage( ShortMessage.NOTE_OFF, note + 12, 127);

if( code != KeyEvent.VK_E && code != KeyEvent.VK_B)
{
this.midiApplet.sendMidiMessage( ShortMessage.NOTE_OFF, note -11, 127);
this.midiApplet.sendMidiMessage( ShortMessage.NOTE_OFF, note + 1, 127);
this.midiApplet.sendMidiMessage( ShortMessage.NOTE_OFF, note + 13, 127);
}
}

public void keyTyped( KeyEvent e)
{
//System.out.println( "key typed");
}
}

/*--------------------------------------------------------------------------------*/

/**
 * アイテムリスナー
 */
class SimpleItemListener implements ItemListener
{
private MidiApplet midiApplet;

public SimpleItemListener( MidiApplet midiApplet)
{
super();

this.midiApplet = midiApplet;
}

public void itemStateChanged( ItemEvent e)
{
Choice choice = (Choice)e.getItemSelectable();
int temp = choice.getSelectedIndex();

this.midiApplet.sendMidiMessage( ShortMessage.PROGRAM_CHANGE, temp, 0);

this.midiApplet.requestFocusInWindow();
}
}

/*--------------------------------------------------------------------------------*/

作文の話

 このブログの目的の一つは、私の作文の練習です。色々なことに当てはまりますが、作文も練習しないと上達しません。また、ただ練習するよりも、うまいやり方を知っておくのが上達のコツです。というわけで、作文のための文章の構成方法を調べてみました。

 まず「起承転結」という構成ですが、これは漢詩に由来する文章の構成です。小学生のときに習うので、一般的なものだと思っていたのですが、実はローカルな構成だそうです。学生の頃に習った杜甫の漢詩は美しかったという記憶がありますが、その構成は特別な場合みたいです。もちろん、使ってはいけない、ということはありません。

 三幕構成もしくは序破急という構成は、映画の脚本などで国際的に使われる構成です。設定、対立、解決という流れです。桃から生まれる、鬼を倒す、めでたしめでたし、みたいな感じでしょうか。ストーリーを書くならこれがいいでしょう。

 パラグラフ・ライティングは英語圏での文章の基本的な構成です。序論、本論、結論という流れです。序論で主張を述べて、本論で根拠などを示し、結論で再度主張を述べるいう感じです。ビジネスなどでは、パラグラフ・ライティングの構成が分かりやすいと思います。

 学術論文はIMRADという構成で書きます。つまりIntroduction、Methods、Results、and Discussionという流れです。私も実験レポートはこういう流れで書くようにしています。

 文章を書いていると、起承転結をどうするかで迷ったりしたのですが、起承転結にこだわらずに、内容に合わせて、構成を変えるのが良いみたいです。逆に、文章を読んでいるときには、どのような構成かを考えてみると、勉強になりそうです。今後はそういったことも意識してみようと思います。

・・・私も、まだまだ勉強が足りないです。

参考:Wikipedia