ページ

2014年9月29日月曜日

Ruby 覚え書き 5

VC++からRubyを使う

VC++からRubyを使いたくて、あーだこーだやりつつやっとできたのでメモ。
環境 : VisualStudio 2010 Profeccional
           ruby-2.0.0-p576  ※dllやlibはコンパイル済み 忘れた場合はこちら


通常のコンソールアプリ同様、ruby_init()してruby_finalize()で終わるような処理を
書いてみる。

   CWinAppのInitInstance()メソッドの中で、
    1. ruby_init();
 
    2. メインダイアログの生成、表示
    3. ruby_finalize();

というシンプルな処理なのだが、いざ実行すると、













なんだか意味不明なエラーにorz
落ちている箇所はここ














vm->prognameがnullっぽい。
そんなの知らね~よと思っていたのですが、色々調べてやっと解決。
どうやらruby_init()の前にruby_sysinitをしてやらないとダメらしい。

    int         sysinit_argc = 0;
    char**      sysinit_argv = NULL;
    ruby_sysinit( &sysinit_argc, &sysinit_argv );
    ruby_init();

ダミーのパラメータで初期化してやって、やっと動きましたorz

















2014年9月27日土曜日

Galaxy S3 Root化

iphone6を購入したので、使わなくなったGalaxy S3をRoot化してみる


以下サイトを参考

http://www.ziko8jp.info/archives/23

簡単にできるかと思いきや意外に大変><
まず、Galaxyをダウングレードしないといけないらしい。。。

Obin3は以下サイトで
http://forum.xda-developers.com/showthread.php?t=1365805

一番苦労したのがLG1ダウングレードイメージファイル。
これがどこ探してもなかなか見つかりませんでした。
↓やっとみつけたサイト
http://www1.axfc.net/uploader/so/3206151


実際にダウングレードしてみたら・・・
起動してSAMSUNGのロゴ画面から先に進めないorz

色々探していたら、どうやらファクトリーリセットすれば良いらしい^^
http://www.androidpit.com/how-to-factory-reset-the-galaxy-s3
↑サイトを参考にファクトリーリセット。

1. 電源OFFの状態でヴォリューム↑ + ホームボタン + 電源ボタンを同時押し
2. 端末がブルッとしたら電源ボタンを離す
3. 画面に何か表示されたらボタンを離す

これで選択画面が出るのでwipe factory resetを選択。
すると晴れてダウングレードが完成^^

























これで晴れてRoot化を実行!!



















CWMをインストール。











































何かRoot化できたっぽい^^

2014年9月26日金曜日

Ruby 覚え書き 4

C/C++からRubyスクリプト呼び出し

WindowsのVisualStudioを使用してRubyスクリプトを呼び出してみる。
まずは、環境作成。

1. Rubyソースコードから必要な .lib .dll等を作成する。
      以下サイトからソースコードをダウンロード
      https://www.ruby-lang.org/ja/downloads/


2. VisualStudioのコマンドプロンプトツールを使用しコンパイル。
   























  当然ながら、x64のコマンドプロンプトツールを使うとx64用のlib, dllが作成される。
  先ほどダウンロードしたrubyソースコードのルートへ移動。
  1) ルートディレクトリから以下コマンドを実行。
     win32\config.bat

  2) 次に以下コマンドでコンパイル。
     nmake

  3) 無事コンパイルがしたらテスト実施.
     nmake test

  4) ここまでで、ディレクトリ配下に以下ファイルが作成される
    msvcr-100-rubyXXX.dll
    msvcr-100-rubyXXX.lib
    msvcr-100-rubyXXX-static.lib

 5) ルートディレクトリ\.ext\include\XXX-mswin32_100\ruby\config.hを
      ルートディレクトリ\include\ruby配下へコピーする。


3. 実際にVisualStudioでプロジェクトを作成
    コンパイルしてできた以下ファイルをプロジェクトに取り込む。
    ・ルートディレクトリ\include\配下
    ・ルートディレクトリ\msvcr-100-rubyXXX.dll
    ・ルートディレクトリ\msvcr-100-rubyXXX.lib
    ・ルートディレクトリ\msvcr-100-rubyXXX-static.lib

  以下簡単なテストプログラム

 
 















  実行結果


















とりあえずは実行できました。
以下参考サイト




2014年9月22日月曜日

JNIを使ってみる 2

CプログラムからJavaクラスの実行

CからJavaクラスを実行する為にはJavaVMを生成し実行してやらないといけないらしい

順序
  1. Java仮想マシンに渡すオプション値を生成
  2. Java仮想マシン生成
  3. 実行するクラスを検索後ロードする
  4. メソッドIDの取得
  5. メソッドに渡す引数があれば生成
  6. メソッド呼び出し
  7. Java仮想マシンの消滅

・呼び出されるJava側 InvocationApiTest.java
public class InvocationApiTest {
 public static void main(String[] args) {
  System.out.println(args[0]);
 }
}



・呼び出すC側 invocationApi.c
#include <jni.h>
int main() {

 JNIEnv *env;
 JavaVM *vm;
 JavaVMInitArgs vm_args;
 JavaVMOption options[1];
 jint res;
 jclass cls;
 jmethodID mid;
 jstring jstr;
 jclass stringClass;
 jobjectArray args;

 // 1. 仮想マシンに伝えるオプション値を生成
 options[0].optionString = "-Djava.class.path=.";
 vm_args.version = 0x00010002;
 vm_args.options = options;
 vm_args.nOptions = 1;
 vm_args.ignoreUnrecognized = JNI_TRUE;

 // 2. Java仮想マシン生成
 res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

 // 3. 実行するクラスを検索後ロードする
 cls = (*env)->FindClass(env, "InvocationApiTest");

 // 4. main()メソッドのメソッドID取得
 mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");

 // 5. Javaのmainクラスメソッド引数生成
 jstr = (*env)->NewStringUTF(env, "Hello Invocation API!!");
 stringClass = (*env)->FindClass(env, "java/lang/String");
 args = (*env)->NewObjectArray(env, 1, stringClass, jstr);

 // 6. main()メソッド呼び出し
 (*env)->CallStaticVoidMethod(env, cls, mid, args);

 // 7. Java仮想マシン消滅
 (*vm)->DestroyJavaVM(vm);
}



Javaファイルをclassファイルへコンパイル
  > javac InvocationApiTest.java

C側のコンパイル
Visual Studio Tool > Cross Tools コマンドプロンプトを起動
 > cl -I"<JDK_HOME>/include" -I"<JDK_HOME>/include/win32" invocationApi.c
        -link "<JDK_HOME>/lib/jvm.lib"

invocationApi.exeができあがるはず。
実行しようとするとエラーがっ ><












どうやら環境変数に"<JDK_HOME>/jre/bin/server"を追加しないといけないらしい。
設定していざ実行すると・・


















無事実行できました^^

2014年9月21日日曜日

Ruby 覚え書き 3

コードジェネレータをERBで作成したら便利だったのでメモ。

基本的な使い方
require 'erb'
str = "hoge"
erb = ERB.new("value = <%= str %>")
puts erb.result(binding)
出力結果
value = hoge
テンプレートが展開されると、空白改行が残ってしまうので
邪魔な場合はtrim_modeを使用。

詳しくはWEBで。。。


iphone6 購入!!

Galaxy S3には長い間お世話になったのでiphone6が出たタイミングで機種変しようと
思っていましたが、やっとその時が^^;



















iphone5sと比べてサイズが大きくなったので、どうかなと思っていましたが、
Galaxy S3を使っていた為かすんなり手に馴染みました^^

購入したのは、iphone6の64GB、色はスペースグレーです。
ヨドバシのクーポンが使えた為、一括で購入(といってもクレジット2回払い)。
長い目でみるとお安くなるのでまっいいか^^;

2014年9月20日土曜日

Arduinoと戯れる 7 - PWM -

PWMをお勉強

PWM(Pulse Width Modulation : パルス幅変調)とは・・・

  変調方法の一つ、パルス比のデューティー比を変化させて変調すること。

らしい。。デューティー比って何?
http://ja.wikipedia.org/wiki/デューティ比
う〜ん。きっと1秒間に何回HIGHとLOWを繰り返すかの割合だろう^^;

ArduinoのPWMに関しては、analogWrite関数で490Hz間隔で、HIGH/LOWを切り替えて電圧を変化させている。
例) analogWrite(pin, 0) => 常にLOW 0V
      analogWrite(pin, 51) => 20%の割合でHIGHになる 1V
      analogWrite(pin, 153) => 60%の割合でHIGHになる 3V
      analogWrite(pin, 255) => 常にHIGH 5V


PWM制御によるLED回路

analogWrite関数を使ってLEDを明るくしたり、暗くしたりしてみる。
※実際はLEDの明るさは流れる電流で決まるが、今回は可変抵抗が無いので、PWMで制御
LEDに取り付ける抵抗値(Ω)は

  LEDに取り付ける抵抗値(Ω) = (電源電圧 - LED規格電圧) / 定格電流

で求められるのだが、規格が分からなかったので、本の通り
(5V - 3.3V) / 0.02 = 85Ωとして、それ以上の抵抗値220Ωを使用して配線。




















analogWriteを使ってスケッチを作成。
























実行してみると、1秒毎に変化が見られました。

2014年9月17日水曜日

JNIを使ってみる 1

JNI・・・名前だけは良く聞くJNIを使ってみる

Javaと他の言語とのインターフェースという事なので、AndroidでJavaとCの連携を
実現しているのでJavaとCでやってみる。

・ 大まかな流れ
   1. Javaコードの作成
   2. Javaコードのコンパイル
   3. Cヘッダファイルの生成
   4. Cコードの作成
   5. 共有ライブラリの生成
   6. Javaプログラムの実行


まずはJavaコード
class HelloJNI {
 
  native void printHello();                        // C/C++で作成予定のメソッドを宣言  native void printString(String str);
 
  static {
    System.loadLibrary("hellojni");          // hellojni.dll(Windowsだと)のロード  }
 
  public static void main(String args[]) {
    HelloJNI myJNI = new HelloJNI();
    // ↓実際に使用
    myJNI.printHello();
    myJNI.printString("Hello from printString fun");
  }
}

これをコンパイル
>javac HelloJNI.java

※試しに現時点で実行すると・・・
>java HelloJNI
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hellojni in java.l
ibrary.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
        at java.lang.Runtime.loadLibrary0(Runtime.java:849)
        at java.lang.System.loadLibrary(System.java:1088)
        at HelloJNI.<clinit>(HelloJNI.java:7)
当然ながら怒られる。


次にCヘッダファイル生成。これは便利なツールを使用
>javah HelloJNI

↓ヘッダファイルが生成される
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     HelloJNI
 * Method:    printHello
 * Signature: ()V
 */

JNIEXPORT void JNICALL Java_HelloJNI_printHello
  (JNIEnv *, jobject);
/*
 * Class:     HelloJNI
 * Method:    printString
 * Signature: (Ljava/lang/String;)V
 */

JNIEXPORT void JNICALL Java_HelloJNI_printString
  (JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif

Cコードを作成
#include "HelloJNI.h"
#include <stdio.h>
/*
 * Class:     HelloJNI
 * Method:    printHello
 * Signature: ()V
 */

JNIEXPORT void JNICALL Java_HelloJNI_printHello
(JNIEnv *env, jobject obj) {
 printf("Hello World!\n");
 return;
}
/*
 * Class:     HelloJNI
 * Method:    printString
 * Signature: (Ljava/lang/String;)V
 */

JNIEXPORT void JNICALL Java_HelloJNI_printString
(JNIEnv *env, jobject obj, jstring string) {
 const char *str = (*env)->GetStringUTFChars(env, string, 0);
 printf("%s!\n", str);
 return;
}

 共有ライブラリの作成
Visual StudioのCross Toolコマンドプロンプトを使う

>cl -I"<JDK_HOME>\include" -I"
<JDK_HOME>\include\win32" -LD HelloJNI.c -Fehellojni.dll
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.
HelloJNI.c
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.
/dll
/implib:hellojni.lib
/out:hellojni.dll
HelloJNI.obj
   ライブラリ hellojni.lib とオブジェクト hellojni.exp を作成中


これでhellojni.dllが作成される。
いざ実行!!
>java HelloJNI
Hello World!
Hello from printString fun!

ちゃんと連携できました^^

2014年9月14日日曜日

AndroidStudioと戯れる 4 - 自作ライブラリ -

自作ライブラリを追加し使ってみる


1. 自作ライブラリの作成。
    プロジェクト右クリック > 新規 > Modelue














   AndroidLibraryを選択
















  SDKのバージョンを使う側と合わしておく。
  また、Create activityのチェックを外す。
















終了 > ライブラリが作成される。















2. 使う側
    使う側のプロジェクト(ここではsanji)のproject structureを開く


















  dependenciesタブを選択。「+」をクリックし「module dependency」を選択。
  作成したライブラリを選択。



















これでライブラリが使えるようになる。














ちゃんとライブラリで作成したクラスが使えてますな^^

AndroidStudioと戯れる 3 - 日本語化 -

AndroidStudio日本語化


以下サイトを参考に実施
http://androidstudio.hatenablog.com/entry/2014/07/20/170308

以下サイトからzipファイルをダウンロード
https://github.com/yuuna/IDEA_resources_jp















解凍して出てきた「resources_jp.jar」を「AndroidStuidio/lib」にコピー。















AndroidStuidoを起動してみる。















おおっ、ちゃんと日本語化できている^^

2014年9月9日火曜日

Ruby 覚え書き 2

each_with_indexとeach.with_index

配列の中身を順番に表示する際に使用したりするeach
インデックスも一緒に使いたい場合はeach_with_indexを使う。

が、

インデックスは必ず0から始まる。
これを1から始めたい場合は、+1しないといけない。


が、


with_indexというメソッドがあるらしい。。。。

list = [a,b,c]
list.each.with_index(1) { |val, index| puts "#{index}番目の値は#{val}です" } 

これで書くとインデックスが1から開始される!!。
便利。

参考サイト
http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/11/04/173513

2014年9月7日日曜日

GAEと戯れる 10 - サーブレット -

サーブレットに挑戦

JSPとサーブレットは同じらしい。。JSPで書いたものをサーバー側でサーブレットに変換し、HTMLを出力してくれる。。へえ〜^^;

フロントエンド・・・JSP
バックエンド・・・・サーブレット
で書くのがやりやすい。

サーブレットには大きく分けてVer3.0以前のものと移行のものがメジャー。
GAEは2,5のバージョンしか使えないorz

以下サイトを参考に簡単なサーブレットを書いてみる。
http://libro.tuyano.com/index3?id=892001&page=4














実行!!









ちゃんとできているっぽい。

重要なのは、doGetとdoPostメソッドで、
ContextType (html or plane text)や文字エンコードの設定等を行う必要がある。
という事らしい。

次は、フォームページとサーブレットとのやりとりを実装してみる。

form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Hello App Engine</title>
    <style>
    h1 {
        font-size: 16pt;
        background: #AAFFAA;
        padding: 5px;
    }
    </style>
</head>

<body>
    <h1>Hello App Engine!</h1>
    <p id="msg">※なにか書いて送信してください。</p>
    <form method="post" action="/mygaeapp">
    <table>
        <tr>
            <td>入力</td>
            <td><input type="text" id="input" name="text1"></td>
        </tr>
        <tr>
            <td></td>
            <td>
                <input type="submit" value="送信する">
            </td>
        </tr>
    </table>
    </form>
</body>

</html>

MyGaeAppServlet
/**
 * 
 */
package gae2014.hello;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author slowhand
 *
 */
public class MyGaeAppServlet extends HttpServlet {

/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}

/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf8");
req.setCharacterEncoding("utf8");
String param = req.getParameter("text1");
PrintWriter out = resp.getWriter();
        out.println("<html><head></head><body>");
        out.println("<h1>result</h1>");
        out.println("<p>you typed: " + param + ".</p>");
        out.println("</body></html>");
}

}

実行結果























できてますな〜^^