forget for get

覚えるために忘れる

WinMergeでワード、エクセル、パワーポイントの差分を見る

WinMergeでOfficeファイルのテキスト差分を見る

gitやsvnでWord, Excel, PowerPointなどのOfficeファイルを管理していると、
変更があっても、どこが変更されたのかわからず、確認が面倒。

WinMergeプラグインを使うと、Word, Excel, PowerPointなどからテキストを抽出し、
その差分を表示することができます。

プラグインプラグインの設定で
「CompareMSExcelFiles.sct」「CompareMSPowerPointFiles.sct」「CompareMSWordFiles.sct」
があるので、チェックを入れて有効にする。(デフォルトで有効になってるかも)
プラグイン→自動展開

この状態でWinMergeでOfficeファイルの比較をすると、テキスト差分を見ることができる。

TortoiseSVNやGitExtensionsでもOfficeファイルのテキスト差分が見れる

TortoiseSVNやGitExtensionsでもWinMerge連携をしておくと、Officeファイルの差分を見ることができる。

TortoiseSVNのShow logから該当ファイルのShow Changes
GitExtensionsの差分ツールを用いて開く

Apache Tikaを使う方法よりこっちの方が簡単。

よく使うLinuxコマンドまとめ

pwd

cd

cd /var/www/html
cd ../../Models

ls
-l: 詳細 -a: 隠しファイルも表示 -t: 更新時間で並べ替え

ls -alt

mkdir

mkdir new_dir

cp
-a: 所有者、パーミッション、更新時刻などなるべくそのままコピー

cp -a aaa.php bbb.php

mv

mv aaa.php bbb.php
mv aaa.php ../

rm
-r: ディレクトリ削除 -f: 強制削除

rm aaa.php
rm -r dir
rm -f logs/*.log

chmod
-R: ディレクトリ配下を再帰的に

chmod -R 644 public

chown
-R: ディレクトリ配下を再帰的に

chown -R apache:apache public

ln
-s: シンボリックリンク

ln -s target/origin link

find
-name: ファイル名指定

find app/Models -name "*.php"

grep
-R: ディレクトリ配下を再帰的に -v: 除外 -l: ファイル名のみ
-B: 前の行も表示 -A: 後の行も表示

grep -R battle_start app/Models
grep -R battle_start app/Models | grep -v function
grep -R battle_start app/Models -A 3

GitExtensionsで削除されたリモートブランチが消えずに残ってる

結論:GitExtensionsの設定で「フェッチと共にリモートブランチをプルーン」を適用すると解決。(設定>Git>高度な設定)

 

GitExtensionsでブランチ切り替えするとき、リモートブランチ一覧に削除されたリモートブランチが消えずに残ってる。
JIRAでブランチを作成した後、ローカルでブランチを切り替えるときに選びづらくてしょうがなかった。

 

そもそも、普通にフェッチしただけだと、削除されたリモートブランチはローカルからは消えてくれないらしい。
削除したい場合はプルーンというオプションをつける必要がある。

git fetch --prune

参考:Gitのリモートブランチを削除するまとめ - Qiita

 

GitExtensionsで「フェッチと共にリモートブランチをプルーン」という設定を適用すると、削除されたリモートブランチが消えてくれた。

Builderパターン

Builderパターン

複雑なインスタンスを構築する。
Builderクラスが構築のためのメソッドを定義。
Directorクラスがそのメソッドを使ってインスタンスを構築する。
具体的な処理はBuilderクラスのサブクラスが決める。

DirectorはBuilderのメソッドのみを使う。
実際に渡されるサブクラス(TextBuilder、HTMLBuilder)がどれかは知らない。
知らないからこそ、入れ替えができる。

 

Builder.php

abstract class Builder {
  abstract function makeTitle(string $title): void;
  abstract function makeString(string $str): void;
  abstract function makeItems(array $items): void;
  abstract function close(): void;
}

Director.php

class Director {
  private $builder;
  function __construct(Builder $builder) {
    $this->builder = $builder;
  }
  function construct(): void {
    $this->builder->makeTitle("あいさつ");
    $this->builder->makeString("午前");
    $this->builder->makeItems(["おはよう","こんにちは"]);
    $this->builder->makeString("午後");
    $this->builder->makeItems(["こんばんは","おやすみ","さよなら"]);
    $this->builder->close();
  }
}

TextBuilder.php

class TextBuilder extends Builder {
  private $buffer = "";
  function makeTitle(string $title): void {
    $this->buffer .= "==========\n"
      . "『".$title."』\n\n";
  }
  function makeString(string $str): void {
    $this->buffer .= "■".$str."\n\n";
  }
  function makeItems(array $items): void {
    foreach ($items as $item) {
      $this->buffer .= " ・".$item."\n";
    }
    $this->buffer .= "\n";
  }
  function close(): void {
    $this->buffer .= "==========\n";
  }
  function getResult(): string {
    return $this->buffer;
  }
}

HTMLBuilder.php

class HTMLBuilder extends Builder {
  private $filename;
  private $buffer = "";
  function makeTitle(string $title): void {
    $this->filename = $title.".html";
    $this->buffer .= "<html><head><title>".$title."</title></head><body>"
      . "<h1>".$title."</h1>";
  }
  function makeString(string $str): void {
    $this->buffer .= "<p>".$str."</p>";
  }
  function makeItems(array $items): void {
    $this->buffer .= "<ul>";
    foreach ($items as $item) {
      $this->buffer .= "<li>".$item."</li>";
    }
    $this->buffer .= "</ul>";
  }
  function close(): void {
    $this->buffer .= "</body></html>";
    file_put_contents($this->filename, $this->buffer);
  }
  function getResult(): string {
    return $this->filename;
  }
}

Main.php

require "../autoload.php";
if (!isset($argv[1])) {
  echo "引数を指定してください\nphp Main.php [plain/html]";
  return;
}
if ($argv[1] == "plain") {
  $textBuilder = new TextBuilder();
  $director = new Director($textBuilder);
  $director->construct();
  echo $textBuilder->getResult();
} else if ($argv[1] == "html") {
  $htmlBuilder = new HTMLBuilder();
  $director = new Director($htmlBuilder);
  $director->construct();
  $filename = $htmlBuilder->getResult();
  echo $filename . "が作成されました";
}

autoload.php

function autoload($className){
  require './'.$className.'.php';
}
spl_autoload_register('autoload');

Factory Methodパターン

Factory Methodパターン

インスタンスの作り方をスーパークラス側で定める。
具体的な肉付けはサブクラス側で行う。

 

Product.php

abstract class Product {
  abstract public function use(): void;
}

Factory.php

abstract class Factory {
  final public function create(string $owner): Product {
    $p = $this->createProduct($owner);
    $this->registerProduct($p);
    return $p;
  }
  abstract protected function createProduct(string $owner): Product;
  abstract protected function registerProduct(Product $product): void;
}

IDCard.php

class IDCard extends Product {
  private $owner;
  function __construct(string $owner) {
    echo $owner."のカードをつくります。\n";
    $this->owner = $owner;
  }
  public function use(): void {
    echo $this->owner."のカードを使います。\n";
  }
  public function getOwner(): string {
    return $this->owner;
  }
}

IDCardFactory.php

class IDCardFactory extends Factory {
  private $owners = [];
  protected function createProduct(string $owner): Product {
    return new IDCard($owner);
  }
  protected function registerProduct(Product $product): void {
    $owners[] = $product->getOwner();
  }
  public function getOwners(): array {
    return $owners;
  }
}

Main.php

require "../autoload.php";
$factory = new IDCardFactory();
$card1 = $factory->create("佐藤");
$card2 = $factory->create("鈴木");
$card1->use();
$card2->use();

実行結果

佐藤のカードをつくります。
鈴木のカードをつくります。
佐藤のカードを使います。
鈴木のカードを使います。

autoload.php

function autoload($className){
  require './'.$className.'.php';
}
spl_autoload_register('autoload');

バッチファイル(.bat)のコメントアウト

バッチファイル(.bat)のコメントアウト

ふつうは

rem コメント

コメントアウトだけど、

: コメント

でもいい。

こっちの方が楽。

参考:https://orangeclover.hatenablog.com/entry/20101029/1288364190

PHP エルビス演算子(?:)とNull合体演算子(??)

呼び方を忘れるので。

エルビス演算子三項演算子(?:)

$a = $b ?: 0;
$bがTRUEだったら$b、違ったら0。
「$b ? $b : 0」と同等。

Null合体演算子(??)

$a = $b[0] ?? 0;
$b[0]がNULLじゃなかったら$b[0]、NULLだったら0。

「isset($b[0]) ? $b[0] : 0」と同等。

https://www.php.net/manual/ja/language.operators.comparison.php