기타, 리뷰2016.11.22 03:04

친구와 함께, 유튜브 채널을 하나 운영하고 있고 약 2개월 정도 되었습니다. 일주일에 하나 올릴 정도의 간격으로 아직 활성화된 채널은 아니지만요.

처음 유튜브 채널을 만들 때 구독자 수에 관한 고민을 많이 했었습니다. 검색을 해 가면서 찾고 여러 가지를 시도해봤습니다. 다른 블로그에서 찾지 못한 방법들을 몇 가지 조금씩 적어보려고 합니다.



1. 맞구독방(?)


 찾다 보니, 0 ~ 10대 사용자 층에서 맞구독방이라는 컨텐츠를 발견했습니다. 서로 구독하자는 취지에서 아주 짧은 동영상 컨텐츠입니다. 맞구독방 컨텐츠의 채널을 구독하고, 댓글로 구독완료를 표시하면, 그 사용자도 자신의 채널을 구독하여 구독자 수를 늘려 주겠다는 것입니다.

 

 자신이 구독한 사용자의 컨텐츠를 접하게 되면서, 그 사용자도 자신의 컨텐츠를 접하게끔 만든다는 것입니다. 동시에 자신의 컨텐츠의 조회수는 늘어 나갈 것이라는 거죠. 


 단점도 있습니다. 맞구독방 컨텐츠를 업로드하는 사용자들중 일부는 구독자 수만 올려 주고, 구독 정보는 자세히 들여다 보지 않는 것이 될 수도 있지요. 하지만 구독자 수는 인지도가 올라가는 수이기도 하기에 올리면 올릴 수록 좋긴 하죠. 그렇다고 해도 구독을 했다면, 이렇게 일부러 안 보지 않게 되지 않을겁니다.


 자신의 채널에 맞구독방 컨텐츠를 올리는 것은 최대한 삼가하셔야 합니다. 채널의 전체적인 질이나 분위기를 좋지 않게 만들 수도 있으니까요. 물론 처음 만드신 분이라면 하셔도 괜찮다고 생각합니다. 구독자를 늘린 후 지우고 구독자 수만 그대로 새로운 채널로 시작하셔도 되니까요.




2. 맞구독방 계정 2개 이상?


 계정 2개 이상 구독 완료 해 준다는 건, 하나는 자신의 본 계정으로, 그 나머지는 부계정으로 구독하겠다는 것이고, 부계정에서는 컨텐츠를 시청하지 않겠다는 의미이겠고 조회수가 올라가지 않습니다. 계정 2개 이상을 구독 해줘도 나쁠 것은 없지만, 시끄럽게 하는 알림 설정이나, 불편하게 구독자끼리 소통을 요구합니다. (알림 수를 클라이언트에서 직접 볼 수 있는지는 정확하게 모르겠습니다.) 그런게 아니라면 구독을 걸어 봅시다.





 

신고
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