반응형

최근에 구축 중인 사이트가 있는데, 방대한 양의 시세 정보 데이터를 적재하고 이를 검색서비스를 제공하는 사이트이다. 

여러 다른서버들이 있어 다른서버의 시세도 한눈에 보게끔 해주고 싶었는데, 아무 생각 없이 where 에 in 으로 서브 쿼리를 넣어 주는걸로 작성을 해주었더니, 시간이 매우 오래 걸렸다.

 

SELECT * FROM auction
	WHERE idx IN (
    	SELECT MAX(idx) FROM auction
        	WHERE item_id = :item_id
            GROUP BY realm_id, auction_house_id, item_id)
    ORDER BY price_min DESC;

위 쿼리의 결과가 도출되는데 4초에서 6초가 소요되었다. 개선을 해볼수 있지 않을까 싶어 여러 검색을 해보았는데, where 에서는 서브 쿼리를 절대 쓰지 말라, join 을 사용하라는 글이 많이 있어 join 으로 변경 해보았다.

 

SELECT main.* FROM auction AS main
	JOIN (
    	SELECT MAX(idx) AS max_idx
        FROM auction WHERE item_id = :item_id
        GROUP BY realm_id, auction_house_id, item_id) AS sub
    ON main.idx = sub.max_idx
    ORDER BY price_min DESC

이렇게 변경 하니 채 1초도 걸리지 않았다. 10~30ms가 소요되었다... 

서브쿼리가 참 최악인가보다.

반응형
반응형

회사 PC가 맥북인데, hostname을 변경하고 싶은데 보안프로그램에 의해 환경설정 > 공유가 막혀 변경을 할수가 없었다. 그래서 터미널을 통해 변경하는 방법을 찾게되어 블로그에 기록겸 남겨둔다.

 

sudo scutil --set HostName name-you-want

 

이렇게 변경하고 터미널을 종료 후 터미널을 다시 켜보면 변경이 잘 된것을 볼 수 있다.

 

출처| https://apple.stackexchange.com/questions/66611/how-to-change-computer-name-so-terminal-displays-it-in-mac-os-x-mountain-lion

반응형
반응형

var/log 에 용량이 많아 확인해보니 journal log 가 4G 넘게 쌓여있는걸 보고, 

stackoverflow 를 참고해 해결했다.

 

 

The self maintenance method is to vacuum the logs by size or time.

Retain only the past two days:

journalctl --vacuum-time=2d

Retain only the past 500 MB:

journalctl --vacuum-size=500M

man journalctl for more information.

 

 

출처:

https://unix.stackexchange.com/questions/139513/how-to-clear-journalctl

반응형
반응형

최근 discord.js 를 사용해 봇을 구축하고 있는데, 음악봇 기능을 개발하면서 다음과 같은 오류가 발생해 해결방법을 찾아 포스팅한다. 우선 오류는 아래와 같이 발생했다.

6|wow  | Error: aborted
6|wow  |     at connResetException (node:internal/errors:704:14)
6|wow  |     at TLSSocket.socketCloseListener (node:_http_client:441:19)
6|wow  |     at TLSSocket.emit (node:events:525:35)
6|wow  |     at node:net:757:14
6|wow  |     at TCP.done (node:_tls_wrap:583:7)

일단 결론부터 얘기하자면 discord 는 bitrate 를 제한을 두고 있는데, youtube (ytdl) 를 audioonly 로 가져왔어도 그 bitrate 와 차이가 있다보니 끊김 현상이 발생하는 것이었다. 그래서 다음과 같이 quality를 lowestaudio 로 주었더니 해결되었다.

const stream = await ytdl(url, { filter: 'audioonly', quality: 'lowestaudio', });
const resource = await createAudioResource(stream, { inlineVolume: true });
resource.volume.setVolume(0.5);

player.play(resource);
connection.subscribe(player);

 

반응형
반응형

오늘은 서버에서 node.js 를 업그레이드를 하려고 했는데, 수행이 안됬던 것을 해결해 포스팅한다.

먼저 보통 업그레이드를 수행하려고 한다면 아래와 같이 수행한다고 한다.

sudo npm cache clean -f
sudo npm install -g n
sudo n stable

여기서 latest 버전으로 설치하고 싶으면,

sudo n latest

를 하면 된다.

 

그런데, 아무리 위와 같이 수행해도 node -v 를 하였을 때, 버전이 그대로여서 해결방법은 아래와 같이 수행했다.

nvm install node

node -v 를 다시 쳐보니 정상적으로 업그레이드가 완료 되었다. 

반응형
반응형

XE 를 최신 버전으로 업데이트 하는 과정에서, 또는 php 7 >= 환경에 XE를 서버이전하고자 할때 오류가 발생한다.

제일 간단한 방법은 로그 창을 터미널로 띄워놓고, Object 오류가 발생하는 php 파일들을 찾아가 Object 를 BaseObject 로 수정해주면 된다.

 

예를 들어,

return new Object(); 

return new BaseObject();

로 바꿔주면 된다.

 

또는 extends Object { 로 위에 적혀있을때도 있는데,

이때도 extends BaseObject { 로 수정해주면 된다.

 

 

반응형
반응형

이번주에는 이모께서 오래된 PC 하나를 윈도우 7에서 10으로 업그레이드를 부탁하셔서 작업을 해보았다.

직접 방문이 어려운 상태라 TeamViewer 를 통해 직접 업글을 시도하였는데, 결론을 미리 말하자면 "실패" 했다.

 

2일동안 고생했던 이야기를 지금 풀어놓을테니, 같은 문제점을 해결하기 위해 검색하시는 분들이 고민말고 바로 깔끔하게 포기하고 넘어가시길 바라는 마음에 글을 적어본다. 

 

윈도우7에서 10에서 "이 PC 업그레이드" 방법을 쓸 수 있는 PC는 클린한 상태의 PC에 가까울 수록 성공확률이 있고, 꽤 오랜 시간 사용한 PC일 수록 "이 PC 업그레이드" 실패 확률이 매우 높게 발생한다.

 

< 우선, 이 PC 업그레이드를 하기 위한 사전 조건 ... >

1. Windows 업데이트를 모두 해주어야 한다.

 

2. 부착 되어있는 하드웨어 등을 모두 제거해주어야 한다.

 

3. 백신 프로그램 등을 모두 제거 해주어야 한다.

 

4. 여유 용량을 20GB이상 확보해주어야 한다.

 

 

맨 처음에는 아예 도구 프로그램이 실행조차 되지 않았다.

오류 코드로는 "0x80072f8f 0x20000" 이 발생헀는데, 이 시점에서는 아직 1~4 을 모두 수행하지 않았었다. 

해결 방법들로 제시된 것들은 정말 다양하지만, 일단 몇개를 적어둔다.

 

https://answers.microsoft.com/en-us/windows/forum/all/media-creation-tool-error-code-0x80072f8f-0x20000/4f8bbe1c-b5af-4cc9-958e-c6c8f3f0b524

 

리디렉션 중

 

login.microsoftonline.com

해당 링크의 Reply 를 보다보면, 

 

더보기

Some server that the MediaCreationTool21H2.exe tries to talk to apparently no longer speaks the old TLS 1.0 security protocol, but Windows 7 SP1 still has the newer TLS 1.1 and TLS 1.2 disabled by default, resulting in this error code right at the start. So I had to first run the “Easy fix 51044” MSI to make a few registry changes to enable the more recent TLS versions, and then Media Creation Tool - error code 0X80072F8F - 0X20000 no longer appeared.

The newer operating system booted from the installation ISO image won't have that TLS-version limitation, so using that should be another solution to the same problem.

Details:

 

해결책을 제시한 분이 계신데, 해당 링크에 들어가 Easy fix 파일을 다운받아 레지스트리 수정을 해주어야 한다.

위 과정을 모두 수행했다면, MediaCreationTools.exe 파일이 실행에는 아마 성공했을 것이다.

 

 

... 이다음 부터는 App Crash, KernelBase.dll 파일이 문제가 되었다.

KernelBase.dll 파일은 net Framework 가 제대로 설치되지 않았을 때 발생한다.

해결방법으로는 dllfiles 등에서 다운받아서 덮어 씌워라 등의 가이드가 있긴한데, 이는 매우 위험하다.

왜냐면 PC에 있는 dll 파일과 인터넷상에 게재되어 있는 dll 의 버전이 상이할 수 있다. dll 속성에 들어가 자세히 보기를 하면 버전이 나오니 같은 버전이 있을 경우에만 덮어씌우기를 해주고, 그게 아니라면 net framework 최신 버전으로 재설치를 해주면 해결된다.

 

"끝난줄 알았지?"

"Windows 10을 설치하지 못했습니다." "오류 메시지는 없음"

 

윈도우 설치 단계 정확히 73% 쯤에서 이렇게 계속 발생을 했다.

그래서, 가지고 갈 데이터를 앱/설정/개인데이터 다 빼고 해도 동일하게 발생을 한다.

오류 메시지라도 알려주면 검색이라도 해볼텐데. 딱 "Windows 10 을 설치하지 못했습니다" 만 나오니 환장할 노릇이다.

 

cmd 에서 sfc /scannow 를 수행해도 문제가 없는데...

그래서 결론은 여기까지 삽질하는데 10시간을 넘게 허비했다.

 

물론 MediaCreationTool.exe 가 실행이 안되어 usb (16기가이상필요) 에 설치미디어를 굽지도 못했겠지만

아무튼 usb로 설치했다면 1-2시간이면 끝났을 시간이다.

 

결론은 오래된 구형 PC에서는 절대절대 "이 PC 업그레이드" 기능을 써볼 생각조차 하지 않는게 좋다.

외장하드나, 또는 다른 하드디스크에 바탕화면, 내문서, 사진, 비디오, 음악, 즐겨찾기, 공인인증서 등을 백업해둔 후

usb 에 설치미디어를 만들어 설치하는게 시간상으로도 정신건강상으로도 500% 이득이니 절대로 하지 말길 바란다.

 

또 필요한 파일만 백업하고 윈도우를 재설치하게 된다면 그동안 쓸데없이 쌓여있었던 앱이라거나 쓰레기 데이터들이 제거되는 효과도 있으니, usb로 재설치 해주는게 제일 나은 방법일듯 하다 

 

끝. 

반응형
반응형

오늘은 요구사항으로 새 윈도우 창에 post 로 보내달라는 게 있어서 포스팅에 추가해봅니다.

Vanilla로 짜도되고 jQuery를 쓰셔도 되는데, 두가지를 모두 소개해볼게요.

 

Vanilla

var form = document.createElement('form');
form.setAttribute('target', '_blank');
form.setAttribute('action', '__TARGET_URL__');
form.setAttribute('method', 'post');

var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('value', '__VALUE__HERE__');
input.setAttribute('name', '__NAME__HERE__');

form.append(input);
document.body.appendChild(form);
form.submit();

 

jQuery

var form = $("<form \>");
form.attr({
    "target": "_blank",
    "action": "__URL__HERE__",
    "method": "post"
});

form.append($("<input \>").attr({
    "type": "hidden",
    "value": "__VALUE__HERE__",
    "name": "__NAME__HERE__"
}))

$("body").append(form);
form.submit();
반응형

+ Recent posts