Search

'2017/05'에 해당되는 글 6건

  1. 2017.05.27 Swift tip
  2. 2017.05.22 Raspberry PI -무선랜카드 AP모드로 사용하기 (1)
  3. 2017.05.20 swift 기본문법
  4. 2017.05.08 java - mysql jdbc 연결
  5. 2017.05.05 Maven - Spring 설정
  6. 2017.05.05 Maven 설치

Swift tip

Programming/Swift 2017.05.27 10:48 Posted by 파란크리스마스

Optional

출처 : 옵셔널 (Optional)

//: Playground - noun: a place where people can play

import UIKit

var email: String?
print(email) // nil

nickname = "bluexmas"
print(nickname) // Optional("bluexmas")

var str = "Hello, playground"

var name:Optional<string> = "name"
var name2:String? = "name2"

var name4:ImplicitlyUnwrappedOptional<string> = "name4";
var name3:String! = "name3"

print() name2 값이 nil 아니면 name2값 출력, name2의 값이 nil 및 경우 ?? 뒤에 있는 값 출력

if name != nil {
    print(name!)
}

if val n = name {
    print(n)
}

if let n = name {
    print(n)
}

var text1:String = "abc"
Int(test1)  // nil


var test:String = "123"
print(Int(test)! + 10)

nil 전달 함수

	var lampOn:Bool? = false
	
	func lampOnOffRemove(isOn : Bool?) {
		if let onOff = isOn {
			self.lampOn = onOff
			self.lampImageView.image = UIImage(named : onOff ? "lamp-on.png" : "lamp-off.png")
		} else {
			self.lampOn = nil
			self.lampImageView.image = UIImage(named : "lamp-remove.png")
		}
	}

	@IBAction func lampOffClicked(_ sender: AnyObject) {
		if lampOn! { // <-- 컴파일시 느낌표(!) 있어야 컴파일이 되고, 값이 nil 인 경우 런타임시 오류 발생
			//
		} else {
			//
		}
	}

WebView HTML 문자열 로딩

	@IBAction func HTMLClicked(_ sender: AnyObject) {
		let htmlString = "

HTML String

String 변수를 이용한 웹페이지

애플 홈페이지로 이동

" webView.loadHTMLString(htmlString, baseURL: nil) }

WebView HTML 파일 로딩

	func loadPageWithUrlString(urlString : String) {
		if let url = URL(string : urlString) {
			webView.loadRequest(URLRequest(url: url))
		}
	}
		
	@IBAction func fileClicked(_ sender: AnyObject) {
		if let path = Bundle.main.path(forResource: "Sample", ofType : "html") {
			loadPageWithUrlString(urlString: path)
		}
	}

WebView Delegate

class ViewController: UIViewController, UIWebViewDelegate {

	@IBOutlet weak var webView: UIWebView!
	@IBOutlet weak var loadingIndicator: UIActivityIndicatorView!
	
	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view, typically from a nib.
		self.webView.delegate = self
	}
	
	public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool
	{
		guard let urlString = request.url?.absoluteString else {
			return true;
		}
		
		print(request.url?.absoluteString ?? "")
		
		if urlString.contains("daum.net") {
			return false;
		}
		
		return true;
	}
	
	public func webViewDidStartLoad(_ webView: UIWebView)
	{
		loadingIndicator.startAnimating()
	}
	
	public func webViewDidFinishLoad(_ webView: UIWebView)
	{
		loadingIndicator.stopAnimating()
	}
	
	public func webView(_ webView: UIWebView, didFailLoadWithError error: Error)
	{
		print(error.localizedDescription)
		loadingIndicator.stopAnimating()
	}

포커스 이동

		// 텍스트필드 컨트롤에 포커서를 줘서 키패드가 자동으로 올라오도록 함
		self.urlTextField.becomeFirstResponder()

Objective-C main 함수

출처 : The App Life Cycle

//
//  main.m
//  study2
//
//  Created by Mac on 2017. 5. 27..
//  Copyright © 2017년 Mac. All rights reserved.
//

#import <uikit uikit.h="">
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
	@autoreleasepool {
	    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
	}
}

UIImageView 확대

	@IBAction func OnBtnScaleClick(_ sender: UIButton) {
		imgLamp.frame.size.width *= 1.2
		imgLamp.frame.size.height *= 1.2
	}

형변환

	@IBAction func typeCast(_ sender: AnyObject) {
		if let tmpButton = sender as? UIButton {
			tmpButton.setTitle("확대2", for: .normal)
		}
	}

loadImage 함수 구현

	func loadImage(fileName : String, fileType : String) -> UIImage? {
		if let path = Bundle.main.path(forResource: fileName, ofType: fileType) {
			return UIImage(contentsOfFile : path)
		} else {
			return nil;
		}
	}

	@IBAction func OnRadio1Change(_ sender: UISwitch) {
		imgLamp.image = loadImage( fileName : sender.isOn ? "lamp_on.png" : "lamp_off.png", fileType : "png" )
	}

TextField Delegate

	public func textFieldShouldReturn(_ textField: UITextField) -> Bool // called when 'return' key pressed. return NO to ignore.
	{
		loadPageWithUrlString(urlString: urlTextField.text ?? "")
		
		// 포커스 해지
		view.endEditing(true)
		
		return true;
	}

배열추가, String format, 이미지 변경

	var flowerArray = [String]()

	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view, typically from a nib.
		
		for i in 1...6 {
			flowerArray.append( String(format : "%02d.png", i))
		}
	}

	@IBAction func onBtnNextClick(_ sender: UIButton) {
		if sender.currentTitle == "이전" {
			current_img_index -= 1
		} else {
			current_img_index += 1
		}
		
		if current_img_index >= flowerArray.count {
			current_img_index = 0
		}
		
		if current_img_index < 0 {
			current_img_index = flowerArray.count - 1
		}
		
		imgLamp.image = UIImage(named : flowerArray[current_img_index])
	}

Timer

		// 1초에 한번씩 호출
		Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {
			(timer) -> Void in
//			NSLog("%G", #function)
			
			let dateFormatter = DateFormatter()
			dateFormatter.dateFormat = "yyyy M d HH:mm:ss"
			
			
			self.lblCurrentTime.text = "현재시간 : " + dateFormatter.string(from : Date())
		})

UIAlertController

	override func viewDidAppear(_ animated: Bool) {
		/*
		let messageBox = UIAlertView(title : "알림", message : "메시지", delegate : nil, cancelButtonTitle : "OK")
		messageBox.show()
		*/

		let messageBox = UIAlertController(title: "알림", message: "메시지", preferredStyle: .alert)
		messageBox.addAction(UIAlertAction(title : "OK", style : .default, handler : {
			(action) -> Void in
			print("OK 선택")
			
		}))
		
		messageBox.addTextField(configurationHandler: {
			(textfield) in
			textfield.backgroundColor = UIColor.yellow
		})
		
		present(messageBox, animated : true, completion : nil)
	}

picker

import UIKit

class ViewController: UIViewController,  UIPickerViewDataSource, UIPickerViewDelegate {
	
	@IBOutlet weak var imagePickerView: UIPickerView!
	@IBOutlet weak var selectedItemLable: UILabel!
	@IBOutlet weak var selectedImageView: UIImageView!
	
	var mArray = [String]()

	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view, typically from a nib.
		
		
		imagePickerView.dataSource = self
		imagePickerView.delegate = self
		
		for i in 1...6 {
			mArray.append(String(format: "%02d", i))
		}
	}

	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
		// Dispose of any resources that can be recreated.
	}
	
	
	// picker 열의 개수
	public func numberOfComponents(in pickerView: UIPickerView) -> Int {
		return 1
	}
	
	// picker 행의 개수
	public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
		
		return mArray.count;
	}
	
	/*
	func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
		
		return mArray[row]
	}*/
	
	// picker 행의 높이 설정
	public func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
	{
		return 100;
	}
	
	// picker 행을 이미지로 표시
	public func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView
	{
		let imageView = UIImageView(frame:CGRect(x:0, y:0, width:100, height:100));
		imageView.image = UIImage(named : mArray[row])
		return imageView
	}
	
	// 선택이벤트
	public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
		selectedItemLable.text = "선택 = " + mArray[row]
		selectedImageView.image = UIImage(named : mArray[row])
	}
}

이미지 비동기 로딩

       if let urlString = movieArray[indexPath.row].thumbnailUrl,
            let url = URL(string : urlString)
        {
            do {
                /*
                // 동기방식
                let imageData = try Data(contentsOf: url)
                cell.thumbnailImageView.image = UIImage(data : imageData)
                */
            } catch {
                
            }
            
            // 비동기방식
            let task = URLSession.shared.dataTask(with: url) {
                (data, response, error) -> Void in
                
                if let imageData = data {
                    DispatchQueue.main.async {
                        cell.thumbnailImageView.image = UIImage(data : imageData)
                    }
                }
            }
                
            task.resume()
        }
저작자 표시
신고

Raspberry PI -무선랜카드 AP모드로 사용하기

OS/Raspberry Pi 2017.05.22 23:31 Posted by 파란크리스마스

Raspberry PI -무선랜카드 AP모드로 사용하기

출처 : Using your new Raspberry Pi 3 as a WiFi access point with hostapd
라즈베리파이 활용강좌 : 라즈베리파이를 무선공유기(AP)로 활용하기 |
SETTING UP A RASPBERRY PI AS AN ACCESS POINT IN A STANDALONE NETWORK

최신으로 업데이트

$ sudo apt-get update;sudo apt-get upgrade -y

AP 관련 패키지 설치

$ sudo apt-get install hostapd bridge-utils iw
$ sudo apt-get install dnsmasq

wlan0 고정 아이피 설정

$ sudo vi /etc/dhcpcd.conf

아래 내용 하단에 추가

denyinterfaces wlan0

Network 설정 파일 백업하고 수정

$ sudo cp /etc/network/interfaces /etc/network/interfaces.bak
$ sudo vi /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.0.1
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.0.255
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

wlan 다시 시작

$ sudo service dhcpcd restart
$ sudo ifdown wlan0
$ sudo ifup wlan0

DHCP 서버 설정

$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
$ sudo vi /etc/dnsmasq.conf

interface=wlan0      # Use interface wlan0
listen-address=192.168.0.1 # Explicitly specify the address to listen on
bind-interfaces      # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8       # Forward DNS requests to Google DNS
domain-needed        # Don't forward short names
bogus-priv           # Never forward addresses in the non-routed address spaces.
dhcp-range=192.168.0.2,192.168.0.20,255.255.255.0,24h # Assign IP addresses between 192.168.0.2 and 192.168.0.20 with a 24 hour lease time

hostapd.conf 파일 생성

$ sudo vi /etc/hostapd/hostapd.conf

# This is the name of the WiFi interface we configured above
interface=wlan0

# Use the nl80211 driver with the brcmfmac driver
driver=nl80211

# This is the name of the network
ssid=Pi3-AP

# Use the 2.4GHz band
hw_mode=g

# Use channel 6
channel=6

# Enable 802.11n
ieee80211n=1

# Enable WMM
wmm_enabled=1

# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

# Accept all MAC addresses
macaddr_acl=0

# Use WPA authentication
auth_algs=1

# Require clients to know the network name
ignore_broadcast_ssid=0

# Use WPA2
wpa=2

# Use a pre-shared key
wpa_key_mgmt=WPA-PSK

# The network passphrase
wpa_passphrase=raspberry

# Use AES, instead of TKIP
rsn_pairwise=CCMP

default hostapd 파일 수정

$ sudo vi /etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

서비스 다시 시작

$ sudo service hostapd start  
$ sudo service dnsmasq start
저작자 표시
신고

swift 기본문법

Programming/IOS 2017.05.20 12:56 Posted by 파란크리스마스

swift 기본문법

//: Playground - noun: a place where people can play

import UIKit

// var str:String ="Hello, playground"
var str = "Hello, playground"
str = "Hello, "

//
let myName = "bluexmas"

// char 타입
let lastName:Character = "류"

// int 타입
let age = 38

// boolean 타입
let isAult = true

print(isAult ? "성인" : "어린이")

// 범위연산자
for i in 1...5 {
    print(i)
}

// 자료형
print(Int.max)
print(Int8.max)
print(Int16.max)
print(UInt.max)

let num:Int8 = 10

let pi = 3.14159

// 자동 형변환 없음
//print(myName + age)
print(myName + String(age))

print("\(myName) 나이는 \(age)")

// 숫자형도 형변환이 없으면 더할수 없음
print(Double(num) + pi)

// 조건문
if str == "한글" {
    print("참")
} else if str == "play" {
    print("play도 아니다.")
} else {
    print("거짓")
}

if str != "최현택" && age == 38 {
    print("최현택은 아니지만 나이는 같다.")
}

// in line 
isAult ? print("성인") : print("청소년")


// switch
switch age {
case 0..<20:
    print("청소년")
case 20..<30:
    break // switch 를 빠져나감
case 30..<40:
    print("30대")
    fallthrough // break 와 다르게 이하  case 조건 실행
default:
    print("성인")
}

// 문자열 switch
switch lastName {
case "김", "이", "박":
    print("김이박")
default:
    print("test")
}

// 배열
let nameArray:[String] = ["추신수", "박찬호"]

var i = 1
var sum = 0
while i<=10 {
    sum += i
    i += 1
    print(sum)
}

구구단 출력

// 구구단
for i in 2...9 {
    print("\n \(i) 단\n")
    for j in 1...9 {
        print("\(i) * \(j) = \(i*j)")
    }
}

배열

// 배열
var arrray2:Array<string> = ["java", "c#", "delphi"]
var nameArray:[String] = ["java", "c#", "delphi"]

// 추가
nameArray.append("javascript")

// 삽입
nameArray.insert("sql", at: 2)

// 제거
nameArray.remove(at: 1)

print(nameArray)

// 대치
nameArray[0] = "자바"

// 출력
for i in 0...2 {
    print(nameArray[i])
}

// 배열의 Count
print("배열의 Count = \(nameArray.count)")

// 일부만 출력
print(nameArray[0...1])

// 전부 삭제
nameArray.removeAll()

Dictionary

// Dictionary
var capitalDic2:Dictionary<string, string=""> = ["한국" : "서울", "영국" : "런던", "미국" : "워싱턴"]
var capitalDic = ["한국" : "서울", "영국" : "런던", "미국" : "워싱턴"]
print(capitalDic["한국"])    // Optional("서울")

for capital in capitalDic.values {
    print(capital)
}

for (country, capital) in capitalDic {
    print("\(country)  국가의 수도는 \(capital)")
}

// 추가
capitalDic["중국"] = "배이징"
print(capitalDic)

// 삭제1
capitalDic.removeValue(forKey: "미국")
print(capitalDic)

// 삭제2
capitalDic["중국"] = nil
print(capitalDic)

// 전부삭제
capitalDic.removeAll()
print(capitalDic)

함수

// 함수
func printStr() {
    print(str)
}

func sum(lns : Int, rhs : Int) -> Int {
    return lns + rhs
}

print( sum(lns: 5, rhs: 3) )

튜플(Tuple)

// 튜플(Tuple)
func getMyInfo() -> (String, Int, String, String) {
    return ("블루", 10, "010-xxx-xxxx", "bluexmas@tistory.com")
}

let (name, age, phone, email) = getMyInfo()
print(name)
print(age)
print(phone)
print(email)

구조체

클래스와 다르게 구조체는 기본 자료형(int, boolean)처럼 대입시 별도의 메모리가 할당 되고, 클래스처럼 상속을 받을 수 없습니다.

// 구조체
struct UserInfo {
    var name : String
    var age : Int
    var email : String
    
    // swift 제고 초기화 함수
    init(name : String, age : Int, email : String) {
        self.name = name
        self.age = age
        self.email = email
    }
    
    func showInfo() {
        print("이름 : \(name), 나이 : \(age) 메일주소 : \(email)")
    }
}

var userInfo1 = UserInfo(name : "블루", age : 10, email : "bluexmas@tistyory.com")
var userInfo2 = UserInfo(name : "레드", age : 10, email : "bluexmas@tistyory.com")
userInfo1.showInfo()

var userArray:[UserInfo] = []
userArray.append(userInfo1)
userArray.append(userInfo2)

for info in userArray {
    info.showInfo()
}
저작자 표시
신고

java - mysql jdbc 연결

Programming/Java 2017.05.08 11:00 Posted by 파란크리스마스

출처 : 초보개발자 이야기. :: JAVA : JDBC를 사용하여 MySQL 과 연동하기 ...

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class MySQLJDBCTest {
	
	public static void main(String [] args) throws Exception {
		
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://bluexmas.tistory.com:3306/test_db", "test", "test");
			System.out.println("connection = " + conn);
			
			// 
			stmt = conn.prepareStatement("SHOW DATABASES");
			rs = stmt.executeQuery();
			
			//
			ResultSetMetaData rsmd = rs.getMetaData();
			int cols = rsmd.getColumnCount();
			System.out.printf("The query fetched %d columns\n",cols);
			System.out.println("These columns are: ");
			for (int i=1;i<=cols;i++) {
				String colName = rsmd.getColumnName(i);
				String colType = rsmd.getColumnTypeName(i);
				System.out.println(colName+" of type "+colType);
			}
			
			//
			while (rs.next()) {
				String str = rs.getNString(1);
				System.out.println(str);
			}
		} catch (SQLException sqex) {
			System.out.println("SQLException: " + sqex.getMessage());
			System.out.println("SQLState: " + sqex.getSQLState());
		} finally {
			if (rs != null) try { rs.close(); } catch (SQLException e) { }
			if (stmt != null) try { stmt.close(); } catch (SQLException e) { }
			if (conn != null) try { conn.close(); } catch (SQLException e) { }
		}
	}

}
저작자 표시
신고

Maven - Spring 설정

Programming/Java 2017.05.05 19:55 Posted by 파란크리스마스

Maven - Spring 설정

Properties 추가

[Properties]항목에서 [Create]버튼을 선택해서 아래와 같이 입력하고 [OK]버튼을 선택

Name : org.springframework-version
Value : 4.1.7.RELEASE

Dependencies 추가

groupId : org.springframework
artifactId : spring-context
version : ${org.springframework-version}

저작자 표시
신고

Maven 설치

Programming/Java 2017.05.05 18:15 Posted by 파란크리스마스

Maven 설치

출처 : MAVEN 설치 및 Eclipse 연동하기 - FREESTROKES' Develog - Tistory

Maven 다운로드

Maven 다운로드 사이트에서 최신 Maven 파일(apache-maven-3.5.0-bin.zip)을 다운받아 적당한 폴더에 압축을 푼다. 

환경설정

환경 변수 MAVEN_HOME 를 설정

Maven의 bin 폴더 Path에 추가

환경변수 path 항목에 구분자(;) 와 함께 추가 %MAVEN_HOME%\bin 추가

JDK 설치후 JAVA_HOME 설정

Maven 설치 확인

명령 프롬프트에서 mvn --version 실행

Eclipse Maven 설정

Maven 설정 변경 (옵션)

%MAVEN_HOME%\conf\settings.xml 파일을 C:\spring\maven 폴더에 복사

복사한 settings.xml 수정 - localRepository 주석을 제거하고 적당한 폴더 설정

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  -->
  <localRepository>C:/spring/maven/repository</localRepository>

eclipse - maven user settings

이클립스 프로젝트 Maven 연동

출처 : HunIT Blog :: Eclipse〃이클립스에 메이븐(Maven) 연동 및 환경설정


저작자 표시
신고


 

티스토리 툴바