갤럭시 S3를 구입하고, 몇몇 최적화 방법에 대해서 고민을 해봤다.

  갤럭시 S3 LTE에 비해 갤럭시 S3 3G 모델은 메모리가 2G -> 1G로 축소되어 제공되었다. 1G 메모리가 그렇게 작은 크기는 아니지만, 젤리빈에, 삼성 어플에, 심지어 통신사(SKT) 어플까지 얹으니 디폴트로 뜬 용량이 대략 650M를 상회했다.

약간 하이레벨의 프로그램을 돌리거나, 몇가지가 동시에 동작되는 경우 전체적으로 느려지는 건 다반사고, 더욱이 젤리빈으로 넘어가면서 TouchWiz 라는 홈런처 프로그램은 메모리 부족인지는 모르겠지만, 간혹 게임 같은 프로그램을 돌릴 때 저절로 종료까지 되었다.

 

진정한 최적화는 구글 레퍼런스 폰( 넥서스 원, 넥서스S, 갤럭시 넥서스, 넥서스4 등등 )을 사용하는게 답이지만, 애석하게도 난 갤럭시 S3 그것도 3G 버전을 들고 있을 뿐이고.. 최대한 적응하는 수 밖에 없었다.

 

 

그래서 결국 하나씩 손보기 시작했다.

 

단, 최적화에서 다음의 조건을 충족할 수 있도록 했다.

  1. 펌웨어 변경 없이 한다.
  2. 하드웨어 리셋을 하지 않는다.
  3. 최대 500M 이하로 떨어뜨려 2~300M의 공간을 확보한다.

1번 조건은 삼성 정책 때문에 결정했다. 이놈의 삼성에서는 펌업을 하면, 카운트를 하도록 했다. 커스텀 펌웨어를 올린 횟수 만큼 자동으로 카운트가 올라가는데, A/S 받을 때 불이익을 주려고 하는듯 싶다. 물론 이 카운터도 리셋은 가능하지만, 귀차니즘이 한가득한 나로써는 그냥 자연스럽게 커스텀 펌웨어 업데이트를 안하게 만들었다.

 

2번 조건은, 지금까지 설정한, 받아온 이력을 고스란히 남겨보고 싶은 욕심 때문이다. 현재 전화 송수신 이력 부터 모든 문자 메시지까지 지금까지 쭉 사용한 전체 이력 정보 부터 설정 정보까지 그래도 남기고 싶어서다. 물론 A/S를 받거나 하면 홀랑 날려 먹기 충분한 정보지만, 최소한 이 최적화 한다고 날려먹고 싶진 않았다.

 

3번 조건은 최적화 한계치다. 안드로이드 운영체제인 젤리빈도 나름 규모가 있는 운영체제다 보니, 나름 용량을 차지한다. 게다가 1G 라고 했지만, 시스템 영역까지 빼고 나면, 780M 정도... 그렇다면, 최소 500M 안쪽으로 들어가야 200M 정도 확보가 되고, 그래야 게임같은 프로그램을 돌릴때 안정적이지 않을까 싶다.

 

 

이 모든 말을 한마디로 하자면, "순정 최적화" 라고나 할까....

 

 

순정 최적화의 결과물은 아래와 같다.

 

489M 정도. 물론 작업 관리자 뜨면 2~30M가 늘어나긴 하지만, 선방이라고 생각된다.

 

 

 

단, 이 글을 읽고 난 뒤, 최적화를 할 때, 난 왜 안돼???? 라고 반문하기 전 스스로를 살펴봐야 한다.

최적화가 성공적으로 되려면, 불필요한 사항들을 내려서 얻어 낸 것이라는 점이다. 즉, Google Play가 되었던, 어둠의 경로가 되었던, 수만가지의 앱들을 설치하고, 이런 저런 이유로 다양한 앱들을 활성화 시키면 최적화의 의미가 없다.

최적화는 정말 효율적으로 활용하기 위한 방편일 뿐이지, 정답이란 없기 때문이다. 수많은 앱들이 동작시키면서 동시에 최고의 성능을 바란다면, 차라리 최신예 최고급 모델을 사서 쓰는게 답이다.

 

 

불필요한 앱 없애기

먼저 자신이 보유한 앱들을 돌아보면서 불필요한데, 설치되어 있는 앱들은 삭제한다. 간혹 실행도 하지 않으니 상관 없지 않나? 라고 말씀하시는 분들이 있는데, 앱들 중에는 서비스를 등록해서 메모리를 일부 잡아 먹는 일종의 상주형 앱들이 은근히 많다.

 

특히 알림 메시지를 뿌리는 앱들이 대표적인데, 대부분의 게임과, 대부분의 정보성 앱들이 그렇다. 그 외에 상시적으로 데이터를 송/수신 해야 되는 앱들(메일, 실시간 정보 수집 앱 등등) 역시 서비스로 항상 떠 있다.

 

그러므로, 스스로 생각할 때, 1주일 내로 실행된적이 없는 앱들은 과감하게 지운다. 내장 저장소도 비워지지만, 무엇보다 서비스들이 사라지므로 이 또한 큰 효과를 가져온다.

 

여튼 불필요한 앱들은 모두 언인스톨을 하던 삭제를 하던지 해서 확실하게 끝내도록 한다.

 

 

불필요한 기본 앱 없애기

통신사를 거쳐서 판매된 국산 폰들의 최악의 문제점은 사용자가 사용하지도 않을 앱들을 마치 선심 쓰는 양 마구 잡이로 억지로 넣고는 삭제하지도 못하게 만든 점이다. 앞서 말한 불필요한 앱들의 대부분이 바로 이런 앱들이지 않을까 싶다.

 

오른편에 보이는 항목들이 필자 개인적으로 사용하지 않은 앱들로써, 마구 종료시켜버린 앱들이다. ( 삭제가 안됨 )

 

사용중지를 시키는 방법은 설정 -> 애플리케이션 관리 -> 전체 를 선택하면 앱들의 목록이 쭉 나오는데, 그 중 사용 중지 시킬 앱을 클릭해서 들어가서 "강제 중지 -> 사용 안함" 을 클릭한다.

 

 

 

 

홈 런처 변경하기

요즘은 다양한 홈 런처들이 존재한다. 윈도우의 Explorer 같은 것인데, 바탕화면 부터 앱을 실행하기 위한 단계를 나타내는 화면이다.

 

화면 꾸미기 좋아하시는 분들은 이 홈 런처를 이것 저것 깔아서 돌려보는데, 이거 최적화의 큰 걸림돌이다. 게다가, 삼성에서 기본으로 제공하는 TouchWiz는 정말이지 꽝이다 싶다. 화면을 편하게 볼 수 있는 것도 아니면서 앱 관리하는 기능도 불편하고, 게다가, 느리고 무겁기 까지 하다.

 

이것도 걷어내야 하는데, 개인적으로 쓰는 런처가 있으면 1가지만 선택해서 사용하는 것을 권장한다.

 

필자는 작고, 가볍고, 빠른 노바 런처를 사용한다.

 

 

노바 런쳐 개발자들의 머리에 총알이 들어가서 무겁고 쓸데없이 기능만 많은 쓰레기 런쳐로 변신할 수도 있지만, 개인적으로는 현재까지 나온 런처중 가장 가볍고 기본기 충실하다고 생각된다.

 

노바 런처를 설치하고, 기본 런처로 설정해주면 된다.

 

 

정리

운영체제가 업그레이드 되면 당연히 메모리나, CPU, GPU 자원을 더 많이 소모하는 건 어쩔 수 없다. 기능도 기능이고, 기타 자동으로 제공되는 서비스들을 지원하다 보면 필연적일 수 밖에 없다. 하지만, 그렇다고 매번 이 폰을 최신예 기종만을 가져다 쓸수도 없는 노릇이다.

 

진정 최적화 하려면, 운영체제 부터 다이어트 하고, 불필요한 앱들을 청소해야 하는데, 이것을 하려면, 커스텀 펌웨어를 스스로 만들어서 업데이트해야 한다. 하지만, 이 작업을 하기에는 컴파일이라든가, 제품 구성/패키징까지 의외로 난이도가 높다. 차선으로 이런 문제를 안고 있는 사용자들의 커뮤니티를 통해서 만들어진 커스텀 펌웨어를 구하는  방법이 있긴하다. 하지만, 100인 100색이라고, 자신의 입맛에 100% 맞을리 없으니, 이 또한 커스텀 펌웨어를 이것 저것 갈아타는 악순환에 빠질수도 있다. 더욱이 보안 패치 같은 중요한 업데이트에서 누락될 수 있는 문제도 있다.

 

결국 순정으로 돌아가는데, 그러면 다시 최적화 문제로 빠지게 된다.

 

일단, 스스로의 폰에 어느정도 만족하면서 기능을 최대한 활용하는 방법을 고민하다 보면 자연스럽게 최적화를 구성할 수 있을 것이다.

728x90

요 근래 C#으로 데이터 베이스를 다루는 작업이 늘어가고 있다.

그런데, 단순히 Select / Insert / Update / Delete의 문제는 단순 쿼리 작성으로 해결은 할 수 있었는데,
문제는 변경된 사항만 적용하는 점이다.

 

Select를 해서 가져온 DataTable을 Grid 같은 곳에 DataSource로 붙인 것 까지는 좋은데,
이 Grid에서 데이터를 변경해서 나온 값을 가지고 뭔가 하려고 하니, 도데체 무엇이 변경되었는지를
찾는게 하나의 일이 되버렸다.

 

그렇다고, 전수 검사하는 것도 웃기기도 하고...

 

하지만, 태생이 DB 출신인 DataTable이 변경점 하나 없이 동작한다는 것은 말이 안될 것 같고 해서 이리 저리 사이트 돌아다면서 확인해보니, 역시 있었다.

 

DataTable.GetChanges()

 

이 메소드를 사용하면, DataTable 내의 데이터 변경 점을 모두 가져올 수 있었다.

 

사용방법은 아래와 같다.

 

준비

 

먼저 GetChanges를 호출하는 방법부터 확인하자.

 

이를 위해서 데이터를 준비한다. (여기서의 모든 예제는 SQLite를 사용한다. )

 

 

 

SQLiteConnectionStringBuilder sbConnectionString = new SQLiteConnectionStringBuilder();
sbConnectionString.DataSource = "test.db";
string sConnectionString = sbConnectionString.ToString();
SQLiteConnection conn = new SQLiteConnection(sConnectionString);
conn.Open();

// DB에 테이블을 생성
SQLiteCommand cmd = new SQLiteCommand(conn);
cmd.CommandType = CommandType.Text;
cmd.CommandText = "CREATE TABLE  IF NOT EXISTS T_CATEGORIES ( ID INTEGER PRIMARY KEY NOT NULL, NAME TEXT )";
cmd.ExecuteNonQuery();

// 테이블에 테스트 데이터 추가.
cmd = new SQLiteCommand(conn);
cmd.Transaction = transaction;
for (int i = 0; i < 100; i++)
{
	cmd.CommandType = CommandType.Text;
	cmd.CommandText = "INSERT INTO T_CATEGORIES(NAME) VALUES ( 'Category" + i.ToString() + "');";
	cmd.ExecuteNonQuery();
}

// 테이블의 내용을 Select
DataTable dtResult = new DataTable();
dtResult.AcceptChanges();
cmd = new SQLiteCommand(conn);
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM T_CATEGORIES";

// DataTable에 Select한 내용을 채우기.
SQLiteDataAdapter atapter = new SQLiteDataAdapter();
atapter.SelectCommand = cmd;
atapter.Fill(dtResult);

코드 상에서는 SQLite 개체를 쓰기는 했지만, OleDB가 되었던 MS SQL Server Client가 되었던,
요점은 ConnectionString을 구해와서 Connection을 맺고, Command를 만든 뒤, Adapter 개체를 생성해, DataTable에 Fill 하는 것이다.

 

일단 위의 코드를 사용하면, SQLite를 이용하여 test.db 안에 있는 T_CATEGORIES 라는 테이블의 모든 데이터를 dtResult 라는 곳에 채우는 것이다.

 

일단, dtResult 라는 DataTable을 만들었으면 조작을 시작해보자.

 

 

INSERT

 

데이터를 추가해보자.

DataRow newRow = dtResult.NewRow();
newRow["ID"] = dtResult.Rows.Count;
newRow["NAME"] = "New Category!";
dtResult.Rows.Add(newRow);

데이터 추가 로직은 간단하다. NewRow() 메소드로 DataTable의 Column에 맞게 구성된 DataRow를 확보한 뒤, 그 안에다 적절한 데이터를 넣는다. 그리고 난 뒤, RowCollection 에다 Add 를 한다.

 

이렇게 하면 dtResult라는 DataTable안에 새로운 데이터가 추가된다.

 

그렇다면 변경된 정보는 어떻게 확보할까?

그 때 GetChanges() 라는 메소드를 쓴다. GetChanges() 메소드를 사용하면, 전체 데이터 중에 변경점에 해당하는 값들을 모두 가져올 수 있다.

DataTable dtChanged = dtResult.GetChanges(DataRowState.Added);
foreach (DataRow row in dtChanged.Rows)
{
	if(row.RowState == DataRowState.Added)
	{
		foreach (DataColumn col in dtChanged.Columns)
		{
			Debug.Write(row[col].ToString());
			// 여기서 INSERT 구문을 작성한다.
	        }
		System.Diagnostics.Debug.WriteLine(" ");
	}
}

GetChanges()를 실행할 때, 파라미터를 하나 넣는데, 그 안에 넣는게 바로 DataRowStatus다.
만일 Insert 된 사항이 있으면 Added를 Update된 사항은 Modified, Delete된 사항이 있으면 Deleted를 아예 변경된적이 없는 경우에는 Unchanged를 넣으면 된다. 물론 복합적으로 사용도 된다. "|" 표시를 하면 복합적으로 검색해서 넣어준다.

DataTable dtChanged = dtResult.GetChanges(DataRowState.Added|DataRowState.Deleted| DataRowState.Modified);

변경 점들이 담긴 Table에서 Row들을 하나씩 꺼낸다. 이 정보를 이용해 INSERT 구문을 만들어 DataBase 상에 INSERT 해주면 된다.

 

 

UPDATE

 

INSERT와 매우 유사하다.

다만 틀린 것은 새로 추가된 사항이 아니고, 변경된 점 대비 이전 값이라는 것도 한번 더 체크해야 된다는 점이 다르다.

DataTable dtChanged = dtResult.GetChanges(DataRowState.Modified);
foreach (DataRow row in dtChanged.Rows)
{
    if (row.RowState == DataRowState.Modified)
    {
        object beforevalue = null;
        object aftervalue = null;
        foreach (DataColumn col in dtChanged.Columns)
        {
            beforevalue = row[col, DataRowVersion.Original];
            aftervalue = row[col, DataRowVersion.Current];

            // UPDATE 구문을 작성한다.
        }
        System.Diagnostics.Debug.WriteLine(" ");
    }                                
}

이전 값을 가져올 때는 DataRow의 배열에서 DataRowVersion 값까지 같이 넣어주면 된다. 
이 때, Original을 선택하면 변경 전의 값을 가져온다. 

단, 이 구문은 INSERT된 항목에서는 사용하면 안된다.
INSERT에서는 Original 값이라는 것이 없기 때문이다!

 

 

DELETE

 

이번에는 삭제된 값이다.
삭제된 값을 얻어오는 것도 위의 UPDATE 와 별다르지는 않다.
다만! 현재 값이 존재하지 않는다는게 문제다.

 

만일 아래와 같이 짜게 되면 Exception을 발견하게 된다.

DataTable dtChanged = dtResult.GetChanges(DataRowState.Deleted);
foreach (DataRow row in dtChanged.Rows)
{
    if (row.RowState == DataRowState.Deleted)
    {
        object beforevalue = null;
        object aftervalue = null;
        foreach (DataColumn col in dtChanged.Columns)
        {
            beforevalue = row[col, DataRowVersion.Original];
            aftervalue = row[col];    // 에러 발생!
            aftervalue = row[col, DataRowVersion.Current];    // 에러 발생!

            // DELETE 구문을 작성한다.
        }
        System.Diagnostics.Debug.WriteLine(" ");
    }                                
}

주석 중 "에러 발생!" 이라고 적은 부분이 있는데, row[col] 혹은 row[col, DataRowVersion.Current]를 하게 되면,

"Deleted row information cannot be accessed through the row" 라는 Exception이 발생한다.
이미 삭제했기 때문에, 현재 값이라는 것이 존재하지 않기 때문이다.

 

즉 aftervalue 라는 것 대신 before value(DataRowVersion.Original)을 이용해서 이전 값을 이용해 DELETE 문을 위한 구문을 작성하면 된다.

 

 

 

정리

 

.NET Framework에서는 DataSet(DataTable)을 이용하여 OldDB 개체를 통해 직접 수정하면 데이터베이스 상에서도 반영되게 만들어 줄 수 있다. 즉 DataTable 혹은 DataSet을 Select 등을 활용해 가져온 뒤, DataGrid에서 값을 변경하면, 자동적으로 데이터베이스와 연동해서 바뀐 값이 바로 바로 변경되게 구성할 수 있다는 점이다.

매우 DB 친화적인 것처럼 보일 수 있겠지만, 실제로는 거의 써먹질 못한다.

그 이유 중 하나가 Select를 할 때, 보통 Join을 해서 여러 개의 테이블을 복합적으로 사용하는 경우가 많은데,
이 경우 복합적으로 만들어지는 DataSet(DataTable)은 자동적으로 Update, Insert, Delete를 해줄 수 없다.
결국 개발자가 변경 점에 맞추어 SQL Query문을 생성해서 실행해야 된다는 것이다.

 

이런 변경 점을 즉시 즉시 찾을 수 있다면, 별도로 Dirty Flag를 만들어 변경 점이 있는지 없는지 늘 체크할 필요도 없고,
이전 데이터와 비교한다고 생쑈를 부릴 필요가 없어진다.

( 필자의 프로젝트 수행한 것 중, 무식하게 비교 점을 찾는 프로그램이 있었다. 틈 나면 그 부분도 갈아 엎어야 할 듯...)

728x90

Java에서 보면 DateTime 대신, Calendar를 주로 사용한다.
아마도 지역마다 다른 이유나, 음력 등을 이유로 Date 개체로 처리하기에는 한계가 있어,
Date를 더욱 막강하게 만든 것 같다.

현재 이런 저런 구성 중에, 특정 일자의 이전, 이후에 대한 판단이 필요한 경우가 발생하는데,
Date 클래스에 있는 befere, after 처럼 Calendar에도 존재한다.

문제는 매번 짤 때 마다, 이 before, after 함수의 의미를 헷갈릴 때가 너무 많아서,
여기에 기억 되새김질 겸해서 적는다.

 

{Calendar 개체}.before({비교대상})

이 기본 문법인데, 이것을 이해하는 방법은 애석하게도 미국인 식으로 생각해주어야 한다.

{Calendar 개체} before then {비교대상}

즉 저 before 라는 의미는 “{비교대상}보다 {Calendar 개체}가 이전 인가?”라는 의미와 같다.

 

역으로 after는 다음과 같이 이해하면 된다.

{Calendar 개체}.after({비교대상})

이 기본 문법인데, 이것을 이해하는 방법은 아래와 같다.

{Calendar 개체} after then {비교대상}

즉, “{비교대상}보다 {Calendar 개체}가 이후 인가?”라는 의미와 같다.

 

아래와 같은 예제 코드를 실행 해보면 대충 짐작이 갈 것이다.

public void testCalendarAfterBefore()
{
	Calendar cal = Calendar.getInstance();
	Calendar calTester = (Calendar) cal.clone();
	calTester.roll(Calendar.DATE, 1);
	System.out.println(calTester.before(cal));
	System.out.println(cal.before(calTester));
}

위의 예제를 실행하면 이와 같은 결과를 얻을 수 있다.

false
true

 

cal 에는 현재 시간이, calTester에는 +1일 날짜가 담긴다.
즉, calTester가 cal보다 1일 더 큰 날짜이다.

이것을 위의 예제를 영어로 해석한다면,

calTester before then cal

cal before then calTester

이것을 한국말로 보자면,

calTester는 cal 보다 이전 날짜인가? 당연 false.

cal은 calTester 보다 이전 날짜인가? 당연 true.

 

단! 주의할 점은 저 비교는 모두 <. > 이지, 같은 것은 false 이다.

public void testCalendarAfterBefore()
{
	Calendar cal = Calendar.getInstance();
	Calendar calTester = (Calendar) cal.clone();
	
	System.out.println(calTester.before(cal));
	System.out.println(cal.before(calTester));
}

처음 예제 와는 다르게 아예 두 개가 같은 날인 경우 비교가 되지 않는다.
그래서 결과 값은 모두 false로 떨어진다.

false
false

만일 이전/이후 뿐만 아니라, 같거나 이전, 같거나 이후 이렇게 하려면,
같은지 여부를 반드시 먼저 체크해준 뒤에 이전/이후를 구분하여 처리해야 할 것 같다.

 

이 정도 적었으니, 잊어 버리진 않을 것 같다 ㅎㅎ.

728x90

넥서스(NEXUS) S 순정롬 업데이트 프로그램( http://www.hind.pe.kr/1166 )을 현재 제공하고 있습니다.

이 프로그램의 소스를 공개합니다.

공개 프로젝트는 네이버 개발자 센터에 위치해 있으며 URL은 http://dev.naver.com/projects/nexusupdattor 입니다.

해당 소스는 SVN을 통해 Up/Down이 가능합니다.

(물론 Commit은 저만 되어 있는데, 필요하신 분이 있으면 선택적으로 승인할 예정이니다.)

 

이 프로젝트는 MS Visual Studio 2010 으로 만들어졌습니다. (물론 Visual Studio 2010 Express C# 으로도 조작이 가능합니다. ). SVN 연동을 하기위해서는 AnkhSvn 이라는 프로그램이 설치되어 있으면 좋습니다.

코드 내용은 그렇게 어렵지는 않겠지만, 난독증을 유발한다면, 해당 부분을 캡쳐해서 저에게 전달 해주시면 답변 드리도록 하겠습니다.

image

728x90

Windows 7에서는 기존에 설정된 네트워크와 IP 주소, 게이트웨이, 넷마스크 등의 값을 기반으로, 네트워크가 틀려지면 해당 네트워크에 대한 프로파일을 생성한다.

아마도 아무 의미없이 지나가겠지만, 새로운 네트워크에 접속하면 아래와 같이 선택하는 화면이 뜬다.

image

그래서 집/회사/공공 장소로 나누어 각 보안 설정을 나누어 특정 대역대에 접속하면, 그에 맞게 방화벽이나, 공유 설정등을 할 수 있다. 집은 모든게 열려 있고, 회사는 특정 멀웨어들의 포트들을 막고, 공공장소는 대부분이 막힌 그런 설정을 꾸밀 수 있다.

그런데, 어느날 친구가 안드로이드 폰으로 테터링을 했더니, 너 프로파일이 무척이나 많이 생겼다는 것이였다. 개인적으로는 저 프로파일이 수십개 생겨도 컴퓨터에 별 지장도 없거니와 큰 불편함이 없기에 그냥 쓰라고 종용했다.

그러다, 문득 "왜? 없지" 라는 질문을 스스로에게 던지고, 구글 사마에 물어보니..왠걸.. 있었다.

http://answers.microsoft.com/en-us/windows/forum/windows_7-networking/how-do-i-delete-or-clear-redundant-network/07834191-708d-45f9-9ef2-e779dd930ce3

image

뭐 솰라솰라 읽을 필요는 없고, 간단히 말하지만, 네트워크 프로파일의 아이콘을 클릭한 뒤, 하이퍼 링크로 제공하는 "네트워크 위치 삭제 및 병합"을 하면 되는 작업이다.

해당 메뉴는 다음과 같은 순서로 들어간다.

1. 제어판 열기 ( 시작 메뉴의 제어판을 클릭한다 )

image

2. 네트워크와 인터넷 열기 ( 만일 아이콘 배열을 했으면 3번 항목으로 건너 뛴다)

image

3, 네트워크와 공유센터 열기

image

4. 연결된 네트워크 중 아이콘 아무거나 클릭하기 ( 집, 회사, 벤치 어느거든 상관 없음 )

image

5. 하단의 "네트워크 위치 삭제 또는 병합" 클릭하기 ( 웹의 하이퍼링크 처럼 생긴 부분 )

image

6. 이제 원하는 네트워크를 삭제하거나 병합한다.

image

 

예전에는 이거 안되는 걸로 알고 있었는데 원래 기능이 있었던 것 같다. ( 답변이 2010년인거 보면, Windows 7 발표 후 얼마 안되서 이므로... )

이거 친구에게 안된다고 박박 우겼는데 미안할 따름이다 ;;;;;

728x90

2주 전쯤 사망하신 IPhone 3GS를 결국 접고, SKT로 옮겼다.

그런데, 루팅을 하려하니 왠걸, 넥서스 시리즈와는 전혀 다른 형태의 제약사항이 아주 그냥...

결국 루팅은 포기한 채, 내부에 설치된 App 정리를 해보는데, 이게 또 장난이 아닌 것이였다. 하나씩 종료해보면서 종료되는 것들을 기준으로 쭉 종료시켜서 정리했다. 대략 구글 레퍼런스에서 제공된 앱에 삼성, SKT가 각각 150여개의 앱을 지들 멋대로 만들어 마구 끼워 넣은 듯 싶다.

전체 앱 목록들을 전체 다 리스트 업하고, 그 중 사용 불가능 처리한 앱들을 표시한다.(후에 초기화 한 뒤, 복구 작업을 위해서 기록 차원으로 남긴다. ) - 설명 항목은 추후에 생각나는대로 적을 예정

ID App 이름 설명 사용불가능
1 갤러리    
2 계산기    
3 날씨    
4 날씨데몬(KR)    
5 날씨위젯    
6 날씨위젯 메인    
7 내 파일    
8 네이트온 UC    
9 네트워크 위치    
10 다운로드    
11 다운로드 관리    
12 다이얼러 저장소    
13 듀얼시계(디지털)    
14 듀얼시계(디지털)    
15 듀얼시계(아날로그)    
16 라이브 배경화면 받기    
17 라이선스 설정    
18 메시지    
19 모던 시계    
20 모바일 네트워크    
21 모바일 인쇄    
22 모바일 트래커    
23 모바일 T-World    
24 뮤직 플레이어    
25 미디어 저장소    
26 베스트 페이스    
27 보안 저장소    
28 블루투스 공유    
29 비디오 플레이어    
30 사전    
31 사진 배경    
32 삼성 키보드    
33 설정 저장소    
34 설치 마법사    
35 소프트웨어 업데이트    
36 소프트웨어 업데이트    
37 시계(디지털)    
38 시계(디지털)    
39 시계(펑키)    
40 시스템UI    
41 심플 알람 시계    
42 안드로이드 시스템    
43 알람/시계    
44 애플리케이션 모니터    
45 얼굴 인식 잠금해제    
46 연락처    
47 연락처 저장소    
48 원격 단말 관리 서비스    
49 원격 제어    
50 원터치 신고 도우미    
51 음성 녹음    
52 이메일    
53 인증서 설치 프로그램    
54 인터넷    
55 일정 저장소    
56 자주 사용하는 연락처    
57 작업 관리자    
58 잘라내기    
59 주변기기    
60 지도    
61 카메라    
62 케이블 연결 모드    
63 통신 상태 알림    
64 패키지 관리자    
65 패키지 액세스 도움말    
66 환경설정    
67 휴대폰    
68 AllShare Cast    
69 AllShare Case Dongle S/W  Update    
70 AllShare Service    
71 Application installer    
72 AvrcpServiceSamsung    
73 BluetoothTest    
74 com.android.backupconfirm    
75 com.android.sharedstoragebackup    
76 com.android.smspush    
77 com.google.android.voicesearch    
78 com.samsung.app.playreadyui    
79 com.sec.android.app.FlashBarService    
80 com.sec.android.app.minimode.res    
81 com.sec.android.app.wfdbroker    
82 com.sec.android.providers.downloads    
83 com.sec.bcservice    
84 com.sec.phone    
85 ContextProvider    
86 CSC    
87 DataCreate    
88 DMMonitor    
89 DRM으로 보호된 콘텐츠 저장소    
90 DSMForwarding    
91 DSMlawmo    
92 DttSupport    
93 Enterprise SysScope Service    
94 Enterprise VPN Services    
95 Exchange  서비스    
96 Factory Mode    
97 Factory Test    
98 FM 라디오    
99 Gmail    
100 Google 검색    
101 Google 검색    
102 Google 계정 관리자    
103 Google 북마크 동기화    
104 Google 주소록 동기화    
105 Google Backup Transport    
106 Google Partner Setup    
107 Google Play 무비    
108 Google Play 북    
109 Google Play 서비스    
110 Google Play 스토어    
111 Google Services Framwork    
112 Google TTS(Text to speech) 엔진    
113 Helv Neue S    
114 HTML 뷰어    
115 I-WLAN    
116 INDIServiceManager    
117 Input Devices    
118 Key Chanin    
119 Lcdtest    
120 LogsProvider    
121 MAPServiceSamsung    
122 MediaBridge    
123 MelOn    
124 More 서비스    
125 MTP 애플리케이션    
126 Music FX    
127 NFC 서비스    
128 NFC Test    
129 OMACP    
130 OmaDrmPopup    
131 Perso    
132 PhoneUtil    
133 Picasa Uploader    
134 PickupTutorial    
135 Preconfig    
136 S메모    
137 S플래너    
138 S플래너 위젯    
139 SamsungAppsUNA2    
140 SASlideShow    
141 SecSetupWizard    
142 SelfTest Mode    
143 Service mode    
144 ShareShotService    
145 SIM 툴킷    
146 SKT Diagnosis    
147 SKT Diagnosis(Service)    
148 SKT Hidden Menu    
149 SKT Network App    
150 Smartcard Service    
151 start    
152 Sys Scope    
153 T store Agent    
154 T store ARM    
155 T store Downloader    
156 T store Sideloading    
157 T store Utility    
158 TestService    
159 TMServerApp    
160 TouchWiz 홈    
161 TwDVFSApp    
162 User Dictionary    
163 VpnDialogs    
164 Wi-Fi로 Kies 연결    
165 WlanTest    
166 wssyncmlnps    
167 YouTube    
168 11번가   X
169 거품   X
170 검색 애플리케이션 공급자   X
171 그룹 캐스트   X
172 깊은 바다   X
173 네이트   X
174 뉴스 데몬(KR)   X
175 도움말   X
176 리더스 허브   X
177 리더스 허브 스토어   X
178 마켓 피드백 에이전트   X
179 바람 날씨   X
180 빛나는 도트   X
181 사용 설명서   X
182 삼성 계정   X
183 삼성 TTS   X
184 삼성 서비스센터   X
185 삼성 Apps   X
186 쇼핑과 지갑   X
187 스마트 청구서   X
188 스마트 월렛   X
189 스마트카드 서비스   X
190 싸이월드   X
191 앱가이드   X
192 연합뉴스   X
193 원격 상담   X
194 원격 제어   X
195 원격 제어   X
196 이데일리   X
197 자주 사용하는 애플리케이션   X
198 주식 데몬(KR)   X
199 태그   X
200 토크   X
201 통화 음질 사용자 설정   X
202 패닝 연습   X
203 페이즈 빔   X
204 AllShare Play   X
205 Apple   X
206 BadgeProvider   X
207 CapabilityManagerService   X
208 ChocoEUKor   X
209 CoolEUKor   X
210 DirectConnectManager   X
211 DirectShareManager   X
212 EnterprisePermissions   X
213 Go!NFC   X
214 Google+   X
215 Hoppin   X
216 MagnifierService   X
217 Paper Artist   X
218 Polaris Viewer 4.1   X
219 S Suggest   X
220 S보이스   X
221 Samsung Backup   X
222 Samsung Backup Provider   X
223 Samsung Brower SyncAdapter   X
224 Samsung Calendar SyncAdapter   X
225 Samsung Cloud Data Relay   X
226 Samsung Push Service   X
227 Samsung Smemo SyncAdpter   X
228 Samsung Syncadapters   X
229 SecWallpaperChooser   X
230 SKT Diagnosis(Screen2)   X
231 SNS   X
232 SyncmIDS   X
233 T 멥버십   X
234 T 서비스   X
235 T cloud   X
236 T map   X
237 T Store   X
238 TalkBack   X
239 TCA   X
240 Tinker   X
241 Topic Wall   X
242 Wi-Fi Direct   X
243 Wi-Fi Direct 공유   X
728x90

요즘 SharePoint 관련된 업무를 하지 않다보니, SharePoint가 벌써 2013이 나왔다는 사실은 몇 일 전에 알았습니다. Windows Server 2012가 나와서 이번에 개인적으로 사용하는 Windows Server 를 업그레이드 해봤다가, 문서 저장용 서버로 SharePoint로 이용하기 위해 SharePoint 2013을 설치했습니다.처음에는 익숙했던 SharePoint 2010 을 설치하려고 했는데, 호환성 이슈가 있어서, 결국 쓰지 못하고, 대신 SharePoint 2013을 사용하게 되었습니다.

기왕 설치하는 것이라는 마음에 RBS(Remote BLOB Storage : SQL의 FILESTREAM 기법을 활용한 원격 BLOB 저장 기법)까지 적용해봤습니다.

이런 저런 우여곡절은 있었지만, 간신히 설치해봤고, 띄워봤는데, 약간 느린점만 빼면, UI는 정말 깔끔하고, 자바스크립트도 훌륭하게 정리된 것 같습니다.

2

일단 파일 업로드가 간편해졌습니다. "또는 여기로 파일 끌어 놓기" 라는 위에 아무 파일이나 Drag & Drop을 하는 순간 업로드가 됩니다. 매번 파일 업로드를 하기 위해 Submit Form을 띄워서 처리할 필요가 없어졌습니다.

5

3

그리고 SharePoint 2010에서 제공한 리본 메뉴도 정리가 되어 이젠 완전히 Office 처럼 되었습니다. 얼핏 보았을 때는 뭔가 있어보이고, 깔끔하게 가려져서 괜찮은듯 싶지만, 이 부분은 호불호가 갈릴듯 싶습니다.

6

웹 파트도 간단하게 넣고 편집할 수 있습니다. 드디어 Contents Management의 끝을 Javascript로 완성한 듯 싶습니다. 일정한 틀 내에 문자열을 추가/삭제/편집 해서 원하는 디자인을 뽑아내고, 등록된 웹파트들을 넣고 빼기가 더욱 쉬워졌습니다. 물론 윈도우 내에 설치용 프로그램만큼의 성능을 제공하지는 않지만, 간단한 편집이나, 관리에서는 빼어난 능력을 제공합니다.

진짜 웹파트만 잘 구성해서 제공해도 SharePoint에서 사용하는 것에 불편함이나 문제가 없어보입니다.

7

 

아직은 개인 문서 관리 차원에서 사용하기 위해 설치를 한 상태라 파일 업로드 정도로만 올려봤습니다.
아직까지는 무슨 기능이 어떻게 동작하는지는 모르겠지만, 차근 차근 하나씩 밟아 보려고 합니다.

예전 SharePoint Foundation 2010과 같이 Windows Server에 무료로 제공하는 버전도 있을텐데, 아직 설치해보지는 않았습니다. 만일 단순한 기능의 팀사이트 정도라면 그 정도 레벨로 다른 곳에 설치를 한 뒤 리포팅을 해볼 예정입니다.

728x90

시작하며

개인 업무로 레드마인을 사용하고 있습니다. 형상관리에 버전관리까지 필요한 기능을 탑재하고, 혼자 사용하는 중이기 때문에, 기능의 간편성도 훌륭해서 마음에 들어하며 잘 사용하고 있습니다. 하지만, 설치까지 가는데 많은 시간을 소요하는데가, 개인적인 기준으로는 좀 복잡합니다. 아파치에, My SQL에, 루비에...

그러다가  Bitnami 라는 곳에서는 Open Source로 구성된 다양한 서버 제품을 간단하게 설치할 수 있는 패키지를 만들어 배포하는데, 그 곳에서 Redmine도 같이 배포를 하더군요. 그래서 남는 개인 PC에다 Windows Server를 설치한 뒤, 그 위에 Bitnami에서 배포하는 Redmine을 설치했습니다. 이 Installer를 통해 설치를 하니, 아파치 + MySQL + 루비에다 Subversion 서버 까지 같이 한 셋으로 설치가 되더군요. 이거 마음에 흡족했습니다.

그리고, 한 1년 정도를 사용했을까요. 제가 당시에 설치했을 때 1.3.1 버전은 벌써, 2.1.3 버전으로 훌쩍 올라왔더군요. 조금은 많이 당황스러웠습니다. 내부적으로 무엇이 업그레이드 되었는지는 모르겠지만, 최소한 Major 버전 ( 1.X -> 2.X 로 변한)의 업그레이드다 보니, 내부적인 큰 변화가 알게 모르게 있을 것입니다. 기왕지사 쓰는거 최신 버전을 활용하는게 좋을 것이다라는 생각이 들더군요.

하지만, 애석하게도 Bitnami에서 제공하는 패키지는 업그레이드를 지원하지 않습니다. 오로지 설치, 설치, 설치. 즉 새로 설치하라는 의미인 것이였죠. 하지만, 지금까지 쌓아온 데이터가 있는데, 그리 쉽게 포기하기는 쉽지 않습니다.

그래서 계속 다양한 방법으로 시도해보려 했지만, 쉽게 성공치 못하고 있다가, 우연히 살펴본 "채윤이네집"님의 사이트에서 [CentOS] bitnami Redmine stack 업그레이드기( 1.2.X -> 2.0.X) 라는 글을 보게 되었습니다.

그리고 시도했고, 성공했습니다. 이에 대한 기록입니다.

 

전제조건

  • 이 모든 기록은 제 Redmine에 대한 설정을 기반으로 설명합니다. 설치 경로나 구성이 다소 다를 수 있습니다. 이 부분에 대한 차이는 각기 구축한 형태에 맞게 적용해보시면 됩니다.
    • 설치 경로 : D:\Redmine
  • Redmine 내에 사용자 플러그인을 전혀 사용하지 않았습니다. 간혹 Bitnami 포럼에 보면, 업그레이드 도중 오류가 발생하는 경우에 대한 포스팅이 많은데, 대개의 경우 이 플러그인에 걸리는 경우가 많습니다. 메인 Redmine의 큰 판 업그레이드가 되다보니, 플러그인에서 미처 대응이 안되는 경우 오류가 발생되는 것이죠. 만일 개인적으로 플러그인을 다양하게 사용한다면, 업그레이드 전에 플러그인의 호환성을 먼저 체크하셔야 될 겁니다.
  • SQL 서버로는 My SQL을 사용합니다. Redmine 자체가 다양한 DB 서버를 사용하다 보니, 고급 사용자의 경우 다른 DB 서버를 연결해 사용할 수 있습니다. 이 경우 저와는 완전히 다른 작업을 수행해야 할지 모릅니다.
  • 현재 사용중인 Redmine 사이트의 포트는 80이 아닌 4500 이라는 괴이한 포트를 사용 중입니다. 하나의 공유기를 통해 사용 하다가 보니, 다른 곳에서 이미 80을 사용하기 때문에, 할 수 없이 그리 된 것입니다. 
  • 만일 SVN을 Redmine에서 제공하는 기본 SVN 서버를 사용 중이시라면, 반드시 Redmine 설치 위치를 기준으로 subversion 폴더도 같이 백업하시기 바랍니다. 아래의 내용은 SVN 내용에 대해서는 언급하지 않기 때문에, 그대로 따라하다가 SVN 데이터까지 날릴 수 있습니다.!

 

백업

[ 백업하기 전 알아야 할 점 ]

먼저 기존에 설치되어 있던 Redmine 정보를 백업합니다.

1.x 대 버전의 Bitnami Redmine과 2.x 대 Redmine의 경로가 약간 다릅니다.

1.x 대 버전의 경우 Redmine의 소스 경로는 "%BITNAMI설치위치%\apps\redmine" 인 반면에,
2.x 대 버전의 경우 "%BITNAMI설치위치%\apps\redmine\htdocs" 입니다.
( 위의 %BITNAMI설치위치% 는 Bitnami를 이용해 설치한 위치가 됩니다. 기본값은 "C:\Bitnami\Redmine-x.x.x" 입니다. )

먼저 설치된 Redmine 위치를 먼저 파악하시기 바랍니다.
( 여기의 예제는 모두 D:\Redmine 의 위치를 기준으로 설명합니다. )

제일 먼저 수행하는 작업은 서비스 종료입니다.

Bitnami 설치 위치의 폴더를 보면, manager-windows.exe 라는 프로그램이 있읍니다.

redmine001

, 이것을 실행하면 아래와 같이 나옵니다. mysql을 제외한 나머지들을 모두 Stop 시켜주시기 바랍니다.

redmine002

 
[ 첨부파일 백업 ]

제일 먼저 수행하는 작업은 첨부 파일 백업입니다.

"D:\Redmine\apps\redmine\files" 라는 폴더가 있습니다. ( 2.x 버전에서는 "D:\Redmine\apps\redmine\htdocs\files" 입니다. 이하부터는 1.x 버전에서 2.x 버전으로 마이그레이션하는 것을 기준으로 설명합니다. 만일 2.x 에서 상위 버전으로 한다면 그에 맞게 htdocs를 넣어주시기 바랍니다. )

이 폴더의 내용이 Redmine 상에 저장된 첨부파일 들 입니다. 이 내용을 폴더 채로 모두 압축 복사하시기 바랍니다.

redmine003

첨부 파일 백업이 끝났으면 이젠 mysql 에 저장된 Redmine 정보들을 모두 백업합니다.

[ DB Backup ]

Redmine 에서는 다양한 DB를 지원하지만, Bitnami Redmine에서는 MySQL을 기본적으로 제공합니다. 그래서 백업도 MySQL을 통해서 백업을 수행합니다. 여기서 잠깐. MySQL을 접속하기 위한 정보를 먼저 알아야 합니다. 계정 정보 및 관련 접속 정보를 직접 확인해야 합니다.

확인되어야 할 위치는 D:\Redmine\apps\redmine\config 위치에 있는 database.yml 파일입니다. 접속에 관련된 모든 정보가 이 파일 안에 담겨져 있습니다.

redmine004

이 파일을 메모장(Notepad)를 열어보시면 됩니다.

redmine005

파일 내용 중에 production 부분에서 database, username, password 이 세가지 부분을 파악하시면 됩니다.
별도로 적어두시거나 아니면 화면 구석에 띄워두시기 바랍니다.

이제 먼저 명령 줄 창을 띄웁니다. ( 실행 창을 띄워 - Windows Key + R - 그 안에 cmd라고 입력합니다). 띄워진 창에서 아래의 명령을 입력합니다.

mysql 경로로 이동했으면 이제 mysql을 실행해서 데이터를 백업합니다. 실행하기 위한 명령은 아래와 같습니다.

D:\Redmine\mysql\bin\mysqldump.exe -u bitnami -p bitnami_redmine > D:\backup.sql

-u 다음 위치에 username을,
-p 다음 위치에 database name을 넣어주시고,

">" 다음에 백업 결과물 위치와 파일이름을 전체 경로로 해서 적어주시면 됩니다.

그리고 난 뒤, password 가 나오면 password를 입력합니다. 정상적으로 완료 되면 백업할 위치에 해당 파일이 저장됩니다.

redmine006

 

새 버전 설치

이제 모든 정보에 대한 백업은 완료되었습니다. 이제 Bitnami Redmine을 새로 설치합니다. Bitnami Redmine Stack 이라는 언인스톨 항목이 남아 있으면 그것을 통해 언인스톨을 해주시기 바랍니다. 만일 언인스톨이 불가능하다면, 앞서 소개 드린 서비스 관리해주는 manager-windows.exe 라는 프로그램을 통해 모든 서비스를 종료하시고 강제로 해당 폴더의 모든 내용을 삭제해주시기 바랍니다.

기존 버전을 삭제한 후, 새로운 버전을 받아 설치하시기 바랍니다. 설정 방법은 기존에 설정했던 방식대로 해주시기 바랍니다. 웹 서버 설정 값이라든가, 관리자 메일등 각종 설정 내용을 넣어주시기 바랍니다.

모든 사항이 설치되었다면 이제 복원 작업을 수행합니다.

 

복원

[ DB 복원 ]

기본적으로 새로 설치하면 redmine 서비스가 올라오지 않은 상태입니다. 일단 그대로 둔 상태로 진행하시기 바랍니다. 만일 서비스가 시작된 것이 있다면 mysql 을 제외하고 모두 종료해주시기 바랍니다.

이제 앞서 소개 시켜드린 대로 database.yml 파일을 찾아 다시 열어 주시고, database name, username, password 정보를 다시 열어 보시기 바랍니다. 새로 설치했기 때문에, 암호 설정이 바뀌었기 때문에, 이 정보를 꼭 확인하시기 바랍니다.

확인되었으면 이제 도스창을 다시 열어서 아래처럼 mysql에 접속하시기 바랍니다.

D:\Redmine\mysql\bin\mysql.exe -u bitnami -p

그러면 명령창을 통해 mysql 에 접속하게 되는데, password를 물어보면 앞서 얻은 정보를 통해 입력해주시기 바랍니다. 정상적으로 접속되었으면 아래와 같이 "mysql>" 의 프롬프트가 뜰 것입니다.

redmine007

이제 아래와 같은 sql 명령을 한 줄 씩 입력합니다.
아래의 명령은 새로 설치하면서 자동으로 구성된 redmine용 Database를 삭제한 뒤,
새로 빈 Database를 생성합니다.

drop database bitnami_redmine;

create database bitnami_redmine;

exit

이제 Redmine용 빈 데이터베이스가 준비되었습니다. 이것을 복원합니다. 복원은 간단합니다. "<" 라는 부분만 넣고, 아까 백업했던 파일을 맨 뒤에 적어주시면 됩니다. 아까 백업할 때, D:\Backup.sql 파일로 백업을 수행했는데, 이 파일로 복원하는 것입니다.

아래와 같은 명령 줄을 넣고, password에 암호를 입력해주시면 됩니다.

D:\Redmine\mysql\bin\mysql -u bitnami -p bitnami_redmine < D:\Backup.sql

정상적으로 종료가 되었으면 별다른 메시지 없이 종료될 것입니다.

 

[ DB Migration - 이전 작업 ]

Database를 복원하는데까지는 성공했지만, 문제는 백업할 때의 DB 내용은 예전 버전의 DB라는 사실이다. 그러므로, 이것을 새로운 버전으로 변경해주는 작업을 해야 합니다. 이 작업을 하려면, ruby 실행에 관련된 파일들이 필요합니다. 즉시 적용이 될 수 있도록 도스창에서 다음과 같은 줄을 입력하시기 바랍니다.

PATH=D:\Redmine\ruby\bin;%PATH%

저렇게 입력하면 어디서든 ruby 명령을 입력할 수 있게 됩니다. (다만 도스 창이 닫히면 PATH 설정이 날라가므로, 새로 열었을 때는 반드시 위의 명령을 다시 넣어주시기 바랍니다. )

자 이제 다음 명령을 입력하여, redmine 관련된 위치로 이동합니다.

cd /d "D:\Redmine\apps\redmine\htdocs"

이동했으면 다음 명령을 한 줄 씩 실행해주시기 바랍니다.

rake db:migrate RAILS_ENV=production

rake redmine:plugins:migrate RAILS_ENV=production 

그러면 기존 복원했던 DB의 정보를 모두 현재 버전에 맞게 이전 해주면서 정리가 됩니다.

 

[ 첨부 파일 복원 ]

D:\Redmine\apps\redmine\htdocs\files 경로에 앞서 압축했던 files 내용을 그대로 부어주시기 바랍니다. delete.me 파일을 덮어쓸 거냐고 나오는데, 그냥 덮어쓰셔도 무방합니다.

 

[ 서비스 실행 ]

서비스 관리해주는 manager-windows.exe 라는 프로그램을 통해 Stop 된 서비스를 모두 Start 해주시면 완료됩니다. 레드마인에 접속하여 정상적으로 잘 되었는지 확인하시기 바랍니다.

 

정리

지금까지 계속 1.3.1 버전을 사용하다가, 요즘 나온 2.1.4 버전으로 업그레이드 했습니다.
일전에 Redmine 관련 도구를 만들려다가 보니, REST API 지원 문제로 2.X 버전으로 업그레이드 하려다가 정보 부족으로 업그레이드에 실패했습니다. Bitnami 사이트 내에서는 Upgrade에 대한 문서를 찾을 수 없었고, 기타 블로그에서는 CentOS 나, Linux용 Bitnami에 대한 소개가 대부분이였습니다.

그러다가, 우연히 채윤이네 님의 홈페이지를 통해 찬찬히 보니 Windows에서도 될 것 같다는 생각에 진행해봤고, 다행히 성공적으로 마무리 지어졌습니다.

다소 내용의 난이도가 오르락 내리락 해서 내용이 어렵게 보일 수 있겠지만, 잘 보시면 별로 어려운 내용은 없습니다. 요약하면 다음과 같습니다.

  1. MySQL 백업과 복원
  2. 첨부파일 목록 백업과 복원
  3. ruby의 rake 도구를 사용하여, Database 업그레이드 하는 작업

이 세가지 규칙만 이해하시고 진행하시면 간단하게 하실 수 있을 겁니다.

728x90

+ Recent posts

728x90