GTX1060を買いました

potproject.net Advent Calendar 201614日目の記事です。

もはや普通のレビューである。


今年の冬にめちゃくちゃいろいろ買いそろえている感じ。

今度は、ついにグラボを買い換えに走りました。
ZOTAC GeForce GTX 1060 6GB Single Fanです。

この機種はファンが1つのみ、その分小さくてコンパクトというウリです。
でもやはり、ファンが1つだけという都合上、結構熱いです。
最近ハマっているtom clancy’s the Divisionでフル稼働にて70-76度というところで80度はギリギリ超えない。
でもこれでも問題ないレベルなんでしょうね。ファンは100%回っていませんし。
元々のGTX660と比べてもほとんど同じくらいでしたし。でも夏はちょっと厳しいのかも。
これでスペック不足を感じてくる日は何時になることやら。やっぱりVRに備えたというのもあるんで・・・

・・・VRもほしいんだけどなー値段がなー・・・

おまけでFire タブレット 8GBを買いました。最終日サイバーマンデーにて3500円。この値段なら損はしない。
お遊びで使ってみます。

最近のコーディングとか

potproject.net Advent Calendar 201613日目の記事です。

まだ半分か・・・。


最近のコーディングは、結局いろいろ使ってきたりしたのですが、v1.0になってそれなりに使えるようになり、
現在はv1.7まで上がりかなり安定してきたかなということで、Visual Studio Codeを使ってます。
略してVSCode。

Visual Studio Code – Code Editing. Redefined

多分、このブログを始めたより後にできたエディタじゃないですかね?それくらい新しいエディタだと思います。
Visual Studioは有名なIDEですが、別に互換性があるとかナンバリングじゃなく、全くの別物で、こちらはテキストエディタに近いです(デバッグ機能とかあるけど)
自分が一番気に入っているエディタといえば(今は)これなんで、布教活動でもしていきます。

1.Macでも使える

Visual StudioなのでMicrosoftが開発しています。でも公式サイトにもMac版が普通に提供され、使用できます。
と思ったのですが、つい最近Visual StudioもMac対応を出す予定でしたね。
でもこっちはオープンソースなので、開発当初からWindows/Mac/Linuxとマルチプラットフォーム対応で使いやすいです。
しかも一説によればWindowsよりMacの方が動作が軽いとか聞きます・・・。それもそれでどうなんだ。

2.同じ系統のエディタであるatom.ioやBracketsよりも軽い(体感)

atom.io,Brackets,VSCode
この3つはどれもWeb技術でデスクトップアプリケーションを作れるソフトウェアであるElectronを使って作成されたエディタなのですが、
全部使った中で体感的にVSCodeが一番軽いと思っています。
atomやBracketsは新規タブを開こうとするとかなり重いような印象。しっかり図ってませんが実際軽いと思います。
他にも同じように軽いというブログもありました。やはり一番後発だから、なんですかね?
electron系エディタ戦争終了のおしらせ。codeがイチオシ

3.基本はテキストエディタなのにデバッグ機能が備わっている

これが一番おすすめの理由でもあります。基本はテキストエディタで、ビルドなんかは出来ませんが、デバッグ機能だけはデフォルトで準備されています。
でも、最初から好きな言語がデバッグできるわけではなく、用途に合った拡張機能を入れる必要がありますが、
デバッグ機能が最初から想定されているおかげで、かなり見やすくデバッグが捗る。
拡張機能は色とりどりで、MicrosoftイチオシのC#やtypescriptはもちろん、一般的なc/c++、phpやjavascript(node.js)などのWebサーバ系ソフトウェアで使える言語も可能です。
コーディングに関して、デバッグ機能は必須です。php-debugをよく使ってます。

その他、最近のエディタには当たり前になってきているgit機能、わかりやすくシンプルですがあるとかなり便利な全ファイルの文字列検索など、
大型のIDEや特化したテキストエディタとは違う、これだけは揃えておきたい、という機能がちゃんと入っているエディタと思います。
まだ初版リリース(v0.1)から1年少しでもうバージョンがv1.7にまで増えているのを考えると、かなり活発にアップデートしているという点でも魅力だと思います。

以上、宣伝でした。

サーバー移管した話

potproject.net Advent Calendar 201612日目の記事です。

今日は手抜き。


ようやく、サーバの移管がほぼ完了したのでそれに関する簡単なTipsとメモです。
今回は10分くらいで書ける記事を目指しています。ついでに前の記事の宣伝です。たまには簡単に行きましょう。

20分くらいかかってしまった・・・

WordPress移行

基本的にはWordpressのデフォルト機能として備わっている インポート/エクスポート機能 で移行しました。やはりデフォルトなので一番わかりやすくかつ簡単だと思います。
デフォルト機能なのですが、プラグインが必要だったりします。
古いサーバから管理画面より「ツール」→「エクスポート」からxmlファイルとしてエクスポート、
新しいサーバでインポートで特殊でない大体の記事は問題なく動きます。
スキンやプラグインなどは反映されませんが、そこは数も少ないので手動でした。

Webサーバ構築

この部分は記事別にいろいろまとめています。おさらいです。
自分のサーバではnginx,node.js,sinatra(ruby)と3つほどWebサーバが稼働しています。
centos7+nginx+php-fpm+php7な新しい感じの環境を構築
nginxでRackアプリケーション(sinatra)を動かす

SSL(https)対応

このあたりも(ryです。
おかげさまでSSLオンリーのサイトになりました。
これからは個人サイトといえど必須だと私は思っています。自動更新も忘れずに。
Centos+nginxでLet’s encrypt(certbot)導入と自動更新まで
[nginx]Let’s EncryptでSSLのセキュリティをA+にするまで

Mysqlのダンプ取得

Mysqlのダンプはやはりphpmyadminからエクスポートするのが楽でいいですが、コマンドならmysqldump -u USERNAME -p DBNAME > OUTPUTですね。
取得したらmysql -u USERNAME -p DBNAME < OUTPUTでインポート。たまにデータベースを先に作成する必要があったりすることもあります。その場合は“create database DBNAME“`で作成。

古いサーバはまだ残っていて、放置してるとやはりお金が無駄に取れますので、早いところ解約しなきゃ・・・

Xiaomi Redmi note 3 proとMi band 2を買った話

potproject.net Advent Calendar 201611日目の記事です。

やべえあと1時間しかない何書こう


Xiaomi Redmi note 3 proを買いました。結構前に。

で、1.5カ月ほど使ってみてのレビューです。中華製品は最初にレビューしても、実際のところ1カ月で壊れたりするので、買ってすぐにレビューせず1カ月間寝かせてみました。

これが買ったとき当時のものです。よく言われるのですが箱が某アレに似ています。というかまんまです。

合わせて買ったものとして、横にあるのはXiaomi Mi band 2というヘルスロギングツール。まあ簡単に言うと時計兼万歩計兼ヘルスケア用品です。

gearbestさんでredmi note 3 proは140ドルくらい。Xiaomi Mi band 2は30ドルです。

Redmi note 3 proのスペックのコストパフォーマンスだけを見るとすごく高いです。

基本的なスペックはROM 16GB,RAM 2GB,SoCはSnapdragon 650、フロントとリアカメラ、あとは指紋認証。
Snapdragon 650はantutu 70000程度のレベルで、日本で3,4万で売ってるP9 Liteあたりよりも性能はいいです。
実際のところ、日本で売られている機種は太刀打ちできないレベルのスペックという魅力があります。スペック至上主義の私としては最高です。
まあ、耐久性とかはどうなるかわかりませんが、そこは国内7位にまで落ちてしまったけどXiaomiさんのブランドということで買いました。

Xiaomi好きなんですよね。コンセプトとかブランド感を醸し出しているのに、中華っぽいところとか。
この前出した炊飯器とかもちょっとほしいくらいです。おどり炊きの創案者が開発にかかってるとかで注目してます。
でも炊飯器なので日本のコンセントで大丈夫かな・・・と思わなくもないですが・・・

結局中国サイトから発送に関してはいろいろ言われていますが、自分に限ってはかなり早い段階で着きました。というより予定通りでした。

gearbestは現在、発送方法としておなじみの「日本郵便(Japan Post)」が選べるようになっています。 (Priority Line選択時

日本郵便の場合、発送は7-10日。しかも送料無料です。1週間で届きます。いい時代ですね・・・。

で、使いごごちですが、AndroidベースのMIUIという某PhoneっぽいカスタムUIが採用されています。実際、これも使ってみたかったということも買った理由です。
かなりよくできてると思います。でもAndroidっぽくないなあと思うのですが。
あとは、指紋認証。この値段帯で指紋認証までついてるというのは本当に驚き。iPhone 6Sを持ってますが、それと同じくらいレスポンスは早いしロック解除できるので使いやすいです。
2カ月が立とうとしてますが、基本アプリの検証機として買ったものなので、壊れる気配はないです。
まあ今まで中華的なパッドを使った経験からすると、大体は突然死なのでわかんないですのよね・・・。

Mi band 2はわりとスマートな時計としても使えます。でも一番役に立ってるかなーと思うのは公式アプリで測ってくれる睡眠時間のロギング。

これはかなりの精度で寝た時間を記録してくれます。一日7時間よく寝る自分にとっては嬉しい機能です。

つーか二度寝とかもちゃんと記録されるし、布団に入っているだけだと記録されないし、どうやって判定しているのかかなり気になります。
ほかにも通知機能だったりとfitbit某製品と同じレベルの機能は備わっています。
今ならセールでこちらは25ドルくらいで売ってるのを見かけます。こういうの欲しいと思ってた人は損はないでしょう。
Xiaomiのアカウント作らないといけないのがちょっとアレですが、それくらい。

最近はモニタも買ったし、グラボも買ったし、スマホも買ったし、社会人の財力で生活レベルがどんどん上がっていきます。

次はMacBookかな。

[JavaScript/ECMAScript2017]async/awaitとPromiseでjavascript直列/並列処理

potproject.net Advent Calendar 201610日目の記事です。

祝!10日連続更新!


ES8にあたるECMAScript2017では、await/asyncが実装されると聞いて。黙っちゃいられねえ。

まだES2017は策定中ですが、なんかEdgeでも動くようになったらしいし(設定は必要)、多分ほぼ確定。内定状態でしょう。

https://tc39.github.io/ecma262/

しかし、やはり標準では動かないので、このコードはbabelでトランスパイルしてnode.jsで動かしてます。ご了承ください。

await/async修飾子は、元々C#で使われていた非同期処理を同期的に記述できる仕組みです。

一時期C#を使っていてユニバーサル Windows プラットフォーム (UWP) アプリを作っていた時があり、

制約がありすぎて普通にWindows formsで作りてえと思いつつその時に使用しておりました。

基本的に使い方はC#もjavascriptも同じです。しかし、当然javascriptにはTask型なんてありませんので、Promiseがそれの代用になります。

つまりは、await/asyncを使うにはPromiseから習得する必要があります。

なので、ここではPromiseに関しても軽く記載しておきます。

Promiseに関しては、非同期の処理を上手く同期的に見せたり、並列処理が出来るメソッドです。

何が違うかというと、書き方が違います。await/asyncは非同期処理を同期的に行うため、結局直列の処理になりますが、Promiseは並列処理が可能です。

今回書くコードは、Promise.allでの並列処理とawait/asyncでの直列処理の比較です。

プログラム的には、1から指定された数まで全て足して出力するだけの処理です。

arr.reduceを使った非同期処理方法とfor文を使った同期処理方法で、それぞれ処理をして表示します。

一応速度も出力します。

//繰り返し回数
const execute_count=10000000;
(async ()=>{
  //await/asyncでの直列処理
  var startTime = new Date();
  var sumtest = await reduce_sum(execute_count);
  var normalsumtest=normal_sum(execute_count);
  var endTime = new Date();
  if(sumtest===normalsumtest){
    console.log("(await/async):" + (endTime - startTime) + "ms ans:"+sumtest);
  }

  //Promise.allでの並列処理
  var startTime2 = new Date();
  var sumexecute=await sum(execute_count);
  var endTime2 = new Date();
  console.log("(Promise.all):"+(endTime2 - startTime2)+ "ms ans:"+sumexecute);
})();

async function sum(num){
  return new Promise((resolve,reject)=>{
    Promise.all([normal_sum(num), reduce_sum(num)])
    .then(function(sum_result) { 
      if(sum_result[0]===sum_result[1]){
        resolve(sum_result[0]);
      }else{
        reject();
      }
    });

  });

}

function normal_sum(num){
  var arr=[];
  for(var i=1;i<=num;i++){
      arr.push(i);
  }
  var sum = 0;
  for(var x=0;x<arr.length;x++){
    sum+=arr[x];
  }
  return sum;

}

async function reduce_sum(sum){
    return new Promise((resolve,reject)=>{
      var arr=[];
      for(var i=1;i<=sum;i++){
        arr.push(i);
      }
      return resolve(arr.reduce(function(prev, current) {
        return prev+current;
      }));
    });
}

結果はこんな感じ。

(await/async):690ms ans:50000005000000

(Promise.all):786ms ans:50000005000000

並列の方が遅い。ほぼ変わらずです。なんで?って感じですが、多分これが正しいと思います。

javascriptはご存知の通りシングルスレッドなので、並列処理だからってスレッドを増やしたりできません。

シングルスレッドということは同時に別の処理をやることはできないので、だから結局のところ疑似並列処理なだけです。

むしろ並列にしたほうが割り込みが入るので、遅くなると思います。

実際トランスパイラしてるというのもあるし、await/async/Promiseの処理時間とかもあるので上の時間は多分あてになりません。

一番の問題は、コードの見やすさです。

await/asyncを使えばメインのコードにコールバックを一切入れることが無くなるため、見やすいんじゃないかなと思います。

自分は積極的にawait/asyncは使っていきたいです。もうコールバック地獄には入りたくない・・・。

[React Native]ネイティブモジュール(Swift)を使う[iOS編]

potproject.net Advent Calendar 20169日目の記事です。


react-nativeをとりあえずすぐ実機で動かしてみる

で、とりあえず実機で動くかの確認は取れました。
で、今回は、React Nativeとネイティブコードの連携をやってみたいと思います。

React NativeはiOSやAndroidを共通のJavascriptで書いてマルチプラットフォームでしかもネイティブに動くよ!というのがウリです。

しかし、当然ながら、SwiftやObjective-Cを使うようなものも必要になります。カメラとかプッシュ機能。

まあメジャーなものは用意されてる場合もあるんですが、マイナーなものは無かったりするので、

自分で作ってね!ってことでネイティブモジュールという機能で補完できるようになってます。

Cordovaを思い出す。しかしこっちは完全ネイティブなのだ。

このあたりを参考にしました。しかしまあやっぱり例によってSwift3.0なので結構コード変えてたりもします。
React NativeでNative機能をSwiftで書いて使うには

Native Modules

Objective-Cは全く分からないのでSwiftです。でもブリッジしなくてはならないので多少はObjective-Cは避けられないんだなあこれが。
原則、React NativeはネイティブモジュールにSwiftを使うように設計されていません。生成されたプロジェクトもObjective-C用で生成されます。

なので、使うにはObjective-CとSwiftを連携させる必要があります。

swiftでモジュールを作成

まずは、モジュールを作成します。ちなみにこれだけだとまだ動きません。
端末の時間を取得してAny(Dictionary)型でコールバックを返します。

どうやらReact Nativeのjavascriptにデータを受け渡す際は必ずcallbackなのかな。
ちなみにPromiseも使えます。

ReactNativeModule.swift

import Foundation

@objc(ReactNativeModule)
class ReactNativeModule: NSObject {

  @objc func callbackMethod(_ callback: RCTResponseSenderBlock) -> Void {
    // システムのカレンダーを取得
    let cal = Calendar.current
    // 現在時刻のDateComponentsを取り出す
    var dataComps = cal.dateComponents([.year, .month, .day, .hour, .minute], from: Date())
    let object = [
      "year":dataComps.year!,
      "month":dataComps.month!,
      "day":dataComps.day!
    ]
    callback([object])
  }
}

配列で返しても大丈夫なの?と思いでしょうが、ちゃんとReact Native側はjavascript Object型で受け取ってくれます。優秀です。  
callbackMethodの第一引数が無名関数がなっているのは、このあたりの問題から。認識してくれないのです。Swift3.0での変更点となります。
Got “is not a recognized Objective-C method” when bridging Swift to React-Native – stackoverflow

Objective-Cでエクスポートする

ReactNativeModuleBridge.m

#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(ReactNativeModule, NSObject)

RCT_EXTERN_METHOD(callbackMethod:(RCTResponseSenderBlock)callback)
@end

実際はこのObjective-Cが読み込まれます。これが上で書いたSwiftコードの橋渡しになります。

Objective-Cの文法は相変わらず割と理解できていない。

testreactnative-Bridging-Header.h

#import "RCTBridgeModule.h"

RCTBridgeModule.hというObjective-CのコードをSwiftで読み込むために設置。
このあたりに関してはググるといっぱい出てくるため割愛。

React Native側のソースはこんな感じ。画面の更新もしたかったのだが、結構時間掛かりそうで・・・ただログ出すだけ。

index.ios.js

import React, { Component } from 'react';
import {
  NativeModules,
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';
var nm=NativeModules.ReactNativeModule;
nm.callbackMethod(function(res){
    console.log(res);
});

これでデバッグ画面からログが確認できました。

ちゃんと{"year":2016,"month":12,"day":9}と出てきます。Any型も受け渡せるのは楽でいいですねえ。

今回、タイトルが(iOS編)です。

これで気づいた人もいるかもですが、明日はネイティブモジュール(Java)を使う[Android編]をやります。多分。

Swift3.0でjsonパラメータをHTTP POST

potproject.net Advent Calendar 2016
8日目の記事です。

Swift3.0です。本当Swift2.x時代が強すぎて検索に全く引っかかってこないのが辛い。


もう結構前になってしまいますが、iOS10が公開され、iPhone7も発売されました。

しかし、相変わらず自分的にはiOS10もiPhone7も興味ありません。

でも、残念ながらiOS開発をしているとiOS10にも対応しなきゃならなくなり、

小規模なアプリを作っていたので、swift2.3からswift3.0に書き直すことに。

しかし、swift3.0はもう2.xの互換性をかなぐり捨てていて、公式でコンバータが用意されるくらいにめっちゃ変更されてます。

まあ大体はコンバートで対処できるのですが、http通信のコードの部分でエラーが出ていました。

調べるとやっぱりここはうまく自動変換ができない模様。

Swift 3 URLSession.shared() Ambiguous reference to member ‘dataTask(with:completionHandler:) error (bug)

で、大体の人が詰まっているようだったswift3.0でHTTPリクエストを送るコードを自分のメモがてら載せときます。

つかswiftは仕様変わりすぎなんだよね・・・

コピペエンジニアには辛すぎる言語だ。ググっても2と3が混合してて辛い。

まず、swift2.3のコード。バックアップ取ってなかったんで再現になりますが。
Swift2.xだとこんな感じです。
参考:http://qiita.com/sushichop/items/ac4ae99b905ce523c2fe

// create the url-request
        let urlString = "http://httpbin.org/post"
        var request = NSMutableURLRequest(URL: NSURL(string: urlString)!)

        // set the method(HTTP-POST)
        request.HTTPMethod = "POST"
        // set the header(s)
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        // set the request-body(JSON)
        var params: [String: AnyObject] = [
            "foo": "bar",
            "baz": [
                "a": 1,
                "b": 20,
                "c": 300
            ]
        ]
        request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: nil)

        // use NSURLSessionDataTask
        var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {data, response, error in
            if (error == nil) {
                var result = NSString(data: data, encoding: NSUTF8StringEncoding)!
                println(result)
            } else {
                println(error)
            }
        })
        task.resume()

いろいろありますが、これはNSURLSessionDataTaskというものを使ってでHTTP POSTを送るようです。

多分今までのswiftだとこれが主流なのかな?

このNSURLSessionがswift3.0ではURLSessionになり、仕様も変わっています。

URLSession.DataTaskは、第一引数に NSMutableURLRequest型ではなくURLRequest型でないと動きません。

NSMutableURLRequestを受け渡すと、クラッシュします。

requestは明示的に型宣言してないため、コンバートが見逃したということですね。

しかもコンパイル時エラーも起きない。困りますね。

(他のブログだとこれでビルドが通らないらしい。もしかして修正されたのかも?

というか通り抜けてたならAppleさんが悪い・・・俺は悪くない

参考:https://blog.areare.net/archives/8321

URLRequestは、NSMutableURLRequestとほぼ同じように書けます。

というより、内部的にはほぼ同じものらしいので、なんでこれで通らなくなってしまったのかわからん。

let urlRequest = URLRequest(url: requestURL)

これを踏まえて、書きます。

        let urlString = "https://httpbin.org/post"
        var request = URLRequest(url: URL(string:urlString)!)

        // set the method(HTTP-POST)
        request.httpMethod = "POST"
        // set the header(s)
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        // set the request-body(JSON)
        let params: [String: Any] = [
            "foo": "bar",
            "baz": [
                "a": 1,
                "b": 20,
                "c": 300
            ]
        ]
        do{
            request.httpBody = try JSONSerialization.data(withJSONObject: params, options: [])
        }catch{
            print(error.localizedDescription)
        }
        // use NSURLSessionDataTask
        let task = URLSession.shared.dataTask(with: request, completionHandler: {data, response, error in
            if (error == nil) {
                let result = String(data: data!, encoding: .utf8)!
                print(result)
            } else {
                print(error)
            }
        })
        task.resume()

こんな感じかな。

初期に公開したコードはやっぱり間違っていました。ごめんなさい。

ちゃんとこのソースのままでjsonをpostできていることを確認しました。

後は、他にもいろいろ変わっているところがありました。

NSJSONSerialization.dataWithJSONObject([AnyObject], options: [options], error: [error])は、

JSONSerialization.data(withJSONObject: [Any], options: [options])に置き換わりました。

errorのコールバックがなくなった分、try-catchを行わないとコンパイルエラーとなります。

他にも、微妙に大文字から小文字へと変数名が変わったり。

iOS開発初心者のSwift3の道は険しい。