2018년 12월 19일 수요일

Android WebView: handling Geolocation permission request

https://medium.com/@xabaras/android-webview-handling-geolocation-permission-request-cc482f3de210

2018년 12월 18일 화요일

/Android-안드로이드-오픈소스-사이트-총정리

https://coding-factory.tistory.com/entry/Android-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%B4%9D%EC%A0%95%EB%A6%AC

2018년 12월 15일 토요일

Android Apps — 30 things that experience

https://qiita.com/heshanfu/items/c97e8581658a0cadee82

resources-getting-started-android-development/

https://riggaroo.co.za/resources-getting-started-android-development/

2018년 12월 13일 목요일

handling-touch-events-onintercepttouchevent-and-ontouchevent

https://stackoverflow.com/questions/27406072/handling-touch-events-onintercepttouchevent-and-ontouchevent

2018년 11월 29일 목요일

Qiitaに投稿 https://qiita.com/STONEBKIMTAEHO/items/2141b1c7ed5d149dfd9e

https://qiita.com/STONEBKIMTAEHO/items/2141b1c7ed5d149dfd9e

2018년 11월 12일 월요일

Android Aspectj 로 로그 정성껏 출력해보기.. 머래...

import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Debug;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.View;


import com.afwsamples.testdpc.Application;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;

@Aspect
public final class AspectDebugLog {
    //Line형태의 시퀀스 로그
    private static final String ASPECT_LOG_SEQUENCE_TYPE = "ALOGSEQ";

    //PlantUML에 이용하기 위한 로그
    private static final String ASPECT_LOG_PLANTUML_TYPE = "ALOGUML";

    //버퍼를 모아서 디비에 출력하기용.
    private static int logBufferCount = 1;
    //Limit 만큼 카운트가 되면 디비에 저장.
    private static int logBufferStoreCountLimit = 3000;

    //버퍼를 모아서 디비에 출력하기용. 프로비저닝 등의 작업에서는 로그출력이 불가능하니까 사용
    private static String logBufferMessages = "";

    private static HashMap<Integer, List<String>> depthTexts = new HashMap<>();
    private static HashMap<Integer, Integer> depthCounts = new HashMap<>();
    private static HashMap<Integer, Integer> processColor = new HashMap<>();

    private static String verticalLine = "│";
    private String lastClassMethod = "Start";


    private static final String START = "Start";
    private static final String ACTIVATE = "activate ";
    private static final String DEACTIVATE = "deactivate ";

    private int logType1 = 1;
    private String argAll;

    private static final String POINTCUT_BEFORE_METHOD =
            "(" +
                    "execution(* com.afwsamples.testdpc..*.*(..)) " +
                    ")" +
                    " && !(" +
                    "execution(* com.afwsamples.testdpc.Application*..*(..))" +
                    ")";

    private static final String POINTCUT_AROUND_METHOD = POINTCUT_BEFORE_METHOD;

    @Pointcut(POINTCUT_BEFORE_METHOD)
    public void pointcutDebugTraceBefore() {}

    @Pointcut(POINTCUT_AROUND_METHOD)
    public void pointcutDebugTraceAround() {}

    @Before("pointcutDebugTraceBefore()")
    public void weaveDebugTraceBefore(JoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String currentClassName = utils.getOnlyClassName(methodSignature.getDeclaringType().getSimpleName());
        String currentMethodName = utils.getOnlyClassName(methodSignature.getName());
        //not use
        argAll = utils.getArgs(joinPoint, methodSignature);

        int tid = android.os.Process.myTid();

        List<String> dummyDepthText = utils.getdepthTexts(tid);

        lastClassMethod = utils.getLastClassMethod(lastClassMethod, dummyDepthText, logType1);

        if (utils.getdepthCounts(tid) < 1) {
            lastClassMethod = "Start";
        }

        LogPrinter.logBefore(currentClassName, currentMethodName, lastClassMethod, tid);
        LogPrinter.logBeforeArg(lastClassMethod, tid, argAll);


        printTo(type2PrintTid(tid) + ASPECT_LOG_SEQUENCE_TYPE, utils.repeat(verticalLine, utils.getdepthCounts(tid) + 1) + "▼" + "(" + joinPoint.getSignature().getDeclaringType() + ") ");
        printTo(type2PrintTid(tid) + ASPECT_LOG_SEQUENCE_TYPE, utils.repeat(verticalLine, utils.getdepthCounts(tid) + 1) + "┏ " + currentMethodName);


        dummyDepthText.add(currentClassName);
    }

    @NonNull
    public static String type2PrintTid(int tid) {
        return tid + ": p-";
    }

    @NonNull
    public static String type2PrintTidForUml(int tid) {
        return "";
    }


    @Around("pointcutDebugTraceAround()")
    public Object weaveDebugTraceAround(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String currentClassName = utils.getOnlyClassName(methodSignature.getDeclaringType().getSimpleName());
        String currentMethodName = utils.getOnlyClassName(methodSignature.getName());

        int tid = android.os.Process.myTid();
        List<String> dummyDepthText = utils.getdepthTexts(tid);

        depthCounts.put(tid, utils.getdepthCounts(tid) + 1);

        LogPrinter.logAroundBefore(currentClassName, tid);

        if (argAll.length() > 0) {
            printTo(type2PrintTid(tid) + ASPECT_LOG_SEQUENCE_TYPE,  utils.repeat(verticalLine, utils.getdepthCounts(tid) + 1) + argAll);
        }

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Object result = joinPoint.proceed();
        stopWatch.stop();

        LogPrinter.logAroundAfter(currentClassName, currentMethodName, dummyDepthText, stopWatch.getTotalTimeMillis(), tid, result);


        printTo(type2PrintTid(tid) + ASPECT_LOG_SEQUENCE_TYPE,  utils.repeat(verticalLine, utils.getdepthCounts(tid) + 1) + "result  " + result );
        printTo(type2PrintTid(tid) + ASPECT_LOG_SEQUENCE_TYPE,  utils.repeat(verticalLine, (utils.getdepthCounts(tid))) +
                "┗ " + currentMethodName +
                " : " + stopWatch.getTotalTimeMillis() + "ms");

        //after process
        depthCounts.put(tid, utils.getdepthCounts(tid) - 1);

        if(dummyDepthText.size() >0) {
            dummyDepthText.remove(dummyDepthText.size()-1);
        }
        depthTexts.put(tid, dummyDepthText);

        return result;
    }

/*    @Around("(execution(* android.app.Activity.onResume(..)) || execution(* android.app.Activity.onCreate(..)) || execution(* show(..)) )")
    public Object postonResume(ProceedingJoinPoint joinPoint) throws Throwable {
      final Activity activity = (Activity) joinPoint.getTarget();
        final View rootView = activity.getWindow().getDecorView().getRootView();


        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                storeScreenshot(takescreenshotOfRootView(rootView), Calendar.getInstance().getTimeInMillis() + "-" + activity.getLocalClassName()  );
            }
        }, 500);
        Object result = joinPoint.proceed();
        return result;
    }*/


    public static Bitmap takescreenshot(View v) {
        v.setDrawingCacheEnabled(true);
        v.buildDrawingCache(true);
        Bitmap b = Bitmap.createBitmap(v.getDrawingCache(true));
        v.setDrawingCacheEnabled(false);
        return b;
    }

    public static Bitmap takescreenshotOfRootView(View v) {
        return takescreenshot(v.getRootView());
    }
    public void storeScreenshot(Bitmap bitmap, String filename) {
        String path = Environment.getExternalStorageDirectory().toString() + "/" + filename + ".jpg";
        Log.e("path", path);
        OutputStream out = null;
        File imageFile = new File(path);

        try {
            out = new FileOutputStream(imageFile);
            // choose JPEG format
            bitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);
            out.flush();
        } catch (FileNotFoundException e) {
            Log.e("FileNotFoundException", e.getMessage());
            // manage exception ...
        } catch (IOException e) {
            Log.e("IOException", e.getMessage());
            // manage exception ...
        } finally {

            try {
                if (out != null) {
                    out.close();
                }

            } catch (Exception exc) {
            }

        }
    }
    /**
     * Class representing a StopWatch for measuring time.
     */
    public class StopWatch {
        private long startTime;
        private long endTime;
        private long elapsedTime;

        public StopWatch() {
            //empty
        }

        private void reset() {
            startTime = 0;
            endTime = 0;
            elapsedTime = 0;
        }

        public void start() {
            reset();
            startTime = System.nanoTime();
        }

        public void stop() {
            if (startTime != 0) {
                endTime = System.nanoTime();
                elapsedTime = endTime - startTime;
            } else {
                reset();
            }
        }

        public long getTotalTimeMillis() {
            return (elapsedTime != 0) ? TimeUnit.NANOSECONDS.toMillis(endTime - startTime) : 0;
        }
    }

    public static class LogPrinter {


        private static void logBefore(String className, String methodName, String lastClassMethod, int  tid ) {


            //hidden for UML
            printTo(ASPECT_LOG_PLANTUML_TYPE,   type2PrintTidForUml(tid) + lastClassMethod + umlWithColorBlock(tid) + "->" + type2PrintTidForUml(tid) + className + " : " + methodName  + "#" + tid );

        }

        public static void logBeforeArg(String className,  int  tid, String args) {
//            note right of Alice
//            Alice の<u:blue>右</u>側に
//                    <back:cadetblue>表示</back>するノート
//            end note
            if(args.isEmpty()) return;
            printTo(ASPECT_LOG_PLANTUML_TYPE,   "note right of " +  type2PrintTidForUml(tid) + className   + "\n " + args + "\n end note"  );

        }

        public static void logAfterResult(String className,  int  tid, Object result) {
//            note right of Alice
//            Alice の<u:blue>右</u>側に
//                    <back:cadetblue>表示</back>するノート
//            end note
            if(result == null) return;
            printTo(ASPECT_LOG_PLANTUML_TYPE,   "note right of " +  type2PrintTidForUml(tid) + className   + "\n result :" + result + "\n end note"  );

        }


        private static int getProcessColor(int tid) {
            if(!processColor.containsKey(tid)) {
                Random r = new Random();
                processColor.put(tid, r.nextInt(0xffffff + 1));
            }
            return processColor.get(tid);
        }

        private static String umlWithColor(int tid) {
            return String.format("#%06x", getProcessColor(tid));
        }

        private static String umlWithColorBlock(int tid) {
            return "[" + umlWithColor(tid) + "]";
        }

        private static void logAroundBefore(String className, int tid) {
            //hidden for UML
            printTo(ASPECT_LOG_PLANTUML_TYPE, ACTIVATE + type2PrintTidForUml(tid) + className + " " + umlWithColor(tid));

        }

        private static void logAroundAfter(String className, String methodName, List<String> depthText, long estimate, int  tid, Object result ) {
            String returnClassName = START;
            if(depthText.size() > 1) {
                returnClassName = depthText.get(depthText.size()-2);
            }
            //hidden for UML
//new but not goof   relation 420,423           printTo(ASPECT_LOG_PLANTUML_TYPE, "return " +type2PrintTidForUml(tid) + methodName + "  (" + estimate + "ms)"); //### weaveDebugTraceBefore:


            long nativeMax = Debug.getNativeHeapSize() / 1024;
            long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
            long nativeFree = Debug.getNativeHeapFreeSize() / 1024;

            printTo(ASPECT_LOG_PLANTUML_TYPE, type2PrintTidForUml(tid) + className + umlWithColorBlock(tid)
                    + "-->" + type2PrintTidForUml(tid) + returnClassName + " : " + methodName + "#" + tid  + "  (" + estimate + "ms," + nativeMax + "MB," + nativeAllocated + "MB," + nativeFree + "MB)"); //### weaveDebugTraceBefore:
            LogPrinter.logAfterResult(className,  tid,  result);
            //hidden for UML
            printTo(ASPECT_LOG_PLANTUML_TYPE, DEACTIVATE + type2PrintTidForUml(tid) + className + " " +  umlWithColor(tid) );

        }
    }

    public static class utils {
        public synchronized static String repeat(String string, int times) {
            StringBuilder out = new StringBuilder();

            while (times-- > 0) {
                out.append(string);
            }
            return out.toString();
        }


        private static String getOnlyClassName(String classname) {
            if (classname.indexOf("$") < 1) {
                return isEmptyName(classname);
            }
            String[] str = classname.split("\\\\$", 0);
            return isEmptyName(str[0]);
        }

        private static String getLastClassMethod(String lastClassMethod, List<String> dummyDepthText, int logType) {
            if(dummyDepthText.size() > 0) {
                return isEmptyName(dummyDepthText.get(dummyDepthText.size()-logType));
            }
            return lastClassMethod;
        }

        private static List<String> getdepthTexts(int tid) {
            if(!depthTexts.containsKey(tid)) {
                depthTexts.put(tid, new ArrayList<String>());
            }
            return depthTexts.get(tid);
        }

        private static int getdepthCounts(int tid) {
            if(!depthCounts.containsKey(tid)) {
                depthCounts.put(tid, 0);
            }
            return depthCounts.get(tid);
        }

        private static String isEmptyName(String methodName) {
            if (methodName.length() < 2) {
                return "NULL";
            }
            return methodName;
        }

        private static String getArgs(JoinPoint joinPoint, MethodSignature methodSignature) {
            Object[] objArray = joinPoint.getArgs();
            String[] sigParamNames = methodSignature.getParameterNames();
            int i = 0;
            String argName = "";
            StringBuilder argAll = new StringBuilder();
            for (Object obj : objArray) {
                if (obj == null) continue;
                argName = sigParamNames[i];
                i++;
                argAll.append(argName + ":[" + obj.toString() + "] , ");
            }

            if (argAll.length() > 1) {
                argAll.insert(0, "args  ");
            }
            return argAll.toString();
        }
    }



    public static void printTo(String category, String message) {
        if (!category.equals(ASPECT_LOG_PLANTUML_TYPE)) return;
        Log.d(category, message );
        //--to db


        if(logBufferCount < logBufferStoreCountLimit) {
            logBufferCount++;
            logBufferMessages += message + "\\n";
            return;
        }
        try {
            if (OptimalAgentApplication.getInstance() == null) {
                return;
            }
        }catch (Exception e) {
            return;
        }

        if (OptimalAgentApplication.TestLogController.logHelper != null) {
            OptimalAgentApplication.TestLogController.insert(category + " // " + message);
        }

        logBufferCount = 1;
        logBufferMessages = "";
    }



}

2018년 11월 11일 일요일

powershell 에서 문자열 찾기

(get-content "C:\w\test.txt - 리스트파일") | foreach-object { get-childitem 폴더 -recurse -include *.* | select-string -pattern "$_"; echo "WORD : $_"; } > result.txt

파일에서 매치되는 것만 모아서 카운트세기
(get-content "C:\w\test3000.txt") | foreach-object { $mesure = (get-childitem JP-Subtitles -recurse -include *.* | select-string -pattern "$_" -AllMatches);  $mesureCount=$mesure.Matches.Count; echo "WORD : $_  ${mesureCount}"; }  > result3000.txt

2018년 10월 16일 화요일

JAVA ENUM 안으로 swith 문 넣기

public enum test7 {
   TRUE {
      @Override      public String getRtext() {
         return cnt.getString(R.string.on);
      }
   },
   FALSE {
      @Override      public String getRtext() {
         return cnt.getString(R.string.off);
      }
   };

   public Context getCnt() {
      return cnt;
   }

   public Context cnt;

   public test7 getS(Context c, boolean b) {
   
      return b ? TRUE : FALSE;
   }

   abstract String getRtext();
}

return test7.TRUE.getS(cnt, myTrue == GET_LOCATION_OFF).getRtext();

--
public class MainEnum {
    public enum Rstring {
   
    LOCATION_ON(getRstring(R.string.location_measure_on)),
LOCATION_OFF(getRstring(R.string.location_measure_off))
        public Rstring getZoneName(boolean b) {
            return b ? ZONE_UNDETECTABLE : ZONE_OUTSIDE;
        }

        public Rstring getLocation(boolean b) {
            return b ? LOCATION_ON : LOCATION_OFF;
        }

        public Rstring getRequireStopTitle(boolean b) {
            return b ? REQUIRE_STOP_TITLE : REQUIRE_STOP_TITLE_FOR_DEVICE_OWNER;
        }

        public Rstring getRequireStopMessage(boolean b) {
            return b ? REQUIRE_STOP_MESSAGE : REQUIRE_STOP_MESSAGE_FOR_DEVICE_OWNER;
        }


        private String rString;

        Rstring() {
        }

        Rstring(String rstring) {
            this.rString = rstring;
        }

        public String rText() {
            return rString;
        }

    }
    private static Context cnt;
    private static String getRstring(int resourceId,Object... formatArgs){
        if (formatArgs != null && formatArgs.length > 0) {
            return cnt.getString(resourceId, formatArgs);
        }
        return cnt.getString(resourceId);
    }
    public static void setContext(Context argcnt) {
        cnt = argcnt;
    }
}

2018년 10월 2일 화요일

Android Testing Support Library (ATSL)

http://greatgift.tistory.com/42?category=724664

2018년 10월 1일 월요일

Opencv 선검출

http://blog.naver.com/PostView.nhn?blogId=cjsal95&logNo=220937898261&parentCategoryNo=&categoryNo=22&viewDate=&isShowPopularPosts=true&from=search

Opencv 필터 참고

http://blog.naver.com/PostView.nhn?blogId=cjsal95&logNo=220915040360&parentCategoryNo=&categoryNo=22&viewDate=&isShowPopularPosts=true&from=search


[OpenCV] 자주쓰는 기능들 모음

http://kimhj8574.egloos.com/4734597

2018년 9월 27일 목요일

android opencv 테스트 환경



http://webnautes.tistory.com/1054
http://wrongwrong163377.hatenablog.com/entry/2017/07/02/034003
http://wrongwrong163377.hatenablog.com/entry/2017/07/01/204124


    defaultConfig {

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
                abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }



    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

2018년 9월 18일 화요일

android 디버깅 크롬에서

http://gun0912.tistory.com/69?category=560271
https://qiita.com/shikato/items/50e23e64aacbeb49c172

2018년 9월 11일 화요일

How to use image preprocessing to improve the accuracy of Tesseract

https://medium.freecodecamp.org/getting-started-with-tesseract-part-ii-f7f9a0899b3f

Kotlin 코딩팁

http://rockdrumy.tistory.com/1378?category=772380

2018년 9월 9일 일요일

Out of memory error: Java heap memory on Android Studio

OpencvLibrary342 를 빌드하려 하니.메모리 .에러가...

Run/Debug Configurations  에서

Default->Gradle->Configuration->VM options-Xmx2048m -XX:MaxPermSize=512m

추가하면 됨.

나 같은 경우에는
안드로이드 스튜디오 터미널 에서
jps -lvm 해보니 용량이 512m 로 정해져있어서

환경변수에
_JAVA_OPTIONS , -Xms512m -Xmx512m 로 되어있어서

-Xms1G -Xmx2G 로 변경해서됨

2018년 9월 6일 목요일

Android Studio OpenCV + Tesseract OCR 어플 만들기

https://bluebead38.blogspot.com/2017/06/android-studio-opencv-tessseract-ocr.html


http://cofs.tistory.com/175

https://m.blog.naver.com/cosmosjs/220937785735


https://www.thecodecity.com/2016/09/creating-ocr-android-app-using-tesseract.html


https://www.codeproject.com/Articles/840623/Android-Character-Recognition

2018년 8월 26일 일요일

Android 샘플 일본어

http://www110.kir.jp

2018년 8월 11일 토요일

装う와 盛る차이점

盛る:
밥 등을 가득 담다.
装う:
 원래의 의미로는 꾸미다(꾸밀 장) 이지만, 음식을 그릇에 잘 정리해서 담는다는 고상한 의미로 밥,국물을 그릇에 담다 라는 표현으로 쓰이게 되었다.


참고.
https://www.nhk.or.jp/bunken/summary/kotoba/term/070.html

特徴的なこととして、北海道と東北は「ご飯を盛る」、関西では「ご飯をよそう」、九州では「ご飯をつぐ」が優勢なことが挙げられます。

2018년 8월 10일 금요일

Kotlin generic function sample


import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    companion object {
        val PERMISSIONS_REQUEST_READ_CONTACTS = 100    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button1.setOnClickListener {            startActivity { ProviderContactContract::class.java }        }
        button2.setOnClickListener {            startActivity { ProviderMediaStore::class.java }        }
    }

    private fun <T : Any?> startActivity(clazz: () -> Class<T>) {
        val intent = Intent(this, clazz())
        startActivity(intent)
    }
}

2018년 7월 20일 금요일

2018년 7월 18일 수요일

안드로이드 스튜디오 유용한 플러그인

https://blogdeveloperspot.blogspot.com/2017/12/android-studio.html

1.CodeGlance
이 플러그인을 설치하면 우측에 코드 미니맵이 생성되어 코드를 더욱 편하게 볼 수 있게 해준다.

2.Parcelable code generator
귀찮은 parcelable 코드를 자동으로 생성해주어 생산성을 높여준다.

3.Presntation Assistant
어떤 기능을 사용 할 때 단축키를 시각적으로 보여준다.
key promoter라는 비슷한 플러그인이 있는데 클릭한 위치에서 오랜시간(?) 단축키를 알려주지만 개발에 방해가돼 개인적으로 깔끔한 이 플러그인을 선호한다.

4.ADB idea
자주 사용하는 몇몇 ADB 커맨드를 클릭으로 사용할 수 있게 해준다.

5.Android Drawable Impoter
drawable 리소스를 한사이즈만 제작하면 자동으로 여러 해상도 사이즈에 맞게 추가해준다.

안드로이드 스튜디오 단축키

http://www.androidside.com/bbs/board.php?bo_table=B56&wr_id=26482

핵심단축키

http://coolmsd.tistory.com/122

http://link2me.tistory.com/1214

http://corej21.tistory.com/63

http://yonoo88.tistory.com/887

https://hhd2002.blogspot.com/2017/06/170609-android-studio-for-windows.html

Gradle 알기

gradle 로 java 빌드 해보기 일본 사이트
https://qiita.com/tatesuke/items/6e30dc8891d0857f240e

2018년 7월 17일 화요일

android studio 레이아웃 에디터에서 빨간버튼뜨는거 해결

https://stackoverflow.com/questions/44449275/failed-to-load-appcompat-actionbar-with-unknown-error-in-android-studio

2018년 7월 16일 월요일

개발자를 위한 레시피-안드로이드

http://recipes4dev.tistory.com/category/ANDROID%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

튜토리얼 많은 곳

https://www.tutlane.com/

2018년 7월 9일 월요일

android MVVM 만들기 1-7

http://susemi99.kr/4644

2018년 7월 8일 일요일

java, c++ 책처럼 정리 잘되어 있는곳

http://tcpschool.com/cpp/cpp_algorithm_functor

2018년 7월 7일 토요일

예외처리 checked Exception, unchecked Exception

http://www.nextree.co.kr/p3239/

2018년 7월 5일 목요일

javascript - Abstract Factory 예제

var NpcFactory = (function(){
    var npcList = [];
    return {
        addType : function(npcElement) {
            if (npcList.indexOf(npcElement) > -1) {
                console.log("duplicated");
                return;
            }
            npcList.push(npcElement);
        },
        createNpc : function(npcElement, options) {
            var Npc = npcList[npcList.indexOf(npcElement)];
            return (Npc ? new Npc.npcElement(options) : null)
        }
    }
})();

var enermyMagician = (function(){
   function enermyMagician(options){
       this.name = options.name;
   }
   enermyMagician.prototype.attack = function(target) {
        console.log("big macic");
    }
   
   return enermyMagician;

})();

var enermySword = (function(){
   function enermySword(options){
       this.name = options.name;
   }
   enermySword.prototype.attack = function(target) {
        console.log("swing");
    }
   return enermySword;

})();

const npcOfMagician = {
    npcType : 'magician',
    npcElement : enermyMagician
};
const npcOfSword = {
    npcType : 'sword',
    npcElement : enermySword
};

NpcFactory.addType(npcOfMagician);
NpcFactory.addType(npcOfSword);
var magic1 = NpcFactory.createNpc(npcOfMagician, { name: 'magic_1' });
var magic2 = NpcFactory.createNpc(npcOfMagician, { name: 'magic_2' });
var sword1 = NpcFactory.createNpc(npcOfSword, { name: 'sword_1' });

console.log(magic1.attack());
console.log(magic2.name);

2018년 7월 4일 수요일

코틀린 강좌 모음

일단 시작하는 코틀린
https://www.slideshare.net/parkjoongsoo1/ss-58654366

실무자가 자주 사용하는 코틀린 문법
http://i5on9i.blogspot.com/2015/07/blog-post_5.html

새차원의 코틀린 강좌
https://www.slideshare.net/ssuser70d5d01/kotlin-1-why-kotlin


http://blog.dskim.xyz/kotlin/2017/07/22/kotlin-02.html


http://wonwoo.ml/index.php/post/1505

[깡샘의 코틀린 프로그래밍]
https://github.com/kkangseongyun/kkangs_kotlin

코틀린 한글판
http://javacan.tistory.com/entry/Korea-Kotlin-Ref-Doc

코틀린 연습장등.
http://sunnybong.tistory.com/166?category=770381

Deep Learning 소개 - 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.

https://www.slideshare.net/yongho/ss-79607172

2018년 7월 2일 월요일

javascript 은닉화 기본 -

browserStore = function()
{
        var self = {};

        self.set = function(key, value)
        {
           console.log(`key:${key} value:${value}`)
        }
        
        self.get = function()
        {
           console.log(`return key value`)
        }
        return self;
}
     
var test = new browserStore();
test.set('key', 'value');
test.get('key', 'value');

browserStore.set('key', 'value'); // exception browserStore.set is not a function
browserStore.get(); // exception browserStore.set is not a function

Javascript 반복 if 를 Curring 으로 깔끔하게.

var apiName = 'Activity';
var askedFields = 'heheh KIM fdsfas BABO AHO';

//before curring
var getRelationName = false;
if(apiName === 'Activity' && askedFields.indexOf('KIM') > -1)
{
    activityGetRelationName = true;
}
var getIndividualRelationName = false;
if(apiName === 'Activity' && askedFields.indexOf('TAEHO') > -1)
{
   getIndividualRelationName = true;
}
//add condition for 1 year after
var getIndividualRelationWarukuti = false;
if(apiName === 'Activity' && askedFields.indexOf('BABO') > -1)
{
    getIndividualRelationWarukuti = true;
}

console.log(`activityGetRelationName:${getRelationName}`);
console.log(`activityGetIndividualRelationName:${getIndividualRelationName}`);
console.log(`activityGetIndividualRelationWarukuti:${getIndividualRelationWarukuti}`);

//change curring
function curringOut(argApiName) 
{
    var apiName = argApiName;
    return function(condition) 
    {
         if(!condition) return false;
         return apiName && condition;
    }
}

function findWord(word) 
{
    return askedFields.indexOf(word) > -1;
}

var isAskedFiled = curringOut(apiName);
var getRelationName2 = isAskedFiled(findWord('KIM'));
var getIndividualRelationName2 = isAskedFiled(findWord('TAEHO'));
var getIndividualRelationWarukuti2 = isAskedFiled(findWord('BABO'));


console.log(`getRelationName2:${getRelationName2}`);
console.log(`getIndividualRelationName2:${getIndividualRelationName2}`);


console.log(`getIndividualRelationWarukuti2:${getIndividualRelationWarukuti2}`);

2018년 7월 1일 일요일

c# 디자인 패턴

http://ehpub.co.kr/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%84%A4%EA%B3%84-c-1%EB%B6%80-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4%EB%93%A4/

2018년 6월 22일 금요일

PHP diagram 툴

http://dasunhegoda.com/class-diagram-from-php-code-using-phuml/867/

2018년 6월 21일 목요일

JQUERY 필요없어요.

http://blog.jeonghwan.net/2018/01/25/before-jquery.html

javascript test tool - jasmine + karma + vscode + chrome debugging

일단 이곳을 참고한다.

http://blog.mlewandowski.com/Debugging-Karma-tests-with-VSCode.html

보기어렵다...

요약한다.
0.node설치한다.
1. VSCODE를 설치한다.
2.debugger-for-chrome extension 를 설치한다. 당근 비쥬얼코드에서..Extension 으로..
3.노드 글로벌 모듈로 요맨,카르마 생성기? 설치한다.0에서 노드가 설치되어있으므로 엔피엠 명령어가 가능.
npm install -g yo generator-karma
4.아무폴더나 만든다. (sipal)
5.sipal 폴더로 가서,
yo karma --browsers "Chrome" --app-files "src/**/*.js" --test-files "test/**/*.js" --base-path ".."
실행한다. 그러면 sipal/test/karma.conf.js 파일이 생긴다. 카르마 제네레이터를 설치했으니 가능한 명령이다.
6.visual studio code 에서 열기위해
sipal 폴더에서
code . test/karma.conf.js
실행한다.
7.이것저것 써있는 설정값들이 보이는데, 아무데나

  customLaunchers: {
    ChromeDebugging: {
      base: 'Chrome',
      flags: [ '--remote-debugging-port=9333' ]
    }
  },

를 추가하고나서 browsers라고 되어있는 설정값부분을 아래처럼 바꿔준다.


    browsers: [
      'ChromeDebugging'
    ],

8. 그리고 vscode에서 F1을 눌러서 코딱지만한 창에

Debug: Open launch.json

을 입력하면, 그냥  .vscode/launch.json 가 생성되는 경우가있고.
때때로, Chrome, Node,....등 환경을 선택하라고 한다. 아무거나 상관없다.
어차피 다른 내용으로 덮어씌울꺼니까.

자동으로 .vscode/launch.json 파일이 에디터에서 열린다.
그내용을 모두 지우고,


{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "attach",
      "name": "Attach Karma Chrome",
      "address": "localhost",
      "port": 9333,
      "pathMapping": {
        "/": "${workspaceRoot}",
        "/base/": "${workspaceRoot}/"
      }
    }
  ]
}

로 덮어씌우고 저장한다.


9.테스트팅을 위해서

sipal/src/myFunction.js
파일을 만들고

window.myFunction = function( e ) {
  if ( e >= 10 ) {
    return true;
  } else {
    return false;
  }
}

내용으로 저장한다.

또.

sipal/test/example.js
만들고

describe( "A suite is just a function", function() {
  it( "and so is a spec", function() {
    let res = myFunction( 15 );

    expect( res ).toBe( true );
  } );
} );

내용으로 저장한다.

10.npm test 를 실행한다.
나의 경우는
C:\jasmin\sipal>npm test

11. 디버깅하자.

vscode 에서 해충방지 모양의 버튼을 누르면
Attach Karma Chrome
를 실행한다.
그리고 여기저기 브레이크 포인트를 걸고, 크롬에서 새로고침 해보면 된다.

--------------------------
참 더럽게 복잡하네...ㅆㅂ

2018년 6월 15일 금요일

Reactjs UI 라이브러리10

https://www.vobour.com/%EB%B2%A0%EC%8A%A4%ED%8A%B8-10-%EB%A6%AC%EC%95%A1%ED%8A%B8-ui-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-10-best-react-ui-lib

구글의 자바스크립트 스타일가이드

https://www.vobour.com/%EA%B5%AC%EA%B8%80%EC%9D%80-%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%83%80%EC%9D%BC-%EA%B0%80%EC%9D%B4%EB%93%9C%EB%A5%BC-%EB%B0%9C%ED%96%89-%ED%95%A9%EB%8B%88%EB%8B%A4-%EB%8B%A4%EC%9D%8C%EC%9D%80-%EB%AA%87-%EA%B0%80%EC%A7%80-%ED%95%B5%EC%8B%AC

웹사이트가 어떤 기술과 프레임워크 쓰는지 파악해주는 툴..와우

Wappalyzer — 웹 사이트에서 사용되는 기술을 보는 데 유용하다. 웹 사이트가 어떤 종류의 프레임워크를 사용하고 있는지, 어떤 서비스를 사용하고 있는지 궁금하다면 이 도구만한게 없다.

크롬 확장프로그램

함수형 setState가 reactjs 의 미래래요

https://www.vobour.com/%ED%95%A8%EC%88%98%ED%98%95-setstate%EA%B0%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-react-%EC%9D%98-%EB%AF%B8%EB%9E%98%EC%9D%B4%EB%8B%A4-functiona

chrome inspector 숨은 기능들

https://www.vobour.com/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EB%AA%A8%EB%A5%BC-%EC%88%98%EB%8F%84-%EC%9E%88%EB%8A%94-%ED%81%AC%EB%A1%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%BD%98%EC%86%94-%EA%B8%B0%EB%8A%A5%EB%93%A4-things-you-p


1.
$$(‘tagName’) 또는 $$(‘.class’) 를 사용 할 수도 있는데, 이것은 셀렉터에서 매치되는 모든  DOM 엘리먼트들을 선택한다. 달러싸인이 두개인것을 눈여겨보자. 이렇게 선택된 배열에서 특정 포지션에 있는 엘리먼트를 선택 할수도 있다. 


2.
document.body.contentEditable=true 하면 브라우져 에서 그냥 수정되어

3.
getEventListeners($(‘firstName’)).click[0].listener  걸린 이벤트 찾기

4.
이벤트모니터
monitorEvents(window, 'click');
monitorEvents(window, 'message');

5.
코드 블록 실행 시간 확인
console.time('myLabel');
console.timeEnd('myLabel');

6.
밸류를 테이블로 이쁘게
console.table(variableName)

7.
검사기 명령어
$0, $1, $2,

8.
해당 아이디,또는 클래스,이름이 있는 모든목록표기
dir($(‘selector’))
inspect($(‘selector’))

2018년 6월 11일 월요일

fibonnacci

/**
 * Fibonacci Sequence
 * <pre>
 * <b>History:</b>
 *    2018.06.11, 0.1, KIM TAE HO
 * </pre>
 *
 * @author  KIM TAE HO
 * @version 0.1, 2018.06.11
 * @see    None
 */
import java.util.HashMap;
import java.util.Map;
import java.math.BigInteger;

public class Fibonacci {

    private static Map<Integer, BigInteger> cacheOfSum = new HashMap<>();
public static void main(String[] args)
{

int needNumber = 8181;

cacheOfSum.put(0, BigInteger.ZERO);
cacheOfSum.put(1, BigInteger.ONE);

        System.out.println(getFibonacci(needNumber));

}

    /**
     * (Fibonacci Logic)
     * @param sequenceNumber Atom of fibonacci more then 0   
     * @return  Sum Number with preview Number
     */

private static BigInteger getFibonacci(int sequenceNumber)
{
    if (cacheOfSum.containsKey(sequenceNumber))
    {
        return cacheOfSum.get(sequenceNumber);
    }
   
        return recursiveCachedSum(sequenceNumber);
}

    /**
     * Cached Value Of specipied serquence Number that fibonacci
     * @param sequenceNumber of using memoization
     * @return  Sum Number with preview Number
     */
private static BigInteger recursiveCachedSum(int sequenceNumber)
{
   
    BigInteger calcSum = getFibonacci(sequenceNumber - 2).add(getFibonacci(sequenceNumber - 1));
    cacheOfSum.put(sequenceNumber, calcSum);
   
    return calcSum;
}
}


2018년 6월 9일 토요일

개발자 커뮤니티 c#자료등

http://www.sky.ph/

레거시 PHP에서 모던 PHP로 – 뷰 분리하기

https://www.haruair.com/blog/3748

C# 자료있는곳

http://csharp.net-informations.com/

2018년 5월 26일 토요일

만화볼떄 음성으로 누가 말해주면 좋겠지?

만화볼떄 음성으로 누가 말해주면 좋겠지?
근데 누가 말해줘?ㅋㅋ

xamarin-forms-drag-image-between-views

https://stackoverflow.com/questions/49515451/xamarin-forms-drag-image-between-views

2018년 5월 22일 화요일

Mysql 프로시져 만들어서 대량 인서트 한방에

delimiter //
 create procedure loop_insert_resume0(in x int)
 begin
   declare max_id int;
   declare i int;
   set i = 0;
   select max(id) into max_id from  `TABLE`;
   while i < x do
     set i = i + 1;
     insert into `TABLE`  (`FIELD1`, `FIELD2`, `id`)
  select `FIELD1`, `FIELD2`, (max_id+i)  from  `TABLE` where  `resume_id` = max_id;
   end while;
 end
//

call loop_insert_resume0(50000);

2018년 5월 20일 일요일

C# XAML을 사용한 DockBar구현 맥킨토시 아이콘효과

http://wpfkorea.tistory.com/71?category=166735

2018년 5월 16일 수요일

C# how-to-know-when-was-windows-started-or-shutdown


https://stackoverflow.com/questions/33186601/how-to-detect-windows-shutdown-in-a-winforms-app
https://stackoverflow.com/questions/7407286/how-to-know-when-was-windows-started-or-shutdown

2018년 5월 13일 일요일

C# 타이머

https://social.technet.microsoft.com/wiki/contents/articles/37252.c-timer-schedule-a-task.aspx

C# 데이터바인딩 기초부터 확실하게 익히기

https://m.blog.naver.com/areema/60189364049

C# 아이템소스와 아이템 템플릿으로 리스트 목록 바인딩??

https://reflectionit.nl/blog/2015/windows-xaml-tips-resourcedictionary-with-codebehind

C# 여러개의 아이템 데이터 소스 적용하기

https://code.msdn.microsoft.com/windowsdesktop/Combining-item-sources-in-65408473

C# 기초부터 .. 10년전자료부터 다시 천천히 읽을..시간이없다...

https://m.blog.naver.com/lse805/50034432858

2018년 5월 9일 수요일

1000 개의 C, C++, PHP,Python,ruby,C#,iot 예제 모두 1000개씩..인터뷰.MCQ 까지

https://www.sanfoundry.com/

C# 그래픽 마스크


https://stackoverflow.com/questions/3654220/alpha-masking-in-c-sharp-system-drawing
https://www.codeproject.com/Articles/33999/Masking-Multiplication-of-Two-images-using-C

2018년 5월 8일 화요일

C# 코딩컨벤션

http://blog.naver.com/PostView.nhn?blogId=vactorman&logNo=221190520002&categoryNo=12&parentCategoryNo=12&viewDate=&currentPage=1&postListTopCurrentPage=&from=postList&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=1

꼭지켜

C# 인스턴스를 만드는 몇가지 방법이라능.

http://blog.naver.com/PostList.nhn?blogId=vactorman&from=postList&categoryNo=12&parentCategoryNo=12

유용

c# MVVM 패턴 이해 쉽게 설명

http://blog.naver.com/PostView.nhn?blogId=vactorman&logNo=221013790924&parentCategoryNo=&categoryNo=12&viewDate=&isShowPopularPosts=true&from=search

2018년 5월 7일 월요일

MYSQL 행복제..귀찮...

https://stackoverflow.com/questions/11331573/mysql-copy-row-but-with-new-id/11331672
템포 테이블만들고, 키삭제하고 그걸다시 넣고, 다시 삭제하고...귀찮..
CREATE TEMPORARY TABLE tmp SELECT * from my_table WHERE ...;
ALTER TABLE tmp drop pk_id; # drop autoincrement field
# UPDATE tmp SET ...; # just needed to change other unique keys
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
DROP TEMPORARY TABLE tmp;


머신러닝에 파이썬을 즐겨쓰는 4가지 이유

머신러닝에 파이썬을 즐겨쓰는 4가지 이유 원문보기: http://www.ciokorea.com/news/38148#csidx588d97e03ad139d8801a2ca09a6265e

2018년 5월 6일 일요일

C# 버튼 디자인팁

http://tinytipsforprogramming.tistory.com/1

C# Observable Collection을 이용한 바인딩 샘플

http://hackss.tistory.com/entry/wpf-Observable-Collection%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B0%94%EC%9D%B8%EB%94%A9-%EC%83%98%ED%94%8C

2018년 5월 5일 토요일

Cocos2dx 실전 알찬 정보가 많은 사이트

https://blog.naver.com/njh0602

C# 주석방법

http://blog.naver.com/PostView.nhn?blogId=dolmoon&logNo=60051345347

http://hyghyk.egloos.com/153572

c# story animation 귀찮...

https://www.youtube.com/watch?v=b9G7uxhAzt0

2018년 5월 4일 금요일

C# TryGet 으로 Dictionary 값이 없을때 대응

a.TryGet(2,out r)? r:"not found"
트라이 캐치 보다 편함

C# Switch 에 Goto 사용해서 여러분기 처리하기

이런게 가능하다.
지옥의 고투가 나타났다.
switch

  case 0:
     goto end1;

  end1:
    break;



썅..고투

C# 배열을 다루는 간단한 방법 Tip


int[] ar = { 1,2,3}

배열을 축소(특정 값만 있는 배열을 빼고 다시 만들기)
ar = ar.Where(c => c != 2).ToArray();
foreach...

배열을 확대
ar = ar.Concat(new int[] {4}).ToArray();



배열에 중간 요소 삽입
ar = ar.Take(1).Concat(new int[] {2}).Concat(ar.Skip(1)).ToArray();  <-- 머이런 언어가..ㅋ 제이쿼리냐

C# Winform listBox 선택된 아이템 간단히 얻기

 this.textBox1.Text = (string)listBox1.SelectedItem ?? "not Selected";
string 은 오브젝트로 바꿔도됨.

C# Enum range takewhile 사용예

foreach(var n in Enumerable.Range(1, int.MaxValue).TakeWhile((c) => sum <= 100))
            {
                sum += n;
            }

2018년 5월 2일 수요일

C# 키움 Open API 계좌 별 주식 종목 확인하기

http://aiden1004.tistory.com/entry/C-%ED%82%A4%EC%9B%80-Open-API-%EA%B3%84%EC%A2%8C-%EB%B3%84-%EC%A3%BC%EC%8B%9D-%EC%A2%85%EB%AA%A9-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0

2018년 4월 30일 월요일

C# free-hand-image-cropping-in-c-sharp

https://stackoverflow.com/questions/8257497/free-hand-image-cropping-in-c-sharp

C# Sticky 는 이거참고

https://code.msdn.microsoft.com/windowsdesktop/Sticky-Notes-Demo-64681629

http://www.dotnetspark.com/kb/1830-create-sticky-notes-wpf-application-part.aspx

XAML Resources 파일로 지정

https://medium.com/@Rando209/wpf-resources-b77ae1aecdea

WPF 튜토리얼 사이트 - 그냥 진리임

http://wpftutorial.net

진리임. 항상보도록

C# mdf 테이블 필드명 바뀌지 않을때. 썅

http://dustyreagan.com/how-to-rename-table-or-column-using-t/

미친 마소

2018년 4월 26일 목요일

Javascript 패턴 자료 등 개발 자료 참고할게 많은

http://regularmotion.kr/category/javascript/page/5/

javascript 간단한 switch 문은 객체사전으로 변경

http://regularmotion.kr/javascript-%EA%B0%9D%EC%B2%B4-%EC%82%AC%EC%A0%84-%EC%82%AC%EC%9A%A9%EB%B2%95/

프로그레시브 웹앱

https://www.slideshare.net/GihyoJoshuaJang/the-future-of-web-progressive-web-app

https://www.slideshare.net/wonchoel/pwa-73203598

javascript promise 이해

https://joshua1988.github.io/web-development/javascript/promise-for-beginners/#promise%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94

JAVASCRIPT 효율적인 방법 3가지, 이벤트위임-클로저-디바운싱

https://joshua1988.github.io/web-development/javascript/javascript-interview-3questions/

이벤트리스너-클로저-디바운싱

DOCKER 정리 깔끔

http://kimstar.kr/7695/
갠적으로 깔끔한 이런 스탈 좋음

AWS 깔끔해

http://kimstar.kr/7709/

Visual Studio C++ 디버그 모드 실행 빠르게

https://jacking75.github.io/VS_cpp_fast_debug_run/


https://jacking75.github.io/VS_Faster_Cpp_solution_load_and_build_performance_VS2017/

C# 게임서버 만들자

http://lacti.me/2013/06/07/csharp-game-server/

http://lacti.me/2014/06/30/why-implements-csharp-server/

새삼스럽게 JAVASCRIPT 디자인패턴

https://joshua1988.github.io/web-development/javascript/javascript-pattern-design/

CSS HTML JAVASCRIPT 기타 언어 샘플코드 잇빠이

http://devdocs.io/

PHP 성능 관련 주의할것

http://mungmange.tistory.com/53

2018년 4월 25일 수요일

MVVP 패턴 다시한번 기억

https://magi82.github.io/android-mvc-mvp-mvvm/

C# 디자인패턴 설명 상세!!

http://ehclub.co.kr/1366?category=656807

C# 기초 실무 사용방식

http://ehclub.co.kr/category/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EA%B8%B0%EC%88%A0/WPF

2018년 4월 24일 화요일

jquery-performance-tuning

http://rohitrox.github.io/2013/05/23/jquery-performance-tuning/

Jquery Performance Tips: Slice, Filter, Parentsuntil

https://www.endpoint.com/blog/2013/02/04/jquery-performance-tips-slice-filter

C# WPF dynamic load xaml -레이아웃 동적로드

https://stackoverflow.com/questions/910814/loading-xaml-at-runtime

2018년 4월 23일 월요일

자바스크립트 성능개선 참고



High Performance JavaScript 2011 from Nicholas Zakas
https://www.slideshare.net/nzakas/high-performance-javascript-2011
자바 스크립트 속도 개선.

1.필요한 시점에 동적으로 파일을 로딩한다. 으잉 ? 진짜로 ?
만일 바로 태그에 넣으면 로딩되는 시간까지 렌더링이 기다리지만
아래처럼하면, 일단 html 표시됨,.
77 페이지 참고.
<script>
var script = document.createElement("script"),body;
script.type="text/javascrpit"
scrpit.src= "foo.js"
body.insertBefore(script,body.firstChild)
</script>

2.defer 를 사용하면 일단 다운로드 하고 UI 업데이트 될때 실행함.
<script defer src="ff.js">>

3.for 문에서 append 쓰는 reflow 가 발생.
-detach, display, decumentFragment 를 사용해

4.style 을 각각주면 repaint 가 발생
모아서 한번에 줄수 있또록.



성능 덕후를 위한 javascript 패턴
https://joshuajangblog.wordpress.com/2016/11/21/javascript-coding-pattern-for-junior-web-developer/

c# google login example

https://stackoverflow.com/questions/48321034/wpf-application-authentication-with-google

구글 api 연동

https://github.com/google/google-api-dotnet-client-samples

page speed api 도 있음

애니메이션 노래 정보 데이터 베이스

http://anison.info/

이런저런 예제가...https://www.dotnetperls.com/

https://www.dotnetperls.com/
대충만든거 같지만 기초예제가 있으니..ㅋ

2018년 4월 22일 일요일

Elasticsearch QUERY DSL 살세설명

http://jjeong.tistory.com/816 참고가됨

WPF 에 대해 기초설명 상세함

http://ryuschool.tistory.com/entry/WPF-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%A2%8C-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-2-%EA%B9%80%EC%B0%BD%EB%AF%BC?category=113503

UI/UX 좋은 게시물

http://ryuschool.tistory.com/entry/UX-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B2%BD%ED%97%98-User-Experience?category=113503

Xamarin Sound Recorder 자마린 사운드 레코더

https://github.com/NateRickard/Plugin.AudioRecorder

C# Spy++ 사용해서 adobe pdf 모듈 삽입후 제어하기

http://blog.naver.com/PostList.nhn?blogId=goldrushing&from=postList&categoryNo=10

C# 커서바꾸기

http://outshine90.tistory.com/entry/%EC%BB%A4%EC%84%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0?category=549444

C# const VS readony 차이점

const 는 초기에 반드시 값을 지정해야 한다. 즉 컴파일시에 값지정해야한다.
readonly 는 초기에 값을 지정안하고, 실행시 첫번에 한해 값을 지정할수도있다.

즉, 실행하기 전에는 값이없다가, 어떤 조건에 의해 초기값이 정해질 필요가 있는 읽기 전용 값을 지정할때 유용하다.

사용자 아이피나 실행시의 사용자 환경값 등은 사용자에 따라 다르지만, 실행한후에는 거의 고정되기 때문에 readonly 로 하는게 좋다.
때로는 서버에서 한번 읽어들인 값을 사용하자가 변하지 못하게하는 용도, 토큰이라든지,세션이라든지 UID등에 유용하다.

2018년 4월 19일 목요일

logstash 아파치 apache 설정

http://hhjeong.tistory.com/109

설정파일 : logstash-apache.config

input {
     file {
         path => "C:\Bitnami\elk-6.2.3-0\apache2\logs\access.log"
         start_position => beginning
     }
 }
   
 filter {
   if [path] =~ "access" {
    mutate { replace => { type => "apache_access" } }
    grok {
      match => { "message" => "%{COMMONAPACHELOG}" }
    }
    date {
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
      locale => en
    }
    useragent {
      source => "agent"
      target => "useragent"
    }
  } else if [path] =~ "error" {
    mutate { replace => { type => "apache_error" } }
  } else {
    mutate { replace => { type => "random_logs" } }
  }

 }

 output {
     elasticsearch {
         hosts => [ "127.0.0.1:9200" ]
     } 
     stdout { codec => rubydebug }
 }


출처: http://hhjeong.tistory.com/109 [후니의 개발일지]

ElasticSearch Head Plugin window 에서 설치 실행

참고
https://qiita.com/tobesan/items/847d864d7eff0b76d7db

요약
  1. コマンドプロンプトに git clone https://github.com/mobz/elasticsearch-head.git と入力し、elasticsearch-headフォルダをダウンロード
    参考資料にはgit://github.com/mobz/elasticsearch-head.gitと記載があるが、エラーが起きる場合は上記を使用。
  2. elasticsearch-headのフォルダに入る cd elasticsearch-head
  3. インストール npm install
  4. 動かす npm run start
단 , 엘라스틱 설정에서 

http.port : 9200
http.cors.enabled : true
http.cors.allow-origin : /http://localhost(:[0-9]+)?/

를 추가하는센스