четвер, 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> 

Cтворюємо графіки з допомогою JFreeChart

Декілька років назад довелося малювати графік в Java аплеті. Як виявилося не така вже й проста задача, особливо коли кількість даних постійно змінюється і розміри аплета теж. Тоді ж натрапив на безкоштовну бібліотеку JFreeChart, яка дозволяє малювати діаграми різного типу: графіки, стовпцеві діаграми, кругові і т.д. Зараз таких бібліотек доволі багато як безплатних так і платних. Платні переважно надають доволі непогану візуалізацію з ефектами об’ємності і т.п. JFreeChart дещо гірше промальовує графіку, але порівняно з іншими безкоштовними – це одна із найкращих, яка має багато засобів для модифікації вигляду графіку, виводу міток і написів над точками, масштабування осей та графіків тощо. Щоправда дещо заплутана документація. Існує також платний посібник розробника, який дещо детальніше описує процес створення. Багато прикладів можна знайти в Інтернеті і роз’яснень до них. Можна навіть скачати посібник до старіших версій бібліотеки.
Для використання JFreeChart необхідно скачати два jar файли JCommon та JFreChart з офіційного сайту. В інструкції по встановленню описано як можна підключити бібліотеки для використання разом з NetBeans та Eclipse. Також можна запустити демонстраційну програму, яка демонструє приклади готових графіків. Їхній код можна отримати разом з посібником. Багато прикладів програм можна знайти тут:  http://www.java2s.com/Code/Java/Chart/CatalogChart.htm
Алгоритм створення графіку простий:
1)    Створити набір даних (dataset)
2)    Створити об’єкт діаграми, який відповідатиме за вивід діаграми
3)    Додати графік на якусь графічну компоненту

Розглянемо як можна намалювати звичайний лінійний графік.  Їх можна створити засновуючись на двох типах даних, які базуються на інтерфейсах CategoryDataset та XYDataset.
Перший вид графіків передбачає, що на одній з осей будуть знаходитись цифрові значення, а на іншій текстові значення (категорії).

Другий тип передбачає, що і по X та по Y знаходяться числові значення. Саме такий ми будемо будувати.
Існують також можливість створення часових діаграм, на яких одна з осей представляє собою час. Дані графіки базують на XYDataset .
Вибір типу діаграми визначає які класи будуть застосовуватись при її створенні і відповідно, які методи будуть  доступні для роботи з даною діаграмою.
Далі наведений приклад програми, що малює два графіки на одній області.
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class FirstXYChart {
public static void main(String[] args) {

 JFrame frame = new JFrame(); //створюємо каркас вікна
 frame.setTitle("Графік");    //заголовок вікна
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 //створюємо 1 ряд даних
 XYSeries series = new XYSeries("Ряд1 1");
 //додаємо точки на графіку
   series.add(1, 11);
   series.add(2, 12);
   series.add(3, 13);
   series.add(4, 14);
   series.add(5, 15);
   series.add(6, 16);
   series.add(7, 17);
   series.add(8, 58);
   series.add(9, 19);
   series.add(10, 11);

//створюємо 2 ряд даних
XYSeries series2 = new XYSeries("Ряд1 2");
   series2.add(2, 1);
   series2.add(2, 3);
   series2.add(4, 3);
   series2.add(4, 5);
   series2.add(6, 7);
   series2.add(6, 8);
   series2.add(9, 7);
   series2.add(8, 28);
   series2.add(13, 9);
   series2.add(12, 12);

// зразу ж додаємо ряд в набір даних
XYSeriesCollection data = new XYSeriesCollection(series);
data.addSeries(series2); // додаємо другий ряд в набір
//створюємо діаграму
final JFreeChart chart = ChartFactory.createXYLineChart(
  "XY Series Example",
  "X",
  "Y",
  data,
  PlotOrientation.VERTICAL,
  true,
  true,
  false
);

 //створюємо панель для графіка
 final ChartPanel chartPanel = new ChartPanel(chart);
 //встановлюємо розмір графіка
 chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
 //додаємо панель на створений нами фрейм
 frame.setContentPane(chartPanel);
 //підганяємо розміри фрейму
 frame.pack();
 //робимо усе видимим
 frame.setVisible(true);
 }
}
Результат:

Практично схожим чином можна створювати і інші типи діаграм.
Модифікація діаграм
В JFreeChart також передбачені широкі можливості по зміні зовнішнього вигляду діаграми.
Наприклад, змінюємо фон:
XYPlot plot=chart.getXYPlot();         // одержати область побудови діаграми
plot.setBackgroundPaint(Color.CYAN);   // встановлюємо колір

Крім задання кольору, можна поставити як фон певне зображення.
Якщо хочемо змінити колір кривих:
XYItemRenderer renderer=plot.getRenderer();  //отримати візуалізатор(рендерер)
renderer.setSeriesPaint(0, Color.darkGray);  // задаємо колір першого графіка
renderer.setSeriesPaint(1, Color.GREEN);     // задаємо колір другого графіка

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

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

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

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

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

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

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

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

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

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



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

Читання каталогу на Java

Прийшлось вирішувати наступну задачу. Необхідно було за допомогою програми на java збити дані з файлів в каталозі в один. Крім власне читання з файлів і запису, виникла необхідність прочитати вміст каталогу і одержати список файлів.
Читання вмісту каталогу
Для роботи з файлами і каталогами (папками) слугує клас File. Каталог по суті представляє той же File-об'єкт, який містить список інших файлів і каталогів. Перевірка такого об’єкта в java виконується за допомогою методу isDirectory().
  

import java.io.File; //імпортуємо відповідний клас

**
* @author volodimirg
*/
public class AllInFileTest {
 public static void main(String[] args) {
  String dirname="D:\\install\\tmp"; // наша робочий каталог
  File ourFile=new File(dirname); // створюємо File-об'єкт

  if (ourFile.isDirectory()){
  System.out.println("Каталог: "+dirname);
  String files[]=ourFile.list(); //одержуємо і заносимо список файлів в масив
  for (int i=0;i<files.length;i++){
   File f =new File (dirname+"/"+files[i]); //беремо для перевірки кожен File-об'єкт в каталозі
  if (f.isDirectory()){
    System.out.println(files[i]+" - це каталог");
  }else{
  System.out.println(files[i]+" - це файл");
  }
 }
 }
 }
}

Каталог: D:\\install\\tmp
1-49і.csv - це файл
1-2і.csv - це файл
1-3і.csv - це файл
1-5і.csv - це файл
1-7і.csv - це файл
1-9і.csv - це файл
1-11і.csv - це файл
1-13і.csv - це файл
1-15і.csv - це файл
1-17і.csv - це файл
1-19і.csv - це файл
1-21і.csv - це файл
1-23і.csv - це файл
1-25і.csv - це файл
1-27і.csv - це файл
1-29і.csv - це файл
1-31і.csv - це файл
1-33і.csv - це файл
1-35і.BAK - це файл
1-47і.csv - це файл
1-45і.csv - це файл
1-43і.csv - це файл
1-41і.csv - це файл
1-39і.csv - це файл
1-37і.csv - це файл
1-51і.csv - це файл
1stTree Lypa40rЖовтня.xlsx - це файл
1-1і.csv - це файл
Other - це каталог
My - це каталог
Проте для виконання поставленої задачі необхідно перебирати файли у посортованому вигляді.
Сортування списку файлів
Порившись в інтернеті можна знайти поради використовувати класи з колекцій пакету java.util і зокрема Comparator для сортування файлів у списку. Хоч це не складний спосіб, та й лінь згадувати і розбиратись, тим більше, що знайшов простіший спосіб. У тому ж пакеті міститься клас Array, який надає ряд зручних методів для роботи з масивами. Зокрема і метод для сортування масиву sort().
Таким чином наша програма потребує лише додавання двох рядків:
import java.util.*; //підключаємо відповідний клас
….
Arrays.sort(files); //сортуємо масив, результат повертається у тому ж масиві
Повний текст програми наступний.
import java.io.File; //імпортуємо клас File
import java.util.Arrays; // імпортуємо клас Arrays
/**
* @author volodimirg
*/
public class AllInFileTest {
public static void main(String[] args) {
 String dirname=" D:\\install\\tmp "; // наш робочий каталог
 File ourFile=new File(dirname); // створюємо File-об'єкт

 if (ourFile.isDirectory()){
   System.out.println("Каталог: "+dirname);
   String files[]=ourFile.list(); //одержуємо і заносимо список файлів в масив
   Arrays.sort(files); // сортуємо масив, результат у тому ж масиві
   for (int i=0;i<files.length;i++){
     File f =new File (dirname+"/"+files[i]); //беремо для перевірки кожен File-об'єкт в каталозі
     if (f.isDirectory()){
       System.out.println(files[i]+" - це каталог");
     }else{
     System.out.println(files[i]+" - це файл");
  }
 }
}
}
}