Open-source Android VPN Stack Suite 0.0.1.1

Open-source Android VPN Stack Suite 0.0.1.1 has been released.

Supported platforms:

  • Android (sdk >= 26)
  • Examples (demo files, result files, log files), screenshots:
    Examples

Verification of downloaded files:
—————-

GPG Public Key (SManSoft ECDSA Key) <info@smansoft.com> has been published here: http://smansoft.com/gpg/smansoft.pub.asc.
Android VPN Stack Suite – 0.0.1.1 contains suite of [some_install_file].asc files.
Please, use:
gpg --import ./smansoft.pub.asc
for importing of key and
gpg --verify ./[some_install_file].asc ./[some_install_file]
or
gpg --verify ./[some_install_file].asc
for verification of files, published on this site.
Public GPG ECDSA Key can be imported, using
gpg --keyserver hkp://pgp.mit.edu --recv-keys A408B0FCFD774649
too.

Features of the Android VPN Stack Suite:

  • Simple TCP/UDP socket server (with multi-thread support) (Linux platform), that implements open simple communication protocol (application level):
    • TCP:
      • The Client connects to the TCP Server;
      • The Client sends “socket_client: Hello” to the Server;
      • The Server reads message from the Client;
      • The Server sends “socket_server: Hello” to the Client;
      • The Client reads message from the Server;
      • The Client sends some text message (size 1024 with ‘\0’ symbol)  to the Server;
      • The Server reads text message from the Client and generates inverted message (src: “1234567890” -> inverted: “0987654321”);
      • The Server sends inverted message to the Client;
      • The Client reads message from the Server;
      • The Client send read message to the Server;
      • The Server reads text message from the Client and generates inverted message (src: “0987654321” -> inverted: “1234567890”);
      • The Server sends inverted message to the Client;
      • The Client reads message from the Server;
      • Last received message by the Client should be similar to the first message sent by Client to the Server;
    • UDP:
      • The Client connects to the TCP Server;
      • The Client sends “socket_client: Hello” to the Server;
      • The Server reads message from the Client;
      • The Server opens new UDP connection on new socket port;
      • The Server sends new UDP port number to the Client (using first connection);
      • The Client reads the UDP port number and closes first connection;
      • The Client creates new UDP connection, using received from Server port number;
      • The Client sends “socket_client: Hello” to the Server;
      • The Server reads message from the Client;
      • The Server sends “socket_server: Hello” to the Client;
      • … Then communication protocol (application level) is same as described in TCP section;
  • Simple TCP/UDP socket client (Microsoft Visual Studio C++, Windows platform), that implements previous described protocol;
  • Simple TCP/UDP socket client (Android Studio/Android SDK, Android platform), that implements previous described protocol;
  • VPN Stack Application, that (Android Studio/Android SDK/Android NDK/C, Android platform), that is based on VpnService (Android platform) and implements intermediate IP/TCP/UDP stack (JNI/C/Sockets);
  • VPN Stack Application provides catching, monitoring and processing TCP/UDP/ICMP/IP packages; Then these packages are processed (via JNI) at the Native API level;
  • VPN Stack Application can catch packages from some defined application (if text edit “Filtered Package Name” is defined) or from all applications (if text edit “Filtered Package Name” is empty);
  • VPN Stack Application creates tun0 device (after launching), which is used for catching TCP/UDP/ICMP/IP packages;
  • VPN Stack Application reads packages, sent from Android application(s) from tun0 device, provides processing these packages and creates new or uses saved (sessions) TCP connections (if Android Application sends TCP package) or just uses sendto (if Android Application sends TCP package);
  • VPN Stack Application receives all packages from network, provides processing these packages and writes packages to tun0 device, then packages will be received by Android application(s);
  • VPN Stack Application doesn’t use Raw Sockets;
  • VPN Stack Application writes detailed log to Logcat and to the file
    /data/data/com.smansoft.vpn_stack/files/logs/vpn_stack.log;
  • Follow applications from this suite:
    • Simple TCP/UDP socket server (with multi-thread support) (Linux platform);
    • Simple TCP/UDP socket client (Microsoft Visual Studio C++, Windows platform);
    • Simple TCP/UDP socket client (Android Studio/Android SDK, Android platform) have been created and have been used for testing network connections and for testing the VPN Stack Application;

VPN Stack Application implements follow schema of network stack processing:
vpn_stack.png

Demo of the sm_vpn_stack_suite (Open-source Android VPN Stack Suite):
—————-

Here are results of the execution (log files and screenshots) of the socket_client_vs on Windows 10 x64.

socket_client_vs.1.log
socket_client_vs.2.log

socket_client_vs (Windows 10 x64)
socket_client_vs.1.jpg

Here are results of the execution  (log files and screenshots) of the socket_server on Linux Debian 10 x64.

socket_server.1.log
socket_server.2.log

socket_server (Debian 10 x64)
socket_server.1.jpg
socket_server.2.jpg

Here are results of the execution (screenshot) of the socket_client on Android 8.0 (API 26) x64.

socket_client.1.jpg

Here are results of the execution  (log files and screenshots) of the vpn_stack on Android 8.0 (API 26) x64.

vpn_stack.1.log
vpn_stack.2.log

socket_server (Debian 10 x64)
vpn_stack.1.jpg
vpn_stack.2.jpg
vpn_stack.3.jpg
vpn_stack.4.jpg

Here is list of network interfaces before launching the VPN Service.
ip_addr.1.jpg
Here is list of network interfaces after launching the VPN Service. Device tun0 (is used for catching the network traffic) has been added.
ip_addr.2.jpg

Here are selected results (from vpn_stack.1.log and vpn_stack.2.log):

vpn_stack.1.txt
vpn_stack.2.txt

vpn_stack.5.jpg
vpn_stack.6.jpg

sm_vpn_stack_suite (Android VPN Stack Suite) 0.0.1.1 ® Copyright © 2021 by SManSoft.

Open-source multi-thread demo/template resolving the producer–consumer (bounded-buffer) problem (SM Producer Consumer) 0.0.1.1

Open-source multi-thread demo/template resolving the producer–consumer (bounded-buffer) problem (SM Producer Consumer) 0.0.1.1 has been released.

Supported platforms:

  • Linux (x86_64)
  • Examples (result file, log file), screenshots:
    Examples

Verification of downloaded files:
—————-

GPG Public Key (SManSoft ECDSA Key) <info@smansoft.com> has been published here: http://smansoft.com/gpg/smansoft.pub.asc.
SM Producer Consumer – 0.0.1.1 contains suite of [some_install_file].asc files.
Please, use:
gpg --import ./smansoft.pub.asc
for importing of key and
gpg --verify ./[some_install_file].asc ./[some_install_file]
or
gpg --verify ./[some_install_file].asc
for verification of files, published on this site.
Public GPG ECDSA Key can be imported, using
gpg --keyserver hkp://pgp.mit.edu --recv-keys A408B0FCFD774649
too.

Features of the SM Producer Consumer:
—————-

  • Multi-thread demo/template, that resolves producer-consumer problem (bounded-buffer problem);
  • Using thread support primitives (classes, api), which are parts of the C++ (C++11) language, defined by the standard ISO/IEC 14882:2011;
  • Using several producer-consumer objects, which use suite of limited-size queues shared by various number of threads with various productivity/periodicity/frequency;
  • Writing processed results into the text file (in the special directory);
  • Logging results and applications workflow;
  • Multi-thread (thread-safe) log library, that supports output to the log file and/or console;
  • Multi-thread (thread-safe) log library, supports log level output (TRACE, DEBUG, INFO, WARN, ERROR, FATAL);
  • Usage string secure library in some C-language functions;
  • Self-stopping support, when file ‘.stop‘ is placed in the special directory;

Supported platforms:
—————-

Linux (x64 only):
  • Debian 10;
  • Debian 9;
  • openSUSE 15.1;
  • openSUSE 15.2;
  • Ubuntu 20.04 LTS;
  • Mint 19.3;
  • Mint 20.1;

Demo of the sm_producer_consumer (SM Producer Consumer) tool (Linux):
—————-

Here are the results of the execution of the sm_producer_consumer (SM Producer Consumer) tool on Linux Debian 10 (Buster) x64.

Results of execution (result file, log file and screenshots) below:
sm_producer_consumer.log
sm_producer_consumer.out.txt

sm_producer_consumer.lnx.01.jpg

sm_producer_consumer.lnx.02.jpg

sm_producer_consumer.lnx.03.jpg

sm_producer_consumer.lnx.04.jpg

sm_producer_consumer.lnx.05.jpg

sm_producer_consumer.lnx.06.jpg

sm_producer_consumer (SM Producer Consumer) 0.0.1.1 ® Copyright © 2021 by SManSoft.

Multi-Platform sm_regex (SM Regular Expressions Calculator) tool 0.0.1.1

Multi-Platform sm_regex (SM Regular Expressions Calculator) tool 0.0.1.1 has been released.

Supported platforms:

  • Windows (x86, x86_64)
  • Linux (x86_64)

Verification of downloaded files:
—————-

GPG Public Key (SManSoft ECDSA Key) <info@smansoft.com> has been published here: http://smansoft.com/gpg/smansoft.pub.asc.
SM Regular Expressions Calculator – 0.0.1.1 contains suite of [some_install_file].asc files.
Please, use:
gpg --import ./smansoft.pub.asc
for importing of key and
gpg --verify ./[some_install_file].asc ./[some_install_file]
or
gpg --verify ./[some_install_file].asc
for verification of files, published on this site.
Public GPG ECDSA Key can be imported, using
gpg --keyserver hkp://pgp.mit.edu --recv-keys A408B0FCFD774649
too.

Features of the SM Regular Expressions Calculator:
—————-

  • Multi-platform application: there are builds for Windows x64/x32 (.zip) and Linux x64 (.tar.gz);
  • Calculation a Match (finds all substrings in the input string which match a regular expression pattern
    and returns all occurrences) using regular expressions;
  • Calculation a Replace (finds all substrings in the input string which match a regular expression pattern
    and replaces all occurrences, by entered replacement text), using regular expressions;
  • Calculation a SubExpressions (finds all substrings in the input string which match a regular expression pattern
    and separates text, by found substrings), using regular expressions;
  • Usage follow Regular Expressions engines: Qt RegEx, STL C++ RegEx (C++ 11);
  • Usage ECMAScript standard (by both engines as Qt RegEx as STL C++ RegEx (C++ 11));
  • One-line and multi-line modes;
  • Case-insensitive and case-sensitive modes;
  • Saving the result in the Clipboard;
  • Saving the result in a Text File;
  • Tuning interface, usage Light and Dark themes;
  • Usage database, where Regular Expressions and options (one-line/multi-line and case-insensitive/case-sensitive), using during calculations can be saved;
  • Usage the System Tray on the Windows and Linux platforms during work of the SM Regular Expressions Calculator tool;
  • Log of results and applications workflow;
  • Portable build/version (archive(s) which can be just extracted);

Supported platforms:
—————-

Windows (x64/x32):
  • Windows 7;
  • Windows 8;
  • Windows 8.1;
  • Windows 10;
Linux (x64 only):
  • Debian 10;
  • Debian 9;
  • openSUSE 15.1;
  • openSUSE 15.2;
  • Ubuntu 20.04 LTS;
  • Mint 19.3;
  • Mint 20.1;
  • any x64 Linux distro, that uses version of glibc >= 2.24;

Widget-based version:
—————-
sm_regex_w.lnx.01.jpg
sm_regex_w.lnx.02.jpg
sm_regex_w.lnx.03.jpg
sm_regex_w.lnx.04.jpg
sm_regex_w.lnx.05.jpg
sm_regex_w.lnx.06.jpg
QML-based version:
—————-
sm_regex_q.lnx.01.jpg
sm_regex_q.lnx.02.jpg
sm_regex_q.lnx.03.jpg
sm_regex_q.lnx.04.jpg
sm_regex_q.lnx.05.jpg
sm_regex_q.lnx.06.jpg
sm_regex_q.lnx.07.jpg
sm_regex_q.lnx.08.jpg

sm_regex (SM Regular Expressions Calculator) tool 0.0.1.1 ® Copyright © 2021 by SManSoft.

File Exchanger Tool 0.0.11.11

File Exchanger Tool 0.0.11.11 has been released.

Supported platforms:

  • Windows (x86, x86_64)
  • Linux (x86_64)

File Exchanger – 0.0.11.11 – Linux
File Exchanger Tool – 0.0.11.11 – Windows

Please, see screenshots here: screenshots.
Here are: demo (screenshots (.jpg), video demo (install, run) (.mp4)).

File Exchanger (file_exchanger) Tool is a peer-to-peer files exchanger for Windows/Linux platform.

Overview
—————-
The main features of File Exchanger (file_exchanger) Tool:

  • transfer of files from client to server, using open socket connections;
  • transfer of files from client to server, using SSL connections;
  • control of entirety of received files, comparing of checksum values sent and received files, using CRC-32 algorithm;
  • using transfer of files from client to server, using SSL connections;
  • using follow SSL mode/algorithms (TLSv1.2), if SSL connection is used:
    • ECDHE-ECDSA-AES256-GCM-SHA384
    • TLSv1.2 – version
    • TLS – the protocol used
    • ECDHE – the key exchange mechanism
    • ECDSA – the algorithm of the authentication key
    • AES – the symmetric encryption algorithm
    • 256 – the key size of AES
    • GCM – the mode of AES
    • SHA384 – the MAC used by the algorithm
    • prime256v1 (NIST P-256, secp256r1) – Elliptic Curve, that is used by ECDHE and ECDSA
  • using unique CA of client and server certificates;
  • user can update CA, client/server/gui keys/certificates, using suite of scripts ssl.ecdsa.tar.gz (ReadMe.txt in ssl.ecdsa.tar.gz);
  • using of xml configuration files, which can be updated by user and will be applied without restart of processes (sm_file_send_clns, sm_file_send_srvs);
  • scanning of configured directories, where sent files can be copied;
  • copying of sub-directories with files, saving of sub-directories tree at the server side;
  • support of unicode symbols in file/directory names;
  • backup (with rolling) of sent/received files;
  • server and client modules can be launched as Services (Windows)/Daemons (Linux);
  • console command line control application (only Windows) of client/server Services (requires Administrator permissions);
  • Windows gui application (asynchronous multi-thread GUI), that allows to monitor states of client/server Services, control of client/server Services and change parameters of client/server Services;
  • Linux gui application (Qt-based) (asynchronous multi-thread GUI), that allows to monitor states of client/server Daemons, control of client/server Daemons (when it’s possible, according to users permissions) and change parameters of client/server Deamons;
  • using ECDSA (NIST P-256, secp256r1) for signing/verification parameters, which are sent between client/server and gui applications (Windows/Linux);
  • tool applications don’t use any intermediate servers and transfer files directly between client and server;

Windows gui application: Screenshot 1
Windows gui application: Screenshot 2
Linux gui application (Qt-based): Screenshot 1
Linux gui application (Qt-based): Screenshot 2

Please, see more screenshots here: screenshots.

Read ReadMe.txt for more info.

File Exchanger (file_exchanger) Tool is a free software distributed under the MIT.
Read License.txt for more information about license.

Please, send your notes and questions to info@smansoft.com.

File Exchanger (file_exchanger) Tool ® Copyright © 2018-2019 by SManSoft.

File Exchanger Tool 0.0.9.9

File Exchanger Tool 0.0.9.9 has been released.

Supported platforms:

  • Windows (x86, x86_64)
  • Linux (x86_64)

File Exchanger – 0.0.9.9 – Linux
File Exchanger Tool – 0.0.9.9 – Windows

File Exchanger (file_exchanger) Tool is a peer-to-peer files exchanger for Windows/Linux platform.

Overview
—————-
The main features of File Exchanger (file_exchanger) Tool:

  • transfer of files from client to server, using open socket connections;
  • transfer of files from client to server, using SSL connections;
  • control of entirety of received files, comparing of checksum values sent and received files, using CRC-32 algorithm;
  • using transfer of files from client to server, using SSL connections;
  • using follow SSL mode/algorithms (TLSv1.2), if SSL connection is used:
    • ECDHE-ECDSA-AES256-GCM-SHA384
    • TLSv1.2 – version
    • TLS – the protocol used
    • ECDHE – the key exchange mechanism
    • ECDSA – the algorithm of the authentication key
    • AES – the symmetric encryption algorithm
    • 256 – the key size of AES
    • GCM – the mode of AES
    • SHA384 – the MAC used by the algorithm
    • prime256v1 (NIST P-256, secp256r1) – Elliptic Curve, that is used by ECDHE and ECDSA
  • using unique CA of client and server certificates;
  • user can update CA, client/server keys/certificates, using suite of scripts ssl.ecdsa.tar.gz (ReadMe.txt in ssl.ecdsa.tar.gz);
  • using of xml configuration files, which can be updated by user and will be applied without restart of processes (sm_file_send_clns, sm_file_send_srvs);
  • scanning of configured directories, where sent files can be copied;
  • copying of sub-directories with files, saving of sub-directories tree at the server side;
  • support of unicode symbols in file/directory names;
  • backup (with rolling) of sent/received files;
  • server and client modules can be launched as Services (Windows)/Daemons (Linux);
  • tool applications don’t use any intermediate servers and transfer files directly between client and server;

Read ReadMe.txt for more info.
File Exchanger (file_exchanger) Tool is a free software distributed under the MIT.
Read License.txt for more information about license.

Please, send your notes and questions to info@smansoft.com.

File Exchanger (file_exchanger) Tool ® Copyright © 2018-2019 by SManSoft.

Number Pattern #1

Here is the solution of simple algorithmic task – generation of integer sequences. There is a some challenge (easy level) at the site codenirvana.in :

CHALLENGE DESCRIPTION:
Write a program that prints out the pattern generated according to the input (number) from the user.
Pattern input and output sample is given below, check the input and the following pattern generated for that condition (number). Make sure you program follow the same pattern logic for every input.

INPUT SAMPLE:
Your program should ask for a number F first and than print the pattern accordingly. E.g.

Enter a number: 4

OUTPUT SAMPLE:
For the input N=4 output will be

4444444
4333334
4322234
4321234
4322234
4333334
4444444

Here is my solution (“С” for Windows). I’ve implemented two sequences generators – iterative and recursive:

// lines_gen.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

VOID init_line                          (PUINT	punLine, UINT unN);
VOID print_line                         (PUINT	punLine, UINT unN);
UINT proc_elem                          (PUINT	punLine, UINT unN, UINT unIdx);
UINT proc_array_rec                     (PUINT	punLine, UINT unN);
UINT proc_array_iter                    (PUINT	punLine, UINT unN);
UINT proc_array_iter_bak                (PUINT	punLine, UINT unN);

VOID init_line(PUINT	punLine, UINT unN)
{
  UINT unIdx;
  for(unIdx = 0; unIdx < unN; unIdx++)
    punLine[unIdx] = unIdx+1;
}

VOID print_line(PUINT	punLine, UINT unN)
{
  UINT unIdx;
  _tprintf(_T("line = "));
  for(unIdx = 0; unIdx < unN; unIdx++)
    _tprintf(_T("%d "),punLine[unIdx]);
  _tprintf(_T("\n"));
  return;
}

UINT proc_elem(PUINT	punLine, UINT unN, UINT unIdx)
{
  UINT unRes = 0;

  if((unIdx + 1) >= unN)
    return 0;

  if(punLine[unIdx] >= punLine[unIdx+1])
    unRes = proc_elem(punLine, unN, unIdx+1);
  else
    unRes = punLine[unIdx+1];

  if(unRes)
  {
    punLine[unIdx] = unRes;
    return punLine[unIdx];
  }
  else
    return 0;
}

UINT proc_array_rec(PUINT	punLine, UINT unN)
{
  UINT unCount = 0;

  print_line(punLine, unN);
  while(TRUE)
  {
    unCount++;
    if(!proc_elem	(punLine, unN, 0))
      break;
    print_line(punLine, unN);
  }

  return unCount;
}

UINT proc_array_iter(PUINT punLine, UINT unN)
{
  UINT unIdx;
  UINT unIdxIn;

  print_line(punLine, unN);
  for(unIdx = 1; unIdx < unN; unIdx++)
  {
    for(unIdxIn = 0; unIdxIn <= unIdx; unIdxIn++)
      punLine[unIdxIn] = unIdx+1;
    print_line(punLine, unN);
  }
  return unIdx;
}

UINT proc_array_iter_bak(PUINT punLine, UINT unN)
{
  UINT unIdx;
  UINT unIdxIn;

  print_line(punLine, unN);
  for(unIdx = 1; unIdx < unN; unIdx++)
  {
    UINT unBackIdx = unN-unIdx;
    for(unIdxIn = 0; unIdxIn <= (unBackIdx-1); unIdxIn++)
      punLine[unIdxIn] = unBackIdx;
    print_line(punLine, unN);
  }
  return unIdx;
}

INT _tmain(int argc, _TCHAR* argv[])
{
  UINT	unN		= 0;
  PUINT	punLine	= NULL;
  UINT	unCount;

  _tprintf(_T("Enter a number : "));
  _tscanf_s(_T("%d"), &unN);

  if(!unN)
    return 0;

  punLine = (PUINT) malloc(unN*sizeof(UINT));

  init_line(punLine, unN);
  unCount = proc_array_iter(punLine, unN);
  _tprintf(_T("Total count = %d\n"), unCount);
  _tprintf(_T("-----------------\n"));
  unCount = proc_array_iter_bak(punLine, unN);
  _tprintf(_T("Total count = %d\n"), unCount);
  _tprintf(_T("-----------------\n"));
  unCount = proc_array_rec(punLine, unN);
  _tprintf(_T("Total count = %d\n"), unCount);

  free(punLine);

  return 0;
}

Output:

Enter a number : 5
line = 1 2 3 4 5
line = 2 2 3 4 5
line = 3 3 3 4 5
line = 4 4 4 4 5
line = 5 5 5 5 5
Total count = 5
-----------------
line = 5 5 5 5 5
line = 4 4 4 4 5
line = 3 3 3 4 5
line = 2 2 3 4 5
line = 1 2 3 4 5
Total count = 5
-----------------
line = 1 2 3 4 5
line = 2 2 3 4 5
line = 3 3 3 4 5
line = 4 4 4 4 5
line = 5 5 5 5 5
Total count = 5

lines_gen.c
output.txt

Java:

/**
 * 
 */
package com.smansoft;

/**
 * @author SMan
 * 
 */
public class LinesGen {

  /**
   * 
   */
  int line[] = null;
  
  /**
   * @param args
   */
  public static void main(String[] args) {
    int inNum = Integer.parseInt(args[0]);		
    
    System.out.printf("Number = %d\n", inNum);

    LinesGen linesGen = new LinesGen(inNum);
    linesGen.initLine();

    int count = linesGen.procArrayIter();
    System.out.printf("Total count = %d\n", count);
    count = linesGen.procArrayIterBak();
    System.out.printf("Total count = %d\n", count);
    count = linesGen.procArrayRec();
    System.out.printf("Total count = %d\n", count);
  }

  /**
   * 
   * @param size
   */
  public LinesGen(int size) {
    line = new int[size];
  }

  /**
   * 
   */
  public void initLine() {
    for (int idx = 0; idx < line.length; idx++) {
      line[idx] = (idx + 1);
    }
  }

  /**
   * 
   */
  public void printLine() {
    System.out.print("line = ");
    for (int idx = 0; idx < line.length; idx++) {
      System.out.printf("%d ", line[idx]);
    }
    System.out.println("");
  }

  /**
   * 
   * @return
   */
  public int procArrayRec() {
    int count = 0;
    printLine();
    while (true) {
      count++;
      if (procElem(0) == 0)
        break;
      printLine();
    }
    return count;
  }

  /**
   * 
   * @return
   */
  public int procArrayIter() {
    int idx;
    printLine();
    for (idx = 1; idx < line.length; idx++) {
      for (int idxIn = 0; idxIn <= idx; idxIn++) {
        line[idxIn] = idx + 1;
      }
      printLine();
    }
    return idx;
  }

  /**
   * 
   * @return
   */
  public int procArrayIterBak() {
    int idx;
    printLine();
    for (idx = 1; idx < line.length; idx++) {
      for (int idxIn = 0; idxIn <= (line.length - idx - 1); idxIn++) {
        line[idxIn] = line.length - idx;
      }
      printLine();
    }
    return idx;
  }
  
  /**
   * 
   * @param idx
   * @return
   */
  private int procElem(int idx) {
    int res = 0;

    if ((idx + 1) >= line.length)
      return 0;

    if (line[idx] >= line[idx + 1])
      res = procElem(idx + 1);
    else
      res = line[idx + 1];

    if (res > 0) {
      line[idx] = res;
      return line[idx];
    } else
      return 0;
  }
}

Output (ant run.LinesGen):

run.LinesGen:
[java] Number = 5
[java] line = 1 2 3 4 5
[java] line = 2 2 3 4 5
[java] line = 3 3 3 4 5
[java] line = 4 4 4 4 5
[java] line = 5 5 5 5 5
[java] Total count = 5
[java] line = 5 5 5 5 5
[java] line = 4 4 4 4 5
[java] line = 3 3 3 4 5
[java] line = 2 2 3 4 5
[java] line = 1 2 3 4 5
[java] Total count = 5
[java] line = 1 2 3 4 5
[java] line = 2 2 3 4 5
[java] line = 3 3 3 4 5
[java] line = 4 4 4 4 5
[java] line = 5 5 5 5 5
[java] Total count = 5

LinesGen.java
LinesGen.zip (including ant script)
joutput.txt

SManSoft Ltd.

SManSoft Ltd.

This site has been created and supported by Sergey Manoylo to document software development activity in Software Development (C/C++, Java, Windows, Linux, Android, Kernel Level).

Blog Mirrors:

mirror: http://blog.smansoft.com
mirror: http://smansoft.wordpress.com

 

Contact info:

Sergey Manoylo

mobile phone: +380-67-150-2244
e-mail: sman(at)smansoft.com
e-mail: blog(at)smansoft.com
e-mail: smansoft(at)ukr.net
Skype ID: smansoft.net
Telegram: https://t.me/smansoft (+380671502244)
GitHub: https://github.com/smansoft

Kharkov (Kharkiv), Ukraine