2017年3月31日金曜日

関数型プログラミングの基礎 代数的データ構造のmatch関数

scalaにある便利なパタンマッチをjavascriptで実現する方法が書いてあった。

 var empty = () => {
  return (pattern) => {
    return pattern.empty();
  };
};

 var match = (data,pattern) => {
 return data(pattern);
};

 match(empty(),{
  empty: (_)=> {
  return true;
  },
  cons: (head,tail) => {
  ....
  }
});   //ここでは、empty()にマッチして trueが返される。

2017年3月29日水曜日

関数プログラミングの基礎 P67

無限ストリームの例が出ていた。twoStepは任意の関数として、さまざまな無限数列がつくれるということのようです。
var iterate = (init) => {
 return (step) => {
   return [init, (_) => {
     return iterate(step(init))(step);
     }];
    };
   };

   var twoStep = (n) => {
    return n+2;
    };

  var evenStream = iterate(2)(twoStep);
 ただ、ふと、この数列の値はどうやってとりだすのか考えてしまった。
evenStream[1]() 
evenStream[1]()[1]()
evenStream[1]()[1]()[1]()
という具合に、入れ子になった状態のストリームの中身を確かめるしかないのだろうか?
と思っていたら P69にelemAtという要素を求めるために関数が出てきており疑問は解決しました。

2017年3月28日火曜日

関数型プログラミングの基礎

javascriptでも関数型プログラミングができるということで、上記の書籍を読んでみた。
さっそく、リスト2.4で 少し混乱する。
 var get = (key, obj) => {
   return obj(key);  
   };
var set = (key, value, obj) => {
  return (key2) => {
      if(key === key2) {
          return value;
      } else {
        return get(key2,obj);
       }
    };
 };

var ob;
ob=set('a',1,ob);  1
ob=set('b',2,ob); 2
などと試し見た。
get('a',ob);
1
get('b',ob);
2

と、確かにできた。

1ではob('a')が1へ対応する関数
  (key2) =>  {
    if ('a'===key2) {
        return 1;
    } else {
        return ob(key2);
    }
  };
 }; ができて
2ではob('b')が2へ対応する関数
  (key2) =>  {
    if ('b'===key2) {
        return 2;
    } else {
        return ob(key2);
    }
  };
 };
ここのob(key2)は
 ob('a')が1へ対応するもの、つまり1の関数がきている
これを再帰的に繰り返しているということだろうか?


 

2017年3月25日土曜日

二次方程式を解く javascript

javascriptの勉強のためにつくってみた。

利用させていただいたサイト
https://www.mathjax.org/
http://d.hatena.ne.jp/kochann/?of=6
問題を乱数で出題するようにしています。
.netなどでつくるより、つくりやすいところとそうでないところがあり、一長一短があるような気がします。
javascriptは、型の定義の融通がきく半面、何の型なのか常に意識する必要はあるようです。画面上の細かい調整にいまいち慣れてないので、レイアウトでけっこう時間がかかってしまいます。あと、^2など2乗の計算を認識しない?ようです。*+-は大丈夫なようですが。
 さまざまなパータンの二次方程式に対応させるため、だいぶ長くなってしまいました。
2017.5.9 bug fix 有理数解のときのメッセージ表示に不具合あったものを修正しました。


github pagesで公開してみました
https://gh6141.github.io/gitdrill/nijihote.html

2017年3月14日火曜日

javascript でクラスを使ってみる

canvasという便利な図形表示の仕組みがいつのまにか
使えるようになっている。これをオブジェクト指向で(クラスで)使ってみた。
クラスを使わないと、ちょっと複雑になると、手に負えなくなりそうだ。

ドラッグ&ドロップをしてみたかったので、まずこちらを参考にさせていただいた。
http://qiita.com/kyrieleison/items/26fcfb3a1d94bc92c596

さっそく、イベントの追加でthisの使い方がわからず悩む
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener
に解決方法がかいていあった。

力の合成を表すものですが、矢印は
http://qiita.com/frogcat/items/2f94b095b4c2d8581ff6
の中のライブラリをつかわせていただきました。

それを参考に少しためしてみたのが、以下のソース



力の分解のほうは、継承を使ってみました。もう少し簡潔にできそうですが。

2017年3月12日日曜日

ubuntuでcifs マウント

起動時にマウントする方法

/etc/fstabに以下を追加
//192.168.1.?/share /mnt/windows/ cifs username=user,password=,uid=1000,gid=1000 0 0
パスワード不要なら省略できるようだ。
以前はシェルスクリプトをサービスとして起動する方法でやってきたが、それだと
sleep等を使って、遅延させる必要があった。
fstabに登録する方法があるとは知らなかった。

参考リンク
http://engetu21.hatenablog.com/entry/2016/07/31/190059

2017年3月10日金曜日

cloud9 herokuを連携して利用(postgresqlで)

http://qiita.com/yuki0627/items/abd9eedc989ae1da21a7
がとても参考になりました。

cloud9でrailsによるサイトを作成し、限られた時間であればサイト上で確認できますが、時間がたつと使えなくなります。そこで、herokuへgitにより、サイトの内容をpushするといいようです。データベースはherokuではpostgresqlが標準的なので、cloud9で使用するデータベースもpostgresqlに切り替えてみました。

以下のその手順を覚え書きとしてまとめてみました。
○ cloud9でrailsをpostgresqlを使って動かしてみるには**************

1 cloud9でblankを選択しcreate workspace
2  Rails のインストール
gem install rails --no-ri --no-rdoc
rails new myapp --database=postgresql
cd myapp
bundle install
rails generate controller welcome
app/views/welcome/index.html.erbを編集して
<h2>Hello World</h2>でも入力しておく

config/routes.rbは
root 'welcome#index' の行を追加
以下、Unicode使用のテンプレートを用意するために、次の操作が必要なようです。
sudo service postgresql start
sudo sudo -u postgres psql
 CREATE USER username SUPERUSER PASSWORD 'password';
 UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
 DROP DATABASE template1;
 CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';
 UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
 \c template1
 VACUUM FREEZE;
 \q
データベースのユーザー名とパスワード名を環境変数に入れておくといいようです。
export USERNAME=username
export PASSWORD=password

これにあわせてdababase.ymlを次のような内容に編集
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host:     <%= ENV['IP'] %>

ここで
rails db:create
そして modelを作成してみる
rails generate model title

db\migrate\20120322080659_create_titles.rb」のようなマイグレーションスクリプトと呼ばれるファイルができるので、これに以下のように追加
class CreateTitles < ActiveRecord::Migration
  def change
    create_table :titles do |t|
      t.string :name ←ここと
      t.date :date ←ここを追加
      t.timestamps
    end
  end
end

rake db:migrate
を実行

seeds.rbができるので、これを以下のように修正
# coding: utf-8
Title.create(:name => 'サンプル1', :date => '2011-06-28')
Title.create(:name => 'サンプル2', :date => '2011-11-14')
以下のコマンドで、上記のデータの初期値設定ができるようだ
rake db:seed

rails dbconsoleで確認できる
select * from titles;等が実行可能
ぬけるときはCtrl+D

welcome_control.rb
  def index
    @titles = Title.all
  end

index.html.erbをつぎのように変えてみる
<p>
<% @titles.each do |title| %>
[タイトル] <%= title.name %>, [月日] <%= title.date %><br />
<% end %>
</p>

rails s -p $PORT -b $IP
で起動してみる
https://[ワークスペース名]-[ユーザー名].c9.io  にアクセスして確認。

○herokuにpushしてみる***********************
※事前にcd myappになっているか、確認してから
heroku login

git init
git add .
git commit -m "init"

heroku create
heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
git push heroku master

○herokuのpostgresqlの設定************
herokuへのpushだけでは、だめで、postgresqlのマイグレーション等の操作が必要
heroku addons:add heroku-postgresql
heroku run rake db:migrate
herokuでも、seedは必要なので
heroku run rake db:seed

○ためしに、scafoldも使ってみた*******
たとえば userというモデル名であれば
rails g scaffold user name:string point:string sudo service postgresql start(postgresqlが起動してないときは、sudo service postgresql startと起動が必要であることに注意)
rake db:migrate
rails s -p $PORT -b $IP
として
https://アプリ名-ユーザー名.c9users.io/usersにアクセスして確認できる

git add.
git commit -m "scafold_test"
git push heroku master
で、herokuでも動いているか試してみる

※データベースを使うので、データベースがきちんと動いてないとうまくいかない。最初エラーが出たとき、原因がつかめずいたが、結局、データベースが動いてないことが原因ということが何回かあった。このへんは、慣れの問題かもしれない。