패키지를 모두 https://bms.kyouko.moe 로 옮겼습니다.

 

BMS Archive는 준비가 많이 되면 업로드 하겠습니다.

 

=== 이전 게시글 ===

 

 

클라이언트 사이드에서 어떻게 하면 쓰기 편할지를 고민하다가 그냥 이미 잘 만들어져 있는 웹에다가 zip파일을 올리고, 여러 파일을 다운 받을 수 있는 패키지를 제공해주는게 가장 좋을거라는 생각을 했습니다. 그 이상의 무언가는 각자 알아서 만들것이고, 솔직히 필요 없을 거라고 생각했습니다.

 

https://bms.kyouko.moe/zips/ 에서 BMS파일을 웹 인터페이스로 받을 수 있습니다. 계속 업로드 중입니다.

 

Windows환경에서 사용불가능한 일부 파일의 이름을 전각문자로 변경했습니다. 또한, zip내부의 BMS파일들로 부터 이름을 자동으로 추정하는데, 잘 안 맞을 때가 있으니 알려주시기 바랍니다.

 

패키지는 https://blog.kyouko.moe/48 에 있습니다. Satellite와 Stella package를 빠른 시일내에 업데이트하겠습니다.

 

P. S.

 

 

서버가 위치해 있던 장소에서 금요일에 짐을 모두 월요일 까지 빼달라는 말을 들었고, 지금 너무 당황스럽네요...

 

현재 그 위치에 물리적인 서버가 2개 돌아가고 있는데, 이 서버 2개를 하나로 통합하는 작업을 한 후 임시로 집에서 서버를 돌려야 할 것 같습니다.

 

영향을 받는 서비스는 bms archive service 와 지인들 끼리 쓰던 음악을 공유하는 NAS가 있는데 인터넷 상황이 좋은 곳에서 안 좋은 곳으로 이동하는 것은 유감스러운 일이고 다시 서버를 원래 위치에 옮겨야 할 때도 다운타임이 꽤 많이 생길거라고 생각하기 때문에 좀 별로네요...

 

집에 있는 서버용으로 사 놓은 싼 데스크톱 하나가 있는데 부팅이 3달전쯤 되었던것 같은데 세팅하려고 보니까 안 되어서 이것도 골칫거리입니다.

 

지금 이 글을 쓰고 있는 위치는 현재 제 집인데 지금 서버가 있는 곳에 가야 하나 하고 생각 중입니다...

이제 BX를 trello 를 사용해서 관리합니다.

 

압축은 UTF-8로 되어 있으니, 이를 지원하는 어떤 프로그램으로 풀어도 상관 없습니다. (Bandizip 등)

 

패키지를 모두

 

https://bms.kyouko.moe/ 로 옮겼습니다. 아래 링크는 2020년 5월 이후에 삭제하겠습니다.

 

 

=== 이전 게시글 ===

 

Satellite(2020-03-01): https://bms.kyouko.moe/package/Satellite.html

 

통상 (17.7GB): https://bms.kyouko.moe/package/Normal.zip

 

델타 (9.4GB): https://bms.kyouko.moe/package/Delta.zip

 

Overjoy (구버전 신버전 포함, 6.1GB): https://bms.kyouko.moe/package/Overjoy.zip

 

발광 (22.4GB): https://bms.kyouko.moe/package/Insane.zip

 

Stella (2020-03-01): https://bms.kyouko.moe/package/Stella.html

 

통합 패키지: https://blog.kyouko.moe/48

 

UPD: 서버가 2020년 1월 4일 오전 10:00 부터 오후 3:00 까지 서버 이전 때문에 접속이 안 될 것입니다.

'프로그래밍 > 코딩' 카테고리의 다른 글

BMS Archive 개발 근황  (0) 2020.01.19
서버 근황  (0) 2019.12.07
[BX 개발기] 1. BMS 제목/아티스트 추출  (0) 2019.08.14
개인 홈페이지에 SSL 인증서를 달았습니다!  (0) 2018.07.27
비트연산과 집합  (0) 2017.11.25

https://github.com/ho94949/bms-archive

 

BMS archive service 의 약자는 BX로 정해졌습니다! archive 를 줄여서 arXiv로 부르는 https://arxiv.org 에서 따왔습니다.

 

일단 오늘 구현한 것은 BMS파일의 제목 및 작곡가 추출입니다. 유저단에서 돌릴 것은 아니므로 에러가 아예 안 날 필요는 없으나, 최대한 예외처리를 하는 방향으로 진행했습니다.

 

BMS 파일은 제목과 아티스트를 설정하게 되어있고, 대부분의 BMS에서는 제목에 난이도 이름까지 넣는 경우가 대부분입니다.

 

NO NIGHT MORE SOUL의 채보 목록

 여기서 우리는 노래 제목이 NO NIGHT MORE SOUL! 이라는 것을 알 수 있지만, 이것을 추출하는데 일련의 로직이 있어야 합니다.

 

제가 구현한 방법은 일단 IMPLICIT SUBTITLE을 모두 제거하는것 입니다. IMPLICIT SUBTITLE은 제목 안에 있는 [], (), -- 등으로 둘러싸인 다른 제목들을, 암시적으로 구분하는 것을 말하며 보통 난이도 등을 표시할 때 많이 쓰이기 때문에, 이것을 제외하면 노래 제목이 나오는 경우가 많습니다. 지금은 #SUBTITLE이란 명령이 있기는 하지만, 대부분 그냥 #TITLE 에 달아놓는것 같습니다.

 

가끔 곡 뒤에 이상한 SUBTITLE을 넣는 경우가 있고, 노래 제목 뒤에 이상한것을 붙이는 경우도 많기 때문에 제가 선택한 방법은 다음과 같습니다.

 

1. 모든 IMPLICIT SUBTITLE을 제거합니다.

 

2. 가장 짧은 제목을 찾습니다.

 

3. 이 제목이 모든 제목의 접두사인지 확인합니다.

 

이 방법을 통해서 대부분의 노래는 구분할 수 있습니다. 물론 너무나도 많은 예외들이 있습니다.

일본어와 영어를 섞어서 노래 제목을 정합니다
노래 제목에 X를 하나 더 넣습니다.
노래 제목을 오타를 칩니다.

 

차분으로 새로운 노래를 만드는 대회가 있습니다... 그래서 차분은 차분이지만 노래 제목이 다릅니다.

그래서 이런 노래들에는 임시로 N/A를 붙여놓고 수동으로 이름을 붙여주는 수 밖에 없을 것 같습니다.

 

뭔가 규칙들을 좀 더 정리해 나가면 좋을것 같다는 생각은 들긴 듭니다.

 

 

홈페이지에 드디어 SSL 인증서를 달았습니다! 


https://kyouko.moe


티스토리 블로그에도 달고 싶은데 지원을 안하네요... SSL 인증서 좀 지원해주면 좋으려만


좀 더 자세한 얘기는 호스팅을 bluehost에서 linode로 옮겼습니다. 처음에 서버 세팅에 관한 지식이 없을때 php로 사이트를 뚝딱뚝딱 만든것도 있고, 가격이 월 10$라서 샀었는데, 지금은 linode하나 올려서 쓰는게 좀 더 마음이 편하네요. 가장 싼 플랜이 한 달 5$ 에요. 역시 루트권한 있으니까 마음이 편해요.

예전에는 블루호스트가 인증서 적용하는게 유료라서 못 달았는데, 지금은 letsencrypt로 인증서를 받아서 적용했습니다.


호스팅이 이것저것 난잡해지기도 해서, 아예 flask기반으로 웹을 재구성 하고 있는데 아직 옮기지 못한게 있네요.


하나는 Musicplayer인데, Youtube Red를 쓰니까 별로 쓸 일이 없어지는것 같기도 하네요.

다른건, 사람들에게 링크를 줄 때 잡다하게 파일들을 올리고 그걸 주는 방식으로 문제를 만들었는데, 이것들은 지금 살려둬야 할지 말아야 할지 모르겠는 링크도 많아서 일단은 안 살려 뒀습니다...


사실 최근에 트래픽 부담이 꽤나 있는데 linode도 한달정도 써보고 트래픽 부담이 있으면 여기만 따로 옮기는 방식을 쓰든가 여러가지 조치를 취해야 할 것 같네요.

32bit의 (부호 없는)숫자가 할 수 있는 것을 생각해 보자. 하나는 0부터 4294967295까지의 수를 표현할 수 있다. 이것은 32비트 자료형 정수(int32_t)가 할 수 있는 일이다. 또 다른 일은 0부터 31까지의 숫자로 이루어진 "집합"을 표현할 수 있다는 것이다. 우리는 이 숫자를 집합으로 사용하는 것에 대해서 고찰해 보려고 한다.



집합의 비트 표기 방법


우리는 어떤 수를 이진수로 표현할 수 있다. 그러면, 20, 21, ..., 2n자리에 각각 0이나 1이라는 수가 있을 것이다. 2n의 자리가 1이면, n이라는 원소가 있는것이고, 만약 아니면 없는 것이다. 예를들면, 9는, 2진수로 표현하면 1001이고, 이것은 {0, 3}이라는 집합을 나타내는 것이다. 이 방법을 쓰면, 32비트 자료형 정수를, {0, 1, ..., 31}의 부분집합에 하나씩 대응 시킬 수 있다.




비트연산과 집합연산 표기


집합에서 가장 기본적인 연산은, 합집합, 교집합, 차집합, 여집합 등등일 것이다. 우리는 합집합, 교집합, 여집합이 각각 | (bitwise-or, 둘 중 하나라도 1이면, 결과도 1이다.), & (bitwise-and, 둘 다 1인 경우에만, 결과가 1이다.), ~ (bitwise-not, 결과의 0, 1이 바뀐다.) 로 표현됨을 알 수 있다. 


그리고 어떤 숫자 n만 들어있는 집합은, 2n이 {n}에 대응되고, <<연산으로 만들 수 있다.


우리는 이것들을 조합해서여러가지의 결과들을 정리할 수 있다. (집합 A는 비트 a에 대응된다.)




이렇게 숫자를 비트로 표시하면 빠른 속도로 다양하게 사용할 수 있는 여러 특징들을 가진다. 예를들면, 어떤 배열의 모든 subset에 대해 연산을 하는 방법은 다음과 같다.


for(int i=0; i<(1<<n); ++i)

{

for(int j=0; j<n; ++j)

{

printf("{");

if(i&(1<<j))

printf("%d, ", j);

printf("}\n");

}

}

위 코드는, 모든 {0, 1, ..., n-1} 부분집합을 전부다 출력하는 코드이다. printf를 바꿔서, 추가적인 연산을 할 수 있도록 바꿀 수 있다.




그리고 여러가지 bit manipulation들이 있다. 비트연산을 가지고 재미있는 일들을 할 수 있다. 가장 마지막 비트를 뽑아내는 연산, 모든 크기 x인 집합들을 순회하는 방법 등등 여러가지 manipluation이 있다. 재밌는 hack들이 있는 링크와 자주 쓰는 핵들을 몇개 소개하고 글을 마치겠다.


//x의 가장 마지막 비트를 계산함

x&-x;


//v랑 크기가 같고, 사전순으로 다음에 오는 집합을 찾음

unsigned int t = (v | (v - 1)) + 1; w = t | ((((t & -t) / (v & -v)) >> 1) - 1);


//x의 모든 부분집합을 순회함.

for(int i=0; i=(i-x)&x; )


//x의 모든 부분집합을 역순으로 순회함

for(int i=x; i>0; i=(i-1)&x)


//gcc내장함수 이용, x에 있는 비트의 갯수를 반환함

__builtin_popcount(x); //x가 long long type이면 __builtin_popcountll(x);


//gcc내장함수 이용, x의 앞에 있는 0의 갯수를 셈 (x의 가장 큰 원소 = log2(x) = 31-clz(x))

__builtin_clz(x);


//gcc내장함수 이용, x의 뒤에 있는 0의 갯수를 셈 (x의 가장 작은 원소를 가져 옴, x&-x는 1<<__builtin_ctz(x)과 같음)

__builtin_ctz(x);

다양한 비트연산에 관련된 것들이 들어 있는 링크: https://graphics.stanford.edu/~seander/bithacks.html


https://github.com/koosaga/DeobureoMinkyuParty


나는 내 코드나 내 자료들을 퍼블릭하게 올리는게 이롭다고 생각해서 자료들을 계속 업로드 하자고 제안을 했었다.


팀노트를 깃헙에 올리는게 어떻냐고 물어봤고 팀원들이 동의를 했다. 그래서 대전 리저널이 끝난 이후에 올리자는 얘기가 있었고 결국 사과가 팀노트를 업로드 했다. 사실 내가 좀 주도적으로 하는 일이여야 하는게 맞지 않았나 싶다. MolaMola 팀이나 Please Open Testdata 같은 팀도 팀노트를 열었기 때문에, 다른 팀노트의 좋은 점을 받아들이고 개선할 부분을 서로 개선하고 보완하는 방향으로 서로 팀노트를 잘 만들어 갔으면 좋겠다.


사실 지금 팀노트가 굉장히 난해하고 PS에서 사용하는 지식들의 끝단을 다루는 것 같다. 그래서 더 다양한 코드들을 추가하고, 입맛에 맞게 팀노트를 조절해가면서 쓸 수 있게 다양한 레퍼런스 코드들을 써 보려고 한다. 예를들면 기본적인 알고리즘인 Dijkstra나 Extended Euclidean Algorithm 같은 것들은 팀원이 다 짤 줄 안다고 작성을 안했고... 팀원이 알지만 디버깅할 때 버그가 많이 생기는 알고리즘이나, 상수가 매우 작은 (Locality to the rescue!) 알고리즘들이 들어있다. 혹은 공식들을 그냥 블랙박스로 사용하는 정도이다.


공개할 용도의 팀노트를 정비하는 일도 결국에는 해야 할 일인데, 언제부터 해야할 지 모르겠다. 일단 다양한 예제들을 추가하는 것으로 부터 시작해야겠다.

+ Recent posts