OmniAICreator/Qiita-1.07M huggingface dataset:
サブディレクトリでもnpmコマンドを複数同時に実行したい

# npm-run-all examples

実装は以下のリポジトリにおいてあります。
https://github.com/algas/npm-run-all-example

## 背景

node.js でカレントディレクトリだけではなくサブディレクトリでも同じコマンドを同時に実行したいことがあります。
例えば、下記のようなディレクトリ構成の時に `parent`, `child`, `child2` で同時に `npm install` や `npm test` などのコマンドを実行したい場合です。

```
parent/
|- package.json
|- child/
   |- package.json 
|- child2/
   |- package.json 
```

## サブディレクトリで npm コマンドを実行する

`npm install --prefix (SUB_DIRECTORY)` のように `--prefix` オプションでサブディレクトリを指定することで、サブディレクトリの `package.json` で定義されている、またはデフォルトで使える npm コマンドを実行することができます。
サブディレクトリの数が少ない場合には上記のオプションを使えば、同時にコマンドを実行できます。
しかし、多くのサブディレクトリがある場合には、並列に実行したり実行順番や実行結果の成功を担保するようにコマンドをつないで行くのは容易ではありません。

## npm コマンドを複数同時に実行する

`npm-run-all` という npm パッケージを使うと、複数の npm コマンドを逐次・並列実行するのが容易になります。
https://github.com/mysticatea/npm-run-all

例えば、`lint` と `build` という npm コマンドが使える場合には以下のコマンドで同時に実行できるようになります。

- 逐次実行: `npm-run-all -s lint build`
- 並列実行: `npm-run-all -p lint build`

`npm-run-all` 以外にも [lerna](https://github.com/lerna/lerna) などのパッケージがありますが、「npm コマンドとして実行したい」という今回の目的にそぐわないので使わないことにしました。

## サブディレクトリでも同時に npm コマンドを実行する

`--prefix` オプションと `npm-run-all` を組み合わせることによってサブディレクトリでも同時に npm コマンドを実行することができるようになります。
汎用的にコマンドを実行するために下記のようなラッパーコマンドを用意しました。

```package.json
{
  "scripts": {
    "all-install": "npm-run-all -p \"prefix:* -- install\"",
    "all-test": "npm-run-all -s \"prefix:* -- test\"",
    "all-p": "npm-run-all -p \"run:* -- {@}\"",
    "all-s": "npm-run-all -s \"run:* -- {@}\"",
    "all-p-hello": "npm run all-p hello",
    "all-s-hello": "npm run all-s hello",
    "prefix:self": "npm --prefix ./",
    "prefix:child": "npm --prefix ./child",
    "prefix:child2": "npm --prefix ./child2",
    "run:self": "npm --prefix ./ run",
    "run:child": "npm --prefix ./child run",
    "run:child2": "npm --prefix ./child2 run",
    "hello": "echo \"Hello world\"",
    "test": "echo \"Test\""
  }
}
```

## コマンド概要

- `npm run all-install`: `npm install` をすべて(parent, child, child2)のディレクトリで実行します。
- `npm run all-test`: `npm test` をすべて(parent, child, child2)のディレクトリで実行します。
- `npm run all-p`: 任意の npm コマンドをすべて(parent, child, child2)のディレクトリで並列実行します。
- `npm run all-s`: 任意の npm コマンドをすべて(parent, child, child2)のディレクトリで逐次実行します。

## 注意点

- 同じコマンドを同時に実行するには child, child2 以下の `package.json` にも `npm script` を定義する必要があります。
- `all-s` の実行順を厳密に定義するには、本記事の例のように `*` を使わずに直接すべてのディレクトリの順番を明示すべきです。
- 「シェルスクリプトやその他の言語でスクリプトを書けばいいのに」というツッコミは受け付けておりません。
Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreExceptionの原因と解決

#問題
Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException

##原因
Xmlファイルに日本語入力のスペースが入っている

##例文
7行目の『value』の前の赤い点線が日本語入力のスペースが入っていることを示している。
このスペースがエラーの原因。

```xml:filename.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="bean1"  class="com.tuyano.libro.SampleBean">
	<property name="message" 　value="Hello this is Bean Sample!" />
	</bean>
</beans>
```

##解決
日本語スペースを見つけ出し取り除いてやる。

##方法
xmlファイルを開いてひたすら日本語スペースを探す、見つける、スペース削除。完了。
（アナログ感は否めない。。）
webauthn 実装参考資料まとめ

# 対応するための参考記事
webauthnがW3C勧告されたので、実装前に読ませてもらうメモのまとめ
https://www.w3.org/2019/03/pressrelease-webauthn-rec.html
https://www.w3.org/TR/webauthn-1/

## webauthnを一言でざっくり
パスワードを利用せず、デバイスや生体認証、FIDOセキュリティキーを用いた認証

## 導入前知識
WebAuthn の利用/実装パターンを考える
https://qiita.com/ritou/items/e32239dd482e8dc765d6

Web Authentication API の裏側と、なぜそうなっているのかを図解した
https://qiita.com/kyrieleison/items/3dbb8ece94572dc3e962

## 導入、実装時参考資料
対応ブラウザ
https://caniuse.com/#feat=webauthn

W3Cドキュメント
https://w3c.github.io/webauthn/

Yahoo! JAPANの取り組み（これ見れば実装できそう）
https://techblog.yahoo.co.jp/advent-calendar-2018/webauthn/

## ライブラリ、デモ
https://github.com/w3c/webauthn
https://github.com/google/webauthndemo

## 導入後に気をつけるべきこと
認証をwebauthnのみで構築している場合、デバイス紛失等でリカバリーが大変！

WebAuthn など新しい認証方式を受け入れる際の「アカウントリカバリー」の考え方
https://qiita.com/ritou/items/20679287600b61b124fc

## 期待と楽しみ
まだ勧告さればかりなのでどの程度、どのように普及するのか楽しみ。
パスワードにうんざりしていたので、導入後のリカバリー問題で結局パスワード頼りになりそうかな？と思いつつ、
回避策がどんなのが出てくるのかも楽しみ。
Figma Web APIについて

# はじめに
最近ちょくちょく耳にするようになった`collaborative interface design tool`の`Figma`が`Open JSON Format`形式の`Web API`が用意されているので、それを触ってどんなことができそうか調べたメモです。

# なぜやってみようと思ったか
今までデザインツールのpluginを書く場合は、そのツール独自の言語だったり、特定言語だったりと、そのツールに依存していました。(Sketchであれば`CocoaScript`)
今回気になった理由の一つとして`Web API`でありかつ`Open JSON Format`だということでした。
`WebAPI`でJSONなら言語とかをそこまで気にしなくてもよいじゃないですか！

エコシステムを育てようとしている感じあり、今後どんどん広まっていきそうな気がしています。
そして **単純に共同作業が可能なデザインツールっていうだけじゃなく、デザインを実際に実装する部分までのフロー** も変わっていくのではないかと思ったりしてます。

# どんなことができそうか？
- html/css/ios/android などのlayoutのExporter
- ガイドラインページを自動更新
- デザインLint(ガイドラインと異なる色を使用してたりしたらエラーだすとか？)

などなど他にもいろいろできそうだし、そしてもうすでに作って公開している人たちもちらほらいました。
https://spectrum.chat/figma/show-and-tell

# Figma Web API
https://www.figma.com/developers
docs: https://www.figma.com/developers/docs

```
The Figma Platform enables apps, websites and internal tools to integrate directly with the realtime state of design in Figma from a robust Web API and open JSON format.
```

# Sample
`Figma　API`を使用した公式サンプルがあったので参考までに
https://github.com/figma/figma-api-demo

# まとめ
いろいろできそうなので次はなにか作ってそれを記事にする
VS CodeでRustを書くときにつまづいたこと

# バージョン情報
| アプリ | バージョン |
| ------ | ----- |
| VSCode | バージョン1.31.1 (1.31.1) |
| Rust (rls) - 拡張機能 | 0.5.3 |
| rustup | 1.17.0 (069c88ed6 2019-03-05) |
| rustc | 1.33.0 (2aa4c46cf 2019-02-28) | 
| cargo | 1.33.0 (f099fe94b 2019-02-12) | 

# つまづいたこと

VS Codeに`Rust(rls)`入れてもエラーになる。
どうやらrlsの起動に失敗しているみたい。

# やったこと。

コマンドラインで `rls`, `rust-analysis`, `rust-src`をインストールした

```sh
$ rustup component add rls rust-analysis rust-src
```

VS Codeの拡張機能の設定を修正した。

```json
{
  "rust-client.channel": "stable"
}
```

VS Codeを再起動した。

すると、ツールのインストールが必要とか言われるので、`YES`を押下すると、ツールのインストールが行われる。

以上です。よろしくお願いします。
Access/SQL IIF使い方

##IIF使い方

```sql:qiita.rb
--カラム1が***だったら、カラム*にフラグ1立てる例
UPDATE テーブル1 
　　SET テーブル1.カラムA = IIf([テーブル1].[カラム1]= 'aaa',1,Null),
　　　　テーブル1.カラムB = IIf([テーブル1].[カラム1]= 'bbb' ,1,Null),
　　　　テーブル1.カラムC = IIf([テーブル1].[カラム1]= 'ccc' ,1,Null)

```
[Unity]Debug.Logを簡単に装飾(色付け、サイズ変更)できる拡張メソッド

## 使い方
![capture 81.png](https://qiita-image-store.s3.amazonaws.com/0/213392/39992ea7-064b-5da9-7184-a993d9c68311.png)
## 結果
![capture 80 .png](https://qiita-image-store.s3.amazonaws.com/0/213392/888c912a-3cdc-4ff1-2bd4-246e1c9f8d1b.png)
## ソースコード

``` C#
public static class StringExtensions
{
    /// <summary>
    /// Colorタグで囲まれたstringを作る
    /// </summary>
    public static string SetColorTag(this string str, Color color)
    {
        string colorHtmlString = ColorUtility.ToHtmlStringRGBA(color);
        return $"<color=#{colorHtmlString}>{str}</color>";
    }

    /// <summary>
    /// Sizeタグで囲まれたstringを作る
    /// </summary>
    public static string SetSizeTag(this string str, int size)
    {
        return $"<size={size}>{str}</size>";
    }

    /// <summary>
    /// bタグ(ボールド体)で囲まれたstringを作る
    /// </summary>
    public static string SetBoldTag(this string str)
    {
        return $"<b>{str}</b>";
    }

    /// <summary>
    /// iタグ(イタリック体)で囲まれたstringを作る
    /// </summary>
    public static string SetItalicTag(this string str)
    {
        return $"<i>{str}</i>";
    }

    /// <summary>
    /// 文字列の最後に改行コードを挿入する
    /// </summary>
    public static string SetNewLineCodeInEnd(this string str)
    {
        return $"{str}\n";
    }
}
```

## 備考
UGUIのリッチテキストにも使用できます
何回閉じても無駄ですよのブックマークレット

これをブックマークレットとして登録すればどんなページでもブラクラごっこして遊べる
:warning: ご利用は計画的に

```js
javascript:(function(){while(true){alert('何回閉じても無駄無駄無駄無駄無ダムだむだむだむだむだむだｍづあ');}})();
```

[不正プログラム書き込み疑い補導｜NHK 兵庫県のニュース](https://www3.nhk.or.jp/lnews/kobe/20190304/2020003239.html)
micro:bitで力センサーを入力としたカウンターを作ってみた

#IoTカウンタを目指してつくってみました．
- [力センサーのカウンタ・音付き](https://makecode.microbit.org/_gMw1FRTY83Xi)
- 表示部は，そろばん表現になっています．
- [スイッチサイエンスの力センサー](https://www.switch-science.com/catalog/5298/)をデジタル入力として使用しました．1kgぐらいの力でONになっているようです．
- 力センサーがONになると音も鳴らすようにしました．電池駆動している電源ですが，微かに音がしています．研究室内であれば十分聞き取れましたが，工場のなかなど，雑音がある場所だと聞こえないでしょう．
- Aボタンで＋１，Bボタンで−１，A＋Bボタンで０リセットできます．
- BLEあるいはWiFiでPCと無線通信を実現したいと思っていますが，まずはシリアル通信でしょうか．
![IMG_1270.jpg](https://qiita-image-store.s3.amazonaws.com/0/237044/ee6e189a-94b2-2902-86a0-d7ca6d72f724.jpeg)
MacのMojaveにしたらOffice2016のリボンが開かなくなる件の対処

いきなり結論の対処法が知りたい人は[ここ](#真の手動更新対処法の結論)へ。

# どういうバグか？

下記のスクリーンショットの，ペーストのところを見てください。
リボンの矢印のところを押すと詳細メニューが出ていません。

![スクリーンショット 2019-03-08 9.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/120396/76c7f728-68c8-f93e-5ab7-e3ea02349dce.png)

# なにがわるい？

わからないけど，Mojaveに対応していないとしか思えません。
High Sierraまではキチンと動いていました。

# 公式はなんと言ってる？

バージョンが古いので対応していないから，バージョンアップしろと言う。
ちなみにバージョンは15.14です。公式の最新バージョンをみると16.22（2019.03.08時点）である。

![スクリーンショット 2019-03-08 9.39.09.png](https://qiita-image-store.s3.amazonaws.com/0/120396/267823f7-25c0-2e82-02a2-0c1ed4a80883.png)

なるほど，たしかに古い。

# ではバージョンアップしよう

**はい，これですわ！**
これがMicrosoftのダメなところや！

![スクリーンショット 2019-03-08 9.43.51.png](https://qiita-image-store.s3.amazonaws.com/0/120396/4817375b-3880-11f5-dc6d-945ea000eb79.png)

ということで，パッチファイルをダウンロードして，自分でアップデートする必要があるっぽい。

# 手動更新・・・？

公式の更新履歴ページから更新パッチが手に入るようです。
-> [Office for Mac の更新履歴](https://docs.microsoft.com/ja-jp/officeupdates/update-history-office-for-mac?redirectSourcePath=%2fja-jp%2farticle%2fOffice-2016-for-Mac-%25E3%2581%25AE%25E6%259B%25B4%25E6%2596%25B0%25E5%25B1%25A5%25E6%25AD%25B4-700cab62-0d67-4f23-947b-3686cb1a8eb7)

ということで，16.22をダウンロードしてアップデートできそうですが・・・

**ちょっとまって！それは罠かも！？**
**16.なんとか以降は今まで使っていたOffice2016のシリアル番号でのライセンス認証ができません。**

サブスクリプションかなんかのライセンス登録をMicrosoftアカウントに結びつけていないとだめです。じゃあバージョンいくつがシリアル番号ライセンスでの最新なの？といわれてもMicrosoftマニアじゃないんだからわかるわけがない。一つ一つ試す？どうしよう？

# 真の手動更新！対処法の結論

ということで，おすすめはMicrosoft AutoUpdateを最新にして，自動で最新までアップデートすることです。先程の公式の更新履歴ページからMicrosoft AutoUpdateを手に入れましょう。

-> [Office for Mac の更新履歴](https://docs.microsoft.com/ja-jp/officeupdates/update-history-office-for-mac?redirectSourcePath=%2fja-jp%2farticle%2fOffice-2016-for-Mac-%25E3%2581%25AE%25E6%259B%25B4%25E6%2596%25B0%25E5%25B1%25A5%25E6%25AD%25B4-700cab62-0d67-4f23-947b-3686cb1a8eb7)

2019.03.08時点ではMicrosoft AutoUpdateのバージョンは4.8でした。

# 新しいAutoUpdate

これが真のAutoUpdateじゃい！

![スクリーンショット 2019-03-08 9.59.21.png](https://qiita-image-store.s3.amazonaws.com/0/120396/b5e58cd8-808b-c80a-bbfc-ef650156a0a8.png)

# おしまい

ということで，バージョン16.16.7にアップデートされていい感じになりました。
**Microsoftは罠多め。**
イベントログにログ出力する共通クラス

``` LogHelper.cs

using System;
using System.Diagnostics;

namespace LogSample.Service
{
    public class LogHelper
    {
        private static readonly string _SOURCE_NAME = "Application";
        private static string _MESSAGE_FORMAT = "OccurrTime:{0};Message:{1}";
        private static EventLog _log;
        private static LogHelper _eventLogInstance;

        public static LogHelper Instance
        {
            get
            {
                if (_eventLogInstance == null)
                {
                    //if (!EventLog.SourceExists(_SOURCE_NAME))
                    //{
                    //    EventLog.CreateEventSource(_SOURCE_NAME, "");
                    //}
                    _eventLogInstance = new LogHelper();
                }
                return _eventLogInstance;
            }
        }

        public LogHelper()
        {
            _log = new EventLog();
            _log.Source = _SOURCE_NAME;
        }
        
        public void WriteError(string message)
        {
            _log.WriteEntry(String.Format("Error: " + _MESSAGE_FORMAT, DateTime.Now, message)
                , EventLogEntryType.Error);//, 2);
        }

        public void WriteWarn(string message)
        {
            _log.WriteEntry(String.Format("Warn: " + _MESSAGE_FORMAT, DateTime.Now, message)
                , EventLogEntryType.Warning);//, 3);
        }

        public void WriteInfo(string message)
        {
            _log.WriteEntry(String.Format("Info: " + _MESSAGE_FORMAT, DateTime.Now, message)
                , EventLogEntryType.Information);//, 4);
        }
        
    }
}
```

権限の問題が出てきそうなので現段階ではソース名はApplicationにしておく
迷う時間はもったいなくない

# 物事には損益分岐点というものがある。

肉体のスピードより思考のスピードの方がずっと速い。

だから重大な決断の方が迷う時間が大きくて良い。

たとえば日常のとるにたらない話でいえば、10km先まで歩いていくときに、迷う時間がもったいないから歩きはじめるのはとても危険だ。

# 数時間経過してから間違いに気づいても遅い。

その場合はあるき始める前にGoogleMapをよく見るなどして思考のスピードで迷った方が良い。

肉体よりもずっと速く目的地まで一足先に行けるだろう。

情報とはそういうものだ。

# ちなみに僕は方向音痴でGoogleMapの見方も下手なのでどれだけ事前に迷おうともすぐに物理的にも迷うけれど。

頭に磁石を搭載したい。

ところで世間では迷うなとか事前によく考えろとか主語をなくした一般論がまかりとおっているけれど、ああいった議論の99%はコンテキストを失ってしまっていると思う。

目的地が100m先か10km先かの違いでも、迷ったほうが良いかどうかのパラメータは変わる。

# 損益分岐点も変わってくる。

ということで迷う時間は必ずしも惜しくない。

システム開発やプログラミングでも同様だ。

以上。

# Original Text

迷う時間はもったいなくない。物事には損益分岐点んというものがある。肉体のスピードより思考のスピードの方がずっと速い。だから重大な決断の方が迷う時間が大きくて良い。たとえば日常のとるにたらない話でいえば、10km先まで歩いていくときに、迷う時間がもったいないから歩きはじめるのはとても危険だ。数時間経過してから間違いに気づいても遅い。その場合はあるき始める前にGoogleMapをよく見るなどして思考のスピードで迷った方が良い。肉体よりもずっと速く目的地まで一足先に行けるだろう。情報とはそういうものだ。ちなみに僕は方向音痴でGoogleMapの見方も下手なのでどれだけ事前に迷おうともすぐに物理的にも迷うけれど。頭に磁石を搭載したい。ところで世間では迷うなとか事前によく考えろとか主語をなくした一般論がまかりとおっているけれど、ああいった議論の99%はコンテキストを失ってしまっていると思う。目的地が100m先か10km先かの違いでも、迷ったほうが良いかどうかのパラメータは変わる。損益分岐点も変わってくる。ということで迷う時間は必ずしも惜しくない。システム開発やプログラミングでも同様だ。以上。

# Links

- [いなうらゆうまはここにいた 2019-03-08](https://github.com/YumaInaura/YumaInaura/issues/675#s1552003057)



# English Translated

It is a waste of time to get lost. There is a thing called a breakeven point in things. The speed of thinking is much faster than the speed of the body. So it's good to have a big time to get lost. For example, speaking of an unusual story in daily life, it is very dangerous to start walking when walking ten kilometers ahead because it is a waste of time to get lost. Even if you notice a mistake after several hours it is too late. In that case it is better to get lost at the speed of thinking, such as watching GoogleMap closely before you start. You will be able to go ahead to the destination much faster than the body. Information is that kind of thing. By the way, I do not have a sense of direction and GoogleMap 's way of thinking is too bad, so how quickly I get lost even if I get lost in advance. I want to mount a magnet on my head. By the way, I do not get lost in public, general thought that loses my subject, etc. I think that 99% of these discussions have lost the context. Even if the destination is 100 m ahead or 10 km ahead, the parameter of whether it is better to get lost changes. The breakeven point also changes. The time to get lost is not always regrettable. It is the same in system development and programming. that's all.

# Chinese Translated

迷路是浪費時間。在事物中有一種稱為盈虧平衡點的東西。思維的速度比身體的速度快得多。所以有一個很大的時間迷路是件好事。例如，談到日常生活中的一個不同尋常的故事，在前行十公里時開始步行是非常危險的，因為這是浪費時間迷路。即使您在幾個小時後發現錯誤也為時已晚。在這種情況下，最好以思維的速度迷失方向，例如在開始之前密切關注GoogleMap。您將能夠比身體更快地前往目的地。信息就是那種東西。順便說一下，我沒有方向感，谷歌地圖的思維方式太差了，所以即使我提前迷路，我也會很快迷路。我想在我頭上安裝磁鐵。順便說一句，我不會在公共場合迷失，一般認為失去了我的主題等等。我認為99％的討論都失去了背景。即使目的地在前方100米或前方10公里處，也是最好是丟失更改的參數。盈虧平衡點也會發生變化。迷路的時間並不總是令人遺憾。系統開發和編程也是如此。超過。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
iOSで文字の全角判定

## 文字が全角かどうかの判定を、iOSで確認する

- 文字が全角かどうかを判定する処理

```cs:Utilities.cs
using System.Text;
public class TextUtility
{
    public static bool IsZenkaku(string moji)
    {
        return GetByteCount(moji) == moji.Length * 2;
    }
    public static bool IsHankaku(string moji)
    {
        return GetByteCount(moji) == moji.Length;
    }
    public static int GetByteCount(string text)
    {
        return Encoding.GetEncoding("Shift_JIS").GetByteCount(text);
    }
}
```

- 使い方

```cs
if (TextUtility.IsZenkaku("あ")) {
    Debug.Log("全角です");
}
```

> <font color=#ff0000><b>エディタ上では動作しますが、iOSプロジェクトではエラーになります。</b></color>


## エラーを回避する

- エラーの原因は[DDLが見つからない](https://docs.unity3d.com/jp/460/Manual/TroubleShootingIPhone.html)
行方不明のDLL(I18N.dll, I18N.CJK.dll)をプロジェクトのAssets/Plugins フォルダにコピーする。

- DLLの場所
Unity.app/Contents/Frameworks/Mono/lib/mono/unity 

- 問題点
Unicodeにしか存在しない文字は今のところ判定できない
名前定義もマクロもないブックが重くなる原因

# きっかけ
マクロもない…条件付き書式もない…名前定義もない…見た目の情報量も少ない…
それなのにブックの動きがもっさりするので原因と解決法が知りたかった。わかったのでここに書く。


# 原因
**半端ない量の全く使用しないスタイル。**
デフォルトの状態だとスタイルは40件程度しかなかったはず。
でも手元にあるおっそいブックはなんと**４万件**を軽く超えていた…(;´д｀)ﾋｴｯ

以下の条件に一致する場合、この現象が発生することを確認。

- 大量スタイルを持っている　かつ、
- 保護されたビュー（「編集を有効にする」をクリックしない）の状態

**の、ブックから1セルでもコピーした場合、そのブックが持っているすべてのスタイルが貼り付け先ブックにコピーされる。**


### 環境
Excel 2010
それ以外のExcelはこの現象が起きるかはわからない。


# 解決法
個人的にスタイルを使うことはまったくないので一括削除する。

以下のVBスクリプトをデスクトップとか適当な場所において該当ブックをドラッグ&ドロップするだけ。
やっているのはビルトイン分を除いた全てのスタイルを一括削除。

```vb:スタイル削除.vbs

ans = MsgBox("スタイル数が多いと20分くらいかかるよ。" & vbCr & "その間エクセル操作すると強制終了しちゃうよ！", vbYesNo, "ビルトイン以外のスタイルを削除します。いいですか？")

If ans = vbNo Then WScript.Quit

MsgBox "処理開始"

Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True

For Each strFname In WScript.Arguments
    Set objDoc = objExcel.Workbooks.Open(strFname)

    '全体スタイル数
    All = objDoc.Styles.Count
    '進捗
    i = 0
    
    'スタイル削除
    For Each S In objDoc.Styles
        '進捗表示
        objExcel.StatusBar = CStr(i) & " / " & CStr(All)
        'ビルトインは除く
        If Not S.BuiltIn Then
            S.Delete
        End If
        
        i = i + 1
    Next
    
    '進捗表示を消す
    objExcel.StatusBar = False
    '保存＆クローズ
    objDoc.Save
    objDoc.Close
    
    Set objDoc = Nothing
Next

objExcel.Quit
```

一応複数ドロップしても対応できるようにしたつもりだが、動作確認してないので1個ずつドロップする。

## 最後に
なぜエクセル上でスタイルの一括削除ができないのかは不明。
名前定義はできるのに…
GitLabをAWS上で動かす(3/3) 

前回の続きです。

[GitLabをAWS上で動かす(1/3)](https://qiita.com/C910/items/772329aa2d59a7f9236d)
[GitLabをAWS上で動かす(2/3)](https://qiita.com/C910/items/1c54615f1202d19f2ff1)
☞ GitLabをAWS上で動かす(3/3)

# ライブラリの設定

### postfixが存在して、sendmailが存在しないことを確認
```
$ yum list installed | grep -e postfix -e sendmail
```

### デフォルトMTAを確認＆変更する
```
$ sudo alternatives --config mta
```

### postfixがenabledか確認＆変更する
```
$ sudo systemctl list-unit-files --type=service | grep postfix
```

# GitLab
### GitLabをインストール
```
$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
$ sudo yum install gitlab-ce
```

### SMTPの設定（する場合）
設定項目はAmazonの [SMTP settings](https://docs.gitlab.com/omnibus/settings/smtp.html) を参照ください。

### external_urlを確認
```
$ sudo vi /etc/gitlab/gitlab.rb
```
```/etc/gitlab/gitlab.rb
external_url 'http://hogefuga.com'
```

### external_urlに記載されているURLにブラウザからアクセス！
<img width="1148" alt="スクリーンショット 2019-03-08 9.13.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/218879/d1f747cc-0a99-d4fc-6fe2-9a119ab6b8cb.png">

無事表示されました。

Username と Password は公式サイトに書いてある通りです。（下記
Username: root 
Password: 5iveL!fe

---

以上で「GitLabをAWS上で動かす」は終了です。
GitLabの設定とかをある程度まとめてまた投稿できればと思います。
Ruby 2.7 で追加される `Enumerable#tally` というメソッドについて

Ruby 2.7 で `Enumerable#tally` というメソッドが追加されます。

* [Feature #11076: Enumerable method count_by - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/11076)

あまり聞き慣れない単語のメソッドですが、これは『同じ要素の数を Hash で返す』というメソッドになります。

```ruby
pp [1, 1, 2, 2, 2, 3, 3, 4].tally
# => {1=>2, 2=>3, 3=>2, 4=>1}

pp ["homu", "homu", "mami", "mado", "mado", "mado"].tally
# => {"homu"=>2, "mami"=>1, "mado"=>3}
```

https://wandbox.org/permlink/3nAez0P6CDys749b

『要素をキー』として『要素の数を値』とする `Hash` を返します。
配列の要素の数を数えたいことは稀によくあるので、そういう場合に一発で取得できるのは便利そうですね。
また、機能としては `Enumerable#group_by` と似ていますが、 `#tally` はブロックを受け取らないことに注意してください。
ちなみに `tally` という単語は、日本語で数を数える時に使う `正` の字と同じような意味合いがあるらしいです。
平成最後のWSHのヘルプファイル(script56.chm)の入手方法

WSH/WSHのヘルプファイルの入手方法 - Windowsと暮らす
[https://win.just4fun.biz/?WSH/WSH…][1]
[1]:https://win.just4fun.biz/?WSH/WSH%E3%81%AE%E3%83%98%E3%83%AB%E3%83%97%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%85%A5%E6%89%8B%E6%96%B9%E6%B3%95

ここの手順ではもう入手できない。
手元にはあるけれど「これから新たに入手する」にはどうすればいいか。
いろいろ探してたらこんなのを見つけた。

scd56jp.exe 実行可能ファイル（.EXE）
http://www.mediafire.com/file/8akldcgngrfgruh/scd56jp.exe/file

手元のものとダイジェストまで一致するから本物だろうけど、権利関係的にはどう考えてもアウト。一応自分用にメモを残しておく。
FlutterからKotlinの処理を呼ぶ

# はじめに
どうしてもFlutterを書いているとDartだけで表現できないこともおきてくるので、各ネイティブ処理呼べたらなーと思ってました。わざわざFlutterのプロジェクトを生成するときに各OSのフォルダあるしできるやろと思って調べたらやっぱりありました。

ここに書いてあることは[platform-channels](https://flutter.dev/docs/development/platform-integration/platform-channels)全部書いてあったりしますが、その点はご了承ください。

iOSの環境作成をずっと面倒くさがってAndroidの話だけしか書いてません。

# 環境
Flutter 1.0
Android Studio

# Dart側の対応
まず必要なパッケージをimportします。

```
import 'package:flutter/services.dart';
```

そしてメンバ変数として`MethodChannel`を宣言しておきます。
引数は後々使うので、分かりやすい名前にしておきましょう。（以下チャンネル名と書きます。）

``` Dart
static const platform = const MethodChannel('com.tasogarei.test/web');
```

次に呼び出し口です。
わざわざ処理を呼び出したいので、たいていは状態変化させる箇所に書くことになるかと思います。
今回は読んだ先の日付を文字列でもらって`setState`する感じにします。

ここから呼び出しますが、呼び出し方は簡単で`platform.invokeMethod('web')`とするだけです。
引数は識別子になりますので、これもわかるようにしておいてください。

``` Dart
  void _incrementCounter() async {
    String dateString = await platform.invokeMethod('web');
    setState(() {
      _title = dateString;
    });
  }
```

# Kotlin側の対応
まずはFlutter作成時の`build.gradle`とかに書いてあるバージョンは基本的に古いので、いい感じに修正する必要があります。（ここでは割愛）

まずはKotlin側のソースを全部のせておきます。

``` Kotlin
package com.tasogarei.flutterapp2

import android.os.Bundle

import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import java.time.LocalDateTime

class MainActivity: FlutterActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      GeneratedPluginRegistrant.registerWith(this)

      MethodChannel(flutterView, "com.tasogarei.test/web").setMethodCallHandler { call, result ->
          when(call.method) {
              "web" -> {
                  result.success(LocalDateTime.now().toString())
              }
          }
      }
  }
}
```

今回肝となるコードはその中でこの部分になります。

``` Kotlin
      MethodChannel(flutterView, "com.tasogarei.test/web").setMethodCallHandler { call, result ->
          when(call.method) {
              "web" -> {
                  result.success(LocalDateTime.now().toString())
              }
          }
      }
```

ここで先ほどDartファイル側で設定しておいたチャンネル名と識別子が設定されます。
`MethodChannel`の第二引数にチャンネル名を渡すことで大元を識別し、そのCallHandler内で識別子を判定して処理させていきます。
Kotlin側からDart側へ結果を戻す際には`result`内に結果を詰め込むためのメソッドが用意されているので、それに結果を入れてあげるだけです。

resultの型はデータクラスでは`PlatformException(error, Unsupported value: Data(id=1, name=name), null)`と出てダメだったので、文字列とか数字じゃないとダメそうです。
複雑なデータの場合はJson使用してやり取りするしか現状はなさそうです。
macでスクリーンショットの設定

僕が使っているスクリーンショットの設定を整理してみた

# 複数のパソコンで共有

「あれ、あのスクショ撮ったはずなんだけど・・・あ、あっちのPCだったか」ということが稀によくあるので、``Google Drive``を介して共有している

スクリーンショットは``Google Drive``に保存することにした（``~/Google Drive/Screenshots``）

```
$ mkdir Google Drive/Screenshots/
$ ln -s Google Drive/Screenshots/ .
$ ls -ld Screenshots
Screenshots -> /Users/shotakaha/Google Drive/Screenshots/
```

1. ``Google Drive``にスクショ保存用ディレクトリを作成した（``$ mkdir ~/Google Drive/Screenshots/``）
- ホームディレクトリに``Google Drive/Screenshots``へのシンボリックリンクを作成した（``$ ln -s Google Drive/Screeenshots/ .``）
- デフォルトのスクリーンショットの保存先は``~/Screenshots/``に変更した（``後述``）

# ショートカット

- 任意の範囲 : ``shift + command + 4`` + ``ドラグして範囲を選択``
- アプリ単体 : ``shift + command + 4`` + ``space``

アプリケーション単体のスクショを取ることが多いので、``space``を付けて使うほうが多い

<img width="682" alt="Screen Shot 2019-03-05 at 21.53.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/273122/06074c07-7ebb-2473-c04f-e8fc66ee282e.png">

# 影を消したい

デフォルトだとオシャレな影がついているが、残念ながら資料作成の際にはとても邪魔。
（ドロップシャドウが欲しい場合は、パワポの機能で装飾すればOK）。
なので、デフォルトをオフにする。

```bash
$ defaults write com.apple.screencapture disable-shadow -boolean true
$ killall SystemUIServer
```


これが

<img width="815" alt="Screen Shot 2019-03-05 at 21.53.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/273122/ff933cfd-94f5-b7b9-f818-198ef0829f0c.png">

こうなる

<img width="703" alt="Screen Shot 2019-03-05 at 21.54.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/273122/7072f901-96be-7a00-79f2-ac9577e65ad9.png">

ターミナルのサイズは同じ``99x24``だけど、スクリーンショットのサイズが違うことが分かる

# デフォルトの保存先を変えたい

デフォルトはデスクトップ（``~/Desktop``）になっている。
これだとデスクトップが散らかってしまうので（デスクトップはなるべくきれいにしておきたい派）、保存するディレクトリを``~/Screenshots/``に変更した


```bash
$ defaults write com.apple.screencapture location ~/Screenshots/
$ defaults read com.apple.screencapture location
/Users/shotakaha/Screenshots/
```

# デフォルトのファイル名を変えたい

デフォルトは``ScreenShots 年月日（YYYY-MM-DD） at 時刻（hh.mm.ss）.png``みたいな形式になっているので、``ScreenShots``の部分を``なし``にした

```bash
$ defaults write com.apple.screencapture name ""
$ defaults read com.apple.screencapture name
## 空行が表示される
```

# 設定が反映されない・・・

``defaults``コマンドの設定内容が反映されていない場合は、この呪文を唱えればいいみたい

```bash
$ killall SystemUIServer
```

# まとめ

```bash
$ defaults read com.apple.screencapture
{
    "disable-shadow" = 1;
    location = "/Users/shotakaha/Screenshots/";
    name = "";
}
```
VSCode オレ的設定メモ


```
    "workbench.colorCustomizations": {
        // エディタ関連
        "editor.background": "#2c2c2c",
        "editor.lineHighlightBackground": "#333333",

        // タブ関連
        "tab.activeBackground": "#2c2c2c",
        "tab.activeBorder": "#2c2c2c",
        "tab.inactiveBackground": "#262626",
        "tab.inactiveBorder": "#262626",

        // ステータスバー関連
        "statusBar.background":"#262626",
        "statusBar.noFolderBackground": "#9c9c9c",
        "statusBar.noFolderForeground": "#000000",
        "statusBar.debuggingBackground": "#da3b01",
        "statusBar.border": "#262626",

        // スクロールバー関連
        "scrollbarSlider.hoverBackground": "#9c9c9c2d",

        // サイドバー関連
        "sideBar.background": "#262626",
        "list.hoverBackground": "#2c2c2c",
    },
```
メッセージ認証コード(MAC)

[一方向ハッシュ関数](https://qiita.com/hamatti/items/9ac2859c6f099d6e26bd)では「改ざん」の防止が行えました。
メッセージ認証コード(MAC)では「改ざん」と「なりすまし」の対策が行えます。

#メッセージ認証コードの流れ
通信する者同士で共有する鍵を持っておく。
送信したいメッセージを共有鍵を利用し認証メッセージを生成→この値を**MAC値**と言う。
送信者はメッセージ(平文or暗号文)とMAC値を一緒に受信者へ送信する。
受信者側でもメッセージから共有鍵を使用し、MAC値を生成し検証する。

#共有鍵とは？
解説サイトを見ると共"通"鍵ではなく共"有"鍵と記載するところが多いですよね。
これの違いって何なのでしょうか。
MACでは共有する鍵に何を使うのかいろいろな方法があります。一例としては以下です。
**・一方向性ハッシュ関数を利用する(ハッシュMAC、略してHMACと呼ぶそうです)**
**・共通鍵を利用する**
です。これらを総称して共有鍵と呼んでいるのでしょうか。
ご存知の方教えていただけると幸いです。

#MACに対する攻撃
**再生攻撃(リプレイアタック)**
攻撃者が送信者と受信者の通信を盗聴し、元のメッセージとMAC値を取得する。
攻撃者は受信者にそのまま元のメッセージとMAC値を送信することで攻撃を行います。
ここで気を付けたいのが、攻撃者は共有鍵もMAC値も解読してはいないことです。
対策としてはメッセージ送受信時に1ずつ増加するシーケンスを振ることや、両者でタイムスタンプを埋め込んでおくことです。
後は**ノンス**と呼ばれるランダムな値を用いてメッセージと一緒にMAC値を生成することです。

#MACでできないこと
**第三者への証明**
「これは送信者から送られてきたメッセージです。」と受信者は共有鍵を用いて検証しているため確認できます。
しかし、それを送受信者以外に証明する手段がないことです。
証明したい人に共有鍵を渡して検証してもらえればいいのですが共有鍵は送受信者で持っておくことが前提であるため、それが崩れてしまうと「なりすまし」防止になりません。

**否認防止**
「これは送信者から送られてきたメッセージです。」と受信者が言っても第三者から見たら送信者と受信者どちらが送ったのかはわかりません。なぜなら送受信者共にMAC値の生成ができるからです。
ここで送信者が「そんなもの送ってない」と言ってしまえば否認が可能になってしまいます。

この2つの問題には**ディジタル署名**で対応可能になる。

#まとめ
・メッセージ認証コードでは「なりすまし」と「改ざん」の防止が可能
・「第三者への証明」と「否認防止」ができない(ディジタル署名で対処可能)
JMeterエラーした時点でリトライ

[JMeter エラー リトライ]でサジェスチョンに挙がっていたが、情報がなさそうだったので残しておきます。

最初はエラーをはいたらループさせようと思っていましたが、無限ループになるのでとりあえず止めるだけにしました。
どうせスレッド数を挙げてまわすので。

かんじんのやり方はというと、

Thread Groupで"Start Next Thread Loop"にチェック付けるだけ!!

下記の記事で気づきました。ありがとうございます。
http://sy5.sakura.ne.jp/jmeter/ref/miscellaneousfeatures/setupthreadgroup.html
2の256乗(2^256)は10進数で何桁か


2の256乗は10進数で何桁の数なのか知りたい。

## 知りたい理由

仮想通貨（例えばBitcoin）では、256bit（2^256)の乱数（つまり2^256パターンの中から）からアドレスが生成されます。
乱数からアドレスを生成すると聞くと「え、重複しないの？」という疑問がわきます。それに対する回答は、

```
2^256は十分に大きい数だから重複しません（但し、エントロピーが十分な場合）
```

という回答になるのですが、2^256がどのくらいの数字か説明に苦労します。
せめて10進数で何桁か？くらいは説明したいものです。

## 方針

10進数で何桁か？というのは10の何乗程度の数字なのか？を求めればよい。

例えば、125は、

```math
1.25 \times 10^{2}
```

と表すことができるため、2桁であることがわかる。
今回は桁数だけわかればいいので、2^256が、

```math
X \times 10^{n}
```

と表される場合のnを求めれば良い（Xの数字は不要）。

## 道具１

まず、利用するのは下記の関係式。10進数において以下の関係式が成り立つ。


```math
10^{n-1} \leqq A < 10^{n} \Leftrightarrow n-1 \leqq \log_{10} A < n
```

つまり、

```math
10^{n-1} \leqq 2^{256} < 10^{n} \Leftrightarrow n-1 \leqq \log_{10} (2^{256}) < n
```

という関係が成り立つということなので、

```math
\log_{10} (2^{256})
```

が求められればおおよその桁数がわかるということになる。

>解説は[ここ](https://www.try-it.jp/chapters-6817/sections-6855/lessons-6908/)とか見るといいでしょう。勉強になります。

## 道具２

結論から先にいえば、

```math
\log_{10} (2^{256})
```

は、底の変換公式

```math
\log_a X = \log_b X / \log_b a
```

により、下記のように変換できる。

```math
\log_{10} (2^{256}) = \log_{2} (2^{256}) / \log_{2} 10
```

>底を2の式に変換している。理由は後々計算しやすいから（特にlog2 2^256の方）。解説は[ここ](https://www.try-it.jp/chapters-6817/sections-6855/lessons-6868/)。


また、

```math
\log_{2} 10
```

は、

```math
\log_a X = 1 / \log_x a
```

という関係式により、

```math
1 / \log_{10} 2
```

と変換できるため、

```math
\log_{10} (2^{256}) = \log_{2} (2^{256}) * \log_{10} 2
```

と表現することができる。
ここで、

```math
\log_{2} (2^{256})
```

は、2をn乗した場合に2^256になる数なので、そのまま256であることがわかる。
また、

```math
\log_{10} 2
```

は、常用対数表から、0.301なのがわかる。
そのため、最終的に、

```math
\log_{10} (2^{256}) = 256 * 0.301 = 77.056
```

となり、桁数nは、

```math
n-1 \leqq 77.056 < n
```

あたりということになる。

Googleで「2の256乗」と検索すると、1.1579209e+77と出ますね。

これは「宇宙にある陽子の数」とされるエディントン数（136 * 2^256)に近い数字であり、膨大な数だということがわかります。

>現在、エディントン数はやや補正されているようです。

## 応用

### IPアドレスの枯渇

IPアドレス（正確にはIPv4）は192.168.111.111などと、32bitで表される一意な数字である。
つまり、2^32パターンのアドレスが存在することになる。これは、10進数でどれくらいの数だろうか？

上記の関係から2^32の桁数は、

```math
\log_{10} (2^{32}) = 32 * 0.301 = 9.623桁の数
```

となる。これは、実際には42.9億程度の数である。これでは、世界人口70億人が一人1台スマホを保有した場合、アドレスが割り振りきれないのがわかります。

そこで、桁数を増やしたのがIPv6。IPv6では、アドレスが128bit、つまり2^128パターンに拡張されました。
では、これは何桁くらいの数でしょか？

```math
\log_{10} (2^{128}) = 128 * 0.301 = 38.528桁の数
```

となります。これは、IPv４の約43億個に43億 x 43億 x 43億を更に掛けたくらいの量となり、十分な数となる。

### 2の累乗

お気づきかと思いますが、2の累乗が何桁なのかは、

```math
2^{n}が何桁か？ = n * 0.301
```

で求めることができるということです。
Framework not found QuickTimeの治し方

# 環境
openFrameworks0.9.8
Xcode10.1
MacOS Mojave

# 状況
openFrameworksのプロジェクトをビルドすると**Framework not found QuickTime**というエラーが出た。

# 解決方法
https://forum.openframeworks.cc/t/clang-linker-command-failed-with-exit-code-1-use-v-to-see-invocation/30700/2

ここに書いてある通り。

原因としてはopenFrameworksではQuickTimeをフレームワークとして参照してビルドするが、XcodeのアップデートによりQuickTimeがFrameworkから除外されたから参照しないようにしてあげる

CoreOF.xcconfigのファイルに記載されている

```
-framework QuickTime
```

の部分を削除する
フォルダ内のCSVファイルを統合するマクロ　その2

今回は、その1で作成した
『同じフォルダ内にあるCSVファイルを使用範囲をそのままコピペして統合するマクロ』
を貼り付け用の「請求統合.xlsx」を前もって用意し、コピー範囲の開始行をinputboxで指定できるよう改良しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265756/97268803-e0e5-38be-5165-1113635df167.png)


```vb
Sub tougou02()
   
'フォルダを選択
    Dim folderPath As Variant
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Show
        folderPath = .SelectedItems(1)
    End With
       
'Dir関数でCSVファイル名を取得
    Dim buf As String
    buf = Dir(folderPath & "\" & "*.csv")
    Debug.Print buf        'ファイル名を確認
    
'貼り付け元の「請求統合.xlsx」ファイルを開いて最初のシートを指定
    Dim bath As Workbook
    Set bath = Workbooks.Open(folderPath & "\" & "請求統合.xlsx")
    Dim tougouWs As Worksheet
    Set tougouWs = bath.Worksheets(1)
    
'CSVファイルの転記位置が上から何行目かをインプットボックスで指定
'（「j」が空白を入力されたときにメッセージを出したいので、Long型ではなくString型を指定）
    Dim j As String
    j = InputBox("CSVファイルの転記の開始は何行目ですか？（半角英数で入力してください）")
    
    If j = "" Then
        MsgBox "空白が入力されました。最初からやり直してください"
        Exit Sub
    End If
     
'CSVファイルの一番右下のセルの位置
    Dim maxRows As Long
    maxRows = Cells(1, Columns.Count).End(xlToLeft).Column
       
'ループ開始・CSVファイルの名前が空白になったら（取得できなかったら）ループから外れる
    Do While buf <> ""
    
'「請求統合.xlsx」の最終行を取得
        With tougouWs
            Dim bathLastLine As Long
            bathLastLine = .Cells(Rows.Count, 1).End(xlUp).Row
        End With
    
'CSVファイルの最初のシートを取得
            Dim wb As Workbook
            Set wb = Workbooks.Open(folderPath & "\" & buf)
            Dim ws As Worksheet
            Set ws = wb.Worksheets(1)
       
'CSVファイルの最下行を取得し範囲指定してコピー（クリップボード）
'最終行：lastLine
            Dim csvLastLine As Long
            csvLastLine = ws.Cells(Rows.Count, 1).End(xlUp).Row
            ws.Range(Cells(j, 1), Cells(csvLastLine, maxRows)).Copy
        
'「請求統合.xlsx」のA列の最終行の次のセルを指定し貼り付け
            With tougouWs
                .Activate
                .Cells(bathLastLine + 1, 1).Activate
            End With
            ActiveSheet.Paste

'CSVファイルを保存せずに閉じる
            wb.Application.CutCopyMode = False
            wb.Saved = True
            wb.Close
                      
'次のCSVファイルを指定する
            buf = Dir()
    Loop
    
'「請求統合.xlsx」を保存して閉じる
    bath.Save
    bath.Close
    
End Sub
```
ちなみに下記の部分ですが

```vb
'CSVファイルの転記位置が上から何行目かをインプットボックスで指定
'（「j」が空白を入力されたときにメッセージを出したいので、Long型ではなくString型を指定）
    Dim j As String
    j = InputBox("CSVファイルの転記の開始は何行目ですか？（半角英数で入力してください）")

    If j = "" Then
        MsgBox "空白が入力されました。最初からやり直してください"
        Exit Sub
    End If
```
inputboxをLongで宣言すると、何も入力しないまま「OK」をクリックするとエラーになってしまうので文字列であるStringで宣言したのですが・・・いいのでしょうかね？一応検証した結果はStringでもコピペはできました。

次回は個人的に追加したい機能「統合時に一番右のセルに各CSVファイル名の一部を入力する」の対応をしたいと思います。
Apache CordovaでiOSエミュレータ起動まで

MacでApache Cordovaを使い、iOSアプリを作成する方法です。

前提として、nodeとnpm、XCodeのインストールをしておく。
その上で、cordova、ios-deploy、cocoapodsをインストールする。
#インストール
```
$ sudo npm install -g cordova

# --unsafe-perm=trueをつけないとエラーになる
$ sudo npm install --unsafe-perm=true -g ios-deploy

$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
```

#サンプルアプリの作成・実行
```
$ cordova create hello
$ cd hello
$ cordova platform add ios
$ cordova emulate ios --target="--device--" --buildFlag="-UseModernBuildSystem=0"
```

<img width="300" alt="Cordova-ios.png" src="https://qiita-image-store.s3.amazonaws.com/0/41382/ed6aad0a-c25c-0a57-c9a8-d57658709c56.png">

環境
- macOS Mojave
- XCode 10.1
- node v11.6.0
- npm 6.9.0

公式ドキュメント
https://cordova.apache.org/docs/en/latest/guide/cli/index.html
JavaScriptでコナミコマンド

こんな感じでできる

```javascript
function konami(f) {
  var i = 0;
  window.addEventListener('keydown', function (e) {
    if ([38, 38, 40, 40, 37, 39, 37, 39, 66, 65][i] !== e.which) return i = 0;
    i = (i + 1) % 10;
    if (i === 0) f();
  });
};

konami(function () {
  // コナミコマンドを入力後に実行されるイベント
  alert('小並');
});
```
setw setfill

こどふぉ５４４div.3 A

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
#include<stdio.h>
#include<string.h>
#include<iomanip>
using namespace std;
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define REP(i, n) FOR(i, 0, n - 1)
#define NREP(i, n) FOR(i, 1, n)
using ll = long long;
using pii = pair<int, int>;
using piii = pair<pii, pii>;
const int dx[4] = { 0, -1, 1, 0 };
const int dy[4] = { -1, 0, 0, 1 };
const int INF = 1e9 + 7;
int gcd(int x, int y) {
	if (x < y)swap(x, y);
	if (y == 0)return x;
	return gcd(y, x%y);
}

template<class T1, class T2> void chmin(T1 &a, T2 b) { if (a>b)a = b; }

template<class T1, class T2> void chmax(T1 &a, T2 b) { if (a<b)a = b; }
template<class T>
void Add(T &a, const T &b, const T &mod = 1000000007) {
	int val = ((a % mod) + (b % mod)) % mod;
	if (val < 0) { val += mod; }
	a = val;
}
////////////////////////////////////////

int main() {
	int h1, h2, m1, m2;
	char char1, char2;
	cin >> h1 >> char1 >> m1;
	cin >> h2 >> char2 >> m2;
	int tmp = (h1 * 60 + h2 * 60 + m1 + m2) / 2;
	int ans1 = tmp / 60;
	int ans2 = tmp % 60;
	cout << setw(2) << setfill('0')<< ans1;
	cout << ':';
	cout << setw(2) << setfill('0') << ans2 << endl;
	return 0;
}
```
setw,setfillとかいう新しい学びを得た
巡回セールスマン問題（Travelling salesman problem)

巡回セールスマン問題（traveling salesman problemーTSP）は計算機科学とオペレーションズリサーチで研究されている離散的な最適またはカテゴリの組み合わせのNP困難問題である。TSPの原則は都市の集合と各2都市間の移動コスト（たとえば距離）が与えられたとき、全ての都市をちょうど一度ずつ巡り出発地に戻る巡回路の総移動コストが最小のものを求める（セールスマンが所定の複数の都市を1回だけ巡回する場合の最短経路を求める）組合せ最適化問題である。

![alt](https://upload.wikimedia.org/wikipedia/commons/c/ca/Salesman.PNG)

問題例の大きさは、都市の数で表される。この問題は、計算複雑性理論においてNP困難と呼ばれる問題のクラスに属する。すなわち、問題例の大きさに関する決定性の多項式時間アルゴリズムが見つかりそうにない、計算量的に困難な問題である。なお、この問題の特殊ケースとして考えられるハミルトン閉路問題は、NP困難であると共にNP完全と呼ばれるクラスにも属するので、扱いが異なる。

都市間の移動コストが三角不等式を満たす、すなわち移動コストを距離と呼べる部分問題（あるいは制約つき問題）も、NP困難である。都市を平面上の点、都市間の距離を平面上のユークリッド距離とする部分問題は最も直感的で理解しやすいが、これも NP困難である。この部分問題は平面TSPなどと呼ばれ、実用上の応用も多く、またベンチマークの問題例としても距離関数の定義が自明なため頻繁に現れる。 都市の間の移動コストを 1 または 2 に制限しても、この問題は NP困難である。ハミルトン閉路問題は、移動コストを 1 または無限大に制限した TSP とみなすことができる。

一方で制約のない巡回セールスマン問題の直接の応用事例は無いと言ってもよい。逆に実際の応用事例では、より複雑な定義で配送計画や表面実装ロボットの動作計画などに適用される。
全ての経路を計算することで最適解を得る手法は時間計算量は　O(n!)　であり、都市数の増加に対して時間計算量が急速に増加するため、都市数が20以上になると現実的でない。 比較的効率的なアルゴリズムとしては時間計算量と空間計算量が共にO(n^2 2^n)である動的計画法を用いたヘルドカープのアルゴリズム（英語版）が存在する。

NP困難な問題は、任意の大きさの任意の問題例に対しての多項式時間アルゴリズムが存在しないと考えられているが、巡回セールスマン問題の場合、約2000都市以内の比較的小さい問題例に対して、あるいは問題例によっては解が得られないことがあってもよいのであれば、線形計画法と論理木を組み合わせた分枝限定法や、線形計画法と巡回群を組み合わせた切除平面法により、パーソナルコンピュータでおよそ1日以内で厳密解を得られることが多い。

厳密に最適解を求めることを放棄して計算時間を短くする方法は、リン・カーニハン・アルゴリズムなどの局所探索アルゴリズム、焼きなまし法、ホップフィールドネットワークあるいはボルツマン機械などのヒューリスティックアルゴリズムと、出力される解のコストと最適解のコストとの差をなんらかの形で保証する多項式時間近似アルゴリズムの二つに大別できる。

より複雑な定義の問題をあつかう解法としては、欧州では前述した分枝限定法、切除平面法、（前者2つをミックスした）分枝カット法といった厳密解法を用いることが多く、アメリカ合衆国では遺伝的アルゴリズム、タブー探索といった厳密に最適な解を保証しないヒューリスティックアルゴリズムを用いることが多い。

三角不等式が成り立つ TSP については多項式時間近似アルゴリズムが数多く存在する。 たとえば近似アルゴリズムが2（最悪でも出力が最適解の長さの2倍以内である）のアルゴリズム(最近追加法他)や近似度 1.5 のアルゴリズム(クリストフィードのアルゴリズム)が知られている。 近年、平面TSP には、近似率を任意に 1 に近づけることができるアルゴリズム、多項式時間近似戦略 PTAS が Arora によって与えられた。 ハミルトン閉路問題を考えれば、三角不等式が成り立たない移動コストを持つ TSP の問題には、近似アルゴリズムを定数倍以内に保証できる多項式時間アルゴリズムが存在しないことは明らかである。
Vimで類語や変数名の候補をサッと調べる

コーディング中，メソッドや変数などの「名前」にはいつも悩みます．

「他に適切な単語がないか知りたい」「著名なコードの変数名を参考にしたい」… Vimでそんな欲求をサッと満たせるプラグインを作りました．

## zenrei.vim

![zenrei.gif](https://qiita-image-store.s3.amazonaws.com/0/1045/8cf57086-49a0-5c38-81b7-3d9f5136c216.gif)

### 機能

- `:Zenrei <word>`: GitHubのスター数上位リポジトリから，前方一致で使用頻度の高い名前を10件表示します．
- `:ZenreiSynonym <word>`: [日本語 WordNet](http://compling.hss.ntu.edu.sg/wnja/)のデータに基づき，類語の情報を表示します．

※使用頻度のデータはRubyスクリプトのみを対象としています．

### 導入方法

```toml:dein.toml
[[plugins]]
repo = 'typewriter/zenrei.vim'
```

```vim:NeoBundle(.vimrc)
NeoBundle 'typewriter/zenrei.vim'
```

### 実現方法

- 名前の候補（GitHub上位リポジトリでの使用頻度）については，Rubyの[ripperライブラリ](https://docs.ruby-lang.org/ja/latest/library/ripper.html)でスクリプトをパースしてデータベースを持っています．
- 類語については，[日本語 WordNet](http://compling.hss.ntu.edu.sg/wnja/)のデータベースを用いています．
- APIサーバに処理を任せていて，Vimプラグインはレスポンスの加工表示のみを行っています．
  - HTTPリクエストやJSONパースには [vim-jp/vital.vim](https://github.com/vim-jp/vital.vim) を使用しました．

### ソースコード

あまり綺麗ではないです．

- [GitHub: typewriter/zenrei.vim](https://github.com/typewriter/zenrei.vim) （Vimプラグイン）
- [GitHub: typewriter/zenrei](https://github.com/typewriter/zenrei) （スクリプトのパーサ，APIサーバ等）
水上ドローン作りたい8、モータードライバーの配線

# モータードライバーの配線
Rasberry PI ZEROとモータードライバ(TA7291P)を接続します。どうするのが良いのでしょうか?
最初はこんな風にすれば良いと思ってました。↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/40f1b9fb-32bf-3590-11ee-272eb98950ed.png)
これでも動く時はあるのですが、接触が不安定で使い物にまりません。簡単に繋ぐ用のアダプタみたいな物を探したのですが見つかりません。
## ユニバーサル基板
やりようが無くなってしまい、ユニバーサル基板にはんだ付けしてピンヘッダとつなぐ事にしました。

作成に必要な機材も買いそろえました。
#### はんだゴテ
[ニクロムはんだこて　ＫＳ－３０Ｒ（３０Ｗ）](http://akizukidenshi.com/catalog/g/gT-02536/)
秋月電子さんのHPで「ＫＳ－３０Ｒは電子工作用はんだこてとして、多くのユーザーに愛用されています。」と書いてあるのでこれにしました。
#### はんだ
[はんだ　０．８ｍｍ](http://akizukidenshi.com/catalog/g/gT-02594/)
はんだに含まれる鉛が健康に良くないため、無鉛ハンダというものが広まってきているそうです。自分もそうしようかと思ったのですが、扱いが難しいそうなので普通のハンダになりました。
#### はんだ吸取線
[はんだ吸取線　ＣＰ－１５１５](http://akizukidenshi.com/catalog/g/gT-11554/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/534687f3-062d-4069-59c9-0b2996fc17de.png)
ケースの形が使いやすいです。
#### ハンダ台(拡大鏡付き)
[ルーペ LEDライト付き 拡大鏡 スタンドルーペ 半田スタンド拡大鏡 精密作業用 虫眼鏡 2.5倍 5倍 8倍レンズ](https://www.amazon.co.jp/gp/product/B0792VCZF8/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/1aa32d14-0c2a-cc88-c2d8-ffd7a569b2e1.png)
大きな拡大鏡がGood。はんだ付け以外にもQIコネクタの作成時に役に立ちました。只バランスが悪いのかよく横にこけます。
#### ユニバーサル基板
[タカチ電機工業 TNF型鉛フリーユニバーサル基板(SW-100適合) TNF59-94](https://www.amazon.co.jp/dp/B011IJRWD4)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/41336dba-2980-a96a-ebf2-fb8e509e27b1.png)
#### ピンヘッダ
[ピンヘッダ　１×４０　（４０Ｐ）](http://akizukidenshi.com/catalog/g/gC-00167/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/8ca8d453-c810-c337-0181-e626613aed17.png)


## 作成結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/fca241fc-b915-111a-5643-08a95f0a6e4c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/67223a2c-af58-1f82-356e-6c85b5d478c2.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/dcbaa616-f1c8-4aac-7dba-2fd8d2c5591d.png)
TA7291Pの足をピンヘッダ側に折り曲げてからはんだ付しました。

これでようやくTA7291Pを組み込む目処が立ちました。
## 感想 雑感
はんだ付けの難しさを痛感しました。けど楽しいですね、はんだの作業中は時間を忘れます。
VSCodeのファイルを開くと同時に行移動をする

## やり方
1. <kbd>Ctrl</kbd> + <kbd>p</kbd>でファイル一覧を開く
2. キーワードを入れて絞り込む
3. ファイルを選択する
4. 末尾に`:20`というように行数を追記する
5. Enter

これでファイル選びながら行移動できます。
地味に使えるんじゃないでしょうか。
Android Pieでテザリングできない現象が発生したのと、その問題の対処に問題が起きたので対処しました（DUNが追加できない現象）

# 変更履歴
  - 2028/02/20
    - タイトルの日本語が日本語じゃなかったので直しました。

# Android Pieが降ってきた！
はい、私のXperia XZ PremiumにAndroid Pieが降ってきたのはちょっと前のこと。
テンションすごい上がりました、えぇ。本当に。
...この事件が起こるまでは...(そんな大したこと起きてないだろ）

# アップデートしてしばらくして事象に気がつく
えぇ、全く気がつかなかったのですよ。
テザリングができないなんて...そんな馬鹿な。
その原因は不明なままでした。なんでテザれないんだ...キャリア側が制限でもかけたのか？と思ってしまいましたね。

# 気がつかなかった理由。
そのままのことを言うと  
***Android Pieにアップデート後でも正常にテザリングできていたから***  

これなんですよ。
...え？と思いますよね。

実は、SIMカードを取り替えたんです。
今持っている回線は  

- UQmobile LTE-SIM
- IIJmio ミニマムプラン

この2つ。

自分は、XZ PremiumにUQmobileのLTE-SIMを挿して通信していたのです...  
（SMSと音声？何それ美味しいの？）

とはいえ、SMS認証が通らないとやっぱりつらいなと思い、遊んでいるIIJmioのSIMカードを引っ張りだしてきたわけです。

APNも設定して4Gアンテナピクトに切り替わった！って喜んでいました。

# テザリングがオンになっているのにテザリングできない
とうとうこの現象にぶち当たりました。

音声専用で使ってたもう一台の端末にネットワーク共有をしようとしたときです。

...?

...

繋がらない...

すぐさまIIJmioの動作端末リストを見に行きました...が、昔のdocomo端末でない限りテザリングはできますとな...。

Pie側の問題かと検索しても同じ症状が出てこない...

何がどうなってんだと悩みました。

# そもそもUQmobileで繋がってるんだから繋がるだろ
これですね。解決の糸口になったのは。

UQmobileの設定を見ました

[UQmobile公式サイト](https://www.uqwimax.jp/mobile/support/guide/apn/)

| 代表的な設定項目名  | 設定値 |
|:--|:--|
| APN名、アクセスポイント名  | uqmobile.jp |
| APN、APN設定  | uqmobile.jp |
| ID、ユーザーID、ユーザー名  | uq@uqmobile.jp |
| Password、パスワード  | uq |
| 認証タイプ、PPP認証タイプ、暗号タイプ  | CHAP |
| APNプロトコル  | IPv4v6、IPv4/IPv6 |
| APNタイプ  | default,mms,supl,hipri,dun |

IIJmioの公式サイトを見に行きました

[IIJmio公式サイト](https://www.iijmio.jp/service/manual/hdd/)

| APN | iijmio.jp |
|:--|:--|
| ユーザ名 | mio@iij |
| パスワード | iij |
| 認証タイプ | PAPまたはCHAP |


おや...APNタイプとか書かれていないな...

# 解決に至った方法

テザリングしたいAPN設定の`APNタイプ`を

```
default,mms,supl,hipri,dun
```
に設定してやること。

これで接続してくれるようになります。

# さて、ここからが本題

設定入れて保存しようとしたところ...  

【タイプdunのAPNの追加は許可されていません】  

...なんでやねん！

となる場合があり、これではテザリングできません。


# dunが追加できなかった場合

```
APNタイプ
ia,default,supl,hipri

MVNOの種類
GID

MVNO値(ここはキャリアによって違うようです。GID選択後に設定されるデフォルト値を利用してください)
FFFFFF
```

...原因不明ですがこうしてやると繋がった...という
括弧を語る数

- [括弧を語る数 ](https://onlinejudge.u-aizu.ac.jp/beta/room.html#RitsCamp19Day3/problems/B)

## コンテスト中の考察

- 僕とホスフィンくんで考えてた（なんかあんまり役に立てずに申し訳なさがある）
- `1234`みたいな数列は`()()()()`になって、`4321`みたいな数列は`(((())))`になるっぽい？
- 色々考えて、とりあえず「$p_{i-1}, p_i$の差が+1なら`()`を作って、-1なら括弧を最初と最後につけ加える。」みたいな方針がたった。差がプラマイ2以上だったら数列が作れないとした。
- でも、実験していくと差が＋２とか＋３でも数列が作れることがわかった。なので差が−2以上の場合のみ作れないと考えた
- でも、なんかうまくいかない。
- 「開き括弧が何番目か」という情報と「閉じ括弧が何番目か」という情報を持っていい感じに処理すればいける気がした。
- コードは[こんな感じ](https://onlinejudge.u-aizu.ac.jp/beta/review.html#RitsCamp19Day3/3417209)。サンプルは通るけど以下のケースで落ちる。このケースは作れないので`:(`が出力されていなければならない。

```cpp
5
1 3 5 4 2
()(()(()))
```

- その後、このケースを直せなかった。あと、直してもまたおかしいケースが出てくるんだろうなと思った。そもそも根本の解法が違いそうだなぁって感じだった。
- 僕はお手上げ。
- TMさんに投げたら一瞬で通してくれました。
- おしまい





## 解法

- [コード](https://onlinejudge.u-aizu.ac.jp/beta/review.html#RitsCamp19Day3/3416005)
- こんな感じで書くみたい
- 僕は眠いので寝ます。続きは明日書きます



## 要点

- 2つを対応させる時はスタックを使って解く！！って強い人が言ってた
  - `(`と`)`の対応とか。`o`と`x`の対応とか



## メモ

- スタック使って対応を解決させる問題、クッソ苦手
- ABC119かな？括弧を対応させるやつの類題みたいなやつ
- AOJの電卓の問題とかもスタックで解けそう
- 作問者、やっぱりえびちゃんだった。解けませんでした〜って言ったら「わぁい」って返ってきた。えーんえーん
Emacs で（コードを汚さず）自分用コメントを残したい

コードを読み書きするとき、自分用のちょっとしたコメントを残したい時ありますよね。しかし、直にコメントを書いてしまうとコードが汚れてしまって面倒です。

そこで、コードを変更することなしに、インラインでコメントを追加できる package を作ってみました！
本体は [GitHub/phantom-inline-comment](https://github.com/blue0513/phantom-inline-comment) に置いておきます。

追記(2019/05/05): [コメントの永続化について](#コメントの永続化)

## これは何？

ソースコードに変更を加えることなく、コメントを残せます。
（コメントを書いたとしても、ソースコード自体には diff が発生しません）

[![Image from Gyazo](https://i.gyazo.com/cefc091eb849b160901e221a23cc2885.gif)](https://gyazo.com/cefc091eb849b160901e221a23cc2885)

## 何が嬉しいの？

この package はコードを汚すことなくコメントを残せるので、例えばコードをガッと書くときやレビューをするとき、複雑なコードを読むときなどに自分用コメントを気軽に残せます。
また、コード上に直接書き込めるので、直感的にコメントの内容を再確認できます。

+ 「TODO: Rename this function!!」
<img width="491" alt="Screen Shot 2019-03-08 at 1.18.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/22eca0cd-52e8-1644-739e-34d287ed487c.png">

+ 「NOTE: Maybe this code will create a critical bug...」
<img width="662" alt="Screen Shot 2019-03-08 at 1.22.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/a9d24b38-9f08-5f74-4d0a-555532d93c43.png">

## セットアップ

`git clone` して init.el に以下を記述するだけです。

```elisp
(add-to-list 'load-path "YOUR PATH")
(require 'phantom-inline-comment)
```

## 使い方

### コメントの追加/編集

`M-x phantom-inline-comment`
カーソルの一行下にコメントを追加/編集します。
コマンド実行後、編集用の buffer がポップアップするので、そこにコメントを入力します。そして、 `C-c C-c` で変更を適用、`C-g` で変更をキャンセルします。

### コメントの削除

`M-x phantom-inline-comment-delete`
カーソルの一行下にあるコメントを削除します。

### コメントの全削除

`M-x phantom-inline-comment-delete-all`
全ての buffer のコメントを削除します。

### コメントの一覧表示

`M-x phantom-inline-comment-show-all`
全てのコメントを表示します。
表示されたファイル名/コメントにカーソルを当てて Enter を打つと、該当箇所にジャンプします。

### コメントの折りたたみ

`M-x phantom-inline-comment-toggle-all`
全てのコメントを一行に折りたたみます。
再度実行すると折りたたみを解除します。

## 注意事項

`overlay` を使用しており、コメントは buffer に紐付きます(cf. [Overlays](https://www.gnu.org/software/emacs/manual/html_node/elisp/Overlays.html))。
そのためコメントは永続化されず、 **Emacs を終了するとコメントは消えちゃいます。**なので、あくまで簡単なメモ書き用途で使うのがベストだと思います。

これについては以下の[コメントの永続化](#コメントの永続化)に回避方法を記載しました。

## コメントの永続化

あくまで実験的な機能ですが、Emacsを終了してもコメントを永続化させることができます。

```elisp
;; phantom-inline-comments を Emacs 終了時に保存します
(phantom-inline-comment-auto-save-mode t)

;; 保存した phantom-inline-comments をリストアします
(add-hook 'SOME-MODE-hook 'phantom-inline-comment-auto-restore-mode)
```
この設定により、Emacs が終了する際にコメントはデータファイル（デフォルトは `~/.phantom-inline-comment`）に保存されます。そして、コメントが書かれていたファイルを再度開くと、コメントが復活します。
有理数の自然対数を任意の精度以上の精度で有理数によって近似する

やり尽くされたようなテーマですが、
高校数学3までの知識があれば理解及び実装が容易のため、投稿させて頂きます。

入力: 非負有理数 m(!=1) & 精度p (P＞0)
目標: |ln(m)-A|<p　となるような有理数Aを求める。(ln(x)でxの自然対数を表す。)
方法:

次の2つの命題が証明されます。ただし、m＞1
(i)![image.png](https://qiita-image-store.s3.amazonaws.com/0/353824/2cbba28a-bfc1-f0e5-e38f-9dac6431bea2.png)

(ii)![image.png](https://qiita-image-store.s3.amazonaws.com/0/353824/d136bdbc-ccce-5b19-2b75-55558aba7d0c.png)

(i)はnに関する帰納法、
(ii)は0<=t<=x<=(m-1)/(m+1)という不等式を用いればよいです。

(i), (ii)から、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/353824/e13e9fc7-781f-95c8-e2b9-24ddeb7fab5f.png)
が得られるので、(右辺)＜pを満たすnを求めて、左辺の第2項を計算し、それが近似値として使えます。
m＜1の場合は、㏑(1/m)の近似値を求めて -㏑(1/m)を出力します。

以下、Pythonコード

```Python
Python

import numpy as np

n=0.03 #input
m=n if n>=1 else 1/n 
#print(m)
p=0.0001 #input


def error(m,n):
    denom=2*m*(2*n+1)*(m+1)**(2*n-1)    
    return ((m+1)**2)*((m-1)**(2*n-1))/denom

def ap_A(n,m):
    s=0
    for k in range(1,n+1):
       r=((m-1)/(m+1))**(2*k-1)
       s+=r/(2*k-1)
       #print(s)
    return 2*s

def n_finder(m,p):
    n=1
    while error(m,n)>p:
        n+=1
        #print(n,error(m,n))
    return n

ap=ap_A(n_finder(m,p),m)
if n<1: ap=-ap
print("An approximate value A s.t. |ln(n)-A|<p is ", ap) # output of result
print(abs(np.log(n)-ap)<p) # check
```