diff options
-rw-r--r-- | bash.html.markdown | 18 | ||||
-rw-r--r-- | de-de/python3-de.html.markdown | 2 | ||||
-rw-r--r-- | el-gr/bash-gr.html.markdown | 528 | ||||
-rw-r--r-- | mercurial.html.markdown | 4 | ||||
-rw-r--r-- | perl6.html.markdown | 8 | ||||
-rw-r--r-- | python3.html.markdown | 11 | ||||
-rw-r--r-- | reason.html.markdown | 15 | ||||
-rw-r--r-- | solidity.html.markdown | 2 | ||||
-rw-r--r-- | th-th/typescript.th.html.markdown | 259 | ||||
-rw-r--r-- | tmux.html.markdown | 2 |
10 files changed, 825 insertions, 24 deletions
diff --git a/bash.html.markdown b/bash.html.markdown index 0385c46d..856db706 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -11,13 +11,15 @@ contributors: - ["Rahil Momin", "https://github.com/iamrahil"] - ["Gregrory Kielian", "https://github.com/gskielian"] - ["Etan Reisner", "https://github.com/deryni"] - - ["Jonathan Wang", "https://github.com/Jonathansw"] + - ["Jonathan Wang", "https://github.com/Jonathansw"] - ["Leo Rudberg", "https://github.com/LOZORD"] - ["Betsy Lorton", "https://github.com/schbetsy"] - ["John Detter", "https://github.com/jdetter"] - ["Harry Mumford-Turner", "https://github.com/harrymt"] - ["Martin Nicholson", "https://github.com/mn113"] filename: LearnBash.sh +translators: + - ["Dimitri Kokkonis", "https://github.com/kokkonisd"] --- Bash is a name of the unix shell, which was also distributed as the shell @@ -67,7 +69,7 @@ echo '$Variable' # => $Variable # Parameter expansion ${ }: echo ${Variable} # => Some string # This is a simple usage of parameter expansion -# Parameter Expansion gets a value from a variable. +# Parameter Expansion gets a value from a variable. # It "expands" or prints the value # During the expansion time the value or parameter can be modified # Below are other modifications that add onto this expansion @@ -87,7 +89,7 @@ echo ${Variable: -5} # => tring echo ${#Variable} # => 11 # Default value for variable -echo ${Foo:-"DefaultValueIfFooIsMissingOrEmpty"} +echo ${Foo:-"DefaultValueIfFooIsMissingOrEmpty"} # => DefaultValueIfFooIsMissingOrEmpty # This works for null (Foo=) and empty string (Foo=""); zero (Foo=0) returns 0. # Note that it only returns default value and doesn't change variable value. @@ -244,7 +246,7 @@ cp -r srcDirectory/ dst/ # recursively copy # `mv` is also useful for renaming files! mv s0urc3.txt dst.txt # sorry, l33t hackers... -# Since bash works in the context of a current directory, you might want to +# Since bash works in the context of a current directory, you might want to # run your command in some other directory. We have cd for changing location: cd ~ # change to home directory cd # also goes to home directory @@ -280,7 +282,7 @@ for line in sys.stdin: EOF # Variables will be expanded if the first "EOF" is not quoted -# Run the hello.py Python script with various stdin, stdout, and +# Run the hello.py Python script with various stdin, stdout, and # stderr redirections: python hello.py < "input.in" # pass input.in as input to the script @@ -322,7 +324,7 @@ rm -r tempDir/ # recursively delete # current directory. echo "There are $(ls | wc -l) items here." -# The same can be done using backticks `` but they can't be nested - +# The same can be done using backticks `` but they can't be nested - #the preferred way is to use $( ). echo "There are `ls | wc -l` items here." @@ -442,8 +444,8 @@ grep "^foo.*bar$" file.txt | grep -v "baz" # and not the regex, use fgrep (or grep -F) fgrep "foobar" file.txt -# The `trap` command allows you to execute a command whenever your script -# receives a signal. Here, `trap` will execute `rm` if it receives any of the +# The `trap` command allows you to execute a command whenever your script +# receives a signal. Here, `trap` will execute `rm` if it receives any of the # three listed signals. trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM diff --git a/de-de/python3-de.html.markdown b/de-de/python3-de.html.markdown index c383d742..4ef997a1 100644 --- a/de-de/python3-de.html.markdown +++ b/de-de/python3-de.html.markdown @@ -14,7 +14,7 @@ Python wurde in den frühen Neunzigern von Guido van Rossum entworfen. Es ist he Feedback ist herzlich willkommen! Ihr erreicht mich unter [@louiedinh](http://twitter.com/louiedinh) oder louiedinh [at] [google's email service]. -Hinweis: Dieser Beitrag bezieht sich insplizit auf Python 3. Falls du lieber Python 2.7 lernen möchtest, schau [hier](http://learnxinyminutes.com/docs/python/) weiter. +Hinweis: Dieser Beitrag bezieht sich implizit auf Python 3. Falls du lieber Python 2.7 lernen möchtest, schau [hier](http://learnxinyminutes.com/docs/python/) weiter. ```python diff --git a/el-gr/bash-gr.html.markdown b/el-gr/bash-gr.html.markdown new file mode 100644 index 00000000..2989969d --- /dev/null +++ b/el-gr/bash-gr.html.markdown @@ -0,0 +1,528 @@ +--- +category: tool +tool: bash +contributors: + - ["Dimitri Kokkonis", "https://github.com/kokkonisd"] +filename: LearnBash-gr.sh +lang: el-gr +--- + +Η λέξη «bash» είναι ένα από τα ονόματα του unix shell (τερματικός), το οποίο +διανέμεται επίσης ως προεπιλεγμένος τερματικός για το λειτουργικό σύστημα GNU, τα Linux και τα Mac OS X. +Σχεδόν όλα τα παραδείγματα που ακολουθούν μπορούν να αποτελέσουν μέρος ενός +προγράμματος τερματικού (shell script) ή να εκτελεσθούν απευθείας από τον +τερματικό. + +[Διαβάστε περισσότερα εδώ.](http://www.gnu.org/software/bash/manual/bashref.html) + +```bash +#!/usr/bin/env bash +# Η πρώτη γραμμή του προγράμματος είναι το shebang που υποδεικνύει στο σύστημα +# πώς να εκτελέσει το πρόγραμμα: http://en.wikipedia.org/wiki/Shebang_(Unix) +# Όπως ήδη θα καταλάβατε, τα σχόλια ξεκινούν με τον χαρακτήρα #. Το shebang +# είναι επίσης ένα σχόλιο. +# ΣτΜ.: Τα ονόματα των μεταβλητών είναι γραμμένα σε greeklish καθώς η Bash δεν +# επιτρέπει την χρήση unicode χαρακτήρων. + +# Ένα απλό παράδειγμα τύπου «hello world»: +echo Καλημέρα, Κόσμε! # => Καλημέρα, Κόσμε! + +# Κάθε εντολή ξεκινά σε μια νέα γραμμή, ή μετά από ένα ελληνικό ερωτηματικό: +echo 'Αυτή είναι η πρώτη γραμμή'; echo 'Αυτή είναι η δεύτερη γραμμή' +# => Αυτή είναι η πρώτη γραμμή +# => Αυτή είναι η δεύτερη γραμμή + +# Ορίζουμε μεταβλητές ως εξής: +Metavliti="Κάποιο αλφαριθμητικό" + +# Αλλά όχι ως εξής: +Metavliti = "Κάποιο αλφαριθμητικό" # => επιστρέφει το λάθος +# «Metavliti: command not found» +# Η Bash θα καταλάβει πως η Metavliti είναι κάποια εντολή που πρέπει να +# εκτελέσει και θα επιστρέψει ένα λάθος γιατί δεν μπορεί να την βρει. + +# Ούτε έτσι μπορούμε να δηλώσουμε μεταβλητές: +Metavliti= 'Κάποιο αλφαριθμητικό' # => επιστρέφει το λάθος: «Κάποιο + # αλφαριθμητικό: command not found» +# Η Bash θα καταλάβει πως το αλφαριθμητικό «Κάποιο αλφαριθμητικό» είναι μια +# εντολή που πρέπει να εκτελέσει και θα επιστρέψει ένα λάθος γιατί δεν μπορεί +# να την βρει. (Σε αυτή την περίπτωση το τμήμα της εντολής «Metavliti=» θα +# ερμηνευθεί ως ορισμός μεταβλητής ισχύων μόνο στο πλαίσιο της εντολής +# «Κάποιο αλφαριθμητικό».) + +# Ας χρησιμοποιήσουμε την μεταβλητή: +echo $Metavliti # => Κάποιο αλφαριθμητικό +echo "$Metavliti" # => Κάποιο αλφαριθμητικό +echo '$Metavliti' # => $Metavliti +# Όταν χρησιμοποιούμε την ίδια την μεταβλητή - είτε είναι για να της δώσουμε +# μια νέα αξία, για να την εξάγουμε ή για οτιδήποτε άλλο - γράφουμε το όνομά +# της χωρίς τον χαρακτήρα $. Αν θέλουμε να χρησιμοποιήσουμε την αξία της +# μεταβλητής, πρέπει να χρησιμοποιήσουμε τον χαρατήρα $. +# Να σημειωθεί πώς ο χαρακτήρας ' δεν θα μετατρέψει τις μεταβλητές στις αξίες +# τους! + +# Επέκταση παραμέτρων ${ }: +echo ${Metavliti} # => Κάποιο αλφαριθμητικό +# Αυτή είναι μια απλή χρήση της επέκτασης παραμέτρων. +# Η επέκταση παραμέτρων εξάγει μια αξία από μια μεταβλητή. +# Κατά την επέκταση η τιμή ή η παράμετρος μπορεί να τροποποιηθεί. +# Ακολουθούν άλλες μετατροπές που μπορούν να προστεθούν σε αυτή την επέκταση. + +# Αντικατάσταση αλφαριθμητικών μέσα σε μεταβλητές +echo ${Metavliti/Κάποιο/Ένα} # => Ένα αλφαριθμητικό +# Αυτή η τροποποίηση θα αντικαταστήσει την πρώτη εμφάνιση της λέξης «Κάποιο» +# με την λέξη «Ένα». + +# Υποαλφαριθμητικό μιας μεταβλητής +Mikos=7 +echo ${Metavliti:0:Mikos} # => Κάποιο +# Αυτή η τροποποίηση θα επιστρέψει μόνο τους πρώτους 7 χαρακτήρες της τιμής +# της μεταβλητής. +echo ${Metavliti: -5} # => ητικό +# Αυτή η τροποποίηση θα επιστρέψει τους τελευταίους 5 χαρακτήρες (προσοχή στο +# κενό πριν το -5). + +# Μήκος αλφαριθμητικού +echo ${#Metavliti} # => 20 + +# Προεπιλεγμένη αξία για μια μεταβλητή +echo ${Foo:-"ΠροεπιλεγμένηΑξίαΑνΤοFooΕίναιΑόριστοΉΆδειο"} +# => ΠροεπιλεγμένηΑξίαΑνΤοFooΕίναιΑόριστοΉΆδειο +# Αυτό δουλεύει στην περίπτωση που το Foo είναι αόριστο (Foo=) ή άδειο +# (Foo="")· το μηδέν (Foo=0) επιστρέφει 0. +# Να σημειωθεί πως αυτή η εντολή απλώς επιστρέφει την προεπιλεγμένη αξία και +# δεν τροποποιεί την αξία της μεταβλητής. + +# Ορισμός ενός πίνακα με 6 στοιχεία +pinakas0=(ένα δύο τρία τέσσερα πέντε έξι) +# Εντολή που τυπώνει το πρώτο στοιχείο +echo $pinakas0 # => "ένα" +# Εντολή που τυπώνει το πρώτο στοιχείο +echo ${pinakas0[0]} # => "ένα" +# Εντολή που τυπώνει όλα τα στοιχεία +echo ${pinakas0[@]} # => "ένα δύο τρία τέσσερα πέντε έξι" +# Εντολή που τυπώνει τον αριθμό των στοιχείων +echo ${#pinakas0[@]} # => "6" +# Εντολή που τυπώνει τον αριθμό των χαρακτήρων στο τρίτο στοιχείο +echo ${#pinakas0[2]} # => "4" +# Εντολή που τυπώνει δύο στοιχεία ξεκινώντας από το τέταρτο +echo ${pinakas0[@]:3:2} # => "τέσσερα πέντε" +# Εντολή που τυπώνει όλα τα στοιχεία, το καθένα σε διαφορετική γραμμή +for i in "${pinakas0[@]}"; do + echo "$i" +done + +# Επέκταση αγκίστρων { } +# Χρησιμοποιείται για την παραγωγή αλφαριθμητικών +echo {1..10} # => 1 2 3 4 5 6 7 8 9 10 +echo {a..z} # => a b c d e f g h i j k l m n o p q r s t u v w x y z +# Η εντολή θα τυπώσει όλο το εύρος, από την πρώτη μέχρι την τελευταία αξία + +# Ενσωματωμένες μεταβλητές +# Υπάρχουν κάποιες χρήσιμες ενσωματωμένες μεταβλητές, όπως: +echo "Η τιμή την οποία επέστρεψε το τελευταίο πρόγραμμα: $?" +echo "Ο αριθμός PID αυτού του script: $$" +echo "Ο αριθμός των παραμέτρων που περάστηκαν σε αυτό το script: $#" +echo "Όλες οι παράμετροι που περάστηκαν σε αυτό το script: $@" +echo "Οι παράμετροι του script διαχωρισμένες σε μεταβλητές: $1 $2..." + +# Τώρα που γνωρίζουμε πως να τυπώνουμε (echo) και να χρησιμοποιούμε μεταβλητές, +# ας μάθουμε κάποια από τα υπόλοιπα βασικά στοιχεία της Bash! + +# Ο τρέχων κατάλογος (ή αλλιώς, φάκελος) μπορεί να βρεθεί μέσω της εντολής +# `pwd`. +# `pwd` σημαίνει «print working directory». +# Μπορούμε επίσης να χρησιμοποιούμε την ενσωματωμένη μεταβλητή `$PWD`. +# Παρακολουθήστε πως οι δύο εντολές που ακολουθούν είναι ισοδύναμες: +echo "Είμαι στον κατάλογο $(pwd)" # εκτελεί την εντολή `pwd` και τυπώνει το + # αποτέλεσμα +echo "Είμαι στον κατάλογο $PWD" # τυπώνει την αξία της μεταβλητής + +# Αν έχετε πολλά μηνύματα στον τερματικό, η εντολή `clear` μπορεί να +# «καθαρίσει» την οθόνη σας +clear +# Η συντόμευση Ctrl-L δουλεύει επίσης όσον αφορά το «καθάρισμα» + +# Ας διαβάσουμε μια αξία από κάποια είσοδο: +echo "Πώς σε λένε;" +read Onoma # Προσέξτε πως δεν χρειάστηκε να ορίσουμε μια νέα μεταβλητή +echo Καλημέρα, $Onoma! + +# Η δομή των if statements έχει ως εξής: +# (μπορείτε να εκτελέσετε την εντολή `man test` για περισσότερες πληροφορίες +# σχετικά με τα conditionals) +if [ $Onoma != $USER ] +then + echo "Το όνομά σου δεν είναι το όνομα χρήστη σου" +else + echo "Το όνομά σου είναι το όνομα χρήστη σου" +fi +# Η συνθήκη είναι αληθής αν η τιμή του $Onoma δεν είναι ίδια με το τρέχον +# όνομα χρήστη στον υπολογιστή + +# ΣΗΜΕΙΩΣΗ: Αν το $Onoma είναι άδειο, η Bash βλέπει την συνθήκη ως: +if [ != $USER ] +# το οποίο αποτελεί συντακτικό λάθος +# οπότε ο «ασφαλής» τρόπος να χρησιμοποιούμε εν δυνάμει άδειες μεταβλητές στην +# Bash είναι ο εξής: +if [ "$Onoma" != $USER ] ... +# ο οποίος, όταν το $Onoma είναι άδειο, θα ερμηνευθεί από την Bash ως: +if [ "" != $USER ] ... +# το οποίο και δουλεύει όπως θα περιμέναμε. + +# Υπάρχει επίσης η εκτέλεση εντολών βάσει συνθηκών +echo "Εκτελείται πάντα" || echo "Εκτελείται μόνο αν η πρώτη εντολή αποτύχει" +# => Εκτελείται πάντα +echo "Εκτελείται πάντα" && echo "Εκτελείται μόνο αν η πρώτη εντολή ΔΕΝ αποτύχει" +# => Εκτελείται πάντα +# => Εκτελείται μόνο αν η πρώτη εντολή ΔΕΝ αποτύχει + + +# Για να χρησιμοποιήσουμε τους τελεστές && και || με τα if statements, +# χρειαζόμαστε πολλαπλά ζευγάρια αγκύλων: +if [ "$Onoma" == "Σταύρος" ] && [ "$Ilikia" -eq 15 ] +then + echo "Αυτό θα εκτελεστεί αν το όνομα ($Onoma) είναι Σταύρος ΚΑΙ η ηλικία ($Ilikia) είναι 15." +fi + +if [ "$Onoma" == "Δανάη" ] || [ "$Onoma" == "Ζαχαρίας" ] +then + echo "Αυτό θα εκτελεστεί αν το όνομα ($Onoma) είναι Δανάη Ή Ζαχαρίας." +fi + +# Υπάρχει επίσης ο τελεστής `=~`, που εκτελεί ένα regex πάνω σε ένα +# αλφαριθμητικό: +Email=me@example.com +if [[ "$Email" =~ [a-z]+@[a-z]{2,}\.(com|net|org) ]] +then + echo "Η διεύθυνση email είναι σωστά διατυπωμένη!" +fi +# Να σημειωθεί πως ο τελεστής `=~` δουλεύει μόνο με διπλές αγκύλες [[ ]], +# που είναι ωστόσο διαφορετικές από τις μονές [ ]. +# Δείτε το http://www.gnu.org/software/bash/manual/bashref.html#Conditional-Constructs +# για περισσότερες πληροφορίες σχετικά με αυτό. + +# Επαναπροσδιορισμός της εντολής `ping` ως alias (ψευδώνυμο) για την αποστολή 5 +# πακέτων +alias ping='ping -c 5' +# Ακύρωση του alias και χρήση της εντολής όπως είναι κανονικά ορισμένη +\ping 192.168.1.1 +# Εκτύπωση όλων των aliases +alias -p + +# Οι μαθηματικές εκφράσεις ορίζονται ως εξής: +echo $(( 10 + 5 )) # => 15 + +# Αντίθετα με άλλες γλώσσες προγραμματισμού, η Bash είναι επίσης ένα shell, άρα +# δουλεύει στο πλαίσιο ενός «τρέχοντος καταλόγου». Μπορούμε να δούμε μια λίστα +# αρχείων και καταλόγων στον τρέχων κατάλογο με την εντολή ls: +ls # Τυπώνει μια λίστα των αρχείων και υποκαταλόγων που περιέχονται στον τρέχων + # κατάλογο + +# Αυτή η εντολή έχει επιλογές που ελέγχουν την εκτέλεσή της: +ls -l # Τυπώνει κάθε αρχείο και κατάλογο σε διαφορετική γραμμή +ls -t # Ταξινομεί τα περιεχόμενα του καταλόγου με βάσει την ημερομηνία + # τελευταίας τροποποίησης (σε φθίνουσα σειρά) +ls -R # Εκτελεί την εντολή `ls` αναδρομικά στον τρέχων κατάλογο και σε όλους + # τους υποκαταλόγους του. + +# Τα αποτελέσματα μιας εντολής μπορούν να μεταβιβαστούν σε μιαν άλλη. +# Η εντολή `grep` φιλτράρει τα δεδομένα που δέχεται βάσει μοτίβων. +# Έτσι, μπορούμε να τυπώσουμε μια λίστα αρχείων κειμένου (.txt) στον τρέχων +# κατάλογο: +ls -l | grep "\.txt" + +# Μπορούμε να χρησιμοποιήσουμε την εντολή `cat` για να τυπώσουμε το περιεχόμενο +# ενός ή περισσότερων αρχείων στην προεπιλεγμένη έξοδο (stdout): +cat file.txt + +# Μπορούμε επίσης να διαβάσουμε το αρχείο μέσω της `cat`: +Periexomena=$(cat file.txt) +echo "ΑΡΧΗ ΤΟΥ ΑΡΧΕΙΟΥ\n$Periexomena\nΤΕΛΟΣ ΤΟΥ ΑΡΧΕΙΟΥ" # Ο χαρακτήρας "\n" + # δημιουργεί μια νέα + # γραμμή +# => ΑΡΧΗ ΤΟΥ ΑΡΧΕΙΟΥ +# => [περιεχόμενα του αρχείου file.txt] +# => ΤΕΛΟΣ ΤΟΥ ΑΡΧΕΙΟΥ + +# Μπορούμε να χρησιμοποιήσουμε την εντολή `cp` για να αντιγράψουμε αρχεία ή +# καταλόγους από ένα σημείο σε ένα άλλο. +# Η εντολή `cp` δημιουργεί ΝΕΕΣ εκδοχές των πρωτοτύπων, το οποίο σημαίνει ότι +# μια τροποποίηση του αντιγράφου δεν θα επηρεάσει το πρωτότυπο (και +# αντιστρόφως). +# Να σημειωθεί πως αν υπάρχει ήδη αρχείο ή κατάλογος με το ίδιο όνομα στην ίδια +# θέση με το αντίγραφο, το αντίγραφο θα αντικαταστήσει το αρχείο/κατάλογο και +# άρα τα δεδομένα του θα χαθούν. +cp prototipo.txt antigrafo.txt +cp -r prototipo/ antigrafo/ # Αναδρομική αντιγραφή (αντιγραφή όλων των + # περιεχομένων του καταλόγου prototipo/) + +# Ενημερωθείτε σχετικά με τις εντολές `scp` και `sftp` αν σχεδιάζετε να +# αντιγράψετε αρχεία από έναν υπολογιστή σε έναν άλλο. +# Η εντολή `scp` μοιάζει πολύ με την `cp`, ενώ η `sftp` είναι πιο διαδραστική. + +# Μπορούμε να χρησιμοποιήσουμε την εντολή `mv` για να μετακινήσουμε αρχεία ή +# καταλόγους από μια θέση σε μια άλλη. +# Η εντολή `mv` μοιάζει με την `cp`, με τη διαφορά ότι διαγράφει το πρωτότυπο. +# Η `mv` χρησιμοποιείται επίσης για τη μετονομασία αρχείων! +mv prototipo.txt prototipo2.txt + +# Δεδομένου του ότι η Bash δουλεύει στο πλαίσιο του τρέχοντος καταλόγου, +# μπορεί να θελήσουμε να τρέξουμε κάποια εντολή σε κάποιον άλλο κατάλογο. +# Η εντολή `cd` (Change Directory) μας επιτρέπει να αλλάξουμε θέση μέσα στο +# σύστημα αρχείων: +cd ~ # Μετατόπιση στον κατάλογο «home» +cd # Αυτή η εντολή μας μετατοπίζει επίσης στον κατάλογο «home» +cd .. # Μετατόπιση προς τα πάνω κατά έναν κατάλογο + # (για παράδειγμα, μετατόπιση από τη θέση /home/username/Downloads + # στη θέση /home/username) +cd /home/username/Documents # Μετατόπιση προς έναν συγκεκριμένο κατάλογο +cd ~/Documents/.. # Μετατόπιση προς τον κατάλογο «home»... σωστά; +cd - # Μετατόπιση προς τον προηγούμενο κατάλογο +# => /home/username/Documents + +# Μπορούμε να χρησιμοποιήσουμε subshells για να δουλέψουμε σε πολλούς +# διαφορετικούς καταλόγους: +(echo "Πρώτα, είμαι εδώ: $PWD") && (cd kapoiosKatalogos; echo "Έπειτα, είμαι εδώ: $PWD") +pwd # Εδώ θα είμαστε στον πρώτο κατάλογο + +# Μπορούμε να χρησιμοποιήσουμε την εντολή `mkdir` για να δημιουργήσουμε νέους +# καταλόγους. +mkdir neosKatalogos +# Η επιλογή `-p` επιτρέπει σε ενδιάμεσους καταλόγους να δημιουργηθούν αν +# χρειάζεται. +mkdir -p neosKatalogos/me/epipleon/katalogous +# Αν οι ενδιάμεσοι κατάλογοι δεν υπήρχαν ήδη, η παραπάνω εντολή χωρίς την +# επιλογή `-p` θα είχε επιστρέψει κάποιο λάθος. + +# Μπορούμε να διευθύνουμε τις εισόδους και εξόδους των εντολών (χρησιμοποιώντας +# τα κανάλια stdin, stdout και stderr). +# Για παράδειγμα, μπορούμε να «διαβάσουμε» από το stdin μέχρι να βρεθεί ένα +# ^EOF$ (End Of File) και να αντικαταστήσουμε το περιεχόμενο του αρχείου +# hello.py με τις γραμμές που διαβάσαμε έως και πριν το "EOF": +cat > hello.py << EOF +#!/usr/bin/env python +from __future__ import print_function +import sys +print("#stdout", file=sys.stdout) +print("#stderr", file=sys.stderr) +for line in sys.stdin: + print(line, file=sys.stdout) +EOF + +# Μπορούμε να τρέξουμε το πρόγραμμα Python «hello.py» με διάφορες +# ανακατευθύνσεις χρησιμοποιώντας τα stdin, stdout και stderr: +python hello.py < "eisodos.in" # Περνάμε το eisodos.in ως είσοδο στο πρόγραμμα + +python hello.py > "eksodos.out" # Ανακατευθύνουμε την έξοδο του προγράμματος + # προς το αρχείο eksodos.out + +python hello.py 2> "lathos.err" # ανακατευθύνουμε την έξοδο λάθους (stderr) + # προς το αρχείο lathos.err + +python hello.py > "eksodos-kai-lathos.log" 2>&1 +# Ανακατευθύνουμε την κανονική έξοδο (stdout) και την έξοδο λάθους (stderr) +# προς το αρχείο eksodos-kai-lathos.log + +python hello.py > /dev/null 2>&1 +# Ανακατευθύνουμε όλες τις εξόδους προς τη «μαύρη τρύπα» που λέγεται /dev/null, +# δηλαδή τίποτα δεν θα τυπωθεί στον τερματικό + +# Αν θέλετε να προσθέσετε την έξοδο σε κάποιο αρχείο αντί να διαγράψετε τα +# περιεχόμενά του με τη νέα έξοδο, μπορείτε να χρησιμοποιήσετε τον τελεστή +# `>>` αντί στη θέση του `>`: +python hello.py >> "eksodos.out" 2>> "lathos.err" + +# Αντικατάσταση του αρχείου eksodos.out, προσθήκη στο αρχείο lathos.err, και +# καταμέτρηση των γραμμών τους: +info bash 'Basic Shell Features' 'Redirections' > eksodos.out 2>> lathos.err +wc -l eksodos.out lathos.err + +# Μπορούμε να εκτελέσουμε μια εντολή και να τυπώσουμε τον file descriptor της +# (https://en.wikipedia.org/wiki/File_descriptor) +# Για παράδειγμα: /dev/fd/123 +# Δείτε επίσης: man fd +echo <(echo "#καλημέρακόσμε") + +# Αντικατάσταση του περιεχομένου του αρχείου eksodos.out με το αλφαριθμητικό +# «#καλημέρακόσμε»: +cat > eksodos.out <(echo "#καλημέρακόσμε") +echo "#καλημέρακόσμε" > eksodos.out +echo "#καλημέρακόσμε" | cat > eksodos.out +echo "#καλημέρακόσμε" | tee eksodos.out >/dev/null + +# Εκκαθάριση προσωρινών αρχείων με την επιλογή `-v` (verbose) (προσθέστε την +# επιλογή `-i` για περισσότερη διάδραση) +# ΠΡΟΣΟΧΗ: τα αποτελέσματα της εντολής `rm` είναι μόνιμα. +rm -v eksodos.out lathos.err eksodos-kai-lathos.log +rm -r tempDir/ # Αναδρομική διαγραφή + +# Οι εντολές μπορούν να αντικατασταθούν μέσα σε άλλες εντολές χρησιμοποιώντας +# το μοτίβο $( ). +# Το παράδειγμα που ακολουθεί τυπώνει τον αριθμό των αρχείων και των καταλόγων +# στον τρέχων κατάλογο. +echo "Υπάρχουν $(ls | wc -l) αντικείμενα εδώ." + +# Μπορούμε να επιτύχουμε το ίδιο αποτέλεσμα με τους χαρακτήρες ``, αλλά δεν +# μπορούμε να τους χρησιμοποιήσουμε αναδρομικά (δηλαδή `` μέσα σε ``). +# Ο προτεινόμενος τρόπος από την Bash είναι το μοτίβο $( ). +echo "Υπάρχουν `ls | wc -l` αντικείμενα εδώ." + +# Η Bash έχει επίσης τη δομή `case` που δουλεύει παρόμοια με τη δομή switch +# όπως στην Java ή την C++ για παράδειγμα: +case "$Metavliti" in + # Λίστα μοτίβων για τις συνθήκες που θέλετε να ορίσετε: + 0) echo "Η μεταβλητή έχει ένα μηδενικό.";; + 1) echo "Η μεταβλητή έχει έναν άσσο.";; + *) echo "Η μεταβλητή δεν είναι αόριστη (null).";; +esac + +# Οι βρόγχοι `for` εκτελούνται τόσες φορές όσο είναι το πλήθος των παραμέτρων +# που τους δίνονται: +# Το περιεχόμενο της μεταβλητής $Metavliti τυπώνεται τρεις φορές. +for Metavliti in {1..3} +do + echo "$Metavliti" +done +# => 1 +# => 2 +# => 3 + +# Μπορούμε επίσης να το γράψουμε πιο «παραδοσιακά»: +for ((a=1; a <= 3; a++)) +do + echo $a +done +# => 1 +# => 2 +# => 3 + +# Μπορούμε επίσης να περάσουμε αρχεία ως παραμέτρους. +# Το παράδειγμα που ακολουθεί θα τρέξει την εντολή `cat` με τα αρχεία file1 +# και file2: +for Metavliti in file1 file2 +do + cat "$Metavliti" +done + +# Μπορούμε ακόμα να χρησιμοποιήσουμε την έξοδο μας εντολής. +# Το παράδειγμα που ακολουθεί θα τρέξει την εντολή `cat` με την έξοδο της +# εντολής `ls`. +for Output in $(ls) +do + cat "$Output" +done + +# Ο βρόγχος `while` έχει ως εξής: +while [ true ] +do + echo "το «σώμα» του βρόγχου μπαίνει εδώ..." + break +done +# => το «σώμα» του βρόγχου μπαίνει εδώ... + +# Μπορούμε επίσης να ορίσουμε συναρτήσεις, ως εξής: +function synartisi () +{ + echo "Οι παράμετροι συναρτήσεων δουλεύουν όπως αυτές των προγραμμάτων: $@" + echo "Και: $1 $2..." + echo "Αυτή είναι μια συνάρτηση" + return 0 +} +# Ας καλέσουμε την συνάρτηση `synartisi` με δύο παραμέτρους, param1 και param2 +synartisi param1 param2 +# => Οι παράμετροι συναρτήσεων δουλεύουν όπως αυτές των προγραμμάτων: param1 param2 +# => Και: param1 param2... +# => Αυτή είναι μια συνάρτηση + +# Ή επίσης: +synartisi2 () +{ + echo "Ένας άλλος τρόπος να ορίσουμε συναρτήσεις!" + return 0 +} +# Ας καλέσουμε την συνάρτηση `synartisi2` χωρίς παραμέτρους: +synartisi2 # => Ένας άλλος τρόπος να ορίσουμε συναρτήσεις! + +# Ας καλέσουμε την πρώτη συνάρτηση: +synartisi "Το όνομά μου είναι" $Onoma + +# Υπάρχουν πολλές χρήσιμες εντολές που μπορείτε να μάθετε. +# Για παράδειγμα, αυτή που ακολουθεί τυπώνει τις 10 τελευταίες γραμμές του +# αρχείου file.txt: +tail -n 10 file.txt + +# Ενώ αυτή τυπώνει τις 10 πρώτες: +head -n 10 file.txt + +# Αυτή ταξινομεί τις γραμμές: +sort file.txt + +# Αυτή αναφέρει ή παραλείπει τις γραμμές που επαναλαμβάνονται (η επιλογή +# -d τις αναφέρει): +uniq -d file.txt + +# Αυτή τυπώνει μόνο ό,τι βρίσκεται πριν τον πρώτο χαρακτήρα «,» σε κάθε γραμμή: +cut -d ',' -f 1 file.txt + +# Αυτή αντικαθιστά κάθε εμφάνιση της λέξης «οκ» με τη λέξη «τέλεια» στο αρχείο +# file.txt (δέχεται επίσης μοτίβα regex): +sed -i 's/οκ/τέλεια/g' file.txt + +# Αυτή τυπώνει στο stdout όλες τις γραμμές που είναι συμβατές με κάποιο +# συγκεκριμένο μοτίβο regex. +# Για παράδειγμα, όλες τις γραμμές που ξεκινούν με «καλημέρα» και τελειώνουν με +# «καληνύχτα»: +grep "^καλημέρα.*καληνύχτα$" file.txt + +# Η επιλογή `-c` θα τυπώσει τον αριθμό των γραμμών που περιέχουν το μοτίβο: +grep -c "^καλημέρα.*καληνύχτα$" file.txt + +# Άλλες χρήσιμες επιλογές: +grep -r "^καλημέρα.*καληνύχτα$" someDir/ # Αναδρομική εκτέλεση μέσα σε κάποιο κατάλογο +grep -n "^καλημέρα.*καληνύχτα$" file.txt # Τυπώνει επίσης τον αριθμό των γραμμών +grep -rI "^καλημέρα.*καληνύχτα$" someDir/ # Αναδρομική εκτέλεση αγνοώντας τα αρχεία binary + +# Η ίδια εντολή, αλλά τώρα αγνοώντας τις γραμμές που περιέχουν «αντίο» +grep "^καλημέρα.*καληνύχτα$" file.txt | grep -v "αντίο" + +# Αν θέλετε να ψάξετε κυριολεκτικά για ένα αλφαριθμητικό, και όχι για κάποιο +# μοτίβο, μπορείτε να χρησιμοποιήσετε την εντολή `fgrep` (ή `grep -F`): +fgrep "καλημέρα" file.txt + +# Η εντολή `trap` επιτρέπει την εκτέλεση μιας εντολής μόλις το πρόγραμμά μας +# λάβει κάποιο σήμα. Στο παράδειγμα που ακολουθεί, η εντολή `trap` θα +# εκτελέσει την εντολή `rm` αν λάβει κάποιο από τα τρία σήματα που ακολουθούν +# (SIGHUP, SIGINT, SIGTERM): +trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM + +# Η εντολή `sudo` (SuperUser Do) χρησιμοποιείται για να εκτελέσουμε εντολές +# με προνόμια υπερχρήστη (superuser): +ONOMA1=$(whoami) +ONOMA2=$(sudo whoami) +echo "Ήμουν ο $ONOMA1, και έπειτα έγινα ο πιο ισχυρός $ONOMA2" + +# Διαβάστε την ενσωματωμένη documentation της Bash χρησιμοποιώντας την εντολή +# `help`: +help +help help +help for +help return +help source +help . + +# Διαβάστε τα manpages με την εντολή `man`: +apropos bash +man 1 bash +man bash + +# Διαβάστε επίσης την info documentation με την εντολή `info`: +apropos info | grep '^info.*(' +man info +info info +info 5 info +info bash +info bash 'Bash Features' +info bash 6 +info --apropos bash +``` diff --git a/mercurial.html.markdown b/mercurial.html.markdown index 330beb35..98658f83 100644 --- a/mercurial.html.markdown +++ b/mercurial.html.markdown @@ -350,6 +350,6 @@ $ hg remove *.txt ## Further information -* [Learning Mercurial in Workflows](https://www.mercurial-scm.org/guid) +* [Learning Mercurial in Workflows](https://www.mercurial-scm.org/guide) * [Mercurial Quick Start](https://www.mercurial-scm.org/wiki/QuickStart) -* [Mercurial: The Definitive Guide by Bryan O'Sullivan](http://hgbook.red-bean.com/)
\ No newline at end of file +* [Mercurial: The Definitive Guide by Bryan O'Sullivan](http://hgbook.red-bean.com/) diff --git a/perl6.html.markdown b/perl6.html.markdown index 6b0df0d4..1304869b 100644 --- a/perl6.html.markdown +++ b/perl6.html.markdown @@ -885,7 +885,7 @@ say_dyn(); #=> 1 100 We changed the value of $*dyn_scoped_2 in class Human { has Str $.name; # `$.name` is immutable but with an accessor method. - has Str $.bcountry; # Use `$!bplace` to modify it inside the class. + has Str $.bcountry; # Use `$!bcountry` to modify it inside the class. has Str $.ccountry is rw; # This attribute can be modified from outside. has Int $!age = 0; # A private attribute with default value. @@ -911,12 +911,12 @@ class Human { } }; -## Create a new instance of Human class with $.attrib set to 5. +## Create a new instance of Human class. ## Note: you can't set private-attribute from here (more later on). my $person1 = Human.new( name => "Jord", - bcountry = "Iceland", - ccountry => "Iceland" + bcountry = "Togo", + ccountry => "Togo" ); say $person1.name; #=> Jord diff --git a/python3.html.markdown b/python3.html.markdown index ecdbd932..ef78ce37 100644 --- a/python3.html.markdown +++ b/python3.html.markdown @@ -462,8 +462,19 @@ prints: """ for i in range(4, 8, 2): print(i) + +""" +To loop over a list, and retrieve both the index and the value of each item in the list +prints: + 0 dog + 1 cat + 2 mouse """ +list = ["dog", "cat", "mouse"] +for i, value in enumerate(list): + print(i, value) +""" While loops go until a condition is no longer met. prints: 0 diff --git a/reason.html.markdown b/reason.html.markdown index 45633cf5..62d809cf 100644 --- a/reason.html.markdown +++ b/reason.html.markdown @@ -2,13 +2,13 @@ language: reason filename: reason.re contributors: - - ["Seth Corker", "https://sethcorker.com"] + - ["Seth Corker", "https://sethcorker.com"] --- Reason is a syntax over OCaml that is easier to get started for programmers who are familiar with C-style syntax like JavaScript. BuckleScript is part of the toolchain which compiles Reason to JavaScript so you can write statically typed code for anywhere that JavaScript runs. ```javascript -/* Comments start with slash-star, and end with slash-star */ +/* Comments start with slash-star, and end with star-slash */ /*---------------------------------------------- * Variable and function declaration @@ -18,7 +18,7 @@ Reason is a syntax over OCaml that is easier to get started for programmers who */ let x = 5; -/* - Notice we didn't add a type, Reason will infer it's an int */ +/* - Notice we didn't add a type, Reason will infer x is an int */ /* A function like this, take two arguments and add them together */ let add = (a, b) => a + b; @@ -27,7 +27,7 @@ let add = (a, b) => a + b; /*---------------------------------------------- * Type annotation *---------------------------------------------- - * Types don't need tp be explicitly annotated in most cases but when you need + * Types don't need to be explicitly annotated in most cases but when you need * to, you can add the type after the name */ @@ -85,7 +85,7 @@ let lastLetter = 'z'; /* > Boolean */ -/* A boolean be either true or false */ +/* A boolean can be either true or false */ let isLearning = true; true && false; /* - : bool = false; Logical and */ @@ -445,11 +445,11 @@ switch (driveToTown(evan)) { }; /* Alternatively, a try block can be used */ +/* - With Reason exceptions can be avoided with optionals and are seldom used */ let messageToEvan = try (driveToTown(evan)) { | Under_Age => evan.firstName ++ " is too young to drive!" }; -/* - With Reason exceptions can be avoided with optionals and are seldom used */ /*---------------------------------------------- * Object @@ -488,7 +488,7 @@ house#temperature; /* - : float = 22. */ /*---------------------------------------------- * Module *---------------------------------------------- - * Modules are used to organize your code and provide namespacing, + * Modules are used to organize your code and provide namespacing. * Each file is a module by default */ @@ -537,6 +537,7 @@ module SpecializedStaff = { ``` ## Further Reading + - [Official Reason Docs](https://reasonml.github.io/docs/en/what-and-why) - [Official BuckleScript Docs](https://bucklescript.github.io/docs/en/what-why) - [Try Reason](https://reasonml.github.io/en/try) diff --git a/solidity.html.markdown b/solidity.html.markdown index d215180d..cc719ec7 100644 --- a/solidity.html.markdown +++ b/solidity.html.markdown @@ -483,7 +483,7 @@ for(uint x = 0; x < refundAddressList.length; x++) { // A. Calling external contract contract InfoFeed { - function info() returns (uint ret) { return 42; } + function info() payable returns (uint ret) { return 42; } } contract Consumer { diff --git a/th-th/typescript.th.html.markdown b/th-th/typescript.th.html.markdown new file mode 100644 index 00000000..fc2a823b --- /dev/null +++ b/th-th/typescript.th.html.markdown @@ -0,0 +1,259 @@ +--- +language: TypeScript +contributors: + - ["Philippe Vlérick", "https://github.com/pvlerick"] + - ["Worajedt Sitthidumrong", "https://bitbucket.org/wrj"] +filename: learntypescript-th.ts +lang: th-th +--- + +TypeScript เป็นภาษาที่มีเป้าหมายเพื่อทำให้การพัฒนาซอฟต์แวร์ขนาดใหญ่ด้วย JavaScript ทำได้ง่ายขึ้น โดยที่ TypeScript ได้เพิ่มแนวคิดที่พบทั่วไป อาทิ classes, modules, interfaces, generics และ static typing (ไม่บังคับ) เข้าไปในภาษา JavaScript ดังนั้น TypeScript ก็เลยเป็น Super Set ของ JavaScript อีกที โค้ด JavaScript ทุกส่วน ก็คือโค้ดที่ทำงานได้ถูกต้องใน TypeScript ทำให้เราเพิ่ม TypeScript เข้าไปใช้ในโปรเจคการพัฒนาของเราได้ไม่ยากเลย เพราะ TypeScript คอมไพล์ผลลัพธ์ออกมาเป็น JavaScript ในท้ายสุดอยู่ดี + +บทความนี้จะเน้นเฉพาะ syntax ส่วนขยายของ TypeScript ซึ่งจะไม่รวมกับที่มีใน [JavaScript](/docs/javascript) + +การทดสอบเขียน TypeScript เริ่มได้ง่าย ๆ โดยเข้าไปที่ +[Playground](http://www.typescriptlang.org/Playground) ซึ่งคุณจะเขียนโค้ดพร้อม autocomplete และเห็นเลยว่ามันจะแปลงมาเป็นผลลัพธ์แบบ JavaScript อย่างไร + +```ts +// TypeScript มี data type พื้นฐาน 3 แบบ +let isDone: boolean = false; +let lines: number = 42; +let name: string = "Anders"; + +// แต่เราก็สามารถละการบอกชนิดได้ โดยชนิดตัวแปรก็จะปรับชนิดของเขาจากข้อมูลที่กำหนดให้โดยตรง +let isDone = false; +let lines = 42; +let name = "Anders"; + +// ถ้าไม่รู้ ก็กำหนดเป็นชนิด "Any" ได้ +let notSure: any = 4; +notSure = "maybe a string instead"; +notSure = false; // โอเค ตอนนี้เป็น Boolean แน่ ๆ + +// ใช้ const สำหรับสร้าง ค่าคงที่ +const numLivesForCat = 9; +numLivesForCat = 1; // Error + +// สำหรับ collections มี typed arrays และ generic arrays +// ก็คือ อะเรย์บอกชนิด และ อะเรย์เจเนอริก ตามลำดับ +let list: number[] = [1, 2, 3]; +// ในอีกทางหนึ่ง สร้างเป็นอะเรย์ชนิด generic array +let list: Array<number> = [1, 2, 3]; + +// และสำหรับ enumerations: +enum Color { Red, Green, Blue }; +let c: Color = Color.Green; + +// สุดท้าย, "void" ใช้เมื่อเป็นกรณีพิเศษที่ฟังก์ชันไม่ส่งค่ากลับ +function bigHorribleAlert(): void { + alert("I'm a little annoying box!"); +} + +// ฟังก์ชั่น (Functions) เป็นสิ่งที่มีความสำคัญมาเป็นอันดับหนึ่ง รองรับการใช้ "fat arrow" ในการสร้าง lambda function และ type inference + +// สไตล์ต่อไปนี้มีค่าเท่ากันกับบรรทัดที่ยกตัวอย่างด้านล่าง เพราะคอมไพเลอร์จะมองเหมือนกัน และได้ JavaScript แบบเดียวกัน +let f1 = function (i: number): number { return i * i; } +// อนุมานชนิดที่ส่งกลับ หรือ type inferred +let f2 = function (i: number) { return i * i; } +// เขียนแบบ "Fat arrow" แต่บอกชนิดส่งกลับ +let f3 = (i: number): number => { return i * i; } +// เขียนแบบ "Fat arrow" แต่อนุมานชนิดส่งกลับ +let f4 = (i: number) => { return i * i; } +// เขียนแบบ "Fat arrow" อนุมานชนิดส่งกลับ พร้อมกับไม่มีวงเล็บ แปลว่าไม่ต้องมี return keyword ด้วย +let f5 = (i: number) => i * i; + +// Interfaces นั้นเป็นเหมือนเราออกแบบโครงสร้าง คุณสมบัติต่าง ๆ ตอนเอาไปใช้ จะต้องเป็นไปตาม interface นั้น ๆ เหมือนกับเป็นการกำหนดสเป็คของ "ชนิดข้อมูล" +interface Person { + name: string; + // Optional properties กำหนดด้วย "?" + age?: number; + // และมี function พร้อมชนิดได้ใน interface + move(): void; +} + +// Object นี้ implements "Person" interface ทำให้มันเป็นชนิด Person และมันก็มี property name และ function move() +let p: Person = { name: "Bobby", move: () => { } }; +// Objects นี้เป็นชนิด Person ด้วย และมี optional property หรือ age?: นั่นเอง +let validPerson: Person = { name: "Bobby", age: 42, move: () => { } }; +// ไม่ใช่ Person เพราะ age: ต้องเป็น number เท่านั้น ตามข้อกำหนดใน interface Person +let invalidPerson: Person = { name: "Bobby", age: true }; + +// Interfaces ยังนำมาใช้ในลักษณะของ function ได้อีกด้วย +interface SearchFunc { + (source: string, subString: string): boolean; +} +// เฉพาะชนิด parameters เท่านั้นที่สำคัญ ชื่อของมันไม่จำเป็นต้องเหมือน +let mySearch: SearchFunc; +mySearch = function (src: string, sub: string) { + return src.search(sub) != -1; +} + +// สมาชิกใน class จะเข้าถึงได้แบบ public เป็นค่าปริยาย +class Point { + // Properties + // ตั้งค่า Properties ของ class นี้ + x: number; + + // Constructor + // เราใส่ public/private keywords ตรงนี้ได้ มีผลเหมือนกันกับกำหนด x ด้านบน + // ในตัวอย่าง y มีการกำหนดเช่นเดียวกับ x แต่พิมพ์สั้นกว่า + // สังเกตว่า มีการกำหนดค่าปริยายให้ parameters ได้ด้วย + + constructor(x: number, public y: number = 0) { + this.x = x; + } + + // Functions + dist() { return Math.sqrt(this.x*this.x + this.y*this.y); } + + // Static members + static origin = new Point(0, 0); +} + +// Classes สามารถระบุชนิด interface ที่ต้องการได้ตรง ๆ ด้วยเช่นโค้ดด้านล่าง +// แต่อะไรที่จะ implement มานั้น ถ้าไม่ได้กำหนดไว้ใน constructor ก็จะเกิดข้อผิดพลาดตอนคอมไพล์ +class PointPerson implements Person { + name: string // ตรงนี้จะผิด แก้ไขโดยการไปสร้างตัวรับค่าเข้ามาผ่านทาง constructor + move() {} +} + +let p1 = new Point(10, 20); +let p2 = new Point(25); //y เป็น 0 เพราะกำหนดค่าปริยายไว้ให้แล้ว + +// Inheritance การสืบทอดคุณสมบัติ +class Point3D extends Point { + constructor(x: number, y: number, public z: number = 0) { + super(x, y); // เราจะต้องเรียกใช้ super class constructor โดยตรง + } + + // Overwrite ฟังก์ชั่นที่มีอยู่เดิมใน Point + dist() { + let d = super.dist(); + return Math.sqrt(d * d + this.z * this.z); + } +} + +// Modules ใช้เป็นกลุ่มของ class เราใช้ "." เป็นตัวแบ่ง sub modules +// อย่างกรณีนี้จะเป็น Module.Class เช่น Geometry.Square +module Geometry { + export class Square { + constructor(public sideLength: number = 0) { + } + area() { + return Math.pow(this.sideLength, 2); + } + } +} + +let s1 = new Geometry.Square(5); + +// เราทำให้เรียกใช้ง่ายขึ้นโดยการใช้ alias มาอ้างชื่อ module แบบเดียวกับบางภาษา เช่น Python +import G = Geometry; + +let s2 = new G.Square(10); + +// Generics +// Classes +class Tuple<T1, T2> { + constructor(public item1: T1, public item2: T2) { + } +} + +// Interfaces +interface Pair<T> { + item1: T; + item2: T; +} + +// และ functions +let pairToTuple = function <T>(p: Pair<T>) { + return new Tuple(p.item1, p.item2); +}; + +let tuple = pairToTuple({ item1: "hello", item2: "world" }); + +// เราเรียกใช้ไฟล์ definition แบบนี้: +/// <reference path="jquery.d.ts" /> + +// Template Strings ( คือ strings ที่ใช้ backticks ครอบ — "`" ปุ่มบนซ้ายคีย์บอร์ด ) +// แทรกข้อความใน String ด้วย Template Strings +let name = 'Tyrone'; +let greeting = `Hi ${name}, how are you?` +// Strings หลายบรรทัดก็ทำได้ใน Template Strings +let multiline = `This is an example +of a multiline string`; + +// READONLY: ความสามารถใหม่ใน TypeScript 3.1 +interface Person { + readonly name: string; + readonly age: number; +} + +var p1: Person = { name: "Tyrone", age: 42 }; +p1.age = 25; // Error แน่นอน เพราะ p1.x ถูกกำหนดเป็น read-only + +var p2 = { name: "John", age: 60 }; // สังเกตว่า p2 ไม่ได้กำหนดเป็น Person +var p3: Person = p2; // ทำได้ เป็น read-only alias ของ p2 และกำหนดเป็น Person +p3.x = 35; // Error p3.x ก็เป็น read-only +p2.x = 45; // Ok ทำได้แต่ก็จะเปลี่ยนค่า p3.x ด้วย เพราะ p3 เป็น alias ของ p2 + +class Car { + readonly make: string; + readonly model: string; + readonly year = 2018; + + constructor() { + this.make = "Unknown Make"; // อนุญาตให้กำหนดค่าได้ใน constructor แม้ว่าจะ read-only + this.model = "Unknown Model"; // อนุญาตให้กำหนดค่าได้ใน constructor แม้ว่าจะ read-only + } +} + +let numbers: Array<number> = [0, 1, 2, 3, 4]; +let moreNumbers: ReadonlyArray<number> = numbers; +moreNumbers[5] = 5; // Error, สมาชิกอะเรย์เป็น read-only แปลว่า ห้ามแก้ไข +moreNumbers.push(5); // Error, push method ใช้ไม่ได้ เพราะมันจะไปแก้ไข read-only array +moreNumbers.length = 3; // Error, เพราะ length ก็ต้อง read-only +numbers = moreNumbers; // Error, method ที่ทำให้อะเรย์เปลี่ยนได้จะไม่อนุญาต + +// Tagged Union Types สำหรับโมเดลสเตท ที่อาจจะมีได้หลายๆ สเตท +type State = + | { type: "loading" } + | { type: "success", value: number } + | { type: "error", message: string }; + +ประกาศ const state: State; +if (state.type === "success") { + console.log(state.value); +} else if (state.type === "error") { + console.error(state.message); +} + +// Iterators และ Generators + +// ประโยคแบบ for..of +// การทำซ้ำกับ ลิสต์ของค่าในออปเจ็คต์ +let arrayOfAnyType = [1, "string", false]; +for (const val of arrayOfAnyType) { + console.log(val); // 1, "string", false +} + +let list = [4, 5, 6]; +for (const i of list) { + console.log(i); // 4, 5, 6 +} + +// ประโยคแบบ for..in +// การทำซ้ำกับ ลิสต์ของคีย์ในออปเจ็คต์ +for (const i in list) { + console.log(i); // 0, 1, 2 +} + + +``` + +## อ่านเพิ่มเติมที่ + * [TypeScript Official website] (http://www.typescriptlang.org/) + * [TypeScript language specifications] (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md) + * [Anders Hejlsberg - Introducing TypeScript on Channel 9] (http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript) + * [Source Code on GitHub] (https://github.com/Microsoft/TypeScript) + * [Definitely Typed - repository for type definitions] (http://definitelytyped.org/) diff --git a/tmux.html.markdown b/tmux.html.markdown index b28a4f59..1c2c2da3 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -78,7 +78,7 @@ combinations called 'Prefix' keys. p # Change to the previous window { # Swap the current pane with the previous pane } # Swap the current pane with the next pane - ] # Enter Copy Mode to copy text or view history. + [ # Enter Copy Mode to copy text or view history. s # Select a new session for the attached client interactively |