社会人になって1年が経ちました。

どうも~

f:id:circus7:20210404163807j:plain
私です。

情報系の知識が冗談抜きで0なのに、なぜかゲーム会社でプログラマやってます。

社会人一年目で何考えて何してどうだったか書きます。 完全に自分の忘備録なので殴り書きです。

1年目の気持ちなんて忘れるので今後教育する立場になったときのためにメモを取る。

この記事です。

一年目の立場に甘えてラインを探る

1年目なので、注意されやすい(はず)なので、温度感とか、ラインが微妙なところはまあまあ上司の見えるところで自分の思うようにやりました。因みに3回ぐらい怒られました。あと面談でずけずけと会社のことを聞きまくったりしました。ベテランになったらレッテルだけ張られてスルーされそうなのであと2年は常識の範囲内で好き勝手やるつもりです。

体のデバッグに半年以上費やした

睡眠時間何時間まで削れるかとか、酒飲んでも大丈夫かとかをずっと調査してました。 あとは死ぬほど眠い理由が肩こりだったりだとか、残業は一日おきにした方が、疲労がたまらないので効率がいいだとかペースを頑張ってつかもうとしました。 他にも大学生時代は春先ニートしてたので実は三寒四温で死ぬほど体調を崩しやすいなどが発覚したりしました。

同期は大切にする

PGの同期が5人で、まあタイトル配属になっちゃったので一年通して交流してたのは一人だけなんですけど、一人いるかいないかで滅茶苦茶心持ちが変わります。よっぽど嫌じゃない限り同期とは交流をして仲良くなっていたほうがいいです。多分。あと、仕事のやばい話とかも聞けて面白いし、同期だと気軽に聞けるので定期的にお話しするのをお勧めします。自分はコミュ障なので自分から聞きに行くことはできませんが...。

報連相を完璧にするのは無理

これガチなんですけど、自分はホウレンソウうまいと思ってました。が、実際そんなことなかったです。
頻度とタイミングを見計らってたら先に向こうから確認が来たり、遅れそうなタスクを「まだいける...」と頑張った結果遅れたり、あり得ないぐらいタスクを並列進行してたら漏れてたなどがあります。全部飛んできた瞬間にメモを取るようにしたら、あまり漏れなくなりました。(それでもたまに漏れる)

会社の組織、制度を理解する

研修中はまあまあ余裕があったので、社内ページを徘徊してました。多分同期で一番会社に詳しいと思います。あと緊急時(体調不良や電車遅延など)の会社への連絡方法は割と早めにメモっとくとよいかもし出ません。

自分が3、5、10年後になるべき上司を探す

何かで見たのでその通りにしました。正直これは配属運が結構あると思います。見つかると、自分に足りないものがかなり明確にわかるのでお勧めです。

他のセクションの仕事もできるだけ見る

業種がアレなので若干汎用性があるかはわかりませんが、関係するセクションの仕事内容はおおむね把握しておいた方がなんかあったとき楽です。自分は後ろの同期のセクションの内容を逐一聞いて把握してます。

されてうれしかったこと

研修で一通り必要な技術を教えてくれたのはかなり良かったです。自分はエセプログラマーなので知識0でしたが、おかげで何とかなりました。
あとはプロジェクトにアサインされたとき、取りあえず検証タスクを振られたのは本当に助かりました。コードも読んで実装手段の大まかな検討をつけるのですが、いきなりアサインされて「ハイ実装してね」といわれるよりは、読むだけでよかったりするのでスムーズに入ることができました。
後これは運なのですが、上司がコードレビューを毎回してくれるのは本当に助かりました。理由付きでレビューしてくれるのでありがたかったです。
あと新人はみんな死ぬほど目をかけてもらっていて、結構ケツ吹いてもらえるので取りあえず目の前のことに集中できるのは本当に助かってます。余裕が出たら、今拾ってもらっているところも自分でできるようにしたい。
あと上司がクソ休むのも助かりました。めっちゃ休みがとりやすい。これは完全に社風なんだろうけど。

こうしてほしかったこと

新人研修1か月は短い。せっかく仲良くなりかけてたのに、研修が終わってしまって各タイトルにアサインされてしまったので辛かった。まあ平常時はもうちょっと長いらしいので、コロナだから仕方ない部分もあります。
あと他セクションの同期との交流もほぼ無いです。仕事でコミュニケーションをとることはまあまあありますが、それ以外で~ってなるとほぼ無いです。まあ日報自由に書いていいので日報でコミュニケーション取ればいいんですけど、コミュ障なのでそれはとても難しい...。

他人の仕事を見る

上司に飛んでるメンションを盗み見したり、他の人との会話などは聞き耳たてたりします。普通に情報の幅が広がるので、「そういえばこういう話ありましたよ」と仕事の話が進みやすかったりします。
どの人がどのぐらいの仕事を任されていてこなしているかも、将来的な指標になります。あと、個人的に将来PMやりたい~と思っているので、どの人がどのぐらいのタスクをしてるのかは見といたほうがいいなってのもあります。

タスクに対して考える癖をつける

これは完全に職業的なあれですが、オワ実装みたいなのが降ってきたとき、自分が上の立場になって同じ辛さを味合わせないために「これなんでこうなったんだろ...」というのは考えるようにしてます。逆に死ぬほど楽な実装はなんで楽なのかも考えるようにしてます。プロジェクト終わったらリーダーに直で聞くと思いますが。

同じミスは二度としない

これはマジで一番大事にしてます。かなり色々目をかけて頂いてて、逐一注意もらったりしてるので、同じことで突っ込まれないようにはしてます。まあ同じミスしなくても死ぬほど突っ込まれるのですが。

完全に個人的なこと

アセットに一貫性がないのをやめてほしい。多分デザイナーとプログラマ間のすり合わせがうまく行ってないんだと思う。確かにアセット作成のたびにすり合せしてたら時間が取られるので、最初に使うGUIを洗い出して、厳密にルールを作ってほしい。ていうかGUIなんて新しいものほとんどないんだから既存のものは全部洗いだしていいと思う。ぶっちゃけプログラム上で追加仕様を想定していないものは修正できるんだけど、アセットでそれされるとまあまあ頭が痛くなってしまう。ただデザイナーが忙しいのもわかるので、その辺をちゃんと取り決めてほしい。キックオフMTGの前に一日使っていいからプログラムに目を通すのもありなんだけど、3000行超えると流石に時間取られるので何とも言えない。何が正解かはわからない。

終わりに

まあいい会社に入れて頂けたと思います。自分はホワイト企業だと思ってますが、世間一般にはブラック企業らしいです。まあ確かに毎日みんな残業してるしブラックなのかも...。 もしかしてこれが「やりがい搾取」ってやつなんですか...? 取りあえず20年ぐらいは続けるつもりで頑張ります。 最後に好評だった自分の金言で締めたいと思います。 f:id:circus7:20210404164345j:plain
次の自分語り記事はは「初タイトルが終わりました。(仮)」です。ではまたお会いしましょう。

マイクラのマルチサーバー建てた話

バニラで建てたよ!!!

環境!!!!!!!!!!!!!!

CentOS7!!!!!
ConoHa VPS 2GBプラン!!!!!!!!!!!!!!!!!!!!!!!!!!!
Minecraft ver1.14.4!!!

参考サイト様

minecraft.server-memo.net

ConoHaにした理由

いつもはさくらのVPS使ってたんですが、初期費用が高いのと2か月前払いなのが辛いかもな~という理由で、今回は初期費用いらないConoHaにしました。
だって1か月以上マルチサーバー続いたことないし。

初期設定省略!!!

普通にユーザーを追加したり、権限をいじったり、firewallcmdの設定をしたり、sshの設定をしたり、ポートを閉じたり開いたりした

色々入れる

Javaのインストール

sudo yum install java

screenインストール

本当はdockerでやりたかったのですが、帰省が迫ってたのでめんどくさいと思い参考サイトの手順通りにやりました。
また時間空いたらdockerでたてなおしたいです。

sudo yum -y install screen

イクラのサーバーを動かす

ディレクトリ作成

mkdir mcsv
cd mcsv

イクラのサーバーを落とす

wget https://launcher.mojang.com/v1/objects/3dc3d84a581f14691199cf6831b71ed1296a9fdf/server.jar

起動

java -jar server.jar

Windowsと同じく色々生成されてるはずなので

vim eula.txt

eula=trueにする
もっかい起動してみる

java -jar server.jar

ip:25565で接続。

screenで起動してみる

 screen -AmdS minecraft java -Xmx1024M -Xms1024M -jar server.jar nogui

ここコピペガバなので無駄なコマンド多そう。

自動バックアップスクリプト、書くよ!

書くと言ってもコピペなんですけどね

vim backup.sh
#!/bin/bash

SERVICE='server.jar'
USERNAME='hoge'
SCNAME='minecraft'
MC_PATH='/home/hoge/mcsv'
BK_PATH='/home/hoge/bu'

BK_TIME=`date +%Y%m%d-%H%M%S`
BK_NAME="$BK_PATH/mc_backup_full_${BK_TIME}.tar.gz"
BK_GEN="3"

XMX="1024M"
XMS="1024M"


cd $MC_PATH

ME=`whoami`

if [ $ME == $USERNAME ] ; then
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "Full backup start minecraft data..."
      screen -p 0 -S $SCNAME -X eval 'stuff "say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map..."\015'
      sleep 10
      screen -p 0 -S $SCNAME -X eval 'stuff "save-all"\015'
      screen -p 0 -S $SCNAME -X eval 'stuff "stop"\015'
      echo "Stopped minecraft_server"
      echo "Full Backup start ..."
      tar cfvz $BK_NAME $MC_PATH
      sleep 10
      echo "Full Backup compleate!"
      find $BK_PATH -name "mc_backup_full*.tar.gz" -type f -mtime +$BK_GEN -exec rm {} \;
      echo "Starting $SERVICE..."
      screen -AmdS $SCNAME java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui
    else
      echo "$SERVICE was not runnning."
  fi
else
  echo "Please run the $USERNAME user."

find ${BK_PATH} -name "*.tar.gz" -mtime +7 -delete

#cd /home/hoge/bu
#./dropbox_uploader.sh delete bu
#./dropbox_uploader.sh upload /home/hoge/bu/ /bu

権限与える

chmod u+x backup.sh
crontab -e
0 12 * * * ./home/hoge/backup.sh

dropboxにぶん投げる処理は省略、終わり! 次回、spigotにしてdockerでたてたい編

追記

spigotにはしたけどdockerで建てるのはよく考えたら意味がわからんくなったのでなくなった

Dockerで建てたGrowiの自動バックアップをDropboxでとるようにした話

前回

環境

さくらVPS
CentOS7
Docker version 1.13.1
docker-compose version 1.18.0

参考サイト様

おしゃれなMarkdown対応wiki : Growiを構築運用する - Qiita
Growiのバックアップとリカバリの手順 - Qiita
第54回「SORACOM応用編!ラズベリーパイからDropboxへファイルをアップロード(1)Dropbox-Uploader」 | Device Plus - デバプラ
【Dropbox】scriptを使用してのファイル転送処理 - Qiita

バックアップファイルの作成

以下のコマンドでアップロードファイルをバックアップする。

tar -C {Growiセットアップパス} -czf uploads.tar.gz public/uploads

以下のコマンドでデータベースをバックアップする。

# mongodump -d {Growiデータベース名} --gzip --archive=dbdump.gz

バックアップファイルを自動で生成するためのスクリプトを書く

毎日AM7:00にバックアップを取得するスクリプト。バックアップデータは全て1つのアーカイブにまとめる。 このままだとバックアップが溜まる一方になってしまうため、7日前のバックアップを削除するコマンドも実行する。

# cd /usr/local/bin
# vi backup.sh
INSTALL_PATH=/home/tpp/wiki/growi-docker-compose/growi
BACKUP_PATH=/home/tpp/backup
TODAY=`date +"%Y%m%d"`

# Backup
tar -C ${INSTALL_PATH}/public -cf ${BACKUP_PATH}/${TODAY}.tar uploads
mongodump -d growi --gzip --archive=/tmp/dbdump.gz --quiet
tar -C /tmp -uf ${BACKUP_PATH}/${TODAY}.tar dbdump.gz
gzip -f ${BACKUP_PATH}/${TODAY}.tar
rm -fR /tmp/dbdump.gz

# Delete OldBackups
find ${BACKUP_PATH} -name "*.tar.gz" -mtime +7 -delete

上をbackup.shに書き込む

# chmod u+x backup.sh

でbackup.shに権限を与えて

# crontab -e
0 7 * * * /home/tpp/wiki/backup.sh

cronに以上の設定を追加

Dropboxへファイル転送

アップロードしたいディレクトリに移動してスクリプトファイルをDL

curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh

ダウンロードできたら、実行権限を与えて、スクリプトを実行。

chmod +x dropbox_uploader.sh
./dropbox_uploader.sh

めんどくさいから 第54回「SORACOM応用編!ラズベリーパイからDropboxへファイルをアップロード(1)Dropbox-Uploader」 | Device Plus - デバプラ を見て

ファイル転送も自動化

色々書くのめんどくさ、 できたものがこちら!

INSTALL_PATH=/home/tpp/wiki/growi-docker-compose/growi
BACKUP_PATH=/home/tpp/backup
TODAY=`date +"%Y%m%d"`

# Backup
tar -C ${INSTALL_PATH}/public -cf ${BACKUP_PATH}/${TODAY}.tar uploads
mongodump -d growi --gzip --archive=/tmp/dbdump.gz --quiet
tar -C /tmp -uf ${BACKUP_PATH}/${TODAY}.tar dbdump.gz
gzip -f ${BACKUP_PATH}/${TODAY}.tar
rm -fR /tmp/dbdump.gz

# Delete OldBackups
find ${BACKUP_PATH} -name "*.tar.gz" -mtime +7 -delete

cd /home/tpp
./dropbox_uploader.sh delete backup
./dropbox_uploader.sh upload backup backup

追記

INSTALL_PATH=/home/tpp/wiki/growi-docker-compose/growi
BACKUP_PATH=/home/tpp/backup
TODAY=`date +"%Y%m%d"`
TODAY2=`date +"%Y%m%d"+"g"`

# Backup
tar -C ${INSTALL_PATH}/public -cf ${BACKUP_PATH}/${TODAY}.tar uploads
mongodump -d growi --gzip --archive=/tmp/dbdump.gz --quiet
tar -C /tmp -uf ${BACKUP_PATH}/${TODAY}.tar dbdump.gz
gzip -f ${BACKUP_PATH}/${TODAY}.tar
rm -fR /tmp/dbdump.gz

cd /home/tpp
docker run -it --rm --link growidockercompose_mongo_1 --network growidockercompose_default --volume $(pwd):/backup mongo bash -c "mongodump -v --host growidockercompose_mongo_1 --db growi --out /backup"
tar -cvf ${TODAY2}.tar growi
gzip ${TODAY2}.tar
mv /home/tpp/${TODAY2}.tar.gz ${BACKUP_PATH}

# Delete OldBackups
find ${BACKUP_PATH} -name "*.tar.gz" -mtime +7 -delete


cd /home/tpp
./dropbox_uploader.sh delete backup
./dropbox_uploader.sh upload backup backup

記事データのバックアップができてなかったので色々追加しました。
本当は一気にtarでまとめてしまいたかったのですがコマンドオプションがうまく扱えないため死亡。 そもそもまとめる必要ない これに割いてる時間もないので、結果やっつけになりましたがちゃんと取れてはいるのでまあ良しとしましょう。

追記2

そもそもこれじゃバックアップできてないらしい(自分は出来てると思うんだけど試すのがめんどくさい) mongodbのリストア機能を使って別のバックアップ用コンテナ作ってごちゃごちゃやらんといけんらしいです が、めんどくさいのであとは後輩に任せることにします

DockerでGrowiを建てた話

環境

さくらVPS
CentOS7

参考サイト様

CentOS7.5にGrowiをインストール - Qiita
GrowiをDockerでたてる - Qiita

とりあえずポート開放

なんか3000番使ってる人が多かったので脳死で3000を開放

$ firewall-cmd --add-port=3000/tcp --zone=public --permanent

firewall-cmdファイヤーウォール周りをいじいじするためのコマンドです
詳しくはリファレンスを読めば... と調べたんですけど公式のリファレンス的なのないんですね(Linux noob)
第5章 ファイアウォールの使用 - Red Hat Customer Portal
Red Hatのなら信頼できるやろ、ということでこれを読めばいいと思います。

Growiの前提諸々の導入

「root権限でやっちゃえるとこは最初にやっちゃおうぜ、sudo一々つけるのめんどいし」 と、この前提導入までの作業を全てrootで行っています。セキュリティ的にいいのか悪いのかはわかりません。
設定いじれやって話なんですけども。

MongoDBをインストール

もんごもんご!

$ vim /etc/yum.repos.d/mongodb-org-3.4.repo

yumに?リポジトリを追加します。vimで開いたら MongoDBの公式ドキュメントf:id:circus7:20190413015132p:plain 上記画像の赤く囲ってあるとこをコピペして貼り付けます。 自分のときは

[mongodb-org-4.0] 
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc 

でした。

$ yum install mongodb-org 

インスコyumはパッケージ管理ソフトです。
6.3. Yum と Yum リポジトリの設定 - Red Hat Customer Portal

$ systemctl start mongod.service 

で起動

$ systemctl enable mongod.service

自動起動するようにさせる。

Node.jsとYarnをインストール

Node.jsを入れる

$ curl --location https://rpm.nodesource.com/setup_8.x | bash - 

rpmもパッケージ管理ソフトです、yumとの違いを調べるといいと思います。 インストールすると

## Run `sudo yum install -y nodejs` to install Node.js 8.x LTS Carbon and npm. 
## You may also need development tools to build native addons: 
    sudo yum install gcc-c++ make 
## To install the Yarn package manager, run: 
    curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo 
    sudo yum install yarn

とログが出てくるので##がついてないとこを1行ずつコピペして実行して、必要なものを入れてゆくう。

Docker使って建てる

Docker入れるぜ!

yumに?リポジトリを追加、インストール

$ curl -O https://download.docker.com/linux/centos/docker-ce.repo
$ mv docker-ce.repo /etc/yum.repos.d/
$ yum install docker-ce

起動

$ systemctl start docker

今回はここに建てました

Docker-compose入れるぜ!

いわばDocker管理ソフトみたいなもんです

$ yum install docker-compose

建てるぜ!

Growiのコンテナをクロ~ンするディレクトリをつくって移動してクロ~ンします。

$ mkdir /home/tpp(ユーザーdir)/wiki
$ cd /home/tpp(ユーザーdir)/wiki
$ git clone https://github.com/weseek/growi-docker-compose.git

docker-compose.ymlを編集します。いわばDockerの設定ファイルです。

$ vim growi-docker-compose/docker-compose.yml
version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
#      - 127.0.0.1:3000:3000    # localhost only by default
      - 3000:3000
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
#      - PASSWORD_SEED=changeme
      - PASSWORD_SEED=tpp
      # - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB GridFS rr

サーバーの外からもアクセスできるようにしたいので、127.0.0.1を削除。
これしないとlocalhostになっちゃいます。
PASSWORD_SEEDも適当なものに変更。

$ docker-compose up -d

コンテナ起動。ip:3000で入れたら成功。

追記

monogodbをわざわざ入れてるんですけど、そもそもgrowiに入ってるのでいらないっぽいです

SublimeText3のC++環境メモ

参考ブログ

Sublime Text 3の設定(C++編)

環境

Windows8.1 Pro 64bit

インストール

SublimeText3のインストール

パッケージ管理ソフトを入れる

Package Control

View > Show Console

でコンソール開いて

import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

を打ち込む Preferencesの中にPackage Controlがあるはず
install packageで追加、removeで削除

追加パッケージ

ConvertToUTF8

UTF8に対応させるパッケージ
なんか勝手に入ってたぽいので必要ないかも?
多分デフォのままで大丈夫、問題あれば追記

FireManager

サイドバーは

View > Side Bar

から

とりあえずこんなもんで良さそう 透過とか便利そうなものはあったけどそのときに考える

ビルド環境

コンパイラ設定

mingw使ってgccパスを通すのが下手くそだったので大人しく記事に従う MSYS2 をインストール

ターミナルが起動したら

pacman -S [イントールするもの]

mingw-w64-x86_64-clang mingw-w64-x86_64-clang-tools-extra mingw-w64-x86_64-gdb

をインストール

C:\msys64\mingw64\bin C:\msys64\user\bin

のパスを通す

C:\msys64\etc\pacman.conf

# [mingw32]
# Include = /etc/pacman.d/mirrorlist.mingw32

をこのようにコメントアウト

Tools < Build System < New Build System

を開いてビルドオプションを書く

{
    "selector": "source.c++",
    "file_regex": "^(.*?):([0-9]*):?([0-9]*):? (.*)",
    "shell": true,
    "cmd": ["clang++", "-std=c++14", "-g", "-Og", "-pipe", "-Wall", "$file_name", "-o", "$file_base_name.exe"],
    "variants":
    [
        {
            "name": "ビルドして実行",
            "shell": true,
            "cmd": "clang++ -std=c++14 -g -Og -pipe -Wall $file_name -o $file_base_name.exe & $file_base_name"
        },
        {
            "name": "ターミナルで開く",
            "shell": true,
            "windows":
            {
                "cmd": ["start", "ConEmu64", "/cmd", "clang++ -std=c++14 -g -Og -pipe -Wall $file_name -o $file_base_name.exe & $file_base_name"]
            }
        }
    ]
}

ビルドできた なぜgccだとうまく行かなかったんだろうか

オートコンプリートの設定

EasyClangComplete

Preferences >Package Settings > Easy​Clang​Complete > Settings
を開くと2つsettingが開くので右側の方に

{
    "common_flags":[
        "-IC:/msys64/mingw64/include",
        "-IC:/msys64/mingw64/x86_64-w64-mingw32/include",
        "-IC:/msys64/mingw64/lib/clang/$clang_version/include",
        "-I$project_base_path/src"
    ],
    "cpp_flags": ["-std=c++14"]
}

を貼り付け
なんとなくC++11にしたら雑魚だったので大人しくC++14のままでいいと思う

デバッガ

SublimeGDB(SublimeGDB - Packages - Package Control)

Preferences >Package Settings > SublimeGDB > Settings - User

を開いて

{
        "commandline": "gdb --interpreter=mi --args ./${file_base_name}",
        "workingdir": "${folder:${file}}",
}

ペースト

機能 キーバインド
ブレークポイントのオン/オフ F9
起動 F5
ステップオーバー F10
ステップイン F11
ステップアウト Shift+F11