기존에 AWS EC2의 m3.large에 jira, confluence를 설치형으로 운영하고 있었다.

(nginx, mysql도 같은 인스턴스에 설치하여 운용)

 

최근들어서 메모리 부족 이슈가 자꾸 발생한다.

  •  java.lang.OutOfMemoryError: Java heap space

일단은 스케줄 작업 시간을 분산해보았다.

confluence schedule job

 

몇일 괜찮더니 여전히 또 메모리 부족으로 confluence 접근이 안된다.

EC2 사양을 높이고 m3.large -> m3.xlarge로 (7.5G -> 15G) 메모리를 높였다.

 

메모리 사용하는 프로세스

  • java/confluence
  • java/jira
  • nginx
  • mysql

 

startup.sh 명령을 실행해서 띄웠다.

 

안되고 500 ERROR가 난다.

29-Jul-2019 01:51:06.145 SEVERE [http-nio-8090-exec-2] org.apache.catalina.core.StandardHostValve.custom Exception Processing ErrorPage[errorCode=500, location=/500page.jsp]

 com.atlassian.util.concurrent.LazyReference$InitializationException: java.lang.NullPointerException

        at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:149)

        at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:112)

        at com.atlassian.confluence.plugin.servlet.filter.ServletFilterModuleContainerFilter.getServletModuleManager(ServletFilterModuleContainerFilter.java:23)

        at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:68)

        at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:63)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

        at com.atlassian.confluence.web.filter.DebugFilter.doFilter(DebugFilter.java:50)

        at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721)

        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:468)

        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)

        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)

        at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:439)

        at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:305)

        at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:399)

        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)

        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)

        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)

        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)

        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)

        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)

        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

        at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.NullPointerException

        at com.atlassian.spring.container.ContainerManager.getComponent(ContainerManager.java:33)

        at com.atlassian.confluence.util.LazyComponentReference$Accessor.get(LazyComponentReference.java:46)

        at com.atlassian.util.concurrent.Lazy$Strong.create(Lazy.java:85)

        at com.atlassian.util.concurrent.LazyReference$Sync.run(LazyReference.java:321)

        at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:143)

        ... 29 more

 

아...... 일단 구글링

https://www.google.com/search?newwindow=1&ei=pFg-XcOuMpXMvwTrhKbABA&q=org.apache.catalina.core.StandardHostValve.custom+Exception+Processing+ErrorPage%5BerrorCode%3D500%2C+location%3D%2F500page.jsp%5D&oq=org.apache.catalina.core.StandardHostValve.custom+Exception+Processing+ErrorPage%5BerrorCode%3D500%2C+location%3D%2F500page.jsp%5D&gs_l=psy-ab.3...12614.12614..12886...0.0..0.0.0.......0....2j1..gws-wiz.Xc4qbAH0AaA&ved=0ahUKEwjDkOSgidnjAhUV5o8KHWuCCUgQ4dUDCAo&uact=5

 

org.apache.catalina.core.StandardHostValve.custom Exception Processing ErrorPage[errorCode=500, location=/500page.jsp] - Google

2013. 5. 24. · Well, we get a 500 error on the home page after starting up at least. The error we see in the ... StandardHostValve custom SEVERE: Exception Processing ErrorPage[errorCode=500, location=/500page.jsp] java.lang. NullPointerException at ... do

www.google.com

 

다행히 1번째 결과가 나의 상황과 유사하다.

링크를 열어보니 희망이 생긴다.

https://community.atlassian.com/t5/Confluence-questions/500-Error-on-Confluence-Startup/qaq-p/393445

 

500 Error on Confluence Startup

I am unable to start up our Confluence instance. Well, we get a 500 error on the home page after starting up at least. The error we see in the web page is: exception com.atlassian.util.concurrent.LazyReference$InitializationException: java.lang.NullPointer

community.atlassian.com

 

링크의 댓글을 따라가본다. (That did it for me, thanks! 라고 한다. 이거 왠지 될거 같다.)

 

How to clear Confluence plugins cache - Atlassian Documentation

How to clear Confluence plugins cache

confluence.atlassian.com

왠지 느낌이 이거같다. 플러그인 캐쉬 문제

 

solution for this error

다 풀릴것 같은 문제가 <confluence-home>을 못찾고 또 지연된다.

결국 find로 뒤져보니 저 디렉토리가 똑같이 존재한다.

 

언급된 디렉토리를 삭제하진 않고 일단 mv 명령어로 다른 path로 옮기고

confluence를 재시작하였다.

 

시작하면서 저 디렉토리들을 새로 만든다.

그러다보니 기동하는데 오래걸린다.  (참고로 default 8090 port로 띄움)

 

띄우고나서 확인, 아까는 500 ERROR였는데 200 OK 뜬다. 

$ wget http://localhost:8090
--2019-07-29 04:19:04--  http://localhost:8090/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:8090... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://localhost:8090/login.action?os_destination=%2Findex.action&permissionViolation=true [following]
--2019-07-29 04:19:04--  http://localhost:8090/login.action?os_destination=%2Findex.action&permissionViolation=true
Reusing existing connection to localhost:8090.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html

index.html                                     [ <=>                                                                                    ]  19.64K  --.-KB/s   in 0.002s 

2019-07-29 04:19:04 (11.1 MB/s) - ‘index.html’ saved [20107]

 

잘된다.

반응형

'기타' 카테고리의 다른 글

TCP 통계  (145) 2020.07.14
Kerberos Setup (KR)  (964) 2019.08.22
squid proxy  (4) 2018.12.19
reverse proxy 개념  (6) 2018.12.19
Subnet mask 개념  (6) 2018.11.14

스퀴드 프록시 이건 또 뭔가.


분명 어딘가로 넘겨주는 역할을 할텐데..

아마도 내부에서 외부로 넘겨주는 역할이지 싶다.


오징어 프록시라니 미끈미끈한 느낌이 드는것이 

수월하게 잘 넘겨주는 도구 같다.


squid-cache: http://www.squid-cache.org/


소개 글을 한줄 씩 읽어나가본다.


- Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more.

- It reduces bandwidth 

- It improves response times by caching and reusing frequently-requested web pages.


자주 요청되는 페이지들을 캐쉬해뒀다가 다시 사용해주는 역할을 하나보다.



한글 설명을 한번 찾아본다.

- https://github.com/Yongdae-Kim/HowToUseSquid


ACL 설정이 있는 것으로 보아

캐쉬하면서 엑세스 접근도 해주고있고.



반응형

'기타' 카테고리의 다른 글

Kerberos Setup (KR)  (964) 2019.08.22
500 Error on Confluence Startup (KR)  (333) 2019.07.29
reverse proxy 개념  (6) 2018.12.19
Subnet mask 개념  (6) 2018.11.14
MySQL binary log 삭제 주기 설정  (8) 2018.08.08

현재 일하는 환경에서는 nginx를 유용하게 사용하다보니 

reverse proxy라는 용어를 자주 사용한다.

그런데 이게 뭔 말인지 머리속에 그려지지가 않는다.


위키(reverse proxy) - https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%B2%84%EC%8A%A4_%ED%94%84%EB%A1%9D%EC%8B%9C


읽어 봤지만 아직 이해를 못하겠다.


일단 forward proxy는 전달하는 개념으로 이해하였다.

File:Proxy concept en.svg

출처: https://commons.wikimedia.org/wiki/File:Proxy_concept_en.svg



[가정]

reverse proxy는 forward proxy와 반대개념이니까

단순 전달이 아니라 

수신한 메시지에 상응하는 응답 메시지를 되돌려 준다고 이해하면 되는 것인가?


[확인]

블로그를 뒤져본다.

1. https://www.lesstif.com/pages/viewpage.action?pageId=21430345

2. https://www.ibm.com/support/knowledgecenter/ko/SSKTXQ_9.0.1/admin/config/st_adm_port_rvprxy_overview_c.html

3. https://akal.co.kr/?p=1173

4. http://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221190043948&redirect=Dlog&widgetTypeCall=true&directAccess=false

5. http://happymemoryies.tistory.com/13


읽어보니 맞는듯하다. 

다시 원점으로 되돌아와서 위키(reverse proxy)의 그림을 보았다.


파일:Reverse proxy h2g2bob.svg

출처: https://ko.m.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:Reverse_proxy_h2g2bob.svg


그림을 다시 보니 

internet -> proxy -> webserver로 넘어갔다가 reverse

webserver -> proxy -> internet으로 응답이 간다.


잠깐,

다시 2개의 그림을 보니 응답이 되돌가 가는건 같은거 같은데

forward proxy하고 무슨 차이인거지.




아.. 

웹서버의 실제 주소가 아니라 reverse proxy로 설정된 주소(nginx.conf)로 요청을 주는 방식이라서

요청하는 클라이언트가 진짜 웹 서버의 정보를 알 수 없게 해준다. (5번 링크)







_

반응형

'기타' 카테고리의 다른 글

500 Error on Confluence Startup (KR)  (333) 2019.07.29
squid proxy  (4) 2018.12.19
Subnet mask 개념  (6) 2018.11.14
MySQL binary log 삭제 주기 설정  (8) 2018.08.08
[카카오톡] 카드형 오픈프로필 설정하기  (6) 2018.05.23

서브넷이란 단어를 보면

네트워크를 서브로 나눴다는 느낌이고 

실제로도 부족한 IP자원을 효율적으로 사용하기 위해서 필요하다고 알고 있다.


개념을 이해하기에 더없이 좋은 실제 사용하기 (아래 계산기를 사용하면 훨씬 이해가 쉽다.)


네트웍쪽을 다룰일이 없으니 서브넷은 생각조차 안해오다가

최근에 신규 IDC로 이전하면서 VPC를 구성하며 서브넷을 구성하는 과정에

내가 그 개념을 다 까먹었음을 인지하였다.


이해를 못한 조건

  • 기존 우리가 사용하던 IDC에서는 /21이었는데 /22로 변경되서
  • 기존에 약 2000개씩 쓸 수 있던 것이 약 1000개만 사용할 수 있다.

/21, /22의 차이는 무엇이지? 
2000에서 1000으로 줄어든다는건 뭔 뜻이지?
각각의 서브넷을 그럼 어떻게 나눠줘야 하지?
아... 다 까먹었다.. 자괴감이 엄습해온다. 😫


일단은 RFC를 훑어 보자.

For example, on a Class B network with a 6-bit wide subnet field, an address would be broken down like this: 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1 0| NETWORK | SUBNET | Host Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


느낌상 왠지 저 그림 하나를 이해하면 될 것 같다.


<network-number><subnet-number><host-number>



기본으로 돌아가서 IP를 확인해보자.

  • 11000000.10101000.01111011.00000000 -- Network address (192.168.123.0) 00000000.00000000.00000000.10000100 -- Host address (000.000.000.132)



저러한 IP주소에 아래의 서브넷 마스크를 AND 연산해서 구할 것 같은데..

접두사 크기네트워크 마스크이용 가능한 부분망부분망 당
이용 가능한 호스트 수
사용 가능한
모든 호스트 수
/24255.255.255.01254254
/25255.255.255.1282126252
/26255.255.255.192462248
/27255.255.255.224830240
/28255.255.255.2401614224
/29255.255.255.248326192
/30255.255.255.252642128
/31255.255.255.254128*256


내가 알고 싶은건 /21, /22 인 경우 부분망 당 이용 가능한 호스트 수를 대충 예상해보면 

  • /22는 대략 1000개
  • /21은 대략 2000개

일 것 같아보이는데 여기에 잘 나와있다.


여기부터 보면 확실히 이해가 간다.


255.255.128.0 부터 따라가면 된다.

왜냐하면 위의 서브넷 마스크는 1bit subnet으로서 2개의 네트워크가 구성될 수 있다.

따라서 N.N.0.0과 N.N.128.0 이런식으로 2개로 나눌 수 있다.


그렇다면 이 블로그를 작성한 목적인(내가 이해하고 싶던) 

255.255.252.0 (/22)인 경우에는 아래와 같이

N.N.0.0

N.N.4.0

N.N.8.0

N.N.12.0

N.N.16.0

...

이런식으로 4씩 증가시켜가면서 각각의 서브넷에 IP를 할당해줄 수 있다.


 255.255.252.0 64 nets

6 bit subnet

1022 N.N.4.0 N.N.4-7.N N.N.7.255 N.N.8.0 N.N.8-11.N N.N.11.255 N.N.12.0 N.N.12-15.N N.N.15.255 N.N.240.0 N.N.240-243.N N.N.243.255 N.N.244.0 N.N.244-247.N N.N.247.255 N.N.248.0 N.N.248-251.N N.N.251.255 N.N.252.0 N.N.252-254.N N.N.254.255



그래서 기존에 255.255.248.0(/21)일때는 각 vlan에 8씩 증가시켜서 할당해줬었군.


반응형

'기타' 카테고리의 다른 글

squid proxy  (4) 2018.12.19
reverse proxy 개념  (6) 2018.12.19
MySQL binary log 삭제 주기 설정  (8) 2018.08.08
[카카오톡] 카드형 오픈프로필 설정하기  (6) 2018.05.23
[MS Word 2016] 자체 번역기능 사용하기  (6) 2018.02.13

사내 JIRA, WIKI 관리하는 서버의 디스크가 꽉차 간다.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      296G  263G   33G  89% /
devtmpfs        3.7G   56K  3.7G   1% /dev

tmpfs 3.7G 0 3.7G 0% /dev/shm




뒤져보니 작년부터 binary log가 쌓여왔다.

$ ls -al /var/lib/mysql/
... 중략 ...
-rw-rw---- 1 mysql mysql 1073772329 Jan  8  2017 mysql-bin.000179
-rw-rw---- 1 mysql mysql 1073766072 Jan 12  2017 mysql-bin.000180
-rw-rw---- 1 mysql mysql 1073750174 Jan 16  2017 mysql-bin.000181
-rw-rw---- 1 mysql mysql 1073750131 Jan 19  2017 mysql-bin.000182
-rw-rw---- 1 mysql mysql 1073778740 Jan 23  2017 mysql-bin.000183
-rw-rw---- 1 mysql mysql 1073785719 Jan 26  2017 mysql-bin.000184
-rw-rw---- 1 mysql mysql 1073742779 Jan 30  2017 mysql-bin.000185
-rw-rw---- 1 mysql mysql 1073754445 Feb  2  2017 mysql-bin.000186
-rw-rw---- 1 mysql mysql 1073779324 Feb  8  2017 mysql-bin.000187
-rw-rw---- 1 mysql mysql 1073757781 Feb 11  2017 mysql-bin.000188
-rw-rw---- 1 mysql mysql 1073764278 Feb 15  2017 mysql-bin.000189
-rw-rw---- 1 mysql mysql 1073742518 Feb 18  2017 mysql-bin.000190
... 중략 ...

 



삭제해야지라고 생각했지만 이런 파일은 생각없이 rm으로 지우면 안되지

뒤져보니 설정 1줄 추가하면 된다. 

저렇게 하면 3일치만 남겨놓고 나머지는 다 지운다.

/etc/my.cnf


[mysqld]

... 중략 ...

 

expire_logs_days=3



이게 서비스 중인데

2017년부터 안 건드렸다면 함부로 mysql 데몬을 restart할 수가 없다.

이 회사에 온지 몇달 안되서 그간 바뀐 설정이 뭐인지도 모르고, 

stop은 되겠지만 start 가 안되면... 괜히 여러사람 피곤해진다.


쫄아서 찾아보니 reload가 있다.

nginx reload하듯이 설정을 다 읽어와주는 것인가!! (결론은 아니었다. 😭)

% cat /etc/init.d/mysqld
 
... 중략 ...
  reload)
    exit 3
    ;;

 


exit 3이니까 SIGQUIT일테고 mysqld에서 지정한 시그널 핸들러에 의해 동작.

찾아보니 table의 grant를 reload 한다. 😭

https://dev.mysql.com/doc/refman/5.5/en/mysqladmin.html
 
reload
Reload the grant tables.

 



결국 SET GLOBAL을 이용해서 세팅을 바꿔주었다. 


mysql> SET GLOBAL expire_logs_days = 3;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show global variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 3     |
+------------------+-------+
1 row in set (0.00 sec)

 



세팅 바꿔주고 1시간 정도 있다가

df로 줄어들었나 확인해보았다. 

안 줄었다. 😭

언제 줄어드는지 검색해도 안나온다. 

(프로세스 내부에서 뭔가 특정 시간에 주기적으로 돌면서 처리할듯한데.. )

아직 디스크 full 되려면 2~3주 남았으니 일단 퇴근하자.


다음날 출근해서 df로 확인해보니 지워졌다.

$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/xvda1     309503980 94337032 215066700  31% /
devtmpfs         3822500       56   3822444   1% /dev
tmpfs            3831692        0   3831692   0% /dev/shm


 



물론 정말 급한 경우였다면 PURGE를 이용해서 바로 지워버릴 수도 있다.


https://dev.mysql.com/doc/refman/8.0/en/purge-binary-logs.html


PURGE BINARY LOGS TO 'mysql-bin.010'; 

PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26'; 



반응형

오픈채팅방의 개수가 늘어나면 프로필 입력하는것도 번거로워집니다.

이럴때 필요한 것이 '카드형 오픈프로필' 기능

한번 만들어두면 계속해서 사용가능해서 매우 편리합니다.

또한 누군가 오픈 채팅방에서 개인적으로 저에게 대화 요청하기에도 편리합니다.

총 10개의 사진만 따라하시면 만들수 있습니다.


1. [채팅] 화면 창 우측 상단의 설정 버튼 누르기


2. 채팅 설정 누르기


3. 내 오픈채팅방 관리 누르기


4. 여기부터가 본격적으로 시작입니다.

우측 상단의 만들기 누르면

아래 2개의 메뉴가 나오고 '카드형 오픈채팅방'을 선택하시면 됩니다.


5. 화면에 보이는 3개중 가장 위에있는 '프로필'을 선택합니다.


6. 닉네임과 자기소개, 그리고 사진을 설정합니다.

3개의 설정이 끝나면 우측 상단의 '완료' 버튼을 누릅니다.


참고로 사진...

실제 오픈채팅방에 나오는 것처럼 캐릭터 사진으로 하시려면,,

알아서 캡쳐를 하는 방법이 가장 빠른듯 합니다.


7. 다 만들어졌습니다.

어떻게 만들어졌는지 확인하고 좌측 상단의 'X' 를 누릅니다.



8. 진짜로 되었는지 확인하려면

오픈채팅방에 들어갑니다.


프로필설정에 아래와 같이 뜨면 저걸 선택해주시면 됩니다.

저런식으로 기존 프로필 변경도 가능합니다.


9. 들어가고 제대로 반영되었는지 확인하려면

채팅방의 우측 상단의 메뉴를 누릅니다.


10. 'me' 라고 되어있고

우측 하단에 하얀 배경의 네모가 보이면 다 된거로 보시면 됩니다.


끝입니다.


반응형

요즘 업무상 기술 규격을 계속 보고 있습니다.

*.doc 파일이라서 MS Word를 이용해서 보고 있는데 간혹 모르는 단어가 나옵니다.

그러면 웹을 열고 포털 사이트의 영어사전에 단어를 검색합니다.

이것도 한두번이지 반복되니까 도저히 안되겠다 싶어서 찾았습니다.


뒤져보니 워드 자체 기능을 제공해주고 있었습니다. (참고로 MS Word 2016입니다.)

이제 저 기능을 편하게 사용하기 위해서 단축키를 추가했습니다.

그러기 위해서 [파일]-[옵션]에 들어가서 아래의 '사용자 지정'을 클릭합니다.

이제 여기서 검토 탭을 선택하고 명령에서는 Translate를 고릅니다.

단축키는 편하신대로 설정하면 되는데 사용하기 편리한 단축키는 뭔가 세팅이 되어있습니다.

저는 Ctrl + Q를 기존 단축키를 거의 사용하지 않아서 이를 없애버리고 새로 맵핑 했습니다.

새 바로 가기 키에 Ctrl + Q 버튼을 누르시면 반영이 됩니다.

아래의 그림은 이미 제가 설정해 둔 다음에 캡쳐한 스크린 샷입니다.


모르는 단어가 나오면 커서를 그 단어에 두고

'Ctrl + Q'를 누르면 오른쪽에 단어 뜻이 나옵니다. 엄청 편리합니다.


예를 들면 제가 precedence 단어 뜻을 잘 모른상태에서

대충 precedence 단어 중간에 '|' 커서를 두고 Ctrl + Q를 누르면

오른쪽에 아래처럼 단어 뜻이 조회됩니다.




반응형

어쩌다보니 hwp파일에 있는 내용을 복사해서

이메일을 전송해야 했습니다.

내용은 아래의 표였는데 복사가 안 되었습니다.


소속직무성명전화번호이메일주소






검색해보니 Cloudcodes Insertable라는 크롬 익스텐션을 설치하는 방법이 많이 나옵니다.

그런데 막상 크롬 웹스토어에서 찾아보면 조회가 안 되었습니다.


괜히 한글로 검색했다고 후회하고 영어로 검색하니 깔끔한 방법이 나옵니다.

구글쉬트(googlesheet)에 내용을 작성하고 복사/붙여넣기 하면 끝이었습니다.

http://usingtechnologybetter.com/add-a-table-to-a-gmail-message/


자주 쓰지도 않을 익스텐션 설치할 필요도 없고 좋았습니다.


반응형

+ Recent posts