はてなキーワード: E+とは
ttps://twitter.com/hisayo_w000/status/1350801173595316224
ttps://www.instagram.com/croquiscafe/
https://e-hentai.org/g/1383297/605020f175/
https://e-hentai.org/tag/parody:getsuyoubi+no+tawawa
月曜日のたわわ
ttps://chan.sankakucomplex.com/?tags=himura_kiseki%20order%3Apopular
https://e-hentai.org/g/1568331/7eb9441874/
https://e-hentai.org/g/1520949/67a7887ed5/
[よー清水]「キャラの背景」描き方教室 CLIP STUDIO PAINTで描く! キャラの想いを物語る風景の技術
https://e-hentai.org/g/1511811/c6c1574bad/
[isuZu] プロが教える!CLIP STUDIO PAINT PROの教科書
ttps://e-hentai.org/g/1483978/1f6473e191/?p=4
ttps://e-hentai.org/g/1508441/aa361ba353/
ttps://e-hentai.org/g/1581326/3fc1dc150a/
ミカピカゾ
ttps://danbooru.donmai.us/posts?tags=mika_pikazo
ミカピカゾ2
ttps://e-hentai.org/g/1489415/90f6b1c158/?p=2
ttps://e-hentai.org/?f_cats=34&f_search=megami+magazine&advsearch=1&f_sname=on&f_stags=on&f_spf=&f_spt=
ttps://e-hentai.org/g/1353102/869b408c7e/
ttps://e-hentai.org/g/1338066/466687e162/
ttps://e-hentai.org/g/1526505/50eed6bb19/
ttps://e-hentai.org/g/1559166/2b371b13b1/
ttps://e-hentai.org/g/562431/389777fa90/
ttps://danbooru.donmai.us/posts?page=4&tags=love_live%21+official_art+
ttps://danbooru.donmai.us/posts?tags=atelier_%28series%29+official_art
ttps://danbooru.donmai.us/posts?page=1&tags=hibike%21_euphonium+official_art
ttps://danbooru.donmai.us/posts?page=1&tags=tamako_market+official_art
ttps://danbooru.donmai.us/posts?page=1&tags=k-on%21+official_art+
ttps://yande.re/post?page=1&tags=houkago_no_pleiades
ttps://yande.re/post?page=1&tags=fantasista_doll
ttps://e-hentai.org/g/1076222/6a007e40b0/
ttps://yande.re/post?tags=disc_cover
ttps://danbooru.donmai.us/posts?tags=mandrill
mandrill氏イラスト集
ttps://danbooru.donmai.us/posts?tags=kantoku
ttps://danbooru.donmai.us/posts?tags=kanzaki_hiro
ttps://danbooru.donmai.us/posts?tags=namori
ttps://danbooru.donmai.us/posts?page=1&tags=nardack
ttps://chan.sankakucomplex.com/?tags=hanamura_mai%20order%3Apopular
hanamura mai
ttps://chan.sankakucomplex.com/?tags=narumi_arata%20order%3Apopular
arata narumi
ttps://chan.sankakucomplex.com/ja/?tags=monable
monable
ttps://chan.sankakucomplex.com/ja/?tags=mokyu
mokyu
ttps://chan.sankakucomplex.com/ja/?tags=mmu
ttps://chan.sankakucomplex.com/ja/?tags=utako_yukihiro
ttps://chan.sankakucomplex.com/?tags=non-web_source%20order%3Apopular
ttps://chan.sankakucomplex.com/?tags=dengeki_girl%27s_style%20order%3Apopular
ttps://danbooru.donmai.us/posts?tags=whoisshe
whoisshe
ttps://danbooru.donmai.us/posts?page=2&tags=anmi
ttps://danbooru.donmai.us/posts?tags=tiv
tiv
ttps://danbooru.donmai.us/posts?tags=misoni_comi
misonikcomi
ttps://yande.re/post?page=3&tags=shirabi
shirabi
ttps://yande.re/post?page=2&tags=range_murata
ttps://danbooru.donmai.us/posts?page=1&tags=ataruman
ataruman
ttps://yande.re/post?page=1&tags=cuteg
cuteg
ttps://yande.re/post?page=3&tags=oyari_ashito
ttps://danbooru.donmai.us/posts?page=1&tags=kuroboshi_kouhaku
ttps://danbooru.donmai.us/posts?page=1&tags=momoko_%28momopoco%29
ttps://danbooru.donmai.us/posts?tags=necomi
necomi
ttps://e-hentai.org/g/1515496/7385b962a1/
幻像黒兎
ttps://danbooru.donmai.us/posts?tags=naruko_hanaharu
ttps://danbooru.donmai.us/posts?page=6&tags=narumi_arata
鳴海アラタ
ttps://danbooru.donmai.us/posts?page=1&tags=nishihara_isao
いさお
ttps://danbooru.donmai.us/posts?tags=shigure_ui
しぐれうい
ttps://danbooru.donmai.us/posts?page=1&tags=nekometaru
ttps://danbooru.donmai.us/posts?tags=himura_kiseki
月曜日のたわわ
ttps://danbooru.donmai.us/posts?tags=u_jie
ttps://danbooru.donmai.us/posts?page=1&tags=kkuem
kkuem
ttps://danbooru.donmai.us/posts?tags=mery_%28yangmalgage%29
ttps://danbooru.donmai.us/posts?page=1&tags=akizone
akizone
ttps://danbooru.donmai.us/posts?tags=kagawa_yuusaku
香川悠作
ttps://ocolorboard.tumblr.com/
ocolorboard
ttps://danbooru.donmai.us/posts?page=1&tags=lf
If
ttps://danbooru.donmai.us/posts?page=1&tags=handheld_game_console+official_art+
ttps://danbooru.donmai.us/posts?tags=heart_hands
ttps://chan.sankakucomplex.com/?tags=shopping+order%3Apopular+%E5%85%AC%E5%BC%8F%E3%82%A2%E3%83%BC%E3%83%88&commit=Search
買い物シチュエーション
ttps://danbooru.donmai.us/posts?page=1&tags=undressing+official_art+
ttps://danbooru.donmai.us/posts?tags=novel_illustration
ttps://danbooru.donmai.us/posts?tags=hiota_no_kanojo_ga_ore_no_motteru_eroge_ni_kyoumi_shinshin_nandaga......
ttps://danbooru.donmai.us/posts?page=492&tags=multiple_girls+official_art+
https://e-hentai.org/g/1393321/d6d6ceb56b/
https://e-hentai.org/g/1211889/df9210a0f8/
https://e-hentai.org/g/1307324/9b7765cdb4/
■仕事が来たという報告があったサイト 他に情報が上がれば随時追加
・アイラブユーカンパニー ttp://www.iloveyou-company.com/
・Arrows ttp://www.arrows-g.jp/
・アンシャントマン ttp://www.mangaculture.com/
・S-TRIVE ttp://s-trive.com/
・オートクチュール ttp://hautecouture.jp/
・Ga-show ttp://ga-show.co.jp/";
・クラウドゲート ttp://www.crowdgate.co.jp/
・QBIST ttps://www.qbist.co.jp/
・クラウドグラフィックス ttp://crowdgraphics.jp/
・クリークアンドリバー ttp://www.cri.co.jp/
・サイドランチ ttp://www.sideranch.co.jp/
・スカイリンク ttps://sky-link.co.jp/
・スタジオハードデラックス ttp://www.hard.co.jp/
・Skillots ttp://www.skillots.com/design/
・テクノアート ttp://technoart-tokyo.com/
・デジタルハーツ ttp://www.digitalhearts.co.jp/
・デジタル職人 ttp://digishoku.co.jp/
・トゥーザワールド ttp://totheworld.jp/
・PANDAGRAPHICS ttp://panda-graphics.net/
・Permission ttp://www.permission.co.jp/
・フロンティアエージェント ttp://www.frontier-agent.co.jp/
・BookLive Artstudio ttp://booklive.co.jp/artstudio/
・フーモア ttp://whomor.com/
・マグノリアファクトリー ttp://magnolia-factory.com/
・水野プロダクション ttp://www.mizunopro.co.jp
・ムゲンアップ ttps://station.mugenup.com/
・ベアトリックス ttp://www.beatrixx.co.jp/
・ロータス ttp://www.lotus-creative.net/
・ロフトワーク ttp://www.loftwork.jp/
・Wakka ttps://www.wakka-illustorder.com/
・キュートロン ttp://www.qtron.jp/index.html
・ex-design ttp://www.exdesign.info/
・Asian Bridg ttp://graphics.asianbridge.jp/
・ツジヒール ttp://tsujiheal.com...contact/recruit.html
・シリコンスタジオ ttp://www.siliconstudio.co.jp/
・Lavan7(マエストロ?) ttp://maestro-work.com/
・フロンティアクリエイターズプロジェクト(FCP) ttps://fw-fcp.jp/
261名無しさん@お腹いっぱい。2020/02/02(日) 21:51:40.21ID:eRB+DOb2
自分もツイとかシブやってなくて飛び込み面接でポートフォリオ持って仕事貰いに行ったわ
全くの素人(デッサン赤まみれレベル)だったけど普通に仕事貰えて今まで悶々としていたのは全て無駄だった事に気がついた
上手くなるには~とか、仕事受けられるレベルは~ってのは自分の妄想が混じる
263名無しさん@お腹いっぱい。2020/02/02(日) 22:07:41.75ID:wA0UU6Qz>>264
上手くなって何とかしようという発想しかねぇわ
264名無しさん@お腹いっぱい。2020/02/02(日) 22:20:28.70ID:eRB+DOb2
企業から「上手いです!仕事受けて貰えますか…!?」ってのを期待するのが勘違い
「なに?仕事欲しいの?…じゃあお前でもできる仕事これな」って感じでもいいから何か仕事する
SMS認証はまあいいんだけど認証コード取得のために登録したらすごい勢いで電話がかかってくる
おそらく音声ガイダンスなのだろうけどその電話番号で検索するとアダルトサイト請求とか出てくる
認証コード自体はショートメッセージで別の番号からくるのでユーザ的にその電話は必要なく
ユーザ体験としては「e+でSMS認証したら秒でアダルトの詐欺?から電話がかかってくる」
もしかして登録ページ自体が巧妙な偽物で水飲み場+フィッシング詐欺なのかな?と思ってしまったしそれを疑い始めると何を信じていいかわからなくなる
Googleで電話番号を検索すると1番上に「ワンクリック アダルトサイト請求(詐欺」と出てくるのでガセならe+は訂正なり何かの措置をとったほうがいいのでは?
node+typescript+react「何故私を無視する!」
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // int blocks[100][100]; BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; boxType = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); for(int x = 0 ; x < 100 ; x++) { for (int y = 0; y < 100; y++) { blocks[y][x] = 0; } } if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 100 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } int boxType; BOOL WriteBoxOLDBox() { int width = 24; HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48)); for (int y = 0; y < 30; y++) { for (int x = 0; x < 8; x++) { if (blocks[y][x] == 0) { continue; } RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); } } DeleteObject(hBrush); return FALSE; } BOOL WriteBox() { WriteBoxOLDBox(); switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } return TRUE; } BOOL WriteBoxZ() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxL() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) -1 ; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) -1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxI() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL SaveBoxI() { blocks[y ][x] = 1; blocks[y+1][x] = 1; blocks[y+2][x] = 1; blocks[y+3][x] = 1; return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 20) { switch (boxType) { case 0: SaveBoxI(); break; case 1: break; case 2: break; } y = 0; boxType++; if (boxType > 2) { boxType = 0; } } this->WriteBox(); return TRUE; } BOOL OnKey(WPARAM wParam) { if (wParam == VK_LEFT) { x++; } if (wParam == VK_RIGHT) { x--; } return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(wParam); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
テトリス風
落ちてくるブロックの描き方
まずはブロックの種類は3種類
の違いをよく見比べて
自力で違いがわかれば
プログラマーにはなれるとおもう
とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな
BOOL WriteBox() { switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } }
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; boxType = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } int boxType; BOOL WriteBox() { switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } } BOOL WriteBoxZ() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxL() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) -1 ; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) -1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxI() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 8) { y = 0; boxType++; if (boxType > 2) { boxType = 0; } } this->WriteBox(); return TRUE; } BOOL OnKey() { x++; return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
一気に並べてみる
int i; int space; for (int i = 0; i < 8; i++) { for (space = 0; space < i; space++) { printf(" "); } printf("Hello world\n"); }
すまん <は半角の<に置き換えてくれ(w)
int i; int space; char buffer[8]; char buffer2[8]; memset(buffer, 0, 8); memset(buffer2, 0, 8); for (int i = 0; i < 8; i++) { memset(buffer, 0x20, i); printf("%sHello world\n",buffer); }
int i; int space; char buffer[8]; char buffer2[8]; memset(buffer, 0, 8); memset(buffer2, 0, 8); for (int i = 0; i < 8; i++) { buffer[i] = 0x20; printf("%sHello world\n",buffer); }
この場合は特に影響はないが一般的にはmemsetを使う使わないは大きな影響になるので
std::string space; for (int i = 0; i < 8; i++) { printf("%sHello world\n", space.c_str()); space += " "; }
std::string space_org; for (int i = 0; i < 8; i++) { std::string space = space_org + " "; printf("%sHello world\n", space.c_str()); space_org = space; }
ざつにかんがえても 書き方いろいろ
つまり まぁ どれがいいというよりは
状況に応じてかき分けていく必要がある
学校の授業などだと
アルゴリズムの話で
ヒープソート マージソート クイックソートの比較みたいな話があるけど
そこまで難しい話にいかなくても
書き方がたくさんある
3つともおなじ
int i; int space; for (int i = 0; i < 8; i++) { for (space = 0; space < i; space++) { printf(" "); } printf("Hello world\n"); }
すまん <は半角の<に置き換えてくれ(w)
int i; int space; char buffer[8]; char buffer2[8]; memset(buffer, 0, 8); memset(buffer2, 0, 8); for (int i = 0; i < 8; i++) { memset(buffer, 0x20, i); printf("%sHello world\n",buffer); }
int i; int space; char buffer[8]; char buffer2[8]; memset(buffer, 0, 8); memset(buffer2, 0, 8); for (int i = 0; i < 8; i++) { buffer[i] = 0x20; printf("%sHello world\n",buffer); }
書き直すごとにアルゴリズムがちょっとづつ良くなったり悪くなったり
どれがすき?
int i; int space; for (int i = 0; i < 8; i++) { for (space = 0; space < i; space++) { printf(" "); } printf("Hello world\n"); }
すまん <は半角の<に置き換えてくれ(w)
====
Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world
どうも、元アイマスPです。
グッズの類が大量に残っていますが、まぁいずれ処分するでしょう。
今回このブログを書こうと思ったのは、私のとある胸糞悪い経験を吐き出しておきたかったのと、これを見たPさん、あるいはアイドルマスターに限らず、いわゆる課金系アプリゲームをプレイしてる全ての人に表題の内容を問いかけたいからです。
課金ゲームにおける「愛」は結局課金でしか測れないのか?という事
アイマス風の言い方をすれば
という事です。
事の発端は2年前、私がサークルの先輩からアイドルマスターを勧められた事に始まります。
私はどちらかというとオタク系コンテンツはそれなりに嗜んでいたのでアイマスもすぐにはまり、のめり込んでいきました。
アニマスから入り、劇場版で気になった後輩の子達を見てミリオンライブを始め、シンデレラガールズ、SideMと次々にどハマりしていきました。
改めて説明するまでもないと思いますが、アイマスにはゲームとライブがあります。ゲーム内のガシャを回し、イベントを走って担当のSRカードをゲットする。ライブで声優さんのパフォーマンスを見て感動して「アイマス最高」と唱える(笑)まぁそんな感じで各々楽しんでると思います。
コンテンツを応援するにはいろんな方法があります。ゲームに課金する、ライブに参加する、グッズを買う、二次創作をしてみる。
楽しみ方は本来人それぞれであり、それぞれがそれぞれの形で趣味を謳歌しています。
学生のアルバイトでは月々稼げる金額はどんなに頑張ってもたかが知れています。
どんなに頑張っても、社会人が月々稼げる金額になど到底及ばない事は想像に難くないでしょう。
アイマスを含めいわゆるソーシャルゲームには「天井」が設けられていることが多いです。
ガシャなどで「この金額までつぎ込めば必ず目当てのカードが手に入りますよ。」というボーダーラインだ。
ゲームにもよるがアイマスは大体ソシャゲの方は5万くらい、音ゲーアプリの方だと10万程度だろうか。
それ以上を稼ぎ出せたりお小遣いをもらっていたりと状況は様々だがこの金額を毎月叩き出せる人は全国でもそんなにいないだろう。
さらにイベントでランキング上位に到達するためにも上記レベルの課金はある程度必須と言っていい。
私は各コンテンツ(当時3つ)毎に「担当(他のコンテンツで言うところの「推し」)が複数人いた。
一人がイベントないしガシャで来たら5〜10万ぶっ飛ぶのである。
しかもそれが複数人いると言うことは数ヶ月に一回レベルでその出費、ましてやイベントが重なろうものなら倍プッシュである。
どんなにバイトを増やして掛け持ちしても追いつけるものではない。
そもそもバイトを増やしたら肝心の学業遊び就活諸々に支障が出る。
ライブなら事前に日程が設定されているのでそれに向けて貯金ができる。
ライブを通じて金銭面でも、気持ち的にも担当やコンテンツを応援できる。
そう思っていた。
だが、アイマスを布教してくれた先輩(仮にN氏としよう)は違った。
彼は社会人である。しかもどうやらそこそこ良い仕事をしていると見られる。
毎月のように一定数の金額を彼の担当のガシャやイベントに費やし、コンスタントに入賞していたところを見ると間違いない。
彼はいわゆる「ライブ勢」が大嫌いで、「声優のライブを見て何が面白いんだ」
「こいつらは声優オタとしては一流だがアイマスPとしては三流」
などと事あるごとにこき下ろしていた。
まぁ、いわゆる「在宅」というやつである。
彼はサークルのOBでオタク仲間の中の中心的な存在だったため、同期後輩もなかなか彼に意見する事は難しかった。
それを知ってか知らずか、彼はその集まりの中で二言目には「プロデューサーの流儀」を語りたがり、「コンテンツに課金できない奴は三流のにわか」という定説を偉そうに唱えていた。
私はミリオンライブが初めて触れたアイマスだったため、イベントの走り方など分からず、中途半端な課金額で爆死するということを繰り返していた。
といっても前述した通り、学生にとっての大金を定期的にぶち込めるなんて暴挙ができるわけがないので突然イベントが告知されて担当が上位報酬に来てさぁ走れと言われたって走れるわけがない。
突然の出費もある、月々のいろんな支払いがある。それを社会人と比べれば微々たるお金の中で工面してるのだ。趣味であるゲームに対する優先順位なんて、お察しである。
それでもなんとか工面したお金をつぎ込んだところで結果は散々たるものだった。それを知ったN先輩は事あるごとに
「お前の担当愛はその程度なのか?」
「中途半端な事しかできなくて担当に申し訳ないと思わないのか?」
「おい爆死野郎w」
とバカにしてきた。
自分は担当が本当に好きだったからそれなりに調べてるし、イベントも出来る限り追ってるし、二次創作を出してみたりもした。何よりライブは担当が出演すると分かれば必ずCDを積んだり、e+に殴りこんだり、最悪友達を頼ってでも必ず参加した。極力現地で。
そんな漠然とした疑問が胸の内を占めていた。
だが、所詮趣味だし、好きでやっている事だからと気に留めていなかった。
大学を卒業した私はサークルの追い出しコンパ(追いコン)に参加した。
1年生から4年生まで数十人という大規模な追いコンで、サークルで顔を合わせるけど名前は知らない後輩も数多くいた。
N先輩も参加していた。
追いコン事態は順調に進み、最後に4年生が一人ずつ挨拶をするときに事件は起きた。
自分の番になった時にN先輩が
「よっ!三流クソにわかP!」
「爆死野郎!」
と大声で叫んでいたのだ。
みんなに聞こえる声で
流石に私も堪忍袋の緒が切れた。
いくらなんでも後輩が何十人もいる前でそんなこと言わなくても良いじゃないか
その時は笑って流したが、後日、新歓のミーティングに顔を出していたN先輩に詰め寄り、あの時の発言の意味を説明し、訂正して欲しい。本気で恥ずかしかったんだからみんなの前で謝罪してほしいと訴えた。
すると、彼の隣にいた別の先輩(A先輩とする)が顔を真っ赤にして怒り、怒鳴り散らし始めたのだ。
彼の主張を要約すると以下の通りである。
・先輩に向かってその態度はなんだ。
・大勢の前で生意気な態度を取ったお前もNの事を貶めている。お前にNを断罪する資格などない。お互い様だ。
・そもそもアイマスにおいて何を持って担当とするかなんて人それぞれで明確な基準などない。お前の主義主張を押し付けるな。
私はとても惨めな気持ちになった。
私はただ、あの時の発言を取り消して欲しかっただけで、せめてみんなの前で謝って欲しかっただけなのに…
するとA先輩の怒りっぷりを見たN先輩はへらへらと笑いながらA先輩をなだめ、以下のような主張を始めた。
・酒の勢いで言っただけだ、気にするな。
・お前が○○(私の担当)をいかに愛してるのかはみんながよく知っている。
・なのにも関わらずイベントの走り方が下手くそだから私はそれをいじってるだけ
・自分は昔ライブ専門でゲームに全く金を落とさない同期に「お前はだから三流なんだ」と言われたことが本当に悔しかった。お前にそうなって欲しくないからああやって言ってあげてたんだ。
彼の口から、最後まで「後輩数十人の前で私の名誉を貶めた事に関する謝罪の言葉」はありませんでした。
これを期に私はアイマスから遠のきました。百年の恋も冷める瞬間とはこの事なのでしょう。
アイマスPは課金額で他人にマウントを取り合うような人間しかいないんだなぁ
こんなデータがクラッシュしたら吹っ飛ぶ画像にうん万円も賭けなきゃ担当名乗る資格がないのが、Pの常識なんだなと察してしまいました。
ここまでの話を聞いて
「増田が考えすぎ気にしすぎ。」と思う人が大半なのではないかと思います。
ですが、私がこの件について許せないのはそこだけではないのです。
そう、中の人である種田梨沙さんが昨年活動を休止されて、ミリシタでの実装が大幅に遅れた、あの田中琴葉です。
私は、声優さんの不在によって琴葉の存在がだんだん希薄になっていく事をずっと悩んでいました。
4th Liveでも現地で感じた「琴葉が置いていかれてるのではないかという不安」にずっと悩まされていました。(最後のThank youでそれが解消され、安心から大泣きしてしまいましたが笑)
ちょうど就職活動中だった事もあり、イベントになかなか課金ができず、どうすれば琴葉を応援できるのか、どうしたらミリシタから入ったPさんに琴葉がここにいると示すことができるのか、ずっと悩んで、苦しんで、精神をかなり病みましたがそれでも2月に琴葉がミリシタに実装されてやっとこれからなんだと思いました。
自分も就職が決まり、やっとこれから琴葉にたんまりお金を使ってあげられる、本気でプロデュースできると思っていました。
その思いを、悩み抜いた思いの全てを、N先輩はみんなの前で汚い足で踏みにじったのです。「課金額が少ない」「ゲームに投資してない」たったそれだけの理由で。
もう一度言いますが、わたしはライブを中心にお金を落としています。
でも、それ以外に一切お金をかけていないということではありません。そんなこと有り得ません。
グッズも買ってるしCDだって全て新品で揃えたし肝心のゲームにだって課金してます。
学生時代はイベント時に1,2万が限度でしたがそれでも担当が来たら必ず走って回すようにしてます。
それでも足りないのでしょうか。
担当が取れなかったらその時点でP失格なのでしょうか。
私はあの日大勢の前で3流にわかと罵られないといけなかったのでしょうか。
5thは一応参加しました、最高でした。
あんな辱めに公開処刑まで受けては大学の後輩や同期に顔向けできないからです。
いまだにガシャやイベントが来るたびにN先輩の言葉が、あの日の恥ずかしさ惨めさが胸をよぎって、まっすぐアイマスを愛することができないからです。
もうすでに周囲には引退を伝えました。
今PHPと言えばLaravel1強だけれど、単にJson返すだけのwebapi作るだけならNode+Expressの方が楽なんだよな。
コード的にはほぼ一行だったりするし。
http://b.hatena.ne.jp/entry/s/co3k.org/blog/why-do-you-use-jwt-for-session
と厳しい叱責を受けたため、無能の見識を書いてみた。
「聞くは一時の恥、聞かぬは一生の恥」のとおり、
せっかくの機会のため、びしばしセキュリティに関する認識の甘さを指摘してほしい所存
作ったシステムではexpは約1時間でやってしまいました(機密保持契約違反を恐れ多少ぼかしております)
確認している間に1時間はかかるからいいやと思ってしまっていた
師はきっとJWT生成直後3秒でユーザーが
と気づいて通報
そして師が2秒で
「これは、セッションハイジャックだ!」
と検知してセッション遮断、秒速で一億円の被害が出るところを阻止する前提なのではないかと推測している
これは確かにJWTだと厳しそうだ
セッションを任意に切れることに意味はないのでは、と思えてきたが、浅はかだろうか
(師はログインを即座に検知してセッションを切れるから問題ないのか)
とにかくアカウントロック機能を作れば上記の懸念全てにきれいに対応できそうに見えている
この理屈だと例えば.envに書くような他のkeyも定期的な交換が必要に見える
これはまずい、自分の今までの見識の甘さを思い知らされた
keyは初回に設定したのみで、定期的な交換を勧める文が見つからない
私の検索力不足なのかと思ったが、もしかして彼らもこの危険性に気付いていないのではないか
JWTはhash化してつないでいる前提で
解読時間は下記を参考に、計算はwindows10の電卓アプリを用いて手動で行った
https://ja.wikipedia.org/wiki/%E7%B7%8F%E5%BD%93%E3%81%9F%E3%82%8A%E6%94%BB%E6%92%83
英数字大文字小文字で約60の時は10桁で20万年と書いているが
現代の解析技術は20万倍は速度が出ると仮定して1年として計算する
日本語に直すと60京4661兆7600億年かかる計算となった
実際にはこれが6.0466176e+17倍されさらに3600倍されつまりどういうことだ
そもそも師は何年で交換したら安全と書いていないが、何年なら安全という意見だったのだろうか
私の理解ではとかくuser_idのみ必要なら意味がないと思っていたため落ち込んでいる
まず、IDとpassを内蔵するネイティブアプリに対するapiサーバでの実装経験しかないこと
JWTが切れたら都度IDとpassを投げる方向でリフレッシュトークンは実装しなかったことを告白しておく
そのためapiサーバで上記前提で用いた場合に考えたことを書く
webアプリのJWT実装経験はないので、そちらの論は差し控えさせていただく
では危険で
JWT送信→セッション(cookie形式?)送信切り替え→セッションからuser_id取得
とりあえず思いついたのは下記だった
tokenはheaderにbearerで付けユーザーID(あるいはそれに代わる特定可能な識別子)が含まれる
httpsで通信するのでパケットキャプチャによる傍受は不可能と思っていた
(httpで通信するのはJWTとかcookieとか関係なく傍受できるため考慮しない)
0に何をかけても0なので、何回送っても解読されないならJWTを何回送っても問題ない
というかJWTが抜けるなら同様にheaderに付けるcookieでも抜けると思うので
JWTだからといって危険性に差はない、という論拠により安全性は変わらないという個人的結論になった
※余談だが、たまに送る回数が少ない方が安全という
攻撃者がアプリに保存されたJWTが取得できるならIDもpassも同じ方法で抜けそうに見えた
(厳密には保存場所が違ったかもしれんが実装依存なので同一とする)
その前提のため、わざわざ
JWT送信→セッション(cookie形式?)送信→セッションからuser_id取得
で接続しても、おそらくcookie形式で送れる何かもJWTらと同じ方法で抜かれると思われる
つまりcookieだろうがJWTだろうがアプリから直接情報が抜かれる危険性には変わりがないという結論になった
つまりcookieだろうがjwtだろうがidとpasswordの組だろうが同じ危険性で抜かれる可能性があり、いずれでも同じことができるなら
JWT→user_id
でいいじゃん、わざわざcookieと同様の形式を間に挟むの無駄じゃん、となりコメントの発言に至った
ここまで書いて、常にJWTにsession_idを含めておいて送ることを意図されていた可能性にも気づいたが
セッションにするメリットとして唯一思いついているのは任意にサーバ側でセッションを切れることだが
それを指していたのであろうか
余談だが、ブコメの雰囲気に日和って「ユーザーIDのみ入れ」(そもそもJWTを自然に作れば入るのだが)
というセッションストア的にJWTに他の情報を入れると入れない時に比べて危険性があがることに同意したような記載をしてしまったが
結局JWTが奪えたら中身に関係なくbearerとしてセットして接続するだけなので
正直JWTを使った時点でついでにセッションストアのように使おうが使わまいがセキュリティ的にそこまで変わらないのでは、と思っている
強いて上げるならセッションに保存している内容が分かる可能性があり、サーバー内部の実装が推測できる危険があるくらいだろうか
でも暗号化したらよいのでは、と思った
expを適切に設定しつつ、必要ならアカウントロック機能を入れる
(アカウントロック機能はJWTに関係なく被害の増加を抑えられる可能性がある)
少なくともapiサーバ→ネイティブアプリに関して、セッションIDを含めても危険性は変わらない
正直webアプリでも大して変わらんのでは、と思っているのは内緒である
どうも、元アイマスPです。
グッズの類が大量に残っていますが、まぁいずれ処分するでしょう。
今回このブログを書こうと思ったのは、私のとある胸糞悪い経験を吐き出しておきたかったのと、これを見たPさん、あるいはアイドルマスターに限らず、いわゆる課金系アプリゲームをプレイしてる全ての人に表題の内容を問いかけたいからです。
課金ゲームにおける「愛」は結局課金でしか測れないのか?という事
アイマス風の言い方をすれば
という事です。
事の発端は2年前、私がサークルの先輩からアイドルマスターを勧められた事に始まります。
私はどちらかというとオタク系コンテンツはそれなりに嗜んでいたのでアイマスもすぐにはまり、のめり込んでいきました。
アニマスから入り、劇場版で気になった後輩の子達を見てミリオンライブを始め、シンデレラガールズ、SideMと次々にどハマりしていきました。
改めて説明するまでもないと思いますが、アイマスにはゲームとライブがあります。ゲーム内のガシャを回し、イベントを走って担当のSRカードをゲットする。ライブで声優さんのパフォーマンスを見て感動して「アイマス最高」と唱える(笑)まぁそんな感じで各々楽しんでると思います。
コンテンツを応援するにはいろんな方法があります。ゲームに課金する、ライブに参加する、グッズを買う、二次創作をしてみる。
楽しみ方は本来人それぞれであり、それぞれがそれぞれの形で趣味を謳歌しています。
学生のアルバイトでは月々稼げる金額はどんなに頑張ってもたかが知れています。
どんなに頑張っても、社会人が月々稼げる金額になど到底及ばない事は想像に難くないでしょう。
アイマスを含めいわゆるソーシャルゲームには「天井」が設けられていることが多いです。
ガシャなどで「この金額までつぎ込めば必ず目当てのカードが手に入りますよ。」というボーダーラインだ。
ゲームにもよるがアイマスは大体ソシャゲの方は5万くらい、音ゲーアプリの方だと10万程度だろうか。
それ以上を稼ぎ出せたりお小遣いをもらっていたりと状況は様々だがこの金額を毎月叩き出せる人は全国でもそんなにいないだろう。
さらにイベントでランキング上位に到達するためにも上記レベルの課金はある程度必須と言っていい。
私は各コンテンツ(当時3つ)毎に「担当(他のコンテンツで言うところの「推し」)が複数人いた。
一人がイベントないしガシャで来たら5〜10万ぶっ飛ぶのである。
しかもそれが複数人いると言うことは数ヶ月に一回レベルでその出費、ましてやイベントが重なろうものなら倍プッシュである。
どんなにバイトを増やして掛け持ちしても追いつけるものではない。
そもそもバイトを増やしたら肝心の学業遊び就活諸々に支障が出る。
ライブなら事前に日程が設定されているのでそれに向けて貯金ができる。
ライブを通じて金銭面でも、気持ち的にも担当やコンテンツを応援できる。
そう思っていた。
だが、アイマスを布教してくれた先輩(仮にN氏としよう)は違った。
彼は社会人である。しかもどうやらそこそこ良い仕事をしていると見られる。
毎月のように一定数の金額を彼の担当のガシャやイベントに費やし、コンスタントに入賞していたところを見ると間違いない。
彼はいわゆる「ライブ勢」が大嫌いで、「声優のライブを見て何が面白いんだ」
「こいつらは声優オタとしては一流だがアイマスPとしては三流」
などと事あるごとにこき下ろしていた。
まぁ、いわゆる「在宅」というやつである。
彼はサークルのOBでオタク仲間の中の中心的な存在だったため、同期後輩もなかなか彼に意見する事は難しかった。
それを知ってか知らずか、彼はその集まりの中で二言目には「プロデューサーの流儀」を語りたがり、「コンテンツに課金できない奴は三流のにわか」という定説を偉そうに唱えていた。
私はミリオンライブが初めて触れたアイマスだったため、イベントの走り方など分からず、中途半端な課金額で爆死するということを繰り返していた。
といっても前述した通り、学生にとっての大金を定期的にぶち込めるなんて暴挙ができるわけがないので突然イベントが告知されて担当が上位報酬に来てさぁ走れと言われたって走れるわけがない。
突然の出費もある、月々のいろんな支払いがある。それを社会人と比べれば微々たるお金の中で工面してるのだ。趣味であるゲームに対する優先順位なんて、お察しである。
それでもなんとか工面したお金をつぎ込んだところで結果は散々たるものだった。それを知ったN先輩は事あるごとに
「お前の担当愛はその程度なのか?」
「中途半端な事しかできなくて担当に申し訳ないと思わないのか?」
「おい爆死野郎w」
とバカにしてきた。
自分は担当が本当に好きだったからそれなりに調べてるし、イベントも出来る限り追ってるし、二次創作を出してみたりもした。何よりライブは担当が出演すると分かれば必ずCDを積んだり、e+に殴りこんだり、最悪友達を頼ってでも必ず参加した。極力現地で。
そんな漠然とした疑問が胸の内を占めていた。
だが、所詮趣味だし、好きでやっている事だからと気に留めていなかった。
大学を卒業した私はサークルの追い出しコンパ(追いコン)に参加した。
1年生から4年生まで数十人という大規模な追いコンで、サークルで顔を合わせるけど名前は知らない後輩も数多くいた。
N先輩も参加していた。
追いコン事態は順調に進み、最後に4年生が一人ずつ挨拶をするときに事件は起きた。
自分の番になった時にN先輩が
「よっ!三流クソにわかP!」
「爆死野郎!」
と大声で叫んでいたのだ。
みんなに聞こえる声で
流石に私も堪忍袋の緒が切れた。
いくらなんでも後輩が何十人もいる前でそんなこと言わなくても良いじゃないか
その時は笑って流したが、後日、新歓のミーティングに顔を出していたN先輩に詰め寄り、あの時の発言の意味を説明し、訂正して欲しい。本気で恥ずかしかったんだからみんなの前で謝罪してほしいと訴えた。
すると、彼の隣にいた別の先輩(A先輩とする)が顔を真っ赤にして怒り、怒鳴り散らし始めたのだ。
彼の主張を要約すると以下の通りである。
・先輩に向かってその態度はなんだ。
・大勢の前で生意気な態度を取ったお前もNの事を貶めている。お前にNを断罪する資格などない。お互い様だ。
・そもそもアイマスにおいて何を持って担当とするかなんて人それぞれで明確な基準などない。お前の主義主張を押し付けるな。
私はとても惨めな気持ちになった。
私はただ、あの時の発言を取り消して欲しかっただけで、せめてみんなの前で謝って欲しかっただけなのに…
するとA先輩の怒りっぷりを見たN先輩はへらへらと笑いながらA先輩をなだめ、以下のような主張を始めた。
・酒の勢いで言っただけだ、気にするな。
・お前が○○(私の担当)をいかに愛してるのかはみんながよく知っている。
・なのにも関わらずイベントの走り方が下手くそだから私はそれをいじってるだけ
・自分は昔ライブ専門でゲームに全く金を落とさない同期に「お前はだから三流なんだ」と言われたことが本当に悔しかった。お前にそうなって欲しくないからああやって言ってあげてたんだ。
彼の口から、最後まで「後輩数十人の前で私の名誉を貶めた事に関する謝罪の言葉」はありませんでした。
これを期に私はアイマスから遠のきました。百年の恋も冷める瞬間とはこの事なのでしょう。
アイマスPは課金額で他人にマウントを取り合うような人間しかいないんだなぁ
こんなデータがクラッシュしたら吹っ飛ぶ画像にうん万円も賭けなきゃ担当名乗る資格がないのが、Pの常識なんだなと察してしまいました。
ここまでの話を聞いて
「増田が考えすぎ気にしすぎ。」と思う人が大半なのではないかと思います。
ですが、私がこの件について許せないのはそこだけではないのです。
そう、中の人である種田梨沙さんが昨年活動を休止されて、ミリシタでの実装が大幅に遅れた、あの田中琴葉です。
私は、声優さんの不在によって琴葉の存在がだんだん希薄になっていく事をずっと悩んでいました。
4th Liveでも現地で感じた「琴葉が置いていかれてるのではないかという不安」にずっと悩まされていました。(最後のThank youでそれが解消され、安心から大泣きしてしまいましたが笑)
ちょうど就職活動中だった事もあり、イベントになかなか課金ができず、どうすれば琴葉を応援できるのか、どうしたらミリシタから入ったPさんに琴葉がここにいると示すことができるのか、ずっと悩んで、苦しんで、精神をかなり病みましたがそれでも2月に琴葉がミリシタに実装されてやっとこれからなんだと思いました。
自分も就職が決まり、やっとこれから琴葉にたんまりお金を使ってあげられる、本気でプロデュースできると思っていました。
その思いを、悩み抜いた思いの全てを、N先輩はみんなの前で汚い足で踏みにじったのです。「課金額が少ない」「ゲームに投資してない」たったそれだけの理由で。
もう一度言いますが、わたしはライブを中心にお金を落としています。
でも、それ以外に一切お金をかけていないということではありません。そんなこと有り得ません。
グッズも買ってるしCDだって全て新品で揃えたし肝心のゲームにだって課金してます。
学生時代はイベント時に1,2万が限度でしたがそれでも担当が来たら必ず走って回すようにしてます。
それでも足りないのでしょうか。
担当が取れなかったらその時点でP失格なのでしょうか。
私はあの日大勢の前で3流にわかと罵られないといけなかったのでしょうか。
5thは一応参加しました、最高でした。
あんな辱めに公開処刑まで受けては大学の後輩や同期に顔向けできないからです。
いまだにガシャやイベントが来るたびにN先輩の言葉が、あの日の恥ずかしさ惨めさが胸をよぎって、まっすぐアイマスを愛することができないからです。
もうすでに周囲には引退を伝えました。
https://anond.hatelabo.jp/20180618192659
3個芝の例を見つけたぞ低能www
たぶん同じことを何度も言わせるとそのたびに増えていく感じだぞ低能www
「NEW GAME+++」みたいな感じだなwww