カテゴリー
Haskell コンピューター (Computer) プログラミング (Programming)

Haskellに惑わされ – 14

久しぶりの Haskell挑戦です さっぱり前に進みません 今回ようやく動作した snippetはこんな感じです

divs :: Fractional a => a -> a -> a
divs n m = n / m

これてようやく Haskell GHCiにおいて

Prelude> :l test.hs
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, one module loaded.

として compileされます。そして、この GHCiの中で

*Main>divs 99 4

と打つことにより

24.75

と出力されます。要するに divsという新しい割り算関数を作成したことになるのです。何というか厳しくてなかなかここに至りません。難しい 難しい

何が難しくてなかなか理解できないのか? と云えば、たとえばこの test.hsという名前のファイルに書かれている通りを GHCiに打ち込むと

Prelude>divs :: Fractional a => a -> a -> a

、何と以下のようなメッセージで弾かれるのです・・・

:1:1: error:
    • Variable not in scope: divs :: a1 -> a1 -> a1
    • Perhaps you meant ‘div’ (imported from Prelude)

この GHCiで :load test.hsした時との落差に目がくらむのです。何故? 何故? なぜなんだー 全くわからないのです。どなたか教えて下さい。僕にとって Haskellを学ぶ上で一番の障害がこの GHCiでのコンバイラと、インタープリーターとの間の落差なのです。

カテゴリー
PHP SQL ただの現状記述 (Daily Activities) インターネット一般 (Internet General) プログラミング (Programming)

昨日よりぶったまげました

いやあ 昨日この現象に気づきました 原因精査にもう一杯一杯となってしまったのです 色々な懸案事項をそっちのけで原因究明に身も心も取られてしまいました

しかし、突然閃きが起こり全て解決しました。それは西暦年号が当然ながら現在は 2020年であり、2019年ではないからだったのです。

現在、鎌倉ライブデモンストレーションの Home Pageにアクセスして例えばコメディカル・セッションを覗いて下さい

そうするとこんなふうにもぬけの殻状態のページが見えるでしょう

もぬけの殻のページ
もぬけの殻のページ

我ながら最初にこの画面見た時、「あーっ、とてつもなく良くないことが起こっている、ページを乗っ取られたのかな」と頭の中が真っ白でした。冷静になり、local serverで動かしても同様なのです。これはおかしい、サーバーを乗っ取られたのであれば、ローカルでも同じ現象が出るのはおかしい、そのように考えました。

そして今朝、シンガポールでコーヒーを飲みながらテストしていて気が付きました。それは kamakuralive.net全体の設定ページに仕込んである次の一文です

$this_year = date('Y');

これにより例えば 次のSQL文が発行され、データベースからデータを読み込むのです

$stmt = $pdo->prepare( "SELECT * FROM `session_tbls2019` WHERE `class` = 'com' AND `year` = '" . $this_year . "' ORDER BY `sessionNo` ASC;" );

要するに、プログラムを時間経過から独立させるために、わざわざ $this_yearという変数を設定し、それを用いているのです。

当然のことながら、現在の date(‘Y’); という文は、’2020’を返します。従って、それに従う SQL文ではデータが無く、空白となるのでした。つまり年号が 2019年から 2020年に変わった途端に見かけ上データが表示されなくなるのでした。でもこれっていいことですね。昔のページが自動的に消失するに等しいのですから・・・

カテゴリー
PHP ただの現状記述 (Daily Activities) インターネット一般 (Internet General) コンピューター (Computer) プログラミング (Programming)

知らなかった

さて、MySQL databaseより UTF-8で文字コード化されているデータを取得し、それを .csv形式で出力するこにより、Excelで読み込みたいと思っているのです。

しかし、先日 uploadしたようにこれはなかなかの難物なのです。普通にやれば必ず激しい文字化けで使い物になりません。ようやく、local database/serverで走らせて文字化けしないようになりましたが、これを Internet Serverに uploadして走らせると、HTTP ERROR: 500という訳の分からないエラーが出て走らないのです。

そこで検索して、かろうじてこのページにヒットしました。これによれば、サーバー処理で時間がかかったりメモリーを消費したりしてエラーが出るようです。ここに書いているように

set_time_limit(600); 
ini_set('memory_limit', '2048M');

この二行を書き加えることにより見事に解決しました。

カテゴリー
PHP ただの現状記述 (Daily Activities) プログラミング (Programming)

これで光がさした

PHPと Excelの関係はなかなか厄介なものがあります それと言うのも、Excelでは昔の 16-bits DOSの名残でずっと日本語文字コードとしてはいわゆる Shift-JISを用いているのです。これは別名 CP932とも呼ばれているものです。

ビジネスの世界では、Excelがデファクト・スタンダードであり、膨大なビジネス文書でこの Shift-JISが用いられているため、今更それを世界標準の UTF-8という文字コードに変更することができないのです

要するに悪しき昔の名残を引きずっているのですね

このことが実際のブログラミングでは問題となります もっとも英語圏の人々には「何言っているの?」てなもんで関係無いのですが、我々のように日本語を用いていると即刻問題となるのです。

何故ならばデータベースからデータを取得し、それを加工してから表計算ファイルに出力しても、その出力は UTF-8でされるので、Shift-JISで開く Excelでは途端に文字化けするのです。これを防ぐためには勿論、Excelが UTF-8を正しく読み取れれは良いのですが、それがそうは行かないのです。あるいは UTF-8から Shift-JISに変換してファイルに書き込めばいいはずですが、それまで自分で試したブログラムではなかなかうまく行かないのです。

しかし、今回ようやくめぐり逢いました それはこんなテスト・プログラムで検証しました

// https://qiita.com/ikemonn/items/f2bc4f9f834c989084ff
$rows[ 0 ][ 0 ] = "00";
$rows[ 0 ][ 1 ] = "齋藤 滋";
$rows[ 0 ][ 2 ] = "齋藤 滋です";
$rows[ 1 ][ 0 ] = "10";
$rows[ 1 ][ 1 ] = "SAITO SHIGERU";
$rows[ 1 ][ 2 ] = "さいとう";

$header = "Content-Type: text/plain";
$fp = fopen( 'isample.csv', 'w' );
stream_filter_prepend( $fp, 'convert.iconv.utf-8/cp932' );
fputcsv( $fp, $header );
foreach ( $rows as $row ) {
  fputcsv( $fp, $row );
}
fclose( $fp );

これでバッチリです。

もちろんこのコードのままですと、Excel内部でも csv形式となっているので、これを Excel標準形式で saveすればよいのです。

カテゴリー
Ajax Javascript インターネット一般 (Internet General) プログラミング (Programming)

並列処理と並行処理

何となくもやっとしていたのが今朝このブログを読んで少し理解しました いやあ難しいですね非同期処理は

カテゴリー
Ajax Javascript ただの現状記述 (Daily Activities) プログラミング (Programming) 未分類 (Unclassified)

Ajaxに悩んだ二年間

現代のWeb PageはAjax通信を用いてページの書き換え無しに表示データを更新する仕組みが広く使われています。Ajax = Asynchronous JavaScript and XMLという訳の分からない言葉の頭文字をつなげた造語です。Ajaxが提唱されたのは、古く Internet Explorer5.0の時代に遡ります。ここいら辺に関しては、やはり Microsoft社とIBM社の功績が大きいようです。このIBMのエンジニアが投稿されたブログに詳しく書かれています。

僕もjQueryを用いてこのAjaxという仕組みを用い、データをデータベースから読み出しそれを用いてホームページのDOMを書き換え、動的にページを画面更新無く刷新するようなページをいくつも作成してきました。実はこれもIBMのエンジニアのブログを読んで出来るようになったのです。

さて、jQuery + PHP + MySQLを用いたAjaxはこれまでに色々なサイトで作成してきました。そのほとんどは期待した通りに動作してきたのですが、一つだけ躓く場面があったのです。現在の鎌倉ライブHpは2017年に原型を作り、それを踏襲してきたのですが、基本的概念は、Web上のMySQL databaseにデータを入力して、ユーザー・ページではその databaseからデータを読み出してHpに反映する、そのようにしたのです。

もちろん DBにデータ入力する時にはPWで保護された部分にアクセスし、一般ではアクセスできないようにしています。この時問題となったのは、下記のプログラム部分です。それが不思議なことにうまく行ったり、行かなかったりするのです。

 function ajax_search() {
$( "#search_results" ).show();
var search_val = $( "#search_term" ).val();

$.post( "tri_chair_mod_add01new_backend.php", {
    search_term: search_val
}, function ( data ) {
    if ( data.length > 0 ) {
        $( "#search_results" ).html( data );
    }
} );

  }

これが時にうまく動作して時に動作しないのです。この原因についてどうしても難しすぎて分からなかったのですが、色々考えている内に、Ajaxとは Asynchronous (=非同期)とうのが本質だと思ったのです。Web pageは非同期で表示していかないとユーザーが待たされることになります。ですから、ある画面を描く時にも、あるいはデータを受け取る時にもどちらかがどちらかの完了を待つ(=同期)することが無く、どんどん進んで行くのです。これが原因ではないかと思いました。そこで以下のように変更したのです。

  function ajax_search() {
$( "#search_results" ).show();
var search_val = $( "#search_term" ).val();
        $.ajax({
            type: 'POST',
            url: "tri_chair_mod_add01new_backend.php",
            dataType: 'html',
            data: {
                search_term: search_val
            },
            async: false,
            success: function(data) {
                if ( data.length > 0 ) {
       $( "#search_results" ).html( data );
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert("Ajax error happened!");
            }
        });
  }

つまり、Ajaxのdefaultである async: trueというのを敢えて async: falseにしたのです。つまり同期をとるようにしたのです。これで長年の懸案が解決しました。とっても難しい概念です。

カテゴリー
Javascript jQuery PHP インターネット一般 (Internet General) コンピューター (Computer) プログラミング (Programming)

jQuery libraryの読み込み判定

jQueryや bootstrapは CDNよりそのソースコードを読み込むのが常道です。これには理由があり、まず CDNはライブラリ読み込みに最適化されているので、自分のサーバーから読み込むよりも早い、そしてCDNより読み込めば プログラムの置かれている階層によらず読み込み先を変更する必要が無い、というものです。

ただ、localhostでインターネット接続せずにプログラムを書いていると CDNから読み込めずにプログラムが作動しなくなることもあります。localhostで開発している時にはこれでは困ります。そんな時に、インターネット接続しているか否かで自動判定すれば助かります。そのコードとしては、

 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>if (jQuery) document.write('<script src="lib/jquery.js"><\/script>');</script>

としたり、あるいは jQueryが既に読み込まれているか否かの判定として以下のようにするか

<script>window.jQuery||document.write('<script src="lib/jquery.js"><\/script>');</script><

とするか、あるいは phpを走らせて

<?php
  if ($_SERVER['SERVER_NAME'] === 'locallhost'
?>

として localhostかどうかを判定する、という方法がありますね

カテゴリー
bash Mac ただの現状記述 (Daily Activities) コンピューター (Computer) プログラミング (Programming)

.bash_profileが反映されない!!

先日来 terminalの挙動がおかしくなっていました それは根本的には .bash_profileが反映されない、というものでした
したがって、たとえば composerにより laravel/installerをインストールしても、それが反映されないのです。正確に言えば、もっと訳の分からない挙動を示していいたのです
つまり、

$composer global require "laravel/installer"

として MacOSに Laravel installerをインストールします。そうすると bashの設定ファイル ~/.bash_profileの最後にきちんと以下の一文が書き込まれます

export PATH="/Users/******/.composer/vendor/bin:$PATH"

これにより terminalを再起動すれば、その部分も読み込まれ

$echo $PATH

とすれば、きちんと環境変数 PATHに追加されている筈です!

ところが、これが反映されないのです 何でだ??? もちろん

source ~/.bash_profile

として明示的に.bash_profileを読み込ませれば反映されますが、そうせねば反映されないのです。これは bashが壊れたか? とまじに思いました。

しかし、発見しました ネットでは見つけられなかったので誰か困っている方もおられると思いますのでここに記録しておきます。

ターミナルのメニュー
ターミナルのメニューから環境設定を選択する
環境設定メニュータブからシェルを選択
環境設定メニュータブからシェルを選択
シェルタブ選択すねると、「シェル無いで実行」というチェックボックスがある
シェルタブ選択すねると、「シェル無いで実行」というチェックボックスがある

このチェックボックスをチェックするとシェル内で新たなまっ更なシェルが立ち上がる感じで、~/.bash_profileが読み込まれません!!!

なんとなんとこんなオプションがあったなんて!!!

 

カテゴリー
Haskell コンピューター (Computer) プログラミング (Programming)

ようやく前に進めました

入門Haskellプログラミングを読みながら Haskellの勉強を未だに続けています 何回も何回も挫折の連続ですが、ようやくサンプル・プログラムが作動しました

 

— $stack ghci addressLetter.hs で読み込む
— そして以下のようにこの関数を呼び出すと出力が適切に変化する
— *Main> addressLetter (“Bob”, “Jones”) “sf”
— “Bob Jones – PO Box 1234 – San Francisco, CA, 94111”
— *Main> addressLetter (“Bob”, “Jones”) “ny”
— “Bob Jones : PO Box 789 – New York, NY, 10013”

  

addressLetter name location = locationFunction name
  where locationFunction = getLocationFunction location

  

sfOffice name = if lastName < “L”
                then nameText
                  ++ ” – PO Box 1234 – San Francisco, CA, 94111″
                else nameText
                  ++ ” – PO Box 1010 – San Francisco, CA, 94109″
  where lastName = snd name
        nameText = (fst name) ++ ” ” ++ lastName

  

nyOffice name = nameText ++ ” : PO Box 789 – New York, NY, 10013″
  where nameText = (fst name) ++ ” ” ++ (snd name)
renoOffice name = nameText ++ ” – PO Box 456 – Reno, NV 89523″
  where nameText = snd name

  

getLocationFunction location = case location of
                               “ny” -> nyOffice
                               “sf” -> sfOffice
                               “reno” -> renoOffice
                               _ -> (\name -> (fst name) ++ ” ” ++ (snd name))
  

このようなプログラムです 本からコピーしましたが、HaskellではPythonのようにインデントにも論理的に重要な意味があり、それを間違えると作動しませんし、compileもできません 何回はねられましたが最後に動作しました 出力例もコメントに記載しています
カテゴリー
Haskell コンピューター (Computer) プログラミング (Programming)

だいぶん頭脳が Haskell脳になってきました

最近感じるのですが、これまでの半年間以上に渡る苦闘の末に、いやまだまだ末ではないのですが、自分の思考がなんだか変わりつつあるのを自覚するようになってきました。要するに Haskell脳になってきているのです。もっともその道のプロの方から見れば「赤ちゃん」のように幼稚な脳でしょうが、それでも変わりつつあります。

そのように自覚するのは、別に Haskellの勉強をしたり、プログラムを書いたりしている時ではないのです。日常生活で、フト今までとは違った思考をしているのに気づくのです。ようやくここまで来ました

-- Haskellで書いた
--リストより先頭文字が一致した項目
--を削除するプログラム
-- remove0.hs

remove' hanbetsu [] = []
remove' hanbetsu (x:xs) = if hanbetsu x
                          then remove' hanbetsu xs
                          else x:remove' hanbetsu xs

test_array = ["apple", "banana", "avogado"]

このソースコードは remove0.hsとしてセーブされています。
これでターミナルから以下のように打ち込みます

$stack ghci

これによりHaskell Interpreterが立ち上がりますので以下のようにプログラムのソースコードである remove0.hs

Prelude>:l remove0.hs

とすることによりコンパイルされますそして

Main>remove' (\(x:xs) -> x == 'b') test_array

とすることにより”banana”のみ無くしたリストが得られます。