仕事が落ち着いた

1年半くらいやっていた仕事がようやく落ち着いたので久々にブログ書くことにした。
いやぁ長かった。ほんとは半年で納品しなければならなかったが、要件定義や基本設計がある程度は終わっているものだと思っていたのだが、全く終わっていなかった。とても疲れてしまった。 さてそんなかんじで1年半くらいITニュースもまともに見てなかったせいで、ここ近年世間がどういう状況なのか疎くなってしまい最近また feedeen を使って覚え直しをしている。

コロナだけど起業社数が今までで最も増えたらしい

就職するより起業したほうがいい時代ってことなのかな,
2021年の新設法人数が最も多い業種は、学術研究,専門・技術サービス業の2万486社(前年比9.2%増)だ。このうち、経営コンサルタント業、純粋持株会社などが含まれる専門サービス業が1万6165社(同8.6%増)で、これらが地域経済の活性化にどう結びつくのか注目すべきだろう

2021年の新設法人数、前年比10.1%増で過去最高(東京商工リサーチ) – Yahoo!ニュース
なるほど、技術系サービス業が増えて生きているらしい。

スタートアップが資金調達しづらくなってきているらしい

たくさんお金を集めて赤字垂れ流しで起業する時代は終わったとのこと。売上が重視される。しかし当たり前のことであり、むしろ今までが良すぎたのかもしれない。

現状

とにかくリカバリが大変、技術力は伸びたけど、それ以外が追いつけていない。ただしばらくは開発で攻めていくつもりではあるが、経営も手ださないといけないなとおもう。

【AOE4】nacika式ルーシ攻略オーダー

最近は週1くらいのペースでエイジオブエンパイア4をやっています。発売日からひたすらルーシをプレイしていて、ある程度自分流の攻略オーダーが確立できてきたので、ここでまとめようと思います。 一応、2022年1月20日の最新アップデートに対応しています。 最新アップデートに対応しています。

世代1

世代1では、まず斥候を1増やします。その後は村人の先生を絶やさないようにします。初めからいる斥候は、羊を集めます。羊を集めながら、鹿のいる場所を見つけて行きます。 2匹目の斥候が生まれたら、すぐに鹿かりに向かわせます。1匹目の斥候は羊を回収して本陣に戻ります。 鹿の群れを、何個か倒せば金がもらえるので、貯まったらすぐに世代に進化します。歴史的建造物は黄金の門を設置します。また歴史的建造物はできるだけ離して設置してください。 守りも意識しつつ基本的には即3目指します。

世代2

世代2でハラスが来る可能性があるため、木がたまってきたら街の中心や歴史的建造物、金脈、森を丸ごとそれぞれ杭柵で囲います。この時に、大きな円ではなく、できるだけ小さな円をそれぞれの場所に設置します。 木に余裕があれば早めに畑に切り替えて良いです。強化要塞は忘れずに伐採場の近くに作ります。 建物は村人のできるだけ近くに杭柵を設置して防御力を上げるイメージです。その中に木造要塞も何個か立てておきます。この状態でできるだけ早く世代3に進化します。歴史的建造物は三位一体修道院を選択します。

世代3

世代3では、すぐに三位一体修道院から僧兵を3体作成し、すぐに聖遺物を取りに行きます。世代2の進化を急がないと、割と取られるので注意。回収が終わったら聖地を取っておきます。 世代3で、一気に弓兵育成所を6個くらい作ります。少しずつ増やして良いです。そしてすぐに弓騎兵を大量作成しておきます。 鉄工所でのアップデートを忘れないようにします。 もしここで攻める場合は、杭柵で前線を押し上げます。完全に囲わなくても、コストの高い強化要塞代わりになるので大変便利です。ルーシは強化要塞がとにかくコスト高いのでタワーラッシュに向きません。杭柵を使って敵が攻めてくる場所のコントロールをします。例えば杭柵を扇状に設置して段々と入り口を狭めるのもありです。ただ世代3が長引くと、相手が先に世代4入りされると勝ち目がなくなるので早めに世代4にいきます。 世代4への歴史的建造物は、大武器庫を選択します。

世代4

進化したら、すぐに大学を設置し、火矢の研究、弓騎兵のアップグレード、鉄工所アップグレードを行います。弓騎兵の火力がとても重要です。 弓騎兵が100体〜120体くらい作成、遠投投石機を10作成します。大武器庫の攻囲要員訓練も忘れずに行います。 まずは弓騎兵を少し敵陣へ向かわせ偵察します。敵がいれば弓騎兵をぶつけて引き打ちします。アップデートで攻撃速度が遅くなったので基本逃げて打つを繰り返した方がいいです。弓関係を全てをアップグレードしていれば大量に束になった中国の一窩蜂と擲弾兵以外は倒せます。とにかく範囲攻撃に弱いので、コントロール重要です。 ある程度敵ユニットを倒せたら、遠投投石機で相手の石壁を壊します。すると遠投投石機を壊そうとたくさんのユニットがやってくるので弓騎兵でどんどん倒します。 このタイミングで弓騎兵の生成は止めないようにしてください。村人90、弓騎兵100、遠投投石機10というバランスでゆっくり攻めます。 内政は余裕があれば杭柵で小さく囲いまくってください。裏を抜かれて間に合わないことがあります。杭柵があれば、弓騎兵が間に合います。

やらなくて良いこと

以下はルーシでやっててあんまり強くないなと感じたやり方です。

狩猟小屋を森に作りまくる

操作量や狩猟小屋コストの割には回収できる金が少なかったです。動物を狩る操作も時間がかかります。そして弓騎兵ラッシュでは金が不要なので必要性がありません。普通に金を採掘したり聖遺物や聖地で間に合います。

動物を狩ること

これも上と同じ理由です。世代1進化の時だけで良いです。

タワーラッシュ

ルーシはとにかく木を使うので、コストの高い木造要塞を立てまくると後半うごけなくなってしまいます。

石を掘ること

TC2するときも黄金の門で石が買えるのでとにかく不要です。村人は畑と木こりに専念します。

スプリンガルドを作ること

スプリンガルド100体作ったら強いんじゃないかと思ってた時が私にもありました。最長の射程ではあるものの高コスト、足が遅く逃げられない、すぐに壊されるということでフルアップグレードした弓騎兵のほうが使いやすい場面が多すぎました。仲間に石壁作ってもらって中から撃つなら良いかもしれないですが攻めるのは無理そうです。

おすすめ操作

攻撃ユニットを全て選択

shift + ctrl + C で攻撃ユニットを全て選択できます。これで弓騎兵を一気に選択できます。これがめちゃくちゃ強いです。どんな逃げる敵も追いかけてすぐにたおせます。逃げて打つを繰り返すことで、攻撃速度のデメリットを回避し高火力で安全に倒せます。 敵に範囲攻撃ができるユニットがいたらうまくコントロールして倒してください。1つずつ倒すと良いです。怖いのが範囲攻撃ユニットが壁に登られると勝ち目ないです。射程が伸びて太刀打ちできなくなります。そういうときは遠投投石機でどんどん石壁を壊します。意外と石壁に登ると射程が伸びることを知らない人は多いです。ルーシは石壁がないので羨ましい。

F1で弓騎兵大量生産

F1押すだけで弓騎兵が大量に作れます。コントロール量少なく楽にできます。木材と食料が尽きるまでキーを長押しします。200人になっても必ずキューを貯めておいてください。

遠投投石機を囮に使う

弓騎兵は石壁が壊せないのでこれ一択です。射程は正義。操作はShift+ctrl+Cを押してからTABキーでユニットを切り替えます。間違って弓騎兵と遠投投石機を同時に動かしてしまうことがよくあります。 遠投投石機の前には、杭柵を何重にも置いておくと弓騎兵で無双できます。

最後に

ルーシで強いユニットってストレイツォだと思ってたんですよ。でも最近のアプデで弓騎兵のほうに調整が入ったので、弓騎兵のほうだったのかもと気付きました。ストレイツィオのオーダーもあるとおもいますが、金策のために市場を維持させる必要があったり射程が短かったりでうまくいきませんでした。ストレイツォを石壁に乗せたら最強だと思うので仲間に石壁がある場合はいいかもしれません。
カテゴリー: AOE4

ブログを新しいサーバーに引っ越した。

自宅サーバーで4年くらい使っているサーバーから、ついに新自宅サーバーを購入して引っ越しました。
最近は3万円台のパソコンでも省エネでCore i5、メモリ8GBもあるパソコンが購入できるのでかなりいい時代になりました。 購入したのは、CHUWIのCoreBox。
ミニサイズながらも、 USB3.0 が2個もあるのでRAID 1も構築できます。

AWS Lambda で Rustを使ってみた話

この記事は、nacika.com Rust記事 アドベントカレンダー Advent Calendar 2018 – Adventar 二日目の記事です。

AWS LambdaでRustを使う方法はほぼ、<a href=”https://dev.classmethod.jp/cloud/aws/custom-runtime-rust/” title=”AWS LambdaのCustom RuntimeでRustを実行してみた #reinvent | DevelopersIO target=”_blank”>AWS LambdaのCustom RuntimeでRustを実行してみた #reinvent | DevelopersIO こちらや Rust Runtime for AWS Lambda | AWS Open Source Blog こちらの記事の通りに作ると簡単につくれます。

手順はもうあるので、作ってみた感想などを書いていこうと思います。

ランタイム is 何処

ランタイムは、AWSが用意しているというよりはcreateとして提供されているようです。
Cargo.toml にある lambda_runtime = "^0.1" というのがそれですね。

main.rsの編集だけで終わる

びっくりしたのが、main.rsに一通りの処理を書くだけですぐに使える所。内部的にはLambda用のリクエストを受け付ける処理があるようですが全てランタイムがやってくれます。便利。
そのため、こちらでやることはハンドラを書くことくらい。

必要なイベントを型で受け取る

#[derive(Deserialize, Clone)]
struct CustomEvent { #[serde(rename = "text")] text: String, #[serde(rename = "is_decode")] is_decode: bool
}

serde(rename = "text") が実際のイベント名、下にあるのが型のフィールド。
イベントがそのまま型で来るのでそこから取ってくればOK。falseやtrueがboolで処理してくれるのも地味に嬉しい。(オプション型は試せていない)

気をつける所

Cargo.tomlの

[[bin]]
name = "bootstrap"

この部分、buildされたバイナリのファイル名がbootstrapじゃないとエラーになる。

実行時間

最安プランになっている様子。これ以上高速化しても安くならない・・?

この開発によって作ったもの

モコあきさんが2001年にリリースしたWindowsアプリのロリコンバータをリメイクしたものを作りました
https://nacika.com/loliconv/

カテゴリー: Rust

actixを試す

この記事は nacika.com Rust記事 アドベントカレンダー Advent Calendar 2018 – Adventar の1日目の記事です。
日付跨いじゃってるけど・・・。

早速、actix/actix: Actor framework for Rust を試しました。

nacika-ins/actix-sample

使った感じ

現状だと、特に各アクターでスレッドを作ってくれるわけではないようで、どこかのアクターでloopを書いたりしてスレッドを専有してしまうと、他のアクターの処理が止まる。
panic!を書けばプロセスは落ちるし、エラーが発生してもプロセスごと落ちる。

impl Superviseddef restarting というメソッドがあり、エラーがあると呼ばれてリスタートするらしいんだけど、呼ばれない。。

メリットがありそうなところ

  • 耐障害性は、スレッドを作ってあげて処理すればなんとかなりそう。do_sendや、sendなどのメソッドは #[derive(Message)] をつけたものを送ればいいだけなので、複雑な所有権をあまり考えずに使えそうなところがよさそう。
  • スレッドループからもメッセージを送ることができるのでいい感じ。
  • アクターの変数も、メッセージ自体もミュータブルにすることができる。

今後使うか

正直、Rust言語の複雑な部分をActorでまとめることができてコード自体も簡潔にかける部分が良いので、今後使っていきたい。

カテゴリー: Rust

docker-ceがUbuntu16.04.2 LTSに入らないとき

wget http://launchpadlibrarian.net/236916213/libltdl7_2.4.6-0.1_amd64.deb
sudo dpkg -i libltdl7_2.4.6-0.1_amd64.deb
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt-get update
sudo apt-get install docker-ce

これでいいみたい。外部のdebパッケージ入れてるみたいなので取扱要注意。

参考とソース元:
ubuntu16.04 安装docker-ce,解决libltdl7版本过低的问题。 – 简书
docker-ce : Depends: libseccomp2 (>= 2.3.0) but 2.2.3-3ubuntu3 is to be installed

起動中のDockerコンテナ内にホストのDNSサーバーを登録する

基本的に異なるDockerコンテナ内でDNSサーバを使う場合は、こちらに書かれているように –link や –dns を使うとよいでしょう。

もしも、この–linkや–dnsを設定し忘れたりした場合に簡単にDNSサーバーを登録する方法をご紹介します。

docker ps -q | xargs -I{} docker exec -i {} sh -c 'echo "nameserver (ここにDNSサーバのIP)" >> /etc/resolv.conf'

はい、お疲れ様でした。
DNSサーバに関してはこちらがおすすめです。

dnsmasqで始めるプライベートDNSサーバ – GeekFactory

なんと! Dockerホストに入れさえすれば、ホストの /etc/hostsを見てくれるようになります。

AWS Lightsail向けのマストドン構築用Ansibleレシピ作ったよ

AWS LightsailというVPS

最近コスパがすごくよくて、立ち上げも簡単なAWS LightsailというVPSがあります。
AWSアカウントがあれば、めんどうなロードバランサの設定やVPCの設定、固定IPの発行も楽に行うことが出来ます。

Ansibleスクリプト

スクリプトはこちらです。

https://github.com/nacika-ins/ansible-mastodon-amznlinux

localhost用になっているので、Lightsail内で実行してみてください。
Amazon Linux 2018.03.0 に対応しています。

途中、certbotの設定などでスクリプトがとまることがあるので、そのときは手動実行をします。

[v2.5.2対応] Macでマストドンの開発環境構築

参考: Vagrant や Docker を使わずに macOS でマストドンの開発環境を構築する – Qiita

まずは開発ガイドラインを読もう

マストドン公式 開発ガイドライン
https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Development-guide.md

.env.productionの修正

マストドンのソースが手元にある状態にしてまず最初にやるのがこのファイルの編集です。
下記の部分を変更していきます。

LOCAL_DOMAIN

localhost:3000

SECRET_KEY_BASE と OTP_SECRET

docker-compose run --rm -e RAILS_ENV=production web bundle exec rake secret

を二回叩いてちゃちゃっと設定します。

VAPID_PRIVATE_KEY と VAPID_PUBLIC_KEY

docker-compose run --rm web rake mastodon:webpush:generate_vapid_key

を一度だけ実行してコピペして貼り付けます。

SINGLE_USER_MODE

おひとりさまインスタンスにしたいときは

SINGLE_USER_MODE=true

複数アカウント作りたいときは

SINGLE_USER_MODE=false

にします。

アカウント新規作成画面やログイン画面にアクセスしようとするとID1番のユーザーのページに飛ぶ挙動になります。

DEFAULT_LOCALE

ja

日本語を使うので日本にします。

SMTP関係

SMTP_SERVER=localhost
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=notifications@example.com

使わないのでこうします。

compileをwebpacker-dev-server経由にする

sed -i 's/compile: true/compile: false/' config/webpacker.yml

rubyのインストール

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
# 一度ここでシェルをログインし直す
cd ~/ws/mastodon
RUBY_VERSION=`cat .ruby-version`
echo $RUBY_VERSION
rbenv install $RUBY_VERSION
rbenv rehash
rbenv global $RUBY_VERSION
ruby -v

yarnのインストール

npm i -g n
n stable
npm -v
node -v
npm i -g yarn # brew install yarn でも良いかも

必要ライブラリのインストール

brew install autoconf ffmpeg gcc gdbm imagemagick libffi libidn libxml2 libxslt libyaml openssl pkg-config protobuf readline postgresql

ライブラリを個別インストール

CUR_RUBY_VERSION=`rbenv version | awk '{print $1}'`
echo $CUR_RUBY_VERSION
IDN_VERSION=`idn --version | head -n 1 | awk '{print $4}'`
echo $IDN_VERSION
NOKOGIRI_VERSION=`grep nokogiri Gemfile | egrep -ioh '[0-9\.]+'`
echo NOKOGIRI_VERSION
gem install nokogiri -v "$NOKOGIRI_VERSION" -- --use-system-libraries --with-xml2-include=/usr/local/opt/libxml2/include/libxml2
gem install idn-ruby -- --with-idn-dir=/usr/local/Cellar/libidn/$IDN_VERSION
## cld3のインストールがうまくいかないときは https://github.com/akihikodaki/cld3-ruby#openbsd こちらを試す
gem install cld3

postgres初期化と起動

pg_ctl -D /usr/local/var/postgres start
initdb /usr/local/var/postgres -E utf8
brew services start postgresql

yarn install

yarn install

db:migrate

RAILS_ENV=development rake db:migrate

bundle install

gem install bundler
rbenv rehash
bundle install

高確率でcld3がエラーとなる。こちらを試そう。

install redis

brew install redis
brew services start redis

Railsサーバー起動

RAILS_ENV=development bundle exec rails server

Webpackサーバー起動

RAILS_ENV=development NODE_ENV=development ./bin/webpack-dev-server --listen-host 0.0.0.0

sidekiq 起動

env PORT=3000 RAILS_ENV=development bundle exec sidekiq

streaming 起動

env PORT=4000 NODE_ENV=development RAILS_ENV=development yarn run start

admin作成

> 管理画面からアカウントを作成する
RAILS_ENV=development rails mastodon:confirm_email USER_EMAIL=admin@example.com
RAILS_ENV=development rails mastodon:make_admin USERNAME=admin
RAILS_ENV=development rails mastodon:confirm_email USER_EMAIL=guest@example.com
RAILS_ENV=development rails mastodon:make_admin USERNAME=guest

Macの開発環境でcld3-rubyがコンパイルできない時の対処法

Mastodonでは、 cld3-rubyをがっつり使っているために、これがないとまともに動かない。
実はこの対処方法、公式に載っている。

"pkg-config --exists protobuf"
| pkg-config --libs protobuf
=> "-L/usr/local/Cellar/protobuf/3.6.1/lib -lprotobuf -pthread\n"
"clang -o conftest -I/Users/user/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-darwin17 -I/Users/user/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/Users/user/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/Users/user/.rbenv/versions/2.5.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -O3 -Wno-error=shorten-64-to-32 -pipe conftest.c -L. -L/Users/user/.rbenv/versions/2.5.1/lib -L. -L/Users/user/.rbenv/versions/2.5.1/lib -fstack-protector -L/usr/local/lib -lruby.2.5.1-static -framework Foundation -lpthread -ldl -lobjc "
ld: warning: text-based stub file /System/Library/Frameworks//Foundation.framework/Foundation.tbd and library file /System/Library/Frameworks//Foundation.framework/Foundation are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks//CoreFoundation.framework/Versions/A/CoreFoundation.tbd and library file /System/Library/Frameworks//CoreFoundation.framework/Versions/A/CoreFoundation are out of sync. Falling back to library file for linking.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5: return 0;
6: }
/* end */
"clang -o conftest -I/Users/user/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-darwin17 -I/Users/user/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/Users/user/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/Users/user/.rbenv/versions/2.5.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -O3 -Wno-error=shorten-64-to-32 -pipe conftest.c -L. -L/Users/user/.rbenv/versions/2.5.1/lib -L. -L/Users/user/.rbenv/versions/2.5.1/lib -fstack-protector -L/usr/local/lib -lruby.2.5.1-static -framework Foundation -L/usr/local/Cellar/protobuf/3.6.1/lib -lprotobuf -pthread -lpthread -ldl -lobjc "
ld: warning: text-based stub file /System/Library/Frameworks//Foundation.framework/Foundation.tbd and library file /System/Library/Frameworks//Foundation.framework/Foundation are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks//CoreFoundation.framework/Versions/A/CoreFoundation.tbd and library file /System/Library/Frameworks//CoreFoundation.framework/Versions/A/CoreFoundation are out of sync. Falling back to library file for linking.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5: return 0;
6: }
/* end */
| pkg-config --cflags-only-I protobuf
=> "-I/usr/local/Cellar/protobuf/3.6.1/include\n"
| pkg-config --cflags-only-other protobuf
=> "-pthread\n"
| pkg-config --libs-only-l protobuf
=> "-lprotobuf\n"
package configuration for protobuf
cflags: -pthread
ldflags: -L/usr/local/Cellar/protobuf/3.6.1/lib -pthread
libs: -lprotobuf

公式リポジトリに書いてあった

これをやるだけでした。