Archive | GNU/Linux İpuçları

Python GUI examples (Tkinter Tutorial)

In this tutorial, we will learn how to develop graphical user interfaces by writing some Python GUI examples using Tkinter package. Tkinter package is shipped with Python as a standard package, so we don’t need to install anything to use it. Tkinter package is a very powerful package. If you already have installed Python, you may use IDLE which is the integrated IDE that is shipped with Python, this IDE is written using Tkinter. Sounds Cool!! We will use Python 3.6, so if you are using Python 2.x, it’s strongly recommended to switch to Python 3.x unless you know the language changes so you can adjust the code to run without errors. I assume that you a little background about Python basics to help you understand what we are doing. We will start by creating a window then we will learn how to add widgets such as buttons, combo boxes, etc, then we will play with their properties, so let’s get started.

Continue Reading →

Create your first GUI application

First, we will import Tkinter package and create a window and set its title:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")


The result will be like this:

Awesome!! Our application just works.

The last line which calls mainloop function, this function calls the endless loop of the window, so the window will wait for any user interaction till we close it.

If you forget to call the mainloop function, nothing will appear to the user.

Create a label widget

To add a label to our previous example, we will create a label using the label class like this:

lbl = Label(window, text="Hello")

Then we will set its position on the form using the grid function and give it the location like this:

lbl.grid(column=0, row=0)

So the complete code will be like this:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)


And this is the result:

Without calling the grid function for the label, it won’t show up.

Set label font size

You can set the label font so you can make it bigger and maybe bold. You can also change the font style.

To do so, you can pass the font parameter like this:

lbl = Label(window, text="Hello", font=("Arial Bold", 50))

Note that the font parameter can be passed to any widget to change its font not labels only.

Great, but the window is so small, we can even see the title, what about setting the window size?

Setting window size

We can set the default window size using geometry function like this:


The above line sets the window width to 350 pixels and the height to 200 pixels.

Let’s try adding more GUI widgets like buttons and see how to handle button click event.

Adding a button widget

Let’s start by adding the button to the window, the button is created and added to the window the same as the label:

btn = Button(window, text="Click Me")

btn.grid(column=1, row=0)

So our window will be like this:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")


lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

btn = Button(window, text="Click Me")

btn.grid(column=1, row=0)


The result looks like this:

Note that we place the button on the second column of the window which is 1. If you forget and place the button on the same column which is 0, it will show the button only, since the button will be on the top of the label.

Change button foreground and background colors

You can change foreground for a button or any other widget using fg property.

Also, you can change the background color for any widget using bg property.

btn = Button(window, text="Click Me", bg="orange", fg="red")

Now, if you tried to click on the button, nothing happens because the click event of the button isn’t written yet.
Handle button click event

First, we will write the function that we need to execute when the button is clicked:

def clicked():

lbl.configure(text="Button was clicked !!")

Then we will wire it with the button by specifying the function like this:

btn = Button(window, text=“Click Me”, command=clicked)

Note that, we typed clicked only not clicked() with parentheses.

Now the full code will be like this:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")


lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

def clicked():

lbl.configure(text="Button was clicked !!")

btn = Button(window, text="Click Me", command=clicked)

btn.grid(column=1, row=0)


And when we click the button, the result as expected:


Get input using Entry class (Tkinter textbox)

In the previous Python GUI examples, we saw how to add simple widgets, now let’s try getting the user input using Tkinter Entry class (Tkinter textbox).

You can create a textbox using Tkinter Entry class like this:

txt = Entry(window,width=10)

Then you can add it to the window using grid function as usual

So our window will be like this:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")


lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

txt = Entry(window,width=10)

txt.grid(column=1, row=0)

def clicked():

lbl.configure(text="Button was clicked !!")

btn = Button(window, text="Click Me", command=clicked)

btn.grid(column=2, row=0)


And the result will be like this:

Now, if you click the button, it will show the same old message, what about showing the entered text on the Entry widget?

First, you can get entry text using get function. So we can write this code to our clicked function like this:

def clicked():

res = "Welcome to " + txt.get()

lbl.configure(text= res)

If you click the button and there is a text on the entry widget, it will show “Welcome to” concatenated with the entered text.

And this is the complete code:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")


lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

txt = Entry(window,width=10)

txt.grid(column=1, row=0)

def clicked():

res = "Welcome to " + txt.get()

lbl.configure(text= res)

btn = Button(window, text="Click Me", command=clicked)

btn.grid(column=2, row=0)


Run the above code and check the result:


Every time we run the code, we need to click on the entry widget to set focus to write the text, what about setting the focus automatically?

Set focus to entry widget

That’s super easy, all we need to do is to call focus function like this:


And when you run your code, you will notice that the entry widget has the focus so you can write your text right away.

Disable entry widget

To disable entry widget, you can set the state property to disabled:

txt = Entry(window,width=10, state='disabled')

Now, you won’t be able to enter any text.

Add a combobox widget

To add a combobox widget, you can use the Combobox class from ttk library like this:

from tkinter.ttk import *

combo = Combobox(window)

Then you can add your values to the combobox.

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")


combo = Combobox(window)

combo['values']= (1, 2, 3, 4, 5, "Text")

combo.current(1) #set the selected item

combo.grid(column=0, row=0)


As you can see, we add the combobox items using the values tuble.

To set the selected item, you can pass the index of the desired item to the current function.

To get the select item, you can use the get function like this:


Add a Checkbutton widget (Tkinter checkbox)

To create a checkbutton widget, you can use Checkbutton class like this:

chk = Checkbutton(window, text='Choose')

Also, you can set the checked state by passing the check value to the Checkbutton like this:

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")


chk_state = BooleanVar()

chk_state.set(True) #set check state

chk = Checkbutton(window, text='Choose', var=chk_state)

chk.grid(column=0, row=0)


Check the result:

Set check state of a Checkbutton

Here we create a variable of type BooleanVar which is not a standard Python variable, it’s a Tkinter variable, and then we pass it to the Checkbutton class to set the check state as the highlighted line in the above example.

You can set the Boolean value to false to make it unchecked.

Also, you can use IntVar instead of BooleanVar and set the value to 0 or 1.

chk_state = IntVar()

chk_state.set(0) #uncheck

chk_state.set(1) #check

These examples give the same result as the BooleanVar.

Add radio buttons widgets

To add radio buttons, simply you can use RadioButton class like this:

rad1 = Radiobutton(window,text='First', value=1)

Note that you should set the value for every radio button with a different value, otherwise, they won’t work.

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")


rad1 = Radiobutton(window,text='First', value=1)

rad2 = Radiobutton(window,text='Second', value=2)

rad3 = Radiobutton(window,text='Third', value=3)

rad1.grid(column=0, row=0)

rad2.grid(column=1, row=0)

rad3.grid(column=2, row=0)


The result of the above code looks like this:

Also, you can set the command of any of these radio buttons to a specific function, so if the user clicks on any one of them, it runs the function code.

This is an example:

rad1 = Radiobutton(window,text='First', value=1, command=clicked)

def clicked():

# Do what you need

Pretty simple!!

Get radio button value (selected radio button)

To get the currently selected radio button or the radio button value, you can pass the variable parameter to the radio buttons and later you can get its value.

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")

selected = IntVar()

rad1 = Radiobutton(window,text='First', value=1, variable=selected)

rad2 = Radiobutton(window,text='Second', value=2, variable=selected)

rad3 = Radiobutton(window,text='Third', value=3, variable=selected)

def clicked():


btn = Button(window, text="Click Me", command=clicked)

rad1.grid(column=0, row=0)

rad2.grid(column=1, row=0)

rad3.grid(column=2, row=0)

btn.grid(column=3, row=0)


Every time you select a radio button, the value of the variable will be changed to the value of the selected radio button.

Add a ScrolledText widget (Tkinter textarea)

To add a ScrolledText widget, you can use the ScrolledText class like this:

from tkinter import scrolledtext

txt = scrolledtext.ScrolledText(window,width=40,height=10)

Here we specify the width and the height of the ScrolledText widget, otherwise, it will fill the entire window.

from tkinter import *

from tkinter import scrolledtext

window = Tk()

window.title("Welcome to LikeGeeks app")


txt = scrolledtext.ScrolledText(window,width=40,height=10)



The result as you can see:

Set scrolledtext content

To set scrolledtext content, you can use the insert method like this:

txt.insert(INSERT,'You text goes here')

Delete/Clear scrolledtext content

To clear the contents of a scrolledtext widget, you can use delete method like this:



Create a MessageBox

To show a message box using Tkinter, you can use messagebox library like this:

from tkinter import messagebox

messagebox.showinfo('Message title','Message content')

Pretty easy!!

Let’s show a message box when the user clicks a button.

from tkinter import *

from tkinter import messagebox

window = Tk()

window.title("Welcome to LikeGeeks app")


def clicked():

messagebox.showinfo('Message title', 'Message content')

btn = Button(window,text='Click here', command=clicked)



When you click the button, an info messagebox will appear.

Show warning and error messages

You can show a warning message or error message the same way. The only thing that needs to be changed is the message function

messagebox.showwarning('Message title', 'Message content') #shows warning message

messagebox.showerror('Message title', 'Message content') #shows error message

Show askquestion dialogs

To show a yes no message box to the user, you can use one of the following messagebox functions:

from tkinter import messagebox

res = messagebox.askquestion('Message title','Message content')

res = messagebox.askyesno('Message title','Message content')

res = messagebox.askyesnocancel('Message title','Message content')

res = messagebox.askokcancel('Message title','Message content')

res = messagebox.askretrycancel('Message title','Message content')

You can choose the appropriate message style according to your needs. Just replace the showinfo function line from the previous line and run it.

Also, you can check what button was clicked using the result variable

If you click OK or yes or retry, it will return True value, but if you choose no or cancel, it will return False.

The only function that returns one of three values is askyesnocancel function, it returns True or False or None.

Add a SpinBox (numbers widget)

To create a Spinbox widget, you can use Spinbox class like this:

spin = Spinbox(window, from_=0, to=100)

Here we create a Spinbox widget and we pass the from_ and to parameters to specify the numbers range for the Spinbox.

Also, you can specify the width of the widget using the width parameter:

spin = Spinbox(window, from_=0, to=100, width=5)

Check the complete example:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")


spin = Spinbox(window, from_=0, to=100, width=5)



You can specify the numbers for the Spinbox instead of using the whole range like this:

spin = Spinbox(window, values=(3, 8, 11), width=5)

Here the Spinbox widget only shows these 3 numbers only 3, 8 and 11.

Set default value for Spinbox

To set the Spinbox default value, you can pass the value to the textvariable parameter like this:

var =IntVar()


spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var)

Now, if you run the program, it will show 36 as a default value for the Spinbox.

Add a Progressbar widget

To create a progress bar, you can use the progressbar class like this:

from tkinter.ttk import Progressbar

bar = Progressbar(window, length=200)

You can set the progress bar value like this:

bar['value'] = 70

You can set this value based on any process you want like downloading a file or completing a task.

Change Progressbar color

Changing Progressbar color is a bit tricky, but super easy.

First, we will create a style and set the background color and finally set the created style to the Progressbar.

Check the following example:

from tkinter import *

from tkinter.ttk import Progressbar

from tkinter import ttk

window = Tk()

window.title("Welcome to LikeGeeks app")


style = ttk.Style()


style.configure("black.Horizontal.TProgressbar", background='black')

bar = Progressbar(window, length=200, style='black.Horizontal.TProgressbar')

bar['value'] = 70

bar.grid(column=0, row=0)


And the result will be like this:

Add a filedialog (file & directory chooser)

To create a file dialog (file chooser), you can use the filedialog class like this:

from tkinter import filedialog

file = filedialog.askopenfilename()

After you choose a file and click open, the file variable will hold that file path.

Also, you can ask for multiple files like this:

files = filedialog.askopenfilenames()

Specify file types (filter file extensions)

You can specify the file types for a file dialog using filetypes parameter, just specify the extensions in tubles.

file = filedialog.askopenfilename(filetypes = (("Text files","*.txt"),("all files","*.*")))

You can ask for a directory using askdirectory method:

dir = filedialog.askdirectory()

You can specify the initial directory for the file dialog by specifying the initialdir like this:

from os import path

file = filedialog.askopenfilename(initialdir= path.dirname(__file__))


Add a Menu bar

To add a menu bar, you can use menu class like this:
“crayon-5a6ed64ac76ec001310365″ class=”crayon-syntax crayon-theme-xcode crayon-font-monaco crayon-os-pc print-yes notranslate” data-settings=” minimize scroll-mouseover”

from tkinter import Menu

menu = Menu(window)



First, we create a menu, then we add our first label, and finally, we assign the menu to our window.

You can add menu items under any menu by using add_cascade() function like this:

menu.add_cascade(label='File', menu=new_item)

So our code will be like this:

from tkinter import *

from tkinter import Menu

window = Tk()

window.title("Welcome to LikeGeeks app")

menu = Menu(window)

new_item = Menu(menu)


menu.add_cascade(label='File', menu=new_item)



Using this way, you can add many menu items as you want.

from tkinter import *

from tkinter import Menu

window = Tk()

window.title("Welcome to LikeGeeks app")

menu = Menu(window)

new_item = Menu(menu)




menu.add_cascade(label='File', menu=new_item)



Here we add another menu item called Edit with a menu separator.

You may notice a dashed line at the beginning, well, if you click that line, it will show the menu items in a small separate window.

You can disable this feature by disabling the tearoff feature like this:

new_item = Menu(menu, tearoff=0)

Just replace the new_item in the above example with this one and it won’t show the dashed line anymore.

I don’t need to remind you that you can type any code that works when the user clicks on any menu item by specifying the command property.

new_item.add_command(label='New', command=clicked)

Add a Notebook widget (tab control)

To create a tab control, there are 3 steps to do so.

  • First, we create a tab control using Notebook class
  • Create a tab using Frame class.
  • Add that tab to the tab control.
  • Pack the tab control so it becomes visible in the window.

from tkinter import *

from tkinter import ttk

window = Tk()

window.title("Welcome to LikeGeeks app")

tab_control = ttk.Notebook(window)

tab1 = ttk.Frame(tab_control)

tab_control.add(tab1, text='First')

tab_control.pack(expand=1, fill='both')


You can add many tabs as you want the same way.

Add widgets to Notebooks

After creating tabs, you can put widgets inside these tabs by assigning the parent property to the desired tab.

from tkinter import *

from tkinter import ttk

window = Tk()

window.title("Welcome to LikeGeeks app")

tab_control = ttk.Notebook(window)

tab1 = ttk.Frame(tab_control)

tab2 = ttk.Frame(tab_control)

tab_control.add(tab1, text='First')

tab_control.add(tab2, text='Second')

lbl1 = Label(tab1, text= 'label1')

lbl1.grid(column=0, row=0)

lbl2 = Label(tab2, text= 'label2')

lbl2.grid(column=0, row=0)

tab_control.pack(expand=1, fill='both')


Add spacing for widgets (padding)

You can add padding for your controls to make it looks well organized using padx and pady properties.

Just pass padx and pady to any widget and give them a value.

lbl1 = Label(tab1, text= 'label1', padx=5, pady=5)

Just that simple!!

In this tutorial, we saw many Python GUI examples using Tkinter library and we saw how easy it’s to develop graphical interfaces using it.

This tutorial covers main aspects of Python GUI development not all of them. There is no tutorial or a book can cover everything.

I hope you find these examples useful. Keep coming back.

Thank you.


Necdet Yücel: Özgür yazılım ile açık kaynağın ne farkı var?

Özgür Yazılım hareketi 1983’de başlayan ve kullanıcıların yazılımları çalıştırma, anlama, değiştirme ve değiştirdikleri halini dağıtma özgürlüklerini savunan bir harekettir. Açık Kaynak ise neredeyse aynı ilkeleri farklı ifadelerle savunan ve 1998’de ortaya çıkan, özgür yazılım topluluğunun içinden çıkan bir oluşumdur. Özgür Yazılım hareketinin başlatıcısı Stallman açık kaynağı bir yazılım geliştirme metodolojisi, özgür yazılımı ise bir sosyal hareket olarak görmektedir. Stallman uzun yıllardır neden kendisini bir açık kaynak savunucusu olarak kabul etmediğini yazılarıyla ve konuşmalarıyla anlatıyor olsa da çok fazla anlaşıldığı söylenemez. Bu yazıda ikisi arasında bir fark var mı ve biz hangi ifadeyi kullanmalıyız konularını tartışmak istiyorum.

Continue Reading →


Bir yazılımla ne yapabileceğinizi belirleyen şey onun özgür yazılım veya açık kaynak olması değil o yazılımın kullandığı lisanstır. Temel kavramları aynı bile olsa her özgür yazılım lisansı aynı kullanım şartlarını sunmaz. Watcom ı gibi neredeyse kimsenin kullanmadığı lisansları bir tarafa bırakırsak bütün açık kaynak yazılım lisanslarının aynı zamanda özgür yazılım lisansı olarak kabul edildiğini görürüz. Konuya lisanslar açısından bakınca özgür yazılımlar ile açık kaynak yazılımlar arasında bir fark yoktur [3].

Yanlış anlamalar

Türkçe konuşan insanlar olarak “free software” ifadesinde yaşanan “bedava” mı “özgür” mü karışıklığını yaşamıyor olmamıza rağmen “open source” yazılım denildiğinde sadece kaynak kodu açık olan yazılımın anlaşılması gibi sorunla, İngilizce konuşanlar gibi, karşı karşıya kalıyoruz. Özgür yazılım denildiğinde arkasında yazılımın ve kullanıcıların özgürlüklerini önemseyen, onun için mücadele eden bir felsefe olduğunu anlamak kolay olmasına rağmen maalesef onun hakkında da kafa karışıklığı az değil. Genel Kamu Lisansı (GPL) en bilinen özgür yazılım lisanslarının başında geliyor olmasına rağmen tek özgür yazılım lisansı değil. GPL özgür yazılımın dört şartına ek olarak Copyleft kavramını da kullanmaktadır. Özgür yazılımın şartları yazılımı sizin nasıl haklarla edineceğinizi belirlerken Copyleft onu nasıl dağıtmanız gerektiğini söyler. Yani Copyleft özelliğine sahip bir lisansla lisanslanmış bir yazılımı yine aynı şartlarla dağıtmanız gerekir [1]. Bütün özgür yazılım lisanslarının böyle bir zorunluluğu olmamasına rağmen maalesef genel kanı bu yönde ülkemizde.

Açık kaynak ise ülkemizde en az anlaşılan kavramlardan biri. Bunda adının yaptığı çağrışımın etkisi de büyük elbette. Hem kullanıcılar, hem de önemli miktarda geliştirici bir yazılımın kaynak kodunu görebildiğinde onu açık kaynak sanmak gibi bir kavramsal hataya düşüyor [2]. Github benzeri bir kod barındırma ortamına yazılımının kaynak kodlarını koyan bir yazılımcı onun hemen açık kaynak olduğu yanılgısına kapılıyor.

Açık kaynak yanlış anlaşılmaya çok müsait olduğundan açık kaynak ifadesini her kullandığımızda onun kaynağı açık olan yazılım anlamına gelmediğini ve mevcut 10 şartını anlatmak oldukça zor bir iştir. Bunu yapmadığımızda hem özgür yazılım hem de açık kaynak hareketlerinin uğraştıkları konuları önemsememiş oluruz. Özgür yazılım dediğimizde birilerinin kafasını karıştırma riski oldukça düşüktür. Günümüzde gittikçe artan bir hızla özel mülk yazılımların da kaynak kodlarının açıldığını hesaba katarak, insanları yanlış yönlendirmemek için açık kaynak yerine özgür yazılım ifadesini kullanmak daha doğru bir hareket olacaktır.

Düşmanımız açık kaynak değil özel mülk yazılımdır

Özgür yazılım taraftarları olarak sıklıkla açık kaynak ifadesini özgür yazılım olarak düzeltiyoruz. Bunu kafa karışıklığına neden olmamak için yaptığımız halde, istemeden de olsa, sanki açık kaynağın kötü bir şey olduğu algısını da yaratabiliyoruz. Halbuki durum böyle değil. Özgür yazılım ve açık kaynak hareketleri kullanıcıların özgürlüklerini savunan hareketlerdir. Biz özgür yazılım savunucuları açık kaynağı düşman olarak görmeyiz. Hem özgür yazılımın hem de açık kaynak yazılımın insanlık için kötü olarak kabul ettiği yazılımlar özgür olmayan (özel mülk) yazılımlardır.

We in the free software movement don’t think of the open source camp as an enemy; the enemy is proprietary (nonfree) software.


Necdet Yücel  28 Mayıs 2017


İzlem Gözükeleş: Dijitalleşme ve Kullanıcıların Mülksüzleştirilmesi

Eylül ayının üçüncü cumartesi günü yazılım özgürlüğü günü  olarak kutlanıyor. Etkinliğin amacı özgür yazılım ve yararları hakkındaki farkındalığı artırmak ve özgür yazılım kullanımını yaygınlaştırmak. Yazılımdaki özgürlüğü, hem özgür yazılım hareketinin içinden hem de dışından birçok insanın yaptığı gibi GNU/Linux işletim sistemine indirgememek gerekiyor. Yıllar önce bilgisayar denilince akla ilk gelen sadece ev kullanıcılarının kişisel bilgisayarlarıydı. Kişisel bilgisayarları, dizüstü bilgisayarlar, akıllı telefonlar ve tabletler izledi. Bu süreçte, kullanıcıların bilgisayarla yaratıcı etkileşimi, bir diğer deyişle bilgisayarı, üreticinin öngörmediği veya öngöremediği biçimlerde kullanma olanağı zayıfladı. Günümüzde ise gündelik hayatta kullandığımız nesnelerin bilgisayarlaşmasına şahit oluyoruz.

Continue Reading →

Artık “arabanız tekerlekli bir bilgisayardır; uçak kanatları olan bir bilgisayardır; saatiniz, çocuğunuzun oyuncağı, hatta kalp piliniz özünde bir bilgisayardır” (Perzanowski ve Schultz, 2016). Nesnelerin interneti bağlamında gündeme gelen akıllı cihazlar yine birer bilgisayardır. Bu nedenle bilgisayarlardaki yazılımın özgürlüğü, 27 Eylül 1983’te Richard Stallman’ın GNU (GNU is Not Unix) projesini duyurarak özgür yazılımın fitilini ateşlediği dönemden daha vazgeçilmezdir. Kişisel bilgisayarlarda kullandığımız yazılımların özgürlüğünü düşünmek GNU/Linux, LibreOffice, Mozilla gibi yazılımların başarısı dikkate alındığında artık daha anlaşılırdır. Buna karşın, araba, kalp pili, giyilebilir teknoloji ve mobil cihazlar gibi günümüz bilgisayarlarındaki yazılımların kaynak koduna sahip olunabileceğine, nasıl çalıştığının öğrenilebileceğine ve kodda değişiklikler yapılabileceğine ihtimal vermeyiz. Hatta çoğu insan bu cihazların içinde yazılım bulunduğunu bile unutmuştur. Ama aynı teslimiyet 27 Eylül 1983 için de geçerlidir ve o zaman da özgür bir işletim sisteminin olabileceğine pek ihtimal verilmemektedir.

Bilişim teknolojilerini tartışırken çoğu zaman özgür yazılımdan yardım almak zorunda kalıyorum. Bunun temel nedeni, özgür yazılımın sunduğu alternatifler, açılımlar ve çelişkileriyle birlikte bilişim teknolojilerini ekonomi politik bir yaklaşımla tartışmayı daha anlaşılır ve somut kılması. Örneğin, nesnelerin interneti ve dördüncü endüstri devrimi gibi moda ifadelerin ve bulut bilişim gibi masalların peşine takılmadan önce bu teknolojilerin içinde geliştiği toplumsal ilişkileri, kimin kazanıp kimin kaybettiğini, bu sürece nasıl müdahale edilebileceğini tartışmak gerekir ve bu tartışmada, mülkiyet ilişkileri kritik bir rol oynar. Özgür yazılımcılar, son derece basit ama temel sorularla bu tartışmaya katılmaktadır: Kullandığınız bilgisayarların sahibi miyiz? Değilsek bunu nasıl başarabiliriz? Bu sorulardan sonra, o moda teknolojilerin cilası dökülmeye başlar.

Ayrıca Geray’ın (2016) belirttiği gibi ekonomi politik yaklaşım, neo-klasik iktisatta olduğu gibi toplumsal değer yargılarını dışarıda bırakmaz: “Eşitlik, hakkaniyet, adalet, toplumun/kamunun genel çıkarı gibi değer yargıları çözümlemelere katılır” (age). Fikri mülkiyet haklarına, özellikle de patentlere yöneltilen en büyük eleştirilerden biri araştırmaların kamudan alınan vergilerle finanse edilmesi ama araştırmaların meyvelerinin şirketler tarafından toplanmasıdır. Avrupalı özgür yazılım kuruluşları sürekli bunun gibi adaletsizlikleri sorgulamaktadır. Eylül ayında başlattıkları “kamunu parası, kamunun kodu” ( adlı kampanyada da sorgulanan yine çok basit ama sürekli görmezden gelinen bir konudur: İnsanların vergileriyle geliştirilen yazılımlar neden özgür yazılım olarak kamuyla paylaşılmaz? Aynı yazılıma tekrar tekrar para ödeyen bir hükümet kamunun çıkarı yerine şirketlerin çıkarını düşünmüyor mudur?

Eleştirel olmayan bir bakış açısı gözetimi ve sansürü de teknolojik gelişmelerin kaçınılmaz sonucu olarak değerlendirir. Özgür yazılım için bunlar yeni teknolojilerin bir özelliği değil kusurudur ve hiç de kaçınılmaz değildir; özel hayatın gizliliği ve ifade özgürlüğü savunulması gereken değerlerdir. Özgür yazılım, yazılım dünyasının dışına taşmış ve Wikipedia gibi projelere ilham vermiş, neoliberalizmin piyasa toplumu dışında başka bir alternatifin olduğunu göstermiştir.

Ancak tam da bu noktada durmak gerekiyor. Özgür yazılım, kapitalizmde sadece (ve son derece ufak) bir çatlaktır. Şimdi sesleri daha az çıksa da ikibinli yılların başında müştereklerden ve ortaklaşa çalışmanın potansiyelinden, bilişim teknolojilerinin toplumsal ilişkilerde yarattığı değişimden etkilenen birçok insan kapitalizmin aşıldığını iddia edecek kadar ileri gitmiştir. Fakat özgür yazılım, başka alanlardaki benzer girişimler gibi, her zaman tehlike altındadır:

Oluşturulan her müşterek, zamanla iki gücün saldırılarına maruz kalacaktır. Birincisi, müşterekleri hiçe sayarak kendi gelirlerini maksimize etmek için açık arayan bireylerin ve şirketlerin kurnazlığı. İkincisiyse, hükümetlerin ekonomik darboğaz zamanlarında (veya piyasa ideolojisinin güdümünde) müşterekleri besleyen kaynakları kurutma, müştereklerinin etkilerini azaltarak kamuoyu desteğini baltalama eğilimi.

Özgür yazılım hareketi, başta FSF (Free Software Foundation) ve FSFE (Free Software Foundation Europe) olmak üzere, patent, DRM (Digital Restrictions Management – Sayısal Kısıtlamalar Yönetimi), bulut bilişim vb kampanyalarından da görülebileceği gibi tehlikenin farkındadır. Bin yılın başında müştereklerden, eşitlik ve özgürlükten bahsedip, sözüm ona enformasyon toplumunu selamlarken günümüzde dijitalleşmeyle gelişen mülksüzleştirmeyle karşı karşıyayız. Özgür yazılım hareketinin yıllardır sorduğu soruları şimdi daha yüksek sesle sormanın zamanı: Bilgisayarlarımızın gerçekten sahibi miyiz? Bilgisayarlarımızın gerçek sahibi olabilmemiz için ne yapmamız gerekiyor?

Bu yazıda, tüketiciler ve satın aldıkları (ya da satın aldıklarını sandıkları!) ürünler arasındaki ilişkinin nasıl değiştiğini göreceğiz. Yazının devamında, sahip olunan nesneye göre değişen farklı mülkiyet biçimleri yer alıyor. Daha sonraki bölümde dijitalleşmeyle beraber kitap, film ve müzik endüstrisindeki yaşanan değişimleri ve bu değişimleri olanaklı kılan biri hukuksal diğer teknik iki aracı, lisansları ve DRM’yi aktarıyorum. Son olarak, aynı araçlarla günümüz bilgisayarlarında uygulanan mülksüzleştirme örneklerini göreceğiz.

Gayrimenkul Mülkiyeti, Bireysel Mülkiyet ve Fikri Mülkiyet

Dijitalleşmeyle beraber fikri mülkiyet haklarının kapsamında toplumun aleyhine, şirketlerin lehine bir genişleme vardır. Ama bu genişleme aynı zamanda kullanıcıların mülksüzleştirilmesiyle beraber gelişmektedir. Bunun örneklerine geçmeden önce mülkiyetin ne olduğunu ve dijitalleşmeyle beraber nasıl bir değişim yaşandığını tartışmak gerekiyor.

Önce mülkiyetin ne olmadığıyla başlayalım. Mülkiyet insanla nesne/kaynak arasındaki bir ilişki değildir. “A, x’e sahiptir” ifadesi mülkiyet ilişkisini tanımlamak için yetersiz kalacaktır. Mülkiyet toplumsal bir ilişkidir. Çünkü A, B’ye karşı x’e sahiptir ve A x’ten yararlanmakla kalmaz kendisi dışındakilerin x ile olan ilişkisini de kontrol eder. Bir diğer deyişle mülkiyet asıl olarak A ve B arasında bir ilişkidir. Fakat bu ilişkinin gerçekleşebilmesi için A ve B’nin x üzerindeki ilişkisi hukuksal olarak tanınmalıdır. B, A’nın izin vermediği biçimde x’e eriştiğinde bunun bir yaptırımının olması gerekir. Bunun yanında, x’e sahip olan A’nın mutlak güç sahibi olduğu yanılgısına düşülmemelidir. A, keyfi biçimde hareket edemez; B’nin de hakları vardır. Ancak her iki tarafın hakları da mutlak değildir. Haklar ve denge, sosyoekonomik koşullar ve teknolojik yeniliklerle yeniden şekillenir.

A ve B arasındaki mülkiyet ilişkisi x’in ne olduğuyla ilişkili olarak farklı biçimlerde karşımıza çıkabilir. Perzanowski ve Schultz (2016), x’in durumuna göre mülkiyeti dörde ayırır: Gayrimenkul mülkiyeti, bireysel mülkiyet, fikri mülkiyet, maddi olmayan şeylerin mülkiyeti [1].

Mülkiyet denilince ilk akla gelen gayrimenkul mülkiyetidir. Gayrimenkul, fiziksel bir alanla tanımlanır. Deprem, toprak kayması veya nehir yatağının değişmesi gibi durumlar olmadığı sürece sabittir, bıraktığınız yerde kalır. x’in gayrimenkul olduğu durumlarda A’nın B’ye göre ilişkisi çeşitli biçimler alabilir. Gayrimenkul sahibi, toprağı kullanma, diğerlerini dışlama, satma, bağışlama veya ondan kâr elde etme hakkına sahiptir. A, x’e sadece ömrü boyunca sahip olabilir (miras bırakamaz) veya devre mülkte olduğu gibi x’i yılın belirli zamanlarında kullanabilir. Bu haklar açık uçludur ve tartışmaya açıktır. Örneğin belediyenin kat sınırlaması olabilir, dairenin işyeri olarak kullanımı yasaklanmış olabilir, arazi sahibi arazisini süpermarket yapmamak kaydıyla kullandırmak isteyebilir veya bir üniversite arazisindeki ağaçların zarar görmemesi şartıyla arazisinden yol geçmesine izin verebilir. Gayrimenkulün hem daha pahalı hem de kullanımı hakkındaki sınırlamaların açık uçlu olması nedeniyle herhangi bir satın almadan önce oldukça ayrıntılı bir araştırma yapılması gerekir. Normal vatandaşlar az sayıda gayrimenkul aldıklarından daha ince eleyip sık dokurlar.

Bireysel mülkiyette ise haklar daha nettir. A, x’e sahipse bununla ne yapacağı ve B’ye karşı hakları daha nettir. B, A’dan Mavi kazak satın aldığında A, B’ye “bunu turuncu pantolonun üstüne giyemezsin” diyemez. Bireysel mülkiyete konu nesneler gayrimenkule göre çok daha ucuzdur ve satın alma sonrası oluşan hakların sınırları daha belirlidir. Bir kitap, buzdolabı, kazak vb satın alan kişi bunu kendisi kullanabilir, satabilir, kiralayabilir, ödünç verebilir veya hediye edebilir. Satış sonrasında A’nın x üzerindeki hakları sona erdiğinden x’i satın alan kişi A’nın yerine geçer. Bireysel mülkiyet, gündelik hayatta o kadar sık deneyimlediğimiz bir ilişkidir ki okuyucu yukarıdaki örnekleri gereksiz olarak değerlendirecektir; başka türlüsünü düşünmek zaten mümkün değildir. Ama sorun da zaten bu açık seçik olan hakların kaybediliyor olmasıdır.

Fikri mülkiyette x, gayrimenkul ve bireysel mülkiyette olduğu gibi maddi bir varlığa sahip olmaması nedeniyle farklıdır. Gayrimenkul ve bireysel mülkiyette x maddi varlığa sahip olduğundan nesnenin ve kaynağın kullanımında kıt kaynak sorunu vardır. Gayrimenkul ve bireysel mülkiyet ilişkileri bu kıt nesne ve kaynakların kullanımını düzenler. Fikir ürünleri için kendiliğinden bir kıtlık söz konusu değildir. Fikri ürünlerinin kullanımı onları azaltmaz, tam tersine artırabilir de. Fikirlerin de bir kullanım değeri vardır; bunların artması ve yayılması arzulanır. Buna karşın, fikir ürünlerini üretenlerin bu çalışmalarının karşılığını alamazlarsa üretmeyecekleri (ya da üretemeyecekleri) savunularak asıl kıtlığın fikir ürünlerinde değil bunun üretimi için gerekli emek gücünde olduğu belirtilir. Fikir ürünlerinin bir diğer farklılığı da bir kere ifşa edildikten sonra kontrol edilmelerinin zorluğudur. Bir araziyi çitleyebilir, özel ve değerli eşyalarınızı kasaya koyabilirsiniz. Ama fikir ürünleri için böyle bir durum söz konusu değildir. Patent, telif, marka yasaları bu korumayı gerçekleştirmek için vardır. Bireysel mülkiyette A, x’i sattığında satın alan kişi A’nın yerine geçer. Fikri mülkiyette ise durum farklıdır. Bir film DVD’si satın aldığınızı varsayalım. Bu sizi filmin sahibi yapmaz; sadece filmin kaydedildiği DVD’nin sahibisinizdir. Normal şartlarda (kopyalama hakkına sahip şirket size bu yetkiyi vermemişse) bu filmi kopyalayıp dağıtamazsınız veya bir oda dolusu izleyiciye gösterim yapamazsınız. Hatta fikri mülkiyetin en saf halinde DVD’yi satın alan kişi bunu başkasına satamaz, kişisel kullanım için yedekleyemez, bir arkadaşına hediye edemez vs. Fakat fikri mülkiyet hakları, A’nın x üzerinde satış öncesinde ve sonrasında tüm haklara sahip olduğu bir ilişki değildir. A’dan x’i satın alan kişi A’nın yerine geçemese de x’i satın alan (B’) ile satın almayan (B) arasında bir fark vardır. A, x’te yayma hakkına sahiptir. Yayma hakkı, “bir eserin aslını veya çoğaltılmış nüshalarını, kiralamak, ödünç vermek, satışa çıkarmak veya diğer yollarla dağıtmak hakkı”dır. Yasa, x’in DVD’sini satın alan B’nin yeniden satış hakkı için şunları söylemektedir:”kiralama ve kamuya ödünç verme yetkisi eser sahibinde kalmak kaydıyla, belirli nüshaların hak sahibinin yayma hakkını kullanması sonucu mülkiyeti devredilerek ülke sınırları içinde ilk satışı veya dağıtımı yapıldıktan sonra bunların yeniden satışı eser sahibine tanınan yayma hakkını ihlal etmez” (Aksu, 2016). Bu durum, “tükenme ilkesi” olarak adlandırılır. Yasa, tükenme ilkesini tanıdığı için satın aldığımız DVD veya kitap bireysel mülkiyete göre değerlendirilebilir.

Kısacası, bir fikir ve sanat ürünündeki telif hakkı ile onun kopyasının mülkiyeti hakkında bir ayrım vardır. İnternet öncesi dönemde de radyo ve televizyon yayınları da telif haklarını etkilemiştir ama yine de asıl gelir kaynağı fiziksel kopyalar olmuştur. Reklam ve kablo aboneliği bile kopyaların önemini azaltmamıştır. “Tükenme ilkesi” ikinci el pazarını ortaya çıkarmış, ikinci el ürünler birinci el ürünlere rakip olmuş ve bu da tüketicinin lehine olmuştur. Tükenme ilkesi, kopyalama hakkına sahip şirketler için satacakları kopya sayısını azalttığı için istenmeyen bir durumdur. Dijitalleşme ile beraber eski kopya biçimlerinin yavaş yavaş ortadan kalkması yeni bir döneme kapı aralamıştır. Dijitalleşmeyle mülkiyet ilişkilerinde yaşanan dönüşüme geçmeden önce kopyalama hakkına sahip şirketlerin tükenme ilkesine düşmanlıklarının tarihte ilginç örneklerinin olduğunu belirtmek isterim. Günümüzde bazı okullar ve kurumlar, kütüphane kullanımını teşvik etmek için kütüphaneden en çok yararlananların isimlerini duyururlar. Vaktini kütüphanede geçirenlere saygı duyarız. Fakat kopyalama hakkı sahibi şirketlerin en büyük düşmanlarından biri kütüphaneler ve buralardan yararlananlardır. İnsanların yeni kitap almak yerine kütüphaneden kitap ödünç almalarını kendi işlerinin baltalanması olarak değerlendirirler. Bunun en çarpıcı örneklerinden biri 1931’de bir grup yayıncının “kitap ödünç verme” sorununu çözmesi için halkla ilişkilerin öncülerinden olan Edward Bernay’i tutmasıdır. Bernay, kitap ödünç alanları aşağılayan bir lakap bulma kampanyası düzenler. Yarışmayı booksneak kazanır (Önerilen diğer lakaplar book weevil, greader, libracide, booklooter, bookbum, culture vulture, bookbummer, bookaneer, biblioacquisiac ve book buzzard.)

iTunes Music Store, Bulut Bilişim ve Dijital Abonelik

Son 15 yılda içeriğe erişim biçimimizde önemli değişiklikler yaşanmıştır. İkibinli yıllara kadar kitap, müzik ve filmler elimizde tuttuğumuz, kitaplığımızda sakladığımız ve birbirimize hediye ettiğimiz fiziksel nesnelerdir ve tüketiciler, tükenme ilkesinin tanıdığı hakla hareket etmektedir. Bu bağlamda, 2003 yılında Apple’ın iTunes Music Store’ı ve yeni iş modelini duyurması bu hakka

önemli bir darbedir. İnternetten müzik eserlerini ücretsiz indirmenin oldukça yaygın olduğu bir dönemde Steve Jobs, insanların hala müzik eserleri için ödeme yapmaya gönüllü oldukları, ama birkaç hit parça için tüm albümü satın almak istemedikleri tespitini yapmaktadır. Jobs’a göre sorun insanların korsan müziğe kaymasını engelleyebilecek bir alternatifin olmamasıdır. Jobs, Müzik şirketleri ve internet kullanıcılarını ‘adil’ bir iş modelinde bir araya getirir. Jobs’a göre herkes kazanacaktır (İTunes_Store):

Müzik çalan insanların % 80’inin bunu istemediğine inanıyoruz, sadece yasal bir alternatif yok. Bu yüzden, ‘buna yasal bir alternatif yaratalım’ dedik. Herkes kazanır. Müzik şirketleri kazanır. Sanatçılar kazanır. Apple kazanır. Kullanıcı kazanır, çünkü daha iyi bir hizmet alır ve bir hırsız olmak zorunda değildir.

iTunes Music Store’a yalnızca Apple cihazlarından erişilebilmekte ve şarkılar başlangıçta DRM (Sayısal Kısıtlamalar Yönetimi) ile korunmaktadır. Kullanıcılar albümün tamamını satın almadan (çoğunlukla 99 sente) tek bir müzik eserini satın alabilmektedir. Apple’ın yeni iş modeli, kendi beklentilerinin de ötesinde büyük ilgi toplar. Jobs’ın öngörüsü doğru çıkmış ve insanlar korsan müziktense dinlediği eser için para ödemeyi tercih etmiştir. Apple’ın öncülüğünü yaptığı bu iş modeli hızla yaygınlaşır. Ancak diğer yandan bireysel mülkiyet için bir dönüm noktasıdır. Artık elinizde arkadaşınıza ödünç verebileceğiniz bir DVD yoktur. Ayrıca tüketiciler DRM’li müziklerini ancak ve ancak bir Apple bilgisayarı kullandıkları sürece çalabileceklerdir. O an için ufak bir ayrıntıdır. Apple kullanıcıları bu ayrıcalıklarının keyfini sürerken DRM ile telif haklarının içerdiği bir hak ortadan kalkmaktadır (Perzanowski ve Schultz, 2016).

Dijital ürünlerde tükenme ilkesi nasıl uygulanacaktır? Fiziksel bir ürünü arkadaşınıza ödünç verdiğinizde sizde bir kopyası bulunmaz. Ama bir müzik dosyasını arkadaşınıza farklı yollarla (taşınabilir bellek, e-posta, Dropbox’a koymak vb yollarla) dosyayı kopyalayarak iletebilirsiniz. Ama her hâlükârda dosyanın telif haklarındaki tükenme ilkesine aykırı hareket etmiş olursunuz. Telif yasaları bu yeni duruma ayak uyduramadan bulut bilişimle [2] ikinci bir dönüşüm yaşanır. 160 GB diske sahip bir iPod alıp tüm müzik koleksiyonunuzu buraya aktarmanız mümkündür. Fakat bir süre sonra iPod yerini akıllı telefon, tablet ve çok amaçlı diğer mobil cihazlara bırakır. Bu cihazlarda üreticiler, yer, ağırlık ve pil ömründen tasarruf edebilmek için yüksek saklama kapasiteli ve ucuz diskler yerine daha düşük saklama kapasiteli ve yüksek fiyatlı disklere yönelmişlerdir. Bulut bilişim, depolama kapasitesi sorununu giderek yaygınlaşan yüksek hızlı mobil veri ağlardan yararlanarak çözecektir. Artık tüm dijital dosyalarımızı bulutta saklayabileceğimiz ve cihazlarımız arasında senkronize edebileceğimiz söylenmektedir (age).

iTunes Music Store’dan satın alınan bir dosya tüketicinin bilgisayarında saklanmaktadır. Elde bir kaset veya DVD yoktur, ama (kimi zaman DRM’li de olsa) bir dosya bilgisayarınızda tutulmaktadır. Bulut iş modelleri ise bunu bir adım daha öteye götürebilmenin yolunu açmıştır. Bilgisayarınızda dosya saklamanın şart olmadığı, bir film izleyeceğiniz veya müzik dinleyeceğiniz zaman buluta erişerek bunu yapabileceğiniz anlatılmaktadır. Bilgisayarınıza indirmeden kullanmayı tercih ettiğinizde dijital dosyaya gerçekten sahip olma şansınız da ortadan kalkmaktadır. Bulut sağlayıcısı şirket, çeşitli gerekçelerle dijital dosyaya erişimizi engelleyebilir veya dosyayı silebilir. Nitekim Apple Medya Hizmetleri Hüküm ve Koşulları’nda bu hak açıkça belirtilmektedir (

“Apple size bildirimde bulunarak ya da bulunmaksızın ve dilediği zamanda Hizmetleri (ya da bunların herhangi bir parçasını ya da İçeriğini) değiştirme, geçici olarak durdurma ya da sona erdirme hakkını saklı tutar ve Apple söz konusu haklarını gerçekleştirdiğinde size ya da üçüncü taraflara karşı sorumlu olmayacaktır.” Amazon Kindle kullanıcılarının da deneyimlediği gibi sanal kitap rafınızda duran bir kitap aniden silinebilir. Bunun dışında teknik sorunlar nedeniyle dosyalara erişim olanağınızın geçici veya kalıcı olarak ortadan kalktığı durumlar da olabilmektedir. Eskiden bir kitap yıllarca saklanıp kuşaktan kuşağa aktarılabilirken şimdi kitabın raf ömrü en iyi ihtimalle şirketin ömrü kadardır. Perzanowski ve Schultz (2016), Amazon ve Apple’sız bir dünya hayal edemeyenlere Lehman Brothers, Enron ve Woolworth’ın akıbetini hatırlatmaktadır.

Telif hakları ve tükenme hakkı açısından değerlendirdiğimizde yine belirsiz bir durum vardır. Buluttaki dosyaların tekrar satışı veya ödünç verilmesi belirsizdir. Bazı durumlarda dosya bulut üzerinden kullanılabilmekte bazen de dosyanın bir kopyasının bilgisayara indirilmesi gerekmektedir. Perzanowski ve Schultz’a (2016) göre bulut farklı biçimlerde yorumlanabilir. Birincisi bulutu evinizdeki bir film makarası gibi değerlendirebilirsiniz. Salonunuzda, televizyonun sizin, ama film makarasının film şirketinin olduğu bir düzenek vardır. Filmi izlemek veya bir şarkıyı dinlemek için bir ödeme yaparsınız, ama filme sahip olamazsınız. İkincisi bulut, raflarında kitapların olduğu bir kütüphanedir ve siz kitaplardan birini ödünç alırsınız. Üçüncüsü bulut, bankada kiralık bir kasa gibidir. Şu anda yanınızda olmasa da kasanın içindekiler sizindir ve istediğiniz zaman kasadan evinize getirebilirsiniz. Her üç durum da telif hakları açısından yeni soru(n)lar yaratmaktadır. Fakat ilk iki durum abonelik üzerine kurulu yeni bir iş modeli olarak karşımıza çıkacak ve kullanıcının mülksüzleştirilmesinde üçüncü aşamaya gelinecektir.

Bulutta sakladığınız dosyaların gerçekten sahibi olamazsınız. Bazı durumlarda bu dosyaları bilgisayarınıza da kaydedebilirsiniz. Şirketler indirilen dosyaları, kullanıcı cihazlarını kontrol edebildikleri taktirde DRM ile denetleyebilmektedir. Ama bulutun asıl önemi tüketicilere akıtmalı servisleri (streaming service) tanıtarak, onları abonelik sistemlerine hazırlamak olmuştur.

Klasik abonelikte bir dergiye 2017 yılı için abone olduğunuzda 2018 yılında aboneliğinizi yenilemeseniz de 2017 yılına ait sayılar elinizdedir ve kimse bu hakkınızı elinizden alamaz. Akıtmalı abonelik servislerinde ise aboneliğinizi yenilemediğinizde haklarınızı kaybedersiniz. Buna rağmen, tüketicilere sunduğu avantajlar nedeniyle bu dezavantajlar atlanmaktadır. Abonelik servisleri satın almayla karşılaştırıldığında daha makul bir ücret talep etmekte ve çok sayıda içerik arasından seçim yapabilme olanağı sunmaktadır. Şirketler için oldukça kârlı bir iş modelidir. Farklı müşterilere farklı fiyatlandırma yapabilmektedirler. Yeni iş modelinin önceki dönemlerden en büyük farkı da şirketlerin servisi kullananlar hakkında çok ayrıntılı bilgiye sahip olmalarıdır. Bu da şirketlerin daha hedefli reklamlar yapabilmelerini sağlamaktadır. Akıtmalı servisin kopyalanması ve çoğaltılması olanaksız olmasa da daha zordur. Servis aboneliği kitap ve DVD almayla kıyaslandığında çok daha ucuz görünmektedir. Ama elde satılabilecek bir kopyanın bulunamaması birinci el satışlara rakip olabilecek ikinci el piyasasını da yok etmektedir.

Mülkiyet ilişkilerindeki bu değişim iki önemli araçla gerçekleştirilmiştir: Lisanslar ve DRM.

Okunmayan ve Anlaşılamayan Lisanslar

Perzanowski ve Schultz (2016) lisansların nasıl bir dünya yarattığını göstermek amacıyla almak istediğimiz 100 dolarlık bir şapkanın üzerinde aşağıdaki uyarıyı gördüğümüzde ne yapacağımızı hayal etmemizi ister:


Bu mesajı nasıl yorumlayabiliriz? Birincisi, şapka sahibi, şapkaya 100 dolar vermemize rağmen onun sahibi olmadığımızı vurgulamak istemiş olabilir. Onu sadece elimizde bulundurma ve kullanma hakkına sahibiz. İkinci yorum, mülkiyet yasalarının bize tanıdığı hakla onu satabileceğimiz ama bu satışın üreticiye ispatlanabilir bir zararı olduğunda üreticinin zararını karşılamak zorunda olduğumuzdur. Üçüncüsü, uyarının yasal bir belge niteliğine sahip olmadığıdır. Amaç sadece bazı alıcıların gözünü korkutarak şapkayı ödünç vermelerini veya satmalarını engellemektir. Ama yasal olarak hiçbir zorlayıcılığı yoktur.

Bu yorumlardan herhangi biri doğru olabilir. Satış görevlisinden daha ayrıntılı bir açıklama isteyebilir veya böyle alengirli bir alışverişe hiç girmek istemeyebiliriz. Lisans, kişi ve kuruluşlara normal şartlarda sahip olunmayan bir hakkı verir. Örneğin sürücü lisansı, bize trafik araçlarını kullanma hakkı verir. Ama dijital ürünleri kullanırken “Kabul Ediyorum” deyip geçtiğimiz birçok lisans tüketiciye bir hak tanımlamaz, yasalarca verilmiş bir hakkı keyfi olarak sınırlar. Örneğin, özgür yazılım projelerinde kullanılan GPL’de (General Public License – Genel Kamu Lisansı), yazılım sahibi bazı şartlar öne sürerek telif haklarının kendisine tanıdığı hakları kullanıcıya verdiğini belirtir. Özel mülkiyetli yazılımlarda ise lisans, telif haklarının tanımladığı bazı hakların geri alınması için vardır.

Lisanslar çoğunlukla okunmaz; 99 sentlik bir şarkı için iTunes’un Macbeth’ten uzun kullanım şartlarını okumak pek akıllıca değildir. PayPal’inki ise Hamlet’ten de fazladır. Bu lisansların uzunlukları bir yana anlaşılmaları da zordur. Çünkü şirketin yasal haklarını tanımlayan lisanslar sıradan insanların anlaması için yazılmış basit metinler değildir. Çoğu zaman karşımıza uzunca ve anlaşılmaz bir metin çıkar; ya lisansı kabul edip yolumuza devam ederiz ya da reddedip işlemden vazgeçeriz. Başka seçeneğimiz yoktur. Lisansların uzunluğu ve karmaşıklığı dikkate alındığında bunu okuyup anlamanın da bir maliyeti olacağından kabul ettiğimizi belirtip geçeriz. Casus yazılımlara karşı yazılım üreten PC Pitstop adlı şirket EULA’sındaki (End User License Agreement – Son Kullanıcı Lisans Sözleşmesi) bir cümlenin farkına varan ve kendisine e-postayla bunu bildirecek ilk kullanıcıya 1000 dolarlık bir ödül vereceğini yazar. Beklenen e-posta ancak dört ay sonra, yazılım 3000’den fazla indirildikten sonra gelir!

Lisanslamanın öncüsü IBM’dir. Telif hakkı ve patentlerin henüz zayıf olduğu bir dönemde bu yolu tercih etmesi anlaşılır bir durumdur. Fakat lisanslama yazılımı belirsizlik ve ihlallere karşı korumaktan çok yazılımın sonraki kullanımlarını kontrol edebilmek ve rekabeti azaltmak için kullanılmaktadır. Kitap, film ve müzik endüstrisi de yıllardır bunu arzulamış ama başarılı olamamıştır. Şimdi şirketler dijital kitapların ödünç verilme sayısını kısıtlayarak kütüphanelerden adeta intikam almaktadır. Örneğin bu sınır yirmiyse yirminci ödünç verme işleminden sonra kütüphanenin aynı kitaba tekrar ödeme yapması gerekmektedir. Böylece kütüphanelerin, bilgi birikimini gelecek kuşaklara aktarabilme misyonu da yok edilmektedir. Artık herhangi bir kitap sansür veya ekonomik gerekçelerle kütüphanelerden silinebilir, o kitap hiç yayınlanmamış gibi davranılabilir. Daha da kötüsü bu tip lisanslar dijital kitap, film ve müzikle sınırlı değildir; son yıllarda evlerde kullanılan cihazlarda, tüketici elektroniğinde, tarım makinelerinde, kısaca bilgisayar içeren ya da bilgisayarlaşan her alanda karşımıza çıkmaktadır.

Perzanowski ve Schultz (2016) lisansların taraflar arasında yapılan bir sözleşme veya mülkiyet ilişkileri çerçevesinde değerlendirilebileceğini belirtmektedir. Mahkemeler, hemen onaylayıp geçtiğimiz lisansları sözleşme olarak değerlendirmeye meyillidir. Fakat insanlar neyi imzaladıklarını bilebildiklerinde sözleşmenin bir anlamı vardır. Lisanslar, iki tarafın özgür iradesiyle imzalanan sözleşmeler değildir. Kopyalama hakkı sahibinin dayattığı kısıtlamalardır. Lisansları, mülkiyet ilişkileri çerçevesinde değerlendirdiğimizde, lisansların GPL’de olduğu gibi önceden tanımlanmış mülkiyet haklarına dayanması gerektiği ortaya çıkar. Geçerli bir lisansın ortaya konabilmesi için kimin neye sahip olduğuna önceden karar verilmesi gerekir.

Kopyalama hakkı sahibi, ürünü kendine saklayabilir, kiralayabilir veya satabilir. Eğer bir servis, abonelik olarak ilan edilmişse yapacak bir şey yoktur. Fakat reklamlar çoğu zaman aboneliği bir satış gibi göstermekte, kimin neye sahip olduğu belirsiz bırakılmakta, lisanstaki satır aralarında alıcının haklarını kısıtlamaktadır. Yapılan araştırmalar alıcının dijital bir ürünü gerçekten satın almadığını fark ettiğinde başka türlü davranmaya eğilimli olduğunu göstermektedir (age).

DRM (Sayısal Kısıtlamalar Yönetimi)

DRM, dijital içeriğin satış sonrasında da kullanımını kısıtlamayı ya da kontrol etmeyi hedefleyen teknolojilerin genel adıdır. Garip bir güvenlik aracıdır. Evinizdeki kilit, değerli eşyalarınızı dışarıdakilerden korur. DRM ise içeridekilere karşı bir korumadır. Çünkü kullandığınız şeyin gerçekten sizin olmadığı iddiasını taşır.

Dijitalleşme öncesinde ortaya çıkan VCR (videocassette recorder – video kaydedici) teknolojisi tüketiciyi güçlendiren, kopyalama hakkı sahibi şirketlerin tüketici üzerindeki baskısını zayıflatan bir gelişmedir. Bu nedenle Universal, Sony’yi korsan kullanıma yol açmakla suçlamıştır. Sony ise geliştirdiği teknolojinin korsanlık için kullanılabileceği gibi meşru amaçlar için de kullanılabileceğini savunur. Mahkeme, Sony’nin savunmasını haklı bulur ve stüdyoların VCR teknolojisini kontrol altına alma talebini geri çevirir. Bu karar, yalnız Sony için değil, tüketiciler için de önemlidir. Çünkü VCR’de yapılmak istenen tüketicilerin evlerinde gözetlenmesidir.

Hollywood, VCR olayından dersini almıştır. DVD teknolojisinin geliştirilmesine en başından müdahil olur ve CSS koduyla izinsiz kopyalamanın önüne geçmeyi dener. Cihazlarımızın izinsiz film oynatımlara karşı kontrol altına alınması için büyük çaba gösterir. Ama her DRM, er ya da geç, kırılmaya mahkumdur. DRM’li bir sistemi kırmak zordur; bunu ancak en ileri düzeydeki kullanıcılar başarabilecektir. Ama bir hacker DRM’nin açıklarını keşfettiğinde bu bilgi hızla yayılmaktadır ve kırma işlemini kolaylaştıran araçlar teknik bilgisi daha az olan kullanıcılara da ulaşmaktadır. Bu nedenle DRM tek başına yeterli olmayacak, hem hackerların hem de onların açtığı gedikten ilerleyen diğer tüketicilerin durdurulabilmesi için yasalarla kontrol altına alınmaları, tersine mühendisliğin yasadışı ilan edilmesi gerekecektir.

DRM tüketicilerin güvenliğini de tehlikeye atmaktadır. VCR tartışmasında iyi adam olan Sony, bu sefer kötü adamdır. CD’lerinin kopyalanmasını engellemek için kullanıcıların bilgisayarına, onların haberi olmadan bir rootkit yazılımı kurmayı dener. Sony, rootkit yazılımıyla kullanıcıların CD kopyalamasını engelleyebileceğini düşünmektedir. İzinsiz kurduğu rootkit, başında $sys$ ile başlayan her dosya ve süreci bilgisayar kullanıcılarından gizlemektedir. Sony kendi mülkiyet hakkını korumak için açtığı arka kapıyla büyük bir güvenlik açığına neden olur; herhangi bir saldırganın aynı açığı kullanmasının önünde bir engel yoktur. Bu fark edildiğinde ise yaptığını “insanlar rootkit’in ne olduğunu bile bilmiyor, neden buna takılsınlar ki?” diyerek örtbas etmek ister. Fakat tepkiler dinmeyince CD’lerini geri çağırmak zorunda kalmıştır. Sony, DRM’ye başvuran birçok şirketin yaptığı gibi, insanlardan kendi mülkiyet haklarına saygı göstermesini isterken izinsiz olarak onların bilgisayarına girmiş, güvenliklerini tehlikeye atmış ve mahremiyetlerine zarar vermiştir (age).

Lisanslar, DRM ve Gündelik Hayati [3]

Edison’un İki Davası

ABD’de fikri mülkiyet haklarının gelişimi üzerine bir film çekilse filmin baş kötülerinden biri sanırım Thomas Edison olurdu. Edison defalarca yasal boşluklardan yararlanmaya çalışarak her fırsatta rakiplerini saf dışı bırakmak istemiştir. Bazen bunda başarılı olmuş bazen de mahkemeler Edison’un hırslarına geçit vermemiştir. Edison’un en ilginç ve öğretici davalarından ikisi tükenme ilkesi üzerinedir. Doğru akımı destekleyen Edison ile Nikola Tesla’nın alternatif akımına yatırım yapan milyoner George Westinghouse arasında bir mücadele vardır. Edison, alternatif akımın tehlikelerini öne çıkararak doğru akımı teşvik etmek istemektedir. Alternatif akımın elektrikli sandalyede kullanılacağını öğrenmesi ile alternatif akımın tehlikesini anlatmak için eşsiz bir fırsat yakalamıştır: Alternatif akım, öldüren teknoloji!

Westinghouse, patentlerinin elektrikli sandalyede kullanılmasına izin vermez. Fakat Edison’un adamları, alternatif akımın kullanıldığı dinamoların satışından sonra patent sahibinin hakkının tükendiğini, satın alınan bireysel mülkiyetindeki dinamoların kullanımına karışamayacağını savunur ve tarihteki ilk üç elektrikli sandalye Westinghouse’un patentleriyle yapılır. Böylece Edison alternatif akımın insanları öldürdüğünü söylemeye devam eder.

Edison ikinci macerasında ise tükenme ilkesinin karşısında yer almaktadır. Edison’un film projektörü yaygın olarak kullanılmaktadır. Projektör piyasasının doymasından sonra Edison patenti yine kendisine ait olan film makaralarının satışının daha kazançlı olacağını fark eder. Projektöre, kendi film makaraları dışında bir makara kullanamayacağını yazar. Edison’un film makaralarındaki patenti biter bitmez tüketiciler kendi makaralarını yapar. Edison bunun üzerine projektördeki uyarıyı göstererek sadece kendisinin uygun gördüğü (kendi) makaraların kullanılabileceğini iddia eder. Mahkeme, yine tükenme ilkesine göre Edison’un itirazını reddeder ve tarihe de bir not düşer: Patent yasasının amacı bilimin ve yararlı zanaatin ilerlemesini desteklemektedir; patent sahiplerine özel servet sağlamak değil.

Fikri Mülkiyet, Bireysel Mülkiyete Karşı

Şirketler hiçbir zaman pes etmezler. Ama mahkemeler, Edison’dan sonra da uzunca bir süre bireysel mülkiyet lehine benzer kararlar vermeye devam ederler. Özellikle elektronik şirketleri DRM’i her fırsatta kullanmaya çalışmaktadır. Temel stratejileri, Edison’un film makarasındakiyle aynıdır: Bir ürünü sattıktan sonra, tüketicilerin onunla ilgili olabilecek parçalar için de kendilerine gelmelerini sağlamak.

Bu stratejiye başvuran şirketlerden biri de garaj kapısı açacağı üreten Chamberlain’dir. Uzaktan kumandasını kaybeden veya birden fazla arabası olan tüketiciler ek uzaktan kumandayı Chamberlain’den satın almak zorundadır. Skylink ise asıl üretici firmalardan çok daha ucuza yedek uzaktan kumanda satan bir şirkettir. Chamberlain, uzaktan kumandalarının yalnızca kendisinden satın alınmasını sağlamak için, kapı açılmadan önce kumandanın kapıya bir kod göndermesini sağlayan bir DRM tasarlar. Skylink bu kodu çözerek, Chamberlain için uzaktan kumanda üretmeye devam eder. 2002 yılında Chamberlain, fikri mülkiyet hakkının ihlal edildiği gerekçesiyle mahkemeye gider. Mahkeme, tüketicinin Chamberlain’den bir garaj kapısı açacağı satın aldığını ve bunun tüm kullanım haklarına sahip olduğununu belirterek Chamberlain’in başvurusunu reddeder.

Yazıcı kullanıcılarının en büyük sorunlarından biri kartuş bittiğinde doldurulan kartuşların çok pahalı olması ve doldurulduğunda tam verim alınamamasıdır. Kartuş satışı, yazıcı satıcıları için önemli bir gelir kaynağıdır. SCC (Static Control Components, Inc) adlı şirket, Lexmark’a uygun, daha ucuz kartuşlar ürettiğinde Lexmark, DRM’e başvurarak yazıcılarının Lexmark dışındaki kartuşlarla çalışmasını engeller. Lexmark, Edison’un bir zamanlar projektör üzerindeki bir uyarıyla yapmak istediğini teknik olarak gerçekleştirmiştir. Buna karşı SCC, ters mühendislikle DRM’i atlatmayı başarır ve Lexmark yazıcılarla uyumlu kartuşlar satmaya devam eder. DRM’sinin kırılması üzerine Lexmark mahkemeye gider. Mahkeme 2004 yılındaki kararında davayı fikri mülkiyet değil bireysel mülkiyet kapsamında değerlendirir ve “bir Lexmark yazıcı alan tüketici içindeki yazılımla beraber yazıcının kullanım hakkına sahiptir” der.

Bizim Olmayan Nesnelerin İnterneti

Mahkemelerin bireysel mülkiyetten yana olan bu kararlarına rağmen tüketicinin satış sonrasında kısıtlanmasında büyük artış vardır. Dijital kitap, müzik ve filmdeki lisans ve DRM stratejisi, günümüzün bilgisayarlaşan nesnelerine uyarlandığında daha büyük bir tehlike ortaya çıkmaktadır. Etrafımızı bizim olmayan nesnelerin interneti ile sarılmaktadır. Son birkaç yıldaki örnekler önemli dersler içermektedir.

Revolv adlı dağıtım kutusu (hub) çeşitli uygulama ve ev otomasyon sistemlerini kontrol etmek amacıyla geliştirilmiş bir cihazdır. Bir internet bağlantısıyla, evin güvenlik sistemleri, garaj kapıları ve eğlence sistemlerini kontrol edilebilmektedir. Cihazlar 300 dolara, güncellemeler ve yeni özellikler için ömür boyu abonelik vaadiyle satılmaktadır. Revolv Hub’ı üreten şirket 2014 yılında Google’ın nesnelerin interneti şirketi, Nest tarafından satın alınır. Nest, 2016 yılının nisan ayında Revolv’u artık desteklemeyeceğini ve yazılımla çalışan uzaktan kumandalarını çalışamaz hale getireceklerini duyurur. 15 Mayıs’taki yazılım güncellemesiyle Revolv uygulaması artık açılmamakta ve dağıtım kutusu çalışmamaktadır ( Şirketler iflas edebilir veya belirli bir sektörden çekilebilir. Bunun satın aldığınız ürünü etkilememesi gerekir. Ama dijital nesnelerde yazılıma sahip olunmadığında satın aldıklarınız da şirketle beraber batıp gider. Lisanslar iki taraflı sözleşmeler olsaydı Google böyle bir karar veremeyecekti. Perzanowski ve Schultz (2016) ileride Google’dan araba satın alırken tekrar düşünmemizi öneriyor!

Ama Google’a da haksızlık etmemek gerekir, bu stratejisinde yalnız değildir. Meşhur traktör üreticisi John Deere’ın yeni traktörleri, motorun çalışmasından kol dayama yerine kadar traktörün çeşitli fonksiyonlarını kontrol edebilen en az sekiz yazılım ve donanım bileşeni içermektedir. Geçmişte, traktörlerin tamamen mekanik olduğu zamanlarda çiftçiler ihtiyaç halinde bakım, parça değiştirme ve tamir işlerini kısmen veya tamamen kendileri de yapabilmekteydi. Şimdi ise traktörleriyle aralarında bir yazılım katmanı vardır ve daha önce kendilerinin veya yakınlarındaki tamircilerin yaptığı işlemler için John Deere’nin yetkilendirildiği servislere gitmeleri gerekmektedir. Yüksek soğutma suyu sıcaklığından düzgün çalışmayan frene veya basit bir koltuk arızasına kadar Deere’e başvurmak ve yüksek paralar ödemek zorunda bırakılırlar. Çiftçiler bunun üzerine Telif Hakları Bürosu’na başvurarak kendi traktörlerini onarma, iyileştirme ve değiştirme hakkı talep ederler. John Deere, sorun ne kadar basit olursa olsun çiftçilerin dijital kaputu açmaya haklarının olmadığını, lisans sözleşmesi gereği sadece traktöre fiziksel olarak sahibi olduklarını ama yazılıma herhangi bir biçimde müdahale etme haklarının olmadığı yanıtını verir. John Deere böylece hem traktörlerinin fiyatını efektif olarak yükseltmiş olmakta hem de tamir sektörüne yaşama alanı vermemektedir ( Perzanowski ve Schultz (2016), benzer sorunun nesnelerin internetine de içsel olduğunu belirtmektedir. Birçok durumda nesneleri dijitalleştiren yazılım ve nesneyi satın aldığımızda bu yazılıma da sahip olup olmadığımız sıklıkla ihmal edilen bir konudur.

Ferrari, Ford, General Motors ve Mercedes-Benz gibi ünlü otomobil üreticileri de John Deere’le aynı çizgidedir. Aracın sahipliğiyle yazılımın sahipliğinin karıştırılmaması gerektiği, şirketin yazılımın tek sahibi olduğu öne sürmektedirler. Ayrıca lisanslarında otomobildeki yazılımlara (uzaktan erişim de dahil) her türlü müdahale hakkına sahip oldukları da belirtilmektedir. Aracınızdaki yazılımlar güncellenebilir veya araçtaki dijital veri rızanıza gerek kalmadan silinebilir. Daha da kötüsü aracınız hiçbir mekanik arızası olmadığı halde çalışmayabilir. Kızını doktora yetiştirmeye çalışan Mary Bolender’in başına geldiği gibi araba taksitini üç gün geciktirdiğinizde aracınızın çalışması, ona en ihtiyaç duyduğunuz anda içindeki yazılımla engellenecektir (

Bu örneklerden de görülebileceği gibi nesnelerin internetinde çalışan yazılıma sahip olmadığımızda çoğu insanın korktuğu yapay zekalı robotların saldırısından daha tehlikeli bir durumla karşı karşıya kalırız. Etrafımız bizim olmayan nesnelerle sarıldığında şirketler ilişkilerimizin kontrolünü de ele geçirmektedir. Nesnelerin internetini anlatmak için sık sık başvurulan akıllı buzdolabımız geleceğimize sahip çıkamazsak ne yiyeceğimiz konusunda da belirleyici olacak. Bu gücün, bizi daha sağlıklı beslenmeye yöneltmek amacıyla kullanılmayacağını tahmin etmek güç olmasa gerek…


Dana Lewis ve kocasının yaptıkları, kullanıcılar ellerindeki nesnelerin gerçekten sahibi olduğunda neler yapılabileceğini göstermektedir. Lewis, Seattle’da glikoz monitörüne bağlı yaşayan bir şeker hastasıdır. Elinde taşıdığı kablosuz cihaz Lewis’in kan şekeri çok düştüğünde ya da yükseldiğinde uyarmaktadır. Lewis, uyarı sesini duyamadığından eşiyle beraber programı değiştirerek daha yüksek sesle uyarı vermesini ve sonrasında da bu bilginin diğer mobil cihazlara ulaştırılmasını sağlarlar. Bundan sonra Lewis’in insulin rejimine yoğunlaşırlar. Normal şartlarda hastalar insulin düzeylerini elle düzenlemektedir. Ellerindeki verileri analiz ederek geliştirdikleri algoritmayla insulin düzeyinin ayarlanmasını otomatize etmeyi başarırlar. Ayrıca Lewis’in 30, 60 ve hatta 90 dakika sonraki insulin ihtiyacı tahmin edilebilmektedir. Hatta şimdilerde bu süreci tamamen otomatize etmek için yapay bir pankreas geliştirmeyi de düşünmekteler. Kullanıcılar nesnelerin gerçekten sahibi olduklarında yapabileceklerinin sınırı yoktur: nesneleri istedikleri gibi değiştirebilir, ihtiyaçlarına uyarlayabilir ve yenilikçi çözümler geliştirebilirler.


Son yıllarda ücretlerdeki düşüş ve işsizlik insanları farklı seçeneklere yöneltiyor. Perzanowski ve Schultz’un (2016) belirttiği gibi insanlar alım güçleri düştüğü için Uber gibi alternatifler cazip geliyor. Netflix ve Spotify için de durumun pek farklı olmadığını söylüyor. Dolayısıyla, “müzik eserlerine sahip olmak her zaman iyidir, abonelik her zaman kötüdür” diyerek kestirip atamayız. Ama tüketicilerin, yaptıkları işlemler hakkında bilgilendirilmesi, kabul ettiği sözleşmenin (reklamlarda Buy! yazmasına rağmen) bir abonelik sözleşmesi olduğunu bilmesi lazım. Ayrıca, insanların birbirleriyle paylaşabileceği bireysel mülkiyetinin olmaması kültürel yapıda önemli değişimlere neden olabilir.

En önemlisi de “dijital bir nesne satın aldığınızda, neyi satın olmuş oluyoruz?” sorusunun net olarak yanıtlanması gerekiyor. Lambalarımız, termostatımız, fırınımız, kahve makinemiz, buzdolabımız elimizden uçup gidiyor. Bizim olmayan nesnelerin internetinde ve dijitalleşen nesnelerde şirketlerin temel tezi nesneyi sattıkları, ama yazılımı satmadıkları.

O zaman yazılımı ve onun ürettiği veriyi de talep etmek gerekiyor…


[1] İlk üçü arasındaki ayrım dijitalleşmeyle yaşanan değişimin anlaşılabilmesi için önemlidir. Dördüncüsü, güvenlik, taksi plakası ve hükümet tarafından tanınan bir işi yapabilme lisanslarında olduğu gibi fiziksel bir varlığı olmayan, ama fikri mülkiyet kapsamına alınamayacak alanları kapsamaktadır.

[2] Bulut bilişim, TSE’nin tanımına göre “işlemci gücü ve depolama alanı gibi bilişim kaynaklarının ihtiyaç duyulan anda, ihtiyaç duyulduğu kadar kullanılması esasına dayanan, uygulamalar ile altyapının birbirinden bağımsız olduğu ve veriye izin verilen her yerden kontrollü erişimin mümkün olduğu, gerektiğinde kapasitenin hızlı bir şekilde arttırılıp azaltılabildiği, kaynakların kullanımının kolaylıkla kontrol altında tutulabildiği ve raporlanabildiği bir bilişim türüdür.”

[3] Buradaki örnekler, Perzanowski ve Schultz’dan (2016) alınmıştır.


Aksu, M. (2016). İnternet Üzeri̇nden Yayılan Eserlerde Tükenme İlkesi̇? (Di̇ji̇tal Tükenme İlkesi̇?). Ticaret ve Fikri Mülkiyet Hukuku Dergisi, 2(1).

Geray, H. İletişim, İktisat ve Kamusal Düzenleme Üzerine, İletişim Ağlarının Ekonomisi, Der: Başaran F. ve Geray H., Ankara: Ütopya, 2016.

Morris, D. (2014). Sağlık Hizmetlerinde Topyekun Reform Nasıl Kazanılır?, J. Walljasper, Müştereklerimiz: Paylaştığımız Herşey, Metis Yayınları

Perzanowski, A. ve Schultz, J. (2016). The end of ownership: Personal property in the digital economy. MIT Press.

İzlem Gözükeleş  23 Kasım 2017


Hard Drive Encryption

Hard drive encryption is a process of converting your readable data into something unreadable to protect it. With hard drive encryption, you will prevent unauthorized access to your data. There are two types of hard drive encryption: 1- Software-based encryption, 2- Hardware-based encryption. In this post, we will talk about the software-based solutions. Most implementations of hard drive encryption encrypt the whole disk except the bootable part like the Master Boot Record (MBR) or GPT. Some hardware-based encryption programs encrypt the whole disk including the booting part.

Continue Reading →

Benefits of Full Disk Encryption

Compared to single file or folder encryption, full disk encryption has many advantages:

  • Encrypting everything including the Temp files and runtime generated files which may contain sensitive data.
  • There is no chance for the user to forget files to encrypt. This is important because the user may forget to encrypt some sensitive files.
  • Instant data destruction, the user can simply destroy the encryption keys so the encrypted data becomes useless. However, if this is your concern, destroying the physical media is preferred.

Full Disk Encryption is Not 100% Safe

Most of the full disk encryption programs are vulnerable to many attacks like:

Cold boot attack: when the attacker has a physical access to the computer, he can retrieve the encryption keys from the system after rebooting the system using a cold reboot technique and the data remains in the RAM for minutes after shutting down the system.

If your password that is used for decryption is not strong enough, the attacker may brute force your password and find your password easily.

Also, the disk encryption programs are vulnerable to acoustic cryptanalysis which is the sound emitted by the computer keyboard and internal computer pieces.

Another risky issue which is data tampering, so if the attacker tampers your encrypted data, your data would be decrypted to useless random data.


There are many free and commercial hard drive encryption implementations available for you to use, we will discuss the best of them.

  • BitLocker
  • CipherShed
  • DriveCrypt
  • Check Point Full Disk Encryption
  • McAfee Drive Encryption
  • VeraCrypt


If you are using windows 10 pro, you can use BitLocker by enabling it from Start > PC Settings > System > About > BitLocker Settings then you can turn on BitLocker on the partition you want.

Anyway, if you try to turn BitLocker on for the operating system partition, you will see an error says that the administrator MUST allow BitLocker without TPM (Trusted Platform Module).

Most modern PCs contain this TPM chip, or if you are building your PC, you can put a TPM chip and integrate it on your PC.

This is because the encryption keys are stored on that chip. It decrypts your data automatically once you enter your Windows password.

If somebody tries to remove your drive from the computer to decrypt it, he can’t, since the decryption keys are on the TPM chip.

TPM is a hardware-based encryption which is more powerful and protected against Cold boot attack and brute force attacks

However, you can bypass this requirement and use BitLocker without TPM.

Use BitLocker without TPM

Click Start > Run and type gpedit.msc and hit enter.

Go to Computer Configuration -> Administrative Templates -> Windows Components -> BitLocker Drive Encryption -> Operating System Drives

Open the “Requires additional authentication at startup” and Enable it and make sure that BitLocker without TPM is enabled as shown and click OK.

Now it will work.


CipherShed is a free open source encryption program. It’s a continuation of Truecrypt program which is discontinued now.

CipherShed works on Windows, Linux, and Mac OS X. and the encryption goes on the fly.

You can use CipherShed to encrypt individual files or entire drives. After you encrypt the drive, you can mount that drive through CipherShed.

Notice that there are no packages for Linux and OS X, but you can compile the source code and make your package.

For Windows users, you can download it from here

So for the people who missed Truecrypt, you should try this one.


DriveCrypt is paid program. It uses 1344-Bit string encryption.

It uses the same technologies as used by FBI and CIA.

There is a special feature called Steganographic where you hide your sensitive files into music files.

You can have many users with different privileges.

You can try DriveCrypt for free for 30 days from here

Check Point Full Disk Encryption

Check Point Full Disk Encryption encrypts all of your files, data, temp files, system files, and even erased files for maximum security.

Check point full disk encryption is certified for FIPS 140-2.

Logical partitions are encrypted sector by sector. Any attempt to copy single files are blocked even if the drive is attached to another system.

Your system will boot with a multi-factor authentication to ensure maximum security. This feature is called pre-boot authentication.

There is a central panel for administration for managing policies, users, and options.

You can try a free trial from here.

McAfee Drive Encryption

McAfee drive encryption forces strong access control with pre-boot authentication.

It offers strong encryption.

Supports multiple device environments, including solid-state drives.

You can download it from here.


VeraCrypt is another free open source disk encryption program that is based on Truecrypt.

It can open Truecrypt encrypted drives, and also you can convert Truecrypt drives to VeraCrypt format.

It works on multiple platforms like Windows, Linux, and Mac OSX.

You can choose between many encryption algorithms to encrypt your drives.

One of the cool features for Raspberry Pi users, there is a VeraCrypt for Raspberry Pi.

You can download it from here

There is a lot of hard drive encryption programs available on the web, we choose the best and the most used programs.


30 Examples for Awk Command in Text Processing

In the previous post, we talked about sed command and we saw many examples of using it in text processing and we saw how it is good in this, but it has some limitations. Sometimes you need something powerful, giving you more control to process data. This is where awk command comes in. The awk command or GNU awk in specific provides a scripting language for text processing. With awk scripting language, you can make the following: a) Define variables, b) Use string and arithmetic operators, c) Use control flow and loops, d) Generate formatted reports. Actually, you can process log files that contain maybe millions of lines to output a readable report that you can benefit from.

Continue Reading →

Awk Options

The awk command is used like this:

$ awk options program file

Awk can take the following options:

-F fs     To specify a file separator.

-f file     To specify a file that contains awk script.

-v var=value     To declare a variable.

We will see how to process files and print results using awk.

Read AWK Scripts

To define an awk script, use braces surrounded by single quotation marks like this:

$ awk '{print "Welcome to awk command tutorial "}'

If you type anything, it returns the same welcome string we provide.

To terminate the program, press The Ctrl+D. Looks tricky, don’t panic, the best is yet to come.

Using Variables

With awk, you can process text files. Awk assigns some variables for each data field found:

  • $0 for the whole line.
  • $1 for the first field.
  • $2 for the second field.
  • $n for the nth field.

The whitespace character like space or tab is the default separator between fields in awk.

Check this example and see how awk processes it:

$ awk '{print $1}' myfile

The above example prints the first word of each line.

Sometimes the separator in some files is not space nor tab but something else. You can specify it using –F option:

$ awk -F: '{print $1}' /etc/passwd

This command prints the first field in the passwd file. We use the colon as a separator because the passwd file uses it.

Using Multiple Commands

To run multiple commands, separate them with a semicolon like this:

$ echo "Hello Tom" | awk '{$2="Adam"; print $0}'

The first command makes the $2 field equals Adam. The second command prints the entire line.

Reading The Script From a File

You can type your awk script in a file and specify that file using the -f option.

Our file contains this script:

{print $1 " home at " $6}

$ awk -F: -f testfile /etc/passwd

Here we print the username and his home path from /etc/passwd, and surely the separator is specified with capital -F which is the colon.

You can your awk script file like this:


text = " home at "

print $1 $6


$ awk -F: -f testfile /etc/passwd

Awk Preprocessing

If you need to create a title or a header for your result or so. You can use the BEGIN keyword to achieve this. It runs before processing the data:

$ awk 'BEGIN {print "Report Title"}'

Let’s apply it to something we can see the result:

$ awk 'BEGIN {print "The File Contents:"}

{print $0}' myfile

Awk Postprocessing

To run a script after processing the data, use the END keyword:

$ awk 'BEGIN {print "The File Contents:"}

{print $0}

END {print "File footer"}' myfile

This is useful, you can use it to add a footer for example.

Let’s combine them together in a script file:


print "Users and thier corresponding home"

print " UserName \t HomePath"

print "___________ \t __________"




print $1 " \t " $6



print "The end"


First, the top section is created using BEGIN keyword. Then we define the FS and print the footer at the end.

$ awk -f myscript /etc/passwd

Built-in Variables

We saw the data field variables $1, $2 $3, etc are used to extract data fields, we also deal with the field separator FS.

But these are not the only variables, there are more built-in variables.

The following list shows some of the built-in variables:

FIELDWIDTHS     Specifies the field width.

RS     Specifies the record separator.

FS     Specifies the field separator.

OFS  Specifies the Output separator.

ORS  Specifies the Output separator.

By default, the OFS variable is the space, you can set the OFS variable to specify the separator you need:

$ awk 'BEGIN{FS=":"; OFS="-"} {print $1,$6,$7}' /etc/passwd

Sometimes, the fields are distributed without a fixed separator. In these cases, FIELDWIDTHS variable solves the problem.

Suppose we have this content:




$ awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testfile

Look at the output. The output fields are 3 per line and each field length is based on what we assigned by FIELDWIDTH exactly.

Suppose that your data are distributed on different lines like the following:

Person Name

123 High Street

(222) 466-1234

Another person

487 High Street

(523) 643-8754

In the above example, awk fails to process fields properly because the fields are separated by new lines and not spaces.

You need to set the FS to the newline (\n) and the RS to a blank text, so empty lines will be considered separators.

$ awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' addresses

Awesome! we can read the records and fields properly.

More Variables

There are some other variables that help you to get more information:

ARGC     Retrieves the number of passed parameters.

ARGV     Retrieves the command line parameters.

ENVIRON     Array of the shell environment variables and corresponding values.

FILENAME    The file name that is processed by awk.

NF     Fields count of the line being processed.

NR    Retrieves total count of processed records.

FNR     The record which is processed.

IGNORECASE     To ignore the character case.

You can review the previous post shell scripting to know more about these variables.

Let’s test them.

$ awk 'BEGIN{print ARGC,ARGV[1]}' myfile

The ENVIRON variable retrieves the shell environment variables like this:

$ awk '




You can use bash variables without ENVIRON variables like this:

$ echo | awk -v home=$HOME '{print "My home is " home}'

The NF variable specifies the last field in the record without knowing its position:

$ awk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd

The NF variable can be used as a data field variable if you type it like this: $NF.

Let’s take a look at these two examples to know the difference between FNR and NR variables:

$ awk 'BEGIN{FS=","}{print $1,"FNR="FNR}' myfile myfile

In this example, the awk command defines two input files. The same file, but processed twice. The output is the first field value and the FNR variable.

Now, check the NR variable and see the difference:

$ awk '

BEGIN {FS=","}

{print $1,"FNR="FNR,"NR="NR}

END{print "Total",NR,"processed lines"}' myfile myfile

The FNR variable becomes 1 when comes to the second file, but the NR variable keeps its value.

User Defined Variables

Variable names could be anything, but it can’t begin with a number.

You can assign a variable as in shell scripting like this:

$ awk '


test="Welcome to LikeGeeks website"

print test


Structured Commands

The awk scripting language supports if conditional statement.

The testfile contains the following:






$ awk '{if ($1 > 30) print $1}' testfile

Just that simple.

You should use braces if you want to run multiple statements:

$ awk '{

if ($1 > 30)


x = $1 * 3

print x


}' testfile

Or type them on the same line and separate the if statement with a semicolon like this:

While Loop

You can use the while loop to iterate over data with a condition.

cat myfile

124 127 130

112 142 135

175 158 245

118 231 147

$ awk '{

sum = 0

i = 1

while (i < 5)


sum += $i



average = sum / 4

print "Average:",average

}' testfile

The while loop runs and every time it adds 1 to the sum variable until the i variables becomes 4.

You can exit the loop using break command like this:

$ awk '{

tot = 0

i = 1

while (i < 5)


tot += $i

if (i == 3)




average = tot / 3

print "Average is:",average

}' testfile

The for Loop

The awk scripting language supports the for loops:

$ awk '{

total = 0

for (var = 1; var < 5; var++)


total += $var


avg = total / 3

print "Average:",avg

}' testfile

Formatted Printing

The printf command in awk allows you to print formatted output using format specifiers.

The format specifiers are written like this:


This list shows the format specifiers you can use with printf:

c              Prints numeric output as a string.

d             Prints an integer value.

e             Prints scientific numbers.

f               Prints float values.

o             Prints an octal value.

s             Prints a text string.

Here we use printf to format our output:

$ awk 'BEGIN{

x = 100 * 100

printf "The result is: %e\n", x


Here is an example of printing scientific numbers.

We are not going to try every format specifier. You know the concept.

Built-In Functions

Awk provides several built-in functions like:

Mathematical Functions

If you love math, you can use these functions in your awk scripts:

sin(x) | cos(x) | sqrt(x) | exp(x) | log(x) | rand()

And they can be used normally:

$ awk 'BEGIN{x=exp(5); print x}'

String Functions

There are many string functions, you can check the list, but we will examine one of them as an example and the rest is the same:

$ awk 'BEGIN{x = "likegeeks"; print toupper(x)}'

The function toupper converts character case to upper case for the passed string.

User Defined Functions

You can define your function and use them like this:

$ awk '

function myfunc()


printf "The user %s has home path at %s\n", $1,$6





}' /etc/passwd

Here we define a function called myprint, then we use it in our script to print output using printf function.

I hope you like the post.

Thank you.


Install, Access, Mount and Authenticate Linux Samba Server

Linux Samba server is one of the powerful servers that helps you to share files and printers with Windows-based PCs and other operating systems. Before we talk about Linux samba server, let’s discuss some basics. To understand Linux/Samba/Windows relationship, you need to understand the relationships of the operating systems, users, and networks. Linux login system is different from Windows login system. So, it’s the system administrator job to maintain the logins between different platforms.

Continue Reading →

Linux/Samba/Windows Relationship

There are several solutions to do this:

  • Linux pluggable authentication modules (PAMs): there are two user lists, one local list and one on the domain controller (DC), and users need to maintain their passwords only on the Windows system.
  • Samba as a DC: you maintain usernames and passwords on the Linux system, and users can log in to Windows boxes with Samba
  • Custom script: you can create scripts for maintaining logins and passwords, this can be done using a cross-platform scripting language like python.

The samba server composed of several components and daemons, the three main daemons are smbd, nmbd, and winbindd.

  • The smbd daemon is the main service for sharing of files and printers. This daemon uses port 139 or 445 to listen for requests.
  • The nmbd daemon handles NetBIOS name service requests. This daemon uses port 137 to listen for requests.
  • The winbindd is used to get user and group information from Windows.

Install Samba

To install Linux samba server, you need to install three packages.

For Red Hat based distros, you can install them like this:

$ dnf -y install samba

This package installs SMB server.

$ dnf -y install samba-common-tools

This package includes the required files for both the server and client.

$ dnf -y install samba-client

For Debian based distros, you can install them like this:

$ apt-get -y install samba

$ apt-get -y install samba-common-tools

$ apt-get -y install samba-client

Then you can start samba service and enable it at startup:

$ systemctl start smb

$ systemctl enable smb

Samba File Sharing

Of course, you can use web-based or GUI utilities to manage your Linux Samba server. However, it is useful to understand what GUI or web tools are doing from behind.

Now we will share a folder named myfolder:

$ chmod -R 755 myfolder

Open up Samba configuration file /etc/samba/smb.conf and add the following lines at the end:





guest ok=yes

The first line is the Samba server name that the clients see.

The second line is the path to the folder that will be shared.

The third line means the share will available to all users like guest account and others. If set to no, authenticated and permitted users are only allowed.

The fourth line means that you cannot create or modify the stored files on the shared folder.

You can check for SMB configuration errors using the testparm command:

$ testparm

Now restart SMB service:

$ systemctl restart smb

Access Samba Shared Files

Now we need to access what we’ve shared. The smbclient utility is used to access Windows shared files.

You can list the shared files like this:

$ smbclient -L localhost -U%

The -U% option is used to avoid asking for the password.

As you can see our shared folder is on the list.

You can access this shared folder from Windows by just typing the IP address in the Windows explorer.


You can list specific directory using the smbclient tool like this:

$ smbclient -U% //

Once you’ve connected, you can use Linux commands to list and travel between files.

You can transfer files using get, put, mget, and mput commands.

If you are using iptables firewall, don’t forget to allow the ports 137,139 and 445.

Mounting Samba Shares

Most Linux kernels support SMB file system.

To mount a Samba share, First, create a mount point:

$ mkdir /mnt/smb

Then we mount the SMB shared folder:

$ mount -t cifs -o guest // /mnt/smb

If the shared folder is password protected, then you type the username and password:

$ mount -t cifs username=likegeeks,password=mypassword //

To unmount the SMB shared folder, use the unmount command like this:

$ umount /mnt/smb

On Debian based distros, you might need installing the cifsutils package in order to use it:

$ apt-get -y install cifs-utils

Creating Samba Users

To create a samba entry for an existing system user, use the pdbedit command:

$ pdbedit -a likegeeks

The new user will be created in the Samba default user database which is /var/lib/samba/private/passdb.tdb file.

With a Samba user created, we can make the shares available only to authenticated users like the user likegeeks.

This user can access his resources on Samba server using smbclient like this:

$ smbclient -U likegeeks -L //

The smbpasswd command is used to change the SMB password like this:

$ smbpasswd likegeeks

Authenticate Users Using Windows Server

The winbindd daemon is used for resolving user accounts information from native Windows servers. All this from your Linux samba server.

First, install the winbind package.

$ dnf -y install samba-winbind

Then start the service like this:

$ systemctl start winbind

Then add the following options in /etc/samba/smb.conf file:

workgroup = windows-domain

password server = 192.1638.1.5

realm =

kerberos method = secrets and keytab

winbind use default domain = yes

winbind enum users = yes

winbind enum groups = yes

winbind refresh tickets = yes

winbind normalize names = yes

winbind nss info = rfc2307

domain master = no

local master = no

Then Edit the /etc/nsswitch.conf file and modify the following lines:

passwd: files winbind

shadow: files winbind

group: files winbind

Then Edit the /etc/resolv.conf file and change the primary DNS server:



Now join the Linux Samba server from the Windows domain using the net command:

$ net join -w WINDOWS-DOMAIN -s ' win-server' -U Administrator%password

You can list the users in Windows domain using wbinfo command

$ wbinfo -u

For any problem diagnostics, you can check the samba log files under /var/log/samba/ directory, also use testparm utility to check your configuration after you modify samba configuration file.

That’s all. I hope you find the Linux samba server easy. Keep coming back.

Thank you.


Develop iOS Apps Using Swift

In the previous post, we talked about iOS language basics and we saw how easy it is to work with Swift language. In this post, we will learn how to work with Xcode and how to develop iOS apps using Swift. Today we will start with a hello world app, so let’s get started. Open Xcode and create a new Xcode project then click single view application.

Continue Reading →

Exploring Xcode

Open Xcode and create a new Xcode project then click single view application

Now type your application name and click next then save your application

Now Xcode will open, you will see a list of files on the left as follows:

  • AppDelegate.swift
  • ViewController.swift
  • Main.storyboard
  • Assets.xcassets
  • LaunchScreen.storyboard
  • Info.plist

The column that contains these files is called navigator.

The center pane of Xcode is called editor where you edit and start coding.

Any file on the left, when you click it, it will open in the center editor area.

Click on the Main.storyboard file, a rectangle in the middle with the title view controller appeared.

On the right hand, there is a column which is attribute inspector.

At the right bottom, there is the object library panel where you drag your components that will be shown to the user as we will see later.

As you can see, on the left, there is a hierarchical list of all components for your selected file which is the view controller in our case, this panel is the document outline panel.

Add Objects to the View Controller

From the objects library panel, search for UIImageView control.

Now drag the UIImageView from the bottom border so it fits the entire corners of the view controller.

I’m going to use two images to show you how to use UIImageView. Click on the Assets.xcassets in the navigator on the left, then drag the images to the document outline.

Click again on the Main.storyboard and select the UIImageView and click the attribute inspector.

Select from the dropdown the image that you need to set as a background for the UIImageView

Then set the content mode for the UIImageView to be Aspect Fill.

Now you can see the image appears perfectly on the UIImageView.

We need to add another UIImageView to put our logo in the center of the screen. Drag another UIImageView from the object library and set the image from the attribute inspector the same way.

UIButton Control

Drag a UIButton from the object library and place it at the top of the view controller.

Change the button attributes from the attribute inspector, you can change the text of the button and the color.

Now let’s run the app to see it in action. Click on the run button on the top of Xcode and wait until the build process completes.

The iPhone simulator will open up and your program should run inside that simulator without problems.

Besides the run button, there is a list of simulators that are shipped with Xcode, you can choose any one of them to run your program.

In my case, I’ve selected iPhone 7 simulator.

Very good!! Your app runs successfully and if you click on the button nothing happens because we didn’t write any code yet for that button.

To close your program, click on the square button

Handling Events

To wire UI elements like a button or image to a code file, you should use @IBOutlet, and to perform actions when a certain UI element is interacted with, you should use @IBAction function.

Click on the assistant editor on the right corner which has interlocking circles icon.

Now we need create @IBOutlets for each image and one @IBAction for the UIButton.

To create an @IBOutlet for the image, right click on the image and drag the mouse to ViewController.swift and exactly above the viewDidLoad() function.

A popup will appear to ask you about the outlet name you want to create. Type the name you want and click connect.

Repeat the same steps for the logo image view.

For the button, right click and drag the button to ViewController.swift and release the mouse blew didReceiveMemoryWarning() function.

When the mouse is released, a popup will appear to ask you about the event type and the name of the action.

Choose the connection type as an action and type the action name and click connect.

As you see, the created action looks like a function. Actually, it’s a function that can be triggered when the button is pressed.

Basic Coding

Let’s do a very basic coding. When the user clicks the button the images disappear.

Go to the button @IBAction and type the following:

backgroundIV.isHidden = true

logoIV.isHidden = true

Run the app and wait for the build process to finish and when the program shows up click on the button and see what will happen.

Wow!! The images disappeared. That’s your first iOS action. Congratulations!

It’s not that good but its working.

I hope you find the post interesting. Keep coming back.

Thank you.