-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathblog.sql
414 lines (343 loc) · 144 KB
/
blog.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
-- phpMyAdmin SQL Dump
-- version 4.8.3
-- https://www.phpmyadmin.net/
--
-- Anamakine: 127.0.0.1
-- Üretim Zamanı: 22 Eki 2018, 18:39:57
-- Sunucu sürümü: 10.1.36-MariaDB
-- PHP Sürümü: 7.2.10
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Veritabanı: `blog`
--
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `ayar`
--
CREATE TABLE `ayar` (
`id` int(10) UNSIGNED NOT NULL,
`tema` varchar(255) COLLATE utf8_turkish_ci NOT NULL,
`twitter` varchar(255) COLLATE utf8_turkish_ci NOT NULL,
`github` varchar(150) COLLATE utf8_turkish_ci NOT NULL,
`linkedin` varchar(150) COLLATE utf8_turkish_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci;
--
-- Tablo döküm verisi `ayar`
--
INSERT INTO `ayar` (`id`, `tema`, `twitter`, `github`, `linkedin`, `created_at`, `updated_at`) VALUES
(1, 'bootstrap', 'twitter', 'github', 'linkedin', '2018-10-21 12:04:54', '2018-10-22 13:30:34');
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `categories`
--
CREATE TABLE `categories` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`picture` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`sira` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Tablo döküm verisi `categories`
--
INSERT INTO `categories` (`id`, `name`, `slug`, `picture`, `created_at`, `updated_at`, `sira`) VALUES
(1, 'Selenium', 'Selenium', 'Selenium.png', NULL, '2018-10-11 09:55:22', 0),
(3, 'Cucumber', 'Cucumber', 'Cucumber.png', NULL, '2018-10-11 09:56:23', 1),
(4, 'Appium', 'Appium', 'Appium.png', NULL, '2018-10-11 09:55:56', 3),
(7, 'LARAVEL', 'LARAVEL', 'LARAVEL.png', NULL, '2018-10-11 09:54:31', 2),
(26, 'Kotlin', 'kotlin', 'Kotlin.png', '2018-10-11 03:38:38', '2018-10-11 03:38:38', 0);
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `comments`
--
CREATE TABLE `comments` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`comment` text COLLATE utf8mb4_unicode_ci NOT NULL,
`approved` tinyint(1) NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`post_id` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Tablo döküm verisi `comments`
--
INSERT INTO `comments` (`id`, `name`, `email`, `comment`, `approved`, `created_at`, `updated_at`, `post_id`) VALUES
(1, 'Lorem Ipsum', 'lorem@ipsum.com', 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\r\n', 1, '2018-01-20 08:49:20', '2018-10-12 06:56:24', 1),
(3, 'Lorem Ipsum', 'lorem@ipsum.com', 'Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum 2', 1, '2018-09-11 08:55:20', '2018-10-13 07:35:46', 28),
(5, 'Lorem Ipsum', 'lorem@ipsum.com', '1Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum 1', 1, '2018-10-22 08:30:10', '2018-10-22 10:13:13', 28);
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `migrations`
--
CREATE TABLE `migrations` (
`id` int(10) UNSIGNED NOT NULL,
`migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`batch` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Tablo döküm verisi `migrations`
--
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES
(1, '2014_10_12_000000_create_users_table', 1),
(2, '2014_10_12_100000_create_password_resets_table', 1),
(3, '2016_02_06_175142_create_posts_table', 1),
(4, '2016_04_28_021908_create_categories_table', 1),
(5, '2018_10_07_075442_create_tags_table', 2),
(6, '2018_10_07_080133_create_post_tag_table', 3),
(7, '2018_10_07_104534_create_comments_table', 4),
(8, '2018_10_14_131920_create_settings_table', 5),
(11, '2018_10_21_145354_create_ayar_table', 6);
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `password_resets`
--
CREATE TABLE `password_resets` (
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Tablo döküm verisi `password_resets`
--
INSERT INTO `password_resets` (`email`, `token`, `created_at`) VALUES
('asenocak@netas.com.tr', '$2y$10$xKMmAJEwu5OVH/9Y1QWNIuFiRJxCmYvjy3Ieotjhl11HlFYUaFn.O', '2018-10-10 07:15:28');
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `posts`
--
CREATE TABLE `posts` (
`id` int(10) UNSIGNED NOT NULL,
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8 NOT NULL,
`category_id` int(11) NOT NULL,
`body` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`sira` int(11) NOT NULL DEFAULT '0',
`fixed` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_turkish_ci;
--
-- Tablo döküm verisi `posts`
--
INSERT INTO `posts` (`id`, `title`, `slug`, `category_id`, `body`, `created_at`, `updated_at`, `sira`, `fixed`) VALUES
(1, 'Selenium Nedir? ', 'selenium_nedir_', 1, '<p>Selenium tarayıcıları otomatikleştirmemizi sağlayan bir test aracıdır. Kısaca bu araçla yapılacak işlerin belli bir sınırı yoktur tamamen yazılımcıya kalmıştır. Öncelikle, web uygulamalarını test amaçlı olarak otomatik hale getirmek için geliştirilmiştir, ama sadece bununla sınırlı değildir. Web tabanlı yönetim görevlerini otomatikleştirebiliriz. Google Chrome, Firefox gibi önde gelen tarayıcılar Selenium'u kendi parçaları haline getirmek için gerekli eklentilere ve kütüphanelere sahiptir. Ayrcıa sayısız tarayıcı otomasyon araçlarının, API'lerin ve Framework'lerin temelini oluşturur. </p>\r\n\r\n<p> </p>\r\n\r\n<hr />\r\n<h2><strong>Selenium Eğitimleri</strong></h2>\r\n\r\n<p> </p>\r\n\r\n<ul>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/webdriver_nedir_\" target=\"_blank\">WebDriver Nedir?</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/selenium_webdriveri_eclipsee_nasil_yukleriz_\" target=\"_blank\">Selenium WebDriver'ı Eclipse'e Nasıl Yükleriz?</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/selenium_html_etiketler\" target=\"_blank\">Selenium HTML Etiketler</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/selenium_cheat_sheets\" target=\"_blank\">Selenium Cheat Sheets</a></p>\r\n </li>\r\n <li>\r\n <p> </p>\r\n </li>\r\n</ul>\r\n', '2017-01-08 16:06:09', '2018-10-12 11:05:50', 1, 1),
(2, 'WebDriver Nedir?', 'webdriver_nedir_', 1, '<p><span style=\"font-size:16px\">WebDriver web otomasyon framework'üdür. Bu framework sadece Firefox veya Google Chrome değilde farklı tarayıcılar kullanarak da testinizi çalıştırır. Selenium IDE ile ayırılan en büyük özellikten biridir.</span></p>\r\n\r\n<ul>\r\n <li><span style=\"font-size:16px\"><strong>WebDriver </strong>ayrıca test scriptlerinde <strong>programlama dili</strong> kullanmayı sağlar. Selenium IDE de yoktur bu.</span></li>\r\n <li><span style=\"font-size:16px\"><strong>if-then-else or switch-case</strong> gibi karşılaştırma işlemleri kullanabiliriz.</span></li>\r\n <li><span style=\"font-size:16px\"><strong>do-while </strong>gibi döngüleri kullanabiliriz.</span></li>\r\n</ul>\r\n\r\n<p><span style=\"font-size:16px\"><span style=\"font-size:16px\">WebDriver'ın desteklediği programlama dilleri;</span></span></p>\r\n\r\n<ul>\r\n <li><span style=\"font-size:16px\">Java</span></li>\r\n <li><span style=\"font-size:16px\">.Net</span></li>\r\n <li><span style=\"font-size:16px\">PHP</span></li>\r\n <li><span style=\"font-size:16px\">Python</span></li>\r\n <li><span style=\"font-size:16px\">Perl</span></li>\r\n <li><span style=\"font-size:16px\">Ruby</span></li>\r\n</ul>\r\n\r\n<p><span style=\"font-size:16px\">Bu yazıda <strong>Java </strong>ve <strong>Eclipse </strong>kullanacağız.</span></p>\r\n\r\n<h2><strong><span style=\"font-size:16px\">Selenium RC and Webdriver farkı; </span></strong><span style=\"font-size:14px\">WebDriver 2006 hayatımıza girmeden önce test aracı olarak <strong>Selenium Remote Control </strong>vardı. <strong>WebDriver </strong>ve <strong>Selenium RC</strong> ortak özellikleri;</span></h2>\r\n\r\n<ul>\r\n <li><span style=\"font-size:16px\">İkiside test yazmada programlama dili desteği var.</span></li>\r\n <li><span style=\"font-size:16px\">İkiside farklı tarayıcılar üzerinden test koşmamızı sağlar.</span></li>\r\n</ul>\r\n\r\n<p><span style=\"font-size:16px\">Peki fark nerede?</span></p>\r\n\r\n<h2><span style=\"font-size:18px\">1. Mimari</span></h2>\r\n\r\n<p><span style=\"font-size:14px\"><strong>WebDriver'ın mimarisi Selenium RC den daha basit; </strong>WebDriver tarayıcıyı işletim sesitemi seviyesinde kontrol ediyor.</span></p>\r\n\r\n<h5><span style=\"font-size:14px\"><strong>Selenium RC'nin mimarisi daha karışık</strong></span></h5>\r\n\r\n<ul>\r\n <li><span style=\"font-size:14px\">Teste başlamadan önce ayrı bir program olan <strong>Selenium Remote Control (RC) Server</strong>'ı başlatmamız gerekiyor.</span></li>\r\n <li><span style=\"font-size:14px\">Selenium RC Server tarayıcı ile Selenium komutları arasındaki "<strong>orta adam</strong>" görevi yapar.</span></li>\r\n <li><span style=\"font-size:14px\">Teste başladığımızda, Selenium RC Server tarayıcıya <strong>Selenium Core</strong> denilen <strong>Javascript </strong>programını aktif eder.</span></li>\r\n <li><span style=\"font-size:14px\">Aktif edildiğinde, Selenium Core test programından RC Server'a aktarılan komutları alır ve başlatır.</span></li>\r\n <li><span style=\"font-size:14px\">Komutlar alındığında, <strong>Selenium Core </strong>onları <strong>Javascript komutları </strong>olarak çalıştırır.</span></li>\r\n <li><span style=\"font-size:14px\">Tarayıcı Selenium Core'ın talimatlarına uyar ve cevabını RC Server'a aktarır.</span></li>\r\n <li><span style=\"font-size:14px\">RC Server tarayıcının cevapları alır ve bize gösterir.</span></li>\r\n <li><span style=\"font-size:14px\">RC Server böylece bir sonraki komutu işler ve testi bitene kadar tekrar eder.</span></li>\r\n</ul>\r\n\r\n<h2><span style=\"font-size:18px\">2. Hız</span></h2>\r\n\r\n<p><span style=\"font-size:14px\"><strong>WebDriver Selenium RC'den daha hızlıdır.</strong> Tarayıcı ile direk konuştuğu tarayıcının kendi çekirdeğini kullanır.</span></p>\r\n\r\n<p><span style=\"font-size:14px\"><strong>Selenium RC Selenium Core denilen Javascript programını kullandığı için daha yavaştır.</strong> Selenium Core direk tarayıcı ile etkileşim içindedir yazılımcı değil.</span></p>\r\n\r\n<h2><span style=\"font-size:18px\">3. Gerçek Zamanlı Etkileşim</span></h2>\r\n\r\n<h5><span style=\"font-size:14px\"><strong>WebDriver sayafadaki yapılar ile daha gerçekçi etkileşime geçer.</strong> Örneğin, Bir web sayfasında disabled olarak tanımlanan textbox'ı test ettiğimizi düşünelim. WebDriver gerçekte bizimde yapamayacağımız gibi textbox'a herhangi bişey yazamayacaktır. Selenium Core disabled olan yapıya erişebilecektir. Geçmişte, Selenium test uzmanları Selenium Core testlerinde disabled olan bir elemente değerler girildiğini şikayet ediyorlardı.</span></h5>\r\n\r\n<h2><span style=\"font-size:18px\">4. API</span></h2>\r\n\r\n<p><span style=\"font-size:14px\"><strong>Selenium RC API daha olgunlaştı, ancak fazlalıklar genellikle karışık komutlar içeriyordu.</strong> Örneğin, çoğu zaman, testerlar (type ile typeKeys - mouseDown ile mouseDownAt) arasında hangisini kullancakları konusunda ikiye düşüyorlardı. <strong>Daha kötüsü, farklı tarayıcılar bu komutların her birini farklı şekillerde de yorumlar!</strong></span></p>\r\n\r\n<p><span style=\"font-size:14px\"><strong>WebDriver API ile işlem Selenium RC'den daha basitleşti</strong>. Kafa karıştırıcı komutlar içermiyor.</span></p>\r\n\r\n<h2><span style=\"font-size:18px\">5. Tarayıcı Desteği</span></h2>\r\n\r\n<p><strong><span style=\"font-size:14px\">WebDriver Headless HtmlUnit tarayıcısını destekleyebilir</span></strong></p>\r\n\r\n<p><span style=\"font-size:16px\">HtmlUnit'e "headless" denilmesinin sebebi, gizli bir taraıcı olmasıdır. Çok hızlıdır çünkü sayfanın yüklenmesine zaman harcamaz. Bu, test yürütme döngülerini hızlandırır. Kullanıcı için görünmez olduğu için, yalnızca otomatik yöntemlerle kontrol edilir</span><span style=\"font-size:16px\">.</span></p>\r\n\r\n<p><strong><span style=\"font-size:14px\">Selenium RC Headless HtmlUnit tarayıcısını desteklemez. </span></strong><span style=\"font-size:16px\">İşlemleri gerçekleştirebilmek için gerçek, görünebilen bir tarayıcıya ihtiyaç duyar.</span></p>\r\n\r\n<p><span style=\"font-size:16px\">Reference from <a href=\"http://guru99.com/selenium-tutorial.html\" style=\"font-size: 16px;\" target=\"_blank\">GURU99</a></span></p>\r\n', '2017-01-09 16:06:09', '2018-10-15 05:18:40', 29, 0),
(3, 'Selenium WebDriver\'ı Eclipse\'e Nasıl Yükleriz?', 'selenium_webdriveri_eclipsee_nasil_yukleriz_', 1, '<p><strong>Adım 1 - Java</strong></p>\r\n\r\n<p><a href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.html\" target=\"_blank\">Bu</a> linkten <strong>Java Software Development Kit (JDK)</strong>'ı indirip kuralım.</p>\r\n\r\n<p><strong>Adım 2 - Eclipse IDE</strong></p>\r\n\r\n<p><a href=\"http://www.eclipse.org/downloads/\" target=\"_blank\">Bu</a> linkten "<strong>Eclipse IDE for Java Developers</strong>"ı indirelim. Dikkat, 32 Bit ile 64 Bit arasından işletim sisteminize uygun olanı indirin. Exe dosyasını indirdikten sonra, çalıştıralım ve <strong>Launch </strong>a tıklayalım.</p>\r\n\r\n<p><strong>Adım 3 - Selenium Java Client Driver</strong></p>\r\n\r\n<p><a href=\"http://seleniumhq.org/download/\" target=\"_blank\">Bu</a> linkten Java için olan <strong>Selenium Java Client Driver</strong> 'ı indirebilirsiniz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/download_java_client_driver_1.png\" style=\"height:162px; width:489px\" /></p>\r\n\r\n<p>"<strong>selenium-2.25.0.zip</strong>" adında dosya indireceğiz. Basitçe, dosyaları C diskine çıkarırsak direkt olarak Eclipse'den import etmemiz çok kolaylaşacak. "<strong>C:\\selenium-2.25.0\\</strong>".</p>\r\n\r\n<p><strong>Step 4 - Eclipse IDE ile WebDriver'ı konfigüre etme</strong></p>\r\n\r\n<ol>\r\n <li>"<strong>eclipse.exe</strong>" çalıştırıyoruz. </li>\r\n <li><strong>workspace</strong>'i sorduğunda default olarak kabul ediyoruz.<br />\r\n <img alt=\"\" src=\"/upload/images/configure_eclipse_1b.png\" style=\"height:183px; width:450px\" /></li>\r\n <li>\r\n <p><strong>File </strong>> <strong>New </strong>> <strong>Java Project.</strong> sırası ile "<strong>newproject</strong>" adında yeni bir Java projesi oluşturuyoruz</p>\r\n </li>\r\n <li>Oluşturulan projede sağ tuşa basarak <strong>New </strong>> <strong>Package</strong>, sırası ile "<strong>newpackage</strong>" isminde yeni bir paket oluşturuyoruz.<br />\r\n <img alt=\"\" src=\"/upload/images/021316_1152_SeleniumIns3.png\" style=\"height:180px; width:450px\" /></li>\r\n <li>Oluşturulan pakete sağ tuş ile <strong>New </strong>> <strong>Class</strong>, sırası ile "<strong>MyClass</strong>" isminde yeni bir <strong>"</strong><strong>Class</strong><strong>" </strong>oluşturuyoruz.<br />\r\n <img alt=\"\" src=\"/upload/images/021316_1152_SeleniumIns5.png\" style=\"height:211px; width:450px\" /><br />\r\n Şimdi Selenium WebDriver jar dosyalarını Java Built Path ile projemize ekliyoruz. Projeye sağ tuş ile <strong>Properties > Java Built Path > Libraries > Add External JARs<br />\r\n <img alt=\"\" src=\"/upload/images/021316_1152_SeleniumIns8.png\" style=\"height:187px; width:700px\" /></strong></li>\r\n <li>Jar dosyalarını import ettikten sonra<strong> Apply and Close</strong> basarak işlemi tamamlıyoruz.<br />\r\n <img alt=\"\" src=\"/upload/images/022017_1205_Guidetoinst_24_7_3.png\" style=\"height:349px; width:500px\" /></li>\r\n</ol>\r\n\r\n<p><strong>Faklı Sürücüler</strong></p>\r\n\r\n<p><strong>HTMLUnit ve Firefox WebDriver'ı direk olarak herhangi bir eklentiye ihtiyaç duymadan test koşmamızı sağlayan tarayıcılardır. </strong>Diğer tarayıcılar için <strong>Driver Server </strong>denilen ayrı bir programa ihtiyaç duyarlar. Driver server diğer tarayıcılardan farklıdır. Örneğin, Internet Explorer'ın kendine has driver'ı vardır ve bu driver'ı başla tarayıcılar için kullanamayız.</p>\r\n\r\n<p>Driver'ları <a href=\"http://seleniumhq.org/download/\" target=\"_blank\">bu linkte</a> bulabilirsiniz.</p>\r\n\r\n<table>\r\n <tbody>\r\n <tr>\r\n <td><strong>Tarayıcı</strong></td>\r\n <td><strong>Driver İsmi</strong></td>\r\n <td><strong>Fark</strong></td>\r\n </tr>\r\n <tr>\r\n <td>HTMLUnit</td>\r\n <td>HtmlUnitDriver</td>\r\n <td>WebDriver can drive HTMLUnit using HtmlUnitDriver as driver server</td>\r\n </tr>\r\n <tr>\r\n <td>Firefox</td>\r\n <td>Mozilla GeckoDriver</td>\r\n <td>WebDriver can drive Firefox without the need of a driver server Starting Firefox 45 & above one needs to use gecko driver created by Mozilla for automation</td>\r\n </tr>\r\n <tr>\r\n <td>Internet Explorer</td>\r\n <td>Internet Explorer Driver Server</td>\r\n <td>Available in 32 and 64-bit versions. Use the version that corresponds to the architecture of your IE</td>\r\n </tr>\r\n <tr>\r\n <td>Chrome</td>\r\n <td>ChromeDriver</td>\r\n <td>Though its name is just "ChromeDriver", it is, in fact, a Driver Server, not just a driver. The current version can support versions higher than Chrome v.21</td>\r\n </tr>\r\n <tr>\r\n <td>Opera</td>\r\n <td>OperaDriver</td>\r\n <td>Though its name is just "OperaDriver", it is, in fact, a Driver Server, not just a driver.</td>\r\n </tr>\r\n <tr>\r\n <td>PhantomJS</td>\r\n <td>GhostDriver</td>\r\n <td>PhantomJS is another headless browser just like HTMLUnit.</td>\r\n </tr>\r\n <tr>\r\n <td>Safari</td>\r\n <td>SafariDriver</td>\r\n <td>Though its name is just "SafariDriver", it is, in fact, a Driver Server, not just a driver.</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n\r\n<p><strong>Özet</strong></p>\r\n\r\n<ul>\r\n <li><strong>Java Development Kit (JDK).</strong><a href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.html\">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a></li>\r\n <li><strong>Eclipse IDE</strong> - <a href=\"http://www.eclipse.org/downloads/\">http://www.eclipse.org/downloads/</a></li>\r\n <li><strong>Java Client Driver</strong> - <a href=\"http://seleniumhq.org/download/\">http://seleniumhq.org/download/</a></li>\r\n <li>Eclipse'de WebDriver projesi yazmaya başladığınızda Selenium'un gerekli kütüphanelerini import etmeyi unutmayın</li>\r\n <li>HTMLUnit ve Firefox Driver Server kullanmadan tarayıcıları otomatikleştirmemizi sağlayan tarayıcılardır.</li>\r\n <li>Her tarayıcının kendine özgü Driver'ı vardır.</li>\r\n</ul>\r\n\r\n<p>Oluşturduğumuz MyClass ismindeki java sınıfına aşağıdaki kodları ekleyerek ilk projemizi test edelim.</p>\r\n\r\n<p> </p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/first.png\" style=\"height:331px; width:784px\" /></p>\r\n\r\n<p> </p>\r\n\r\n<p><span style=\"font-size:16px\">Reference from </span><a href=\"http://guru99.com/selenium-tutorial.html\" style=\"font-size: 16px;\" target=\"_blank\">GURU99</a></p>\r\n', '2017-01-12 16:06:09', '2018-10-15 05:18:40', 28, 0),
(4, 'Cucumber Nedir?', 'cucumber_nedir_', 3, '<p>Cucumber, Behavior Driven Development (Davranış Süreci Geliştirme) yaklaşımını destekleyen testing yaklaşımıdır. Gherkin dilini kullanarak basit bir dil (Türkçe, İngilizce) kullanarak uygulamanın davranışını açıklar.</p>\r\n\r\n<p><strong>Neden Cucumber ile Selenium Kullanırız?</strong></p>\r\n\r\n<p>Cucumber ve Selenium iki yeni teknolojidir. Çoğu şirketler fonksiyonel testler için Selenium kullanır. Bu şirketler Selenium'u Cucumber ile entegre istemesinin nedeni, cucumber uygulamanın akışını okumayı ve anlamayı kolaylaştırdığı içindir.</p>\r\n\r\n<p>Cucumber, <u>Davranış Süreci Geliştirme</u>(<em>BDD</em>) tabanlı framework, aşağıdaki insanlar arasında köprü görevi görmektedir.</p>\r\n\r\n<ol>\r\n <li>Software Engineer and Business Analyst.</li>\r\n <li>Manual Tester and Automation Tester.</li>\r\n <li>Manual Tester and Developers.</li>\r\n</ol>\r\n\r\n<p>Ayrıca, Cucumber Gherkin dilini kullandığı için geliştiricilere uygulamanın kodlarını anlamada faydası vardır. Çalışanların hepsinin uygulamanı davranışını anlamasını sağlar.Gherkin dilinin söz dizimi çok kolay anlaşılabilir ve okunabilirdir.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/092917_0716_UsingCucumb1.png\" style=\"height:104px; width:565px\" /></p>\r\n\r\n<p>Cucumber için Jar Dosyaları:</p>\r\n\r\n<ul style=\"margin-left:1.5rem\">\r\n <li>Cucumber-core</li>\r\n <li>Cucumber-html</li>\r\n <li>cobertura code coverage</li>\r\n <li>Cucumber-java</li>\r\n <li>Cucumber-junit</li>\r\n <li>Cucumber-jvm-deps</li>\r\n <li>Cucumber-reporting</li>\r\n <li>Hemcrest-core</li>\r\n <li>Gherkin</li>\r\n <li>Junit</li>\r\n</ul>\r\n\r\n<p>Gerekli Tüm Dosyalar; <a href=\"/upload/files/CucumberJarFiles.zip\">CucumberJarFiles.zip</a></p>\r\n\r\n<p>Dosyanın içerisindeki tüm jar dosyalarını Eclipse içinde ekliyoruz. <strong>Java Built Path -> Add External JARs</strong> </p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/asdasd.png\" style=\"height:412px; width:600px\" /><br />\r\n<br />\r\nEkledikten sonra Cucumber ile Selenium'u çalıştırabilmek için her işlemi ayırmamız gerekiyor.</p>\r\n\r\n<ul>\r\n <li><strong>StepDefinition -> Steps.java</strong> class'ında test işlemimizi yapacak java kodları bulunacaktır.</li>\r\n <li><strong>TestRunner -> Runner.java</strong> class'ında Selenium'un Cucumber'ı kullanarak referans kodları bulunacaktır.</li>\r\n <li><strong>Features -> MyTest.feature</strong> dosyasında Cucumber'ın konuşma dili kullanarak gerçekletirdiğimiz adımlar bulunacaktır.</li>\r\n</ul>\r\n\r\n<p>Eclipse'in Cucumber söz dizimini (Gherkin) tanıması için<strong> Help -> Install New Software</strong> kısmından "<strong>http://cucumber.github.io/cucumber-eclipse/update-site/</strong>" adresini kullanarak eklentiyi ekliyoruz. Örnek Proje;</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/1/092917_0716_UsingCucumb14.png\" style=\"height:509px; width:800px\" /></p>\r\n\r\n<p>MyTest.feature<br />\r\n<img alt=\"\" src=\"/upload/images/Untitled.png\" style=\"height:121px; width:355px\" /><br />\r\nRunner.java<br />\r\n<img alt=\"\" src=\"/upload/images/Untitled(1).png\" style=\"height:183px; width:489px\" title=\"\" /><br />\r\nSteps.java</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/Untitled(2).png\" style=\"height:440px; width:647px\" /><br />\r\n<br />\r\nSonuç;<br />\r\n<img alt=\"\" src=\"/upload/images/Untitled(3).png\" style=\"height:288px; width:897px\" /><br />\r\n </p>\r\n\r\n<p> </p>\r\n\r\n<hr />\r\n<h2><strong>Cucumber Eğitimleri</strong></h2>\r\n\r\n<ul>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/cucumber_options_nelerdir_\" target=\"_blank\">Cucumber Options Nelerdir?</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/cucumber_ile_degisken_gonderme\" target=\"_blank\">Cucumber ile Değişken Gönderme</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/cucumber_given,_when,_then,_and_but,_background\" target=\"_blank\">Cucumber Given, When, Then, And/But, Background</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/15_cucumber_sorulari___cevaplari\" target=\"_blank\">15 Cucumber Soruları & Cevapları</a></p>\r\n </li>\r\n</ul>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n', '2017-02-15 16:06:09', '2018-10-12 11:05:50', 0, 1),
(5, 'Cucumber Options Nelerdir?', 'cucumber_options_nelerdir_', 3, '<p><img alt=\"\" src=\"/upload/images/CucumberOptions_7.png\" style=\"height:246px; width:787px\" /><br />\r\n </p>\r\n\r\n<h3><em><strong>Dry Run</strong></em></h3>\r\n\r\n<p><em><strong>dryRun</strong></em> seçeneği, <em><strong>true</strong> </em>veya <em><strong>false</strong></em> olabilir. <em>true</em> ise, Cucumber sadece Feature dosyasında belirtilen her Adımın, Adım Tanımlama dosyasına yazılmış kodun ilgili olup olmadığını kontrol edeceği anlamına gelir. Böylece Feature dosyasındaki herhangi adım için Step Definition kısmında eksik olup olmadığını belirtir ve bize mesaj gösterir. <em><strong>Runner </strong></em>sınıfına <em><strong>dryRun = true </strong>kodunu eklememiz yeterli olacaktır.<br />\r\nMyTest.feature </em>dosyasında tanımlı ama Steps.java dosyasında tanımlı olmayan bir ifade görüldüğünde sonucu bize bildirir.<br />\r\n<img alt=\"\" src=\"/upload/images/CucumberOptions_7(1).png\" style=\"height:535px; width:800px\" /></p>\r\n\r\n<h3><em><strong>Monochrome</strong></em></h3>\r\n\r\n<p><strong>Monochrome </strong>seçeneği <em><strong>true</strong> </em>veya <em><strong>false</strong></em> olabilir. <em>true</em> ise demektir ki Cucumber test sonucunu daha okunaklı bir çıktı olarak <em>console </em>ekranında gösterir. <em>false </em>ise <em>console </em>çıktısı olması gerektiği gibi değildir yani herhangi bir yorumlama yapmadan sonucu ekrana bastırır. <em><strong>Runner </strong></em>sınıfına <em><strong>monochrome</strong><strong> = true </strong>kodunu eklememiz yeterli olacaktır.<br />\r\n<img alt=\"\" src=\"/upload/images/Untitled(4).png\" style=\"height:189px; width:649px\" /></em><br />\r\n </p>\r\n\r\n<h3><em><strong>Features</strong></em></h3>\r\n\r\n<p><em><strong>Features </strong></em>özelliği projede <em>Cucumber'ın</em> hangi kısımda olacağını belirtir. Bizim yapacağımız tek şey yolu belirtmek olacaktır gerisini <em>Cucumber</em> otomatik olarak ‘<em><strong>.features</strong></em>‘ uzantılı dosyayı bulacaktır. <em><strong>Runner </strong></em>sınıfına <em><strong>features = "dosyanın_yolu" </strong>kodunu eklememiz yeterli olacaktır.</em><br />\r\n </p>\r\n\r\n<h3><em><strong>Glue</strong></em></h3>\r\n\r\n<p><em>Features</em> özelliği gibi düşünülebilir. Tek fark Cucumber'da yazdığımız adımların java karşılığı olacak olan kodların yollarını belirtmemize yardımcı olur<em><strong>.</strong></em> <em><strong>Runner </strong></em>sınıfına <em><strong>glue = "stepDefinition_yolu" </strong>kodunu eklememiz yeterli olacaktır.</em></p>\r\n\r\n<p> </p>\r\n\r\n<h3><em><strong>Format / Plugin</strong></em></h3>\r\n\r\n<p><strong><em>Format / Plugin </em></strong>çıktıyı özelleştirebildiğimiz kısımdır. Farklı formatlarda çıktı almamızı sağlar. </p>\r\n\r\n<p><strong><em>plugin</em></strong><em><strong>= {“<span style=\"color:rgb(0, 0, 255)\">pretty</span>“}</strong></em></p>\r\n\r\n<p><strong><em>plugin</em></strong><em><strong>= {“<span style=\"color:rgb(0, 0, 255)\">pretty</span>“,"html:Klasör_İsmi"}</strong></em></p>\r\n\r\n<p><strong><em>plugin</em></strong><em><strong>= {“<span style=\"color:rgb(0, 0, 255)\">pretty</span>“,"json:Folder_Name/cucumber.json"}</strong></em></p>\r\n\r\n<p><strong><em>plugin</em></strong><em><strong>= {“<span style=\"color:rgb(0, 0, 255)\">pretty</span>“,"</strong></em><strong><em>junit:Folder_Name/cucumber.xml</em></strong><em><strong>"}</strong></em></p>\r\n', '2017-02-28 16:06:09', '2018-10-15 05:18:40', 27, 0),
(6, 'Cucumber ile Değişken Gönderme', 'cucumber_ile_degisken_gonderme', 3, '<p><em>Cucumber </em>senaryolarında değişken tanımlayabilir ve bu değişkenleri java tarafında kullanabiliriz. <em><strong>MyTest.feature</strong></em> dosyasında <strong>Given</strong>, <strong>When</strong>, <strong>And </strong>tanımlamalarından sonra kullanmak istediğimiz değişkenler neler ise çift tırnak (" ") içinde belirtiyoruz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/Untitled(5).png\" style=\"height:123px; width:373px\" /><br />\r\nJava tarafındaki <strong><em>Steps.java </em></strong>dosyamızda ise <em>Cucumber </em>tarafında aralarında kelime olmayan tırnak içinde yazılmış ifadeleri ayrı ayrı kaç tane yazılmış ise alabiliriz. Almamız için <strong>Regular Expression</strong> tanımlayarak yazılan kelime veya cümlecikleri okuyabiliriz.</p>\r\n\r\n<p><br />\r\n<img alt=\"\" src=\"/upload/images/Untitled(6).png\" style=\"height:78px; width:434px\" /></p>\r\n\r\n<p>Dikkat edilmesi gereken her değişken için<strong> <span style=\"color:#FF0000\">\\"(.*)\\" </span></strong>ifadesini kullanmak zorundayız. Diğer bir nokta ise tanımlanan fonksiyonda da aynı işlemi yapmamız gerekiyor. Artık değişkenlere ulaşabiliriz. Çıktı.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/Untitled(7).png\" style=\"height:266px; width:881px\" /></p>\r\n', '2017-03-02 16:06:09', '2018-10-15 05:18:40', 26, 0),
(7, 'Selenium HTML Etiketler', 'selenium_html_etiketler', 1, '<p>HTML formlar website ziyaretçilerinden bilgi almak için kullanılan temel elemanlardır. </p>\r\n\r\n<h2><strong>WebElement, findElement(), findElements() Nedir?</strong></h2>\r\n\r\n<p><strong>Selenium</strong>, her form öğesini WebElement'in bir nesnesi olarak yorumlamaktadır.<strong> </strong>WebDriver'ın elementleri anlaması için birkaç teknik vardır. Bunlar elementlere özgü işlevler olan ID, Name, Class, XPath, Tagname, CSS Selectors, link, gibi yapılardır.</p>\r\n\r\n<ul style=\"margin-left:1.5rem\">\r\n <li><strong>findElement()</strong> – Sadece hiyerarşideki ilk elementi bulur ve WebElement objesi olarak geriye döndürür.</li>\r\n <li><strong>findElements()</strong> – Gerekli kriteri sağlayan tüm elementleri WebElement objesi olarak geriye döndürür.</li>\r\n</ul>\r\n\r\n<p><strong>Adım 1: </strong>Web Element nesneleri yaratmak ve erişmek için gerekli kütüphaneleri import etmemiz gerekli.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/072717_0632_SeleniumWeb1.png\" style=\"height:38px; width:286px\" /></p>\r\n\r\n<p><strong>Adım 2: </strong>findElement() method'unu çağırarak WebDriver'dan dönen elementi kullanabiliriz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/072717_0632_SeleniumWeb1(1).png\" style=\"height:54px; width:475px\" /></p>\r\n\r\n<p>Burdaki örnekte olduğu gibi By.name() kullanarak yaptığımız gibi daha birçok alternatif kullanabiliriz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/072717_0632_SeleniumWeb1(2).png\" style=\"height:370px; width:388px\" /></p>\r\n\r\n<p>WebElement'i oluşturduktan sonra kullanabileceğimiz tüm işlevler;<br />\r\n<img alt=\"\" src=\"/upload/images/072717_0632_SeleniumWeb1(3).png\" style=\"height:536px; width:644px\" /></p>\r\n\r\n<table class=\"table-striped table1\" style=\"border-collapse:collapse; border-spacing:0px; border:0px; box-sizing:inherit; color:rgb(52, 52, 52); font-family:arial,sans-serif; font-size:16.8px; max-width:100%; width:741px\">\r\n <tbody>\r\n <tr>\r\n </tr>\r\n </tbody>\r\n <thead>\r\n <tr>\r\n <th style=\"text-align:left; vertical-align:middle\"><strong>Element</strong></th>\r\n <th style=\"text-align:left; vertical-align:middle\"><strong>Komut</strong></th>\r\n <th style=\"text-align:left; vertical-align:middle\"><strong>Tanım</strong></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td rowspan=\"2\" style=\"vertical-align:middle\"><strong>Input Box</strong></td>\r\n <td style=\"vertical-align:middle\">sendKeys()</td>\r\n <td style=\"vertical-align:middle\">Textbox'a değer girmek için</td>\r\n </tr>\r\n <tr>\r\n <td style=\"vertical-align:middle\">clear()</td>\r\n <td style=\"vertical-align:middle\"><span style=\"color:rgb(52, 52, 52); font-family:arial,sans-serif; font-size:16.8px\">Textbox'dan değer silmek için</span></td>\r\n </tr>\r\n <tr>\r\n <td style=\"vertical-align:middle\"><strong>Check Box,</strong><strong>Radio Button,</strong></td>\r\n <td style=\"vertical-align:middle\">click()</td>\r\n <td style=\"vertical-align:middle\">Element'e tıklamak için</td>\r\n </tr>\r\n <tr>\r\n <td style=\"vertical-align:middle\"><strong>Links</strong></td>\r\n <td style=\"vertical-align:middle\">click()</td>\r\n <td style=\"vertical-align:middle\">Link'e tıklamak ve sonraki komutun işlenmesinden önce sayfanın yüklenmesini beklemek için</td>\r\n </tr>\r\n <tr>\r\n <td style=\"vertical-align:middle\"><strong>Submit Button</strong></td>\r\n <td style=\"vertical-align:middle\">submit()<br />\r\n </td>\r\n <td style=\"vertical-align:middle\">Submit işlemini gerçekleştirmek için kullanılır.</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n', '2017-03-19 16:06:09', '2018-10-15 05:18:40', 25, 0),
(8, 'Appium Kurulumu', 'appium_kurulumu', 4, '<p><strong>Windows'a Android için Appium Kurulumu</strong></p>\r\n\r\n<ol>\r\n <li>Java </li>\r\n <li>Android SDK </li>\r\n <li>IDE </li>\r\n <li>Node Js </li>\r\n <li>Appium Server </li>\r\n <li>Inspect Configuration</li>\r\n</ol>\r\n\r\n<p><strong>1 – JAVA </strong></p>\r\n\r\n<ul>\r\n <li style=\"text-align:left\"><a href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.html\">Download </a>Java JDK</li>\r\n</ul>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/download.png\" style=\"height:284px; width:450px\" /></p>\r\n\r\n<ul>\r\n <li>Bilgisayarım –> Özellikler –> Gelişmiş Sistem Ayarları –> Ortam Değişkenleri –> JAVA_HOME oluştur–> C:\\Program Files\\Java\\jdk1.8.0_131</li>\r\n</ul>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/download(1).png\" style=\"height:314px; width:280px\" /><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31.png\" style=\"height:138px; width:500px\" /></p>\r\n\r\n<h3><strong>2 – Android SDK</strong></h3>\r\n\r\n<ul>\r\n <li>Android SDK <a href=\"https://developer.android.com/studio/\">Download </a>and Run: </li>\r\n</ul>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(1).png\" style=\"height:325px; width:600px\" /></p>\r\n\r\n<ul>\r\n <li>Bilgisayarım –> Özellikler –> Gelişmiş Sistem Ayarları –> Ortam Değişkenleri –> ANDROID_HOME oluştur</li>\r\n</ul>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(2).png\" style=\"height:135px; width:500px\" /></p>\r\n\r\n<ul>\r\n <li>Değişkenleri yola ekle</li>\r\n <li>%JAVA_HOME%; %ANDROID_HOME%\\platform-tools; %ANDROID_HOME%\\tools; %ANDROID_HOME%\\build-tools</li>\r\n</ul>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(3).png\" style=\"height:285px; width:300px\" /><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(4).png\" style=\"height:286px; width:300px\" /></p>\r\n\r\n<h3><strong>3 – IDE</strong></h3>\r\n\r\n<p><a href=\"https://www.jetbrains.com/idea/download/#section=windows\">Jetbrains </a>veya <a href=\"http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/oxygen2\">Eclipse </a>IDE'lerini kullanabiliriz</p>\r\n\r\n<h3><strong>4 – Node Js</strong></h3>\r\n\r\n<p><a href=\"https://nodejs.org/en/\">Indirip</a> çalıştıralım</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(5).png\" style=\"height:244px; width:500px\" /></p>\r\n\r\n<p>Konsol ekranına <strong>node -v</strong> yazarak yüklü Node.js versiyonunu öğrenebiliriz.</p>\r\n\r\n<h3><strong>5 – Appium Server Installation</strong></h3>\r\n\r\n<p><a href=\"http://appium.io/\">Indirip</a> çalıştıralım</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(6).png\" style=\"height:267px; width:500px\" /><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(7).png\" style=\"height:373px; width:400px\" /></p>\r\n\r\n<h3><strong>6 – Inspect Configuration</strong></h3>\r\n\r\n<p>Uygulamayı denetlemek isterseniz, Appium Server içersindeki Desired Capabilities alanlarını uygun dolduralım.</p>\r\n\r\n<p><span style=\"color:rgb(17, 17, 17)\"><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(8).png\" style=\"height:394px; width:400px\" /></span><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(9).png\" style=\"height:321px; width:400px\" /><br />\r\nDesired Capabilities alanları;</p>\r\n\r\n<p><em><strong>uuid </strong>–> Devices specific ID (You can find UUID by typing “adb devices” on CMD)</em></p>\r\n\r\n<p><em><strong>platformName </strong>–> Devices OS platform like Android, iOS.</em></p>\r\n\r\n<p><em><strong>platformVersion </strong>–> Devices OS version like 7.0 , 6.0.1</em></p>\r\n\r\n<p><em><strong>app </strong>–> Apk’s location on your computer</em></p>\r\n\r\n<p><em><strong>deviceName </strong>–> The kind of device name to use. </em></p>\r\n\r\n<p><a href=\"/~https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md\">Link</a>'ten daha fazla bulabilirsiniz</p>\r\n\r\n<p><em><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(10).png\" style=\"height:403px; width:500px\" /></em></p>\r\n\r\n<p><em><em><img alt=\"\" src=\"/upload/images/image2017-12-26_14-56-31(11).png\" style=\"height:272px; width:500px\" /></em></em></p>\r\n', '2017-03-31 16:06:09', '2018-10-15 05:18:40', 24, 0),
(9, 'Cucumber Given, When, Then, And/But, Background', 'cucumber_given,_when,_then,_and_but,_background', 3, '<h3 style=\"text-align:justify\"><strong>Given</strong></h3>\r\n\r\n<p style=\"text-align:justify\"><code>Given</code> adımları, sistemin ilk içeriğini tanımlamak için kullanılır. "Senaryo Özeti". Genel olarak geçmişteki bişeydir. Cucumber <code>Given</code> adımını çalıştırdığında, Sistemi iyi tanımlanmış duruma göre,Nesneyi yaratmak/konfigüre etmek veya test veritabanına veri eklemek için, ayarlar. <code>Given</code> adımının amacı kullanıcı veya harici sistemin sistem ile iletişime geçmeden önce bilinen durumu sisteme eklemeyi sağlar. <code>Given</code> kullanıcı etkileşimi hakkında konuşmaktan kaçınır. Kullanım durumları oluşturuyorsanız, <code>Given</code> lar ön koşullarınızdır. Birden fazla <span style=\"font-family:monospace\">Given</span> olabilir.</p>\r\n\r\n<p style=\"text-align:justify\">Örnek:</p>\r\n\r\n<ul>\r\n <li style=\"text-align:justify\">Mickey ve Minnie oyuna başlar</li>\r\n <li style=\"text-align:justify\">Giriş yapılır</li>\r\n <li style=\"text-align:justify\">Joe'nin 20 lirası var</li>\r\n</ul>\r\n\r\n<h3 style=\"text-align:justify\"><strong>When</strong></h3>\r\n\r\n<p style=\"text-align:justify\"><code>When</code> adımları olayları veya aksiyonları tanımlar. Bu adımlar insanlar ile sistemlerin etkileşiminde veya diğer sistemlerin olayları tetiklemesi için kullanılır. Her senaryoda sadece 1 adet olması önemlidir. Birden fazla olması gerekli ise varsayılan senaryolar ayrılmalıdır. </p>\r\n\r\n<p style=\"text-align:justify\">Örnek:</p>\r\n\r\n<ul>\r\n <li style=\"text-align:justify\">Kelime tahmin et</li>\r\n <li style=\"text-align:justify\">Arkadaş davet et</li>\r\n <li style=\"text-align:justify\">Parayı geri çek</li>\r\n</ul>\r\n\r\n<p style=\"text-align:justify\"><strong>Then</strong></p>\r\n\r\n<p style=\"text-align:justify\"><code>Then</code> adımları beklenen sonuçları tanımlamak için kullanılır. Sistem gerçekte ne yaptığını beklenen sonuç ile karşılaştırmak içindir. Gözlem, gözlemlenebilir bir çıktıda olmalıdır. Yani, sistemden çıkan (rapor, kullanıcı arayüzü, mesaj) ve içinde derin bir şekilde gömülü olmayan bir şey olmalıdır. (veritabanı gibi).</p>\r\n\r\n<p style=\"text-align:justify\">Örnek:</p>\r\n\r\n<ul>\r\n <li style=\"text-align:justify\">Tahmin edilen kelimenin yanlış olduğunu gör</li>\r\n <li style=\"text-align:justify\">İstek al</li>\r\n <li style=\"text-align:justify\">Kart yutulmalı</li>\r\n</ul>\r\n\r\n<p style=\"text-align:justify\">Yalnızca kullanıcı (veya harici sistem) için gözlemlenebilir olan sonucu doğrulamanız gerekir ve genellikle veritabanları bulunmaz.</p>\r\n\r\n<h3 style=\"text-align:justify\"><strong>And, But</strong></h3>\r\n\r\n<p style=\"text-align:justify\">Birden fazla <code>Given</code> , <code>Then </code><code>veya</code> <code>When</code> <span style=\"font-family:monospace\"> </span>varsa;</p>\r\n\r\n<div class=\"highlight\" style=\"box-sizing: inherit; max-width: 100%; overflow: hidden; padding: 0px; margin-bottom: 1.5rem; color: rgb(74, 74, 74);\">\r\n<pre style=\"text-align:justify\">\r\n<code>Example: Çoklu Given\r\n Given birşey\r\n And başka birşey\r\n And başka birşey daha\r\n When gözlerimi açarım\r\n Then birşey görüyorum\r\n But başka birşey görmemeliyim.</code></pre>\r\n</div>\r\n\r\n<h3 style=\"text-align:justify\"><strong>Background</strong></h3>\r\n\r\n<p style=\"text-align:justify\">Bazen, bir özellikteki tüm senaryolarda aynı Verilen adımları tekrarladığınızı görürüz. Her senaryoda tekrar ettiği için, bu adımları senaryolarda tanımlamak gerekli değildir. <span style=\"font-family:monospace\">Given </span>adımlarını background'a taşıyarak background altında gruplayabiliriz. <code>Background</code> feature dosyasına bazı içerikler eklemeye izin verir. Bir veya birden fazla <span style=\"font-family:monospace\">Given </span>adımları olabilir. <code>Background</code> her senaryodan önce çalışır. Sadece her feature da 1 adet <code>Background </code>adımları vardır. Farklı senaryolarda farklı <code>Background a </code>ihtiyaç varsa, onları farklı feature dosyalarına ayırmak gerekir.</p>\r\n\r\n<div class=\"highlight\" style=\"font-family: sans-serif, arial, verdana, \">\r\n<h3 style=\"text-align:justify\"><strong>Background için ipucuları</strong></h3>\r\n\r\n<ul>\r\n <li style=\"text-align:justify\"><code>Background</code><span style=\"color:rgb(82, 82, 82); font-family:open sans,sans-serif; font-size:14px\"> </span>adımlarında karmalık durumlar kullanmayın ama durum gerçekte bilinmesi gereken birşey değil ise\r\n\r\n <ul>\r\n <li>Örnek, Kullanıcı ve site isimleri müşteriyi ilgilendirmiyorsa, <code>Given site sahibi olarak giriş yaptım </code>olarak yazılabilir.</li>\r\n </ul>\r\n </li>\r\n <li style=\"text-align:justify\"><code>Background</code><span style=\"color:rgb(82, 82, 82); font-family:open sans,sans-serif; font-size:14px\"> </span>kısmı kısa tutulmalıdır ve çok olmamalıdır.</li>\r\n <li style=\"text-align:justify\"><code>Background</code><span style=\"color:rgb(82, 82, 82); font-family:open sans,sans-serif; font-size:14px\"> </span>kısmını canlı yap.\r\n <ul>\r\n <li>Renkli isimler kullanın ve hikayeyi anlatın. İnsan beyni hikayeleri <code>"User A"</code>, <code>"User B"</code>, <code>"Site 1" </code>bu şekilde isimlendirmeden daha sağlıklı aklında tutacaktır.</li>\r\n </ul>\r\n </li>\r\n</ul>\r\n\r\n<p> </p>\r\n\r\n<table class=\"is-size-6 table\" style=\"border-collapse:collapse; border-spacing:0px; box-sizing:inherit; color:rgb(54, 54, 54); font-family:blinkmacsystemfont,-apple-system,segoe ui,roboto,oxygen,ubuntu,cantarell,fira sans,droid sans,helvetica neue,helvetica,arial,sans-serif; font-size:16px; width:945.25px\">\r\n <thead>\r\n <tr>\r\n <th style=\"border-color:rgb(219, 219, 219); text-align:left; vertical-align:top\">English Keyword</th>\r\n <th style=\"border-color:rgb(219, 219, 219); text-align:left; vertical-align:top\">Turkish equivalent(s)</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>feature</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Özellik</code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>background</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Geçmiş</code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>scenario</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Senaryo</code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>scenarioOutline</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Senaryo taslağı</code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>examples</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Örnekler</code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>given</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Diyelim ki </code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>when</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Eğer ki </code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>then</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>O zaman </code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>and</code></td>\r\n <td style=\"border-color:rgb(219, 219, 219); vertical-align:top\"><code>Ve </code></td>\r\n </tr>\r\n <tr>\r\n <td style=\"vertical-align:top\"><code>but</code></td>\r\n <td style=\"vertical-align:top\"><code>Fakat,</code><code>Ama </code></td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n</div>\r\n', '2017-04-10 16:06:09', '2018-10-15 05:18:40', 23, 0),
(10, 'Appium Kütüphaneleri', 'appium_kutuphaneleri', 4, '<h2>Selenium için java kütüphaneleri</h2>\r\n\r\n<p><strong>1:</strong> <a href=\"http://www.seleniumhq.org/download/\">Bu link</a>ten Selenium'un sayfasına girerek <strong>“Selenium Client & WebDriver Language Bindings” </strong>alanından Hangi dil için yazılacaksa ona ait kütüphaneyi indirelim ve zip dosyasından çıkaralım.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/selenium-java-latest.png\" style=\"height:324px; width:600px\" /></p>\r\n\r\n<p><strong>2:</strong> İndirilen zip dosyasının içersinde aşağıdaki resimdeki gibi dosyalar olmalıdır ancak <strong>JAR </strong>isimelri indirdiğiniz versiyonlara bağlı olarak değişebilir. Genel olarak içerisinde <strong>lib</strong> isiminde bir klasör ve 2 adet <strong>JAR </strong>dosyası olmalıdır.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/selenium-java-latest(1).png\" style=\"height:161px; width:600px\" /></p>\r\n\r\n<h2>Appium için java kütüphaneleri</h2>\r\n\r\n<p><strong>1:</strong> <a href=\"http://appium.io/\">Bu link</a>ten Appium 'un sayfasına girerek Download kısmında <strong>h</strong>angi dil için yazılacaksa ona ait kütüphaneyi indirelim ve zip dosyasından çıkaralım.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/selenium-java-latest(2).png\" style=\"height:346px; width:400px\" /></p>\r\n\r\n<p><strong>2:</strong> <a href=\"https://search.maven.org/\">Bu link</a>'ten The Maven Central Repository sayfasına girerek ve arama kısmına <strong>"g:io.appium a:java-client</strong><strong>"</strong> yazarak appium için <em>java client</em> kütüphanemizi <strong>jar </strong>dosyası oalrak indirelim.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/selenium-java-latest(3).png\" style=\"height:232px; width:800px\" /></p>\r\n\r\n<h2><strong style=\"font-size:13px\">3:</strong><span style=\"font-size:13px\"> </span><a href=\"https://mvnrepository.com/artifact/junit/junit/4.12\" style=\"font-size: 13px;\">Bu link</a><span style=\"font-size:13px\">'ten JUnit maven kütüphanemizi jar dosyası olarak indirelim.</span></h2>\r\n\r\n<p><strong>4:</strong> Son olarak <a href=\"https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core/1.3\"><strong>hamcrest-core</strong></a> ve <a href=\"https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.7\"><strong>commons-lang</strong></a> isimerindeki 2 adet kütüphaneyi daha jar dosyası olarak indirmemiz gerekiyor.</p>\r\n', '2017-04-29 16:06:09', '2018-10-15 05:18:40', 22, 0),
(11, 'Eclipse\'te Appium için proje oluşturma', 'eclipsete_appium_icin_proje_olusturma', 4, '<h2>Eclipse'te yeni bir Java projesi açalım</h2>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/11/selenium-java-latest.png\" style=\"height:425px; width:500px\" /><img alt=\"\" src=\"/upload/images/11/selenium-java-latest(1).png\" style=\"height:384px; width:400px\" /></p>\r\n\r\n<p> </p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/11/selenium-java-latest(2).png\" style=\"height:493px; width:400px\" /><img alt=\"\" src=\"/upload/images/11/selenium-java-latest(3).png\" style=\"height:368px; width:550px\" /></p>\r\n\r\n<p> </p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/11/selenium-java-latest(4).png\" style=\"height:200px; width:450px\" /><img alt=\"\" src=\"/upload/images/11/selenium-java-latest(5).png\" style=\"height:332px; width:500px\" /></p>\r\n\r\n<p> </p>\r\n\r\n<p>Referans: <a href=\"http://www.automationtestinghub.com/appium-project-in-eclipse/\">http://www.automationtestinghub.com/</a></p>\r\n\r\n<p> </p>\r\n', '2017-07-19 16:06:09', '2018-10-15 05:18:40', 21, 0);
INSERT INTO `posts` (`id`, `title`, `slug`, `category_id`, `body`, `created_at`, `updated_at`, `sira`, `fixed`) VALUES
(12, 'Mobile Uygulamanın appPackage ve appActivity bilgilerini öğrenme', 'mobile_uygulamanin_apppackage_ve_appactivity_bilgilerini_ogrenme', 4, '<p><strong>appPackage ve appActivity isimleri nelerdir?</strong></p>\r\n\r\n<p><strong>appPackage</strong>: Kısaca, uygulamayı yazanların teknik ismi olarak özetlenebilir.<strong> Örnek;</strong> Youtube Android için appPackage ismi ‘<em>com.google.android.youtube</em>’. Facebook için ‘<em>com.facebook.katana</em>’, WhatsApp için ‘<em>com.whatsapp</em>’. Yani, Appium ile Facebook test edilmek istenirse ‘<em>com.facebook.katana</em>’ ismi kullanılmalıdır.</p>\r\n\r\n<p><strong>appActivity</strong>: Kısaca, uygulama tarafından sağlanan farklı işlevleri ifade eder. Örnek; Whatsapp, konuşmalar, profil bilgileri, profil fotoğrafı ayarlama, durum ayarı, bildirimler gibi birden fazla destekler. Tüm bu fonksiyonlar farklı appActivity tarafından sunulur.</p>\r\n\r\n<h2>SmartOffice uygulaması için appPackage ve appActivity isimlerini öğrenme</h2>\r\n\r\n<p>Telefonumuzu USB kablosu ile bilgisayara bağladıktan sonra, Konsol ekranına (<strong>Ctrl+r</strong> -> <strong>cmd</strong>) ile <strong>"adb devices" </strong>yazarak bağlı olduğunu görüyoruz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/12/selenium-java-latest.png\" style=\"height:213px; width:500px\" /></p>\r\n\r\n<p>Daha sonra aynı konsol ekranına "<strong>abd shell</strong>" yazarak telefona emülatör olarak bağlanıyoruz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/12/selenium-java-latest(1).png\" style=\"height:215px; width:500px\" /></p>\r\n\r\n<p>Daha sonra android telefonumuzda <em>appPackage </em>ve <em>appActivity </em>isimlerini öğrenmek istediğimiz uygulamayı açıyoruz ve açıldıktan sonra konsol ekranına "<strong>dumpsys window windows | grep -E 'mCurrentFocus'"</strong> şu komutu yazıyoruz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/12/selenium-java-latest(2).png\" style=\"height:86px; width:790px\" /></p>\r\n\r\n<p><strong>mCurrentFocus=Window{b4f76dcd0 u0 com.genband.smartoffice/com.genband.omni.mobile.MainActivity}</strong></p>\r\n\r\n<p><strong>appPackage</strong>: com.genband.smartoffice</p>\r\n\r\n<p><strong>appActivity</strong>: com.genband.omni.mobile.MainActivity</p>\r\n\r\n<p> </p>\r\n\r\n<h2>Wifi Üzerinden Android cihazı Appium ile çalıştırmak;</h2>\r\n\r\n<ol>\r\n <li>\r\n <p>İlk olarak telefonu kablo ile bilgisayara bağlayalım ve konsol ekranından "<strong>adb devices</strong>" yazarak bağlı olduğunu görelim.</p>\r\n </li>\r\n <li>\r\n <p>PC ile Android cihaz aynı internet ağına bağlı olmalı</p>\r\n </li>\r\n <li>\r\n <p>Android cihazımızın ip adresini öğrenelim.</p>\r\n </li>\r\n <li>\r\n <p>Konsol ekranından "<strong>adb connect ip_adresi</strong>" yazarak telefonumuzu kablo olmadan bilgisayarımıza bağlayalım.</p>\r\n </li>\r\n</ol>\r\n', '2017-08-12 16:06:09', '2018-10-15 05:18:40', 20, 0),
(13, 'Appium ile İlk Test', 'appium_ile_İlk_test', 4, '<ul>\r\n <li>Oluşturduğumuz ilk Eclipse projemizi açalım.</li>\r\n</ul>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/13/selenium-java-latest.png\" style=\"height:167px; width:200px\" /></p>\r\n\r\n<ul>\r\n <li><strong>tests </strong>isminde paket ve içerisine <strong>AppiumTest.java</strong> oluşturalım.</li>\r\n</ul>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/13/selenium-java-latest(1).png\" style=\"height:164px; width:500px\" /></p>\r\n\r\n<pre>\r\n<code class=\"language-java\">package tests;\r\n \r\nimport java.net.MalformedURLException;\r\nimport java.net.URL;\r\n \r\nimport org.openqa.selenium.remote.DesiredCapabilities;\r\nimport io.appium.java_client.AppiumDriver;\r\nimport io.appium.java_client.MobileElement;\r\nimport io.appium.java_client.android.AndroidDriver;\r\n \r\npublic class AppiumTest {\r\n \r\n public static void main(String[] args) {\r\n \r\n //Set the Desired Capabilities\r\n DesiredCapabilities caps = new DesiredCapabilities();\r\n caps.setCapability(\"deviceName\", \"My Phone\");\r\n caps.setCapability(\"udid\", \"ENUL6303030010\"); //Give Device ID of your mobile phone\r\n caps.setCapability(\"platformName\", \"Android\");\r\n caps.setCapability(\"platformVersion\", \"6.0\");\r\n caps.setCapability(\"appPackage\", \"com.android.vending\");\r\n caps.setCapability(\"appActivity\", \"com.google.android.finsky.activities.MainActivity\");\r\n caps.setCapability(\"noReset\", \"true\");\r\n \r\n //Instantiate Appium Driver\r\n try {\r\n AppiumDriver driver = new AndroidDriver(new URL(\"http://0.0.0.0:4723/wd/hub\"), caps);\r\n \r\n } catch (MalformedURLException e) {\r\n System.out.println(e.getMessage());\r\n }\r\n }\r\n \r\n}</code></pre>\r\n\r\n<p> </p>\r\n\r\n<p>a </p>\r\n\r\n<ul>\r\n</ul>\r\n', '2017-08-26 16:06:09', '2018-10-15 05:18:40', 19, 0),
(14, 'Android Cihazda Chrome Tarayıcı Çalıştırma', 'android_cihazda_chrome_tarayici_calistirma', 4, '<ul>\r\n <li>Appium Server'ı çalıştırıyoruz</li>\r\n <li>Android cihazımızı bilgisayara <a href=\"http://anilsenocak.tk/post/mobile_uygulamanin_apppackage_ve_appactivity_bilgilerini_ogrenme\">wifi veya kablo</a> üzerinden bağlıyoruz.</li>\r\n <li>Daha önce oluşturduğumuz Eclipse projemiz içersindeki <strong>test </strong>paketinin altına <strong>ChromeTest.java</strong> isminde yeni bir java dosyası oluşturuyoruz.</li>\r\n <li><a href=\"/upload/files/chromedriver.rar\">ChromeDriver</a>'ı indiriyoruz.</li>\r\n</ul>\r\n\r\n<pre>\r\n<code class=\"language-java\">\r\npackage tests;\r\n\r\nimport java.net.MalformedURLException;\r\nimport java.net.URL;\r\n\r\nimport org.openqa.selenium.remote.DesiredCapabilities;\r\nimport io.appium.java_client.AppiumDriver;\r\nimport io.appium.java_client.MobileElement;\r\nimport io.appium.java_client.android.AndroidDriver;\r\n\r\npublic class ChromeTest {\r\n\r\n public static void main(String[] args) {\r\n \r\n //Set the Desired Capabilities\r\n DesiredCapabilities caps = new DesiredCapabilities();\r\n caps.setCapability(\"deviceName\", \"My Phone\");\r\n caps.setCapability(\"udid\", \"ip_adresi\"); //Give Device ID of your mobile phone\r\n caps.setCapability(\"platformName\", \"Android\");\r\n caps.setCapability(\"platformVersion\", \"7.0\");\r\n caps.setCapability(\"browserName\", \"Chrome\");\r\n caps.setCapability(\"noReset\", true);\r\n \r\n //Set ChromeDriver location\r\n System.setProperty(\"webdriver.chrome.driver\",\"C:\\\\chromedriver.exe\");\r\n \r\n //Instantiate Appium Driver\r\n AppiumDriver<MobileElement> driver = null;\r\n try {\r\n driver = new AndroidDriver<MobileElement>(new URL(\"http://127.0.0.1:4723/wd/hub\"), caps);\r\n \r\n } catch (MalformedURLException e) {\r\n System.out.println(e.getMessage());\r\n }\r\n \r\n //Open URL in Chrome Browser\r\n driver.get(\"http://anilsenocak.tk\");\r\n }\r\n}</code></pre>\r\n\r\n<ul>\r\n <li><strong>ip_adresi </strong>yazan yere konsol ekranından <strong><em>adb devices</em></strong> yazdıktan sonra çıkan <em>uuid </em>bilgisini yazıyoruz.(wifi üzerinden bağlanmış ise <em>ip_adresi:port_numarası</em> şeklinde çıkacaktır)</li>\r\n <li>Projemizi kaydedip çalıştırdıktan sonra Android cihazımızdan chrome tarayıcının açıldığını göreceğiz.</li>\r\n</ul>\r\n', '2018-01-20 16:06:09', '2018-10-15 05:18:40', 18, 0),
(15, 'Appium Inspectors', 'appium_inspectors', 4, '<p><strong>UIAutomatorViewer;</strong></p>\r\n\r\n<p><strong>CMD </strong>ekranında UIAutomatorViewer yazarak uygulamayı açalım ve hangi uygulamanın içersindekileri incelemek için uygulamayı açalım</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/15/type-uiautomatorviewer-in-cmd.png\" style=\"height:183px; width:541px\" /></p>\r\n\r\n<p>Biraz bekledikten sonra Device Screenshot kısmında ekran görüntüsünü inceleyebiliriz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/15/type-uiautomatorviewer-in-cmd(1).png\" style=\"height:486px; width:481px\" /></p>\r\n', '2018-03-14 16:06:09', '2018-10-15 05:18:40', 17, 0),
(16, 'Selenium Cheat Sheets', 'selenium_cheat_sheets', 1, '<ol>\r\n <li>\r\n <p>Open a browser</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"># start an instance of firefox with selenium-webdriver\r\ndriver = Selenium::WebDriver.for :firefox\r\n# :chrome -> chrome\r\n# :ie -> iexplore\r\n</code></pre>\r\n </li>\r\n</ol>\r\n\r\n<ul>\r\n <li>\r\n <p>Go to a specified URL</p>\r\n\r\n <pre>\r\n<code class=\"language-java\">driver.get \'http://google.com\'\r\ndriver.navigate.to \'http://google.com\'\r\n</code></pre>\r\n\r\n <p><code>NOTE</code> -- the WebDriver may not wait for the page to load, you'd better using explicit and implicit waits.</p>\r\n </li>\r\n <li>\r\n <p>Locating Elements</p>\r\n\r\n <ul>\r\n <li>\r\n <p><code>find_element</code> -- Find the first element matching the given arguments.</p>\r\n </li>\r\n <li>\r\n <p><code>find_elements</code> -- Find all elements matching the given arguments</p>\r\n </li>\r\n <li>\r\n <p>By ID</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"><input id=\"q\">...</input> #example html \r\n\r\nelement = driver.find_element(:id, \"q\")\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>By Class Name</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"><div class=\"highlight-java\" style=\"display: none; \">...</div> # example html\r\n\r\nelement = driver.find_element(:class, \'highlight-java\')\r\n# or\r\nelement = driver.find_element(:class_name, \'highlight-java\')\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>By Tag Name</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"><div class=\"highlight-java\" style=\"display: none; \">...</div> #example html\r\n\r\nelement = driver.find_element(:tag_name, \'div\')\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>By Name</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"><input id=\"q\" name=\'search\' type=\'text\'>…</input> #example html\r\n\r\nelement = driver.find_element(:name, \'search\')\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>By Link Text</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"><a href=\"http://www.google.com/search?q=cheese\">cheese</a> # example html\r\n\r\nelement = driver.find_element(:link, \'cheese\')\r\n# or \r\nelement = driver.find_element(:link_text, \'cheese\')\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>By Partial Link Text</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"><a href=\"http://www.google.com/search?q=cheese\">search for cheese</a> # example html\r\nelement = driver.find_element(:partial_link_text, \'cheese\') \r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>By XPath</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"># <ul class=\"dropdown-menu\">\r\n# <li><a href=\"/login/form\">Login</a></li>\r\n# <li><a href=\"/logout\">Logout</a></li>\r\n# </ul>\r\n\r\nelement = driver.find_element(:xpath, \'//a[@href=\'/logout\']\')\r\n</code></pre>\r\n\r\n <ul>\r\n <li>\r\n <p><code>NOTE</code> -- When using Element#find_element with <code>:xpath</code>, be aware that,</p>\r\n\r\n <ul>\r\n <li>webdriver follows standard conventions: a search prefixed with "//" will search the entire document, not just the children of this current node.</li>\r\n <li>Use ".//" to limit your search to the children of the receiving Element.</li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <p>By CSS Selector</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"># <div id=\"food\">\r\n# <span class=\"dairy\">milk</span>\r\n# <span class=\"dairy aged\">cheese</span>\r\n# </div>\r\n \r\nelement = driver.find_element(:css, #food span.dairy)\r\n</code></pre>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <p>Element's operation</p>\r\n\r\n <ul>\r\n <li>\r\n <p>Button/Link/Image</p>\r\n\r\n <pre>\r\n<code class=\"language-java\">driver.find_element(:id, \'BUTTON_ID).click\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>Text Filed</p>\r\n\r\n <pre>\r\n<code class=\"language-java\">driver.find_element(:id, \'TextArea\').send_keys \'InputText\' # input some text\r\n# send keyboard actions, press `ctral+a` & `backspace`\r\ndriver.find_element(:id, \'TextArea\').send_keys [:contol, \'a\'], :backspace\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>Checkbox/Radio</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"># check if it is selected\r\ndriver.find_element(:id, \'CheckBox\').selected?\r\n# select the element\r\ndriver.find_element(:id, \'CheckBox\').click\r\n# deselect the element\r\ndriver.find_element(:id, \'CheckBox\').clear\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>Select</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"># get the select element \r\nselect = driver.find_element(:tag_name, \"select\")\r\n# get all the options for this element\r\nall_options = select.find_elements(:tag_name, \"option\")\r\n# select the options\r\nall_options.each do |option|\r\n puts \"Value is: \" + option.attribute(\"value\")\r\n option.click\r\nend\r\n\r\n# anthoer way is using the Select class after seleniun-webdriver 2.14 \r\nelement= driver.find_element(:tag_name,\"select\")\r\nselect=Selenium::WebDriver::Support::Select.new(element)\r\nselect.deselect_all()\r\nselect.select_by(:text, \"Edam\")\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>visibility</p>\r\n\r\n <pre>\r\n<code class=\"language-java\">driver.find_element(:id,\'Element\').displayed?\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>get text</p>\r\n\r\n <pre>\r\n<code class=\"language-java\">driver.find_element(:id,\'Element\').text\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>get attribue</p>\r\n\r\n <pre>\r\n<code class=\"language-java\">driver.find_element(:id, \'Element\').attribute(\'class\')\r\n</code></pre>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <p>Driver's operation</p>\r\n\r\n <ul>\r\n <li>\r\n <p>execute javascript</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"> driver.execute_script(\"return window.location.pathname\")\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>wait for a specific element to show up</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"> # set the timeout to 10 seconds\r\n wait = Selenium::WebDriver::Wait.new(:timeout => 10)\r\n # wait 10 seconds until the element appear\r\n wait.until { driver.find_element(:id => \"foo\") }\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>implicit waits</p>\r\n </li>\r\n </ul>\r\n\r\n <p>An implicit wait is to tell WebDriver to poll the DOM for a certain amount of time when trying to find an element or elements if they are not immediately available</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"> driver = Selenium::WebDriver.for :firefox\r\n # set the timeout for implicit waits as 10 seconds\r\n driver.manage.timeouts.implicit_wait = 10\r\n \r\n driver.get \"http://somedomain/url_that_delays_loading\"\r\n element = driver.find_element(:id => \"some-dynamic-element\")\r\n</code></pre>\r\n\r\n <ul>\r\n <li>\r\n <p>switch between frames</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"> # switch to a frame\r\n driver.switch_to.frame \"some-frame\" # name or id\r\n driver.switch_to.frame driver.find_element(:id, \'some-frame\') # frame element\r\n \r\n # switch back to the main document\r\n driver.switch_to.default_content\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>swich between windows</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"> driver.window_handles.each do |handle|\r\n driver.switch_to.window handle\r\n end\r\n</code></pre>\r\n </li>\r\n <li>\r\n <p>handle javascript dialog</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"> # get the alert\r\n a = driver.switch_to.alert\r\n # operation on the alert\r\n if a.text == \'A value you are looking for\'\r\n a.dismiss\r\n else\r\n a.accept\r\n end\r\n</code></pre>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <p>Cookies</p>\r\n\r\n <ul>\r\n <li>\r\n <p>Delete cookies</p>\r\n\r\n <pre>\r\n<code class=\"language-java\"> # You can delete cookies in 2 ways\r\n # By name\r\n driver.manage.delete_cookie(\"CookieName\")\r\n # Or all of them\r\n driver.manage.delete_all</code></pre>\r\n </li>\r\n </ul>\r\n </li>\r\n</ul>\r\n\r\n<p> </p>\r\n\r\n<p><iframe frameborder=\"0\" height=\"500\" scrolling=\"no\" src=\"/upload/files/1.pdf\" width=\"500\"></iframe><iframe frameborder=\"0\" height=\"500\" scrolling=\"no\" src=\"/upload/files/3.pdf\" width=\"500\"></iframe></p>\r\n\r\n<p> </p>\r\n', '2018-05-20 16:06:09', '2018-10-15 05:18:40', 16, 0),
(17, '15 Cucumber Soruları & Cevapları', '15_cucumber_sorulari___cevaplari', 3, '<p><strong>1) Cucumber nedir ve avantajları nelerdir?</strong></p>\r\n\r\n<p>Düz bir metinde yazılmış fonksiyonel testleri çalıştırmak için Cuucmber aracı kullanılır. Ruby programlama dilinde yazılmıştır.</p>\r\n\r\n<p><strong>Advantajları</strong></p>\r\n\r\n<ul>\r\n <li>\r\n <p>Kodlayamayan iş paydaşlarını çözebilirsiniz.</p>\r\n </li>\r\n <li>\r\n <p>Son kullanıcı deneyimi önceliklidir.</p>\r\n </li>\r\n <li>Tekrarlanabilir kod kullanımı</li>\r\n</ul>\r\n\r\n<p><strong>2) Cucumber test senaryosunu çalıştırmak için hangi 2 dosya gereklidir?</strong></p>\r\n\r\n<ul>\r\n <li>Features</li>\r\n <li>Step Definition</li>\r\n</ul>\r\n\r\n<p><strong>3) Cucumber'daki feature dosaysı nedir? Ne içerir?</strong></p>\r\n\r\n<p>Feature dosyası, cucumber'daki kodun yürütülmesi için gerekli parametrelerden veya koşullardan oluşur</p>\r\n\r\n<ul>\r\n <li>Feature</li>\r\n <li>Scenario</li>\r\n <li>Scenario Outline</li>\r\n <li>Given</li>\r\n <li>When</li>\r\n <li>Then</li>\r\n</ul>\r\n\r\n<p><strong>4) Düz metinde davranışa dayalı test örneği yazın?</strong></p>\r\n\r\n<ul>\r\n <li><strong>Feature: </strong>Visit <strong>XYZ</strong> page in abc.com</li>\r\n <li><strong>Scenario</strong><strong> : </strong>Visit abc.com</li>\r\n <li><strong>Given:</strong> I am on abc.com</li>\r\n <li><strong>When: </strong>I click on XYZ page</li>\r\n <li><strong>Then: </strong>I should see ABC page</li>\r\n</ul>\r\n\r\n<p><strong>5) Feature dosyasında senaryo anahatının ne olduğunu açıklayınız.</strong></p>\r\n\r\n<p><strong>Senaryo Anahatı</strong>: Senaryo taslağını kullanarak birden çok veri kümesi için aynı senaryo yürütülebilir. Veriler, (I I) ile ayrılan bir tabular yapı tarafından sağlanır. </p>\r\n\r\n<p><strong>6) Step Definition Nedir?</strong></p>\r\n\r\n<p>Step Definition, özellik dosyasında belirtilen özelliğin gerçek kod uygulamasıdır.</p>\r\n\r\n<p><strong>7) “Given” fonksiyonu kullanarak step definition örneği yazınız.</strong></p>\r\n\r\n<p>Kullanıcı Yahoo sitesine girişi için;</p>\r\n\r\n<p>Given (/^ I am on www.yahoo.com$/) do</p>\r\n\r\n<p>Browser.goto “http://www.yahoo.com”</p>\r\n\r\n<p>end – This will visit www.yahoo.com</p>\r\n\r\n<p><strong>8) Jbehave ve Cucumber farkı nedir?</strong></p>\r\n\r\n<p>Cucumber ve Jbehave aynı amaç için olsalar da tamamen farklı bir framework yapısına sahiplerdir.</p>\r\n\r\n<ul>\r\n <li>Jbehave, Java tabanlı. Cucumber, Ruby tabanlıdır.</li>\r\n <li>Jbehave, hikayaleri temel alır.Cucumber, özellikleri tanımlıdır.</li>\r\n</ul>\r\n\r\n<p><strong>9) Explain what is test harness?</strong></p>\r\n\r\n<p>A test harness for cucumber and rspec allows for separating responsibility between setting up the context and interacting with the browser and cleaning up the step definition files</p>\r\n\r\n<p><strong>10) Explain when to use Rspec and when to use Cucumber?</strong></p>\r\n\r\n<ul>\r\n <li>Rspec is used for Unit Testing</li>\r\n <li>Cucumber is used behaviour driven development. Cucumber can be used for System and Integration Tests</li>\r\n</ul>\r\n\r\n<p><strong>11) What is the language used for expressing scenario in feature file ?</strong></p>\r\n\r\n<p>Gherkin language is used to express scenario in feature files and ruby files containing unobtrusive automation for the steps in scenarios</p>\r\n\r\n<p><strong>12) Explain what is regular expressions?</strong></p>\r\n\r\n<p>A regular expression is a pattern describing a certain amount of text. The most basic regular expression consists of a single literal character</p>\r\n\r\n<p><strong>13) Explain what is BDD (Behaviour Driven Development) ?</strong></p>\r\n\r\n<p>BDD or Behaviour driven development is a process of developing software based on TDD (Test Driven Development) which focusses on behavioural specification of software units.</p>\r\n\r\n<p><strong>14) What softare do you need to run a Cucumber Web Test ?</strong></p>\r\n\r\n<ul>\r\n <li>Ruby and its Development Kit</li>\r\n <li>Cucumber</li>\r\n <li>IDE like ActiveState</li>\r\n <li>Watir ( To simulate browser)</li>\r\n <li>Ansicon and rspec (if required)</li>\r\n</ul>\r\n\r\n<p><strong>15) What does a features/ support file contains?</strong></p>\r\n\r\n<p>Features/ support file contains supporting ruby code. Files in support load before those in step_definitions, which can be useful for environment configuration.</p>\r\n\r\n<p><a href=\"https://career.guru99.com/top-15-cucumber-interview-questions/?format=pdf\" onclick=\"ga(\'send\',\'event\',\'download\',\'PDF\',\'PDF Downloaded\');\" rel=\"nofollow\" target=\"_blank\" title=\"Download PDF\"><img alt=\"Download PDF\" src=\"https://career.guru99.com/wp-content/plugins/wp-post-to-pdf-enhanced/asset/images/pdf.png\" /> Download PDF</a></p>\r\n', '2018-06-24 16:06:09', '2018-10-15 05:18:40', 15, 0),
(18, 'Temiz Kod Yazımı', 'temiz_kod_yazimi', 7, '<h3><strong>Mantıklı ve anlamlı değişken isimleri kullanın.</strong></h3>\r\n\r\n<pre>\r\n<code class=\"language-php\">$ymdstr = $moment->format(\'y-m-d\');</code></pre>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$currentDate = $moment->format(\'y-m-d\');</code></pre>\r\n\r\n<h3><strong>Aynı değişken türleri için aynı kelime hazinesi kullanın.</strong></h3>\r\n\r\n<pre>\r\n<code class=\"language-php\">getUserInfo();\r\ngetUserData();\r\ngetUserRecord();\r\ngetUserProfile();</code></pre>\r\n\r\n<ol>\r\n</ol>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">getUser();</code></pre>\r\n\r\n<h3><strong>Aranabilen isimler kullanın.</strong></h3>\r\n\r\n<pre>\r\n<code class=\"language-php\">$result = $serializer->serialize($data, 448); // What the heck is 448 for?</code></pre>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$json = $serializer->serialize($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);</code></pre>\r\n\r\n<p>-----</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">if ($user->access & 4) {\r\n // What the heck is 4 for?\r\n}</code></pre>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">class User{\r\n const ACCESS_READ = 1;\r\n const ACCESS_CREATE = 2;\r\n const ACCESS_UPDATE = 4;\r\n const ACCESS_DELETE = 8;\r\n}\r\nif ($user->access & User::ACCESS_UPDATE) {\r\n // do edit ...\r\n}</code></pre>\r\n\r\n<h3><strong>Gereksiz içerikleri ekleme.</strong></h3>\r\n\r\n<pre>\r\n<code class=\"language-php\"><?php\r\nclass Car{\r\n public $carMake;\r\n public $carModel;\r\n public $carColor;\r\n\r\n //...\r\n}\r\n</code></pre>\r\n\r\n<h4>yerine,</h4>\r\n\r\n<pre>\r\n<code class=\"language-php\"><?php\r\nclass Car{\r\n public $make;\r\n public $model;\r\n public $color;\r\n\r\n //...\r\n}\r\n</code></pre>\r\n\r\n<h3><strong>2 veya daha az fonksiyon parametresi kullanın.</strong></h3>\r\n\r\n<pre>\r\n<code class=\"language-php\"><?php\r\nfunction createMenu($title, $body, $buttonText, $cancellable) {\r\n // ...\r\n}\r\n</code></pre>\r\n\r\n<h4>yerine,</h4>\r\n\r\n<pre>\r\n<code class=\"language-php\"><?php\r\nclass MenuConfig{\r\n public $title;\r\n public $body;\r\n public $buttonText;\r\n public $cancellable = false;\r\n}\r\n\r\n$config = new MenuConfig();\r\n$config->title = \'Foo\';\r\n$config->body = \'Bar\';\r\n$config->buttonText = \'Baz\';\r\n$config->cancellable = true;\r\n\r\nfunction createMenu(MenuConfig $config) {\r\n // ...\r\n}\r\n</code></pre>\r\n\r\n<h3><strong>Fonksiyonalr tek birşey olmalıdır.</strong></h3>\r\n\r\n<pre>\r\n<code class=\"language-php\"><?php\r\nfunction emailClients($clients) {\r\n foreach ($clients as $client) {\r\n $clientRecord = $db->find($client);\r\n if ($clientRecord->isActive()) {\r\n email($client);\r\n }\r\n }\r\n}\r\n</code></pre>\r\n\r\n<h4>yerine,</h4>\r\n\r\n<pre>\r\n<code class=\"language-php\">function emailClients($clients) {\r\n $activeClients = activeClients($clients);\r\n array_walk($activeClients, \'email\');\r\n}\r\n\r\nfunction activeClients($clients) {\r\n return array_filter($clients, \'isClientActive\');\r\n}\r\n\r\nfunction isClientActive($client) {\r\n $clientRecord = $db->find($client);\r\n return $clientRecord->isActive();\r\n}\r\n</code></pre>\r\n\r\n<p>Daha fazla detay ve içerik için; <a href=\"/~https://github.com/jupeter/clean-code-php/blob/master/README.md\" target=\"_blank\">clean-code</a></p>\r\n', '2018-09-27 03:33:14', '2018-10-15 05:18:40', 14, 0),
(19, 'Laravel Nedir?', 'laravel_nedir_', 7, '<p>Laravel, PHP dili ile yazılmış, güçlü bir frameworkdür. Taylor Otwell önderliğinde geliştirmektedir. Söz dizimi basit ve anlamlıdır. Bu sebeple öğrenmesi daha kolaydır. Laravel içinde birçok yapıyı ve özelliği barındırır. Bunun sonucunda basit web uygulamalarında ya da karmaşık web sayfalarında rahatlıkla kullanılabilir. Laravel’in sloganı “<strong>The PHP Framework For Web Artisans</strong>” yani “Web sanatçılarının PHP Frameworküdür.</p>\r\n\r\n<p>Laravel, profesyonel ya da amatör web geliştiricileri tarafından kullanılabilir. OOP yapısı sebebiyle daha derli toplu, temiz, okunabilir kod yazılmasına olanak sağlar.</p>\r\n\r\n<p>Laravel ile geliştirme yapmaya başlamak için, HTML/CSS bilgisine ve orta seviye PHP bilgisine ihtiyaç vardır. </p>\r\n\r\n<h3><strong>Önemli Bilgiler</strong></h3>\r\n\r\n<ol>\r\n <li>Bağımlılık yöneticisi (Dependency Manager) olarak <a href=\"https://tr.wikipedia.org/wiki/Composer\" rel=\"nofollow\" target=\"_blank\"><strong>Composer</strong></a> kullanır.</li>\r\n <li>İçinde <a href=\"https://laravel.com/docs/5.4/eloquent\" rel=\"nofollow\" target=\"_blank\"><strong>Eloquent ORM</strong></a> (Object Relational Mapping)’yi barındırır. Bu yapıda veritabanındaki her bir tabloya karşılık gelen bir model sınıfı bulunur. Bu sayede uzun sorgu cümleleri yerine çok daha basit şekilde veritabanı sorguları yapmanızı sağlar. Ayrıca farklı veritabanlarından (Mysql, PostgreSql, MongoDB vb.) sorgularınızda değişiklik yapmadan sorgu yapabilme imkânı sunar.</li>\r\n <li>Template engine olarak “<a href=\"https://laravel.com/docs/5.4/blade#introduction\" rel=\"nofollow\" target=\"_blank\"><strong>Blade</strong></a>” kullanmaktadır. MVC(Model, View, Controller) mimarisinde View (V) kısmında denk gelmektedir. Bu yapı sayesinde php ve html kodlarımızı birbirinden ayırma imkanı sağlar.</li>\r\n <li>Gelişmiş <strong>routing</strong> yapısı sayesinde URL yapınızı hızlı ve kolay bir şekilde filtreleyebilir, controllera yönlendirebilirsiniz.</li>\r\n <li>Laravelin içerisinde kimlik doğrulama (<strong>Authentication</strong>) yapısı hazır olarak bulunmaktadır. Sadece birkaç komut yardımıyla <em>login/logout/register </em>gibi kullanıcı işlemleri uygulamanıza dahil edilebilir.</li>\r\n <li>Sadece birkaç satır kod ile verileri otomatik sayfalama (<strong>Pagination</strong>) özelliği bulunmaktadır.</li>\r\n <li>Form ve veri girişi kısımlarında bütünleşik <a href=\"https://tr.wikipedia.org/wiki/XSRF\" rel=\"nofollow\" target=\"_blank\"><strong>CSRF</strong></a> koruması bulunmaktadır.</li>\r\n <li>Migration ve seeder yapısıyla veritabanında tablo oluşturma, versiyonlama ve veri girişi işlemleri daha basit şekilde yönetilebilir.</li>\r\n <li>Yapısında birçok “<a href=\"https://symfony.com/\" rel=\"nofollow\" target=\"_blank\"><strong>symfony framework</strong></a>” bileşenini barındırmaktadır. Ama Laravel öğrenmemiz için bizim symfony framework bilmemize gerek yoktur.</li>\r\n</ol>\r\n\r\n<h3><strong>Laravel için sunucu gereklilikleri nelerdir?</strong></h3>\r\n\r\n<ol>\r\n <li>PHP >= 5.6.4</li>\r\n <li>OpenSSL PHP Extension</li>\r\n <li>PDO PHP Extension</li>\r\n <li>Mbstring PHP Extension</li>\r\n <li>Tokenizer PHP Extension</li>\r\n <li>XML PHP Extension</li>\r\n</ol>\r\n\r\n<p>Belirli bir PHP versiyonuna ve belirli modüllere ihtiyacımız bulunmaktadır. Peki, biz bu gereklilikleri nasıl sağlayacağız?</p>\r\n\r\n<ol>\r\n <li>Bunun için “<a href=\"https://laravel.com/docs/5.4/homestead\" rel=\"noopener nofollow\" target=\"_blank\">Laravel Homestead</a>” kullanabilirsiniz. Bu hepsi bir arada (all in one) bir çözümdür.</li>\r\n <li>PHP’yi kendiniz kurabilirsiniz.</li>\r\n <li>Wamp/Xammp gibi bir çözüm kullanabilirsiniz.</li>\r\n</ol>\r\n\r\n<p> </p>\r\n\r\n<hr />\r\n<h2><strong>Laravel Eğitim Serisi</strong></h2>\r\n\r\n<ul>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_kurulumu\" target=\"_blank\">Laravel Kurulumu</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_uygulama_yapisi\" target=\"_blank\">Laravel Uygulama Yapısı</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_konfigurasyonu\" target=\"_blank\">Laravel Konfigürasyonu</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_route_sistemi\" target=\"_blank\">Laravel Route Sistemi</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_controller_yapisi\" target=\"_blank\">Laravel Controller Yapısı</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_controller_veri_aktarimi\" target=\"_blank\">Laravel Controller Veri Aktarımı</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_blade_templates\" target=\"_blank\">Laravel Blade Templates</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/laravel_model_yapisi\" target=\"_blank\">Laravel Model Yapısı</a></p>\r\n </li>\r\n</ul>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-27 05:16:33', '2018-10-11 09:14:21', 3, 1),
(20, 'Laravel Kurulumu', 'laravel_kurulumu', 7, '<ul>\r\n <li><a href=\"https://www.apachefriends.org/tr/index.html\" target=\"_blank\">XAMPP</a> veya <a href=\"http://www.wampserver.com/en/\" target=\"_blank\">WAMP</a> kurulumunu gerçekleştiriyoruz<a href=\"https://www.mobilhanem.com/wamp-server-kurulumu-ve-merhaba-dunya/\" rel=\"noopener\" target=\"_blank\">.</a></li>\r\n <li><a href=\"https://getcomposer.org/download/\" target=\"_blank\">Composer</a>'i kuruyoruz.</li>\r\n <li><a href=\"https://laravel.com/\" target=\"_blank\">Laravel</a>'i kuruyoruz.</li>\r\n</ul>\r\n\r\n<p>Öncelikle Laravel’i kurmak istediğiniz dizine geçip aşağıdaki kodlardan dilediğimizi çalıştırıyoruz.</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-bash\">cd c:\\wamp\\www</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>Dizine geçiyoruz.</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-bash\">composer create-project --prefer-dist laravel/laravel proje_ismi</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>Proje'yi oluşturduğumuz dizine geçiyoruz.</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-bash\">cd proje_ismi</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>Laravel projemizi çalıştırıyoruz.</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-bash\">php artisan serve</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p><a href=\"http://127.0.0.1:8000/\" rel=\"nofollow\">http://127.0.0.1:8000/</a> adresinden kurmuş olduğumuz Laravel’e ulaşabiliyoruz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/laravel-development-environment-1024x481.jpg\" style=\"height:423px; width:900px\" /></p>\r\n\r\n<ul>\r\n</ul>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-27 07:45:57', '2018-10-15 05:18:40', 13, 0),
(21, 'Laravel Uygulama Yapısı', 'laravel_uygulama_yapisi', 7, '<h3><strong>Laravel Anadizin Yapısı</strong></h3>\r\n\r\n<ul>\r\n <li><strong>app: </strong>Bu klasör içerisinde uygulamanın asıl kodları bulunacaktır.</li>\r\n <li><strong>bootstrap: </strong>Uygulamanın autoload ve cache (önbellek) kısımlarını barındırmaktadır.</li>\r\n <li><strong>config: </strong>Uygulamanın ayar dosyaları bu klasörde bulunmaktadır.</li>\r\n <li><strong>database: </strong>Veritabanı operasyonları için kullanılan “Seeds” ve “Migrations” bu klasörde bulunmaktadır.</li>\r\n <li><strong>public: </strong>Bu klasör uygulamanın “document root” kısmıdır. Laravel’in çalışmasını başlatır ayrıca “Assets” (Javascrip, CSS, Resimler vb.) kısmını barındırır.</li>\r\n <li><strong>resources: </strong>Bu klasörde herhangi bir işlem yapılmamış (Sıkıştırma, Birleştirme, Gizleme vs) dosyalar, view (görünüm) dosyaları ve dil dosyaları bulunmaktadır.</li>\r\n <li><strong>storage: </strong>Bu klasör uygulamanın depolama alanıdır. İçerisinde, dosya yüklemelerini, önbellekleme (cache) dosyalarını ve uygulamanın log dosyalarını barındırır.</li>\r\n <li><strong>tests: </strong>Bu klasör test dosyalarını barındırır.</li>\r\n <li><strong>vendor: </strong>Bu klasörde uygulamanın “Composer Dependencies” (paket bağımlılıkları) bulunmaktadır.</li>\r\n</ul>\r\n\r\n<h3><strong>Laravel App Klasörü Yapısı</strong></h3>\r\n\r\n<p>Uygulamamızın ana klasörü burasıdır diyebiliriz. Ayrıca içerisinde birçok ek klasör bulunmaktadır.</p>\r\n\r\n<ul>\r\n <li><strong>Console:</strong> Tüm “artisan” komutları bu klasörde bulunmaktadır.</li>\r\n <li><strong>Http:</strong> “Controllers”, “Middleware”, “Request” bu klasörde bulunmaktadır.</li>\r\n <li><strong>Exceptions:</strong> Özel “Exception Handlers” bu klasörde bulunmaktadır.</li>\r\n <li><strong>Providers: </strong> “Providers” (Servis Sağlayıcılar) bu klasörde bulunmaktadır.</li>\r\n</ul>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-27 08:29:21', '2018-10-15 05:18:40', 12, 0),
(22, 'Laravel Konfigürasyonu', 'laravel_konfigurasyonu', 7, '<h3><strong>Kurulum Sonrası Kontroller</strong></h3>\r\n\r\n<p>Öncelikle, Laravel kurulumundan sonra yapmamız gereken birkaç kontrol ve işlem bulunmaktadır.</p>\r\n\r\n<ol>\r\n <li>Ana dizinde bulunan “<em>storage</em>” ve “<em>bootstrap/cache</em>” klasörlerinin yazma izni kontrolü yapılmadır, yazma izni yoksa yazma izni verilmelidir.</li>\r\n <li>“<strong>php artisan key:generate</strong>” komutu ile uygulama anahtarı oluşturulmalıdır. Bu anahtar session ve diğer şifrelenmiş verilerin güvenliğinde kullanılacaktır.</li>\r\n <li>Ana dizinde “<em>.env</em>” dosyası olup olmadığı kontrolü yapılmadır. Bu dosya composer ile kurulumda yada “<strong>php artisan key:generate</strong>” komutuyla otomatik olarak oluşmalıdır. Eğer yoksa “<em>.env.example</em>” dosyasının adı “<em>.env</em>” yapılıp, “<strong>php artisan key:generate</strong>” komutu tekrar çalıştırılmalıdır.</li>\r\n</ol>\r\n\r\n<blockquote>\r\n<p>“<em><strong>.env</strong></em>” dosyası geliştirme ortamımız ile ilgili değişkenleri içermektedir. Bu dosyanın içeriğine ayrıntılı olarak değineceğiz.</p>\r\n</blockquote>\r\n\r\n<h3><strong>Konfigürasyon Dosyaları ve Geliştirme Ortamı Konfigürasyonu</strong></h3>\r\n\r\n<p>Bu kontrolleri yaptıktan sonra projemizin ana dizini altında “<strong>config</strong>” dizini altındaki birçok yapılandırma dosyasına göz atabiliriz.</p>\r\n\r\n<ul>\r\n <li><strong>app.php</strong>: Bu dosyada uygulamamız ile ilgili ayarlar bulunmaktadır. (Uygulama adı, adresi, debug durumu, dil ve timezone gibi ayarlar bulunmaktadır.)</li>\r\n <li><strong>database.php</strong>: Veritabanı ile ilgili ayarlar bulunmaktadır. (Varsayılan veritabanı bağlantı türü, desteklenen veritabanı bağlantı bilgileri vb. ayarlar bulunmaktadır. )</li>\r\n</ul>\r\n\r\n<p>database.php içeriği:</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">\'connections\' => [\r\n\r\n \'sqlite\' => [\r\n \'driver\' => \'sqlite\',\r\n \'database\' => env(\'DB_DATABASE\', database_path(\'database.sqlite\')),\r\n \'prefix\' => \'\',\r\n ],\r\n\r\n \'mysql\' => [\r\n \'driver\' => \'mysql\',\r\n \'host\' => env(\'DB_HOST\', \'127.0.0.1\'),\r\n \'port\' => env(\'DB_PORT\', \'3306\'),\r\n \'database\' => env(\'DB_DATABASE\', \'forge\'),\r\n \'username\' => env(\'DB_USERNAME\', \'forge\'),\r\n \'password\' => env(\'DB_PASSWORD\', \'\'),\r\n \'unix_socket\' => env(\'DB_SOCKET\', \'\'),\r\n \'charset\' => \'utf8mb4\',\r\n \'collation\' => \'utf8mb4_unicode_ci\',\r\n \'prefix\' => \'\',\r\n \'strict\' => true,\r\n \'engine\' => null,\r\n ],\r\n\r\n ],</code></pre>\r\n\r\n<p><img alt=\"\" src=\"https://www.mobilhanem.com/wp-content/uploads/2017/07/laravel-database-configi.png\" style=\"height:486px; width:597px\" /></p>\r\n\r\n<p>Bu kısımda örnek olarak ele aldığımız <strong>database.php</strong> içerisinde “<strong><em>env</em></strong>” fonksiyonunun kullanıldığını görmekteyiz. "<strong>.env</strong>" dosyası geliştirme ortamımızın konfigürasyon bilgilerini tek bir yerden yönetmemizi sağlar.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">env(\'.env dosyasındaki parametre adı\', \'varsayılan değer\')</code></pre>\r\n\r\n<p>Birden çok geliştirme ortamı olması durumunda, .env.testing, .env.production, .env.local gibi ayarlamalar yapılabilir.</p>\r\n\r\n<h3><strong>Bakım Modu (maintenance mode)</strong></h3>\r\n\r\n<p>Son olarak Laravel de <strong>bakım modu</strong>ndan (<strong>maintenance mode</strong>) da bahsedelim.</p>\r\n\r\n<p>Bakım modu aktif edildiğinde, sitenize gelen ziyaretçiler bakım modu ekranını görürler. Bu süreçte sitenizde herhangi bir işlem yapılamaz. Siz de gerekli gerekli güncelleme veya geliştirmeleri sitenize uygulayabilirsiniz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan down</code></pre>\r\n\r\n<p>komutuyla aktif edilir.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan up</code></pre>\r\n\r\n<p>komutuyla inaktif edilir.</p>\r\n\r\n<p>Ayrıntılı mesaj vermek ve belirli sürelerde ziyaretçinin otomatik deneme yapmasını isterseniz,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan down --message=\"Veritabanı güncelleniyor.\" --retry=60</code></pre>\r\n\r\n<p><img alt=\"\" src=\"https://www.mobilhanem.com/wp-content/uploads/2017/07/laravel-bakim-modu.png\" style=\"height:410px; width:900px\" /></p>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-27 09:59:56', '2018-10-15 05:18:40', 11, 0),
(23, 'Appium Nedir?', 'appium_nedir_', 4, '<p><strong>Appium </strong></p>\r\n\r\n<ul>\r\n <li>Appium mobil test aracı açık kaynak kodlu ve her üç platformda da yani native, hybrid, mobil web ortamlarında test yapılmasına olanak sağlamaktadır.</li>\r\n <li>Appium otomatize edilen testlerin gerçek cihazlarda, emülatörlerde ve simulatorde koşulmasına olanak sağlamaktadır.</li>\r\n <li>Güncel her iki platform olan iOS ve Android’ i aynı tool üzerinden test edebiliyor olmak farklı platformlar için farklı toollar kullanma zahmetinin ve maliyetinin önüne geçilmiş oluyor.</li>\r\n <li>Otomasyon testlerinin geliştirilmesi sırasında back-end API’lara ve veritabanlarına test kodundan erişim sağlar, böylece otomasyon kodlarının zenginleştirilmesine izin verir.</li>\r\n <li>Appium ile Mobil cihaz desteğinin yetersiz kaldığı durumlarda Amazon web servis, xamarin, saucelabs esnek çözümleri kullanılabilir.</li>\r\n <li>Java gibi OO temelli dilleri desteklediği için, kodlama sırasında reusability & modularity pratikleri kullanılabilmektedir.</li>\r\n <li>Apache cordova (HTML, CSS ve JS ile mobil kod geliştirme platformu) ile appium sorunsuz şekilde çalışabilmektedir.</li>\r\n</ul>\r\n\r\n<p>Appium mobil test aracı ile mevcut versiyon ile bir emulator ve bir android cihaz Mac ortamında aynı anda test koşulabilmektedir. Bununla birlikte, 1.4.16.1 versiyonu ile çoklu cihaz ile test koşumunun gerçekleştirileceğinin müjdesini Appium yaratıcılarında Dan Culler vermektedir.</p>\r\n\r\n<p> </p>\r\n\r\n<hr />\r\n<h2><strong>Appium Eğitimleri</strong></h2>\r\n\r\n<p> </p>\r\n\r\n<ul>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/appium_kurulumu\" target=\"_blank\">Appium Kurulumu</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/appium_kutuphaneleri\" target=\"_blank\">Appium Kütüphaneleri</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/eclipsete_appium_icin_proje_olusturma\" target=\"_blank\">Eclipse'te Appium için proje oluşturma</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/mobile_uygulamanin_apppackage_ve_appactivity_bilgilerini_ogrenme\" target=\"_blank\">Mobile Uygulamanın appPackage ve appActivity bilgilerini öğrenme</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/appium_ile_%C4%B0lk_test\" target=\"_blank\">Appium ile İlk Test</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/android_cihazda_chrome_tarayici_calistirma\" target=\"_blank\">Android Cihazda Chrome Tarayıcı Çalıştırma</a></p>\r\n </li>\r\n <li>\r\n <p><a href=\"http://blog.senocak.tk/yazi/appium_inspectors\" target=\"_blank\">Appium Inspectors</a></p>\r\n </li>\r\n <li>\r\n <p> </p>\r\n </li>\r\n</ul>\r\n', '2017-03-22 16:06:09', '2018-10-11 09:14:28', 2, 1);
INSERT INTO `posts` (`id`, `title`, `slug`, `category_id`, `body`, `created_at`, `updated_at`, `sira`, `fixed`) VALUES
(24, 'Laravel Route Sistemi', 'laravel_route_sistemi', 7, '<p>Laravel kurulum dizininde yer alan ‘routes/web.php’ dosyasını açıyoruz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get(\'/\', function () {\r\n return view(\'welcome\');\r\n});</code></pre>\r\n\r\n<p>Bu kod, sitenizin giriş ekranı yani ‘/’ için ‘<em><strong>welcome</strong></em>’ <strong><em>View </em></strong>dosyasının çalışacağını belirtir. Burada yer alan ‘<strong>Route::get…</strong>’ bölümü ise isteğin geldiği methodu belirtir. Kullanabileceğimiz methodlar;</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get($url, $callback);\r\nRoute::post($url, $callback);\r\nRoute::put($url, $callback);\r\nRoute::patch($url, $callback);\r\nRoute::delete($url, $callback);\r\nRoute::options($url, $callback);</code></pre>\r\n\r\n<p>Burada önemli bir not belirtmekte fayda görüyorum. POST, PUT ve DELETE methodlarını çağırabilmek için <em>CSRF </em>koruması yapmamız gerekli. ‘<strong>$url</strong>’ gelen internet sitenizin adresi, ‘<strong>$callback</strong>’ ise çalışacak fonksiyonu belirtiyor. İlk örneğimize bakarsak çalışacak ‘<strong>$url</strong>’ için ‘<strong>/</strong>’ girilmiş ve ‘<strong>$callback</strong>’ içinse function ile başlayan bölüm belirtilmiş. Burada fonksiyon ile beraber ‘<strong>View</strong>‘ çalışması sağlanmış. Route ile <strong>Controller</strong> çağırmak için aşağıdaki gibi bir kod gereklidir.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get(\'kullanici/profil\', \'UserController@uyeGoster\');</code></pre>\r\n\r\n<p>Gördüğünüz bile kullanılacak <strong>Controller</strong> çağırmak için ‘<u><em>UserController@uyeGoster</em></u>’ kullanıyoruz. Bu değişkende ilk önce <strong>Controller </strong>ismi daha sonrada fonksiyonun adı kullanılmalıdır.</p>\r\n\r\n<h2><strong>Laravel Route İsimlendirme</strong></h2>\r\n\r\n<p>Laravel route için isimlendirme (<strong>Name</strong>) kullanımı sistem içerisinde route için link verebilmeyi kolaylaştırmak için yapılır.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get(\'kullanici/profil\', \'UserController@uyeGoster\')->name(\'profil\');</code></pre>\r\n\r\n<p>Yukarıdaki örnekte bu route için isimlendirme kullandık. Bu isimlendirmeyi laravel view içerisinde de şu şekilde kullanıyoruz;</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">route(\'profil\');</code></pre>\r\n\r\n<p>Bu sayede route için gerekli link otomatik olarak oluşturulacaktır.</p>\r\n\r\n<h2><strong>Laravel Route Gruplandırma</strong></h2>\r\n\r\n<p>Gruplandırma <strong>middleware, namespace, prefix</strong> gibi birçok route bağlantısı olan durumlar için uygundur.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::namespace(\'Admin\')->group(function () {\r\n Route::get(\'yonetici\', \'UserController@yoneticiGoster\');\r\n});</code></pre>\r\n\r\n<p>Yukarıdaki örnekte kullanılacak olan <strong>Controller</strong> dosyalarının ‘<u>Admin</u>’ klasörü altında olduğunu belirttik. Prefix için de bir örnek verelim.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::prefix(\'admin\')->group(function () {\r\n Route::get(\'yoneticiler\', \'UserController@yoneticiListele\');\r\n});</code></pre>\r\n\r\n<p>Bu örnekte ise url adresinin ilk bölümünde ‘<em>admin</em>’ gelen bağlantıların yapılacaklarını belirttik. Daha kısa bir açıklama ile buradaki route bilgisine ulaşmak için gelen adresin ‘admin/yoneticiler’ olması gereklidir.</p>\r\n\r\n<h2><strong>Laravel Route Parametre Kullanımı</strong></h2>\r\n\r\n<p>Route ile gelen parametreleri yönlendirebiliriz. Bunun için adresten alınabilecek parametreleri belirtmemiz gerekli.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get(\'yonetici/{id}\', \'UserController@yoneticiGoster\');</code></pre>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get(\'yonetici/{id?}\', \'UserController@yoneticiGoster\');</code></pre>\r\n\r\n<p>Bu kodlar birbirininden tek farkı alttakinde yer alan ‘?’. Önce soru işareti olmayanı açıklayayım. Burada adresimiz ‘/yonetici/1’ olarak gelmelidir. Bu örnekte kullanılan ‘1’ id yerine geçer ve kodun devamında yer alan <strong>Controller </strong>içerisinde kullanılacak bir parametre olarak gönderilir. İkinci kod parçasında ise soru işareti ile anlattığımız şey parametre olabilir ya da olmayabilir demektir. Yani ilk kod ile ‘yonetici’ adresini çalıştıramayız hata alırız ama ikinci kısım ile hem ‘yonetici’ hem de ‘yonetici/1’ adreslerini çalıştırabiliriz. Bunun en yaygın örneği olarak şu senaryoyu düşünebiliriz. Bir yönetim panelinde kullanıcıları listeleyecek ve bu listeden seçilen kullanıcının detay bilgisini göstereceksiniz. Bunun için laravel route sistemini iki şekilde yapabilirsiniz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get(\'kullanici\', \'UserController@yoneticiGoster\');\r\nRoute::get(\'kullanici/{id}\', \'UserController@yoneticiGoster\');</code></pre>\r\n\r\n<p>veya</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Route::get(\'kullanici/{id?}\', \'UserController@yoneticiGoster\');</code></pre>\r\n\r\n<p>Tabi arada bir satır var gibi görünse de oluşturacağınız sistem büyüdükçe bu kullanımın yararını görebilirsiniz. Unutmamak gerekir ki sistemi temiz kod yani takip edilebilir/anlaşılır yazmak günümüz dünyasında son derece önemlidir.</p>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-26 23:44:02', '2018-10-15 05:18:40', 10, 0),
(25, 'Laravel Controller Yapısı', 'laravel_controller_yapisi', 7, '<h2><strong>Laravel Controller Nedir?</strong></h2>\r\n\r\n<p>Laravel Controller, MVC yapısında frontend ve backend arasında işlem gören katmandır. Bunu biraz açmak gerekirse; mesela kullanıcıların önyüzde etkileşimde oldukları bir form(üye giriş formu) ile bu formun veritabanında yapılacağı sorgular arasında işlem yapılan kısmıdır. Aslında bizim veritabanı işlemlerini ve/veya kullanıcıdan gelen verileri işleyeceğimiz bölümdür. Yaptığımız bu girişten sonra hemen Laravel Controller oluşturmaya başlayalım.</p>\r\n\r\n<h2><strong>Artisan Kullanarak Controller Oluşturma</strong></h2>\r\n\r\n<p>Bildiğiniz üzere Laravel sisteminde Artisan CLI (komut satırı arayüzü) bulunmaktadır. Bu arayüz bizi bir çok dertten kurtarır ve projelerimize hız kazandırır. Artisan arayüzünü kullanarak Controller, Model, Migration oluşturabiliriz. Artisan ile Laravel Controller oluşturmak için öncelikle komut satırı yardımı ile sistemimizde Laravel yapısının yüklü olduğu ana dizine erişiyoruz.</p>\r\n\r\n<pre>\r\n<code class=\"language-bash\">C:\\xampp\\htdocs\\proje_ismi</code></pre>\r\n\r\n<p>Daha sonra aşağıda yer alan kod bloğunu yazıyoruz(ya da kopyala yapıştır yapıyoruz).</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan make:controller AdminController</code></pre>\r\n\r\n<p>Bu kod satırında sonra bulunan ‘<strong>AdminController</strong>’ bizim oluşturduğumuz Laravel Controller için belirlediğimiz ad olacaktır.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/57/laravel-controller.jpg\" style=\"height:719px; width:800px\" /></p>\r\n\r\n<h2><strong>Laravel Controller</strong></h2>\r\n\r\n<p>Yazımın başında da belirttiğim gibi controller ile veritabanı işlemlerini yapabiliyoruz. Burada (belki daha önceden de bildiğiniz) <strong>CRUD</strong> kavramından kısaca bahsetmem gerek. <strong>CRUD</strong>, ingilizce Create(Oluştur)-Read(Oku)-Update(Güncelle)-Delete/Destroy(Sil) kelimelerinin baş harflerinden oluşmuş bir kısaltmadır aslında. Daha önce kullandığımız artisan komutuna basit bir parametre ekleyerek <strong>CRUD</strong> için gerekli tüm fonksiyonları oluşturabiliriz. Yine Laravel yüklediğimiz anadizine geliyor ve aşağıdaki gibi daha önce yazdığımı kodun sonuna <strong>–resource</strong> ekliyoruz.(Önceki örneği çalıştırdıysanız Controller adı farklı olmalıdır)</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan make:controller PageController --resource</code></pre>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/57/laravel-controller(1).jpg\" style=\"height:767px; width:800px\" /></p>\r\n\r\n<h2><strong>Laravel Controller Resource</strong></h2>\r\n\r\n<p>İki ekran görüntüsü arasındaki farkı görebilirsiniz. Temel olarak CRUD için gerekli tüm fonksiyonları tek bir satır ile oluşturduk. Bu fonksiyonları bira daha açıklamaya çalışayım. PageController ın Sayfa(Page) işlemleri için kullanıldığını varsayalım.</p>\r\n\r\n<ul>\r\n <li><strong>index()</strong> -> Tüm sayfaları listeme için kullanılan fonksiyon,</li>\r\n <li><strong>create()</strong> -> Yeni bir sayfa oluşturmak için kullanılacak formu oluşturan fonksiyon</li>\r\n <li><strong>store()</strong> -> Yeni sayfanın veritabanına yazılmasını kontrol eden fonksiyon</li>\r\n <li><strong>edit()</strong> -> Düzenlenecek sayfanın formunu oluşturan fonksiyon</li>\r\n <li><strong>update()</strong> -> Düzenlenecek sayfanın işlemlerini yapan fonksiyon</li>\r\n <li><strong>destroy()</strong> -> Sayfayı yok eden silinmesi için kullanılan fonksiyon</li>\r\n</ul>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-28 07:22:39', '2018-10-15 05:18:40', 9, 0),
(26, 'Laravel Controller Veri Aktarımı', 'laravel_controller_veri_aktarimi', 7, '<h2><strong>Route ile Laravel Controller Veri Aktarımı</strong></h2>\r\n\r\n<p>Daha önceki derslerde bahsettiğimiz gibi route Laravel yapısı için gelen isteklerin yönlendirildiği alanlardır. Yani route ile controller yönlendirmesi yapabileceğimiz için veri aktarımını da yapabilmemiz gerekli. Başka bir değişle; <strong>.htaccess</strong> ile yaptığımız php dosyalarına veri aktarımını route ile yapabiliyoruz.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/59/route-controller-veri-aktarimi-1024x535.jpg\" style=\"height:418px; width:800px\" /></p>\r\n\r\n<h2><strong>Laravel controller veri aktarımı</strong></h2>\r\n\r\n<p>Yukarıdaki ekran görüntüsünde sol bölüm routes/web.php ve sağ bölümdeki görsel ise app/Http/Controllers/PageController.php. Sol tarafa dikkat ederseniz iki adet yeni route var. Bunlar arasındaki fark tek bir soru işaretidir. Bu soru işaretinin anlamı ise “id” değişkeni olabilir ya da olmayabilir olarak değerlendirilir. Yani</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-php\">Route::get(\'sayfa/{id}\', \'PageController@index\');</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>olan kod satırı için “id” mutlaka olmalıdır. Olmadığında route hatası alınacaktır. Fakat;</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-php\">Route::get(\'sayfa/{id?}\', \'PageController@index\');</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>olan kod satısı içinse “id” değişkeni şart değildir. Bu şekildeki url adreslerini contoller fonksiyonunda ise değişken atayarak kullanıyoruz. Sağ tarafta bulunan index($id) fonksiyonu url adresinden gelen id yi controller içinde kullanılabilir duruma getiriyor.</p>\r\n\r\n<h2><strong>View ile Laravel Controller Veri Aktarımı</strong></h2>\r\n\r\n<p>Route ile gelen, controller içerisinde oluşturulan ve/ya veritabanı ile yapılan işlemler sonrası getirilen verilerin view tarafına ulaştırılmasıdır.</p>\r\n\r\n<p>Bu aşamada yukarıdaki ekran görüntüsünü baz aldığımızda page view’a aktarmak için;</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-php\">return view(\'page\', compact(\'id\'));</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>ya da</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-php\">return view(\'page\')->with(\'id\', $id);</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>Yukarıdaki kod blokları iki şekilde de aynı şekilde sonuçlanır ve bu şekilde contorller ile view arasında veri aktarımını sağlamış oluruz. İlerki derslerde değinebilir ama yeri gelmişken view içerisinde bu değişkeni nasıl yazdırıldığından bahsetmek istiyorum. Blade dosyasında sadece yazdırmak için</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-php\">Gelen id: {{$id}}</code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>kod bloğunu kullanabildiğimiz gibi</p>\r\n\r\n<ul>\r\n <li>\r\n <pre>\r\n<code class=\"language-php\">Gelen id: <?php echo $id; ?></code></pre>\r\n </li>\r\n</ul>\r\n\r\n<p>şeklinde de bildiğimiz php ile yazdırabiliriz.</p>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-28 07:49:22', '2018-10-15 05:18:40', 8, 0),
(27, 'Laravel Blade Templates', 'laravel_blade_templates', 7, '<h2>Laravel Blade Templates</h2>\r\n\r\n<p>Blade aslında bir şablon sistemidir. İçerisine alışık olduğunu PHP kodlarını da yazabilmeniz bir çok yazılımcının Laravel öğrenirken kendini rahat hissetmesini sağlamaktadır. Daha önce PHP ile site ya da uygulama yazdıysanız özellikle üst veya alt kısımlar için tek bir dosya kullanıp, onu her sayfaya ‘include’ ile çağırmışsınızdır. Bunun amacı tüm sitenizin üst kısmında yapacağınız değişikliğin tek tek her php dosyasında değil; tek bir yerden yapmanızı sağlamaktır. Laravel Blade Templates, içinse bu özellik layouttur. PHP ile yaptığınız ‘include’ durumundan farklı olarak burada bir ana şablon tanımlar ve diğer sayfaları bu şablonu ‘extend’ ederek oluşturursunuz. Hemen bir şablon örneği yazalım.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\"><!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <title>@yield(\'baslik\')</title>\r\n</head>\r\n<body>\r\n @yield(\'icerik\')\r\n</body>\r\n</html></code></pre>\r\n\r\n<p>Yukarıdaki şablona dikkat ederseniz ‘title’ etiketleri arasında @yield(‘başlık’) kodunu yerleştirdik. Bu oluşturacağımız diğer sayfalar ile bu bölümünün iletişimini sağlayacak olan kod kısmıdır. Şimdi de bir alt daha doğrusu genişletilmiş bir sayfa yazalım.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">@extends(\'sablon\')\r\n\r\n@section(\'baslik\', \'Sayfa Başlık\')\r\n\r\n@section(\'icerik\')\r\n\r\n <p>Buraya içerik gelecek</p>\r\n\r\n@endsection</code></pre>\r\n\r\n<p>Şablon sayfamızdaki değişkenlerle bir sayfa oluşturmak çok kolaylaştı. İhtiyacımız olan alanları ekleyip o alanları doldurmamız yeterli olacak. İlk satırda yer alan ‘<strong>extends</strong>’ oluşturduğumuz alt sayfanın hangi üst sayfadan çoğaltılacağını açıklıyor. Daha sonrada sizin de göreceğiniz gibi baslik ve icerik için gerekli alanları belirterek alt sayfanın verilerini bu alanlara yazdık. Bu şekilde alt sayfalar için genel bir şablona sahip oluyoruz.</p>\r\n\r\n<h2><strong>Laravel Blade Templates Döngüler</strong></h2>\r\n\r\n<p>Yazılım dillerinde belki de en çok kullanılan terimlerdir döngüler. Bu yüzden yazımda bu döngülere değinmenin uygun olacağını düşündüm.</p>\r\n\r\n<p><img alt=\"\" src=\"/upload/images/60/laravel-blade-templates-1024x325.jpg\" style=\"height:286px; width:900px\" /></p>\r\n\r\n<h2><strong>Laravel Blade Templates Kullanımı</strong></h2>\r\n\r\n<p>Üstteki ekran görüntülerinde sol taraf blade ile sağ taraf ise düz PHP ile yapılmıştır. Özellikle sol bölümde seçili alanda önemli bir nokta var. PHP kodlarının içerisine bir yazı yazdırmak istediğimizde ya PHP etiketlerini kapatmamız ya da ‘echo’ kullanmamız gerekli. Fakat Laravel Blade Templates için bu duruma gerek yok. Döngüler kendi satırlarında biter ve alt satıra indiğinizde artık orası HTML olarak okunur.</p>\r\n\r\n<p>Yine sol tarafta görebileceğiniz gibi değişkenler de ‘<strong>{{</strong>‘ ile ‘<strong>}}</strong>’ arasına yazılarak kısaltılmış bir ‘echo’ kullanılmış olunuyor. Kullanılan çift süslü parantezler XSS engellemen adına ‘<strong>htmlspecialchars</strong>’ fonksiyonu kullanılmış hali ile gelmektedir. Yani HTML etiketleri bu değişkenden temizlenir. Siz eğer HTML etiketli halini kullanmak isterseniz ‘<strong>{!!</strong>’ ile ‘<strong>!!}</strong>’ arasına yazmalısınız değişkeninizi. Yine bir örnek kod ile anlatmaya çalışayım.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$x = \"<p>Buraya bir paragraf gelecek</p>\";\r\n\r\n{{$x}} // çıktısı Buraya bir paragraf gelecek\r\n\r\n{!!$x!!} // çıktısı <p>Buraya bir paragraf gelecek</p></code></pre>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>\r\n', '2018-09-28 09:29:15', '2018-10-15 05:18:40', 7, 0),
(28, 'Kotlin Nedir?', 'Kotlin-Nedir', 26, '<p>Kotlin JVM (Java Virtual Machine) üzerinde çalışan bir programlama dilidir. Ayrıca Javascript koduna da derlenebilir (fakat biz yazı serimizde javascripte derlenme konusuna değinmeyeceğiz). Kotlin yazılım dili 2011 yılında <a href=\"https://www.jetbrains.com/\" rel=\"nofollow\" target=\"_blank\">JetBrains</a> firması tarafından geliştirilmeye başlandığı duyuruldu ve ilk stabil sürümünü (v1.0) 2016 yılında yayınladı. (JetBrain firması Intellij IDEA IDE’nin geliştiricisidir. Daha sonra Google ile birlikte Intellij IDEA tabanlı Android Studio‘yu geliştirdiler ve Android’in resmi geliştirici ide’si oldu. Hem android hemde java geliştiricileri için Eclipse ide’nin yerini Intellj IDEA ve Android Studio almaktadır.)</p>\r\n\r\n<p>Kotlin yazılım dili <a href=\"https://events.google.com/io/\" rel=\"nofollow\" target=\"_blank\">Google I/O 2017 </a>etkinliğinde Java ve C++ dan sonra Android’in 3. resmi geliştirici dili olarak duyurulmuştur. Bu duyurudan sonra Kotlin’in popülerliğinin artması kaçınılmazdır. Konu hakkında videoya <a href=\"https://www.youtube.com/watch?v=d8ALcQiuPWs\" rel=\"nofollow\" target=\"_blank\">buradan</a> ulaşabilirsiniz.</p>\r\n\r\n<p>Kotlin yazılım dilini öğrenerek hem Android uygulama geliştirebilir , hemde server-side uygulamaları geliştirebilirsiniz. Ama bunları geliştirebilmek için öncelikle <strong>Kotlin Yazılım</strong> dilinin temellerini öğrenmelisiniz.</p>\r\n\r\n<p>Kotlin geliştirebilmek için öncelikle bilgisayarımıza <strong>JDK</strong> kurmamız gerekir. Ide olarak Intellij IDEA , Android Studio , Eclipse(JetBrains’in geliştirdiği kotlin plugini ile) ve ya ide kullanmayıp terminal ile Kotlin uygulamalar geliştirebiliriz.</p>\r\n\r\n<ol>\r\n <li>Kurulum</li>\r\n <li>Değişkenler</li>\r\n <li>Matematiksel İşlemler</li>\r\n <li>Karar Mekanizması (İf – Else İf – When)</li>\r\n <li>Döngüler</li>\r\n <li>Fonksiyonlar</li>\r\n <li>Kolleksiyonlar (Array, ArrayList, HashMap)</li>\r\n <li>Nesne Yönelimli Programla (Object Oriented Programming)</li>\r\n <li>Hata Ayıklama (Try -Catch)</li>\r\n <li>Multithreading</li>\r\n</ol>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p> </p>', '2018-09-27 23:16:56', '2018-10-11 04:40:51', 4, 1),
(29, 'Laravel Model Yapısı', 'Laravel-Model-Yapisi', 7, '<p>Laravel Model, MVC yapısında veritabanı işlemlerinin yapıldığı bölümdür. Daha önceki yazılarımdan birinde Controller yapısından bahsederken, backend işlemlerinin de Controller tarafından yapıldığından bahsetmiştim. Controller, Model aracılığı ile bu işlemleri yapmaktadır. Yani Model, veritabanı iletişiminden sorumlu kısımdır.</p>\r\n\r\n<p><strong>Artisan Kullanarak Model Oluşturma</strong></p>\r\n\r\n<p>Daha önceki yazılarımda bahsettiğim gibi Laravel Artisan CLI bizim işimizi kolaylaştırmaktadır. Bu komut satırını öğrenmenin hız kazanma adına yararı olduğunu düşünüyorum. Artisan kullanarak Laravel Model oluşturmak için öncelikle komut satırı kullanarak Laravel ana dizine erişiyoruz. Benim bilgisayarım için bu adres;</p>\r\n\r\n<pre>\r\n<code class=\"language-bash\">C:\\xampp\\htdocs\\proje_ismi></code></pre>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan make:model Page</code></pre>\r\n\r\n<p>Yukarıda yer alan kod satırı sayesinde ‘<strong>Page</strong>’ Model dosyasını oluşturuyoruz. Model oluşturma başarı ile sonuçlandıysa app klasörünün altında Page isimli bir dosya olmuşması gereklidir.</p>\r\n\r\n<p><img alt=\"laravel model oluşturma\" src=\"/upload/images/62/laravel-model.jpg\" style=\"height:615px; width:800px\" /></p>\r\n\r\n<p>Tabi burada unutmamamız gereken Model ile kullanılacak veritabanı tablosununda olması. Bu işlem için isterseniz manuel olarak bir tablo oluşturabilirsiniz ya da yine Artisan kullanarak Migration oluşturabilirsiniz.Henüz Migration yapısından bahsetmediğimiz için biz bu yazıda manuel olarak bir tablo oluşturalım. Veritabanı değişkenlerini .env dosyasından alacağız buradaki değişikliklerin yapılmış olmasına dikkat edelim. Yine kendi kurulumuma göre benim .env dosyamdaki veritabanı ile ilgili kısım şu şekildedir;</p>\r\n\r\n<pre>\r\n<code class=\"language-bash\">DB_CONNECTION=mysql\r\nDB_HOST=127.0.0.1\r\nDB_PORT=3306\r\nDB_DATABASE=mobilhanem\r\nDB_USERNAME=root\r\nDB_PASSWORD=</code></pre>\r\n\r\n<p>tabi lokal bir kurulum olduğu için şifre kısmı boş bırakılmıştır. Gerçek sunucuda bu bölümün güçlü bir şifre ile dolu olması gereklidir. Phpmyadmin yardımı ile projemize bir veritabanı oluşturup içerisine pages tablosunu ekledim. Tablo yapısı ise</p>\r\n\r\n<pre>\r\n<code class=\"language-sql\">id => int 11, primary key, autoincrement\r\nbaslik => varchar 100\r\nicerik => text\r\naktif => int 1, default 0</code></pre>\r\n\r\n<p>Burada Laravel Model için önemli bir konuya dikkat etmeniz gerekmektedir. Oluşturduğunuz Model adı ile veritabanındaki tablo arasında bir ilişki vardır. Bu ilişki oluşturduğunuz tablonun, Model isminin küçük harf ile başlayan ve İngilizce olarak çoğul yapılmış hali olmasıdır.</p>\r\n\r\n<ul>\r\n <li><strong>Page (model) => pages (tablo)</strong></li>\r\n <li><strong>City (model) => cities (tablo)</strong></li>\r\n</ul>\r\n\r\n<p>Peki bu şart mı? tabi ki hayır fakat proje takip edilebilirliği ve hız bakımından tavsiye edilen methoddur. Diyelim ki siz bunu yapmak istemiyor veya daha önceki projenizi Laravel yapısına taşımak istiyorsunuz. Tablo isminizi ‘sayfalar’ olarak kullanmak için Laravel Model içerisine $table değişkeni belirtmeniz gerekli.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">protected $table = \'sayfalar\';</code></pre>\r\n\r\n<p>Yine aynı şekilde Primary Key olarak id kullanmayacaksanız eğer onu da,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">protected $primaryKey = \'sayfa_id\';</code></pre>\r\n\r\n<p>olarak belirtmeniz gerekli.</p>\r\n\r\n<p>Yukarıda bahsettiğim gibi bu yazıda Migration yapısını anlatmayacağım fakat Migration kullanarak oluşturulan tablolarda timestamps değişkeni vardır. Bu değişken tablonuza ‘created_at’ ve ‘updated_at’ kolonları ekler. Biz manuel oluşturduğumuz tablomuza bunları eklemediğimiz için Model yapımıza bunları tabloda aramaması gerektiğini söylememiz gerek. Yoksa Model hata oluşturacaktır. Bunun için,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">public $timestamps = false;</code></pre>\r\n\r\n<p>satırı Model içerisine eklememiz gereklidir.</p>\r\n\r\n<p>Laravel Model yapısında hangi kolonun yazılabilir olduğu sizin tarafınızdan mutlaka belirtilmelidir. Yukarıdaki örnek tablomuzda ‘<strong>aktif</strong>’ kolonunun değiştirilmesini istemediğimizi düşünürsek bunun için Model içerisine</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">protected $fillable = [\'baslik\',\'icerik\'];</code></pre>\r\n\r\n<p>Burada gördüğünüz gibi ‘aktif’ ve ‘id’ kolonlarımız yok. Bunların olmaması Laravel sistemine bunların manipüle edilmemesi gerektiği, korunması gerektiğini belirtir. Yani buraya yazmadığımız kolonlar Controller ile değiştirilemez. Laravel için bu bir çeşit güvenlik önlemidir ve bu önlem Mass Assignment olarak adlandırılır.</p>\r\n\r\n<p>Eğer biz tüm alanların değiştirilebilir olmasını istiyorsak ya da sadece ‘id’ kolonunun korunmasını istiyorsak ve tablomuzda 30 adet kolon varsa bunu tek tek yazmamız mı gerekecek? Tabi ki hayır. Sürekli bizim iyiliğimizi düşünen Laravel bunun içinde çözüm oluşturmuş ‘guarded’.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">protected $guarded = [];</code></pre>\r\n\r\n<p>ya da</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">protected $guarded = [\'id\'];</code></pre>\r\n\r\n<p>Bu şekilde belirttiğimiz kolonlar harici olanların hepsinin değiştirilebilir olduğunu belirtmiş oluyoruz.</p>\r\n\r\n<p>Son olarak yukarıdaki kod satırlarının Model içerisindeki yerleşimi aşağıda yer alan resimdeki gibi olmalıdır.</p>\r\n\r\n<p><img alt=\"laravel model son hali\" src=\"/upload/images/62/laravel-model(1).jpg\" style=\"height:395px; width:800px\" /></p>\r\n\r\n<p> </p>\r\n\r\n<p>Ref: <a href=\"https://www.mobilhanem.com/laravel-dersleri-laravel-nedir/\" target=\"_blank\">laravel-dersleri</a></p>', '2018-10-01 07:09:49', '2018-10-22 10:10:05', 6, 0),
(30, '20 Laravel Eloquent İpuçları', '20-Laravel-Eloquent-İpuclari', 7, '<h3>1. Increments ve Decrements</h3>\r\n\r\n<pre>\r\n<code class=\"language-php\">$article = Article::find($article_id);\r\n$article->read_count++;\r\n$article->save();\r\n</code></pre>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$article = Article::find($article_id);\r\n$article->increment(\'read_count\');\r\n</code></pre>\r\n\r\n<p>veya</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">Article::find($article_id)->increment(\'read_count\');\r\nArticle::find($article_id)->increment(\'read_count\', 10); // +10\r\nProduct::find($produce_id)->decrement(\'stock\'); // -1\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>2. XorY metodları</h3>\r\n\r\n<p>Eloquent iki metodu birleştiren bikaç metodu var.</p>\r\n\r\n<p><strong>Örnek 1</strong> – <code>findOrFail()</code>:</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$user = User::find($id);\r\nif (!$user) { abort (404); }\r\n</code></pre>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$user = User::findOrFail($id);\r\n</code></pre>\r\n\r\n<p><strong>Örnek 2</strong> – <code>firstOrCreate()</code>:</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$user = User::where(\'email\', $email)->first();\r\nif (!$user) {\r\n User::create([\r\n \'email\' => $email\r\n ]);\r\n}\r\n</code></pre>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$user = User::firstOrCreate([\'email\' => $email]);\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>3. Model boot() metodu</h3>\r\n\r\n<p>Eloquent modelinde varsayılan davranışı değiştirmek için <code>boot()</code> metodu vardır.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">class User extends Model{\r\n public static function boot(){\r\n parent::boot();\r\n static::updating(function($model){\r\n // do some logging\r\n // override some property like $model->something = transform($something);\r\n });\r\n }\r\n}</code></pre>\r\n\r\n<p><a href=\"/~https://github.com/webpatser/laravel-uuid\" target=\"_blank\">UUID field</a> alanını oluşturmak istediğimizi düşünelim.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">public static function boot(){\r\n parent::boot();\r\n self::creating(function ($model) {\r\n $model->uuid = (string)Uuid::generate();\r\n });\r\n}</code></pre>\r\n\r\n<hr />\r\n<h3>4. Koşullu ilişkilendirme ve sıralama</h3>\r\n\r\n<p>İlişkiyi oluşturmanın tipik yolu,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">public function users() {\r\n return $this->hasMany(\'App\\User\'); \r\n}\r\n</code></pre>\r\n\r\n<p>Bu noktada <em>where </em>ve <em>orderby </em>ifadelerini kullanabiliriz. Örnek olarak kullanıcılar için spesifik ilişki veya email'e göre sıralamak istiyorsak,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">public function approvedUsers() {\r\n return $this->hasMany(\'App\\User\')->where(\'approved\', 1)->orderBy(\'email\');\r\n}\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>5. Model özellikleri: timestamps, appends vb.</h3>\r\n\r\n<pre>\r\n<code class=\"language-php\">class User extends Model {\r\n protected $table = \'users\';\r\n protected $fillable = [\'email\', \'password\']; // which fields can be filled with User::create()\r\n protected $dates = [\'created_at\', \'deleted_at\']; // which fields will be Carbon-ized\r\n protected $appends = [\'field1\', \'field2\']; // additional values returned in JSON\r\n}\r\n</code></pre>\r\n\r\n<p>ve</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">protected $primaryKey = \'uuid\'; // it doesn\'t have to be \"id\"\r\npublic $incrementing = false; // and it doesn\'t even have to be auto-incrementing!\r\nprotected $perPage = 25; // Yes, you can override pagination count PER MODEL (default 15)\r\nconst CREATED_AT = \'created_at\';\r\nconst UPDATED_AT = \'updated_at\'; // Yes, even those names can be overridden\r\npublic $timestamps = false; // or even not used at all\r\n</code></pre>\r\n\r\n<p><a href=\"/~https://github.com/laravel/framework/blob/5.6/src/Illuminate/Database/Eloquent/Model.php\">Abstract Model class</a> adresinde daha fazlasını bulabilirsiniz.</p>\r\n\r\n<hr />\r\n<h3>6. Çoklu kayıt bulma</h3>\r\n\r\n<pre>\r\n<code class=\"language-php\">$user = User::find(1);\r\n</code></pre>\r\n\r\n<p><em>find </em>komutu içerisine birden fazla id gönderebiliyoruz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$users = User::find([1,2,3]);\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>7. WhereX</h3>\r\n\r\n<p>Controller sınıfımızdan view dosyalarımıza bir değer göndermek istediğimiz zaman nasıl <em>with </em>komutu yerine <em>withDeger </em>komutunu kullanabiliyorsak aynı işlemi <em>where </em>içinde kullanabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$users = User::where(\'approved\', 1)->get();\r\n</code></pre>\r\n\r\n<p>yerine</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$users = User::whereApproved(1)->get(); \r\n</code></pre>\r\n\r\n<p>Ayrıca, aynı yapıyı tarih işlemleri içinde yapabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">User::whereDate(\'created_at\', date(\'Y-m-d\'));\r\nUser::whereDay(\'created_at\', date(\'d\'));\r\nUser::whereMonth(\'created_at\', date(\'m\'));\r\nUser::whereYear(\'created_at\', date(\'Y\'));\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>8. Order by ilişkisi</h3>\r\n\r\n<p>Örnek olarak db de en son güncellenen yazıları en üste taşımak istersek bu yapıyı kullanabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">public function latestPost(){\r\n return $this->hasOne(\\App\\Post::class)->latest();\r\n}\r\n</code></pre>\r\n\r\n<p>Controller dosyamızda,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$users = Topic::with(\'latestPost\')->get()->sortByDesc(\'latestPost.created_at\');\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>9. Eloquent::when() – no more if-else’s</h3>\r\n\r\n<p>Çoğumuz aşağıdaki gibi “if-else” sorgusu yazarız.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">if (request(\'filter_by\') == \'likes\') {\r\n $query->where(\'likes\', \'>\', request(\'likes_amount\', 0));\r\n}\r\nif (request(\'filter_by\') == \'date\') {\r\n $query->orderBy(\'created_at\', request(\'ordering_rule\', \'desc\'));\r\n}\r\n</code></pre>\r\n\r\n<p>Ama daha iyi bir yapı var; <code>when()</code>:</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$query = Author::query();\r\n$query->when(request(\'filter_by\') == \'likes\', function ($q) {\r\n return $q->where(\'likes\', \'>\', request(\'likes_amount\', 0));\r\n});\r\n$query->when(request(\'filter_by\') == \'date\', function ($q) {\r\n return $q->orderBy(\'created_at\', request(\'ordering_rule\', \'desc\'));\r\n});\r\n</code></pre>\r\n\r\n<p>Daha kısa veya hoş görülmeyebilir ama çok daha güçlü bir yapıdır.</p>\r\n\r\n<pre>\r\n<code>$query = User::query();\r\n$query->when(request(\'role\', false), function ($q, $role) { \r\n return $q->where(\'role_id\', $role);\r\n});\r\n$authors = $query->get();\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>10. BelongsTo </h3>\r\n\r\n<p>Örneğin Post ve Author tablomuz ilişkili,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">{{ $post->author->name }}\r\n</code></pre>\r\n\r\n<p>Peki ya Author silindi yada bir şekilde ayarlanmadı. “<em>property of non-object</em>” diye bir hata alırız. Bunu önüne geçebiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">{{ $post->author->name ?? \'\' }}\r\n</code></pre>\r\n\r\n<p>Ama ilişki tanımlama sırasında bunu default olarak yapabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">public function author(){\r\n return $this->belongsTo(\'App\\Author\')->withDefault();\r\n}\r\n</code></pre>\r\n\r\n<p>Bu örnekte, yazar eklenmemiş ise <code>author()</code> ilişkisi <code>App\\Author</code> modelinden boş gelecektir. Böylece, varsayılan olarak author kısmını tanımlayabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">public function author(){\r\n return $this->belongsTo(\'App\\Author\')->withDefault([\r\n \'name\' => \'Yazar Tanımlanmamış\'\r\n ]);\r\n}\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>11. Order by Mutator</h3>\r\n\r\n<p>Böyle bir kodumuz olduğunu düşünelim.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">function getFullNameAttribute(){\r\n return $this->attributes[\'first_name\'] . \' \' . $this->attributes[\'last_name\'];\r\n}\r\n</code></pre>\r\n\r\n<p>Şimdi de <code>full_name e </code>göre sıralayalım? Çalışmayacaktır.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$clients = Client::orderBy(\'full_name\')->get(); // doesn\'t work\r\n</code></pre>\r\n\r\n<p>Çözüm basit, sıralamayı değerler bize döndükten sonra yapalım.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$clients = Client::get()->sortBy(\'full_name\'); // works!\r\n</code></pre>\r\n\r\n<p>Note: Fonksiyon ismine dikkat: <strong>orderBy</strong> değil <strong>sortBy</strong>.</p>\r\n\r\n<hr />\r\n<h3>12. Küresel kapsamda varsayılan sıralama</h3>\r\n\r\n<p><code>User::all()</code> kodunda varsayılan olarak <code>name</code> alanına göre sıralama yapacaktır. <em><code>boot()</code></em> metoduna dönelim ve;</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">protected static function boot(){\r\n parent::boot();\r\n // Order by name ASC\r\n static::addGlobalScope(\'order\', function (Builder $builder) {\r\n $builder->orderBy(\'name\', \'asc\');\r\n });\r\n}\r\n</code></pre>\r\n\r\n<p><a href=\"https://laravel.com/docs/5.6/eloquent#query-scopes\" target=\"_blank\">Daha fazlası için,</a>.</p>\r\n\r\n<hr />\r\n<h3>13. Raw query methods</h3>\r\n\r\n<p>Bazen Eloquent durumlarımıza saf sorgular eklememiz gerekli olur şansımıza bunlar için fonksiyonlar vardır.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">// whereRaw\r\n$orders = DB::table(\'orders\')\r\n ->whereRaw(\'price > IF(state = \"TX\", ?, 100)\', [200])\r\n ->get();\r\n\r\n// havingRaw\r\nProduct::groupBy(\'category_id\')->havingRaw(\'COUNT(*) > 1\')->get();\r\n\r\n// orderByRaw\r\nUser::where(\'created_at\', \'>\', \'2016-01-01\')\r\n ->orderByRaw(\'(updated_at - created_at) desc\')\r\n ->get();\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>14. Replicate: Kopya oluşturma</h3>\r\n\r\n<p>Kısaca,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$task = Tasks::find(1);\r\n$newTask = $task->replicate();\r\n$newTask->save();\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>15. Büyük tablolar için chunk() metodu</h3>\r\n\r\n<p>Küçük parçalara bölerek çalışabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$users = User::all();\r\nforeach ($users as $user) {\r\n // ...\r\n</code></pre>\r\n\r\n<p>yerine,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">User::chunk(100, function ($users) {\r\n foreach ($users as $user) {\r\n // ...\r\n }\r\n});\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>16. Create additional things when creating a model</h3>\r\n\r\n<p>Artisan komutunu biliyoruz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan make:model Company\r\n</code></pre>\r\n\r\n<p>Ama, ilişkili alanları oluşturmak için 3 adet flag olduğunu biliyor muydunuz?</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">php artisan make:model Company -mcr\r\n</code></pre>\r\n\r\n<ul>\r\n <li>-m, <strong>migration</strong></li>\r\n <li>-c, <strong>controller</strong></li>\r\n <li>-r ,<strong>resourceful </strong>dosyalarımızı oluşturmaya yarar.</li>\r\n</ul>\r\n\r\n<hr />\r\n<h3>17. Güncelleme yaptığımızda updated_at sütunu override</h3>\r\n\r\n<p><em><code>->save()</code></em> metodun parametre alabiliyor. Sonuç olarak, ilgili kısmı güncellememesi için parametre olarak belirtebiliyoruz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$product = Product::find($id);\r\n$product->updated_at = \'2019-01-01 10:00:00\';\r\n$product->save([\'timestamps\' => false]);\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>18. update() çıktısı?</h3>\r\n\r\n<p>Hiç düşündünüz mü kod gerçekten hangi değerleri gönderiyor.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$result = $products->whereNull(\'category_id\')->update([\'category_id\' => 2]);\r\n</code></pre>\r\n\r\n<p>Cevap, etkilenen satırlardır. Dolayısıyla, kaç satırın etkilendiğini kontrol etmeniz gerekiyorsa, başka bir şeyi aramanıza gerek yoktur; update () yöntemi bu sayıyı sizin yerinize döndürür.</p>\r\n\r\n<hr />\r\n<h3>19. Parantezleri bir Eloquent sorgusuna dönüştürün</h3>\r\n\r\n<p>SQL sorgunuzda and-or kısımlarını karıştırabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">... WHERE (gender = \'Male\' and age >= 18) or (gender = \'Female\' and age >= 65)\r\n</code></pre>\r\n\r\n<p>Yanlış,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$q->where(\'gender\', \'Male\');\r\n$q->orWhere(\'age\', \'>=\', 18);\r\n$q->where(\'gender\', \'Female\');\r\n$q->orWhere(\'age\', \'>=\', 65);\r\n</code></pre>\r\n\r\n<p>Karışık olabilir ama doğrusu,</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$q->where(function ($query) {\r\n $query->where(\'gender\', \'Male\')\r\n ->where(\'age\', \'>=\', 18);\r\n})->orWhere(function($query) {\r\n $query->where(\'gender\', \'Female\')\r\n ->where(\'age\', \'>=\', 65); \r\n})\r\n</code></pre>\r\n\r\n<hr />\r\n<h3>20. Çoklu parametreler ile orWhere</h3>\r\n\r\n<pre>\r\n<code class=\"language-php\">$q->where(\'a\', 1);\r\n$q->orWhere(\'b\', 2);\r\n$q->orWhere(\'c\', 3);\r\n</code></pre>\r\n\r\n<p>Bu şekilde de kullanabiliriz.</p>\r\n\r\n<pre>\r\n<code class=\"language-php\">$q->where(\'a\', 1);\r\n$q->orWhere([\'b\' => 2, \'c\' => 3]);\r\n</code></pre>\r\n\r\n<hr />\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p>Ref : <a href=\"https://laravel-news.com/eloquent-tips-tricks\" target=\"_blank\">laravel-news.com</a></p>', '2018-10-15 05:18:31', '2018-10-22 10:32:07', 5, 0);
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `post_tag`
--
CREATE TABLE `post_tag` (
`id` int(10) UNSIGNED NOT NULL,
`post_id` int(10) UNSIGNED NOT NULL,
`tag_id` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Tablo döküm verisi `post_tag`
--
INSERT INTO `post_tag` (`id`, `post_id`, `tag_id`) VALUES
(16, 5, 3),
(17, 24, 5),
(20, 23, 3),
(21, 22, 3),
(24, 26, 5),
(25, 28, 8),
(26, 28, 9),
(27, 29, 4),
(28, 29, 5),
(29, 29, 6),
(30, 30, 4),
(31, 30, 5),
(32, 30, 6);
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `tags`
--
CREATE TABLE `tags` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Tablo döküm verisi `tags`
--
INSERT INTO `tags` (`id`, `name`, `created_at`, `updated_at`) VALUES
(2, 'APPIUM', '2018-10-07 05:38:04', '2018-10-10 11:24:00'),
(3, 'SELENIUM', '2018-10-07 05:38:09', '2018-10-10 11:23:55'),
(4, 'LARAVEL', '2018-10-07 12:29:09', '2018-10-10 11:23:50'),
(5, 'PHP', '2018-10-07 12:29:12', '2018-10-10 11:23:45'),
(6, 'MVC', '2018-10-07 12:29:15', '2018-10-10 11:23:35'),
(8, 'KOTLIN', '2018-10-11 04:40:59', '2018-10-11 04:41:15'),
(9, 'JAVA', '2018-10-11 04:41:21', '2018-10-11 04:41:21');
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `users`
--
CREATE TABLE `users` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`picture` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`password` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL,
`remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`about` text COLLATE utf8mb4_unicode_ci NOT NULL,
`admin` int(11) NOT NULL DEFAULT '0',
`linkedin` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Tablo döküm verisi `users`
--
INSERT INTO `users` (`id`, `name`, `email`, `picture`, `password`, `remember_token`, `created_at`, `updated_at`, `about`, `admin`, `linkedin`) VALUES
(1, 'Anıl Şenocak', 'asenocak@netas.com.tr', 'Anil_senocak.jpg', '$2y$10$/1VXu9lbvNo34T/H5uYMmuO7oaGLQ.0m.7XsA4rNJJqL9.jKfz11C', 'UX5mPbpCRCV0IU0097mVO0IWxdJ2t4UHitTHSLwP61i2BfkAhGjQkOHuCqeA', '2018-10-06 10:06:32', '2018-10-13 07:59:19', '<p><iframe frameborder=\"0\" height=\"600\" scrolling=\"yes\" src=\"http://blog.senocak.tk/cv.pdf\" width=\"900\"></iframe></p>', 1, 'anilsenocak27');
--
-- Dökümü yapılmış tablolar için indeksler
--
--
-- Tablo için indeksler `ayar`
--
ALTER TABLE `ayar`
ADD PRIMARY KEY (`id`);
--
-- Tablo için indeksler `categories`
--
ALTER TABLE `categories`
ADD PRIMARY KEY (`id`);
--
-- Tablo için indeksler `comments`
--
ALTER TABLE `comments`
ADD PRIMARY KEY (`id`),
ADD KEY `comments_post_id_foreign` (`post_id`);
--
-- Tablo için indeksler `migrations`
--
ALTER TABLE `migrations`
ADD PRIMARY KEY (`id`);
--
-- Tablo için indeksler `posts`
--
ALTER TABLE `posts`
ADD PRIMARY KEY (`id`);
--
-- Tablo için indeksler `post_tag`
--
ALTER TABLE `post_tag`
ADD PRIMARY KEY (`id`),
ADD KEY `post_tag_post_id_foreign` (`post_id`),
ADD KEY `post_tag_tag_id_foreign` (`tag_id`);
--
-- Tablo için indeksler `tags`
--
ALTER TABLE `tags`
ADD PRIMARY KEY (`id`);
--
-- Tablo için indeksler `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);
--
-- Dökümü yapılmış tablolar için AUTO_INCREMENT değeri
--
--
-- Tablo için AUTO_INCREMENT değeri `ayar`
--
ALTER TABLE `ayar`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- Tablo için AUTO_INCREMENT değeri `categories`
--
ALTER TABLE `categories`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=31;
--
-- Tablo için AUTO_INCREMENT değeri `comments`
--
ALTER TABLE `comments`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- Tablo için AUTO_INCREMENT değeri `migrations`
--
ALTER TABLE `migrations`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
--
-- Tablo için AUTO_INCREMENT değeri `posts`
--
ALTER TABLE `posts`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=43;
--
-- Tablo için AUTO_INCREMENT değeri `post_tag`
--
ALTER TABLE `post_tag`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=46;
--
-- Tablo için AUTO_INCREMENT değeri `tags`
--
ALTER TABLE `tags`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
--
-- Tablo için AUTO_INCREMENT değeri `users`
--
ALTER TABLE `users`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
--
-- Dökümü yapılmış tablolar için kısıtlamalar
--
--
-- Tablo kısıtlamaları `comments`
--
ALTER TABLE `comments`
ADD CONSTRAINT `comments_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE;
--
-- Tablo kısıtlamaları `post_tag`
--
ALTER TABLE `post_tag`
ADD CONSTRAINT `post_tag_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`),
ADD CONSTRAINT `post_tag_tag_id_foreign` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;