変更
次のSEを置き換えればよい.
Engine/Content/EditorSounds/Notifications
この調子だとほとんどのエディタリソースを置き換える必要がありそうです.
次のSEを置き換えればよい.
Engine/Content/EditorSounds/Notifications
この調子だとほとんどのエディタリソースを置き換える必要がありそうです.
CI/CD環境の構築が属人化するなら, もう私が扱いやすい環境があればいいのではないか?, ということで脱Jenkinsを行い, ConcourseでどうしてもUE4のビルドを自動化したいです. WSLやWSL上のDockerの構築については省略します.
Jenkinsではだめなのかというと, 扱い辛いからです. よく属人化すると言われますが, その理由を説明した資料を私は知りません. 私のまわりでは次の理由だと思います.
WSLである理由は環境移行が楽かもしれないということです. 今日の企業ではレンタルPCで社員の環境を作ることが多く, ビルドマシンも同じくレンタルPCが多いです. それほど頻繁ではないですが, レンタル期間終了とともに環境移行を強いられます. 以前にWindows上のVM環境にビルド環境を構築して移行を楽にしようと頑張りましたが失敗しました. 原因はファイルシステムのアクセスです. VMからはともかく, CI/CDツール越しではうまくいきませんでした. WSLならもう少し楽になるのでは?
Windows向けビルドしか試していませんが, RunUAT.batが呼び出せれば大体解決しそうです.
まず, コンコースのサーバ・クライアント・ユーティリティを兼ねたバイナリを取得します. このバイナリさえあればDockerは必要ないのですが, DBの構築も面倒なので, このバイナリは鍵生成だけに使います.
$curl -OL https://github.com/concourse/concourse/releases/download/vX.X.X/concou$rse-X.X.X-linux-amd64.tgz
$tar zxvf concourse-X.X.X-linux-amd64.tgz
バイナリを取得できたら鍵を生成します. ポイントはワーカの公開鍵を別名でコピーしている部分です.
$mkdir -p keys/web keys/worker
$./concourse/bin/concourse generate-key -t ssh -f ./tsa_host_key
$./concourse/bin/concourse generate-key -t ssh -f ./worker_key
$cp ./worker_key.pub ./keys/web/authorized_worker_keys
$mv ./tsa_host_key ./keys/web/
$mv ./worker_key ./keys/worker/
$mv ./tsa_host_key.pub ./keys/worker/
$mv ./worker_key.pub ./keys/web/
docker-compose.ymlを作成します.
version: '3'
services:
concourse-db:
image: postgres
container_name: concourse-db
environment:
POSTGRES_DB: concourse
POSTGRES_PASSWORD: concourse_pass
POSTGRES_USER: concourse_user
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./db/postgres:/var/lib/postgresql/data
- ./db/logs:/var/log
concourse:
image: concourse/concourse
container_name: concourse
restart: unless-stopped
command: web
privileged: true
depends_on: [concourse-db]
ports: ["8000:8080", "2222:2222"]
volumes: ["./keys/web:/concourse-keys"]
environment:
CONCOURSE_POSTGRES_HOST: concourse-db
CONCOURSE_POSTGRES_USER: concourse_user
CONCOURSE_POSTGRES_PASSWORD: concourse_pass
CONCOURSE_POSTGRES_DATABASE: concourse
CONCOURSE_EXTERNAL_URL: http://localhost:8000
CONCOURSE_ADD_LOCAL_USER: admin:admin
CONCOURSE_MAIN_TEAM_LOCAL_USER: admin
CONCOURSE_WORKER_BAGGAGECLAIM_DRIVER: overlay
concourse-worker:
image: concourse/concourse
privileged: true
links: [concourse]
depends_on: [concourse]
command: worker
volumes: ["./keys/worker:/concourse-keys"]
environment:
CONCOURSE_TSA_HOST: concourse:2222
これが重要です. WSL上のシェルからなんとかできるかと試行錯誤しましたが, 妥協してWindows上でワーカを動かす方が楽でした. Windows用のconcourseバイナリを取得して起動するだけです.
concourse worker --work-dir ./work --tsa-host localhost:2222 --tsa-public-key ./keys/worker/tsa_host_key.pub --tsa-worker-private-key ./keys/worker/worker_key
targetはサーバに対応します. 1サーバで複数プロジェクトを管理するなら, チームを使用します.
fly -t server_name set-team --team-name project_name --local-user user_name
ログインは, -nでチーム名を指定します.
fly -t server_name login -n project_name -u user_name -p user_pass
最も単純なビルド設定は次のようになります. 結局, バッチファイルに行きついていますが, バッチファイルの引数である程度柔軟にできると思います.
jobs:
- name: build_quickstart
plan:
- task: build
config:
platform: windows
run:
path: cmd.exe
args: ["/c", "chcp 65001 & cd /d ((PROJECT_ROOT)) & call build.bat"]
パラメータ((PROJECT_ROOT))は別のファイルenvironment.ymlで定義しています.
PROJECT_ROOT: "X:/Path to Unreal Project"
パイプライン設定時に-lオプションでパラメータ設定を指定します.
$ fly -t main sp -p build -c build.yml -l environment.yml
build.batも一応書いておきます, environment.batはRunUAT.batのパスを設定しているだけです.
call environment.bat
%UNREAL_RUNUAT% BuildCookRun -project=%~dp0/project.uproject -build -cook -stage -allmap -pak -nop4 -partialgc -platform=Win64 -clientconfig=Development
DockerがiptablesでNATの設定をしようとするが, Debianは別のソフトウェアでNATを設定しているので失敗する, でいいのでしょうか.
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
数年前は使うこともあったのですが, 現代にはふさわしくないと思い使わなくなりました.
他人に強制するつもりはありませんが, 意味のないイディオムだと思います.
GCC 11.0から, LLVM 12.0から, -marchオプションにx86-64用のCPU命令世代指定が追加された.
-march=x86-64-v[234]のように, 命令セットを対象に, ある程度の範囲で絞った世代に分割して指定することができる.
これまで, -march=nativeとしてコンパイルしたCPUに合わせるか, -march=skylakeなどのCPUを固定する方法しかなかった.
CPUベンダとしては, 新CPUごとに新しい命令を追加してアピールしたい. 開発者としては, ある程度古いCPUもサポートしながら, 新しい命令も使いたい. このふたつの間を埋める機能といえます. 開発者が, ある命令セットがどのCPUからサポートしているのか, 把握して管理することは手間がかかります.
| オプション | 有効になる命令 | CPU世代 |
|---|---|---|
| x86-64 | CMOV, CMPXCHG8B, FPU, FXSR, MMX, FXSR, SCE, SSE, SSE2 | Pentium 4 |
| x86-64-v2 | CMPXCHG16B, LAHF-SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3 | Nehalem |
| x86-64-v3 | AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, XSAVE | Haswell |
| x86-64-v4 | AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL | Skylake Xeon |
この文書は, 最低限伝わるのチケットの書き方を, 同僚に身に着けてもらうことを目的にしています. その方法は, 読者が容易に理解できる文書を書くように心がけ, 振り返って改善を継続することです.
チケットはチームの資産です. 常に自分が作成したチケットについて, 内容が読者に理解しやすかったかを振り返り, 次の機会に改善することが重要です. 初めから完璧な文書を作成できる人などいないですし, 誰が書いた文書も常に足りていません. 伝わる文書, 伝わった文書, 伝わったからいいやの文書, それぞれ異なります.
他人が作成した, 理解が難しいチケットを修正してはいけない, という法はありません. より上手くチームが動けるように改善すべきです. 自分が作成したチケットが修正されたなら, それは学ぶ機会に恵まれたということです.
チケットは, タスク管理システムやイシュー管理システムにおける, 一つのタスクやイシューを管理するための一連の情報を言います. チケットの概念の名称はシステムによって異なるため, 読み替えてください.
チケットの文書は読者に内容を理解してもらうためのものです. 自分のToDo用のチケットというものがあるかもしれません. それをチームのシステム上に作成する理由は, 他人が読むことを前提としているはずです. 本当に私的ToDoなら, 自分でシステムを立て, そこに書くべきです. チームの場と私の場を混同してはいけません.
チケットの文書では, ひとつの主題に集中します. そして, ひとつの主題について, 事実や状況といった情報と意見を正確にもれなく簡潔に記述します. 感想などの心情的要素を書きません. 情報の内容は, 主題(文書の目的)と読者の要求によって変わりますが, 意見との区別を明確にします. 事実は, あいまいな表現や主観に依存する形容詞を使わず, できるだけ明確に記述します. 意見は, 事実の上に立ち, 論理的に導き出した結果です. 意見の記述は複数の評価が並立しますが, 読者が記述された事実から評価できる必要があります.
事実と実際に起きた状況だけを正確に記述します. 意見とは言えない, 論理的理由のない憶測は無視されるため書かない方がいいです. 結果的にその憶測が当たったとしても偶然です, タスクの担当者は参考にしていません.
私がよく見る憶測の文章は, 次のようなものです. 憶測に時間を費やす必要はありません, あなたの仕事に時間を使ってください.
× おそらく, 〇〇〇が原因な気がする
事実かどうか確認してから書くようにします.
タスクでは手順を追加することになります. 手順の粒度が大きい場合, 別タスクになることもあります.
たぶん, 〇〇〇の方が有効だと思います. △△△という方法で確認してみます.
イシューでは再現できなかった, 再現のために試行する時間がないこともあると思います. その場合はそのまま書けばいいです.
〇〇〇という手順で, 3/10で再現しました
〇〇〇を試しましたが, 再現できませんでした
再現するかは試していません
会話では, 次のように曖昧な表現を使ってしまった時に修正します.
たぶん, 〇〇〇だと思います. 少し待ってください, 確認します.
その意味や度合いは個人の心情に依存します, 絶対に使わないようにします.
× バーンと表示してほしい
× ビャーと出てくる
× ドーンって感じで
誰でも理解できる言葉を選択します. 一般的にチーム人員は変わるものです. 未来の見知らぬチームメンバが理解できるように書けばいいです. 指しているものが変わる可能性がある言葉, あれ, それ, は絶対に使わないようにします. バージョンを表す, 最新版, 最新の, も使ってはいけません.
余談ですが, 聞き手が理解できないことを解った上で, 特定コミュニティだけで通じる言葉を使う同僚がいます.
英国首相であった, ウィンストン・レナード・スペンサー・チャーチルは ([1],[2],[4]),
われわれの職務を遂行するには大量の書類を読まねばならぬ。その書類のほとんど全てが長すぎる。時間が無駄だし、要点をみつけるのに手間がかかる。同僚諸兄とその部下の方々に、報告書をもっと短くするようにご配意願いたい。
という書簡を部下に送ったそうです. 読解に時間がかかる文書は, 他人に時間を浪費させています.
特に過度な敬語は無駄です. もし, チケットに過度な敬語を使う必要があるならば, チームビルドに失敗しています. チームメンバの関係を修復すべきです.
会話は口頭やチャットツールで行います. その会話の中で決まったこと, 補足すべき事項をチケットにまとめます. チャットツールは記録を保存する目的には向いていません. 会話のやりとりで, 相手が理解した・確認が取れた, と思い込んではいけません.
チケットはチームで解決することについて書きます. 誰か特定の人にお願いするのではなく, 全員で解決するものです.
× タイトル:〇〇〇をお願いします
次の4つを書くといいです, 全てを書く必要はありません.
〇〇〇画面で, △△△したときに
〇〇〇画面で, △△△していたときに
期待される状態
再現手順
参考までに, エンジニアの手順を示します.
最初から誰に対しても厳格にする必要はありません, より良い状態に改善していけばいいだけです.
〇〇〇画面がおかしい
というタイトルのチケットを回されたら, エンジニアが修正すればいいだけです. 時にはチケット上で会話することもあるでしょう. 方法に縛られる必要はありません.
正しく動作することを確認しました. 修正ありがとうございます. クローズします.
Windows用のポータブルなエディタを用意したい.
ミーティング等でノートをとるときなどに使用したい.
Kaoriya版をベースにする.
vim.exe, gvim.exeの不要な方を削除する.
まず, HOMEの設定をしなければいけないため, vimrc_local.vimで設定する.
let $HOME=expand('%:p:h')
_vimrc, _gvimrcをvimrc, gvimrcの後にロードするため, ここに設定を書く.
vimrcに以下を追加
let plugin_autodate_disable = 1
let plugin_cmdex_disable = 1
let plugin_dicwin_disable = 1
let plugin_format_disable = 1
let plugin_hz_ja_disable = 1
let plugin_scrnmode_disable = 1
vimdoc-jaも無効化して, plugins\vimdoc-jaを削除する.
必要なものは手動で行う.
見やすくないがWindows 7が全て駆逐されるまでは,
set guifont=MS_Mincho:h12:cSHIFTJIS
@set GRAPHVIZ_DOT=<path to graphviz>\bin\dot.exe @<path to JDK>\bin\java.exe -jar <path to PlantUML>\plantuml.jar -config config.txt -charset UTF-8 %*
skinparam classArrowFontSize 14 skinparam classAttributeFontSize 14 skinparam classFontSize 16 skinparam classStereotypeFontSize 16 skinparam classAttributeIconSize 0
#vino-preferences で設定起動. 以下のチェックを入れる. [Sharing] Allow other users to view your desktop Allow other users to control your desktop 以下のチェックを外す. [Security] You must confirm each access to this machine
#gsettings set org.gnome.Vino require-encryption falseとする.
#/usr/lib/vino/vino-serverスタートアップに設定しておくと楽.
#apt install ethtool
#ethtool enp1s0
----
Wake-on: d
----
以下のように有効化, 必要なら適当な箇所で有効になるように設定する.
#ethtool -s enp1s0 wol g
----
Wake-on: g
----
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace WakeOnLAN
{
class Program
{
static void Main(string[] args)
{
if(args.Length<2) {
System.Console.WriteLine("Usage: <global ip address> <mac address>");
return;
}
try {
IPAddress globalAddress = null;
if(!IPAddress.TryParse(args[0], out globalAddress)) {
return;
}
PhysicalAddress physicalAddress = PhysicalAddress.Parse(args[1]);
using(MemoryStream memoryStream = new MemoryStream())
using(BinaryWriter binaryWriter = new BinaryWriter(memoryStream))
using(UdpClient client = new UdpClient()) {
for(int i = 0; i<6; ++i) {
binaryWriter.Write((byte)0xFF);
}
byte[] bytes = physicalAddress.GetAddressBytes();
for(int i = 0; i<16; ++i) {
binaryWriter.Write(bytes);
}
binaryWriter.Flush();
byte[] sendData = memoryStream.ToArray();
client.EnableBroadcast = true;
client.Send(sendData, sendData.Length, new IPEndPoint(globalAddress, 0));
client.Close();
}
} catch {
return;
}
}
}
}