sameAs라는 메소드가 있고, 그것을 구현하는 내용을 한번 작성해봤다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.awt.image.BufferedImage;
 
import com.android.chimpchat.adb.AdbBackend;
import com.android.chimpchat.core.IChimpDevice;
import com.android.chimpchat.core.IChimpImage;
 
import com.android.chimpchat.adb.AdbChimpDevice;
 
import com.android.chimpchat.core.ChimpImageBase;
 
public class MonkeyTest {
    public static void main(String[] args) {
        
        IChimpDevice device = null;
        
        try
        {
            // sdk/platform-tools has to be in PATH env variable in order to find adb
            device = new AdbBackend().waitForConnection();            
        }
        catch(java.lang.NullPointerException e)
        {
            System.out.println("Error");
            System.exit(-1);
        }
        
        // Print Device Name
        System.out.println(device.getProperty("build.model"));
 
        // Take a snapshot and save to out.png
        //device.takeSnapshot().writeToFile("out.png", "png");
        
        IChimpImage deviceImage = device.takeSnapshot();
        deviceImage.writeToFile("out_1.png""png");
        IChimpImage fileImage = ChimpImageBase.loadImageFromFile("out.png");
        fileImage.writeToFile("out_2.png""png");
        
        sameAs(fileImage,deviceImage,0.9);
        
        if(fileImage.sameAs(deviceImage, 0.75))
        {
            System.out.println("Sames");
        }
        else
        {
            System.out.println("Not");
        }
 
        device.dispose();
        
        System.exit(0);
    }
    
    public static boolean sameAs(IChimpImage other, IChimpImage sames, double percent){
        
        BufferedImage otherImage = other.getBufferedImage();
        BufferedImage samesImage = sames.getBufferedImage();
        
        //Easy size check
        if(otherImage.getWidth()!= samesImage.getWidth()){
            return false;
        }
        
        if(otherImage.getHeight()!=samesImage.getHeight()){
            return false;
        }
        
        int[] otherPixel = new int[1];
        int[] samesPixel = new int[1];
        
        int width = samesImage.getWidth();
        int height = samesImage.getHeight();
        
        int numDiffPixels = 0;
        // Now, go through pixel-by-pixel and check that the images are the same;
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (samesImage.getRGB(x, y) != otherImage.getRGB(x, y)) {
                    System.out.println(samesImage.getRGB(x, y)+":"+otherImage.getRGB(x, y));
                    numDiffPixels++;
                }
            }
        }
        double numberPixels = (height * width);
        double diffPercent = numDiffPixels / numberPixels;
        
        return percent <= 1.0 - diffPercent;
    }
}
cs



 하지만, 왜 차이가 생기는지는 잘 모르겠다.


 값이 동일하게 나온 것이라고 생각하는데...


 일단, 이렇게 구현을 할 수 있다면, 특정 위치를 조작해서 처리할 수 있는 방법도 만들 수 있다.

Posted by JunkMam
,

 MonkeyRunner을 연결해서 사용하는 것이 있게 된다.


 여기서, 이미지를 받아 들이고, 이미지를 비교하는 소스를 제작했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import com.android.chimpchat.adb.AdbBackend;
import com.android.chimpchat.core.IChimpDevice;
import com.android.chimpchat.core.IChimpImage;
 
import com.android.chimpchat.adb.AdbChimpDevice;
 
import com.android.chimpchat.core.ChimpImageBase;
 
public class MonkeyTest {
    public static void main(String[] args) {
        
        IChimpDevice device = null;
        
        try
        {
            // sdk/platform-tools has to be in PATH env variable in order to find adb
            device = new AdbBackend().waitForConnection();            
        }
        catch(java.lang.NullPointerException e)
        {
            System.out.println("Error");
            System.exit(-1);
        }
        
        // Print Device Name
        System.out.println(device.getProperty("build.model"));
 
        // Take a snapshot and save to out.png
        //device.takeSnapshot().writeToFile("out.png", "png");
        
        IChimpImage deviceImage = device.takeSnapshot();
        deviceImage.writeToFile("out_1.png""png");
        IChimpImage fileImage = ChimpImageBase.loadImageFromFile("out.png");
        fileImage.writeToFile("out_2.png""png");
        
        if(fileImage.sameAs(deviceImage, 0.75))
        {
            System.out.println("Sames");
        }
        else
        {
            System.out.println("Not");
        }
 
        device.dispose();
        
        System.exit(0);
    }
}
cs


 여기서 sameAs라는 것에서 1.0에 가까우면, 원본이랑 동일하게 보는 것이 맞다. 하지만, 제대로 동작이 안되는 경우가 있다.


 여기서, MonkeyRunner라는 분석이라고하여서 해당 소스를 올린 블로그가 있다.


 참조하면 도움이 될 것이다.


 http://goodtogreate.tistory.com/entry/monkeyrunner%EC%9D%98-%EB%B6%84%EC%84%9D

Posted by JunkMam
,

 MonkeyRunner를 Java에 연결해서 사용이 가능하다. 라는 식으로 예제 소스와 내용을 설명해주었다.


 이것을 제대로 Java의 소스를 작성하는 방법을 포스팅 할려고 한다.


 먼저, Eclipse을 이용해서 Java Project을 만들어 놓는다.



 프로젝트에서 Properties(환경 설정)에 들어가서 환경을 설정하는 창을 띄운다.



 여기서 Java Build Path(Java에서 Library등을 가지고오게하는 설정이다.)에서 들어가면, Library을 설정할 수 있는 탭이 있다.(이미 추가를 시킨 상태이다.)


 여기서 [Android SDK 경로]\tools\lib\MonkeyRunner.jar 을 가지고온다.


 여기서 MonkeyRunner라는 것은 공개 소스로 제작되어 있는 부분이 있다.(그리고 MonkeyRunner가 아닌, chimpchat.jar을 가지고와서 사용하는게 더 올바른 방식이다.


 MonkeyRunner는 Java + Python인 상태이기 때문에, Python의 정보를 가지고 있지 않는다면, 사용을 제대로 할 수 없는 것을 알 수 있다.

 하지만, MonkeyRunner에서 있는 Python을 분석해서 chimpchar에게 정보를 보내는것을 알 수 있기 때문에, 다음 링크를 읽으면서 분석하면, 이해에 도움이 될 것이다.


 링크 : https://android.googlesource.com/platform/tools/swt/+/android-4.4_r1.1/monkeyrunner/src/main/java/com/android/monkeyrunner


 이제, 다음과 같은 소스를 보여주면서, 자세하게 설명을 하도록 하겠다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import com.android.chimpchat.adb.AdbBackend;
import com.android.chimpchat.core.IChimpDevice;
import com.android.chimpchat.core.IChimpImage;
 
public class MonkeyTest {
    public static void main(String[] args) {
        IChimpDevice device = null;
        try
        {
            // sdk/platform-tools has to be in PATH env variable in order to find adb
            device = new AdbBackend().waitForConnection();            
        }
        catch(java.lang.NullPointerException e)
        {
            System.out.printf("Error");
            System.exit(-1);
        }
 
        // Print Device Name
        System.out.println(device.getProperty("build.model"));
 
        // Take a snapshot and save to out.png
        device.takeSnapshot().writeToFile("out.png""png");
 
        device.dispose();
        
        System.exit(0);
    }
}
cs


 이것에서 device라는 것은 ChimpDevice라는 것으로, Adb에 연결하는 방식으로,


 Python에서 있는 MonkeyDevice와 비슷하다고 보면, 이해가 될 것이다.


 MonkeyRunner는 AdbBackend라는 클래스와 동일하다고 보면 될 것이다.


 AdbBackend라는 클래스는 ADB와 연결되서 통신하는 클래스이다.


 여기서, waitForConnection은 2가지의 함수가 존재하는데.


 waitForConnection()과 waitForConnection(String)이 있다.


 여기서 String에는 ADB에서 있는 Device의 명칭을 작성하면, 해당 Device을 연결 할 수 있게 된다.


 여기서 device의 정보를 얻기 위해서는 ddmuilib이라는 것을 이용해야된다.


 거기에 대해서는 또 다른 방법을 찾아야 될 것이므로, 나중에 하도록 한다.


 Adb의 정보가 없다면, NullPointerException이라는 오류가 발생하는 경우가 있다.

 이 경우에 예외 처리하는게 좋다.


 현재 Device의 명칭을 알기 위해서 device.getProperty을 이용해서 알아보게 만들 수 있으며.


 device.takeSnapshot()을 이용해서 그림을 가지고 올 수 있다.


 writeToFile(String1, String2)에서 String1은 파일 명칭/경로를 뜻하는 것이고, String2는 파일의 포맷이다. 기본적으로 PNG을 기본적으로 가지고 있으며, PNG을 제외한, JPG가 적용이 가능하다.


 device.dispose();는 연결을 끊는 것이다.


 윗 방식을 이용하면, 스샷을 찍어서 png 포맷을 가진 out.png 파일이 생성된다.

Posted by JunkMam
,

 어느 날 녹화 프로그램 및 스트리밍을 작업하는 프로그램을 찾다가, XSplit라는 프로그램을 알게 되었었다.(우리 나라에서 조금 잘 알려진 소프트웨어에서 XSplit라는 프로그램이 더 잘 알려져 있다.)


 하지만, XSplit는 유료 프로그램이였다.(돈이 없는 사람에겐...)


 그래서 찾다보니, Open Source형태로 소스가 공개되어 있는 소프트웨어를 찾게 되었다.


 Open Broadcaster Software라는 프로그램이다.


 이 프로그램은 외국에서도 꽤 많이 사용이 되고 있으며, 오픈 소스라서 사용자들이 개량하면서 사용하고 있다.



 최근에 비교한 영상이다.


 OBS의 사이트(https://obsproject.com/download)을 참조해서 보고, 다운을 받을 수 있다.


 OBS는 Youtube/Twitch 등 다양한 스트리밍 서비스에 지원을 하며, 그 외 사용자들이 만들어 주는 플러그인을 연결해서 사용 할 수 있게 되어 있다.


 XSplit 보다 기능은 떨어지지만, 비용을 들이지 않고 사용만 한다면, 딱히 문제는 없을 것 같다.


 참고로 크롬을 윈도우로 영상을 출력하게 만들고 싶을지 모른다.(필자도 이것이 왜 그런지 몰라서 OBS 사이트에 찾기도 했다.)


 이유는 크롬 설정에서 가속도 기능을 막아 놓는다면, 문제 없이 인식을 할 수 있게 되어 있다.


 여기서 '가능한 경우 하드웨어 가속 사용'의 체크를 제거한다면, 문제 없이 인식하게 된다.

Posted by JunkMam
,

 안드로이드 SDK을 업그레이드 혹은 설치하면서 자동으로 설치되는 것이 MonkeyRunner라고 했다.


 이것을 Java에 연결할 수도 있는데, 그 이유는 jar로 MonkeyRunner을 설정해놓았기 때문이다.


 MonkeyRunner는 python와 Java을 같이 연결해서 사용하는 방식으로 Jython이라는 것이다.


 그래서 MonkeyRunner.bat을 이용해서 Python으로 구성한 소스를 동작 시킬 수 있게 할 수 있다.


 Java을 MonkeyRunner로 연결하기 위해서 다음 링크를 보면 도움이 될 것이다.


 링크 : http://stackoverflow.com/questions/6686085/how-can-i-make-a-java-app-using-the-monkeyrunner-api


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import com.android.chimpchat.adb.AdbBackend;
import com.android.chimpchat.core.IChimpDevice;
 
public class MonkeyTest {
    public static void main(String[] args) {
        // sdk/platform-tools has to be in PATH env variable in order to find adb
        IChimpDevice device = new AdbBackend().waitForConnection();
 
        // Print Device Name
        System.out.println(device.getProperty("build.model"));
 
        // Take a snapshot and save to out.png
        device.takeSnapshot().writeToFile("out.png"null);
 
        device.dispose();
    }
}
cs


 윗 예시 소스는 윗 링크에서 가지고온 소스이다.


 여기서, MonkeyRunner가 아닌, MonkeyDevice라는 게 있다.


 원래, MonkeyRunner라는 것은 ADB을 연결해서 처리해주는 중간자 역할을 하는 클래스다.


 그래서 MonkeyRunner을 사용해도 되고, adb을 바로 연결하는 AdbBackend라는 녀석을 사용해도 된다.


 나머지는 MonkeyRunner의 예시와 유사하다.


 단, 연결을 끊고 다시 연결하는 행위를 할 수 있다.(MonkeyRunner는 Python을 다 읽고 난 후에 알아서 종료하게 된다.)


Posted by JunkMam
,

 안드로이드에서 MonkeyRunner라는 것을 알고 있는가?


 안드로이드의 어플을 테스트하기 위해서 사용하는 것으로 python을 이용해서 사용하는 테스트 도구이다.


 안드로이드 스튜디오를 설치하면, ADB로 업그레이드 할때, 같이 설치할 수 있는 도구로써, 구글에서 지원해주는 도구이다.


 ADB와 차이나는 것은 ADB에서는 실행 시킬려면 작업이 많이 드는 이미지 매칭 함수가 들어가 있어. 자동화하기에는 매우 좋은 프로그램이라고 할 수 있다.


 MonkeyRunner라는 것은 원래 목적은 Monkey(원숭이)가 폰을 만지는 것과 같이 자동으로 막 만지게 하는 것을 사용 설명서(python으로 만들어져있는 스크립트)를 보고 눌러보는 장치. 라고 보면 될 것이다.


 MonkeyRunner의 설명은 안드로이드 스튜디오자체에서 설명을 해주고 있다.


 링크 : https://developer.android.com/studio/test/monkeyrunner/index.html


 원래 취지는 매우 좋은 용도로 사용한 것이다.

 참고로 소스로 그냥 넘겨도 되는 기능이 있는데, 이 부분은 다른 프로그래머가 유튜브에 언급했듯. 나중에 생기는 오작동을 잡기가 매우 어려워 지게 된다.

 그걸 방지하고, 귀찮으면 컴퓨터에게 시키게 만들자.

 테스터를 구하기 힘들면, 컴퓨터에게 넘기자.

 라는 뜻으로 만들어진 도구이다.[이것을 악용하면, 안 좋은 작업으로 사용할 수 있게 되겠지만...]


 컴퓨터에게 시키는 장치. 즉, 매크로인 것이다.


 링크에 들어가면, 알 수 있지만, 기본적으로는 python 언어를 이용해서 만들어지게 되어 있다.


 그리고 해당 소스를 사용해서 디바이스를 자동으로 동작 시키는 것이다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
 
# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()
 
# Installs the Android package. Notice that this method returns a boolean, so you can test
# to see if the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')
 
# sets a variable with the package's internal name
package = 'com.example.android.myapplication'
 
# sets a variable with the name of an Activity in the package
activity = 'com.example.android.myapplication.MainActivity'
 
# sets the name of the component to start
runComponent = package + '/' + activity
 
# Runs the component
device.startActivity(component=runComponent)
 
# Presses the Menu button
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)
 
# Takes a screenshot
result = device.takeSnapshot()
 
# Writes the screenshot to a file
result.writeToFile('myproject/shot1.png','png')
cs


 윗 소스는 링크에 있는 예제 소스이다.


 device = MonkeyRunner.waitForConnection()


 이것은 MonkeyRunner라는 클래스(jar로 라이브러리가 있다. 나중에 이 라이브러리를 가지고와서 Java로 다시 구성할 수 있게된다.)에 있는 정적 메소드 waitForConnection()을 이용해서 device에 MonkeyDevice라는 클래스로 만들어져 있는 모바일 디바이스의 정보를 받아들인다.(연결 될 때까지 계속 기다리는 동기화된 함수이다.)


 이렇게  구해진 dveice라는 변수에게 계속 명령을 주는 형태이다.


 device.installPackage라는 것은 해당 APK을 해당 모바일에 설치하도록 명령을 넣는 것이다.


 device.startActivity라는 것은 설정되어 있는 어플을 실행시키는 것이며, press/touch등 동작까지 명령으로 설정할 수 있게 된다.


 takeSnapshot()이라는 것으로 이미지를 메모리에 불러올 수 있게 되며, writeToFile을 이용해서 파일을 입력하도록 할 수 있고, 파일을 읽어 들여서 매칭 시킬 수도 있다.

Posted by JunkMam
,

CSS 자체 폰트 설정.

연습 2016. 10. 21. 00:00

 CSS에서 웹 폰트라고하여, 폰트를 설정하고, 웹에서 폰트를 변경할 수 있게 되어 있다.


 여기서 CSS로 설정하는 방법은 Font-Family라는 것을 이용해서 사용을 할 수 있다.


 문제는 웹 페이지에서 기본적으로 지원해주는 Font-Family가 적용이 안되어 있다는 것이다.


 그래서 웹 서버에서 사용하기 원하는 폰트를 설정하고, 적용할 수 있다.


 링크 : http://www.w3schools.com/cssref/css3_pr_font-face_rule.asp



 예제


 CSS 웹서버 폰트 제작.

 

1
2
3
4
@font-face {
    font-family: YD;
    src: url(fonts/YD320.woff);
}
cs


 이렇게, YD로 윤고딕이나 그런 형태의 글자 형태를 표현할 수 있게 된다.


 폰트 적용은 다음과 같이 할 수 있다.


 CSS 적용.

 

1
2
3
{
    font-family: YD;
}
cs


 이렇게 해서 웹 서버의 자체 폰트를 사용할 수 있게 된다.

Posted by JunkMam
,

 그누보드는 간단한 웹페이지를 제작하기 위해서 제공되는 PHP 웹 시스템이다.


 여기서 그누보드의 구성 요소가 나뉘어지는데.


 모든 시스템과 형태를 수정을 가해진 자체 테마+자체 시스템인 상태를 빌더.


 형태만 수정을 가해진 테마.


 겉 모습만 수정을 가해진 스킨.


 이렇게 나뉘어 진다고 보면 된다.


 여기서 빌더는 그누보드를 설치할때, 모든 시스템+DB가 수정이 되어지기 때문에. 그누보드 설치할때부터 빌더를 고를 것인가? 자체 그누보드를 사용할 것인가로 나뉘어 지게 된다.


 그리고 빌더를 설치할때는 모든 DB가 파괴될 수도 있기 때문에 주의가 필요하다.


 테마는 자체 그누보드에서 형태를 변경시키는 구조이기 때문에 DB등이 변경되는 경우는 거진 없다.


 주로 개발할때는 자체적인 그누보드의 구조를 가지고와서 테마를 붙여 넣고 스킨을 붙여넣은다음 소스를 개량하는 방향이 주로 되어 있다.


 여기서 관리자가 원하는 테마를 가지고와서 변경하는 방법과 테마가 어디에 존재하고, 어떻게 사용이 되는지 설명하고자 한다.


 


 드림위버 혹은 notepad의 FTP을 연결해서 일덯게 사용해서 처리가 된다.

 여기에 테마를 이용해서 정리를 할 수있게 된다.



 설정하여 정리하게 된 것에서 본다면, 테마 설정. 이라는 곳에서 들어가게 되면, 다음과 같은 메뉴가 나오게 된다.



 다음과 같은 설정에서 본다면, 여기서 '테마적용'이라는 설정이 된다. ㅇ니걸 이용해서 테마를 수정/관리할 수 있으며, 테마에 따라서 CSS등이 적용되게 된다.

Posted by JunkMam
,

 안드로이드에서 PSP 게임을 할 수 있게 도움을 주는 어플을 다운받은 적이 있다.(터치 스크린으로 하기엔 PSP 게임이 불편하다.) 그 어플 이름은 PPSSPP.


 PPSSPP Gold가 있지만, 이것은 그냥 유료로 기부형태로 취한다고 보면 된다.


 소스가 공개되어 있으며, IOS/Linux/Windows 등 모든 OS에 제대로 적용이 되는걸 확인 되었다.


 거기다가 게임 패드를 이용해서 사용 할 수 있기 때문에. 이걸 이용해서 PSP 없이 게임을 즐길 수 있다.(단, 게임 패드는 있어야 된다.)


 다운 받는 방법은 밑에 있는 링크를 사용하면 된다.


 사용법은 다른 에뮬레이터랑 유사하다.


 다운 받은 후에 설치하거나 압축을 풀고 동작시키면 된다.


 링크 : http://www.ppsspp.org/downloads.html

Posted by JunkMam
,

 드림위버에서는 웹 서버를 연결하기 위해서 설정을 저장한 파일이 있다.


 드림위버에서 서버를 설정하고, 다른 사람(웹서버 작업을 할 사람)들과 교류할려면 이렇게 작업을 해야될 것이다.


 하지만, 여기서 문제점이 존재한다.

 한 쪽은 드림위버가 있고, 다른 쪽은 드림위버가 없는 상황이라면. 올바르게 작업이 가능할까?


 ste를 분석이 되면, 그나마 연결이 되고 유사한 작업을 할 수 있다는걸 알 수 있다.


 하지만 여기서 ste파일을 열리지 못한다면, 제대로 작업이 되지 안는 문제점이 있다.


 그래서 이것을 해결하기 위해서 구글링을 해보았다. 결과는 다음과 같은 링크를 얻게 되었다.


 링크 : http://stackoverflow.com/questions/10989010/encode-and-decode-an-adobe-dreamweaver-password-in-ste-file


 해당 사이트에서 설명하는 것을 이용하면, 확실히 pw을 암호화 하고, 복호화하는걸 확인하였다.


 나중에 C언어로 pw을 받아들이고, 패스워드를 알아내는 작업을 해봐야겠다.

Posted by JunkMam
,