반응형
SMALL

'분류 전체보기'에 해당되는 글 209건

반응형
LIST
반응형
SMALL

이번시간에는 몽고DB mongodb Replica Set의 필요성에 대해 포스팅 해보려고 한다. 말그대로 저걸 그냥 해석하면 mongodb 복제 셋이다. 데이터베이스를 복제한다? 왜 복제하는지 그 필요성에 대해 이야기해보고자 한다. 이건 친구가 소프트웨어마에스트로 과정을 할때 연구했던 것이며, 세계적인 일간지에도 실린만큼 성과가 컸었다. 그땐 잘 몰랐지만 지금 이렇게 다시 내가 이해하고 보니 일간지에 올라갈만한 이유는 있었던 것 같다. 친구가 연구했었던 내용이 너무나 좋아서 허락을 받고 내 블로그에 포스팅을 한다. 


한 서버에 DB가 하나만 연결되어 있는 상태이다.

스크린샷 2015-12-03 오전 1.15.59

 [그림1 한 서버에 DB가 하나만 연결된 경우]

만약 연결돼 있던 DB가 죽는다면? 원하는 data를 가져올 수 없다. 서비스를 정상적으로 수행하기 위해선 어떻게든 죽은 데이터베이스를 살려 내야만 한다.

스크린샷 2015-12-03 오전 1.16.39

[그림2 한 서버에 DB가 하나만 연결된 상태에서 DB가 죽은 경우]

그리고 또하나 가정을 해본다. Request가 너무 많아서 서버가 죽는 경우도 생긴다. 이럴 경우는 또 어떻게 해야하는지 살펴보자.

해결법은 Scale-up과 Scale-out 이렇게 2가지 이다.

 스크린샷 2015-09-10 오전 12.23.35

[그림3 Scale-up, Scale-out]

Scale-up을 통해 DB의 성능(cpu, memory, 저장공간 등)을 높이면 Request가 많이 발생하더라도 처리가 가능해 진다. 하지만, 만약 DB가 죽는 경우가 발생한다면? 정상적인 서비스를 제공할 수 없게 된다. 그렇게 된다면 또 어떻게 해결을 할까? 데이터베이스를 너무 한곳에다가 몰아서 해놓을 경우 그 데이터베이스가 죽었을시엔 또 감당이 안되는 상황이 벌어진다.

스크린샷 2015-12-03 오전 1.17.23

[그림4 Scale-up: DB가 죽은 경우]

그랬을 시엔 해결법은 한가지다. 복제된 DB가 필요하다. 이로써 많은 Request를 처리할 수 있으며 특정 DB가 죽는 경우가 생기더라도 정상 서비스를 제공할 수 있다.

스크린샷 2015-12-03 오전 1.18.00

[그림5 Scale-out: DB를 늘리는 경우]

그런데 ‘그림5’와 같은 형태로 DB를 복제한다면 문제점이 있다. 아까전처럼 하나의 데이터베이스에 묶어놓는거보단 여러개로 분산시켜놔서 돌리는 것까진 좋았는데 어떤 유저가 Write를 시도하면 서버가 DB에게 전달하는 Write 명령이 3번이나 반복되어야한다. 또한 원하는 data를 얻어오려면 어느 DB에게 Read 요청을 하는게 좋은지 살펴보자.

 스크린샷 2015-12-03 오전 1.18.33

[그림6 Scale-out(복제): Write연산]

그림 6에서와 같이 Write 연산 중에 Read 요청이 온다면 어떻게 될까? Wrtie가 끝난 후에 Read 연산을 진행해야 하기 때문에 지연이 생기게 된다.

따라서 ‘그림7’처럼 Write, Read 명령을 수행하는 DB를 각각 분리하고 Write 명령을 수행하는 DB는 각 DB에게 Replication해 주도록 구성해야 한다.

스크린샷 2015-12-03 오전 1.19.19

[그림7 Scale-out: Write, Read 분리]

하지만, 이 때문에 문제점이 발생한다. ‘그림8’처럼 Write를 수행하는 DB가 죽는 경우 전체적인 서비스에 장애가 발생하기 때문이다. 

스크린샷 2015-12-03 오전 1.20.00

[그림8 Scale-out: Write DB가 죽은 경우]

<출저: https://unagi44.wordpress.com/Developer Lee>

어떻게해도 참 난감한 문제가 발생한다. 한꺼번에 처리하자니 처리속도가 너무 느려지고 나눠서 처리하자니 write DB가 다운되는 상황이 벌어지면 Read DB에까지 영향을 주니 말이다. 그럼 진짜로 해결방안은 없는걸까? 그 다음 포스팅으로 넘어가도록 하겠다.




반응형
LIST

'mongoDB' 카테고리의 다른 글

mongodb Replica Set 실습  (0) 2016.09.08
Sharding의 기능  (0) 2016.09.03
왜 Arbiter인가?  (0) 2016.09.03
mongodb Replica Set Election  (0) 2016.09.03
mongodb Replica Set 알아보기  (0) 2016.09.03
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 casper.js를 이용한 날씨프로그램에 대해 포스팅해보려고한다. 사실 이건 내가 개발한건 아니고 친구가 개발한건데 공부해보려고 따라해본거였는데 생각했던거보다 고생 많이했다. 지금도 만드는과정 머릿속에 있을만큼 많이 지우고 다시하고를 반복했다. 그리고 이건 맥북기준이니 참고바란다.


1. 먼저 터미널쪽으로 가서 다음과 같이 명령어를치고 다운로드해준다.

  • brew install phantomjs
  • brew install casperjs

다음으로 Desktop 경로에서 아래와 같이 폴더를 create 한다.

  1. Desktop/자동화
  2. Desktop/자동화/날씨
  3. Desktop/자동화/자동화코드
  4. Desktop/자동화/자동화프로그램

나같은경우는 usrs/desktop/자동화쪽 경로를 설정해서 날씨, 자동화코드, 자동화프로그램에 대한 폴더를 만들어줬다.



2. 다음으로 코드를 작성해준다. 파일명은 CaptureWeather.js로 설정해주고 자동화코드 폴더쪽으로 저장해준다.

var casper = require(casper).create({
    verbose: true,
    loglevel: debug,
    viewportSize: {
        width: 1024,
        height: 768
    }
});

casper.echo(Casper started);

casper.start(http://weather.naver.com/rgn/cityWetrMain.nhn“);

casper.then(function() {

    this.captureSelector(/Users/사용자이름(변경하세요)/Desktop/
자동화/날씨/금일전국날씨.png, ‘#content);

});

casper.run();

경로는 본인컴퓨터에 맞게 알아서 설정해주면 된다. 


2. 이번에는 CaptureWeekWeather.js 파일명으로 저장하고 이역시 자동화코드 폴더안으로 경로를 지정해주고 다음과 같이 코딩한다.

var casper = require('casper').create({
    verbose: true,
    loglevel: 'debug',
    viewportSize: {
        width: 1024,\
        height: 768
    }
});

casper.echo("Casper started");

casper.start("http://weather.naver.com/period/weeklyFcast.nhn");

casper.then(function() {
    this.captureSelector('/Users/사용자이름(변경하세요)/Desktop/자동화/
    날씨/주간전국날씨.png', '#content');
});

casper.run();



3. 이번엔 myAutoProgram.sh라는 파일명으로 자동화프로그램 폴더로 저장하고 다음과 같이 코딩한다.


#!/bin/bash

echo 귀찮은 작업을 자동으로 처리합니다...
echo
echo 1. 대한민국 전국 날씨정보를 png 그림파일로 저장합니다.
echo

( exec casperjs /Users/사용자이름(변경하세요)/Desktop/자동화/자동화코드/
  CaptureWeather.js )

( exec casperjs /Users/사용자이름(변경하세요)/Desktop/자동화/자동화코드/

CaptureWeekWeather.js ) exit 0


이런식으로 3개를 직접 코딩해주면 된다. 이제 다음은 이 프로그램들을 실행시키는 과정이다.


4. 프로그램의 실행 과정

 myAutoProgram.sh’을 실행 가능한 파일로 변경해야 한다.

터미널을 실행하고 ‘Desktop/자동화/자동화프로그램’ 경로로 이동한다.

이제 아래 명령어를 사용하면 끝난다.

  • chmod +x myAutoProgram.sh

myAutoprogram.sh 파일을 실행시켜 보자.

‘Desktop/자동화/날씨’ 경로에

  • 금일전국날씨.png
  • 주간전국날씨.png


이런식으로 화면이 나오면 성공이다. 자동화프로그램을 이용해서 날씨를 이렇게 편하게 바로 볼 수가 있다. 자동화프로그램이 실행될때마다 업데이트가 바로바로 되기때문에 구지 인터넷들어가서 찾아보지 않아도 이렇게 편리하게 날씨프로그램을 볼 수가있다. 다음번에도 자동화프로그램을 이용해서 어떤걸 개발해볼지 조금 더 생각해봐야 할것같다.



반응형
LIST

'javascript' 카테고리의 다른 글

node.js, express 프레임워크를 이용한 채팅프로그램  (0) 2016.08.23
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 안드로이드를 이용한 StopWatch를 만들어 보려고한다. 


1. activity_main.xml 코드


뭐 대강 이런식으로 디자인해보았다. 배경화면 같은 경우는 내가 직접 넣은것이다. 코드는 다음과 같다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:contextClickable="true">

<TextView
android:id="@+id/time_out"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="40sp"
android:background="#cccccc"
android:textColor="#777777"
android:text="00:00:00" />

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="기록"
android:gravity="center"
android:background="#333333"
android:textColor="#ffffff"
/>

<TextView
android:id="@+id/record"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:textSize="20sp"
android:padding="10dp"
android:background="@android:drawable/presence_away" />

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btn_start"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="myOnClick"
android:text="시작"
/>
<Button
android:id="@+id/btn_rec"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="myOnClick"
android:text="기록"
android:enabled="false"

/>
</LinearLayout>

</LinearLayout>


대강 이런식의 코드이다. 


2. Main_activity.java 코드


package com.example.gunjoolee.stopwatch;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
TextView myOutput;
TextView myRec;
Button myBtnStart;
Button myBtnRec;

final static int Init =0;
final static int Run =1;
final static int Pause =2;

int cur_Status = Init; //현재의 상태를 저장할변수를 초기화함.
int myCount=1;
long myBaseTime;
long myPauseTime;

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

myOutput = (TextView) findViewById(R.id.time_out);
myRec = (TextView) findViewById(R.id.record);
myBtnStart = (Button) findViewById(R.id.btn_start);
myBtnRec = (Button) findViewById(R.id.btn_rec);




}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}

public void myOnClick(View v){
switch(v.getId()){
case R.id.btn_start: //시작버튼을 클릭했을때 현재 상태값에 따라 다른 동작을 할수있게끔 구현.
switch(cur_Status){
case Init:
myBaseTime = SystemClock.elapsedRealtime();
System.out.println(myBaseTime);
//myTimer이라는 핸들러를 빈 메세지를 보내서 호출
myTimer.sendEmptyMessage(0);
myBtnStart.setText("멈춤"); //버튼의 문자"시작"을 "멈춤"으로 변경
myBtnRec.setEnabled(true); //기록버튼 활성
cur_Status = Run; //현재상태를 런상태로 변경
break;
case Run:
myTimer.removeMessages(0); //핸들러 메세지 제거
myPauseTime = SystemClock.elapsedRealtime();
myBtnStart.setText("시작");
myBtnRec.setText("리셋");
cur_Status = Pause;
break;
case Pause:
long now = SystemClock.elapsedRealtime();
myTimer.sendEmptyMessage(0);
myBaseTime += (now- myPauseTime);
myBtnStart.setText("멈춤");
myBtnRec.setText("기록");
cur_Status = Run;
break;


}
break;
case R.id.btn_rec:
switch(cur_Status){
case Run:

String str = myRec.getText().toString();
str += String.format("%d. %s\n",myCount,getTimeOut());
myRec.setText(str);
myCount++; //카운트 증가

break;
case Pause:
//핸들러를 멈춤
myTimer.removeMessages(0);

myBtnStart.setText("시작");
myBtnRec.setText("기록");
myOutput.setText("00:00:00");

cur_Status = Init;
myCount = 1;
myRec.setText("");
myBtnRec.setEnabled(false);
break;


}
break;

}
}

Handler myTimer = new Handler(){
public void handleMessage(Message msg){
myOutput.setText(getTimeOut());

//sendEmptyMessage 는 비어있는 메세지를 Handler 에게 전송하는겁니다.
myTimer.sendEmptyMessage(0);
}
};
//현재시간을 계속 구해서 출력하는 메소드
String getTimeOut(){
long now = SystemClock.elapsedRealtime(); //애플리케이션이 실행되고나서 실제로 경과된 시간
long outTime = now - myBaseTime;
String easy_outTime = String.format("%02d:%02d:%02d", outTime/1000 / 60, (outTime/1000)%60,(outTime%1000)/10);
return easy_outTime;

}


}

<출저: Javaking :: 자바킹- IT 정복>

대강 코딩해보면 이렇게 나온다. 중간중간 바꾼것도 몇개 있기는 하다. 

3. 실행화면

저렇게 코딩을 완벽히 하고 지니모션을 실행시키면 다음과 같다.

시작하고 기록하고 멈춤하고 아주 잘 실행이 되고있다. 예전부터 한번 만들어보고 싶은 어플이었는데 만들어서 좋았다. 여러 안드로이드 책에도 예제 나온게 많은걸로 알고있는데 다 해봐도 실력 금방 늘것이다.

카테고리 레이어 열고 닫기


반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 안드로이드를 이용한 D-day 어플 만드는법을 써본다. 일상생활에서 가장 많이 쓰는 도구중에 하나기도 해서 한번 만들어보고 싶어서 만들어봤다. 이것도 블로그들이나 구글 참조 많이했는데 정신없이 하다보니 출저를 못쓰는 점도 좀 양해바란다.


1. activity_main.xml 코드


이건 내가 직접 디자인하고 코딩한거다. 근데 사람에 따라 맘에 들수도 있고 안들 수도 있으니 그건 생략하겠다. 



색깔도 넣어보고 레이아웃 크기 등 다 조절하고 몇시간에 걸쳐 만들었다. 내맘엔 쏙든다. 코드는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1">

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="370px"
android:orientation="horizontal"
android:id="@+id/linearLayout"
android:layout_alignParentStart="false"
android:layout_alignParentEnd="true"
android:background="@color/material_deep_teal_200"
android:backgroundTintMode="add">

<TextView
android:id="@+id/today"
android:layout_width="match_parent"
android:layout_height="60dp"
android:textSize="40dp"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:background="@color/material_deep_teal_200" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="120px"
android:text="오늘 날짜"/>

</RelativeLayout>

<TextView
android:id="@+id/dday"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:textSize="120px"
android:layout_weight="0.56"
android:layout_alignParentStart="true"
android:layout_above="@+id/result"
android:layout_alignParentEnd="true"
android:background="@android:color/holo_orange_light" />

<TextView
android:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="188dp"
android:textSize="120px"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:background="#fff700" />

<Button
android:id="@+id/dateButton"
android:layout_width="fill_parent"
android:layout_height="66dp"
android:text="날짜입력"
android:layout_above="@+id/dday"
android:layout_alignParentStart="true" />


가장 최적의 레이아웃 dp설정이었다. 이거 하느라고 시간 많이 보냈다..-_-;;


2. Main_activity.java 코드


package com.example.gunjoolee.datecal;

import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

public class MainActivity extends Activity {
/** Called when the activity is first created. */

private TextView ddayText;
private TextView todayText;
private TextView resultText;
private Button dateButton;

private int tYear; //오늘 연월일 변수
private int tMonth;
private int tDay;

private int dYear=1; //디데이 연월일 변수
private int dMonth=1;
private int dDay=1;


private long d;
private long t;
private long r;

private int resultNumber=0;

static final int DATE_DIALOG_ID=0;



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

ddayText=(TextView)findViewById(R.id.dday);
todayText=(TextView)findViewById(R.id.today);
resultText=(TextView)findViewById(R.id.result);
dateButton=(Button)findViewById(R.id.dateButton);

dateButton.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(0);//----------------
}
});



Calendar calendar =Calendar.getInstance(); //현재 날짜 불러옴
tYear = calendar.get(Calendar.YEAR);
tMonth = calendar.get(Calendar.MONTH);
tDay = calendar.get(Calendar.DAY_OF_MONTH);

Calendar dCalendar =Calendar.getInstance();
dCalendar.set(dYear,dMonth, dDay);

t=calendar.getTimeInMillis(); //오늘 날짜를 밀리타임으로 바꿈
d=dCalendar.getTimeInMillis(); //디데이날짜를 밀리타임으로 바꿈
r=(d-t)/(24*60*60*1000); //디데이 날짜에서 오늘 날짜를 뺀 값을 '일'단위로 바꿈

resultNumber=(int)r+1;
updateDisplay();

}//OnCreate end

private void updateDisplay(){

todayText.setText(String.format("%d년 %d월 %d일",tYear, tMonth+1,tDay));
ddayText.setText(String.format("%d년 %d월 %d일",dYear, dMonth+1,dDay));

if(resultNumber>=0){
resultText.setText(String.format("D-%d", resultNumber));
}
else{
int absR=Math.abs(resultNumber);
resultText.setText(String.format("D+%d", absR));
}
}//디데이 날짜가 오늘날짜보다 뒤에오면 '-', 앞에오면 '+'를 붙인다

private DatePickerDialog.OnDateSetListener dDateSetListener=new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
dYear=year;
dMonth=monthOfYear;
dDay=dayOfMonth;
final Calendar dCalendar =Calendar.getInstance();
dCalendar.set(dYear,dMonth, dDay);

d=dCalendar.getTimeInMillis();
r=(d-t)/(24*60*60*1000);

resultNumber=(int)r;
updateDisplay();
}
};


@Override
protected Dialog onCreateDialog(int id){
if(id==DATE_DIALOG_ID){
return new DatePickerDialog(this,dDateSetListener,tYear,tMonth,tDay);
}
return null;
}


}

이건 95프로 블로그 글에 도움을 많이받았다. 출저에 대해 못쓰는거는 양해부탁드린다.


3. 실행 결과 화면


저렇게 잘 코딩을 하고 지니모션 실행을 하면 다음과 같다.



이게 내 핸드폰(갤럭시 S7, API23)으로 테스트해서 지니모션으로 돌리면 이런식으로 나오는데 이건 본인 핸드폰에 맞게 크기 설정해서 쓰면 될거같다. 내 핸드폰 기준으로는 딱맞는 크기였다. 원하는 날짜를 선택하면 몇일이 지나고 몇일이 남았는지 잘 표시 된다는 걸 알 수 있다.

반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 달력을 만드는데 이번달만 표시될 수 있는 달력을 만들어보았다. 이것 역시 네이버, 구글, 책등을 찾아보며 만들어봤다. 하지만 자바코드 같은 경우는 네이버블로그에 도움을 상당수 많이 받았다. 생각보다 원하는 마땅한 코드도 없고 내 컴퓨터에 맞게 코딩 시킬라면 참 어려운점이 많았다.


1. acvity_main.xml 코드



대강 이렇게 만들어진다. 색깔같은경우는 내가 직접 넣어봤다. 

코드는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:background="#00c8ff" >



<TextView

android:id="@+id/tv_date"

android:layout_width="match_parent"

android:layout_height="50dp"

android:background="#ffff00"

android:gravity="center_vertical"

android:paddingLeft="10dp"

android:textColor="#000000"

android:textSize="20sp" />



<GridView

android:layout_marginTop="10dp"

android:id="@+id/gridview"

android:layout_weight="1"

android:layout_height="0dp"

android:layout_width="match_parent"

android:numColumns="7"

android:listSelector="#b9ff00"

>

</GridView>


</LinearLayout>


그리드 뷰를 이용해서 만든 달력이다. 선까지 표시가 되서 더 깔끔하게 달력같은 달력을 만들 수 있다.


2. Main_activity.java 코드


package com.example.gunjoolee.calendar2;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import java.util.List;

import java.util.Locale;



import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.GridView;

import android.widget.TextView;



public class MainActivity extends Activity {



/**

* 연/월 텍스트뷰

*/

private TextView tvDate;

/**

* 그리드뷰 어댑터

*/

private GridAdapter gridAdapter;



/**

* 일 저장 할 리스트

*/

private ArrayList<String> dayList;



/**

* 그리드뷰

*/

private GridView gridView;



/**

* 캘린더 변수


private Calendar mCal;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);



setContentView(R.layout.activity_main);



tvDate = (TextView)findViewById(R.id.tv_date);

gridView = (GridView)findViewById(R.id.gridview);



// 오늘에 날짜를 세팅 해준다.

long now = System.currentTimeMillis();

final Date date = new Date(now);

//연,월,일을 따로 저장

final SimpleDateFormat curYearFormat = new SimpleDateFormat("yyyy", Locale.KOREA);

final SimpleDateFormat curMonthFormat = new SimpleDateFormat("MM", Locale.KOREA);

final SimpleDateFormat curDayFormat = new SimpleDateFormat("dd", Locale.KOREA);



//현재 날짜 텍스트뷰에 뿌려줌

tvDate.setText(curYearFormat.format(date) + "/" + curMonthFormat.format(date));



//gridview 요일 표시

dayList = new ArrayList<String>();

dayList.add("일");

dayList.add("월");

dayList.add("화");

dayList.add("수");

dayList.add("목");

dayList.add("금");

dayList.add("토");



mCal = Calendar.getInstance();



//이번달 1일 무슨요일인지 판단 mCal.set(Year,Month,Day)

mCal.set(Integer.parseInt(curYearFormat.format(date)), Integer.parseInt(curMonthFormat.format(date)) - 1, 1);

int dayNum = mCal.get(Calendar.DAY_OF_WEEK);

//1일 - 요일 매칭 시키기 위해 공백 add

for (int i = 1; i < dayNum; i++) {

dayList.add("");

}

setCalendarDate(mCal.get(Calendar.MONTH) + 1);



gridAdapter = new GridAdapter(getApplicationContext(), dayList);

gridView.setAdapter(gridAdapter);



}



/**

* 해당 월에 표시할 일 수 구함

* @param month


private void setCalendarDate(int month) {

mCal.set(Calendar.MONTH, month - 1);



for (int i = 0; i < mCal.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {

dayList.add("" + (i + 1));

}



}



/**

* 그리드뷰 어댑터

*

*/

private class GridAdapter extends BaseAdapter {



private final List<String> list;



private final LayoutInflater inflater;



/**

* 생성자

*

* @param context

* @param list

*/

public GridAdapter(Context context, List<String> list) {

this.list = list;

this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}



@Override

public int getCount() {

return list.size();

}



@Override

public String getItem(int position) {

return list.get(position);

}



@Override

public long getItemId(int position) {

return position;

}



@Override

public View getView(int position, View convertView, ViewGroup parent) {



ViewHolder holder = null;



if (convertView == null) {

convertView = inflater.inflate(R.layout.item_calendar_gridview, parent, false);

holder = new ViewHolder();



holder.tvItemGridView = (TextView)convertView.findViewById(R.id.tv_item_gridview);



convertView.setTag(holder);

} else {

holder = (ViewHolder)convertView.getTag();

}

holder.tvItemGridView.setText("" + getItem(position));



//해당 날짜 텍스트 컬러,배경 변경

mCal = Calendar.getInstance();

//오늘 day 가져옴

Integer today = mCal.get(Calendar.DAY_OF_MONTH);

String sToday = String.valueOf(today);

if (sToday.equals(getItem(position))) { //오늘 day 텍스트 컬러 변경

holder.tvItemGridView.setTextColor(getResources().getColor(R.color.colorPrimaryDark));

}

return convertView;

}

}



private class ViewHolder {

TextView tvItemGridView;

}

}

옆으로 세어져 나간건 양해부탁... 아무튼 이렇게 만들었다. 이것도 내컴퓨터 사양에 맞게 바꾸고 한것이다. 항상 개발이 그렇듯이..


3. 실행 결과 화면


저걸 저렇게 다 완벽하게 틀린거 없이 짜고 돌리면 다음과 같다.



오늘 날짜는 저런식으로 진하게 표시가 된다. 색깔은 본인이 맘에 드는걸로 넣으면 될 것같다.

반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 안드로이드를 이용한 달력 만드는 방법을 포스팅 해보려고한다. 솔직히 구글, 네이버쪽을 쭉 보면서 많은 도움을 받았다. 근데 내가 찾았던 블로그 명이 기억나지않아서 출저가 어딘지에 대해 알리지 못하는 거에 대해선 양해를 구하고 싶다.


1. activity_main.xml Text 설정

API 23으로 설정해주면 대강 이런식으로 나온다. 달력은 지니모션 돌려보면 다 나오니깐 너무 신경쓰지 않는다. 내가 사용한 코드는 아래와 같다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:background="#FFFFFFFF"
>

<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10px"
android:layout_marginLeft="10px"
android:layout_marginRight="10px"
>

<Button
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="PRE"
android:id="@+id/pre"
android:layout_weight="1"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="today"
android:id="@+id/today"
android:layout_weight="3"
android:textColor="#FF000000"
android:gravity="center_horizontal|center_vertical"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="NEXT"
android:id="@+id/next"
android:layout_weight="1"
/>

</LinearLayout>

<TableLayout
android:id="@+id/week"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:shrinkColumns="true"
android:stretchColumns="true"
android:background="#FF8DC701"
android:layout_marginLeft="10px"
android:layout_marginRight="10px"
>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="일"
android:textColor="#FFFF0000"

android:gravity="center_horizontal" />
<TextView
android:text="월"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:textColor="#FF000000"
android:layout_height="wrap_content"/>
<TextView
android:text="화"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:textColor="#FF000000"
android:layout_height="wrap_content"/>
<TextView
android:text="수"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:textColor="#FF000000"
android:layout_height="wrap_content"/>
<TextView
android:text="목"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:textColor="#FF000000"
android:layout_height="wrap_content"/>
<TextView
android:text="금"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:textColor="#FF000000"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="토"
android:textColor="#FF0000FF"
android:gravity="center_horizontal"/>
</TableRow>
</TableLayout>

<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/table"
android:background="#FFF6F3A4"
android:layout_marginLeft="10px"
android:layout_marginRight="10px"
/>
</LinearLayout>

달력이다 보니 좀 긴감이 없지않아 있지만 이정도가 딱 맞는거 같다. 색깔이나 이런부분은 내 컴퓨터 사양과 맞지 않는 부분이 많아서 내가 색깔을 이것저것 입혀봐서 괜찮다 싶은 거로 설정했다. 이 코드 복사해서 쓰는거는 상관없지만 색깔맞추려면 본인 컴퓨터 사양에 맞게 설정해야 될것이다.(맥북기준)



2. Main_Activity.java 코드 

package com.example.gunjoolee.calendar;

import java.util.Date;
import java.util.Vector;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
/** Called when the activity is first created. */

Vector vec;
int firstDay;

int totDays;
int iYear;
int iMonth;

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

Date today = new Date(); ->오늘날짜
iYear = today.getYear(); ->년도
iMonth = today.getMonth(); ->달 수

vec = new Vector();
TableLayout table = (TableLayout)findViewById( R.id.table );
for( int i = 0 ; i < 6 ; i++ ){
TableRow tr = new TableRow( this );
for( int j = 0 ; j < 7 ; j++ ){
TextView tv = new TextView( this );

if( j == 0 )
tv.setTextColor( Color.RED );
else if( j == 6 )
tv.setTextColor( Color.BLUE ); -> 테이블레이아웃쪽 달력설정

else
tv.setTextColor( Color.BLACK );

tv.setGravity( Gravity.CENTER_HORIZONTAL );

tr.addView( tv );
vec.add( tv );
}
table.addView( tr );
}

table.setStretchAllColumns( true );

table = (TableLayout)findViewById( R.id.week );
table.setStretchAllColumns( true );

setCalendar( iYear, iMonth );

Button btn = (Button)findViewById( R.id.pre ); -> pre 버튼 설정
btn.setOnClickListener( new Button.OnClickListener(){

public void onClick(View v) {

iMonth--;
setCalendar( iYear, iMonth );

}
});

btn = (Button)findViewById( R.id.next ); ->next 버튼 설정
btn.setOnClickListener( new Button.OnClickListener(){

public void onClick(View v) {

iMonth++;
setCalendar( iYear, iMonth );

}
});
}

private void setCalendar( int year, int month ){


Date date = new Date();
date.setYear( year );
date.setMonth( month );
date.setDate( 1 );
firstDay = date.getDay();

totDays = 31;
for( int i = 29 ; i <= 32 ; i++ ){
date.setDate( i );
if( date.getDate() == 1 ){ ->달이 30일인지, 31일인지 설정
totDays = i - 1;
break;
}
}

Log.i("mylog", firstDay + " " + totDays );
date = new Date();
date.setYear( year );
date.setMonth( month );

iYear = date.getYear();
iMonth = date.getMonth();

TextView tvToday = (TextView)findViewById( R.id.today ); ->년,월,날짜설정
tvToday.setText( (iYear + 1900) + "년" + (iMonth + 1) + "월");



for( int i = 0 ; i < vec.size() ; i++ ){
((TextView)vec.get( i )).setText("");
}

int iDate = 1;
for( int i = firstDay ; i < firstDay + totDays; i++ ){

((TextView)vec.get( i )).setText( String.valueOf( iDate++ ) );
}

}
}

달력 java코드이다. 구글이나 네이버쪽에서 참고한 코드인데 출저가 어디였는지 기록해놓지 못해서 아쉽다. 아무튼 이런식으로 짜게되면 만들고자하는 대략의 코드가 나온다. 책에도 많이 나와있고 인터넷에도 많이 도는 코드니까 외우려고 하지말았으면 좋겠다. 


3. 실행

저렇게 디자인을 다하고 저걸 그대로 실행시켜보면 다음과 같은 결과가 얻어졌다. 


결과가 좀 작게나와서 아쉽지만 PRE, NEXT버튼 누르면 아주 잘넘어갈것이다. 만약 이번년도 달력만 만들고 싶으면 자바코드에서 break문 걸고 코드 수정하면 이번년도 달력만 만들 수 있다.

반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 안드로이드 회원가입, 로그인 프로그램에 대해 포스팅 해보려고 한다. 보통 우리가 어떤 사이트에서 무언가의 대한 정보를 보기 위해 회원가입을 많이 한다. 근데 이게 어떤 원리인지 참 궁금한 점이 많았다. 그래서 안드로이드로 한번 구현해보았다.


1. activity_main.xml  디자인 구현


좀 작아서 안보이긴 하겠지만 text필드의 E-mail, password필드를 이용해서 구성하고 Button 2개, Large text 2개를 구성해서 저런 화면으로 배치해보았다. 솔직히 모양은 그렇게 크게 맘에 들진 않지만 나중에 뒤에 배경도 같이 한번 넣어볼 계획이다. 


2. activity_main.xml text구현

이젠 텍스트 어떤식으로 배치할 것이며 간격은 얼마나 할건지에 대한 코딩이다. 나는 다음과 같이 코딩했다.

?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.gunjoolee.myapple.MainActivity"
android:gravity="right">

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:ems="10"
android:id="@+id/etEmail"
android:hint="Email"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true" />

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="Password"
android:ems="10"
android:id="@+id/etPassword"
android:layout_below="@+id/etEmail"
android:layout_alignParentRight="true" />

<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="회원가입"
android:id="@+id/btnRegist"
android:layout_below="@+id/etPassword"
android:layout_centerHorizontal="true" />

<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="로그인"
android:id="@+id/btnLogin"
android:onClick="onButtonClicked"
android:nestedScrollingEnabled="false"
android:layout_alignTop="@+id/btnRegist"
android:layout_alignEnd="@+id/etPassword" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="이메일: "
android:id="@+id/textView"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="비밀번호: "
android:id="@+id/textView2"
android:layout_above="@+id/btnRegist"
android:layout_alignParentStart="true" />

</RelativeLayout>

Linear Layout으로 하려다 그냥 Relative Layout로 했다. 별 내용은 없고 어떤식으로 배치할 것인지에 대해 짠 코드다.


3. Main_activity.java 파일에 대한 구현

방금 만든 화면에 대한 코딩이다. 어떤식으로 동작하게 할지에대한 코딩이다.

package com.example.gunjoolee.myapple;
;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

private EditText etEmail;
private Button btnRegist;

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

etEmail = (EditText) findViewById(R.id.etEmail);
btnRegist = (Button) findViewById(R.id.btnRegist);
btnRegist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), RegistActivity.class);

// SINGLE_TOP : 이미 만들어진게 있으면 그걸 쓰고, 없으면 만들어서 써라
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

// 동시에 사용 가능
// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

// intent를 보내면서 다음 액티비티로부터 데이터를 받기 위해 식별번호(1000)을 준다.
startActivityForResult(intent, 1000);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

// setResult를 통해 받아온 요청번호, 상태, 데이터
Log.d("RESULT", requestCode + "");
Log.d("RESULT", resultCode + "");
Log.d("RESULT", data + "");

if(requestCode == 1000 && resultCode == RESULT_OK) {
Toast.makeText(MainActivity.this, "회원가입을 완료했습니다!!", Toast.LENGTH_SHORT).show();
etEmail.setText(data.getStringExtra("email"));
}
}

public void onButtonClicked(View v) {

Intent intent = new Intent(getApplicationContext(), finalActivity.class);
startActivity(intent);
finish();
}

}

아 옆에 세어나간게 있는데 양해부탁-_-;; 대강 이런식으로 한번 만들어봤다. onClick를 통해 intent 액티비티가 가능하게 하고 회원가입이 되면 회원가입이 되었다는 문구를 넣음으로써 한번 만들어봤다. 마지막 라인에 있는 코드는 로그인 되었을시 화면전환에 대한 코드를 작성했다. finalActivity라는 파일을 상속시켜서 만들어봤다.


4. Activity_regist.xml 화면 디자인 구성


대강 이런식으로 구성해보았다. 사용했었던 text는 아까하고 똑같은걸 사용했다. 단지 배치만 좀 달라졌을뿐이다. 아무튼 화면은 저렇게 구성을 했고 text에 대한 코드는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.gunjoolee.myapple.RegistActivity">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:ems="10"
android:hint="Email"
android:id="@+id/etEmail" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:hint="Password"
android:id="@+id/etPassword" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:hint="Password"
android:id="@+id/etPasswordConfirm" />

<LinearLayout
android:orientation="horizontal"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnDone"
android:text="가입"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btnCancel"
android:text="취소"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>


</LinearLayout>


이런식으로 텍스트 배치를 해보았다. 저 배치가 딱 정석인거같다. 여러모로 테스트해보고 배치 해본 결과이다.


5. Regist.Activity.java 코드

이제 이 화면이 어떻게 동작할지에 대해 코드를 짜보았다. 코드는 다음과 같다.

package com.example.gunjoolee.myapple;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class RegistActivity extends AppCompatActivity {

private EditText etEmail;
private EditText etPassword;
private EditText etPasswordConfirm;
private Button btnDone;
private Button btnCancel;

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

etEmail = (EditText) findViewById(R.id.etEmail);
etPassword = (EditText) findViewById(R.id.etPassword);
etPasswordConfirm = (EditText) findViewById(R.id.etPasswordConfirm);
btnDone = (Button) findViewById(R.id.btnDone);
btnCancel = (Button) findViewById(R.id.btnCancel);

// 비밀번호 일치 검사
etPasswordConfirm.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String password = etPassword.getText().toString();
String confirm = etPasswordConfirm.getText().toString();

if( password.equals(confirm) ) {
etPassword.setBackgroundColor(Color.GREEN);
etPasswordConfirm.setBackgroundColor(Color.GREEN);
} else {
etPassword.setBackgroundColor(Color.RED);
etPasswordConfirm.setBackgroundColor(Color.RED);
}
}

@Override
public void afterTextChanged(Editable s) {

}
});

btnDone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// 이메일 입력 확인
if( etEmail.getText().toString().length() == 0 ) {
Toast.makeText(RegistActivity.this, "Email을 입력하세요!", Toast.LENGTH_SHORT).show();
etEmail.requestFocus();
return;
}

// 비밀번호 입력 확인
if( etPassword.getText().toString().length() == 0 ) {
Toast.makeText(RegistActivity.this, "비밀번호를 입력하세요!", Toast.LENGTH_SHORT).show();
etPassword.requestFocus();
return;
}

// 비밀번호 확인 입력 확인
if( etPasswordConfirm.getText().toString().length() == 0 ) {
Toast.makeText(RegistActivity.this, "비밀번호 확인을 입력하세요!", Toast.LENGTH_SHORT).show();
etPasswordConfirm.requestFocus();
return;
}

// 비밀번호 일치 확인
if( !etPassword.getText().toString().equals(etPasswordConfirm.getText().toString()) ) {
Toast.makeText(RegistActivity.this, "비밀번호가 일치하지 않습니다!", Toast.LENGTH_SHORT).show();
etPassword.setText("");
etPasswordConfirm.setText("");
etPassword.requestFocus();
return;
}

Intent result = new Intent();
result.putExtra("email", etEmail.getText().toString());

// 자신을 호출한 Activity로 데이터를 보낸다.
setResult(RESULT_OK, result);
finish();
}
});

btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});

}
}

대략 이런식으로 구성해보았다. 비밀번호를 입력하게 되면 서로 일치하지않으면 빨간색, 일치하게 되면 가입이 되게 만들었는데 이건 구글링 해봐서 찾았다. 사실 여기서 내가 짠건 거의 없다...ㅠㅠ 하지만 코드를 보면 뭔지는 이해가 간다. 아무튼 이런식으로 화면구성 프로그램을 짜봤다.


6. Activity_final.xml 구성

이제 로그인 시키면 뭐가 나오는지에 대한 화면 구성이다. 대략적으로 나는 이렇게 만들었다.


매출관리,고객관리,상품관리 이렇게 3개를 만들었다. 그리고 text라인에 가선 이렇게 짜봤다.

?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
tools:context="com.example.gunjoolee.myapple.finalActivity">

<Button

android:layout_width="300dp"

android:layout_height="wrap_content"

android:text="고객 관리"

android:id="@+id/button2"

android:layout_gravity="center"

android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="63dp" />


<Button

android:layout_width="300dp"

android:layout_height="wrap_content"

android:text="매출 관리"

android:id="@+id/button3"

android:layout_gravity="center"

android:layout_alignParentTop="true"
android:layout_alignStart="@+id/button2" />


<Button

android:layout_width="300dp"

android:layout_height="wrap_content"

android:text="상품 관리"

android:id="@+id/button4"

android:layout_gravity="center"
android:layout_below="@+id/button3"
android:layout_alignStart="@+id/button3"
android:layout_marginTop="94dp" />

</RelativeLayout>

이렇게 만들어주면 저 위화면하고 똑같이 나온다. 아까 처음에만든 main에서 이미 이 액티피티에 대한걸 클래스로 상속시켜줬기때문에 생략하겠다.


7. Activity_final.java의 대한 코드 구성 

여기선 별거 없다. 다음과 같이 짜여졌다.

package com.example.gunjoolee.myapple;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;








public class finalActivity extends AppCompatActivity {

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


자, 이렇게 모두 구성이 완료되었다. 실행시켜보면 다음과 같아진다.




8. 실행화면




반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 웜바이러스에 대해서 포스팅해보려고한다. 사실 웜바이러스는 현존하는 바이러스 중 정말 무서운 바이러스다. 컴퓨터바이러스 대부분은 자기 자신을 복제하지 못하는데 웜바이러스는 그게 가능하다. 웜바이러스 하나만 퍼뜨려도 무한증식이 가능해서 네트워크 전체로 자기자신을 복제하며 퍼져 나간다는 것이다. 


⊙ 웜바이러스 창시자 모리스 웜

로버트
지금으로부터 26년전 그는 당시 매사츄세츠 공과대학(MIT) 인공지능 연구실에 있던 'VAX서버'에 침투하려고 했다. 자신의 존재가 노출되지 않도록 MIT 내의 PC를 사용했다. MIT 시스템에 침투한 모리스웜은 해당 프로그램을 차단하지 못하도록 막는 기능을 가졌다. 해당 프로그램이 작동되지 못하도록 할 때 마다 7번씩 자신을 복제해 전파되는 구조였다.​ 모리스는 이 웜이 유포되는 것을 통제할 수 있다고 믿었으나 해당 웜이 가진 자체 버그 때문에 썬 OS 시스템 등을 포함해 많은 시스템을 마비시켰다. 그당시 모리스웜은 박사과정중인 대학원생이었다. 이러한 모리스웜의 웜바이러스는 사회적으로도 큰 파장이 일었다. 위에서 말했듯 자기증식이 가능하기 때문에 네트워크나 인터넷으로 퍼지는것이 순식간이었기 때문에 미국의 많은 네트워크와 인터넷을 마비시켰다. 결국 모리스웜은 컴퓨터 보안법위반으로 구속되서 징역 3년형을 살았다. 하지만 지금은  현재 자신이 공격했던 MIT 내 인공지능연구소(CSAIL) 소속 병렬 및 분산 운영체제(PDOS) 그룹 담당 교수로 근무 중이다. 사회적으로 파란이 많았던 사람이지만 아마 바이러스를 만드는 방법을 알기때문에 어떻게 보안을 해야하는지도 잘 알기 때문에 그런 여러가지 공로를 인정받아 지금의 교수가 되지 않았나 생각이든다. 그리고 웜의 또하나의 중요한 특징은 정상파일을 감염시키지는 않는다는 것이다. 웜은 그냥 자신을 복제해서 퍼뜨리는 역할만 한다는 것이다. 웜의 경우는 그냥 삭제만 잘해주면 큰 문제는 없다. 치료프로그램에서 웜이라고 감지된파일을 삭제를 잘해주기만 하면 큰 문제는 없을 것이다.



대표적인 웜

Win32/Blaster.worm 
Win32/IRCBot.worm 
Win32/Bagle.worm

반응형
LIST

'보안동향 > 컴퓨터 바이러스 ' 카테고리의 다른 글

트로이목마바이러스  (1) 2016.08.16
블로그 이미지

만년필석사

,