Futures transform

network개발 2017. 8. 8. 10:01


import static com.spotify.futures.FuturesExtra.syncTransform;


syncTransform:

ListenableFuture<A>를 ListenableFuture<B>로 변환한다. (참고: ListenableFuture는 guava: completion Listener와 executor를 가질 수 있음.)


syncTransform2: 

  ListenableFuture<A>, <B>2개를 하나의 ListenableFuture<C>로 변환한다.




Futures.transform():

이것도 ListenableFuture를 ListenableFuture로 변환하는데... executor를 파라미터로제공.


rxjava.FutureRxInterop.toSingle(): or toMaybe()

각종 Future -> Single로.




Posted by yongary
,

Kerberos는 하데스의 지옥문을 지키는 머리셋달린 개인데

MIT에서 제 3의 서버를 통한 인증을 하는 시스템을 만들면서 이 이름을 붙였다고 한다.


자료출처: REF http://slideplayer.com/slide/4791382/



Kerberos서버와 TGS서버가 따로 있는 것이 특징이다.

  - 서버접속시에는 TGS서버에서 티켓만 받으면 접속이 가능하다 





Posted by yongary
,

Form의 Validation을 체크할 때, 주로 spring의 validator기능을 사용해 왔지만,


jQuery에서도 Form-validation기능이 있다는 걸 알게되었다.

잘만 쓴다면, 서버까지 갔다오지 않고 바로 javascript에서 처리가 되니 장점이 존재한다.


REF

기본적으로는 rules: 와 messages:를 정해주면 자동으로 체크 및 에러메시지가 출력된다.



예)

$("#basicForm").validate({ rules: { validForCheck : 'validForCheck',

rankingWeightCheck: 'rankingWeightCheck'

} messages: 또는 메시지를 아래 addMethod에 적을 수 있음. }); $.validator.addMethod("rankingWeightCheck", function(value) { return ($('#className').val() < 100 );

}, 'Please enter a Value under 100<br>');


Posted by yongary
,

mongo-java-driver

mongoDB, redis 2017. 7. 23. 23:16

javadoc_REF (많이쓸 클래스: async.client.mongoCollection)

             - 부속: async-driver

             <최근 dependency>

                'org.mongodb:mongo-java-driver:3.4.2'

       'org.mongodb:mongodb-driver-async:3.4.2'   



이중화: https://nextus.tistory.com/26


aggregate사용법:  기초 REF ,  프로그래밍 중에 사용법 REF

   aggretate상세설명: REF



Async Code예제:REF



JAVA (Spring에서 aggregation 사용예제)


Criteria criteria = new Criteria("producerNo").is(producerNo);

MatchOperation match = Aggregation.match(criteria);
SortOperation sort = Aggregation.sort(Sort.Direction.DESC, "deliverStart");
Aggregation agg = Aggregation.newAggregation(match, sort);

AggregationResults<DeliverProduct> results = mongoTemplate.aggregate(agg, "deliverProduct", DeliverProduct.class);
List<DeliverProduct> productList = results.getMappedResults();


  group의 경우

//SQL: db.xx.aggregate([{$group:{_id:{iotId:"$iotId", producerNo:"$producerNo"},
// deliverStart:{ $max:"$time"}}} ]

//RUN "group" Aggregation.//max(deliverStart)->deliverStart로
GroupOperation group = Aggregation.group("iotId", "producerNo").max("time").as("time");
Aggregation agg = Aggregation.newAggregation(group);



- 좀더 간단히 사용하려면 : REF (but, 추천은 아님)

Posted by yongary
,


<AssertJ의 javadoc_REF 기초REF>


import static org.assertj.core.api.Assertions.assertThat


.isEqualTo

.contains

.startWith

.endsWith


등 기존 junit assertTrue보다 유연하게 사용가능.





JUnit JavaDoc


JavaDoc : Assert class




@Parameters - 음 javadoc에서 잘 안보이네요.

@Test
@Parameters({
"10000, 8, 32",
"100000, 12, 128",
})
public void realUsage(int numSerials, int numDigits, int hashKeySize)


@DataPoints + @Theory 

 @DataPoints
 public static String[] dataPoints = new String[] { ... };
 
 @DataPoints
 public static String[] generatedDataPoints() {
     return new String[] { ... };
 }
 
 @Theory
 public void theoryMethod(String param) {
     ...
 }


Posted by yongary
,

RxJava

network개발 2017. 7. 21. 11:48

(RxJava는  비동기multi-thread 주목적이므로 network개발로 분류)  기초:REF


javadoc 



데이타\처리

CompletableMaybeSingleObservable

Subject(외부에서 데이타주입가능)

NothingO
OneOOOO
MoreOO
UnlimitedOO


<Observable과 Maybe 많이쓸만한 함수: 주로 양쪽에 다 존재>

Observable.subscribe (  Observer 또는 Consumer ) 
                                      Observer는 { onComplete(), onError(),   + onNext(), onSubscribe()  } 

Observable.subscribeOn (데이터주입 Schedule쓰레드)

Observable.observeOn (데이터처리 Schedule쓰레드)

                  .onSubscribe (Cosumer<Disposable {dispose()} >

       (static).defer (Callable supplier )  : .create대신의 공급자.  REF


Flowable.doOnSubscribe ( Consumer<Subscription {cancel(),request(r)   } }   org.reactivestreams?.Subscription

        FlowableOnSubscribe  inteface도 존재.    



Maybe.doOnSuccess( Consumer 

           .doOnComplete ( Action )  ,   .doOnSubscribe( Action

           .doOnError (Consumer 

           .onErrorComplete ( Predicate 
           .timeout ( , , Scheduler  )

(static) .defer ( Callable supplier)  : 공급자  (in study)       

(static) .just ( T )
(static) .error(E) 





Scheduler  & Scheduler.Worker(하나의 thread에서 순차적으로 처리하는 Scheduler)

 ExecutorService exec = Executors.newSingleThreadedExecutor();
                                 .newFixedThreadPool(5)//cpu+1 
 try {
     Scheduler scheduler = Schedulers.from(exec);//parallelization에 최적.
                                     .computation();//cpu+1 계산에적합
                                     .io(); //cache도 해줌.cpu+1
                                     .newThread()//간단
     Flowable.just(1)
        .subscribeOn(scheduler)
        .observeOn(Schedulers.computation())
        .map(v -> v + 1)
        .subscribe(System.out::println); //blockingSubscribe(System.out::println);
 } finally {
     exec.shutdown();
 }


Maybe와 Single의 차이는 complete의 존재여부?   (from REF)

Flowable :  item emit속도( reactive dataflow)가 조절 가능. 



Flowable -> Single<List<T>>  :  toList() 도 좋음.

Posted by yongary
,

ES6, class let ${}....

javascript 2017. 7. 20. 18:17

ES6_turorial.pdf  

ES6 javascript 는 지원되는 브라우저가 많지 않아서 그 사용용도가 제한적이지만.. 

   1. node.js를 이용한 서버개발

  2. 관리자 페이지 (브라우저를 제한 가능)

등에서 사용이 가능하다.

Babel을 사용하면 es6파일을 es5로 변환시켜 준다.  REF


기존 javascript대비 특이한 점들은....


1. class & extends 지원  ref

    - class constructor에( options 사용가능: json 형식)
    

2. let , const 지원  
    - let은 함수도 지정이 가능한 var로서
      let add = (a,b) => a+b    ref      (lambda도 지원)   =>이다. (java는 ->임) 

    -let은 block scoping이 된다. (가능하면 let을 써야겠군요)   REF (이하 3~5))

3. Promise   (java의 Future느낌) , 그리고     tutorial.pdf에 의하면 Map,Set도 지원. 
    - .resolve()  .reject()  .all() 등 

4. import  / export  : Babel등과 함께 사용: ref

5. template  :  ${변수}       let message = `Hello ${name}!`;  

6. module 지원: REF  (webpack의 기능을 일부 담당가능)


 배열을 파라미터로 전달. 
   - 
var data = [1,2]; function Test1(a,b)...; ==> Test1(...data) : (이경우 ...을 spread라고 부른다 REF)

   -  기존 parameter들은  지정하지 않아도, arguments변수에 자동으로 넘어갔지만
       (...args) => { console.log(args); }  지원.     (이경우 ...을 REST 파라미터 라고 부른다) 

Posted by yongary
,

Armeria with Thrift

network개발 2017. 7. 20. 16:46

REF  /server-thrift  /client-thrift      (기타  /client-decorator   /server-decorator  /client-custom-http-headers    )




<주요 class 들>  javadoc    pkg:  common.thrift,  server.thrift, client.thrift 


THttpService  :  (Thrift Http Service)


ThriftCompletableFuture  (extends CompletableFuture<java> implements AsyncMethodCallback<thrift> )




Posted by yongary
,

CompletableFuture implements Future, CompletableStage. (그래서 CompletableStage공부도 필요)



<CompleteFuture의 기본 함수들>

.complete(returnValue)

.completeExceptionally(exception)


.thenApply (Func)  : 결과값에 적용

.thenCompose (Func) : future에 적용?  - 이것 자체도 Task가 됨 (333p)

.thenCombine (Func)  :   A task결과와 B task결과를 이용한 연산가능.


.thenAccept(Consumer)



(static) .supplyAsync (  Supplier<R> )   R:ReturnType

첫번째 stream에서 CompletableFuture<String>의 List를 가지고 있지만,

List<String>을 원한다면 기다린 후, Future들에서 값을 가져와야 하는데, 이 일을 해주는게 join이다.

별도의 stream 루프로 처리해야 Parallel처리가 된다.. 안그러면 supplier->join->supplier->join 순차적처리가 됨. 


Posted by yongary
,

Mac북 사용시

Mac 2017. 7. 19. 23:40

$  top   -> 모니터링 화면이 뜨는데,   이 때 o를 입력하고 cpu라고 입력하면.. cpu많이쓰는 순서대로 정렬된다.



Posted by yongary
,

한글 REF성능개요    REF


  - angular과 달리, 단방향 data-binding임.


  


new Vue {     :html element를 하나 물고 있는 느낌의 객체.(물론 el없이 js ES6 class처럼 사용도 가능)

  el:  ,

   - template: ,

   

  props:  data전달 -  REF:vuejs.org  - $emit하고나서 props:로 데이타를 받음.

  data: ,

  created:  ,    //instance가 생성되고 나서 호출되는 hook.  REF'

    - mounted:
    - updated:
    - destroyed:  이런 hook들도 존재. 


  watch: 

  computed:  sort나 filter들을 적용해서 보여줄 수 있음.

   

  methods:

  validations:     ($v로 인용가능)


  components:    REF

}



- ajax요청시에는 axios 를 사용. REF

- vuelidate :  vue component의 validations: 을 check:  REF


- vue-loader : webpack에서 사용하는 loader로서, css후처리등도 가능하다고 하는데...   REF

- vee-validator 로 각종 html input등의 type/regex 체크 가능.   REF


(plugin) - plugin제작가이드 

- vue-router : 해당 component를  화면에 그려줌.     
- vuex : 전역변수                     routre/vuex REF



$router, $v (이하/위 참조),  $emit(현재 instance에 event trigger) 

========  API-list  =====================================================

:is <component :is="componentId"> <component v-bind:is="currentView">


v-for  REF

v-show

v-if

v-on:click   =>    @on(click) 으로 이벤트 감지. 
                           v-on:click="$router.push('/detail')":서브페이지로 이동.ps://router.vuejs.org

                  원복: $router.push('/')   REF:rotuter.vuejs.orghtt           

v-model   양방향 바인딩 지원.  angular.js 처럼  .sync 키워드 필요.  

v-bind

v-cloak

Posted by yongary
,

빌드자동화툴 gulp

javascript 2017. 7. 19. 18:10

REF


gulp는 js빌드자동화 툴로서, node.js를 기반으로 node의 스트림을 사용해서 동작한다.


 - gulpfile.js파일에 설정내용.

   gulp.src ([a.js, b.js...]);

   gulp.task(name, (선행잡), function)


$ gulp task-name  :시 특정 task 실행.



추가 API 한글 : REF

API Doc: REF





Posted by yongary
,

prmd

IT 2017. 7. 19. 17:18

JSON이나 yml파일들을 이용해 자동으로 document생성.  REF


$prmd combine --meta meta.yml schema | \

  

Posted by yongary
,

gradle

springBoot gradle 2017. 7. 19. 14:58

REF


compileOnly : 컴파일타임에만 사용됨-예)어노테이션라이브러리등   REF

    - maven의 provided와 동일.



  build.gradle  good_REF

        (gradlew build시)

      - jar, assemble  task을 통해 최종 jar파일을 생성할 수 있다.   REF  
           위치(build/libs)  및  jar 단독실행(java -jar xxxx.jar)   - ref

      



멀티 프로젝트: GOOD_REF   REF

 - 상위 프로젝트의 build.gradle에 모든 설정을 다 넣는다.


 - 상위 프로젝트의 settings.gradle파일에 sub프로젝트들을 지정한다.

   include "my:cms"

   project(':my:cms').name = 'my-cms'


- bootRepackage 는 보통 main이 없는 공통모듈용.





Posted by yongary
,

Thrift (apache RPC)

network개발 2017. 7. 14. 11:37

 IDL을 정의하고, 여러가지 언어로 skeleton코드변환이 지원된다.

  - Async지원 (TNonblockingServer)

  - multi-thread지원 (ThreadPoolServer)

  - Exception제공 

  


IDL 정의는 REF 참조.

   - namespace는 java의 경우, 그대로 package명으로 변환 됨.

  - service는 상속이 된다. (interface개념)

  - struct는 상속이 안됨.  (class개념) - 단  delegation은 됨(다른 struct포함 가능)

  - list, set, map이 지원 됨. 

  - constant, enum, typedef가 지원되면 typedef는 java의경우 replace형태로 변환된다.



간단한 통신예제 : REF

-  서버가 Async인 경우 client에서 TFramedTransport를 사용한다.  위 사이트에서 NobblockingClient 라는게,

    Nonblocking  서버에 접속하는  BlokcingClient이다. 



Thrift Protocol Stack 그림 - REF



Posted by yongary
,

SELECT /*%expand*/* FROM (


SELECT
*,

if(@code = service_code, @count := @count + 1, (@count := 0 || @code := service_code)) count

FROM

my_table

WHERE service_code="blabla"

ORDER BY service_code )

WHERE count <=9 ;


이러면 service_code별로 10건씩 소팅이 되서 나온다.   

oracle의 rownum하고 비슷하게 사용한 예제이지만,  service_code별로 번호를 새로시작하도록 한 코드이다. 

Posted by yongary
,

Doma ORM

BACK-END 2017. 7. 12. 16:32

일본에서 많이 사용하고 있는 DOMA라는 ORM이 있다.

문서나 코멘트 등 모든게 일본어라서 일본 외에서 쓰는 건 쉽지 않지만..

일단 쓰게 된다면 비교적 간편하고 가볍게 잘 만들어진 ORM이라는 걸 알 수 있다.


각종 링크들은 다음과 같다. 요즘은 한국어 자동번역이 잘되니 볼만하다.



SQL_문법 REF페이지 



DOMA 개요



Posted by yongary
,

javascript의 xmlHttpRequest는 보안의 문제상, 기본적으로 현재 접속한 서버만 접속해서 이런저런 데이타를 받아올 수 있다.


하지만 복잡한 요구사항이 증가하면서, 이를 회피할 방법이 필요한 경우가 다수 생기면서

이를 회피하는 방법이 몇가지 있는데


REF

대표적인 것이 

 - CORS이다. library도 있으므로 다운받아서 쓰면 된다.  


그외  

 -JSONP (보안이 없는 js다운로드 방식을 우회해서 xml다운로드)방식도 있다.




서버사이드가 spring일 경우에   spring-doc-cors  REF 참조.


==> @CrossOrigin 어노테이션 및   

      Config에서  allowedOrigin하는 방법이 대표적.

@Bean

    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }


Posted by yongary
,

java8 시간관련

java8~ 2017. 7. 7. 10:44

REF

java8에 여러가지 시간관련 클래스들이 추가되었다. - 매우 유용하다. 주로 이것만 쓰면되고

거기에 더해 기존 Date (millisec표시)정도만 쓰면 되지 않을까 싶다.


LocalDate, LocalTime, LocalDateTime

    - truncateTo함수 제공


Period, Duration  날짜/time간 차이계산..   .plus, .minus, .between

    -Duration.between( LocalDateTime1, LocalDateTim2)도 됨.  
          ===> function prototype은  between(Temporal, Temporal)이라서 공부가 좀 필요.  



ZonedDateTime, OffsetDateTime, OffsetTIme 등이 존사용시 유용.

Posted by yongary
,

kotlin

IT 2017. 7. 5. 19:58

android를 대신하기 위해, 정확하게는 android안의 java를 대신하기 위해 만들어졌다는 kotlin..



주요 특징은 다음과 같다.


 - 변수선언시   var, val (immutable) - 많은 부분이 scala에서 왔다.

 - null safe : 심지어는 컴파일 에러가 난다.


 - javascript를 섞어쓸수 있다 : 이때 장점은 잘 모르겠는데 WEB개발에 유리하지 않을까 예상되네요.

   (당연히 node.js와도 섞어서 서버에도 사용가능함)  


 - kotlin + springBoot로 웹앱이 개발 가능하다.

   물론  Mockito를 결합해 unit테스트 가능.
      (단, 일반 class는 final개념이라 open class를 써야 함, when은 키워드라 `when`써야함)


- android폰 개발시에는 Glide등 편리한 Extension이 많다.

- Anko를 함께 사용하면 xml을 사용하지 않아도 된다.   (AnkoComponent의 subclass를 사용),  

   AnKo=Android+Kotlin의 의미로 android용  DSL (Domain-Specific Language)임.


- 기타문법  : is ,  ?    (instanceof, ?는 null대비)

      let은 다소 어려움.


  

 

Posted by yongary
,

URL Encoding은 일반적으로 java에서는  URLEncoder.encode()함수를 사용하지만

이러한 방식은 모든 특수기호도 encoding되기 때문에 중요한 


 URL?abc=1&def=2?token=1 

등에서 뒤의 ? 같은것은 리다이렉트 후 파라미터로 쓴다든지 하는 중요한, encode되면 안되는 것이기 때문에

encoding에서 제외해야 한다..


이런저런 percent-character(encoding후 %+로 변환)특수기호를 모두 제외하고 encoding 해주는 라이브러리가 있다.


try {
org.apache.commons.codec.net.URLCodec urlEncoder = new URLCodec();
query = urlEncoder.encode(query);
} catch (EncoderException e) {
}


Posted by yongary
,

http://springmvc.egloos.com/535572 



@ModelAttribute

 - controller로 접근시 항상  해당항목은 자동으로 생성/세팅이 되는 자동세팅 필드이다. 


@SessionAttributes

 - 동일한 이름의 모델객체를 발견하면 자동으로 세션값으로 변환하여 가지고 있는다.  




@ExceptionHandler

  - Controller 내에 정의해 놓으면, 그 controller내에서 발생하는 해당 Exception을 다 잡아준다.

    따라서, 함수안에서 catch를 할 필요가 없어진다.


@ControllerAdvice 

  - 위의 ExceptionHandler같은 것들을, 해당 controller뿐 아니라, 전체 어플리케이션에서 동작하도록 해준다.
    (@RequestMapping을 보고 찾음)


  여기에 영향받는 어노테이션은 

   @ExceptionHandler

   @InitBinder

   @ModelAttribute

  이다. 


Posted by yongary
,

REF:Mkong.com

 

 

[Stream:  one Group ]

.stream().collet(  Collectors.groupingBy(Function.identity(),  Collectors.count() ),

 

Grouping

 Map<BigDecimal, List<Item>> groupByPriceMap = 			items.stream().collect(Collectors.groupingBy(Item::getPrice)); 
 Map<BigDecimal, Set<String>> result =                 items.stream().collect(                         Collectors.groupingBy(Item::getPrice,                                 Collectors.mapping(Item::getName, Collectors.toSet())                         )                 );
[List -> Map]
Map<String, Choice> result =     choices.stream().collect(Collectors.toMap(Choice::getName,                                               Function.identity()));
 

[2 field Grouping]

Map<String, Map<String, Long>> multipleFieldsMap = employeesList.stream()
				.collect(
					Collectors.groupingBy(Employee::getDesignation, 
                                   Collectors.groupingBy(Employee::getGender, Collectors.counting())
                 ));

 

===========================O======================

<생성>
 Optional.of(v)
 Optional.ofNullable(v or null)
 Optional.empty()
 
 

.orElse(blabla)  empty일때 값지정.

 

.map( function)  존재할때 함수실행.

 

-boolean isPresent()

내부객체가 null이 아닌지 확인한다. null이면 false를 반환한다.

 

-void ifPresent(Consumer<T>)

Consumer<T>는 함수형 인터페이스 포스팅에서 봤듯 void 추상메서드를 갖고있다. null이 아닐때만 실행된다.

 

-Optional<T> filter(Predicate<T>)

스트림은 여러 데이터를 들고있는 객체다보니 filter로 걸러지는 데이터들이 반환됐지만, Optional은 내부객체가 단일객체인만큼 해당 조건을 만족하는지만 확인하는 정도로 사용할 수 있을 것 같다.

 

-Optional<U> map(Function<T, U>)

스트림과 같다. 내부 객체를 변환하는 용도로 사용한다.

 

-T get()

내부 객체를 반환한다. 다만 내부 객체가 null이면 NPE가 발생한다. null이 아니라는 확실한 경우에만 사용을 권장한다.

 

-T orElse(T)

내부 객체를 반환한다. 내부 객체가 null이면 인자로 들어간 기본값을 반환한다.

 

-T orElseGet(Supplier<T>)

orElse()와 동일한데 orElse()가 기본값 레퍼런스를 인자로 받는다면 orElseGet()은 내부 객체가 null일때 기본값을 반환할 객체를 인자로 받는다.

 

-T orElseThrow(Supplier<U>)



출처: http://multifrontgarden.tistory.com/131 [우리집앞마당]

Posted by yongary
,

docker

IT 2017. 6. 13. 17:05

REF:slideshare


Docker는 이미지 파일과 linux프로세서 형태로 실행하는 container로 이루어져있다.

immutable 이미지를 이용하기 때문에, 가상화머신보다 설정과 배포가 용이하다.


이미지와 이미지의 차이만 diff로 관리하기 때문에, github처럼 dockerhub에서 이미지 관리가 가능하다.


그리고 

boot2docker는 가상머신안에 docker를 실행하는 것이라서, host ip로  nginx등의 웹서버에 바로 접속할 수 없다.


이 때, ip를 알 고 싶으면 boot2docker ip를 이용하면 된다.

참고로 boot2docker up 으로 실행을 한다.



Posted by yongary
,

 sed 로  치환's/4.5.0-SNAPSHOT/4.7.0-SNAPSHOT/g' 

     명령을 써서 다른 파일에 저장하는 건 간단하지만


같은 파일에 저장하고 싶을때는 -i 옵션을 써야 한다.


하지만 맥에서는 -i 옵션 뒤에 항상 파라미터가 필요해서 '' 를 넣어주면 잘 동작한다.


예) sed -i '' 's/4.5.0-SNAPSHOT/4.7.0-SNAPSHOT/g' pom.xml


Posted by yongary
,

jQueryAutoComplete API Doc



suggestion (구글 검색창 처럼, 한 글자를 입력하면 자동으로 추천해주는 기능)

을 구현하기 위해서는 text box와 그 밑에 div를 이용해서 복잡하게 하는게 좋긴 한데


jQuery의 AutoComplete라는 기능을 이용해서 간단하게 할 수 있다. REF  (value만 있는 autoComplete)


label, value가 있는 autocomplete 예제는 여기: REF  - 별로 이쁘지 않고, 키로 값이 선택되지도 않음


약간 발전된 예제: REF -test중.


위 예제들에서 javascript 변수에 값 설정만 잘하면 된다.



추가로,  만약 Themeleaf를 사용하고 있다면..

<script th:inline="javascript">
    /*<![CDATA[*/
    var query = [[${query}]];
    console.log(message);
    /*]]>*/
</script>

방식으로 간단히 themeleaf변수를 javascript에 넣을 수 있다.




복잡한 변수의 경우 themeleaf파싱이 필요한데..  REF1

다음과 같이 themeleaf와 value, label을 조합해 사용할 수 있다.

<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
$(function () {
var suggestionData = [[${javaData}]];
$('#users').autocomplete({
source: suggestionData,
select: function (event, ui) {
//prevent .val(value) to input_text
event.preventDefault();
//.val(label) and store selected Value
$('#users').val(ui.item.label);
$('#userSelected').val(ui.item.value);
},
focus: function (event, ui) {
//prevent .val(value) to input_text
event.preventDefault();
}
});
});
/*]]>*/
</script>

단, java에서는 Array혹은 ArrayList로 label,value를 멤버로 가지고 있는 class의 list를 넘겨야 한다.

Posted by yongary
,


하나의 html페이지로 Listing과 Editing을 동시에 수행하는 페이지는 다음과 만들 수 있다.

(참고:  jQuery와 themeleaf이용)

 

포인트: flag(isEditMode)를 두어서 list인지 Edit인지를 구분하고, 

 그에 따라 필요한 버튼을 hide/show

 input을 readonly or not 으로 세팅한다. 


<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
$(function () {
allReload();

//list-edit Mode switch
function allReload() {
if ($('#isEditMode').val() == 'true'){
$('.form-control').prop('readonly', false);
$('.form-control').css('border', '1px solid #ccc');
$('#editBtn').hide();
$('#storeBtn').show();
$('#cancelBtn').show();
} else {
$('.form-control').prop('readonly', true);
$('.form-control').css('border', 'none');
$('#editBtn').show();
$('#storeBtn').hide();
$('#cancelBtn').hide();
}
}

$('#editBtn').click(function () {
$('#isEditMode').val('true');
allReload();
});

$('#cancelBtn').click(function () {
$('#isEditMode').val('false');
allReload();
});
//Button process


});
/*]]>*/
</script>
<input type="hidden" id="isEditMode" th:value="${isEditMode}"/>

<form id="form" method="post" enctype="multipart/form-data" th:object="${chatRankingCoefficientForm}"
action="/app/chat/ranking/constant">
<table class="table table-hover table-bordered"
style="word-break: break-all;word-wrap: break-word;" border="1">
<tr>
<th style="text-align:center">ranking</th>
<th style="text-align:center">Value</th>
</tr>
<tr>
<td>Days of Evaluation</td>
<td>
<input class="form-control" readonly="true" style="border:none;background-color:transparent;"
type="number" th:field="*{daysOfEvaluation}"/>
<div th:classappend="${#fields.hasErrors('daysOfEvaluation')} ? 'has-error'">
<span th:if="${#fields.hasErrors('daysOfEvaluation')}" th:errors="*{daysOfEvaluation}"
class="help-block">error!</span>
</div>
</td>
</tr> ..중략

<p> <!-- BUTTONS -->
<a class="btn btn-primary" id="editBtn">edit</a>
<input type="submit" class="btn btn-primary" id="storeBtn" value="save" />
<a th:href="@{/app/chat/ranking/constant}" class="btn btn-secondary" id="cancelBtn">cancel</a>
</p>
</form>


Posted by yongary
,

개발의 편의상 spring-boot-devtools라는 걸 사용하는게 좋다. REF

아래와 같은 5가지 기능이 지원된다.



Automatic Restart


LiveReload 

  - 특히 이부분은 개발을 할 때는 편하나, cache(@Cacheable)가 바뀌어도 자동 reload해주는 등 편하지만

    개발환경에서 ClassCastException이 발생할 수 있다.

    즉, cache에서 복원된 Object가 Class로 변환이 잘 안되는 문제가 있다.


   그래서 Cache를 테스트할 때는, 이부분을 pom.xml등에서  코멘트아웃을 하고 하는게 좋다.



Remote Debug Tunneling


Remote update and restart


Video Privew


Posted by yongary
,

cookie 와 JSESSIONID

FRONT-END 2017. 5. 18. 12:11

브라우저에서 쿠키를 이러저러 여러가지 값으로 설정할 수 있는데 REF

 
Tomcat의 경우는 

JSESSIONID 변수를 쿠키로 주고받으면서 세션을 유지한다.  REF


웹서버마다 방식이나 변수명이 다르므로 확인이 필요하다. 

nginx웹서버의 경우 cc변수로 보인다. 



현재쿠키는 javascirpt:document.cookie  를 주소창에 치면 쉽게 확인할 수 있다.


쿠키를 조작해서 테스트하고 싶을때는 postman , 그 중에서도 postman intercepter를 크롬에 설치하면 가능하다. 

Posted by yongary
,

mysql 원격copy

BACK-END 2017. 5. 17. 12:09

옆동료에게 나의 db를 그대로 복사해주고 싶은 경우,


일단 원격 접속을 해야하기 때문에

1.  mysql> grant all privileges on *.* to 'root'@'10.33.%';   동료pc에서 이런식으로 접속 허용을 해준다.


2. $ mysqldump -u root databaseName > temp.sql

3. 동료 mysql에 접속한 후 ( $mysql -h 동료pc_IP  -u root ) 아래명령 실행.

   mysql> create database databaseName

   mysql> use dataBaseName

   mysql> source temp.sql




Posted by yongary
,