20 Temmuz 2009 Pazartesi

Sürüclere girmek istediğiniz zaman Çalıştırmak için program seç uyarısı çıkıyorsa

Sürücülere girmek istediğiniz zaman çalıştırmak için program seç uyarısı çıkıyorsa bu muhtemelen sisteme virüs girdiğinin göstergesidir. Ama bu yoksa bile aşağıda vereceğim programla bilgisayarınızı mutlaka taratın çünkü avastın bulamadığı bu virüsü bulup temizledi.

Muhteşem programımız combofix

19 Temmuz 2009 Pazar

Thunderbird *.eml import

Madem dosya kurtardık bunları birde import edelim.

Thunderbird doğrudan bunu yapamıyor ama bir eklenti sayesinde bunu yapabilirsiniz.

http://www.nic-nac-project.de/~kaosmos/mboximport-en.html adresinden farkli kaydet diyerek eklentiyi indirin. Sonra Thunderbird in Ad-on ekleme kısmından yükleyin.

Yeniden başlayınca ekleme kısmı aktif oluyor.

Dosya kurtarma - Recovery Files

Dosya kurtarmam gerekti denediğim programlar ;

Easy Recorvery Professional, R-Studio, Recover my files


En başarılısı güzel özellikleri bulunan Recover my files idi herkese tavsiye ederim.
Daha başlarkan dosya tiplerini seçebiliyorsunuz. Tarama bitincede filitreleme yaparak sadece ilgili dosyaları seçiyorsunuz.

12 Temmuz 2009 Pazar

Zend_Mail_Storage_Pop3 Zend_Mail Kullanimi

Yazacağımız bir ticket sistemi için uygun kütüphane bakarken en iyisinin Zend olduğuna karar verdim. Zend de dahi bazı eksikler olmasına rağmen ne varki okunabilirlik, dökümantasyon ve destek açısından (google) en iyisi zend gözüküyordu.

Olaya burdan başlayalım.
http://zendframework.com/manual/en/zend.mail.read.html

Pop3 ile, gelen emailleri okumak için Zend_Mail_Storage_Pop3 sınıfı kullanılmakta
iyi güzel diyip emailleri alıyorsunuz ama olay bundan sonra başlıyor. Çünkü her email in ayrı birde derdi ve sıkıntısı var.


$configurations = array(
'host' => $settings['popHost'],
'port' => $settings['popPort'],
'user' => $settings['user'],
'password' => $settings['password']
);

$mail = new Zend_Mail_Storage_Pop3 ( $configurations );

self::$_settings = ( object ) $settings;
echo $mail->countMessages ( ) . "

messages found

\n";


Şeklinde parametreleri girince emailleri alıp adetini ekrana basıyorsunuz.
Gmail i okumak için ssl özelliği var ama siz hosta ssl://pop.gmail.com port a 995 yazarsanızda iş görüyor.

Aşağıda örnek kullanım ile ilgili kodları göreceksiniz. Bu kodlarda gelen dosyaları almaktan tutun da mesaj ve konuya kadar bütün verinin alınması mevcut. Size düşen biraz incelemek.


foreach ( $mail as $messageNum => $message ) {

$fromEmail = Helper_Common::getEmailAddress ( $message->from );
$fromName = Helper_Common::getName ( $message->from );

$recordUniqueID = $mail->getUniqueId ( $messageNum );

//mail daha once eklenmediyse ekle
if ( self::isExistMail ( $recordUniqueID ) == false ) {
$arrAttach = array ();
/**
* Gelen verileri tiplerine gore ayristiriyoruz
*/
foreach ( new RecursiveIteratorIterator ( $message ) as $no => $parts ) {
//bazi emaillerde contentTransferEncoding olmuyor o yuzden bunu koydum
try {
$contentTransferEncoding = $parts->contentTransferEncoding;
} catch ( Zend_Exception $e ) {
$contentTransferEncoding = '';
}

try {
//apllicationa gore bakmak olmuyor ekte text/plain olabiliyor
//o yuzden name gore bakiyoruz
$tmpfilename = self::getFileName ( $parts->contentType );

if ( $tmpfilename != false ) {
$arrAttach[] = array(
'FileName'=>$tmpfilename, 'ContentType' => $parts->contentType,'Part'=> self::decode ( $contentTransferEncoding, $parts ),
'ContentTransferEncoding' => $contentTransferEncoding
);
}

if ( strtok ( $parts->contentType, ';' ) == 'text/plain' && $tmpfilename == false ) {
$part = $parts;
$part->contentTransferEncoding = $contentTransferEncoding;
}
} catch ( Zend_Mail_Exception $e ) {
//echo $e;
}
}
/**
* Bazen yukardaki foreach e girilmiyor o zaman direk atiyoruz
*/
if ( $part == null ) {
$part = $message;
while ( $part->isMultipart ( ) ) {
$part = $message->getPart ( 1 );
}

try {
$contentTransferEncoding = $part->contentTransferEncoding;
} catch ( Zend_Exception $e ) {
$contentTransferEncoding = '';
}

$part->contentTransferEncoding = $contentTransferEncoding;
}

$recordSubject = self::convertSubjectToUTF8 ( $message->subject, $part->contentTransferEncoding );

/**
* Message
*/
$content = $part->getContent ( );
$recordMessage = self::convertContentToUTF8 ( $content, $part->contentTransferEncoding, $part->contentType );
$recordHeaders = $mail->getRawHeader ( $messageNum );

/**
* Attachment
*/
for ( $i = 0; $i < count ( $arrAttach ); $i++ ) {
$filename_ = $arrAttach [ $i ]['FileName'];
$fileExt = pathinfo($filename_, PATHINFO_EXTENSION);
$attachpart_ = $arrAttach [ $i ]['Part'];
$attachcontentType = $arrAttach [ $i ]['ContentType'];
$contentTransferEncoding = $arrAttach [ $i ]['ContentTransferEncoding'];
}

//email ile isimiz bitince siliyoruz
$mail->removeMessage($messageNum);
}
}



Yukarda kullanılan önemli metodlar

/**
*
* @param $content
* @param $contentTransferEncoding - 7bit,quoted-printable biciminde data
* @param $toContentType - text/plain; charset=ISO-8859-9 biciminde data
* @return unknown_type
*/
public static function convertContentToUTF8 ( $content, $contentTransferEncoding, $contentType ) {

if ( $contentTransferEncoding == '' ) {
return $content;
}

$contentType = self::getCharset ( $contentType );

$content = self::striptags ( $content );

if ( $contentType == 'us-ascii' || $contentType == false ) {
return htmlspecialchars ( $content );
} else {
return mb_convert_encoding ( htmlspecialchars ( self::decode ( $contentTransferEncoding, $content ) ), "UTF-8", $contentType );
}
}

public static function convertSubjectToUTF8 ( $subject, $contentTransferEncoding = '' ) {
if ( $contentTransferEncoding == '' ) {
return $subject;
}

return imap_utf8 ( self::striptags ( $subject ) );
}


public static function striptags ( $str ) {
return strip_tags ( html_entity_decode ( $str ) ); //strip all tags ...no mercy!
}

public static function decode ( $encoding, $text ) {
$encoding = trim ( $encoding );
switch ( $encoding ) {
case '7bit' :
$text = imap_8bit ( $text );
break;
case 'binary' :
$text = imap_binary ( $text );
break;
case 'base64' :
$text = imap_base64 ( $text );
break;
case 'quoted-printable' :
$text = imap_qprint ( $text );
break;
case '' :
default :
$text = imap_8bit ( $text );
//$text=$text;
}
return $text;
}


İpucu: En önemli kısım transferencoding olayı Biz kastık başkadı kasmasın :)

Zend_Auth birden fazla modülde kullanmak

Zend_Auth ile oturum yönetimi yapılabilmekte ama birden fazla modülünüz varsa ve bunların arasında ayrım yapmak istiyorsanız ilk kez register ettiğinizde;


$TicketUserPlugin = Zend_Auth::getInstance ( );
$TicketUserPlugin->setStorage(new Zend_Auth_Storage_Session('ticketAuth'));

$UserPlugin = Zend_Auth::getInstance ( );
$UserPlugin->setStorage(new Zend_Auth_Storage_Session('defaultAuth'));



Böylece karışmaz ama bana kalsa en güzeli initializer da modül adına göre kontrol yapıp ordan ayırmak ama yukardaki dediğimide kullanmanız gerekiyor. initializer da ayırım yaparsanız $TicketUserPlugin = Zend_Auth::getInstance ( ); gibi bir çağırmada setStrogae demenize gerek kalmaz.

Not: Modül adını yakalamak için;

public function routeStartup(Zend_Controller_Request_Abstract $request)
{

}

public function routeShutdown(Zend_Controller_Request_Abstract $request)
{

}

public function dispatchLoopStartup(
Zend_Controller_Request_Abstract $request)
{

}

public function preDispatch(Zend_Controller_Request_Abstract $request)
{

}

public function postDispatch(Zend_Controller_Request_Abstract $request)
{

}



metodlarından biri kullanılabilir. Bunlar yazdığım sırayla çağrılmaktadır. Kimisinde yaptığınız işe göre yakalama yapamayabilirsiniz. O zaman bir sonrakini denemeniz gerekebilir.

http://framework.zend.com/manual/en/zend.controller.plugins.html

Zend_Navigation Kullanimi

Zend Framework 1.8 sürümü ile duyurduğu yenilikler arasında bu sınıfta bulunmaktaydı.
İşimiz düştü kullanalım dedik maceramız bundan sonra başladı.

1.7 ile geliştirdiğimiz projede bazı yükseltmeler yapıp 1.8 e uyumlu hale getirdik ama 1.8 ile gelen Bootstrap mevzuları mevcut yapıyı inciteceği veya bizi uğraştıracağı için yapıda değişiklik yapmadık.

http://zendframework.com/manual/en/zend.navigation.html şu sayfaya bakınca adamlar ne güzel yazmış diğebilirsiniz ama bazı alanlarda istediğiniz sonuç çıkmıyor.

Ben size orası şöyle burası böyle demek yerine nasıl kullanacağınızı anlatacağım. Böylece uğraşıp başınızı ağrıtmazsınız.

Öncelikle


$container = new Zend_Navigation();


Yukarda görmüş olduğunuz sınıfa parametre olarak dizi verebilirsiniz. Dizi formatı;

$pages = array(
'label' => $label,
'module' => $module,
'controller' => $controller,
'action' => $action,
'title' => $label
);


Olurda bu menünün alt menüsü olacaksa ;

$pages = array(
'label' => $label,
'module' => $module,
'controller' => $controller,
'action' => $action,
'title' => $label,
'pages' => array(
array(
'label' => $label,
'module' => $module,
'controller' => $controller,
'action' => $action,
'title' => $label
)
)
);


Peki parametre eklemek istersek ?

$pages = array(
'label' => $label,
'module' => $module,
'controller' => $controller,
'action' => $action,
'title' => $label,
'params' => array('_id' => 100)
);


Menüyü heryerde çalıştırmak için initializer gibi bir dosyaya koymak lazım.
Ben plugin olarak yazdım sonrada bu plugini register ettim.

plugin sayfasi;

class CMS_Module_Menu_Plugin_Menu extends Zend_Controller_Plugin_Abstract {

/**
* @var object
*/
protected $_model;

protected $_cms_module_menu;

public function __construct ( $Model ) {

$CMS_Module_Menu_Adapter_Menu = new CMS_Module_Menu_Adapter_Menu($Model);
$this->_cms_module_menu = $CMS_Module_Menu_Adapter_Menu;
}

public function preDispatch ( Zend_Controller_Request_Abstract $request ) {
/**
* Menuleri topla
* @var unknown_type
*/
$pages = $this->_cms_module_menu->getMenuData(0);
/**
* layouta ata
* @var unknown_type
*/
$view = Zend_Layout::getMvcInstance()->getView();
$container = new Zend_Navigation($pages);
$view->navigation()->setContainer($container);
//$uri = $request->getPathInfo();
//$activeNav = $view->navigation()->findByUri($uri);
//$activeNav->active = true;
//$activeNav->setClass("active");
}

}


Dataları ( daha önce bahsettiğim menümüze ait data) dizi olarak almak içinse veritabanından okuyup diziye dönüştüren bir adapter yaptım.


class CMS_Module_Menu_Adapter_Menu
{

/**
* @var object
*/
protected $_model;


public function __construct ($Model)
{
$this->_model = $Model;
}

//TODO:params metodunu kullanarak parametre al
/**
* $pages = $this->getMenuData(0);
* @param $parentid
* @param $pages
* @return unknown_type
*/
public function getMenuData($parentid = 0,&$pages = array())
{

$where = array(
'ParentID='.$parentid.' AND IsMenu = 1 AND Status=1'
);

//$Module_TicketUser_Authentication_Resource = new Module_TicketUser_Authentication_Resource();
$getResourceList = $this->_model->fetchAll($where);
//unset ( $Module_TicketUser_Authentication_Resource );
if ($getResourceList){
foreach($getResourceList as $key=>$value){
list($action, $controller, $module) = explode(".", $value->Name);
$label = $value->Label;
$pages[$value->ResourceID] = array(
'label' => $label,
'module' => $module,
'controller' => $controller,
'action' => $action,
'title' => $label
);

if ($value->Name == 'detail.view.ticket'){
$request = new Zend_Controller_Request_Http();
$param = $request->getParam('_id');
$pages[$value->ResourceID]['params'] = array('_id' => $param);
//$pages[$value->ResourceID]['route'] = 'article_view';
}

if ($value->ResourceID != 0) {
$pages[$value->ResourceID]['pages'] = array();
$this->getMenuData($value->ResourceID,$pages[$value->ResourceID]['pages']);
}

}
}
return $pages;
}

}


Yukardaki sınıfta getMenuData metodu ile veritabanından aldığım veriyi diziye dönüştürüp bırakıyorum. Tabi bunu Zend_Navigation un mantığına uygun olarak yapıyorum.

Son olarak plugini register edelim;

$Zend_Controller_Front = Zend_Controller_Front::getInstance ( );
$Zend_Controller_Front->registerPlugin ( new CMS_Module_Menu_Plugin_Menu ( new Module_TicketUser_Authentication_Resource ( ) ) );


Dikkat ederseniz parametre olarak db nesnesini yolluyoruz. Sizde tablonuzun adına ve içeriğine ögre gerekli değişikliği yaparsınız.

Layout kullanımı

echo $this->navigation()->menu(); ?>
echo $this->navigation()->breadcrumbs()->setMinDepth(0)->setLinkLast(false)->setSeparator("»"); ?>

6 Temmuz 2009 Pazartesi

SpyMasterSnake Açıldı...

Evet bu haber beni çok duygulandırdı. Çünkü çocukluğumuz orda geçti. Orda büyük öğrendik yazdık. Bir zamanlar AventGrup da vardı. Kim bilir belki ilerde bir gün o da açılır.

Ama SpyMS başka hakkaten özlemişim mesajları okurken gördüğüm nickler beni geçmişe götürdü. Neredeyse hepsini tanıyorum....

Nerden nereye....

http://www.spymastersnake.org

4 Temmuz 2009 Cumartesi

Flashget in client.kuaiche.com sayfasini acmaya baslamasi...

Flashget in flashget196 versiyonunu indirdiğinizde bir süre sonra " client.kuaiche.com " sayfasını açmaya çalıştığını ve bunu açamayarak sorular sorduğunu farkedersiniz.

O zaman yapmanız gereken;

http://www.trendsecure.com/portal/en-US/threat_analytics/HiJackThis.zip

programını indirip temizliye başlayabilirsiniz. Spybot Search and Destroy yada sdFix
bunu temizliyemiyor.

Programı kullanmak için http://www.bilgisayar-destek.com/hijackthis-v202-tanitimi-ve-resimli-anlatimi/ okuyabilirsiniz.


Not: her ihtimale karşı flashget şn eski versiyonunu bulup onu kurdum.
http://www.oldapps.com/flashget.php?old_flashget=17