趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • FreeCADを使ってみた

    投稿日 2016年 8月 13日 コメントはありません

    Wings 3Dに引き続き3Dデータの作成に挑戦するため、やはりSynapticでLinuxMint 18 x64の環境にインストールできるFreeCADを試してみました。

    試行錯誤しながら動かしていたのですが、自分のように他の人が3DCADを使っているところを見たことがあれば、こちらの紹介記事をみながら何とか使えそうな感じです。操作で最もわからなかったのが、視点の変更。平行移動がマウスの中ボタン(スクロールホイール)を押しながらマウス移動、回転させるのが中ボタン+左ボダンを押しながらマウス移動ということです。

    で、あれこれしながら作ってみたデータはこんな感じ。

    sample1

    何かの基板を入れるようなケースを意図して作ってみたのがこんな感じ。

    sample2

    データ作成にあたっては、各オブジェクトの位置(穴や凹みは引き算で作ってますので、引くためのオブジェクトも含む)の座標や大きさなどを数値で打ち込んで行くイメージになりそうな感じです。なので、ラフスケッチのイメージを作っておいてから作業着手するのが良さそうです。3Dプリンタで簡単なものを作ったり、KiCAD用の3Dモデルを作る程度であれば、自分でも何とか使えそうです。(KiCADに持っていく方法やピンを作る方法は別途考えないといけないですが・・・)

    他に少し古いバージョンを対象に書かれているようですが、こちらのサイトも参考になりそうです。


  • Wings3Dを使ってみた

    投稿日 2016年 8月 10日 コメントはありません

    久しぶりにKiCADを使って設計をしているのですが、出来上がりのイメージを高めるwには、やはりライブラリに3Dデータが欲しくなります。

    で、無料で3Dプリンタ用データを作れるフリー3Dソフト一覧というページを参考にしてLinuxで使えるツールの中から、SynapticでインストールできるWings 3Dを試してみました。

    オープンソースであることと、UIがシンプルで初めての人にも使いやすい、ということが特徴のようです。

    で、早速Synapticからインストールして試してみました。

    Wings3D

    基本の図形を並べて変形させていくような感じの操作方法で、精密なデータを作るのは多少しんどいかもしれないのですが、作ったデータはKiCADで使うデータは基板製造用のガーバーデータには関係ないですし、雰囲気がわかればいいのでまずまずの印象でした。

    ・・・が、本番のデータ作成にトライしてみようと、そこまで試しに作成してみた形状を保存しておこうとしたところ、

    Wings3DError

    となって保存できませんorz。

    うーむ・・・。

     


  • AndroidタブレットをLinuxのサブディスプレイにする

    投稿日 2016年 8月 9日 コメントはありません

    外出時にノートPCで作業していると、1366×768の画面ではどうしても狭く感じます。・・・で、ぐぐってみたところ、AndroidをLinuxのサブディスプレイにする方法がある模様。どうやらVNCを使うようなので、やってみました。

    環境は以下の通り。

    • サーバ側はLinutMint18 x64
    • クライアント側はNexus7(2012) + Android4.4.4

    です。

    作業にあたってはこちらのサイトを参考にさせていただきました。

    1.Linux側(サーバ側)

    Synapticでvnc4serverをインストールします。vnc4serverを使うのはSynapticにあるからです。

    インストールしたらVNCサーバを起動します。

    $ vncserver :1
    You will require a password to access your desktops.
    Password: ********
    Verify: ********

    起動したら接続用のパスワードを設定します。パスワードは8文字までで、8文字を超える長さの場合には最初の8文字が使われるようです。

    2.クライアント側(Android側)

    クライアント側はGoogle PlayストアでVNC viewerをインストール。

    起動したら、接続先として「Linux側のIPアドレス:5901」、接続名を適当な名前を設定します。接続するとパスワードを聞かれるので、vncserverを起動する際に設定したパスワードを入力します。ポート番号の5901は5900に:1の1を足して5901となっています。

    3.x2vncのインストール

    Synapticでx2vncをインストールする。インストールしたら以下のようにして起動する。

    $ x2vnc -shared -west localhost:1
    x2vnc: VNC server supports protocol version 3.8 (viewer 3.3)
    Password: ********
    
    x2vnc: VNC authentication succeeded
    x2vnc: Desktop name "(ホスト名):1 (ユーザー名)"
    x2vnc: Connected to VNC server, using protocol version 3.3
    x2vnc: VNC server default format:
    screen[0] pos=1003
    Xinerama detected, x2vnc will use screen 1.
    x2vnc: pointer multiplier: 0.930491

    として起動します。この状態でマウスは行き来できるようになっています。
    が、ウインドウは行き来できません。ウインドウマネージャがいないような雰囲気です。しかし、サブディスプレイ側(Android側)ではコンソールウインドウが開いているので、そこでfirefoxを起動するとサブディスプレイ側にブラウザを開くことができました。とりあえずWebを参考にしながら何か作業したり、viやxedで設定ファイルを編集したりする分には十分です。

    ここで一旦終了させます。

    $ killall x2vnc
    $ vncserver -kill :1

    VNCのパスワードを変更します。

    $ vncpasswd
    Password: ********
    Verify: ********

    4.まとめ

    インストールが完了したら、以下の手順で起動できます。

    $ vncserver :1 -depth 15 -geometry 1280x800 -alwaysshared
    $ x2vnc -shared -west localhost:1

    画面サイズはNexus7(2012)の画面サイズです。Android側でフルスクリーンにしておけばちょうどよくなります。

    IMG_20160809

    サブディスプレイとして使っている様子はこんな感じです。USBケーブルは電源供給専用で、接続はモバイルルータ経由です。


  • Nexus7(2012)のファームウェアをLoliPopにアップデート

    投稿日 2016年 5月 21日 コメントはありません

    手元にあるNexu7(2012/3Gモデル)をAndroid 5.1.1(LoliPop)にアップデートしてみます。
    手順はFactory Images for Nexus Devicesに書かれているとおりです。下の方の使用条件に同意してチェックすると具体的なイメージやアップデートの方法が表示されます。

    下記にLinuxMint17(64bit)での手順を記載しておきます。言うまでもないことですが、ファームアップデートは自己責任で。

    1)ツールのインストール

    $ sudo apt-get update
    $ sudo apt-get install android-tools-adb
    $ sudo apt-get install android-tools-fastboot

    2)Android端末を開発者モードに変更する

    Android4.4.4ではUSBでPCに接続しても、PC側では認識されません。現在入っている
    設定→タブレット情報をタップして、タブレット情報を表示させ、ビルド番号を連打すると「開発者モードになりました」という表示がされ、設定メニューの中に「開発者向けオプション」が現れます。開発者向けオプションの中の「USBデバッグ」にチェックを入れてからPCに接続します。

    3)Android端末のUSBデバイスIDを確認する

    $ lsusb
    Bus 002 Device 091: ID 18d1:d002 Google Inc. 
    Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 004: ID 05e3:0605 Genesys Logic, Inc. USB 2.0 Hub
    Bus 001 Device 007: ID 2101:1406 ActionStar 
    Bus 001 Device 006: ID 046d:c534 Logitech, Inc. Unifying Receiver
    Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub
    Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

    この場合、最初の18d1:d002がNexus7(2012)デバイスIDです。(18d1がベンダID、d002がデバイスID)

    4)udevルールを作成

    $ sudo vi /etc/udev/rules.d/51-android.rules

    内容はこんな感じ

    SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

    5)パーミッションを変更して、udevを再起動

    $ chmod 644 /etc/udev/rules.d/51-android.rules
    $ sudo /etc/init.d/udev restart

    6)イメージのダウンロードと検証

    以降は、公式サイトの手順の「Flashing instruction」に沿って進めていきます。

    まずはイメージのダウンロードと検証です。適当なディレクトリにイメージをダウンロードして、

    $ md5sum nakasig-lmy47v-factory-b2d44613.tgz
    c30e5d3bd7cef9edde38ce58bf741857 nakasig-lmy47v-factory-b2d44613.tgz

    としてファイルの正当性をチェックします。正しいファイルがダウンロードできたら、展開しておきます。

    7)イメージの書き込み

    Nexus7をPCに接続して、ターミナルから

    $ adb reboot bootloader

    でリブートさせます。初回はNexus側にUSBデバッグを許可するか表示されますので、「常に許可する」のチェックボックスにチェックを入れてOKを押します。
    Nexus側にブートローダの画面が表示されますので、

    $ fastboot oem unlock
    ...
    (bootloader) Bootloader is already unlocked
    OKAY [ 0.020s]
    finished. total time: 0.020s

    として、ブートローダをアンロックします。自分の場合は、以前5.0.2から4.4.4に戻した際にアンロックしてありましたので、上記のように「already unlocked」となりました。

    引き続きファームウェアアップデートに入ります。当然ですが、端末に保存されている情報はすべて消えてしまいますので、十分注意してください。また、不慮の事故等で端末が文鎮化するかもしれませんので、自己責任で。

    ~/ダウンロード $ cd nakasig-lmy47v
    ~/ダウンロード/nakasig-lmy47v $ ./flash-all.sh 
    ...
    (bootloader) Bootloader is already unlocked
    OKAY [ 0.020s]
    finished. total time: 0.020s
    erasing 'boot'...
    OKAY [ 0.035s]
    finished. total time: 0.035s
    ******** Did you mean to fastboot format this partition?
    erasing 'cache'...
    OKAY [ 0.174s]
    finished. total time: 0.174s
    erasing 'recovery'...
    OKAY [ 0.035s]
    finished. total time: 0.036s
    ******** Did you mean to fastboot format this partition?
    erasing 'system'...
    OKAY [ 0.370s]
    finished. total time: 0.370s
    ******** Did you mean to fastboot format this partition?
    erasing 'userdata'...
    OKAY [ 12.177s]
    finished. total time: 12.177s
    sending 'bootloader' (2100 KB)...
    OKAY [ 0.270s]
    writing 'bootloader'...
    OKAY [ 1.225s]
    finished. total time: 1.495s
    rebooting into bootloader...
    OKAY [ 0.020s]
    finished. total time: 0.020s
    sending 'radio' (16384 KB)...
    OKAY [ 1.973s]
    writing 'radio'...
    OKAY [ 0.673s]
    finished. total time: 2.646s
    rebooting into bootloader...
    OKAY [ 0.020s]
    finished. total time: 0.020s
    archive does not contain 'boot.sig'
    archive does not contain 'recovery.sig'
    archive does not contain 'system.sig'
    --------------------------------------------
    Bootloader Version...: 4.23
    Baseband Version.....: 1231_0.18.0_0409
    Serial Number........: xxxxxxxxxxxxxxxx
    --------------------------------------------
    checking product...
    OKAY [ 0.040s]
    checking version-bootloader...
    OKAY [ 0.023s]
    checking version-baseband...
    OKAY [ 0.030s]
    sending 'boot' (5186 KB)...
    OKAY [ 0.642s]
    writing 'boot'...
    OKAY [ 0.253s]
    sending 'recovery' (5740 KB)...
    OKAY [ 0.706s]
    writing 'recovery'...
    OKAY [ 0.237s]
    erasing 'system'...
    OKAY [ 0.109s]
    sending 'system' (650039 KB)...
    OKAY [ 77.868s]
    writing 'system'...
    OKAY [ 36.357s]
    erasing 'userdata'...
    OKAY [ 4.903s]
    formatting 'userdata' partition...
    Creating filesystem with parameters:
     Size: 30063722496
     Block size: 4096
     Blocks per group: 32768
     Inodes per group: 8192
     Inode size: 256
     Journal blocks: 32768
     Label: 
     Blocks: 7339776
     Block groups: 224
     Reserved block group size: 1024
    Created filesystem with 11/1835008 inodes and 159204/7339776 blocks
    sending 'userdata' (139157 KB)...
    writing 'userdata'...
    OKAY [ 29.779s]
    erasing 'cache'...
    OKAY [ 0.088s]
    formatting 'cache' partition...
    Creating filesystem with parameters:
     Size: 464519168
     Block size: 4096
     Blocks per group: 32768
     Inodes per group: 7088
     Inode size: 256
     Journal blocks: 1772
     Label: 
     Blocks: 113408
     Block groups: 4
     Reserved block group size: 31
    Created filesystem with 11/28352 inodes and 3654/113408 blocks
    sending 'cache' (9052 KB)...
    writing 'cache'...
    OKAY [ 1.733s]
    rebooting...
    
    finished. total time: 152.918s

    完了すると、勝手に再起動します。
    最初しばらくは倒れたドロイド君の上に赤三角内に「!」が表示されていて動きがないのでびっくりしますが、しばらくすると画面が変わって起動時の画面(Googleカラーのつぶつぶがぐるぐる廻る)に変わります。この状態が長く(5〜10分位?)続いた後、Welcome画面とともに言語選択する画面に遷移します。


  • 秋月の新しいGPSモジュールを試してみました

    投稿日 2016年 2月 22日 1つのコメント

    秋月の新しいGPSモジュール(単品ではなくキットの方)を試してみました。

    このキットはこのUSBシリアル変換基板と接続して使うことを初めから想定しているのか端子配置が合わせられています。・・・が、Androidでも使ってみたいと思っているので、今回はあえてPL-2303を使用したUSBシリアル変換モジュールと接続するケーブルを作成しました。

    まずは、aitendoのモジュールと同じ構成で中華Androidに接続、「You Are Here GPS」を起動するとしばらくして測位ができて座標が表示されました。GPSモジュール側でもLEDが1秒周期で明るく点滅するようになりました。さらに、中華AndroidのGoogle Mapsでも現在位置としては取得できたのですが、継続的にトラッキングしてはくれません(理由不明)。

    そこで、今度はLinuxMint13環境で動かしてみました。

    まずはwineとwine-geckoをインストールして、秋月のWebサイトに上がっているMiniGPS(GPSチップの製造元、MediaTekのソフトのようです)を動かしてみました。

    $ cd ~/.wine/dosdevices
    $ ln -s /dev/ttyUSB0 com1

    としてからMiniGPSをwineで実行します。実行したらCOM1を選択して9600bpsに設定。測位が完了すると無事にGPS衛星の掴み具合を表示してくれました。(なお、後述のgpsdをインストール後はCOMポートに接続できなくなりますので要注意)

    次にgpsdをsynapticでインストールしました。・・・が、これだけでは動いているんだかよくわかりません。せっかくGPSなのですから、マップ上に自分の場所を表示させてみたいものです。ググってみると、Vikingというのが定番みたいなので、Synapticでインストールしてみました。

    使い方がちょっとわからなかったのですが、ウインドウの左側がレイヤーになっているようなので、

    1. 左側の下の方の「+」ボタンを押して、「New Map Layer」でOpenStreetMap(MapQuest)を追加します。以下のダイアログが開くので、
      Screenshot-Layer-Properties-1「Autodownload maps」にチェックを入れてOKを押します。
    2. 次に、「New GPS Layer」でGPSを追加します。ダイアログで「GPSRealtime Tracking mode」を選択して、以下のように設定します。
      Screenshot-Layer Properties

    この状態だと現在位置はニューヨークのマンハッタンになっているのですが、追加したGPSを右クリックして「Start Realtime Tracking」を選択してしばらくすると、地図上に軌跡が描かれるようになりました。

    Screenshot-Untitled-Viking-1

    キャプチャ画面でもわかる通り、道路に沿って綺麗に軌跡を描いてくれます。

    ちなみにこのVikingですが、aitendoで購入したモジュールでも同じように動作しました。
    Linuxで動かすぶんにはPL-2303系のモジュールである必要はないと思うので、FT234Xのモジュールに変更して動かしてみようかと思います。


  • 64bit環境にMPLAB-Xをインストールする

    投稿日 2016年 2月 13日 コメントはありません

    故あって、Ubuntu17.1 MATE 64bit環境に16bitPICをターゲットとしてMPLAB-Xをインストールしました。

    ダウンロードしたMPLAB-Xのtarファイルを展開すると、シェルアーカイブがでてくるので、これをスーパーユーザー権限で実行しても、

    ~$ sudo ./MPLABX-v3.20-linux-installer.sh
    64 Bit, check libraries
    Check for 32 Bit libraries
    These 32 bit libraries were not found and are needed for MPLAB X to run:
    libexpat.so
    libX11.so
    libXext.so

    となって、32bitライブラリをインストールするよう要求されます。・・・が、ここで表示されているものを素直にapt-getでインストールしようとしてもダメなのです。

    じゃあ、どうしたらいいのかについては、こちらに記載があります。

    ~$ sudo apt-get install libc6:i386 libx11-6:i386 libxext6:i386 libstdc++6:i386 libexpat1:i386
    パッケージリストを読み込んでいます... 完了
    依存関係ツリーを作成しています                
    状態情報を読み取っています... 完了
    以下の特別パッケージがインストールされます:
      gcc-4.8-base:i386 gcc-4.9-base:i386 libgcc1:i386 libxau6:i386 libxcb1:i386
      libxdmcp6:i386
    提案パッケージ:
      glibc-doc:i386 locales:i386
    以下のパッケージが新たにインストールされます:
      gcc-4.8-base:i386 gcc-4.9-base:i386 libc6:i386 libexpat1:i386 libgcc1:i386
      libstdc++6:i386 libx11-6:i386 libxau6:i386 libxcb1:i386 libxdmcp6:i386
      libxext6:i386
    アップグレード: 0 個、新規インストール: 11 個、削除: 0 個、保留: 12 個。
    5,061 kB のアーカイブを取得する必要があります。
    この操作後に追加で 13.7 MB のディスク容量が消費されます。
    続行しますか? [Y/n] 
    (以下略)

    ということで、パッケージ名の後ろに「:i386」をつける必要があったようです。わかってしまえばなんと言うことはないのですが、わからないと困りますよねぇ・・・。

    ここをパスできれば、あとは再びシェルアーカイブを実行するとインストール完了です。併せて、XC16もダウンロードしたシェルアーカイブを実行してやると途中でライセンスファイル生成のためにNICのMACアドレスの確認ダイアログが出ますが、そのまま次へ進めてしまえばインストール完了です。


  • Raspbianにmoserialをインストール

    投稿日 2016年 1月 19日 コメントはありません

    なんだかんだで忙しくて、気づけば11月末から更新してないですね。

    それはそうと、忘れないようにメモです。

    Linux環境でシリアル通信をするものに対するテスト・デバッグではmoserialが便利だと思っているのですが、ポータブルな環境で扱おうと思ってRaspberry Pi2で動かすべく、Raspbianにインストールしてみました。

    RaspbianのSynapticで検索してもmoserialは出てこないので、ソースからコンパイルするしかなさそうです。

    まず、環境整備として、Synapticで

    • gnome-common
    • libglib2.0-dev
    • yelp-tools
    • libgtk-3-dev
    • valac

    (とその依存ファイル)をインストールします。順に、

    • gnome-autogen.shがない
    • glib-gettext >= 2.2.0が要る
    • yelp.m4がない
    • ‘gtk+-3.0’パッケージがない
    • valacコマンドがない

    の対策になります。パッケージをインストールしたら、

    $ git clone git://git.gnome.org/moserial
    $ cd moserial
    $ ./autogen.sh --prefix=/usr
    $ make
    $ sudo make install
    $ moserial

    でgitでソースコードを引っ張ってきて、コンパイル、インストール、実行になります。(実際には引っかかりながら必要なパッケージをインストールしていったのですが)

    Raspbian環境ではUARTはUSBに接続したいわゆるUSBシリアルしかでてこないようです。(ハードウェアピンにはなかったっけ?)

    もしmoserialをインストールする方がいて、その参考になれば、ということで残しておきます。


  • LinuxでコミュニティFMのストリーミング放送を聞く

    投稿日 2015年 9月 10日 コメントはありません

    ふとした事から、たくさんあるコミュニティFMが共同でストリーミングサービスを実施しているのに気づきました。

    こちらに放送局の一覧とクリックで聞けるリンクがあるのですが、Linux+Chromeブラウザでは残念ながらクリックしてもasfファイルを保存するかを問うダイアログがでるのみで、放送は聞けません。

    しかし、URLをクリップボードにコピーしてVLCに渡してやることで放送自体は聞くことができます。そのやり方をメモしておきます。

    Screenshot-16

    放送局の一覧から、聞きたい局を決めます。そして、その「音声を聞く」アイコン(赤丸部分)を右クリックして、「リンクアドレスをコピー」します。

    Screenshot-サイマルラジオ - Google Chrome

    リンクアドレスをクリップボードにコピーしたら、VLCメディアプレイヤーを開きます。

    Screenshot-VLCメディアプレイヤー

    URLを入力するダイアログが開くので、ここにクリップボードにコピーしたURLを貼り付けて「再生」を押します。

    Screenshot-URLを開く

    これで放送が聞けます。局によってはビデオストリーミングをやっているところもあるようで、その様子も同じ方法で見ることができます。


  • ESP8266を操作してみる

    投稿日 2015年 7月 10日 コメントはありません

    秋月のAE-UM232Rと三端子レギュレータを接続してブレッドボード上でESP8266を動かしてみました。使用したモジュールは手持ちのESP-12でプリント基板パターンアンテナを使用したFCC認証済みのモデルです。

    IMG_0413s

    接続回路図はHack a Dayの記事のままです。真ん中下がピッチ変換基板に載せたESP-12モジュール、左上がAE-UM232R、右上に3.3Vを生成する三端子レギュレータを配置しています。真ん中には電解コンデンサとフィルムコンデンサが付いているのですが、これは後述のとおりなかなか動作しなかったので、電源系の不安定さを疑って追加したものです。その右側にはF/W書き込みのためのスイッチもつけてあります。USBで接続する先のPCはLinuxMint17.1 MATE edition 64bit版です。

    USBケーブルを接続すると、ESP-12に搭載されている青いLEDが一瞬点滅します。購入直後であればこの状態でスマートフォンなどにWiFiの状態をみるツールを入れてやるとアクセスポイントとして見えます。

    次にPC側でターミナルプログラムとしてGtkTermを起動して、シリアルポートに/dev/ttyUSB0を選択し、通信速度を9600bpsに設定すると、入力した文字がエコーバックされるのがわかります。
    この状態ではATコマンドを受け付けるはずなので、

    AT[Enter]

    と入力してやると「OK」と返ってくるはずなのですが、返って来ません。
    グーグル先生に聞いてみると、電源不安定だと起きるのではないかとか、そんな話が見つかります。それで電解コンやらフィルムコンやら追加したりしたのですが、状況が変わる気配はありません。

    さらに調べてみると、「改行コードは”\r\n”でないと動作しない」という情報が出てきました。そこで、[Enter]の代わりにCTRL+M、CTRL+Jと入力したのですが動作しません。代わりに日本語入力モードになってしまいました。

    そこで、一時的にIBus+Anthyの動作を止めてやりATの後にCTRL+M、CTRL+Jと入力してやると無事にOKが返ってきました。同様にいくつかコマンドを打ってみました。

    AT+RST
    
    
    OK
    c_��RS��FjS�fJ[��
    [Vendor:www.ai-thinker.com Version:0.9.2.4]
    
    ready
    AT+GMR
    
    0018000902-AI03
    
    OK
    AT+CWLAP
    
    +CWLAP:(4,"aterm-xxxxxx-gw",-54,"xx:xx:xx:xx:xx:xx",10)
    +CWLAP:(4,"aterm-xxxxxx-g",-55,"xx:xx:xx:xx:xx:xx",10)
    
    OK

    というような感じで無事にアクセスができました。上記の例を見てもわかるとおり、アクセスポイントの検出もできていました。

    ※上記の動作確認は接続先のアクセスポイントを含め、シールドルーム内で実施しています。早く技適対応済みのモジュールが入手できるようになって欲しいものです。


  • 三項演算子の振る舞い

    投稿日 2015年 7月 7日 コメントはありません

    実は最近調子が悪く、療養中の身で最近記事をかけていません。(ESP8266関係も追っかけられていません)

    ただ、Webを彷徨っていたらこんな記事を見かけたので考えてみました。

    i%n==0?1:0
    ってどんな意味?

    との質問。演算子の優先順位から言って、((i%n)==0)?1:0 と等価で、iがnの倍数の時に1になる動きをするのでしょう。

    実際にいくつかの言語で試してみました。

    1.C言語

    #include <stdio.h>
    int main(int argc,char *argv[])
    {
    	int n=5;
    	for(int i=0;i<20;i++)
    		printf("%d %d\n",i,i%n==0?1:0);
    }

    となります。コンパイルと実行結果は、

    $ gcc foobar.c -o foobar -std=c99
    $ ./foobar 
    0 1
    1 0
    2 0
    3 0
    4 0
    5 1
    6 0
    7 0
    8 0
    9 0
    10 1
    11 0
    12 0
    13 0
    14 0
    15 1
    16 0
    17 0
    18 0
    19 0

    2.Java言語

    public class foobar {
    	public static void main(String[] args) {
    
    		int n=5;
    		for(int i=0;i<20;i++){
    			System.out.println(i+" "+(i%n==0?1:0) );
    		}
    	}
    }

    コンパイルと実行は、

    $ sudo apt-get install default-jdk
    $ javac foobar.java 
    $ java foobar 
    0 1
    1 0
    2 0
    3 0
    4 0
    5 1
    6 0
    7 0
    8 0
    9 0
    10 1
    11 0
    12 0
    13 0
    14 0
    15 1
    16 0
    17 0
    18 0
    19 0

    となります。

    3.JavaScript言語(Node.js 環境)

    n=5;
    for(i=0;i<20;i++){
    	console.log(i+" "+(i%n==0?1:0))
    }

    実行は、

    $ nodejs foobar-node.js
    0 1
    1 0
    2 0
    3 0
    4 0
    5 1
    6 0
    7 0
    8 0
    9 0
    10 1
    11 0
    12 0
    13 0
    14 0
    15 1
    16 0
    17 0
    18 0
    19 0

    4.JavaScript(ブラウザ環境)

    n=5;
    for(i=0;i<20;i++){
    	document.writeln(i+" "+(i%n==0?1:0)+"<BR>")
    }

    ブラウザでからのページを開いて、右クリックでJavaScriptコンソールを開いて、上記のプログラムをコピペしてリターンキーを押すと、結果がブラウザ側に表示されます。

    5.JavaScript(おまけ)

    サーバサイドで実行して、ブラウザで結果を見る場合です。

    var http = require('http');
    
    var n=0;
     
    var server = http.createServer();
    server.on('request', doRequest);
    server.listen(8000);
    console.log('Server running at http://127.0.0.1:8000/');
    
    function doRequest(req,res){
    	res.writeHead(200, {'Content-Type': 'text/plain'});
    	n=n+1
    	res.write("Try #"+n+"\n");
    	for(i=0;i<45;i++){
    		res.write(i+" "+(i%n==0?1:0)+"\n");
    	}
    	res.end('Completed\n');
    }

    これを foobar-server.js で保存して

    $ nodejs foobar-server.js

    で実行し、ブラウザで http://localhost:8000/ を表示すると結果が見れます。
    firefoxではリロード毎にちゃんとnが1ずつ増えていくのですが、Chromeだと1から始まって2ずつ増えていきます。理由はわかりませんが、リロードの前に無駄な読み込みでもしているんでしょうか。それとも?