2015年8月27日木曜日

[Ruby]Fizz Buzz

Fizz Buzzを小難しく書いてみました。
ルールが変わったら、@rule_pairsの初期値を変えればよいはず。
[[:fizz, 3], [:buzz, 5] , [:torifuku, 10] ]とか。

module FizBuzz
  class << self
    private
    def rule_pairs
      @rule_pairs ||= [[:fizz, 3], [:buzz, 5]].map(&:freeze).freeze
    end
  end

  method_names = rule_pairs.map(&:first).map(&:freeze).freeze
  define_method(:say) do
    value = method_names.map{|name| lambda{__send__ name}}.inject('') do |result, proc|
      result + proc.()
    end
    value.empty? ? self : value
  end

  private
  rule_pairs.each do |sym, n|
    define_method("#{sym}?") do
      self % n == 0
    end

    define_method(sym) do
      __send__("#{sym}?") ? sym.to_s.capitalize : ''
    end
  end
end

class Integer
  include FizBuzz
end

p (1..100).map(&:say)
p FizBuzz.private_methods.grep /rule_pairs/ # => [:rule_pairs]
p FizBuzz.public_instance_methods.grep /say/ # => [:say]
p FizBuzz.private_instance_methods.grep /[fi|bu]zz/ # => [:fizz?, :fizz, :buzz?, :buzz]

以下のようなメソッドを定義しています。
p FizBuzz.private_methods.grep /rule_pairs/ # => [:rule_pairs]
p FizBuzz.public_instance_methods.grep /say/ # => [:say]
p FizBuzz.private_instance_methods.grep /[fi|bu]zz/ # => [:fizz?, :fizz, :buzz?, :buzz]

2015年8月22日土曜日

[Raspberry Pi][android]adb(Android Debug Bridge)を作る

SDK Tools Onlyからダウンロードしたadbはそのままでは使えませんでした。
ARM用のコンパイルしたadbが必要なようです。

いろいろ調べると結局Adb for Raspberry piにいきつくようです。
Thanks a lot!

ちょっと古いソース(2014年/9月ころ)を使うことになりますが、adbがビルドできましたのでメモを残しておきます。
http://forum.xda-developers.com/showthread.php?t=1924492&page=7の#70そのままです。

Rasbian(LXTerminal)上で作業を行います。

$ sudo apt-get update
$ sudo apt-get install git build-essential libncurses5-dev libssl-dev
$ mkdir aosp
$ cd aosp
$ git clone https://android.googlesource.com/platform/system/core.git system/core
$ git clone https://android.googlesource.com/platform/external/zlib.git external/zlib

あとで作成するMakefileが使えるようにあるコミットIDをチェックアウトします。
$ cd system/core
$ git checkout -b topic 32e2f1be039482762303378113c817ba99466953
$ cd ../../
$ cd external/zlib
$ git checkout -b topic 8d977782c1cfe9d75cc9a464439c2ff1e27e1665

system/core/adb/Makefile を作ります。

SRCS+= adb.c
SRCS+= adb_client.c
SRCS+= commandline.c
SRCS+= console.c
SRCS+= file_sync_client.c
SRCS+= fdevent.c
SRCS+= get_my_path_linux.c
SRCS+= services.c
SRCS+= sockets.c
SRCS+= transport.c
SRCS+= transport_local.c
SRCS+= transport_usb.c
SRCS+= usb_linux.c
SRCS+= usb_vendors.c
SRCS+= adb_auth_host.c

VPATH+= ../libcutils
SRCS+= socket_inaddr_any_server.c
SRCS+= socket_local_client.c
SRCS+= socket_local_server.c
SRCS+= socket_loopback_client.c
SRCS+= socket_loopback_server.c
SRCS+= socket_network_client.c
SRCS+= load_file.c

VPATH+= ../libzipfile
SRCS+= centraldir.c
SRCS+= zipfile.c

VPATH+= ../../../external/zlib/src
SRCS+= adler32.c
SRCS+= compress.c
SRCS+= crc32.c
SRCS+= deflate.c
SRCS+= infback.c
SRCS+= inffast.c
SRCS+= inflate.c
SRCS+= inftrees.c
SRCS+= trees.c
SRCS+= uncompr.c
SRCS+= zutil.c

CPPFLAGS+= -DADB_HOST=1
CPPFLAGS+= -DHAVE_FORKEXEC=1
CPPFLAGS+= -DHAVE_SYMLINKS
CPPFLAGS+= -DHAVE_TERMIO_H
CPPFLAGS+= -DHAVE_OFF64_T
CPPFLAGS+= -D_GNU_SOURCE
CPPFLAGS+= -D_XOPEN_SOURCE
CPPFLAGS+= -DWORKAROUND_BUG6558362
CPPFLAGS+= -I.
CPPFLAGS+= -I../include
CPPFLAGS+= -I../../../external/zlib

CFLAGS+= -O2 -g -Wall -Wno-unused-parameter
#LDFLAGS= -static
LIBS= -lrt -lpthread -lcrypto -lssl

TOOLCHAIN=
CC= $(TOOLCHAIN)gcc
LD= $(TOOLCHAIN)gcc

OBJS= $(SRCS:.c=.o)

all: adb

adb: $(OBJS)
  $(LD) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

clean:
  rm -rf $(OBJS)

最後の4行くらいの
「$(LD) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)」と「rm -rf $(OBJS)」の前はタブです。
Makefileを作ったら、

$ cd system/core/adb
$ make adb
-> adbができています!


$ sudo ./adb kill-server
$ sudo ./adb start-server
$ ./adb devices


$ uname -a
Linux raspberrypi 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l GNU/Linux
という環境でした。