0

RubyScript2Exeで実行ファイルを作る

Rubyスクリプトをexeにできる。
試しにRuby本体もgemもアンインストールしてみたが動いたので、exe内にruby本体とrequireしたファイル全てが収まっているみたいだ。
少し古いけどRuby on Railsをexe化する記事もあったので、使い道があるんじゃないですかね。


RubyScript2Exe – A Ruby Compiler
から、rubyscript2exe.rb をダウンロードしてきてexe化したいrubyスクリプトと同じディレクトリに置く。

今回は試しにfeed-normalizer – 橋本詳解をexe化してみる。
引数で渡したURLのRSS/Atomフィードを表示する簡易Feedリーダー。引数なしではこのblogのfeedを読み込む。

rss.rb として保存(Windows用に出力文字コードだけshift_jisに変更した)

require 'rubygems'
require 'feed-normalizer'
require 'open-uri'
require 'cgi'
require 'kconv'
require 'pp'
uri = ARGV.shift || 'http://shokai.org/blog/feed/'

puts "parse #{uri}"
feed = FeedNormalizer::FeedNormalizer.parse open(uri)

puts "title: #{feed.title.tosjis}"
puts "(#{feed.entries.size}entries)"

#feed.clean!
feed.entries[0..3].each{ |e|
  puts e.url
  puts e.content.tosjis
  puts e.last_updated
  puts ''
}
#pp feed.entries[0]


■exe化
ruby rubyscript2exe.rb rss.rb
で、rss.exeが生成される。


Rubyそのものが格納されるのでファイルサイズがでっかい。puts ‘test’しただけのコードをexe化したら900kb超えた。
このrss.rbだと5個requireしているので1.5MBになった。

まあファイルサイズは大した問題でもないか

0

moxaサウンドボードできた

photo_3.jpg

0

バイオメタルボードできた

photo_2.jpg

PCからパワー制御できるし、単体でも動く

0

C# – UDP/IPでチャットアプリ

ちょっとUDPを使ってアプリを作る用事があるので、まずは.NETのSystem.Net.Sockets.UdpClientクラスでシンプルなテキストチャットを作ってみた。相手のIPアドレスとポートを指定してメッセージ(文字列)を送り、受信側はポートを開けてさえいればメッセージが読める。
UDPによりデータの送受信を行う: .NET Tips: C#, VB.NET, Visual Studioを参考にした。


学部の頃にインターネット概論という授業で、

  • コンジェスチョンコントロールがない
  • フローコントロールがない
とか習って、「ふーん」という感じだったけど。セッションを張らずに送信できて、受信するかは受信側の自由なんだな。


■ソースコード
shokai / C# UDP Sample / source — bitbucket.org
(VisualStudio2008pro C#で作成)


別ホスト(VMWare上のUbuntuでmonoで実行)とも通信できた
UDPの勉強



■UdpClientの使い方
まず必要な物読み込んで

using System.Net;
using System.Net.Sockets;


UdpClientオブジェクトを作ってportを開く。

UdpClient client = new UdpClient(6000); // 受信port
client.DontFragment = true;
client.EnableBroadcast = true;

これですでに受信できるようになっている。


相手のIPアドレスかホスト名とportを指定して、UTF8エンコードで送信

Encoding encoding = Encoding.UTF8;
byte[] sendBytes = encoding.GetBytes("送信する文字列");
client.Send(sendBytes, sendBytes.Length, "192.168.0.15", 6000);



受信バッファから読み出すと、文字列と受信元IPとportがわかる。

if (client.Available > 0)
{
  byte[] recvByte = client.Receive(ref remoteEP);
  Console.WriteLine("receive: " + encoding.GetString(recvByte) +
            " (form" + remoteEP.Address + ":" + remoteEP.Port+")");
}



最後にUdpClientを閉じるのを忘れないように

client.Close();


チャットアプリの実際の処理はUDPClientSampleForm.csに全部書いてある。受信を別スレッドにしてある。

0

moxaでバイオメタルを動かした

バイオメタルをmoxaで動かすために0V~3V程度を出せる回路とプログラムを作った。

色々試した結果、最終的にPCからシリアル通信でmoxaのanalogWrite(PWM出力)を制御できるようにして、analogWriteをトランジスタ(2SC1815)に突っ込む。トランジスタは三端子レギュレータ7805から得た5Vを出すが、トランジスタを通る事で3.7V程度に落ちて、バイオメタルにちょうど良い電圧になった。

バイオメタルは「3Vで駆動」と書いてあったけど3.7Vでも大丈夫だった。5Vそのまま入れると変な臭いがしてきてヤバイ(すぐ止めました)

AVRマイコンのGPIO出力は3Vだけど40mAと電流が足りなかった。
バイオメタルを動かすには200mA程度必要で、秋月の3.3Vの三端子レギュレータを使っても動いたけどマイコンから制御するためにトランジスタをかますと2V程度に落ちてしまうので5V電源でやったらちょうど良くなった。アクチュエータ系は試行錯誤が必要だなー



パソコンでアナログ値を制御している動画


回路。基盤で隠れて見えないけど、moxaの左下のGNDはブレッドボードのGNDと接続されている
moxaでバイオメタル動かす
moxaでバイオメタル動かす


今回のtalkticコード
xtel technical information > learning> Analog Read & Writeを参考にした

serialInit(9600);
pinMode(1,true);
pinMode(0,true);
power = 0.0;

function onSerialReceive(){ // シリアル受信イベント
    while(serialAvailable()){ // 受信データがある時
        var recvData = serialRead(); // 読み出し
        power = recvData*0.01;
        analogWrite(0, power);
        analogWrite(1, power)
        serialSend(recvData); // 受信した文字列をそのままエコーする
    }
}

while(true){
}