스토리아

  • 전체 71건 / 5 페이지
    • 23
    • 오래 전
      2024.04.15
  • 오래 전
  • 이미지 title, alt에 대해서
  • 게시판에 첨부파일로 이미지를 등록하게 되면 홈페이지 설정에 따라 title이나 alt가 생기게 됩니다.title이나 alt가 이미지를 보는 사용자 입장에서 도움말과 같아 여러모로 도움이 되곤 합니다. 또한, 검색로봇에게도 도움이 되죠. 
    하지만, 가끔은 이미지에 마우스를 위치할 때 title이나 alt를 안뜨게 하고 싶을 때도 있습니다.이때 removeAttr() 매서드를 사용하면 됩니다. 요소의 속성 값을 삭제하는 기능을 가지고 있죠.
    아래와 같이 스크립트를 항상 연결이 되는 head나 tail 쪽에 넣어 보세요.
    [code=js]$(document).ready(function(){    $("img").removeAttr("title");    $("img").removeAttr("alt");});[/code]
    자세한 내용은 아래에서 참고하면 됩니다.
    • 22
    • 오래 전
      2024.04.07
  • 오래 전
  • 소리없는 세계에

  • 제 3 화 - 소녀와의 만남
    갑자기 누군가의 비명소리가 나더니 금세 길거리가 난장판이 되기 시작했다. 마물은 일반 몬스터와 다르게 마법을 쓸 때 사용하는 마력을 쓸 수 있다.
     그나저나 나라의 중심인 왕도에 습격이라니 믿기지 않았다. 그때 내 눈앞에 마물에게 당하기 직전인 어린 마법사가 있다. 나는 구해야 겠다는 생각도 하기전에 그 아이를 구하기 위해 뛰어들었다.
    그 순간 낮에 봤던 투구남자가 나를 마물로부터 구해주었다.
    "괜찮나?"
    "...네"
    투구남자가 말하기로는 마물로부터 도시를 지키는 방벽 술식에 문제가 생겨서 방벽이 내려져 마물이 들어온 거라고 말했다. 투구남은 다른 사람들을 구하러 먼저 갔다. 
    "음 아 ... 에... "
    방금 내가 구해주었던 소녀가 소리를 내었다. 마법사 모자에 망토, 커다란 지팡이 쥐고 있는 모습은 정말로 마법사 같은 모습을 하고있었다.
    "저기 괜찮니?"
    "....."
    소녀는 내 말을 이해하지 못했다는 듯이 나를 멀뚱히 쳐다볼 뿐이었다. 소녀가 갑자기 뭔가 생각이 났다는 듯이 바닥에 흩뿌려진 종이들을 주워서 펜을 꺼내 무언갈 쓰기 시작했다. 고민하고 쓰기를 반복하더니 다 썼다는 표정으로 나에게 종이를 건네주었다. 종이의 내용은 '마물로 부터 저를 지켜주셔서 감사합니다. 그리고 마물들의 침략으로 다칠 사람들이 걱정되요..'... 아마 소녀는 내가 기사인줄 아는 것 같다. 현재의 나는 배고픔으로 인해서 몸이 잘 움직이지 않는다.
    "사람들을 지키는건 기사에게 맡기는게 좋을것 같은데.."
    소녀는 내 말이 들리지 않는지 주변을 살펴보고 있다. 아마 소리를 못 듣는 것 같은데.. 어떻게 왕도까지 온건지...나는 일단 소녀와 왕도의 중앙쪽으로 대피했다. 마물에 대한 공포로 인해서 왕도 안쪽도 아수라장이었다. 혼란스러운 와중에도 소녀는 당황하는 기색 하나 없다. 아마 소리가 들리지 않기 때문이겠지.. 나는 많은 기사들이 서있는 건물로 향했다.
    나는 소녀를 건물 내부로 들여보낸 후 바깥의 상황을 살피러 건물 밖으로 나갔다. 무엇때문이지는 몰라도 마물들이 계속 몰려오는 듯했다. 왕도의 입구쪽에서 몰려오는 마물들을 저지하는 사람이 있었다. 마치 다른 기사들은 엑스트라가 된듯이...
    나의 목표이자 존경하는 사람, 용사가 그곳에 있었다.
    • 21
    • 오래 전
      2024.04.05
  • 오래 전
  • 웹페이지에서 서버상태 확인하기
  • 간단히 서버의 상태를 확인하기 위해 콘솔로 접속을 해서 확인하는 것이 귀찮을 때가 있습니다.
    그럴 때 웹페이지에서 간단히 확인할 수 있는 코드들이 많이 있죠.
    서버의 상태를 확인하는 몇 가지 예를 아래 내용 참고하세요.


    [code=php]<div class="row">    <div class="col-md-12">        <h3 class="h3 f-lg en">            서버 상태        </h3>        <hr class="hr"/>        <div class="mt-3 mb-4 p-2" style="background-color:#fafafa;">            <div class="form-group row">                <label class="col-sm-2 col-form-label" for="reg_mb_hp">시스템 정보</label>                <div class="col-sm-10">                    <?php system("uname -a"); ?>                </div>            </div>            <div class="form-group row">                <label class="col-sm-2 col-form-label" for="reg_mb_hp">CPU 사용량</label>                <div class="col-sm-10">                    <?php                        $load = sys_getloadavg();                        $load0 = $load[0]*100;                        $load1 = $load[1]*100;                        $load2 = $load[2]*100;                        echo "1분 : ".$load0." %<br>";                        echo "5분 : ".$load1." %<br>";                        echo "15분 : ".$load2." %";                    ?>                </div>            </div>            <div class="form-group row">                <label class="col-sm-2 col-form-label" for="reg_mb_hp">메모리 사용량</label>                <div class="col-sm-10">                    <?php                        $free         = shell_exec('free');                        $free         = (string) trim($free);                        $free_arr     = explode("\n", $free);                        $mem          = explode(" ", $free_arr[1]);                        $mem          = array_filter($mem);                        $mem          = array_merge($mem);                        $memory_usage = $mem[2] / $mem[1] * 100;
                            $report['total']         = $mem[1];                        $report['used']          = $mem[2];                        $report['usage_percent'] = $memory_usage;
                            echo "전체 : ".number_format($report['total'])." byte<br>";                        echo "사용량 : ".number_format($report['used'])." byte<br>";                        echo "사용량 : ".number_format($report['usage_percent'])." %";                    ?>                </div>            </div>            <div class="form-group row">                <label class="col-sm-2 col-form-label" for="reg_mb_hp">디스크 사용량</label>                <div class="col-sm-10">                    <?php                        $ds                    = disk_total_space("/");                        $df                    = disk_free_space("/");                        $disk['free']          = $df;                        $disk['use']           = $ds - $df;                        $disk['entire']        = $ds;                        $disk['usage_percent'] = $df / $ds * 100;
                            echo "전체공간 : ".number_format($disk['entire'])." byte<br>";                        echo "여유공간 : ".number_format($disk['free'])." byte<br>";                        echo "이용중인 : ".number_format($disk['use'])." byte<br>";                        echo "여유량 : ".number_format($disk['usage_percent'])." %";                    ?>                </div>            </div>            <div class="form-group row">                <label class="col-sm-2 col-form-label" for="reg_mb_hp">폴더 사용량</label>                <div class="col-sm-10">                    <?php                         $du1 = exec("du -sh /var/log"); // 절대경로 또는 상대경로                        $du2 = exec("du -sh /var/log/apache2"); // 절대경로 또는 상대경로                        echo $du1."<br>";                        echo $du2."<br>";                    ?>                </div>            </div>            <div class="form-group row">                <label class="col-sm-2 col-form-label" for="reg_mb_hp">DB 사용량</label>                <div class="col-sm-10">                    <?php                         $db = sql_query(" SELECT table_schema as 'DBName', ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) as 'MB'                         FROM information_schema.tables GROUP BY table_schema ");                        for($i=0;$row=sql_fetch_array($db);$i++){                        echo $row['DBName']." : ".$row['MB']." MB<br>";                        }                                        ?>                </div>            </div>        </div>    </div></div>[/code]
    • 20
    • 오래 전
      2024.04.02
  • 오래 전
  • 캘리그라피 배우기 3일차
  • 3일차. 획 긋기
    획이란? 한 글자를 구성하는 점과 획 모든 글씨는 획으로 구성 하는 것.
    전 시간에 획을 그을때 그냥 주~~욱 그었다면 오늘은 판본체에 맞는 획을 긋는 것을 배웠다.역입, 과봉, 중봉, 회봉을 하고 삼절을 해가며 획 하나 긋는 것도 쉽지 않았다. 'ㄱ' 자의 꺽임이 있는 부분은 붓을 살짝 들었다가 다시 이어 내리는 부분이... 어렵다.일정한 두께로 해야하는데 삐뚤빼뚤이다. 꺾임을 전절이라고 하는데 붓을 살짝 들었다 하는 부분이 쉽지 않다.몇번을 써보니 대충 감이? 오긴 한다.오늘도 연습 내일도 연습~나만의 글씨를 찾아 오늘도 파이팅!! 글씨를 쓰다가 힘이 들면 그림도 그리고어깨도 돌리고 옆 사람들의 솜씨도 보며 돌아다닌다와~~ 중급 분들은 개나리를 그리고 계시네? 멋지다나도 시간 내서 그려봐야지
    글씨를 쓸 때의 중요 한 것은 획을 그을 때 방법을 알고 그 방법을 지키며 연습을 해야 나중에 내 글씨를 찾았을 때 이쁘게 나온다고 한다어깨도 아프고 하지만 자세를 바르게 하고 붓을 바로 잡았다. 바른 획은 어떻게 해야 할까?획 쓰는 요령 
    획은 역입과 과봉 중봉과 회봉의 단계를 거치며 쓴다.
    -역입 : 붓(호)을 획의 진행 방향 반대방향으로 내려놓는 것.
    (판본체에서 주로 쓴다)
    -과봉 : 붓을 진행 방향으로 만들어 세워 획의 두께 만큼 필압을 주어 송필 준비하는 일.

    -중봉 : 획을 그으면서 붓 끝이 획의 중심을 지나도록 하는 것.

    -회봉 : 획이 끝나는 지점에서 진행해온 반대 방향으로 붓을 일으켜 세우며 붓을 (왔던 방향으로) 거두어 들이는 것.
     

    'ㅡ' ,'ㅣ' 직선을 그을 때는 역입 --> 과봉 --> 중봉 --> 회봉 으로 쓰고 
    ▶▶ 획을 그을 때 삼절법으로 긋는다.
    삼절법이란?한 획을 쓰는데 한 번에 주~~욱 같은 필압과 강약으로 쓰는 것이 아니라  2번을 끊어 한 획이 세 마디가 되게 하는 것.
    'ㄱ' 의 꺽는 부분을 쓸 때는 역입 --> 과봉 --> 중봉  꺽임(전절)  과봉 --> 중봉 --> 회봉 으로 쓴다.
    ▶▶ 꺽을 때 전절법으로 쓴다.획의 방향을 바꿀 때 붓의 앞 부분을 고정 시킨 채 뒷 부분을 우측 상단으로 치켜 올린 후 엎어서 내려 획 진행.  'ㄱ','ㄴ','ㄷ','ㄹ' 
    ☆ 붓은 화선지와 수직 유지하며 붓봉이 글자의 중심선을 지키면서 운필한다.(중봉)
         붓봉이 누워서 일어시지 못하고 운필(편봉), 붓이 한쪽으로  치우쳐서 운필(측봉) NO 자나 깨나 중봉!붓은 밀고 가는 것이 아니라 끌고 가는 것!!
    • 13ec9b68c982e7f638e78a00a9fc89bc_1711508753_2962.jpg
    • 19
    • 오래 전
      2024.04.02
  • 오래 전
  • 그림 하고 글 - 벚꽃
  • 하룻밤 사이벚꽃이 활짝피었어요개나리, 진달래에 이어 꽃들이 춤을 추네요
    바쁜일상에잠깐 멈추고 고개를 요리조리 돌려보세요그리고성큼 다가온 봄을 느껴보세요: )
    • 18
    • 오래 전
      2024.03.30
  • 오래 전
  • 소리없는 세계에

  •  제 2 화 - 모험가 길드
    여러 생각을 하며 걷다 보니 어느새 나는 모험가 길드의 앞에 와있었다.
    "이게 모험가 길드인가..? 그냥 술집처럼 보이는데.."
    모험가 길드를 한 번도 본적이 없었기에 앞에 나는 모험가 길드라고 적혀있는 표지판만을 믿고 안에 들어갔다.무섭게 생긴 사람들과 마법사로 보이는 사람 여럿 보였다. 사람들이 굉장히 많고 다들 자기들의 모험담들을 모여 얘기하며 밥을 먹고 있다.
    "사람들이 너무 많아서 여기가 어딘지도 잘 모르겠어.."
    많고 많은 사람들을 지나서 의뢰를 받는 카운터 쪽으로 왔다. 그리고 그 옆에 표지판에 '가입신청' 이라고 적혀 있었다.
    "이곳이 가입신청을 하는 곳인가보네.."
    "어서오세요! 모험가 자격증을 신청하러 오셨나요?"
    아름다운 얼굴과 진한 길고 검은색깔 머리카락을 가진 여성이 인사를 건네왔다. 
    "네, 용사 시험을 치려고 왕도에 왔는데 모험가 자격증이 필요하다고 말해서요.. 하하"
    "아 그러면 잠시만 기다려주세요."
    카운터 여자가 어디론가 갔다. 잠시 뒤, 마법진이 그려진 종이를 손에 들고 그녀가 나에게 왔다.
    "이곳에 손을 올리고 자신의 마음가짐을 표현하세요."
    -이해하기 힘든 말이었다. 마음가짐을 표현하라니.. 마법진이 그려진 종이이니 심리를 읽는 것 정도는 쉽게 할 수 있는 것일까? 나는 종이 위에 내 손을 올려보았다.
    번쩍
     빨간색 빛. 빨간색 빛이 종이에서 뿜어져 나왔다. 빨간색.... 나의 마음가짐은 어쩌면 모험가쪽 체질일 수 도 있는게 아닐...
    "아.. 빨간색 빛이네요.. 마음가짐은 확인했으니 이쪽으로 와서 자격증을 발급 받으세요."
    음? 마치 불쌍한 사람을 보듯이 나를 쳐다보는 그녀였다. 어쩌면 빨간색이 불행인 것 이 아닐까?그녀를 따라가 내 손바닥 안에 들어올 정도로 작은 종이를 받았다. 이런게 자격증이구나. 상상 이상으로 작다.자격증을 받은 내가 돌아가려고 하던 그때 카운터에 있는 여자가 내 팔을 잡았다. 
    "용사 시험을 치려고 하는거라면 4급 모험가 자격이 있어야해요."
    카운터 여자가 여러 세부사항까지 전부 알려주었다. 정말 친절한 사람이다. 낮에 봤던 투구남 설명이 너무 부족했던거 아니냐고..지금 내가 받은 자격증에는 숫자 '5'가 적혀있다. 이걸 '4'로 바꾸기만 하면 용사 시험을 칠 수 있는 자격을 얻는다. 바꾸기 위해서 왕도 바깥쪽 숲에 있는 몬스터를 15마리 잡을 것 퀘스트 5개를 수행할 것 이 모든 것을 끝낸다면 동화 10개로 승급이 가능하다. 강한 몬스터가 아니라 슬라임이나 약한 몬스터들을 잡아도 상관없는 것 같다.
    모험가 길드에서 나오니 밖은 이미 어두워져 있었다. 시간이 벌써 이 정도나 갔다니.
     "아무래도 몬스터는 내일 잡는 것이 좋겠네, 우선 식당을 찾아볼까."
    용사시험 신청 마감일까지 5일이나 남았으니깐 천천히 해도 상관은 없다. 길거리로 나오니 맛있는 냄새가 난다.
    "우선은 저쪽으로.... "
    -꺄아악
    갑자기 누군가의 비명소리가 나더니 금세 길거리가 난장판이 되기 시작했다. 마물들의 습격이다. 마물은 일반 몬스터와 다르게 마법을 쓸 때 사용하는 마력을 쓸 수 있다. 그래서 일반 몬스터보다 몇 배는 강하다. 그나저나 나라의 중심인 왕도에 습격이라니 믿기지 않았다. 그때 내 눈앞에 마물에게 당하기 직전인 어린 마법사가 있다. 나는 구해야 겠다는 생각도 하기전에 그 아이를 구하기 위해 뛰어들었다.
    • 17
    • 오래 전
      2024.03.29
  • 오래 전
  • crontab을 이용해 php 파일 실행하기
  • crontab 설치는 검색을 하면 많기 때문에 생략..
    crontab을 이용해 php 파일을 정해진 시간에 실행하는 코드를 알아보자.
    아래 이미지처럼 crontab에서 스케줄 작성을 할 때 시간 형식을 잘 정해서 작성하면 된다.


    시간 관련 사항이 다섯 자리로 * 는 기본값이 되며 * * * * * 가 결국 1분마다 실행하라는 의미가 된다.10 21 * * * 은 매일 21시 10분 마다 실행*/10 21 * * * 은 21시, 21시 10분, 21시 20분, 21시 30분, 21시 40분, 21시 50분으로 21시부터 10분 단위로 21시 50분까지 실행하라느 의미이다.30 5 3-5 * * 은 매달 3일, 4일, 5일에 5시 30분에 실행을 해라등등.. 시간 관련 사항은 위 이미지 규칙대로만 작성을 잘 해주면 된다.
    그럼 정해진 시간에 php를 실행하려면 어떻게 하면 될까? 
    방법은 크게 2가지가 있다.
    1) 도메인으로 접근을 해서 하는 방법으로 (도메인)/cron/test.php 파일을 실행하려면 아래와 같이 하면 된다.매1분마다 실행한다고 하면
    [code=php]첫번째는* * * * * wget -q --spider "https://도메인/cron/test.php" >> /var/log/test.log 2>&1
    두번째는* * * * * /usr/bin/curl -s -o /dev/null "https://도메인/cron/test.php" >> /var/log/test.log 2>&1[/code]
    2) 내부에서 실행하는 방법으로 1)번보다 좋은 방법이다. test.php 파일의 절대주소로 작성을 하면 된다.[code=php]* * * * * /usr/bin/php -q /home/www/cron/test.php[/code]

    1), 2) 모두 문제점이 있다. 해당 test.php 파일의 위치가 웹으로도 쉽게 접근할 수 있는 위치에 있다는 것이다. 그래서, 위 2가지 방법 모두 아래와 같이 웹에서 접근하는 것을 막는게 좋다.cron 폴더에 .htaccess 파일을 만들어서 해당 내용에 아래와 같이 작성해서 웹에서 접속하는 걸 막는게 좋다.[code=php]<Files *>Order allow,denyAllow from 123.12.123.12</Files>[/code]위에서 123.12.123.12는 서버 외부 아이피이다. ( 홈페이지 아이피이다 ) 
    그리고 마지막 tipcrontab 작성도 잘 한거 같은데, 동작을 하지 않는거 같으면 아래 부분을 점검해라.1) crontab을 작성하고 안전하게 restart를 실행하는게 좋다.[code=php]systemctl restart cron[/code]
    2) test.php가 포함된 폴더의 권한을 crontab으로 주는게 좋다. home/www의 권한이 mstoria라면 아래와 같이 하면 된다.[code=php]chown -R mstoria:crontab /home/www/cron[/code]
    3) 생행파일 test.php 파일에서 php 구문오류가 있어 동작을 하지 않는 경우가 있습니다. /var/log/test.log 파일의 로그를 확인해 보면 됩니다.
    • 7798b2f1a35c05fadb91ac0a98428c64_1711713781_795.png
    • 16
    • 오래 전
      2024.03.29
  • 오래 전
  • 캘리그라피 2일차
  • 2일 차. 수업을 시작 해볼까?
    모든 그림수업은 선긋기부터 배운다. 전에 배웠던 캘리는 붓펜과 매직펜이었는데 이번은 서예 붓으로 먹물을 뭍여서 한다. 이건 또 어떤 느낌일까? 한지에 붓글씨라...학창시절 수업 때 배운 붓글씨가 전부인데 잘 할 수 있을까? 걱정이 앞선다.시작이 반이라고 했다. 이 시간에 성실하게 10장씩 연습하고(선생님이 10장은 해야 한다고 했음.) 수업에 빠지지 않고 하다보면 어느새 잘 하고 있을 내가 되겠지. 그런 나를 상상하며 힘내자.안되면 될 때까지 쓰고 쓰고 쓰고~~ 

    붓을 얼마 만에 잡는건지..  손이 떨린다.서예수업 때 열심히 쓰고 사군자도 그리던 기억이 스스륵 올라와 기분이 묘하다.잘하겠다는 기쁨도 잠시 아~~~~ 선이 삐뚤빼뚤이다.잘 하고 싶다고 옹~~~세로선도 가로선도 맘처럼 되지 않는다. 
    "선긋기가 어느정도 되면 그림도 그려보세요."
    오~ 재밌겠다.  곡선그리기
    동그라미, 곡선, 꽃, 지그제그 ㅎㅎ 재밌네. 

    난에 찾아 온 나비
    헛! 성 그리기가 일정하게 안되네? 급한 성격이 여기서 나오는구나. 차분하게 천천히~ 다시 다시붓으로 하는 게 참 쉽지 않다. 먹물이 금세 사라져서 한 획 긋고 다시 묻여야 하고 붓도 뾰족하게 가지런히 잡아 줘야 한다.그냥 툭 쓰는 게 아니구나. 섬세하게 집중해서 해야 된다. 정신수양!어깨도 눈도 머리도 지끈 거린다. 1시간 30분이 훌쩍 지났다.끝나는 시간이다.아·쉽·다!먹물 접시와 붓을 씻고 정리. 먹을 먹음은 붓의 하얀 화선지 위에서의 춤추기. 느낌이 좋다.발표 때 나의 작품이 어떨지 기대하며 오늘 수업 끝.안뇽! 
    • 13ec9b68c982e7f638e78a00a9fc89bc_1711508517_4582.jpg
    • 15
    • 오래 전
      2024.03.27
  • 오래 전
  • 캘리그라피 배우기 1일차
  • 캘리그라피 수업 첫날.매주 월요일 수업을 한다.3월에 시작하여 10월까지 하고 작품전시회로 마무리를 한다. 설레는 첫 수업이다.
     캘리그라피란?   
    Calligraphy는 아름다운 서체라는 뜻이다.그리스어 "아름답다"는 kallos 와 "글씨"라는 graphy가 합쳐진 단어다.캘리(Calli)는 미(美)를 뜻하며 그라피(Graphy)는 회풍ㆍ서풍ㆍ서법 등 의미를 갖고 있다.손으로 그리는 아름다운 서체. 우리나라의 서예는 전통필법을 기본으로 오랜 수련이 필요한 예술분야다.캘리그라피는 재료, 서법에 얽매이지 않고 자유롭게 표현하면서 예술성과 상업성이 공존하는 분야다. 아름다운 우리 글씨체로 표현하는 캘리그라피는 영화제목, 광고문구, 여러가지에 많이 사용되고 있습니다.서예에 자유로움을 더해 한지에 표현하는 붓 글씨. 먹물이 한지에 퍼지는 순간 또 다른 매력이고 아름다움 그 자체 즐겨보자. 
    준비물 : 격자깔판, 붓발, 먹접시, 먹물, 붓(중), 문진, 화선지, 지관
    붓 잡는 자세를 잘 잡아야 글씨가 예쁘다고 자세 법과 붓에 대해 알아본다. 붓의 구조와 명칭 : 붓은 필관과 모필(毛筆)로 구분된다. - 필관 : 붓대 - 모필(毛筆) : 호(毫)와 봉(鋒), 호(毫)의 끝을 봉(鋒)이라고 한다. - 전호 : 글씨를 쓸 때 지면에 닿는 부분을 말한다. - 부호 : 전호를 제외한 나머지(목물통)부분을 일컫는다.  ◈ 붓 관리   - 새로 구입한 붓은 아교로 형을 잡아 놓기 때문에 흐르는 찬물에 아교를 풀어 씻어준다. (손으로 비비거나 뜨거운 물로 NO)  - 사용 중에도 붓은 본래 형태로 유지. - 사용 후에는 찬물이나 미지근한 물에 봉이 아래로 향하게 씻어 주고, 호와 필관 연결 부분은 엄지와 검지로 꼭꼭 눌러 먹물을 충분히 빼준다. 붓 걸이에 매달아 서늘한 곳에 말린 후 보관하고 이동 시에는 붓 발에 싸서 이동 한다. ※ Tip 바로 씻지 못하는 경우나 잠깐 사용하지 않을 땐 1회용 비닐장갑에 넣어 밀봉하여 냉장보관 
    ◈ 붓 잡는 법(운지법) ▪ 단구법 : 두 손가락 엄지와 검지로 잡기.▪ 쌍구법 : 엄지와 검지, 중지로 잡고 약지로 받치기. ▪ 오지법 : 다섯 손가락으로 잡기(주먹쥐듯이) 
    ◈ 글쓰는 자세 ▪ 서서 쓰기 : 다리를 약간 벌려 중심을 왼손으로 책상을 집고 몸을 조금 굽혀 쓴다.  ▪ 의자 앉아 쓰기 : 가장 일반적인 자세로 몸이 책상에 닿지 않게 앉아서 왼손으로 종이를 누르고 붓을 쥔 오른손과 삼각형을 이루게 하고, 가슴을 바로 펴고 몸만 앞으로 약간 숙여 눈과 지면을 30cm 이상으로 유지한다. ▪ 바닥에 앉아 쓰기 ※ Tip 손목으로 쓰지 않도록 하고 팔을 움직여 쓰기. 붓을 기울이거나 하면 글씨의 두깨가 일정치 않으니 세워서(90도)를 쓰기. 
    ◈ 글 쓸 때 팔의 자세 : 붓 글씨는 팔로 쓴다. ▪ 현완법 : 서예 학습에서 가장 기본이 되는 팔의 자세로 오른팔을 들고 팔꿈치는 밖으로 향하게 하여 팔이 항상 지면과 수평이 되게 한다. (큰 글씨와 중간 글씨 쓸때 알맞다.)▪ 제완법 : 팔꿈치를 책상에 가볍게 대고 쓰는 방법으로 중간 정도의 글씨를 쓰는 데 알맞다. ▪ 침완법 : 왼손 위에 오른손이나 팔을 올려놓고 쓰는 방법으로 작은 글씨를 쓰는 데 적합하다. 
    ◈ 글 쓸 때 용어▪ 운필 : 붓을 잡고 글씨의 점과 획의 방향을 일정한 규칙에 의하여 붓을 움직여 글씨를 완성 시키는 과정 ▪ 용필 : 운필을 하는 동안 붓을 움직이는 속도, 필압의 변화, 방향 바꾸기 등 실제 붓을 사용하는 방법이다.▪ 윤필 : 붓에 먹물을 묻히는 일(붓에 먹을 묻혀 글씨를 쓸 수 있게 가지런하게 한다) ▪ 필압 : 윤필을 한 붓을 누르는 것. 전호를 기준으로 봉에서 부터 3분할하여 1분필, 2분필, 3분필로 교체하면서 운필한다.▪ 한 획이 끝나면 붓은 처음 운필한 상태로 되게 하도록 용필에 유의한다.(회봉) 
    지금까지 이론 수업의 붓 서예 캘리그라피 용어를 살펴봤다.설명만 듣고는 이게 뭐지? 하지만 붓을 잡고 선생님이 하시는 것을 보니 이해가 쉽다.
    먼저 붓과 친해지기.  
    ▪ 먹물을 접시에 담고 붓을 충분히 적셔준 후 필압을 조절하며 선 표현.▪ 가로·세로선 긋기, 점 찍기, 가늘게, 굵게 선을 그어보기.▪ 먹물이 없어 질 때까지 점찍기.▪ 가는 선에서 점점 굵은 선으로 표현하기.

    수업시간에 10장정도 연습 하라고 한다. 10장이라. 나의 의지는 불타오른다. 오늘은 이론 수업과 맛보기 선긋기, 각자의 소개를 하고 수업이 끝났다. 다음 수업을 기대하며 안뇽!
    • 13ec9b68c982e7f638e78a00a9fc89bc_1711508170_7602.jpg
    • 14
    • 오래 전
      2024.03.24
  • 오래 전
  • 그누 여분필드에 임시 저장 기능 넣기
  • 그누보드에 임시 저장 기능이 있어요.그런데, 기본 기능이 제목과 컨텐츠(글작성)에만 적용이 됩니다. 해당 기능을 다른 필드에 적용하는 방법에 대해 알아볼께요.
    임시 저장 기능 아래와 같은 기능인거죠..https://mstoria.com/faq/%EA%B8%80-%EC%9E%91%EC%84%B1%ED%95%98%EB%8B%A4-%EC%A0%80%EC%9E%A5%EC%9D%B4-%EC%95%88%EB%90%98%EC%97%88%EB%8B%A4%EA%B5%AC%EC%9A%94-%EA%B7%B8-%EB%95%8C%EB%8A%94/ 
    임시 저장기능은 로그인한 상태에서 적용이 되는 기능입니다. ^^
    여분필드 wr_1에 임시 저장 기능을 적용하기 위해 아래와 같이 적용을 합니다. 여분필드에 smarteditor2를 적용해서 임시 저장 기능을 사용해 보겠습니다.총 6개의 파일 수정을 해야합니다.

     
    1) 임시저장 테이블인 g5_autosave 에 as_wr_1 필드를 추가합니다. 최소한 text로 지정을 해야겠죠. 2)에디터는 smarteditor2를 이용했습니다. 글쓰기 폼에는 아래와 같이 적용을 합니다.write_skin.php 파일에서 여분필드 글쓰는 곳 적당한 곳에 아래와 같이 추가하세요.C
    opy[code] <?php echo editor_html("wr_1", $wr_1, $is_dhtml_editor); ?> <?php if($is_dhtml_editor) { ?> <style> #wr_1 { display:none; } </style> <?php } else { ?> <script> $("#wr_1").hide().addClass("form-control").show(); </script> <?php } ?>[/code]
    하단에 스크립트도 추가합니다.[code]function fwrite_submit(f) {
        <?php echo get_editor_js("wr_1"); ?> //해당 부분과    <?php echo chk_editor_js("wr_1"); ?> //해당 부분이 추가된 내용이예요. <?php echo $editor_js; // 에디터 사용시 자바스크립트에서 내용을 폼필드로 넣어주며 내용이 입력되었는지 검사함   ?>[/code]
    3)bbs/ajax.autosave.php 파일 내용을 아래와 내용으로 변경하세요.[code]<?phpinclude_once('./_common.php');
    if (!$is_member) die('0');
    $uid     = isset($_REQUEST['uid']) ? preg_replace('/[^0-9]/', '', $_REQUEST['uid']) : 0;$subject = isset($_REQUEST['subject']) ? trim($_REQUEST['subject']) : '';$wr_1 = isset($_REQUEST['wr_1']) ? trim($_REQUEST['wr_1']) : '';$content = isset($_REQUEST['content']) ? trim($_REQUEST['content']) : '';
    if ($subject || $wr_1 || $content) { $sql = " select count(*) as cnt from {$g5['autosave_table']} where mb_id = '{$member['mb_id']}' and as_subject = '$subject' and as_content = '$content' and as_wr_1 = '$wr_1' "; $row = sql_fetch($sql); if (!$row['cnt']) { $sql = " insert into {$g5['autosave_table']} set mb_id = '{$member['mb_id']}', as_uid = '{$uid}', as_subject = '$subject', as_content = '$content', as_wr_1 = '$wr_1', as_datetime = '".G5_TIME_YMDHIS."' on duplicate key update as_subject = '$subject', as_content = '$content', as_wr_1 = '$wr_1', as_datetime = '".G5_TIME_YMDHIS."' "; $result = sql_query($sql, false);
    echo autosave_count($member['mb_id']); }}[/code]
    4)bbs/ajax.autosavelist.php 내용을 아래 내용으로 변경하면 됩니다.[code]<?phpinclude_once('./_common.php');
    if (!$is_member) die('');
    $sql = " select as_id, as_uid, as_subject, as_datetime from {$g5['autosave_table']} where mb_id = '{$member['mb_id']}' order by as_id desc ";$result = sql_query($sql);echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";echo "<list>\n";for ($i=0; $row=sql_fetch_array($result); $i++) { if($row['as_subject']) { $subject  = htmlspecialchars(utf8_strcut($row['as_subject'], 25), ENT_QUOTES); } else { $subject  = "제목 없음"; }    $datetime = substr($row['as_datetime'],2,14);    echo "<item>\n";    echo "<id>{$row['as_id']}</id>\n";    echo "<uid>{$row['as_uid']}</uid>\n";    echo "<subject><![CDATA[{$subject}]]></subject>\n";    echo "<datetime>{$datetime}</datetime>\n";    echo "</item>\n";}echo "</list>";[/code]
    5)bbs/ajax.autosaveload.php 내용을 아래 내용으로 변경하세요.[code]<?phpinclude_once('./_common.php');
    if (!$is_member) die('');
    $as_id = isset($_REQUEST['as_id']) ? (int) $_REQUEST['as_id'] : 0;
    $sql = " select as_subject, as_content, as_of_content from {$g5['autosave_table']} where mb_id = '{$member['mb_id']}' and as_id = {$as_id} ";$row = sql_fetch($sql);$subject = $row['as_subject'];$wr_1 = $row['as_wr_1'];$content = $row['as_content'];
    echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";echo "<item>\n";echo "<subject><![CDATA[{$subject}]]></subject>\n";echo "<wr_1><![CDATA[{$wr_1}]]></wr_1>\n";echo "<content><![CDATA[{$content}]]></content>\n";echo "</item>\n";[/code]
    6)이번엔 js/autosave.js 파일을 수정할꺼예요. 아래의 내용을 변경하시면 됩니다.[code]// 임시 저장하는 시간을 초단위로 설정한다.var AUTOSAVE_INTERVAL = 60; // 초
    // 글의 제목과 내용을 바뀐 부분이 있는지 비교하기 위하여 저장해 놓는 변수var save_wr_subject = null;var save_wr_content = null;var save_wr_1 = null;
    function autosave() {    $("form#fwrite").each(function() {        if(g5_editor != "") {            if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") {                this.wr_content.value = CKEDITOR.instances.wr_content.getData();            } else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") {                this.wr_content.value = ed_wr_content.outputBodyHTML();            } else {                if(typeof get_editor_wr_content == "function" || typeof get_editor_wr_1 == "function") {                    this.wr_content.value = get_editor_wr_content(); this.wr_1.value = get_editor_wr_1();                }            }        }
            // 변수에 저장해 놓은 값과 다를 경우에만 임시 저장함        if (save_wr_subject != this.wr_subject.value || save_wr_content != this.wr_content.value || save_wr_1 != this.wr_1.value) {            $.ajax({                url: g5_bbs_url+"/ajax.autosave.php",                data: {                    "uid" : this.uid.value,                    "subject": this.wr_subject.value,                    "wr_1": this.wr_1.value, "content": this.wr_content.value                },                type: "POST",                success: function(data){                    if (data) {                        $("#autosave_count").html(data);                    }                }            });            save_wr_subject = this.wr_subject.value;            save_wr_1 = this.wr_1.value; save_wr_content = this.wr_content.value;        }    });}
    $(function(){
        if (g5_is_member) {        setInterval(autosave, AUTOSAVE_INTERVAL * 1000);    }
        // 임시저장된 글목록을 가져옴    $("#btn_autosave").click(function(){        if ($("#autosave_pop").is(":hidden")) {            $.get(g5_bbs_url+"/ajax.autosavelist.php", function(data){                //alert(data);                //console.log( "Data: " + data);                $("#autosave_pop ul").empty();                if ($(data).find("list").find("item").length > 0) {                    $(data).find("list").find("item").each(function(i) {                        var id = $(this).find("id").text();                        var uid = $(this).find("uid").text();                        var subject = $(this).find("subject").text();                        var datetime = $(this).find("datetime").text();                        $("#autosave_pop ul")                            .append('<li><a href="#none" class="autosave_load">'+subject+'</a><span>'+datetime+' <button type="button" class="autosave_del">삭제</button></span></li>')                            .find("li:eq("+i+")")                            .data({ as_id: id, uid: uid });                    });                }            }, "xml");            $("#autosave_pop").show();        } else {            $("#autosave_pop").hide();        }    });
        // 임시저장된 글 제목과 내용을 가져와서 제목과 내용 입력박스에 노출해 줌    $(document).on( "click", ".autosave_load", function(){        var $li = $(this).parents("li");        var as_id = $li.data("as_id");        var as_uid = $li.data("uid");        $("#fwrite input[name='uid']").val(as_uid);        $.get(g5_bbs_url+"/ajax.autosaveload.php", {"as_id":as_id}, function(data){            var subject = $(data).find("item").find("subject").text();            var wr_1 = $(data).find("item").find("wr_1").text(); var content = $(data).find("item").find("content").text();            $("#wr_subject").val(subject); $("#wr_1").val(wr_1);            if(g5_editor != "") {                if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") {                    CKEDITOR.instances.wr_content.setData(content);                } else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") {                    ed_wr_content.putContents(content);                } else {                    if(typeof put_editor_wr_content == "function" || typeof put_editor_wr_1) == "function") {                        put_editor_wr_content(content); put_editor_wr_1(wr_1);                    }                }            } else {                $("#fwrite #wr_content").val(content); $("#fwrite #wr_1").val(wr_1);            }        }, "xml");        $("#autosave_pop").hide();    });
        $(document).on( "click", ".autosave_del", function(){        var $li = $(this).parents("li");        var as_id = $li.data("as_id");        $.get(g5_bbs_url+"/ajax.autosavedel.php", {"as_id":as_id}, function(data){            if (data == -1) {                alert("임시 저장된글을 삭제중에 오류가 발생하였습니다.");            } else {                $("#autosave_count").html(data);                $li.remove();            }        });    });
        $(".autosave_close").click(function(){ $("#autosave_pop").hide(); });});[/code] 7)마지막으로 smarteditor2 에서 수정할 내용이 있습니다.plugin/editor/smarteditor2/autosave.editor.php 파일을 아래 내용으로 변경하면 끝입니다. [code]function get_editor_wr_content(){    return oEditors.getById['wr_content'].getIR();}
    function put_editor_wr_content(content){    oEditors.getById["wr_content"].exec("SET_CONTENTS", [""]);    //oEditors.getById["wr_content"].exec("SET_IR", [""]);    oEditors.getById["wr_content"].exec("PASTE_HTML", [content]);
        return;}
    function get_editor_wr_1(){    return oEditors.getById['wr_1'].getIR();}
    function put_editor_wr_1(wr_1){    oEditors.getById["wr_1"].exec("SET_CONTENTS", [""]);    oEditors.getById["wr_1"].exec("PASTE_HTML", [wr_1]); 
        return;}[/code]

    이제 끝났습니다.
    그런데, 적용을 다 했는데 임시 저장이 안되는 것처럼 느낄 수 있어요.이 때는 꼭 "ctrl+f5"로 캐시를 삭제하는 새로고침을 해 보세요.그럼, 임시 기능이 기본 60초로 지정이 되어있는 것처럼 글 작성하다가 60초 동안 아무른 작업을 하고 있지 않으면 자동으로 임시 저장이 됩니다.
    또한, 해당 임시 저장 기능은 로그인을 한 상태에서 적용이 되는 기능입니다. ( 로그인을 하지 않으면 적용되지 않아요 )
    • 953782581e068eb6511f8a176a83e02d_1711282090_7717.png
    • 13
    • 오래 전
      2024.03.16
  • 오래 전
  • 소리없는 세계에

  • 제 1 화 - 용사 유망주 
    내 이름은 파라디수스, 긴 이름 탓인지 사람들은 내 이름은 ‘파라디‘라고 줄여 부른다. 지금 나는 내가 살던 아담한 마을이 아닌 아쿠아왕국에서 가장 큰 도시인 왕도에 와있다. 바로 용사 시험을 보기 위해서이다.     어렸을 때부터 동화책을 읽을 때 가장 좋아했던 인물이 용사였다. 사람들을 위해 위협을 무릅쓰고 악을 무찌른다! 용사 헤로스는 정말이지 멋있는 사람이다. 어렸을때의 꿈을 실현시키기 위해 지금 왕도(王都)에 왔다. 이곳에 처음 오는 순간 중앙에 있는 거대한 성이 시선을 끌었다.     ’정말로 큰 성이네, 태어나서 처음봐.‘     나는 곧장 시험장으로 향했다. 왕도에 도착한 시각이 막 점심시간이 지난 시간때라 거리는 시끄러웠다. 깔끔한 분위기의 기사단 시험장에 도착했다. 투구만 쓰고 있어 기사라고 부르기는 조금 애매한 남자가 입구 앞에 서있었다.     “어이! 거기 소년, 용사 시험을 보기 위해 왔나?”     큰 목소리로 말하는 투구남이었다.     “네.. 네?.”
    주변을 두리번 거리고 나는 -
    "저한테 하는 말인가요?"     “그래! 그렇다! 보아하니 전투 라는걸 많이 해본적 없어 보이는군!  전투의 기본은 기세부터 시작하지, 기세로 상대를 누르고 전투을 시작하면- .... ”     투구남은 전투에 관한 기초적인 설명부터 시작해서 알아도 그만 몰라도 그만인 이야기들을 이어 얘기 했다.     “저.. 저기!, 저는 용사 시험 신청을 하고 싶은데요!”     “아 역시 그런가, 용사 시험을 보기 위해서는 모험가 자격증이 있어야 하는데 가지고있나?”  인간을 위협하는 마물들을 처리하는 것을 하는 사람은 용사만 존재하는 것은 아니다.모험가는 여러 왕국이나 도시들을 오고가며 의뢰를 받고 이를 수행하는 사람들을  말한다. 
    의뢰들 중에도 마물토벌 의뢰도 존재한다. 의뢰는 자격이 있는 사람만 할 수 있는데 그것이 모험가 자격증이다. 아마도 중급자 이상의 전투 기술과 능력이 있어야 용사 시험을 칠 수 있는 것 같다.     가장 큰 문제다. 왜냐하면 나는 모험가 자격증을 가지고 있지 않다. 나는 우울해진 표정으로 왕도에서 모험가 길드를 찾으러 간다.     ’몇 가지 의뢰를 받아서 테스트 한 다음에 자격증을 받는 구조일까?‘     모험가 자격 테스트에 관해 들은 것이 없어서 궁금증을 가지며 가다보니 모험가 길드의 입구에 도착했다.
    • 12
    • 오래 전
      2024.03.12
  • 오래 전
  • input태그에서 숫자만 특정 범위로 입력 받기
  • input 태그를 이용해서 숫자만 입력을 받을 필요가 있을 경우가 있습니다.이 때, type을 number만 지정하면 쉽게 숫자만 받을 수 있습니다.[code]<input type="number" name="test">[/code]type이 number일 때 첫자는 문자 입력이 될 수도 있습니다. 
    상황에 따라 숫자의 범위가 필요한 경우가 있습니다. 이때도 min, max를 이용해서 아래와 같이 쉽게 적용할 수 있습니다. 100~1000 사이의 숫자[code]<input type="number" name="test" min="100" max="1000">[/code] 
     
    하지만, 위와 같은 경우 사용자 입장에서 다른 표기가 없다면 어느 범위의 숫자를 입력할 수 있는지 등의 불편함이 있습니다.그래서 아래와 같이 스크립트를 이용해서 잘못된 값을 입력했을 경우 메세지를 보여주고 정상적인 입력값을 넣을 수 있게 할 수 있습니다. name이 test인 input 태그에서 300~1000 사이의 숫자만 입력하게 한다면 아래와 같습니다.
    input태그는[code]<input type="number" name="test">[/code]

    스크립트 부분은 아래와 같습니다.[code]<script>  $(document).on("keyup", "input[name='test']", function() {  var num = $(this).val();   if(num.replace(/[0-9]/g, "").length > 0) {  alert("숫자만 입력해 주세요.");  $(this).val('');  }   if(num > 300 && num < 1000) {  alert("300~1000 범위의 숫자만 입력해 주세요.");  $(this).val('');  }  }); </script>[/code]

검색

게시물 검색