Tag Archive for MySQL

Member Teams -> Social Groups del III

Jeg har testoverført data fra det gamle ibf_team (en gruppe) og ibf_team_members (og dets medlemmer) til hhv. ibf_social_groups og ibf_social_group_members og kan se at gruppen dukker op på forsiden af de nye netværk (socale grupper), men når jeg klikker på gruppen i oversigten får jeg en besked om at gruppen med denne id ikke findes.

Måske det er premissions der mangler?

Indhold af ibf_social_groups_perms med de to oprettede fora i det nye system:

mysql> select * from ibf_social_groups_perms;
+----------+------------+------------+------------+-----------+--------+----------+--------+-------------+
| group_id | group_show | forum_show | forum_read | forum_use | invite | add_news | manage | admin_tools |
+----------+------------+------------+------------+-----------+--------+----------+--------+-------------+
|        1 | 1,2,3,4,5  | 1,2,3,4,5  | 3,4,5      | 3,4,5     | 3,4,5  | 4,5      | 5      | 5           |
|        2 | 1,2,3,4,5  | 1,2,3,4,5  | 3,4,5      | 3,4,5     | 3,4,5  | 4,5      | 5      | 5           |
+----------+------------+------------+------------+-----------+--------+----------+--------+-------------+

Det lader til at være nogle generelle settings med hvilke grupper der har hvilke rettigheder med gruppen. Da det umiddelbart som udgangspunkt skal være ens for alle grupper, kopierer jeg denne opsætning til alle de flyttede netværk fra team_members.

Fortsætter indtil videre med eksemplet cand.move:

insert into ibf_social_groups_perms (group_id, group_show, forum_show, forum_read, forum_use, invite, add_news, manage, admin_tools) values (14, "1,2,3,4,5", "1,2,3,4,5", "3,4,5", "3,4,5", "3,4,5", "4,5", "5", "5");

Gruppen kan stadig ikke ses når jeg klikker på den i oversigten! Suk.

Vi tager lige oversigten over alle tabeller i social_groups og ser hvad der ellers kunne mangle for det nyoprettede (flyttede) netværk. De markerede tabeller er ordnet.

  • ibf_social_group_members
  • ibf_social_groups
  • ibf_social_groups_cat
  • ibf_social_groups_invites
  • ibf_social_groups_news
  • ibf_social_groups_notes
  • ibf_social_groups_perms
  • ibf_social_groups_pm
  • ibf_social_groups_supermods
mysql> select * from ibf_social_groups_cat;
+--------+--------------+---------------+----------+---------------+------------+-----------+---------+
| cat_id | cat_position | cat_name      | cat_desc | cat_seo_name  | cat_locked | cat_forum | cat_vis |
+--------+--------------+---------------+----------+---------------+------------+-----------+---------+
|      1 |            1 | Uncategorized |          | uncategorized |          0 |         0 |      -1 |
+--------+--------------+---------------+----------+---------------+------------+-----------+---------+
1 row in set (0.00 sec)

… dette er blot en oversigt over kategorier og der er kun pt en. Ingen mangel i forhold til gruppe.

mysql> select * from ibf_social_groups_invites;
+--------+------------+--------------+-----------+----------------------------------+------------+------------+
| inv_id | inv_sender | inv_reciever | inv_group | inv_key                          | inv_date   | inv_status |
+--------+------------+--------------+-----------+----------------------------------+------------+------------+
|      1 |          1 |         7712 |         1 | 6b2dce6dde063aa91d1248924eff489b | 1347891315 |          1 |
+--------+------------+--------------+-----------+----------------------------------+------------+------------+
1 row in set (0.02 sec)

… dette er de liggende invitationer, som ikke er blevet besvaret. Der ligger pt en enkelt i forbindelse med en test jeg havde lavet. Det har heller ingen sammenhæng med den fejl jeg pt får med manglende gruppe, men det kunne dog være relevant evt. at tjekke op på om der er invites der ligger i det gamle system og om disse kan overføres. Ellers må det række at gøre opmærksom på at invites ikke bliver overført (de plejer nu også alligevel at blive slettet efter 2-3 døgn)

mysql> select * from ibf_social_groups_news;
Empty set (0.00 sec)

mysql> select * from ibf_social_groups_notes;
Empty set (0.00 sec)

mysql> select * from ibf_social_groups_pm;
Empty set (0.00 sec)

mysql> select * from ibf_social_groups_supermods;
Empty set (0.00 sec)

… heller ikke der mangler der noget for den nyoprettede gruppe, som de andre grupper har.

Jeg får fejlen:

 Cannot find group with this ID

Og klikker jeg på det seneste indlæg i gruppen som jeg kan se i oversigten, får jeg:

You must be a member of this group in order to view their forum.

Kunne der gemme sig noget relevant i en af de andre tabeller, som umiddelbart ikke har med de sociale grupper at gøre? Måske en relevant kolonne i en anden tabel? Eller i selve koden et sted?

Member Teams -> Social Groups del II

Som beskrevet i et tidligere indlæg har jeg installeret modulet Social Groups på testudgaven af morsverden med IPB3.4.

Nu skal jeg på en eller anden måde have overført alt eksisterende indhold af netværkene i modulet “Team members” som var lavet til IPB2.3 til det nye Social Groups modul.

Følgende tabeller findes i member_teams (gammel):

  • ibf_team_invites
  • ibf_team_members
  • ibf_team_news
  • ibf_team_ranks
  • ibf_teams

hvor ibf_team og ibf_team_members er de vigtigste, indeholdende alle netværkene samt de medlemmer der er i og deres rettigheder. Tabellernes opbygning:

mysql> describe ibf_teams;
 +--------------+--------------+------+-----+---------+----------------+
 | Field        | Type         | Null | Key | Default | Extra          |
 +--------------+--------------+------+-----+---------+----------------+
 | tid          | int(10)      | NO   | PRI | NULL    | auto_increment |
 | fid          | int(10)      | NO   |     | 0       |                |
 | perm_id      | int(10)      | NO   |     | 0       |                |
 | group_id     | int(10)      | NO   |     | NULL    |                |
 | tname        | varchar(50)  | NO   | MUL |         |                |
 | tdescription | varchar(200) | NO   |     |         |                |
 | tlogo        | varchar(100) | NO   |     |         |                |
 | ttext        | mediumtext   | NO   |     | NULL    |                |
 | leader_mid   | int(10)      | NO   |     | 0       |                |
 | is_open      | tinyint(5)   | NO   |     | 1       |                |
 | approved     | tinyint(5)   | NO   |     | 1       |                |
 +--------------+--------------+------+-----+---------+----------------+

 

eksempel med gruppen cand.move (synlig, is_open = 1): 
 mysql> select tid, fid, perm_id, group_id, tname, leader_mid, is_open, approved from  ibf_teams where fid = 171;
 +-----+-----+---------+----------+-----------+------------+---------+----------+
 | tid | fid | perm_id | group_id | tname     | leader_mid | is_open | approved |
 +-----+-----+---------+----------+-----------+------------+---------+----------+
 |  14 | 171 |      48 |       79 | cand.move |       2175 |       1 |        1 |
 +-----+-----+---------+----------+-----------+------------+---------+----------+

 

mysql> describe ibf_team_members;
 +--------------+------------+------+-----+---------+-------+
 | Field        | Type       | Null | Key | Default | Extra |
 +--------------+------------+------+-----+---------+-------+
 | mid          | int(10)    | NO   |     | 0       |       |
 | tid          | int(10)    | NO   |     | 0       |       |
 | rid          | int(10)    | NO   |     | 0       |       |
 | approved     | tinyint(5) | NO   |     | 0       |       |
 | can_team_mm  | tinyint(5) | NO   |     | 0       |       |
 | can_forum_mm | tinyint(5) | NO   |     | 0       |       |
 | can_perm_mm  | tinyint(5) | NO   |     | 0       |       |
 | can_news_mm  | tinyint(5) | NO   |     | 0       |       |
 +--------------+------------+------+-----+---------+-------+

Tabeller i sociale grupper (ny):

  • ibf_social_group_members
  • ibf_social_groups
  • ibf_social_groups_cat
  • ibf_social_groups_invites
  • ibf_social_groups_news
  • ibf_social_groups_notes
  • ibf_social_groups_perms
  • ibf_social_groups_pm
  • ibf_social_groups_supermods

hvor det her er ibf_social_groups (svarer til ibf_member_teams) og ibf_social_group_members (svarer til ibf_team_members) jeg i første omgang vil koncentrere mig om, for at få overført alle grupperne + medlemmerne. Det meste andet lader til at kunne oprettes og overføres efterhånden eller er umiddelbart mindre væsentligt i det store og hele.

Vi starter med selve grupperne. Opbygning af ibf_social_groups:

mysql> describe ibf_social_groups;
 +--------------------+--------------+------+-----+---------+----------------+
 | Field              | Type         | Null | Key | Default | Extra          |
 +--------------------+--------------+------+-----+---------+----------------+
 | g_id               | int(6)       | NO   | PRI | NULL    | auto_increment |
 | g_seo_name         | varchar(255) | NO   |     | NULL    |                |
 | g_name             | varchar(255) | NO   |     | NULL    |                |
 | g_forum            | int(6)       | NO   | MUL | NULL    |                |
 | g_cat_id           | int(4)       | NO   | MUL | 1       |                |
 | g_founder          | int(7)       | NO   |     | NULL    |                |
 | g_privacy          | tinyint(1)   | NO   |     | NULL    |                |
 | g_approval         | tinyint(1)   | NO   |     | 0       |                |
 | g_locked           | tinyint(1)   | NO   |     | NULL    |                |
 | g_desc             | mediumtext   | NO   |     | NULL    |                |
 | g_start            | int(10)      | NO   | MUL | NULL    |                |
 | g_banner           | varchar(200) | NO   |     | NULL    |                |
 | g_logo             | varchar(200) | NO   |     | NULL    |                |
 | g_bg               | varchar(200) | NO   |     | NULL    |                |
 | g_portal_news_num  | int(3)       | NO   |     | 5       |                |
 | g_portal_posts_num | int(3)       | NO   |     | 5       |                |
 | g_portal_mem_num   | int(3)       | NO   |     | 5       |                |
 | g_delete_request   | tinyint(1)   | NO   | MUL | NULL    |                |
 | g_featured         | tinyint(1)   | NO   | MUL | NULL    |                |
 | g_memCount         | int(10)      | NO   |     | NULL    |                |
 +--------------------+--------------+------+-----+---------+----------------+
 20 rows in set (0.00 sec)

Der er er ekstra felter udover dem vi pt har, men vi kan starte med at overføre dem vi kender. Map mellem kolonner i tabellen:

ibf_teams → ibf_social_groups
tid → g_id
tname → g_name
tname hvor mellemrum og specialregn er erstattet med _ → g_seo_name
fid → g_forum
leader_mid → g_founder
is_open → g_privacy? 0 → 1 og 1 → 0 (et åbent netværk (1) = ikke-privat (0))
(g_approval? ← 1) (alle gamle netværk skal som udgangspunkt godkende medlemmer)
(g_locked? ← 0)
tdesicription → g_desc
count(*) from ibf_team_members where tid = xx → g_memCount

#testoverfører data for cand.move 
insert into ibf_social_groups (g_id, g_name, g_seo_name, g_forum, g_founder, g_privacy, g_approval, g_locked, g_desc)
 select tid, tname, tname, fid, leader_mid, !is_open, 1, 0, tdescription from ibf_teams where tid = 14;

Her har jeg indtil videre overført tname direkte i g_seo_name, men disse navne skal laves om så mellemrum og andre specialtegn bliver erstattet med en “-” – til URL’en.

antallet af medlemmer skal hentes ud med count(*) from ibf_team_members for hvert tid og sættes ind i g_memCount-kolonnen.

Eksempel med cand.move:

update ibf_social_groups set g_memCount = (Select count(*) FROM ibf_team_members where tid = 14) where g_id = 14;

Nu findes forummet i oversigten under netværk (groups). Men gruppen findes teknisk set stadig ikke og der er ingen medlemmer i. Vi tager medlemmerne først.

mysql> describe ibf_social_group_members;
 +-------------+------------+------+-----+---------+-------+
 | Field       | Type       | Null | Key | Default | Extra |
 +-------------+------------+------+-----+---------+-------+
 | member_id   | int(7)     | NO   | PRI | NULL    |       |
 | g_id        | int(6)     | NO   | PRI | NULL    |       |
 | is_owner    | tinyint(1) | NO   |     | NULL    |       |
 | is_admin    | tinyint(1) | NO   |     | NULL    |       |
 | is_mod      | tinyint(1) | NO   |     | NULL    |       |
 | is_approved | tinyint(1) | NO   |     | 0       |       |
 | join_date   | int(10)    | NO   |     | NULL    |       |
 | is_banned   | tinyint(1) | NO   |     | 0       |       |
 | has_left    | tinyint(1) | NO   |     | NULL    |       |
 | inv_id      | int(10)    | NO   |     | NULL    |       |
 +-------------+------------+------+-----+---------+-------+

Igen mapper vi kolonner fra det gamle ibf_team_members til det nye ibf_social_group_members.

ibf_team_members → ibf_social_group_members
mid → member_id
tid → g_id
approved → is_approved
can_team_mm → is_owner og is_admin
can_forum_mm → is_mod

Igen et eksempel med medlemmerne i netværket cand.move:

insert into ibf_social_group_members (member_id, g_id, is_approved, is_owner, is_admin, is_mod)
 select mid, tid, approved, can_team_mm, can_team_mm, can_forum_mm from ibf_team_members where tid = 14;

Medlemmerne er nu overført, og jeg kan bl.a. se netværket i min oversigt. Men når jeg klikker på gruppen får jeg stadig en besked om at gruppen ikke findes …

Fortsættes næste gang.

Todo:

  1. gruppen skal kunne klikkes ind på fra netværksoversigten
  2. overføre alle grupper og netværk
  3. teste rettigheder
  4. få oprettelse af nye grupper til at virke (virker af en eller anden grund pludselig ikke)
  5. … det løse og det jeg har glemt …

Oprettelse af fødevaredatabase i MySQL

Efter uden held at have forsøgt at bruge dbmtools til at importere .mdb-filerne fra denne fødevaredatabase direkte ind i MySQL og forsøgt at bruge nogle af de andre XML-filerne til noget, prøvede jeg i stedet for at bruge mdb-export til at exportere til en cvs-filer.

Dette gav mig en fil for hver tabel med al data, men jeg måtte til at oprette alle tabellerne manuelt. Pyt – det går nok, jeg får jo stadig en hulens masse data forærerende, og jeg skal alligevel have redigeret en masse i tabellerne for at få dem tilpasset til det jeg skal bruge.

.mdb-database til CVS-filer

Der er følgende tabeller i den downloadede fødevaredatabase:
$ mdb-tables DKFoodComp701.mdb
Classif CompName FoodInfo GroupNames Nutrients References Sources

Det er umiddelbart ikke alle jeg nok skal bruge, men nu eksporterer jeg dem alle i tekst-format, og så ser jeg.

Jeg kører en mdb-export på alle tabllerne:
mdb-export DKFoodComp701.mdb Classif > classif.csv
mdb-export DKFoodComp701.mdb CompName > compname.csv
mdb-export DKFoodComp701.mdb FoodInfo > foodinfo.csv
mdb-export DKFoodComp701.mdb GroupNames > nuitrients.csv
mdb-export DKFoodComp701.mdb Nutrients > nutrients.csv
mdb-export DKFoodComp701.mdb References > references.csv
mdb-export DKFoodComp701.mdb Sources > sources.csv

Jeg fandt ud af at de danske bogstaver i min csv ikke blev vist rigtigt, og det er sikkert noget nemt man kan gøre med tegnsæt et sted, men da jeg ikke lige ved hvordan, kørte jeg i stedet for en search and replace på alle filerne på tegnene og så blev det problem også løst.

jed *.cvs
alt-x replace_across_buffer_files

æ med æ
ø med ø
Ã¥ med å
tab?

Der er vist et tabulator-tast der også bliver til mystisk tegn, men jeg lader den stå for nu.
(er der en smartere måde at få skiftet de der tegnsæt ud på, så smid gerne en kommentar her, jeg vil gerne vide det til anden god gang)

Oprettelse af tabellerne i MySQL

Tabellerne oprettes nu ud fra info fra filerne og min egen fantasi (“hvorfor har (du ikke)/gjorde (du ikke)” modtages gerne):

## klassifikationer
drop table if exists classif;
create table classif (
MainGrp integer not null,
SubGrp integer not null,
EngFdGp varchar(255),
OrigFdGp varchar(255),
primary key (MainGrp, SubGrp)
);

## komponenter
drop table if exists compname;
create table compname (
CompId integer not null,
SrtOrd integer not null,
Unit varchar(4),
CmpNamDK varchar(255),
CmpNamEN varchar(255),
PublStatus int(1),
EurofoodsTag varchar(63),
primary key (CompId)
);

## foodinfo
drop table if exists foodnfo;
create table foodinfo (
FoodId integer not null,
DanName varchar(255),
ProdName varchar(63),
EngName varchar(63),
SysName varchar(63),
MainGrp integer not null,
SubGrp integer not null,
Waste integer,
NCF float,
FACF float,
PEF float,
FEF float,
CEF float,
Density float,
Remarks varchar(255),
PublStatus int(1),
LanguaL varchar(255),
GRIN varchar(255),
FISHBASE varchar(255),
BASIS varchar(255),
USDA varchar(255),
FIFood varchar(255),
UKFood varchar(255),
FRFood varchar(255),
DEFood varchar(255),
SEFood varchar(255),
NOFood varchar(255),
NLFood varchar(255),
ISFood varchar(255),
SPFood varchar(255),
ITFood varchar(255),
DateUpdated timestamp,
UpdatedBy varchar(255),
Recipe varchar(255),
WaterYield integer,
FatYield integer,
primary key (FoodId),
foreign key (MainGrp) references classif,
foreign key (SubGrp) references classif
);

## Nutrients
drop table if exists nutrients;
create table nutrients (
FoodId integer not null,
CompId integer not null,
BestLoc float,
Median float,
Minimum float,
Maximum float,
NoAnal float,
SourceId integer,
primary key (FoodId, CompId),
foreign key (FoodId) references foodinfo,
foreign key (CompId) references compname
);

Import af data fra CVS til MySQL-tabellerne

load data local infile ‘classif.csv’ into table classif fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(MainGrp, SubGrp, EngFdGp, OrigFdGp);

#Query OK, 135 rows affected, 19 warnings (0.00 sec)
#Records: 149 Deleted: 0 Skipped: 14 Warnings: 0

load data local infile ‘compname.csv’ into table compname fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(CompId, SrtOrd, Unit, CmpNamDK, CmpNamEn, PublStatus, EurofoodsTag);

#Query OK, 112 rows affected, 1 warning (0.00 sec)
#Records: 112 Deleted: 0 Skipped: 0 Warnings: 1

load data local infile ‘foodinfo.csv’ into table foodinfo fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(FoodId,DanName,ProdName,EngName,SysName,MainGrp,SubGrp,Waste,NCF,FACF,PEF,FEF,CEF,Density,Remarks,PublStatus,LanguaL,GRIN,FISHBASE,BASIS,USDA,FIFood,UKFood,FRFood,DEFood,SEFood,NOFood,NLFood,ISFood,SPFood,ITFood,DateUpdated,UpdatedBy,Recipe,WaterYield,FatYield);

#Query OK, 0 rows affected, 9438 warnings (0.01 sec)
#Records: 1049 Deleted: 0 Skipped: 1049 Warnings: 3131

load data local infile ‘nutrients.csv’ into table nutrients fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(FoodId, CompId, BestLoc, Median, Minimum, Maximum, NoAnal, SourceId);

#Query OK, 75900 rows affected, 65535 warnings (0.31 sec)
#Records: 75982 Deleted: 0 Skipped: 82 Warnings: 172505

Tilbage er references og sources som indeholder referencer til kilder og publikationer. Den springer jeg over for nu …

Jeg har godt nok fået en hulens masse warnings og de fleste handler om at et af de der float-felter er blevet trunkeret. Warnings kommer vist når feltet er tomt, men jeg kan ikke helt finde rundt i om det har nogen betydning for mig pt.

Og hvad så?

Foodinfo, compname og nutrients er de mest relevante tabller.

  • Foodinfo indeholder info om alle fødevarerne og er kategoriseret – det er her pt kun hovedgruppe 5 & 6 jeg skal bruge (frugt og grønt).
  • Compname indeholder data om de forskellige bestandsdele, såsom proteiner, kulhydrater, fedt, vitaminer og mineraler … og alt det der.
  • Nutrients kobler de to ovenstående tabeller sammen og indeholder gennemsnits-, minimum- og maksimum-værdier for de forskellige bestandsdele i de forskellige fødevarer.

Nu roder jeg lidt videre med indholdet og tilpasser og ser på hvad og hvordan jeg vil skrive det ud til mit online frugt- og grønt-projekt … lige om lidt, skal lige lege lidt mor også for at have balance i regnskabet.

Fortsættelse følger.

Projekt frugt og grønt: overførsel af fødevaredatabase fra Access til MySQL

OK så jeg har hentet en fin ovrsigtsdatabase over diverse fødevarer her:
http://www.foodcomp.dk/v7/fvdb_download.asp

Jeg har hentet den Access-format, men skal egentlig bruge den i MySQL. Google fortæller mig at mdb-formatet (access) kan på ubuntu/linux konverteres vha. mdbtools.

Så jeg installerer - sudo apt-get install mdbtools og det går vel.

http://nialldonegan.me/2007/03/10/converting-microsoft-access-mdb-into-csv-or-mysql-in-linux/ kan jeg læse at jeg kan se listen af tabellerne i mdb-filen med en mdb-tables database.mdb

Det går også fint:
$ mdb-tables DKFoodComp701.mdb
Classif CompName FoodInfo GroupNames Nutrients References Sources

Jeg har oprettet en database (dkfoods) til fødevarerne i mysql.

Og nu skulle jeg kunne konvertere mdb-databasen til mysql med
mdb-schema DKFoodComp701.mdb | mysql -u <username> -p dkfoods

Men får denne fejl:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘———————————————————–

 

 

—————‘ at line 1

 

Det store forkromede spørgsmål:
Hvad pokker kan jeg gøre ved det? Er der en anden måde at konvertere på eller burde jeg måske snuppe en af de andre formater? Vil det være nemmere at migrere til MySQL fra en ASCII tekstfil eller XML-format?

 

Note til hvis det virker:
Til sidst burde jeg nu burde jeg kunne importere en tabel ad gangen i dkfoods i mysql:
mdb-export -I DKFoodComp701.mdb Classif | sed -e ‘s/)$/)\;/’ | mysql -u <username> -p dkfoods

 

phpMyAdmin på Lucy

Min stolthed har ellers forbudt mig at installere phpMyAdmin på nogen af mine servere nogensinde. Jeg havde jo ikke brug for det, alle mine sql forespørgsler foregår direkte i terminalen.

Nu kastede jeg alligevel håndklædet i ringen . og udelukkende fordi jeg var for hurtig, da jeg var inde og lure på 13 Useful WordPress SQL Queries You Wish You Knew Earlier  – egentlig fordi jeg havde søgt på noget helt tredje, men så fangede det mig alligevel det der med hvordan man skifter URL- og sideadresse på sin wordpresslog, for det er da fandens som det er besværligt med adresser spredt ud over hele databasen, så man ikke blot kan flytte og ændre et navn et enkelt sted.

Og i stedet for først at læse selve artiklen og se at der netop blot skulle køres nogle sql queries, som jeg lige så godt kunne køre i min terminal, installerede jeg i stedet for phpMyAdmin. Som jeg egentlig ikke er sikker på om jeg vil bruge alligevel. Hvornår lærer jeg det?

Måske er der nogle fordele jeg endnu ikke har fået øje på? Eller ender jeg bare som enhver anden interface fanatiker der ikke kan nøjes med tekst?

Log af installation (note to self):

  1. sudo apt-get install phpmyadmin – vælg apache2 .. nej til det der autoconfigure (måske en fejl? Ville ikke risikere noget autobøvl og at få overskrevet ting igen)
  2. sudo jed /etc/phpmyadmin/config.inc.php – find $cfg['Servers'][$i]['host'] = ‘db_server’ – ændret db_server til serverens IP adresse
  3. sudo jed /etc/apache2/apache2.conf – tilføjet nederst: Include /etc/phpmyadmin/apache.conf
  4. sudo /etc/init.d/apache2 restart