Tmap API 이용해보기'

처음 해보고자 하였던 것은 지도 API를 이용해서 사용자의 현재 위치에서 가장 가까운 역을 알려주고자 하는 것이었다.

처음엔 카카오 맵이나 네이버 맵을 이용하여 어플을 만들고자 하였으나 왜 Tmap을 사용하였냐면
Tmap만이 차도가 아닌 인도로써 사용자를 안내해 줄 수 있다고 하였기 때문이다.

그리고 왜 목표가 현재 위치에서 가장 가까운 역을 찾는 것이었냐고 묻는다면

친구들이랑 놀다 보면 시간이 엄청 빨리 흘러서 막차 시간을 놓칠 수 있는 것을 방지하기 위해서 였다.

가장 가까운역을 알려줌과 동시에 그 역에 막차 시간을 알려주고 그 막차 시간 30분 전에 알람이
울리면 사용자는 알람을 보고 아 이제 막차 시간이 가까웠으니 이 어플이 알려주는 역으로 걸어가서 전철을 타자 하는 의도였다.

하지만 내가 구현한 것은 현재 위치 잡아주고 도착지까지 인도로써 길은 알려주지만

가장 중요하다고 생각한 가장 가까운 역을 찾아주는 것을 못하였고, 또한 가장 중요한 목표를 놓치다보니 목적지는 사용자가 선택하게 할 수 있게까지는 구현 가능하였지만 포기하게 되었다.

결국은 흐지부지해져버려서 목적지는 마포역 편의점으로 고정 되어있고 목적지를 바꿀 수 없게 되었다.

그래도 처음 다른 API를 사용해서 어플을 만들어 본 것이기도 하고 처음 안드로이드 스튜디오를 사용해서 어플을 만들어보았기 때문에 정말 신선했고 좋은 추억이었다.

나중에 시간이 된다면 혹은 내 지식이 내 아이디어를 따라올 수 있다면 내가 처음 구현하고자 했던 것처럼 만들고 싶다.

https://github.com/kimyoungchan1/TmapExample

내 깃허브에 현재까지 내가 만든것을 올려놓았고 제가 구현하고자 하였던 것을 누군가가 만들어 준다면 정말 편리한 어플이 될것 같다.

ps. 내가 Tmap api 사이트에 질문을 하여보았는데 충분히 가능한 기술이라고 하니 나보다 뛰어난 누군가가 저한테 좀 알려주세요..

SAS BASE 국제 자격 인증 그리고 영화 '알파고'

국제 자격 인증 시험인 sas base를 시험 보고 통과 하였다.

처음에는 학교 졸업 조건을 채우기 위한 도전이었고 자격증이었지만 하다보니 재미도 있었다.

나는 자격증은 높은 점수가 아닌 자격증 취득에 목표가 있다고 생각한다.

그래도 나름대로 최선을 다했다고 생각하였고 SAS는 70점이 넘으면 PASS지만 나는 73점으로 운 좋게 통과 하였다.

SAS 시험은 보통 18~19만원 이지만 나는 대학생 할인을 받아서 50프로 할인 받은 가격으로 시험을 봤고 친구들과 같이 신청하여 2월 22일 시험을 봤으며 시험이 끝나자마자 바로 시험 결과가 나온다.

나는 되게 여러 곳에서 덤프를 찾아가며 시험을 봤지만 내 친구중에 한명은 유튜브에서 SAS 솔루션 코리아 라는 덤프 1번부터 139번까지 풀어주는 영상을 보고 사스 커뮤니티에서 많이 나왔다는 문제를 골라 단 하루 공부하여 통과하였다.

내 생각으로는 SAS는 여러 덤프를 보는것이 더 안좋은 것 같다.

여러 덤프를 보면 너무 생각만 많아지고 여러 유형을 보게 되어 더 헷갈리게 되니 SAS 시험을 볼때는 한가지 덤프를 파서 공부하는 것이 더 나은 팁이라면 팁이다.

SAS BASE는 가장 유명한 덤프가 있는데 그것을 위주로 보고 유튜브를 통해 그 덤프 풀이를 보면 무난하게? 또는 나처럼 턱걸이로 통과 할 수 있을 것이다.

그리고 문제 은행식이다 보니 덤프만을 보면 쉽게 통과 할 수 있을거라고 얕본다면 위험하다.

시험도 통과하였고 유튜브에서 운좋게 영화 알파고를 리뷰 해준 영상을 보고 영화를 찾아 보게 되었다.

난 바둑을 둘지 모르고 머신 러닝을 배워 본 적이 없지만 서도 되게 IT 업계에서 일하는 사람들이 본다면 좋은 영화라고 생각하고 나도 영화를 보는 내내 재미있게 본 것 같다.

영화 알파고는 엄청난 전투씬이 있는 SF영화도 아니고 감동이 있는 영화도 아닌 실제 이야기를 다룬 다큐멘터리 영화지만 보면서 프로그래머라면 프로그래머대로 바둑을 둘 줄 아는 사람이라면 그 사람 나름대로 느끼는 부분이 많을 거라고 생각한다.

보면서 되게 좋은 말이 많았는데 가장 기억남는 말은 알파고를 만든 프로그래머 중 한 사람의 말로

대충 요약해서 말하면 AI라고 불리는 알파고 조차 그것을 만든 것은 인간이라는 것 이었다.

아무리 알파고가 인간보다 빠르고 잘 기억하며 계산을 잘해도 이 뒤에 있는 알고리즘 하며 여러 가지 프로그래밍은 모두 인간이 한 것이라는 것이었다.

시간이 남거나 혹시 영화를 보고 싶다면 영화 ‘알파고’를 추천한다.

Android Studio - Tabbed Activity

요즘에 안드로이드 스튜디오를 공부하고 있어서 그중에서 많이 쓰이는 탭에 대해 공부를 하던 중
tabbed activity가 있고 이것을 사용하면 쉽게 탭창을 만들고 스와이프 할 수 있다는 것을 알았다.

하지만 내가 알고싶은건 기본 tabbed activity에서 아주 살짝 그냥 어디에 쓰면 탭의 이름이 바뀌고 어디에 쓰면 내용이 바뀐다. 이정도만 알고 싶었는데 인터넷은 정보의 바다. 쓸데없는 정보가 너무너무 많다.

그래서 내가 직접 정리 해보았다.

참고 사이트는 외국분의 유튜브를 보고 하였다.
https://wn.com/tutorial_for_creating_android_swiping_application_using_tabbed_activity_on_android_studio

가장 먼저 프로젝트를 만들고 기본 Tabbed activity를 만들고 나는 Action bar tabs를 선택하여 만든 후 실행하면 잘 돌아가지만 나 같은 초보는 이해할수 없고 구글에서 검색해서 찾아도 잘 못찾겠다;;

1

내가 여기서 건든 부분은 메인 엑티비티에 122번째 줄 조금과 프레그멘트가 하나 더 생긴것 정도 밖에 없다.
fragment_first.xml은 fragment_main을 이름만 바꾼 것이다.

메인 엑티비티

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package //본인 패키지 적으세요

import android.support.design.widget.TabLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

public class MainActivity extends AppCompatActivity {

/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link FragmentPagerAdapter} derivative, which will keep every
* loaded fragment in memory. If this becomes too memory intensive, it
* may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;

/**
* The {@link ViewPager} that will host the section contents.
*/
private ViewPager mViewPager;

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

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";

public PlaceholderFragment() {
}

/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View rootView = null;
switch (getArguments().getInt(ARG_SECTION_NUMBER)){
case 1:
//do something;
rootView = inflater.inflate(R.layout.fragment_first, container, false);
break;
case 2:
// something other
rootView = inflater.inflate(R.layout.fragment_second, container, false);
break;
}

return rootView;
}
}

/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {

public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}

@Override
public int getCount() {
// Show 3 total pages.
return 2;
}
}
}

나는 2개의 탭만 만들고 실행하였지만 3개의 탭을 만들고 싶으면 getCount부분을 3으로 바꾸면 된다.

그 후에 레이아웃부분에서 뉴 -> 프레그먼트 -> 프레그먼트(블랭크) 를 눌러 fragment_second를 만들면 클래스 파일도 자동으로 추가 된다.

그 후에 위에 적은 메인엑티비티를 실행하면 잘 동작하고 탭 3개를 쓰는 사람은 프레그먼트 써드를 만든 후 case 3:을 추가하고 getCount 부분도 3으로 바꾸면 된다.

아 그리고 뷰부분을 꾸미고 싶다면 꾸미고 싶은 프레그먼트.xml 파일로 들어가 자기가 원하는 방식으로 꾸미거나 설정하면 이제는 탭 모두가 아니라 하나의 탭만 적용 되는 것을 볼 수 있다.

도움이 될지 안될지 모르는 이상한 글이 되어버렸지만 진짜 조금의 도움이라도 됐으면 좋겠다.

(나를 위한) HEXO 블로그 업로드

난 진짜 바보여서 몇일간 블로그 업로드를 안하면 어떻게 하는지 까 먹는다..

이번에도 겨우 8일 업로드 안했는데 까먹었다…

그래서 나 같은 바보를 위해 업로드를 어떻게 하는지 적어 놓고 그때 그때 보고 업로드 해야겠다.

처음엔 자기 블로그 source 에서 _posts 부분에 md파일로 적은 글을 저장한다.

ex) 나 같은 경우에는 C:\Atom\myBlog\source_posts에 md파일을 저장

그 후 아주 간단하게 저 _posts 파일에서 shift + 우클릭으로 git bash here을 눌러
베쉬 창을 열고

$ hexo generate

를 치고

$ hexo deploy 를 누르면 자기 서버에 글이 올라가는 것을 볼 수 있다.

그리고 내가 한참동안 해맸던 이미지 업로드 방법!

이 분에 방법을 참조 하였다.
https://twosb.github.io/2018/07/01/Hexo%20%EB%B8%94%EB%A1%9C%EA%B7%B8%20%EC%B4%88%EA%B0%84%EB%8B%A8%20Markdown%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EC%97%85%EB%A1%9C%EB%93%9C%20%EB%B0%A9%EB%B2%95/

자기 깃 허브에 github.io의 Repository 클릭 하여 들어 간 후

이슈 -> 뉴 이슈를 누른 후 Leave a comment 부분에 자기가 올리고자 하는 이미지를 드레그 해서 올리면 몇초의 업로딩이 뜨다가 슈슈슉 마크다운 형식으로 이미지가 바뀌는 것을 알 수 있다.

이것을 복사해서 자기가 올리고자 하는 포스트 부분에 붙이면 이미지가 로딩이 걸리다가 올라가는 것을 볼 수 있다.

그 후에 는 다시 위에 했던 $ hexo g , $ hexo d 누르면 다시 업로드 된다.

(나 같은 바보가 나 뿐이어서 이 글이 도움이 안되더라도 어쩔 수 없지.. ㅋㄷㅋㄷ..)

1차 졸업 보고서

원래 계획

초기 계획은 IOT기술이 발전하고 있는 이 시기에 조금 더 편리하게 식물에 물을 주기 위해 사람이 밖에 있어도 앱에서 버튼 하나로 집에 있는 식물에게 물을 주고 다른 예로는 자기가 식물에 물을 줘야 하는데 시간을 놓치거나 까먹었을 때 스마트폰 앱을 이용하여 물을 주는 프로젝트 였다.

10

바뀐 계획

이런식으로 하려고 했으나 상담 후 물만 주는 것은 식물 키우는 사람을 좋아하는 사람들에게 의무적으로 물만 주게 되는 좋지 않은 결과를 나을 수 있다고 생각하여 물 주는 기능을 빼고 사용자에게 이미지를 보여주고 조금 더 사용자 입장에서 키우는 재미를 느낄 수 있게 하였다.

11

해야 하는 것

아두이노에서 측정 된 화분의 습도 주변 온도 조도등의 값을 받아 http를 이용해 웹 서버에 값을 넘기고 웹 서버와의 통신은 아두이노 우노 와이파이 모듈을 사서 연결 하고 또 웹 서버에서 값을 받는 다고 하여도 그 값을 앱으로 보내기까지
이제 시작 이니 열심히 해야겠다고 생각하였다.

Android Dialog

Toast

사용자에게 메시지를 알리면서 사용자 행동을 방해하지 않는며 시간이 지나면 자동으로 사라진다.
그래서 사용자에게 꼭 알려야 하는건 일단 다이얼로그로 띄어야 한다.

makeText(Context context, int resId, int duration)
makeText(Context context, CharSequence text, int duration)

두번째 매개변수가 토스트로 띄울 메세지이며
세번째 매개변수는 지속 시간이로 LENGTH_SHORT, LENGTH_LONG으로 지정하며
LENGTH_SHORT 는 3초 LENGTH_LONG는 5초를 가르킨다. 임의의 숫자값으로 지정할 수 는 없다

원한다면 다음과 같은 함수를 이용하여 추가로 설정 가능하다

setDuration(int duration)
setText(int resId) // 문자열과 화면에 보이는 시간을 설정
setView(View view) // 임의의 뷰를 토스트로 띄울 수 있음
setGravity(int gravity, int xOffset, int yOffset)
setMargin(float horizontalMargin, float verticalMargin) // 뜨는 위치를 조정

알림 창(AlertDialog)

토스트와는 다르게 시간이 지나도 사라지지 않는 알림 창

알림창은 맨 윗줄 타이틀 영역(아이콘 이미지와 문자열), 본문에 해당하는 영역(문자열을 비롯하여 다양하게 구성 가능),
창 아래는 버튼 영역으로써 타이틀과 버튼에 대한 정보를 지정하지 않으면 두 영역은 출력되지 않는다.

new연산자가 아닌 Bulider 클래스로 생성해야 한다.

AlertDialog.Bulider builder = new AlertDialog.Bulider(this);

이것은 알림창이 아니라 빌더 클래스의 객체를 생성한 것 입니다.
Builder 객체의 여러 setter 메서드를 이용하여 다이얼로그 구성을 설정하면 Builder 객체가 알림창을 생성해주는 구조 이다.

setIcon(int iconId) : 타이틀 영역의 아이콘 지정
setMessage(CharSequence message) : 본문을 단순 문자열로 구성
setTitle(CharSequence title) : 타이틀 문자열 지정

알림창에 버튼을 추가 하려면

setPositiveButten(CharSequence text, DialogInterface.OnClickListener listener)
setNegativeButten(CharSequence text, DialogInterface.OnClickListener listener)
setNeutralButten(CharSequence text, DialogInterface.OnClickListener listener)

몇개를 추가하든 개발자 마음이지만 같은 성격의 버튼 2가지는 추가할 수 없다. 한마디로 중복이 되지 않는다.

builder.setIcon(android.R.drawble.ic_dialog_alert);
builder.setTitle(“알림”);
builder.setMessage(“정말 종료 하시겠습니까?);
builder.setPositiveButton(“ok”,null);
builder.setNegativeButton(“no”,null);

만든 객체를 출력하려면

alertDialog = builder.create();
alertDialog.show();

이렇게만 하면 버튼을 누르거나 알림 창 밖에 화면을 터치하거나 뒤로가기 버튼을 누르면 알림이 꺼지는데

버튼으로만 알림 화면을 끄고 싶다면

뒤로 가기를 버튼을 막으려면
setCancelable(boolean cancelable) 함수를 사용해야 한다.

알림 창 밖에 화면 터치로 알림 창이 꺼지는 것을 막으려면
setCanceledOnTouchOutside(boolean cancel) 함수를 사용 하면 된다.

목록(AlertDialog)

목록을 구성하기 위한 무자열 배열을 주면 알아서 목록 다이얼로그 형태로 만들어 줍니다.

목록을 구성하기 위한 무자열을 배열 리소스로 만들어 사용하려면
setItems(int itemsId, DialogInterface.OnClickListener listener)

코드에소 직접 배열을 만들어 배열을 매개변수로 지정하여 사용하려면
setItems(CharSequence[] items, DialogInterface.OnClickListener listener)

목록에서 사용자 항목 선택 이벤트는 setItems() 함수의 두 번째 매개변수를 이용하여 구현 가능 하다.
builder.setItems(R.array.dialog_array, dialogListener);

이벤트 핸들러 객체를 등록 하려면

DialogInterface.OnClieklistener dialogListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}

};

프로그래서 다이얼로그

진행상태 바를 보여주는 알림 창로써

원모양의 다이얼로그 (동글동글 돌면서 진행상태는 보여주지 않음)

ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setIcon(andriod.R.drawable.ic_dialog_alert);
progressDialog.setTItle(“wait..”);
progressDialog.setMessage(“ 서버 연동 중 입니다”);
progressDialog.show();

막대기 모양의 다이얼로그( 진행상태를 0~100%로 보여줌)

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);

날짜 선택 (DatePickerDialog)

사용자가 다이얼로그 창에서 날짜를 선택하게 할 수 있도록 DatePickerDialog를 제공한다.

DatePickerDialog dateDialog = new DatePickerDialog(this, null, year, month, day);

사용자가 날짜를 선택 하려면

DatePickerDialog dateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener(){
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
}, year, month, day);

시간 선택(TimePickerDialog)

TimePickerDialog timeDialog = new TimePickerDialog(this, null, hour, minute, true);

여기서 true 값을 false 로 바꾸면 기본 24시간 체계에서 12시간 체계로 바뀌며 오전 오후를 선택할 수 있게 된다.

TimePickerDialog timeDialog = new TImePickerDialog(this, new TimePickerDialog.OnTimeSetListener(){
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
}
}, hour, minute, false);

커스텀 다이얼로그(AlertDialog)

개발자가 직접 만드는 다이얼로그!

레이아웃 xml 파일에 만든다.

LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout_custom, null);
builder.setView(view);

개발자가 직접 구성한 뷰를 setView() 하수를 통해 다이얼로그 본문으로 지정하여 구현합니다.

WEB SERVER : WAMP vs XAMPP + MONGODB

==가장 먼저 web server란 무엇인가?==

웹 서버(Web Server)는 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말한다.

==왜 내가 web server 가 필요한가?==

Ethernet 부분을 보면 아두이노에서 측정된 값이 웹에 저장되고 웹에서 앱에게 쏘아주는 그림을 볼 수 있다.

그냥 아두이노 값을 웹에서 받으려고 웹 서버가 필요한거다!

==web server WAMP랑 XAMPP가 있는데 무엇을 사용할 것인가?==

WAMP: acronym for Windows Operating System, Apache(Web server), MySQL Database and PHP Language.

XAMPP: acronym for X (any Operating System), Apache (Web server), MySQL Database, PHP Language and PERL.

요약하자면 XAMPP는 WAMP보다 더 많은 OS를 지원하고 좀 더 많은 기능이 있다고만 생각하면 된다.

==나는 왜 XAMPP를 선택하였는가?==

단순하다 나는 OS가 윈도우가 아닌 리눅스에서 돌릴 것이다.

그래서 나는 반강제?로 XAMPP를 사용 하려고 한다.

==MONGDB 너 대체 뭐하는 애니?==

말로만 듣던 몽고DB 지금까지 학교 다니며 배운 MYSQL과 다른게 뭐야?

이번 기회에 드디어 알 수 있게 되었다.

내가 알아 본 것은 이렇다.

몽고 db는 nosql로써 관계형 모델을 사용하지 않으며, mysql과 같은 오픈 소스이고 스키마 없이 동작 한다.

스키마?

mysql에서 그 테이블 만들어서 거기에 값을 넣는데 nosql은 그게 아니고 그냥 값을 막 넣어서 뺄 때 조심히 빼야된다

왜냐면 상관 없는 값들도 순서 없이 막 들어가 있기 때문이다!

==XAMPP와 MONGO DB의 연결==

나는 XAMPP를 사용하는데 평범하게 가운데에 박힌 저 M 처럼 편안하게 MYSQL을 쓰면 좋겠지만!

처음으로 몽고DB를 써보려고 한다.

그래서 연결하는 방법을 찾고 몽고DB를 설치하려 하였지만..

무엇이 문제일까.. 실패 했다..

뭐 다시 해봐야지!

Ethernet

가장 먼저.. 내가 블로그는 처음이라 글 쓰는 것도 이상하고

말에 두서가 없다고해서 너무 뭐라고 하는 사람은 없기를 바란다..

오늘은 졸작을 해야 되서 이더넷 통신을 한번 해보려고 하였다.

근데 큰 문제가 있었는데 아두이노를 이용해 이더넷 통신을

하려고 보니까 랜선을 직접 꽂아야 하는데

우리 학교에서는 랜선을 뽑아쓸 수 없어서 랜선을 연결을 하지 못했다.

그래서 오늘은 못하고 내일 랜선을 들고 학교를 가야 한다.

그래도 뭐 공부 했으니까 공부한걸 정리해보자면

이더넷은 컴퓨터 네트워크 기술의 하나로, 전세계의 사무실이나 가정에서 일반적으로 사용되는 LAN에서 가장 많이 활용되는 기술 규격이며

위에서 보듯이 LAN을 연결하여 하는 방식이므로 무선이 아닌 유선 방식이다.

나는 이 이더넷 기술을 통해 아두이노와 웹 서버와 연결하고

웹 서버에서 내가 만든 어플로 값을 내보내는 것을 할 거였다.

picture.PNG

이렇게!

가장 먼저 안드로이드 이더넷 통신을 이용해 웹 서버에

아두이노에 측정 된 값을 보내야 하고.

두번째 웹 서버에 보내진 측정 값을 FCM(핸드폰에 알림 띄우기)과

내가 만든 어플에 값을 보내야 한다.

어.. 근데 오늘은 한게 없으니까.. 여기까지!

천천히 이 블로그를 채우며 졸작의 완성 과정까지 모든것을 기록 할 것이다!