2013年8月11日日曜日

JavaのJsonライブラリ


速くて、変換も簡単という噂のJsonを扱うライブラリだそうです!
その名もJackson!!

http://wiki.fasterxml.com/JacksonDownload

2013年8月10日土曜日

ActionBarSherlockが便利なん!

ActionBarSherlockが便利です!
ActionBarSherlockてのは古いOSでも4.0とかみたいなActionBarありのUI作れてしまうの!
作者さんに感謝過ぎます。


↓のActionBarの部分はSherlockです!



2013年4月16日火曜日

ボイスレコーダー公開しました!

「Chiee! 音声レコーダー」をGoolePlayで公開しました!

新しくボイスレコーダを作りました。Androidアプリです。
Androidのボイスレコーダの定番を目指したい(>_<) (←あくまで願望


当然、録音できます。
加えて、再生速度変えたり、逆再生できます。
使えるサンプリングレートは端末に依存するでしょう。

とりあえず、プロトタイプって感じですね。

まだ機能少ないですし。。。
地道に機能増やしてきます。

お歌の練習とか、会議の録音とか。
逆再生で逆さ言葉の実験したり、いろいろ使えるかと。

それと、ごめんなさい。
いろいろ、ごにょごにょしてるうちに、
デザインがごちゃごちゃしてきちゃいました!!!

どうしましょうか!


 


プログラミング的なことをいうと、録音はAudioRecord、再生はAudioTrackを使用して、
PCM的なことしてます。
なので保存ファイルはwavです。



2013年4月5日金曜日

試作ボイスレコーダー

あまりネタが思いつかないから、
とりあえず、もうすぐアップロード予定のAndroidのボイスレコーダアプリを紹介!




な!な!な!なんと、録音した音声は逆再生したり倍速再生できちゃいます!
画像は作ってる途中のものだから、公開するときには変わってるかも。


2013年4月3日水曜日

Googleのエイプリルフール








いろいろ冗談が過ぎますw
本気でPVとかも作ってる。

冗談という意味ではNoseがおもしろかったですw

2013年3月30日土曜日

SurfaceViewが何故か無駄に遅い

SurfaceViewが何故か無駄に遅い!

どういうこと!?

速いものだと思い込んでたんだけど・・・

invalidateで来たonDraw内でdrawLinesで描画してると1msもかからない。
だけど、独自スレッド内でlockCanvasしたCanvasでdrawLinesやると500msかかってる・・・・!!

ん!?どういうことなの!?

TextureViewでもやってみたけど同じ感じ。
GalaxyNexusのせいだと思ってジンジャーブレッド端末でもやってみたが同じ。

本当にどういうことなの!?

解決したら、また追記しよう・・・。

ぜんぜん解決への道がみつからないのだけどね・・・。


2013年3月28日木曜日

Google翻訳がオフラインに。

Android Google 翻訳 2.6 アップデート
• オフライン言語パック(Android2.3以降で使用可)を使用してネットワークに接続せずに翻訳します。
• カメラを使用して中国語、日本語、韓国語の縦書きテキストを翻訳します。

・・・ということで、
ネットレスな場で使えてしまう!
海外で大活躍ではないか!

ワクワクしながら言語パックインストールしてみて、ネットワーク切って、翻訳してみた!しっかりと翻訳してくれました!

縦書きも読み取ってくれた!







オフラインで使うには言語パックをインストールします!
[メニュー]→[オフラインの言語]

   

インストール完了!



これでオフラインで翻訳できてしまいます!

素晴らしすぎます。

ちなみに見てのとおり100MBとかそういう大きさなので。
1つ3分くらいかかるかな?

2013年3月27日水曜日

JellyBeanの連打のアレ


Android毎度のバージョン毎のあのAndroidチームのお遊び心♪

[設定]→[端末情報]→[Androidバージョン]

でAndroidのバージョンを連打!連打!連打!

 

すると、Jelly Beanのアイコンがでます!
ジンジャーブレッドは風刺な感じでしたが、
JellyBeanは、かわいらしいなにか!(ゼリービーンのお菓子に顔)


 

さらに長押ししてみると・・・

 

ソラマメ型の砂糖菓子があちこち飛び回ります!動きます!飛び回ります!

さらにいろんな方向に投げられますw

顔のついたJellyBeanのアイコンや違うお菓子も紛れている!




ちなみに、横画面にも対応w

試しに全部のお菓子を画面外に投げてみましたが、
また次々と復活してきて、何も起こりませんでした。

(そんなことで遊んでるなよ!ってツッコミはどうぞ入れてくださいw)

気づいてないだけで、またオマケ機能があったりして。


こういうGoogleプログラマさんの遊び心は好きです。




2013年3月26日火曜日

JellyBeanの暗黙的Intent

Jelly Beanでは、暗黙的Intentのアクティビティの表示はグリッド表示になってますね。

今まではリスト表示だったから、いきなりだと違和感だよね。
でも、スクロールの距離が短くなるからこっちのほうが視認性がよいのかな?

「常にこのアプリを使用する」的なチェックボックスは「常時」ってボタンに。
アプリを選択して起動するときは「1回のみ」ってボタン。

なんか「1回のみ」っていう日本語訳が気に入ってない私。

「今回のみ」とか「起動」とかのほうがいいですね。


 

2013年3月22日金曜日

uses-permissionとuses-featureに気をつけよ!

<uses-permission>と<uses-feature>に気をつけよ!

なぜかって言うと、<uses-feature>って、勝手に付与される場合があるからです!

例えばBluetooth使いたいから以下のパーミッションつけるとすると、



<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />


↓が自動的に付与されます!


<uses-feature android:name="android.hardware.bluetooth"/>


Bluetoothを使いますよー!Bluetooth使えない端末は門前払いします!
ってな感じ。

Bluetoothを使う前提のアプリならいいけど、Bluetooth使える場合だけ使いたいです!ってときには困っちゃいます。

なので、Bluetoothは必ずは必要としませんよー!って書いてあげましょう。


<uses-feature android:name="android.hardware.bluetooth" android:required="false" />


そうしないと、意味もなく使えない端末がでてきてしまう。。





久しぶりにAndroidでOpenCV使おうと思ったのだが・・・

久しぶりにAndroidでOpenCV使おうと思ったのだが・・・ 
適当に.jarファイルをビルドパスにいれたり、
Javaのビルドパスにプロジェクトいれたりして、 何で動かないんだ???って。



 E/AndroidRuntime(4306): java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.highgui.Highgui.imread_1:(Ljava/lang/String;)J


 E/AndroidRuntime(5154): java.lang.NoClassDefFoundError: org.opencv.highgui.Highgui


やり方が違うのを忘れてました。


設定はこっちでしたね。

[プロジェクトのプロパティ]→[Android]→[ライブラリー]→[追加]

ライブラリーって項目が下のほうに隠れてるので、見落とし。

よかったよかった。。。


まぁ、これこれで忘れてだけだし、動いたからいいのだが、
バージョンアップしてたOpenCV使う落としたら、


 E/AndroidRuntime(8230): java.lang.ExceptionInInitializerError

 E/AndroidRuntime(11556): java.lang.NoClassDefFoundError: org.opencv.android.OpenCVLoader


なにやら初期化が必要なようで、
OpenCVLoaderの初期化するやつをサンプルみて加えたけど、

それでも動かないよ・・・。
GooglePlayのOpenCVMnagerも入れてるよ。。。


仕方ないので、バージョン2.4.3は保留で2.4.1を組み込んでみてる。

なんで動かないんでしょうね。エラー吐かないで急に落ちるんだけど・・・。

まぁ、後で解決します。

2013年3月13日水曜日

縦スクロールバーさんをどかしましょう。

SyntaxHighlighterで縦スクロールバーの必要性がないと思った。
とういうわけで、消しましょうか。


 <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
 <link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeEclipse.css' rel='stylesheet' type='text/css'/>
 <style>
 <!--
  .syntaxhighlighter {
    overflow-y: hidden !important;
    padding: 1px !important;
  }
 -->
 </style>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
 <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
 <script language='javascript' type='text/javascript'>
  SyntaxHighlighter.config.bloggerMode = true;
  SyntaxHighlighter.all();
 </script>

ミニブラウザでyoutube見ると画面真っ暗?

前書いたやつの転載。


ICSでミニブラウザ使って、
Youtube見に行くと






てな感じで真っ暗で音だけ聞こえるみたいで、残念な感じになってしまう。。。
ぐはぁ。

GBのときと違ってWebView内で動画再生しようとしてるみたいです。

そんなときは、↓



赤丸のフルスクリーンボタン?みたいのを押していただけると、
動画をフローティングさせますよ!!









Chiee!ミニブラウザ


Androidのアニメーション。くるくるっと。

Androidのアニメーション。


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="top">
        
    <translate 
        android:fromXDelta="0%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="50%"
        android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
        android:startOffset="0" android:duration="100"
        />    
         
    <scale android:fromXScale="1.0" android:toXScale="0.0"
            android:fromYScale="1.0" android:toYScale="0.0"
            android:pivotX="50%" android:pivotY="50%"
            android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
            android:startOffset="100"
            android:duration="1000" />
    
    <alpha android:fromAlpha="1.0" android:toAlpha="0.5"
            android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
            android:startOffset="100"
            android:duration="1000"/>

    <rotate 
        android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
        android:fromDegrees="0" android:toDegrees="720"
        android:pivotX="50%" android:pivotY="50%" 
        android:startOffset="100" android:duration="1000"
        />   
        
</set>

BluetoothChatを使ってみましょうか!

AndroidのBluetoothAPIの使い方のサンプルコードであるBluetoothChat。


初期画面

メニューボタンを押すと。
ペアリングしてない場合、ペアリングする必要あがる!
まず一番下のメニューを押すと自分が検索してもらう状態になる。

ここではいを押すと検索してもらえる。

相手側では1番目か2番目のメニューで相手を探します!

無事接続できれば、メッセージ交換できるよ!

メッセージ入力

相手から送られてきた!

相手側も同様

ペアリングは標準の設定アプリのBluetoothの箇所でもできます。


AndroidでのBluetooth通信では、まずペアリングを明示的にユーザに操作してもらって行う必要があります。
バックグランドで自動でペアリングとかは仕様上は無理なので、すれ違い通信とかを行うことは難しいですね。
ペアリングさえすればバックグランドで接続できます。

ペアリングを行うところもアプリに含まれてたけど、設定あぷりでもできるので、自分で作るのは面倒なときは設定アプリがあるから省略して大丈夫ですね。

BluetoothChatのサンプルコードが若干雑なつくりのような?
問題なく動いてるけど、いろいろ問題があるきがするのだが・・・・。
まぁサンプルだから、これにそんなに時間をかけられなかったのかな。
きっと忙しいでしょしね。あるだけ感謝しなくてはね。

というわけで、Bluetooth




2013年2月11日月曜日

rel="nofollow"って何?


HTMLでのリンクタグの<a>の属性で、
GoogleやYahooなどの検索エンジンでリンクタグの属性に「rel=nofollow」がついているものは、SEOてきなものには関係ない、追跡しない、そうです。
<a href="http://google.com/" rel="nofollow">

ソースコードを華麗に載せましょうか。(Syntax Highlighter)

さて、無事Syntax Highlighterを使ってソースコードを綺麗に載せられました!

ということで、そのSyntax Highlighterの導入方法をご紹介。

How to Add Syntax Highlighter(v3) to Blogger Blogs

こちらのSyntax Highlighterの導入タグを生成してくれる
Syntax Highlighter Scripts Generator
を使います!



  1. Syntax Highlighter Scripts Generatorにアクセス。
  2. Select a Themeでテーマを選択(ご自由に)
  3. Select Brushesで使用するプログラミング言語もしくはスクリプト言語を選択
  4. Generateボタンを押す
  5. 生成されたソースをコピー
  6. BloggerのHTML編集に行って、headタグ内の最後辺りにでも貼り付け

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeEclipse.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushScala.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script language="javascript" type="text/javascript">
 SyntaxHighlighter.config.bloggerMode = true;
 SyntaxHighlighter.all();
</script>


ここまでで準備OK!

そしたら、あとは

<pre class='brush:[brushname];'>

  <!--ここに載せたいソースコード-->

</pre>


具体的には

<pre class='brush: java;'>

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}   

</pre>


結果、こうなる!

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}   

JavaScriptのファイルの参照先が外部リンクだから、
 もしかしたら勝手にサイトが変えられてしまう!?
...なんてことも可能性があるが、そんなこといったてしょうがないですねw
使わせてもらってるので感謝です。


Syntax Highlighterが使用可能かテストです!

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class STActivity extends FragmentActivity {

 /**
  * The {@link android.support.v4.view.PagerAdapter} that will provide
  * fragments for each of the sections. We use a
  * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
  * will keep every loaded fragment in memory. If this becomes too memory
  * intensive, it may be best to switch to a
  * {@link android.support.v4.app.FragmentStatePagerAdapter}.
  */
 SectionsPagerAdapter mSectionsPagerAdapter;

 /**
  * The {@link ViewPager} that will host the section contents.
  */
 ViewPager mViewPager;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_st);

  // Create the adapter that will return a fragment for each of the three
  // primary sections of the app.
  mSectionsPagerAdapter = new SectionsPagerAdapter(
    getSupportFragmentManager());

  // Set up the ViewPager with the sections adapter.
  mViewPager = (ViewPager) findViewById(R.id.pager);
  mViewPager.setAdapter(mSectionsPagerAdapter);

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_st, menu);
  return true;
 }

 /**
  * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
  * one of the sections/tabs/pages.
  */
 public class SectionsPagerAdapter extends FragmentPagerAdapter {

  public SectionsPagerAdapter(FragmentManager fm) {
   super(fm);
  }

  @Override
  public Fragment getItem(int position) {
   // getItem is called to instantiate the fragment for the given page.
   // Return a DummySectionFragment (defined as a static inner class
   // below) with the page number as its lone argument.
   Fragment fragment = new DummySectionFragment();
   Bundle args = new Bundle();
   args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
   fragment.setArguments(args);
   return fragment;
  }

  @Override
  public int getCount() {
   // Show 3 total pages.
   return 3;
  }

  @Override
  public CharSequence getPageTitle(int position) {
   switch (position) {
   case 0:
    return getString(R.string.title_section1).toUpperCase();
   case 1:
    return getString(R.string.title_section2).toUpperCase();
   case 2:
    return getString(R.string.title_section3).toUpperCase();
   }
   return null;
  }
 }

 /**
  * A dummy fragment representing a section of the app, but that simply
  * displays dummy text.
  */
 public static class DummySectionFragment extends Fragment {
  /**
   * The fragment argument representing the section number for this
   * fragment.
   */
  public static final String ARG_SECTION_NUMBER = "section_number";

  public DummySectionFragment() {
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
   // Create a new TextView and set its text to the fragment's section
   // number argument value.
   TextView textView = new TextView(getActivity());
   textView.setGravity(Gravity.CENTER);
   textView.setText(Integer.toString(getArguments().getInt(
     ARG_SECTION_NUMBER)));
   return textView;
  }
 }

}

良いですね!
無事表示されました!

2013年2月4日月曜日

AudioTrackメモメモ2

AudioTrackの使い方備忘録その2


サンプリング周波数決めるときに適当に決めるのもなんなので、

AudioTrack.getNativeOutputSampleRate(streamType);
を使ったらよさげな値を得られる!

Galaxy Nexusでやったら、44100が返ってきた!

AudioTrackメモメモ1

AudioTrackの使い方備忘録その1

まずAudioTrackっていうのは、AndroidでPCMのように音を発生させたいときに使うクラス。


自分のソースそのままコピペしただけだから、分かりにくいと思うが下記のように作成。

        //AudioTrackオブジェクトの作成
        mAudioTrack = new AudioTrack(
                streamType,                   //streamType
                mSampleRate,              //サンプリング周波数
                channel,         //モノラルとか
                encoding,            //audioFormat
                mSampleRate*2,     //バッファサイズ(バイト単位)
                AudioTrack.MODE_STREAM);          //static or stream


streamTypeは、AudioManager.STREAM_MUSICとか。
この場合、音楽用。

encodingは、AudioFormat.ENCODING_PCM_16BITとか。
この場合、shortを使うということ。

channelは、 AudioFormat.CHANNEL_OUT_MONOとか。
これはモノラル。

バッファサイズはwriteした時の貯めておけるメモリサイズ。
ちなみに、バイト数で指定。
私は1秒分を指定したのでサンプル数を×2した。




2013年1月30日水曜日

Blogger初投稿

Googleファンとしては、
Bloggerを使わなければ!

ということで、fc2から引越ししようかな。
長らくfc2さんありがとう!

では、Blogger初投稿です。