2011/02/28

[Android Dev.] Bitmap 회전하기

출처: http://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/3/




ImageView image = (ImageView) findViewById(R.id.ivImage);
Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.android);
image.setImageBitmap(bMap);

Matrix mat = new Matrix();
mat.postRotate(90);
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,
bMap.getWidth(), bMap.getHeight(), mat, true);
image.setImageBitmap(bMapRotate);

<

Original Post : http://neodreamer-dev.tistory.com/513

[Android Dev.] 다양한 방법으로 Bitmap 불러오기

출처: http://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/2/

setContentView(R.layout.main);        

// Load from file
//*
ImageView image = (ImageView) findViewById(R.id.ivImage);
Bitmap bMap = BitmapFactory.decodeFile("/sdcard/myimage/android.png");
image.setImageBitmap(bMap);
//*/

// Load from Stream
//*
ImageView image = (ImageView) findViewById(R.id.ivImage);

FileInputStream in;
BufferedInputStream buf;
try
{
in = new FileInputStream("/sdcard/myimage/android.png");
buf = new BufferedInputStream(in);
Bitmap bMap = BitmapFactory.decodeStream(buf);
image.setImageBitmap(bMap);
if (in != null)
{
in.close();
}
if (buf != null)
{
buf.close();
}
}
catch (Exception e)
{
Log.e("Error reading file", e.toString());
}
//*/

// Load from resource
//*
ImageView image = (ImageView) findViewById(R.id.ivImage);
Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.android);
image.setImageBitmap(bMap);
//*/

// Load from Bitmaps
//*
ImageView image = (ImageView) findViewById(R.id.ivImage);
FileInputStream in;
BufferedInputStream buf;
try
{
in = new FileInputStream("/sdcard/myimage/android.png");
buf = new BufferedInputStream(in);
byte[] bMapArray= new byte[buf.available()];
buf.read(bMapArray);
Bitmap bMap = BitmapFactory.decodeByteArray(bMapArray, 0, bMapArray.length);
image.setImageBitmap(bMap);
if (in != null)
{
in.close();
}
if (buf != null)
{
buf.close();
}
}
catch (Exception e)
{
Log.e("Error reading file", e.toString());
}
//*/

2011/02/27

[Android Dev.] Emulator SDCard에 파일 넣기 및 가져오기

Android Debug Bridge를 이용하여 Emulator 의 SDCard 에 파일을 넣거나 가져올 수 있다.





adb 의 push와 full 명령을 이용하면 된다.






push 명령을 이용한 파일 넣기



push <PC Path> <Emulator Path>






잘 못 된 대상을 선택하면 에러가 발생한다. 아래는 대상이 존재하지 않거나 디렉토리를 지칭했을 때 발생하는 메시지 이다.







D:\Dev\Android>adb -s emulator-5554 push android.png /sdcard/myimage/


failed to copy 'android.png' to '/sdcard/myimage/': Is a directory







myimage 디렉토리를 만들고 복사를 시도하면 정상 복사가 된다.



D:\Dev\Android>adb -s emulator-5554 shell


# cd /sdcard


cd /sdcard


# mkdir myimage


mkdir myimage


# ls -l


ls -l


d---rwxr-x system   sdcard_rw          2011-02-22 23:41 LOST.DIR


d---rwxr-x system   sdcard_rw          2011-02-27 23:00 myimage


# exit


exit






D:\Dev\Android>adb -s emulator-5554 push android.png /sdcard/myimage/


555 KB/s (11937 bytes in 0.021s)







pull 명령을 이용하여 파일 가져오기


push <Emulator Path> <PC Path>







D:\Dev\Android\tmp>adb -s emulator-5554 pull /sdcard/myimage/android.png .


613 KB/s (11937 bytes in 0.019s)






D:\Dev\Android\tmp>dir


:


2011-02-27  23:04            11,937 android.png







대상 path에 파일이름까지 지정을 하면 해당 파일 이름으로 가져올 수 있다. 아래 명령은 android.png를 android2.png 로 가져오는 예이다.



D:\Dev\Android>adb -s emulator-5554 pull /sdcard/myimage/android.png ./android2.png


56 KB/s (11937 bytes in 0.206s)


[Android Dev.] Emulator 접속하기


adb.exe(Android Debug Bridge) 를 이용하여 현재 실행중인 Android Emulator 에 접속할 수 있다. adb.exe 는 android SDK가 설치되어 있는 경로의 platform-tools 폴더에 있다. 어디서든 adb를 사용하려면 PATH를 설정하면 된다.





현재 실행 중인 Emulator 리스트 확인 하기


D:\Dev\Android>adb devices
List of devices attached
emulator-5554 device





Emulator에 접속하기


D:\Dev\Android>adb -s emulator-5554 shell
# ls -l
ls -l
dr-x------ root root 2011-02-27 13:19 config
drwxrwx--- system cache 2011-02-22 23:40 cache
lrwxrwxrwx root root 2011-02-27 13:19 sdcard -> /mnt/sdcard
drwxr-xr-x root root 2011-02-27 13:19 acct
drwxrwxr-x root system 2011-02-27 13:19 mnt
lrwxrwxrwx root root 2011-02-27 13:19 d -> /sys/kernel/debug
lrwxrwxrwx root root 2011-02-27 13:19 etc -> /system/etc
drwxr-xr-x root root 2010-07-01 06:06 system
drwxr-xr-x root root 1970-01-01 09:00 sys
drwxr-x--- root root 1970-01-01 09:00 sbin
dr-xr-xr-x root root 1970-01-01 09:00 proc
-rwxr-x--- root root 12995 1970-01-01 09:00 init.rc
-rwxr-x--- root root 1677 1970-01-01 09:00 init.goldfish.rc
-rwxr-x--- root root 107412 1970-01-01 09:00 init
-rw-r--r-- root root 118 1970-01-01 09:00 default.prop
drwxrwx--x system system 2011-02-22 23:41 data
drwx------ root root 2010-01-28 09:59 root
drwxr-xr-x root root 2011-02-27 13:19 dev
# cd sdcard
cd sdcard
# ls -l
ls -l
d---rwxr-x system sdcard_rw 2011-02-22 23:41 LOST.DIR
#
<

Original Post : http://neodreamer-dev.tistory.com/510

2011/02/24

[Android Dev.] Emulator 단축키 (화면 회전, 볼륨 조절 등)


화면을 회전시켜서 보기위해 방법을 찾던 중 알게된 것들이다.






























































































 Emulated Device Key Keyboard Key
 Home HOME
 Menu (left softkey) F2 or Page-up button
 Star (right softkey) Shift-F2 or Page Down
 Back ESC
 Call/dial button F3
 Hangup/end call button F4
 Search F5
 Power button F7
 Audio volume up button KEYPAD_PLUS, Ctrl-F5
 Audio volume down button KEYPAD_MINUS, Ctrl-F6
 Camera button Ctrl-KEYPAD_5, Ctrl-F3
 Switch to previous layout orientation

 (for example, portrait, landscape)
 KEYPAD_7, Ctrl-F11
 Switch to next layout orientation

 (for example, portrait, landscape)
 KEYPAD_9, Ctrl-F12
 Toggle cell networking on/off F8
 Toggle code profiling F9 (only with -trace startup option)
 Toggle fullscreen mode Alt-Enter
 Toggle trackball mode F6
 Enter trackball mode temporarily (while key is pressed) Delete
 DPad left/up/right/down KEYPAD_4/8/6/2
 DPad center click KEYPAD_5
 Onion alpha increase/decrease KEYPAD_MULTIPLY(*) / KEYPAD_DIVIDE(/)



출처 : http://developer.android.com/guide/developing/tools/emulator.html
<

Original Post : http://neodreamer-dev.tistory.com/509

2011/02/22

Eclipse 3.6(Helios)에 Android Development Tools(ADT) 설치후 자동완성이 느려지는 문제

Eclipse 3.6(Helios) 버전으로 안드로이드 개발 환경을 만들고 테스트를 하였는데 Eclipse 의 자동 완성 기능이 엄청나게 느려지는 문제가 발생하였다.



자료를 찾던 중 김형준님 블로그에서 해결책을 찾을 수 있었다.




김 형준님 글 또는 이 글에 첨부되어 있는 파일을 Eclipse 가 설치된 폴더의 plugins 폴더에 존재하는 기존 파일을 백업하고 새 파일을 복사한 후 Eclipse를 다시 시작하면 해결 된다.




자세한 내용은 좀 더 검색을 해 봐야겠다.



2011/02/21

광고를 포함한 프로그램(Adware)에 대한 단상



취미로 하는 개발에 수입원이 있을 수 있을까? 있으면 좋지 않을까?




직업이 프로그램 개발이어서 할 줄 아는게 그것 밖에 없고 일을 떠나서 즐길 수 있는 것이라면 개발도 좋을텐데.. 취미로 개발한 프로그램으로 자그마한 수입을 올리면 더 좋지 않을까 생각이 든다.




문득 생각이나서 블로그에 붙이려 만들어 두었던 구글 애드센스를 프로그램에 올려 보았다. 

광고를 올릴만한 프로그램을 만들 수 없지 않을까 하는 생각도 들지만 구글 애드센스를 프로그램에 올리는 것은 참 위험할 수도 있을 것 같다. 광고 클릭 수도 적을 것이며 부정 클릭의 위험도 또한 매우 높을 것 같다.




실제로 프로그램에 올릴 일은 없을 듯 하다.<

Original Post : http://neodreamer-dev.tistory.com/507

2011/02/20

C++ Builder 로 RSS Feed 해석하기

굿모닝 팝스 듣기 용 프로그램을 만들면서 RSS Feed를 해석하려 했었는데 그때는 Indy Component 로 RSS 소스를 받은 후 XML parser를 이용해서 분석을 했었는데 프로그램이 정상 동작을 하지 않는 바람에 다시 손을 보면서 너무도 간단한 방법을 알게 되었다.





TXMLDocument 를 이용하면 간단하게 해결이 되었다. Reading and Manipulating XML files (RSS feeds) with Delphi 라는 글을 통해 알게 된 방법이며 아래는 이 글에서 소개한 델파이 코드이다.

 var
StartItemNode : IXMLNode;
ANode : IXMLNode;
STitle, sDesc, sLink : WideString;
begin //points to local XML file in "original" code
XMLDoc.FileName := 'http://0.tqn.com/6/g/delphi/b/index.xml';
XMLDoc.Active:=True;
StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item') ;
ANode := StartItemNode;
repeat
STitle := ANode.ChildNodes['title'].Text;
sLink := ANode.ChildNodes['link'].Text;
sDesc := ANode.ChildNodes['description'].Text;
//add to list view
with LV.Items.Add do
begin
Caption := STitle;
SubItems.Add(sLink) ;
SubItems.Add(sDesc)
end;
ANode := ANode.NextSibling;
until ANode = nil;
end.





아래 코드는 위의 코드를 참조하여 작성한 C++ Builder 에서 굿모닝 팝스 RSS를 해석하는 코드이다.

XMLDoc->Active = false;
XMLDoc->FileName = L"http://tune.kbs.co.kr/rss/1.xml";
XMLDoc->Active = true;

_di_IXMLNode nodeItem = XMLDoc->DocumentElement->ChildNodes->First()->ChildNodes->FindNode( L"item" );

if ( nodeItem == NULL )
{
ShowMessage( L"Cannot find item node" );
}
else
{
while ( nodeItem != NULL )
{
_di_IXMLNode nodeTitle = nodeItem->ChildNodes->FindNode( L"title" );
_di_IXMLNode nodeEnclosure = nodeItem->ChildNodes->FindNode( L"enclosure" );

if ( nodeTitle != NULL && nodeEnclosure != NULL )
{
_di_IXMLNode nodeURL = nodeEnclosure->AttributeNodes->FindNode( L"url" );

if ( nodeURL != NULL )
{
memXML->Lines->Append( nodeTitle->GetText() );
memXML->Lines->Append( nodeURL->GetText() );
}
}

nodeItem = nodeItem->NextSibling();
}

if ( cmbGMPList->Items->Count > 0 )
{
cmbGMPList->ItemIndex = 0;
}
}
<

Original Post : http://neodreamer-dev.tistory.com/506

굿모닝팝스(GMP) 재생 및 다운로더 0.0.0.7




지난번에 만들었던 프로그램이 문제가 있어서 수정을 해 보려다가 다시 만들었다. 아주 기본 기능에만 충실하도록 별도의 옵션을 설정하는 것도 빼고 그냥 GMP만 들을 수 있도록 만들었다.





C++ Builder XE 단독 배포용 실행파일 만들기

C++ Builder XE에서 별도의 부가적인 파일이 없이 단독으로 실행하는 실행파일을 만들기위해서는 프로젝트의 Options 메뉴 중에서 Link 항목의 Link with Dynamic RTL 옵션의 체크를 해제하고 Packages 항목의 Build with runtime packages 옵션을 해제하고 빌드하면 된다. 물론 별도의 라이브러리를 사용하거나 하면 경우에 따라서 배포시에 추가적인 파일이 필요할 수 있다.










C++ Builder 의 버전이 올라가면서 기본 라이브러리의 크기가 커져서 인지 단독 실행파일의 크기가 많이 커졌다.

2011/02/18

TortoiseCVS 1.12.5 공개!



불과 얼마전에 1.12.1 버전이 공개가 되었다는 글을 올렸는데 몇일 사이에 1.12.5 버전에 공개가 되었다. 그 사이에 1.12.3 버전도 공개가 되었었다.




오랜만에 1.12 버전이 공개되면서 Overlay 시스템이 바뀌어 좋아지고 설치시 64비트는 지원이 되지 않는다는 메시지도 출력하지 않아 맘에 들었는데 History 나 Revision 그래프 보기 호출시 동작을 하지 않았는데 1.12.5 버전에서 개선이 되었다.




그리고 1.12 버전으로 업데이트 되면서 CVSNT 도 2.5.05.3744 가 설치되는데 이 버전은 공개용 버전이 아닌 것 같다. 처음 실행시 구매와 trial 사용에 대한 질문을 한다. 그래서 이전 버전에서 설치되는 2.5.03.2382 을 수동설치하여 사용하도록 하였다.



2011/02/08

Visual C++ 2010 의 IntelliSense & Precompiled Header Files

Visual C++ 2010 버전을 설치하고 몇 차례 사용하여 보았다. IntelliSense 에 많이 좋아 졌는데 덕분에 프로젝트의 크기가 커져 버렸다. 현재 까지 사용하던 .ncb 파일을 버리고 .sdf(SQL Server Database file) 파일로 전환 하면서 성능이 올라간 것 같다.



그리고 Precompiled Header 도 많이 바뀐것 같다. 기존의 Build Profile 당 하나의 pch 파일이 생성이 되던것에 추가로 프로젝트 하위 폴더에 ipch 폴더가 생성되고 여러개의 .pch 파일이 만들어졌다. 덕분에 IntelliSense 기능이 증가되었다고 한다.




Visual C++ 2010 에서는 많이 기능이 좋아지고 반가운 기능(MFC Class Wizard)도 돌아 왔지만 IDE 편집창에서 TrueType 폰트만 지원하여 깔끔하게 보이는 Bitmap 폰트를 사용할 수 없게 되었다. 그래서 돋움체를 사용하고 있다.



SQLite 3.7.5.0 Library (정적/동적) for C++ Builder and Visual C++



3.7.5 버전을 컴파일 하려면 몇 가지 신경을 써야 했다.


3..7.5 버전에서 ICU Unicode 모듈이 추가 되어서 라이브러리를 만들 때 해당 모듈을 포함해 주거나 기능을 비활성화 해야 한다.






이번 소스에는 fts1 과 fts2 와 관련된 소스가 포함되어 있어서 이 두가지 기능을 비활성화 해야 하는데 그러려면 아래 Preprocessor 를 선언해 주어야 한다.







SQLITE_ENABLE_BROKEN_FTS1=1


SQLITE_ENABLE_BROKEN_FTS2=1







C++ Builder 의 경우 ICU Unicode 모듈을 함께 컴파일 할 수 없어서(본인의 경우) ICU 관련 기능을 비활성화 하였다.






#undef SQLITE_ENABLE_ICU






Visual C++ 의 경우 ICU 사이트에서 ICU4C 모듈을 다운 받아 포함되어 있는 unicode 관련 파일을 프로젝트에 포함시켜서 컴파일 하였다.






이전 버전과 설정이 좀 달라서 생성된 라이브러리에 대해서 간단하게 테스트해 보니 정상 동작을 하였다. 










2011/02/07

TortoiseCVS 1.12.1 안정 버전 공개!


TortoiseCVS 거북이 로고

TortoiseCVS 로고




TortoiseCVS 가 아주 오랜 만에 안정 버전을 공개하였다. Change Log 를 보면 거의 2년 만에 공개되는 것이다.



Release Note 에 공개된 개선 사항은 아래 두 건이 나와 있지만 오랜 기간 공백이 있었기 때문에 내부적으로 많은 버그가 개선 되었을 것으로 생각 된다.


  • Use TortoiseOverlays. TortoiseCVS now uses the TortoiseOverlays mechanism (developed by the TortoiseSVN team) to avoid overlay icon conflicts with other Tortoise clients.

  • Better bug number support. This feature was contributed by March Hare.

이번 버전에는 탐색기의 파일 아이콘에 파일의 상태를 표시하는 Overlay 표시 구조가 TortoiseSVN team 에서 개발한 TortoiseOverlay 가 사용 되었다. 그래서 인지 기본적으로 제공하는 CVS 아이콘이 SVN 과 동일하다.




사실 TortoiseSVN 설치 후에 CVS 의 Overlay Icon 이 출력이 되지 않는 문제가 있어 문제 해결책을 찾다가 TortoiseCVS 1.12.1 버전 공개를 확인했고 때마침 공개된 버전에서 이 문제가 해결 되었다.







SQLite 3.7.5 Release

2011.02.01 에 SQLite 3.7.5 버전이 공개가 되었다.

명절을 지낸 후에야 소식을 접할 수 있었다.






아래는 3.7.5 버전에서 변경된 사항이다.






2011 February 01 (3.7.5)



  • Added the sqlite3_vsnprintf() interface.

  • Added the SQLITE_DBSTATUS_LOOKASIDE_HIT, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, and SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL options for the sqlite3_db_status() interface.

  • Added the SQLITE_OMIT_AUTORESET compile-time option.

  • Added the SQLITE_DEFAULT_FOREIGN_KEYS compile-time option.

  • Updates to sqlite3_stmt_readonly() so that its result is well-defined for all prepared statements and so that it works with VACUUM.

  • Added the "-heap" option to the command-line shell

  • Fix a bug involving frequent changes in and out of WAL mode and VACUUM that could (in theory) cause database corruption.

  • Enhance the sqlite3_trace() mechanism so that nested SQL statements such as might be generated by virtual tables are shown but are shown in comments and without parameter expansion. This greatly improves tracing output when using the FTS3/4 and/or RTREE virtual tables.

  • Change the xFileControl() methods on all built-in VFSes to return SQLITE_NOTFOUND instead of SQLITE_ERROR for an unrecognized operation code.

  • The SQLite core invokes the SQLITE_FCNTL_SYNC_OMITTED file control to the VFS in place of a call to xSync if the database has PRAGMA synchronous set to OFF.



보기에는 바뀐게 많지 않아 보이는데 정적 라이브러리를 만들기 위해 소스를 보니 ICU 옵션이 추가되었다. VC 에서는 문제가 없었지만 BC (Embarcadero C++ Builder) 에서는 문제가 되는 것 같다. 






이 글에서는 새 버전에 대한 글만 올리고 라이브러리 관련된 것은 변화가 있기때문에 테스트를 거친후에 올려야 겠다.

<

Original Post : http://neodreamer-dev.tistory.com/498