かざいむ日誌

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

Android Studio エミュレータ起動できない。Permission Denied (未解決)

学生からこんな相談があって、まだ解決できずにモヤモヤしてます。

Androidに保存したファイルを読み込むアプリを作り、デバッグをしようとして、エミュレータを起動しようとすると、起動前に、ダイアログが表示され、Permission Deniedが表示される。

Android OSも立ち上がってないので、アプリの作りではないし、原因が不明。

Stack Overflowでも4つくらい投稿があって、3つは未解決、もう1つは権限をいじって解決するなんて言うごりごりした解決をしていた、、、。ちなみに、データをワイプしてもダメだったので、入れたアプリやそのフォルダのせいではない気がするが、、、。

 

stackoverflow.com

stackoverflow.com

stackoverflow.com

stackoverflow.com

サーバー攻撃についてのリンク集

SECCON2015のConnect the Serverを後追いで解いた。

問題環境の構築は知識が少なかったので勉強になりました。

 

qiita.com

 

環境構築でMakeしたらエラー。

この通りにやったらFix出来た。

github.com

 

インストールの手順。(一般的)

www.linux-beginner.com

 

まずはncコマンド。

qiita.com

www.ksknet.net

 

そのあと、Wiresharkを入れてみた。

askubuntu.com

インターフェースがないと出るので、設定を変える。

ask.wireshark.org

 

 

すごく分かりやすかったです。

ありがとうございました。

はっきんぐ

 

管理者必見! ネットワーク・コマンド集 - whoisコマンドでドメイン情報を参照する:ITpro

UbuntuでPkcrackを試す。

UbuntuでPkcrackを試してみた。

既知平文攻撃というものらしく、かなりの早さで解けるのでびっくり。
ただ、セットアップまでかなりてこずって、なんかすごく泣きそうだった。

まずはセットアップ。windows用のexeもあるけど、64bit非対応ということで断念。
VM WareにUbuntuを立てて、そこにインストールしてみることにした。

wget http://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/pkcrack-1.2.2.tar.gz
tar xzvf pkcrack-1.2.2.tar.gz
cd pkcrack-1.2.2/src
make

これでMakeすると実行ファイルは出来るものの
エラーメッセージが出て、インストールは上手くいかない。
実行ファイルを直接叩くとどうも動いてるっぽい。

で、相対パスでやると上手く動かないので、
実行ファイルのあるとこに一緒に対象のファイルを投げ込んで実行。

失敗。

で、ググってたら優しい人が、ZIPファイルの圧縮率が違うと
うまく行かないことがあると教えてくれました。

ありがとうございました。

参考
qiita.com
securitymemo.blogspot.com


命令はこんな感じ。

$ ./pkcrack -C target.zip -c explanation.txt -P explanation.zip -p explanation.txt  -d unzip_output

Android Studio エミュレータで写真が撮れない。(Android Studio 2.1、WIndows10)

スライドショーアプリ用の写真を仕込むのに、エミュレータで写真を撮ってもらおうとしたらエミュレータ内のカメラアプリがフリーズ。最終的にはエミュレータのプロセスを落として再起動するしかなくなった。

同じ構成なのか分からないけど、いくつかそういう事象はあるみたい。

 

 

Issue 207651 - android - Emulator freezes when using camera - Android Open Source Project - Issue Tracker - Google Project Hosting

stackoverflow.com

 

時間もなく絶望的なので、エミュレータに写真をコピーすることで解決。ギャラリーの中に写真が欲しいだけなので。

エミュレータにドラッグ&ドロップして、設定から、SDカードをアンマウント、再度マウントで写真がギャラリーに反映される。

stackoverflow.com

ありがとうございました。

Android スライドショーアプリサンプル

授業用にSDカードにある写真をスライドショーで表示するアプリを作成したので、リンクやソースを貼りつける。(0件チェックやってない、、、。)

できあがりは、
f:id:name_untitled:20161205143539p:plainf:id:name_untitled:20161205143543p:plain
で、ボタンを押す、またはフリックで写真を切り替える。

build.gradleはターゲットSDKを下げてコード量を減らしている、、、。
build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "la.fe_nuol.myapplication"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
}


まずは画面。こんな感じ。
f:id:name_untitled:20161205143458p:plain

今回はアニメーションをファイルに保存。以下のファイルをanimフォルダに作成。
Animation
zoom_in_next.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <scale
        android:duration="500"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:toXScale="1"
        android:toYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="100%"
        android:toXDelta="0" android:duration="500"/>
</set>

zoom_in_prev.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <scale
        android:duration="500"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:toXScale="1"
        android:toYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="-100%"
        android:toXDelta="0" android:duration="500"/>
</set>

zoom_out_next.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="false">
    <scale
        android:duration="500"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0.1"
        android:toYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="0"
        android:toXDelta="-100%" android:duration="500"/>
</set>

zoom_out_prev.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="false">
    <scale
        android:duration="500"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0.1"
        android:toYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="0"
        android:toXDelta="100%" android:duration="500"/>
</set>[f:id:name_untitled:20161205143458p:plain]

MainActivity.java

package la.fe_nuol.myapplication;

import android.database.Cursor;
import android.gesture.GestureOverlayView;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class MainActivity extends AppCompatActivity implements
    GestureDetector.OnGestureListener{

    private GestureDetectorCompat mDetector;
    private ViewFlipper viewFlipper;
    Cursor cursor;

    private ImageView getImage() {
        String filePath =
                cursor.getString(
                        cursor.getColumnIndex(
                                MediaStore.Images.Media.DATA));
        ImageView imageView = new ImageView(this);
        Bitmap bmImg = BitmapFactory.decodeFile(filePath);
        imageView.setImageBitmap(bmImg);
        return imageView;
    }

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

        cursor = getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                null,null,null,null);
        cursor.moveToFirst();
        viewFlipper = (ViewFlipper)findViewById(R.id.viewFlipper);
        viewFlipper.addView(getImage());
        mDetector = new GestureDetectorCompat(this,this);
    }

    public void onPreviousClick(View view){
        if(cursor.isFirst()) return;
        cursor.moveToPrevious();
        viewFlipper.addView(getImage(),0);
        viewFlipper.setInAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_in_prev)
        );
        viewFlipper.setOutAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_out_prev)
        );
        viewFlipper.showPrevious();
        if(viewFlipper.getChildCount()<=1) return;
        viewFlipper.removeViewAt(viewFlipper.getChildCount()-1);
    }

    public void onNextClick(View view){
        if(cursor.isLast()) return;
        cursor.moveToNext();
        viewFlipper.addView(getImage());
        viewFlipper.setInAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_in_next));
        viewFlipper.setOutAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_out_next));
        viewFlipper.showNext();
        if(viewFlipper.getChildCount()<=1) return;
        viewFlipper.removeViewAt(0);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2,
                           float vx, float vy) {
        float dx = Math.abs(e1.getX() - e2.getX());
        float dy = Math.abs(e1.getY() - e2.getY());
        if (dx > dy) {
            if (vx > 0) {
                onPreviousClick(null);
            } else {
                onNextClick(null);
            }
            return true;
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mDetector.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) { return true;}

    @Override
    public void onLongPress(MotionEvent event) {}

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
        float f1, float f2) {return true;}

    @Override
    public void onShowPress(MotionEvent event) {}

    @Override
    public boolean onSingleTapUp(MotionEvent event) {return true;}
}

ジェスチャーのイベントの実装の仕方(フリック)を説明。
developer.android.com



やり方としてAsyncもあるが、今回は見送り
Tumbling Dice — [Android]Viewが表示された時のイベントを設定する


主にこのサイトを参考にしました。
techbooster.jpn.org
motogeneralpurpose.blogspot.jp


アニメーションについてはこのサイト

android.keicode.com

ありがとうございました。

Android ライブラリを使ったサンプルアプリ 今の天気

f:id:name_untitled:20161202234929p:plainf:id:name_untitled:20161202234922p:plain

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "xx.xxx.weathernews"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.squareup.okhttp:okhttp:2.7.0'
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'com.jakewharton:butterknife:8.4.0'
    compile 'com.jakewharton:butterknife-compiler:8.4.0'
    compile 'com.fasterxml.jackson.core:jackson-core:2.7.1'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.1'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.7.1'
    compile 'org.glassfish.main:javax.annotation:4.0-b33'
}

画面をこんな感じで作る
f:id:name_untitled:20161203000915p:plain


天気アイコンをこのサイトに載っている分だけ用意する。
Weather Conditions- OpenWeatherMap


JSONファイルからModelクラスを生成して、プロジェクトに入れる。
www.jsonschema2pojo.org

f:id:name_untitled:20161203001120p:plain


MainActivity.java

package la.fe_nuol.weathernews;

import android.graphics.drawable.Drawable;
import android.media.Image;
import android.os.Handler;
import android.os.Looper;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;

import butterknife.BindDrawable;
import butterknife.BindView;

public class MainActivity extends AppCompatActivity {
    String baseUrl = "http://api.openweathermap.org/data/2.5/weather";
    String appId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    Handler mHandler;

    @BindView(R.id.textView) TextView weather;
    @BindView(R.id.imageView) ImageView icon;
    @BindView(R.id.textView2) TextView temperature;
    @BindView(R.id.textView3) TextView humidity;
    @BindView(R.id.textView4) TextView description;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Spinner cities = (Spinner)findViewById(R.id.spinner);
        cities.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if(((TextView)view) == null) return;
                setWeather(((TextView)view).getText().toString());
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {}
        });
    }
    @Override
    protected void onStart(){
        super.onStart();
        mHandler = new Handler(Looper.getMainLooper());
        setWeather("Vientiane");

    }

    private Drawable getIconDrawable(String name){
        int id = getResources().getIdentifier("w" + name,
                "drawable",getPackageName());
        return getDrawable(id);
    }

    private void setWeather(String cityName){
        String urlText = String.format("%s?q=%s&appid=%s&units=metric",baseUrl,cityName,appId);
        Request request = new Request.Builder().url(urlText).build();
        OkHttpClient client = new OkHttpClient();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {}
            @Override
            public void onResponse(Response response) throws IOException {
                final String result = response.body().string().toString();
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        try{
                            ObjectMapper mapper = new ObjectMapper();
                            WeatherInfo info = mapper.readValue(result, WeatherInfo.class);
                            weather.setText(info.getWeather().get(0).getMain());
                            icon.setImageDrawable(getIconDrawable(info.getWeather().get(0).getIcon()));
                            temperature.setText("temp: " + info.getMain().getTemp().toString());
                            humidity.setText("humidity: " + info.getMain().getHumidity().toString());
                            description.setText("description: " +info.getWeather().get(0).getDescription());
                        }catch(IOException ioe){ioe.getStackTrace();}
                    }
                };
                mHandler.post(runnable);
            }
        });
    }
}

Ubuntuで、libtinsのexampleを動かしてみた。

同僚と勉強会をしていて、libtinsを触ることになった。パケットを色々とごにょごにょできるライブラリらしい。Wi-Fiパケットセンサーの勉強をしたいということで、ちょっとだけこのライブラリを使ったコードを見たけど、、、よく分からん。

libtins.github.io

とりあえず実行例を動かしてみようという話になり、GitHubのlibtinsのサンプルをWindowsでビルドしようとしたがかなりドツボにはまった。そもそも、C++やったことなかったので、Visual Studioでインクルードファイルの追加とかよく分からん、、、。

で、インクルードファイルの追加が出来たと思ったら、Visual Studioの中のchronoファイルでエラーが起きて意味が分からなかったので断念。

 

次に、Ubuntuでの実行を試す。

要ると言われているものをインストールして、libtinsのサイトの手順に従ってGitをクローン。

bokko.hatenablog.com

 

クローンしたファイルの中に、CMakeList.txtがあったので、ビルドしてインストール。ただ、エラーが出てる、、、。なんとなく入った感じだったので、g++でexampleのソースをビルドしてインストール、実行。

そしたら、ライブラリがないって怒られた。このサイトの手順に従って、見えるようにした。

UbuntuでMeCabやKyTeaを入れてlibなんちゃらがないと言われた時 : mwSoft blog

エラーが出たものもあったが、実行出来るものもあった。

f:id:name_untitled:20161110001038p:plain

これは、ARP応答から、IPとMACアドレスのリストを表示するプログラム。

動くまで時間かかったけど、出ました。

 

 

CMakeを使って自作ライブラリをビルド&インストールしてみたまとめ - へぼいいいわけ

 

OpenCVのCMakeList.txtの話が載っていたのでメモ代わりにリンク貼っとく。やはり、Windowsはちょっとメンドクサイのか?

qiita.com

 

みなさま本当にありがとうございました。

 

ありがとうございました。