반응형
// 사용 방법
let url = URL(string:"https://www.test.com/myconmand?param1=ASDF&param2=1234")!
let qParams = url.queryParams().toJsonString()
let param2 = url.valueOf("param2")

print(
    """
    scheme      = \(url.scheme ?? "")
    host        = \(url.host ?? "")
    path        = \(url.path)
    query       = \(url.query ?? "")
    qParams     = \(qParams)
    param2      = \(param2 ?? "")
    """
)

// 결과 
scheme      = https
host        = www.test.com
path        = /myconmand
query       = param1=ASDF&param2=1234
qParams     = {"param1":"ASDF","param2":"1234"}
param2      = 1234
extension URL {
    
    func queryParams() -> [String:Any] {
        let queryItems = URLComponents(url: self, resolvingAgainstBaseURL: false)?.queryItems
        let queryTuples: [(String, Any)] = queryItems?.compactMap{
            guard let value = $0.value else { return nil }
            return ($0.name, value)
        } ?? []
        return Dictionary(uniqueKeysWithValues: queryTuples)
    }
    
    func valueOf(_ queryParamaterName: String) -> String? {
        guard let url = URLComponents(string: self.absoluteString) else { return nil }
        return url.queryItems?.first(where: { $0.name == queryParamaterName })?.value
    }
    
}
extension Dictionary {

    func toJsonData() -> Data {
        var jsonData: Data?
        do {
            jsonData = try JSONSerialization.data(withJSONObject: self, options: .init(rawValue: 0))
        } catch {
            print(error)
        }
        return jsonData!
    }

    func toJsonDataPrettyPrinted() -> Data {
        var jsonData: Data?
        do {
            jsonData = try JSONSerialization.data(withJSONObject: self, options: JSONSerialization.WritingOptions.prettyPrinted)
        } catch {
            print(error)
        }
        return jsonData!
    }
    
    func toJsonString() -> String {
        return toJsonData().toString()
    }
    
    func toPrettyPrintedJsonString() -> String {
        return toJsonDataPrettyPrinted().toString()
    }
    
}
extension Data {
    func hexString() -> String {
        return map { String(format: "%02hhx", $0) }.joined()
    }
    
    func toString() -> String {
        return String(data: self, encoding: String.Encoding.utf8)!
    }
}

 

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법 

반응형

'개발 > iOS' 카테고리의 다른 글

SceneDelegate 포인터 구하기  (0) 2021.01.05
앱 호출 (URL scheme)  (0) 2021.01.05
디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
bundle id 알아내기  (0) 2020.12.14
UIViewController 스위칭  (0) 2020.12.11
블로그 이미지

SKY STORY

,
반응형

일반적으로 많이 사용되는 Code 128 바코드 체크비트 내용에 대해 알아보자.

CODE 128은 전체 ASCII 128 문자를 모두 표현할 수 있는 연속형 심벌로지이며, 수치 데이터는 심벌 문자당 두 자리로 표현한다. 1981년 Computer Identics Corp. 사에서 개발한 CODE 128은 현재 UPCSKS EAN등 데이터의 고밀도 표현을 요하는 여러 분야에서 응용, 사용되고 있다. CODE 12I9은 시작과 끝 문자, 변동 가능한 길이의 데이터, 바와 스페이스 두 개 모두에 대한 캐릭터 패리티, 체크 문자, 함수 문자 등으로 구성되어 있으며 인쇄가 보다 용이하며 현재 사용되고 있는 각종 컴퓨터, 프린터에 적당하다. 

CODE 128의 심벌 구조는 좌우측 여백으로 인쇄돼지 않는 영역이 있고, 바코드화된 캐릭터의 연속은 단일한 시작 문자로 시작된다. 바로 옆에 가장 중요한 Most Significant가 오고 체크 문자 그리고 단일한 끝 문자가 온다.

CODE 128의 캐릭터 요소는 8개로 구성되며 각 요소들은 바 또는 바의 부분으로 이루어지면 각 캐릭터는 세 개의 바와 스페이스로 이루어진다. 각각의 바는 짝수 모듈(짝수 패리티)이고 스페이스는 홀수 모듈(홀수 패리티)로 이루어진다. 각 요소들의 폭은 1X, 2X, 3X, 4X의 네 가지로 바의 모듈은 '1'로, 여백의 모듈은 '0'으로 표시된다. 시작 문자는 세 종류의 문자 패턴(A, B, C)이 있으며 끝 문자는 네 개의 바와 세 개의 스페이스, 여기에 두 개의 모듈과 종료 바(2)가 합쳐져 13개의 모듈(13X)로 구성된다. 

CODE 128의 코드 구조는 A, B, C  가지 문자 집합이 있는데 심벌 시작문자가 A로 시작되면 코드 A의 집합으로 정의된다. 심벌의 중간에 전이 문자(shift character)를 사용해 다른 문자 집합으로 옮길 수 있다. 문자 집합 A는 모든 alphanumeric 문자의 특수 문자, 컨트롤 문자를 포함하며 문자 집합 B는 모든 alphanumeric 문자와 특수 문자, 컨트롤 문자를 포함하는데 alphanumeric 문자들의 낮은 경우가 포함된다. 문자 집합 C는 00에서 99까지의 디지트쌍 100개와 특수 문자를 갖는데 문자마다 두 자리를 수치로 표현하므로 데이터의 밀도가 두 배이다. CODE 128에는 문자 집합 선택 문자(A, B, C), 전이 문자, 기능 문자가 모두 특수 문자로 존재하며, 한 개의 심벌 안에서 또는 한 개의 코드 부분 집합에서 다른 코드의 부분 집합으로 변화가 가능하다. 

Code 128 3개의 각각 폭이 다른 검은 바와 흰 바가 조합되어 문자를 표시하는 1차원 바코드. 1981년 컴퓨터 아 이덴틱스사가 개발하였다. 문자 1개는 11 모듈로 구성되어있다. 모든 ASCII 문자를 지원하며 128∼255 범위의 문자도 입력 가능하다.7) Code 128 심벌 폭의 최소화를 위해 동일한 문자를 서로 다른 코드 세 트(코드 세트 A, B, C)의 조합을 통하여 표현하는 알고리즘을 가지고 있다. 심벌의 길이는 정해져 있지 않지만 판독기의 용량을 감안하면 최대 약 48개 문자로 된 데이터를 저장할 수 있다.

참고 원문 :
https://en.wikipedia.org/wiki/Code_128

https://courses.cs.washington.edu/courses/cse370/01au/minirproject/ModusPeons/index.htm

https://www.adams1.com/128code.html

https://www.adams1.com/128table.html

 

Code 128 Structure

 

 

  • Left Quiet Zone
  • Start character 
  • Data characters: any length
  • Checksum: one checksum in modulo 103
  • Stop character 
  • Termination bar
  • Right Quiet Zone

In ISO/IEC 15417 specification, the quiet zone should be at least ten times the width of the narrowest bar/space element. It is mandatory at the left and right side of the barcode.

 

Code 128 Encodable Character Set

  • Code 128 A (Code Set A): 0-9, A-Z, and special characters
  • Code 128 B (Code Set B): 0-9, A-Z, a-z, and special characters
  • Code 128 C (Code Set C): numeric digit pairs 00-99 and three special characters

 

Code 128 Barcode Table Of Characters
(For the complete Code 128 specification, see the Code 128 Page)

The table below shows the three different character sets along with the decimal values of each character, which is used in calculating the Check Character. The final column shows the bar/space pattern for the character. The numbers indicate the number of modules wide the given space or bar is. To get the extended ASCII decimal, add 32 to the decimal value in the first column. There is a nice extended ASCII table here. Please note that Code 128 can only encode the English alphabet.

Value

Code A

Code B

Code C

Pattern

B S B S B S

What ASCII Code Do I Print?

0

SP

SP

00

2 1 2 2 2 2

SP (ASCII 32)

1

!

!

01

2 2 2 1 2 2

! (ASCII 33)

2

"

"

02

2 2 2 2 2 1

" (ASCII 34)

3

#

#

03

1 2 1 2 2 3

# (ASCII 35)

4

$

$

04

1 2 1 3 2 2

$ (ASCII 36)

5

%

%

05

1 3 1 2 2 2

% (ASCII 37)

6

&

&

06

1 2 2 2 1 3

& (ASCII 38)

7

'

'

07

1 2 2 3 1 2

' (ASCII 39)

8

(

(

08

1 3 2 2 1 2

( (ASCII 40)

9

)

)

09

2 2 1 2 1 3

) (ASCII 41)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

10

*

*

10

2 2 1 3 1 2

* (ASCII 42)

11

+

+

11

2 3 1 2 1 2

+ (ASCII 43)

12

,

,

12

1 1 2 2 3 2

, (ASCII 44)

13

-

-

13

1 2 2 1 3 2

- (ASCII 45)

14

.

.

14

1 2 2 2 3 1

. (ASCII 46)

15

/

/

15

1 1 3 2 2 2

/ (ASCII 47)

16

0

0

16

1 2 3 1 2 2

0 (ASCII 48)

17

1

1

17

1 2 3 2 2 1

1(ASCII 49)

18

2

2

18

2 2 3 2 1 1

2 (ASCII 50)

19

3

3

19

2 2 1 1 3 2

3 (ASCII 51)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

20

4

4

20

2 2 1 2 3 1

4 (ASCII 52)

21

5

5

21

2 1 3 2 1 2

5 (ASCII 53)

22

6

6

22

2 2 3 1 1 2

6 (ASCII 54)

23

7

7

23

3 1 2 1 3 1

7 (ASCII 55)

24

8

8

24

3 1 1 2 2 2

8 (ASCII 56)

25

9

9

25

3 2 1 1 2 2

9 (ASCII 57)

26

:

:

26

3 2 1 2 2 1

: (ASCII 58)

27

;

;

27

3 1 2 2 1 2

; (ASCII 59)

28

<

<

28

3 2 2 1 1 2

< (ASCII 60)

29

=

=

29

3 2 2 2 1 1

= (ASCII 61)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

30

>

>

30

2 1 2 1 2 3

> (ASCII 62)

31

?

?

31

2 1 2 3 2 1

? (ASCII 63)

32

@

@

32

2 3 2 1 2 1

@ (ASCII 64)

33

A

A

33

1 1 1 3 2 3

A (ASCII 65)

34

B

B

34

1 3 1 1 2 3

B (ASCII 66)

35

C

C

35

1 3 1 3 2 1

C (ASCII 67)

36

D

D

36

1 1 2 3 1 3

D (ASCII 68)

37

E

E

37

1 3 2 1 1 3

E (ASCII 69)

38

F

F

38

1 3 2 3 1 1

F (ASCII 70)

39

G

G

39

2 1 1 3 1 3

G (ASCII 71)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

40

H

H

40

2 3 1 1 1 3

H (ASCII 72)

41

I

I

41

2 3 1 3 1 1

I (ASCII 73)

42

J

J

42

1 1 2 1 3 3

J (ASCII 74)

43

K

K

43

1 1 2 3 3 1

K (ASCII 75)

44

L

L

44

1 3 2 1 3 1

L (ASCII 76)

45

M

M

45

1 1 3 1 2 3

M (ASCII 77)

46

N

N

46

1 1 3 3 2 1

N (ASCII 78)

47

O

O

47

1 3 3 1 2 1

O (ASCII 79)

48

P

P

48

3 1 3 1 2 1

P (ASCII 80)

49

Q

Q

49

2 1 1 3 3 1

Q (ASCII 81)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

50

R

R

50

2 3 1 1 3 1

R (ASCII 82)

51

S

S

51

2 1 3 1 1 3

S (ASCII 83)

52

T

T

52

2 1 3 3 1 1

T (ASCII 84)

53

U

U

53

2 1 3 1 3 1

U (ASCII 85)

54

V

V

54

3 1 1 1 2 3

V (ASCII 86)

55

W

W

55

3 1 1 3 2 1

W (ASCII 87)

56

X

X

56

3 3 1 1 2 1

X (ASCII 88)

57

Y

Y

57

3 1 2 1 1 3

Y (ASCII 89)

58

Z

Z

58

3 1 2 3 1 1

Z (ASCII 90)

59

[

[

59

3 3 2 1 1 1

[ (ASCII 91)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

60

\

\

60

3 1 4 1 1 1

\ (ASCII 92)

61

]

]

61

2 2 1 4 1 1

] (ASCII 93)

62

^

^

62

4 3 1 1 1 1

^ (ASCII 94)

63

_

_

63

1 1 1 2 2 4

_ (ASCII 95)

64

NUL

'

64

1 1 1 4 2 2

` (ASCII 96)

65

SOH

a

65

1 2 1 1 2 4

a (ASCII 97)

66

STX

b

66

1 2 1 4 2 1

b (ASCII 98)

67

ETX

c

67

1 4 1 1 2 2

c (ASCII 99)

68

EOT

d

68

1 4 1 2 2 1

d (ASCII 100)

69

ENQ

e

69

1 1 2 2 1 4

e (ASCII 101)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

70

ACK

f

70

1 1 2 4 1 2

f (ASCII 102)

71

BEL

g

71

1 2 2 1 1 4

g (ASCII 103)

72

BS

h

72

1 2 2 4 1 1

h (ASCII 104)

73

HT

i

73

1 4 2 1 1 2

i (ASCII 105)

74

LF

j

74

1 4 2 2 1 1

j (ASCII 106)

75

VT

k

75

2 4 1 2 1 1

k (ASCII 107)

76

FF

l

76

2 2 1 1 1 4

l (ASCII 108)

77

CR

m

77

4 1 3 1 1 1

m (ASCII 109)

78

SO

n

78

2 4 1 1 1 2

n (ASCII 110)

79

SI

o

79

1 3 4 1 1 1

o (ASCII 111)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

80

DLE

p

80

1 1 1 2 4 2

p (ASCII 112)

81

DC1

q

81

1 2 1 1 4 2

q (ASCII 113)

82

DC2

r

82

1 2 1 2 4 1

r (ASCII 114)

83

DC3

s

83

1 1 4 2 1 2

s (ASCII 115)

84

DC4

t

84

1 2 4 1 1 2

t (ASCII 116)

85

NAK

u

85

1 2 4 2 1 1

u (ASCII 117)

86

SYN

v

86

4 1 1 2 1 2

v (ASCII 118)

87

ETB

w

87

4 2 1 1 1 2

w (ASCII 119)

88

CAN

x

88

4 2 1 2 1 1

x (ASCII 120)

89

EM

y

89

2 1 2 1 4 1

y (ASCII 121

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

90

SUB

z

90

2 1 4 1 2 1

z (ASCII 122)

91

ESC

{

91

4 1 2 1 2 1

{ (ASCII 123)

92

FS

|

92

1 1 1 1 4 3

| (ASCII 124)

93

GS

}

93

1 1 1 3 4 1

} (ASCII 125)

94

RS

~

94

1 3 1 1 4 1

~ (ASCII 126)

95 (Hex 7F)

US

DEL

95

1 1 4 1 1 3

DEL (ASCII 127)

96 (Hex 80)

FNC 3

FNC 3

96

1 1 4 3 1 1

Ç (ASCII 128)

97 (Hex 81)

FNC 2

FNC 2

97

4 1 1 1 1 3

ü (ASCII 129)

98 (Hex 82)

SHIFT

SHIFT

98

4 1 1 3 1 1

é (ASCII 130)

99 (Hex 83)

CODE C

CODE C

99

1 1 3 1 4 1

â (ASCII 131)

100 (Hex 84)

CODE B

FNC 4

CODE B

1 1 4 1 3 1

ä (ASCII 132)

101 (Hex 85)

FNC 4

CODE A

CODE A

3 1 1 1 4 1

à (ASCII 133)

102 (Hex 86)

FNC 1

FNC 1

FNC 1

4 1 1 1 3 1

å (ASCII 134)

 

Value

Start Code

Pattern

B S B S B S

What ASCII Code Do I Print?

103 (Hex 87)

START (Code A)

2 1 1 4 1 2

‡ (ASCII 135)

104 (Hex 88)

START (Code B)

2 1 1 2 1 4

ˆ (ASCII 136)

105 (Hex 89)

START (Code C)

2 1 1 2 3 2

‰ (ASCII 137)

106 (Hex 6A)

STOP (All Codes)

2 3 3 1 1 1 2

Š (ASCII 138)

 

 

Check Digit 계산 방법

ex) "BarCode 1" 에 대한 Code 128 Check Digit계산방법.
시작 코드셋이 START B일 경우 (START A:103, START B: 104, START C: 105)

START B = 104
B = 66 - 32 = 34
a = 97 - 32 = 65
r = 114 - 32 = 82
C = 67 - 32 = 35
o = 111 - 32 = 79
d = 100 - 32 = 68
e = 101 - 32 = 69
   = 32 - 32 = 0
1  = 49 - 32 = 17

// 아래와 같이 자리수 별로 곱을한 값들을 모두 더하고 시작 코드셋 값으로 나눈 나머지 값이 Check Digit이 된다.
Total = 104 + (34x1) + (65x2) + (82x3) + (35x4) + (79x5) + (68x6) + (69x7) + (0x8) + (17x9) = 2093
Check Digit = 2093 mod 104 = 33(A)
                   = 33 + 32 = 65 = 'A' // 최종 출력 값은 32를 더한 값인 65('A')를 출력.

Final message : (START B)BarCode 1(A)(STOP)

 

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

 

 

반응형

'개발 > Note' 카테고리의 다른 글

OpenSSL을 이용한 Key 정보 Text 변환  (0) 2020.12.17
RSA 암복호화  (0) 2020.12.17
PlantUML 설치 (Mac OS X)  (0) 2020.12.11
특수문자 발음  (0) 2020.12.11
Bluetooth UUID  (0) 2020.12.10
블로그 이미지

SKY STORY

,
반응형

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

앱 실행 시 디버깅 정보 접근 차단 처리

아래 클래스는 Objective-C, C 언어로 작성되었고

Swift 프로젝트에 사용되었습니다.

Release 빌드시에만 적용되도록 처리하였습니다. 

//
//  AntiDebug.h
//
//  Created by netcanis on 2020/05/22.
//  Copyright © 2020 netcanis. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AntiDebug : NSObject

+ (BOOL)run;

@end

NS_ASSUME_NONNULL_END

 

//
//  AntiDebug.m
//
//  Created by netcanis on 2020/05/22.
//  Copyright © 2020 netcanis. All rights reserved.
//

#import "AntiDebug.h"
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


////////////////////////////////////////////////////////////////////////
// 배포시 자동으로 안티디버깅 활성화 - 0:디버깅 연결, 1:디버깅 차단
#ifdef DEBUG
#define ANTI_DEBUG      (0) // 개발시 - 디버깅
#else
#define ANTI_DEBUG      (1) // 배포시 - 디버깅 차단
#endif//DEBUG
////////////////////////////////////////////////////////////////////////


//
// Anti Debug 처리
//

#if ANTI_DEBUG

// For debugger_ptrace.
// Ref: https://www.theiphonewiki.com/wiki/Bugging_Debuggers
#import <dlfcn.h>
#import <sys/types.h>

// For debugger_sysctl
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <stdlib.h>

// For ioctl
#include <termios.h>
#include <sys/ioctl.h>

// For task_get_exception_ports
#include <mach/task.h>
#include <mach/mach_init.h>

// For kdebug_signpost
#import <sys/kdebug_signpost.h>

typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);

#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif  // !defined(PT_DENY_ATTACH)

/*!
 @brief This is the basic ptrace functionality.
 @link http://www.coredump.gr/articles/ios-anti-debugging-protections-part-1/
 */
void debugger_ptrace()
{
    void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
    ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
    ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
    dlclose(handle);
}

/*!
 @brief This function uses sysctl to check for attached debuggers.
 @link https://developer.apple.com/library/mac/qa/qa1361/_index.html
 @link http://www.coredump.gr/articles/ios-anti-debugging-protections-part-2/
 */
static bool debugger_sysctl(void)
// Returns true if the current process is being debugged (either
// running under the debugger or has a debugger attached post facto).
{
    int mib[4];
    struct kinfo_proc info;
    size_t info_size = sizeof(info);
    
    // Initialize the flags so that, if sysctl fails for some bizarre
    // reason, we get a predictable result.
    
    info.kp_proc.p_flag = 0;
    
    // Initialize mib, which tells sysctl the info we want, in this case
    // we're looking for information about a specific process ID.
    
    mib[0] = CTL_KERN;
    mib[1] = KERN_PROC;
    mib[2] = KERN_PROC_PID;
    mib[3] = getpid();
    
    // Call sysctl.
    
    if (sysctl(mib, 4, &info, &info_size, NULL, 0) == -1)
    {
        perror("perror sysctl");
        exit(-1);
    }
    
    // We're being debugged if the P_TRACED flag is set.
    
    return ((info.kp_proc.p_flag & P_TRACED) != 0);
}

static bool antiDebug(void)
{
//    // Determine if iOS device is 32- or 64-bit
//    if (sizeof(void*) == 4) {
//        NSLog(@"32-bit App");
//    } else if (sizeof(void*) == 8) {
//        NSLog(@"64-bit App");
//    }
    
    
    // If enabled the program should exit with code 055 in GDB
    // Program exited with code 055.
    debugger_ptrace();
    NSLog(@"Bypassed ptrace()");
    
    // If enabled the program should exit with code 0377 in GDB
    // Program exited with code 0377.
    if (debugger_sysctl())
    {
        //return -1;
        return NO;
    } else {
        NSLog(@"Bypassed sysctl()");
    }
    
    // Another way of calling ptrace.
    // Ref: https://www.theiphonewiki.com/wiki/Kernel_Syscalls
    #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
    // 'syscall' is deprecated: first deprecated in iOS 10.0 - syscall(2) is unsupported;
    // please switch to a supported interface.
    // For SYS_kdebug_trace use kdebug_signpost().
    syscall(26, 31, 0, 0);
    NSLog(@"Bypassed syscall()");
    #endif
    
    // Ref: https://reverse.put.as/wp-content/uploads/2012/07/Secuinside-2012-Presentation.pdf
    struct ios_execp_info
    {
        exception_mask_t masks[EXC_TYPES_COUNT];
        mach_port_t ports[EXC_TYPES_COUNT];
        exception_behavior_t behaviors[EXC_TYPES_COUNT];
        thread_state_flavor_t flavors[EXC_TYPES_COUNT];
        mach_msg_type_number_t count;
    };
    struct ios_execp_info *info = malloc(sizeof(struct ios_execp_info));
    kern_return_t kr = task_get_exception_ports(mach_task_self(), EXC_MASK_ALL, info->masks, &info->count, info->ports, info->behaviors, info->flavors);
    NSLog(@"Routine task_get_exception_ports : %d", kr);
    
    for (int i = 0; i < info->count; i++)
    {
        if (info->ports[i] !=0 || info->flavors[i] == THREAD_STATE_NONE)
        {
            NSLog(@"Being debugged... task_get_exception_ports");
        } else {
            NSLog(@"task_get_exception_ports bypassed");
        }
    }
    
    // Another way of figuring out if LLDB is attached.
    if (isatty(1)) {
        NSLog(@"Being Debugged isatty");
    } else {
        NSLog(@"isatty() bypassed");
    }
    
    // Yet another way of figuring out if LLDB is attached.
    if (!ioctl(1, TIOCGWINSZ)) {
        NSLog(@"Being Debugged ioctl");
    } else {
        NSLog(@"ioctl bypassed");
    }
    
    // Everything above relies on libraries. It is easy enough to hook these libraries and return the required
    // result to bypass those checks. So here it is implemented in ARM assembly. Not very fun to bypass these.
#ifdef __arm__
    asm volatile (
                  "mov r0, #31\n"
                  "mov r1, #0\n"
                  "mov r2, #0\n"
                  "mov r12, #26\n"
                  "svc #80\n"
                  );
    NSLog(@"Bypassed syscall() ASM");
#endif
#ifdef __arm64__
    asm volatile (
                  "mov x0, #26\n"
                  "mov x1, #31\n"
                  "mov x2, #0\n"
                  "mov x3, #0\n"
                  "mov x16, #0\n"
                  "svc #128\n"
                  );
    NSLog(@"Bypassed syscall() ASM64");
#endif
    
    return YES;
}
#endif//ANTI_DEBUG


@implementation AntiDebug

+ (BOOL)run {
#if ANTI_DEBUG
    return antiDebug();
#endif
    return YES;
}

@end

 

//
//  XXX-Bridging-Header.h
//
//  Created by netcanis on 2019/11/25.
//  Copyright © 2019 netcanis. All rights reserved.
//

#ifndef XXX_Bridging_Header_h
#define XXX_Bridging_Header_h

#import "AntiDebug.h"

#endif /* XXX_Bridging_Header_h */

 

//
//  AppDelegate.swift
//
//  Created by netcanis on 2019/11/25.
//  Copyright © 2019 netcanis. All rights reserved.
//

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        guard AntiDebug.run() else {
            return false
        }
        
		... 생략 ...
    
        return true
    }

 

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트

2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로

2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법

반응형

'개발 > iOS' 카테고리의 다른 글

앱 호출 (URL scheme)  (0) 2021.01.05
URL query 파싱 및 json string 변환  (0) 2020.12.17
bundle id 알아내기  (0) 2020.12.14
UIViewController 스위칭  (0) 2020.12.11
웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
블로그 이미지

SKY STORY

,

bundle id 알아내기

개발/iOS 2020. 12. 14. 15:15
반응형

스마트폰 BTC 채굴앱
https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site


iOS기기에 설치된 앱의 bundle id를 알아내는 방법을 알아보자.
직접 개발중이라면 당연히 알 수 있지만 앱스토어에서 설치한 앱의 번들아이디를 얻으려면 어떻게 할까.
물론 탈옥되지 않은 폰으로 말이다.

ipa 파일의 번들아이디를 구할 경우 :

- ipa확장자를 zip으로 변경한 뒤 압축을 푼다.
- 디렉토리 내에 XXX.app파일을 선택하고 우클릭하여 'Show Package Contents' 선택

- 폴더 내 'Info.plist'파일을 열어 원하는 정보를 취득한다.
- bundle id에 대한 키는 'CFBundleURLName'이다.

앱스토어에서 설치한 앱의 경우 :

- Console.app 실행

- 기기를 연결하고 앱을 실행한다.
- 좌측 Devices 목록에서 디바이스 선택
- 우측 상단 검색으로 '(bundle)'라고 입력

- 설치된 앱들의 bundle id중 찾고자 한 앱을 찾는다.


스마트폰 BTC 채굴앱
https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site


2020/12/12 - [AI/Algorithm] - 2D 충돌처리
2020/12/11 - [iOS/Swift] - UIViewController 스위칭
2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)
2020/12/11 - [개발노트] - 특수문자 발음
2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)
2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

반응형

'개발 > iOS' 카테고리의 다른 글

URL query 파싱 및 json string 변환  (0) 2020.12.17
디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
UIViewController 스위칭  (0) 2020.12.11
웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
Fat Static Library 빌드 (2/2)  (0) 2020.12.10
블로그 이미지

SKY STORY

,
반응형

2D 충돌처리

(1) 선과

 -  Line 직선의 방정식을 구함.          
    P = P1 + u(P2 - P1), P' = P3 + v(P4 - P3)

    교차하는 점에선 P == P'이므로,              
    P1 + u(P2 - P1) = P3 + v(P4 - P3)

    각각 x y 대해 정리                          
    x1 + u(x2 - x1) = x3 + v(x4 - x3)
    y1 + u(y2 - y1) = y3 + v(y4 - y3)

    두 식을 이용해, u v 대해 풀어낸다.  
    u = ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3)) / ((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1))
    v = ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3)) / ((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1))

    두 선의 각각의 좌표를 이용해 u v 값을 구할 있음.
    이 u v 0이면 수평, 0 < u < 1이고 0 < v < 1이면 교점이 있는 것임. u v 1보다 크면, 만나지 않는 것임.
구한 u v 직선의 방정식에 대입하면교점의 좌표도 구할 있음.

 

(2) 선과 사각형

 - 사각형의 선분에 대해 선과 충돌을 검사.

float inputRotation = MathHelper.ToRadians(degree);
Rectangle destRect = new Rectangle(200, 200, 200, 200);
Vector2 vOrg = new Vector2(1, 0);

vOrg = Vector2.Transform(vOrg, Matrix.CreateRotationZ(inputRotation));
  
BoundingBox box = new BoundingBox(new Vector3(destRect.Left, destRect.Top, 0.0f),
                                  new Vector3(destRect.Right, destRect.Bottom, 0.0f));
Ray ray = new Ray(new Vector3(vStart, 0.0f), new Vector3(vOrg, 0.0f));

float? result = box.Intersects(ray);

if (result != null && result <= lineLength)
{

   // 충돌

}

 

3D에서 충돌을 감지하는 BoundingBox Ray 2D에서 사용하도록 처리한 것입니다.

3차원을 2차원으로 줄이기 위해 Z 값을 0.0f 설정했구요.

참고로 ray boundingbox 충돌의 결과는 거리가 나오는 데요.

충돌을 하지 않을 경우에는 null 나오고, 충돌을 하면 충돌된 거리가 나옵니다.

 

충돌된 거리가 직선의 길이보다 작아야 충돌로 인지하게 처리하면 끝이 납니다.

 

(3) 선과

 - 원의 중점Pc 에서 (P1->P2) 수직하는 (최단거리) 만든다선과 수선이 만나는 교점이 선의 범위 안에 있으면 충돌

   P = P1 + u(P2 - P1) -> P 교점이라 하면, (Pc - P) dot (P2 - P1) = 0(내적이 0이면 직각)

   식을 풀면 u = (Pc - P1) dot (P2 - P1) / (P2 - P1) dot (P2 - P1)

   u < 0이면, P1 원의 중점으로부터 최단 거리(u == 0 이면 P1 수직인 좌표)

   u > 1이면, P2 원의 중점으로부터 최단 거리(u == 1 이면 P2 수직인 좌표)

   u값을 처음의 식에 대입하면, 교점 P 나옴

   교점 P에서 원의 중점까지의 거리가 원의 반지름보다 작으면 충돌

 

(4) 사각형과 사각형

 - 사각형을 R1 R2라고 했을때, R1 네점이 R2 포함되는지, R2 네점이 R1 포함되는지 검사.

   하나라도 포함되면, 충돌

 

(5) 사각형과

 - 원의 중점에서 사각형의 꼭지점에 대한 거리가, 원의 반지름보다 작거나 같은 점이 하나라도 있으면 충돌

 

(6) 원과

 - 원의 중점간의 거리가 원의 반지름의 합보다 작거나 같으면 충돌.

 

 

직선의 교차점을 구하는 알고리즘

글은 선분의 교차점을 구하는 알고리즘이 작업에 필요해서 작성해둔 글이다. 참고로, 예전에 두선분의 교차점을 구하는 자체가 쉬울 것으로 생각하고 흔히 생각하는 기울기, y 절편을 이용하여 접근하려고 하였다. 이는 상당히 비효율적 방법이였고 조금 효율적인 방법으로 접근하였다


먼저 직선의 방정식으로써, 기울기와 절편으로 나타내지 말고, t 매개변수를 이용해 나타내면 다음과 같다. 

P1 P2 직선의 시작점과 끝점을 나타내며, t 범위는 0에서 1까지이다. (P1, P2에서 1, 2 아래첨자로 생각하기 바란다)

선의 식을 알았으니, 이제 두선의 교점을 구해보는 것으로 응용해보자. 먼저 아래 그림을 보자.

 

 

Line1 P1 P2 이루어져 있으며, Line2 P3 P4 이루어져 있다. 두개의 라인을 식으로 표현해보면 다음과 같다.

 

 

이미 알겠지만, t s 0에서 1부터의 값이며, 두선의 교점은 두선의 공통된 값이므로 P(t) P(s) 같으므로 위의 2개의 식은 아래의 1개의 식으로 나타낼 있다.

 ( 1 - t ) P1 + tP2 = ( 1 - s ) P3 + sP4

 

 

다시 위의 식을 x, y 분리해보면 아래와 같은 두개의 식들로 분리된다.

 

x로 분리  

P1 = x1; P2 = x2; P3 = x3; P4 = x4;

 

(1-t)x1 + tx2 = (1-s)x3 + sx4

x1 - tx1 + tx2 = x3 -sx3 + sx4

x1 + t (x1 + x2) = x3 + s (x4 - x3)

 

y로 분리 

P1=y1; P2 = y2; P3=y3; P4=y4;

y1 + t (y1 + y2) = y3 + s (y4 - y3)

 

 

위의 식을 t s 대해서 정리를 해보면 다음과 같다.

 

 

, 위의 t s 두선이 서로 만날때의 값이므로, 최종적으로 두선의 교점은 다음과 같이 나타낼 있다.

위의 x, y 우리가 구하고자하는 직선의 교점이다

마지막으로 t s 대해 정리해 보도록 하자.


s
t 값이 0 1 사이를 벗어나는 경우, 선은 교차하지 않는다고 판정해야 한다. 그리고 s t 구하는 공식에서 분모가 0 경우 선은 평행하다는 의미이므로 교점은 존재하지 않다. 분모와 분자 모두 0 경우 선은 동일한 선이다.


아래의 코드는 위의 설명을 토대로 작성하였다.

bool checkCross(const CPoint& AP1, const CPoint& AP2, const CPoint& BP1, const CPoint& BP2, CPoint* IP)

{
    double t;

    double s; 

    double under = (BP2.y-BP1.y)*(AP2.x-AP1.x)-(BP2.x-BP1.x)*(AP2.y-AP1.y);

    if(under==0) return false;

    double _t = (BP2.x-BP1.x)*(AP1.y-BP1.y) - (BP2.y-BP1.y)*(AP1.x-BP1.x);

    double _s = (AP2.x-AP1.x)*(AP1.y-BP1.y) - (AP2.y-AP1.y)*(AP1.x-BP1.x); 

    t = _t/under;

    s = _s/under; 


    if(t<0.0 || t>1.0 || s<0.0 || s>1.0) return false;

    if(_t==0 && _s==0) return false; 



    IP->x = AP1.x + t * (double)(AP2.x-AP1.x);

    IP->y = AP1.y + t * (double)(AP2.y-AP1.y);

    return true;
}

 

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

 

반응형

'개발 > AI,ML,ALGORITHM' 카테고리의 다른 글

MNIST 데이터셋 다운로드  (0) 2023.07.19
Neural Network (XOR)  (0) 2022.11.18
Generic algorithm  (0) 2020.05.19
neural network  (0) 2020.05.19
minimax full search example  (0) 2020.05.19
블로그 이미지

SKY STORY

,
반응형

손쉬운 업데이트를 위해 대부분의 회사에서 하이브리드 앱으로 개발을 합니다.

이 과정에 특정 서비스의 경우 웹뷰를 따로 구성해야하는 상황이 발생합니다.

예를들어, AViewController, BViewController와 같이 UIViewController를 상속받는 ViewController를 따로 생성하여 웹뷰를 구성하게 됩니다. 이러한 구성에 따로 생성된 뷰컨트럴러간 스위칭이 필요한 경우가 발생합니다.

+ UINavigationController

   - AViewController

   - BViewController

   - CViewController

위와 같은 경우 마지막에 추가된 CViewController가 화면에 출력됩니다.

UINavigationController의 뷰컨트럴러 배열의 순서를 변경하면 원하는 뷰컨트럴러를 최상단으로 올릴 수 있습니다.

다음은 해당 기능을 구현한 클래스입니다.

extension UINavigationController {
	// 주어진 UIViewController를 제거합니다.
    func removeVC(_ kindClass: AnyClass) {
        self.viewControllers = self.viewControllers.filter {!$0.isKind(of:kindClass)}
    }
    
    // 주어진 UIViewController가 존재하는지 체크
    func containsVC(_ kindClass: AnyClass) -> Bool {
        return self.viewControllers.contains(where: {$0.isKind(of:kindClass)})
    }
    
    // 주어진 UIViewController를 최상위에 출력되도록 합니다.
    func setTopVC(_ kindClass: AnyClass) -> UIViewController? {
        var stack: [UIViewController] = self.viewControllers
        var index: Int = 0
        for vc in stack {
            if vc.isKind(of: kindClass) {
                stack.remove(at: index)
                stack.append(vc)
                self.viewControllers = stack
                return vc
            }
            index += 1
        }
        return nil
    }
    
    // 주어진 UIViewController를 존재하는 경우 최상위에 출력되도록 합니다.
    func activateVC(_ kindClass: AnyClass) {
        if containsVC(kindClass) {
            _ = setTopVC(kindClass)
        }
    }
}

extension UIViewController {
	// 옵져버 추가
    func addObserver(_ aSelector: Selector) {
        NotificationCenter.default.addObserver(self,
                                               selector: aSelector,
                                               name: NSNotification.Name(self.theClassName),
                                               object: nil)
    }
	
    // 옵져버 삭제
    func removeObserver() {
        NotificationCenter.default.removeObserver(self)
    }
    
    // 타깃 뷰컨트럴러로 데이터 전달 
    func post(_ targetClassName: String, _ userInfo: [AnyHashable : Any], _ delay: Double = 0.0) {
        let delayTime: Double = (delay < 0) ? 1.0 : delay
        Timer.scheduledTimer(withTimeInterval: delayTime, repeats: false, block: {_ in
            NotificationCenter.default.post(name: NSNotification.Name(targetClassName),
            object: nil,
            userInfo: userInfo)
        })
    }
}



//
// BViewController
// 

override func viewDidLoad() {
    super.viewDidLoad()
    addObserver(#selector(onCommand))
    ... 중간 생략 ...
}
        
deinit {
    removeObserver()
}

... 중간 생략 ...

@objc func onCommand(notification: Notification) {
    guard notification.name.rawValue == self.theClassName else { return }
    guard let userInfo = notification.userInfo else { return }
    
    let name = userInfo["name"] as? String ?? ""
    if name == "이벤트이름" {
        let paramString = userInfo["data"] as! String
        self.sendScript(name: "이벤트이름", result: paramString)
    }
    else {
        //self.userMethod = name
        //self.userInfo = userInfo["data"] as! Dictionary <String, Any>
    }
}

    

//
// 사용 방법
// : 아래 내용은 CViewController에서 BViewController로 이벤트 데이터를 전달 및 화면 스위칭한다.
//

// BViewController에 이벤트 데이터 정보 전달
post("BViewController", ["name" : "이벤트이름", "data" : "전달할 데이터 정보"])

// 0.5초 딜레이 주어 웹뷰 로딩 시간을 주었다.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
	self.navigationController?.activateVC(BViewController.self)
}

 

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [분류 전체보기] - Tones And I - Dance Monkey

2020/12/11 - [lyrics] - Beyonce - Halo

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

반응형

'개발 > iOS' 카테고리의 다른 글

디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
bundle id 알아내기  (0) 2020.12.14
웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
Fat Static Library 빌드 (2/2)  (0) 2020.12.10
Fat Static Library 빌드 (1/2)  (1) 2020.12.10
블로그 이미지

SKY STORY

,
반응형

시퀀스다이어그램 작업시 자주 사용 중인데 Visual Studio Code에서 사용 중입니다.

물론 플러그인으로 제공되므로 현재 작업중이신 개발툴에 설치 가능합니다.

 

Visual Studio Code 설치
https://code.visualstudio.com/download

Extensions 메뉴 선택 후 ‘PlantUML’ 검색 및 설치

plantuml.jar 다운로드 
https://sourceforge.net/projects/plantuml/files/plantuml.jar/download

brew 설치
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ install/master/install)"

java 설치
brew cask install java

plantuml.jar 파일 로컬 폴더에 복사
mkdir -p /usr/local/Cellar/plantuml && cp ~/Downloads/plantuml.jar /usr/local/ Cellar/plantuml

Graphviz 설치 
http://www.graphviz.org/download/ 
brew install graphviz

숨겨진 파일 보이기
Ctrl + Shift + .

sudo ln -s /usr/local/Cellar/plantuml /usr/local/bin/plantuml

~/.zshrc 파일에 환경 설정
# Add environment variable JAVA_HOME
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/ Home
export PATH=$JAVA_HOME:$PATH

# Add environment variable PLANTUML_JAR
export PLANTUML_JAR=/usr/local/Cellar/plantuml/plantuml.jar export PATH=$PLANTUML_JAR:$PATH

# Add environment variable GRAPHVIZ_DOT export GRAPHVIZ_DOT=/usr/local/bin/dot export PATH=$GRAPHVIZ_DOT:$PATH

 

콘솔창 재실행 후 환경설정 재로드
source ~/.zshrc

저장방법 :
Command + Shift + P
PlantUML: Export Current File Diagram 
선택 png 또는 svg를 선택

 

참고자료 :

가이드 문서 : http://plantuml.com/ko/guide

Apple fonts 다운로드 : https://developer.apple.com/fonts/

 

 

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

 

반응형

'개발 > Note' 카테고리의 다른 글

RSA 암복호화  (0) 2020.12.17
Code 128 Barcode의 Check Digit 계산방법  (0) 2020.12.16
특수문자 발음  (0) 2020.12.11
Bluetooth UUID  (0) 2020.12.10
모바일 앱 메모리덤프 이슈 해결방법  (0) 2020.12.08
블로그 이미지

SKY STORY

,

특수문자 발음

개발/Note 2020. 12. 11. 09:53
반응형

별것 아니지만 중요한 것이죠. 정리해 봅니다.

The english name of special characters

# = pound sign (American English), hash sign (British English)

£ = pound sign (British English)

@ = at sign

$ = dollar sign

% = percent sign

^ = caret [kǽrit]

& = ampersand [ǽmpərsӕnd]

* = asterisk [ǽstərìsk]

~ = tilde [tíldə]

! = exclamation mark [èkskləméiʃən][maːrk]

() = parentheses [pərénðiziz]  -  parenthesis [pərénθisis]

- = hyphen [háifən]

_ = underscore [Λndərskɔ̀ːr---´]

+ = plus sign

= = equals sign

[] = square brackets[brǽkit]

{} = curly brackets (is there something more "official"? braces?)

\ = backslash

/ = slash, solidus  [slæʃ], [sάlidəs]

<> = angle brackets

¶ = paragraph mark, pilcrow sign [pǽrəgrӕf] [pílkrou]

§ = section sign

= copyright sign

= Yen sign [jen]

= cent sign

º = degree symbol, ordinal indicator

× = multiplication sign [mΛltəplikéiʃən] 

÷ = division sign

 

반응형
블로그 이미지

SKY STORY

,