岸原オカルト研究部

プログラミングを勉強していくブログです

転職します(2022年3月)

素敵な夜ですね。 今回の転職について整理する。

私はどういう人間か

kisihara.cと言います。IT開発職です。十年程度断続的にプログラミングに取り組んでいます(主に、同人活動を含む創作活動にて)。得意な言語はJavaScriptだったはずです。最近Rails競技プログラミングC#)にも取り組んでいます。ゲームが好きで、プレイする側としては高難易度or対人のアクションゲームを好みつつ、最近はVRSNS(VRChat)でイベント開催等もしています。

今回の転職でどこから何をなぜ目指したか

非IT営業からプログラマを目指しました。プログラマとはプログラミングを行う職業を指します。多くの理由がありますが、端的に一つ言うと、プログラミングで飯を食っていきたいと思ったからです。一応足掛け十年プログラミングをやっており(やり込んでいる人からすると児戯だと思いますが)、もっとたくさんプログラミングをしたいと思いました。

どうなったか

かなり望んだ通りの企業に転職できました。

  • BtoCで、勘が働きやすそう
  • ネット文化の文脈(ネット文化への貢献は将来的に絶対にやりたい事でした、まさかこんな早く成るとは思ってなかった)
  • 望めばUnityも触れる

伺っている話だと、ずっと頑張っていきたいです。力不足な部分はありますのでまずは戦力外通告を受けないようキャッチアップがんばります。

どうやったか

最初に営業から未経験で転職するにあたり、当時はすでにITエンジニア転職バブルが破裂していました。ずっとプログラミングやってるのに迷惑な話だと思いながら、肺炎禍も被さりつつ、まずは飛び込んでみようとSESに入社しました。そこではお世話になったものの、SESという仕組み自体については悪感情ができました。生活苦・キャリア面から勤務を継続できないと判断し、再転職先を探しました。

プログラマになってからジュニアなりに実力をつけるために行った事は以下のとおりです。

どれも頭一つ抜けて極められたとはいえませんが、どれも選考によっては必要となった為、この戦略をとってよかったと思っています。なぜこの戦略を取ったかについては、根本的な説明は長くなるので書くにしても別エントリとなりますが、一言でいうと自分に最適な形で就職への最短経路だと思ったからです。

そうして、20件程度求人に応募したり、スカウトの面接を受けたりして、今回の仕事につくことができました。よかったです。

個別事例

500字・10社程度のメモ書きを持っています。参考にしたい方はDMで連絡いただけたらお渡し可能です。

選考総括

素振り程度のポートフォリオは役に立つ場面少なかったです。面接の種になる場面はあったくらい。やはり必要とされているのは作った素振り程度のものではなく、レベルの高いプロダクトという感じがしました。具体的に言うと、2社様から、「ユーザー満足を作れているプロダクトがあるか見ている」という話を伺い、2社様ともこちらから辞退した記憶があります。キャリアと生活苦の為、それを作り上げるまで転職を待てません。他、応募した中でgithubを見られた事は一切ありませんでした。

競プロは対コーディング試験で極めて役に立ちました。競プロ界隈では若輩ですが、時間制コーディング試験は全て通りました。エンジニアの方が面接官なら、面接の種にもなりました。ただ書類選考面で有利になった感じはないです。存在や内情を知らない方のほうが圧倒的に多いです。茶色(当時)だと足りなくて緑(AtCoder800レート~)は要るだけなのか、そうではなくそもそも着目する方の数が少ないのか、界隈全体の事まではわかりません。この状況が続けば緑になってからテック系大企業にまとまった数応募してみて様子を見るつもりでしたが、それはもう必要なくなりました。検証不能になります。

技術の学習は役に立つ場面がありましたが、どの学習が具体的に役に立ったというのが難しく、意識して学習できる事ではないと思いました。例えば参照渡しと値渡しの説明を求められ、興味本位で正答率の目安を聞いてみたところ「キャリアに関わらず(不正解者はいる)、答えられない方は答えられない」という話を伺いました。例えば知っているgemの数で技術力を測る面接があり驚きでした(ただ実際相関関係はありそうだと思いその点は面白かったです)。プログラミングスクールに通う事をおすすめする会社様もいらっしゃいました(例えばN高とかかなと聞き返したらそうではなく、「N高は難しいからやめておけ」との事でした)。何を聞かれるかは会社によると思うので、具体的に何をやればいいというのは存在しないはずです。

基本的には業界全体で人手不足なのだろうという感触がありました。その中の一人として頑張ります。

ここ一年睡眠時間をゴリゴリに削っていました。壊れてしまう前に内定貰えてよかったです。内定に伴って生活リズムを変えられます。今よりは長期的な視野で動く事だってできます。

反省点

基本的には自分に向いた方法かついい形でアプローチできる方法を取れたと考えます。

唯一反省点があるとすれば、ポートフォリオの作り方について、こだわりすぎて前に進めない時期を作ってしまった事です。あの数ヶ月が非常に惜しく、その後結局別のことを思いついてそちらを進めたのですが、さっさと切り替えて「できるようになってから戻ってくる」ような気持ちでよかったです。上達は螺旋を描くものだと知っていたはずなので、戦術眼がまだ足りないです。

総括

新しい職場ではまずはキャッチアップからになるものの、馴染めたらサーバーのパフォーマンス周りとUnityについて取り組んでいきたいです。戦力外通告されないようがんばります。マジで。

今後やりたい事については絶対また変わるタイミングあるだろうしちゃんとした文章書きたいと思っていますが、一段落で書くと以下のとおりです。技術力がほしい。もっと言うと、確固な学術的知識をベースにして動けるようにしたい。サーバーのパフォーマンス周り、クリエイティブコーディング/Unityなどの実践的な勘所を一通り抑えつつ、ゲーム/エンタメと親和性がある特定領域で修士になりたい。それらを用いて数字についても役割を持てるようになりたい。

各種アドバイス頂けた皆さんありがとうございました。twitter相互の方、引き続き技術の話させて下さい。鍛えてもっと技術力をつけたら、今後はもっと面白い趣味開発の話題持っていけると思っています。VRChatフレンドの方、今後気を抜く時間を作るので、とりとめないお話させてくれると嬉しいです。

やっていきます。よろしくお願いします。

超インスタント競プロ環境構築 TypeScript

素敵な夜ですね。
TypeScriptの練習の為、Atcoderをやれるように環境整備してみました。

参考文献

初手参考文献で恐縮ですが、こちらを見れば全部解決します。

js/tsで競プロをやるという事

話を聞いただけでも致命的な話がいくつか聞こえてきます。

  • 普通の入出力がWindowsで動かない 面倒です。
  • 64bit整数値を扱えない つらそう
  • 再帰が使えない つらそう
  • 使用メモリ量が多い うーん…。

というわけで、恐らくC問題からすでに辛そうです。今は単にTypeScriptに慣れたいだけなのでA~Bだけ解いていきます。

環境構築

先の記事に従い、npm initの後、npm install -D typescriptをぶちこみます。

さて、Windowsでの入出力、色々試しましたが断念しました。3つめの記事に従い、txtファイルから読み込みます。Linux使えというのも確かにそうなんですが、いや仮想環境はちゃんとあるものの起動時間は0ではなく……。ts-nodeもぶちこみます。npx ts-node hoge.tsを実行してlocal.txtを実行する形がいいです。

また、jestもぶちこみます。npm testを使うと、テストファイルを元にテストしてくれます。やったぜ。txtファイルは一ケースしか受け取りませんので、jestは難問と繰り返し戦う際に使います。

index.ts

使っているindex.tsを公開します。よければそのままお使い下さい。3つめの記事を元に何度かチューニングしながら実践しました。C問題を考えなければ各種ライブラリは要らなさそうでした。

// 手元の実行 npx ts-node index.ts
// 入力 同ディレクトリ test.txt
// jestによるテスト npm test

import { Console } from "console";
import { DEFAULT_MIN_VERSION } from "tls";

// 手元時"l"、提出時"u"、テスト時"t"
const onlineOrNot : string  = "u";

//resolve
const program = (args: any) => {

  answer = "hoge";

  return answer;
}

const io = (input :string)=> {

  // 入力を受け取り、行ごとに分割 本番と手元で挙動が少し違う
  let args;
  if (onlineOrNot === "on") { args = input.split('\n'); } else { args = input.split('\r\n'); }

  console.log(program(args));

}

//jest用
module.exports = program;

if(onlineOrNot === "u"){
  io(require('fs').readFileSync('/dev/stdin', 'utf8'));
}
if(onlineOrNot === "l"){
  io(require('fs').readFileSync('local.txt', 'utf8'));
}

tsconfig.json

使っている設定ファイルはこちらです。参考文献4番めの知恵を拝借し作りました。よければそのままぶちこんで下さい。

{
  //https://eh-career.com/engineerhub/entry/2019/04/16/103000
  //米印は未適用設定

  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */

    /* Basic Options */
    // "incremental": true,                   /* Enable incremental compilation */
    "target": "es5",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
    "lib": ["es2018"],                             /* Specify library files to be included in the compilation. */
    // "jsx": "react", ※                    /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
    // "allowJs": true,                       /* Allow javascript files to be compiled. */
    // "checkJs": true,                       /* Report errors in .js files. */
    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
    // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
    "sourceMap": true,                     /* Generates corresponding '.map' file. */
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
    "outDir": "./build",                        /* Redirect output structure to the directory. */
    // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // "composite": true,                     /* Enable project compilation */
    // "tsBuildInfoFile": "./",               /* Specify file to store incremental compilation information */
    "removeComments": false,                /* Do not emit comments to output. */
    // "noEmit": true,                        /* Do not emit outputs. */
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
    "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */

    /* Strict Type-Checking Options */
    "strict": true,                           /* Enable all strict type-checking options. */
    "noImplicitAny": false,                 /* Raise error on expressions and declarations with an implied 'any' type. */
    // "strictNullChecks": true,  ※             /* Enable strict null checks. */
    // "strictFunctionTypes": true,    ※        /* Enable strict checking of function types. */
    // "strictBindCallApply": true,      ※      /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
    // "strictPropertyInitialization": true, ※  /* Enable strict checking of property initialization in classes. */
    // "noImplicitThis": true,           ※      /* Raise error on 'this' expressions with an implied 'any' type. */
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */

    /* Additional Checks */
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */
    // "noUncheckedIndexedAccess": true,      /* Include 'undefined' in index signature results */

    /* Module Resolution Options */
    "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    // "typeRoots": [],                       /* List of folders to include type definitions from. */
    // "types": [],                           /* Type declaration files to be included in compilation. */
    // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true,                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
    // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */

    /* Source Map Options */
    // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

    /* Experimental Options */
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */

    /* Advanced Options */
    "skipLibCheck": true,                     /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true  /* Disallow inconsistently-cased references to the same file. */
  }
}

現在岸原オカルト研究部では、黒魔術(TypeScript)を研究しています。
twitter:@kisihara_c

apollo、prisma、hasuraについて調べる(資料漁り編)

素敵な夜ですね。

graphQLについての文脈でよく聞くapolloprisma、hasuraについて、調べたことを纏めます。これから調べる方は調べる手間の省略になるかもしれません。

筆者はhasuraだけおもちゃ程度に触りました。他2つもこれから触らないといけないと思っており、小物アプリでスクラップアンドスクラップして試すつもりではいます。

graphQLについて

https://graphql.org/

各プロダクト一覧兼目次

Apollo

参考文献:

Apollo Client

  • 「ローカル・リモートのデータをJavaScript+GraphQLで操作する」。
  • Apollo ClientとはGraphQL APIをシンプルにクライアント側で操作するためのライブラリ」

Apollo Server

  • オープンソースの、スペック準拠のGraphQLサーバー」
  • 「GraphQLクライアント(ApolloClient含む)と協働し、GraphQLAPIを作るのに最適」

Apollo Federation

  • 複数のGraphQLサーバーを一つのサーバーとして扱えるプロダクト

prisma

参考文献:

prisma1

  • 元来graphcoolというGraphQl as a Serviceのバックエンドを切り出したもの。
  • ORM
  • 単体だとクライアントを弄り放題:prisma server(Apolloでも可)を使う必要がある

prisma2

  • Photon(ORM)/Lift(マイグレーションエンジン)から構成。
  • GraphQL以外も動くという点でGraphQLだけとの繋がりのものではない
  • ORMに徹しており、公式もサーバー系のプロダクトと一緒に使ってほしいとのこと
  • コアはRust製

hasura

参考文献

hasura engine

  • hasuraのCore部分。自分でサーバーを建てられる

hasura Cloud

  • heroku等で自動でhasura engineを立ち上げてくれる

まとめ

結局どれをどう組み合わせれば良いのかわからないので、とりあえずいつか全部やる事になりそうだと思いました。

現在岸原オカルト研究部では、黒魔術(Web)を研究しています。 twitter:@kisihara_c

習作ネタWebアプリbrainfxxk.cログ

素敵な夜ですね。

Webアプリの概要

brainfxxk.c https://brainfxxk-c.herokuapp.com/

作りました。brainfuckという記号だけで出来たプログラミング言語の各記号を置き換えるシンプルなWebアプリです。
怪文書を作れます。

構成

素reactをサクッと勉強したいので、全てを投げ捨ててreact-create-appを使いました。
他は何もありません。
express+reactで環境構築する計画もありましたが、両者間の接続にハードルを感じ今は退却。

作った流れ

reactの学習

zenn.dev

zenn.dev

辺りでちょっとだけ予習して
公式へ ja.reactjs.org

チュートリアルは本当にチュートリアルで、自分のものを作る時にあまり繋がりませんでした
ドキュメントこそ正義
ja.reactjs.org

CSS

miniを使っています。
ちょっとダサくなりましたがこれは私の腕のせいです。

デプロイ

herokuを使いました。3秒で終わりました。

おわりに

2作目のWebアプリ完成しました。
前作よりは少しネタ的な実用性が出たと思いますが、次はもっと人の役に立つアプリを作ります。

現在岸原オカルト研究部では、黒魔術(WEB開発)を研究しています。 twitter:@kisihara_c

簡単習作Webアプリcrypt.cログ

素敵な夜ですね。

Webアプリの概要

crypt.c
https://crypt-c.herokuapp.com/

作りました。 文書を簡単に簡単な鍵で暗号化できる簡単なWebアプリです。
インターネット上の友達にクイズ問題を出題して頂いたりスパイごっこをして遊んで頂く為のアプリです。

構成

express,milligram(css)

作った流れ

expressの学習

単ページなので公式チュートリアルのルーティングあたりだけ読みました

expressjs.com

CSSフレームワーク

Web開発は初めてなのでさっぱりわからず、とりあえずシンプルなやつを探しました。
BootstrapのようなjQueryも混ざるようなものは意味不明になってしまうので……。
本格的なものもそのうち触りたいですが。

uikit,Semantic,Milligram,mini,Skeletonをパッと見で候補としまして、uikitとSemanticはjavascriptも絡むものの為排除、MilligramとminiとSkeltonを様子見しています。

Milligram

一番雰囲気が良かったのでこれにしました。
シンプル志向で作られており、シンプルすぎて配置等に関する機能も最小限です。

mini

ちょっとだけランディングページが好みに合わず避けました。
ヘッダーフッター等も揃っており、Milligramよりは多機能です。
最低限度をしっかり揃えたものと思われます。次はこれを使います。

Skeleton

Milligramと同程度機能のCSS
デザインカッコいいのでそのうち使います。

暗号化フレームワークの選定

苦労しました。
当初crypto.jsというフレームワークがシンプルでいいと思っていたのですが、うまくHTMLに入れ込めず断念。
forgeというフレームワークをお借りした結果もうまく行かず、最終的に気合でcrypto.jsを使用しました。

暗号化

AESを応用した形式で、単一のパスフレーズを入れてフレームワークを暗号化してくれます。

セキュリティ対策

app.disable('x-powered-by');でバージョン問い合わせを無効化した後、

"></script><script>alert(0)</script>  

上記コードでXSSのテストを行いました。

最初はセキュリティモジュールhelmetを触ってみたのですが、うまく動かせませんでした。
恐らくcrypto.jsを読みに行く動作が良くないのではないかと思っています。
次は使います。

zenn.dev

expressjs.com

デプロイ

zenn.dev

herokuを使いました。3秒で終わって怖かったです。

おわりに

はじめてWebアプリの開発に成功し興奮しています。 ですが実用性には程遠く、今年中に人の役に立つアプリを作りたいです。

現在岸原オカルト研究部では、黒魔術(WEB開発)を研究しています。 twitter:@kisihara_c

VRChat入門記事の次の記事、飛び込みで始めたVRChatで一ヶ月間何やったか

 素敵な夜ですね。

 今回はVRChat入門記事の次に読む為の記事を用意しました。(ver1.3)


 自分自身の経験として、VRChat入門記事を色々読んでおりますと、「じゃあどう今後やっていけばいいか」がいまいちわからなくて途方に暮れたため書いています。

 (ま、多分皆いろんな人と絡んでいろんなこと教えてもらってるだけだと思うんですけどね…!)

序文として、感じたVRChatの空気について


 よく言われてる通りの「VRChat勢は初心者に優しい」は実際真実だと思います。

 不親切でオープンワールドっぽいゲーム性なのに目的は人との交流なので、
 ・始めた人は大抵誰かに親切にされている
 ・残っている人は大抵人との交流が好きで
 ・人との交流が好きな人は大抵人に親切にするのが好き
 ・人との交流それ自体が他ゲームで言うレベル上げに近い
 イメージです。

 俺も人に案内頂いてVRChatに入門しています。センセイありがとう!!



 が、初心者に優しい=誰でも輪に入れる というわけでは流石にないようで。
 自分以外の人が輪になって遊んでるのを見ていてとてもつらい!


 現実で会員制のバーに知らずに入って非常に気まずい気持ちになったことがあります。VRChatも同様、恐らく知っている人・仲の良い人と繋がる疎なネットワークです。

 気の合う人を探したければ仲の良い人の仲の良い人の仲の良い人を探す必要があります。



 で、その為には地道に繋がりを増やすしかないようでして、
 その為に色々試したり見に行ったのでここに書いていきます。


まずはNewUserになる為に


 肩書がvisitorの間はアバターをアップロードできません。
 無料で手に入る可愛いアバターは大体広告が入っていて、かわいいですがじゃまです。

 信用値を上げます。


信用値とは


 プレイ内容に応じてちょっとずつ上がるパラメータです。荒らし対策用のようです。
 詳細不明ですが、プレイ時間やFriendの数、Friend達の信用値、「信用値の高い方から申請したものか?」、そしてワールドアップロードなどの活動内容が計算式と推定されています。

 俺は一週間くらいでNew Userになりました。のんびりなら一ヶ月くらい、超早い人は一日でなった人もいるそうです。


 Friend申請して大丈夫かな…
 →大体のケースで大丈夫です!
  Friendを増やすことにためらいは不要です。
  人との交流ゲームなので、余程でなければ
  大体の人が貴方とFriendになりたがっています。

 もしヤバい人とFriendになっちゃったら大丈夫かな…
 →Friend解除+Blockのコンボが強力だそうなのでなんとかなると思います。

 Userに上がらないよう…
 →後述


twitterで呟く


 #VRChat、#VRChatはじめました、#VRChat始めました、#VRChatなんもわからん
 辺りのタグを付けてはじめましてツイートを呟きました。

 それだけでフレンド申請がいっぱい来るかというと来ませんが、いいね・RT貰えた人にフレンド申請しますとだいたい返ってきました。俺も返します。

 まず一番簡単な一歩になります。



イベントに行ってFriendを増やす


 とても速いです。
 人がたくさんいるし、その目的は人と話すことです。
 visitorであることをアピールしたら皆フレンド申請してくれます。(余程近寄りがたい人でなければ)

 
sites.google.com

 VRChat上のイベントが登録されています。
 主催者さんが誰か、予定の詳細を確認して、フレンド申請をします。
 フレンド申請をしたら、相手のプロフィール画面からjoinして参加できます。
 あからさまな注意書きを見落とす等なければ唐突に入っても迷惑なことはないので、色々joinして回ってみましょう。

 親切な店員さんに話しかけてもらって輪に入れてもらって、初心者だというと大体皆優しかったです。


 ※長く話した人のIDはメモっといたほうがいいかも。
 (一敗。話した人と別の場所で再会しこちらだけ忘れて非常にヤバかった…)


 ※居酒屋系は少し難易度高。身内の方で集まっている店もあります。
  ・ちゃんと店員さんが挨拶してくれる店で ・ずっとぼーっとしてると
  輪に入れてくれるかも。
  体感四分の一くらいで。
 ※もっと攻めるなら、輪になっていても話しかけられるかも。
  VRChatの空気としては全然変ではないはずです。多分。(試行回数低)
  観察後、お邪魔できそうな輪に挨拶+何の話してたか聞いてみます。
  空気が気まずければGo homeします。
  浮いてる…す…すげぇ…;0;

 ※上記2つがだめならばいばいしましょう。お互いアンハッピーなので。
  そこはお互い様なので、ばいばーいな感じで適当で大丈夫でしょ



discordやグループに入る

※すみません、この項目は未実証……!


 VRChatにはでかいdiscordサーバーがあってプレイヤーの方がたくさん入ってるようです。

 
vrchatjp.playing.wiki

 他、こういったグループなどもあるようで、探せば同好の士が見つかる可能性があります。


※ワールドやアバターを作る側に回った場合、公式discordサーバーは参加必須となります。
 discordにしかない公式情報もあるようなので。



適当に話しかけてFriendを増やす


 初心者ワールド、各種publicで適当に話しかけるのも、非常に困難ですがありです。
 この記事を一通り読んでから試して頂けると嬉しいです。
 
 まず場所を選ばないと本当に外国の方が多いらしく、外国の方はフレンドになる文化が少ないとの未確認情報もあります。
 根本から、VRChatの楽しみ方が全然違います。年齢層も違うのではないかな…。

 ひとまず英語が堪能でなければ、日本人が多いワールドがいいです。
 それも簡単には難しく…後述します。

 基本はイベントに行くほうが良いと思いますが、醍醐味ではあります。


 なお、辻斬りしたりされたりで、相手がしゅっと話してしゅっと消えるのはそういう文化と思われるので「変なこと言った…?」みたいに気にしないほうがいいと思います。
 でもこっちがvisitorなうちは楽しんでねーばいばいくらいは言ってほしかったなあ…


 やばい人がいた
 →Go home.

VRChatWikiで紹介されているpublicワールドの2020年末時点の感想

 
vrchatjp.playing.wiki


 まず書いてあるとおりで「Japan」と書いてあるワールドは観光地です。
 現実でも京都の有名所は外国の方だらけでしたがあんな感じ。

 それを前提に
・[JP]TUTORIAL WORLD 初心者の方、初心者を案内したい方と話せる率は高いです
すずらん集会場 仲の良い人同士で話しており辛いです
・コネステ 仲の良い人同士で話しており辛いですがたまに人と話せる事も
・ポピー横丁 仲の良い人同士、見た目通りの飲み屋街 こんにちは~って突っ込んだら話せるかも?(※いくつか噂話有)
・JAPAN STREET 上記の通り外国の方が多く合いませんでした
・月光庵 ワールド製作者さんがたまに昼イベントをされているようです 夜は人が通りがかる場所ではないです
・Newじゃぱん広場 人数多くはないが、時間帯によってはPublicとして機能はしているかもしれない?

 うん、あんまり辻斬りは……正直厳しかったです。

2021/6の状況

 さて、上記の状況はあくまで2020年末の状況です。
 どんどん人が増えているコンテンツということがあり、VRChatの状況は簡単に書き換わります。
 具体的には、[JP]TUTORIAL WORLDは機能しなくなったようです(未確認)。
 コネステからは人が減っています(見た限り)。
 現状最近できた日本語話者用publicワールド「JP hub」だと人の集まりも良いようですが、その継続性については疑問があります。デリケートな話題が関わっているようで…。

 この記事は最初の導入は終わった段階のものです。ですがもし貴方が独力でアカウント作成し途方に暮れている状況なら、初心者案内してくれそうな人を探してお願いしましょう。それが一番確実です。
 前述の通りVRChatはゲーム性そのものが人に親切にするゲームなので、受け入れている方は少なくなく、受け入れてない人に間違ってお願いしても気持ち悪がられる事は99%ないです(0人とは言わないです。断られたらLoseLoseなので別の方にお願いしましょう)。

  • 初心者案内 vrchat で検索しましょう。受け入れている方は俺が調べたときは三人見つかりました
  • 明確な告知ツイートとかではなくぽろっと「初心者案内してみたいな」と漏らしている場合もあります。こちらはおそらく三人どころか三十人三百人いると思います
  • 案内をお願いするのは趣味が合う相手にして、継続的にjoinし、友達の友達と友達になれるようにする事をおすすめします

 素敵な体験が始まると良いですよね。



逆に、急いで信用値を上げすぎないほうがいいという話もあります


 たしかにvisitorは不便です。
 しかしながら、「すんません初めてで~」って感じで話しかけて色々聞けたり、パラメータを見ただけで皆が色々構ってくれるのはvisitor/New Userの間だけなんだと思います。

 少なくとも、Friendを増やした後少数の友達と一緒に放置で信用値稼ぎ、はオススメできません。
 その友達が顔広いなら別ですが……。

userになる目安

 ワールドをpublic化するにはuserになる必要があります。また、イベント等で初心者扱いされる事はなくなります。

 参考までに経験をメモします、
 俺、岸原の場合userまで六ヶ月でした。
 その日にはtwitterで知り合った方とワールド巡りを行いました。その流れで自分で作ったprivateワールドにjoin頂く事もありました。また、タイミング的には自分で開催したイベントの真っ最中でした。
 あまりにも当日の当日なのでどれかがトリガになった可能性は十分ありますし、偶然プレイ時間が100時間か200時間を超えた可能性もあります。

 ただ、いろいろな方と話す中で、俺と同じようなプレイスタイル(イベント開催・参加の時のみプレイ)のフルトラで、一年間ずっと引き続きNewUserのままでいる方のお話を伺いました。
 共通項となる部分に見えないachevementが存在する可能性は非常に高いです。


その先

 そのうちフレンドにjoinしたりされたりだけで、周囲に人が途絶えなくなる日が来るんだと思います。

joinする

 VRChatは回線ごしのコミュニケーションという事もあり、コミュニケーションが極めて気楽な形で保たれている雰囲気があります。
 すっとjoinして挨拶して、すっとバイバイする「挨拶回り」文化に乗っかる事ができます。居合わせた人で挨拶を返してくれたり二言三言話せた人にフレンド申請しても変な空気にはならないと思います。
 もちろん溶け込めるならそのままいればいい訳ですし。

 VRChat公式のページを見ると、フレンドたちが多くいるワールドが一発でわかります。一番多いワールドにはフレンドがいっぱいいるようなので、そこを目指してjoinするという人もいました。半年の俺程度ではそれはやれないですが(一番フレンドが多いワールドでも数人しかいない)。

 

Homeの変更


 デフォルトのホームは別に特殊機能とかないし便利でもないです。
 行き慣れたワールドや便利機能があるワールド、綺麗なワールドをホームにしました。



NewUserになった

モデルを買う

 一番可愛いモデルを探しに行くぜ!!
 アバターワールドの探索や、Boothの検索を行いました。
 なお、3Dモデルカテゴリで0円で絞り込んでも、結構kawaiiアバターが出てきます。別作品の宣伝ってことだと思いますがインターネットって凄いなあ。

 おすすめのワールドは「avatar museum」1~3です。アバターのバーチャルマーケットみたいです。最新の販売アバターなので可愛いし、試着もかんたんです。買う前に絶対試着しましょう。
 他、有名アバターを買えば、同じアバター同士のつながりにアクセスしやすくなります。既存服も充実してますし、同じアバターの改変を見せ合う「アバター集会」などに参加もできます。こればっかりはどれがオススメと言いづらく、色んな人の話を聞いたりアバターを観察して決めたほうが良いと思いますが、薄荷ちゃん、シャオマオちゃん、量産型のらきゃっと辺りはぱっと思いつくレベルで人気かつ歴史が長いですかねえ…うーん、やっぱりご自分で調査したほうが良いと思います。

 各所で紹介されている「Himiko Avatar World」は違法アバターが跋扈していた時期に権利関係クリーンなpublicアバターを纏め交通整理した功績がある(ような話を聞いた)素敵なワールドですが、流石に歴史が長く、現在の空気と合うアバターが見つかるかは疑問符がつきます。

モデルをアップロードする

 引っかかるポイントが無限にあるのでお気をつけて!

・DynamicBoneというよく使われている揺れモノ作成プラグインは二千円にて有料
・Unityアセット(拡張プラグイン)は入れる順番も大事
・Settingの謎チェックを外す(一敗)
・バージョンは絶対特定のバージョンじゃないとダメ しかも参考にした情報が古いと死(二敗)
・publicにしない

 
www.holynight.net

shiasakura.hatenablog.com

 死(笑)

 
https://noshilog.com/unity-dynamic-bone

vrcworld.wiki.fc2.com

 せっかく女性の体を着ているので胸はある程度揺れて欲しい

モデルのサムネ芸で色々遊べる

 モデル変更可能になれば、かわいい以外にもメリットがあります。
 3Dモデルのカメラを応用すれば、色々な画面をプロフ画像にできました。

 ネタ画像を貼り付ける他に、様々な情報を表示する事もできます。

 ※一度アバターを変えないと、vrchatのプロフィール画像に反映されないので注意

「離席中」のモデルを一つ持つ

 デフォルトでも、アバター着替え画面の真ん中くらいの「AFK」を使えます。
 Favorite登録しておきました。



人と話す

 結局人と話すゲームなので、やる事は変わりません。
 アバター限定集会等、交流のネタは増えているので、色々おしゃれしたら面白いはず。


※俺は色々着替えたりというよりは気に入ったアバター
 ずっと着て自分だと思いこんでいます。
 ちょっとした改造等もやり込むと時間が溶けますね…!

※細かいことで言うと、VRChatの自分は猫耳なので、
 猫アバター関連のイベントに行くと溶け込めた気がして嬉しいです。
 まあ浮いてるんですけどね
 浮いてる…す…すげぇ…

イベントを開催する

 おもしろ企画があればやってみても良いんじゃないでしょうか。
 仲いい人と一緒に始めるのがイベントの基本だと思いますが、
 誰も来なくてもリアルの我々は無傷なので一人で始めても大丈夫!

 需要がある企画を、先述のカレンダーに登録すれば誰かしら来ると思います。
 何回かイベント開催してみましたが、ゼロという事はなく、来て頂けてとても嬉しかったです。
 ポスター広告も作りました(素人なりのデザインとか安いグラフィックソフトとか書けますが長くなるので省略)。



 ミニマムに始めます! 宣伝はカレンダーで。
 ワールドは公開ワールドで。(※毎週やるなら要許可)

 その先は自作ワールド!
 管理者権限が強化され、ポスターを貼ったり色々できるようです。

 キレイなポスターを作ってくれる人を探しましょう!
 外注を受け付けるプロ並の腕前の人が多分います。
 
vrcworld.wiki.fc2.com




表情を練習する

 手のジェスチャーやPCならショートカットキーで表情が出せます。
 意思疎通に便利です。
 変な表情になりっぱなしの方がいたので、お気をつけて……!
 ※使い込んだら半年~一年でVRコントローラがへたるみたいですね…

声を整える

 一敗。やっすいマイクの声を自分で聞くとガビガビでした。
 2000円程度でまあまあの音のイヤホンマイクがあります。

女声

 また、ボイスチェンジャーで女声にしました。
 素性保護の観点もあります。


恋声 ・バ美声 ・Gachikoe! ・Voicemod ・VT-4 ・Grailon
・Voidol ・Elastique Pitch ・THROAT ・MorphVox ・MHarmonizer ・Audio Input FX
 なんかが紹介されています
 俺はバ美声を使っています。

 これは相手に聞こえさせる方法

 ボイチェンを使っても、女声にはなりますが女の子の声にはなれません。
 女の子の声になるためには、女の子の話し方を習得する必要があります。
 女の子っぽい話し方の練習はおすすめしませんが(熟練しないと普段漏れると思うので)、裏声や息遣い、発声法を取得してみるのも面白いかも知れません。ボイチェン使いながら発声法鍛えれば低い声でもかわいくなると思います。

 
夢現なるーむ - ボイチェンの極意?

 極意との事

 あまり詳しくないので、詳しい方の補足を待ちます。

話し方を整える

 せっかくなので、ついでに声優入門みたいな本を買って早口言葉の練習をしています。
 ボイチェンしていてもそのまま聞いても魅力的な声を目指して、そこで固定する感じで。

 口と喉も筋肉なので、鍛えたら鍛えられるし、いろんな場面で得するはずです。

 こちらもあまり詳しくないので、詳しい方の補足を待ちます。


 Q.そんな面倒な事する人いるの……?
 A.います、ここに。
  皆で可愛い声の練習イベントとかも見かけましたので、ボイトレ勢は多いはず。
  やるならより良くしたいので。



その先


 ツイートを見れば、上級者の方はjoinしたりjoin待ちしたりで予定がいっぱいのようです。
 そして、VR飲み会やったり、一緒にゲームしたり、アニメの同時鑑賞会をやったり、VRChatでやれる遊びを色々遊び尽くすのでしょう。
 Boothでたくさん売られているツール、スクリプト言語を使ったVRChat内のゲーム、たくさんのイベント、見たところVRChatの自由度は高く、遊び尽くせるという事はなさそうです。



リンク、スペシャルサンクス


 
note.com

 
yush-fax.hateblo.jp

 
note.com

 
note.com

 
narazaka.hatenablog.jp

 
y23586.net

色々教えてくれた喫茶店イベント「めすがきっさ」店長さん(リンク略)




おわりに

 読んで頂きありがとうございました。
 VRChatしばらく続けようと思っています。
 joinしたりされたりの経験もないし、イベント以外の輪・コミュニティに加わる経験もまだ無いですが、まあ、そのうちするでしょ(ヘラヘラ


 子供の頃やったRPGみたいに、人に話しかけて聞くのが楽しいです。
 貴方とお話できる機会も楽しみにしてます…!


 逆に先輩方にはぜひこの記事のコメント欄にアドバイス頂けたら嬉しいです。



 最後に自分のイベント宣伝させて下さい。
 もくもく会(自由作業会)です。一緒に作業しましょう~

 





現在岸原オカルト研究部では、オカルトを研究しています。
twitter:@kisihara_c

Linuxチートシート 及び httpsサーバーとしてUbuntuをセットアップする

 自分用にLinuxUbuntu)でサーバーを立てる際に必要な情報のメモを取りました。

 前半はLinux自体のチートシート、後半はWebサーバー/Apache関連です。

Linuxについて

 Linuxの操作はシェルで行う。  シェル≠OS、シェル≠カーネル。シェルとはUIで、心臓部のカーネルと完全に分離している。

多重起動

sh(シェル起動)→bash(シェル起動)→exit(シェル終了)→exit(同左)→exit(最初のbash終了によりLinux終了)

echo Hello

 →Hello

Linuxの構造

 Linux上の情報は全てファイルとして扱われる。ドライバ類もファイルとして扱われる。

/bin コマンドの実行ファイル /dev デバイスファイル(windowsで言うドライバ類) /etc 各種設定ファイル(winで言うwindowsフォルダ) /home ユーザーごとのホームディレクトリ /sbin 管理者向けコマンドの実行ファイル /tmp 一時ファイル用ディレクトリ 定期的に削除するディストリビューションもあるので、大事なファイルは置かない /usr アプリケーションが置かれる このサブディレクトリとして再帰的にbinやsbinなどがあったりする /var いろんなデータのディレクト

 ディレクトリの移動はpwd(現在地表示)/cd(移動)/ls(ファイル一覧)で行う。  cdはTabで補完可能。また、引数なしならホームディレクトリに戻る。  lsはパス名展開(*/?)と組み合わせると便利。引数-l:属性表示、引数-a:隠しファイル表示、引数-F:ファイル種類表示

mkdir ディレクトリ作成 touch ファイル作成 タイムスタンプを作るコマンドなので、既存のファイルを上書きしないから安心して使える rm/rmdir ファイル/ディレクトリ消去 cat/less ファイルの中身を表示/1ページごとに表示(f,b,j,k等で操作、qで終了) cp/mv ファイルをコピー/移動 -rで再帰的にディレクトリごと操作 ln ハードリンク/-sオプションでシンボリックリンクを作る ハードリンクは複数の実体、シンボリックリンクはショートカット find ファイルを検索できる locate インデックスから探す為高速に検索可能 ubuntuではsudo apt-get install mlocateで作る

--help コマンドのヘルプを見れる変数 man 引数のコマンドの使い方を調べるコマンド -kをつけると類似品検索が可能 LANG=C 各コマンドの前につける事で英語で実行可能、英語のヘルプを見ることができる

bashの操作

Ctl+Aで先頭へ、Ctl+Eで末尾へ Alt+Bで単語前一つへ、Alt+Fで単語後ろ一つへ Ctl+Bでカーソル左へ、Ctl+Fで右へ Ctl+hでBackspace、Ctl+dでそのカーソルの文字を削除、Ctl+wで単語一つ分削除

Ctl+kは行末までをカット、Ctl+uは行頭までをカット Ctl+yは「ヤンク」(ペースト)

Ctl+sで画面をロックしてしまった場合はCtl+qで戻す Ctl+cでコマンドの強制終了  表示がおかしい場合はCtl+lで画面リセット→resetコマンド→再ログイン

Tabは入力補完の呼び出し、複数候補がある場合はたくさん出てくる

矢印かCtl+p or Ctl+nで履歴を遡る事が可能、Ctl+rでコマンド履歴の検索も可能 コマンド検索時:Enterで実行、Escで結果を保持したままコマンドへ、Ctrl+gで結果の放棄

bashのカスタマイズ

エイリアス

alias lsf='ls -F' とする事でコマンドのカスタマイズが可能 alias rm='fm -I' とすれば既存コマンドの改造は可能

type エイリアスかどうか確認可能 unalias エイリアスかどうか確認可能 \(バックスラッシュ) 元々のコマンドを実行可能

set/shoptコマンドでbashの設置が可能 set -o ignoreeof CtrlDでシェルが終了しなくなる set -o noclobber 既存ファイルの上書きが無効化される

シェル変数

var1='test' echo $var1 → 「test」と表示

PS1 シェルの待機画面の文字列、コマンドの前を決める変数 HISTSIZE HISTFILESIZE コマンド履歴の長さ 長め推奨の様子

設定ファイル

 ログインシェルとしてのbashの起動時は/etc/profile、~/.bash_profile、~/.bashrcが読まれる。  非ログインシェルの時は~/.bashrcのみ。  このテキストファイルをいじればコマンドを打つ必要なくbashの設定を変えられる。

vim(テキストツール)

:q 終了 :w ファイルを保存 引数は新しいファイル名 :q! 保存せず終了 i 入力モード開始 Esc 入力モード終了

hjkl カーソル移動 x/J 文字を削除/改行を削除 w/b 単語単位で移動 0/$ 行頭/行末へ移動 gg/G/数字+G 最初の行に移動/最後の行に移動/任意の行に移動 y/d/p コピー/カット/ペースト u/Ctr+r アンドゥ/リドゥ

/ 検索 nで次の検索結果、Nで前の検索結果に %/<置換元>/置換後/g

vimtutor/:help チュートリアル、ヘルプ

Linuxの挙動

ファイル/ディレクトリの権限

 ファイルにはオーナー/グループ/パーミッション(権限)が存在。読み込み、書き込み、実行の権限を操作できる。  ディレクトリにも同様の権限がある。ファイルの削除可不可はディレクトリのパーミッションで決まる事に注意。  変更はchmod u/g/o/a,+/-/=,r/w/x ファイル名 で可。

スーパーユーザ

 スーパーユーザ≒rootユーザはあらゆるファイルの操作が可能。システムファイルも含む。  そのため基本は一般ユーザを操作し、必要なときだけsudoコマンド等でスーパーユーザを使うのが良い。  su/sudoコマンドの権限等を一般ユーザに設定するには/etc/sudoersを操作する。その際特別なコマンドが必要。

プロセス/ジョブ

 メモリ上で実行状態のプログラムをプロセスと呼ぶ。  プロセスは一つ一つが独立したメモリ領域とIDを持ち、並列的に実行可能。

ps 動作中のプロセスを確認可能。オプションを付ければ裏で動いているプロセスも見られる。

 コマンドの一行のことをジョブと呼ぶ。  パイプでコマンドを繋いだ際、コマンドライン全体でジョブ、一つ一つのコマンドがプロセスとなる。  コマンドのIDはシェルごとに一意。

Ctrl+Z jobの一時停止 jobs 実行中のjob一覧 fg %ジョブ番号 ジョブの復帰 bg %ジョブ番号 バックグラウンドでジョブを動かし続ける Ctrl+C 動いているジョブを強制終了させる kill %ジョブ番号 バックグラウンドのジョブを強制終了させる

killコマンドはプロセスも終了させる事ができ、場合によっては使う。※元々はプロセスに特定のシグナルを送るコマンド

入出力

 コマンド実行時、標準入力/標準出力/標準エラー出力の三チャネルが開かれる。

 標準入出力のリダイレクトは可能。  たとえば cat < ファイル とすると、ファイルが代わりに入力される。  ls >> a.txtとするとファイルが代わりに出力される。  ls 2>> a.txtとするとエラー時ファイルが変わりに出力される。  ls >> a.txt 2>>&1とすると普通の実行時もエラー時も同じファイルに出力される。

 linuxには/dev/nullというスペシャルファイルが用意されており、入力先と指定しても空っぽで、出力先と指定しても何も残らない性質がある。コマンドテスト時に使う。

パイプライン

 lsの内容をlessしたい時に、ファイルをわざわざ出力するのは手間。

 ls -l / | less と打てば、ls-lの内容をlessに送り込める。

テキスト処理

wc 入力ファイルの行数、単語数、バイト数を返す Sort 行を並べ替える -nをつけると数値順に -rをつけると逆転 uniq 連続した重複行を省く cut 区切り文字で区切られた文書の中から特定の位置だけ取り出す tailコマンド 文字の末尾部分を表示 そのターミナルでずっとファイルの追記を監視する際は-fオプション diff/patch 差分表示/差分のパッチを当てる

grep ディレクトリごと検索可能。その際、正規表現を使用可能。

sed 非対話型エディタを呼び出すコマンド。標準出力に変換結果を呼び出す。 sed 1d a.txt 一行目だけを消す sed 'e,$d' a.txt 三行目から最後までを消す sed /^B/d a.txt 戦闘がBで始まる行を削除 sed -n 1p a.txt 一行目だけを表示 -nはパターンスペース(メモリ的な)を表示させないオプション。無いと、ファイルがまたまるごと表示される sed 's/B/C/' a.txt g 全てのBをCにする。gフラグがなければ各行に1つずつしか直さない。 awk 高機能テキスト処理コマンド。一行ずつをレコードと捉え、操作する。

シェルスクリプト

 コマンドをファイルに書いておき、そのファイルをシェルに読み込ませることで実行可能となる。  シェルスクリプトの拡張子は.shが定例。vim a.shを作成し、chmod +x a.shで使用権限を付ける。

シバン

 ファイル名を指定してシェルスクリプトを作動させる際有効。  シェルスクリプトの先頭に#!があった場合、その後ろのコマンドをまず実行する。  #!/bin/bash等としておけば、いちいちbashから実行する必要がない。

source

 シェルスクリプトを作動させるコマンド。現在のシェルでコマンドを一行ずつ実行していく。  ファイル名を指定すると、別のシェルを起動して実行させる為、エイリアスの設定等はなくなってしまうが、  sourceコマンドならそういう事はない。

使い分け

 基本はファイル名指定が楽。  ただし、設定の引継ぎ等にはsourceコマンドが使われる。

置き場所

 ~/binというフォルダによく置かれる。  Vimで~/bash_profileで、PATH="$PATH:~/bin"に追加。

アーカイブと圧縮

 Linuxではアーカイブと圧縮は別々の単語。  アーカイブは一つのファイルにまとめるだけ。圧縮は基本アーカイブ後に行い、更にファイルを縮める。

tar cf b.tar dirA dirAからb.tarという圧縮ファイルを作る tar tf b.tar b.tarの中身を見る tar xf b.tar b.tarの中身を復元。

gzip a.txt a.gzを作る gunzip a.gz 解凍する zip/unzip Linuxならsudo apt-get install zip unzip等でインストール可

パッケージとリボジトリ

 パッケージとは一つのソフトをまとめたもの。  Redhat系ならrpmDebian系ならdebファイルが使われる。  Debian系ではapt系コマンドを使いインストールする。依存性の解決は勝手にやってくれる。

 パッケージを集めて配布しているサイトをリポジトリと呼ぶ。

SSH

 SSHとはSecureShellの略。リモートマシンと通信するためのプロトコルで、認証・暗号化の機能を持つため安全に操作できる。  通常はTCP22ポートが利用されるがプルートフォースでちょっかいかけられやすいので変更推奨。

Linux,Ubuntuでサーバーを立てる

 今回さくらVPSを使用する。  理由:知っていた、安い のみ しっかりした比較はしていない

 公式書面通りデフォルト設定だとセキュリティについては不十分の様子、人に迷惑をかけるリスク等を考えまずセキュリティ対策が必要。その後Apacheを入れる。

Ubuntuインストール

 標準インストールでUbuntu20を入れる。

セキュリティ

基本指針

 以下はメンター紹介サービスでお金を払って聞いた情報で、この記事の指針とする。  信憑性不完全ゆえ指摘願います。

  • セキュリティの要はポート開閉 しっかり閉める 特にポートの種類で危険度の制御が可能で、HTTPポートへの複雑な攻撃は難しい
  • SSH鍵認証はパスワード認証とは比にならないほど安全。ちゃんと設定。業務でかつ規模の大きいサービスは、SSHに繋ぐ時も踏み台を経由する
  • rootはやはり誤操作や乗っ取りが危険、封印が基本
  • セキュリティパッチ/アップデートを定期的に当てる
  • 追加Linux用セキュリティソフトは業務用等で存在するだろうが、企業予算レベルで高いはずなのであまり考えない

アップデートする

 定期的に実行の事。 sudo apt update OSのアップデート sudo apt upgrade パッケージのアップデート sudo reboot 2つこなしたらこのコマンドで再起動

一般ユーザーの用意

 さくらVPS公式でデフォルトで用意されるユーザー ubuntuは一般ユーザーの様子。

teraterm,ターミナルマルチプレクサー

 SSHクライアント/コンソールエミュレータとしてはteraTermが良さそうなので導入。

 また、ターミナルマルチプレクサーという複数のターミナルを管理できるソフトを準備。  本来の用途とは少しズレるのだが、コマンドを入れて一晩処理させる時等にセッションが維持される点で有用な為。 ※情報元:http://www.tohoho-web.com/ex/tmux.html

 ubuntu serverにはtmuxという有名ターミナルマルチプレクサーが既に入っている。  tmuxコマンドで起動。  再ログイン時はtmux attachで以前のセッションを復帰。SSH切断時等に生きるので、なるべくtmuxから動かすようにする。

SSHポート番号の変更

 デフォポート22はやはり不正アクセスが多い模様。 ※情報元:https://www.softel.co.jp/blogs/tech/archives/1516

vi /etc/ssh/sshd_configから、#Port 22という記述の一行下に「Port n」を追加。 sudo systemctl restart sshd によって再起動、 sudo systemctl status sshd によって確認。 teratermで新ポートからログイン可能か確かめてからパケットフィルタを解除。

ufwの設定

iptablesというセキュリティツールのインターフェイスソフト ufwで設定を行う。 ※情報元:https://qiita.com/shimakaze_soft/items/c3cce2bfb7d584e1fbce

sudo ufw enable でufwを有効化。 sudo ufw status numbered で有効なことを確認。 sudo ufw allow sshPort でsshポートを開ける。

秘密鍵作成

 teratermを起動し、開始時の接続ウィザードからキャンセルで抜ける。  setup→ssh keygeneratorウィザードを起動。RSA2048で大丈夫らしいので、そのまま生成。  パスフレーズを入れ、公開鍵と秘密鍵を保存して閉じる。

 ubuntu本体のHomeディレクトリへ公開鍵を突っ込み mkdir -p ~/.ssh cat ~/id_rsa.pub >> ~/.ssh/authorized_keys rm ~/id_rsa.pub

sudo vim /etc/ssh/sshd_config PubkeyAuthentication yesのコメントアウトを解除 PasswordAuthentication をnoにして sudo systemctl restart ssh にてsshをリセット

WinSCP

 teratermでもSCP(SSHを利用したファイル転送)が使えるが、色んな所で書かれてる通りteratermのSCPは最低限のシンプルなもの。  WinSCPを入れる。ドラッグドロップ等でやり取り可能。

 初回起動ウィザードでユーザー名だけ入れて設定を作成、AdvancedのSSH→Authorizationで秘密鍵を登録。.ppkファイルが必要だそうなので道なりにそのまま作成。  後は道なりにhomeディレクトリにアクセスできる。

Apache

sudo apt install apache2 にてapacheをインストール。  この時点でufwを解除してからサーバーURLにブラウザでアクセスするとApacheデフォルトが表示される。

 WinSCPでwww/htmlの中身を変更。  なお、転送の際は sudo chown -r user apacheのWWWフォルダ 等として所有者を自分に変更する。

 文字化けする場合はとりあえずHTMLヘッダーを確認する。 vim /etc/apache2/conf-available/charset.conf デフォルトの文字エンコードも確認する。 ※情報元:https://obel.hatenablog.jp/entry/20171016/1508119266

 他、いわゆるhttpd.confファイルは現在etc/apache2/の中に分散して存在しているので、まとめて同じ設定項目をgrepする。

sudo ufw allow 'Apache Full' でApache用のポートを開けて、こちらも確認。 (素人考えだとソフト任せが危険な気がして、sudo ufw allow 80/tcp,sudo ufw allow 443/tcpのほうがよいように思うが、複数ソースで上記の通りだった為恐らくこちらが正しい)

SSL

 Let's encryptでSSLをつける。  https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04-ja  https://weblabo.oscasierra.net/letsencrypt-2/ (※CentOS)  公式見たりすると色々方法があるが一応この二つがよさそう。

sudo apt install certbot python3-certbot-apache を使いapachecertbotを突っ込む。 sudo vim /etc/apache2/sites-available/your_domain.conf からServerNameとServerAliasを確認。 sudo apache2ctl configtest で構文をテスト。(SyntaxOKを確認) sudo certbot --apache を実行。  メールアドレス、メールマガジン配信の有無、どのドメインを有効化するか(空欄推奨)、HTTPSへリダイレクトするか(多分リダイレクトが良い)聞かれてHTTPS化は完了。

sudo systemctl status certbot.timer の表示がactiveで、かつ sudo certbot renew --dry-run でエラーが出なければ自動更新も問題ないはず。

 完成、サーバーURLもしくは登録済みのドメインhttpsアクセスができるはずです。

おわりに

 ご指摘頂けますと幸いです。  前半は既存参考書にほぼ乗っかっているので大丈夫と思いますが(著作権配慮し丸コピーはしていません)、後半は正しさを全く担保できず、勉強の為にも特にご意見下さい。

 また、現在twitterにてWebの勉強中です(@kisihara_c)。よければ色々教えて下さい。

主要参考文献