헬릭스미스, 말초동맥질환 예방, 치료 관련 특허 취득

말초동맥질환은 대동맥이나 사지 동맥에 협착이나 폐쇄가 존재하는 경우로 동맥경화증에 의해 가장 흔하게 발생한다. 전 세계적으로 고령화 사회에 진입하면서 주목 받고 있는 질환 중 하나로 서구에서는 당뇨 환자에서 말초혈관 질환의 유병률 이 16~22%에 이르고 있으며, 아시아에서는 6~10%로 보고되 고 있으나 서구에 비해 진단이 덜 이루어져 실제 유병률보다 낮게 나온 것으로 여겨지고 있다. 하지만 아시아에는 유의미한 통계정보가 부족하다보니 통상 서구보다 낮다고 할 수 없다.

헬릭스미스는 "간세포 성장인자 및 기질세포 유발인자 1알파를 포함하는 말초동맥질환의 예방 또는 치료용 조성물" 특허권을 취득했다고 17일(금) 17시 이후에 공시했다. 회사 측은 "이 발명을 이용하면 허혈성 지체 질환 등 말초동맥질환을 효과적으로 예방 또는 치료할 수 있어 의약품으로 개발할 예정"이라고 밝혔다.

약간의 잡음이 최근에 있긴 하지만,(증자를 통한 주가 하락 등) 헬릭스미스는 특허권 취득과 임상 결과가 하반기(8월 예정)에 있을 예정이므로, 비율을 조정해서 들어가는 방법을 추천함.

Posted by 목표를 가지고 달린다
,

개발자의 길을 정말 넓다...거기서 어디를 가야할 지는 아무도 알려주지 않는다.
내가 무엇을 하는 하는 스타트업 멤버나, 중소기업의 개발자, 대기업의 개발자....

나의 가치를 인정받고 내가 원하는 것(또는 위치나 회사)을 얻기 위해 지금 맡겨진 업무를 적응하는 것이 우선이고, 잘하는 것이 다음이다.

본업을 잘 하고 있다면, 이제 시야를 넓히자. 주변 사람을 그대를 "IT전문가"로 알고 있지. 분야가 있다는 건 모른다. 그래서 IT관련이라고 하면 여러분에게 기회를 물어다 줄 것이다. 그 기회를 잡을 수 있냐 없냐는 여러분께 달려있다. 살면서 기회란 다른사람이 물어주는 것이 90이고, 자기가 찾는 것이 10이다. 여러분의 만나는 사람들이 여러분이 하는 일들이 어떻게 여러분께 기회를 가져다 줄 지 모르니, 전체적인 시야를 가지고 본업을 더 깊게 하거나 또는 좋아하고 잘 할 수 있는 분야로 넓혀가자.

30대가 지나고, 40대를 향해 가지만, 나 역시 새로운 분야를 공부하기 위해 책을 펴면서 지난 10년 정말 기술과 개발 프로세스가 많이 변화하였구나를 새삼 느낀다. 4~5년 전에, 식당에서 옆 테이블에서 "시세를 표시하는데, 합계를 추가해 달라고 해서 SQL 쿼리가 복잡해졌어..." 이런 불만을 들으면서, 속으로는 "CUBE쓰면 되지 별거 없는데,, 개발(업무)에 너무 많은 에너지를 사용하게 되니, 기술 습득이 정체돼 있구나.." 하며 안타까웠는데, "지금 내가, 내 스스로에게 안타깝다." 앞으로의 시간을 막연한 불안함 속에 살지 않기 위해 더 노력해야 겠다.

20대분들은 아직 젊으니, "모를 수도 있고, 배운 적이 없다." 라는 것이 통용될 나이지만 언제가 30대 중후반부터는 모르는 것이 부끄러울 수도 있다. 다른 분야는 변화가 더디고, 경험이란 것이 많이 중요하지만, IT는 경험과 기술이 비슷한 수준으로 중요하다보니, 게으른 선배가 경험이 많다고 해서 좋은 선배가 된다는 보장은 없다.

미친듯이 일하는게 아니라, 미친듯이 (자기) 개발하라.

 

Posted by 목표를 가지고 달린다
,

드디어 다시, 18만원 이하로 떨어짐..

대웅제약은 최근 소송과 관련해서 다시 이슈가 된 이후, 약 8% 가량 떨어지면서 최근 바이오주식들이 하락세를 보이는 와중에 18만원대로 떨어졌다. 덕분에 기존에 진입을 못했던 투자자들에게는 진입 기회가 온 것이다.

물론, 코오롱생명과학처럼 이슈가 문제가 되어, -70% 손실을 볼 수도 있겠으나, 최근 대웅제약의 나보타는 미국에서 판매가 좋을 뿐만 아니라, 유럽까지 판매처를 확산하고 있다. 관련 기사는 아래에 링크를 확인하시면 된다.

기사1) 대웅제약은 ITC의 미국 국제무역위원회(International Trade Commission, ITC)가 결정한 균주에 대한 증거수집 절차를 통해 메디톡스 균주를 비교 분석하여 나보타 균주의 적법성을 증명할 예정이라고 14일 밝혔다.

미국 소송은 한국 소송과 달리 증거수집 절차를 통해 양 측이 소송에 필요한 자료를 서로에게 요구, 전달받도록 돼 있다.

증거수집 절차 기간 동안에는 양 측이 필요한 자료들을 추가적으로 요청할 수 있으며 대웅제약도 포자 형성 여부 감정과 유전체 염기서열분석 등을 진행하기 위해 메디톡스의 균주를 제공받도록 요청했다.

ITC 재판부는 증거수집 절차에 따라 양사에 균주 제출을 요구할 것이므로 메디톡스 역시 대웅제약이 지정한 전문가에게 균주를 제출하게 된다. 대웅제약은 양사의 균주를 정밀 비교 분석하여 그 결과를 ITC에 제출할 예정이다.

현재 증거수집 절차에 따라 양사는 서로에게 균주를 제출하는 시기와 방법에 대해 조율 중이다.

대웅제약이 소송에 실패시 승자가 되는 메디톡스의 주식에는 큰 변화가 없음.


대웅제약에 따르면 메디톡스는 현재까지 언론보도를 통해 자사의 전체 염기서열을 공개하겠다고 하면서 이를 통해 양사의 균주를 비교하자고 적극적으로 주장해 왔다.

그러나 아직까지 전체 염기서열을 직접 공개하지 않고 있으며, 자사의 균주가 어떠한 경우에도 포자를 형성하지 않는다고 국내소송 등에서 일관되게 발표해 왔다.

대웅제약은 미국소송 뿐만 아니라 국내 소송에서 양사 균주의 포자 형성 여부를 비교함으로써 메디톡스 주장의 허구성을 입증할 것으로 기대하고 있다고 밝혔다.

기사2) 2019.04.26 대웅제약 (179,000원▲ 5,000 2.87%)이 자체 개발한 보툴리눔 톡신 제제 "나보타"의 유럽시장 진출을 위한 마지막 허가관문을 넘어섰다. 유럽 내 의약품 사용을 심사하는 전문가들의 권고로 사실상 현지 허가 발표 절차만 남기게 된 것이다.


대웅제약은 26일(현지시각) 유럽의약품청(EMA) 산하 약물사용자문위원회(CHMP)에서 나보타(유럽제품명 누시바)의 미간주름 개선 효과에 대한 유럽 사용허가 권고 의견을 획득했다고 밝혔다.

추가) 대웅제약이 올해 1분기 매출액은 2381억원, 영업이익은 102억원을 기록했다. 이는 지난해 같은 기간에 비해 매출은 10.3%, 영업이익은 27.2% 증가한 실적이다.

Posted by 목표를 가지고 달린다
,

온라인 서비스는 멀티프로세스로 인해, 개별 거래의 속도가 느릴지라도 사용자가 느낄 만큼 속도가 느린 경우는 없다. 물론 조회시 where 조건들이 index에 등록되어 있지 않다면, 처음에는 속도가 느린 것을 느끼지 못할지라도 ... 자료가 쌓이면 속도가 느린 것을 느낄 것이다.

 

그럼 실행 쿼리의 실행시간 기준으로 TOP 10을 조회하여, 해당 where 조건에 항목들에 대해 인덱스를 생성해주면 된다.

인덱스 생성시에 모든 조건을 인덱스로 만들어서는 안된다. 데이터 1건인데, 인덱스가 10개면 실제 11개의 처리가 발생하므로, 속도저하가 발생하고 인덱스 실행 계획이 원하지 예상하지 못하는 방식으로 나와 문제가 될 수 있다.

인덱스는 무조건 5개 이하이다.

왠만하여 공통 인덱스는 모든 업무를 커버할 수 있도록 선정하고, 조회는 인덱스만 잘 설정되어 있다면 문제 없다. 

만약, 배치업무를 수행하는데 느리다면, 다음 사항을 체크해 보자.

1. 조회시 인덱스를 이용하는지?
2. Array 작업을 수행하는지? 
3. 중간중간 commit 을 수행할 수 있는지? 
4. Counter 체크 
5. 통계 정보 생성 
6. 불필요한 과거 정보 삭제
7. 업무 프로세스 변경

1. 조회시 인덱스를 이용하는지? 또는 TABLE FULL SCAN 을 하는지? 만들었다고 생각하지 말고, 체크해보자. 그리고 인덱스는 순차적으로 차례대로 찾기 때문에 항목이 5개인 인덱스는 중간에 3번 항목이 없다면, 결국 1번과 2번 항목만 인덱스를 읽고 나머지는 range_scan을 하기 때문에 데이터량에 따라 항목 조절을 해야 한다.

2. Array 작업을 수행하는지? 대량의 작업은 기본적으로 다량 Fetch, 일괄 Insert(또는 Update)를 수행해야 속도가 빠르다. execute() * 10000 보다는 batch_Execute() * 5 가 몇십배 빠르다.

3. 중간중간 commit 을 수행할 수 있는지? 업무에 따라, 중간에 commit을 할수 있다면, 몇천건 또는 몇만건 단위로 commit을 수행한다면 재작업시 작업량을 줄일 수 있다. 검토 후 중간에 commit을 삽입하자.

4. Counter 체크 : 오라클의 sequence를 사용하지 않고, select max(seq) from tableA; 사용한다면, 당장 변경하라.
* 혹시 개발자 중에서 SELECT TASEQ.nextval from BigTable where rownum =1; 로 개발했다면, 당장 변경하라.
SELECT TASEQ.nextval from dual; 로 실제 수행속도는 테이블의 사이즈에따라 몇백배까지 차이 난다.

5. 통계 정보 생성 : 통계정보가 최신화 되지 않아 plan이 느릴 수 있으므로, Analyze 해보자.

6. 불필요한 과거 정보 삭제 : 데이터의 사이즈에 따라, 성능이 저하될 수 도 있으므로 과거 정보 삭제나 parition 나누자.

7. 업무 프로세스 변경 : DB에서 index 타고, 기본적인 속도개선까지 했다면 프로세스 변경을 고려해 보자. 여기까지 한 후, 하드웨어 증설을 고려하자.

# 추가 설명. sql 구성요소들은 아래와 같은 순서로 실행 된다

1) FROM, WHERE 절을 처리
2) ROWNUM 조건 적용
3) SELECT COLUMN LIST 절을 적용
4) GROUP BY 절을 적용
5) HAVING 절을 적용
6) ORDER BY 절을 적용

그러므로, 4번의 예시처럼 의미없이 대량의 테이블에서 rownum <=1 을 하면, 대량의 자료를 fetch 한후 nextval을 가져오는 불필요한 작업이 발생하므로, dual을 적절히 사용하자.


추가 tip. SMS 제품에서는 Oracle에서 제공하 v$sql, DBA_HIST_SQLSTAT, DBA_HIST_SQLTEXT, DBA_HIST_SNAPSHOT 등의 테이블을 이용하여, TOP N Query(상위 N개의 쿼리)를 제공한다. 이것을 바탕으로 지연 서비스의 쿼리 실행계획 및 실행 단위의 소요시간까지 제공해준다. SMS제품이 제공해 주는 것외에 본인이 DBA 또는 고급 개발자로써, 서비스 품질을 위한다면, 아래의 내용을 참고하여 개선 대상을 찾아 고민해보자.

다만, 아래의 것은 여러분이 문제를 찾기 위한 Query일 뿐, 해결방법은 각양각색이므로 획일적으로 답할 순 없다.

반복하는 쿼리 중에서 총 수행시간이 긴 쿼리 찾기.
(짧은 업무일지라도, 단일 프로세스로 처리되면 문제가 된다. 예를 들어, 30msec * 100만번이면, 300,00초= 6,000분 = 100시간이 된다.)

SELECT * FROM (
SELECT S.SQL_ID, ROUND(SUM(CPU_TIME_DELTA)/100000) CPUTIME, SUM(EXECUTIONS_DELTA) TOTAL_EXECUTED,
DBMS_LOB.SUBSTR(SQL_TEXT,2000,1) SQLTEXT
FROM DBA_HIST_SQLSTAT H, DBA_HIST_SQLTEXT S, DBA_HIST_SNAPSHOT T
WHERE S.SQL_ID = H.SQL_ID
AND H.SNAP_ID = T.SNAP_ID
AND T.BEGIN_INTERVAL_TIME BETWEEN TO_DATE('20190513 09:00:00','YYYYMMDD HH24:MI:SS') AND TO_DATE('20190514 15:00:00','YYYYMMDD HH24:MI:SS')
GROUP BY S.SQL_ID, DBMS_LOB.SUBSTR(SQL_TEXT,2000,1) ORDER BY 3 DESC
)
WHERE rownum < 21 and CPUTIME > 1000 ;


ORACLE서버에서 수행시간이 긴 쿼리 찾기 쿼리
SELECT ROWNUM NO,
PARSING_SCHEMA_NAME,
to_char(ELAPSED_TIME/(1000000 * decode(executions,null,1,0,1,executions)),999999.9999 ) 평균실행시간,
executions 실행횟수,
SQL_TEXT 쿼리 ,
SQL_FULLTEXT
FROM V$SQL
WHERE LAST_ACTIVE_TIME > SYSDATE-(1/24*2)
-- AND LAST_ACTIVE_TIME BETWEEN to_Date('20111226163000','YYYYMMDDHH24MISS') AND to_Date('20111226170000','YYYYMMDDHH24MISS')
-- AND ELAPSED_TIME >= 1 * 1000000 * decode(executions,null,1,0,1,executions)
and PARSING_SCHEMA_NAME = 'ZIPCODE'
ORDER BY 평균실행시간 DESC, 실행횟수 DESC;


SELECT TO_CHAR (SID) sid, serial# serialNumber,
SUBSTR (TO_CHAR (last_call_et), 1, 6) executeSeconds, userName, machine,
b.sql_text sqlText
FROM v$session a, v$sqltext b
WHERE username NOT IN ('SYSTEM', 'SYS')
AND a.TYPE != 'BACKGROUND'
AND a.status = 'ACTIVE'
AND a.sql_address = b.address(+)
AND a.sql_hash_value = b.hash_value(+)
ORDER BY a.last_call_et DESC, a.SID, a.serial#, b.address, b.hash_value, b.piece


현재 실행되고 있는 쿼리 와 실행 시간

SELECT TO_CHAR (SID) sid, serial# serialNumber,
SUBSTR (TO_CHAR (last_call_et), 1, 6) executeSeconds, userName, machine,
b.sql_text sqlText
FROM v$session a, v$sqltext b
WHERE username NOT IN ('SYSTEM', 'SYS')
AND a.TYPE != 'BACKGROUND'
AND a.status = 'ACTIVE'
AND a.sql_address = b.address(+)
AND a.sql_hash_value = b.hash_value(+)
ORDER BY a.last_call_et DESC,
a.SID,
a.serial#,
b.address,
b.hash_value,
b.piece

Posted by 목표를 가지고 달린다
,

//이미지 뷰를 보여줌

ImageView.setVisibility(View.VISIBLE);

//이미지뷰 안보이게(공간은 남음)

ImageView.setVisibility(View.INVISIBLE);

//이미지뷰 아예 숨기기 공간조차 없어짐

ImageView.setVisibility(View.GONE);

2. ViewPage를 이용한 페이지 만들기 : https://yoo-hyeok.tistory.com/58?category=708422

2. Customized RadioButton : https://yoo-hyeok.tistory.com/57?category=708422

2. RadioButton : https://yoo-hyeok.tistory.com/55?category=708422

2. ListView 하기..리스트를 커스컴마이즈.. : https://yoo-hyeok.tistory.com/53?category=708422

2. Customized Dialog 하기 : https://yoo-hyeok.tistory.com/51?category=708422

2. 문자만 표시하는 Dialog 하기 : https://yoo-hyeok.tistory.com/50?category=708422

2. gif 이미지 넣기(동영상보다는 gif가 좋을 듯) : https://yoo-hyeok.tistory.com/48?category=708422

2. 최근 splash 방식 : velog.io/@pish11010/Android-Splash-Screen-%EA%B5%AC%ED%98%84

[Android] Splash Screen 구현

Splash Screen 은 일반적으로 앱이 실행될 때 나타나는 화면입니다.YouTube 앱 실행 시 나오는 잠깐 로고화면이 나오고 앱 메인화면으로 진입되는데, 여기서 로고가 나온 화면이 Splash Screen 입니다.이

velog.io

2. 어플 대표 화면 넣기 : https://yoo-hyeok.tistory.com/31?category=708422

[Android] 안드로이드 Splash Activity (어플 설명 액티비티, 어플 대표 화면) 만들기

카카오톡 실행시켜보면 처음에 카카오톡 이미지가 나오고 1초뒤에 카톡이 실행됩니다. 어플리케이션의 대표 레이아웃을 넣어 어플리케이션의 이미지를 담당하는 액티비티입니다. 만드는 방법은 간단합니다. 프로젝..

yoo-hyeok.tistory.com

3. 백버튼 눌렀을 때 알림창. https://yoo-hyeok.tistory.com/32?category=708422

유혁의 엉터리 개발

소프트웨어 개발자

yoo-hyeok.tistory.com

4. Json 사용 법 : https://yoo-hyeok.tistory.com/37?category=708422

[Android] 안드로이드 JSON 문자열 파싱(parsing)

String JSONData = "{"school":[{"subject1":"math"},{"subject2":"korean"}],"name":"유혁"}" (문법 생략) 안드로이드 스튜디오에서 파싱하기 ArrayList ArrList = new ArrayList(); //어레이 리..

yoo-hyeok.tistory.com

5. firebase push 이용법 : https://yoo-hyeok.tistory.com/43?category=708422

[Android] Firebase(Google Cloud Message) 를 이용한 푸시알림 구현 - (1) 환경설정

휴대폰 게임을 하다보면 중간중간에 아이템이 왔다며 푸시알림을 많이 받아보셨을 겁니다. 안드로이드 개발중에 이런 푸시알림을 주고싶을 때 GCM을 사용합니다. Firebase가 최근에 나온 버전이고 Firebase 만으로..

yoo-hyeok.tistory.com

Posted by 목표를 가지고 달린다
,

1. 스마트폰은 기본적으로 일정 시간동안 아무런 반응이 없으면 자동으로 화면이 꺼지게 됩니다.

원할 경우 실행되는 동안 화면을 안꺼지 게 할수 있습니다.
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
을 추가하게 되면 실행되는 동안 화면이 꺼지지 않습니다.

2. Dialog 타이틀바 없애기.

3. EditText에 이벤트 주기

EditText 이벤트는 addTextChangedListener() 를 사용하면 보다 쉽게 다룰수가 있었다.( setOnClickListener() 보다 좋음.)

et.addTextChangedListener(new TextWatcher(){   

   public void afterTextChanged(Editable arg0) {
    // TODO Auto-generated method stub    
   }   

   public void beforeTextChanged(CharSequence s, int start, int count,
     int after) {
    // TODO Auto-generated method stub    
   }

   public void onTextChanged(CharSequence s, int start, int before,
     int count) {
    // TODO Auto-generated method stub
    
   }
         
});

4. intent : https://yoo-hyeok.tistory.com/15?category=708422 putExtra를 단일 String, ArrayList 모두 가능.

5. 서비스 등록하기

Service는 background에서 처리를 계속할 수 있는 클래스이다.
Service는 기본적으로 activity를 가지지 않는다.

서비스를 구현하기 위한 3가지 절차
-- Service 클래스를 확장한 새로운 클래스 정의
-- Manifest file에 Service 선언 추가
-- App에서 Service 실행



1. 서비스를 실행하는 클래스 - 타이머를 이용한 반복 처리.

public class MyService extends Service implements Runnable {

    // 시작 ID
    private int mStartId;
    // 서비스에 대한 스레드에 연결된 Handler. 타이머 이용한 반복 처리시 사용.
    private Handler mHandler;
    // 서비스 동작여부 flag
    private boolean mRunning;
    // 타이머 설정 (2초)
    private static final int TIMER_PERIOD = 2 * 1000; 
    private static final int COUNT = 10;
    private int mCounter;


    // 서비스를 생성할 때 호출
    public void onCreate() {
        Log.e("MyService", "Service Created.");
        super.onCreate();
        mHandler = new Handler();
        mRunning = false;
    }


    // 서비스 시작할 때 호출. background에서의 처리가 시작됨.
    // startId : 서비스 시작요구 id. stopSelf에서 종료할 때 사용. 

     //onStart는 여러번 호출될 수 있기 때문에 식별자로 사용.

    public void onStart(Intent intent, int startId) {
        Log.e("MyService", "Service startId = " + startId);
        super.onStart(intent, startId);
        mStartId = startId;
        mCounter = COUNT;

        // 동작중이 아니면 run 메소드를 일정 시간 후에 시작
        if (!mRunning) {
              // this : 서비스 처리의 본체인 run 메소드. Runnable 인터페이스를 구현 필요.
              // postDelayed : 일정시간마다 메소드 호출
              mHandler.postDelayed(this, TIMER_PERIOD);
              mRunning = true;
        }
    }

 

    // 서비스의 종료시 호출
    public void onDestroy() {
        // onDestroy가 호출되어 서비스가 종료되어도 
        // postDelayed는 바로 정지되지 않고 다음 번 run 메소드를 호출.
        mRunning = false;
        super.onDestroy();
    }



    // 서비스 처리
    public void run() {
        if (!mRunning) {
            // 서비스 종료 요청이 들어온 경우 그냥 종료
            Log.e("MyService", "run after destory");
            return;
        } else if (--mCounter <= 0) {
            // 지정한 횟수 실행하면 스스로 종료
            Log.e("MyService", "stop Service id = "+mStartId);
            stopSelf(mStartId);
        } else {
            // 다음 작업을 다시 요구
            Log.e("MyService", "mCounter : " + mCounter);
            mHandler.postDelayed(this, TIMER_PERIOD);
        }
    }

    // 원격 메소드 호출을 위해 사용
    // 메서드 호출을 제공하지 않으면 null을 반환
    public IBinder onBind(Intent intent) {
        return null;
    }
}




2. 서비스 실행, 종료를 사용자가 요청하는 클래스

// 서비스 시작과 종료를 요구하는 Activity
public class MyServiceActivity extends Activity {

    ComponentName mService;    // 시작 서비스의 이름
    TextView mTextView;              // 서비스 상태 표시



    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mTextView = (TextView)findViewById(R.id.text_view);
        
        Button start = (Button)findViewById(R.id.start_button);
        start.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                startHelloService();
            }});
        
        Button stop = (Button)findViewById(R.id.stop_button);
        stop.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                stopHelloService();
            }});
    }



    // 서비스 시작 요청
    private void startHelloService() {
        mService = startService(new Intent(this, MyService.class));
        mTextView.append(mService.toShortString()+" started.\n");
    }

 

    // 실행한 서비스 중지 요청

    private void stopHelloService() {
        if (mService == null) {
            mTextView.append("No requested service.\n");
            return;
        }
        
        Intent i = new Intent();
        i.setComponent(mService);
        if (stopService(i))
            mTextView.append(mService.toShortString()+" is stopped.\n");
        else
            mTextView.append(mService.toShortString()+" is alrady stopped.\n");
    }
}


3. 사용자가 서비스 실행, 종료하는 화면 구성

<!-- 시작 -->
<Button android:id="@+id/start_button" android:text="Start"
android:layout_width="fill_parent" android:layout_height="wrap_content" />

<!-- 종료 -->
<Button android:id="@+id/stop_button" android:text="Stop"
android:layout_width="fill_parent" android:layout_height="wrap_content" />

<!-- 상태표시 -->
<TextView android:id="@+id/text_view_id"

android:editable="true"
android:layout_width="fill_parent" android:layout_height="fill_parent" />

6. 컴포넌트의 생명주기
컴포넌트의 생명주기는 컴포넌트를 인스턴스화 할 때 시작해서, 인스턴스가 사라질 때 종료됩니다.
액티비티의 경우 그 사이에 활성화, 비활성화가 될 수 있기 때문에 사용자에게 보이거나 , 또는 보이지 않을 수도 있습니다.

1. 액티비티 생명주기


액티비티는 필수적으로 세 가지의 상태를 가지고 있습니다.

▣ 활성화(activity) 또는 실행 (running) 상태

액티비티가 포그라운드 화면으로 사용자에게 보이는 상태입니다 ( 즉, 현재 태스크에서 스택의 최상위에 위치하는 것).
이 상태는 사용자 액션을 받을 수 있게 됩니다.


▣ 멈춤(paused) 상태

사용자 액션을 받진 못하지만 여전히 보여지고 있는 상태입니다. 즉 다른 액티비티가 그 위에 위치하지만 해당 액티비티가 화면을 전부 채우지 않거나 투명해서 멈춤 상태의 액티비티를 볼 수 있는 상태입니다.
이 상태의 액티비티는 살아있습니다 ( 모든 상태정보와 멤버를 유지 중 )
하지만 , 메모리 부족시엔 시스템에 의해 강제종료 될 수 있습니다.


▣ 정지 (stopped) 상태

완전히 다른 액티비티에 의해 가려진 상태입니다.더 이상 사용자에게 보이진 않지만 여전히 살아서(정보와 멤버유지) 있는 상태이죠.
여전히 보여지진 않기 때문에 메모리 부족시엔 강제종료 될 수 있습니다.



액티비티가 멈춤 또는 정지 상태라면, 시스템은 finish() 메소드를 호출하거나 프로세스를 강제종료 시킴으로서 메모리에서 제거할 수 있습니다.
종료된 액티비티가 다시 실행된다면, 다시 시작되어야 하고 이전 상태로 복구되어야 할 것입니다.



액티비티 상태변화


액티비티의 상태가 변하면 아래의 메소드가 호출됨으로써 변화가 통보되는데요.
이 메소들은 모두 프로텍티드(protected) 메소드 입니다.


여기의 7가지 메소드들은 오버라이드 할 수 있습니다.
단, 모든 액티비티는 최초 인스턴스 초기화를 위해 onCreate() 메소드는 무조건 구현해야 합니다.

또한, 액티비티 종료직전.... 마지막 기회가 될 수도 있는 시점에선 적절한 데이터 저장을 위해 onPause() 메소드도 구현해주면 좋겠네요.

액티비티 생명주기 메소드를 구현할 땐 항상 슈퍼클래스 버전을 호출하여야 합니다.
protected void onPause() {

super.onPause() ;

}


네스티드 루프(nested loop)


액티비티 생명주기 메소드를 구현하여 볼 수 있는 것은 아래와 같습니다.

▣ 액티비티 인타이어 라이프타임 ( entire lifetime )

onCreate() 와 onDestroy() 메소드 사이에서 발생합니다.
액티비티는 onCreate() 메소드에서 모든 초기 설정을 하고 onDestroy()에서 모든 리소스를 해제하죠.


▣ 액티비티 비지블 라이프타임 ( visible lifetime )

onStart() 메소드에서 onStop() 메소드 사이에서 발생합니다.
onStart() 메소드에서는 사용자 인터페이스의 변화 모니터를 위해 브로드캐스트 리시버를 등록할 수 있고 사용자가 보고있는 화면이 없을때엔 onStop() 메소드에서 제거할 수 있습니다. onStart() 와 onStop()은 액티비티가 사용자에게 보여지고 숨겨지는 상태이므로 여러번 호출 될 수 있습니다.


▣ 액티비티 포그라운드 라이프타임 ( foreground lifetime )

onResume() 메소드와 onPause() 메소드 사이에서 발생합니다.
이 기간동안 액티비티는 화면에서 다른 모든 액티비티보다 앞에 놓이며 사용자에게 보여집니다. onPause()는 기계가 꺼지거나 새로운 액티비티가 시작될 때 호출되고, onResume() 은 액티비티가 다시 복귀되거나 새로운 인텐트가 도착했을때 호출됩니다.
따라서 이 두개의 메소드 내용은 빠르고 가벼울 수록 좋겠네요.



생명주기 메소드가 하는 일

▣ onCreate()

액티비티가 최초 생성시에 호출됩니다. 초기화 설정을 하는 곳이지요. 보관된 상태의 액티비티가 있다면, 그 상태를 저장중인 Bundle 객체를 받습니다.
onStart() 메소드가 이어집니다. 강제종료가 불가능 합니다.


▣ onRestart()

액티비티가 정지 후 다시 시작되기 바로 직전에 호출됩니다.
onStart() 메소드가 이어집니다. 강제종료가 불가능 합니다.


▣ onStart()

액티비티가 사용자에게 보여지기 직전에 호출됩니다.
액티비티가 보여지게되면 onResume() 메소드가, 안보이게 되면 onStop() 메소드가 이어집니다.
강제종료가 불가능 합니다.


▣ onResume()

액티비티가 사용자와 상호작용하기 직전에 호출됩니다 (스택의 최상위에 위치)
onPause() 메소드가 이어집니다. 강제종료가 불가능 합니다.


▣ onPause()

시스템이 다른 액티비티를 시작하려 할 때 호출됩니다.
일반적으로 데이터 저장을 하기에 좋은 곳입니다.
하지만 소스코드의 속도가 빨라야합니다.
왜냐하면 이 메소드가 끝나기 전까진 다음 액티비티가 실행되지 않기 때문인데요,
액티비티가 되돌아오면 onResume(), 보이지않게되면 onStop() 이 이어집니다.
강제종료가 가능 합니다.


▣ onStop()

액티비티가 사용자에게 보이지 않을때 호출 됩니다.
액티비티가 제거되거나 다른 액티비티가 실행되어 해당 액티비티를 덮어버렸을 때, 호출되죠. 액티비티가 되돌아오면 onRestart(), 액티비티가 사라지면 onDestroy() 가 이어집니다.
강제종료가 가능 합니다.


▣ onDestroy()

액티비티 삭제 직전에 호출됩니다. 액티비티가 받는 마지막 호출 메소드가 되죠. 시스템이 메모리 확보를 위해 액티비티 인스턴스를 없애버려고 하거나 , finish() 메소드가 호출되면 호출되는 메소드입니다.

isFinishing() 메소드로 두 가지를 분기할 수 있습니다.



onStart() 메소드가 이어집니다. 강제종료가 불가능 합니다.



☞ 여기에서 onPause() 는 프로세스가 강제종료 되기 전에 호출되는 것입니다. 즉, 프로세스가 강제종료 될 때 onPause() 는 무조건 호출되는 유일한 곳이 됩니다. ( onStop(), onDestroy() 는 호출되지 않을 수 있어요 ), 따라서 이터 저장 등의 작업은 종료되기 직전에 호출되는 onPause() 에 구현해야 되겠네요.


액티비티 상태 저장하기


시스템이 액티비티를 강제종료 했을때, 사용자는 이전의 액티비티로 돌아가고 싶을 수 있습니다. 이럴 경우 액티비티가 강제종료 되기 전에 상태를 저장할 수 있는 onSaveInstanceState() 메소드를 구현하면 저장이 가능해 집니다.



즉, 액티비티가 파괴되기전에 호출되는 메소드 인데요. ( onPause() 호출 이전에 호출됩니다. )
이 메소드는 이름/값 쌍으로 이루어진 번들 객체(Bundle) 를 인수로 가집니다. 액티비티가 다시 시작되면 번들은 onSaveInstanceState() 와 onStart() 이후에 호출되는 onRestoreInstanceState() 에게 전달됩니다.



☞ onSaveInstanceState() , onRestoreInstanceState() 메소드는 생명주기 메소드는 아닙니다.
따라서 항상 호출되지는 않으며 특정 상황 ( 액티비티 강제종료전에 onSaveInstance() 호출처럼 ) 에서만 호출됩니다. 단, 사용자 액션에 의해 종료될 때는 ( 사용자가 직접종료 ) 호출되지 않습니다.
- 사용자가 되돌아가지 않을 생각으로 종료한 것으로 판단한 것이겠죠...

onSaveInstanceState() 는 액티비티의 일시적인 상태 저장을 위한 것이므로 , 데이터 등을 안전하게 저장하려면 onPause() 메소드에서 처리해야 합니다.


액티비티 생명주기 메소드의 순서


하나의 액티비티가 다른 액티비티를 시작할 때 하나는 멈추고 정지되며, 다른 하나는 시작되는 구조를 가집니다. 생명주기 메소드의 순서는 두 개의 액티비티가 동일 프로세스 안에 있을 때에 정의됩니다.

1. 현재 액티비티("A") 의 onPause() 가 호출됩니다.
2. 다음 시작되는 액티비티("B") 의 onCreate() -> onStart() -> onResume() 이 차례대로 호출됩니다
3. "B" 액티비티가 더 이상 사용되지 않으면 그것의 onStop() 이 호출됩니다.

7. PHP MySql 설치 등.. https://yoo-hyeok.tistory.com/16?category=708422

Posted by 목표를 가지고 달린다
,

업무 효율 향상을 위한 정말 유용한 프로그램 하나 소개 해드립니다.
여러분의 노가다 작업 시간을 1/10~1/100으로 줄여줄 획기적인 프로그램 입니다.

특히 개발자 분들은 이미 많이 사용하고 계실 텐데요,

IT 에 있지 않으신 분들께도 큰 도움이 될 수 있는 프로그램입니다.

이름은 울트라에디터입니다. (구버전도 충분히 유용합니다.)

한 마디로 아주 기능이 많은 '메모장' 입니다.

주요 특징은 1. 반복 작업을 수행하는 '메크로' 2. 줄편집 3. 파일 비교, 4. 정렬(중복 제거 가능) 입니다.

아마 개발자시면, 반복해서 변경하는 수작업을 쉽게 일괄로 하기 위해 줄편집을 많이 이용하고 계실꺼에요.

일단 프로그램을 먼저 설치해봅시다.

링크 : http://www.ultraeditkorea.com/Download.asp

링크 들어가셔서 PC 환경에 맞는 프로그램 다운 받으시고 '다음 다음' 을 쭉 클릭하시면 끝입니다.

쉬운 이해를 위해 아래 3가지 예제 업무를 통해 설명을 드릴게요 :)

업무 1. 텍스트 파일에서 다음 문구를 찾아서 모두 바꾸세요

(변경 전) > (변경 후)

(1) 다른나라 > 우리나라

(2) Windows > Windows Computer

방법 1. 바꾸기 기능을 활용합니다.

(1) Ctrl + R 를 눌러서 창 띄움 (2) 찾을 내용 / 바꿀 내용 입력 (3) 모두 바꾸기 버튼 클릭

방법 2. 줄편집을 활용한다. (단축키 ALT + C )

* + TIP. 줄편집은 영문/숫자/특수문자는 가능하지만, 한글은 깨지므로, 'XXXX'로 표시한 후, 모두 변경으로 원하는 한글로 변경하면 된다.

* + TIP. 개발자의 경우, 중복되는 표현을 작성하고, 특정 영역만 다른 코딩을 할 경우 엄청난 효율을 발휘한다.

업무 2. 특정 문구(단어)가 포함된 내용만 뽑아내기.

방법 1. 찾기 (CTRL + F) 를 수행한 후, '문자열을 표시하는 줄 나열(G)' 를 체크 한후, 찾기를 하면...해당 문구가 있는 줄만 별도로 표시해 보여준다. 이것을 클립보드로 저장한 후 새글에 저장하면 원하는 문구가 표현된 내용만 쉽게 찾을 수 있다.

업무 3. 정렬하기(중복 제거 가능)

방법 1. 파일 < 정렬 > 파일 정렬(또는 고급 정렬)

최초 고급 정렬로 기준을 잡으면, 이후에는 파일 정렬로 기존 설정값대로 정렬가능하다. 중복 지우기 기능도 있어서 중복 제거도 가능하므로, 엑셀보다 더 편리한 부분도 있다. 해당 메뉴의 위치는 실제 울트라버전에 따라 상이할 수는 있으나 기능이 모든 버전들이 갖추고 있다.

업무 3. 파일 비교하기

방법 1. 메뉴의 파일 > 파일비교 를 클릭하면 비교할 파일을 선택하고, 확인을 누르면... 순차적으로 동일한 내용은 흰색으로 표시하지만, 다른 내용은 붉은색으로 표시해준다.(빈칸, 띄어쓰기)가 달라도 다른 내용으로 표시한다. 내용이 너무 많은 경우 =, =/ 을 클릭하면 다른 것만 표시할 수도 있다.

이정도만 아셔도, 지금 하고 계신 지루한 반복 문서 작업이 많이 단축될 꺼에요.

그리고 문서 검증하는 것도 많이 쉬워질꺼구요..

Posted by 목표를 가지고 달린다
,

캐나다 ARVO학회서 연구결과 첫 발표.."각막 치유-눈물 분비량 개선"

유원상 유유제약 대표이사가 캐나다에서 개막한 ARVO컨퍼런스 현장에서 안구건조증 치료 신약 소개

유유제약이 항염증 기전의 새로운 안구건조증 신약후보물질을 첫 공개했다. 유유제약은 28일(현지시간) 캐나다 밴쿠버에서 개막한 국제 안과학회 ARVO(The Association for Research in Vision and Ophthalmology)에서 안구건조증 치료 펩타이드 신약(프로젝트명: YDE)의 연구 결과를 발표했다. YDE는 유유제약이 국내 임상 2상 승인을 받은 YY-101과는 별도로 개발중인 프로젝트다.

이번에 발표된 연구는 안구건조증 유발 마우스 모델을 이용해 YDE와 기존 치료제 성분인 사이클로스포린A, 디쿠아포솔, 히알루론산, 리피테그라스트와의 치료 효과를 비교하기 위해 진행됐다. 그 결과 YDE가 우수한 항염증(Anti-inflammation) 기전에 따라 각막 상피세포 치유 효과 뿐 아니라 눈물 분비량 개선을 확인했다.

ARVO가 공개한 발표자료에 따르면 안구건조는 각막 상피 병변 및 염증이 발생하는 질환으로 복잡한 다중 인자적 병리학적 특성을 가진다. 유유제약은 통제된 환경에서 스코폴라민(scopolamine)에 의해 유발된 안구건조 설치류 모델의 연골세포 유래 세포외기질(chondrocyte derived extracellular matrix)에서 YDE-010, YDE-011, YDE-043 세가지 합성 펩타이드의 효과를 확인하는 실험을 진행했다.

연구진은 6~9주령의 암컷 C57BL6 마우스의 꼬리에 스코폴라민 패치를 적용하고 10일동안 건성 안구를 유발하기 위해 습도가 25% 이하인 통제된 환경실에서 사육했다. 스코폴라민 패치의 경우 격일 단위로 교체 적용됐다.

스트레스가 유발된 후, 10마리로 구성된 각각의 그룹에게 10일동안 3가지 펩타이드 중 하나 또는 대조군(vehicle), 리피테그라스트(lifitegrast; Xiidra), 사이클로스포린 A(cyclosporine A; Restasis), 디쿠아포솔나트륨(diquafosol sodium; Diquas), 히알루론산 나트륨(sodium hyaloronate; Vismed) 등을 하루 4~5회 양쪽 안구에 5µl씩 적용했다.

이들은 스트레스 유발 10일째와 치료 후 3,5,7,10일 이후의 눈물의 양(volume)과 각막 염색 점수(corneal staining score)의 변화를 평가했다.

10일간의 건조 스트레스가 주어진 모든 동물에게서 안구의 건조 징후가 관찰됐다. 스트레스가 해제된 이후 모든 그룹이 시간이 지남에 따라 눈물 생산이 향상됐다.

YDE-010, YDE-001, YDE-043가 각각 국소 투여된 마우스는 각막 염색에서 대조군 대비 유의미한 개선이 확인됐다. 대조군과 비교해 TDE-011 펩타이드의 경우 치료 3일, 5일 후 CFS(Cornea Fluorescein staining; 각막염색검사)에서 각막의 상처가 각각 30%, 47% 감소하는 등 관련성 있는 개선이 관찰됐다.

효과를 비교하기 위해 적용된 싸이클로스포린 A와 디쿠아포솔 나트륨, 히알루론산 나트륨 및 리피테그라스트 적용군은 각막 염색 결과에서 유의미한 개선이 없었다. 유유제약 측은 이러한 전임상 결과를 토대로 안구건조 설치류 동물모델에서 YDE-010, YDE-011, YDE-043이 기존의 처방약제들과 비교해 더 뛰어난 각막 상태 개선를 보였다고 발표했다.

백태곤 유유제약 연구소장은 "ARVO 사무국에 이번 연구결과에 대한 초록을 제출했으며, 사무국으로부터 발표자로 선정돼 연구결과를 처음으로 선보이게 됐다"면서 "이번 연구결과를 바탕으로 국제저널 발표 및 글로벌 임상을 준비 할 예정"이라고 말했다.


[현재 개발중인 프로젝트] 유유제약은 3월 12일 자사가 개발 중인 안구건조증 치료 펩타이드 신약 후보물질 YY-101에 대한 임상 2상 진입을 식품의약품안전처로부터 승인을 받았다고 3월 13일 밝혔다.

이번 임상시험은 국내 안구건조증 환자 30명을 대상으로 YY-101 점안액의 내약성, 안전성 및 유효성을 평가하기 위해 진행됐다.

유유제약의 YY-101은 한국산업기술평가관리원이 주관하는 바이오의료기기산업 핵심기술개발사업의 유망바이오IP사업화촉진사업으로 선정돼 지원을 받고 있다. 안과질환 T2B(Technology to Business) 기반구축센터인 부산 백병원과 비임상시험을 진행했으며, 임상 1상은 정재용 분당서울대병원 임상약리학과 교수가 맡았다.

백태곤 유유제약 연구소장은 "YY-101의 주성분인 콜라겐 타입 펩타이드는 연골 세포 유래 세포 외기질에서 분리된 물질로서 안전성이 확인됐다"며 "이번 임상2상 승인을 통해 개발 속도에 박차를 가할 예정"이라고 말했다.

실제 스마트폰의 영향으로 안구건조증 발생빈도가 높아져서 시장도 좋지만, 현재 개발중인 프로젝트외에도 더욱더 개발에 노력하고 있는 건실한 바이오 업체로 고려됨

Posted by 목표를 가지고 달린다
,