
Our technology is not so advanced to be an eye or an ear for us.
Or we’re not in an age where we don’t need our body yet.
Our technology is not so advanced to be an eye or an ear for us.
Or we’re not in an age where we don’t need our body yet.
I use PEP8 in my Python projects except for a few rules.
I think ‘single-quote’ and “double-quote” characters should NOT be the same. It could be better if these two characters had different counterparts in the Python language parser system. So we could use one of them for the template-strings (or f-strings). It doesn’t provide readability, causes inconsistency instead. Until now, I used string-quotes for the variable definitions and double-quotes for the visible texts. But now, I plan to use always double-quote as in many other programming languages.
Spreadsheet applications are the most functional applications I’ve used. Excel, Gnumeric, Google Sheet, OpenOffice Calc or whatever, it doesn’t matter. You can use it as task management like Trello, make daily – weekly – monthly plans, store and transfer data, and follow your financial situation. It’s like a Swiss army knife and not a new invention.
I’ll update this article when I find a more functional application.
With just a command:
# terminal $ ENV=PROD ./do.sh deploy
I have many projects using my script named DOSH and the parameters are mostly in common; deploy
, start
, stop
, runtests
, etc. It can be a .NET Core or a Django project, or just a website using any static site generator like this one but I run all the projects with the same command: dosh start
.
In Windows, the command may be a bit longer than in the other operating systems. So it’s a good idea to shorten the command using some aliases, the default environment is DEV
:
# ~/.bash_profile alias dosh="winpty bash do.sh" # or just type "./do.sh" in Linux or MacOS.
# terminal $ dosh start # in DEV $ ENV=PROD dosh deploy # in PROD, my deploy parameter works only in production.
Do you use PowerShell? No problem, I think it’s better to do the same thing in PowerShell, you can find the sample codes below, but let me show you how I use that, it’s a bit different than BASH:
# powershell ~\Workspace\website [master ≡]> $env:ENV = "PROD" ~\Workspace\website [master ≡]> dosh deploy Environment: production Deploying updates to GitHub... Building sites … | EN | TR +------------------+----+----+ Pages | 13 | 67 Paginator pages | 0 | 0 Non-page files | 0 | 0 Static files | 63 | 63 Processed images | 0 | 0 Aliases | 1 | 12 Sitemaps | 2 | 1 Cleaned | 0 | 0 Total in 748 ms [master 1686121] rebuilding site 12/30/2018 15:02:32 1 file changed, 3 insertions(+), 3 deletions(-) Enumerating objects: 9, done. Counting objects: 100% (9/9), done. Delta compression using up to 12 threads Compressing objects: 100% (4/4), done. Writing objects: 100% (5/5), 628 bytes | 628.00 KiB/s, done. Total 5 (delta 3), reused 0 (delta 0) remote: Resolving deltas: 100% (3/3), completed with 3 local objects. To github.com:gkmngrgn/gkmngrgn.github.io.git 733793b..1686121 master -> master DONE.
You can find many sample codes here to write a deployment script and I didn’t think of this idea first but still, I’m sharing my scripts to be an alternative:
#!/usr/bin/env bash BLUE="\\033[1;34m" GREEN="\\033[1;32m" NORMAL="\\033[0;39m" RED="\\033[1;31m" print_help() { echo -e "${BLUE}Available environments${NORMAL}" echo " - DEV (default)" echo " - PROD" echo " - STAGING" echo "" echo -e "${BLUE}Available commands${NORMAL}" echo -e " > deploy [:message] Deploy the changes" echo -e " > start Run development server" } deploy() { case ${ENV} in "PROD") echo -e "${BLUE}Deploying updates to GitHub...${NORMAL}" ;; *) echo -e "${RED}This command only works in production.${NORMAL}" exit ;; esac if [ $# -eq 1 ] then msg="${1}" else msg="rebuilding site `date`" fi hugo cd public git add . git commit -m "${msg}" git push origin master cd .. echo -e "${GREEN}DONE.${NORMAL}" } start() { hugo server -D } if [ -z "$1" ] then print_help else case $ENV in "PROD") env_str="production" ;; "STAGING") env_str="staging" ;; *) env_str="development" ;; esac echo -e "${BLUE}Environment:${NORMAL} $env_str" "$@" fi
<# Variables #> if ($env:ENV -eq "PROD") { $env_str = "production" } elseif ($env:ENV -eq "STAGING") { $env_str = "staging" } else { if ($env:ENV -ne "DEV") { $env:ENV = "DEV" } $env_str = "development" } <# Functions #> function Get-Help { Write-Host -ForegroundColor Cyan "Available Environments" Write-Output " - DEV (default)" Write-Output " - PROD" Write-Output " - STAGING" Write-Output "" Write-Host -ForegroundColor Cyan "Available commands" Write-Output " > deploy [:message] Deploy the changes" Write-Output " > start Run development server" } function Start-Deploy ([string] $subParams) { if ($env:ENV -eq "PROD") { Write-Host -ForegroundColor Blue "Deploying updates to GitHub..." } else { Write-Host -ForegroundColor Red "This command only works in production." exit } if ($subParams -eq "") { $msg = "rebuilding site $(Get-Date)" } else { $msg = $subParams } Invoke-Expression "hugo" Invoke-Expression "cd public" Invoke-Expression "git add ." Invoke-Expression "git commit -m '$msg'" Invoke-Expression "git push origin master" Invoke-Expression "cd .." Write-Host -ForegroundColor Green "DONE." } function Start-Server () { Invoke-Expression "hugo server -D" } <# Set default parameter as help. #> if ($args.Length -eq 0) { $param = "help" $subParams = "" } else { $param, $subParams = $args } if ($param -ne "help") { Write-Host -ForegroundColor Cyan -NoNewLine "Environment: " Write-Output $env_str } <# We use switch instead of alias because there are some constant variables like `start`. #> switch ($param) { "deploy" { Start-Deploy $subParams } "start" { Start-Server } Default { Get-Help } }
Don’t forget to set the alias in your config file, for example:
# ~\Documents\PowerShell\profile.ps1 $env:ENV = "DEV" Set-Alias dosh .\do.ps1
To make git log
command output properly display on Windows, we need to set a variable named LC_ALL
:
LC_ALL="C.UTF-8"
This problem is not only about Emacs. If you try to find a file from HOME
variable, you may need to define the variable first:
HOME="%USERPROFILE%"
;; place all backup files in one directory (setq backup-directory-alist `((".*" . ,temporary-file-directory))) (setq auto-save-file-name-transforms `((".*" ,temporary-file-directory t))) (setq default-directory (concat (getenv "HOME") "/Workspace"))
Take a look at the other posts about my Windows development environment.
Monolitik yapıda bir web projesinin iskeletini oluşturup, projeyi geliştirmek için bir geliştirme ortamına ihtiyacımız var. Geliştirme ortamını hazırlarken bazı ayrıntıları göz önünde bulundurmak gerekir:
Amacımız şudur: 5 tane projemiz de olsa, ekibe sonradan katılıyor da olsak, hızlıca geliştirme ortamına sahip olabilmek ve bu ortamlar arasında kolayca geçiş yapabilmek, gerekirse hızlıca baştan kurabilmek.
Vagrant sanallaştırma teknolojilerini kullanarak, kolayca yapılandırılabilir, tekrar tekrar kurulabilir ve taşınabilir geliştirme ortamı sağlayan bir araç. Bu sayede tek komutla geliştirme ortamımız hazırlanacak:
$ vagrant up
BashBu komutun bizim istediğimiz şekilde çalışabilmesi için bilgisayarımıza Vagrant ve bir sanallaştırma çözümü (örneğin VirtualBox) kurmamız, bir de proje dizinimizde Vagrantfile
adında bir yapılandırma dosyası oluşturup hazırlamamız gerekiyor. Vagrant hakkında daha fazla bilgiyi şuradan edinebilirsiniz: https://www.vagrantup.com/intro/index.html
Projelerimde kullandığım Vagrant yapılandırmamı şurada bulabilirsiniz, depoyu forklayıp siz de katkıda bulunabilirsiniz: https://github.com/gkmngrgn/vagrant-skeleton
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.network "forwarded_port", guest: 8000, host: 8000
config.vm.provider "virtualbox" do |vb|
vb.memory = "512"
end
config.vm.provision "shell", path: "increase_swap.sh"
config.vm.provision "shell", path: "update_repositories.sh"
config.vm.provision "shell", path: "install_java.sh"
config.vm.provision "shell", path: "install_elasticsearch.sh"
config.vm.provision "shell", path: "install_nodejs.sh"
config.vm.provision "shell", path: "install_postgresql.sh"
config.vm.provision "shell", path: "install_python.sh"
[...]
end
RubyVagrantfile
dosyamızın içeriği çok basit. Bir Ubuntu 16.04 imajıyla sanal bir sunucu oluşturup, bir seferlik provision script’lerini çalıştırarak geliştirme ortamınızı hazırlıyor. Bu örnekte, 512 MB ram’lık sanal sunucumuza 1024 MB’lik SWAP alanı oluşturuyorum, sonrasında Elasticsearch, Nodejs, PostgreSQL gibi proje için gerekli paketleri kuruyorum, proje için veritabanı oluşturuyorum, Python için virtualenv’i hazırlıyorum.
Bu yöntemde şimdiye kadar Windows ve MacOS kullanan geliştirici arkadaşlarda ciddi problem yaşamadık. Bazen sanal sunucunun internet erişiminin olmaması gibi sorunlar yaşadıysak da bir şekilde çözüldü. Fakat tuhaf bir şekilde Linux dağıtımı kullanan arkadaşlarda VirtualBox’un çalışmaması, paketlerin yüklenmemesi gibi sorunlar yaşadık ve onlar da provision script’lerini kendi yerel bilgisayarlarında çalıştırmayı tercih ettiler. Her zaman yaşanan sorunlar değildi; ama yaşandı mı uğraştıran sorunlardı. Diğer konulara değinecek olursak:
Yazılım dünyasının en eski editörlerinden Emacs, günümüzdeki diğer popüler editörlerden farklı bir kullanma ve öğrenme disiplini istiyor. Bazı temel özelliklerini öğrenmeden editörde bir dosya açmak bile zor. O nedenle Emacs’in kendi içinde gelen tutorial’ını en azından bir kez okumak, öğrendiklerini uygulamak ve birkaç hafta sabırla kullanmak gerekiyor.
Emacs Linux, Windows ve macOS işletim sistemlerinde çalışıyor. Yükleyip editörü açtığınızda ilk hali muhtemelen arzu ettiğiniz gibi görünmeyecek. Bir yandan Emacs’i öğrenirken, bir yandan da kendi zevkinize göre özelleştirmeye başlamanızı öneriyorum. İnternette yüzlerce Emacs config dosyası bulabilirsiniz, bazı kullanıcılar işi bir adım daha ileriye götürüp Spacemacs, StarterKit gibi projelerle kullanıcıların ortalama ihtiyaçlarına göre hazır config dosyaları sunuyorlar. Deneyebilirsiniz; ama bana göre bu iyi bir başlangıç olmaz. Elinizde neredeyse her şeyi yapılandırabileceğiniz bir editör var ve bunu başkalarının zevklerine göre ayarlamak yerine, kendi ihtiyaçlarınızı tespit edip, bu ihtiyaçları başkalarının nasıl çözdüğüne bakarak kendi editörünüzü kendiniz yapılandırmanız daha doğru bir yaklaşım olur.
Emacs kendine özel bir Lisp yorumlayıcısıyla birlikte geliyor. Config dosyalarınızı bir Lisp script’i yazar gibi hazırlıyorsunuz. Daha önce hiç Lisp yazmadıysanız, buradan başlayabilirsiniz:
https://learnxinyminutes.com/docs/elisp
Config dosyası genellikle kullanıcı ev dizininizde ~/emacs.el veya ~/.emacs.d/init.el olarak saklanıyor. Yapılandırma dosyası hakkında daha fazla bilgi almak için okumaya buradan başlayabilirsiniz:
https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html
Belgeyi okuyup config dosyası hazırlamak gözünüzü korkutmasın, size açıklayarak küçük bir örnek göstereceğim. Benim config dosyam, önce paketleri kontrol etmek, eğer kurulmamış paket varsa da kurmakla başlıyor. Paketler, editöre ekstra özellik kazandıran kodlar içerir ve bunlar genellikle küçük dosyalardan oluşmazlar, örneğin HTML kodları, içinde CSS ve JavaScript kodu barındırdığında parse etmesi çok zordur, bunun için ek paket kurmak isteyebilirsiniz veya Emacs içinde bir git istemcisi kullanmak isteyebilirsiniz. Helm paketi ile Emacs komut satırını daha da güçlendirmek isteyebilirsiniz:
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
(when (not package-archive-contents) (package-refresh-contents))
(defvar my-packages
'(auto-complete
flx-ido
helm
helm-ag
helm-ls-git
js2-mode
magit
markdown-mode
scss-mode
web-mode)
"A list of packages to ensure are installed at launch.")
(dolist (p my-packages)
(when (not (package-installed-p p)) (package-install p)))
LispEditörü kullandıkça bazı ihtiyaçlar ortaya çıkmaya başlıyor. Örneğin bir projede çok uzun süre çalışıp daha sonra başka bir projeye geçmek istediğimde arka planda açık olan tüm dosya yedeklerini silmek istiyorum. Bunun için `kill-other-buffers` adında bir fonksiyon yazdım ve bu fonksiyonu bir klavye kısayoluna atadım (Ctrl c, k):
(defun kill-other-buffers ()
“Kill all other buffers.”
(interactive)
(mapc ‘kill-buffer (delq (current-buffer) (buffer-list)))
(message “All other buffers are killed..”))(global-set-key (kbd “C-c k”) ‘kill-other-buffers)
LispEmacs’i olabildiğince sade kullanmaya çalışıyorum. O nedenle menüyü, açılış ekranını kaldırdım, imleç pozisyonunu satır uzunluğunu anlayabilecek şekilde yapılandırdım, fontumu değiştirdim, dosya kaydederken beyaz boşlukların otomatik silinmesini sağladım, parantezlerin otomatik kapatılması gibi birçok ayarı etkinleştirdim:
(setq-default truncate-lines t)
(setq inhibit-splash-screen t)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode -1)
(setq visible-bell 1)
(column-number-mode t)
(set-face-attribute ‘default nil :font “Fira Code” :height 105 :weight ‘normal :width ‘normal)
(ido-mode 1)
(ido-everywhere 1)
(flx-ido-mode 1)
(setq ido-enable-flex-matching t)
(setq ido-use-faces nil)
(setq-default indent-tabs-mode nil)
(electric-pair-mode 1)
(add-hook ‘before-save-hook ‘delete-trailing-whitespace)
(ac-config-default)
LispEditörde dosya açarken, aynı dizinde geçici bir dosya oluşturulduğunu göreceksiniz. Bu dosyaların ortalıkta değil de, başka bir yerde tek bir dizin içinde saklanmasını sağlıyorum:
(setq backup-directory-alist `((“.*” . ,temporary-file-directory)))
(setq auto-save-file-name-transforms `((“.*” ,temporary-file-directory t)))
LispSon olarak, normalde uzun satırları kırmayı sevmiyorum, tek satırda göstermesi benim için daha iyi; ama metin dosyaları hariç, onlarda uzun satırları kırıp satırbaşıymış gibi göstermesini sağlıyorum:
(add-hook ‘markdown-mode-hook ‘visual-line-mode)
(add-hook ‘text-mode-hook ‘visual-line-mode)
Lisp40 yıllık editör için yapılandırmam bundan ibaret. Yapılandırmanızı ne kadar basit tutarsanız o kadar iyi. Eğer Emacs ile ilgileniyorsanız, aşağıdaki linklere de göz atın, istediğiniz zaman yorum yazıp bana soru iletebilirsiniz.
Bir arkadaşım, “Metroya binerken yüzü gülen insan görmüyorum.” demişti. İstanbul’a geldim geleli, insanların gözlerinin içine baka baka yürürüm. Yüzlerdeki ciddiyet, bana zihinlerinde çok farklı şeyler gezindiğini hissettiriyor. Sanki yüzleriyle zihinleri arasındaki bağlantılar kopmuş gibi. Bu o kadar bulaşıcı bir şey ki, ben de çoğu zaman pek gülümsemiyorum.
Katre adında bir kadın. Bir bankacı, sabahı ve akşamı belli. Kahvaltısı bir poğaçadan ibaret, ancak yürürken yiyebiliyor, bir on dakikalık yürüme mesafesinden sonra metrobüse, oradan aktarma yapıp metroya binecek, sonrasında yine bir beş dakika daha yürümesi gerek. Diğer birçok işe giden insanlarla aynı vakitte işte olmak ve aynı yoldan gitmek zorunda olduğu için kendini kalabalığın ve telaşın içinde buluyor. Bu kadar zamandır işe gidip geliyor ve her gün binlerce insanla göz göze geliyor; ama bir gözü bir kere daha görebildiğini pek hatırlamıyor.
Katre, karşıdan karşıya geçmek için araçların yol vermesini bekliyor. Yok hayır, bu İstanbullu için çok komik bir senaryo oldu. Doğrusu şöyle olmalı: Katre, adımlarını zihninde öyle hesapladı ki, karşıdan karşıya geçerken durma ihtimali yüksek bir sürücüye denk getirdi ve kaldırımdan yola adımını attıktan sonra artık sürücüyle göz temasını kesti, dikkatini duymaya verdi. Sürücü de “Sen bana bakmıyorsun; ama ben sana yol vermek istemiyordum, bana resmen üstünlük taslamış gibi hareket ediyorsun.” dercesine tüm hızıyla yaklaşıp son anda frene basıyor. Katre karşıya geçmiş, sürücü de yoluna devam etmiş oluyor; ama zihinlerinde çok başka senaryolar var. Katre içinden “Ezseydin bir de!” diyor, sürücü bağırıyor, laf atıyor. Katre dikiz aynasını kırmak istiyor, sürücü ezmek…
Ben uzun boyluyum, dolayısıyla adım mesafelerimin daha uzun olmasını, daha hızlı yürüyebileceğimi varsayıyorum. İstanbul’da kadınlar erkeklerden daha hızlı yürüyor. Bazı kadınları geçmek için koşmam gerekiyor. Katre de öyle yürüyor. Erkek hegemonyasının içinde kendini güvende hissetmediği için mi bu böyle? İşe her gün geç kaldığı için mi? Yoksa burada herkes hızlı yürüyor, öyleyse ben de hızlı yürümeliyim diye düşündüğü için mi sadece?
Bir kere yavaş yürümeyi denedim. Yüzüme bakıp uyaracak kimseye denk gelmedim; ama omzuma dokunup, elime çarpıp başını çevirmeden geçip giden çok oldu. Sanki, hayallerinde kolumdan tutup kenara çekip sorguya çekmek istiyorlardı da, gerçekte sadece bunu yapabilmişler gibi. Bir kere yürüyen merdivenin solunda durmayı denedim, bir kadın söylene söylene yanımdan geçti. Bir keresinde de bir öğrenci önümü keser gibi yapıp geçti yanımdan. Kuralların olması hayatın akışını kolaylaştırmak için iyi şeyler de, burada çok başka bir durum söz konusuydu. Burada daha çok insanlar kendi içinde biriktirdikleri öfke ve nefreti bir bahane bularak boşaltma ihtiyacı duyuyordu. Tıpkı metrobüsün şoförüne şemsiyeyle saldıran yolcu gibi. Sorsak Katre’ye neden hızlı yürüyorsun diye, bir cevabı yok belki de. Sabah yarım saat daha erken çıksa yine hızlı yürüyecek, önüne çıkan engele yine omzundan ittirerek tepkisini gösterecek; ama hayalinde ona kıçından tekmeyi basacak. O da diğer yürüyen herkes gibi bunu arzulayacaktı.
Her gidişin bir de dönüşü var. Katre, dönerken “Yer yok kardeşim, buraya yanaşma.” diyen insanların kapıya dizildiği yerden metrobüsün içine atlayıp “İşte bak, yer varmış.” diyerek diğer yolcularla sanal kavgaya tutuşacak, her gün olduğu gibi metro çıkışlarında, girişlerinde asansörü deneyecek. Asansör meselesine gelmişken yine bir hikayemi anlatmak isterim. İTÜ / Maslak’a giden metronun en arkadan bir önceki vagonundan inilince asansörün olduğu araya denk geliyorsunuz. O vagondan inenler, diğer vagonlardan inenlerden daha hızlı adım atarlar. Hızlı adım atanın esas nereye varmak istediği biz İstanbullu çalışan sınıfının kabak gibi bilebileceği şeylerden biridir. Bir keresinde ben bunu taklit ettim. Metro durunca vagon kapısından fırladığım gibi yürüyen merdivenlere yöneldim. Sürü psikolojisine güzel bir örnektir.
Katre’nin kullandığı bu yollar tam bir dövüş arenası gibi. Yaşlılara yer yok, çocuklar servis araçlarına mahkum, engellilerin durumu hakkında çok bir bilgim yok. Simto Alev’in yıllar süren kaldırım direği hikayesi aslında bir özet gibi. Normal bir insanın empati eksikliği yüzünden hiç önemsemediği minik şeyler bu şehri sadece belli kalıplara uyan dar bir kitlenin rahat yaşayabilmesine imkan tanıyor. Nüfusu İstanbul’un onda biri olan Zürih’te gördüğüm engelli sayısı burada gördüğümden çok daha fazla. Oranın da tehlikeli mahalleleri var, orada da sokakta yaşayan dilenciler, yere çöp atan sorumsuzlar, ırkçı tavır takınan insanlar var; ama orada engelliler dışarı çıkabiliyorlar, kaldırımlar tekerlekli sandalyeyle çıkılabilecek yükseklikte, hayvanat bahçesinde kendi başlarına takılabiliyorlar, çocuklar kaldırımda scooter kullanabiliyor. Çok üzgünüm; ama yaşını başını almış bir engelli görememenin sebebi hakkında söylenenler doğru olabilir. Vebali Katre ve benim, hatta siz değerli okuyucumuzun boynuna.
Sizi bilmem ama Katre’de benden izler var. Her işe gidip geldiğimde, sürekli etrafa negatif enerji yayan insanlar var ve haliyle ben de istemeden yayıyorum. Biraz gülümsemekten ne zarar gelir? Serdar Kuzuloğlu’nun bir blog yazısında dediği gibi, gülmek sadece selfie çekince aklınıza gelmesin. İçinizden gelmese bile gülümseyin. Bir deneyin. Hatta bir gülen insanlar hareketi başlatalım. Gülümseme hareketi, tebessüm hareketi, ismi ne olursa olsun. Yapacağımız tek şey arada bir yüzümüzü kontrol etmek.
Bu yazının başlığını, Selçuk Şirin’in jüri üyesi olduğu bir yarışmanın temasından aldım. Göçle ne alakası var bu yazının bilmiyorum; ama o yarışmayı duyduğumda aklıma bunlar gelmişti. Öyle sanıyorum ki, bu işini sevmeyenler memleketinde koşturup duran insanların (işini sevenler dahil) akıllarından en az bir kez bu hayat silsilesinden bıkıp göç etmek geçmiştir.
Geçen gün esas niyetimi fazla açıklamadan Twitter üzerinden, kitapları dağıtırsam pişman olup olmayacağım üzerine bir soru sordum:
Siz olsanız evdeki kitapları dağıtmaktan pişman olur muydunuz? Bundan sonra sadece ebook alan biri olarak soruyorum.
Seçimler arasında çok bir uçurum olmaması beni bir süre kararsız bıraktı; ama cevap olarak yazılanlar faydalı oldu. Özetlemek gerekirse:
Benim soruyu sormaktaki amacım şuydu: Evde bulunan fazla eşya beni rahatsız ediyor. Çok fazla giysim yok, çok fazla eşyam yok, çok sık kullanmadığım ne varsa elden çıkarmayı tercih ediyorum. Sahip olduklarımı da bozulana, işlevini görmeyene kadar kullanmayı seviyorum. Tenhalık bana huzur veriyor. Ama kitap konusu, evde bu kriterlere uymayan belki de tek şey. Hem çok nadiren baktığım, kullandığım, hatta hiç yüzüne bakmadığım kitaplar var; hem de onların orada bir şekilde durması hoşuma gidiyor. Hoşuma gidiyor ama bir taraftan da bunların e-kitap olarak cebimde, her zaman erişebileceğim şekilde olması daha iyi olmaz mıydı diye kendi kendime soruyorum. Evde atılacak başka eşya kalmamış gibi bunlara takmış olmam benim sorunum. Ama e-kitap konusu güven veriyor olsa, sanırım bunu denerdim.
Sonuç olarak, sahip olmak istediğim kitapları tutmaya, istemediklerimi de dağıtmaya karar verdim. Bu arada yeri gelmişken gelecek öngörümü de belirteyim: Evlerin metrekareleri daha da düşecek, konteyner hizmetleri değerlenecek, mobil yaşam diye bir kültür bu topraklara da gelecek.