<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/">

<channel>
	<title>ababa note</title>
	<atom:link href="https://ababa.cloud/feed" rel="self" type="application/rss+xml" />
	<link>https://ababa.cloud</link>
	<description>趣味でプログラミングやアプリ開発をした際のメモを書き連ねてます</description>
	<lastBuildDate>Sun, 14 Apr 2024 02:59:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.2</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/><atom:link rel="hub" href="https://websubhub.com/hub"/>	<item>
		<title>テスト駆動開発とは何であって、何でなかったのか？を聞いて</title>
		<link>https://ababa.cloud/2024/04/post-549.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sun, 14 Apr 2024 02:59:44 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=549</guid>

					<description><![CDATA[はじめに メモ]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<ul>
<li><a href="https://fukabori.fm/episode/114">fukabori.fm</a>でt_wadaさんが話していたのを聞いた際のメモです。凄く勉強になったので久しぶりにブログに残します。</li>



<li>t_wadaさんの<a href="https://t-wada.hatenablog.jp/entry/canon-tdd-by-kent-beck">ブログ</a>で書かれていた内容と被っている部分が多く、その部分は基本的に割愛してます。</li>
</ul>



<h3 class="wp-block-heading">メモ</h3>



<ul>
<li>TDDのステップ
<ul>
<li>(1)テストリストを書く </li>



<li>(2)リストから1つ選び失敗するテストを書く</li>



<li>(3)テストが通るようにコードを書く</li>



<li>(4)リファクタリング</li>



<li>(5)テストリストが空になるまで繰り返す<br></li>
</ul>
</li>



<li>品質保証ではない
<ul>
<li>テストという言葉が強すぎる</li>



<li>品質保証が主目的ではない</li>



<li>実装の補助線（スムーズに設計と実装を行うためのもの）<br></li>
</ul>
</li>



<li>内部品質、特にテスト容易性、理解容易性、変更容易性が高まる
<ul>
<li>結果的に品質は向上する<br></li>
</ul>
</li>



<li>プログラムの書き方（設計と実装のやり方）
<ul>
<li>設計手法とプログラム手法の中間<br></li>
</ul>
</li>



<li>テストを先にたくさん書くと、フィードバックが遅くなる
<ul>
<li>実装とテストのタイミングが遠いとフィードバックが来ても変更しにくい<br></li>
</ul>
</li>



<li>設計と実装(のフィードバックを短いサイクルで得ることで、ちょうど良いバランスを探る<br></li>



<li>テストリストについて
<ul>
<li>最初に出し切る必要はない</li>



<li>網羅的である必要はなく気付きを書き留める設計メモレベルで良い</li>



<li>TDDでいう「網羅」は備忘録のようなもの</li>



<li>備忘録をメンテナンスしていく程度で良い</li>
</ul>
</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>コンストラクタが膨らんだ時の対処法</title>
		<link>https://ababa.cloud/2023/07/post-541.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sun, 09 Jul 2023 09:29:55 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=541</guid>

					<description><![CDATA[はじめに クラスのプロパティが多くなると、それに伴ってコンストラクタで渡すパラメータも増えてしまいます。これについての対処法を記載します。サンプルコードはC#です。 1. 必須とオプションのプロパティを分ける 必須のみコ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">はじめに</h2>



<p>クラスのプロパティが多くなると、それに伴ってコンストラクタで渡すパラメータも増えてしまいます。これについての対処法を記載します。<br>サンプルコードはC#です。</p>



<h2 class="wp-block-heading">1. 必須とオプションのプロパティを分ける</h2>



<p>必須のみコンストラクタで受け取り、それ以外はオブジェクト初期化子で受け取ります。<br>ただし必須項目が多いとコンストラクタが膨れ上がる問題は解決できません。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>public class MyClass
{
    // 必須
    public int Property1 { get; }
    public string Property2 { get; }

    // オプション
    public int? Property3 { get; set; }
    public string Property4 { get; set; }

    public MyClass(int property1, string property2)
    {
        if (property1 == 0)
        {
            throw new InvalidOperationException(&quot;Property1が不正です。&quot;);
        }

        if (property2 == null)
        {
            throw new InvalidOperationException(&quot;Property2が不正です。&quot;);
        }

        Property1 = property1;
        Property2 = property2;
    }
}

var myClass = new MyClass(1, &quot;a&quot;)
{
    Property3 = 2,
    Property4 = &quot;b&quot;
};</code></pre></div>



<h2 class="wp-block-heading">2. ビルダーパターンを使用する</h2>



<p>ビルダーパターンを使用してインスタンスを生成する方法です。<br>コンストラクタが膨れ上がる問題は解決できますが、プロパティが多いとコード量が多くなります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>public class MyClassBuilder
{
    private int property1;
    private string property2;
    private int? property3;
    private string property4;

    public MyClassBuilder WithProperty1(int value)
    {
        property1 = value;
        return this;
    }

    public MyClassBuilder WithProperty2(string value)
    {
        property2 = value;
        return this;
    }

    public MyClassBuilder WithProperty3(int value)
    {
        property3 = value;
        return this;
    }

    public MyClassBuilder WithProperty4(string value)
    {
        property4 = value;
        return this;
    }

    public MyClass Build()
    {
        if (property1 == 0)
        {
            throw new InvalidOperationException(&quot;Property1が不正です。&quot;);
        }

        if (property2 == null)
        {
            throw new InvalidOperationException(&quot;Property2が不正です。&quot;);
        }

        return new MyClass(property1, property2, property3, property4);
    }
}

var myClass = new MyClassBuilder()
    .WithProperty1(1)
    .WithProperty2(&quot;a&quot;)
    .WithProperty3(2)
    .WithProperty4(&quot;b&quot;)
    .Build();</code></pre></div>



<h2 class="wp-block-heading">3. 引数をクラスにする</h2>



<p>引数をクラス化する事でコンストラクタをシンプルにできます。<br>ただしクラスの追加が必要になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>public class MyClass
{
    public int Property1 { get; }
    public string Property2 { get; }
    public int? Property3 { get; set; }
    public string Property4 { get; set; }

    public MyClass(MyClassParams parameters)
    {
        Property1 = parameters.Property1;
        Property2 = parameters.Property2;
        Property3 = parameters.Property3;
        Property4 = parameters.Property4;
    }
}

public class MyClassParams
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }
    public int? Property3 { get; set; }
    public string Property4 { get; set; }

    public MyClass(MyClassParams parameters)
    {
        if (parameters.Property1 == 0)
        {
            throw new InvalidOperationException(&quot;Property1が不正です。&quot;);
        }

        if (parameters.Property2 == null)
        {
            throw new InvalidOperationException(&quot;Property2が不正です。&quot;);
        }

        Property1 = parameters.Property1;
        Property2 = parameters.Property2;
        Property3 = parameters.Property3;
        Property4 = parameters.Property4;
    }
}

var myClassParams = new MyClassParams
{
    Property1 = 1,
    Property2 = &quot;a&quot;,
    Property3 = 2,
    Property4 = &quot;b&quot;
};

var myClass = new MyClass(myClassParams);</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>エンティティ・リレーについて</title>
		<link>https://ababa.cloud/2023/05/entity-relay.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sat, 27 May 2023 13:44:00 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=537</guid>

					<description><![CDATA[はじめに 名著「セキュア・バイ・デザイン」に複雑な状態管理の解決策として「エンティティ・リレー」が紹介されています。 セキュア・バイ・デザインにはサンプルコードが多数記載されていますが、何故かエンティティ・リレーについて [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">はじめに</h2>



<p>名著「<a href="https://www.amazon.co.jp/s?k=%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%90%E3%82%A4%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3&amp;i=stripbooks&amp;adgrpid=139744760560&amp;hvadid=658793524791&amp;hvdev=c&amp;hvlocphy=1009547&amp;hvnetw=g&amp;hvqmt=e&amp;hvrand=4430882557883953232&amp;hvtargid=kwd-1659689421547&amp;hydadcr=4072_13329056&amp;jp-ad-ap=0&amp;tag=googhydr-22&amp;ref=pd_sl_43o0vnebtk_e" data-type="URL" data-id="https://www.amazon.co.jp/s?k=%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%90%E3%82%A4%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3&amp;i=stripbooks&amp;adgrpid=139744760560&amp;hvadid=658793524791&amp;hvdev=c&amp;hvlocphy=1009547&amp;hvnetw=g&amp;hvqmt=e&amp;hvrand=4430882557883953232&amp;hvtargid=kwd-1659689421547&amp;hydadcr=4072_13329056&amp;jp-ad-ap=0&amp;tag=googhydr-22&amp;ref=pd_sl_43o0vnebtk_e">セキュア・バイ・デザイン</a>」に複雑な状態管理の解決策として「エンティティ・リレー」が紹介されています。</p>



<p>セキュア・バイ・デザインにはサンプルコードが多数記載されていますが、何故かエンティティ・リレーについてはサンプルコードがありません。</p>



<p>そこで勉強のためにコードにしてみました。</p>



<h2 class="wp-block-heading">シナリオ</h2>



<p>セキュア・バイ・デザインではエンティティ・リレーのシナリオとして注文状態を挙げています。</p>



<p>注文状態には以下のパターンがあります。</p>



<ul>
<li>作成中</li>



<li>作成済み（未払い）</li>



<li>作成済み（支払い却下）</li>



<li>支払い済み</li>



<li>配送中</li>



<li>配送間違い</li>



<li>消失</li>



<li>配送済み</li>



<li>受取拒否</li>



<li>返品中</li>



<li>返品済み</li>



<li>返金済み</li>
</ul>



<p>これを3つのstate objectに分けています。</p>



<p>①「仮注文」</p>



<ul>
<li>作成中</li>



<li>作成済み（未払い）</li>



<li>作成済み（支払い却下）</li>



<li>支払い済み</li>
</ul>



<p>②「本注文」</p>



<ol>
<li></li>
</ol>



<ul>
<li>支払い済み</li>



<li>配送中</li>



<li>配送間違い</li>



<li>消失</li>



<li>配送済み</li>
</ul>



<p>③「注文取消」</p>



<ul>
<li>受取拒否</li>



<li>返品中</li>



<li>返品済み</li>



<li>返金済み</li>
</ul>



<p>そして状態が変わる条件は次の通りです。</p>



<ul>
<li>「支払い済み」になった場合に「本注文」になる。</li>



<li>「配送済み」が「受取拒否」された場合に「注文取消」になる。</li>
</ul>



<h2 class="wp-block-heading">実装例</h2>



<p>言語はC#です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-csharp" data-lang="C#"><code>public interface IOrderState
{
    IOrderState Handle(OrderAction action);
}

public enum OrderAction
{
    StartCreation,
    Unpay,
    Reject,
    Pay,
    StartShipment,
    ReportShipmentError,
    Lost,
    Delivere,
    RefusedDelivery,
    StartReturn,
    Returned,
    Refund
}

public class ProvisionalOrderState : IOrderState
{
    private bool creationInProgress = false;
    private bool createdUnpaid = false;
    private bool createdPaymentRejected = false;
    private bool paid = false;
    
	public IOrderState Handle(OrderAction action)
    {
		switch (action)
        {
            case OrderAction.StartCreation:
                creationInProgress = true;
                break;
            case OrderAction.Unpay:
                createdUnpaid = true;
                break;
            case OrderAction.Reject:
                createdPaymentRejected = true;
                break;
            case OrderAction.Pay:
                paid = true;
                return new ActualOrderState();
            default:
                throw new InvalidOperationException();
        }

        return this;
    }
}

public class ActualOrderState : IOrderState
{
    private bool paid = true;
    private bool shipmentInProgress = false;
    private bool shipmentError = false;
    private bool losted = false;
    private bool delivered = false;

	public IOrderState Handle(OrderAction action)
    {
        switch (action)
        {
            case OrderAction.StartShipment:
                shipmentInProgress = true;
                break;
            case OrderAction.ReportShipmentError:
                shipmentError = true;
                break;
            case OrderAction.Lost:
                lost = true;
                break;
            case OrderAction.Delivery:
                delivered = true;
            case OrderAction.RefusedDelivery:
                return new CancellationOrderState();
            default:
                throw new InvalidOperationException();
        }

        return this;
    }
}

public class CancellationOrderState : IOrderState
{
    private bool refusedDelivered = true;
    private bool returning = false;
    private bool returned = false;
    private bool refunded = false;
    
	public IOrderState Handle(OrderAction action)
    {
        switch (action)
        {
            case OrderAction.StartReturn:
                returning = true;
                break;
            case OrderAction.Returned:
                returned = true;
                break;
            case OrderAction.Refund:
                refunded = true;
            default:
                throw new InvalidOperationException();
        }

        return this;
    }
}

public class Order
{
    private IOrderState state;

    public Order()
    {
        state = new ProvisionalOrderState();
    }

    public void Handle(OrderAction action)
    {
        state = state.Handle(action);
    }
}</code></pre></div>



<h2 class="wp-block-heading">実装例（ボツ）</h2>



<p>最初は書籍内で紹介されているstate objectの実装方法を真似て考えました。</p>



<p>下記のコードでは一旦「注文取消」にするケースは除外して考えています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-csharp" data-lang="C#"><code>public interface IOrderState
{
    IOrderState UpdateState(Order order);
}

public class ProvisionalOrderState : IOrderState
{
    private bool creationInProgress = false;
    private bool createdUnpaid = false;
    private bool createdPaymentRejected = false;
    private bool paid = false;

    public IOrderState UpdateState(Order order)
    {
        if (paid)
        {
            return new ActualOrderState();
        }
        return this;
    }
}

public class ActualOrderState : IOrderState
{
    private bool paid = true;
    private bool shipmentInProgress = false;
    private bool shipmentError = false;
    private bool lost = false;
    private bool delivered = false;

    public IOrderState UpdateState(Order order)
    {
        return this;
    }
}

public class CancellationOrderState : IOrderState
{
    private bool refusedDelivery = true;
    private bool returning = false;
    private bool returned = false;
    private bool refunded = false;

    public IOrderState UpdateState(Order order)
    {
        return this;
    }
}

public class Order
{
    private IOrderState state;

    public Order()
    {
        state = new ProvisionalOrderState();
    }
}</code></pre></div>



<p>このコードの場合に難しいのは、</p>



<ul>
<li>「配送済み」が「受取拒否」された場合に「注文取消」になるケース
<ul>
<li>「本注文」には「受取拒否」という状態がないため、何らかの工夫が必要になります。</li>
</ul>
</li>



<li>各bool値を更新するメソッドを用意すると、<code>IOrderState</code> にメソッドを追加するか別のインターフェースを用意するなどの工夫が必要になります。</li>
</ul>



<p>「注文取消」する例ですが、セキュア・バイ・デザインはDDDの本なので、DDDに倣ってドメインイベントにすればいいのかなと思いました。</p>



<p><code>if (domainEvent is RefusedDeliveryEvent)</code> の箇所は好みではないのですが、ここを解消しようとすると複雑になってしまうためここでは割愛しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-csharp" data-lang="C#"><code>public interface IOrderState
{
    IOrderState UpdateState(Order order, IDomainEvent domainEvent);
}

public interface IDomainEvent {}

public class RefusedDeliveryEvent : IDomainEvent {}

public interface IOrderState
{
    IOrderState UpdateState(Order order, IDomainEvent domainEvent);
}

public class ActualOrderState : IOrderState
{
    public IOrderState UpdateState(Order order, IDomainEvent domainEvent)
    {
        if (domainEvent is RefusedDeliveryEvent)
        {
            return new CancellationOrderState();
        }
        return this;
    }
}

public class Order
{
    private IOrderState state;
    private IDomainEvent event;

    public Order()
    {
        state = new ProvisionalOrderState();
    }

		public void UpdateState()
    {
        state = state.UpdateState(this, event);
        domainEvent = null;
    }

    public void RefuseDelivery()
    {
				domainEvent = new RefusedDeliveryEvent();
        UpdateState();
    }
}</code></pre></div>



<p>ここまで考えましたが、各bool値を更新するメソッドを良い感じに用意する方法が思いつかなかったのでボツ。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ChromeからEvent.pathが廃止された</title>
		<link>https://ababa.cloud/2023/01/post-531.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sun, 22 Jan 2023 13:31:30 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=531</guid>

					<description><![CDATA[はじめに ChromeからEvent.pathが廃止されたため、以下のコードが動作しなくなりました。 回避策 代替として、Event.composedPath()を使用すれば良いようです。 ただ、今回は何故かこの方法では [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<p>ChromeからEvent.pathが廃止されたため、以下のコードが動作しなくなりました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>const composedPath = event.path;</code></pre></div>



<h3 class="wp-block-heading">回避策</h3>



<p>代替として、<a href="https://developer.mozilla.org/ja/docs/Web/API/Event/composedPath" data-type="URL" data-id="https://developer.mozilla.org/ja/docs/Web/API/Event/composedPath">Event.composedPath()</a>を使用すれば良いようです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>const composedPath = event.composedPath();</code></pre></div>



<p>ただ、今回は何故かこの方法では空の配列が返ってきてだけで、イベントのパスが取得できませんでしたので、<br>Event.composedPath()と同等の処理を独自実装する事で回避しました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>composedPath = (event) =&gt; {
    const path = [];
    let node = event.target;

    while (node !== null) {
        path.push(node);
        node = node.parentNode;
    }

    return path;
}</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【読書メモ】「システム運用アンチパターン」を読んだまとめ</title>
		<link>https://ababa.cloud/2022/12/reading-notebook-system-operation-anti-patterns.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Fri, 30 Dec 2022 11:40:00 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[読書メモ]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=516</guid>

					<description><![CDATA[はじめに システム運用アンチパターンを読みました。中身はDevOps本です。DevOpsという用語は知っていたものの、詳しくなかったため読んでみました。印象に残った項目をメモしています。 1章　DevOpsを構成するもの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<p><a href="https://www.amazon.co.jp/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%81%8B%E7%94%A8%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E2%80%95%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8CDevOps%E3%81%A7%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B%E7%B5%84%E7%B9%94%E3%83%BB%E8%87%AA%E5%8B%95%E5%8C%96%E3%83%BB%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-Jeffery-D-Smith/dp/4873119847">システム運用アンチパターン</a>を読みました。<br>中身はDevOps本です。<br>DevOpsという用語は知っていたものの、詳しくなかったため読んでみました。<br>印象に残った項目をメモしています。</p>



<h3 class="wp-block-heading">1章　DevOpsを構成するもの</h3>



<ul>
<li>DevOpsとは？
<ul>
<li>ソフトウェア開発の考え方をほかの役割に適用するようなソフトウェア開発手法(p.3)</li>



<li>ソフトウェア開発のライフサイクルに関わるすべてのチームが責任を共有する事を重視する</li>



<li>従来は開発者中心であった業務を運用チームのメンバーが担い、開発チームのメンバーも同様の業務を行うことで、<br>職能の垣根が低くなる</li>
</ul>
</li>



<li>DevOpsの柱となるCAMS
<ul>
<li>文化(p.6)</li>



<li>自動化</li>



<li>メトリクス
<ul>
<li>物事がうまく機能しているかどうか判断するために必要</li>



<li>エラーが発生していないことを確認するだけでは不十分</li>
</ul>
</li>



<li>共有</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">2章　パターナリスト症候群</h3>



<ul>
<li>仕事の進め方やタイミングをゲートキーパーと呼ばれる権力者に委ねる(p.9)
<ul>
<li>最初は賢明な判断に見えるがすぐに生産性の低下を招く</li>
</ul>
</li>



<li>承認の目的を把握して、自動化する(p.21)</li>
</ul>



<h3 class="wp-block-heading">3章　盲目状態での運用</h3>



<ul>
<li>開発と運用の役割を変える(p.35)</li>



<li>プロダクトの理解(p.36)</li>



<li>システムの動作を理解する際に役立つメトリクス(p.37)
<ul>
<li>スループット</li>



<li>エラー率</li>



<li>レイテンシ</li>
</ul>
</li>



<li>メトリクスの種類(P.38)
<ul>
<li>ゲージ
<ul>
<li>ある特定の瞬間の数値</li>
</ul>
</li>



<li>カウンタ
<ul>
<li>あるイベントが発生した回数を表し、増加し続ける値</li>
</ul>
</li>
</ul>
</li>



<li>何を測定するか決める(P.39)
<ul>
<li>何を測定するか決めるのは難しい作業</li>
</ul>
</li>



<li>健全なメトリクスを定義する(P.43)</li>



<li>何を記録すべきか？(P.51)
<ul>
<li>何のアクションが実行されたのか？(P.52)</li>



<li>そのアクションの期待される結果は何か？</li>



<li>そのアクションの実際の結果は何か？</li>



<li>取るべき修復手順は何か？</li>



<li>このエラーによって引き起こされる潜在的な結果は何か？
<ul>
<li>何か起こったのか、その結果としてシステムがとったアクションを把握できるようにする。
<ul>
<li>×：クレジットカードの認証を完了できませんでした</li>



<li>○：クレジットカードの認証を完了できませんでした。注文は拒否され顧客に通知されます</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">4章　情報ではなくデータ</h3>



<ul>
<li>ダッシュボード作成の際にやってしまいがちなのは、すべての人の役に立つ究極のダッシュボードを構築しようとする始め方(P.60)
<ul>
<li>そのようなものは存在しない</li>



<li>ほとんどの場合、誰にとっても役に立たないダッシュボードができあがる</li>
</ul>
</li>



<li>ダッシュボードの対象者を特定する
<ul>
<li>誰がこのダッシュボードを見るのか？</li>



<li>このダッシュボードの目的は何か？</li>



<li>上記の目的を考慮したうえで、このダッシュボードが伝える必要のある情報のうち上位3～5個の項目は何か？</li>
</ul>
</li>



<li>ウィジェットに文脈を与える(P.65)
<ul>
<li>利用者が値の良し悪しを知ることができるようにする</li>
</ul>
</li>



<li>ダッシュボードの命名(P.70)</li>
</ul>



<h3 class="wp-block-heading">5章　最後の味付けとしての品質</h3>



<p>以前読んだ<a href="https://www.amazon.co.jp/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%83%87%E3%83%AA%E3%83%90%E3%83%AA%E3%83%BC-%E4%BF%A1%E9%A0%BC%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88%E3%83%BB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96-Jez-Humble/dp/4048930583/ref=tmm_hrd_swatch_0?_encoding=UTF8&amp;qid=&amp;sr=">継続的デリバリー</a>と内容が被っているので割愛<br>継続的デリバリーの読書メモは<a href="https://ababa.cloud/2021/10/reading-notebook-continuous-deployment.html">こちら</a></p>



<h3 class="wp-block-heading">6章　アラート疲れ</h3>



<ul>
<li>アラートは単にシステムの状態を説明しているだけで、どのようにしてそのような状態になったのかについては分からない(P.104)</li>



<li>アラート基準(P.110)
<ul>
<li>行動可能である
<ul>
<li>アラートをトリガーする際、何が問題でどう解決するかについて道筋を示すべき</li>
</ul>
</li>



<li>タイムリーである
<ul>
<li>未来への影響を予測してアラートをトリガーする事は止める（ディスク容量が少なくなってきた等）</li>



<li>検出するまでの期間を延ばす（4回チェックに失敗したらアラートする等）</li>
</ul>
</li>



<li>適切に優先順位付けされている
<ul>
<li>発生している事が分かれば十分な通知はメール等の優先順位の低い通知方法に変更する</li>
</ul>
</li>
</ul>
</li>



<li>しきい値
<ul>
<li>何をもって正常な値が確信をもてない場合は、過去の値から得られる値を観察する</li>



<li>過去の値から正常な範囲を把握したら、この基準値よりも20%高い値をしきい値としてアラートを設定する</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">7章　空の道具箱</h3>



<h3 class="wp-block-heading">8章　業務時間外のデプロイ</h3>



<p>題名だけ見ると、定時後や休日にデプロイする話なのかと思いましたが、<br>デプロイが不安で大きなイベントなっていることについて書かれています。</p>



<ul>
<li>遅いリリースの悪影響(P.173)
<ul>
<li>リリースの詰め込み</li>



<li>大急ぎの機能</li>



<li>重厚な変更管理プロセス
<ul>
<li>リリースが大きくなるとリスクが大きくなる</li>



<li>リスクが大きくなると失敗の影響が大きくなる</li>



<li>失敗の影響が大きくなると承認や変更管理の層を増やしてプロセスが厳しくなる</li>
</ul>
</li>
</ul>
</li>



<li><strong>デプロイのレイヤ</strong>(P.174)</li>



<li>ステージング環境と本番環境は同じにならない(P.179)
<ul>
<li>ユーザーと並行実効性</li>
</ul>
</li>



<li>不完全な測定(P.189)
<ul>
<li>測定の完璧さにとらわれてはいけない</li>
</ul>
</li>



<li>データベース変更のルール(P.194)
<ul>
<li>基本的なルールは、常に追加的な変更を加える</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">9章　せっかくのインシデントを無駄にする</h3>



<ul>
<li>ポストトーテムとは、チームがインシデントに至るまでの出来事を評価するプロセス(P.214)</li>



<li>責任のなすりつけ合いがうまくいかないのは、問題が人にあると攻撃してしまうから
<ul>
<li>なぜ失敗を引き起こしたのかという核心に触れていない</li>
</ul>
</li>



<li>ポストモーテムのルール設定(P.218)
<ul>
<li>人を直接批判してはならない。行動や振る舞いに焦点を当てる。</li>



<li>誰もが、その時点で得られた情報の中で、最善の仕事をしたと考える。</li>



<li>今となっては明白な事実であっても、その場ではあいまいだった可能性があることを認識する。</li>



<li>人ではなくシステムを責める。</li>



<li>最終的な目標は、インシデントに関与したすべての要素を理解することであることを忘れない。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">10章　情報のため込み：ブレントだけが知っている</h3>



<ul>
<li>情報を公開するだけでは不十分(P.236)
<ul>
<li>知識共有の現実は、単に情報をwikiに載せるだけでは十分ではない</li>
</ul>
</li>



<li>ドキュメントは最終的なゴールではなく、最終的なゴールは情報の共有(P.239)</li>



<li>抽象化 vs. 難読化(P.240)</li>



<li>学習の習慣付け(P.253)
<ul>
<li>ランチ＆ラーン</li>



<li>ライトニングトーク</li>



<li>外部イベントのホスト</li>



<li>ブログ</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">11章　命じられた文化</h3>



<ul>
<li>なぜDevOps組織では文化が重要なのか？(P.264)
<ul>
<li>文化が仕事の進め方の風潮を決めるから</li>
</ul>
</li>



<li>文化とは何か？(P.264)
<ul>
<li>文化的価値観</li>



<li>文化的習慣</li>



<li>信念
<ul>
<li>信念によって、疑問を感じない文化が生み出され、より良い方法は実現可能性が非常に低く、<br>試みることさえも愚かに思えてしまう</li>
</ul>
</li>
</ul>
</li>



<li>文化を変えるには？(P.269)


<ul>
<li>文化を変えるには、社会集団の中でどのように文化が広がって伝達させるかを理解することが重要
<ul>
<li>文化の共有
<ul>
<li>言葉による文化の共有
<ul>
<li>言葉遣いは、メンバーがグループ内のほかの人の行動をまねることで、<br>良い点も悪い点もチーム全体に伝わる
<ul>
<li>例えば、データベース管理者の悪口ばかり言っていたら、すぐに周りの人もデータベース管理者を否定的に見るようになる</li>
</ul>
</li>



<li>「わからない」という言葉のようにシンプルなことを率直に言えることで、チームや組織の多くの文化的価値観や規範を伝えることができる
<ul>
<li>誰かがこういう発言をすることによって、自分の仕事について常に何でも知っていなければならないと感じているメンバーの心理的負担を軽減できる</li>
</ul>
</li>
</ul>
</li>



<li>物語による文化の共有
<ul>
<li>成功譚は企業文化の基盤となり、企業に目的を与え、問題に取り組む姿勢を形成することもある</li>
</ul>
</li>



<li>習慣による文化の共有</li>
</ul>
</li>
</ul>
</li>



<li>言葉・物語・習慣は、文化を伝える3つの重要な方法(良くも悪くも)</li>



<li>個人が文化を変えることができる(P.272)</li>



<li>会社の価値観を調べる(P.274)
<ul>
<li>言葉から始める</li>



<li>対話するには次のような言葉を使う
<ul>
<li>確固たる事実と、その事実から導き出された視点や意見を明確に分ける</li>



<li>議論のある余地のある表現を使う</li>



<li>自分の行動の最終目標を明確にする</li>
</ul>
</li>
</ul>
</li>



<li>習慣を作る(P.276)
<ul>
<li>習慣に取り組む際に自問すること
<ul>
<li>1. 習慣の目的は何か？</li>



<li>2. どのようなスタイルの習慣を作るのか(社会的習慣か、プロセス的習慣か)？</li>



<li>3. 週刊で期待されるアウトプットは何か？</li>



<li>4. 何が習慣の実行のきっかけとなるか？</li>
</ul>
</li>
</ul>
</li>
</ul>



<ul>
<li>習慣と言葉を使って文化的規範を変える(P.278)
<ul>
<li>文化的規範の多くはテクノロジーで強制できる(P.279)</li>



<li>言葉と習慣の組み合わせは文化的規範への違反を気付かせる健全な方法として機能する</li>
</ul>
</li>



<li>文化にあった人材(P.281)
<ul>
<li>古い役割、新しい考え方
<ul>
<li>チームが新しい考え方を導入する準備をする際には、ほかのチームメンバーの仕事に興味を持つことをもくひょうにするべき</li>



<li>そういった興味は、責任を共有することで生じる場合もあるし、生来の好奇心や過去の経験から生じる場合もある</li>



<li>開発者は運用面に関心を抱いているはずで、運用も同様に開発のハードルに関心を持っているはず</li>
</ul>
</li>



<li>会話を通して問題を共有する(P.282)
<ul>
<li>どのように交流したかは、実際に交流が行われることに比べれば重要ではない</li>



<li>チームメンバー間で交流を生み出すことは、共感を生み、他の人の役割に対する好奇心を刺激する(P.283)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">12章　多すぎる尺度</h3>



<ul>
<li>目標設定と順位付けのプロセスは、DevOpsの文化において非常に重要(P.295)</li>



<li>目標の階層(P.296)
<ul>
<li>組織全体の目標</li>



<li>部門の目標</li>



<li>チームの目標</li>
</ul>
</li>



<li>優先度、緊急度、重要度(P.301)
<ul>
<li>1人の人間が持つことのできる優先事項は一度に1つ</li>



<li>緊急度とは、どれだけ早くその仕事をしなければならないか
<ul>
<li>客観的な期限が必要</li>
</ul>
</li>



<li>重要度とは、その仕事の深刻さや価値に関係している</li>
</ul>
</li>



<li>予定外の作業(P.310)
<ul>
<li>予定外の作業のコントロール(P.311)
<ul>
<li>同僚からの予定外の作業</li>



<li>システムからの予定外の作業</li>
</ul>
</li>



<li>予定外の作業への対応(P.314)
<ul>
<li>その依頼はなぜ重要なのか？</li>



<li>その依頼が遅れることで何が影響を受けるか？</li>



<li>その依頼のほかの関係者は誰か？(たとえば依頼が遅れることで他に影響を受けるのは誰か？)</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PythonでvenvをActivateしようとすると「ソフトウェアの制限のポリシー (グループ ポリシーを使用して作成されたポリシーなど) によって操作がブロックされているため、…」が表示されてはまった</title>
		<link>https://ababa.cloud/2022/11/python-venv-activate-error.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sat, 26 Nov 2022 13:28:41 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=511</guid>

					<description><![CDATA[エラー内容 PowerShellで、 を実行すると、以下のエラーになりました。 Windows PowerShellスクリプトの実行ポリシーには以下の4つがあり、デフォルトがRestrictedである事が原因です。 そこ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">エラー内容</h2>



<p>PowerShellで、</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>.\env\Scripts\Activate.ps1</code></pre></div>



<p>を実行すると、以下のエラーになりました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>.\env\Scripts\Activate.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\myapp\env\Scripts\Activate.ps1 を読み込むことができません。詳細については、「about_Execution_Pol
icies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\env\Scripts\Activate.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess</code></pre></div>



<p>Windows PowerShellスクリプトの実行ポリシーには以下の4つがあり、デフォルトがRestrictedである事が原因です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Restricted - 実行できるスクリプトはありません。Windows PowerShell は対話型モードでのみ使用できます。
AllSigned - 信頼できる発行元が署名したスクリプトのみを実行できます。
RemoteSigned - ダウンロードしたスクリプトは信頼できる発行元が署名した場合にのみ実行できます。
Unrestricted - 制限なし。すべての Windows PowerShell スクリプトを実行できます。</code></pre></div>



<p>そこで以下のコマンドでAllSignedに変更。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Set-ExecutionPolicy AllSigned</code></pre></div>



<p>その後にActivateしたところ。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>この信頼されていない発行元からのソフトウェアを実行しますか?
ファイル C:\Users\myapp\env\Scripts\Activate.ps1 の発行元は CN=Python Software
Foundation, O=Python Software Foundation, L=Beaverton, S=Oregon, C=US
であり、このシステムで信頼されていません。信頼された発行元からのスクリプトのみを実行してください。
[V] 常に実行しない(V)  [D] 実行しない(D)  [R] 一度だけ実行する(R)  [A] 常に実行する(A)  [?] ヘルプ (既定値は &quot;D&quot;): V</code></pre></div>



<p>ここで誤って「[V] 常に実行しない(V)」を選択してしまい、その後にactivateを実行しても以下のエラーになりました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>.\env\Scripts\Activate.ps1 : ソフトウェアの制限のポリシー (グループ ポリシーを使用して作成されたポリシーなど) によって
操作がブロックされているため、ファイル C:\Users\myapp\env\Scripts\Activate.ps1
は読み込めません。
発生場所 行:1 文字:1
+ .\env\Scripts\Activate.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess</code></pre></div>



<h2 class="wp-block-heading">解決</h2>



<p>調べていくと「信頼されていない証明書」に「Python Software Foundation」に入ってしまった事が原因だと分かったので、</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>certmgr.msc</code></pre></div>



<p>を実行して、certmgrを開きます。<br>「信頼されていない証明書」を選択し、「Python Software Foundation」を探し、証明書を右クリック⇒削除しました。</p>



<figure class="wp-block-image size-medium"><img fetchpriority="high" decoding="async" width="300" height="213" src="https://ababa.cloud/wp-content/uploads/2022/11/image-300x213.png" alt="" class="wp-image-513" srcset="https://ababa.cloud/wp-content/uploads/2022/11/image-300x213.png 300w, https://ababa.cloud/wp-content/uploads/2022/11/image-768x545.png 768w, https://ababa.cloud/wp-content/uploads/2022/11/image.png 938w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<h2 class="wp-block-heading">備考</h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ソフトウェアの制限のポリシー (グループ ポリシーを使用して作成されたポリシーなど) によって
操作がブロックされているため、</code></pre></div>



<p>↑のエラーが分かりくいです。<br>エラー文から最初は「ローカル セキュリティ ポリシー(secpol.msc)」が原因かな？と思ってしまい、はまってしまいました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【説明書】Pokémon HOME検索</title>
		<link>https://ababa.cloud/2022/10/manual-pokemonhome-search.html</link>
					<comments>https://ababa.cloud/2022/10/manual-pokemonhome-search.html#respond</comments>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sun, 30 Oct 2022 14:07:00 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=465</guid>

					<description><![CDATA[Pokémon HOMEのデータを検索するアプリを作りました。 https://play.google.com/store/apps/details?id=jp.co.ababa51515.pokehomesearch  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Pokémon HOMEのデータを検索するアプリを作りました。</p>



<p><a href="https://play.google.com/store/apps/details?id=jp.co.ababa51515.pokehomesearch">https://play.google.com/store/apps/details?id=jp.co.ababa51515.pokehomesearch</a></p>



<h3 class="wp-block-heading">特徴</h3>



<p>ポケモンの名前、シーズン、を入力するだけで簡単に検索できます。</p>



<h3 class="wp-block-heading">使い方</h3>



<p>使い方は、ポケモンの名前を入力するだけです。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="702" src="https://ababa.cloud/wp-content/uploads/2022/10/1-1-1024x702.png" alt="" class="wp-image-508" style="width:256px;height:176px" srcset="https://ababa.cloud/wp-content/uploads/2022/10/1-1-1024x702.png 1024w, https://ababa.cloud/wp-content/uploads/2022/10/1-1-300x206.png 300w, https://ababa.cloud/wp-content/uploads/2022/10/1-1-768x526.png 768w, https://ababa.cloud/wp-content/uploads/2022/10/1-1.png 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>以下の画像だと、ピカチュウのデータをPGLから取得して表示します。<br>シーズンや対戦の種類の切り替えもできます。<br>フォルムがある場合、ポケモンの名前の入力欄の下のセレクトボックスで選択できます。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="507" height="1024" src="https://ababa.cloud/wp-content/uploads/2022/10/2-507x1024.png" alt="" class="wp-image-507" style="width:254px;height:512px" srcset="https://ababa.cloud/wp-content/uploads/2022/10/2-507x1024.png 507w, https://ababa.cloud/wp-content/uploads/2022/10/2-149x300.png 149w, https://ababa.cloud/wp-content/uploads/2022/10/2-768x1550.png 768w, https://ababa.cloud/wp-content/uploads/2022/10/2-761x1536.png 761w, https://ababa.cloud/wp-content/uploads/2022/10/2-1015x2048.png 1015w, https://ababa.cloud/wp-content/uploads/2022/10/2.png 1080w" sizes="(max-width: 507px) 100vw, 507px" /></figure>



<h3 class="wp-block-heading">その他</h3>



<p>・倒した時のわざの使用率には対応していません。<br>・倒された時のわざの使用率には対応していません。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ababa.cloud/2022/10/manual-pokemonhome-search.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【VSCode】Djangoデバッグ用のlaunch.json設定メモ</title>
		<link>https://ababa.cloud/2022/10/django-launch-json-settings.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sun, 23 Oct 2022 13:46:53 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=502</guid>

					<description><![CDATA[自分用の設定メモ]]></description>
										<content:encoded><![CDATA[
<p>自分用の設定メモ</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>&quot;configurations&quot;: [
{
  &quot;name&quot;: &quot;Python: Server&quot;,
  &quot;type&quot;: &quot;python&quot;,
  &quot;request&quot;: &quot;launch&quot;,
  &quot;program&quot;: &quot;${workspaceFolder}/myapi/manage.py&quot;,
  &quot;args&quot;: [
    &quot;runserver&quot;,
  ],
  &quot;console&quot;: &quot;integratedTerminal&quot;
},
{
  &quot;name&quot;: &quot;Python: Server2&quot;,
  &quot;type&quot;: &quot;python&quot;,
  &quot;request&quot;: &quot;launch&quot;,
  &quot;program&quot;: &quot;${workspaceFolder}/myapi/manage.py&quot;,
  &quot;args&quot;: [
    &quot;runserver&quot;,
    &quot;--settings=myapi.settings.local&quot;,
  ],
  &quot;console&quot;: &quot;integratedTerminal&quot;
}
]</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Python＋Django REST Frameworkで作ったAPIをRender.comにデプロイしてみた</title>
		<link>https://ababa.cloud/2022/09/post-485.html</link>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Mon, 19 Sep 2022 09:39:35 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=485</guid>

					<description><![CDATA[はじめに 以前書いた記事でHerokuにデプロイする記事を書いたのですが、2022年11月28日から無料プランを廃止するという事なので、代替としてRender.comにデプロイし直してみました。 手順 https://r [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">はじめに</h2>



<p><a href="https://ababa.cloud/2022/06/deplpy-on-heroku-pythondjango-rest-framework.html">以前書いた記事</a>でHerokuにデプロイする記事を書いたのですが、2022年11月28日から無料プランを廃止するという事なので、代替としてRender.comにデプロイし直してみました。</p>



<h2 class="wp-block-heading">手順</h2>



<p><a href="https://render.com/">https://render.com/</a> にアクセスし、「GET STARTED FOR FREE」を選択します。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="442" src="https://ababa.cloud/wp-content/uploads/2022/09/image-1024x442.png" alt="" class="wp-image-488" srcset="https://ababa.cloud/wp-content/uploads/2022/09/image-1024x442.png 1024w, https://ababa.cloud/wp-content/uploads/2022/09/image-300x129.png 300w, https://ababa.cloud/wp-content/uploads/2022/09/image-768x331.png 768w, https://ababa.cloud/wp-content/uploads/2022/09/image-1536x663.png 1536w, https://ababa.cloud/wp-content/uploads/2022/09/image.png 1917w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>今回はgithubを選択しました。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="462" src="https://ababa.cloud/wp-content/uploads/2022/09/image-1-1024x462.png" alt="" class="wp-image-489" srcset="https://ababa.cloud/wp-content/uploads/2022/09/image-1-1024x462.png 1024w, https://ababa.cloud/wp-content/uploads/2022/09/image-1-300x135.png 300w, https://ababa.cloud/wp-content/uploads/2022/09/image-1-768x346.png 768w, https://ababa.cloud/wp-content/uploads/2022/09/image-1-1536x693.png 1536w, https://ababa.cloud/wp-content/uploads/2022/09/image-1.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">設定ファイル</h2>



<p>render.yamlとbuild.shを用意する必要があります。今回はこんな感じで設定しました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="render.yaml"><code>databases:
  - name: mysite_db
    plan: free
    databaseName: mysite_db
    user: mysite_db

services:
  - type: web
    name: mysite
    plan: free
    env: python
    rootDir: src/mysite
    buildCommand: &quot;./build.sh&quot;
    startCommand: &quot;gunicorn mysite.wsgi:application --timeout 600&quot;
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: mysite_db
          property: connectionString
      - key: SECRET_KEY
        generateValue: true
      - key: WEB_CONCURRENCY
        value: 2
      - key: DJANGO_SUPERUSER_PASSWORD
        generateValue: true
      - key: PYTHON_VERSION
        value: 3.9.1
      - key: DJANGO_SETTINGS_MODULE
        value: mysite.settings.production
</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="build.sh"><code>#!/usr/bin/env bash
# exit on error
set -o errexit

pip install -r requirements.txt

python manage.py collectstatic --noinput</code></pre></div>



<h2 class="wp-block-heading">デプロイ</h2>



<p>Blueprints⇒New Blueprint Instance</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="416" src="https://ababa.cloud/wp-content/uploads/2022/09/image-3-1024x416.png" alt="" class="wp-image-491" srcset="https://ababa.cloud/wp-content/uploads/2022/09/image-3-1024x416.png 1024w, https://ababa.cloud/wp-content/uploads/2022/09/image-3-300x122.png 300w, https://ababa.cloud/wp-content/uploads/2022/09/image-3-768x312.png 768w, https://ababa.cloud/wp-content/uploads/2022/09/image-3.png 1479w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>デプロイ対象のConnectをクリックし、適当なService Group Nameを指定してApply</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="291" src="https://ababa.cloud/wp-content/uploads/2022/09/image-4-1024x291.png" alt="" class="wp-image-492" srcset="https://ababa.cloud/wp-content/uploads/2022/09/image-4-1024x291.png 1024w, https://ababa.cloud/wp-content/uploads/2022/09/image-4-300x85.png 300w, https://ababa.cloud/wp-content/uploads/2022/09/image-4-768x218.png 768w, https://ababa.cloud/wp-content/uploads/2022/09/image-4.png 1245w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="384" src="https://ababa.cloud/wp-content/uploads/2022/09/image-6-1024x384.png" alt="" class="wp-image-494" srcset="https://ababa.cloud/wp-content/uploads/2022/09/image-6-1024x384.png 1024w, https://ababa.cloud/wp-content/uploads/2022/09/image-6-300x112.png 300w, https://ababa.cloud/wp-content/uploads/2022/09/image-6-768x288.png 768w, https://ababa.cloud/wp-content/uploads/2022/09/image-6-1536x575.png 1536w, https://ababa.cloud/wp-content/uploads/2022/09/image-6.png 1706w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>デプロイが成功すれば以下のような状態になります。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="234" src="https://ababa.cloud/wp-content/uploads/2022/09/image-7-1024x234.png" alt="" class="wp-image-497" srcset="https://ababa.cloud/wp-content/uploads/2022/09/image-7-1024x234.png 1024w, https://ababa.cloud/wp-content/uploads/2022/09/image-7-300x69.png 300w, https://ababa.cloud/wp-content/uploads/2022/09/image-7-768x176.png 768w, https://ababa.cloud/wp-content/uploads/2022/09/image-7-1536x351.png 1536w, https://ababa.cloud/wp-content/uploads/2022/09/image-7.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">最後に</h2>



<p>herokuより処理速度がかなり落ちました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>css-loaderで「options has an unknown property &#8216;getLocalIdent&#8217;. These properties are valid:」のエラー</title>
		<link>https://ababa.cloud/2022/08/post-472.html</link>
					<comments>https://ababa.cloud/2022/08/post-472.html#respond</comments>
		
		<dc:creator><![CDATA[ababa]]></dc:creator>
		<pubDate>Sat, 27 Aug 2022 14:44:18 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ababa.cloud/?p=472</guid>

					<description><![CDATA[エラー内容 css-loaderのバージョンを上げた際に下記エラーが表示されました。 解決策 getLocalIdentをmodules配下に移動します。 変更前 変更後]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">エラー内容</h3>



<p>css-loaderのバージョンを上げた際に下記エラーが表示されました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ValidationError: Invalid options object. CSS Loader has been initialized using an options object that does not match the API schema.
 - options has an unknown property &#39;getLocalIdent&#39;. These properties are valid:
   object { url?, import?, modules?, sourceMap?, importLoaders?, localsConvention?, onlyLocals?, esModule? }</code></pre></div>



<h3 class="wp-block-heading">解決策</h3>



<p>getLocalIdentをmodules配下に移動します。</p>



<h4 class="wp-block-heading">変更前</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>modules: true,
getLocalIdent: getCSSModuleLocalIdent,</code></pre></div>



<h4 class="wp-block-heading">変更後</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>modules: {
  getLocalIdent: getCSSModuleLocalIdent
},</code></pre></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ababa.cloud/2022/08/post-472.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
