Category Archives: Yazılım Geliştirme

C’de Hafıza Yönetimi: Heap-Stack Konusu

heap-stack

Hafıza yönetimi bir işletim sisteminin temel işlevlerinden birisidir. Multi-tasking çalışan bütün işletim sistemlerinde her process kendisine ait bir hafıza alanında çalışır. Böylece (normal şartlarda) programların hafıza adresleri birbirine karışmaz. Yani, iki program … koduyla bir hafıza alanına erişmek istediğinde, gerçekte ikisi RAM üzerinde farklı alanlara erişir.

Bir program çalıştırılmak üzere hafızaya yüklendiğinde temel olarak üç hafıza bölgesi (segment) içinde organize edilir: text segmenti, stack segmenti ve heap segmenti.

  • Text segmenti: Derlenmiş programın kendisi tutulur. Programcının yazdığı kodlar derleyici tarafından işlemcinin anlayacağı şekilde makine koduna çevrilir ve binary olarak text segmentinde tutulur.
  • Heap segmenti: program çalışma esnasında malloc() veya calloc() gibi fonksiyonlarla hafızadan yer aldığında, heap segmentinden bir alan tahsis edilir. Heap’ten daha fazla alan alındıkça, heap yukarı doğru büyür.
  • Stack segment: Lokal değişkenleri tutmak ve fonksiyonlara argüman vererek çağırmak için kullanılır. Stack aşağı doğru büyür.
Tagged

Apache, MySQL ve PHP Yükleme Scripti

Debian tabanlı sistemlerde Apache, MySQL ve PHP yüklemek ve optimize etmek için aşağıdaki kod kullanılabilir.

Bunun için aşağıdaki dosyayı source komutuyla include edip gerekli fonksiyonları çağırmanız gerekiyor. İsterseniz fonksiyonları ayrı ayrı da kullanabilirsiniz.

 

StackScript.h:

#!/bin/bash
# StackScript Bash Library
# Copyright (c) 2010 Linode LLC / Christopher S. Aker <[email protected]>

###########################################################
# System
###########################################################

function system_update {
	apt-get update
	apt-get -y install aptitude
	aptitude -y full-upgrade
}

function system_primary_ip {
	# returns the primary IP assigned to eth0
	echo $(ifconfig eth0 | awk -F: '/inet addr:/ {print $2}' | awk '{ print $1 }')
}

function get_rdns {
	# calls host on an IP address and returns its reverse dns

	if [ ! -e /usr/bin/host ]; then
		aptitude -y install dnsutils > /dev/null
	fi
	echo $(host $1 | awk '/pointer/ {print $5}' | sed 's/\.$//')
}

function get_rdns_primary_ip {
	# returns the reverse dns of the primary IP assigned to this system
	echo $(get_rdns $(system_primary_ip))
}

###########################################################
# Postfix
###########################################################

function postfix_install_loopback_only {
	# Installs postfix and configure to listen only on the local interface. Also
	# allows for local mail delivery

	echo "postfix postfix/main_mailer_type select Internet Site" | debconf-set-selections
	echo "postfix postfix/mailname string localhost" | debconf-set-selections
	echo "postfix postfix/destinations string localhost.localdomain, localhost" | debconf-set-selections
	aptitude -y install postfix
	/usr/sbin/postconf -e "inet_interfaces = loopback-only"
	#/usr/sbin/postconf -e "local_transport = error:local delivery is disabled"

	touch /tmp/restart-postfix
}

###########################################################
# Apache
###########################################################

function apache_install {
	# installs the system default apache2 MPM
	aptitude -y install apache2

	a2dissite default # disable the interfering default virtualhost

	# clean up, or add the NameVirtualHost line to ports.conf
	sed -i -e 's/^NameVirtualHost \*$/NameVirtualHost *:80/' /etc/apache2/ports.conf
	if ! grep -q NameVirtualHost /etc/apache2/ports.conf; then
		echo 'NameVirtualHost *:80' > /etc/apache2/ports.conf.tmp
		cat /etc/apache2/ports.conf >> /etc/apache2/ports.conf.tmp
		mv -f /etc/apache2/ports.conf.tmp /etc/apache2/ports.conf
	fi
}

function apache_tune {
	# Tunes Apache's memory to use the percentage of RAM you specify, defaulting to 40%

	# $1 - the percent of system memory to allocate towards Apache

	if [ ! -n "$1" ];
		then PERCENT=40
		else PERCENT="$1"
	fi

	aptitude -y install apache2-mpm-prefork
	PERPROCMEM=10 # the amount of memory in MB each apache process is likely to utilize
	MEM=$(grep MemTotal /proc/meminfo | awk '{ print int($2/1024) }') # how much memory in MB this system has
	MAXCLIENTS=$((MEM*PERCENT/100/PERPROCMEM)) # calculate MaxClients
	MAXCLIENTS=${MAXCLIENTS/.*} # cast to an integer
	sed -i -e "s/\(^[ \t]*MaxClients[ \t]*\)[0-9]*/\1$MAXCLIENTS/" /etc/apache2/apache2.conf

	touch /tmp/restart-apache2
}

function apache_virtualhost {
	# Configures a VirtualHost

	# $1 - required - the hostname of the virtualhost to create 

	if [ ! -n "$1" ]; then
		echo "apache_virtualhost() requires the hostname as the first argument"
		return 1;
	fi

	if [ -e "/etc/apache2/sites-available/$1" ]; then
		echo /etc/apache2/sites-available/$1 already exists
		return;
	fi

	mkdir -p /srv/www/$1/public_html /srv/www/$1/logs

	echo "<VirtualHost *:80>" > /etc/apache2/sites-available/$1
	echo "    ServerName $1" >> /etc/apache2/sites-available/$1
	echo "    DocumentRoot /srv/www/$1/public_html/" >> /etc/apache2/sites-available/$1
	echo "    ErrorLog /srv/www/$1/logs/error.log" >> /etc/apache2/sites-available/$1
    echo "    CustomLog /srv/www/$1/logs/access.log combined" >> /etc/apache2/sites-available/$1
	echo "</VirtualHost>" >> /etc/apache2/sites-available/$1

	a2ensite $1

	touch /tmp/restart-apache2
}

function apache_virtualhost_from_rdns {
	# Configures a VirtualHost using the rdns of the first IP as the ServerName

	apache_virtualhost $(get_rdns_primary_ip)
}

function apache_virtualhost_get_docroot {
	if [ ! -n "$1" ]; then
		echo "apache_virtualhost_get_docroot() requires the hostname as the first argument"
		return 1;
	fi

	if [ -e /etc/apache2/sites-available/$1 ];
		then echo $(awk '/DocumentRoot/ {print $2}' /etc/apache2/sites-available/$1 )
	fi
}

###########################################################
# mysql-server
###########################################################

function mysql_install {
	# $1 - the mysql root password

	if [ ! -n "$1" ]; then
		echo "mysql_install() requires the root pass as its first argument"
		return 1;
	fi

	echo "mysql-server-5.1 mysql-server/root_password password $1" | debconf-set-selections
	echo "mysql-server-5.1 mysql-server/root_password_again password $1" | debconf-set-selections
	apt-get -y install mysql-server mysql-client

	echo "Sleeping while MySQL starts up for the first time..."
	sleep 5
}

function mysql_tune {
	# Tunes MySQL's memory usage to utilize the percentage of memory you specify, defaulting to 40%

	# $1 - the percent of system memory to allocate towards MySQL

	if [ ! -n "$1" ];
		then PERCENT=40
		else PERCENT="$1"
	fi

	sed -i -e 's/^#skip-innodb/skip-innodb/' /etc/mysql/my.cnf # disable innodb - saves about 100M

	MEM=$(awk '/MemTotal/ {print int($2/1024)}' /proc/meminfo) # how much memory in MB this system has
	MYMEM=$((MEM*PERCENT/100)) # how much memory we'd like to tune mysql with
	MYMEMCHUNKS=$((MYMEM/4)) # how many 4MB chunks we have to play with

	# mysql config options we want to set to the percentages in the second list, respectively
	OPTLIST=(key_buffer sort_buffer_size read_buffer_size read_rnd_buffer_size myisam_sort_buffer_size query_cache_size)
	DISTLIST=(75 1 1 1 5 15)

	for opt in ${OPTLIST[@]}; do
		sed -i -e "/\[mysqld\]/,/\[.*\]/s/^$opt/#$opt/" /etc/mysql/my.cnf
	done

	for i in ${!OPTLIST[*]}; do
		val=$(echo | awk "{print int((${DISTLIST[$i]} * $MYMEMCHUNKS/100))*4}")
		if [ $val -lt 4 ]
			then val=4
		fi
		config="${config}\n${OPTLIST[$i]} = ${val}M"
	done

	sed -i -e "s/\(\[mysqld\]\)/\1\n$config\n/" /etc/mysql/my.cnf

	touch /tmp/restart-mysql
}

function mysql_create_database {
	# $1 - the mysql root password
	# $2 - the db name to create

	if [ ! -n "$1" ]; then
		echo "mysql_create_database() requires the root pass as its first argument"
		return 1;
	fi
	if [ ! -n "$2" ]; then
		echo "mysql_create_database() requires the name of the database as the second argument"
		return 1;
	fi

	echo "CREATE DATABASE $2;" | mysql -u root -p$1
}

function mysql_create_user {
	# $1 - the mysql root password
	# $2 - the user to create
	# $3 - their password

	if [ ! -n "$1" ]; then
		echo "mysql_create_user() requires the root pass as its first argument"
		return 1;
	fi
	if [ ! -n "$2" ]; then
		echo "mysql_create_user() requires username as the second argument"
		return 1;
	fi
	if [ ! -n "$3" ]; then
		echo "mysql_create_user() requires a password as the third argument"
		return 1;
	fi

	echo "CREATE USER '$2'@'localhost' IDENTIFIED BY '$3';" | mysql -u root -p$1
}

function mysql_grant_user {
	# $1 - the mysql root password
	# $2 - the user to bestow privileges 
	# $3 - the database

	if [ ! -n "$1" ]; then
		echo "mysql_create_user() requires the root pass as its first argument"
		return 1;
	fi
	if [ ! -n "$2" ]; then
		echo "mysql_create_user() requires username as the second argument"
		return 1;
	fi
	if [ ! -n "$3" ]; then
		echo "mysql_create_user() requires a database as the third argument"
		return 1;
	fi

	echo "GRANT ALL PRIVILEGES ON $3.* TO '$2'@'localhost';" | mysql -u root -p$1
	echo "FLUSH PRIVILEGES;" | mysql -u root -p$1

}

###########################################################
# PHP functions
###########################################################

function php_install_with_apache {
	aptitude -y install php5 php5-mysql libapache2-mod-php5
	touch /tmp/restart-apache2
}

function php_tune {
	# Tunes PHP to utilize up to 32M per process

	sed -i'-orig' 's/memory_limit = [0-9]\+M/memory_limit = 32M/' /etc/php5/apache2/php.ini
	touch /tmp/restart-apache2
}

###########################################################
# Other niceties!
###########################################################

function goodstuff {
	# Installs the REAL vim, wget, less, and enables color root prompt and the "ll" list long alias

	aptitude -y install wget vim less
	sed -i -e 's/^#PS1=/PS1=/' /root/.bashrc # enable the colorful root bash prompt
	sed -i -e "s/^#alias ll='ls -l'/alias ll='ls -al'/" /root/.bashrc # enable ll list long alias <3
}

###########################################################
# utility functions
###########################################################

function restartServices {
	# restarts services that have a file in /tmp/needs-restart/

	for service in $(ls /tmp/restart-* | cut -d- -f2-10); do
		/etc/init.d/$service restart
		rm -f /tmp/restart-$service
	done
}

function randomString {
	if [ ! -n "$1" ];
		then LEN=20
		else LEN="$1"
	fi

	echo $(</dev/urandom tr -dc A-Za-z0-9 | head -c $LEN) # generate a random string
}

 

Sırasıyla Postfix, MySQL, PHP ve Apache yüklemek için:

#!/bin/bash

source StackScript.h

system_update
postfix_install_loopback_only
mysql_install "$DB_PASSWORD" && mysql_tune 40
php_install_with_apache && php_tune
apache_install && apache_tune 40 && apache_virtualhost_from_rdns
goodstuff
wordpress_install $(get_rdns_primary_ip)
restartServices

 

kaynak: http://www.linode.com/stackscripts/view/?StackScriptID=1

Sitenizi Yavaşlatan Suçluyu Bulmak: Yavaş SQL Sorguları

Bir web sunucusunun hızlı olması için SQL sorgularının optimize edilmesi çok önemli. MySQL’de hangi sorguların uzun sürdüğünü anlamak için halihazırda bir özellik var. my.cnf dosyasına aşağıdaki satırları ekleyerek yavaş sorguları bir dosyaya yazdırabilirsiniz.

log_slow_queries  = /var/log/mysql/mysql-slow.log
long_query_time    = 5

Not: Bu değişiklikten sonra mysqld‘yi tekrar başlatmayı unutmayın!

Çalışma anında dinamik olarak log’lamayı açıp kapatmak için şu MySQL komutları kullanılabilir:

set log_slow_queries = ON;
set log_slow_queries = OFF;

Ne kadar süren sorguların yavaş sayılacağını da yine aynı şekilde komut satırından şu komutla ayarlayabilirsiniz:

set global long_query_time = 5;

Yavaş sorguları analiz etmek için de mysqldumpslo komutu kullanılabilirmiş.

bkz. http://dev.mysql.com/doc/refman/5.6/en/mysqldumpslow.html

MySQL’de Bul-Değiştir, Türkçe Karakterler

MySQL’de TEXT olan bir alanın içinde değişiklik yapmak sık lazım olabilecek bir iş.

Şöyle bir sorgu kullanıyorum:

UPDATE `tablo_adi` SET `alan_adi`= REPLACE (`alan_adi`, 'eski metin', 'yeni metin');

Geçenlerde büyük bir tabloyu Latin5‘ten UTF8‘e çevirmem gerekti. Bayağı debelendikten sonra, önce sütunları UTF8’e çevirdim:

ALTER TABLE  `tablo_adi` CHANGE  `bilgi`  `bilgi` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
ALTER TABLE  `tablo_adi` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Sonra da, Türkçe karakterleri ve Word’den gelmiş bazı ISO kodlarını UTF8’e çevirdim:
Continue reading

Linux’ta Firefox ve Google Chrome’da Backspace tuşu

Linux’ta Firefox ve Google Chrome’da backspace Windows versiyonlarındaki gibi tuşu varsayılan olarak bir önceki sayfaya gitmiyor. Bu ayarı değiştirmek için about:config adresine gidin. browser.backspace_action seçeneğinin değerini 0 olarak değiştirin ve bu sayfayı kapatın.

Bir kelimenin dosyadaki n’inci tekrarını bulmak

Bir dosya içindeki bir kelimenin n’inci tekrarının hangi satırda olduğunu bulmak için aşağıdaki awk betiği kullanılabilir. Örneğin dosya.txt’deki KELIME kelimesinin 237. tekrarını bulmak için:

gawk "/KELIME/{c++; if(c==237)print NR;}" dosya.txt

Windows’ta Gawk for Windows kullanılabilir.

C++’da Integer’ı String’e dönüştürmek

C/C++’a yeni başlayanların sık cevap aradığı sorulardan birisi bir integer‘i nasıl string‘e dönüştürürüm.

itoa() fonksiyonu kullanılabilir. Örnek:

#include 
#include 
int main ()
{
int i;
char buffer [33];
printf ("Enter a number: ");
scanf ("%d",&i);
itoa (i,buffer,10);
printf ("decimal: %s\n",buffer);
itoa (i,buffer,16);
printf ("hexadecimal: %s\n",buffer);
itoa (i,buffer,2);
printf ("binary: %s\n",buffer);
return 0;
}

 

Ama itoa() fonksiyonu tüm derleyicilerce desteklenmiyorsa sprintf() de iş görecektir.

sprintf(str,"%d",value); //ondalık tabanda bir sayıya dönüştürür
sprintf(str,"%x",value); //onaltılık tabanda bir sayıya dönüştürür
sprintf(str,"%o",value); //sekizliktabanda bir sayıya dönüştürür