define npm global path on mac

Posted by nopsled
2019.07.07 16:04 운영체제

This post will be handling solve to Command not found npm packages when you installed that.

 

nopsled@playground:~/VisualProjects/react-native-projects (=`ω´=)$ expo
-bash: expo: command not found

I'm tring to use expo-cli on my mac. but it will be occur error when i typing like that. so can't be use this command.

* I was installed that using by global options.

 

nopsled@playground:~/VisualProjects/react-native-projects (=`ω´=)$ npm bin -g
/usr/local/Cellar/node/11.4.0/lib/node_modules/node/bin
(not in PATH env variable)

 

nopsled@playground:~/VisualProjects/react-native-projects (=`ω´=)$ npm config get prefix
/usr/local/Cellar/node/11.4.0/lib/node_modules/node

 

nopsled@playground:~/VisualProjects/react-native-projects (=`ω´=)$ npm bin
/Users/nopsled/VisualProjects/react-native-projects/node_modules/.bin

 

nopsled@playground:~/VisualProjects/react-native-projects (=`ω´=)$ npm bin -g
/usr/local/Cellar/node/11.4.0/lib/node_modules/node/bin
(not in PATH env variable)

Finally, i understood this path configuration fucked.

 

$ npm config set prefix /usr/local/Cellar/node/11.4.0/lib/node_modules/node/bin

You can set npm global path by manually typed:

`npm config set prefix`

 

If you done that command, you shoulde be modify your .bash_profile or /etc/profile.

 

# MacPorts Installer addition on 2015-09-21_at_21:31:26: adding an appropriate PATH variable for use with MacPorts.
#export PATH="/usr/local/bin/:/opt/local/bin:/opt/local/sbin:/usr/local/mysql/bin:/usr/local/mysql/support-files:$PATH"
export PATH="/usr/local/bin/:/opt/local/bin:/opt/local/sbin:$PATH"
#export PATH=$PATH:~/.npm-global/bin
export PATH=/usr/local/Cellar/node/11.4.0/lib/node_modules/node/bin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.

Add your location which npm global path to your bash_history at last line.

 

and applying your bash_profile using this:

   $ source /etc/profile

   or

   $ source ~/.bash_profile

 

nopsled@playground:~/VisualProjects/react-native-projects (=`ω´=)$ expo init hello
? Choose a template: (Use arrow keys)
  ----- Managed workflow -----
❯ blank               minimal dependencies to run and an empty root component
  blank (TypeScript)  same as blank but with TypeScript configuration
  tabs                several example screens and tabs using react-navigation
  ----- Bare workflow -----
  bare-minimum        minimal setup for using unimodules

Finally, you can use global npm executable binaries.

 

 

삽질 끝.

 

 

 

이 댓글을 비밀 댓글로

오랜만에 중년기사 김봉식 앱 분석

Posted by nopsled
2019.07.05 13:17 분석생활

몇일전 APP_ID 요구했다가 카페에서 정지 먹었다 ㅡㅡ...

 

오늘와서 알았는데 APP_ID는 Apple score board에서도 가져올수 있기 때문에 그닥 중요하지는 않더라.

 

DATA LOAD할때 고유 값으로 검증하는것도 아니고 바로 유저 정보가 불러와지더라.. 해당 API를 이용해서 매크로 만들기 딱 좋아보인다.

 

하지만 나는 그렇게 열정이 넘치지 않기 때문에,, 그냥 깊게는 안들어가고 몇가지 데이터만 분석해봤다.

 

김봉식에서 사용하는 1000 => 1A와 같이 치환하는 공식이 있는데 이걸 뭐라고 해야할지 몰라서 열심히 뒤져봤는데 뭐 딱히 안나온다.. 아는 분들은 댓글 부탁드립니다,,, 내 생각엔 number to alphabet converting인줄 알았는데 아니더라...

 

{  
"d\_a": "9210",  
"d\_b": "5",  
"d\_c": "91",  
"d\_d": "1423472969655098503650965011509100990069250555052504000830047503650260074501600065508850220047008150475080500980033509450570082002050900083003700200505300495095503750495091508350349508200840002504000",  
"d\_e": "178909891492044584883707149000025000",  
"d\_f": "20770097193506147166646564830582872297",  
"d\_g": "1,1,1,1,1,1,1,1,1,174,215,149,82,9,0,",  
"d\_h": "0,2,2.6,5,13,15,0,0,1,4.6,0,15,5,1",  
"d\_i": "7,1,17,7,",  
"d\_j": "650,650,650,650,",  
"d\_k": "20,20,20,20,",  
"d\_l": "1476,0,0,1477,",  
"d\_m": "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,",  
"d\_o": "0,0,0,",  
"d\_p": "1,1,20,1,",  
"d\_q": "1,1,1,1,",  
"d\_r": "0",  
"u\_a": 1,  
"ver": "6.0.27",  
"k\_ab": "2090921962502972085434503286257300404408604516247680372011740069941031044926443737340876650944596516653911098780680553416094830711222471825982510910530572665411558059454788258521724767232944560257845939316283356833729458312",  
"k\_ai": "80",  
"k\_aq": "1",  
"k\_at": "100",  
"k\_au": "1",  
"k\_av": "1",  
"k\_aw": "1",  
"k\_ax": "1",  
"k\_ay": "1",  
"k\_az": "1",  
"k\_bc": "1195353082826705739727885602840628406284",  
"k\_bq": "2",  
"k\_bw": "1",  
"k\_bx": "330",  
"k\_by": "1",  
"k\_bz": "1",  
"k\_cd": "3093",  
"k\_de": "16081",  
"k\_ed": "0",  
"k\_ee": "134",  
"k\_ef": "3",  
"k\_er": "0",  
"k\_fd": "0,37352308271926104791150705971941593731089443030827874341627288146358120724416813737340876650944596516653911098780680553416094830711222471825982510944507369059133498494547882585217247672329445602578459393162833568337294583,37393008271926104791150705971941593731089443030827874341627288146358120724416813737340876650944596516653911098780680553416094830711222471825982510944507369059133498494547882585217247672329445602578459393162833568337294583,37110408271926104791150705971941593731089443030827874341627288146358120724416813737340876650944596516653911098780680553416094830711222471825982510944507369059133498494547882585217247672329445602578459393162833568337294583,37333008271926104791150705971941593731089443030827874341627288146358120724416813737340876650944596516653911098780680553416094830711222471825982510944507369059133498494547882585217247672329445602578459393162833568337294583",  
"k\_fe": "57,631,631,631,631",  
"k\_ff": "20,20,20,20,20,7,20,20,4",  
"k\_fg": "100519,45,100559,99999,10,40,10,100049,33,50,50,200,99999,99999,99999,99999,99999,99999,99999,99999,99999,99999,99999,99999,99999,99999,25264,99999,99999,99999,99999,2,0,50,99999,99999,99999,99999,0,99999,99999,99999,99999,0,9210,99999,99999,99999,99999,10,15,24,0,70,39,36,50,0,0,0,0,0,0",  
"k\_fr": "23\_2476",  
"k\_gh": "103",  
"k\_gj": "103",  
"k\_gk": "103",  
"k\_gl": "103",  
"k\_hi": "5",  
"k\_hn": "100,37,38",  
"k\_ij": "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,999,999,999,999,999",  
"k\_ke": "1562293873",  
"k\_lm": "1842",  
"k\_mm": "39206,31988,65199,2803,21051,11776,1402,963,971,501,970",  
"k\_mn": "2016",  
"k\_ms": "11",  
"k\_mt": "4158,4158,1776,22992,32541,123786,623337",  
"k\_no": "0",  
"k\_pc": 0,  
"k\_pq": "1771",  
"k\_ra": "300",  
"k\_rb": "10",  
"k\_rc": "6",  
"k\_rq": "8,8,8,8,8,6,5,5",  
"k\_rr": "4,0,0,4,5,0,5,0",  
"k\_rs": "40,16,14,15,16,1,20,1",  
"k\_ru": "1",  
"k\_zz": "475",  
"d\_h\_s": "9210",  
"d\_p\_f": "0",  
"k\_aab": "1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,",  
"k\_aae": "33",  
"k\_amb": "0",  
"k\_amc": "0",  
"k\_amg": "0",  
"k\_amj": "0",  
"k\_amm": "0",  
"k\_dsk": "1",  
"k\_gcd": "G:*********",  
"k\_gce": "",  
"k\_gkk": "103",  
"k\_hcd": "0",  
"k\_hcn": "0",  
"k\_mbm": "1,1,0,1,1,1,0",  
"k\_mhc": "4,4,4,4,4,",  
"k\_mhl": "10,9,10,8,8,",  
"k\_mno": "0",  
"k\_mnp": "0",  
"k\_mnq": "2718",  
"k\_opq": "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,5,5,5,4,4,0,",  
"k\_rlc": "0",  
"k\_rli": "0,0,0,0,0,0,",  
"k\_rst": "40,40,40,40,32,17,",  
"k\_rti": "0,0,0,0,0,0,",  
"k\_wdm": "265",  
"k\_wds": "1,5,0,0",  
"k\_wx3": "0",  
"k\_zvs": "37",  
"k\_zvt": "5",  
"place": 0,  
"k\_hhcd": "0",  
"k\_hhcn": "0",  
"k\_pc\_a": "{\\"7\\":1,\\"8\\":1}",  
"k\_pc\_b": "",  
"k\_pc\_h": "{\\"7\\":1}",  
"k\_qdqb": "100,50,0,1,4150,21600,14793,6,",  
"k\_qdwb": "0,0,0,0,1,2,2,-6,",  
"k\_wdss": "42,42,42,0",  
"NAS\_KEY": "D581842B-D0D4-4FBD-A049-BBBA10BC3837",  
"cm\_show": "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,",  
"k\_off\_t": "114",  
"his\_data": "jK11zTlPg5xYRviEC9BbVHASEZZ1HC/7EeTykGTlBnqdancf+Tv6jWX320DK3udZZzZPdj9Ar+3odOMmnyyQ0aLPhUYVahsGRMxZNujsYpA1xyAravvfSLNv5jXlTxnwnoi91/KXgNDh7i1OSki1Qe7ywN67JHR7QkulNpCo6qJIClf7zXhWHu+/O+Z2mslx5YVTYFI1amtOXFebCo9qMtfZHnEZV373C5WbtiTSFZUExMHK1YBtv4rh9tY3Jl5ol/vGOOOrMBFsLUUxARlwtwTGtKoQKuCT2bsJpWXgMcAPunJvpDK84BP/+UgtNAmFVN6iIwufdGBH0LKC2/MN76YCDVQXpy5ykfpnrCEwc89cxJUh8dCV5qQthl89qzVPyzyo2pkVwTMbMesgVelk+8BtwjWw0b0d/ChN+Bn+MtEY/rbVOgRkI+NbtAfSIdxFB1b5j9b7b6PmRcbzr+2BH5KPyCNRQBRXOhQ0mHl1FtMm/HIpL0q9XhQ7w+kZLrxAA2wNxscVlggQs7KmmhFrqR1xN7cqx7UQoVu1EHK54zQ3nq53pQQQGKjfFEPCQ1J1",  
"d\_revival": "2747",  
"k\_iap\_ads": 0,  
"d\_high\_stage": "16574",  
"usernickname": "\\uc0c1\\uba85\\uc774",  
"d\_total\_stage": "3039717"  
}

LOAD API의 일부분인데, 대부분의 variable은 알아볼수가없다.

 

앱과 하나 하나 비교해가면서 분석하면 가능은 하겠다만 보이는 몇개만 간추려서 얘기하겠다.

 

console.log('nickname', data.usernickname);  
console.log('총 스테이지 수', data.d_total_stage);  
console.log('최고 스테이지 수', data.d_high_stage);  
console.log('저장된 현재 스테이지 수', data.k_de);  
console.log('환생 수', data.d_revival);  
console.log('치명타 확률', data.k_at);

이거 외에도 지하감옥이나 레이드에 대한 API도 제공한다.

 

{  
  "\_jelly": 1, // 젤리 동작 여부 0, 1   
  "\_lv\_time": 22, // 젤리 레벨  
  "\_lv\_double": 두배 레벨  
  "\_lv\_expand": 8, // 보관함 레벨  
  "\_time": 19796, // 경과 시간  
  "\_new": 28 // 내가 받을 수 있는 입장권  
}

# 내 지하감옥 젤리 API

 

{  
  "\_heart": 21 // 입장권  
}

# 지하감옥 입장권 API

 

\[  
  {  
    "\_giftidx": 5125, // 오픈 후 5125개나 쌓였나보다  
    "\_title": "올해 첫 폭염경보입니다! 온열질환에 주의하세요! 정말 덥네요 ㅠ", // 선물 내용  
    "\_type": 3, // 뭔 타입인지 모르겠는데 보석은 3이고 다른것도 줄수있나보다.  
    "\_count": 200 // 보석갯수  
  }  
\]

# 선물함 API

 

{  
  "\_available": 1, // 레이드 입장 가능 여부  
  "\_bossidx": 356, // 그동안 몇번째 보스가 있었는지 나타내주는듯. 아마 로그 쌓으려고 idx를 넣은듯하다.  
  "\_bosshp": 27513311, // 현재 보스 체력  
  "\_bosshpmax": 95000000, // 보스 만땅체력  
  "\_cooperation\_cur": 53646, // 모르겠다.  
  "\_cooperation\_max": 100000// 모르겠다.  
}

# 레이드 API

 

  {

    "\_userlist": {  
    "\_rank": 0,  
    "\_score": 0,  
    "\_kill": 8130, // 현재 몇층인지  
    "\_count": 71, // 몇번 입장했는지  
    "\_hp": "96534048687832019902057394254954581831086541635", // 현재 층수 체력 정보. 살면서 처음봤는데 앵간 많네  
    "\_ticket": 0, // 티켓갯수  
    "\_event": 2, // 2배여부인가..?  
    "\_coin": 404, // 내 마왕의코인 갯수  
    "\_returnCount": 1029, // 입장권 바포메트한테 준 횟수  
    "\_material": 11, // 이건 아마도 봉트리움인듯하다  
    "\_ads\_count": 10, // 모르겠다  
    "\_ads\_max": 10,// 모르겠다  
    "\_q1": 2, // 여기서부터  
    "\_q2": 2,  
    "\_q3": 2,  
    "\_q4": 2,  
    "\_q5": 2,  
    "\_q6": 2,  
    "\_q7": 2,  
    "\_q8": 2,  
    "\_q9": 0,  
    "\_q10": 2,  
    "\_q11": 0,  
    "\_q12": 2,  
    "\_q13": 0,  
    "\_q14": 2,  
    "\_q15": 0,  
    "\_q16": 2,  
    "\_q17": 0,  
    "\_q18": 2,  
    "\_q19": 2,  
    "\_q20": 2,  
    "\_q21": 2,  
    "\_q22": 2,  
    "\_q23": 2,  
    "\_q24": 2,  
    "\_q25": 2,  
    "\_q26": 2,  
    "\_q27": 2,  
    "\_q28": 2,  
    "\_q29": 2,  
    "\_q30": 2,  
    "\_q31": 2,  
    "\_q32": 2,  
    "\_q33": 2,  
    "\_q34": 2,  
    "\_q35": 2,  
    "\_q36": 2,  
    "\_q37": 2,  
    "\_q38": 0,  
    "\_q39": 0,  
    "\_q40": 0,  
    "\_q41": 2,  
    "\_q42": 2,  
    "\_q43": 2,  
    "\_q44": 2 // 여기까지는 지하감옥 퀘스트 갯수인듯싶다  
  }  
}

# 지하감옥 API

 

별거없지만 그냥 오랜만에 뻘짓해본거같다.

 

이 정보들을 응용해서 매크로를 만들수도 있을듯하다.

 

데이터 저장하고 현재 층수나 지하감옥 입장할때 되면 입장시키고 그런? 옛날에 만든건 그냥 아무렇게나 만든건데 이걸로 만들면 모두의마블 매크로 만들었던거 마냥 거의 자동화 할수 있을듯한데 거기까진 귀찮다,,

 

원래 김봉식 GG 만들어볼려고 했는데 귀찮네..

 

다 됐고 react native 공부해야겠다..

이 댓글을 비밀 댓글로

ubuntu apache2+tomcat command line tool as python instead of service

Posted by nopsled
2019.02.22 17:27 프로그래밍

회사에서 갑자기 VM을 옮기랜다... 까라는대로 까야지...


아무것도 모르는 centos, tomcat, mariadb를 ubuntu, tomcat, mysql로 옮기느라 혼쭐났다. (덕분에 오늘 하루가 빨리 갔다)


열심히 셋팅하고 나니까 느낀점이 apache는 service apache2 start 이런식으로 start하거나 stop과 같은 service가 존재하는데 tomcat은 커맨드라인으로 일일히 해줘야 한다는 것이다.


그래서 귀찮아서 파이썬으로 만들어뒀다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# -*- coding: utf-8 -*-
import os, sys, commands
 
class Utils():
    def __init__(self):
        # Define variables
        self.TOMCAT_SHUTDOWN = '/usr/tomcat8/bin/shutdown.sh'
        self.TOMCAT_STARTUP = '/usr/tomcat8/bin/startup.sh'
 
        # Don't modify at this 3 line 11~13
        ALLOW_COMMAND = ['status''start''stop''restart']
        self.apache = False
        self.tomcat = False
 
        # Check parameter
        if not len(sys.argv) == 2:
            print '[-] Not enough param'
            exit()
        elif not sys.argv[1].lower() in ALLOW_COMMAND:
            print '[-] Param type : %s' % ', '.join(ALLOW_COMMAND)
            exit()
 
        # Get status
        shell = commands.getoutput("sudo netstat -ntlp").split('\n')
        for row, row_data in enumerate(shell):
            if not row_data.find('apache'== -1:
                self.apache = True
            elif not row_data.find('java'== -1:
                self.tomcat = True
 
        self.dynamic_loader(sys.argv[1])
        return
 
    def status(self):
        print '[*] Apache status %s' % self.apache
        print '[*] Tomcat status %s' % self.tomcat
        return
 
    def start(self):
        if self.apache:
            print '[*] Apache already loaded.'
        else:
            commands.getoutput('sudo service apache2 start')
            print '[*] Apache started'
 
        if self.tomcat:
            print '[*] Tomcat already loaded.'
        else:
            commands.getoutput(self.TOMCAT_STARTUP)
            print '[*] Tomcat started.'
        return
 
    def stop(self):
        if self.apache:
            commands.getoutput('sudo service apache2 stop')
            print '[*] Apache stopped'
        else:
            print '[*] Apache already stopped.'
 
        if self.tomcat:
            commands.getoutput(self.TOMCAT_SHUTDOWN)
            print '[*] Tomcat stopped.'
        else:
            print '[*] Tomcat already stopped.'
        return
 
    def restart(self):
        commands.getoutput('sudo service apache2 restart')
        print '[*] Apache restarted.'
        if self.tomcat:
            commands.getoutput(self.TOMCAT_SHUTDOWN)
        commands.getoutput(self.TOMCAT_STARTUP)
        print '[*] Tomcat restarted.'
        return
 
    def dynamic_loader(self, func_name):
        func = getattr(self, func_name.lower())
        func()
 
if __name__ == '__main__':
    Utils = Utils()
cs

쓸 사람이 있다면 7,8 라인을 수정해서 사용하면 된다.



1
2
3
4
5
6
7
8
9
10
11
12
dataking@360pia:~$ tail ~/.bashrc
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -/usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -/etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
alias server="python /home/dataking/server.py `$1`"
dataking@360pia:~$
cs


~/.bashrc 맨밑 하단에 위와 같이 추가해주면 커맨드라인으로 사용할 수 있다. (이거 하고나서 shell 로그아웃 안시키고 source ~/.bashrc 사용하면 alias 등록이 바로 된다)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dataking@360pia:~$ server
[-] Not enough param
dataking@360pia:~$ server a
[-] Param type : status, start, stop, restart
dataking@360pia:~$ server status
[*] Apache status True
[*] Tomcat status True
dataking@360pia:~$ server start
[*] Apache already loaded.
[*] Tomcat already loaded.
dataking@360pia:~$ server restart
[*] Apache restarted.
[*] Tomcat restarted.
dataking@360pia:~$ server stop
[*] Apache stopped
[*] Tomcat stopped.
cs

아무튼 alias를 등록하고 해보면 위처럼 보인다



이 댓글을 비밀 댓글로