2016年9月26日月曜日

[Mac]brew updateしてもbrew doctorで警告がでる

$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: Your Homebrew is outdated.
You haven't updated for at least 24 hours. This is a long time in brewland!

To update Homebrew, run `brew update`.


brew update すればいいのね → 何回やってもbrew doctorで同じこと言われます。

/usr/local/Homebrew/README.md に
## Update Bug なるものが書いてありました。

$ cd "$(brew --repo)" && git fetch && git reset --hard origin/master && brew update

をやると無事、解決しました。

$ brew doctor
Your system is ready to brew.

---
OS X El Capitan(10.11.6)
iMac (21.5-inch, Late 2012)
---

2016年7月4日月曜日

[Android]android.os.FileUriExposedException

拙著「読書日記」で本の表紙をカメラで撮って、本を検索したり、保存したりする機能があります。
カメラ機能自体は自前では作らず他のアプリを利用しています。

ここに書き込んでくださいね というのを下記のメソッドでUriにして指定していたのですがandroid Nでは動かなくなりました。
android.net.Uri::fromFile(File)

Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/jp.torifuku.actionimagecapturesample/1467635903900.jpg exposed beyond app through ClipData.Item.getUri()
  at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
  at android.net.Uri.checkFileUriExposed(Uri.java:2346)

ここに議論がありますが、Issueではないそうです。

ファイル システムのパーミッションの変更 というものに該当するそうです。

どうすればいいかというと、概要は下記の通りです。
* android:name="android.support.v4.content.FileProvider"(provider)をAndroidManifest.xmlに追加
* android.support.v4.content.FileProvider::getUriForFile(Context, String, File)でFile -> Uriにする

Android Developersのガイドではここにあります。

今回作ったサンプルをGithubに公開しておきます。
(ポイントを絞って短いサンプルにするつもりが、Runtime Permissionsをやっているとそれなりの長さになってしまいました……)

ラムダ式つかいました。

2016年5月4日水曜日

[android]Secure connection is not supported on Java 6

・MacにAndroid Studio 2.1をインストールして使用していると「Secure connection is not supported on Java 6」というエラーに出くわしました
・Macの場合、IDE(Android Studio)はデフォルトでJava 6を使うようになっているようです

・答えは以下にありました
http://tools.android.com/tech-docs/configuration/osx-jdk
http://stackoverflow.com/questions/36529638/android-studio-cannot-use-secure-connection-for-update-complaining-the-use-of-j

・ターミナルで以下のコマンドを打つとIDEがJava 8を使うようになって、「Secure connection is not supported on Java 6」はでなくなりました

$ export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk
$ open /Applications/Android\ Studio.app

※JDKのインストール場所、バージョンは環境にあわせて読み替えてください。

・私は以下のスクリプト(ruby)で起動することにしました


#! /usr/bin/env ruby
INSTALL_DIR = '/Library/Java/JavaVirtualMachines'
LATEST_JDK = Dir::entries(INSTALL_DIR).select { |n| n =~ /^jdk/ }
              .sort_by { |n| n =~ /^jdk(\d+?)\.(\d+?).(\d+?)_(\d+?)\.jdk$/; Regexp.last_match.captures.map(&:to_i) }
              .reverse.first
p LATEST_JDK
EXPORT_STUDIO_JDK = "export STUDIO_JDK=#{INSTALL_DIR}/#{LATEST_JDK}"

`#{EXPORT_STUDIO_JDK}`
`#{'open /Applications/Android\ Studio.app'}`


・上のスクリプトをandroid_studio.rb で保存して chmod +x android_studio.rbしておいて

$ ./android_studio.rb
しています。

Enjoy android!

2015年9月19日土曜日

[Ruby]国勢調査パスワード

国勢調査インターネット回答やりましたか?

回答の最後に8文字以上32文字以内のパスワードを決めないといけないのですが、その際のパスワードをランダムに生成するRubyワンライナーです。


ruby -e "puts [*(0..9), *('a'..'z'), *('A'..'Z'), '#', '$', '-', '=', '?', '@', '[', ']', '_'].sample(32).join"


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
という環境でした。



2015年7月30日木曜日

[android]ストップウォッチアプリをつくりました

まつもと直伝 プログラミングのオキテ 第20回 MVCとRuby on Rails でMVCの説明の題材となっているRubyでかかれたストップウォッチのサンプルをandroidアプリとして書いてみました。

TORIFUKUKaiou/StopWatch

Enjoy!