Zimowy AgileTuning – konferencja w Przegorzałach

Zimowy AgileTuning
Jedna prelekcja była naprawdę niezwykła. Nigel Baker z firmy Agile Bear poprowadził wykład, a właściwie show na temat “10 tips that ScrumMasters should know (but probably don’t!). Nigdy nie byłem świadkiem tego jak na konferencji technicznej ktoś w tak zabawny i inteligentny sposób kontaktuje się ze słuchaczami. Najcięższe przypadki ADHD nie mogły mieć problemów ze skupieniem się na treści dzięki niebagatelnej formie. Niedługo napiszę Wam te 10 punktów Nigela. O tych dziesięciu wskazówkach przeczytacie we wpisie na blogu agilesurfing.

Drugą moją ulubioną prezentacją była przygoda z testami akceptacyjnymi i narzędziem Sweetest Bartek Bańkowski i Szczepan Faber uraczyli nas żywym i ciekawym podejściem do tematu. Aż żałuję, że moja znajomość Javy ogranicza się do znajomości składni. Chciałoby się móc korzystać z ich narzędzi w moim aktualnym środowisku.

To były dwie najlepsze prezentacje z tych, które miałem możliwość zobaczyć. Nie było możliwe uczestniczyć w nich wszystkich z tego względu, że dwie ścieżki odbywały się równolegle. Niestety w takiej konfiguracji ktoś taki jak ja zainteresowany zarówno ścieżką “Craft” jak i “People” miał ciężki orzech do zgryzienia.

Czekam na letni AgileTuning. Zdecydowanie warto.

Ah! Dodam jeszcze, że lokalizacja też była wybrana świetnie – piękne miejsce w hotelu koło zamku w Przegorzałach. Mimo, że liście zamiast zielone i na drzewach były bure i na ziemi – miejsce wydało mi się bardzo malownicze. Jeśli o mnie chodzi to letni tuning też powinien się tam odbyć.

Edit:
Wideo z tej prezentacji możecie już obejrzeć tutaj.

Share Button

Dług techniczny (update)

dług techniczny
Czasem w moich tekstach piszę o długu technicznym. Znalazłem świetny opis co oznacza to pojęcie, więc chętnie dzielę się linkiem:
http://97rzeczy.devblogi.pl/artykuly/1/postepuj-rozwaznie

Myślę, że czasem świadomość, że istnieje coś takiego pozwala na bardziej świadome wytwarzanie kodu i zaciąganie ciut mniejszego długu. Powodzenia!

Poniżej inne ciekawe nowe artykuły, które powinny zainteresować programistów:
projektowanie kodu:
Stosuj zasady programowania funkcjonalnego
projektowanie interfejsu:
Zapytaj “Co zrobiłby użytkownik?

Update: jeszcze jeden ciekawy artykuł o długu technicznym (w języku angielskim)

Share Button

Skróć swoje listingi

Pewnie w niemal każdym swoim widoku index.ctp masz fragment kodu podobny do tego:

<?php
$i = 0;
foreach ($tracks as $track):
	$class = null;
	if ($i++ % 2 == 0) {
		$class = ' class="altrow"';
	}
?>
	<tr<?php echo $class;?>>
		<td>
			<?php echo $track['Track']['id']; ?>
		</td>
		<td>
			<?php echo $track['Track']['name']; ?>
		</td>
		<td>
			<?php echo $track['Car']['name']; ?>
		</td>
		<td>
			<?php echo $track['Track']['begin']; ?>
		</td>
		<td>
			<?php echo $track['Track']['end']; ?>
		</td>
		<td>
			<?php echo $track['Track']['length']; ?>
		</td>
		<td class="actions">
			<?php echo $html->link(
			   __('Edycja', true),
			   array(
			      'action' => 'edit',
			      $track['Track']['id'] ,
			      $track['Car']['id']
			   )
			  );
			?>

		</td>
	</tr>
<?php endforeach; ?>
</table>

Chce Ci się pisać ten kod kilkadziesiąt razy w jednym projekcie? Mnie też nie. Dlatego napisałem prosty element, który to trochę automatyzuje (nazwałem go “list”):

// app/views/elements/list.ctp
<?php
   $i = 0;
   foreach($elements as $key => $element):
   $class = null;
   if ($i++ % 2 == 0) {
      $class = ' class="altrow"';
   }
?>
   <tr <?php echo $class?>>
      <?php foreach($fields as $path): ?>
         <td>
            <?php echo Set::classicExtract($element, $path) ?>
         </td>
      <?php endforeach; ?>
         <?php if(isset($links)): ?>
            <td>
               <?php foreach($links as $name => $url): ?>
                  <?php
                     if(!is_array($url["params"])) {
                        $url["params"] = array($url["params"]);
                     }
                     foreach($url["params"] as $key => $path){
                        $url[$key] = Set::classicExtract(
                           $element,
                           $path
                        );
                     }
                     unset($url["params"]);
                  ?>
                  <?php echo $html->link($name, $url)?>
               <?php endforeach; ?>
            </td>
         <?php endif; ?>
   </tr>
<?php endforeach; ?>

Jego użycie jest dość proste. Dla przykładu wygenerujemy ten sam “output” dla pierwszego listingu z tego postu:

echo $this->renderElement(
         "list",
         array(
            "elements" => $tracks,
            "fields" => array(
               "Track.name", "Car.name", "Track.begin",
               "Track.end", "Track.length"
            ),
            "links"=> array(
               "edycja" => array(
                  "controller"=> "tracks", "action"=> "edit",
                  "params" => array(
                     "Track.id", "Car.id"
                  )
               )
            )
         )
      )

Opiszę poszczególne parametry przekazywane do tego elementu:

  • “elements” – kolekcja (w tym wypadku tablica) elementów zwrócona na przykład przez $this->Track->find(“all”)
  • “fields” – pola, które mają się pojawić w komórkach tabeli
  • “links” – tu definiujemy jakie linki mają się pojawić w ostatniej kolumnie (zazwyczaj tam znajdują się “opcje”). Indeksy kolejnych elementów to nazwy linków (tutaj “edycja”).
    • “controller” i “action” są identycznie używane jak w metodzie HtmlHelper::link()
    • “params” jest dość ciekawy. Jeśli chcemy w wygenerowanym linku mieć jeden parametr (najczęściej id), robimy to tak:
                  "edycja" => array(
                     "controller"=> "cars", "action"=> "edit", "params"=>"Car.id"
                  ),
      

      gdy parametrów ma być więcej – ścieżki do nich przekazujemy w tablicy (tak jak w przykładzie):

                      "edycja" => array(  
                         "controller"=> "tracks", "action"=> "edit",  
                         "params" => array(  
                            "Track.id", "Car.id"  
                         )  
                      ) 
      

      Można także używać parametrów typu “named”, wystarczy podać dodatkowo indeksy:

                      "edycja" => array(  
                         "controller"=> "tracks", "action"=> "edit",  
                         "params" => array(  
                           "parametr_1"=> "Track.id", "parametr_2"=> "Car.id"  
                         )  
                      ) 
      

Zachęcam do korzystania z tego elementu i zgłaszania wszelkich niedociągnięć :)

Share Button