OmniAICreator/Qiita-1.07M huggingface dataset:
Scala で empty な Seq に tail すると実行時例外になる

```scala
scala> Seq(1, 2, 3).tail
res5: Seq[Int] = List(2, 3)

scala> Seq.empty[Int].tail
java.lang.UnsupportedOperationException: tail of empty list
  at scala.collection.immutable.Nil$.tail(List.scala:433)
  at scala.collection.immutable.Nil$.tail(List.scala:428)
  ... 40 elided
```

[WartRemover](https://github.com/wartremover/wartremover) で `tail -> drop(1)` に変えろと言われるのはこういうことらしい。

- こういうメジャーどころのメソッドで実行時例外が起きて
- 代替手段が `drop(1)` みたいなブサイクなやつ

だと、なんか萎えるなぁという気持ち。

ちなみに Haskell も標準の List に単純に tail すると `Exception` を吐く。
関数型界隈で `tail` といえばこの動作なんだろうか??

```
Prelude> tail []
*** Exception: Prelude.tail: empty list
```
Laravel 5.7 + vue 2.5.3 で画面が真っ白になる

## before

```
Vue.use(VueRouter)
const router = new VueRouter({
    mode: 'history',
    routes: [
        { path: '/', component: require('./components/Hoge.vue') },
    ]
})
```


## after


```
const router = new VueRouter({
    mode: 'history',
    routes: [
        { path: '/', component: require('./components/Hoge.vue').default },
    ]
}))
```


## 参考

[[Vue warn]: Failed to mount component: template or render function not defined in Webpack 4](https://stackoverflow.com/questions/49138501/vue-warn-failed-to-mount-component-template-or-render-function-not-defined-i)
Raspi2にAlexa Voice Service(AVS)を 〜カメラで撮影編〜

# はじめに
2019年年始の（勝手にやってる)宿題の一貫でRaspiにAVSを入れるってのをやってみることにしました。
前回はRaspiにAVSをインストールするところまでやりました。
今回は、カメラで撮影するスキルを今後作ろうとしますので、まずはカメラで撮影できる状態にしていきます。

# 参考サイト
http://blog.livedoor.jp/sce_info3-craft/archives/9268330.html

# 前提条件
Raspberry Pi 2 modelB
macOS High Sierra バージョン10.13.6
microSD 16GB
Rasbian Stretch with desktop
WiFiに接続済み
iBUFFALO BSW20KM11

# OpenCVのインストール
最初にOpenCVをインストールします。

``` 
$ sudo apt-get install apt-get install python-opencv
```

# 写真撮影用プログラム
参考サイトをそのまま利用させていただきました。
ファイル名を「take_a_photo.py」にします。

```python
# OpenCVをインポート
import cv2
# カメラデバイスを取得
c = cv2.VideoCapture(0)
# readで画像をキャプチャ、imgにRGBのデータが入ってくる
r, img = c.read()
# 保存
cv2.imwrite('photo.jpg', img)
```

# 写真の撮影

ここまで用意できたので、写真の撮影を行います。

```bash
$ python take_a_photo.py
```

するとこんな感じで撮影できました。
![photo.jpg](https://qiita-image-store.s3.amazonaws.com/0/105220/e80d08a0-0772-28cc-382f-e37d49d635e8.jpeg)

# さいごに
Raspiで写真撮影するための準備はすごく簡単にできてよかったです。
この後、仕組みを考えて写真撮影してみていきます。

# 関連記事
[Raspi2にAlexa Voice Service(AVS)を 〜AVS設定編〜](https://qiita.com/areaz_/items/60cbdf8059881ee33ec3)
[Raspi2にAlexa Voice Service(AVS)を 〜Raspi2にRaspbianをインストール編〜](https://qiita.com/areaz_/items/6fc869cd2bf1ea1549c4)
[Raspi2にAlexa Voice Service(AVS)を 〜Raspi2にAlexa Voice Service(AVS)をインストール編〜](https://qiita.com/areaz_/items/8e949d45f8afe73dbc76)
Nuxt.js + Netlify で最初のデプロイで失敗した時の対処法

# 経緯
Nuxt.js で最初のプロジェクトを作成したので、 GitHub の master にコミットしたあと Netlify でサイトをデプロイしようとしたが失敗した。

## エラーメッセージ
```
4:00:42 PM: Build ready to start
(中略)
4:01:10 PM: Error running command: Build script returned non-zero exit code: 127
4:01:10 PM: Failing build: Failed to build site
4:01:10 PM: failed during stage 'building site': Build script returned non-zero exit code: 127
4:01:10 PM: Finished processing build request in 27.298334629s
```

## Deploy settings
|#|#|
|:---|:---|
|Repository|github.com/<自分のリポジトリ>|
|Base directory|Not set|
|Build command|yarn generate|
|Publish directory|dist|
|Deploy log visibility|Logs are public|

# 解決法
Build command を `yarn generate` から **`nuxt generate`** に変更した。

```
4:14:07 PM: Build script success
4:14:07 PM: Starting to deploy site from 'dist'
4:14:08 PM: Starting post processing
4:14:08 PM: Post processing done
4:14:09 PM: Site is live
4:14:17 PM: Finished processing build request in 55.758796579s
```

ポートフォリオサイトを構築する記事でよく yarn generate でデプロイする方法が書かれていますが、うまく行かない人は `nuxt generate` に変えて試してみましょう。
ZOZO大忘年会の FireBase で大規模アンケート！ 費用2円だった話を5分でまとめたい記事。

ZOZO大忘年会の FireBase で大規模アンケート！ 費用2円だった話を5分でまとめたい記事。

# Ref

[ZOZO大忘年会でFirebaseを使った1,000人規模のリアルタイムアンケートを費用2円で制作した話 - Qiita](https://qiita.com/tomohito_takahashi/items/fea4a931ad1734585d1c)

# どんな記事？

# ZOZOの大忘年会でアンケートを取った

記事名のとおり。

# Webブラウザから投票する形式だったっぽい

![image](https://user-images.githubusercontent.com/13635059/51070556-956eb500-1686-11e9-8143-d3d155d1bf54.png)

# 選定した技術

>データ管理：Firebase
>フロントエンド：Vue.js
>結果のアニメーション：TweenMax

# なぜ2円だったか

意図したわけではないが2円だったらしい。

>Firebaseのプランですが、今回1,000人規模かつ初の試みということもあり、従量課金Blazeプランにしました。
>イベント終了後、請求金額を見てみると…。
>2円
>なんと2円でした！　笑

# FireBase のプラン 従量課金制

>今回は1,000人規模のユーザーがリアルタイムで操作するということだったので、念のため従量課金のBlazeプランに設定しました。

[Firebase](https://firebase.google.com/pricing/?hl=ja)

![image](https://user-images.githubusercontent.com/13635059/51070588-ee3e4d80-1686-11e9-975e-11bec6ae3976.png)

1000人のアンケートデータ保存ぐらいでは、びくともしなかったのかなと思った。

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues


https://github.com/YumaInaura/YumaInaura/issues/339








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
paizaでよく使うメソッド

【paizaで使ったメソッドとか】

```
map,
select,
each_char,
each, 
while,
break,
return,
until, 
push,
unshift, 
配列、
[],
sum, 
max, 
min, 
split, 
join, 
$stdin.readlines
Include?  
&&, 
|| , 
if文, 
delete_at 
case 
caseの中にif文、
reject!, 
select,
length, 
gsub!
insert,
chop,
swap,
round,
floor
```

とかそれくらい。
あとはデータ型を揃えたり(to_i, to_s)、半角をなくしたり（strip）
Karabiner-Elements Tips

# 問題
- Karabiner-Elementsを使って、JISキーボード（RealForce）の無変換キー、変換キー、カナキーをMacの英数キー、かなキーにアサインしても動作しない。（入力ソースが切り換わらない）
- それ以外のKarabiner-Elementsによるキーアサインはすべて正常に機能する。

# 解決
- ATOKを使っていたために起こっていた問題だった。（下記の通りATOKそのもののせいではない）
- 「キーボード」環境設定で「入力ソース」に『日本語』を入れておけば設定通り動作する。
    - 入力ソースを「U.S.」と「ATOK」だけにすると、Karabiner-Elementsで設定した変換キー、カナキーが効かなくなる。別のキーを変換キー、カナキーに割り当ててもやはり動作しない。

# メモ
- 深く探索したわけではないので、本当の原因が他にあるかもしれない。
- このように動作する原因は不明。
- macOSの日本語IMとATOKの切り替えは「コマンド＋スペース」などでやるしかない。
- Complex Modificationsを使って解決可能かもしれないが、試していない。
OSXでPDFから濁点付きのひらがなを普通にコピーする

Mac OSXでは，PDFから濁音付きの日本語をコピーしてどこかに貼り付けようとすると，変な感じになります。
<img width="653" alt="スクリーンショット 2019-01-12 15.29.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/192970/dc8b5b86-034f-8192-b1af-714890f997af.png">
これは，OSXでは平仮名の濁音を「◯＋゛」の「２字」（結合文字列）で表現しようとする傾向があるため，なんじゃないかと思っています。
　参考文献→[文字コード地獄秘話 第2話：聖母マリアよ、二人を何故別々に？ - ALBERT Engineer Blog](http://tech.albert2005.co.jp/blog/2014/10/23/mco-combining/)

もっとも，JavaScriptではこうした結合文字列を等価性に基づく合成済み文字（例：て＋゛→で）に正規化する`String.normalize(form)`が実装されています。
"て゛".normalize("NFC") という感じにすれば「で」になります。（「という感じ」というのは，この例は結合文字列ではなく単なる２文字なので，コピペしても動かない故。）
　参考文献→[String.prototype.normalize() - MDN web docs]([https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)

そんでもって，Macでクリップボードやシステムサービス的なものを操作しようと思ったら，古くからAppleScriptが使われていたのですが，最近はJavaScriptを使うこともできます。
つまり，JavaScriptの標準機能を使って，OSから容易に呼び出せる，結合文字列をどうにかするサービスを作ることができます。たとえばAutomator+JavaScriptで「クイックアクション」の「サービス」にしてシステム環境設定でキーボードショートカットを割り当てるとこんな感じに。
![スクリーンショット 2019-01-12 15.47.42.png](https://qiita-image-store.s3.amazonaws.com/0/192970/84bceb8b-cb56-f785-8f6e-cecea890a5d1.png)
#たとえばこんなコード
![スクリーンショット 2019-01-12 15.51.48.png](https://qiita-image-store.s3.amazonaws.com/0/192970/18433c63-aa3a-9d69-0d30-565ab00c3039.png)
Automatorで【新規作成→クイックアクション】。
JavaScriptを実行→クリップボードにコピー。
JavaScriptの内容はこんな感じ。

```javascript
function run(input, parameters) {	
	// Your script goes here
	return input.toString().normalize("NFC");
}
```

#おまけ：クリップボード内を操作する。
上記はAutomatorのワークフローとして作りましたが，たとえばクリップボード内に置いたまま操作することも考えられます。
私の場合，他にも，半角を全角にしたりとか（裁判所への提出文書は全角にする慣行なので…）その他諸々の処理を加えたいので，こんな感じのスクリプトを作っています。

```javascript:法曹用正規化コピー.scpt
var app = Application.currentApplication();
app.includeStandardAdditions = true;

var cb = app.theClipboard();

cb = cb.split("\r").join("\n"); // \rを普通の改行に
cb = cb.normalize("NFC"); //合成文字を単文字化
cb = cb.replace(/[^\x01-\x7E] [^\x01-\x7E]/g, function(s) { //全角文字間の半角スペース削除
	return s.split(" ").join("");
});
cb = cb.replace(" ","　"); //残った半角スペースを全角化
cb = cb.replace(/[A-Za-z0-9\(\)]/g, function(s) { //半角文字を全角化
    return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
});

app.setTheClipboardTo(cb);
```
使い方：PDF等から任意の文字列をコピーし，上記スクリプトを実行してから貼り付ける。

AppleScript的な感じでJavaScriptでクリップボードを扱う場合，まずStandardAdditionsを呼び出せるようにする必要がある点に注意。
　参考文献→[JavaScriptによるMacの自動操作入門の情報まとめ - 大石製作ブログ](https://blog.s0014.com/posts/2016-08-04-osxjs1/)
スクリプトエディタ.appで上記スクリプトを作って，スクリプトメニューから使用。
　→インストール方法委細 [AppleScript ことはじめ - Script Factory](http://www.script-factory.net/monologue/AppleScriptIntroduction/index.xhtml)

~~これでてきとーな判決文からコピペして裁判所提出文書作成が容易に！~~
JSONとJSオブジェクトの違い


#JSオブジェクト

##### キーをダブル、シングルコーテーションで囲っても囲わなくても良い & 文字列をダブル、シングルクォーテーションで囲む。(数字型の場合は囲わなくてOK)

    { 
        jsonId: 0,
        jsonName: "namename", ←末尾のカンマは使用できる。
    }



#JSON

##### キーをダブルクオーテーションで囲む & 文字列をダブルクォーテーションで囲む。 (数字型の場合は囲わなくてOK) 

    { 
        "jsonId": 0,
        "jsonName": "namename" ←末尾のカンマは使用できない。
    }

※JSONでは undefined が使えない。
PHPのDIコンテナを作った話

DIというか Auto Wiring Container って書いたけど。
https://github.com/nishimura/simple-container


今まで何度かフレームワークを作っていて、その全てで必須だった機能だけ抜き出した感じなので作ったというか削ってまとめたというか。

使い方

```bash
composer require nish/simple-container
```

```php
<?php
use Nish\Container\Container;
require_once 'vendor/autoload.php';
$c = Container::getInstance();
```

パッケージにしてるけど200行のソース1ファイル。
各フレームワークのコンポーネントやDI単体のパッケージがいくつもあることは知っているけれど、使わない機能のために何十ファイルとか何千行とかのプログラムを入れるのは好きじゃないので、ファイルを一つ置けば使えるレベルのものにした。

コンストラクタインジェクション。よくあるやつ。

```php
// auto wiring
class Foo
{
    private $obj;
    public function __construct(stdClass $obj)
    {
        $this->obj = $obj;
    }
}

$c = Container::getInstance();
$foo = $c->get(Foo::class);
```

あらかじめ登録する場合と、ファクトリー的なやつ。

```php
interface Uri {}
class MyUri implements Uri {}

$c->set(Uri::class, new MyUri);
$uri = $c->get(Uri::class);
// こちらはsingleton

// こちらは毎回newする
$c->setFactory(Uri::class, function($c){
    return new MyUri();
});

// 自分でnewしつつsingletonにしたい場合
$c->setFactory(Uri::class, function($c){
    $myUri = new MyUri();
    $c->set(Uri::class, $myUri);
    return $myUri;
});
```


あとはauto wiringしつつメソッドを実行する機能も個人的には必須だったので。

```php
// メソッド実行
$c->call(Foo::class, 'staticMethod');
$foo = new Foo();
$c->call($foo, 'method');
```

こういうものと、それから型で一意に特定できない場合の対応

```php
// 引数名によるインジェクション
namespace MyProject;
class Db {
    private $dsn;
    public function __construct(string $dsn){
        $this->dsn = $dsn;
    }
    // ...
}
$c->set('MyProject\\Db#__construct.dsn', 'mysql://dbname...');
$db = $c->get(MyProject\\Db::class);
```

引数の名前でインジェクションする機能も使う。urlのidを取得して担当クラスのメソッドを呼び出す、みたいなことを自動でするときに使う。



ここまで来れば、あとは [FastRoute](https://github.com/nikic/FastRoute) などを使って

```php
class MyUserAction
{
    public static function index(Db $db, MyForm $myForm, $userId)
    {
        // ここがアプリの処理
    }
}

// ルーティング設定ファイル的な
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/user/{userId:\d+}', ['myuser.html', MyUserAction::class, 'index']);
});


// ここからフレームワーク的な処理
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];

$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        // ... 404 Not Found
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        // ... 405 Method Not Allowed
        break;
    case FastRoute\Dispatcher::FOUND:
        [$template, $cls, $method] = $routeInfo[1];
        $vars = $routeInfo[2];
        $result = $c->call($cls, $method, $vars);
        break;
}

$te = new TemplateEngine();
$te->output($template, $result);
```

フロントコントローラーからアクションを呼び出してテンプレートエンジンに渡すというよくある処理がすぐできる。



この辺の処理は [12年ぐらい前](https://n314.hatenablog.com/entry/20070128/1169999488) にやっていて、[多機能を求めたり](https://n314.hatenablog.com/entry/20130416/1366113782) シンプルを求めたり行ったり来たりしている。
アノテーションで色んなことをする版は、composer update でアノテーション解析が究極に遅くなったのでその次から止めた。


最近はとにかくシンプルにしたくてクラスじゃなくて関数にしたいんだけど、autoloadが働かないから仕方なくstaticメソッドにしている。
Oracleのアーカイブログが一杯になり(ORA-00257)、再起動したら初期化中のエラー(ORA-01033)で起動できなくなった

# 前提

* 利用しているバージョンは10g
* 開発でOracleを利用しているが、テーブルの追加更新削除くらいしかしたことがない


# 状況

Windowsアプリを動かしていたら、アーカイブがいっぱいであることを示す
ORA-00257が発生し、再起動をかけたら初期化中のエラーが出て
アプリが起動しなくなった際の対象の備忘録です。

## アーカイブログを消してみる

アーカイブログ出力先を調べる
[アーカイブログ出力先を変更する方法](http://database090212.com/oracle/manage3_6.html)


OS認証で管理者ユーザのsysへログイン
sqlplus /nolog
SQL > connect sys/[password] as sysdba
SQL> archive log list
  (略)
  アーカイブ先 /Pass
  (略)

~~WindowsのGUIから手動で削除。(手動で消すと良くないかもしれません)~~

2019/01/15
復旧出来ていなかったのでRMANのコマンド
delete archivelog until 200;
を実行してOracle側から削除しました。
そうしないとOracle側で削除を認識できず予期せぬバグや復旧出来ない可能性があります。


手動で消して(OSコマンドで消して)しまった場合は下記の対処が必要

[アーカイブファイルをOSコマンドで削除したらRMANのcrosscheckで整合性確認が必要](http://it-memo.info/?p=1390)


## ORACLEを再起動する

ORA-01033が解消しないので、ORACLEの再起動を試みる
[Oracle インスタンスの起動と停止](https://www.shift-the-oracle.com/config/startup-oracle)

管理者でログインし下記コマンドを実行
startup

無事に起動し、DBに接続できる事を確認。


実際には、mountが上手くできなかったり、shutdownの際にエラーが起きたりしましたが根気強くshutdownと起動を繰り返してたら上手くいきました。(謎)
nomountから順を追って起動しようとしたら上手くいかなかったので、startupで全部自動に行った方がいいのですかね？


復旧に1hくらいかかってしまいました。。。



仮想環境に開発用のORACLEを入れて利用していたものなので、最悪壊れたらやり直せるなあという感じで進めましたので下記の手順でアーカイブログの削除は行った方がいいかもしれません(試してませんが調べてる時に出てきたもの)
[アーカイブログの削除方法まとめ（ORA-00257対処方法）](https://www.ashisuto.co.jp/db_blog/article/201803-archive-delete.html)



以上です。
[メモ]svgをuseタグで表示させる際に自動的に幅が300px、高さが150pxになる。

ブラウザが勝手に決めるらしい。
デフォルトの幅が300pxで高さが150px。
なので、widthとheightを指定する必要がある。

https://stackoverflow.com/questions/29512253/svg-symbols-and-use
MacBookAir 2018に買い替えたら、iPhoneが充電できない！ USB type-c から lightning に充電するにはApple公式ケーブル or アダプタを買えば良い。

MacBookAir 2018に買い替えたら、iPhoneが充電できない！ USB type-c から lightning に充電するにはApple公式ケーブル or アダプタを買えば良い。

# MacBookをiPhoneの「巨大なモバイルバッテリー」替わりに使えなくなった

悲しい。

# 結論から書く

Apple 公式の変換アダプタかケーブルを買えば良さそう。

# ケーブル

lightningだけで良い場合はこれが良いかな。

[USB-C - Lightningケーブル（1 m） - Apple（日本）](https://www.apple.com/jp/shop/product/MQGJ2FE/A/usb-c-lightning%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB1-m)

![image](https://user-images.githubusercontent.com/13635059/51070292-2727f380-1682-11e9-8748-44222fb7c513.png)

# アダプタ

3in1タイプとか、好きなケーブルを使いたい場合はこちらが良いかも。

[USB-C - USBアダプタ - Apple（日本）](https://www.apple.com/jp/shop/product/MJ1M2AM/A/usb-c-to-usb%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF)

![image](https://user-images.githubusercontent.com/13635059/51070253-9fda8000-1681-11e9-81e2-e69cde57a71b.png)


# type-c と usb-c の違いって何？

どうやら同じ意味らしい。

USB Type-C という正式名称っぽい。なるほど。

>USB Type-C (USB-C) という規格を初めて知った方向けに、概要やメリットをざっくり解説してみます。

[USB Type-C (USB-C) の規格をざっくり解説](https://hanpenblog.com/66/)

# 経緯

今までMacBook2015 をiPhone用の巨大モバイルバッテリーとして使っていたが、2018ではそれができないことに気づいた。

ドンキホーテにどうせ売ってるだろ！と思ったけど、何も見つからなかった。

世の中にはあまり出回っていない充電方式なのだろうか。まだtype-cは過渡期なのかもしれないな。


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/337








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CookieManagerの実装について


# はじめに

とある事情でAndroidのCookieManagerクラス以下の実装がどうなっているか調べました。

特に見たかったのは以下の2つです。

・CookieManagerって、そもそもスレッドセーフ？
・WebViewでのCookieのパースってどうなっているの？

# コード

まずは
[CookieManager](http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/webkit/CookieManager.java)
↓
詳細は不明ですがデバッガで調べるとCookieManagerは抽象クラスで、実際の実装は[Chromium](https://www.chromium.org/)にAwCookieManagerというクラスとして存在します
↓
[AwCookieManager](https://github.com/crosswalk-project/chromium-crosswalk/blob/master/android_webview/java/src/org/chromium/android_webview/AwCookieManager.java)
↓
AwCookieManagerはネイティブの実装がありC++で実装されています。
↓
[cookie_manager](https://github.com/chromium/chromium/blob/master/android_webview/browser/cookie_manager.cc)

ととここまで来て、CookieManagerがスレッドセーフかどうか調べました。

クッキーの保存

```c++

static void JNI_AwCookieManager_SetCookieSync(
    JNIEnv* env,
    const JavaParamRef<jobject>& obj,
    const JavaParamRef<jstring>& url,
    const JavaParamRef<jstring>& value) {
  GURL host(ConvertJavaStringToUTF16(env, url));
  std::string cookie_value(ConvertJavaStringToUTF8(env, value));

  CookieManager::GetInstance()->SetCookieSync(host, cookie_value);
}
	
```

次に最後に呼び出されているSetCookieSyncメソッドの実装

```c++
 void CookieManager::SetCookieSync(const GURL& host, 
                               const std::string& cookie_value) {   
ExecCookieTaskSync(base::BindOnce(&CookieManager::SetCookieHelper,                                     base::Unretained(this), host,                                 cookie_value)); 
} 
```

とこんな感じでCookieManagerは~~スレッドセーフ~~（多分IPC)であることがわかりました。
いろんなスレッドから同時に呼び出しても安心ですね。

# 捕捉：WebViewでのCookieのパース

WebView(Chrome)でCookieがどう扱われているか調べました。以下の通り、CanonicalCookieというクラスがCookieを扱っているようです。RFC2965の仕様に準拠しているようですね。

[canonical_cookie.cc](https://github.com/chromium/chromium/blob/5d80e3087f51f96491f2a53df786447aa6458287/net/cookies/canonical_cookie.cc)

# 追記
Chromeが標準で入っていない古いAndroidだと独自の実装をしているかもしれません。
Call to undefined function imagettftext() が解消しない時にはPHPのインストール先を疑う

## PHPにモジュールを追加インストールしたい

OS X El Capitan には最初から入ってるPHPだとモジュールが少し足りない。ということで、brewで追加モジュールをインストールする。

例えば以下のQ&Aのように、brewでインストールしなさいとある。
http://stackoverflow.com/questions/26493762/yosemite-el-capitan-php-gd-mcrypt-installation

ところが、コマンドラインからPHPのCLI版を実行しても、imagettftext は見つからない。これって単独のモジュールじゃなくて、GDの中の機能の一部だから、GDのバージョンかなにかかと思って、他にも、足りないはずのmcryptもbrewから入れてみたが入らない。

おかしいなー、怖いな怖いなーと思って、iniファイル上の、``extention=mcrpypt.so`` がコメントアウトでもされてるのかと思って、``/etc/php.ini`` を見ても、.soがロードされている気配もなく、.dllのコメントばかり。

よくよく、brewのインストール後のコメントをみたら。

```
To finish installing mcrypt for PHP 5.5:
  * /usr/local/etc/php/5.5/conf.d/ext-mcrypt.ini was created,
```
？？ちょっとまてと。そっか、/etc/配下ではなく、/usr/local配下のPHPに入ってる。じゃぁ、それってPHP自体も想定とは違うかも。

と思って探すと。``/usr/bin/php`` と　``/usr/local/bin/php`` の両方に入っていました。デフォルトは、``/usr/bin/php`` を参照しちゃうので、 ``/usr/local/bin/ `` を先に探すように、.bash_profileの最終行に以下を追加。

```
export PATH=/usr/local/bin:$PATH
```

これで、brewで入れたPHPがターミナルから参照されてめでたしめでたし。

brewがあまりに便利なので、うっかりOSXの標準機能のように思いがちだけど、デフォルトで入ってるPHPとは別のパスにbrewからはインストールされるのだから、そっちを参照しないと意味ないよねって話です。
ポーリングのススメ


## RPCってあるよね

RPCという言葉がある。リモートプロシージャコールの略。平たく言えば、別のマシンの関数を呼び出す。
もっと平たく言えば、別サーバのプログラム呼び出し。

かっこいいのはいっぱいある。

- XML-RCP
- GRPC
- SOAP

そんなところ。特にHTTPを通じて呼び出すには、WebAPIなんて言い方もしている。時間のかかる処理をRPCで呼び出す時にはいろいろ大変。いい案を考えよう。

## 第一の案：REST-API

一番シンプルな案が、REST-API。一般的な動的なWebスクリプトって、クライアントがブラウザで、サーバのプログラムを起動してその結果を受け取ってる。それってもうRPCだよねという話。人がみるんじゃんなくて、プログラムがクライアントにあっても全然構わない。まずはREST-APIが一番だ。

ただ、REST-APIはWebアーキテクチャなので、基本は1秒以内に情報が帰ってくることが大前提。ブラウザにしてもプログラムの中から呼び出すHTTPクライアントにしてもタイムアウトが存在する。レスポンスに10秒以上かかるWebはHTTPにあらず。

## 第二の案：REST-API＋コールバック

時間のかかる処理があったとして、リクエストを投げて処理を依頼するのは、一瞬で終わる。その際に「処理が終わったらこのURLに結果を返してね」とお願いだけする。電話で折り返しをお願いするようなもの。この場合は、HTTP通信のタイムアウトなんて気にしないでいい。

ただ、デメリットがある。ちょっとした処理を依頼するだけの側にも、Webサーバーが必要になる。そんなもん立てるのは簡単だけど、セキュリティのことを考えると、開いているポートは最小限にしたい。あと、コールバックって「コールバックさえ失敗している」ときってすごく把握がしにくい。お互いにサーバーとして通信するのでテストも「せーの」でテストしないといけない。

## 第三の案：ポーリング

サーバに依頼をする。その際にJOBのIDを受け取る。クライアントはそのJOBのIDをキーに、定期的にサーバに処理が終わったかどうかを問い合わせる。
何度もサーバに問い合わせをしなくちゃいけないというところがダサいのだが、ダサさに目をつむればすごくシンプルだ。

ポーリーングそのものは、REST-APIでよくて、JOBの登録のAPIとJOBの結果受け取りAPIの2つを作るだけ。

## ポーリングの究極：S3を使ったポーリング

どうせポーリングでいいなら、処理を依頼する側も処理をする側も両方S3を見ちゃえばいい。
どっちも定点監視しなくちゃいけないんだけど、「外部からの通信を許可しない環境でも使える」というのがメリット。

S3の料金が気になるところだけど、自前で構築する手間を考えるとめちゃくちゃ安い。大半のコストは通信ボリュームに依存するので、「ファイルが存在するかどうかをチェックする」というだけの処理は安い。019-01-12の東京リージョンの価格で、GETリクエスト 1,000 件あたり 0.00037USDという価格なので、めちゃくちゃ安い。

もちろんS3でなくてもいいんだけど、S3が大企業の情シスが許容している数少ないクラウドストレージ。

### 監視ってcronとか設定しなくちゃいけないんでしょ？面倒じゃないの？

1秒に一回とかみるのなら、プログラムで無限ループで監視すればいい。
Bash 5.0の新機能：namerefの挙動の変更

Bash 5.0では、namerefの名前解決で非互換の挙動があると言われています。

[リリースアナウンス](http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00063.html)では次のように書かれています。

> There are a few incompatible changes between bash-4.4 and bash-5.0. The
> changes to how nameref variables are resolved means that some uses of
> namerefs will behave differently, though I have tried to minimize the
> compatibility issues.

[「bash 5.0のNEWSファイル私訳」](https://qiita.com/emasaka/items/47eaa5fb5a01572fcc17)にも次のようにあります。

> i. 関数内でnamerefの名前解決のループは、グローバルスコープでの名前の変数
>    に解決されるようになりました。

そもそもnamerefを知らないと変更点もわからないので、順に説明します。

## おさらい①：namerefって？

namarefはBash 4.3から導入された機能です。ksh由来のようで、AIXのマニュアルでは「名前参照」と、Solarisのマニュアルでは「nameref」と表記されているようです。

namerefは、ほかの変数を参照する変数を作る機能です。変数のエイリアス（別名）を付けるときなどに使います。

namerefは`declare -n`や`local -n`など、変数宣言のときに`-n`オプションを指定して作ります。namerefな変数に、ほかの変数名を文字列として代入すると、エイリアスのように動きます。

```console:
$ aaa=3                 # 変数aaaに3を代入
$ declare -n bbb        # namerefな変数bbbを宣言
$ bbb=aaa               # bbbに'aaa'を代入（$aaaではない）
$ echo $bbb             # bbbの内容は？
3
```

## おさらい②：namerefの使い道

namerefの使い道として自分が考えたのが、関数から関数に値を渡すときに、変数名を渡す方法です。

たとえば、関数から関数に配列を渡すときには、引数や標準入力ではそのままでは渡せません。そこでダイナミックスコープを使って渡す方法があります。

```bash:
foo() {
  local ary=('a b' c d)         # 配列変数aryを宣言
  bar
}

bar() {
  echo ${ary[0]}                # fooで宣言された配列変数aryを参照
}

foo                             # 「a b」と表示される
```

ただbarから暗黙的に変数aryを参照するのがいまいちです。そこで、namerefを使って変数名を渡すことで、barではfooで宣言された変数名の知識が不要になります。

```bash:
foo() {
  local ary=('a b' c d)
  bar ary               # “ary”という変数名を文字列で引数に
}

bar() {
  local -n var=$1       # nameref変数varに1つめの引数の文字列（変数名）を代入
  echo ${var[0]}
}

foo                      # 「a b」と表示される
```

## namerefの挙動の違い

さて、Bash 5.0で挙動が変わったのはどのあたりでしょうか。

「関数内でのnamerefの名前解決のループ（A nameref name resolution loop in a function）」ということなので、namerefで循環参照を作ってみます。

```bash:
aaa=7                           # グローバル変数aaa

foo() {
  local -n aaa                  # ローカルなnameref変数aaa
  aaa=aaa                       # aaaからaaa自身を参照
  echo $aaa
}

foo
```

これをBash 4.4で実行すると、循環参照の警告が表示されたあと、`echo $aaa`では何も表示されません。

```
$ bash ./n.sh
./n.sh: line 6: warning: aaa: circular name reference

```

Bash 5.0で実行すると、循環参照の警告が表示されたあと、`echo $aaa`でグローバル変数aaaの値である「7」が表示されます。

```
$ ./bash ./n.sh
./n.sh: line 6: warning: aaa: circular name reference
7
```

## 結論

そもそも、Bashでnamerefをそれほど使うとは思わないし、その中でも特殊なケースなので、非互換による影響はほとんどないのではないでしょうか。
JQueryのAjaxの例文

# [jQuery.ajax()](http://api.jquery.com/jquery.ajax/)

JQuery3でAjaxを使う際にたまに見るけど毎回使いやすい例文が無いのでメモ

```js
$.ajax({
        url: url,
        type: 'POST',
        data: {
            param: $('#param').val()
        },
        headers: {
            'X-Custom-Header': '独自のヘッダ'
        },
        dataType: 'json',
        timeout: 5000
    })
    .done(function(response, textStatus, jqXHR) {
        // success
    })
    .fail(function(jqXHR, textStatus, errorThrown) {
        // error
        var response = JSON.parse(jqXHR.responseText);
        if (jqXHR.status === 404) {
            // 404
        }
        if (jqXHR.status === 0) {
            // timeout
        }
    })
    .always(function() {
        // always
    });
```

```js
contentType: 'application/json',
```

を設定すると`payload`になるので`PHP`は`$_POST`だと取れなくなります。

https://httpstat.us/

を使って動作確認すると良いかも
開発環境構築 Rails Docker Rspec

#  開発環境構築 Rails Docker Rspec



Dockerfileを用意する。



railsプロジェクトを作成。ドットの意味→app/以下
 既存ファイルを上書きするオプション→gemfilegemfilelockを上書きして作成するために必要。

```
docker-compose run web rails new . --force --database=mysql
```

gemfileの内容をコンテナ内に取り込む。

```
docker-compose build
```



```ruby:config/database/yml
password: password
host: db
```



２つのコンテナの起動

```
docker-compose up -d
```

開発環境用のDBの作成

```
docker-compose run web bundle exec rails db:create
実行結果
Starting docker-files22_db_1 ... done
Created database 'app_development'
Created database 'app_test'
```





## Rspecの導入

### Gemfileの導入

```ruby:Gemfile
group :development, :test do
gem 'rspec-rails'
'
'
'
end
```

### Rspecの設定

Rspecをインストール->execだめだった・・・なんでrun？コンテナ起動してるはずなのに

```
docker-compose run web bundle exec rails g rspec:install
```

Gemfileがimageされたコンテナを作成する。

```
docker-compose build
```

rspecの設定ファイルを生成するrakeタスクを実行します。

```
docker-compose run web bundle exec rails g rspec:install
```

Rspecの出力形式をドキュメント形式に変更して読みやすくする。

```ruby:.rspec
--format documentation
```

コンテナを立ち上げ直す。

```
docker-compose up -d
```

specを実行しよう。

```
docker-compose exec web bundle exec rpsec
```
日付の計算で迷惑な仕様と出くわしてハマった件（犯人は YYYY）

有効期限などを計算する際に現在日時の１年後を計算することがよくあると思います。

その際の計算方法としてNSCalendarのdateByAddingComponentsを使用すればよいと思っていましたが、場合によって計算がうまくいかない場合がありました。

```objc
    NSDateComponents* com = [NSDateComponents new];
    [com setYear:2018];
    [com setMonth:12];
    [com setDay:29];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate* baseDay = [calendar dateFromComponents:com];
    NSDateComponents *date= [[NSDateComponents alloc] init];
    date.year= 1;
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    [fmt setCalendar:calendar];
    [fmt setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
    fmt.timeZone = [NSTimeZone systemTimeZone];
    fmt.dateFormat = @"YYYY/MM/dd";
    NSDate *expireDate = [calendar dateByAddingComponents:date toDate:baseDay options:0];
    NSSTring *strExpireDate = [NSString stringWithFormat:@"%@",[fmt stringFromDate:expireDate]];

```
↑の実装であればstrExpireDateは2019/12/29になってほしいところですが、実際は2020/12/29になります。

# 犯人は「YYYY」
いろいろ試して特定の年月日でずれることがわかったので、きっと計算の仕方でなにか書き方が間違っているはずと試して、いろいろな方が書いてある方法を試しているうちにふと気づきました。
「YYYY?あれここって大文字だっけ？」
調べてみるとNSDateFormatter.dateFormatにおける「年」において
「YYYY」「yyyy」はそれぞれ定義されており、結論としてはここを修正することでうまくいきました。

```objc
    NSDateComponents* com = [NSDateComponents new];
    [com setYear:2018];
    [com setMonth:12];
    [com setDay:29];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate* baseDay = [calendar dateFromComponents:com];
    NSDateComponents *date= [[NSDateComponents alloc] init];
    date.year= 1;
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    [fmt setCalendar:calendar];
    [fmt setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
    fmt.timeZone = [NSTimeZone systemTimeZone];
    fmt.dateFormat = @"yyyy/MM/dd"; //←ここを修正
    NSDate *expireDate = [calendar dateByAddingComponents:date toDate:baseDay options:0];
    NSSTring *strExpireDate = [NSString stringWithFormat:@"%@",[fmt stringFromDate:expireDate]];

```

もともとはterataiｌにも質問しましたが、結局自己解決してしまったので一応元ネタとしてリンクを貼ります。

元記事
https://teratail.com/questions/168328
参考
http://d.hatena.ne.jp/nakamura001/20150102/1420213850
AWSでSSHでインスタンスに接続できなくなった

#参考にしたサイト
[【AWS EC2 エラー】ssh port 22 Operation timed out]
(https://qiita.com/yokoto/items/338bd80262d9eefb152e)

#つまづいた点
どうやら、セキュリティーグループの設定でマイIPを設定が再度必要の様子。

#接続方法

①セキュリティーグループでマイIPを再度設定

②インスタンスをSTOP→START

③更新されたpublic IPでssh接続する

で無事SSH接続できました。

毎日、セキュリティーグループの設定とパブリックIPを変えないといけないといけないですね、、、
Oracle Linux 7.6に Ruby on Railsをセットアップする

検証目的でrailsをOCI (Oracle Cloud Infrastructure)上のOracle Linux 7.6に入れる作業があったので、メモを残しておきます。目新しいものは無い個人用スニペットです。

##　rbenvのインストール

```
sudo yum -y install git
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

一旦抜けて、入り直しましょう。

```
exit
ssh opc@aaa.bbb.ccc.ddd
```

## rubyと関連ライブラリのインストール
```
rbenv install -l
sudo yum install -y gcc openssl-devel readline-devel zlib-devel sqlite-devel nodejs

rbenv install 2.6.0
ruby -v
rbenv global 2.6.0
```

## railsのインストールと起動

```
gem install rails
rails new blog
cd blog
rails start &
curl http://localhost:3000
```

MySQL as a service はよ(熱望)
OracleのSQLで便利だと思った9の機能

自社開発のWebエンジニアに転職して、MySQLをメインで使うようになり、
OracleのSQLで便利だと思った機能をまとめてみました。(一部、MySQLでも使える機能もあり)

#01 Any述語で複数式指定
条件式でのOrは、括弧の付け忘れによるバグを誘発しますが、
Any述語やIn述語は、Orを使うのを防いでくれます。

```sql
with t(Col1,Col2,Col3) as (select 1,2,3 from dual)
select count(*) as Cnt from t
 where 2 < Any(Col1,Col2,Col3);

| Cnt |
|-----|
|   1 |
```

#02 All述語で複数式指定
```sql
with t(Col1,Col2,Col3) as (select 1,2,3 from dual)
select count(*) as Cnt from t
 where 0 = All(Col1,Col2,Col3);

| Cnt |
|-----|
|   0 |
```

#03 リスト形式での比較
数学のベクトルの比較と似ていて、
ExcelからDelete文を作りたい時などに使えます。

```sql
with t(Col1,Col2,Col3) as (select 1,2,3 from dual)
select count(*) as Cnt from t
 where (Col1,Col2,Col3) = ((1,2,3));

| Cnt |
|-----|
|   1 |
```

値を縦に揃えた、Delete文が書けます。

```sql
delete from テーブル名 where (Col1,Col2,Col3)
                           =((   1,   2,   3));
```

#04 マルチカラムIn述語
##select文を指定
```sql
with t(Col1,Col2,Col3) as (select 2,3,4 from dual)
select count(*) as Cnt from t
 where (Col1,Col2,Col3) in(select 2,3,4 from dual);

| Cnt |
|-----|
|   1 |
```

##複数式を指定
```sql
with t(Col1,Col2,Col3) as (select 2,3,4 from dual)
select count(*) as Cnt from t
 where (Col1,Col2,Col3) in((1,2,3),
                           (4,5,6),
                           (7,8,9));

| Cnt |
|-----|
|   0 |
```

値を縦に揃えた、Delete文(複数行指定)が書けます。

```sql
delete from テーブル名 where (Col1,Col2,Col3)
                          in((   1,   2,   3),
                             (   4,   5,   6),
                             (   7,   8,   9));
```

#05 dateリテラル
to_date関数のショートカット構文として使えます。

```sql
select dump(date '2019-01-01') as Exp1,
       dump(to_date('2019-01-01','yyyy-mm-dd')) as Exp2
  from dual;

|                            Exp1 |                            Exp2 |
|---------------------------------|---------------------------------|
| Typ=13 Len=8: 227,7,1,1,0,0,0,0 | Typ=13 Len=8: 227,7,1,1,0,0,0,0 |
```

#06 TimeStampリテラル
to_TimeStamp関数のショートカット構文として使えます。

```sql
select TimeStamp '2019-01-01 13:30:01' as Exp1,
       to_TimeStamp('2019-01-02 13:30:01','yyyy-mm-dd hh24:mi:ss') as Exp2
  from dual;

|                  Exp1 |                  Exp2 |
|-----------------------|-----------------------|
| 2019-01-01 13:30:01.0 | 2019-01-02 13:30:01.0 |
```

#07 sys.odciシリーズ
さくっとデータを作りたいときに使えます。

##sys.odciNumberList
```sql
select * from table(sys.odciNumberList(1,2,3));

| COLUMN_VALUE |
|--------------|
|            1 |
|            2 |
|            3 |
```

##sys.odciVarchar2List
```sql
select * from table(sys.odciVarchar2List('A','B','C'));

| COLUMN_VALUE |
|--------------|
|            A |
|            B |
|            C |
```

##sys.odciDateList
```sql
select * from table(sys.odciDateList(date '2019-01-01',date '2019-02-02',date '2019-03-03'));

|         COLUMN_VALUE |
|----------------------|
| 2019-01-01T00:00:00Z |
| 2019-02-02T00:00:00Z |
| 2019-03-03T00:00:00Z |
```

#08 フラッシュバック問合せ
誰かが誤ってテーブルデータをDeleteした時の復旧とか
データ調査で使えます。

経験上
デフォルトのUndoログの設定だと2日前ぐらいのデータまで参照できます。
(金曜のデータを土日をはさんだ月曜に参照しようとしても、ほぼ無理)

```sql
-- 2019年01月02日の13時30分01秒のデータをSelectしたい場合
select * from テーブル名 as of TimeStamp TimeStamp '2019-01-02 13:30:01';
```

#09 無名PL/SQLブロック
テストデータをさくっと作りたいときに使えます。
MySQLに、この機能はなくプロシージャを定義しないとダメのようです。
Chromebookを買うとついてくる無償枠100GBのグーグルドライブをCLIから使う。

#序

Chromebookは、グーグルドライブ無償枠100GB(２年分)がついてくる。
Chromebookは、基本的に本体のディスク容量が少ないわけで、Dropboxのような使い方でローカルとクラウドとを同期して使うといった使い方にはあまり向かない。

そこで、いい感じでCLIからグーグルドライブにアクセスできるGoベースのツールskickaをChromebookに入れて、CLIからファイルサーバ的にグーグルドライブにアクセスできるようにしておく。以下に、Chromebookの開発者モード(DEV)前提の手順を簡単に書いておく。

なお、Goが動く環境であれば、クラウド上のサーバーなどからも同様の手順でグーグルドライブを扱えるようになる。
Chromebookで使わないとしても自前サーバでクローリングや機械学習した際の結果をとりあえずの置き場にグーグルドライブを使う、といった使い方もできるだろう。

cf.[LinuxのターミナルのみでGoogleDriveにアクセスする方法](https://amitica.net/archives/799)


#1) Goをインストール
はじめにGoをインストールしておく。crew(Chromebrew)を使う場合は以下の通り。
crew install go

#2) skickaをビルド

go get github.com/google/skicka
go build github.com/google/skicka

#3) 起動設定
ビルドしたツールを実行可能にするためのマウント設定が必要になる（Chromebookのセキュリティ制限を外すため）。その上でツールにパスを通す。
echo 'sudo mount -i -o remount,exec /home/chronos/user/' >> .bashrc
echo 'export PATH=$PATH:/home/chronos/user/go/bin' >> .bashrc

#4) 初期化とグーグルドライブとの接続
はじめにツールの初期化を行う。
skicka init
次いで、ブラウザなし指定でGoogleへの認証を行う（一回のみ必要）。
skicka -no-browser-auth  df

二年間無償枠を取っている場合、空き容量が例えば115GBといった具合に表示されるはずだ。

#5) 主要コマンド

普通にLinuxでフォルダを作る感覚でグーグルドライブにフォルダを追加できる。
> skicka mkdir backup/chromebook

フォルダへのファイルのアップロードはuploadコマンドで行う。アップロード時のレスポンスは丁寧でいい感じ

```
$ skicka upload .bashrc /backup/chromebook
Files:  1.15 KiB / 1.15 KiB [===========================================================================================================================================================================] 100.00% 2s
2019/01/12 14:00:42 Preparation time 2s, sync time 2s
2019/01/12 14:00:42 Updated 1 Drive files, 0 local files
2019/01/12 14:00:42 1.15 kiB read from disk, 0 B written to disk
2019/01/12 14:00:42 1.15 kiB uploaded (459 B/s), 0 B downloaded (0 B/s)
2019/01/12 14:00:42 2.49 MiB peak memory used
```
テキストファイルの場合、catして中身を確認できる。

> skicka cat /backup/chromebook/.bashrc

その他、ファイルの概要を確認したり、パイプと組み合わせてファイル数を数えたりなどなど、割と違和感は少ない。

```
$ skicka ls -l /backup/chromebook/
-rw-r--r--    1.15 kiB  Sat Jan 12 12:40:03 2019  .bashrc
chronos@localhost ~ $ skicka ls /backup/chromebook/ | wc -l
1
```

グーグル謹製のツールで、ルートディレクトリのフォルダは消去できないなど、安全面への配慮もある。
グーグルドライブはこういうものだと割り切れば、けっこうありな使い方な気がしている。
slackのユーザー名がどこにあるのかわかりづらかったのでまとめてみた

slackのユーザー名の確認方法がわかりづらいのでまとめてみました。**表示名とユーザー名は違うので注意**。

## 1.「プロフィール&アカウント」をクリック
![38700.jpg](https://qiita-image-store.s3.amazonaws.com/0/334968/9dba7a8a-5ac8-e3ba-ef5e-d6c1323e5105.jpeg)


そうすると画面右側に自分のプロフィール情報が表示されると思います。

## 2. 「・・・(その他)」をクリックして「アカウント設定を開く」をクリック
![38701.jpg](https://qiita-image-store.s3.amazonaws.com/0/334968/c55d7e31-0dbd-00c0-e97d-ba1c24f4102a.jpeg)
![38702.jpg](https://qiita-image-store.s3.amazonaws.com/0/334968/48b8db77-92fb-890f-3ba0-cde155b84491.jpeg)





## 新しいタブでページが表示されます。

![38703_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/334968/a0d68fea-56ec-2fc6-c041-ab0afff2a546.jpeg)


このページで各種設定が可能です。

**このページの一番下**にユーザー名の項目があるので「開く」をクリックするとユーザー名が確認できます。

![38704.jpg](https://qiita-image-store.s3.amazonaws.com/0/334968/349fec4f-d3aa-5441-dae6-56d411a7324b.jpeg)


## 感想

API接続でslackのユーザー名が必要だったのですが表示名と混同して非常にわかりづらかったです。調べてもすぐにわからず、確認するのに少し時間がかかったのでまとめてみました。
Mac使いがWindows PCを買ったときの初期設定（備忘録）

５年ぶりにWindowsのパソコンを購入したMac使いが、Windowsの操作感をMacに寄せようとしたときの備忘録です。
いつまでもWindows使いづらいからMacのほうが良いなんて言ってちゃいけない。

# Google IMEのインストール

Macでも使っているからという理由でIMEを [Google IME](https://www.google.co.jp/ime/) に変更します。

# キーボード設定の変更

現在使っているのはPCに付属している一般的なキーボードでCommandも英数・かなキーもありません。
完璧を目指すならMagic Keyboardを買うのが手っ取り早いですが、キー配置を変更することで不便さはかなり解消できました。

## 変換・無変換を英数・かなキーへ割当

Google IMEのプロパティを開いてキー設定の変更から編集をクリックします。

キー設定のうち、入力キーが`Muhenkan`に`IMEを無効化`を、`Henkan`に`IMEを有効化`を割り当てます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127934/abad9273-a1c7-d3c8-6bab-d90c7783d7c0.png)

これで、Macの日本語配列のようにスペースの左側のキーで英数入力、右側のキーでかな入力に切り替えることができるようになりました。

## メタ系キーの配置切り替え

CommandキーやOptionキーなどメタ系のキーを入れ替えます。

まず、キー配置をカスタマイズできる [SeySwap for XP](https://www.vector.co.jp/soft/winnt/util/se228667.html) をダウンロードします。
インストールは必要ありません。

ダウンロードしたZipに含まれるKeySwap.exeを**管理者権限で**実行してください。

KeySwapが起動したら、以下のようにキー設定を変更してください。

それぞれ、セルをフォーカスしてキーを押すとそのキーを設定することができます。
（Caps Lockは必要に応じてWinキーなりCtrlキーなりに設定してください）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127934/3a2da1c9-a46d-1ccb-b9ae-3010a43b62b5.png)

諸々設定が終わったら、左上の**終了**をクリックして設定を保存します。

以上で、Windowsのキー配列を（多少）Macに近づけることができました。

# Spotlight

個人的にSpotlightなりAlfredのようなアプリは必須です。

ここでは [Hain](https://github.com/hainproject/hain) をインストールしました。
[GitHubのリリース](https://github.com/hainproject/hain/releases) から**Latest Release**のバージョンをダウンロードしインストールしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127934/cd5cab5b-49e1-2fe4-aea8-1dcb8d7d189c.png)

Hainの機能については [窓の杜さんのレビュー記事](https://forest.watch.impress.co.jp/docs/review/759307.html) が詳しいです。

## ショートカットの変更

Hainを表示するショートカットはデフォルトで `Alt+Space` となっています。
一つ前のセクションでキーボード配置を変更した場合はここを `Ctrl+Space` に変更しましょう。

Hainで `/hain` と入力して **Open Preferences** から設定を開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127934/df65f02f-7983-a7e6-f9ad-a6e9df223cc3.png)

設定のうち、 **Open-Close Toggle Shortcut** の設定を `ctrl+space` に変更します。
設定ウィンドウを閉じると設定が反映されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127934/bcf59aac-0b44-32f3-78aa-995f80497051.png)

# Mission Control

Macでは欠かせないMission Controlは、Windows 10から搭載されたタスクビューである程度代替ができます。

タスクビューはスタートメニュー、コルタナと並んでタスクバーの左側にあるアイコンをクリックするか `Win+Tab` で表示できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127934/6e012fd2-c815-83e4-3e78-7db94ab74823.png)

タスクビューでは現在表示しているウィンドウや仮想デスクトップの一覧、スケジュールなどが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127934/5a727fc5-6739-4c9c-623f-7ed7676220d3.png)

# 関連リンク

* [Google IME](https://www.google.co.jp/ime/)
* [SeySwap for XP](https://www.vector.co.jp/soft/winnt/util/se228667.html)
* [Hain](https://github.com/hainproject/hain)
LaTeX の article の横幅を広げる

TeX では普段 jsarticle を使うのですが，英語の文書を書くときには article にしたいような気持ちになります．

```tex
\documentclass[a4paper]{article}
```

jsarticle に比べて，article は左右の余白が広いのが気になります．
A4 ではなく，レターサイズが基準になってることが理由のようです．

余白を変えるには geometry を使ったりする方法もあると思います．
が，微妙な数値の調整を悩むのはあまり好きでないので，できるだけ簡単な方法でしたい．

## a4wide

今まで，a4wide を使っていました．
あまりメジャーでない気もしますが，そこまで悪くないと思っています．

```tex
\usepackage{a4wide}
```

## typearea

typearea というのもあるそうです．
[使ってはいけない LaTeX のコマンド・パッケージ・作法](https://ichiro-maruta.blogspot.com/2013/03/latex.html) で知りました．

```tex
\usepackage{typearea}
\typearea{12}
```

とかを書きます．
数値が大きいほど横幅が広くなり， `\typearea{10}` が a4wide と同じくらいでした．
しばらく 12 で使ってみようと思います．

## おまけ

よりスマートな方法をご存知でしたらご教示ください m(_ _)m
Azureでlinux-data-science-vm-ubuntuを起動するときに"Legal terms have not been accepted for this item on this subscription."が出る場合の対処

# 概要
https://qiita.com/keisuke-umezawa/items/fcf5d00474e244217a5e
で環境構築中に出たエラーへの対処です。
要はAPIでVM作成するのに、利用規約に同意する必要があるってことです。利用規約をよく読んでご対応ください。
## エラーの例
``$ az vm create --location ${AZ_LOCATION} --resource-group ${AZ_RESOURCE_GROUP} --name ${AZ_USER}-vm --admin-username ${AZ_USER} --public-ip-address-dns-name ${AZ_USER} --image microsoft-ads:linux-data-science-vm-ubuntu:linuxdsvmubuntu:latest --size Standard_NC6 --generate-ssh-keys
Azure Error: MarketplacePurchaseEligibilityFailed
Message: Marketplace purchase eligibilty check returned errors. See inner errors for details. 
Exception Details:
	Error Code: BadRequest
	Message: Offer with PublisherId: microsoft-ads, OfferId: linux-data-science-vm-ubuntu cannot be purchased due to validation errors. See details for more information.[{"Legal terms have not been accepted for this item on this subscription. To accept legal terms using PowerShell, please use Get-AzureRmMarketplaceTerms and Set-AzureRmMarketplaceTerms API(https://go.microsoft.com/fwlink/?linkid=862451) or deploy via the Azure portal to accept the terms":"StoreApi"}]
$
``

## 手順
1. Azureポータルにログインする
2. 左のサイドバーからすべてのサービスをクリック
3. Marketplaceをクリック
4. 検索ボックスに「linux-data-science-vm-ubuntu」を入力してEnter
なぜか2つヒットします（区別つかない）
![スクリーンショット 2019-01-12 13.50.54.png](https://qiita-image-store.s3.amazonaws.com/0/184997/dbfe11da-abd6-1224-ab86-0568a4def508.png)
5. 作成ボタンの下に「プログラムによるデプロイについて」というリンクが表示される方を選んで、そのリンクをクリックします。
![スクリーンショット 2019-01-12 13.51.12.png](https://qiita-image-store.s3.amazonaws.com/0/184997/755a2fd4-7499-549b-6b10-916705de21e6.png)
6. 有効化ボタンをクリックして、次に保存ボタンをクリックすると規約に同意したことになり、エラーが解消します。
![スクリーンショット 2019-01-12 13.54.16.png](https://qiita-image-store.s3.amazonaws.com/0/184997/83a398b1-45bb-1e9e-b409-76a14b3609f7.png)
※キャプチャは既に有効化済みのもの
Swiftでのプライベートプロパティのテスト方法


# 問題

Swiftでコードを書く場合、Viewのテストで内部のプロパティが正常に設定されているかどうか検証したいが、そのためにプロパティを公開したくない。

# 解決策

JSON文字列でエクスポートするメソッドを定義して、テストクラス側でJSONに組み立てて検証する。

# コード例

JSONパーサーはSwiftyJSONを使っています。

```swift:プロダクトコード側

class TableViewCell: UITableViewCell {

    override var debugDescription: String {
        return JSON(["title" : titleLabel.text ?? "", "subtitle" : subTitleLabel.text ?? ""]).debugDescription
    }
    
}

```

テストコード側でJSONに組み立てて検証します。

```swift:テストコード側

   func test_properties() {
        
        XCTAssertEqual(JSON(parseJSON:tableViewCell.debugDescription), JSON(["title": "ssss", "subtitle" : ""]))
    }

```

# 課題

・チーム開発で、各人のレベル差、意識差まちまちの場合、意図を汲み取れずアクセさーメソッドのような意図しない使われ方をする?
・プロパティ名等をリファクタリングする場合、ビルド時ではなく、テスト実施時にエラーが見つかるため、やや脆いテストになる。
【備忘録】Progate JavaScript 1,2 まとめ

##プログラムを実行

```
console.log("Hello World!");
console.log(1+2);
console.log("1+2");

結果：
Hello World!
3
1+2
```

##文字列の連結

```
console.log("こんにちは"+"世界");

結果：
こんにちは世界
```

##変数の定義

```
let name = "Tanaka";
console.log(name);
name = "Suzuki";
console.log(name);

結果：
Tanaka
Suzuki
//letによる変数宣言は後に更新可能
---------------------------------

const name = "Tanaka";
console.log(name);
name = "Suzuki";
console.log(name);

結果：
Tanaka
Tanaka
//constによる変数宣言は後に更新不可

```

##テンプレートリテラル

```
const name = "Tanaka";
console.log(`My name is ${name}.`);

結果：
My name is Tanaka.

//`文字列${変数}`で「＋」と同等の役割
```

##条件分岐

```
const number = 18
if (number > 10){
  console.log('Number is greater than 10.');
}

結果：
Number is greater than 10.
-------------------------------------

const number = 18
if (number > 20){
  console.log('Number is greater than 20.');
} else {
  console.log('Number is smaller than 20.');
}

結果:
Number is smaller than 20.
```
おさぼりハンドメイクZIP続き(bit単位での入出力)

これは, [おさぼりハンドメイクZIP](https://qiita.com/tomokinex/items/4bdfa12bee38c0f81c69)の続きの記事です.

# 設計の追加
ハフマン符号化をするとファイルサイズがバイト単位からビット単位となります 
終端の位置を知るため, 圧縮したファイルの先頭にファイルサイズを追加します

# 実装編
圧縮によってファイルをbit単位で扱うので, ファイルの入出力が少し面倒になります
bit単位のファイル入力の方はまだ需要がありそうなので, 
切り出して紹介します

```c++:bit_reader.cpp

#include<iostream>
#include<fstream>
#include<string.h>
#include<vector>
#include<assert.h>
using namespace std;
void bit_reader(ifstream *ip, int read_size, unsigned int* read_bit, int *buffer_size,unsigned int *buffer, int max_buffer_size, int fread_min_size);

int main(int argc, char** argv){
	char *infilename ="input1.txt";

	ifstream infp;
	infp.open( infilename, ios::in | ios::binary );
	if(!infp){
		cout << "open failed " << infilename << endl;
		return 1;
	}

	/*読み出すbit単位, この場合4bitずつ16回読み出す*/
	vector<int> read_bits(16,4);
	
	unsigned int buffer = 0;
	const int max_buffer_size = sizeof(unsigned int)*8;
	int buffer_size = 0;
	const int fread_min_size = sizeof(unsigned char)*8;
	for(int i=0;i<max_buffer_size/fread_min_size;++i){
		if(!infp.eof()){
			unsigned char c;
			infp.read((char*)&c, sizeof(unsigned char));
			buffer <<= fread_min_size;
			buffer |= (unsigned int)c;
			buffer_size += fread_min_size;			
		}else{
			break;
		}
	}

	for(auto i=read_bits.begin();i!= read_bits.end();++i){
		unsigned int read_bit;
		bit_reader(&infp, (*i), &read_bit, &buffer_size, &buffer, max_buffer_size, fread_min_size);
		cout << read_bit << " ";
	}
}

/*
read_size: 読み出すbit数
read_bit: 読み出したbitを格納する変数
buffer_size: bufferに入ってるbitの数
buffer: buffer本体
max_buffer_size: bufferのbit数(unsigned intなので32)
fread_min_size: ファイルから読み出すbit数(unsigned charなので8)
*/
void bit_reader(ifstream *ip, int read_size, unsigned int* read_bit, int *buffer_size,unsigned int *buffer, int max_buffer_size, int fread_min_size){
	assert((*buffer_size) > read_size);
	(*read_bit) = (*buffer) >> (max_buffer_size - read_size);
	(*buffer) <<= read_size;
	(*buffer_size) -= read_size;
	int ref = (max_buffer_size - (*buffer_size)) / fread_min_size;
	if(ref>0){
		for(int i=0;i<ref;++i){
			if(!ip->eof()){
				unsigned char c;
				ip->read((char*)&c, sizeof(unsigned char));
				(*buffer) |= ((unsigned int)c) << (max_buffer_size - (*buffer_size) - fread_min_size);
				(*buffer_size) += fread_min_size;
			}else{
				return;
			}
		}
	} 
}

```

ファイルからバイト単位で読み出した値をいったんバッファリングして, 
bit単位で読み出しています

```shell:使い方
% cat input1.txt
abcdefghijk
% ./a.out
6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 
```
# 解凍編

解凍のコードも書けたので, 追記します
[github](https://github.com/tomokinex/Compression)にもpushしてあります


```shell

% cat test1.txt
aaabbbbcccccaaaaabbbbccc

% ./comp test1.txt test
test1.txt size: 26byte
after LZSS size: 15byte
output tree size: 8byte
output tree size: 9byte
not tree huffman size: 13byte
after Huffman size: 31byte

% ./decomp  test test2.txt
test size: 31byte
huff size: 15byte
after Huffman size: 15byte
after LZSS size: 26byte

% cat test2.txt
aaabbbbcccccaaaaabbbbccc

```
Twitter iOS SDKに学ぶプライベートプロパティ/メソッドのテスト方法(Objective-C編)


Twitter iOS SDKに学ぶプライベートプロパティのテスト方法

# はじめに

Viewのテストで内部のプロパティが正常に設定されているかどうか検証したいが、
そのためにプロパティを公開したくない。

# 解決策

テストクラスに公開したい、プロパティやメソッドを定義します。

# コード

[Twitter iOS SDK](https://github.com/twitter/twitter-kit-ios/blob/master/TwitterKit/TwitterKitTests/SocialTests/Syndication/Views/TWTRVideoCTAViewTests.m)
に実際のコード例があるので観てみましょう。

```objc

@interface TWTRVideoCTAView ()
// exposed for testing
- (void)handleDeeplinkButton;
@property (nonatomic, readonly) UIButton *CTAButton;
@end

...

@implementation TWTRVideoCTAViewTests

- (void)setUp
{
	
```

# 課題

Swiftの場合は不可能（別記事にて解決策を寄稿)
ksnctf 20 G00913 30pt

#問題

https://ksnctf.sweetduet.info/problem/20

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0f273c23-81f2-e306-27ca-9e97e015c91c.png)

#解いてみた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fd064daf-3afb-37a2-be01-bb46592a0f10.png)

ネットで検索すると一発で答えが出ました。。。
ちょっとそれだとつまらないので自分でやってみます。
円周率はネットから拾います。
単純に割ったあまりが0になるものを先頭から順番に取ればいいですかね。

と思って作ってみたらオーバーフローになってできなかったのでやる気なくした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d02e0177-c219-b00a-7721-53e455009b24.png)
テスト用のシミュレータを厳格に判定する。

# はじめに

　ViewやViewControllerと言った環境依存性が高い部分のユニットテストを行う場合、対象のOSのバージョンおよび（シミュレータの）端末等を明確化しておかないと、
特にチーム開発で新規参入者が何をやっても通らないテストではまります。

# 解決策

テストホストアプリケーションに以下の形で強制終了させるコードを書きます。

```objc


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
  NSDictionary<NSString *, NSString *> *environment = [NSProcessInfo processInfo].environment;
    NSAssert([environment[@"SIMULATOR_RUNTIME_VERSION"] isEqualToString:@"11.4"], @"iOS 11.4シミュレータ上で動いていない");
    NSAssert([environment[@"SIMULATOR_DEVICE_NAME"] isEqualToString:@"iPhone 8"], @"iPhone 8シミュレータ上で動いていない");
    
    return YES;
}


```
ffmpegでVOBからTSに変換する

エンコードせず、複数音声や字幕もそのままにTSファイルを作成。
# Streamの確認
まずはどのStreamに動画、音声、字幕が入っているか確認する。

```
ffmpeg -i INPUT.vob
```

字幕が表示されない場合は、`-probesize`とかを入れる。

```
　ffmpeg -probesize 50M -analyzeduration 50M -i INPUT.vob
```


`-probesize 50M`で先頭から50MBまで、`-analyzeduration 50M`で先頭から50秒まで、どちらかが先に達するまで解析する。

# 変換
以下で変換。

```
ffmpeg -probesize 50M -analyzeduration 50M -palette "ffffff,000000,ffffff,000000" `
       -i INPUT.VOB `
       -map 0:1 -map 0:2 -map 0:3 -map 0:4 -map 0:5 `
       -c:v copy `
       -c:a:0 copy -metadata:s:a:0 language=jpn `
       -c:a:1 copy -metadata:s:a:1 language=eng `
       -c:s:0 dvbsub -metadata:s:s:0 language=jpn `
       -c:s:1 dvbsub -metadata:s:s:1 language=eng `
       OUTPUT.ts
```

`-palette`で字幕の色を指定(色はIFOファイルに保存されており、VOBファイルから分からないため)。`"ffffff,000000,ffffff,000000"`は、順に1つ目の字幕のfont color、outline color、2つ目の字幕のfont color、outline colorに対応。
# TODO
字幕について以下の改善方法を検討中。

- 位置が上過ぎる
- VLCメディアプレーヤーでしか表示できない

# 参考URL
https://trac.ffmpeg.https://trac.ffmpeg.org/wiki/ExtractSubtitlesorg/wiki/Map
http://fftest33.blog.fc2.com/blog-entry-109.html
https://dev.classmethod.jp/tool/add-audio-and-subtitle-to-video-with-ffmpeg/
https://wiki.videolan.org/subtitles
https://trac.ffmpeg.org/ticket/4047
Some tools

コスト関数

```python
def trading_cost_bps(participation_ratio=0.1, commission_bps=10):
    c=commission_bps
    p=participation_ratio
    return (-1/(p/15+0.01)+200)/3.4-24+c
```

バックテスター

```python
import pandas as pd
from datetime import date, datetime as dt
import random

def default_manager(d):
    """Manages each of process of back testing
    """
    print('Start back testing...')
    d.log=pd.DataFrame(0, index=d.dates, columns=d.universe)
    for date in d.dates:
        d.each_day(date)
        print(d.log)
    print('Backtest completed.')
    
    
class BackTestWorker(object):
    """Works as if a trader for each of the day
    """
    def __init__(self, universe, rule, dates, manager=default_manager, 
                 *args,**kwargs):
        self.universe=universe
        self.rule=rule
        self.dates=dates
        self.manager=manager
        self.args=args
        self.kwargs=kwargs
        
        
    def each_day(self, date):
        return self.rule(self, date)
        
    def run(self):
        self.manager(self)

def random_buyer(d, date):
    if date==d.dates[0]:
        d.log.loc[date,random.sample(d.universe,2)]=1
    else:
        pass

    
    
if __name__ == '__main__':
    BackTestWorker(
        ['3382','7203','2651'],
        random_buyer,
        [date(2007, 12, 5), date(2007, 12, 6), date(2007, 12, 7)]
    ).run()
```