이 책은 NoSQL의 개요를 담고있다.
NoSQL의 전체적인 추세가 그때와 지금은 다르지 않은 것 같다.
NoSQL이 어떤 종류가 있으며, 기존 문제들을 어떻게 풀려고 하는지 간결하게 설명한다.
흥미로운 책이었다. MongoDB를 아무생각없이 쓰고 있었는데 조만간 DB 관련된 책을 봐야겠다는 생각을 한다.
MySQL도 아무생각없이 썼던게 아닌가 싶다. 공부해야겠다.
이 책은 NoSQL의 개요를 담고있다.
NoSQL의 전체적인 추세가 그때와 지금은 다르지 않은 것 같다.
NoSQL이 어떤 종류가 있으며, 기존 문제들을 어떻게 풀려고 하는지 간결하게 설명한다.
흥미로운 책이었다. MongoDB를 아무생각없이 쓰고 있었는데 조만간 DB 관련된 책을 봐야겠다는 생각을 한다.
MySQL도 아무생각없이 썼던게 아닌가 싶다. 공부해야겠다.
class Functor f where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a(<$>) :: Functor f => (a -> b) -> f a -> f b(<*>) :: Applicative f => f (a -> b) -> f a -> f b
class Applicative m => Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
-- fmap or map (Functor)-- flatMap (Monad)
(a -> b) -> f a -> f bm a -> (a -> m b) -> m b
var a = [1,2,3]function addOne(x) {return x + 1;}a.map(addOne); // [2,3,4]
var a = [1,2,3]
function double(x) { return [x,x] }
var b = a.map(double); // [[2,2],[3,3],[4,4]]
b.map(double); // [[[2,2],[2,2]],[[3,3],[3,3]],[[4,4],[4,4]]][1,2,3] ++ [4,5,6] # [1,2,3,4,5,6]
갈 곳이 없으니 눈도 필요없다. 눈이 있을 땐 넘어졌지.이 말이 계속 머리 속에 맴도는 것이 신기하다. 특이 "눈이 있을 땐 넘어졌지" 라는 말이 신기하다.
있다고 다 보여주지 말고 안다고 다 말하지 말고 가졋다고 다 빌려주지 말고 들었다고 다 믿지 말고이 내용만을 보면 아첨에 조심하라는 말이다.
사실 오래 전에 배워서 사용했던 Phaser라는 기능이 가물가물해서 기억을 하고자 CountDownLatch와 CyclicBarrier를 비교하면서 복습을 해보았다.
하지만 대부분 Phaser보다는 CountDownLath,CyclicBarrier를 많이 사용하지 않을까 싶다.
CountDownLatch countDownLatch = new CountDownLatch(2);
Thread t = new Thread(() -> {
countDownLatch.countDown();
countDownLatch.countDown();
});
t.start();
countDownLatch.await();
System.out.println("code1");
System.out.println(0 == countDownLatch.getCount());
System.out.println("===");
CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
Thread t = new Thread(() -> {
try {
cyclicBarrier.await();
cyclicBarrier.await();
catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
});
t.start();
System.out.println("code2");
System.out.println(1 == cyclicBarrier.getNumberWaiting());
System.out.println(cyclicBarrier.isBroken());
System.out.println("===");
ListoutputScraper = Collections.synchronizedList(new ArrayList<>()); CountDownLatch countDownLatch = new CountDownLatch(7); ExecutorService es = Executors.newFixedThreadPool(20); for (int i = 0; i < 20; i++) { es.execute(() -> { long prevValue = countDownLatch.getCount(); countDownLatch.countDown(); if (countDownLatch.getCount() != prevValue) { outputScraper.add("Count Updated"); } }); } es.shutdown(); System.out.println(outputScraper); System.out.println(outputScraper.size() <= 7);
// https://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html // https://stackoverflow.com/questions/6916385/is-there-a-concurrent-list-in-javas-jdk 참고 // Collections.synchronizedList는 내가 임의로 넣은 것이다. List다음에는 Phaser에 대해 알아보자.outputScraper = Collections.synchronizedList(new ArrayList<>()); CyclicBarrier cyclicBarrier = new CyclicBarrier(7); ExecutorService es = Executors.newFixedThreadPool(20); for (int i = 0; i < 20; i++) { es.execute(() -> { int numberWaiting = cyclicBarrier.getNumberWaiting(); if (numberWaiting >= 0) { outputScraper.add("Count Updated"); } try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }); } es.shutdown(); System.out.println(outputScraper); System.out.println(outputScraper.size() > 7); cyclicBarrier.await();

var version = "3.4.1",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
// Need init if jQuery is called (just allow error to be thrown if not included)
return new jQuery.fn.init( selector, context );
},
...
/*
제이쿼리 구조를 설명하기 위해 만든 간단한 함수
*/
(function (global) {
var mini = function(name) {
return new mini.fn.init(name);
}
mini.fn = mini.prototype = {};
mini.fn.sayHi = function() {
console.log("hi " + this.name);
return this;
}
mini.fn.sayBye = function() {
console.log("bye " + this.name);
return this;
}
mini.fn.init = function(name) {
this.name = name;
}
mini.fn.init.prototype = mini.fn;
global.mini = mini;
})(window);
var M = mini("Nam");
M.sayHi().sayBye();

var M = mini("nam");
M.sayHi().sayBye();
someone : If you could do Java over again, what would you change?고슬링은 클래스를 없애고 싶다고 했다. 덧붙이자면 클래스 자체에는 문제가 없으나 extends관계가 문제이며 `implements`관계를 선호하라고 한다.
Gosling : I'd leave out classes
Using inheritance is not the only way to extend a class behavior.
But definitely is the most dangerous and harmful one.
I do not use inheritance in the 99% of my code.
And I really mean 99%.
- use interfaces to define the contracts between your classes.
- use final classes to implement behavior for those interfaces.
- use composition (through constructor dependency injection) to put things
together and prevent complexity
여자 9명이 있다고 아기가 1개월만에 나오는 것이 아니다.
Core <- DB-AccessObject -> DB
<- Network-Object
여기서 화살표 방향은 해당 객체가 무엇을 사용하는지 알려준다. 왼쪽에 있는 Core컴포넌트는 아무것도 사용하지 않아야 한다. 그래야 플랫폼이 바뀌어도 사용할 수 있다. DB를 사용하기로 결정했어도 Core는 변경되지 않는다.
그런데 말이 되지 않는다. 만약 Network에서 요청이 오고 DB-AccessObject를 실행해야 하는데 어떻게 Core에서는 사용하지도 않는데 실행을 한다는 거지? 그 답은 아래 DI에 있다(!!)
아래처럼 화살표가 되어 있다고 해보자.
Core -> DB-AccessObject -> DB
<- Network-Object
이렇게 구현하는 것이 자연스러울 것이다. 여기서 DI를 적용하면?!
Core -> I-Persistent(in Core Component) <- DB-AccessObject -> DB
<- Network-Object
이렇게 I-Persistent를 이용하여 저장하고 조회하는 것이다. I-Persistent는 코어 컴포넌트 안에 있고, 영속성관리를 무엇으로 해도 상관이 없게 되었다.