読者です 読者をやめる 読者になる 読者になる

デザインダイアローグコペンハーゲン

デンマークのコペンハーゲンでのデザイン留学の日々について書いています

アルゴリズムと言う程ではないがプログラミング初心者が驚くちょっとしたテクニックなど

テクノロジー CIID

CIIDでは基本的にチームでモノ作りを行います。そのため、プログラミングひとつとってもペアプログラミングのような事をする事が多いのです。そういった場合に我々からすると当たり前の様な事であっても、プログラミング初心者からすると、そんな手があったのか!と言う超絶テクニックに見えるものがあるらしく、いくつかメモとして残して起きます。

フラグを利用したトグル処理

ユーザインタフェースだとか、何らかのインタラクションを制御したいと思うと、ボタンなどを押した時にONとOFFを切り替えたい事が多くあると思うのですが、下記のようなコードで、2種類の処理を交互に実施する事ができます。

int flag = 0;
function foo(){
    if(flag){
        //偶数回目(2,4,6・・・)にスイッチが押された時の処理
        flag = 0;
    }else{
        // 奇数回目(1,3,5・・・)スイッチが押された時の処理
        flag = 1;
    }
}

知ってる人からすると、当たり前じゃないの?と思うかもしれないのですが、おそらく関数の外に変数を用意してそれを参照して処理を振り分けつつ変数を書き換えると言うのは基本的な構文だけを習っただけでは簡単には思いつかないのだろうなぁと思うのです。

閾値の設定方法

ある値が一定以上になったら特定の処理を行い、一定以下になったら処理を終わらせたいと言う場合があると思います。ある値、というのが比較的安定した値であれば良いのですが、アナログセンサから取得した値の場合などだと、値が閾値周辺の場合に、処理の開始と終了が頻繁に繰り返されてします、のような事が発生してしまいます。

このような場合は、下記のように閾値をずらす事で、比較的安定して動作するのではないかと思います。

function foo(){
    if(value > 300){
        //処理開始
    }else if(value < 200){
        // 処理終了
    }
}

こういった処理に関しても、プログラミングに慣れた人からすると、これのどこが凄いの?と思うかもしれません。しかしながら、そもそも処理を開始する条件と、終了する条件を別に設定しても良いと言う事をなかなか思いつかないのかなとも思うのです。

値を徐々に変化させる

アニメーションの描画だとか、モータの制御等を行うときに出てくる要望のひとつが、変化の速度を調整したいと言うこと。例えばサーボモータの制御にはPWMと呼ばれる方式を利用するのですが、これは、一定の角度にしなさいと言う命令をサーボモータに送るだけであって、現在の角度から目標の角度までの変化の速度等を指示する事はできません。そのため、徐々に変化させようと思うと、目標角度までの間の値を指定する等の工夫が必要となりますが、これを実現するためのコードが下記のような感じ。

int targetValue = 0;
int currentValue = 0;
// ごく短時間で繰り返し呼ばれる関数
function foo(){
    if(Math.abs(targetValue - currentValue) > 5){
        currentValue += 5;
    }else{
        currentValue = targetValue;
    }
}

こちらもコードにしてしまえばそれだけ?と言われそうなものですが、プログラミング初心者には、そもそもこのような事が出来るという発想に至らない事が多いようで、すげー!すげー!と驚かれてしまいました。

わたしはプログラミングをかなりやってきたほうなので、こんなことで?と思うようなものばかりではあるのですが、ペアプログラミング的に一緒に手を動かす事で、レベル差がかなりあるので本来の意味のペアプログラミングとは少々違うのでしょうが色々と発見もあり、また自身が新たに学べる事もあり新鮮だなぁと思うことが多々ありました。教授陣が、バックグラウンドが違うからこそ学べる事が多くあるといつも言っているのですが、これもまたそのうちのひとつなのかなぁ、などと。