IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

lengthを使わないでリストを2分割する

リストを2分割する方法

対象となる配列をコピーして(a)と(b)として2つ用意する。 以下の(a),(b)を繰り返し処理する。 (a)1つ目は先頭の要素を取得してしてconsする。残りを次の繰り返しのインプットにする。 (b)2つ目は先頭と次の要素を取得して捨てる。残りを次の繰り返しのインプットにする。 終了条件は、(b)が要素なしになった場合 この時、(a)の残りを、分割する後半部分にする。(a)のconsを処理し、これを分割する前半部分とする。

(a),(b)でリストが小さくなっていくが、(a)は1つずつ、(b)は2つずつ減っていく。

   go [a, b,c,d,e,f]   [a,b,c,d,e,f]
=  go (a:[b,c,d,e,f]) (_:_:[c,d,e,f])
=  first (a:) (go [b, c,d,e,f]  [c,d, e,f] )
=  first (a:) (go (b:[c,d,e,f]) (_:_:[e,f]))
=  first (a:) (first (b:) (go [c, d,e,f]  [e,f  ] ))
=  first (a:) (first (b:) (go (c:[d,e,f]) (_:_:[])))
=  first (a:) (first (b:) (first (c:) (go [d,e,f] []     )))
=  first (a:) (first (b:) (first (c:) (   [],     [d,e,f])))
=  first (a:) (first (b:) ([c],[d,e,f]))
=  first (a:) ([b, c],[d,e,f])
=  ([a, b, c],[d,e,f])

Choiceを理解するために

http://hackage.haskell.org/package/profunctors-5.5/docs/src/Data.Profunctor.Choice.html#Choice

(->)はChoiceのインスタンスなので、

 > left' chr (Left 65)
Left 'A'
 > left' chr (Right 65)
Right 65
 > right' chr (Left 65) 
Left 65
 > right' chr (Right 65)
Right 'A'
 >

この場合、left'の場合は、Leftのときは関数適用して、Rightのときは何もしない。right'はその逆

Star (a.k.a UpStar) の理解のために

むかしはUpStar/DonwStarといっていたが、最新ではStar/CoStarとなっている。

http://hackage.haskell.org/package/profunctors-5.5.1/docs/src/Data.Profunctor.Types.html#Star

Lift a 'Functor' into a 'Profunctor' (forwards).

なんて書いてあります。Functorを持ち上げてProfunctorにしてくれるとのこと。

fmapしか使えなかったのが、dimapも使えるようになるという雑な理解をする。

例のための例になりますが、具体的なStarを作ってみる。

 > :t Star
Star :: (d -> f c) -> Star f d c
 > :t Just
Just :: a -> Maybe a
 > :t Star Just
Star Just :: Star Maybe c c
 > 

つかってみる。

 > runStar (Star Just) 65
Just 65
 > runStar (Star Just) 'a'
Just 'a'
 > runStar (Star Just) "#"
Just "#"

もともとFunctorだったから、fmapが使えるはず。

> :t fmap chr (Star Just) 
fmap chr (Star Just) :: Star Maybe Int Char
 > :t runStar $ fmap chr (Star Just) 
runStar $ fmap chr (Star Just) :: Int -> Maybe Char
 > runStar (fmap chr (Star Just)) 65 
Just 'A'

素(?)のfmapとたいひさせると、

 > fmap chr (Just 65)
Just 'A'
 > :t fmap chr . Just
fmap chr . Just :: Int -> Maybe Char

dimapが使えるか確認

 > :t dimap chr show (Star Just)            
dimap chr show (Star Just) :: Star Maybe Int String
 > runStar ( dimap chr show (Star Just) ) 65
Just "'A'"
 > 

Applicativeの使い方

Functor: コンテキスト中で1パラメータの関数を適用する。 (a -> b) -> f a -> f b  

Applicative: コンテキスト中で2パラメータの関数を適用する。(実際はFunctorと一緒に使う) (a -> b -> c) -> f a -> f b -> f c  

 > :t (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b -- (a -> b)は1パラメータの関数
 > :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
 > 

Functorのbをb -> cに置き換える。Applicativeのaをb、bをcに置き換える。<$>と<*>をならべてみると、f(b -> c)がキャンセルできることがわかる。

(<$>) :: (a -> (b -> c)) -> f a -> f (b -> c)  -- (a -> b -> c)は2パラメータの関数
(<*>) ::                           f (b -> c) -> f b -> f c

<$>と<*>を適用し、その結果の型を書く

         (a -> b -> c) <$> f a                       :: f (b -> c) 
                                  f (b -> c) <*> f b :: f c

f (b->c)をキャンセルする。

         (a -> b -> c) <$> f a               <*> f b :: f c

整理する。

         (a -> b -> c) <$> f a <*> f b :: f c

確認する。

 > :t \g x y -> g <$> x <*> y
\g x y -> g <$> x <*> y  :: Applicative f => (a1 -> a2 -> b) -> f a1 -> f a2 -> f b
 >

余談

Fanctorを1個、ApplicativeをN個とかんがえると、Lensが1個だけ、Traversalが0~N個となることが何となくイメージできる。

type Traversal' a b = forall f . Applicative f => (b -> f b) -> (a -> f a)

type Lens'      a b = forall f . Functor     f => (b -> f b) -> (a -> f a)

Windows環境にpcre-lightをインストールで嵌る

Windows環境のHaskell正規表現ライブラリを利用したかったので、prce-lightをインストールしようとしたら、嵌ってしまいました。

まさに、このRedditで書かれていることと同じエラーでした。

Configuring pcre-light-0.4.0.4...Cabal-simple_Z6RU0evB_2.4.0.1_ghc-8.6.5.exe: The pkg-config package 'libpcre'is required but it could not be found.

www.reddit.com

このRedditの記事によると、prceがインストールされているパスに環境変数を通せば解決したとのこと。しかし、私の環境ではうまくいきませんでした。

試行錯誤して、最終的たどり着いたのは、本家のGithubリポジトリのこのissueでした。

github.com

msys2のpacmanの情報を最新化して、pcrepkg-configを最新化することでした。

問題に出会った時の、情報の検索の仕方として、やみくもにキーワードで検索するのではなく、本家情報を確認する必要がありますね。

蛇足ですが、pacmanのアップデートで失敗しましたが、エラーログに書かれていたファイルを直接削除して、再度アップデートしたらうまくいきました。(この時のログは取り忘れ)

WordPressを触ってみた

WordPressの本家サイト。

wordpress.org

参考書籍

1章が簡単に歴史がまとまっていて参考になります。4章にPHPプログラミングがあって、入門書のようにも思えますが、5章はAWSでスケーラブルなWordPressと、6章にWordPressユーザのためのNgnix入門などのインフラ面の解説が充実しています。

WordPressプロフェッショナル養成読本 [Webサイト運用の現場で役立つ知識が満載! ] (Software Design plus)

WordPressプロフェッショナル養成読本 [Webサイト運用の現場で役立つ知識が満載! ] (Software Design plus)

WordPressやるなら定番の書籍なのでしょうか。追加していくコードとサイトの画像が対比されていて読みやすいように思えました。

本格ビジネスサイトを作りながら学ぶ WordPressの教科書

本格ビジネスサイトを作りながら学ぶ WordPressの教科書

こちらは上記のスマフォ版です。1ソースでPCとSP両方対応する内容かと思ったのですが、ざっと読んだところ、PCとSPでファイルを分ける(実際はフォルダごとわかれている)ようでした。

WordPressを触ってみた感想です。

コミュニティを育てる姿勢が素晴らしい

管理画面のデフォルトに直近のイベントが表示されていて、コミュニティを盛り上げていく姿勢が感じられました。最近11/1, 11/2にWardCampというイベントが日本であったようです。

f:id:naotoogawa:20191103155107p:plain
イベントとニュース

カスタマイズが柔軟

テーマがたくさん公開されていて、それらのテーマを「外観」->「テーマエディタ」からさらにカスタマイズができます。functions.phpが直接管理画面で改竄変更できるので、基本的には何でもありなような気がします。

f:id:naotoogawa:20191103161840p:plain
テーマエディタでcss, jsが修正可能

PHPコード上にて、JavaScriptをインラインで仕込めば、応用が広がります。

function hoge_enqueue_scripts() {
    $script = <<<SCRIPT
jQuery(function($) {
  $(document).ready(function() {
    // ここにJavaScriptコードを書く
  });
});
SCRIPT;
    wp_add_inline_script( 'jquery-core', $script, 'after' );
}

add_action( 'wp_enqueue_scripts', 'hoge_enqueue_scripts' );
メンテナンスが大変そう

管理画面上から様々な設定ができるのがWordPressの一番のメリットですが、開発スピードはなかなか上がらないかなと感じました。

また、本番リリース後のメンテナンスが大変なような気がしました。開発(or 検証)環境で確認して、本番環境に反映させる標準的な方法があるかと検索してみると、問題はあるようです。(とういうかWordPressの問題というよりは、CMS自体の宿命のような気もしますが、どうなんでしょう。)誰かが作成したWordPressサイトを後からメンテするのは相当大変なんじゃないかなと思いました。

WordPressのデプロイが辛すぎる問題を考える | 東京上野のWeb制作会社LIG

Developing and Deploying WordPress  •  Beanstalk Guides