Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

PHPですべてをFにしたかった

すべてをFにしたかった結果

<?php

require "F";

F('FFffFfF FFfffFF FFfFfff FFfFFFF Ffffff FfffFf FfFfFff FFfFfff FFffFfF Ffffff FfFffff FFffFfF FFFffFf FFffFFf FFffFfF FFfffFF FFFfFff Ffffff FffFffF FFfFFFf FFFffFF FFfFffF FFffFff FFffFfF FFFffFf FfFFFf FfFFFff FFfFFFf FfffFf FFFfFF FfFf');
The Perfect Insider.

最初の <?php と require を消す方法は何かないだろうか…。
あと小文字のfを使うのも妥協した。

やったこと

F = 1, f = 0 に見立てて、2進数 -> 10進数 -> 文字化して、最後にeval()しただけ。

F
<?php

function F($str) {
    $str = str_replace('f', '0', $str);
    $str = str_replace('F', '1', $str);

    $ret = "";
    foreach (explode(' ', $str) as $s) {
        $ret .= chr(bindec($s));
    }

    eval($ret);
}

F()に渡す文字列を作るのは、その逆をすればよい。

<?php

$filepath = $argv[1];

$ret = [];

foreach (file($filepath) as $line) {
    foreach (str_split($line) as $c) {
        $ret[] = decbin(ord($c));
    }
}
$ret = implode(' ', $ret);

$ret = str_replace('0', 'f', $ret);
$ret = str_replace('1', 'F', $ret);

echo $ret;

PHPで関数を返す関数を呼んで関数を呼びたかった(即時実行)

関数を返す関数を変数に入れて、直接呼びたい。

<?php

$f = function ($x) {
    return function ($y) use ($x) {
        return $x + $y;
    };
};

echo $f(123)(234); //=> 357

PHP7

問題なし。

PHP5.6

syntax error, unexpected '('

怒られた。

他の動かない例

括弧したり変数に入れたり。

<?php

echo ($f(123))(234); // syntax error, unexpected '('

echo ($f2 = $f(123))(234); // syntax error, unexpected '('
動いた例

変数に一旦入れた後、改めて呼べばいいんだけど、なんだか悔しい。

<?php

$f2 = $f(123);
echo $f2(234);

先輩PHPerからの教えによれば__invoke()を使えばいいとのこと。

<?php

echo $f(123)->__invoke(234);

なるほど。(よくわからないけど動いた感)

見た目があれだけど、call_user_func()でも動くらしい。

<?php

echo call_user_func($f(123), 234);

Scalaでスクレイピング

Scalaスクレイピングしてみた。

ライブラリ

やってみた

はてなホッテントリのタイトルとリンクを抽出。

build.sbt
name := "scalascraping1"

version := "0.0.1"

libraryDependencies += "org.jsoup" % "jsoup" % "1.7.3"
main.scala
import org.jsoup._
import collection.JavaConverters._

object Main {
  def main(args: Array[String]): Unit = {
    val doc = Jsoup.connect("http://b.hatena.ne.jp/hotentry").get
    // asScalaで、JavaのArrayをScalaのcollectionに変換しないと、forで回せない
    for (t <- doc.select("a.entry-link").asScala) {
      println(t.text())
      println(t.attr("href"))
    }
  }
}
実行
$ sbt run
ネット民戦慄! 表現の自由を脅かす”ゾーニング破り”とは? - トゥギャッチ
http://togech.jp/2015/12/14/30710
ビジネス問題解決フレームワーク20選|今日から使えて最速で成長できる
http://career-theory.net/business-flamework-3002
App Storeの弊社デベロッパーアカウント停止に至った 経緯につきまして|株式会...
http://nagisa-inc.jp/news_release/20151214/1631
科学的調理法で作ったお手軽一人鍋がやばかった
http://anond.hatelabo.jp/20151214095821
職員が個人情報68万人分流出させる 大阪・堺市 NHKニュース
http://www3.nhk.or.jp/news/html/20151214/k10010340801000.html
所得低いほど高い喫煙率、歯少なく肥満者多い : 社会 : 読売新聞(YOMIURI ONL...
http://www.yomiuri.co.jp/national/20151214-OYT1T50013.html
...