OmniAICreator/Qiita-1.07M huggingface dataset:
cookieの操作可能範囲について

# まえがき
2年ほど前に調べたcookieの操作可能範囲。
発掘したので、そのままぺたり。
操作手段はJavaScript。
# 参考
* http://www.imymode.com/exp/cookie.html
* https://qiita.com/uryyyyyyy/items/1c32afea4240a14d57e4
* https://blog.tokumaru.org/2011/10/cookiedomain.html
* https://triple-underscore.github.io/RFC6265-ja.html#section-4.1.2.3

# 前提
cookieのpath指定はすべて「/」である。

# cookieの読み書き範囲の調査
## ■ トップドメイン(.com, .jp等)で指定してcookie付与は不可
```js
document.cookie = "_testsunTop=hogehoge; path=/; domain=.com;";
```
=> 付与できない
## ■ ドメインで指定してcookieを付与した場合、指定した階層以下からは参照可能
### 参照可否

|同一|上位|下位|
|:----:|:----:|:----:|
|〇 | × | 〇|

現在の場所 `test.aaa.domain.com`

```js
document.cookie = "_testsun=ttttt; path=/; domain=.aaa.domain.com;";
```

### 参照可能範囲
* `test.aaa.domain.com`
* `tttt.aaa.domain.com`
* `aaa.domain.com`

### 参照不可
* `domain.com`

## ■ 現在いる場所のドメインと指定するドメインの場所が異なる場合、書き込み不可
現在の場所 `test.aaa.domain.com`

```js
document.cookie = "_testsunAno=anotherdomain; path=/; domain=.tttt.aaa.domain.com;";
```

## ■ ドメインを指定せずにcookieを書き込むと、そのドメインからしか見ることができない
現在の場所 `aaa.domain.com`

```js
document.cookie = "_testsunNoSetDomain=foobaa; path=/;";
```
* 設置場所 `aaa.domain.com`
* サブドメイン `test.aaa.domain.com`

### 【IEの場合】、ルートドメインでcookieが発行されるとサブドメインまで読み込むことができる。
① root.com/hogehoge.htmlで以下のように設定

```js
document.cookie = "_sun_tes_no_set_domain=noDomain; path=/";
document.cookie = "_sun_tes_no_priod=setNoDomain; domain=root.com; path=/";
document.cookie = "_sun_tes_set=setDomain; domain=.root.com; path=/";
```
② sub.root.com/fugafuga.htmlでcookieを確認すると、すべての値を確認可能。

### 削除のことば
```js
expires=Thu, 01 Jan 1970 00:00:00 GMT
```
Googleアカウントの作り方

## 1.Googleアカウントの作り方

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/4191955a-2b0a-71e6-b7dc-c4d1478c00ce.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/1607f823-06f8-5e56-6ff9-25b7b631ba6f.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/54f03348-6042-1dc1-d765-5c2b04c78e75.png)
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/51956f1d-98ef-368e-b86f-ef8ac7955bfd.png)
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/7c136ecc-b05e-9622-74e5-faf5c421d428.png)
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/62700791-4ca2-bd9f-2698-fc346fc77fda.png)
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/03aa91be-3345-d3c9-fdbc-f907badc54bb.png)
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/9e84f7c8-ed7d-3c86-59cc-de2e7713bf99.png)

[Googleアカウント作成](https://accounts.google.com/signup)

1.上記のリンクから `Googleアカウント作成` ページに推移する。
2.自分の `姓` と `名` を入力し、 `ユーザー名` と `パスワード` を決めて `次へ` をクリックする。
※ユーザー名は、既に作成されているアカウントと被ることはできない
3.自分の `電話番号` を入力して `次へ` をクリックする。
4.`電話番号` の `SMS` に `確認コード` が送られるので、それを入力して `次へ` をクリックする。
5.`電話番号` 、 `再設定用のメールアドレス` 、 `生年月日` 、 `性別` を入力して `次へ` をクリックする。
※`電話番号` と `再設定用のメールアドレス` は省略可能
6.`プライバシーポリシー` と `利用規約` を下まで読み進め、 `同意する` をクリックする。
7.[Google](https://www.google.com) にアクセスし、右上にアイコンが作成されれば成功です。
swift5でダイアログを表示する方法

# 目的
今回はSwift5でダイアログを表示させる方法を展開します。
## 開発環境
swift5
Xcode10.2
## 表示させる物
### アクションスタイルがデフォルト
<img width="375" alt="Simulator Screen Shot - iPhone 7 - 2019-09-29 at 14.12.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/b8070000-dbd0-03ba-d4b5-639054a58c80.png">
### アクションスタイルがアクションシート
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/67a396fd-4f49-0ff1-28c4-07d297951cea.png)

## 実装
### アクションスタイルがデフォルト

```swift:Test.swift
//アラート生成
//UIAlertControllerのスタイルがalert
let alert: UIAlertController = UIAlertController(title: "表示させたいタイトル", message:  "表示させたいサブタイトル", preferredStyle:  UIAlertController.Style.alert)
// 確定ボタンの処理
let confirmAction: UIAlertAction = UIAlertAction(title: "確定", style: UIAlertAction.Style.default, handler:{
    // 確定ボタンが押された時の処理をクロージャ実装する
    (action: UIAlertAction!) -> Void in
    //実際の処理
    print("確定")
})
// キャンセルボタンの処理
let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler:{
    // キャンセルボタンが押された時の処理をクロージャ実装する
    (action: UIAlertAction!) -> Void in
    //実際の処理
    print("キャンセル")
})
        
//UIAlertControllerにキャンセルボタンと確定ボタンをActionを追加
alert.addAction(cancelAction)
alert.addAction(confirmAction)
        
//実際にAlertを表示する
present(alert, animated: true, completion: nil)
```
### アクションスタイルがアクションシート

```swift:Test.swift
//アラート生成
//UIAlertControllerのスタイルがactionSheet
let actionSheet = UIAlertController(title: "Menu", message: "", preferredStyle: UIAlertController.Style.actionSheet)

// 表示させたいタイトル1ボタンが押された時の処理をクロージャ実装する
let action1 = UIAlertAction(title: "表示させたいタイトル1", style: UIAlertAction.Style.default, handler: {
    (action: UIAlertAction!) in
    //実際の処理
    print("表示させたいタイトル1の処理")
})
// 表示させたいタイトル2ボタンが押された時の処理をクロージャ実装する
let action2 = UIAlertAction(title: "表示させたいタイトル2", style: UIAlertAction.Style.default, handler: {
    (action: UIAlertAction!) in
    //実際の処理
    print("表示させたいタイトル2の処理")

})
        
// 閉じるボタンが押された時の処理をクロージャ実装する
//UIAlertActionのスタイルがCancelなので赤く表示される
let close = UIAlertAction(title: "閉じる", style: UIAlertAction.Style.destructive, handler: {
    (action: UIAlertAction!) in
    //実際の処理
    print("閉じる")
})
        
//UIAlertControllerにタイトル1ボタンとタイトル2ボタンと閉じるボタンをActionを追加
actionSheet.addAction(action1)
actionSheet.addAction(action2)
actionSheet.addAction(close)
        
//実際にAlertを表示する
self.present(actionSheet, animated: true, completion: nil)
```
### ボタンの処理なしでもかける！
上の２つはボタンを押した時の処理を書いてますがユーザーに対して、ただ周知したい時はもう少しスマートにかけます。

```swift:Test.swift
//アラートのタイトル
let dialog = UIAlertController(title: "タイトル", message: "サブタイトル", preferredStyle: .alert)
//ボタンのタイトル
dialog.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
//実際に表示させる
self.present(dialog, animated: true, completion: nil)
```
こういう風に表示されます
<img width="375" alt="Simulator Screen Shot - iPhone 7 - 2019-09-29 at 14.45.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/5fe76eff-c840-3446-3b8f-24cbca58e717.png">
Anacondaのプロキシ設定

# はじめに
OS:Windows10
Anaconda:2019.07

職場等、プロキシ環境下でAnacondaを使うための設定。
設定しないと、conda install コマンド等が失敗する。

### 1. 設定ファイル(.condarc)の作成
Anacondaのルートディレクトリに、".condarc"という名前のファイルを作成する。
※Anacondaのルートディレクトリは、デフォルトだと\<C:\Users\ユーザー名\Anaconda3>になっている。

ファイル作成の際にエクスプローラーに怒られた場合は、PowerShellで下記コマンドを使用して作成する。
※Linuxのtouchコマンドに相当

```
New-Item -Type File .condarc
```

### 2. プロキシの設定
1で作成した".condarc"に、下記を追記する。

```
proxy_servers:
  http: http://[ユーザーID]:[パスワード]@[プロキシサーバのアドレス]:[ポート番号]
  https: https://[ユーザーID]:[パスワード]@[プロキシサーバのアドレス]:[ポート番号]
```
※インデントはスペースですること。タブでインデントすると動かない。

下記コマンドを実行し、proxy_servers:に設定した内容が表示されていれば正しく設定できている。

```
conda config --show
```

# あとがき
使わせてもらえるならLinuxのほうがPython開発では使いやすい気がする。

Macはスタバで仕事しない限り不要です。
Project Euler 031を解いてみる。「硬貨の和」

# Project Euler 031
[031](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2031)
>イギリスでは硬貨はポンド£とペンスpがあり，一般的に流通している硬貨は以下の8種類である.
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).
以下の方法で£2を作ることが可能である．
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
これらの硬貨を使って£2を作る方法は何通りあるか?


->[次の問題](https://qiita.com/radiol/items/a26730d9de9b718717b9)

## 考え方
プログラミングらしくて楽しい問題ですね。問が再帰関数を使えと言っています。
設問の£2=200pをmoneyとして
大きい硬貨から順に、0~(money/コインの価値)枚のパターンで分け使った分をmoneyから引きます。残ったお金を残りの硬貨で作れるパターンを再帰関数で取得します。
今回は1pがあるので、再帰関数の最後は必ず1を返しますが、例えば[3,7,11]でmoney=100になる組み合わせのように、再帰関数の最後で組み合わせが成立しない場合も考慮し1または0を返すようにしています。
実はリストは昇順じゃなくても同じ結果を返しますが、無駄な計算が増えるので遅くなります。

```Python:euler031.py
def combo_of_coin(money: int, coin_list: list):
    """コインの組み合わせ数を返す再帰関数
    Args:
        money: 金額
        coin_list: 組み合わせに使用するコインの価値、昇順で記載。
    Returns:
        int: コインの組み合わせ数
    """
    result = 0
    # リストの最後に来たら
    if len(coin_list) == 1:
        # 基本的には1を返す。
        # moneyを割り切れない場合=組み合わせが成立しない場合0を返す
        return 1 if money % coin_list[0] == 0 else 0
    # 検証に使用するコインを末尾から取り出す
    coin = coin_list[-1]
    # coinを使う枚数は0~(money//coin)の(money//coin +1)通り
    for i in range(money // coin + 1):
        # coinの分をmoneyから差し引き、
        # 残りのcoin_listから再帰的に組み合わせを取得しresultに加算
        result += combo_of_coin(money - coin * i, coin_list[:-1])
    return result
```


## コード
```Python:euler031.py
def main():
    money = 200
    coin_list = [1, 2, 5, 10, 20, 50, 100, 200]
    print(combo_of_coin(money, coin_list))


def combo_of_coin(money: int, coin_list: list):
    """コインの組み合わせ数を返す再帰関数
    Args:
        money: 金額
        coin_list: 組み合わせに使用するコインの価値、昇順で記載。
    Returns:
        int: コインの組み合わせ数
    """
    result = 0
    # リストの最後に来たら
    if len(coin_list) == 1:
        # 基本的には1を返す。
        # moneyを割り切れない場合=組み合わせが成立しない場合0を返す
        return 1 if money % coin_list[0] == 0 else 0
    # 検証に使用するコインを末尾から取り出す
    coin = coin_list[-1]
    # coinを使う枚数は0~(money//coin)の(money//coin +1)通り
    for i in range(money // coin + 1):
        # coinの分をmoneyから差し引き、
        # 残りのcoin_listから再帰的に組み合わせを取得しresultに加算
        result += combo_of_coin(money - coin * i, coin_list[:-1])
    return result


if __name__ == '__main__':
    from time import time as t
    st = t()
    main()
    print(t() - st, 'sec')
```
[paiza](https://paiza.io/projects/new)にて実行
`結果
73682
0.019005775451660156 sec
`
VirtualBoxの設定でつまずいたところ

Linuxの勉強をしようと思い，「[新しいLinuxの教科書](https://www.amazon.co.jp/s?k=%E6%96%B0%E3%81%97%E3%81%84+linux+%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8&adgrpid=52270124614&gclid=CjwKCAjwibzsBRAMEiwA1pHZrvCgX8aPIPpDJzP3-YWLu6d-hSpkhFP4RwqwECqdl1Bm1QpK5ArgQRoC1OYQAvD_BwE&hvadid=338518266894&hvdev=c&hvlocphy=1009307&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=6582507297897692131&hvtargid=aud-762433167318%3Akwd-314105638242&hydadcr=27267_11561158&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_3nezkg5zia_e)」を購入．
VirtualBoxの設定でいきなり躓いたので，本に載っていなかったことを書いておく．

#仮想マシンの作成で64-bit版が選択できない
【問題】
VirtualBoxとCentOSのダウンロード後，仮想マシンの作成をしようと思ったらバージョンに64-bit版が表示されない．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505238/9f026e0b-ac4f-1236-93ac-13ea2cd5d142.png)
ちなみに，32-bit版を選ぶと，
　*This kernel requires an x86-64 CPU ,but only detected an i686 CPU.*
　*This processor is not supported in this version of CentOS Linux.*
と表示される． 
　
【原因】
BIOSの仮想化機能が有効になっていなかったのが原因らしい[^1]．
[^1]: [VirtualBoxでCentOS6.4(x64)がインストールできなかった話](https://qiita.com/kmats@github/items/a2396aa5b6f397d447b8)
　
【解決方法】
自分はVAIOを使っているので，VAIOについてのみ記載[^2]．
[^2]: [VAIO_PC Intel® Virtualization Technology機能を有効にする方法](https://solutions.vaio.com/937)
1. いったん電源をOFFの状態にして[ASSIST]ボタンを押下して，パソコンを起動．
2. [BIOS設定メニューを表示]を選択後，[Advanced]タブの[Intel(R) Virtualization Technology]の設定を[Enable]に変更．
3. [Exit]タブの[Exit Setup]を選択すると，[Setup Confirmation Save configuration changes and exit now?]と表示されるので[Yes]を押下して，パソコンを起動．

設定を変更後，無事に64-bit版を選択することができるようになった．

#CentOSのインストールが上手くいかない
【問題】
仮想マシンにCentOSをインストール後，再起動すると再びインストール画面になってしまいログイン画面にならない．
　
【原因】
ISOファイルが仮想マシン上に入れっぱなしになっているのが原因らしい[^3]．
[^3]: [Virtulaboxで仮想マシンを再起動したら、再インストールされる](https://teratail.com/questions/43975)
　
【解決方法】
1. CentOSのインストール後，[仮想マシンの電源をオフ]を選んで仮想マシンを閉じる．
2. [Oracle VM VirtualBox マネージャー]で，[設定]>[ストレージ]>[コントローラ：IDE]に設定されているISOファイルを右クリック，[割り当てを除去]を押下．
3. [OK]を押下して，[設定]を閉じたら仮想マシンを再起動する．

再起動後，ログイン画面が表示された．

#追記
##Windowsのインストールが上手くいかない
以下の記事に書かれている手順に沿って，「ディスクの準備」と「Virtual Boxのセットアップ」を行ったが，途中でつまずいたのでメモ．
- [Windows10 May 2019 Update(1903) - インストールメディア作成(USB・ISOファイル)](https://pc-karuma.net/windows-10-may-2019-update-1903-install-media/) 
- [VirtualBoxにWindows10をインストールする](https://qiita.com/hinataysi29734/items/d4e48ca673bad2f5ea03)

###ディスクの準備
ここは，特に問題なくできたので，大事そうなポイントのまとめ．
1. [Windows 10 のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10) で「ツールを今すぐダウンロード」を押下．
2. ダウンロードが終了したら「実行」を押下．実行する操作を選択する項目で，**「別のPCのインストールメディアを作成する」**を押下．
3. 使用するファイルは，**「ISOファイル」を選択**．

###Virtual Boxのセットアップ
【問題】
仮想マシンが起動完了後，Windowsセットアップの段階で以下のようなエラーが出た．
*Unable to allocate and lock memory. The virtual machine will be paused. Please close applications to free up memory or close the VM.*

【原因】
[Virtual box を起動しているデスクトップ上でメモリ不足](http://tooljp.com/qa/Please-close-applications-to-free-up-memory-or-close-the-VM-06C3.html)で，Virtual Box以外のアプリを終了すればよい．
[Oracle VM VirtualBox マネージャー]で，[設定]>[メモリーサイズ]を確認すると，「**ホストコンピュータの実メモリーのxx%を超えるメモリーが仮想マシンに割り当てられています．ホストOSが十分なメモリーを使用できません．割り当てメモリーを減らしてください．**」と警告が出ていた．これが原因ぽい．

【解決方法】
[メモリーサイズ]の大きさを警告が出ないサイズまで小さくしたら，エラー出さずにWindows環境を立ち上げることができた
エンジニアスタンプラリー～フロントエンド編＃7

## 企画主旨
[Frontend Developer Roadmap](https://roadmap.sh/frontend)をひたすら巡回する企画 
詳しくは[こちら](https://qiita.com/tonchan1216/items/8d5f072cf769dfe1bc4f)

## 今回の実施内容
ビルドツール
開発をより効率的に、みたいなことが実現できそうなテーマ。

## Build Tools

#### Linters and Formatters
まずは**ESLint**を導入。
[Getting Started with ESLint](https://eslint.org/docs/user-guide/getting-started)に従って、yarnからインストール。それだけ。

```json:.eslintrc.json
{
    "env": {
        "browser": true,
        "es6": true
    },
    "extends": "eslint:recommended",
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        "ecmaVersion": 2018,
        "sourceType": "module"
    },
    "rules": {
    }
}
```

次に**Prettier**を導入。
公式ページ[Prettier](https://prettier.io/)のトップに３ステップでGet Startedが記載。
シンプル is ベスト。

```bash
yarn add prettier --dev --exact
yarn prettier --write src/index.js
yarn add pretty-quick husky --dev
```

最後に、ESLintとPrettierを連携させたり、VS Code上で実行できるようにしたり、コミット前に実行させたり。

```json:package.json
  "lint-staged": {
    "*.js": [
      "eslint --fix",
      "git add"
    ]
  }
```

#### Task Runners
今回は黄色文字の**npm scripts**を充実させる。
ルール違反だけど、実はSASSの監視設定で追加しちゃってた。
今回は公式ドキュメントがいまいちだったので、[npm-scriptsを使ってみる](https://qiita.com/minase_tetsuya/items/986feac7150ed74e13d8)を参考にさせていただいた。
コピーする人、並列実行する人、監視する人、いろいろ。

```json:package.json
"scripts": {
  "start": "yarn watch-css",
  "watch-css": "sass --watch src/sass/main.scss styles/style.css",
  "deploy": "npm-run-all deploy:*",
  "deploy:html": "cpx index.html ./docs",
  "deploy:css": "cpx ./styles/*.css ./docs/styles",
  "deploy:js": "cpx ./scripts/*.js ./docs/scripts",
  "deploy:assets": "cpx ./assets/* ./docs/assets"
}
```
#### Module Bundlers
最近巷で聞く**Webpack**。
公式の[Getting Started | webpack](https://webpack.js.org/guides/getting-started/)を参考に開発環境を整備した。
今までやってきたことが、これ一本でできる感じ。

```json:package.json
  "scripts": {
    "start": "webpack-dev-server",
    "build": "webpack",
    "watch": "webpack --watch",
  }
```

```javascript:webpack.config.js
module.exports = {
  mode: MODE,
  entry: './src/js/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  },

  devServer: {
    contentBase: 'dist',
    open: true
  },

  module: {
    rules: [
      {
        test: /\.scss/, // 対象となるファイルの拡張子
        use: [
          'style-loader', // linkタグに出力する機能
          {
            loader: 'css-loader', // CSSをバンドルするための機能
            options: {
              url: false,
              sourceMap: enabledSourceMap,
              importLoaders: 2
            }
          },
          {
            loader: 'sass-loader', // Sassファイルの読み込みとコンパイル
            options: {
              sourceMap: enabledSourceMap
            }
          }
        ]
      }
    ]
  }
};

```

## 成果物
せっかくなのでjsもcssも全部一つにまとめる、ってところまでやってみた。
https://tonchan1216.github.io/WDR-frontend/v7/
https://github.com/tonchan1216/WDR-frontend/tree/v7.0
pipとpipのqrcodeモジュールのインストール方法

qrコードを作成するqrcodeモジュールをインストールしたい。
1.pipのインストール
2.pipを利用してqrcodeモジュールのインストール

Anacondaをインストールしたがpipがインストールされてないようだ。
https://bootstrap.pypa.io/get-pip.py
をC:users\userへ保存して、コマンドプロンプトで以下を実行。

```
$ python get-pip.py
$ python install pillow qrcode
```
ARKitのdaeを使って表示しているオブジェクトがなぜ荒いのかを解決した話

## はじめに

ARKitを使ったSNSアプリ[ARIZAR](https://www.arizar.com/jp/)を開発しています。
開発している時にわかったTIPS的なネタを記事にします。

ぜひ[ARIZAR](https://www.arizar.com/jp/)をダウンロードして使ってみてください。
よろしくお願いします。

## 今回の課題

２つのツイートをみていただくとわかりますが、１つ目より２つ目の方がアバターと私達が呼んでいるオブジェクトがキレイになっていると思います。
今回は、解決したことについて記事にします。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ハイタッチで終わり、また来年👍<br>少し恥ずかしかった😅<a href="https://twitter.com/hashtag/iosdc?src=hash&amp;ref_src=twsrc%5Etfw">#iosdc</a> <a href="https://twitter.com/hashtag/arizar?src=hash&amp;ref_src=twsrc%5Etfw">#arizar</a> <a href="https://twitter.com/hashtag/ar?src=hash&amp;ref_src=twsrc%5Etfw">#ar</a> <a href="https://t.co/31rvqO3wcU">pic.twitter.com/31rvqO3wcU</a></p>&mdash; 藤　治仁 (@From_F) <a href="https://twitter.com/From_F/status/1170267026989826048?ref_src=twsrc%5Etfw">September 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">開発中の <a href="https://twitter.com/hashtag/ARIZAR?src=hash&amp;ref_src=twsrc%5Etfw">#ARIZAR</a> 謎だったところが、だんだん意味がわかってきた。<a href="https://twitter.com/hashtag/ARKit?src=hash&amp;ref_src=twsrc%5Etfw">#ARKit</a> が少しづつ使いこなせるようになってきた。まだまだだけど…<a href="https://twitter.com/hashtag/ar?src=hash&amp;ref_src=twsrc%5Etfw">#ar</a> <a href="https://twitter.com/hashtag/swift?src=hash&amp;ref_src=twsrc%5Etfw">#swift</a> <a href="https://t.co/wUPOoSUG5B">pic.twitter.com/wUPOoSUG5B</a></p>&mdash; 藤　治仁 (@From_F) <a href="https://twitter.com/From_F/status/1173449893077110784?ref_src=twsrc%5Etfw">September 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## なぜ荒いの？

[前回の記事](https://qiita.com/From_F/items/495b088ebe57e41a854d)にその答えが隠されていました。

> 要するに、大きな文字を描画して小さく縮小すれば良いのではないかということがわかりました。

これです。実際のscnファイルを確認しました。

<img width="505" alt="before.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/d5bf5301-94d2-3b2d-1e07-1e6af1c15a3b.png">

Positonが(0,-100,-200)にScaleが(0.361,0.361,0.361)になっています。
これは、PositionのZ軸が-200となっていてこれは自分から200m離れていることになります。

でもiPhoneの画面上、オブジェクトが荒い以外違和感がないのですが、逆に言うとオブジェクトが巨大だということが冷静になってみるとわかります。
もう１つ違和感があったのがiPhoneを左右に振って視点を少し変えてもオブジェクトがあまり動かないことの不思議に思っていました。

よくよく考えてみると、東京から富士山をみているような感じなのかなっと気づきました。

## 解決策

PositionとScaleを調整して、Positionは近く、Scaleはもっと小さくすることでオブジェクトを目の前に移動させました。
これにより本来のオブジェクトの姿が見えるようになりました。
こちらはコードで40cm手前に配置するようにしました。

```Swift:改善後
        let model = SCNScene(named: named)
        if let modelNode = model?.rootNode.childNodes.first {
            modelNode.position = SCNVector3Make(0, -0.03, -0.4)
            modelNode.scale = SCNVector3(0.0006,0.0006,0.0006)
        }
```

## 最後に

ARは物体がないので座標系がピンとこないことが多いです。
荒かったり、カクカクする場合にはそのオブエクトが遠すぎないか？の観点で点検してみてはいかがでしょうか？
ありがとうございました。
AppleScriptをmenubarから実行できるようにする@macOS Mojave

## 概要

色々あってAppleScriptを動かしたくなったので備忘録。アプリケーション登録してダブルクリックするとかターミナルから起動とかでも良かったのですが、簡単に起動できることを最優先にしたいってことでメニューバーから起動できるようにしてみます。

最終的にはこんな感じ。

![image-20190920093219000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298815/f2b96d1d-2954-74f4-39a1-055a62925ec1.png)


## メニューバーにScript menuを追加（アクティブ化）する

調べたら環境設定からできるって書いてあったけどMojaveだとメニューの項目としてなかったのでターミナルから表示されるようにする。

```sh
open '/System/Library/CoreServices/Script Menu.app'
```

これでメニュー自体は表示されて標準で用意されているものだけが表示される。

## AppleScriptを書く

適当にディレクトリ（お試しなんでmyAppleScriptsとかでOK）作って標準搭載されているスクリプトエディタを起動する。新規作成で以下のコードを記載して実行してみるとダイアログでハロワが表示される。表示されなければ何かがおかしいから自力で解決して。

```
display dialog "hello world"
```

動くことが確認できたら「hello world」とかそんな名前で保存。

## Script menuに追加

Script menuの「スクリプトフォルダを開く」->「ユーザ・スクリプト・フォルダを開く」をクリック。Finderが表示されるので、ここに先程作成したディレクトリ（myAppleScript）丸ごとコピー。そうするとscript menuに勝手に追加される。便利。  
後は上の画像のように階層を追って「hello world」をクリックすればダイアログが表示される。便利。

## おまけ

各アプリケーション（TeamsやSlack）単位でScriptファイルの格納場所が違うので、Teamsでしか実行したくない（されたくない）とかSlackでしか実行されたくないとかその辺の切り分けが簡単に行える。コンピュータ・スクリプト・フォルダは初期セット（ColorSyncとかFont Bookとか）と同じセクションになる。  
もちろんAppleScriptから他のファイルをキックすることもできるので、AppleScriptには利便性だけ求めて実装は他言語とかでも良いと思う。環境依存するので汎用性（チーム内で使うとか）は無くなるけど。

## おわり

AppleScript初心者なのでどこまでできるとかはまだあまり見えてないけどmac上で普段手で行ってるルーチンをScript化しちゃえば色々と楽になるし忘れてたとかも防止できそうな気がする。気がしてるだけかもしれないが。
direnvの導入

# 目的

リポジトリごとの環境変数を管理するために[direnv](https://github.com/direnv/direnv)の導入手順に
ついて備忘録を書いておく。

詳細な部分は本体のリポジトリを参照すること
https://github.com/direnv/direnv

# バイナリの導入

https://github.com/direnv/direnv/releases
にアクセスして最新のバイナリを取得する。

```console:direnvバイナリの取得と導入
$ wget https://github.com/direnv/direnv/releases/download/v2.20.0/direnv.linux-amd64
$ chmod +x direnv.linux-amd64
$ sudo mv direnv.linux-amd64 /usr/local/bin/direnv
```

# .bashrcへの記述追加

`.bashrc`の末尾に以下の記述を追加

```bash:.bashrc
eval "$(direnv hook bash)"
```

# リポジトリに.envrcファイルを準備する

```console:.envrcファイルの作成
$ touch .envrc
```

あとは`.envrc`内部で必要な環境変数を定義する。

# 有効化

`.envrc`ファイルの存在するディレクトリにアクセスすると警告が表示されるので、
`direnv allow`で環境変数の読み込みを許可する。

```console:.envrcファイルの読み込み許可
$ direnv allow
```
Chromebookにpyenvでpython3.7.4をインストールするまで

# はじめに
Qiita初投稿となります。初めての海外移住＆初めての転職という大きな環境の変化を経て、これを契機にアウトプットを初めていこうと思った次第です。
出だしが非常にマイナー情報ですが、こんな情報でも、だれかの役にたてばと思いながら投稿します。

# 背景
* 2017年8月よりAcer Chromebook R13を愛用
    * 日本では未販売
    * [Amazon.comより購入](https://www.amazon.com/dp/B01LW8JTHF?ref_=pe_2640190_233158700_ste_e304_dp_1)
    * 2年たった今でもサクサク動作
* ChromOS 69よりLinuxが動作するように
    * Python3.5.3もデフォルトでインストールされている
    * これだけでも十分だったが、折角なら最新（2019年9月時点:3.7.4）にアップデートしたい
* 過去に「開発者モード」を利用したChromeOS開発環境構築にチャレンジしたものの、いくつかのエラーを越えることができず
    * 今回を機に再チャレンジ
    * 無事にうまくインストールできたので、備忘録の意味も含めまとめ
    * ニーズは非常に少ないだろうが、少なくともドンピシャな記事も見当たらなかったので、初投稿には良いのではないか？？

# 環境
* Acer Chromebook R13
* ARM Cortex-A72 2.0GHz
* ChromeOS: 76.0.3809.136
    * **開発者モードへは切り替えていません**
* git: 2.11.0 (標準インストール)

# pyenvのインストール
* 下記記事を参考にインストール
    * https://qiita.com/shigechioyo/items/198211e84f8e0e9a5c18

```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

* Vim編集部分は、下記記事に助けてもらう
    * https://qiita.com/kon_yu/items/b8864ff566b8b67a9810

```
sudo vim ~/.profile
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
```

* .profileの再度読み込み

```
source ~/.profile
```

# pythonインストール
* そしていざpythonインストール

```
$ pyenv install 3.7.4
```
* ここからはエラーとの戦い
* それぞれのエラーと対処舌方法をのせていきます

①pythonインストールのためのCコンパイラがない

|エラー|```configure: error: no acceptable C compiler found in $PATH```|
|--- |---|
|対処|```$ apt-get install build-essential```|
|参考|https://stackoverflow.com/questions/19816275/no-acceptable-c-compiler-found-in-path-when-installing-python|

②zlibライブラリがインストールされていない

|エラー|```ZipImportError: can't decompress data; zlib not available```|
|--- |---|
|対処|```$ sudo apt-get install zlib1g-dev```|
|参考|https://qiita.com/banaoh/items/00aea13fe045fab7e8ba|

③libffi-devライブラリがインストールされていない

|エラー|```ModuleNotFoundError: No module named '_ctypes'```|
|--- |---|
|対処|```$ sudo apt install libffi-dev```|
|参考|https://qiita.com/hitochan777/items/941d4422c53978b275f8|

④上記対処だけでは、ワーニングがでてしまう

```
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?```
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
```

|対処|```$ sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev```|
|--- |---|
|参考|https://qiita.com/utgwkk/items/bf282ca95f64ef7dd594|

# デフォルトバージョンの変更

```
$ pyenv global 3.6.5
```


pipもインストールします(参考：http://pineplanter.moo.jp/non-it-salaryman/2019/06/04/chromebook-python/)

```
$ sudo apt-get install python3-pip
```

# ようやく完了！
* 長い道のりでしたが、Google先生と皆様の記事のおかげでなんとかインストールまで漕ぎ着けられました
    * 個人的にはubuntuを初めて触ったので、良い勉強になりました！
* Chrombookは非常に使いやすくて、開発環境が整わないことが大きなデメリットだったのですが、ubuntuを利用できるようになったことで、これから可能性が広がっていくと嬉しいです
* 業務ではなかなかコーディングすることが減ってしまったので、プライベートで自分がほしいものをこれからちまちま作っていこうかと思います
[Unity] Project Tinyでのミニゲーム作成 - プロジェクト作成とDOTSモード

# 作成したもの

Project Tinyでシンプルなランゲームを作成しました。
Chromeのイースターエッグの"[T-Rex dinosaur game](chrome://dino/)"(chrome://dino/)を真似て作りました。

プロジェクトデータはGitHubにて公開しています。
ライセンスはMITです。
[https://github.com/chocolate-ice-cream/TinyRun](https://github.com/chocolate-ice-cream/TinyRun)

## 開発環境

- Windows 10 Home
- Unity2019.2.0b10
- Project Tiny 0.16.1 preview

## あそびかた

リポジトリのREADME.mdを参照してください。
[https://github.com/chocolate-ice-cream/TinyRun/blob/master/README.md](https://github.com/chocolate-ice-cream/TinyRun/blob/master/README.md)


## この記事について

Project Tinyでミニゲームを作成時に使用した機能やトラブルをいくつかに分けて説明していきます。
今回はプロジェクト作成とDOTSモードについてです。

## Project Tinyのプロジェクト作成手順

**Project Tinyのインストール**
Project TinyはUnityのPackage Managerからインストールします。
Project Tinyをインストール後、Burstのパッケージでエラーが出ます。
![PackageManager_Error.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490737/22350b6c-8a38-e4c3-8233-fd5a45c54fb3.jpeg)

その場合はBurstのパッケージを1.1.2にアップデートします。
![PackageManager_UpdateBurstJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490737/ebd53344-d110-734b-77b3-5e856c253107.jpeg)

**Prject Tiny用プロジェクトデータ作成**
メニューから[DOTS] -> [New Projet...]を選択します。
![DOT_SelectDOTSMenu.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490737/50e6500c-6c8d-2fca-6162-40ed02519bc4.jpeg)

ダイアログが表示されるので、任意のフォルダに任意のファイル名をつけて保存してください。
プロジェクト作成が終了すると、エディタが"DOTSモード"という今までとは少し違った表示に変わります。
![DOT_DOTSMode.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490737/710c287a-dd42-c478-d953-eafb846c2a8a.jpeg)

これでPrject Tiny用プロジェクトデータ作成は完了です。
あとはこのプロジェクトにアセット、コンポーネント、システムを作成しゲームを作っていきます。

## DOTSモード

**DOTSモードとは?**
Project TinyはGameObjct,MonoBehaviourを使用した開発環境とは違い
DOTS環境で構築されており、エディタも"DOTSモード"という専用の表示に変わっています。
詳細については[こちら](https://forum.unity.com/threads/project-tiny-c-preview-0-15-3-available.688969/)の0.15.3リリース時のフォーラムのアナウンスを確認してください。

**操作方法**
Entityを作成しそこにコンポーネントを追加、プロパティの値や参照を設定するという、
シーンを作成する基本的な部分はそんなに変わらなかったりします。
なので、"DOTSモード"といっても実際は今までと同じような感覚で作業ができます。

## DOTSモードで戸惑った・不便だった点

**Entityのアクティブ、非アクティブの扱い**
Entityは非アクティブにするとDisabledコンポーネントが追加され、
アクティブにするとDisabledコンポーネントが削除されます。
EntityはGameObejctのように自身のアクティブの状態を保持するプロパティを持っていないため、
Disabledコンポーネントの有無でアクティブ状態を判別しています。
最初これを知らなかったため、自分は少し戸惑ってしまいました。

**一部のコンポーネント以外のプリセットのEntityが作成出来ない**
プレビュー版なので仕方ない部分だとは思いますが、メニューから作成できるのが
"Audio Source","Camera","Sprite","Canvas"のみなのはやはり不便でした。
特にUI用のテキストについては"RectTransform""Text2DStyleBitmapFont","Text2DRenderer",
"Text2Dstyle","TextString"といくつものコンポーネントが必要なためなかなか手間でした。

**実行時にSceneビュー、Gameビューでの確認が出来ない**
通常のエディタでPlayボタンを押すとGameビューで確認できますが、
DOTSモードではビルドを行い実際に作成されたものを実行します。
なので、HierarchyでEntityを選択しコンポーネントの値を確認しながらといったようなことが出来ず
調整やデバッグに苦労しました。

## 感想

Project Tinyが0.15.3からC#の使用が可能になり、ECSの勉強も兼ねてミニゲームを作ってみました。
わかってはいたことですが、プレビュー版のため使用できる機能が少ないので
Project Tinyでゲーム開発を行うのはまだ時期尚早かなというのが率直な意見です。
開発に関するネット上の情報が全くないため、開発中に詰まった場合の情報源は
ドキュメントとUnity Forumしかないのもなかなかつらいところでした。

反省点としてECSでの開発が初めてだっため、コンポーネントや処理がとっちらかってる感じが否めません。
特にマウス・キーボードの入力周りで場当たり的な実装をしてしまっている箇所が多く、
今後の開発では改善していきたい部分です。

前述したように情報が全く無いので、今後Project Tinyを使ってゲーム開発をする人の参考になるよう
使用した機能の説明やハマったポイントを記事にして公開したいと思います。
Android Studioでプロジェクト作成からGithub連携→プッシュまで

いつも忘れてしまうので備忘録的に記載していきます。

今回の作業としては
・1 AndroidStudioでプロジェクト作成
・2 GitHubでリポジトリ作成
・3 リポジトリへコミット→プッシュ
　・1 メインアカウント使用の場合
　・2 サブアカウント使用の場合

以上をまとめていきます。

今回AndroidStudioでの工程ですが、
IntelliJ系であればほぼ共通して使えると思います。

Mac・Windowsどちらでもいけるはずです。

# AndroidStudioでプロジェクト作成
特別なことはしません。
ようこそ画面から[Start a new Android Studio Project]を選択して好きな構成でプロジェクトを作成します。

# GituHubリポジトリの作成
ビルドが完了して後、上部メニューにから
VCS→inport into Version Control→Share Project on GitHubを選択してリモートリポジトリの作成を行います。
リポジトリ名、アカウント名、プライベート設定するかのチェックなどがあるのでそちらを設定します。

# コミット→プッシュまで
ここからが分かれます。

## メインアカウントの場合
ここでのメインアカウントは[ユーザー名]/.gitconfigに記載されているアカウントとします。

```[ユーザー名]/.gitconfig
[user]
    name = {アカウント名}
    email = {メールアドレス}
```

ここのアカウントがメインアカウントになります。
コミットやプッシュなどまずはここのアカウントを基準として行われます。

####確認できたらコミット→プッシュ
先ほど作成したリモートリポジトリのアカウントとメインアカウントが一致していれば
リモートリポジトリ作成後、すぐに最初のコミットするか求められるのでそのままコミットしてしまいます。
コミット成功したらそのままプッシュもいけるはずです。これで終わり。

## サブアカウントの場合
やむを得ない事情でメインのアカウントとは別のサブアカウントを作成することがあると思います。

例えば
仕事用アカウントとプライベートのアカウントが分かれているけど
社用PCからプライベートのアカウントを使用したい…

そんな時の手順です。

### コミットはキャンセル
リモートリポジトリ作成後の最初のコミットはキャンセルします。
**そうでないとメインアカウントでコミットすることになってしまうためです。**

### プロジェクトにGithubのローカル設定を行う
[ここ](https://qiita.com/0084ken/items/f4a8b0fbff135a987fea)を参考に行いました。

AndroidStudio内のターミナルから

```
git config --local user.name “{サブアカウント名}”
git config --local user.email “{サブアカメールアドレス}”
```

上記コマンドを実行します。
これでこのプロジェクトにおけるコミットはここで設定したアカウントで行われます。

[プロジェクト]/.git/configに.gitconfigと同じように記載がされているかと思いますので確認してみてください。

### SSH鍵認証を導入する
多分鍵入れずともいけるのかもしれませんが確実なので認証して行う方法にします。

#### 鍵を作成
[ここ](https://qiita.com/uni-3/items/9f303bae952da74f25e3)を参考にしました。

ターミナルで

```
cd ~/.ssh
ssh-keygen -f {ファイル名} -t rsa -C “{メールアドレス}“
```

これでSSH鍵ファイルが作成されます。
~/.ssh内に{ファイル名}.pubファイルがあるかと思うのでそちらの中身をコピーします。

Windowsで~/.sshディレクトリがない場合は作ってしまいましょう

#### Githubに鍵を登録
GitHubログイン後右上メニューから
Settings→SSH and GPG Keys→New SSH Keyを選択して先ほどの中身を貼り付けます。

#### configに設定
ターミナルから

```
vi ~/.ssh/config
# {ユーザー名} github
Host github-{ユーザー名}
  HostName github.com
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes
  IdentityFile ~/.ssh/{ファイル名}
```

Windowsでviコマンド使えない場合は直にファイル作って内容記載でもいけます。

#### configの設定の登録
ここからまたAndroidStudio内のターミナルから作業します。

```
git remote set-url origin git@github-{ユーザー名}:{サブアカウント名}/{リポジトリ名}.git
```

これで先ほどのconfigの設定が反映されました。

#### コミット→プッシュ
コミットは最初にキャンセルしてしまていると思うので左メニューのProjectのプルダウンをProjectに変えて適宜addしていきます。
その後でコミット→プッシュでサブアカウントでのコミットプッシュが通るかと思います。

お疲れ様でした。
LINEのMessaging APIを使ってニュース・お天気Botを作ってみた（The Daily Informant）

## 開発の経緯
以前から挑戦しようと思っていたのですが、公式のドキュメンテーションが初学者である自分にとってすこし理解しづらく、なかなかやる気になれませんでした。しかしちょっとしたインターンの課題で簡単なLINE Botを作ったのをきっかけにやる気が再燃し、前に[DiscordのHack Week向けに作ったBot](https://github.com/AneurysmByCringe/the-daily-discord)をLINEでも作ることにしました。

## 環境
- Python 3.7.4
- Flask 1.1.1
- line-bot-sdk-python 1.14.0
- requests 2.22.0
- 最終的に外部でホストできるように[Heroku](https://www.heroku.com)
- ローカルでBotのテストができるように[ngrok](https://ngrok.com)

## その他必要なもの
- ローカルでBotのテストができるように[ngrok](https://ngrok.com)
- LINE Developers Consoleで取得できる個別のトークンとシークレットコード。
- [NewsAPI](https://newsapi.org)を使用しているため、NewsAPIのAPIキー
- [OpenWeatherMap](https://openweathermap.org)のAPIキー

## 構造
- `main.py`：入力内容に反応し、メッセージを返信する。
- `newsFetcher.py`：NewsAPIからヘッドラインのJSONを取得し、LINEのカルーセルに表示できるようヘッドラインの個数を10個までに減らす。
- `weatherFetcher.py`：OpenWeatherMapから3時間ごとの天気をJSONで取得し、LINEのカルーセルに表示できるよう天気情報を10個に絞る。

## コード
[GitHub](https://github.com/AneurysmByCringe/the-daily-informant-line)に載せてあるのでご自由にどうぞ。（ほとんど英語表記になっています、ご了承ください）

## 引っかかった点など
- カルーセルの個数・文字数制限：LINEのカルーセルはボックスを最大で10個までしか表示することができません。その上、各ボックスに含まれるタイトルや説明欄の文字数が今回の記載予定の内容にとっては厳しく、表示させる内容をどうするかかなり悩みました。
- `replyToken`が発行されるタイミング：`Invalid reply token`のエラーに何度出くわしたことか。ドキュメンテーションをしっかりと読むべし。
- `newsFetcher.py`と`weatherFetcher.py`で取得するJSONのトリミング：上記で説明したカルーセルの制限に対応すべく、あらかじめJSONデータの要素を減らす必要がありました。これは最早ループがちゃんと使えるかの問題だったのですが、条件などを正しく設定するのにかなり時間を費やしました。

## リザルト
"Informant"と入力し送信すると、Bot側から「ニュース」か「天気」の選択肢がQuickMenu形式で与えられます。ニュースを選ぶと日本の主なヘッドラインを10個、天気を選ぶと位置情報を送るよう促され３時間毎の天気を10個表示してくれます。（2枚目のサムネイルが表示されていませんが、ちゃんとお天気のアイコンが表示されます。）
<img width="320" alt="IMG_0041.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402320/74e835fa-7ebb-fbbb-c103-747221fb3556.png">
<img width="320" alt="LINE_capture_591422249.534186.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402320/4c9206a0-8a90-b899-337e-65bc26c4b4e1.jpeg">

## 改善したい点
はっきり言ってたくさんありますが主にこれらを優先したいです（笑）。

- ニュースのバリエーションを増やしたい：NewsAPIは単にヘッドラインをJSONで返してくれるだけでなく、ソース別やトピック別などにニュース情報を提供してくれる本来はなかなか情報豊富なAPIです。今回は表示の簡素化を優先し、日本の主要トピックに限定しましたが、今後はさらにQuickMenuなどを活用してニュースの対象地域やトピックを選択してニュースを表示させることができるようにしたいと思います。（JSON取得は難しくないがカルーセル以外の表示方法でないとエラーに対処できない）
- 天気情報の時間が世界標準時になっている：文字通りです。理想は位置情報などから時間帯を判別し、それを天気に表示させたいと思います。
- 時間を指定してニュースや天気情報をプッシュ送信できるようにしたい：これは自分にとってハードルが一気に高くなりますが、できるようになれば利用価値がかなり上がるんじゃないかと思っています。

##　テストしたい方
よろしければ以下のQRコードから友達登録して使ってみてください（英語表記です、ご了承ください）。Herokuの無料Tierでホスティングしているためスリープ状態になっている場合があります。その場合は応答に少し時間がかかるのでお待ちください。
![qrcode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402320/dd555209-e068-c6b8-57bf-357a27a34a59.png)

## 参考になった記事など
- [LINE Messaging API SDK for Python](https://github.com/line/line-bot-sdk-python)
- [Pythonを使って位置情報から天気予報を送るLINE Botを作った！](https://qiita.com/Ryuu98/items/905b200aa0b5f7262465)
- [[LINE BOT]スムージーに合うプロテインを教えてくれるLINE BOTを作った](https://qiita.com/zerozeronineking/items/78fc1860d8726944f0f0)
- [Python, LINE APIを使ってbotを作成する](https://qiita.com/connectcrew-ishii/items/830af1827e7788e557d3)
access2000 memo

# 概要

access2000のメモです。

# フォームとテーブル、クエリーの関連付け

フォームのフッターの下、辺りでプロパティを開く。
レコードソースを確認。

# スタートアップフォームを回避。

shiftキーを押しながら、ダブルクリック。

# レコードセットをxmlで受け取る。

saveして、openする。

# テーブルのコピペ。

両方、開いて、ドラッグしてリリース。

# フォームの背景。

ピクチャで、画像を指定できる。

# フォームのテキストボックスを非表示にする

「可視」を「いいえ」

# コンボボックスで、コード化。

表示コントロール： コンボボックス
値集合タイプ： 値リスト
値集合ソース： 1;男;2;女;
連結列： 1
列数： 2
列見出し： はい

# どうするバリデーション。

更新前処理のイベントプシージャで、いろいろ、やる。

# insert

ボタンのイベントでsqlを発行。

# フォームに引数を渡す。

DoCmd.OpenForm "form2", , , , , , "あいうえお"
me.openargsで受け取り。

# 同じ更新を別のテーブルにも。

更新ボタンを作って、update sqlを発行。

# 以上。
論理演算

追記1：2023/02/17 radare2での２進数での論理演算を追加

## Pythonによる10進数での論理演算の例

AND

```python:python
>>> 0&0
0
>>> 0&1
0
>>> 1&0
0
>>> 1&1
1
```

OR

```python:python
>>> 0|0
0
>>> 0|1
1
>>> 1|0
1
>>> 1|1
1
```

XOR

```python:python
>>> 0^0 # 元の数は変わらない
0
>>> 0^1 # 元の数がひっくり返る
1
>>> 1^0 # 元の数は変わらない
1
>>> 1^1 # 元の数がひっくり返る
0
```

## radare2による2進数での論理演算の例
radare2起動
```bash
└─$ r2 -
 -- It's the year of radare2 on the desktop
```
AND

```bash
[0x00000000]> ? 1100b & 1111b
int32   12
uint32  12
hex     0xc
octal   014
unit    12
segment 0000:000c
string  "\f"
fvalue  15.0
float   0.000000f
double  0.000000
binary  0b00001100 <---ここ
ternary 0t110
```

OR

```bash
[0x00000000]> ? 1100b \| 1111b
int32   15
uint32  15
hex     0xf
octal   017
unit    15
segment 0000:000f
string  "\x0f"
fvalue  15.0
float   0.000000f
double  0.000000
binary  0b00001111 <---ここ
ternary 0t120
```

XOR

```bash
[0x00000000]> ? 1100b ^ 1111b
int32   3
uint32  3
hex     0x3
octal   03
unit    3
segment 0000:0003
string  "\x03"
fvalue  15.0
float   0.000000f
double  0.000000
binary  0b00000011 <---ここ
ternary 0t10
```
おまけ
「~」でgrepして結果の行のみ表示できる
```bash
[0x00000000]> ? 1100b & 1111b ~binary
binary  0b00001100
[0x00000000]> ? 1100b \| 1111b ~binary
binary  0b00001111
[0x00000000]> ? 1100b ^ 1111b ~binary
binary  0b00000011
```
AppGoatで学ぶメモリリーク

# AppGoatの概要

以下のコードを例に、プログラムで確保したメモリを解放せずにリターンするとメモリリークするから気を付けよう!!
という内容となっています。
→メモリを確保した後return 1している個所がそれです。

```c++:MemoryLeak.cpp
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int makeFile( char *fileName, int size )
{
    FILE *fp;
    char *pData;

    // メモリを確保
    pData = malloc( size );
    if( pData == NULL )
        return 1;

    fp = fopen( fileName, "wb" );
    if( fp == NULL )
        return 1;

    // ファイルに空白(0x20)を書き込み
    memset( pData, 0x20, size );
    fwrite( pData, size, 1, fp );
    fclose( fp );

    // メモリを解放
    free( pData );
    return 0;
}
```

決して悪い内容ではないのですが、
他の言語でのメモリリークとの付き合い方を纏めた方が良いなと感じたのでそちらにシフトします。

# C#の場合

GCがよしなにやってくれる!!で終わらせる層が一定数いると思いますが、逆に言うとGCが求めるタイミングで動いてくれません。
.NETが管理していない、アンマネージリソースを扱う場合は自前で解放する必要があります。
アンマネージリソースの例:ファイル、ウィンドウ、ネットワーク接続、データベース接続など(いわゆるOSリソース)

詳しくは以下を参照ください。
https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/unmanaged

アンマネージドリソース以外だと、Subscribeなどを利用したイベント購読を行う場合もDisposeを行う必要があります。

補足：.Netには「メモリ使用量の分析」機能があるのでそちらに頼るのもありかもしれません。
https://docs.microsoft.com/ja-jp/visualstudio/profiling/analyze-memory-usage?view=vs-2019

# Pythonの場合

Pythonは明示的にGCを利用する事が出来ます。
https://docs.python.org/ja/3/library/gc.html

コードサンプル

```python:gc.py
import gc

gc_test = ["gc del test"] * 100
del gc_test
gc.collect()
```

リファレンスを読み込むと、gc.garbageという**GCが解放する事ができないオブジェクトのリストを返す**メソッドが見つかったりと発見が多いです。
※Python 3.4以降、NULLでないtp_del スロットを持つ C 拡張型のインスタンスを使っている場合を除き、このリストはほとんど常に空であるとの事です。一般的なPythonの使い方をしている内は特段意識する必要はなく、自前拡張機能を作った時だけ気にすれば良さそうです。もしくはPythonアップデート時とか。

# Goの場合

Goの場合、プログラムにdefer profile.Start(profile.MemProfile).Stop()を仕込んでmem.pprof(文字通り、メモリプロファイル)を生成し、
解析するのが一般的な手法なのかなと思います。
※違う等あれば、教えていただけると大変ありがたいです。。。

pprofを利用してメモリリークを調査した事例がこちら。
筆者の方はGoでblockchainを構築している方とのこと。
https://www.freecodecamp.org/news/how-i-investigated-memory-leaks-in-go-using-pprof-on-a-large-codebase-4bec4325e192/


# Swiftの場合

クラスメソッド先生がXCodeで行うメモリリークチェック方法がまとめられていたのでリンクを張るだけにします。
https://dev.classmethod.jp/etc/ios-memory-leak-check-and-prevent-190508/

# まとめ

各言語それぞれメモリリーク対策の色があって面白いです。
最近流行りの言語では
・標準ツールとして提供している
・IDEと一心同体の言語はIDE側にリッチな機能が備わっている
傾向があるのかなと感じました。

これから出てくる言語が流行るかどうかの指針になるかも。

一読くださりありがとうございました。
初心者によるプログラミング学習ログ114日目

#100日チャレンジの114日目。

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

114日目は、



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます。<br>114日目です。<br><br>コードは一行も書いていませんが、webデザインのほうを少し。<br>チュートリアルをみながら、自分で撮った写真をPhotoshopで加工してみた<br>・レトロ調<br>・手書き風<br>・一眼レフで撮ったようなぼかし<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#webデザイン</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1178070888572321798?ref_src=twsrc%5Etfw">September 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

* コードは一行も書いていません
* Photoshop、チュートリアル
* 自分が撮った写真をつかって、レトロ調、手書き風、一眼レフで撮ったようなぼかし効果


を学習しました。


## photoshopでも模倣学習

プログラミングの模写学習は有効ですが、Photoshopでも同様に有効です。
チュートリアルをみながら、自分が撮った写真や画像とかつかうのもいいです。（公開はしませんが・・・）

Photoshopは機能が多彩にあるので、いろいろな機能を自分の写真とか使って弄ると覚えるかもしれません。



↓のブログもやってます。
[ぱぺまぺのwebクリエイター化計画](engineer.ppmp556.com)
react-visibility-sensorを使って、ブラウザの表示領域内に入っている時だけ動くコンポーネントを作る

## react-visibility-sensorとは

[react-visibility-sensor](https://github.com/joshwnj/react-visibility-sensor) は、そのコンポーネントがブラウザの表示領域に入っているかをチェックしてくれるライブラリです。

このライブラリを使うことで、ブラウザ上で見えている場合にだけ、動作するコンポーネントを作ることができます。

サンプル: https://github.com/geekduck/visibility-sensor-sample

## デモ1

コンポーネントが表示領域内(白色の領域)に存在している場合にだけ、

タイマーで現在時刻を更新するコンポーネントを作ってみました。

![600-30fpx.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16039/2d798986-fab4-cdc1-7cdb-c6535a2fb1c2.gif)

#### サンプルコード

コンポーネントが表示領域に出たり入ったりするたびに、`VisibilitySensor`の`onChange`に渡した関数が実行されます。

```react
const CurrentTimer = () => {
    const [currentTime, setCurrentTime] = useState(new Date());
    const [timerId, setTimerId] = useState(0);

    useEffect(() => {
        return () => clearInterval(timerId); // タイマーの後始末
    }, [timerId]);

    const onChange = (isVisible) => {
        if (isVisible) {
            // このコンポーネントが表示されている場合、タイマーで現在時刻を更新する。
            setTimerId(setInterval(() => {
                setCurrentTime(new Date());
            }, 10));
        } else {
            // このコンポーネントが表示されていない場合、タイマーを削除して現在時刻を更新しない。
            clearInterval(timerId);
            setTimerId(undefined);
        }
    };

    return (
        <VisibilitySensor
            onChange={onChange} // コンポーネントの表示状態が変わるたびに実行される
            partialVisibility={true} // 表示領域にちょっとでも入っていたらisVisible=trueと判定させる。
            offset={{top: 100, bottom: 100}} // 見た目でわかりやすいように、上下100pxの範囲は表示領域外にする。
        >
            <div className="CurrentTimer">{dayjs(currentTime).format('YYYY/MM/DD HH:mm:ss.SSS')}</div>
        </VisibilitySensor>
    );
};
```



## デモ2

`VisibilitySensor`コンポーネントの子要素として、関数を渡すこともできます。

```react
return (
    <VisibilitySensor
        onChange={onChange} // コンポーネントの表示状態が変わるたびに実行される
        partialVisibility={true} // 表示領域にちょっとでも入っていたらisVisible=trueと判定させる。
        offset={{top: 100, bottom: 100}} // 見た目でわかりやすいように、上下100pxの範囲は表示領域外にする。
    >
        {
            ({isVisible}) => isVisible
                ? <div className="CurrentTimer">{dayjs(currentTime).format('YYYY/MM/DD HH:mm:ss.SSS')}</div>
                : <div className="CurrentTimer"/> // 表示されていない場合は、子要素を表示しない。
        }
    </VisibilitySensor>
);
```

この場合、関数の引数として`isVisible`が取得できるので、

表示されていない場合は空の`div`要素を表示して、renderの負荷を下げるコードが書けます。

![600-30fps-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16039/01093325-dad4-89d3-4cdf-01ad409f195b.gif)


## 類似のライブラリ

表示領域外のコンポーネントをrenderしないライブラリとして有名なものは、[react-window](https://github.com/bvaughn/react-window)や、[react-virtualized](https://github.com/bvaughn/react-virtualized)があります。

大量のコンポーネントをリスト形式で表示する際は、これらのライブラリを使う方が適切です。


### 参考

https://reactjs.org/docs/optimizing-performance.html#virtualize-long-lists
CentOS 7にPHP 7.2をインストール（IUS Community Project）

# はじめに

IUS Community Projectを利用してCentOS7にPHP7.2をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Usage - IUS](https://ius.io/usage)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2020-11-30がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
... 略

# yum install -y mod_php72u php72u-cli which
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.2.22 (cli) (built: Aug 30 2019 15:12:58) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

# yum info mod_php72u
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : mod_php72u
Arch        : x86_64
Version     : 7.2.22
Release     : 1.el7.ius
Size        : 10 M
Repo        : installed
From repo   : ius
Summary     : PHP module for the Apache HTTP Server
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : The mod_php72u package contains the module which adds support for the PHP
            : language to Apache HTTP Server.

# yum info php72u-cli
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php72u-cli
Arch        : x86_64
Version     : 7.2.22
Release     : 1.el7.ius
Size        : 15 M
Repo        : installed
From repo   : ius
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.
```
【RPA】Automation Anywhere XMLコマンド

#XML コマンドの使い方
今回はXMLコマンドです。XMLコマンドはウェブにより生成されたXML、HTMLの情報を処理することに使われます。

##XMLコマンドの中身

- Start XML Session・・・使用したいデータソース (ファイルまたはテキスト) を指定します。

- End XML Session・・・使用したデータソース (ファイルまたはテキスト) を閉じます。
※XML セッションの開始 操作を補完します。

- Insert Node・・・ノードを挿入する。

- Delete Node/Attribute・・・ノード/属性を削除する。 

- Update Node(s)・・・ノードを更新する。  

- Validate XML Document・・・XML 文書を検証する。 

- Get Node(s)・・・ノードを取得する。 

- Save Session Data・・・セッションデータを変数に保存する。 

- Execute XPath Function・・・XPath 関数を実行する。結果を変数に代入します。


## ノードを取得してみる
今回はノードを取得し、メッセージボックスに出力までやってみます。
まずはこの内容のXMLファイルを用意します。
今回ファイルはMyDocsに置いておきます。

```
<?xml version="1.0" encoding="Shift_JIS"?>


<buildings title="東京情報大の建物一覧">

<building id="1">
  <name>本館棟</name>
  <floor>7</floor>
  <comment>講義室、演習室、事務局、ゼミ室</comment>
</building>

<building id="2">
  <name>体育館棟</name>
  <floor>2</floor>
  <comment>アリーナ、トレーニングルーム</comment>
</building>

<building id="3">
  <name>学術フロンティア共同研究推進センター</name>
  <floor>3</floor>
  <comment>「社会環境」「自然環境」「環境情報システム開発」の国際共同研究の拠点</comment>
</building>

</buildings>
```

ではワークベンチのXMLコマンドでStart XML Sessionのウィンドウを開きます。
![XML.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395789/8587428f-3629-adba-0c7b-60c0213e4426.jpeg)

File Pathの「・・・」からファイルへのパスを指定し、セーブします。


次にGet Node(s)のウィンドウを開きます。
![XML2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395789/5889996c-d174-6738-92af-e0f17362cdde.jpeg)

XPath Expressionで取得したいノードを指定します。初めにid="1"の部分のノードすべてを取得しようと思うので
`building[@id='1']`
を入力します。格納する変数は用意しているvalue型変数Prompt-Assingmentを使用します。

![XML3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395789/970df42c-5b03-c598-0a97-b1ee411dc8c8.jpeg)

こちらでセーブし、メッセージボックスも用意します。

![XML4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395789/b16c3965-6ca1-d82f-b6d6-a5d5502d4e56.jpeg)

実行してみましょう！

![XML5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395789/99419f80-2d9d-0f1a-d880-526794656944.jpeg)

無事にでました。

つぎはid="2"のcommentの部分のみ取得します。

`building[@id='2']/comment`

に変えて実行します。

![XML6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395789/a6bcccc0-e32b-03ec-71e8-89202a1f07c1.jpeg)

うまくいきました！

他にもいろいろできますので是非試して下さい！
今回は以上です。

最後まで読んでいただき、ありがとうございました！
.NET Core 3.0のBlazor + ElectronでGUIアプリ開発

※本記事は[私のBlog](https://blog.piyosi.com/entry/2019/09/27/222327)に書いたものの焼きまわしです。

[Electron.NET](https://github.com/ElectronNET/Electron.NET)を使って.NET Core 3.0のBlazorをElectron上で動かしてみました

## 環境

今回の環境はこちら

- .NET Core 3.0.100
- Nodejs 12.10.0
- ElectronNET.API 5.22.14
- ElectronNET.CLI 5.22.14

## 作成手順

以下のコマンドでBlazorのプロジェクトを作成します。  
プロジェクトに`ElectronNET.API`のPackageを追加します。

```cmd
dotnet new blazorserver -o BlazorOnElectron
cd BlazorOnElectron
dotnet add package ElectronNET.API
```

`Program.cs`と`Startup.cs`に2行ずつ追加します。

##### Program.cs

```diff
using System;
// 途中省略
+ using ElectronNET.API;

namespace BlazorOnElectron
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
+                   webBuilder.UseElectron(args);
                    webBuilder.UseStartup<Startup>();
                });
    }
}
```

##### Startup.cs

```diff
using System;
// 途中省略
+ using ElectronNET.API;

namespace BlazorOnElectron
{
    public class Startup
    {
        // 途中省略

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            // 途中省略

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });

+           Electron.WindowManager.CreateWindowAsync();
        }
    }
}
```

`ElectronNET.CLI`をインストールします。  
インストール後、`init`コマンドで初期化を行います。

```cmd
dotnet tool install ElectronNET.CLI -g
electronize init
```

初期化が完了すると`electron.manifest.json`が生成されるのと、  
`Properties\launchSettings.json`に起動用Profileの設定が追加されます。  

以下のコマンドで起動します。

```cmd
electronize start
```

![2019-09-27-21-57-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375564/e8ed9146-9f37-0b4c-abed-ab01d885436e.png)

おぉ～

`electronize build /target win`でビルドしてみると`resources\bin`以下にBlazor一式が入る感じなんですね。

## おわり

Electron + Blazorってかなり尖ってますね。。

以上です。
[Elm] Portで`Cannot read property 'hogehoge' of undefined`にハマった件について

## Portとは
Elmとjsがやりとりするための構文。
以下はElmからjsにアクセスする簡単なコード。

#### Elm側

```elm
port hello : String -> Cmd msg
```

#### js側

```javascript=
app.ports.hello.subscribe(() => {
  console.log("Hello!")
});
```



## Cannot read property 'hello' of undefined

ElmでPortを使っていると、1度はこのエラーを目にしたことがあるだろう。
このエラーは、**js側にPort処理を書いてあり、Elm側に対応するPortが存在しない**場合に起こる。

私がこのエラーに遭遇し解決しようとした時のエピソードがこちら↓
![](https://i.imgur.com/CvcLzEO.jpg)



## エラーの原因

結論、原因は**そのPortが使われていないから**だった。
Elmではどこでも使われてないものはコンパイルで弾かれるらしい。なるほどなぁ〜


## まとめ

`Cannot read property 'hogehoge' of undefined`に遭遇したら以下を確認すること

- Elm側にそのPortは存在するか？
- Elm側のPort名がタイポしていないか？
- Elm側のPortはどこかで呼ばれているか？ (<- New!)