글 목록

리눅스 tar.gz로 압축하기 압축풀기

주로 리눅스에선 tar와 tar.gz을 사용하게 되는데, 이를 해제하려면 무슨 짓을 해야하는지 알아본다. (사실 내가 자꾸 까먹어서..)

눈치 빠른사람은 tar랑 gz 둘 다 다른 확장자라는 것을 눈치 챘을것이다. tar는 우리가 흔히 아는 타르를 생각하면 빠를 것 같다. (왜 그 검은색의 끈적끈적한…)

타르는 한 파일로 묶어주는 기능이지만 용량을 줄여주진 않는다. 이 때문에 gz로 압축을 같이 해 주는 것이다!

압축하기

tar -zcvf 파일명.tar.gz 폴더명

tar.gz를 압축 푸는것도 비슷하지만 다른 명령어를 사용해서 풀 수 있다.

압축 풀기

tar -zxvf 파일명.tar.gz

리눅스 파일 내 특정 키워드 가진 파일 찾기

사용하다 보면 파일 내 특정 키워드를 가진 파일을 찾고 싶을 때가 있다.

이는 grep으로 쉽게 찾을 수 있다.

사용법

grep -r 키워드 *

하면 해당 폴더 내 키워드를 가진 파일 목록이 나올 것이다.

혹은, 우분투 사용 시 tracker라는 걸 사용할 수도 있지만 이는 여기에서 서술하지 않는다.

리눅스 재시작시 forever도 같이 시작하기

자고 일어나서 보니 모든 서버가 다 꺼져있다 ㅠ

uptime을 보니 얼마전에 재시작을 한 듯 한데 (아니면 무슨 일이 있었던것이거나..)

어찌됐던, 서버가 갑자기 재시작하는 일이 생길 수 있으니 설정을 해 두는것이 맞다고 본다.

스택오버플로우에 해당 문제 해결방법을 찾을 수 있었다.

아래는 best answer 본문이다.

  1. To start editing run the following replacing the “testuser” with your desired runtime user for the node process. If you choose a different user other than yourself, you will have to run this with sudo.
    $ crontab -u testuser -e
  2. If you have never done this before, it will ask you which editor you wish to edit with. I like vim, but will recommend nano for ease of use.
  3. Once in the editor add the following line:
    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
  4. Save the file. You should get some feedback that the cron has been installed.
  5. For further confirmation of the installation of the cron, execute the following (again replacing “testuser” with your target username) to list the currently installed crons:
    $ crontab -u testuser -l 

Note that in my opinion, you should always use full paths when executing binaries in cron. Also, if the path to your forever script is not correct, run which forever to get the full path.

Given that forever calls node, you may also want to provide the full path to node:

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js

 

forever의 위치는 다를 수 있으니 which forever를 써서 확인 해 볼 것!

Lynis를 사용한 리눅스 보안 설정

Lynis를 사용하면 현재 설정된 웹 서버/ssh 등의 설정들을 검사하고 그 결과를 리포팅해주는 프로그램이다.

16.04 xenial 기준 버전 설치 설명

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C80E383C3DE9F082E01391A0366C67DE91CA5D5F

Lynis의 레포지토리는 https를 사용하므로 apt-transport-https를 필요로 한다

sudo apt-get install apt-transport-https

 

이후 레포지토리를 추가한다

sudo add-apt-repository "deb [arch=amd64] https://packages.cisofy.com/community/lynis/deb/ xenial main"

이후

sudo apt-get update 
sudo apt-get install lynis

해주면 설치가 완료된다.

 

설치 이후

lynis update info

를 입력하면 최신버전 여부를 확인할 수 있다.

 

보안 리포트 결과는

sudo lynis audit system

으로 받아볼 수 있다.

실버크라운

JSP다운로드
유니티다운로드 블러드라인

실버크라운
main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML> 
<html> 
<head> 
<meta charset = "utf-8"> 
<title>MAIN</title> 
<style> 
  td input { 
    width:120px; 
    display:inline-block; 
    height:50px; 
  } 
  td h2 { 
    text-align:center; 
  } 
</style> 
</head> 
<body> 
<table border="1"> 
<tbody> 
  <tr> 
    <td colspan="3"><h2>차량 현황 보기</h2></td> 
  </tr> 
  <tr> 
    <td><input type="button" value="삽입" onclick="location.href='carInsert.jsp'"></td> 
    <td><input type="button" value="전체보기" onclick="location.href='ShowCar.jsp'"></td> 
    <td><input type="button" value="모두삭제" onclick="location.href='delAllCarServlet.do'"></td> 
  </tr> 
</tbody> 
</table> 
</body> 
</html>

블러드라인

dasfsaafdsafsadfsad

카메라에 붙음

레이캐스트

using UnityEngine; 
using System.Collections; 
 
public class CharacterRay : MonoBehaviour { 
    //CharacterRay는 Camera에 붙어있음 
   
  // Update is called once per frame 
  void Update () { 
      if(Input.GetMouseButtonDown(0)) //클릭시 
        { 
            RaycastHit hit; 
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
            if (Physics.Raycast(ray, out hit)) 
            { 
                if (hit.transform.gameObject.tag == "Enemy") //맞은 오브젝트의 tag가 Enemy일경우 
                { 
                    hit.transform.gameObject.SendMessage("Dead"); 
                    //맞은 gameobject에서 Dead라는 메소드 실행, 인자값없음 
                } 
            } 
        } 
  } 
} 

 

각각 솔져에 붙음

코루틴

 

index는 반드시 Unity상에서 각각 솔져별로 숫자를 다르게 해 줄것, 숫자는 0부터 시작

using UnityEngine; 
using System.Collections; 
 
public class RayStandBy : MonoBehaviour { 
    //RayStandBy는 각각의 soldier들에게 붙어있고, 각 soldier들의 상태를 갖고있음 
 
    public int index = -1; //각각의 index는 여기서 수정하는 것이 아닌 Unity상에서 수정함!! 
    public GameObject explosion; // 
 
    void Start() 
    { 
        if(DisplaySoldier.controller.soldiers[index] == 0) //자신의 index의 값이 0일경우 (꺼진 상태) 
        { 
            gameObject.SetActive(false); //자신의 Active상태를 false로 바꿈(끔) 
        } 
    } 
 
    public void Dead() //CharacterRay에서 실행할 메소드 
    { 
        GetComponent<Animator>().SetBool("dead", true); //애니메이션 변경 
        StartCoroutine(DeadStandby()); //코루틴 실행 
 
    } 
 
    IEnumerator DeadStandby() 
    { 
        yield return new WaitForSeconds(2); //2초대기 
        Instantiate(explosion, transform.position, transform.rotation); //폭발! 
        DisplaySoldier.controller.changeState(index); //DisplaySoldier에서 changeState메소드 실행, 인자값은 각 soldier들의 index 
        Destroy(gameObject);//자기자신 삭제 
    } 
} 

 

바깥에 Empty Object에 붙임

모든 솔져들 컨트롤

using UnityEngine; 
using System.Collections; 
 
public class DisplaySoldier : MonoBehaviour { 
    //DisplaySoldier는 바깥에 EmptyObject에서 모든 soldier들의 Active상태를 관리하기 위해 사용 
 
 
    public static DisplaySoldier controller; 
    //외부에서 쉽게 접근할 수 있도록 controller를 static으로 선언 
     
    public int[] soldiers = { 1, 1, 1, 1 }; //각 솔져들의 기본 상태 
    // 0 : 보이지않음 
    // 1 : 보임 (SetActive(true)) 
 
    void Awake() //시작할때! 
    { 
        controller = this; 
        //자기자신을 등록 
 
        if(PlayerPrefs.GetString("soldiers") != "") //soldiers라는 PlayerPref가 존재할경우 (저장된경우) 
        { 
            string[] ary; //임시변수 
            ary = PlayerPrefs.GetString("soldiers").Split(','); // ','를 기준으로 잘라냄 
 
            for(int i = 0; i < soldiers.Length; i++) 
            { 
                soldiers[i] = System.Convert.ToInt32(ary[i]); //string형을 int형으로 형변환해줌 
            } 
        } 
    } 
    public void changeState(int index) //soldiers 어레이를 수정할 메소드 
    { 
        soldiers[index] = 0; // 0의 경우 SetActive를 False로 변환 
        string ary = ""; //PlayerPref를 string형으로 저장하기 위해 사용할 임시변수 
        for(int i = 0; i < soldiers.Length; i++) 
        { 
            if(i < soldiers.Length -1) 
            { 
                ary += soldiers[i].ToString() + ","; //하나 추가하고 뒤에 ','를 붙여줌 
            } 
            else 
            { 
                ary += soldiers[i].ToString(); // 마지막의 경우 ,를 붙일 이유가 없음 
            } 
        } 
        PlayerPrefs.SetString("soldiers", ary); 
        //solders라는 이름의 PlayerPref을 ary값으로 설정 
    } 
} 

DDL 제약조건

데이터베이스는 제약 조건을 사용하여 데이터를 일관성 없는 조작으로부터 보호합니다.

제약조건 유형

NOT NULL

열에 NULL값을 허용하지 않음

UNIQUE

열 혹은 열 조합은 유일해야함.

PRIMARY KEY

유일해야하고, NULL값을 허용하지 않음.

FOREIGN KEY

자신 또는 다른 테이블의 열 또는 열 조합을 참조하도록 하여 관계 설정.

CHECK

열 또는 열 조합이 조건에 참인 값만 허용

[백업글]리눅스 유저 삭제

유저 생성엔 useradd 혹은 adduser를 사용하면 된다했고,

생성된 유저의 비밀번호 변경에는 passwd를 사용하면 된다고 했다.

하지만 어떠한 경우에 의해서 계정을 삭제해야 할 때가 있는데,

이럴 땐 userdel 명령어를 사용하면 삭제할 수 있다.

사용법은

userdel 사용자명

userdel [-옵션]  사용자명

즉,

홈 디렉토리같은걸 같이 한번에 삭제하고 싶을 땐

userdel -r 사용자명

자신의 소유가 아닌 것이라도 삭제하고 싶을 땐

userdel -r -f 사용자명

이런식으로 사용 가능하다.

SELinux에 매핑된 유저를 삭제할 땐 -Z 옵션을 붙여주면 된다.