temp_la :: Memo

https://twitter.com/temp_la

Scheme R7RS のパラメータオブジェクトはReaderモナドか?

SchemeのR7RSを読んでます。

R7RSからパラメータオブジェクトなるものが登場しています。(SRFI-39 からあるようです)

(define radix
  (make-parameter
   10
   (lambda (x)
     (if (and (exact-integer? x) (<= 2 x 16))
         x
         (error "invalid radix")))))

(define (f n) (number->string n (radix)))

(print (f 12)) ; ⇒ "12"                                                                           
(print (parameterize ((radix 2)) (f 12))) ; ⇒ "1100"                                                            
(print (f 12)) ; ⇒ "12"                                                                         
(print (parameterize ((radix 0)) (f 12))) ; ⇒ ERROR: invalid radix

要するに文脈によって(radix)の結果が異なる動作になります。

何となくReaderモナドとlocalという関数が似たような感じに見えました。

こんなふうに見える

module Main where

import           Control.Monad.Reader
import           Data.Char            (intToDigit)
import           Numeric              (showIntAtBase)

-- number->string                                                                                                                                                                                           
numberToString :: Int -> Int -> String
numberToString x rdx = showIntAtBase rdx intToDigit x ""

type Parameter = Either String Int

radix :: Parameter
radix = Right 10

radix' :: Int -> Parameter
radix' x
  | 2 <= x && x <= 16 = Right x
  | otherwise = Left "invalid radix"

--(define (f n) (number->string n (radix)))                                                                                                                                                                 
f :: Int -> Reader Parameter (Either String String)
f n = do
  rdx <- ask
  return $ numberToString n <$> rdx

main :: IO ()
main = do
  print $ runReader (f 12) radix -- Right "12"                                                                                                                                                              
  print $ runReader (local (const $ radix' 2) (f 12)) radix -- Right "1100"                                                                                                                                 
  print $ runReader (f 12) radix -- Right "12"                                                                                                                                                              
  print $ runReader (local (const $ radix' 0) (f 12)) radix -- Left "invalid radix"

完全に理解できてないのでここまでです。

全てを管理する

昨年末くらいに、最も先伸ばされた目標の一つを達成した。

 

さて、それからは何をすればいいのかも漠然として時間だけが過ぎていってしまった。

 

興味のあることは漠然とそして色々あるけれど、

どれを優先すべきかとかどうしたいとか。

先延ばしにしていることは何かとか。 

 

個人的に予定を立てること、管理することに苦手意識があったけれど

全てを管理下におき制御可能変数として扱うことにした。

 

まず、今やってること・やりたいこと等をすべて可視化した。

そして一日のどれくらいの時間、それに費やしているかを書き出す。

 

タイムボックスという考え方がある。

要は時間割りであるがこれに従って動くのは自分の主義に反するので厳密には守らない。

ただ予定は立てておく。

どれくらい時間が必要かを把握しておく。

 

使ったツールはGoogleスプレッドシート

よくあるガントチャートみたいなやつをつくった。

 

先伸ばされたメモはGoogle Keepに保存してある。

しっかり分類しておく。タスクはガントチャートの方にコピーする。

 

ガントチャートは毎日見る。

継続するポインヨはアクセスのしやすさと整理されているか。だと思う。

 

RSSやKeepの“あとで読む”も全く消化できていなかったけれど、

分類してガントチャートに組み込んだら消化する気になってキタ。

時間経過と情報量

物事の多くは

時間が解決してくれる。

 

考えるべき事

やるべき事があるけど

何やったらいいか全然分からないとか

時間が無いときは

何もしないことを選択する。

 

無駄に考えたり行動したりすると

他の事にかける時間を失う。

 

実は何もしなくても

時間経過によって情報量は増える。

そんなに重要じゃないことが分かったりする。

しなくても良くなったりする。

 

他の事に時間を使おう。

 

スターティング Go !!!

Goを始めた。

 

理由は今後GAEを使うなら、Javaではない何かで書きたかったから。

あとコマンドラインツールとかも気軽にかける言語を覚えたかったし、

手続き(型)的に書ける言語をもう一つ増やしておきたいという思いもあった。

 

新しい言語を覚える時って何か作るのがいいと思い、以前から作りたかったWhitespace言語のインタプリタを書いた。

en.wikipedia.org

難解プログラミング言語の実装は、新しい言語を覚えるのにまあまあ良い題材だと思う。if文やfor文はもちろん、スタック、リスト、マップ等の基本的な構造、ファイルの読み(書き?)を使う必要があり、簡単過ぎず、難し過ぎず、程よいボリューム感で、つくり終えるころには言語の文法や特徴くらいは頭に入るといったところ。

(もちろん個人的な差異はあるだろうが)

 

テストもちゃんと書いた。難解言語を書く必要があるので少し面倒くさいが苦にならない程度。既存のサンプルコードがあるので、それも使える。

 

苦労したのは、難解言語の仕様を数カ所勘違いしていた所か。

公式のチュートリアルページ(リンク切れ)を見て実装したが、例えばスタックの一番上の文字を出力のに文字はポップされることは書いていない(多分)。スタックマシンってそういうものなのかもしれない。

そのため公式のインタプリタHaskellのソース)を見たほうが仕様を理解しやすい。

ちなみにこれにはチュートリアルページの方に無いSlideコマンドがあるので注意されたい。

(examplesのloctest.wsはSlideが使われている!)

 

以下、ソース。

github.com

 

ツイッターbotのソースを公開しました

表題の件、githubに投稿しました。

github.com

botのアカウントはこれ。

https://twitter.com/zappa_gg

アクセストークンがソースに直書きだったので今まで公開できませんでした。

GAEは今年からJava1.7→Java1.8になったのでこちらも対応しました。

ツイッターのフォロー/リムーブのロジックも直しました。

(3000人フォロワーを超えて上手く動いてませんでした多分。)

以下は、ハマったところ。

ローカルで開発した時は上手くいってたがあ、GAEにデプロイして動かすと以下のエラーでツイッターにアクセスできなかった。

api.twitter.com
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=739d56c7 or
http://www.google.co.jp/search?q=70d45818
TwitterException{exceptionCode=[739d56c7-70d45818 a6d63e39-a9b6a6af], statusCode=-1, message=null,\
code=-1, retryAfter=-1, rateLimitStatus=null, version=4.0.7}

ステータスコード-1で、StacktraceにはSocket Errorとか、api.twitter.comが無いみたいな事が書かれていて、GAE側の問題だった模様。

appengine-web.xmlにurl-stream-handlerの設定を追加しました。

これは、Java.1.7→Java1.8になってデフォルト値がnativeになったことが原因とのこと。課金の設定をしていないと、UnknownHostExceptionとかのエラーが起きちゃうよということらしいのです。

https://cloud.google.com/appengine/docs/standard/java/issue-requests?hl=ja#java_8_runtime_vs_java_7_behavior

appengine-web.xml リファレンス  |  Java の App Engine スタンダード環境  |  Google Cloud

 うまく動いてくれるといいね。

 

フォントの縁が赤とか緑に見える

フォントのフチが緑とか赤に見えるあれ、サブピクセルレンダリングというもので、上手く設定すればフォントが綺麗に見えるようになる仕組みらしい。

綺麗に見えるらしいのだけど、赤とか緑に見えるのが昔からわたし気になりますなので、グレースケールで表示されるようにする。

MATEのフォント設定には、グレースケールにする設定がある。おそらく他のリッチなデスクトップ環境でもそういう設定はあるのだろうけど、xmonadを使ってるのでGtk+のテーマの設定はLXAppearanceを使っている。これは.gtkrc-2.0とかホームディレクトリに作ってくれてデスクトップ環境に依存しない形で設定できる。

.gtkrc-2.0の中身はこんな感じ。

gtk-theme-name="Menta"
gtk-icon-theme-name="menta"
gtk-font-name="Sans 9"
gtk-cursor-theme-name="mate"
gtk-cursor-theme-size=24
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-toolbar-icon-size=GTK_ICON_SIZE_SMALL_TOOLBAR
gtk-button-images=1
gtk-menu-images=1
gtk-enable-event-sounds=0
gtk-enable-input-feedback-sounds=0
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle="hintslight"
gtk-xft-rgba="none"

最後のgtk-xft-rgba="none"っていうのが、サブピクセルレンダリングを無効にする設定っぽいけど、gtkで動いていないからかxmobarには適用されなかった。

そのため、.config/fontconfig/fonts.conf に以下の設定を追加することで、サブピクセルレンダリングを無効にする。

<match target="font">
  <edit name="rgba" mode="assign">
    <const>none</const>
  </edit>
</match>

以下、参考サイト。毎回Arch Wikiには助けらるる。

フォント設定 - ArchWiki

iptables分からん

Debianiptablesファイアウォールの設定。

私的利用のクライアントPCなので設定しなくても問題ないかもしれないけど、気分的なあれで設定した。(以下、参考サイト)

ipv4。ログの設定はしていない。

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT

ipv6

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmpv6 -j ACCEPT
# DHCP
-A INPUT -p udp --sport 547 -j ACCEPT
-A INPUT -p udp --dport 547 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j REJECT --reject-with icmp6-adm-prohibited
-A OUTPUT -j ACCEPT
COMMIT

ipv6の設定ってあまり見かけないので、ipv4のを元に書いた。ipv6は仕様がよく分かっていないので、DHCPを使用している(ipv4は固定にしている)のだけど、その場合547ポートを許可する必要がある。ICMPv6もよく分からん。Echo Request (type 128)だけ許可すればいいような気がしたけど、DHCPとも関係しているのか上手く繋がらないので、ICMPv6は全部許可している。

ipv6に関連してfirefoxの設定。

www.google.comとか一部のサイトに繋がりにくいことがある。about:configから下記の設定を行った。

network.dns.disableIPv6; true