회사에서 NAS를 얻었다. 하지만, 회사에서 공유기랑 내 자리가 멀리 있어서 공유기로 통해서 컴퓨터랑 연동하기가 힘든 상황이 만들어졌다.

 그래서, 컴퓨터에는 외부 네트워크로는 무선 네트워크로 정의하였다. NAS는 유선 LAN 밖에 연결을 할 수 없기 때문에 LAN과 컴퓨터랑 연결시킨다.

 이렇게 해도 NAS에 바로 붙지 앟는다. 그래서 네트워크 설정을 해줘야한다.
 네트워크설정 페이지에 들어가면,


 여기서 이더넷에서 속성을 들어가면, 다음과 같은 창이 띄워진다.


 여기서 인터넷 프로토콜 IPv4의 속성에 들어간다.


 가상으로 하는데. 여기서 NAS에서 설정한 인터넷 Class를 맞춘다.
 나는 192.168.1.x 로 네트워크 망을 설정한다.
 게이트웨이는 192.168.1.1로 잡힌 네트워크 망으로 NAS는 192.168.1.250으로 맞춰놨다.




 네트워크 망 설정이 끝나면,인터넷 연결 공유를 설정해주는것으로NAS와컴퓨터를 1:1로 연결하도록 한다.


 이 후에는 ipDisk Drive를 설치해서 연결해준다.
 여기서 문제가 발생할 수 있는게 인터넷 연결이 가끔 오작동 나는 경우가 있다. 그래서, 무선 인터넷 망을 우선으로 맞춰서 작업할 필요가 있다.

Posted by JunkMam
,

libmingwex-0.dll 이라는게 없다고 하면서 오류가 나는 경우가 있다.


이럴때 해결하는 방법은 MinGW가 있는 lib에서 libmingwex-0.dll을 넣어서 관리하거나, 다음과 같은 방식을 사용한다.



프로젝트에서 Build options을 추가한다.



이렇게 창이 뜨는데, 여기서 Linker settings(정적 라이브러리를 연결하는 창)에 들어가서 libmingwex.a을 추가한다.



이렇게 해서 컴파일을 사용할 수 있게 된다.


명령어로 한다면, 

'mingw32-g++.exe  -o bin\Release\Test.exe obj\Release\main.o  -s  MinGW\lib\libmingwex.a'


이렇게 하면 추가되어서 컴파일이 된다.

Posted by JunkMam
,

 MinGW을 사용하면,서 libgcc_sdw2-1.dll 오류가 나는 경우가 있다.


 특히, C버전이 조금 낮은 경우에는 일어날 수 있는 오류이다.


 


이렇게 뜨게 된다.


이것을 처리하는 방법을 구글링하다가 알게된 것으로.


사이트


여기서 설명한 해결법은 static gcc을 설정하고, static lib std c++을 컴파일할때 추가하는 것이다.




이렇게 하면 이상없이 해결된다.


Posted by JunkMam
,

wxWidgets 설치하기

연습 2018. 4. 3. 23:30
wxWidgets이란, Cross-Platform에서 GUI을 지원해주는 Library이다.

그래서 GUI을 작업할때, 동일한 소스를 이용해서 컴파일을 해도 문제 없이 동작할 수 있는 소스를 만들 수 있다.

설치하는 방법 설명.

먼저, 컴파일 할 수 있는 환경이 완성되어 있다고 보고, Source 파일로 설치하는 방법을 작성할려고 한다.(필자는 MinGW을 사용하는 상태이다.)

다운로드 여기에서 다운을 받아둔다.

설치한 는 방법을 자세하게 설명 되어 있는 사이트는
사이트1사이트2 가 있다.

설명을 모르겠으면, 사이트를 참고할것.

Source 파일을 다운 받아 압축을 풀면, wxWidgets라는 소스 폴더가 있을것이다.
거기서 {wxWidgets Source 파일 압축 푼 경로}\build\msw 에 들어가면, makefile.gcc와 makefile.bcc가 있다.(vs를 사용하면, vs8부터 vs11까지 빌드 파일이 있다.)

거기서 다음과 같은 명령어를 입력한다.

mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug clean
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release clean
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release

여기서, clean을 하는 이유는 혹시 Build가 되어 있는지 모르는 상황에서 제대로 설치하기 위해서 사용한다.
특히, clean을 사용하면, build된 필요 파일들이 다 날아가니 주의가 필요하다.

이 작업이 거의 1시간정도 여유를 가지고 작업을 하면 결과물은

{wxWidgets Source 파일 압축 푼 경로}\lib\gcc_dll에 저장되어 있을 것이다.

명령어 설명, -f 은 파일을 넣기 위한 명령어.
MONOLITHIC : 모든 라이브러리들을 하나로 묶는것으로, 공유할때 사람들에게 줘야될 DLL의 파일이 하나로 고정되게 된다.(정적 라이브러리도 하나가 된다.)
SHARED : 동적 라이브러리로 만들어내는 것을 설정한다. 0일 경우에는 정적 라이브러리를 빌드한다.
UNICODE : ASCII랑 UNICODE에서 UNICODE를 지원해주는것을 뜻한다.
BUILD : 어느 형태의 빌드 지원 라이브러리를 만들 것인지를 뜻한다. debug일 경우에는 디버그 지원이 있는 라이브러리를, release는 디버그 지원이 없는 라이브러리를 빌드한다.

이렇게해서 컴파일을 하면, wxWidgets 라이브러리 설치가 완료된다.


Posted by JunkMam
,
Fierbase란, 구글에서 지원해주는 Cloud Service로 GCM(Google Cloud Messagine)의 발전 버전이다.

Firebase을 이용해서 모바일에 Message을 보내줄 수 있기도 하면서 다양한 서비스를 지원해준다.(대표적으로 OAuth 인증 시스템 및 저장소, 데이터 베이스 등등...)

여기서 Firebase의 인증 시스템을 사용할려고 한다.

console firebase 여기에 들어가면 Firebase의 콘솔 웹 페이지가 들어갈 수 있다.


이렇게 프로젝트를 추가해서 제공할 수 있다.


여기서 프로젝트를 제작하면, 다음과 같은 페이지로 넘어가진다.


표시한 부분인 '웹 앱에 Firebase 추가'라는걸 이용하면, 웹 페이지가 추가 할 수 있는 라이브 러리 코드가 나온다.

Authentication이라는걸 들어가면, 사용자 인증 시스템을 설정할 수 있는 페이지로 넘어가지게 된다.
여기서 '로그인 방식'을 보면, 로그인 제공 방식을 설정할 수 있다.

필자는 Google 인증 시스템을 사용할려고 한다.


이렇게 하면, 프로젝트 로그인 시스템을 구현할 수 있게 된다.

이제, 설정이 어느정도 되었다면, 다음 예시 소스처럼 한다.

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
<!DOCTYPE html>
<html>
<head>
<script>
  // Firebase 초기화 
  var config = {
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: ""
  };
  firebase.initializeApp(config);
</script>
<script>
function OAuth()
{
    var provider = new firebase.auth.GoogleAuthProvider();//인증 시스템 시작.
    firebase.auth().signInWithPopup(provider).then(function(result){
        //인증 완료시 변화 코드
        alert(result.user.displayName);
    }).catch(function(error){
        //인증 실패시 변화 코드
        alert(error.message);
    });
    //인증 상태변화를 감지하는 설정.
    firebase.auth().onAuthStateChanged(function(user){
        if(user){
            //인증을 성공한 결과을 출력하기 위한 소스.
            document.getElementById('auth_state').innerHTML=user.displayName;
            document.getElementById('auth_out').style.display='inline';
        }else{
            //인증을 하지 않은 결과를 출력하기 위한 소스.
            document.getElementById('auth_state').innerHTML='off';
            document.getElementById('auth_out').style.display='none';
        }
    });
}
function OAuth_out()
{
    firebase.auth().signOut().then(function(){
        alert('Auth Out');
    }).catch(function(error){
        alert(error.message);
    });
}
</script>
</head>
<body>
    <div>
        <div>
            상태 : 
            <span id='auth_state'>off</span>
        </div>
        <div>
            <button id='auth_button' onClick='OAuth()' type='button'>Auth</button>
            <button id='auth_out' onClick='OAuth_out()' type='button' hidden>Auth Out</button>
        </div>
    </div>
</boby>
</html>


이렇게 하면, 구현이 된다.

예시를 적용한 예.
상태 : off
Posted by JunkMam
,
 *추신, 그냥 필자가 멋대로 테스트해본것으로 정말 이런지는 연습을 하면서 익혀보는 중이다.

 C언어와 C++는 비슷하다.

 필자는 클래스(Class)는 구조체(Struct)의 변형체로써 특정 기능(정확하게는 함수를 간단하게 구조체에 넣는 기능)이 붙어 있는 것이 클래스라고 본다.

 클래스의 변수를 맴버변수라고 하는데. 구조체의 변수 또한 맴버변수라고 한다.
 물론, 클래스에는 메소드가 있고, 구조체는 메소드랑 함수가 들어갈 수 없다.[C++에선 구조체에서도 함수가 들어간다고 하지만, 그것은 그냥 함수의 주소값을 넣는 것이다.]

 그래서 간단하게 C와 C++을 테스트해보았다.

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
#include <stdio.h>
 
class Person
{
    public:
        int nums;
    public:
        Person()
        {
            nums = 10;
        }
};
 
class BaseballPlayer: public Person
{
    public:
        int score;
    public:
        BaseballPlayer():Person()
        {
            score = 50;
        }
};
 
class Employee: public Person
{
    public:
        int hits;
    public:
        Employee():Person()
        {
            nums = 600;
            hits = 100;
        }
};
 
int main(void)
{
    Person *person = new Person();
    BaseballPlayer *player = new BaseballPlayer();
    Employee *employee = new Employee();
 
    printf("%d\n", person->nums);
    printf("%d\n", player->score);
    printf("%d\n", player->nums);
    printf("%d\n", employee->hits);
    printf("%d\n", employee->nums);
 
    return 0;
}
cs

test1.cpp
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
#include <stdio.h>
 
class Person
{
    public:
        int nums;
    public:
        Person()
        {
            nums = 10;
        }
};
 
class BaseballPlayer: public Person
{
    public:
        int score;
    public:
        BaseballPlayer():Person()
        {
            score = 50;
        }
};
 
class Employee: public Person
{
    public:
        int hits;
    public:
        Employee():Person()
        {
            nums = 600;
            hits = 100;
        }
};
 
int main(void)
{
    Person *person = new Person();
    BaseballPlayer *player = new BaseballPlayer();
    Employee *employee = new Employee();
 
    printf("%d\n", person->nums);
    printf("%d\n", player->score);
    printf("%d\n", player->nums);
    printf("%d\n", employee->hits);
    printf("%d\n", employee->nums);
 
    return 0;
}
cs

test.c


이렇게 해보았다.

여기서, gcc --save-temp과, g++ --save-temp를 이용해서 처리하는 것이다.


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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
    .file    "test.c"
    .text
    .globl    _mkPerson
    .def    _mkPerson;    .scl    2;    .type    32;    .endef
_mkPerson:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $4, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    $10, (%eax)
    leave
    ret
    .globl    _mkBaseballPlayer
    .def    _mkBaseballPlayer;    .scl    2;    .type    32;    .endef
_mkBaseballPlayer:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $8, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    $50, 4(%eax)
    leave
    ret
    .globl    _mkEmployee
    .def    _mkEmployee;    .scl    2;    .type    32;    .endef
_mkEmployee:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $8, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    $600, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movb    $100, 4(%eax)
    leave
    ret
    .def    ___main;    .scl    2;    .type    32;    .endef
    .section .rdata,"dr"
LC0:
    .ascii "%d\12\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    leal    28(%esp), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    leal    24(%esp), %eax
    movl    %eax, (%esp)
    call    _mkBaseballPlayer
    leal    20(%esp), %eax
    movl    %eax, (%esp)
    call    _mkEmployee
    movl    28(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movzbl    4(%eax), %eax
    movsbl    %al, %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    $0, %eax
    leave
    ret
    .ident    "GCC: (tdm-1) 4.9.2"
    .def    _malloc;    .scl    2;    .type    32;    .endef
    .def    _printf;    .scl    2;    .type    32;    .endef
 
cs


test.s


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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
    .file    "test1.cpp"
    .section    .text$_ZN6PersonC2Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN6PersonC2Ev
    .def    __ZN6PersonC2Ev;    .scl    2;    .type    32;    .endef
__ZN6PersonC2Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    $10, (%eax)
    leave
    ret
    .section    .text$_ZN6PersonC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN6PersonC1Ev
    .def    __ZN6PersonC1Ev;    .scl    2;    .type    32;    .endef
__ZN6PersonC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    $10, (%eax)
    leave
    ret
    .section    .text$_ZN14BaseballPlayerC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN14BaseballPlayerC1Ev
    .def    __ZN14BaseballPlayerC1Ev;    .scl    2;    .type    32;    .endef
__ZN14BaseballPlayerC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, %ecx
    call    __ZN6PersonC2Ev
    movl    -4(%ebp), %eax
    movl    $50, 4(%eax)
    leave
    ret
    .section    .text$_ZN8EmployeeC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN8EmployeeC1Ev
    .def    __ZN8EmployeeC1Ev;    .scl    2;    .type    32;    .endef
__ZN8EmployeeC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, %ecx
    call    __ZN6PersonC2Ev
    movl    -4(%ebp), %eax
    movl    $600, (%eax)
    movl    -4(%ebp), %eax
    movl    $100, 4(%eax)
    leave
    ret
    .def    ___main;    .scl    2;    .type    32;    .endef
    .section .rdata,"dr"
LC0:
    .ascii "%d\12\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ebx
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    movl    $4, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN6PersonC1Ev
    movl    %ebx, 28(%esp)
    movl    $8, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN14BaseballPlayerC1Ev
    movl    %ebx, 24(%esp)
    movl    $8, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN8EmployeeC1Ev
    movl    %ebx, 20(%esp)
    movl    28(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    $0, %eax
    movl    -4(%ebp), %ebx
    leave
    ret
    .ident    "GCC: (tdm-1) 4.9.2"
    .def    __Znwj;    .scl    2;    .type    32;    .endef
    .def    _printf;    .scl    2;    .type    32;    .endef
 
cs


test1.s


이렇게 되어 있다.


여기서, test.s와 test1.s을 비교해봤다.


여기서 소스상에서 많이 차이가 없어 보인다.

여기서 차이가 있다면, cpp에서 생성자가 기본적으로 존재하고 [__ZN6PersonC1Ev], 이 후에 생성되는 생성자는 [__ZN6PersonC2Ev]가 되면서 추가되어서 생성자가 생성된다.


하지만, test1.cpp에서 Person 클래스에 생성자를 추가하지 않으면, 해당 소스에서 [__ZN6PersonC1Ev ] 같은 함수가 사라지고, 그냥 메모리 할당이 되는 것으로 된다.


하지만, 이것은 c에서는 생성자라는 함수가 있는 것이고 구조체가 그대로 사용되는 방식은 클래스랑 구조체랑 다른게 없다는걸 알게 되었다.


그래서 C++에서는 각각 구조체 변수를 사용할 수 있게 되어 있고 그것을 프로그래머가 알고 있다. 라는 가정으로 작업하게 만들기 때문에 super랑 base를 지원하지 않고, 다중 상속을 지원하는 것같다.

Posted by JunkMam
,
wxWidget에 대해서 오작동이 자주 일어나는걸 확인했다.

특히, 경로에 의해서 오류가 자주 일어나서 계속 설정을 해야되는 문제가 있었다.

resource을 못 찾거나 경로를 못찾는 문제가 자주 발생한다.

그 이유를 알아보니 정말 막장인게, 다른 프로그램에서는 문제가 없는게 오작동 나는 경우가 있다.
그 외도 잘 동작하다가 갑자기 오류가 나는 경우가 있어서 사용자에게 불편하다.

 1. 특수 문자 존재 유무.('(', ')')
 2. 스페이스 존재 유무. (' ')

현재로는 이 두 가지의 문제점을 확인하였다.

한국어로 정리되어 있거나, 영어 포럼에서 제대로 답을 안해주는 일이 자주 발생하는 것을 보아서는 제대로 처리를 못하고 있는 것 같다.
Posted by JunkMam
,
 안드로이드 Oauth2을 이용한 로그인 어플 만들기.

 아는 지인에서 페이스북의 로그인 하는 방법을 알려달라고해서 Oauth2을 이용해서 페이스북 로그인을 할 수 있게 작업을 해줬었다.

 안드로이드에 페이스북을 연동하는 방법으로 다음과 같은 페이지를 참조하면 된다.




이렇게 사용해서 Android용 빠른 시작. 이라는 걸 클릭하면, 다음 페이지로 연결이 된다.


 주의 점은 개발자 계정을 연결시켜야 된다.



 이렇게 되어 있는 상태에서 Skip And Create App ID을 이용하면, 만들 수 있게 되어 있다.

  1.   facebook SDK 포함시키기.


 여기 설명을 그대로 사용한다면, 다음과 같다.



 프로젝트에서 최소 SDK는 'API15 : Anroid 4.0.3' 이상이야한다.


 이 후에 dependencies안에서 다음을 추가한다.


 그리고 Facebook SDK을 추가 하기 위해서 다음을 추가한다.


 이렇게 된다면, SDK는 사용할 수 있다.

 그 다음엔 SDK에서 페이스북의 앱 아이디를 연동하도록 하자.

 앱 아이디와 그런 것은 구글의 앱 아이디를 연결하는거랑 방식이 동일하니, 참조하자.


 여기서, facebook_app_id라는 것은 페이스북의 개발자 콘솔에서 추가해서 생성된 앱 번호를 뜻한다.
 그리고 Permission으로는 인터넷을 연동시키고, meta-data에서는 연동할 수 있게 입력하는 장치이다.

 이걸 입력하는 것은 manifests을 이용하면 된다.


 이 다음으로는 Google App Store(Google Play)에 올라온 패키지랑 연동하기 위해서 사용하는 것이다.
이것은 그냥 무시해도 된다.



 이번에는 해시값을 연결하는 것인데. 이것 또한 Google Console에 연동하는 것과 동일하게 keystore을 이용해서 해시값을 만들고, 그걸 연동하는 것이다.


 페이스북에서 로그인 버튼을 사용한 것으로, 페이스북 SDK에서 widget으로 구성이 되어 있다.

 다음은 MainActivity의 소스의 예시이다.

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
package com.example.sung.facebooklogins;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
 
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
 
import org.json.JSONObject;
 
import java.util.Arrays;
 
public class MainActivity extends AppCompatActivity {
 
    private CallbackManager callbackManager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(this.getApplicationContext());
        setContentView(R.layout.activity_main);
 
        callbackManager = CallbackManager.Factory.create();
 
        LoginButton loginButton = (LoginButton) findViewById(R.id.login_button);
        loginButton.setReadPermissions(Arrays.asList("public_profile""email"));
        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                GraphRequest graphRequest = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        Log.v("result",object.toString());
                    }
                });
 
                Bundle parameters = new Bundle();
                parameters.putString("fields""id,name,email,gender,birthday");
                graphRequest.setParameters(parameters);
                graphRequest.executeAsync();
            }
 
            @Override
            public void onCancel() {
 
            }
 
            @Override
            public void onError(FacebookException error) {
                Log.e("LoginErr",error.toString());
            }
        });
    }
 
}
 
cs

 이렇게 해서 간단하게, 로그인을 처리할 수 있게 된다.

 로그인이 이상없이 성공이 되면, onSuccess에서 동작이 되고, 실패하면 onError, 취소하면 OnCancel에서 동작하게 된다.

 성공을 하면, JSON 방식으로 데이터를 주고 받게 되며, 이걸로 성공 유무를 처리할 수 있게된다.
Posted by JunkMam
,

 작성자가 가끔 브라우져에서 업로드 버튼을 클릭할 경우 강제 종료가 되는 문제점이 있었다.

 


 이 창이 나오자마자 브라우져가 강제 종료가 되는 문제점이 있었다.

 이것을 해결하기 위해서 구글링을 하니.

 GMail에서 오류나거나 각 브라우져의 설정에서 오류가 있기에 초기화하라. 라는 말이 있었다.

 그것을 참조해서 작업을 해봐도 동일한 오류가 발생하였다.

 그런데 다른 원인을 언급한 게시글이 있어서 참조해보았다.


 여기에 있는 내용은 한글과 컴퓨터의 특정 라이브러리가 오류를 일으킨다는 뜻이였다.

 그래서, 해당 라이브러리를 변경할려고 한다.

 HncShellExt64.dll 여기서 오류를 일으키는 라이브러리이다.

 

 
 여기서 HncShellExt64.dll.old라고 되어 있는 동적 라이브러리는 작성자가 변경한 것이다.

 현재 설정되어 있는 것 처럼 하면, 문제 없이 파일이 실행되는걸 알 수 있다.
Posted by JunkMam
,

 Qemu에 SSH을 이용하기 이다.

 이것은 게스트용과 호스트용으로 서로 연동하는 것이다. 이걸 이용해서 게스트(가상 컴퓨터)와 호스트(메인 컴퓨터)와 통신을 할 수 있게 되어 있다.

 Windows 10에서 VirtualBox가 작동이 안되기 때문에(VirtualBox가 작동이 안되기 때문에 녹스 등도 제대로 작동이 안되게 되어 있다.)

 여기서 이야기하는 것은 다음을 연동시킨다.

 -redir tcp:2222::22

 여기서 사용하는 것을 본다면, 2222는 포트값을 뜻한다.
 이것으로 2222포트를 22포트랑 연동되게 되어서 tcp로 통신을 할 수 있게 열게 해놓을 수 있다.

 단, 여기서 통신을 하기 위해선 리눅스에선 SSH가 설치가 되어 있어야 된다.(기본적으로는 SSH가 설치가 되어 있는 리눅스가 있기도 한다.)
Posted by JunkMam
,