<?xml version="1.0" encoding="UTF-8" ?>
<rss version="0.91">
  <channel>
    <title>WEEKEND ECONOMIST</title>
    <description>小さな工夫と発見の蓄積</description>
    <link>https://sweettips.take-uma.net/</link>
    <language>ja</language>
    <copyright>Copyright (C) NINJATOOLS ALL RIGHTS RESERVED.</copyright>

    <item>
      <title>Shiny: Output UI のループ</title>
      <description>同じようなUIがたくさんあって、処理にも法則性がある場合に、UIのループを作成したくなることがある。&lt;br /&gt;
たとえば、グラフが10個あって、それぞれに対応するパラメータを選択するUIがあるとする。&lt;br /&gt;
グラフのIDが &quot;fig1&quot;, &quot;fig2&quot;, ..., パラメータUIのIDが &quot;para1&quot;, &quot;para2&quot;, ... と定義されているなら、同じコードを10回記述せずにループを利用した簡略なコードを書きたくなる。&lt;br /&gt;
&lt;br /&gt;
Shinyでこれをするのは少し難しい。理由は、Shinyは常に変数の更新を監視し、結果を反映し続けているので、注意してコードを書かないと、ループ変数の更新を思わぬ形で反映して、バグが生じてしまうからだ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
例として、3つのテキスト入力フォーム（&quot;text1&quot;, &quot;text2&quot;, &quot;text3&quot;）と テキスト出力（&quot;out1&quot;, &quot;out2&quot;, &quot;out3&quot;）をもつアプリを考える。 text1 の内容は out1に、 text2はout2に、・・・というように表示させたい（&lt;a href=&quot;http://file.sweettips.take-uma.net/LoopOutput.R&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;コード&lt;/a&gt;）。&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://file.sweettips.take-uma.net/Screenshot.png&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://file.sweettips.take-uma.net/Img/1431634814/&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
UI部分はシンプルだ。
&lt;pre title=&quot;UI 部分&quot; class=&quot;brush:r&quot;&gt;library(shiny)

ui &amp;lt;- list(
    textInput('text1', 'Text 1', value=''),
    textInput('text2', 'Text 2', value=''),
    textInput('text3', 'Text 3', value=''),
    hr(),
    textOutput('out1'),
    textOutput('out2'),
    textOutput('out3')
)
&lt;/pre&gt;
&lt;br /&gt;
単純な方法は３つの対応関係をすべて書きくだすこと。これで良いのだけど、汎用性がない。
&lt;pre title=&quot;server1（冗長）&quot; class=&quot;brush:r&quot;&gt;server1 &amp;lt;- function(input, output) {
    output$out1 &amp;lt;- renderText({ input$text1 })
    output$out2 &amp;lt;- renderText({ input$text2 })
    output$out3 &amp;lt;- renderText({ input$text3 })    
}
runApp(list(ui=ui, server=server1))
&lt;/pre&gt;
&lt;br /&gt;
単純なループはうまくいかない。下の例だと、renderText内の命令を実行するする際に、最新の i の値が使われてしまう。そのため、すべての出力がtext3（最後の値なので）を参照するようになる。 また、&lt;code&gt; &quot;i &amp;lt;- 1&quot; &lt;/code&gt; をアンコメントすると、すべてtext1を参照するようになる。
&lt;pre title=&quot;server2（すべて同じ値に・・・）&quot; class=&quot;brush:r&quot;&gt;server2 &amp;lt;- function(input, output) {
    for (i in 1:3) {
        output[[paste('out', i, sep='')]] &amp;lt;- renderText({
            input[[paste('text', i, sep='')]]
        })
    }
    #i &amp;lt;- 1
}
runApp(list(ui=ui, server=server2))
&lt;/pre&gt;
&lt;br /&gt;
つまり、 i のスコープが広すぎて、意図しないところまで値を探しにいってしまうのがバグの原因になっている。これを回避する１つの方法は、 lapply を利用して、 i のスコープを限定することだ。以下の例はうまくいく。
&lt;pre title=&quot;server3（lapplyを利用）&quot; class=&quot;brush:r&quot;&gt;server3 &amp;lt;- function(input, output) {
    lapply(1:3, 
        function(i) { 
            output[[paste('out', i, sep='')]] &amp;lt;- renderText({ 
                input[[paste('text', i, sep='')]] 
            }) 
        }
    )
}
runApp(list(ui=ui, server=server3))
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
もしくは、local関数を利用して、その中で新しい変数をコピーすることで、外部での更新の影響を遮断する方法もある。
&lt;pre title=&quot;server4（localを利用）&quot; class=&quot;brush:r&quot;&gt;server4 &amp;lt;- function(input, output) {
    for (i in 1:3) { local({
        j &amp;lt;- i
        output[[paste('out', j, sep='')]] &amp;lt;- renderText({
            input[[paste('text', j, sep='')]]
        })
    }) }
}
runApp(list(ui=ui, server=server4))
&lt;/pre&gt;
&lt;br /&gt;
全コードは&lt;a href=&quot;http://file.sweettips.take-uma.net/LoopOutput.R&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;こちら&lt;/a&gt;。 参考：&lt;a href=&quot;http://stackoverflow.com/questions/19624461/r-shiny-iterate-over-shinyui-output-elements&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;Stack Overflow&lt;/a&gt;</description> 
      <link>https://sweettips.take-uma.net/r/shiny-%20output%20ui%20%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%97</link> 
    </item>
    <item>
      <title>Shinyアプリ・Outputの値へのアクセス・変数のスコープ</title>
      <description>&lt;a href=&quot;http://shiny.rstudio.com/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;Shiny&lt;/a&gt;アプリで、ログディスプレイのようなもののあるページをつくろうと考えた。&lt;br /&gt;
画面上の操作に応じてテキストが徐々に追加されているような仕組みだが、思いの外難しかった。&lt;br /&gt;
&lt;br /&gt;
模式的には、下の画像のようなものを想定している。入力フォームに記入してOKボタンを押すと、その文が画面に追加されていくという構造だ（&lt;a href=&quot;http://file.sweettips.take-uma.net/valueManagement.R&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;コード&lt;/a&gt;）。&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://file.sweettips.take-uma.net/img.PNG&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://file.sweettips.take-uma.net/Img/1431611494/&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
これが少し難しくなる理由は大きく２つある。&lt;br /&gt;
&lt;strong&gt;（１）outputに属する部品の値を取得することができない&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;（２）処理が関数や表現の内部で起こっているため、通常は変数は共有されない&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
まずはuiを作成する。入力フォーム、OKボタンと表示エリアだけの簡単な作りになっている。&lt;br /&gt;

&lt;pre title=&quot;UI 部分&quot; class=&quot;brush:r&quot;&gt;library(shiny)
ui &amp;lt;- list(
   textInput('line', 'Type a line here.'),
   actionButton('insert', 'OK'),
   p(strong('Your sentenses will be displayed below')),
   verbatimTextOutput('display')        
)&lt;/pre&gt;
次のようなserverを考える。OKボタンに反応するobserverを用意して、ボタンが押され時に、ディスプレイの文字列に入力された文字列を結合しようとしている。&lt;br /&gt;
ところが、起動してみると次のようなエラーが発生する：&lt;code&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Reading objects from shinyoutput object not allowed&lt;/span&gt;.&lt;/code&gt; どうやら、直接outputの値にアクセスすることができない仕組みになっているらしい。
&lt;pre title=&quot;server1（エラー）&quot; class=&quot;brush:r&quot;&gt;server1 &amp;lt;- function(input, output, session) {
    observeEvent(input$insert,
        { 
          output$display &amp;lt;- renderText({ 
              paste(output$display, input$line, sep='\n') 
          })
          updateTextInput(session, 'line', value='') 
        }
    )
}
runApp(list(ui=ui, server=server1))
&lt;/pre&gt;
&lt;br /&gt;
そこで、今度は裏側に変数を用意して、そこにディスプレイと同じ文字列を格納しておくことを考える。次のようなserverになる。&lt;br /&gt;
今度はエラーは出ないが、ディスプレイに文字列が追加されていかず、その都度最新の値に置き換えられてしまう。原因は、observeEvent内で文字列Dの値を更新する際に、実はもとのDとは異なる文字列が生成されてしまっていて、その新しい変数のスコープが当該expression内に限られていることだ。そのため、新しく定義したDは毎回破棄され、もともとのDは手付かずのままになる。&lt;br /&gt;

&lt;pre title=&quot;server2（文字列が追加されない）&quot; class=&quot;brush:r&quot;&gt;server2 &amp;lt;- function(input, output, session) {
    D &amp;lt;- character(0)
    output$display &amp;lt;- renderText({ D })
    observeEvent(input$insert,
        { 
          D &amp;lt;- c(D, input$line)
          updateTextInput(session, 'line', value='') 
          output$display &amp;lt;- renderText({ paste(D, collapse='\n') })
        }
    )
}
runApp(list(ui=ui, server=server2))
&lt;/pre&gt;
&lt;br /&gt;
スコープが問題、ということなので今度は文字列変数の代わりに&lt;a href=&quot;http://cran.r-project.org/web/packages/R6/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;R6&lt;/a&gt;クラスオブジェクトを作成し、そこにディスプレイの値を格納することを考える。R6クラスオブジェクトへの更新が参照扱いになることを利用するわけだ（&lt;a href=&quot;http://www.slideshare.net/__nakamichi__/r6-upload&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;参照：R6パッケージの解説&lt;/a&gt;）。&lt;br /&gt;
以下がその例で、これがうまくいく。Docクラスは、文字列変数をもつだけの単純なクラスでこれをServer処理のなかで定義する。observeEventからDへアクセスする際には、もとのオブジェクトを参照しているので、値の更新が保持される仕組みだ。&lt;br /&gt;
&lt;br /&gt;

&lt;pre title=&quot;server3（成功！）&quot; class=&quot;brush:r&quot;&gt;library(R6)
Doc &amp;lt;- R6Class('document',
    public=list(
    text = character(0),
    initialize = function(init=character(0)) 
        { self$text &amp;lt;- init }
    )
)

server3 &amp;lt;- function(input, output, session) {
    D &amp;lt;- Doc$new()  

    output$display &amp;lt;- renderText({ paste(D$text, collapse='\n') })
    observeEvent(input$insert,
        { 
          D$text &amp;lt;- c(D$text, input$line)
          updateTextInput(session, 'line', value='') 
          output$display &amp;lt;- renderText({ paste(D$text, collapse='\n') })
        }
    )
}
runApp(list(ui=ui, server=server3))
&lt;/pre&gt;
&lt;br /&gt;
上のコードで、&lt;code&gt;renderText&lt;/code&gt; の処理が &lt;code&gt;observeEvent&lt;/code&gt; 内にあるのは重要で、外側に配置してしまうと、ディスプレイの値が変化していかない。裏側でDオブジェクトの値は更新されるのだが、そのことをshinyの機能が認知しないため、いつまでたっても処理が開始されないのだ。下記がその例。
&lt;pre title=&quot;server4（値が反映されない）&quot; class=&quot;brush:r&quot;&gt;server4 &amp;lt;- function(input, output, session) {
    D &amp;lt;- Doc$new()  
    
    observeEvent(input$insert,
        { 
          D$text &amp;lt;- c(D$text, input$line)
          updateTextInput(session, 'line', value='') 
          print(D$text)
        }
    )

    output$display &amp;lt;- renderText({ paste(D$text, collapse='\n') })
}
runApp(list(ui=ui, server=server4))
&lt;/pre&gt;
&lt;br /&gt;
renderText を外に配置する方法として、処理内でOKボタンへ言及する方法がある。 すると、ボタンが押されるたびにそれに感応して処理が行われることになり、ディスプレイも更新される。 下はその例でうまく動くようだが、タイミングの定義が曖昧なようにも思える。 ふたつの処理がOKボタンに反応するようになっていて、どちらが先にくるかが明示されていない。&lt;code&gt;observeEvent&lt;/code&gt; が優先される仕様なのか、単に運が良いだけなのかは分からない。
&lt;pre title=&quot;server5（うまくいくけどタイミングが不安？）&quot; class=&quot;brush:r&quot;&gt;server5 &amp;lt;- function(input, output, session) {
    D &amp;lt;- Doc$new()  
    
    observeEvent(input$insert,
        { 
          D$text &amp;lt;- c(D$text, input$line)
          updateTextInput(session, 'line', value='') 
        }
    )

    output$display &amp;lt;- renderText({ 
        input$insert
        paste(D$text, collapse='\n') 
    })
}
runApp(list(ui=ui, server=server5)) 
&lt;/pre&gt;
&lt;br /&gt;
つまり、R6クラスオブジェクトで値を管理することの弱点は、その値がShinyの監視下にないことだ。実は、Shinyに監視されるオブジェクトととして、reactivevalues クラスが定義されている。おそらく以下の書き方が一番 「shinyらしい」。
&lt;pre class=&quot;brush:r&quot; title=&quot;server6（reactivevaluesを利用）&quot;&gt;server6 &amp;lt;- function(input, output, session) {
    V &amp;lt;- reactiveValues(text = character(0))

    observeEvent(input$insert,
        { 
          V$text &amp;lt;- c(V$text, input$line)
          updateTextInput(session, 'line', value='') 
        }
    )

    output$display &amp;lt;- renderText({
        paste(V$text, collapse='\n') 
    })
}
runApp(list(ui=ui, server=server6)) 
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
コードの全体は&lt;a href=&quot;http://file.sweettips.take-uma.net/valueManagement.R&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;こちら&lt;/a&gt;。</description> 
      <link>https://sweettips.take-uma.net/r/shiny%E3%82%A2%E3%83%97%E3%83%AA%E3%83%BBoutput%E3%81%AE%E5%80%A4%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%BB%E5%A4%89%E6%95%B0%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97</link> 
    </item>
    <item>
      <title>R on Ubuntu: 'devtools' のインストール</title>
      <description>Rの&lt;a href=&quot;http://cran.r-project.org/web/packages/devtools/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;devtoolsパッケージ&lt;/a&gt;をインストールしようとしたところ、次のようなエラーがでた。&lt;br /&gt;
&lt;br /&gt;

&lt;pre class=&quot;brush:r&quot;&gt;ERROR: dependencies &amp;lsquo;httr&amp;rsquo;, &amp;lsquo;RCurl&amp;rsquo;, &amp;lsquo;rversions&amp;rsquo;, &amp;lsquo;git2r&amp;rsquo; are not available for package &amp;lsquo;devtools&amp;rsquo;
&lt;/pre&gt;
OSはlubuntu14.04. RのバージョンはR version 3.1.0 (2014-04-10).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ひとつめの原因は、libcurl というライブラリ（？）がインストールされていなかったことらしい（&lt;a href=&quot;http://stackoverflow.com/questions/20923209/problems-installing-the-devtools-package&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;参照&lt;/a&gt;）。&lt;br /&gt;
そこで、コンソールから次のパッケージをインストールする。&lt;br /&gt;

&lt;pre class=&quot;brush:bash&quot;&gt;sudo apt-get install libcurl4-gnutls-dev
&lt;/pre&gt;
&lt;br /&gt;
しかるのち再度devtoolsインストールを試みるも、依存関係にある&lt;a href=&quot;http://cran.revolutionanalytics.com/web/packages/git2r/index.html&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;git2rパッケージ&lt;/a&gt;のインストールで問題が残っているようだ。
&lt;pre class=&quot;brush:r&quot;&gt;checking for library containing SSL_library_init... no
configure: error: in `/tmp/RtmpymzMhG/R.INSTALL29921535f41e/git2r':
configure: error: OpenSSL library required
See `config.log' for more details
ERROR: configuration failed for package &amp;lsquo;git2r&amp;rsquo;
* removing &amp;lsquo;/home/kota/R/x86_64-pc-linux-gnu-library/3.1/git2r&amp;rsquo;
Warning in install.packages :
  installation of package &amp;lsquo;git2r&amp;rsquo; had non-zero exit status
ERROR: dependency &amp;lsquo;git2r&amp;rsquo; is not available for package &amp;lsquo;devtools&amp;rsquo;
&lt;/pre&gt;
&lt;br /&gt;
こちらについては、libcrypto++とlibssl-devというライブラリが必要になるらしい（&lt;a href=&quot;https://github.com/ropensci/git2r/issues/138&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;参照&lt;/a&gt;）。
&lt;pre class=&quot;brush:bash&quot;&gt;sudo apt-get install libcrypto++ libssl-dev
&lt;/pre&gt;
ここまで設定すると、ようやくインストールに成功した。
&lt;pre class=&quot;brush:r&quot;&gt;install.packages('devtools')
&lt;/pre&gt;</description> 
      <link>https://sweettips.take-uma.net/r/r%20on%20ubuntu-%20--devtools--</link> 
    </item>
    <item>
      <title>R6 Class とオブジェクトの破棄</title>
      <description>プログラム言語によっては、変数やオブジェクトが不要になったときには、kill や dispose などのメソッドを使って明示に破棄する必要があり（または推奨されていて）、これを怠るとメモリリークの原因となりパフォーマンスに影響する（らしい）。&lt;br /&gt;
&lt;br /&gt;
Rでは、このあたりの管理はシステム任せでよくて、オブジェクトの破棄について気にする必要はない。ところが、最近&amp;nbsp;&lt;a href=&quot;http://cran.r-project.org/web/packages/R6/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;R6&lt;/a&gt; という直感的にオブジェクト指向なコーディングを可能にするライブラリについて&lt;a href=&quot;http://www.slideshare.net/__nakamichi__/r6-upload&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;教えてもらい&lt;/a&gt;、自分自身も使い始めた。クラスインスタンスを生成したり参照したりしていたら、ふと「参照されなくなったオブジェクトはどう処理されているんだろう」と不安になった。まさか忘れられたインスタンス達が散乱しているのでは、という懸念だ。&lt;br /&gt;
&lt;br /&gt;
答えは&lt;a href=&quot;http://cran.r-project.org/web/packages/R6/vignettes/Introduction.html#finalizers&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;公式の導入ページ&lt;/a&gt;に書いてあった。不要になった（参照されていない）クラスインスタンスは、通常通り自動的にごみ収集機能（Garbage Collection）によって破棄される。関数 gc() を呼べば強制的にごみ収集を発生させることができるが、&lt;a href=&quot;https://stat.ethz.ch/R-manual/R-devel/library/base/html/gc.html&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;gc() のヘルプ&lt;/a&gt;によると不要らしい。&lt;br /&gt;
&lt;br /&gt;
下のコードでは、ごみ収集の機能をテストしている。&lt;br /&gt;
A クラスは、数字ひとつを要素にもつクラスだ。公式の例を参考に、生成時に reg.finalizer() 関数を使ってインスタンスが破棄された時の動作を「登録」している。ここでは格納された数字を表示させることによってどのインスタンスが破棄されたのかが分かるようにしている。&lt;br /&gt;
&lt;br /&gt;
3つのAクラスインスタンスからなるリストを生成して、rm() により破棄すると、３つ全てが不要になりごみ収集対象になる（この時、rm() の前に一度 gc()を施しておくことで、破棄の結果だけを切り離している。こうしないと、インスタンス生成時に発生したゴミがまだ残っていて、同時に破棄されることがある）。&lt;br /&gt;
&lt;br /&gt;
同じように3つのAクラスインスタンスからなるリストを生成して、今度は3つのうち1つ目の要素だけ削除する（参照を外す）。すると、削除された要素だけがゴミとみなされる。さらに、要素のうちの1つを別の変数により参照してからもとのリストを削除すると、参照されているインスタンスはまだ使用中ということになるから、ゴミ収集対象にならない。&lt;br /&gt;
&lt;br /&gt;
結論としては、ごみの選別はきっちりやってくれているらしいから、メモリの心配はあまりしなくてよさそうだ。&lt;br /&gt;

&lt;pre class=&quot;brush:r&quot; title=&quot;garbage-test.R&quot;&gt;library(R6)

A &amp;lt;- R6Class('A',
    public = list(
        number=NA,
        initialize = function(number) {
            self$number &amp;lt;- number
            reg.finalizer(
                self,
                function(e) cat('Garbage collected! #', e$number, '\n'),
                onexit = TRUE
            )
        }
    )
)

a &amp;lt;- list(A$new(1), A$new(2), A$new(3))
gc()  # clean up the garbage created when initializing

# when the list is removed, all three instances are 'garbage'
rm(a)
gc()
#Garbage collected! # 3
#Garbage collected! # 2
#Garbage collected! # 1
#    used (Mb) gc trigger (Mb) max used  (Mb)
#Ncells 567894 30.4    1168576 62.5  1168576  62.5
#Vcells 821924  6.3    2994598 22.9 54470995 415.6


a &amp;lt;- list(A$new(1), A$new(2), A$new(3))
gc()
# remove the reference to the 1st element.
a &amp;lt;- a[-1]
gc()
#Garbage collected! # 1
#    used (Mb) gc trigger (Mb) max used  (Mb)
#Ncells 567896 30.4    1168576 62.5  1168576  62.5
#Vcells 821917  6.3    2994598 22.9 54470995 415.6

# let another variable refer to the first element
b &amp;lt;- a[[1]]
rm(a)
gc()
#Garbage collected! # 3 
#    used (Mb) gc trigger (Mb) max used  (Mb)
#Ncells 567879 30.4    1168576 62.5  1168576  62.5
#Vcells 821913  6.3    2994598 22.9 54470995 415.6
&lt;/pre&gt;</description> 
      <link>https://sweettips.take-uma.net/r/r6%20class%20%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E7%A0%B4%E6%A3%84</link> 
    </item>
    <item>
      <title>koding : オンライン開発環境でRを使う</title>
      <description>&lt;a href=&quot;https://koding.com/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;koding&lt;/a&gt; はオンラインの開発環境で、ブラウザ上のエディタでコードを書いて、同じくブラウザ上の端末からコンパイルしたり走らせたりできる。&lt;br /&gt;
&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://file.sweettips.take-uma.net/Capture.PNG&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://file.sweettips.take-uma.net/Img/1428138979/&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C++やPythonなどの主要な開発言語は初めからインストールされていて、すぐ使える。&lt;br /&gt;
&lt;br /&gt;
Rはもともと入っていないのだが、手動で加えることができる。&lt;br /&gt;
というのも、実はこの端末が Ubuntu14.04 Trusty なのだ。&lt;br /&gt;
それを確認するには、端末で&lt;br /&gt;

&lt;pre class=&quot;brush:shell&quot;&gt;lsb_release -d
&lt;/pre&gt;
とすればいい。&lt;br /&gt;
&lt;br /&gt;
したがって、次のコマンドで、Ubuntuの公式レポジトリに入っているRをダウンロードすることができる。&lt;br /&gt;

&lt;pre class=&quot;brush:shell&quot;&gt;sudo apt-get update
sudo apt-get install r-base-core
&lt;/pre&gt;
&lt;br /&gt;
注意点１. install.packages を使うときは、repos=&amp;lt;cran mirror URL&amp;gt;を指定する。通常はreposを指定しない場合、ミラーサイトを選ぶポップアップが出るのだが、それが機能しないので、はじめから指定する。&lt;br /&gt;

&lt;pre class=&quot;brush:r&quot; title=&quot;例&quot;&gt;&amp;gt; install.packages('nleqslv', repos='http://cran.md.tsukuba.ac.jp/')&lt;/pre&gt;
&lt;br /&gt;
注意点2. グラフを描画する方法を検討中・・・。少し難しい。回りくどいが、Kodingでは ~/Webディレクトリ以下がWeb上に公開されているので、その中に画像を保存してブラウザ上で見るという方法がある。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description> 
      <link>https://sweettips.take-uma.net/r/koding%20-%20%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83</link> 
    </item>
    <item>
      <title>sharelatex：Latex文書をクラウド上で管理・編集・コンパイル</title>
      <description>ほんの5年程前にはDropboxの便利さに驚愕したものだけど、いまやクラウドサービスは当然で、なるべくならすべてのファイルをウェブ上で管理したいとすら思う。もし、ファイルがあるPC上にのみ存在する場合、当然他の端末からは編集できない。メールやUSBドライブなどを介してファイルを移して、変更を加えて移動しなおして・・・というようなことは可能だけど手間だし、バージョン管理の問題も生じる。その点、DropboxはWebサーバーを介してファイル情報を同期してくれるから、どの端末にも常に同じファイルが存在することになる。端末Aで加えた変更は端末Bの同じ箇所に直ちに反映されるから、あたかも同じファイルを編集しているように感じる。&lt;br /&gt;
&lt;br /&gt;
一方&lt;a href=&quot;https://www.google.com/drive/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;Google Drive&lt;/a&gt;では、ローカルファイルへの動機を行わず、ファイルをWeb上にのみ保管する仕組みになっている。ファイルを使ったり編集するためにいちいちローカルに保存する必要はほとんどなくて、Web上のアプリで事足りることが多い。Microsoft Office 系の作業は&lt;a href=&quot;http://www.google.com/docs/about/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;Google Sheets/Docs/Slides&lt;/a&gt;で代替可能だし、インターフェースやテンプレートの好みまで考えれば代替どころではないかもしれない。ただし共同作業の場合には互換性に対するケアが必要だ。音楽ファイルの再生には&lt;a href=&quot;http://www.driveplayer.com/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;driveplayer&lt;/a&gt;を使えばよいから、MP3ファイルもすべてGoogle Driveに移した。&lt;br /&gt;
&lt;br /&gt;
同じことがLatex編集にもできないか？　Texコードがクラウド上にあって、ウェブ上のエディタで編集でき、コンパイラがついている。できたらエディタの隣に文書のプレビューがついていて、もちろん最後にはPDFファイルをダウンロードできる。&lt;a href=&quot;https://www.sharelatex.com/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;Sharelatex&lt;/a&gt;はそんなサービスだ。無料で使えてスペルチェックまでついている。自分の普段使うスタイルを試してみたところ、問題なく一発でコンパイルできた。&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://file.sweettips.take-uma.net/sharelatex.PNG&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://file.sweettips.take-uma.net/Img/1426867443/&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
対抗馬のサービスとしては、&lt;a href=&quot;https://www.overleaf.com/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;overleaf&lt;/a&gt;, &lt;a href=&quot;http://docs.latexlab.org/docs&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;latexlab&lt;/a&gt; あたりが有名なようだが、総合的にはsharelatexが気に入っている。overleafは、無料版にはスペルチェックがついていないのが減点。あとインターフェイスが好みじゃなかった。LatexlabはGoogle Docと連動しているという点が魅力的だが、開発途中なのか動作が遅い。&lt;br /&gt;
&lt;br /&gt;
Sharelatexのおかげで、どの端末上からでも同じTex文書を編集することができる。</description> 
      <link>https://sweettips.take-uma.net/latex/sharelatex%EF%BC%9Alatex%E6%96%87%E6%9B%B8%E3%82%92%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E4%B8%8A%E3%81%A7%E7%AE%A1</link> 
    </item>
    <item>
      <title>avconv で音声抽出</title>
      <description>参考：&lt;a href=&quot;http://za.toypark.in/html/2010/08-11.html&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;[avconv] mp3 にフォーマット変換&lt;/a&gt;
&lt;pre class=&quot;brush:shell&quot; title=&quot;MP4から音声を抽出してmp3に（ビットレート指定）&quot;&gt;avconv -vn -i hoge.mp4 -f mp3 -b:a 64k hoge.mp3
&lt;/pre&gt;
&lt;pre class=&quot;brush:shell&quot; title=&quot;MP4から音声を抽出してmp3（VBR）に&quot;&gt;avconv -vn -i hoge.mp4 -f mp3 -q:a 9 hoge.mp3
&lt;/pre&gt;
&lt;pre class=&quot;brush:shell&quot; title=&quot;フォルダ内全体に(-y オプションで上書き)&quot;&gt;for file in *.[mM][pP]4; do avconv -y -vn -i &quot;$file&quot; -f mp3 -b:a 64k &quot;${file%.*}.mp3&quot;; done
for file in *.[mM][pP]4; do avconv -y -vn -i &quot;$file&quot; -f mp3 -q:a 9 &quot;${file%.*}.mp3&quot;; done
&lt;/pre&gt;
&lt;pre class=&quot;brush:shell&quot; title=&quot;フォルダ内全体に（別法）&quot;&gt;find -type f -name &quot;*.mp4&quot; -print0 | xargs -0 -n 1 -i avconv -y -vn -i {} -f mp3 -b:a 64k {}.mp3
find -type f -name &quot;*.mp4&quot; -print0 | xargs -0 -n 1 -i avconv -y -vn -i {} -f mp3 -q:a 9 {}.mp3
&lt;/pre&gt;</description> 
      <link>https://sweettips.take-uma.net/shell/avconv%20%E3%81%A7%E9%9F%B3%E5%A3%B0%E6%8A%BD%E5%87%BA</link> 
    </item>
    <item>
      <title>ggplot2（３）色付き等高線</title>
      <description>ggplot2で色付き等高線グラフを描くには、geom_point() で大きめのマーカーを並べる方法と、geom_tile()で長方形を並べる方法の2通りがある。公式のマニュアルではgeom_tile()が紹介されているが、geom_point()の方が多少動作が軽いし、結果が安定する気がする。&lt;br /&gt;
東急目黒線沿いの賃料マップ（&lt;a href=&quot;https://codeiq.jp/magazine/2014/05/8400/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;codeIQ Magazine&lt;/a&gt;参照）を再現した。&lt;br /&gt;
&lt;br /&gt;
上がgeom_point(), 下がgeom_tile()で書いたものだが、見た目をそう変わらない。左のほうが全体に滲むような色合いなのに対し、右はタイルを敷き詰めているので白い線が見える。&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://file.sweettips.take-uma.net/geom_point100.png&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://file.sweettips.take-uma.net/Img/1399760121/&quot; alt=&quot;&quot; height=&quot;182&quot; width=&quot;299&quot; /&gt;&lt;/a&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://file.sweettips.take-uma.net/geom_tile100.png&quot; title=&quot;&quot;&gt;&lt;br /&gt;
&lt;/a&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://file.sweettips.take-uma.net/geom_tile100.png&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://file.sweettips.take-uma.net/Img/1399760136/&quot; alt=&quot;&quot; height=&quot;184&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

&lt;pre class=&quot;brush:r&quot;&gt;library(ggplot2)
library(reshape2)
x &amp;lt;- read.csv('http://file.sweettips.take-uma.net/meguro1k.txt', 
              sep='\t', as.is=T)
z &amp;lt;- read.csv('http://file.sweettips.take-uma.net/meguro-station.txt', 
              sep='\t', as.is=T, header=F)

fit &amp;lt;- loess(rent ~ lon + lat, data=x, span=0.5)
gd &amp;lt;- 100
lon &amp;lt;- seq(min(x$lon), max(x$lon), length=gd)
lat &amp;lt;- seq(min(x$lat), max(x$lat), length=gd)
D &amp;lt;- expand.grid(lon=lon, lat=lat)
v &amp;lt;- melt(predict(fit, D), value.name='rent')
v$lon &amp;lt;- as.numeric(gsub('lon=', '', v$lon))
v$lat &amp;lt;- as.numeric(gsub('lat=', '', v$lat))

p &amp;lt;- ggplot(v, aes(lon, lat, z=rent)) 
p + geom_point(aes(col=rent), linetype='blank', size=5, shape=15) +
    stat_contour(bins=10, col='white', size=1.2) + 
    stat_contour(bins=10) +
    geom_line(data=z, aes(V4, V3, z=V3), size=2, col='lightgreen') + 
    geom_line(data=z, aes(V4, V3, z=V3), size=1.2, color='coral4') + 
    geom_text(data=z, aes(V4, V3, z=V3, label=V1), 
              size=5.12, col='white', fontface=2) + 
    geom_text(data=z, aes(V4, V3, z=V3, label=V1), 
              fontface=2, size=5) + 
    scale_colour_gradientn(colours=rich.colors(10))

p + geom_tile(aes(fill=rent)) + 
    stat_contour(bins=10, col='white', size=1.2) + 
    stat_contour(bins=10) + 
    geom_line(data=z, aes(V4, V3, z=V3), size=2, col='lightgreen') + 
    geom_line(data=z, aes(V4, V3, z=V3), size=1.2, color='coral4') + 
    geom_text(data=z, aes(V4, V3, z=V3, label=V1), 
              size=5.12, col='white', fontface=2) +
    geom_text(data=z, aes(V4, V3, z=V3, label=V1), 
              fontface=2, size=5) + 
    scale_fill_gradientn(colours=rich.colors(10))&lt;/pre&gt;</description> 
      <link>https://sweettips.take-uma.net/r/ggplot2%EF%BC%88%EF%BC%93%EF%BC%89%E8%89%B2%E4%BB%98%E3%81%8D%E7%AD%89%E9%AB%98%E7%B7%9A</link> 
    </item>
    <item>
      <title>線分と垂線との交点を計算する</title>
      <description>わけあって、線分\(XY\)と点\(Z\)が与えられた時に、点\(Z\)から線分\(XY\)へ下ろした垂線との交点\(M\)の座標を計算しました。結論からいうと、 \(\alpha = \frac{(X-Y)\cdot(Z-Y) }{||X-Y||^2}\) として、 \(M = \alpha X + (1-\alpha) Y\) になるようです。 \(\alpha\) は、点\(Z\)が \(X, Y\) のどちらに相対的に近いかを表していて、\(Z\) が\(X\)に近いほど1に近づき、\(Y\)に近いほどゼロに近づくことが式から分かります。 ほぼ１０年ぶりくらいにベクトル計算をしました。&lt;br /&gt;
&lt;img src=&quot;http://file.sweettips.take-uma.net/2a486b3b.png&quot; alt=&quot;&quot; /&gt; &lt;br /&gt;
&lt;br /&gt;
\(M\)は線分\(XY\)上にあるから、\(M = \alpha X + (1-\alpha) Y\)と書ける。 ベクトル\(MY\)と\(MZ\)が垂直であるので、その内積はゼロに等しい、つまり \begin{align*} &lt;br /&gt;
(M-Y) \cdot (M-Z) &amp;amp;= 0 \\&lt;br /&gt;
[ \alpha (X-Y) ] \cdot [ \alpha (X-Y) + (Y-Z)] &amp;amp;= 0 \end{align*} &lt;br /&gt;
ここで、 \( \cdot\) は内積を表す。これを解くと、 \begin{align*} \alpha^2 ||X-Y||^2 + \alpha (X-Y) \cdot (Y-Z) &amp;amp;= 0 \\ \alpha \left[ \alpha ||X-Y||^2 - (X-Y) \cdot (Z-Y) \right] &amp;amp;= 0 \end{align*} &lt;br /&gt;
ここで、 \(||\;\;||\) はユークリッドノルム。&lt;br /&gt;
\(\alpha=0\) は、\(MY\) がゼロベクトルになることで内積をゼロにするので、題意に合わない。よって \(\alpha = \frac{(X-Y)\cdot(Z-Y) }{||X-Y||^2}\).</description> 
      <link>https://sweettips.take-uma.net/%E6%95%B0%E5%AD%A6/%E7%B7%9A%E5%88%86%E3%81%A8%E5%9E%82%E7%B7%9A%E3%81%A8%E3%81%AE%E4%BA%A4%E7%82%B9%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B</link> 
    </item>
    <item>
      <title>Python: オブジェクトのタイプを判定する</title>
      <description>type() 関数や、isinstance()関数を使えばよい。
&lt;pre class=&quot;brush:python&quot;&gt;l = []
d = {}
t = ()
type(l), type(d), type(t)
isinstance(l, list), isinstance(l, dict), isinstance(l, tuple)
isinstance(d, list), isinstance(d, dict), isinstance(d, tuple)
isinstance(t, list), isinstance(t, dict), isinstance(t, tuple)
&lt;/pre&gt;
Output:
&lt;pre class=&quot;brush:bash&quot;&gt;&amp;lt;type 'list'&amp;gt; &amp;lt;type 'dict'&amp;gt; &amp;lt;type 'tuple'&amp;gt;
True False False
False True False
False False True
&lt;/pre&gt;
クラスのインスタンスの場合、type()は&quot;instance&quot;と判別されるが、isinstance()は上と同様に機能するようだ。
&lt;pre class=&quot;brush:python&quot;&gt;class Hoge:
    def __init__(self):
        pass
h = Hoge()
type(h)
isinstance(h, Hoge)
&lt;/pre&gt;
Output:
&lt;pre class=&quot;brush:bash&quot;&gt;&amp;lt;type 'instance'&amp;gt;
True
&lt;/pre&gt;</description> 
      <link>https://sweettips.take-uma.net/python/python-%20%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%97%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B</link> 
    </item>

  </channel>
</rss>