728x90

출처 : Spring Security login/logout 관련 글
Spring Security Logout Example
Spring Security 3 - 맛보기와 기본 설정의 이해


web.xml

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/baroCOST-datasource.xml
			/WEB-INF/baroCOST-security.xml
		</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>	

baroCOST-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:security="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.2.xsd">

	<security:http auto-config="true">
		<security:intercept-url pattern="/favicon.ico" access="ROLE_ANONYMOUS" />
		<security:intercept-url pattern="/**" access="ROLE_USER" />
	</security:http>

	<security:authentication-manager>
		<security:authentication-provider>
			<security:user-service>
				<security:user name="guest" password="guest" authorities="ROLE_USER" />
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>

Spring Security 에서 기본 제공해주는 로그인 페이지(spring_security_login)

<html><head><title>Login Page</title></head><body onload='document.f.j_username.focus();'>
<h3>Login with Username and Password</h3>
<form name='f' action='/baroCOST/j_spring_security_check' method='POST'>
 <table>
    <tr><td>User:</td><td><input type='text' name='j_username' value=''></td></tr>
    <tr><td>Password:</td><td><input type='password' name='j_password'/></td></tr>
    <tr><td colspan='2'><input name="submit" type="submit" value="Login"/></td></tr>
  </table>
</form></body></html>

DB 사용

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:security="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.2.xsd">

	<security:http auto-config="true">
		<security:intercept-url pattern="/favicon.ico" access="ROLE_ANONYMOUS" />
		<security:intercept-url pattern="/**" access="ROLE_USER" />
		<security:intercept-url pattern="/" access="ROLE_USER" />
	</security:http>

	<security:authentication-manager>
		<security:authentication-provider>
			<!-- 
            <security:user-service>
                <security:user name="guest" password="guest" authorities="ROLE_USER" />
            </security:user-service>
            -->		
			<security:jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="select user_id username, password, 1 as enabled from user_info where user_id = ?"
				authorities-by-username-query="select user_id username, 'ROLE_USER' authority from user_info where user_id = ?"
			/>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>

로그인 페이지 변경

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:security="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.2.xsd">
           
	<security:http pattern="/common/css/**" security="none" />
	<security:http pattern="/common/image/**" security="none" />
	<security:http pattern="/common/js/**" security="none" />           

	<security:http auto-config="true">
		<security:intercept-url pattern="/favicon.ico" access="ROLE_ANONYMOUS" />
		<security:intercept-url pattern="/login.cmx" access="ROLE_ANONYMOUS" />
		<security:intercept-url pattern="/**" access="ROLE_USER" />
		<security:intercept-url pattern="/" access="ROLE_USER" />
		
		<security:form-login login-page="/login.cmx" default-target-url="/index.html"
			authentication-failure-url="/loginfailed" />
		<security:logout logout-success-url="/logout" />		
	</security:http>

	<security:authentication-manager>
		<security:authentication-provider>
			<!-- 
            <security:user-service>
                <security:user name="guest" password="guest" authorities="ROLE_USER" />
            </security:user-service>
            -->		
			<security:jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="select user_id username, password, 1 as enabled from user_info where user_id = ?"
				authorities-by-username-query="select user_id username, 'ROLE_USER' authority from user_info where user_id = ?"
			/>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>


728x90
728x90

참고 : http://camel.apache.org/jms.html

RouteBuilder

	from("jms:queue:test1?maxConcurrentConsumers=1&maxMessagesPerTask=1&autoStartup=true&preserveMessageQos=true")
	.bean(com.bluexmas.Test1Queue.class, "doTest")
	.to("jms:queue:test2");
	
	from("jms:queue:test2?maxConcurrentConsumers=1&maxMessagesPerTask=1&autoStartup=true&preserveMessageQos=true")
	.bean(com.bluexmas.Test2Queue.class, "doTest")
	.to("stream:out");

Header1Object

package com.bluexmas;

import java.io.Serializable;

public class Header1Object implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	int age;
	String name;
	
	public Header1Object(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}

	@Override
	public String toString() {
		return "Header1Object [age=" + age + ", name=" + name + "]";
	}
}

Test1Queue

package com.bluexmas;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.camel.Exchange;
import org.apache.camel.Message;

import com.uni.fep.bean.service.MQSenderService;
import com.uni.fep.bean.util.BeanUtils;
import com.uni.fep.bean.util.EnvironmentInit;

public class Test1Queue {
	
	public void doTest(Exchange exchange) {
		System.out.println("-- Test1Queue.doTest ----------------------------");
		
		Message in = exchange.getIn();
		
		System.out.println("body = " + in.getBody());
		System.out.println("header1 = " + in.getHeader("header1"));
		System.out.println("header2 = " + in.getHeader("header2"));
		
		in.setHeader("header1", "value1-1");
		in.setHeader("header2", "value2");
		
		List<String> listValue = new ArrayList<String>();
		listValue.add("list1");
		listValue.add("list2");
		in.setHeader("header3", listValue);
		System.out.println("header3 = " + in.getHeader("header3"));
		
		in.setHeader("header4", new Header1Object(10, "bluexmas"));
		System.out.println("header4 = " + in.getHeader("header4"));
	}
	
	public static void main(String[] args) throws Exception {
		EnvironmentInit.init();
		
		MQSenderService service = (MQSenderService)BeanUtils.getBean("MQSenderService");
		
		String message = "Hello Camel";
		
		Map<String, Object>map=new HashMap<String,Object>();
		map.put("header1", "value1");
		
		service.doSend("test1", map, message);
		
		Thread.sleep(5000);
		
		System.exit(0);
	}

}

Test2Queue

package com.bluexmas;

import org.apache.camel.Exchange;
import org.apache.camel.Message;

public class Test2Queue {

	public void doTest(Exchange exchange) {
		System.out.println("-- Test2Queue.doTest ----------------------------");
		
		Message in = exchange.getIn();
		
		System.out.println("body = " + in.getBody());
		System.out.println("header1 = " + in.getHeader("header1"));
		System.out.println("header2 = " + in.getHeader("header2"));
		System.out.println("header3 = " + in.getHeader("header3"));
		System.out.println("header4 = " + in.getHeader("header4"));
	}
	
}

출력결과

-- Test1Queue.doTest ----------------------------
body = Hello Camel
header1 = value1
header2 = null
header3 = [list1, list2]
header4 = Header1Object [age=10, name=bluexmas]
-- Test2Queue.doTest ----------------------------
body = Hello Camel
header1 = value1-1
header2 = value2
header3 = null
header4 = null
Hello Camel

설명

Camel에서 기본적으로 Header의 내용은 Queue 넘어 갈때 초기화 되는데, 
초기화 하지 않고, 그대로 데이터를 가지고 다니려면 preserveMessageQos=true 해주면 된다.

출력결과를 보시면 알 수 있듯이 기본 자료형외에 객체는 전달 할 수가 없는 것으로 판단된다.

header1 : 초기에 전달된 Header의 값으로 그 값을 변경했을때 변경된 값이 전달되는 것을 확인
header2 : 초기에 전달되지 않았으나 추가로 Header에 추가된 값으로 Queue 이동 후 값이 존재하는 것을 확인
Header3 : ArreyList에 기본형 데이터(String) 추가해서 Header에 추가해서 전달했으나 List 전달되지 않는 것으로 확인
Header4 : 사용자가 임으로 만들 객체를 Header에 추가 했으나 Queue 이동 후 값이 전달되지 않는 것으로 확인

728x90
728x90

출처 : Mysql_fetch_row 와 Mysql_fetch_array 차이

나누기 몫, 나머지

$num = floor(10 / 3); // 소수점 이하는 버리고 몫만 = 3
$num_1 = 10 % 3; // 나머지 = 1

echo "num = $num / num_1 = $num_1";

mysql_fetch_array : 필드이름으로 데이터 조회

<? 
$connect = mysql_connect('localhost', 'user id', 'password'); 
mysql_select_db("dbname", $connect); 

$query = "select userid, name, tel from user"; 
$result = mysql_query($query, $connect); 
$row = mysql_fetch_array($result); 

echo "$row[userid], $row[name], $row[tel]"; 
?>

DBarray : 함수로 제작

// mysql_fetch_array function
function DBarray($qry) {
	$result = @mysql_query($qry, $connect) or die("Qry Err. : $qry");
	if (mysql_num_rows($result)) { 
	 return mysql_fetch_array($result);
	} else {
	 return 0;
	}
}

PHP Inline IF

$page_max = floor($recode_count / $page_count) + ( ($recode_count % $page_count) > 0 ? 1 : 2);
$current_page = ($page == NULL ? 1 : $page);

Database 레코드 개수 만큼 조회

$result_row = DBquery("select * from gcm_table");

while($row = mysql_fetch_array($result_row)) {
	$data = $row['userid'];
    echo $data."<br />";
}

PHP - DB조회 레코드 개수 만큼 JSON 배열에 담기

$offset = ($current_page - 1) * $page_count;
$result_row = DBquery("select * from gcm_table limit 15 offset $offset");

$data_array = array();
while($gmc_row = mysql_fetch_array($result_row)) {
	$arr = array(
	  'id' => $gmc_row[id], 
	  'reg_id' => $gmc_row[reg_id], 
	  'phone_num' => $gmc_row[phone_num], 
	  'user_idx' => $gmc_row[user_idx], 
	  'userid' => $gmc_row[userid], 
	  'writeday' => $gmc_row[writeday], 
	  'use' => $gmc_row['use'] 
	);	
	array_push($data_array, $arr);
}
echo json_encode($data_array);
728x90
728x90

출처 : Swiftでアニメーションとタイマーを使ってみた
Swift for UIButton addTarget
viewDidLoad 와 viewWillAppear의 차이

ViewController.swift 최초 기본 코드

//
//  ViewController.swift
//  CreateLabel
//
//  Created by test on 2014. 6. 5..
//  Copyright (c) 2014년 test. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

UILabel class내 전역변수로 추가

var label : UILabel = UILabel();

viewDidLoad 함수에 내용 추가

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //var label : UILabel = UILabel();
        label.text = "test";
        label.frame = CGRectMake(50, 50, 100, 50);
        self.view.addSubview(label);
    }

실행

Timer 생성

타이머를 추가해서 1초마다 내용이 수정되는 예제

완성된 코드

//
//  ViewController.swift
//  CreateLabel
//
//  Created by test on 2014. 6. 5..
//  Copyright (c) 2014년 test. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    
    var countNum = 0;
    
    var label : UILabel = UILabel();
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //var label : UILabel = UILabel();
        label.text = "test";
        label.frame = CGRectMake(50, 50, 100, 50);
        self.view.addSubview(label);
        
        // 타이머 생성
        var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("update"), userInfo: nil, repeats: true);
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // 1초마다 호출되는 함수
    func update() {
        label.text = String(countNum);
        countNum++;
    }

}

실행

728x90
728x90

출처 :Welcome to Swift
The Swift Programming Language
The Swift Programming Language(iTunes)
애플 새 개발언어 '스위프트' 이용 10개 팁

변수와 상수

상수 선언 - 키워드 let

let languageName = "Swift"
languageName = "Swift++"
// this is a compile-time error - languageName cannot be changed

변수 선언 - 키워드 var

var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome is now "Bonjour!’

전역 로그 출력

print, println 함수 - 자바의 System.out.print, System.out.println 와 동일한 기능으로 xcode 의 output 창에 출력하는 함수 제공

println("This is a string")
// prints "This is a string

주석

한줄 주석 (Single-line) : forward-slashes (//)

// this is a comment

여러줄 주석 (multiline comments) : 주석 시작 (/*) 주석 끝 (*/)

/* this is also a comment,
but written over multiple lines */

- 작성중 -

Xcode6 설치

Xcode 실행

Create a new Xcode project 선택

Single View Application 선택

Language : Swift 선택

Label, Button Control 추가

Label Control 변수로 등록

Label 이름 등록

Button Touch Down 이벤트 추가

Button 이벤트 이름 등록

Hello World 출력

실행


728x90
728x90

출처 : Delphi Firemonkey 개발자 모임

TestPG.7z

Code

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    FDownPos: TPointF;
    AMouseDownCheck: Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  FMX.Platform;

{$R *.fmx}

procedure TForm1.FormShow(Sender: TObject);
var
  ScreenScale: Single;
  ScreenSvc: IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenSvc)) then
  begin
    ScreenScale := ScreenSvc.GetScreenScale;
  end;

  Image1.Bitmap.Width := Round(Self.Width * ScreenScale);
  Image1.Bitmap.Height := Round(Self.Height * ScreenScale);
  Image1.Bitmap.Clear(TAlphaColorRec.White);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  FDownPos := PointF(X, Y);
  AMouseDownCheck := True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
begin
  if AMouseDownCheck then
  begin
    with Image1.Bitmap.Canvas do
    begin
      BeginScene();
      Stroke.Color := TAlphaColors.Black;
      StrokeThickness := 2;
      DrawLine(FDownPos, PointF(X, Y), 1);
      EndScene;
    end;
    FDownPos := PointF(X, Y);
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  AMouseDownCheck := False;
end;

end.

 

728x90
728x90

출처 : UltraStar Deluxe
Flamefire / Usdx
Re: XE3 + FireMonkeyでScanlineプロパティが消えた?
Bitmap의 Pixel에 접근(TBitmap.Map, TBitmapData)
FFmpeg으로 미디어 스트림 열기 (ver 0.1)
千 Line 으로 비디오플레이어 만들기 1
네이버 건강 서비스 - hello world NHN 개발자 블로그
FMX.Types.TBitmap.Unmap

FireMonkey에서 FFMpeg를 이용해서 이미지 챕쳐 하는 부분을 구현했습니다.
기존에 데이터는 Bitmap의 픽셀단위로 복사해서 구현했는데,
TImageControl 컴포넌트의 Bitamp.TBitmapData에 바로 데이터를 쓰도록 하는 방법을 찾아서,
기존 코드에 불필요한 부분을 제거하고 다시 구현했습니다.

FireMonkey에서 FFMpeg 사용하는 부분도 간단하게 정리했습니다..

파일 포맷과 코덱을 라이브러리 등록

av_register_all();

동영상 파일 읽기

errnum := avformat_open_input(@fFormatContext, Edit1.Text, nil, nil);

스트림 정보 조회

errnum := avformat_find_stream_info(fFormatContext, nil);

비디오, 오디오 스트림 Index 찾기

  for i := 0 to fFormatContext.nb_streams-1 do
  begin
    Stream := PPAVStream(PtrUInt(fFormatContext.streams) + i * Sizeof(pointer))^;

    if (Stream.codec.codec_type = CODEC_TYPE_VIDEO) and
       (FirstVideoStream < 0) then
    begin
      FirstVideoStream := i;
    end;

    if (Stream.codec.codec_type = CODEC_TYPE_AUDIO) and
       (FirstAudioStream < 0) then
    begin
      FirstAudioStream := i;
    end;
  end;

Codec 찾기

fCodec := avcodec_find_decoder(fCodecContext^.codec_id);

Codec 열기

errnum := avcodec_open2(fCodecContext, fCodec, nil);

동영상 정보 출력

  Memo1.Lines.Add('Found a matching Codec: '+ fCodecContext^.Codec.Name + sLineBreak +
    sLineBreak +
    '  Width = '+inttostr(fCodecContext^.width) +
    ', Height='+inttostr(fCodecContext^.height) + sLineBreak +
    '  Aspect    : '+inttostr(fCodecContext^.sample_aspect_ratio.num) + '/' +
                     inttostr(fCodecContext^.sample_aspect_ratio.den) + sLineBreak +
    '  Framerate : '+inttostr(fCodecContext^.time_base.num) + '/' +
                     inttostr(fCodecContext^.time_base.den));

Bitmap 객체 생성, TBitmapData

    ImageControl1.Bitmap := TBitmap.Create(fCodecContext^.width, fCodecContext^.Height);
    ImageControl1.Bitmap.Map(TMapAccess.maWrite, FBmpData);

AVPicture 구조체에 TImageControl.Bitmap의 버퍼와 연결

  errnum := avpicture_fill(PAVPicture(fAVFrameRGB), FBmpData.Data, PIXEL_FMT_FFMPEG,
      fCodecContext^.width, fCodecContext^.height);

파일에서 데이터를 읽기

errnum := av_read_frame(fFormatContext, AVPacket);

디코딩된 YUV 데이터 얻기

avcodec_decode_video2(fCodecContext, fAVFrame, frameFinished, @AVPacket);

색상 공간 변환

errnum := sws_scale(fSwScaleContext, @fAVFrame.data, @fAVFrame.linesize,
                0, fCodecContext^.Height,
                @fAVFrameRGB.data, @fAVFrameRGB.linesize);

Finalizes the customizing session of the current bitmap.

ImageControl1.Bitmap.Unmap(FBmpData);

Mac

Windows

Android

 

728x90
728x90

출처 : [FFmpeg]FFmpegをVisualStudioでコンパイル→デバッグする
Guide : How to compile ffmpeg under Windows7 and VS2012
msinttypes(ISO C9x compliant stdint.h and inttypes.h for Microsoft Visual Studio)
libav/c99-to-c89
FFmpeg 소스 빌드
FFMPEG build for Windows & VS2010 (ffmpeg 빌드)
the MinGW + MSYS environment

MinGW설치

mingw-get-setup.exe 다운로드

Path 추가

C:\MinGW\bin
C:\MinGW\msys\1.0\bin

Git 설치

http://msysgit.github.io/

Path 추가

C:\Program Files (x86)\Git\bin

yasm 설치 다운로드

vsyasm-1.2.0-win64.zip 파일을 받아 압축을 풀고,
vsyasm.exe 파일을 C:\MinGW\msys\1.0\bin 폴더에 복사

C:\MinGW\msys\1.0\msys.bat 수정

call "C:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/vcvarsall.bat"
set path=C:/MinGW/bin;C:/MinGW/msys/1.0/bin;%path%

link.exe 이름 변경

D:\MinGW\msys\1.0\bin\link.exe와 msvc의 link.exe 이름이 동일해서
D:\MinGW\msys\1.0\bin\link.exe 파일명을 변경해야 컴파일 가능 (-> _link.exe)

pkg-config 설치 glib_2.28.1-1_win32.zip pkg-config_0.23-3_win32.zip

c99-to-c89 https://github.com/libav/c99-to-c89/downloads, ftp://ftp.videolan.org/pub/contrib/c99-to-c89/1.0.1/win32/


MSYS Shell 실행

C:\MinGW\msys\1.0\msys.bat 

 FFmpeg 소스 빌드

 

 - 작성중 -


728x90

+ Recent posts