OmniAICreator/Qiita-1.07M huggingface dataset:
出会って3分で合体！(Obniz動かしてみたよ)

#Obnizってなによ
一葉先生一枚を生贄にすると召喚できる魔法のデバイスです。
インターネットを通じて色々な電子回路を動かせて、、
しかもjavascriptで書けるという現代っ子にはたまらない一品です(๑•̀ㅂ•́)و✧
僕の説明よりもわかりやすい記事がありますので、
面倒な方はこちらを御覧ください。

https://obniz.io/doc/quickstart

#で、どうやるの？
##1.買い方
https://obniz.io/
からポチッとな(=ﾟωﾟ)ﾉ
※当日発送だけど、実質2日ぐらいで届いた気がする

##2.セットアップ方法
箱を開けて、mini USB刺すとWi-Fiセットアップ画面が出るので、
近くのWi-Fiに繋げましょう。

##3.開発方法
Wi-FiにつなげるとQRコードが表示されるのでスマホとかで読み込んでなんかこうSlackとか適当な場所に貼ってPCのChromeとかで接続するといい感じのWebエディターが出てくるので書き換えてみます。
※0.1秒毎に乱数を描画してみた。標準のフォントサイズだと4行までだけど変えられるっぽい。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/16981/699949ce-c35c-df3b-7a7d-ae2b4feb6359.jpeg)

##4.実行結果
![2.gif](https://qiita-image-store.s3.amazonaws.com/0/16981/7683a5c8-649d-c9d6-f894-202877e50a1b.gif)

##5.感想
Wi-Fi設定する時は本体についてるボタンをポチポチしていくのがここが一番時間がかかった！ｗ
書き換えたコードもすぐに本体に反映して動作確認ができるので、
開発スピードも早くてラクラク過ぎて、ちょっとなんかやろうと思っただけだとArduinoやラズパイが霞んで見えるよ・・・！
次は連携させて遊んでみよー。
React Nativeでプッシュ通知受け取り後のハンドリング

# React Nativeでプッシュ通知の受け取りとハンドリング
プッシュ通知自体の実装は完了しているものとします。

# 使用するパッケージ
https://github.com/zo0r/react-native-push-notification

こちらがReact Nativeの定番のプッシュ通知ハンドリングのパッケージ

## インストール
```
yarn add react-native-push-notification
react-native link
```

# プッシュ通知のハンドリング
```javascript

var PushNotification = require('react-native-push-notification');

PushNotification.configure({
    // リモートまたはローカルのプッシュ通知を受け取ったか開かれたときに呼ばれる
    onNotification: function(notification) {
        console.log( 'NOTIFICATION:', notification );

        // iOSのみ必須(詳しくはこちら fetchCompletionHandler docs: https://facebook.github.io/react-native/docs/pushnotificationios.html)
        notification.finish(PushNotificationIOS.FetchResult.NoData);
    },

    // ANDROIDのみ、リモートでは必須
    senderID: "GCM（FCM）のSENDER_ID",

    // IOSのみ
    permissions: {
        alert: true,
        badge: true,
        sound: true
    },

    // 以下二つはdefault: true
    popInitialNotification: true,
    requestPermissions: true,
});
```

基本的に設定することはあまりなく、onNotificationの処理のなかで切り分ける模様。

# iOSでNative module cannot be nullとなる場合の対処法
### **ネイティブと自動リンクさせるための以下のコマンドをまず叩いたか確認**
```
react-native link
```

### **linkできない場合**
公式に解決法が載っています。
https://facebook.github.io/react-native/docs/linking-libraries-ios#manual-linking

# 結論
記事にするほどじゃなかった。
Salesforce ログイン後に任意のVFを表示

・表示したいVFのタブを作成
・[設定]→[作成]→[アプリケーション]　で何か１つアプリケケーションを作成
・作成したアプリケーション内でデフォルトの表示タブを表示したいVFのタブに指定
・プロファイルの設定でデフォルトに表示するアプリケーションを指定
Laravel のURLに対するアクセスで動的な JavaScript を返す

ルートに対するアクセス時にセッション等を利用してユーザーを判別し、
ユーザーごとに異なるJavaScriptを返すというのを試してみたので、その際の関連メモです。

```php:resources/views/dynamic/script.blade.php
// BladeテンプレートにそのままJavaScriptを記述してます
(function(){
  window.App = {
    env: '{{ config('app.env') }}'
  }
})()
```

```php:routes/web.php
Route::prefix('dynamic')->group(function () {
    Route::get('my-script.js', function () {
        return response()->view('dynamic/script', [], 200, [
            'Content-Type' => 'application/javascript; charset=UTF-8',
        ]);
    });
});
```

```html
<script src="/dynamic/my-script.js"></script>
```

`Content-Type` を指定するために、
ヘルパー関数の `response()` が返す `ResponseFactory` の、 `view()` というメソッドを利用しています。
(参考: [Illuminate\\Contracts\\Routing\\ResponseFactory \| Laravel API](https://laravel.com/api/5.5/Illuminate/Contracts/Routing/ResponseFactory.html#method_view))

---

試したはいいけど出番は無かったです。:wink:
GPSの研究　その31

#概要

GPSを理解したかった。
Ntrip Browserで、RTK2go.comを表示してみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/0c07951e-e7a0-dffe-2da8-86bc8a7af79f.png)


以上。
vimeoコントロールなし自動再生メモ

vimeoコントロールなし自動再生メモ

script読み込み

```
<script src="https://player.vimeo.com/api/player.js"></script>
```

動画読み込みの準備

```js:js
 var player = new Vimeo.Player($('#player'), {
    id: ID,
    autopause: false,
    muted: true,
    loop: true,
    background: true
  });
```


apiで自動再生にする場合
optionsのmutedは必ず設定しないと、自動再生にならないことに注意！

ボタンの設定をしない場合はbackgroundの設定をする
こうすることで、ボタンなどの装飾がないまま、動画の制御が出来る
Julia でデータを読み書きする

# 動機

シミュレーション結果をアニメーション化するとき、結果をバッファしておかないと、

- もしアニメーション化でコケてしまったら、完全にデータが失われてしまう
- アニメーション化の前処理を変更する場合でも、改めてシミュレーションしなければいけない

そこで、（主にシーケンシャルな）データの読み書き例をまとめておきたい。

[Julia でデータのセーブとロード](http://yomichi.hateblo.jp/entry/2015/12/19/014201)

```
julia> versioninfo()

Julia Version 0.6.3
Commit d55cadc350 (2018-05-28 20:20 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Sandybridge)
  LAPACK: libopenblas64_
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, sandybridge)
```

# バイナリ

https://docs.julialang.org/en/stable/stdlib/io-network/#General-I/O-1

## Write

```julia
@time open("test.dat", "w") do file
    for i in 1:150
        write(file, rand(Float64, 360, 640))
    end
end
```

1.574172 seconds (2.08 k allocations: 263.777 MiB)

## Read

```julia
@time open("test.dat", "r") do file
    while !eof(file)
        read(file, Float64, 360, 640)
    end
end
```

0.801313 seconds (1.45 k allocations: 263.747 MiB)

## Read using Memory-mapped I/O

`Mmap.mmap` は、メモリマッピングを利用して、ファイルにリンクした値をもつ配列を作成する
https://docs.julialang.org/en/stable/stdlib/io-network/#Memory-mapped-I/O-1

```julia
@time open("test.dat", "r") do file
    A = Mmap.mmap(file, Array{Float64, 3}, (360, 640, 150))
    
    for i in 1:150
        A[:, :, i]
    end
end
```

0.916359 seconds (2.51 k allocations: 263.789 MiB)

逆順にアクセスしても、特に遅くはならなかった。

# HDF5 (JLD2)

## 説明

### HDF5 (Hierarchical Data Format)

汎用（特に科学技術計算向き？）の階層化されたファイルフォーマット。
[HDF5.jl](https://github.com/JuliaIO/HDF5.jl) は外部の HDF5 ライブラリを参照する。

[HDF5フォーマットに関するメモ書き](http://yukisakamoto.hatenablog.com/entry/20130413/1365825028)

### JLD (Julia Data format)

HDF5 の「方言」。
[JLD.jl](https://github.com/JuliaIO/JLD.jl) は HDF5.jl を参照する。

### JLD2

JLD2 は HDF5 のサブセットで構成されるフォーマット。
JLD との前方・後方互換性は意図されていない。
[JLD2.jl](https://github.com/simonster/JLD2.jl) は HDF5 ライブラリに依存しない。
JLD.jl と比べて速い（と書いてある）。

## Write

- 辞書型（キーと値のセット）のようにアクセスする
- 連番文字列でキーを生成した

```julia
using JLD2

@time jldopen("test.jld2", "w") do file
    JLD2.Group(file, "data1")
    
    for i in 1:150
        file["data1"][@sprintf("%08d", i)] = rand(Float64, 360, 640)
    end
end
```

1.675943 seconds (10.96 k allocations: 264.259 MiB)

## Read

```julia
@time jldopen("test.jld2", "r") do file
    @assert issorted(keys(file["data1"]))
    
    for i in keys(file["data1"])
        file["data1"][i]
    end
end
```

0.810206 seconds (4.60 k allocations: 263.883 MiB)

Read/Write ともに、速度はバイナリとあまり変わらない。

# 複合体の読み書き例

2020/8/9 追記

```julia
struct Hoge{T1,T2}
    a::T1
    b::T2
end

x = Hoge(3.5, true)
write("hoge.bin", Ref(x))

y = Ref{typeof(x)}()
open("hoge.bin") do f
    unsafe_read(f, y, sizeof(y))
end

y[] # Hoge{Float64,Bool}(3.5, true)
```
ExpressでServer Sent Event (SSE) を簡単に扱ってみる

# 概要
「暇だし簡単なチャットでも作ってみようかなー」と思い
車輪の再発明とわかりつつ、ライブラリっぽいものを作ってみました。

## Server Sent Event(SSE)ってなに
すごく大雑把に言うと
「コネクションを張りっぱなしにして、必要な時にメッセージ送信を行う仕組み」です。

これだけを聞くとWebSocketと一緒なのかな？と思いますが、
SSEは**サーバ → クライアント**への一方通行となっています。

クライアントはSSEのエンドポイントへ接続しレスポンスを待つのではなく、
ソケットをそのままlistenし続け、サーバサイドでなにかしらPushしたいタイミングで、
クライアント側へデータを送信し処理を行います。

とても省略しましたが、とてもシンプルな仕組みであり
、
HTTP通信に親しみのある方なら、とっつきやすいと思います。

### 参考になった記事
- https://www.webprofessional.jp/real-time-apps-websockets-server-sent-events/
- https://uhyohyo.net/javascript/13_2.html
- https://www.slideshare.net/mawarimichi/push-37869433

# 環境

型定義が大好きなので、TypeScriptを使っています

# 完成したもの
ソースコードは[こちら](https://github.com/taqm/express-sse-middleware)

完全にドキュメントが面倒になったパターンなので、
READMEなどはあとでちゃんと整備します


# 使い方
まずはインストール
`npm install express-sse-middleware`
yarn を使う場合は
`yarn add express-sse-middleware`

README通りですが一番シンプルな使い方が↓

```javascript
import express from 'express';
import { sseMiddleware } from 'express-sse-middleware';

app.use(sseMiddleware);
app.get('/path', (req, res) => {
  const sentMsg = res.sse();

  let count = 0;
  setInterval(() => {
    sentMsg(String(count++));
  }, 1000); // １秒おきに数値を送信する
});
app.listen(3000);
```

`res.sse()`の戻り値である`sentMsg`を実行するタイミングで
クライアントへと値が送信されます。

実装は60行程度なので非常にシンプルに作っています。
ぜひソースコードを見てみてください。

# demo
~~[サンプルプロジェクトのソース](https://github.com/taqm/express-sse-sample)~~
~~Herokuで実際に動かしています。~~

こちら閉鎖しました

# 感想
仕様を完全に実装できてはいませんが、簡単に作ることができました。
むしろTypeScriptでNpmモジュールを作ったのが初めてなので
そちらのほうが大変だったかも・・・

SSEに関しては、Spring5でも採用されていたり
リアクティブプログラミングと相性が良かったりするので、今後は主流の技術になるかも知れません。

ちなみに、とりあえず動かしてみたかった系の実装なので
もし危険な処理や、他にベストプラクティスがあるのであれば、ぜひ教えてください！
[Laravel5.5+Vue.js]バリデーションメッセージが取得できなくて詰みかけた話

# はじめに
Laravelでバリデーションした結果をVue.jsに引き渡したいのにエラーキャッチできてなくね？って1日ほどハマったので備忘録。

# 準備（バックエンド）
個人的にControllerクラスでやるよりRequestクラスを作ってバリデーションした方が好きなので。
ちなみに今はこんな感じでディレクトリ切ってます。

```text:directory
App
`--Http
   `--Request
      +--Hoge
      |  +--Post.php
      |  +--Put.php
      |  `--Delete.php
      `--Fuga
         +--Post.php
         +--Put.php
         `--Delete.php
```

RESTful APIに対応するためにこの構成にしてますが、個人的には割と気に入ってます。
実際はPostとPutくらいしかバリデーションしてないけど…。

Vue.jsのコンポーネントディレクトリはぐちゃぐちゃなので何かいい方法はないだろうかと思案中。

## 1.バリデーションファイルを作成する

```bash:console
php artisan make:request Hoge/Post
# スラッシュ付けるとnamespace自動で補完してくれるのでオススメ
```

## 2.バリデーションファイルの中身を編集する
ついでに日本語対応しときます。
翻訳ツール入れてもいいんだけどきめ細やかな対応するならやっぱり自前でメッセージ書かないといけないのかなぁ、と思ってます。

```diff:\App\Http\Request\Hoge\Post.php
<?php

namespace App\Http\Requests\Invitation;

use Illuminate\Foundation\Http\FormRequest;

class Post extends FormRequest
{
    public function authorize()
    {
-       return false;
+       return true;
    }


    public function rules()
    {
        return [
            'hoge' => 'required|min:10|max:20',
        ];
    }

+  public function attributes()
+   {
+       return [
+           'hoge' => 'ほげ',
+       ];
+   }

+   public function messages()
+   {
+       return [
+           'hoge.required' => ':attributeは入力必須です。',
+           'hoge.min'      => ':attributeは最低10文字以上で入力してください。',
+           'hoge.max'      => ':attributeは最高20文字までしか入力できません。',
+       ];
+   }

}
```

## 3.Controllerクラスからバリデーションするように修正する

```php:\App\Http\Controller\HogeController.php
...
public function store (\App\Http\Request\Hoge\Post $request)
{
    // バリデーション通ったあとの処理
}
...
```

## おまけ：ルーティング

```php:routes.api.php
// 特定のメソッドのみ許可
Route::resource('/hoge', 'HogeController', ['only' => ['store', 'update', 'destroy']])
// または特定のメソッドを除外
Route::resource('/hoge', 'HogeController', ['expect' => ['index', 'create', 'show', 'edit']])

/**
 * POST        : /api/hoge      => HogeController@store
 * PUT | PATCH : /api/hoge/{id} => HogeController@update
 * DELETE      : /api/hoge/{id} => HogeController@destroy
 */

```

# 実用（フロントエンド）

```vuejs:Hoge.vue
<template>
  <div>
    <input type="text" v-model="text">
    <button @click="hoge">hoge</button>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        text : null,
      }
    },
    methods : {
      hoge () {
        let url  = '/api/hoge'
        let post = { hoge: this.text }
        axios.post(url, post)
        .then(res => {
          console.log('success', res.data)
        })
        .catch(e => {
          console.log(e.response.data.errors)
          // あとはエラーメッセージを使ってトーストを出すなり何なりと
        })
      },
    },
  }
</script>
```

# まとめ
分かれば簡単なんですけど、 `e.response` に気づくまでにかなーり時間がかかってしまいました…。
これで変なことしなくてもバリデーションメッセージをフロントで流用できるやったー！
UIActivityViewControllerでリマインダーやメモを非表示にする方法

アプリでUIActivityViewControllerを使ったシェアボタン作ってて、リマインダーとメモを非表示にしようとしてハマったのでメモ。


UIActivityViewControllerではexcludedActivityTypesに不要なUIActivityTypeを指定してあげればいいんですが、 マニュアル見てもメモとリマインダーのUIActivityTypeがみつからない！

https://developer.apple.com/reference/uikit/uiactivitytype
 
いろいろ調べてみるとどうやら、UIActivityType(rawValue:String)で解決できる模様。
 
こんな感じ。

```swift
let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)

// AirDropとリマインダーとメモいらねーです
activityController.excludedActivityTypes = [
            UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"),
            UIActivityType(rawValue: "com.apple.mobilenotes.SharingExtension"),
            UIActivityType.airDrop,]
```

なんで用意されてないのかよくわかんないけど、解決できて良かった。  
 
参考
http://stackoverflow.com/questions/31792506/how-to-exclude-notes-and-reminders-apps-from-the-uiactivityviewcontroller/32719521#32719521
ajaxまとめとメモ


ajaxまとめとメモ

##jsを再読み込み
ajax内でpushstate使う場合
ページ遷移後はjsが動かないので、
インラインでscriptを書くか、jsを再読み込みさせる。

```
$.getScript('script', function(){
	読み込み後の処理
})
```

##Androidはキャシュを取ってサーバーとの通信をしない
http://qawsedrftgyhujiko.hatenablog.com/entry/2015/04/21/222124

対応
cache:false
追加してキャッシュを取らないようにする
Convolutional autoencoderのための各層の入出力次元の計算

# 背景
![conv_deconv.png](https://qiita-image-store.s3.amazonaws.com/0/148692/4771eb7f-c022-04e9-a942-528b493d91e8.png)
*図1. Convolutional Autoencoder*

たとえば、図１なようなConvolutional Autoencoderを作ろうとしたら（入力＝出力）、Conv層のパラメタなどは簡単ですが、それを適当に設定しておくと、後でDeconvのパラメタの設計がすごく困ることになる。ここでCon2d,Deconv2d, pooling, uppoolingの入力、出力次元の計算方法をまとめます。

## Note

$S_{input}$ : 層の入力次元
　　　例：(28,32)だと、$S_{input_w}$=28
　　　　　　　　　　　$S_{input_h}$=32
$S_{output}$ : 層の出力次元
　　　例：(28,32)だと、$S_{output_w}$=28
　　　　　　　　　　　$S_{output_h}$=32
$S_{filter}$ : 層のフィルタのサイズ
　　　例：(3,2)だと、$S_{filter_w}$=3
　　　　　　　　　　$S_{filter_h}$=2
$P$ : Paddingのサイズ
　　　例：(2,2)だと、$P$=2

$Stride$ : 進歩サイズ
　　　例：(1,1)だと、$Stride$=1

$Range$ : Poolingサイズ
　　　例：(2,2)だと、$Range$=2

$｢｣$: 整数以外を切り捨てる
　　　例：$｢14.9｣=14$

## Conv2dとPooling
Con2dとPoolingは同じ計算式なので一緒に書きます

### Conv2d

$$
S_{output_w} = ｢(S_{input_w}-S_{filter_w}+2*P)/Stride+1｣\\\
S_{output_h} = ｢(S_{input_h}-S_{filter_h}+2*P)/Stride+1｣
$$

### Pooling

$$
S_{output_w} = ｢(S_{input_w}-Range+2*P)/Stride+1｣\\\
S_{output_h} = ｢(S_{input_h}-Range+2*P)/Stride+1｣
$$


## Deconv2dとUppooling
Deconv2dはConv2dと逆計算だけなので

### Deconv2d

$$
S_{output_w} = ｢Stride*(S_{input_w}-1)+S_{filter_w}-2*P｣\\\
S_{output_h} = ｢Stride*(S_{input_h}-1)+S_{filter_h}-2*P｣
$$

### Uppooling

$$
S_{output_w} = ｢Stride*(S_{input_w}-1)+Range-2*P｣\\\
S_{output_h} = ｢Stride*(S_{input_h}-1)+Range-2*P｣
$$

## まとめ
変換ツールを作りましたが、計算が簡単なので必要がないでしょうね
シーンごとのrobotsの設定

毎回悩んでいるので自分の中で考えをまとめた。

## 管理画面とか、マイページ等の見せたくないページ
robots.txtでディレクトリ指定して、クローリングの拒否
なお、一度、クローリングされるとindexingされるので、メタの`robots`属性で`none`と指定し、これからはbotにindexingさせないことを通知する

```robots.txt
User-agent: *
Disallow: /mypage/
Disallow: /admin/
```

## トップや記事一覧などのページネーションが存在するページ、分割記事などのページ
[rel属性のprev/nextで制御](https://www.suzukikenichi.com/blog/google-supports-rel-next-and-rel-prev/)する
noindexとかnofollowとかcanonicalとかはつけない。

ネットでよくあるNG例でcanonicalを付与すると教える記事があるが、あまり使いたくない。
そもそも、canonicalは同一コンテンツへの参照を意味している。
1ページ目と2ページ目で違う内容であるため使いたくない。

### 検索ページ
ここは未だに悩む。おそらく下記の案のどちらかになる

### 1案
検索ページは`noindex`にする。

### 2案
検索ページは/jobs＆2ページ目移行はindexingさせるが、
クエリ条件がついた場合は`noindex`にする。
検索ページのルートはindexingさせたい。

## 参考サイト
[robots.txtの書き方（保存版）](https://www.suzukikenichi.com/blog/how-to-create-robotstxt/)
[robots metaタグ(noindex,nofollow,noarchive)の使い方](https://whitehatseo.jp/robots-meta%E3%82%BF%E3%82%B0noindexnofollownoarchive%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)
pjaxまとめとメモ


pjaxまとめとメモ


##pjaxは2種類ある
pjaxには```defunkt```と```falsandtru```の2種類ある事に注意。
それぞれ、導入方法、使い方も違う。

■defunkt
https://github.com/defunkt/jquery-pjax

■falsandtru
https://github.com/falsandtru/pjax-api

*IE未対応

詳しい違いは[こちら](https://github.com/falsandtru/pjax-api/tree/master)から
[https://github.com/falsandtru/pjax-api/tree/master](https://github.com/falsandtru/pjax-api/tree/master)


##■defunktの場合

###まずはjquery.pjax.jsをインストール

```
git clone https://github.com/defunkt/jquery-pjax.git
```
クローンしたファイル内にあるjquery.pjax.jsをhtmlファイルに読み込む

```
<script src="/js/jquery.pjax.js"></script>
<script src="/js/config.js"></script>
```

###基本の使い方

```config.js
  $.pjax({
    container : '#pjax-container', 内容を書き換える要素指定
    fragment : '#pjax-container' 取得したい要素指定
  });
```

fragmentで取得したい要素を明示的に設定をしないと、
動的に書き換えられたmetaが、body内に追加されてしまう。


###jsを再読み込み

ページ遷移後はjsが動かないので、
インラインでscriptを書くか、jsを再読み込みさせる。

```
$(document).on('pjax:complete' ,function(){
	$.getScript('script', function(){
		読み込み後の処理
	})
});
```

###meta
タイトルは動的に変更され、
その他ogp周りなどのmetaは各ページごとに設定しておけばOK

###loding処理
簡単なloding処理はイベントを使って追加出来る。
詳しいイベント一覧は[こちら](https://github.com/defunkt/jquery-pjax#events)
[https://github.com/defunkt/jquery-pjax#events](https://github.com/defunkt/jquery-pjax#events)

###ページ遷移アニメーション
ページ遷移アニメーションを追加する場合、$.pjaxでの書き換え処理のタイミングを制御する必要がある。
簡単な処理はanimateのcallbackでも良いが、複雑なアニメーション、タイミングを制御したいのでpromiseを使って制御する。
詳しいイベント一覧は[こちら](https://github.com/defunkt/jquery-pjax#events)
[https://github.com/defunkt/jquery-pjax#events](https://github.com/defunkt/jquery-pjax#events)


###ブラウザバック
ブラウザの戻る、進むボタンを使うにはリンクを絶対パスにする

###ページ遷移後の処理
ページ遷移時animationの処理をclassの付け替えで制御している場合、
遷移後に処理を削除しておくこと。
詳しいイベント一覧は[こちら](https://github.com/defunkt/jquery-pjax#events)
[https://github.com/defunkt/jquery-pjax#events](https://github.com/defunkt/jquery-pjax#events)



##■falsandtruの場合

###まずはmodulesのインストール

```
npm install pjax-api spica
```

pjax-api、spicaそれぞれのdistに入っているjsをhtmlファイルに読み込む

```
<script src="/js/pjax-api.js"></script>
<script src="/js/config.js"></script>
```

###基本の使い方

```config.js
var Pjax = require('pjax-api').Pjax;
new Pjax({
  areas: [
    // try to use the first query.
    '#header, #primary',
    // fallback, retrying with the second query.
    '#container',
    // fallback.
    'body'
  ]
});
```

###jsを再読み込み

ページ遷移後はjsが動かないので、
インラインでscriptを書くか、jsを再読み込みさせる。

```
$(document).on('pjax:ready' ,function(){
	$.getScript('script', function(){
		読み込み後の処理
	})
});
```

###meta
metaも自動的に取得してくれる。
git checkout -b で feature/ を省略する

# やりたいこと

`git checkout -b feature/spam` とするとき、毎回 `feature/` をタイピングするのが面倒なので、よしなにうまくやってくれるaliasを作成する。

```sh
# feature/spamをつくりたい

$ git checkout -b feature/spam # 毎回feature/を打つのが面倒。。

$ git alias_name spam # 引数にfeature/以下を受け取るaliasを作成したい
```

# 結果

2パターン実装してみた

## 引数にfeature/以下を受け取るパターン

```yaml:~/.gitconfig
# ~中略~
[alias]
    obf = "!f() { \
        git checkout -b feature/$1;\
         }; f"
```

![スクリーンショット 2018-06-26 18.51.30.png](https://qiita-image-store.s3.amazonaws.com/0/67790/f08e381d-2416-1618-737d-083dd78ea2cb.png)


参考: [One weird trick for powerful Git aliases | ATLASSIAN BLOG](https://www.atlassian.com/blog/git/advanced-git-aliases)

私の場合、 `checkout` のaliasを `o` としているので `checkout -b feature` で `obf` としています。
`!f()` の形式使えば何でもできそう



## `read -p` で標準入力を待ち受けるパターン

```yaml:~/.gitconfig
# ~中略~
[alias]
    obf = "!read -p 'feature/' feat; git checkout -b feature/$feat"
```

![スクリーンショット 2018-06-26 18.49.05.png](https://qiita-image-store.s3.amazonaws.com/0/67790/2afc01d4-8ba6-2b90-9bb4-3cbe66271c8c.png)


`f()` 同様に `""` で囲んで `;`で行を連続すると何でもできそう。

--- 

本当は `read -p` の値をpipeで渡したかったけど出来なかった。。

```yaml
# イメージ
obf = !read -p "feature/" | xargs -I{} git checkout -b feature/{}
```
shellに詳しい方、コメントで教えてください。
moses で phrase-table.gz が上手く生成されない時の対処法

統計的機械翻訳システム Moses を使って、英語から日本語への自動翻訳システムを作りました。翻訳文の生成には moses.ini と phrase-table.gz(圧縮ファイル) が必要なのですが、この phrase-table.gz を展開しても何も記述されておらず、翻訳も上手くいかなかった時の対処法です。

:warning: 翻訳システムの作り方自体は 以下のリンクを参考にしました。

[統計的機械翻訳システム Moses で遊ぶ](https://y-uti.hatenablog.jp/entry/2014/10/25/214843)
[Google翻訳(みたいなもの)を自作してみた。](https://qiita.com/youichiro/items/d4ae5c4e63e10cd11f95)

## 作業環境

* Linux (CentOS)
* mosesdecorder (RELEASE-4.0)
* boost_1_67_0
* giza-pp

## 原因に関連して起こる症状

① model/phrase-table.gz を展開しても何も入ってない

```shell:phrase-table.gzを解凍して先頭の10行を表示する
$ gzip -dc model/phrase-table.gz | head
$ 
```

② 翻訳システムを起動しても表示が変になる

```shell:Mosesを実行した時の表示(誤り)
$ moses -f model/moses.ini
Created input-output object : [1.562] seconds
This is a pen.
Translating: This is a pen. 
Line 0: Initialize search took 0.000 seconds total
Line 0: Collecting options took 0.000 seconds at moses/Manager.cpp Line 141
Line 0: Search took 0.000 seconds
This is a pen. 
BEST TRANSLATION: This|UNK|UNK|UNK is|UNK|UNK|UNK a|UNK|UNK|UNK pen.|UNK|UNK|UNK [1111]  [total=-426.251] core=(-400.000,-4.000,4.000,0.000,0.000,0.000,0.000,0.000,-62.102)  
Line 0: Decision rule took 0.000 seconds total
Line 0: Additional reporting took 0.000 seconds total
Line 0: Translation took 0.001 seconds total
```

##　原因

翻訳モデルの学習が Step5 で止まっている
（止まってはいるものの上手くいっているかの様に次の処理を始める）

> Training Step
1 Prepare data
2 Run GIZA
3 Align words
4 Lexical translation
**5** **Extract phrases** 　**← これ**
6 Score phrases
7 Reordering model
8 Generation model
9 Configuration file
[Moses公式サイトより](http://www.statmt.org/moses/index.php?n=Main.HomePage)

```shell
(5) extract phrases @ Tue Jun 26 17:10:00 JST 2018
   ⁝
　　 (中略)
   ⁝
sh: ~/temp/mosesdecoder/scripts/../bin/extract: No such file or directory
```

よく見てみると、Step5で mosesdecoder 以下に /bin/extract が無いと言われています。
[Moses公式のサポートページ](https://www.mail-archive.com/moses-support@mit.edu/msg15545.html)を読んでみると、 mosesdecoder/bin/extract が無い場合、mosesのコンパイルが上手くいっていない可能性があるとのこと。

```shell:extractのアドレスを探すコマンド
$ which extract
~/.local/bin/extract
```

確かに変な所にありますね…

```shell:Mosesをinstallした時のコマンド
$ git clone https://github.com/moses-smt/mosesdecoder.git
$ cd mosesdecoder
$ make -f contrib/Makefiles/install-dependencies.gmake
$ ./compile.sh [additional options]
```
私はここで、`./compile.sh` に `--prefix=$HOME/.local --install-scripts`オプションをつけてコンパイルしました。これが原因だった様です。

## 対処法

`./compile.sh`は、`--prefix=`オプションは mosesdecoder ディレクトリを直接指定する。

```shell:Mosesをinstallする正しいコマンド
$ git clone https://github.com/moses-smt/mosesdecoder.git
$ cd mosesdecoder
$ make -f contrib/Makefiles/install-dependencies.gmake
$ ./compile.sh --prefix=$HOME/.../mosesdecoder --install-scripts
```
mosesdecoder/bin/extract が出来ており、翻訳モデルも`No such file or directory`が表示されることはありませんでした。その結果、phrase-table.gz が上手く生成され、自動翻訳システムも正常に動作させることが出来ました。
Serverless Framework で deploy エラーになるときにとりあえず試すこと

# 概要
AWS マネジメントコンソールで手動で消したりすると、`sls deploy` がどうやっても失敗するようになったりする。
そんなときの対処法。

# 現象
↓のようにエラーになる。

```bash
[syumo_tokinaga:~/develop/serverless/myService]$sls deploy -v  --force
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (435 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - myServiceTokinaga-dev
CloudFormation - UPDATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - UPDATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - UPDATE_IN_PROGRESS - AWS::Lambda::Function - InvokeUnderscorehelloLambdaFunction
CloudFormation - UPDATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - UPDATE_FAILED - AWS::Lambda::Function - InvokeUnderscorehelloLambdaFunction
CloudFormation - UPDATE_FAILED - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - UPDATE_ROLLBACK_IN_PROGRESS - AWS::CloudFormation::Stack - myServiceTokinaga-dev
CloudFormation - UPDATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - UPDATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - UPDATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - UPDATE_COMPLETE - AWS::Lambda::Function - InvokeUnderscorehelloLambdaFunction
CloudFormation - UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - myServiceTokinaga-dev
CloudFormation - UPDATE_ROLLBACK_COMPLETE - AWS::CloudFormation::Stack - myServiceTokinaga-dev
Serverless: Operation failed!

  Serverless Error ---------------------------------------

  An error occurred: InvokeUnderscorehelloLambdaFunction - Function not found: arn:aws:lambda:ap-northeast-1:502624888423:function:myServiceTokinaga-dev-invoke_hello (Service: AWSLambda; Status Code: 404; Error Code: ResourceNotFoundException; Request ID: ce9cc68e-7922-11e8-a707-159aa698fc08).

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information -----------------------------
     OS:                     darwin
     Node Version:           8.11.3
     Serverless Version:     1.27.3
```

# 解決策
一旦削除して再度作成すれば良い。

```bash
$ serverless remove
$ serverless deploy
```
django rest framework : swagger

- 以下記事を試行済みの想定.
    - [django rest framework : viewset](https://qiita.com/Satoshi_Numasawa/items/53c6de8816de53e92851) 


# description
- rest framework で作成した api の一覧を自動生成する.
- swagger module を用いる

# swaggerとは
以下参照されたし
[Swaggerの概要をまとめてみた](https://qiita.com/gcyata/items/342073fa7607fd4082bd)

# 参考動画
有効化済み path 一覧が表示される
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/118627/508e4281-677d-a677-bc59-678c0d50da98.gif)



# swagger module install
```bash:shell
pip install django-rest-swagger
```

# enable swagger
```python:rest_project/settings.py
# 追記
INSTALLED_APPS = [
    ...,
    'rest_framework_swagger',
]
```


# swagger url setting

```python:api/urls.py
# 追記
from rest_framework_swagger.views import get_swagger_view
schema_view = get_swagger_view(title='API Lists')

# 配列へ追記
urlpatterns = [
    ...,
    url(r'^swagger/', schema_view), 
]
```

# open swagger page
```bash:shell
python manage.py runserver 0.0.0.0:9000
```

- open `http://localhost:9000/api/swagger/`


以上.
Podcast  に登録するための url scheme は、iOSでは、pcast ではなく podcast

# この記事が役立つ人

- Podcast を配信している
- ワンクリックで、**iPhone、iPadで** 自身のPodcastを登録させたい

# 問題

iOS の Podcast App が仕様変更されて、 `pcast://feed-url...` をクリックでPodcastを登録できたのに、**できなくなりました** 。

一方で、Macなどでは、iTunes が起動して登録することが可能です。この謎の仕様変更を調べた結果が、以下の通りです。

2018/11/13 追記:
　URLにクエリが付いていると、それを無視する可能性があるので、通常のURLで表現するようにすべきかも。


# 方法

タイトルの通りですが、 **iOS の Podcastアプリ** は、

```html
podcast://ここにfeed-url
```

とします。

ただし、Mac などは、 `podcast://...` はサポートされていません。従来通り、 `pcast://....` を使う必要があります。

そこで両方を表示するか、javascript 等で表示を切り替えるなどが必要です。


# 参考

- `pcast://` は、 **ブラウズ用** として予約されています

https://ios.gadgethacks.com/news/always-updated-list-ios-app-url-scheme-names-0184033/
<img width="755" alt="url scheme の説明" src="https://qiita-image-store.s3.amazonaws.com/0/193970/f7406046-36a1-4f22-c5ed-76b76f6f97b6.png">

- 2018/11/13 追記。便利なスクリプトを配布している人がいます
    - [Podlove Subscribe button](https://subscribe-button.podlove.org/#generator)
    - [詳細](http://blog.supertop.co/post/170848224642/a-podcast-url-scheme)
- URL Scheme の参考に
    - [Podlove subscribe buttonのソースコードの一部](https://github.com/podlove/podlove-subscribe-button/blob/master/src/coffee/clients.coffee)

# 蛇足

学習プロセスの設計（ワークショップ設計）や、教材作成をする中で、教材の配信方法を検討していました。Teachable や Udemy などがある中で、Podcastアプリを使えば「簡単に必要なもの」を揃えられると気づきました（倍速再生、オフライン再生など）。

ところが、登録が「ワンクリック」でできず、困っていたのですが、調べると解決しました。

社内専用のPodcast などを運営すると、良い知識の共有になったりすると思います。その際は、ワンクリック登録を是非！
[jOOQ] WHERE/AND/OR 句内で CASE WHEN する方法

やりたいこと（書きたいコード）を jOOQ のマニュアルをもとに、実行したい SQL から導けばいいんでしょって
思いながらやってたけど、なんだかんだで結構時間を食ってしまったので、思い出せるようにメモしておく。

## 環境
* Java 8
* jOOQ 3.9.1

## jOOQ マニュアル
https://www.jooq.org/doc/3.9/manual/sql-building/column-expressions/case-expressions/

## やりたいこと
以下のような CASE WHEN 文を jOOQ で表現すること

```sql
-- (適当な例)
-- 30歳未満の特定人物(ID)の月給をそのまま、それ以外の人は2倍にして50万円に届かなければヒット
SELECT *
FROM person
WHERE person.age < 30
AND (
  CASE
    WHEN person.id IN (100, 1000)
    THEN person.salary
    ELSE person.salary * 2
  END
) < 500000;
```

## jOOQ
こんな感じ

```java
// WHERE以前は省略
  .and(
    DSL.when(
      person.getId().in(100, 1000),
      person.getSalary()
    ).otherwise(
      person.getSalary().mul(2)
    ).lt(500000)
  )
```
AzureのApp ServiceのLinuxで対応しているプランなのに「現在のプランでサポートされていません」と表示される

AzureのPortalで、App Serviceの拡張機能を追加しようとすると、ボタンが無効な状態になっていました。
マウスでホバーすると、「この機能は現在のプランでサポートされていません」と表示されます。

しかし、プランを[確認表](https://azure.microsoft.com/ja-jp/pricing/details/app-service/plans/)すると対応しているようでした。


答えは、同じプランでApp Seriviceを`windows`で作成すれば使用可能でした。
プランではなくOSの違いだったんです。
表記の間違いかもしれませんが、わかりにくいですね。

以下の機能が、「この機能は現在のプランでサポートされていません」と表示されていました
* 認証/承認(Preview)
* Application Insights
* ネットワーク
* プッシュ
* 拡張機能
* プロセス エクスプローラー

Azureは現在も開発が行われているので、いつかlinuxも対応してくれると信じてますが、2018/06現在で開発する人は注意ですね。
three.jsのloaderをpromise.all()で管理したい

three.jsの素材を並列処理で読み込む処理を作ってみました。
promise.allで監視し、全てのロードが完了すると次へ進みます。
setting.asset.typeでthreeの各種ローダーを切り替えられるようにしてみた。

###### 参考にさせていただいたドキュメント
- [Promise loading with Three.js](https://itnext.io/promise-loading-with-three-js-78a6297652a5)
- [async/await 入門（JavaScript）](https://qiita.com/soarflat/items/1a9613e023200bbebcb3)


```javascript:script.js
{

  // 素材
  const setting = {
    asset: [
      { id: 'tex_Floor', type: 'texture', url: 'img/texture-floor.png' },
      { id: 'tex_wallpaper', type: 'texture', url: 'img/texture-wallpaper.png' }
    ]
  };

  // ロードデータを格納
  // asset.idで参照
  const asset = [];

  // ================
  // アセット読み込み
  // ================

  // arg1: src var,
  // arg2: output var
  function assetLoader(src, dist) {

    // three.js loader
    function threeLoader(asset) {
      return new Promise(resolve => {
        switch(asset.type) {
          case 'texture':
            new THREE.TextureLoader().load(asset.url, resolve);
            break;
          case 'json':
            new THREE.JSONLoader().load(asset.url, resolve);
            break;
        }
      });
    }

    // promiseAll
    (async () => {
      const promises = [];
      for(let i = 0; i < src.length; i += 1) {
        promises[i] = threeLoader(src[i]);
      }
      const result = await Promise.all(promises);

      // Promise.all完了後distへ格納
      for(let i = 0; i < src.length; i += 1) {
        const key = src[i].id;
        dist[key] = result[i];
      }
      callback();
    })();

  }
  assetLoader(setting.asset, asset);

  // ========
  // callback
  // ========

  function callback() {
    console.log(asset);
  }

}
```
Hyperledger Fabric v1.1.0およびv1.2.0環境設定 (ソースDLしない版)

# Change Log

**2018-09-29** `v1.3.0-rc1`のリリースに伴い説明変更
**2018-07-08** `v1.2.0`のリリースに伴い説明変更

# 参考文献

最新版のドキュメントはこちら。 http://hyperledger-fabric.readthedocs.io/en/latest/install.html
ただし`v1.3.0-rc1`向けに記述が変わっているので注意。`release-1.1`用のドキュメントを見ようとするとエラーになるので注意。

# bootstrap.shのダウンロード

curlで取ってこいと (`v1.3.0-rc1`の) ドキュメントに書いてあるのはこちらのファイル:

- 閲覧用 https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh
- 生 https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh

`v1.2.0`用のが欲しい場合は、こちらを取得するべし

- 閲覧用 https://github.com/hyperledger/fabric/blob/release-1.2/scripts/bootstrap.sh
- 生 https://raw.githubusercontent.com/hyperledger/fabric/release-1.2/scripts/bootstrap.sh

`v1.1.0`用のが欲しい場合は、こちらを取得するべし

- 閲覧用 https://github.com/hyperledger/fabric/blob/release-1.1/scripts/bootstrap.sh
- 生 https://raw.githubusercontent.com/hyperledger/fabric/release-1.1/scripts/bootstrap.sh

たとえばこうやって取得

```bash
curl -sSLO https://raw.githubusercontent.com/hyperledger/fabric/release-1.2/scripts/bootstrap.sh
```

注意

> いつもそうなのだが、`v1.2.0` (`v1.1.0`) 用のbootstrap.shを取ってくるときにタグ`v1.2.0` (`v1.1.0`) のリビジョンのものを使おうとすると古いので注意。つまり、タグの更新よりbootstrap.shなどのスクリプトファイルの更新のほうが後にくる。そういう場合は大抵ブランチ `release-1.2` (`release-1.1`) のHEADを取ってくると上手くいく。

# バグ修正

v1.2.0のbootstrap.shはMacOSでは?正しく動かない。

```bash
# then parse opts
while getopts "h?dsb" opt; do
  case "$opt" in
    h|\?)
      printHelp
      exit 0
    ;;
    d)  DOCKER=false
    ;;
    s)  SAMPLES=false
    ;;
    b)  BINARIES=false
    ;;
  esac
done
```

を `BINARIES=true` の直後に移動し、 `shift $((OPTIND-1))` を追加すること。 

# bootstrap.shの実行

オプションなしで実行するといろいろ動き出すため注意。

```bash
bash bootstrap.sh
```

## v1.2.0での動作

v1.2.0以降のこれは以下の動作をする:

1. fabric-samples (https://github.com/hyperledger/fabric-samples) のチェックアウト
2. Platform specific binariesのダウンロード
3. Dockerイメージのpullとlatestタグ付け

上記バグを修正した後に `-h` オプションを付けると以下のヘルプが表示される。

```text
$ ./bootstrap.sh -h
Usage: bootstrap.sh [<version>] [<ca_version>] [<thirdparty_version>][-d -s -b]

-d - bypass docker image download
-s - bypass fabric-samples repo clone
-b - bypass download of platform-specific binaries

e.g. bootstrap.sh 1.2.0 -s
would download docker images and binaries for version 1.2.0
```

上記の修正の後では `bootstrap.sh 1.2.0 -s` では動かないので `bootstrap.sh -s 1.2.0` などとすること。

## v1.2より前の動作

v1.1.0以前では以下の動作をする:

1. Platform specific binariesのダウンロード
2. Dockerイメージのpullとlatestタグ付け

なおこのスクリプトはpullしたイメージにlatestタグをつけるため、イメージの色々なバージョン (タグ) で実験したい開発者には嬉しくない。

## 参考

### Fabricのバージョン別、ダウンロードすべきdockerイメージのバージョン一覧

なお、v1.0.4以前はbootstrap.shがない。どこにこのスクリプトがあったか調査中

[^1]: fabric-peer / fabric-orderer / fabric-ccenv / fabric-javaenv (v1.1.0以前) / fabric-tools
[^2]: fabric-ca
[^3]: fabric-couchdb / fabric-kafka / fabric-zookeeper

| ↓ Fabricバージョン | Fabricイメージのタグ [^1] | Fabric CAイメージのタグ [^2]  | サードパーティ・イメージのタグ [^3] |
| ---: | ---: | ---: | ---: |
| v1.3.0-rc1 | 1.3.0-rc1 | 1.3.0-rc1 | 0.4.12 |
| v1.2.0 | 1.2.0 | 1.2.0 | 0.4.10 |
| v1.1.0 | 1.1.0 | 1.1.0 | 0.4.6 |
| v1.0.6 | 1.0.6 | 1.0.6 | 1.0.6 |
| v1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 |
Axis2 Enterprise WSDLを使って JavaからForec.comへアクセス

## nterprise WSDLを元にJavaからSalesforceへアクセスできるライブラリを作成する手順

### 1. 「開発 > API」リンクよりEnterprise WSDLをダウンロード＆enterprise.wsdlの名前で保存

### 2. wsdlファイルからJavaのクラス群を生成するためのライブラリを準備
・Apache Axis2「axis2-1.3-bin.zip」
入手先：https://archive.apache.org/dist/ws/axis2/1_3/
展開後、lib/以下すべて必要
・force-wsc-34.0.jar
入手先：http://mvnrepository.com/artifact/com.force.api/force-wsc/34.0

・js-1.7R2.jar
入手先：http://mvnrepository.com/artifact/rhino

・ST-4.0.8.jar
入手先：http://www.stringtemplate.org/download/

### 3. 上記jarファイルをダウンロード後、axis2-1.3/lib/にコピーしてコンパイル
axis2-1.3/bin/以下にenterprise.wsdlを配置してコマンドを実行
$ sh wsdl2java.sh -Eofv -g -uw -u -uri enterprise.wsdl 
＊Macの場合、環境変数が必要なのでこういうコマンドを実行
export JAVA_HOME=/usr/libexec/java_home -v 1.8

### 4. 確認
comディレクトリ以下にJavaソース・ファイルが生成される

### 5. 動作確認
Eclipseで適当なJavaプロジェクトを生成後、上記のjarファイルをすべてクラズパスに入れて次のソースで認証とSOQLの実行ができることを確認

```java
import com.sforce.soap.enterprise.LoginResult;
import com.sforce.soap.enterprise.QueryResult;
import com.sforce.soap.enterprise.SessionHeader;
import com.sforce.soap.enterprise.SforceServiceStub;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.SObject;

import org.apache.axis2.client.Options;
import org.apache.axis2.transport.http.HTTPConstants;

public class TestLogin {

    public static void main(String[] args) throws Exception {
        SforceServiceStub stub = new SforceServiceStub();
        Options options = stub._getServiceClient().getOptions();
        options.setProperty(HTTPConstants.MC_ACCEPT_GZIP, Boolean.TRUE);
        options.setProperty(HTTPConstants.MC_GZIP_REQUEST, Boolean.TRUE);

        LoginResult lr = stub.login("xxx@xxx.jp", "xxxx", null);

        SessionHeader sh = new SessionHeader();
        sh.setSessionId(lr.getSessionId());

        stub = new SforceServiceStub(lr.getServerUrl());
        options = stub._getServiceClient().getOptions();
        options.setProperty(HTTPConstants.MC_ACCEPT_GZIP, Boolean.TRUE);
        options.setProperty(HTTPConstants.MC_GZIP_REQUEST, Boolean.TRUE);

        QueryResult qr = stub.query("select Name, numberOfEmployees, Id, Industry from Account", sh, null, null, null);

        System.out.println("Query has " + qr.getSize() + " records total");

        SObject[] sObjects = qr.getRecords();

        for (int i = 0; i < sObjects.length; i++) {
            Account sObject = (Account) sObjects[i];
            System.out.println(i + "\t: [" + sObject.getId() + "][" +
                sObject.getName() + "]");
        }
    }
}
```
CentOSでyumを使えない時の対処法+ネットワーク設定

#前説
お久しぶりです

#環境
- CentOS7
- Virtualbox

#CentOSでこんなエラーを吐いたことはありませんか？

```
#yum update
　Couldn't resolve host 'mirrorlist.centos.org'
```

勘のいいかたはお気づきかと思いますが、resolve => つまり解決できていない => 「名前を」
つまりDNS関連のエラーかと思われます。

重要になってくるのがいくつかの設定ファイルを弄ることです。
その設定ファイルをいくつか紹介します。

- /etc/sysconfig/network-scripts/ifcfg-????
- /etc/resolv.conf
- /etc/yum.repos.d/CentOS-Baserepo

以上3つの設定ファイルを注意深く見ていくといいかと思われます。

##/etc/sysconfig/network-scripts/ifcfg-????
1つ目の設定ファイルはネットワーク設定を手動でできます。(設定 -> ネットワーク)
私の場合、VirtualBoxのネットワーク設定において、ホストとゲストをNAT(IPを1:1で割り当て)を指定しています。

```:/etc/sysconfig/network-scripts/ifcfg-????
#念のためIPv6をOFF
IPV6INIT=no
#起動時にネットワーク設定をON
ONBOOT=yes

#DNSを設定
DNS1=8.8.8.8
DNS2=8.8.4.4
```

```:Terminal
# service network restart
```

ここで起動時のネットワーク有効化をONにしてないと、デフォルト状態、コマンドなしでは外部と接続できない？
ちなみに魔の数字8.8.8.8と8.8.4.4とは何かと言うとGoogle Public DNSのIPです。
別にISPのでもいいのですが、特にこれといって理由はないです。


##/etc/resolv.conf
2つ目の設定ファイルはDNSに関連する設定ファイルです。
次にDNSを設定しておきます。

```:/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
```

##/etc/yum.repos.d/CentOS-Baserepo
3つ目はyumコマンドでどのミラーサイトにアクセスするのか指定できます。
変更するときはバックアップを取るべきですが、やってしまった方は[こちら](https://gist.github.com/khayama/1f0359556ff93b7ccb39fcc22b973257)

参考は以下
https://every-rating.com/vps/yum-update-cannot-find-a-valid-baseurl-for-repo-base.html

ミラーサイトを変更してみるのもいいかもしれません。

1、2の策で解決していないという方は、3つめ
#GUIできない問題
神
https://blog.amedama.jp/entry/2015/09/01/232339

#参考
http://d.hatena.ne.jp/bojovs/20081020/1224429418
https://daichan.club/linux/96
How to Run Docker MSSQL 2017 Image in Ubuntu 18.04 LTS?

# 1. Run docker command.
```
$ sudo docker run -e 'ACCEPT_EULA=Y' /
                  -e 'MSSQL_SA_PASSWORD=XXXX' /
                  -p 1433:1433 /
                  --name mssql /
                  -d microsoft/mssql-server-linux:2017-latest

MSSQL_SA_PASSWORD=XXXX, XXXX is your database password.

Unable to find image 'microsoft/mssql-server-linux:2017-latest' locally
2017-latest: Pulling from microsoft/mssql-server-linux
f6fa9a861b90: Pull complete 
da7318603015: Pull complete 
6a8bd10c9278: Pull complete 
d5a40291440f: Pull complete 
bbdd8a83c0f1: Pull complete 
3a52205d40a6: Pull complete 
6192691706e8: Pull complete 
1a658a9035fb: Pull complete 
655776156720: Pull complete 
0c695ca332a2: Pull complete 
Digest: sha256:09a9386e0484667b0490069bc854dcd72c2e1a85d342d1d798aced91f5e1aa81
Status: Downloaded newer image for microsoft/mssql-server-linux:2017-latest
61c211c3264d0f8e4b9d65af83702a8532245ff35641b724a72d5b9054f7a7a4
```
# 2. Check docker status
```
$ sudo docker ps -a

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
61c211c3264d        microsoft/mssql-server-linux:2017-latest   "/opt/mssql/bin/sqls…"   3 hours ago         Up About an hour    0.0.0.0:1433->1433/tcp   mssql
```

https://hub.docker.com/r/microsoft/mssql-server-linux/
https://segmentfault.com/a/1190000011653540
https://dotblogs.com.tw/swater111/2017/01/16/183653
https://docs.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-docker?view=sql-server-linux-2017
How to Install Docker in Ubuntu 18.04 LTS?

# 1. Uninstall old versions
```
$ sudo apt-get remove docker docker-engine docker.io
```

# 2. Install using the repository
```
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

# 3. Install Docker
```
$ sudo apt-get update
$ sudo apt-cache policy docker-ce
$ sudo apt-get install docker-ce
```

# 4. Check docker running status
```
$ sudo systemctl status docker

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-06-26 15:48:43 CST; 1h 12min ago
     Docs: https://docs.docker.com
 Main PID: 2074 (dockerd)
    Tasks: 48
   CGroup: /system.slice/docker.service
           ├─2074 /usr/bin/dockerd -H fd://
           ├─2147 docker-containerd --config /var/run/docker/containerd/containerd.toml
           ├─5520 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 1433 -container-ip 172.17.0.2 -container-port 1433
           ├─5527 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/61c211c3264d0f8e4b9d65
           ├─5543 /opt/mssql/bin/sqlservr
           └─5608 /opt/mssql/bin/sqlservr
```

https://docs.docker.com/install/linux/docker-ce/ubuntu/
DataTablesのヘッダずれの解消方法の１案

# この記事について
DataTablesのテーブルヘッダの位置ずれを解消する方法の１つを書きますね。

あなたの問題を解決できるかはわからないけれど、
この方法ではうまくいかない！と知ることも、解決への糸口の１つです。

# DataTablesとは
DataTablesってイイ感じですよね！
jQueryでTABLEを書くときに、とても役に立つプラグインです。

- 気に入っている特徴

|特徴|Note|
---|---
|列の表示/非表示できる|`colvis`を有効にする|
|csvとして保存できる|不具合あっても、Excelでなんとかできるし(涙)|
|Searchつかえる|できるやつは "絞り込み" を使いこなす|

とくに列の表示/非表示できるJavaScriptライブラリが見つかりませんでした。

# 課題
さて、今回話題にしている ヘッダずれ (header misalignment)がどんなものかといいますと、
下記の画像です。

どうでしょうか？

![table_misalignment_00.png](https://qiita-image-store.s3.amazonaws.com/0/56003/4ea03cb5-5915-cdb6-0ba7-951139f91333.png)

ヘッダとデータ列の位置がズレていることで、
全然使えないというわけじゃないけど、ストレスをパネェという感じですね。

# 期待値
下記のようになってほしいのです。

どうでしょうか？

![table_misalignment_01.png](https://qiita-image-store.s3.amazonaws.com/0/56003/9e1432d5-66c9-fe42-82bb-c4bc20d3af7c.png)

そろってる！！

# 解決方法
- CSSを調整
  - ChromeのdebuggerでCSSをじっくりみてみたところ、`margin:auto`しようとしておかしなことになっていました。
  - 今回はちょっとこの機能にお休みしてもらいます。

```css

    <style type="text/css">
        table.dataTable {
            /* Fix misalignment header */
            margin: unset;
        }
    </style>
```

- DataTablesの設定
    - 設定によっては、DataTablesのCSSの挙動や設定値が異なるようになるのではないかと想像します。

```JavaScript
        $(document).ready(function () {
            // DataTable config
            var config_datatable = {
                dom: "Bfrtip",
                buttons: [
                    {
                        extend: "colvis",
                        text: "Hidden Columns"
                    },
                    {
                        extend: "csv",
                        text: "Save as CSV",
                        filename: "compare_" + moment().format("MMMM-Do-YYYY_hh-mm-ss")
                    }
                ],
                stateSave: true,
                // scrollY: "50vh",
                scrollX: true,
                "autoWidth": true,
                paging: false,
                "order": []
            };

            $("#TABLEのID").DataTable(config_datatable);
```

# おわりに
**これで解決！**するほど、なんていうか世の中は甘くないと思うので、
下記が参考になれば、さいわいです。**答えを知るよりも、解き方を学んでいきたい**

# 行ったデバッグ方法
- まずは、あなたのHTMLの不要箇所を消したり、テーブルサイズを小さくしたものを用意します。
    - ブラウザのリロードが早くなる、デバッガでみるときのプロパティが少なくて済むなど、問題個所を特定しやすくなります。
    - 重たいHTMLのままダラダラとデバッグを続けるのは、あなたの時間がもったいないです。準備にちゃんと時間を使いましょうね！
- Chromeデバッガで、CSSの値や設定を変えてみます
    - 思い通りに動かせる(コントローラブルな)部分と、もう手のほどこしようがない箇所を切り分けます。
- 組み合わせ問題かもしれないので、少しでも改善方向に向かったパラメータをメモって表にします。
    - 不具合解決に時間がかかった場合でも、作業報告に、少なくとも行き当たりばったりではなかった。と書けます。
NSUnderlineStyleでUILabelに下線を引いた結果まとめ

# 概要
NSUnderlineStyleを使ってUILabelに下線を引いた結果の表示内容がどこにもまとまってなかったので、軽くまとめてみました。
雑なサンプルですが何かの役にたてば。

# 検証コード
```swift
override func viewDidLoad() {
    super.viewDidLoad()

    let single = NSUnderlineStyle.styleSingle.rawValue
    let thick = NSUnderlineStyle.styleThick.rawValue
    let double = NSUnderlineStyle.styleDouble.rawValue

    let dot = NSUnderlineStyle.patternDot.rawValue
    let dash = NSUnderlineStyle.patternDash.rawValue
    let dashDot = NSUnderlineStyle.patternDashDot.rawValue
    let dashDotDot = NSUnderlineStyle.patternDashDotDot.rawValue

    let word = NSUnderlineStyle.byWord.rawValue

    addUnderLine(label: singleDot, setValue: single | dot)
    addUnderLine(label: singleDash, setValue: single | dash)
    addUnderLine(label: singleDashDot, setValue: single | dashDot)
    addUnderLine(label: singleDashDotDot, setValue: single | dashDotDot)

    addUnderLine(label: thickDot, setValue: thick | dot)
    addUnderLine(label: thickDash, setValue: thick | dash)
    addUnderLine(label: thickDashDot, setValue: thick | dashDot)
    addUnderLine(label: thickDashDotDot, setValue: thick | dashDotDot)

    addUnderLine(label: doubleDot, setValue: double | dot)
    addUnderLine(label: doubleDash, setValue: double | dash)
    addUnderLine(label: doubleDashDot, setValue: double | dashDot)
    addUnderLine(label: doubleDashDotDot, setValue: double | dashDotDot)

    addUnderLine(label: byWord, setValue: thick | word)
}

private func addUnderLine(label: UILabel, setValue: Int) {
    let attributeText = NSMutableAttributedString(string: label.text!)
    attributeText.addAttribute(.underlineStyle, value: setValue, range: NSMakeRange(0, label.text!.count))
    label.attributedText = attributeText
}
```

# 結果
<img width="375" alt="NSUnderlineStyle_sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/165931/f0fa11fb-fa45-8e3a-8877-c3b73068ad0d.png">


# 補足(環境)
- Xcode9.4
- iPhone X
- System Font 17

# 感想
基本的には想定通りの下線付与結果になったが結構文字と近い状態で線が引かれてしまうので、1dotのviewなどを使って擬似的に自分で線を引いた方が良いかもしれません。
byWordに関しては、スペース部分を無視してくれるという特性は自分で実装すると少し面倒なので役に立ちそうです。
input type="date"非対応ブラウザで、日付チェック

input type="date"で不正な日付(2018-02-29とか)を入力した時に対応していないブラウザでもエラーチェックを行う方法メモ
（IEはともかく、Safari最新版が非対応なのは意外。）
#結論

```html
<input type="date" id="date">
```

```javascript
// フォームの入力値を取得
var dVal = document.getElementById("date").value;
// Dateオブジェクトを作成する。
var date = new Date(dVal);
// Dateオブジェクトにキャスト出来てなければInvalid Dateというオブジェクトが格納されているので、そのチェック
if (date.toString() === "Invalid Date") {
    alert('NG...');
    return;
}
// フォームに入力された年と月を取得する
var ymdArray = dVal.split(dVal.toString().indexOf("/") !== -1 ? "/" : "-");
var y = parseInt(ymdArray[0]);
var m = parseInt(ymdArray[1]);

// 年月が変わっていれば不正と判定
if (y === date.getFullYear() && m === date.getMonth() + 1) {
    alert('OK!');
} else {
    alert('NG...');
}
```

#解説
"2018/01/32"と入力された時、 new Date("2018/01/32")した結果は2018/02/01となる。
なので、入力された月とDateオブジェクトから取得した月が違えば、不正な日付だと判定できる。
ただし、Date.getMonth()は0～11の値を返すため、+1しないとダメ。

[参考にしたページはこちら](https://parashuto.com/rriver/development/validate-date-using-vanilla-js)

但し、上記サイトのように月だけで判定してしまうと2018/02/366とかでもOKになってしまうので、年でも比較する必要がある。
Tkinterで強制終了するときの対処法

pythonでTkinterをつかってGUIを作成しているときにプログラム内にバグがあって、

```
_tkinter.TclError: bad option "configureafter#746": must be cget or configure
```

こんな感じのエラーで強制終了されることがたまにあります。これを強制終了しないようにするには```try```文でエラー処理をすれば解決できそうです。

```python

try:
  (処理)
except _tkinter.TclError:
  pass
```
Retrofit2でExpected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $エラー

#背景
Retrofit2 + gsonでQiita API v2の投稿記事一覧の取得を試したときに
```
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
```
というエラーが出た。
調べてみたら、ピンポイントな解決法がなかなか見つからなかったので備忘録

#原因
エラーに出てる通り、ArrayからはじまるjsonをObjectから受け取ろうとしていた。

```json:.json
[
    {
        "rendered_body": "...",
        "body": "...",
        ...以下略
    },
    {
        "rendered_body": ">\n",
        "body": "_！\n",
        ...以下略
    }
    ...以下略
]
```

```kotlin:ApiService.kt
@GET("/api/v2/items")
fun getItems(): Call<ItemsResponse>
```

```kotlin:ItemsResponse.kt
data class ItemsResponse(

        @SerializedName("rendered_body")
        val renderedBody: String,

        @SerializedName("body")
        val body: String,
//...以下略
)
```
#解決

```kotlin:ApiService.kt
@GET("/api/v2/items")
fun getItems(): Call<Array<ItemsResponse>>
```



#参考
http://square.github.io/retrofit/
https://qiita.com/api/v2/docs
https://stackoverflow.com/questions/26472529/expected-begin-object-but-was-begin-array-at-line-1-column-2-path
Apex MetaData APIを利用して静的リソースを保存・削除

Apex Wrapper Salesforce Metadata APIから
MetadataService等のクラスを持ってくる
https://github.com/financialforcedev/apex-mdapi

削除

```java
String fileName = 'fileName';
MetadataService.MetadataPort service = MetadataServiceExamples.createService();
List dresults = service.deleteMetadata('StaticResource', new String[] { fileName });
```

新規生成

```java
try {
    MetadataService.MetadataPort service = 
    MetadataServiceExamples.createService();	
    List dresults = service.deleteMetadata('StaticResource', new String[] { fileName });

    MetadataService.StaticResource staticResource = new MetadataService.StaticResource();
    staticResource.fullName = fileName;
    staticResource.contentType = 'application/pdf';
    staticResource.cacheControl = 'public';
    staticResource.content = EncodingUtil.base64Encode(bl);
    List results = service.createMetadata(
    new MetadataService.Metadata[] { staticResource });

} catch (Exception ex) {
    //エラー
    System.debug('[Create error] : ' + ex.getMessage());
} 
```
How to Install dbeaver in Ubuntu 18.04 LTS?

# 1. Download
```
# cd ~/Downloads
# wget https://dbeaver.io/files/dbeaver-ce-latest-linux.gtk.x86_64.tar.gz
```

# 2. Unzip
```
# cd ~/Downloads
# tar zxvf dbeaver-ce-latest-linux.gtk.x86_64.tar.gz
```

# 3. Launch and Test SQL Connection
```
# ./dbeaver/dbeaver
```
![DBeaver 5.1.1 _006.png](https://qiita-image-store.s3.amazonaws.com/0/150367/c2717e8a-6631-8d80-8758-da17f230288f.png)

Select MSSQL Server (You can use other SQL server.)
![Create new connection _007.png](https://qiita-image-store.s3.amazonaws.com/0/150367/f55d71c6-a597-5077-d64c-cb7f66671981.png)

Enter Account and Password
![Create new connection _008.png](https://qiita-image-store.s3.amazonaws.com/0/150367/b9fa68a9-3dc2-28cf-d712-e4aed12cc94f.png)

Test 
![Success _009.png](https://qiita-image-store.s3.amazonaws.com/0/150367/6e289949-71e1-a08d-5e10-4a8c012fea1a.png)


https://dbeaver.io/