현상

summernote에 작성되어 있는 내용을 javascript 로직으로 수정할때, <p><br></p> 구문이 자동으로 생성됨.

원인

summernote 버그로 v0.8.14버전에서 수정됨

https://github.com/summernote/summernote/issues/3495

해결

최신 버전인 v0.8.14버전으로 교체하였으나 여전히 발생하여,
summernote를 destroy 이후 재생성 하는 방법으로 해결

 

html

<textarea id="textarea_note" name="textarea_note">
</textarea>

js

new_note_data = '<table><tr><td>test value</td></tr></table>'

$('#textarea_note').summernote('reset');
$('#textarea_note').summernote('destroy');
$('#textarea_note').val(new_note_data);

$('#textarea_note').summernote({
    airMode: true
});

 

방법

telegram 가입 후, telegram bot을 이용하여 채팅방 생성후 메시지 전송 API를 웹브라우저로 전송

1. telegram bot 생성

  1-1. 웹브라우저(Web browser)에서 https://web.telegram.org/#/im?p=@BotFather
  1-2. 하단의 Start 버튼 클릭 또는 /start
  1-3. /newbot
  1-4. Bot 별칭 지정: chat 리스트 등 외부에 보일 이름
  1-5. Bot 이름 지정: 반드시 이름이 bot으로 끝나야 한다. ex) hexoul_bot
  1-6. Access token 메모: 1-4까지 진행하면 BotFather가 메세지를 보내는데 이것이 Access token이다.
        "Use this token to access the HTTP API:" 바로 아래의 긴 문자열을 복사해둔다.
  1-7. chat 리스트에서 1-4. 에서 지정한 별칭을 찾아 Start 버튼 클릭 또는 /start 입력

2. 채팅방 정보 얻어오기

2-1. 내 정보 API 호출: "https://api.telegram.org/bot" + Access token + "/getUpdates" 를 웹브라우저에 입력

     1-5에서 얻은 Access token이 123ABC였다면, "https://api.telegram.org/bot123ABC/getUpdates" 가 된다.
     만약 "result": []로 되어있다면 아직 Bot 시작 전일 수 있으므로 1.7.이 잘 되었는지 확인한다.

     정상적으로 처리되었다면 아래와 같은 결과가 반환된다.

{"ok":true,"result":[{"update_id":???,
"message":{"message_id":??,"from":{"id":??,"is_bot":false,"first_name":"Your first name","last_name":"Your last name","language_code":"en-US"},"chat":{"id":????????,"first_name":"Your first name","last_name":"Your last name","type":"private"},"date":1511258546,"text":"/start","entities":[{"offset":0,"length":6,"type":"bot_command"}]}}

  2-2. chat_id 메모
        2-1에서 빨간 굵은 글씨로 표시한 ????????가 chat_id로 쓰인다.
        실제로는 숫자로 되어있으므로 헷갈리지 말자. 따로 메모해두자.

3. 채팅방에 메세지 보내기

    2-1에서 썼던 웹주소의 뒷부분을 변경하여 호출한다.
    Access token까지가 base url이고 API 명, 인자 등이 뒤에 붙는다.
    메세지를 보내는 API 명은 sendMessage이고 인자는 chat_id와 text로 전체적인 형태는 아래와 같다.

https://api.telegram.org/bot123ABC/sendMessage?chat_id=????????&text=hello

    Access token: 사용자마다 다름
    chat_id: 2-1에서 얻은 채팅방의 ID
    text: 보낼 내용

    >> 텔레그램에 메세지가 잘 도착한 것을 확인할 수 있다.

 

참고

https://hexoul.blogspot.com/2017/11/telegram-sendmessage-api.html

 

RUNAS

Run as different user' 클릭 이후 계정 정보를 입력

CMD Line

runas.exe /netonly /user:myidomain\domain.useracc "Ssms.exe"

확인

 

참고

https://jasonbrimhall.info/2018/06/28/use-ssms-with-a-different-windows-account-back-to-basics/

현상

MSSQL AlwaysOn 설정 이후 auto failover 혹은 manually failover 가 실패

에러 로그

“Failed to perform a manual failover of the availability group“…..“Failed to bring availability group <name> online. The operation timed out”……“41131”

해결

Event Viewer UI를 통한 확인

  1. Go to Event Viewer
  2. Expand Applications and Services Logs
  3. Expand Microsoft
  4. Expand Windows
  5. Expand Failover Clustering
The log file is stored in system32\winevt\Logs

PowerShell을 사용하여 Clustger Error Log 확인

Get-ClusterLog -Destination C:\temp

“The use does not have permission to perform this action. (297)” 문구 확인

권한 부여

GRANT ALTER ANY AVAILABILITY GROUP TO [NT AUTHORITY\SYSTEM];
GRANT CONNECT SQL TO [NT AUTHORITY\SYSTEM];
GRANT VIEW SERVER STATE TO [NT AUTHORITY\SYSTEM];

 

참고

https://geekshangout.com/unable-to-manually-failover-a-sql-availability-group/

 

현상 

Quorum 상태가 Online 으로 수정이 되지 않고 Fail로 유지

원인

쿼럼 서버 장비가 다운되거나 통신이 되지 않는 경우 발생 할 수 있음

수정

Fail 상태로 유지되는 쿼럼의 경우 일반적인 방법의 삭제(우 클릭 후 Remove)가 되지 않는 경우가 많음

이 경우 쿼럼 설정 창에서 쿼럼을 제거하고 다시 구성 진행

 

Failover Cluster Manager -> More Actions -> Configure Cluster Quorum Settings ...

3번째 매뉴의 'Select Quorum Witness'에서 'Do not configure a quorum witness'를 선택하여 쿼럼 삭제 후 재구성

현상

권한 부여 및 DB 복원시 실행이 되지 않고 에러 발생

 

원인

실행 계정에 SYSTEM_USER 권한 부재

복원하는 DB의 procedure가 있는경우, definer로 설정되지 않은 계정으로 복원 시도

 

에러 문구

ERROR 1227 (42000) at line 375: Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation

 

해결

복원하는 DB의 procedure definer 이슈인 경우, definer로 설정된 계정으로 DB 복원(procedure 생성) 진행

// system_user 권한 추가 형태

[linux]# mysql -u admin_user -p -P 3306 TestDB < TestDB.sql
ERROR 1227 (42000) at line 375: Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation

mysql> show grants for 'admin_user'@'localhost';
+---------------------------------------------------------------------------------------------
| Grants for admin_user@localhost
+---------------------------------------------------------------------------------------------
| GRANT ALL PRIVILEGES ON *.* TO `admin_user`@`localhost` WITH GRANT OPTION
+---------------------------------------------------------------------------------------------
1 rows in set (0.00 sec)

mysql> grant system_user on *.* to 'admin_user'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show grants for 'admin_user'@'localhost';
+---------------------------------------------------------------------------------------------
| Grants for admin_user@localhost
+---------------------------------------------------------------------------------------------
| GRANT ALL PRIVILEGES ON *.* TO `admin_user`@`localhost` WITH GRANT OPTION
| GRANT SYSTEM_USER ON *.* TO `admin_user`@`localhost`
+---------------------------------------------------------------------------------------------
2 rows in set (0.00 sec)


[linux]# mysql -u admin_user -p -P 3306 TestDB < TestDB.sql
[linux]#

 

참고

https://dev.mysql.com/blog-archive/the-system_user-dynamic-privilege/

내용

mysql 재기동이 되지 않는 상황

 

원인

btrfs 파일시스템 메타데이타 100%으로, 실 사용률 50% 이하 임에도 불구하고 100% 사용률로 인한 mysql error 발생

 

btrfs ?

Btrfs(B-tree file system 또는 Butter file system)는 데이터 관리 및 안정성을 강화한 최신 파일시스템이며 페이스북의 크리스 메이슨이 개발을 지휘하여 2013년 이후 안정화되어 사용

btrfs vs ext4

Btrfs 장점

실시간 오류 정정 기능과 스냅샷을 이용하여 볼륨 복원이 가능하여 장애 복원성이 좋습니다.

또한 압축 기능 제공과 SSD 드라이브에 최적화되어 있어 일부 실험에서는 압축+SSD 조합을 통해 EXT4 보다 4배 이상의 성능을 보여주는 탁월한 읽기/쓰기 성능을 제공합니다.

 

Btrfs 단점

장점이던 스냅샷이 이번에는 단점입니다. ^^

스냅샷 이미지의 저장을 위해 디스크 공간을 추가로 사용하며 스냅샷 용량 증가의 특성상 디스크 사용량 예측이 어려운 것이 단점입니다.

또한, 스냅샷 이미지 생성과 디스크 단편화 문제로 자동 조각 모음을 처리할 때 성능 저하가 발생할 수 있습니다

 

EXT4 장점

EXT1, EXT2, EXT3을 거쳐 발전한 EXT4는 데스크톱과 워크스테이션 등에서 오랫동안 성능을 검증 받았습니다. 또한 Btrfs보다 범용적인 파일시스템으로 호환성이 좋고 다른 파일시스템보다 CPU 사용율이 낮습니다.

 

EXT4 단점

디스크 블록 지연 할당에 의한 데이터 유실 가능성이 있습니다. EXT4는 성능 향상을 위해 데이터를 디스크에 즉시 기록하지 않는데 이런 EXT4의 특성으로 데이터를 디스크에 기록하기 전에 발생하는 시스템 충돌이나 전원 문제로 데이터 유실 가능성이 있습니다. 물론 이런 문제에 대비하여 저널링 기능이 있어 복구할 수 있고 OS 레벨에서도 보정하지만 이런 동작은 성능을 저하시키고 문제 발생 가능성에 대비를 해야하는 등 운영자를 고민하게 만듭니다.

 

해결

btrfs rebalancing

// 용량 확인
# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   13M 100% /

// btrfs filesystem 확인
# btrfs filesystem df /
Data, single: total=9.47GiB, used=9.46GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=13.88GiB, used=1.13GiB
Metadata, single: total=8.00MiB, used=0.00

// btrfs rebalancing
btrfs balance start -m /mountpoint
btrfs balance start -m /mnt

$ sudo df -h /
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   26G  31% /

 

참고

https://askubuntu.com/questions/464074/ubuntu-thinks-btrfs-disk-is-full-but-its-not
https://www.ihee.com/144 [희야의 소소한 일상]

MSSQL AlwaysOn 환경에서는 Job Agent에 등록시, Active에서만 Job Schedule이 실행되어야 한다.

dmv 정보를 활용하여 Active 환경을 체크 후 Job을 실행 하도록 설정 필요

 

설정

DECLARE @ROLE NVARCHAR(100)

IF SERVERPROPERTY ('IsHadrEnabled') = 1
BEGIN
    SELECT @ROLE=ARS.role_desc  -- Replica Role
    FROM sys.dm_hadr_availability_replica_cluster_states AS RCS
    INNER JOIN sys.dm_hadr_availability_replica_states AS ARS
    ON ARS.replica_id = RCS.replica_id
    WHERE RCS.replica_server_name = HOST_NAME()
END

IF @ROLE IS NULL OR @ROLE = 'PRIMARY'
BEGIN

    -- Job 실행 구문 추가

END

 

예외 사항

Secondary 환경에서 Job을 등록하였을때 아래와 같이 실행이 되지 않는 경우가  발생

아래는 Job Schedule의 로그 화면

Secondary 환경에서 동기화 중인 DB 선택 시, 아래와 같은 에러 발생

해결

Active 장비의 AlwaysON 속성에 들어가서 '읽을 수 있는 보조(E)' 항목을 '예'로 변경

서버가 잠겨 있거나 비정상적인 상태로 SQL Server에 연결이 되지 않는 경우

 

DAC 접근을 위한 설정

remote admin connection 옵션을 활성화

SSMS -> DB 인스턴스 우클릭 -> 패싯(A) 클릭

패싯 속성(P) -> 'RemoteDacEnabled' Ture 설정

스크립트 적용

SP_CONFIGURE 'remote admin connections', 1
GO
 
RECONFIGURE
GO

DAC 접근 방법

cmd창에서 sqlcmd 명령어로 접속

cmd> sqlcmd -S localhost -U sa -P [패스워드] -A

sqlcmd 설명 : https://docs.microsoft.com/ko-kr/previous-versions/sql/sql-server-2008-r2/ms162773(v=sql.105)?redirectedfrom=MSDN 

 

참고
https://sungwookkang.com/368

Delete 실행 시 확인창을 예제로 작성

modal 호출 시 매개변수를 포함하여 처리

 

html

매개변수 전달을 위해 modal_id를 hidden타입으로 생성

매개변수 전달을 위해 result.id 변수를 SetParamModal()함수에 전달

ID가 Delete_Modal 인 modal 생성

Close 버튼은 창 닫기

Delete 버튼은 Delete() 함수 호출

<!-- Button trigger modal -->
<input type="hidden" name="modal_id" id="modal_id">
<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#Delete_Modal" onclick="SetParamModal('{{ result.id }}')">
  Delete
</button>


<!-- Modal -->
<div class="modal fade" id="Delete_Modal" tabindex="-1" role="dialog" aria-labelledby="DeleteModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="DeleteModalLabel">Delete</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        삭제 하시겠습니까 ?
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary" href="#" onclick="Delete()">Delete</button>
      </div>
    </div>
  </div>
</div>

js

SetParamModal(modal_id) : Modal 실행 시 매개변수 전달 기능

Delete() : 실제 삭제 로직 추가

<script src="./jquery-3.4.1.min.js"></script>
<script src="./bootstrapt/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="./bootstrapt/css/bootstrap.min.css" />


// modal_id 타입에 전달받은 값을 설정
// Modal 버튼 클릭 시 호출
function SetParamModal(modal_id) {

    $('#modal_id').val(modal_id);
}


// Delete
// Modal창에서 'Delete' 버튼 클릭 시 호출
function Delete() {

    //Modal 호출시 전달한 id 확인
    id = $('#modal_id').val();
    
    // Delete 로직 실행
    // 'Delete from table where id = ' + id;
    
    // Delete modal창 닫기
    $('#Delete_Modal').modal('hide');
}

팝업 화면

참고

https://getbootstrap.com/docs/4.4/components/modal/


to Top