投稿

表計算ソフト Gnumeric spreadsheet

イメージ
オフィススイートを捨てる 長年しぶしぶ使っていたMSオフィスを捨てた。代替品として使っていたLibreOfficeもアンインストールした。もうオフィススイートは使わない。どうもこれらのソフトを使うとイライラして楽しくない。というか、いつも不快な思いをしながら作業をする。そして馬鹿みたいなことで、時間を食ってしまう。LibreOfficeはその思想からして応援したいところだが、MSオフィスの代替を目指すところで、個人的に使いたいというソフトではないのだなぁ。。残念ながら。仕事でワードのファイルを渡されることもあるけど、変換で何とかなるだろう。官公庁のMSオフィス指定はさっさとやめてもらいたい。ワードで作った出来の悪いフォーマットを送ってきて、それに記入しろ、というのは勘弁して欲しい。 オフィススイートのよろしくないところ オフィススイートと呼ばれるソフトには、ワープロ、表計算、プレゼン用ソフトにデータベースなどが入っていて、これさえあれば一般事務がこなせるという代物。オフィススイートの欠点としては肥大化しまくって、起動が遅く、起動後ももっさり動き、ディスクスペースは500MB以上食う。対策としてPCを最新の超高速マシンにして一般事務をこなさなければならない。これはおかしいだろう・・・ 個人的にはワードが最悪。それにも関わらず、これで提出しろということがあまりにも多い。プレゼンもパワーポイント指定に何年も付き合わされた。誰もが似たような印象のプレゼン資料にはうんざりする。データベースはかわいそうなぐらい使わない。(個人的にデータベースって好きなのよ) ただ表計算だけはたまに使う。ということで、表計算単体があれば、個人的にはOKなのだ。あと、データベースはデータベースでいろいろと。 表計算(spreadsheet)だけでいい 単体表計算ソフトを探して見つけたのがGnumeric (グニューメリック)。オープンでフリーで強力! マルチプラットフォーム! http://projects.gnome.org/gnumeric/ image/svg+xml

音律について

イメージ
ドレミの誕生 現代のドレミの基盤を作ったのはピタゴラス(教団)。なんと紀元前500年以上前に、その基礎は出来上がっていた。では、どうやってドレミを作り出したのか? オクターブは基準 まず、ある音に対して最も調和する音を探してみる。これはピタゴラスに限らず、世界中の共通の認識でオクターブの音となる。低い「A(ラ)」に最も馴染む音は、高い「A」もしくは、さらに低い「A」ということになる。実際に波形を作って音にしてみた。純粋なサイン波の「A 440Hz」に対して途中でオクターブ上の「A 880Hz」をミックスしたサンプル。880Hzは耳に付くので、-6dB音量を下げている。 実際に聴いてみると、響きとしては単純な印象で、ハーモニーという感じはない。きわめて近い関係の音である。波形を見るとよく分かる。上段が440Hzで、中段が880Hz、下段がミックスしたもの。オクターブ上の音は周期がちょうど1/2になり、ミックスしてもうなりは生じず、安定した波形になっている。 現代の最も使われているドレミは、オクターブを均等に12分割している平均律という音律。でもピタゴラスの時代は、同じ12分割でも、微妙にいろいろ違う。ピタゴラスが、その12音を作り出す過程を追ってみる。 弦の倍音 はじめに弦の振動の分析から始まる。まずは実際のギターで音を出してみる。5弦開放のA(110Hz)の音。 弦を鳴らすと、いくつもの倍音が鳴っていることが分かる。Audacity(波形編集ソフト)を使って、周波数スペクトルで視覚的に確認してみる。 一番低い音が基音のA110Hzの音で最もピークが大きい。これでAの音が鳴っていると人は認識できる。明らかなピークとして存在する倍音を順に並べると以下のようになった。 基音 110Hz A 2倍音 220Hz A 3倍音 331Hz E 4倍音 440Hz A 5倍音 551Hz C# 6倍音 659Hz E 7倍音 770Hz G 8倍音 880Hz A ・ ・ ・ スペクトルを見ても、かなりたくさんの音で構成されているのが分かる。ピークの大きさが様々であり、時間軸で見ると、鳴り続けている音もあれば、すぐに減衰する音もある。弦が鳴っている音以外にアタック音もあるの

C言語 多次元配列

2次元以上の配列を多次元配列という。これは1次元配列の各要素に、さらに1次元配列をするようなもの。2次元配列の場合は升目をイメージになり、3次元配列の場合は、さらに奥行きが加わって立体になるようなイメージ。4次元では、さらに各要素に1次元配列がされていく。イメージとしては個人差が出るところだが、個人的には2次元&入れ子でイメージしている。こうすれば何次元だろうが容易いので。 まずは2次元配列。使うシーンとしては、縦横柔軟な計算が必要なとき。サンプルは、よくある成績の例で、いくつかの方法で計算してみた。 #include &ltstdio.h&gt /* マクロ定義 配列の要素のサイズを調べる */ #define SIZE(a) (sizeof(a)/sizeof(a[0])) /* 2次元配列 A,B,C,Dさんの国語、算数、理科の点数 */ int main(void) { float a[][3]={ /* 最初の配列の要素数は省略可 */ {50,50,50} /* 0=Aさん 国語、算数、理科の点数 */ ,{90,60,50} /* 1=Bさん 国語、算数、理科の点数 */ ,{30,90,40} /* 2=Cさん 国語、算数、理科の点数 */ ,{40,70,60} /* 3=Dさん 国語、算数、理科の点数 */ }; /* 各人の3教科平均点 */ int i; int j; float sum; for(i=0;i&ltSIZE(a);i++){ for(j=0;j&ltSIZE(a[0]);j++){ sum += a[i][j]; } printf("各人平均点 %d= %f\n",i,sum/SIZE(a[0])); sum = 0; } /* 各教科の平均点 国語=0、算数=1、理科=2 */ for(i=0;i&ltSIZE(a[0]);i++){ for(j=0;j&ltSIZE(a);j++){ sum += a[j][i]; } printf("教科平均点

C言語 構造体 struct

構造体とは、異なった型の変数をひとつの名前でまとめたようなもの。Javaから入った身としては、どう使うか疑問に感じるところ。構造体は関数を内部に入れられないので、クラス的に使うことは難しい。でもクラスを使うよりも負荷が少ないようだ。新しいGo言語でも構造体は健在なので、パフォーマンスを重視すると捨てがたいのだろう。まずは基本的な扱い方からスタート。 CDのリストを構造体で表現してみる #include &ltstdio.h&gt #include &ltstring.h&gt /* 構造体の宣言 メモリ割当ては行われない*/ struct cd{ int no; char title[20]; int price; }; int main(void){ /* クラシック リスト作成 メモリに展開 */ struct cd classic[] ={ {1,"Bach",2600}, {2,"Mozart",2500}, {0,"",0} }; /* ジャズ リスト作成 メモリに展開 */ struct cd jazz ={ 1,"Coltrane",1800 }; /* クラシック リスト表示 */ int i; for(i=0;i&lt2;i++){ printf("%-6s No.%d %-9s Price:%d\n", "Classc", classic[i].no, classic[i].title, classic[i].price); } /* ジャズ リスト表示 */ printf("%-6s No.%d %-9s Price:%d\n", "Jazz", jazz.no, jazz.title, jazz.price); return 0; } まずジャンルごとにClassicとJazzに分けて考える。使う構造体は同じで、ナンバー

C言語 static 変数

static ローカル変数 staticがついたローカル変数は、プログラム開始時にメモリ上に作られ、関数の処理が終わっても変数の値は残り続け、プログラム終了時まで存在する。また何もしなくても0で初期化される。 #include &ltstdio.h&gt int count(){ static int s_x; /* 値が残り続ける */ s_x++; return s_x; } int main(void){ int a; a = count(); printf("main1 a= %d\n",a); a = count(); printf("main2 a= %d\n",a); a = count(); printf("main3 a= %d\n",a); return 0; } mainからcount関数を3回呼び出している。staticがなければ、変数「s_x」は毎回初期化され、同じ結果「1」が出るのだが、staticをつけることで、変数の値が残り続け、「1」「2」「3」となる。 main1 a= 1 main2 a= 2 main3 a= 3 static グローバル変数 グローバル変数にstaticキーワードを使用すると、そのファイル内でしか利用できなくなる。同じstaticキーワードだが、ローカル変数の時と意味合いが違う気がする・・ こういう部分がC言語のちょっとおかしなところ。 main関数 a.c /* a.c */ #include &ltstdio.h&gt #include "a.h" /* グローバル変数を利用するために宣言をするが・・ */ extern int g_num; int main(void){ funcB1(); funcB1(); /* printf("main %d\n",++g_num); エラーになる */ return 0; } 実装ファイル b.c /* b.c */ #include &ltstdio.h&gt /* staticグローバ

C言語 配列 arrays

配列の宣言 配列は同じ型の集まり。データを一括して扱う場合に使用する。ひとつひとつを要素(element)という。要素数の添え字は0から始まる。例として10個のint型の配列を宣言。 int a[10]; 配列にアクセスするときの添え字は0から9となる。 a[0]~a[9] この配列の中にint型の数値を入れるには、いくつかの方法がある。 要素ひとつひとつに入れる場合は以下のようにする。 a[0]=255; a[1]=256; 配列を宣言するときに初期値として入れてしまうことも可能。 int a[10] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55}; また、初期値をこのように入れている場合は、要素数は省くこともできる。 int a[] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55}; int型の配列 #include <stdio.h> int main(void){ int a[] = {1,1,2,3,5,8,13,21,34,55,89,144}; int i; for(i=0;i<15;i++){ printf("%d array= %d アドレス=%x\n" ,i,a[i],&a[i]); } return 0; } 配列を用意して、初期値となる数列を入れる。それをfor文で出力。実行結果は以下の通り。注目点はアドレスがint型の4byteずつ増加しているところ。要素は4byteをひとつとして数えているのが分かる。また配列の要素以上に繰り返し表示させているが、最後の要素である144以降は無関係な数値が入っている。Javaではコンパイルエラーになるようなところも、C言語では容赦なく実行してしまうので注意が必要。 0 array= 1 アドレス=23ff0c 1 array= 1 アドレス=23ff10 2 array= 2 アドレス=23ff14 3 array= 3 アドレス=23ff18 4 array= 5 アドレス=23ff1c 5 array= 8 アドレス=23ff20 6 array= 13 アドレス=23ff24 7 arr

画像解析ソフトウェア ImageJ

イメージ
オープンソースの画像解析ソフトであるImageJを紹介しようと思う。開発はアメリカ国立衛生研究所(NIH)で、Javaで作られている。 http://rsbweb.nih.gov/ij/ 2013.02.09 現在 最新バージョン: ImageJ 1.47i 3.1MB これに Java の JVM を含む jre が必要。すでに PC にインストールされていれば、本体だけダウンロードすれば使える。Java で作られていることもあって、かなりコンパクトなファイルサイズになっている。一度インストールすれば、Help メニューからのアップデートで簡単にバージョンアップができる。 2011.4.19 そもそもJavaで作られたアプリケーションなんて珍しいと思って使ってみたのがはじまり。使ってみたら意外と実用的で快適だったので、それ以来手放せなくなっている。 主に医療、科学分野で利用されている画像解析ソフトだが、個人的に解析するようなことはないので、Blogや仕事で使う画像の加工などに利用している。基本的な画像処理なら問題なく出来るし、重装備画像処理ソフトと比べて動作が軽いのでストレスがない。ということで、ここ数年はずっとImageJばかり使って、Photoshopなんて起動もしなくなってしまった。見た目は上の画像の通り、メニューバーのみで、画像処理ソフトらしからぬ質素なインターフェイスだが、それが返って使いやすかったりする。 個人的に気に入っているところは、以下のようなところ。 無料: オープンソース&パブリックドメインのソフトウェアである。これは重要。 Java製画像解析ソフト: 個人的にJavaが好きなのでJava製というだけでポイント高い。 Javaなのに高速処理できる: Javaは遅いというイメージを払拭する出来映え。ネイティブで処理しているんじゃないか?と疑うぐらい高速。 マルチプラットフォーム: Windows, Mac, Linux で利用可能。Javaならではのメリット。 シンプルなツール: メニューバーだけ。画面を占領せず控えめな印象であるが、機能は強力で使い勝手はよい。他の画像処理ソフトみたいにパレットだらけにならないところが快適。 起動がまぁまぁ速

C言語 その他の制御文 switch, while, do, goto

これらの制御文は機能的には if, for で代替できる。使う理由としては、コードの読みやすさを優先させるため。扱いが楽という意味で、Syntax Sugarという。goto文に関しては、むやみに使わないようにとある。バグ、メンテなど問題が発生しやすいという理由から。これらの制御文は積極的に使うつもりはないので、基本的な書き方だけ載せておく。 while #include &ltstdio.h&gt int main(void){ int i=10; while(i>0){ printf("カウントダウン %d\n",i); i--; } return 0; } while文は条件を満たしている間繰り返す。 カウントダウン 10 カウントダウン 9 カウントダウン 8 カウントダウン 7 カウントダウン 6 カウントダウン 5 カウントダウン 4 カウントダウン 3 カウントダウン 2 カウントダウン 1 do while #include &ltstdio.h&gt int main(void){ int a = 11; int i = 1; do{ printf("%d回通過 a=%d\n",i,a); i++; a++; } while(a < 10); printf("%d回実行して終了\n",i-1); return 0; } do whileは条件を満たしていなくても1回は通過させる。 1回通過 a=11 1回実行して終了 switch #include &ltstdio.h&gt int main(void){ int a = 2; switch(a){ case 0: printf("aは0です\n"); break; case 1: printf("aは1です\n"); break; case 2: printf("aは

C言語 ポインタ pointer

難解と言われているポインタ。通常の変数と違って、任意の変数のアドレスを格納するのがポインタ。アドレスとは、メモリに割り当てられている住所のことで、変数はアドレスを持っている。プログラムが変数にアクセスするときには必ずアドレスが必要になる。ポインタはその変数のアドレスを直接扱うことができる。このポインタを使うことで、効率的なプログラムを実現することができ、C言語では欠かせない機能となっている。でも読みにくいコードになりやすく、巨大なプログラムになると、バグ出しが大変になってしまう。また深刻なダメージを与えかねないため、新しい言語の多くでポインタは廃止され、より安全な方向になっている。しかし内部的にはポインタと同じことをしている。単に表面的にポインタをなくし、ポインタを意識しなくてもプログラミングできるようにしているだけのこと。C言語のポインタを学ぶことで、メモリの扱いなどローレベルの動きがイメージしやすくなるので、高速なアルゴリズムなどを目指すならトライしておきたい。色々な使い方があるので、まずは簡単な例でポインタを確認するところからスタート。 ポインタの一番シンプルな例 #include &ltstdio.h&gt int main(void){ int x = 500; int *p; /* ポインタの宣言「*」アステリスクが付く */ p = &x; /* &x は x のアドレス pポインタにxのaddressを代入 */ /* int *p = &x; と書いても同じ */ printf("x = %d\n",x); /* xの中身= 500 */ printf("x Add = %x\n",&x); /* xのアドレス= 23ff48 */ printf("*p = %d\n",*p); /* pが指すxの中身= 500 */ printf("p = %x\n",p); /* pの中身= 23ff48 */ printf("p Add %%x = %x\n",&p); /* pのアドレス= 23ff4c */

C言語 関数 function

C言語は関数という単位で構成されている。関数は処理のまとまりであり、それらを組み合わせることでプログラムが作られている。プログラムを書くことは、そのまま関数を書くことになる。main(){}がひとつの関数であり、プログラムのスタート地点となる。main関数の中にダラダラと複数の処理を書くことも可能であるが、作った関数の再利用や、保守性などを考えると、機能ごとに分けたほうがよい。簡単なサンプルで解説してみる。(子供に説明するために作ってます。) main関数のみの例 /* Cを書く上で最低必要な標準関数 */ #include &ltstdio.h&gt /*三角形の面積を求める voidは引数を取らない*/ int main(void){ int x = 10; /*底辺*/ int y = 12; /*高さ*/ /*三角形の面積を計算して出力*/ printf("三角形の面積= %d\n",x*y/2); return 0; /*プログラムの終了 無事終了=0を返す */ } 三角形の面積を求めるプログラムをmain関数の中で行っている。結果は以下の通り。 三角形の面積= 60 上記をmain関数とcalc関数の2つに分ける #include &ltstdio.h&gt /*calc関数 三角形の面積を求めて表示 voidは戻り値がないことを宣言。 ()内は仮引数(parameter) コピーされた値 */ void calc(int a,int b){ /*三角形の面積を計算して表示*/ printf("三角形の面積 %d\n",a*b/2); return; /*処理後値なしでmainに戻る 本来省略*/ } /*メイン関数 プログラムは、ここからスタート*/ int main(void){ int x = 10; int y = 12; /*値をcalc関数に渡し、処理はcalcへ移る */ calc(x,y); /* ()の中が引数(argument) 値渡し。*/ /*calc関数終了後returnで、ここに戻ってくる */ return 0; /*プログ

C言語 if文

分岐if文の書き方 if(イフ)文は分岐制御をする。分岐には他にswitch文もあるが、プログラムの読みやすさを重視したもので、機能的にはif文ですべて可能であり、より柔軟性のある制御ができる。 基本的なif文 #include &ltstdio.h&gt int main(void) { int a=6; if (a%2==0) { printf("%dは偶数です\n",a); } return 0; } 最も基本的なスタイル。処理文は{}で囲む。処理文は{}内に複数あっても構わない。 6は偶数です {}を省略したif文 #include &ltstdio.h&gt int main(void) { int a=6; if (a%2==0) printf("%dは偶数です\n",a); return 0; } 条件後の1文セミコロンまでを実行する。 6は偶数です 基本的なif~else文 #include &ltstdio.h&gt int main(void) { int a=7; if(a%2==0) { printf("%dは偶数です\n",a); } else { printf("%dは奇数です\n",a); } return 0; } 条件がfalseのときの処理をelse{}で用意する。条件がtrueの場合はelse{}の処理はされない。 7は奇数です switch文の代替としてのif文 #include &ltstdio.h&gt int main(void) { int a=2; if (a==0) { printf("aは0です\n"); } else if(a==1) { printf("aは1です\n"); } else if(a==2) { printf("aは2です\n"); } else if(a==

C言語 インクリメント デクリメント

インクリメントは値を1増やし、デクリメントは1減らす演算子。プログラム中で頻繁に使われる。この演算子は ++a のように前につけることも出来るし、a++ のように後ろでもつけることができる。しかし代入の際には注意する必要がある。 前置、後置の違い #include &ltstdio.h&gt int main(void){ /* increment */ int a; int b; a = 0; b = 0; b = a++; /* b=a 代入後に a+1 計算 */ printf("b=a++\tb=%d\ta=%d\n",b,a); /* b=0 */ a = 0; b = 0; b = ++a; /* a+1 計算後に b=a 代入 */ printf("b=++a\tb=%d\ta=%d\n",b,a); /* b=1 */ /* decrement */ a = 0; b = 0; b = a--; /* b=a 代入後に a-1 計算 */ printf("b=a--\tb=%d\ta=%d\n",b,a); /* b=0 */ a = 0; b = 0; b = --a; /* a-1 計算後に b=a 代入 */ printf("b=--a\tb=%d\ta=%d\n",b,a); /* b=-1 */ return 0; } 結果は以下のようになる。代入してからインクリメントされるか、インクリメントしてから代入するかの違いがある。 b=a++ b=0 a=1 b=++a b=1 a=1 b=a-- b=0 a=-1 b=--a b=-1 a=-1 C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら

C言語 for文

繰り返し処理を行うfor文の書き方 for(フォー)文は繰り返し処理をするときに使う文。C言語では他にwhile文 や do/while文も繰り返し文として存在するがfor文で代替可能。またfor文は複雑な繰り返し文にも対応できる柔軟性がある。新しいプログラミング言語のGo言語ではwhile文とdo/while文は採用されていない。繰り返し文はfor文だけで問題ないことが分かる。 C言語ではカウントの役目を果たす int i; の宣言をfor文の継続条件式の中で出来ないため、外で宣言する。C++やJavaでは中で宣言可能。 基本的なfor文 #include &ltstdio.h&gt int main(void) { /* for 処理文を{}で囲む 一般的なスタイル */ int i; /* C言語はfor式の外で宣言 */ for (i=0;i&lt3;i++) { printf("%d回目の処理\n",i+1); } return 0; } (i=0;i&lt3;i++)の中の説明 (カウントの初期化; ループ継続条件; カウントアップ) i=0; カウントを初期化する。 i&lt3; iが3よりも小さい間、繰り返す。 i++ カウントアップ。まず継続条件内であれば、1回処理した後に i に 1 を加える。つまり1回目はi=0で実施し、2回目はi=1、3回目はi=2、4回目はi=3で継続条件を満たせないため、for文を抜けるという具合。実行結果は以下のようになる。 1回目の処理 2回目の処理 3回目の処理 簡易的なfor文 #include &ltstdio.h&gt int main(void) { /* for 処理文が1行のときの簡易的な書き方 */ int i; for (i=0;i&lt3;i++) printf("%d回目の処理\n",i+1); return 0; } for文の継続条件式の後にある 1文;(セミコロン)までがループの範囲。上記例ではforから処理文まで1行で書かれているが、処理文を改行していても問題ない。セミコロン以降に処