Drupal nie wyświetla stron innych niż główna

Admin jak to admin lubi popsuć (czytaj ulepszyć) swoją witrynę, tylko jeśli się nie doczyta pewnych rzeczy zaczynają się dziać cuda wianki XD

Kiedy włączymy przyjazne adresy w drupalu 7 nie wyświetlają się inne strony niż główna

Możliwe przyczyny:

brak mod_rewrite w konfiguracji Apache, brak .htaccess w katalogu głównym naszej strony (w .htaccess są zawarte wszystkie reguły przepisywania adresów w Drupalu).

Rozwiązanie:

dodajemy do settings.php linię:
$conf['clean_url'] = 0;

zwykle plik settings.php jest zabezpieczony przed zapisem, więc najpierw powinniśmy zmienić uprawnienia do niego, za pomocą klienta FTP lub z wiersza poleceń, komendą:

chmod 777 settings.php

lub jeśli korzystamy z filezilli lub totalcomandera jest to gdzieś w opcjach

a po modyfikacji pliku przywrócić właściwe uprawnienia:

chmod 440 settings.php

lub jak wyżej w programie z którego korzystamy.

Najważniejsze że szybko działa - i pamiętajcie warto mieć zawsze backup bazy i plików :)

Skrypt do pobierania pogody w conky cz.1

Piękna tapeta przydatny conky to coś czego pragnie wielu. Możemy wzbogacić nasz pulpit także prognozą pogody jeśli ktoś sobie zażyczy. Wystarczy chwilę pomyśleć albo przeczytać ten artykuł :).
Aby skrypt mógł działać trzeba zainstalować dwa programy sed i lynx. Dzięki lynx pobierzemy sobie do pliku stronę z pogodą aby za pomocą seda wyciągnąć linijki np z temperaturą. Według mnie najlepszą prognozę podaje strona mojapogoda.com . Lynx to przeglądarka plików więc nie łamiemy prawa tylko zapisujemy stronę do pliku 🙂 Skrypt nie został zabezpieczony przed brakiem internetu stąd w nazwie pisze część 1 możemy później sobie dodać zamiast samych napisów obrazki np że pada deszcz albo animowany termometr.

Musimy w ustawieniach zmienić sobie gdzie będziemy zapisywać stronę i utworzyć taki plik oraz podać adres do strony na której ta pogoda wisi. Możemy zmienić też nagłówek. Skyptowi trzeba nadać prawa do uruchomienia czyli:

chmod +x skrypt.sh

można także przetestować sobie go w terminalu.

 

Pliki do pobrania: skrypt pogody i conky pogoda

Zamiana kolumn i wierszy miejscami w c++

Aby cokolwiek ze sobą zamienić w języku c++ mamy do pomocy funkcję swap dostępną w głównej bibliotece języka.
Zilustruję to na poniższych przykładach:

Zamiana kolumn miejscami:

#include<iostream> //tyle nam wystarczy, czyli podstawa

using namespace std; //przestrzenie nazw by sie nie bawić niepotrzebnie

int main(){

 cout<<“PROGRAM ZAMIENIA KOLUMNY W TABLICY MIEJSCAMI “<<endl;

// Definicja tablicy – 4 kolumny, 5 wierszy
int tab[5][4] =
{
    {2,3,4,5},//wiersz numer 1 a w nim w kolumnie pierwszej liczba 2
    {5,6,7,8},//wiersz numer 2 a w nim w kolumnie drugiej jest liczba 6
    {9,0,1,2},//itd…….   pamiętajmy że pierwszy element wiersza lub 
    {3,4,5,6},// kolumny jest oznaczany jako 0 – język c tak ma i już
    {7,8,9,0}
};
//powiedzmy co posiadamy
cout<<endl<<“===========================”<<endl;
cout<<“W tablicy mamy 4 kolumny oraz 5 wierszy, liczone sa one od zera”;
cout<<endl<<“===========================”<<endl;

 

//wyświetlam tablicę
cout<<endl<<“———————-“<<endl;
cout<<“Wyglad tablicy na wstepie”<<endl;
int i=0, n=5, m=4;
  //wypisanie tablicy poprzez pętle, nie będę się rozpisywał :p
  for (int i=0 ; i<n ; i++)
  {
      cout<<“Wiersz numer: “<<i<<”     |”; 
      for (int j=0 ; j<m ; j++)
      {
          cout<<tab[i][j]<<”  “;
      }
      cout<<endl;
  }
  cout<<“———————-“<<endl<<endl;

//zamiana – formularz – pytamy co chcemy zamienić

int z1,z2;
cout<<“Podaj numery kolumny pierwszej ktora podlega zamianie”<<endl;
cout<<“Numeracje kolumn przyjmij od zera: “<<endl;

//wprowadzenie kolumny pierwszej do zamiany

cin>>z1;
//no i druga kolumna
cout<<endl<<“Podaj numery kolumny drugiej ktora podlega zamianie: “<<endl;
cin>>z2;
cout<<endl<<“———————-“<<endl;

//sprawdzenie poprawności wielkości podanych ponieważ może ktoś dać do zamiany kolumne której nie ma 😀

if(z1>4||z2>4)
{
    cout<<“ERRRRROR!!!! ZLE PODALES NUMER KOLUMNY – TAKOWY NIE ISTNIEJE!!!”;
    return 0;
}
/*do dzieła:
-używamy do obsługi pętli, zmiennej  i, dlatego bo zaczynamy od przyrównania jej do zera – możemy znów ją wykorzystać
-posiadamy 5 wierszy więc w kolejnych obiegach pętli zamieniamy kolejne elementy z wiersza –
-używamy funkcji swap(element1, element2) która zamienia miejscami wartości elementu1 i elementu2 – takie czary mary
-dla pierwszego obiegu pętli mamy tak :    
    zamiana elementu tablicy z wiersza numer 0 i kolumny podanej jako pierwsza – z1
    z elementem z wiersza numer 0 i kolumny podanej jako druga – z2
-analogicznie aż do spełnienia warunku pętla sobie śmiga
*/
for(i=0;i<5;i++){
    swap( tab[i][z1],tab[i][z2]); 
}

 

//wyświetlam tablicę po zamianie żeby ujrzeć rezultaty

cout<<endl<<“———————-“<<endl;
cout<<endl<<“Wyglad tablicy po zmianie”<<endl;

  //wypisanie tablicy
  for (int i=0 ; i<n ; i++)
  {
      cout<<“Wiersz numer: “<<i<<”     |”;  
      for (int j=0 ; j<m ; j++)
      {
          cout<<tab[i][j]<<”  “;
      }
      cout<<endl;
  }
  cout<<endl;
cout<<endl<<“===========================”<<endl;
cout<<“Nacisnij dowolny klawisz enter by zakonczyc”;

return 0;
}

 

 

Zamiana wierszy miejscami:

#include<iostream>
using namespace std;

int main(){

cout<<“PROGRAM ZAMIENIA WIERSZY W TABLICY MIEJSCAMI “<<endl;

// Definicja tablicy – 4 kolumny, 5 wierszy
int tab[5][4] =
{
{2,3,4,5},//wiersz numer 1 a w nim w kolumnie pierwszej liczba 2
{5,6,7,8},
{9,0,1,2},
{3,4,5,6},
{7,8,9,0}
};
//powiedzmy co posiadamy
cout<<endl<<“===========================”<<endl;
cout<<“W tablicy mamy 4 kolumny oraz 5 wierszy, liczone sa one od zera”;
cout<<endl<<“===========================”<<endl;
//wyświetlam tablicę
cout<<endl<<“———————-“<<endl;
cout<<“Wyglad tablicy na wstepie”<<endl;
int i=0, n=5, m=4;
//wypisanie tablicy
for (int i=0 ; i<n ; i++)
{
cout<<“Wiersz numer: “<<i<<”     |”;
for (int j=0 ; j<m ; j++)
{
cout<<tab[i][j]<<”  “;
}
cout<<endl;
}
cout<<“———————-“<<endl<<endl;
//zamiana formularz – pytamy co chcemy zamienić
int z1,z2;
cout<<“Podaj numer wiersza pierwszego ktory podlegnie zamianie”<<endl;
cout<<“Numeracje wierszy przyjmij od zera: “<<endl;
//wprowadzenie wiersza pierwszego do zamiany
cin>>z1;
cout<<endl<<“Podaj numery wiersza drugiego ktora podlega zamianie: “<<endl;
cin>>z2;
cout<<endl<<“———————-“<<endl;
//sprawdzenie poprawności wielkości podanych ponieważ może dać do zamiany wiersza którego nie ma 😀
if(z1>5||z2>5)
{
cout<<“ERRRRROR!!!! ZLE PODALES NUMER WIERSZA – TAKOWY NIE ISTNIEJE!!!”;
return 0;
}

/*do dzieła
wszystko jak poprzednio lecz zamieniamy miejscami zmienne “z1” i “i” oraz “z2” i “i”
ponieważ teraz zamieniamy wiersze
*/

for(i=0;i<4;i++){
swap( tab[z1][i],tab[z2][i]);
}

 

//wyświetlam tablicę po zamianie
cout<<endl<<“———————-“<<endl;
cout<<endl<<“Wyglad tablicy po zmianie”<<endl;

  //wypisanie tablicy
for (int i=0 ; i<n ; i++)
{
cout<<“Wiersz numer: “<<i<<”     |”;
for (int j=0 ; j<m ; j++)
{
cout<<tab[i][j]<<”  “;
}
cout<<endl;
}
cout<<endl;
cout<<endl<<“===========================”<<endl;
cout<<“Nacisnij dowolny klawisz enter by zakonczyc”;


return 0;
}

 

Programy do pobrania KLIK

Dostępne są tam programy .cpp oraz skompilowane pod debiana Skrypty można stosować także do tablic podawanych przez użytkownika trzeba by wtedy sprawdzać wielkość tablicy i przypisać ją do zmiennej lecz to drobnostka przy w/w programie.

C++ biblioteka Boost – regex

Boost – regex w c++

Biblioteka BOOST to kolekcja bibliotek programistycznych poszerzających możliwości języka C++, objętych liberalną licencją, która umożliwia użycie ich w dowolnym projekcie.
Oferuje multiplatformowość(obsługuje mac,linux,windows) jednakże trzeba ją najpierw zainstalować.
Ceną za jakość bibliotek jest konieczność stosowania nowoczesnego kompilatora, w jak najpełniejszym zakresie zgodnego ze standardem języka, a także dość długi czas kompilacji programów.
Biblioteka boost ze wszystkimi możliwościami waży około 1,5GB, A wersja do podstawowych zastosowań do kompilacji – 64MB.
Jedną zasadniczą funkcją którą opiszę jest wyszukiwanie regex’ów czyli wyrażeń regularnych występujących w tekście co poszerza znacznie możliwości naszych programów. Sprawa regex jest dosyć trudna do implementacji samemu ponieważ ciężko o dobry alorytm wyszukiwania zawiłych zdań, zwrotów. W podstawowych bibliotekach c++ nie ma możliwości wyszukania regex’ów więc opiszę to z wykorzystaniem biblioteki boost.

Strona projektu boost: http://www.boost.org/

Kompilacja

Całość kompilowałem pod linuxem w środowisku geany. Może się zdarzyć że program się nie kompiluje ponieważ jest nie zainstalowana biblioteka boost lub w kompilatorze brak opcji -lboost_regex.

Znaki specjalne

są to znaki których możemy użyć by sformułować wzorzec dotyczący czego wyszukujemy.

\\w    wyszukiwanie liter

.    dowolny pojedyńczy znak

[[:klasa:]]    klasa znakowa

{n}    licznik

(wyr)    grupa

\znak    następny znak ma specjalne znaczenie

wyr*    0 lub więcej znaków po wyrazie

wyr+    1 lub więcej znaków po wyrazie

wyr?    opcjonalność(0 lub 1) znaków po wyrazie

wyr|wyr    lub (alternatywa) czyli: wyraz1 lub wyraz2

^wyr    negacja

$    koniec wiersza

(wyr = wyrażenie)

prosty przykład: “(.+) | (ads){2}” Wzorec ten oznacza “zero lub więcej znaków, albo ciąg ‘adsads’ “

Rodzaje znaków

\d    cyfra dziesiętna

\l    mała litera

\s    biały znak(spacja, tabulator itd.)

\u    wielka litera

\w    litera, cyfra lub “_”

\D    nie \d czyli rozróżnianie wielkich i małych liter

Przykład

np. “\l\l\d” czyli “dwie małe litery, po których następuje cyfra dziesiętna”

Powtórzenia

{n}    dokładnie n razy

{n,}    n lub więcej razy

{n,m}    przynajmniej n i najwyżej m razy

*    to samo co {0,}

+    to samo co {1,}

?    to samo co {0,1}

Przykład

np. “0x*”, co znaczy “cyfra ‘0’, po której następuje jedna lub więcej liter ‘x’ ”

Program który obrazuje wykorzystanie (w załączniku jako plik1.cpp oraz skompilowany plik1.sh):

#include <iostream>

#include <boost/regex.hpp> // jeśli nie mamy kompilatora zgodnego z standardem C++0x, musimy sami zainstalować bibliotekę boost

using namespace boost; //narzędzia biblioteki boost znajdują się w przestrzeni nazw boost, definiujemy by mieć mniej pisania

using namespace std;

int main(){

cout<<“Program regex”<<endl<<“——–“<<endl;

string tekst;//deklarujemy zmienną typu sting

tekst=”Nasz ukochany blip wyraz tekst bla to bla wielki to wybryk wyobcowanego programisty”;

cout<<“nasz ciag”<<endl<<tekst<<endl<<“———-“<<endl;//wyświetli wartość zmiennej tekst

regex wzorzec( “\\w* to \\w*” );//czyli reguła którą będziemy wyszukiwać

smatch wynik;//Tworzymy zmienną typu smatch, która będzie przechowywała wyniki.

// zasada użycia funkcji regex – regex_search(tekst_w_ktorym_wyszukujemy, zmienna_do_wyswietlenia_wyniku, regula_jakiej_wyszukujemy)

if( regex_search(tekst,wynik,wzorzec) ) //if służy do tego by sprawdzić czy coś znaleziono, bo jak nie to po co wyświetlać?

{

cout << “co znalazl: ” << wynik[0] << endl; //używamy wynik[0] ponieważ odnosi się do całego wyszukiwanego wyrażenia, jeśli damy wynik[1] wyszuka nam pierwszą część wyrażenia – dotyczy to dzielenia na podzbiory wyrarzeń

}

return 0;

};

W przypadku w którym chcemy wyszukać adres email(plik2.cpp i plik2.sh):

#include <iostream>

#include <string>

#include <boost/regex.hpp> // jeśli nie mamy kompilatora zgodnego z standardem C++0x, musimy sami zainstalować bibliotekę boost

using namespace boost; //narzędzia biblioteki boost znajdują się w przestrzeni nazw boost, definiujemy by mieć mniej pisania

using namespace std;

int main(){

cout<<“Program regex znajdujemy maila”<<endl<<“——–“<<endl;

string tekst; //deklarujemy zmienną typu sting

tekst=”W moim Tekscie teraz tusk@donald.com jest wiele john@deer.pl adresow email kropka@dot.org”;

cout<<“nasz ciag”<<endl<<tekst<<endl<<“———-“<<endl; //wyświetli wartość zmiennej tekst

regex wzorzec( “\\w*[@]\\w*[.]\\w*” ); //czyli reguła którą będziemy wyszukiwać [@] to pojedyńczy znak specjalny

smatch wynik;//Tworzymy zmienną typu smatch, która będzie przechowywała wyniki.

// zasada użycia funkcji regex – regex_search(tekst_w_ktorym_wyszukujemy, zmienna_do_wyswietlenia_wyniku, regula_jakiej_wyszukujemy)

if( regex_search(tekst,wynik,wzorzec) ) //if służy do tego by sprawdzić czy coś znaleziono, bo jak nie to po co wyświetlać?

{

cout << “co znalazl: ” << wynik[0] << endl;

}

return 0;

};

pliki dostępne  pod adresem: http://chomikuj.pl/tomek99007/boost+c*2b*2b