목록개발 및 공부 (189)
NeuroWhAI의 잡블로그
C# 8에 더 고급스러운 인덱서 사용을 위해 Index, Range 구조체와 새로운 문법을 지원한다고 하네요.온라인 컴파일러 중에서는 아직 지원하는 걸 못찾아서 예제를 돌려보진 않았습니다 ㅠㅠ int[] arr = { 1, 2, 3, 4 }; var lastIndex = new Index(1, true); int lastNum = arr[lastIndex]; // 4 lastNum = arr[^1]; // 위 코드와 동일 int[] arr = { 1, 2, 3, 4 }; Range range = 1..^1; var sub = arr[range]; // [2, 3] sub = arr[1..^1]; // 위 코드와 동일 var sub2 = arr[1..]; // [2, 3, 4] var sub3 = arr[..
https://neurowhai-net-game-test.herokuapp.com/ 만들고 싶은 멀티플레이 게임이 있는데 동기화 문제가 골치일 거라는 것을 알고 있었기에 연습 삼아 개발했습니다. 좋은 글이 있어서 비교적 빨리 구현할 수 있었습니다. 다만 많이 허술합니다. 데모 링크는 서버가 안좋아서 ㅠㅠ 겨우 공 몇개 동기화하는 것도 이렇게 힘든데 참 어떡할지 고민이네요. 아래는 소스코드입니다. 자바스크립트는 정식으로 공부한 적이 없어서 코드 스타일은 거르고 보시면 되겠습니다 ㅋㅋ.. GitHub에도 있습니다! 서버: var app = require('http').createServer(handler); var io = require('socket.io')(app); var fs = require('fs..
https://neurowhai-memo-app.firebaseapp.com/ 인프런의 강좌를 보고 실습한 결과물입니당 ㅎㅎ 아주 조금 개선한 부분도 있고요... 처음 들어가면 팝업(차단되면 허용하고 다시 새로고침...)이 뜰텐데 구글 계정으로 로그인하면 됩니다. 그러고 메모를 적은 후 '+' 버튼을 누른다거나 해서 포커스를 다른 곳에 두면 수정/저장됩니다. 메모를 불러오려면 좌측 메뉴의 동그란 버튼?을 누르면 됩니다. 삭제는 커서를 좌측 메뉴에 두면 버튼이 나옵니다. 하도 좋다길래 함 써본건데 편하긴 하네요. 나중에 앱 개발도 공부할 건데 그때 같이 써서 뭐 좀 만들어봐야겠습니다 ㅎㅎ
Rust 표준 라이브러리에 있는 AsRef와 Borrow trait은 생긴 것이 매우 비슷합니다. pub trait AsRef where T: ?Sized, { fn as_ref(&self) -> &T; } pub trait Borrow where Borrowed: ?Sized, { fn borrow(&self) -> &Borrowed; } impl Borrow for T impl
주의! 공부하고 정리한 글이라서 틀린 부분이 있을 수 있습니다.올바른 지적은 언제나 환영합니다. Rust는 패턴 매칭시 적절한 바인딩 모드를 선택함으로써 프로그래머 입장에서 쉽게 패턴 매칭 코드를 작성할 수 있게 합니다.다만 구버전 Rust까지는 그런 기능이 부족해서 아래 코드는 컴파일이 안되었었습니다. let s: &Option = &Some("hello".to_string()); match s { Some(s) => println!("s is: {}", s), _ => (), };s는 &Option인데 패턴은 Option이기 때문이었죠.그래서 아래처럼 수정해야 했었습니다. let s: &Option = &Some("hello".to_string()); match s { &Some(ref s) => p..
use std::io::{self, Read}; mod bf { use std::io::{self, Read}; #[derive(Default)] pub struct Machine { code: Vec, ram: Vec, head: usize, ptr: usize, } impl Machine { pub fn new() -> Self { Machine::default() } } impl Machine { pub fn initialize(&mut self, ram_size: usize) { self.ram.resize(ram_size, 0); } pub fn mount(&mut self, code: &str) { self.code = code.chars().collect(); } pub fn step(&mu..
panic은 Rust의 매크로로서 프로그램이 복구할 수 없는 오류에 빠졌을 때 프로그램을 즉시 종료하고 디버깅에 필요한 정보를 제공하는 기능을 합니다.Rust는 panic이 일어난 것을 감지할 수 있는 기능도 제공합니다. use std::panic; fn main() { let result = panic::catch_unwind(|| -> i32 { println!("good"); "42".parse().unwrap() }); println!("{:?}", result); let result = panic::catch_unwind(|| -> i32 { println!("bad"); "AaaaaAAaaaAAAaaAAAAaAAAAA".parse().unwrap() }); println!("{:?}", res..
if self.cache.contains_key(ids) { let sub_cache = self.cache.get_mut(ids).unwrap(); if sub_cache.contains_key(page_id) { let data = sub_cache.get_mut(page_id).unwrap(); data.update(cnt); } else { // 캐시가 비정상적으로 커질 가능성 배제. if sub_cache.len() >= self.max_sub_cache_len { sub_cache.clear(); } sub_cache.insert(page_id.clone(), CacheData::new(cnt)); } } else { let mut sub_cache = HashMap::new(); sub_ca..
https://turbo.fish/ 터보피쉬는 물고기의 한 종류 Rust의 문법 중 하나입니다.C++로 따지면 템플릿 파라미터를 직접 지정하는 것과 비슷하다고 할 수 있습니다. let num = "42".parse();위 코드는 컴파일이 안됩니다.타입 추론에 필요한 정보가 부족하기 때문이죠.num의 타입을 추론하자니 parse의 반환형이 제너릭 타입이라 알 수 없고parse의 제너릭 타입을 추론하자니 num의 타입을 모르는 상황이죠.두 해결 방법이 있는데 그냥 num: i32 이렇게 num의 타입을 지정하는 것과parse에 turbofish 문법을 사용해서 해결할 수도 있습니다. let num: i32 = "42".parse(); let num = "42".parse::(); // turbofish사실 ..
(귀여운 고양이 사진을 혐짤로 만드는 예시) 지금 보는 케라스 책의 VGG16을 이용한 딥 드림 이미지 생성 예제를 실습하고 있는데 결과물이 이렇게 나오는 이유가 뭘까 생각한 것을 정리 해봅니다. 수알못이라 설명이 실제와는 많이 다를 것 같습니다 ㅠ 수알, 딥알님들의 설명을 기다립니다..! 코드는 다 필요없고 핵심만 남기면 아래와 같습니다. for i in range(num_pool_layers): layer_name = "block{:d}_pool".format(i+1) print("Pooling layer: {:s}".format(layer_name)) layer_output = layer_dict[layer_name].output # Loss loss = K.mean(layer_output) # G..