Zakładanie stron WordPress

Koszty stałe (roczne) utrzymania strony WWW u providera to hosting + domena.

Hosting

84.87 pln/y https://hosting.linux.pl/hosting.html lub szybsze rozwiązanie na SSD Szybki SSD 4GB 158.6pln/y (wg mnie warto zainwestować w SSD)

Domena

Domena w zależności od nazwy od kilku złotych za rejestrację do 200pln za przedłużenie za rok https://hosting.linux.pl/domeny-cennik.html . Tu cena zależny od nazwy jaką wybierasz. Czyli koło ~110pln/y trzeba liczyć.

Template

Wybór template wyglądu strony z bogatej listy darmowych oraz płatnych templatów. Jeżeli płatny to jednorazowo ~60$ mail firmowy (skrzynka lub przekierowanie) – tu jest potrzebna konfiguracja na serwerze
WordPress (CMS) jest darmowy – trzeba założyć bazę i wgrać go na serwer.

Wtyczki & automatyzacje

Wtyczki i autonomizacje w zależności od potrzeb – tu potrzebna konfiguracja i sensowny dobór dodatków –> zapewniam site działający, backupowany i odporny na ataki. Jeżeli warto będzie coś kupić to wtedy o tym powiem ale raczej wyniknie to z kontekstu prac.

Grafika i teksty

Grafikę i tekst potrzebuję z Tobą/Wami obgadać tak abyśmy mieli wspólną koncepcję co będzie na stronie. Wiąże się to też ze znakiem graficznym i zdjęciami które warto zrobić dobrze i obrobić (Photoshop/watermark/logo). Lepiej dać mniej ale bardzo dobrej jakości niż coś z telefonu. Rozwiązanie jest na tyle intuicyjne że poprawki w tekście menu itp będzie mgli wprowadzać sami

Sklep oraz rezerwacje

Sklep zamówienia/rezerwacje online – jest jak najbardziej do zrobienia ale strona musi na siebie zarabiać. Proponuję to potraktować jako oddzielny temat.

SEO

SEO (Search Engine Optimization) – dołączenie i konfiguracja site do Google Analytics .

Top 5 DevSecOps Tools To Use In 2018

DevSecOps involves creating a ‘Security as Code’ culture with ongoing, flexible collaboration between release engineers and security teams with the aim of bridging traditional gaps between IT and security while ensuring fast, safe delivery of code. In this era where online presence is paramount and a source that makes trading convenient and easy where personal data can be controlled on internet platforms, it is important to be security conscious. With the pros of online services, there are also the cons and this include cyber threats which explores business vulnerability to breach data and security therefore causing possible harm. With that said, it is important to make everyone in the software development life cycle responsible for security to prevent possible threats in the company.

DevSecOps is more about changing IT culture and people’s mindsets when it comes to security measured online and there are various tools to support the development, in this article we will discuss only the top 5 tools to use in 2018.

1. Data management

This is an important tool for everyone who needs security, it helps you to manage the data you share and enables you search, improve and create useful information for data which can be generated. It may not be able to store all your data but it is a vital tool that can help you backup your operation.

2. Threat detection and response

This tool helps you correlate threat indications from firewalls or host sensors then respond to them immediately by resolving the issue with a cleanup as well as update your drive. In the process, it can scan your device to identify possible threats and check the performance and speed.

3. Lifecycle management

In large firms, top management make decisions and share it with other staffs in the enterprise for everyone to be aligned with the strategy and in the process of sharing data, public or private information’s can be distributed which can be confidential. To avoid the risk of getting those information’s to the wrong party the company needs to use an enterprise lifecycle management tool that can provide visibility, backlogs and an insight into the integration server to guarantee an end-to-end compliance with security, privacy and other regulatory requirements.

4. Security unit testing

Security Unit Testing tools help you scan for application security flaws in real time while developers help your business achieve its goals. As much as you can use a tool, you also need a developer to help you test early and development lifecycle to integrate into the existing development toolchain for your e-commerce web design. You also need a Magento support if you are not a developer, to help you with your service, performance update and the maintenance of your ecommerce business.

5. ThreatModeler

This tool automatically analyzes any information a user provides to check for any potential threat based on accurate threat intelligence. This tool also provides the mitigating security requirements and test cases to ensure security implementation.

No New New: Raw Pointers Removed from C++

Two weeks ago, the ISO C++ standard meeting took place in Jacksonville. Today I want to make a short detour and write about the revolutionary decision that was made in the Jacksonville meeting. Additionally, I refer to the Will no Longer Have Pointers by Fluent C++. The standard committee decided that pointers will be deprecated in C++20 and will with very high probability removed in C++23.

To be honest, what seems like a revolution is only the last step in a long evolution. First, let me explain the big picture.

 The evolution of pointers in C++

Pointers are part of C++ since the first beginning. We got them from C. From the first beginning there was always the tendency in C++ to make the handling with pointers more type-safe without paying the extra cost.

With C++98 we got std::auto_ptr to express exclusive ownership. But std::auto_ptr had a big issue. When you copy an std::auto_ptr the resource will be moved. What looks like a copy operation was actually a move operation. The graphic shows the surprising behaviour of an std::auto_ptr.

This was extremely bad and the reason for a lot of serious bugs; therefore, we got std::unique_ptr with C++11 and std::auto_ptr was deprecated in C++11 and finally removed in C++17. Additionally, we got std::shared_ptr and std::weak_ptr in C++11 for handling shared ownership. You can not copy but move an std::unique_ptr and if you copy or assign an std::shared_ptr, the internal reference counter will be increased. Have a look here:

Since C++11 C++ has a multithreading library. This makes the handling with std::shared_ptr quite challenging because an std::shared_ptr is per definition shared but not thread-safe. Only the control-block is thread-safe but not the access to its resource. That means, modifying the reference counter is an atomic operation and you have the guarantee that the resource will be deleted exactly once. This is the reason we will get with C++20 atomic smart pointers: std::atomic_shared_ptr and std::atmic_weak_ptr. Read the details in the proposal: Atomic Smart Pointers.

“A Guide to Becoming a Full-Stack Developer in 2017”

Being a Full-Stack Developer doesn’t mean that you have necessarily mastered everything required to work with the front-end or back-end, but it means that you are able to work on both sides and understand what is going on when building an application.

Full-Stack Web Development, according to the Stack Overflow 2016 Developer Survey, is the most popular developer occupation today. It’s no wonder then that there are dozens of online and in-person programs that will help people become Full-Stack Developers and then even assist these new developers land high-paying programming jobs.

Some popular online programs can be found on Lynda, Udacity, Coursera, Thinkful, General Assembly, and so much more. Aside from these online programs, there are also in-person coding bootcamps that are teaching people the skills required to become web developers.

In this article I won’t be discussing which websites or coding bootcamps have the best web development programs, instead I will be providing a definitive guide to what I believe are the most important skills required to become a Full-Stack Web Developer today and land a job if you’ve never coded before. I will be basing the list off of three things:

  1. A combination of what most programs in 2017 are teaching students.
  2. My own personal experiences from interviewing at companies for developer positions in the past and also interviewing potential candidates for current Full-Stack Developer positions at my current company.
  3. Stories and feedback from people on Coderbyte who have been accepted to coding bootcamps and then proceeded to get programming jobs (see below).

 

“A Guide to Becoming a Full-Stack Developer in 2017” @borowskidaniel https://medium.com/coderbyte/a-guide-to-becoming-a-full-stack-developer-in-2017-5c3c08a1600c

Code Like a Pythonista: Idiomatic Python

Dictionary and Iterators

Dictionaries implement a sq_contains slot that implements the same test as the has_key() method. This means that we can write

if k in dict: ...
which is equivalent to
if dict.has_key(k): ...

Dictionaries implement a tp_iter slot that returns an efficient iterator that iterates over the keys of the dictionary. During such an iteration, the dictionary should not be modified, except that setting the value for an existing key is allowed (deletions or additions are not, nor is the update() method). This means that we can write

    for k in dict: ...

which is equivalent to, but much faster than

for k in dict.keys(): ...

as long as the restriction on modifications to the dictionary (either by the loop or by another thread) are not violated.

Add methods to dictionaries that return different kinds of iterators explicitly:

for key in dict.iterkeys(): ...
for value in dict.itervalues(): ...
for key, value in dict.iteritems(): ...

This means that for x in dict is shorthand for for x in dict.iterkeys().

Other mappings, if they support iterators at all, should also iterate over the keys. However, this should not be taken as an absolute rule; specific applications may have different requirements.

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.

navs = {} for (portfolio, equity, position) in data: navs.setdefault(portfolio, 0) navs[portfolio] += position * prices[equity]

Source: http://www.omahapython.org/IdiomaticPython.html

The best code editors for WordPress developers

Hello! Since you are reading this article, it means that you are a WordPress developer, just like me, and strive to make your work with WordPress as productive as possible.

What do we have to do when creating sites on WordPress? We do not just edit PHP files. We should be a programmer and WEB-designer, have the skills to work with HTML, CSS and JavaScript, as it is necessary for a successful WEB-programming.

And a modern IDE or text editor that wants to win the favor of users should provide support for all the necessary languages and technologies.

As a rule, to manage several projects you need a full PHP development environment, such as PhpStorm or CodeLobster. But I also use text editors too, for example if I need to quickly correct a template or modify the code of my function.

Creators of code editors are constantly working on adding new and expanding existing capabilities of their products to support CMS WordPress. Because the community of programmers understand the importance of implementing WordPress support in their software.

I had to spend a lot of time to pick up several IDEs and text editors with advanced features and convenient functionality for WordPress developers.

I suggest you to discover these wonderful programs.

SublimeText

Sublime Text is a fast text editor with a fashionable user interface. It perfectly supports HTML, CSS and JavaScript syntax without additional plug-ins.

To expand the functionality and add tools for WordPress developers, you need to install special packages.

Run the program and go to the main menu “Tools” -> “Install Package Control …”. Package Control is a package that allows you to manage other plug-ins.

After that, you can download, install and remove plug-ins. To start the Package Control, go to the main menu “Preferences” -> “Package Control”.

In order for the program to load the list of available modules, it is necessary to select from the list or enter from the keyboard the command “Install Package”.

Let’s enter “WordPress” in the search bar to filter out the plug-ins specific to this CMS.

From the list, you can immediately select the first “WordPress” package and install it by double-clicking it. This package adds a set of snippets and the ability to auto-complete the functions of WordPress.

Sublime Text

The next plugin we select from the list is called “Search WordPress Codex”. Using it, you can search the official WordPress online help directly from the editor.

For example, right-click on the function and select “WordPress Codex” -> “Search Selection” from the context menu to view online help on it.

Sublime Text

Also there are several popular extensions that you should pay attention to, for example:

  • WordPress snippets – provides a collection of snippets for WordPress programmers.
  • WordPress New Project Config – helps you to create and configure a new project for WordPress CMS.
  • Genesis – facilitates the work of the creators of themes for WordPress, which use the child themes of Genesis.

Atom

Atom is another text editor with a lot of advanced functions and beautiful design. It positions itself as an IDE and successfully competes with other similar programs, such as Sublim Text and Rapid PHP.

Atom is based on themes and packages, so it has a wide range of functions and is flexibly configured. It has its own package manager, which we will use to install WordPress support.

Launch Atom and go to the main menu “File” -> “Settings”. In the opened settings tab, click on “Install”.

Now, to find new packages, enter the keyword “wordpress” in the search field and press “Enter”. You can also click on the “Packages” button.

In the list that appears, let’s choose one of the popular packages, for example – Autocomplete WordPress Hooks. This extension will help the developer by providing the completion of WordPress Actions and Filters.

Find this package in the list and click the “Install” button. After a minute we will see that the package is installed.

Now check the functionality of the just added module. Start type the name of the function and press Ctrl + Space.

Atom Now check the functionality of the just added module. Start type the name of the function and press Ctrl + Space.
Atom

After that, we can also use the hints on the parameters of the function.

Atom

The algorithm for working with other packages is the same. Just read the description, and if the functionality is suitable, install it.

For example, you can install the following add-ons:

  • WordPress API – this add-on greatly speeds up the development process, offering useful WordPress snippets.
  • WordPress Dictionary for Atom – adds snippets for all WordPress functions, including Actions and Filters.

Rapid PHP

Rapid PHP is also a good editor with support of PHP, HTML, CSS and JavaScript. It successfully combines the functionality of the real IDE with high speed.

It is not resource-demanding, has a built-in PHP debugger, supports HTML5, CSS3 and several frameworks, including WordPress.

For higher performance, ability to work with frameworks is disabled by default. To enable WordPress support, go to the main menu “Options” -> “Frameworks”.

In the list that appears, you can select one or more libraries that you want to work with. In this case, choose WordPress and click “OK”.

In the next step, let’s create the project, for that we go to the main menu and select “Project” -> “New Project”.

Now enter the project name and path to the project files. In this example, specify the folder with WordPress installed.

When the project is created, you can view its contents in the right pane of the program using the file browser.

Rapid PHP provides the programmer with ability to use the autocompletion feature when pressing the Ctrl + Space keys.

Rapid PHP
Rapid PHP

You can also trigger an instant prompt on WordPress functions by pressing Shift + Ctrl + Space.

Rapid PHP
Rapid PHP

If in the process of work you need to use the online help for any PHP function, just place the cursor on its name and press the F1 key. The page with online help will be displayed in the browser installed on the system.

CodeLobster

CodeLobster is a functional IDE that provides a complete set of tools for the web developer.

It has an editor of PHP, HTML, CSS and JavaScript with suggestions and autocompletion.

CodeLobster allows you to work with databases directly from the IDE, edit PHP files on the local computer and on a remote server using FTP.

Among other things, you can use PHP debugger, contextual and dynamic help.

There is a convenient function of installing WordPress directly from the program. In addition to that the CMS is installed and configured instantly, much faster than via the WEB-interface.

For example, to create a project, go to the main menu “Project” -> “Create Project …”.

Then in the dialog box, you can specify the type of the project, which will be created using the framework or one of the popular CMS.

Select “Create Empty WordPress Site”, enter the name and specify the location of the directory for installation. Then the New WordPress Site Wizard will run.

It will take only a few steps to configure the connection to the database and at the last step specify the parameters of our blog.

After clicking the “Finish” button, the fresh WordPress distribution will be installed and a new project will be created, you can immediately start working.

If we move the mouse pointer to any function name, we get information about it in a tooltip.

CodeLobster

For full information about this function from the official WordPress documentation, it is enough to select it and press the F1 key.

To use autocompletion, just start typing the name of the function and press Ctrl + Space.

CodeLobster

CodeLobster includes the WordPress plugin in its professional version. That allows the developer to quickly start working with this CMS, since no additional installation is required.

PhpStorm

PhpStorm is a PHP IDE with many convenient features for the web developer. This programming environment is built on the IntelliJ IDEA platform and inherited all the capabilities of the parent platform.

For WordPress programmers, the distribution of the IDE comes with a special plug-in for integration with WordPress.

To start working, you need to register WordPress in the program. Start PhpStorm and go to the main menu “File” -> “Settings …”.

In the settings we will find the section “Languages & Frameworks” and select the “PHP” item. Then in the “Include Path” tab we press the plus button and specify the path to the installed CMS.

The directory with the installation will be indexed, this will allow us to use the WordPress source code when navigating through functions and showing dynamic help.

In addition, you can set the WordPress coding style, which for sure has already became familiar to WordPress developers.

In the program settings window, go to “Editor” -> “Code Style” -> “PHP”. Click on the link “Set from …” and select “Predefined Style” -> “WordPress” from the drop-down list.

Click “OK” to save the settings.

Now consider the process of creation of a new project. In the main menu, select “File” -> “New Project …”.

In the opened dialog, go to the “WordPress Plugin” section and specify the directory for the project and the second one – there the WordPress is installed.

Choose the location of the project in the folder with WordPress. Then click “Create” – so we create a project based on the existing source files.

You should wait a few seconds while PhpStorm scans the files. After that the project is opened and we can continue to study the functions of the program.

To use auto-completion, start entering the name of the function and press Ctrl + Space.

PhpStorm

It is enough just to set the cursor to the function name and press Ctrl + Q to get dynamic help on this function.

PhpStorm

IDE also supports WordPress Actions and Filters. When you press Ctrl + Space, you can quickly get a dynamic hint about the existing parameters.

This review can be completed for now. As you can see, all of the programs in this article have their advantages.

Which one to choose? A simple and lightweight text editor, such as Rapid PHP, or a complex IDE, such as PhpStorm?

I chose CodeLobster, that combines the speed of work, functionality and ease of setting up WordPress projects. I’m happy to add it to my set of web development tools.

It’s very interesting to know what your favorite editor is? Do you create sites on WordPress, or use another CMS? I suggest sharing your experience with other readers. I really look forward to your comments.

 

Python rename special characters in filename

Problem

When upload files to One Drive i have problem with files contain special characters. Below you found Python script witch remove any special characters form filenames. Change

lv_path = "D:\\Netbeans Projects"

and enjoy!

Solution

rename spec characters (Python 3+, W7)
#!/usr/bin/env python
#
# wychwytywanie i zmiana nazwy plików
#
import os
import string
import re
import sys

delchars = ''.join(c for c in map(chr, range(256)) if not c.isalnum())

# paths = (os.path.join(root, filename)
#          for root, _, filenames in os.walk('.')
#          for filename in filenames)

# print(paths)
lv_path = "D:\\Netbeans Projects"

paths = (os.path.join(root, filename)
         for root, _, filenames in os.walk(lv_path)
         for filename in filenames)

print ("Search at " + lv_path)

for path in paths:
    newname = path.replace('#', '')
    newname = newname.replace('%', '')
    newname = newname.replace('*', '')
    newname = newname.replace('<', '')
    newname = newname.replace('>', '')
    newname = newname.replace('*', '')
    newname = newname.replace('?', '')
    newname = newname.replace('$', '')
    #newname = newname.replace('!', '')
    #newname = path.replace('\'', '-')
    newname = newname.replace('"', '')
    newname = newname.replace('\'', '')
    newname = path.replace('Å', 'ś')
    newname = path.replace('Å', 'ń')
    #newname = path.translate(str.maketrans("","",delchars))

    #re.sub('[^\w\-_\. ]', '_', newname)

    if newname != path:
        # print(path)
        print(os.path.dirname(path.encode('utf8').decode(sys.stdout.encoding)) + "\t" + os.path.basename(path.encode('utf8').decode(sys.stdout.encoding)) +
              "\t\t\t -> " + os.path.basename(newname.encode('utf8').decode(sys.stdout.encoding)))
        os.rename(path, newname)

Source(s)

Java wariacje z ciągiem Fibonacciego

Zadanie

Utwórz rekurencyjna metode obliczajaca ciag Fibonacciego, zdefiniowany dla elementu fibonacci(n) jako sume fibonacci(n-1) + fibonacci(n-2) przy załozeniu, ze fibonacci(1) i fibonacci(2) maja odpowiednio wartosci 1 i 2.

Ciąg Fibonaciego

In mathematics, the Fibonacci numbers are the numbers in the following integer sequence, called the Fibonacci sequence, and characterized by the fact that every number after the first two is the sum of the two preceding ones:[1][2]

1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , …

Often, especially in modern usage, the sequence is extended by one more initial term:

0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , …[3]

The Fibonacci spiral: an approximation of the golden spiral created by drawing circular arcs connecting the opposite corners of squares in the Fibonacci tiling;[4] this one uses squares of sizes 1, 1, 2, 3, 5, 8, 13, 21, and 34.

By definition, the first two numbers in the Fibonacci sequence are either 1 and 1, or 0 and 1, depending on the chosen starting point of the sequence, and each subsequent number is the sum of the previous two.

In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation

{\displaystyle F_{n}=F_{n-1}+F_{n-2},}

with seed values[1][2]

  {\displaystyle F_{1}=1,\;F_{2}=1}

or[5]

{\displaystyle F_{0}=0,\;F_{1}=1.}

The Fibonacci sequence is named after Italian mathematician Leonardo of Pisa, known as Fibonacci. His 1202 book Liber Abaci introduced the sequence to Western European mathematics,[6] although the sequence had been described earlier as Virahanka numbers in Indian mathematics.[7][8][9] The sequence described in Liber Abaci began with F1 = 1.

Fibonacci numbers are closely related to Lucas numbers  L_{n} in that they form a complementary pair of Lucas sequencesU_{n}(1,-1)=F_{n} and V_{n}(1,-1)=L_{n}. They are intimately connected with the golden ratio; for example, the closest rational approximations to the ratio are 2/1, 3/2, 5/3, 8/5, … .

Fibonacci numbers appear unexpectedly often in mathematics, so much so that there is an entire journal dedicated to their study, the Fibonacci Quarterly. Applications of Fibonacci numbers include computer algorithms such as the Fibonacci search technique and the Fibonacci heap data structure, and graphs called Fibonacci cubes used for interconnecting parallel and distributed systems. They also appear in biological settings,[10] such as branching in trees, phyllotaxis (the arrangement of leaves on a stem), the fruit sprouts of a pineapple,[11] the flowering of an artichoke, an uncurling fern and the arrangement of a pine cone‘s bracts.[12]

— Source: https://en.wikipedia.org/wiki/Fibonacci_number

Closed form

\(x_{n}=\frac{(1+5^{1/2})^{n} -(1-5^{1/2})^n}{\sqrt{5}2^n}\)

https://math.stackexchange.com/questions/1145342/find-a-formula-for-the-nth-fibonacci-number?newreg=1b687d38e42346fa97a2fdfe3a94c389

Java program and others interesting links

Sources from Bitbucket

bitbucket-icon

 

 

/*
 * Example program to find fibonacci numbers
 */
package Fibonacci;

import static java.lang.Math.sqrt;
import java.util.Scanner;

/**
 *
 * @author KPreiskorn
 */
public class Fibonacci {

  /**
   * @param args the command line arguments
   */
  @SuppressWarnings("resource")
  public static void main(String args[]) {

    // input to print Fibonacci series upto how many numbers
    log("Enter number n Fibonacci to print: ");
    int number = new Scanner(System.in).nextInt();

    log("\nUsing Method-1: Using Recursion. Provided Number: " + number);
    // printing Fibonacci series upto number
    for (int i = 1; i <= number; i++) {
      System.out.printf("%3d %6d\n", i, fibonacciRecusion(i));
    }

    log("\nMethod-2: Fibonacci number at location " + number + " is ==> " + (fibonacciLoop(number) + ""));

    System.out.printf("\nMethod #3 (fibonacciClosedForm): Fibonacci number at location %d is %.0f\n\n", number, fibonacciClosedForm(number));

  }

  // Method-1: Java program for Fibonacci number using recursion.
  public static int fibonacciRecusion(int number) {
    if (number == 1 || number == 2) {
      return 1;
    }

    return fibonacciRecusion(number - 1) + fibonacciRecusion(number - 2); // tail recursion
  }

  // Method-2: Java program for Fibonacci number using Loop.
  public static int fibonacciLoop(int number) {
    if (number == 1 || number == 2) {
      return 1;
    }
    int fibo1 = 1, fibo2 = 1, fibonacci = 1;
    for (int i = 3; i <= number; i++) {
      fibonacci = fibo1 + fibo2; // Fibonacci number is sum of previous two Fibonacci number
      fibo1 = fibo2;
      fibo2 = fibonacci;

    }
    return fibonacci; // Fibonacci number
  }

  // metod 3: Closed-form expression
  public static double fibonacciClosedForm(int n) {
    double q = (1 + sqrt(5)) / 2;

    return Math.floor(Math.pow(q, n) / sqrt(5) + 1 / 2); // Fibonacci number
  }

  private static void log(String number) {
    System.out.println(number);

  }

}

What are the best programming fonts?

The choice the font in Firefox or Sulbimetext it is always hard decision….

As much as choice of a font is subjective there are important criteria to consider when choosing a programming font. The characters should be clear, easy to read, in cases of clashing ones such as 1, l, i or O, o, 0 easily distinguishable, differences between different kinds of brackets, quotes and parentheses should be clear, punctuation should be emphasized and they shouldn’t break up words or sentences due to uneven character widths. There are two ways fonts are drawn – as bitmaps or as vectors. Vector fonts allow more efficient scaling, but for screens with resolution below 720p it might be worth considering bitmap fonts as they are generally more legible at smaller sizes on low-resolution screens.

Source: What are the best programming fonts? – Slant

Java – Suma kolejnych liczb całkowitych od 5 do 1000

Zadanie 1. Suma kolejnych liczb całkowitych od 5 do 1000

Sumowanie – operacja dodawania ciągu liczb, której wynikiem jest suma. Jeśli liczby są dodawane kolejno od lewej do prawej to pośrednie wyniki nazywa się sumami częściowymi lub cząstkowymi. Sumowane liczby (zwane składnikami) mogą być całkowite, rzeczywiste lub zespolone. Oprócz liczb sumowaniu mogą podlegać również inne wielkości: wektory, macierze, wielomiany, lub ogólnie, elementy grupy addytywnej (a nawet monoid). Dla ciągów o skończonej liczbie takich elementów sumowanie zawsze zwraca dobrze określoną sumę.

Sumowanie ciągów nieskończonych nie zawsze jest możliwe, a kiedy wartość nieskończonego sumowania może być podana, to obejmuje ona więcej niż tylko zwykłą operację dodawania, mianowicie pojęcie granicy. Sumowanie nieskończonych ciągów tworzy konstrukcję zwaną szeregiem. Innym pojęciem obejmującym granice skończonych sum jest całka. Pojęcie sumowania nabiera szczególnego znaczenia w powiązaniu z ekstrapolacją w kontekście szeregów rozbieżnych.

Sumowanie ciągu [1, 2, 4, 2] to wyrażenie, którego wartością jest suma wszystkich elementów ciągu. W podanym przykładzie to 1 + 2 + 4 + 2 = 9. Ponieważ dodawanie jest łączne, wynik nie zależy od kolejności wykonywanych działań, na przykład (1 + 2) + (4 + 2) lub 1 + ((2 + 4) + 2) daje w wyniku 9, stąd zazwyczaj pomijane są nawiasy w przypadku wielokrotnego dodawania. Dodawanie jest ponadto przemienne, więc permutacja wyrazów skończonego ciągu również nie zmienia jego sumy (w przypadku ciągów nieskończonych ta właściwość nie zawsze jest prawdziwa; zobacz twierdzenie Riemanna o szeregach warunkowo zbieżnych i kryteria zbieżności szeregów).

Nie ma specjalnego wyróżnionego zapisu sumowania jawnie podanych ciągów gdyż odpowiadające mu wyrażenie wielokrotnego dodawania jest w tym przypadku wystarczające. Drobne trudności pojawiają się gdy ciąg jest jednoelementowy: sumowanie ciągu jednoelementowego nie zawiera znaku dodawania (jest więc nieodróżnialne od wyniku) a sumowanie ciągu pustego nie da się nawet zapisać (lecz można podać w jego sumę „0”). Jednak gdy wyrazy ciągu układają się w jakiś wzór to użyteczny a nawet niezbędny staje się operator sumowania. Na przykład jeśli rozpatrywać sumowanie liczb całkowitych od 1 do 100 można wykorzystać wielokropek w wyrażeniu dodawania aby oznaczyć brakujące wyrazy: 1 + 2 + 3 + … + 99 + 100. W tym przykładzie wzór jest łatwy do odgadnięcia, lecz dla bardziej skomplikowanych przypadków konieczne jest bardziej precyzyjne określanie kolejnych wyrazów, które można osiągnąć dzięki operatorowi „Σ”. Korzystając z tego operatora ten sam przykład można zapisać jako:

  \sum _{{i=1}}^{{100}}i

Wartością tego sumowania jest 5050. Można ją znaleźć bez wykonywania 99 dodawań, ponieważ można wykazać (metodą indukcji matematycznej), że

  \sum _{{i=1}}^{n}i={\frac {n(n+1)}2}

dla wszystkich liczb naturalnych n.

— źródło Wiki https://pl.wikipedia.org/wiki/Sumowanie

Zadanie 2. Utwórz tablice 5-cio elementową i wygeneruj do niej losowe wartości z przedziału <-10, 10>

Zadanie 3. Oblicza ile jest dodatnich elementów w tablicy myIntArray.

np. odpowiedź programu: W tablicy myIntArray[5] jest/są  3 dodatnie elementy

Source from Bitbucket https://bitbucket.org/karol-preiskorn/java-examples/overview

/**
 *
 * SumN - java examples
 * 
 * 2017.11.26 new bitbucket repository 
 *
 */
package sum_natural;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

/*
 * https://slf4j.org/manual.html
 */
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * main class
 * 
 * @ver 2017-11-27 poprawki nazw pakietów
 * 
 * 
 */
public class Sum_natural {
  
  /**
   * @param args
   *          the command line arguments
   */
  static Logger logger = LoggerFactory.getLogger("SumN");
  
  public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
    
    logger.info("start");
    
    // TODO code application logic here
    
    int suma; //
    int rn;
    int dodatnie;
    dodatnie = 0;
    suma = 0;
    
    int firstArg = 0;
    if (args.length > 0) {
      try {
        firstArg = Integer.parseInt(args[0]);
        
        if (firstArg < 5) {
          System.err.println("Argument" + args[0] + " musi być większy od zera.");
          System.exit(1);
        }
      } catch (NumberFormatException e) {
        System.err.println("Argument" + args[0] + " must be an integer.");
        logger.error("Argument" + args[0] + " must be an integer.");
        System.exit(1);
      }
      
      for (int i = 5; i <= firstArg; i++) {
        suma += i;
      }
      logger.info("Z1P1: Suma kolejnych liczb całkowitych od 5 do " + args[0] + " wynosi " + suma);
    } else {
      
      for (int i = 5; i <= 1000; i++) {
        suma += i;
      }
      logger.info("Z1P1: Suma kolejnych liczb całkowitych od 5 do 1000 jest równa: " + suma);
    }
    
    logger.info("Z1P2: Utwórz tablice n elemntów i wygeneruj do niej wartości z przedziału <-10, 10>");
    
    // deklaracja tablicy
    int[] myIntArray = new int[10];
    
    String v_array = "myIntArray[" + myIntArray.length + "] = { ";
    
    for (int i = 0; i < myIntArray.length; i++) {
      rn = -10 + (int) (Math.random() * 20);
      myIntArray[i] = rn;
      v_array += rn;
      if (i < myIntArray.length - 1) {
        v_array += ", ";
      }
    }
    
    v_array += " }";
    logger.info(v_array);
    
    logger.info("Z1P3: Oblicza ile jest dodatnich elementów w tablicy myIntArray[" + myIntArray.length + "]");
    
    for (int i = 0; i < 10; i++) {
      
      if (myIntArray[i] > 0) {
        dodatnie++;
      }
    }
    
    logger.info("W tablicy myIntArray[" + myIntArray.length + "] jest/sa  " + dodatnie + " dodatnie elementy");
    
    /*
     * @var http://stackoverflow.com/questions/2885173/how-to-create-a-file-and-write-to- a-file-in-java#2885224
     */
    
    try (PrintWriter writer = new PrintWriter("dodatnie.txt", "UTF-8")) {
      writer.println("W tablicy myIntArray[" + myIntArray.length + "] sa " + dodatnie + " dodatnie elementy.");
      writer.close();
      
    } catch (IOException e) {
    }
    
    try (Writer writer = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream("dodatnie2.txt"), StandardCharsets.UTF_8))) {
      writer.write("W tablicy myIntArray[" + myIntArray.length + "] sa  " + dodatnie + " dodatnie elementy");
    } catch (IOException ex) {
      // handle me
    }
    
    /*
     * Suma kwadratów n pierwszych liczb naturalnych (w przygotowaniu)
     * 1^{2}+2^{2}+3^{2}+4^{2}+\dots+n^{2}=\sum_{k=1}^{n}k^{2}=\frac{n(n+1)(2n+1)}{6}=s_{2}
     */
    int n = 100;
    
    logger.info("Suma kwartat�w liczn naturalnych od 1 do n = " + n + " frac{n(n+1)(2n+1)}{6} = "
        + (n * (n + 1) * (2 * n + 1) / 6));
    
    logger.info("END");
  }
  
}

Zapis wyników do pliku

    /*
     * @var http://stackoverflow.com/questions/2885173/how-to-create-a-file-and-write-to- a-file-in-java#2885224
     */
    
    try (PrintWriter writer = new PrintWriter("dodatnie.txt", "UTF-8")) {
      writer.println("W tablicy myIntArray[" + myIntArray.length + "] sa " + dodatnie + " dodatnie elementy.");
      writer.close();
      
    } catch (IOException e) {
    }
    
    try (Writer writer = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream("dodatnie2.txt"), StandardCharsets.UTF_8))) {
      writer.write("W tablicy myIntArray[" + myIntArray.length + "] sa  " + dodatnie + " dodatnie elementy");
    } catch (IOException ex) {
      // handle me
    }

Dodanie logowania log4j (w przygotowaniu)

uses log4j in code
static Logger logger = LoggerFactory.getLogger("SumN");	  

logger.info("start");

  1. https://alvinalexander.com/blog/post/java/sample-how-format-log4j-logging-logfile-output
  2. https://alvinalexander.com/blog/post/java/how-print-exception-stack-trace-using-log4j-commons
  3. https://logging.apache.org/log4j/1.2/manual.html

Suma kwadratów n pierwszych liczb naturalnych (w przygotowaniu)

\(1^{2}+2^{2}+3^{2}+4^{2}+\dots+n^{2}=\sum_{k=1}^{n}k^{2}=\frac{n(n+1)(2n+1)}{6}=s_{2}\)

https://pl.wikisource.org/wiki/Sumy

    /*
     * Suma kwadratów n pierwszych liczb naturalnych (w przygotowaniu)
     * 1^{2}+2^{2}+3^{2}+4^{2}+\dots+n^{2}=\sum_{k=1}^{n}k^{2}=\frac{n(n+1)(2n+1)}{6}=s_{2}
     */
    int n = 100;
    
    logger.info("Suma kwartat�w liczn naturalnych od 1 do n = " + n + " frac{n(n+1)(2n+1)}{6} = "
        + (n * (n + 1) * (2 * n + 1) / 6));
    
    logger.info("END");
  }
  

SublimeText 3 tips and customization

I think that is one of best text editor for Linux and W$. Bellow I add some tips and usefully configuration.

Regexp conversion to Wiki links

Conversion to Wiki links add [ before and ] after text.

Find what: (http.{2,})
Relpace to: [\1]

Polish letters in Sublimetext 3

Polskie znaki diakrytyczne w Sublime Text 3 – dodanie wpisów do Key Bindings – User (na platformie Windows jest to plik Default (Windows).sublime-keymap):

[
{"keys": ["control+alt+a"], "command": "insert", "args": {"characters": "ą"}},
{"keys": ["control+alt+c"], "command": "insert", "args": {"characters": "ć"}},
{"keys": ["control+alt+e"], "command": "insert", "args": {"characters": "ę"}},
{"keys": ["control+alt+l"], "command": "insert", "args": {"characters": "ł"}},
{"keys": ["control+alt+n"], "command": "insert", "args": {"characters": "ń"}},
{"keys": ["control+alt+o"], "command": "insert", "args": {"characters": "ó"}},
{"keys": ["control+alt+s"], "command": "insert", "args": {"characters": "ś"}},
{"keys": ["control+alt+x"], "command": "insert", "args": {"characters": "ź"}},
{"keys": ["control+alt+z"], "command": "insert", "args": {"characters": "ż"}},
{"keys": ["shift+control+alt+a"], "command": "insert", "args": {"characters": "Ą"}},
{"keys": ["shift+control+alt+c"], "command": "insert", "args": {"characters": "Ć"}},
{"keys": ["shift+control+alt+e"], "command": "insert", "args": {"characters": "Ę"}},
{"keys": ["shift+control+alt+l"], "command": "insert", "args": {"characters": "Ł"}},
{"keys": ["shift+control+alt+n"], "command": "insert", "args": {"characters": "Ń"}},
{"keys": ["shift+control+alt+o"], "command": "insert", "args": {"characters": "Ó"}},
{"keys": ["shift+control+alt+s"], "command": "insert", "args": {"characters": "Ś"}},
{"keys": ["shift+control+alt+x"], "command": "insert", "args": {"characters": "Ź"}},
{"keys": ["shift+control+alt+z"], "command": "insert", "args": {"characters": "Ż"}}
]

Adding comma to each line using sublime text

To add comma to any line

  1. Select the lines you want to modify
  2. CTRL + SHIFT + L
  3. RIGHT_ARROW
  4. COMMA

Using ctrl + shift + L is how you can modify all selected lines. Very handy 🙂 Make batch edits with Multiple Selections.

Column Selection can be used to select a rectangular area of a file. Column selection doesn’t operate via a separate mode, instead it makes use of multiple selections.

You can use additive selections to select multiple blocks of text, or subtractive selections to remove a block.

‘Find What’: $ // matching all ends of your lines
‘Replace With’: , // replaces all line ends with a coma

MXU20623GAD
MXU20899GAA
MXU20975GAA
MXU24246GAD
MXU29901GAA
MXU30079GAA
MXU30090GAA
MXU34015GAA
Sublimetext array

Solve this problem

Source: Best of Sublime Text 3: Features, Plugins, and Settings | Scotch

Emmet is usefull

Emmet is an absolute time saver. You can build HTML on the fly easily and quickly.

To Use: ctrl + alt + enter and start typing your Emmet styled HTML

  • ctrl + d: Select the current word and the next same word
  • ctrl + click: Every place you click will create a cursor to edit
  • ctrl + shift + f AND alt + enter: Find a word in your files and then select them all
Emmet in sublimetext

Check out our Emmet Interactive Guide to learn more and try out Emmet for yourself.

DocBlockr

A really great way to easily create doc blocks for many languages including JavaScript, PHP, and CoffeeScript. Just type in /** above your function and press tab. Watch the magic as DocBlockr takes the function name and variables and creates your doc block.

sublime-docblockr-example-start
sublime-docblockr-example-finish

BracketHighlighter

This plugin provides bracket highlighting for all sorts of brackets.

brackethighlighter

Sublime Text 3 is an amazing piece of software. To start, it is a clean, functional, and fast code editor. Not only does it have incredible built in features (multi-edit and vim mode), but it has support for plugins, snippets, and many other things.

Source: Best of Sublime Text 3: Features, Plugins, and Settings | Scotch

Reference links

Programowanie współbieżne C na Linux – przykłady

Przykładowe zadania z programowania współbieżnego na systemie Linux

  1. Napisz program, który pokazuje, które atrybuty procesu macierzystego są dziedziczone przez proces potomny uruchomiony za pomocą funkcji fork(), które zaś otrzymują nową wartość.
  2. Napisz program, który pokazuje, które atrybuty procesu są zachowane przez proces po wykonaniu funkcji exec().
  3. Napisz program, który wyświetla identyfikator procesu (PID) i nazwę związanego z nim polecenia dla wszystkich procesów uruchomionych przez użytkownika podanego w wierszu wywołania programu.
/**
 * Uzupełnij program shell z o „ręczną” obsługę potoków.
 * ----------------------------------------------------
 * Napisz program, który zbiera komunikaty od wielu programów i wyświetla je na ekranie. Do komunikacji użyj potoku nazwanego.
 *
 * Wskazówka: Utwórz program rdfifo, którego zadaniem jest utworzenie kolejki FIFO i czytanie z niej danych.
 * Utwórz program wrfifo, który otwiera kolejkę FIFO tylko do zapisu i wpisuje do niej dane (np. swoj pid i czas).
 *
 * Q: W jaki sposób przekażesz wspólną nazwę kolejki FIFO do tych programów?
 * A: przez zmienną statyczą
 *
 * Q: W jaki sposób zapewnić działanie programu zbierającego komunikaty również wtedy, kiedy nie ma programu piszącego do łącza?
 * A: przez proces pętli nieskończonej ze sleep
 *
 * Q: Jak zapewnić to, że komunikaty pochodzące od różnych programów wyświetlane są w całości, tzn. nie są rozdzielane  komunikatami od innych programów?
 * A: flush? (do sprawdzenia).
 *
 */

Wskazówka: informacje te można uzyskać przeglądając katalog /proc z plików (interesują nas katalogi, których właścicielem jest dany użytkownik) i pliki /proc/PID/status

Sources

C programing tutorial

 

Example solution 1 (draft)

# README #



## Uzupełnij program shell z o „ręczną” obsługę potoków.

Napisz program, który zbiera komunikaty od wielu programów i wyświetla je na ekranie. Do komunikacji użyj potoku nazwanego. Wskazówka: Utwórz program rdfifo, którego zadaniem jest utworzenie kolejki FIFO i czytanie z niej danych.

* Q: W jaki sposób przekażesz wspólną nazwę kolejki FIFO do tych programów?
* A: przez zmienną statyczą
* Q: W jaki sposób zapewnić działanie programu zbierającego komunikaty również wtedy, kiedy nie ma programu piszącego do łącza?
* A: przez proces pętli nieskończonej ze sleep
* Q: Jak zapewnić to, że komunikaty pochodzące od różnych programów wyświetlane są w całości, tzn. nie są rozdzielane  komunikatami od innych programów?
* A: flush? (do sprawdzenia).

### Zrzut z działania:

```
[23:30:20](pid 17400) DEBUG: Passed rdfifo 73 - while1

karol@carlo:~/eclipse-workspaces/unx_sys_programming/Debug$ ./unx_sys_programming -w

Input option value=(null) set program to write to FIFO

[23:30:20](pid 17411) DEBUG: Passed wrfifo 148 : mkfifo exist: 17
[23:30:20](pid 17411) DEBUG: Passed wrfifo 157 - pipe opened to read-write
[23:30:20](pid 17400) DEBUG: Passed rdfifo 104 - Remove FIFO
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #0 test PID: 17411: text -> Thu Jan 28 23:36:02 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #0 test PID: 17411: text -> Thu Jan 28 23:36:02 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #1 test PID: 17411: text -> Thu Jan 28 23:36:03 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #1 test PID: 17411: text -> Thu Jan 28 23:36:03 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #2 test PID: 17411: text -> Thu Jan 28 23:36:04 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #2 test PID: 17411: text -> Thu Jan 28 23:36:04 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #3 test PID: 17411: text -> Thu Jan 28 23:36:05 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #3 test PID: 17411: text -> Thu Jan 28 23:36:05 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #4 test PID: 17411: text -> Thu Jan 28 23:36:06 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #4 test PID: 17411: text -> Thu Jan 28 23:36:06 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #5 test PID: 17411: text -> Thu Jan 28 23:36:07 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #5 test PID: 17411: text -> Thu Jan 28 23:36:07 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #6 test PID: 17411: text -> Thu Jan 28 23:36:08 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #6 test PID: 17411: text -> Thu Jan 28 23:36:08 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #7 test PID: 17411: text -> Thu Jan 28 23:36:09 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #7 test PID: 17411: text -> Thu Jan 28 23:36:09 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #8 test PID: 17411: text -> Thu Jan 28 23:36:10 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #8 test PID: 17411: text -> Thu Jan 28 23:36:10 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #9 test PID: 17411: text -> Thu Jan 28 23:36:11 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #9 test PID: 17411: text -> Thu Jan 28 23:36:11 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 180 - close fd
[23:30:20](pid 17400) DEBUG: Passed rdfifo 112 - EOF reader

[10]   Done                    ./unx_sys_programming -r

bash:~/eclipse-workspaces/unx_sys_programming/Debug$ ./unx_sys_programming -h

Program FIFO
Program bez argumentów tworzy named pipe a w procesie potomnym zapisuje do niego dane.
Program mozna wywołać z argumentami tak aby działał jako odczyt (r) z pipe lub zapis do pipe (w).
Zapisywane są do pipe couner, PID i curenttime.

Usage: ./unx_sys_programming [-r] [-w]
```

## Przykład użycia


```
./unx_sys_programming

```

lub


```
./unx_sys_programming -r
./unx_sys_programming -w
./unx_sys_programming -w
./unx_sys_programming -w
```

# Fork read environ - zadania

* z1: Napisz program, który pokazuje, które atrybuty procesu macierzystego są dziedziczone przez proces potomny  uruchomiony za pomocą funkcji fork(), które zaś otrzymują nową wartość.
* z2: Napisz program, który pokazuje, które atrybuty procesu są zachowane przez proces po wykonaniu funkcji exec().
* z3: Napisz program, który wyświetla identyfikator procesu (PID) i nazwę związanego z nim polecenia dla wszystkich procesów uruchomionych przez użytkownika podanego w wierszu wywołania programu. Wskazówka: informacje te można uzyskać przeglądając katalog /proc z plików (interesują nas katalogi, których właścicielem jest dany  użytkownik) i pliki /proc/PID/status
 
Każdy proces charakteryzuje się pewnymi atrybutami. Należą do nich

 * Identyfikator procesu PID
 * Identyfikator procesu macierzystego PPID
 * Rzeczywisty identyfikator właściciela procesu
 * Rzeczywisty identyfikator grupy procesu
 * Efektywny identyfikator właściciela procesu
 * Efektywny identyfikator grupy procesu
 * Katalog bieżący i katalog główny
 * Maska tworzenia pliku
 * Identyfikator sesji
 * Terminal sterujący
 * Deskryptory otwartych plików
 * Ustalenia dotyczące obsługi sygnałów
 * Ustawienia zmiennych środowiskowych
 * Ograniczenia zasobów
 
Potomek dziedziczy z procesu potomnego wiele własności: rzeczywisty identyfikator użytkownika, rzeczywisty identyfikator grupy, obowiązujący identyfikator użytkownika, obowiązujący identyfikator grupy, identyfikatory dodatkowych grup, identyfikator sesji, terminal sterujący, sygnalizator ustanowienia identyfikatora użytkownika oraz sygnalizator ustanowienia identyfikatora grupy, deskryptory otwartych plików (są kopiowane) bieżący katalog roboczy, katalog główny,
 maskę tworzenia plików, maskę sygnałów oraz dyspozycje obsługi sygnałów, sygnalizator zamykania przy wywołaniu funkcji exec (close-on-exec) dla wszystkich otwartych deskryptorów plików, środowisko, przyłączone segmenty pamięci wspólnej,
 ograniczenia zasobów systemowych. Są jednak pewne różnice między procesem macierzystym a potomnym:
 wartość powrotu z funkcji fork, różne identyfikatory procesów, inne identyfikatory procesów macierzystych - w procesie potomnym jest to identyfikator procesu macierzystego; w procesie macierzystym identyfikator procesu macierzystego nie zmienia się, w procesie potomnym wartości tms_utime, tms_cutime i tms_ustime są równe 0,
 potomek nie dziedziczy rygli plików, ustalonych w procesie macierzystym, w procesie potomnym są zerowane wszystkie zaległe alarmy, w procesie potomnym jest zerowany zbiór zaległych sygnałów.

#include <asm-generic/errno-base.h>

/**
 * Uzupełnij program shell z o „ręczną” obsługę potoków.
 * ----------------------------------------------------
 * Napisz program, który zbiera komunikaty od wielu programów i wyświetla je na ekranie. Do komunikacji użyj potoku nazwanego.
 *
 * Wskazówka: Utwórz program rdfifo, którego zadaniem jest utworzenie kolejki FIFO i czytanie z niej danych.
 * Utwórz program wrfifo, który otwiera kolejkę FIFO tylko do zapisu i wpisuje do niej dane (np. swoj pid i czas).
 *
 * Q: W jaki sposób przekażesz wspólną nazwę kolejki FIFO do tych programów?
 * A: przez zmienną statyczą
 *
 * Q: W jaki sposób zapewnić działanie programu zbierającego komunikaty również wtedy, kiedy nie ma programu piszącego do łącza?
 * A: przez proces pętli nieskończonej ze sleep
 *
 * Q: Jak zapewnić to, że komunikaty pochodzące od różnych programów wyświetlane są w całości, tzn. nie są rozdzielane  komunikatami od innych programów?
 * A: flush? (do sprawdzenia).
 *
 */
#define DEBUG_MODE

#ifdef DEBUG_MODE
#define logs(...) printf("[%s](pid %d) DEBUG: Passed %s %d - %s\n", __TIME__, (int) getpid(), __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define logs_d(...) printf("[%s](pid %d) DEBUG: Passed %s %d - %s : %d\n", __TIME__, (int) getpid(), __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define logs(...)
#endif

#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>

#define FIFOARG 1
#define PIPE_BUF 100
#define FIFO_PERMS (S_IRWXU | S_IWGRP| S_IWOTH)
#define FIFO "temp.fifo"

#define BUFFERSIZE 500000
char buf[BUFFERSIZE]; // read buf

char* mygettime() {
	time_t mytime;
	mytime = time(NULL);
	return (ctime(&mytime));
}

/**
 * Serwer read from named pipe
 * -----------------
 * @param argc
 * @param argv
 * @return
 */
int rdfifo() {

	int fifo, var;

	/* There are *two* ways the open can fail: the pipe doesn't exist
	 * yet, *or* it succeeded, but a different writer already opened
	 * it but didn't yet remove it.
	 */
	logs("reader start");
	while (1) {
		logs("while1");
		while ((fifo = open(FIFO, O_RDONLY)) == -1) {
			/* Since you didn't specify O_CREAT in the call to open, there
			 * is no way that FIFO would have been created by the
			 * reader.  If there *is* now a FIFO, a remove here
			 * would delete the one the writer created!
			 */
			sleep(1);
		}

		/* Get an exclusive lock on the file, failing if we can't get
		 * it immediately.  Only one reader will succeed.
		 */
		if (flock(fifo, LOCK_EX | LOCK_NB) == 0)
			break;

		/* We lost the race to another reader.  Give up and wait for
		 * the next writer.
		 */
		close(fifo);
	}
	/* We are definitely the only reader.
	 */

	/* *Here* we delete the pipe, now that we've locked it and thus
	 * know that we "own" the pipe.  If we delete before locking,
	 * there's a race where after we opened the pipe, a different
	 * reader also opened, deleted, and locked the file, and a new
	 * writer created a new pipe; in that case, we'd be deleting the
	 * wrong pipe.
	 */
	logs("Remove FIFO");
	remove(FIFO);
	while ((var = read(fifo, buf, BUFFERSIZE)) > 0) {
		printf("[%s](pid %d) DEBUG: Passed %s %d : reader reads record: %s", __TIME__, (int) getpid(), __FUNCTION__, __LINE__, buf);
		/* No need to sleep; we'll consume input as it becomes available. */
	}

	close(fifo);
	logs("EOF reader");
	exit(0);

}

/**
 * Klient named pipe
 *
 * write to pipe
 *
 * @param argc
 * @param argv
 * @return
 */
int wrfifo(pid_t pid) {
	// time structs
	time_t rawtime;
	struct tm * timeinfo;

	int len, i;
	char buf[PIPE_BUF];
	int fd;
	int communicates = 0;

//	if ((unlink(FIFO)) == -1) {
//		logs("Error unlink FIFO")
//	} else {
//		logs("unlink fifo");
//	}

	if ((mkfifo(FIFO, FIFO_PERMS) == -1) && (errno != EEXIST)) {
		logs("Server failed to create a FIFO");
		return (1);
	} else if (errno == ENOENT) {
		printf("[%s](pid %d) DEBUG: Passed %s %d : No such file or directory - mkfifo errno: %d\n", __TIME__, (int) getpid(), __FUNCTION__, __LINE__, errno);
	} else if (errno == EEXIST) {
		printf("[%s](pid %d) DEBUG: Passed %s %d : mkfifo exist: %d\n", __TIME__, (int) getpid(), __FUNCTION__, __LINE__, errno);
	} else {
		printf("[%s](pid %d) DEBUG: Passed %s %d : No such file or directory - mkfifo errno: %d\n", __TIME__, (int) getpid(), __FUNCTION__, __LINE__, errno);
	}

	if ((fd = open(FIFO, O_WRONLY)) == -1) {
		logs("Client failed to open log fifo for writing");
		return (1);
	} else {
		logs("pipe opened to read-write");
	}

	/**
	 * write some text to pipe
	 */
	for (i = 0; i < 10; i++) {
		sleep(1);
		//logs("time")
		time(&rawtime);
		timeinfo = localtime(&rawtime);
		sprintf(buf, "#%d test PID: %d: text -> %s", communicates++, (int) getpid(), asctime(timeinfo));
		len = strlen(buf);
		if (write(fd, buf, len) != len) {
			logs("Client failed to write");
			return (1);
		} else {
			printf("[%s](pid %d) DEBUG: Passed %s %d : client succesed write to pipe: %s", __TIME__, (int) getpid(), __FUNCTION__, __LINE__, buf);
		}
	}
	/* Wait for the child process to finish. */
	waitpid(pid, NULL, 0);
	sleep(1);
	logs("close fd");
	close(fd);
	return (0);
}

/**
 * main
 *
 * @return
 */
int main(int argc, char *argv[]) {
	pid_t pid;
	int i;

	/**
	 * analiza lini komend
	 *
	 */
	int opt = 0;
	char *in_fname = NULL;
	char *out_fname = NULL;

	/**
	 * funkcje programu
	 */
	while ((opt = getopt(argc, argv, "rwh")) != -1) {
		switch (opt) {
		case 'r':
			in_fname = optarg;
			printf("\nInput option value=%s set program read from FIFO", in_fname);
			rdfifo();
			exit(0);
			break;
		case 'w':
			out_fname = optarg;
			printf("\nInput option value=%s set program to write to FIFO", out_fname);
			wrfifo(pid);
			exit(0);
			break;
		case '?':
		case 'help':
		case 'h':
		default:
			printf("\nProgram FIFO\n");
			printf("------------\n");
			printf("Program bez argumentów tworzy named pipe a w procesie potomnym zapisuje do niego dane.\n");
			printf("Program mozna wywołać z argumentami tak aby działał jako odczyt (r) z pipe lub zapis do pipe (w).\n");
			printf("Zapisywane są do pipe couner, PID i curenttime.\n\n");
			printf("Usage: %s [-r] [-w]\n\n", argv[0]);

			exit(0);
			break;
		}
	}

	logs("start program");

	pid = fork();

	/* proces potomny */
	if (pid == (pid_t) 0) { /* brak obsługi błędów */
		/**
		 * Odczytywanie
		 */
		for (i = 0; i < 3; i++) {
			rdfifo();
			sleep(1);
		}
	}
	/* proces macierzysty */
	else {
		for (i = 0; i < 5; i++) {
			wrfifo(pid);

		}
	}
	logs("end main");
	return (0);
}

Zrzut z działania

[23:30:20](pid 17400) DEBUG: Passed rdfifo 73 - while1

karol@carlo:~/eclipse-workspaces/unx_sys_programming/Debug$ ./unx_sys_programming -w

Input option value=(null) set program to write to FIFO

[23:30:20](pid 17411) DEBUG: Passed wrfifo 148 : mkfifo exist: 17
[23:30:20](pid 17411) DEBUG: Passed wrfifo 157 - pipe opened to read-write
[23:30:20](pid 17400) DEBUG: Passed rdfifo 104 - Remove FIFO
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #0 test PID: 17411: text -> Thu Jan 28 23:36:02 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #0 test PID: 17411: text -> Thu Jan 28 23:36:02 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #1 test PID: 17411: text -> Thu Jan 28 23:36:03 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #1 test PID: 17411: text -> Thu Jan 28 23:36:03 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #2 test PID: 17411: text -> Thu Jan 28 23:36:04 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #2 test PID: 17411: text -> Thu Jan 28 23:36:04 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #3 test PID: 17411: text -> Thu Jan 28 23:36:05 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #3 test PID: 17411: text -> Thu Jan 28 23:36:05 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #4 test PID: 17411: text -> Thu Jan 28 23:36:06 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #4 test PID: 17411: text -> Thu Jan 28 23:36:06 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #5 test PID: 17411: text -> Thu Jan 28 23:36:07 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #5 test PID: 17411: text -> Thu Jan 28 23:36:07 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #6 test PID: 17411: text -> Thu Jan 28 23:36:08 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #6 test PID: 17411: text -> Thu Jan 28 23:36:08 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #7 test PID: 17411: text -> Thu Jan 28 23:36:09 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #7 test PID: 17411: text -> Thu Jan 28 23:36:09 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #8 test PID: 17411: text -> Thu Jan 28 23:36:10 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #8 test PID: 17411: text -> Thu Jan 28 23:36:10 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 174 : client succesed write to pipe: #9 test PID: 17411: text -> Thu Jan 28 23:36:11 2016
[23:30:20](pid 17400) DEBUG: Passed rdfifo 107 : reader reads record: #9 test PID: 17411: text -> Thu Jan 28 23:36:11 2016
[23:30:20](pid 17411) DEBUG: Passed wrfifo 180 - close fd
[23:30:20](pid 17400) DEBUG: Passed rdfifo 112 - EOF reader

[10]   Done                    ./unx_sys_programming -r

bash:~/eclipse-workspaces/unx_sys_programming/Debug$ ./unx_sys_programming -h

Program FIFO
Program bez argumentów tworzy named pipe a w procesie potomnym zapisuje do niego dane.
Program mozna wywołać z argumentami tak aby działał jako odczyt (r) z pipe lub zapis do pipe (w).
Zapisywane są do pipe couner, PID i curenttime.

Usage: ./unx_sys_programming [-r] [-w]

Example solution 2 (draft)

/**
 * Zadania
 * -------
 * z1: Napisz program, który pokazuje, które atrybuty procesu macierzystego są dziedziczone przez proces potomny  uruchomiony za pomocą funkcji fork(), które zaś otrzymują nową wartość.
 * z2: Napisz program, który pokazuje, które atrybuty procesu są zachowane przez proces po wykonaniu funkcji exec().
 * z3: Napisz program, który wyświetla identyfikator procesu (PID) i nazwę związanego z nim polecenia dla wszystkich procesów uruchomionych przez użytkownika podanego w wierszu wywołania programu. Wskazówka: informacje te można uzyskać przeglądając katalog /proc z plików (interesują nas katalogi, których właścicielem jest dany  użytkownik) i pliki /proc/PID/status
 *
 * Każdy proces charakteryzuje się pewnymi atrybutami. Należą do nich:
 * Identyfikator procesu PID
 * Identyfikator procesu macierzystego PPID
 * Rzeczywisty identyfikator właściciela procesu
 * Rzeczywisty identyfikator grupy procesu
 * Efektywny identyfikator właściciela procesu
 * Efektywny identyfikator grupy procesu
 * Katalog bieżący i katalog główny
 * Maska tworzenia pliku
 * Identyfikator sesji
 * Terminal sterujący
 * Deskryptory otwartych plików
 * Ustalenia dotyczące obsługi sygnałów
 * Ustawienia zmiennych środowiskowych
 * Ograniczenia zasobów
 *
 *
 * Potomek dziedziczy z procesu potomnego wiele własności:
 rzeczywisty identyfikator użytkownika, rzeczywisty identyfikator grupy, obowiązujący identyfikator użytkownika, obowiązujący identyfikator grupy,
 identyfikatory dodatkowych grup,
 identyfikator sesji,
 terminal sterujący,
 sygnalizator ustanowienia identyfikatora użytkownika oraz sygnalizator ustanowienia identyfikatora grupy,
 deskryptory otwartych plików (są kopiowane)
 bieżący katalog roboczy,
 katalog główny,
 maskę tworzenia plików,
 maskę sygnałów oraz dyspozycje obsługi sygnałów,
 sygnalizator zamykania przy wywołaniu funkcji exec (close-on-exec) dla wszystkich otwartych deskryptorów plików,
 środowisko,
 przyłączone segmenty pamięci wspólnej,
 ograniczenia zasobów systemowych.
 Są jednak pewne różnice między procesem macierzystym a potomnym:
 wartość powrotu z funkcji fork,
 różne identyfikatory procesów,
 inne identyfikatory procesów macierzystych - w procesie potomnym jest to identyfikator procesu macierzystego; w procesie macierzystym identyfikator procesu macierzystego nie zmienia się,
 w procesie potomnym wartości tms_utime, tms_cutime i tms_ustime są równe 0,
 potomek nie dziedziczy rygli plików, ustalonych w procesie macierzystym,
 w procesie potomnym są zerowane wszystkie zaległe alarmy,
 w procesie potomnym jest zerowany zbiór zaległych sygnałów.
 */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/resource.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

extern char** environ;
char *prt_parent;

int glob = 1; 			// zewnętrzna zmienna

/* Prints the environment, one environment variable to a line, of the
 process given by PID. */
char *print_process_environment(pid_t pid) {
	int fd;
	char filename[24];
	char environment[8192];
	size_t length;
	char* next_var;
	/* Generate the name of the environ file for the process. */
	snprintf(filename, sizeof(filename), "/proc/%d/environ", (int) pid);
	/* Read the contents of the file. */
	fd = open(filename, O_RDONLY);
	length = sizeof(environ);
	printf("Size of environ: %d\n", length);
	close(fd);
	/* read does not NUL-terminate the buffer, so do it here. */
	environment[length] = '\0';
	/* Loop over variables. Variables are separated by NULs. */
	next_var = environment;
	while (next_var < environment + length) {
		/* Print the variable. Each is NUL-terminated, so just treat it
		 like an ordinary string. */
		printf(">> %s\n", next_var);
		/* Advance to the next variable. Since each variable is
		 NUL-terminated, strlen counts the length of the next variable,
		 not the entire variable list. */
		next_var += strlen(next_var) + 1;
	}
	return (environment);
}

//int main(int argc, char* argv[]) {
//pid_t pid = (pid_t) atoi (argv[1]);
//print_process_environment (pid);
///return 0;
//}

int main1(int argc, char **argv) {
	int var = 100; 		        // zmienna automatyczna na stows
	char **env = environ;		// środowisko parent
	// zapamiętanie environ w tablicy

	printf("PROGRAM Z1\n\n");
	printf("Zmienne srodowiskowe parent: ----------------------------\n");
	while (*env) {
		printf("%s\n", *env++);
	}

	printf("---------------------------------------------------------\n");

	//for (int i = 0; *env != NULL && gets(env[i]); i++)
	//	prt_parent[i] = env[i];

	pid_t pid = fork();

	if (pid == 0) {
		// child process
		glob++;
		var++;
		printf("child process: pid %d, ppid %d, getuid %d, geteuid %d, getgid %d, glob = %d, var = %d\n", getpid(), getppid(), getuid(), geteuid(), getgid(),
				glob, var);

		/**
		 * wy swietlenie zmiennych środowiskowych różnych od parent
		 */
		printf("Zmienne srodowiskowe child różne od parent:\n");
		char environment_1[8192];
		char * prt_env = &environment_1;
		prt_env = print_process_environment(pid);
		char **env_child = environ;
		printf("Size of *char: %d\n", sizeof(environ));

		while (*env_child) {
			printf("compare - %s %d\n", *env_child, strcmp(*env_child++, *env++));
			//printf("%s -----\n", *env2++);
			//if (strcmp(*env2, ++*env) == 0) {
			//
			//} else {
			//printf("%s jest takie samo\n", *env2);
			//}
			//*env_child++;
			//*env++;
		}
		printf("-------------------- x --------------------\n");

	} else if (pid > 0) {
		// parent process
		printf("parent process: pid %d, ppid %d, getuid %d, geteuid %d, getgid %d, glob = %d, var = %d\n", getpid(), getppid(), getuid(), geteuid(), getgid(),
				glob, var);
	} else {
		// fork failed
		printf("fork() failed!\n");
		return (1);
	}

	printf("-- end of program pid %d\n", getpid());

	return (0);
}

Using fork() in C/C++ – a minimum working example

In a C or C++ program, fork() can be used to create a new process, known as a child process. This child is initially a copy of the the parent, but can be used to run a different branch of the program or even execute a completely different program. After forking, child and parent processes run in parallel. Any variables local to the parent process will have been copied for the child process, so updating a variable in one process will not affect the other.

Consider the following example program:

#include <stdio .h>
#include <unistd .h>
#include <stdlib .h>
#include <string .h>
#include <sys /types.h>
#include </sys><sys /resource.h>
#include <fcntl .h>
#include <sys /stat.h>
#include </sys><sys /types.h>
#include <unistd .h>
int main(int argc, char **argv)
{
printf("--beginning of program\n");
 
int counter = 0;
pid_t pid = fork();
 
if (pid == 0)
{
// child process
int i = 0;
for (; i < 5; ++i) { printf("child process: counter=%d\n", ++counter); } } else if (pid > 0)
{
// parent process
int j = 0;
for (; j < 5; ++j)
{
printf("parent process: counter=%d\n", ++counter);
}
}
else
{
// fork failed
printf("fork() failed!\n");
return 1;
}
 
printf("--end of program--\n");
 
return 0;
}

This program declares a counter variable, set to zero, before fork()ing. After the fork call, we have two processes running in parallel, both incrementing their own version of counter. Each process will run to completion and exit. Because the processes run in parallel, we have no way of knowing which will finish first. Running this program will print something similar to what is shown below, though results may vary from one run to the next.

--beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
child process: counter=1
parent process: counter=4
child process: counter=2
parent process: counter=5
child process: counter=3
--end of program--
child process: counter=4
child process: counter=5
--end of program--

Narzędzia to projektowania baz danych

GNU-GPL

Multiple versions/licenses (each has a “free” and a “not-free” version)

  • DBVisualizer
  • Toad http://www.toadsoft.com/

Not-free

  • Microsoft Visio – (If you already have it, it does work quite well)
  • DataStudio – 30 day trial http://www.aquafold.com
  • DBWrench – 30 day trial http://www.dbwrench.com/

ER diagram tool

  • http://druid.sf.net/
  • http://schemaspy.sourceforge.net/
  • http://uml.sourceforge.net/index.php

Automat komórkowy w C | Cellular automaton (CA) in C

Cellular automata and Moore neighborhood

Cellular automaton (CA) is by definition a periodic grid of cells, where in each cell sits a finite automaton, and a set of (identical) rules for every such automaton describing to which state it switches on a next moment of discrete time ti+1, depending of its own state and states of all its neighbors on a current moment of time ti. For now, we will be interested in 2d, rectangular CA, and a neighborhood which includes 8 neighbors of the cell. This is what is called the Moore neighborhood, because it was invented by Edward Moore.

Rules Brain

http://zvold.blogspot.com/2010/01/conways-life-and-brians-brain-cellular.html

  • Each cell has three possible states: passive, active, and semi-active.
  • If a cell is active, it goes to semi-active state on the next step
  • If a cell is semi-active, it becomes passive on the next step
  • If a cell is passive, it becomes active if and only if it has exactly 2 active neighbors

Materials

  • http://meil.pw.edu.pl/za/ZA/Dydaktyka/Informatyka-1
  • https://en.wikipedia.org/wiki/Cellular_automaton
  • git clone :snippets/karol-preiskorn/E8e4L/brians-brain.git

Source

/**
* Brian's Brain
*
* Rules:
* -------
* Each cell has three possible states: passive, active, and semi-active.
* If a cell is active, it goes to semi-active state on the next step
* If a cell is semi-active, it becomes passive on the next step
* If a cell is passive, it becomes active if and only if it has exactly 2 active neighbors
*
**/
#include 
#include 

#include 
#include 

 

Interfaces in Java – slideshare tutorial

Tutoriale jak definiować i używać interfejsów w Java oraz czym się różni interfejs od abstract class.

Interface in Java

  • Introduction to Interface
  • Multiple Inheritance – Example
  • Why Interfaces are needed
  • Java’s Interface Concept
  • Syntax
  • Semantic Rules for Interfaces
  • Example: An Interface for Shape Classes
  • Extending Interface
  • Abstract class and Interface
  • Benefits of Interfaces
  • Java’s Most used Interfaces

ABSTRACT CLASS & INTERFACE

  • What is interface?
  • How to define interface?
  • How to use interface?
  • Why not use abstract class instead of interface?
  • UML of interface
  • Importance of interface
  • Different between interface and abstract class
  • Notes for interface
  • Class Design Guidline
  • Last words

 

 

Java – przykład z konstruktorami

Przykład na dedykowany konstruktor

Zadeklaruj klasę Sloik zawierającą pole Dzem dzem, dedykowany konstruktor inicjujący wszystkie zadeklarowane pola i metody:

  • otworz
  • zamknij
  • czyOtwarty

Następnie utwórz obiekt klasy Sloik i napełnij go wybranym rodzajem dżemu, operacje powtórz dla wszystkich rodzajów dżemów.

Uwaga: nakładanie dżemu do zamkniętego słoika lub pozostawienie słoika nie zamkniętego może prowadzić do zepsucia się produktu!

Oryginał zadnia

Zadeklaruj klasę Dzem zawierająca prywatne pola:

  • String smak,
  • double waga

Utwórz konstruktory przyjmujące jako parametry zmienne:

  • (String smak, double waga),
  • (double waga),
  • (String smak).

Dostarczone parametry konstruktorów powinny znacjonalizować pola klasy. W przypadku gdy konstruktor nie dostarcza niezbędnego parametru należny przyjąć, ze pole smak musi przyjąć wartość “No name”, natomiast waga – 100.0.

Przedstaw wykorzystanie wszystkich konstruktorów tworząc obiekty reprezentujące co najmniej trzy rodzaje dżemów.

Uwaga: należny założyć, ze tylko konstruktor z dwoma parametrami możne przypisać wartości polom klasy.

Zadanie trochę zmodyfikowane

Zadeklaruj klasę Sloik zawierająca pole Dzem dzem (lub konstruktor klasy pochodnej), dedykowany konstruktor inicjujący wszystkie zadeklarowane pola i metody:

  • otworz
  • zamknij
  • czyOtwarty
  • napełnijSloik

Wymagane pola:

  • klasa Dzem

Następnie utwórz obiekt klasy Sloik i napełnij go wybranym rodzajem Dzem.

Resources czyli od czego zacząć

Przykład konstruktora - definicja
class Programming {
  //constructor method
  Programming() {
    System.out.println("Constructor method called.");
  }
 
  public static void main(String[] args) {
    Programming object = new Programming(); // Creating an object
  }
}

Przeciążanie konstuktora - Overloading
class Language {
  String name;
 
  Language() {
    System.out.println("Constructor method called.");
  }
 
  Language(String t) {
    name = t;
  }
 
  public static void main(String[] args) {
    Language cpp  = new Language();
    Language java = new Language("Java");
 
    cpp.setName("C++");
 
    java.getName();
    cpp.getName();
  }
 
  void setName(String t) {
    name = t;
  }
 
  void getName() {
    System.out.println("Language name: " + name);
  }
}

Dziedziczenie konstuktora


class GrandParent {
  int a;
 
  GrandParent(int a) {
    this.a = a;
  }
}
 
class Parent extends GrandParent {
  int b;
 
  Parent(int a, int b) {
    super(a);
    this.b = b;
  }
 
  void show() {
    System.out.println("GrandParent's a = " + a);
    System.out.println("Parent's b      = " + b);
  }
}
 
class Child {
  public static void main(String[] args) {
    Parent object = new Parent(8, 9);
    object.show();
  }
}

Czyli w naszym zadaniu mamy kilka konstruktorów Dzem

	Dzem(String smak, double waga) {
		this.smak = smak;
		this.waga = waga;
	}

	Dzem(double waga) {
		this.smak = "Nieznany";
		this.waga = waga;
	}

	Dzem(String smak) {
		this.smak = smak;
		this.waga = 100.0;
	}

	Dzem() {
		smak = "no name";
		waga = 100.0;
	}

oraz kilka konstruktorów Sloik

	Sloik() {
		System.out.print("Konstuktor Słoik(): ");
		this.print();
	}

	Sloik(Dzem p_dzem) {
		System.out.print("Konstuktor Słoik(Dzem): ");
		// sprawdzemnie czy dzem jest otwarty
		this.otworz();
		// napełnienie dzemem
		this.napelnij(p_dzem);
		this.print();
		this.dzem.print();
	}

Inicjalizacja konstruktora Dzem następujące “jawnie”

przeciążenie (overloading) napelnij() Sloik klasa Dzem

Rozwiązanie zadania

Wynik działania programu:


run:
Smak dzemu: agrestowy, waga dzemu: 1111.11kg
Smak dzemu: porzeczka, waga dzemu: 100.0kg
Smak dzemu: Nieznany, waga dzemu: 1111.11kg
-> Konstuktor: Tworzę słoik dzemu porzeczka
Smak dzemu: porzeczka, waga dzemu: 100.0kg
Słoik dzemu: porzeczka jest zamkniety
Słoik dzemu: porzeczka jest zamkniety
Otwierma słoki dzemu: porzeczka
Słoki dzemu: porzeczka jest otwarty
Słoki dzemu: porzeczka jest otwarty
Napełniam słoik dzemem o smaku truskawkowy i wadze 10.0kg

Słoik dzemu: truskawkowy jest zamkniety
Słoik jest zamknięty nie można go napełnić

Kompilator online: http://tpcg.io/XWuGkR

Przykład zadania egazminacyjnego z programowania PHP

Zadanie

  1. Stwórz dwuwymiarową tablicę numeryczną (z użyciem PHP). Napisz funkcję, za pomocą której wyświetlisz tablicę w HTML. Wyświetl tablicę.
  2. Napisz funkcję obliczającą i wyświetlającą sumę wszystkich elementów tej tablicy. Zastosuj ją.
  3. Napisz funkcję znajdującą wartości max i min w tablicy. Napisy funkcję zamieniającą po przekątnej z prawej do lewej wszystkie wartości na max, a z lewej do prawej – na min. Wyświetl wynik.
  4. Zamień losową komórkę tablicy na napis i wyznacz jego długość (za pomocą wyszukiwania napisu). Wyświetl tablicę za pomocą funkcji.
  5. Stwórz formularz odbierający wprowadzone dane podczas rejestracji (login, hasło, powtórzenie hasła, mail, imię, nazwisko, dane ankietowe, lista typu select)

Projekt PHP

  • Stwórz tablicę (z użyciem html). Napisz funkcję, za pomocą której wyświetlisz tablicę. Wyświetl tablicę.
  • Napisz funkcję obliczającą i wyświetlającą sumę wszystkich elementów tej tablicy. Zastosuj ją.
  • Napisz funkcję znajdującą wartości max i min w tablicy.
  • Napisz funkcję zamieniającą po przekątnej z prawej do lewej wszystkie wartości na max, a z lewej do prawej – na min. Wyświetl wynik.
  • Zamień losową komórkę tablicy na napis i wyznacz jego długość (za pomocą wyszukiwania napisu). Wyświetl tablicę za pomocą funkcji.
  1. Stwórz formularz odbierający wprowadzone dane podczas rejestracji
  2. login
  3. hasło
  4. powtórzenie hasła,
  5. mail,
  6. imię,
  7. nazwisko,
  8. dane ankietowe,
  9. lista typu select.

Source from GitHub

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Projekt PHP</title>
    </head>
    <body>
        <h1>Projekt PHP</h1>
        <ol>
            <li>Stwórz tablicę (z użyciem html). Napisz funkcję, za pomocą której wyświetlisz tablicę. Wy-świetl tablicę.</li>
            <li>Napisz funkcję obliczającą i wyświetlającą sumę wszystkich elementów tej tablicy. Zastosuj ją.</li>
            <li>Napisz funkcję znajdującą wartości max i min w tablicy. Napisy funkcję zamieniającą po przekątnej z prawej do lewej wszystkie wartości na max, a z lewej do prawej – na min. Wyświetl wynik.</li>
            <li>Zamień losową komórkę tablicy na napis i wyznacz jego długość (za pomocą wyszukiwania napisu). Wyświetl tablicę za pomocą funkcji.</li>
            <li>Stwórz formularz odbierający wprowadzone dane podczas rejestracji (login, hasło, powtórze-nie hasła, mail, imię, nazwisko, dane ankietowe, lista typu select).</li>
        </ol>
        <?php
        error_reporting(E_ALL);

        function print_pre($p_string) {
            print "<pre>" . print_r($p_string, true) . "</pre>";
        }

        function tablica_wyswietlanie($la_array, $p_nazwa) {
            print "<h3>" . $p_nazwa . "</h3>";
            print "<table>";
            foreach ($la_array as $key_x => $value_x) {
                echo '<tr>';
                foreach ($value_x as $key_y => $value_y) {
                    echo '<td>' . $la_array[$key_x][$key_y] . '</td>';
                }
                echo '</tr>';
            }
            print '</table>';
        }

        function tablica_min_max($la_array, $p_operacja) {
            $max = 0;
            $max_x = 0;
            $max_y = 0;

            $min = 5;
            $min_x = 0;
            $min_y = 0;

            foreach ($la_array as $key_x => $value_x) {
                foreach ($value_x as $key_y => $value_y) {

                    if ($la_array[$key_x][$key_y] >= $max) {
                        $max = $la_array[$key_x][$key_y];
                        $max_x = $key_x;
                        $max_y = $key_y;
                    }

                    if ($la_array[$key_x][$key_y] < $min) {
                        $min = $la_array[$key_x][$key_y];
                        $min_x = $key_x;
                        $min_y = $key_y;
                    }
                }
            }
            if ($p_operacja == 'max') {
                print "<p>max [" . $max_x . ',' . $max_y . "] = " . $max . "</p>";
                return $max;
            } else {
                print "<p>min [" . $min_x . ',' . $min_y . "] = " . $min . "</p>";
                return $min;
            }
        }

        function tablica_suma($la_array) {
            $sum = 0;

            foreach ($la_array as $key_x => $value_x) {
                foreach ($value_x as $key_y => $value_y) {

                    $sum = $sum + $la_array[$key_x][$key_y];
                }
            }
            print "<p>Suma elementów tablicy = " . $sum . "</p>";
        }

        function tablica_przekatna_prawa($la_array, $p_min, $p_max) {
            foreach ($la_array as $key_x => $value_x) {
                foreach ($value_x as $key_y => $value_y) {
                    if ($key_x <= $key_y)
                        $la_array [$key_x][$key_y] = $p_min;
                    if ($key_x > $key_y)
                        $la_array [$key_x][$key_y] = $p_max;
                   
                }
            }
            return $la_array;
        }

        $model = Array(
            array(1, 5, 6),
            array(2, 3, 1),
            array(4, 4, 8),
            array(8, 9, 3));

        print "Ilość pól w tablicy = " . count($model) . "<br>";


        print "<h2>Zadanie 1</h2>";
        tablica_wyswietlanie($model, 'Tablica model');

        print "<h2>Zadanie 2</h2>";
        tablica_suma($model);

        print "<h2>Zadanie 3a</h2>";
        $t_min = tablica_min_max($model, 'min');
        $t_max = tablica_min_max($model, 'max');

        print "<h2>Zadanie 3b</h2>";
        $t_prawa = tablica_przekatna_prawa($model, $t_min, $t_max);
        tablica_wyswietlanie($t_prawa, 'Wypełnienie prawe');
       
        print "<h2>Zadanie 4</h2>";
       
        $l_x = rand(0, 2);
        $l_y = rand(0, 3);
       
        $model[$l_x][$l_y] = 'Jakiś napis...';
       
        tablica_wyswietlanie($model, 'Losowy napis');

        print "<p>Długość napisu model [$l_x][$l_y] = " . strlen($model[$l_x][$l_y])."</p>";
       
        ?>
    </body>
</html>

Oracle PL/SQL: Bulk Processing with BULK COLLECT and FORALL

Bulk Processing with BULK COLLECT and FORALL· BULK COLLECT: SELECT statements that retrieve multiple rows with a single fetch, improving the speed of data retrieval· FORALL: INSERTs, UPDATEs, and DELETEs that use collections to change multiple rows of data very quicklyPL/SQL is so tightly integrated with the SQL language, you might be wondering why special features would be needed to improve the performance of SQL statements inside PL/SQL. The explanation has everything to do with how the runtime engines for both PL/SQL and SQL communicate with each other—through a context switch.

Source: Mukesh K Suthar on Oracle PL/SQL: Bulk Processing with BULK COLLECT and FORALL

BULK COLLECT

Bulk binds can improve the performance when loading collections from a queries. The BULK COLLECT INTO construct binds the output of the query to the collection. To test this create the following table.

CREATE TABLE bulk_collect_test AS
SELECT owner,
       object_name,
       object_id
FROM   all_objects;

The following code compares the time taken to populate a collection manually and using a bulk bind.

SET SERVEROUTPUT ON
DECLARE
  TYPE t_bulk_collect_test_tab IS TABLE OF bulk_collect_test%ROWTYPE;

  l_tab    t_bulk_collect_test_tab := t_bulk_collect_test_tab();
  l_start  NUMBER;
BEGIN
  -- Time a regular population.
  l_start := DBMS_UTILITY.get_time;

  FOR cur_rec IN (SELECT *
                  FROM   bulk_collect_test)
  LOOP
    l_tab.extend;
    l_tab(l_tab.last) := cur_rec;
  END LOOP;

  DBMS_OUTPUT.put_line('Regular (' || l_tab.count || ' rows): ' || 
                       (DBMS_UTILITY.get_time - l_start));
  
  -- Time bulk population.  
  l_start := DBMS_UTILITY.get_time;

  SELECT *
  BULK COLLECT INTO l_tab
  FROM   bulk_collect_test;

  DBMS_OUTPUT.put_line('Bulk    (' || l_tab.count || ' rows): ' || 
                       (DBMS_UTILITY.get_time - l_start));
END;
/
Regular (42578 rows): 66
Bulk    (42578 rows): 4

PL/SQL procedure successfully completed.

SQL>

Remember that collections are held in memory, so doing a bulk collect from a large query could cause a considerable performance problem. In actual fact you would rarely do a straight bulk collect in this manner. Instead you would limit the rows returned using the LIMIT clause and move through the data processing smaller chunks. This gives you the benefits of bulk binds, without hogging all the server memory. The following code shows how to chunk through the data in a large table.

SET SERVEROUTPUT ON
DECLARE
  TYPE t_bulk_collect_test_tab IS TABLE OF bulk_collect_test%ROWTYPE;

  l_tab t_bulk_collect_test_tab;

  CURSOR c_data IS
    SELECT *
    FROM bulk_collect_test;
BEGIN
  OPEN c_data;
  LOOP
    FETCH c_data
    BULK COLLECT INTO l_tab LIMIT 10000;
    EXIT WHEN l_tab.count = 0;

    -- Process contents of collection here.
    DBMS_OUTPUT.put_line(l_tab.count || ' rows');
  END LOOP;
  CLOSE c_data;
END;
/
10000 rows
10000 rows
10000 rows
10000 rows
2578 rows

PL/SQL procedure successfully completed.

SQL>

So we can see that with a LIMIT 10000 we were able to break the data into chunks of 10,000 rows, reducing the memory footprint of our application, while still taking advantage of bulk binds. The array size you pick will depend on the width of the rows you are returning and the amount of memory you are happy to use.

From Oracle 10g onward, the optimizing PL/SQL compiler converts cursor FOR LOOPs into BULK COLLECTs with an array size of 100. The following example compares the speed of a regular cursor FOR LOOP with BULK COLLECTs using varying array sizes.

SET SERVEROUTPUT ON
DECLARE
  TYPE t_bulk_collect_test_tab IS TABLE OF bulk_collect_test%ROWTYPE;

  l_tab    t_bulk_collect_test_tab;

  CURSOR c_data IS
    SELECT *
    FROM   bulk_collect_test;

  l_start  NUMBER;
BEGIN
  -- Time a regular cursor for loop.
  l_start := DBMS_UTILITY.get_time;

  FOR cur_rec IN (SELECT *
                  FROM   bulk_collect_test)
  LOOP
    NULL;
  END LOOP;

  DBMS_OUTPUT.put_line('Regular  : ' || 
                       (DBMS_UTILITY.get_time - l_start));

  -- Time bulk with LIMIT 10.
  l_start := DBMS_UTILITY.get_time;

  OPEN c_data;
  LOOP
    FETCH c_data
    BULK COLLECT INTO l_tab LIMIT 10;
    EXIT WHEN l_tab.count = 0;
  END LOOP;
  CLOSE c_data;

  DBMS_OUTPUT.put_line('LIMIT 10 : ' || 
                       (DBMS_UTILITY.get_time - l_start));

  -- Time bulk with LIMIT 100.
  l_start := DBMS_UTILITY.get_time;

  OPEN c_data;
  LOOP
    FETCH c_data
    BULK COLLECT INTO l_tab LIMIT 100;
    EXIT WHEN l_tab.count = 0;
  END LOOP;
  CLOSE c_data;

  DBMS_OUTPUT.put_line('LIMIT 100: ' || 
                       (DBMS_UTILITY.get_time - l_start));

  -- Time bulk with LIMIT 1000.
  l_start := DBMS_UTILITY.get_time;

  OPEN c_data;
  LOOP
    FETCH c_data
    BULK COLLECT INTO l_tab LIMIT 1000;
    EXIT WHEN l_tab.count = 0;
  END LOOP;
  CLOSE c_data;

  DBMS_OUTPUT.put_line('LIMIT 1000: ' || 
                       (DBMS_UTILITY.get_time - l_start));
END;
/
Regular  : 18
LIMIT 10 : 80
LIMIT 100: 15
LIMIT 1000: 10

PL/SQL procedure successfully completed.

SQL>

You can see from this example the performance of a regular FOR LOOP is comparable to a BULK COLLECT using an array size of 100. Does this mean you can forget about BULK COLLECT in 10g onward? In my opinion no. I think it makes sense to have control of the array size. If you have very small rows, you might want to increase the array size substantially. If you have very wide rows, 100 may be too large an array size.

Generic DataSource on CDHDR and CDPOS Tables

    data: act type i, &amp;quot;aktualna liczba kroków
          cal type i, &amp;quot;całkowita liczba kroków
          key_x like cdpos-tabkey,
          it_t161f like t161f,
          i_frgzu2 like eban-frgzu,
          begin of cdhdr_x_l,
             udate like cdhdr-udate,
          end of cdhdr_x_l,
          cdhdr_x like cdhdr_x_l occurs 0 with header line,
          begin of cdpos_x_l,
             changenr like cdpos-changenr,
          end of cdpos_x_l,
          cdpos_x like cdpos_x_l occurs 0 with header line.

    select * from t161f into it_t161f where frgst = j_eban-frgst.
    endselect.

      cal = sy-dbcnt.
      act = strlen( j_eban-frgzu ).

      if sy-subrc ne 0.
        t_items-badat = j_eban-badat.
      elseif ( cal eq act ).

        concatenate &amp;#039;030&amp;#039; j_eban-banfn j_eban-bnfpo into key_x.

        select changenr from cdpos into table cdpos_x
          where objectclas = &amp;#039;BANF&amp;#039; and
              objectid = j_eban-banfn and
              tabkey = key_x and
              fname = &amp;#039;FRGZU&amp;#039;.

        sort cdpos_x by changenr descending.

        read table cdpos_x into cdpos_x_l index 1.

        select single udate from cdhdr into cdhdr_x_l-udate
          where objectclas = &amp;#039;BANF&amp;#039; and
                objectid = j_eban-banfn and
                changenr = cdpos_x_l-changenr.

         t_items-badat = cdhdr_x_l-udate.
      endif. 

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑