2015년 9월 22일 화요일

node.js 에서 for문 사용하기 ( Callback 포함 )


출처 : http://www.richardrodger.com/2011/04/21/node-js-how-to-write-a-for-loop-with-callbacks/#.VgIAfdLtlBc




node.js 의 구조적 특성탓에 for문 일반적으로 쓰면 잘안됨.

재귀적인 function 으로 for문 효과를 줄 수 있음.



내 경우에는 다중 이미지 업로드 웹페이지를 만들고 있었음.

 <form method='post' action='/uploads' enctype='multipart/form-data'>  
 <input type='file' name='image' multiple/>  
 <input type='submit' value='전송'/></form>

HTML 은 이런식

그리고 express 를 통해 받았다.

path 에 있는 이미지를 read 해서

다시 내가 원하는 폴더로 파일명을 현재시간(nowsysdate)으로 변경해서

write 하도록 만들었다

결과적으로 잘된다. 굿

function readwrite(j)  
                               {  
                                    if( j < multiNum)  
                                    {  
                                         fs.readFile(req.files.image[j].path, function (err, data)   
                                         {  
                                              var newPath = __dirname + "/uploads/fullsize/" + nowSysDate + j + '.' + splitType;  
                                              console.log('my new Path --> ' + newPath);  
                                              fs.writeFile(newPath, data, function (err)  
                                              {  
                                                   if(err) { log(' fs.writeFile 에러 ---> ' + err ) }  
                                                   else { readwrite(j+1) };   
                                              });       
                                         });  
                                    }  
                               }  
                               readwrite(0);  






2015년 9월 14일 월요일

SharedPreferences 에서 commit 과 apply 의 차이



 안드로이드 스튜디오는 apply 를 쓰라고 해당 코드에 마킹을 해서

 뭔 차이가 있나 찾아봤다.


 일단 commit 는 (저장이) 성공하면 boolean타입인 true 값을 반환

 apply 는 반환값이 없다는게

 눈에 보이는 차이점이다.



 그러면 단순히 반환값이 있고/없고 인데... 왜 IDE 에서는 apply 를 추천할까.


 public abstract boolean commit ()   --  API 1

public abstract void apply ()  -- API 9


commit은 API 최초부터 있었던 것이고 apply는 9버젼(2.3)에서 부터 지원했다.

기존에 있던것을 뭔가 보안했기 때문에 새롭게 나온것이다.


눈에 보이지 않는 차이점은 동기/비동기 였던 것이다.

저장공간과 지속적인 동기를 통해 preference 를 작성하던 commit 과 달리

apply는 비동기적으로 반영이 된다는 것이다.
(이는 실패시 어떤 알림을 받을 수 없다는 문제점도 있긴하다)


commit의 동기는 여러분의 method 를 block 하고 write 하기때문에

apply 보다 필연적으로 느릴 수 밖에 없다.

(그렇기 때문에 IDE 는 apply 를 추천(고려)하나보다...)



commit 을 쓰던걸 apply 를 쓰면 저장 속도가 약 10 ~ 30배 까지 빨라진다고 하니

장단점이 있나보다.




2015년 9월 3일 목요일

(2015년 9월 API23 적용) 안드로이드 사이드바 (네비게이션 드로어) 적용 소스


1. AppCompatActivity 사용 ( 더 이상 ActionBarActivity 는 그만..대부분 deprecated 됨 )

2. toolbar 사용안함. 

3. 롤리팝 메터리얼 디자인 가이드 적용

4. 사이드바 드로우시 아이콘 애니메이션 적용 ( 三 에서  <-  로 변하는 애니메이션 )


Gradle 쪽 소스추가부분

build.gradle (Module: app)
(targetSdkVersion 은 23)



dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.0.0'    compile 'com.android.support:support-v4:23.0.0'}




디자인 XML 쪽 소스
(DrawerLayout를 사용하면 첫번째는 FrameLayout 이 사용되어야 함 )

activity_main.xml


<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">

    <FrameLayout        android:id="@+id/container"        android:layout_width="match_parent"        android:layout_height="match_parent" />

    <ListView        android:id="@+id/list_drawer"        android:layout_width="240dp"        android:layout_height="match_parent"        android:layout_gravity="start"        android:background="#f1f2f7"        android:choiceMode="singleChoice"        android:divider="@android:color/transparent" />

</android.support.v4.widget.DrawerLayout>



자바소스 부분

MainActiviy.java

import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
{

    DrawerLayout drawerLayout;
    ActionBarDrawerToggle toggle;

    @Override    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        //왼쪽상단 버튼 생성        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        toggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.hi, R.string.bye) {};
        drawerLayout.setDrawerListener(toggle);
        toggle.syncState();

    }

    @Override    public boolean onOptionsItemSelected(MenuItem item)
    {
        //왼쪽상단 버튼 누르면 사이드메뉴 튀어나오도록        if (toggle.onOptionsItemSelected(item))
        {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}





안드로이드 스튜디오 (Android Studio) Alt Enter (auto import) 가 이상할 때 방법



개발중 support v7 쪽이 전혀 import 되지 않는 상황이 발생

File -> Settings -> Editor -> General -> Auto import 를 가봤더니

Exclude 되어있었다.


살포시 빼주자.