Показ дописів із міткою Програмування. Показати всі дописи
Показ дописів із міткою Програмування. Показати всі дописи

суботу, 9 травня 2020 р.

Android бібліотеки для побудови графіків (діаграм)

Задались питанням «Як побудувати графік (діаграму) у Android програмі?». Для цього існує вже ряд розроблених бібліотек для Android Java розробників. З тих, що я знайшов, більш менш пристойними є: SciChart, AndroidCharts, AChartEngine, AndroidPlot, GraphView, MPAndroidChart. Останні дві є найбільш популярними. Існують також дуже простенькі невеличкі бібліотеки, які зосереджуються на малюванні одного якогось графіку, найчастіше лінійного.

SciChart – платна багатоплатформна бібліотека для WPF, iOS, Android, Xamarin. Розробники стверджують, що вони зосереджуються на швидкості і високопродуктивності їхньої бібліотеки. Дозволяє будувати доволі складні динамічні графіки. Наявний непоганий посібник (Tutorial) для Android розробників. Проте дана бібліотека є платна і коштує від 850 до 3000 доларів США на одного розробника в рік.
SciChart library, example, Android Graph, Plot
Приклад програми з використанням SciChart

вівторок, 27 вересня 2016 р.

Android Studio: Error:The number of method references in a .dex file cannot exceed 64K.

Error:The number of method references in a .dex file cannot exceed 64K.

Доволі часто помилка, якщо судити з обговорень.

Способів вирішення три:

1. Почистити код, позбутися лишніх інструкцій та відповідно лишніх імпортів

2. Прописати у скрипті gradle

// Enabling multidex support.
multiDexEnabled true

неділю, 3 січня 2016 р.

Git (пам’ятка)

Git — розподілена система керування версіями.

Базові команди 

 Створення репозиторія на локальному комп’ютері:
$git init
Подивитись поточний стан
$git status
Додати (підготувати) в репозиторій усі файли
$git add .
Додати окремий файл
$git add index.html
Остаточно передати в репозиторій підготовлені файли із коментарем до того що додається:
$git commit –m "Коментар"
Переглянути різницю між тим, що в репозиторію і файлами на диску:
$git diff
Забрати з git лишнє
$git rm –- cached LICENSE.PHP
відкат
$git checkout --license.php

Робота з гілками

створення нової гілки
$git branch new_style
переключитися на нову гілку
$git checkout new_style
подивитись гілки і яка поточна
$git branch
Злиття гілок
$git merge new_style

Робота з віддаленим сервером (GitHub) 


пʼятницю, 31 жовтня 2014 р.

Важливість базових знань



Чим більше вивчаєш, тим більше розумієш, що якщо спочатку щось не зрозумів, вірніше, якщо не засвоїв базові (основні, елементарні) знання з певної галузі, то згодом це може становити значну проблему у розумінні складнішого матеріалу. Так, для прикладу візьмемо, програмування і Java. Якщо ти не освоїв базові концепції об'єктно-орієнтованого програмування і те як це все реалізовано в Java (так зване Java Core) до найменших деталей, то рух дальше буде важкий.  Переважно з таких програмістів стають так звані "бидлокодери", які просто ліплять куски коду докупи до кінця не розуміючи, що кожен рядок коду означає. До певних пір це працює, але лише до певних. Крім того після таких людей розібрати код просто нереально. Що правда через цей етап мабуть проходять усі спочатку:), оскільки, часто, щоб зрозуміти щось, потрібно спробувати хоч щось запрограмувати і пройтися дальше в матеріалі, а згодом повернутися.

Те ж саме стосується математики, якщо добре не освоїти шкільної математики, то в університеті максимум що зможеш, то автоматично застосовувати формули по якомусь накатаному алгоритму. Проте, коли поставити якусь задачу по обробці конкретних даних експерименту, то може бути повний тупик, або ж неправильне застосування певних методів і т.п. Цим грішать багато наукових досліджень. Зокрема, доволі мало людей має хороше уявлення про елементарні речі, які давно знають деякі статисти: в біології, медицині, психології і у всьому що пов'язано з людьми і живими організмами, не можна покладатися на окремі випадки і спостереження. А ще крім того, людський мозок часто забуває певні нюанси і те що не використовується довго і все це потрібно повторювати, якщо не хочеш забути.

вівторок, 10 червня 2014 р.

Логування в Java (log4j 2)

Мабуть чи не всі програмісти виводять додаткову інформацію на консоль для зневадження програми і просто з метою стеження за її виконанням.  Проміжну інформацію про стан виконання програми, про певні критичні помилки часто корисно записувати у файл чи передати по мережі. Тоді користувач програми може надіслати розробнику звіт і розробник зможе розібратися, що ж пішло не так. Логування у будь-якому разі корисне. Логування у файл можна звичайно зробити самому. Проте навіщо винаходити велосипед, якщо на цьому поприщі вже багато чого зроблено. Існує декілька бібліотек, які спрощують логування. Зараз мова піде про log4j 2-ї версії.

Що потрібно звантажити

* Apache Log4j 2 з оф. сайту (http://logging.apache.org/log4j/2.x/download.html)
* Log4j 2 User’s Guide – посібник користувача (http://logging.apache.org/log4j/2.x/log4j-users-guide.pdf)
* SLF4J – це бібліотека для логування на якій базується log4j 2 (http://www.slf4j.org/download.html)


Підключення бібліотек


Для того щоб наші приклади працювали. Необхідно підключити відповідні *.jar файли до проекту. Не буду пояснювати як це робити.

Розархівовуємо вміст архівів звантажених з інтернету і з них я підключав наступні:

log4j2.0\log4j-api-2.0-rc1.jar
log4j2.0\log4j-core-2.0-rc1.jar
log4j2.0\log4j-slf4j-impl-2.0-rc1.jar
slf4j-1.7.7\integration\lib\slf4j-api-2.0.99.jar
slf4j-1.7.7\integration\lib\slf4j-simple-1.6.99.jar

Якщо не підключити slf4j, то буде видавати помилку виду:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/ILoggerFactory
      at java.lang.ClassLoader.defineClass1(Native Method)...........



Конфігурація Log4j 2

Для того щоб логування працювало як нам потрібно необхідний відповідний файл конфігурації. Можна створити .xml файл, а можна файл properties. Приклади файлів конфігурації можна знайти в посібнику (User’s Guid). Файл повинен бути прописаний в classpath проекту. Можна просто закинути файл у корінь проекту, або у каталог src. Файл конфігурації краще назвати log4j2.xml.

У посібнику користувача можна знайти різні приклади файлу конфігурації для різних цілей: виводу лише на консоль, виводу у файл, виводу у мережевий сокет і т.д. Для виводу у файл матимемо:

<configuration>
    <appenders>
        <file append="false" filename="A1.log" name="A1">
            <patternlayout pattern="%t %-5p %c{6} - %m%n">
        </patternlayout></file>
        <console name="STDOUT" target="SYSTEM_OUT">
            <patternlayout pattern="%d %-5p [%t] %C{6} %M (%F:%L) - %m%n">
        </patternlayout></console>
    </appenders>
    <loggers>
        <logger level="debug" name="org.apache.log4j.xml">
            <appenderref ref="A1">
        </appenderref></logger>
        <root level="debug">
            <appenderref ref="STDOUT">
        </appenderref></root>
    </loggers>
</configuration>

Наступний приклад демонструє роботу з логуванням.
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class HelloWorld {
 private static Logger logger = LogManager.getLogger("HelloWorld");

 public static void main(String[] args) {
  logger.info("Hello, world");
  
  Logger fileLog=LogManager.getLogger("org.apache.log4j.xml");
  fileLog.debug("Write in file!");
 }
}

В результаті, якщо був використатий файл конфігурації наведений вище, то на консолі отримаємо:
2014-06-10 15:04:31,610 INFO  [main] HelloWorld (HelloWorld.java:8) - Hello, world
2014-06-10 15:04:31,612 DEBUG [main] HelloWorld (HelloWorld.java:11) - Write in file!
А у файлі:
main DEBUG log4j.xml - Write in file!
Спочатку отримуємо наш основний «Логер», який направлений буде на консоль.

private static Logger logger = LogManager.getLogger("HelloWorld");

Якщо ми хочемо писати у файл щось, то отримуємо логер для файлу:

Logger fileLog=LogManager.getLogger("org.apache.log4j.xml");

І пишемо у файл:

fileLog.debug("Write in file!");

Те як виглядатими наш лог, що туди включатиметься в значній мірі залежить від файла конфігурації.


Можливі передачі у лог і винятків (Exception):

logger.info("Error: ", new Exception("An exception"));


Рівні логування

Не хочеться вдаватися глибоко у цю тему, але необхідно згадати основне. При логуванні розрізняють рівні логування:

1.    TRACE – повідомлення найвищого рівні

2.    DEBUG – зневаджувальні повідомлення, менш детальні ніж TRACE

3.    INFO – стандартні інформаційні повідомлення

4.    WARN – некритичні помилки

5.    ERROR – помилки, що можуть вплинути на правильність результату

6.    FATAL – фатальні помилки, які заважають роботі

За допомогою файлу конфігурації ми можемо вказати, які повідомлення включати у наш лог.  У нас у файлі конфігурації маємо level="debug" . Це означає що на консоль і у файл буде виводитися всі повідомлення рівня Debug і нижче. Повідомлення рівні trace не будуть включатися. Тобто рядок в коді logger.trace("Hello, world"); - нам нічого не виведе ні в лог, ні у файл, ні на консоль, якщо ми не підвищемо рівень логування до TRACE у файлі конфігурації.

Патерни логування

Для формування вигляду логу, використовується відповідний патерн або ж шаблон. У нас використано два патерни, один для файлу інший для консолі.

<PatternLayout pattern="%t %-5p %c{2} - %m%n" />

<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />

%d – вивести дату

%t – ім’я нитки (thread)

%-5p — виводить рівень логу (ERROR, DEBUG, INFO …), цифра 5 означає, що для виводу використовується 5 символів ,  (-), те що вирівнювання буде відбуватися по лівій стороні

%c{1} — виводить назву логера, у фігурних дужках регулюється наскільки повною видаватиметься назва

%L —номер рядка, в якій відбувася виклик запису у лог

%m — повідомлення, що було передано в лог

%n — перехід на новий рядок

Усе це детальніше подато у посібнику користувача.

середу, 25 вересня 2013 р.

Вимоги до програмістів

Час від часу переглядаю оголошення на роботу для програмістів. Деякі оголошення мене просто вражають. Одні доволі реальні, інші просто дивовижні і згадується мені давній анекдот:


Що було б якби до водіїв при влаштуванні на роботу пред’являлися вимоги, як до програмістів

Вакансія: водій.
Вимоги: професійні навички управлінні легковими та вантажними автомобілями, тролейбусами, трамваями, поїздами метрополітену і фунікулера, екскаваторами і бульдозерами, спецмашинами на гусеничному ходу, бойовими машинами піхоти і сучасними легкими / середніми танками, що знаходяться на озброєнні країн СНД і НАТО.


Навички раллійского і екстремального водіння – обов’язкові, досвід управління болідами F1 – вітається. Знання та досвід ремонту поршневих і роторних двигунів, автоматичних і ручних трансмісій, систем запалювання, бортових комп’ютерів, антиблокувальну систему, навігаційних систем (GPS) та автомобільних аудіосистем провідних виробників – обов’язкові. Досвід проведення кузовних та фарбувальних робіт вітається.

Претенденти повинні мати сертифікати:
Mercedes, BMV, Ceneral Motors, а також довідки про участь у великих міжнародних ралі не більш ніж дворічної давності. Зарплата 1500-2500 у.о., визначається за результатами співбесіди


середу, 11 вересня 2013 р.

JSP та кириличні запити

Почав розбиратися з JSP. Зробив найпростіший приклад і вийшла проблема з кирилицею. Коли запит приймається і формується html сторінка, вміст запиту відображається не в тому кодуванні. Хоча усюди усе на UTF-8.  При чому, що цікаво, що на комп'ютері з windows7 усе нормально, під windows XP проблема. Програмне забезпечення і там і там ставив одне і те ж Tomcat7, jdk7, Netbeans 7.3.1

Вирішується проблема частково через створення сервлет-фільтра, який запускається перед зверненням до будь якої jsp сторінки, або ж сервлета. Де додав у метод doBeforeProcessing рядок: request.setCharacterEncoding("utf-8");  Для POST запитів подіяло, але для GET не спрацьовує.

Почитав що можливо допоможе зміна деяких налаштувань в Tomcat. Інші рекомендації рекомендують погратися з локалями. Вирішив поки що в це не влазити, хоча судячи зі всього прийдеться, оскільки при зв'язці з базами даних проблема з кирилицею та різними кодуваннями прийдеться долати. В PHP якось проблем з цим по-менше :)

вівторок, 12 червня 2012 р.

Вступ в класи та методи

Клас, метод, ООП

Класи

Класи – це спеціального виду конструкції, які, дозволяють об’єднати ряд змінних різних типів в одне ціле. Крім власне даних, класи зазвичай включають підпрограми (в термінології java - методи) і можуть включати блоки(сукупність інструкцій між фігурними дужками {}) та інші класи(внутрішні класи). Таким чином утворюються нові типи даних.
Роз’яснення принципів побудови і роботи з класами доволі громіздка тема, тому тут розглянемо лише спрощені основи їх роботи і створення. Детальніше дивіться розділ присвячений класам. Розглянути зараз необхідно через те, що Java повністю об’єктно-орієнтована мова і з класами та пов’язаними з ними методами Ви стикатиметесь на кожному кроці. Зокрема навіть вивід даних System.out.prinln(); - здійснюється за допомогою класу System та методу println().
Для прикладу розглянемо наступну задачу: «Ви фанат збору 1 гривневих монет:). Назбирали їх чимало і хочете купити невеличкий сейф, щоб туди вмістилася ваша вся колекція і вбудувати цей сейф у стіну, щоб його з вашою колекцією не вкрали:). В інтернет-магазині вказані розміри сейфу. Постає питання, який же сейф вибрати? Оскільки сейф не один, то щоб не розраховувати вручну кожного разу об'єм сейфу, Ви захотіли написати відповідну програму.»
І так маємо:
/** 
 * CoinVoume.java
 */
public class CoinVolume {
    public static void main(String[] args) {
    double width1=10, height1=15, depth1=20;
    double width2=15, height2=20, depth2=15;
    double width3=15, height3=25, depth3=15;
 
    int    cointAmount=15000; //кількість монет - непогано зібрав :)
    double coinVolume=2*2*0.1; //приблизний об'єм монети=2*діаметр*товщину
    double safeVolume1;
    double safeVolume2;
    double safeVolume3;
    double totalCoinVol;
 
    totalCoinVol=cointAmount*coinVolume; // заг. об'єм, який займають монети
 
    safeVolume1=width1*height1*depth1; //об'єм першого сейфу
    safeVolume2=width2*height2*depth2;  //об'єм другого сейфу
    safeVolume3=width3*height3*depth3;  //об'єм третього сейфу
 
 
    System.out.println("Об'єм 1-го сейфу="+safeVolume1);
    System.out.println("Об'єм 2-го сейфу="+safeVolume2);
    System.out.println("Об'єм 3-го сейфу="+safeVolume3);
 
    System.out.println("Загальний об'єм монет="+totalCoinVol);
    }
}

Результат виконання:
Об'єм 1-го сейфу=3000.0
Об'єм 2-го сейфу=4500.0
Об'єм 3-го сейфу=5625.0
Загальний об'єм монет=6000.0 
Як бачимо з трьох не підійшов жоден, потрібен більший. Проте додавання кожного нового сейфу вимагає дописування доволі багатьох інструкції. Потрібно оголошувати три змінні для довжини, ширини та глибини сейфу, також потрібна змінна для об’єму та додавати інструкції обчислення та виводу на екран результатів. Звичайно, можна оцінювати по одному змінюючи значення змінних, але тоді прийдеться кожного разу перекомпільовувати і запускати програму. А якщо ви захочете ще раз оцінити розміри деяких сейфів, прийдеться виконувати роботу ще раз. Ось тут в пригоді і стане нам клас Safe. Зверніть увагу, що назва класу пишеться з великої букви. Рекомендовано давати назви класів з великої. Таким чином дуже просто розрізнити його від інших складових програми, наприклад назву класу від назви змінної, які прийнято називати з маленької букви.
Оголосити найпростіший клас можна так:
class Safe{
    double width;
    double height;
    double depth;
    double safeVolume;
}
Для його оголошення використовується ключове слово class та назва класу, далі іде тіло класу у фігурних дужках {}. Проте, хоч клас існує, ми не можемо так просто його використовувати. Ми повинні спочатку створити екземпляр даного класу (об’єкт). Для цього необхідно написати наступну інструкцію:
Safe mySafe1=new Safe();
де Safe – назва класу, mySafe – назва змінної, яка посилатиметься на наш об'єкт, new Safe() – створює об’єкт(при цьому відбувається виділення пам’яті під об’єкт). Таким чином ми створили перший сейф. Щоб створити другий сейф використовується аналогічна інструкція:
Safe mySafe2=new Safe(); //як бачимо змінилась лише назва змінної
Інколи класи порівнюють з формочкою для випічки печива, а саме печиво – це уже конкретний створений екземпляр (об’єкт). Форма може бути одна, а печива на її основі можна зробити безліч із різною начинкою. Так сама і з класом – це шаблон, а на його основі можемо створити безліч екземплярів даного класу.
Проте як же ми можемо звернутися до змінних об’єкту? Для цього використовується операція «.»(точка), а сама інструкція звернення в такій формі - назваОб’єкту.змінна:
mySelf1.width=10;
Перепишемо нашу програму з використанням класу Safe:
class Safe{
    double width=0;
    double height=0;
    double depth=0;
    double safeVolume=0; //додамо змінну, в якій зберігатиметься об'єм сейфу
}
public class CoinVolume {
    public static void main(String[] args) {
    //створюємо перший сейф
    Safe mySafe1=new Safe();
    //вказуємо його розміри
    mySafe1.width=10;
    mySafe1.height=15;
    mySafe1.depth=20;
    //обчислюємо об'єм сейфу
    mySafe1.safeVolume=mySafe1.width*mySafe1.height*mySafe1.depth;
 
    //аналогічно для другого сейфу
    Safe mySafe2=new Safe();
    mySafe2.width=10;
    mySafe2.height=15;
    mySafe2.depth=20;
    mySafe2.safeVolume=mySafe1.width*mySafe1.height*mySafe1.depth;
 
    //виводимо на консоль об'єми сейфів
    System.out.println("Об'єм 1-го сейфу="+mySafe1.safeVolume);
    System.out.println("Об'єм 2-го сейфу="+mySafe2.safeVolume);
    }
}
Щоб зосередитись на основному, з програми усунено обчислення об’єму монети. Компіляцію програми здійснюємо так же само як і попередню, за назвою класу в якому знаходиться метод main()— javac CoinVolume.java. Клас Safe не обов'язково може бути в одному і тому ж файлі, що і клас CoinVolume.
І так клас ми добавили, проте тепер вона виглядає складнішою ніж попередній варіант. Ситуацію виправити може використання методів.

Методи

Методи в java – це аналог підпрограм, функцій, процедур в інших мовах програмування. За допомогою методів ми виносимо текст повторюваного коду програми окремо в тіло методу, після чого можна викликати даний метод з будь-якого місця програми, безліч разів.
Спрощене оголошення та визначення методу, який ми зараз будемо використовувати, має вигляд:
тип_повернення  назва_методу(параметри){

//тіло методу;
інструкція1;
інструкція2;
…..
інструкціяN;
}
Тип_повернення – результат виконання методу, наприклад він може повертати об’єм сейфу, тоді тип_повернення буде double. Якщо метод нічого не повертає, то вказується слово ключове слово void.
Виклик методу здійснює наступна інструкція: назва_методу(параметри). Взагалі в термінології мов програмування для виклику методу використовуються аргументи, а в самому методі – це уже параметри, оскільки передаються лише значення змінних, а не самі змінні. Аргументи та параметри повинні бути одного і того ж типу. Якщо ми передаємо цілочисельне значення, то і параметр повинен бути цілочисельним і т.п. Тобто в методі створюються нові змінні. В деяких мовах, наприклад в С++, як аргумент можна передати посилання на певну змінну, таким чином її можна буде модифікувати в функції через вказівник на дану змінну. В Java в метод передаються лише значення змінних, тому розрізнення аргументів і параметрів менш суттєве і ми там і там використовуватимемо термін «параметр». Об'єкти ж в методи передаються по посиланню. Тобто, при передачі в якості аргументу об'єкта, буде передане посилання на об'єкт, а не створений новий об'єкт.
Повернемось до нашої програми. Повторюваними є присвоювання значень змінним, обчислювання та вивід об’ємів. Тому корисно буде створити два методи safeValue (double width, double height, double depth) та safeVolume (). Перший для присвоєння змінним значень, а другий для обчислення об'єму.
Модифікована програма матиме вигляд:
class Safe{
    double width=10; // поля класу можуть бути ініціалізовані з самого початку
    double height=10;
    double depth=10;
    double safeVolume=0;
 
    // метод присвоєння значень змінним
    void safeValue(double aWidth, double aHeight, double aDepth){
        width=aWidth;
        height=aHeight;
        width=aWidth;
    }
 
    // метод для обчислення об'єму сейфа
    double safeVolume(){
        return width*height*width;
    }
}
public class CoinVolume {
public static void main(String[] args) {
    double width1=10, height1=20, depth1=40;
    Safe mySafe1=new Safe(); //створюємо перший сейф
    Safe mySafe2=new Safe(); //створюємо другий сейф
 
    //задаємо розміри сейфу
    //викликаємо метод safeValue() класу Safe, що ініціалізує поля об'єкту
    mySafe1.safeValue(width1,height1,depth1);
    mySafe2.safeValue(10.0, 15.0, 15.5); //можна і так
 
    //виводимо на екран об'єми сейфів
    //для чого викликаємо метод safeVolume(), який повертає обчислений об'єм кожного сейфу
    System.out.println("Об'єм 1-го сейфу="+mySafe1.safeVolume());
    System.out.println("Об'єм 2-го сейфу="+mySafe2.safeVolume());
    }
}
Як бачимо код програми спростився. Тепер набагато легше модифікувати програму, додаючи нові сейфи. Крім того можна наприклад вивід повідомлення з інформацією про об’єм розмістити метод safeVolume() або в окремий метод, наприклад, printVolume().
Слід зауважити, щодо назв змінних-параметрів. Так для висоти, широти та глибини в методі safeValue() вибрані назви aWidth, aHeight, aDepth. Вони могли б мати назви і просто width, height, depth, але тоді б вони перекрили б доступ до однойменних змінних класу. В такому випадку, щоб звернутися до змінних класу з методу необхідно вживати ключове слово this. Наприклад: this.height=height - тут ми присвоюємо змінній класу this.height одержаний методом параметр height.

Конструктори

Замість методу safeValue(), який в нас заповнює змінні об’єкту значеннями ми можемо створити метод, який буде мати назву таку ж як і клас, тобто Safe(aWidth, aHeight, aDepth). Це дасть нам можливість ще скоротити програму, оскільки при створенні об’єкту ми зможемо зразу ж задавати розміри сейфу.
Safe mySafe1=new Safe(10.0, 15.0, 20.0)
Такі методи носять назву “конструктор класу”. Коли ми писали просто new Safe(); то віртуальна машина використовувала конструктор по замовчуванню без параметрів, який практично нічого корисного для нас не робив. Тепер же ми можемо використовувати новий створений нами конструктор.
Таким чином, новий варіант програми:
class Safe {
    final double width;
    final double height;
    final double depth;
 
    // конструктор
    Safe(double pWidth, double pHeight, double pDepth) {
        width = pWidth;
        height = pHeight;
        depth = pDepth;
    }
 
    // обчислюємо об'єм сейфу
    double getVolume() {
        return width * height * width;
    }
 
}
 
public class CoinsVolume {
    public static void main(String[] args) {
        double width1 = 10, height1 = 20, depth1 = 40;
        Safe safe1 = new Safe(width1, height1, depth1); // створюємо 1-й сейф
        Safe safe2 = new Safe(10.0, 15.0, 20.0); // створюємо 2-й сейф
        Safe safe3 = new Safe(10.3, 15.4, 20.5); // створюємо 3-й сейф
        Safe safe4 = new Safe(20.0, 30.0, 20.0); // створюємо 4-й сейф
 
        printSafeVolume(safe1, 1); // виводимо об'єм 1-го сейфу
        printSafeVolume(safe2, 2);
        printSafeVolume(safe3, 3);
        printSafeVolume(safe4, 4);
    }
 
    // вивід об'єму сейфу
    // safe - сейф
    // number - номер сейфу
    static void printSafeVolume(Safe safe, int number) {
        System.out.println("Об'єм " + number + "-го сейфу=" + safe.getVolume());
    }
 
}
Результат виконання:
Об'єм 1-го сейфу=2000.0
Об'єм 2-го сейфу=1500.0
Об'єм 3-го сейфу=1633.786
Об'єм 4-го сейфу=12000.0 
В наведеному прикладі, щоб обчислити об’єм нового сейфу, нам потрібно додати лише два рядочки тексту (дві інструкції). Щоправда навіть це можна автоматизувати за допомогою використання іншого типу даних – масивів, які будуть розглядатися пізніше. Можна також додати клас Coin, в якому був би метод для обчислення сукупного об’єму різноманітних монет. Ви можете спробувати зробити таку програму зараз. Це буде корисним для засвоєння викладеного матеріалу.
Тема класів та методів значно комплексніша, тому основне, що Ви повинні винести з даного розділу -це розуміння того, як використовуються методи класів. Java надає великий набір уже готових класів та методів, які значно спрощують роботу програміста.

Повний варіант книги знаходиться на Вікіпідручнику

четвер, 29 грудня 2011 р.

Підсвітка синтаксису на Blogger.com

Вирішив я попробувати блогерського щастя на blogger.com. Отримав красивий URL з закінченням blogspot.com і почав створювати статті. Перша ж незручність - це відсутність підсвітки синтаксису коду програм. Почав шукати як підключити, знайшов, проте коли почав експериментувати, чомусь ряд прикладів зі встановлення не запрацювало. Частково мабуть через те, що деякі статті були погано розписані, частково мабуть через те, що я не до кінця зрозумів як. Тут я вирішив навести, те, що в мене без проблем вийшло і запрацювало.

Перше, що я знайшов, як дещо покращити зовнішній вигляд коду задавши стиль для тегу <pre>. Для цього достатньо в оригінальний код додати наступний код:
pre {
  background-color:#FCFBF8;
  border-color:#CCCCCC;
  border-style:solid;
  border-width:1px 1px 1px 1px;
  line-height:1.2em;
  margin:1em auto;
  overflow:auto;
  padding:1em;
  width:90%;
  word-wrap:normal; /* IE Fix */
}

Я це зробив за допомогою переходу на Шаблон/Налаштування/Додатково у списку знаходемо "Додайте CSS". Додаємо і зберігаємо. Можна також вставити і напряму в код шаблону. Тепер усе, що треба це взяти наш код у тег <pre>. Одержуємо код в рамочці із смугами прокрутки, а хотілося б все ж підсвітку синтаксису.

Тому наступні мої пошуки привели до наступного способу. Заходимо в пункт "Шаблон" і тиснемо кнопку "Редагувати HTML" і там перед тегом <head> вставляємо:

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> 

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script> 

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script> 

<script language='javascript'> 

SyntaxHighlighter.config.bloggerMode = true;

SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';

SyntaxHighlighter.all();

</script>
Для пришвидшення завантаження сторінки в браузері можна викинути деякі рядки з мовами, які Ви не збираєтесь використовувати. Якщо потрібно лише кілька мов, викидаємо зайві рядки. Тепер обрамляємо наш текст тегами <pre> з вказанням відповідної мови:

<pre class="brush: html">

</pre> 

Дивіться також:

Як навчитись програмувати і з якої мови почати

Такі питання часто задають початківці і відповідей на дану тему чимало. Хто радить з Паскалю, хто з С++, хто С#, а хто ще з чогось. Дехто пропонує навіть з Асемблера. Кожен відповідає по власному досвіді. Тож і я вирішив викласти свою думку:).

Я свого часу починав із звичайно Бейсіку. Як для учнів середніх класів годиться. Також годиться і Паскаль. Нічого поганого, щоб почати з даних мов немає, для навчання основ програмування годиться. Але якщо ви справді хочете бути програмістом, то краще починати уже з повноцінної мови, хоча б з Visual Basic або Delphi. А краще починати з тієї по якій найбільше книг в даний час, тобто C++, С#, Java або з мов Веб-програмування (PHP та Perl). Можна навіть і з Асемблеру під персональний комп'ютер, мені наприклад він видався доволі простим для засвоєння і після вивчення його багато речей стали зрозумілими, які я не розумів при вивченні С++ і які збивали з толку, тобто сама зв'язка машини і програми, як усе працює.  Хоча Асемблер все ж важче вивчити самостійно і це потребує значно більше клопіткої праці в плані написання програми, адже текст програми буде в 10-ки раз більший ніж на високій мові програмування. За нього краще братися, якщо ви хочете працювати з апаратним забезпеченням, хоча існують версії асемблера, які дозволяють створювати повноцінні графічні прикладні програми. Проте, якщо ви взагалі не знайомі з програмування, то з нього краще не розпочинати.

Звичайно, що якщо ви вчитесь у ВИШІ і у вас йде курс, наприклад, С++. То не варто кидатись на іншу мову, засвойте всі особливості С++ понад те, що Вам дають у ВУЗІ. Взагалі навчання під керівництвом викладача найлегший спосіб, проте для студентів ставляться переважно занижені вимоги. Після такого курсу ви здебільшого будете знати основи програмування, але це не зробить Вас професіоналом. Щоб ним стати, потрібна самостійне вивчення усіх нюансів мови і саме головне практика. У ВУЗІ лабораторні для того і існують. Як і зі звичайними мовами спілкування, без практики ви нічого не засвоїте. Тож якщо ви вибрали книжку і вчите самі, то після кожного розділу з новим матеріалом, поставте собі задачу і запрограмуйте. Або хоча б попробуйте позмінювати наведені приклади в книжці. Бажано також вкінці намітити великий проект, який би ви запрограмували. Це може бути навіть ваш особистий текстовий редактор і т.п. Оскільки лише при виконанні великих проектів Ви отримаєте найбільше досвіду. На даром у ВУЗАх вивченння курсу по програмуванню закінчується курсовою роботою.

Особисто я радив би з самого початку намітити, що б ви хотіли запрограмувати і з цього орієнтуватися на вибір мови і книги. Якщо ви хочете навчитися створювати веб-сторінки, то краще зразу почати, наприклад з основ HTML, а згодом перейти уже власне до програмування на PHP. При цьому, якщо ви вирішили що кінцевим результатом буде Веб-магазин, так зразу продумуйте під час читання, що вам згодиться і починайте його реалізовувати поступово. Прочитали щось, внесли зміни. Звичайно вкінці Вам можливо прийдеться докорінно переписати код, але це набагато цікавіше ніж виконувати дрібні навчальні приклади.

Тож якщо ж ви вирішили створити настільну програму, так беріться за C++, С# або Java і гризіть мову до найбільших дрібниць, поки не реалізуєте задумане. Насправді у всіх сучасних мовах є схожі елементи і перейти на іншу можна і за тиждень, якщо ви уже навчились навичкам програмування і особливостям різним технологій, як то програмування для комп'ютерних мереж і т.п. Щоправда постійно з'являється щось нове, тому навчатися прийдеться і пізніше, але це сучасний стиль життя. На заході навіть термін придумали відповідний Lifelong Learning - навчання впродовж життя.

Окремо слід згадати про вибір підручника. Зараз мови програмування розвиваються доволі динамічно, кожних 5-10 років з'являються нововведення. Тому підручник бажано брати якомога новіший. Найновіші звичайно в англомовному варіанті, тому якщо ви не володієте англійською то підтягуйте її паралельно, оскільки не можливо стати професійним програмістом без неї. Якщо ж ви берете перекладену книгу то беріть також якомога новішу. Бажано почитати, які книги радять читати інші програмісти. Загалом, якщо книга витримала кілька видань, то переважно вона уже доволі непогана.

Працювати над вивченням потрібно постійно. Інколи - це може видатися доволі нудним, особливо коли натрапити на важку тему, а інколи навпаки може затягувати, адже програмування - це як рішення кросворду. Тому треба набратися терпіння. Тут можна порадити, якщо ви вчите самі без репетитора чи викладача, знайти когось хто б ще хотів вивчити програмування, або цю мову. Це може бути навіть людина з якою ви спілкуєтесь по інтернету. Разом буде цікавіше. Наприклад, Ви домовляєтесь що читаєте таку тему, а потім обговорюєте її і пробуєте писати програму кожен на свому компі. Далі беретесь за наступний розділ. Таким чином Ви один одного підганятимете. Можна також знайти когось на форумах програмістів, хто б допомагав Вам розібрати певну програму, яка в Вас не виходить. З україномовних форумів можна порадити форум Гуртом.

При програмуванні приділіть час вивченню середовища розробки, особливу увагу зверніть на засоби зневадження (debugging) програм. Вміння використовувати можливості середовища розробки значно скоротить Ваш час при роботі над великими проектами.



28.01.2013
Зараз у вільному доступі на Youtube і на різних блогах є чимало відеоматеріалів по програмуванню. Книжку вони не замінять, оскільки матеріал, що можна таким чином пояснити все ж обмежений,  проте, як додаток до освоєння окремих розділів, відеоуроки будуть доволі корисні, особливо для початківців.