대만 타이페이 4박 5일 자유여행 4일차!! (9/10)

지난번에 비가와서 못찍은 LOVE 사진을 찍기 위해 다시 타이페이101을 방문했어요!

이날도 역시 타이페이101 꼭대기가 안보일 만큼 날이 좋지 않았어요ㅠ



대만와서 꼭 사진 찍어야 한다는 LOVE 조각상! 저도 찍었습니다 ㅎㅎ



그리고 먹어보고 싶던 미슐렝 가이드에 등록된 음식점!

이름은 몰라요 ㅎㅎㅎ


오리고기 인줄알았는데 닭고기였습니다ㅠ

훈제 닭고기에 인스턴스 누들 그래도 맛있었어요! 무엇보다도 반찬으로 나온

김치가 땅콩이 곁들였는지 고소하고 맛있었어요!



그리고 타이페이101과 연결된 쇼핑 센타로 고고~



이제 곧 한국에도 들어올 GU 에서 득템 하고 스타벅스 아메리카도 한잔.



그리고 바로 KLOOK 에서 예매한 예스지 야경투어 출발 했습니다.



가장 먼저 도착한 예류 해안공원이에요!

사진 찍을 것도 많고 예뻐요.


여기도 야시장처럼은 아니지만 쇼핑 거리가 있어요.


배고파서 먹은 소라? 랑 소세지 입니다.

소세지는 마늘이랑 같이 먹으면 엄청 꿀맛이에요.



그리고 예스지 투어 두번째! 스펀 입니다.

여기는 닭날개 볶음밥이랑 천등날리기가 유명해요! 그리고 기찻길도!



운좋게 본 기차 입니다. 별도의 안전장치가 없어서 알아서 비켜야 해요!




천등은 단색, 4가지색, 8가지 색이 있어요.

저는 4가지 색을 선택 했는데 색상 마다 의미가 다르다고 합니다.

의미는 아래 이미지 보고 확인하셔요~ 가겨은 4컬러 천등이 200 대만달러!



여기서 천등을 행거에 걸고 소원을 쓰면 됩니다.



천등 날리고 먹은 닭날개 볶음밥!

맛있을걸로 기대 했는데 생각보다 음....

이마트 닭날개 볶음밥도 먹어보고 싶어졌어요.



스펀 다음으로 도착한 지우펀이에요!

여기는 꽃보다 할배, 센과치히로 배경으로 유명하죠?


대만의 명물 땅콩아이스크림도 먹고~


취두부도 도전해서 다 먹었습니다.

냄새는 많이 나지만 먹으면 청국장에 조린 두부 같아요. 매운 고추랑 같이 먹었는데

흰쌀밥이랑 먹으면 정말 맛있을거 같습니다 +_+



예스지 야경 버스 투어는 지우펀 투어를 끝으로 라오허제 야시장에서 내려주는데요.

여기도 대만에서 유명한 야시장 입니다.!


1인용 곱창 샤브샤브 입니다.

가격은 한국돈으로 4천원 정도 했던거 같은데 한국에 있었다면 매일 먹으러 갔을거에요.ㅠㅠ


소.... 인데 이건 좀 짰습니다.

큐브 스테이크도 먹고 학센도 먹었는데 사진이 없어요ㅠㅠ



대만 타이페이 4박 5일 자유여행 3일차 (9/9)

오늘은 일어나자 말자 미미크래커를 사러 융캉에 다시 왔습니다.

매주 월요일에 휴무라고 하여 일요일인 오늘 재빨리 왔습니다 ㅎㅎ


미미크레커 사고 바로 티엔징 총좌빙 먹으로 고고!

개인적으로 총좌빙은 여기 보다 숙소 근처에서 먹었던게 더 맛있었습니다ㅠ



입가심으로 마신 스무시 신메뉴 흑설탕 라떼!



그리고 대만가면 꼭 받아야 한다는 샴푸 마사지!

샴푸 마사지는 어깨 마사지 + 두피 마사지 입니다. 가격은 300 대만달러 입니다.



유명한 시먼딩 진천미 식당 입니다.

너무나 유명해서 바로 앞에 2호점 까지 있어요~



밥에 반찬만 4가지를 시켰는데

파볶음이랑 튀김두부가 유명한데 파볶음은 제 입맛엔 별로였습니다.

고기 반찬도 대부분 짜고ㅠㅠ



이날 우라이 온천 마을이나 단수이 가려고 했는데

가는걸 포기하고 스린야시장만 갔어요~

스린야시장은 대만에서 가장 큰 야시장 이에요!!


인형뽑기 기계에 들어있는 미니어처 술


이름 모를 누들.. 땅콩 소스에 이것도 맛있어요.


처음 본 메추리알 후라이 꼬치


줄이 가장 길었던 소시지!

하나는 소시지고 다른 하나는 찹쌀이에요!


크랜베리와 레몬을 섞은 음료수 완전 맛있어요


잡은 새우를 바로 앞에서 구워 줍니다.


대만의 젓가락 장인입니다. 저도 사왔어요!


유명한 지파이는 너무나 커서 먹기가 어려울 거 같아 포기 했습니다.



숙소에서 쉬다가 배고파서 먹은 대만 빅맥입니다!



대만에서 처음으로 마신 맥주!

시먼띵 역 근처에 이렇게 분위기 좋은 술집이 있을 줄이야..



대만 타이페이 자유여행 2일차! (9/8)

오늘도 역시 비가 오락가락 합니다ㅠㅠ



둘째날 첫 행선지는 화산1914입니다.

여기는 공장지대였는데 카페로 탈바꿈 했다고 해요~

각종 행사도 많이 하고 있었습니다.



우더랜드 갈려고 했는데 잘못 티켓팅한 가챠플래닛... 

그래도 재밌게 놀다 왔습니다 ㅋㅋ


예쁜곳에서 인생샷도 찍고~



우여 곡절 끝에 도착한 우더랜드!!



아이들이 놀 수 있는 공간도 있습니다. 여기는 유료인 것 같아요.



우더랜드는 오르골을 파는 곳이에요.

안쪽에는 직접 하나하나 만들어 볼 수 있는 공간도 있습니다~~



다시 숙소로 돌아오는 길에 들린 우육면집!

여기 인기 있는지 줄이 엄청 났습니다. 뉴러미엔 짱맛!

(우육면은 면이 가는게 더 맛있습니다.)



그리고 다시 나와 중정기념관(장제스기념관) 으로 왔습니다!

여긴 꾀나 넓어요!



그리고 장제스 기념관에서 조금만 걸으면 융캉제가 나옵니다.

융캉제에는 다양한 먹거리가 있죠!


여기는 융캉제에서 유명한 스무시 망고빙수 가게 입니다!



여기는 맞은편에 있는 유명한 총좌빙 티엔진 입니다.

오늘은 배가 불러서 안먹고 다음날 먹었죠 ㅎㅎ



그리고 융캉제에 딘타이펑 본점과 까오지 본점이 있어요.

저희는 딘타이펑 본점에 가서 먹었는데 한국사람이 엄청 많더라구요.

대만 사람들은 까오지에서 많이 먹는다니 여러분들은 바로 옆 까오지로 가셔요!


딘타이펑의 새우볶음밥 입니다.

그냥 여기선 샤오롱바오만 드시라고 합니다.


샤오롱 바오!


새우 샤오롱바오!


1층에 어마무시한 직원분들이 샤오롱바오를 빗고 계셨어요!



여기가 바로 까오지 본점 입니다.

우리나라에는 딘타이펑 보다 좀 덜 유명하죠?



장소를 옮겨서 타이페이101 (타이페이 워너원 이라고 읽습니다.) 왔습니다.

대만이 해발이 높아서 인가 날이 안좋으면 꼭대기에 구름이 많이 끼더라구요


이날은 날씨가 좋지 않았지만 그래도 왔으면 올라가봐야겠쬬?

티켓은 klook 에서 바우처로 구매 하시면 더욱 저렴합니다.


티켓팅을 하면 각종 할인권을 주는데 하나도 사용하진 않았습니다.


날씨가 좋지 않아서 야경이 이렇게 밖에 안보이네요ㅠ


이거는 건물의 균형을 잡아 주는 추라고 합니다.



날씨가 안좋아서 91층 야외전망대는 개방을 안했습니다ㅠ



집에 오는길에 잘못 들린 대만 타이페이 메인스테이션? 내부 웅장합니다.

밤늦은 시간인데 다음날 버스를 기다리는지 이렇게 자리를 깔고 앉아 계십니다.



숙소 들어오기 마지막에 먹은 컵라면 맛있어요 ㅎㅎ


대만 타이페이 자유여행 1일차!! (9/7)

가는날 한국은 날씨가 엄청 좋았습니다.



대만은 날씨가 좋지 않았습니다.

숙소는 타이페이 메인스테이션 근처로 잡았습니다! 숙소 위치는 여기가 젤 좋은것 같아요!

신광미츠비시백화점 옆이였는데 택시 기사님들은 신광미츠비시 백화점을 잘 모르시더라구요ㅠ



대만 곳곳에 있는 유명한 50전 밀크티!

한국 밀크티 보다 확실히 맛있습니다. 펄을 엄청 넣어 주시는데 펄도 한국보다 맛있어요!


가장 기본적이고 대표적인 밀크티!



타이페이 메인 스테이션에서 걸어서 갈 수 있는 시먼띵!

한국의 명동과 비슷하다고 합니다.



여기는 용산사, 까르푸 가는길에 있는 삼미식당!

블로그에 많이 설명해주고 있는 식당입니다. 그래서 한국사람들이 많고

직원들도 한국말 잘합니다. ㅋㅋㅋㅋ


대표 메뉴인 연어초밥 3P

이것만 먹어도 배부릅니다 ㄷㄷ


이건 그냥 그런 닭꼬치


이건 안먹어도 되는 두부튀김

두부는 부드러운데 그냥 그래요.




드디어 도착한 용산사 입니다.

들어가면 우측에 무료로 향 1개를 줍니다. 향을 키고 각 신에게 가셔서

절을 3번씩 하고 돌아오시면 되요.


※ 점괴 보는 방법!!!!!!

들어가자마자 있는 길쭉한 나무를 하나 뽑고 숫자를 확인하고

뒤에있는 메뉴얼 영어버전을 읽으시면 됩니다.



다시 시먼띵으로 돌아와서 먹은 곱창국수!

걸죽하고 향이 좀 있는데 왜 이게 유명한지 모르겠습니다.




대망의 일정의 마무리 마라훠궈! 무한리필 입니다.

여기는 가격이 다른곳에 비해 비싼데도 불구하고 항상 사람이 많아요.

예약은 필수 입니다. 에어비엔비 잡으신다면 호스트에게 예약 해달라고 부탁 하셔요!


샤브샤브 고기는 다 생고기 입니다. 고기는 총 8종류에요.

4개씩 두번에 걸쳐서 한번씩 드셔 보시고, 나중에 맛있는걸로만 드셔요!


고기는 모두 생고기!


비싼 만큼 디저트도 후덜덜.


가격은 두명이서 세금 포함 1400 대만 달러 나왔습니다.

환율은 대만달러 100에 3800원 계산 하면 인당 26,100원 정도 나오네요.


우선 선행 작업이 필요 합니다. 아래 링크로 선행 작업을 완료 합니다.

1. python 설치, telegram bot 설정

  링크 바로가기

2. import 할 것들 install 하기

  pip install json

  pip install schedule

  pip install time

  pip install request


선행 작업이 완료 되었다면 아래와 같이 코딩된 파이썬 파일(telegram.py)을 생성합니다.

비트맥스의(https://www.bitmex.com) API 중 XBTUSD 값을 1분마다 텔레그램으로 보내는 코드 입니다.

(비트맥스가 아닌 다른 거래소도 API 제공하기 때문에 가능합니다. )

API 는 json 으로 보내주기 때문에 json 을 파싱하는 코드도 포함 되어 있습니다.


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
import urllib.request
import json
import requests
import schedule
import time
 
# 반복될 작업을 함수로 정의
def scd():
    # API 링크 가져와서 data 변수에 담기
    with urllib.request.urlopen("https://www.bitmex.com/api/v1/trade?symbol=XBTUSD&count=1&reverse=true") as url:
        data = url.read()
    # json 데이터로 j 변수에 담기
    j = json.loads(data)
 
    # teleurl 변수에 텔레그램 botfather 한테 받은 자신의 API 넣기
     
    # 로그 찍어보기(지워도 됨)
    print(j[0]["symbol"] + " : " + str(j[0]["price"]))
 
    # 챗 id 와 symbol : price 값을 텔레그램에 보내기
    params = {'chat_id': '-1001243756825', 'text': j[0]["symbol"] + " : " + str(j[0]["price"])}
     
    # 텔레그램으로 메시지 전송
    res = requests.get(teleurl, params=params)
 
# 스케쥴 설정 매분마다 실행
schedule.every().minute.do(scd)
 
# while 문을 사용하여 스케쥴러 실행
while 1:
    schedule.run_pending()
    time.sleep(60)




작성 완료 하였다면, 해당 파일이 있는 cmd 창을 열어 'python telegram.py' 실행 합니다.






그리고 텔레그램 채널에 메시지가 잘 오는지 확인 합니다.




잘 되시나요?

잘 안되신다면 댓글 달아주세요~~ 감사합니다.

# 파이썬 # python # telegram # 텔레그램



Python 을 사용하여 Telegram Message 를 보내려면 몇 가지의 선행 작업이 필요합니다.


1. python 설치

설치는 아래 미디움 블로그에 잘 나와있습니다^^

파이썬 설치방법 링크 바로가기


2. Telegram Bot 먼저 만들어야 합니다.

  2-1) 텔레그램 봇세팅

  2-2) 채널 만들기

  2-3) 테스트 메시지 보내기


3. pip install requests

  import 할 requests 를 해당경로에 install 해 줍니다.





위와 같은 작업이 완료 되셨다면 메시지 보내기 시작 하겠습니다.


아래와 같이 코딩된 파이썬 파일을 하나 생성 합니다. (붙여넣기 하시면 편합니다)

주의) 파이썬 코딩 시 세미콜론(;) 을 쓰지 않고 띄어쓰기(들여쓰기) 로 시작과 종료 시점을 구분 합니다. 아래 코딩 내용은 들여쓰기가 하나도 없으므로 코딩 시 들여쓰기 하시면 안됩니다.

예) msg.py


1
2
3
4
5
6
7
8
9
10
# requests import 해야 합니다(필수)
import requests
# 실행 로그
print("asdf")
# 2-3) 에서 받아온 값을 아래 bot..../ 까지 수정해 줍니다.
# params 변수에 챗 2-2) 에서 받은 챗 id 와 보낼 메시지를 넣습니다.
params = {'chat_id': '-1001243756825', 'text': 'asdf'}
# 아래 한줄 추가 하면 끝
res = requests.get(teleurl, params=params)


저장이 되었다면 cmd 창에서 저장된 폴더로 이동하여 아래와 같이 python msg.py 명령을 내립니다.




그리고 해당 채널에 메시지가 잘 도착했는지 확인을 해 봅니다.




메시지가 잘 보내지나요?


이해가 안되는 부분이 있으시다면 댓글로 남겨 주시면 보는대로 안내 도와드리겠습니다.



안드로이드 스튜디오 에서는 아래와 같이 작성 합니다.

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
     
 
// 먼저 volley 를 import 합니다.
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
 
// NODE 서버로 보내기 (보내는 함수 안에 아래 사용)
 
        // node 서버에 보낼 값 Json 형태로 만들기
    JSONObject requestJsonObject = new JSONObject();
    try {
        requestJsonObject.put("seq", seq);
 
    } catch(JSONException e) {
        e.printStackTrace();
    }
 
        // 2. RequestQueue 선언
        RequestQueue requestQueue = VolleyNetwork.getInstance(this).getRequestQueue();
     
        // 3. node 서버 IP와 받을 경로 수정 (http://192.168.20.123:3000/post)  하고,
    JsonObjectRequest R_Object = new JsonObjectRequest(Request.Method.POST,"http://192.168.20.123:3000/receiv", requestJsonObject, new Response.Listener<jsonobject>() {
     
        @Override
        public void onResponse(JSONObject response) {
            JSONArray J_JsonArray = new JSONArray();
            try {
                J_JsonArray = response.getJSONArray("results");
                JSONObject dataObj = J_JsonArray.getJSONObject(0);
     
                EditText etId = (EditText) findViewById(R.id.etId);
                EditText etName = (EditText) findViewById(R.id.etName);
     
                etId.setText(dataObj.getString("id"));
                etName.setText(dataObj.getString("name"));
     
            } catch(JSONException e) {
                e.printStackTrace();
            }
     
        }
    }, new Response.ErrorListener() {
     
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(context, "네트워크 연결 오류.", Toast.LENGTH_SHORT).show();
            Log.i("VolleyError", "Volley Error in receiv");
        }
    });
    requestQueue.add(R_Object);
 
 
// NODE 서버에서 받기 해당 함수 안에 아래 사용
 
        // 값 가져오기
    EditText etId = (EditText) findViewById(R.id.etId);
    EditText etName = (EditText) findViewById(R.id.etName);
    // 값 세팅
        Id = String.valueOf(etId.getText());
    Name = String.valueOf(etName.getText());
 
        // Json 형태로 만들기
    JSONObject requestJsonObject = new JSONObject();
    try {
        requestJsonObject.put("Id", Id);
        requestJsonObject.put("Name", Name);
 
    } catch(JSONException e) {
        e.printStackTrace();
    }
 
    final Context context = this;
 
        // volleynetwork 선언
    RequestQueue requestQueue = VolleyNetwork.getInstance(this).getRequestQueue();
    JsonObjectRequest S_Object = new JsonObjectRequest(Request.Method.POST, "http://192.168.20.123:3000/send", requestJsonObject, new Response.Listener<jsonobject>() {
        @Override
        public void onResponse(JSONObject response) {
                    // 받아올 값이 없으므로 빈란
        }
    }, new Response.ErrorListener() {
 
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(context, "네트워크 연결 오류.", Toast.LENGTH_SHORT).show();
            Log.i("VolleyError", "Volley Error in send");
        }
    });
        // 실행
    requestQueue.add(S_Object);
</jsonobject></jsonobject>


위에서 넘긴 값을 Node 서버에서 아래와 같이 처리 합니다.(receiv 의 경우)


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
     
    // index.js
server.post('/receiv', function(req, res) {
    // receiv 에서 넘긴 seq 값 변수로 담기
        var id = req.body.seq;
     
    var sql = 'SELECT a.id, a.name FROM  table as a where  a.seq = '+seq;  
    dbPool.getConnection(function(err, dbConnection) {
        if(err){
        dbConnection.release();
        console.log('ERROR: CANNOT CONNECT Mysql');
        console.log(err);
        response.status(500).send('Internal Server Error');
        }else{
        dbConnection.query(sqlgetMemList, function(err, result, fields) {
        if(err) {
          dbConnection.release();
          console.log('ERROR: CANNOT QUERY Mysql');
          console.log(err);
          res.status(500).send('Internal Server Error');
        } else {
             
            dbConnection.release();
        res.setHeader('Content-Type', 'application/json; charset=utf-8');
        res.status(200);
        res.json({"results": result});
        }
      });
    }
  });
});


서두 없이 작성해서 죄송합니다. 자세한 내용 원하시면 답변 부탁 드립니다.


node 서버와 mysql 연동 시

아래 이미지와 같이 datetime 컬럼이 '2018-08-18T05:07:58.000Z' 처럼 알아 볼 수 없게 나온다면.




config.js 파일에 아래 한줄 추가 해 주시면 됩니다

1
dateStrings: 'date'



적용 화면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     
var mysql = require('mysql');
 
var mysqlConfig = {
    host     : 'localhost',
    user     : 'root',
    password : 'password',
    port     : 3306,
    database : 'databases',
    connectionLimit: 500,
    waitForConnections: true,
    dateStrings: 'date'
};
     
     
}


결과 화면


솔리디티 1차 배열의 선언 및 입력하고 받아오기 위해 아래와 같이 간단한 코드를 구현 해 보았습니다.


C++ 이나 JAVA 를 해보셨다면 어렵지 않게 이해 하실 수 있으리라 생각 됩니다.


아래 코드를 Remix 에서 실행 해 보겠습니다.

※ Remix 실행 준비 하기는 아래 링크를 참조 하시면 됩니다.

http://hatpub.tistory.com/54


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     
pragma solidity ^0.4.24;
contract setArray {
     
    uint256[] DeptsId; //DeptsId 라는 정수형의 배열 선언
     
    // DeptsId 배열에 값 입력 할 함수 setDept
    function setDept(uint256 _deptid) public returns(uint256) {
        uint256 length = DeptsId.push(_deptid);
        // push 로 파라미터 값을 넣고 length 변수에 배열의 index 를 받아 와서 return 한다.
        return(length);
    }
     
    // DeptsId 배열의 값을 불러올 함수 getDept
    function getDept(uint256 _number) public view returns(uint256) {
        // 배열의 값을 불러 올때는 index 값으로
        return(DeptsId[_number]);
    }
     
     
}




1. setDept 영역에 1~3 까지 입력을 하였습니다.




2. getDept 영역에 index 값인 0~2 를 입력 해서 call 을 하시면 위에서 입력한 1~3 의 값이 나오는 것을 확인 할 수 있습니다.

웹에서는 for 문이나 while 문을 돌려서 사용하시면 모든 값 혹은 특정 값을 불러 올 수 있습니다.


지난 포스팅에 구조체(struct) 배열(array) 를 하였는데, 기초적인 일반 배열을 지나친 것 같아 기초적인 내용을 포스팅 하였습니다.

솔리디티로 이더리움을 개발 하는 날까지 열심히 공부 해 봅시다!

solidity, ethereum

솔리디티(solidity) 로 이더리움 개발하기.


솔리디티에는 C언어와 같이 구조체(struct) 를 만들어 사용 할 수 있습니다. 



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
     
pragma solidity ^0.4.24;
contract test {
 
    // Struct 생성
    struct Employee{
        uint256 EmpId;  // 사원번호
        string EmpName; // 사원명
        string DeptName; // 부서명
    }
 
    // 생성한 Employee Struct 를 배열로 사용하기 위해 Employees 라는 배열 선언.
    Employee[] Employees;
 
    // 생성된 구조체 배열에 값 담기.
    function setEmp(uint256 _EmpId, string _EmpName, string _DeptName) public {
        // 솔리디티 배열은 push 를 이용하여 배열에 값을 입력 한다.
        Employees.push(Employee(_EmpId, _EmpName, _DeptName));
    }
 
     
    // 구조체 배열의 값 불러오기.
    // 배열의 특정 값과 for 문을 이용하여 배열의 전체 값을 불러 오기 위해 _number 라는 파라미터를 입력 받는다.
    function getEmp(uint _number) public view returns(uint256 getEmpId, string getEmpName, string getDeptName){
        getEmpId = Employees[_number].EmpId;
        getEmpName = Employees[_number].EmpName;
        getDeptName = Employees[_number].DeptName;
    }
 
}



작성한 코드를 Remix 에서 적용 해 보겠습니다.

Remix 세팅 방법은 이 전 글을 참고 하시면 됩니다.

http://hatpub.tistory.com/54?category=1009960


1. setEmp 함수에 파라미터를 주어 값 세팅.




2. getEmp 함수에 _number 파라미터 값을 주어 배열에 저장된 값 불러오기.




+ Recent posts