「void」を含む日記 RSS

はてなキーワード: voidとは

2022-08-18

俺はみずほと同じぐらいのコードしか書けないのに気が付いた

話題ホットエントリ問題、解いてみた。

結論タイトルの通り

不正解score += 0; と書いているのは静的解析がelse節を省略すると指摘してくるから

何もしていない、はそのとおり。

不等号がいい具合に化けてるのでそのままにしておく。


import java.util.*;


public class Main {
    public static void main(String[] args) {
        // 入力parse
       (中略:int numに問題の数、String list[i][] に問題リストを格納している)

        // 採点
        int point = 0;
        for (int i = 0; i < num; i++) {
            String question = list[i][0];
            String answer   = list[i][1];
            
            if (question.equals(answer)) {
                // 完全一point += 2;
            } else {
                if (question.length() == answer.length()) {
                    // 文字数は等しい(部分点の可能性がある)
                    point += scoring(question, answer);                    
                } else {
                    // 不正解
                    point += 0;
                }                
            }
        }
        System.out.println(point);
    }

    // 長さが同じ文字列を採点する
    // 長さが違う文字列を受け渡したときは正しく動作しない
    private static int scoring(String question, String answer) {
        int length = question.length();
        int score  = 2;
        for (int i = 0; i < length; i++) {
          (中略:文字が違うたびにscoreを-1して、socreが0以下になったらそのままreturn)
        }
        return score;
    }
}

2022-08-01

anond:20220731183342

自動安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋) 

/**************************************

以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>

//CSVファイルが置かれてるディレクトリパス投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";

const CSV_DIR =

'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';

//ファイルパスCSV絶対パスで、拡張子必要。iimは相対パスでよく、拡張子不要

const FILE_PATHS = {

//投稿文が書かれたCSVファイル

textCsv: CSV_DIR + 'textNoAnker.csv',

//レス投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。

replyTextCsv: CSV_DIR + 'textReply.csv',

};

const SETTINGS = {

//投稿後の基本待ち時間

baseWaitTime: 5,

//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ

waitTimeRange: 5,

//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)

waitTimeForAvoidingPunishment: 60 * 30,

//メール

mail: 'sage',

//名前設定

nameSettings: {

//名前名無しなら''。

name: '',

//以下、偽装ワッチョイ設定。浪人ワッチョイを非表示にしてるときだけtrueにしてね。

//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。

nickname: false,

//妙なニックネームの後に付く8桁の文字列ランダムで決めて付加するかどうか。

korokoro: false,

//IPランダムで決めて付加するかどうか。

ip: false,

//地域ランダムで決めて付加するかどうか。

area: false,

},

postSettings: {

//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。

noAnkerPost: false,

//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrue場合投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。

replyPost: true,

//最初に取得するアンカー無し投稿CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力

noAnkerPostTextCsvStartRow: 1,

//最初に取得する返信用投稿CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力

replyPostTextCsvStartRow: 1,

//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。

textCsvLoop: true,

//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。

minAnker: 895,

//返信する場合名前に以下の文字列を含む投稿アンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列複数指定可能指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能

filterNames: [],

//↑とは逆に、名前に以下の文字列を含まない投稿アンカーをつけて返信する。↑と併用も可能

filterNamesNotIncluded: [],

//返信する場合、本文に以下の文字列を含む投稿アンカーをつけて返信する。

filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],

},

//自分IPアドレス確認VPNとかでIPを変更してマクロを動かしてるとき、突然VPN作動しなくなってIPが元に戻ったときマクロを止めるためのもの

ipSettings: {

//自分現在IPアドレス確認をする。

checkIp: true,

//以下の文字列自分現在IPアドレスに含まれている場合マクロを一時停止する。基本的自分の本当のIPアドレス入力

avoidTheIp: '133.206.99.224',

},

//浪人設定。最後動作確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないか確認できずわからない。

roninSettings: {

//浪人ログインしてるかどうかをチェックするかどうか。trueらするfalseならしない。trueにしていてもし浪人ログインしていないことを確認したらログインしにいく。

checkLogin: false,

//浪人ログインメールアドレス

mailAdress: 'abc@def.com',

//浪人ログインパスワード

password: '1234',

},

//false: run()実行させず(デバッグ用)

run: true,

//true: 投稿処理だけしない デバッグ

skipPost: false,

};

/**************************************

設定箇所終わり。

書き込めない時の早見表 - 5ちゃんねるwiki

https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>

/**************************************

メモ

クラスフィールド宣言できない。

・NULL演算子(??)は使えない。論理積(&&)は使える。

オブジェクトの分割代入はできない。

・importはできない。 <h3>o- *************************************/</h3>

/**************************************

関数 <h3>o- *************************************/</h3>

/**

* ここから始まる。

*/

function run() {

//設定ミスがないか調べる。

checkSettings();

var _TextCsvCursors = new TextCsvCursors(

new TextCsvCursor(

SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0

? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1

: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,

FILE_PATHS.textCsv,

SETTINGS.postSettings.textCsvLoop,

),

new TextCsvCursor(

SETTINGS.postSettings.replyPostTextCsvStartRow > 0

? SETTINGS.postSettings.replyPostTextCsvStartRow - 1

: SETTINGS.postSettings.replyPostTextCsvStartRow,

FILE_PATHS.replyTextCsv,

SETTINGS.postSettings.textCsvLoop,

),

);

var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);

const _MyPosterName = new MyPosterName({

name: SETTINGS.nameSettings.name,

});

//スレURL指定

const _ThreadUrl = openPromptThreadUrl();

//ループ

while (true) {

//IP確認する設定なら、それをする。

SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();

//スレを開く

openUrl(_ThreadUrl.fullUrlHttps());

//浪人ログインする設定なら、浪人ログインしているかどうかを確認し、していなければログインしにいく。

if (SETTINGS.roninSettings.checkLogin) {

if (!checkRoninLogin()) {

loginRonin();

continue;

}

}

//投稿に使うテキスト取得。

const p = (function () {

if (SETTINGS.postSettings.replyPost) {

//返信あり設定の場合。返信対象が無いか調べる。

const targetAnkerNumber = createPostDOMList()

.filterPostnumberHigher(_LoopStatuses.currentMinAnker())

.filterByPostername(SETTINGS.postSettings.filterNames)

.filterByPosternameNotIncluded(

SETTINGS.postSettings.filterNamesNotIncluded,

)

.filterByText(SETTINGS.postSettings.filterText)

.lowestPostNumber();

if (targetAnkerNumber !== null) {

//返信対象があったのでアンカー付き投稿文を作る。

const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);

messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);

return {

...r,

updatedLoopStatuses:

_LoopStatuses.updateMinAnker(targetAnkerNumber),

};

}

}

if (SETTINGS.postSettings.noAnkerPost) {

//返信対象無し、或いは返信しない設定の場合アンカー無し投稿文を作る。

const r = _TextCsvCursors.takeNextRowTextAsNoAnker();

messageDisplay('返信対象無し。アンカー無し投稿。');

return {

...r,

updatedLoopStatuses: _LoopStatuses,

};

}

return null;

})();

if (p) {

//投稿

postThenCheckError(

_ThreadUrl.serverName(),

_MyPosterName.randomize({

nickname: SETTINGS.nameSettings.nickname,

korokoro: SETTINGS.nameSettings.korokoro,

ip: SETTINGS.nameSettings.ip,

area: SETTINGS.nameSettings.area,

}),

SETTINGS.mail,

p.text,

);

//_TextCsvCursorsと_LoopStatusesを更新

_TextCsvCursors = p.updatedTextCsvCursors;

_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();

messageDisplay([

`投稿回数: ${_LoopStatuses.currentPostCount()}`,

`minAnker: ${_LoopStatuses.currentMinAnker()}`,

`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,

`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,

]);

} else {

messageDisplay([

`返信対象が現われるのを待機中...。`,

`投稿回数: ${_LoopStatuses.currentPostCount()}`,

`minAnker: ${_LoopStatuses.currentMinAnker()}`,

`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,

`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,

]);

}

//短時間で連投しまくると規制されるので一定時間待機。

wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));

}

}

/**

* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。

* @param {string} serverName サーバー

* @param {MyPosterName} _MyPosterName

* @param {string} postMail メール

* @param {MyText} _MyText

* @param {number} retryTimes

* @returns {void}}

*/

function postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes = 0,

) {

const r =

retryTimes === 0

? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(

postTo5chTread,

postConfirm,

)

: new ValuesOfPost(

serverName,

_MyPosterName,

postMail,

_MyText,

).postSubstring(retryTimes, postTo5chTread, postConfirm);

if (r) {

back();

return;

}

//エラーページに飛ばされた。エラー情報取得。

wait(7);

const error = createPostErrorMessage().analyze();

messageDisplay(error.message);

if (error.order === 'KILL') {

kill();

} else if (error.order === 'SKIP') {

return;

} else if (error.order === 'TRUNCATE') {

back();

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes + 1,

);

} else if (error.order === 'WAIT') {

wait(SETTINGS.waitTimeForAvoidingPunishment);

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes,

);

} else if (error.order === 'LOGIN') {

//動作未確認

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes,

);

}

return;

}

/**

* 現在IPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。

* @returns

*/

function checkCurrentIpNotTheIp() {

//IP確認ページへ飛ぶ

openUrl('https://www.cman.jp/network/support/go_access.cgi');

const _IpAdress = createIpAdressFromCMan();

if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {

pause('現在IP指定した値が含まれていることを確認。');

//ポーズ解除したならもう一度確認しに。

checkCurrentIpNotTheIp();

}

return;

}

/**

* 設定に致命的な問題が無いか検査

* @returns

*/

function checkSettings() {

if (

SETTINGS.postSettings.noAnkerPost === false &&

SETTINGS.postSettings.replyPost === false

) {

return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');

}

if (

SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&

SETTINGS.postSettings.replyPostTextCsvStartRow < 0

) {

return kill(

'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',

);

}

if (

SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||

SETTINGS.postSettings.replyPostTextCsvStartRow === 0

) {

return kill(

'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',

);

}

}

/**

* 入力フォームを表示して入力されたスレURLを受け取る。

* @returns {ThreadUrl}

*/

function openPromptThreadUrl() {

const url = prompt('スレURL入力');

return new ThreadUrl(url);

}

/**

* 開いてるスレレス全て読み取ってPostListインスタンスを作って返す。

* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。

* createPostDOMListを使う。

* @returns {PostList}

*/

function createPostList() {

const posts = window.document.getElementsByClassName('post');

return new PostList(Array.from(posts).map((e) => new Post(e)));

}

/**

* 開いてるスレレス全て取得してPostDOMListに格納して返す。

* @returns

*/

function createPostDOMList() {

const posts = window.document.getElementsByClassName('post');

var arrPostDOMList = [];

for (let index = 0; index < posts.length; index++) {

//HTMLCollectionからElementを1つずつ抽出して配列に。

arrPostDOMList.push(posts.item(index));

}

return new PostDOMList(arrPostDOMList);

}

/**

* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。

* @returns {PostErrorMessage}

*/

function createPostErrorMessage() {

return new PostErrorMessage(

window.document

.g Permalink | 記事への反応(0) | 15:40

2022-04-05

anond:20220405172611

voidさんとかmohtaさんとかあさだたくやさんとか古の有名人もちらほら

2022-01-16

[]社畜プログラマ気分を味わえた2Dアクションパズルゲーム

Steamで買った『Recursed』というゲーム全ステージクリアしたので、記念に感想を書く。

Steam:Recursed

https://store.steampowered.com/app/497780/Recursed/?l=japanese

操作方法/目的

一見すると『Recursed』は2Dレトロ雰囲気アクションゲームである操作シンプルで、方向キーで左右に移動し、アクションジャンプと物をつかむ/投げるだけだからだ。部屋の中を移動してブロックをつかんで足場を作ったり、鍵をつかんで扉を開錠したりしてゴールへと到着(crystalを獲得)すればステージクリアだ。

概要/パズル

ステージの始めはチュートリアルの様に簡単だが、ステージを経るごとに難しくなり、そのうち何度も試行錯誤したり難しさのあまり何十分も頭を抱えたりもした。

この複雑さを生み出す要因は箱(ゲーム表記ではChest)である。このゲームでは箱の中へジャンプすることで部屋の内に入れるが、一度箱の外にでると箱の内部状態リセットされてしまうのだ。よって箱の中にブロックや鍵などのオブジェクトを持ち込んでも保存することはできないし、ブロック位置リセットされるし、開錠した扉もまた施錠されてしまうことになる。

さらに大きな特徴として、箱を持ち歩いて移動することができるのだ。それにより、箱を持ったまま別の箱に入ったり箱を持って箱の外にでることもできる。

そして、ステージを経ると箱の中の部屋は箱の外と同じ部屋という場面に出くわす。Recursedは『再帰呼び出し』という意味らしいが、まさにこのゲームタイトル通りの現象が起こるのだ。そして、以降のステージでは再帰を交えることでパズルの複雑さはより深まっていく。

再帰プログラミングとRecursed

再帰数学的帰納法アルゴリズムでは定番概念だが、それがパズルとなってプレイヤー思考回路を奪ってくる。私はかつて社畜プログラマとしてJavaプログラミング経験していたので、箱に入ることはメソッドを呼び出すことの様に感じた。オブジェクトを持って箱に入ることは引数を使ってメソッドを実行することであり、オブジェクトを持って箱の外に出ることはreturn文でメソッドを終わらせることであった。

「ゴール前の段差が大きくブロック必要からブロック生成メソッドを呼び出してブロックオブジェクトを返り値として渡さなくてはいけないけど、そうすると鍵オブジェクトをゴールメソッド引数として渡すことができなくて……、いっそのこと、ブロックメソッドからゴールメソッドを呼び出すべきか……、メソッドの返り値は一つだけだが何度も呼び出せばいけるか? この緑色オーラはなんだ? Staticを意味するのか? Staticなオブジェクト位置情報をあらかじめ変更しておけば、ゴールメソッド引数渡しをする必要がなくなるのか?」

こんなことを一つのステージクリアするだけのために何十分も考えていたのだ。念のために書いておくが、ゲーム内には数学用語プログラミング用語は一切出てこない。ただ単に、私にJavaプログラミング経験があるからその用語パズルを考えていただけだ。ゲーム内で箱から出入りしたりオブジェクトを箱の中から出し入れするとどうなるかを、Eclipseステップ実行するように想起していた。ちなみに、ゲーム内で存在しない部屋や壁の中に移動しようとするとparadoxが発生して強制的特殊な部屋へ移動されるが、私はその度にステップ実行でExceptionに遷移されたことの様に感じた。他の言語精通するプログラマだったり数学畑の人ならば、私とは異なる概念パズル思考をするのだろうか。

プログラマを辞めて何年もプログラミング思考をしてこなかった私でも全ステージクリアすることができたのだから学校プログラムを学んでいたり現役でプログラミングをしてきた人ならばこのゲーム『Recursed』をクリアすることは可能だろう。いっそのこと、『Recursed』のクリアすらできない人にプログラミングができるのか? と煽ってみたいくらいだ。

ちなみに、もし私が社畜プログラマ時代にこのゲームをやったらブチ切れていただろう。なんで仕事プログラミングで脳を酷使した上に自宅のゲームでも同じようなプログラム的な思考をしなければならないんだよと。プログラミングから何年も離れていた今の私にとって『Recursed』は、プログラミング単体テストが無事成功した時の快楽を思い出させるものだった。

感想

『Recursed』はパズルとしての難易度は非常に高いが、理不尽な解法を求められることはない。理不尽な解法のクイズパズルには怒りが湧いてくる。ひと昔前のクイズ番組を見たことのある人なら『モヤッとボール』を投げつけたくなる、と言えばその感情が伝わるだろう。『Recursed』はどんなに難しいステージでも、ただただ開発者パズル作成能力に感嘆するだけで怒りは湧いてこない。

似たようなアクションパズルゲームとして有名なのは『The Witness』であろう。『The Witness』も私が好きなパズルゲームであり、ゲームとして高い評価を得ていることに間違いはないのだが、しばしば理不尽な解法を求められるパズルがありその度に私は怒りが湧いてきたものだ。そう考えると、『Recursed』はパズルとしての洗練さだけなら『The Witness』を超えるものだと私は思う。

好きなステージ

具体的にパズル解説するととただのネタバレになってしまうので(もっとも、文字だけでパズルの解法を説明できないのだが)、『Recursed』で私が好きなステージを述べる。順番は攻略順に並べた。

Woodland/Loop

再帰概念が利用される最初ステージ

チュートリアルの様に簡単だったこれまでのステージから突如再帰概念を見せつけられることで、このゲームタイトル名の意味理解することになった。

Ruins/Interlock

鍵を手に入れたら扉に到達できず、先に扉に到達したら鍵が手に入らずで、まさにインターロック名前に相応しいステージだった。

Temple/Blister

一画面だけのオブジェクトが少ないシンプルステージだが、氷の壁に阻まれてゴールできず苦戦した。試行錯誤の繰り返しの末クリアできたが、何故クリアできたのかがわからない。

The Void/Sojourn

The Voidステージはどれもこれまでの集大成という感じでやりごたえあったが、中でも頭をひねらせたのがこれ。ゴールの部屋を水没させたり水の無い状態で入ったりして鍵を運搬するのに苦労した。

The Void/Escalate

箱を左右へ投げて移動を繰り返して、高い位置にあるゴールを目指すのがまさにEscalateというステージ名そのものだった。paradoxを発生した後のパターンが複雑だったのが印象に残っている。paradoxを発生させたらcrystal獲得(通常のクリア)できないのかよ……という落胆は大きかった。しかし、それだけにcrystal獲得とdiamond獲得(paradox発生によるクリア)のどちらも大きな達成感を得られた。

The Oobleck Conundrum/Transfer

簡単そうに見えて難しく、唯一ステージ飛ばして次のステージへと進んだので印象に残っている。後に複数日に及ぶ数時間試行錯誤で改めてこのステージクリアができて、クリアにかかった時間が最も長くなったステージでもある。しかしながら、おそらく開発者想定外方法でのクリアであり。初期画面から右の方へ一切行かずにOobleckさえ使用しないというクリア方法スッキリしなかった。といっても、開発者の想定を無視するゴリ押し的なクリアを見つけたのはこのステージだけだった。

The Last Tapestry/Flight

The Void/Escalateと似たコンセプトのステージだが、釜(JavaにおけるThread?)のギミックを利用したより複雑な構成となっている。高い位置にあるゴールを目指すのは、やはりFlightというステージ名そのものだった。

最後

この記事投稿する前にエンディングを見れていないことに気づいた。

全ステージクリア(全てのCrystal取得)したからと、この記事執筆するためにネタバレを気にせず攻略情報を調べていたけど、エンディングなんてわかる訳ねえよ。The Void/Trilemmaの最後にCrystal取得とは関係ない意味深なオブジェクトがあることには気づいていたけど……。ちなみに、私のSteam実績によるとdiamondとrubieの全取得はできてないけれども、もう取得する気力はない。パズルゲームガチ勢にとっては、実績全解除を目指さない私は軟弱者に映るのだろうか? 攻略を調べずに実績全解除できる人は、高い論理的思考能力を有しているに違いない。

2021-12-20

anond:20211220141639

pre記法を使え

 Cue currentFile = 0;
 public void PlaySE(int clipNum) {
  int clipId = clipNum <= 3 ? clipNum : 0;
  if((clipNum != (int)currentCue &amp;&amp; ((int)clipNum <= 3 &amp;&amp; currentCue != Cue.Basis))){
   SetSEClip((Cue)clipNum);
  }
 }

2021-09-05

BLコレクション

 Kindleに溜め込んだ商業BLコレクションたち。最もお気に入り作品たちについては前に書いてしまったので、今回は書かない。今回は「しゅみじゃない」~「けっこう好き」までのレベルが入り乱れる。せっかくの増田だし、辛辣レビュー書いても消されたりしないので、素直に思ったことをぶちまけよう。

カッコウの夢』(ためこう)

 初めて買った商業BL上下巻ある。表紙が綺麗だけど、中身はというと、そこまで絵が上手という訳でも……。特別下手でもないが。綺麗めの少女漫画といった感じ。ストーリーは、白泉社匂いがする。と思ったら、作者は白泉社の、雑誌少女漫画家としてデビューした人だった。

 主人公(攻め)がドクズなので、受けの粘り勝ちなラストだけど、それでいいのかお前(受け)は? ともやもやした。あと、BL性格の悪い脇役の女を見せつけられるのは、あまり気分のいいものではない。少女漫画でも性格の悪い脇役の女の登場はあまりいい気分ではないけど、まあ、必要悪から仕方ないなと思う。

 男だらけの登場人物の中で紅一点の女キャラが性悪って……。と思ったけど、初読み商業BLだったので、まあそういうもんなのかなと思ったし、実際、BLワールドでは女が悪役はそんなに珍しいものではないと後に知る。(悪役で出てくるくらいなら女一切出て来なくてよし!勢もBL読みには多いようだと、更に後に知る)

ララ結婚』(ためこう)

 既刊三巻まで。一時期Rentaの広告でやたら出てきたので、興味本位で購入。もともと「メス堕ちBL」という企画のために作られた短編長編化したものらしい。メス堕ちBLて。商業BL、たまに男性向けエロも真っ青なえげつない企画があるよな……。

 そんな訳で、一巻は果てしなくセックスしてる(というか受けが攻めにレイプされている)感じなのだが、徐々にエロの頻度は減っていき、三巻では遂にエロはご褒美(巻末描き下ろしだけ)となる。

 物語タイトル通り嫁入り譚。だが主人公ララ双子の兄ラムダン(受け)で、彼が妹の代わりに政略結婚相手に嫁ぐというもの。どう見てもちんちんあるのに旦那(攻め)を騙し切れてるとけっこう長いこと信じている受け(濡れ場で紐パンぜったい脱がない)がすごい。んなわけあるかい

 パンツ脱がなければ大丈夫と思ってる受けとか、飛んでくる弓矢がどう見ても矢印とか、突っ込み処が色々ありつつ、ストーリー少女漫画を通り越して昼ドラの泥つき具合で進んでいく。途中から登場した攻めの第二夫人がすごくいい子で自分から身を引いて退場となる辺りは清々し少女漫画のよう。

 BL読んでる感がどんどんなくなってきたので、三巻でストーリーに一段落いたことだし、これ以降は読まなくてもいいかなと思った。いやまあ、少女漫画が好きではない人間には商業BLの7割くらいはノットフォーミーなんだけれども。

 ところで、登場人物の装束や村や街の風景がどう見てもチベットしかし、チベットって一夫多妻というより一妻多夫イメージがあったのだが? 幼い頃に許嫁が決まっていて、許嫁同士で遊んでいたとかい描写は、中国のどこだかの幼児婚的なものに見える。

アサリと俺』(藤咲もえ)

 アサリBLする。ミル貝もBLする。たしかアサリが攻めだったと思う(人間が受け)。ミル貝は立派なものをお持ちながら受けであるアサリに詳しくなれるかもしれない。西洋パロディが素敵。

 誤タップにより購入してしまい、購入した途端にページが開かれてしまったので、返品できなかった。悲しい。

 サンプル1ページ目を読んで合わないと思った作品はほんとうに合わないと思い知る。悪くはないと思うけど、私には合わない。

イトウさん』(冥花すゐ)

 作者のペンネーム中二病拗らせている感あるけど、作風中二病が炸裂し爆発している。サンプル1ページ目の主人公(受け)のビアズリー的な美に惹かれて購入したが、なかなか良かった。BL世間評価がどうであれ自分にはヒットした。

 内容的には殺伐裏社会ものでありつつ純愛もの

『艶漢』(尚月地

 あれ、これBL? BLでない? よくわからない。商業BLも読むんならこれ読んでみれと強くおすすめされた1冊。特に私の推しジャンル二次創作クラスタにはたいそうウケるらしい。が、私には全く面白さがわからなかった。ここまで何が面白いのかわからないという作品に当たったのはじめて。まあ、同クラスタの人ほど案外趣味合わないというのは、よくあることかな。『地獄楽』(これは少年漫画だが)とかも、正直わからんと思ったし。推しに似てると言われても……。

あなたを殺す旅』(浅井西)

 表紙の銃口を向けられている方が攻め。銃を向けている方が受け。仕事でヘマをして逃亡の身になったヤクザ(攻め)とその舎弟(受け)が海沿いの街を転々とするロードムービーオールドファッションヤクザスタイルだけど、時代現代平成前期くらいで時代に取り残されてしまったような懐かしい旅風景

 おすすめかというと微妙だけど、個人的にはかなり好き。最寄りのTSUTAYABL本棚では、イチオシ作品として飾られていたので、人気はあるのだろう。

 そういえば、同作者の非BL作品町田啓太主演でドラマになったかこれからドラマになるかだったような。

『いとおしき日々』(sono.N)

 50代×60代の人生の大半をかけたBL

 うん、思ってたんと違った!

VOID』(座裏屋蘭丸

 私が持ってる商業BL漫画のなかで唯一の、18禁作品。これ以外はどんなにエロがあっても18禁にはならないのだった。前述の『ララ結婚』など、そうとうエロいはずなんだけどなー。

 だがKindleにかかればVOIDも白抜き修正祭りさ! 18禁というレーティングで描かれた漫画であるので、同作者の他の作品とは違い、体位局部を見えなくする技を使わずに描かれているせいで、よりいっそう白抜き修正祭りになってしまっている。あと、ほかに何が18禁なのかというと、アブノーマルプレイがある。道具使用とか、プレイを超えた言葉身体的な暴力とか。受けをただ虐待するSMのようなやつ。

 エロがメインの作品なので、座裏屋先生らしくハイクオリティー映画的な画面構成だけど、ストーリー面白さとか辻褄とかは今一つ。受けが可哀想過ぎるし無理やりハピエンにまとめているのが却って理不尽に思えてしまうので、私はあまり好きではない。

 本物の18禁修正無し)だったらしい紙の方は受注販売だったために、現在は新品での入手は不可能中古本がとんでもないプレミア価格で売りに出されていることがある。

 

『旧繁華街袋小路』(ためこう)

 商業BL入門時代に、とりあえず一人の作家さんにしぼって単行本を集めてみるかと思って買った。そしてここで挫折した。(他にも初期短編集も買ったけど。)『カッコウの夢』『ララ結婚』ほどは少女漫画的ではない。あまり記憶に残らない作品だった。

ハッピーくそライフ』(はらだ)

 主人公二人が粕谷と葛谷という名前からしてろくでもなさそう(実在粕谷さんと葛谷さんにはすみませんが)な二人の織り成すリバーシブルギャグBL

 ひとしきり笑う。時々可哀想



続きはまた後で。

2021-08-03

anond:20210803012020

javascript:void((function(){document.body.innerHTML=document.body.innerHTML.replace(/削除したい文字列/g,'');})());

で良くない?

2021-07-12

最近読んだBL

シャングリラの鳥』『コヨーテ』(座裏屋蘭丸

 BLポルノだと思っている人には座裏屋先生作品はこれぞまさにっていう感じなのだろうと思う。セックスのシーン多いしね。ただ、ガチ18禁であるVOID』以外は、性描写が案外過激ではなくて、もしも真似してやってみようと思って実践しても直ちに怪我をすることはない、安全めなプレイが多く、さして害にならないんじゃないかなたぶん。

 相思相愛の二人が行う身体に優しいエロはいいぞ。

魔道祖師』(墨香銅臭)

 小説BLレーベルから出版されているBL小説なのだが、恋愛ものというよりは冒険アクションミステリーものエロは見事なまでに無いけど、BLなので読んでBL妄想をしてもお前の頭がおかしいだけとは言われない安心感がある。

 平易な文章感情表現シンプルかつ共感やすい。倫理道徳思想面での難しさがない。ハリー・ポッターくらいのレベルの内容なので、子供でも読めそう。ただし、ゾンビ的なものが沢山出てきて激しくグロい。

2021-07-11

昨日からjava勉強し始めたんだけど

ラッツ予想の計算過程を出力するプログラム書いたんだけどもっと簡単に簡略して書く方法おしえてけろ

public class Calc{
	public static void main(String[] args) {
		for(int i=2; i&gt;0; i++) {
			int a = i;
			System.out.println("-----"+ a +"の場合-----");
			while(a != 1) {
			if(a % 2 == 0) {
					System.out.println(a +" ÷ 2 = "+(a = a / 2));
				}else{
					System.out.println(a +" × 3 + 1 = "+(a = 3* a +1));
				}
			}
		}
		}
}

2021-06-14

anond:20210614195813

刑事罰になった判例あんの?

今も日本子どもの命と権利が親・保護者権利にくらべてゴミみたいに軽い

 

クルマ閉じ込め欧米どうこう

とりあえず、米国

仮釈放無しの終身刑を言い渡されることもあれば(例:2014年6月ジョージア州 ジャスティン・ロス・ハリス https://en.m.wikipedia.org/wiki/Murder_of_Cooper_Harris

うんうん、わかるよー不幸な事故だよねーで不起訴になるケースも43%もある上に、起訴されても11%は無罪になったりで、

日本以上に法とは?裁判とは?といった様相

said they were not aware they had left their babies in hot cars. In 43 percent of those cases, no charges were filed. In 32 percent of the cases, the caregiver was charged and convicted. And in 11 percent of the cases, the person was charged with a crime, but the judge or jury did not convict. The other 14 percent accounts for cases that are still open or the status is unknown.

 

[New York Times] He Left His Twins in a Hot Car and They Died. Accident or Crime?

https://www.nytimes.com/2019/08/01/nyregion/children-left-to-die-in-hot-cars-accident-or-murder.html

 

アメリカは、金あるいは金もしくは金と、人種宗教地域性裁判結果を決めるけど、

 

そもそも車内に子どもだけを残すこと自体が多くの州で犯罪

犯罪として規定していない州でもホットカー法(hot car laws)があるし

規定がなきゃOKではなく、終身刑食らった親の住んでたのはジョージア州法律規定はないよ

単純に児童虐待でしょっ引かれるし、スーパーなどで親が怒られている様子とか割と見る光景だそうだ

子どもだけじゃなくて犬猫も同様

 

Is it illegal to leave a child in the car?

https://www.finder.com/child-in-car-laws

 

An Avoidable Tragedy: Dogs in Hot Cars

https://aldf.org/project/an-avoidable-tragedy-dogs-in-hot-cars/

 

市民児童動物虐待としてフツーにガンガン通報・救出するし、警察官もアホがいないか見回ってるし、

日本よりも、人口底辺も多く、国土も広いけど、見えている子ども に関しては未然に防がれている印象

 

なお米国ネット民の反応としては「子どもを車に放置死させる両親は薬物検査を受けろ」ですな

“The parents need to be drug tested asap.”

 

“The type of parents that are this mindless would have to be drunk or high on drugs not to realize their child is in the vehicle. Or, they are trying to murder their child and avoid prison by claiming it was an accident.”

 

[WKMG News 6&ClickOrlando] Newborn dies after being left in hot car in Florida

https://www.clickorlando.com/news/florida/2020/09/04/newborn-dies-after-being-left-in-hot-car-in-florida/

 

ちなみに、異常に親の権利が強く自己責任を問われにくいジャップランドの反応

子ども車内置き忘れは私にも!?:赤ちゃん忘れ症候群記憶ヒューマンエラー心理学

https://news.yahoo.co.jp/byline/usuimafumi/20190811-00137869/

酒の責任も取れないジャップ大麻なんてマジとんでもないね。見えない子ども児童虐待が加速する

子どもを置き忘れる(そもそもなぜか置いていくことが罪にならない)がなにせヒューマンエラーらしいんで

もちろん、責任能力が怪しい人も子を持つ権利はあるし、怪しい親のフォロー必要なことに同意はするが、

児童福祉に関する法律を強化した後、親権停止を欧米並みにした後では?

 

2021-05-31

https://github.com/kokorohamoe/OpenProfile/blob/master/700_sample/Java/Jurina/reader.cpp

とてもシンプルコード

int main(int argc,const char*argv[]){

int v;

char buffer[1024];

while(1){

printf("input\n");

scanf("%s%d",buffer,&amp;v);

if(strcmp(buffer,"print")==0)

fprintf(stderr, "public class base{\n"

"public static void main(String[] args){\n"

"int i = %d;\n"

"System.out.println(i);}}\n",v);

}

return 0;

}

jurina

cat filename.jurina

print "Hello world";

という命令ファイルから受け取ったら

public class filename{

public static void main(String[] args){

System.out.println("Hello world");

}

}

と出力するプログラムをjurinaと名付けるとする

cat filename.jurina

int i=1;

print i;

public class filename{

public static void main(String[] args){

int i=1;

System.out.println(i);

}

}

ものすごく単純なPythonっぽい独自言語

Javaに置き換えて出力するだけのJava プリプロセッサである

さて、このJurina言語JAVA VMで動くと思うか?

   

言いたいことVMを解析して、OPコードを吐くコンパイラを作ろうとしていたが

そもそもコンパイラが作れるならJavaソースコードを吐いてしまえば良いことに気がついた

2021-05-04

anond:20210426025101

public class Main {

public static void main(String args[]) {

System.out.println("ア゙ァーッ ォギョヴァアア!!");

}

}

2021-04-13

anond:20210413061256

こんなにブクマ付いちゃったら辞めらんないじゃん。

Boolean 退職( int ブクマ )

{

  if(ブクマ==1)

   return( TRUE );

  else

   return( FALSE );

};

void main( void )

{

int ブクマ;

printf( "ブクマ数を入力:" );

scanf( "%d", &ブクマ );

if( 退職( ブクマ ) == TRUE )

  printf( "この度私は退職することとなりました。\n" );

else

  printf( "この度私は退職しないこととなりました。\n" );

};

2021-03-20

anond:20210320174526

7と8。

技術的なところが気になる人はこれだけ読んでくれたらいい

7. アプリケーションコード自体はRocketChatのものとほぼ同じ

最後技術的な観点からエアレペルソナが純国産ではないということを指摘する。

結論から先に述べると、このアプリは純国産ではない。

RocketChatという海外で開発されたOSSチャットアプリフォーク、改変したもののよう。

ttps://github.com/RocketChat/Rocket.Chat.ReactNative

ttps://rocket.chat

フォーク元はバリバリ多国籍外資である。(RocketChat自体問題のないアプリであり、このエアレペルソナとはフォーク関係を超える関係はないと思われる)

冒頭のこの部分に関してである

ttps://play.google.com/store/apps/details?id=chat.airlex.reactnative

Google Playで公開されているエアレペルソナAndroidアプリリバースエンジニアリングして調べてみた。

ちなみに、エアレペルソナには利用規約のようなものは見当たらず、リバースエンジニアリング禁止条項も無いようだった。

ttps://apps.evozi.com/apk-downloader/

ttps://github.com/pxb1988/dex2jar

この辺を使ってapkダウンロードし、apk解凍し、chat.airlex.reactnative/classes.dexjar fileに変換した。

classes.dexから変換されたjarファイルを展開するとchat/airlex/reactnativeというフォルダパッケージが見つかる。

このパッケージ内のファイル(.classクラス)がエアレペルソナの処理を行うもののようである

特徴的なクラスにEjsonという名前のものがある。

このクラスJadを使い、デコンパイルしてみた。その結果が以下である

ttp://www.javadecompilers.com

ちなみにここからapkアップロードするとdex2jarをしなくてもJavaソースコードにまでデコンパイルしてくれた。便利。

package chat.airlex.reactnative;

import android.content.Context;
import com.ammarahmed.mmkv.SecureKeystore;
import com.facebook.react.bridge.ReactApplicationContext;
import com.tencent.mmkv.MMKV;

public class Ejson {
    private String TOKEN_KEY = "reactnativemeteor_usertoken-";
    String cardId;
    String host;
    String messageId;
    String messageType;
    /* access modifiers changed from: private */
    public MMKV mmkv;
    String msg;
    String notificationType;
    String rid;
    Sender sender;
    String senderName;
    String type;

    public Ejson() {
        ReactApplicationContext reactApplicationContext = CustomPushNotification.reactApplicationContext;
        if (reactApplicationContext != null) {
            MMKV.initialize((Context) reactApplicationContext);
            new SecureKeystore(reactApplicationContext).getSecureKey(C0617Utils.toHex("com.MMKV.default"), new RNCallback() {
                public void invoke(Object... objArr) {
                    if (objArr[0] == null) {
                        MMKV unused = Ejson.this.mmkv = MMKV.mmkvWithID("default", 1, objArr[1]);
                    }
                }
            });
        }
    }

    public String getAvatarUri() {
        if (this.type == null) {
            return null;
        }
        return serverURL() + "/avatar/" + this.sender._id + "?rc_token=" + token() + "&amp;amp;rc_uid=" + userId();
    }

    public String token() {
        String userId = userId();
        MMKV mmkv2 = this.mmkv;
        return (mmkv2 == null || userId == null) ? "" : mmkv2.decodeString(this.TOKEN_KEY.concat(userId));
    }

    public String userId() {
        String serverURL = serverURL();
        MMKV mmkv2 = this.mmkv;
        return (mmkv2 == null || serverURL == null) ? "" : mmkv2.decodeString(this.TOKEN_KEY.concat(serverURL));
    }

    public String privateKey() {
        String serverURL = serverURL();
        MMKV mmkv2 = this.mmkv;
        if (mmkv2 == null || serverURL == null) {
            return null;
        }
        return mmkv2.decodeString(serverURL.concat("-RC_E2E_PRIVATE_KEY"));
    }

    public String serverURL() {
        String str = this.host;
        return (str == null || !str.endsWith("/")) ? str : str.substring(0, str.length() - 1);
    }

    public class Sender {
        String _id;
        String username;

        public Sender() {
        }
    }
}

フィールド名を見てみると、cardId, host, messageId, messageType, mmkv, msg, notificationType, rid, sender, senderName, typeが存在する。

メソッドには、getAvaterUri、token、userId、privateKey、severURLが存在する。

ところで、RocketChatというOSSチャットアプリ存在する。

ttps://rocket.chat

そのRoketChatのAndroid実装の中に同名のEjsonというクラス存在する。

ttps://github.com/RocketChat/Rocket.Chat.ReactNative

ttps://github.com/RocketChat/Rocket.Chat.ReactNative/blob/develop/android/app/src/play/java/chat/rocket/reactnative/Ejson.java

見比べてみると、フィールドにcardIdが追加されている以外はフィールドメソッド名、そしてその処理の内容まで一致している。

他にもReplyBroadcastなど、同様のクラスがエアレペルソナに見つかる。

以上のことからエアレペルソナはRocketChatをフォークして、パッケージ名を変えて作られたチャットアプリであり、開発の大部分はRocketChat社の努力と多数のOSSコントリビュータによってなされたものであると思われる。

これを純国産日本製と呼ぶには大分無理がある気がする。

そもそもこのOSS時代に純だの何だの言っている時点で怪しい。

8. OSSライセンスに関して

さて、エアレペルソナがRocketChatをフォークして作られたものであるとすると、気になるのはライセンスである

RocketChatのOSSライセンスMITライセンスである

ttps://github.com/RocketChat/Rocket.Chat.ReactNative/blob/develop/LICENSE

MITライセンスは非常に緩いライセンスであるため、エアレペルソナの様にフォークして別のアプリケーションとして公開することにはおそらく問題がないということは強調しておく。

現状エアレペルソナログインできておらず(2要素認証コード送信されないといった問題が起きている模様)、使用している各OSSライセンス表示が適切に行われているかまでは調べられていない。

2021-01-16

anond:20210115230219

ブックマークレット作ったぞ。

javascript:void((function(){document.body.innerHTML=document.body.innerHTML.replace(/コロ/g,'モ');})());

2020-12-09

配列操作するメソッドの書き方の正解がわからない

例えば、引数配列を受け取って要素を足すメソッドとき

以下のパターンがある

どれが正解かわからない

引数配列をそのまま操作して戻り値を返さなパターン

private void addValueToArray(String[] array) {

 array.add("foo");

}

// 呼び出し

addValueToArray(array);

// この後そのままarrayを使う

String bar = array[0];

引数配列をそのまま操作して戻り値を返すパターン

private String[ ] addValueToArray(String[] array) {

 array.add("foo");

 return array;

}

// 呼び出し

String[] newArray = addValueToArray(array);

// この後はnewArrayを使う

String bar = newArray[0];

新しい配列を作って返すパターン

private String[ ] addValueToArray(String[] array) {

 String[] resultArray = array;

 resultArray.add("foo");

 return resultArray;

}

// 呼び出し

String[] newArray = addValueToArray(array);

// この後はnewArrayを使う

String bar = newArray[0];

2020-11-15

anond:20201115003553

まあ確かに1語だけで済むケースは少ないと思う。

でも、冗長名前になってるなっていうのはあって、例えば

void setHoge(Hoge hoge)

みたいなのだと、パラメータの型名でHogesetするのはわかるから

void set(Hoge hoge)

でいいじゃんみたいなのはあると思う。

2020-09-07

クルマ閉じ込め欧米どうこう anond:20200907124839

とりあえず、米国

仮釈放無しの終身刑を言い渡されることもあれば(例:2014年6月ジョージア州 ジャスティン・ロス・ハリス https://en.m.wikipedia.org/wiki/Murder_of_Cooper_Harris

うんうん、わかるよー不幸な事故だよねーで不起訴になるケースも43%もある上に、起訴されても11%は無罪になったりで、

日本以上に法とは?裁判とは?といった様相

said they were not aware they had left their babies in hot cars. In 43 percent of those cases, no charges were filed. In 32 percent of the cases, the caregiver was charged and convicted. And in 11 percent of the cases, the person was charged with a crime, but the judge or jury did not convict. The other 14 percent accounts for cases that are still open or the status is unknown.

 

[New York Times] He Left His Twins in a Hot Car and They Died. Accident or Crime?

https://www.nytimes.com/2019/08/01/nyregion/children-left-to-die-in-hot-cars-accident-or-murder.html

 

アメリカは、金あるいは金もしくは金と、人種宗教地域性裁判結果を決めるけど、

 

そもそも車内に子どもだけを残すこと自体が多くの州で犯罪

犯罪として規定していない州でもホットカー法(hot car laws)があるし

規定がなきゃOKではなく、終身刑食らった親の住んでたのはジョージア州法律規定はないよ

単純に児童虐待でしょっ引かれるし、スーパーなどで親が怒られている様子とか割と見る光景だそうだ

子どもだけじゃなくて犬猫も同様

 

Is it illegal to leave a child in the car?

https://www.finder.com/child-in-car-laws

 

An Avoidable Tragedy: Dogs in Hot Cars

https://aldf.org/project/an-avoidable-tragedy-dogs-in-hot-cars/

 

市民児童動物虐待としてフツーにガンガン通報・救出するし、警察官もアホがいないか見回ってるし、

日本よりも、人口底辺も多く、国土も広いけど、見えている子ども に関しては未然に防がれている印象

 

なお米国ネット民の反応としては「子どもを車に放置死させる両親は薬物検査を受けろ」ですな

“The parents need to be drug tested asap.”

 

“The type of parents that are this mindless would have to be drunk or high on drugs not to realize their child is in the vehicle. Or, they are trying to murder their child and avoid prison by claiming it was an accident.”

 

[WKMG News 6&ClickOrlando] Newborn dies after being left in hot car in Florida

https://www.clickorlando.com/news/florida/2020/09/04/newborn-dies-after-being-left-in-hot-car-in-florida/

 

ちなみに、異常に親の権利が強く自己責任を問われにくいジャップランドの反応

子ども車内置き忘れは私にも!?:赤ちゃん忘れ症候群記憶ヒューマンエラー心理学

https://news.yahoo.co.jp/byline/usuimafumi/20190811-00137869/

酒の責任も取れないジャップ大麻なんてマジとんでもないね。見えない子ども児童虐待が加速する

子どもを置き忘れる(そもそもなぜか置いていくことが罪にならない)がなにせヒューマンエラーらしいんで

もちろん、責任能力が怪しい人も子を持つ権利はあるし、怪しい親のフォロー必要なことに同意はするが、

児童福祉に関する法律を強化した後、親権停止を欧米並みにした後では?

2020-08-02

__global void f (int N,int *A){

int i=N;

for (int N=0;N<i;N++)A[N]=A[N-1]+A[N-2];

}

2020-07-20

1万行のソースコードアプリを、1行で破壊してください という遊びで僕が考えたつまらない方の回答

int main(void){

  return 0;//この1行だけついか

  長い1万行のアプリコード

}

僕が考えた他人ソースコードをなぜ1行変えることがいけないのかを説明するコード

MQL5のテクニカル指標ハンドルバッファーの扱い(MQL5勉強中おぼえ

まずMQL4とMQL5ではiMA等のテクニカル指標関係関数の使い勝手が大幅に変わってる。

MQL5で必要なのは以下のとおり

ハンドル(int型)

ひとつ指標に対してひとつハンドル必要

例えば期間75のEMAと期間200のEMAの2つのiMAを使うなら、MA075handleとMA200handleみたいにint型変数を用意しなきゃいけないらしい。

EAしろカスタムインジケーターしろひとつハンドルを作ったら同プログラム内で使い回すことになるだろうからグローバル宣言するのがよろしいっぽいな

バッファ

MQL4では関数を呼び出したらその都度計算してる訳で、過去の足の値を参照するにも毎度計算してるから重いっつーことで、一度計算した値はバッファ配列に放り込めば過去の値は読み出すだけで済むようになったらしい。

動的配列(すなわち最初インデックスを数値なしでの宣言、具体例は double MA075buffer[]; という形での宣言)でないとだめで、ArraySetAsSeries関数時系列並び(具体例は ArraySetAsSeries(MA075buffer,true); )にするべきだろう。

EAでの実践

では、移動平均では指標ひとつしかなくて参考になりづらいので、MACD(メイン線とシグナル線)でやってみよう。

ハンドルバッファグローバル変数宣言

int MacdHandle; //MACD関数ハンドル

double MacdMainBuffer[]; //MACDのメイン線バッファ

double MacdSignalBuffer[]; //MACDシグナル線バッファ

OnInit()関数ハンドルを取得する

int OnInit()

{

MacdHandle = iMACD(NULL,0,12,26,9,PRICE_CLOSE); // MacdHandleにiMACDハンドルが代入される。この時点ではメイン線・シグナル線の区別をつけないことに注目

return(0);

}

OnTick()関数内での使い方

void OnTick()

{

CopyBuffer(MacdHandle,MAIN_LINE,0,10,MacdMainBuffer); // 2個目の引数でメイン線・シグナル線を切り替える。MQL4ではMODE_MAINとMODE_SIGNALだったがMQL5では表記が変わった模様

CopyBuffer(MacdHandle,SIGNAL_LINE,0,10,MacdSignalBuffer); //勿論メイン線なら0、シグナル線なら1と入力しても差し支えはないが、僕の場合可読性重視の為に可能な限り定数型で書く

//過去10本の足だけバッファコピーするようにした。EAならそんなに過去を参照することもないだろうし、ぶっちゃけ10もいらない気もする

ArraySetAsSeries(MacdMainBuffer,true); //時系列並びにするとインデックス番号0が現在の最新足の値になる

ArraySetAsSeries(MacdSignalBuffer,true);

OnDeinit()関数にてメモリ上のキャッシュを開放

void OnDeinit()

{

IndicatorRelease(MacdHandle);

}

ってやらないといつまでもメモリを確保したまんまになっちゃうらしい。

MQL4と違って扱いはなにかと面倒くさくはなってるなーという印象

ログイン ユーザー登録
ようこそ ゲスト さん