spring-boot-logogradle-logo
console

Create Gradle Spring Boot project with SPRING INITIALIZR

I chose Groovy language for the project, but if you want Java, text below with little changes also helps you.

Edit build.gradle and add to it bootRun section

buildscript {
	ext {
		springBootVersion = '1.3.1.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'groovy'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar {
	baseName = 'myapp'
	version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
	mavenCentral()
}


dependencies {
	compile('org.codehaus.groovy:groovy')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

task wrapper(type: Wrapper) {
	gradleVersion = '2.9'
}

// this code split parameters and allow us use parameters in our application
bootRun {
	if ( project.hasProperty('args') ) {
		args project.args.split('\\s+')
	}
}

create MyController class

@Controller
class MyController implements CommandLineRunner {

	private Logger logger = LoggerFactory.getLogger(this.getClass())

	@Override
	void run(String... args) throws Exception {
		if(!args) {
			logger.warn("You must pass at least one parametr.")
			logger.warn("Example: bootRun -Pargs=\"arg1 arg2 arg3\"") 
		}
		// print parameters which we sent from command line
		args.each{ arg -> 
			logger.info(arg)
		} 
	} 
}

Run application
gradle bootRun -Pargs=”arg1 arg2 arg3″

First off all you could find out some plugins https://grails.org/plugins/search?q=mongo

But if you need you could use another method:

1. Edit BuildConfig.groovy
add string like this: compile ‘org.mongodb:mongo-java-driver:3.0.3’ to dependencies section

dependencies {
        //...
	compile 'org.mongodb:mongo-java-driver:3.0.3'
    }

2. Edit Config.groovy

mongodb.uri = "mongodb://username:password@your.mongodb.server/yourDataBaseName"
mongodb.database = "yourDataBaseName"

3. Add to resources.groovy

beans = {
	mongoClientURI(MongoClientURI) { bean ->
		bean.constructorArgs = [grailsApplication.config.mongodb.uri.toString()]
	}
	mongoClient(MongoClient) { bean ->
		bean.constructorArgs = [ref(mongoClientURI)]
		bean.destroyMethod = 'close'
	}
	mongoDb(mongoClient: 'getDB') { bean ->
		bean.constructorArgs = [grailsApplication.config.mongodb.database.toString()]
	}
}

4. Add to any controller (in my case MyController)

package mypackage

import com.mongodb.DB

class MyController {

	DB mongoDb

	def users() {

		def collection = mongoDb.getCollection('myCollection')

		collection.insert(new BasicDBObject(['name':'Piter']))
		
		def users = collection.find(new BasicDBObject(['name':'Piter'])).toArray()
		
		render (contentType: 'application/json', text: JSON.serialize(users))
	}

	def user() {

		def userId = params.userId
		
		def collection = mongoDb.getCollection('myCollection')
		
		def user = collection.findOne(new BasicDBObject(['_id': new ObjectId(userId)]))
		
		render (contentType: 'application/json', text: JSON.serialize(user))
	}

}

Для правильной сортировки строк на украинском языке или любом другом, необходимо явно указывать локаль Locale. Для решения данной проблемы используем класс пакета java.text – Collator.

ArrayList<String> countries = new ArrayList<String>();
countries.add("Єгипет");
countries.add("Туреччина");		
countries.add("Ісландія");		
countries.add("Аргентина");
		

System.out.println("Before sort:");
		
System.out.println(countries);
		

System.out.println("After regular sort:");
		
Collections.sort(countries);
		
System.out.println(countries);
		

Locale ukrainian = new Locale("uk", "UA");
		
Collator ukrainianCollator = Collator.getInstance(ukrainian);

Collections.sort(countries, ukrainianCollator);


System.out.println("After locale sort:");

System.out.println(countries);

Results

Before sort:
[Єгипет, Туреччина, Ісландія, Аргентина]
After regular sort:
[Єгипет, Ісландія, Аргентина, Туреччина]
After locale sort:
[Аргентина, Єгипет, Ісландія, Туреччина]

I have some view (“basicView.gsp”) and want to pass other view content (“_someTemplate.gsp”) to this view to javascript variable (“template”).

basicView.gsp:

<html>
<head>
...
</head>
<body>
...
<script>
var template = '${raw(include(view:"myTemplates/_someTemplate.gsp").replaceAll('\n',''))}';
</script>
</body>
</html>

_someTemplate.gsp:

<div>
<h1>Some header</h1>
<p>Lorem ipsum dolor sit...</p>
</div>

Resulted html:

<html>
<head>
...
</head>
<body>
...
<script>
var template = '<div><h1>Some header</h1><p>Lorem ipsum dolor sit...</p></div>';
</script>
</body>
</html>

Details:

  • java 1.7.0_25
  • grails 2.4.5
  • vaadin plugin 7.5.2

Create Grails app in ItelliJ IDEA 14 as in this manual –
https://vaadin.com/wiki/-/wiki/Main/Vaadin+on+Grails+-+Create+project+in+IntelliJ+IDEA
But use only 1. and 2. points.

After 2. point use next suggestions:

add to BuildConfig.groovy:
to dependencies – runtime ‘org.hibernate:hibernate-validator:5.1.1.Final’
to plugings – compile “:vaadin:7.5.2”
click Apply Grails changes to IDEA project structure

run – grails vaadin-quickstart

Next couple steps:

Screenshot 2015-08-26 23.25.28

Screenshot 2015-08-26 23.29.08

press “+” and select Grails:

Screenshot 2015-08-26 23.30.51

Screenshot 2015-08-26 23.30.51(2)

Screenshot 2015-08-26 23.30.52

select “your app” in Module:

Screenshot 2015-08-26 23.30.52(2)

change name on “your app name”:

Screenshot 2015-08-26 23.30.52(3)

result:

Screenshot 2015-08-26 23.30.52(4)

Thats all.

def someMap = [
           'phones':['iPhone','Galaxy','Nexus'],
           'laptops':['HP','MacBook','Samsung'],
           'tablets':['Galaxy Tab','iPad','Asus'],
           ]

someMap.eachWithIndex{ k, v, index -> println "${k}:${v} - ${index}" }


Result:
phones:[iPhone, Galaxy, Nexus] – 0
laptops:[HP, MacBook, Samsung] – 1
tablets:[Galaxy Tab, iPad, Asus] – 2

def map = [a:"cc", b: "dd"]
println "map - " + map
println "map.keySet() - " + map.keySet()
println "map.values() - " + map.values()
println "map.entrySet() - " + map.entrySet()
println "map.entrySet().key - " + map.entrySet().key
println "map.entrySet().value - " + map.entrySet().value


Result:
map – [a:cc, b:dd]
map.keySet() – [a, b]
map.values() – [cc, dd]
map.entrySet() – [a=cc, b=dd]
map.entrySet().key – [a, b]
map.entrySet().value – [cc, dd]


apt-get install pptpd 

nano /etc/pptpd.conf 
localip 10.0.0.1 
remoteip 10.0.0.100-200 

nano /etc/ppp/chap-secrets 
username pptpd password * 

nano /etc/ppp/pptpd-options 
ms-dns 8.8.8.8 
ms-dns 8.8.4.4

service pptpd restart

check:
netstat -alpn | grep :1723

nano /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE && iptables-save
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
iptables -I INPUT -s 10.0.0.0/8 -i ppp0 -j ACCEPT
iptables --append FORWARD --in-interface eth0 -j ACCEPT

# ======================== ufw ===================

ufw allow 22 
ufw allow 1723 

nano /etc/ufw/before.rules 
# NAT table rules 
*nat 
:POSTROUTING ACCEPT [0:0] 
# Allow forward traffic to eth0 
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE 
# Process the NAT table rules 
COMMIT 

# before the line # drop INVALID packets ... add: 
-A ufw-before-input -p 47 -j ACCEPT 

ufw disable 
ufw enable

MacBookPro13
Ничего не предвещало беды, OS X оповестила меня об обновлениях системы. Apple рекомендовала обновить SMC для устранения возможных проблем с аккумулятором в будущем вот ссылка на это обновление http://support.apple.com/kb/DL1626. При установке обновления произошел сбой, система перезагрузилась и в результате мой Mac начал шуметь кулером как вертолет, после снова потребовалось установить это же обновление. Выполнив перезагрузку я увидел значек wrongsystem, в последствии я узнал, что это означает данная система не может быть загружена на вашем устройстве.
После этого происшествия было проведено невообразимое количество всяких экспериментов, а также посещение нескольких авторизованных центров Apple в Киеве, серия звонков в представительство Apple в Москве (так как на Украине такого представительства – нет, есть только официальный дистрибьютор). Итог получился неутешительный: в сервисном центре предлагали заменить материнскую плату по программе обмена, сумма составила примерно $500. Естественно такие деньги для восстановления устройства 2010 года выпуска я тратить не стал…
Самое интересное, что мне удалось поставить на Mac Os X 10.6.8 и он даже загружался, и я мог видеть рабочий стол и элементы управления, но длилось это не более 2-3 сек, после чего аппарат уходил в “сон”, после нажатия любых кнопок система снова активировалась, но подсветка экрана не включалась, рассмотреть, что либо можно было только при ярком свете, через 2-3 сек Mac снова засыпал… Сделав скриншот с “Об этом Mac”-> “Отчет о системе” я увидел, что вышеуказанное обновление каким-то чудесным образом прошило мне в аппарат SMC для MacBook Pro (13-inch, Early 2011) это видно на скриншоте, судя по данным Apple http://support.apple.com/kb/HT1237: AboutThisMac
MacBook был “торжественно” положен на полку до лучших времен или для продажи по запчастям.
Спустя несколько месяцев было решено продать полурабочее устройство. Я отфотографировал аппарат и напоследок с товарищем решили его еще раз помучать. У товарища нашелся переходник на DVI и мы подключили Mac к внешнему монитору, к нашему удивлению он работал, но при этом родной экран не был активен, а так же кулер работал не выключаясь. Так как мы получили возможность неограниченно по времени проводить манипуляции с устройством мы вооружились Google и провели серию, как оказалось позже успешных действий.
Итак рецепт:

  • необходимо скачать “злощастное” обновление MacBookProSMCUpdate1.6.dmg
  • подключаем образ и распаковываем MacBookProSMCUpdate1.6.pkg, при помощи распаковщика http://www.timdoug.com/unpkg/, внутри мы увидим два обновления: для MacBook Pro (13-inch, Mid 2010) и для MacBook Pro (13-inch, Early 2011)
    Нас интересует папка MacBookProSMCUpdate/MacBookProSMCUpdate/System/Library/CoreServices/Firmware Updates/2010MacBookPro13SMC16 и соответственно 2 файла 2010MBP13.smc и SmcFlasher.efi. Ложим эти файлы в любую папку (я ложил поближе к корню, позже нам они нужны будут из консоли)
  • Следующий шаг – скачивание и установка boot menu rEFIt http://refit.sourceforge.net/ Здесь все по инструкции от разработчиков.
    При перезагрузке системы вы должны увидеть меню от rEFIt – выбираем shell.efi rEFIt Загрузится оболочка похожая на консоль.
    Пишем в строке fs1: и жмем Enter,теперь вы находитесь в вашем разделе HDD и можете перейти в папку с заранее подготовленными файлами 2010MBP13.smc и SmcFlasher.efi.далее пишем в командной строке SmcFlasher.efi -reset 1 и нажимаем Enter

    далее пишем SmcFlasher.efi -force -LoadApp 2010MBP15.smc -norestart и снова жмем Enter

    После проделанных манипуляций у меня перестал шуметь кулер. Я выключил и снова включил MacBook и к моему искреннему удивлению аппарат заработал! Этот пост я пишу именно с него.
    P.S. Хотелось бы предостеречь потенциальных экспериментаторов – все, что вы будете делать, вы будете делать под свою ответственность без каких либо гарантий!

Немного погуглив вы скорее всего обнаружите
PHPExcel – отличный класс для манипуляций с данными формата Excel.
Можно использовать просто подключив как класс к вашему проекту, а можно воспользоваться трудом коллег и подключить как модуль: Модуль PHPExcel для kohanaframework

На момент написания поста – при загрузке с  github данного модуля папка vendor/PHPExcel – оказалась пуста, просто ложим туда содержимое самого класса PHPExcel.

Использование модуля достаточно простое и описано в Readme.

Кратко продублирую

чтение данных из файла spreadsheet.xlsx, находящегося в корне нашего сайта:

$spreadsheet = Spreadsheet::factory(
          array(
                    'filename' => 'spreadsheet.xlsx'
          ), FALSE)
          ->load()
          ->read();
foreach ($spreadsheet as $v)
{
          echo $v['A'].',';
// где $v['A'] - данные из ячейки A страницы Excel
}

запись данных в файл Excel (в модуле обнаружены ошибки, ждем правок, для создания файлов пока можно использовать модуль https://github.com/rafsoaken/kohana-phpexcel):

$spreadsheet = Spreadsheet::factory(array(
      'author'  => 'Kohana-app',
      'title'      => 'Отчет',
      'subject' => 'Тема',
      'description'  => 'Описание',
      'path' => '/',
      'name' => 'report'
));
$spreadsheet->set_active_worksheet(0);
$as = $spreadsheet->get_active_worksheet();
$as->setTitle('Потребители');
$as->getDefaultStyle()->getFont()->setSize(9);

$as->getStyle('A1:G1')->applyFromArray(Kohana::$config->load('styles.header'));
$as->getRowDimension(1)->setRowHeight(24);
$as->getStyle('A1:G1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$as->getStyle('A1:G1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

$as->getColumnDimension('A')->setWidth(8);
$as->getColumnDimension('B')->setWidth(12);
$as->getColumnDimension('C')->setWidth(46);
$as->getColumnDimension('D')->setWidth(36);

$sh = array(
    1 => array('День','Пользователь','Количество','Цена'),
    2 => array(1, 'Женя', 5, 587),
    3 => array(2, 'Денис', 3, 981),
    4 => array(3, 'Анна', 1, 214)
);

$spreadsheet->set_data($sh, false);
$spreadsheet->send();

Для тех кому лень качать из разных источников вот ссылки на укомплектованный модуль для соответствующих версий:
phpexcel_kohana3.2

phpexcel_kohana3.3