분류없음2016.11.30 00:40

요즈음 내가 얼마나 코딩을 잘 하는가, 프로그래밍을 잘 하는가이다. 페이스북 생활코딩 그룹이나 페이스북 친구에게 프로젝트 결과물을 동영상으로 보여 줄 때는 정말 잘 만들었다고 생각한다. 근데 나는 그정도 프로그래밍을 잘 하지 못하는 것 같고 지금 당장 만들어보라고 하면 만들지 못할 것 같은 느낌도 난다. 


그런 면에서 봤을 땐 나는 프로그래밍을 조금 못하는 편이 아닌가 싶기도 했다. 또한 나는 알고리즘에 대한 것은 거의 모르고 있고, 어제 버블정렬이라는 것을 한번 해 본 정도다. 그것도 그럴 게, 안드로이드를 공부하면서 어플리케이션을 개발하는 것만 신경을 썼고 정렬이라든지 배열을 다루는 것에 대한 건 Java나 안드로이드에서 이미 좋은 걸 제공하고 있었다. 그런 것을 사용하다 보니 자연스럽게 다루지 않게 되고 고찰을 점점 하지 않게 되었다. 게다 구지 정렬이니 뭐니 하는 알고리즘을 사용하지 않아도 안드로이드라면 무엇이라도 자신있게 만들 수 있을 거 같은 아주 한심한 생각을 한 때도 있다.


현재는 안드로이드에 대한 것은 다 아는 편은 아니다. 간단한 어플리케이션이라면 바로 만들 수 있을 지도 모르겠다. 근데 내가 프로그래밍을 잘 하는가 고민하면서 한가지 빼먹은 것이 하나 있었다. 내가 생각한 건 코딩을 잘 하는 거라면 구글에서 구지 레퍼런스를 찾아보지 않아도 만들 수 있는 정도로 생각하고 있었다. only 내 생각이지만 구글 없이 코딩이 가능한가 라고 했을 때 전혀 아닌 것 같았다. 아무리 잘 해도 레퍼런스를 찾아가면서 해야 안정적으로 프로그래밍을 짤 수 있다고 생각했다.


그러면서 내가 맨 처음에 프로그래밍에 입문하게 된 계기인 아두이노를 생각해봤다. 아두이노에서 어떤 걸 만들려면, 사용하는 모듈, 센서의 라이브러리를 가져 와야 된다. 라이브러리는 그 모듈의 제조사의 홈페이지나 github에 있을 수도 있고, 네이버 블로그나 카페에서 찾아 볼 수도 있다. 그리고 그 라이브러리의 함수 예제들을 참고를 해야 사용하는 것이 가능했고, 그렇게 어떤 걸 만들어 동작을 하게 된 경험이 있다.


그래서 지금 생각하고 있는 건, 코딩을 얼마나 잘 하느냐라는 건 별로 중요한 건 아닌 것 같다고 생각한다. 코딩을 해서 뭘 만드는가가 가장 중요한 것 같다. 무엇을 만들려면 결국엔 구글을 통한 레퍼런스, 또는 예제가 필요하고, 그렇게 해야 좋은 프로그램을 짤 수 있다고 생각한다. 알고리즘이라든지, 그런 것도 예제를 통해 알게 될 것이라고 생각한다.


물론 경험이 그다지 있는 편이 아닌 내 생각은 맞을 수도 있고 틀릴 수도 있다. 그냥 그렇게 느끼고 있다는 것이다..!

Posted by icaynia

안드로이드에서 ListView를 사용하던 중에 원하지 않는 결과가 나왔다.



위는 실행시킨 후 정상적인 모습이다. 하지만...



아래쪽으로 스크롤해보니 이상하게 반복되었다.



다시 올려봤다. 뒷부분이 반복되는것 뿐만 아니라 이렇게 데이터가 꼬이기도 한다.

그리고 디자인도 오류다..



위처럼 실행 시킨 코드 중에, Custom Adapter중 getView 함수에 문제가 있었다.
내가 짠 잘못된 커스텀 Adapter의 코드는 다음과 같다. 

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_wordview, parent, false);

ViewHolder vh = new ViewHolder();

vh.korean = (TextView) convertView.findViewById(R.id.korean);
vh.word = (TextView) convertView.findViewById(R.id.wordtx);
vh.hiragana = (TextView) convertView.findViewById(R.id.hiraganatx);

convertView.setTag(vh);

word n = m_List.get(position);
if (n != null) {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.korean.setText(n.korean);
holder.word.setText(n.word);
holder.hiragana.setText(n.hiragana);
}
}



getView 함수 중 convertView라는 것이 있다. 이 convertView는 ListView의 성능 향상을 위해 재활용되기도 한다.

5번째 줄 if 문에서, convertView == null 일 경우 실행하는 코드가 있다. 어플리케이션을 시작하고 나서 이 함수가 처음 실행될 때, convertView는 null이다. 즉 convertView에 view를 추가해 줘야 한다.

그런데, 그 후에는 convertView가 null이 아니다. 내가 저질러버린 실수는 converView가 null인 경우 모든 것을 실행해버리고, 재활용되어 null이 아닌 경우는 아무것도 실행을 하지 않는다.


@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_wordview, parent, false);
}
ViewHolder vh = new ViewHolder();

vh.korean = (TextView) convertView.findViewById(R.id.korean);
vh.word = (TextView) convertView.findViewById(R.id.wordtx);
vh.hiragana = (TextView) convertView.findViewById(R.id.hiraganatx);

convertView.setTag(vh);

word n = m_List.get(position);
if (n != null) {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.korean.setText(n.korean);
holder.word.setText(n.word);
holder.hiragana.setText(n.hiragana);
}

단순히 if문을 닫는 위치만 바꾸어 줬다. 






Posted by icaynia

public String loadFile(String FileName) {
String dirPath = "/sdcard/test";
File file = new File(dirPath);
String content = "";
String initword = "파일이 없음";

if( !file.exists() ) {
file.mkdirs();
return initword;
}

if ( file.listFiles() != null ) {
for (File f : file.listFiles()) {
String str = FileName;
Log.v(null, "fileName : " + str);
String loadPath = dirPath + "/" + str;
try {
FileInputStream fis = new FileInputStream(loadPath);
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(fis));

String temp = "";
while ((temp = bufferReader.readLine()) != null) {
content += temp;
}
Log.v(null, "" + content.toString());


} catch (Exception e) {

}

}
} else {
}
return content;
}

코드는 내가 봐도 마음에 안 들지만 일단 작동하기에 대충 메모만 해 둡니다.

담에 바꾸는 걸로 해야지.

Posted by icaynia

MainActivity든 다른 액티비티나 클래스이든 Java파일에서:

public void saveFile(String FileName, String str) {

String dirPath = "/sdcard/testname";
File file = new File(dirPath);
if( !file.exists() ) {
file.mkdirs();
}
String testStr = str;

File savefile = new File(dirPath+"/"+FileName);
try{
FileOutputStream fos = new FileOutputStream(savefile);
fos.write(testStr.getBytes());
fos.close();
} catch(IOException e){}
}

AndroidMainfest.xml 의 <mainfest>안에 넣을 것.


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


코드 리팩토링 전혀 안된 메모용 코드이다...

Posted by icaynia


위처럼 아이콘 버튼을 추가하는 방법입니다.


MainActivity.java


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(getResources().getDrawable(android.R.drawable.ic_menu_save));

toolbar.setNavigationIcon(getResources().getDrawable(android.R.drawab.아이콘이름));


주의할 점은 setSupportActionBar(toolbar); 아래줄에 넣어야 합니다.

Posted by icaynia

PHP를 통한 파일 업로드 시 이러한 문제가 발생합니다.

파일 업로드 시 디버그 내용은 print_r($_FILES); 으로, 에러 코드만 볼 때는 echo $_FILES['userfile']['error']; 만 작성해서 오류 내용을 볼 수 있는데요.


에러 코드가 2인 경우를 살펴 보겠습니다.

테스트로 어떤 파일을 올려 보았는데, 에러 코드 2가 반환됩니다. 이 에러 코드를 php.net 에서는 다음과 같이 설명합니다.

UPLOAD_ERR_FORM_SIZE, 업로드한 파일이 HTML 폼에서 지정한 MAX_FILE_SIZE 지시어보다 큽니다.


하지만 MAX_FILE_SIZE에는 30000이라는 큰 숫자를 넣었는데 오류가 걸립니다. 그래서 저는 문제가 다른 곳에 있다고 생각했습니다.


그런데 저 MAX_FIKLE_SIZE의 단위가 KB(킬로바이트) 단위가 아닙니다. 그냥 B(바이트) 단위이더군요. 그래서 바이트에 맞게 입력을 해야 됩니다.


일단 이 문제인지 확인 하고 아래처럼 늘려봤습니다. 간단히 해결됬습니다.


1000 byte = 1Kb입니다. 코드 작성할 때 참고하세요.

Posted by icaynia
TAG #php
초대장2016.05.05 15:09



현재 초대장을 모두 드렸습니다.


- 초대장 신청 방법

초대장을 신청하시려면 아래 댓글로 티스토리 아이디로 사용하실 이메일주제를 비밀글로 작성해 주세요.

다 읽어보고 나서 가장 열심히 할 것 같아 보이는 분께 초대장을 보내드리겠습니다.

초대장은 비밀글로 입력한 이메일로 보내드리며, 받은 이메일의 안내에 따라 티스토리 계정을 가입하고 블로그를 생성하시면 됩니다.


- 주의하세요!

이메일로 초대장을 받은 후 2일 이내에 가입하지 않으면 이후 초대장이 회수되며 티스토리에 가입할 수 없으므로 가급적 빨리 가입하시기 바랍니다.

댓글 작성시 개인정보 유출 우려가 있으므로 꼭 비밀글로 작성해 주세요.


Posted by icaynia
Program/TIPs2016.03.29 23:52



스마트폰으로 음악을 많이 듣는 분들에게는 태그가 필수입니다. 태그의 기능만 보자면 아티스트, 앨범별로 정리도 되고 특정 아티스트의 노래만 들을 때 바로바로 검색해서 틀수 있어 편하기 때문입니다.

뿐만 아니라 앨범 아트도 추가하여 눈으로 보는 즐거움까지 더해주는 비주얼도 있구요.


다른 서비스, 예를 들면 last.fm 같은 서비스를 사용하려면 태그를 정리해두는 것은 필수적으로 해 두어야 제대로 스크로블링(Scrobbling)됩니다. last.fm에 관한 내용은 다음에 설명하겠습니다.

아무튼 태그를 설정하려면 컴퓨터에서 프로그램을 설치해서 수정할 수 있습니다. mp3Tag 프로그램을 설치해서 수정하거나 아이튠즈에서 직접 수정할 수도 있습니다.

이번에는 안드로이드 휴대폰에서 직접 태그를 수정하는 스타 음악 태그 편집기를 소개합니다. 안드로이드에 있습니다.



안드로이드 플레이스토어에 있으며 무료로 다운로드 할 수 있습니다. 인앱 구매라고 되어 있지만 추가 구매를 하지 않아도 태그 편집하는데는 아무 무리가 없을 것 같습니다. 다운로드 받고 앱에서 태그 편집할 노래를 선택하면 됩니다. 아티스트별, 앨범별로 검색 가능합니다.



제목, 아티스트, 앨범 등 여러가지 정보를 담을 수 있는 공간이 있습니다. 수정하고 싶은 대로 수정한 후 저장하시면 됩니다.

음악 파일이 외장 sd카드에 있는 경우에는 저장하기를 누른 후에 SD카드에 권한을 주도록 안내가 잘 되어 있으니 그대로 하면 됩니다.

Posted by icaynia
Program/TIPs2016.03.29 23:15

안드로이드 크롬을 통해 음악, 동영상 파일 등 미디어 파일을 다운로드 받아 로컬에 저장하려고 하는데 저장은 되지 않고 재생만 가능한 스트리밍모드로 되는 경우가 종종 있습니다. 

mp3 파일을 다운로드해서 파일로 저장하려고 했는데 아래 화면처럼만 뜨고 로컬에 저장되지는 않습니다.



다른 브라우저를 통해 다운로드를 할 수 있겠지만 크롬에서 파일 다운로드하는 방법을 알려드리겠습니다.


다운로드 하는 방법 :

먼저 chrome://history 로 들어가거나, 주소창 오른쪽 메뉴 - 방문 기록으로 들어가세요.

그리고 방문했던 링크를 찾습니다. 끝이 *.mp3, *.mp4 로 되어있는 링크입니다. 찾아 길게 눌러 메뉴가 나타나면 링크 저장을 선택하시면 됩니다.





Posted by icaynia
초대장2016.03.26 13:18

티스토리 블로그를 시작하고 나서 처음으로 티스토리 초대장을 배포 받았네요.




초대장을 모두 드렸습니다.


- 초대장 신청 방법

초대장을 신청하시려면 아래 댓글로 티스토리 아이디로 사용하실 이메일주제를 비밀글로 작성해 주세요.

다 읽어보고 나서 가장 열심히 할 것 같아 보이는 분께 초대장을 보내드리겠습니다.

초대장은 비밀글로 입력한 이메일로 보내드리며, 받은 이메일의 안내에 따라 티스토리 계정을 가입하고 블로그를 생성하시면 됩니다.


- 주의하세요!

이메일로 초대장을 받은 후 2일 이내에 가입하지 않으면 이후 초대장이 회수되며 티스토리에 가입할 수 없으므로 가급적 빨리 가입하시기 바랍니다.

댓글 작성시 개인정보 유출 우려가 있으므로 꼭 비밀글로 작성해 주세요.

Posted by icaynia