# systemctl --failed
0 loaded units listed. Pass --all to see loaded but inactive units, too.
0 loaded units listed. Pass --all to see loaded but inactive units, too.
<?php
$out = fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>
$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
fputcsv($csv, array('blah','blah'));
rewind($csv);
// put it all in a variable
$output = stream_get_contents($csv);
fclose($csv);
function outputCSV($data) {
$outstream = fopen("php://output", 'w');
function __outputCSV(&$vals, $key, $filehandler) {
fputcsv($filehandler, $vals, ';', '"');
}
array_walk($data, '__outputCSV', $outstream);
fclose($outstream);
}
http.ListenAndServe(":8000",
csrf.Protect([]byte("32-byte-long-auth-key"), csrf.Secure(false))(r))
package main
import (
"fmt"
"io"
"net/http"
"log"
"encoding/json"
)
type Item struct {
ItemName string
ItemPrice int
}
type MyOrder struct {
Status bool
CustomerName string
ItemArr []Item
}
func getOrder() (MyOrder) {
item0 := Item {
ItemName: "Computer",
ItemPrice: 90,
}
order1 := MyOrder {
Status: true,
ItemArr: []Item{item0, Item {ItemName: "Pen", ItemPrice: 91}}, // initialize with two items.
}
return order1
}
func handler(w http.ResponseWriter, r *http.Request) {
// we will demonstrate the different ways of outputing string to the browser in the code below.
// So, we set the content type to text/plan.
//w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.Header().Set("Content-Type", "text/plain; charset=UTF-8")
// I am not sure what this line does. Leave it here for now.
//w.WriteHeader(http.StatusOK)
myorder := getOrder()
//json.NewEncoder(w).Encode(myorder) // this line will actually output the json string to the browser. However, we wrap it in if for checking error.
if err := json.NewEncoder(w).Encode(myorder); err == nil {
// demonstrate the different ways of outputing string to the browser.
str := "test"
fmt.Fprintf(w, "This is the first method %v\n", str)
io.WriteString(w, "This is the second method\n")
w.Write([]byte("This is the third method\n"))
} else {
fmt.Printf("Here: %v\n", err) // this line will output the string to the console screen instead of the browser.
}
}
func main() {
http.HandleFunc("/", handler)
err := http.ListenAndServe(":80", nil)
if err != nil {
fmt.Printf("main(): %s\n", err)
log.Fatal("ListenAndServe: ", err)
}
}
{"Status":true,"CustomerName":"","ItemArr":[{"ItemName":"Computer","ItemPrice":90},{"ItemName":"Pen","ItemPrice":91}]}
This is the first method test
This is the second method
This is the third method
package main
import (
"fmt"
"os"
"encoding/json"
)
type Item struct {
ItemName string
ItemPrice int
}
type MyOrder struct {
Status bool
CustomerName string
ItemArr []Item
}
func main() {
item0 := Item {
ItemName: "Computer",
ItemPrice: 90,
}
item2 := Item { ItemName: "Motherboard", ItemPrice: 92, }
item3 := Item { ItemName: "Hard drive", ItemPrice: 93, }
item4 := Item { ItemName: "Mouse", ItemPrice: 94, }
item5 := Item { ItemName: "Monitor", ItemPrice: 95, }
item6 := Item { ItemName: "Book", ItemPrice: 96, }
item7 := Item { ItemName: "Desk", ItemPrice: 97, }
item8 := Item { ItemName: "Door", ItemPrice: 98, }
item9 := Item { ItemName: "Car", ItemPrice: 99, }
order1 := MyOrder {
Status: true,
ItemArr: []Item{item0, Item {ItemName: "Pen", ItemPrice: 91}}, // initialize with two items.
}
order1.CustomerName = "Jun"
// first way of appending the items to the ItemArr slice.
order1.ItemArr = append(order1.ItemArr, item2, item3)
// second way of appending the items to the ItemArr slice.
// The three dots is called variadic parameter / Ellipsis meaning unpack this slice into a set of variadic arguments.
order1.ItemArr = append(order1.ItemArr, []Item{item4, item5}...)
// third way of appending the items to the ItemArr slice.
itemArr := []Item{item6, item7}
order1.ItemArr = append(order1.ItemArr, itemArr...)
// fourth way of appending the items to the ItemArr slice.
order1.ItemArr = append(order1.ItemArr, item8)
order1.ItemArr = append(order1.ItemArr, item9)
encoder := json.NewEncoder(os.Stdout) //output to screen
if err := encoder.Encode(order1); err != nil {
fmt.Println(err)
}
}
For an expression x of interface type and a type T, the primary expression x.(T) asserts that x is not nil and that the value stored in x is of type T.
str, ok := data.(string)
if str, ok := data.(string); ok {
/* act on str */
} else {
/* not string */
}
package main
import (
"fmt"
"reflect"
"encoding/json"
)
func main() {
/*
* Encode Decode arbitrary map and JSON
*/
orderMap := map[string]interface{}{
"status": true,
"name": "bot",
"age": 18,
//"itemArr": []map[string]interface{}{},
"itemArr": []interface{}{},
}
orderMap["email"] = "bot@example.com"
item0 := map[string]interface{}{
"lineNum": 0,
"itemNum": "A0",
"itemPrice": 90,
}
item1 := map[string]interface{}{
"lineNum": 1,
"itemNum": "A1",
"itemPrice": 91,
"accessoryArr": []interface{}{},
}
item1["accessoryArr"] = append(item1["accessoryArr"].([]interface{}), map[string]interface{}{"name": "bag", "price": 10})
item1["accessoryArr"] = append(item1["accessoryArr"].([]interface{}), map[string]interface{}{"name": "tray", "price": 12})
// To access the element we can use a type assertion to access the underlying map of the orderMap["itemArr"].
orderMap["itemArr"] = append(orderMap["itemArr"].([]interface{}), item0)
orderMap["itemArr"] = append(orderMap["itemArr"].([]interface{}), item1)
orderJson, err := json.Marshal(orderMap)
if err == nil {
itemArrType := reflect.TypeOf(orderMap["itemArr"])
itemArrTypeKind := reflect.TypeOf(orderMap["itemArr"]).Kind()
itemArrElemType := reflect.TypeOf(orderMap["itemArr"]).Elem()
fmt.Printf("itemArr: %v\n", itemArrType)
fmt.Printf("itemArrTypeKind: %v\n", itemArrTypeKind)
fmt.Printf("itemElement: %v\n", itemArrElemType)
fmt.Printf("\n")
fmt.Println("=== Showing the original orderMap:")
fmt.Printf("%v\n\n", orderMap)
fmt.Println("=== Showing the encoded orderJson:")
fmt.Printf("%v\n\n", string(orderJson))
fmt.Println("=== Showing the decoded orderJson:")
// As we're un-marshalling into an interface, we need to inform go what data type each key is before we can perform operations on it.
// This is what the .(map[string]interface{}) does
var orderMapTmp map[string]interface{}
json.Unmarshal([]byte(orderJson), &orderMapTmp)
fmt.Printf("%v\n\n", orderMapTmp)
fmt.Println("=== Showing how to access individual element in the decoded orderJson:")
// The data type here was the key. [0] was not actually a map, but an interface{}, which could be anything - a map, a string, an int. You need to "type assertion" it to a map first, or do the awkward case switch outlined in JSON and Go.
// Otherwise, you will get "invalid operation: type interface {} does not support indexing)".
fmt.Printf("itemNum: %v\n", orderMapTmp["itemArr"].([]interface{})[0].(map[string]interface{})["itemNum"])
fmt.Printf("itemPrice: %v\n", orderMapTmp["itemArr"].([]interface{})[0].(map[string]interface{})["itemPrice"])
}
}
itemArr: []interface {}
itemArrTypeKind: slice
itemElement: interface {}
=== Showing the original orderMap:
map[status:true name:bot age:18 itemArr:[map[lineNum:0 itemNum:A0 itemPrice:90] map[itemPrice:91 accessoryArr:[map[name:bag price:10] map[price:12 name:tray]] lineNum:1 itemNum:A1]] email:bot@example.com]
=== Showing the encoded orderJson:
{"age":18,"email":"bot@example.com","itemArr":[{"itemNum":"A0","itemPrice":90,"lineNum":0},{"accessoryArr":[{"name":"bag","price":10},{"name":"tray","price":12}],"itemNum":"A1","itemPrice":91,"lineNum":1}],"name":"bot","status":true}
=== Showing the decoded orderJson:
map[status:true age:18 email:bot@example.com itemArr:[map[itemNum:A0 itemPrice:90 lineNum:0] map[accessoryArr:[map[name:bag price:10] map[name:tray price:12]] itemNum:A1 itemPrice:91 lineNum:1]] name:bot]
=== Showing how to access individual element in the decoded orderJson:
itemNum: A0
itemPrice: 90
package main
import (
"fmt"
"net/http"
"log"
"github.com/gorilla/mux"
)
const (
PORT = ":80"
STATIC_DIR = "/static/"
)
func main() {
mx := mux.NewRouter()
mx.PathPrefix(STATIC_DIR).Handler(http.StripPrefix(STATIC_DIR, http.FileServer(http.Dir("." + STATIC_DIR))))
err := http.ListenAndServe(PORT, mx)
if err != nil {
fmt.Printf("main(): %s\n", err)
log.Fatal("ListenAndServe: ", err)
}
}
package main
import (
"fmt"
"net/http"
"log"
"github.com/gorilla/mux"
)
const (
PORT = ":80"
)
func SayHelloWorld(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.Write([]byte("<span style=\"color: red;\">Hello, World!</span>"))
}
func main() {
mx := mux.NewRouter()
mx.HandleFunc("/", SayHelloWorld)
err := http.ListenAndServe(PORT, mx)
if err != nil {
fmt.Printf("main(): %s\n", err)
log.Fatal("ListenAndServe: ", err)
}
}
/// <summary>
/// A simple program to show off an OWIN self-hosted web app.
/// </summary>
public class Program
{
/// <summary>
/// The entry point for the console application.
/// </summary>
/// <param name="args">The arguments to the execution of the console application. Ignored.</param>
static void Main(string[] args)
{
// Start OWIN host
using (WebApp.Start<Startup>(url: "http://localhost:8000"))
{
// Runs until a key is pressed
Console.ReadKey();
}
}
/// <summary>
/// This code configures the OWIN web app. The Startup class is specified as a type parameter in the WebApp.Start method.
/// </summary>
private class Startup
{
/// <summary>
/// Configures the web app.
/// </summary>
/// <param name="app">The app builder.</param>
public void Configuration( IAppBuilder app )
{
// We ignore any rules here and just return the same response for any request
app.Run( context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync( "Hello World\n" );
} );
}
}
}
<?php
// Logs a notice
\Drupal::logger('my_module')->notice('@type: deleted %title.', [
'@type' => $this->entity->bundle(),
'%title' => $this->entity->label(),
]);
// Logs an error
\Drupal::logger('my_module')->error('@type: deleted %title.', [
'@type' => $this->entity->bundle(),
'%title' => $this->entity->label(),
]);
?>
<?php
try {
// some code
}
catch (\Exception $e) {
watchdog_exception('test', $e);
}
?>
@variable — Use this style of placeholder for most use-cases. Special characters in the text will be converted to HTML entities.
%variable — Use this style of placeholder to pass text through drupal_placeholder() which will result in HTML escaped text, then wrapped with <em> tags.
:variable — Use this style of placeholder when substituting the value of an href attribute. Values will be HTML escaped, and filtered for dangerous protocols.
<?php
/**
* Implements hook_mail().
*/
function mymodule_mail($key, &$message, $params) {
$options = [
'langcode' => $message['langcode'],
];
switch ($key) {
case 'order_confirmation':
$message['from'] = \Drupal::config('system.site')->get('mail');
$message['subject'] = t('test: @subject', [
'@subject' => $params['subject'],
], $options);
$message['body'][] = $params['body'];
break;
}
}
function mymodule_sendOrderConfirmation($toEmail, $params) {
\Drupal::service('plugin.manager.mail')->mail(
'mymodule',
'order_confirmation',
$toEmail,
\Drupal::languageManager()->getDefaultLanguage()->getId(),
$params,
NULL, // Optional email address to be used to answer.
TRUE
);
}
mymodule_sendOrderConfirmation('test@example.com', [
'subject' => 'test subject',
'body' => 'test body',
]);
?>
<html>
<head>
<script src="https://code.jquery.com/jquery-2.2.2.min.js"></script>
<script>
$( document ).ready(function() {
$('#uploadBtn').on('click', function(event){
$.get( 'http://127.0.0.1:1337/', function( data ) {
console.log(data);
});
});
});
</script>
</head>
<body>
<p id="uploadBtn">Hit me to Upload</p>
</bodY>
</html>
<?php
file_put_contents('/tmp/debug1', print_r($_FILES, TRUE) . PHP_EOL, FILE_APPEND);
if (!empty($_FILES)) {
$dir = '/www/my/javascript/tmp/upload_dir/';
### Warning: remember to sanitize the filename because it could be forged.
move_uploaded_file($_FILES['file1']['tmp_name'], $dir . $_FILES['file1']['name']);
}
?>
const http = require('http');
const hostname = '127.0.0.1';
const port = 1337;
var url = require('url');
var edge = require('edge');
var uploadFile = edge.func(
{
source: function() {/*
using System;
using System.IO;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Printing;
using System.Net.Http;
public class Startup
{
public async Task<object> Invoke(dynamic input)
{
int a = (int)input.a;
int b = (int)input.b;
//MathHelper.printToPrinter(input.myMsg);
MathHelper.Upload(input.uploadURL, input.filePath);
return MathHelper.Add(a, b);
}
}
static class MathHelper
{
public static int Add(int a, int b)
{
return a + b;
}
public static System.IO.Stream Upload(string url, string filename)
{
Stream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
HttpContent fileStreamContent = new StreamContent(fileStream);
// Submit the form using HttpClient and
// create form data as Multipart (enctype="multipart/form-data")
using (var client = new HttpClient())
using (var formData = new MultipartFormDataContent())
{
formData.Add(fileStreamContent, "file1", filename);
// equivalent to (action="{url}" method="post")
var response = client.PostAsync(url, formData).Result;
// equivalent of pressing the submit button on the form
if (!response.IsSuccessStatusCode)
{
return null;
}
return response.Content.ReadAsStreamAsync().Result;
}
}
public static void printToPrinter(string s) {
//string s = "string to print2";
PrintDocument p = new PrintDocument();
p.PrintPage += delegate (object sender1, PrintPageEventArgs e1)
{
e1.Graphics.DrawString(s, new Font("Times New Roman", 12), new SolidBrush(Color.Black), new RectangleF(0, 0, p.DefaultPageSettings.PrintableArea.Width, p.DefaultPageSettings.PrintableArea.Height));
};
try
{
p.Print();
}
catch (Exception ex)
{
throw new Exception("Exception Occured While Printing", ex);
}
}
}
*/},
references: ["System.dll", "System.Drawing.dll", "System.Net.Http.dll"]
});
var myTxt = "Hello World";
var remoteURL = 'http://my.cent-dev.local';
var uploadURL = remoteURL + "/javascript/tmp/upload.php";
var filePath = "C:/Users/bot/Downloads/tmp/node.js/asdf2.pdf";
http.createServer((req, res) => {
var queryData = url.parse(req.url, true).query;
console.log(queryData);
uploadFile({ a: 5, b: 10, myMsg: myTxt, uploadURL: uploadURL, filePath: filePath}, function (error, result) {
console.log(result);
});
res.writeHead(200, {
'Content-Type': 'text/plain',
'Access-Control-Allow-Origin': remoteURL,
});
res.end('Hello World123\n');
}).listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
var emptyObj = Object.create( null );
$element['#ajax']['disable-refocus'] = TRUE;
<style>
article {
position: relative;
z-index: 1;
background: transparent url('/path/to/your/image') no-repeat center center;
}
article::after{
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.4;
z-index: -1;
background: #000000;
}
</style>
<article>
Text.
</article>
var str = "Happy New Year 2011";
var spans = '<span>' + str.split(/\s+/).join(' </span><span>') + '</span>';
$(spans).hide().appendTo('body').each(function(i) {
$(this).delay(400 * i).fadeIn(1000);
});
var str = "Happy New Year 2011";
var spans = '<span>' + str.split(/\s+/).join(' </span><span>') + '</span>';
$(spans).hide().appendTo('body').each(function(i) {
$(this).delay(1000 * i).fadeIn();
});
<style>
strong {
font-weight: bold;
}
</style>
<div id="greeting">
<h1>here is a test text. <strong>We believe this is better</strong> than ever.</h1>
</div>
<script>
$(document).ready(function() {
var h1 = $('div#greeting h1');
h1.hide().contents().each(function() {
var words;
if (this.nodeType === 3) {
words = '<span> ' + this.data.split(/\s+/).join(' </span><span> ') + ' </span>';
$(this).replaceWith(words);
} else if (this.nodeType === 1) {
this.innerHTML = '<span> ' + this.innerHTML.split(/\s+/).join(' </span><span> ') + ' </span>';
}
});
h1.find('span').hide().each(function() {
if (!$.trim(this.innerHTML)) {
$(this).remove();
}
});
h1.show().find('span').each(function(i) {
$(this).delay(400 * i).fadeIn(600);
});
});
</script>
<div id="mydiv"></div>
<button>Go</button>
<script>
var mystr = 'How are you doing?';
$(document).ready(function() {
$('button').click(function() {
var dv = $('#mydiv');
dv.text("");
jQuery({
count: 0
}).animate({
count: mystr.length
}, {
duration: 4500,
step: function() {
dv.text(mystr.substring(0, Math.round(this.count)));
},
});
});
});
</script>
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_event_module modules/mod_mpm_event.so
<Directory "/var/www/html">
AllowOverride All
# New directive needed in Apache 2.4.3:
Require all granted
</Directory>
find . -name '*.txt' | while read line; do
echo "Processing file '$line'"
done
Agent pid 5989
######
# start up ssh-agent automatically when a new bash session starts.
# Note: the reason why I added -n "$SSH_TTY" is because without it, sftp and/or scp may fail at connection time if you have shell initialization (.profile, .bashrc, .cshrc, etc) which produces output for non-interactive sessions. This output confuses the sftp/scp client.
# Note: the other way: if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
######
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [[ -z "$SSH_AUTH_SOCK" && -n "$SSH_TTY" && -a "$SSHAGENT" && -x "$SSHAGENT" ]]; then
eval `$SSHAGENT $SSHAGENTARGS`
trap "kill $SSH_AGENT_PID" 0
fi
if [[ -e $HOME/.sshagent.conf ]]; then
. $HOME/.sshagent.conf
fi
if `ps -p ${SSH_AGENT_PID}>/dev/null`; then
true;
else
ssh-agent >| $HOME/.sshagent.conf
. $HOME/.sshagent.conf
ssh-add ~/.ssh/id_dsa
fi
ssh-auth() {
# Start the SSH agent only if not running
[[ -z $(ps | grep ssh-agent) ]] && echo $(ssh-agent) > /tmp/ssh-agent-data.sh
# Identify the running SSH agent
[[ -z $SSH_AGENT_PID ]] && source /tmp/ssh-agent-data.sh > /dev/null
# Authenticate (change key path or make a symlink if needed)
[[ -z $(ssh-add -l | grep "/home/$(whoami)/.ssh/id_rsa") ]] && ssh-add
}
# You can repeat this for other commands using SSH
git() { ssh-auth; command git "$@"; }
Connect privately to other VPCs- Peer VPCs together to share resources across multiple virtual networks owned by your or other AWS accounts.
8.3.1 Collapsing margins
In CSS, the adjoining margins of two or more boxes (which might or might not be siblings) can combine to form a single margin. Margins that combine this way are said to collapse, and the resulting combined margin is called a collapsed margin.
Adjoining vertical margins collapse [...]
Two margins are adjoining if and only if:
- both belong to in-flow block-level boxes that participate in the same block formatting context
- no line boxes, no clearance, no padding and no border separate them
- both belong to vertically-adjacent box edges, i.e. form one of the following pairs:
-- top margin of a box and top margin of its first in-flow child
$('html, body').animate({
scrollTop: $('#test').offset().top,
}, 400, function(){
console.log('this will be fired twice');
})
.promise().then(function() {
// Called when the animation in total is complete
console.log('this will be fired once');
});
<video autoplay controls poster="../images/poster.jpg" preload="metadata">Your browser does not support the video element</video>
<script src="js/main.js"></script>
'use strict';
/* globals FileError */
// get video file via XHR
// store with File API
// read Blob from File API and set as video src using createObjectUrl()
// play video
var video = document.querySelector('video');
function getVideo(fileEntry) {
get('../video/chrome.webm', function(uInt8Array) {
var blob = new Blob([uInt8Array], {
type: 'video/webm'
});
writeToFile(fileEntry, blob);
});
}
function get(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.send();
xhr.onload = function() {
if (xhr.status !== 200) {
alert('Unexpected status code ' + xhr.status + ' for ' + url);
return false;
}
callback(new Uint8Array(xhr.response));
};
}
// code adapted from HTML5 Rocks article by Eric Bidelman
// http://www.html5rocks.com/en/tutorials/file/filesystem/
// init a FileSystem
// create a file
// write to the file
// read from the file
window.requestFileSystem =
window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.TEMPORARY, 5 * 1024 * 1024, // 5MB
handleInitSuccess, handleError);
function handleInitSuccess(fileSystem) {
window.fileSystem = fileSystem;
log('Initiated FileSystem: ' + fileSystem.name);
createFile('video.webm');
}
function createFile(fullPath) {
window.fileSystem.root.getFile(fullPath, {
create: true
/* exclusive: true */
},
function(fileEntry) {
log('Created file: ' + fileEntry.fullPath);
getVideo(fileEntry);
}, handleError);
}
function writeToFile(fileEntry, blob) {
// Create a FileWriter object for fileEntry
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function() {
// read from file
log('Wrote to file ' + fileEntry.fullPath);
readFromFile(fileEntry.fullPath);
};
fileWriter.onerror = function(e) {
log('Write failed: ' + e.toString());
};
// Create a new Blob and write it to file
fileWriter.write(blob);
}, handleError);
}
function readFromFile(fullPath) {
window.fileSystem.root.getFile(fullPath, {}, function(fileEntry) {
// Get a File object representing the file
// then use FileReader to read its contents
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function() {
// video.src = this.result;
video.src = URL.createObjectURL(new Blob([this.result]));
};
// reader.readAsDataURL(file);
reader.readAsArrayBuffer(file);
}, handleError);
}, handleError);
}
function handleError(e) {
switch (e.code) {
case FileError.QUOTA_EXCEEDED_ERR:
log('QUOTA_EXCEEDED_ERR');
break;
case FileError.NOT_FOUND_ERR:
log('NOT_FOUND_ERR');
break;
case FileError.SECURITY_ERR:
log('SECURITY_ERR');
break;
case FileError.INVALID_MODIFICATION_ERR:
log('INVALID_MODIFICATION_ERR');
break;
case FileError.INVALID_STATE_ERR:
log('INVALID_STATE_ERR');
break;
default:
log('Unknown error');
break;
}
}
var data = document.getElementById('data');
function log(text) {
data.innerHTML += text + '<br />';
}
document.querySelector('video').addEventListener('loadedmetadata', function() {
var fileName = this.currentSrc.replace(/^.*[\\\/]/, '');
document.querySelector('#videoSrc').innerHTML = 'currentSrc: ' + fileName +
'<br /> videoWidth: ' + this.videoWidth + 'px<br /> videoHeight: ' + this
.videoHeight + 'px';
});
-rwsr-xr-x. 1 root root 0 Jan 23 16:37 test.sh
./test.sh
dr-xr-sr-x. 2 root root 6 Jan 23 16:40 test
./test
drwxr-x--T. 2 root root 6 Jan 23 16:46 test
./test