Showing posts with label Programming. Show all posts
Showing posts with label Programming. Show all posts

Sep 6, 2023

Review@amazon: Microsoft Power Platform Enterprise Architecture

 This weekend i read the book "Microsoft Power Platform Enterprise Architecture"

https://www.packtpub.com/product/microsoft-power-platform-enterprise-architecture/9781800204577

Packt.com says about the book:

For forward-looking architects and decision makers who want to craft complex solutions to serve growing business needs, Microsoft Power Platform Enterprise Architecture offers an array of architectural best practices and techniques. With this book, you’ll learn how to design robust software using the tools available in the Power Platform suite and be able to integrate them seamlessly with various Microsoft 365 and Azure components. Unlike most other resources that are overwhelmingly long and unstructured, this book covers essential concepts using concise yet practical examples to help you save time.[...]

This is something i fully agree with. 

For more details please read my review at amazon :).



Nov 26, 2021

Raspberry PI on Ubuntu: yarn: Cannot find module 'worker_threads'

This evening i tried to install a nodejs application with yarn on my raspberry pi. This failed with:

/usr/local/bin/yarn install
internal/modules/cjs/loader.js:638
    throw err;
    ^
Error: Cannot find module 'worker_threads'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at /opt/zwavejs2mqtt/.yarn/releases/yarn-3.1.0-rc.8.cjs:287:2642
    at Object.<anonymous> (/opt/zwavejs2mqtt/.yarn/releases/yarn-3.1.0-rc.8.cjs:585:7786)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)

This error occurs because the nodejs version which is delivered by ubuntu is version v.10.19.0.

You have to download the armv8 package from https://nodejs.org/en/download/

With version v16.13.0 the error was gone...

 

Jan 6, 2021

Review: Kafka: The Definitive Guide

Last week i read the book "Kafka: The Definitive Guide" with the subtitle "Real-Time Data and Stream Processing at Scale" which was provided by confluent.io:


The book contains 11 chapters on 288 pages - let's take look on the content:

Chapter 1 "meet Kafka" start with a motivation, why moving data is important and why you should not spend your effort not into moving but into your business. In addition an introduction to the messaging concepts like publish/subscribe, queues, messages, batches, schemas, topics, partitions, ... Many technical terms are defined there, but some are specific to Kafka and some are more general definitions. One additional info: Kafka was built by linkedin - the complete story told in the last section of this chapter.

The second chapter is about installing Kafka. Nothing special. OS, Java, Zookeeper (if clustered), Kafka.

Chapter 3 is called "Kafka producers: Writing messages to Kafka". Like the title indicates: all configuration details about sending messages are listed and explained. 

Chapter 4 is the same as the previous chapter but for reading messages. Both chapters contain many java example listings.

Chapters 5 & 6 are about clusters and reliability. Here are the nifty details explained like high water marks, message replication, timeouts, indices, ... If you want to run a high available Kafka system, you should read that and in case of failures you will know what to do.

Chapter 7 introduces Kafka Connect. Here a citation, when you should use Connect (it is not possible to summarize this):

You will use Connect to connect Kafka to datastores that you did not write and whose code you cannot or will not modify. Connect will be used to pull data from the external datastore into Kafka or push data from Kafka to an external store. For datastores where a connector already exists, Connect can be used by nondevelopers, who will only need to configure the connectors.

"Cross data cluster mirroring" is the title of chapter 8 - i do not understand why this chapter is not placed before chapter 7...

In chapter 9 and 10 administration and monitoring is explained. Very impressive is the amount of CLI examples. If you have a question: here you will find the CLI command, which provides the answer.

The last chapter "stream processing" is one of the longest chapters (>40 pages).  Here two APIs are presented to do some processing based on the messages. One example is, a stream which processes stock quotes. With stream processing it is possible to calculate the number of trades for every five-second window or the average ask price for every five-second window. Of course this chapter shows much more, but i think this gives the best impression ;-)

All in all a excellent book - even if you are not implementing Kafka ;-)



 

Dec 4, 2020

AVM Fritz.Box: how to do an automatic login and get the active WLAN devices

The AVM Fritz.Box is really a great device - but the possibilities to get monitoring data are very limited. (Please read this posting)

Which data do i want?


I want the data, which is presented in the networking tab:

If i trace the networking with the developer tools, i the the following:

To reproduce this on my command line, i have to enter this into my bash:

curl 'http://fritz.box/data.lua' 
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0'
-H 'Accept: */*'
-H 'Accept-Language: de,en;q=0.7,en-US;q=0.3' --compressed
-H 'Content-Type: application/x-www-form-urlencoded'
-H 'Origin: http://fritz.box' -H 'Connection: keep-alive'
-H 'Referer: http://fritz.box/' -H 'Pragma: no-cache'
-H 'Cache-Control: no-cache'
--data-raw 'xhr=1&sid=cb......SID&lang=de&page=netDev&xhrId=cleanup&useajax=1&no_sidrenew='

(you have to add the line breaks and the SID in the last line).

Then you will get a JSON object beginning with these lines:

{
  "pid": "netDev",
  "hide": {
    "ssoEmail": true,
    "shareUsb": true,
    "liveTv": true,
    "faxSet": true,
    "dectMoniEx": true,
    "rss": true,
    "mobile": true,
and all the other information.

The problem: How to get this SID?

If you trace the login, it is not so easy, that the password is just send to the Fritz.Box. They use PBDFK2 to encrypt the password and then send it to the Fritz.Box.

You can find some information about that here:

https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM%20Technical%20Note%20-%20Session%20ID_EN%20-%20Nov2020.pdf


Inside this document a PHP program is stated, which does the login (not really - i think it does the job years ago - but now it does a fallback to md5 authentication. I fixed this, just post a comment, if you want this pbkdf2 enabled php script). I wrote a small javascript, which i execute with node and after that i was able to log the data into my influxdb and build a show it inside grafana:


If you are interested in the configuration, the js script and the collect commands, then post me a comment...

Dec 10, 2019

Microsofts Visual Studio Code on Linux

On the last weekend i was wondering, what kind of IDE i can use for doing some small programs with javascript. My first idea was eclipse, but a friend mentioned Microsofts Visual Studio Code:
 So i opened https://code.visualstudio.com/ and got
So i downloaded the .deb and after a dpkg -i of that file i was able to run Visual Studio Code on my Linux machine:
schroff@zerberus:~$ code 
The startup was amazing fast - less a second.

Within Visual Studio Code it is very easy to install some extensions:

Running a small javascript program is very easy. I just entered these lines and without any further configuration running the program or debugging was no problem:


Jul 28, 2018

Oracle Weblogic 12c: Extracting the complete configuration via wlst.sh python script

If you want to get all information out of a weblogic server via wlst.sh than you can use the following script:
# written by Dietrich Schroff 2018
import sys


OutputFile='myfile.txt'
sys.stdout = open(OutputFile,'w')
connect('weblogic','mypasswd','t3://localhost:7001')
depth=0

def loopOverAllSubdirectories(goIntoThisDirectory,depth):
    depth=depth+1
    cd(goIntoThisDirectory)
    print depth," "*depth*2,goIntoThisDirectory
    try:
            completeInput=ls()
            inputArray=completeInput.split('\n')
        allParameters=[ x for x in inputArray if (not ("dr--" in x) or ("drw-" in x)) ]
        for Parameter in allParameters:
            if Parameter != "" :
                print depth," "*depth*2,Parameter
            allDirectoriesWrongFormat=[ x for x in inputArray if (("dr--" in x) or ("drw-" in x)) ]
            allDirectoriesWrongFormat2=[x.replace('dr--', '') for x in allDirectoriesWrongFormat]
            allDirectoriesToManyBlanks=[x.replace('drw-', '') for x in allDirectoriesWrongFormat2]
            allDirectories=[x.lstrip().rstrip() for x in allDirectoriesToManyBlanks]
        for Directory in allDirectories:
            if depth < 5 :
                loopOverAllSubdirectories(Directory,depth)
            cd('..')
    except:
        cd('..')

domainRuntime()
print "domainRuntime"
print "###############################################"
loopOverAllSubdirectories('/',0)
serverConfig()
print "ServerConfig"
print "###############################################"
loopOverAllSubdirectories('/',0)
This is a recursiv program which steps into all directories until a level of 5. On my weblogic server this scripts ran for more than two minutes:
# time ./wlst.sh myScript.py > /dev/null 

real    2m35.241s
user    0m29.405s
sys    0m4.259s
I tried unlimited depth, but then i had to stop at level 1500, because i think, that it will never stop ;-).

The output file would look like this:
domainRuntime
###############################################
1    /
1    -r--   ActivationTime                               Fri Feb 23 13:03:05 EST 2018  
1    -r--   MigrationDataRuntimes                        null  
1    -r--   Name                                         ovm_domain  
1    -rw-   Parent                                       null  
1    -r--   ServiceMigrationDataRuntimes                 null  
1    -r--   Type                                         DomainRuntime  
1    -r-x   preDeregister                                Void :   
1    -r-x   restartSystemResource                        Void : WebLogicMBean(weblogic.management.configuration.SystemResourceMBean)  
2      AppRuntimeStateRuntime
2      drw-   AppRuntimeStateRuntime
3        AppRuntimeStateRuntime
3        -r--   ApplicationIds                               java.lang.String[oracle.sdp.client#2.0@12.1.3, oracle.pwdgen#2.0@12.1.3, owasp.esapi#2.0@12.1.3, oracle.wsm.seedpolicies#2.0@12.1.3, odl.clickhistory#1.0@12.1.3, odl.clickhistory.webapp#1.0@12.1.3, oracle.jrf.system.filter, oracle.jsp.next#12.1.3@12.1.3, oracle.dconfig-infra#2.0@12.1.3, orai18n-adf#11@11.1.1.1.0, oracle.adf.dconfigbeans#1.0@12.1.3.0.0, adf.oracle.domain#1.0@12.1.3.0.0, adf.oracle.businesseditor#1.0@12.1.3.0.0, oracle.adf.management#1.0@12.1.3.0.0, adf.oracle.domain.webapp#1.0@12.1.3.0.0, jsf#2.1@2.1.7-01-, jstl#1.2@1.2.0.1, UIX#11@12.1.3.0.0, ohw-rcf#5@12.1.3.0.0, ohw-uix#5@12.1.3.0.0, oracle.adf.desktopintegration.model#1.0@12.1.3.0.0, oracle.adf.desktopintegration#1.0@12.1.3.0.0, oracle.bi.jbips#11.1.1@0.1, oracle.bi.composer#11.1.1@0.1, oracle.bi.adf.model.slib#1.0@12.1.3.0.0, oracle.bi.adf.view.slib#1.0@12.1.3.0.0, oracle.bi.adf.webcenter.slib#1.0@12.1.3.0.0, state-management-provider-memory-rar-12.1.3, wsil-wls#12.1.3.0.0, DMS Application#12.1.3.0.0, coherence-transaction-rar, ovm_core, ovm_console, ovm_help]  
3        -r--   Name                                         AppRuntimeStateRuntime  
3        -r--   Type                                         AppRuntimeStateRuntime  
3        -r-x   getCurrentState                              String : String(appid),String(moduleid),String(subModuleId),String(target)  
3        -r-x   getCurrentState                              String : String(appid),String(moduleid),String(target)  
[.....]
4          JVMRuntime
4          drw-   AdminServer
5            AdminServer
5            -r--   HeapFreeCurrent                              447991664  
5            -r--   HeapFreePercent                              90  
5            -r--   HeapSizeCurrent                              841109504  
5            -r--   HeapSizeMax                                  4151836672  
5            -r--   JavaVMVendor                                 Oracle Corporation  
5            -r--   JavaVendor                                   Oracle Corporation  
5            -r--   JavaVersion                                  1.7.0_151  
5            -r--   Name                                         AdminServer  
5            -r--   OSName                                       Linux  
5            -r--   OSVersion                                    4.1.12-94.3.9.el7uek.x86_64  
5            -r--   Type                                         JVMRuntime  
5            -r--   Uptime                                       22612965  
5            -r-x   preDeregister                                Void :   
# wc -l myfile.txt 
19787 myfile.txt
Nearly 20.000 parameters... not bad...

Mar 22, 2018

Java 10 released: java with some enhancements for running inside docker

After the release of Java 9 in october 2017 with its new features
Oracle released Java 10:
 A short summary of the new feature can be found
at https://blogs.oracle.com/java-platform-group/introducing-java-se-10
or you can take a look a the release notes:
http://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html#NewFeature

My favourites are:
  • JEP 307 Parallel Full GC for G1  Improves G1 worst-case latencies by making the full GC parallel. The G1 garbage collector is designed to avoid full collections, but when the concurrent collections can't reclaim memory fast enough a fall back full GC will occur. The old implementation of the full GC for G1 used a single threaded mark-sweep-compact algorithm. With JEP 307 the full GC has been parallelized and now use the same amount of parallel worker threads as the young and mixed collections.
and the docker enhancements:
  • JDK-8146115 Improve docker container detection and resource configuration usage
The JVM has been modified to be aware that it is running in a Docker container and will extract container specific configuration information instead of querying the operating system. The information being extracted is the number of CPUs and total memory that have been allocated to the container. The total number of CPUs available to the Java process is calculated from any specified cpu sets, cpu shares or cpu quotas. This support is only available on Linux-based platforms. This new support is enabled by default and can be disabled in the command line with the JVM option:
-XX:-UseContainerSupport
In addition, this change adds a JVM option that provides the ability to specify the number of CPUs that the JVM will use:
-XX:ActiveProcessorCount=count
This count overrides any other automatic CPU detection logic in the JVM.
  • JDK-8186248 Allow more flexibility in selecting Heap % of available RAM
Three new JVM options have been added to allow Docker container users to gain more fine grained control over the amount of system memory that will be used for the Java Heap:
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
These options replace the deprecated Fraction forms (-XX:InitialRAMFraction, -XX:MaxRAMFraction, and -XX:MinRAMFraction).
  • JDK-8179498 attach in Linux should be relative to /proc/pid/root and namespace aware
This bug fix corrects the attach mechanism when trying to attach from a host process to a Java process that is running in a Docker container.
Related posts:

Jan 27, 2018

Bash: How to trim/truncate variables / get substrings

In a comment to one of the most useless commands postings was shown how to use the rev command to get the last component of  the path out of a log file:
cat log | grep pattern | rev | cut -d '/' -f 1 | rev
If you only have one variable filled with a path, you can get the last component very easy:
schroff@zerberus:~$ myvar=/ab/cd/ef/gh

schroff@zerberus:~$ echo ${myvar##*\/}
gh
?

## removes the longest matching string for the pattern "*\/" from the beginning (the slash has to be escaped with a backslash).

schroff@zerberus:~$ echo ${myvar#*\/}
ab/cd/ef/gh
# removes the shortest matching pattern. Here only the starting "/"

% and %% removes everything from the end up to the pattern:
schroff@zerberus:~$ echo ${myvar%\/*}
/ab/cd/ef
schroff@zerberus:~$ echo ${myvar%%\/*}
Here the content of the bash manpage:
       ${parameter#word}
       ${parameter##word}
Remove matching prefix pattern.  The word is expanded to produce a pattern just
as in pathname expansion.  If the pattern matches the beginning of the value of
parameter,  then the result of the expansion is the expanded value of parameter
with the shortest matching pattern (the ``#'' case)  or  the  longest  matching
pattern (the ``##'' case) deleted.  If parameter is @ or *, the pattern removal
operation is applied to each positional parameter in turn, and the expansion is
the resultant list.  If parameter is an array variable subscripted with @ or *,
the pattern removal operation is applied to each member of the array  in  turn,
and the expansion is the resultant list.

       ${parameter%word}
       ${parameter%%word}
Remove matching suffix pattern.  The word is expanded to produce a pattern just
as in pathname expansion.  If the pattern matches a  trailing  portion  of  the
expanded  value  of parameter, then the result of the expansion is the expanded
value of parameter with the shortest matching pattern (the ``%'' case)  or  the
longest  matching  pattern  (the ``%%'' case) deleted.  If parameter is @ or *,
the pattern removal operation is applied to each positional parameter in  turn,
and  the  expansion  is  the resultant list.  If parameter is an array variable
subscripted with @ or *, the pattern removal operation is applied to each  mem‐
ber of the array in turn, and the expansion is the resultant list.

Nov 30, 2017

OpenJDK 9: Limitations/shortcomings of the Jshell

Jshell is a quite powerful tool to do some quick explorations and to write some scripts.

If found the following limitations:
  • No syntax highlighting
  • Only comments with // are allowed
    if you open a script file with
     /**
      *  My comments
      */
    this will work only many warnings.
    |  Error:
    |  illegal start of expression
    |   * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
    |   ^
    |  Error:
    |  illegal start of expression
    |   *
    |   ^
  • The usage of public, static, ... is quite different:
    -> public class MyClass {
    >> public int a;
    >> };
    |  Warning:
    |  Modifier 'public'  not permitted in top-level declarations, ignored
    |  public class MyClass {
    |  ^----^
    |  Added class MyClass this error is corrected:
    |      Modifier 'public'  not permitted in top-level declarations, ignored
    |      public class MyClass {
    |      ^----^

  • If you want to load a scipt with /open then tab completion does not work. The complete path including filename has to be typed / pasted.
  • If you load some example snippet, main(String[] args) is not run by default.
    Just tried with the swing tutorial from oracle:
    jshell Downloads/HelloWorldSwing.java  
    -> String[] mystringarray;
    |  Added variable mystringarray of type String[]

    -> HelloWorldSwing.main(mystringarray); 
  • .. 
to be continued...

Oct 14, 2017

Debugging bash scripts on remote hosts using Eclipse

After installing the two plugins
it is very easy to debug scripts inside your workspace on your computer. But i was wondering, if this can work on a remote host, too.

So what has to be done?

Only these steps:
  • copy your shell scripts AND _DEBUG.sh onto your remote host
  • change the first line of _DEBUG.sh from
    exec 33<>/dev/tcp/localhost/33333
    to
    exec 33<>/dev/tcp/host_running_eclipse/33333
After that start the debugger in eclipse and then run the shell script on the remote host. Done.

If this does not work: Check for firewalls blocking port 33333

Sep 16, 2017

(bash): The most useless commands (11)

After talking about
  1. rev
  2. yes
  3. sl
  4. cowsay
  5. cmatrix
  6. cal
  7. rig 
  8. pi
  9. figlet
here a packages called filters which comes with such commands:

$ echo hello my friend | jethro
hello mah friend
$ echo hello my friend | chef
hellu my freeund
$ echo hello my friend | kraut
hello mein friend
Manpage:
DESCRIPTION
       All  of  these  programs are filters to do all sorts of strange things to text.  No personal, racial,
       religious or societal slurs are intended. For amusement only.

       All the filters read input from stdin, change it, and write the filtered text to stdout. Some filters
       also support reading from files and writing to stdout.

       b1ff   The B1FF filter

       lolcat As seen in internet gifs everywhere.

       cockney
              Cockney English

       chef   convert English on stdin to Mock Swedish on stdout

       eleet  K3wl hacker slang

       fanboy Speak  like  a  fanboy.  Filters  out  extraneous  words and focuses on the words fans use. By default, it will speak like a fan of git/Linus/linux development.  To  change  this,  pass  as parameters  the  words that the fanboy typically uses. Alternatively, pass the name of a topic that typically has fanboys to use a predefined word list.

       fudd   Elmer Fudd

       jethro Hillbilly text filter

       jive   Jive English

       jibberish
              Runs text through a random selection of the rest of the filters, to make really weird output.

       ken    English into Cockney, featuring (dubious) rhyming slang for a lot of computer terminology.

       kraut  Generates text with a bad German accent.

       kenny  Generates text as spoken by Kenny on South Park.

       ky00te This program places a very cute (and familiar to FurryMuck fans) accent on any text file.

       nethackify
              Wiped out text like can be found in nethack.

       newspeak
              A-la-1984

       censor CDA-ize text

       nyc    Brooklyn English

       pirate Talk like a pirate.

       rasterman
              Makes text look like it came from the keyboard of Carsten Haitzler.
      scottish
              Fake scottish (dwarven) accent filter, inspired by the character "Durkon" from  Order  of  the
              Stick.

       spammer
              Turns honest text into something that is liable to be flagged as spam.

       scramble
              Scramble  the  "inner"  letters  of each word in the input into a random order.  The resulting
              text is still strangely readable.

       studly Studly caps.

       uniencode
              Use glorious unicode to the fullest possible extent. As seen previously in many man pages.

       upside-down
              Flips text upside down. Stand on your head and squint to read the output.

Sep 2, 2017

Bash: enabling Eclipse for Bash Programming | Plugin basheclipse (debugging) part 2

If you want to debug bash scripts inside eclipse you have to do 2 things:
BUT:
As i wrote in the last posting, toggling breakpoints was neither possible in Eclipse Neon  nor Eclipse Juno.

First you have to install JDK 1.6 and Eclipse Luna to be able to set breakpoints. (see EDIT at the end of the posting: Neon works as well...)




After you have to set up

  • Eclipse Luna with JDK 1.6
  • installad shelled & basheclipse
    (and follow the steps from posting shelled and posting basheclipse)
you have to create a Shell Script project within a shell Shell Script file:

via ->new->other


and again ->new->other

Choose the bash script you want to debug:

After that put some content into your shell.sh file:
(as written in the basheclipse posting, you have to add _DEBUG.sh into your project directory where shell.sh resides and add this line at the beginning of your shell.sh:
. _DEBUG.sh
Then change to the debug perspective and go to run-> debug configurations


 and then start a debugging session:
->run->debug

Then you will get the following:

Hmmm...
?
It says, it is running and not waiting at the first breakpoint...
What is wrong here?

Just keep calm. You have to start your shell.sh:
bash ./shell.sh

And here we go:


As you can see, the variable "a" is show with its value "test" and you can walk through your script breakpoint by breakpoint....

I asked the developer at sourceforge, why it does not work with Eclipse Neon. I hope i will get an answer... (or better a fix ;-)

EDIT: After some retries: switching from OpenJDK to Oracle's JDK did the job. (The installation of basheclipse has to be done with Oracle's JDK. After that i was able to run it on Eclipse Neon even with OpenJDK).

EDIT2: It is even possible to debug bash scripts on a remote host.

Aug 24, 2017

(bash): The most useless commands(10)


After talking about
  1. rev
  2. yes
  3. sl
  4. cowsay
  5. cmatrix
  6. cal
  7. rig 
  8. pi
here another pretty useless command:
~$ figlet apt-get update
             _                   _                     _       _      
  __ _ _ __ | |_       __ _  ___| |_   _   _ _ __   __| | __ _| |_ ___
 / _` | '_ \| __|____ / _` |/ _ \ __| | | | | '_ \ / _` |/ _` | __/ _ \
| (_| | |_) | ||_____| (_| |  __/ |_  | |_| | |_) | (_| | (_| | ||  __/
 \__,_| .__/ \__|     \__, |\___|\__|  \__,_| .__/ \__,_|\__,_|\__\___|
      |_|             |___/                 |_|                        
Manpage:
DESCRIPTION
       FIGlet  prints  its input using large characters (called ``FIGcharacters'')made up of ordinary screen
       characters (called ``sub-characters'').  FIGlet output is generally reminiscent of the sort of ``sig‐
       natures''  many  people like to put at the end of e-mail and UseNet messages.  It is also reminiscent
       of the output of some banner programs, although it is oriented normally, not sideways.

       FIGlet can print in a variety of fonts, both left-to-right and right-to-left, with adjacent  FIGchar‐
       acters  kerned  and ``smushed'' together in various ways.  FIGlet fonts are stored in separate files,
       which can be identified by the suffix ``.flf''.  In systems with UTF-8 support FIGlet may  also  sup‐
       port  TOIlet  ``.tlf''  fonts.  Most FIGlet font files will be stored in FIGlet's default font direc‐
       tory.

       FIGlet can also use ``control files'', which tell it to map certain input characters to certain other
       characters,  similar to the Unix tr command.  Control files can be identified by the suffix ``.flc''.
       Most FIGlet control files will be stored in FIGlet's default font directory.

       You can store FIGlet fonts and control files in compressed form.  See COMPRESSED FONTS.

Aug 10, 2017

(bash): The most useless commands (9)

After talking about
  1. rev
  2. yes
  3. sl
  4. cowsay
  5. cmatrix
  6. cal
  7. rig
here another pretty useless command:



$ pi 10
3.141592653
Manpage:
DESCRIPTION
       The  pi  command  prints  100 decimal digits of Archimedes' constant pi or a number of
       digits specified by an integer parameter on the command line.

Jul 19, 2017

(bash): The most useless commands (8)


After talking about

  1. rev
  2. yes
  3. sl
  4. cowsay
  5. cmatrix
  6. cal
 i found another funny command:
rig
Its manpage tells the following:
DESCRIPTION
       Rig  is a utility that will piece together a random first name, last name, street num‐
       ber and address, along with a geographically consistant (ie, they all match  the  same
       area) city, state, ZIP code, and area code.

       It is suitable for such applications as feeding the NY times registration page to fend
       off junk (snail) mail and telemarketers, or for registering  on  BBS's  to  which  you
       don't wish to reveal your real information.
I am not sure if this tool is banned by the NSA ;-) but here we go:
schroff@zerberus:~$ rig
Carmelo Suarez
947 East Parson St
Alton, IL  62002
(708) xxx-xxxx
schroff@zerberus:~$ rig
Janna Stewart
970 Potter Rd
Auburn, NY  13021
(315) xxx-xxxx
schroff@zerberus:~$ rig
Bernadine Collins
27 Willow Rd
Seattle, WA  98109
(206) xxx-xxxx

Jul 15, 2017

OpenJDK 9: Jshell - Using Swing / doing GUI stuff

After the posts buitin commands of jshell and how to load and save scripts i tried to get swing components running.

I created a script  HelloWorld.java
import javax.swing.*;       

JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
But this does not work with Ubuntu:
jshell HelloWorld.java
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f61041bb009, pid=7440, tid=7442
#
# JRE version: OpenJDK Runtime Environment (9.0) (build 9-internal+0-2016-04-14-195246.buildd.src)
# Java VM: OpenJDK 64-Bit Server VM (9-internal+0-2016-04-14-195246.buildd.src, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# C  [libjava.so+0x1d009]  JNU_GetEnv+0x19
#
# Core dump will be written. Default location: Core dumps may be processed with "/usr/share/apport/apport %p %s %c %P" (or dumping to /home/schroff/core.7440)
#
# An error report file with more information is saved as:
# /home/schroff/hs_err_pid7440.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
|  State engine terminated.
|  Restore definitions with: /reload restore
|  Resetting...
|  Welcome to JShell -- Version 9-internal
|  For an introduction type: /help intro
Hmmm. This does look good.

On a Windows 10 host it works without any problem:


I hope this bug will be fixed soon...
EDIT: After downloading a new version from java.net it worked:

./java -version
java version "9"
Java(TM) SE Runtime Environment (build 9+178)
Java HotSpot(TM) 64-Bit Server VM (build 9+178, mixed mode)


Jul 14, 2017

Bash: enabling Eclipse for Bash Programming | Plugin basheclipse (debugging) part 1

In my last posting i showed how to install the plugin shelled and its configuration options.

Now the next step is to install basheclipse, which enables eclipse in conjunction with shelled to debug bash scripts.

Step 1: Download basheclipse

Step 2: Do not copy the jar file to the plugins directory if you are using Eclipse Neon. Copy them to the dropins directory.

Step 3: Restart eclipse (and wait. I had to wait nearly 5 minutes with a cpu usage of 100%)

Step 4: Change the Shell interpreter in shelled (->window->preferences->shell script->interpreters):

Step  5: Create a new Shell Script Project:
 


 Step 6: Create a Shell Script File:

Step 7: Copy _DEBUG.sh into your project directory
Step 8: Add _DEBUG.sh at the beginning of your file with full qualified directory name:
 ~/devel/workspace/MyShellScriptProjekct/_DEBUG.sh
Step 9: Go to ->run->debug configurations and create a new configuration inside "bash script"
 You have to select your scriptfile here:
But after doing all this steps i was not able to set breakpoints.
I tried
  • java 1.5 with
    Eclipse Juno


    But this did not work.
  • java 1.9 with
    Eclipse Neon


    Did neither work (this posting)

But: Java 1.6 with Eclipse Luna works!


Read the next posting how to debug a bash scripts in eclipse...

EDIT: After changing from OpenJDK to Oracle's JDK it even works with Eclipse Neon.

OpenJDK 9: Jshell - how to load scripts and how to save/persist finished snippets

In my last posting i showed the builtin jshell commands and how to start working with the java shell.

What about loading and saving scripts?

I created a file myshell.txt with this content:
class MyClass {
 private int a;
 public MyClass(){a=0;}
 int getA() {return a;};
 void setA(int var) {a=var; return;}
}
MyClass ZZ;
ZZ = new MyClass();
ZZ.setA(200);
The help shows the following:
-> /help /open

|  /open

|  Open a file and read its contents as snippets and commands.

|  /open
|      Read the specified file as jshell input.
so i tried this one:
-> /open myjshell.txt
hmmm. No feedback inside jshell. But no news is good news:
-> /list

   1 : class MyClass {
        private int a;
        public MyClass(){a=0;}
        int getA() {return a;};
        void setA(int var) {a=var; return;}
       }
   2 : MyClass ZZ;
   3 : ZZ = new MyClass();
   4 : ZZ.setA(200);
 Saving your work is quite easy:
-> /help /save

|  /save

|  Save the specified snippets and/or commands to the specified file.

|  /save
|      Save the source of current active snippets to the file.

|  /save all
|      Save the source of all snippets to the file.
|      Includes source including overwritten, failed, and start-up code.

|  /save history
|      Save the sequential history of all commands and snippets entered since jshell was launched.

|  /save start
|      Save the default start-up definitions to the file.
And also no news is good news:
-> /save myjshell2.txt
and like expected:
$ cat myjshell2.txt
class MyClass {
 private int a;
 public MyClass(){a=0;}
 int getA() {return a;};
 void setA(int var) {a=var; return;}
}
MyClass ZZ;
ZZ = new MyClass();
ZZ.setA(200);
But what about this /save start ?
-> /save start myjshell3.txt
and the content of this file is:
$ cat myjshell3.txt

import java.util.*;
import java.io.*;
import java.math.*;
import java.net.*;
import java.util.concurrent.*;
import java.util.prefs.*;
import java.util.regex.*;
void printf(String format, Object... args) { System.out.printf(format, args); }
 To load a scipt on startup just type
jshell myjshell.txt



Jul 12, 2017

OpenJDK 9: JShell - an interactive java interpreter shell | builtin commands

One of the new features of java 9 is jshell (JEP 222).

On my ubuntu system the installation was quite easy:
# apt-get install openjdk-9-jdk-headless
and you can find
$ ls /usr/lib/jvm/java-9-openjdk-amd64/bin/
idlj       jcmd    jmap        jstatd       schemagen
jar        jdb     jmod        keytool      serialver
jarsigner  jdeps   jps         orbd         servertool
java       jhsdb   jrunscript  pack200      tnameserv
javac      jimage  jsadebugd   policytool   unpack200
javadoc    jinfo   jshell      rmic         wsgen
javah      jjs     jstack      rmid         wsimport
javap      jlink   jstat       rmiregistry  xjc
 (in the third column, sixth row: jshell)

After a startup jshell comes up with this prompt:

$ /usr/lib/jvm/java-9-openjdk-amd64/bin/jshell
|  Welcome to JShell -- Version 9-internal
|  For an introduction type: /help intro


->
 The most important command is
/exit
to leave the jshell (Strg-C works also, but i think /exit should be used).

There is no syntax highlighting but this does not matter.

The following builtin commands are allowed:
-> /help
|  Type a Java language expression, statement, or declaration.
|  Or type one of the following commands:

|     /list [all|start|]                       -- list the source you have typed
|     /edit                                    -- edit a source entry referenced by name or id
|     /drop                                    -- delete a source entry referenced by name or id
|     /save [all|history|start]                      -- Save snippet source to a file.
|     /open                                          -- open a file as source input
|     /vars                                                -- list the declared variables and their values
|     /methods                                             -- list the declared methods and their signatures
|     /classes                                             -- list the declared classes
|     /imports                                             -- list the imported items
|     /exit                                                -- exit jshell
|     /reset                                               -- reset jshell
|     /reload [restore] [quiet]                            -- reset and replay relevant history -- current or previous (restore)
|     /classpath                                     -- add a path to the classpath
|     /history                                             -- history of what you have typed
|     /help [|]                          -- get information about jshell
|     /set editor|start|feedback|newmode|prompt|format ... -- set jshell configuration information
|     /? [|]                             -- get information about jshell
|     /!                                                   -- re-run last snippet
|     /                                                -- re-run snippet by id
|     /-                                                -- re-run n-th previous snippet

|  For more information type '/help' followed by the name of command or a subject.
|  For example '/help /list' or '/help intro'.  Subjects:

|     intro     -- an introduction to the jshell tool
|     shortcuts -- a description of shortcuts
With /list the source code, which you provided, is shown:
-> /list 5

   5 : class MyClass {
       private int a;
       public MyClass(){a=0;}
       int getA() {return a;};
       void setA(int var) {a=var; return;}
       }

Everytime you create an Object, you will see the following:
-> ZZ = new MyClass();
|  Variable ZZ has been assigned the value MyClass@28d25987

-> ZZ.getA();
|  Expression value is: 0
|    assigned to temporary variable $8 of type int

-> ZZ.setA(200);

-> ZZ.getA();
|  Expression value is: 200
|    assigned to temporary variable $10 of type int
With /vars the variables are shown:
-> /vars
|    MyClass ZZ = MyClass@28d25987
|    int $8 = 0
|    int $10 = 200
Listing the classes (ok it is getting boring):
-> /classes
|    class MyClass
 and last but not least /methods:
-> /methods
|    printf (String,Object...)void
|    getA ()int