반응형

코틀린에서는 특이한 점이 하나 있다. (물론 내가 c#개발을 했었어서일수도 있다.)

 

int a;
a = 1;
Console.WriteLine(a)

// 1

 

c#에서는 위와같이 int a를 변수명 선언만 한 뒤 a의 값을 나중에 할당해도 된다.

 

하지만 코틀린에서는 에러가 발생한다.

 

 

이를 해결하기 위해 사용하는 키워드가 바로 lateinit / lazy다.

 

 


1. lateinit (kotlin아! 값은 나중에 알려줄께..)

lateinit var name : String

name = "Kim"

println(name)


// Kim

 

위에서 언급한 C#과 파이썬등 여러 언어들과 동일한 방법이다.

lateinit이라는 키워드로 나중에 값을 할당할것이라고 kotlin에게 알려준 뒤,

필요할 때 값을 넣어주는 방법이다.

여기엔 몇가지 제한 조건이 있다.

  • var 변수에만 사용이 가능하다.
    • 당연하다. val 타입은 추후에 값을 못바꾸기 때문에 불가능하다.
  • nullable 자료형을 사용 할 수 없다.
  • 초기화하기 전에 변수를 호출하면 에러가 발생한다.
    • 값이 없는 상태이기에 반환 할 값도, 주소도 없다.
    • 변수명.isInitialized()로 초기화가 되었는지 확인 가능하다.
  • 원시 자료형에는 사용이 불가능하다.
    • Int, Double, Float, Bool 등..

2. lazy (미리 값은 알려주는데 내가 값을 넣으라 할때까지 기다려봐)

val lazyVar : String by lazy {
    println("초기화 되었습니다 1.")
    println("초기화 되었습니다 2.")
    "Lazy 키워드"
}


println(lazyVar)
println("------------")
println(lazyVar)


// 초기화 되었습니다 1.  // 초기화 동작으로 인한 출력
// 초기화 되었습니다 2.  // 초기화 동작으로 인한 출력
// Lazy 키워드          // 초기화 동작으로 인한 출력, "Lazy 키워드" 값이 lazyVar에 할당 / 반환
// ------------
// Lazy 키워드          // lazyVar에 할당된 값 반환

 

lazy는 val만 사용 가능하다.

다시말해 변경 불가한 값이다.

처음 변수를 선언할때 '나중에 호출하면 이런 값을 할당해줘' 라는 방법(혹은 레시피)를 미리 선언해 놓는다.

위의 코드처럼 println()등도 함께 호출 가능하다.

 

변수가 호출되는 시점에 초기화가 진행되면서 lazy블록 안에 있는 코드가 실행되고 "Lazy 키워드"라는 값이 lazyVar에 할당된다.

그리고 이후에 호출이 되면 "Lazy 키워드"만 반환된다.

(위의 출력값에 "초기화 되었습니다. 1", "초기화 되었습니다. 2", "Lazy 키워드"가 나오는 부분은 초기화 되면서 실행된 값들이다.)

(맨 마지막줄 "Lazy 키워드"는 초기화가 완료되었기에 다른 문구 없이 lazyVar에 할당된 값만 출력되게 된다.)  

 

용량이 큰 자료를 데이터값으로 사용해야 할때 프로그램 실행시부터 메모리에 올려놓게되면 메모리의 효율성이 떨어진다.

(10년뒤 사용할 휴지100묶음을 지금부터 방에 놔두는 꼴이 된다.)

그래서 필요시에 할당해 사용하기위해 주문서만 만들어놓고 필요할대 주문해 사용하는 방법인것이다.

반응형
반응형

C#, JAVA등에서는 클래스 안에서 정의된 변수나 매서드들을 객체 생성 없이 사용하는 경우 static을 사용한다.

코틀린도 같은 기능이 있는데 키워드가 다르다.

companion을 사용한다.

 

 

1. Class 정의 (companion object {})

class Person (name:String) {
    companion object{
        val menu = "pizza"
        fun eatDinner(){
            println("$menu is good!")
        }
    }

    val name : String
    init {
        this.name = name
        println(this.name)
    }
}

Person.eatDinner()  // companion으로 선언되어 바로 접근 가능
var pp = Person("ppp")  // companion 밖에 선언되어 객체 생성을 해야 작동

// pizza is good!  // companion
// ppp  // init

 

 

  • 기본 클래스 정의에 companion object를 사용한다.
    • companion object 안에 있는 값들은 정적 변수/매서드가 된다.
    • 일일이 static을 붙일 필요가 없다.
    • static과 일반 class내용을 같이 혼용하여 사용 가능하다.
반응형
반응형

코틀린에는 배열의 종류가 4가지가 있다.

array, list, set, map 네가지를 비교해보자

 

 

1. Array

// Array 선언
var arr = arrayOf("A", "B", "C", "D")

println(arr[0] + "  " + arr[1])
arr[0] = "AAA"
println(arr[0] + "  " + arr[1])

// A  B
// AAA  B
  • 특징 
    • Array 선언시 배열의 크기를 지정해야 한다.
      • 지정된 배열의 크기는 변경 불가하다.
        (python의 list.append(), C#의 list.ㅁdd() 사용 불가)
    • 배열 안의 값을 자유롭게 변경이 가능하다.
      • arr[0] = "AAA"처럼 인덱스값으로 내용 수정 가능
    • 순서를 저장한다.
    • 중복값을 허용한다.

 


2. List

// Immutable List

var imList = listOf<String>("mL-1", "mL-2", "mL-3")
for (a in imList) { println(a)}

// 읽기 전용(immutable)인 리스트의 값을 변경을 시도하기에 에러 발생
// imList[0] = "mL-4"

println("---------------")
for (a in imList) { println(a)}
println("---------------")

// error



// Mutable List

var mList = mutableListOf<String>("mL-1", "mL-2", "mL-3")
for (a in mList) { println(a)}

// mutable 리스트기에 값 변경 가능
mList[0] = "ML-4" // mList.set(0, "mL-4")도 같은 기능

// 리스트 값 추가
mList.add("mL-5")

println("---------------")
for (a in mList) { println(a)}
println("---------------")


// mL-1
// mL-2
// mL-3
// ---------------
// mL-4
// mL-2
// mL-3
// mL-5
// ---------------

 

  • 특징
    • List는 순서를 저장한다.
    • 중복값을 허용한다.
    • List는 두가지 mutable, immutable 두가지로 나뉜다.
      • immutable
        • 기본 값, 읽기전용 (수정 불가)
      • mutable
        • 값 수정 가능
        • 인덱스에 직접 접근하여 값 변경 가능
        • 배열 추가/삭제 가능 (add/remove)
    • List의 단점
      • 메모리에 순서대로 할당되지 않는다.
        • 검색기능 활용시 성능저하가 발생한다.
          (메모리 순서대로 검색이 아니라 각 데이터가 있는 메모리 주소를 찾아들어가 값을 확인하고 다음 주소로 이동해야 하기에 성능 저하가 발생한다)

 


3. Set

// immutable Set
var imSet = setOf(1, 2, 3, 1, 2, 3)
for (a in imSet) { println(a) }

// 1
// 2
// 3
// (중복값은 허용되지 않기에 1, 2, 3 한가지씩 저장된다)


// mutable Set
var mSet = mutableSetOf(1, 2, 3, 1, 2, 3)
for (a in imSet) { println(a) }
println("---------------")
mSet.add(4)
mSet.remove(1)
for (a in imSet) { println(a) }
println("---------------")

// 1
// 2
// 3
// ---------------
// 2
// 3
// 4
// ---------------
// (중복값이 허용되지 않아 1, 2, 3만 할당)
// (mutable이기에 내용 수정 가능 add/remove)
  • 특징
    • List와 같이 immutable / mutable로 나뉜다.
    • 순서를 저장하지 않는다.
    • 중복 값을 허용하지 않는다.

 


4. Map

// immutable Map
var imMap = mapOf("name" to "J", "age" to "13", "country" to "korea")
println(imMap)
println(imMap["name"])

// {name=J, age=13, country=korea}
// J


// mutable Map
var mMap = mutableMapOf("트와이스" to "TT", "아이유" to "내 손을 잡아", "NCT" to "영웅")
mMap.put("QWER", "고민중독")
println("-Put <mMap.put(\"QWER\", \"고민중독\")>")
println(mMap)
mMap.remove("NCT")
println("-Remove <mMap.remove(\"NCT\")>")
println(mMap)
mMap.remove("QWER", "내 이름 맑음")


// -Put <mMap.put("QWER", "고민중독")>
// {트와이스=TT, 아이유=내 손을 잡아, NCT=영웅, QWER=고민중독}
// 영웅
// -Remove <mMap.remove("NCT")>
// {트와이스=TT, 아이유=내 손을 잡아, QWER=고민중독}

 

  • 특징
    • key : value의 쌍으로 저장되는 자료 구조
      • 파이썬의 dictionary와 같은 형식
    • immutable / mutable로 분리됨
    • key값은 중복 불가
    • value값은 중복 가능

 

반응형
반응형

코틀린에서는 다른 언어(python, C# 등)에 있는 switch / case가 없다.

대신 when을 이용하여 분기문을 만든다.

 

 

- Kotlin의 when <kotlin when (switch/case)>


 

1. 기본 when 분기

var classCode : Int = 101

when(classCode){
    101 -> println("경영학개론")
    202 -> println("거시경제학")
    305 -> println("생산관리")
    else -> println("과목이 없습니다.")
}

// 경영학개론

 

기본적 분기문이다.

C#과 형태와 방법이 다르다.

  • C#과 다르게 콜론( : ) 대신에 ->를 사용한다.
  • default 대신 else를 사용한다.
    • default : 위의 분기중 아무것도 해당되지 않는 경우 실행되는 코드
  • 다른 언어들과 달리 break를 넣지 않는다.

 

 


 

2. 범위를 기준으로 나누기

// Example 1

var score = 85
when(score){
    in 0..40 -> println("D 학점입니다.")
    in 41..70 -> println("C 학점입니다.")
    in 71..90 -> println("B 학점입니다.")
    in 91..99 -> println("A 학점입니다.")
    else -> println("A+ 학점입니다.")
}

// B 학점입니다.


// Example 2

var classNo = 4
when(score){
    1, 3, 5 -> println("A팀")
    2, 4, 6 -> println("B팀")
    else -> println("팀이 없습니다.")
}

// B팀

 

  • in을 이용하여 숫자의 범위를 기준으로 삼을 수 있다.
    • 0 .. 40을 입력하면 '0<= 값 <=40'의 의미가 된다.
    • in 0..40, in 70..80 -> "uu" 이런 방식의 사용도 가능하다.
  • 여러 케이스가 하나의 결과를 출력하는 경우 콤마(,)를 이용해서 여러가지 작성이 가능하다. (Example2)
    • 자료형은 Int, String 등 여러 형태가 가능하다.

 


 

3. 간단하게 분기 결과 얻기 (실전 사용편)

// Example 1

var score = 85

var grade = ""
when(score){
    in 0..40 -> grade = "D 학점입니다."
    in 41..70 -> grade = "C 학점입니다."
    in 71..90 -> grade = "B 학점입니다."
    in 91..99 -> grade = "A 학점입니다."
    else -> grade = "A+ 학점입니다."
}
println(grade)

// B 학점입니다.



// Example 2

var score2 = 85

var grade2 = when(score2){
    in 0..40 -> "D 학점입니다."
    in 41..70 -> "C 학점입니다."
    in 71..90 -> "B 학점입니다."
    in 91..99 -> "A 학점입니다."
    else -> "A+ 학점입니다."
}
println(grade2)

// B 학점입니다.

 

  • 다른 언어의 switch와 달리 when은 반환값이 있다.
    • 위의 example1은 C#과 같은 방식으로 grade에 출력할 값을 입력했다.
    • kotlin은 example2처럼 분기 후 when의 return값을 바로 정할 수가 있다.
      따라서 별다른 ' grade = "내용" '이 필요 없이 그냥 "내용"을 입력하면 바로 grade2에 값이 할당된다.
반응형
반응형

 

체크섬 계산 방법

 

체크섬 계산 사이트

https://fasttool.co.kr/Lin/Checksum_Calculator

 

LIN Checksum Calculator

ID 0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0F0x100x110x120x130x140x150x160x170x180x190x1A0x1B0x1C0x1D0x1E0x1F0x200x210x220x230x240x250x260x270x280x290x2A0x2B0x2C0x2D0x2E0x2F0x300x310x320x330x340x350x360x370x380x390x3A0x3B0x3C0x3D0x3E0

fasttool.co.kr

 

 

체크섬 계산은 위의 사이트에서 간단하게 하면 된다.

fasttool.co.kr 체크섬 계산

 

 

 

아래는 계산하는 방법을 가져왔다.

 

 

1. 체크섬

    • LIN 통신에서 데이터의 무결성을 확인을 위한 계산

2. 체크섬의 종류 및 차이

    • Classic
      • 데이터만 검증하는 체크섬
      • 1의 보수를 이용
      • 현재 차량 통신(LIN 2.1 ~ 2.2)에서는 Enhanced(향상된) 체크섬을 사용
      • Classic 계산 방법 확인 링크
    • Enhanced
      • 데이터PID를 검증하는 체크섬
      • 1의 보수를 이용
      • 현재 차량 통신에서 사용

3. Enhanced 체크섬 계산 방법

    • 데이터의 값을 합산
    • 합산한 값에 PID값을 합산
    • 각각의 데이터 합산시 0xFF(255)를 넘는 경우 값에서 0xFF(255)를 뺀뒤 이어서 계산
    • 계산한 값의 1의 보수가 체크섬

4. 계산 예제

    • Example 1
      • ID : 0x22, PID : 0xE2
      • Data : 0x72, 0xA4, 0xF3, 0x3B (DLC 4byte)
        • 데이터 합산
          • 0x72 + 0xA4 = 0x116 (0xFF 보다 크니 0x116 - 0xFF = 0x17)
          • 0x17 + 0xF3 = 0x10A (0xFF 보다 크니 0x10A - 0xFF = 0x0B)
          • 0x0B + 0x3B = 0x46 (0xFF 보다 작으니 Pass)
        • PID 합산 ( PID : 0xE2 )
          • 0x46 + 0xE2 = 0x128 (0xFF 보다 크니 0x128 - 0xFF = 0x29)
        • 0x29의 보수 계산 ( 0b0010_1001을 반전 = 0b1101_0110)
        • 최종 체크섬 : Checksum = 0b1101_0110 = 0xD6
    • Example 2
      • ID : 0x1C, PID : 0x9C
      • Data : 0x72, 0xA4, 0xF3, 0x3B, 0xAB, 0x03, 0xDD, 0x33 (DLC 8byte)
        • 데이터 합산
          • 0x72 + 0xA4 = 0x116 (0xFF 보다 크니 0x116 - 0xFF = 0x17)
          • 0x17 + 0xF3 = 0x10A (0xFF 보다 크니 0x10A - 0xFF = 0x0B)
          • 0x0B + 0x3B = 0x46 (0xFF 보다 작으니 Pass)
          • 0x46 + 0xAB = 0xF1 (0xFF 보다 작으니 Pass)
          • 0xF1 + 0x03 = 0xF4 (0xFF 보다 작으니 Pass)
          • 0xF4 + 0xDD = 0x1D1 (0xFF 보다 크니 0x1D1 - 0xFF = 0xD2)
          • 0xD2 + 0x33 = 0x105 (0xFF 보다 크니 0x105 - 0xFF = 0x06)
        • PID 합산 ( PID : 0x9C )
          • 0x06 + 0x9C = 0xA2 (0xFF 보다 작으니 Pass)
        • 0xA2의 보수 계산 ( 0b1010_0010을 반전 = 0b0101_1101)
        • 최종 체크섬 : Checksum = 0b0101_1101 = 0x5D

반응형
반응형

nginx로 서버를 만들고나면 https 설정이 필요하다.

 

그리고 여기에서 SSL 인증서가 필요하다.

 

유료 인증서도 있지만 무료로 받는 방법도있다.

 

물론 제한적 무료다. (3개월 마다 갱신해야 한다. 물론 자동화하여 평생 무료로 쓸 수 있다.)

 

 

 

1. Let’s Encrypt 설치 (ubuntu 24.04 환경)

 

sudo apt-get update
sudo apt-get install certbot
sudo apt-get install python3-certbot-nginx

 

위의 3가지 커맨드로 리스트 업데이트 및 'certbot'을 설치한다.

 

 

2. 도메인 연결

 

서버의 ip주소를 도메인과 연결한다. (가비아 등등)

 

 

3. ubuntu에서 인증서(certbot) 설정하기

 

sudo certbot --nginx -d example.com -d www.example.com

 

example.com에 내 도메인을 넣으면된다.

 

커맨드를 입력하면 몇가지 질문을 한다.

 

1) E-mail address : 사용자 확인 겸 인증서 만료가 다가오면 메일로 알려주는 역할을 한다. 자주 사용하는 메일을 입력해준다.

2) 서비스 동의 : 서비스 동의 사항이다. 그냥 'Y'를 입력한다.

3) E-mail 제공 동의 : 제단에 E-mail주소를 공유할지 선택한다.

 

** 이미 nginx를 설정해 놓은 상태여서 도메인을 따로 묻지는 않는다.

 

 

4. nginx를 재실행 한다.

systemctl restart nginx.service
systemctl status nginx.service

 

 

certbot으로 인증서를 만들면 자동으로 nginx 설정파일을 자동으로 수정해준다.

 

아래 설정에서 '# managed by Certbot'이 붙은 내용이 자동으로 설정된 내용이다.

# /etc/nginx/sites-available/default

server {
    server_name   example.com www.example.com;
    location / {
	root /var/www/wwwroot;
	index index.html index.htm;
	try_files $uri $uri/ /index.html;
	expires 30d;
    }

    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}


server {
    # if ($host = example.com) {
        # return 301 https://$host$request_uri;
    # } # managed by Certbot

    listen        80;
    server_name   example.com;
    return 301 https://$host$request_uri; # managed by Certbot  
}

 

 

 

-- 인증서 만료일 확인 방법

sudo certbot certificates

 

 

5. 인증서 자동 갱신 방법

 

Let’s Encrypt 인증서는 90일 주기로 만료된다. (물론 재신청 가능하다.)

 

ubuntu의 crontab을 이용하여 주기적으로 인증서 갱신을 실행시켜 기한 제한 없이 사용하면 된다.

 

 

crontab -e

 

1 ~ 4중 하나를 선택한다. (에디터 선택, 아무거나 선택해도 무관)

 

 

0 12 * * * /usr/bin/certbot renew --quiet

 

에디터 주석 맨 밑에 위의 한줄을 추가한다.

 

인증서 만료일이 30일 이내인 경우 인증서를 갱신하는 코드이다.

 

앞 5개의 숫자는 순서 시점을 나타낸다. (서버 시간 기준)

 

분(0~59)   시간(0~23)   일(1~31)   월(1~12)   요일(0~7)  <*(별)을 설정한 경우 매번 실행>

 

 

crontab -l

 

위의 커맨드로 실행될 리스트를 확인한다.

반응형

'C# > Blazor' 카테고리의 다른 글

우분투 포트 여는 방법 (ubuntu ipstables)  (1) 2024.10.14
반응형

nginx로 blazor server app을 만들고 정상접속이 되는것을 확인했다.

 

그러다 서버를 재부팅 하게 되었는데 서버가 응답이 없다.

 

왜그런지 모르겠다.

 

포트 설정으로 포트도 열어 놨는데 안된다.

 

 

 

-- 해결책

포트를 다시 열었더니 된다.

 sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
 sudo iptables -I OUTPUT 1 -p tcp --dport 443 -j ACCEPT

 

포트를 다시 닫는건

iptables -I INPUT -p tcp --dport 80 -j DROP
iptables -I OUTPUT -p tcp --dport 443 -j DROP

 

iptables의 설정 내역을 보는 방법

iptables --list
iptables -L
반응형

'C# > Blazor' 카테고리의 다른 글

nginx SSL 설정하기 (Let’s Encrypt 인증서)  (0) 2024.10.15
반응형

LIN 차량 통신 LDF 뷰어

 

 

온라인 LDF 뷰어 사이트

https://fasttool.co.kr/LDF/Viewer

 

Online LIN LDF Viewer

 

fasttool.co.kr

 

 

 

 

 

  1. LIN 통신이란
    1. 차량에서 PDSM, 선루프, 창문, 에어컨 등을 제어하는 통신 방식
    2. 1 wire 방식
    3. Master (1개) - Slave (다수) 의 구성 ( Master는 필수 요소 )
    4. 연결 가능한 노드 : 63개 (Master 포함)
  2. LDF 파일 (LIN Description File)
    1. LIN 통신에서 사용되는 통신 규격, 노드, 메시지에 대해 서술 해놓은 파일이다.
    2. 메모장으로 열어서 확인도 가능하다.
      1. 프로토콜 버전, 통신 속도 등의 물리적 규격
      2. 각각 노드들의 역할( Master or Slave)
      3. 전송될 모든 메시지의 형식
      4. 메시지의 데이터 슬라이싱 방식 및 인코딩 방식
  3. LDF 뷰어 쓰는 이유
    1. 한눈에 파악이 쉽다.
    2. 하나 하나 따져가며 각 노드의 데이터를 확인하긴 쉽지 않다
    3. 일이 빠르다.

 

반응형

'자동차 시험 > LIN 통신' 카테고리의 다른 글

LIN 통신 체크섬 계산 방법 (LIN Checksum)  (0) 2024.10.15

+ Recent posts