Lombok 

써봤는 데, 의외로 유용하였다. 

get, set 메소드를 줄이는 것도 있지만 해쉬, toString을 동시에 만든다는 점에서 괜찮은 라이브러리이다.


Guava

구글에서 만든 라이브러리

사용은 안해봤지만 괜찮은 듯



'J > Java' 카테고리의 다른 글

SOLID  (0) 2017.06.12
javascript 배열 java 리스트 변환  (0) 2015.06.03
Java 내부 분석  (0) 2014.10.12
자바 외부 멤버변수를 내부 클래스 안에서 호출 할 경우, 주의사항  (0) 2014.10.09
jackson generic type 관련  (0) 2014.08.24

설정

트랙백

댓글

참조 : http://answers.microsoft.com/en-us/office/forum/office_2010-powerpoint/how-do-i-make-a-vba-count-down-timer-for/928b07db-e3cb-49c1-aadf-7ce56dedded2


I want to make a timer to countdown from a set time (or number) to zero.  I want to have something on the screen during slide show mode where I hit an active x button or advance to the next slide to run a macro to start a countdown timer on screen.  I don;t want to create 20 additional slides that are animated together.  I just wanted to do it with VBA code.  Can it be done?

 

I tried this code, but it seems to work when I step through it in edit mode, but it just crashes in slide show mode.  Any suggestions?

 

thanks,

Tim

 

Option Explicit
 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 Private Sub CommandButton1_Click()
  
    Dim Pre             As Presentation
    Dim Sld             As Slide
    Dim Shp            As Shape
    Dim i                 As Integer
       
    Set Pre = ActivePresentation
    i = 10
    
   ' this was supposed to be error trapping, but I think it only works in edit mode
'   With ActiveWindow
'     If .View.Type = ppViewNotesPage Then
'         .ViewType = ppViewSlide
'     End If
' End With
 
  'PowerPoint.Slide activeSlide = Application.ActiveWindow.View.Slide -failed
 Set Sld = Application.ActiveWindow.View.Slide
  'Set Sld = ActivePresentation.SlideShowWindow.View.CurrentShowPosition - failed
  

'supposedly will return the value of the slide that is displayed

'Set Sld = ActivePresentation.SlideShowWindow.View.Slide.SlideIndex  '(hangs up in slide mode with tyoe mismatch error)

'makes rectangular text box

Set Shp = Sld.Shapes.AddShape(Type:=msoShapeRectangle, _
     Left:=50, Top:=50, Width:=500, Height:=200)
 Shp.Fill.ForeColor.RGB = vbBlue
 Shp.Fill.BackColor.RGB = vbBlack
 Shp.TextEffect.FontName = "DS-Digital"
 Shp.TextEffect.FontSize = 244
'need to add formatting command for minutes and seconds 


 'updates the value in the text box
 Shp.TextFrame.TextRange = i

'supposed to loop through the values, going from i, down to 0    
While i > 0
i = i - 1

 

' to make the macro "sleep" for 1000 milliseconds

Sleep 1000 

 

'an attempt to force the textbox value to refresh

Shp.Select
Shp.Delete

Set Shp = Sld.Shapes.AddShape(Type:=msoShapeRectangle, _
     Left:=50, Top:=50, Width:=500, Height:=200)
 Shp.Fill.ForeColor.RGB = vbBlue
 Shp.Fill.BackColor.RGB = vbBlack
 Shp.TextEffect.FontName = "DS-Digital"
 Shp.TextEffect.FontSize = 244

 

'updates the value of text box

Shp.TextFrame.TextRange = i

Wend


'V > VB' 카테고리의 다른 글

VBS 외부 프로그램 실행 안될 때, 주의 사항.  (0) 2014.04.25

설정

트랙백

댓글


웹뷰 관련 개발하기 위해 여러가지 불편사항이 생기게 된다.

디버깅을 하기 힘들다는 점이 그 중 하나 일 것이다.

그래서 개선하고자 찾아본 결과 4.4 버젼 부터 웹뷰 디버깅이 가능하다는 것을 알게 되었다. ( 물론 4.0 이상 버젼도 되긴한다 - 아래 링크 참조 )

웹뷰 디버깅 링크를 클릭하면 자세히 나와있으니 참조하면 될거같다.


장비연결 상태 확인 url : chrome://inspect/#devices

설정

트랙백

댓글

Comet 기능 구현

S/Servlet 2014. 11. 9. 00:11

Reverse Ajax, Ajax Push, Two-Way-Web, HTTP server PUSH 등등으로 불리던 말이 이제 Comet 이라는 용어로 통일되어 가는 거 같다.

Comet 이란 웹 클라이언트(보통 웹 브라우저)의 명시적인 요청이 없어도 서버에서 클라이언트로 데이타를 밀어넣는(Push) 방식으로 동작하는 웹 프로그래밍 모델을 일컫는 말이다.


1. Polling 


2. Long Polling


3. Streaming


이중 Long Polling 과 Streaming 을 Comet 기능으로 주로 사용함.


Spring Framework 에선 WebSocket을 이용한 Comet 기능 구현이 있다. 

페이스북과 같이 댓글이 실시간으로 바로 나오기 위해서 사용하게 된다.


다만 주의할 점은 톰캣 8 이상에서 테스팅이 원활하게 진행이 된다.

만일 톰캣 버젼이 낮을 경우에는 

 org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.socket.server.support.DefaultHandshakeHandler]: Constructor threw exception; nested exception is java.lang.IllegalStateException: No suitable default RequestUpgradeStrategy found

라는 에러가 뜨게 될 것이다. 이것저것 시도해보았지만 톰캣 서버 버젼을 높이는 경우 밖에 없는 듯 하다.





설정

트랙백

댓글

git 명령어 모음

G/Git 2014. 10. 25. 10:58
1. index 지우기
git rm --cached [file]
2. comment 남기기

git commit -m 'First commit'

Q1. Make the current commit the only (initial) commit in a Git repository?
http://stackoverflow.com/questions/9683279/make-the-current-commit-the-only-initial-commit-in-a-git-repository


명령어 모음집

참조 : http://www.dreamy.pe.kr/zbxe/CodeClip/95414

'G > Git' 카테고리의 다른 글

gitignore 적용이 안될 시  (0) 2015.03.26
Git 기초 설정  (0) 2014.12.26

설정

트랙백

댓글

반응형으로 만드려다보니 css와 javascript 부분이 변환해야할 경우가 생긴다.

AngularJS를 쓸 경우에는 이런 식으로 코드를 짜도 되고, 자바스크립트로만 할 경우, 밑 코드만 봐도 javascipt로 변환하는 건 어렵지 않을꺼 같다.


참조 : https://github.com/paul-hammant/angular_instead_of_media_queries

 function ResponsiveDemoCtrl($scope, $window) {
    $scope.oneColumn = false;
    $scope.width = 0;
    $scope.height = 0;
    $scope.leftMarginStyle = {};
    $scope.rightMarginStyle = {};
    $scope.middleStyle = {};

    $scope.updateWidth = function() {
        $scope.width = $window.innerWidth;
    }

    $scope.updateHeight = function() {
       $scope.height = $window.innerHeight;
    }
    
    $scope.columnAdjustments = function() {
        if ($scope.width < 768) {
            $scope.oneColumn = true;
            var mid = $scope.width - 30;
            $scope.leftMarginStyle = { width: '15px', maxWidth: '15px' };
            $scope.middleStyle = { width: mid + 'px', maxWidth: mid + 'px', };
            $scope.rightMarginStyle = { width: '15px', maxWidth: '15px', verticalAlign: 'text-top' };
        } else if ($scope.width >= 1024 ){
            $scope.oneColumn = false;
            var mid = 614;
            var margin = ($scope.width - 614) * 0.5;
            $scope.leftMarginStyle = { width:  margin + 'px' };
            $scope.middleStyle = { width: mid + 'px', maxWidth: mid + 'px', };
            $scope.rightMarginStyle = { width: margin + 'px', verticalAlign: 'text-top' };
        } else {
            $scope.oneColumn = false;
            var pc20 = Math.round($scope.width * 0.2);
            var pc60 = Math.round($scope.width * 0.6)
            $scope.leftMarginStyle = { width:  pc20 + 'px' };    
            $scope.middleStyle = { width: pc60 + 'px', maxWidth: pc60 + 'px', };    
            $scope.rightMarginStyle = { width: pc20 + 'px', verticalAlign: 'text-top' };    
        }
    }    
    
    $scope.updateWidth();
    $scope.updateHeight();
    $scope.columnAdjustments();

    $window.onresize = function () {
        $scope.updateWidth();
        $scope.updateHeight();
        $scope.columnAdjustments();
        $scope.$apply();
    }
  }

설정

트랙백

댓글

Java 내부 분석

J/Java 2014. 10. 12. 01:46

Java 내부 분석


VisualVM, jconsole ..기타등등의 메모리,  CPU 말그대로 내부적인 전반적인 것들을 보여준다.


이것들을 어디다 쓰느냐 하면 예로들면, Memory Leak 현상이 발생하거나 프로그램 사이즈가 커졌을 때가 있는 데,


나 같은 경우에는 메모리 릭 현상이 발생하여 사용하게 되었다.


스프링 프레임워크를 사용하면서 간과했던 실수인데 static 선언을 했을 시, 메모리가 누적되어 쌓이는 증상이 발생할 수 있다.


멀티 스레드 환경에선 static으로 선언된 부분이 classloader에 계속 올라오는 현상이 생기는 거 같다.


결론은 메모리 누적이 발생하면 jconsole이나 VisualVM을 이용해서 내부 분석을 하여 해당 누적 클래스를 찾는 것이 중요하다.


자세한 내용은 구글 검색하면 나옴니다. :)


설정

트랙백

댓글

package com.example.e03list;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class MainActivity extends ActionBarActivity {

	LectureDBOpenHelper helper;
	SQLiteDatabase db;
	Cursor cursor;
	SimpleCursorAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		adapter = new SimpleCursorAdapter(this, R.layout.list_item, null,
				new String[] { "title", "modifiedTime", "_id" }, new int[] {
						R.id.text_view1, R.id.text_view2, R.id.text_view3 },
				CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
		ListView listView = (ListView) findViewById(R.id.listView1);
		listView.setAdapter(adapter);

		Button b = (Button) findViewById(R.id.button1);
		View.OnClickListener onClick = new OnClickListener() {
			public SQLiteDatabase db1 = db;
			
			@Override
			public void onClick(View v) {
				Log.e("db1", "db1 : " + db1 + " db : " + db); 
				// db1은 대입하여 메소드 호출하는 식
				// db는 내부 익명 클래스에서 외부 멤버변수를 호출하는 형식이라 
				// resume때 생성해도 상관이 없다.

				EditText e = (EditText) findViewById(R.id.editText1);
				String str = e.getText().toString();
				e.setText("");
				ContentValues value = new ContentValues(1);
				value.put("title", str);
				db.insert("ListItem", null, value);
				cursor.close();
				cursor = db.rawQuery("select * from ListItem", null);
				adapter.changeCursor(cursor);
			}
		};
		b.setOnClickListener(onClick);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	protected void onResume() {
		super.onResume();
		helper = new LectureDBOpenHelper(this);
		db = helper.getWritableDatabase();
		cursor = db.rawQuery("SELECT * FROM ListItem", null);
		adapter.changeCursor(cursor);
	}

    @Override
    protected void onPause() {
        super.onPause();
        cursor.close(); 
        db.close();
        helper.close();
    }
}

'J > Java' 카테고리의 다른 글

자바 유용한 라이브러리  (0) 2014.12.11
Java 내부 분석  (0) 2014.10.12
jackson generic type 관련  (0) 2014.08.24
URLConnection을 이용한 이미지 추출 프로그램  (0) 2014.06.28
Static 키워드  (0) 2014.03.18

설정

트랙백

댓글

deview 2014 - 월요일

S 2014. 10. 7. 09:12

1      자바스크립트 라이브러리 개발/운영 경험기


어떤 라이브러리 개발을 하고 서비스를 하게 경우, Upgrade 부담이 가게 되어있다.

비스의 안정성으로 인한 문제인데, 해결책으론 버저닝 (Versioning) 규칙 쉽게 하는 방법이 있다.

예로들면, Semantic Versioning 있겠다.

                     X (major)  Y(minor)  Z(patch)

다만 패치를 했을 경우, 몇 개의 부분을 수정했는지 크기를 알 수 없어

1개 수정하든 3개를 수정하든 패치 버전 업은 한번 일어나는 경우가 생기게 된다.

| 파일 | 버전 | 상세 내용 | 메소드 | … 이런식으로 각각의 수정 사항에 대해 상세화 시켜줌으로 해결할 수가 있다한다.

 

라이브러리를 개발하기 위해선 변화에 대응하기 위해 테스팅을 많이 해야한다.

테스트도 두가지 경우가 있다. 자동화 테스트, 사람 테스트

자동화 테스트 도구론 JsTestDriver

이벤트 시점에서 테스트 할 수 있는 Testem, Karma (Core – 테스트) 가 있다.

사람 테스트는 수치화 안되어 있는 것 (파일 업로드 등등 .. )인데 밀도 있게 하면? 된다한다.

Ex) 컴포넌트 별 기능 별로 테스트

 

결론, 라이브러리 개발은 단위 테스트 도구 활용, 사람 테스트 밀도 있게끔 하고

추가적으로 최소한의 의존관계, 발전 방향 쉽게 구성

Ex) Cross browsing (Polyfill) Syntactic sugar(Core)에 까는 식

이렇게 할 시에는 Polyfill은 외부 개발자에게 지원 받을 수 있음.

 

2   간결하고 효율적인 안드로이드 앱의 구조와 전략


http://blog.naver.com/kildongs - 소스 보기

안드로이드 개발 중 대부분의 버그들은 Data Transfer에서 발생한다.

( Intent, Uri 잘 다루는 것이 중요하다 )

또한 안드로이드를 개발할 때, 액티비티의 static도 안정하지 않아, Application 객체에다 저장하는 게 낫다. Application 객체만 잘 설계해도 좋은 어플리케이션을 만들 수 있다.

Application 객체를 사용하기 위해선 AppContext 라는 클래스를 만들어 Application 관련 처리를 편리하게 사용할 수 있게 구성을 해야한다.

개발시, 드를 간결 하는 것도 중요하다.

Inheritance, Reflection, Generics, Annotation, XML 이용하면 간결하게 있다.

findViewById 메소드는 복잡성 증가 시켜 어노테이션, 리플렉션을 이용하여

@DeclareView 통해 해당 뷰를 받게끔 구성. 수도 있다.

 

XML 부분 UI 컴포넌트 나누는 작업도 어느정도 해줘야한다.

예로는 Resource Id Mapping 간략화, Preference Xml 생성하여 변하지 않은 것은 넣기가 있다.

 

@BundleField 어노테이션 사용으로  DataTransfer 코드를 줄일 있다.

과정은 다음과 같다.

Uri 스킴? 매핑 객체 만든후, 클래스 멤버로 참조하여 사용하는 방법을 주로 한다.

 

인텐드 사용할 때도, Intent Serialize 되면 데이터양이 많은 것들은 전송이 힘들 경우가 있다.

따라서 AppContext.putValue 처럼 AppContext 클래스를 적극 활용하는 것도 하나의 방안이다.

 

Table, Cursor 단순화는 @DataField ( Cursor Reader, Content Values Mapper ) 객체 활용하면 된다.

하지만 나와있는 API들이 존재하므로 Jackson, XStream (API – Data Object Model)

를 사용해도 무방하다.

다만 API는 안드로이드 최적화가 되어있지 않아 한번 더 Convert 해야한다는 점이 불편하긴 하다.

간격하고 효율적인 안드 세미나를 들으면서, 어노테이션에 대해 다시 돌이켜보는 기회가 되었다.

어렵지도 않으면서, 어느정도 융통성 있게 어노테이션과, 리플렉션을 사용하면 코드의 양과 간결함을 유지할 수 있다고 한다.

그 말에 대해 어느정도 공감이 되는 부분이었고, 해외에서도 여러 어노테이션을 사용하는 API?가 존재한다. (AndroidAnnotations, GoogleGuice 등등..)

이런 API를 적극 활용하여 다음번에는 개발을 해봐야겠다.

 

3      Docker로 보는 클라우드 서버 운영의 미래

 

Docker 핵심적인 내용은 각각의 리눅스 서버의 세팅에 대한 설정 관리를 Docker 대신해 준다는 .

해당 리눅스 이미지를 저장하여 버전에 따라 다시 불러오는 기능을 수가 있다.

도커에 대해 들어보긴 했어도 어떠한 기능을 하는지 감을 잡을 수가 없어서 듣게 되었는 데, 아직까지는 도커를 쓰고 경험하기에는 거리가 먼 일들이라는 것을 깨닫게 되었다.

기능 자체가 개발적인 부분도 일부 포함되어 있지만, 환경이 변하지 않고 그 상태에서만 지속된다면 도커의 효과를 맛보기란 어렵기 때문이다.

 

4      How can I hack your application?


보안이란 것은 시간을 버는 관점으로 봐야한다는 것이 핵심.

절대로 완벽한 보안은 없다.

마지막 세션에서 안드로이드 APK를 디컴파일하여 소스를 분석한다음, 악성코드를 심는 과정까지 간단하게 설명을 해주었다.

해킹툴만 가지고 있고 어느정도의 소스 분석 지식만 있다면 누구나 해킹을 할 수 있다한다.

데이터를 보내는 것들 또한 암호화 시키고 해커가 디컴파일해서 소스분석해도 잘 모르게끔 하는 것이 중요.

 

* 워드에다 쓰고 티스토리에다 쓰니깐 깔끔해지는 듯?

'S' 카테고리의 다른 글

소나 버그 잡기  (0) 2017.06.12
Scala  (0) 2017.05.05
SSH 접속 끊김  (0) 2017.03.20
jboss 서버 utf-8 설정  (0) 2014.07.19
<모델1과 모델2>  (0) 2012.01.02

설정

트랙백

댓글

http://sapandiwakar.in/eofexception-with-spring-rest-template-android/

설정

트랙백

댓글