yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

チケット購入サイトeplusのログインシステムのバグ

はじめに

知り合いに増矢馨子さんというピアニストの方がいる。

www.kaorukomasuya.com

  • Webページはどうやら更新されていない

で、今度、10/10に室内楽のコンサートがある。

web.archive.org

それのチケットがいつもと違ってチケットぴあではなくeplusだったので、会員登録をすることにしたのだ。

eplusのここがまずだめ

  • ログイン中かわからない
  • ログアウト方法がないor不明瞭
  • ログインしててもチケット購入のときはまたログインさせられる

eplus.jp

訪れればわかる、この糞of糞感。

本題

会員登録を無事に終え、チケット購入をしようとしたら、ログインを求められた、ログインしてるのに。でそれはとりあえずスルーして、ログインができない。

www.youtube.com

リアルキーボードクラッシャーやって、隣りにいた母親に怒られた。

原因

セキュリティをちょっとわかる勢C++erである私は当然KeePassでパスワードを自動生成した。しかしその自動生成したパスワードの長さが20文字だった。

eplus pass word change

パスワード登録画面には、

8文字以上16文字以下

という記述がある。

おかしい

いやちょっとまって、最初の登録の時に20文字ぶち込んでもなにもエラーにならなかったぞ、つまり入力フォームのValidationをしていない・・・?

検証したところ、登録時にいれた20文字の末尾が削られて16文字として登録されていた。

送信部分のソースコードを見てみる

幸いいかにもレガシー感漂うこのサイトのJavaScriptはminifyされていなかった。しかもHTML直書きだった。わぉ。

まずは登録フォームのほう。

$(document).ready(function() {
    // Validatorクラスのインスタンスを生成する。
    // 引数は入力チェック対象となるフォームのjQueryオブジェクト
    var validator = new Validator($('#registerMemberForm'));

    // 項目に必須属性を追加する
    var requiredFields = [];
    $('em.required').each(function() {
        if($(this).attr('epName')){
            var fields = $(this).attr('epName').split(",");
            $.each(fields,function(i,val){
                var field = $('input[name="' + val + '"]');
                if(field.length != 0){
                    requiredFields.push(field);
                }
                var field = $('select[name="' + val + '"]');
                if(field.length != 0){
                    requiredFields.push(field);
                }
            });
        }
    });

    validator.required(requiredFields);

    // ValidatorForHanyoKomokuインスタンス生成
    var validatorForHanyoKomoku = new ValidatorForHanyoKomoku("/api/v1/FTRegisterMember/hanyoKomokuCheck");

    // 確認ボタン押下
    $("#main-submit").on('click', function() {

        // 入力チェック前にアコーディオンが閉じられていた場合、入力チェック用にcss変更.非表示の場合にvalidation対象外になってしまうため
        var accordionChange = false;
        var detailsBox = $("#registerMemberForm .accordionBox .detailsBox");
        if(detailsBox.css('display') == 'none'){
            detailsBox.css('display','block');
            accordionChange = true;
        }

        // 入力チェックを実行する。
        var validError = validator.validate();
        var hanyoError = validatorForHanyoKomoku.validate();

        // cssを元に戻す
        if(accordionChange){
            detailsBox.css('display','none');

            // アコーディオン内に入力エラーがあった場合は開いて表示
            if(detailsBox.find(".errorCell").length != 0){
                accordionBoxChange(true);
            }
        }

        if(!validError || !hanyoError){
            window.scrollTo(0,dispErrorObj.offset().top);
            return false;
        }

        // 汎用項目のAJAX送信用パラメータを設定(リスト化された項目がパラメータ設定されないためここで設定.ajaxPostForFormではvalueListがString配列であることが特定できないためvalidateのjsに処理を記載)
        var param = {};
        param.soshikiHanyoKomokuSetList = validatorForHanyoKomoku.get();

        // 事前チェックでOKなら確認画面へ
        $.ajaxPostForForm(contextpath + "/api/v1/FTRegisterMember/updateCheck", $('#registerMemberForm'),param)
        .done(function(data, status, xhr, infoMessages, hasWarnings, warnMessages, hasErrors, errorMessages) {
            var res = $.parseJSON(xhr.responseText);
            if (res.isSuccess) {
                // 遷移する。
                $.doSubmit($("#registerMemberForm"), {
                    op : "startInitConfirmMemberInfo"
                });
            }
            else {
                // エラー時はダイアログ表示
                $.infoMsgBox(res.msgs[0].msg);
            }
        });
    });
    //後略
});

あれ、Validationあるじゃん。

次はパスワード変更ページ。

$(document).ready(function(){
    // 必須属性付与
    var validator = new Validator($('#updatePasswordForm'));
    validator.required([$('input[name="newPassword"]'), $('input[name="passwordConf"]')]);

    // 変更
    $('#update').click(function (e) {
        // 入力チェック
        if (!validator.validate()) {
            window.scrollTo(0,dispErrorObj.offset().top);
            return false;
        }
        $.doSubmit($("#updatePasswordForm"), {op : "startInitComplete"});
    });
});

あれ、Validationあるじゃん。ちなみに処理を追いきれなかったが、おそらく^[0-9a-zA-Z_\-@.]{8,16}$という正規表現で確認している。

しかし、会員登録ページのほうは16文字を超えても受け付けてしまう

結論

会員登録ページのValidationバグ

追記:これは仕様だと主張するeplus

お問い合わせフォーム投げつけてたんだが、メールが帰ってきた。

[Incident: 171007-000343]
本メールの一部または全文をSNS等へ掲載、二次利用する事はお断りいたします。

とか言ってるが、引用は妨げられないはずなので引用すると

[Incident: 171007-000343]
16文字を超えるパスワードがご入力できる状況となっております。 なお、こちらは弊社e+サイトでの仕様となり、障害等ではございません。

いや、だからその仕様がバグってるって言ってるんですがねぇ・・・。

ねちっこく、もう一度お問い合わせフォームに投げつけました。

追記:これは不正アクセス防止だと主張するeplus

メールが帰ってきた。

[Incident: 171021-000375]
パスワードにつきましては不正アクセス防止のため、 桁数を把握されないよう、16桁以上での設定を可能としています。

・・・はい?不正アクセス防止??

ちょっと私の知識では追いつけないのでぐぐったところ

upa-pc.blogspot.jp

がヒットした。

入力文字数が明記されていると、不正にログインをしようと考えている攻撃者にヒントを与えてしまいます。

やっぱり何を言っているのか分からねぇ。

eplus register password

そもそも登録フォームにはplaceholder="8文字以上16文字以下"とあって、明確にパスワードの長さを指定しているわけで、ヒントもクソもねーと思うんですが。

でよしんば書かれていなかったとして、不正アクセス防止効果はあるんでしょうか?
辞書攻撃にせよブルートフォース攻撃にせよ、長さの短いものから試行していくわけで、無意味ではないかと思ってしまうんですが(無知)

追記:と思ってたら @BlackWingCat 氏が教えてくれた。

追記: どうもValidationが有効になったぽい

追加検証は気力がない(大学の実験レポート終わらない)のでやりません。

chromeにWebUSBが実装されたそうだが危険らしいので無効にする

先日こんなふうに大量にWebUSBやばいぞ的なツイートが流れていた。実のところ私はさっぱり理解していない。とりあえずなんかdescriptorsが云々言っているので、規格書の該当箇所を見に行く。

WebUSB API#webusb-platform-capability-descriptor

§4. WebUSB Descriptors and Requests

This specification defines descriptors and commands the UA MAY use to gather information about the device specific to implementing this API.

§4.1. WebUSB Platform Capability Descriptor

A device announces support for the WebUSB command set by including the following Platform Descriptor in its Binary Object Store:

Offset Field Size Value Description
0 bLength 1 Number Size of this descriptor. Must be set to 24.
1 bDescriptorType 1 Constant DEVICE CAPABILITY descriptor type ([USB31] Table 9-6).
2 bDevCapabilityType 1 Constant PLATFORM capability type ([USB31] Table 9-14).
3 bReserved 1 Number This field is reserved and shall be set to zero.
4 PlatformCapabilityUUID 16 UUID Must be set to {3408b638-09a9-47a0-8bfd-a0768815b665}.
20 bcdVersion 2 BCD Protocol version supported. Must be set to 0x0100.
22 bVendorCode 1 Number bRequest value used for issuing WebUSB requests.
23 iLandingPage 1 Number URL descriptor index of the device's landing page.

bDescriptorTypeのことか?(全く無知なので間違ってたらすまん)

[USB31] Table 9-14を見てこいみたいなことを言っているので見に行く。

USB.org - DocumentsよりUniversal Serial Bus Revision 3.2 Specificationを落とす。103 MBもあるし通信速度が遅いが仕方ない。unzipしてUSB 3.2 Revision 1.0.pdfを見に行く。

§9.4 Standard Device Requests

This section describes the standard device requests defined for all devices. Table 9-4 outlines the standard device requests, while Table 9-5 and Table 9-6 give the standard request codes and descriptor types, respectively.

Devices shall respond to standard device requests, even if the device has not yet been assigned an address or has not been configured. If a standard request defines a persistent parameter that can be modified, the reset/default value for that parameter, unless otherwise specified, is zero.

Descriptor types are used to determine the type of descriptor being queried from a device or being set to a device. The existing standard descriptor types are listed in Table 9-6. All these values shall not be redefined and used in any USB class specification. In addition, this specification reserves the highest bit (Bit 7) of the descriptor type as a value that shall only be used by base USB specifications when defining new descriptor types .

Table 9-6. Descriptor Types

Descriptor Types Value
DEVICE 1
CONFIGURATION 2
STRING 3
INTERFACE 4
ENDPOINT 5
Reserved 6
Reserved 7
INTERFACE_POWER 8
OTG 9
DEBUG 10
INTERFACE_ASSOCIATION 11
BOS 15
DEVICE CAPABILITY 16
SUPERSPEED_USB_ENDPOINT_COMPANION 48
SUPERSPEEDPLUS_ISOCHRONOUS_ENDPOINT_COMPANION 49

The INTERFACE_POWER descriptor is defined in the current revision of the USB Interface Power Management Specification.

うん、全くわからん。

とにかく

まあdescriptorsがなくても列挙可能で認可を求めるChromeのUIにユーザーが判断するために必要と思われる情報が載っていないために、とりあえず無効にしとけ、という話でいいのか?

chrome://flags/#enable-webusb

にアクセスして

chorme_web_usb_flag

Disabledに。

Chromeを再起動すれば適応されます。

雑にこれまで触ったことのあるプログラミング言語について語る

はじめに

どうもTwitterの私のTLでは #いいねされた数だけ触ってきたプログラミング言語について語る というタグが流行っているのですが、そんなにたくさん触っていない弱者としては怖くてそんな募集はできないので自分で書きます。

記憶している範囲で触ったことがある順に書きます。中には「これはプログラミング言語か?」と言うものもありますがまあご愛嬌。

HTML

HTMLはプログラミング言語なのだろうか。

出会い

ガラケー全盛期、中学校時代所属していたPC部の先輩から二次創作なるものを教えられ、その時同時にフォレストページというサイトを知りました。

pixivの知名度がない時代、自分でサーバー借りたりHTML書くのは大変なのでよく利用されたサービスなのですが、そこで「リンクってどう貼るんだろう」と思ったんですね。で、Yahoo!知恵袋にて質問をして

detail.chiebukuro.yahoo.co.jp

<a href="リンク対象のURL">文字リンク(例えばサイト名など)</a>でリンクは貼れます。

という回答を得たのがきっかけです。hrefとは?と思い調べたところどうやらこれはHTMLらしい、とわかりました。

勉強

それからしばらくは忘れていたのですが、きっかけはHTML5でしょうか。

はてなに移る前のFC2ブログや、Yahoo!知恵ノート(間もなくサービス終了)を書いていたこともあり、ちゃんとHTML勉強したいなという思いがありました。

大学受験が国立後期試験を秋田大学を受けて落ちてその前に受かっていた理科大に入ることになって、そこで一気にググって勉強した感じですね。

その後

みらい研究室実行委員会のWebページや(現管理は @akihikodaki)、神楽坂一丁目通信局内部向けC++講習会資料を書くためなどでHTMLをガリガリ書いてました。

Autorun.inf

Autorunはプログラミング言語なのだろうか。

出会い

日経PC21のいつだったかの企画でUSBメモリーのアイコン変える方法&USBに入れたPortableソフトのランチャー自動起動!とかいう記事見たせい。

detail.chiebukuro.yahoo.co.jp

こんな質問してたわ。

その後

XP終了とともにAutorun自体セキュリティ的に危ないので消えていった。アイコン用にAutorun.infとアイコンと、あとUnplugDrive.exeはしぶとくUSBに入れてたけど、

この騒動のときにブータブルメディア作るのに吹き飛ばしてそのままだな・・・

Excel VBA

出会い

ちょっとこれを語るには中学校時代所属していたPC部について語らねばなるまい。

入部当初自分入れて3人にまで落ち込んでいたPC部をどうにか3年間で8人くらいに増やしたのが私のささやかな功績なんだが、この部活、異常です

何が異常ってPC部のくせしてインターネットにアクセスしてはいけないというルールがあった(今もあるのかな?)。

いや、最初からあったわけではなくて、入部当時は使えてたんだけど、6月くらいに、PC部員ではないどっかのバカがウィルス?をPCに仕込んだそうな。それで

顧問「PCによくわからない怪しいソフトが入れられていた。問題のPCはあれだが(PCを指差しながら)、使ったか?」
私「いつも使っているPCは決めているのでそこを利用することはありえません」
顧問「まあいい、インターネットアクセス履歴はPCから消したつもりだろうが、市役所に全部残っている。とにかくインターネット使用禁止だ」
私「(そんなとこに履歴残ってるかよ、それよりPC起動ログ見ろやドアホ)うちら(PC部)関係ないじゃないですか、冗談じゃないですよ。そもそも活動に必要不可欠です。」
顧問「必要なときは毎回私(=顧問)に言って」

という謎極まりない会話によって禁止されたんですね。

その後も顧問に何回も掛け合ったんだけど、普段はいい先生なんだけどそれについては相手にされず、校長に親と殴り込みに行ったけど校長は把握しておらず、ごまかされ、そのまま卒業まで使えなかったんですね。ありえねー。もし国分寺市立第五中学校の現役PC部の方がここを見ていて、未だにインターネットが使えないとかだったら、そんなクソ事情なので、問答無用で顧問を殴っていいです。校長が把握してねーってことは、情報機器担当の先生がPC保守メーカーから報告を受けてなんかしら対応せなアカンやろってことでそういえばPC部がよく使ってるよな、じゃあ禁止しとけばいいだろ、くらいのお馬鹿で禁止されたに違いないので。

今の私だったら問答無用で市議会と教育委員会に殴り込みかけてるけど、当時はそこまでの行動力はなかった(なお校長には殴り込みに行ったうえに市長への手紙を書こうとはした模様)。

そもそも国分寺市情報リテラシーのかけらもないからね、仕方ないね。

で、インターネットが使えないPC部で何をしていたかというと、ひたすらExcelのいろんな関数や機能を使うってことをやっていたんですね。

しばらくした頃、日経PC21Excelマクロ入門記事が出て、まあまずは写経してみるかってなりちょっと触りました。まあ全くわからずさじを投げたのですが(言語仕様学ばずにかけるわけがない)

detail.chiebukuro.yahoo.co.jp

その後

中学校卒業したあとは触ることはなかったんですが、大学に入り教職課程をとり、地学実験に行ったときのこと。

気象データがExcelにまとまっていて(What’s!?)それを付録のマクロで抜き出して(!?)解析する授業がありまして・・・

Excelがこのご時世なのに2003以前形式でして、これどうにかならんのかと中身覗いたとき、リファクタリング欲が出ました。

すでに文明の利器(現代的なテキストエディタ、git)を手に入れていた私は心が折れました。マジむり。

ところがその後取った情報科学の授業、後半戦はExcel VBAだったんですね。マジカヨ・・・

もう二度と触らねーぞ!(フラグ

CSS

CSSプログラミング言語なのだろうか。

出会い

HTMLを触るにあたってstyleattributeの存在を知り、そこからHTMLに付随して勉強した感じです。HTML5勉強するときに「構造とデザインは分離しなさい」とそこかしこに書かれていたせいでもある。

その後

みらい研究室実行委員会のWebページを管理するようになってCSSの汚さに絶望を覚えリファクタリングを放棄したり、IEと戦うのに疲れたりしたので最近まで敬遠していた。

stylelintとか知って興味本位でかけても大量に警告出て、「言ってることはわかるよ、パフォーマンス落ちるっていうんでしょ?そんなこと言っても可読性考えたり衝突防止には致し方ないんだよ!」ってなってたのもある。

MSがWindows Vistaのサポートを切ったことでついに我々プログラマーIE11より前のIEを無視することができるという人権を手に入れたのでflex使えるううううううう!ってなってちょっとだけモチベ戻ったけど、やっぱりlessとか使いたいよねという思い。

Bat(Command Prompt script file)

出会い

動画編集にのめり込んだ高校時代、作業を自動化する必要にかられ、バッチファイルの存在を知った。

勉強

そのころ手に入れたデジタルカメラの動画機能で撮るとmts(h.264/ac-3)なファイルになって、これをmp4(h.264/aac)にしてiPodに入れたいという欲求があったこともあり

github.com

github.com

こんなのを作ってた(Githubは最近そのころのファイルを引っ張り出してgit管理にしたもの)

その後

for文が使いにくすぎて使わなくなった。

最近では、CSVC++から読み込んでコンパイル時DB構築をするための前処理をBatで書こうとしたが、

github.com

バッチの再帰数がスタック制限を越えました

とか言われたのと処理速度が遅かったのでPowershellで素直に書き直しました。

クソ of クソは激しく同意。

C

出会い

東京理科大学に入学し、神楽坂一丁目通信局に入った。そこでプログラミング講習会ということでC言語を教わった、が当時はまじで何が何だかわからなかった。

なんかバグる、動かねーと思ったらだいたいif文の条件文がちゃんと書けてなかったり、ド・モルガンの法則がわかってないと痛感させられる日々が続いた

勉強

とりあえず参考書が必要やろ、ということで

独習C 第4版

独習C 第4版

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

を買ったが、どう考えても前橋和也著のC言語ポインタ完全制覇のほうが面白そうなので独習Cなんてものはほとんど見なかった。

C言語ポインタ完全制覇のお陰でポインタを理解することができるようになり、またC99という言語規格の存在を知った。

今にして思えば、独習CなんかじゃなくてC言語ポインタ完全制覇とか、もっと入門本として

苦しんで覚えるC言語

苦しんで覚えるC言語

あたりを買えばよかった。独習C、てめーは許さん。まあすでにBook Offに売り払ったがな。

その後しばらくYahoo!知恵袋で回答者をやっていた。学校の課題丸投げと思われるもののうち、質問として成立しているものを選び回答を続けた。一時期C言語関連カテゴリのカテゴリマスターになってた。

まああとDxLibとかOpenCV1.xを使ってたりした。

その後

このあとC++の項で後述する事情によりCを書かなくなった。

まあそもそもC言語至高主義者どもが信奉するコードがどう考えても可読性と保守性に優れているとは思えなかったので、というのもある。

おまえらImageMagickソースコード見たことがあるか?あれはまじで糞だぞ。あんなクソ処理してればそりゃぁOpenCVに大差をつけて処理速度で負けるわけだ。

Perl

出会い

学校の「情報処理および演習1」「情報処理および演習2」の授業でやらされた。C言語を知ったあとなので、動的型付け怖い、と思った。

その後

一体いつ使えばいいのかわからず使っていない。なんかPerl7とか出たらしいが。

JavaScript

出会い

@takeokunnと参加したハッカソンでグループを組んだ東京電機大学電気電子工学科の連中だっけか、その人達と組んだときに、一回も書いたことがなかったJavaScriptを書かされることになり、めっちゃ必死だった。

takeokunnと違って当時私はC言語を真面目に勉強していたので、まあその無茶振りでもまあそれっぽいコードは書けた。たしかGETとかPOSTとかするコード書いていた気がする。

そのわずか一週間後、みらい研究室実行委員会のWebページ制作に取り掛かることになり、覚えたてのJavaScriptを駆使して

企画案内|オドロキ科学箱|東京理科大学みらい研究室

を作った。

github.com

実装の汚さに突っ込んではいけない。

その後はC/C++にハマりすぎて動的型付け言語恐怖症になっていたこともありしばらく触ってなかった(といってもちょこちょこ書いてはいたが)。

Node.jsも知ってはいたが敬遠していた。理由は

本の虫: npmからkikとその他諸々が消されたまとめ

この事件を知っていたからだ。

Node.jsを敬遠していたがために、コードのモジュール化ができないJavaScriptに嫌気が指していた。いや、namespaceパターンとかあるけどだるいやん。

その後

転機になったのは

github.com

を知ったこと。このJavaScriptの入門書執筆にGitbookが使われていた。もはやNode.jsから逃れることはできない。

github.com

実際に二次創作をGitbookで書いてみてその快適さに感動し、また改行処置にバグを見つけ、

github.com

なんていうWorkaroundプラグインを書いて初のnpm module公開をしたりした。

さらに

webpackはサンドイッチ製造機名乗ってるのに具材の加工しかしてくれない — 173210’s Blog

を見てWebpackに興味を持ち、戯れていたりした。

それよりもES2017とか使いたいのでもはやトランスパイルするのは当たり前になったのとWebpack便利なのであんまビルドに抵抗がなくなった。

そういえば

github.com

でも使われているよ。

C++

現在のメイン言語。

出会い

神楽坂一丁目通信局で先輩から「C++はCの構造体に関数を持たせられるクラスがあって便利だぞ」とか言われた記憶はあるが、そのときは「ふ~ん」くらいなもんだった。

神楽坂一丁目通信局の所属として理大祭(大学の学園祭)になんか作品を出すことになってプログラムをCで書いているときに、文字列操作周りでバグに悩まされた。

detail.chiebukuro.yahoo.co.jp

ideone.com

Do not use strlen() family to determine size of dynamic array! | 舶来ゴミ置き場

この時@MaverickTse氏にstd::stringなどのSTLを紹介され、C++の門を以降叩いた。

勉強

翌年の神楽坂一丁目通信局内部向け講習会で講師役に名乗り出た私は、じゃあテキスト作らなあかんやろということで作り始めた。

github.com

目次とかとか | C言語講習会テキスト2015

その過程で

cpplover.blogspot.jp

C++erなら皆さんご存知・・・のことと思うが、江添亮さんのブログ本の虫に行き着いた。とりあえずこのブログのすべての記事を読破した私は、CではなくC++11を教える必要があると判断した。理由は

github.com

にあるので参照されたし。

とにかくそういうわけでQiitaの記事を読み漁りつつ、本の虫を何回もよみつつ、Twitterで強いひとと絡みつつ、ググりつつ、C++を勉強していった。

当時はcpprefjpがまだほとんど執筆されていなかったように思う。C++11の日本語情報などほとんどなく、古い情報や誤った情報の中からC++11に関する正しい情報を見つけ出すのは非常に困難な作業だった。私のggrbilityが高くなかったら、本の虫がなかったら、Twitterに強い人がいなかったら、心が折れていたことは疑いない。

そんなころ、歌舞伎座.tech #8 「C++初心者会」が開催され、ニコニコ生放送で中継された。もちろん私はタイムシフトを予約した。とりあえずC++erの初心者は当てにならねーなと思った。

その後

qiita.com

でQiitaデビューした。以降Qiitaの記事には大変お世話になっている。

2015年冬、C++初心者Advent Calendar 2015が開催され、

qiita.com

を投稿したところ、評判がよく、View数とストック数(当時はまだいいねシステム(改悪)は導入されていなかった)がよく伸びた。この記事はここまで読んでいただけたならわかると思うが、目次とかとか | C言語講習会テキスト2015の執筆経験を存分に活かしている。という解説の一部はここから流用したし。

C++界隈に名前が知られるようになったきっかけ

名前が知られると言っても江添さんとかその他強い人に比べれば屁みたいなもんだが。

先程紹介した歌舞伎座.tech #8 「C++初心者会」株式会社ムラサメ研究所 宮竹ゆきさんが

www.slideshare.net

という発表をなさっていて、「果たしてC++初心者はBoost.Asioを使えるのだろうか」と思っていたのだが、

qiita.com

の記事でその思いが再燃、

qiita.com

を投稿したところ、これがバズった。C++の難解さも相まって受けたのだろうか。ついでに規格書リーディングという単語を生み出した。

とにかく私の予想を遥かに超えてバズったために批判も多く頂いたが、炎上商法で名前が売れるのは常識である、好む好まざるにかかわらず名前が売れた。

私としてはべつにバズらせようとして記事を書いたわけでもないし、後に深刻な誤解を受けたのでその記事に意図を追記しました。

現在

まあなんか書くときはとりあえずC++で書いちゃう。そんな現状。ただしGUIC# + WPFを使ってます。

Bash Script

Linux使っているのに書かないわけない。以上。

ちなみにきれいに書こうとするとfork()がないWindowsでの実行速度が死ぬのでprocess作らないように汚く書くことをおすすめします(ぇ

C#

出会い

残念ながら覚えていない。競技プログラミングC#で解こうと思い立ったのが先だったか、Win32APIC/C++から叩くの辛くてC#使おうとしたのが先だったか、とにかくその辺。

勉強

LINQとかいう文明の利器に触れたのは

github.com

がきっかけ。これはWindows Formをつかっている。GUI書くのが圧倒的に楽で感動した。

その後WPFの存在を知ったがわからずぎて心が折れた。

github.com

teratail.com

現在

WPFリベンジ中・・・。ObservableCollectionやっぱりわからないので使わない方向に逃げた(ぇ

Python

出会い

名前だけ知っていたPythonを触ってみようと導入するもWindows文字コードの高い壁に阻まれ挫折

リベンジ

OpenCVpythonで使ってみようとしたがやはり挫折。

github.com

にContributeした時ちょっと触ったがそれっきり。

GnuPlot

大学の実験レポートのグラフを書くのに、eのグラフの近似線を引きたかったがExcelだとできなかったので使った。

qiita.com

それっきりほとんど使ってない。

PowerShell

いつの間にか触っていた。

セキュリティポリシーをユーザーが変更しないと.ps1実行できない仕様のお陰で使う気になれなかったが、誰かに「それバッチファイルから呼べばええやん、引数でセキュリティポリシー渡せるよ」というチート技を教えてもらってからはバッチファイルなんて投げ捨ててこれ使っている。

正規表現の扱いがわかりにくい印象。あとBatに比べれば遥かにマシとはいえ、型が暗黙変換されたがるので辛い。

独特のpipe機構を持っているがこれまた謎い。

DxLib auto update script

github.com

D

競技プログラミングで一回C++じゃなくてこれ使おうとしたが、Hello World!すらどういうわけか動かないので知らない子。

lua

MineCraftC++版と言われるMineTestを遊ぶのにModを作りたくてluaを触った。

いわゆる三項演算子がなく、代わりにcond and a or bって書くのは可読性がない。もうちょっとどうにかならんのか。しかし書きやすく、しかも高速なスクリプト言語である。

github.com

なお作ったModは完全に放置している。時間が足りない。

npm script

大体

qiita.com

qiita.com

この記事のせい。上述のjs-primierのレポでも多用されている。

しかしWindowsコマンドプロンプトのせいで死ぬのでもうbash+makeでええんや感出てくる。

Ruby

github.com

CSVファイルを正規表現でチェックするCIを作るためだけに触った。なんでRubyにしたかといえば、JavaScriptでも良かったが、@YSRKEN氏がJavaScriptよりRubyのほうが詳しそうだったため。

Rust

Next C++感ある言語。後輩に猛烈にpushしているが、当の私はあんまやれてないというかチュートリアちょっと触っただけ。

Pug

github.com

でHTMLではなく静的buildが便利なPugつかおうという話になり触った。ほぼHTMLだからそんなに迷わない(includeappendしか使ってない)。

終わりに

大体C++JavaScriptC#やっている感ありますね。