全知全能を目指す人のありがたい雑記

何かしら意味のあるありがた~い話か、意味のない雑念だらけの日記を書く予定です。

「パワー系PG」は卒業したい

こんにちは。

突然ですが、あなたのプログラムからパワーは感じませんか?

  • 1ファイルに数千行も記載してる?
  • 機能分割がきちんとできていない?
  • 同じコードをコピペしている?
  • 変数を連番に命名している?
  • 変数名が適当?
  • 1行に無理やりロジックを詰め込む?
  • 似たようなリテラルを直書きしてる?

さて、本来はプログラムにパワー(気合)を込めるべきなのでしょうか?

自分はそうは思いません。

成果物に対して、
可能な限り少ないコード量で人が読めるコーディングをすべきです。

気合で書いたコードは以下の問題があります。

  • バグが発生したとき、何千行もあるコードを人が気合で見ることになる
  • バグを修正するとき該当箇所が複数箇所にコピペされており、修正箇所の網羅と修正漏れが怖い
  • 適当な変数名を定義したりリテラルを直書きしたりで、該当行で何の処理をしているのかまったくわからない
  • 1行にやりたいことを詰めすぎて処理が追えない

適当に箇条書きしましたが、とにかく恐ろしいです。

このように、頭を使わないで
とにかく「コピペ」や「一時的な解決にしかならないコーディング」等、
コーディングをパワープレイで済ませようとする人のことを
パワー系PG」と呼んでます。

「パワー系PG」はまともなPGではありません。

自分のプログラムにパワーを感じてきたら
要注意です。

パワー系PGは卒業して、
効率を重視する面倒くさがり屋で優秀なPGになろう。

C言語でうるう年計算・月の末日計算・曜日計算を一通り書いた

学生の課題あるあるのプログラム。

各関数は全部落ちてるソースをパクっただけ。

fudebaco.com
edu.clipper.co.jp
C言語入門:うるう年判定プログラム:Geekなぺーじ

#include <stdio.h>

int main(void){
    int year; //yyyyで入力する!例「1970」
    scanf("%d", &year);
    
    int month; //mmで入力する!例「01」
    scanf("%02d", &month);
    
    char weekdays[7][4] = {"日","月","火","水","木","金","土"};
    
    int lastday = GetLastDay(year, month);
    
    for(int today = 1; today < lastday + 1; ++today){
        printf("%02d%02d%02d日 ",year,month,today);
        int weekday = GetWeekday(year, month, today);
        printf("%s曜日\n",weekdays[weekday]);
    }
    return 0;
}

int IsLeapYear(int year){
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
      printf("%02d年はうるう年\n", year);
      return 1;
    } else {
      printf("%02d年はうるう年ではない\n", year);
      return 0;
    }
}

int GetWeekday( int y, int m, int d ){
    if( m < 3 ) {
        y--; m += 12;
    }
    return ( y + y/4 - y/100 + y/400 + ( 13*m + 8 )/5 + d )%7;
}

int GetLastDay(int year, int month){
    int l;
    int lmdays[] = {31,29,31,30,31,30,31,31,30,31,30,31};
    int mdays[]  = {31,28,31,30,31,30,31,31,30,31,30,31};
    int lastday;
    
    l = IsLeapYear(year);
    if (l == 1) {
        lastday = lmdays[month - 1];
    } else {
        lastday = mdays[month - 1];
    }
    
    printf("%02d%02d月の末日は%d\n",year,month,lastday);
    return lastday;
}

入力

1992 02

出力

1992年はうるう年
1992年02月の末日は29日
1992年02月01日 土曜日
1992年02月02日 日曜日
1992年02月03日 月曜日
1992年02月04日 火曜日
1992年02月05日 水曜日
1992年02月06日 木曜日
1992年02月07日 金曜日
1992年02月08日 土曜日
1992年02月09日 日曜日
1992年02月10日 月曜日
1992年02月11日 火曜日
1992年02月12日 水曜日
1992年02月13日 木曜日
1992年02月14日 金曜日
1992年02月15日 土曜日
1992年02月16日 日曜日
1992年02月17日 月曜日
1992年02月18日 火曜日
1992年02月19日 水曜日
1992年02月20日 木曜日
1992年02月21日 金曜日
1992年02月22日 土曜日
1992年02月23日 日曜日
1992年02月24日 月曜日
1992年02月25日 火曜日
1992年02月26日 水曜日
1992年02月27日 木曜日
1992年02月28日 金曜日
1992年02月29日 土曜日

テーマをカスタマイズした

背景色が地味だったのと、透明感を持たせたいなーと言うことで
コンテンツのアルファ値を変更しやした!!

デザインCSSに以下の記述を追加。

#container-inner{
  background-color: rgba(46, 46, 46, 0.93);
}

.entry-inner blockquote{
  background-color: rgba(46, 46, 46, 0);
}

引用が追随して透過されなかったので、
entry-innerクラスの引用文に対して直接透過を指定しやした。

透明感がでてすっきりしたぜ。

C#で文字列を弄るなら正規表現を使いたい

ファイル名に拡張子をつけていないので、
ファイルを保存する際に、
拡張子を追記して保存するようにしたい

と仰る方を見かけたので一つサンプルコードを。

文字列操作なんて不要!
なら、正規表現で置き換えてみよう。

↓無理やり文字列の後尾に「.png」を追加するプログラム

using System;
using System.Text.RegularExpressions;

public class Program{
    public static void Main(){

        string fileName = Console.ReadLine();

        if(fileName == null){
            Console.WriteLine("入力に文字を入れてください。");
            return;
        }
        
        if(fileName.Contains(".")){
            Console.WriteLine("拡張子を.pngに置き換えます");
            fileName = Regex.Replace(fileName,@"(?<=\.)(.*)","png");
        }
        else{
            fileName = string.Concat(fileName , ".png");
        }
        
        Console.WriteLine(fileName);
    }
}

追記

↑のやつ
「aaaa.hoge.fuga」ってやると
「aaaa.png」になる。駄目コード。

ってか、少し調べてたらこんなクラスがあったで。。。
Path.ChangeExtension メソッド (String, String) (System.IO)

正規表現なんて不要!
なら、ChangeExtensionで置き換えてみよう。

↓無理やり文字列の後尾に「.png」を追加するプログラム(Ver2)

using System;

public class Program{
    public static void Main(){
        
        string fileName = Console.ReadLine();
        
        if(fileName == null){
            Console.WriteLine("入力に文字を入れてください。");
            return;
        }
        
        fileName = System.IO.Path.ChangeExtension(fileName, "png");
        
        Console.WriteLine(fileName);
    }
}

え?
1行で済むやないかーーーーーい

.NET様様だね。

Photon Unity Networkingを使ってみよう「かなぁ」

3Dでかつ、マルチプレイがしたい!ってことで

UnityにPUNを導入することにした。

とりあえず、公式?の解説(古い記事)と

更新日時が比較的新しい(今年の)記事の2つを参考にしている。

 

support.photonengine.jp

nopitech.com

 

導入手順

  1. Photonのサイトでアカ登録

    新規登録 | Photon Engine

  2. 「アプリケーションリスト」に移動してアプリを作成する(種別はPUN)

    https://dashboard.photonengine.com/ja-JP/App/Create

  3. Unityのプロジェクトを立ち上げる
  4. AssetストアからPUNを落とす。Free(無償版)で

    Photon Unity Networking Classic - FREE - Asset Store

  5. PUNウィザードが出るので2で作成したアプリのIDを入れる

 

あとはPUNに接続するためのスクリプトを書けば良いっぽいが、

まだ使ってみよう「かなぁ」なのでやってない!!

 

でもwktkしてる。

 

 

トップ

当ブログでは以下の内容を中心に更新する予定です。

  • 日記
  • プログラミング&開発
  • ゲーム
 
記事の方針として、
「プログラミング&開発」または「ゲーム」のカテゴリを
メインにしていく予定です。 
 
記事の内容としては
「備忘録」や「便利な物の紹介」などを
ありがた~く、独善的に、エゴイスティックに
書いていこうと思います。
(話半分に聞いてやってください*1
 
面白いゲームの紹介や、
プレイングのノウハウなども書けたら良いなぁ。
 
ご質問やご不明点、ご意見等ありましたら
コメントまたは「bluelightbleze@gmail.com」 にてご連絡ください。

*1:気をつけているつもりですが、誤った情報や古い情報を拡散する可能性があるかも。。

Unityのファイル構成

以下のサイトから参考にさせて頂いております。

www.project-unknown.jp

qiita.com

 

上を考慮してみて、

Unity素人の自分が使いやすそうなファイル構成を考えた。

 

{$GameName}/
├ Animations
├ Audio
├ Materials
│ ├ Textures
│ └ Shaders
├ Scripts
│ └ {$namespace}/
│     ├ Behavior
│     └ Logic
├ Scene
│ ├ Test
│ └ Game
└ Prefabs
  ├ Object
  └ Particle
Externals
Licences
Models
Plugins
Resources

 

スクリプトは恐らく債務や内容によって名前空間が区分けされていくと思うので

まずはnamespaceで区切り、

・Behavior(実態を持つもの)

・Logic(実態を持たないロジック部分)

で分ける。

 

一度、このファイル構成で開発してみる。

また何かあれば記事を書きます。