2022年10月29日土曜日

これからの農業経営を考える。あと、就農時にできていて良かったこと。

きな粉ときくらげ

さわでは、「既存農地」「家族の労働力」「自己資金」の範囲で農業経営をしています。

ここ5年位は足元を固めることを最優先にしていたため、手元の運転資金はけっこうカツカツで回してきました。

しかし、足元についてはおおよそ目処が立ってきたので、厳しさを増す昨今の環境を鑑み、今後は運転資金を少し厚めに確保したいと考えています。

具体的には、売上高現預金比率を50%程度で維持できたらなと。(参考投稿:「新たな農業経営指標」による経営状況の自己チェック

それでも対応できないような次元でめちゃくちゃ状況が悪くなり、万が一農業が続けられない(赤字になる→運転資金が足りない)ような事態に陥った時には、極限まで規模を絞り、兼業化して復活できるタイミングを待とうと思っています。

これが可能なのが、「既存農地」「家族の労働力」「自己資金」で農業をやる強みですね。乾眠クマムシ作戦。

馬力の出るシチュエーションというのは人それぞれかと思いますが、私は守備的な精神の持ち主なので、やることは絞りつつ、二手先くらい選択肢を多めに用意しておくことでパフォーマンスを上げやすくなります。

これからの農業の本流が規模拡大や法人化の先にあることは間違いなさそうですが、あえて流れに乗らないものもひとつですね。個々人にとっての良い働き方もそれぞれ。

もちろん、単純な興味という意味では、企業的な農業経営も面白そうだなあと感じるのですが、かと言って自分にその舵取りをする才覚があるとは思えず、かつ覚悟もモチベーションも湧いてこないので、たぶん向いてはいないのでしょう。

28歳くらいで就農しましたが、振り返ったときに良かったなと思うのは、初期からある程度自身の適性を把握した状態で臨めた点です。

近年は、SNS 等で湯水のように情報に触れることができるため、逆に自身の適性とは異なる方向に流されかねないという難しさもあるかもなあと感じています。SNS 上での言説の趨勢と、実際のあれこれというのは、やはり幾分乖離していますよね。

ちなみにもうひとつ、青年就農給付金(現在の農業次世代人材投資資金)を使わずにできたことも良かったなと思っています。

撤退せざるを得ない状態になった時に返還対象になるときついなという守備的判断のためですが、結果、都度方向転換しつつ自由に経営の形を作れたことが、私の場合はプラスに働いたように思います。

よく話題にあがる制度ですが、農業の間口を広げるためには良い仕組みだと思います。一方で個人にとっては簡単には退けなくなるので利用には細心の注意が必要だと感じています。


クマムシ博士の クマムシへんてこ最強伝説
クマムシ博士の クマムシへんてこ最強伝説

by SimpleImageLink


・関連投稿




Twitter (@nkkmd) 日々更新中です。

2022年10月28日金曜日

【GAS】注文フォームの回答から自動的に返信メールを作成する

秋明菊

家のまわりで秋明菊が咲いていました。

朝晩だいぶ冷え込むようになってきましたね。本格的な紅葉まではもう少しですかね。


***

さて、久しぶりの GAS (Google Apps Script) です。

さわではホダ木の注文を Google フォームで受けています。フォームが送信されるとスプレッドシートに記録されます。以前はこのスプレッドシートの内容を目視で確認して返信メールを書いていたのですが、いつかミスしそう……という微弱なストレスを感じていました。

そこで、フォームが送信されると、新たに記録されたスプレッドシートの内容から自動的にメールの下書きを作成する GAS を作ってみました。

簡単なものですがけっこう便利で、これぞ GAS の本領といった気がします。

数か月ほど運用していますが今のところ問題なく稼働しており、とても快適です。時間の節約にもなりますね。バックオフィス業務は圧縮あるのみです。

ちなみに、備考等の内容に対して返事を書く場合もあるため一旦下書きにしていますが、そういうものがなければもちろん即送信もできます。万が一のエラーがちょっとこわいですけど。


以下、ホダ木の注文フォームを例とした作り方になります。

元となるフォームがこちらになります。



そして、作成されるメールの下書きのサンプルがこちら。


注文数と割引から合計金額の計算もしてしまいます。こういうのは人手でやっているとどうしてもミスがあり得ますからこわいです。


スクリプトは、ファームの回答先のスプレッドシートの拡張機能から作成します。

コードのサンプルは次の通りです。
function createDraft() {
  Utilities.sleep(3000);

  const sp = SpreadsheetApp.openById("スプレッドシート ID");
  const sh = sp.getSheetByName("フォームの回答 1");
  let lastRow = sh.getLastRow();

  let furu = sh.getRange(lastRow, 3).getValue(); //古ホダ本数
  let shin = sh.getRange(lastRow, 4).getValue(); //新ホダ本数
  let depo = sh.getRange(lastRow, 5).getValue(); //割引
  let deli = sh.getRange(lastRow, 6).getValue(); //受け渡し
  let paym = sh.getRange(lastRow, 8).getValue(); //支払い方法
  let flnm = sh.getRange(lastRow, 10).getValue(); //お名前
  let mail = sh.getRange(lastRow, 12).getValue(); //メール

  let recipient = mail; //宛先
  let subject = "ホダ木 ご注文ありがとうございます。"; //タイトル

  //本文
  let body = flnm + "様\n\nホダ木のご注文ありがとうございます。\n\n以下の通りご注文を承りました。\nご確認ください。\n\n";
  body = body + deli + "\n" + paym + "\n\n";
  if(furu != "") {
    body = body + "古ホダ木(コナラ) 550円 " + furu + "本 " + (550 * furu) + "円\n";
  }
  if(depo != "") {
    body = body + "割引 -50円 " + depo + "本 -" + (50 * depo) + "円\n";
  }
  if(shin != "") {
    body = body + "新ホダ木(コナラ) 2750円 " + shin + "本 " + (2750 * shin) + "円\n";
  }
  body = body + "--------------------\n合計 " + ((550 * furu) - (50 * depo) + (2750 * shin)) + "円(税込)";
  if(paym == "銀行振込") {
    body = body + "\n\nご確認の上、下記振込先までご入金をお願い致します。\n\n<振込先>\n〇〇銀行\n△△支店(203)\n普通 1234567\n名義";
  }
  body = body + "\n\n***文章***\n\nどうぞ宜しくお願い致します。\n\n署名";
  //オプション
  let options ={
    from: "送信元メールアドレス",
    name: "送信者名"
  };

  GmailApp.createDraft(recipient,subject,body,options);
}

4行目の「スプレッドシート ID」と38、39行目の「送信元メールアドレス」、「送信者名」は書き換えてください。本文は適宜変更を。

トリガーは、イベントのソースを「スプレッドシートから」、イベントの種類を「フォーム送信時」に設定します。

データのやりとりがもたついた時のために、Utilities.sleep(3000) を関数の最初に入れています。


詳解! Google Apps Script完全入門 [第3版]
詳解! Google Apps Script完全入門 [第3版]

by SimpleImageLink


農業を取り巻く環境もだいぶハードになっています。小さな改善の取り組みを積み重ねていきたいですね。


Twitter (@nkkmd) 日々更新中です。

2022年10月26日水曜日

Python で直前の特定の曜日の日付を取得する

Python で直前の特定の曜日の日付を取得したいことがあったのですが、結局必要なくなり使わなかったので備忘録として。

import datetime

# 直前の水曜日の日付を取得
week = [-5, -6, 0, -1, -2, -3, -4]
today = datetime.date.today()
weekday = today.weekday()
reduce_days = week[weekday]
date = today + datetime.timedelta(reduce_days)
date = datetime.datetime.strftime(date, '%Y-%m-%d')

weekday() で曜日を取得(月曜日が0で、日曜日が6)して、配列に当てて目的の曜日まで日数を引いています。

上のコードであれば直前の水曜日の日付を取得します。実行が水曜日であれば当日になります。

水曜日に実行した際にひとつ前の水曜日を取得したければ次のようになります。

week = [-5, -6, -7, -1, -2, -3, -4]

違う曜日を取得するには配列の数字をずらします。例えば、月曜日を取得したい場合は次のようになります(実行が月曜日なら当日)。

week = [0, -1, -2, -3, -4, -5, -6]

曜日で何かやる場合、ここからの変形でいろいろ作れそうです。


ブログに書いておくと後から探しやすいし、(少なくとも自分にとっては)読解しやすいのでいいですね。



昨日は夕焼けがきれいでした。

ハウスのビニールを張り替えてからだいぶ経つので、ところどころダメージが目立ちはじめました。ごまかしごまかしあと数年使えればと思っていますが……果たして。

ここからどこまで使えるかが、小さな経営の勝負所でございます。


Twitter (@nkkmd) 日々更新中です。

2022年10月24日月曜日

徒然じゃない日々(19)

先日、来年の肥料の注文をしたのですが、本当に価格が上がり過ぎていてびっくりです。

その他資材や燃料等も相当高騰しているとのことですが、これはどこかで落ち着くものなのでしょうかね。

恒久的なものだとしたら、しっかり売価に転嫁していけるのか。タイムラグをしのげるだけの体力はあるのか。自身の農業のやり方を改めて考える良い機会かもしれません。

また、経営の肝とも言える適正規模の見極めが非常に難しくなっているように感じています。下手に大きくやれば疲弊、小さくやればジリ貧。なかなか塩梅の難しいところです。

まぁ、今の状況が全くの青天の霹靂かと言われると、早かれ遅かれいつかは訪れたであろうものという気もします。

産業としての日本の農業の行く末はさておき、われわれ農家は時代に適応しながら生き抜くしかありません。

まさに、映画『怒りの葡萄』のセリフにあるように「民衆は死なない。しぶとく生きていく。民衆だからね」でございます。


***

今年はちょっと早めにあしかがフラワーパークのイルミネーションに行ってきました。

あしかがフラワーパーク イルミネーション

あしかがフラワーパーク イルミネーション

あしかがフラワーパーク イルミネーション

あしかがフラワーパーク イルミネーション

あしかがフラワーパーク イルミネーション

あしかがフラワーパーク イルミネーション

あしかがフラワーパーク イルミネーション

凍えることなく観れて、かつまだ花もあってとっても素敵でした。

田んぼのイノシシ避けもこんな風にできたらなぁ(笑)。

ゆったりと歩けたので、人もまだ最盛期よりはだいぶ少ないですね。おすすめです。


最近見つけた面白そうな本2冊。

イベリコ豚を買いに (小学館文庫)
イベリコ豚を買いに (小学館文庫)

by SimpleImageLink

早稲田古本劇場
早稲田古本劇場

by SimpleImageLink


Twitter (@nkkmd) 日々更新中です。

2022年10月15日土曜日

【定期】家計の見直し(2022年10月)

少し間が空きましたが、家計の見直しです。

経営と家計が一体化した家族農業では、家計の最適化が心強い生存基盤になります。また、家族や自身にとって本当に価値あるものが何なのか確認する良い機会になります。

物価高騰を実感することが身の回りで多くなってきました。早め早めにできる限りの対策を取っていきたいところです。


・電力会社を東北電力に変更


電力自由化後、いろいろと新電力を試しまして一番使用量の多いメインの契約はUQでんき(auでんき)に落ち着いていました。(このブログに変遷が記録してあります)

しかしながら、燃料費調整制度の上限撤廃がなされるとのことで、再び東北電力の従量電灯Bに戻しました。規制料金である従量電灯Bであればひとまず上限設定があります。それも見直すかもとのニュースがあったので、いずれは……という話ではあるのでしょうけど。

支払いにあたっては、エポスカードゴールドで選べるポイントアップショップに東北電力を指定しておけば1.5%のポイントが付きます。

-----
・追記(2022-10-30)
東北電力より、小売規制料金の値上げの認可申請を準備とのプレスリリースが出ていましたね。早かったですね……。
-----

使用量の少ない他3つの契約は楽天でんきになっており、同様に電気料金の値上げや燃料費調整単価から市場価格調整単価への変更がなされます。ただこちらは、ざっくりの見積もりの結果、今のところまだ基本料金なし効果の方が大きそう、もしくは同じくらいということでひとまず様子見中です。まぁ、市場価格調整単価がめちゃくちゃ上がった場合は…。


図解入門ビジネス 最新電力システムの基本と仕組みがよ~くわかる本[第3版] (How-nual図解入門ビジネス)
図解入門ビジネス 最新電力システムの基本と仕組みがよ~くわかる本[第3版] (How-nual図解入門ビジネス)

by SimpleImageLink


ガソリン価格も補助金無しですと1Lあたり200円を超えているということで、この燃料費の高騰は本当に怖いですねぇ。

農業においては、施設での栽培に燃料を使わずに済むのが本当に助かっています。冬の日照時間に恵まれたいわきはありがたいです。


・mineo のマイそく(スタンダード)を契約


ここしばらくスマホは、UQ mobile のくりこしプランS +5Gに、キャンペーンで無料になっている増量オプションⅡを付けてデータ通信容量5GBで使っていました。自宅セット割インターネットコースの割引適用で月額990円(税込)です。

しかし先日、自宅の光回線が止まりまして(物理的な断線)、復旧に少し時間がかかりそうだったので5GBでは厳しいなーと思い、追加で mineo の「マイそく」のスタンダードを契約してみました。


【ダウンロード版】契約事務手数料が無料になるmineoエントリーパッケージ docomo/au/SoftBankの3回線が選べる格安SIMカード
【ダウンロード版】契約事務手数料が無料になるmineoエントリーパッケージ docomo/au/SoftBankの3回線が選べる格安SIMカード

by SimpleImageLink
Amazon エントリーパッケージを購入すると契約事務手数料を節約できます。


マイそくは、月曜から金曜の12〜13時に通信速度が制限される代わりに、通信速度最大1.5Mbpsで無制限に使えるプランです。ただし、3日間で10GB以上利用すると速度制限がかかります。速度制限時は32Kbpsになるので本当に使い物になりません(笑)。こちらも月額990円(税込)で UQ mobile とのデュアル SIM で合計1980円ですね。

普段は mineo で通信を行い、速度制限時のみ UQ mobile に切り替える使い方になります。

テザリングでパソコンも使いましたが、私の使い方では一応ギリギリ問題はなく使えました。調子に乗って光回線の解約も頭をよぎったのですが、とはいえやはり速度の波もあり、ノーストレスに光回線の代替というのは厳しいそうでした。通信速度が最大3Mbpsのプレミアムならあるいは?とさらに(節約)欲を出すも月額2200円(税込)なら光回線で安定した通信できた方がいいかなと結局振り出しに(笑)。

で、無事に光回線も復旧したのですが、だいぶ快適だったのでとりあえずスマホ用にこのまま使うことに。もともと、くりこしプランSからMへの変更も考えていたので料金的には許容範囲かなと。

ちなみに、デュアル SIM とかにせずに素直に基本データ容量のある「マイピタ」を音声通話も付いたタイプで契約した方が若干ながら安くなるのですが、スマホのプランも状況がコロコロ変わるのでとりあえずはこの形でいこうと思います。


いろいろありますが、たくましく生き抜いていきましょう…!


***


今シーズンも本格的な原木椎茸の栽培が始まりました!

どうぞ宜しくお願い致します!




Twitter (@nkkmd) 日々更新中です。

2022年10月11日火曜日

GCP と nginx を利用して無料のロードバランサーを作ってみる(SSL対応)

只今、とてもよわよわしいサーバー(VPS)上で動いている自作の Web API やアプリケーションですが、なんとアクセスが薄っすらと増えてきました。

しかしながらというか、何というか、予算はないので(笑)、サーバーの増強はできません。

そこで、極力コストをかけずに安定運用をする方法をあれこれ思案しまして、結果、Google Cloud (GCP) で提供されている Google Compute Engine (GCE) の無料枠内で nginx 製ロードバランサー兼バックアップサーバーを作って動かしておき、VPS が落ちた際には GCE の方のサーバーにアクセスを振るという形にしてみました。

ざっくりロードバランサー図
ざっくりロードバランサー図


これなら平常時のコストを増やさず、かつ多少なりとも安定的な運用が可能なはず…です、たぶん。

ただ、ネットワークの知識に疎くてよく分かっていなかったのですが、サーバーから外部へのリクエストもロードバランサーの IP アドレスからアクセスしているように振る舞うようで、そうなると市況等 Web API は動かないため、結局 Web API についてはロードバランサーの利用は断念しました。(追記:勘違いでした)

まぁ、Web API については万が一大量のアクセスがあった時にクラウドで律儀に動かれても困るので落ちてくれた方がいいですね(予算的に)。

現状、Web アプリ(最寄りのアメダス)に対してのみロードバランサーが動いています。


***

以下、備忘録がてら簡単なロードバランサーの作成方法です。


GCE を利用して、無料枠内でインスタンスを作成。インスタンスに外部静的アドレスを割り当てます。今回 OS は慣れている Ubuntu を使いました。

合わせてポートの変更やファイアーウォールの設定、必要パッケージのインストール等の下準備もします。この辺のやり方は検索するとたくさん出てくると思いますので割愛。

(このブログですと「Flask + uWSGI + Nginx を使って Web アプリを作る」の【前編】【後編】がある程度参考になるかと思います)

また、ドメインのDNSレコード設定でロードバランサーの外部静的アドレスを A レコードとして登録しておきます。


nginx をインストール。
$ sudo apt update
$ sudo apt install nginx


サーバーブロック構成ファイル apps.conf (ファイル名は任意)を /etc/nginx/sites-available ディレクトリに作成。「SSL証明書」と「秘密鍵」は、あらかじめ /home/ユーザー名/lb/ssl/ ディレクトリに配置しておきます。ディレクトリは適宜作成。
upstream load-balancer {
    server IP アドレス1 max_fails=5 fail_timeout=30s;
    server IP アドレス2 backup;
}

server {
    listen 80 default_server;
    server_name サーバー名(ドメイン名);
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    ssl on;
    server_name サーバー名(ドメイン名);
    ssl_certificate /home/ユーザー名/lb/ssl/letsencrypt12345678.crt;
    ssl_certificate_key  /home/ユーザー名/lb/ssl/letsencrypt12345678.key;

    location / {
        proxy_pass http://load-balancer;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
    }
}

HTTP (80番ポート) へのアクセスは HTTPS (443番ポート) にリダイレクトされます。




apps.conf を /etc/nginx/sites-enabled ディレクトリにリンク。デフォルトの構成ファイルのリンクを削除。(sites-enabled ディレクトリ内のファイルが nginx.conf から読み込まれます)
$ sudo ln -s /etc/nginx/sites-available/apps.conf /etc/nginx/sites-enabled
$ sudo unlink /etc/nginx/sites-enabled/default


nginx を起動。自動起動を有効化。
$ sudo systemctl start nginx
$ sudo systemctl enable nginx


ちなみに、ロードバランサーとサーバー間は 80番ポートでつなぐようにしたので、サーバーの方の nginx の conf ファイルはこんな感じになっています。(Flask + uWSGI + Nginx で Web アプリが動いている想定)
server {
    listen 80;
    server_name サーバー名(ドメイン名);

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/app.sock;
    }
}


ということで、完成です。

ロードバランスの方式にもいろいろあるようですが、今回はサーバー1(VPS)がダメな時にバックアップとしてサーバー2 (GCE) に送信するという形にしました。

まだ作ったばかりなので、ミスの発覚や、どこかで何か問題が発生した場合は追記します。


インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 第2版
インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 第2版

by SimpleImageLink


今回は非常に勉強になりました。やはり、ネットワーク関係はもう少ししっかり知識つけたいですねー。


・広告
Xserver SSL


Twitter (@nkkmd) 日々更新中です。