2021年7月31日土曜日

 Three.jsをいじってみたかったので、なんとなくメモ

 

[three.js超入門]
https://qiita.com/watabo_shi/items/f7c559c3cdbcdd0f2629

[Three.jsの基礎 ]
https://threejsfundamentals.org/threejs/lessons/ja/

[超楽しくてカッコいい、Reactで始めるThree.js入門]
https://qiita.com/hppRC/items/b3e292e210d02005120f

2021年7月5日月曜日

PythonでのShapefile(.shp)操作

PythonでShapefileを操作する方法をまとめている方がいたので、なんとなくメモ。

感謝!!

 [PythonでのShapefile(.shp)操作まとめ]

https://qiita.com/c60evaporator/items/78b4148bac6afa4844f9

2021年6月6日日曜日

ローカル環境でnpm start をHTTPではなくHTTPSで起動する

 reactなどの開発をしているときに、npm startで、ローカルサーバを立ち上げるけど、そのままだと、http://xxx.xxx.xxx.xxx:3000/になりHTTPでのアクセスとなる。

 

React-QR-Readerを使おうとしたときに、Android(iPhoneもそうらしい)の場合、httpでのアクセスではブラウザからカメラを使うことができず、httpsでのアクセスが必要となるので動かない。

立ち上げ方が以下のページにあったので、とりあずメモ。

(参考)
https://create-react-app.dev/docs/using-https-in-development/


(Wndowsコマンドプロンプトの場合)

      set HTTPS=true&&npm start

(PowerShellの場合)VisualStudioCodeのコンソールはこちら

      ($env:HTTPS = "true") -and (npm start)

(Linux Bashの場合)

       HTTPS=true npm start

2021年5月30日日曜日

ReactとLeafletで地図の操作

 Reactとleafletを使って地図の操作をしたかったので、なんとなくメモ。

 Reactでleafletを使うときには、react-leafletを使うと便利。

 [ドキュメント]

(Leaflet) 本家 直接操作するに仕様確認する
https://leafletjs.com/

(React Leaflet)
https://react-leaflet.js.org/

(React-leafletの使い方メモ) React Leafletのサンプルを解説してくれている感じ。
https://qiita.com/studio_haneya/items/fbb52fa03ab4f212ced0

[インストール]

(React本体、React-dom、Leaflet本体)
npm install react react-dom leaflet

(React-Leaflet)
 npm install react-leaflet

(React-Leaflet Google Layer) GoogleMapを表示するなら
 npm install --save react-leaflet-google-layer


[使い方]

  1. とにもかくにもインポート
    (主なコンポーネント)
        import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet'
    (GoogleMapを表示するなら追加)
        import ReactLeafletGoogleLayer from 'react-leaflet-google-layer';
    (Leaflet本体の機能を使うなら)
        import L from 'leaflet'

  2. OpenStreetMapを表示する
    return (
      <MapContainer center={[51.505, -0.09]} zoom={13} scrollWheelZoom={true}>
        <TileLayer attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
     </MapContainer>
    );

  3. Google Mapを表示する
    return (
        <MapContainer center={[51.505, -0.09]} zoom={13} scrollWheelZoom={true}>
            <ReactLeafletGoogleLayer apiKey='AIzaSyBF904Y-d2_yF4tXwHuji18VHSUDTwGUFI' type={'hybrid'}  />
        </MapContainer>
    );
  4. マーカーを表示する
    MapContainerの子要素としてMaker要素を記載すると、地図表示時にマーカーを表示してくれる。Makerの子要素として、Popup要素を記載すると、地図上のマーカーをクリックした際に、表示するポップアップを設定できる。

    <MapContainer center={[51.505, -0.09]} zoom={13} scrollWheelZoom={true}>
        <TileLayer attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
            <Marker position={[51.505, -0.09]}>
                <Popup>ポップアップメッセージ </Popup>
            </Marker>
        </MapContainer>
    );

  5. leaflet本体を直接操作する
    初期表示だけであれば、react-leafletのコンポーネントを駆使していろいろとカスタマイズできるが、外部コンポーネントからのアクションで、地図内の要素を制御するのは出来なさそう。
    leaflet本体にアクセスして、本体のメソッドなどを使うしかない。

    MapContainerのwhenCreated属性に本体を取り出すための関数を設定することで、leaflet本体を取得できる。

    以下の例では、状態管理要素を取得するuseStateを利用して、leaflet本体入手している。
    地図とは違うボタン要素のクリックで実行する関数内で、leaflet本体を操作している。

    (サンプル)
    function Sample() {
        //leaflet本体を格納するだけなら何でもよいが、状態管理のフック(useState)を使っている。
        let [map,setMap]=useState(null);
        //センター位置を変更するための処理
        let setCenter=()=>{
          map.setView([51.505, -0.09],map.getZoom());
        };
        //マーカーを地図に追加する
        let addPoi=()=>{
          L.marker([53.505, -0.09]).addTo(map);
        }
  6.     //レンダー要素
        return (
        <>
        <MapContainer center={[51.505, -0.09]} zoom={13} scrollWheelZoom={true} whenCreated={setMap}>
            <TileLayer attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
        </MapContainer>
        <button onClick={()=>addPoi()}>マーカー追加</button>
        <button onClick={()=>setCenter()}>センターを表示</button>
        </>
    )
    }

 

2021年5月23日日曜日

Reactでレンダー後に処理を実行するフック(useEffect)

 クラスコンポーネントの場合、componentDidMount(),componentDidUpdate(),componentWillUnmount()などのライフサイクルに関する関数を書くことで、マウント時やレンダー時などに処理をはさむことができる。
けど、関数コンポーネントの場合は、これらの関数は使えないので代わりに、useEffect()を使う。

[ドキュメント]
https://ja.reactjs.org/docs/hooks-effect.html

[インストール]

Reactに含まれるので、特にインストール不要

[使い方]

  1. とにもかくにもインポート
    import react ,{useEffect} from 'react'

  2. 関数コンポーネントの処理の中で記載

    useEffect(処理関数,オプション)

    処理関数:useEffectはレンダー毎に第一引数に設定される処理関数を実行する。

    第一引数に設定される処理関数の戻り値にコンポーネントがアンマウントする際のクリーンナップ実行時に実行される。
    たとえば、setInterval()で定期的に処理を実行した際に、コンポーネントがアンマウントされた場合に処理と中止させる場合に使う。


    オプション:設定した処理関数の実行タイミングを制御する。
        指定なし:毎回
        []    :初めの一回のみ
        [state] :useState()で取得した状態管理に使用している変数を指定すると、状態が変化したときに実行される。


    useEffectで設定できる関数は1つなので、使い分けたい場合は、複数記述する。




Javascript で日付操作

 Javascriptで日付操作をするときnew Date()などで面倒だったけど、momentがよさそうだったのでとりあえずメモ。


[ドキュメント]
  http://momentjs.com/
[参考]
(わくわくBank)
https://www.wakuwakubank.com/posts/606-javascript-moment/

[インストール]

    npm install moment

[使い方]

  1. とにもかくにもインポート
    import moment from moment;
  2. 処理でのコーディング
    (現在日付を取得)
    moment().format("YYYY-MM-DD HH:mm:ss")

  3. こんなことも?
    (ロケール指定)
       moment.locale('ja')
    (加算:add)
       moment().add(数字,単位)
         単位: 年:'y',月:'M',週:'w',日:'d',時間:'h',分:'m',秒:'s'
    (減算:subtract)
       moment().subtract(数字,単位)
          単位は加算と同じ
    (差分:diff)
       元moment.diff(比較対象moment,単位,小数調整)
       単位は加算と同じ、デフォルトはミリ秒
     小数調整は小数以下あり(true),なし(false)
    (はじめ:startOf と おわり:endOf)
     moment().startOf(単位)  はじめ 
       moment().endOf(単位) おわり
     単位は加算と同じ
    (ほかの日時と比較:isAfter,isBefore,isSame)
       元より比較対照が後であればtrue : 元moment.isAfter(比較対象moment)
       元より比較対照が前であればtrue : 元moment.isBefore(比較対象moment)
       元と比較対照が同じであればtrue : 元moment.isSame(比較対象moment)
    (日付の生成)
      現在時刻(デフォルト) : moment()
      文字列で指定              : moment("2021-05-23")
      オブジェクトで指定     : moment({years:2021,months:5,days:23})
      Dateオブジェクト   : monent(new Date(2021,5,23))

2021年5月22日土曜日

Reactでコンポーネント間のデータ共有がしたい

 Reactは親から子コンポーネントに値を渡す場合、引数(props)として渡すことができる。ただ引数で実装する場合、親から孫や、兄弟で同じ値を参照しようとすると必要もないのに、propsに設定しまくることになるので、メンテンナンス性が良くない。

React ではContext APIを用意しているので、上記のようなケースの場合に使える。


[ドキュメント]

   https://ja.reactjs.org/docs/context.html

[インストール] 

  ※Reactに含まれているuseContextを使うので、Reactが入っていればよし。

[ソース例]

[context/app.js] Context用のファイル
import { createContext } from 'react';
const AppContext = createContext();
export default AppContext;

[App.js] アプリ本体
import AppContext  from './context/app';
import { useState } from 'react';

function App() {
  //authという状態とsetAuthという設定用関数を取得
  let [auth,setAuth] = useState();
  return (
    //AppContextで共有するauthとsetAuthを設定
    <AppContext.Provider value={{"auth":auth,"setAuth":setAuth}} >
    <Sample></Sample>
    </AppContext.Provider>
  );
}

[sample.js] 子コンポーネント
import React,{useContext} from 'react';
import AppContext  from './context/app';
function App(){
    //useContextでAppContextの状態を取得
    let app_context=useContext(AppContext);
    //Contextに値を設定
    app_context.setAuth({user_id:1});
   //参照
    console.log(app_context.auth);//{user_id:1}
    
    return (
        <div></div>
    );
}
export default Sample;


[ソース内での書き方]

  1.  createContextでContextを生成する。
    他のコンポーネントにimportするため、外部ファイルにしておく。
    適当に名前を付けてたContext用の変数にcreateContext()の戻り値を設定する。
      const AppContext = createContext();
    他のソースで読みこんだ時にアクセスできるように宣言をしておく
      export default AppContext;

  2. 共有したい範囲のコンポーネント上位に、ContextのProviderを設置する。

    定義したContextにはProviderが標準で用意される。
    定義したContextに合わせてタグを作る
    <AppContext.Provider value={オブジェクト}></AppContext>
    ソース例(App.js)では、面倒なのでuseState()で管理する値と、変更用の関数を用意して、それらをContentに設定している。

  3. Context.Consumer側での値の参照
    上位はPoviderで、受け取る側はCunsumerというらしい。
      関数コンポーネントの場合はuseContext()フックが使えるので、意識しなくても大丈夫。

     利用する場合は、useContext(定義したContext)で利用するContextを取得する。
     ソース例では、AppContextとしているので、useContext(AppContext)と記述することになる。
    Contextが取得できれば、あとは、共有した要素に直接以下のようにアクセスできる
        Context.共有値
    ソース例では、値保持用のauthと変更用のsetAuthという関数型の値を共有しているので、
        app_context.auth
        app_context.setAuth({user_id:2}) 
    といったようにアクセスできる。