拙作Androidアプリ「みょっくん(´ω`)」の公開停止

あなたとTLにやすらぎを -みょっくん(´ω`)-の記事で紹介しました拙作のAndroidアプリ「みょっくん(´ω`)」について、ソースコード紛失でサポートができなくなりましたので公開を停止します。
なお、アプリで使用しているTwitterAPIのConsumerKey等についても、具体的な停止日時は決まっていませんが少なくとも1〜2年以内には使用を停止する予定です。(停止するとみょっくんでツィートすることはできなくなります)
これまでみょっくんで楽しんでいただき、ありがとうございました。

SparkFun Blackberry Trackballer Breakout を触ってみた

久々に記述します(´ω`)Ramencozoです

スイッチサイエンスさんで買ったSparkFun Blackberry Trackballer Breakoutを触ってみたので備忘録。

SparkFun Blackberry Trackballer Breakout
安くていい感じのごろ寝マウスがもう売ってない&安いけどあんまりよくない感じのしか売ってない&いい感じのごろ寝マウスが高い、という3連撃のダメージを受け、かつSparkfunのTrackballerが気になっていたので買いました。

3.3V電源で上下左右方向の回転をホール素子で検出してLow/Highの電圧として出力、赤青緑白LED(フルカラー?)がボールの下に内蔵されています。

上から順に右回転、左回転、下回転、上回転の出力波形です。

ホール素子に向けられる磁石(回転軸についてる)の極性が変わるごとに出力電圧のLow/Highが変わっていることがわかります。

この出力をマイコンの入出力ピンで受けて、ピン変化割込みで回転検出と回転量を見ることで、マウスの座標移動開始のトリガと移動量として扱うことができます。


すでにごろ寝マウスプロトタイプバージョンが出来上がっていますがマイコンの実装とかソフトとかの紹介はめんどいので今度やります(やりません)⊂⌒~っ´ω`)っ以上です

PC版みょっくん出ましたヾ(´ω`)ノ

2016/11/06 追記:公開停止しました

2015/02/12 追記:いつのまにかdev.twitter.comじゃなくてapps.twitter.comになってますね…(´ω`)どうもPC版みょっくんでつぶやけなくなってるかもしんないので直したらまた追記します

どうも、Ramencozoです(´ω`)ノ

dotCloudさんとこでWebからみょっくん出してましたが、Freeユーザの使用権みたいなの無くなっちゃった(という風な連絡@dotCloudさんだったと思うのですが間違ってたらサーセン)という連絡を受けてお取り潰しになりました(_´ω`)_

しかしやっぱりAndroidで出してるみょっくん(本ブログの説明ページ)だけだとさみしいなということでとりあえず、PC版みょっくん出します(ノ´ω`)ノダウンロードはこちら公開停止しました


ReadMe.txtにも書いてますがとりあえずもろもろ説明。

【何するアプリ?】
デスクトップに置いておけるマスコットで、ダブルクリックすると表情(?)を一定秒数変えると同時に表情に合わせた顔文字をツィートするアプリです。
任意の文章をつぶやいたりTLを読んだりすることはできません。狙いはあくまでRamencozoの主観に基づく癒し効果の発現です。


【同梱ファイル一覧】
・Myokkunx86.jar - 実行ファイル本体です
・config - 設定ファイルです。消去されると動かなくなります。
・user.conf - 設定ファイルです。最初は存在しません。Twitter認証すると作成されます。作成後に消すと認証をやり直さないといけなくなります。
・ReadMe.txt - わたしです


【必須環境】
・メモリは多い時で40〜50MB食っちゃうみたいなのでご自身のPC内にて他で動いてる
 アプリとか環境とかに合わせてそれなりに(512MB〜2GBとか)適当にご用意ください

Javaの実行環境が必要ですが、ひらたく言えば、起動したらおkです。
 正確にはJava Runtime Environment(JRE) 1.6以上必須です。
 (起動しなくて困ってて何言ってるかわからない方はググるか、
  使用をおやめになることをおすすめします)
 1.5で動きません。1.6と1.7では動作を確認してます。AWTUtilities使ってるので
 OpenJDKだとダメらしいです。
[2013/07/01追記]
Ubuntu13.04でOpenJDK1.7.0_21だと動きました(´ω`)AWTUtilities使ってるからダメーって話を見かけたんですけど新しいのだとカバーされてるんですかね?

・動作確認が取れてるのは今のところ下記環境のみです。動かなかったらどんまいです。
- CPU : Core i3 2.93GHz
- メモリ: 6GB
- OS : Windows7 64bit,Ubuntu 13.04 64bit
- JDKOracle JDK 7u15,OpenJDK 1.7.0_21
- JRE : 6(1.6), 7(1.7)
Javaで書いてるアプリなのでJRE1.6〜が入っていればMacとかGUI環境付きLinuxとかでも動作すると思います(´ω`)

初めて使う場合、使い方は下記のとおり。

1. Myokkunx86.jar をダブルクリック、またはCUIなターミナルから「java -jar Myokkunx86.jar」で起動します。
 (起動しなくて困ってて何言ってるかわからない方はグg(ry

起動するとこんな感じの(´ω`)がデスクトップに表示されます。

2. 右クリック→「Twitter認証」をクリック

3. 開かれたダイアログの「PINコードを取得」をクリック

4. たぶんブラウザがTwitterの認証ページ開いてくれるのでユーザIDとパスワードを入力して、「連携アプリを認証」をクリック
 (ログイン済みならそのまま「連携アプリを認証」をクリック)

5. 7桁の数字が表示されるのでそれをコピーして、ダイアログの「PIN:」と書かれたテキストボックスに貼り付けて「認証」をクリック


6. 「認証に成功しました」と出たらおkです。他のメッセージが出た場合は 2. からやりなおしてみてください。

7. OKボタンを押すとダイアログも閉じます。あとはみょっくん(´ω`)自体をダブルクリックすると表情が変わってツィートされます。

8. 好きなだけダブルクリックして愛でてあげてください(´ω`)ノ


2回目以降に使う場合は、上記の

1. と 8. だけですぐ使えます。他のアカウントで認証したくなった場合は 2. からやりなおすとアカウントが切り替わります。

そんな感じです(´ω`)ノ あそんでみてくださいませ

JavaでOpenCVつついてSIFTとSURFしてみる

どうも、Ramencozoです(´ω`)ノ

ちょいと必要な場面があったのでOpenCVでSIFTとSURF使って2画像間の特徴点同士を結ぶってのをJavaでやってみました(´ω`)GitHubeclipseのプロジェクトageてます

HelloOpenCV - https://github.com/Ramencozo/HelloOpenCV

OpenCV.orgのDownloadsからOpenCVインストーラを取得して解凍しておきます。
解凍したフォルダの「opencv/build/java」をプロジェクトにコピーしてopencv-245.jarにクラスパスを通します。(GitHubにageたプロジェクトはもうクラスパス通ってると思います)

んでコード(´ω`)ノ こちらのサイト( OpenCV2でSIFT, SURFによる画像の対応付け )を写経させていただきました。

HelloOpenCV.java

import java.util.Calendar;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfDMatch;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.features2d.DMatch;
import org.opencv.features2d.DescriptorExtractor;
import org.opencv.features2d.DescriptorMatcher;
import org.opencv.features2d.FeatureDetector;
import org.opencv.features2d.Features2d;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;


public class HelloOpenCV {
  public static void main(String[] args) {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

    // 比較画像01
    Mat image01 = Highgui.imread("./resources/test01.jpg");

    // 比較画像02
    Mat image02 = Highgui.imread("./resources/test02.jpg");
    if (image01 == null || image02 == null) {
      System.out.println("ヌルポ('A`)");
      System.exit(0);
    }
    
    Mat grayImage01 = new Mat(image01.rows(), image01.cols(), image01.type());
    Imgproc.cvtColor(image01, grayImage01, Imgproc.COLOR_BGRA2GRAY);
    Core.normalize(grayImage01, grayImage01, 0, 255, Core.NORM_MINMAX);

    Mat  grayImage02 = new Mat(image02.rows(), image02.cols(), image02.type());
    Imgproc.cvtColor(image02, grayImage02, Imgproc.COLOR_BGRA2GRAY);
    Core.normalize(grayImage02, grayImage02, 0, 255, Core.NORM_MINMAX);
    
    // ------ SIFTの処理 ここから ------
    FeatureDetector siftDetector = FeatureDetector.create(FeatureDetector.SIFT);
    DescriptorExtractor siftExtractor = DescriptorExtractor.create(DescriptorExtractor.SIFT);
    
    MatOfKeyPoint keyPoint01 = new MatOfKeyPoint();
    siftDetector.detect(grayImage01, keyPoint01);

    MatOfKeyPoint keyPoint02 = new MatOfKeyPoint();
    siftDetector.detect(grayImage02, keyPoint02);

    Mat descripters01 = new Mat(image01.rows(), image01.cols(), image01.type());
    siftExtractor.compute(grayImage01, keyPoint01, descripters01);
    
    Mat descripters02 = new Mat(image02.rows(), image02.cols(), image02.type());
    siftExtractor.compute(grayImage02, keyPoint02, descripters02);
    
    MatOfDMatch matchs = new MatOfDMatch();
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
    matcher.match(descripters01, descripters02, matchs);
    
    // 上位50点以外の点を除去する
    int N = 50;
    DMatch[] tmp01 = matchs.toArray();
    DMatch[] tmp02 = new DMatch[N];
    for (int i=0; i<tmp02.length; i++) {
      tmp02[i] = tmp01[i];
    }
    matchs.fromArray(tmp02);
    
    int year = Calendar.getInstance().get(Calendar.YEAR);
    int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
    int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
    int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
    int minute = Calendar.getInstance().get(Calendar.MINUTE);
    int second = Calendar.getInstance().get(Calendar.SECOND);
    String now = year + "" + month + "" + day + "" + hour + "" + minute + "" + second;
    
    Mat matchedImage = new Mat(image01.rows(), image01.cols()*2, image01.type());
    Features2d.drawMatches(image01, keyPoint01, image02, keyPoint02, matchs, matchedImage);

    // 出力画像 at SIFT
    Highgui.imwrite("./resources/descriptedImageBySIFT-" + now + ".jpg", matchedImage);
    // ------ SIFTの処理 ここまで ------
    
    // ------ SURFの処理 ここから (SIFTの時に使ったオブジェクトをいくつか使い回し) ------
    FeatureDetector surfDetector = FeatureDetector.create(FeatureDetector.SURF);
    DescriptorExtractor surfExtractor = DescriptorExtractor.create(DescriptorExtractor.SURF);

    keyPoint01 = new MatOfKeyPoint();
    surfDetector.detect(grayImage01, keyPoint01);

    keyPoint02 = new MatOfKeyPoint();
    surfDetector.detect(grayImage02, keyPoint02);

    descripters01 = new Mat(image01.rows(), image01.cols(), image01.type());
    surfExtractor.compute(grayImage01, keyPoint01, descripters01);
    
    descripters02 = new Mat(image02.rows(), image02.cols(), image02.type());
    surfExtractor.compute(grayImage02, keyPoint02, descripters02);
    
    matchs = new MatOfDMatch();
    matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
    matcher.match(descripters01, descripters02, matchs);
    
    // 上位50点以外の点を除去する
    DMatch[] tmp03 = matchs.toArray();
    DMatch[] tmp04 = new DMatch[N];
    for (int i=0; i<tmp04.length; i++) {
      tmp04[i] = tmp03[i];
    }
    matchs.fromArray(tmp02);
        
    matchedImage = new Mat(image01.rows(), image01.cols()*2, image01.type());
    Features2d.drawMatches(image01, keyPoint01, image02, keyPoint02, matchs, matchedImage);

    // 出力画像 at SURF
    Highgui.imwrite("./resources/descriptedImageBySURF-" + now + ".jpg", matchedImage);

    // ------ SURFの処理 ここまで ------
  }
}

んで結果(´ω`)んー、いいのかなこれで

SIFTの実行結果

SURFの実行結果

なんかSURFの方が特徴っぽいところ多いですね(´ω`)←あんまりわかってない

Java製の形態素解析ライブラリ lucene-gosen 使ってみた

どうもRamencozoです(´ω`)ノ

もしかしたらなんかで使うかもしんないので下記のページを参考(写経)にgosenベースの形態素解析ライブラリ lucene-gosen 使ってみました(´ω`)

Java製形態素解析ライブラリ「lucene-gosen」を試してみる

下記リンクからGosenのJarをダウンロードしてクラスパスにつっこめばすぐ動くようです(´ω`)
こちらではとりあえず lucene-gosen-4.3.0.jar(本体) と lucene-gosen-4.3.0-ipadic.jar(辞書) の2つをダウンロードしてeclipseのプロジェクトに投げ入れました(ノ´ω`)ノ

Downloads - lucene-gosen

ソースコード完全写経ですがとりあえず(っ´ω`)っ

HelloMorphologicalAnalysis.java

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import net.java.sen.SenFactory;
import net.java.sen.StringTagger;
import net.java.sen.dictionary.Token;


public class HelloMorphologicalAnalysis {
 public static void main(String[] args) {
  try {
   StringTagger tagger = SenFactory.getStringTagger(null);
   List<Token> tokens = new ArrayList<Token>();
   tagger.analyze("こんにちは、ラーメンです", tokens);
   
   for (Token t : tokens) {
    System.out.println("----------------");
    System.out.println("Surface: " + t.getSurface());
    System.out.println("Cost: " + t.getCost());
    System.out.println("Length: " + t.getLength());
    System.out.println("Start: " + t.getStart());
    System.out.println("BasicForm: " + t.getMorpheme().getBasicForm());
    System.out.println("ConjugationalForm: " + t.getMorpheme().getConjugationalForm());
    System.out.println("ConjugationalType: " + t.getMorpheme().getConjugationalType());
    System.out.println("Part of Speech: " + t.getMorpheme().getPartOfSpeech());
    System.out.println("Pronuciations: " + t.getMorpheme().getPronunciations());
    System.out.println("Readings: " + t.getMorpheme().getReadings());
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

実行結果がこちら(´ω`)っ

----------------
Surface: こんにちは
Cost: 3270
Length: 5
Start: 0
BasicForm: *
ConjugationalForm: *
ConjugationalType: *
Part of Speech: 感動詞
Pronuciations: [コンニチワ]
Readings: [コンニチハ]
----------------
Surface: 、
Cost: 4056
Length: 1
Start: 5
BasicForm: *
ConjugationalForm: *
ConjugationalType: *
Part of Speech: 記号-読点
Pronuciations: [、]
Readings: [、]
----------------
Surface: ラーメン
Cost: 7698
Length: 4
Start: 6
BasicForm: *
ConjugationalForm: *
ConjugationalType: *
Part of Speech: 名詞-一般
Pronuciations: [ラーメン]
Readings: [ラーメン]
----------------
Surface: です
Cost: 9780
Length: 2
Start: 10
BasicForm: *
ConjugationalForm: 基本形
ConjugationalType: 特殊・デス
Part of Speech: 助動詞
Pronuciations: [デス]
Readings: [デス]

解析されてますねー(´ω`)んでこっからどう扱ったものかなと考えちうです

モバブが膨らんでた件

どうもRamencozoです(´ω`)

2週間前くらいにP○werBankのモバブを買ったんですね。Amazonにて。
でもって、2〜3回充放電させたかなーくらいの使い込みしてたんですが

パッと見、ふつうのモバブなんですけど、

ふくらんでました(つω⊂)アチャー

今日までの使用履歴は
・1週間前にとりえあずフル充電、3日後くらいに完全放電
・2〜3日前にフル充電、充電させっぱなしのままたぶん2時間くらい放置
・今日見るとふくらんでた(つω⊂)

てな感じなので過充電保護か過放電保護かのどっちかが悪いのかなと思ったりしてます
(´ω`)インガオホー

とりあえず爆裂四散しないようにコーセン=ギークギジツを活かしてカイシャクしました(ˇωˇ)


思ったよりスキマあるんだなーと思ったり(´ω`)


バッテリと回路、ケースをはがします(´ω`)っ


良い感じのパーツ取れそうな基板になってしまいました(ˇωˇ)ぐぬぬ


基板裏面です(´ω`)センターのボタンがモバブ起動のボタンです(でした)


単体になるとふくらんでるのかよくわかんない・・・(´ω`)でも確かにふくらんでた

(´ω`)さて・・・どうしようコレ

突然のFizzBuzz

どうもRamencozoです(´ω`)

某さまFizzBuzzヤッてたので現実逃避でヤッてみました(´ω`)っ微妙にショートコーディング気味なのはニワカの空気がプンプンしてるだけですカンベンしてください(^p^)

F.java / FizzBuzz

class F{
  public static void main(String[] args){
    for (int i=1; i<101; i++) {
      System.out.println(((i % 15) == 0 ? "FizzBuzz" : ((i % 3) == 0 ? "Fizz" : (i % 5) == 0 ? "Buzz" : "" + i)));
    }
  }
}

実行結果はこちら(´ω`)っまぁそれっぽいんじゃないスかね

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
(以後100まであるんで省略)