Čtvrtek srpen 13, 2009
imagecreatefromjpeg() recoverable error: Premature end of JPEG file
· rubrika Clanky · kategorie Programování
Pokud pracujete s knihovnou GD, mohlo by se vám stát, že narazíte na chybovou hlášku:
imagecreatefromjpeg() recoverable error: Premature end of JPEG file
Naštěstí lze tuto chybou hlášku obejít pomocí nastavení ini souboru, kdy je chyba ignorována a vesele se pokračuje dále. V PHP kódu (lze nastavit i přímo v ini souboru, ale k němu mnohdy není umožněn přístup) se tato možnost nastaví následovně:
ini_set(’gd.jpeg_ignore_warning’, 1);
16:19
—
Komentář
—
Stálý odkaz
Úterý duben 28, 2009
PHP třída pro tvorbu webových formulářů
· rubrika Clanky · kategorie Programování
Pokud náhodou hledáte v PHP třídu pro jednoduchou a rychlou tvorbu formulářů, zkuste třídu Form. Je šířena pod GNU licencí, takže si ji v případě nutnosti můžete upravit.
17:38
—
Komentář
—
Stálý odkaz
Úterý březen 31, 2009
Zpropadený Firefox aneb synchronizace u XMLHttpRequest
· rubrika Clanky · kategorie AJAX
Je tomu teprve pár týdnů, kdy jsem se začal věnovat AJAXu, protože jsem ho potřeboval použít v mé diplomové práci. V ní jsem potřeboval zavolat jeden skript a po jeho dokončení ho znovu zavolat, jen s jinými parametry. Výsledky běhu skriptu (tzn. proběhlo to ok, nastala nějaká chyba), jsem chtěl zobrazovat do různých objektů na XHTML stránce. Napsal jsem si tedy tři funkce na práci s XMLHttpRequest, kde jsem v jedné z nich použil následující kód:xmlhttp.open("GET",url,false);
Třetí parametr metody open říká, zda se má čekat na odpověď či nikoliv tzn. zda se použije synchroní nebo asynchroní mód.
Celé to funguje tak, že při synchroním přenosu, dojde k vytvoření nového vlákna přičemž původní je pozastaveno (tzn. je pozastavena veškerá interaktivita na straně klienta). V nově vytvořeném vláknu dojde k vyřízení požadavku a po jeho skončení se opět aktivuje vlákno původní a to zpracuje získaný výsledek. V druhém případě se nové vlákno nevytváří a uživatel tak může klidně dále využívat interaktivních stránek a po dokončení požadavku, je jeho výsledek zpracován.
Vše fungovalo dobře v Opeře 9.64, tak jsem to vyzkoušel i v IE 8 a následně ve Firefoxu 3.0.8. Jak jsem překvapivě zjistil, v mé nynější (a nejnovější) verzi Firefoxu synchroní přenos nefunguje (na internetu jsem se po té našel informace o nějakém bugu, ale už nevím kde
Druhou metodou lze poslat více požadavků najednou a současně čekat na jejich vyřízení. Tuto variantu jsem nechtěl použít z důvodu toho, že skript na který se odkazuji exportuje data z databáze a importuje do jiné. Mnohdy jde i o statisíce záznamů a tak jsem nechtěl server moc zatěžovat vícenásobným spuštěním skriptu. Bohužel jsem po několika hodinách dospěl k názoru, že je to jediné možné řešení.
Pokud například chceme výsledky zobrazovat v různých objektech na (X)HTML stránce, tak jako já v diplomce, stačí k tomu použít třídu v JavaScriptu, kde si dokážeme uchovat jednotlivé instance XMLHttpRequestu a id objektu (bez použití třídy by jsme o ně přišli). Napsal jsem si tak vlastní třídu, kterou můžete najít níže. Předem bych chtěl schovívavost ke kódu. Vím, že mnou napsaná třída nesplňuje požadavky na znovupoužitelnost, až budu mít více času upravím ji
Zdrojový kód:
- /**
- * Trida pro vykonavani Http pozadavku (AJAX)
- */
- function HttpClient() { } // HTTPCLIENT CLASS
- HttpClient.prototype = {
- // GET nebo POST
- request_type:'GET',
- // synchroni a nebo asynchroni pozadavek (synchroni nefunguje ve firefoxu 3 neco
) - request_async:true,
- // instance
- xmlhttp:false,
- //kde se zobrazi vysledek
- where_show_content:'',
- // inicializace -> vytvoreni XMLHttpRequest
- init:function() {
- try {
- // Mozilla / Opera / Safari
- this.xmlhttp = new XMLHttpRequest();
- }
- catch (e){
- // IE (snad vsechny nejpouzivanejsi verze)
- var MSXML = new Array('MSXML2.XMLHTTP.5.0',
- 'MSXML2.XMLHTTP.4.0',
- 'MSXML2.XMLHTTP.3.0',
- 'MSXML2.XMLHTTP',
- 'Microsoft.XMLHTTP');
- var ok = false;
- for (var i=0;i < MSXML.length && !ok; i++){
- try {
- this.xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]);
- success = true;
- }
- catch (e){}
- }
- if (!success){
- alert('Váš prohlížeč napodporuje AJAX!');
- }
- }
- },
- //provedeni pozadavku
- request: function(url){
- if (!this.xmlhttp){
- this.init();
- }
- this.xmlhttp.open(this.request_type,url,this.async);
- this.xmlhttp.send(null); //pro posilani POST pozadavku
- //zobrazení loadingu
- document.getElementById(this.where_show_content).innerHTML = '<img src=\"images/loading.gif\" alt="" />';
- //zpristupneni this ve funkci
- var self = this;
- this.xmlhttp.onreadystatechange = function(){
- switch(self.xmlhttp.readyState) {
- case 0:
- break;
- case 1:
- break;
- case 2:
- break;
- case 3:
- break;
- case 4:
- if (self.xmlhttp.status == 200) {
- document.getElementById(self.where_show_content).innerHTML = self.xmlhttp.responseText;
- }else {
- alert('HTTP Chyba při vykonávání dotazu: ' + '[' + self.xmlhttp.status + ']' + ' ' + self.xmlhttp.statusText);
- }
- break;
- }
- }
- }
- }
- /**
- * ukazka volani tridy
- */
- var client = new HttpClient();
- client.async = true; //asynchroni mod
- client.where_show_content = 'main-box'; //kde zobrazit vysledek
- client.request('localhost/diplomka?pg=ajax'); //url pozadavku
20:00
—
Komentář
—
Stálý odkaz
Čtvrtek únor 26, 2009
PHP Funkce pro načtení jednoho řádku ze souboru
· rubrika Clanky · kategorie Programování
Už jsem se mnohokrát setkal s tím, že jsem potřeboval číst data ze souboru po jednotlivých řádcích. Všimnul jsem si také, že mnoho lidí v různých diskuzích se ptá, jak číst ze souboru po jednotlivých řádcích, proto bych se chtěl s Váma podělit o moji funkci, kterou jsem si na to napsal. Funkce rozlišuje tři možné ukončení řádků a lze ji použít i na velké soubory!Zdrojový kód:
- <?php
- function getLine($file) {
- while (!feof($file)) {
- //precteme znak a pridame ho do bufferu
- $character = fgetc($file);
- $buffer .= $character;
- /**
- * Pohlidame si konec radku (EOL) v souboru:
- *
- * \n - Unix
- * \r\n - Windows
- * \r - Mac
- *
- */
- if (($character == "\x0a") || ($character == "\x0d")) {
- $character = fgetc($file);
- if ($character != "\x0a") {
- // neni soucasti EOL, vratime se o jeden znak zpet
- fseek($file, -1, SEEK_CUR);
- }
- // EOL ukoncime cteni
- break;
- }
- }
- //vratime jeden radek
- return $buffer;
- }
- ?>
Zdrojový kód:
- <?php
- $fp = fopen("export.sql", r);
- echo "<pre>";
- while (($line = getLine($fp, "sql"))!==false){
- $line = trim($line); //odstraneni prazdnych znaku
- if (!empty($line))echo $line."<br />"; //nevypiseme prazdne radky
- }
- echo "</pre>";
- ?>
17:57
—
Komentář
—
Stálý odkaz
Středa únor 25, 2009
PHP funkce převádějící čísla na excelovské názvy sloupců
· rubrika Clanky · kategorie Programování
Nedávno jsem programoval export dat z databáze do formátu xlsx (MS Excel), kde jsem využil projektu "PHPExcel":http://www.codeplex.com/PHPExcel/. Jak asi víte, při základním nastavení jsou v Excelu jednotlivé sloupce označeny písmeny např. AC. Využívá se písmen A-Z, kde A odpovída číslu 1, B číslu 2 atd. Při exportu dat jsem tak potřeboval dle počtu sloupců v tabulce vytvořit příslušný počet "excelovských názvů" sloupců.Po chvilce zamyšlení mne napadlo převést si tento problém do matematiky, kde by se v základu dalo využít způsobu převodu dekadického čísla do jakékoliv jiné číselné soustavy. Stačí si představit písmena A-Z jako čísla 0-25 a k číslu následně přičíst 65 aby jsme dostali odpovídající číselnou hodnotu znaku v ascii tabulce. Toto ovšem nemůžeme použít, nedostali by jsme to co přesně chceme. Po sloupci s označením Z následuje AA, po AZ následuje BA atd., ale pouhým převodem do jiné soustavy dostaneme něco podobného:
Array ( [0] => 90 ) Z Array ( [0] => 66 [1] => 66 ) BBZ tohoto důvodu je třeba funkci pro převod upravit. Výslednou funkci i s testovacím výpisem naleznete zde:
Zdrojový kód:
- <?php
- /* funkce prevadejici cisla 1...n na nazvy sloupcu v excelu A,B,C,...AA,AB,AC,....AAA,AAB,AAC,.... */
- function getExcelColumnsNames($column) {
- //cisla mensi 26 muzeme rovnou vratit
- if ($column>=26){
- //delime dekadicke cislo 26 dokud neziskame vsechny zbytky po deleni
- while (ceil($column/26)!= 0){
- if (($column % 26)+64 != 64){ //
- $num[] = ($column % 26)+64;
- $column = floor($column/26);
- }else{
- unset($num);
- break;
- }
- }
- }else{
- $num[] = $column+65;
- }
- return $num;
- }
- // TEST funkce
- // vypis 720 sloupcu
- for ($j=0; $j<=720;$j++ ) {
- $array = getExcelColumnsNames($j);
- for ($k=count($array); $k>=0;$k--) {
- echo chr($array[$k]);
- }
- }
- ?>
16:09
—
Komentář [2]
—
Stálý odkaz
Sobota prosinec 22, 2007
Semestrálka z Javy - dokončeno!
· rubrika Clanky · kategorie Programování
Tento týden jsme dostali zadání semestrální práce z Javy. Jak jsem se s tím vypořádal můžete vidět níže. Ještě to není úplně hotové, nemám totiž dořešené ukončení spuštěného vlákna!EDIT: Již je to plně funkční
Toto je zdroják hlavního souboru "main.java":
Java - main.java
- package ksi.tul.cz.jan.kahoun;
- public class main {
- public static void main(String[] args) {
- //vytvorime nove okno a nastavime mu parametry
- window okno1= new window("Semestralni prace", 800, 500);
- okno1.setVisible(true);
- }
- }
Java - window.java
- package ksi.tul.cz.jan.kahoun;
- import java.awt.BorderLayout;
- import java.awt.GridLayout;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.io.File;
- import java.io.IOException;
- import javax.swing.JButton;
- import javax.swing.JFileChooser;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JProgressBar;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- public class window extends JFrame implements ActionListener{
- private JButton btnStart, btnStop, btnExit, btnFile1, btnFile2;
- private JLabel label1,label2,label3;
- private JTextField textfield1,textfield2,textfield3;
- private JPanel panel1,panel2, panel3, panel4, panelMain;
- private JTextArea textarea;
- private JProgressBar bar;
- private File dir1, dir2;
- private String extension;
- private boolean editable = false;
- private thread proc;
- private Thread procThread;
- public window(String title, int width, int height){
- /*
- *
- * NASTAVENI GRAFICKEHO ROZHRANI
- *
- */
- this.setSize(width,height);
- this.setTitle(title);
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- panel1= new JPanel(new GridLayout(1,3));
- btnStart = new JButton("Start");
- btnStop = new JButton("Stop");
- btnStop.disable();
- btnStop.addActionListener(this);
- btnExit = new JButton("Exit");
- btnExit.addActionListener(this);
- panel1.add(btnStart);
- panel1.add(btnStop);
- panel1.add(btnExit);
- panel2= new JPanel(new BorderLayout());
- panel3= new JPanel(new BorderLayout());
- panel4= new JPanel(new BorderLayout());
- panelMain= new JPanel (new GridLayout(4,1));
- label1= new JLabel("Adresar pro zpracovani: ");
- label2= new JLabel("Pripona souboru: ");
- label3= new JLabel("Vystupni adresar: ");
- textfield1=new JTextField();
- textfield1.setEditable(editable);
- textfield2=new JTextField();
- textfield3=new JTextField();
- textfield3.setEditable(editable);
- btnFile1=new JButton("...");
- btnFile2=new JButton("...");
- panel2.add(label1, BorderLayout.WEST);
- panel2.add(textfield1, BorderLayout.CENTER);
- panel2.add(btnFile1, BorderLayout.EAST);
- panel3.add(label2, BorderLayout.WEST);
- panel3.add(textfield2,BorderLayout.CENTER);
- panel4.add(label3, BorderLayout.WEST);
- panel4.add(textfield3, BorderLayout.CENTER);
- panel4.add(btnFile2, BorderLayout.EAST);
- //vytvorime progressbar a nastavime ho
- bar= new JProgressBar(0,100);
- bar.setValue(0);
- bar.setStringPainted(true);
- textarea= new JTextArea();
- //taLog.setSize(600, 400);
- JScrollPane scrollPanel= new JScrollPane(textarea);
- //panelDia.add(scrollPanel);
- //vytvorime hlavni panel
- panelMain.add(panel1);
- panelMain.add(panel2);
- panelMain.add(panel3);
- panelMain.add(panel4);
- //rozmistime komponenty a panel
- this.setLayout(new BorderLayout());
- this.getContentPane().add(panelMain,BorderLayout.NORTH );
- this.getContentPane().add(scrollPanel, BorderLayout.CENTER);
- this.getContentPane().add(bar, BorderLayout.SOUTH);
- btnStart.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- btn1Start(e);
- }
- });
- btnStop.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- btn2Stop(e);
- }
- });
- btnExit.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- btn3Exit(e);
- }
- });
- btnFile1.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- btn4Vstup(e);
- }
- });
- btnFile2.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- btn5Vystup(e);
- }
- });
- /*
- *
- * VYTVORENI VLAKNA
- *
- */
- thread proc = new thread(dir1, dir2, extension, textarea, textfield1, textfield2, textfield3, bar);
- Thread procThread = new Thread(proc);
- procThread.stopped = false;
- }
- /*
- *
- * TLACITKO PRO ZADANI VSTUPNIHO ADRESARE
- *
- */
- protected void btn4Vstup(ActionEvent e) {
- // TODO Auto-generated method stub
- JFileChooser fc1;
- fc1 = new JFileChooser();
- //nastavime, ze chceme zobrazovat pouze adresare
- fc1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- int returnVal = fc1.showOpenDialog(this);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- dir1 = fc1.getSelectedFile();
- if (!dir1.getPath().equals("")) {
- textfield1.setText(dir1.getPath());
- }
- }
- }
- /*
- *
- * TLACITKO PRO ZADANI VYSTUPNIHO ADRESARE
- *
- */
- protected void btn5Vystup(ActionEvent e) {
- // TODO Auto-generated method stub
- JFileChooser fc2;
- fc2 = new JFileChooser();
- //nastavime, ze chceme zobrazovat pouze adresare
- fc2.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- int returnVal = fc2.showOpenDialog(this);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- dir2 = fc2.getSelectedFile();
- if (!dir2.getPath().equals("")) {
- textfield3.setText(dir2.getPath());
- }
- }
- }
- /*
- *
- * TLACITKO PRO SPUSTENI VLAKNA
- *
- */
- protected void btn1Start(ActionEvent e) {
- //ziskame priponu a prevedeme ji na male znaky
- extension = textfield2.getText().toLowerCase();
- //jsou zadane potrebne veci?
- if (!extension.equals("") && !textfield1.getText().equals("") && !textfield3.getText().equals("")){
- btnStop.setEnabled(true);
- btnStart.enable(false);
- //spustime vlakno
- procThread.stopped = false;
- procThread.start();
- btnStop.enable(false);
- btnStart.enable(true);
- }
- else {
- textarea.setText(textarea.getText()+"Nezadali jste příponu nebo jste nevybrali adresář(e)!\n");
- }
- }
- /*
- *
- * TLACITKO PRO ZASTAVENI VLAKNA
- *
- */
- protected void btn2Stop(ActionEvent e) {
- // TODO Auto-generated method stub
- textarea.setText(textarea.getText()+"Zmacknuto tlacitko stop! \n");
- procThread.stopped = true;
- if (!btnStart.isEnabled()){
- procThread.stop();
- procThread.destroy();
- btnStart.setEnabled(true);
- btnStop.disable();
- }
- }
- /*
- *
- * TLACITKO PRO UKONCENI APLIKACE
- *
- */
- protected void btn3Exit(ActionEvent e) {
- // TODO Auto-generated method stub
- dispose();
- System.exit(0);
- }
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- }
- }
Java - thread.java
- package ksi.tul.cz.jan.kahoun;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- import javax.swing.JProgressBar;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- public class thread implements Runnable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String extension;
- private File dir1, dir2;
- private int af_count, l_count, f_count;
- private JTextArea textarea;
- private JProgressBar bar;
- private JTextField textfield1,textfield2,textfield3;
- public boolean stopped;
- public thread(File dir1, File dir2, String extension, JTextArea textarea, JTextField textfield1, JTextField textfield2, JTextField textfield3, JProgressBar bar) {
- this.dir1 = dir1;
- this.dir2 = dir2;
- this.extension = extension;
- this.textarea = textarea;
- this.bar = bar;
- this.textfield1 = textfield1;
- this.textfield2 = textfield2;
- this.textfield3 = textfield3;
- }
- @Override
- public void run() {
- while (!stopped) {
- //vynulujeme statistiky, textareau a progress bar
- textarea.setText("");
- af_count = f_count = l_count = 0;
- bar.setValue(0);
- textarea.setText(textarea.getText()+"pripona: "+extension+" \n");
- textarea.setText(textarea.getText()+"adresar pro zpracovani: "+textfield1.getText()+" \n");
- textarea.setText(textarea.getText()+"vystupni adresar: "+textfield3.getText()+" \n\n");
- //zacneme prochazet adresare aby jsme spocitali soubory pro progressbar
- listContents(dir1, extension, true);
- textarea.setText(textarea.getText()+"Nalezené soubory: \n");
- //zacneme prochazet adresare a hledat soubory se stejnou priponou
- listContents(dir1, extension, false);
- //ulozime statistiky
- saveStats();
- textarea.setText(textarea.getText()+"\n\nPočet souborů: "+af_count+" \n");
- textarea.setText(textarea.getText()+"počet řádků: "+l_count+" \n");
- }
- }
- //funkce na prochazeni adresaru
- private void listContents(File dir, String ext, boolean progress) {
- String[] files; // pro ulozeni obsahu slozky
- files = dir.list();
- for (int i = 0; i < files.length; i++) {
- File f;
- f = new File(dir, files[i]);
- if ( f.isDirectory() ) {
- //rekurzivni volani funkce listContents
- listContents(f, ext, progress);
- }
- else {
- //ma soubor zadanou priponu?
- if (ext.equals(getExtension(f))) {
- //pocitame vsechny soubory?
- if (!progress){
- f_count ++;
- double barvalue = ((double) f_count /(af_count/100));
- bar.setValue((int) barvalue);
- lineCount(f.getPath());
- textarea.setText(textarea.getText()+f.getPath()+"\n");
- }else{
- af_count ++; //pocitame vsechny soubory pro progressbar
- }
- }
- }
- }//konec cyklu
- }
- //funkce na ziskani pripony souboru
- public static String getExtension(File f)
- {
- String ext = null;
- String s = f.getName(); //ziskame nazev souboru
- int i = s.lastIndexOf('.'); //ziskame posledni vyskyt znaku .
- if (i > 0 && i < s.length() - 1) {
- ext = s.substring(i+1).toLowerCase(); //vytahneme priponu (na pozici i je . proto +1)
- }
- if(ext == null){
- return ""; //nektere pripony maji na konci tecku, proto vracime prazdny retezec!
- }
- return ext;
- }
- //funkce na zjisteni poctu radku
- public void lineCount(String file) {
- FileReader fr = null;
- BufferedReader br = null;
- try {
- //otevreni souboru
- fr = new FileReader(file);
- br = new BufferedReader(fr);
- //spocitame radky
- while((br.readLine()) != null) {
- l_count++;
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //jestli vse probehlo ok, zavreme soubor
- if (fr != null) {
- try {
- fr.close();
- } catch (IOException ioe) {
- }
- }
- }
- }
- //ulozeni statistik
- public void saveStats() {
- FileWriter fw = null;
- try {
- //otevreni souboru
- fw = new FileWriter(dir2.getPath()+"\\statistika.txt");
- fw.write("Počet souborů s příponou \""+extension+"\" je: "+f_count+"\n");
- fw.write("Celkový počet řádek v souborech s příponou: \""+extension+"\" je: "+l_count+"\n");
- } catch (IOException e1) {
- e1.printStackTrace();
- } finally {
- //jestli vse probehlo ok, zavreme soubor
- if (fw != null) {
- try {
- fw.close();
- } catch (IOException ioe) {
- }
- }
- }
- }
- }
18:49
—
Komentář
—
Stálý odkaz