XAMPP起動しないんで、調べたら
https://dezanari.com/mac-xampp-apache/#toc2
にあった
sudo apachectl stop
でうまくいった。いつの間にApacheが起動してたんだ?
そしてApache起動したけど、認証系が動かなくなった、、
XAMPP起動しないんで、調べたら
https://dezanari.com/mac-xampp-apache/#toc2
にあった
sudo apachectl stop
でうまくいった。いつの間にApacheが起動してたんだ?
そしてApache起動したけど、認証系が動かなくなった、、
アプリ内メッセンジャーの制作で、リアルタイム性を出すためにいろいろ検討した。Node.jsはなんかめんどそう。WebSocketも面倒そう。
で、サンプルコードが理解できたpusherにする。
<テスト環境の構築>
MacのXAMPPでPHPのComposerがいるらしい
$ composer -bash: composer: command not found
入ってないらしい。
https://blog.fire-sign.info/686/
を参考にインストする
$ curl -sS https://getcomposer.org/installer | php
インスト始まる
ll settings correct for using Composer Downloading... Composer (version 1.10.9) successfully installed to: /Users/ユーザ名/composer.phar
どうも composer.pahr を特定のディレクトリにいれなきゃらしい
$ sudo mv composer.phar /usr/local/bin/composer
移動できたのでバージョンチェック
$ composer --version Composer version 1.10.9 2020-07-16 12:57:00
このバージョンが入りましたとさ
肝心のpusherを入れる
$ composer require pusher/pusher-php-server Using version ^4.1 for pusher/pusher-php-server ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Generating autoload files
でインスト終わる。
うまくいかない
$ sudo nano .bash_profile
で
export PATH=$PATH:/Applications/XAMPP/bin
を追加(Mac)
source ~/.bash_profile
して実行
※APIキーが見えるのであくまでも実験用です※PHPだからクライアントには見えないか,,
流れ
(がんばってとってください)
<?php if(isset($_POST["comment"])){ $comment = $_POST["comment"]; $url = 'https://language.googleapis.com/v1/documents:analyzeSentiment?key=(ここに自分のAPIキーを入れる)'; $document = array('type' =>'PLAIN_TEXT','language' =>'ja','content' =>$comment); $postdata = array('encodingType' => 'UTF8', 'document' => $document); $json_post = json_encode($postdata); $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_post); $result = curl_exec($ch); curl_close($ch); $result_array = json_decode($result,true); echo $result_array[documentSentiment][score]; } ?>
Unit側のC#ファイルを作成します
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;//<--追加 //using System; public class test2 : MonoBehaviour { public Text ResultText_; public Text InputText_; public string ServerAddress;//サーバアドレスをエディタで入力する // Update is called once per frame void Update() { } void Start() { ResultText_.text = "";//画面表示を消す } //UIのボタンにアサインするスクリプト public void SendSignal_Button_Push() { StartCoroutine("post_data");//ボタン押されたらコルーチンを開始 } private IEnumerator post_data() { WWWForm form = new WWWForm(); form.AddField("comment", InputText_.text); //Input Field等から渡された変数をcommentのタグ付けして内容を送信 WWW post = new WWW(ServerAddress, form); yield return post;//データの戻りを待つ Debug.Log(post.text);//コンソールに表示(この出力内容はPHPで変更可能) ResultText_.text = post.text; } }
忙しいときは書けない、、、
複数あるチェックボックスを4つまで選択可能にし、4つ超えると警告を出し、最後に選択したチェックを外します。
<script> function checkIDset(hitID){ const idArr = []; const id_tag = document.getElementsByName("checkID"); for (let i = 0; i < id_tag.length; i++){ if(id_tag[i].checked){ //(color2[i].checked === true)と同じ if(idArr.length > 3){ //警告出す alert('4人以上は選択できません'); //最後に選択したIDのチェックを外す const rmvTag = document.getElementById(hitID); rmvTag.checked = false; }else{ idArr.push(id_tag[i].id); } } } } </script>
PHP部分
<?php echo '<div class="input-group m-1 p-0"><div class="input-group-prepend"><div class="input-group-text p-1"><input type="checkbox" onchange="checkIDset('.$value['id'].')" name = "checkID" id="'. $value['id'] . '"></div></div><span class="form-control"><label for="'. $value['id'] . '"><span class="badge badge-primary">本人</span><span style="font-size:0.9rem;">' . $value['name'] . 'さん</span></span></label></div>'; ?>
小さいcanvasをレスポンシブに配置するテスト
こんなのできる.一色ずつcanvas作成
要bootstrap4,jQuery
(任意)
chroma.jsライブラリ読み込み
<!--chroma.jsライブラリ読み込み--> <script src="https://cdnjs.cloudflare.com/ajax/libs/chroma-js/2.1.0/chroma.min.js"></script>
スタイルシート作成(レスポンシブ用)
<style> .wrapper{ width: 100%; height: 100%; }</style>
canvasの外側のDIV作成 wrapperクラスのサイズ
<div id="scales" class="wrapper"></div>
JSでcanvasを複数作成
<script> //chroma.js使用 var scales = document.getElementById('scales'); var color_list = chroma.scale(['blue', 'crimson']);//blueからcrimsonへの色変更 var divide = 5;//色変更の分割数 var i; //forでcanvasを複数作成 for (i = 1; i <=divide; i++) { //canvasを次々作成 var mem_canvas; mem_canvas = document.createElement("canvas"); mem_canvas.setAttribute("id","scaleCanvas" + i);//ID変更し複数作成可能に //jQueryでこのDIVの縦横を取得 var w = $('.wrapper').width(); var h = $('.wrapper').height();//未使用 mem_canvas.width = w/divide;//canvas幅はwrapper÷分割数にする mem_canvas.height = w/divide;//正方形にする //作成するcanvasのCSS設定 mem_canvas.style.width = (100/divide) + '%';//canvasに独自のCSSを入れる mem_canvas.style.height = 'auto';//高さはwrapper比にはできないんでautoにする //色を塗る var context = mem_canvas.getContext('2d'); context.fillStyle = color_list(i/divide);// context.fillRect(0, 0, w/divide, w/divide);//正方形に塗りつぶす //HTMLに追加 scales.appendChild(mem_canvas);//親のDIV scalesに子として追加 } </script>
参考
メモ
cssファイル読み込むか,headあたりに<style>で以下を入れる
canvas { background-color: blue; width: 100%; height: auto; }
canvasを作成
<canvas id="canvas" width="300" height="300"> </canvas>
JS実行(jquery)
$( document ).ready(function() { var c=document.getElementById("canvas"); var ctx=c.getContext("2d"); ctx.beginPath(); ctx.arc(95,50,40,0,2*Math.PI); ctx.stroke(); });
参考
https://stackoverflow.com/questions/23973932/responsive-canvas-in-bootstrap-column/23974225
HTMLのあれをとってくる
https://qiita.com/_tid_/items/8705275813e740d693ef
webView.evaluateJavaScript("document.documentElement.innerHTML") { value, error in print(value as? String as Any) }
これはHTML全文になるので
webView.evaluateJavaScript("document.getElementById('tes').innerHTML") { value, error in print(value as? String as Any) }
で,HTML内に
<p id="tes">2019</p>
いれておくと,
optinal(“2019”)と表示される.
IDをWKWebkitからとれなかったので,cookieから取る
まずPHPでcookieにuseridを設定
//cookie設定(Swift用) $userid = $_SESSION["id"]; setcookie('userid', $userid,time()+60*60*24*7); echo $_COOKIE[‘userid’];
Swiftでcookieを取得・ただしこれはiOS11用
//セッション取得 let cookieStore = webView.configuration.websiteDataStore.httpCookieStore // webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { // print($0)//全部取る // } cookieStore.getAllCookies() { (cookies) in for cookie in cookies { if cookie.domain == "hoge.com" && cookie.name == "userid" { // UserDefaultsに保存 let cookieData = NSKeyedArchiver.archivedData(withRootObject: cookie) UserDefaults.standard.set(cookieData, forKey: "Cookie") UserDefaults.standard.synchronize() print(cookie.value)//これでuseridだけとれる } } } //
XCODEのコンソールに表示される
参考
https://qiita.com/haru15komekome/items/fdbdea6d755545468ac8
特定のURLで実行させたい(途中)
extension ViewController: WKNavigationDelegate {//の中に書く // 読み込み開始後に実行 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { //URLチェック //0.5秒後に実行する DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // 0.5秒後に実行したい処理 } }
参考
https://swift.tecc0.com/?p=669
https://qiita.com/s_emoto/items/dc3d61626155f5cf83e7
これのまとめ
extension ViewController: WKNavigationDelegate {
の中にかきます
// 読み込み開始後に実行 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { //URLチェック let currentUrl:URL? = webView.url let url = currentUrl?.absoluteString // 特定のURLで分岐処理 if url!.contains("https://hoge.com") { //動的URLなのでcontain使用url!<-は //print("URLが含まれる") // 0.5秒後に実行したい処理 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { //セッション取得 let cookieStore = webView.configuration.websiteDataStore.httpCookieStore // webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { // print($0) // } cookieStore.getAllCookies() { (cookies) in for cookie in cookies { if cookie.domain == "life-log.org" && cookie.name == "userid" { // UserDefaultsに保存 let cookieData = NSKeyedArchiver.archivedData(withRootObject: cookie) UserDefaults.standard.set(cookieData, forKey: "Cookie") UserDefaults.standard.synchronize() print(cookie.value)//cookieのuseridをsessionに表示 } } } ////セッションここまで } } }
containsの参考
https://qiita.com/osamu1203/items/3ee63291c37d91428b55
3つのファイルを用意してサーバにアップロードしてください
このほかにCLIENTキーが必要とかなんとか,,(詳細はここ)これなしでも動いてるけど,,,
<!doctype html> <html> <head> <meta charset="utf-8"/> <title>Clarifaiサンプル</title> </head> <body> <h1>Clarifaiサンプル</h1> <script type="text/javascript" src="https://sdk.clarifai.com/js/clarifai-latest.js"></script> <script type="text/javascript" src="const.js"></script> </body> </html>
// instantiate a new Clarifai app passing in your api key. const app = new Clarifai.App({ apiKey: 'Your API KEY' }); // predict the contents of an image by passing in a url app.models.predict("e0be3b9d6a454f0493ac3a30784001ff",'YOUR IMAGE URL').then( function(response) { console.log(response); }, function(err) { console.error(err); } );
Your API KEYの部分には自分の作成したAPIキーを
YOUR IMAGE URLには自分のURLを
画像を同じサーバに保存して実行
実行結果はWEBのコンソールに表示されます
Denim Jacket 91.7%
Peacoat 80.8%という結果が表示されています
このデータを自動的にWEBに表示するには
ObjectデータをJsonで解析する方法と,InnetHTMLあたりで実行できるかも
(参考ページ)
Cordvaのバージョンは4.1.1以降にしろとGoogleさんより警告.
でないとアプリを削除するよと.
Moancaでビルドしたとこcordva5.xだと20MB越えてとてもデータ容量に見合わないと,cordvaの古いバージョンで作成したため出たエラー.
まとめ
Cordva5系 何もしなくても18MBファイルサイズが増える
Cordva3.x ビルドサイズは小さいけど,Googleさんよりセキュリティエラーが出る 3.5MB
Cordva4.x ビルドサイズ小,セキュリティもクリアしているはず 3.7MB 0.2MBの増で収まった
なお、元データは274KB.オリジナルのスプラッシュスクリーンつけるととたんに数メガ増える,,