ゼロクロススイッチは悪影響が大きいから使わないこと

エレクトロニクスやコンピュータに詳しい人なら「ゼロクロススイッチ」という物をご存知では無いでしょうか? 交流の電源の電圧ゼロのタイミングで投入すればスムーズに電気が入るというものです。

コンピュータやオーディオ機器を突入電流から守り、より長く大切な機器を使うことができるという説明です。 特にヴィンテージオーディオや高級オーディオに対してはずばり「ゼロクロススイッチ」という名前でアクセサリーが売られていたりします。


実は逆効果

電子部品メーカーの『タイコエレクトロニクス』(Tyco Electronics / TE Connectivity)のレポートの「Beware of Zero-Crossover Switching of Transformers」では

ゼロクロスオーバー ソリッドステート リレーは、変圧器または高誘導負荷のスイッチング方法として最悪と言えます。

としています。説明は後回しにしますが、ヴィンテージオーディオやコンピュータ機器の電源には変圧器が入っているので、説明の通り最悪ということになります。


ゼロで投入すると逆起電力が発生しない

トランスなどコイルに電圧を一気に投入すると、それに逆らう形で逆起電力が発生します。そのため電圧が高くなることは有りません。しかし、ゼロボルトから電圧を上げると逆起電力が発生しないため突入電流が多く流れます。

これが交流 一秒間に50/60回繰り返す

それにより過大な負荷がトランスや部品にかかり悪影響を与えます。

何故、ゼロクロススイッチが存在する

悪いものだったら何故製品としてあるのか? それは、ごく一部に適した場所があるからです。 それは単純な抵抗負荷で突入電流が少ないものです。

抵抗負荷で思い浮かぶのがフィラメント電球ですが、フィラメントは冷えているときには抵抗値が低く過大な突入電流が流れるのでゼロクロススイッチの効果は有りません。

残るはヒーターなどの電熱線です。電熱線はゼロから電圧をかけることで突入電力を回避し断線を防止できます。

ただ、ヒーター負荷などほとんど無いと思われるので、ゼロクロススイッチの発揮できるケースは無いのではと考えます。

ゼロクロススイッチはこのタイミングでON/OFFする

結論、普通なスイッチで良い

ゼロクロススイッチはやっていることも理解しやすいし、DIY初心者でも手を出しやすい理解しやすい回路図なので手を出す人が多いです。 ネットにも製作記事があります。

でも、ゼロクロススイッチが有効なら最初から機器の中に入っていると考えられます。昔よくあったクルマの燃費、馬力改善グッズみたいなポン付けしたり、DIYで軽くいじるだけで効果が出る物が有りました。 ただ、冷静に考えれば、そんな物があれば自動車メーカーに売れば良い話です。

TE社の説明ではピークでONしたほうが良いとのこと

自宅や職場のシステムを改善するときには、このゼロクロススイッチの事を思い出して、決して安易に応用しないと考えて下さい。

動画を見る

【入門】漠然とプログラミング言語を覚えるにはC言語系 C++とか

 漠然とプログラミング言語を覚えたい。今流行りのプログラミング学習の流れでそう思う人が多いです。 良いことだと思って、「で、何をやりたいの? ゲーム制作、ウェブ、スマホアプリ?」と聞いても、とりあえずプログラミングを覚えたいとなります。


そんな人はC言語

漠然とプログラミング言語を覚えたいのであれば、C言語をおすすめします。理由としては、非常に汎用的に使えるところです。 特定の分野に特化した機能が基本部分には無いため言語の本質を覚えやすいと言う部分もあります。


C言語かC++か?

よくわからないのであれば悩まないで下さい。単にC言語を増築したのがC++です。まずはどちらも同じって考えで取り組んで見て下さい。というか、この手の悩みがある人って、理解できないことを妄想して悩むって人かもです。「遠くの関係ない心配ばかりしていて、足元の穴に躓いて骨折するって人」です。

学生のときにもよくいた「どの参考書が良いのか?」って探しまくっている人です。結局、最初は周りの人が使っている参考書でも手に入れて勉強の習慣を付けることが重要なのですけど。 英会話初心者が「イギリス人から習うのは心配です」みたいな事を言っているようなものです。 そんな方々は一生何かを身につけることは無理なのではと考えます。

だから、よくわからなければC言語を覚えて下さい。

最初に習うことは

C言語というとポインターと言われるが、とりあえずは忘れて下さい。 まずは、普通に変数に値を代入し、IF文で判定、FOR文で繰り返し、標準関数のprintfで文字出力をして色々動かしてみて下さい。

それでもポインターが気になる

  1. #include<stdio.h>
  2. main(){
  3.     int *a;     //整数型のポインタ(住所を書くことが出来るaというメモ用紙って認識)
  4.     int z=111;    //整数型の実体 (zという土地を買ったと言う認識、上モノは111)
  5.     
  6.     a = &z; //zという土地の住所をメモ帳aに書き込む 実体の変数の先頭に & を付けるとその住所を返す
  7.     z = 240; //zという土地に240という家(上モノ)を建てる。
  8.     
  9.     printf("%d\n",z); //土地aにどんな家(上モノ)があるか表示する。このコードの場合は240と表示される
  10.     *a = 222;    //メモ用紙aに書かれた住所に222という家(上モノ)を建てる。ポインター(メモ)に*を付けると上モノにアクセス出来る
  11.     
  12.     printf("%d\n",z); //土地aにどんな家(上モノ)があるか表示する。このコードの場合は222と表示される
  13.         
  14. }

簡単な例えです。まず、普通の変数は不動産に例えると「土地と上モノ」と考えて下さい

int z = 111;

とした場合、zという土地と111という上モノが手に入ります。次に

z = 240;

とすると、既に持っているzという土地の上モノを240にすると言うことです。まあ、たとえ話なので先程の上モノである111はどこに行った? という心配は忘れて下さい。(適切に廃棄されていますと納得を)

int *a;

上記のようにアスタリスクを付けて定義したものがポインターです。意味としては物件の住所をメモるすことが出来る変数として下さい。不動産のたとえだと単なるメモです。

a = &z;

上記の式では、zの住所をaにメモします。 物件を示す zに&を付けて&z とすると、zの物件の住所がメモ帳であるaに書き写されます。

*a = 222;

とすると aにかかれている土地の上モノを222にするということになります。

ではクイズです。現在 zの変数はいくつでしょうか? 答えを言うと 222です。 わからなければ以下の例えを順番に見て下さい

  1. zという土地を111という上モノと一緒に取得 int z=111;
  2. zという土地に240という上モノを建築 z = 240;
  3. aというメモ帳のページを一枚買う int *a;
  4. aというメモ帳にzという土地の住所をメモする a = &z;
  5. aというメモ帳に書かれている土地の住所に222という上モノを建築 *a = 222;

これで大体のポインタの意味が理解できたのではと思います。 ただ、とりあえずはこういう機能があるということだけで、普通の変数を使うことだけを考えて勉強すれば良いと考えます。

とりあえず何かプログラミング言語を覚えてみたいと考えている人は、今が吉日だと考えてC言語を覚えてみましょう。

動画を見る

【電卓技】電卓だけで三平方の定理

 エンジニア系ほど事務用の電卓を使わないのではと考えます。多くはExcelなどの表計算を使っていると思います。あと、笑ってしまうのは

「Excel起動できないからとりあえず計算しない」

って謎行動です。えっ、計算しないの? ってことです。意外にエンジニアって面倒なときは計算をしない傾向にあります。


電卓はどこにでもある

一般家庭のリビング、事務員の机の中、今だと子供のおもちゃ箱の中とか… いろいろな場所に電卓はあります。 込み入った計算をしたいのであればすぐに電卓を手にすれば良いのです。

でも、複雑な計算はメモが必要でしょ?

あっ、エンジニア! 技術者なのに技術のことを知らないの? って嫌味を言われそうな瞬間です。 電卓って昔から複雑な計算が出来てしまいます。多少、脳内で式変形とか必要ですが、それってエンジニアの得意技じゃないでしょうか?


三角形の斜辺の長さ

三角形の斜辺の長さの求め方はご存知でしょうか? 「三平方の定理」「ピタゴラスの定理」だね! と言われそうです。 でも、その計算を電卓で行うには結局メモが必要じゃないか?

いえ、メモリー機能を使えばメモは不要です。正確には電卓内部にメモされています。

三角形の斜辺を求める方法

高さを二乗したものと底辺を二乗したものを足して、それをルートする。

です。となると、高さの二乗と幅の二乗をメモしないと無理だろ? と言われそうです。

このときにメモリー機能を使うとメモは不要です。手順は

  1. 電卓の電源を入れる、リセットする
  2. 高さを入力する
  3. ×を押す(これで大体の電卓は二乗される)
  4. MR+ボタンを押してその結果をメモリーに加算する
  5. 底辺を入力する
  6. ×を押す。
  7. MR+ボタンを押す。これで、加算される
  8. MRCボタンを押すと先程の加算したものが入力される
  9. √ボタンを押す。これで斜辺が出る

です。電卓のメモリー機能を使うと今まででは考えられなかった複雑な計算が普通な電卓で出来てしまいます。 ここまで手元に転がっている「電卓」というテクノロジーを使わないのは損だと考えます。 あと、「車輪の再発明」ってエンジニアを揶揄する言葉もありますが、電卓を使わないということはそれ以前の「車輪を使いこなせない」ということです。

動画を見る

【課題提出】C言語でべき乗のプログラムをシンプルに書いてみた

 


課題提出などで、長いコードより短いコードのほうが提出が楽とされる場合があります。今回は「power」関数に相当するコードです。いわゆるべき乗を効率の良いループで計算するプログラムです。

  1. #include<stdio.h>
  2. main(){
  3.     int a,n,v;
  4.     scanf("%d%d",&a,&n);
  5.     for(v=1;n>0;v*=n%2?a:1,a*=a,n/=2);
  6.     printf("%d\n",v);
  7. }

以下がプログラム本体です。非常にシンプルで分かりやすいです。もちろん、アルゴリズム的にも洗練されており、単純に掛け算を乗数だけ繰り返すものでは有りません。

ただし、組み込み型のint変数を使っているので巨大な数はオーバーフローしますので注意です。 一応 2の30乗まで計算できます。

2

30

1073741824

このような計算結果です。

【C言語】べき乗を割り算で効率よく

 大学でコンピュータのアルゴリズムの基礎として「べき乗」の計算がよく出ます。まあ、実用的にはライブラリのpow関数でも使えば良いのですが、基礎的な関数を自分で実装できる機会も学生のときは必要だと考えます。

確かに仕事を始めると「車輪の再発明」みたいな言葉で何でも自作することは悪みたいな風潮はあります。ただ、初学者が自分で作ってみる機会は重要です。建築家が研究のために小さな小屋や木工製品を作るように、プログラマも既存の関数を自分で作ってみて下さい。

まず思いつく方法

  1. unsigned int power1(const int x,const int n){
  2.     unsigned int val = 1;
  3.     
  4.     for(int i=1;i<=n;i++){
  5.             val *= x;
  6.     }
  7.         
  8.     return val;
  9. }

上記の関数を思いつくのでは無いでしょうか? 単純に指数だけループして基底部を掛け算しています。2の30乗を計算するときも 2*2*.....*2 と30回繰り返しています。

分かりやすいアルゴリズムですが、もっと最適な方法があるだろうと言う疑問を持つと考えます。


指数部を2進数にしてみる

先程の30と言う数字を2進数にすると

(30)10=(11110)2

となります。具体的には2で割った余りが2進数の桁になります。一番最初が一番地位いさい桁です。

30÷2 = 15…0
15÷2 = 7…1
 7÷2 = 3…1
 3÷2 = 1…1
 1÷2 = 0…1

数字を2で割った余りが2進数の桁数になっていることが確認出来ます。次に2を繰り返し二乗します。先程の30を2進数にした桁数である5回やってみます。

2,4,16,256,65536

となります。この数字を先程の2進数の桁が少ない方からかけ合わせて見ます。

0*2,1*4,1*16,1*256,1*65536

と計算できます。後はこの数字を全て掛け算すれば2の30乗が計算できます。答えは

1073741824

です。

実際のコード

  1. unsigned int power2(const int a,const int n){
  2.     unsigned int val = 1;
  3.     int base = a;
  4.     int exp = n;
  5.     
  6.     while(exp > 0){
  7.         if(exp%2){
  8.             val *= base;
  9.         }
  10.     base *= base;
  11.     exp /= 2;
  12.     }
  13.     return val;
  14. }

これが指数を2進数にしたコードです。3行目では base に基底部、4行目ではexpに指数を入れています

6行目で expがゼロより上の条件でループします。 7行目の if 文では exp%2 は 2で割った余りがあれば2進数の桁が1ということで、現在の基底部base の内容が掛け算されます。

その後、基底部は二乗されます。単に自分自身を自分自身で乗算しています。 expは2で割り算しています。整数型なので小数点は切り捨てられます。

忘れがちなことですが、わり算の答えで余りを出す方法を思い出して下さい。小学生の算数や高校数学の整数で出てきているはずです。

他には

base *= base;
exp /=2;

と言った記述がありますが、以下と同じ意味です。表記が簡潔になるのと、間違えが発生しにくいと言う利点がありますので使って下さい。

base = base * base;
exp = exp / 2;

これと全く同じことが行われます。

途中結果を出すコード

  1. unsigned int powerInst(const int a,const int n){
  2.     unsigned int val = 1;
  3.     int base = a;
  4.     int exp = n;
  5.     
  6.     printf("Idx / 2 Div ...M Base * M\n");
  7.     while(exp > 0){
  8.         printf("%3d / 2 = %3d...%1d %10d * %1d\n",exp,exp/2,exp%2,base,exp%2);
  9.         if(exp%2){
  10.             val *= base;
  11.         }
  12.     base *= base;
  13.     exp /= 2;
  14.     }
  15.     printf(" %10d\n",val);
  16.     return val;
  17. }

上記コードは途中結果を出力します。これで動作を確認してみて下さい。実行結果は以下です。

  • Idx / 2 Div ...M Base * M
  •  30 / 2 = 15...0 2 * 0
  •  15 / 2 = 7...1 4 * 1
  •   7 / 2 = 3...1 16 * 1
  •   3 / 2 = 1...1 256 * 1
  •   1 / 2 = 0...1 65536 * 1
  •                   1073741824

一列目が指数、二列目が2、三列目が割り算、四列目が余り、五列目が基底部、六列目が余りです。

べき乗計算は既にライブラリとしてありますので、正直この実験は「車輪の再発明」に近いです。 ただ、最初に言ったように初学者ほどこのような基礎的なアルゴリズムを空で打てるようにしておいて下さい。

あと、べき乗計算でこの方法を応用すると劇的に処理を高速化出来ます。今回も正攻法だと指数部30だと30回のループが必要ですが、今回の方法だと5回のループで計算できています。この知識は高度なプログラミングにも応用が利くので覚えておいても損は無いと考えます。




【常に初心者】学ぶときには地頭力を封印すること

 エンジニアと呼ばれる人ほどMicrosoft Officeの研修を受けていないと私は考えます。もちろん私自身も現役のときは受けてもいないし、入門書すら読んだことが有りませんでした。これらのツールは「地頭力」と呼ばれる方法を使えばほとんどのエンジニアは使えてしまいます。


地頭力の罠

新しいことも地頭力で使うことが出来る。例えばC言語を知っていれば、困らずにJavaのコードを読むことが出来ます。細部が違うだけでコードとしての振る舞いは全く同じと言って良いでしょう?

しかし、C言語とJavaではコンセプトが違います。Javaではオブジェクト指向と呼ばれる概念。いわゆるClassというものがあります。しかしC言語の地頭力でJavaを使いこなした場合、そのClassを使うという部分が抜け落ちます。

初心者としてコンセプトを学ぶ

先程のOfficeに話を戻すと、昔のOfficeを使えれば今のOfficeも使えます。しかし、追加された機能に関しては全て無視することになります。 そのため、新しい関数はもちろん、テーブルの中にテーブルを作ることが出来るという概念すら使えないということになります。

そのため、新しいことを学ぶ場合はとりあえず「地頭力」を封印して下さい。

最後に

地頭力は自分の意思決定を迅速にするためだけに使うのが有用です。しかし、新しいことを学ぶ場合は邪魔になります。そのため、類似のものだと感じたとしてもその考えは捨てて全く新しいものを学ぶという姿勢が重要です。

ウィンドウズアプリ入門 クリップボードにコピーされたらメッセージを受信する方法

 Windowsアプリでコピーされたときにイベントを取得できると便利です。例えばコピーされた内容を画面に表示したい場合などです。 もちろんタイマーイベントで定期的にポーリングをする方法もありますが、やや無駄な処理かもしれません。 Windowsとしてはコピーされたときのイベントを...