プログラミング

フィールド効果技編(しろいきり) PHPポケモン 50

PHP PHPポケモン ポケモン
フィールド効果技編(しろいきり) PHPポケモン 50

フィールド効果技とは

ポケモンの技の中には、ポケモンに対して状態変化や異常を与えるもの以外に、フィールド自体に効果を持たせるものがいくつかあります。PHPポケモンでは未実装ですが、そういったフィールド効果技はポケモンを交代したとしても場に効果が残り続けます。 

場の状態(ポケモンwiki

場の状態に似たものとして、状態異常と状態変化がある。これら2つはポケモン1匹について関係する状態だが、場の状態はバトルフィールドについて関係する状態である。したがって、ポケモンを交代させても、場の状態の持続・回復(解除)には基本的に関与しない。

対象範囲として、味方・相手いずれか片方の場の状態と、全体の場の状態の2つがある。

ポケモンにとって有利なものと、不利なものそれぞれがある。また、一部を除いて異なる場の状態を重ねがけすることができる。

 

初代ポケモンでは自分の場に対して影響を与える技しか存在しません。第2世代からは天気技と、相手の場に影響を与える技(まきびし等)が実装されました。

 

フィールド状態のセット

まずはフィールド対象技を使用した際に格納するためのプロパティをコントローラーに用意します。処理自体はサービスで行うため、runなどと同じようにプロパティを引き継ぐ形式で実装しましょう。

 

バトルコントローラー(/App/Controllers/Battle/BattleController.php
<?php
$root_path = __DIR__.'/../../..';
require_once($root_path.'/App/Controllers/Controller.php');
// サービス
require_once($root_path.'/App/Services/Battle/StartService.php');
require_once($root_path.'/App/Services/Battle/RunService.php');
require_once($root_path.'/App/Services/Battle/FightService.php');
// トレイト
require_once($root_path.'/App/Traits/Common/CommonFieldTrait.php');
require_once($root_path.'/App/Traits/Controller/BattleControllerTrait.php');
 
// バトル用コントローラー
class BattleController extends Controller
{
 
    use CommonFieldTrait;
    use BattleControllerTrait;
 
    /**
    * 敵ポケモン格納用
    * @var object
    */
    protected $enemy;
 
    /**
    * 逃走を試みた回数
    * @var integer
    */
    public $run = 0;
 
    /**
    * フィールド効果
    * @var integer
    */
    protected $field = [
        'friend' => [],
        'enemy' => [],
    ];
 
    /**
    * ひんし状態の格納
    * @var array
    */
    protected $fainting = [
        'friend' => false,
        'enemy' => false,
    ];
 
    /**
    * 前ターンのポケモンの状態
    * @var array
    */
    protected $before = [
        'friend' => null,
        'enemy' => null,
    ];
 
    /**
    * @return void
    */
    public function __construct()
    {
        // 親コンストラクタの呼び出し
        parent::__construct();
        // 引き継ぎ
        $this->takeOver();
        // 分岐処理
        $this->branch();
        // 次のターンへの分岐(ループ処理)
        while($this->nextTurn());
        // 親デストラクタの呼び出し
        parent::__destruct();
    }
 
    /**
    * 引き継ぎ処理
    * @return void
    */
    private function takeOver()
    {
        // にげるの実行回数を引き継ぎ
        if(isset($_SESSION['__data']['run'])){
            $this->run = $_SESSION['__data']['run'];
        }
        // フィールド状態を引き継ぎ
        if(isset($_SESSION['__data']['field'])){
            $this->field = $_SESSION['__data']['field'];
        }
        // ポケモンの引き継ぎ
        $this->takeOverPokemon($_SESSION['__data']['pokemon']);
        // 敵ポケモンの引き継ぎ
        $this->takeOverEnemy($_SESSION['__data']['enemy'] ?? '');
    }
 
    /**
    * アクションに合わせた分岐
    * @return void
    */
    private function branch()
    {
        try {
            // アクション分岐
            switch ($this->request('action')) {
                /******************************************
                * 開始
                */
                case 'battle':
                // サービス実行
                $service = new StartService($this->pokemon);
                $service->execute();
                // 実行結果
                $this->enemy = $service->getResponse('enemy');
                // 前ターンの状態をプロパティに格納
                $this->before['enemy'] = clone $this->enemy;
                $this->setMessage($service->getMessages());
                $this->setResponse($service->getResponses());
                break;
                /******************************************
                * たたかう
                */
                case 'fight':
                // サービス実行
                $service = new FightService(
                    $this->pokemon,
                    $this->enemy,
                    $this->request('param'),
                    $this->field
                );
                $service->execute();
                // 実行結果
                $this->fainting = $service->getResponse('fainting');
                $this->field = $service->getResponse('field');
                $this->setMessage($service->getMessages());
                $this->setResponse($service->getResponses());
                break;
                /******************************************
                * にげる
                */
                case 'run':
                // 回数をプラス
                $this->run++;
                // サービス実行
                $service = new RunService(
                    $this->pokemon,
                    $this->enemy,
                    $this->run,
                    $this->field
                );
                $service->execute();
                // 実行結果
                if(!$service->getResponse('result')){
                    // 失敗
                    $this->fainting = $service->getResponse('fainting');
                    $this->field = $service->getResponse('field');
                }
                $this->setMessage($service->getMessages());
                $this->setResponse($service->getResponses());
                break;
                /******************************************
                * バトル終了
                */
                case 'end':
                $this->battleEnd();
                break;
                /******************************************
                * アクション未選択 or 実装されていないアクション
                */
                default:
                // もしどちらかが戦闘不能状態であればバトルを強制終了
                if(empty($this->before_remaining_hp['friend']) || empty($this->before_remaining_hp['enemy'])){
                    $this->battleEnd();
                }
                break;
            }
        } catch (\Exception $e) {
            // 初期画面へ移管
            $_SESSION['__route'] = 'initial';
            header("Location: ./", true, 307);
            exit;
        }
    }
 
    /**
    * バトル終了メソッド
    *
    * @return boolean
    */
    private function battleEnd()
    {
        // 破棄
        unset(
            $_SESSION['__data']['enemy'],
            $_SESSION['__data']['rank'],
            $_SESSION['__data']['sc'],
            $_SESSION['__data']['run'],
            $_SESSION['__data']['field']
        );
        $_SESSION['__route'] = 'home';
        header("Location: ./", true, 307);
        exit;
    }
 
    /**
    * 次のターンへの判定処理
    *
    * @return boolean
    */
    private function nextTurn()
    {
        // ひんしポケモンがでた場合の処理
        if($this->fainting['enemy'] || $this->fainting['friend']){
            $this->judgment();
            return false;
        }
        // チャージ中または反動有りなら再度アクション実行
        if($this->chargeNow() || $this->pokemon->checkSc('ScRecoil')){
            $this->branch();
            return true;
        }else{
            $this->setMessage('行動を選択してください');
            return false;
        }
    }
 
}

 

フィールド処理はコントローラーとサービスの両方で呼び出す可能性があるため、Commonディレクトリに対して共通トレイトを用意しました。

 

フィールドトレイト(/App/Traits/Common/CommonFieldTrait.php
<?php
// フィールド関係のトレイト
trait CommonFieldTrait
{
 
    /**
    * フィールド状態の確認
    *
    * @param string $target
    * @param Field:object $field
    * @return boolean
    */
    protected function checkField(string $target, object $field)
    {
        if(isset($this->field[$target][get_class($field)])){
            return true;
        }else{
            return false;
        }
    }
 
    /**
    * フィールド状態の取得
    *
    * @return boolean
    */
    public function getField()
    {
        return $this->field;
    }
 
    /**
    * フィールドのセット
    *
    * @param string $target
    * @param Field:object $field
    * @param integer $turn
    * @return void
    */
    protected function setField(string $target, object $field, int $turn)
    {
        if($this->checkField($target, $field)){
            // 既にセットされている
            $this->setMessage($field->getAlreadyMessage($target));
        }else{
            // フィールドをセット
            $this->field[$target][get_class($field)] = $turn;
            $this->setMessage($field->getSetMessage($target));
        }
    }
 
    /**
    * フィールド状態の解除
    *
    * @param string $target
    * @param Field:object $field
    * @return boolean
    */
    protected function releaseField(string $target, object $field)
    {
        if($this->checkField($target, $field)){
            // 解除
            unset($this->field[$target][get_class($field)]);
            // 解除メッセージをセット
            $this->setMessage($field->getReleaseMessage($target));
        }
    }
 
    /**
    * ターンカウントをすすめる(状態変化)
    *
    * @return void
    */
    protected function goFieldTurn()
    {
        $targets = ['friend', 'enemy'];
        foreach($targets as $target){
            // 全ターゲットのフィールド状態を解除
            foreach($this->field[$target] as $field => &$turn){
                $turn--;
                if($turn <= 0){
                    // 残ターンが0ターン以下になれば解除
                    $this->releaseField($target, new $field);
                }
            }
        }
    }
 
}

 

フィールドも状態変化や状態異常と同様に親クラス・子クラスで管理をしていきます。それを想定してチェック(checkField)、取得(getField)、セット(setField)、解除(releaseField)、ターン進行(goFieldTurn)の5つのメソッドを用意しました。

 

チェックは汎用的に使うメソッドです。基本的にgetを使いながら処理を進行させていくわけではありません。こちらはあくまで画面移管での引き継ぎに使用するために用意したメソッドなので、そのまま中身を返却しています。

セットメソッドは状態変化などと同様です。一番親となるキーはポケモンの立場(position)、次のキーでフィールドクラスを判別し、値には残りターン数をセットしています。

 

ターンの進行

次にターンの進行処理についてです。こちらは行動がすべて終了した時点でカウントを進めます。現在は交代ポケモンがいませんので、どちらかが戦闘不能になれば解除処理は不要ですが、もし味方または相手に交代ポケモンがいればターンカウントを進める必要があるので、サービスの最終段階でgoFieldTrunのメソッドを呼び出します。

 

たたかうのサービス(/App/Services/Battle/FightService.php
/**
* @return void
*/
public function execute()
{
    // ターンダメージのリセット
    $this->pokemon
    ->resetTurnDamage();
    $this->enemy
    ->resetTurnDamage();
    // 技取得
    $p_move = $this->selectMove();
    $e_move = $this->selectEnemyMove();
    // 行動順の取得
    $orders = $this->orderMove(
        [$this->pokemon, $this->enemy, $p_move],
        [$this->enemy, $this->pokemon, $e_move],
    );
    // 攻撃処理
    if($this->actionAttack($orders)){
        // 行動後の状態異常・変化をチェック
        $this->afterCheck();
    }
    // フィールドのカウントを進める
    $this->goFieldTurn();
    // 指定したプロパティを返却
    $this->exportProperty('fainting', 'field');
}

※にげるの場合でもターンカウントを進める必要があるので、同様に進行処理を記述しておきましょう

 

解除のタイミングについてはターンカウント進行後です。残ターン数が0になっていればunsetで取り除きます。ターン進行が行動後のため、もし後攻でフィールド効果技を使用すれば実質4ターンのみしか効果が発揮されないことになります。

 

しろいきり

それでは、フィールド効果技の1つ目として「しろいきり」を実装しましょう。マルチバトルでは重宝されるようですが、1対1の場合は採用率が少なく、正直なところ出力メッセージも曖昧な部分がありますが、wikiを参考にしながら作成していきます。

 しろいきり(ポケモンwiki

 

しろいきり:技(Classes/Move/MoveMist.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// しろいきり
class MoveMist extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'しろいきり';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '5ターンの間、場をしろいきり状態にして能力を下げられなくする。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'TypeIce';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'status';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = null;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = null;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 30;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * フィールド効果
    *
    * @return array
    */
    public function field()
    {
        return [
            'class' => 'FieldMist',
            'turn' => 5,
        ];
    }
 
}

 

こちらはフィールドに対して効果を発生させなければいけないので、effects内では処理ができません。なので、新しくfieldというメソッドを作成してフィールドクラスとターン数を配列で返却しましょう。

他の技クラスでもfieldメソッドを呼び出してエラーが出てしまわないよう、親クラス(Move.php)では空配列を返却するfieldメソッドを用意しておいてください。

 

次に、フィールド用のクラスを作成します。

 

フィールドクラス(/Classes/Field.php
<?php
 
// フィールド状態
abstract class Field
{
 
    // プロパティの初期値
    protected $set_msg = '';
    protected $already_msg = '';
    protected $release_msg = '';
    protected $failed_msg = '';
 
    /**
    * インスタンス作成時に実行される処理
    *
    * @return void
    */
    public function __construct()
    {
        //
    }
 
    /**
    * フィールドセット時のメッセージ
    *
    * @param string $target
    * @return string
    */
    public function getSetMessage($target)
    {
        $prefix = '味方は';
        if($target === 'enemy'){
            $prefix = '相手は';
        }
        return ($prefix ?? '').$this->set_msg;
    }
 
    /**
    * 既にフィールドがセットされている時のメッセージ
    *
    * @param string $target
    * @return string
    */
    public function getAlreadyMessage($target)
    {
        $prefix = '味方は';
        if($target === 'enemy'){
            $prefix = '相手は';
        }
        return ($prefix ?? '').$this->already_msg;
    }
 
    /**
    * フィールド解除時のメッセージ
    *
    * @param string $target
    * @return string
    */
    public function getReleaseMessage($target)
    {
        $prefix = '味方の';
        if($target === 'enemy'){
            $prefix = '相手の';
        }
        return ($prefix ?? '').$this->release_msg;
    }
 
    /**
    * 状態異常にかかった際のメッセージを取得
    *
    * @param string $pokemon
    * @return string
    */
    public function getFailedMessage($pokemon)
    {
        return str_replace('::pokemon', $pokemon, $this->failed_msg);
    }
 
}

 

しろいきり:フィールド(/Classes/Field/FieldMist.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Field.php');
 
// しろいきり
class FieldMist extends Field
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'しろいきり';
 
    /**
    * フィールドセット時のメッセージ
    * @var string
    */
    protected $set_msg = 'しろいきりに包まれた';
 
    /**
    * 既にフィールドセットされている状態のメッセージ
    * @var string
    */
    protected $already_msg = '既にしろいきりに包まれている';
 
    /**
    * フィールド解除時のメッセージ
    * @var string
    */
    protected $release_msg = 'しろいきりが晴れた';
 
    /**
    * デバフ無効化時のメッセージ
    * @var string
    */
    protected $failed_msg = '::pokemonは、しろいきりに守られている';
 
}

 

新しいクラスのディレクトリが作成されたので、オートローダーに検索対象となるディレクトリ(Field)を追加しておきましょう。

  

デバフの分岐

しろいきりの効果は、能力(ランク)を下げられなくするという効果です。ですが、現在の仕様ではその制御を一括でする方法がなく、effectsメソッドを呼び出す際にフィールドを受け取り、しろいきり状態でなければ処理を行うといった記述が必要になります

その場合、すべての技で分岐を作る必要があり保守性が悪くなってしまうため、能力を下げる効果(デバフ)をeffectsではなく、新しくdebuffというメソッドで実行させましょう。

 

なきごえ:技(/Classes/Move/MoveGrowl.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// なきごえ
class MoveGrowl extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'なきごえ';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '相手のこうげきを一段階下げる。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'TypeNormal';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'status';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = null;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 40;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * 能力下降確定技フラグ
    * @var boolean
    */
    protected $confirm_debuff_flg = true;
 
    /**
    * 能力下降効果
    *
    * @param array $args
    * @return void
    */
    public function debuff(...$args)
    {
        /**
        * @param Pokemon $atk 攻撃ポケモン
        * @param Pokemon $def 防御ポケモン
        */
        list($atk, $def) = $args;
        // 相手の攻撃ランクを1段階下げる
        $msg = $def->subRank('Attack', 1);
        // メッセージをセット
        $this->setMessage($msg);
    }
 
}

 

今まではeffectsメソッドを使って呼び出していましたが、こちらをdebuffというメソッドに変更しています。また、この技が確定効果としてデバフが備わっている場合は「しろいきりに守られている」ということをメッセージで返却する必要があるので、判別用のフラグプロパティ($confirm_debuff_flg)を設定しておきましょう。

「あわ」や「サイコキネシス」など、技の追加効果として確率でデバフが発生する技では、メソッドの変更だけを行いフラグは不要です。

 

あわ:技(/Classes/Move/MoveBubble.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// あわ
class MoveBubble extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'あわ';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '10%の確率ですばやさを1段階下げる。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'TypeWater';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'special';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = 40;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 30;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * 能力下降効果
    *
    * @param array $args
    * @return void
    */
    public function debuff(...$args)
    {
        // 10%の確率
        if(10 < random_int(1, 100)){
            // random_intで11以上が生成されたら失敗
            return;
        }
        /**
        * @param Pokemon:object $atk 攻撃ポケモン
        * @param Pokemon:object $def 防御ポケモン
        */
        list($atk, $def) = $args;
        // 相手の素早さランクを1段階下げる
        $msg = $def->subRank('Speed', 1);
        // メッセージをセット
        $this->setMessage($msg);
    }
 
}

 

次にdebuffメソッドの呼び出しについてです。こちらは攻撃用トレイトのeffectsメソッドの後に記述しましょう。

 

攻撃用トレイト(/App/Traits/Service/Battle/ServiceBattleAttackTrait.php
/**
* 攻撃判定成功時の処理
*
* @param object $atk_pokemon
* @param object $def_pokemon
* @param object $move
* @return void
*/
private function attackSuccess($atk_pokemon, $def_pokemon, $move)
{
 
--省略
 
    // 追加効果(相手にHPが残っていれば)
    if($def_pokemon->getRemainingHp()){
        // 追加効果
        $move->effects($atk_pokemon, $def_pokemon);
        // 能力下降効果
        $field_mist = new FieldMist;
        if($this->checkField($def_pokemon->getPosition(), $field_mist)){
            // 能力下降確定技であれば失敗メッセージを出力
            if($move->getConfirmDebuffFlg()){
                $this->setMessage($field_mist->getFailedMessage($def_pokemon->getPrefixName()));
            }
        }else{
            $move->debuff($atk_pokemon, $def_pokemon);
        }
        // メッセージとレスポンスを格納
        $this->setMessage($move->getMessages());
        $this->setResponse($move->getResponses());
        // フィールド効果
        if($move->field()){
            $field = $move->field();
            // フィールドをセット
            $this->setField($atk_pokemon->getPosition(), new $field['class'], $field['turn']);
        }
        // メッセージとレスポンスをリセット
        $move->resetMessage();
        $move->resetResponse();
        // いかり判定
        if($def_pokemon->checkSc('ScRage') && !empty($damage ?? 0)){
            $rage = new ScRage;
            // いかり発動メッセージをセット
            $this->setMessage($rage->getActiveMessage($def_pokemon->getPrefixName()));
            // こうげきランクを1段階上昇
            $msg = $def_pokemon->addRank('Attack', 1);
            $this->setMessage($msg);
        }
        return;
    }
}

 

getConfirmDebuffFlgという判別フラグ取得用のメソッドについても、技の親クラスに追記しています。こちらでは$confirm_debuff_flgの値を返却しているだけです。

もしデバフ確定技であれば、しろいきりによる失敗メッセージを返却、そうでなければ処理そのものをスルーします。

しろいきり状態でなければ、そのままdebuffメソッドを呼び出し、effectsで溜まったメッセージと一緒に取り出し、格納しています。

 

それでは、しろいきりの効果を見てみましょう。

 

 

 

 

 

 

相手のデバフ技に対して、しろいきりで守ることができました。

 

まとめ

いかがだったでしょうか。

今回のPHPポケモンでは「フィールド効果技(しろいきり)」の実装方法を紹介しました。

ゲーム開発やプログラミングに興味がある方は、ぜひ参考にしてみてくださいね。

 

注目の記事

熟練者ほど実践するプログラミングが上達する3つの法則
プログラミング
PHP
熟練者ほど実践するプログラミングが上達する3つの法則

  「なかなかプログラミングが上達しない・・・」 「やったことはあるけど覚えられない」   プログラミングを習得しても、勉強と一緒で使っていなければ忘れてしまいます。また、どんどん上達する人や、長い間プログラミングの技術で生計を立てているような熟練者は、日頃からの取り組み方自体が違ってい...

コンテンツ配信業でバズるために大切な3つの法則〜『1ヶ月でチャンネル登録者数1000人』は参考にするな
マーケティング
YouTube,YouTuber,ブログ
コンテンツ配信業でバズるために大切な3つの法則〜『1ヶ月でチャンネル登録者数1000人』は参考にするな

  YouTubeやブログを始めたけど思ったように伸びない・・・   こういった人は、チャンネル登録者数を伸ばす方法などの動画を見ても参考にならなく、結果に繋がらないという場合がほとんどです。 その理由は、その人自身に問題があるわけではなく、動画の前提条件がそもそも違っているからです。   今回は「...

データ軽量化編 β版へ向けて  PHPポケモン 90
プログラミング
PHP,PHPポケモン,ポケモン
データ軽量化編 β版へ向けて PHPポケモン 90

β版の実装に向けて 大型アップデートにより、ある程度機能改善や実装箇所も増えてきましたが、それと同時に次の段階への移行が本格的に見えてきました。それがβ版です。   PHPポケモンは2020年12月現在α版となっており、完全な試作段階のWEBアプリケーションです。セーブ機能はなく、セッションの有効期...

人員配置計算機〜放課後等デイサービス・児童発達支援〜
プログラミング
JavaScript,児童デイ,児童発達支援,放課後等デイサービス,福祉,計算機
人員配置計算機〜放課後等デイサービス・児童発達支援〜

最近はずっとPHPポケモン開発にかかりっきりでしたが、そろそろ「役立つもの」を作りたくなったので、思いつきで作ってみました。 もちろん「汎用性」のあるものは、既に世の中に存在しているため、ありそうでなさそうなニッチなものを攻めてみます。   そんな中、今回挑んだのは「人員配置計算機」です。 ※実際に...

PHPポケモン「技ポイント(PP)編」36
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「技ポイント(PP)編」36

技ポイント(PP)とは ポケモンではそれそれの技に使用回数が定められています。それが技ポイント(PP)と呼ばれているものです。 PP(ポケモンwiki) https://wiki.ポケモン.com/wiki/PP   技のクラスを実装した際に、それぞれにppというプロパティをもたせて回数をセットしています。これが、対象の技...

有料ノートが公開停止!?プラットフォーム依存の危険性とは
雑記
note,YouTube,ブログ
有料ノートが公開停止!?プラットフォーム依存の危険性とは

  「いままでのnoteがいきなり公開停止になった」 「YouTubeであげていた人気動画が削除された」   規約変更、違反などを理由にこういった被害は年々増えています。自覚して悪意あるコンテンツを作っているユーザーであれば当然の結果だと言ってしまえば済むことですが、努力して収益化する糸口を見つけ...

くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは
雑記
フリーランス,独立,起業
くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは

  仕事ください アドバイスしてください 〇〇について教えてください   こういったくれくれ姿勢の人は多く、投げかけられた側からすると「メリットは?」と感じてしまいます。 ですが実はこのくれくれ姿勢には意外な成功の要因が隠れています。多くの自己啓発記事やツイートをする人はこの本質的なものに触...

【Laravel7】バリデーションメッセージの日本語化【6系対応】
プログラミング
Laravel,Linux,PHP
【Laravel7】バリデーションメッセージの日本語化【6系対応】

  Laravelのバリデーションメッセージは標準だと英語で返ってきてしまいますね。 1つずつ変更する方法もありますが、言語ファイルを作成して一括変更するほうが開発時間の短縮に繋がります。   今回は「Laravel7のバリデーションメッセージを日本語化する方法」をご紹介します。Laravel6系でも同じ方法ででき...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach fortify function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jetstream jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 認証 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力