Hi Becket, Thank you for your opinion. Frankly, I have no strong opinion on configuration name. In this problem, I will follow the community's choice. (I like your idea in that it has a notion of 'scope' per compression codec. However, it should be implemented on top of new config type like Map; It will require another KIP as a prerequisite, but if the community prefer this way, I will take the task.)
(One minor correction: the one who thought 'producer' compression config would cause a problem at broker was me, not Ismael - and Ismael reassured me there will be no problem with it.) To All, How about Becket's idea of 'compression.config' option? Best, Dongjin On Wed, Jan 23, 2019 at 1:16 PM Becket Qin <becket....@gmail.com> wrote: > Hi Dongjin, > > Thanks for the KIP and sorry for being a bit late on the discussion. > > It makes sense to expose the configuration for compression types. But I am > wondering if there is a better way to do that than what proposed in the > KIP. What I feel confusing is that we are effectively sharing the > configuration across different compression types, the meaning of the > configuration are actually kind of different depending on the compression > type. This will end up with issues like what Ismael has brought up earlier. > Say if the broker has compression type of producer (this may result in > mixed compression type in the same topic), and for some reason the broker > needs to re-compress the topic (e.g. due to log compaction), a single topic > level compression config may not work, because a valid compression level > for lz4 maybe invalid for gzip. > > One alternative I am thinking is to provide a "compression.config" > configuration, inside which it specifies configuration used by each > specific compression type as k-v pairs. The format could use some name > space as well. For example, > > > compression.config="gzip.compression.level=5,lz4.compression.level=17,zstd.compression.level=22". > > Each compression type will just pick whatever configuration they need from > the k-v pairs defined in this config. > > Besides clarity, some other benefits are: > 1. Extensibility, we don't have to add more configuration when we add new > compression types, or expose new config for a particular compression type. > 2. Even for the same config, different compression type may have different > terminologies. With the approach we can honor those terminologies instead > of shoehorning them into the same configuration name. > > What do you think? > > Thanks, > > Jiangjie (Becket) Qin > > > > > > On Wed, Jan 23, 2019 at 12:07 AM Dongjin Lee <dong...@apache.org> wrote: > > > Hello. I just fixed the draft implementation, with rebasing onto the > latest > > trunk. The KIP was also restored. > > > > Please have a look, and if there is no major problem, please vote to the > > voting thread. You know, KIP freeze for 2.2.0 is almost imminent. > > > > Thanks, > > Dongjin > > > > On Tue, Jan 22, 2019 at 1:04 AM Ismael Juma <ism...@juma.me.uk> wrote: > > > > > Thanks! > > > > > > Ismael > > > > > > On Mon, Jan 21, 2019 at 6:02 AM Dongjin Lee <dong...@apache.org> > wrote: > > > > > > > Hi Ismael, > > > > > > > > After reviewing > > > `LogValidator#validateMessagesAndAssignOffsetsCompressed`, > > > > yes, you are right. If source codec and target codec is identical and > > the > > > > magic is above 0, the broker can do an in-place assignment, without > > > > recompressing. Sorry for my misunderstanding. > > > > > > > > Since we don't need `compression.[gzip,lz4,zstd].level` and > > > > `compression.[gzip,snappy,lz4].buffer.size` anymore, I will revert > > those > > > > changes and update the KIP with the recent discussions. I will > complete > > > it > > > > in 48 hours from now. > > > > > > > > Thanks, > > > > Dongjin > > > > > > > > On Mon, Jan 21, 2019 at 4:18 PM Dongjin Lee <dong...@apache.org> > > wrote: > > > > > > > > > I see. Let me have a check. If not needed, of course, we don't have > > to > > > > > waste on configuration options. > > > > > > > > > > Since the KIP deadline is imminent, I just opened the voting > thread. > > > > Let's > > > > > continue the discussion here. > > > > > > > > > > Best, > > > > > Dongjin > > > > > > > > > > On Mon, Jan 21, 2019 at 1:30 AM Ismael Juma <ism...@juma.me.uk> > > wrote: > > > > > > > > > >> Hi Dongjin, > > > > >> > > > > >> When the compression type is "producer", then the broker doesn't > > > > >> recompress > > > > >> though. Thinking about it some more, there are some uncommon cases > > > where > > > > >> recompression does happen (the old (and hopefully hardly used by > > now) > > > > >> message format == 0 and some edge cases), so it is a good point > you > > > > >> raised. > > > > >> > > > > >> It's a bit unfortunate to add so many topic configs for cases that > > > > >> probably > > > > >> don't matter. That is, if you are using "producer" compression, > you > > > > >> probably don't need to configure these settings and can live with > > the > > > > >> defaults. Perhaps we should only support the topic config for the > > > cases > > > > >> where you are actually recompressing in the broker. > > > > >> > > > > >> What do you think? I'd be interested in other people's thoughts > too. > > > > >> > > > > >> Ismael > > > > >> > > > > >> On Sun, Jan 20, 2019 at 2:14 AM Dongjin Lee <dong...@apache.org> > > > wrote: > > > > >> > > > > >> > Hi Ismael, > > > > >> > > > > > >> > It seems like it needs more explanation. Here is the detailed > > > > reasoning. > > > > >> > > > > > >> > You know, topic and broker's 'compression.type' allows > > > 'uncompressed', > > > > >> > 'producer' with standard codecs (i.e., gzip, snappy, lz4, zstd.) > > And > > > > >> this > > > > >> > configuration is used by the broker in the re-compressing > process > > > > after > > > > >> > offset assignment. After this feature, the new configs, > > > > >> 'compression.level' > > > > >> > and 'compression.buffer.size', also will be used in this > process. > > > > >> > > > > > >> > The problem arises when given topic's compression type (whether > it > > > was > > > > >> > inherited from broker's configuration or explicitly set) is > > > > 'producer.' > > > > >> > With this setting, the compression codec to be used is decided > by > > > the > > > > >> > producer client. Since there is no way to restore the > compression > > > > level > > > > >> and > > > > >> > buffer size from the message, we can take the following > > strategies: > > > > >> > > > > > >> > 1. Just use given 'compression.level' and > > 'compression.buffer.size' > > > > >> > settings. > > > > >> > > > > > >> > It will cause so many errors. Let's imagine the case of topic's > > > > >> > configuration is { compression.type=producer, > > compression.level=10, > > > > >> > compression.buffer.size=8192 }. In this case, all producers with > > > gzip > > > > or > > > > >> > lz4 compressed messages will result in an error. (gzip doesn't > > allow > > > > >> > compression level 10, and lz4 also for a buffer size of 8192.) > > > > >> > > > > > >> > 2. Extend the message format to include compression > > configurations. > > > > >> > > > > > >> > With this strategy, we need to change the message format - it's > a > > > too > > > > >> big > > > > >> > change. > > > > >> > > > > > >> > 3. If topic's compression.type is 'producer', use the default > > > > >> configuration > > > > >> > for the given codec. > > > > >> > > > > > >> > With this strategy, allowing fine-grained compression > > configuration > > > is > > > > >> > meaningless. > > > > >> > > > > > >> > For the above reasons, I think the only alternative is providing > > > > options > > > > >> > that can be used when the topic's 'compression.type' is > > 'producer.' > > > In > > > > >> > other words, adding compression.[gzip, lz4, zstd].level and > > > > >> > compression.[gzip.snappy.lz4].buffer.size options - and it is > > what I > > > > >> did in > > > > >> > the last modification. > > > > >> > > > > > >> > (wait, the reasoning above should be included in the KIP in the > > > > rejected > > > > >> > alternatives section, isn't it?) > > > > >> > > > > > >> > Thanks, > > > > >> > Dongjin > > > > >> > > > > > >> > On Sun, Jan 20, 2019 at 2:33 AM Ismael Juma <ism...@juma.me.uk> > > > > wrote: > > > > >> > > > > > >> > > Hi Dongjin, > > > > >> > > > > > > >> > > For topic level, you can only have a single compression type > so > > > the > > > > >> way > > > > >> > it > > > > >> > > was before was fine, right? The point you raise is how to set > > > broker > > > > >> > > defaults that vary depending on the compression type, correct? > > > > >> > > > > > > >> > > Ismael > > > > >> > > > > > > >> > > On Mon, Jan 14, 2019 at 10:18 AM Dongjin Lee < > > dong...@apache.org> > > > > >> wrote: > > > > >> > > > > > > >> > > > I just realized that there was a missing hole in the KIP, > so I > > > > fixed > > > > >> > it. > > > > >> > > > The draft implementation will be updated soon. > > > > >> > > > > > > > >> > > > In short, the proposed change did not regard the case of the > > > topic > > > > >> or > > > > >> > > > broker's 'compression.type' is 'producer'; in this case, the > > > > broker > > > > >> has > > > > >> > > to > > > > >> > > > handle all kinds of the supported codec. So I added > additional > > > > >> options > > > > >> > > > (compression.[gzip,snappy,lz4, zstd].level, > > > > >> > compression.[gzip,snappy,lz4, > > > > >> > > > zstd].buffer.size) with handling routines. > > > > >> > > > > > > > >> > > > Please have a look when you are free. > > > > >> > > > > > > > >> > > > Thanks, > > > > >> > > > Dongjin > > > > >> > > > > > > > >> > > > On Mon, Jan 7, 2019 at 6:23 AM Dongjin Lee < > > dong...@apache.org> > > > > >> wrote: > > > > >> > > > > > > > >> > > > > Thanks for pointing out Ismael. It's now updated. > > > > >> > > > > > > > > >> > > > > Best, > > > > >> > > > > Dongjin > > > > >> > > > > > > > > >> > > > > On Mon, Jan 7, 2019 at 4:36 AM Ismael Juma < > > isma...@gmail.com > > > > > > > > >> > wrote: > > > > >> > > > > > > > > >> > > > >> Thanks Dongjin. One minor suggestion: we should mention > > that > > > > the > > > > >> > > broker > > > > >> > > > >> side configs are also topic configs (i.e. can be set for > a > > > > given > > > > >> > > topic). > > > > >> > > > >> > > > > >> > > > >> Ismael > > > > >> > > > >> > > > > >> > > > >> On Sun, Jan 6, 2019, 10:37 AM Dongjin Lee < > > > dong...@apache.org > > > > >> > wrote: > > > > >> > > > >> > > > > >> > > > >> > Happy new year. > > > > >> > > > >> > > > > > >> > > > >> > I just updated the title and contents of KIP and Jira > > > issue, > > > > >> with > > > > >> > > > >> updated > > > > >> > > > >> > draft implementation. Now both of compression level and > > > > buffer > > > > >> > size > > > > >> > > > >> options > > > > >> > > > >> > are available to producer and broker configuration. You > > can > > > > >> check > > > > >> > > the > > > > >> > > > >> > updated KIP from modified URL: > > > > >> > > > >> > > > > > >> > > > >> > > > > > >> > > > >> > > > > > >> > > > >> > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-390%3A+Allow+fine-grained+configuration+for+compression > > > > >> > > > >> > > > > > >> > > > >> > Please have a look when you are free. > > > > >> > > > >> > > > > > >> > > > >> > Thanks, > > > > >> > > > >> > Dongjin > > > > >> > > > >> > > > > > >> > > > >> > On Mon, Dec 3, 2018 at 12:50 AM Ismael Juma < > > > > isma...@gmail.com > > > > >> > > > > > >> > > > wrote: > > > > >> > > > >> > > > > > >> > > > >> > > The updated title sounds fine to me. > > > > >> > > > >> > > > > > > >> > > > >> > > Ismael > > > > >> > > > >> > > > > > > >> > > > >> > > On Sun, Dec 2, 2018, 5:25 AM Dongjin Lee < > > > > dong...@apache.org > > > > >> > > wrote: > > > > >> > > > >> > > > > > > >> > > > >> > > > Hi Ismael, > > > > >> > > > >> > > > > > > > >> > > > >> > > > Got it. Your direction is perfectly reasonable. I > am > > > now > > > > >> > > updating > > > > >> > > > >> the > > > > >> > > > >> > KIP > > > > >> > > > >> > > > document and the implementation. > > > > >> > > > >> > > > > > > > >> > > > >> > > > By allowing the buffer/block size to be > configurable, > > > it > > > > >> would > > > > >> > > be > > > > >> > > > >> > better > > > > >> > > > >> > > to > > > > >> > > > >> > > > update the title of the KIP like 'Allow > fine-grained > > > > >> > > configuration > > > > >> > > > >> for > > > > >> > > > >> > > > compression'. Is that right? > > > > >> > > > >> > > > > > > > >> > > > >> > > > @Other committers: > > > > >> > > > >> > > > > > > > >> > > > >> > > > Is there any other opinion on allowing the > > buffer/block > > > > >> size > > > > >> > to > > > > >> > > be > > > > >> > > > >> > > > configurable? > > > > >> > > > >> > > > > > > > >> > > > >> > > > Thanks, > > > > >> > > > >> > > > Dongjin > > > > >> > > > >> > > > > > > > >> > > > >> > > > On Thu, Nov 29, 2018 at 1:45 AM Ismael Juma < > > > > >> > ism...@juma.me.uk> > > > > >> > > > >> wrote: > > > > >> > > > >> > > > > > > > >> > > > >> > > > > Hi Dongjin, > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > To clarify, I mean a broker topic config with > > regards > > > > to > > > > >> > point > > > > >> > > > 1. > > > > >> > > > >> As > > > > >> > > > >> > > you > > > > >> > > > >> > > > > know, compression can be done by the producer > > and/or > > > by > > > > >> the > > > > >> > > > >> broker. > > > > >> > > > >> > The > > > > >> > > > >> > > > > default is for the broker to just use whatever > > > > >> compression > > > > >> > was > > > > >> > > > >> used > > > > >> > > > >> > by > > > > >> > > > >> > > > the > > > > >> > > > >> > > > > producer, but this can be changed by the user on > a > > > per > > > > >> topic > > > > >> > > > >> basis. > > > > >> > > > >> > It > > > > >> > > > >> > > > > seems like it would make sense for the configs to > > be > > > . > > > > >> > > > consistent > > > > >> > > > >> > > between > > > > >> > > > >> > > > > producer and broker. > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > For point 2, I haven't looked at the > > implementation, > > > > but > > > > >> we > > > > >> > > > could > > > > >> > > > >> do > > > > >> > > > >> > it > > > > >> > > > >> > > > in > > > > >> > > > >> > > > > the `CompressionType` enum by invoking the right > > > > >> constructor > > > > >> > > or > > > > >> > > > >> > > > retrieving > > > > >> > > > >> > > > > the default value via a constant (if defined). > > That's > > > > an > > > > >> > > > >> > implementation > > > > >> > > > >> > > > > detail and can be discussed in the PR. The more > > > general > > > > >> > point > > > > >> > > is > > > > >> > > > >> to > > > > >> > > > >> > > rely > > > > >> > > > >> > > > on > > > > >> > > > >> > > > > the library defaults instead of choosing one > > > ourselves. > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > For point 3, I'm in favour of doing that in this > > KIP. > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > Ismael > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > On Wed, Nov 28, 2018 at 7:01 AM Dongjin Lee < > > > > >> > > dong...@apache.org > > > > >> > > > > > > > > >> > > > >> > > wrote: > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > > Thank you Ismael, here are the answers: > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > *1. About topic config* > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > After some consideration, I concluded that > topic > > > > config > > > > >> > > > doesn't > > > > >> > > > >> > need > > > > >> > > > >> > > to > > > > >> > > > >> > > > > > support compression.level. Here is why: since > the > > > > >> > > compression > > > > >> > > > is > > > > >> > > > >> > > > > conducted > > > > >> > > > >> > > > > > by the client, the one who can select the best > > > > >> compression > > > > >> > > > >> level is > > > > >> > > > >> > > the > > > > >> > > > >> > > > > > client itself. Let us assume that the > compression > > > > >> level is > > > > >> > > set > > > > >> > > > >> at > > > > >> > > > >> > the > > > > >> > > > >> > > > > topic > > > > >> > > > >> > > > > > config level. In that case, there is a > > possibility > > > > that > > > > >> > the > > > > >> > > > >> > > compression > > > > >> > > > >> > > > > > level is not optimal for some producers. > > Actually, > > > > >> Kafka's > > > > >> > > go > > > > >> > > > >> > client > > > > >> > > > >> > > > also > > > > >> > > > >> > > > > > supports compression level functionality for > the > > > > >> producer > > > > >> > > > config > > > > >> > > > >> > > only. > > > > >> > > > >> > > > > > < > > > > >> https://github.com/Shopify/sarama/blob/master/config.go> > > > > >> > > > >> (wait, > > > > >> > > > >> > do > > > > >> > > > >> > > we > > > > >> > > > >> > > > > > need > > > > >> > > > >> > > > > > to add this reasoning in the KIP, rejected > > > > alternatives > > > > >> > > > >> section?) > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > *2. About default level* > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > As of current draft implementation, the default > > > > >> > compression > > > > >> > > is > > > > >> > > > >> set > > > > >> > > > >> > on > > > > >> > > > >> > > > the > > > > >> > > > >> > > > > > CompressionType enum. Of course, changing this > > > > strategy > > > > >> > into > > > > >> > > > >> > relying > > > > >> > > > >> > > > on a > > > > >> > > > >> > > > > > method from the library to pick the default > > > > compression > > > > >> > > level > > > > >> > > > >> seems > > > > >> > > > >> > > > > > possible, like `GZIPBlockOutputStream` does. In > > > this > > > > >> case, > > > > >> > > we > > > > >> > > > >> need > > > > >> > > > >> > to > > > > >> > > > >> > > > add > > > > >> > > > >> > > > > > similar wrapper class for zstd and modify lz4 > the > > > > >> wrapper > > > > >> > > > also. > > > > >> > > > >> Add > > > > >> > > > >> > > to > > > > >> > > > >> > > > > > this, it seems like we need to explicitly state > > > that > > > > we > > > > >> > > follow > > > > >> > > > >> the > > > > >> > > > >> > > > > default > > > > >> > > > >> > > > > > compression level of the codec in the > > > documentation. > > > > Is > > > > >> > this > > > > >> > > > >> what > > > > >> > > > >> > you > > > > >> > > > >> > > > > > intended? > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > *3. Whether to allow the buffer/block size to > be > > > > >> > > configurable* > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > Well, As of current draft implementation, the > lz4 > > > > >> level is > > > > >> > > > >> > > implemented > > > > >> > > > >> > > > as > > > > >> > > > >> > > > > > block size; this is caused by my > misunderstanding > > > on > > > > >> lz4. > > > > >> > > > After > > > > >> > > > >> > > > reviewing > > > > >> > > > >> > > > > > lz4 today, I found that it also supports > > > compression > > > > >> level > > > > >> > > of > > > > >> > > > >> 1~16 > > > > >> > > > >> > > > > > (default: 1), not block size. I will fix it in > > this > > > > >> > weekend > > > > >> > > by > > > > >> > > > >> > > updating > > > > >> > > > >> > > > > the > > > > >> > > > >> > > > > > wrapper class. > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > For the problem of the buffer/block size, I > have > > no > > > > >> strong > > > > >> > > > >> opinion. > > > > >> > > > >> > > If > > > > >> > > > >> > > > > the > > > > >> > > > >> > > > > > community needs it, I will do it all together. > > How > > > do > > > > >> you > > > > >> > > > think? > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > In short, it seems like I need to update the > KIP > > > > >> document > > > > >> > > for > > > > >> > > > >> issue > > > > >> > > > >> > > #1 > > > > >> > > > >> > > > > and > > > > >> > > > >> > > > > > update the compression wrapper for issue #2, > #3. > > Is > > > > >> this > > > > >> > > okay? > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > Thanks, > > > > >> > > > >> > > > > > Dongjin > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > On Wed, Nov 28, 2018 at 12:34 AM Ismael Juma < > > > > >> > > > isma...@gmail.com > > > > >> > > > >> > > > > > >> > > > >> > > > wrote: > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > > Thanks for the KIP, this is helpful. A few > > > > >> questions: > > > > >> > > > >> > > > > > > > > > > >> > > > >> > > > > > > 1. Have we considered whether we want to > allow > > a > > > > >> similar > > > > >> > > > topic > > > > >> > > > >> > > > config? > > > > >> > > > >> > > > > > > 2. Can we rely on a method from the library > to > > > pick > > > > >> the > > > > >> > > > >> default > > > > >> > > > >> > > > > > compression > > > > >> > > > >> > > > > > > level if compression.level is not set? We do > it > > > for > > > > >> gzip > > > > >> > > and > > > > >> > > > >> it > > > > >> > > > >> > > would > > > > >> > > > >> > > > > > seem > > > > >> > > > >> > > > > > > reasonable to do something similar for the > > other > > > > >> > > compression > > > > >> > > > >> > > > libraries. > > > > >> > > > >> > > > > > > 3. Do we want to allow the buffer/block size > to > > > be > > > > >> > > > >> configurable? > > > > >> > > > >> > > This > > > > >> > > > >> > > > > has > > > > >> > > > >> > > > > > > an impact on memory usage and people may want > > to > > > > >> trade > > > > >> > > > >> > compression > > > > >> > > > >> > > > for > > > > >> > > > >> > > > > > > less/more memory in some cases. For example, > > the > > > > >> default > > > > >> > > for > > > > >> > > > >> LZ4 > > > > >> > > > >> > is > > > > >> > > > >> > > > > 64KB > > > > >> > > > >> > > > > > > which is a bit high. > > > > >> > > > >> > > > > > > > > > > >> > > > >> > > > > > > Ismael > > > > >> > > > >> > > > > > > > > > > >> > > > >> > > > > > > On Sun, Nov 18, 2018, 2:07 PM Dongjin Lee < > > > > >> > > > dong...@apache.org > > > > >> > > > >> > > wrote: > > > > >> > > > >> > > > > > > > > > > >> > > > >> > > > > > > > Hello dev, > > > > >> > > > >> > > > > > > > > > > > >> > > > >> > > > > > > > I hope to initiate the discussion of > KIP-390: > > > Add > > > > >> > > producer > > > > >> > > > >> > option > > > > >> > > > >> > > > to > > > > >> > > > >> > > > > > > adjust > > > > >> > > > >> > > > > > > > compression level > > > > >> > > > >> > > > > > > > < > > > > >> > > > >> > > > > > > > > > > > >> > > > >> > > > > > > > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > >> > > > >> > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-390%3A+Add+producer+option+to+adjust+compression+level > > > > >> > > > >> > > > > > > > >. > > > > >> > > > >> > > > > > > > All feedbacks will be highly appreciated. > > > > >> > > > >> > > > > > > > > > > > >> > > > >> > > > > > > > Best, > > > > >> > > > >> > > > > > > > Dongjin > > > > >> > > > >> > > > > > > > > > > > >> > > > >> > > > > > > > -- > > > > >> > > > >> > > > > > > > *Dongjin Lee* > > > > >> > > > >> > > > > > > > > > > > >> > > > >> > > > > > > > *A hitchhiker in the mathematical world.* > > > > >> > > > >> > > > > > > > > > > > >> > > > >> > > > > > > > *github: <http://goog_969573159/> > > > > >> > > github.com/dongjinleekr > > > > >> > > > >> > > > > > > > <http://github.com/dongjinleekr>linkedin: > > > > >> > > > >> > > > > > > kr.linkedin.com/in/dongjinleekr > > > > >> > > > >> > > > > > > > <http://kr.linkedin.com/in/dongjinleekr > > > > >> >slideshare: > > > > >> > > > >> > > > > > > > www.slideshare.net/dongjinleekr > > > > >> > > > >> > > > > > > > <http://www.slideshare.net/dongjinleekr>* > > > > >> > > > >> > > > > > > > > > > > >> > > > >> > > > > > > > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > -- > > > > >> > > > >> > > > > > *Dongjin Lee* > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > *A hitchhiker in the mathematical world.* > > > > >> > > > >> > > > > > *github: <http://goog_969573159/> > > > > >> github.com/dongjinleekr > > > > >> > > > >> > > > > > <https://github.com/dongjinleekr>linkedin: > > > > >> > > > >> > > > > kr.linkedin.com/in/dongjinleekr > > > > >> > > > >> > > > > > <https://kr.linkedin.com/in/dongjinleekr > > > > >speakerdeck: > > > > >> > > > >> > > > > > speakerdeck.com/dongjin > > > > >> > > > >> > > > > > <https://speakerdeck.com/dongjin>* > > > > >> > > > >> > > > > > > > > > >> > > > >> > > > > > > > > >> > > > >> > > > > > > > >> > > > >> > > > > > > > >> > > > >> > > > -- > > > > >> > > > >> > > > *Dongjin Lee* > > > > >> > > > >> > > > > > > > >> > > > >> > > > *A hitchhiker in the mathematical world.* > > > > >> > > > >> > > > *github: <http://goog_969573159/> > > > > github.com/dongjinleekr > > > > >> > > > >> > > > <https://github.com/dongjinleekr>linkedin: > > > > >> > > > >> > > kr.linkedin.com/in/dongjinleekr > > > > >> > > > >> > > > <https://kr.linkedin.com/in/dongjinleekr > > >speakerdeck: > > > > >> > > > >> > > > speakerdeck.com/dongjin > > > > >> > > > >> > > > <https://speakerdeck.com/dongjin>* > > > > >> > > > >> > > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > >> > > > >> > > > > > >> > > > >> > -- > > > > >> > > > >> > *Dongjin Lee* > > > > >> > > > >> > > > > > >> > > > >> > *A hitchhiker in the mathematical world.* > > > > >> > > > >> > *github: <http://goog_969573159/> > > github.com/dongjinleekr > > > > >> > > > >> > <https://github.com/dongjinleekr>linkedin: > > > > >> > > > >> kr.linkedin.com/in/dongjinleekr > > > > >> > > > >> > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > >> > > > >> > speakerdeck.com/dongjin > > > > >> > > > >> > <https://speakerdeck.com/dongjin>* > > > > >> > > > >> > > > > > >> > > > >> > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > -- > > > > >> > > > > *Dongjin Lee* > > > > >> > > > > > > > > >> > > > > *A hitchhiker in the mathematical world.* > > > > >> > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > >> > > > > <https://github.com/dongjinleekr>linkedin: > > > > >> > > > kr.linkedin.com/in/dongjinleekr > > > > >> > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > >> > > > speakerdeck.com/dongjin > > > > >> > > > > <https://speakerdeck.com/dongjin>* > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > -- > > > > >> > > > *Dongjin Lee* > > > > >> > > > > > > > >> > > > *A hitchhiker in the mathematical world.* > > > > >> > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > >> > > > <https://github.com/dongjinleekr>linkedin: > > > > >> > > kr.linkedin.com/in/dongjinleekr > > > > >> > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > >> > > > speakerdeck.com/dongjin > > > > >> > > > <https://speakerdeck.com/dongjin>* > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > >> > -- > > > > >> > *Dongjin Lee* > > > > >> > > > > > >> > *A hitchhiker in the mathematical world.* > > > > >> > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > >> > <https://github.com/dongjinleekr>linkedin: > > > > >> kr.linkedin.com/in/dongjinleekr > > > > >> > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > >> > speakerdeck.com/dongjin > > > > >> > <https://speakerdeck.com/dongjin>* > > > > >> > > > > > >> > > > > > > > > > > > > > > > -- > > > > > *Dongjin Lee* > > > > > > > > > > *A hitchhiker in the mathematical world.* > > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > > <https://github.com/dongjinleekr>linkedin: > > > > kr.linkedin.com/in/dongjinleekr > > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > speakerdeck.com/dongjin > > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > > > > > -- > > > > *Dongjin Lee* > > > > > > > > *A hitchhiker in the mathematical world.* > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > <https://github.com/dongjinleekr>linkedin: > > > kr.linkedin.com/in/dongjinleekr > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > speakerdeck.com/dongjin > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > -- > > *Dongjin Lee* > > > > *A hitchhiker in the mathematical world.* > > *github: <http://goog_969573159/>github.com/dongjinleekr > > <https://github.com/dongjinleekr>linkedin: > kr.linkedin.com/in/dongjinleekr > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > speakerdeck.com/dongjin > > <https://speakerdeck.com/dongjin>* > > > -- *Dongjin Lee* *A hitchhiker in the mathematical world.* *github: <http://goog_969573159/>github.com/dongjinleekr <https://github.com/dongjinleekr>linkedin: kr.linkedin.com/in/dongjinleekr <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: speakerdeck.com/dongjin <https://speakerdeck.com/dongjin>*