[초대장 마감완료] 티스토리 초대장 11장 배포 합니다.

7월 티스토리 초대장이 들어왔습니다.


아래 댓글 양식대로 댓글 달아 주시면 초대장 배포 해 드리겠습니다.


댓글양식


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


EMAIL : 이메일 주소

CONTENT : 어떤 블로그를 운영 할 것인지


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


이 두가지만 적어주시구요


블로그 개설 후에는 방명록에 글 하나 남겨주시면 되겠습니다.




자취생 직장인 100kg부터 살빼기 3차도전 - 실패



어느분이 이전에 썻던 포스팅에 댓글을 달아주셨다.


'글이 안올라오는걸 보니 이번에도 실패하셨나보군요'


네.. 실패 했습니다....


1. 2차 도전은 실패

1) 어쩌다 실패 하였는가


2차 도전은 1주일은 혼술을 안마셨으나 2주차 때부터


혼술만 안먹지 이틀에 하루꼴로 술약속을 잡아 부어마시면서 자연스럽게


다이어트는 잊혀지고 술을 퍼마시게 되었다. 술마시니 다음날 힘들어서 역시 운동 못함


주말은 그냥 반죽음 상태


그리고 103키로가 되었다.




2. 3차 도전 방법

1) 3차 다이어트 

이직후 구내식당에서 밥을 먹기 시작하면서 구내식당 메뉴에 항상 있는


샐러드를 보고


다시 다이어트를 결심했다



이번에 생각한건 탄수화물을 줄이고 단백질량을 늘리자.

그리고 헬스장을 다니자.



어차피 야채도 탄수화물이긴 하지만 분해되어 지방으로 축적되는데 걸리는 시간이 길다는 것


밥이나 밀가루는 빨리 분해되고 지방으로 축적된다는 것을 주워듣고


야채는 살이 안찔거야! 라는 생각과 함께 운동을 해야겠다고 마음 먹고


회사 근처의 헬스장을 6개월 등록했다.



한 3주동안 점심 식판에 밥대신 샐러드 가득 채우고 반찬은 평소 먹던대로 담아서 먹었다.



그리고 난 107키로가 되었다.


하... 시X...



.

3. 실패 원인 분석



1) 식습관

아침은 거르고 점심은 구내식당에서 샐러드와 고기류를 먹고 저녁은 구내식당에서 먹거나 술

아침을 거른것과 술을 퍼마신것.


그리고 


'코끼리도 풀만 먹는다'


역시.. 야채고 나발이고 많이 먹으면 살이 찐다. 게다가 드레싱도 듬뿍듬뿍 부어서 먹었다.


살이 빠질리가 없지..




2)헬스 등록하고 안감

헬스 등록후 2주일나가고 한달동안 쭉 쉬었다. 그러니 살이 찔수 밖에..




4. 다음 다이어트 도전 과제

1) 술


진짜 술은 꼭 끊도록 하자. 이 글 보는 사람들은 대부분이 술을 좋아 할 것이다.

왜냐하면 진짜 술을 안먹는데 100kg이 넘는다면 그건 이 글을 봐야 하는게 아니라 병원을 가야 하지 않을까?


알콜은 지방크기가 작아서 축적되지 않는다고 한다. 그런데 술마시면 살찌는 이유는 안주 떄문


술에 들어있는 알콜?지방?  암튼 살찌게 하는 얘네들은 휘발성이라서 마시면 바로바로 사용을 한단다.


그러니 당장 쓸 에너지를 펑펑쓰고 있으니 그외에 들어온 안주들은 모조리 지방으로 축적이 된다고 한다.


그러고보니 20살때 1달동안 물김치나 미역냉국에 소주만 하루에 두병씩 마셨던적이 있는데 1달만에 4키로가 빠지더라


그런데 그거 다 수분이 빠진거라서 사람 완전 개폐인 몰골 피부 썩어들어갔음


절대 시도하지 말것



2) 식이


아침밥 챙겨먹고 점심은 구내식당에서 적당히 먹고 저녁을 조금 먹어야 한다..

당연한 얘기지만 가장 지키기 힘든 항목...


배고파서 배를 봤는데 배가 불러있더라는 이야기를 항상 기억하자.




일단 지금 4차 다이어트 시도중이다. 한 삼일 되었는데 식단 보니 역시 나는 글른놈인것 같다.





이제부터 다이어트 관련글은


아래의 블로그에서 연재 하도록 하겠습니다.


기타치는 개발자의 야매로 사람답게 살기




티스토리 주제가 명확한 글을 쓰는 방법


1. 제목과 본문을 구별해 준다


첫줄의 '티스토리 주제가 명확한 글을 쓰는 방법' 이라는 타이틀은 컨트롤+1 키를 눌러 머리말1 이 되었다

'1.제목과 본문을 구별해 준다' 라는 두번째줄은 컨트롤+2를 눌러 머리말2가 되었다

아래의 '1)일관된 주제로 글을 쓴다'는 컨트롤+3을 눌러 머리말3이 되었다.

이렇게 글이 구조화 되었을떄 사람과 봇 모두가 이 글의 내용을 더 편하게 알 수 있다.

그리고 현재 이 본문글은 '본문' 으로 되어 있다.

즉 제목과 본문을 봇이 명확하게 구분지을 수 있도록 글을 쓰는 것이 중요하다..


2. 이 글의 주제가 무엇인지 명확하게 쓴다


1) 일관된 주제로 글을 쓴다

하나의 포스팅에서 여러가지 주제가 난입 한다면 이 글이 무엇을 위한 글인지 알 수 없게 된다.
만약 주제가 명확한 글을 쓰는 방법에 갑자기 나의 일상 이야기나 HTML태그에 대한 내용이 들어가면
이 글이 일상글인지 html태그 사용방법에 관한 글인인지 주제가 명확한 글을 쓰는 것인지 알 수 없게된다.
그런 글은 영양가가 없다는 글 이라고 판단하고 검색순위에서 밀리게 되며 유입자들에게도 외면 받는
글이 되어 버린다. 

2) 주제와 관련된 단어를 반복해서 사용한다


이 포스팅에선 글쓰기, 주제, 명확, 이 세가지 단어가 많이 반복되어 사용된다.
그렇다면 구글봇이나 네이버봇은 이 글이 글쓰기, 주제, 명확 이라는 단어와 관련된 글이라는 것을
유추하거나 카테고리로 나눌 수 있으며 반복되는 사용으로 글을 읽는 사람 또한 특정 주제에 대한 글이라는 것을
알 수 있게 된다.

3. 다른 사이트의 글을 링크하거나 url 주소를 적는다


어떻게 보면 자료의 신빙성 혹은 연관성을 찾는데 도움을 주기 때문에 이 글이 어떤 글을 참고하여 작성 하였는지
혹은 해당 URL을 타고 들어간 봇이 그 url의 글과 현재 이 글과의 연관성을 파악해 좀더 명확하게 카테고리를
구분 지을 수 있게 된다.


위 링크의 글은 아주 좋은 예시가 될 수 있다. 좋은 글이 어떤 글인지 

한가지 주제로 명확하게 글을 쓰는 방법에 대해서 소개 하고 있다.

저런 링크가 있다면 봇과 사용자들은 이 포스팅이 어떻게 글을 쓰는 것이 좋은지에 대한 포스팅이라는 것을 

파악하기 쉽울 것이다.


4. 적절한 태그 사용


티스토리의 글쓰기 우측을 보면 태그를 입력하는 공간이 있다.
그 태그에 현재 이 글과 관련된 주제의 단어들을 입력 하면 검색에 더 유리하며
이 글이 어떤 주제의 글인지 더 쉽게 파악 하고 분류 할 수 있게 된다.
예를들어 이 글의 태그를 단다면
주제, 명확, 글쓰기, 좋은글 , 방법, 글쓰는 방법, 명확한 주제  정도가 될 수 있다.

그렇다면 이 글을 보고 많은 사람들이 명확하게 글을 쓸 수 있게 되었으면 좋겠다.




[centOS] PHP 5.2 make 설치 오류 해결 방법


dereferencing pointer to incomplete type RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);


php 파일 풀고나서 make 명령어를 치면 저런 에러가 뿜어져 나온다



보안관련 문제인지 일단 php에서 5.2버전은 지원을 중단했기 때문에 나타나는 에러다



https://code.google.com/p/php52-backports/issues/detail?id=16

여기서 패치파일 다운 받고


패치파일을 php 소스 경로에다가 옮겨놓은 다음


# patch -p0 < ./libxml29_compat.patch 

이 명령어를 치면 된다


centos 7 patch 명령을 찾을 수 없습니다 라는 메세지가 나타난다면




#sudo yum install patch


이 명령어로 패치 설치한후


위의 명령어를 실행하면 정상 작동이 된다.






[안드로이드] FCM 화면 깨우기 화면 켜지게 하는 방법

2017/07/10 - [Yame Programmer/Android] - [안드로이드] FCM 푸시메세지 웹서버(JAVA)에서 보내기

2017/07/10 - [Yame Programmer/Android] - [안드로이드] FCM 토큰 저장방법 개별 보내는 방법 SharedPreferences 사용

2017/07/12 - [Yame Programmer/Android] - [안드로이드] FCM 백그라운드에서 진동 오도록 하는 방법




후.. FCM메세지를 노티피케이션이 아니라 data로 날리도록 하니


지금까지 삽질해도 안되던 화면 깨우기가 되었다..


진짜 아무것도 모르는 상태로 근본없이 맨땅에 헤딩하니 좀 지친다



화면 깨우기는 간단하다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void onMessageReceived(RemoteMessage remoteMessage) {
        //추가한것
       // sendNotification(remoteMessage.getData().get("message"));
 
        // 이거 추가 하면 
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE );
        PowerManager.WakeLock wakeLock = pm.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK
                | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG" );
        wakeLock.acquire(3000);
 
 
        String title = remoteMessage.getData().get("title");
        String body = remoteMessage.getData().get("body");
        sendNotification(title, body);
    }
cs



이렇게 6,7,8,9,10 번 라인을 추가해주면 된다


그런데 저기에 있는 SCREEN_DIM_WAKE_LOCK는 deprecated 되었다



아 몰랑 그냥 쓸거야!


화면 켜지게 하면 된다구!


지금 안드로이드 버전에서 권장하는 방법은 FLAG_KEEP_SCREEN_ON


이거 쓰라고 하는데


사실 당장 뭐 어떻게 쓰는지도 잘 모르기도 하고


문서들을 찾아보니 뭐 밝게했다가 어둡게도 했다가도 하고 그런 여러가지 기능들이 있는것 같긴 한데


아직 다 써보진 못했다 PARTIAL_WAKE_LOCK 이런거라든가 FLAG_KEEP_SCRREN_ON


이런거 쓰라고 하는데


FLAG_KEEP_SCRREN_ON 얘는 어찌 써야할지 레이아웃에 걸어줘야 하는 애 같아서 못썻고


PARTIAL_WAKE_LOCK 이건 화면이 안켜진다. 그래서 저 위의 코드를 사용하기로 함.


물론 소스는 더 많이 있고 써보기도 했는데 백그라운드에서 안돌아갔던 문제 때문에


되는건지 모르겠고 다시 그 소스들 찾아가면서 해보긴 귀찮다.


그건 다음에 또 이런 어플 만들때 되면 해보도록 하자


아니면 해본 사람들이 댓글을 남겨준다면 더 고마울 것이다.






[안드로이드] FCM 백그라운드에서 진동 오도록 하는 방법






얼마전 포스팅에서 웹서버를 통해  FCM 메세지를 날리는 방법에 대해서 알아보았다


2017/07/10 - [Yame Programmer/Android] - [안드로이드] FCM 토큰 저장방법 개별 보내는 방법 SharedPreferences 사용

2017/07/10 - [Yame Programmer/Android] - [안드로이드] FCM 푸시메세지 웹서버(JAVA)에서 보내기



그런데 문제가 있었다.


어플을 켜놓은 상태에선 진동이 오는데


어플을 끄거나 화면을 끈 상태에선 진동알람도 안오고 화면이 켜지는 것도 안되서


알람이 온줄 모르는 상태가 되버린 것



이것때문에 얼마나 삽질을 했던가..



화면켜지는건 고사하고 아얘 어플 끈 상태에선


상단에 알람바만 조용히 생기고 애초에 onMessageReceived 여기서 지정해 놓은 것들이


아얘 안돌아 가는 것 같았다


삽질을 하다가


결국 스택오버 형님들의 글에서 답을 찾았다


저번 포스팅을 보면  웹서버에서 FCM요청을 할떄



1
2
3
4
5
6
7
8
JSONObject root = new JSONObject();
                JSONObject notification = new JSONObject();
                notification.put("body""공조기 장애 현재상태 : OFF");
                notification.put("title""알림 입니다.");
                notification.put("icon""ic_message");
                root.put("notification", notification);
                root.put("to", token);
                root.put("click_action""OPEN_ACTIVITY");
cs




이런식으로 보냈었는데 6번라인의저 노티피케이션이 문제였다.


노티피케이션으로 날려주면 onMessageReceived가 실행이 안된단다


그래서 저 노티피케이션을 data로 바꾸어 주었다



1
2
3
4
5
6
7
8
                JSONObject root = new JSONObject();
                JSONObject notification = new JSONObject();
                notification.put("body""공조기 장애 현재상태 : OFF");
                notification.put("title""알림 입니다.");
                notification.put("icon""ic_message");
                root.put("data", notification);
                root.put("to", token);
                root.put("click_action""OPEN_ACTIVITY"); // click_action 추가!
cs



이렇게 바꾸고 나니 백그라운드 상태에서도 설정해놓은 vibrate대로 진동도 잘온다!!


화면켜지는것까진 바라지도 않는다 


일단 사용자한테 알람이 왔다고 알리기만 하면 되니까



그렇다면 안드로이드 에서도


받는 부분의 메세지를 다르게 받을 필요가 있었다



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
public void onMessageReceived(RemoteMessage remoteMessage) {
        //추가한것
       // sendNotification(remoteMessage.getData().get("message"));
        
        // 이렇게 데이터에 있는걸 키값으로 뽑아 쓰면 된다.
        String title = remoteMessage.getData().get("title");
        String body = remoteMessage.getData().get("body");
        sendNotification(title, body);
    }
 
    private void sendNotification(String title, String body) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
        PendingIntent pendingIntent = PendingIntent.getActivity(this0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);
 
        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(body)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setVibrate(new long[]{10001000})
                .setLights(Color.BLUE,1,1)
                .setContentIntent(pendingIntent);
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
 
    }
cs



이렇게 코드를 바꿔주면 된다


기존 코드에서 6,7번 라인과 11번읜 매개변수만 바꿔주면 끝!



후.. 이제 다시 화면도 켜지게 하는 방법을 찾아 떠나보도록 하자....

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

방법 찾았음 ㅋ


2017/07/12 - [Yame Programmer/Android] - [안드로이드] FCM 화면 깨우기 화면 켜지게 하는 방법




 

[안드로이드] FCM 토큰 저장방법 개별 보내는 방법 SharedPreferences 사용 


이전 포스팅은 걍 설치한 사람들한테 죄다 다 보내는 방법이었다.


2017/07/10 - [Yame Programmer/Android] - [안드로이드] FCM 푸시메세지 웹서버에서 보내기




그런데 우린 특정인들에게만 보내고 싶을때가 있다



그런데 망할 네이티브와 웹뷰간의 세션공유도 어렵고 쿠키가져오는것도 뭔말인지도 모르겠고


3일을 삽질하다가 그냥 방법을 바꿔버리기로 했다



웹뷰에 있는 js를 안드로이드 네이티브에서 호출을 할 수 있다는걸 알았기에



안드로이드에서 토큰값을 JS로 날려주고 JS에선 사용자ID값과 토큰을 같이 서버로 날려 저장하는


방식을 사용하기로 한다.



우선 안드로이드에서 JS를 호출 하는 방법인다. 물론 변수도 같이 날려줄 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        // 웹뷰 셋팅팅
       mWebView = (WebView)findViewById(webView);
 
        // 자바스크립트 사용을 반드시 true로 해야 한다
        mWebView.getSettings().setJavaScriptEnabled(true);
 
        mWebView.loadUrl(myUrl+"/mobile/login");
        mWebView.setWebChromeClient(new WebChromeClient());
        mWebView.setWebViewClient(new WebViewClientClass());
 
        mWebView.addJavascriptInterface(new AndroidBridge(), "android");
        //추가한 라인
        FirebaseMessaging.getInstance().subscribeToTopic("ALL");
        Log.d("아오","테스트");
 
    }
cs



10번 라인을 꼭 추가해준 후



1
mWebView.loadUrl("javascript:setMessage('"+token+"')");
cs


URL요청하는 부분에다가 저거 한줄 넣으면


해당 페이지의  setMessage 라는 펑션이 작동 한다!!!! 물론 저 안에 토큰이라는 변수값도 함께!!!



당연히 js에는



1
2
3
4
5
6
7
8
9
10
11
12
13
function setMessage(arg) {
    // alert(arg);
    var param = {};
    param.token = arg;
    gPost("/저장하러 날릴 URL"
            ,param
            , function(response){
                if(!response.result){
                    alert("디바이스 정보 저장 오류 어플리케이션을 다시 시작해 주십시오");
                }
            });
     
cs



이런식으로 같은 이름의 펑션을 만들어 주어야 한다.





이렇게 하면 토큰과 사용자 ID를 묶어서 저장할 수가 있다.




여기서 문제는 저 토큰값을 어떻게 가지고 오느냐이다.



토큰값은 어플 설치될때 한번 생성되는데 그걸 어디다 저장할까?


토큰 한줄 저장하자고 로컬DB사용하는건 좀 오버하는거 같다


그래서 찾아낸것이


SharedPreferences  바로 이것!@!!!!!!



우왕... 개짱.. 짱짱맨.. 그냥 데이터 파일로 저장하는거임



다시 안드로이드의 토큰생성하는 곳을 가보자



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
 private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
 
        // 만들어진 토큰을 저장한다!!!
        SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("token", token);
        editor.commit();
        // 여기까지!!!
 
        OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("Token", token)
                .build();
 
        //request
        Request request = new Request.Builder()
                .url("이제 이건 노신경")
                .post(body)
                .build();
 
        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
cs



5~8번 라인을 추가해주도록 하자 


그럼 불러올땐


1
2
3
4
   // 저장해놨던 토큰값 가져와서 전달
   SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
   String token =  pref.getString("token""");
   mWebView.loadUrl("javascript:setMessage('"+token+"')");
cs



이렇게 토큰이라는 이름으로 불러오면 된다!!!


그러면 끝!!!


이제 사용자 아이디와토큰을 묶어서 디비에 저장해놓고


보내고 싶은사람한테 골라서 보내면 된다!!



[안드로이드] FCM 웹(JAVA)서버에서 푸시메세지 보내기


안드로이드의 기존 GCM에서 FCM으로 바뀌었다


구글 클라우드 메세지에서 파이어베이스 클라우드 메세지로 바뀐건진 정확히 모르겠지만..



일단 뜬금없이 웹개발하다가 갑자기 회사에서 안드로이드 개발할 일이 생겼지만


웹뷰로 때워버리자! 라고 외친 후 만들어 놓고 보니 안드로이드 알림 메세지가 가야 한단다...



하....


그래서 뭐 삽질좀 하고 여기저기 뒤적뒤적이면서 구현을 했다




일단 가장 먼저


https://console.firebase.google.com/u/0/


당연히 구글 아이디는 있을것이지 콘솔 파이어베이스로 들어가


알람메세지 구현알 어플을 등록해준다.


이곳의 도움을 많이 받았다. 기초 설정은 여기 보고 따라하자


사실 저 블로그만 봐도


어지간하면 구현 가능하다.



진짜 생각보다 좀 간단하다.



1. Android JAVA 



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
import android.content.SharedPreferences;
import android.util.Log;
 
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
 
import java.io.IOException;
 
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
 
 
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
 
    private static final String TAG = "MyFirebaseIIDService";
 
    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */
    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // 설치할때 여기서 토큰을 자동으로 만들어 준다
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
 
        // 생성한 토큰을 서버로 날려서 저장하기 위해서 만든거
        sendRegistrationToServer(refreshedToken);
    }
    
    private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
 
        // OKHTTP를 이용해 웹서버로 토큰값을 날려준다. 
        OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("Token", token)
                .build();
 
        //request
        Request request = new Request.Builder()
                .url("토큰 저장할라고 보낼 URL")
                .post(body)
                .build();
 
        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
}
cs




여기서 우리가 잘 봐야 할 건


30번 라인과 


37번라인의 sendRegistrationToServer 메소드다


30번라인에서 토큰을 생성하는데 여기선 어플을 설치할때 한번 생성한다.


그럼 만들어지자마자 


37번라인 메소드로 날려서 HTTP로 전송한다.


그럼 웹서버에서 저 토큰을 받고 저장을 하게 되고


그 해당 토큰으로 메세지를 날려주면 되는 것이다.




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
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
 
import com.google.firebase.messaging.RemoteMessage;
 
 
public class MyFirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {
    private static final String TAG = "FirebaseMsgService";
 
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
 
        //추가한것
        sendNotification(remoteMessage.getData().get("message"));
    }
 
    private void sendNotification(String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);
 
        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("FCM Push Test"// 이부분은 어플 켜놓은 상태에서 알림 메세지 받으면 저 텍스트로 띄워준다.
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);
 
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
 
}
 
cs

MyFirebaseMessagingService.java 얘는 알림메세지를 받았을때 처리하는건데

사실 딱히 건들일거 없이 그대로 사용 하면 된다.








일단 저 블로그에서


MyFirebaseInstanceIDService.java 와

MyFirebaseMessagingService.java



이 두개를 구현했다면 




여기로 들어와서 앱단위로 앱선택하고 보내면


모든 앱 설치자들에게 메세지가 날아간다.



하지만 우린 웹서버에서 푸시메세지를 날려주고 싶을 것이다.


알람이라면 뭐 값이 변한다거나 새로운 정보가 등록 되었을때 날려줘야 하니까


그때마다 저기 접속해서 날려주기엔 너무 귀찮으니까 분명히


웹서버에서 인터벌을 돌리든 트리거를 걸든 해서 웹서버에서 날려주고 싶을 것이다


그런데 웹서버에서 날려주는건


잘 안나와있고 복사 붙여넣기 해도 안되는 경우도 있고 하니까


내가 해서 성공한 코드를 보자










2. JAVA Web Server 



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
@RequestMapping(value="mobile/sendFCM")
    public String index(Model model, HttpServletRequest request, HttpSession session, MobileTokenVO vo)throws Exception{
            
            List<MobileTokenVO> tokenList = fcmService.loadFCMInfoList(vo); 
            
                String token = tokenList.get(count).getDEVICE_ID();
                
                final String apiKey = "파이어 베이스의 서버 API키를 여기에 넣는다";
                URL url = new URL("https://fcm.googleapis.com/fcm/send");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type""application/json");
                conn.setRequestProperty("Authorization""key=" + apiKey);
 
                conn.setDoOutput(true);
                
                String userId =(String) request.getSession().getAttribute("ssUserId");
 
                // 이렇게 보내면 주제를 ALL로 지정해놓은 모든 사람들한테 알림을 날려준다.
                String input = "{\"notification\" : {\"title\" : \"여기다 제목 넣기 \", \"body\" : \"여기다 내용 넣기\"}, \"to\":\"/topics/ALL\"}";
                
                // 이걸로 보내면 특정 토큰을 가지고있는 어플에만 알림을 날려준다  위에 둘중에 한개 골라서 날려주자
                String input = "{\"notification\" : {\"title\" : \" 여기다 제목넣기 \", \"body\" : \"여기다 내용 넣기\"}, \"to\":\" 여기가 받을 사람 토큰  \"}";
 
                OutputStream os = conn.getOutputStream();
                
                // 서버에서 날려서 한글 깨지는 사람은 아래처럼  UTF-8로 인코딩해서 날려주자
                os.write(input.getBytes("UTF-8"));
                os.flush();
                os.close();
 
                int responseCode = conn.getResponseCode();
                System.out.println("\nSending 'POST' request to URL : " + url);
                System.out.println("Post parameters : " + input);
                System.out.println("Response Code : " + responseCode);
                
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
 
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                // print result
                System.out.println(response.toString());
                
 
        return "jsonView";
    }
cs



위의 코드처럼 쓰면 된다.



8번 라인의 API키는 






저 파이어베이스 콘솔에서 빨간동그라미 누르고 프로젝트 설정의 클라우드 메세징으로 가면


서버키가 나와있다 그 서버키를 넣으면 된다. 




그런데 20번 21번 라인의  주제가 ALL인걸 어떻게 지정 하냐고?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        // 웹뷰 셋팅팅
       mWebView = (WebView)findViewById(webView);
        mWebView.getSettings().setJavaScriptEnabled(true);
 
        mWebView.loadUrl(myUrl+"/mobile/login");
        mWebView.setWebChromeClient(new WebChromeClient());
        mWebView.setWebViewClient(new WebViewClientClass());
 
        mWebView.addJavascriptInterface(new AndroidBridge(), "android");
 
 
        //이렇게 ALL 추가 하면 이 디바이스는 ALL을 구독한다는 얘기가 된다.
        FirebaseMessaging.getInstance().subscribeToTopic("ALL");
 
    }
cs



안드로이드의 MainActivity.java 의 oncreate에다가 저 18번 라인을 추가 해주자


그런데 주제 등록은 즉시 안되고 몇시간 기다리거나 몇일 기다려야 등록 되는 경우도


있다고 하니까 급하게 하진 말자.




그리고 24번 라인에 들어가는 토큰은 MyFirebaseInstanceIDService.java 의 36번 메소드에 날려준 값이다


여기까지가 기초적인 FCM을 이용한 메세지 보내는 방법이다!


다음강좌는


저 토큰아이디를 어떻게 사용자 ID랑 묶어서 저장하고 원하는 사용자에게


보낼 수 있는지 알아보자



2017/07/10 - [Yame Programmer/Android] - [안드로이드] FCM 토큰 저장방법 개별 보내는 방법 SharedPreferences 사용



[게임] 온라인 텍스트 머드 게임 해적 - 타락하는 인간


구글 스토어 다운로드



Node.js와 React.js로 게임을 만들어 보았다


예전 안드로이드 공부 할떄 만들었던 텍스트 게임을


온라인 버전으로 만든 것인데



예전 PC통신 시절 단군의땅이나 퇴마록 같은 텍스트 머드게임이다.



간단히 게임 소개를 하자면


직업 암살자 마법사 검사  이렇게 3가지가 있다.


레벨 15가 되면 개인 전용 무기를 만들어 준다 


무기 이름과 설명을 사용자가 지정 할 수 있는 것이다.


레벨 40이 되면 전직을 하고 새로운 스킬을 배우게 된다.



레벨별로 사용 가능한 스킬이 있고


상점기능 있다


온라인이니 전채채팅 귓속말 기능도 있고


파티사냥 기능도 있다.



보스몬스터를 잡으면 유니크 아이템도 드랍되고..


무기를 강화하거나 옵션을 변경 할 수도 있다.




처음 시작은 Node.js와 React.js 를 공부하려고 간단하게


만들었다가


하다보니 좋아하는 친구들도 있고 벌써 고레벨까지 키운 친구들도 있고


유저들의 요구사항을 들어주다보니 볼륨이 조금씩 커져갔다;;



그래서 어차피 만든김에 스토어에 올려보자 하고


구글 스토어 개발자 등록한다음 안드로이드 웹뷰 씌워서


스토어에 올렸다 ㅋㅋㅋ


사실 리액트지만 모바일에 최적화된건 아니다 메모리도 많이 잡아먹고;;


최적화를 해야 하는데 좀 막막하긴 하다 ㅋㅋㅋ


원활히 즐기려면 PC환경에서


https://cheesu001.herokuapp.com/


이 주소로 들어가서 하면 된다 



게임을 즐기는 유저들끼리 카카오톡 오픈채팅 열었습니다.


텍스트 머드 << 검색하거나

the pirates << 검색하면 나와요


오픈채팅 접속 링크













[레슨] 기타 초보 기초 레슨 1 [코드 체인지]




최고의 화정 기타학원! 브레인기타학원의 야심작!

쪼심자 기타레슨!


'쪼심자 기타레슨' 은 기타를 '쉽게 연습하는 방법' 을 알려드리는 영상입니다!

마구마구 많이 치는 것도 중요하지만 '얼마나 어떻게 치는가' 라는 부분에 초점을 맞춘 영상입니다!

궁금한 부분에 해답이 되시길 바라며

쪼심이와 함께 시작!



먼저 영상을 봐주세요! 길지 않은 영상이니

지루하지 않으 실 겁니다!



1. 기초 동영상 강좌

 




2. 코드 체인지, 코드 쉽게 바꾸는 방법





초보분들이 기타를 연습하며 가장 어렵다고 느끼는 부분이 

코드 바꾸기 

일거라고 생각해요


특히나 생각보다 왜 초반에 나오는지 모르겠는 

B7코드



역시나 왜 인지는 모르겠지만

은근히 어려운 

D코드




이 코드를 가지고 어려운 코드 바꾸는 연습을

어떻게 효율 적으로 할 수 있는지 살펴보겠습니다.


그나저나 쪼심이는 손톱을 꼭 잘라야 하겠군요





사실 조금도 어렵지 않아요.


첫번째는 당연히 코드를 외우는 것이겠죠?




두번째로 외운 코드의 손가락을 어떤 순서로 잡을지 정해볼거에요




이런방법입니다!









순서는 임의적으로  정하면 되겠으나

가능하면 코드의 가장 높은줄에서부터

ex) G코드라면 6번줄에서 부터

순서를 정해주시면 

조금 더 음손실을 막으실 수 있을거에요!



조금 더 자세히는 영상을 봐주세요!





마지막으로 리듬에 구령을 붙여 

 우리가 미리 정해놓은 손가락 순서대로

연주 연습을 합니다!!







물론 목표는 완벽하게 한번에 잡는 것이겠지만


이렇게 천천히 하나씩 연습하다 보면

금방 금방 목표에 다가가실 수 있을 거에요.



모두에게 도움이 되셨길 바라며! 

오늘은 여기까지이!








학원 연락처 : 031-970-2322 010-2070-5765

+ Recent posts