<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>scdw.lg</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 30 Sep 2020 17:49:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. scdw.lg. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lively_siwon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[CSS] 이미지 사이즈 맞추기 (object-fit)]]></title>
            <link>https://velog.io/@lively_siwon/CSS-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%82%AC%EC%9D%B4%EC%A6%88-%EB%A7%9E%EC%B6%94%EA%B8%B0-object-fit</link>
            <guid>https://velog.io/@lively_siwon/CSS-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%82%AC%EC%9D%B4%EC%A6%88-%EB%A7%9E%EC%B6%94%EA%B8%B0-object-fit</guid>
            <pubDate>Wed, 30 Sep 2020 17:49:42 GMT</pubDate>
            <description><![CDATA[<h2 id="🌱-introduction">🌱 Introduction</h2>
<p>CSS로 크기가 서로 다른 이미지들을 관리하고 그 비율을 매번 맞춰주는 것은 쉽지않다. 유저가 웹사이트에 입력하는 이미지는 그 크기와 비율이 제각각이다. 이렇게 받은 이미지들을 모아 고정된 크기의 틀로 보여줘야 할 때 어떻게 해야 할까? </p>
<p>가끔 원본 이미지의 가로세로 비율을 무시하고 그 틀에 우겨넣는 경우도 종종 있는데, 이런 디테일의 차이가 웹사이트의 퀄리티를 좌우하는 결정적인 요인이 될 수 있다. <img src="https://images.velog.io/images/lively_siwon/post/44ad002c-22af-4833-a555-e45fa3e66511/%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C3.PNG" alt=""></p>
<h2 id="🍉-css-object-fit으로-이미지-사이즈-맞추기">🍉 css: object-fit으로 이미지 사이즈 맞추기</h2>
<p><img src="https://images.velog.io/images/lively_siwon/post/bcb18eb5-f85e-4ee7-af3d-bf0790e06bc0/image.png" alt=""> 나는 이번 프로젝트에서 css의 <code>object-fit</code> 속성을 사용했다. <strong>Unsplash API</strong>로 이미지를 검색해 검색 결과를 아래 사진과 같이 (그리드뷰처럼) 보이도록 했다. 유감스럽게도 Unsplash에서 제공하는 이미지의 크기는 모두 제각각이었다. pinterest 처럼 굳이 줄을 맞추기 않아도 되지만, 이 페이지에서 그렇게 보여줄 필요성을 느끼지 못해 사진이 보여질 크기를 따로 지정해주었다.</p>
<p>내가 만든 unsplash 검색결과 화면을 보면 이미지와 해당 이미지를 올린 사람 이름이 (by Tony Lee) 작게 표기되어 있다. 이미지와 이름텍스트를 <code>list_item</code> 이라는 <code>div</code> 태그로 묶었다. 각 이미지는 <code>list_img</code>, 각 이름텍스트는 <code>list_text</code> 로 클래스를 생성했다. </p>
<pre><code class="language-css">.list_item {
    display: inline-block;
    width: 150px;
    height: 125px;
    margin: 2px;
    overflow: hidden;
}

.list_img {
    display: inline-block;
    width: 100%;
    height: 100px;
    overflow: hidden;
    object-fit: cover;
    border-radius: 5px;
}

.list_text {
    font-size: 8px;
    margin: 0;
    padding: 0;
}</code></pre>
<p>이때 유저에게 보여지는 사진의 가로와 세로 길이를 각각 150px, 100px로 고정해두고 싶다. 주의해야 할 점은 가로나 세로 길이가 150px, 100px에 미달하는 경우에도 크기를 꽉 채워서 보여주고 싶다는 것. 이때 <code>object-fit</code> 속성을 사용한다. </p>
<p>나는 <code>object-fit: cover;</code> 로 <code>cover</code> value를 사용했다. cover는 이미지(??px ??px)의 가로세로 비율을 유지하면서 우리가 원하던 틀(150px 100px)을 가득 채운다. 만약 이미지와 틀의 가로세로비가 일치하지 않으면 이미지의 일부가 잘린다. <strong>이미지가 잘리더라도 고정된 비율로 보여주는 것이 더 중요할 때 <code>cover</code> 값을 주면 되겠다.</strong></p>
<h2 id="🍉-css-object-fit-알아보기">🍉 css: object-fit 알아보기</h2>
<p><code>object-fit</code> 속성의 다른 value들에 대해 정리해보았다. 
아래와 같이 <strong>이미지를 담는 틀</strong>과, <strong>이미지</strong> 두 가지로 나누어 생각했다.
<img src="https://images.velog.io/images/lively_siwon/post/3641eb5d-7856-4bce-8636-0fa49705560d/css.png" alt=""> </p>
<ul>
<li><strong>contain</strong> : 이미지의 <strong>가로세로 비율을 유지</strong>하면서, 이미지가 보여질 틀 내부에 들어가도록 크기를 <strong>맞춤 조절</strong>한다. 이미지와 틀의 가로세로비가 일치하지 않으면 틀의 가로세로를 모두 꽉 채우지 못하기 때문에 사실상 유저가 보는 틀은 이미지의 크기는 일관되지 않을 수 있다.</li>
<li><strong>cover</strong> : 이미지의 가로세로 비율을 유지하면서, 이미지가 보여질 틀 내부에 <strong>가득</strong> 채우도록 한다. 이미지와 틀의 가로세로 비가 일치하지 않으면 이미지의 일부가 잘려나간다. 하지만 유저가 보는 틀의 이미지는 일관된다는 장점이 있다.</li>
<li><strong>fill</strong> : 틀에 맞게 이미지의 가로 세로 길이를 조절하여 틀에 가득 차도록 한다. 이미지와 틀의 가로세로비가 일치하지 않으면 이미지의 기존 비율이 깨지고 <span style="color: coral">이미지가 찌그러진다.</span></li>
<li><strong>none</strong> : 이미지의 크기를 조절하지 않고 있는 그대로 보여준다.</li>
<li><strong>scale-down</strong> : <code>none</code>과 <code>contain</code> 중 이미지의 크기가 더 작아지는 값을 선택한다.<h2 id="🍉-대체요소와-object-fit-object-position">🍉 대체요소와 object-fit, object-position</h2>
<code>object-fit</code> 속성 외에 <code>object-position</code> 속성을 사용해 이미지가 틀 내부에 위치할 지점을 바꿀 수 있다. MDN을 참고하자면 <code>object-fit</code> 은 <span style="color:tomato">대체요소의 콘텐츠 크기</span>를 어떤 방식으로 조절해 <span style="color:cornflowerblue">요소 콘텐츠박스</span>에 채울 수 있을지를 지정한다. </li>
</ul>
<p>여기서 &#39;대체요소&#39;란, CSS의 범위를 벗어나는 외부 객체 요소를 말한다. 즉, CSS는 대체요소의 위치에는 영향을 줄 수 있지만, 콘텐츠 자체에는 영향을 줄 수 없다. </p>
<p>대체요소의 대표적인 예시로는 <code>img</code>, <code>video</code>, <code>iframe</code>, <code>audio</code> 가 있고 경우에 따라서는 <code>option</code>, <code>input</code> 도 대체요소로 동작할 수 있다. 대체요소가 콘텐츠박스(틀)에 어디에 어떻게 배치되어야 하는지는 위에서 설명했듯이 <code>object-fit</code> 과 <code>object-position</code> 두 속성으로 조절할 수 있다.</p>
<p>다만 대체요소 관련 CSS 문법은 CSS3, CSS4에서만 사용할 수 있다. 
<code>object-fit</code> 과 <code>object-position</code> 은 둘 다 IE에서 지원하지 않음을 주의하자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💻 R :: Apply function family]]></title>
            <link>https://velog.io/@lively_siwon/R-Apply-function-family</link>
            <guid>https://velog.io/@lively_siwon/R-Apply-function-family</guid>
            <pubDate>Tue, 08 Sep 2020 03:43:01 GMT</pubDate>
            <description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>R 언어에서 <strong>apply 함수는 반복문을 대체한다</strong>. Javascript에서의 <em>foreach</em> 함수와 비슷한 기능을 한다고 볼 수도 있겠다. apply function <strong>&quot;family&quot;</strong> 라고 한 이유는 apply() 함수에서 파생된 lapply, sapply, mapply 등의 함수들이 여러 개 있기 때문이다. 암튼 vector, matrix 등의 data를 주로 다루는 R 프로그래밍에서 apply 함수는 필수적이다.</p>
<p>사실 apply function family 중에서 가장 자주 쓰이는 건 apply 함수이므로 다른 함수들은 대강 어떨 때 쓰는지만 다루고 넘어가려고 한다.</p>
<h2 id="3가지-기본-apply-함수">3가지 기본 apply 함수</h2>
<p><code>apply(Object, Margin, Function)</code> : matrix objects, returns a vector
<code>lapply(Object, Function)</code> : vector, matrix, list, data frame objects, returns a list
<code>sapply(Object, Function)</code> : vector, matrix, list, data frame objects, returns a vector</p>
<p>위의 세 개 함수가 가장 기본적인 apply 함수로 쓰인다.</p>
<h4 id="apply">apply</h4>
<ul>
<li>apply 함수는 반복문을 형성해 <code>Function</code>을 <code>Object</code>의 각 element에 적용시킨다. </li>
<li>이때 <code>Margin</code> parameter가 반복의 방향을 정한다. <code>Margin</code>이 1이면 모든 행(row)에 대해 반복하고, <code>Margin</code>이 2이면 모든 열(column)에 대해 반복한다. (R 언어는 row를 1, column을 2로 간주하고 처리하니 잊지 말 것) </li>
<li>apply 함수는 <strong>matrix</strong> Object에 대해서만 적용된다. <del>vector</del> Object에는 적용할 수 없다! </li>
<li>만약 <strong>data frame</strong> Object가 parameter로 전달되면 data frame이 먼저 matrix로 변환되고 난 뒤에 함수가 적용된다.<h4 id="lapply-sapply">lapply, sapply</h4>
</li>
<li>lapply와 sapply 함수는 둘 다 <strong>vector, matrix, list, data frame Object</strong> 에 모두 적용될 수 있다. </li>
<li>마찬가지로 <code>object</code>의 각 원소를 순회하며 함수를 적용한다. lapply 함수와 sapply 함수의 차이점은 리턴값이다. lapply 함수는 list를 리턴하고, sapply 함수는 simplied form = vector로 리턴한다.</li>
<li>위의 이유 때문에 list apply, simplied form apply 의 약자로 <code>lapply</code>, <code>sapply</code> 함수가 되지 않았나 싶다.<h4 id="그-외-함수들">그 외 함수들</h4>
</li>
<li><code>vapply()</code> : sapply() 함수와 비슷한데, output format = return format 을 명확하게 지정할 수 있어 안전하게 연산할 수 있다.</li>
<li><code>tapply()</code> : 그룹별 처리를 위한 함수이다. 그룹을 parameter로 넘기고(factor type) element별 처리가 아닌, 그룹별 처리를 한다.</li>
<li><code>mapply()</code> : sapply() 함수와 비슷하지만 multiple parameters 가 넘겨진다. 기존 apply 함수들에서는 data를 먼저 인자로 넘겼지만, mapply에서는 함수를 먼저 인자로 넘긴다.</li>
</ul>
<h2 id="practices">Practices</h2>
<pre><code class="language-python">&gt; library(readxl)
&gt; t1 &lt;- read_excel(path = &quot;titanic3.xls&quot;, sheet = &quot;titanic3&quot;)</code></pre>
<pre><code class="language-python">## 경고메시지(들): 
## In read_fun(path = enc2native(normalizePath(path)), sheet_i = sheet,  :
## Coercing text to numeric in M1306 / R1306C13: &#39;328&#39;</code></pre>
<pre><code class="language-python">&gt; str(t1)</code></pre>
<pre><code class="language-python">## tibble [1,309 x 14] (S3: tbl_df/tbl/data.frame)
## $ pclass   : num [1:1309] 1 1 1 1 1 1 1 1 1 1 ...
## $ survived : num [1:1309] 1 1 0 0 0 1 1 0 1 0 ...
## $ name     : chr [1:1309] &quot;Allen, Miss. Elisabeth Walton&quot; &quot;Allison, Master. Hudson Trevor&quot; &quot;Allison, Miss. Helen Loraine&quot; &quot;Allison, Mr. Hudson Joshua Creighton&quot; ...
## $ sex      : chr [1:1309] &quot;female&quot; &quot;male&quot; &quot;female&quot; &quot;male&quot; ...
## $ age      : num [1:1309] 29 0.917 2 30 25 ...
## $ sibsp    : num [1:1309] 0 1 1 1 1 0 1 0 2 0 ...
## $ parch    : num [1:1309] 0 2 2 2 2 0 0 0 0 0 ...
## $ ticket   : chr [1:1309] &quot;24160&quot; &quot;113781&quot; &quot;113781&quot; &quot;113781&quot; ...
## $ fare     : num [1:1309] 211 152 152 152 152 ...
## $ cabin    : chr [1:1309] &quot;B5&quot; &quot;C22 C26&quot; &quot;C22 C26&quot; &quot;C22 C26&quot; ...
## $ embarked : chr [1:1309] &quot;S&quot; &quot;S&quot; &quot;S&quot; &quot;S&quot; ...
## $ boat     : chr [1:1309] &quot;2&quot; &quot;11&quot; NA NA ...
## $ body     : num [1:1309] NA NA NA 135 NA NA NA NA NA 22 ...
## $ home.dest: chr [1:1309] &quot;St Louis, MO&quot; &quot;Montreal, PQ / Chesterville, ON&quot; &quot;Montreal, PQ / Chesterville, ON&quot; &quot;Montreal, PQ / Chesterville, ON&quot; ...</code></pre>
<pre><code class="language-python">&gt; apply(t1, 2, typeof)</code></pre>
<pre><code class="language-python">##      pclass    survived        name         sex         age       sibsp 
## &quot;character&quot; &quot;character&quot; &quot;character&quot; &quot;character&quot; &quot;character&quot; &quot;character&quot; 
##       parch      ticket        fare       cabin    embarked        boat 
## &quot;character&quot; &quot;character&quot; &quot;character&quot; &quot;character&quot; &quot;character&quot; &quot;character&quot; 
##        body   home.dest 
## &quot;character&quot; &quot;character&quot; </code></pre>
<pre><code class="language-python">&gt; lapply(t1, typeof)
&gt; sapply(t1, typeof)</code></pre>
<pre><code class="language-python"># lapply(t1, typeof)
## $pclass
## [1] &quot;double&quot;
## 
## $survived
## [1] &quot;double&quot;
## 
## $name
## [1] &quot;character&quot;
## 
## $sex
## [1] &quot;character&quot;
## 
## $age
## [1] &quot;double&quot;
## 
## $sibsp
## [1] &quot;double&quot;
## 
## $parch
## [1] &quot;double&quot;
## 
## $ticket
## [1] &quot;character&quot;
## 
## $fare
## [1] &quot;double&quot;
## 
## $cabin
## [1] &quot;character&quot;
## 
## $embarked
## [1] &quot;character&quot;
## 
## $boat
## [1] &quot;character&quot;
## 
## $body
## [1] &quot;double&quot;
## 
## $home.dest
## [1] &quot;character&quot;

# sapply(t1, typeof)
##     pclass    survived        name         sex         age       sibsp 
##   &quot;double&quot;    &quot;double&quot; &quot;character&quot; &quot;character&quot;    &quot;double&quot;    &quot;double&quot; 
##      parch      ticket        fare       cabin    embarked        boat 
##   &quot;double&quot; &quot;character&quot;    &quot;double&quot; &quot;character&quot; &quot;character&quot; &quot;character&quot; 
##       body   home.dest 
##   &quot;double&quot; &quot;character&quot; </code></pre>
<h4 id="apply-함수-대신-for-loops-사용하기">apply 함수 대신 for loops 사용하기</h4>
<pre><code class="language-python">&gt; m1 &lt;- matrix(1:20, nrow=4, ncol=5)
&gt; myapplyCol &lt;- function(Obj, Margin, Func, ...) {
    result &lt;- vector()
    for(i in 1:ncol(Obj))
      result &lt;- c(result, Func(Obj[,i], ...))
    return(result)
  }
&gt; myapplyRow &lt;- function(Obj, Margin, Func, ...) {
    result &lt;- vector()
    for(i in 1:nrow(Obj))
      result &lt;- c(result, Func(Obj[i,], ...))
    return(result)
  }
&gt; m1
&gt; myapplyCol(m1, 2, sum)
&gt; myapplyRow(m1, 1, sum)</code></pre>
<pre><code class="language-python"># return m1 (check for matrix that we made)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20

## [1] 10 26 42 58 74  # myapplyCol : apply sum() for every column
## [1] 45 50 55 60              # myappleRow : apply sum() for every row</code></pre>
<hr>
<p>데이터 사이언스 과목 공부하면서 정리한 내용입니다 😊</p>
]]></description>
        </item>
    </channel>
</rss>