OmniAICreator/Qiita-1.07M huggingface dataset:
doxygen: C/C++文档生成工具

很多编程语言都有类似的文档工具，例如：Java有javadoc，Ruby有rdoc。
对于C/C++程序，我们可以用Doxygen生成文档。

---

参考:
http://www.stack.nl/~dimitri/doxygen/
http://www.fmddlmyy.cn/text21.html
http://www.cnblogs.com/duguguiyu/archive/2008/06/29/1231852.html
分布式消息队列——NSQ

NSQ是Go语言编写的，开源的分布式消息队列中间件，其设计的目的是用来大规模地处理每天数以十亿计级别的消息。
NSQ 具有分布式和去中心化拓扑结构，该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征，是一个成熟的已在大规模生成环境下应用的产品。

http://www.jfh.com/jfperiodical/article/1949 我们是如何使用NSQ处理7500亿消息的
http://www.chenjie.info/1891
https://blog.csdn.net/kk936321732/article/details/79099796
https://segmentfault.com/a/1190000009194607
https://www.jianshu.com/p/2b01403e3443
protobuf 编码之varint/zigzag

发现[Avro](http://avro.apache.org/docs/1.8.2/spec.html#binary_encoding)为了对int、long类型数据压缩，采用Protocol Buffers的[ZigZag](https://developers.google.com/protocol-buffers/docs/encoding)编码Thrift也采用了类似的算法.

---

参考:

https://izualzhy.cn/protobuf-encode-varint-and-zigzag
https://www.cnblogs.com/en-heng/p/5570609.html
Makefile 文件的编译

首先要把源文件编译成中间代码文件，在Windows下是 .obj 文件，UNIX下是 .o 文件，即 Object File，这个动作叫做编译（compile），一般来说，每个源文件都应该对应于一个中间目标文件（O文件或是OBJ文件）。然后再把大量的Object File合成执行文件，这个动作叫作链接（link）。

链接时，主要是链接函数和全局变量，所以，我们可以使用这些中间目标文件（O文件或是OBJ文件）来 链接我们的应用程序。链接器并不管函数所在的源文件，只管函数的中间目标文件（Object File），在大多数时候，由于源文件太多，编译生成的中间目标文件太多，而在链接时需要明显地指出中间目标文件名，这对于编译很不方便，所以，我们要给 中间目标文件打个包，在Windows下这种包叫“库文件”（Library File)，也就是 .lib 文件，在UNIX下，是Archive File，也就是 .a 文件。

参考:

http://www.cnblogs.com/luchen927/archive/2012/02/05/2339002.html
golang 基本语法

#### 打包工具

https://blog.bluerain.io/p/Golang-Glide.html

#### import
```
import (
    "database/sql"
    _ "github.com/lib/pq" // 只引入, 不运行 init 函数
)
```

#### Printf
```
%d        十进制
%x %o %b  十六进制 八进制 二进制
%f %g %e  浮点数
%t        布尔类型
%c        字符(unicode码点)
%s        字符串
%q        带引号的字符
%v        内置格式的任何类型
%T        任何值的类型( 代替 reflect.TypeOf(x) )
%%        %本身(转义符)
```
```golang
fmt.Printf("|%-6s|%-6s|\n", "foo", "b")
s := fmt.Sprintf("a %s", "string")
fmt.Println(s)
// Printf通过 os.Stdout输出格式化的字符串,Sprintf格式化并返回一个字符串而不带任何输出

fmt.Fprintf(os.Stderr, "an %s\n", "error")
//使用 Fprintf 来格式化并输出到 io.Writers而不是 os.Stdout
```
#### Reflect

https://my.oschina.net/solate/blog/715681
http://www.cnblogs.com/coder2012/p/4881854.html

---

golang context

https://yq.aliyun.com/articles/69662
https://deepzz.com/post/golang-context-package-notes.html

---
golang 交叉编译

https://www.digitalocean.com/community/tutorials/how-to-build-go-executables-for-multiple-platforms-on-ubuntu-16-04

---

golang 原子操作

原子操作

```
atomic.CompareAndSwapInt32 //简称CAS

atomic.LoadInt32

atomic.AddUint32

atomic.StoreInt32

atomic.SwapInt32
```

https://www.jianshu.com/p/228c119a7d0e

http://www.opscoder.info/golang_mutex.html
16进制转换10进制

```golang
package main

import (
    "fmt"
    "strconv"
)

func main() {
    hex := "0xC40C5253"
    val := hex[2:]
    
    n, err := strconv.ParseUint(val, 16, 32)
    if err != nil {
        panic(err)
    }
    
    n2 := uint32(n)
    fmt.Print(n2)
}
```

#### float64 convert to string

```golang
package main

import "fmt"
import "strconv"

func FloatToString(input_num float64) string {

	// to convert a float number to a string
	return strconv.FormatFloat(input_num, 'f', 6, 64)
}

func main() {
	fmt.Println(FloatToString(21312421.213123))
}
```

#### string hex  convert to big.Int

```golang

hexToBigInt("0x12a05f200")

func hexToBigInt(hex string) *big.Int {
	n := new(big.Int)
	n, _ = n.SetString(hex[2:], 16)

	return n
}
```
---

参考:
https://play.golang.org/p/IL76yCuzsMh

https://blog.linux-mac.com/2018/06/01/33.html
如何解析微信的语音文件

>![](https://upload-images.jianshu.io/upload_images/47789-58b9e8e715868264.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

前几天想把微信里的语音文件导出来，就研究了一下，是个麻烦事儿：aud格式不是常见的音频格式(它现在隶属于Skype)，拿到电脑上无法直接播放，还是转成wmv、mp3更通用的格式比较方便。

如何处理微信语音的 aud文件呢？

1、现在的aud文件本质上是silk格式，只需要去掉第1个字节，后面紧跟着的就是`#!SILK_V3`
2、此时使用某种工具，可以将silk文件转换成pcm 音频文件
3、再将pcm转成wav、mp3等

经过一番查找，发现了能将 silk文件转为 pcm格式的格式的工具 `silk-v3-decoder` —— https://github.com/kn007/silk-v3-decoder

## 如何使用 silk-v3-decoder

先 clone silk-v3-decoder， 然后进入 `silk`文件夹，你会发现 `Makefile` 文件，直接织编译即可，或者使用项目提供的脚本。

`sh converter.sh 33921.aud.silk mp3`
其中`33921.aud.silk`是要转换的文件，而mp3是最终转换后输出的格式。

如果你需要批量转换，比如转换某个目录，那么使用：`sh converter.sh input-folder ouput-folder mp3`

其中input-folder是要转换的目录，而ouput-folder是最终转换后音频输出的目录，最后的mp3是最终转换后输出的格式。

如果想要输出 wmv，自然是  `sh converter.sh input-folder ouput-folder wmv`

## 如何合并多个音频文件

对于音频来说，有左声道、右声道，用 ffmpeg合并很麻烦，一些合并参数始终没弄明白，于是又找到了一个好工具  [SoX](http://sox.sourceforge.net/Main/HomePage)。

SoX(即 Sound eXchange)是一个跨平台(Windows，Linux，MacOS 等)的命令行实用程序，可以将各种格式的音频文件转换为需要的其他格式。SoX 还可以对输入的音频文件应用各种 **效果**，也支持在大多数平台上 **播放** 和 **录制**音频文件。


### 格式转换
`sox file.wav file.mp3`
将文件的格式由 `wav` 转为 `mp3`

### 拼接文件

`sox 1.wav 2.wav Full.wav`

将 `1.wav` 和 `2.wav` 合并至 Full.wav 文件，注意合并前的音频文件需保持一致的类型和采样率等。


sox 的操作比ffmpeg方便了太多，更多的sox技巧请大家参考它的使用文档。

---

参考：

https://zhuanlan.zhihu.com/p/21783890

http://iosre.com/t/topic/3199

[Extracting Audio Messages from WeChat](https://kronopath.net/blog/extracting-audio-messages-from-wechat/)

https://github.com/kn007/silk-v3-decoder

[SoX — 音频处理工具里的瑞士军刀](https://www.jianshu.com/p/be8977de4a6b)

https://www.jianshu.com/p/cdb9d2e2bc14
常用的音频降噪软件

>![](https://upload-images.jianshu.io/upload_images/47789-fa06a55d276e3b76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

## iMovie

[iMovie如何消除视频中的杂音](https://www.jianshu.com/p/e10484c1c47d)

>![](https://upload-images.jianshu.io/upload_images/47789-6c27cd4015d6cac2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

##开源音频软件Audacity

Audacity UI确实丑的很到位，符合开源软件的气质，需要另外安装ffmpeg

[Audacity如何降噪](https://www.bilibili.com/video/av71815158)

## Adobe Audition
Adobe出品，品质有保障，但是安装麻烦，还贵，没用过

[Audition一键去除杂音](https://www.bilibili.com/video/av11866421/)

## 特殊技巧

iMovie 可以降噪， 但是 iMovie  导出的视频文件(音频流+视频流) 太大了，我先从iMovie导出处理好的音频流，再把原来的视频只导出视频流，在把他们合并了，美得很。

如何导出视频流？戳 https://www.jianshu.com/p/cdb9d2e2bc14
MacをActive Directory Domainに参加させてみた

MacをAD Domainに参加させる手順です。

# DNS ResolverをADにする
Macが搭載している全てのNetwork AdaptorのDNS ResolverをADに設定してDomainの名前解決ができるようにします。


搭載しているNetwork Adaptorを確認します。

```console
$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
PCI Serial Adapter (0)
Ethernet
Thunderbolt Ethernet Slot 1
Thunderbolt Bridge
```

DNS ResolverをADにします。"xx.xx.xx.xx"はADのIPを指定します。

```console
$ networksetup -setdnsservers "PCI Serial Adapter (0)" xx.xx.xx.xx
$ networksetup -setdnsservers "Ethernet" xx.xx.xx.xx
$ networksetup -setdnsservers "Thunderbolt Ethernet Slot 1" "xx.xx.xx.xx"
$ networksetup -setdnsservers "Thunderbolt Bridge" "xx.xx.xx.xx"
```

Domainの名前解決ができるか確認します。Answer SectionでAレコードが返ってきていれば成功です。

```console
% dig mokomoko.local

; <<>> DiG 9.10.6 <<>> mokomoko.local
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15337
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;mokomoko.local.			IN	A

;; ANSWER SECTION:
mokomoko.local.		600	IN	A	172.31.20.69

;; Query time: 0 msec
;; SERVER: 172.31.20.69#53(172.31.20.69)
;; WHEN: Tue Jun 01 07:47:42 GMT 2021
;; MSG SIZE  rcvd: 59
```


# MacをDomainに参加させる
"System Preferences" -> "Users & Groups"をクリックします。
<img src="https://i.imgur.com/b5U2tv0.jpg" width=50%>

"Network Accont Server" -> "Join"をクリックします。
<img src="https://i.imgur.com/2XGKSfO.jpg" width=50%>

"Open Directory Utility..."をクリックします。
<img src="https://i.imgur.com/gVlsaB4.jpg" width=50%>

"Active Directory"をダブルクリック、"Active Directory Domain:"にDomain名を、"Computer ID:"に任意の文字列を入力して"Bind"をクリックします。
<img src="https://i.imgur.com/6UNdBZf.jpg" width=50%>

Domain Adminのクレデンシャルを入力してOKをクリックします。
<img src="https://i.imgur.com/t8mUrOc.jpg" width=50%>

OKを押します。
<img src="https://i.imgur.com/RyFpa7v.jpg" widht=50%>

緑のランプが点灯していれば成功です。
<img src="https://i.imgur.com/VbBJAvE.jpg" width=50%>
从MP4文件中提取H264视频流

https://qiita.com/shooter/items/faf35683217cde476b1e

## 从MP4文件中提取 aac 音轨

```
ffmpeg -i new.mp4 -vn -acodec copy new.aac

ffmpeg -i file.mp4 -vn -y -acodec copy file.m4a
```

## 从mov文件提取 pcm 音频文件

```
ffmpeg -i 1.MOV -acodec pcm_s16le -f s16le -ac 1 -ar 16000 1.pcm
```

## 从MP4文件中提取H264裸流

`ffmpeg -i file.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264`

## MP3转换为aac格式

`ffmpeg -i input.mp3 -codec:a aac output.aac`

## pcm 转 mp3

```
ffmpeg -y -f s16be -ac 2 -ar 16000 -acodec pcm_s16le -i 1.pcm 1.mp3
```

## 使用aac音频文件和h264文件生成新的mp4文件

`ffmpeg -i input.aac -i input.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 ok.mp4`


## Remove audio from video file 

```
ffmpeg -i old.mov -c copy -an new.mov
```

---

参考：

https://gist.github.com/protrolium/e0dbd4bb0f1a396fcb55

https://superuser.com/questions/268985/remove-audio-from-video-file-with-ffmpeg

https://stackoverflow.com/questions/9913032/how-can-i-extract-audio-from-video-with-ffmpeg

https://www.cnblogs.com/klchang/p/9126065.html

https://segmentfault.com/a/1190000016652277
ffmpeg 切割音频文件


```shell
sox file.mp3 out.mp3 trim 0 900 : newfile : restart

# 会在当前目录下生成名称前缀为 out 格式为 .mp3 时长为900 秒的若干个音频片段
```

https://stackoverflow.com/a/33600461

`ffprobe  file.aac  -hide_banner -show_format`

https://imtx.me/archives/2718.html
https://www.jianshu.com/p/7647a55daa18

```
ffmpeg -ss 00:00:00 -t 00:05:00 -i file.m4a -c copy cut.m4a

ffmpeg -i file.m4a -f segment -segment_time 900 -write_xing 0 -c copy out%03d.m4a
```

[screenflow导出音频](https://medium.com/@mikemurphyco/290-export-audio-only-in-screenflow-84aedcfe8abf)

---
音频的详细信息

`ffprobe file.aac  -hide_banner -show_format`

---

[音频aac转为mp3格式](https://stackoverflow.com/questions/3255674/convert-audio-files-to-mp3-using-ffmpeg)

```
ffmpeg -i file.m4a -acodec libmp3lame audio.mp3
```
---

https://zhuanlan.zhihu.com/p/28008666
https://zhuanlan.zhihu.com/p/27366331

---

参考：

`-write_xing 0`
[Mac上有ffmpeg切割文件导致Duration的start_time不正确的解决方法](https://superuser.com/a/764748)

 https://zhuanlan.zhihu.com/p/28008666

http://trac.ffmpeg.org/wiki/Seeking
GitHubでforkしたリポジトリはデフォルトでActionsがdisableです

## はじめに

この記事はGitHubでforkしたリポジトリにて、GitHub Actionsを動かす方法を記録、共有するためのものです。

## 先に結論だけ

-   GitHubでActionsを設定したリポジトリをforkした場合、デフォルト設定ではアクションは不許可になっています。
-   Actionsを動かす場合、forkしたユーザーが許可しなければなりません。
-   これは悪意のあるアクションを防ぐためです。

## GitHub Actionsとは

[GitHub Actions](https://github.co.jp/features/actions)とは、GitHubが提供する仮想環境サービスです。

ユーザーは[YAML](https://yaml.org/)形式で実行環境とアクションを記述し、一連のワークフローを作成します。特定のブランチにpushがあった、PullRequestが作成されたなどのイベントを引き金に、このワークフローが稼働します。

-   プルリクエストが作成されるとテストを実行する
-   mainブランチへのマージがあるたびにnpmへリリースする
-   静的ファイルの更新のたびにS3へファイルをアップロードする

といった、CI/CDのための自動化処理が可能になります。

ワークフローはリポジトリ内で他のソースコードと同様に管理されます。そのため、チームメンバーで共有、改善ができます。

## forkしたリポジトリのActions設定

公開リポジトリをフォークすると、デフォルトではActionsの実行が不許可になっています。fork元のリポジトリとおなじアクションを実行したい場合、ユーザーが許可しなければなりません。

![](https://www.evernote.com/l/AAkyqUy_Qs5C6KxbYU3Mftq5atAXC_uL29gB/image.png)

Settingタブ → Actions → Actions Permissionsを表示し

-   Allow all actions
-   Allow select actions

のいずれかを選択しSaveします。

Allow select actionsにはチェックボックスがあります。このチェックボックスは

-   GitHubが公式に作成したAction
-   [GitHub MarketPlace](https://github.com/marketplace)で公開されているAction

の実行をそれぞれ許可します。

## なぜデフォルトが不許可なのか

Actionsは汎用的な仮想環境サービスです。そのためCI/CD以外の処理もワークフローとして記述できてしまいます。GitHubは目的外でのActionsの[利用を規約で禁止しています。](https://docs.github.com/ja/github/site-policy/github-additional-product-terms#5-%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8)

ワークフローは[様々なトリガー](https://docs.github.com/ja/actions/reference/events-that-trigger-workflows)で実行され、時刻もトリガーになります。デフォルトで実行が許可されていたら、forkしただけでワークフローが実行されます。

悪意のあるユーザーがリポジトリに規約違反のワークフローを混入した場合、デフォルトで実行許可があるとforkしたユーザーも利用規約違反となります。こうした問題を回避するために、Actionsはデフォルトで不許可になっています。ユーザーは実行許可を出す前に、ワークフローの目的と内容をチェックしなくてはいけません。

以上、ありがとうございました。
ffmpeg之ffprobe

https://qiita.com/shooter/items/5a3dfea5c00a16df6475

## 基本介绍

FFmpeg是一套非常知名的音视频处理的开源工具，它包含了开发完成的工具软件、封装好的函数库以及源代码供我们按需使用。FFmpeg提供了非常强大的功能，可以完成视频采集、音视频的编码、解码、转码、后处理（抓图、水印、封装/解封装、格式转换等），还有流媒体服务等诸多功能，可以说涵盖了音视频开发中绝大多数的领域。

##  mac 安装

```
brew install ffmpeg -with-ffplay
```

## FFmpeg组成

FFmpeg有四个不同作用的工具软件，分别是：

- ffmpeg：音视频转码器
- ffplay：简单的音视频播放器
- ffserver: 流媒体服务器
- ffprobe：简单的多媒体码流分析器

## 使用方法

```
ffprobe -print_format json -show_format  -i file.mp4

# -print_format json #以json格式输出
# -show_format  输出封装格式信息
# -show_streams 输出流信息

"format":{
    "filename":"file.mp4",
    "nb_streams":2,
    "nb_programs":0,
    "format_name":"mov,mp4,m4a,3gp,3g2,mj2",
    "format_long_name":"QuickTime / MOV",
    "start_time":"0.000000",
    "duration":"4560.557000",
    "size":"2417651585",
    "bit_rate":"4240975",
    "probe_score":100,
    "tags":{
          "major_brand":"mp42",
          "minor_version":"0",
          "compatible_brands":"isommp42",
          "creation_time":"2018-05-20T07:36:17.000000Z",
          "com.android.version":"9"
    }
}
```

## 例子

```
ffprobe -loglevel 0 -print_format json -show_format -show_streams 1.MOV
```

---

参考：

http://ffmpeg.org/ffprobe.html
https://juejin.im/post/5a59993cf265da3e4f0a1e4b
https://mp.weixin.qq.com/s/FpDuI0VnRN63TfIXEKAdcw
简单上手 LXC (Linux Containers)

LXC是Linux containers的简称，操作系统级别的虚拟化技术。它可以在操作系统层次上为进程提供的虚拟的执行环境。一个虚拟的执行环境被称为一个容器(container)。可以为容器绑定特定的cpu和memory节点，分配特定比例的cpu时间、IO时间，限制可以使用的内存大小（包括内存和是swap空间），提供device访问控制，提供独立的namespace（网络、pid、ipc、mnt、uts）。

如果你了解Docker, 很可能听说过LXC.

### 安装
`sudo apt-get install lxc`

### 查看系统模板

```
ls /usr/share/lxc/templates/

lxc-alpine     lxc-centos    lxc-fedora        lxc-oracle
lxc-altlinux   lxc-cirros    lxc-gentoo        lxc-plamo
lxc-archlinux  lxc-debian    lxc-openmandriva  lxc-sshd
lxc-busybox    lxc-download  lxc-opensuse      lxc-ubuntu
```

###  创建系统
要花费很多时间

```
sudo lxc-create -t ubuntu -n zqw
# -n 是 name 缩写
```

### 启动

`sudo lxc-start -n zqw -d`

### 显示lxc创建的系统

`sudo lxc-ls`

### 通过控制台进入系统

`sudo lxc-console -n zqw`, 就可以在系统内执行shell啦

### 停止

` lxc-stop -n zqw`

### 通过配置文件进入系统

```
# gitian的配置文件
# https://github.com/devrandom/gitian-builder/blob/master/etc/lxc.config.in

lxc.tty = 4
lxc.pts = 1024
lxc.rootfs = ROOTFS
lxc.arch = ARCH
lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm

# mounts points
lxc.mount.entry=proc ROOTFS/proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry=sysfs ROOTFS/sys sysfs defaults  0 0

# Container with network virtualized using a pre-configured bridge named br0 and
# veth pair virtual network devices
# On the host, run: ifconfig br0 up 10.0.2.2
# Alternatively, you can use another IP range for the bridge interface, in this case set
# the environment variables GITIAN_HOST_IP and LXC_GUEST_IP appropriately.
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = GUESTLINK
lxc.network.ipv4 = GUESTIP/24
lxc.network.ipv4.gateway = auto

lxc.utsname = gitian
```

```
sudo lxc-start -n gitian -f gitian-builder/var/lxc.config
sudo lxc-attach -n gitian -f gitian-builder/var/lxc.config

# -n name缩写
# -f file缩写, 输入配置文件路径
```

---

参考:

https://segmentfault.com/a/1190000000443812

https://www.ibm.com/developerworks/cn/linux/l-lxc-containers/

https://knowledge.sakura.ad.jp/2108/ 日文
git clean

**FBI warning:** `git clean -df` 之后的文件无法恢复

`git clean -n`
是一次clean的演示， 告诉你哪些文件会被删除。 这个命令不会真正的删除文件，只是一个提醒。

`git clean -f`
删除当前目录下所有没有track过的文件。不会删除 `.gitignore`文件里指定的文件夹和文件，不管这些文件有没有被track过。

`git clean -f <path>`
删除指定路径下的没有被track过的文件

`git clean -df`
删除当前目录下没有被track过的文件和文件夹

`git clean -xf`
删除当前目录下所有没有track过的文件。不管是不是`.gitignore`文件里面指定的文件夹和文件。

---

参考:

http://www.cnblogs.com/irocker/p/git-clean.html

https://loveky.github.io/2013/12/18/git-clean/
阿里云挂载数据盘

## 查看有没有数据盘

```
sudo fdisk -l

Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors

Device     Boot Start      End  Sectors Size Id Type
/dev/vda1  *     2048 83884031 83881984  40G 83 Linux


Disk /dev/vdb: 200 GiB, 214748364800 bytes, 419430400 sectors
```

`/dev/vdb 200 GiB` 恩, 发现有个200GB的硬盘。

## 分区

运行 `sudo fdisk /dev/vdb`，在 `Command (m for help): ` 提示后, 键入 `n`, 以后的步骤直接按 `Enter`确认。
```
sudo fdisk /dev/vdb

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-419430399, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-419430399, default 419430399):

Created a new partition 1 of type 'Linux' and of size 200 GiB.
```
看到类似提示， 输入 `w`

```
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```
## 格式化 

`mkfs.ext4 /dev/vdb1` 是格式化为ext4。
如果要格式化成ext3，执行 `mkfs.ext3 /dev/vdb1`。

```
mkfs.ext4 /dev/vdb1
mke2fs 1.42.13 (17-May-2015)
Found a dos partition table in /dev/vdb1
Proceed anyway? (y,n) y
Creating filesystem with 52428544 4k blocks and 13107200 inodes
Filesystem UUID: 8a6c75c7-3bea-4d6c-8bcf-8a638db536e0
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

```

## 分区信息写入 fstab

下次开机启动时可以自动挂载, 不然每次开机都要手动挂载

```
echo "/dev/vdb1 /mnt ext4 defaults 0 0" >> /etc/fstab
```

## 挂载

```
mount /dev/vdb1 /mnt/vol
```

## 查看硬盘情况

```
 df -h
```

---

参考:
https://help.aliyun.com/document_detail/25426.html

https://help.aliyun.com/document_detail/111738.html
GitHub开启二次验证后, 通过https方式clone项目

>![](https://upload-images.jianshu.io/upload_images/47789-bd3fe9258199af62.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

GitHub [开启二次验证后](https://github.com/settings/two_factor_authentication/intro)， 无法通过 https 的方式clone项目

申请 [Personal access tokens](https://github.com/settings/tokens)，申请的token 当做用户密码，就能正常clone项目。

---

参考：

https://stackoverflow.com/a/34919582/6132577
markdown 表格


| 左对齐标题 | 右对齐标题 | 居中对齐标题 |
| :------| ------: | :------: |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |

```
| 左对齐标题 | 右对齐标题 | 居中对齐标题 |
| :------| ------: | :------: |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |

```

参考:

https://jmalarcon.github.io/markdowntables/
manage.py collectstatic時のエラー

##はじめに
djangoで作ったアプリのファイルをAWS上に配置しようとした際に発生したエラーです。
間違っている点あればご指摘ください。

##エラー内容

EC２にSSH接続した後に仮想環境をアクティベートの状態でmanage.pyのあるディレクトリで

```python:ターミナル
python manage.py collectstatic
```
コマンドを入力すると

```python
Traceback (most recent call last):
  File "/home/app_admin/venv_private_diary/lib/python3.7/site-packages/django/core/management/__init__.py", line 237, in fetch_command
    app_name = commands[subcommand]
KeyError: 'collectstatic'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/home/app_admin/venv_private_diary/lib/python3.7/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/app_admin/venv_private_diary/lib/python3.7/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/app_admin/venv_private_diary/lib/python3.7/site-packages/django/core/management/__init__.py", line 244, in fetch_command
    settings.INSTALLED_APPS
  File "/home/app_admin/venv_private_diary/lib/python3.7/site-packages/django/conf/__init__.py", line 82, in __getattr__
    self._setup(name)
  File "/home/app_admin/venv_private_diary/lib/python3.7/site-packages/django/conf/__init__.py", line 69, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/app_admin/venv_private_diary/lib/python3.7/site-packages/django/conf/__init__.py", line 170, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'private_diary'
```
のエラーが発生してしまいました。

##原因
`settings.py`内のINSTALLED_APPSのリストにprivate_diaryを追加していなかったことが原因。

##注意点
上記の原因を変更した後にローカルリポジトリにコミットしてリモートリポジトリにプッシュしてから`git pull`コマンドで変更内容を適用してください。私はコミットするのを忘れてしまい問題解決できず堂々巡りしてしまいました。
また`python manage.py collectstatic`する際は仮想環境にアクティベートしていないと

```python
File "manage.py", line 16
    ) from exc
         ^
SyntaxError: invalid syntax
```
上記のエラーが発生してしまうので気をつけてください。
python 字节序

阮一峰 - [理解字节序](http://www.ruanyifeng.com/blog/2016/11/byte-order.html)

#### 获取字节顺序
```python
import sys

endianness = sys.byteorder
print("system Endianness is "+ endianness)
```

#### 大小端转换

```python

"6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000".decode('hex')[::-1].encode('hex_codec') 
#=> 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
```

[000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f](https://www.blockchain.com/btc/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f)

```python
import struct

ver = 1
prev_block = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
mrkl_root = "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098"
time = 1231469665
bits = 486604799
nonce = 2573394689

struct.pack("<L", ver) #转换为 unsigned long型小端
prev_block.decode('hex')[::-1] # 转换为16进制并大小端转换
mrkl_root.decode('hex')[::-1] # 转换为16进制并大小端转换
struct.pack("<LLL", time, bits, nonce) # 把3个变量转换为 unsigned long型小端
```

#### struct

在struct中有以下几种字节顺序

|Character|Byte order|Size|Alignment|
|--- |--- |--- |--- |
|@|native|native|native|
|=|native|standard|none|
|<|little-endian|standard|none|
|>|big-endian|standard|none|
|!|network (= big-endian)|standard|none|

|字符|字节顺序|尺寸|对齐方式|
|--- |--- |--- |--- |
|@|本机|本机|本机|
|=|本机|标准|无|
|<|小端|标准|无|
|>|大端|标准|无|
|！|网络即大端|标准|无|

数据格式

|Format|C Type|Python type|Standard size|Notes|
|--- |--- |--- |--- |--- |
|x|pad byte|no value|||
|c|char|bytes of length 1|1||
|b|signed char|integer|1|(1),(3)|
|B|unsigned char|integer|1|(3)|
|?|_Bool|bool|1|(1)|
|h|short|integer|2|(3)|
|H|unsigned short|integer|2|(3)|
|i|int|integer|4|(3)|
|I|unsigned int|integer|4|(3)|
|l|long|integer|4|(3)|
|L|unsigned long|integer|4|(3)|
|q|long long|integer|8|(2), (3)|
|Q|unsigned long
long|integer|8|(2), (3)|
|n|ssize_t|integer||(4)|
|N|size_t|integer||(4)|
|e|(7)|float|2|(5)|
|f|float|float|4|(5)|
|d|double|float|8|(5)|
|s|char[]|bytes|||
|p|char[]|bytes|||
|P|void *|integer||(6)|


|字符|C类型|python类型|标准尺寸|
|--- |--- |--- |--- |
|x|填充字节|没有意义的值||
|c|char|长度为1的字节|1|
|b|signed char|整型|1|
|B|unsigned char|整型|1|
|？|_Bool|布尔|1|
|h|short|整型|2|
|H|unsigned short|整型|2|
|i|int|整型|4|
|I|unsigned int|整型|4|
|l|long|整型|4|
|L|unsigned long|整型|4|
|q|long long|整型|8|
|Q|unsigned long long|整型|8|
|n|ssize_t|整型||
|N|size_t|整型||
|e||浮动|2|
|f|float|浮动|4|
|d|double|浮动|8|
|s|char[]|字节||
|p|char[]|字节||
|P|void *|整型||

---

参考:

https://en.wikipedia.org/wiki/Endianness
https://docs.python.org/3/library/struct.html
https://blog.csdn.net/youand_me/article/details/78890316
https://stackoverflow.com/questions/7869752/javascript-typed-arrays-and-endianness
github: 同步PR到项目本地

比如同步bitcoin的第11000个PR  https://github.com/bitcoin/bitcoin/pull/11000
在项目目录下执行`git fetch origin  pull/11000/head:pr_11000`

通用格式：`git fetch <remote>  pull/11000/head:<branch_name>`

---

参考:

https://help.github.com/articles/checking-out-pull-requests-locally/
Github绑定GPG签名

>![](https://upload-images.jianshu.io/upload_images/47789-026da000824b7f55.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

### GPG 是什么

>1991年，[Phil Zimmermann](https://en.wikipedia.org/wiki/Phil_Zimmermann)开发了加密软件PGP，用来加密邮件。这个软件非常好用，迅速流传开来，成了许多程序员的必备工具。但是，它是商业软件，不能自由使用。所以，自由软件基金会决定，开发一个PGP的替代品，取名为GnuPG。这就是GPG的由来。

PGP是商业软件，GPG是 PGP的替代品，并且免费开源。

##  生成GPG签名

`gpg --gen-key`

请看 http://www.ruanyifeng.com/blog/2013/07/gpg.html

## 绑定Git

`git config --global user.signingkey <GPG key>`

## 为commit生成签名
`git commit -S -m 'msg '  ` ，加个`-S` 参数就OK了

git commit做了签名提交之后，github会显示 Verified。

>![Verified](http://upload-images.jianshu.io/upload_images/47789-0babf4ac3182ab56.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

---

参考：

https://help.github.com/en/articles/adding-a-new-gpg-key-to-your-github-account
https://help.github.com/articles/signing-commits-with-gpg
Django 2

#### 版本

`python -m django --version`

### Creating a project

` django-admin startproject <web>`

#### Run

```
python manage.py runserver
python3 manage.py runserver
python3 manage.py runserver 0:8000
```

#### Creating app
`python manage.py startapp notify`

#### Models

```python
from django.db import models

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)
    updated_at = models.DateTimeField(auto_now=True, db_index=True)

    class Meta:
        abstract = True

###################################

class Addrs(BaseModel):
    address = models.CharField(max_length=100, unique=True)
    balance = models.BigIntegerField(default=0, help_text="余额")

    class Meta:
        db_table = "addrs"
```

#### Migrations
`python manage.py makemigrations`
`python manage.py migrate`

#  Console

` python manage.py shell`

#### Rollback Migrations

```
python manage.py showmigrations shop

  web
  [X] 0001_initial
  [X] 0002_transactions

##########
python manage.py migrate shop 0001_initial

  Operations to perform:
    Target specific migration: 0001_initial, from shop
  Running migrations:
    Rendering model states... DONE
    Unapplying shop.0002_transactions... OK

```

#### Admin

`python manage.py createsuperuser `

#### 静态文件

`python manage.py collectstatic`

---

参考:

https://docs.djangoproject.com/en/2.0/intro/tutorial01/
https://zhuanlan.zhihu.com/p/32913361
bash中的for循环

```bash
for i in 1 2 3 4 5
do
   echo "Welcome $i times"
done

# bash version 3.0+
for i in {1..5}
do
   echo "Welcome $i times"
done

# bash version 4.0+
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
do 
    echo "Welcome $i times"
done

for (( c=1; c<=5; c++ ))
do
   echo "Welcome $c times"
done

```

---

参考:

https://www.cyberciti.biz/faq/bash-for-loop/
AWK

```
ls -lh | awk '{print $5, $9}'

cat /etc/passwd | awk -F':' '{print $1}' # 分隔符
```

---

```
md5 *.m4a | awk '{ print $4 }'  | uniq -c | wc -l

ll | awk '{ print substr($5, 1, length($5)-1) }'

paste -s -d '+' file.txt

```

31+30+32+32+32+33+33+33+33+33+33+32+32+33+33+33+33+33+30+33+33+32+33+33+29+33+32+33+32+32+31+32+32+33+32+29+32+31+33+32+32+29+33+30+30+33+33+31+29+30+28+27+32+32+33+31+28+33+33+33+32+33+32+31+33+33+33+34+31+32+33+33+33+33+33+32+32+33+34+32+30+32+33+31+30+31+29+32+32+31+32+30+29+31+32+23+32+33+31+31

http://stackoverflow.com/questions/14840953/how-to-remove-a-character-at-the-end-of-each-line-in-unix

http://stackoverflow.com/questions/450799/shell-command-to-sum-integers-one-per-line

http://roclinux.cn/?p=1334

http://unix.stackexchange.com/questions/170961/get-total-duration-of-video-files-in-a-directory

http://stackoverflow.com/questions/8933053/check-duration-of-audio-files-on-the-command-line

—--

Linux下查找并批量修改文件扩展名

http://www.cnblogs.com/knows/archive/2013/01/02/2842489.html

http://www.ahlinux.com/start/cmd/498.html

find ./ -type f -name "*.less" | xargs rename "s/less/scss/"
Git Objects

```
echo '123' | git hash-object -w --stdin
# 3670911e6f6449df03f225ee1efb5acb8bfd4bc7

find .git/objects -type f
# .git/objects/36/70911e6f6449df03f225ee1efb5acb8bfd4bc7

git cat-file -p 3670911e6f6449df03f225ee1efb5acb8bfd4bc7
# zqw

####################

echo 'version 1' > ver.txt

git hash-object -w ver.txt
# 83baae61804e65cc73a7201a7252750c76066a30

find .git/objects -type f
# .git/objects/83/baae61804e65cc73a7201a7252750c76066a30

git cat-file -p  83baae61804e65cc73a7201a7252750c76066a30
# version 1

####################

git cat-file -t 3670911e6f6449df03f225ee1efb5acb8bfd4bc7
# blob
```

```
git update-index --add new.txt

####################

git write-tree
4873235733fd7a44f2c3e73937dd09e064cbac53

####################

echo 'first commit' | git commit-tree 4873235
0b74f629a3b25a22821634bc34cdd3077256ce39

####################

git cat-file -p 0b74f629a3b25a22821634bc34cdd3077256ce39
  tree 4873235733fd7a44f2c3e73937dd09e064cbac53
  author shooter <shooter@bitcoin.org> 1520676818 +0800
  committer shooter <shooter@bitcoin.org> 1520676818 +0800

  first commit
```

```
git log --stat 0b74f6
commit 0b74f629a3b25a22821634bc34cdd3077256ce39
Author: shooter <shooter@bitcoin.org>
Date:   Sat Mar 05 08:13:38 2017 +0800

    first commit

 new.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
```

#### Git 如何存储对象
通过 Ruby 脚本语言存储一个 git blob 对象

```ruby
require 'digest'
require 'zlib'

content = "what is up, doc?"

header = "blob #{content.length}\0"
# => "blob 16\u0000"

store = header + content
# => "blob 16\u0000what is up, doc?"

sha1 = Digest::SHA1.hexdigest(store)
# => "bd9dbf5aae1a3862dd1526723246b20206e5fc37"

sha1[0,2]
# => "bd"

sha1[2,38]
# => "9dbf5aae1a3862dd1526723246b20206e5fc37"

zlib_content = Zlib::Deflate.deflate(store)
# => "x\x9CK\xCA\xC9OR04c(\xCFH,Q\xC8,V(-\xD0QH\xC9O\xB6\a\x00_\x1C\a\x9D"

path = '.git/objects/' + sha1[0,2] + '/' + sha1[2,38]
# => ".git/objects/bd/9dbf5aae1a3862dd1526723246b20206e5fc37"

FileUtils.mkdir_p(File.dirname(path))
# => [".git/objects/bd"]

File.open(path, 'w') { |f| f.write zlib_content }
# => 32
```

---

参考:

https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
python 查看内存占用

```python
import resource
import memory_profiler

def using():
    usage = resource.getrusage(resource.RUSAGE_SELF)
    mem = usage[2]*resource.getpagesize() /1000000.0
    print("mem: ", mem,  " Mb")
    return mem


def mem_scan():
    before_mem = memory_profiler.memory_usage()

    for i in range(1000000):
        print(i)

    after_mem = memory_profiler.memory_usage()

    print("Memory (Before): {}Mb".format(before_mem))
    print("Memory (After): {}Mb".format(after_mem))

mem_scan()

using()
```

---

参考:

https://stackoverflow.com/questions/552744/how-do-i-profile-memory-usage-in-python/15448600
https://stackoverflow.com/questions/41191412/no-module-named-mem-profile/43567571
http://xianglong.me/article/analysis-python-application-performance-using-cProfile/
另一个包管理工具 Pipenv

>![pipenv](https://upload-images.jianshu.io/upload_images/47789-b0dbe8737ad6225b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

[Pipenv](https://github.com/pypa/pipenv)是 Python 著名的 requests 库作者 kennethreitz 实现的一个包管理工具，它可以为我们的项目自动创建和管理虚拟环境并非常方便地管理 Python 包，现在它也已经是 Python 官方推荐的包管理工具。

Pipenv 我们可以简单理解为 pip 和 virtualenv 的集合体，它可以为我们的项目自动创建和管理一个虚拟环境。

Pipenv 解决了以下问题：

- 我们不需要再手动创建虚拟环境，Pipenv 会自动为我们创建，它会在某个特定的位置创建一个 virtualenv 环境，然后调用 `pipenv shell` 命令切换到虚拟环境。

- 使用 requirements.txt 可能会导致一些问题，所以 Pipenv 使用 Pipfile 和 Pipfile.lock 来替代之，而且 Pipfile 如果不存在的话会自动创建，而且在安装、升级、移除依赖包的时候会自动更新 Pipfile 和 Pipfile.lock 文件。

- 广泛使用 Hash 校验，保证安全性。

- 可以更清晰地查看 Python 包及其关系，调用 `pipenv graph` 即可呈现，结果简单明了。

- 可通过自动加载 `.env `读取环境变量，简化开发流程。

### Pipenv

```shell
pipenv shell
pipenv install
```

```shell
# 从github下载源码
pipenv install -e git+https://github.com/alecalve/python-bitcoin-blockchain-parser#egg=blockchain_parser
pipenv install -e git+https://github.com/ethereum/pyethereum.git@develop#egg=pyethereum
pipenv install -e git+https://github.com/ethereum/web3.py.git@v3.16.5#egg=web3

pip3 install git+https://github.com/ethereum/pyrlp.git@master
```

### 常用命令

```
pipenv --venv
pipenv --three
pipenv --python 3.6

pipenv --py
pipenv --site-packages
pipenv install django
pipenv install pytest --dev
pipenv uninstall requests
pipenv uninstall --all
pipenv lock
```

---

参考:
https://www.jianshu.com/p/1441169b3dbe
https://zhuanlan.zhihu.com/p/32913361

https://mp.weixin.qq.com/s?__biz=MzIzNzA4NDk3Nw==&mid=2457735532&idx=1&sn=759df7bda6de3e9a832197f142f10f62&chksm=ff44b932c83330241d8d53e31fc75edb82c9c61855ad72f104fea59063ba7154830a5ddb559f&scene=21#wechat_redirect
mysql 查询数据库占用空间

#### 查看数据库的某个表的大小

``` sql
SELECT table_name AS "Tables",
round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "<DB>"
ORDER BY (data_length + index_length) DESC;
```

#### 查看数据库的大小

```sql
select round(sum(data_length/1024/1024),2) 'Data Size in MB', 
round(sum(index_length/1024/1024),2) 'Index Size in MB',
round(sum((index_length + data_length)/1024/1024),2) 'All Size in MB'
FROM information_schema.TABLES where table_schema='<DB>';
```

把 `<DB>`替换成需要查询的数据库名, 只在 Mysql / MariaDB运行过.
ファイルの作成日時、更新日時を変更したい

##背景
保存期間の過ぎたファイルを削除する機能を実装する際、テスト用のファイルを作成する必要が
あり個人的に困ったので自分メモ用に。

##PowerShellで日時を変更するコマンド
※PowerShellは管理者権限で実行する

```
// 作成日時変更コマンド
Set-ItemProperty ファイルパス -Name CreationTime -Value "変更したい日時"

// 更新日時変更コマンド
Set-ItemProperty ファイルパス -Name LastWriteTime -Value "変更したい日時" 
```

##実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499102/cded883e-34cf-4532-16e8-b9d2b9415c18.png)

<img width="1500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499102/1907a805-cb9f-cd59-9581-f65ca48d2fd3.png">


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499102/07c7146c-737f-dd03-caa6-7d3c8111189e.png)
キューリンクを外部キューリンクに置き換えるスクリプト


# はじめに

キューシートを分割しようとしたときに、
ビルドのタイミングで、
キューリンクがあるとリンクが切れてしまう。（「親キューシートが異なるというエラー」になる）

これを修正するには、キューリンクを外部キューリンク化する必要がでてくる。
（または移動させない・・・）

[ADX2でアクショントラックのパスを確認するスクリプト](https://qiita.com/tatmos/items/e8b9f9f43c6e19de0680)の記事にあるリンクキューのパスをコメントに書き込みつつも、
外部キューリンクにするのがかなり手間なので、
同じ構造のまま外部キューリンクにするスクリプトを作ってみました。

※なお、外部キューリンクは、「キュー名でリンク」　且つ、キューシートをまたいで同じキュー名は使わないという制限をつけてデータ作成しています。

# スクリプト
選択したキューリンクを外部キューリンクに置き換えます。
キューリンクの位置を合わせるようにしています。

破壊的に実行するので、保存して実行か、Undoできるようにしておくとよいです。
（エラーに関してはあまり気を使っていないので）

``` MDS_ZChangeLinkExternalLink.py
# --Description:[tatmos][Change]キューリンクを外部キューリンクに置き換える
import sys
import cri.atomcraft.project as acproject
import cri.atomcraft.debug as acdebug

# 選択しているキューリンクを得る
cueLinks = acproject.get_selected_objects("CueLink")["data"]
if not cueLinks :
    # キューリンクが選択されていない場合は、選択項目の下のキューリンクを探す
    # 選択項目を取得
    parent_objs = []
    for parent_type in ["CueSheet", "CueSheetFolder", "CueFolder", "Cue"]:
        parent_objs.extend(acproject.get_selected_objects(parent_type)["data"])

    # 選択項目以下のキューリンクを取得
    cueLinks = []
    for parent_obj in parent_objs:
        cueLinks.extend(acproject.find_objects(parent_obj, "CueLink")["data"])

if not cueLinks :
    acdebug.warning("外部キューリンクに置き換えるキューリンクを選択してください.")
    sys.exit()

#キューリンクを外部キューリンク(ExternalCueLink)に置き換える
for cueLink in cueLinks:
    parent = acproject.get_parent(cueLink, "Track")["data"]
    tgtCueName = acproject.get_value(cueLink, "Name")["data"]
    comment = acproject.get_value(cueLink, "Comment")["data"]
    delayTimeMS = acproject.get_value(cueLink, "DelayTimeMS")["data"]

    acdebug.log("外部キューリンク作成 \"{0}\"".format(tgtCueName))

    # Create the ExternalCueLink
    externalCueLink = acproject.create_external_cuelink(parent, tgtCueName, None )["data"]
    acproject.set_value(externalCueLink, "DelayTimeMS", delayTimeMS)

    acproject.delete_object(cueLink)
```

# ADX2で他のキューを再生したい場合以下の方法がある。

- アクショントラックによるキュー再生
- キューリンクによるキュー再生
- 外部キューリンクによるキュー再生
- サブシンセに変換してしまう

それぞれ、微妙に動作がことなるのでまとめてみた。

|項目|メリット|デメリット|
|:--|:--|:--|
|アクショントラックによるキュー再生|プログラムでキューを再生するのと同じ感覚で使える。|参照されているキューを移動できなくなる。 呼び出しキューの音量とかの影響は受けない。 キューリミットが効いてしまう（たぶん）。|
|キューリンクによるキュー再生||同じキューシート内でしかリンクできない|
|外部キューリンクによるキュー再生||プレビューのとき「選択キューのみビルド再生」だと音がでない|
|サブシンセに変換してしまう|リソースは増えてしまうかもだけど確実。|途中で元を変更した場合に追従しない。|

# おわりに
今回はキューリンクから外部キューリンクへの変換でしたが、
他のリンク系の変換とかもいろいろあると良いかもと思いつつ。

# 環境
Craft 3.45.00
第一回ONNX.jsの備忘録(ResNet)

# はじめに
ONNX.jsの練習用にいろいろやっていくための備忘録
今回はONNX.jsからResidual Network(ResNet)のモデルを動かして猫を判別する


# ResNetって何だったっけ
昔勉強したことがあるきもするけど，案の定忘れてるのでおさらいから．
と言っても解説のリンクを貼っとくだけ．とてもわかりやすい記事がたくさんある．
[ResNet なんて全く理解していないだけの人生だった](https://qiita.com/kenmaro/items/008051dae0bf0ad718cb)
[ResNet始祖論文](https://arxiv.org/pdf/1512.03385.pdf)

要は入力をショートカットして，すっ飛ばした入力と出力の誤差を求めていく．
ResNet登場以前は「NNは層が深ければ深いほど精度も高くなってくでしょ」といわれていたが，実際は違う．
モデル劣化と勾配消失が起きるので，精度は頭打ちどころか悪くなっていくこともある．そこでResNetが大活躍してくれるわけである．イメージとしては項等変換をモデル側で用意する，「テイラー展開の右辺第一項のみを与えるから後は推測してね」という感じだ．詳しくはリンク先を参照．


# 今回の目的
ONNX.jsを使用して，上述のResNetの有名な猫判別モデルを動かす．
まずはとにかく公式のデモを動かすところからスタート．

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# ONNXとは
ONNXとONNX.jsの詳しい説明はリンク先で（丸投げ）．
ちなみにONNXはオニキスと読むらしい．
[ONNXの概要](https://medium.com/axinc/onnx%E3%81%AE%E6%A6%82%E8%A6%81%E3%81%A8%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%BF-7304109cecbb)
[ONNX.jsを使ってWebブラウザでディープラーニング](https://qiita.com/xkumiyu/items/68acce640b801e8ecc67)
[onnxjsを使ってブラウザで機械学習モデルを実行する](https://blog.hayashikun.com/entry/2021/01/03/234345)
[onnx.jsのデモンストレーションを動かしてみた](https://water2litter.net/rum/post/ai_onnxjs_demo/)


## 色々と下準備
[公式](https://github.com/onnx/onnx#installation)のデモサンプルをDLしてくる．gitでクローンでも丸ごとzipで落としてもおk．
次にImagenetの[訓練済みモデル](https://github.com/microsoft/onnxjs-demo/blob/data/data/examples/models/resnet50_8.onnx)をDLしてくる．
DLしたモデルは○○.onnxという見慣れない拡張子のファイル（今回のはresnet50_8.onnx），こいつを先ほどDLしたフォルダのresnet50(onnxjs-master/examples/browser/resnet50/)の中に移動する．

とりあえずこれで準備は完了．


## 実際にうごかす
先ほどのResNetのONNX.jsを動かすために，まずはローカルサーバを立ち上げる．
onnxjs-master/examples/browserをカレントディレクトリにして以下を実行．

```
python -m http.server
```

サーバが正常に動作していることを確認したら，適当なブラウザで[ローカルホスト(http://localhost:8000/resnet50/)](http://localhost:8000/resnet50/)にアクセス．ちなみに私の環境ではfirefoxとchromeでは動作確認済み．


![スクリーンショット 2021-06-01 16.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268861/c3446f54-d07d-2819-37d8-405007991a76.png)

接続してRunするとこのように猫の画像を判別するResNetが動くはず．猫の画像は適当に入れ替えて試しても大丈夫．
ちなみに実家のまこちゃんは...

![cat_test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268861/42d1684e-e95e-2006-8cfa-fb66ea774e55.png)
![スクリーンショット 2021-06-01 16.34.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268861/ca13c93a-522c-f103-fdea-60af289bb525.png)

tiger catっぽい，やっぱりかわいい(親バカ)．


# おしまいに
とりあえず今回はResNetの猫モデルを動かしてみた．
[次回](https://qiita.com/rm-mplpl-ebi/items/b641acb04799a17a9406)は自由に猫を選べるようにしてもいいし，mnistとか他のモデルを動かしてみるのもよさそう．
各クラウドサービスのリージョンとIP範囲のまとめ

# AWS

### リージョン
- AWSサービスエンドポイント
    - https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html

### IP範囲
- AWS IP アドレスの範囲
    - https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html

# Azure

### リージョン
- Azureの地域
    - https://azure.microsoft.com/ja-jp/global-infrastructure/geographies/

### IP範囲
- Microsoft Azure Datacenter IP Ranges
    - https://www.microsoft.com/en-us/download/details.aspx?id=41653

# Salesforce

### リージョン
- Salesforceインスタンスの場所
    - https://help.salesforce.com/articleView?id=000314281&type=1&mode=1

### IP範囲
- SalesforceのIP範囲
    - https://help.salesforce.com/articleView?id=000321501&type=1&mode=1

# Heroku

### リージョン
- 利用可能なリージョンを確認する
    - https://devcenter.heroku.com/ja/articles/regions#viewing-available-regions
- アプリのリージョンを確認する
    - https://devcenter.heroku.com/ja/articles/regions#viewing-available-regions

### IP範囲
- https://help.heroku.com/JS13Y78I/i-need-to-add-heroku-dynos-to-our-allowlist-what-are-ip-address-ranges-in-use-at-heroku
bash-git-prompt でレスポンスを改善するための設定メモ

git-prompt, git repo がでかいと遅い...

しかしある程度は git repo の status 表示とかしたい.
bash-git-prompt で必要最低限の設定にして運用します.

https://github.com/magicmonty/bash-git-prompt

```
GIT_PROMPT_ONLY_IN_REPO=1
GIT_PROMPT_IGNORE_SUBMODULES=1
GIT_PROMPT_SHOW_UNTRACKED_FILES=no
GIT_PROMPT_FETCH_REMOTE_STATUS=0
```

あたりを設定することでそこそこ快適になりました.

## zsh

zsh(macOS)の場合はこちら

macOS で git-prompt.bash の代わりに git-prompt.zsh を使い git status 表示を爆速にする
https://qiita.com/syoyo/items/72086ee5ee94c73b0cb0
【Rails】簡単にkaminariのデザイン変更

##はじめに
ページネーションのデザインを以下のように、デフォルトのシンプルなデザインから変更する方法をまとめておきます。
![スクリーンショット 2021-06-01 10.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340120/be5b86da-1229-1961-6d80-469f8a5c7314.png)

今回は、「kaminari」のgemが導入されていることを前提にしています。

##変更方法
次の流れでデザイン変更していきます。
①bootstrapの適用
②CSSでデザインの変更
③言語を日本語に変更する
④表示を中央揃えにする

###①bootstrapの適用
まずは以下コマンドにて、kaminariに「bootstrap」を適用させます。
なおCSSのフレームワークには「bourbon」や「foundation」などがありますが、ここでは「bootstrap」を用います。

```
$ rails g kaminari:views bootstrap4
```
bootstrapのバージョンでは各自で使用しているバージョンを指定します。
このコマンドを入力すると、viewsのところにkaminariディレクトリが作成されていて、デザインが変わっていると思います。


##②CSSでデザインの変更

次に自由にデザインを変えるにはCSSを変更させる必要があります。
次のように記述すれば冒頭のようなデザインになります。こちらは好みのデザインを見つけて記述してみてください。

```css:app/assets/stylsheets/application.css
.pagination>li>a {          
  border: none;     
  color: #696969;   
}

.pagination>.active>a {     
  background: #93c9ff;     
  border-radius: 15px;     
}

.pagination>li>a:hover {        
  border-radius: 15px;   
}

```

##③言語を日本語に変更する

今のviewsファイルではページネーションの文字を変更することはできない為、デフォルトの英語のままです。
そこで新しいファイルを作成して、日本語表示できるようにしていきます。
config/localesファルダに、「kaminari_japanese.yml」という名前のファイルを作成してそこに、以下内容を記述していきます。(ファイル名は自由です。)

```yml:config/locales/kaminari_japanese.yml
ja:
  views:
    pagination:
      first: "&laquo; 最初"
      last: "最後 &raquo;"
      previous: "&lsaquo; 前"
      next: "次 &rsaquo;"
      truncate: "..."
```
これで日本語に変更されたかと思います。


##④表示を中央揃えにする
現状ではページネーションの表示が左側に寄っていると思うので、これを中央にします。
②で編集したapp/assets/stylsheets/application.css内に以下を追記してください。

```css:app/assets/stylsheets/application.css
.pagination {
  justify-content: center;
}
```
これで中央揃えに変更されたかと思います。

以上がkaminariのデザイン変更の方法となります。
ISSUE1　自動でブックマークを整理したい

こんなツールが欲しいという、イメージ先行で思いついた事を、忘れないようにメモする

#課題感
* 調べ物をしていると、URLのリンクなどブックマークに溜まる。
* 内容に対して整理しないと、そのうち大変になる。
* AIでテキスト分類して、適当なフォルダに落としてほしい。
* できれば閲覧の日付け、要約リストをデータベースに落としたい。

#調べたこと
* Chromeのプラグインにそれらしいものはある　→　ドンピシャなものはない
* GITHUBにも見当たらない　→　BOOKMARKといれても、リンク集のようなものにヒットする。

#要件整理
* ブラウザに溜まった履歴を排出させる。
* ブラウザで☆をつけたものを、分類前フォルダにいれる。
* ファイルベースでお気に入りをCSVで出す。
* バックグラウンドで学習モデルを使ってＡＩ分類する。
* EXCELシートにカテゴリ化されて保存される。

#アーキテクチャ
* 整理後にブラウザに戻すのもありえる
* 基本的には他人とシェアしたい　→　ちゃんと評価コメントを入れて共有したい
* EXCELベースにまとめるのが、非ＩＴ系企業のデフォルト
[解決]BastilleBSDではまった事

とりあえず設定が終わってconsoleでターゲットに入ってみたところDNSのリゾルブが異常に遅い状態でした。

```
root@testjail:~ # host -a www.yahoo.co.jp
Trying "www.yahoo.co.jp"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33666
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.yahoo.co.jp.               IN      ANY

;; ANSWER SECTION:
www.yahoo.co.jp.        579     IN      CNAME   edge12.g.yimg.jp.

Received 61 bytes from 192.168.0.1#53 in 5089 ms
```

host側でtcpdumpで確認してみました。

```
16:00:22.418358 IP 192.168.1.101.60358 > aterm.me.domain: 9632+ ANY? www.yahoo.co.jp. (33)



16:00:27.499310 IP 192.168.0.4.50442 > aterm.me.domain: 9632+ ANY? www.yahoo.co.jp. (33)
16:00:27.520212 IP aterm.me.domain > 192.168.0.4.50442: 9632 1/0/0 CNAME edge12.g.yimg.jp. (61)
```

インターフェースにaliasを設定してあって、なぜか間違ったサブネットのアドレスからクエリが出ています。これがタイムアウトした後にだ足しいアドレスからのクエリが出るので、遅くなっているようです。

aliasを消して試したら問題起きません。

どこかで設定できるのかな？

pf.confのnatを下のようにしたら大丈夫になりました。

```
nat on $ext_if from <jails> to any -> ($ext_if:0)
```

\$ext_if:0が一番目のアドレスを示しているのであれば\$ext_if:1も設定できそうなものですが、エラーになります。またリトライして成功しているのもなにかおかしい気がします。釈然としませんがとりあえずこれで使えます。
sys.path.append('..')で自作ライブラリがimportできない時の対処法

#対処法

親ディレクトリに自作ライブラリが入ったディレクトリがあり、そこからimportしたい時

```
..
|--xx
|  |-xxx.py
|
|-sample
   |-samp.py  
```
よくある記事ではこのようにしているがエラーが出てしまう場合がある↓

```
import sys
sys.path.append("..")
from sample import samp

#実行結果
%python3 xxx.py
ImportError: cannot import name 'samp' from 'sample'
```
そういう時、以下のようにするとうまく行く

```
import sys
sys.path.append("../sample")
from sample import samp
```

sys.pathに絶対パスや相対パスなど色々追加して試したが、結局どれもダメで
自作ライブラリのディレクトリを直接追加した時だけうまくいった

誰かの参考になれば嬉しいです
R で変数（オブジェクト）の保存と呼び出し

# はじめに
Rで開発を行っていると、途中までの実行結果を保存し後で呼び出ししたくなることがあった。その方法を備忘録として残しておく。

# 分析の例
データセットは「[Rでの性別、身長、体重、血液型データの作成方法](https://qiita.com/ryamamoto0406/items/489e00fe693b688a4a5e)」で作成したものを「[R shiny でデータの基礎分析用アプリの作成①](https://qiita.com/ryamamoto0406/items/ece1a064f85e7c0466aa)」で csv に保存したので、それを用いて行う。

まずデータセットの読み込みと中身の確認を行う。

```R
df <- read.csv("./data.csv")
str(df)
```

```:出力
'data.frame':	1000 obs. of  5 variables:
 $ X     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ SEX   : chr  "female" "male" "male" "male" ...
 $ HEIGHT: num  154 178 163 176 156 ...
 $ WEIGHT: num  48 70.8 48.2 76.4 40.9 ...
 $ BLOOD : chr  "O" "A" "A" "O" ...
```

これから身長から体重を予測する線形回帰モデルを作成する。

```R:
result <- lm(WEIGHT~HEIGHT,data=df)
summary(result)
```

```:出力
Call:
lm(formula = WEIGHT ~ HEIGHT, data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-35.495  -7.378  -0.236   7.196  40.649 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -85.32669    6.35537  -13.43   <2e-16 ***
HEIGHT        0.87842    0.03846   22.84   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.21 on 998 degrees of freedom
Multiple R-squared:  0.3433,	Adjusted R-squared:  0.3426 
F-statistic: 521.7 on 1 and 998 DF,  p-value: < 2.2e-16
```

この結果を保存する場合を考える。

# 変数（オブジェクト）を保存する場合
`saveRDS`関数を使って変数を保存する。

```R:
saveRDS(result, file = "./result.obj")
```

これで result.obj に変数の状態を保存できた。

# 保存した変数（オブジェクト）を呼び出す場合

呼び出すのも簡単で、`readRDS`関数を用いる。

```R:
result_new <- readRDS("./result.obj")
summary(result_new)
```

```:出力
Call:
lm(formula = WEIGHT ~ HEIGHT, data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-35.495  -7.378  -0.236   7.196  40.649 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -85.32669    6.35537  -13.43   <2e-16 ***
HEIGHT        0.87842    0.03846   22.84   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.21 on 998 degrees of freedom
Multiple R-squared:  0.3433,	Adjusted R-squared:  0.3426 
F-statistic: 521.7 on 1 and 998 DF,  p-value: < 2.2e-16
```

オブジェクトごと読みだせているのが分かる。

# おわりに
分析の結果を保存して途中で他の作業を行うことがあるので、`saveRDS`,`readRDS`は覚えておきたい関数の一つであった。今後も簡単な tips でも、何かあれば記事にしていきたいと思う。
PuttyでEC2と直接ファイルをやり取りする

# はじめに

たまーに使おうとして忘れるコマンドの自分用メモです。AmazonLinuxインスタンスのEC2とファイルのやり取りをします。.ppkファイルが必要です。

参考サイト：
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html

# ダウンロード

```
pscp -i path/to/ppkfile.ppk ec2-user@<IPv4address>:/home/ec2-user/path/to/srcfile.txt ./dist/file.txt 
```

EC2の```/home/ec2-user/path/to/```にある```srcfile.txt```を```./dist/```に```/file.txt```として保存します。***このコマンドをたたくのはローカルからです。***よくsshで接続してEC2でたたいてできない！ってなります(自分だけ)。

# アップロード
```
pscp -i path/to/ppkfile.ppk ./dist/file.txt ec2-user@<IPv4address>:/home/ec2-user/path/to/srcfile.txt 
```

逆になっただけですね。

# おわりに
大事なデータを書き換えたりしないように注意しましょう。
[ROS] トピックを一度だけ購読する

# はじめに
- topicを購読する方法
 1. Subscriber: 一般的, コールバック関数を読んで処理
 - wait_for_message: ノード不要. コールバック関数も不要なので複雑なことをする時は便利. 書籍で見かけたことがない.

## rospy.wait_for_message
- 書き方

```
rospy.wait_for_message('<トピック名>', 型, timeout=<>)
``` 
- 例

```python:test.py
import rospy
from std_msgs.msg import String

def listen():
    while not rospy.is_shutdown():
        m = rospy.wait_for_message('/chatter', String, timeout=None
        rospy.loginfo(m.data)

if __name__ == '__main__':
    listen()
```
【Kotlin】プロパティ

#■プロパティ
値を変数に保持するもの
setとgetがある。

■setの書き方
setは変数に値を代入する時に発動する。
代入した値は引数valueに渡される。
fieldでその変数自体に代入される。

``` kotlin

class Human {
//getterの事getする事
var name = "名無し"

//setterはsetする事
var age = 20
 set(value) {
   if(value < 0) {
    println("年齢が不正です。")
   } else {
   //ageにsetされた値valueが代入される。
    field = value
   }
 }
}

var human = Human()
//setterでsetします。
human.age = -1 //結果: 年齢が不正です。

//getter呼び出し
println(human.name) //結果: 名無しです。
println(humna.age) //結果 20

//setterでsetしてfieldでageに代入
human.age = 30
println(human.age) //結果 30

```

■value
値を代入する時の引数名だが
基本valueとされている。
正直valueやなくてもなんでも入るのは入るらしいです。 

■field
バッキングフィールド
これは固定でこの名前
変数名に代入される。

■val
valを使うと定数になるので
新たに値を代入できないのでsetterは使えない
getter専用になる。

■private set
クラス内では変更可能 値をsetできる。

クラス外では読み取り専用 privateなのでclass外では値をsetできない。