Code

Code

FileUriExposedException on Android 7.0

Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile());

http://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed

Get Download Directory in Android

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

SimpleDraweeView did not recycled in RecyclerView in Fresco Library

DraweeController draweeController = Fresco.newDraweeControllerBuilder()
        
.setOldController(mImage.getController())
        
.setUri(uri)
        
.setAutoPlayAnimations(true)
        
.build();



mImage.setController(draweeController);


Fast rebuild with instant run.

If I change the AndroidManifest.xml file, android studio performs a full build, but this is much faster to fist cleaning, and then building the project.So, I add a blank line to the manifest file, whenever I want android studio to full build the project. This is much effective to perform a manual full build.
http://stackoverflow.com/a/39329144/1015731

Move the task containing this activity to the back of the activity

public boolean moveTaskToBack(boolean nonRoot) {
    try {
        return ActivityManagerNative.getDefault().moveActivityTaskToBack(
                mToken, nonRoot);
    } catch (RemoteException e) {
        // Empty
    }
    return false;
}

Just use this.
moveTaskToBack(true);

Circles image using Fresco Programmatically

RoundingParams roundingParams = RoundingParams.fromCornersRadius(5f);
roundingParams.setRoundAsCircle(true);
mImage.getHierarchy().setRoundingParams(roundingParams);

http://frescolib.org/docs/rounded-corners-and-circles.html

Like search in SQLite3 using Python

connection.execute('SELECT name, code FROM table WHERE name like ?', ('%' + name + '%', ))

Update badge count in Android

Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); 

// package name setting 
intent.putExtra("badge_count_package_name", getComponentName().getPackageName()); 
intent.putExtra("badge_count_class_name", getComponentName().getClassName()); 

// badge count
intent.putExtra("badge_count", count);
sendBroadcast(intent);

JSON deep equal

Object.extend(Object, {
   deepEquals: function(o1, o2) {
     var k1 = Object.keys(o1).sort();
     var k2 = Object.keys(o2).sort();
     if (k1.length != k2.length) return false;
     return k1.zip(k2, function(keyPair) {
       if(typeof o1[keyPair[0]] == typeof o2[keyPair[1]] == "object"){
         return deepEquals(o1[keyPair[0]], o2[keyPair[1]])
       } else {
         return o1[keyPair[0]] == o2[keyPair[1]];
       }
     }).all();
   }
});

Usage:

var anObj = JSON.parse(jsonString1);
var anotherObj= JSON.parse(jsonString2);

if (Object.deepEquals(anObj, anotherObj))
   ...

Reference: http://stackoverflow.com/questions/4465244/compare-2-json-objects

flask url open basic format

import urllib

@app.route('/events.json')
def events():
    result = urllib.urlopen([URL]).read()
    return json.load(result)

Reset command in Git

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0

위 링크를 살펴보면 Git의 HEAD, Index, Working Directory의 개념과,
Reset명령어를 이해할 수 있다.

여러 옵션이 있지만 가장 많이 쓸법한 Head에 있는 내용을 Working Directory까지 Reset하려면 --hard 옵션을 사용하면 된다.

라벨:

jQuery, using one instead of on or off

https://github.com/jquery/jquery/blob/f18ca7bfe0f5e3184bf1ed55daf1668702c5577a/src/event.js
jQuery 소스 중 아래 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 부분을 보면 guid가 같은 경우 새로운 함수를 assign 한다는 것을 알 수 있다. 따라서, 앞으로 off, on를 연속해서 사용할 필요 없이 one 만을 사용하면 더 간단하다.
 if ( one === 1 ) {
    origFn = fn;
    fn = function( event ) {

        // Can use an empty set, since event contains the info
        jQuery().off( event );
        return origFn.apply( this, arguments );
    };

    // Use same guid so caller can remove using origFn
    fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
}
return elem.each( function() {
    jQuery.event.add( this, types, fn, data, selector );
} );

Realtime log collection system.

결론부터 말하면 특별히 제한이 없으면 Logstash를 사용할 것 같고, 다른 경우라면 syslog계열을 사용할 것 같다.
Logstash https://www.elastic.co/kr/products/logstash 다양한 플러그인 지원하지만 자원소모가 많음. 여유가 있는 서버에 설치하거나 단독으로 사용하는 것이 좋겠다.
Filebeat https://www.elastic.co/kr/products/beats/filebeat 가볍도 의존성도 없다. 하지만 제한사항이 많다. 다양한 환경에 적응하기는 쉽지 않다.
Logagent https://sematext.com/logagent/ 아주 빨리 설치해서 사용할 수 있다. 하지만 아직 Logstash보다 기능이 뒤쳐진다.
rsyslog http://www.rsyslog.com/ 리눅스의 기본 데몬인 syslog처럼 사용할 수 있다. 사용이 아주 간편하고 익숙하다. (syslog를 기존에 사용해봤다는 전재에서)
syslog-ng https://syslog-ng.org/ rsyslog 처럼 가볍고 사용하기도 쉽다. 크게 다른점은 모르겠다.
Fluentd http://www.fluentd.org/ JSON형태로 로그를 저장한다. 때문에 플랫폼 제한이 없지간 Ruby로 작성되어 추가 개발은 쉽지만 속도 등 여러가지 한계가 있다.


Proguard : google.gms - Duplicate zip entry c.class 에러

In app.gradle you need to move following entry to the end of file :

apply plugin: 'com.google.gms.google-services'

java.sql.SQLSyntaxErrorException: ORA-0091 오류

java.sql.SQLSyntaxErrorException: ORA-00911: 문자가 부적합합니다

위와 같은 오류가 발생할 경우, SQL 구문 마지막에 세미콜론(;)이 있는지 확인하고 제거하면 해결된다.

JavaScript에서 this 키워드에 새로운 context를 대입할 수 있을까?

불가능하다. JavaScript object로 된 함수를 사용할 때 이런 고민할 하게되는데 참고.

You can call a method with a specified value for this (using method.apply()/method.call()) but you cannot re-assign the keyword, this.


라벨:


Subscribe to: Posts (Atom)