게임/titanfall 22026. 8. 29. 00:35

blisk의 협박에 hud로 bt가 믿으랜다.

 

믿으랬지 눈뽕하라곤 안했자나!!!

 

하지만 결국 ark 털리고

slone이라는 놈이 타이탄 타고 와서는

 

bt를 벌집으로 만들어 버린다.

 

목표 : 생존

 

SERE 키트를 가지고 가랜다

 

읭 눈깔을 떼어주는데

 

권총

 

 

BT-7274 라고 써있는 부품. 본체인가?

 

시시하게 무슨 권총인가 싶었고

스샷 정리하다 보니 SERE가 Survive Evade Resist Escape 의 약자인걸 보게 되네

그 와중에 BT를 라이트 처럼 파지하고 소심하게(!) 권총이라니 ㅠㅠ

 

칼은 해킹을 위한거였으니 인정!

 

스마트 권총이라더니 다중, 자동 조준! 크~~ 짱인데?

 

타이탄을 보내준단다. 오오 만세

 

먼가 프라스틱이나, 카본으로 덕지덕지 한 느낌 -ㅁ- 내 bt 돌려줘 ㅠㅠ

 

bt 본체를 꽂아주니

 

bt 부활!

 

그러고 보니 스샷도 안찍고 지워버렸네. 마지막 무기 체인건

 

BT의 복수!! slone과 싸울때인가 보다.

치사하게(!) 쫄따구들에 스파이더 자폭 까지 우르르르.. 야이 너무 하지 않냐?

그 와중에 slone이 쓰는 레이저는 겁나 아프다 스페이스 눌러서 피해있다가 짤짤이로 잡아야 하는데

쫄따구들 보다 보스 잡는게 유리할지도?

 

ark 발사하기 전에 언넝 빼내려는것 같은데

 

 

인젝터(아마도 ark 발사할 레일건?) 에서 전기가 역류해서 인지 bt가 맛이 간다.

 

복구한다고 골골대고 있는데 blisk 와서 널 죽이지 않겠다 선언하고 다행히 간다.

 

아무튼 골골대며 임무완수를 위해 올라타는데

 

 

 

 

갑자기 날 꺼내더니

 

믿으란다. 아니 믿으면 던질거잖아? 그런데 저거 파괴하러 날 보내버리겠다는 거...냐?!

 

비티 돌아오면 너에게 꼭 복수하겠다!!!! (그런 대사 없음)

 

폴드 웨폰을 지나서 다른 공간으로 온건가..?

 

아무튼 저 멀리 까지 가랜다 길이 없는데 으아아

 

가다보면 길이 생기는데

어디로 가야한다고 설명하기도 힘들정도로 그냥 정신없이 뛴다 ㅠㅠ

 

 

 

포켓몬 넌 이제 내꺼야!

 

 

번쩍! 하더니 행성이 분해된다 ㄷㄷ

 

 

 

 

엔딩 크레딧

 

망할 중간 보스들

먼가 쫑알쫑알 말 많던 노친네. 얼굴 첨 보는 느낌인데?

 

죽어서 재시작한데 도대체 몇번일까 ㅠㅠ

10시간 플레이. 즐거웠다 BT!

 

아래는 스팀과 연동된 EA origin에서 스샷찍음

 

 

Posted by 구차니
embeded/Cortex-M3 STM2026. 8. 28. 12:40

오래되서 기억도 안나네 ㅋㅋ

PB5 - SW (스위치) <- 먼가 오작동.  + 쪽 3V3과 연결되지 않고 따로 전원 연결해줘야 하는 듯.

PB4 - CLK (로터리)

PB3 - DT (로터리)

귀찮아서 USB CDC 를 통해서 출력하게 함.

#define BUF_SIZE 50
uint8_t usb_buf[BUF_SIZE];
uint32_t count = 0;
int prev_gpio = 0;
void gpio_proc()
{
  int curr_gpio = 0;
  GPIO_PinState gpios[3];
  curr_gpio |= (gpios[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3));
  curr_gpio |= (gpios[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)) << 1;
  curr_gpio |= (gpios[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)) << 2;

  if(prev_gpio != curr_gpio)
  {
    sprintf((char*)usb_buf, "%ld %d %d %d\r\n", count, gpios[2], gpios[1], gpios[0]);
    CDC_Transmit_FS(usb_buf, BUF_SIZE);
    memset(usb_buf,0,BUF_SIZE);
    count++;

    prev_gpio = curr_gpio;
  }
}

 

시계방향 회전. 두 번 딱딱 걸리고 다시 0 0 0  으로 돌아온다.

[2026-08-28 12:20:17.496] 1897 0 0 0                                            
[2026-08-28 12:20:20.417] 1898 0 0 1                                            
[2026-08-28 12:20:20.469] 1899 0 1 1                                            
[2026-08-28 12:20:20.735] 1900 0 1 0                                            
[2026-08-28 12:20:20.767] 1901 0 0 0

 

반시계방향 회전

[2026-08-28 12:20:20.767] 1901 0 0 0                                            
[2026-08-28 12:20:21.906] 1902 0 1 0                                            
[2026-08-28 12:20:21.959] 1903 0 1 1                                            
[2026-08-28 12:20:22.202] 1904 0 0 1                                            
[2026-08-28 12:20:22.233] 1905 0 0 0  

 

정방향 0 - 1 - 3 - 2 - 0 으로

역방향 0 - 2 - 3 - 1 - 0 으로

표현되긴한데.. gray code 같기도 하고?

[링크 : https://woodforest.tistory.com/147]

 

그래서 저 값을 가지고 판단을 하면 이제 CW 방향인지 CCW 방향인지 판단이 가능해진다.

char prev_gpio = 0;
void gpio_proc()
{
  char curr_gpio = 0;
  GPIO_PinState gpios[3];
  curr_gpio |= (gpios[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3));
  curr_gpio |= (gpios[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)) << 1;
  // curr_gpio |= (gpios[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)) << 2;

  char lut[4] = {0, 1, 3, 2};

  if(prev_gpio != curr_gpio)
  {
    char isCW = 0;
    char prev = lut[prev_gpio];
    char curr = lut[curr_gpio];
    if((prev  + 1) % 4 == curr)
    { isCW = 1; }

    sprintf((char*)usb_buf, "%ld %d %d %s\r\n", count, gpios[1], gpios[0], isCW?"CW":"CCW");
    CDC_Transmit_FS(usb_buf, BUF_SIZE);
    memset(usb_buf,0,BUF_SIZE);
    count++;

    prev_gpio = curr_gpio;
  }
}

 

테스트 끝!

[2026-08-28 12:33:57.522] 0 0 1 CW                                              
[2026-08-28 12:33:57.555] 1 1 1 CW                                              

[2026-08-28 12:33:58.521] 2 1 0 CW                                              
[2026-08-28 12:33:58.553] 3 0 0 CW                                              

[2026-08-28 12:33:59.452] 4 1 0 CCW                                             
[2026-08-28 12:33:59.496] 5 1 1 CCW                                             

[2026-08-28 12:34:00.156] 6 1 0 CW                                              
[2026-08-28 12:34:00.178] 7 0 0 CW                                              

[2026-08-28 12:34:00.729] 8 1 0 CCW // 반시계 방향 한번 돌리기
[2026-08-28 12:34:00.779] 9 1 1 CCW                                             

[2026-08-28 12:34:04.895] 10 0 1 CCW // 드륵 느낌이 안나게 반시계 방향으로 천천히 돌림

[2026-08-28 12:34:06.098] 11 1 1 CW    // 드륵 느낌이 날때까지 시계 방향으로 돌림

[2026-08-28 12:34:07.518] 12 0 1 CCW  // 드륵 느낌이 안나게 반시계 방향으로 천천히 돌림

[2026-08-28 12:34:08.590] 13 1 1 CW  // 드륵 느낌이 날때까지 시계 방향으로 돌림

[2026-08-28 12:34:09.858] 14 0 1 CCW                                            
[2026-08-28 12:34:09.916] 15 0 0 CCW                                            

[2026-08-28 12:34:11.124] 16 1 0 CCW                                            
[2026-08-28 12:34:11.154] 17 1 1 CCW                                            

[2026-08-28 12:34:12.087] 18 1 0 CW                                             
[2026-08-28 12:34:12.127] 19 0 0 CW                                             

[2026-08-28 12:34:12.444] 20 0 1 CW                                             
[2026-08-28 12:34:12.476] 21 1 1 CW                                             

[2026-08-28 12:34:12.673] 22 1 0 CW                                             
[2026-08-28 12:34:12.693] 23 0 0 CW                                             

[2026-08-28 12:34:12.746] 24 0 1 CW                                             
[2026-08-28 12:34:12.778] 25 1 1 CW                                             

[2026-08-28 12:34:12.913] 26 1 0 CW  

 

역시 딴짓은 시원한 에어컨과

회사 전기와, 월급을 받으면서 딴짓을 해야 잘됨 ㅋㅋㅋ

Posted by 구차니
프로그램 사용/Blender2026. 8. 28. 10:45

창을 띄우고 모델을 불러오고

 

창 크기 조절하듯 경계선 밖에 가서 + 로 커서가 바뀌었을 때 우클릭하면

 

아래처럼 split / join이 뜬다.

그럼 split 해주고

 

원하는 창을 나누고 클릭하면 된다.

 

오른쪽 창은 숫자키패드 0 눌러서 카메라 뷰로 바꾸고

왼쪽에서 조절하면 렌더하면서 일일이 안봐도 되서 딱이네

 

[링크 : https://kimslo.tistory.com/entry/Blender-화면나누기-화면합치기]

'프로그램 사용 > Blender' 카테고리의 다른 글

blender sculpting - dynatopo, grab  (0) 2026.08.06
blender 5.x sculpting  (0) 2026.07.29
blender export render/viewport  (0) 2026.07.29
blender 떼어내기, 때우기  (0) 2026.07.29
blender 보이지 않는 면까지 선택하기  (0) 2026.07.29
Posted by 구차니
게임/titanfall 22026. 8. 26. 23:56

아따 돌아갈길 못 찾아서 한참 헤맸네

 

엄청 오랫만에 보는 BT 반가워!

 

BT 손에 오르란다. 또 던지겠군 ㅋㅋ

 

안테나 수리하고

 

떨어져서 BT가 낚아준다.

 

음..

 

따봉

 

이제 숨좀 돌리나 싶었더니

 

또 다시 돌아온 중간보스의 타임

 

보스 잡고 통신성공!

 

아군(그러니까 반란군) 함선들이 몰려온다

 

사령관이 제대로 된 파일럿으로 해준다니까 BT가 거부하면서 감싸준다.

 

그나저나 저 함선은 어떻게 떠있는겨

 

미니 로봇들도 따봉 ㅋㅋ

 

적진에서 레일건(저격) 획득!

 

레일건으로 하니 살살 녹는다. 좋아!

그 와중에 ark 들도 토끼는 나쁜놈들!

 

slone 저 녀석도 중간 보스로 나오려나?

 

둘이 같은 모습으로 달리는군 ㅋㅋ

 

오오 바주카!?

 

ark 다시 뺏으려는데 갑자기 막 격추된다

 

이름있는거 보니 또 중간 보스군

그와중에 묘~하게 니어 오토마타 기계생명체 닮은 느낌

 

그래 아주 던지는거 재미들렸지?

 

적들을 제압하고 칼꽂아서 해킹하고 우주선 몰고 어딘가 가려는데

 

역시 중간보스 등장!

처음에 쫄따구 둘인가 데리고 오는데 드럽게 튼튼하고

3페이즈로 진행되었던가?

쫄따구 2잡으면 viper 랑 1:1인데

먼가 묘한 체크 포인트가 있었던것 같다.

실드도 빠르게 잘차고 먼가 빡치는..

간간히 바닥에서 나오는 배터리 잘 수급해어 어찌어찌 이긴다.

 

viper를 무찌르고, 이제 ark 강탈하러 가려는데

 

죽은줄 알았던 viper가 돌아와서는 bt를 패기 시작한다.

 

viper도 앞에 장갑판 날아가서 타이탄을 공격하다 보면 BT가 죽으니

후다닥 정면에서 viper를 직접 죽이면 끝

그 와중에 우리  BT 왼팔 하나 날아감 ㅠㅠ

 

아까 싸우던 배에서 ark를 강탈하러 가는데

자폭인지 다들 탈출하고 있다. 

 

팔이 하나뿐이라 부수긴 했는데 닿지 않아서 쿠퍼 헬프!

 

ark를 회수하고

 

BT안에 넣고

 

비행기가 못 버티니 BT 라도 탈출하라고 시키지만

 

아 똥꼬집 AI!!

프로토콜 3

 

파일럿을 다신 잃지 않을 것이다.

 

음 난 잡혔고. BT도 잡혔나 보다.

 

The Fold Weapon

 

기계답게(?) 개겨 본다.

 

일단 여기까지~

'게임 > titanfall 2' 카테고리의 다른 글

titanfall2 싱글 플레이 끝  (0) 2026.08.29
titanfall2 진행중 - the beacon  (0) 2026.08.23
titanfall2 진행중 - effect and cause  (0) 2026.08.23
titanfall2 진행중  (0) 2026.08.22
titanfall 2 진행중 - into the abyss  (0) 2026.08.17
Posted by 구차니
embeded/esp322026. 8. 26. 16:12

n00r0 에서

n은 Flash 용량(MB 단위)

r은 PSRAM 용량(MB 단위)

[링크 : https://www.etei.com/comparison/esp32-s3-wroom-1-n16r8_esp32-s3-wroom-1u-n8r2]

 

일단.. stm32f4 계열 보단 싸지만 얘도 싸지는 않고..

그 와중에 가격 차이 왜이래 오히려 역전?

[링크 : https://itempage3.auction.co.kr/DetailView.aspx?itemno=F455981092]

'embeded > esp32' 카테고리의 다른 글

esp32cam 영상인식  (0) 2026.05.24
platform.io + vscode + esp32  (0) 2026.02.18
esp32 on arduino ide  (0) 2026.02.18
esp component 와 idf.py create-project-from-example  (0) 2026.02.10
idf.py help  (0) 2026.02.10
Posted by 구차니
Programming/golang2026. 8. 25. 11:11

sync  패키지

[링크 : https://pkg.go.dev/sync]

 

Mutex.Lock() 은 Mutex.Unlock()으로 풀수 있다.

[링크 : https://pkg.go.dev/sync#Mutex.Lock]

[링크 : https://pkg.go.dev/sync#Mutex]

 

RWMutex.RLock() / RWMutex.Lock() - RWMutex.RUnlock() / RWMutex.Unlock()

abc 순으로 정렬되어있다보니 보기가 어렵네

아무튼 Lock - Unlock / RLock - RUnlock 으로 pair가 된다.

func (rw *RWMutex) Lock()
Lock locks rw for writing. If the lock is already locked for reading or writing, Lock blocks until the lock is available.


func (*RWMutex) Unlock ¶
func (rw *RWMutex) Unlock()
Unlock unlocks rw for writing. It is a run-time error if rw is not locked for writing on entry to Unlock.

As with Mutexes, a locked RWMutex is not associated with a particular goroutine. One goroutine may RWMutex.RLock (RWMutex.Lock) a RWMutex and then arrange for another goroutine to RWMutex.RUnlock (RWMutex.Unlock) it.


func (*RWMutex) RLock ¶
func (rw *RWMutex) RLock()
RLock locks rw for reading.

It should not be used for recursive read locking; a blocked Lock call excludes new readers from acquiring the lock. See the documentation on the RWMutex type.


func (*RWMutex) RUnlock ¶
func (rw *RWMutex) RUnlock()
RUnlock undoes a single RWMutex.RLock call; it does not affect other simultaneous readers. It is a run-time error if rw is not locked for reading on entry to RUnlock.

[링크 : https://pkg.go.dev/sync#RWMutex.Lock]

[링크 : https://pkg.go.dev/sync#RWMutex]

 

[링크 : https://www.jaenung.net/tree/28536]

[링크 : https://rainbow96bear.tistory.com/entry/Go-고루틴-이해하기-뮤텍스-데드락]

 

+

2026.08.26

Usage¶
To help diagnose such bugs, Go includes a built-in data race detector. To use it, add the -race flag to the go command:

$ go test -race mypkg    // to test the package
$ go run -race mysrc.go  // to run the source file
$ go build -race mycmd   // to build the command
$ go install -race mypkg // to install the package

[링크 : https://go.dev/doc/articles/race_detector]

'Programming > golang' 카테고리의 다른 글

golang channel..2 방향, select 등  (0) 2026.08.25
golang Init()  (0) 2026.08.20
golang git commit hash  (0) 2025.11.24
golang 정적웹 파일 포함하기  (0) 2025.11.24
go vet (golang 정적분석)  (0) 2025.10.02
Posted by 구차니
Programming/golang2026. 8. 25. 10:55

기본적으로 채널은 양방향이고, 생성시에 방향을 지정할수 있다

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .

chan T          // can be used to send and receive values of type T
chan<- float64  // can only be used to send float64s
<-chan int      // can only be used to receive ints

[링크 : https://go.dev/ref/spec#Channel_types]

[링크 : https://mynewcodings.tistory.com/313]

[링크 : https://jh-labs.tistory.com/716]

 

채널 브릿징

[링크 : https://kr.linkedin.com/pulse/mastering-go-concurrency-comprehensive-guide-channel-sourav-choudhary-0nwbc?tl=ko]

 

 

+

2026.08.26

ch chan<- string 이라는 건 chan<- string 타입의 ch 변수로 해석을 하면 되는데

$ cat ch.go
package main

import "fmt"

// sendOnly: ch1에는 보내기만 가능
func sender(ch string chan<-) {
ch <- "안녕하세요!"
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch <-chan string) {
msg := <-ch
fmt.Println(msg)
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
receiver(ch)    // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
}

 

ch string chan<- 을 허용하나 바꾸고 빌드해보는데 에러가 난다. 칫.

$ go build ch.go
# command-line-arguments
./ch.go:6:23: syntax error: unexpected keyword chan in parameter list; possibly missing comma or )

 

+

의도적으로 go를 붙이지 않아 고루틴으로 하지 않고 받는 걸 먼서 생성하고

블럭킹 되어있어서 보내는걸 실행하지 못하게 하면

$ cat ch.go 
package main

import "fmt"

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan<- string) {
ch <- "안녕하세요!"
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch <-chan string) {
msg := <-ch
fmt.Println(msg)
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
// go sender(ch) // 혹은 이렇게
}

 

빌드 시에는 아무런 에러나 경고가 없지만

실행시에는 deadlock이라고 띄우준다. 오.. 좋은데?

$ ./ch
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.receiver(0x2a1f3ecc6738?)
/home/falinux/work/src/go/ch.go:12 +0x1e
main.main()
/home/falinux/work/src/go/ch.go:19 +0x26

 

둘다 go 붙여서 돌리면 받는 쪽이 느린건지 이상하게(?) 아무런 메시지도 나오지 않는다. 머지?

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
}

 

그래서  sleep 추가해도 안되네?

claude 말로는 둘다 go 루틴 실행하고 main()의 끝에 도달해서 종료되는 바람에 그렇다고 한다.

$ cat ch.go 
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan<- string) {
time.Sleep(100)
ch <- "안녕하세요!"
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch <-chan string) {
msg := <-ch
fmt.Println(msg)
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
}

 

그래서 아래와 같이 main 함수를 늦게 종료하면 정상적으로 잘 나온다.

많이는 하지 않았는데 놓치지 않는걸 보면 

받는 쪽에서는 블로킹 되어있고, 채널 자체는 큐에 차있다가 뺴갈수 있을때 전달이 되는 듯.

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

 

+

양방향 전달은 의외로(?) 별거 없다.

그냥 chan<- <-chan 에서 <- 지우고 선언후, 당연하게(?) 보내고 받으면 된다.

$ cat ch.go 
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan string) {
ch <- "안녕하세요!"

msg := <-ch
fmt.Println(msg)
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch chan string) {
msg := <-ch
fmt.Println(msg)

ch <- "느그아부지 모하시노!"
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

$ ./ch
안녕하세요!
느그아부지 모하시노!

 

+

len() 함수로 현재 채널 버퍼의 크기를 확인할 수 있고

cap() 함수로 채널 버퍼의 최대 크기를 확인할 수 있다

$ cat ch_cap.go 
package main

import "fmt"

func main() {
ch := make(chan int, 5) // 버퍼 크기 5인 채널 생성

ch <- 1
ch <- 2
ch <- 3

fmt.Println("현재 버퍼에 쌓인 개수:", len(ch)) // 3
fmt.Println("버퍼 전체 용량:", cap(ch))       // 5
}

$ go run ch_cap.go
현재 버퍼에 쌓인 개수: 3
버퍼 전체 용량: 5

[링크 : https://mynewcodings.tistory.com/313]

 

그런데 이상하게도 채널 크기를 지정하지 않으면 에러가 발생한다

$ cat ch_cap.go 
package main

import "fmt"

func main() {
ch := make(chan int) // 버퍼 크기 5인 채널 생성

ch <- 1
ch <- 2
ch <- 3

fmt.Println("현재 버퍼에 쌓인 개수:", len(ch)) // 3
fmt.Println("버퍼 전체 용량:", cap(ch))       // 5
}

$ go run ch_cap.go
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
/home/falinux/work/src/go/ch_cap.go:8 +0x36
exit status 2

 

claude 답변으로는 capacity를 지정하지 않으면 길이가 0이고, 보내는데 받는 쪽이 없어서 deadlock 발생한다고 판단한다고.

즉, 버퍼가 없지만 받아서 소비하지 않으면 계속 블러킹 되는건가?

The capacity, in number of elements, sets the size of the buffer in the channel. If the capacity is zero or absent, the channel is unbuffered and communication succeeds only when both a sender and receiver are ready. Otherwise, the channel is buffered and communication succeeds without blocking if the buffer is not full (sends) or not empty (receives). A nil channel is never ready for communication.

[링크 : https://go.dev/ref/spec#Channel_types]

 

그런데 그렇게 보기에는..

얘는 왜 컴파일도 문제 없고, 실행시에도 아무런 메시지 출력 안되고 (deadlock 안걸리고) 잘 종료되지?

claude 답변으로는 deadlock은 실제로는 쓰레드가 모두 잠들어서 깨지 못하는 상황을 탐지하는거라

main thread가 1초 뒤에 깰꺼고 "기브니 쪼꼬렛!"은 전송되지 못하고 기다리다 종료되는거라고

$ cat ch.go
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan string) {
ch <- "안녕하세요!"
ch <- "기브미 쪼꼬렛!"

msg := <-ch
fmt.Println(msg)
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch chan string) {
msg := <-ch
fmt.Println(msg)

ch <- "느그아부지 모하시노!"
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
// go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

실제로 단계별로 해보면 "안녕하세요!" 보내고 멈춰버렸다. 그렇군.

$ cat ch.go
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan string) {
fmt.Println("run")
ch <- "안녕하세요!"
fmt.Println("wait")
ch <- "기브미 쪼꼬렛!"
fmt.Println("oops")

msg := <-ch
fmt.Println(msg)
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch chan string) {
msg := <-ch
fmt.Println(msg)

ch <- "느그아부지 모하시노!"
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
// go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

$ go run ch.go
run

 

 

+

자꾸 헷갈리게 되는데

switch-case가 있고 select-case가 있다

select-case는 채널 전용 으로 생긴건 거의 유사한데

저렇게 값을 던지고 안보고 종료하는 용도로도 쓸 수 있나 보다.

package main

import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 0, 1
    for {
        select {
        case c <- x:
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

[링크 : https://go.dev/tour/concurrency/5]

 

[링크 : https://go.dev/doc/effective_go#control-structures]

[링크 : https://go.dev/doc/effective_go#leaky_buffer]

 

claude 말로는 select에서 block 되어있어서

이를 이용해 타임아웃을 구현하는데 쓸 수 있다고 한다.

package main

import (
"fmt"
"time"
)

func main() {
ch := make(chan string)

go func() {
time.Sleep(2 * time.Second)
ch <- "작업 완료"
}()

select {
case result := <-ch:
fmt.Println(result)
case <-time.After(1 * time.Second): // 1초 안에 ch가 준비 안 되면 여기 실행
fmt.Println("타임아웃!")
}
}

 

 

+

A channel may be closed with the built-in function close. The multi-valued assignment form of the receive operator reports whether a received value was sent before the channel was closed.

[링크 : https://go.dev/ref/spec#Channel_types]

 

A receive expression used in an assignment statement or initialization of the special form

x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
var x, ok T = <-ch

[링크 : https://go.dev/ref/spec#Receive_operator]

'Programming > golang' 카테고리의 다른 글

golang mutex  (0) 2026.08.25
golang Init()  (0) 2026.08.20
golang git commit hash  (0) 2025.11.24
golang 정적웹 파일 포함하기  (0) 2025.11.24
go vet (golang 정적분석)  (0) 2025.10.02
Posted by 구차니
Programming/C Win32 MFC2026. 8. 25. 10:22

기능을 찾다가 초기화 값에서 이상한 문법을 발견(!)

 

static const int rgb2ycbcr_coeff[5][3] = {
 {0x4D, 0x96, 0x1D},
 {-0x2B, -0x55, 0x80},
 {0x80, -0x6B, -0x15},
 {0x0000, 0x0200, 0x0200}, /* B0, B1, B2 */
 {0x2, 0x2, 0x2}, /* S0, S1, S2 */
};

[링크 : https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/Changing-IPU-Color-Space-Conversion-parameters/ta-p/1100972]

 

그래서 소스코드를 생성하고 타입별로 일단 시도

$ cat hex.c 
#include <stdio.h>

void main()
{
char v1 = -0xFF;
unsigned char v2 = -0xFF;
short v3 = -0xFF;
unsigned short v4 = -0xFF;
unsigned short v4_1 = -0xFFFF;
int v5 = -0xFF;
unsigned int v6 = -0xFF;

printf("%d %u %d %u %d %u\n", v1, v2, v3, v4, v5, v6);
printf("%d %d %d %d %d %d\n", v1, v2, v3, v4, v5, v6);
printf("%x %x %x\n", v2, v4, v5);
}

 

빌드! 경고가 뿜뿜. char 에는 너무 크다~ 라는게 포인트

$ gcc hex.c 
hex.c: In function ‘main’:
hex.c:5:19: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘-255’ to ‘1’ [-Woverflow]
    5 |         char v1 = -0xFF;
      |                   ^
hex.c:6:28: warning: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘-255’ to ‘1’ [-Woverflow]
    6 |         unsigned char v2 = -0xFF;
      |                            ^
hex.c:9:31: warning: unsigned conversion from ‘int’ to ‘short unsigned int’ changes value from ‘-65535’ to ‘1’ [-Woverflow]
    9 |         unsigned short v4_1 = -0xFFFF;
      |  

 

근데.. 왜 unsigned  short과 unsigned int는 예상하지 못한 이상한 값이 나오지?

$ ./a.out 
1 1 -255 65281 -255 4294967041
1 1 -255 65281 -255 -255
ff01 ffffff01
1 1 ffffff01

 

아무튼 먼가 이해될 것 같으면서도 이해가 안되는 이상한 현상이 발생 ㅋㅋ

65281 4294967041

 

'Programming > C Win32 MFC' 카테고리의 다른 글

c malloc 이후 free 시에 원인불명으로 죽는 경우  (1) 2026.01.16
float 자릿수 제한  (0) 2025.10.11
free(): invalid next size (normal)  (0) 2023.12.18
c에서 cpp 함수 불러오기  (0) 2023.01.04
MSB / LSB 변환  (0) 2022.08.29
Posted by 구차니

어제 까지 잘쓰던게

오늘 갑자기 시원한 바람에 안나온다.

아직 한달은 더울꺼 같은데 수리 오려나 ㅠㅠ

'개소리 왈왈 > 육아관련 주저리' 카테고리의 다른 글

입추 그리고 시원해짐  (2) 2026.08.10
멍빨  (0) 2026.08.09
놀다옴  (0) 2026.08.08
연차 3일차  (0) 2026.08.05
연차 2일차  (0) 2026.08.04
Posted by 구차니
개소리 왈왈/컴퓨터2026. 8. 24. 18:22

1.5만원 정도에 팔았었나 보다.

[링크 : https://my-wikipedia.tistory.com/351]

 

공식 1.39만?

 

 

[링크 : https://qsenn.co.kr/product/detail.html?product_no=81]

 

 

그나저나 펌웨어가 두가지 버전이 있는데 capslock에 M을 등록해둔건.. 무슨 게임을 위한걸까?

[링크 : https://qsenn.co.kr/article/파일-다운로드/5/1090/] caps lock 사용

[링크 : https://qsenn.co.kr/article/파일-다운로드/5/1091/]  M 으로 사용

'개소리 왈왈 > 컴퓨터' 카테고리의 다른 글

한손 키보드 지름  (0) 2026.08.22
오늘자 줍줍  (0) 2026.08.18
질러?  (2) 2026.08.07
rk-b30 한손 키보드 메뉴얼 획득!  (4) 2026.07.29
다이소 인켈 usb-c 이어폰  (0) 2026.07.29
Posted by 구차니