https://medium.com/@xabaras/android-webview-handling-geolocation-permission-request-cc482f3de210
2018년 12월 19일 수요일
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일 토요일
resources-getting-started-android-development/
By schoolhompy at 12월 15, 2018
No comments
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
By schoolhompy at 11월 29, 2018
No comments
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 = "";
}
}
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 에서 문자열 찾기
By schoolhompy at 11월 11, 2018
No comments
(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
파일에서 매치되는 것만 모아서 카운트세기
(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 문 넣기
By schoolhompy at 10월 16, 2018
No comments
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_OFF(getRstring(R.string.location_measure_off))LOCATION_ON(getRstring(R.string.location_measure_on)),
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일 화요일
2018년 10월 1일 월요일
Opencv 선검출
By schoolhompy at 10월 01, 2018
No comments
http://blog.naver.com/PostView.nhn?blogId=cjsal95&logNo=220937898261&parentCategoryNo=&categoryNo=22&viewDate=&isShowPopularPosts=true&from=search
Opencv 필터 참고
By schoolhompy at 10월 01, 2018
No comments
http://blog.naver.com/PostView.nhn?blogId=cjsal95&logNo=220915040360&parentCategoryNo=&categoryNo=22&viewDate=&isShowPopularPosts=true&from=search
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
https://qiita.com/shikato/items/50e23e64aacbeb49c172
2018년 9월 11일 화요일
How to use image preprocessing to improve the accuracy of Tesseract
By schoolhompy at 9월 11, 2018
No comments
https://medium.freecodecamp.org/getting-started-with-tesseract-part-ii-f7f9a0899b3f
2018년 9월 9일 일요일
Out of memory error: Java heap memory on Android Studio
By schoolhompy at 9월 09, 2018
No comments
OpencvLibrary342 를 빌드하려 하니.메모리 .에러가...
Run/Debug Configurations 에서
Default->Gradle->Configuration->VM options-Xmx2048m -XX:MaxPermSize=512m
추가하면 됨.
나 같은 경우에는
안드로이드 스튜디오 터미널 에서
jps -lvm 해보니 용량이 512m 로 정해져있어서
환경변수에
_JAVA_OPTIONS , -Xms512m -Xmx512m 로 되어있어서
-Xms1G -Xmx2G 로 변경해서됨
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
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일 일요일
2018년 8월 11일 토요일
装う와 盛る차이점
盛る:
밥 등을 가득 담다.
装う:
원래의 의미로는 꾸미다(꾸밀 장) 이지만, 음식을 그릇에 잘 정리해서 담는다는 고상한 의미로 밥,국물을 그릇에 담다 라는 표현으로 쓰이게 되었다.
참고.
https://www.nhk.or.jp/bunken/summary/kotoba/term/070.html
特徴的なこととして、北海道と東北は「ご飯を盛る」、関西では「ご飯をよそう」、九州では「ご飯をつぐ」が優勢なことが挙げられます。
밥 등을 가득 담다.
装う:
원래의 의미로는 꾸미다(꾸밀 장) 이지만, 음식을 그릇에 잘 정리해서 담는다는 고상한 의미로 밥,국물을 그릇에 담다 라는 표현으로 쓰이게 되었다.
참고.
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일 수요일
안드로이드 스튜디오 유용한 플러그인
By schoolhompy at 7월 18, 2018
No comments
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 리소스를 한사이즈만 제작하면 자동으로 여러 해상도 사이즈에 맞게 추가해준다.
1.CodeGlance
이 플러그인을 설치하면 우측에 코드 미니맵이 생성되어 코드를 더욱 편하게 볼 수 있게 해준다.
2.Parcelable code generator
귀찮은 parcelable 코드를 자동으로 생성해주어 생산성을 높여준다.
3.Presntation Assistant
어떤 기능을 사용 할 때 단축키를 시각적으로 보여준다.
key promoter라는 비슷한 플러그인이 있는데 클릭한 위치에서 오랜시간(?) 단축키를 알려주지만 개발에 방해가돼 개인적으로 깔끔한 이 플러그인을 선호한다.
4.ADB idea
자주 사용하는 몇몇 ADB 커맨드를 클릭으로 사용할 수 있게 해준다.
5.Android Drawable Impoter
drawable 리소스를 한사이즈만 제작하면 자동으로 여러 해상도 사이즈에 맞게 추가해준다.
안드로이드 스튜디오 단축키
By schoolhompy at 7월 18, 2018
No comments
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
핵심단축키
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 알기
By schoolhompy at 7월 18, 2018
No comments
gradle 로 java 빌드 해보기 일본 사이트
https://qiita.com/tatesuke/items/6e30dc8891d0857f240e
https://qiita.com/tatesuke/items/6e30dc8891d0857f240e
2018년 7월 17일 화요일
android studio 레이아웃 에디터에서 빨간버튼뜨는거 해결
By schoolhompy at 7월 17, 2018
No comments
https://stackoverflow.com/questions/44449275/failed-to-load-appcompat-actionbar-with-unknown-error-in-android-studio
2018년 7월 16일 월요일
개발자를 위한 레시피-안드로이드
By schoolhompy at 7월 16, 2018
No comments
http://recipes4dev.tistory.com/category/ANDROID%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
2018년 7월 9일 월요일
2018년 7월 8일 일요일
java, c++ 책처럼 정리 잘되어 있는곳
By schoolhompy at 7월 08, 2018
No comments
http://tcpschool.com/cpp/cpp_algorithm_functor
2018년 7월 7일 토요일
예외처리 checked Exception, unchecked Exception
By schoolhompy at 7월 07, 2018
No comments
http://www.nextree.co.kr/p3239/
2018년 7월 5일 목요일
javascript - Abstract Factory 예제
By schoolhompy at 7월 05, 2018
No comments
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);
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
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 소개 - 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
By schoolhompy at 7월 04, 2018
No comments
https://www.slideshare.net/yongho/ss-79607172
2018년 7월 2일 월요일
javascript 은닉화 기본 -
By schoolhompy at 7월 02, 2018
No comments
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 으로 깔끔하게.
By schoolhompy at 7월 02, 2018
No comments
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(` activityGetIndividualRelationN ame:${ getIndividualRelationName}`);
console.log(` activityGetIndividualRelationW arukuti:${ 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# 디자인 패턴
By schoolhompy at 7월 01, 2018
No comments
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 툴
By schoolhompy at 6월 22, 2018
No comments
http://dasunhegoda.com/class-diagram-from-php-code-using-phuml/867/
2018년 6월 21일 목요일
JQUERY 필요없어요.
By schoolhompy at 6월 21, 2018
No comments
http://blog.jeonghwan.net/2018/01/25/before-jquery.html
javascript test tool - jasmine + karma + vscode + chrome debugging
By schoolhompy at 6월 21, 2018
No comments
일단 이곳을 참고한다.
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
를 실행한다.
그리고 여기저기 브레이크 포인트를 걸고, 크롬에서 새로고침 해보면 된다.
--------------------------
참 더럽게 복잡하네...ㅆㅂ
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
By schoolhompy at 6월 15, 2018
No comments
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
구글의 자바스크립트 스타일가이드
By schoolhompy at 6월 15, 2018
No comments
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
웹사이트가 어떤 기술과 프레임워크 쓰는지 파악해주는 툴..와우
By schoolhompy at 6월 15, 2018
No comments
Wappalyzer — 웹 사이트에서 사용되는 기술을 보는 데 유용하다. 웹 사이트가 어떤 종류의 프레임워크를 사용하고 있는지, 어떤 서비스를 사용하고 있는지 궁금하다면 이 도구만한게 없다.
크롬 확장프로그램
크롬 확장프로그램
함수형 setState가 reactjs 의 미래래요
By schoolhompy at 6월 15, 2018
No comments
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 숨은 기능들
By schoolhompy at 6월 15, 2018
No comments
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’))
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
By schoolhompy at 6월 11, 2018
No comments
/**
* 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;
}
}
* 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일 토요일
레거시 PHP에서 모던 PHP로 – 뷰 분리하기
By schoolhompy at 6월 09, 2018
No comments
https://www.haruair.com/blog/3748
2018년 5월 26일 토요일
만화볼떄 음성으로 누가 말해주면 좋겠지?
By schoolhompy at 5월 26, 2018
No comments
만화볼떄 음성으로 누가 말해주면 좋겠지?
근데 누가 말해줘?ㅋㅋ
근데 누가 말해줘?ㅋㅋ
xamarin-forms-drag-image-between-views
By schoolhompy at 5월 26, 2018
No comments
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);
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구현 맥킨토시 아이콘효과
By schoolhompy at 5월 20, 2018
No comments
http://wpfkorea.tistory.com/71?category=166735
2018년 5월 16일 수요일
C# how-to-know-when-was-windows-started-or-shutdown
By schoolhompy at 5월 16, 2018
No comments
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# 타이머
By schoolhompy at 5월 13, 2018
No comments
https://social.technet.microsoft.com/wiki/contents/articles/37252.c-timer-schedule-a-task.aspx
C# 데이터바인딩 기초부터 확실하게 익히기
By schoolhompy at 5월 13, 2018
No comments
https://m.blog.naver.com/areema/60189364049
C# 아이템소스와 아이템 템플릿으로 리스트 목록 바인딩??
By schoolhompy at 5월 13, 2018
No comments
https://reflectionit.nl/blog/2015/windows-xaml-tips-resourcedictionary-with-codebehind
C# 여러개의 아이템 데이터 소스 적용하기
By schoolhompy at 5월 13, 2018
No comments
https://code.msdn.microsoft.com/windowsdesktop/Combining-item-sources-in-65408473
C# 기초부터 .. 10년전자료부터 다시 천천히 읽을..시간이없다...
By schoolhompy at 5월 13, 2018
No comments
https://m.blog.naver.com/lse805/50034432858
2018년 5월 9일 수요일
1000 개의 C, C++, PHP,Python,ruby,C#,iot 예제 모두 1000개씩..인터뷰.MCQ 까지
By schoolhompy at 5월 09, 2018
No comments
https://www.sanfoundry.com/
C# 그래픽 마스크
By schoolhompy at 5월 09, 2018
No comments
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# 코딩컨벤션
By schoolhompy at 5월 08, 2018
No comments
http://blog.naver.com/PostView.nhn?blogId=vactorman&logNo=221190520002&categoryNo=12&parentCategoryNo=12&viewDate=¤tPage=1&postListTopCurrentPage=&from=postList&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=1
꼭지켜
꼭지켜
C# 인스턴스를 만드는 몇가지 방법이라능.
By schoolhompy at 5월 08, 2018
No comments
http://blog.naver.com/PostList.nhn?blogId=vactorman&from=postList&categoryNo=12&parentCategoryNo=12
유용
유용
c# MVVM 패턴 이해 쉽게 설명
By schoolhompy at 5월 08, 2018
No comments
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가지 이유
By schoolhompy at 5월 07, 2018
No comments
머신러닝에 파이썬을 즐겨쓰는 4가지 이유 원문보기: http://www.ciokorea.com/news/38148#csidx588d97e03ad139d8801a2ca09a6265e
2018년 5월 6일 일요일
C# Observable Collection을 이용한 바인딩 샘플
By schoolhompy at 5월 06, 2018
No comments
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일 토요일
C# 주석방법
By schoolhompy at 5월 05, 2018
No comments
http://blog.naver.com/PostView.nhn?blogId=dolmoon&logNo=60051345347
http://hyghyk.egloos.com/153572
http://hyghyk.egloos.com/153572
2018년 5월 4일 금요일
C# Switch 에 Goto 사용해서 여러분기 처리하기
이런게 가능하다.
지옥의 고투가 나타났다.
switch
case 0:
goto end1;
end1:
break;
썅..고투
지옥의 고투가 나타났다.
switch
case 0:
goto end1;
end1:
break;
썅..고투
C# 배열을 다루는 간단한 방법 Tip
By schoolhompy at 5월 04, 2018
No comments
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 은 오브젝트로 바꿔도됨.
string 은 오브젝트로 바꿔도됨.
C# Enum range takewhile 사용예
foreach(var n in Enumerable.Range(1, int.MaxValue).TakeWhile((c) => sum <= 100))
{
sum += n;
}
{
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
http://www.dotnetspark.com/kb/1830-create-sticky-notes-wpf-application-part.aspx
C# mdf 테이블 필드명 바뀌지 않을때. 썅
By schoolhompy at 4월 30, 2018
No comments
http://dustyreagan.com/how-to-rename-table-or-column-using-t/
미친 마소
미친 마소
2018년 4월 26일 목요일
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/
프로그레시브 웹앱
By schoolhompy at 4월 26, 2018
No comments
https://www.slideshare.net/GihyoJoshuaJang/the-future-of-web-progressive-web-app
https://www.slideshare.net/wonchoel/pwa-73203598
https://www.slideshare.net/wonchoel/pwa-73203598
javascript promise 이해
By schoolhompy at 4월 26, 2018
No comments
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/
이벤트리스너-클로저-디바운싱
이벤트리스너-클로저-디바운싱
Visual Studio C++ 디버그 모드 실행 빠르게
By schoolhompy at 4월 26, 2018
No comments
https://jacking75.github.io/VS_cpp_fast_debug_run/
https://jacking75.github.io/VS_Faster_Cpp_solution_load_and_build_performance_VS2017/
https://jacking75.github.io/VS_Faster_Cpp_solution_load_and_build_performance_VS2017/
C# 게임서버 만들자
By schoolhompy at 4월 26, 2018
No comments
http://lacti.me/2013/06/07/csharp-game-server/
http://lacti.me/2014/06/30/why-implements-csharp-server/
http://lacti.me/2014/06/30/why-implements-csharp-server/
새삼스럽게 JAVASCRIPT 디자인패턴
By schoolhompy at 4월 26, 2018
No comments
https://joshua1988.github.io/web-development/javascript/javascript-pattern-design/
2018년 4월 25일 수요일
MVVP 패턴 다시한번 기억
By schoolhompy at 4월 25, 2018
No comments
https://magi82.github.io/android-mvc-mvp-mvvm/
C# 기초 실무 사용방식
By schoolhompy at 4월 25, 2018
No comments
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 Tips: Slice, Filter, Parentsuntil
https://www.endpoint.com/blog/2013/02/04/jquery-performance-tips-slice-filter
C# WPF dynamic load xaml -레이아웃 동적로드
By schoolhompy at 4월 24, 2018
No comments
https://stackoverflow.com/questions/910814/loading-xaml-at-runtime
2018년 4월 23일 월요일
자바스크립트 성능개선 참고
By schoolhompy at 4월 23, 2018
No comments
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
By schoolhompy at 4월 23, 2018
No comments
https://stackoverflow.com/questions/48321034/wpf-application-authentication-with-google
구글 api 연동
By schoolhompy at 4월 23, 2018
No comments
https://github.com/google/google-api-dotnet-client-samples
page speed api 도 있음
page speed api 도 있음
이런저런 예제가...https://www.dotnetperls.com/
By schoolhompy at 4월 23, 2018
No comments
https://www.dotnetperls.com/
대충만든거 같지만 기초예제가 있으니..ㅋ
대충만든거 같지만 기초예제가 있으니..ㅋ
2018년 4월 22일 일요일
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 자마린 사운드 레코더
By schoolhompy at 4월 22, 2018
No comments
https://github.com/NateRickard/Plugin.AudioRecorder
C# Spy++ 사용해서 adobe pdf 모듈 삽입후 제어하기
By schoolhompy at 4월 22, 2018
No comments
http://blog.naver.com/PostList.nhn?blogId=goldrushing&from=postList&categoryNo=10
C# 커서바꾸기
By schoolhompy at 4월 22, 2018
No comments
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등에 유용하다.
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 [후니의 개발일지]
설정파일 : 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
요약
https://qiita.com/tobesan/items/847d864d7eff0b76d7db
요약
- コマンドプロンプトに
git clone https://github.com/mobz/elasticsearch-head.git
と入力し、elasticsearch-headフォルダをダウンロード
参考資料にはgit://github.com/mobz/elasticsearch-head.git
と記載があるが、エラーが起きる場合は上記を使用。 - elasticsearch-headのフォルダに入る
cd elasticsearch-head
- インストール
npm install
- 動かす
npm run start
단 , 엘라스틱 설정에서
http.port : 9200
http.cors.enabled : true
http.cors.allow-origin : /http://localhost(:[0-9]+)?/
http.cors.enabled : true
http.cors.allow-origin : /http://localhost(:[0-9]+)?/
를 추가하는센스