Swift:Sandbox + WKWebView

ヘルプの実装を検討中にSandboxでNetworkにもチェックを入れなければならないことを再認識しました。

webページの読み込みがうまくいかないのでMesaClip for macOSを調べたら、NetworkのOutgoing Connectionにチェックが入っていました。これは要注意と思った次第です。

Image20180809.005

Helpの実装に際して、サマリーとしてscreenshot画面を表示し、User’s Guideの詳細を見たり検索したいユーザーはPagesからファイルを読み込む方式にしたい、と考えたのです。

2画面アクセスにするかどうか少し迷ったのですが、NSSplitViewで実現することにしました。切り替えに少し時間がかかりましたが、妙手は見つかりませんでした。web pageとscreenshotの切り替えは、それぞれのviewの横幅が大きい方に合わせることにしました。

使い勝手は、まあまあです。Image20180809.007

Swift:Qiitaの活用

来年の2月でwordpress.comのプレミアム契約を解約し、継続しないことにしました。

Qiitaの無料版でやりたいことができることがわかり、少しガックリしてしまいました。これでは、wordpress.comの有償版を使う意味がありません。

例えばこんなことがコードをcopy and pasteするだけで簡単にできます。Qiitaのブログ例はここにあります。

Screenshot 2018-08-09 22.33.38

どうすれば?

  • “`swiftのあとで改行、⑵ Swiftコード、⑶ “`で閉じる。
  • 特殊文字はバックスラッシュ\のあとに置けば表示される(前の行参照)。
  • 文字の色付<font color=”red”></font>で囲む。html表記。
  • URLリンク埋め込みQiitaは、[Qiita](http://qiita.com)と書く。

wordpress.comの良いところもあるのですが、swiftを使った開発メモの場合、コードが簡単に取り込めること、視認性が高いことが必要です。その点、wordpress.comは有料契約であるにも関わらず、フォントのハンドリングに制限があり、使用に耐えません。残念。

今後半年間でwordpress自体をやめるかどうかを含めて検討したいと思います。

Swift:コンテンツブロック

コンテンツブロックのソースコードをDropboxにアップしました。

Source dode: Ads-Blocks Sample code

The sample code is written to evaluate so-called json filters for Safari. MesaViewController is just a test program main, but MesaBlockFileter is developed for MesaClip for iOS. You can manage ads-blocks with the filters on memory. If your users want to customize filters, write the memory filters and read them after their customization, then rewrite them. As the filters are converted from macOS version, there would be my misunderstanding. I hope it is helpful for some app developers. Please refer to iOS 11 WKWebViewで広告などのコンテンツブロックをする by Mr. Shingo Fukuyama as well. The page is very good though it is written in Japanese. In regard to copyright, please refer to the source code.

  • このサンプルプログラムはフィルタの評価をするために作成しました。
  • MesaViewControllerは、フィルタ読み込んだあと、webページを表示し、フィルタが妥当かチェックするための暫定評価プログラムです。
  • MesaBlockFileterは、実際にMesaClip for iOSで使っています。
  • メモリだけで処理した方がプログラム上の操作性がいいので、Swiftに組み込む.jsonファイルの中身は最小限で動作するようになっています。
  • メモリ上のフィルタをカスタマイズしたい場合、これをファイルに書き出し、カスタムフィルタ対応ができるようになっています。
  • フィルタはMesaClip for macOSアプリで使っているものをコンバージョンしました。macOS版は力づくでコンテンツブロックを実装したので、フィルタの互換性がありません。そのため勘違いや間違いがあるかもしれません。

謝意: コンテンツブロックの処理はShingoFukuyamaさんのコードを参考にしています。詳細はiOS 11 WKWebViewで広告などのコンテンツブロックをするを参考にしてください。ShingoFukuyamaさん、ありがとうございます。

Image20180809.002

Image20180809.003

Swift:MesaClip for iOSをリリース

開発着手からとても長い月日が流れてしまいましたが、ようやくMesaClip for iOSをリリースしました。

途中でリリースを諦めようかとも考えたのですが、踏みとどまり、今朝、Appleからアプリの承認がおりました。審査では、スクリーンショットが引っかかり修正が必要でした。また、iTunesファイル共有が必要な理由を説明しました。

スクリーンショットを修正しているとき、ATS(http対応)をNOに変更し、メモ書きのバグが見つかったので修正しました。早く見つかってよかったです。

あとは大きな問題はありませんでした。

iOSについては、またひとつ勉強してしまったというのが今の感想です。

今後は、すでに最新OSに対応済みのMesaWater、MesaExif、MesaAnalyzerのアップデート版をリリース予定です。MesaWaterだけはドキュメント修正がたくさんあるので、先に着手しています。ほかはリリースノート対応で可能です。

あとから思いついたのですが、MesaMeterの出力であるCSVファイルをメールで送れるようにするか、共用ファイルにして、Windows PCのExcelから直接引き出せるようにすれば、手離れがよくなるので、いずれ、検討したいと考えています。

また、次のテーマは、教育か介護がおもしろいのではないかとぼんやり考えています。

スクリーンショット 2018-08-03 00.48.09

Swift:開発メモTwitter

開発中に書いたメモをFacebook PageからTwitterに移行しました。

とは言っても、Twitterは意味不明なアカウント凍結問題が起きており、まだ最終的にこれで落ち着くかどうか不明です。もう一度、Facebook Pageに戻る必要があることを完全に排除できないのは、少し残念なことです。

どちらを利用した方が便利かについては、一長一短があり、決めがたいです。Twitterの問題は、あとから修正できないこと、文字数に限りがあることです。Facebook Pageの方が柔軟性が高いですが、閲覧者とかフォロワーがFBの関係者ではないかという怪しげな点が気がかりです。

ブログがもう少し手軽なら、直接ブログに書いてもいいのですが、スクリーンショットのあげ方が面倒で使い勝手が悪いです。wordpressは改善の余地ありです。

Screenshot 2018-07-22 11.04.23

 

徒然:季節は夏に

MesaClip for iOSのリリースを完結できないまま、季節は夏になってしまいました。

少し残念ですが、これが実力。気を取り直して、もう少し集中力を維持するしかありません。

体調は良かったり悪かったりで、その日、その日で変わります。しかし、全体的に見ると、抗癌剤治療が終わったので、薬を飲まないですむ分、体力への負荷が軽減し、気分的にもだいぶ気楽です。とても長い1年間でした。

昨日、ベランダにシェードーをかけました。日陰があると、熱気がサッシとエアコンにあたらないので、早く涼しくなるし、電気代も少なくてすみます。この季節になると、ベッドルームで寝るのを諦め、和室で布団をしいて寝ます。リビングのクーラーの方が静かで効きがいいからです。

しかし、床で生活する習慣がないと、布団に寝る、布団から立ち上がるのがたいへんです。年をとるということが何なのか、毎日、着実に学習しています。

そう言えば、去年入院していて博多祇園山笠を見に行けなかったので、先週、博多に出かけました。しかし、カメラのバッテリが上がっていたので、やる気をなくし、ナンバーワンのラーメンを食べてすぐに帰ってきました。写真は駅前の飾り山笠を撮っただけでした。

Screenshot 2018-07-21 08.32.02

Swift4:UITextView制御(再修正)

placeholderの制御に関して、解決方法がわかりました。

解決方法

  1.  Z.yUserNote.endEditing(true)を付加
    ①このアプリの場合、表の行がクリックされたとき、UITextViewに対して.endEditing(true)を実行します。
    ②textViewDidBeginEditingやtextViewDidEndEditiongでフラグを立て、これを監視する必要はありません。.endEditing(true)を実行すると、UITextViewからキャレットが移動されます。
  2. 設定された値の変更(save)
    当該イベントが終了したときではなく、ほかのイベントがキックされたとき、実施しています(従来通り)。これは、textViewDidEndEditiongで実施しても、結局、ほかのイベントがはじまったときに監視しなければならないからです。
  3. キーボードを閉じる処理
    iPadでは問題がないのですが、iPhone SEだと入力対象エリアがキーボードで隠れてしまい、確認ができないからです。
    ①クリックされた直後にUITextFieldキーボードを閉じる。
    ②textViewDidEndEditingでUITextViewキーボードを閉じる。

@IBAction func ExecIBAGo2Click(){                        //<*Process when a row in UITableView is kicked*>
   self.ExecClickedRow(self.Z.qRow, pCount:0)            // 🔵🔵Click Process🔵🔵
}//🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳
func ExecClickedRow(_ pRow:Int, pCount:Int) {//<*pCount>=0: Click Process pCount<0: Update process after a row removal*>
   Z.ySearchbar.resignFirstResponder()                    //Close a keyboard for UITextField(Search).
   if pRow < 0 || pRow >= Z.rcArray.count || Z.rcArray.count <= 0 {//Available?
       Z.qRow          = -999                           //Out of the Array.
       return                                           //♻️return♻️ Go back.
   } else { }                                           //
   if pCount >= 0 {                                     //1st click or 2nd click and later?
       ExecSetValues2Array(Z.qRow//Save the previous values in tow UITextField and one UITextView.
   } else { }                                           //
   Z.yUserNote.endEditing(true)                         //End editing UITextView.
   Z.qRow              = pRow                           //Set the target row.
   Z.maybeLastRow      = pRow                           //Set the target row just in case.
   ExecSetDateTitleMemo(Z.qRow)                         //Draw Date & Time 📅Group 📚Title.
   Z.sortURL           = Z.rcArray[Z.qRow][Z.fURL] as! String//Set the current URL in case of clicking the screen shot.
   Z.yTableView.selectRow(at: IndexPath(row: Z.qRow, section: 0), animated: true, scrollPosition: .top)//Select the row.
   Z.yTableView.reloadData()                           //🍋🍋reloadData🍋🍋    }//====================================================//
func ExecSetDateTitleMemo(_ pRow:Int) {                //<*Set values to UITextView*>
   Z.yUserNote.text    = “”                            //
   if pRow < 0 || pRow >= Z.rcArray.count { return }   //♻️return♻️ The previous row is out of the array
   else { }                                            //
   Z.yGroup.text       = (Z.rcArray[pRow][Z.fGroup] as! String)//Set Group value.
   Z.yTitle.text       = (Z.rcArray[pRow][Z.fTitle] as! String)//Set Title value.
   let wImage:UIImage  = Com.CallResizeCapturedImage((Z.rcArray[pRow][Z.fScreen] as! UIImage), pImageView:Z.yScreen)//Set Screenshot.
   Z.yScreen.image     = wImage                        //
   let wCheck:NSMutableAttributedString?   = (Z.rcArray[pRow][Z.fNote] as? NSMutableAttributedString) //Check UserNote.
   if wCheck == nil || (wCheck?.string.count)! <= 0  { //Set the placeholder if the caret is out of the UITextView & no data.
       if wkEdited == “” { Z.yUserNote.attributedText = wkPlaceholder }//
       else              {  }                              //
   } else { Z.yUserNote.attributedText = Z.rcArray[pRow][Z.fNote] as! NSMutableAttributedString }//Set UserNote.
}//========================================================//
func textViewDidBeginEditing(_ textView: UITextView) {     //<*Watch the UITextView(Note Area)*>
   if Z.yUserNote.text == wkPlaceholder.string {           //Placeholder string?
      Z.yUserNote.text            = “”                     //No data.
      Z.yUserNote.textColor       = UIColor.black</b>      //Black. (Placeholder: Gray)
   } else {  }                                             //
}//========================================================//
func textViewDidEndEditing(_ textView: UITextView) {       //<*Watch the carsor (caret)*>
  Z.yUserNote.resignFirstResponder()                      //Close keyboard for UITextView(UserNote).
}//========================================================//

Screenshot 2018-06-12 07.34.11