2016年12月24日土曜日

Ad Block! 広告を非表示にする方法

最近インターネット広告が氾濫していて、静かにコンテンツを見たいのに広告に目が入ってしまい注意がそがれてしまう事とかないでしょうか。

そんなときに活躍するのがHosts設定

メモ帳で管理者権限で開き、

c:\windows\system32\driver\etc\hosts

ファイルを開く。



127.0.0.1 a.t.webtracker.jp
127.0.0.1 click.linksynergy.com
127.0.0.1 googleads.g.doubleclick.net
127.0.0.1 d.adroll.com
127.0.0.1 googleadservices.com
127.0.0.1 www.googleadservices.com
127.0.0.1 cat.jp.as.criteo.com
127.0.0.1 ard.yahoo.co.jp
127.0.0.1 rd.ane.yahoo.co.jp
127.0.0.1 googleleads.g.doubleclick.net
127.0.0.1 tpc.googlesyndication.com
127.0.0.1 ad.maist.jp
127.0.0.1 spnet2-1.i-mobile.co.jp
127.0.0.1 spcdnpc.i-mobile.co.jp
127.0.0.1 adn-i.sp.gmossp-sp.jp
127.0.0.1 sp.gmossp-sp.jp
127.0.0.1 a248.e.akamai.net
127.0.0.1 tpc.googlesyndication.com
127.0.0.1 cre.adjust-net.jp
127.0.0.1 securepubads.g.doubleclick.net
127.0.0.1 www.google-analytics.com
127.0.0.1 www.googletagservices.com
127.0.0.1 cs.nakanohito.jp
127.0.0.1 c01.nakanohito.jp
127.0.0.1 pet-happy.jp
127.0.0.1 beacon.watch.impress.co.jp
127.0.0.1 i.yimg.jp
127.0.0.1 ai.yimg.jp
127.0.0.1 ad.jp.ap.valuecommerce.com
127.0.0.1 ad.linksynergy.com
127.0.0.1 rcm-fe.amazon-adsystem.com
127.0.0.1 fls-fe.amazon-adsystem.com
127.0.0.1 static.douleclick.net
127.0.0.1 ads.nicovideo.jp
127.0.0.1 spdeliver.i-mobile.co.jp
127.0.0.1 ichiba.nicovideo.jp



こんな具合にブロックしたいサイトを127.0.0.1に指定して保存。

これで広告ブロックになります。

これら広告URLはどうやって調べればいいの?という疑問には、Chromeブラウザを使います。

いつも見てるサイトを開き、F12ボタンを押します。

右側にウィンドウが開き、Sourceタブを開きます。

そのサイトで外部サイトに接続しているURL一覧が表示されていて、
消したい広告画像が入っているURLを探し出して先ほどのHostsに追加するだけ!


これでミッションコンプリートです。

もしYahoo知恵袋のレイアウトが崩れていやな方は
i.yimg.jpのURLを削除してください。





2016年12月19日月曜日

[C#] VS2015でffmpegをビルドする - How to build ffmpeg in visual studio 2015

必要なもの
・Visual Studio 2015
・MSYS2
・gas-preprocessor

順番にインストールしていきますが、VS2015はすでにインストール済みである前提で進めます。


Step1.download MSYS2. and install

 http://msys2.github.io/


Step2.set to PATH
 MSYS2_BIN = D:\msys64\usr\bin\bash.exe

 →ドライブレターは任意。



Step3.run MSYS2

$ pacman -Sy pacman
$ pacman -Syu
$ pacman -Su
$ pacman -S make
$ pacman -S gcc
$ pacman -S diffutils
$ exit

Download gas-preprocessor.pl Perl script from https://github.com/FFmpeg/gas-preprocessor
Place the downloaded Perl script in your MSYS2 path.
  E.g. C:\msys64\usr\bin\gas-preprocessor.pl



Step4.Clone ffmpeginterop in GitHub

 https://github.com/Microsoft/FFmpegInterop



Step5.Execute BuildFFmpeg.bat

バッチファイル実行で終わり。

これでC#からffmpegが使えるようになったので、

MediaElement使って色々できるそうです。



参考URL
https://trac.ffmpeg.org/wiki/CompilationGuide/WinRT
http://qiita.com/azk0305/items/a546da060f3ab8d6a8bf

2016年12月18日日曜日

[RaspberryPi]無線機能の付いていないラズパイをインターネットにつなぐ


Raspberry Pi Zero には OTG機能があります。

このOTG機能というのは、パソコンを介さずに通信することができるものですが、

実際に使ってみるとUSBでLANと同じことができるようになります。

もちろんIPアドレスが割り当ててインターネットの共有をすることも可能です。

身近でよく耳にするものでスマホのテザリングがあります。

テザリングはスマホでつなげているLTEや3G回線をパソコンで使えるようにする機能です。

実はこのテザリングはOTG機能を使ってるんです。

っていうことは、、

PCとRPi ZeroをつなげてPCにつながっているインターネット回線をRaspberryPiに分け合うことも、

スマホのテザリング機能を使ってRPi(Rpi3でも可能)にインターネット回線を使えるようにすることもできます。

ちなみにChromebookでも可能でした。

ポイントはOTG機能でUSBをLAN化するけど、DHCPが無いのでDHCPサーバーを建てなくては行けなかったり、IPが解決したらDNSでドメインネーム解決もしなくてはいけないので、これはRpiZero側のOTG機能を有効にしたとき、ホストPCでクライアントはZero側となるのでインターネット回線とDHCPサーバーはホストとクライアントがクロスするので注意です。


sudo mount /dev/mmcblk1p1 /mnt/stateful_partition/chroots/
sudo mount /dev/mmcblk1p1 /mnt/stateful_partition/chroots/sh
sudo mount /dev/mmcblk1p1 /mnt/stateful_partition/chroots/


参考サイト
 http://www.raspi.jp/2016/07/pizero-usb-otg/

2016年12月14日水曜日

[UWP]忙しい人向けCocos2d-x入門


cocos2d-xの言語はC++です。
タッチイベント・画像配置・アニメーション、音再生などのAPIを使ったサンプルコードを書いたのでメモ。

〇パッケージ一覧 coscos2dの他
 coscos2d::extension (ボタンなどのクラス関連)
 coscos2d::ui(ui関連)
 coscos2d::network(network関連)

〇ソースコードサンプル //----------------------------------
 //Step1.テキストを表示する
 //----------------------------------
 auto hello = Label::createWithTTF("hello world", "Arial", 48);
 hello->setPosition(100, 200);
 this->addChild(hello);

 //----------------------------------
 //Step2.画面に画像を配置する
 //----------------------------------
 //プレイヤー画像作成
 auto player = Sprite::create("images/player.png");
 //プレイヤーを移動
 player->setPosition(Vec2(160, 120));
 //画面に張り付ける
 this->addChild(player);

 //----------------------------------
 //Step3.画像のグルーピング
 //----------------------------------
 Node* fruits = Node::create();
 Sprite* apple = Sprite::create("images/fruit0.png");
 Sprite* grape = Sprite::create("images/fruit1.png");
 Sprite* orange = Sprite::create("images/fruit2.png");
 //タグId付与
 fruits->setTag(9999);
 apple->setTag(1);
 grape->setTag(2);
 orange->setTag(3);
 //子ノード登録
 fruits->addChild(apple);
 fruits->addChild(grape);
 fruits->addChild(orange);
 //各画像の位置設定
 apple->setPosition(Vec2(100, 100));
 grape->setPosition(Vec2(200, 200));
 orange->setPosition(Vec2(300, 30));
 //登録(まとめて登録できる)
 this->addChild(fruits);
 //タグ指定してデータを取り出す
 Node* fruits0 = this->getChildByTag(9999);
 Sprite *fruit0 = (Sprite*)fruits->getChildByTag(1);
 Sprite *fruit1 = (Sprite*)fruits->getChildByTag(2);
 Sprite *fruit2 = (Sprite*)fruits->getChildByTag(3);
 //グループ画像まとめて移動
 fruits0->setPosition(Vec2(50, 50));
〇物理エンジンを使う
 auto scene = Scene::createWithPhysics();
 PhysicsWorld* world = scene->getPhysicsWorld();
 world->setGravity(Vec2(0, -500));
 world->setSpeed(1.0f);
〇2Dアニメやエフェクトを行う
 //特にSpawnクラス(同時の動き)とSequenceクラス(順次の動き)を上手に使うべきです。
 auto scale1 = ScaleTo::create(0.03, 1, 1);
 auto fade1 = FadeTo::create(0.03, 200);
 auto move1 = MoveBy::create(0.03, Vec2(20, 0));
 auto spawn1 = Spawn::create(scale1, fade1, move1, nullptr);

 auto scale2 = ScaleTo::create(0.03, 0.8, 0.6);
 auto fade2 = FadeTo::create(0.03, 50);
 auto move2 = MoveBy::create(0.03, Vec2(-20, 0));
 auto spawn2 = Spawn::create(scale2, fade2, move2, nullptr);

 auto seq = Sequence::create(spawn1, spawn2, nullptr);

 auto scale3 = ScaleTo::create(0.03, 1, 1);
 auto fade3 = FadeTo::create(0.03, 255);
 auto spawn3 = Spawn::create(scale3, fade3, nullptr);

 auto action = Sequence::create(seq, seq, seq, spawn3, nullptr);
 runAction(action);
 this->runAction(Sequence::create(DelayTime::create(1.0f),
  CallFunc::create([this]() {
  //ここで処理を書く
 }),nullptr));


・BGMを鳴らす #include "SimpleAudioEngine.h"
 //音量設定
 SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
 //読込み
 SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("bgm.mp3");
 //再生する
 SimpleAudioEngine::sharedEngine()->playBackgroundMusic("bgm.mp3");
 //停止する
 SimpleAudioEngine::sharedEngine()->stopBackgroundMusic("bgm.mp3");
 //一時停止
 SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
 //再開
 SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
 //音楽を先頭に戻す
 SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
 //音量を変更する
 SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.4)
 //再生中?
 SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying


・効果音を鳴らす //効果音再生
 int soundId;
 soundId = SimpleAudioEngine::sharedEngine()->playEffect("effect.mp3");
 SimpleAudioEngine::sharedEngine()->pauseEffect(soundId);
 SimpleAudioEngine::sharedEngine()->resumeEffect(soundId);


・動画再生 SimpleVideoEngine::sharedEngine()->playVideo("movie.mp4");

・ローカライズ auto Language = Application::getInstance()->getCurrentLanguage();
 if(Language == LanguageType::JAPANESE);
 ...

・タッチイベント●タッチ開始(指が付いた)時
bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);
bool onTouchesBegan(cocos2d::Touch* touch, cocos2d::Event* event);
●タッチ中に位置が動いた時
onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event);
onTouchesMoved(cocos2d::Touch* touch, cocos2d::Event* event);
●タッチ終了(指を離した)時
onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event);
onTouchesEnded(cocos2d::Touch* touch, cocos2d::Event* event);
●タッチ操作キャンセル時
onTouchCancelled(cocos2d::Touch* touch, cocos2d::Event* event);
onTouchesCancelled(cocos2d::Touch* touch, cocos2d::Event* event);

参考サイト http://cocos2d-x.org/docs/api-ref/cplusplus/v3x/
 http://osconqsc2015.azurewebsites.net/qsccontent/Cocos/Cocos2dx.html

2016年12月12日月曜日

[Win]Visual Studioを完全アンインストールして幸せになる方法。

下記URLのアプリを使うと完全クリーンアンインストールができるようです。



https://github.com/Microsoft/VisualStudioUninstaller/releases






---ここから言わせてほしいこと(不満大噴出)---


そうだ、VisualStudioをまともに動かそうと考えるのをやめてアンインストールだ!


インストールしたらちゃんと使えるAndroidStudioを使って幸せになろう!(UWPアプリなんてくそくらえ!)




以下、不具合点について

・VisualStudio2015Update3はそのままインストールすると新規作成でUWPアプリケーションが作れない。
・VisualStudio2015のアンインストールが終わらない。キャンセルも終わらない。
・VisuakStudio2015を再インストールしてもUWPアプリの新規作成は不可能。ターゲットのSDKが見つかりません。やTemplateがなんとかってエラーが出たり現象は様々あり。
・VisualStudio2017RCのインストールはどのエディションでも必ず失敗する。
・.Net Core用のツールdotnetでproject.jsonを覚えたら廃止にして次のバージョン.Net Standard 2.0でMSBuildと統合するとか噂あるのでまた新しく覚えないといけない。
・dotnet packでnuget作成が楽になったけど、descriptionとかpackした後に手動で個別に設定しないといけないわずわらしさ。
・UWPの呼び名が色々ある
・ビルドが遅い
・必要容量が遅い
・起動が遅い
・開発環境がとても大容量(もっとコンパクトにならないの?)
・UWPアプリを配布用にビルドするとサイズがものすごくでかくなる
・TaskのAsync/Awaitを使うとデバッグ時のトレースが不完全で原因特定しずらい上に使用を強制される
・.Net Standard 2.0になったらまともになるかもしれないけど、現状の .Net Standardは1.2が一番まとも。1.5以上をターゲットにするとコンパイルすらできない。
・開発環境によって.Net Standard 1.4が使えたり使えなかったりする(当然最新SDKはインストール済み)

まとめると、超重量級リッチ環境より1つの事をちゃんと動く開発環境がほしい。
開発環境をインストーラでまともにインストールできないのははっきりいって欠陥品です。
なぜユーザーが検索して解決策をさがないといけないの?
しかも解決策はユーザー同士のコメントだったりするし、古いバグも放置してフィックスしてくれない。
ついでにアンインストールもできないのもオワコン状態。

とある巨大企業である当人には届かないコメントでしょうが、ミジンコである自分は環境の変化で毎回振り回されに対応していく体力がないので対岸の岸に避難して、状態が沈下するまで注視します。VSバイバイ(^^)/~~~

2016年12月11日日曜日

[Rpi]RaspberryPiにGoLangをインストールしてHugoを使ってみる。

Hugoを使ってみようと思います。


まずはインストールから。

$ sudo apt-get install golang -y

$ sudo vim .profile
一番下に追加
---
export GOPATH=/usr/share/go/
---

$ sudo go get github.com/spf13/hugo



2016年12月9日金曜日

[Win]Dockerをインストールしてみる

VirtualMachineや仮想環境で今ではDockerを使うというのが一般的、しかも.Net CoreもDockerを使うのが一般的みたいな風潮になりそうなのでインストールすることにしたのでメモ。

【前提条件】
 簡単にまとめると、Dockerを使うのにHyper-Vが有効になっていないと使えないようです。
Win10Professional版なら大丈夫だけどHomeはどうなんだろう、、Hyper-Vが有効になっていても管理アプリが無ければ難しいと思います。
どうしても仮想化したい場合は、VMWareやVirtualBox上でLinux動かしてOSまるごと仮想環境を構築するという従来どおりのやり方をおすすめします。


仮想環境が有効になっているかの確認方法は

タスクマネージャを開き、パフォーマンスタブのCPUメニュー内にCPUの速度や使用率などある中に仮想化というのがあり、「有効」になっていればOKです。

「無効」だった場合、コントロールパネルから「プログラムと機能」を開き、「Windowsの機能の有効化または無効化」を開き、Hyper-Vの部分にチェックを入れて再起動してください。


【インストール編】

Step1.Docker toolboxをインストール

 https://docs.docker.com/toolbox/toolbox_install_windows/

 これを使うとDockerに必要なアプリ、「VirtualBox」「Kitematic」「Git」などまとめてインストールできるので便利です。

インストール完了したら、デスクトップに「VirtualBox」「Kitematic」「DockerQuickstartTerminal」の3つが有ることを確認してください。

なぜかVirtualBoxのインストールされてなかったので別途手動インストールしました。
https://www.virtualbox.org/wiki/Downloads


Step2.Hello world実行
 DockerQuickstartTerminalを実行してターミナルが正常起動したら、

$ docker run hello-world

を実行。

これにて終わり。


参考サイト
 https://docs.docker.com/toolbox/toolbox_install_windows/

2016年12月8日木曜日

[C#].Net Core時代のHello world

.Net Standard周りをいじっていたら新たに追加されたdotnetツールを使ってみるかということで色々と触ってみました。

.Net CoreはdjangoやrailsみたいなフレームワークをASP.NETで実現したようなものです。
なので、コマンドライン上でプロジェクト作成からビルド・実行までdotnetコマンドを使うことでできます。

このdotnetコマンドは、Consoleアプリ、WEBアプリ、ライブラリの3つ作れるようなので全部試してみました。


-------------------
console編
-------------------

 mkdir helloworld
 cd helloworld
 dotnet new
 dotnet restore
 dotnet run

必要時間:1分
結果:画面上にhello worldと表示される。


-------------------
asp.net編
-------------------
mkdir helloasp
cd helloasp
dotnet new -t Web
dotnet restore
dotnet run
ブラウザ上で[http://localhost:5000]を開く。


所要時間:1分+エラー対応
結果:webアプリの作り方のページが表示される。


注意:
 Restoreでエラーがでました。
 project.jsonを開いてNugetライブラリのバージョンを上げてみると良いようです。
 """
  例:Microsoft.AspNetCore.Razor.Tools 1.0.0-preview2-final
  でエラーが起きたら
  1.0.0-preview4-final にする。
 """


メモ:neinxサーバを使う場合の設定
server {
  listen 80;
  server_name example.local;
  location / {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}


-------------------
library編
-------------------
 mkdir hellolib
 cd hellolib
 dotnet new -t lib
 dotnet restore
 dotnet build

所要時間:1分+エラー対応
結果:dotnet run すると Mainがないので当然動きません。


これもエラーが出てうまく行きません。
project.jsonを開き、runtimesを追加してどのプラットフォーム向けにビルドするかを決めなければなりません。
"""
{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable"
  },
  "dependencies": {},
  "frameworks": {
    "netstandard1.6": {
      "dependencies": {
        "NETStandard.Library": "1.6.1"
      }
    }
  },
  "runtimes" : {
    "win10-x64" : {}
  }
}
"""


メモ:
○nugetパッケージ化する方法
 dotnet pack


○Consoleアプリで参照する方法
 project.jsonに記述する。

-------------------


所感:
 いろんなサイトを見ると今後のアップデートでjson設定ファイルがなくなってcsprojになるとか
パッケージ類もまだpreviewだし、2017年春リリース予定の.Net Standard 2.0で大幅な更新があったりするので実用レベルになるまで注視するのが良いのではないでしょうか。

もし.Net Standard 2.0が出ても大幅な更新=長期間のバグフィックス期間が予想されるので、
バグフィックスが進んで3.0の噂が出始める頃が始めるタイミングとして一番いいと思います。
(現状だと.Net Standardで用意されてるインターフェイスが少ない上にOS依存部分・通信周り・ファイル入出力がほぼ未実装)


参考
 http://qiita.com/creativewebjp/items/48ede6a3f920ba26ff59

2016年12月7日水曜日

[C#].Net Standard時代のNugetパッケージの作り方

今まで nuget specなどでひな形を作ってからパッケージの依存関係だとか色々と設定しないと行けなかったのですが、.Net standard世代になってだいぶ進化しました!

dotnet pack

はい、コレでビルドからパッケージまで作ってくれます。

先日はダメだしばかり書いたので、これからは良いところを探してちょっとずつ記事にしていきます。


2016年12月5日月曜日

[C#].Net Standard? .Net Core? pcl? UWP? what??一体何なの?

  • 最近のマイクロソフトの開発言語周りの動向がよくわからない
一言でいえばコレです。


この混沌とした状況をWindows8.1から歴史を見て読み解いていきたいと思います。

  • 歴史

UWP誕生について
  デスクトップアプリはレガシーとされつつWindows8.1とWinRTに分裂してそれぞれが別路線を辿ったのかと思いきやユーザー不評の意見を受けてWindows10になっていきなりUWPとして統合された。
UWPはWinRTの後継でありながらXBOXやWindowsMobileやデスクトップ、タブレット全部1つのアプリケーションで動くものを作ろうというとても壮大な野望の元に生まれました。しかし出来たてホヤホヤかつ昔から使っていた.Net Frameworkはレガシー扱いにされ、再実装されることになった。
また、完全にデスクトップアプリになるかといえばそうではなくて、デスクトップ上でウィンドウで表示されるよう裏でエミュレーターみたいなものが動いて実現しているようです。

まとめ①
 従来デスクトップアプリ→現在も健在
 Win8.1専用アプリ+WinRTアプリ→UWP


Xamarin買収

 2016年2月頃に事件がおきました。MicrosoftによるXamarin買収。
もともとXamarinはMonoプロジェクトの1つでLinux上で.Net frameworkを動かそうとオープンソースで実装されたフレームワークである。それをAndroidやiPhoneでも動かせれるように個々のプラットフォームに対応したのがこのXamarinである。もちろん無料でも使える状態だったのだがバイナリ作成する容量がとても小さかったため、有料のを使わないとできない状況でしたので個人向けではありませんでした。が、しかしマイクロソフトによって買収され無料枠を撤廃しました。
これでC#を使えばWin10、Android、iOSどのプラットフォームで動くようになりました。


よく考えてみるとUWPの目的とXamarinってかぶっていない?って気づくと思います。

もちろんかぶってます。

まとめ②
 UWPのターゲットプラットフォーム:Win10、WinMobile、XBOX
 Xamarinのターゲットプラットフォーム:UWP、Android、iOS
 Monoのターゲットプラットフォーム:Win、Linux、macOS


混沌とした状況に陥る

 とても重要なので全体の流れを一度まとめてみる。

 デスクトップアプリから始まり、Win8.1でタブレット、スマホ最適化の流れが入り込んでポストデスクトップの流れが起き始める。
Win10になってWinRTは実質終了、APIはUWPとして新生する。
マイクロソフトはXamarinを買収して全てのプラットフォームに対応する。

デスクトップアプリとスマホ・タブレット関係、クラウド(WEBアプリ)、Android/iOSプラットフォームの断片化が始まる。
こんな状況こそまさにリーダー不在でプロジェクトが進んでいったかのような.Netファミリーですが、
匙を投げてオープンソース化されました。Roslynという名で開発がスタートしてMono/XamarinにもMSのコードが流入され安定化が増すというプラスの面がでてきました。
(VSユーザは気づいていると思いますが、コンパイルや統合環境の起動がやたらと遅くなりストレスMAX)
さらにWinRT系のAPIはTaskとAsync/Await、IO周りのAPIリニューアルなど古参ユーザーを蹴落とすかのような改悪があったりなかったり、、言いたいことはあるけどね。。


これもう手に負えないわー。そうだ、統合しよう!っていう流れになり生まれたのが.Net Core 1.0と.Net Standardです。

前者の.Net Core 1.0はASP向けとプラットフォーム(Win/Linux/macOS)で動くようにしたもので、
.Net Standardはデスクトップもモバイルもクラウドも全部共通のフレームワークを使おうねと定義されたもの。いわばヘキサゴナル方式の考えで最小限のインターフェイスを定義されていて特化した処理はそれぞれのプラットフォームプロジェクトで書いてね!というものである。

まとめ③
デスクトップ
 UWP = Win10/WinMobile/XBOX
 .Net Core = クラウド向け Win/Linux/macOS(主にASPかコンソールの2択)
 .Net Standard=断片化した.Netファミリーの共通プラットフォーム。
 pcl= .Net portableと呼ばれている。pclを後継が.Net Standardにあたる。


今後の動向

 それぞれの単語が出揃いました。
では何を覚えればいいの?ってところですが、

一言でいえば、

  .Net Standard を使おう!

です。


2016年現在、バージョンが1.0~1.6まであるのですが、1.5からはまともに動かない状況ですので
VisualStudio2017 Update1になるまではバージョン1.4を使っておくと面倒なくていいと思います。


余談ですが、共通プロジェクト作成のコツはどこにも依存しないタダの処理の集まりであると後腐れなくうまくいきます。



Androider