php 시간 표현 예시 - dateTime 사용 예시



- 현재 시간 구하기 (YYYY-mm-dd) format




        $current_date = new DateTime();

        $current_date->format('Y-m-d');

  



- 현재 요일 구하기




function get_day_of_week($sql_date)

{

        $updated_date = new DateTime($sql_dat);

        $day_of_week = $updated_date->format('D');

        return $day_of_week;

}







- 두 시간 표현 간 시간 차이 구하기 

참고: http://haruair.com/blog/1871, http://php.net/manual/kr/datetime.diff.php





public DateInterval DateTime::diff ( DateTimeInterface $datetime2 [, bool $absolute = false ] )





       $date_db= new DateTime();

        $date_news=new DateTime("2014-01-28");

        $diff=$date_db->diff($date_news);

        print "\ndiff days".$diff->days; // 522



        if($date_news <= $date_db)

        {

            echo "\nnews data is older than or same as db\n";

            break;

        }

        else

        {

            echo "\nnews data is newer than db\n";


- 두 개의 시간 비교하기 

최신일 수록 값이 크기 때문에 오늘과 미래를 비교하면 비교식에서 미래가  오늘보다 더 크다 
 

<?php
$date1 = new DateTime("now"); or $date1= new DateTime();

$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>

위 예제의 출력:

bool(false)
bool(true)
bool(false)





- 특정 날짜의 하루 전 날 구하기 

참고: http://php.net/manual/en/datetime.modify.php



<?php
$date = new DateTime('2006-12-12');
$date->modify('-1 day');
echo $date->format('Y-m-d');
?>








  • dd 2018.01.09 21:30 ADDR 수정/삭제 답글


    $date->modify('+1 month');

lightsail wordpress [pool wordpress] server reached pm.max_children setting (25) warninng




트래픽은 큰 차이가 안나는데 갑자기 cpu 사용량이 치솟으면서 사이트가 먹통이 되는 현상이 발생하였다. 

그 당시는 외부에서 발표중이여서 서버 재부팅으로 그 순간을 넘겼는데 그 후 같은 현상이 반복되서 원인 파악에 들어갔다. 


php-fpm 에러로그 파일 위치

/opt/bitnami/php/var/log/php-fpm.log


php-fpm 세팅 파일 위치

/opt/bitnami/php/etc/php-fpm.conf




bitnami@ip:/opt/bitnami/php/etc$ sudo cat /opt/bitnami/php/var/log/php-fpm.log

[15-May-2020 12:52:48] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 3 idle, and 13 total children

[15-May-2020 12:52:56] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 14 total children

[15-May-2020 12:53:00] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 18 total children

[15-May-2020 12:53:03] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 22 total children

[15-May-2020 12:53:07] WARNING: [pool wordpress] server reached pm.max_children setting (25), consider raising it

[15-May-2020 12:56:03] WARNING: [pool wordpress] server reached pm.max_children setting (25), consider raising it

[16-May-2020 06:16:58] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 3 idle, and 13 total children

[16-May-2020 06:17:07] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 3 idle, and 14 total children

[16-May-2020 06:17:08] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 3 idle, and 15 total children

[16-May-2020 07:52:26] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 2 idle, and 21 total children

[16-May-2020 07:52:29] WARNING: [pool wordpress] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 2 idle, and 23 total children

[16-May-2020 07:52:34] WARNING: [pool wordpress] server reached pm.max_children setting (25), consider raising it



워드프레스 pool쪽에서 문제가 생긴듯하다. 



참고로 php-fpm에서 사용하는 설정 파일(conf) 찾는법 


bitnam$ ps aux | grep php-fpm

root      3476  0.0  0.2 146396  9340 ?        Ss   08:20   0:01 php-fpm: master process (/opt/bitnami/php/etc/php-fpm.conf)

daemon    3477  0.6  0.6 153868 25196 ?        S    08:20   4:15 php-fpm: pool wordpress

daemon    3478  0.6  0.6 154064 25380 ?        S    08:20   4:09 php-fpm: pool wordpress



해당 설정파일을 가면 마지막에 두 개의 pool 설정 파일을 include 하고 있다. 




bitnam$ tail /opt/bitnami/php/etc/php-fpm.conf


include=/opt/bitnami/apps/wordpress/conf/php-fpm/pool.conf


include=/opt/bitnami/apps/phpmyadmin/conf/php-fpm/pool.conf


워드프레스 쪽의 설정 파일을 확인해본다. 


bitnami@ip$ cat /opt/bitnami/apps/wordpress/conf/php-fpm/pool.conf

[wordpress]

listen=/opt/bitnami/php/var/run/wordpress.sock

include=/opt/bitnami/php/etc/common-dynamic.conf

include=/opt/bitnami/apps/wordpress/conf/php-fpm/php-settings.conf

include=/opt/bitnami/php/etc/environment.conf

pm=dynamic




여기서 다시 common-dynamic.conf를 include하고 있다. 

다시 그 파일 설정으로 들어가면 common.conf 파일을 include하고 있다. 

common.conf 파일까지 가야지 드디어 


bitnami$ cat /opt/bitnami/php/etc/common-dynamic.conf

include=/opt/bitnami/php/etc/common.conf

pm=dynamic

pm.max_children=5

pm.start_servers=2

pm.min_spare_servers=1

pm.max_spare_servers=3


include=/opt/bitnami/php/etc/bitnami/common.conf




bitnami$ cat /opt/bitnami/php/etc/bitnami/common.conf

;

; Bitnami PHP-FPM Configuration

; Copyright 2019 Bitnami.com All Rights Reserved

;

; Note: This file will be modified on server size changes

;

pm.max_children=25

pm.start_servers=4

pm.min_spare_servers=4

pm.max_spare_servers=10

pm.max_requests=5000



각각의 옵션 설명은 아래 설정 파일의 설명을 참고하면 된다. 


; Choose how the process manager will control the number of child processes.

; Possible Values:

;   static  - a fixed number (pm.max_children) of child processes;

;   dynamic - the number of child processes are set dynamically based on the

;             following directives. With this process management, there will be

;             always at least 1 children.

;             pm.max_children      - the maximum number of children that can

;                                    be alive at the same time.

;             pm.start_servers     - the number of children created on startup.

;             pm.min_spare_servers - the minimum number of children in 'idle'

;                                    state (waiting to process). If the number

;                                    of 'idle' processes is less than this

;                                    number then some children will be created.

;             pm.max_spare_servers - the maximum number of children in 'idle'

;                                    state (waiting to process). If the number

;                                    of 'idle' processes is greater than this

;                                    number then some children will be killed.

;  ondemand - no children are created at startup. Children will be forked when

;             new requests will connect. The following parameter are used:

;             pm.max_children           - the maximum number of children that

;                                         can be alive at the same time.

;             pm.process_idle_timeout   - The number of seconds after which

;                                         an idle process will be killed.

; Note: This value is mandatory.





pm.max_children 수를 50으로 증가시키고 php-fpm을 재시작해서 변경 사항을 반영한다. 


sudo /opt/bitnami/ctlscript.sh restart php-fpm







그런데 이 포스팅을 작성하면서 cpu 사용량이 조금씩 상승하고 있어서 아파치 접속 로그를 확인해봤더니 

아래와 같이 존재하지 않는 경로를 요청하는 수상한 ip들이 보여서 검색해보니 최근에 스팸 등으로 블랙리스트에 신고된 아이피였다. 


https://cleantalk.org/blacklists/173.212.194.14



bitnami$ tail -f /opt/bitnami/apache2/logs/access_log


173.212.194.14 - - [17/May/2020:00:22:28 +0900] "GET /product-tag/med/?product_orderby=popularity&product_count=24&product_view=grid&product_order=asc HTTP/1.1" 301 -

173.212.194.14 - - [17/May/2020:00:22:47 +0900] "GET /?product_orderby=popularity&product_count=24&product_view=grid&product_order=asc HTTP/1.1" 200 22179




이것만은 원인은 아니겠지만 그래도 원인 중 하나일 것 같아서 워드프레스 보안 플러그인 설정 변경도 해야겠다. 




php-fpm status 쉽게 확인하는 법




; By default the status page output is formatted as text/plain. Passing either

; 'html', 'xml' or 'json' in the query string will return the corresponding

; output syntax. Example:

;   http://www.foo.bar/status

;   http://www.foo.bar/status?json

;   http://www.foo.bar/status?html

;   http://www.foo.bar/status?xml

;

; By default the status page only outputs short status. Passing 'full' in the

; query string will also return status for each pool process.

; Example:

;   http://www.foo.bar/status?full

;   http://www.foo.bar/status?json&full

;   http://www.foo.bar/status?html&full

;   http://www.foo.bar/status?xml&full

; The Full status returns for each process:

;   pid                  - the PID of the process;

;   state                - the state of the process (Idle, Running, ...);

;   start time           - the date and time the process has started;

;   start since          - the number of seconds since the process has started;

;   requests             - the number of requests the process has served;

;   request duration     - the duration in µs of the requests;

;   request method       - the request method (GET, POST, ...);

;   request URI          - the request URI with the query string;

;   content length       - the content length of the request (only with POST);

;   user                 - the user (PHP_AUTH_USER) (or '-' if not set);

;   script               - the main script called (or '-' if not set);

;   last request cpu     - the %cpu the last request consumed

;                          it's always 0 if the process is not in Idle state

;                          because CPU calculation is done when the request

;                          processing has terminated;

;   last request memory  - the max amount of memory the last request consumed

;                          it's always 0 if the process is not in Idle state

;                          because memory calculation is done when the request

;                          processing has terminated;

; If the process is in Idle state, then informations are related to the

; last request the process has served. Otherwise informations are related to

; the current request being served.

; Example output:

;   ************************

;   pid:                  31330

;   state:                Running

;   start time:           01/Jul/2011:17:53:49 +0200

;   start since:          63087

;   requests:             12808

;   request duration:     1250261

;   request method:       GET

;   request URI:          /test_mem.php?N=10000

;   content length:       0

;   user:                 -

;   script:               /home/fat/web/docs/php/test_mem.php

;   last request cpu:     0.00

;   last request memory:  0

;

; Note: There is a real-time FPM status monitoring sample web page available

;       It's available in: /bitnami/lamp73stack-linux-x64/output/php/share/php/fpm/status.html

;

; Note: The value must start with a leading slash (/). The value can be

;       anything, but it may not be a good idea to use the .php extension or it

;       may conflict with a real PHP file.

; Default Value: not set

;pm.status_path = /status






그리고 응답이 늦어지는 상황을 좀 더 모니터링 하기 위해 slowlog를 설정한다


; The log file for slow requests

; Default Value: not set

; Note: slowlog is mandatory if request_slowlog_timeout is set

;slowlog = log/$pool.log.slow


; The timeout for serving a single request after which a PHP backtrace will be

; dumped to the 'slowlog' file. A value of '0s' means 'off'.

; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)

; Default Value: 0

;request_slowlog_timeout = 0



최종 변경사항들은 아래와 같다. 


pm.status_path = /status

slowlog = log/$pool.log.slow

request_slowlog_timeout = 0




참고: https://www.tecmint.com/enable-monitor-php-fpm-status-in-nginx/


https://stackoverflow.com/questions/15465333/php-fpm-processes-monitoring-profiling


https://docs.bitnami.com/aws/apps/wordpress-pro/configuration/configure-phpfpm-processes/


https://www.php.net/manual/en/install.fpm.configuration.php

pandas : TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'




pandas 에러 처리



  TypeError: Only valid with DatetimeIndex,

 TimedeltaIndex or PeriodIndex, but got an instance of 'Index'





기계학습 실험을 하기 위해 그냥 평상시처럼 csv 파일을 아래와 같이 읽어왔다. 





rawdata = pd.read_csv("/data/training.csv", parse_dates =["date"], index_col ="date", sep='\t', encoding='utf-8')


...


ds['vacancy'].resample(rule='M').mean().plot('bar')


필드별 통계를 보기위해 resample을 했는데 아래와 같은 에러가 발생하는 것이다?!


pandas :  TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'


resample을 하기위해서는 datetimeindex가 있어야하는데 index만 있다는 것이다. 


csv 읽어올때 parse_dates 옵션을 줬는데도 info를 확인해보니 datetimeindex가 아닌 index로 걸려있었다. 






nan을 보니 빈문자열이 있는 것 같아서 삭제했는데도 index만 걸려있다. 


to_datetime 함수로 명확하게 필드 타입 변환을 해보기로 했다. 

에러를 확인해야하니 errors='raise'로 설정하였다. 




ds['date'] = pd.to_datetime(rawdata['date'].str.strip(), format='%Y-%m-%d', errors='raise')


아래 date라는 필드명과 에러가 나는 문자열 이름이 같아서 좀 헷갈렸는데 

date라는 문자열이 해당 date 필드에 들어있어서 문자열 변환에서 오류가 난 것이다. 

중간에 컬럼명이 한번 더 들어간 모양이다. 



ValueError: time data u'date' does match format specified



이렇게 해서 해결! 인 줄 알았는데 아래와 같이 이상한 문자열 에러는 계속 나왔다 ㅠㅠ

정부 open API로 데이터를 수집한 것은 좋은데 검증은 안하고 그냥 데이터 보내나 보다 ㅠㅠ


time data u'0973-04-12' does match format specified

ValueError: time data u'9187-06-08' does match format specified

ValueError: time data u'0999-09-08' does match format specified

time data u'1669-09-11' does match format specified



위 문자열까지 해결하니 제대로 datetimeindex 걸린것을 확인할 수 있었다. 


<class 'pandas.core.frame.DataFrame'>

DatetimeIndex: 102918 entries, 1960-12-17 to 2020-06-23
Data columns (total 36 columns):
opnSvcNm         102918 non-null object






postgres 데이터 파일로 저장하기


https://www.postgresql.org/docs/10/static/sql-copy.html




postgresql 테이블의 데이터를 csv로 저장하려면 copy to 문을 사용하면 된다. 

아래 copy 문법과 예시 참조할 것. 



문법 ) 

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ]
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ]
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE NOT NULL column_name [, ...] ] ] ]

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | STDOUT }
    [ [ WITH ]
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ]
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE QUOTE { column_name [, ...] | * } ] ] ]


delimiter는 구분자를 무엇으로 할 지 지정하는 옵션이다. 


force quote는 컬럼에서 null이 아닌 컬럼 내용을 둘러싸는 기능을 이야기 한다. 

컬럼 이름을 설정해서 그 컬럼만 할 수 있고 *를 선택하면 전체 컬럼에 반영이 된다. 

copy to 에서 csv format을 선택할때만 사용할 수 있는 옵션이다. 



If * is specified, non-NULL values will be quoted in all columns. This option is allowed only in COPY TO, and only when using CSV format.



예시 1 ) , 를 구분자로 해서 파일로 저장하는 케이스 





COPY (

    SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog'

) TO '/path/to/csv/cms_title_dump.csv' WITH CSV HEADER DELIMITER ';';







예시 2) 빈 문자열을 구분자로 하고 "로 칼럼을 감싸서 저장하는 케이스 




copy (  select name, name, bldnm from table1 ,table2 where table1.id = table2.id order by namecnt desc)

to '/home/housename.csv' with csv header DELIMITER ' ' FORCE QUOTE *;



output 

name,name,bldnm
"엘지메트로시티2","엘지메트로시티2","엘지메트로시티"
"파크리오","파크리오","파크리오"
"성원","성원","성원아파트"
"잠실엘스","잠실엘스","잠실엘스"



예시 3) 중간에 다른 문자를 포함해서 저장하는 케이스 



copy (  select name, '{', name, bldnm, '}'  from table1 ,table2 where table1.id = table2.id order by namecnt desc)

to '/home/housename.csv' with csv header DELIMITER ' ';





예시 4 ) 탭으로 구분자를 할 경우 





COPY (

    SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog'

) TO '/path/to/csv/cms_title_dump.csv' WITH CSV HEADER DELIMITER E'\t';






















애드몹 광고 제한 ㅠㅠ




어플 애드몹 광고 제한 ㅠㅠ





광고 게재 올리고 3일도 안되서 아래와 같은 이메일이 날라오면서 애드몹 광고가 제한되었다 ㅠㅠ



-------------------------------------------------------------------------------------------------------------


안녕하세요.


최근 게시자님의 AdMob 계정에서 무효 활동 문제가 확인되었습니다. 이에 따라 게시자님의 계정에 광고 게재 제한이 적용되었습니다. 이 제한은 Google에서 계정의 활동을 지속적으로 모니터링하면서 자동으로 검토 및 업데이트됩니다.


이 조치가 취해진 이유


게시자님의 계정에서 광고 수익을 올리기 위해 잠재적인 무효 트래픽을 사용하고 있다는 사실이 확인되었습니다. 참고로, 무효 트래픽은 AdMob 및 애드센스 프로그램 정책에 따라 엄격히 금지됩니다. 


Google 광고 클릭은 사용자의 관심에서 기인한 것이어야 하며, 게시자가 자신의 광고를 클릭하도록 다른 사용자에게 요청해서는 안 됩니다. 여기에는 앱에 대한 지원을 요청하는 것과 이러한 행위의 대가로 제3자를 위해 모금을 약속하는 것 등이 포함됩니다. 또한 자신의 광고를 직접 클릭하거나, 자동화된 클릭 도구, 트래픽 소스, 로봇, 기타 사기성 소프트웨어를 사용하는 것도 금지됩니다.


Google에서 감지한 무효 활동에 대해 자세히 알고 싶어 하신다는 점을 잘 알고 있지만, 이러한 정보는 Google의 독자적인 탐지 시스템을 우회하는 데 사용될 우려가 있어 무효 활동과 관련되었을 수 있는 사용자 등 구체적인 계정 활동에 대한 정보를 게시자에게 제공할 수 없음을 양해해 주시기 바랍니다.AdMob 및 애드센스 프로그램 정책을 위반한 것으로 확인될 경우 계정에 추가 시정 조치가 적용되거나 계정이 영구적으로 정지될 수 있습니다.



-------------------------------------------------------------------------------------------------------------




대충 원인을 짐작하자면 광고 포함한 업데이트 릴리즈하면서 짧은 시간에 20개가 넘는 테스트 폰들에서 광고가 제대로 나오나 빠르게 점검하면서 실수로(정말!) 2~3번 정도 클릭했는데 이게 문제가 된 것 같다. 


검색을 해보니 광고 게재가 제한되면 최대 30일동안 영향을 받을 수 있다고 한다 ㅠㅠ

이의신청을 해서 받아지면 그것보다는 짧아질 수도 있다고 한다. 


-----------------------------------------------------------------------------------------------------------------


Google에서는 광고주, 게시자, 사용자를 사기 및 좋지 않은 광고 경험으로부터 보호하는 광고 생태계를 유지하기 위해 노력하고 있습니다. 따라서 Google에서는 AdMob 계정에 게재할 수 있는 광고 수에 대한 한도를 지정할 수 있습니다. Google에서 트래픽 품질을 평가하기 위해 광고 게재가 일시적으로 제한될 수도 있고 AdMob 계정에서 무효 트래픽 문제가 확인되었기 때문일 수도 있습니다. 


광고 게재 제한은 AdMob 네트워크에만 적용되며 제3자 미디에이션, 하우스 광고, 직접 판매 캠페인에는 영향을 미치지 않습니다.

게재될 수 있는 광고 수가 제한된 경우 아래에서 그 의미와 취할 수 있는 조치에 대해 자세히 알아보세요.


일반적으로 광고 게재가 제한되면 최대 30일 동안 게시자가 영향을 받으며, 경우에 따라 이 기간이 더 길어질 수 있습니다.


-----------------------------------------------------------------------------------------------------------------



무효 트래픽 이의신청 폼 작성하기 



일단 위 사이트에 가서 거의 반성문같이 다시는 실수하지 않겠다 ㅠㅠ며 소명을 해보았다. 

참고로 계정은 pub-로 시작하는 본인의 애드몹 광고 계정을 적어야한다. 

그리고 아래는 애드몹 블로그에서 알려주는 성공적인 무효트래픽 이의신청 폼 작성법이다. 



---------------------------------------------------------------------------------------------------------------------



애드센스 계정이 무효 트래픽으로 인해 정지되는 일반적인 이유를 검토합니다. 이러한 이유가 자신 또는 자신의 콘텐츠에 적용되나요? 친구들이 내 광고를 너무 많이 클릭했나요? 트래픽을 구매하여 무효 트래픽이 급증하게 되었나요? 이러한 무효 트래픽이 다시 발생하지 않도록 콘텐츠를 수정하거나 행위를 시정할 수 있나요?


데스크톱 사이트, 모바일 사이트, 모바일 앱에서 광고가 어떻게 구현되는지 검토하세요. 일반적인 사용자의 구매 경로가 어떻게 진행되는지 생각해 보고, 사용자가 실수로 광고를 클릭할 수 있게 광고가 구현되어 있지 않은지 살펴보세요.


이의신청 양식에 정지된 애드센스 계정과 연결된 이메일 주소를 입력해 주세요. 이렇게 하면 Google에서 계정을 확인하고 이의신청 처리 지연을 줄이는 데 도움이 됩니다.


앞으로 어떤 점을 수정할 것인지 설명해 주세요. 이 문제의 재발을 막기 위해 어떤 시스템 또는 조치를 마련했는지 설명해 주세요. 예를 들어 어떻게 광고 구현을 조정했는지, 트래픽 소스를 평가했는지, 콘텐츠를 올바르게 테스트하기 위해 테스터를 고용했는지 등을 말씀해 주시면 됩니다.


https://adsense.googleblog.com/2016/04/tips-for-writing-successful-invalid-traffic-appeal.html


----------------------------------------------------------------------------------------------------------------------


이제 할 일은 다 했으니 결과를 기다려본다 ; - ; 


--------------------------------------------------------


10월 2일 업데이트 


위의 노력과 상관없이 애드몹 광고 제한은 두 달 넘게 이어졌고 점점 광고 노출이 조금씩 늘어가는 방식으로 한 달동안 이어지고 

최근에서야 제대로 광고가 집행되고 있습니다. 

그동안 미디에이션으로 페이스북 광고를 추가하고 한국 사용자 대상으로 카카오 애드핏 등을 추가해봤지만 

전반적인 광고 수익은 애드몹이 제일 많이 나오더군요. 

그래도 언제 내가 알수없는 오류로 광고 제한이 걸릴지 모르니 그 동안 미디에이션을 해둔것은 잘한 것 같습니다. 



--------------------------------------------------------




참고 


무효 활동을 방지하는 방법


https://shinhyu.tistory.com/56


야구의 포지션 & 영어 표현





야구의 포지션 & 영어 표현 



야구의 내외야 포지션(野球 內外野 - , 영어: baseball fielding positions)은 9명으로 이루어져 있으며, 각각의 포지션은 1부터 9까지 선수 번호를 가지고 있다. 이 선수 번호들은 다음과 같이 쓰이기도 한다.


3루수가 공을 1루수에게 던져 아웃할 때, 5-3 아웃으로 기록된다.

더블 플레이 상황일 때, 2루수가 2루에 있는 유격수에게 송구해 아웃되고, 유격수가 다시 1루로 송구해 아웃될 때 '4-6-3 더블 플레이(double play)'라고 말한다.


투수는 영어로 PITCHER라고 하고 타자는 영어로 BATTER, HITTER라고 한다. 


야구는각 9명(지명타자가 있는 경우에는 10명)으로 구성된 양 팀이 각각 9이닝에 걸친 공수로 승부를 가린다. 








포지션별 수비번호

투수: 1

포수: 2

1루수: 3

2루수: 4

3루수: 5

유격수: 6

좌익수: 7

중견수: 8

우익수: 9

지명타자: DH

대타: H

대주자: R


1루수가 3루수에게서 공을 받아 1루를 밟을 때 주자는 '아웃'이 된다.


※ 중계때 6-4-3으로 이어지는 병살 플레이 : 유격수-2루수-1루수로 이어졌다는 뜻



포지션별 영문표기

투수: Pitcher (P)

포수: Catcher (C)

1루수: First Baseman (1B)

2루수: Second Baseman (2B)

3루수: Third Baseman (3B)

유격수: Short Stop (SS)

좌익수: Left Fielder (LF)

중견수: Center Fielder (CF)

우익수: Right Fielder (RF)

지명타자: Designated Hitter (DH)

대타: Pinch Hitter

대주자: Pinch Runner



각 포지션별 특징

투수: 마운드 위에서 투구하는 선수이다.

포수: 경기 내내 쪼그려 앉아서 투구를 받고, 베이스에서 공을 던져 도루하는 주자를 잡아낸다.

1루수: 가장 다양한 종류의 송구를 받는 포지션이며, 투수를 제외하면 내야수 가운데 유일하게 왼손잡이가 들어가는 포지션이다.

2루수: 2루 베이스 오른쪽(포수 관점)에서 땅볼과 직선 타구를 받아내는 포지션. 경기중 거의 모든 땅볼이 오기 때문에 유격수와 함께 '키스톤 콤비'로 불린다.

3루수: 오른손 강타자의 타구에서 가장 가깝게 있어 '핫 코너'라 불리는 3루를 수비하는 포지션. 빠른 타구를 가까이서 잡아내는 것 밖에도 우타자의 번트 타구, 선상으로 흐르는 장타성 타구를 잡아내는 포지션이다.

유격수: 길게 오는 땅볼을 잡아 긴 거리를 던져야 하는 포지션. 3-유간 깊숙한 타구를 잡는 등의 어려운 수비를 하고, 백업 플레이 때도 많이 움직이기 때문에 '수비의 꽃'으로 불리는 포지션이다.

좌익수: 우타자의 당겨친 타구가 오는 포지션. 3루-홈과 일직선으로 연결되어 있기 때문에 정확한 송구를 요하는 포지션이다.

중견수: 외야수 가운데 수비범위가 가장 넓기 때문에 빠른 발과 정확한 수비력을 요하는 포지션이다.

우익수: 3루에게서 가장 깊숙히 위치해, 장거리 송구를 요한다. 이 때문에 강한 어깨가 필수인 포지션이다.


대타:  원래 타순의 타자 대신 선수를 교체해 타석에 들어서게 되는 타자. 집중력과 자신에게 주어진 작전을 정확히 수행하는 작전수행능력이 필요한 포지션이다.


지명타자 : 경기 내내 투수 대신 타석에 들어가는 대타. 


대주자: 빠른 발과 좋은 주루 센스, 작전수행능력을 요하는 포지션이다.




야구 경기에 출전할 수 있는 구성 인원 및 교체 규칙 



야구에서 선수 교체는 횟수의 제한이 없으며 

한 팀당 한 경기에 등록을 할 수 있는 선수(선발선수+대기선수)는 총 '27명'으로

이것을 '엔트리'라고 부른다.  

그 중에서 경기에 직접 출전할 수 있는 선수는 25명이다. 


선수 교체는 경기 중에 이 27명 한에서 얼마든지 교체가 가능하다. 


팀마다 포지션별로 선수들의 비중이 조금씩은 차이가 있을수 있지만 1~2명 정도이다. 


가장 중요한 투수 (선발 5명 로테이션) - 선발투수 5명, 중간계투 4명, 마무리투수 1명 : 합 10명 

포수 - 선발1명 대기 1명 : 합 2명 

내야수 - 포지션별 선발 4명(1,2,3루수 와 유격수) 대기선수 4명 : 합 8명

외야수 - 포지션별 선발 3명 대기선수 2명 : 합 5명 


나머지 2명은 출전은 못하지만 1군 선수 명단에 교체를 위해 올려져 있습니다. 


감독과 코치진은 각 선수들의 능력과 컨디션 기록 등을 참고하여 그날 출전할 수 있는 선수 10명을 선발출전선수로 기록원에 제출합니다. 

9명의 수비 위치와 타순이 정해진 선수 그리고 1명의 지명타자 이렇게 10명입니다. 




같이 읽기


https://ko.wikipedia.org/wiki/%EC%95%BC%EA%B5%AC%EC%9D%98_%ED%8F%AC%EC%A7%80%EC%85%98


https://m.blog.naver.com/PostView.nhn?blogId=hsjazaa&logNo=220624815125&proxyReferer=https:%2F%2Fwww.google.com%2F




코로나 3단계 기준 및 주요 조치 내용



코로나 단계별 전환 기준 및 조치 주요 내용




사랑제일교회에서 발생한 코로나 상황이 심각해지면서 

서울, 경기도는 2단계 사회적 거리두기에 들어갔습니다.

 

며칠전에는 결국 사무실에 있는 건물에서 확진자가 나와서 

어느때보다 코로나가 가깝게 왔다고 느껴집니다.  


2단계 뿐만이 아니라 3단계 격상도 검토하고 있다고 해서 

방역수칙 단계별 전환 참고 지표들을 정리해보았습니다. 






각 단계별 조치 주요 내용입니다. 



 






postgresql 테이블에 칼럼 추가 + 커멘트 달기






postgresql 테이블에 칼럼 추가 + 커멘트 달기




칼럼 추가 방식 


ALTER TABLE 테이블명 ADD COLUMN 컬럼명 데이터타입 제약조건


참고) postgresql numeric type


 



예시 


- int 형의 칼럼 추가하고 코멘트 달기


ALTER TABLE 테이블이름 ADD 칼럼이름 integer;

COMMENT ON COLUMN 테이블이름.칼럼이름 IS '코멘트';


- numeric 형의 칼럼 추가하기


ALTER TABLE 테이블이름 ADD COLUMN "ERROR" numeric(5,3);


칼럼 이름을 대문자로 할 경우 ""로 감싸줍니다. 




- varchar 칼럼 추가하면서 default 값 설정하기  


ALTER TABLE test_tb ADD COLUMN name varchar(50) DEFAULT 'NONAME'


- character varying 사이즈 120인 칼럼 추가하기 


ALTER TABLE test_tb ADD COLUMN name character varying(120)



default 값이 있는 칼럼을 추가할 경우 

postgresql 10 이하 버전에서는 테이블을 다시 생성하기 때문에 

시간도 오래 걸리고 그 동안에 access exclusive lock 에 걸리게 됩니다. 

access exclusive lock 은 lock level 중 제일 높은 레벨로 select 까지 막히게 됩니다. 

(실서비스 하는 데이터베이스에서 매우 곤란한 상황 ; - ; ) 


그럴 경우 한번에 칼럼을 추가하고 default 값을 설정하는 것보다는

아래의 예시와 같이 칼럼을 추가하고 기본 값을 설정하는 것이 좋습니다. 



ALTER TABLE test_tb ADD COLUMN name varchar(50);

update test_tb set name = 'NONAME';


ALTER TABLE items ADD COLUMN updated_at timestamptz;

UPDATE items SET updated_at = now();


 


참고

https://americanopeople.tistory.com/272

https://americanopeople.tistory.com/292?category=695027

https://www.postgresql.org/docs/10/datatype-numeric.html









lightsail로 워드프레스 사이트 시작하기- 6) 디스크 증설하기


라이트세일로 워드프레스 사이트 시작하기


6) 디스크 증설하기



서비스를 운영하다보니 이미지 업로드가 많아지면서 어느샌가 디스크가 부족해졌다. 

얼추 보았을때는 aws lightsail console에서 아래에 있는 버튼 하나로 

디스크를 추가할 수 있는 걸로 보인다.  








실제로 디스크를 추가하면 instance에 부착까지는 

아래 과정을 통해 한번에 된다. 










그런데 df -h를 하면 새로 추가한 디스크가 나오지 않는다 

아래 링크를 확인하면 디스크 포맷부터 mount를 스스로 해야 한다고 친절하게 알려준다(...)


나 이거 봤어. 서버 세팅 혼자 하던 시절...


예전에 물리 서버 혼자 운영할때도 다 했는데 

aws도 마찬가지구나(...)



https://lightsail.aws.amazon.com/ls/docs/en_us/articles/create-and-attach-additional-block-storage-disks-linux-unix



작업내용 


새로 mount할 디스크를 기존 디스크와 같은 형태의 파일시스템으로 포맷합니다. 

이떄 꼭 새로 붙이는 디스크가 비어있는지 확인해야합니다. 

디스크 내용이 들어있으면 포맷하지 마세요!


$ df -h

Filesystem      Size  Used Avail Use% Mounted on

udev            2.0G     0  2.0G   0% /dev

tmpfs           396M   11M  385M   3% /run

/dev/xvda1       78G   43G   35G  56% /

tmpfs           2.0G     0  2.0G   0% /dev/shm

tmpfs           5.0M     0  5.0M   0% /run/lock

tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup

/dev/loop0       29M   29M     0 100% /snap/amazon-ssm-agent/2012

/dev/loop2       18M   18M     0 100% /snap/amazon-ssm-agent/1566

/dev/loop1       97M   97M     0 100% /snap/core/9436

/dev/loop3       97M   97M     0 100% /snap/core/9665

tmpfs           396M     0  396M   0% /run/user/1000


lsblk로 mount 정보 확인 

$ lsblk

NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

xvda    202:0    0   80G  0 disk

└─xvda1 202:1    0   80G  0 part /

xvdf    202:80   0  256G  0 disk

loop0     7:0    0 28.1M  1 loop /snap/amazon-ssm-agent/2012

loop1     7:1    0 96.5M  1 loop /snap/core/9436

loop2     7:2    0   18M  1 loop /snap/amazon-ssm-agent/1566

loop3     7:3    0   97M  1 loop /snap/core/9665


새로 mount할 디스크 파일 타입 확인 

$ sudo file -s /dev/xvdf

/dev/xvdf: data


기존에 mount되어있는 디스크 파일 타입 확인합니다. ext4를 사용하고 있네요. 

$ sudo file -s /dev/xvda1

/dev/xvda1: Linux rev 1.0 ext4 filesystem data, UUID=9bd74952-5d49-4ac3-8b92-6491cf32a505, volume name "cloudimg-rootfs" (needs journal recovery) (extents) (large files) (huge files)



새로운 디스크도 ext4타입으로 포맷합니다. 이떄 꼭 새로 붙이는 디스크가 비어있는지 확인해야합니다. 

디스크 내용이 들어있으면 포맷하지 마세요!


$ sudo mkfs -t ext4 /dev/xvdf

mke2fs 1.42.13 (17-May-2015)

Creating filesystem with 67108864 4k blocks and 16777216 inodes

Filesystem UUID: 1fba4148-faac-4675-a772-87a67e1b9d6d

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,

        4096000, 7962624, 11239424, 20480000, 23887872


Allocating group tables: done

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done




새로 포맷한 디스크의 파일 타입을 확인하고 마운트를 실행한다. 




새로 포맷한 디스크의 파일 타입 확인. 

$ sudo file -s /dev/xvdf

/dev/xvdf: Linux rev 1.0 ext4 filesystem data, UUID=1fba4148-faac-4675-a772-87a67e1b9d6d (extents) (large files) (huge files)


마운트할 위치에 디렉토리를 생성하고 

$ sudo mkdir /data


sudo mount device_name mount_point 로 mount를 실행한다. 

$ sudo mount /dev/xvdf /data


df -h로 잘 마운트 되었는지 확인한다. 

$ df -h

Filesystem      Size  Used Avail Use% Mounted on

udev            2.0G     0  2.0G   0% /dev

tmpfs           396M   11M  385M   3% /run

/dev/xvda1       78G   48G   30G  62% /

tmpfs           2.0G     0  2.0G   0% /dev/shm

tmpfs           5.0M     0  5.0M   0% /run/lock

tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup

/dev/loop0       29M   29M     0 100% /snap/amazon-ssm-agent/2012

/dev/loop2       18M   18M     0 100% /snap/amazon-ssm-agent/1566

/dev/loop1       97M   97M     0 100% /snap/core/9436

/dev/loop3       97M   97M     0 100% /snap/core/9665

tmpfs           396M     0  396M   0% /run/user/1000

/dev/xvdf       252G   60M  239G   1% /data




새로운 디스크 포맷할때 왠지 걱정되서 기존 서버 백업도 해두고 그랬는데 

그냥 별문제없이 금방 끝났네요. 


이렇게 디스크 증설이 별 문제없이 마무리되었습니다. 








인허가 데이터 다운로드 받기



상권분석 시리즈 - 인허가 데이터 



상권분석을 하기 위해서 상가 인허가 데이터를 찾고 있었는데 

지방행정 인허가 데이터개방 (LOCALDATA)라는 사이트에서 

전체 데이터 및 변동분 파일 다운로드 및 API 기능 제공을 제공하고 있다. 




지방행정 인허가 데이터개방


http://www.localdata.kr/



데이터 다운로드


http://www.localdata.kr/devcenter/dataDown.do?menuNo=20001







여기서 전체 데이터 다운로드를 선택하면 

아래와 같이 전체 데이터 다운로드를 받을수있는데 

무려 전체 용량이 1.7 GB -_-;;



 참고로 PK정보 3가지 (개방서비스ID,개방자치단체코드,관리번호) 동일하면 

동일한 사업장으로 본다고 한다. 

아래 질의 응답 참고. 



다운로드 받은 데이터는 아래와 같이 업종별로 엑셀파일로 정리되어있다. 







다만 문제는 상가 이름의 전체 주소가 번지 정도밖에 나오지 않는다는 것이다 -_-; 

건물 이름도 층 정보도 없어 추가 수집을 해야한다. 









동일한 사업장을 구분할 수 있는 방법이 있나요?

안녕하세요. 

동일한 사업장(혹은 사업주)이 이사 등의 이유로 주소가 변경되거나, 전화번호가 변경될 수 있을 것 같습니다. 

주소, 전화번호가 변경되었지만 동일한 사업장을 구분할 수 있는 방법이 있을까요?

안녕하세요. 지방행정인허가데이터개방시스템 담당자입니다.

본 사이트에서는 변경된 최종 데이터를 연계하여 제공하고 있으며 변경 상세이력은 관리하고 있지 않습니다.

다만 제공하는 정보 중 PK정보 3가지(개방서비스ID,개방자치단체코드,관리번호)가 동일한 경우
같은 인허가로 간주하오니 업무에 참고하시기 바랍니다.

감사합니다.




http://www.localdata.kr/devcenter/bbs/devQnaList.do?bbsId=B0000100&searchCnd=&searchWrd=&menuNo=20003&pageIndex=14