17~24/91
-
2023-04-21 17:30:00 이 포스트에서는 가상머신이 아닌 실제 디스크에 우분투를 설치합니다. 이 포스트에서는 Windows와 Ubuntu의 멀티부팅을 다루지 않습니다. 이 과정에서 포맷이 진행되기 때문에 중요한 데이터가 날아갈 수 있습니다. 잘 모른다면 가상머신에 설치하세요. 저는 아무런 책임도 지지 않습니다. 오늘 수업 중에 60GB라는 대용량의 여유 공간이 필요하다는 말에 저번부터 업그레이드해야지 했던 SSD를 드디어 구매.. 내장 SSD를 교체하고 지금 SSD는 케이스 사서 외장으로 사용할 예정. 데스크탑 사면 추가로 장착할 예정. 아무래도 2TB 짜리를 사서 외장으로 쓰지는 않을 듯.. SSD 교체하고 우분투를 재설치하면서 tar로 백업으로 복구하려고 했으나 블로그에 글 올릴 거리도 필요하고 해서 우분투 설치 방법부터 이것저것 설치나 설정하는 것까지 글을 올려보려고 한다. 일단 우분투 설치 과정은 SSD 오기 전에 가상머신에서 진행하는 걸로. 준비물 및 유의사항 우분투 ISO 파일 다운로드 4GB ISO 파일 크기 이상의 저장 장치 대부분 USB를 사용한다. 저장 장치를 포맷하기 때문에 데이터 백업 필수 ISO 파일을 부팅 USB로 만들어줄 프로그램 Windows: 기본 기능 (Only CD/DVD), Rufus 프로그램 등 Unix/Linux: dd 명령어 Ubuntu: “Startup Disk Creator(시동 디스크 만들기)” 프로그램 등 우분투를 설치할 디스크 및 USB 리눅스는 USB에도 설치가 가능하다..! 설치할 저장 장치도 포맷하기 때문에 백업 필수 가상머신에 설치한다면 다 필요 없고 ISO 파일만 있으면 된다. 우분투 부팅 USB 만들기 먼저 우분투 홈페이지에서 LTS 버전으로 다운로드 일반 버전은 9개월, LTS(Long Term Support) 버전은 5년(ESM 사용 시 10년)동안 지원한다. 새로운 버전이 나올 때마다 업그레이드 할 예정이 아니라면 LTS 버전를 쓰자. 버전이 22.04.1에서 04.2로 오르면서 용량이 3.6G에서 4.6G로 커졌다. 그래서 8GB 이상의 USB가 필요하다. Windows의 기본 기능 (CD/DVD) 다운로드 한 ISO 파일 우클릭하면 목록 중에 굽기가 있다. Windows 11은 우클릭 후 더 많은 옵션 보기 USB 대신 CD/DVD에 직접 구워 사용할 수 있다. Rufus (Windows) Rufus 홈페이지에서 프로그램 다운로드 장치에서 부팅 USB로 만들 USB 선택 부트 유형 오른쪽에 선택 버튼 클릭 후 ISO 파일 선택 나머지는 기본값 포맷된다는 경고창 진행 중 상태에 “준비 됨” 이라고 뜨면 완료. 완료되면 닫기. 시작 누르면 다시 시작한다. dd 명령어 (Unix/Linux) 부팅 USB로 만들 USB가 sda인지 sdb, sdc인지 아니면 또 다른 파일명인지 확인할 수 있는 경우에만 사용해야 한다. 무작정 아래 명령어만 따라친다면 다른 USB 파일이 포맷되거나, 내장 디스크 종류에 따라 sda로 인식하는 경우도 있는데 해당 디스크에 OS가 설치되어 있으면 시스템이 싹 날아가 버린다. # sudo dd bs=10M if=/path/to/ubuntu.iso of=/dev/Diskfile status=progress oflag=sync && sync 파티션을 선택해도 되지만 디스크 자체를 선택해도 된다. 파티션을 선택할 경우 해당 파티션의 크기가 ISO 파일보다 크거나 같아야한다. Startup Disk Creator(시동 디스크 만들기) (Ubuntu) 우분투에 기본적으로 설치되어 있는 프로그램을 사용할 수 있다. 다른 리눅스 배포판에도 있는 프로그램인지는 모르겠다. 프로그램 검색 Other을 눌러 ISO 파일 선택, 밑에는 부팅 USB를 만들 USB 선택 root 권한이 필요하기 때문에 패스워드를 묻는 창이 나타난다. 정상이다. 몇 분만 기다리다 보면 완료 창이 뜬다. “Quit” 여기서 “Test Disk”를 누르면 부팅 USB가 실행된다. 우분투 설치하기 먼저 PC에 부팅 USB를 연결한 채로 BIOS로 진입해야 해서 부트 순서 1순위를 해당 USB로 변경해야 한다. 참고로 요즘 부팅 메뉴 선택을 지원하는 경우가 있다. 부팅 순서를 변경하지 않고 이번 한 번만 해당 디스크로 부팅하는 기능인데, 만약 이 기능이 있다면 순서 바꾸지 말고 이 기능을 쓰자. 순서를 바꿨다면 저장 후 재부팅. 부팅 USB가 처음 실행되면 아래와 같은 화면이 뜬다. 한글로 설치하면 글자가 깨질 수 있기 때문에 영어로 설치했다. 무선랜카드가 있다면 와이파이를 잡을 수 있는 창이 뜬다. Minimal로 설치하면 그래픽 없이 CLI 모드로 설치된다. 아마..? 그러니 Mormal 선택, 체크박스 모두 체크 후 Continue 어떻게 설치할 것이냐 디스크가 하나밖에 없고 OS가 설치되어 있지 않으면 아래처럼 뜬다. 그 외 윈도우 등 다른 OS가 설치되어 있으면 상황에 따라 더 많은 옵션이 생긴다. 직접 파티셔닝을 하려면 “Something else”를 선택. EFI: 512MB /boot: 1024MB SWAP: 16384MB (16GB) / : 204800MB (200GB) /home: 나머지 (약 1.8TB) SWAP은 여기서 하지 않아도 설치 후에 스왑파일을 따로 생성하여 설정할 수 있다. 루트와 home을 분리한 이유는 혹시 OS를 재설치할 일이 생기면 홈 디렉토리를 포맷하지 않기 위해. 파티셔닝 설정 요약 국가 선택 사용할 유저명, 호스트명, 패스워드 등 모두 입력 자동 로그인을 사용하려면 “Log in automatically” 선택 이제 디스크가 포맷되면서 설치가 진행되고, 끝나면 Restart Now 설치 끝.
-
2023-04-19 21:50:59 개강한지 며칠 안 된 것 같은데 벌써 시험이 2일밖에 안 남았네..? 난 왜 공부를 안 하고 이러고 있지..? 2023.04.18 저번주 금요일에 주문한 2TB 짜리 SSD가 오늘 도착했다. 그래서 노트북 뒷판 까고 SSD 교체를 하려고 했으나.. 원래 약간 망가져있었고, 풀다가 사진처럼 됐고, 드릴로 박아놨는지 무슨 짓을 해봐도 안 풀려서 결국 더 망가진 상태. 그렇다고 2TB를 외장으로 사용하면서 수업할 때마다 연결해서 사용하기는 불편한데.. 나사에 일자 드라이버 들어갈 홈 파서 돌리는 게 제일 잘 될 것 같긴 한데 저기서 어떻게 홈을 파..? 파다가 옆에 다 긁을 것 같아서 시도도 못하는 중.. 서비스센터를 가기엔 저거 하나 교체해 주는데 너무 비싸게 부른다길래 고민 중.. 내일 컴퓨터 수리점이랑 서비스센터 전화해서 비용 물어보고 결정해야지.. 2023.04.19 오늘 오전에 서비스센터에 전화해 보고 2~3만 원 정도에 매장마다 조금씩은 다를 수 있다는 답변을 듣고 서비스센터로 갔다. 유통단지 전자관에도 있길래 거기 가려고 했는데 하필 한 달에 한 번 쉬는데 하필 셋째 주 수요일 하필 그게 오늘.. 아마 어제 본 10만 원 이상 부른다는 글은 OS 재설치나 이전 등 이런 것들도 다 포함인 듯. 그런데.. 수리기사님이 뒷판을 못 여신다고.. 나사 하나가 마모됐다고.. 안 풀린다던 나사가 이거 맞냐고.. 네..? 아닌데요..? 이거 열고 SSD 나사가 안 풀려서 들고 왔는데.. 이거 어제도 잘 열고 닫았는데.. 하여튼 지금은 안된다고, 본인은 여기까지라고, 혹시 내가 나사만 풀어서 다시 가져오면 해줄 수 있다고.. 결국 그냥 집에 왔고, 나사 풀고 다시 가져가려고 했으나.. 다리가 아프다 보니 가까운 곳에 주차를 해야 하는데 그 근처에 주차할 공간이 마땅치 않다는 핑계로 귀찮아서 포기.. 그냥 내일 전자관 가야지. 참고로 내일부터 시험.. ^^ 아 그리고 내가 당황해서 그렇지 기사님은 친절하셨다. 혹시 오해하면 안 되니깐.. 2023.04.21 어제 시험 치고 집에 와서 노트북 뒷판 풀고 센터 가져가려고 했는데.. 별의 별짓을 다 해봐도 나사가 진짜 안 풀리더라. 분명 잘 풀리고 헛돈 적도 없던 나사가 다음날 갑자기 안 풀릴 줄 누가 알았겠냐.. 난 풀 수 있을 줄 알았지.. 결국 외장으로 쓸까 케이스 부서져도 괜찮으니 바꿔달라고 할까 매우 진지하게 고민하다가 결국 내일 가서 해달라고 해야지.. 결정 그래서 오늘 학교 가기 전에 센터 가서 노트북 맡기려고 전자관 말고 학교랑 가까운 원래 갔던 곳으로 갔다. 그런데 안 풀리는 나사 위치가 키보드랑 가까워서 그 부분도 갈아야 할 수도 있다고, 그렇게 되면 키보드가 좋은 거라 비용이 10만 원도 넘게 발생한다고 하더라.. 이제 진짜 다 귀찮아서 네 그냥 해주세요 하고 학교 가서 시험 치고 점심 먹고 노트북 찾으러 갔는데 다행히 그 부분은 교체 안 했는지 2만 2천 원만 내고 왔다. 이번에 진짜 또 10만 원 냈으면 SSD 값까지 총 40만 원.. 그럴 거면 그냥 20만 원도 안 되는 5TB 짜리 2개 사서 외장으로 썼다. 이게 그 결과인데 이정도면 괜찮네.. 어차피 SSD 교체할 일도 잘 없을텐데 뭐 결론 나중에 램도 교체나 추가하려고 했으나 납땜이라 불가능. 램이 16GB인데.. 8GBx2도 아니고 2GBx8.. Asus 서비스 센터 SSD 교체 비용 : 22,000원 OS 설치 & 데이터 이전 미포함, Only SSD 교체 이번 시험은 망했다.
-
2023-03-24 16:31:00 살면서 일기를 써본 기억이 없는 내가 블로그에 일기를 쓴다.. 이건 기적이다. 사실 요즘 글을 너무 안 올려서 뭐라도 올려야 하는데.. 하다가 생각나서 적는 거긴 하지만.. 어쨌든 일기는 일기다. 한 달에 한 번 쓰기는 할까..? 동아리 3월.. 개강하고 학교 다니느라 바쁜 내 일상 작년에 지원 못한 동아리에 지원해서 입단 테스트도 보고 면접도 보고 합격도 하고. 스터디 참여를 안 해서 출석 점수가 없는데도 최종 2등 먹고 왔다. (*^▽^)/★*☆♪ 코딩 테스트 이게 무슨 말인가 싶은 문제도 있었고 코드를 짜는데 시간이 오래 걸린 문제도 있었지만, 급한 마음에 잔실수를 한 탓에 오래 걸린 문제도 많았다. 테스트를 시작하기 전까지만 해도 30분 ~ 1시간이면 다 풀 수 있을 줄 알았지만.. 결국 1시간 반이 넘게 걸렸다. 그럼에도 혼자 올클해서 코테 1등..! 솔직히 이번에 테스트를 보면서 작년에 동아리에 지원했더라도 합격하지 못했을 것 같다는 생각이 들었다. 당시에 언어는 JavaScript, Bash밖에 몰랐어서 C는 할 줄도 몰랐고 파이썬은 print나 if문 정도는 했으려나..? 들여쓰기가 중요하다는 것도 몰랐으니.. 팀플 팀플은 점수나 등수가 공개되지 않아서 잘 했는지 모르겠지만, 준비하는 과정은 수월하게 잘 흘러간 것 같다. 물론 조원 중에 한 분이 적극적으로 안 하는 것 같아서 처음부터 그냥 내가 그 분량까지 다 해야겠다는 마음으로 시작하긴 했지만.. 이 마음을 먹어서 그런지 별 부담이 없었다. 그런데 이제와서 생각해보면 1학년 신입이라 어렵고 잘 몰라서 그랬나 싶기도 하고, 열심히 하려는 걸 나도 모르게 방해했나 싶기도 하고.. 그래서 내가 문제였나 싶기도 하다. 만약 진짜 그런 거라면.. 죄송합니다 악의는 없었구요.. 네.. 죄송합니다. 병원 아 맞다 그리고 곧 병원도 가야한다.. 28, 30일 두 번이나.. 진료를 3개나 봐야하는데 진료를 보는 요일이 모두 달라서 겹치는 날인 화요일에 가야 하루에 다 볼 수 있다. 그런데 이번에 하필 한 곳이 화요일에 예약이 다 잡혔다고 해서 어쩔 수 없이 다른 날에 가야한다.. 그 대신 수요일이 공강 날이라 다음 주는 월, 금만 학교를 나가면 된다..! 근데.. 귀찮아………. 차라리 학교 가서 수업 들을래.. 진료확인서 목요일 진료확인서를 까먹었다 … 다행히 오후 수업은 동기들이 병원 진료 보러 갔다고 교수님한테 말해줘서 출석으로 해주셨다. 감사합니다 교수님.. 고맙다 친구들..
-
2023-03-01 16:25:00 지금 사용하고 있는 노트북 화면 비율이 16:10이고 최대 해상도가 2880x1800인데, 이건 너무 높고 1920x1200은 너무 낮아서 그 사이 유일한 16:10 비율인 2560x1600로 쓰고 있었다. 그런데 언제부턴가 재부팅을 해보니 아래 사진처럼 2880x1800에서 2560x1600만 사용하고 남은 오른쪽과 아래 공간에는 검은 공간(Black Border)으로 채워진 상태로 바뀌었다. 마우스가 설정한 해상도 밖으로 나갈 수는 없지만, 끝으로 가면 커서가 검은부분에 가려지지 않고 그 위에 그대로 표시된다. 그리고 화면이 터치도 가능한데, 검은 부분에서 터치로 스크롤, 줌인, 줌아웃 등 모두 가능하다. 해결 방법 먼저 해결 방법은 로그인 시 ‘Ubuntu on Xorg’ 옵션을 사용하는 것이다. 로그인 시 유저명을 입력하고 오른쪽 아래에 생긴 톱니바퀴를 누른 후 ‘Ubuntu on Xorg’로 변경하면 된다. 설정하고 나면 다음부터는 자동으로 선택이 되어있다. 원인 Xorg가 아닌 기본 설정으로 로그인 후 각 해상도에서 xrandr -q 명령어를 사용하면 결과가 아래처럼 뜬다. 그리고 아래 사진들은 Xorg로 로그인 후 같은 명령어를 사용한 결과다. 설정은 모두 바탕화면에서 마우스 우클릭 - Display Settings에서 했는데도 결과가 다르다. Xorg가 아닌 기본 설정에서는 해상도를 바꾸면 xrandr 명령에서 현재 해상도가 제일 높은 해상도로 설정되어 있지만, Xorg에서는 화면의 최대 해상도인 2880x1800에서 설정한 해상도가 선택되어 있다. 최근에 Xorg를 사용하다가 기본으로 바꾸긴 했지만, 기본으로 바꾸고 바로 이런 문제가 생겼는지 어느정도 지나서 생겼는지 모르겠다. 하지만 분명한 건 Xorg를 사용하기 이전에도 같은 해상도를 사용했는데 이런 문제는 생기지 않았다는 것이다. 아무래도 소프트웨어를 업데이트하면서 해상도를 변경할 때 설정하는 방법이 바뀐 것 같다. 에라 모르겠다 그냥 Xorg 쓰자. 그냥 2880x1800으로 사용하기로..
-
2023-02-28 16:14:00 이런 게 진짜 있나..? Bash declare -A table=( [A+]=4.5 [A0]=4.0 [B+]=3.5 [B0]=3.0 [C+]=2.5 [C0]=2.0 [D+]=1.5 [D0]=1.0 [F]=0.0 ) s=0 t=0 for ((i=0; i<20; i++)); do read a b c if [ "$c" == "P" ]; then continue; fi b=${b%.*} ((s += b)) ((t += b * ${table[$c]/./})) done o=00000$((t * 10**4 / s)) o=${o: -6:1}.${o: -5} echo $o Node.js const table = { "A+": 4.5, A0: 4.0, "B+": 3.5, B0: 3.0, "C+": 2.5, C0: 2.0, "D+": 1.5, D0: 1.0, F: 0.0 } const input = require("fs").readFileSync(0).toString().trim().split("\n").map(x => x.split(" ")); s = 0; t = 0; for (let [a, b, c] of input) { if (c == "P") continue; s += b*1; t += b * table[c]; } console.log(t/s); +를 연산자가 아닌 문자로 인식하기 위해 따옴표로 감싼 것이다. Python3 table = { "A+": 4.5, "A0": 4.0, "B+": 3.5, "B0": 3.0, "C+": 2.5, "C0": 2.0, "D+": 1.5, "D0": 1.0, "F": 0.0, } s = 0 t = 0 for i in range(20): a, b, c = input().split() if c=="P": continue s += float(b) t += float(b)*table[c] print(t/s) Ruby table = { "A+" => 4.5, "A0" => 4.0, "B+" => 3.5, "B0" => 3.0, "C+" => 2.5, "C0" => 2.0, "D+" => 1.5, "D0" => 1.0, "F" => 0.0 } s = 0 t = 0 for i in 0...20 a, b, c = gets.chomp.split() next if c == "P" s += b.to_f t += b.to_f * table[c] end puts t/s
-
2023-02-27 20:49:00 기러기 토마토 스위스 인도인 별똥별 우영우 ..역삼역 Bash read str rev="" cnt=${#str} while [ 0 -lt $cnt ]; do ((cnt--)) rev+=${str:$cnt:1} done test "$str" == "$rev" && echo 1 || echo 0 Node.js const str = require("fs").readFileSync(0).toString().trim(); const rev = str.split("").reverse().join(""); const o = str == rev ? 1 : 0; console.log(o); Python3 a = input() o = 1 if a == a[::-1] else 0 print(o) Ruby str = gets.chomp o = str == str.reverse ? 1 : 0 puts o
-
2023-02-27 20:04:00 i번 바구니부터 j번 바구니까지 공의 순서를 바꿔라. Bash read n m arr=() for ((i=0; i<n+1; i++)); do arr+=($i); done for ((idx=0; idx<m; idx++)); do read i j k bak=() for ((jdx=0; jdx<j-i+1; jdx++)); do x=$((i + (k-i+jdx)%(j-i+1))) bak+=(${arr[$x]}) done for ((jdx=0; jdx<${#bak[@]}; jdx++)); do arr[$jdx+$i]=${bak[$jdx]} done done echo ${arr[@]:1} Node.js const [[n, m], ...input] = require("fs").readFileSync(0).toString().trim().split("\n").map(x => x.split(" ").map(Number)); let arr = [...Array(n+1).keys()]; for (let [i, j, k] of input) { let bak = []; for (let jdx=0; jdx<j-i+1; jdx++) { x = i+(k-i+jdx)%(j-i+1); bak.push(arr[x]); } for (let jdx=0; jdx<bak.length; jdx++) { arr[jdx+i] = bak[jdx]; } } console.log( arr.slice(1, arr.length).join(" ") ); Python3 n, m = map(int, input().split()) arr = [str(i) for i in range(n+1)] for idx in range(m): i, j, k = map(int, input().split()) bak = [] for jdx in range(j-i+1): jdx = i+(k-i+jdx)%(j-i+1) bak.append( arr[jdx] ) for jdx in range(len(bak)): arr[jdx+i] = bak[jdx] print(' '.join(arr[1:])) Ruby n, m = gets.chomp.split().map {|i| i.to_i} arr = (0..n).to_a for idx in 0...m i, j, k = gets.chomp.split().map {|i| i.to_i} bak = [] for jdx in 0...j-i+1 jdx = i+(k-i+jdx)%(j-i+1) bak.push(arr[jdx]) end for jdx in 0...bak.size arr[jdx+i] = bak[jdx] end end puts arr[1, arr.size].join(" ")
-
2023-02-24 10:02:00 한 변의 길이가 n인 마름모. Bash read n for ((i=0; i<n*2-1; i++)); do l=$((n * 2 - 1)) p=$((i * 2 + 1)) if [ $l -lt $p ]; then ((p += (l-p)*2)) fi o="" for ((j=0; j<p; j++)); do o+="*" done s=$((n - p/2 - 1)) printf "%${s}s${o}\n" done Node.js const n = Number(require("fs").readFileSync(0).toString().trim()); for (let i=0; i<n*2-1; i++) { let l = n*2-1; let p = i*2+1; if (l < p) p += (l-p)*2 let o = Array(p).fill("*").join(""); let s = Array(n-p/2-0.5).fill(" ").join(""); console.log(s + o); } Python3 n = int(input()) for i in range(n*2-1): l = n*2-1 p = i*2+1 if l<p: p += (l-p)*2 f = "{" + "0:^{}".format(l) + "}" o = ["*" for j in range(p)] output = f.format("".join(o)) print(output.rstrip()) 포맷팅에서 변수를 사용하여 문자열 수를 지정하기 위해 포맷팅을 사용한다. 각 라인 별 오른쪽에 공백이 있으면 틀렸다고 뜨기 때문에 rstrip()으로 오른쪽 공백 제거. Ruby n = gets.chomp.to_i for i in 0...n*2-1 l = n*2-1 p = i*2+1 p += (l-p)*2 if l<p o = "*" * p s = " " * (n-p/2-1) puts s + o end