TinyMCE 에디터 적용하기

TinyMCE 홈페이지 > Quick start

https://www.tiny.cloud/docs/quick-start/

샘플코드

<textarea id="note" class="note">내용을 입력하세요</textarea>
<script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
<script>
tinymce.init({
     selector: '#note',
     plugins: 'print preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link media mediaembed template codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker imagetools textpattern noneditable help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable',
     menu: {
         tc: {
             title: 'TinyComments',
             items: 'addcomment showcomments deleteallconversations'
         }
     },
     menubar: 'file edit view insert format tools table tc help',
     toolbar: 'undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent |  numlist bullist checklist | forecolor backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap emoticons | fullscreen  preview save print | insertfile image media pageembed template link anchor codesample | showcomments addcomment',
     autosave_ask_before_unload: true,
     toolbar_mode: 'floating',
     tinycomments_mode: 'embedded',
     tinycomments_author: 'Author name',
     height: '100%'
 });
</script>

API Key

API 키는 My Account에서 가입후 발급이 가능
발급후 도메인을 등록하고 no-api-key 부분을 교체해서 사용이 가능

google reCAPTCHA

어드민 콘솔 접속 주소

https://www.google.com/recaptcha/admin

HTML 폼작성하기

<!-- recaptcha element -->
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
<input type="hidden" id="recaptcha_response" name="recaptcha_response" value="" />
<div id="recaptcha_area"></div>

<script type="text/javascript">
var verify_value = "";
var onloadCallback = function() {
	grecaptcha.render('recaptcha_area', {
		'sitekey' : '{어드민 콘솔에서 발급받은 사이트키}',
		'callback' : function(response) {
			if (response != "") {
				verify_value = response;
			}
		},
		'theme' : 'light'
	});
};
</script>
<!-- //recaptcha element -->

<script>
// 폼서브밋시
$("#recaptcha_response").val(verify_value);
</script>

FORM DATA 처리 (php)

<?php
// recaptcha 확인
include_once 'Snoopy.class.php';
$snoopy = new Snoopy;
$data = array(
	"secret" => '어드민 콘솔에서 발급받은 시크릿키',
	"response" => $recaptcha_response
);
$snoopy->submit('https://www.google.com/recaptcha/api/siteverify', $data);
$response = json_decode($snoopy->results);
if (!$response->success) {
	// fail
	exit;
} else {
	// success
}

Snoopy.class.php

https://github.com/endroy/Snoopy

xcp-ng 설치후 iptables 수정

XCP-ng 접속을 아이피로 제한

보안을 위해서 XCP-ng에 접근하는 아이피를 제한한다. 80, 443 포트의 경우 XCP-ng Center로 접근시 사용하기 때문에 해당 아이피만 허용해준다.

XCP-ng Center에서 콘솔로 접속후 iptables 수정

# vi /etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m udp -p udp --dport 694 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 443 -j ACCEPT

아래처럼 -s {허용할 아이피} 를 추가해서 접근을 막는다

-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m udp -p udp --dport 694 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp -s {허용할 아이피} --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp -s {허용할 아이피} --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m conntrack --ctstate NEW -m tcp -p tcp -s {허용할 아이피} --dport 443 -j ACCEPT

# service iptables restart

C# – ComboBox 데이터바인딩

C# 콤보박스에 데이터를 바인딩하기
var list = new BindingList<KeyValuePair<int, string>>();

list.Add(new KeyValuePair<string, string>(0, "Select Color"));
list.Add(new KeyValuePair<string, string>(1, "Red"));
list.Add(new KeyValuePair<string, string>(2, "Blue"));
list.Add(new KeyValuePair<string, string>(3, "White"));
list.Add(new KeyValuePair<string, string>(4, "Black"));
list.Add(new KeyValuePair<string, string>(5, "Green"));

cbColor.DataSource = list;
cbColor.ValueMember = "Key";
cbColor.DisplayMember = "Value";
cbColor.SelectedIndex = 0;
콤보박스 선택하기
cbColor.SelectedValue = 3;
cbColor.Text = "Blue";
cbColor.SelectedValue = cbColor.FindString("Red");

라즈베리파이 HDMI

라즈베리파이의 HDMI에 연결된 출력장치를 켜거나 끌경우 사용하는 명령

https://www.raspberrypi.org/documentation/raspbian/applications/tvservice.md

켜기

tvservice -p
(vcgencmd display_power 1)

끄기

tvservice -o
(vcgencmd display_power 0)

모니터링

tvservice -M

-p, -o 명령의 경우 실행하면 화면이 검은색으로 변했다가 복구된다.
때문에 화면만 껐다켜는 경우는 vcgencmd display_power를 사용해야한다.

mysql_native_password

auth_socket 인증을 변경

ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '변경할비밀번호';

권한정보 업데이트

flush privileges;

오류처리1

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

비밀번호 처리방식 변경

SET GLOBAL validate_password_policy = LOW
SET GLOBAL validate_password_length = 4

설정을 변경하기(mysql.conf)

[mysqld]
validate_password_policy=LOW
validate_password_length=4

Vino 설정 – vnc 서버설정

xubuntu에서 vino 사용을 위한 설정

1. 설치

#apt install vino

2. 설정하기

#gsettings set org.gnome.Vino notify-on-connect false
#gsettings set org.gnome.Vino disable-background false
#gsettings set org.gnome.Vino require-encryption false
#gsettings set org.gnome.Vino prompt-enabled false
#gsettings set org.gnome.Vino vnc-password 1234
#gsettings set org.gnome.Vino view-only true

3. 자동실행 등록

#cp /usr/share/applications/vino-server.desktop /etc/xdg/autostart/

4. 우분투 18.04 이상

이전버전에서는 vino를 설치하지만 우분투 18.04이상에서는 기본적으로 vino가 설치되어 있다. 따라서 설정 > share > 데스크탑 공유 켜기만 하면 된다.

daterangepicker.js

<div class="form-group">
    <div class="input-group input-group-sm" id="default-daterange">
        <input type="text" name="default-daterange" class="form-control" value="<?php echo date("Y-m-d", strtotime("-7 day")) ?> ~ <?php echo date("Y-m-d") ?>" placeholder="기간선택" style="width:200px">
        <span class="input-group-append">
            <span class="input-group-text"><i class="fa fa-calendar"></i></span>
        </span>
    </div>
</div>
<link href="/assets/plugins/bootstrap-daterangepicker/daterangepicker.css" rel="stylesheet" />
<script src="/assets/plugins/bootstrap-daterangepicker/moment.js"></script>
<script src="/assets/plugins/bootstrap-daterangepicker/daterangepicker.js"></script>
<script>
$('#default-daterange').daterangepicker({
	opens: 'right',
	format: 'YYYY-MM-DD',
	separator: ' ~ ',
	startDate: moment().subtract('days', 7),
	endDate: moment(),
	minDate: '<?php echo date("Y-m-d", strtotime("-3 year")) ?>',
	maxDate: '<?php echo date("Y-m-d") ?>',
	locale: {
        "format": "YYYY-MM-DD",
        "separator": " ~ ",
        "applyLabel": "적용",
        "cancelLabel": "취소",
        "fromLabel": "부터",
        "toLabel": "까지",
        "customRangeLabel": "사용자",
        "daysOfWeek": [
            "일",
            "월",
            "화",
            "수",
            "목",
            "금",
            "토"
        ],
        "monthNames": [
            "1월",
            "2월",
            "3월",
            "4월",
            "5월",
            "6월",
            "7월",
            "8월",
            "9월",
            "10월",
            "11월",
            "12월"
        ],
        "firstDay": 1
    }
}, function (start, end) {
	$('#default-daterange input').val(start.format('YYYY-MM-DD') + ' ~ ' + end.format('YYYY-MM-DD'));
});
</script>