반응형

이번에 어플을 만들면서 아주 쉽게 할 수 있었는데도 불구하고 찾아보지도 않고 끙끙댔던 인코딩 문제가 있었습니다.
쉽다고 생각했기 때문에 더 길을 찾지 못 했는지도 모르겠어요^^;
안 그래도 초보인데 워낙 프로그래밍을 안하다보니 ㅠㅠ

네이버 검색 API에 들어가는 키워드는 UTF-8 인코딩이라고해서
예전에 DB에 값을 넣고 받아오거나 할때의 기억을 살려서 UTF-8로 인코딩을 해봤지만 소용이 없더군요.

절망에 빠졌는데.. 이런.. 그랬습니다.
이전까지 제 경험과 다른 점이 있군요.

바로 API에 요청을 URL로 보낸다는 것입니다.
그리고 자바의 환경과 안드로이드의 환경 차이도 있겠지요?? (물음표인 이유는 저도 궁금해서..ㅎㅎ)
그래서 인코딩시 URLEncoder를 사용해야합니다.

제가 범했던 실수는 바로 이것입니다.
이러니 에러가 날 수 밖에 없었군요. URL에 표시되는 것과는 다르니까요.
처음에 정말 당당하게 이런 코드를 작성했습니다. 그러나 낭패 ^^;;

    String keyword = "편의점"; //이부부은 검색어를 UTF-8로 넣어줄거임.
    System.out.println("변환전:"+keyword);
    String query = null;
    try {
        query = new String(keyword.getBytes("8859_1"), "UTF-8");
    } catch (UnsupportedEncodingException e1) {
        e1.printStackTrace();
    }
      System.out.println("변환후 :"+query);
  
     try{
            URL url = new URL("http://openapi.naver.com/search?"
           +"key="+key
           +"&query="+query
           +"&target=local&start=1&display=4");

LogCat에 이렇게 엉뚱하게 변환 된 것이 기록 되었네요^^; 이건 뭔지;;


애뮬에도 아무것도 파싱되지 않았습니다;; 요청 URL이 에러니 뭔가 나올 거리가 없죠. 에러 태그에 대한 처리를 하지 않은 이상.


같이 어플 만드는 동생이 URLEncoder를 사용하니 바로 해결 되더군요. 짜잔~^^ 원래 알고 계셨던 분들은 피식 웃으실지도 모르지만 저에겐 대단한 발견이었습니다. 
  String keyword = "편의점"; //이부부은 검색어를 UTF-8로 넣어줄거임.  
  System.out.println("변환전:"+keyword);    
  String query = null;
  try {
   query = URLEncoder.encode(keyword,"UTF-8");
  } catch (UnsupportedEncodingException e1) {
   e1.printStackTrace();
  }  
  System.out.println("변환후 :"+query);    
        try{
            URL url = new URL("http://openapi.naver.com/search?"
           +"key="+key
           +"&query="+query
           +"&target=local&start=1&display=4");

LogCat에 깔끔하게 UTF-8로 변환된 것을 확인 했습니다.


애뮬에도 편의점에 대한 검색요청의 결과가 파싱되었습니다^^

반응형
반응형

계속해서 면역학에 대해 간단히 소개합니다.
저번 포스팅한데로 면역질병으로부터 숙주를 보호하고 외부의 물질과 반응하여 그 물질을 제거하며 신체 내부의 죽은 세포나 종양을 제거하기도 합니다. 그리고 대부분의 외부 물질이 항원이 되며 자신의 물질까지 항원이 될 수 있습니다. 또 면역은 자신에게 불리하게 나타나서 오히려 우리 몸에 이상을 일으키기도 합니다.

이런 면역에는 두 가지 형태가 있습니다.
크게 선천 면역(congenital immunity), 적응 면역(adaptive immunity)으로 나뉩니다.


■ 선천 면역 (congenital immunity)
선천 면역은 다른 말로 기존 면역(innate immunity) 또는 자연 면역(natural immunity)이라고 하기도 합니다.
선천 면역은 항상 존재하는 면역 반응으로 항상 활성화 되어 있습니다.
 
- 비특이적 면역반응(non-specific immunity)
   : 댜양한 종류의 항원과 반응합니다.

선천 면역의 요소는 다음과 같은 것들이 있습니다.

 - 해부학적 장해물 : 피부, 점막, 코털 등등
 - 화학적 방어체계 : 눈물의 lysozyme, 위의 염산
 - 선천 면역 세포 : 식균세포(phagocytes), 자연살해 세포(Natural Killer cell)
 - 선천 면역 단백질 : 보체(complement), 사이토카인(cytokine)

보체는 간단히 말해 항원의 인식을 도와주는 것이고, 사이토카인은 면역에 관계한 신호 물질이라고 생각하시면 됩니다.

알기 쉽게 표현하자면 우리 나라의 휴전선, 그리고 비무장 지대의 지뢰, 이나 강, 이나 요새 등과 비교할 수 있습니다.




■ 적응 면역 (adaptive immunity)
적응 면역은 후천 면역 또는 획득 면역(acquired immunity)라고도 하며 항원에 특이적으로 반응하는 특이적 면역(specific immunity)입니다.
 - 항원에 의해 유도
   : 면역 세포들의 활성
 - 특이적 면역(specific immunity)
   : 특정한 항원과 반응 - 항원수용체(antigen receptor)
 - 기억(memory)
   : 항원의 유입 횟수 증가 → 반응 커짐

적응 면역에 대해서는 조금더 설명이 필요하기 때문에 다음 포스트에서 다루겠습니다.
대략 어느 정도 비교해보자면.... 각자 맡은 역할이 다른 군인 개개인으로 비유할 수 있겠네요.
현빈 같이 아직 군인이 아닌 사람훈련소에서 적(항원)과 아군(자신)를 구분하고 또 그 적과 싸우는 훈련을 받아서 그 적이 침입했을 때특정한 적에게만 공격해서 우리 나라를 지키는 것과 유사하다고 할 수 있습니다.


이렇게 훈련병이 훈련을 받는 것 처럼 시간이 걸리기 때문에 적응 면역 반응은 선천 면역 반응 보다 느리게 일어납니다.

반응형
반응형


만들고 있는 안드로이드 어플이 네이버 검색 API를 통해 검색 결과로 나온 곳의 좌표를 받아오는데 카텍좌표계라는 것으로 값을 받아오더군요. 그런데 저는 WGS84 좌표계가 필요한 상황이었습니다 ㅠㅠ

이를 어떻게 해야할지..
처음에 열심히 검색을 했습니다. 수학 공식으라도 찾으면 그걸 프로그래밍하면되니깐요.
그러다 변환 공식이 아닌 API를 찾았습니다. 가까운 다음 지도 API좌표계 변환 API가 있더군요^^

좀 더 조사한 결과 네이버는 KTM 좌표계라는 걸 알아냈습니다.
결론 적으로 저는 다음 좌표계 변환 API를 써서 WGS84 좌표계로 변환하면 된다는 말씀!!

다음 API의 요청 주소 예는는 아래와 같습니다.

http://apis.daum.net/maps/transcoord?apikey=key&x=경도&y=위도&fromCoord=KTM&toCoord=WGS84&output=xml

파라미터로 x = 경도, y = 위도, fromCoord = 입력좌표계, toCoord = 출력좌표계, output = 출력형식 이 있네요.

모든 파라미터의 값은 string 형이고,

입,출력 좌표계의 값은 TM, KTM, UTM, CONGNAMUL, WGS84, BESSEL, WTM, WKTM, WUTM, WCONGNAMUL 이 있습니다.
위에 열거된 좌표끼리의 변환이 가능합니다.

출력 형태는 xml json 이 있고 기본은 xml입니다. 기본이 xml이니 받아와서 파싱만 하면 끝이겠군요^^

우선 KTM인 좌표 x=311277, y=552098을 KTM에서 WGS84로 변환하여 xml로 받아오도록 URL을 익스플로러에 보내보면


이렇게 xml로 값을 받아 오는군요 .

그럼 간단히 필요에 따라 아래와 비슷하게 메소드 하나만 만들면 될 것 같네요.^^
제가 만든 코드가 너무 허접하여 고수님들께서 댓글 좀 남겨주시면 감사하겠습니다.
다른 코드들을 보니깐 좌표를 x와 y로 표현한게 많던데 그렇게 하면 경도와 위도가 헷갈려서 힘들더라구요 ㅎㅎ
그래서 저는 longitude와 latitude라고 변수명을 줬습니다.

HashMap과  XmlPullParser를 사용하기 위해 사전에 import시켜줍니다.
import java.util.HashMap;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

그리고 메소드를 만들어 봐요~ ㅋㅋㅋㅋㅋ

 private HashMap<String, String> transCoord(String longitude, String latitude) { 

       private HashMap<String, String> map = new HashMap<String,String>();  //경위도를 넣을 해시에용

       final String key = "key"; //이부분의 발급받은 Key를 넣습니당.
         
       try {
        //다음 API를 사용하여 ㅁㅁㅁ 형식의 좌표를 ㅇㅇㅇ형태로 바꾼다 XML로 받아 와서 파싱한다.
        URL text = new URL("http://apis.daum.net/maps/transcoord?"
              +"apikey=" + key        //apikey
              +"&x=" + longitude                 //원래 좌표계 경도
              +"&y=" + latitude                 //원래 좌표계 위도
              +"&fromCoord=KTM"  //원래 좌표계
              +"&toCoord=WGS84"   //변환한 후 좌표계
              +"&output=xml");        //출력형식
      
     //파서를 생성하고 파싱을 시작해요. 
     XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
     XmlPullParser parser = parserCreator.newPullParser();
     parser.setInput(text.openStream(), null);
     int parserEvent = parser.getEventType();
    while (parserEvent != XmlPullParser.END_DOCUMENT) {
           switch(parserEvent) {
             case XmlPullParser.START_TAG:
                String tag = parser.getName();
                if (tag.compareTo("result") == 0) { //파서가 result 태그를 만나면 x의 y의 속성 값을 각각 longitude,latitude에 넣음.
                      map.put("longitude", parser.getAttributeValue(null, "x"));             
                      map.put("latitude", parser.getAttributeValue(null, "y"));
              }
              break;
            }
        parserEvent = parser.next();
     }
    } catch (Exception e) {
     Log.e("Net", "Error in network call", e);
       }
       return map;
   }

제가 만든 메소드를 사용해서 HashMap 으로 결과를 받아오면 매우 편리할거에요^^ 아마도 ㅎㅎ
더 편리한 방법 제보를 기다립니당~^^
반응형
반응형


요즘 만들고 있는 어플에 네이버 검색 API를 쓸 일이 있어 포스팅합니다.

네이버 오픈 API는 네이버 개발자 센터
http://dev.naver.com/openapI 로 가시면 상세한 설명을 보실 수 있습니다.

네이버 검색 API 중 지역 검색을 사용하는데요.
요청 URL(request url)요청변수(request parameter) target 값에 따라 검색 분야가 달라지네요.
지역 검색은 target값이 local입니다.
display는 받아올 결과의 수 입니다.

샘플 URL은 다음과 같습니다.
http://openapi.naver.com/search?key=test&query=%EA%B0%88%EB%B9%84%EC%A7%91&target=local&start=1&display=10

key에 자신이 받은 key값을 넣고 query에 검색할 키워드를 넣으시면됩니다.
검색어의 문자셋은 UTF-8을 써야한다고 하네요.
저는 일단 파싱만 하고 테스트만 할 목적이므로 샘플 URL에 key값만 넣어서 실행 했습니다.
샘플 URL의 검색어는 '갈비집'이네요.

출력결과로 다양한 값들이 있는데 저는 제게 필요한 것들만 받아옵니다.
우선 결과를 먼저 보여 드리면 이렇습니다.^^;; 허접하죠


결과로 주어지는 항목들은 네이버 개발자 센터에 테이블로 잘 정리가 되있습니다 ㅎㅎ
PullParser를 사용할건데요 뭐 속도가 느릴거라는 말도 있던데 어차피 전 테스트이므로 4개만 받아올거라서 크게 못 느낄 것 같아요.(그렇겠죠??????아닌가??)

package ksk06.naverapi;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class NaverTest extends Activity {
     
 /** Called when the activity is first created. */
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TextView status = (TextView)findViewById(R.id.status);
        TextView status1 = (TextView)findViewById(R.id.status1); //파싱된 결과를 보자
        TextView status2 = (TextView)findViewById(R.id.status2);
          
        boolean inItem = false, inTitle = false, inAddress = false, inMapx = false, inMapy = false;
       
  String title = null, address = null, mapx = null, mapy = null;
  String query = "%EA%B0%88%EB%B9%84%EC%A7%91"; //이부부은 검색어를 UTF-8로 넣어줄거임.
  System.out.println(query);
  
        try{
            URL url = new URL("http://openapi.naver.com/search?"
           +"key=여기에 발급받은 키값을 넣으세요"
           +"&query="+query //여기는 쿼리를 넣으세요(검색어)
           +"&target=local&start=1&display=4");
            
      
         XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
         XmlPullParser parser = parserCreator.newPullParser();
           
         parser.setInput(url.openStream(), null);
                  
         status.setText("파싱 중이에요..");
         
         int parserEvent = parser.getEventType();
         
         while (parserEvent != XmlPullParser.END_DOCUMENT){
          switch(parserEvent){                     
           case XmlPullParser.START_TAG:  //parser가 시작 태그를 만나면 실행
            if(parser.getName().equals("item")){
             inItem = true;
            }
            if(parser.getName().equals("title")){ //title 만나면 내용을 받을수 있게 하자 
             inTitle = true;              
            }
            if(parser.getName().equals("address")){ //address 만나면 내용을 받을수 있게 하자
            inAddress = true;              
            }
            if(parser.getName().equals("mapx")){ //mapx 만나면 내용을 받을수 있게 하자  
             inMapx = true;              
            }
            if(parser.getName().equals("mapy")){ //mapy 만나면 내용을 받을수 있게 하자  
             inMapy = true;              
            }            
            if(parser.getName().equals("message")){ //message 태그를 만나면 에러 출력
             status1.setText(status1.getText()+"에러");
              //여기에 에러코드에 따라 다른 메세지를 출력하도록 할 수 있다.
            }            
            break;
            
           case XmlPullParser.TEXT://parser가 내용에 접근했을때
            if(inTitle){ //isTitle이 true일 때 태그의 내용을 저장.
             title = parser.getText();             
                inTitle = false;
            }
            if(inAddress){ //isAddress이 true일 때 태그의 내용을 저장.
             address = parser.getText();             
                inAddress = false;
            }
            if(inMapx){ //isMapx이 true일 때 태그의 내용을 저장.
             mapx = parser.getText();             
                inMapx = false;
            }
            if(inMapy){ //isMapy이 true일 때 태그의 내용을 저장.
             mapy = parser.getText();             
                inMapy = false;
            }
            break;            
           case XmlPullParser.END_TAG:
            if(parser.getName().equals("item")){
             status1.setText(status1.getText()+"상호 : "+ title +"\n주소 : "+ address +"\n좌표 : " + mapx + ", " + mapy+"\n\n");
             inItem = false;
            }
            break;                   
          }          
           parserEvent = parser.next();
         }
         status2.setText("파싱 끝!");
        } catch(Exception e){
         status1.setText("에러가..났습니다...");
        }       
    }
}

레이아웃은 간단히 파싱되는걸 확인만 할거라서 텍스트뷰로 만들었습니다.
<?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"
    >
<TextView
 android:id="@+id/status" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
    <TextView
 android:id="@+id/status1" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
    <TextView
 android:id="@+id/status2" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

절대로 빠뜨리시면 안될 한가지가 있습니다.
AndroidManifest.xml 파일에 인터넷에 접근하기 위한 권한을 설정해 주셔야합니다^^
<uses-permission android:name="android.permission.INTERNET"/>

저는 이렇게 간단히 검색어에 대한 건색 결과 중 상호와, 주소, map의 좌표를 받아 온 것을 String에 넣어서 출려해 봤습니다. 실제로 편리하게 쓰시려면 List 같은 걸 사용하시면 더 좋을 거 같아요.

네이버의 다른 오픈 검색 API 도 똑같은 URL을 사용하기 때문에 target값만 바꿔 주시고 받아올 결과들에 대한 코드만 수정해 주시면 다른 검색도 쉽게 사용하실 수 있을겁니다. 
반응형
반응형

의공학에서 무시할 수 없는 분야 중 하나인 면역학(Immunology)에 대해서 공부한 내용을 포스팅합니다.
면역에 대해 공부하면서 생명의 탄생도 기적이지만, 생명의 유지도 정말 기적 같다는 생각이 들었습니다. 그리고 우리 사회에 일어나는 많은 일들을 면역으로 비유할 수도 있겠다는 생각도 했습니다.
또 면역에 대한 몇가지 잘 못된 상식을 바르게 이해할 수 있는 기회가 되었습니다.
오늘은 간단히 면역에 대해 이야기 하겠습니다.

먼저 면역이 어떤 기능을 하는지 알아보겠습니다.

■ 질병으로부터 숙주를 보호(특히 감염성)

   세균이나 바이러스 같은 미생물의 감염으로부터 우리를 보호합니다.



■ 외부의 물질과 반응, 외부 물질 제거.

   화학 물질(꽃가루 등등)이나 이식된 세포나 조직 등과 반응 합니다.


■ 신체 내부의 문제 해결

   우리 몸의 죽은 세포를 제거하고, 종양 세포도 제거합니다.

위에 열거한 것들이 면역의 기본적인 기능이 되겠습니다. 우리가 잘 알고 있듯이 외부의 미생물의 침입을 막는 것에서부터 우리 몸속의 문제를 해결하는 것 까지 면역의 기능은 다양합니다. 외부의 물질에 대한 반응이 군대의 역할이라면, 내부의 문제를 해결하는 반응은 경찰의 역할 정도로 이해하면 쉽습니다.



(그림의 시위장면과 사격장면은 면역 반응에 대한 이해를 돕기위한 이외의 목적은 없습니다. 특정 정치가의 이름이 보여서요 ㅎㅎ;)
그럼 이런 면역 반을을 일으키는 원인 물질(항원)에는 어떤 것들이 있을까요?

■ 항원(Antigen)

   - 항체(Antibody)와 반응하는 모든 물질(항체는 면역반응의 결과물입니다.)
 


   - 면역세포와 반응하는 모든 물질


   - 외부물질의 대부분

   - 자신의 물질 (자가항원)


우리를 구성하는 요소를 제외한 거의 모든 물질이 항원이 될 수 있습니다 심지어는 우리 몸을 구성하는 물질 조차도 항원으로 작용하기도 합니다. 그리고 우리 몸을 지키기 위한 면역 반응이 때때로 우리의 건강에 불리하게 나타나기도 합니다.


■ 자신에게 불리하게 나타나는 면역반응

   - 염증반응(Inflammation)
     면역 반응이 일어나는 분위에 면역 물질들이 많이 모이면서 부어오르고 열이 나며 통증을 느끼는 등의 증상이 나타납니다.



   - 과민반응(Hypersensitivity)
     외부 물질에 대해 과민 반응하여 재채기 같은 반응이 일어납니다. 또 다른 예로는 아낙필락시 쇼크 등이 있습니다.


   - 자가면역질환(Autoimmune disease)
     자기 자신의 세포나 물질에 반응하여 나타나는 질환으로 대표적으로 루푸스가 있습니다.


   - 이식 거부(transplantation rejection)
     이식된 조직에 대한 거부 반응으로 그 조직이 괴사 합니다.


우리 몸을 지키기 위한 면역 반응이 심각하게 일어나는 경우 우리 몸은 마치 도시가 전쟁을 겪은 것처럼 폐허가 되어버립니다. 전신에 염증 반응을 일으키면서 신체의 기능을 할 수 없게 되는 것이죠. 패혈증(sepsis)이 그 예가 될 수 있겠네요.


오늘은 여기까지 입니다. 면역은 우리의 생명을 유지하기 위해 꼭 필요한 것이지만 그 것이 과도하게 반응 했을 때에는 오히려 우리 몸을 상하게 하거나 심하면 생명을 위협할 수도 있다는 것 까지 이해하시면 되겠습니다^^ 면역에 대한 자세한 내용은 차차 채워 가도록 하겠습니다.

반응형
반응형


종종 어딘가 공모전이 있거나 글을 써야할 일이 있을 때 이런 문구를 많이 보게 됩니다.

 '200자 원고지 00매 내외'

이걸 보고 나면 어떤 생각이 드시나요?

"원고지 00매가 A4 몇장이지?"
"이거.. 원고지를 사야되나?"
"한글에 원고지 모양이 있던거 같던데 그걸 써야하나?"
"글을 쓰고 글자를 세어봐야하나?"

저는 이때까지 이런 생각들을 했었네요^^;

가장 편한 방법이 원고지 모양의 문서를 만드는 거라 생각했는데 이건 가독성도 떨어지고 원고지 사용법에 대한 오류도 좀 있더군요.

그런데 알고보니 한글과컴퓨터에서 만든 한글에 문서의 정보를 보여주는 기능이 있더군요.
물론 원고지로 몇매 정도 되는지의 정보도 나옵니다.

본론!

한글에서 메뉴의 [파일]-[문서 정보] 또는 단축키로 Ctrl + Q + I 를 눌러주시면 문서에 대한 상세한 정보를 볼 수 있습니다.
다섯개의 탭이 있군요.

[일반] 탭에는 문서 파일의 정보를 보여주는것 같네요.


[문서요약] 탭은 제목이나 주제등의 요약정보(이 문서는 제가 초딩때 어떤 선배님께서 작성하셨나봅니다. 날짜가 1999...;;)


[문서통계] 탭은 문서에 매우 상세한 수치로된 정보가 나옵니다. 여기에 우리가 원하는 원고지 매수에 대한 정보도 나오네요^^
이 37쪽의 문서는 원고지로 240.1장이 되는군요


[글꼴] 탭엔 문서에 사용한 글꼴 정보, [그림 정보] 탭에는 문서에 포함된 그림이 나오네요^^


오호호~ 이제부터 원고지 00매 내외라는 문구에 당황할 필요가 없어졌습니다^^
글쓰기를 좋아하시는 분들 화이팅!!
반응형
반응형

MRI에서 얻은 신호로 부터 영상을 얻어내기 위해서는 푸리에 변환(Fourier transform)이 사용됩니다.
푸리에 변환의 기본이 되는 푸리에 급수에 대해 알아오라는 과제를 받았네요.

모터, 회전 기계, 음파, 지구의 운동, 정상적인 심장 등에서의 주기현상을 코사인과 사인 함수들의 항으로 나타내는 주기함수는 푸리에 급수가 됩니다. 다시 말하면 푸리에 급수는 코사인 및 사인 항들로 이루어진 급수입니다.
푸리에 급수는 실용적으로 관심거리가 되는 불연속적인 많은 주기함수들을 다룰 수 있습니다.

다시 정리해서 말하자면
푸리에 급수 (Fourier series)
임의의 주기함수를 아래와 같은 삼각함수로 구성되는 급수로써 표현하는 것입니다.

$$ f(x)= a_0 + \sum_{n=1}^{\infty}\ (a_n\ cos\ nx\ +\ b_n\ sin\ nx)$$



그러니깐 위 그럼 처럼 사각파도 주기를 가지고 있다면 수많은 sin파의 합으로 나타 낼 수있다는 것입니다.

푸리에 급수는 주어진 주기함수 $f(x)$를 코사인 및 사인 함수로 표현하기 위한 작업에서 등장합니다.
이 급수의 계수는 오일러 공식(Euler formulas)에 의해$f(x)$로부터 결정됩니다.

푸리에 계수에 대한 오일러 공식
$f(x)$가 다음과 같은 삼각 급수
$$ f(x)= a_0 + \sum_{n=1}^{\infty}\ (a_n\ cos\ nx\ +\ b_n\ sin\ nx)$$
로 표시할 수 있는 주기 2π인 주기함수라면(즉, 이 급수는 수렴하며 합이$f(x)$가 된다면) 함수  $f(x)$가 주어졌을 때, 이에 대응하는 급수의 상수항 $a_0$와계수 $a_n$과 $b_n$는

다음 오일러 공식(Euler formulas)에 의해 결정됩니다.
$$ a_{0} = {1\over2\pi} \int_{-\pi}^{\pi}f(x)\ dx $$
$$ a_{n} = {1\over\pi} \int_{-\pi}^{\pi}f(x)\ cos\ nx\ dx $$
$$ b_{n} = {1\over\pi} \int_{-\pi}^{\pi}f(x)\ sin\ nx\ dx $$

오일러 공식이 어떻게 나오는 지는 다음 포스트를 기대해주세요^^

반응형
반응형

제가 푸리에 급수에 대해 포스팅을 하려다보니 수식을 넣어야 겠는데 방법을 몰라 검색해보니 여러가지 방법이 소개되어 있더군요. 그 중 지금 소개 드리려는 방법이 가장 간단한 방법인 것 같습니다.

우선 TeX라는 문법을 알아야 쓸 수 있다고 하는데 제가 써보니 공학계산기 정도 쓰는 수준이라면 간단한 수식은 별 어려움 없이 입력할 수 있을 것 같네요^^
이 글을 쓰고 있는 지금 저는 TeX문법이 자세히 어떤 것인지 잘 모른답니다
기회가 되면 상세히 알아보고 포스팅하겠습니다^^

그럼 본론으로 넘어가서 블로그에 수식 입력하는 방법을 소개하겠습니다.
html이나 javascript에 대한 간단한 지식만 있다면 매우 쉽습니다^^.
사실 뭐 그런 지식이 없어도 따라만 하시면 수식을 입력할 수 있습니다.
제가 티스토리를 사용하니 티스토리를 예로 설명해 드리겠습니다.

블로그에 로그인해서 관리자에서 [스킨]-[HTML/CSS 편집] 으로 이동합니다.
여기서 skin.html <head>와 </head> 사이에  아래 코드를 넣어줍니다.

<script type="text/javascript"  src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"> </script>

<script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['$$','$$']]} }); </script>

사실 첫 번째 줄만 넣어줘도 수식 입력이 가능합니다.

아래 줄은 우리가 입력할 때 수식임을 알리는 문자를 사용자 정의 하는 코드 입니다. $ 부분이 글자와 글자 사이에 수식을 입력할때 쓰이고 $$는 한 줄을 차지하는 수식을 입력할 때 쓰입니다.
다시 말하면, 저 부분을 다른 문자로 바꿔주면 그 문자가 수식임을 알리는 문자가 되겠지요 HTML의 tag처럼요^^

만약에 $f(x)=x^2$이라고 입력하면 그 줄에 $f(x)=x^2$ 로 출력됩니다.
그리고 $$f(x)=x^2$$ 이라고 입력하면 한줄을 차지하는 $$f(x)=x^2$$ 이 출력 되겠지요^^

그런데 저는 이 글에 $를 어떻게 입력할 수 있었을까요?? HTML 태그 처럼 보이지 않아야 정상일텐데요^^
저는 <FONT>$</FONT> 이렇게 태그로 감싸버렸습니다.^^ 저도 이것 때문에 한참을 고민했네요 ㅋㅋㅋ
hyunkyukim.tistory.com/31 을 참고했습니다^^

아무튼 블로그에 수식 입력 성공입니다^^!!!!!
다른 블로그에서도 HTML 수정하는 부분에서 수정해 주신다면 똑같이 적용할 수 있겠지요. ㅎㅎ

반응형
반응형

파이썬에서 리스트는 값들의 나열로 여러 종류의 값을 담을 수 있고 문자열 처럼 0부터 시작하는 인덱스를 가지고 있어서 슬라이싱도 가능합니다.



[ ] 를 이용해서 리스트를 만듭니다.





append() 메서드를 사용해 기존 리스트에 값을 추가할 수 있습니다. 이 때 값은 리스트의 맨 뒤에 추가됩니다.
insert() 메서드를 사용하면 append()와 다르게 리스트의 원하는 위치에 값을 추가할 수 있습니다. 이 때 인자 값은 리스트의 인덱스입니다.
extend() 메서드로는 튜플이나 리스트 같은 여러 값을 한번에 삽입할 수 있습니다. 이 때도 append() 처럼 맨 뒤에 추가됩니다.




리스트에서는 + 연산자를 지원하는데 이 것을 사용할 때에는 튜플이나 리스트 처럼 반복되는 값을 넣어야 합니다. 만약에 문자열을 넣을 경우에는 문자열의 문자 하나하나가 슬라이싱되서 리스트에 들어가게됩니다.




index() 메서드를 사용해서 특정 값의 인덱스를 찾을 수 있습니다. 이 때 index()는 처음 찾은 값만을 반환 합니다. 만약 리스트의 인덱스 0에 '슬기'가 있고 5에도 '슬기'가 있으면 0만을 반환합니다. 그래서 index()의 두 번째 인자에 시작점을 세 번째 인자에 종료점을 지정해 줄 수있으며 범위 안에 특정 값이 없을 경우 리스트 내에 그 값이 없다는 에러를 출력합니다.




pop() 메서드로 리스트에서 값을 뽑아낼 수 있습니다. 인자가 없을 경우 뒤에서부터 차례로 값을 뽑고, 인자가 있을 경우 해당 위치의 값이 뽑힙니다. 뽑힌다고 표현한 이유는 pop된 값은 리스트에서 없어지기 때문입니다.




count() 메서드는 해당 값이 리스트 안에 몇개 있는지를 반환합니다.




remove() 메서드는 말 그대로 해당 값을 삭제합니다. 동일한 값이 있을 경우에는 앞 쪽의 값을 삭제합니다.




sort() 메서드와 reverse() 메서드로 리스트를 정렬할 수 있습니다. sort()는 순방향, reverse()는 역방향 입니다.
이 두 메서드는 정말 편리한 메서드라느 생각이 드네요 ㅎㅎ




그리고 sort()의 key값을 정해서 자신이 원하는 방식으로 리스트를 정렬할 수 있습니다.
아래는 단어의 마지막 문자를 비교해서 정렬하는 것을 보여주는 코드입니다.
단어의 마지막 문자를 반환하는 함수 sorttest()를 정의하고 sort()메서드의 key로 지정합니다.



단어의 마지막 문자를 기준으로 오름 차순으로 정렬된 것을 볼수 있습니다.

reverse를 True로 하면 역방향도 가능합니다.

 

반응형
반응형

자바 응용프로그램(application)을 실행하기 위해서는 main() 함수가 있어야 합니다.
다시 말하면 프로그램이 실행되면 가장 먼저 찾는 것이 main() 함수라는 것이고, main()함수가 프로그램의 시작점인 것입니다.
main() 함수의 생긴 모양과 각각의 의미를 한 번 알아볼까요?

class A
{
public static void main(String[] arg)
{

...

}
}

위에서 A는 클래스의 이름 입니다.

main() 함수의 모양을 보면

처음에 접근권한이 public 으로 시작합니다. 이 것은 어떤 인터프리터(interpreter)도 접근 가능하게 하기 위함입니다.

다음으로 static 키워드가 나오는데 이것은 main()이 제일 먼저 실행되어야하기 때문에 static 키워드를 붙여 프로그램 시작시 먼저 메모리에 올라가도록 해서 이 함수를 사용하기 위함이라고 합니다.
static 키워드를 빼도 문법에 어긋나지 않기 때문에 컴파일 에러는 나지 않지만 프로그램이 실행되지 않습니다. 즉 static 키워드가 없으면 프로그램의 시작점인 main()함수를 찾을 수 없는 것입니다.

void는 반환형(return type)이 되겠습니다. C++에서는 main()함수의 반환형이 int로 되어 있어 숫자 0을 반환함으로써 프로그램의 자원을 반납하고 종료시키는데 자바에서는 void로 반환하는 것이 없습니다. 이것은 아마도 자바는 메모리 관리를 프로그래머가 직접하지 않기 때문이 아닌가 생각됩니다. 정확히 아시는분은 댓글 부탁드립니다^^

그리고 인자(argument)가 String 클래스의 배열로 되어있는데 이 것은 그 값이 어떤 형태이든 모든 값을 문자열로 받아들이고 또 여러 개의 인자를 받아들이겠다는 의미라고합니다.
프로그램 실행 시에 인자를 여러 개 입력할 때 띄어쓰기로 구분하고, 띄어쓰기가 포함된 문자열은 " "을 이용해 입력합니다.

만약 java A 1 2.5 text 라고 실행한다면

문자열 '1', '2.5', 'text'가 A클래스의 main()함수의 인자로 들어가는 것이죠.

제가 아는 바는 여기까지입니다 ㅋㅋ
저의 설명에 잘 못된 점이나 추가할 것이 있으면 댓글 부탁드립니다^^
반응형
반응형

임상의공학 시간에 신경생리학 부분에 대한 보충 자료로 본 영상입니다.
에드 보이든의 방법으로 뇌를 해석할 수 있게 된다면 그 다음 세상은 어떤 세상이 될까요?
마지막 후안의 한마디가 깊은 의미를 가지고 있는 것 같습니다.

가장 중요한 것은 인간의 정신을 바라보는 시각이 변했다는 것과 그것을 해석하려는 방법도 변하고 있다는 것이라고 생각합니다. 뉴런들을 전기적 신호가 아닌 빛으로 제어할 수 있다니 정말 놀라울 뿐입니다.  


반응형
반응형

Anthony Atala(안소니 아탈라) 박사의
인공 장기 배양에 대한 소개 입니다.

근육, 혈관, 방광 등이 배양되는 모습을 소개하고
장기를 찍어내는 기계도 소개합니다.

영화나 소설에서나 가능할 것 같은 일들이 가능해진다는 것이 정말 가슴 설레는 일인것 같습니다.
요즘 저는 옛날 만화를 즐겨보는데 그 70~80년대 만화 속에 그려진 로봇, 전화, 컴퓨터 같은 것들이 지금은 현실이 되어있습니다. 미래는 어쩌면 스티븐 스필버그나 미야자키하야오 같은 사람들이 설계해 주는 것이 아닐까요?

반응형
반응형
TED에서 퍼온 영상입니다.

사람의 신장을 프린트한다!!
앞으로 조직공학이 어떤 방향으로 발전할지 모르겠지만 정말 놀라운 영상입니다.
이런 일이 가능하다는 것은 사람의 장기를 만들기 위해 다른 생명체에 해를 주지 않을 수 있다는 의미겠지요??
그리고 세상에 장기기증을 기다리는 많은 사람들에게 희망적인 이야기가 될것 같습니다.

더 나아가서 나중에 이렇게 개발한 장기가 정상적으로 기능하고 잘 공급된다면 장기매매 같은 범죄도 줄일 수 있지 않을까 생각 되기도하네요.

 


반응형
반응형

파이썬에서는 영어는 물론 한글도 문제없이 화면에 출력됩니다. 하지만 이런 출력이 내 컴퓨터뿐 아니라 다른 사람의 컴퓨터 특히 다른 언어권과 운영체제에서도 동일하다고는 확언할 수 없습니다.

세계 각국의 다양한 문자 표현하기 위한 표현 방식을 인코딩(Encoding)이라고 합니다.

각각의 언어권마다 서로 다른 인코딩을 사용한다면 프로그램을 다른 나라 사람도 사용하게 하려면 엄청 애를 먹을 겁니다. 그래서 세계의 모든 문자를 한 방식으로 표현할 수 있는 유니코드(Unicode)를 사용합니다.



파이썬 3.x 에서는 일반 문자열이 기본적으로 유니코드입니다. 즉 프로그램에서 글씨가 깨질 걱정을 할 필요가 없는 것입니다. 유니코드를 제외한 나머지 인코딩된 문자는 bytes로 표현됩니다.
그리고 문자를 특정 코드로 인코딩하고 싶을 때는 encode()를 사용하고




어떤 문자의 유니코드 값을 알고 싶을 떄는 ord()를 사용하고




어떤 유니코드 값에 해당하는 문자를 알고 싶을 때는 chr()을 사용합니다.





현재 시스템의 인코딩이 뭔지 알고 싶을 때는 아래와 같이 확일 할 수 있습니다.

반응형
반응형



수소 원자핵 양성자의 회전 속도를 알기 위해서 Larmor equation을 이용합니다.
위 그림에서

μ : Nuclear magnetic moment(핵자기 모멘트), spin

ω0 : 세차 운동의 회전 속도

B0 : 외부 자장

을 나타냅니다.

Larmor equation
ω(r) = γB(r)

즉, 회전 속도는 외부에서 걸어준 자장의 세기와 비례한다는 의미 입니다.

E ∝ ω0

γ는 비례상수로 자장의 세기가 1T일 때 42.576MHz 입니다. 1.5T에서는 64MHz라고 하네요.

ω0의 범위는 약 10^7 ~ 10^8 정도 라고 합니다.
그래서 MRI는 공명을 일으키기 위해 수십 MHz 대역의 RF(Radio Frequency)를 사용합니다.

사진은 Larmor equation을 발견한 Joseph Larmor(1857~1942, 영국) 입니다.


반응형
반응형

수소 원자핵 양성자(proton)의 스핀은 외부 자장이 없으면 회전 축이 무작위로 배열되어 의미 있는 신호를 얻기 힘듭니다.
외부 자장에 의해 스핀은 자장에 수평한 방향으로 정렬되어 자장을 축으로 회전하게 됩니다.
그림으로 보면 아래와 같은 모양이 되겠지요. (외부 자장 B0가 z축 방향으로 흐르고 있습니다.)



하지만 이때 스핀이 외부 자장에 평행하기는 하지만 모든 스핀의 방향까지도 외부 자장과 일치 하지는 않습니다.
그래도 강력한 자장 속에서 외부 자장과 같은 방향으로 세차운동하는 양성자수가 외부 자장과 반대 방향인 것보다 약간 더 많기 때문에 정렬된 양성자 스핀들의 벡터 합을 MRI 신호를 만들기 위해 사용합니다.

서로 반대 방향의 스핀 수의 차이는 자장의 세기에 따라  다음 그림으로 타나낼 수 있습니다.
자장의 세기가 0.5T(Tesla)일 때 100만개 중 3개, 1T일 때 100만개 중 6개 차이이니 아주 미세한 차이라는 것을 알 수 있습니다.


이런 미세한 차이의 벡터의 합을 Net magnetization(평균자화) 이라고 하고 기호 로는 M 이라고 나타냅니다. 
그리고 이렇게 M이 외부자장의 방향으로 형성되는 것을 Longitudinal magnetization(종축자화) 라고 합니다.


반응형
반응형

원자는 핵과 전자로 구성되어 있고 핵에는 양전하를 띄는 양성자가 있습니다.
양성자는 일정하게 축을 따라 회전 운동(spin)을 합니다.



수소 원자 핵의 spin은 자기 모멘트(μ : Nuclear magnetic moment)를 가지고 있어 작은 막대 자석에 비유할 수 있습니다.


이렇게 회전 운동을 하는 양성자들은 외부에 자장(B0)이 없는 상태에서는 회전축(spin axis)이 무작위로 배열되어있습니다.
이때 외부 자장을 가하면 원자핵의 스핀들이 자장의 방향에 따라 일직선으로 정렬해서 자장축을 회전하게됩니다.

이렇게 정렬된 수소원자핵들에서 나오는 자장을 이용해서 MRI에 필요한 신호를 만들게 됩니다.
자세한 내용은 계속 포스팅 됩니다.^^

반응형
반응형

파이썬(python)에서는 몇 가지 문자열 연산자를 지원합니다.
 
' + ' 는 문자열을 병합합니다.
' + ' 는 문자열 상수끼리에서는 생략할 수 있습니다.
 
' * '는 문자열을 반복 시킵니니다.

확인해 보면 아래와 같습니다.

 



그리고 파이썬에서는 문자열은 a[x] 형태로 인덱싱 됩니다. 제일 첫 문자는 0부터 시작합니다.
하지만 문자열 인덱싱을 이용한 문자열 변경은 허용되지 않습니다.





인덱싱을 사용해서 특정 위치의 한 문자 뿐만 아니라 문자열을 꺼낼 수도 있는데 이를 슬라이싱(slicing)이라고 합니다. 문자열 변수 뒤에 [시작위치:끝위치]를 분여서 원하는 문자열을 꺼냅니다.

시작 위치는 0을 문자열 첫 문자의 바깥쪽(왼쪽)으로 시작해서 한칸씩 이동합니다. 'kkoseul'을 예로 들면
0 k 1 k 2 o 3 s 4 e 5 u 6 l 7
이 됩니다.

만약에 시작 위치가 음수 인 경우는 문자열의 끝에서 부터 세어갑니다.
(-7) k (-6) k (-5) o (-4) s (-3) e (-2) u (-1) l

그리고 a[:2]나 a[-4:] 처럼 위치를 생략한 경우 각각 문자열의 처음이나 끝으로 처리합니다.



title에 'kkoseul'을 넣고 슬라이싱을 해보면 다음과 같은 결과가 나옵니다.





그리고 :를 이용해 인덱스를 증가시킬 수를 정할 수 있습니다. a[::2] 처럼 입렵하면 문자열의 처음부터 2칸 씩넘어서 문자를 출력합니다. 그리고 이 증가 인자가 생략되면 1씩 증가시킵니다.





그리고 문자열이나 수치들 사이의 변환은 각 타입 클래스의 생선자를 사용합니다.
아래를 보면 각가의 타입의 변한것을 확인할 수 있습니다.
출력을 확인해 보니 정수 1024로 입력한 a는 1024.0으로, 문자열 "500"으로 입력한 b는 정수 500으로, 실수 1.414로 입력한 c는 문자열 '1.414'로 출력되네요^^



이렇게 정리를 하다보니 파이썬은 문자열을 처리하는 일이나 각 자료의 타입을 변환하기에 제가 아는 다른 언어에 비해 편리하다는 생각을 하게 되네요. 앞으로 계속될 파이썬 공부가 기대됩니다^^




반응형
반응형

 


파이썬에서 변수들은 해당 객체의 주소를 가지고 있습니다.
예를 들어 a=1이라고 하면 a가 1이라는 값을 가지는 것이 아니라 1이라는 객체가 생성되고 이 객체의 주소가 변수에 저장되는 것입니다.

객체의 고유한 id 값을 반환하는 id() 함수를 사용해서 확인해 보겠습니다.

리스트로 만든 a는 리스트가 있는 주소를 기억 하고 b 역시 이 주소를 복사하기 때문에 리스트 안의 내용을 수정하면 b를 호출해도 수정된 내용이 표시됩니다. 새로운 객체를 생성한 것이 아니라 객체 내의 a[0] 내용만 바꿨으므로 객체의 id역시 처음과 똑같이 유지 되는군요.

한마디로 말하자면 a와 b는 같은 객체를 공유하고있는 것입니다.



하지만 integer형으로 a와 b를 만들었을 때는 조금 다른 결과가 나오네요. a에 다른 값을 넣으니 a의 id가 바뀐 것을 확인할 수 있습니다. 아마도 이런 타입에서는 변수의 값이 바뀌면 새로운 id로 객체가 생성되나 봅니다. 정확한 속 사정을 아시는 분은 코멘트 좀 부탁드려요~~!




혹시나 해서 자바에서도 제 나름 비슷하게 따라 해봤는데 유사한 결과가 나오네요.






리스트의 경우에 a와 b가 같은 객체를 공유하지 않게하려면 아래와 같이 [:]을 써서 복사하면 됩니다.
복사 후에 id를 확인해 보면 서로 다른 id를 가진 것을 확인할 수 있습니다. a[0]만 수정했을 때 당연히 a와 b를 호출하면 서로 다른 값이 나옵니다.





리스트 이외의 경우는 copy 모듈을 사용합니다. copy 모듈의 copy()함수는 주소가 복사되는 얕은 복사(shallow copy)를 하며, deepcopy()함수는 객체를 공유하지 않는 깊은 복사(deep copy)를 합니다.



다시 한번 자세히 비교해 보면 다음과 같습니다.
마지막 줄에 리스트 각각의 id는 다르지만 그 리스트의 1번 인덱스의 id를 비교해 보면 a[1]와 cp[1]은 같은 id를 가지고 있는 것을 확인 할 수 있습니다. 분명히 copy()가 얕은 복사라고 했는데 a와 cp의 id가 서로 다르게 나와서 처음에 많이 헷갈렸습니다.


프로그래밍할 때 얕은 복사와 깊은 복사에 유의해서 사용해야겠네요^^

 


반응형
반응형
자바도 이제 어느 정도 역사를 가진 언어가 된것 같습니다. 지금 와서 자바에 대해 포스팅 한다는 것이 많이 늦은 감이 있지만 그래도 제가 공부했던 언어 중 하나이고 여전히 자바를 사용하는 곳들이 많다고 생각되기 때문에 다시 한번 정리 하는 차원에서 포스트를 시작해 보려 합니다.

먼저 이번 포스트에서는 자바와 C언어를 비교해 보겠습니다!!

 자바와 C 언어는 어떤 차이가 있을까요? 


■ 1. 메모리를 접근하는 방식에 차이가 있습니다.


   C 언어 : pointer를 이용해서 메모리에 접근합니다. 하지만 이 pointer를 사용해서 부트영역을 건드린다면 치명적인 오류가 발생합니다.

   자바 : reference를 사용합니다.
  
C언어는 100번지에 직접 물건을 전달하려 하는데 실수로 101번지에 배달하면 오류가 발생하지만 Java는 우체국을 통해 보내서 주소가 다를 경우 수취인 불명으로 반송되는 정도로 생각하면 좋을 것 같습니다.


■ 2.

   C 언어 : 관련된 데이터를 하나로 모으기 위해 구조체(Structure)공용체(Union)를 사용합니다.

   자바 : 클래스(Class) 개념을 사용합니다.


■ 3. 구성 단위

   C언어 : acb.c 형태의 소스파일, abc.h 형태의 헤더파일 등 파일 단위로 되어 있어 #include를 사용해 문서에 포함합니다.

   자바 : 클래스(Class) 단위로 되어 있어 import를 사용해 포함 시킵니다.


■ 4. 타입(type) 정의

   C언어 : 구조체 등을 사용해 새로운 타입의 정의가 가능합니다.

   자바 : 타입을 정의할 수 없습니다.

■ 5. goto

   C언어 : goto 를 사용합니다.

   자바 : goto라는 예약어는 있지만 사용하지 않습니다.

goto를 사용하면 로직이 복잡해진다고 하네요.


■ 6. 형변환 (casting 캐스팅)

   C언어 : 자동 형변환을 합니다.

   자바 : 자동으로 형변환을 하지 않고 오류를 발생시킵니다.

C언어의 경우 int a = 3.14 라고 정의할 경우 a를 자동으로 3으로 캐스팅합니다. 만약에 이것이 314를 3.14로 잘 못 쓴 것이라면 오류를 찾아내기가 어렵습니다. 자바에서는 이런 사용자의 실수를 방지하기위해 형검사를 엄격하게 한다고 합니다.


■ 7. 상속 (Inheritance)

   C++ : 다중 상속이 가능합니다.

   자바 : 단일 상속만 가능합니다.

다중 상속이 가능할 경우 상속한 각각의 부모에 같은 변수 명이 있는 경우 그 변수가 어디서 온 것 인지 알기 어렵다고 합니다.


■ 8.

   C언어 : 파일 단위 이기 때문에 마음에 드는 부분을 가져다 쓸 수 없고 배껴야합니다.
abc.c → 컴파일(Compile) → abc.obj → 빌드(Build) → abc.exe 과정을 거쳐 최종적으로 바이너리 파일이 됩니다.
그래서 플랫폼에 종속적입니다.  예를 들면 UNIX에서 만든 abc.exe 는 WINDOWS에서는 실행이 안 됩니다. 라이브러리가 다를 수 있기 때문입니다.

   자바 : 클래스(Class) 단위의 객체 지향언어이고, interpreter방식 입니다.
abc.java → 컴파일 → abc.class → interpreter(자바가상머신) → 각 플랫 폼에 맛게 실행 하는 방식으로
바이너리가 아닌 바이트 코드의 클래스 파일을 읽으면서 자기 플랫폼에 맞게 실행됩니다. 즉 플랫폼에 독립적입니다.
반응형
반응형

인터넷에서 글을 쓰거나 '한글' 또는 'MS워드'등 워드프로세서 이외의 공간에서 글을 쓰면서 특수문자를 입력하고 싶을때가 많습니다. 보통 '자음' + '한자키' 를 이용해서 특수 문자를 입력하는데요. 각각의 조합에 어떤 문자들이 있는지 한번 정리해 볼게요^^

보시고 잘 찾아서 사용하시면 편할 것 같습니다.

자음 + 한자키 + Tab 을 누르면 모든 항목을 볼 수 있습니다.^^


■ ㅂ + 한자키 - 선문자

 


■ ㅈ + 한자키 - 숫자




■ ㄷ + 한자키 - 수식기호



■ ㄱ + 한자키 - 기호



■ ㅅ + 한자키 - 한글 원문자,괄호문자



■ ㅁ + 한자키 - 도형



■ ㄴ + 한자키 - 괄호



■ ㅇ + 한자키 - 영어 원문자, 괄호문자



■ ㄹ + 한자키 - 단위



■ ㅎ + 한자키 - 그리스어



■ ㅋ + 한자키 - 한글 자모



■ ㅌ + 한자키 - 한글 옛 자모



■ ㅊ + 한자키 - 분수, 첨자



■ ㅍ + 한자키 - 알파벳



■ ㅃ + 한자키 - 가타카나



■ ㄸ + 한자키 - 히라가나



■ ㄲ+ 한자키 - 유럽 특수문자


■ ㅆ + 한자키 - 키릴 자모

반응형
반응형

파이썬에서 문자열은 어떻게 나타낼까요?

파이썬에서는 인용부호인 ''" "로 묶어서 문자열을 표현합니다. '로 시작했다면 '로 끝나고 "로 시작했다면 "로 끝나야겠지요.

 

그리고 다량의 문자열을 넣기 위해 """ 이나 '''을 사용할 수 있습니다. 이 경우는 줄바꿈이나 탭도 그대로 적용됩니다.



"""이나 '''을 사용하지 않고 줄바꿈이나 탭 등을 표현하고 싶을 때는 몇몇 다른 언어들과 마찬가지로 이스케이프 문자(Escape sequence)를 이용합니다.

\n : line feed 줄바꿈
\t : tab
\r : carriage return
\0 : null
\\ : back slash (한글 글씨체에서는 \가 되겠지요?)
\' : single quotation mark(단일 인용 부호)
\" : double quotation mark(다중 인용 부호)


그리고 문자열 앞에 r 을 붙여서 raw문자열을 만들 우 있습니다. 이 문자열에서는 이스케이프 문자가 적용되지 않고 인용 부호 안의 문자가 그대로 출력됩니다.


반응형
반응형

파이썬에서 수치를 가공하기 위한 연산자는 어떤 것들이 있는지 알아보죠.

우선 치환연산자 또는 대입 연산자라고 불리는 = 이 있고, 사칙 연산을 위한 +, -, *, / 가 있습니다 *는 곱하기고, /는 나누기가 되겠지요.그리고 나머지를 구하기 위한 %연산자와 거듭제곱을 표현하기 위한 ** 연산자가 있습니다. 마지막으로 나눈 결과의 정수부분만을 취하는 // 연산자도 있습니다.

=      +      -      *      /     %     **     // 


각각 어떤 출력을 하는지 확인해 보면 아래와 같군요.



그럼 간단히 원의 넓이와 삼각형의 넓이를 구해볼까요?
우리가 알고 있는 수학 공식을 그대로 써주면 됩니다.

반응형
반응형

이번 포스트에서는 파이썬의 자료형(data type)중 수치에 대해서 알아보겠습니다.

수치형은 숫자를 나타내는 자료형입니다. 종류는 int, long, float, complex 등이 있습니다.
단, 파이썬 2.x 버전에서는 long 형을 제공했지만 파이썬 3.x 버전에서는 long형이 없어지고 모두 int형으로 처리됩니다.

입력한 각 수치의 수치형을 알아보기 위해서 type() 이라는 함수를 사용할 겁니다. type() 함수는 인자로 준 자료형을 반환하는 함수입니다.

int 는 정수(integer)이며, 정수를 입력하면 10진수 정수로 처리합니다.
float 은 정수를 제외한 실수 를 입력하면 10진수 실수로 처리합니다. 소수하고 생각하시면 편할 것 같네요. 그리고 e를 써서 지수형으로 표현할 수 있습니다.




■ 정수 앞에 0b 를 붙이면 2진수, 0o를 붙이면 8진수, 0x를 붙이면 16진수로 처리합니다.



■ 10진수를 입력 받아서 다른 수체계로 변환해주는 함수도 있습니다. 단, 이때 출력되는 결과는 수치형이 아닌 문자열입니다.



■ 파이썬에서는 실수보다 넓은 범위인 복소수를 나타내고 사용할 수 있습니다. 학교에서 배웠던 복소수의 모양 그대로 실수부와 허수부로 입력 해주면 complex 형으로 처리합니다.



imag는 허수(imaginary number)를 나타내고 real은 실수(real number)를 나타냅니다. 그리고 conjugate() 메서드로 켤레복소수(conjugate complex number)를 구할 수 있습니다.
반응형
반응형

 

■ 프로그램이 연산을 수행하기 위해서 값들은 임시로 저장하거나 영구적으로 저장할 곳이 필요한데 이런 저장소를 변수(variable)라고 하고 이런 저장소에 붙인 이름을 변수명이라고 합니다. 변수는 유형에 따라 서로 다른 자료형(type)을 가집니다. 우선 파이썬(Python)에서는 어떤 변수명을 사용할 수 있는지 알아보겠습니다.

■ 파이썬(Python) 에서는 변수(variable)의 이름으로 문자숫자 그리고 밑줄(_)을 사용할 수 있습니다. 
단, 숫자는 변수 이름의 제일 처음에 나올 수 없습니다.

예를 들면  n, number, num3, num_4 , _value 등의 형태는 사용할 수 있지만 2_numberhi~, hello! 등과 같이 숫자가 앞에 있거나 특수 문자가 포함된 변수 명은 사용할 수 없습니다.



사용 가능한 변수명을 입력하면 변수가 정의되지 않았다는 NameError가 뜨는데 사용할 수 없는 변수명을 입력한 경우에는 구문에 맞지 않다는 SyntaxError가 발생하는군요.


 
■ 그리고 파이썬(Python)은 대소문자를 구분하기 때문에 변수를 만들거나 사용할 때 주의해야 합니다.




변수 각각에 값을 대입해서 확인해 보니 대소문자를 구분하는 것을 확인 할 수 있습니다.




■ 또 같은 파이썬(Python)의 예약어는 변수명으로 사용할 수 없습니다.
파이썬의 예약어는 다음과 같습니다.

and,  as,  assert,  break,  class,  continue,  def,  del,  elif,  else,  except,  is,  finally,  for, from,  global,  if,  import,  in,  lambda,  nonlocal,  not,  or,  pass,  raise,  return,  try,  while,  with, yield


예약어 중에 if를 변수 명으로 사용하니 SyntaxError가 나는군요.


■ 마지막으로 보통 변수에 값을 대입할 때 대입연산자(=)를 사용하는데 파이썬에서는 튜플(tuple)이나 리스트(list)를 사용하기도 합니다.


각각의 순서에 따라 변수에 값이 대입된 것을 확인할 수 있었습니다.

리스트는 []로 묶어서 표현하는 값들의 나열로 순서가 있으며 0부터 시작하는 인덱스를 가지고 있습니다. 튜플은 리스트와 유사하나 ()로 묶어서 표현하며 읽기전용 입니다.
반응형
반응형

 

■ 소재와 문명 (Materials and Civilization)
  소재는(Materials) 인간 문화와 문명에 필수적인 부분입니다. 그 예로 각 시대를 구분하는데에 그 시대에 많이 사용했던 소재의 이름을 붙이는 것을 알 수 있습니다.

 - 석기시대 (Stone age)


 

 - 청동기시대 (Bronze age)



 - 철기시대 (Iron age)

 
  그렇다면 지금은 어떤 시대라고 할 수 있을까요?

  지금은 기존의 문명을 이루었던 소재들을 포함해서 플라스틱, 반도체, 초전도체 등등 다양한 소재가 함께 사용되는 시대라고 할 수 있을 것 같습니다. 때로는 자연에 존재하는 소재를 발견 하는 것 뿐만 아니라 합성 소재를 만들어 내기도 합니다.
 
 
 
 

  그리고 소재를 통해 에너지를 공급하기도 합니다. 예를 들면 핵발전 시에 우라늄이라는 소재를 사용해서 에너지를 발생 시키며 탄소로 된 봉을 이용해서 이 에너지의 양을 조절합니다.
  초전도체 같은 소재는 저항이 없을 대 효율이 높아지는 것들에 사용되며 대표적인 이용 예로 병원에 있는 MRI가 있습니다.




반응형
반응형

이번 학기에 자기공명 영상에 대해서 배웁니다^^
제가 배운 내용을 기초로 적는 글이라 부족함이 많겠지만 도움이 되길 바랍니다!!

■ MRI?
 요즘 어느 정도 규모가 큰 병원이라면 MRI라는 시설을 갖추고 있습니다. 그리고 실제로 많은 사람들이 이 진단장비를 통해서 질병의 진단을 받습니다. 그럼 이 MRI라는 녀석에 대해서 간단히 알아볼까요?

 'Magnetic Resonance Imaging' 우리말로 옮기면 '자기공명영상'입니다.

이름에서 느껴지듯이 MRI는 자장을 사용하는 장비입니다. 우리 나라를 기준으로 지구의 자장이 0.5G(가우스)정도인데 MRI는 지구 자장의 15000~30000배 정도의 자장을 사용합니다.

그러면 이런 큰 자장을 얻기 위해서는 어떻게 해야될까요?

우선 자석의 종류에는 크게 지남철을 이용한 영구 자석과 전류의 흐름을 이용한 전자석이 있습니다.
MRI에서는 전자석을 이용하게 되는데 높은 자장을 얻기 위해 초전도 물질을 사용합니다.

 


초전도 물질은 전기 저항이 '0Ω'이기 때문에 전기적 소모가 없어 처음에만 전류를 흘려주면 코일의 루프를 통해 전류가 영원히 흐르게 됩니다. 또한 열 발생이 없어 아주 높은 전류를 통하게 할 수 있기 때문에 높은 자장을 얻을 수 있습니다.




■ MR System 의 정의
 - 고자장을 이용하여
 - 인체 내부 단면 영상(MR Imaging) 또는 분광정보(MR Spectroscophy)를 얻어
 - 질병을 진단하는
 - 비파괴 영상장치 (in vivo : 인체의 손상 없이)
정도로 정의할 수 있습니다.

단면 영상을 통해 장기의 위치나 구조등 인체 내부의 해부학적 정보를 얻을 수 있고,
분광 정보를 통해 장기나 조직의 대사 정보를 얻을 수 있습니다.


■ MRI 특징
 - 인체에 무해 (non-invasive)
 - 연부조직의 대조도(soft tissue contrast)가 우수
 - 다양한 변수 (ρ, T1, T2, v, D, σ 등등)
 - 임의의 방향으로 영상(oblique imaging)이 가능
 - 해부학, 분광학적 영상 및 기능적 영상이 가능
 - 실시간 중재적 시술 및 영상 유도 수술

MRI는  방사선 피폭 등의 위험이 없고 X-ray나 CT에 비해 살, 근육, 장기 등 연부 조직(soft tissue)에 대한 대조도(contrast)가 우수합니다. 그리고 X-ray는 조직에 대한 감쇠계수만을 변수로 갖고 있지만 MRI는 다양한 변수를 통해 같은 부위라도 용도에 맞는 다른 영상을 얻을 수 있습니다.
 


예를 들면 위 사진과 같이T1와 T2는 서로 contrast가 반대이고 T2는 주로 암 진단에 사용합니다. 또 환자나 기계를 이동시키거나 회전 시키지 않고 다양한 방향으로 영상을 얻을 수 있고(S/W적으로), 장기의 위치나 구조 등의 해부학적 영상 및 조직의 대사 정보를 얻을 수있는 분광학적 영상(운동 전 근육과 운동 후 젖산이 쌓인 근육 등) 또는 기능적영상(뇌기능:해부학적 구조는 그대로인데 자극에 대해 어디서 반응이 나타나는지 확인)을 얻을 수 있습니다. 마지막으로 특수한 경우에 실시간 중재적 시술이나 영상유도 수술에 사용할 수 있습니다.
(그런데 자료를 찾다보니 고해상도 CT에서 더 좋은 영상을 얻는 경우도 있는 것 같습니다.^^;;)


위 사진은 CT와 MRI 영상의 비교입니다 A가 CT, B가 MRI입니다. CT영상을 통해 석회 침착등을 쉽게 관찰할 수 있고 MRI영상을 통해 종양을 진단할 수 있습니다. 사진에서 CT는 뼈가 하얗게 나온 반면에 MRI에서는 검게 나옵니다 이것은 MRI는 뼈에서 신호를 거의 안 받기 때문이라고 합니다.


■ MR Signal
MR Signal은 H(수소)원자핵에서 나온 신호이며 우리 몸 속의 H2O(물)분자의 H 원자핵 농도에 따라 영상이 나타납니다.


■ MR Angiography
혈관의 혈류를 조영제 없이 영상으로 나타낼 수 있다는 장점이 있습니다. 하지만 요즘은 MR용 조영제를 사용하면 혈류를 더욱 잘 볼 수 있기때문에 조영제를 사용합니다. (MR에서 사용하는 조영제는 CT나 X-ray에서 사용하는 조영제와는 다른 성분으로 부작용이 훨씬 적다고 합니다.)





■ MRI가 등장할 수 있었던 배경
1924년 Wolfgang Pauli가 원자핵이 스스로 회전(스핀)하고 있다는 것을 발견
 → 전하를 띈 물질이 움직이면(회전) 주변에 자장이 발생한다.
1937년 Nuclear Magnetic Resonance(NMR) Phenomenon
 → 에너지를 가진 것들은 공명현상을 가지는데 원자핵은 자장에 대한 공명현상을 가지고 있다.
1946년 Measurement of NMR Signal
→ 자기장 내 저 에너지 준위의 원자핵은 특정 주파수(spin에 맞는 주파수)의 복사선(RF)을 흡수하면 고 에너지 준위로 전위한다.
→ 에너지와 주파수는 비례한다. (E=hv)

반응형
반응형
HTTP를 통해서 주고 받는 자료의 많은 부분은 XML형식으로 조직화 되어 있다고 합니다.
안드로이드에서는 XML Pull Parser를 제공하여 XML 파일을 파싱합니다.

그럼 네트워크에 있는 XML 파일의 파싱을 한번 해 볼까요?
URL객체를 생성하는 것은 웹에서 자료를 읽어올 때와 다를 것이 없습니다.
XMLPullParserFactory를 이용해 XMLPullParser 객체를 생성하고 URL 객체를 이용해 입력 스트림을 파서에 연결해서 적절한 메서드를 루프에서 반복 호출 하면서 XML 문서를 읽어서 파싱하게 됩니다.

아래 코드에서는 파서가 시작 태그를 만났을 때 (START_TAG)만 동작합니다.
시작 태그를 만났을 때 요소의 특성을 조회하고 비교해서 정보를 로그에 기록합니다.
즉 코드에서는 flickr feeds에서 이미지 URL만 뽑아 로그에 기록합니다.

XMLPullParser 의 next()와 getEventType()이 반확하는 속성들은 다음과 같습니다.
START_TAG : 요소의 시작 태그를 만났을 때 반환 (<tag>)
TEXT : 요소의 텍스트를 만났을 때 반환 (<tag>TEXT</tag>에서 TEXT)
END_TAG : 요소의 종료 태그를 만났을 때 반환 (</tag>)
END_DOCUMENT : XML 파일의 끝에 도달했을 때 반환

package net.bment.net;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class XmlparseActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TextView status = (TextView)findViewById(R.id.status);
        TextView status1 = (TextView)findViewById(R.id.status1);
        TextView status2 = (TextView)findViewById(R.id.status2);
       
        try {
   URL url = new URL("http://api.flickr.com/services/feeds/photos_public.gne"
     + "?id=26648248@N04&amp;lang=en-us&amp;format=atom");
   
  XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
  XmlPullParser parser = parserCreator.newPullParser();
   
   parser.setInput(url.openStream(), null);
   
   status.setText("파싱 중이에요..");
   int parserEvent = parser.getEventType();
   while (parserEvent != XmlPullParser.END_DOCUMENT){
    switch(parserEvent){
    case XmlPullParser.START_TAG:  //parser가 시작 태그를 만나면 실행
     String tag = parser.getName();
     
     if(tag.compareTo("link") == 0){   
      String relType = parser.getAttributeValue(null, "rel");
      
      if(relType.compareTo("enclosure") == 0){
       String encType = parser.getAttributeValue(null, "type");
       
       if(encType.startsWith("image/")){
        String imageSrc = parser.getAttributeValue(null, "href");
        Log.i("Net", "image source = " + imageSrc); //parser에서 받아 온 값을 Log에 기록
        status1.setText(status1.getText()+ ".");

       }       
      }
     }
     break;
    }
    
    parserEvent = parser.next();
   }
   status2.setText("파싱 끝!");
  } catch(Exception e){
         Log.e("Net", "네트워크 에러가..났습니다...", e);
  }
 }
}


로그에 이미지 파일의 URL이 기록됬습니다.

에뮬레이터에도 제가 코딩한데로 메시지가 뜨는군요^^ 히히

반응형
반응형

HttpURLConnection 클래스는 URL 객체가 가리키는 자원의 HTTP 상태와 헤더 등의 정보를 제공합니다.

다음은 HttpURLConnection을 사용해 URL에 대한 정보를 얻어오는 예제입니다.
결과는 LogCat이 친절히 보여주는군요 ^^
해당 URL의 자원 내용을 가져오려면 getInputStream() 을 호출하면 됩니다.

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

//...중략

try {
        URL url = new URL("http://kkoseul.tistory.com/entry/2011080101");
        
        HttpURLConnection http = (HttpURLConnection)url.openConnection();
        Log.i("Net", "length = " + http.getContentLength());
        Log.i("Net", "respCode = " + http.getResponseCode());
        Log.i("Net", "contentType = " + http.getContentType());
        Log.i("Net", "content = " + http.getContent());

 


 
        InputStream isText = http.getInputStream();
         byte[] bText = new byte[2048];
         int readSize = isText.read(bText);
         Log.i("Net", "readSize = " + readSize);
         Log.i("Net", "bText = " + new String(bText));
         isText.close();
         http.disconnect();
 
     }catch(Exception e){
         Log.e("Net", "네트워크 에러가..났습니다...", e);
     }

//...생략


처음에 length 값이 '-1'이라 좀 의아해 했는데 찾아보니 getContentLength()는 명확하지 않으면 -1을 반환하는군요^^ 
반응형
반응형

안드로이드 네트워킹 API를 사용해서 네트워킹을 지원해 보도록할까요?
Java를 해보신 분이라면 한 번쯤 보셨을 java.net 패키지가 사용됩니다.

가장 흔히 쓰이는 HTTP를 위주로 진행해 보겠습니다.
참고로 HTTP로는 대부분의 자료를 캡슐화 할 수 있고 SSL을 적용함으로써 보안 통신을 수행할 수도 있습니다.


■ 웹(Web)에서 자료 읽기!

  웹에서 자료를 읽어 오는 것은 비교적 간단합니다.
  읽고자하는 웹 페이지의 URL을 알기만 하면 java.net 패키지의 URL 클래스를 사용해서 원하는 자료를 읽어 올 수 있습니다.

import java.io.InputStream;
import java.net.URL;

//...

try {
URL url = new URL("http://kkoseul.tistory.com/entry/2011080101");

InputStream isText = url.openStream();
byte[] bText = new byte[250];
int readSize = isText.read(bText);
Log.i("Net", "readSize = " + readSize);
Log.i("Net", "bText = " + new String(bText));
isText.close();
}catch(Exception e){
Log.e("Net", "네트워크 에러가..났습니다...", e);
}

 
읽어올 자료의 URL을 URL객체로 생성합니다. 그다음 URL에 대한  입력 스트림을 열고 자료를 읽으면 됩니다.
  위 코드의 경우는 250byte 만큼만 자료를 읽은 후 스트림을 닫습니다.

  네트워크 상의 자원을 이용할 때에는 통신망의 상태나, 자원이 있는 서버의 상태에 따라 오류가 날 수 있으므로 이 점을 알고 있어야하며 또 URL이 잘 못 되는 경우도 있으니 주의가 필요합니다. (try-catch문을 쓰는 이유가 이것?^^)
  
  그리고 중요한 한 가지! 
  안드로이드 응용프로그램이 네트워크 기능을 사용하려면 적절한 권한이 필요합니다.
  AndroidManifest.xml 파일의 <manifest>요소 하위에 <uses-permission>요소를 추가합니다.

<uses-permission android:name="android.permission.INTERNET"/>

 
  추가하지 않으면..여러분도 저와 같은 메시지를 보게 되실겁니다 ㅠ_ㅠ

 
  위의 한 줄을 추가하니 기분 좋은 로그가 보이는 군요^ㅁ^ 여기까지가 웹에서 자료를 읽어오기 였습니다!  


다음 포스트에서는 HttpURLConnection 클래스를 사용해서 자료에 대한 정보를 가져와 보도록 하겠습니다!!
반응형

+ Recent posts