목록개발 및 공부 (189)
NeuroWhAI의 잡블로그
https://www.acmicpc.net/problem/6591 정답 비율이 낮아서 겁먹고 미뤘던 문제입니다. 그런데 다른 쉬웠던 이항 계수 문제랑 거의 똑같이 했는데도 패스가 나네요. 무엇?? 그냥 캐시를 사용한 동적계획법으로 풀었더니 시간, 공간 복잡도가 안습이긴 하지만 패스는 되더라고요. 이후에 검색해서 공부한 방법으로 다시 풀었더니 정석대로 패스된 것 같습니다. 동적계획법으로 풀때의 아이디어는 위키백과에서 봤던 C(n, r) = C(n, n-r)이라는 점을 이용해서 중복 계산을 피하는 것이고 r = 0, r = 1, n = r일때는 답이 명확하므로 조건문을 써줬다는 것? 캐시는 최대한 크게 할당하고 n, r이 범위에 있을때만 캐시를 검사하도록 했습니다. 2번의 메모리 초과는 적절한 캐시 크기를 ..
데코레이터 패턴으로 HTML 코드를 표현한 예제입니다. https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b0fb18d31a6e4da32f135a3970985efc trait Element { fn outer_html(&self) -> String; } struct Content { content: String } impl Content { fn new(content: &str) -> Content { Content { content: content.into() } } } impl Element for Content { fn outer_html(&self) -> String { self.content.clone() } } st..
https://merry-christmas-wasm.herokuapp.com 확증은 없는데 경험적으로 보자면 원인은 잊혀진(?) 메모리의 재사용 때문이 아닐까 싶습니다.문제가 되는 시나리오는 아래와 같습니다.일단 캔버스에 쓸 메모리를 Rust에서 할당하고 forget합니다.눈을 계속 만들면서 Vec가 내부적으로 공간 확보를 위해 재할당을 수행하는데 이때 forget했던 메모리 부분을 침범합니다.캔버스 이미지가 제대로 나오지 않게 됩니다!그래서 임시로 눈을 담고 있는 Vec의 재할당이 일어나지 않게 하고 캔버스에 쓸 메모리를 할당하기 전에 초기 눈 생성을 수행했더니 제대로 동작을 했습니다.이것을 토대로 어차피 할당하는 메모리는 캔버스에 쓸 이미지 메모리 뿐이니 전용 static Vec을 만들고 forget..
#[macro_use] extern crate log; fn main() { debug!("hello, "); info!("world!"); }매크로가 다른 모듈에 있는 경우 macro_use 어트리뷰트를 써서 매크로를 임포트하라고 배웠었는데이제 꼭 필요한건 아니게 되었다고 하네요. extern crate log; use log::info; fn main() { log::debug!("hello, "); info!("world!"); }이렇게 매크로 외의 것들을 임포트 할 때처럼 할 수 있다고 합니다. 그나저나 Procedural Macro 기능이 정식으로 추가된 게 아주 마음에 드네요.C#처럼 어트리뷰트를 만들 수 있다! 얏호! 참고https://blog.rust-lang.org/2018/12/21/P..
https://merry-christmas-wasm.herokuapp.com위 링크로 들어가시면 됩니다.그저 눈이 내리는 페이지... 무슨 문제인지 모르겠는데 가끔 안됩니다 ㅠㅠ창 크기를 조정하면 될 수도 있어요. 핵심 부분은 Rust로 작성했습니다.웹은 잘 모르기도 하고 삽질을 많이 했네요 ㅠ 소스코드도 GitHub에 올려두었습니다.https://github.com/NeuroWhAI/merry-christmas-wasm 늦었지만 모두 메리 크리스마스!
fn main() { let num = u32::max_value(); println!("{}", num + 1); } 러스트는 런타임 연산 과정에서 오버/언더플로를 감지하여 패닉을 일으켜주는 기능이 있습니다.그래서 위 코드는 "thread 'main' panicked at 'attempt to add with overflow'"같은 에러를 뿜습니다.대부분은 도움이 되지만 가끔 일부러 오버/언더플로를 일으키는 경우도 있습니다.그럴 때 쓸 수 있는게 wrapping_* 메소드나 Wrapping입니다. fn main() { let num = u32::max_value(); println!("{}", num.wrapping_add(1)); }위 코드는 wrapping_add 메소드를 사용해서 패닉 없이 오버플..
책의 예제를 따라 실습했는데 작동은 그럭저럭 잘 합니다.문제는 이 녀석이 인종차별주의자라는 것이죠! ... Epoch 19/20 4960/4960 - 1s 150us/step - loss: 8.6177e-04 - acc: 0.9998 - val_loss: 0.0182 - val_acc: 0.9934 Epoch 20/20 4960/4960 - 1s 144us/step - loss: 5.9968e-04 - acc: 0.9998 - val_loss: 0.0186 - val_acc: 0.9953 Input a test sentence : I love it! Positive : 99.99902248382568%, Negative : 0.0009764923561306205% Input a test sentence ..
코드 출처 : https://dtolnay.github.io/rust-quiz/7 #[repr(u8)] enum Enum { First, Second, } impl Enum { fn p(self) { match self { First => print!("1"), Second => print!("2"), } } } fn main() { Enum::p(unsafe { std::mem::transmute(1u8) }); }위 코드는 UB인가? 컴파일이 되는가? 된다면 출력은? (정답은 아래에) 정답은 UB가 아니고 컴파일 되며 출력은 1입니다.설명이야 위 링크에 잘 나와있지만 정리할겸 적어봅니다. 일단 `#[repr(u8)]` 덕분에 Enum::First == 0u8, Enum::Second == 1u8이 보..
드디어! 성공했습니다! 와! PPAP!! 간단하게 입력 문장을 문자 단위로 나누고 그걸 그대로 출력하는게 정답인 데이터 세트를 사용했고 학습을 시킨 후 어텐션 매트릭스(Attention Matrix)를 출력해서 제대로 학습이 되었는지 검증을 했습니다. 짠! 성공한게 틀림없다구요! (아마도요...) X축이 입력 문장, Y축이 출력 문장입니다. 만들면서 가장 힘들었던 건 텐서를 생각대로 다루는 것과 어텐션 스코어 계산이었습니다. 텐서를 막 늘리고 돌리고 연산하는데 차원을 잘 맞춰야 하면서도 무작정 차원만 맞추면 연산이 올바르지 않게 되어버렸어서 힘들었습니다. 가장 멍청했던 실수는 텐서의 축을 치환하는데 Permute대신 Reshape을 썼던 것입니다. 이러면 차원은 맞춰지지만 요소들이 이상하게 배치되죠.....
실패했다.적용 방법도 떠오르지 않았던 것과 다르게 이번엔 확실히 적용할 수 있는 방법이 생각나서 진행했다.그러나 결과적으로 실패한 것 같다.번역 데이터 세트를 사용했고 실패했지만 번역 품질이 못봐줄 수준은 아니었다.그러나 최종 검증인 어텐션 매트릭스에서 실패가 보였다.어텐션 매트릭스라고 함은 입력 단어들과 출력 단어들간에 관련성을 보여주는 매트릭스인데예를 들면 영어로 'I'가 한국어의 '나'와 관련성이 높게 나와야 한다는 뜻이다.하지만 직접 출력해본 매트릭스는 그러한 특성이 전혀 나타나지 않았고 무언가 이상한 벡터의 반복이었다.그렇다는건 연산을 잘못 적용했다는 소리인데 차원만 맞추느라 연산의 연결을 제대로 생각하지 못한게 실패의 원인인듯 하다. 힘들다..이렇게 오래, 많이 도전했지만 실패해본게 정말 오랜..