1. QuickTime Player를 수행한다. 혹시 파일선택 팝업이 뜨면 취소를 누른다.
2. C-C-N 키를 누르면 우측에 "영역선택/전체화면" 을 선택해서 "기록"을 누르면 시작된다.
(Command-control-N)
3. C-C-Esc 키를 누르면 녹화가 취소된다.
(Command-control-ESC )
1. QuickTime Player를 수행한다. 혹시 파일선택 팝업이 뜨면 취소를 누른다.
2. C-C-N 키를 누르면 우측에 "영역선택/전체화면" 을 선택해서 "기록"을 누르면 시작된다.
(Command-control-N)
3. C-C-Esc 키를 누르면 녹화가 취소된다.
(Command-control-ESC )
mongoDB의 CSFLE라고 불리는 필드암호화는 mongoDB 4.2이상에서 지원된다.
(단, mongoDB enterprise에서만 지원된다)
스텝별로 살펴보면 다음과 같다.
1. KMS 서비스를 통해 key 생성. (아래는 AWS KMS이용 예제이지만, azure의 keyVault나 Google Cloud KMS도 가능)
AWS Management Console에 로그인하여 KMS 서비스로 이동합니다.
새로운 키 생성을 선택하고, 키 유형으로 "대칭"을 선택합니다.
키에 이름을 부여하고, 필요한 권한을 설정합니다.
IAM 정책 설정:
키 사용 권한을 가진 IAM 사용자 또는 역할을 생성합니다.
생성된 KMS 키에 대한 액세스 권한을 해당 IAM 사용자 또는 역할에 부여합니다.
2. MongoDB 설정에 ClientEncryptions 설정.
@Bean
public MongoClient mongoClient() {
Map<String, Object> awsKmsProvider = Map.of(
"accessKeyId", "<AWS_ACCESS_KEY_ID>",
"secretAccessKey", "<AWS_SECRET_ACCESS_KEY>"
);
Map<String, Map<String, Object>> kmsProviders = Map.of("aws", awsKmsProvider);
AutoEncryptionSettings autoEncryptionSettings = AutoEncryptionSettings.builder()
.keyVaultNamespace("admin.dataKeys")
.kmsProviders(kmsProviders)
.build();
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.autoEncryptionSettings(autoEncryptionSettings)
.build();
return MongoClients.create(settings);
}
@Bean
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(mongoClient(), dbName);
}
3. entity class의 필드에 @Encrypted 적용
@Document
public class User {
@Encrypted
private String sensitiveData;
private String generalData;
}
AWS ec2 에서 최근에는 ntp보다 chrony를 많이 사용한다.
1. sudo vi /etc/chrony.conf 에서
server 169.254.169.123 prefer iburst
를 넣는다. 1줄만 있어도 된다.
2. sudo systemctl restart chronyd
3. chronyc sources -v
-> 소스서버가 제대로 반영되었는지 확인 (check)
4. date 로 시간확인.
단, https에서만 동작한다.
async function copyImageToClipboard(imageUrl) {
try {
const response = await fetch(imageUrl);
const blob = await response.blob();
await navigator.clipboard.write([
new ClipboardItem({
[blob.type]: blob
})
]);
console.log('Image copied to clipboard');
} catch (err) {
console.error('Failed to copy image: ', err);
}
}
// 이미지 URL과 버튼 클릭 이벤트 핸들러
document.getElementById('copyImageButton').addEventListener('click', function() {
const imageUrl = 'path/to/your/image.png';
copyImageToClipboard(imageUrl);
});
로드밸런서 설정시
HTTPS:443 설정에서 아래처럼 하면 웹서버로는 http가 전달되며, 이를 SSL Termination 이라고 부름.
참고 - NGINX로 전달한 블로그 : https://medium.com/@vdongbin/aws-elb%EC%99%80-nginx%EB%A1%9C-https-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-736b8c5ee76
1. 폰트 위치는 /usr/share/fonts/arial
이며, msttcore 폴더 밑에 ms 기본 폰트들이 있는지 확인가능.
2. 없을시 설치 방법.
a. $wget https://www.itzgeek.com/msttcore-fonts-2.0-3.noarch.rpm
b. sudo rpm -Uvh msttcore-fonts-2.0-3.noarch.rpm
c.
sudo fc-cache -f -v
1. Apps Script 컨솔 왼쪽 메뉴에서 "서비스 +" 를 눌러 Drive API 를 추가한다.
2. 코드를 아래와 같이 작성하고
3. 배포 -> 새 배포 를 한 후
4. 실행을 누른다.
function convertDocxToPdf() {
var folderId = 'myFolderID-folder의 URL 뒤쪽 끝부분임.'; // 변환할 파일이 들어 있는 폴더 ID
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFilesByType(MimeType.MICROSOFT_WORD);
while (files.hasNext()) {
var file = files.next();
Logger.log('File name:' + file.getName());
//1. Microsoft Word 파일을 Google Docs로 변환
var resource = {
title: file.getName(),
mimeType: MimeType.GOOGLE_DOCS,
parents: [{id: folderId}]
};
var convertedDocFile = Drive.Files.copy(resource, file.getId());
//2. Google Docs 형식으로 문서를 연 후 PDF로 변환
var doc = DocumentApp.openById(convertedDocFile.getId());
var blob = doc.getBlob().getAs('application/pdf');
// 특정 폴더에 PDF 파일 저장
var folder = DriveApp.getFolderById(folderId);
var pdfFile = folder.createFile(blob.setName(convertedDocFile.getName().replace(/\.[^/.]+$/, "") + ".pdf"));
// 생성된 PDF 파일의 URL 반환
return pdfFile.getUrl();
}
}
원격호출이 가능한 appScript만들기 => doGet(e)과 filename 파라미터를 추가.
function convertDoc2PdfByFilename(filename) {
var folderId = 'myFOlderID'; // 변환할 파일이 들어 있는 폴더 ID
var folder = DriveApp.getFolderById(folderId);
// var files = folder.getFilesByType(MimeType.MICROSOFT_WORD);
var files = folder.getFilesByName(filename);
while (files.hasNext()) {
var file = files.next();
Logger.log('File name:' + file.getName());
//1. Microsoft Word 파일을 Google Docs로 변환
var resource = {
title: file.getName(),
mimeType: MimeType.GOOGLE_DOCS,
parents: [{id: folderId}]
};
var convertedDocFile = Drive.Files.copy(resource, file.getId());
//2. Google Docs 형식으로 문서를 연 후 PDF로 변환
var doc = DocumentApp.openById(convertedDocFile.getId());
var blob = doc.getBlob().getAs('application/pdf');
// 특정 폴더에 PDF 파일 저장
var folder = DriveApp.getFolderById(folderId);
var pdfFile = folder.createFile(blob.setName(convertedDocFile.getName().replace(/\.[^/.]+$/, "") + ".pdf"));
// 생성된 PDF 파일의 URL 반환
return pdfFile.getUrl();
}
}
function doGet(e) {
var filename = e.parameter.filename;
if (!filename) {
return ContentService.createTextOutput("Filename parameter missing")
.setMimeType(ContentService.MimeType.TEXT);
}
// 파일 이름을 사용하여 DOCX를 PDF로 변환하고, 생성된 PDF의 URL을 반환
var pdfUrl = convertDoc2PdfByFilename(filename);
if (pdfUrl) {
return ContentService.createTextOutput("PDF 생성됨: " + pdfUrl)
.setMimeType(ContentService.MimeType.TEXT);
} else {
return ContentService.createTextOutput("해당 이름의 파일을 찾을 수 없습니다.")
.setMimeType(ContentService.MimeType.TEXT);
}
}
springboot에서 pdf로 변환하다가 어려움을 겪는다면, 시도해 볼만한 방법 중하나로
구글드라이브와 구글의 appScript를 이용하는 방법이다.
Spring Boot 애플리케이션에서 Google 계정에 로그인하여 Google Apps Script를 실행하고, 결과로 생성된 PDF를 가져오는 것은 가능합니다. 이 과정은 크게 세 부분으로 나눌 수 있습니다: Google 계정 인증, Google Apps Script 실행, 생성된 PDF 파일 가져오기. 이 과정은 Google Cloud Platform(GCP)의 여러 서비스와 API를 사용하며, OAuth 2.0을 통한 인증이 필요합니다.
implementation 'com.google.api-client:google-api-client:1.30.9'
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.6'
implementation 'com.google.apis:google-api-services-script:v1-rev20200827-1.30.10'
springFramework의 BeanUtils말고 apache의 BeanUtils를 상속해서 NullAwareBeanUtils를 만들면 된다.
import org.apache.commons.beanutils.BeanUtilsBean;
public class NullAwareBeanUtilsBean extends BeanUtilsBean {
@Override
public void copyProperty(Object dest, String name, Object value) throws IllegalAccessException, InvocationTargetException {
if(value == null) return; // null 값이면 복사를 수행하지 않음
super.copyProperty(dest, name, value);
}
}
사용법:
NullAwareBeanUtilsBean nullAwareBeanUtils = new NullAwareBeanUtilsBean();
nullAwareBeanUtils.copyProperties(destObject, sourceObject);