카테고리 없음2015. 9. 22. 15:31

소싯적에 대전엑스포에서 귀를 통해서 소리를 듣는게 아니라 뼈에다가 진동을 전달해 소리를 듣는 방식의 체험을 한 적이 있다.

아마도 이를 응용한 제품이 아닌가 싶다. 

나같은 경우에도 이어폰이나 헤드폰을 오래 끼면 귀가 아픈데 이런 사람들을 위한 아이디어 제품인 듯하다.


자세한 사항은 아래서 확인해보길 바란다.

https://www.kickstarter.com/projects/ostrich-pillow/batband





Posted by 미랭군
데이터베이스2015. 9. 4. 13:55

root계정으로 접속 후 

su - oracle


sysdba계정으로 sqlplus에 접속 후

sqlplus "/ as sysdba"


Data tablespace 생성

CREATE TABLESPACE LBS_DATA DATAFILE '/home/oracle/ordata/LBS/LBS_DATA.DBF' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

Index tablespace 생성

CREATE TABLESPACE LBS_IDX DATAFILE '/home/oracle/ordata/LBS/LBS_IDX.DBF' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;


Temp tablespace 생성

CREATE TEMPORARY TABLESPACE LBS_TMP TEMPFILE '/home/oracle/ordata/LBS/temp/LBS_TMP.DBF' SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;


사용자 생성

CREATE USER lbs IDENTIFIED BY 비밀번호입력 DEFAULT TABLESPACE LBS_DATA TEMPORARY TABLESPACE LBS_TMP PROFILE DEFAULT ACCOUNT UNLOCK;


사용자 권한 부여

GRANT RESOURCE TO lbs;

GRANT CONNECT TO lbs;

GRANT CREATE VIEW TO lbs;

GRANT CREATE SYNONYM TO lbs;

Posted by 미랭군
모바일앱2015. 8. 6. 16:51

public void onButton1Clicked(View v) { // 버튼 클릭 시
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("안내");
builder.setMessage("종료하시겠습니까?");
builder.setIcon(android.R.drawable.ic_dialog_alert);

builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "예 버튼이 눌렸습니다.", Toast.LENGTH_LONG).show();
}
});

AlertDialog dialog = builder.create();
dialog.show();

}


Posted by 미랭군
모바일앱2015. 8. 6. 16:14

1. 주로 권한 관련된 지정 가능

2. 액티비티, 서비스, 리시버 등을 지정 가능


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

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher" <!-- icon 지정 -->
android:label="@string/app_name" <!-- 메뉴에서 보이는 앱 제목 지정. values/strings.xml에 정의 되어있음 -->
android:theme="@style/AppTheme" >
<activity <!-- 액티비티라는 것은 화면 단위 -->
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <!-- 메인 액티비티라는 것을 알려줌 -->

<category android:name="android.intent.category.LAUNCHER" /> <!-- 메인 액티비티라는 것을 알려줌 -->
</intent-filter>
</activity>

<receiver
android:name=".MySMSReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>

</manifest>


'모바일앱' 카테고리의 다른 글

[iOS] ad-hoc 배포시 주의점  (0) 2017.07.25
[Android] AlertDialog 생성  (0) 2015.08.06
[iOS] 아이폰 기업용 비즈니스 어플 배포 관련  (0) 2013.02.15
Posted by 미랭군
웹어플리케이션서버2015. 6. 23. 15:31

웹서버를 띄울 때 root로 띄우게 되면 웹서버가 해킹을 당했을 때 root권한을 쥐고있기 때문에 보안상 취약한 문제가 있다.

 

하지만 웹포트는 80이고, SSL포트는 443인데, 리눅스 시스템에서는 1000번 이하 포트의 경우 ROOT계정에서만 제어할 수 있도록

 

제한하고 있다. 이를 해결하기 위해선 Tomcat을 8080, 8443으로 띄우고 아래와 같이 iptables 명령어를 이용해 프리라우팅하면 된다.

 

80->8080, 443->8443 라우팅설정


1. root 권한 접속
2. iptables 설정


#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
#iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
#netstat -ntl or iptables -t nat -L
#iptables restart

 

3. server.xml 변경
<Connector
  maxSpareThreads='75'
  port='8080'
  proxyPort='80'
  enableLookups='false'
  maxThreads='150'
  connectionTimeout='20000'
  disableUploadTimeout='true'
  minSpareThreads='5'
  maxHttpHeaderSize='8192'
  redirectPort='443'
  acceptCount='200'
/>

<Connector
  SSLEnabled='true'
  keystoreFile='/path/to/keystore.jks'
  maxSpareThreads='75'
  port='8443'
  proxyPort='443'
  algorithm='SunX509'
  enableLookups='false'
  secure='true'
  maxThreads='150'
  connectionTimeout='20000'
  disableUploadTimeout='true'
  scheme='https'
  minSpareThreads='5'
  maxHttpHeaderSize='8192'
  sslProtocol='SSL'
  acceptCount='200'
  clientAuth='false'
/> 

Posted by 미랭군
자바·JSP2015. 5. 29. 14:59

문자열 : <table width="100%" align="center"/>


1. table의 width=100% OR align=center만 추출하는 경우

  Document document =Jsoup.parse(htmlString);

                  document.select("table[width=100%],table[align=center]");


2. AND 연산(width=100%이고 align=center인 경우)

가. Elements tables = document.select("table[width=100%]").select("table[align=center]");

나. Elements element =document.select("table[align=center]");

                    element =element.select("table[width=100%]");


3. AND 연산(width=100%이고 align=center이고 table안에 문자열이 text인 경우)

  Elements tables = document.select("table[width=100%].select("table[align=center]:contains(text)");

Posted by 미랭군
카테고리 없음2015. 5. 21. 18:40

프로젝트을 진행해 본 개발자라면 누구나 아래와 상황을 접하게 됩니다.

고객왈 :
 “이 필드 좀 하나 추가해 주시고요, 이건 이렇게 변경하셔야 됩니다”

 

개발자왈 : “이건 없었던 거잖아요 진작에 말씀해 주셨어야죠, 이렇게 하게 되면 전체를 다 바꿔야 돼서 안됩니다. 이렇게 수정할려면 전체를 다시 손봐야 돼서 새로 만드는 거나 다름 없습니다.”

코딩 마무리나 테스트 단계에서 종종 볼 수 있는 사무실의 풍경입니다.^^(이런 경우가 없으셨다구요? 여기 한국인데요…^^)

 

프로젝트의 마무리 단계에서 고객의 요청사항이 변경되어 고전을 하는 경우가 종종있습니다. 이 때 대부분은 “원래 그렇지뭐!” 하며 “고객이 요구하는데 어떻하겠어!”라며, 지금까지 수행했던 작업을 번벅하던지 심한 경우 전체를 뒤집어 업는 사태까지 발생합니다.

 

개발프로세스의 단계중 (요구분석->설계->코딩->테스트) 테스트단계에서 이런일이 대체적으로 벌어지지만, 근본문제는 이전단계에서 벌써 내재된 경우입니다.



요구분석단계에서 한줄로 요약되는 요구사항이 설계시에는 10으로 코딩시에는 100 또는 1000줄의 코딩으로 구현됩니다. 즉 요구분석단계에서 명확치 못한 정의가 설계단계를 거쳐 코딩시에는 원래의도와는 확연히 다른 결과물을 만들수 있습니다. 예를 들어 DB 다이어그램을 그리면서 엔티티와 필드를 정확히 정의하지 못하는 경우가 있습니다. 그런데 코딩이 한창일 때 필드 추가가 필요한 것을 요청받았다던지, 쿼리에 다른 방법이 없어서 마구잡이로 조인(JOIN)이나 서브쿼리(Sub Query)를 많이 사용해서 속도가 느려진다던지 하면 참 난감한 상황을 맞게 됩니다.

 

사실 이것은 개발자만의 문제가 아닙니다. 요구분석단계에서 현업사람들과 인터뷰를 할라치면 다른 업무 핑계로 잘 응대을 안해주는 경우가 있습니다. 또는 시스템에 대해서 잘 모르기 때문에 답변을 제대로 못하는 경우도 종종 있습니다. 그러다가 눈에 보이는 산출물을 가지고 “앞으로 이 시스템으로 업무를 해야 합니다”라면 이것 저것 요구사항과 수정사항이 봇물을 이룹니다.

그리고 요구분석과 설계를 등한시 여기는 풍토도 일조를 합니다.

또한, 개발이라고 하면 일단 UI 디자인부터 시작하는 다분히 개발자 적인 생각이 어울어져 만들어내는 경우입니다.

 

다른 나라에서는 어떻게 할까요? 특히 서양적 사고방식에서는 이런경우 고객의 추가요청사항을 잘 수렴해서 차기 프로젝트에서 반영하겠다고 업무의 선을 긋습니다.(이러면 한국에서는 힘들죠^^)

 

즉 분석설계시 제대로 대응하지 못한 것을 바로 잡는데는 1이라는 비용이 필요한데, 이것을 코딩으로 해결하려면 10이라는 비용이, 테스트시에 발견했다면 100이라는 비용이 필요하다는 것입니다. 그러므로 시간과 프로세스가 진행됨에 따라 열배, 백배의 추가비용이 소요됨을 말합니다.

Posted by 미랭군
카테고리 없음2015. 5. 21. 18:28

어떻게 하면 조직적인 학습을 효과적으로 진행할 수 있을까요 ?

조직적인 학습을  시작하기 좋은 지점은 바로 스탠드업 회의입니다


스탠드업 회의에서 어제 한 일’, ‘오늘 할 일’, ‘이슈를 팀원 들이

돌아가며 말하죠

프레임워크 설정 때문에 문제를 겪는 팀원이 있다면 스탠드업 회의에서

이 문제를 이슈로 제기합니다

 

물론 간단한 설정 문제라면 스탠드 업 회의가 끝나고 해결책을 아는 팀원이

문제를 겪는 팀원에게 해결책을 알려주겠죠

 

하지만 이런 간단한 설정 문제가 아니라 복잡하게 얽힌 문제고 해결책을 아는

팀원이 없다면 조직적인 학습이 필요한 시점입니다. 문제와 관련된 팀원들을

모두 화이트 보드에 모이도록 부탁하고 이슈를 제기한 팀원이 문제를 상세하게

설명합니다

설명이 끝나면 문제를 일으키는 근본 원인을 찾습니다. 근본 원인을 찾는 데 도요타에서 사용해서 유명해진 5번 반복해서 질문하는 방법을 활용합니다

 

근본원인을 찾았다면 근본원인을 해결하는 세 가지 대안을 생각해 봅니다. 물론

근본 원인을 해결할 방안이 명확하다면 굳이 대안을 세 개씩이나 만드는 것은

낭비지만 근본원인을 해결할 대책이 명확하지 않을 때 세 가지 대안을 생각함으로써 문제를 다양한 방식으로 고민

할 수 있습니다

 

팀원들이 모여 각 대안의 장점, 단점을 비교해서 가장 적합한 대안을 선택합니다

대안을 평가할 때 말로 팀원들끼리 주고받는 것보다 화이트보드에 각 대안을 나열하고 대안마다 장단점을 기록하는 게 대안을 선택할 때 효과적입니다

 

이런 해결책의 진행상황은 매일 아침마다 진행하는 스탠드 업 회의에서 보고하기

때문에 팀원들이 쉽게 진척상황을 공유하고 이슈가 발생하면 공동으로 대응할 수

있습니다

 

스탠드업 회의에서 이슈를 제기하고 팀원들이 모여서 근본원인을 찾아 세가지를

생각하고 해결책을 실행하며 결과를 기록하는 과정은 팀원들이 공동으로 진행하는

팀 활동이기 때문에 이 과정에서 생성되는 지식을 팀 단위에서 자연스럽게 공유하고 습득합니다. 경험으로 체득하는 지식이기 때문에 굳이 기록이 필요하지 않을 듯하지만 프로젝트 팀 밖으로 지식을 전파하고 시간이 지나서 팀원들의 기억이 왜곡되거나 퇴색했을 때 참고하려면 이슈에서 해결책을 실행하는 과정과 결과를

기록으로 남겨야 합니다

 

기록이 필요하지만 그렇다고 많은 시간을 들이는 것도 옳지 않습니다 따라서 해결책을 수행할 담당자를 선정했다면 담당자는 이슈 내용, 근본원인, 대안 3가지와 선택한 해결책 등을 간략하게 적어서 회의실의 벽에 부착해 놓습니다     

Posted by 미랭군
기타2015. 5. 21. 18:24

신이여, 저에게

내가 바꿀 수 없는 일들을 받아들이는 의연함을 주소서.

내가 바꿀 수 있는 일들을 바꾸는 용기를 주소서.

그리고 이 두 가지를 구별할 지혜를 주소서.

신이여, 저에게

 시간이 필요한 변화에 대한 인내를 주소서.

- 프리드리히 크리스토퍼 외팅거 


그리고 제가 가진 모든 것을 귀중히 여기게 하소서.

다른 어려움을 가진 사람들에 관용을 주시고,

그리고 일어나

 오직 오늘을 위해 다시 노력할 힘을 주소서. 

Posted by 미랭군
기타2015. 4. 8. 18:31

SVN Repositories 에서 SVN 구성을 보면 Branch , Tag , Trunk 가 있다 .

trunk

- 프로젝트에서 가장 중심이 되는 디렉토리

- 모든 프로그램의 개발 작업은 Trunk 디렉토리에서 이루어 집니다.

- trunk 디렉토리 바로 아래에는 소스들의 파일과 디렉토리가 들어가게 됩니다.

- 단어 자체의 뜻은 mainLine 과 동일한 뜻


branches

- trunk 에서 뻗어져 나온 나무가지를 뜻합니다.

- 프로그램을 개발하다 보면 trunk 디렉토리에서 또 다른 작은 분류로 빼서 개발해야 할 경우가 생김.

- 프로젝트 내의 작은 프로젝트라 생각하면 됨

- branches 디렉토리 안에 또 다른 디렉토리를 두어 그 안에서 개발하게 됨


tags

- 단어 자체의 뜻은 꼬리표 

- 이 디렉토리는 프로그램을 개발하면서 정기적으로 릴리즈 할 때 , 0.1/0.2/1.0 등

- 버전 별로 소스 코드를 따로 관리하는 공간

- 버전 별로 태그를 붙여서 tag 디렉토리 안에 보관한다고 생각하면 됩니다.

Posted by 미랭군