tag:blogger.com,1999:blog-75247008135765291382024-03-21T16:53:19.108-07:00MOFYSOLVEDTutorials and guide how toSofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.comBlogger38125tag:blogger.com,1999:blog-7524700813576529138.post-5797138900396907442023-07-21T11:58:00.004-07:002023-07-21T11:59:47.030-07:00Forward Port on Internal IP VPN that is running on the VM using SSH<div>
<p>run this comand inside the vm</p>
<pre><code class="bash">ssh -L <vm_ip>:<vm_port>:<vpn_internal_ip>:<vpn_internal_port> <vm_user>@<vm_host>
# Example
ssh -L 10.10.10.11:8080:10.10.186.35:80 user@10.10.10.11</code></pre>
</div>
<div>
<p>run this comand on your local</p>
<pre><code class="bash">ssh -f -L <vm_port>:<vpn_internal_ip>:<vpn_internal_port> <vm_user>@<vm_host> -N
# Example
ssh -f -L 8080:10.10.186.35:80 user@10.10.10.11 -N
</code></pre>
</div>
<div>
<p>And now you can access <code>10.10.186.35:80</code> using <code>10.10.10.11:8080</code> on your local browser.</p>
</div>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-58824472317562360562023-06-27T06:11:00.002-07:002023-06-27T06:14:17.236-07:00Router wifi jadi extender<div id="content-9fafby4kielyannx">
<style type="text/css">#content-9fafby4kielyannx .x1-img { display: none } #content-9fafby4kielyannx [name=x1-img-in]:checked + .x1-img {display:block !important;}</style>
<input type="radio" name="x1-img-in" id="x1-img-1" hidden/>
<div class="separator x1-img">
<div><label class="btn btn-info" for="x1-img-2">Full</label></div>
<div><a target="_blank" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5IX2rdtM9qlQPl3xyrMrD3vNmo7doaU5U0MSuBlultweK046cmFjVgWf__q4lqk3QGlX9OfmHY1AEpRvx_qRSS-BR4evbj5pwuW95Z4FIHrCQqVpsX3SKOKAg0jVGHzUDkAy7mhWLk_Hhf7bzZxFh378qnYa_Fviw6TQrxjWxUWUtNDEEoWoljtB6Js/s3328/router-extender.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img border="0" data-original-height="3148" data-original-width="3328" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5IX2rdtM9qlQPl3xyrMrD3vNmo7doaU5U0MSuBlultweK046cmFjVgWf__q4lqk3QGlX9OfmHY1AEpRvx_qRSS-BR4evbj5pwuW95Z4FIHrCQqVpsX3SKOKAg0jVGHzUDkAy7mhWLk_Hhf7bzZxFh378qnYa_Fviw6TQrxjWxUWUtNDEEoWoljtB6Js/s320/router-extender.png" width="320" />
</a></div>
</div>
<input type="radio" name="x1-img-in" id="x1-img-2" checked hidden/>
<div class="separator x1-img">
<div><label class="btn btn-info" for="x1-img-1">Simple</label></div>
<div><a target="_blank" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX91h7dc01ZPYopsvaGcdhlg8tyBXWf5aOlphJNTy2S6F4qvhBfcrIoM5RrvsKDKpEaMpYM_4KavWoLT61TdXyGhDm8LKrTaczqOXJR8aDCh0vYV1qyp3ARmqfyVR_QAVH9_4veT7EEmQbTEmZa5q_qvMQC2bB9lzm-uZhuJm37q7wBcr8SHs3brlArWg/s3328/router-extender-simple.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img border="0" data-original-height="2688" data-original-width="3328" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX91h7dc01ZPYopsvaGcdhlg8tyBXWf5aOlphJNTy2S6F4qvhBfcrIoM5RrvsKDKpEaMpYM_4KavWoLT61TdXyGhDm8LKrTaczqOXJR8aDCh0vYV1qyp3ARmqfyVR_QAVH9_4veT7EEmQbTEmZa5q_qvMQC2bB9lzm-uZhuJm37q7wBcr8SHs3brlArWg/s320/router-extender-simple.png" width="320" />
</a></div>
</div>
<div>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-24259167286190469182023-06-21T12:39:00.006-07:002023-06-21T12:40:56.793-07:00Test Coding #ce9896a0<pre><code class='js'>
// PART 1
function PART_1 () {
console.log('PART 1')
console.log(`There is a list of data users in tree diagram structurized and sorted by level called as "Title", but the level was \nunneccesarry because it was pre-defined as a constant data on every users.\nThe task is to make a function to find parent of given element's name that have specific title on it's parent. ( e.g. 'HM', CS1 -> SF -> HM3 )`);
console.log()
var user = (title , id , parentId) => {
return { title , id , parentId, children: [] }
}
var users = []
users.push(user('M','M1','0'))
users.push(user('HM','HM1','M1'))
users.push(user('HM','HM2','HM1'))
users.push(user('HM','HM3','HM1'))
users.push(user('HM','HM4','HM1'))
users.push(user('HM','HM5','HM1'))
users.push(user('SF','SF1','HM3'))
users.push(user('SF','SF2','HM3'))
users.push(user('SF','SF3','HM5'))
users.push(user('SF','SF4','HM5'))
users.push(user('CS','CS1','SF1'))
users.push(user('CS','CS2','SF2'))
users.push(user('CS','CS3','SF3'))
users.push(user('CS','CS4','SF4'))
function list_to_tree(list,keys=['id','parentId','children']) {
var map = {}, node, roots = [], i;
for (i = 0; i < list.length; i += 1) {
map[list[i][keys[0]]] = i; // initialize the map
list[i][keys[2]] = []; // initialize the children
}
for (i = 0; i < list.length; i += 1) {
node = list[i];
if (node[keys[1]] !== "0") {
list[map[node[keys[1]]]][keys[2]].push(node);
} else {
roots.push(node);
}
}
return roots;
}
// console.log(JSON.stringify(list_to_tree(users),null,2))
function searchTree(element, word, key=['id','children']){
if (element[key[0]] == word) {
return element;
} else if (element[key[1]] != null) {
var i;
var result = null;
for(i=0; result == null && i < element[key[1]].length; i++){
result = searchTree(element[key[1]][i], word);
}
return result;
}
return null;
}
var tree = list_to_tree(users);
var search = searchTree(tree[0],'CS4');
const REF_TITLE = 'HM'
// I want to get the LEAF <REF_TITLE> by input the <CHILD_NAME> or id or else
var firstOccurence = true
// I want to get the ROOT <REF_TITLE> by input the <CHILD_NAME> or id or else
// var firstOccurence = false
while (true) {
try {
if (!search) throw new Error('user not found')
else if (search.parentId === '0' && search.title !== REF_TITLE) throw new Error('not found')
if (search.title === REF_TITLE) {
if (firstOccurence) {
console.log(search);
break;
} else {
if (search.parentId === '0') {
console.log(search);
break;
} else {
var tmpSearch = searchTree(tree[0],search.parentId);
if (tmpSearch.title === REF_TITLE) {
search = searchTree(tree[0],search.parentId)
} else {
console.log(search);
break;
}
}
}
} else {
search = searchTree(tree[0],search.parentId)
}
} catch (err) {
console.error(err.message);
break;
}
}
console.log('\n\n')
}
// PART 2
function PART_2 () {
console.log('PART 2')
console.log(`This task is pretty simple, just making a summary of the data and doing a little bit of Math inside.`)
console.log()
var MAX_ORDERS = 100;
var MULTIPLY_BY = .05;
var status = {
'D': 'DRAFT',
'O': 'OK',
'P': 'PENDING',
'C': 'CANCEL',
}
var Item = (itemName, itemPrice) => ({ id: GENID(), itemName, itemPrice });
var Items = [];
var ItemByName = (itemName) => Items.find((d)=>d.itemName.includes(itemName))
const generateRandomPrice = () => (Math.floor(Math.random()*30)*1000+15000)
Items.push(Item('night stand',generateRandomPrice()));
Items.push(Item('window',generateRandomPrice()));
Items.push(Item('sponge',generateRandomPrice()));
Items.push(Item('television',generateRandomPrice()));
Items.push(Item('electrical outlet',generateRandomPrice()));
Items.push(Item('cookie jar',generateRandomPrice()));
Items.push(Item('measuring tape',generateRandomPrice()));
Items.push(Item('cat',generateRandomPrice()));
Items.push(Item('ottoman',generateRandomPrice()));
Items.push(Item('deodorant',generateRandomPrice()));
Items.push(Item('letter opener',generateRandomPrice()));
Items.push(Item('sunglasses',generateRandomPrice()));
var User = (name) => ({ id: GENID(), name })
var Users = [];
var UserByName = (name) => Users.find((d)=>d.name.includes(name))
Users.push(User('John'))
Users.push(User('Maria'))
Users.push(User('Abdoel'))
Users.push(User('Kevin'))
Users.push(User('Samuel'))
Users.push(User('Vhee'))
var Sales = (status, itemName, user) => ({ status, itemName, user });
var SalesOrders = [];
var getRandomStatus = () => {
var keys=Object.keys(status);
var index = Math.floor(Math.random()*keys.length)
return keys[index];
}
var getRandomItem = () => {
var index = Math.floor(Math.random()*Items.length)
return Items[index];
}
var getRandomUser = () => {
var index = Math.floor(Math.random()*Users.length)
return Users[index]
}
for (let i = 0; i < MAX_ORDERS; i++) {
SalesOrders.push(Sales(
getRandomStatus(),
getRandomItem().itemName,
getRandomUser().name,
))
}
let SalesOrdersByUsers = {}
for (let Order of SalesOrders) {
var user = UserByName(Order.user);
var item = ItemByName(Order.itemName);
if (user && item && Order.status === 'O') {
if (!SalesOrdersByUsers[user.id]) SalesOrdersByUsers[user.id] = { name: user.name, totalBonus: 0, items: {} };
if (!SalesOrdersByUsers[user.id].items[item.id]) {
SalesOrdersByUsers[user.id].items[item.id] = {
itemName: item.itemName,
itemPrice: item.itemPrice,
amount: 1,
bonus: item.itemPrice * MULTIPLY_BY,
}
} else {
SalesOrdersByUsers[user.id].items[item.id].amount++;
SalesOrdersByUsers[user.id].items[item.id].bonus+=item.itemPrice * MULTIPLY_BY;
}
SalesOrdersByUsers[user.id].items[item.id].bonusString=IN_CURRENCY(SalesOrdersByUsers[user.id].items[item.id].bonus)
SalesOrdersByUsers[user.id].totalBonus += SalesOrdersByUsers[user.id].items[item.id].bonus;
}
}
function printSummary(name){
var list = Object.values(SalesOrdersByUsers);
if (name) {
console.log('Summary of',name)
list = list.filter((d)=>d.name.includes(name))
}
for (let user of list) {
console.log(`${user.name}, total bonus: ${IN_CURRENCY(user.totalBonus)}`)
for (let item of Object.values(user.items)) {
console.log('-',item.amount, item.itemName, item.bonusString, ` (item price: ${IN_CURRENCY(item.itemPrice)})`)
}
console.log()
}
}
function printSummaryOf(name){
}
printSummary()
// printSummary('Abdoel')
// console.log(SalesOrders.filter(d=>d.status === 'O').length)
console.log('\n\n')
}
PART_1()
PART_2()
// HELPER
var GENID = () => '_'+Math.random().toString(36).substr(2,8); // Generate ID
var IN_CURRENCY = (n) => Intl.NumberFormat('id').format(n); // NUMBER TO CURRENCY FORMAT
</code></pre>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-1338860415772358142023-06-08T21:25:00.012-07:002023-06-21T12:46:32.920-07:00tunneling<pre><code class='bash'>
# CONFIG
username=yourusername
password=yourpassword
hostname=domain.tld
port=22
sockport=80
vpnsource=https://www.vpnjantit.com/
# SETTING BROWSER PROXY USING SOCK4
IP : 127.0.0.1
PORT: 80
$ cat `which sshtunneling`
# Content of sshtunneling custom-command
export `cat /tmp/sshtunneling.conf`
echo "username : $username"
echo "password : $password"
echo "server : $server"
echo "port : $port"
echo "sockport : $sockport"
param=$1
if [[ "$1" == "connect" ]]; then
ssh -f -N -M -S /tmp/sshtunnel_$username -D $sockport $username@$server -p$port
elif [[ "$1" == "quit" ]]; then
ssh -S /tmp/sshtunnel -O exit $server -p$port
elif [[ "$1" == "config" ]]; then
su `whoami` -c 'subl /tmp/sshtunneling.conf'
else
echo "====== help ========"
echo "sshtunneling connect"
echo "sshtunneling quit"
echo "sshtunneling config"
fi
# Connecting
$ sshtunneling connect
# prompted for remote password (paste from password in the config)
</code></pre>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-91544102759765368822022-08-24T23:38:00.012-07:002023-04-26T13:09:54.209-07:00Consideration When Using External Resources on Your Web Page<div style="text-align: justify;"></div><p style="text-align: justify;"><span> </span>Unfortunately some network did not have internet connection except you log in to their instance. Before you can even reach the login page, the site you are trying to reach are requesting data to fonts.googleapis.com that mean require any internet connection. This process will stuck and wait until reach the timeout (limit). </p><p style="text-align: justify;"><span> </span>The other case are when you are try to developing a website with your local environment without charge any internet / data connection. And the last that always hearth-bleeding are waiting for the DNS resolver to solve this issue when they cannot understand what is fonts.googleapis.com domain. </p><p style="text-align: justify;"><span> </span>Last but not least, you can try to download specific fonts and put it on your web folder or you can just using default fonts that are available without requesting from the external sites. With this concern, I hope your site are very fast to load and not causing any issues because of "<span class="VIiyi" lang="en"><span class="JLqJ4b ChMk0b" data-language-for-alternatives="en" data-language-to-translate-into="id" data-number-of-phrases="1" data-phrase-index="0"><span class="Q4iAWc">unimportant thing</span></span></span>" that you copy from the internet.</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dzpuNLY8VabB4VEFA8LNC5LRh-iqMGkHIkc7ZS1Jhz1GpSkU393USo-YOKlEgbtLOLNt4AM9jyys3y4-WJOgA' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><br /><p style="text-align: justify;"><br /></p>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-6982952145008593202022-05-26T09:34:00.006-07:002022-05-26T10:02:00.519-07:00NPM Install Take So Long and Sometimes Looks Hang<p style="text-align: justify;"><span> </span>I am currently using NPM for developing ReactJS and I just test sample code from git. Eventually when I try to install packages for the first time its work normally, because of some reason I try to upgrading some package and reinstall it but the installation process looks hang.</p>
<p style="text-align: justify;">The package that I try to reinstall is react-scripts. Here is some advice from StackOverflow:</p>
<p></p>
<ul style="text-align: left;">
<li style="text-align: left;">Try to remove package-lock.json (https://stackoverflow.com/questions/50522376/npm-install-hangs-on-loadidealtreeloadalldepsintoidealtree-sill-install-loadid)</li>
<li style="text-align: left;">Try to using unix command line (e.g. git bash). (https://stackoverflow.com/questions/64290462/npx-create-react-app-takes-too-long-every-time)</li>
<li style="text-align: left;">Try to using `npm install <package> --verbose` to know the progress</li>
</ul>
<div style="text-align: justify;">Walkthrough:</div>
<div style="text-align: justify;"><span> </span>I just try install using verbose and hang after checking several packages. I find the pattern which different between the package that pass the check and package that hang, it was the status code (HTTP Response), package that pass check will response with status code 304 (Not Modified) and for the hang one there is no response. I search some solution on StackOverflow and found this 'https://stackoverflow.com/questions/45433130/npm-install-gets-stuck-at-fetchmetadata' that lead me to checking the npm installation registry domain (registry.npmjs.org) which is the global config of my npm registry.</div>
<div style="text-align: justify;"><br /></div>
<div style="text-align: justify;">Figure out:</div>
<div style="text-align: justify;"><span> </span>I try the url of hang package in the browser, for the first time it return ERR_NETWORK_CHANGED that I know because of DNS Server not correctly response my request. After that I try to ping to make sure my connection and it was fine.</div>
<div style="text-align: justify;"><br /></div>
<div style="text-align: justify;">Resolve:</div>
<div style="text-align: justify;"><span> </span>After several test and check, I try to add static route to my hosts list that direct to the npm registry url. I add this line at the end of file /etc/hosts.</div>
<div><pre><code class="bash">104.16.20.35 registry.npmjs.org</code></pre></div>
<div style="text-align: justify;">This is the end because when I try install again (with verbose) it was really smooth and the log is show that not only response with status code of 304, it also show the status code of 200.</div>
<div style="text-align: justify;"><br /></div>
<p></p>
<p></p>
<p></p>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-22052816326352225772021-05-22T16:22:00.004-07:002021-05-22T16:22:46.648-07:00NMAP<h3 class="ftwp-heading" id="ftoc-heading-2" style="box-sizing: inherit; font-family: Poppins, sans-serif; font-size: 24px; margin: 0px; word-break: break-word;">How to Scan Nmap Ports</h3><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To <span style="box-sizing: inherit; font-weight: bolder;">scan Nmap ports</span> on a remote system, enter the following in the terminal:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">sudo nmap 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">Replace the IP address with the IP address of the system you’re testing. This is the basic format for <span style="box-sizing: inherit; font-weight: bolder;">Nmap</span>, and it will return information about the ports on that system.</p><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">In addition to scanning by IP address, you can also use the following commands to specify a target:</p><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To scan a host:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap www.hostname.com</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To scan a range of IP addresses (.1 – .10):</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap 192.168.0.1-10</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To run <span style="box-sizing: inherit; font-weight: bolder;">Nmap</span> on a subnet:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap 192.168.0.1/13</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To scan targets from a text file:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –iL textlist.txt</code></pre><div class="notice-note" style="border-bottom: 2px solid rgb(0, 108, 168); border-top: 2px solid rgb(0, 108, 168); box-sizing: inherit; color: #404040; display: flex; font-family: Roboto; font-size: 16px; margin-bottom: 20px; padding-bottom: 15px; padding-top: 15px;"><div class="note-icon-wrapper" style="background-color: #006ca8; border-radius: 3px; border: 2px solid rgb(0, 108, 168); box-sizing: inherit; display: inline-block; height: 96px; line-height: 104px; position: relative; text-align: center; vertical-align: middle; width: 96px;"><span class="fa fa-lightbulb" style="-webkit-font-smoothing: antialiased; box-sizing: inherit; display: inline-block; font-family: "Font Awesome 5 Free"; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 900; line-height: 1; text-rendering: auto;"></span></div><div class="notice-text" style="box-sizing: inherit; margin-left: 20px; width: 627.125px;"><p style="box-sizing: inherit; font-family: Roboto, sans-serif; margin-block: 0px 1em; word-break: break-word;"><span style="box-sizing: inherit; font-weight: bolder;">Note:</span> The developers at nmap.org provide a test server that you can experiment on, located at <a href="http://scanme.nmap.org/" style="box-sizing: inherit; color: #0074db; text-decoration-line: none; word-break: break-word;">scanme.nmap.org</a>. You can use this to test your Nmap utility.</p></div></div><h4 class="ftwp-heading" id="ftoc-heading-3" style="box-sizing: inherit; font-family: Poppins, sans-serif; font-size: 20px; margin: 0px; word-break: break-word;">Scan a Single Port, All Ports, or Series</h4><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;"><a href="https://phoenixnap.com/kb/nmap-command-linux-examples" rel="noreferrer noopener" style="box-sizing: inherit; color: #0074db; text-decoration-line: none; word-break: break-word;" target="_blank">Nmap commands</a> can be used to scan a single port or a series of ports:</p><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">Scan port 80 on the target system:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –p 80 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">Scan ports 1 through 200 on the target system:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –p 1-200 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">Scan (Fast) the most common ports:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –F 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To scan all ports (1 – 65535):</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –p– 192.168.0.1 </code></pre><h4 class="ftwp-heading" id="ftoc-heading-4" style="box-sizing: inherit; font-family: Poppins, sans-serif; font-size: 20px; margin: 0px; word-break: break-word;">Other Types of Nmap Port Scans</h4><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">Different types of scans can be performed:</p><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To scan using TCP connect (it takes longer, but is more likely to connect):</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –sT 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To perform the default SYN scan (it tests by performing only half of the TCP handshake):</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –sS 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">To instruct Nmap to scan UDP ports instead of TCP ports (the <span style="box-sizing: inherit; font-weight: bolder;">–p switch</span> specifies ports 80, 130, and 255 in this example):</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –sU –p 80,130,255 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">Run a fast scan on the target system, but bypass host discovery. (Host discovery uses <span style="box-sizing: inherit; font-weight: bolder;">ping</span>, but many server firewalls do not respond to <span style="box-sizing: inherit; font-weight: bolder;">ping</span> requests. This option forces the test without waiting for a reply that may not be coming):</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –Pn –F 192.168.0.1 </code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">The <span style="box-sizing: inherit; font-weight: bolder;">nmap</span> utility can be used to detect the operating system of a particular target:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –A 192.168.0.1</code></pre><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">It can also be used to probe for the services that might be using different ports:</p><pre class="wp-block-code" style="background-color: #f7f7f7; border: 1px solid rgb(234, 234, 234); box-sizing: inherit; color: #404040; font-family: monospace, monospace; font-size: 16px; overflow-wrap: break-word; overflow: auto; padding: 18px; white-space: pre-wrap; word-break: break-all;"><code style="box-sizing: inherit; display: block; font-family: monospace, monospace; font-size: 1em; overflow-wrap: break-word; overflow: auto; word-break: break-all;">nmap –sV 192.168.0.1</code></pre><div class="notice-note" style="border-bottom: 2px solid rgb(0, 108, 168); border-top: 2px solid rgb(0, 108, 168); box-sizing: inherit; color: #404040; display: flex; font-family: Roboto; font-size: 16px; margin-bottom: 20px; padding-bottom: 15px; padding-top: 15px;"><div class="note-icon-wrapper" style="background-color: #006ca8; border-radius: 3px; border: 2px solid rgb(0, 108, 168); box-sizing: inherit; display: inline-block; height: 96px; line-height: 104px; position: relative; text-align: center; vertical-align: middle; width: 96px;"><span class="fa fa-lightbulb" style="-webkit-font-smoothing: antialiased; box-sizing: inherit; display: inline-block; font-family: "Font Awesome 5 Free"; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 900; line-height: 1; text-rendering: auto;"></span></div><div class="notice-text" style="box-sizing: inherit; margin-left: 20px; width: 627.125px;"><p style="box-sizing: inherit; font-family: Roboto, sans-serif; margin-block: 0px 1em; word-break: break-word;"><span style="box-sizing: inherit; font-weight: bolder;">Note:</span> The <span style="box-sizing: inherit; font-weight: bolder;">–sV</span> option can be tuned to be more or less aggressive in its scan. Use the <span style="box-sizing: inherit; font-weight: bolder;">––version-intensity 2 </span>option to specify the level of testing. Replace the number 2 with a number from 0 (light testing) to 9 (run all probes). The more intense the testing, the longer the scan will take.</p></div></div><h3 class="ftwp-heading" id="ftoc-heading-5" style="box-sizing: inherit; font-family: Poppins, sans-serif; font-size: 24px; margin: 0px; word-break: break-word;">Common Ports</h3><p style="box-sizing: inherit; color: #404040; font-family: Roboto, sans-serif; font-size: 16px; margin-block: 0px 1em; word-break: break-word;">Here is a brief list of standard ports and their designations:</p><ul style="box-sizing: inherit; color: #404040; font-family: Roboto; font-size: 16px; margin-block: 0px 20px; padding-inline-start: 20px;"><li style="box-sizing: inherit;">21 – FTP</li><li style="box-sizing: inherit;">22 – SSH</li><li style="box-sizing: inherit;">25 – SMTP (sending email)</li><li style="box-sizing: inherit;">53 – DNS (domain name service)</li><li style="box-sizing: inherit;">80 – HTTP (web server)</li><li style="box-sizing: inherit;">110 – POP3 (email inbox)</li><li style="box-sizing: inherit;">123 – NTP (Network Time Protocol)</li><li style="box-sizing: inherit;">143 – IMAP (email inbox)</li><li style="box-sizing: inherit;">443 – HTTPS (secure web server)</li><li style="box-sizing: inherit;">465 – SMTPS (send secure email)</li><li style="box-sizing: inherit;">631 – CUPS (print server)</li><li style="box-sizing: inherit;">993 – IMAPS (secure email inbox)</li><li style="box-sizing: inherit;">995 – POP3 (secure email inbox)</li></ul><p> </p>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-64026779914768448352021-05-12T02:48:00.006-07:002021-05-12T05:07:51.934-07:00SSTP VPN Connection di Ubuntu<pre><code class="bash">sudo add-apt-repository ppa:eivnaes/network-manager-sstp
sudo apt-get update
sudo apt install network-manager-sstp sstp-client</code></pre>
<p><br /></p><p>Source: https://askubuntu.com/questions/1231162/sstp-vpn-on-ubuntu-20-04-cant-install-sstp-network-manager-plugin</p><p>Below is deprecated! But I can learn something.</p><p><span style="font-size: x-small;">Download sourcenya di: https://sourceforge.net/projects/sstp-client/files/sstp-client/</span></p><p><span style="font-size: x-small;">sudo make install</span></p><p><span style="font-size: x-small;">sudo sstpc <IP_ADDRESS> --user <USERNAME> --password <PASSWORD> --log-level 0 --cert-warn --tls-ext --uuid <UNIQUE_ID/DOMAINNAME> --save-server-route</span></p><p><span style="font-size: x-small;">Check connection using ifconfig, interfacename will be like ppp0<br /></span></p><p><span style="font-size: x-small;">sudo route add default gw <IP_GATEWAY> <br /></span></p><p><br /></p>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-76362722107221859252021-05-12T02:44:00.002-07:002021-05-12T05:08:51.198-07:00Cek Jenis VPN yg dipakai di windows<p> Buka network sharing & internet setting</p><p>Change adapter options</p><p><img alt="" src="data:image/png;base64,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I1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAMYIFAAAAAABgjGABAAAAAAAYI1gAAAAAAADGCBYAAAAAAIAxggUAAAAAAGCMYAEAAAAAABgjWAAAAAAAAMYIFgAAAAAAgDGCBQAAAAAAYIxgAQAAAAAAGCNYAAAAAAAAxggWAAAAAACAsf8PvXh0tKFMJhMAAAAASUVORK5CYII=" style="width:100%;height:auto;margin:auto;"/></p>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-48677635785682737782021-05-01T10:54:00.003-07:002021-05-01T11:14:37.452-07:00RTL8812AU<p>
Realtek RTL8812AU - Linux (Ubuntu, Kali | Debian)
<br />
<br />Source: https://github.com/gnab/rtl8812au
</p>
<pre><code class="bash"># clone the drivers from git
git clone https://github.com/gnab/rtl8812au.git
# goto folder
cd rtl8812au/
# create the driver from the sources
make
# Check the driver
insmod 8812au.ko # (Sometimes error "File exists"
# copy to lib
cp 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/
# ?
depmod
# add autoload the driver on boot
echo 8812au | tee -a /etc/modules
# Optional
reboot
</code></pre>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-33794626268656964672021-04-18T22:44:00.002-07:002021-04-18T22:44:36.490-07:00libexec Tracker eat much CPU Usage<pre><code class="bash">echo -e "\nHidden=true\n" | sudo tee --append /etc/xdg/autostart/tracker-extract.desktop /etc/xdg/autostart/tracker-miner-apps.desktop /etc/xdg/autostart/tracker-miner-fs.desktop /etc/xdg/autostart/tracker-miner-user-guides.desktop /etc/xdg/autostart/tracker-store.desktop > /dev/null
gsettings set org.freedesktop.Tracker.Miner.Files crawling-interval -2 # Default: -1
gsettings set org.freedesktop.Tracker.Miner.Files enable-monitors false # Default: true
tracker reset --hard </code></pre>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-65816064239704653422021-04-13T15:04:00.005-07:002021-04-13T15:06:51.350-07:00Android SDK<p>React Native run attached android on usb<code></code>, create file path-to-app/android/local.properties with this:<br /></p><pre class="lang-none s-code-block"><code>sdk.dir = /Users/USERNAME/Library/Android/sdk</code></pre><p><code></code></p><p><b>Option 1:</b></p>
<pre class="default s-code-block hljs"><code>sudo apt update && sudo apt install android-sdk
</code></pre>
<p>The location of Android SDK on Linux can be any of the following:</p>
<ul><li><p><code>/home/AccountName/Android/Sdk</code></p>
</li><li><p><code>/usr/lib/android-sdk</code></p>
</li><li><p><code>/Library/Android/sdk/</code></p>
</li><li><p><code>/Users/[USER]/Library/Android/sdk</code></p>
</li></ul>
<p><b>Option 2:</b></p>
<ul><li><p>Download the <a href="http://developer.android.com/sdk/index.html#Other" rel="noreferrer">Android Studio</a>.</p>
</li><li><p>Extract downloaded <a href="https://dl.google.com/dl/android/studio/ide-zips/1.5.1.0/android-studio-ide-141.2456560-linux.zip" rel="noreferrer"><code>.zip</code></a> file.</p>
<p>The extracted folder name will read somewhat like <b>android-studio</b></p>
</li></ul>
<p>To keep navigation easy, move this folder to <b>Home</b> directory.</p>
<ul><li><p><i>After moving</i>, copy the moved folder by right clicking it. This action will place folder's location to clipboard.</p>
</li><li><p>Use <kbd> Ctrl </kbd> <kbd> Alt </kbd> <kbd> T </kbd> to open a terminal</p>
</li><li><p>Go to this folder's directory using <code>cd /home/(USER NAME)/android-studio/bin/</code></p>
</li><li><p>Type this command to make <code>studio.sh</code> executable: <code>chmod +x studio.sh</code></p>
</li><li><p>Type <code>./studio.sh</code></p>
</li></ul>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-42676060477037628822021-04-09T09:20:00.009-07:002021-04-09T09:51:11.328-07:00macOS Sierra<h3>Samba Connection</h3>
<p>First to know that it's too difficult to share folder and files between host OS windows with macOS guest in virtualbox using default sharing feature in virtualbox consider macos is non-free or non-community stuff. I do second option that is using samba.</p>
<ul>
<li>Change connection on virtualbox into Bridge mode</li>
<li>Activate your sharing folder on windows host os, use default folder (Public) locate on C:\Users\Public</li>
<li>Go to macOS and open Finder app</li>
<li>Click menu Go and choose connect to server</li>
<li>Check the windows ip address</li>
<li>Insert samba url <code>smb://<ip_address>/Users/Public</code></li>
<li>Insert credential access like username and password (windows account)</li>
</ul>
<p>Second option using bash command to mount the <code>Public</code> folder into specific path on macOS. Make sure you already create folder as mount point.</p>
<label>Script in file <code>mountPublicFolder</code>:</label>
<pre><code class="bash">#!/bin/bash
mount_smbfs //<username>@<ip_address>/Users/Public </path/to/folder>
# example:
# make mount point folder
## mkdir /Users/mymacOS/Desktop/shared
# connect
## mount_smbfs //mypc@192.168.1.70/Users/Public /Users/mymacOS/Desktop/shared
</code></pre>
<label>Script in file <code>umountPublicFolder</code>:</label>
<pre><code class="bash">#!/bin/bash
umount </path/to/folder>
# example
## umount /Users/mymacOS/Desktop/shared
</code></pre>
<p>Change the variable with your own.</p>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-23593539874333775542021-04-07T08:19:00.005-07:002021-04-07T08:30:41.081-07:00Javascript Prototyping Common Data Type<h3>String <small>DataType</small></h3>
<pre><code class="javascript">// reverse()
String.prototype.reverse = function(){
return this.toString().split('').reverse().join('');
}
// Without default javascript function
String.prototype.reverse = function(){
var self = this.toString();
var result = "";
for(i=self.length-1;i>=0;i--){
result+=self[i];
}
return result;
}
// Test
console.log("Hello World!".reverse());
// output: !dlroW olleH
//</code></pre>
<hr/>
<h3>Array <small>DataType</small></h3>
<pre><code class="javascript">// toObject()
//</code></pre>
<hr/>
<h3>Object <small>DataType</small></h3>
<pre><code class="javascript">//
//</code></pre>
<hr/>
<h3>Date <small>DataType</small></h3>
<pre><code class="javascript">// toLocale(),toString(), format(type)
//</code></pre>
<hr/>
<h3>Time <small>DataType</small></h3>
<pre><code class="javascript">// toDate(format="Y-m-d H:i:s")
//</code></pre>
<hr/>
<h3>Coming soon</h3>
<pre><code class="javascript">//
//</code></pre>
<hr/>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-24575599941282593002021-03-25T06:41:00.013-07:002021-03-25T06:53:00.548-07:00ReactJS<h3>ReactJS Templates</h3>
<pre><code class="bash">npx create-react-app my-app --template cra-template # default
npx create-react-app my-app --template cra-template-typescript # typescript
npx create-react-app my-app --template cra-template-pwa # add serviceWorker
</code></pre>
<p>More info <a href="https://www.npmjs.com/search?q=cra-template-*" target="_blank" rel="nofollow">search for cra-template-*</a>.</p>
<hr/>
<h3>ReactJS Modules</h3>
<pre><code class="bash">npm i express # express http server
# const express = require("express");
# const app = express();
npm i bootstrap # add bootstrap
# import "bootstrap/dist/css/bootstrap.min.css";
</code></pre>
Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-22324546791423518842021-02-27T19:11:00.022-08:002021-02-27T19:43:33.391-08:00Encoder & Decoder (Base64, ...)<h3>Base 64</h3>
<div class="form-group col-sm-6">
<label class="form-label" for="b64-in">Input</label>
<div class="pull-right">
<label onclick="b64.enc()" class="btn btn-xs btn-info">Encode</label>
<label onclick="b64.dec()" class="btn btn-xs btn-warning">Decode</label>
</div>
<div class="clearfix"></div>
<textarea autocomplete="off" id="b64-in" class="form-control"></textarea>
</div>
<div class="form-group col-sm-6">
<label class="form-label" for="b64-ou">Output</label>
<div class="pull-right">
<label onclick="b64.ou.select()" class="btn btn-xs btn-success">Select All</label>
</div>
<div class="clearfix"></div>
<textarea autocomplete="off" id="b64-ou" class="form-control"></textarea>
</div>
<script>var b64={
in:document.getElementById('b64-in'),
ou:document.getElementById('b64-ou'),
enc:function(){
if(b64.in.value==""){
b64.ou.value="";
}else if(b64.in.value!=""&&btoa(b64.in.value)){
b64.ou.value=btoa(b64.in.value);
}
},
dec:function(){
if(b64.in.value!=""&&atob(b64.in.value)){
b64.ou.value=atob(b64.in.value)
}
}
};</script>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-44677498197859470522020-10-28T14:46:00.013-07:002021-02-27T20:00:30.767-08:00Basic Math Operations<style>.title a.link.active{color:orangered;}</style>
<div class="form-group">
<h4 class="title" id="btn_math_operations">
<a href="javascript:;" data-op="+" class="link active">Sum</a>
<a href="javascript:;" data-op="-" class="link">Sub</a>
<a href="javascript:;" data-op="/" class="link">Div</a>
<a href="javascript:;" data-op="*" class="link">Mul</a>
<a href="javascript:;" data-op="string" class="link" title="something like this " 8 * 8 + 9 / (15 - 12) = 67 "">Query <small><em>(coming soon)</em></small></a>
</h4>
<textarea id="sum_input" class="form-control" rows="10"></textarea>
<input id="sum_result" type="text" class="form-control">
</div>
<script type="text/javascript">
var current_op='+';
document.querySelectorAll('#btn_math_operations a.link').forEach(k=>{
k.addEventListener('click',function(e){
document.querySelectorAll('#btn_math_operations a.link').forEach(v=>{
v.setAttribute('class','link');
})
this.setAttribute('class','link active');
current_op = this.getAttribute('data-op');
do_math_op();
})
})
function do_math_op(){
if(current_op=='string'){
var input = document.querySelector('#sum_input').value.replace(' ','');
var list = [];
// match all & split by '+','-','/','*','(',')' and collect in one var
// loop until end
// check next if not end
// if next = op & (op = '(') #override until match op ')', counter up and down
// else if next = op & '*' or '/' and current op = '+' or '-', do next and after next first, then check again
// input: 8 * 8 + 9 / (15 - 12)
// expected output: 67
/* 64 + 9 / (15 - 12)
* 64 + 9 / 3
* 64 + 3
* 67
*/
}else{
var total = 0;
var list = document.querySelector('#sum_input').value.replace(/( +)/gi,"\n").split("\n");
for(i=0;i<list.length;i++){
if(!isNaN(list[i])&&list[i]!=''){
if(i==0)total=parseInt(list[i]);
else{
switch(current_op){
case '+':total+=parseInt(list[i]);break;
case '-':total-=parseInt(list[i]);break;
case '/':total/=parseInt(list[i]);break;
case '*':total*=parseInt(list[i]);break;
}
}
}
};
document.querySelector('#sum_result').value = total;
}
}
document.querySelector('#sum_input').addEventListener('keyup',do_math_op)
</script>
Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-2710861201523816342020-10-27T07:33:00.004-07:002020-10-29T16:10:34.851-07:00Remove Duplicate Lines<div class="form-group">
<textarea id="duplicate-lines" class="form-control" rows="10"></textarea>
<label><input type="checkbox" id="sort">Sort</label>
<button class="btn btn-info" id="btn-duplicate-lines">Remove Duplicate Lines</button>
</div>
<script type="text/javascript">
const unique = (value, index, self) => {
return self.indexOf(value) === index
}
document.querySelector('#btn-duplicate-lines').addEventListener('click',function(){
var lines=document.querySelector('#duplicate-lines').value;
lines=lines.split('\n');
lines=lines.filter(unique);
if(document.querySelector('#sort').checked){
console.log('sorted')
lines=lines.sort();
}
document.querySelector('#duplicate-lines').value=lines.join('\n');
})
</script>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com1tag:blogger.com,1999:blog-7524700813576529138.post-18509668285065814662020-09-20T03:37:00.003-07:002020-09-20T04:46:55.379-07:00.htaccess<pre><code class="xml"># File access permission
<Files .htaccess>
order allow,deny
deny from all
</Files>
# Redirect
Redirect /path/to/web/file.html /path/to/web/target/file.html
</code></pre>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-89524565976952066202020-09-20T03:32:00.003-07:002020-09-20T03:32:27.071-07:00Git - Remote URL<pre><code class="bash">
# If you want only the remote URL, or referential integrity has been broken:
git config --get remote.origin.url
# If you require full output or referential integrity is intact:
git remote show origin
# Set url
git remote set-url origin new.git.url/here
</code></pre>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-69935137850855041052020-09-13T14:04:00.001-07:002020-09-20T03:28:39.063-07:00Git Init Bare on Every Sub Directory in Current Location<label class="label-control">Using For Loop: </label>
<pre><code class="bash">#/usr/bin/bash
pwd
# output:
# /home/user
ls
# output:
# repo_1.git
# repo_2.git
# repo_3.git
# single line below "for i in `ls`; do cd $i && git init --bare && cd ../; done;"
for i in `ls`
do
cd $i && git init --bare && cd ../;
done
# output:
# Initialized empty Git repository in /home/user/repo_1.git
# Initialized empty Git repository in /home/user/repo_2.git
# Initialized empty Git repository in /home/user/repo_3.git
</code></pre>
<hr/>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-63331108915047362352020-09-06T02:16:00.007-07:002020-10-29T16:11:03.314-07:00Node Adding Global Modules To Be Used in Current Program (.JS)<label class="label-control">Content of program.js: </label>
<pre><code class="javascript">#!/usr/bin/node
module.paths.push('/usr/lib/node_modules');
</code></pre>
</hr>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-5282251888027878832020-03-14T22:00:00.005-07:002023-08-13T00:28:48.681-07:00FFMPEG Cheatsheet<div>
<b>MP4 to Webm</b><br />
<pre><code class="bash">ffmpeg -i video.mp4 -c:v libvpx -crf 10 -b:v 1M -c:a libvorbis video.webm</code></pre>
</div>
<div>
<b>MP4 to Webm</b><br />
<pre><code class="bash">ffmpeg -i input.mp4 -c:v libtheora -q:v 7 -c:a libvorbis -q:a 4 output.ogv</code></pre>
</div>
<div>
<b>MP4 to MP3</b><br />
<pre><code class="bash">ffmpeg -i input.mp4 output.mp3</code></pre>
</div>
<div>
<b>MKV to MP3</b><br />
<pre><code class="bash">ffmpeg -i input.mkv -vn -c:a libmp3lame -y output.mp3</code></pre>
</div>
<div>
<b>MOV to MP4 (Compressed)</b><br />
<pre><code class="bash">ffmpeg -i my-video.mov -vcodec h264 -acodec mp2 my-video.mp4</code></pre>
</div>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-50397132311000847772020-03-10T13:52:00.000-07:002020-10-29T16:11:35.386-07:00Development With Har<h4>Filter by response code:</h4></br>
<pre><code class="javascript">#!/usr/bin/node
module.paths.push('/usr/lib/node_modules');
const fs = require('fs');
var data = {};
var params = process.argv[2];
function read(config={}){
fs.readFile(params,'utf8',function(err,data){
if(err) throw err;
data = JSON.parse(data).log.entries;
if(config.by.length>0){
if(config.by[0]=='status'){
data = data.filter(function(v){return v.response.status==config.by[1]}).map(function(v){return v.request.url});
}
};
if(config.save){
save()
}else{
console.log(data)
}
})
};
function save(){
fs.writeFile(params.replace(/(\.har)$/,"-output$1"),JSON.stringify(data),function(err){if(err) throw err})
};
read({
save:false,
by:['status',404]
})</code></pre>
</hr>Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0tag:blogger.com,1999:blog-7524700813576529138.post-1814220841069975222020-03-10T13:23:00.000-07:002020-10-29T16:11:45.698-07:00Regular Expression - Javascript<h4>Separate string by character length</h4>
<code class='javascript'>"This is String".replace(/(.{4})/,"$1\n")</code>
<br>
<b>Result:</b>
<br>
<pre>This
is
Stri
ng</pre>
Sofyanhttp://www.blogger.com/profile/00813131683930804946noreply@blogger.com0