<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Seijiro Ozawa </title>
    <description>The latest articles on Forem by Seijiro Ozawa  (@ozwsei).</description>
    <link>https://forem.com/ozwsei</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F113365%2Fe91ae531-b139-4b2c-9420-da3f550942cc.jpeg</url>
      <title>Forem: Seijiro Ozawa </title>
      <link>https://forem.com/ozwsei</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ozwsei"/>
    <language>en</language>
    <item>
      <title>ローカル開発環境にVirtualBoxを使用する</title>
      <dc:creator>Seijiro Ozawa </dc:creator>
      <pubDate>Sat, 22 Feb 2020 03:35:51 +0000</pubDate>
      <link>https://forem.com/ozwsei/virtualbox-2lk3</link>
      <guid>https://forem.com/ozwsei/virtualbox-2lk3</guid>
      <description>&lt;h2&gt;
  
  
  経緯
&lt;/h2&gt;

&lt;p&gt;DockerDesktop(Windows)、WSLとの戦いに敗れた.&lt;br&gt;
プロジェクト単位での仮想環境というより適当に使えるローカル開発環境が欲しかった。&lt;/p&gt;
&lt;h2&gt;
  
  
  やったこと
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;VirtualBoxのインストール&lt;/li&gt;
&lt;li&gt;Debian10(Buster)のイメージのＤＬ&lt;/li&gt;
&lt;li&gt;HostOnlyNetworkの設定&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  1の手順
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.virtualbox.org/wiki/Downloads"&gt;https://www.virtualbox.org/wiki/Downloads&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2の手順
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.debian.org/distrib/"&gt;https://www.debian.org/distrib/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3の手順
&lt;/h2&gt;

&lt;p&gt;ホストＯＳ側でホストオンリーネットワークを設定.&lt;/p&gt;

&lt;p&gt;ゲストＯＳで下記の設定を追加&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"/etc/systemd/network/enp0s8.network" というファイルを作り，次のように記入する．
[Match]
enp0s8

[Network]
Address=192.168.151.100
DNS=192.168.151.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;sudo service networkservice restart&lt;/p&gt;

&lt;p&gt;以上.&lt;/p&gt;

&lt;p&gt;以下の記事を参考にしました。&lt;br&gt;
&lt;a href="https://qiita.com/Yoshiki-Takahashi/items/7274dff15dbafee5b118"&gt;https://qiita.com/Yoshiki-Takahashi/items/7274dff15dbafee5b118&lt;/a&gt;&lt;/p&gt;

</description>
      <category>debian</category>
      <category>virtualbox</category>
    </item>
    <item>
      <title>TypeScriptでRenderPropsをやった</title>
      <dc:creator>Seijiro Ozawa </dc:creator>
      <pubDate>Fri, 09 Nov 2018 10:41:33 +0000</pubDate>
      <link>https://forem.com/ozwsei/typescriptrenderprops-1fg9</link>
      <guid>https://forem.com/ozwsei/typescriptrenderprops-1fg9</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/@jrwebdev/react-render-props-in-typescript-b561b00bc67c"&gt;React Render Props in TypeScript - James Ravenscroft - Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/docs/render-props.html"&gt;Render Props - React&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { storiesOf } from '@storybook/react';
import * as React from 'react';

interface NumberHolderInjectionProps {
  num?: number;
  onChange(num: number): void;
}

interface NumberHolderProps {
  children(injection: NumberHolderInjectionProps): JSX.Element;
}

interface NumberHolderState {
  num?: Number;
}

class NumberHolder extends React.Component&amp;lt;NumberHolderProps, NumberHolderState&amp;gt; {
  state = {
    num: undefined
  };

  onChange = (num: number) =&amp;gt; {
    this.setState({
      num
    });
  }

  render(): JSX.Element {
    return this.props.children({
      num: this.state.num,
      onChange: this.onChange
    });
  }
}

interface NumberRendererProps extends NumberHolderInjectionProps {}

let isFirst = true;

const NumberRenderer: React.SFC&amp;lt;NumberRendererProps&amp;gt; = (props) =&amp;gt; {
    // コレがないと無限ループする
  if (isFirst) {
    props.onChange(777);
    isFirst = false;
  }

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;{ (props.num || 10000) } &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

const WrappedNumberRenderer: React.SFC&amp;lt;{}&amp;gt; = (_) =&amp;gt; (
  &amp;lt;NumberHolder&amp;gt;
    {(injection: NumberHolderInjectionProps) =&amp;gt; &amp;lt;NumberRenderer {...injection} /&amp;gt;}
  &amp;lt;/NumberHolder&amp;gt;
);

storiesOf('TypeScript＆RenderPropsの実験実装', module)
  .add('Simple実装', () =&amp;gt; (
    &amp;lt;WrappedNumberRenderer /&amp;gt;
  ));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</description>
    </item>
    <item>
      <title>django-react-templatetagsでdjangotemplateからreact コンポーネントを描画する</title>
      <dc:creator>Seijiro Ozawa </dc:creator>
      <pubDate>Fri, 09 Nov 2018 10:39:52 +0000</pubDate>
      <link>https://forem.com/ozwsei/django-react-templatetagsdjangotemplatereact--36eg</link>
      <guid>https://forem.com/ozwsei/django-react-templatetagsdjangotemplatereact--36eg</guid>
      <description>&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;この記事は django advent calendar 12日目の記事です。&lt;/p&gt;

&lt;p&gt;今回は django-teact-templatetagsを紹介させていただきたいと思います。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Frojd/django-react-templatetags" rel="noopener noreferrer"&gt;https://github.com/Frojd/django-react-templatetags&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  特徴
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;サーバーサイドから django template をレスポンスを行う&lt;/li&gt;
&lt;li&gt;pythonのモデルを componentsに渡す データに変換可能なMixin&lt;/li&gt;
&lt;li&gt;SSR をサポート（未検証）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;機能としてはたったこれだけですが、SPAでないアプリケーションにreactを導入したい場合やSSRしたい場合には重宝すると思いました。&lt;/p&gt;

&lt;h2&gt;
  
  
  使い方
&lt;/h2&gt;

&lt;p&gt;基本的にREADMEの通りにすればOK&lt;br&gt;
&lt;a href="https://github.com/Frojd/django-react-templatetags/blob/develop/README.md" rel="noopener noreferrer"&gt;https://github.com/Frojd/django-react-templatetags/blob/develop/README.md&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installed_app に追加
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;# ...
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django_react_templatetags&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;context_processor に追加
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;TEMPLATES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BACKEND&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django.template.backends.django.DjangoTemplates&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;DIRS&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;templates...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;APP_DIRS&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OPTIONS&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;debug&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;context_processors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="bp"&gt;...&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django_react_templatetags.context_processors.react_context_processor&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;django templateに load react と

&lt;code&gt;{% react_render component="Component" props=my_data %}&lt;/code&gt;

を追加
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; {% load react %}

&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;...something&amp;lt;/p&amp;gt;
{% react_render component="Component" props=my_data %}
{% react_print %}
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;modelからreact-componentに変換&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;READMEを参考に RepresentationMixin を実装するだけです。&lt;br&gt;
&lt;a href="https://github.com/Frojd/django-react-templatetags#working-with-models" rel="noopener noreferrer"&gt;https://github.com/Frojd/django-react-templatetags#working-with-models&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  使ってみた困った所
&lt;/h2&gt;

&lt;p&gt;フロントエンドを今どきの作りにした場合は webpackやgulp からコンパイルされ、minifyされてjavascriptを読み込むと思います。&lt;/p&gt;

&lt;p&gt;その際にはjsのトップレベルがローカルクロージャとなる場合が多く サーバに描画されたhtmlからreact-componentがスコープの対象外になりました。&lt;/p&gt;

&lt;p&gt;最終的には(極力避けたかったのですが)ビルドされるjavascript内でブラウザのwindow変数に トップレベルの ReactComponentを代入するようにしました。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// こんなかんじのコードをrootに置く&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RootComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RootComponent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;RootComponent&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;ライブラリそのものは薄く設計を工夫すれば捨てるのが容易で pythonのモデルからjavascriptへのデータ受け渡しまでサポートしてもらえるので個人的には結構アリな選択肢かと思いました。&lt;/p&gt;

&lt;p&gt;特に従来のWebAppに部分的にReactを導入したい場合などは適していると思います。&lt;/p&gt;

&lt;p&gt;また、今回は試していませんがSSRしたい場合も選択肢に入って良いと思います。&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
